From 5b5abaed95f57ba6e57788a33d5a34d410976c2b Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 10 Feb 2017 01:29:29 +0700 Subject: [PATCH 001/101] Bukkit integration Basic bukkit events support (now only BlockBreak/EntityDamage events available) --- .../java/minefantasy/mf2/MineFantasyII.java | 245 ++++++++++-------- .../mf2/config/ConfigIntegration.java | 18 ++ .../minefantasy/mf2/entity/EntityBomb.java | 10 +- .../minefantasy/mf2/entity/EntityCogwork.java | 2 +- .../minefantasy/mf2/entity/EntityMine.java | 7 + .../mf2/item/tool/advanced/ItemHvyPick.java | 5 + .../mf2/item/tool/advanced/ItemHvyShovel.java | 5 + .../mf2/item/tool/advanced/ItemLumberAxe.java | 11 +- .../mf2/item/tool/advanced/ItemScythe.java | 5 + .../minefantasy/mf2/util/BukkitUtils.java | 91 +++++++ 10 files changed, 280 insertions(+), 119 deletions(-) create mode 100644 src/main/java/minefantasy/mf2/config/ConfigIntegration.java create mode 100644 src/main/java/minefantasy/mf2/util/BukkitUtils.java diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 36d06f19..548ff782 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerStartedEvent; import cpw.mods.fml.common.network.FMLEventChannel; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; @@ -18,7 +19,19 @@ import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.armour.CustomArmourEntry; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.config.*; +import minefantasy.mf2.config.ConfigArmour; +import minefantasy.mf2.config.ConfigClient; +import minefantasy.mf2.config.ConfigCrafting; +import minefantasy.mf2.config.ConfigExperiment; +import minefantasy.mf2.config.ConfigFarming; +import minefantasy.mf2.config.ConfigHardcore; +import minefantasy.mf2.config.ConfigIntegration; +import minefantasy.mf2.config.ConfigItemRegistry; +import minefantasy.mf2.config.ConfigMobs; +import minefantasy.mf2.config.ConfigStamina; +import minefantasy.mf2.config.ConfigTools; +import minefantasy.mf2.config.ConfigWeapon; +import minefantasy.mf2.config.ConfigWorldGen; import minefantasy.mf2.item.gadget.ItemLootSack; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.ToolListMF; @@ -32,6 +45,7 @@ import minefantasy.mf2.network.packet.PacketHandlerMF; import minefantasy.mf2.recipe.BasicRecipesMF; import minefantasy.mf2.recipe.RecipeRemover; +import minefantasy.mf2.util.BukkitUtils; import minefantasy.mf2.util.MFLogUtil; import net.minecraft.init.Items; import net.minecraft.world.biome.BiomeGenBase; @@ -42,31 +56,31 @@ * @author Anonymous Productions */ @Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);required-after:FML@[5.0.5,)", version = MineFantasyII.VERSION) -public class MineFantasyII -{ +public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; public static final String VERSION = "Alpha_2.8.12"; public static final WorldGenMFBase worldGenManager = new WorldGenMFBase(); - - @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") - public static CommonProxyMF proxy; - public static PacketHandlerMF packetHandler; - - @Instance(MODID) - public static MineFantasyII instance; - - @EventHandler - public void preInit(FMLPreInitializationEvent event) - { - NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy); - if(FMLCommonHandler.instance().getSide() == Side.CLIENT) - { - new ConfigClient().setConfig(getCfg(event, "Client")); - } + + @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") + public static CommonProxyMF proxy; + public static PacketHandlerMF packetHandler; + + @Instance(MODID) + public static MineFantasyII instance; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy); + if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { + new ConfigClient().setConfig(getCfg(event, "Client")); + } new ConfigArmour().setConfig(getCfg(event, "Armours")); new ConfigExperiment().setConfig(getCfg(event, "Specials")); new ConfigHardcore().setConfig(getCfg(event, "Hardcore")); + if (FMLCommonHandler.instance().getSide() == Side.SERVER) { + new ConfigIntegration().setConfig(getCfg(event, "Integration")); + } new ConfigTools().setConfig(getCfg(event, "Tools")); new ConfigWeapon().setConfig(getCfg(event, "Weapons")); new ConfigStamina().setConfig(getCfg(event, "Stamina_System")); @@ -75,120 +89,127 @@ public void preInit(FMLPreInitializationEvent event) new ConfigWorldGen().setConfig(getCfg(event, "WorldGen")); new ConfigCrafting().setConfig(getCfg(event, "Crafting")); new ConfigMobs().setConfig(getCfg(event, "Mobs")); - + BaseMaterialMF.init(); MineFantasyAPI.isInDebugMode = isDebug(); MFLogUtil.log("API Debug mode updated: " + MineFantasyAPI.isInDebugMode); - - addModFlags(); - proxy.preInit(); - - RecipeRemover.removeRecipes(); - ToolListMF.load(); - ComponentListMF.load(); - } - - @EventHandler - public void load(FMLInitializationEvent evt) - { - MinecraftForge.EVENT_BUS.register(this); - proxy.registerMain(); - GameRegistry.registerWorldGenerator(worldGenManager, 0); - - packetHandler = new PacketHandlerMF(); - FMLEventChannel eventChannel; - for(String channel:packetHandler.packetList.keySet()) - { - eventChannel = NetworkRegistry.INSTANCE.newEventDrivenChannel(channel); - eventChannel.register(packetHandler); - packetHandler.channels.put(channel, eventChannel); - } - } - - @EventHandler - public void modsLoaded(FMLPostInitializationEvent evt) - { - CustomArmourEntry.registerItem(Items.leather_helmet, ArmourDesign.LEATHER); - CustomArmourEntry.registerItem(Items.leather_chestplate, ArmourDesign.LEATHER); - CustomArmourEntry.registerItem(Items.leather_leggings, ArmourDesign.LEATHER); - CustomArmourEntry.registerItem(Items.leather_boots, ArmourDesign.LEATHER); - - CustomArmourEntry.registerItem(Items.chainmail_helmet, ArmourDesign.MAIL); - CustomArmourEntry.registerItem(Items.chainmail_chestplate, ArmourDesign.MAIL); - CustomArmourEntry.registerItem(Items.chainmail_leggings, ArmourDesign.MAIL); - CustomArmourEntry.registerItem(Items.chainmail_boots, ArmourDesign.MAIL); - - CustomArmourEntry.registerItem(Items.golden_helmet, ArmourDesign.SOLID, 1.5F, "medium"); - CustomArmourEntry.registerItem(Items.golden_chestplate, ArmourDesign.SOLID, 1.5F, "medium"); - CustomArmourEntry.registerItem(Items.golden_leggings, ArmourDesign.SOLID, 1.5F, "medium"); - CustomArmourEntry.registerItem(Items.golden_boots, ArmourDesign.SOLID, 1.5F, "medium"); - - ConfigItemRegistry.readCustoms(); - - for(BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) - { - registerBiomeStuff(biome); - } - KnowledgeListMF.init(); - ArtefactListMF.init(); - BasicRecipesMF.init(); - ItemLootSack.addItems(); - proxy.postInit(); - proxy.registerTickHandlers(); - MetalMaterial.addHeatables(); - } - - private void registerBiomeStuff(BiomeGenBase biome) - { - if(WorldGenBiological.isBiomeInConstraint(biome, ConfigWorldGen.berryMinTemp, ConfigWorldGen.berryMaxTemp, ConfigWorldGen.berryMinRain, ConfigWorldGen.berryMaxRain)) - { - biome.addFlower(BlockListMF.berryBush, 0, 5); - } + + addModFlags(); + proxy.preInit(); + + RecipeRemover.removeRecipes(); + ToolListMF.load(); + ComponentListMF.load(); + } + + @EventHandler + public void load(FMLInitializationEvent evt) { + MinecraftForge.EVENT_BUS.register(this); + proxy.registerMain(); + GameRegistry.registerWorldGenerator(worldGenManager, 0); + + packetHandler = new PacketHandlerMF(); + FMLEventChannel eventChannel; + for (String channel : packetHandler.packetList.keySet()) { + eventChannel = NetworkRegistry.INSTANCE.newEventDrivenChannel(channel); + eventChannel.register(packetHandler); + packetHandler.channels.put(channel, eventChannel); + } + } + + @EventHandler + public void modsLoaded(FMLPostInitializationEvent evt) { + CustomArmourEntry.registerItem(Items.leather_helmet, ArmourDesign.LEATHER); + CustomArmourEntry.registerItem(Items.leather_chestplate, ArmourDesign.LEATHER); + CustomArmourEntry.registerItem(Items.leather_leggings, ArmourDesign.LEATHER); + CustomArmourEntry.registerItem(Items.leather_boots, ArmourDesign.LEATHER); + + CustomArmourEntry.registerItem(Items.chainmail_helmet, ArmourDesign.MAIL); + CustomArmourEntry.registerItem(Items.chainmail_chestplate, ArmourDesign.MAIL); + CustomArmourEntry.registerItem(Items.chainmail_leggings, ArmourDesign.MAIL); + CustomArmourEntry.registerItem(Items.chainmail_boots, ArmourDesign.MAIL); + + CustomArmourEntry.registerItem(Items.golden_helmet, ArmourDesign.SOLID, 1.5F, "medium"); + CustomArmourEntry.registerItem(Items.golden_chestplate, ArmourDesign.SOLID, 1.5F, "medium"); + CustomArmourEntry.registerItem(Items.golden_leggings, ArmourDesign.SOLID, 1.5F, "medium"); + CustomArmourEntry.registerItem(Items.golden_boots, ArmourDesign.SOLID, 1.5F, "medium"); + + ConfigItemRegistry.readCustoms(); + + for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) { + registerBiomeStuff(biome); + } + KnowledgeListMF.init(); + ArtefactListMF.init(); + BasicRecipesMF.init(); + ItemLootSack.addItems(); + proxy.postInit(); + proxy.registerTickHandlers(); + MetalMaterial.addHeatables(); } - private static Configuration getCfg(FMLPreInitializationEvent event, String name) - { - return new Configuration(new File(event.getModConfigurationDirectory(), "MineFantasyII/"+name + ".cfg")); - } - - - - - - private void addModFlags() - { + @EventHandler + public final void serverStarted(FMLServerStartedEvent event) { + if (event.getSide() != Side.CLIENT && isBukkitServer()) { + MFLogUtil.log("Bukkit has been detected"); + BukkitUtils.onServerStarted(); + } + } + + private void registerBiomeStuff(BiomeGenBase biome) { + if (WorldGenBiological.isBiomeInConstraint(biome, ConfigWorldGen.berryMinTemp, ConfigWorldGen.berryMaxTemp, + ConfigWorldGen.berryMinRain, ConfigWorldGen.berryMaxRain)) { + biome.addFlower(BlockListMF.berryBush, 0, 5); + } + } + + private static Configuration getCfg(FMLPreInitializationEvent event, String name) { + return new Configuration(new File(event.getModConfigurationDirectory(), "MineFantasyII/" + name + ".cfg")); + } + + private void addModFlags() { isBGLoaded = setIsBGLoaded(); + isBukkitServer = setIsBukkitServer(); } - public static boolean isBGLoaded() - { + + public static boolean isBGLoaded() { return isBGLoaded; } - public static boolean setIsBGLoaded() - { - try - { + + public static boolean isBukkitServer() { + return isBukkitServer; + } + + public static boolean setIsBGLoaded() { + try { Class.forName("mods.battlegear2.Battlegear"); - //return Loader.isModLoaded("battlegear2"); - } - catch (ClassNotFoundException e) - { + // return Loader.isModLoaded("battlegear2"); + } catch (ClassNotFoundException e) { return false; } return true; } - - public static boolean isDebug() - { + + public static boolean setIsBukkitServer() { + try { + Class.forName("org.spigotmc.SpigotConfig"); + } catch (ClassNotFoundException e) { + return false; + } + return true; + } + + public static boolean isDebug() { return ConfigExperiment.debug.equals("AU32-Db42-Acf6-Ggh9-9E8d"); } - + private static boolean isBGLoaded; + private static boolean isBukkitServer; /** * Determines if a player name is that of a MF modder */ - public static boolean isNameModder(String name) - { + public static boolean isNameModder(String name) { return name.equals("Galactic_Hiker") || name.equals("tim4200"); } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/config/ConfigIntegration.java b/src/main/java/minefantasy/mf2/config/ConfigIntegration.java new file mode 100644 index 00000000..cb01a896 --- /dev/null +++ b/src/main/java/minefantasy/mf2/config/ConfigIntegration.java @@ -0,0 +1,18 @@ +package minefantasy.mf2.config; + +import java.util.Arrays; + +public class ConfigIntegration extends ConfigurationBaseMF { + + public static final String CATEGORY_BUKKIT = "Bukkit Integration"; + + public static String[] pluginsList = new String[0]; + + @Override + protected void loadConfig() { + String bpDesc = "This registers listeners of Bukkit plugins (if avaliable). Here you are should list all protection-related plugins (e.g WorldGuard). You are can find correct plugin name in its plugin.yml (inside plugin's .jar file)"; + pluginsList = config.get(CATEGORY_BUKKIT, "Plugins List", new String[] { "WorldGuard" }, bpDesc) + .getStringList(); + Arrays.sort(pluginsList); + } +} diff --git a/src/main/java/minefantasy/mf2/entity/EntityBomb.java b/src/main/java/minefantasy/mf2/entity/EntityBomb.java index 73f2b316..2917a228 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityBomb.java +++ b/src/main/java/minefantasy/mf2/entity/EntityBomb.java @@ -5,11 +5,13 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.item.gadget.EnumCasingType; import minefantasy.mf2.item.gadget.EnumExplosiveType; import minefantasy.mf2.item.gadget.EnumFuseType; import minefantasy.mf2.item.gadget.EnumPowderType; import minefantasy.mf2.mechanics.CombatMechanics; +import minefantasy.mf2.util.BukkitUtils; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -17,7 +19,6 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.passive.EntityChicken; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; @@ -303,8 +304,12 @@ public void explode() while (splashDamage.hasNext()) { Entity entityHit = (Entity)splashDamage.next(); - double distanceToEntity = this.getDistanceToEntity(entityHit); + if(MineFantasyII.isBukkitServer() && BukkitUtils.cantDamage(thrower != null ? thrower:this, entityHit)) { + continue; + } + + double distanceToEntity = this.getDistanceToEntity(entityHit); double radius = getRangeOfBlast(); if (distanceToEntity < radius) { @@ -319,6 +324,7 @@ public void explode() } if(!(entityHit instanceof EntityItem)) { + DamageSource source = causeBombDamage(this, thrower != null ? thrower:this); source.setExplosion(); if(getFilling() == 2) diff --git a/src/main/java/minefantasy/mf2/entity/EntityCogwork.java b/src/main/java/minefantasy/mf2/entity/EntityCogwork.java index 3fb4dd4b..4f6bf321 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityCogwork.java +++ b/src/main/java/minefantasy/mf2/entity/EntityCogwork.java @@ -189,7 +189,7 @@ public void onUpdate() { this.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(block) + "_" + this.worldObj.getBlockMetadata(i, j, k), this.posX + ((double)this.rand.nextFloat() - 0.5D) * (double)this.width, this.boundingBox.minY + 0.1D, this.posZ + ((double)this.rand.nextFloat() - 0.5D) * (double)this.width, 4.0D * ((double)this.rand.nextFloat() - 0.5D), 0.5D, ((double)this.rand.nextFloat() - 0.5D) * 4.0D); } - if(!worldObj.isRemote && ConfigArmour.cogworkGrief) + if(!worldObj.isRemote && ConfigArmour.cogworkGrief) { damageBlock(block, i, j, k, worldObj.getBlockMetadata(i, j, k)); block = this.worldObj.getBlock(i, j+1, k); diff --git a/src/main/java/minefantasy/mf2/entity/EntityMine.java b/src/main/java/minefantasy/mf2/entity/EntityMine.java index 1ff7693a..7013449e 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityMine.java +++ b/src/main/java/minefantasy/mf2/entity/EntityMine.java @@ -3,11 +3,13 @@ import java.util.Iterator; import java.util.List; +import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.item.gadget.EnumCasingType; import minefantasy.mf2.item.gadget.EnumExplosiveType; import minefantasy.mf2.item.gadget.EnumFuseType; import minefantasy.mf2.item.gadget.EnumPowderType; import minefantasy.mf2.item.list.ToolListMF; +import minefantasy.mf2.util.BukkitUtils; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; @@ -260,6 +262,11 @@ public void explode() while (splashDamage.hasNext()) { Entity entityHit = (Entity)splashDamage.next(); + + if(MineFantasyII.isBukkitServer() && BukkitUtils.cantDamage(thrower != null ? thrower:this, entityHit)) { + continue; + } + double distanceToEntity = this.getDistanceToEntity(entityHit); double radius = getRangeOfBlast()* getPowderType().rangeModifier; diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java index 55b14417..9b1e8347 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java @@ -17,6 +17,7 @@ import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.config.ConfigTools; import minefantasy.mf2.item.list.CreativeTabMF; +import minefantasy.mf2.util.BukkitUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -77,6 +78,10 @@ public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, if(newblock != null && user instanceof EntityPlayer && ForgeHooks.canHarvestBlock(newblock, (EntityPlayer) user, m) && ForgeHooks.isToolEffective(item, newblock, m)) { + if((MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ)) ) { + continue; + } + if(rand.nextFloat()*100F < (100F - ConfigTools.hvyDropChance)) { newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, EnchantmentHelper.getFortuneModifier(user)); diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java index 8c8d7950..0bc2b407 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java @@ -17,6 +17,7 @@ import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.config.ConfigTools; import minefantasy.mf2.item.list.CreativeTabMF; +import minefantasy.mf2.util.BukkitUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -82,6 +83,10 @@ public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, if((above == null || !above.getMaterial().isSolid()) && newblock != null && user instanceof EntityPlayer && ForgeHooks.canHarvestBlock(newblock, (EntityPlayer) user, m) && ForgeHooks.isToolEffective(item, newblock, m)) { + if((MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ)) ) { + continue; + } + if(rand.nextFloat()*100F < (100F - ConfigTools.hvyDropChance)) { newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, EnchantmentHelper.getFortuneModifier(user)); diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java index c1e540cf..3f556ed8 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java @@ -2,11 +2,13 @@ import java.util.Random; +import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.api.weapon.IRackItem; import minefantasy.mf2.block.tileentity.decor.TileEntityRack; import minefantasy.mf2.config.ConfigTools; import minefantasy.mf2.item.tool.ItemAxeMF; +import minefantasy.mf2.util.BukkitUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.enchantment.EnchantmentHelper; @@ -82,6 +84,10 @@ private void breakChain(World world, int x, int y, int z, ItemStack item, Block { if(maxLogs > 0 && isLog(world, x, y, z, orient, orientM)) { + if(MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock((EntityPlayer)user, x, y, z)) { + return; + } + Block newblock = world.getBlock(x, y, z); breakSurrounding(item, world, newblock, x, y, z, user); if(rand.nextFloat()*100F < (100F - ConfigTools.hvyDropChance)) @@ -102,10 +108,7 @@ private void breakChain(World world, int x, int y, int z, ItemStack item, Block } } } - if(user instanceof EntityPlayer) - { - tirePlayer(user, 0.5F); - } + tirePlayer(user, 0.5F); } } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java index 43185db5..909184ea 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java @@ -20,6 +20,7 @@ import minefantasy.mf2.block.tileentity.decor.TileEntityRack; import minefantasy.mf2.farming.FarmingHelper; import minefantasy.mf2.item.list.CreativeTabMF; +import minefantasy.mf2.util.BukkitUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -88,6 +89,10 @@ private boolean cutGrass(World world, int x, int y, int z, int r, EntityPlayer e Material m = block.getMaterial(); if(canCutMaterial(m, block.getBlockHardness(world, x+x2, y+y2, z+z2), leaf)) { + if((MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock(entity, x+x2, y+y2, z+z2)) ) { + continue; + } + if(getDistance(x+x2, y+y2, z+z2, x, y, z) < r*1) { flag = true; diff --git a/src/main/java/minefantasy/mf2/util/BukkitUtils.java b/src/main/java/minefantasy/mf2/util/BukkitUtils.java new file mode 100644 index 00000000..ae4ffdb6 --- /dev/null +++ b/src/main/java/minefantasy/mf2/util/BukkitUtils.java @@ -0,0 +1,91 @@ +package minefantasy.mf2.util; + +import java.lang.reflect.Method; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.RegisteredListener; + +import com.google.common.collect.Lists; + +import minefantasy.mf2.MineFantasyII; +import minefantasy.mf2.config.ConfigIntegration; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; + +public final class BukkitUtils { + + private static final Method getBukkitEntity; + private static final List listeners = Lists.newArrayList(); + + static { + try { + getBukkitEntity = Entity.class.getDeclaredMethod("getBukkitEntity"); + getBukkitEntity.setAccessible(true); + } catch (Throwable throwable) { + throw new RuntimeException("Failed to hook CraftBukkit method!", throwable); + } + } + + public static final boolean cantBreakBlock(EntityPlayer player, int x, int y, int z) { + try { + Player bukkitPlayer = toBukkitEntity(player); + BlockBreakEvent event = new BlockBreakEvent(bukkitPlayer.getWorld().getBlockAt(x, y, z), bukkitPlayer); + callEvent(event); + return event.isCancelled(); + } catch (Throwable throwable) { + MFLogUtil.logWarn(String.format("Failed call BlockBreakEvent: [Player: %s, X:%d, Y:%d, Z:%d]", + String.valueOf(player), x, y, z)); + if (MineFantasyII.isDebug()) + throwable.printStackTrace(); + } + return true; + } + + public static final boolean cantDamage(Entity damager, Entity damagee) { + try { + @SuppressWarnings("deprecation") + EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(toBukkitEntity(damager), + toBukkitEntity(damagee), DamageCause.ENTITY_ATTACK, 0D); + callEvent(event); + return event.isCancelled(); + } catch (Throwable throwable) { + MFLogUtil.logWarn(String.format("Failed call EntityDamageByEntityEvent: [Damager: %s, Damagee: %s]", + String.valueOf(damager), String.valueOf(damagee))); + if (MineFantasyII.isDebug()) + throwable.printStackTrace(); + } + return true; + } + + private static final org.bukkit.entity.Entity toBukkitEntity(Entity entity) throws Exception { + return (org.bukkit.entity.Entity) getBukkitEntity.invoke(entity); + } + + private static final Player toBukkitEntity(EntityPlayer player) throws Exception { + return (Player) getBukkitEntity.invoke(player); + } + + public static final void onServerStarted() { + PluginManager plManager = Bukkit.getPluginManager(); + for (String plName : ConfigIntegration.pluginsList) + listeners.addAll(HandlerList.getRegisteredListeners(plManager.getPlugin(plName))); + } + + private static final void callEvent(Event event) { + for (RegisteredListener listener : listeners) + try { + listener.callEvent(event); + } catch (Throwable throwable) { + if (MineFantasyII.isDebug()) + throwable.printStackTrace(); + } + } +} From 0ad0323e94db99afd749d427cf23275967db35a1 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 10 Feb 2017 14:03:24 +0700 Subject: [PATCH 002/101] Added config options for books and talismans recipes Useful for modpacks and hardcore servers. That appears only for recipes. Also, organazied imports. --- .../mf2/config/ConfigHardcore.java | 4 + .../mf2/recipe/BasicRecipesMF.java | 198 +++++++++--------- .../mf2/recipe/ForgingRecipes.java | 71 +++---- 3 files changed, 133 insertions(+), 140 deletions(-) diff --git a/src/main/java/minefantasy/mf2/config/ConfigHardcore.java b/src/main/java/minefantasy/mf2/config/ConfigHardcore.java index 44037c50..e45f1a1a 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigHardcore.java +++ b/src/main/java/minefantasy/mf2/config/ConfigHardcore.java @@ -15,6 +15,8 @@ public class ConfigHardcore extends ConfigurationBaseMF public static boolean HCCWeakItems = true; public static boolean HCCallowRocks = true; public static boolean HCCRemoveCraft = true; + public static boolean HCCRemoveBooksCraft = false; + public static boolean HCCRemoveTalismansCraft = false; public static final String CATEGORY_RESEARCH = "2: Research"; @@ -43,6 +45,8 @@ protected void loadConfig() HCCWeakItems = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Weaken Basic items", true, "This will significantly reduce the durability of basic items (made on basic crafting table), they can still be crafted but are practically useless.").getString()); HCCallowRocks = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Allow Stone-Age", true, "Allows punching stone for sharp rocks, and using them on leaves for sticks/vines: These make primitive stone tools").getString()); HCCRemoveCraft = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Remove Recipes", true, "Some recipes (Such as Bread, or Flint and Steel) will be removed, since MF has its own recipe for such items.").getString()); + HCCRemoveBooksCraft = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Remove Books Recipes", false, "Skill books recipes will be disabled, but you still can find them it the world.").getString()); + HCCRemoveTalismansCraft = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Remove Talismans Recipes", false, "Research talismans recipes will be disabled, but you still can find them it the world.").getString()); ResearchLogic.knowledgelyr = Integer.parseInt(config.get(CATEGORY_RESEARCH, "###CHANGE RESEARCH ID###", 0, "This changes the research ID, removing all entries").getString()); InformationBase.unlockAll = Boolean.parseBoolean(config.get(CATEGORY_RESEARCH, "Unlock entries", false, "If you don't want to research, this will unlock all entries.").getString()); diff --git a/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java b/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java index 46ef7579..271ca128 100644 --- a/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java +++ b/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java @@ -1,38 +1,27 @@ package minefantasy.mf2.recipe; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; -import java.util.Map; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.api.MineFantasyAPI; -import minefantasy.mf2.api.crafting.Salvage; import minefantasy.mf2.api.crafting.tanning.TanningRecipe; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.basic.ConstructionBlockMF; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.item.ItemComponentMF; -import minefantasy.mf2.item.armour.ItemArmourMF; import minefantasy.mf2.item.food.FoodListMF; -import minefantasy.mf2.item.list.ArmourListMF; import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.item.list.CustomArmourListMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.item.list.styles.DragonforgedStyle; import minefantasy.mf2.item.list.styles.OrnateStyle; import minefantasy.mf2.knowledge.KnowledgeListMF; import minefantasy.mf2.material.BaseMaterialMF; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.init.Blocks; import net.minecraft.init.Items; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; import net.minecraftforge.oredict.OreDictionary; -import net.minecraftforge.oredict.ShapedOreRecipe; -import cpw.mods.fml.common.registry.GameRegistry; public class BasicRecipesMF { @@ -238,98 +227,101 @@ public static void init() TanningRecipe.addRecipe(ComponentListMF.hideLarge, mat.craftTimeModifier*4F, -1, new ItemStack(Items.leather, 5)); TanningRecipe.addRecipe(Items.leather, mat.craftTimeModifier*2F, -1, "shears", new ItemStack(ComponentListMF.leather_strip, 4)); - KnowledgeListMF.artBookR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_artisanry), new Object[] - { - "T", - "D", - "B", - 'T', ComponentListMF.talisman_lesser, - 'D', new ItemStack(Items.dye, 1, 1), - 'B', Items.book, - }); - KnowledgeListMF.conBookR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_construction), new Object[] - { - "T", - "D", - "B", - 'T', ComponentListMF.talisman_lesser, - 'D', new ItemStack(Items.dye, 1, 14), - 'B', Items.book, - }); - KnowledgeListMF.proBookR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_provisioning), new Object[] - { - "T", - "D", - "B", - 'T', ComponentListMF.talisman_lesser, - 'D', new ItemStack(Items.dye, 1, 2), - 'B', Items.book, - }); - KnowledgeListMF.engBookR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_engineering), new Object[] - { - "T", - "D", - "B", - 'T', ComponentListMF.talisman_lesser, - 'D', new ItemStack(Items.dye, 1, 12), - 'B', Items.book, - }); - KnowledgeListMF.comBookR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_combat), new Object[] - { - "T", - "D", - "B", - 'T', ComponentListMF.talisman_lesser, - 'D', new ItemStack(Items.dye, 1, 5), - 'B', Items.book, - }); - + if(!ConfigHardcore.HCCRemoveBooksCraft) { + KnowledgeListMF.artBookR = + MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_artisanry), new Object[] + { + "T", + "D", + "B", + 'T', ComponentListMF.talisman_lesser, + 'D', new ItemStack(Items.dye, 1, 1), + 'B', Items.book, + }); + KnowledgeListMF.conBookR = + MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_construction), new Object[] + { + "T", + "D", + "B", + 'T', ComponentListMF.talisman_lesser, + 'D', new ItemStack(Items.dye, 1, 14), + 'B', Items.book, + }); + KnowledgeListMF.proBookR = + MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_provisioning), new Object[] + { + "T", + "D", + "B", + 'T', ComponentListMF.talisman_lesser, + 'D', new ItemStack(Items.dye, 1, 2), + 'B', Items.book, + }); + KnowledgeListMF.engBookR = + MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_engineering), new Object[] + { + "T", + "D", + "B", + 'T', ComponentListMF.talisman_lesser, + 'D', new ItemStack(Items.dye, 1, 12), + 'B', Items.book, + }); + KnowledgeListMF.comBookR = + MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_combat), new Object[] + { + "T", + "D", + "B", + 'T', ComponentListMF.talisman_lesser, + 'D', new ItemStack(Items.dye, 1, 5), + 'B', Items.book, + }); + + + KnowledgeListMF.artBook2R = + MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_artisanry2), new Object[] + { + "T", + "B", + 'T', ComponentListMF.talisman_greater, + 'B', ToolListMF.skillbook_artisanry, + }); + KnowledgeListMF.conBook2R = + MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_construction2), new Object[] + { + "T", + "B", + 'T', ComponentListMF.talisman_greater, + 'B', ToolListMF.skillbook_construction, + }); + KnowledgeListMF.proBook2R = + MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_provisioning2), new Object[] + { + "T", + "B", + 'T', ComponentListMF.talisman_greater, + 'B', ToolListMF.skillbook_provisioning, + }); + KnowledgeListMF.engBook2R = + MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_engineering2), new Object[] + { + "T", + "B", + 'T', ComponentListMF.talisman_greater, + 'B', ToolListMF.skillbook_engineering, + }); + KnowledgeListMF.comBook2R = + MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_combat2), new Object[] + { + "T", + "B", + 'T', ComponentListMF.talisman_greater, + 'B', ToolListMF.skillbook_combat, + }); + } - KnowledgeListMF.artBook2R = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_artisanry2), new Object[] - { - "T", - "B", - 'T', ComponentListMF.talisman_greater, - 'B', ToolListMF.skillbook_artisanry, - }); - KnowledgeListMF.conBook2R = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_construction2), new Object[] - { - "T", - "B", - 'T', ComponentListMF.talisman_greater, - 'B', ToolListMF.skillbook_construction, - }); - KnowledgeListMF.proBook2R = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_provisioning2), new Object[] - { - "T", - "B", - 'T', ComponentListMF.talisman_greater, - 'B', ToolListMF.skillbook_provisioning, - }); - KnowledgeListMF.engBook2R = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_engineering2), new Object[] - { - "T", - "B", - 'T', ComponentListMF.talisman_greater, - 'B', ToolListMF.skillbook_engineering, - }); - KnowledgeListMF.comBook2R = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_combat2), new Object[] - { - "T", - "B", - 'T', ComponentListMF.talisman_greater, - 'B', ToolListMF.skillbook_combat, - }); GameRegistry.addShapedRecipe(((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood"), new Object[] { "S", diff --git a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java index 26931bd1..483a73f0 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java @@ -1,20 +1,16 @@ package minefantasy.mf2.recipe; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import cpw.mods.fml.common.registry.GameRegistry; - import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.Salvage; import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; -import minefantasy.mf2.api.crafting.exotic.SpecialForging; -import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.rpg.Skill; import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigCrafting; +import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.item.ItemComponentMF; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ArmourListMF; @@ -26,7 +22,6 @@ import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; public class ForgingRecipes { @@ -339,37 +334,39 @@ public static void init() } } } - KnowledgeListMF.talismanRecipe.add( - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[] - { - "LGL", - "GIG", - " G ", - 'L', new ItemStack(Items.dye, 1, 4), - 'I', ironbar, - 'G', goldbar, - })); - KnowledgeListMF.talismanRecipe.add( - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[] - { - "LSL", - "SIS", - " S ", - 'L', new ItemStack(Items.dye, 1, 4), - 'I', ironbar, - 'S', silverbar, - })); - KnowledgeListMF.greatTalismanRecipe = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.talisman_greater), "", true, "hammer", 1, 1, 50, new Object[] - { - "GSG", - "DTD", - "GDG", - 'G', goldbar, - 'D', Items.diamond, - 'T', ComponentListMF.talisman_lesser, - 'S', Items.nether_star, - }); + if(!ConfigHardcore.HCCRemoveTalismansCraft) { + KnowledgeListMF.talismanRecipe.add( + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[] + { + "LGL", + "GIG", + " G ", + 'L', new ItemStack(Items.dye, 1, 4), + 'I', ironbar, + 'G', goldbar, + })); + KnowledgeListMF.talismanRecipe.add( + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[] + { + "LSL", + "SIS", + " S ", + 'L', new ItemStack(Items.dye, 1, 4), + 'I', ironbar, + 'S', silverbar, + })); + KnowledgeListMF.greatTalismanRecipe = + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.talisman_greater), "", true, "hammer", 1, 1, 50, new Object[] + { + "GSG", + "DTD", + "GDG", + 'G', goldbar, + 'D', Items.diamond, + 'T', ComponentListMF.talisman_lesser, + 'S', Items.nether_star, + }); + } addEngineering(); addConstruction(); From 4e48fcd9f696505cdbbf9874f538d9d2fff6e9f4 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 28 May 2017 15:20:08 +0700 Subject: [PATCH 003/101] Make AlloyRecipes list public --- src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java b/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java index 80285412..b4d6e322 100644 --- a/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java +++ b/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java @@ -6,7 +6,7 @@ import net.minecraft.item.ItemStack; public class AlloyRecipes { - private static Listalloys = new ArrayList(); + public static Listalloys = new ArrayList(); public static Alloy addAlloy(ItemStack out, int level, List in) { From 29ad28d52f27b245f552e8595240dae444f74c0a Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 7 Jun 2017 15:26:09 +0700 Subject: [PATCH 004/101] Russian language for MF2 --- .../assets/minefantasy2/lang/ru_RU.lang | 2253 +++++++++++++++++ 1 file changed, 2253 insertions(+) create mode 100644 src/main/resources/assets/minefantasy2/lang/ru_RU.lang diff --git a/src/main/resources/assets/minefantasy2/lang/ru_RU.lang b/src/main/resources/assets/minefantasy2/lang/ru_RU.lang new file mode 100644 index 00000000..d750bd01 --- /dev/null +++ b/src/main/resources/assets/minefantasy2/lang/ru_RU.lang @@ -0,0 +1,2253 @@ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//Русификация подготовлена: Ardghal, Sirse, SkySwifty (Alter) +//Специально для проекта ZonaSumraka.RU +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/INFORMATION/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +forge.fuel.name=~Топливо~ +vehicle.fuel.name=Топливо: %1$s +info.bow.reload="Присесть" + ПКМ для перезарядки +info.firearm.ammo=%1$s/%2$s + +attribute.kit.salvage.name=Эффективность разбора + +attribute.kit.repairRate.name=Шанс починки +attribute.kit.repairRate_enchant.name=Шанс починки (Зачарованные вещи) +attribute.kit.repairRate_normal.name=Шанс починки (Не зачарованные вещи) + +attribute.kit.repairChance.name=Шанс успешной починки +attribute.kit.breakChance.name=Шанс поломки набора + +attribute.inferior.name=Плохого качества +attribute.superior.name=Отличного качества + +item.infobook.name=Книга исследований +item.research_scroll.name=Свиток исследований +item.research_scroll_complete.name=Завершённое исследование + +item.talisman_lesser.name=Малый талисман знания +item.talisman_greater.name=Большой талисман знания + +prospect.canmine=Вы можете добыть это! (Инструмент: %1$s | Блок: %2$s) +prospect.cannotmine=Вы не можете добыть это! (Инструмент: %1$s | Блок: %2$s) +gui.information=Исследование +information.discovered=Исследовано +information.buy=Нажмите для исследования +knowledge.unknownUse=Вы не знаете, как использовать это! +knowledge.known=Вы уже знаете это. + +infoPage.basic=Основы +infoPage.artisanry=Кузнечное дело +infoPage.construction=Строительное дело +infoPage.provisioning=Ремесло снабжения +infoPage.engineering=Инженерное дело +infoPage.mastery=Мастерство +infoPage.dwarvern=Знания гномов +infoPage.gnomish=Гномские секреты + +knowledge.unlocked=Исследование завершено + +vehicle.noArmour=Вы не можете использовать этот костюм, когда носите что-либо. +vehicle.tooBigArmour=Ваша броня слишком объёмна и вы не влезаете в костюм. + +research.noskill=Вы сможете изучить что-то из этого, пока не достигнете более высокого уровня. +research.null=Больше нечего изучать + +research.addArtefact=Добавлено знание: %1$s (%2$s/%3$s) +research.finishResearch=Исследовано: "%1$s" +research.cluecount= (%1$s/%2$s) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/MOBS/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +entity.MF_Minotaur.name=Минотавр +entity.MF_Dragon.name=Дракон +death.attack.dragonstomp=%1$s был растоптан драконом. +death.attack.humanstomp=%1$s был растоптан %2$s +death.attack.fireblast=%1$s был испепелён %2$s +death.attack.fireblastBase=%1$s обратился в пепел +death.attack.blastfurn=%1$s сгорел в доменной печи +death.attack.frostblast=%1$s был заморожен %2$s +death.attack.frostblastBase=%1$s замёрз насмерть +death.attack.acidblast=%1$s был испарён %2$s +death.attack.acidblastBase=%1$s испарился +death.attack.ashblast=%1$s задохнулся от пепла %2$s +death.attack.ashblastBase=%1$s задохнулся от пепла + +death.attack.mob.pound=%1$s был растоптан %2$s +death.attack.mob.gore=%1$s был поднят на рога%2$s +death.attack.mob.beserk=%1$s был разорван %2$s + +entity.minotaur.name=Минотавр +entity.minotaur_guard.name=Минотавр-защитник +entity.minotaur_elite.name=Элитный минотавр +entity.minotaur_boss.name=Минотавр-воевода + +entity.frostminotaur.name=Ледяной минотавр +entity.frostminotaur_guard.name=Ледяной минотавр-защитник +entity.frostminotaur_elite.name=Элитный ледяной минотавр +entity.frostminotaur_boss.name=Ледяной минотавр-воевода + +entity.dredminotaur.name=Ужасный минотавр +entity.dreadminotaur_guard.name=Ужасный минотавр-защитник +entity.dreadminotaur_elite.name=Ужасный минотавр-палач +entity.dreadminotaur_boss.name=Ужасный минотавр-воевода + +entity.dragonbreed.red.name=Красный +entity.dragonbreed.white.name=Ледяной +entity.dragonbreed.black.name=Чёрный +entity.dragonbreed.green.name=Зелёный +entity.dragonbreed.ash.name=Пепельный + +entity.dragon_young.name=Молодой %1$s дракон +entity.dragon.name=%1$s дракон +entity.dragon_mature.name=Взрослый %1$s дракон +entity.dragon_elder.name=Старейший %1$s дракон +entity.dragon_ancient.name=Древний %1$s дракон + +event.dragonnear.name=Дракон в небе! Ищите укрытие, или приготовьтесь к бою! +event.dragonnear.forge.name=Это ремесло нанесло оскорбление всей расе драконов! +event.dragonaway.name=Дракон улетел... Пока что... + +entity.hound.name=Гончая + +item.spawn_dragon.name=Дракон +item.spawn_dragon.desc=Смертоносные летающие рептилии +item.spawn_minotaur.name=Минотавр +item.spawn_minotaur.desc=Жестокий и беспощадный. +item.spawn_hound.name=Гончая +item.spawn_hound.desc=Умная собака с острыми клыками +item.spawn_cogwork.name=Механическая броня +item.spawn_cogwork.desc=Максимум защиты + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/TOOL LIST/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.tool_pick.name=%1$s кирка +item.commodity_plank.name=%1$s брусок +item.haft.name=Рукоять +item.commodity_hunk.name=%1$s кусок +item.commodity_scrap.name=%1$s лом +item.commodity_plate.name=%1$s пластина +item.commodity_bar.name=Чушка "%1$s" +item.commodity_plate_huge.name=Большая %1$s пластина +item.commodity_chainmesh.name=%1$s кольчужная сетка +item.commodity_scalemesh.name=%1$s чешуйчатая сетка +item.commodity_splintmesh.name=%1$s пластинчатая сетка +item.commodity_plateheavy.name=Тяжёлая пластина из "%1$s" +item.commodity_arrowhead.name=%1$s наконечник +item.commodity_bodkinhead.name=Конусовидный наконечник "%1$s" +item.commodity_broadhead.name=Широкий наконечник "%1$s" +item.commodity_cogwork_armour.name=Механическая броня "%1$s" + +item.mod_plating.name=%1$s панцирная +item.mod_head.name=%1$s Голова +item.mod_haft.name=Рукоять "%1$s" +item.mod_joint.name=Плечи "%1$s" + +component.head.name=%1$s Head +component.shaft.name=%1$s Shaft +component.grip.name=%1$s Grip +component.brace.name=%1$s Brace +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/MATERIAL LIST/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +materialtype.wood.name=Дерево (lvl %1$s) +materialtype.leather.name=Кожа (lvl %1$s) +materialtype.metal.name=Металл (lvl %1$s) +materialtype.workable.name=Темп. ковки: %1$s°C - %2$s°C + +materialtype.resist.name=Сопротивление %1$s +materialtype.fireresist.name=Сопротивление огню %1$s +materialtype.maxtemp.name=Темп. плавления: %1$s°C +material.any.name=Any + +WOOD +material.scrapwood.name=Древесные отходы +material.oakwood.name=Дуб +material.birchwood.name=Берёза +material.sprucewood.name=Ель +material.acaciawood.name=Акация +material.junglewood.name=Тропическое дерево +material.refinedwood.name=Очищенная древесина +material.ironbarkwood.name=Эвкалипт +material.ebonywood.name=Эбеновое дерево +material.darkoakwood.name=Тёмный дуб +material.pinewood.name=Сосна +material.cherrywood.name=Вишня +material.poplarwood.name=Тополь +material.maplewood.name=Maple +material.mahoewood.name=Махо +material.greenheartwood.name=Зеленосердечное дерево +material.palmwood.name=Пальма +material.limewood.name=Липа +material.balsawood.name=Бальза +material.walnutwood.name=Ореховое дерево +material.chestnutwood.name=Каштан +material.larchwood.name=Лиственница +material.willowwood.name=Ива +material.teakwood.name=Тик +material.sequoiawood.name=Секвойя +material.mahoganywood.name=Красное дерево +material.wengewood.name=Венге +material.redwoodwood.name=Красное дерево +material.firwood.name=Ель +material.purpleheartwood.name=Пурпурносердечное дерево +material.silverwoodwood.name=Серебряное дерево +material.greatwoodwood.name=Великое дерево +material.yewwood.name=Тис + + + +LEATHER +material.leather.name=Кожа +material.hardleather.name=Грубая кожа +material.minotaurskin.name=Кожа минотавра +material.dragonskin.name=Драконья кожа + +METAL +material.copper.name=Медь +material.tin.name=Олово + +material.bronze.name=Бронза +material.iron.name=Железо +material.refinediron.name=Чугун +material.steel.name=Сталь +material.tungsten.name=Вольфрам +material.obsidian.name=Обсидиан +material.encrusted.name=Алмаз +material.blacksteel.name=Чёрная сталь +material.redsteel.name=Красная сталь +material.bluesteel.name=Голубая сталь + +material.adamantium.name=Адамантий +material.mithril.name=Мифрил +material.ignotumite.name=Игнотумит +material.mithium.name=Мифий +material.ender.name=Сталь Края + +PRECIOUS +material.gold.name=Золото +material.silver.name=Серебро + +NON-MF +material.bismuth.name=Висмут +material.bismuthbronze.name=Висмутовая бронза +material.nickel.name=Никель +material.titanium.name=Титан +material.stainlesssteel.name=Нержавеющая сталь + +ALLOY +material.compositealloy.name=Композитный слиток + +MOD +material.thaumium.name=Таум металл +material.void.name=Пустотный металл +material.manasteel.name=Манафрам +material.elvenelementium.name=Элементиум +material.terrasteel.name=Терразий +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/ITEM STATS/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +prefix.hotitem.name=Горячий %1$s +state.workable=Готовый к работе +state.unstable=Перегретый +attribute.weightt.name=Вес: %1$sт +attribute.weightKg.name=Вес: %1$sкг +attribute.weightg.name=Вес: %1$sг +attribute.nomfcrafttier.name=Другой разряд +attribute.mfcrafttier.name=Уровень +attribute.mfcrafttool.name=Ремесл. инструмент: +attribute.mfcrafteff.name=Эффективность крафта +attribute.mfcraftedbyname.name=Ремесленник +tooltype.hammer=Молот +tooltype.hvyHammer=Тяжёлый молот +tooltype.saw=Пила +tooltype.knife=Нож +tooltype.needle=Игла +tooltype.mallet=Киянка +tooltype.spoon=Ложка +tooltype.hands=Кулак +tooltype.spanner=Гаечный ключ +tooltype.shears=Ножницы +tooltype.brush=Кисть + +tooltype.anvil=Наковальня +tooltype.carpenter=Плотницкий верстак + +attribute.weapon.penetrateArmor=Проникновение +attribute.weapon.daze=Дробящий урон +attribute.weapon.extendedReach=Радиус +attribute.weapon.attackSpeed=Скорость атаки +attribute.weapon.backstab=Удар в спину +attribute.weapon.mountedBonus=Удар в седле +attribute.weapon.joustDam=Удар на скаку +attribute.shield.block.time=s блокирование +attribute.shield.arrow.count=Стрелы +attribute.quiver.arrow.empty=Пусто +attribute.quiver.arrow.count=Стрелы + +attribute.armour.protection=Уровень защиты +attribute.armour.light=Лёгкая броня +attribute.armour.medium=Средняя броня +attribute.armour.heavy=Тяжёлая броня +attribute.weight.name=Масса + +attribute.bowPower.name=Модификатор урона x%1$s +attribute.arrowPower.name=Урон + +attribute.armour.rating.0=Режущий урон: +attribute.armour.rating.1=Дробящий урон: +attribute.armour.rating.2=Колющий урон: + +attribute.armour.cuttingresistance=Сопротивление режущему оружию +attribute.armour.bluntresistance=Сопротивление дробящему оружию +attribute.armour.piercingresistance=Сопротивление колющему оружию + +attribute.weapon.cutting=Режущий урон +attribute.weapon.blunt=Дробящий урон +attribute.weapon.piercing=Колющий урон + +attribute.armour.dtcutting=Максимальный режущий урон +attribute.armour.dtblunt=Максимальный дробящий урон +attribute.armour.dtpiercing=Максимальный колющий урон + +arrow.head.normal.name=Обычный наконечник +arrow.head.bodkin.name=Конусовидный наконечник +arrow.head.broad.name=Широкий наконечник + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/COMMODITY/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.plank.name=Брусок +item.plant_oil.name=Растительное масло +item.plankRefined.name=Пропитанный брусок +item.rivet.name=Заклёпки +item.nail.name=Гвозди +item.thread.name=Волокно +item.lime_rock.name=Известняковый камень +item.borax_rock.name=Залежи боракса +item.flux.name=Флюс +item.flux_strong.name=Крепкий флюс +item.coal_prep.name=Подготовленный уголь +item.coke.name=Кокс +item.blackpowder.name=Чёрный порох +item.blackpowder_advanced.name=Продвинутый чёрный порох +item.bolt.name=Болты +item.flux_pot.name=Горшочек флюса +item.coal_flux.name=Угольный флюс + +item.ingotCopper.name=Медный слиток +item.ingotTin.name=Оловянный слиток +item.ingotBronze.name=Бронзовый слиток +item.ingotPigIron.name=Чугунный слиток +item.ingotSteel.name=Стальной слиток +item.ingotEncrusted.name=Драгоценный слиток +item.ingotObsidian.name=Обсидиановый слиток +item.ingotSilver.name=Серебряный слиток +item.ingotPureGold.name=Слиток чистого золота +item.ingotCompositeAlloy.name=Слиток композитного сплава +item.ingotBlackSteelWeak.name=Необработанная чёрная сталь +item.ingotBlueSteelWeak.name=Необработанная голубая сталь +item.ingotRedSteelWeak.name=Необработанная красная сталь + +item.ingotRedSteel.name=Слиток красной стали +item.ingotBlackSteel.name=Слиток чёрной стали +item.ingotBlueSteel.name=Слиток голубой стали + +item.ingotAdamantium.name=Адамантиевый слиток +item.ingotMithril.name=Мифриловый слиток + +item.ingotIgnotumite.name=Игнотумитовый слиток +item.ingotMithium.name=Мифиевый слиток + +item.ingotEnder.name=Слиток стали Края + +item.ingotTungsten.name=Вольфрамовый слиток + +item.loot_sack.name=Добыча +item.loot_sack_uc.name=Ценная добыча +item.loot_sack_rare.name=Драгоценная добыча + +item.copper_coin.name=Медная монета +item.silver_coin.name=Серебряная монета +item.gold_coin.name=Золотая монета + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/COMPONENT/ +item.ingot_mould.name=Литейная форма +item.ingot_mould_uncooked.name=Необожжённая литейная форма + +item.clay_pot.name=Горшок +item.clay_pot_uncooked.name=Необожжённый горшок + +item.jug_empty.name=Пустой кувшин +item.jug_uncooked.name=Необожжённый кувшин +item.jug_water.name=Кувшин с водой +item.jug_milk.name=Кувшин с молоком + +tile.salvage_basic.name=Простой разборочный верстак +tile.salvage_advanced.name=Продвинутый разборочный верстак + +tile.repair_basic.name=Базовый рем. набор +tile.repair_advanced.name=Продвинутый рем. набор +tile.repair_ornate.name=Украшенный рем. набор + +item.rawhideSmall.name=Малая шкура +item.rawhideMedium.name=Средняя шкура +item.rawhideLarge.name=Большая шкура + +item.leather_strip.name=Полоска кожи +item.hideSmall.name=Чистая малая шкура +item.hideMedium.name=Чистая средняя шкура +item.hideLarge.name=Чистая большая шкура + +item.vine.name=Лоза +item.sharp_rock.name=Острый камень + +item.iron_prep.name=Обработанное железо +item.diamond_shards.name=Алмазные осколки +item.diamond_dust.name=Алмазная пыль +item.obsidian_rock.name=Обсидиановый осколок +item.fletching.name=Оперение + +item.coalDust.name=Угольная пыль +item.nitre.name=Селитра +item.sulfur.name=Сера +item.bomb_casing_uncooked.name=Необожжённый глиняный корпус бомбы +item.bomb_casing.name=Глиняный корпус бомбы +item.mine_casing_uncooked.name=Необожжённый глиняный корпус мины +item.mine_casing.name=Глиняный корпус мины +item.shrapnel.name=Шрапнель +item.magma_cream_refined.name=Очищенная магма +item.bomb_fuse.name=Фитиль +item.bomb_fuse_long.name=Длинный фитиль +item.bomb_casing_iron.name=Железный корпус бомбы +item.mine_casing_iron.name=Железный корпус мины +item.bomb_casing_obsidian.name=Обсидиановый корпус бомбы +item.mine_casing_obsidian.name=Обсидиановый корпус мины +item.bomb_casing_crystal.name=Кристальный корпус бомбы +item.mine_casing_crystal.name=Кристальный корпус мины +item.bomb_casing_arrow.name=Корпус бомбы со стрелами +item.bomb_casing_bolt.name=Корпус бомбы с болтами + +item.clay_brick.name=Глиняный кирпич +item.kaolinite.name=Каолинит +item.kaolinite_dust.name=Каолинитовая пыль +item.fireclay.name=Огнеупорная глина +item.fireclay_brick.name=Огнеупорный глиняный кирпич +item.strong_brick.name=Огнеупорный кирпич + +item.oreCopper.name=Необработанная медная руда +item.oreTin.name=Необработанная оловянная руда +item.oreIron.name=Необработанная железная руда +item.oreSilver.name=Необработанная серебряная руда +item.oreGold.name=Необработанная золотая руда +item.oreTungsten.name=Необработанный вольфрам + +item.dragon_heart.name=Сердце дракона +item.ornate_items.name=Декоративный герб + +item.iron_frame.name=Железная рама +item.iron_strut.name=Железная распорка +item.bronze_gears.name=Бронзовые шестерёнки +item.tungsten_gears.name=Вольфрамовые шестерёнки +item.steel_tube.name=Стальная трубка +item.cogwork_shaft.name=Вал механической брони +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/GADGET/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.spyglass.name=Подзорная труба +item.climbing_pick_basic.name=Альпеншток +item.parachute.name=Парашют +item.syringe_empty.name=Пустой шприц + +tile.cogwork_helm.name=Механический шлем +tile.cogwork_chest.name=Механический нагрудник +tile.cogwork_legs.name=Механические поножи +tile.frame_block.name=Остов +tile.cogwork_builder.name=Крюк + +item.cogwork_pulley.name=Шкив механической брони + +bomb.component.name=Компонент бомбы +bomb.component.filling=Наполнение +bomb.component.bombcase=Корпус бомбы +bomb.component.minecase=Корпус мины +bomb.component.arrow=Корпус стрелы +bomb.component.bolt=Корпус болтами +bomb.component.fuse=Фитиль +bomb.component.powder=Порох + +crossbow.component.name=Деталь арбалета +crossbow.component.stock=Ложе +crossbow.component.mechanism=Механизм +crossbow.component.mod=Модификация +crossbow.component.muzzle=Дуло + +item.bomb_crude.name=Грубая бомба +item.bomb_basic.name=Обычная бомба +item.bomb_shrapnel.name=Осколочная бомба +item.bomb_fire.name=Зажигательная бомба +item.exploding_arrow.name=Взрывная стрела +item.exploding_bolt.name=Взрывной болт + +item.mine_basic.name=Обычная мина +item.mine_shrapnel.name=Осколочная мина +item.mine_fire.name=Зажигательная мина + +death.attack.mine=%1$s подорвался на мине +death.attack.bomb.thrown=%1$s был взорван %2$s +death.attack.bomb=%1$s был взорван бомбой +death.attack.bomb.suicide=%1$s подорвал себя... Мда. + +bomb.powder.blackpowder.name=Пороховой заряд +bomb.powder.advBlackpowder.name=Продвинутый пороховой заряд +bomb.fuse.basic.name=Обычный фитиль +bomb.fuse.long.name=Длинный фитиль +bomb.case.crude.name=Бумажный корпус +bomb.case.ceramic.name=Керамический корпус +bomb.case.iron.name=Железный корпус +bomb.case.obsidian.name=Обсидиановый корпус +bomb.case.crystal.name=Кристальный корпус +bomb.damage.name=Урон взрывом +bomb.range.metric.name=Радиус поражения: %1$s м +bomb.fusetime.name=Время детонации: %1$s сек +bomb.case.sticky=Липкий корпус + +gui.bombcraftmf.name=Изготовление бомбы +gui.crossbowcraftmf.name=Изготовление арбалета + +attribute.crossbow.power.name=Урон: x%1$s +attribute.crossbow.speed.name=Перезарядка: %1$s сек. +attribute.crossbow.spread.name=Дальность: x%1$s +attribute.crossbow.recoil.name=Отдача: x%1$s +attribute.crossbow.capacity.name=Боезапас: %1$s +attribute.crossbow.bash.name=Урон вблизи: %1$s + +crosspart.stock.cross_stock_wood=Деревянный +crosspart.stock.cross_stock_iron=Железный +crosspart.stock.cross_handle_wood=Ручной +crosspart.mechanism.cross_arms_light=Лёгкий арбалет +crosspart.mechanism.cross_arms_heavy=Тяжёлый арбалет +crosspart.mechanism.cross_arms_advanced=Улучшенный арбалет +crosspart.mod.cross_ammo=Магазин +crosspart.mod.cross_scope=Прицел + +item.cross_stock_wood.name=Ложа +item.cross_handle_wood.name=Малая ложа +item.cross_stock_iron.name=Железная ложа +item.cross_arms_light.name=Лёгкие плечи арбалета +item.cross_arms_basic.name=Плечи арбалета +item.cross_arms_heavy.name=Тяжёлые плечи арбалета +item.cross_arms_advanced.name=Продвинутые плечи арбалета +item.cross_ammo.name=Магазинный механизм арбалета +item.cross_scope.name=Прицел арбалета +item.cross_bayonet.name=Арбалетный штык + +item.cross_stock_wood.desc=Без улучшений +item.cross_handle_wood.desc=Быстрая перезарядка, большая отдача и дальность +item.cross_stock_iron.desc=Гасит отдачу +item.cross_arms_light.desc=Меньше мощность и отдача, почти не влияет на вес +item.cross_arms_basic.desc=Без улучшений +item.cross_arms_heavy.desc=Больше мощность и отдача. Достаточно большой вес +item.cross_arms_advanced.desc=Большая мощность и точность, но высокая отдача и большой вес +item.cross_ammo.desc=Шестизарядный магазин, увеличенная дальность +item.cross_scope.desc=Даёт возможность вести прицельный огонь +item.cross_bayonet.desc=Повышенный урон в ближнем бою, снижает отдачу, медленная перезарядка +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/ORES/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +tile.oreCopper.name=Медная руда +tile.oreTin.name=Оловянная руда +tile.oreSilver.name=Серебряная руда +tile.oreTungsten.name=Вольфрамовая руда +tile.oreMythic.name=Мифиевая руда +tile.oreMythicPure.name=Чистая мифиевая руда + +tile.oreClay.name=Глиняные залежи +tile.oreBorax.name=Залежи боракса +tile.oreKaolinite.name=Залежи каолинита +tile.oreNitre.name=Залежи селитры +tile.oreSulfur.name=Залежи серы +tile.oreCoalRich.name=Богатые углём залежи + +tile.window.name=Окно +tile.window_pane.name=Оконное стекло +tile.mud_pavement.name=Грубые грязевые кирпичи +tile.mud_pavement_stair.name=Ступеньки из грубых грязевых кирпичей +tile.mud_brick.name=Грязевые кирпичи +tile.mud_brick_stair.name=Ступеньки из грязевых кирпичей +tile.thatch.name=Соломенная крыша +tile.thatch_stair.name=Скат соломенной крыши + +tile.limestone.name=Известняк +tile.limestone_cobblestone.name=Известняковый булыжник +tile.limestone_brick.name=Известняковые кирпичи +tile.limestone_pavement.name=Известняковая мозаика +tile.limestone_stair.name=Известняковые ступеньки +tile.limestone_cobblestone_stair.name=Ступеньки из известнякового булыжника +tile.limestone_brick_stair.name=Ступеньки из известнякового кирпича +tile.limestone_pavement_stair.name=Ступеньки из известняковой мозаики + +tile.slate.name=Сланец +tile.slate_cobblestone.name=Сланцевый булыжник +tile.slate_brick.name=Сланцевые кирпичи +tile.slate_pavement.name=Сланцевая мозаика +tile.slate_stair.name=Сланцевые ступеньки +tile.slate_cobblestone_stair.name=Ступеньки из сланцевого булыжника +tile.slate_brick_stair.name=Ступеньки из сланцевого кирпича +tile.slate_pavement_stair.name=Ступеньки из сланцевой мозаики + +tile.framed_glass.name=Обрамлённое стекло +tile.framed_pane.name=Обрамлённое оконное стекло +tile.firebricks.name=Огнеупорные кирпичи +tile.firebrick_stair.name=Ступеньки из огнеупорного кирпича +tile.cobble_pavement.name=Булыжниковая мозаика +tile.cobble_pavement_stair.name=Ступеньки из булыжниковой мозаики +tile.cobble_brick.name=Булыжниковые кирпичи +tile.cobble_brick_stair.name=Ступеньки из булыжникового кирпича +tile.clayWall.name=Глиняная стена +tile.ironbark_log.name=Эвкалиптовая древесина +tile.ebony_log.name=Эбеновая древесина +tile.yew_log.name=Тисовая древесина +tile.ironbark_leaves.name=Эвкалиптовая листва +tile.ebony_leaves.name=Листва эбенового дерева +tile.yew_leaves.name=Тисовая листва +tile.ironbark_sapling.name=Саженец эвкалипта +tile.ebony_sapling.name=Саженец эбенового дерева +tile.yew_sapling.name=Тисовый саженец +tile.ironbark_planks.name=Эвкалиптовые доски +tile.ebony_planks.name=Эбеновые доски +tile.yew_planks.name=Тисовые доски +tile.ironbark_stair.name=Эвкалиптовые ступеньки +tile.ebony_stair.name=Ступеньки из эбони +tile.yew_stair.name=Ступеньки из тиса + +tile.nailed_planks.name=Оббитые доски +tile.refined_planks.name=Очищенные доски +tile.nailed_planks_stair.name=Оббитые ступеньки +tile.refined_planks_stair.name=Очищенные ступеньки +tile.reinforced_stone.name=Укреплённый камень +tile.reinforced_stone_bricks.name=Кирпичи из укреплённого камня +tile.reinforced_stone_framed.name=Обрамлённый укреплённый камень + +tile.reinforced_stone_base.name=Укреплённый камень +tile.reinforced_stone_engraved.name=Резной укреплённый камень +tile.reinforced_stone_bricks_base.name=Кирпичи из укреплённого камня +tile.reinforced_stone_bricks_cracked.name=Потресканные кирпичи из укреплённого камня +tile.reinforced_stone_bricks_mossy.name=Замшелые кирпичи из укреплённого камня + +tile.reinforced_stone_stair.name=Ступеньки из укреплённого камня +tile.reinforced_stone_brick_stair.name=Ступеньки из укреплённых каменных кирпичей + +tile.bronze_bars.name=Бронзовые прутья +tile.iron_bars.name=Железные прутья +tile.steel_bars.name=Стальные прутья +tile.dragonforge_bars.name=Прутья из драконьей стали +tile.redsteel_bars.name=Прутья из красной стали +tile.blacksteel_bars.name=Прутья из чёрной стали +tile.bluesteel_bars.name=Прутья из голубой стали + +tile.copper_block.name=Медный блок +tile.tin_block.name=Оловянный блок +tile.silver_block.name=Серебряный блок +tile.pigiron_block.name=Чугунный блок + +tile.bronze_block.name=Бронзовый блок +tile.steel_block.name=Стальной блок +tile.dragonforge_block.name=Блок драконьей стали +tile.redsteel_block.name=Блок красной стали +tile.blacksteel_block.name=Блок чёрной стали +tile.bluesteel_block.name=Блок голубой стали + +ttile.adamantium_block.name=Адамантиевый блок +tile.mithril_block.name=Мифриловый блок +tile.ignotumite_block.name=Игнотумитовый блок +tile.mithium_block.name=Мифиевый блок + +tile.ender_block.name=Блок стали Края + +tile.forge.stone.name=Каменный горн +tile.forge.metal.name=Продвинутый горн +tile.bloomery.name=Домница +tile.crucible.stone.name=Каменный тигель +tile.crucible.fireclay.name=Огнеупорный тигель +tile.crucible.auto.name=Продвинутый тигель +tile.crucible.mythic.name=Древний тигель +tile.crucible.master.name=Мастерский древний тигель + +tile.chimney.stone.name=Каменная дымовая труба +tile.chimney.stone.wide.name=Широкая каменная дымовая труба +tile.chimney.stone_extractor.wide.name=Каменная вытяжка +tile.chimney.pipe.name=Дымовая труба +tile.bellows.name=Меха +tile.tanner.name=Ветхий дубильный станок +tile.tannerStrong.name=Дубильный станок +tile.tannerMetal.name=Продвинутый дубильный станок +tile.bombBench.name=Стол изготовления бомб +tile.crossbowBench.name=Стол изготовления арбалетов +tile.bombPress.name=Бомбовый пресс +tile.carpenterBench.name=Плотницкий верстак +tile.researchStation.name=Исследовательская станция +tile.quern.name=Ручная мельница +tile.anvilStone.name=Каменная наковальня +tile.anvilBronze.name=Бронзовая наковальня +tile.anvilIron.name=Железная наковальня +tile.anvilSteel.name=Стальная наковальня +tile.anvilBlackSteel.name=Наковальня из чёрной стали +tile.anvilRedSteel.name=Наковальня из красной стали +tile.anvilBlueSteel.name=Наковальня из голубой стали +tile.furnace_stone.name=Печь +tile.furnace_heater.name=Топка +tile.blastfurnchamber.name=Камера доменной печи +tile.blastfurnheater.name=Топка доменной печи + +tile.firepit.name=Костёр +tile.food_roast_basic.name=Плита +tile.food_oven_basic.name=Каменная печь + +tile.rack_wood.name=%1$s стойка для инструментов +tile.food_box_basic.name=%1$s ящик для провианта +tile.ammo_box_basic.name=%1$s ящик для боеприпасов +tile.crate_basic.name=%1$s ящик +tile.trough_wood.name=%1$s корыто +attribute.box.capacity.name=Вместимость: %1$s стаков +attribute.fill.capacity.name=Вместимость: %1$s +attribute.fill=Заполнено x%1$s + +item.bedroll.name=Лежанка +tile.bedroll.name=Лежанка + +tile.framed_end.name=Обрамлённый мифический камень +tile.decorated_end.name=Декоративный мифический камень +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/TABS/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +itemGroup.forgedtool=[MF] Кованые инструменты +itemGroup.forgedweapon=[MF] Кованое оружие +itemGroup.forgedarmour=[MF] Кованая броня +itemGroup.MFGadgets=[MF] Изобретения +itemGroup.MFUtil=[MF] Полезные блоки +itemGroup.MFBows=[MF] Луки +itemGroup.MFMaterials=[MF] Материалы +itemGroup.MFadvancedtool=[MF] Продвинутые инструменты +itemGroup.MFcrafttool=[MF] Инструменты крафта +itemGroup.MFore=[MF] Руды +itemGroup.MFfood=[MF] Еда +itemGroup.MFOld=[MF] Примитивные инструменты +itemGroup.MFdragonforged=[MF] Оружие из драконьей стали +itemGroup.MFornate=[MF] Украшенная амуниция + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/FIRESTARTER/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.dryrocks.name=Сухие камни +item.tinderbox.name=Трутница + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/BANDAGE/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.bandage_crude.name=Грубая перевязка +item.bandage_wool.name=Шерстяная перевязка +item.bandage_tough.name=Отличная перевязка + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/TRAINING/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.training_sword.name=Тренировочный меч +item.training_waraxe.name=Тренировочный боевой топор +item.training_mace.name=Тренировочная булава +item.training_spear.name=Тренировочное копьё + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/LEATHER STUFF/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.hide_helmet.name=Сыромятный шлем +item.hide_chest.name=Сыромятный нагрудник +item.hide_legs.name=Сыромятные поножи +item.hide_boots.name=Сыромятные сапоги + +item.roughleather_helmet.name=Грубый кожаный шлем +item.roughleather_chest.name=Грубый кожаный нагрудник +item.roughleather_legs.name=Грубые кожаные поножи +item.roughleather_boots.name=Грубые кожаные сапоги + +item.strongleather_helmet.name=Укреплённый кожаный шлем +item.strongleather_chest.name=Укреплённый кожаный нагрудник +item.strongleather_legs.name=Укреплённые кожаные поножи +item.strongleather_boots.name=Укреплённые кожаные сапоги + +item.studleather_helmet.name=Клёпаный шлем +item.studleather_chest.name=Клёпаный нагрудник +item.studleather_legs.name=Клёпаные поножи +item.studleather_boots.name=Клёпаные сапоги + +item.scaleleather_helmet.name=Чешуйчатый шлем +item.scaleleather_chest.name=Чешуйчатый нагрудник +item.scaleleather_legs.name=Чешуйчатые поножи +item.scaleleather_boots.name=Чешуйчатые сапоги + +item.padded_helmet.name=Подбитый шлем +item.padded_chest.name=Подбитый нагрудник +item.padded_legs.name=Подбитые поножи +item.padded_boots.name=Подбитые сапоги + +item.leatherapron.name=Фартук кузнеца + + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/WOOD STUFF/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.malletWood.name=Деревянная киянка +item.spoonWood.name=Деревянная ложка +item.paint_brush.name=Кисть + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/STONE STUFF/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.stone_pick.name=Каменная кирка +item.stone_axe.name=Каменный топор +item.stone_hoe.name=Каменная мотыга +item.stone_spade.name=Каменная лопата + +item.stone_knife.name=Каменный нож +item.stone_hammer.name=Каменный молот +item.stone_tongs.name=Каменные клещи +item.bone_needle.name=Костяная игла + +item.stone_sword.name=Каменный меч +item.stone_waraxe.name=Каменный боевой топор +item.stone_mace.name=Каменная булава +item.stone_spear.name=Каменное копьё + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/STANDARD/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +languagecfg.tooltiptier=true +//You can move the main tier to the tooltip if this is true, make sure to remove "%1$s " instnaces if you do this + +item.standard_pick.name=Кирка +item.standard_axe.name=Топор +item.standard_spade.name=Лопата +item.standard_hoe.name=Мотыга + +item.standard_shears.name=Ножницы +item.standard_knife.name=Нож +item.standard_needle.name=Игла +item.standard_hammer.name=Молот +item.standard_hvyhammer.name=Тяжёлый молот +item.standard_tongs.name=Клещи +item.standard_saw.name=Пила +item.standard_spanner.name=Гаечный ключ + + +item.standard_dagger.name=Кинжал +item.standard_sword.name=Меч +item.standard_mace.name=Булава +item.standard_waraxe.name=Боевой топор +item.standard_spear.name=Копьё + +item.standard_katana.name=Катана +item.standard_greatsword.name=Двуручный меч +item.standard_warhammer.name=Боевой молот +item.standard_battleaxe.name=Секира +item.standard_halbeard.name=Алебарда +item.standard_lance.name=Рыцарское копьё + +item.standard_handpick.name=Малая кирка +item.standard_hvypick.name=Тяжёлая кирка +item.standard_trow.name=Малая лопата +item.standard_hvyshovel.name=Тяжёлая лопата +item.standard_scythe.name=Коса +item.standard_mattock.name=Киркомотыга +item.standard_lumber.name=Топор дровосека + +item.standard_scale_helmet.name=Чешуйчатый шлем +item.standard_scale_chest.name=Чешуйчатый нагрудник +item.standard_scale_legs.name=Чешуйчатые поножи +item.standard_scale_boots.name=Чешуйчатые сапоги + +item.standard_chain_helmet.name=Кольчужный шлем +item.standard_chain_chest.name=Кольчужный нагрудник +item.standard_chain_legs.name=Кольчужные поножи +item.standard_chain_boots.name=Кольчужные сапоги + +item.standard_splint_helmet.name=Шинный шлем +item.standard_splint_chest.name=Шинный нагрудник +item.standard_splint_legs.name=Шинные поножи +item.standard_splint_boots.name=Шинные сапоги + +item.standard_plate_helmet.name=Латный шлем +item.standard_plate_chest.name=Латная кираса +item.standard_plate_legs.name=Латные поножи +item.standard_plate_boots.name=Латные сапоги + +item.standard_bow.name=Лук +item.standard_arrow.name=Стрела +item.standard_bolt.name=Болт + +item.standard_mallet.name=Киянка +item.standard_spoon.name=Ложка + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/DRAGONFORGE/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.dragonforged_pick.name=Драконокованая кирка +item.dragonforged_axe.name=Драконокованый топор +item.dragonforged_spade.name=Драконокованая лопата +item.dragonforged_hoe.name=Драконокованая мотыга + +item.dragonforged_shears.name=Драконокованые ножницы +item.dragonforged_knife.name=Драконокованый нож +item.dragonforged_needle.name=Драконокованая игла +item.dragonforged_hammer.name=Драконокованый молот +item.dragonforged_hvyhammer.name=Тяжёлый драконокованый молот +item.dragonforged_tongs.name=Драконокованые клещи +item.dragonforged_saw.name=Драконокованая пила +item.dragonforged_spanner.name=Драконокованый гаечный ключ + + +item.dragonforged_dagger.name=Драконокованый кинжал +item.dragonforged_sword.name=Драконокованый меч +item.dragonforged_mace.name=Драконокованая булава +item.dragonforged_waraxe.name=Драконокованый боевой топор +item.dragonforged_spear.name=Драконокованое копьё + +item.dragonforged_katana.name=Драконокованая катана +item.dragonforged_greatsword.name=Драконокованый двуручный меч +item.dragonforged_warhammer.name=Драконокованый боевой молот +item.dragonforged_battleaxe.name=Драконокованая секира +item.dragonforged_halbeard.name=Драконокованая алебарда +item.dragonforged_lance.name=Драконокованое рыцарское копьё + +item.dragonforged_handpick.name=Драконокованая малая кирка +item.dragonforged_hvypick.name=Тяжёлая драконокованая кирка +item.dragonforged_trow.name=Лёгкая драконокованая лопата +item.dragonforged_hvyshovel.name=Тяжёлая драконокованая лопата +item.dragonforged_scythe.name=Драконокованая коса +item.dragonforged_mattock.name=Драконокованая киркомотыга +item.dragonforged_lumber.name=Драконокованый топор дровосека + +item.dragonforged_scale_helmet.name=Драконокованый чешуйчатый шлем +item.dragonforged_scale_chest.name=Драконокованый чешуйчатый нагрудник +item.dragonforged_scale_legs.name=Драконокованые чешуйчатые поножи +item.dragonforged_scale_boots.name=Драконокованые чешуйчатые сапоги + +item.dragonforged_chain_helmet.name=Драконокованый кольчужный шлем +item.dragonforged_chain_chest.name=Драконокованый кольчужный нагрудник +item.dragonforged_chain_legs.name=Драконокованые кольчужные поножи +item.dragonforged_chain_boots.name=Драконокованые кольчужные сапоги + +item.dragonforged_splint_helmet.name=Драконокованый шинный шлем +item.dragonforged_splint_chest.name=Драконокованый шинный нагрудник +item.dragonforged_splint_legs.name=Драконокованые шинные поножи +item.dragonforged_splint_boots.name=Драконокованые шинные сапоги + +item.dragonforged_plate_helmet.name=Драконокованый бацинет +item.dragonforged_plate_chest.name=Драконокованый кираса +item.dragonforged_plate_legs.name=Драконокованые ножные латы +item.dragonforged_plate_boots.name=Драконокованые латные сапоги + +item.dragonforged_bow.name=Драконокованый лук + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/ORNATE/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.ornate_pick.name=Украшенная кирка +item.ornate_axe.name=Украшенный топор +item.ornate_spade.name=Украшенная лопата +item.ornate_hoe.name=Украшенная мотыга + +item.ornate_shears.name=Украшенные ножницы +item.ornate_knife.name=Украшенный нож +item.ornate_needle.name=Украшенная игла +item.ornate_hammer.name=Украшенный молот +item.ornate_hvyhammer.name=Тяжёлый украшенный молот +item.ornate_tongs.name=Украшенные клещи +item.ornate_saw.name=Украшенная пила +item.ornate_spanner.name=Украшенный гаечный ключ + +item.ornate_dagger.name=Украшенный кинжал +item.ornate_sword.name=Украшенный меч +item.ornate_mace.name=Украшенная булава +item.ornate_waraxe.name=Украшенный боевой топор +item.ornate_spear.name=Украшенное копьё + +item.ornate_katana.name=Украшенная катана +item.ornate_greatsword.name=Украшенный двуручный меч +item.ornate_warhammer.name=Украшенный боевой молот +item.ornate_battleaxe.name=Украшенная секира +item.ornate_halbeard.name=Украшенная алебарда +item.ornate_lance.name=Украшенное рыцарское копьё + +item.ornate_handpick.name=Украшенная малая кирка +item.ornate_hvypick.name=Украшенная тяжёлая кирка +item.ornate_trow.name=Украшенная лопата +item.ornate_hvyshovel.name=Украшенная тяжёлая лопата +item.ornate_scythe.name=Украшенная коса +item.ornate_mattock.name=Украшенная киркомотыга +item.ornate_lumber.name=Украшенный топор дровосека + +item.ornate_scale_helmet.name=Украшенный чешуйчатый шлем +item.ornate_scale_chest.name=Украшенный чешуйчатый нагрудник +item.ornate_scale_legs.name=Украшенные чешуйчатые поножи +item.ornate_scale_boots.name=Украшенные чешуйчатые сапоги + +item.ornate_chain_helmet.name=Украшенный кольчужный шлем +item.ornate_chain_chest.name=Украшенный кольчужный нагрудник +item.ornate_chain_legs.name=Украшенные кольчужные поножи +item.ornate_chain_boots.name=Украшенные кольчужные сапоги + +item.ornate_splint_helmet.name=Украшенный шинный шлем +item.ornate_splint_chest.name=Украшенный шинный нагрудник +item.ornate_splint_legs.name=Украшенные шинные поножи +item.ornate_splint_boots.name=Украшенные шинные сапоги + +#Нет перевода слова Armet, оставил шлем. +item.ornate_plate_helmet.name=Украшенный латный шлем +item.ornate_plate_chest.name=Украшенная кираса +item.ornate_plate_legs.name=Украшенные ножные латы +item.ornate_plate_boots.name=Украшенные латные сапоги + +item.ornate_bow.name=Украшенный лук + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/ARTEFACT/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +stat.artefact.name=Артефакт +item.ancient_jewel.name=Древнее сокровище +item.trilogy_jewel.name=Тройное сокровище + +item.schem_gears.name=Чертежи механизмов механической брони +item.schem_forge.name=Чертежи продвинутого горна +item.schem_cogwork.name=Чертежи корпуса механической брони +item.schem_bomb.name=Чертежи гномьей бомбы +item.schem_crossbow.name=Чертежи гномьего арбалета +item.schem_alloy.name=Чертежи композитного металла +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/FOOD/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.berries.name=Ягоды +item.berriesJuicy.name=Сочные ягоды +item.generic_meat_uncooked.name=Сырое обычное мясо +item.generic_meat_cooked.name=Приготовленное обычное мясо +item.generic_meat_strip_uncooked.name=Сырые мясные полоски +item.generic_meat_strip_cooked.name=Приготовленные мясные полоски +item.generic_meat_chunk_uncooked.name=Сырые мясные кусочки +item.generic_meat_chunk_cooked.name=Приготовленные мясные кусочки +item.generic_meat_mince_uncooked.name=Сырой фарш +item.generic_meat_mince_cooked.name=Приготовленный фарш +item.burnt_food.name=Сгоревшая еда +item.burnt_pot.name=Сгоревшая еда +item.burnt_cake.name=Сгоревший торт +item.burnt_pie.name=Сгоревший пирог + +tile.berries.name=Ягодный куст +item.breadcrumbs.name=Хлебные крошки +item.breadroll.name=Рулет +item.breadslice.name=Кусочек хлеба +item.horse_raw.name=Сырая конина +item.horse_cooked.name=Приготовленная конина +item.wolf_raw.name=Сырая волчатина +item.wolf_cooked.name=Приготовленная волчатина +item.mutton_raw.name=Сырая баранина +item.mutton_cooked.name=Приготовленная баранина +item.spider_raw.name=Сырое паучье мясо +item.spider_cooked.name=Приготовленное паучье мясо + +item.bowl_water_salt.name=Солёная вода +item.salt.name=Соль +item.cake_tin.name=Форма для торта +item.pie_tin.name=Форма для пирога +item.pie_tray_uncooked.name=Необожжённая форма для пирога +item.flour.name=Мука +item.sugarpot.name=Сахарница +item.bread_uncooked.name=Хлебная заготовка +item.guts.name=Кишки + +item.raw_bread.name=Сырой хлеба +item.dough.name=Тесто +item.pastry.name=Тесто для торта +item.stew.name=Тушёнка +item.oats.name=Овёс + +item.curds.name=Творог +item.cheese_pot.name=Горшок сыра + +item.jerky.name=Вяленое мясо +item.cheese_roll.name=Сырный рулет +item.sweetroll.name=Сладкий рулет +item.sandwitch.name=Бутерброд + +tile.pie_meat.name=Мясной пирог +tile.pie_apple.name=Яблочный пирог +tile.pie_berry.name=Ягодный пирог +tile.pie_shepards.name=Пастуший пирог + +item.meatpie_slice.name=Кусок мясного пирога +item.pieslice_apple.name=Кусок яблочного пирога +item.pieslice_berry.name=Кусок ягодного пирога +item.pieslice_shepards.name=Кусок пастушьего пирога + +item.chicken_roast.name=Жаркое с курицей +item.pork_roast.name=Жаркое со свининой +item.beef_roast.name=Жаркое с говядиной +item.mutton_roast.name=Жаркое с бараниной + +tile.cake_vanilla.name=Торт +tile.cake_carrot.name=Морковный торт +tile.cake_chocolate.name=Шоколадный торт +tile.cake_bf.name=Торт "Чернолесье" + +item.cake_slice.name=Кусок торта +item.carrotcake_slice.name=Кусок морковного торта +item.choccake_slice.name=Кусок шоколадного торта +item.bfcake_slice.name=Кусок "Чернолесья" + +item.coca_powder.name=Какао-порошок +item.chocolate.name=Шоколадный +item.chocchips.name=Шоколадные кусочки +item.eclair.name=Эклер +item.eclair_raw.name=Эклерное тесто +item.eclair_uniced.name=Свежеиспечённый эклер +item.eclair_empty.name=Пустой эклер +item.saussage_cooked.name=Приготовленная сосиска +item.saussage_raw.name=Сырая сосиска +tile.cheese.name=Сырная голова +item.cheese_slice.name=Кусок сыра +item.sushi.name=Суши +item.curry.name=Карри +item.pizza_basic.name=Пицца +item.sweetroll_raw.name=Тесто для сладкого рулета +item.sweetroll_uniced.name=Свежеиспечённый сладкий рулет +item.icing.name=Сахарная глазурь +item.custard.name=Заварной крем + +item.cake_raw.name=Жидкое тесто для торта +item.cake_simple_raw.name=Жидкое тесто простого торта +item.cake_carrot_raw.name=Жидкое тесто морковного торта +item.cake_choc_raw.name=Жидкое тесто шоколадного торта +item.cake_bf_raw.name=Жидкое тесто торта "Чернолесье" + +item.cake_uniced.name=Свежеиспечённый торт +item.cake_simple_uniced.name=Свежеиспечённый простой торт +item.cake_carrot_uniced.name=Свежеиспечённый морковный торт +item.cake_choc_uniced.name=Свежеиспечённый шоколадный торт +item.cake_bf_uniced.name=Свежеиспечённое "Чернолесье" + +item.pie_meat_uncooked.name=Тесто мясного пирога +item.pie_apple_uncooked.name=Тесто яблочного пирога +item.pie_berry_uncooked.name=Тесто ягодного пирога +item.pie_shepard_uncooked.name=Тесто пастушьего пирога +item.pie_pumpkin_uncooked.name=Тесто тыквенного пирога + +item.pie_meat_cooked.name=Приготовленный мясной пирог +item.pie_apple_cooked.name=Приготовленный яблочный пирог +item.pie_berry_cooked.name=Приготовленный ягодный пирог +item.pie_shepard_cooked.name=Приготовленный пастуший пирог +item.pie_pumpkin_cooked.name=Приготовленный тыквенный пирог + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/FOOD STATS/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +food.stat.list.name=При поедании: +food.stat.hunger.name=+%1$s сытости +food.stat.staminaPlus.name=Восстанавливает %1$s выносливости +food.stat.staminabuffHours.name=Бонус %1$s выносливости на %2$s ч. +food.stat.staminabuffMinutes.name=Бонус %1$s выносливости на %2$s мин. +food.stat.staminabuffSeconds.name=Бонус %1$s выносливости на %2$s сек. +food.stat.saturationMinutes.name=Насыщение на %1$s мин. +food.stat.saturationSeconds.name=Насыщение на %1$s сек. +food.stat.saturation.name=Насыщение: %1$s pts +food.stat.staminabuffRegenMinutes.name=Восстанавливает %1$s выносливости/сек на %2$s мин. +food.stat.staminabuffRegenSeconds.name=Восстанавливает %1$s выносливости/сек на %2$s сек. +food.stat.cure.poison=Лечит отравление + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/CONSTRUCTION/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.hinge.name=Петля +item.commodity_plank_cut.name=Распиленный %1$s брусок +item.commodity_plank_pane.name=%1$s брусчатая панель + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/RPG/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +rpg.levelup=Ваш навык %1$s повысился до %2$s уровня. +rpg.required=Требует "%2$s" ур. %1$s +rpg.skillmod=Модификатор умения: + + +skill.lowskill=Ваш навык недостаточно высок! +skill.value=Уровень %1$s + +skill.list.basic=Основные навыки +skill.list.craft=Навыки крафта +skill.list.combat=Боевые навыки + +skill.artisanry.name=Кузнечное дело +skill.construction.name=Строительное дело +skill.provisioning.name=Ремесло снабжения +skill.engineering.name=Инженерное дело +skill.combat.name=Мастерство + +item.skillbook_artisanry.name=Искусство кузнечного дела +item.skillbook_artisanry.desc=+%1$s к кузнечному делу +item.skillbook_construction.name=Секреты строительства +item.skillbook_construction.desc=+%1$s к строительному делу +item.skillbook_provisioning.name=Накорми деревню +item.skillbook_provisioning.desc=+%1$s к ремеслу снабжения +item.skillbook_engineering.name=Продвинутые механизмы +item.skillbook_engineering.desc=+%1$s к инженерному делу +item.skillbook_combat.name=Смешанные боевые тактики +item.skillbook_combat.desc=+%1$s к мастерству + +item.skillbook_artisanry2.name=Кузнецы спустя века +item.skillbook_artisanry2.desc=Максимальный уровень кузнечного дела +item.skillbook_construction2.name=Секреты инженера +item.skillbook_construction2.desc=Максимальный уровень строительного дела +item.skillbook_provisioning2.name=История Торговли +item.skillbook_provisioning2.desc=Максимальный уровень ремесла снабжения +item.skillbook_engineering2.name=Лексикон инженера +item.skillbook_engineering2.desc=Максимальный уровень инженерного дела +item.skillbook_combat2.name=Повесть о великой войне +item.skillbook_combat2.desc=Максимальный уровень мастерства +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/KNOWLEDGE INFORMATION/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +method.workbench=Базовый верстак +method.furnace=Выплавка +method.bloomery=Домница +method.blastfurnace=Доменная печь +method.anvil=Наковальня +method.carpenter=Плотницкий верстак +method.crucible=Тигель +method.crucibleT2=Огнеупорный тигель +method.crucibleT3=Мифический тигель +method.crucibleT4=Мастерский тигель +method.quern=Ручная мельница +info.hasKnowledge=Можно изучить + +gui.purchase=Покупка +knowledge.guiSubtitle=Это GUI +knowledge.basicstructure=Базовая структура +knowledge.example=Пример +knowledge.rightclickspanner=ПКМ гаечным ключом +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/KNOWLEDGE TEXT/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +knowledge.title= +knowledge.title.desc= +knowledge.title.1= + +knowledge.minotaurs=Минотавр +knowledge.minotaurs.desc=Ужасные монстры + +knowledge.minotaurs.1=Немногие существа могут тягаться с минотаврами силой и яростью. Легенда гласит, что эти существа были людьми и коровами, пока не стали тем, чем являются сейчас. Минотавры всеядные и достаточно вспыльчивые существа.^Минотавры чрезвычайно сильны и быстры - они способны мгновенно убить зазевавшуюся жертву, так же они удивительно быстро восстанавливаются после ранений. Минотавры не обладают высоким интеллектом, однако, некоторые из них собираются в группы и живут согласно строгой иерархии. +knowledge.minotaurs.2=$hLesser Minotaur-$r^It may be common sight to see lesser minotaurs in the wild proving a threat to those unfortunate enough to come close.^These creatures are little more than beasts yet provide a misconception of actual minotaur behavior. Lesser minotaurs either have no home or are set out to scavenge for their greater counterparts. +knowledge.minotaurs.3=$hGreater Minotaur-$r^Greater minotaurs are found dwelling in dwarven complexes underground providing a challenge to explorers.^The minotaurs that are housed within these ruins are more organised and deadly. Standard minotaur warriors are brutal and armed while the elite and warlords that can be found deeper within ruins are powerful foes. It shall be made clear that ruins should be explored only by the prepared. One warrior may prove a challenge, but a group? few have survived. +knowledge.minotaurs.4=$hSpecies-$r^There are three known species of minotaur found in both wild and ruin. There is no difference to the behavior or living patterns of minotaurs of different species but physical properties do vary. +knowledge.minotaurs.combat=$hCombat-$r^The best advice that could be given to fighting off a minotaur would be range. Don't let them get close enough to hit you, even the strongest armour buckles under the force of their fury. Many minotaurs are heavily armoured as well but both hide and plate are vulnerable to piercing attacks a spear would be capable of exploiting both these weaknesses. Spears, explosives, distance and heavy armour give the best chances of survival. + +knowledge.mob.minotaur.name=Коричневый минотавр + +knowledge.minotaur.1=В основном, в нашем мире обитает именно этот вид минотавров. Они чрезвычайно сильны, быстры, выносливы. Обычным минотаврам недостаёт интеллекта, и они бесцельно бродят по миру. +knowledge.minotaur.1=Brown-fur minotaurs are the more common species in the overworld. They are found to have excessive strength and prove to be a powerful foe. Standard minotaurs have no natural armour but are still hard to kill. + +knowledge.mob.minotaur_frost.name=Снежный минотавр + +knowledge.minotaur_frost.1=Обитает в холодных регионах. Эти минотавры считаются более опасными, чем коричневые. Минотавра-альбиноса очень трудно заметить в снежной местности, что создаёт проблему для всех путешественников. +knowledge.minotaur_frost.1=Found in colder regions, these Minotaurs appear to have thicker hide than the brown minotaurs, resulting in natural armour. The Albino minotaur is difficult to see in the snow and can unleash a devistating rage on the unsuspecting traveller. + +knowledge.mob.minotaur_dread.name=Яростный минотавр + +knowledge.minotaur_dread.1=Доподлинно неизвестно, кто начал их так называть. Жители Нижнего Мира вооружённые железным оружием, яростно патрулирующие пустоши. Удивительно, но когда их несколько, они действуют сообща. +knowledge.minotaur_dread.1=Not as much is known about what some call the Dread Minotaur. Denizens of the nether, dark-grey or black fur, powerfully thick skin, and immunity to fire. This species are far hardier than their overworld cousins. + +knowledge.dragons=Драконы +knowledge.dragons.desc=Смерть с небес + +knowledge.dragons.1=Драконы гордые, но разрушительные рептилии, высматривающие свою добычу сверху. В мире есть достаточно много видов драконов, сильно различающися своими способностями. Поглядывайте в небо и будьте внимательны в своих путешествиях во избежание фатальных столкновений.^Каждый дракон, несомненно, опасен способностью изрыгать смертоносные вещества. + +knowledge.dragons.2=Чем старше дракон, тем он опаснее. Кожа этих рептилий неимоверно прочная, поэтому многое оружие может быть бесполезно в борьбе с ними. Оружие из драконьей стали наоборот, очень даже эффективно против драконов.^ Драконы охотятся за сердцами павших сородичей, которые могут быть использованы специально обученными кузнецами. Сердца молодых драконов не подходят для создания чего-либо, поэтому следует охотиться на взрослых особей, если Вы встали на путь драконоборца. + +knowledge.mob.red_dragon.name=Красный дракон +knowledge.red_dragon.1=Самый распространённый вид, имеет способность изрыгать пламя. Не один человек пал жертвой таких драконов, и не одна деревня исчезла в их огне. + +knowledge.mob.blue_dragon.name=Ледяной дракон +knowledge.blue_dragon.1=Обитающие в очень холодных регионах, эти драконы научились изрыгать ледяные ветры, замораживающие врагов. Ледяные драконы не несут особых разрушений как красные драконы, но считаются более опасными. + +knowledge.mob.green_dragon.name=Зелёный дракон +knowledge.green_dragon.1=Зелёные драконы так же известны как "Ядовитые драконы". Они обитают в наиболее влажных местностях типа болот, озёр и морей. Способны изрыгать кислоту, разъедающую броню и отравляющую жертву. + +knowledge.mob.ash_dragon.name=Ash Dragon +knowledge.ash_dragon.1=Ash dragons are found in the hot and dry such as deserts and can be easily identified by their two legs (rather than four). Ash dragons are blind, and require the use of sound and smell to track their target. keep your distance and remain quiet to avoid attack. + +knowledge.dragons.combat=$hCombat-$r^Dragons may be fast and have the sky advantage, but they have a few weaknesses to exploit. Firstly is the ability to leave and return the battlefield, you are best to pay attention and avoid losing sight of your foe. As the dragon swoops, make your strike. A proerly lined ranged attack will grant an advantage when it takes off again. As well as that: specialised dragonforged items may be crafted to give an edge to the battle. + +knowledge.gettingStarted=Начало развития +knowledge.gettingStarted.desc=С нуля + +knowledge.gettingStarted.1=Отсюда и пойдёт Ваше изучение мода MineFantasy. Для начала, рекомендуется создать хотя бы простенькое убежище, а так же запастись деревом, углём, медью, шкурами и камнем. Для жизни в этом мире придётся научиться трём действиям. +knowledge.gettingStarted.2=Изготовление блоков требует особых взаимодействий. Сначала выстройте рецепт так, как это требуется (для наковален придётся нагревать некоторые ресурсы). Затем выберите соответствующий инструмент с нужным уровнем(такой как ваши руки, ножи, молоты и т.д.). Затем нужно щёлкнуть по блоку этим инструментом, удерживая нажатой клавишу как минимум секунду до готовности продукта Вашей деятельности. + +knowledge.gettingStarted.hcc=$hКаменный век-$r^ Ванильные инструменты выключены, инструменты делаются из камня по специальным рецептам, а также куются. Рецепты кованых инструментов находятся в разделе кузнечного дела.^Для получения острых камней необходимо разбить рукой блок камня (не держа в руке никаких предметов) Используйте острый камень в руке чтобы добыть лозу из блоков листвы, а также для получения палок. + +knowledge.gettingStarted.fire=$hКостёр$r^Перед тем, как начать работать, вам потребуется костёр, который обеспечит вас огнём и позволит пожарить немного мяса.^Подкиньте дров (любых пиломатериалов) ПКМ, затем разожгите огонь сухими камнями или трутницей. +knowledge.gettingStarted.food=Для готовки разместите плиту или каменную печь над костром. Размещать еду (в основном, сырое мясо) можно при помощи ПКМ.^Приятного аппетита! + +knowledge.gettingStarted.carpenter=$hСтол плотника$r^ Это базовый стол для создания ваших поделок. Для его использования потребуется множество инструментов, включая ваши голые руки. + +knowledge.gettingStarted.tanning=$hДубление$r^Это способ переработки шкур в кожу. ^Для начала соберите непрочный станок для обработки кожи и каменный нож. Это не самые лучшие инструменты и их стоило бы улучшать в дальнейшем. + +knowledge.gettingStarted.forging=$hКовка$r^Это основной вид крафта. Для начала стоит сделать каменный горн, наковальню и необходимые инструменты. Располагайте наковальню возле воды и горна. Вкладка кузнечного ремесла содержит исчерпывающую информацию по ковке. Убедитесь в наличии базовых инструментов для добычи огня (Сухие камни), и кузнечного фартука! + +knowledge.gettingStarted.forgingbars=Большинство рецептов требует использование чушек, а не слитков. Чушка - это простой компонент, изготавливаемый из металла. Нужно лишь положить слиток на наковальню и немного поработать молотком. Таким же способом вы сможете изготовить слиток из чушки. +knowledge.gettingStarted.flux=Флюс - важный реактив для очистки металлов. В первую очередь он используется для обработки металлов в процессе ковки, так же он потребуется для некоторых сплавов. Так же он пригодится при крафте кусков и пластин металлов, для некоторых инструментов и брони.^Лучший источник флюса - известняк. Старайтесь запасаться им! +knowledge.gettingStarted.3=Для изготовления инструментов понадобятся кожаные полосы. Для этого изготовьте медные ножницы. +knowledge.gettingStarted.4=Благодаря им, Вы можете разрезать кожу на полосы на плотницком верстаке или прямо на дубильном станке. + +knowledge.gettingStarted.5=Теперь у вас есть доступ ко всему необходимому, чтобы наконец улучшить свой каменный молот. + +knowledge.gettingStarted.6=С установленным горном можно выковать медные инструменты. Проверьте секцию кованых инструментов для просмотра альтернатив медному инструментарию. + +knowledge.gettingStarted.upgrade=$hUpgrading-$r^ Книга и стол исследований помогут вам постичь новые рецепты и умения, но перед этим нужно создать стол исследований. + +knowledge.gettingStarted.7=Этот стол позволяет превратить свитки исследований в завершённые исследования. Однако для этого Вам надо где-то достать свиток. ^Откройте свою книгу - в ней находится большое количество доступных исследований, подсвеченных зелёным цветом. Попробуйте к примеру технологию изготовления лёгкой брони на вкладке кузнечного ремесла. + + +knowledge.gettingStarted.10=Во множестве ремёсел вам придётся столкнуться с порошками, которые вы будете делать при помощи ручной мельницы. + +knowledge.gettingStarted.11=Попробуйте работать с бронзой, тигли, как Вы видите, уже доступны Вам. Для этого Вам необходим 5 уровень кузнечного дела. ^Как только вы изучили основы работы с бронзой, улучшите свои инструменты и приготовьтесь к последующему прогрессу! + +knowledge.gettingStarted.12=$hРазборка$r^Вы можете создать верстак для разборки предметов.^С его помощью можно разобрать большинство предметов (Vanilla и MineFantasy), но с некоторыми потерями. +knowledge.gettingStarted.13=Для использования просто бросьте предмет на разборочный верстак и нажмите ПКМ по нему. + +knowledge.dust=Мельница +knowledge.dust.desc=Изготовление порошков +knowledge.dust.1=Вы можете держать в руках сыпучие вещества, но как предотвратить их просыпание? Глиняные горшки подойдут для хранения порошков, большинство из которых изготавливается с помощью ручной мельницы, в то время как некоторые рецепты могут потребовать иных орудий. Например: +knowledge.dust.quern=Как использовать мельницу: всё что Вам нужно, это поместить горшочек в середину, подходящий ресурс сверху, и нажимать ЛКМ-ПКМ по мельнице. +knowledge.dust.icing=Некоторые рецепты для еды требуют ложки, а не пестика. + +knowledge.research=Книга исследований +knowledge.research.desc=Следим за продвижением + +knowledge.research.1=В этой книге содержится большинство знаний, начиная с кулинарных рецептов, и заканчивая сложными типами брони. Исследование есть способ найти нечто скрытое в мире и использовать в своих работах. Большинство того ,что Вы могли бы сделать, должно быть изучено, и при надлежащем уровне ремесла секрет будет раскрыт.^Для начала, стоит сделать исследовательскую станцию. Ваш навык и предметы исследований откроют Вам новые знания. + +//Table recipe + +knowledge.research.2=При наличии стола исследований, у Вас появится возможность изучать Mine Fantasy раздел за разделом. С версией 2.8 поменялась система изучений с привычных свитков на изучение предметов. Чтобы изучить что-то, положите в стол предмет с пометкой "Можно изучить", и нажимайте ЛКМ-ПКМ. Помните - для того, чтобы изучить что-то, возможно, нужен более высокий уровень определённого ремесла. + +knowledge.carpenter=Стол плотника +knowledge.carpenter.desc=Простой крафт +knowledge.carpenter.1=В основном тут происходит крафт, связанный с деревом. Для крафта на этом столе используется множество различных инструментов. Для его использования сложите рецепт и медленно кликайте по столу нужным инструментом. + +knowledge.salvage=Верстак для разборки предметов +knowledge.salvage.desc=Всегда перерабатывайте! +knowledge.salvage.1=Если у вас есть ненужные вещи, которые вы не используете, да и выбросить жалко, Вы можете разобрать их на составные части. ^Вы можете разобрать только ванильные предметы и предметы из MF. +knowledge.salvage.2=Для разбора просто бросьте предмет наверх столика и нажмите ПКМ по нему. Помните, что есть шанс порчи и пропажи некоторых компонентов! +knowledge.salvage.3=Использование молота или пилы при разборке увеличивает шанс получения составных компонентов. + +knowledge.talisman=Талисманы знаний +knowledge.talisman.desc=Читаем легко! +knowledge.talisman.1=Обычно для получения знаний используется стол исследований, но это занимает много времени и требует много усилий. Талисманы ускоряют этот процесс при помощи клика ПКМ по столу с талисманом в руке. +knowledge.talisman.2=Большие талисманы очень редки, но имеют бесконечное количество использований. + +knowledge.commodities=Повседневные вещи +knowledge.commodities.desc=Разные полезности +knowledge.commodities.1=Это базовые вещи, не являющиеся мусором.^^Иными словами, они часто используются в рецептах, поэтому их стоит хранить в достаточных количествах. + +knowledge.commodities.plank=Бруски - это прекрасные, крупные куски древесины, которые используются практически везде. + +knowledge.commodities.refinedplank=Древесина может быть обработана, что повышает её качество. Она используется для более продвинутых вещей. + +knowledge.commodities.flux=Флюс часто используется для обработки металлов. Стандартный флюс используется в очистных печах, в то время как насыщенный флюс используют для получения продвинутых сплавов. + +knowledge.commodities.hunks=Куски металла используются для небольших вещей. Они делаются из слитков и могут быть превращены обратно в слитки. + +knowledge.commodities.nail=Гвозди - базовая вещь для работы с деревом. Для их создания необязательно изучать технологию изготовления железных вещей. + +knowledge.commodities.rivet=Заклёпки сходны с гвоздями, но применяются в работе с металлом. + +knowledge.commodities.leatherstrip=Полоски кожи используются при изготовлении инструментов. + +knowledge.commodities.thread=Волокно используется в швейных рецептах и может быть превращено в нить. + +knowledge.commodities.bucket=Вёдра делаются из металла. Чем выше уровень металла, тем больше вёдер. + +knowledge.plants=Фитоценоз +knowledge.plants.desc=Органические ресурсы +knowledge.plants.1=Бросьте взгляд на поверхность! Здесь, в растениях, скрыто множество полезных ресурсов!^Здесь вы можете найти список растений, которые не дадут вам погибнуть от голода и обеспечат полезными ресурсами. +knowledge.plants.2=Деревья дают вам различные виды древесины, причём каждый из них лучше для определённых целей. Здесь приведён список деревьев, которые вы встретите в мире. +knowledge.yew.1=Тис очень распространён в лесах, чаще всего вы встретите одиночные деревья. Свойства тиса лучше, чем у любого другого дерева, но ещё из него получаются превосходные луки. + +knowledge.ironbark.1=Этот вид эвкалипта - узнаваемое дерево, которое редко можно встретить в лесах, его грубая серая кора с оранжеватой древесиной сильно выделяется. Его древесина достаточно прочна и подходит для создания крепких предметов. + +knowledge.ebony.1=Эбеновое дерево - огромное и редкое. Они встречаются в умеренном климате и дают крепчайшую древесину, узнать их можно по размеру и специфическому цвету коры. + +knowledge.berry=Ягоды +knowledge.berry.desc=Здоровый перекус +knowledge.berry.1=Ягоды растут во всём мире, но только при условии наличия подходящих влажности и температуры. Чаще всего вы можете найти их в лесах.^Сочные (фиолетовые) ягоды менее распространены и ядовиты. + +knowledge.ores=Руды и минералы +knowledge.ores.desc=Полезные ресурсы +knowledge.ores.1=Есть некое количество генерируемых руд. Все можно так или иначе переплавить в слитки. +knowledge.ores.copper=Медная руда встречается между уровнями 48-96. Её можно легко переплавить в слитки и перековать их в инструменты.^Также медь используется для получения бронзы. +knowledge.ores.tin=Олово встречается в два раза реже меди и в том же ареале высот.^Переплавляется в слитки для дальнейшего получения бронзы. +knowledge.ores.silver=Серебро находится в том же ареале высот, что и золото. Вначале оно не очень полезно, но впоследствии оно может стать очень нужным материалом. +knowledge.ores.wolframite=Вольфрамит - редкий металл, используемый для высокотехнологичных инженерных изысканий. Может быть найден в слоях <16 Y, в одиночных жилах. +knowledge.ores.mythic=Мало кто знает о "мифиевой руде", что находится в слоях коренной породы. Эта руда издаёт странные звуки, но неизвестно по какой причине. + +knowledge.ores.2=Минералы также генерируются в мире, но в отличие от руд они не могут быть переплавлены в слитки. +knowledge.minerals.clay=Также как и песок, глина может быть найдена возле земли. Также можно найти глиносодержащие почвы. +knowledge.minerals.kaolinite=Колинит имеет специфическое использование - в смеси с глиной он увеличивает прочность кирпичей. +knowledge.minerals.limestone=Известняк - хороший источник флюса, генерирующийся крупными залежами. +knowledge.minerals.borax=Являющийся относительно редким минералом, боракс превосходный источник обогащённого флюса. +knowledge.minerals.nitre=Селитра часто встречается в пещерах и используется для изготовления взрывчатки. +knowledge.minerals.sulfur=Сера встречается глубого под землёй рядом со скоплениями лавы и используется для изготовления взрывчатки. + +knowledge.chimney=Дым и трубы +knowledge.chimney.desc=Я... задыхаюсь? + +knowledge.chimney.1=Неоспоримым фактом является то, что сжигание топлива производит газ. А ещё то, что дышать им не очень-то и полезно для Ваших лёгких. В любом случае, трубы помогут + +knowledge.chimney.2=убрать дым от вас и направить его высоко в небо! Оставьте его для тех, кто будет погибать от парникового эффекта парой сотен лет позже. + +knowledge.chimney.3=Вытяжные трубы таже могут быть использованы для непрямого поглощения газа. ^Это значит, что они смогут отводить дым в пределах одного блока над его источником. + +knowledge.chimney.pipe=Дымовые трубы могут транспортировать газ по всей системе. Труба должна быть присоединена к дымоходу, иначе она вытягивать дым не будет. + +knowledge.chimney.pipe.2=Лучше всего ставить трубы поверх устройства(пр. домница), чтобы ремесленнику они не мешали в работе. + +knowledge.tanning=Выделка шкур +knowledge.tanning.desc=И мёртвые животные могут послужить + +knowledge.tanning.1=Кожа является очень ценным ресурсом, потому что она нужна практически для всего. ^Выделка кожи - это простой метод очистки сырой шкуры до состояния, в котором она становится пригодной для использования.^ Для этого понадобятся дубильный станок и нож. + +knowledge.tanning.2=Для выделки кожи её необходимо сначала очистить. Кликните со шкурой в руках ПКМ по воде или же соедените её с флюсом в сетке крафта. После очистки поместите шкуру на дубильный станок и обработайте её ножом. + +knowledge.stamina=Механика выносливости +knowledge.stamina.desc=Держи себя в форме! + +knowledge.stamina.1=Не так уж просто бегать целый день или махать киркой в шахте, и механика выносливости проследит за этим.^Выносливость отображается зелёной шкалой внизу экрана и уменьшается при определённых действиях. Восстанавливается она сама собой, но скорость её восстановления зависит от экипированных вещей, а также от еды из мода. + +knowledge.combat=Боевая механика +knowledge.combat.desc=Чуть больше возможностей убить ближнего своего + +knowledge.combat.1=Вы могли заметить, что простое махание мечом перестало быть эффективным. Сражения теперь были модифицированы и используют более сложные техники боя.^Между прочим, эти техники могут использовать не только люди, но и вооружённые монстры, а значит, что зомби с мечом теперь куда опаснее. + +knowledge.parry.info=$hПарирование и блокирование$r^Удерживая ПКМ с большей частью оружия в руках, вы блокируете. Однако теперь блок стал куда эффективнее. Когда вы блокируете прямую атаку, Вы снижаете урон от атак, и иногда вовсе можете свести его к нулю. Клинковые виды оружия лучше всего справляются с этой задачей. ^Рекомендуется блокировать удары, а не принимать их открытой грудью, это может спасти Вам жизнь.^ Однако атака после парирования имеет уменьшенный урон. + + +knowledge.advparry.info=$hУмение парирования$r^Если парирование удалось, а Вы держите shift, Вы продвинетесь вперёд, и возможно даже за спину оппонента, что позволит Вам нанести свой удар. Это потребляет выносливость, но может дать Вам шанс перехватить инициативу в бою. Это возможно также и в прыжке. + +knowledge.poweratt.info=$hСиловые атаки$r^Удерживая shift в падении, Вы можете нанести силовую атаку, увеличивающую урон и пробивающую блок, но потребляющую выносливость. Также попытка силового удара может быть прервана получением урона. + +knowledge.dodge.info=$hУклонение$r^В некоторых случаях, лучше избежать удар противника. Если Вы маневрируете из стороны в сторону или отступаете в защите, Вы выполните быстрый отскок. Это умение расходует выносливость и невыполнимо в тяжёлой броне. + +knowledge.armour.info=$hВыбор брони$r^Есть три основных типа брони - лёгкая, средняя, тяжёлая. Если Вы хотите быстро передвигаться и маневрировать в бою, используйте лёгкую броню. Если нужна максимальная защита, подойдёт тяжёлая броня. Средняя броня сочетает хорошую защиту и подвижность. + +knowledge.blade.info= +knowledge.fastblade.info= +knowledge.axe.info= +knowledge.blunt.info= +knowledge.polearms.info= + +knowledge.bar=Чушки +knowledge.bar.desc=Стандартизированная форма +knowledge.bar.1=Слитки могут использоваться для грубых поделок и торговли, но они слишком крупные для ковки. Решение - чушки. Они просты в обработке, их легко переплавить, можно поставить производство на поток!.^Чушки могут быть переделаны в слитки таким же способом. + +knowledge.smeltCopper=Работа с медью +knowledge.smeltCopper.desc=Уровень %1$s, обычный материал +knowledge.smeltCopper.1=Это Ваш первый материал на тернистом пути постижения премудростей кузнечного ремесла.^Да, Вы делаете мусор, но зато он Ваш! + +knowledge.smeltBronze=Работа с бронзой +knowledge.smeltBronze.desc=Уровень %1$s, обычный материал +knowledge.smeltBronze.1=Смешивая медь с оловом, Вы получаете бронзу. Этот сплав намного лучше меди. + +knowledge.smeltIron=Работа с железом +knowledge.smeltIron.desc=Уровень %1$s, обычный материал +knowledge.smeltIron.1=Железо очень распространённая руда, что делает её очень полезной. Железные орудия не очень хороши, но лучше бронзовых. +knowledge.smeltIron.2=Выплавка железа в слитки готовые к ковке не такая уж и сложная задача, но определённый уровень ремесла используется для нормальной работы. Вы усвоили пару уроков кузнечного дела, чтобы делать железные инструменты. + +knowledge.smeltPig=Чугун +knowledge.smeltPig.desc=Переработка железа +knowledge.smeltPig.1=Железо имеет много недостатков, но очистная печь позволяет устранить их.^Чугун используется для создания стали. + +knowledge.smeltSteel=Работа со сталью +knowledge.smeltSteel.desc=Уровень %1$s, обычный материал +knowledge.smeltSteel.1=Наконец-то Вы получили очень хороший, но вместе с тем дорогой материал.^Сталь делается путём перековки на наковальне или выплавки в огнеупорном тигле. Она - Ваш лучший друг!. + +knowledge.smeltEncrusted=Инкрустирование +knowledge.smeltEncrusted.desc=Уровень %1$s, экзотический материал +knowledge.smeltEncrusted.1=Почему бы не использовать эффективнось стали совместно с крепостью алмаза? Инкрустированные инструменты куда лучше стальных.^А теперь покажите миру свои прекрасные новые инструменты (в надежде, что их не отберут). + +knowledge.smeltObsidian=Работа с обсидианом +knowledge.smeltObsidian.desc=Уровень %1$s, экзотический материал +knowledge.smeltObsidian.1=Обсидиан в своей природной форме экстримально устойчив к температуре, что делает его непригодным к обработке. Однако, его смесь с сталью по определённой технологии может отличный материал + +knowledge.smeltBlackSteel=Работа с чёрной сталью +knowledge.smeltBlackSteel.desc=Уровень %1$s, обычный материал +knowledge.smeltBlackSteel.1=Теперь можно очистить сталь до более хорошего материала. Этот материал впитал в себя весь Ваш предыдущий опыт, и теперь Вы можете создавать ещё более хорошие вещи. + +knowledge.craftOrnate=Украшение +knowledge.craftOrnate.desc=Заслуживает ухода + +knowledge.craftOrnate.1=С подходящими материалами и наличием времени можно создавать более изысканные варианты оружия, брони и инструментов. Инкрустированные вещи более эффективны против нечисти (например, зомби).^Декоративный герб используется для создания таких предметов. Поместите украшение в выходящий слот наковальни и начинайте ковать. В итоге, у Вас получится украшенный предмет. + +knowledge.smeltDragonforge=Драконокованый +knowledge.smeltDragonforge.desc=Грубо и мощно + +knowledge.smeltDragonforge.1=Драконы - жестокие создания, битва с ними требует подготовки и опыта. Благодаря вашим стараниям, вы можете обратить их оружие против них самих! Драконокованые предметы куда сильнее поражает драконов.^Начните создавать любое оружие. В старых сказаниях говорится, что сердце дракона наделяет металл мощью, когда те объяты пламенем. +knowledge.smeltDragonforge.2=Драконокованые предметы, в отличие от других видов, требуют проведения этого ритуала на открытом воздухе. + +knowledge.smeltBlueSteel=Работа с голубой сталью +knowledge.smeltBlueSteel.desc=Уровень %1$s, обычный материал + +knowledge.smeltBlueSteel.1=Вы научились изготавливать голубую сталь, крайне лёгкий металл. + +knowledge.smeltRedSteel=Работа с красной сталью +knowledge.smeltRedSteel.desc=Уровень %1$s, обычный материал + +knowledge.smeltRedSteel.1= Красная сталь - очень тяжёлый материал, быстро потребляющий Вашу выносливость, но в то же время крайне прочный. + +knowledge.smeltMithril=Работа с мифрилом +knowledge.smeltMithril.desc=Уровень %1$s, экзотический материал + +knowledge.smeltMithril.1=Мифиевая руда крайне странная: в зависимости от метода её обработки результат разный. При смешивании лёгких элементов, серебра и мифиевой руды, Вы можете создать Мифрил. ^Мифрил отличается завидной лёгкостью. + +knowledge.smeltMithril.2=Из строк "Схематического Талисмана" стало известно, что серебро можно применять с мифием для создания более лёгкого материала.^Кажется, такое знание бесполезно, но это далеко не так. + + +knowledge.smeltAdamantium=Работа с адамантием +knowledge.smeltAdamantium.desc=Уровень %1$s, экзотический материал + +knowledge.smeltAdamantium.1=Мифиевая руда крайне странная: в зависимости от метода её обработки результат разный. Смешивая тяжёлые металлы с золотом и мифием, вы получаете крайне тяжёлый и крепкий металл. + +knowledge.smeltAdamantium.2=Из строк "Схематического Талисмана" стало известно, что золото можно применять с мифием для создания более прочного и тяжёлого материала. Золото играет важную роль в трансформации мифиевой руды в другой металл. ^Кажется, такое знание бесполезно, но это далеко не так. + +knowledge.smeltMaster=Мастерская обработка мифиевой руды +knowledge.smeltMaster.desc=Новые горизонты + +knowledge.smeltMaster.1=Производство материалов из мифия одно дело. А вот правильное - совсем другое. Вы можете создать мифрил и адамантий, но эти материалы - мусор в сравнении со всем потенциалом мифиевой руды. + +knowledge.smeltMaster.2=Мастерство позволяет Вам создавать новые, могущественные материалы, раскрывающие всю мощь, заключённую в мифиевой руде. ^Мастерства не так уж и легко добиться. Теперь станет намного сложнее удерживать качество продукта ковки. + +knowledge.smeltMaster.3=Но не только: хотя бы лёгкая тень несовершенства омрачит результат. А истинное совершенство станет практически неуничтожимым! + +knowledge.smeltIgnotumite=Работа с игнотумитом +knowledge.smeltIgnotumite.desc=Уровень %1$s, материал мастеров своего дела + +knowledge.smeltIgnotumite.1=Адамантий крайне мощен, но он не достигает своих истинных высот. Мифий содержит в себе множество элементов, и их разделение позволяет превратить адамантиум в игнотумит. + +knowledge.smeltMithium=Работа с мифием +knowledge.smeltMithium.desc=Уровень %1$s, материал мастеров своего дела + +knowledge.smeltMithium.1=Мифрил - крайне лёгкий и достаточно прочный материал, но, видимо, у него гораздо более большой потенциал. Вам предстоит попробовать выплавить чистый мифий... + +knowledge.smeltEnder=Работа со сталью Края +knowledge.smeltEnderforge.desc=Уровень %1$s, материал мастеров своего дела + +knowledge.smeltEnderforge.1=В существах из Края всегда было что-то странное... Сталь края сочетает в себе мифрил и адамантиум и концентрирует их силы через потусторонний жемчуг... + +knowledge.coalflux=Угольный флюс +knowledge.coalflux.desc=Лучше значит дешевле. +knowledge.coalflux.1=Угольный флюс ничем не уступает обычному углю, это было доказано кузнецами давным давно. Он выдаёт больше жара, медленнее сгорает, и создаётся проще простого!^Чтобы сделать угольный флюс, нужно смешать обычный уголь и флюс. Это вещество может быть использовано в домницах и любых других устройствах Mine Fantasy, но не как топливо(не как ванильный уголь). + +knowledge.bigfurn=Большая печь +knowledge.bigfurn.desc=Массовое производство + +knowledge.bigfurn.1=Процесс очистки базовых металлов и материалов сейчас достиг небывалых высот. Домницы - прошлый век, ведь они медленные, и дают на выходе металл не очищенный.^Большую печь рекомендуется обложить огнеупорной глиной в целях пожарной безопасности. + +knowledge.bigfurn.2=Эта печь переплавляет сразу 4 предмета за короткий срок времени. Печь имеет простой дизайн, но этого достаточно, чтобы работать с ней, нужно лишь положить уголь и металлы. + +knowledge.bigfurn.heater=Чтобы начать работу, отправьте уголь в топку. Печь заработает, и чем выше будет температура в топке, тем быстрее печь будет плавить металл. Для безопасности, следует обложить топку огнеупорной глиной. + +knowledge.bigfurn.top=Разместите саму печь над топкой. Если Вы будете регулировать температуру, печь будет работать наиболее эффективно.В целях пожарной безопасности обложите печь огнеупорной глиной. + +knowledge.bigfurn.structure=Когда Вы сделали печь, обложили её огнеупорным материалом, можете создавать впритык к ней другие печи, они будут работать как одна. + +knowledge.blastfurn=Очистка металла +knowledge.blastfurn.desc=Больше, чем переплавка + +knowledge.blastfurn.1=Иногда выплавка металла из руды попросту не может дать Вам необходимый эффект, и тогда Вам потребуется очистная печь.^ Каждая такая печь может быть построена практически с любой высотой и обрабатывать сразу несколько ресурсов одновременно. + +knowledge.blastfurn.2=Перед строительством печи нужно позаботиться о достойном каркасе.^ Огнеупорный кирпич должен выдерживать эти огромные температуры и используются для облицовки печи. +#Firebrick Recipes +knowledge.blastfurn.3=Печь состоит из двух типов блоков - топок и камер. Одна топка может обслуживать до 16 камер печи. +#Furnace Recipes +knowledge.blastfurn.4=Имея огнеупорный кирпич, топку и камеру, Вы может построить очистную печь.^Для начала, поставьте топку на землю.^Если под топкой находится тигель, он будет собирать в себя отходы топки. ^ Также оставьте достаточно места (около четырёх блоков) со всех сторон. +knowledge.blastfurn.5=Топка должна иметь как минимум по одному блоку огнеупорного кирпича у каждого из своих четырёх углов. Желательно не закрывать боговые стороны топки. ^Теперь можно построить саму шахту очистной печи над топкой, прикрывая её со всех четырёх сторон огнеупорным кирпичом. Верх должен быть открыт для свободного выхода дыма. +#Structure +knowledge.blastfurn.6=Использование очистной печи очень простое, но потребляет огромное количество топлива.^Сначала положите материал (такой как подготовленное железо) в нижний слот и уголь в верхний слот в самую верхнюю камеру. +knowledge.blastfurn.7=Если всё сделано верно, ресурсы провалятся в шахту и распределятся среди камер по одной штуке. Только после этого стоит положить топливо в топку, оно сгорает вне зависимости от того, есть ли что печи очищать! По окончанию процесса каждая из камер произведёт по одной единице вещей, а изменение давления в топке вызовет выброс пламени.^Главное - не закрывать путь этим выбросам, иначе печь может взорваться. А также желательно не держать возле печи возгораемых объектов! + +knowledge.blastfurn.hcc=$hHardcore Crafting-$r^ Крайне желательно ставить тигель под топкой, иначе можно потерять часть ресурсов! + +#Prepared Iron + +knowledge.blastfurn.9=Подготовленная железная руда используется для производства чугуна.^Чугун можно переделать в сталь.^Можно использовать обогащённый флюс для того, чтобы удвоить выход продукта, но он - редкость, и должен использоваться мудро. + +knowledge.bloomery=Домница +knowledge.bloomery.desc=Ранняя работа с металлами + +knowledge.bloomery.1=Домница поможет переплавить руду в слитки. + +knowledge.bloomery.2=Для использования домницы положите в неё уголь и руду в пропорции 1:1 и подожгите её. Домница должна быть под открытым небом! Также можно вывести от домницы трубу к небу. Чем больше материала - тем дольше она плавит. + +knowledge.bloomery.3=Когда переплавка окончена, отобразится масса переплавленного металла. Ударяйте по ней молотом, пока не получите все слитки. + +knowledge.crucible=Легирование +knowledge.crucible.desc=Смешивая металлы + +knowledge.crucible.1=Не так долго Вы можете полагаться на один металл. Для дальнейшего прогресса потребуется тигель.^Он создан для плавки металлов и последующего создания сплавов. + +knowledge.crucible.2=Для функционирования, тигель должен иметь источник тепла под собой (Такой как $hForge$r). Так же можно использовать лаву, но процесс пойдёт куда медленнее.^ Рецепты для сплавов не имеют чёткой формы, главное - пропорции. Например: 3 бронзы = 2 меди + 1 олово. Это значит, что Вы кладёте олово в один слот, а медь - в два и на выходе Вы получаете бронзу. Но Вы можете положить 4 меди и 2 олова и получить 6 бронзы и так далее... + +knowledge.crucible.hcc=$hHardcore Crafting-$r^Для того, чтобы достать слиток из тигля, используйте ПКМ литейную форму, которую после нужно остудить в воде.^Внимание! Если вы сломаете тигель, то вся продукция будет утеряна! + +knowledge.crucible2=Продвинутое легирование +knowledge.crucible2.desc=Больше сплавов для Бога сплавов! +knowledge.crucible2.1=Огнеупорные блоки доказали свою полезность.Создание тигля из такого материала означает, что он сможет выдерживать куда большие температуры и производить новые сплавы.^Тигли из огнеупорной глины намного лучше простых. + +knowledge.crucible2.blocks=Чтобы обезопасить работу, рекомендуется обложить тигель с четырёх сторон огнеупорными кирпичами. + +knowledge.apron=Кузнечный фартук +knowledge.apron.desc=Защитная одежда + +knowledge.apron.1=Что-то подсказывает Вам, что горн и слитки нагреваются. Возможно это "что-то" - Ваш горький опыт и прожжённая плоть на Вашем пузе. Тогда специально для вас - кузнечный фартук. Одеяние кузнеца состоит из рубахи, фартука и перчаток. Без этого предметы в Вашем инвентаре могут сгореть. + +knowledge.anvil=Ковка +knowledge.anvil.desc=Основы работы с металлами + +knowledge.anvil.1=Ковка - самый распространённый способ для крафта чго-либо.^Этот процесс включает в себя горн для нагрева металлов и ковку на наковальне с помощью молотов. Внимание! Остужение продукта ковки без щипцов и в открытой воде ведёт к поломке предмета! Используйте корыта и клещи. + +#Recipe + +knowledge.anvil.2=Наковальни крайне просты для крафта и также могут быть разсплавлены в печах.^Расположите наковальню неподалёку от воды и горна. Нажатие ПКМ без молота в руке или по боковой стороне накованьни откроет её интерфейс. + +#Gui + +knowledge.anvil.3=Изготовление вещей может показаться сложным, оно имеет две стадии. ^Сперва некоторые вещи должны быть разогреты в $hгорне$r. Если предмет нагреваемый, его нужно разогреть.^Во-вторых, нужно выложить сам рецепт. Начните выкладывать его + +knowledge.anvil.4=в сетке$h[3]$r затем: возьмите подходящий молот (тяжёлый или обычный, в зависимости от рецепта). Каждый рецепт имеет рекомендации по уровню молота и наковальни. Молоты низкого уровня непредсказуемы по качеству результата, а низкоуровневые наковальни усложняют крафт качественных вещей. Уровни будут отображаться над заголовком$h[1]$r.^Бейте молотком по наковальне. Шкала програсса$h[2]$r будет заполняться, а по завершению результат крафта появится в слоте$h[4]$r.^Некоторые вещи будут горячими, поэтому их надо остудить в воде нажатием ПКМ или в котле (удерживая shift). +knowledge.anvil.5=Для того, чтобы взять с наковальни разогретую вещь, используйте клещи. Горячие предметы могут нанести вам увечья, используйте клещи, чтобы взять что-либо из горна и перенести на наковальню! + +knowledge.anvil.6=При ковке следите за уровнем качества. Задача состоит в том, чтобы держать маркер подальше от краёв. Если он достигнет одного из них, это разрушит рецепт. При изготовлении повреждаемых вещей уровень срока службы также зависит от уровня качества, а именно от того, вышел ли маркер за края обозначенных отметок.^Как Вы видите, на шкале качества есть 2 зелёные отметки, которые повреждают объект в случае, если маркер находится за их пределами. Разделяйте удары на удары молотом ЛКМ и ПКМ. Также заметьте, что маркер медленнее движется вправо, чем влево. + +#Quality +knowledge.anvil.7=Если ударить с зажатой клавишей SHIFT, то маркер отбросится назад (что даст вам немного времени), однако, не достигайте 0, иначе это разрушит предмет. + +knowledge.forge=Горн +knowledge.forge.desc=Становится жарковато + +knowledge.forge.1=Горн крайне простое устройство, всего лишь положите в него топливо ПКМ, и зажгите его сухими камнями или зажигалкой. .^Теперь положите в него слитки и держитесь от огня подальше! + +knowledge.forge.2=Горн разогревается до разных температур в зависимости от вида топлива температура зависит от последнего добавленного предмета. $hКузнечные меха$r могут быть использованы для временного повышения температуры.^Поместите нагреваемые предметы в горн и их температура начнёт медленно подниматься. + +knowledge.forge.3=$y"Готовые к использованию"$r вещи можно использовать на наковальне, $d"Перегретые"$r же слишком горячи для этого.^Используйте различные виды топлива и кузнечные меха для получения нужной температурой и следите за разогреваемыми предметами.^Внимание: если над горном расположен тигель или что-то вроде него, горн использоваться для разогрева не может! + +knowledge.bellows=Кузнечные меха +knowledge.bellows.desc=Раздувая огонь + +knowledge.bellows.1=Иногда температуры недостаточно, или разогрев происходит слишком долго. Использование более качественных видов топлива же может быть дорогим.^Кузнечные меха же могут временно поднять температуру до 50%. Для использования поставьте их рядом с горном, направив их на него, и нажимайте ПКМ. + +knowledge.trough=Корыто +knowledge.trough.desc=Готовы к полосканию! + +knowledge.trough.1=Ходить далеко за водой не очень удобно, да и обычные источники воды разрушаются при полоскании предметов. Корыто - лучший способ остудить горячие предметы, достаточно лишь нажать ПКМ клещами или горячими предметами по корыту с водой. Чтобы наполнить корыто, нажмите ПКМ по нему держа в руке ведро с водой. Только не переполните его!.^После полоскания, предмет потеряет некоторый запас прочности.^Корыто так же может быть наполнено, если нажать ПКМ по блоку с водой. + +knowledge.trough.2=С кучкой гвоздей и набольшими усилиями можно собрать корыто, которое практически не будет протекать. В этом случае стоит уделить внимание и качеству древесины, чтобы создать идеальное изделие. + +knowledge.repair_basic=Ремонтные наборы +knowledge.repair_basic.desc=Держим инструменты в хорошем состоянии + +knowledge.repair_basic.1=Инструменты и многие другие вещи имеют свойство ломаться. Имея немного кожи и гвоздей, Вы найдёте способ исправить это.^Простые ремонтные наборы чинят любые вещи, но с некоторым шансом. Так же есть вероятность поломки, но это лучше, чем ничего. Конечно, более продвинутые наборы чинят вещи эффективнее...^Для использования нажимайте ПКМ по рем.набору держа в руке поломанный предмет.^P.S: Глупо чинить чернильницу с пером, как это делает Alter. + +knowledge.repair_advanced=Продвинутая починка +knowledge.repair_advanced.desc=Уже куда лучше + +knowledge.repair_advanced.1=Эти новые ремонтные наборы, хотя и дороже, но могут починить большее количество вещей до поломки. ^Также они восстанавливают больше прочности. + +knowledge.repair_ornate=Украшенный ремонтный набор +knowledge.repair_ornate.desc=Починка зачарованных инструментов + +knowledge.repair_ornate.1=Как известно, зачарованный предмет плохо поддаётся починке.^Однако этот ремонтный набор может всё исправить, может, потому что он крайне дорогой?^Ох уж эти жадные чары... + +knowledge.craftArmourBasic=Базовая броня +knowledge.craftArmourBasic.desc=Да я это никогда не одену! +knowledge.craftArmourBasic.1=Неплохо бы во что-то одеться, начиная исследовать этот мир. Эта броня ненадёжна, но лучше, чем ничего. + +knowledge.craftArmourLight=Лёгкая броня +knowledge.craftArmourLight.desc=Дешёвая и удобная + +knowledge.craftArmourLight.1=Лёгкая броня имеет небольшой вес, и делается из небольшого количества материалов. Пусть она не даст отличной защиты, но в ней Вы без затруднений можете применять особые боевые навыки.^Лёгкая броня - лучший выбор для боя, где нужна скорость и маневренность. +knowledge.craftArmourLight.2=Грубая кожаная броня является самой простой лёгкой бронёй. Может она и плохо защищает, но из неё делаются более сложные типы брони. +knowledge.craftArmourLight.3=Подбитая броня хорошо подходит для защиты от дробящего оружия. Так же, она является неободимым компонентом для создания тяжёлой брони. +knowledge.craftArmourLight.4=Укреплённая и клёпаная броня являются улучшенными версиями грубой кожаной брони. Укреплённая кожаная броня необходима для создания средней брони. +knowledge.craftArmourMedium=Средняя броня +knowledge.craftArmourMedium.desc=Сбалансированная защита + +knowledge.craftArmourMedium.1=Защита уже лучше, но и восстановление выносливости уменьшено вдвое. Не самая хорошая защита от колющего удара. + +knowledge.craftArmourMedium.scale=Чешуйчатая броня может быть сделана как альтернатива кольчуге. Такая броня сбалансированно защищает от всех видов урона, но не очень эффективна против колющего и режущего урона. + +knowledge.craftArmourHeavy=Тяжёлая броня +knowledge.craftArmourHeavy.desc=Мощная, но неподвижная. + +knowledge.craftArmourHeavy.1=Вы получили защиту превосходящую среднюю броню, но она сковывает Ваши движения. Средняя броня имеет ряд преимуществ, но это может быть способом для дальнейшего улучшения.^Через изучение анатомии некоторых диких животных, Вы пришли к выводу: Выглядит очевидным использование шерсти и перьев для большей эффективности, а части подбитой брони могут дать своеобразные преимущества.^Теперь Вы знаете, как создать тяжёлую броню, которую не каждый сможет носить без затруднений. +knowledge.craftArmourHeavy.2=Тяжёлая броня создаётся с уже готовой подбитой брони. Подбитая броня обеспечивает мягкий защитный слой под основными элементами брони. + +knowledge.craftArmourHeavy.splint=Шинная броня не кажется тяжёлой, как латные доспехи. Но, разумеется, шинная броня в разы превосходит среднюю броню, и защищает от всех типов урона. +knowledge.craftArmourHeavy.plate=Латная броня превосходно защищает воина, но она сильно сковывает движения. Да и чтобы сделать её придётся попотеть. +knowledge.craftHCCTools=Примитивные инструменты +knowledge.craftHCCTools.desc=Каменный век + +knowledge.craftHCCTools.1=До того, как получить металл, нужно использовать примитивные инструменты из камня, которые делаются на плотницком верстаке.^Каждое примитивное орудие требует 3 компонента:^Острые камни добываются разбиванием голыми руками блоков камня.^Лоза получается при разбивании блоков листвы острым камнем. + +knowledge.craftHCCTools.2=Палки добываются тем же способом, что и лоза.^Острые камни также добываются из булыжника, но для этого нужен молот. + +knowledge.craftHCCTools.3=С этими материалами Вы можете изготовить свои первые инструменты. Рекомендуем сначала изготовить кирку, так как с её помощью можно получать камень. + +knowledge.craftTools=Кованые инструменты +knowledge.craftTools.desc=Крафт для жизни +knowledge.craftTools.1=Вы всю жизнь будете бегать с палкой и примотанным к ней камнем? ^Кованые инструменты годятся на большее, да и прочность у них выше. + +knowledge.craftAdvTools=Продвинутые инструменты +knowledge.craftAdvTools.desc=Подходят для своих задач + +knowledge.craftAdvTools.1=Помимо стандартных инструментов есть и иные, которые могут быть достаточно полезны. + +knowledge.hvypick.info=Тяжёлая кирка - для настоящих мужчин! Она копает область 3x3x3 блока, но с меньшим дропом. Подходит для копания крупных подземных тоннелей. + +knowledge.trow.info=Эта маленькая лопата работает почти также, как и малая кирка, но с другим лутом и другими блоками, такими как земля или трава. + +knowledge.hvyshovel.info=Несмотря, что она больше похожа на дверь на ручке, вещь это довольно полезная.^Действует тяжёлая лопата почти также, как и тяжёлая кирка, но по отношению к земле. + +knowledge.scythe.info=Косы позволяют скашивать траву, урожай и листву. + +knowledge.mattock.info=$hКиркомотыга$r^В основном используемая для ландшафтного дизайна, киркомотыга поможет вам создавать дороги на основе блоков травы и земли. Вы можете разместить любой блок на дороге, чтобы изменить её внешний вид. +knowledge.mattock.use=ПКМ с киркомотыгой по блоку создаст дорогу. Так же вы можете кликнуть ПКМ любым блоком, чтобы изменить текстуру дороги. Более того, дорога может стать полублоком, если кликнуть по ней ПКМ с лопатой.^С киркомотыгой в руке мы можете заблокировать дорогу от случайных изменений лопатой или блоком: переключение режимов осуществляется ПКМ, красная иконка означает, что блок не может быть изменён, зелёная - наоборот. + +knowledge.lumber.info=$hТопор дровосека$r^Этот тяжёлый топор создан для быстрой и простой вырубки лесов, с его помощью вы можете срубить всё дерево целиком, разрушив всего один блок. Большие деревья рубить сложно, поэтому топор будет поврежаться быстрее. + +knowledge.craftWeapons=Кованое оружие +knowledge.craftWeapons.desc=Для "обороны" + +knowledge.craftWeapons.1=Что это? Деревянный меч? Ты им и ребёнка не напугаешь. Но потренироваться можно.^Разные стили боя подходят к разному оружию. Попробуйте всё! + +knowledge.sword.info=Старый добрый меч, который крайне хорошо блокирует удар. К нему подходит стиль блокирования и быстрых контратак. + +knowledge.mace.info=Металлический шар на ручке, которым является булава, не очень подходит для блокирования, а вот для пробивания черепов и тяжёлой брони он в самый раз! + +knowledge.waraxe.info=Боевой топор - это брутальный способ убить ближнего своего, к тому же имеющий бонус при разбеге и при ударе в прыжке. + +knowledge.spear.info=А вот если вам не хочется сходиться в ближнем бою, то копьё поможет Вам удержать Вашего противника на приличной дистанции. ^Копья наносят хороший урон при разбеге. + +knowledge.bow.info=Стандартный лук, но почему-то сделанный из металла. Он достаточно прочен и силён для ведения дистанционного боя. + +knowledge.craftAdvWeapons=Тяжёлое оружие +knowledge.craftAdvWeapons.desc=Размер имеет значение + +knowledge.craftAdvWeapons.1=Конечно же мы верим в то, что Вы никого не хотите убивать, поэтому вот Вам ещё больше оружия чтобы расправиться с ближним с ещё большей жестокостью. + +knowledge.greatsword.info=Тяжёлый и плоский клинок. Это лучшее оружие для самозащиты. + +knowledge.warhammer.info=Если пробитые черепа - это Ваш конёк, то боевой молот Вам более чем подходит! + +knowledge.battleaxe.info=Секиры ещё лучше боевых топоров. Больше ярости берсерка! + +knowledge.halbeard.info=Что если прикрепить топор к копью? Выйдет алебарда. Ей можно рубить вблизи и колоть при разбеге. + +knowledge.lance.info=Копьё всадника практически бесполезно для пеших атак, но при достаточной скорости перемещения верхом наносят огромный урон.^ Прекрасный выбор для рыцарского турнира или штурмовой кавалерии. + +knowledge.firemaker=Разведение огня +knowledge.firemaker.desc=СОЖГИ ИХ ВСЕХ! +knowledge.dryrocks.info=Сухие камни это базовый инструмент для разведения огня, они не создают блоков огня, но ими можно разжечь горн. +knowledge.tinderbox.info=Трутница является хорошим средством для разведения огня, к тому же она более долговечная чем сухие камни. It still may take a few tries to get a flame, but the extra uses pays off. +knowledge.flintsteel.info=Разумеется, огниво лучшее средство для разведения огня. Имеет самую большую прочность. + +knowledge.craftCrafters=Изготовление инструменов +knowledge.craftCrafters.desc=крафт для крафта + +knowledge.craftCrafters.1=Это инструменты для крафта. Многие рецепты требуют взаимодействия этих инструментов с блоками. +knowledge.hvyhammer.info=Тяжёлые молоты сходны с молотами, но используются для ковки каких-либо больших предметов. + +knowledge.tongs.info=Клещи нужны для переноски горячих предметов с места на место. + +knowledge.knife.info=Ножи могут быть использованы как в выделке шкур, так и в приготовлении пищи. + +knowledge.saw.info=Пилы распиливают дерево куда эффективнее. Положите доски на стол плотника и пилите. + +knowledge.needle.info=Иглы нужны для рецептов, связанных с пошивом. + +knowledge.mallet.info=Киянки используются там, где использовать молоты - это уж слишком. + +knowledge.spoon.info=Ложки... Серьёзно, вам ещё и про ложку рассказывать? Используется для перемешивания и готовки. Всё. + +knowledge.arrows=Изготовление стрел +knowledge.arrows.desc=Чтобы лук не валялся без дела + +knowledge.arrows.1=Создание стрел занимает время, но при этом достаточно дешевое. Вы можете создать множество вариаций стрел, используя разные металлы. Оперение стрел можно создавать из бумаги или перьев, но последние куда эффективней. Собрать стрелы можно на плотницком верстаке. + +knowledge.arrowsBodkin=Конические стрелы +knowledge.arrowsBodkin.desc=Лёгкие и быстрые + +knowledge.arrowsBodkin.1=Эти стрелы наносят меньше урона, но летят они дальше и точнее. + +knowledge.arrowsBroad=Широкоглавые стрелы +knowledge.arrowsBroad.desc=Тяжёлые и мощные + +knowledge.arrowsBroad.1=Куда более низкая дальность и скорость полёта, не мешает их широким и тяжёлым наконечникам перемалывать металлическую броню, кости и плоть. + +knowledge.etools=Инженерные инструменты +knowledge.etools.desc=Инструменты для изобретательных +knowledge.etools.1=Для попыток освоить инженерное дело, Вам понадобятся специальные инструменты. + +knowledge.ecomponents=Компоненты и основные материалы +knowledge.ecomponents.desc=Для создания сложных вещей + +knowledge.ecomponents.1=Для инженерного дела требуется новый способ соединения частей предметов. И эти компоненты стоят того! + +knowledge.ecomponents.2=Большинство объектов в этом ремесле не выковываются целиком, а составляются путём соединения заранее выкованных деталей. + +knowledge.coke=Кокс +knowledge.coke.desc=Очищенное топливо + +knowledge.coke.1=Обычный уголь полон всяческих примесей, которые не дают огню хорошо разгореться. После небольшой обработки и добавления красной пыли, древесный уголь будет гореть эффективнее, ведь теперь он будет чистейшим. Этот процесс доступен только для древесного угля. + +knowledge.tungsten=Вольфрам +knowledge.tungsten.desc=Для сложных конструкций + +knowledge.tungsten.1=У всех когда-то наступает момент, когда железо становится недостаточно пригодным для создания чего-либо; Это весьма трудно - найти хорошую замену. И не важно, будет это железо или носки(забудем). Вольфрам - редкий металл, находящийся в нижних слоях каменной породы. Вольфрамовая руда может быть обнаружена в виде жилки в 1 блок, но так же может быть случайно добыта с помощью малой кирки. + +knowledge.tungsten.2=Если у Вас высокоуровневые инструменты(как минимум инкрустированные), Вы можете добыть вольфрам ниже 16 блоков. Вольфрам может быть расплавлен(оно и понятно), но потребуется много топлива. + +knowledge.tungsten.3=Несмотря на то, что этот материал предназначен только для инженерии, необходимо иметь должный уровень кузнечного дела чтобы обработать вольфрам, что создаёт дополнительные трудности. + +knowledge.engTanner=Улучшенный дубильный станок +knowledge.engTanner.desc=Лёгкая обработка кожи + +knowledge.engTanner.1=Выделка кож довольно монотонное занятие, но Вы нашли способ упростить его.^Этот станок может как обрабатывать кожу, так и резать её. Всё, что нужно - поместить материал на станок и щёлкнуть ПКМ по станку. + +knowledge.advcrucible=Продвинутый тигель +knowledge.advcrucible.desc=Делаем сплавы легко! + +knowledge.advcrucible.1=Чертежи этого тигеля, в основном, содержат интересные секреты гномов по обработке металлов. Через исследование технологий выплавки, можно организовать автоматическую переплавку металлов. Если тигель установлен в систему, можно начинать работу. + +knowledge.advforge=Улучшенный горн +knowledge.advforge.desc=Полный контроль + +knowledge.advforge.1=Чертежи гномов позволяют создать горн, контролируемый сигналом красного факела!^Приспособьте к нему рычаг и зажгите (или погасите) его! + +knowledge.blackpowder=Взрывчатка +knowledge.blackpowder.desc=Бум! + +knowledge.blackpowder.1=Теперь Вы можете создавать устройства, позволяющие доставить взрывчатку под ноги Вашим друзьям и недругам издалека. ^Оружейный порох - крайне нестабильная субстанция, производящая взрыв и повреждения, изготавливающаяся из различных материалов. + +knowledge.advblackpowder=Очищенный оружейный порох +knowledge.advblackpowder.desc=Кабум! + +knowledge.advblackpowder.1=Нужно больше веселья?^С помощью использования редстоуна и светопыли Вы можете усилить качества пороха. + +knowledge.climber=Альпеншток +knowledge.climber.desc=Поднимайся! +knowledge.climber.1=Становится невыносимым блуждать в горах, ища путь наверх? Не нравится беспомощно падать в пропасть? Альпеншток позволит Вам цеплиться за цельные блоки. +knowledge.climber.2=Для того, чтобы зацепиться за блок, нажмите ПКМ и удерживайте его. После этого, не отпуская ПКМ, удерживайте shift и ЛКМ, чтобы спускаться, или просто зажмите ЛКМ для того, чтобы подниматься вверх. Следите за выносливостью! + +knowledge.spyglass=Подзорная труба +knowledge.spyglass.desc=Что это там вдали? +knowledge.spyglass.1=Подзорная труба позволяет взглянуть на мир по-другому. Shift + ПКМ меняет приближение. + +knowledge.parachute=Парашют +knowledge.parachute.desc=Если падать высоко +knowledge.parachute.1= Он позволяет Вам безопасно спуститься с высоты. + +knowledge.syringe=Шприц +knowledge.syringe.desc=Вколол и пошёл +knowledge.syringe.1=Вколоть зелье себе в руку куда быстрее, чем его пить, и выигранное время может оказаться бесценным. Также Shift + ПКМ позволяет использовать шприц на других. + +knowledge.bombs=Изготовление бомб +knowledge.bombs.desc=Пальцы себе не оторвите! + +knowledge.bombs.1=Какой смысл во взрывчатке, если её некуда положить? Эти небольшие приспособления нанесут хороший урон в небольшом радиусе.^Это более эксперементальное ремесло, чем другие. Сперва Вам нужно оборудовать рабочее место. + +knowledge.bombs.2=С этим столом Вы сможете изготавливать как бомбы, так и мины. Бомбы можно бросить, удерживая ПКМ, и они взорвутся через некоторое время. ПКМ с миной в руках устанавливает её на землю, и она взрывается, когда кто-то наступает на неё. + +knowledge.bombs.3=Бомбы и мины требуют 3-4 компонента при создании.^Оболочка$h[1]$r определяет урон и зону поражения. Взрывчатка$h[2]$r увеличивает урон. Наполнение$h[3]$r может быть пустым и используется для придания бомбе дополнительного поражающего эффекта. Фитиль $h[4]$r определяет время до детонации. + +knowledge.bombs.4=Для крафта бомбы положите компоненты в соответствующие слоты, после чего щёлкните по столу. + +knowledge.crossbows=Изготовление арбалетов +knowledge.crossbows.desc=Смертельные снаряды +knowledge.crossbows.1=Арбалеты - отличная замена лукам. Конечно, арбалет более медленный, чем лук, на него можно нацепить различные обвесы, дающие различные преимущества. +knowledge.crossbows.2=Чтобы сделать арбалет, Вам понадобится соответствующий верстак.^На нём Вы должны комбинировать детали, чтобы собрать полноценное оружие. Арбалет состоит из четырёх частей(Ложа, Дуги, Мод и Дуло). +knowledge.crossbows.3=Поставьте где-нибудь верстак для изготовления арбалетов. Теперь Вам нужно создать детали для него(смотрим рецепты).Ложа и дуги используются во всех арбалетах. Ложа влияет на отдачу, скорость перезарядки, а короткая рукоять повышает скорость перезарядки и снижает точность. +knowledge.crossbows.4=Вы можете улучшить арбалет. Достаточно добавить обвес в слот "Мод" или "Дуло". В "Мод" цепляется прицел, а в "Дуло" штык-нож. Лучше не устанавливать обвес, если в том нет нужды. +knowledge.crossbows.5=Для создания арбалета: Разместите детали в соотв. слоты(похоже на создание бомбы). Теперь используйте киянку, чтобы собрать арбалет. +knowledge.crossbows.6=По окончанию: теперь у Вас есть арбалет. Арбалеты работают почти как луки и выпускают болт тогда, когда заряжены. Shift+ПКМ чтобы открыть инвентарь арбалета. Сюда помещаются болты для арбалета, и когда Вы нажмёте ПКМ, арбалет зарядится. + +knowledge.crossShafts=Ложа арбалета +knowledge.crossShafts.desc=Основной компонент +knowledge.crossShafts.handle=Рукояти подходят для создания миниатюрных арбалетов. Малые размеры повышают скорость перезарядки, понижая точность и повышая отдачу. +knowledge.crossShafts.stock=Ложа является полномасштабной рукоятью арбалета, с высокой отдачей, в отличии от миниатюрной рукояти. Из-за большого размера скорость перезарядки достаточно низкая. + +knowledge.crossHeads=Дуги арбалета +knowledge.crossHeads.desc=Основной компонент +knowledge.crossHeads.light=Лёгкие дуги ускоряют перезарядку, снижая урон. +knowledge.crossHeads.medium=Арбалетные дуги стандартного размера. Сбалансированный урон и скорость перезарядки. +knowledge.crossHeads.heavy=Тяжёлые, укреплённые дуги арбалета. Огромная отдача и низкая скорость перезарядки компенсируется высоким уроном. + +knowledge.crossHeadAdvanced=Продвинутые дуги арбалета +knowledge.crossHeadAdvanced.desc=Лучше, значит... лучше. + +knowledge.crossHeads.advanced=Эти гномьи чертежи арбалетных дуг способны дать оружию огромную силу. С нужными материалами и инструментами становится возможным создать для себя эту деталь.^Очень низкая скорость перезарядки компенсируется колоссально высоким уроном и точностью. + +knowledge.crossShaftAdvanced=Продвинутая ложа арбалета +knowledge.crossShaftAdvanced.desc=Контролируем отдачу. + +knowledge.crossShafts.advanced=На основе обычного ложа: эта деталь гномами сделана из металла. Конечно, она тяжёлая, но всё же, подпружиненная система позволяет гасить отдачу. + +knowledge.crossAmmo=Магазин арбалета +knowledge.crossAmmo.desc=Многозарядное устройство +knowledge.crossAmmo.1=Арбалеты долго перезаряжаются после каждого выстрела, и чтобы закончить своё (грязное) дело, Вам может понадобиться ещё несколько выстрелов. Магазин, помещённый в слот "модификации", даст возможность сделать больше выстрелов перед перезарядкой, снижая, конечно, точность. + +knowledge.crossScope=Прицел арбалета +knowledge.crossScope.desc=Примитивный снайпер +knowledge.crossScope.1=Порой, бывает так, что цель слишком далеко, и расчитать траекторию полёта стрелы бывает трудно. В этом Вам поможет прицел для арбалета. Подзорная труба станетт полноценным прицелом, если поместить её в слот "модификации". + +knowledge.crossBayonet=Штык-нож арбалета +knowledge.crossBayonet.desc=Ближний бой +knowledge.crossBayonet.1=Во время перезарядки арбалета, уходит драгоценное время. А если нужно вступить в ближний бой? . Штык-нож помещается в слот "дула", и повышает урон в ближнем бою. + +knowledge.bpress=Бомбовый пресс +knowledge.bpress.desc=Массовое производство +knowledge.bpress.1=Производство бомб может быть очень долгим и нудным. Это устройство может выполнять работу за вас. Поместите пресс над столом для крафта бомб и нажмите на рычаг, и бомба будет собрана. + +knowledge.bombarrow=Наконечники со взрывчаткой +knowledge.bombarrow.desc=Летучая смерть +knowledge.bombarrow.1=Эти маленькие оболочки могут быть начинены взрывчаткой и прикреплены к стреле. К тому же, фитиль тут не нужен. + +knowledge.shrapnel=Бомбы со шрапнелью +knowledge.shrapnel.desc=Простая начинка +knowledge.shrapnel.1=Бомбы хороши, но их можно улучшить.^Шрапнель можно добавить в соответствующий слот, чтобы увеличить урон. + +knowledge.firebomb=Огненный взрыв +knowledge.firebomb.desc=Смертельное пламя + +knowledge.firebomb.1=Шрапнель эффективна для уничтожения врагов по одному, но смесь сгустка магмы может вызвать выброс высокотемпературного огня при детонации. + +knowledge.firebomb.2=Сгусток магмы - горючее и жидкое вещество, а драконье сердце может магически увеличить силу взрыва. +knowledge.firebomb.3=Такие бомбы дороги, но крайне эффективны против брони, которая гарантирует хорошую прожарку плоти. + +knowledge.bombCeramic=Керамическая оболочка для бомбы +knowledge.bombCeramic.desc=Простейшие бомбы +knowledge.bombCeramic.1=Керамическая оболочка хрупка и даёт не слишком сильный поражающий эффект, но средний радиус действия. + +knowledge.mineCeramic=Керамическая оболочка для мины +knowledge.mineCeramic.desc=Простейшие мины +knowledge.mineCeramic.1=Керамическая оболочка хрупка и даёт не слишком сильный поражающий эффект, но средний радиус действия. + +knowledge.bombIron=Железная оболочка для бомбы +knowledge.bombIron.desc=Компактный взрыв +knowledge.bombIron.1=Железная оболочка более прочная и радиус взрыва меньше, но зато силы во взрыв вложено куда больше. + +knowledge.mineIron=Железная оболочка для мины +knowledge.mineIron.desc=Компактный взрыв +knowledge.mineIron.1=Железная оболочка более прочная и радиус взрыва меньше, но зато силы во взрыв вложено куда больше. Также эта оболочка не так чувствительна, как керамическая. + +knowledge.bombObsidian=Обсидиановая оболочка для бомбы +knowledge.bombObsidian.desc=Превращаем ближнего в кровавое мессиво + +knowledge.bombObsidian.1=Высокая прочность обсидиана даёт мощнейший взрыв, но с очень маленьким радиусом. + +knowledge.mineObsidian=Обсидиановая оболочка для мины +knowledge.mineObsidian.desc=Превращаем ближнего в кровавое мессиво + +knowledge.mineObsidian.1=Высокая прочность обсидиана даёт мощнейший взрыв, но с очень маленьким радиусом. Чувствительность уменьшена и мины взрываются тогда, когда кто-то стоит на них. Что практически всегда приводит к летальному исходу. + +knowledge.bombCrystal=Кристаллическая оболочка для бомбы +knowledge.bombCrystal.desc=Стильно! + +knowledge.bombCrystal.1=Хрупкая стеклянная оболочка не даёт большой силы взрыву, но радиус поражения огромен! Не забудьте добавить алмазной пыли для того, чтобы осколки были крепче и наносили больше урона. + +knowledge.mineCrystal=Кристаллическая оболочка для мины +knowledge.mineCrystal.desc=Дорого-богато! +knowledge.mineCrystal.1=Хрупкая стеклянная оболочка не даёт большой силы взрыву и очень чувствительна к приближению, но радиус поражения огромен! Не забудьте добавить алмазной пыли для того, чтобы осколки были крепче и наносили больше урона. + +knowledge.bombFuse=Фитили для бомб +knowledge.bombFuse.desc=Отложенный взрыв +knowledge.bombFuse.1=Что такое бомба без фитиля? Скорее всего, после этого эксперимента Вы не сможете ответить на этот вопрос. Фитиль отвечает за то, сколько времени пройдёт от активации до детонации. +knowledge.bombFuse.2=Также можно сделать длинный фитиль, что означает, что бомбу можно кинуть дальше! А вот перспективы его применения в сборке мин так себе... + +knowledge.stickybomb=Клейкие бомбы +knowledge.stickybomb.desc=Лови! +knowledge.stickybomb.1=Эти бомбы прилипают к цели и разносят её в кровавые ошмётки. +knowledge.stickybomb.2=Для изготовления оставьте бомбу в слоте готовой продукции и щёлкните по столу со сгустком слизи в руке. Один сгусток слизи может быть использован на целый стак! + +$hUse of Cogworks$r^ + +knowledge.cogArmour=Механическая броня +knowledge.cogArmour.desc=Растоптай их! + +knowledge.cogArmour.1=Данное открытие объясняет, почему гномьи руины состоят из больших коридоров! Это чертежи приспособления с кучей механизмов, которые повторяют действия человека, подобно огромному экзоскелету. Выглядит как большой бронированный костюм, способный сделать носителя неуязвимым ко всем типам урона.^Механическая броня является венцом творения гномов, и способна переносить огромный вес. Единственный минус механической брони в том, что для работы она требует много чистого топлива. + +knowledge.cogArmour.2=Ни одного экземпляра механической брони не было найдено, но системы, обнаруженные в гномьих крепостях, теоретически, могут облачить в механическую броню кого-нибудь, ростом не выше человека. + +knowledge.cogArmour.station=$hМеханическая станция$r^Механическая станция необходима для экипирования или улучшения механической брони. Механическая станция состоит из остова и шкива, представляет из себя 3 остова высотой в 4 блока, со скрепляющим остовом по середине. +//Example +knowledge.cogwork_station=Механическая станция +knowledge.cogArmour.station.2=Когда станция готова, Вам нужно сделать шкив, затем нажать ПКМ по центральному остову для его установки. Убедитесь, что шкив расположен в нужном месте, ведь после установки его нельзя будет снять. +//Pulley Recipe +knowledge.cogArmour.crafting=Для создания механической брони: Вам нужно три блока - шлем, нагрудник и поножи. Разместите их на механической станции. Затем, нажмите ПКМ гаечным ключом по нагруднику. +//Piece Recipes +knowledge.cogArmour.armour=$hБроневые элементы$r^Для того, чтобы разместить броню на каркас, Вам нужно сделать её. Для этого потребуется много металла, поэтому рекомендуется использовать что-то вроде стали. Броня устанавливается через нажатие ПКМ по каркасу костюма. Так же Вам понадобится 16 болтов которые расходуются перед установкой брони. Броню можно легко снять с помощью гаечного ключа. +//Armour Recipe +knowledge.cogArmour.fuel=$hЗаправка$r^Механическая броня потребляет только чистое топливо(кокс или магму). ПКМ по костюму, чтобы заправить его топливом.^Чем тяжелее защита на механической броне, тем больше топлива она потребляет. +knowledge.cogArmour.advantage=$hПреимущества$r^Небронированная механическая броня защищает носителя от дыма, урона от падений, увеличивает наносимый урон и снижает затраты выносливости. +knowledge.cogArmour.advantage.2=Бронированный костюм даёт почти стопроцентную защиту, возможность дышать под водой. Также, защищает от отравления/иссушения и делает носителя неуязвимым к огню. +knowledge.cogArmour.advantage.3=Броня по-прежнему может получать урон от огня, в зависимости от температуры плавления материала, более высокий уровень прочности делает броню долговечной, но всё же, временами придётся снимать её для починки. +knowledge.cogArmour.disadvantage=Носитель не может прыгать, но может подняться на 1 блок выше, движения более скованные, и нет возможности красться.(да ладно?) +knowledge.cogArmour.disadvantage.2=Взрывы так же наносят урон броне, и могут ошеломить носителя на секунду. +knowledge.cogArmour.removal=Защитное покрытие снимается, когда костюм сломан. Каркас механической брони можно сломать с помощью гаечного ключа(ЛКМ), так же, он может быть разрушен в огне или лаве. + +knowledge.compPlate=Композитный металл +knowledge.compPlate.desc=Универсал + +knowledge.compPlate.1=Пока, многие сплавы получаются путём простого плавления и смешивания. Технологии гномов, связанные со сплавами, кардинально отличаются от тех, которыми пользуются люди. Материалы просто смешиваются и собираются в одну пластину. Конечно, для инструментов композитные сплавы не подойдут, но показывают максимальную эффективность при создании брони, особенно тяжёлой.^Помимо этого, композитные сплавы используются в создании механической брони. + +knowledge.refined_planks=Пропитанные бруски +knowledge.refined_planks.desc=Структурно стабильны +knowledge.refined_planks.1=Пропитанные бруски более прочные, и лучше подходят для строительства. Достаточно лишь скрепить их гвоздями(см. Оббитые доски). Этот блок не может быть демонтирован.^Вы можете пропитать маслом обычные бруски. + +knowledge.constructionPts=Строительные материалы +knowledge.constructionPts.desc=Деревянные заготовки +knowledge.constructionPts.1=Дерево должно быть напилено и заготовлено другими способами, чтобы начать работу с ним. Материалы имеют разные формы и размер, необходимые для строительства.^Бруски отлично подойдут для мебели и т.п., когда из металла следует делать гвозди. + +knowledge.reinforced_stone=Укреплённый камень +knowledge.reinforced_stone.desc=Выдерживая удары судьбы +knowledge.reinforced_stone.1=Характеристики камня могут быть улучшены с помощью его споавки с обсидианом и каолинитом. + +knowledge.clay_wall=Глиняная панель +knowledge.clay_wall.desc=Декоративные стены +knowledge.clay_wall.1=Декоративная стена, и этим всё сказано. + +knowledge.glass=Стеклянные блоки +knowledge.glass.desc=Декоративные окна +knowledge.glass.1=Стекло красиво, но хрупко. Но если поместить его в деревянную раму, его можно изъять без его разрушения. + +knowledge.brickworks=Основы каменной кладки +knowledge.brickworks.desc=Больше камня +knowledge.brickworks.1=Есть больше возможностей строить из камня. Из него и грязи можно сделать ещё и мостовую. + +knowledge.bars=Металлические прутья +knowledge.bars.desc=Прочное ограждение +knowledge.bars.1=Решётки из различных металлов. А решётка из драконьей стали ещё и будет нестерпимо жечь всех, кто прикоснулся к ней. + +knowledge.thatch=Солома +knowledge.thatch.desc=Мягкая крыша +knowledge.thatch.1=Простая крыша из соломы. + +knowledge.paint_brush=Кисть +knowledge.paint_brush.desc=Тут не докрасили... +knowledge.paint_brush.1=Порой не хочется сидеть за плотницким верстаком и маслом обрабатывать бруски. Вам на помощь придёт кисть.^Кистью с маслом можно пропитывать как бруски, так и целые блоки. +knowledge.paint_brush.2=$hКистью по миру$r^Долго и нудно пропитывать доски на верстаке, Вы можете делать это прямо в игре, одним взмахом волшебной... кисточки. Имея в инвентаре масло, жмите ПКМ по блокам навроде оббитых досок, чтобы превратить их в пропитанные доски. + +knowledge.decorated_stone=Декоративный камень +knowledge.decorated_stone.desc=Отделываем металлом +knowledge.decorated_stone.1=Камень в больших количествах выглядит пресно, и Вы изучили способы укрепления его металлом, что добавляет немного стиля Вашим стенам. + +knowledge.tool_rack=Стеллаж для инструментов +knowledge.tool_rack.desc=Храним оборудование +knowledge.tool_rack.1=Многие инструменты могут понадобиться, но их не окажется под рукой. На стеллажи можно вешать инструменты для быстрого доступа.^ПКМ инструментом по стеллажу, чтобы поместить его, и ПКМ рукой, чтобы взять.^Тяжёлое оружие требует второй стеллаж снизу, и древковое сверху. +knowledge.tool_rack.rules=*Тяжёлое оружие требует ещё один стеллаж снизу.^*Древковое оружие требует стеллажи сверху и снизу.^*Полноразмерные арбалеты считаются тяжёлым оружием.^*Арбалет нельзя повесить на крайний крючок. + +knowledge.bed_roll=Лежанка +knowledge.bed_roll.desc=Выбор путешественника +knowledge.bed_roll.1=Когда Вы в путешествии, Вам обязательно захочется поспать. Лежанка решает эту проблему и, к тому же, не переносит точку дома. + +knowledge.food_box=Продовольственный ящик +knowledge.food_box.desc=Еда в безопасности +knowledge.food_box.1=Еда и медикаменты должны быть всегда под рукой. Продовольственные ящики позволяют хранить еду и перевязки в количестве до стака. Нажмите ПКМ, чтобы убрать в ящик предмет, и ПКМ с голыми руками, чтобы его достать. + +knowledge.ammo_box=Ящик для боеприпасов +knowledge.ammo_box.desc=Всегда под рукой +knowledge.ammo_box.1=Боеприпасы всегда должны быть под рукой, особенно когда враг у ворот, и Вам прострелили колено. Такие ящики вмещают до 8 стаков стрел/болтов/бомб/мин. Нажмите ПКМ, чтобы убрать в ящик предмет, и ПКМ с голыми руками, чтобы его достать. +knowledge.ammo_box.2=Если сломать заполненный ящик, его содержимое не выпадет, и не пропадёт. Так что можно смело переносить ящики с боеприпасами. + +knowledge.big_box=Ящик для хранения +knowledge.big_box.desc=Некуда девать. +knowledge.big_box.1=Действует точно по тому же принципу, что и продовольственный ящик, только в ящик для хранения можно поместить любой предмет. Нажмите ПКМ, чтобы убрать в ящик предмет, и ПКМ с голыми руками, чтобы его достать. + +knowledge.generic_meat=Обычное мясо +knowledge.generic_meat.desc=Хорошо для всех рецептов +knowledge.generic_meat.1=Приготавливается из многих видов мяса для более удобного хранения и использования в рецептах. + +knowledge.stew=Фарш +knowledge.stew.desc=Вкусная смесь +knowledge.stew.1= Это еда для новичка, смесь измельчённого мяса. + +knowledge.jerky=Вяленое мясо +knowledge.jerky.desc=Специально для путешественника +knowledge.jerky.1=Эта еда хорошо восстанавливает выносливость, а также достаточно компактна в хранении. Идеально для долгих путешествий. + +knowledge.saussage=Сосиска +knowledge.saussage.desc=Мясо! +knowledge.saussage.1=Сосиски лучше вяленого и копчёного мяса! Только свежее, вкусное, упакованное... умм... Да, в кишки животных. + +knowledge.sandwitch=Бутерброды +knowledge.sandwitch.desc=Просто и вкусно +knowledge.sandwitch.1=Несмотря на то, что будерброды не стакаются, они могут быть использованы дважды. + +knowledge.sandwitchBig=Большой бутерброд +knowledge.sandwitchBig.desc=Для хороших работников +knowledge.sandwitchBig.1=Зачем резать хлеб на ломтики, когда можно положить много начинки между больших кусков хлеба? 4 использования. Папа может! + +knowledge.meatpie=Мясной пирог +knowledge.meatpie.desc=Сытно и прекрасно +knowledge.meatpie.1=Это сытная еда, дающая бонус к выносливости. Просто поставьте пирог куда-нибудь, и используйте на нём нож, чтобы получить его кусок! + +knowledge.shepardpie=Пастуший пирог +knowledge.shepardpie.desc=Впрочем, остальные его тоже едят +knowledge.shepardpie.1=Даже лучше мясного, ещё и с картошкой! Даёт большой бонус к выносливости. Просто поставьте пирог куда-нибудь, и используйте на нём нож, чтобы получить его кусок! + +knowledge.salt=Соль +knowledge.salt.desc=Добавить по вкусу +knowledge.salt.1=Для получения соли сначала добудьте немного солёной воды. ^Зачерпните её глиняным горшком. Солёная вода находится над блоками песка. Затем выпарьте воду! +knowledge.salt.2=Горшки позволяют носить соль и не рассыпать её. + +knowledge.jug=Кувшин +knowledge.jug.desc=Хранилище для жидкостей +knowledge.jug.1=Для переноски жидкостей вполне подойдёт глиняный кувшин. В нём можно хранить молоко, воду и масло. +knowledge.jug.2=Молоко не может быть получено напрямую от коров, его необходимо переливать из вёдер. + +knowledge.bread=Хлеб и тесто +knowledge.bread.desc=Вкусные зёрна +knowledge.bread.1=Хлеб - скудная пища сам по себе, но теперь его можно использовать и с другой едой. Мука используется для производства различных видов теста. +knowledge.bread.other=Некоторые продукты (как, например, хлеб) имеют альтернативные рецепты, но будут хуже, чем еда MineFantasy + +knowledge.oats=Каша +knowledge.oats.desc=Просто, но полезно +knowledge.oats.1=Смесь натуральных зерновых + +knowledge.icing=Сахар +knowledge.icing.desc=Не слипнется! +knowledge.icing.1=Для хранения сахара лучше использовать глиняные горшки, а не носить его в кармане вместе с грязью и слизью. +knowledge.icing.2=Некоторую еду невозможно представить без глазури, и сахар просто необходим! + +knowledge.sweetroll=Сладкий рулет +knowledge.sweetroll.desc=Не отдавай его Бучу! +knowledge.sweetroll.1=Вкусный рулетик, дающий бонусы к выносливости, да ещё и используемый дважды. + +knowledge.eclair=Эклер +knowledge.eclair.desc=Шикуем! +knowledge.eclair.1=Теперь можно и повыделываться.^К тому же, это пироженое может быть использовано 4 раза. + +knowledge.cake=Торт +knowledge.cake.desc=Сделанный правильно! +knowledge.cake.1=Большой торт, положительно влияющий на выносливость. Просто поставьте его куда-нибудь, и используйте на нём нож, чтобы получить его кусок! + +knowledge.carrotcake=Морковный пирог +knowledge.carrotcake.desc=Невкусно, но полезно +knowledge.carrotcake.1=Стандартный пирог, но с морковью. Просто поставьте пирог куда-нибудь, и используйте на нём нож, чтобы получить его кусок! + +knowledge.chococake=Шоколадный торт +knowledge.chococake.desc=Привет, жирок! +knowledge.chococake.1=Торт, покрытый шоколадом. Просто поставьте его куда-нибудь, и используйте на нём нож, чтобы получить его кусок! + +knowledge.bfcake=Торт "Чернолесье" +knowledge.bfcake.desc=Красиво и празднично +knowledge.bfcake.1=Покрыт шоколадом и ягодами, очень хорошо влияет на выносливость. Просто поставьте его куда-нибудь, и используйте на нём нож, чтобы получить его кусок! + +knowledge.berrypie=Ягодный пирог +knowledge.berrypie.desc=Простой десерт +knowledge.berrypie.1=Ягодный пирог, то - что надо! Просто поставьте пирог куда-нибудь, и используйте на нём нож, чтобы получить его кусок! + +knowledge.applepie=Яблочный пирог +knowledge.applepie.desc=Простой десерт +knowledge.applepie.1=Похож на ягодный, но чуть лучше. Просто поставьте пирог куда-нибудь, и используйте на нём нож, чтобы получить его кусок! + +knowledge.cheese=Сыр +knowledge.cheese.desc=Вкусномолочный продукт +knowledge.cheese.1=Сыр - продукт обработки молока и используется во многих рецептах. Просто поместите его куда-нибудь, и используйте на нём нож, чтобы получить кусок сыра. + +knowledge.cheeseroll=Сырный рулет +knowledge.cheeseroll.desc=Лёгкая закуска +knowledge.cheeseroll.1=Сыр хорошо идёт с хлебом. Поместите его в рулет, чтобы придать немного вкуса. + +knowledge.firepit=Костёр и плита +knowledge.firepit.desc=Основы приготовления пищи +knowledge.firepit.1=Костёр - самое простое средство для приготовления пищи.^Чтобы разжечь костёр, поставьте где-нибудь костровище, наложите туда брусков(ПКМ) и зажгите, к примеру, сухими камнями(ПКМ). +knowledge.firepit.2=Плиты хорошо подходят для приготовления пищи, их следует разместить над костром или горном.^Укладывайте сырую еду на плиту и приглядывайте за ней, иначе сгорит. Некоторые рецепты (например, тортов) требуют требуют низкой температуры, для достижения которой отлично подойдёт угольная пыль. +knowledge.firepit.3=Печи позволяют готовить и обычную еду, и что-то более изысканное (например, хлеб).^Так же в печах можно обжаривать ваши глиняные поделки, просто повысив температуру (более горючим топливом). +knowledge.firepit.4=Используйте костёр для простых рецептов, а для более сложных - горн, растопленный на угольной пыли. Для обжига керамики потребуется обычное топливо, например, уголь. + +knowledge.cookingutensil=Инструменты для готовки +knowledge.cookingutensil.desc=Повару - хороший инструмент! +knowledge.cookingutensil.1=Для готовки нужны особые вещи, такие как формы для выпекания тортов и пирогов. Для инструментов смотрите вкладку базовых инструментов. + +knowledge.bandage=Повязки +knowledge.bandage.desc=Первая помощь +knowledge.bandage.1=Иногда недостаточно прикрикнуть на тяжелораненого и сказать ему заткнуться и сжевать четырёх жареных кур. Используйте повязку ПКМ. Врочем, она не поможет, если Вы истощены, горите, тонете или вообще умерли. Такие вещи надо и самим понимать. + +knowledge.bandageadv=Крепкие повязки +knowledge.bandageadv.desc=Качественная медпомощь +knowledge.bandageadv.1=Эти дорогие, но качественные повязки могут залатать серьёзные повреждения. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/MASTERY TEXT/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +knowledge.title= +knowledge.title.desc= +knowledge.title.1= + +knowledge.fitness=Выносливость +knowledge.fitness.desc=Оставайтесь в форме +knowledge.fitness.1=Самый Ваш главный враг в битве - Ваше тщедушное тело. Однако теперь после долгих и частых нагрузок Вы устаёте на 25% медленнее. + +knowledge.toughness=Сила +knowledge.toughness.desc=Выкуси! +knowledge.toughness.1=Ваше постоянное участие в битвах научило вас не подставлять под удар жизненно важные органы.^Урон уменьшен на 25%. + +knowledge.armourpro=Мастерство ношения брони +knowledge.armourpro.desc=Почувствуй разницу +knowledge.armourpro.1=С прошествием времени Вы научились так двигаться в броне, чтобы меньше уставать.^Влияние брони на Вашу выносливость снижено. + +knowledge.parrypro=Тактика парирования +knowledge.parrypro.desc=Следите за движениями +knowledge.parrypro.1=Позиция на поле боя - важное преимущество.^Удерживание shift при парировании позволяет Вам прыгнуть вперёд, парируя удар, и переместиться за спину к оппоненту. + +knowledge.counteratt=Контратака +knowledge.counteratt.desc=Ответный удар +knowledge.counteratt.1=Парирование защищает вас, но нарушает Ваше рановесие, но теперь Вы достаточно опытны, чтобы обратить недостаток в преимущество.^Сразу после парирования Вы можете атаковать, нанеся чуть меньший урон, чем обычно. +knowledge.counteratt.2=Мечи, кинжалы и катаны могут выполнить коющий удар.^Боевые топоры выполняют дробящий удар.^Тяжёлое оружие наносит сильный удар.^Дробящее оружие и шестовое оружие не даёт эффекта. + +knowledge.autoparry=Парирование на рефлексах +knowledge.autoparry.desc=Всегда готов! +knowledge.autoparry.1=Ваша постоянная практика привела к выработке рефлексов.^Вы можете парировать атаки без нажатия ПКМ, но под меньшим углом. + +knowledge.scrapper=Мусорщик +knowledge.scrapper.desc=Возьми всё это! +knowledge.scrapper.1=Ваши начинания в ремесленном деле не прошли даром, теперь вы понимаете, что некоторые вещи можно использовать дважды. ^Теперь вы возвращаете больше сырья при разборке. + +knowledge.firstaid=Первая помощь +knowledge.firstaid.desc=Склонен к ранениям +knowledge.firstaid.1=Вы должны быть предельно быстры и аккуратны во время перевязки, чтобы вы или ваш пациент не истекли кровью. ^Повязки теперь накладываются значительно быстрее. + +knowledge.doctor=Доктор +knowledge.doctor.desc=Спасая жизни +knowledge.doctor.1=Постоянная врачебная практика помогла Вам увеличить эффективность использования повязок. Теперь вы излечиваете ими на 50% лучше. + From b2bab32e782fd28c21cee66e655b21bb74c06929 Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 7 Jun 2017 15:28:51 +0700 Subject: [PATCH 005/101] Various fixes Fixed API access (for NEI plugin). Still need rewriting. Fixed baking temp --- .../java/minefantasy/mf2/api/refine/Alloy.java | 4 ++-- .../mf2/api/refine/BlastFurnaceRecipes.java | 4 ++-- .../minefantasy/mf2/recipe/CookingRecipes.java | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/minefantasy/mf2/api/refine/Alloy.java b/src/main/java/minefantasy/mf2/api/refine/Alloy.java index ea043067..fa96ff71 100644 --- a/src/main/java/minefantasy/mf2/api/refine/Alloy.java +++ b/src/main/java/minefantasy/mf2/api/refine/Alloy.java @@ -15,8 +15,8 @@ public class Alloy{ public final List recipeItems; - private final ItemStack recipeOutput; - private final int level; + public final ItemStack recipeOutput; + public final int level; private Map props = new HashMap(); public Alloy(ItemStack output, int requiredLevel, List items) diff --git a/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java b/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java index 98432252..a6c8cc83 100644 --- a/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java +++ b/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java @@ -15,7 +15,7 @@ public class BlastFurnaceRecipes { private static final BlastFurnaceRecipes smeltingBase = new BlastFurnaceRecipes(); /** The list of smelting results. */ - private Map smeltingList = new HashMap(); + private Map smeltingList = new HashMap(); /** * Used to call methods addSmelting and getSmeltingResult. @@ -71,7 +71,7 @@ private boolean func_151397_a(ItemStack p_151397_1_, ItemStack p_151397_2_) return p_151397_2_.getItem() == p_151397_1_.getItem() && (p_151397_2_.getItemDamage() == 32767 || p_151397_2_.getItemDamage() == p_151397_1_.getItemDamage()); } - public Map getSmeltingList() + public Map getSmeltingList() { return this.smeltingList; } diff --git a/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java b/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java index edcf7125..67cc91e6 100644 --- a/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java @@ -25,7 +25,7 @@ public static void init() bake(FoodListMF.dough, FoodListMF.breadroll, 150, 300, 10, 20, true); bake(FoodListMF.raw_bread, Items.bread, 150, 300, 20, 40, true); bake(FoodListMF.curds, FoodListMF.cheese_pot, 100, 300, 60, 20, false); - bake(FoodListMF.sweetroll_raw, FoodListMF.sweetroll_uniced, 180, 250, 20, 10, true); + bake(FoodListMF.sweetroll_raw, FoodListMF.sweetroll_uniced, 150, 250, 20, 10, true); bake(FoodListMF.pie_pumpkin_uncooked, FoodListMF.pie_pumpkin_cooked,150, 300, 20, 20, FoodListMF.burnt_pie); bake(FoodListMF.pie_apple_uncooked, FoodListMF.pie_apple_cooked, 150, 300, 25, 20, FoodListMF.burnt_pie); @@ -33,12 +33,12 @@ public static void init() bake(FoodListMF.pie_meat_uncooked, FoodListMF.pie_meat_cooked, 150, 300, 30, 20, FoodListMF.burnt_pie); bake(FoodListMF.pie_shepard_uncooked, FoodListMF.pie_shepard_cooked,150, 300, 30, 20, FoodListMF.burnt_pie); - bake(FoodListMF.cake_simple_raw, FoodListMF.cake_simple_raw, 180, 250, 30, 30, FoodListMF.burnt_cake); - bake(FoodListMF.cake_raw, FoodListMF.cake_raw, 180, 250, 40, 20, FoodListMF.burnt_cake); - bake(FoodListMF.cake_choc_raw, FoodListMF.cake_choc_raw, 180, 250, 40, 20, FoodListMF.burnt_cake); - bake(FoodListMF.cake_carrot_raw, FoodListMF.cake_carrot_raw, 180, 250, 40, 20, FoodListMF.burnt_cake); - bake(FoodListMF.cake_bf_raw, FoodListMF.cake_bf_raw, 180, 250, 50, 10 , FoodListMF.burnt_cake); - bake(FoodListMF.eclair_raw, FoodListMF.eclair_uniced, 180, 250, 60, 5 , true); + bake(FoodListMF.cake_simple_raw, FoodListMF.cake_simple_uniced, 150, 250, 30, 30, FoodListMF.burnt_cake); + bake(FoodListMF.cake_raw, FoodListMF.cake_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); + bake(FoodListMF.cake_choc_raw, FoodListMF.cake_choc_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); + bake(FoodListMF.cake_carrot_raw, FoodListMF.cake_carrot_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); + bake(FoodListMF.cake_bf_raw, FoodListMF.cake_bf_uniced, 150, 250, 50, 10 , FoodListMF.burnt_cake); + bake(FoodListMF.eclair_raw, FoodListMF.eclair_uniced, 150, 250, 60, 5 , true); addCeramics(); MineFantasyAPI.addCookingRecipe(new ItemStack(FoodListMF.generic_meat_mince_uncooked), From e1243f1fabb52411bd809bdda5b1f8daa81eeb47 Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 7 Jun 2017 15:56:08 +0700 Subject: [PATCH 006/101] Fix .gitignore Need rework --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 63c3de5b..51754332 100644 --- a/.gitignore +++ b/.gitignore @@ -53,7 +53,7 @@ Temporary Items .gradle/2.0/taskArtifacts/cache.properties .gradle/2.0/taskArtifacts/cache.properties.lock *.bin -.gradle/gradle.log +.gradle/* .project .settings/org.eclipse.jdt.core.prefs CREDITS-fml.txt From 22a521c70f5e5ce4563fd96af337a920f199951c Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 7 Jun 2017 16:01:22 +0700 Subject: [PATCH 007/101] Mark it as 2.8.13 unofficial --- build.gradle | 2 +- src/main/java/minefantasy/mf2/MineFantasyII.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index cf226c95..9fbb506b 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { apply plugin: 'forge' -version = "2.8.12" +version = "2.8.13u" group= "minefantasy.mf2.minefantasy2" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "MineFantasyII" diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 548ff782..cc0a2380 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -59,7 +59,7 @@ public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; - public static final String VERSION = "Alpha_2.8.12"; + public static final String VERSION = "Alpha_2.8.13u"; public static final WorldGenMFBase worldGenManager = new WorldGenMFBase(); @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") From 3aa5d1bdc7c8e0524d7c32d6811b5f8093a6c0d2 Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 7 Jun 2017 16:03:39 +0700 Subject: [PATCH 008/101] Added chinese translation by https://github.com/Snownee --- .../assets/minefantasy2/lang/zh_CN.lang | 2245 +++++++++++++++++ 1 file changed, 2245 insertions(+) create mode 100644 src/main/resources/assets/minefantasy2/lang/zh_CN.lang diff --git a/src/main/resources/assets/minefantasy2/lang/zh_CN.lang b/src/main/resources/assets/minefantasy2/lang/zh_CN.lang new file mode 100644 index 00000000..83f9dd66 --- /dev/null +++ b/src/main/resources/assets/minefantasy2/lang/zh_CN.lang @@ -0,0 +1,2245 @@ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/INFORMATION/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +forge.fuel.name=~燃料~ +vehicle.fuel.name=燃料:%1$s +info.bow.reload=潜行状态下右键打开火器。 +info.firearm.ammo=%1$s/%2$s + +attribute.kit.salvage.name=回收调节 + +attribute.kit.repairRate.name=修复值 +attribute.kit.repairRate_enchant.name=修复值 (附魔物品) +attribute.kit.repairRate_normal.name=修复值 (普通物品) + +attribute.kit.repairChance.name=修复成功率 +attribute.kit.breakChance.name=修复失败率 + +attribute.inferior.name=次品 +attribute.superior.name=精品 + +item.infobook.name=研究手册 +item.research_scroll.name=研究卷轴 +item.research_scroll_complete.name=研究完成 + +item.talisman_lesser.name=小型知识护符 +item.talisman_greater.name=大型知识护符 + +prospect.canmine=你可以采集它!(工具:%1$s | 方块:%2$s) +prospect.cannotmine=你无法采集它!(工具:%1$s | 方块:%2$s) +gui.information=研究 +information.discovered=已研究 +information.buy=点击研究 +knowledge.unknownUse=你不知道如何使用它! +knowledge.known=你已经知道这个了 + +infoPage.basic=基本信息 +infoPage.artisanry=手艺 +infoPage.construction=建造 +infoPage.provisioning=食物 +infoPage.engineering=工程 +infoPage.mastery=精通 +infoPage.dwarvern=矮人 +infoPage.gnomish=侏儒 + +knowledge.unlocked=研究完毕 + +vehicle.noArmour=你的衣服磨损的太厉害了,不能再穿这个。 +vehicle.tooBigArmour=你穿的衣服太厚了,挤不进这套装甲。 + +research.noskill=你也许能从中学到什么,如果你更精于此道的话。 +research.null=这里面已经没有可学的了。 + +research.addArtefact=习得 %1$s 的知识 (%2$s/%3$s) +research.finishResearch=完成 %1$s 研究 +research.cluecount=(%1$s/%2$s) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/MOBS/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +entity.MF_Minotaur.name=牛头人 +entity.MF_Dragon.name=龙 +death.attack.dragonstomp=%1$s 被 龙 踩死了 +death.attack.humanstomp=%1$s 被 %2$s 踩死了 +death.attack.fireblast=%1$s 被 %2$s 烤熟了 +death.attack.fireblastBase=%1$s 被烤熟了 +death.attack.blastfurn=%1$s 被高炉焚烧 +death.attack.frostblast=%1$s 被 %2$s 冻结了 +death.attack.frostblastBase=%1$s 被冻结了 +death.attack.acidblast=%1$s 被 %2$s 蒸发了 +death.attack.acidblastBase=%1$s 蒸发了 +death.attack.ashblast=%1$s 被 %2$s 活埋了 +death.attack.ashblastBase=%1$s 被活埋 + +death.attack.mob.pound=%1$s 被 %2$s 袭击了 +death.attack.mob.gore=%1$s 被 %2$s 刺伤了 +death.attack.mob.beserk=%1$s 被 %2$s 撕裂了 + +entity.minotaur.name=小牛头人 +entity.minotaur_guard.name=牛头人战士 +entity.minotaur_elite.name=牛头人精英 +entity.minotaur_boss.name=牛头人领主 + +entity.frostminotaur.name=小冰霜牛头人 +entity.frostminotaur_guard.name=冰霜牛头战士 +entity.frostminotaur_elite.name=冰霜牛头精英 +entity.frostminotaur_boss.name=冰霜牛头领主 + +entity.dredminotaur.name=小恐怖牛头人 +entity.dreadminotaur_guard.name=恐怖牛头拳击手 +entity.dreadminotaur_elite.name=恐怖牛头惩罚者 +entity.dreadminotaur_boss.name=恐怖牛头死亡霸主 + +entity.dragonbreed.red.name=赤炎 +entity.dragonbreed.white.name=冰霜 +entity.dragonbreed.black.name=梦魇 +entity.dragonbreed.green.name=绿沼 +entity.dragonbreed.ash.name=灰烬 + +entity.dragon_young.name=幼年%1$s巨龙 +entity.dragon.name=青年%1$s巨龙 +entity.dragon_mature.name=壮年%1$s巨龙 +entity.dragon_elder.name=老年%1$s巨龙 +entity.dragon_ancient.name=远古%1$s巨龙 + +event.dragonnear.name=一只巨龙在附近徘徊,寻找掩护或者准备战斗! +event.dragonnear.forge.name=你的手艺侮辱了龙类! +event.dragonaway.name=巨龙已经离开……眼下…… + +entity.hound.name=猎犬 + +item.spawn_dragon.name=生成 龙 +item.spawn_dragon.desc=无情的有翼蜥蜴。 +item.spawn_minotaur.name=生成 牛头人 +item.spawn_minotaur.desc=残忍且冲动的物种。 +item.spawn_hound.name=生成 猎犬 +item.spawn_hound.desc=各具特点的精干猎犬。 +item.spawn_cogwork.name=生成 机甲 +item.spawn_cogwork.desc=超高强度的机械化装备。 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/TOOL LIST/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.tool_pick.name=%1$s镐 +item.commodity_plank.name=%1$s木材 +item.haft.name=柄 +item.commodity_hunk.name=%1$s片 +item.commodity_scrap.name=%1$s废料 +item.commodity_plate.name=%1$s板 +item.commodity_bar.name=%1$s条 +item.commodity_plate_huge.name=大型%1$s板 +item.commodity_chainmesh.name=%1$s链网 +item.commodity_scalemesh.name=%1$s鳞网 +item.commodity_splintmesh.name=%1$s板网 +item.commodity_plateheavy.name=重型%1$s板 +item.commodity_arrowhead.name=%1$s箭头 +item.commodity_bodkinhead.name=%1$s穿甲箭头 +item.commodity_broadhead.name=%1$s宽型箭头 +item.commodity_cogwork_armour.name=%1$s外骨骼装甲 + +item.mod_plating.name=%1$s镀层 +item.mod_head.name=%1$s头 +item.mod_haft.name=%1$s柄 +item.mod_joint.name=%1$s关节 + +component.head.name=%1$s头 +component.shaft.name=%1$s轴 +component.grip.name=%1$s握把 +component.brace.name=%1$s支架 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/MATERIAL LIST/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +materialtype.wood.name=木材等级:%1$s +materialtype.leather.name=皮革等级:%1$s +materialtype.metal.name=金属等级:%1$s +materialtype.workable.name=锻造温度:%1$s*C - %2$s*C + +materialtype.resist.name=%1$s 抗性 +materialtype.fireresist.name=%1$s 火焰抗性 +materialtype.maxtemp.name=%1$s*C 熔点 +material.any.name=任何 + +WOOD +material.scrapwood.name=废木 +material.oakwood.name=橡木 +material.birchwood.name=桦木 +material.sprucewood.name=云杉木 +material.acaciawood.name=金合欢木 +material.junglewood.name=丛林木 +material.refinedwood.name=精制木 +material.ironbarkwood.name=桉木 +material.ebonywood.name=黑檀木 +material.darkoakwood.name=深色橡木 +material.pinewood.name=松木 +material.cherrywood.name=樱桃木 +material.poplarwood.name=白杨木 +material.maplewood.name=枫木 +material.mahoewood.name=沉香木 +material.greenheartwood.name=青心木 +material.palmwood.name=棕榈木 +material.limewood.name=椴木 +material.balsawood.name=巴沙木 +material.walnutwood.name=胡桃木 +material.chestnutwood.name=栗木 +material.larchwood.name=落叶松木 +material.willowwood.name=柳木 +material.teakwood.name=柚木 +material.sequoiawood.name=红杉木 +material.mahoganywood.name=桃花心木 +material.wengewood.name=鸡翅木 +material.redwoodwood.name=红木 +material.firwood.name=冷杉木 +material.purpleheartwood.name=紫心木 +material.silverwoodwood.name=银木 +material.greatwoodwood.name=宏伟之木 +material.yewwood.name=紫杉木 + + + +LEATHER +material.leather.name=皮革 +material.hardleather.name=硬化皮革 +material.minotaurskin.name=牛头人皮革 +material.dragonskin.name=龙皮 + +METAL +material.copper.name=铜 +material.tin.name=锡 + +material.bronze.name=青铜 +material.iron.name=铁 +material.refinediron.name=精铁 +material.steel.name=钢 +material.tungsten.name=黑钨 +material.obsidian.name=黑曜石钢 +material.encrusted.name=镶钻钢 +material.blacksteel.name=黑钢 +material.redsteel.name=赤钢 +material.bluesteel.name=蓝钢 + +material.adamantium.name=艾德曼合金 +material.mithril.name=秘银 +material.ignotumite.name=依格洛特 +material.mithium.name=传说 +material.ender.name=末影 + +PRECIOUS +material.gold.name=金 +material.silver.name=银 + +NON-MF +material.bismuth.name=铋 +material.bismuthbronze.name=铋青铜 +material.nickel.name=镍 +material.titanium.name=钛 +material.stainlesssteel.name=不锈钢 + +ALLOY +material.compositealloy.name=复合合金 + +MOD +material.thaumium.name=神秘 +material.void.name=虚空 +material.manasteel.name=魔力钢 +material.elvenelementium.name=源质 +material.terrasteel.name=泰拉钢 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/ITEM STATS/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +prefix.hotitem.name=加热的%1$s +state.workable=可锻造 +state.unstable=不可锻造 +attribute.weightt.name=重量:%1$st +attribute.weightKg.name=重量:%1$sKg +attribute.weightg.name=重量:%1$sg +attribute.nomfcrafttier.name=任何等级 +attribute.mfcrafttier.name=工具等级 +attribute.mfcrafttool.name=工具类别 +attribute.mfcrafteff.name=工具效率 +attribute.mfcraftedbyname.name=制作者 +tooltype.hammer=锤 +tooltype.hvyHammer=重锤 +tooltype.saw=锯 +tooltype.knife=匕首 +tooltype.needle=针 +tooltype.mallet=槌 +tooltype.spoon=勺 +tooltype.hands=徒手 +tooltype.spanner=扳手 +tooltype.shears=剪刀 +tooltype.brush=油漆刷 + +tooltype.anvil=砧 +tooltype.carpenter=木匠工作台 + +attribute.weapon.penetrateArmor=破甲 +attribute.weapon.daze=眩晕 +attribute.weapon.extendedReach=攻击距离 +attribute.weapon.attackSpeed=攻击速度 +attribute.weapon.backstab=背刺 +attribute.weapon.mountedBonus=骑乘加成 +attribute.weapon.joustDam=骑乘伤害 +attribute.shield.block.time=s 格挡 +attribute.shield.arrow.count=箭 +attribute.quiver.arrow.empty=空 +attribute.quiver.arrow.count=箭 + +attribute.armour.protection=护甲值 +attribute.armour.light=轻型盔甲 +attribute.armour.medium=中型盔甲 +attribute.armour.heavy=重型盔甲 +attribute.weight.name=重量 + +attribute.bowPower.name=伤害倍数 x%1$s +attribute.arrowPower.name=伤害 + +attribute.armour.rating.0=斩击防护: +attribute.armour.rating.1=打击防护: +attribute.armour.rating.2=突刺防护: + +attribute.armour.cuttingresistance=斩击抗性 +attribute.armour.bluntresistance=打击抗性 +attribute.armour.piercingresistance=突刺抗性 + +attribute.weapon.cutting=斩击伤害 +attribute.weapon.blunt=打击伤害 +attribute.weapon.piercing=突刺伤害 + +attribute.armour.dtcutting=斩击阈值 +attribute.armour.dtblunt=打击阈值 +attribute.armour.dtpiercing=突刺阈值 + +arrow.head.normal.name=常规箭头 +arrow.head.bodkin.name=穿甲箭头 +arrow.head.broad.name=宽箭头 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/COMMODITY/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.plank.name=木材 +item.plant_oil.name=植物油 +item.plankRefined.name=精制木材 +item.rivet.name=铆钉 +item.nail.name=钉子 +item.thread.name=丝线 +item.lime_rock.name=石灰岩 +item.borax_rock.name=硼砂 +item.flux.name=熔剂 +item.flux_strong.name=强力熔剂 +item.coal_prep.name=精煤 +item.coke.name=焦炭 +item.blackpowder.name=黑火药 +item.blackpowder_advanced.name=高级黑火药 +item.bolt.name=螺栓 +item.flux_pot.name=优良熔剂 +item.coal_flux.name=含煤熔剂 + +item.ingotCopper.name=铜锭 +item.ingotTin.name=锡锭 +item.ingotBronze.name=青铜锭 +item.ingotPigIron.name=生铁锭 +item.ingotSteel.name=钢锭 +item.ingotEncrusted.name=镶钻钢锭 +item.ingotObsidian.name=黑曜石钢锭 +item.ingotSilver.name=银锭 +item.ingotPureGold.name=纯金锭 +item.ingotCompositeAlloy.name=复合合金锭 +item.ingotBlackSteelWeak.name=未精炼的黑钢 +item.ingotBlueSteelWeak.name=未精炼的蓝钢 +item.ingotRedSteelWeak.name=未精炼的赤钢 + +item.ingotRedSteel.name=赤钢锭 +item.ingotBlackSteel.name=黑钢锭 +item.ingotBlueSteel.name=蓝钢锭 + +item.ingotAdamantium.name=艾德曼锭 +item.ingotMithril.name=秘银锭 + +item.ingotIgnotumite.name=依格洛特锭 +item.ingotMithium.name=传说锭 + +item.ingotEnder.name=末影锭 + +item.ingotTungsten.name=黑钨锭 + +item.loot_sack.name=战利品 +item.loot_sack_uc.name=贵重的战利品 +item.loot_sack_rare.name=精致的战利品 + +item.copper_coin.name=铜币 +item.silver_coin.name=银币 +item.gold_coin.name=金币 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/COMPONENT/ +item.ingot_mould.name=锭模 +item.ingot_mould_uncooked.name=未加工的锭模 + +item.clay_pot.name=陶壶 +item.clay_pot_uncooked.name=未加工的陶壶 + +item.jug_empty.name=空罐子 +item.jug_uncooked.name=未加工的罐子 +item.jug_water.name=水罐 +item.jug_milk.name=牛奶罐 + +tile.salvage_basic.name=基础回收站 +tile.salvage_advanced.name=高级回收站 + +tile.repair_basic.name=基础维修工具 +tile.repair_advanced.name=高级维修工具 +tile.repair_ornate.name=华丽维修工具 + +item.rawhideSmall.name=小型兽皮 +item.rawhideMedium.name=中型兽皮 +item.rawhideLarge.name=大型兽皮 + +item.leather_strip.name=皮革条 +item.hideSmall.name=干净的小型兽皮 +item.hideMedium.name=干净的中型兽皮 +item.hideLarge.name=干净的大型兽皮 + +item.vine.name=藤蔓 +item.sharp_rock.name=锋利的岩石 + +item.iron_prep.name=处理好的铁矿石 +item.diamond_shards.name=钻石碎片 +item.diamond_dust.name=钻石粉 +item.obsidian_rock.name=黑曜岩 +item.fletching.name=箭羽 + +item.coalDust.name=煤粉 +item.nitre.name=硝石 +item.sulfur.name=硫黄 +item.bomb_casing_uncooked.name=粘土炸弹壳 +item.bomb_casing.name=炸弹壳 +item.mine_casing_uncooked.name=粘土地雷壳 +item.mine_casing.name=地雷壳 +item.shrapnel.name=弹片 +item.magma_cream_refined.name=精制岩浆膏 +item.bomb_fuse.name=导火索 +item.bomb_fuse_long.name=加长导火索 +item.bomb_casing_iron.name=铁炸弹壳 +item.mine_casing_iron.name=铁地雷壳 +item.bomb_casing_obsidian.name=黑曜石炸弹壳 +item.mine_casing_obsidian.name=黑曜石地雷壳 +item.bomb_casing_crystal.name=水晶炸弹壳 +item.mine_casing_crystal.name=水晶地雷壳 +item.bomb_casing_arrow.name=箭头弹壳 +item.bomb_casing_bolt.name=螺栓弹壳 + +item.clay_brick.name=粘土砖 +item.kaolinite.name=高岭石 +item.kaolinite_dust.name=高岭石粉 +item.fireclay.name=耐火粘土 +item.fireclay_brick.name=耐火粘土砖 +item.strong_brick.name=耐火砖 + +item.oreCopper.name=原铜矿 +item.oreTin.name=原锡矿 +item.oreIron.name=原铁矿 +item.oreSilver.name=原银矿 +item.oreGold.name=原金矿 +item.oreTungsten.name=原黑钨矿 + +item.dragon_heart.name=龙心 +item.ornate_items.name=华丽纹章 + +item.iron_frame.name=铁框架 +item.iron_strut.name=铁压杆 +item.bronze_gears.name=青铜齿轮组 +item.tungsten_gears.name=复杂的齿轮组 +item.steel_tube.name=钢管 +item.cogwork_shaft.name=齿轮轴 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/GADGET/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.spyglass.name=望远镜 +item.climbing_pick_basic.name=登山镐 +item.parachute.name=降落伞 +item.syringe_empty.name=空的注射器 + +tile.cogwork_helm.name=外骨骼头盔座 +tile.cogwork_chest.name=外骨骼胸甲座 +tile.cogwork_legs.name=外骨骼胫甲座 +tile.frame_block.name=框架座 +tile.cogwork_builder.name=机甲钩 + +item.cogwork_pulley.name=机甲滑轮 + +bomb.component.name=炸弹组件 +bomb.component.filling=填充 +bomb.component.bombcase=炸弹外壳 +bomb.component.minecase=地雷外壳 +bomb.component.arrow=弓箭外壳 +bomb.component.bolt=弩箭外壳 +bomb.component.fuse=导火索 +bomb.component.powder=粉末 + +crossbow.component.name=弩弓组件 +crossbow.component.stock=弩臂 +crossbow.component.mechanism=弩弓 +crossbow.component.mod=配件 +crossbow.component.muzzle=弩头 + +item.bomb_crude.name=粗制炸弹 +item.bomb_basic.name=炸弹 +item.bomb_shrapnel.name=弹片炸弹 +item.bomb_fire.name=燃烧弹 +item.exploding_arrow.name=爆炸箭 +item.exploding_bolt.name=爆炸弩箭 + +item.mine_basic.name=地雷 +item.mine_shrapnel.name=弹片地雷 +item.mine_fire.name=燃烧地雷 + +death.attack.mine=%1$s 踩到了地雷 +death.attack.bomb.thrown=%1$s被%2$s炸死了 +death.attack.bomb=%1$s被一个炸弹炸死了 +death.attack.bomb.suicide=%1$s炸死了自己…… + +bomb.powder.blackpowder.name=装填黑火药 +bomb.powder.advBlackpowder.name=装填高级黑火药 +bomb.fuse.basic.name=导火索 +bomb.fuse.long.name=加长导火索 +bomb.case.crude.name=纸壳 +bomb.case.ceramic.name=陶瓷壳 +bomb.case.iron.name=铁壳 +bomb.case.obsidian.name=黑曜石壳 +bomb.case.crystal.name=水晶壳 +bomb.damage.name=爆炸伤害 +bomb.range.metric.name=爆炸范围:%1$s 米 +bomb.fusetime.name=点燃时间:%1$s 秒 +bomb.case.sticky=粘性 + +gui.bombcraftmf.name=制作炸弹 +gui.crossbowcraftmf.name=制作弩弓 + +attribute.crossbow.power.name=伤害系数 x%1$s +attribute.crossbow.speed.name= %1$ss +attribute.crossbow.spread.name=射击范围 x%1$s +attribute.crossbow.recoil.name=后坐力 x%1$s +attribute.crossbow.capacity.name= %1$s +attribute.crossbow.bash.name= %1$s + +crosspart.stock.cross_stock_wood=木弩 +crosspart.stock.cross_stock_iron=铁弩 +crosspart.stock.cross_handle_wood=手弩 +crosspart.mechanism.cross_arms_light=轻型 +crosspart.mechanism.cross_arms_heavy=重型 +crosspart.mechanism.cross_arms_advanced=高级 +crosspart.mod.cross_ammo=换弹 +crosspart.mod.cross_scope=瞄准 + +item.cross_stock_wood.name=基础弩臂 +item.cross_handle_wood.name=手弩把手 +item.cross_stock_iron.name=高级弩臂 +item.cross_arms_light.name=轻型弩弓 +item.cross_arms_basic.name=弩弓 +item.cross_arms_heavy.name=重型弩弓 +item.cross_arms_advanced.name=高级弩弓 +item.cross_ammo.name=连弩弩机 +item.cross_scope.name=弓弩瞄准镜 +item.cross_bayonet.name=弓弩刺刀 + +item.cross_stock_wood.desc=标准。 +item.cross_handle_wood.desc=快速换弹,更多的后坐力和扩散。 +item.cross_stock_iron.desc=降低后坐力。 +item.cross_arms_light.desc=更低的伤害和后坐力,射速快。 +item.cross_arms_basic.desc=标准。 +item.cross_arms_heavy.desc=更高的伤害和后坐力,射速慢。 +item.cross_arms_advanced.desc=更高的精度和伤害,但射速慢,后坐力大。 +item.cross_ammo.desc=6x 弹药容量,增加扩散。 +item.cross_scope.desc=增加缩放功能。 +item.cross_bayonet.desc=增加近战伤害,减少后坐力,换弹变慢。 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/ORES/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +tile.oreCopper.name=铜矿石 +tile.oreTin.name=锡矿石 +tile.oreSilver.name=银矿石 +tile.oreTungsten.name=黑钨矿石 +tile.oreMythic.name=传说矿石 +tile.oreMythicPure.name=纯净传说矿石 + +tile.oreClay.name=含粘土的泥土 +tile.oreBorax.name=硼砂矿石 +tile.oreKaolinite.name=高岭石矿石 +tile.oreNitre.name=硝石矿石 +tile.oreSulfur.name=硫磺矿石 +tile.oreCoalRich.name=富煤矿石 + +tile.window.name=窗户 +tile.window_pane.name=窗板 +tile.mud_pavement.name=粗泥砖 +tile.mud_pavement_stair.name=粗泥砖台阶 +tile.mud_brick.name=泥砖 +tile.mud_brick_stair.name=泥砖台阶 +tile.thatch.name=茅草 +tile.thatch_stair.name=茅草楼梯 + +tile.limestone.name=石灰岩 +tile.limestone_cobblestone.name=石灰圆石 +tile.limestone_brick.name=石灰岩砖 +tile.limestone_pavement.name=石灰岩铺路石 +tile.limestone_stair.name=石灰岩楼梯 +tile.limestone_cobblestone_stair.name=石灰圆石楼梯 +tile.limestone_brick_stair.name=石灰岩砖楼梯 +tile.limestone_pavement_stair.name=石灰岩铺路石楼梯 + +tile.slate.name=板岩 +tile.slate_cobblestone.name=板岩圆石 +tile.slate_brick.name=板岩石砖 +tile.slate_pavement.name=板岩铺路石 +tile.slate_stair.name=板岩楼梯 +tile.slate_cobblestone_stair.name=板岩圆石楼梯 +tile.slate_brick_stair.name=板岩石砖楼梯 +tile.slate_pavement_stair.name=板岩铺路石楼梯 + +tile.framed_glass.name=带框架的玻璃 +tile.framed_pane.name=带框架的玻璃板 +tile.firebricks.name=耐火石砖 +tile.firebrick_stair.name=耐火石砖台阶 +tile.cobble_pavement.name=圆石铺路石 +tile.cobble_pavement_stair.name=圆石铺路石台阶 +tile.cobble_brick.name=圆石砖 +tile.cobble_brick_stair.name=圆石砖台阶 +tile.clayWall.name=粘土墙板 +tile.ironbark_log.name=桉木 +tile.ebony_log.name=黑檀木 +tile.yew_log.name=紫衫木 +tile.ironbark_leaves.name=桉树树叶 +tile.ebony_leaves.name=黑檀树树叶 +tile.yew_leaves.name=紫衫树树叶 +tile.ironbark_sapling.name=桉树苗 +tile.ebony_sapling.name=黑檀树树苗 +tile.yew_sapling.name=紫衫树苗 +tile.ironbark_planks.name=桉木板 +tile.ebony_planks.name=乌木木板 +tile.yew_planks.name=紫衫木板 +tile.ironbark_stair.name=桉木楼梯 +tile.ebony_stair.name=黑檀木楼梯 +tile.yew_stair.name=紫衫木楼梯 + +tile.nailed_planks.name=钉制木板 +tile.refined_planks.name=精致钉制木板 +tile.nailed_planks_stair.name=钉制木板台阶 +tile.refined_planks_stair.name=精致钉制木板台阶 + +tile.reinforced_stone_base.name=强化石头 +tile.reinforced_stone_engraved.name=錾制强化石头 + +tile.reinforced_stone_bricks_base.name=强化石砖 +tile.reinforced_stone_bricks_cracked.name=强化裂石砖 +tile.reinforced_stone_bricks_mossy.name=强化苔石砖 + +tile.reinforced_stone_framed.name=加固强化石头 +tile.reinforced_stone_stair.name=强化石头台阶 +tile.reinforced_stone_brick_stair.name=强化石砖台阶 + +tile.bronze_bars.name=青铜栅栏 +tile.iron_bars.name=铁栅栏 +tile.steel_bars.name=钢栅栏 +tile.dragonforge_bars.name=龙铸栅栏 +tile.redsteel_bars.name=赤钢栅栏 +tile.blacksteel_bars.name=黑钢栅栏 +tile.bluesteel_bars.name=蓝钢栅栏 + +tile.copper_block.name=铜块 +tile.tin_block.name=锡块 +tile.silver_block.name=银块 +tile.pigiron_block.name=生铁块 + +tile.bronze_block.name=青铜块 +tile.steel_block.name=钢块 +tile.dragonforge_block.name=龙铸块 +tile.redsteel_block.name=红钢块 +tile.blacksteel_block.name=黑钢块 +tile.bluesteel_block.name=蓝钢块 + +tile.adamantium_block.name=艾德曼合金块 +tile.mithril_block.name=秘银块 +tile.ignotumite_block.name=依格洛特块 +tile.mithium_block.name=传说块 + +tile.ender_block.name=末影块 + +tile.forge.stone.name=石头锻造炉 +tile.forge.metal.name=高级锻造炉 +tile.bloomery.name=冶炼炉 +tile.crucible.stone.name=石坩埚 +tile.crucible.fireclay.name=耐火坩埚 +tile.crucible.auto.name=高级坩埚 +tile.crucible.mythic.name=古法坩埚 +tile.crucible.master.name=大师级古法坩埚 + +tile.chimney.stone.name=石头烟囱 +tile.chimney.stone.wide.name=加宽石头烟囱 +tile.chimney.stone_extractor.wide.name=石头排烟器 +tile.chimney.pipe.name=排烟管道 +tile.bellows.name=风箱 +tile.tanner.name=简陋的制革架 +tile.tannerStrong.name=制革架 +tile.tannerMetal.name=高级制革架 +tile.bombBench.name=炸弹组装台 +tile.crossbowBench.name=弓弩组装台 +tile.bombPress.name=炸弹组装机 +tile.carpenterBench.name=木匠工作台 +tile.researchStation.name=研究台 +tile.quern.name=手推磨 +tile.anvilStone.name=石砧 +tile.anvilBronze.name=青铜砧 +tile.anvilIron.name=铁砧 +tile.anvilSteel.name=钢砧 +tile.anvilBlackSteel.name=黑钢砧 +tile.anvilRedSteel.name=赤钢砧 +tile.anvilBlueSteel.name=蓝钢砧 +tile.furnace_stone.name=火炉 +tile.furnace_heater.name=火炉加热器 +tile.blastfurnchamber.name=高炉炉室 +tile.blastfurnheater.name=高炉加热器 + +tile.firepit.name=火塘 +tile.food_roast_basic.name=烤盘 +tile.food_oven_basic.name=石烤箱 + +tile.rack_wood.name=%1$s工具架 +tile.food_box_basic.name=%1$s食物箱 +tile.ammo_box_basic.name=%1$s弹药箱 +tile.crate_basic.name=%1$s箱 +tile.trough_wood.name=%1$s槽 +attribute.box.capacity.name=容量:%1$s组 +attribute.fill.capacity.name=容量:%1$s +attribute.fill=填充 x%1$s + +item.bedroll.name=床铺 +tile.bedroll.name=床铺 + +tile.framed_end.name=带框末地石 +tile.decorated_end.name=装饰用末地石 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/TABS/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +itemGroup.forgedtool=[MF] 锻制工具 +itemGroup.forgedweapon=[MF] 锻制武器 +itemGroup.forgedarmour=[MF] 锻制盔甲 +itemGroup.MFGadgets=[MF] 小工具 +itemGroup.MFUtil=[MF] 实用方块 +itemGroup.MFBows=[MF] 弓箭用具 +itemGroup.MFMaterials=[MF] 材料 +itemGroup.MFadvancedtool=[MF] 高级工具 +itemGroup.MFcrafttool=[MF] 合成工具 +itemGroup.MFore=[MF] 矿物 +itemGroup.MFfood=[MF] 食物 +itemGroup.MFOld=[MF] 原始物品 +itemGroup.MFdragonforged=[MF] 龙铸风格 +itemGroup.MFornate=[MF] 华丽风格 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/FIRESTARTER/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.dryrocks.name=干燥岩石 +item.tinderbox.name=火绒箱 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/BANDAGE/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.bandage_crude.name=粗糙的绷带 +item.bandage_wool.name=羊毛绷带 +item.bandage_tough.name=精良的绷带 + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/TRAINING/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.training_sword.name=训练用剑 +item.training_waraxe.name=训练用战斧 +item.training_mace.name=训练用权杖 +item.training_spear.name=训练用长矛 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/LEATHER STUFF/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.hide_helmet.name=生皮头盔 +item.hide_chest.name=生皮胸甲 +item.hide_legs.name=生皮护腿 +item.hide_boots.name=生皮靴子 + +item.roughleather_helmet.name=粗糙的皮革头盔 +item.roughleather_chest.name=粗糙的皮革胸甲 +item.roughleather_legs.name=粗糙的皮革护腿 +item.roughleather_boots.name=粗糙的皮革靴子 + +item.strongleather_helmet.name=强化的皮革头盔 +item.strongleather_chest.name=强化的皮革胸甲 +item.strongleather_legs.name=强化的皮革护腿 +item.strongleather_boots.name=强化的皮革靴子 + +item.studleather_helmet.name=镶钉头盔 +item.studleather_chest.name=镶钉胸甲 +item.studleather_legs.name=镶钉护腿 +item.studleather_boots.name=镶钉靴子 + +item.scaleleather_helmet.name=棉甲头盔 +item.scaleleather_chest.name=棉甲胸甲 +item.scaleleather_legs.name=棉甲护腿 +item.scaleleather_boots.name=棉甲靴子 + +item.padded_helmet.name=带衬帽子 +item.padded_chest.name=带衬软铠 +item.padded_legs.name=带衬护腿 +item.padded_boots.name=带衬靴子 + +item.leatherapron.name=皮革铁匠服装 + + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/WOOD STUFF/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.malletWood.name=木槌 +item.spoonWood.name=木勺 +item.paint_brush.name=油漆刷 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/STONE STUFF/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.stone_pick.name=石镐 +item.stone_axe.name=石斧 +item.stone_hoe.name=石锄 +item.stone_spade.name=石锹 + +item.stone_knife.name=石匕首 +item.stone_hammer.name=石锤 +item.stone_tongs.name=石钳 +item.bone_needle.name=骨针 + +item.stone_sword.name=石剑 +item.stone_waraxe.name=石战斧 +item.stone_mace.name=石棍棒 +item.stone_spear.name=石矛 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/STANDARD/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +languagecfg.tooltiptier=false +//You can move the main tier to the tooltip if this is true,make sure to remove "%1$s " instnaces if you do this + +item.standard_pick.name=%1$s镐 +item.standard_axe.name=%1$s斧 +item.standard_spade.name=%1$s锹 +item.standard_hoe.name=%1$s锄 + +item.standard_shears.name=%1$s剪刀 +item.standard_knife.name=%1$s匕首 +item.standard_needle.name=%1$s针 +item.standard_hammer.name=%1$s锤 +item.standard_hvyhammer.name=%1$s重锤 +item.standard_tongs.name=%1$s钳 +item.standard_saw.name=%1$s锯 +item.standard_spanner.name=%1$s扳手 + + +item.standard_dagger.name=%1$s短剑 +item.standard_sword.name=%1$s剑 +item.standard_mace.name=%1$s权杖 +item.standard_waraxe.name=%1$s战斧 +item.standard_spear.name=%1$s矛 + +item.standard_katana.name=%1$s太刀 +item.standard_greatsword.name=%1$s巨剑 +item.standard_warhammer.name=%1$s战锤 +item.standard_battleaxe.name=%1$s双刃斧 +item.standard_halbeard.name=%1$s戟 +item.standard_lance.name=%1$s骑士枪 + +item.standard_handpick.name=%1$s手镐 +item.standard_hvypick.name=%1$s重镐 +item.standard_trow.name=%1$s手锹 +item.standard_hvyshovel.name=%1$s重锹 +item.standard_scythe.name=%1$s镰刀 +item.standard_mattock.name=%1$s鹤嘴锄 +item.standard_lumber.name=%1$s伐木斧 + +item.standard_scale_helmet.name=%1$s鳞盔 +item.standard_scale_chest.name=%1$s鳞甲 +item.standard_scale_legs.name=%1$s鳞护腿 +item.standard_scale_boots.name=%1$s鳞靴 + +item.standard_chain_helmet.name=%1$s链盔 +item.standard_chain_chest.name=%1$s链甲 +item.standard_chain_legs.name=%1$s链护腿 +item.standard_chain_boots.name=%1$s链靴 + +item.standard_splint_helmet.name=%1$s藤盔 +item.standard_splint_chest.name=%1$s藤甲 +item.standard_splint_legs.name=%1$s藤护腿 +item.standard_splint_boots.name=%1$s藤靴 + +item.standard_plate_helmet.name=%1$s头盔 +item.standard_plate_chest.name=%1$s护甲 +item.standard_plate_legs.name=%1$s板护腿 +item.standard_plate_boots.name=%1$s护靴 + +item.standard_bow.name=%1$s弓 +item.standard_arrow.name=%1$s箭 +item.standard_bolt.name=%1$s弩箭 + +item.standard_mallet.name=%1$s槌 +item.standard_spoon.name=%1$s勺 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/DRAGONFORGE/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.dragonforged_pick.name=龙铸%1$s镐 +item.dragonforged_axe.name=龙铸%1$s斧 +item.dragonforged_spade.name=龙铸%1$s锹 +item.dragonforged_hoe.name=龙铸%1$s锄 + +item.dragonforged_shears.name=龙铸%1$s剪刀 +item.dragonforged_knife.name=龙铸%1$s匕首 +item.dragonforged_needle.name=龙铸%1$s针 +item.dragonforged_hammer.name=龙铸%1$s锤 +item.dragonforged_hvyhammer.name=龙铸%1$s重锤 +item.dragonforged_tongs.name=龙铸%1$s钳 +item.dragonforged_saw.name=龙铸%1$s锯 +item.dragonforged_spanner.name=龙铸%1$s扳手 + + +item.dragonforged_dagger.name=龙铸%1$s短剑 +item.dragonforged_sword.name=龙铸%1$s剑 +item.dragonforged_mace.name=龙铸%1$s权杖 +item.dragonforged_waraxe.name=龙铸%1$s战斧 +item.dragonforged_spear.name=龙铸%1$s矛 + +item.dragonforged_katana.name=龙铸%1$s太刀 +item.dragonforged_greatsword.name=龙铸%1$s巨剑 +item.dragonforged_warhammer.name=龙铸%1$s战锤 +item.dragonforged_battleaxe.name=龙铸%1$s双刃斧 +item.dragonforged_halbeard.name=龙铸%1$s戟 +item.dragonforged_lance.name=龙铸%1$s骑士枪 + +item.dragonforged_handpick.name=龙铸%1$s手镐 +item.dragonforged_hvypick.name=龙铸%1$s重镐 +item.dragonforged_trow.name=龙铸%1$s手锹 +item.dragonforged_hvyshovel.name=龙铸%1$s重锹 +item.dragonforged_scythe.name=龙铸%1$s镰刀 +item.dragonforged_mattock.name=龙铸%1$s鹤嘴锄 +item.dragonforged_lumber.name=龙铸%1$s伐木斧 + +item.dragonforged_scale_helmet.name=龙铸%1$s鳞盔 +item.dragonforged_scale_chest.name=龙铸%1$s鳞甲 +item.dragonforged_scale_legs.name=龙铸%1$s鳞护腿 +item.dragonforged_scale_boots.name=龙铸%1$s鳞靴 + +item.dragonforged_chain_helmet.name=龙铸%1$s链盔 +item.dragonforged_chain_chest.name=龙铸%1$s链甲 +item.dragonforged_chain_legs.name=龙铸%1$s链护腿 +item.dragonforged_chain_boots.name=龙铸%1$s链靴 + +item.dragonforged_splint_helmet.name=龙铸%1$s藤盔 +item.dragonforged_splint_chest.name=龙铸%1$s藤甲 +item.dragonforged_splint_legs.name=龙铸%1$s藤护腿 +item.dragonforged_splint_boots.name=龙铸%1$s藤靴 + +item.dragonforged_plate_helmet.name=龙铸%1$s头盔 +item.dragonforged_plate_chest.name=龙铸%1$s护甲 +item.dragonforged_plate_legs.name=龙铸%1$s板护腿 +item.dragonforged_plate_boots.name=龙铸%1$s护靴 + +item.dragonforged_bow.name=龙铸%1$s弓 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/ORNATE/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.ornate_pick.name=华丽%1$s镐 +item.ornate_axe.name=华丽%1$s斧 +item.ornate_spade.name=华丽%1$s锹 +item.ornate_hoe.name=华丽%1$s锄 + +item.ornate_shears.name=华丽%1$s剪刀 +item.ornate_knife.name=华丽%1$s匕首 +item.ornate_needle.name=华丽%1$s针 +item.ornate_hammer.name=华丽%1$s锤 +item.ornate_hvyhammer.name=华丽%1$s重锤 +item.ornate_tongs.name=华丽%1$s钳 +item.ornate_saw.name=华丽%1$s锯 +item.ornate_spanner.name=华丽%1$s扳手 + + +item.ornate_dagger.name=华丽%1$s短刀 +item.ornate_sword.name=华丽%1$s剑 +item.ornate_mace.name=华丽%1$s权杖 +item.ornate_waraxe.name=华丽%1$s战斧 +item.ornate_spear.name=华丽%1$s矛 + +item.ornate_katana.name=华丽%1$s太刀 +item.ornate_greatsword.name=华丽%1$s巨剑 +item.ornate_warhammer.name=华丽%1$s战锤 +item.ornate_battleaxe.name=华丽%1$s双刃斧 +item.ornate_halbeard.name=华丽%1$s戟 +item.ornate_lance.name=华丽%1$s骑士枪 + +item.ornate_handpick.name=华丽%1$s手镐 +item.ornate_hvypick.name=华丽%1$s重镐 +item.ornate_trow.name=华丽%1$s Spade +item.ornate_hvyshovel.name=华丽%1$s重锹 +item.ornate_scythe.name=华丽%1$s镰刀 +item.ornate_mattock.name=华丽%1$s鹤嘴锄 +item.ornate_lumber.name=华丽%1$s伐木斧 + +item.ornate_scale_helmet.name=华丽%1$s鳞盔 +item.ornate_scale_chest.name=华丽%1$s鳞甲 +item.ornate_scale_legs.name=华丽%1$s鳞护腿 +item.ornate_scale_boots.name=华丽%1$s鳞靴 + +item.ornate_chain_helmet.name=华丽%1$s链盔 +item.ornate_chain_chest.name=华丽%1$s链甲 +item.ornate_chain_legs.name=华丽%1$s链护腿 +item.ornate_chain_boots.name=华丽%1$s链靴 + +item.ornate_splint_helmet.name=华丽%1$s藤盔 +item.ornate_splint_chest.name=华丽%1$s藤甲 +item.ornate_splint_legs.name=华丽%1$s藤护腿 +item.ornate_splint_boots.name=华丽%1$s藤靴 + +item.ornate_plate_helmet.name=华丽%1$s头盔 +item.ornate_plate_chest.name=华丽%1$s护甲 +item.ornate_plate_legs.name=华丽%1$s板护腿 +item.ornate_plate_boots.name=华丽%1$s护靴 + +item.ornate_bow.name=华丽%1$s弓 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/ARTEFACT/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +stat.artefact.name=工艺品 +item.ancient_jewel.name=古代珠宝 +item.trilogy_jewel.name=古代三重珠宝 + +item.schem_gears.name=机甲机械图纸 +item.schem_forge.name=高级锻造炉图纸 +item.schem_cogwork.name=机甲框架图纸 +item.schem_bomb.name=矮人炸弹图纸 +item.schem_crossbow.name=矮人弩图纸 +item.schem_alloy.name=复合合金图纸 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/FOOD/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.berries.name=浆果 +item.berriesJuicy.name=多汁的浆果 +item.generic_meat_uncooked.name=生肉 +item.generic_meat_cooked.name=熟肉 +item.generic_meat_strip_uncooked.name=生肉片 +item.generic_meat_strip_cooked.name=熟肉片 +item.generic_meat_chunk_uncooked.name=生肉块 +item.generic_meat_chunk_cooked.name=熟肉块 +item.generic_meat_mince_uncooked.name=生肉末 +item.generic_meat_mince_cooked.name=熟肉末 +item.burnt_food.name=烧焦的食物 +item.burnt_pot.name=烧焦的食物 +item.burnt_cake.name=烧焦的食物 +item.burnt_pie.name=烧焦的食物 + +tile.berries.name=浆果丛 +item.breadcrumbs.name=面包屑 +item.breadroll.name=面包卷 +item.breadslice.name=面包片 +item.horse_raw.name=生马肉 +item.horse_cooked.name=熟马肉 +item.wolf_raw.name=生狼排 +item.wolf_cooked.name=熟狼排 +item.mutton_raw.name=生羊肉 +item.mutton_cooked.name=熟羊肉 +item.spider_raw.name=生蜘蛛肉 +item.spider_cooked.name=熟蜘蛛肉 + +item.bowl_water_salt.name=盐水 +item.salt.name=盐 +item.cake_tin.name=饼模 +item.pie_tin.name=馅饼盘 +item.pie_tray_uncooked.name=粘土馅饼盘 +item.flour.name=面粉 +item.sugarpot.name=糖罐 +item.bread_uncooked.name=未烤过的面包 +item.guts.name=内脏 + +item.raw_bread.name=面包面团 +item.dough.name=面团 +item.pastry.name=糕点 +item.stew.name=炖菜 +item.oats.name=燕麦 + +item.curds.name=奶酪 +item.cheese_pot.name=奶酪罐 + +item.jerky.name=牛肉干 +item.cheese_roll.name=卷酪卷 +item.sweetroll.name=甜面包 +item.sandwitch.name=三明治 + +tile.pie_meat.name=肉馅派 +tile.pie_apple.name=苹果派 +tile.pie_berry.name=浆果派 +tile.pie_shepards.name=马铃薯派 + +item.meatpie_slice.name=切片肉馅派 +item.pieslice_apple.name=切片苹果派 +item.pieslice_berry.name=切片浆果派 +item.pieslice_shepards.name=切片马铃薯派 + +item.chicken_roast.name=烤鸡肉 +item.pork_roast.name=烤猪肉 +item.beef_roast.name=烤牛肉 +item.mutton_roast.name=烤羊肉 + +tile.cake_vanilla.name=蛋糕 +tile.cake_carrot.name=胡萝卜蛋糕 +tile.cake_chocolate.name=巧克力蛋糕 +tile.cake_bf.name=黑森林蛋糕 + +item.cake_slice.name=切片蛋糕 +item.carrotcake_slice.name=切片胡萝卜蛋糕 +item.choccake_slice.name=切片巧克力蛋糕 +item.bfcake_slice.name=切片黑森林蛋糕 + +item.coca_powder.name=可可粉 +item.chocolate.name=巧克力 +item.chocchips.name=巧克力豆 +item.eclair.name=泡芙 +item.eclair_raw.name=泡芙面团 +item.eclair_uniced.name=未加糖霜的泡芙 +item.eclair_empty.name=未填充的泡芙 +item.saussage_cooked.name=腊肠 +item.saussage_raw.name=生腊肠 +tile.cheese.name=奶酪圈 +item.cheese_slice.name=奶酪 +item.sushi.name=寿司 +item.curry.name=咖喱 +item.pizza_basic.name=披萨 +item.sweetroll_raw.name=甜面包面团 +item.sweetroll_uniced.name=未加糖霜的甜面包 +item.icing.name=糖霜 +item.custard.name=蛋奶冻 + +item.cake_raw.name=蛋糕面糊 +item.cake_simple_raw.name=简易蛋糕面糊 +item.cake_carrot_raw.name=胡萝卜蛋糕面糊 +item.cake_choc_raw.name=巧克力蛋糕面糊 +item.cake_bf_raw.name=黑森林蛋糕面糊 + +item.cake_uniced.name=未加糖霜的蛋糕 +item.cake_simple_uniced.name=未加糖霜的简易蛋糕 +item.cake_carrot_uniced.name=未加糖霜的胡萝卜蛋糕 +item.cake_choc_uniced.name=未加糖霜的巧克力蛋糕 +item.cake_bf_uniced.name=未加糖霜的黑森林蛋糕 + +item.pie_meat_uncooked.name=未煮过的肉馅派 +item.pie_apple_uncooked.name=未煮过的苹果派 +item.pie_berry_uncooked.name=未煮过的浆果派 +item.pie_shepard_uncooked.name=未煮过的马铃薯派 +item.pie_pumpkin_uncooked.name=未煮过的南瓜派 + +item.pie_meat_cooked.name=熟肉馅派 +item.pie_apple_cooked.name=熟苹果派 +item.pie_berry_cooked.name=熟浆果派 +item.pie_shepard_cooked.name=熟马铃薯派 +item.pie_pumpkin_cooked.name=熟南瓜派 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/FOOD STATS/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +food.stat.list.name=进食时: +food.stat.hunger.name=+%1$s 饱食度 +food.stat.staminaPlus.name=恢复%1$耐力 +food.stat.staminabuffHours.name=%2$s小时内增加%1$s耐力 +food.stat.staminabuffMinutes.name=%2$s分钟内增加%1$s耐力 +food.stat.staminabuffSeconds.name=%2$s秒内增加%1$s耐力 +food.stat.saturationMinutes.name=%1$s分钟内饱和 +food.stat.saturationSeconds.name=%1$s秒内饱和 +food.stat.saturation.name=饱和度:%1$s +food.stat.staminabuffRegenMinutes.name=%2$s分钟内每秒恢复%1$s耐力 +food.stat.staminabuffRegenSeconds.name=%2$s秒内每秒恢复%1$s耐力 +food.stat.cure.poison=解毒 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/CONSTRUCTION/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +item.hinge.name=铰链 +item.commodity_plank_cut.name=切好的%1$s木材 +item.commodity_plank_pane.name=%1$s木嵌板 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/RPG/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +rpg.levelup=你的%1$s技能已经升到了%2$s级 +rpg.required=需要 %1$s %2$s +rpg.skillmod=技能修正:+ + +skill.lowskill=你没有足够的技能! +skill.value=等级:%1$s + +skill.list.basic=基本技能 +skill.list.craft=合成技能 +skill.list.combat=战斗技能 + +skill.artisanry.name=手艺 +skill.construction.name=建造 +skill.provisioning.name=烹饪 +skill.engineering.name=机械 +skill.combat.name=锻铸 + +item.skillbook_artisanry.name=锻造的艺术 +item.skillbook_artisanry.desc=+%1$s手艺 +item.skillbook_construction.name=木工技术 +item.skillbook_construction.desc=+%1$s工程 +item.skillbook_provisioning.name=养活一个村庄 +item.skillbook_provisioning.desc=+%1$s烹饪 +item.skillbook_engineering.name=高级机械 +item.skillbook_engineering.desc=+%1$s制造 +item.skillbook_combat.name=御敌兵法 +item.skillbook_combat.desc=+%1$s锻铸 + +item.skillbook_artisanry2.name=上古工匠史 +item.skillbook_artisanry2.desc=手艺-MAX +item.skillbook_construction2.name=建筑档案库 +item.skillbook_construction2.desc=建造-MAX +item.skillbook_provisioning2.name=贸易史 +item.skillbook_provisioning2.desc=烹饪-MAX +item.skillbook_engineering2.name=工程师词典 +item.skillbook_engineering2.desc=机械-MAX +item.skillbook_combat2.name=作战制胜日志 +item.skillbook_combat2.desc=锻铸-MAX +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/KNOWLEDGE INFORMATION/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +method.workbench=基础工作台 +method.furnace=熔炉 +method.bloomery=锻铁炉 +method.blastfurnace=高炉 +method.anvil=砧 +method.carpenter=木匠工作台 +method.crucible=坩埚 +method.crucibleT2=耐火坩埚 +method.crucibleT3=传说坩埚 +method.crucibleT4=大师级坩埚 +method.quern=磨盘 +info.hasKnowledge=可研究 + +gui.purchase=购买 +knowledge.guiSubtitle=这是GUI +knowledge.basicstructure=基本结构 +knowledge.example=范例 +knowledge.rightclickspanner=手持扳手右键 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/KNOWLEDGE TEXT/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +knowledge.title= +knowledge.title.desc= +knowledge.title.1= + +knowledge.minotaurs=牛头人 +knowledge.minotaurs.desc=可憎之物 + +knowledge.minotaurs.1=罕有生物可以与牛头人的力量和狂暴匹敌。据传说,可怖的牛头人是人和牛的结合体。牛头人是杂食动物、暴脾气。因此牛头人是杂食生物,同时有着极为暴躁的脾气。^不像它们的祖先,牛头人非常强壮,如果它们动手,足以在数秒之内将人撕成碎片。它们可以在敌人的鲜血中快速恢复自己的伤势。在某些时候,它们也显示出集群活动的迹象。 +knowledge.minotaurs.2=$h小牛头人-$r^在野外,那些小型牛头人欺凌不幸接近它们的生物的事情数见不鲜。^不要被这些家伙的体型欺骗,它们依旧是正经的牛头人。如果你在野外见到它们,要么是流浪者,要么是外出为它们更壮的同伴开路的。 +knowledge.minotaurs.3=$h大牛头人-$r^大牛头人被发现居住在地下的矮人遗迹中,这给探险者增添了不小的挑战。^这些牛头人更加团结和危险。最普通的牛头人战士已经相当凶猛,而且手持武器,而那些在遗迹深处的精英和领主更不必说。所以在探索遗迹之前请务必多做准备。一只牛头人战士也许只是一个挑战,但是要是一群的话……无人幸存。 +knowledge.minotaurs.4=$h物种-$r^在野外和遗迹中已有三种牛头人亚种被发现。尽管不同种类的牛头人在生存和行动模式上大同小异,但是它们的身体属性有所不同。 +knowledge.minotaurs.combat=$h战斗-$r^要对付一只牛头人?有用的建议有一大堆。别让它们离你太近,即使是最强的护甲也会在它们狂怒的打击下变形失效。虽然很多牛头人都身着优良的护甲,但是不管是皮甲还是板甲都弱突刺攻击,一只矛就对其造成大量伤害。除此之外炸弹,地雷,弓箭还有重甲都会大大提高你的生存几率。 + +knowledge.mob.minotaur.name=棕毛牛头人 + +knowledge.minotaur.1=棕毛牛头人是一种很常见的生物,他们拥有极大的力气,是强大的对手。尽管普通的牛头人除了自己的皮毛外没有多余的防护,但是依旧难以杀死。 + +knowledge.mob.minotaur_frost.name=冰霜牛头人 + +knowledge.minotaur_frost.1=冰霜牛头人生活在寒冷的地区,因此比起那些棕毛的近亲有着更厚的皮毛。白化的牛头人在雪地里难以分辨,它们会借助伪装对那些粗心的旅人发动致命的袭击。 + +knowledge.mob.minotaur_dread.name=噩梦牛头人 + +knowledge.minotaur_dread.1=人们对被部分人称为噩梦牛头人的生物所知甚少。它们是地狱的住民,长着暗灰色或者黑色的毛,还有强韧的皮肤以及对火焰的完全免疫力。这种怪物远比主世界里的表亲要难对付得多。 + +knowledge.dragons=龙 +knowledge.dragons.desc=死从天降 + +knowledge.dragons.1=龙是高傲与破坏性兼具的爬行动物,在天空中追踪猎物。全世界已发现多种龙类,在攻击力上差别巨大。在旅行时你要留意天空,避免龙的偷袭。^每条龙都有着喷出致命吐息的独特能力,尽管这一能力的背后机制仍然不明,做好准备应对危险总是没错的。 + +knowledge.dragons.2=虽然它们中的年幼个体也许稍微容易杀死,但那些更年长的龙是强大的怪物。这些爬行动物的外皮是如此坚韧,以至于大多数武器无法造成有效杀伤。只有那些特别的龙铸武器可以穿透他们坚硬的龙鳞来重创它们。^龙之心对于老练的工匠来说非常珍贵,所以它们才会被人捕猎。但是要注意,年轻的龙的心脏一文不值,只有那些上了年纪的龙才会因上述原因而遭到猎杀。 + +knowledge.mob.red_dragon.name=赤炎龙 +knowledge.red_dragon.1=最常见的龙类,赤炎龙拥有喷火的能力,很多人都因为它们不幸殒命,有时甚至连整个村落都在龙息中化为灰烬。比起它们的同类,它们并不经常使用吐息,即便如此,它们在近战撕咬上仍极具攻击性。 + +knowledge.mob.blue_dragon.name=冰霜龙 +knowledge.blue_dragon.1=生活在更为寒冷的地区,冰霜龙因它们吐出刺骨的寒风冻结敌人的能力而得名。冰霜龙看上去并没有它们的表亲那般可怕,但是它们的攻击依旧是致命的。 + +knowledge.mob.green_dragon.name=绿沼龙 +knowledge.green_dragon.1=绿沼龙--亦被称为“毒龙”--有着肮脏而可怕的天性。它们主要栖息于沼泽中,但是在雨天也可以外出捕食。^绿沼龙可以发出致命的酸液吐息,足以腐蚀铠甲,并让不幸的受害者中毒。 + +knowledge.mob.ash_dragon.name=灰烬龙 +knowledge.ash_dragon.1=灰烬龙可在那些炎热干燥的地方,譬如沙漠中被发现,它们可以经由独有的两足特征 (一般的龙是四足) 来轻易判别。灰烬龙是瞎子,它们依靠声音和气味来追踪猎物。所以见到它们时,保持距离,悄悄通过来躲开它们。 + +knowledge.dragons.combat=$h战斗策略-$r^龙族速度很快并具备制空优势,但是这并不是说它们是无敌的。首先它们会反复离开并返回战场,你最好一直拉住其仇恨以免让它溜走。其次在龙俯冲下来的时候开始攻击,此时使用远程武器会较为安全。除此之外,特制的龙铸武器也会给你在与龙的战斗中提供一点优势。 + +knowledge.gettingStarted=新手指南 +knowledge.gettingStarted.desc=初识世界 + +knowledge.gettingStarted.1=这里是你探索本模组的起点。我们提醒您在开始之前至少应该有一个山洞可以避雨,还有一块能发展的地方,同时您也应该有一点木材、煤、铜、石头和皮革的储备。准备万全时您就可以开工了,要在这个世界里有所作为,你需要完成三个主要环节。 +knowledge.gettingStarted.2=合成物品不再像原版那样简单了,你也需要参与其中。首先,按照说明的内容处理材料 (比如给要在砧上锻造的材料进行加热) ,之后根据加工的物品使用正确的工具 (比如空手、匕首、锤子等) 持续处理物品填满进度条来完成加工。 + +knowledge.gettingStarted.hcc=$h困难合成-$r^困难合成默认是开启的。在此模式下,原版工具的效果会被削弱,我们建议你制作原始工具。在研究手册的“工艺”一栏可以查看所有这些工具的合成方式。^准备开荒:在不用工具的情况下破坏石头会掉落锋利岩石。^用这些石头来采集藤蔓、树枝、还有原木。 + +knowledge.gettingStarted.fire=$h火塘-$r^在你开始工作之前,你需要两个火塘,一个用来提供火源,另一个用来烹饪 (如果你有肉) 。^拿着本模组的木材右键火塘来添加燃料,然后使用引火器具点火。 +knowledge.gettingStarted.food=你可以在其中一个火塘上放一个烤盘.然后你需要拿着生的食物 (主要是肉) 右键烤盘来把它放上去. + +knowledge.gettingStarted.carpenter=$h木匠工作台-$r^木匠工作台是用于合成一系列物品的基础合成台,不同的合成需要不同的工具,有些则要求空手制作。阅读“制作工具”一节来获取关于工具的更多信息。 + +knowledge.gettingStarted.tanning=$h制革-$r^目前为止你可能收集了一些兽皮但却无法使用,刮兽皮是一种简单的制作皮革的方法。^首先,找到水源把你的兽皮冲洗干净,然后做一个简陋的制革架和一把石头小刀。这些原始工具的质量非常差,但你可以在发展起来后换用更好的工具。 + +knowledge.gettingStarted.forging=$h锻造-$r^锻造是制作物品的主要方法。几乎每一个工具和金属物件都是通过这一工序制作的。首先你需要做一个石头锻造炉、砧和一些工具,然后将砧放在靠近石头锻造炉和水的地方。“工艺”一栏包含了完整的关于如何进行锻造工作的信息,在这之前你得先做一个最基础的引火器 (干燥岩石) ,别忘了穿上围裙!(参考“工艺”一栏的“锻铁炉”一节来了解如何把那些金属原矿处理成能用的金属条) + +knowledge.gettingStarted.forgingbars=大多数配方需要的是金属条而不是金属锭。金属条是从金属锭加工出的易于加工的材料,把加热后的金属锭放在砧中然后用锤子砸之即可获得金属条 (右键砧的顶部或者直接左键砸) 。 +knowledge.gettingStarted.flux=熔剂在锻造金属时扮演着重要的净化剂角色。原则上来说这个物品是处理锻造过程中的金属以及制作合金用的。但是制作某些金属片和金属板时同样需要熔剂,一些工具和护甲也是。^熔剂的最好来源是石灰岩。在你云游四方的时候最好留意一下。 +knowledge.gettingStarted.3=现在你需要一些皮革条来做工具。收集2个铜 (把它们处理成铜条) ,2个木材和1个皮革然后做把铜剪刀。 +knowledge.gettingStarted.4=拿起你的剪刀,然后把皮革放在木匠工作台或制革架上右键切割制成皮革条。 + +knowledge.gettingStarted.5=到了这步,你应该有一些皮革,铜锭,木材和皮革条了吧。是时候升级下你的石锤子了。 + +knowledge.gettingStarted.6=随着锻造设备的建立,你现在可以打造铜制工具了。查看“工艺”一栏的“锻造工具”一节可以找到些铜制工具的替代品。^务必使用钳子来取出和移动滚烫的金属,拿着钳子靠近锻铁炉夹起金属,再右键砧即可。(目前直接从锻造炉里拿出加热后的金属似乎是没有惩罚的,不知道是不是bug) + +knowledge.gettingStarted.upgrade=$h升级-$r^渐渐地,基础的铜已经满足不了你了。研究手册和研究台可以让你获悉目前可以做什么以及怎么做。^首先你需要一个研究台。研究台可以研究各种物品来解锁合成配方和科技树以帮助你更好的生存。打开研究手册来阅览你当前的研究进度,将物品放进研究台以开始研究。 + +knowledge.gettingStarted.7=我们从熔炼一块铜锭和锡锭开始 (把金属条放进砧中捶打即可得到) 。把它们放进研究台。确定你的"工艺"技能足够高 (至少5级) 并且提示你:你现在能够从中学到点什么了。试试研究青铜锻造 (备注:制作各种物品来提升工艺等级) 。你也可以尝试研究皮革来学习如何制作更好的护甲。 + + +knowledge.gettingStarted.10=很快你会需要和各种粉打交道,无论是在烹饪,工程或者工艺上。大多数粉需要使用手推磨和陶罐来获得。(左键打一下手推磨或者右键手推磨的顶部) (使用原版熔炉来获得烧制好的陶罐) + +knowledge.gettingStarted.11=现在尝试下“锻造青铜”吧,你需要“工艺”等级达到5才可以解锁“锻造青铜”研究,合成工具,武器,护甲和一些材料能提升你的手艺等级。^研究完"锻造青铜"后,升级你的工具然后向着下一个目标前进吧. + +knowledge.gettingStarted.12=$h回收站-$r^当你发现自己的仓库里缺乏有用的资源或者挤满了垃圾,甚至是两者兼具的时候,做个回收站吧。^这东西能检测物品的构成,并从中回收一部分东西。 +knowledge.gettingStarted.13=使用方式:在地上放一个回收站然后往它上面丢东西,之后再右键下回收站即可 (只有原版和本模组的物品可以回收) 。^到这里,基本的东西已经教给你了。剩下的就看你的造化了233…… + +knowledge.dust=磨碎粉末 +knowledge.dust.desc=粉末制作技术 +knowledge.dust.1=你能用手抓起一把粉末,但你没法控制抓起的量,以及如何保持它不从你的指缝里溜出去。陶罐能用于装填矿粉和其他用途的粉末,大多数粉末需要用手推磨制作,只有极少的配方需要其他工具参与。这里有一些例子: +knowledge.dust.quern=使用手推磨:你需要做的就是打开它的界面,在中间放进陶罐,顶格需要放入所要磨的物品,顶部放上要磨成粉的物品,然后再左击或者右击手推磨的顶部,就可以制作出你想要的污粉了 (误) +knowledge.dust.icing=一些食物相关的配方 (比如糖霜) 需要把各种材料放进陶罐里用勺子混合。 + +knowledge.research=研究手册 +knowledge.research.desc=记录足迹 + +knowledge.research.1=在世界上有非常非常多的东西可以探索,你需要的只是去找到它们。为了揭开世界中隐藏的知识并用它们改善你的生活,你需要研究它们。大多数你能干的事情和你能做的东西都需要研究解锁,而完全揭开它们的秘密不止要求你去研究它们,你还要具备足够的技能等级。^在你研究一样物品时,你对研究的结果是一无所知的。研究台对于研究物品来说是必不可少的。你的技能等级和你研究的物品决定了你是否能解锁有关新知识的线索。 + +//Table recipe + +knowledge.research.2=当你放下研究台后,你就可以通过研究物品来解锁新的知识了。你需要一定的技能来解锁信息,如果你的技能够高而你又积累了足够的研究经验 (在研究台上完成物品的研究) ,你就可以得到一条关于你的研究的线索。当你得到全部线索时对应的研究就会解锁,你可以在研究手册里浏览你的进度。^如果你缺乏足够的技能来研究新的物品,那么等你学到更多的时候再回来研究它。 + +knowledge.carpenter=木匠工作台 +knowledge.carpenter.desc=简单合成 +knowledge.carpenter.1=木匠工作台主要用来制作各种有关木头的物品,最好尽早把它做出来。此工作台可以使用各种工具进行物品加工,如空手 (不拿任何物品) 、锤子、匕首等。合成需要按照合成表放好物品,再用指定的工具缓慢地单击工作台 (或者右击工作台顶部) 。^工作台进度条左边显示了需要的工具,工具是分等级的,使用了等级不符的工具,或者是不顾节奏乱挥一气的话,会损耗更多的工具耐久,这一点也适用于砧和其他一些设备的使用。 + +knowledge.salvage=回收站 +knowledge.salvage.desc=重复利用 +knowledge.salvage.1=在恶劣的环境中作为一个囤积者也许会为你提供些许优势,但那些用不着的设备和劣质的工具真心没什么卵用。^回收站能从这些物品中回收原料。(仅限原版和MF2中的物品) +knowledge.salvage.2=使用方式:放好回收站然后把要回收的东西扔在上面,再右键回收站,一定几率回收全部合成材料。低耐久的物品回收率更低。 +knowledge.salvage.3=如果你用锤子,回收材料的几率更大。而用锯子几率比用锤子更大。 + +knowledge.talisman=知识护符 +knowledge.talisman.desc=轻松阅读 +knowledge.talisman.1=指出一样东西工作的关键机理有时并非易事。通俗的说法就是使用研究台需要花费大量的时间和精力才能解锁你想了解的那些东西。不过如果你有了这个护符,手持它右击研究台的顶部可以立刻完成物品研究 (如果你能研究此物品) 。小型知识护符也可以用来制作让某一技能等级+1的书。 +knowledge.talisman.2=大型知识护符十分罕见,所以也很少被使用.它和小型知识护符作用相同,不过能无限使用。它可以用来制作让某一项技能达到满级的技能书。 + +knowledge.commodities=常用品 +knowledge.commodities.desc=实用物品 +knowledge.commodities.1=这些常用品是合成的命脉,每一样东西都非常寻常却又因其作用众多而极具价值,所以建议你多制作些以备不时之需。 + +knowledge.commodities.plank=木材是原木中上好的那一部分,一种常见的建筑用品。^多种原木都可以制作木材,每一种木料都有自己不同的特性。 + +knowledge.commodities.refinedplank=一些木材可以用植物油进行精制,使其硬化。精制木材将被用于更高级的合成。只有1级木材可以进行精制。 + +knowledge.commodities.flux=熔剂通常用于精炼金属。基础熔剂可以用于设备--比如高炉--来制作精炼金属锭。强力熔剂则用于高级合金合成。 + +knowledge.commodities.hunks=对于那些较小的制品,要使用金属片。你可以在熔剂的辅助下把金属条做成片,也可以把用剩的金属片做回条。 + +knowledge.commodities.nail=钉子是木工用的基本物品。它们可以由铜、锡、铜、铁或钢制成。(这不影响成品的质量,只影响产量) + +knowledge.commodities.rivet=铆钉和钉子相似,只不过是用于金工。可以用铜、锡、铜、铁或钢制成。(这不影响成品的质量,只影响产量) + +knowledge.commodities.leatherstrip=皮革条主要用在工具制作上。 + +knowledge.commodities.thread=丝线主要用于有关缝纫的合成上。丝线可以合成原版的线。 + +knowledge.commodities.bucket=桶可以由金属锡在砧上制成,金属等级越高,获得的桶的数量越多。 + +knowledge.plants=植物生成 +knowledge.plants.desc=有机资源 +knowledge.plants.1=地表上最常见的是各种各样的树和植物,它们在一些事情上被证明是大有用途的。^这些是可在地表上发现的植物,可以为你提供食物和材料。 +knowledge.plants.2=不同的树木提供不同的木材,有些木材在特定用途上要比其他的更好。这是你能发现的树木列表: +knowledge.yew.1=紫杉树一般生长在森林里,但是它们分布稀疏,形单影只。紫杉木的属性要比一般的木头要好,而用这种木材制成的弓尤为强力。 + +knowledge.ironbark.1=桉树是一种偶尔能在森林里发现的树,因其粗糙的灰色树皮和橙色树心使得其在其他树木中显得特别显眼。砍伐桉树得到的铁皮木质地坚韧,制作出的工具都具备很高的耐久。 + +knowledge.ebony.1=黑檀树是巨大而罕见的树木。可以在温和地区找到,它提供格外坚固的木材。^黑檀树可以根据它们的体型和暗棕色的木质来分辨。黑檀木是最强的可用木材。 + +knowledge.berry=浆果 +knowledge.berry.desc=绿色无农药 +knowledge.berry.1=浆果生成在温度和降雨量适当的地区,在森林里尤为常见。^多汁的 (紫色) 浆果虽然罕见,但具有解毒的效果。 + +knowledge.ores=矿物生成 +knowledge.ores.desc=地下资源 +knowledge.ores.1=在这个世界矿石的生成范围比较小。你可以把矿石熔炼成锭或用作他用。 +knowledge.ores.copper=铜矿是48-96层生成的常见矿物。它可以很轻松的熔炼成锭,并制成工具。^铜矿可以和锡制成青铜。 +knowledge.ores.tin=锡有铜的一半生成率并都在同一层生成 (48-96) 。^锡可以冶炼成锭并和铜制成青铜。 +knowledge.ores.silver=锡的生成率只有铜的一半,它的生成高度与铜相同 (48-96) 。^锡可以熔炼成锭并与铜混合制成青铜。 +knowledge.ores.wolframite=黑钨是一种罕见的矿石,主要用于高级工程。它在低于16层的高度以单块矿脉形式生成。 +knowledge.ores.mythic=有关“传说矿石”的已知信息很少,除了它十分罕见并且只能在基岩附近找到。这种奇怪的矿石似乎会发出鸣叫声。原因未知…… + +knowledge.ores.2=非金属矿石也会在主世界生成,有别于金属矿:它们不能熔炼成锭,但有其他用途。 +knowledge.minerals.clay=和沙子一样,粘土可以在泥土中找到。含粘土的泥土可以在草方块下面找到,草不能在它上面生长,所以它可以很容易在山上找到。 +knowledge.minerals.kaolinite=高岭石有一个相当特殊的用途。与粘土混合的话,这种材料可以增强砖块的强度。^它可以在接近地表,48至72层的高度发现。尽管有些罕见,不过它的矿脉很大,发现一个基本上就不愁用了。 +knowledge.minerals.limestone=石灰岩大片大片的在全世界生成,它是熔剂的常规来源。 +knowledge.minerals.borax=硼砂是比较罕见的矿物——也是强力熔剂的最佳来源,后者被用于制造高级合金。^它一般在48-96层生成但很难被发现。 +knowledge.minerals.nitre=硝石矿生成在16-64层的一些洞穴墙壁上。采集得到的硝石可用来制造炸药。 +knowledge.minerals.sulfur=硫在地下深处低于16层的岩浆附近生成。它可以用来制造炸药。 + +knowledge.chimney=烟与烟囱 +knowledge.chimney.desc=什么是温室气体? + +knowledge.chimney.1=傻子都知道燃料燃烧时会产生烟雾。你还得明白,呼吸烟雾是不明智的。^但是你现在要是在读这个,你很可能已经开始盘算着要用烟囱一类的东西排烟了。^不管怎样:烟囱可以把烟雾排到天空从而远离你宝贵的空气!留给几个世纪后的人抱怨吧。 + +knowledge.chimney.2=烟囱可以使用石头来加宽,这样可以增加烟囱的容量和强度,同时可以封住地板上和天花板上因为细烟囱而产生的空隙。 + +knowledge.chimney.3=石头排烟器也可以用在其他设备上 (主要是熔炉和坩埚) 间接吸取烟雾.^“间接”是指将烟雾从它原本冒出来的地方向相邻位置移动一格。 + +knowledge.chimney.pipe=排烟管道允许烟气在烟囱系统里进行传输。管道本身不能排放烟雾,必须要连到一节普通的烟囱 (石头烟囱,加宽石头烟囱,石头排烟器均可) 上,这些管道只能接受来自其正下方烟囱排出的烟雾。 + +knowledge.chimney.pipe.2=最大化的利用排烟设备:在烟囱顶部链接管道,管道顶部连接另一节烟囱作为设备的排烟系统。(图中展示了一个以排烟器开始的排烟系统) + +knowledge.tanning=制革 +knowledge.tanning.desc=动物尸体加工 + +knowledge.tanning.1=皮革是非常有用的资源。几乎所有的工具、武器或盔甲都用到了皮革。^制革是清理生皮并把它们制成有用物品的简单方法。^首先你需要制革架。 + +knowledge.tanning.2=然后你需要清理兽皮。拿着兽皮右键水或者把熔剂和兽皮放在合成格子里处理均可完成这一过程。清理完成后,右键制革架将其挂上去。然后再用小刀有节奏的右键之来进行处理。注意:使用破旧的制革架时有十分之一的几率制革架会坏掉。^但是一个制作更精良的制革架不会损坏,建议当你负担得起造价的时候就制作它们。 + +knowledge.stamina=耐力机制 +knowledge.stamina.desc=保持健康 + +knowledge.stamina.1=要知道,成天跑来跑去或者专心挖地在体力上并非易事。本模组加入的耐力机制让你在这样的事情上保持一定的节奏。^耐力值 (屏幕右下角的绿条) 会在你做各种事情的时候降低。但是它会自动恢复,恢复的速度依你装备的物品而定。^食用本模组的食品也可恢复一定量的耐力,而甜食可以加快耐力恢复速度。^因为耐力机制的存在,一味的换用更重更厚的护甲已经不再是最佳选择了,考虑自己的游戏风格,穿合适的护甲才是最明智的选择。 + +knowledge.combat=战斗机制 +knowledge.combat.desc=杀死骷髅的方法不止一种 + +knowledge.combat.1=世道变了,你再不能在外面浪了,战斗系统已经有了很多变化,加入了一些新的战斗技巧。^这不止是说你的攻击方式有了变化,怪物们也同样如此!一只手持武器的僵尸要比其他同类更具威胁,因为它们也会这些即将被提到的战斗技巧。 + +knowledge.parry.info=$h招架和格挡$r^你拿着武器时,按住右键即可格挡,简单吧?现在格挡变得更加有效了。挡下来自正面的一击会减少 (甚至完全抵消) 这次攻击所造成的伤害,用剑效果最好,而那些长柄武器 (比如斧子和钝击武器) 会视受到攻击的类型来减少伤害。^平时多使用格挡,这个技巧有时会救你一命。但是注意在挡下敌人的一击后马上进行反击的话,你的攻击力会降低。 + + +knowledge.advparry.info=$h招架能力$r^当你招架成功后,如果你按着shift键,你会前冲一步,有时会把敌人甩在后面。虽说很费耐力,但善于运用此道的人,会用它来改变战场的局势。此外,跳跃时也可发动此技能。 + +knowledge.poweratt.info=$h重击$r^当你在你潜行状态,来一次信仰之跃,期间进行攻击的话,你会尝试发动一次重击。这会消耗耐力,但一旦成功就会对敌人造成双倍伤害并且无视格挡。但是如果你攻击的太早,那么重击可能会被打断。 + +knowledge.dodge.info=$h闪避$r^在很多情况下,完全躲开攻击是更好的战术。当你在格挡时往两边或后面跳跃,会快速飞跃。这会消耗耐力并且无法在装备重甲时使用。 + +knowledge.armour.info=$h盔甲选择$r^有三种主要类型的盔甲:轻型、中型和重型。如果你比较依靠回避和技巧,使用轻甲;如果你想要更多的保护,使用重型;轻重混搭,使用中型。 + +knowledge.blade.info= +knowledge.fastblade.info= +knowledge.axe.info= +knowledge.blunt.info= +knowledge.polearms.info= + +knowledge.bar=金属条 +knowledge.bar.desc=标准化塑形 +knowledge.bar.1=金属锭通常用于基础合成以及贸易目的,但是它们对于锻造工作来说实在是太厚了。于是为了制作一种通用的,易于熔炼的材料,人们把金属锭加工成了金属条。^一块金属条可以用很简单的办法重新制成金属锭。 + +knowledge.smeltCopper=冶炼铜 +knowledge.smeltCopper.desc=等级 %1$s,常用材料 +knowledge.smeltCopper.1=金工之路道阻且长。铜是一种易加工且无风险的材料。^然而,某种意义上它是一块垃圾,因为它无法用来制造高级工具,重型武器或重型盔甲! + +knowledge.smeltBronze=冶炼青铜 +knowledge.smeltBronze.desc=等级 %1$s,常用材料 +knowledge.smeltBronze.1=让我们前进一步,把一点锡和铜按照正确比例混合,就能得到一种强过二者简单相加得到的合金——青铜。^这种材料大有用途,以后你会发现这一点的。 + +knowledge.smeltIron=冶炼铁 +knowledge.smeltIron.desc=等级 %1$s,常用材料 +knowledge.smeltIron.1=在对这个世界里的矿石进行一定的研究之后,你发现铁矿石生成量很大。而在适当的精炼后,你就能从矿石中提取出金属熔铸成锭。^铁要比青铜强韧而且更加常见,是一种实用而低成本的材料。 +knowledge.smeltIron.2=铸铁易,锻铁难。不过你已经小有所成,知道如何制作铁制工具。 + +knowledge.smeltPig=生铁 +knowledge.smeltPig.desc=铁矿处理 +knowledge.smeltPig.1=天然铁矿里满是杂质,性能极差,为了制造高级合金,就得把它们进行精炼。而高炉就是为此而生的。^你可以使用一种特制熔剂对铁矿进行预处理。接下来高炉可以非常有效的去除矿石中的杂质,从而得到更加纯净的铁。^生铁就是这一过程的产物,其脆性稍高,所以你在把它投入使用前还需要进一步的精炼。 + +knowledge.smeltSteel=锻造钢 +knowledge.smeltSteel.desc=等级 %1$s,常用材料 +knowledge.smeltSteel.1=稍作观察,你发现生铁作为材料太脆了,这可麻烦了。不过没关系!只需要加热和一点小操作,就可以提高它的塑性和韧性了。 + +knowledge.smeltEncrusted=镶钻工艺 +knowledge.smeltEncrusted.desc=等级 %1$s特殊材料 +knowledge.smeltEncrusted.1=某些想法可能听着很蠢,但实际上却非常实用。把钻石碎片锻打进钢中可以提升材料的抗性和尖锐性。^镶钻锭的性能远远好于普通的钢锭,完全对得起它的花费。 + +knowledge.smeltObsidian=锻造黑曜石钢 +knowledge.smeltObsidian.desc=等级 %1$s,特殊材料 +knowledge.smeltObsidian.1=对黑曜石内部晶体结构的研究给了你有关冶金方面的灵感。黑曜石的抗爆能力无物可比,你可以取之为己所用。^把钢与熔融黑曜石混合,你创造出一种强韧的合金,可以用来锻造拥有诸多优点的工具。 + +knowledge.smeltBlackSteel=锻造黑钢 +knowledge.smeltBlackSteel.desc=等级 %1$s,常用材料 +knowledge.smeltBlackSteel.1=每种材料都有其极限,你已发现一种极赞的合金,只需要把青铜和铁按照正确比例组合就可以炼得黑钢。黑钢性能极佳,远超目前已知的任何材料。但是它难以生产和加工,所以也许它并不能完全取代铁的地位。^熔炼过程包含两个阶段:在更好的坩埚中混合,在高炉中成型。然后你就能得到这暗色的,强力的材料了。 + +knowledge.craftOrnate=华丽风格 +knowledge.craftOrnate.desc=净化的代价 + +knowledge.craftOrnate.1=只要使用正确的材料,制造更具观赏性的武器、工具和护甲是可能的。华丽风格的物品对不洁生物,比如不死族的怪物非常非常有效。^要制作这些物品需要华丽纹章。在打造适当的物品时把一块纹章放在砧的成品格,在打造成功后,一件华丽风格物品就完成了,不过这时的物品还不能使用,需要在水中完成淬火才行。 + +knowledge.smeltDragonforge=龙铸风格 +knowledge.smeltDragonforge.desc=天然而强力 + +knowledge.smeltDragonforge.1=龙是棘手的生物,猎杀它们需要准备与经验。通过你的努力,就有可能用它们自己的力量对抗它们,龙铸武器将打击并破坏龙鳞从而更有效的给予他巨大的打击。要制作龙铸武器:先做普通的近战武器。就在完成前:扔 (右击) 一颗龙心到附近的熔炉 (温度要够,才能放下去) ,然后迅速完成合成。如果一切顺利你会得到龙铸物品 (龙心不易获得。) +knowledge.smeltDragonforge.2=这之后得到的物品同样需要淬火才能使用,这一仪式会召来龙族袭击,务必小心! + +knowledge.smeltBlueSteel=锻造蓝钢 +knowledge.smeltBlueSteel.desc=等级 %1$s,常用材料 + +knowledge.smeltBlueSteel.1=随着在复杂合金上的进一步探索,你发现黑钢在性能上已经接近极限,不过在此基础上稍微降低些材料重量还是可行的。通过把青金石和银加入熔炼,可以除去黑钢里的某些物质,使其变成一种更轻的材料,虽然其中的具体机制仍然不明,但这应该是一种不错的升级。 + +knowledge.smeltRedSteel=锻造赤钢 +knowledge.smeltRedSteel.desc=等级 %1$s,常用材料 + +knowledge.smeltRedSteel.1=黑钢在性能上已经接近金属类材料的极限,而且几乎没有什么可以提升的地方了。^不过在你研究红石和金子后,你发现了一些不寻常的事情。在熔炼时把红石和金子融入其中,可以让钢这样的材料结合的更加紧密,从而提高其强度,与此同时重量也随之提升。(注意目前只有钢能完成赤钢的制造) + +knowledge.smeltMithril=锻造秘银 +knowledge.smeltMithril.desc=等级 %1$s,特殊材料 + +knowledge.smeltMithril.1=你发现的这种矿物事实上非常神秘。任何形式的加工都会显著改变其物理特性。例如向其中混入银会改变它的质量和硬度,尽管你并不知道这是如何发生的。^你发现的古代珠宝中似乎包含了某种冶炼说明,它似乎正是古代匠人为了保存这门冶炼技术而留给后人的。至少目前公认的说法如此。 + +knowledge.smeltMithril.2=阅读珠宝中的图纸,你了解到向传说矿中加入银可以制造一种特别轻的材料,也许银在传说矿转化为秘银的过程中起了很大作用。^除此之外,珠宝本身没有其他特别的地方了。 + + +knowledge.smeltAdamantium=锻造艾德曼合金 +knowledge.smeltAdamantium.desc=等级 %1$s,特殊材料 + +knowledge.smeltAdamantium.1=传说矿物的性质非常特殊,将其与黄金一起熔炼的实验产生了一些特别的结果,产物的密度极大地提升了,变得又硬又重,让你有点为难。^你发现的古代珠宝中似乎包含了某种冶炼说明,它似乎正是古代匠人为了保存这门冶炼技术而留给后人的。至少目前公认的说法如此。 + +knowledge.smeltAdamantium.2=阅读珠宝中的图纸,你了解到向传说矿中加入金可以将其转化为一种更重的绿色金属。这个特别的化学反应中金子一定起了重要的转化作用。^除此之外,珠宝本身没有其他特别的地方了。 + +knowledge.smeltMaster=大师级传说 +knowledge.smeltMaster.desc=渐入化境 + +knowledge.smeltMaster.1=你从珠宝中看到了一些图案。无论它是哪个古代文明留下的,都说明当时的人们利用这种珠宝来保存信息。尽管一本书可能做得更好,但是谁知道呢。^你发现了一种和其他珠宝类似的,有着铁砧一般的边缘和刺盾般的造型,这和之前你发现的遗物是一样的。但是你发现了三种这样的珠宝,它们可以很神奇的拼在一起。 + +knowledge.smeltMaster.2=想必当年大师级珠宝是由冶炼大师保管的,而两块稍小的则由两位学徒收藏。在最大的珠宝背后描绘了将合并的珠宝放进工作中的古代坩埚。这也许可以提升坩埚的性能。^最有意思的事情是关于你发现这些遗物的地方。尽管大师级的珠宝随处可见,但是那些稍小的珠宝出现的地点则视地理方位而定,在遥远的南方有着秘银工匠,北方则是艾达曼合金匠人。 + +knowledge.smeltMaster.3=这无疑证实了传说矿加工广泛存在于世界各地的多种文化中。但是这一点对矿物冶炼没有造成影响,所以这些珠宝的结构应该是相同的。^不管怎样,这种三重珠宝拥有强大的力量,并且很可能来自南北两方的大师匠人。把它用在工作中的坩埚里也许可以强化坩埚。 + +knowledge.smeltIgnotumite=锻造依格洛特 +knowledge.smeltIgnotumite.desc=等级 %1$s,大师级材料 + +knowledge.smeltIgnotumite.1=这种被称为依格洛特的材料是艾达曼合金的纯化升级版。它在冶炼过程中使用了比其他传说矿物锻造时还要多的黄金,结果就是创造出了目前为止在所有材料中最重,也是最强力的材料。^这一材料只能在大师级坩埚里锻造。 + +knowledge.smeltMithium=锻造传说锭 +knowledge.smeltMithium.desc=等级 %1$s,大师级材料 + +knowledge.smeltMithium.1=这种材料是使用古代技术锻造出的比秘银更加纯净的材料。传说锭非常之轻,摸起来恍若无物。^这一材料只能在大师级坩埚里锻造。 + +knowledge.smeltEnder=锻造末影锭 +knowledge.smeltEnderforge.desc=等级 %1$s,大师级材料 + +knowledge.smeltEnderforge.1=总有一些东西比那些末地来的生命还要奇怪……而这个发现也许会引导你到它们的起源,也许是它们造出了这种制品,尽管无从解释,因为末影生命并没有高度的文明。^末影锭被视为秘银和艾达曼两种材料的折中产物,兼具二者的优点。在将两种材料融为一体的过程中,末影珍珠起了催化作用。^这一材料只能在大师级坩埚里锻造。 + +knowledge.coalflux=含煤熔剂 +knowledge.coalflux.desc=勤俭持家 +knowledge.coalflux.1=在冶炼过程中,要引发正确的化学反应需要的煤炭量实在是太巨大了。这个问题现在越发严重,以至于如果没有充足的煤炭储备,要熔炼大量金属是非常困难的。^你相信在熔剂中混入煤炭可以减少这些反应中的燃料消耗,每一份熔剂都可以将冶炼过程需要的燃料用量减半,使得等量的燃料可以烧出双份成品。^这个过程并非毫无代价,虽然制作熔剂时用到了煤,但是熔剂本身已不再能作为燃料使用了。 + +knowledge.bigfurn=冶炼炉 +knowledge.bigfurn.desc=大量生产 + +knowledge.bigfurn.1=如今冶炼基础矿物和材料的技术已经接近完美。而炼铁炉已经成了次等、低效又不经济的设备,只能用来做零星工作。^你已开发出一种用耐火粘土制成的大型冶炼炉。 + +knowledge.bigfurn.2=这种冶炼炉可以一次熔炼四种物品,而且效率还不错。它自身的设计很简单,易于操作,只不过它属于多方块结构,在使用前需要正确搭建起来。 + +knowledge.bigfurn.heater=一个冶炼炉要想发挥作用,就得有个放燃料的地方。冶炼炉加热器能够持续的加热炉子,加热器烧的越旺,冶炼炉冶炼物品的速度越快。只不过加热器需要保持稳定,你得在其周围围上耐火石砖。 + +knowledge.bigfurn.top=在加热器顶上摆上冶炼炉。冶炼炉本身与锻铁炉原理类似,只不过能更有效的调节温度。和它下面那个烧燃料的伙计差不多,冶炼炉也需要在周围和顶部摆上耐火石砖。 + +knowledge.bigfurn.structure=此结构同样适用于多重冶炼炉结构。两堵侧墙和一堵背墙即可支持起一排相连的冶炼炉,参考单个冶炼炉的情况。 + +knowledge.blastfurn=精炼 +knowledge.blastfurn.desc=不只是熔炼 + +knowledge.blastfurn.1=一般来说,熔炼矿物 (比如铁矿) 的过程会残留大量杂质,限制了材料性能的发挥。而使用高炉也许为此提供了一条解决之道。^高炉造价高昂,但能创造出其他冶炼设备远不能及的高温,这使得其拥有高得多的提纯率。这为高级材料——钢的制造提供了可能。 + +knowledge.blastfurn.2=当然了,在搭建高炉之前,你得给它搭起一个合适的外壳。能堪此大任者唯有耐火石砖。^高炉方块的合成表中也利用到了耐火石砖,它可以承受住高炉工作中的极端高温。 +#Firebrick Recipes +knowledge.blastfurn.3=高炉本体由两部分组成:高炉加热器和高炉炉室。一个加热器上方最多可以放置16个炉室。放置的炉室越多,能同时熔炼的物品越多。 +#Furnace Recipes +knowledge.blastfurn.4=现在你拥有了耐火砖、一个加热器和一些炉室:你现在可以搭建高炉了。^如何开始:将一个加热器放置在地上。^如果你放置一个坩埚在加热器下面,那么高炉会自动输出产物到坩埚里 (注:坩埚工作需要在下方摆一个铁匠炉) 。^确保在加热器四周留下足够的空间 (大约4个方块) 。^然后在同一高度的加热器四角位置摆放耐火砖块,为了你的安全考虑,不要把加热器四周堵上。 +knowledge.blastfurn.5=准备好这些后,在加热器上方摆放炉室,然后在它四周堆起耐火砖块。记得要让顶部保持露天 (或放置一个烟囱) 。 +#Structure +knowledge.blastfurn.6=使用高炉是相当简单的事情,但是它会消耗大量的燃料。^在最顶部的炉室中的下层格子里放进矿石 (比如处理好的铁矿石) ,上层格子里放进燃料 (煤炭、木炭或者含煤熔剂) (建议在最顶部炉室上放置一个烟囱以控制烟雾排放)。 +knowledge.blastfurn.7=这一步完成后矿石会慢慢向下方的炉室转移,最终变成每个炉室都有一块矿石 (也许最上面的不是) 。这之后在底部的加热器里放一些燃料,注意燃料会一直消耗 (无视有无需要熔炼的材料) 所以最好提前算好需要的燃料。在熔炼完成后:所有的炉室会产出一块金属,然后加热器会释放其中的压力,喷出一串火焰。^确保在火焰释放的路径上没有障碍物,否则会留下火焰甚至爆炸。另外让它远离易燃品! + +knowledge.blastfurn.hcc=$h困难合成模式-$r^此模式开启时,高炉加热器下方必须放置一坩埚以接收高炉生产的熔锭,你需要使用锭模来取出它。 + +#Prepared Iron + +knowledge.blastfurn.9=处理好的铁矿石可用于制造生铁。^生铁可以精炼成钢。^你可以用强力熔剂来使产量加倍,但是由于制作强力熔剂的原料——硼砂很稀有,所以你应该明智的使用它。 + +knowledge.bloomery=锻铁炉 +knowledge.bloomery.desc=初级金属熔炉 + +knowledge.bloomery.1==从包裹着岩石的资源中获取珍贵材料并非易事。锻铁炉可以将矿石冶炼成金属锭。 + +knowledge.bloomery.2=使用方法:在锻铁炉中放入等量的煤和原矿,然后用一个点火器右键。如果一切顺利熔炼就开始了,要熔炼的矿物越多,工作速度越慢。^冶炼炉必须被放置在户外,无遮拦的环境下工作(其实只要顶部无障碍露天即可),如果没有符合条件,它就不会工作,另外烟囱不会对其发挥作用。^整堆物品将在熔炼过程中全部融化,在熔炼过程完成时,炉子顶部会打开。这时使用一把锤子反复敲击炉子,直到所有的金属条全部弹出来。 + +knowledge.bloomery.3=当你准备拿起金属锭时,确保你拿着的是一把空钳子。钳子可以一次夹起一组物品。 + +knowledge.crucible=合金化 +knowledge.crucible.desc=混合金属 + +knowledge.crucible.1=只依赖一种或者另一种单一纯金属来满足需求对你的帮助已经非常有限了。正因如此,才有了坩埚。^坩埚是专为制造合金而设计的设备,你在这里将得到的多种材料混合来熔炼更好的材料。 + +knowledge.crucible.2=为了使其工作,坩埚需要一个在下方的热源 (比如$h锻造炉$r) ,岩浆虽然也可以但是加热速度非常慢。^坩埚内的合成表是无序的,而且遵循着一定的“比例”。^例如:3块青铜需要2块铜和一块锡。这是说你可以在放进两块铜和一块锡,然后熔炼得到三块青铜。但是你也可以放进四块铜和两块锡以得到六块青铜,同理……^另外关于材料的摆法,虽然这些合成是无序的,但是还是有一些规则。格子里的材料比例要符合合成表情况。直接放进2铜1锡坩埚是不会工作的,得放成1铜1铜1锡这样的比例合成3青铜,同理也可以2铜2铜2锡出6青铜等,务必注意。 + +knowledge.crucible.hcc=$h困难合成模式$r^但是在困难合成模式中,熔炼得到的产品无法直接从gui中取出。你需要先制作一个锭模,用其右键坩埚取出金属锭,一次一块,然后右键水源进行冷却。^此外,如果你破坏了坩埚,成品也会消失! + +knowledge.crucible2=高级合金 +knowledge.crucible2.desc=更多混合…… +knowledge.crucible2.1=耐火粘土和耐火砖块的应用范围还可以再被拓宽一些。目前为止你制作的坩埚在温度调节方面还有困难,也不能有效的冶炼原料。不过在制造坩埚的材料中加入耐火粘土应该可以解决这个问题。 + +knowledge.crucible2.blocks=但是即便这样,坩埚的外壁也还不足以完全承受工作时的高温。为了使坩埚正常工作,必须在耐火坩埚四周放置四块耐火砖块。 + +knowledge.apron=铁匠的围裙 +knowledge.apron.desc=护身服 + +knowledge.apron.1=锻造炉在熔炼金属的时候会变得滚烫,在你准备使用它时建议穿上一件围裙,这围裙包含了衬衫,下摆和套袖(三合一)。它适用于锻造金属和转移金属锭。如果不穿着这件衣服的话,物品栏内那些过热的物品就会把你点燃。^译者注:此版本下,即便你穿了这围裙,滚烫的金属条也会让你处于燃烧状态,而围裙的耐久实在太低,所以正确的转移加热金属条的方式依旧是使用钳子右键锻造炉或者别的设备,为了安全最好再在边上放一格水。 + +knowledge.anvil=锻造 +knowledge.anvil.desc=金工基础 + +knowledge.anvil.1=这并不是说工作台已经过时或者怎样,但物品制造方面还有很多更好的方法。锻造是合成各种金属制品的最常用方法。^这一过程包括用锻造炉加热金属,然后在砧上加工它们两步。 + +#Recipe + +knowledge.anvil.2=砧易于制作并且可在火炉内回收。^将砧放置在地上,一个接近水和锻造炉的地方。右击砧的侧边或者不使用锤子右击顶部来打开gui。 + +#Gui + +knowledge.anvil.3=制作物品可能会很复杂,需要两步。^首先一些物品(大部分是金属锭或者金属片)需要在$h锻造炉$r中加热。如果一个物品可以被加热,那么它就需要被加热。^下一步是合成表本身: + +knowledge.anvil.4=从把各种部件放进合成格子开始$h[3]$r 然后使用一把合适的锤子(根据合成表选择使用普通的或沉重的)。每种合成表都有着对锤子和砧的建议等级,等级会在标题处显现$h[1]$r.^拿着锤子敲击砧板。进度条$h[2]$r会开始填充,当完成时:结果会出现在输出栏$h[4]$r。^有些打造出的成品会很烫,你可以拿着它们右击水方块或者水槽(按住shift)来冷却它们。 + +knowledge.anvil.5=要拿起成品:使用钳子右键砧,钳子只会取走最终输出栏的物品。直接拿起滚烫的物品会把你点燃,所以当你要从锻造炉里拿出什么的时候,使用钳子右击锻造炉,然后再右击砧来将其放入。 + +knowledge.anvil.6=在制作时,保持质量条的轨迹。使其中的游标尽量远离两侧边界。要是游标碰到了任一边界,合成材料就会毁掉。此外当你打造具有耐久的物品时,如果在打造完成时游标落在了标记外面,打造出的物品的耐久值会降低。^如你所见,右图中有两个绿色标记,如果蓝色游标落在它们外面,打造出的物品就会受损。而指示栏的两侧边界则是绝对不能碰的禁区。务必交替使用左击和右击来打造物品,并且想好再下锤。另外要注意游标向右移动的距离要小于向左移动。 + +#Quality +knowledge.anvil.7=如果你按住Shift键左击砧的话,会把进度条敲回去 (以给你更多时间用于打造) ,但是不要让进度条回零,否则也会毁掉物品。 + +knowledge.forge=锻造炉 +knowledge.forge.desc=这里越来越热了 + +knowledge.forge.1=锻造炉是一种简易设备,只需要放进燃料 (拿着燃料右键) ,然后用点火器 (比如打火石) 点火。^太简单了!只需要把要加热的物品丢进去然后生火就是。(建议流程是这样,或者你想点燃自己) + +knowledge.forge.2=锻造炉的炉温取决于燃料种类,其上限则取决于最后添加的那种燃料。$h风箱$r可以用来暂时性的提升温度。^你可以把可加热的物品 (比如金属锭和金属块) 放进锻造炉,之后它们就会被慢慢的加热。 + +knowledge.forge.3=$y"可锻造"$r 的物品需要在砧上进行加工,$d"不可锻造"$r 则意味着物品太烫了。^使用不同的燃料还有风箱来取得想要的温度,并务必监视加热材料的状况。^备注:如果把一个坩埚 (或者类似的设备) 放在锻造炉上方,会使锻造炉的gui无法打开 (仍然可以加入燃料和材料,只是没法把加热后的物品取出,另外此情况下坩埚与锻造炉之间不会有输入输出关系) 。 + +knowledge.bellows=风箱 +knowledge.bellows.desc=注入热量 + +knowledge.bellows.1=有时候炉火并不够热,或者可能需要很久才能热上来。使用更高燃烧温度的燃料对你的帮助有限,在不需要的时候还会徒增浪费。^风箱可以将锻造炉的温度暂时提高50%。使用方法:把它放在你想提升温度的炉子旁边 (喷嘴对准炉子) ,然后持续右击风箱。风箱也可以穿墙发挥作用。 + +knowledge.trough=水槽 +knowledge.trough.desc=准备淬火 + +knowledge.trough.1=为了进行淬火,你不得不前往水源地或者干脆选择在水源边建家,这有时会很麻烦,而常规的水源会损害打造出的物品。怎么办呢?使用水槽吧!水槽是可用于物品淬火的简易容器,只需要拿着夹着物品的钳子或者加热后的金属右击水槽即可。加水方法:拿着水桶或者水罐右键水槽,但是切记不要过量。^建议你在水槽中对物品淬火,不然物品有可能会损坏。^你同样可以手持水槽右键水方块来完成加水 (一次即可注满) ,以及在不损失里面储存的水的情况下把它从地上拿起来。 + +knowledge.trough.2=用一些钉子再稍微加工下,你就能以更合适的方式组装起水槽,漏水情况也会降到最低,同时木材的品质也开始影响水槽的质量 (储水量) 。 + +knowledge.repair_basic=工具维修 +knowledge.repair_basic.desc=保持工具状态 + +knowledge.repair_basic.1=工具一坏再坏,而另做新的又实在过于浪费。不过你已研究过各种皮革和钉子,找到了它们新的用途。^简单的材料加上一些工具应该足以修复某些物品,算不上完美但总好过什么都不做。也许进一步的研究会开发出更高效的工具。^使用方法:手持损坏的工具右击放在地面的维修工具即可,注意维修工具有一定几率会损坏。 + +knowledge.repair_advanced=高级维修 +knowledge.repair_advanced.desc=更佳维护 + +knowledge.repair_advanced.1=你已检查过那些从黏胶状方块身上掉落的奇怪的粘液球。不管它是由什么构成的,反正就是很黏的东西。而那些来自本地的巨型蜘蛛身上的丝线同样极为强韧而黏滑。^它们结合在一起应该能升级现有的维修工具,让它使用起来更有效率。 + +knowledge.repair_ornate=华丽维修工具 +knowledge.repair_ornate.desc=附魔工具维修 + +knowledge.repair_ornate.1=魔法道具似乎遵循着它们自身的规则,那些以常规方法补上去的东西很难留在上面。但是黄金和钻石可以抵消这一效果。如果以特定的方式将维修工具与这些材料搭配使用,也许就可以修复附魔道具。^这么做也使得其相对于高级维修工具效率有所提升。 + +knowledge.craftArmourBasic=基础护甲 +knowledge.craftArmourBasic.desc=平淡无奇 +knowledge.craftArmourBasic.1=当你初至这个世界上时,你也许会想给自己找点穿的。这些盔甲虽说并不会给你提供多少防护,但总比没有要好。 + +knowledge.craftArmourLight=轻甲 +knowledge.craftArmourLight.desc=廉价而实用 + +knowledge.craftArmourLight.1=轻甲被设计成尽可能易于穿戴并且只使用少数几种材料制成,因而你无法指望它给你提供多少防护,不过它不会影响战斗中的闪避和招架。^此类护甲在你依靠战术和闪避来进行战斗时效果良好。 +knowledge.craftArmourLight.2=粗制皮甲不过是一层用几片皮革片缝制起来的能勉强蔽体的衣物。这只提供了极小的保护作用,但是产物可以作为合成其他护甲的基础材料。 +knowledge.craftArmourLight.3=带衬护甲在抵挡轻攻击时效果显著,尤其是打击类攻击,而且还可用于合成重甲。 +knowledge.craftArmourLight.4=强化皮甲和镶钉皮甲是粗糙皮甲的升级版,其中强化皮甲可用于合成中型护甲。 +knowledge.craftArmourMedium=中甲 +knowledge.craftArmourMedium.desc=平均防护 + +knowledge.craftArmourMedium.1=对皮革的研究很明显地表明其在强度和对外来攻击的抵抗力上有着很多局限。^类似于动物的皮毛,鳞片和骨架也在保护身体上起了协助作用,你一定可以找到什么可以用来提高皮甲防护能力的东西。^链甲由强化皮甲进一步加工制成,只是在原有护甲的基础上添加了一些金属链网以提供额外的抗性,尽管这会稍微影响走动而且穿久了会很累。 + +knowledge.craftArmourMedium.scale=作为替代,你可以制作鳞甲。鳞甲在抵挡全部种类的攻击上表现较为平衡,只是在抵挡突刺和斩击攻击上效果稍弱,但是在抵挡打击攻击上有所提升。 + +knowledge.craftArmourHeavy=重甲 +knowledge.craftArmourHeavy.desc=坚固而笨重 + +knowledge.craftArmourHeavy.1=中甲虽然给你提供了很好的防护,但这似乎还是有所局限。中等盔甲虽然具有很多优点,但是也许还有某些办法可以进一步改进它。^通过对某些野生动物的解剖表明:羊毛和羽毛做的垫子可以有效地提高装甲强度,护甲内的一层内衬能提供良好的优势。^但这会使得以此种方法制成的护甲非常沉重而难以穿着。 +knowledge.craftArmourHeavy.2=重甲在制作时已经包含了带衬护甲,这层护甲在重甲之下提供了柔软的保护层。 + +knowledge.craftArmourHeavy.splint=条板甲并没有一整套板甲那么重,相对的防护能力也降低了。不过较之于中甲,条板甲的防护性能依旧是十分优异的,对各种攻击都能提供同等的防护。 +knowledge.craftArmourHeavy.plate=板甲是最强的,但是造价也是最昂贵的,打造难度也很高。 +knowledge.craftHCCTools=原始工具 +knowledge.craftHCCTools.desc=(困难模式合成) + +knowledge.craftHCCTools.1=在困难合成模式开启时:原版的工具已经不再像以前那般有效。你在获取到金属前得先合成一些原始的石头工具。^原始工具在木匠工作台上合成。^ 每种石器都需要三种材料制成:^尖锐岩石:通过空手 (不拿任何物品) 破坏石头得到。^藤蔓:使用尖锐岩石破坏树叶获得。 + +knowledge.craftHCCTools.2=木棍的取得方式与藤蔓相同。^圆石同样可以制作尖锐岩石,只不过需要使用锤子在木匠工作台上制作。 + +knowledge.craftHCCTools.3=在你得到了这些材料后,接下来就要做一张木匠工作台以合成工具,强烈建议先做一把稿子,因为它可以用于开采石头 (然后可用锤子将其打碎成尖锐岩石) 。 + +knowledge.craftTools=锻制工具 +knowledge.craftTools.desc=精心打造 +knowledge.craftTools.1=这算哪门子工具?石头和树枝组合一下就能称之为工具了?得了吧!这才是正确的工具制造方式!^所有的常规工具只要以正确的方式打造,工具的耐久值就会加倍,逼格也会翻倍...^镐也可以显示方块的采掘等级以及现在是否可以采掘,只需要手持镐子右击方块即可。(原始工具也具备此功能) + +knowledge.craftAdvTools=高级工具 +knowledge.craftAdvTools.desc=适于用途 + +knowledge.craftAdvTools.1=你现在不止可以打造出各具用途的工具,这里还有一些同样用途的替代品,或者说升级版。绝大多数此类工具只是现有工具的替代,只不过某些地方有所不同。^$h手镐$r^手镐在挖掘像是石头或者末地石一类的方块时有几率掉落随机物品 (比如矿石和其他材料) 。^同时它在开采矿石时也有几率掉落诸如煤炭或者钻石一类的副产物。 + +knowledge.hvypick.info=$h重镐$r^重镐是用来开洞的!在破坏方块时,重镐也会以较低的方块掉落率,将方块周围3x2x3范围内的方块也一并破坏 (英文文本有误,与实际测试不符) 。在挖掘大型洞穴或者矿道时表现完美。 + +knowledge.trow.info=$h手锹$r^这可爱的小铲子和手镐效果类似。在它挖掘泥土时有几率额外掉落随机物品,挖掘草方块时有几率额外掉落各种种子。 + +knowledge.hvyshovel.info=$h重锹$r^虽说看上去像是装了一根长柄的门板,重锹在挖掘工作上是相当实用的工具。^使用时,这种锹可以挖出一片圆盘形的大洞,但是它会无视山丘状地貌 (如果你面前有一座小山,那么这个工具就不会,或者只挖掉一小部分山丘,所以说只是对同一高度的方块起效) 。非常适合用于平整地形。 + +knowledge.scythe.info=$h镰刀$r^手持镰刀右键可以清理大范围的杂草和树叶,在农活和清理工作方面,镰刀表现出色。另外要是你穿了身黑袍子,你可以吓一吓那些老头! + +knowledge.mattock.info=$h鹤嘴锄$r^改造地形的常用工具,鹤嘴锄可用于建设道路。泥土、草方块、沙子都可以被转化为道路。之后可以在其中放入方块以改变其外观。 +knowledge.mattock.use=使用鹤嘴锄右键泥土或者草方块可以将其转化为道路 (并非耕地) 。之后你可以使用其他实心方块 (例如石头) 右键道路以改变其材质 (注意此过程可以无限重复,小心额外的材料消耗) 。你还用锹右击改方块将其变成台阶。^用鹤嘴锄右击路面,可防止路面被改动。屏幕上出现的红色图标表示方块不可修改,而绿色图标则意味着可以。当你制造路面时会开启此功能。 + +knowledge.lumber.info=$h伐木斧$r^伐木斧可以方便地砍伐树木。伐木斧可通过砍掉一块木头从而伐倒整棵树木。高大的树木消耗更多耐久,同时也能获得次工具的更多力量值。 + +knowledge.craftWeapons=锻造武器 +knowledge.craftWeapons.desc=用于“防御” + +knowledge.craftWeapons.1=这是什么?木剑……你可以做个更好的……^每种武器都有不同的风格,总有一款适合你。^$h短剑$r^短剑的攻击力……真的很弱。^但行动和快攻时十分便捷!很适合补刀。 + +knowledge.sword.info=$h剑$r^一把完美而古老的剑。若使用得当,可以抵挡很多伤害。 + +knowledge.mace.info=$h权杖$r^适合敲打脑袋!权杖没那么特别,在格挡伤害时会损坏更多。但它们具有良好的耐久和较高的伤害。 + +knowledge.waraxe.info=$h战斧$r^一把沉重手斧可给敌人凶残的一击。战斧可造成不小的伤害,并且在突刺或跳跃攻击时有加成。适合野蛮的战斗类型。它们也能格挡更多的伤害。 + +knowledge.spear.info=$h矛$r^如果你害怕近身肉搏,可以试着用矛从远距离戳他们……你知道这就像你用一根长棍子将他们推走!^矛突刺时可造成更多伤害。 + +knowledge.bow.info=$h弓$r^标准木制弓与金属关节。^注,像一些脆性金属 (如生铁) 会减弱弓造成的伤害。^潜行时右击可打开物品槽。箭矢必须在使用前装载。 + +knowledge.craftAdvWeapons=重型武器 +knowledge.craftAdvWeapons.desc=大不大? + +knowledge.craftAdvWeapons.1=我不知道你打算杀死什么,但这里有一些……你可能会满意的东西。 + +knowledge.greatsword.info=$h巨剑$r^沉重,平刃的巨剑是最好的防御型重型武器。像剑一样,巨剑有不错的格挡性能。 + +knowledge.warhammer.info=$h战锤$r^如果你想打烂敌人的头骨,你可以考虑下战锤。 + +knowledge.battleaxe.info=$h双刃斧$r^双刃斧比战斧伤害更高但重量更重,是更疯狂的野蛮武器。^就是用着累了点! + +knowledge.halbeard.info=$h戟$r^如果觉得矛太弱,你可以在上面加个斧头。戟比矛的伤害更高但也跟重。^奔跑时戟可以刺击。 + +knowledge.lance.info=$h骑士枪$r^骑士枪没什么卵用。但它们可以基于你的速度提高伤害。^不懂的话可以拿来比武。 + +knowledge.firemaker=生火 +knowledge.firemaker.desc=燃烧一切 +knowledge.dryrocks.info=干燥岩石是最基本和最低效的生火方式。两个敲打在一起一段时间会产生火焰。 +knowledge.tinderbox.info=通过火绒盒生火效率高,且生出的火焰能持续较长一段时间。也许你需要多试几次,但这是值得的。 +knowledge.flintsteel.info=这是最有效的生火方式,可以立即生火。然而打火石相比火绒盒耐久更低。 + +knowledge.craftCrafters=制作工具 +knowledge.craftCrafters.desc=制作各式各样的工具 + +knowledge.craftCrafters.1=有各种用于不同合成的工具。许多合成表需要你用到它们。 +knowledge.hvyhammer.info=$h重锤$r^锤子更重的版本,用于锻造大型金属物品。 + +knowledge.tongs.info=$h钳$r^钳用于从砧中拾取加热的物品,然后把物品置于水源中。用钳夹取加热的物品不会向随机位置掉落,而是掉落在方块之上。 + +knowledge.knife.info=$h匕首$r^匕首可用于烹饪和鞣制。匕首很有用。^^就是别带着它们瞎浪。 + +knowledge.saw.info=$h锯$r^锯可将木头有效地切成木板。将木板方块置于木匠工作台上,然后用锯切割获得木板。^锯也能更有效地回收物品。 + +knowledge.needle.info=$h针$r^针被用来缝纫基础配方,针被用在任何线被用到地方。 + +knowledge.mallet.info=$h槌$r^槌真不常见……它几乎仅被用在锤子或许会太过的地方。所以基本上:只有一些木制品用这个。 + +knowledge.spoon.info=$h勺$r^勺子。用于烹饪,通常搅拌……还有什么可说……这是勺子…… + +knowledge.arrows=箭羽 +knowledge.arrows.desc=制作箭 + +knowledge.arrows.1=制作箭得花点时间,但成本较低。一支箭有三个部件:金属的箭头。箭羽由纸和羽毛来引导方向。箭轴仅由一根木棍构成! + +knowledge.arrowsBodkin=穿甲箭 +knowledge.arrowsBodkin.desc=轻便快捷 + +knowledge.arrowsBodkin.1=箭头的物理特性需要时间掌握,但还有另一种改良方式。你得相信轻型、平滑、匀称的箭头能改善箭的速度和精度。这会减小一点伤害,但这是值得的。 + +knowledge.arrowsBroad=宽型箭 +knowledge.arrowsBroad.desc=沉重强力 + +knowledge.arrowsBroad.1=研究一块燧石后,你发现了一种特别的箭型。尽管制作轻快精准的箭头是不错的选择,沉重的宽型箭可产生可观的伤害。^宽型箭比锥形的设计更重、更慢、误差更大,但产生的伤害是很值得的。 + +knowledge.etools=工程工具 +knowledge.etools.desc=专门工具 +knowledge.etools.1=在某些方面,机械可能是一项精巧的行业。因此,你需要专门的工具来胜任这些工作。 + +knowledge.ecomponents=部件和用品 +knowledge.ecomponents.desc=用于工程 + +knowledge.ecomponents.1=对于工程, 组件可以用一些巧妙的方法加入。然而, 你可能需要找到一些替代品来做这样的事。当需要的时候制作一些是值得的。 + +knowledge.ecomponents.2=大多数机械用品不只是铸造那么简单。一些结构需要预铸造,然后将它们组装在一起。部件一般有明确的用途,最好是即用即产 (除非你想要大量生产) 。 + +knowledge.coke=焦炭 +knowledge.coke.desc=精致燃料 + +knowledge.coke.1=一般来说,充满杂质的煤所能提供的燃烧能力极其微弱。通过精炼、使用红石,木炭可以被烧到完全去除杂质的程度,形成最纯净的煤炭,提供最佳的燃料。然而这一工序只能用于木炭。 + +knowledge.tungsten=黑钨冶炼 +knowledge.tungsten.desc=高性能机械金属 + +knowledge.tungsten.1=工程上使用铁基材料总有些限制;如无法承受某些机器所需的压力。黑钨是低海拔发现的稀有金属,也可以通过使用手镐发现。 + +knowledge.tungsten.2=如果你在16层以下使用足够高级的工具 (如镶钻钢) :可能开采出黑钨原矿。^这之后,需要的只是精炼。黑钨需要大量煤和溶剂才能熔化分解。 + +knowledge.tungsten.3=虽然这种材料对工程师极为重要,但冶炼矿石却需要掌握深度锻造技能,使它更难获得。 + +knowledge.engTanner=高级制革架 +knowledge.engTanner.desc=简易制革 + +knowledge.engTanner.1=制革可能是最累人的生产方式之一,现在你可以用机器使生产更简易。^制革架可为你将干净的兽皮切片切条,只需右键将物品放在制革架上面。 + +knowledge.advcrucible=自动化坩埚 +knowledge.advcrucible.desc=简化合金 + +knowledge.advcrucible.1=坩埚的科技水平较低,而你可以很容易了解到使用此法冶炼金属十分繁琐。^自动化坩埚能够一条龙式的分离并冷却金属。 + +knowledge.advforge=高级锻造 +knowledge.advforge.desc=自动化锻造 + +knowledge.advforge.1=这种矮人的设计可以通过红石信号,更精准地控制燃料燃烧。^这种炉子可以轻易开关,并保留燃料进度。 + +knowledge.blackpowder=黑火药 +knowledge.blackpowder.desc=轰隆! + +knowledge.blackpowder.1=使用普通火药或TNT或许足够了,但这很容易搞得一团糟。其实还可以制作对环境破坏小的爆炸物。^黑火药能对生物造成巨大伤害,但对方块破坏不大。^黑火药由多种矿物制成。 + +knowledge.advblackpowder=精致黑火药 +knowledge.advblackpowder.desc=咔轰! + +knowledge.advblackpowder.1=黑火药已经足够制作爆炸物,但有时你需要更大的爆炸。^通过红石和萤石:你可以增强黑火药的能力,增大爆炸。 + +knowledge.climber=登山镐 +knowledge.climber.desc=从这上去! +knowledge.climber.1=爬山时不得不找到一条斜坡的情况很尴尬,特别是当你掉入50米深的洞穴时。登山镐可使你抓住固体方块,只有完整的方块 (如石头和草方块) 可被抓住。 +knowledge.climber.2=这个物品比较难操作。首先,按住右键点击你正对的方块 (也可以选择选择更上面的方块) 。然后,左键将方块往自己这里拉,按住Shift然后用左键点击往下爬。可以往左右爬 ,也可以向上和向侧面突出 ,但是很困难。 + +knowledge.spyglass=望远镜 +knowledge.spyglass.desc=在远处! +knowledge.spyglass.1=这里有太多要看的东西了,但是限制了我们的眼睛还需要一直走到那里才能看到……不需要了。^当你使用望远镜的时候能让你看到更远的地方,Shift+右键可以切换望远镜模式。 + +knowledge.parachute=降落伞 +knowledge.parachute.desc=刚才什么飞上去了…… +knowledge.parachute.1=你可能知道怎么到达更高的地方,但是如果你待在地面上的话,还可以确定降落伞可以帮助你安全的从很高的地方,缓慢下降。 + +knowledge.syringe=注射器 +knowledge.syringe.desc=简单的管理 +knowledge.syringe.1=在紧急状况的时候喝药水会使人缓慢笨拙。注射器可以直接注射药水进入你的系统,在有用地时刻你在你需要它。你也可以Shift下蹲点击来注射药水。^如何将药水加入注射器:在工作台内放置一个空的注射器和一个普通的药水进行合成。 + +knowledge.bombs=制作炸弹 +knowledge.bombs.desc=扩大爆炸范围 + +knowledge.bombs.1=当使用黑火药的时候没有什么东西能让它在这些小物品可以让小范围内有恐怖的伤害。^炸弹需要多个物品制作……比起其他物品制作。首先: 你需要制作一个工作站。 + +knowledge.bombs.2=然后把工作站放置……随便哪里都行。^这个工作站可以制作炸弹和地雷。可以通过点击右键来投掷炸弹,炸弹会在很短地时间内爆炸。而地雷可以长按右键放置,当有东西接近就会引爆。 + +knowledge.bombs.3=炸弹和地雷需要3-4个物品才能制作。^壳体$h[1]$r确定了装置所造成的的伤害和距离。粉末r$h[2]$r会改变伤害。填充$h[3]$r可以在炸弹上添加效果。最后需要保险丝$h[4]$r确定了爆炸之前时间。 + +knowledge.bombs.4=制作一个炸弹:只用将部件放入相应的地方,比如黑火药和很短的保险丝。然后需要不停的点击扳手来制作物品。然后点击方块制作一个炸弹。 + +knowledge.crossbows=制作弩弓 +knowledge.crossbows.desc=致命一箭 +knowledge.crossbows.1=弩是一种定制的武器,能够以较可靠的命中率造成大量伤害。尽弩弩的射速通常要比弓慢,但是弩可以使用多种部件制成,使它们能发挥更广泛的作用。 +knowledge.crossbows.2=要制造一张弩的话,你需要一个装配台。^装配台允许你组装各式配件以合成最终成品。弩的特性取决于四种部件(弩臂、弩弓、配件和弩头) +knowledge.crossbows.3=将这个台子放在一个想要的位置。现在你需要制作组装弩的零件(请继续阅读)。^每一张弩都需要弩臂和弩弓。弩臂影响弩的后坐力和装弹速度,“手弩”专用的把手速度很快但是准头不高。 +knowledge.crossbows.4=你也许还会给一张弩添加一个配件和弩头。配件可以让弩弓获得更多的功能(需要付出代价),放置在弩弓的顶部。弩头是专门为弩弓的头部而设计的配件(比如一把刺刀)。但是不需要配件的时候就不添加配件准没错。 +knowledge.crossbows.5=要制作一把弩:只用将所有部件放入相应的地方。(类似于制造炸弹)然后你只需要不停的拿着扳手右击合成台来制作物品。 +knowledge.crossbows.6=完成以后,你就得到了一张弩。弩与弓在功能上有所不同,它可以在装弹完毕后立即开火。潜行状态下拿着弩右键会打开其装备栏。这是必须的。你可以添加各种弩箭到弩的装备栏中,这样当你使用弩的时候它会装载弩箭。 + +knowledge.crossShafts=弩臂 +knowledge.crossShafts.desc=重要组成部分 +knowledge.crossShafts.handle=手柄是迷你型的弩臂,用于合成手弩。这种设计提高了换弹速度,以牺牲精度和后坐力的代价。 +knowledge.crossShafts.stock=弩臂是完整体型版的手柄,可以以更小的后坐力发射弩箭。因其尺寸较大,换弹的时间减少了。 + +knowledge.crossHeads=弩弓 +knowledge.crossHeads.desc=重要组成部分 +knowledge.crossHeads.light=一个轻量的弩弓可以以牺牲弩箭力量的代价换取更快的换弹速度。此种弩弓可以被多次调整以增加其重量和力量。 +knowledge.crossHeads.medium=一种标准尺寸的弩弓。有着均衡的力量和速度。 +knowledge.crossHeads.heavy=一种重型、强化后的弩弓。有着恐怖的伤害,也具备更大的后坐力和更慢的换弹速度。 + +knowledge.crossHeadAdvanced=高级弩弓 +knowledge.crossHeadAdvanced.desc=精度高于速度 + +knowledge.crossHeads.advanced=这套矮人弩设计图包含了一种能够释放强力攻击的钢弩。使用合适的材料与工具,你也可以自己做一把。^尽管速度缓慢,这种弩弓能够发射具有致命力量和精度的弩箭。 + +knowledge.crossShaftAdvanced=高级弩臂 +knowledge.crossShaftAdvanced.desc=后坐力控制 + +knowledge.crossShafts.advanced=对于那些基于普通木质弩臂的弩来说,这种矮人弩的弩臂采用了金属设计。尽管沉重,其包含了一个弹簧装弹系统以吸收后坐力。 + +knowledge.crossAmmo=连弩 +knowledge.crossAmmo.desc=扩展能力 +knowledge.crossAmmo.1=弓弩装弹需要时间,而你也许需要发射不止一发弩箭才能解决问题。连弩弩机可以放置于“配件”栏,并允许弓弩在重新装弹之前发射多发弩箭(以牺牲精度的代价)。 + +knowledge.crossScope=弓弩瞄准镜 +knowledge.crossScope.desc=原始的狙击手 +knowledge.crossScope.1=一把精准的弩在你看不见射击目标时又有何用途呢?你现在可以对望远镜进行一些调整以使其适用于弩弓,将其装在“配件”栏。 + +knowledge.crossBayonet=弓弩刺刀 +knowledge.crossBayonet.desc=近战伤害 +knowledge.crossBayonet.1=在一些人给他们的弩重新装弹时,常有一些渣滓会乘机偷袭,你需要以另一种方式进行反击。装在“弩头”栏的刺刀可以增加弩的近战伤害。 + +knowledge.bpress=炸弹组装机 +knowledge.bpress.desc=大规模生产 +knowledge.bpress.1=手工组装每个炸弹会很繁琐……非常繁琐。此设备可替你完成这项工作,你只需把材料放入合成机,拉动拉杆炸弹就做好了。 + +knowledge.bombarrow=爆炸箭 +knowledge.bombarrow.desc=成吨伤害 +knowledge.bombarrow.1=你制作炸弹的经验是值得的。这种微型爆炸物能像炸弹一样组装并释放致命的爆炸。制作爆炸箭的方式和炸弹一样,需要把箭放在炸弹壳的物品槽里。爆炸箭不需要导火索。 + +knowledge.shrapnel=弹片炸弹 +knowledge.shrapnel.desc=简单的装填 +knowledge.shrapnel.1=炸弹目前似乎已足够好了,但仍有提升的空间。每个炸弹都可以加上这种装置,从而改进引爆效果。^在合成中加入炸弹弹片可以提高其爆炸伤害。 + +knowledge.firebomb=燃烧弹 +knowledge.firebomb.desc=烈火焚身 + +knowledge.firebomb.1=弹片炸弹对打击地面上的单个敌人很有效。但有时场面会更加疯狂。^岩浆膏的混合物可使炸弹在爆炸时释放出大团火球。精制岩浆膏则更是能释放出难以抵挡的热度。 + +knowledge.firebomb.2=它的工作原理是岩浆膏 (岩浆怪灰烬的混合物) 能提供源源不断的火焰。额外加入烈焰粉,接着加入龙心,将会产生魔法般的催化效果,提高火焰的温度。 +knowledge.firebomb.3=燃烧弹可能会使你觉得昂贵,但这对攻破敌人防具极为有效。 + +knowledge.bombCeramic=陶瓷炸弹壳 +knowledge.bombCeramic.desc=基础炸弹 +knowledge.bombCeramic.1=炸弹是最简单的爆炸形式之一:只需掷出就会引爆。^但陶瓷壳易碎,不容易控制爆炸。此种炸弹的爆炸范围一般。 + +knowledge.mineCeramic=陶瓷地雷壳 +knowledge.mineCeramic.desc=基础地雷 +knowledge.mineCeramic.1=地雷不像常规的炸弹那么有用,但仍有它们发挥的一席之地。当有物品靠近时,地雷将会爆炸。^陶瓷壳易碎且不稳定,这意味着它很敏感,同时也不容易控制。此种地雷的爆炸范围一般。 + +knowledge.bombIron=铁制炸弹壳 +knowledge.bombIron.desc=可靠的引爆 +knowledge.bombIron.1=一般来说制作更易引爆的炸弹是更明智的做法……为什么不加点压力呢?^铁壳使炸弹引爆(尽管范围变小)需要更大的冲击。 + +knowledge.mineIron=铁制地雷壳 +knowledge.mineIron.desc=可靠的引爆 +knowledge.mineIron.1=陶瓷壳或许过于敏感了。铁炸弹壳不仅能使炸弹积聚更多压力,而且它们的固态结构使它们更难触发,减小爆炸半径提高伤害。 + +knowledge.bombObsidian=黑曜石炸弹壳 +knowledge.bombObsidian.desc=保持新鲜 + +knowledge.bombObsidian.1=这个炸弹示意图呈现出用黑曜石制成的外壳。这种坚硬的外壳更容易控制,适合定点爆破。产生的爆炸范围更小,伤害巨大。 + +knowledge.mineObsidian=黑曜石地雷壳 +knowledge.mineObsidian.desc=保持新鲜 + +knowledge.mineObsidian.1=这是矮人研制的地雷壳。黑曜石地雷壳的设计可实现具体位置的定点爆破。产生的爆炸范围更小,伤害巨大。 + +knowledge.bombCrystal=水晶炸弹壳 +knowledge.bombCrystal.desc=时髦物件 + +knowledge.bombCrystal.1=减小爆炸半径来提高伤害的做法很普遍,但为什么不试着增大爆炸半径呢?^玻璃壳可使爆炸物飞溅得尽量远。^并且,在其中加入钻石,碎片可造成更多伤害! + +knowledge.mineCrystal=水晶地雷壳 +knowledge.mineCrystal.desc=时髦物件 +knowledge.mineCrystal.1=一个精致的玻璃地雷,可轻易造成一场大爆炸。^并且,在其中加入钻石,碎片可造成更多伤害! + +knowledge.bombFuse=导火索 +knowledge.bombFuse.desc=定时爆炸 +knowledge.bombFuse.1=没有导火索的炸弹算什么?只能是烫手的山芋!导火索是任何爆炸装置的重要部件,地雷有时也会用到它。^导火索决定了你的装置何时爆炸。 +knowledge.bombFuse.2=你还可以制作加长导火索。这样你就可以离爆炸物更远了。但对地雷用处不大…… + +knowledge.stickybomb=粘性炸弹 +knowledge.stickybomb.desc=抓住它! +knowledge.stickybomb.1=正如它名字那样,它可以粘在任何与之接触的可怜家伙身上。^所以这是一种能粘住某人,造成巨大伤害的炸弹。其乐无穷! +knowledge.stickybomb.2=制造方法:在输出槽中放入炸弹后,用粘液球右击。一个粘液球就可以黏住整组任何尺寸的炸弹。 + +$hUse of Cogworks$r^ + +knowledge.cogArmour=机甲 +knowledge.cogArmour.desc=动力装甲 + +knowledge.cogArmour.1=这似乎算得上是一项真正意义上的发现,可能解释了为什么矮人废墟里包含特别高大的大厅和走廊结构。这里有一份记载了一整套先进装甲的图纸,这种装甲将人类的动作复刻到了一套沉重的外骨骼上。图纸表明这是一套庞大结实的护甲,能够使穿戴者几乎免疫一切伤害。^机甲是矮人工程学的巅峰产物,能够承载大量的重物。不过美中不足的是它的耗能,需要使用纯净的燃料————很多。 + +knowledge.cogArmour.2=尽管在遗迹中并未发现任何装甲实体,但是组装系统却被完整的保留下来了,这种系统似乎可以容纳下某种装甲,其体积比人类体型还要巨大。 + +knowledge.cogArmour.station=$$h合成站$r^为了组装和调整机甲,你有必要建造一个合成站。机甲合成站由框架和滑轮系统组成。首先,使用框架座搭起三根四格高的柱子,再在顶部中央单独放置一个框架座(参考图示)。 +//Example +knowledge.cogwork_station=合成站 +knowledge.cogArmour.station.2=框架组装完毕后,你需要制作一个滑轮,之后使用扳手右击顶部中央的框架方块将其安装上去。务必保证你是在正确的位置上放置了框架,因为在滑轮安装完毕之后,是没有办法再将其拆卸下来的。 +//Pulley Recipe +knowledge.cogArmour.crafting=组装机甲:你需要三种外骨骼方块(头盔、胸甲和胫甲),在框架中按顺序放置它们,之后使用扳手右击胸甲方块。 +//Piece Recipes +knowledge.cogArmour.armour=$h外骨骼装甲$r^为了给外骨骼添加额外的保护,你需要打造一套外骨骼装甲,制造一套外骨骼装甲需要消耗大量的金属锭,所以建议你使用常见材料,比如钢来制造。外骨骼装甲可以通过右击在框架中吊置的外骨骼来安装上去。不过你还需要16个螺栓,在装甲安装到外骨骼上之前使用(拿着外骨骼装甲右击安装,不是拿着螺栓)。外骨骼装甲可以用一把扳手轻松的卸下。 +//Armour Recipe +knowledge.cogArmour.fuel=$h填充燃料$r^机甲只能使用精炼燃料(焦炭或者岩浆膏)来供能。拿着燃料右击机甲进行填充。^外骨骼套上的装甲越重,燃料消耗的就越快。 +knowledge.cogArmour.advantage=$h优势$r^一套没有装备外骨骼装甲的机甲可以提供对烟雾的免疫力,抵消摔落伤害,增加攻击伤害同时消除精力消耗。 +knowledge.cogArmour.advantage.2=装备上装甲后:此时机甲被密封,你会得到巨额的护甲值奖励并且可以在水下呼吸。此时机甲也可以消除中毒/凋零伤害,并使穿戴者对火焰免疫。 +knowledge.cogArmour.advantage.3=装甲依旧会根据其熔点高低承受火焰伤害,同理更高的耐久等级会使装甲坚持更久。在这之后外骨骼装甲必须在合成站卸下并进行维修。 +knowledge.cogArmour.disadvantage=穿着机甲的时候,你无法跳跃,但是能够直接走上一格高的方块,你的移动速度也会变得很慢,并且不能潜行。 +knowledge.cogArmour.disadvantage.2=爆炸同样会对装甲造成损伤,不仅比其他类型的伤害更高,还会造成一秒钟的眩晕。 +knowledge.cogArmour.removal=尽管外骨骼装甲会在外骨骼损坏的时候被移除,但是外骨骼框架会完好的保留下来,而一套未载人的,没有安装装甲的外骨骼可以通过使用一把扳手左击的方式来拆掉,如果在装甲损坏的情况下被留在火焰或岩浆中,外骨骼也会损毁。 + +knowledge.compPlate=复合合金 +knowledge.compPlate.desc=用途广泛 + +knowledge.compPlate.1=目前,大多数合金都是通过将物质简单地在锅中混合制成的。这种由矮人设计的金属则不同,是由多种材料压制而成的。虽然用于制作工具不高效,但用于制造装甲非常有效,尽管有些重。^显然这种特别的合金是为机甲而生的。 + +knowledge.refined_planks=精制木板 +knowledge.refined_planks.desc=结构稳定 +knowledge.refined_planks.1=精制木板坚韧、耐风雨,是体面的建材。将它们钉入钉子就可以制作出适合建筑的方块。此方块不可被拆分。^你也可以用普通的木板制作。 + +knowledge.constructionPts=建筑部件 +knowledge.constructionPts.desc=制作完备的木头 +knowledge.constructionPts.1=很多情况木头必须被切割为不同的形状,来适应不同的建筑需要。^就像金属用于制作配件和钉子,制作合适的家具需要大量木材。 + +knowledge.reinforced_stone=强化石头 +knowledge.reinforced_stone.desc=负重 +knowledge.reinforced_stone.1=石头是有用的坚固材料,不可燃且具有高爆炸抗性。而你还可以通过熔化黑曜石和高岭石来提高它的性能。^你从坩埚中制得石材不需要模具。 + +knowledge.clay_wall=粘土面板 +knowledge.clay_wall.desc=装饰墙壁 +knowledge.clay_wall.1=这种墙主要用于装饰。很适合用于双层建筑和屋顶内衬。 + +knowledge.glass=玻璃块 +knowledge.glass.desc=装饰窗户 +knowledge.glass.1=玻璃用于装饰,但是非常脆弱。在玻璃周围放置框架,不仅能提高其强度,而且可以安全地采集它。 + +knowledge.brickworks=基础制砖 +knowledge.brickworks.desc=强化石材 +knowledge.brickworks.1=石材用处多多。泥土和石头可以制成铺路石和砖。 + +knowledge.bars=金属栅栏 +knowledge.bars.desc=结实的栅栏 +knowledge.bars.1=这种栅栏不但可使光线穿过,而且还十分坚固。栅栏可由普通材料 (而不是罕见的或传奇的) 制成。^但仍可以制作龙铸的栅栏来释放它的潜能。 + +knowledge.thatch=茅草 +knowledge.thatch.desc=柔软的屋顶 +knowledge.thatch.1=由茅草制作简单的屋顶。这些可以和泥土很好的搭配起来,而且很容易制作。 + +knowledge.paint_brush=油漆刷 +knowledge.paint_brush.desc=粉刷一切 +knowledge.paint_brush.1=你会明显注意到,用手涂抹颜料会把一切搞糟。你需要一把油漆刷。^油漆刷可以更改木板的外表,而且可以覆盖已有的颜色。 +knowledge.paint_brush.2=$h轻松粉刷$r^为了解决频繁使用工作台的麻烦,你还可以粉刷一些游戏中的方块,只要你的物品栏中有颜料,右击方块诸如钉板,可以把它们涂上颜色。 + +knowledge.decorated_stone=石材装饰 +knowledge.decorated_stone.desc=金属装饰 +knowledge.decorated_stone.1=石材可能看上去很沉闷,所以你学会了用金属装饰结实的石头,为你的墙壁增色几分。 + +knowledge.tool_rack=工具架 +knowledge.tool_rack.desc=存储你的工具 +knowledge.tool_rack.1=如果你有很多工具,可能需要一些空间来容纳它们。工具架可以快速存取物品。^右击方块放置或空手取下工具。^重型武器需要两格高的架子放置,长柄武器则需要三格。 +knowledge.tool_rack.rules=*重型武器需要上下两个架子。^*长柄武器需要上下三个架子。^*全套的弩视为重型武器。^*弩不可以被放置在边缘的钩上。 + +knowledge.bed_roll=床铺 +knowledge.bed_roll.desc=四海为家 +knowledge.bed_roll.1=在野外时,有时需要立即睡觉。床铺允许你睡觉但并不重置重生点。 + +knowledge.food_box=专用箱子 +knowledge.food_box.desc=食品储存 +knowledge.food_box.1=食品和医疗用品在需要时能被很容易地获取。箱子允许你存储食品和绷带几倍于它们的最大堆叠数。点击右键可放入物品或空手将物品取回。 + +knowledge.ammo_box=弹药箱 +knowledge.ammo_box.desc=弹药储存 +knowledge.ammo_box.1=弹药应该也必须在使用时能被很容易地获取。弹药箱允许你存储箭、弩箭、炸弹或地雷八倍于它们的最大堆叠数。点击右键可放入物品或空手将整组物品取回,手持远程武器 (弓/弩) 可装载弹药。 +knowledge.ammo_box.2=被破坏时,所存储的物品仍然存储,并可在二次放置后存取物品。 + +knowledge.big_box=存储箱 +knowledge.big_box.desc=存储各种物品 +knowledge.big_box.1=不管是为了贮存还是装运,这些箱子里允许放置任何物品,无论其最大堆叠数是多少。 + +knowledge.generic_meat=普通的肉 +knowledge.generic_meat.desc=制成各种食物 +knowledge.generic_meat.1=有许多种肉类。但有时不会如此。普通的肉可由各种生或熟肉制成,如此能占据更少的存储空间。^你最好准备一些生肉,有些可以提供额外效果。 + +knowledge.stew=炖肉 +knowledge.stew.desc=有点平淡 +knowledge.stew.1=你不是厨师……至少现在还不是。就将一些肉粒放入碗中然后当做餐饮!炖肉可由牛排、鸡肉、猪肉、狼肉、马肉甚至鱼肉制作。 + +knowledge.jerky=肉干 +knowledge.jerky.desc=旅行者必备 +knowledge.jerky.1=肉干不可能是最好吃的食物,但它有自己的用场。这是为数不多的可堆叠食品,且有一个像样的耐力加成。适合挖掘和探索时食用。 + +knowledge.saussage=香肠 +knowledge.saussage.desc=密封的肉 +knowledge.saussage.1=当用肉制作肉干时,你倾向于为了实用性牺牲食用时的快感。嘎嘣脆!把肉包进……嗯……内脏由制成的外壳中可以保持新鲜。 + +knowledge.sandwitch=三明治 +knowledge.sandwitch.desc=简单的 +knowledge.sandwitch.1=一块肉和一些面包的混合物,你怎么会不知道?!三明治虽然不可堆叠但是可以食用两次。 + +knowledge.sandwitchBig=超大三明治 +knowledge.sandwitchBig.desc=加长 +knowledge.sandwitchBig.1=你现在可以把更多馅料加入面包里制作三明治,它们可被食用4次。 + +knowledge.meatpie=肉馅饼 +knowledge.meatpie.desc=丰富的馅料 +knowledge.meatpie.1=有什么比把肉放在馅饼里更好?没有!肉馅饼可以提供高耐力buff。可将馅饼放到地上并用刀右击将其切片。 + +knowledge.shepardpie=马铃薯派 +knowledge.shepardpie.desc=大众小吃 +knowledge.shepardpie.1=加入了马铃薯,比肉馅饼更棒!提供更强的耐力buff。可将派放到地上并用刀右击将其切片。 + +knowledge.salt=盐 +knowledge.salt.desc=多一点点 +knowledge.salt.1=盐有时会作为烹饪中使用的添加剂。制作盐,先要准备一些盐水。盐水可用粘土罐右击沙子上的水源 (例如沙滩) 取得。然后烹煮出盐。 +knowledge.salt.2=陶壶能够长期储存盐渍食物而不腐坏。这些被用来收集盐水。^盐水可直接在沙子上方的水源“或”在沙滩 / 海洋群系中采集到。 + +knowledge.jug=罐子 +knowledge.jug.desc=储存液体 +knowledge.jug.1=携带大量食物会很麻烦,并且你不能携带液体,基于此,罐子派上了用场。罐子能储存牛奶、水和油。 +knowledge.jug.2=和桶相似,可以用右键收集水,但也可以通过合成与桶中的液体转换。牛奶不能直接从牛获取。 + +knowledge.bread=面包和糕点 +knowledge.bread.desc=颗粒状 +knowledge.bread.1=面包也许是乏味的一餐,加入其他食品会更有趣。^而面粉可以用来制作各种糕点。 +knowledge.bread.other=一些合成表 (例如之前已提到的面包) 可使用替代合成表,但仅限 MF 食品。 + +knowledge.oats=燕麦 +knowledge.oats.desc=健康的基础要求 +knowledge.oats.1=并不是所有的食物都是混合物。你可以选择食用这种天然谷物混合物保持健康。 + +knowledge.icing=糖 +knowledge.icing.desc=含糖即是正义 +knowledge.icing.1=加一点糖没有什么问题,除非它保存在某人的口袋里三天…… 你可以直接将甘蔗在陶罐中研磨为糖,并把糖储存在罐中。放些口袋里的糖也没问题。 +knowledge.icing.2=一些食物没有了糖就显得不完美了。糖用于制作很多甜食。 + +knowledge.sweetroll=甜甜圈 +knowledge.sweetroll.desc=让我猜猜看…… +knowledge.sweetroll.1=甜甜圈能使很多人满足。吃点它,即使它不回复耐力或给予耐力提升效果。甜甜圈可以食用两次。 + +knowledge.eclair=泡芙 +knowledge.eclair.desc=花式小吃 +knowledge.eclair.1=现在你在张扬……但是这些还是无法与那些华丽的甜食比较……^这些小点心可以食用四次。 + +knowledge.cake=蛋糕 +knowledge.cake.desc=用**正确**的方式制作! +knowledge.cake.1=一个大蛋糕。恢复一些耐力并附有一个短时间的耐力提升buff。将派放到地上并用刀右击将其切片。可将蛋糕放到地上并用刀右击将其切片。 + +knowledge.carrotcake=胡萝卜蛋糕 +knowledge.carrotcake.desc=有点健康…… +knowledge.carrotcake.1=蛋糕里加入了胡萝卜 。可以恢复一些耐力并附有一个短时间的耐力提升buff。可将派放到地上并用刀右击将其切片。 + +knowledge.chococake=巧克力蛋糕 +knowledge.chococake.desc=好吃得要死 +knowledge.chococake.1=巧克力蛋糕可以恢复一些耐力并附有一个短时间的耐力提升buff。可将蛋糕放到地上并用刀右击将其切片。 + +knowledge.bfcake=黑森林蛋糕 +knowledge.bfcake.desc=美味 +knowledge.bfcake.1=黑森林蛋糕可以恢复耐力并且可以让耐力消耗减小。可将蛋糕放到地上并用刀右击将其切片。 + +knowledge.berrypie=浆果派 +knowledge.berrypie.desc=简易的甜点 +knowledge.berrypie.1=浆果美味多汁,但你也许需要加工。浆果派可以恢复一些耐力并附有一个短时间的耐力提升buff。可将派放到地上并用刀右击将其切片。 + +knowledge.applepie=苹果派 +knowledge.applepie.desc=简易的甜点 +knowledge.applepie.1=浆果馅饼类似,具有更好一点的效果。苹果派可以恢复一些耐力并附有一个短时间的耐力提升buff。可将派放到地上并用刀右击将其切片。 + +knowledge.cheese=奶酪 +knowledge.cheese.desc=固体奶酪 +knowledge.cheese.1=奶酪由炼牛奶制成。它可以合成其他的食物。可将奶酪块放到地上并用刀右击将其切片。 + +knowledge.cheeseroll=奶酪卷 +knowledge.cheeseroll.desc=简易的小吃 +knowledge.cheeseroll.1=奶酪和面包是很好的混合物。把一点奶酪放在卷子里,给它增加一些味道。 + +knowledge.firepit=火塘和煎锅 +knowledge.firepit.desc=基础烹饪 +knowledge.firepit.1=火塘是为烹饪和照明提供火焰的稳定方式,且制作成本低。要生火,先放置火塘并右击木材加入燃料,然后再用点火物右击火塘生火。 +knowledge.firepit.2=烤盘用于烹饪,必须放置在热源 (火塘或炉子) 上。^右键单击烤盘将生食放置上面,并一直等到它烹饪完成,注意不要熟过了。烹饪某些配方 (如蛋糕) 需要更稳定的温度。这时使用锻造炉和煤粉会更合适。 +knowledge.firepit.3=烤箱能够像普通的炉灶一样烘焙面包等物品。^烤箱还可以将粘土制成陶瓷,使它们可用于烹饪以及制作其他工艺品,承受很高的温度 (如锻造炉中的煤)。 +knowledge.firepit.4=当烹饪时:使用一个火塘进行基础烹饪,一个烧煤粉的锻造炉用来进行高级烹饪,一个烧基础燃料(比如煤)的锻造炉用来烧制陶器。 + +knowledge.cookingutensil=炊具 +knowledge.cookingutensil.desc=用于烹饪的工具 +knowledge.cookingutensil.1=在烹饪中,需要许多不可或缺的工具,比如盘子和饼模。工具介绍见基础部分。 + +knowledge.bandage=绷带 +knowledge.bandage.desc=急救 +knowledge.bandage.1=残血时右键使用绑带能快速回复生命值。^然而对饥饿、溺水、灼烧、中毒等状态没什么用。 + +knowledge.bandageadv=精良的绷带 +knowledge.bandageadv.desc=稀有物品 +knowledge.bandageadv.1=这种增强的绷带可以回复更多生命值,然而花销也更大。 + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/MASTERY TEXT/ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +knowledge.title= +knowledge.title.desc= +knowledge.title.1= + +knowledge.fitness=健康值 +knowledge.fitness.desc=保持健康 +knowledge.fitness.1=你战场上的 (除了真实的外) 最大敌人是能量。^耐力消耗减少25%。 + +knowledge.toughness=韧性 +knowledge.toughness.desc=坚持住! +knowledge.toughness.1=你对战斗的熟知已经证明你有了对各种攻击的抗性。^所有伤害降低25%。 + +knowledge.armourpro=精通兵器 +knowledge.armourpro.desc=举重若轻 +knowledge.armourpro.1=从今往后,你的内心变得强大。^武器对耐力的消耗减半。 + +knowledge.parrypro=闪避策略 +knowledge.parrypro.desc=控制动作 +knowledge.parrypro.1=战场上的位置是一种重要武器,也能发挥更多优势。^闪避时按住shift可以使你跃到敌人身后。这对突破敌方防御很有效。 + +knowledge.counteratt=反击 +knowledge.counteratt.desc=反弹伤害 +knowledge.counteratt.1=闪避也许能保护你,但也会带来一些副作用,不过只要你有足够的经验,反击将给你带来优势。^闪避后可进行攻击,但效果减弱。 +knowledge.counteratt.2=对剑、短剑和太刀采取刺击。^对战斧采取背部刺击。^对重武器采取连续碾压。^对钝的武器和长柄武器没有任何效果。 + +knowledge.autoparry=自动格挡 +knowledge.autoparry.desc=洞察攻击 +knowledge.autoparry.1=招架的技巧已经深深的记在你的肌肉当中。^在非格挡状态下你也能招架攻击 (但防御范围降低)。 + +knowledge.scrapper=拾荒者 +knowledge.scrapper.desc=收集一切 +knowledge.scrapper.1=你学会了更多将物品合成和分解的技巧。^增加分解物品掉落几率。 + +knowledge.firstaid=急救 +knowledge.firstaid.desc=照顾伤员 +knowledge.firstaid.1=你需要时刻准备治疗伤口。^绷带使用速度显著加快。 + +knowledge.doctor=医生 +knowledge.doctor.desc=救死扶伤 +knowledge.doctor.1=你不断救助你的同伴,因此获得了医学上的经验。^绑带治疗加成50%。 From 5ada9d8d2269b3694736895a8b391f0cfb28b815 Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 7 Jun 2017 16:08:46 +0700 Subject: [PATCH 009/101] Cleanup --- .gradle/2.8/taskArtifacts/cache.properties | 1 - .gradle/2.8/taskArtifacts/cache.properties.lock | Bin 17 -> 0 bytes Changelog.txt | 3 --- 3 files changed, 4 deletions(-) delete mode 100644 .gradle/2.8/taskArtifacts/cache.properties delete mode 100644 .gradle/2.8/taskArtifacts/cache.properties.lock delete mode 100644 Changelog.txt diff --git a/.gradle/2.8/taskArtifacts/cache.properties b/.gradle/2.8/taskArtifacts/cache.properties deleted file mode 100644 index 5c200f6b..00000000 --- a/.gradle/2.8/taskArtifacts/cache.properties +++ /dev/null @@ -1 +0,0 @@ -#Sat Apr 09 04:34:14 EDT 2016 diff --git a/.gradle/2.8/taskArtifacts/cache.properties.lock b/.gradle/2.8/taskArtifacts/cache.properties.lock deleted file mode 100644 index 14a013802b2eca7ace0a840b3aa6d71661dc8a56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZQhkd>d(^>52L1~6br0RS;U1f~E0 diff --git a/Changelog.txt b/Changelog.txt deleted file mode 100644 index 088b7780..00000000 --- a/Changelog.txt +++ /dev/null @@ -1,3 +0,0 @@ -Alpha 2.6.13 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*Changed food values (balanced on a sugar/carbs/fats system) \ No newline at end of file From bbd36811dd8e7dfae097cb1e86e6a56a4cb5a220 Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 7 Jun 2017 16:10:23 +0700 Subject: [PATCH 010/101] Dropped mod update detector support --- src/main/java/mods/mud/ModUpdateDetector.java | 171 ------ .../mud/ModUpdateDetectorTickHandeler.java | 84 --- src/main/java/mods/mud/MudCommands.java | 42 -- src/main/java/mods/mud/Release.java | 69 --- src/main/java/mods/mud/UpdateChecker.java | 145 ----- src/main/java/mods/mud/UpdateEntry.java | 58 -- .../UnknownVersionFormatException.java | 4 - .../mods/mud/gui/GuiChangelogDownload.java | 512 ------------------ .../java/mods/mud/gui/GuiModUpdateButton.java | 61 --- .../java/mods/mud/gui/GuiSlotModList.java | 84 --- src/main/java/mods/mud/utils/FileDeleter.java | 26 - 11 files changed, 1256 deletions(-) delete mode 100644 src/main/java/mods/mud/ModUpdateDetector.java delete mode 100644 src/main/java/mods/mud/ModUpdateDetectorTickHandeler.java delete mode 100644 src/main/java/mods/mud/MudCommands.java delete mode 100644 src/main/java/mods/mud/Release.java delete mode 100644 src/main/java/mods/mud/UpdateChecker.java delete mode 100644 src/main/java/mods/mud/UpdateEntry.java delete mode 100644 src/main/java/mods/mud/exceptions/UnknownVersionFormatException.java delete mode 100644 src/main/java/mods/mud/gui/GuiChangelogDownload.java delete mode 100644 src/main/java/mods/mud/gui/GuiModUpdateButton.java delete mode 100644 src/main/java/mods/mud/gui/GuiSlotModList.java delete mode 100644 src/main/java/mods/mud/utils/FileDeleter.java diff --git a/src/main/java/mods/mud/ModUpdateDetector.java b/src/main/java/mods/mud/ModUpdateDetector.java deleted file mode 100644 index 8ac538bc..00000000 --- a/src/main/java/mods/mud/ModUpdateDetector.java +++ /dev/null @@ -1,171 +0,0 @@ -package mods.mud; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import net.minecraft.client.Minecraft; -import net.minecraft.command.ICommandSender; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; -import net.minecraftforge.client.ClientCommandHandler; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.config.Property; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.ModContainer; - -/** - * MUD is a client side only utility for mods to send automated report for updates and changelog - */ -public class ModUpdateDetector { - public static Logger logger = LogManager.getLogger("M.U.D"); - private static boolean hasInitialised = false; - private static Map updateMap; - public static boolean hasChecked = false; - private static Configuration config; - private static Property check; - public static boolean enabled = true; - private static ICommandSender sender = null; - - /** - * The main registration method for a mod - * @param mc The FML wrapper for a mod, you can get it with {@link FMLCommonHandler#findContainerFor(Object)} - * @param updateXML An expected url for an xml file, listing mod versions and download links by Minecraft releases - * @param changelog An expected url for a file containing text to describe any changes, can be null - */ - public static void registerMod(ModContainer mc, URL updateXML, URL changelog){ - if(!hasInitialised){ - initialise(); - hasInitialised = true; - } - updateMap.put(mc.getModId(), new UpdateEntry(mc, updateXML, changelog)); - } - - /** - * Helper registration method for a mod - * @param mc The FML wrapper for a mod, you can get it with {@link FMLCommonHandler#findContainerFor(Object)} - * @param updateXML String that can be converted as an url for an xml file, listing mod versions and download links by Minecraft releases - * @param changelog String that can be converted as an url for a file containing text to describe any changes, can be null - * @throws MalformedURLException If no known protocol is found, or updateXML is null. - */ - public static void registerMod(ModContainer mc, String updateXML, String changelog) throws MalformedURLException { - registerMod(mc, new URL(updateXML), changelog!=null?new URL(changelog):null); - } - - /** - * Helper registration method for a mod - * @param mod A modid or mod instance - * @param updateXML String that can be converted as an url for an xml file, listing mod versions and download links by Minecraft releases - * @param changelog String that can be converted as an url for a file containing text to describe any changes, can be null - * @throws MalformedURLException If no known protocol is found, or updateXML is null. - */ - public static void registerMod(Object mod, String updateXML, String changelog) throws MalformedURLException { - registerMod(FMLCommonHandler.instance().findContainerFor(mod), updateXML, changelog); - } - - public static void runUpdateChecker(){ - - if(enabled){ - ICommandSender sender = getSender(); - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.YELLOW + StatCollector.translateToLocal("mud.name") + - EnumChatFormatting.WHITE + ": "+StatCollector.translateToLocal("message.checking") - )); - - Thread t = new Thread(new UpdateChecker(updateMap.values())); - t.run(); - } - - } - - public static Collection getAllUpdateEntries(){ - return updateMap.values(); - } - - private static void initialise() { - updateMap = new HashMap(); - /* - * The time between update checks in minutes. - * A value <=0 will only run the updater when a player joins the world. - */ - int Timer = 60*60*20; - try{ - config = new Configuration(new File(Loader.instance().getConfigDir(), "MUD.cfg")); - Timer = config.get(Configuration.CATEGORY_GENERAL, "Update Time", 60, "The time in minutes between update checks").getInt() * 60 * 20; - check = config.get(Configuration.CATEGORY_GENERAL, "Update Check Enabled", true, "Should MUD automatically check for updates"); - enabled = check.getBoolean(true); - if(config.hasChanged()){ - config.save(); - } - }catch(Exception handled){ - handled.printStackTrace(); - } - - FMLCommonHandler.instance().bus().register(new ModUpdateDetectorTickHandeler(Timer)); - ClientCommandHandler.instance.registerCommand(new MudCommands()); - } - - public static void toggleState(){ - enabled = !enabled; - check.set(enabled); - config.save(); - } - - public static ICommandSender getSender() { - if(sender == null){ - sender = Minecraft.getMinecraft().thePlayer; - } - return sender; - } - - - public static void notifyUpdateDone(){ - ICommandSender sender = getSender(); - if(sender != null){ - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.YELLOW + StatCollector.translateToLocal("mud.name") + - EnumChatFormatting.WHITE + ": "+StatCollector.translateToLocal("message.check.done") - )); - } - - int outOfDateCount = 0; - int failedCount = 0; - for(UpdateEntry e : updateMap.values()){ - try { - if(!e.isUpToDate()){ - outOfDateCount ++; - } - } catch (Exception e1) { - failedCount++; - } - } - ChatComponentTranslation chat; - if(outOfDateCount > 0){ - if(sender != null){ - chat = new ChatComponentTranslation("message.you.have.outdated", outOfDateCount); - chat.getChatStyle().setColor(EnumChatFormatting.RED); - sender.addChatMessage(chat); - chat = new ChatComponentTranslation("message.type.to.view"); - chat.getChatStyle().setColor(EnumChatFormatting.RED); - sender.addChatMessage(chat); - } - }else{ - if(sender != null){ - chat = new ChatComponentTranslation("message.up.to.date"); - chat.getChatStyle().setColor(EnumChatFormatting.DARK_GREEN); - sender.addChatMessage(chat); - } - } - hasChecked = true; - } -} diff --git a/src/main/java/mods/mud/ModUpdateDetectorTickHandeler.java b/src/main/java/mods/mud/ModUpdateDetectorTickHandeler.java deleted file mode 100644 index c4380727..00000000 --- a/src/main/java/mods/mud/ModUpdateDetectorTickHandeler.java +++ /dev/null @@ -1,84 +0,0 @@ -package mods.mud; - -import java.util.List; - -import mods.mud.gui.GuiModUpdateButton; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiIngameMenu; -import net.minecraft.client.gui.GuiScreen; -import cpw.mods.fml.client.GuiModList; -import cpw.mods.fml.common.ObfuscationReflectionHelper; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; - -/** - * Created with IntelliJ IDEA. - * User: Aaron - * Date: 24/08/13 - * Time: 4:20 PM - * To change this template use File | Settings | File Templates. - */ -public class ModUpdateDetectorTickHandeler { - - private final int timer_interval; - private int timer; - private GuiScreen lastScreen; - - public ModUpdateDetectorTickHandeler(int timer) { - this.timer_interval = timer; - } - - @SubscribeEvent - public void onPlayerTick(TickEvent.PlayerTickEvent event){ - if(event.phase == TickEvent.Phase.START){ - if(timer == 0){ - ModUpdateDetector.runUpdateChecker(); - } - - if(timer_interval > 0){ - timer = (timer+1) % timer_interval; - }else{ - timer = -1; - } - } - } - - @SubscribeEvent - public void onRenderTick(TickEvent.RenderTickEvent event) { - if(event.phase == TickEvent.Phase.START){ - if(Minecraft.getMinecraft().currentScreen != null && - //Minecraft.getMinecraft().currentScreen != lastScreen && - Minecraft.getMinecraft().currentScreen instanceof GuiIngameMenu || - Minecraft.getMinecraft().currentScreen instanceof GuiModList){ - lastScreen = Minecraft.getMinecraft().currentScreen; - List buttonList = getButtonList(lastScreen); - if(buttonList!=null){ - boolean hasMumButton = false; - for(Object o : buttonList){ - if(o instanceof GuiModUpdateButton){ - hasMumButton = true; - break; - } - } - if(!hasMumButton){ - int x = lastScreen.width / 2 + 105; - int y = lastScreen.height / 4 + 8; - if(lastScreen instanceof GuiModList){ - x = lastScreen.width - 110; - y = 10; - } - buttonList.add(new GuiModUpdateButton(99, x, y, lastScreen)); - } - } - } - } - } - - private List getButtonList(GuiScreen currentScreen) { - try{ - return ObfuscationReflectionHelper.getPrivateValue(GuiScreen.class, currentScreen, "buttonList", "field_146292_n"); - }catch (Exception e){ - return null; - } - } -} diff --git a/src/main/java/mods/mud/MudCommands.java b/src/main/java/mods/mud/MudCommands.java deleted file mode 100644 index e1c5b556..00000000 --- a/src/main/java/mods/mud/MudCommands.java +++ /dev/null @@ -1,42 +0,0 @@ -package mods.mud; - -import java.util.List; - -import mods.mud.gui.GuiChangelogDownload; -import net.minecraft.client.Minecraft; -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; - -public class MudCommands extends CommandBase{ - - @Override - public String getCommandName() { - return "mud"; - } - - @Override - public List addTabCompletionOptions(ICommandSender par1ICommandSender, String[] par2ArrayOfStr) { - return getListOfStringsMatchingLastWord(par2ArrayOfStr, getCommandName()); - } - - @Override - public boolean canCommandSenderUseCommand(ICommandSender par1ICommandSender){ - return true; - } - - @Override - public String getCommandUsage(ICommandSender icommandsender) { - return null; - } - - @Override - public void processCommand(ICommandSender icommandsender, String[] astring) { - Minecraft.getMinecraft().displayGuiScreen(new GuiChangelogDownload(Minecraft.getMinecraft().currentScreen)); - } - - @Override - public int compareTo(Object o) { - return this.compareTo((ICommand)o); - } -} diff --git a/src/main/java/mods/mud/Release.java b/src/main/java/mods/mud/Release.java deleted file mode 100644 index e17e8455..00000000 --- a/src/main/java/mods/mud/Release.java +++ /dev/null @@ -1,69 +0,0 @@ -package mods.mud; - -import java.util.Arrays; - -public class Release implements Comparable{ - public int[] version; - public EnumReleaseType type; - public String url; - public String download; - public String md5; - - public Release(EnumReleaseType type, String url, int[] version, String download) { - this(type, url, version, download, null); - } - - public Release(EnumReleaseType type, String url, int[] version, String download, String md5) { - this.type = type; - this.url = url; - this.version = version; - this.download = download; - this.md5 = md5; - } - - @Override - public int compareTo(Release other) { - - for(int i = 0; i < version.length && i < other.version.length; i++){ - if(version[i] > other.version[i]){ - return 1; - }else if (version[i] < other.version[i]){ - return -1; - } - } - - return version.length - other.version.length; - } - - public String getVersionString(){ - StringBuffer newVersionString = new StringBuffer(); - for(int i = 0; i < version.length; i++){ - newVersionString.append(version[i]); - newVersionString.append("."); - } - newVersionString.deleteCharAt(newVersionString.lastIndexOf(".")); - return newVersionString.toString(); - } - - @Override - public String toString() { - return "Release{" + - "type=" + type + - ", version=" + Arrays.toString(version) + - ", url='" + url + '\'' + - '}'; - } - - - public static enum EnumReleaseType{ - Normal(1), - Beta(2), - Dev(3); - - public int level; - - private EnumReleaseType(int level){ - this.level = level; - } - } -} diff --git a/src/main/java/mods/mud/UpdateChecker.java b/src/main/java/mods/mud/UpdateChecker.java deleted file mode 100644 index 1f845a3d..00000000 --- a/src/main/java/mods/mud/UpdateChecker.java +++ /dev/null @@ -1,145 +0,0 @@ -package mods.mud; - -import java.net.URL; -import java.util.Collection; -import java.util.TreeSet; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import cpw.mods.fml.common.Loader; - -public class UpdateChecker implements Runnable{ - private Collection updateEntries; - - public UpdateChecker(Collection entries){ - updateEntries = entries; - } - - - @Override - public void run() { - //Map latestReleases = new HashMap(); - - for(UpdateEntry entry:updateEntries){ - Release latest = getUpToDateRelease( - entry.getMc().getModId(), - Loader.instance().getMCVersionString().replaceAll("Minecraft ", ""), - Release.EnumReleaseType.Normal, - entry.getUpdateXML() - ); - - entry.setLatest(latest); - } - - ModUpdateDetector.notifyUpdateDone(); - - } - - public Release getUpToDateRelease(String modId, String targetMcVersion, Release.EnumReleaseType versionLevel, URL updateURL){ - try{ - - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - Document doc = db.parse(updateURL.openStream()); - - NodeList mods = doc.getElementsByTagName("mod"); - - TreeSet releases = new TreeSet(); - - for(int i = 0; i < mods.getLength(); i++){ - Node mod = mods.item(i); - if(mod.hasAttributes() && - mod.getAttributes().getNamedItem("modid") != null && - mod.getAttributes().getNamedItem("modid").getNodeValue().equals(modId)){ - - NodeList mcVersions = mod.getChildNodes(); - for(int j = 0; j < mcVersions.getLength(); j++){ - Node mcVersion = mcVersions.item(j); - - if(mcVersion.hasAttributes() && - mcVersion.getAttributes().getNamedItem("version") != null && - mcVersion.getAttributes().getNamedItem("version").getNodeValue().equals(targetMcVersion)){ - - NodeList releasNodes = mcVersion.getChildNodes(); - for(int k = 0; k < releasNodes.getLength(); k++){ - Release release = parseNode(releasNodes.item(k), versionLevel); - if(release != null){ - releases.add(release); - } - } - - } - - } - - } - } - - if(!releases.isEmpty()){ - return releases.last(); - } - - }catch (Exception e){ - e.printStackTrace(); - } - - return null; - - } - - - - private Release parseNode(Node item, Release.EnumReleaseType versionLevel) { - if(item.hasAttributes()){ - - Node versionNode = item.getAttributes().getNamedItem("version"); - Node typeNode = item.getAttributes().getNamedItem("type"); - String url = null; - String download = null; - String md5 = null; - if(item.getAttributes().getNamedItem("url") != null){ - url = item.getAttributes().getNamedItem("url").getNodeValue(); - } - if(item.getAttributes().getNamedItem("md5") != null){ - md5 = item.getAttributes().getNamedItem("md5").getNodeValue(); - } - if(item.getAttributes().getNamedItem("download") != null){ - download = item.getAttributes().getNamedItem("download").getNodeValue(); - } - Release.EnumReleaseType releaseType = Release.EnumReleaseType.Normal; - if(typeNode != null){ - if(typeNode.getNodeValue().equalsIgnoreCase("beta")){ - releaseType = Release.EnumReleaseType.Beta; - } - if(typeNode.getNodeValue().equalsIgnoreCase("dev")){ - releaseType = Release.EnumReleaseType.Dev; - } - } - - if(versionNode != null && releaseType.level <= versionLevel.level){ - String[] split = versionNode.getNodeValue().toLowerCase().split("\\."); - int[] version = new int[split.length]; - for(int i = 0; i < split.length; i++){ - try{ - version[i] = Integer.parseInt(split[i]); - }catch (NumberFormatException e){ - return null; - } - } - - return new Release(releaseType, url, version, download, md5); - }else{ - return null; - } - - - }else{ - return null; - } - } -} diff --git a/src/main/java/mods/mud/UpdateEntry.java b/src/main/java/mods/mud/UpdateEntry.java deleted file mode 100644 index 859243ac..00000000 --- a/src/main/java/mods/mud/UpdateEntry.java +++ /dev/null @@ -1,58 +0,0 @@ -package mods.mud; - -import java.net.URL; - -import mods.mud.exceptions.UnknownVersionFormatException; -import cpw.mods.fml.common.ModContainer; - -public class UpdateEntry{ - - private ModContainer mc; - private URL updateXML; - private URL changelogURL; - private Release latest = null; - - public UpdateEntry(ModContainer mc, URL updateXML, URL changelogURL) { - this.mc = mc; - this.updateXML = updateXML; - this.changelogURL = changelogURL; - } - - public ModContainer getMc() { - return mc; - } - - public URL getUpdateXML() { - return updateXML; - } - - public URL getChangelogURL() { - return changelogURL; - } - - public Release getLatest() { - return latest; - } - - public void setLatest(Release latest) { - this.latest = latest; - } - - public boolean isUpToDate() throws UnknownVersionFormatException, NullPointerException { - - String[] version_split = mc.getVersion().split("\\."); - int[] version = new int[version_split.length]; - - try{ - for(int i = 0; i < version.length; i++){ - version[i] = Integer.parseInt(version_split[i]); - } - Release thisVersion = new Release(Release.EnumReleaseType.Normal, null, version, null); - - return (thisVersion.compareTo(latest) >= 0); - } - catch(NumberFormatException e){ - throw new UnknownVersionFormatException(); - } - } -} diff --git a/src/main/java/mods/mud/exceptions/UnknownVersionFormatException.java b/src/main/java/mods/mud/exceptions/UnknownVersionFormatException.java deleted file mode 100644 index c91e0c78..00000000 --- a/src/main/java/mods/mud/exceptions/UnknownVersionFormatException.java +++ /dev/null @@ -1,4 +0,0 @@ -package mods.mud.exceptions; - -public class UnknownVersionFormatException extends Exception { -} diff --git a/src/main/java/mods/mud/gui/GuiChangelogDownload.java b/src/main/java/mods/mud/gui/GuiChangelogDownload.java deleted file mode 100644 index 3ffdee3d..00000000 --- a/src/main/java/mods/mud/gui/GuiChangelogDownload.java +++ /dev/null @@ -1,512 +0,0 @@ -package mods.mud.gui; - -import java.awt.Desktop; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.DataInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; - -import javax.xml.bind.DatatypeConverter; - -import mods.mud.ModUpdateDetector; -import mods.mud.UpdateChecker; -import mods.mud.UpdateEntry; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.util.StatCollector; - -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.ModContainer; - -public class GuiChangelogDownload extends GuiScreen -{ - private GuiSlotModList modList; - private int selected = -1; - private UpdateEntry selectedMod; - private ArrayList entries; - - private String[] changelog; - - int lineStart = 0; - private GuiButton disable; - private GuiButton download; - private GuiButton close1; - private GuiButton ok; - private GuiButton urlButton; - - private boolean isDownloading = false; - private boolean downloadComplete = false; - private boolean downloadFailed = false; - private float downloadPercent; - private String message; - - private GuiScreen parent; - private char[] bullets = new char[]{0x2219, 0x25E6, 0x2023}; - private int[] bulletWidth = new int[3]; - - private Thread getChangeLogThread; - - public GuiChangelogDownload(GuiScreen parent){ - this.parent = parent; - changelog = new String[]{StatCollector.translateToLocal("log.message.loading")}; - if(!ModUpdateDetector.hasChecked){ - new UpdateChecker(ModUpdateDetector.getAllUpdateEntries()).run(); - } - - this.entries=new ArrayList(ModUpdateDetector.getAllUpdateEntries()); - } - - public GuiChangelogDownload(){ - this(null); - } - - @Override - public void initGui() - { - this.buttonList.clear(); - this.modList=new GuiSlotModList(this, entries, 100); - this.modList.registerScrollButtons(this.buttonList, 1, 2); - - for(int i= 0; i < bullets.length; i++){ - bulletWidth[i] = fontRendererObj.getStringWidth(bullets[i]+" "); - } - disable = new GuiButton(3, 15, 10, 125, 20, StatCollector.translateToLocal("mud.disable")+": "+Boolean.toString(!ModUpdateDetector.enabled)); - download = new GuiButton(4, 15, height-35, 125, 20, StatCollector.translateToLocal("button.download.latest")); - download.enabled = false; - close1 = new GuiButton(5, width-140, height-35, 125, 20, StatCollector.translateToLocal("gui.done")); - ok = new GuiButton(6, (width - 200)/2 + 5, (height - 150)/2+115, 190, 20, StatCollector.translateToLocal("button.ok")); - urlButton = new GuiButton(7, (width - 125)/2, height-35, 125, 20, StatCollector.translateToLocal("button.url")); - urlButton.enabled = false; - ok.visible = isDownloading; - ok.enabled = downloadComplete || downloadFailed; - - buttonList.add(disable); - buttonList.add(download); - buttonList.add(close1); - buttonList.add(ok); - buttonList.add(urlButton); - } - - @Override - protected void keyTyped(char par1, int par2) - { - if(!isDownloading){ - if (par2 == 1) - { - this.mc.displayGuiScreen(parent); - this.mc.setIngameFocus(); - } - } - } - - @Override - protected void actionPerformed(GuiButton button) { - if (button.enabled) - { - if(!isDownloading || (downloadFailed || downloadComplete) ){ - switch (button.id) - { - case 3: - isDownloading = false; - close1.enabled = true; - ModUpdateDetector.toggleState(); - disable.displayString = StatCollector.translateToLocal("mud.disable")+":"+Boolean.toString(!ModUpdateDetector.enabled); - return; - case 4: - ModContainer mc = selectedMod.getMc(); - String filename = String.format("[%s] %s - %s.jar", - Loader.instance().getMCVersionString().replaceAll("Minecraft", "").trim(), - mc.getName(), - selectedMod.getLatest().getVersionString()); - File newFile = new File(mc.getSource().getParent(), filename); - Thread t = new Thread(new Downloader(selectedMod.getLatest().download, - newFile, mc.getSource(), selectedMod.getLatest().md5 - )); - t.start(); - isDownloading = true; - ok.visible = true; - close1.enabled = false; - download.enabled = false; - urlButton.enabled = false; - return; - case 5: - this.mc.displayGuiScreen(parent); - return; - case 6: - isDownloading = false; - downloadComplete = false; - downloadFailed = false; - ok.visible = false; - close1.enabled = true; - urlButton.enabled=true; - return; - case 7: - if(selectedMod != null && selectedMod.getLatest() != null && selectedMod.getLatest().url != null){ - try { - Desktop.getDesktop().browse(new URI(selectedMod.getLatest().url)); - } catch (IOException e) { - e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. - }catch (URISyntaxException e) { - e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. - } - } - return; - } - } - } - super.actionPerformed(button); - } - - @Override - public void drawDefaultBackground() { - super.drawBackground(0); - } - - @Override - public void drawScreen(int p_571_1_, int p_571_2_, float p_571_3_) - { - if(modList != null) - this.modList.drawScreen(p_571_1_, p_571_2_, p_571_3_); - - if(selectedMod != null){ - - int start = 32; - for(int i = lineStart; i < changelog.length && start < height-52; i++){ - start = drawText(changelog[i], start); - } - - } - - int mouse_x = Mouse.getEventX() * this.width / this.mc.displayWidth; - int mouse_y = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1; - - if(mouse_x > 125 && mouse_y > 35 && mouse_y < height-50){ - int scroll = Mouse.getDWheel(); - if(scroll < 0 && lineStart < changelog.length-15){ - lineStart++; - } - if(scroll > 0 && lineStart > 0){ - lineStart--; - } - } - - if(isDownloading){ - ok.visible = true; - int x = (width - 200)/2; - int y = (height - 150)/2; - - drawRect(x-1,y-1,x+201, y+151, 0xFFFFFFFF); - drawRect(x,y,x+200, y+150, 0xFF000000); - - drawCenteredString(fontRendererObj, StatCollector.translateToLocal("gui.downloading"), width/2, y + 15, 0xFFFFFF00); - - drawRect(x + 24, y + 39, x+176, y+56, 0xFFFFFFFF); - drawRect(x + 25, y + 40, (x+25 + 150), y+55, 0xFF000000); - - - drawRect(x + 25, y + 40, (int)(x+25 + 150*downloadPercent), y+55, 0xFFc0c0c0); - drawVerticalLine((int)(x+25 + 150*downloadPercent)-1, y + 39, y+55, 0xFF808080); - drawHorizontalLine(x + 25, (int)(x+25 + 150*downloadPercent)-1, y + 54, 0xFF808080); - - if(downloadComplete){ - drawCenteredString(fontRendererObj, StatCollector.translateToLocal("gui.download.complete"), width/2, y + 70, 0xFF44FF44); - } - - if(downloadFailed){ - drawCenteredString(fontRendererObj, StatCollector.translateToLocal("gui.download.failed"), width/2, y + 70, 0xFFFF0000); - } - - if(message != null){ - drawCenteredString(fontRendererObj, message, width/2, y + 85, 0xFFFFFFFF); - } - - ok.drawButton(mc, p_571_1_, p_571_2_); - - } - - super.drawScreen(p_571_1_, p_571_2_, p_571_3_); - } - - private int drawText(String line, int start) { - int startX = 125; - - if(line == null){ - return 5; - } else if(line.startsWith("==") && line.substring(2).contains("==")){ - - String main = line.substring(2, line.lastIndexOf("==")).trim(); - - float scale = 1F; - GL11.glScalef(1/scale, 1/scale, 1/scale); - this.drawString(fontRendererObj, main.replaceAll("=", "").trim(), (int)((startX)*scale), (int)(start*scale), 0xFFFFFF00); - GL11.glScalef(scale, scale, scale); - - if(line.lastIndexOf("==")+2 <= line.length()){ - String sub = line.substring(line.lastIndexOf("==")+2, line.length()).trim(); - GL11.glScalef(1/scale, 1/scale, 1/scale); - this.drawString(fontRendererObj, sub.replaceAll("=", "").trim(), (int)((startX+fontRendererObj.getStringWidth(main+" "))*scale), (int)(start*scale), 0xFF2222FF); - GL11.glScalef(scale, scale, scale); - } - - return (int)(1F/scale * 10)+start; - }else if(line.trim().startsWith("**") && line.trim().endsWith("**")){ - float scale = 1.1F; - GL11.glScalef(1/scale, 1/scale, 1/scale); - this.drawString(fontRendererObj, line.replaceAll("\\*\\*", "").trim(), (int)((startX)*scale), (int)(start*scale), 0xFFFFFFFF); - GL11.glScalef(scale, scale, scale); - return (int)(1F/scale * 10)+start; - }else{ - float scale = 1.2F; - GL11.glScalef(1/scale, 1/scale, 1/scale); - - int bullet = -1; - while(line.startsWith("*")){ - startX+=10; - line = line.substring(1).trim(); - bullet++; - } - - if(bullet > 3){ - bullet = 3; - } - - List lineList = fontRendererObj.listFormattedStringToWidth(line, width - 10 - startX); - Iterator it = lineList.iterator(); - for(int i = 0; it.hasNext(); i++){ - String subline = it.next().trim(); - - if(i == 0 && bullet > -1){ - subline = bullets[bullet]+" "+subline; - }else if (bullet > -1){ - startX+=bulletWidth[bullet]; - } - this.drawString(fontRendererObj, subline, (int) ((startX) * scale), (int) (start * scale), 0xFFFFFFFF); - start += (int)(1F/scale * 10); - } - - - GL11.glScalef(scale, scale, scale); - return start; - } - } - - Minecraft getMinecraftInstance() { - return mc; - } - - FontRenderer getFontRenderer() { - return fontRendererObj; - } - - /** - * @param var1 - */ - public void selectModIndex(int var1) - { - if(getChangeLogThread == null || !getChangeLogThread.isAlive()){ - this.selected=var1; - if (var1>=0 && var1<=entries.size()) { - this.selectedMod=entries.get(selected); - } else { - this.selectedMod=null; - } - - urlButton.enabled = selectedMod!=null && selectedMod.getLatest()!=null && selectedMod.getLatest().url!=null; - if(selectedMod!=null) { - if (selectedMod.getChangelogURL() == null) { - changelog = new String[]{StatCollector.translateToLocal("log.message.none")}; - } else { - getChangeLogThread = new Thread(new ChangelogLoader(selectedMod.getChangelogURL())); - getChangeLogThread.start(); - changelog = new String[]{StatCollector.translateToLocal("log.message.loading")}; - } - - try { - if (!selectedMod.isUpToDate()) { - download.enabled = true; - download.displayString = StatCollector.translateToLocal("button.download.latest"); - } - } catch (Exception e) { - - } - } - } - } - - public boolean modIndexSelected(int var1) - { - return var1==selected; - } - - private class ChangelogLoader implements Runnable{ - - URL changelogURL; - - private ChangelogLoader(URL changelogURL) { - this.changelogURL = changelogURL; - } - - @Override - public void run() { - try { - BufferedReader br = new BufferedReader(new InputStreamReader(changelogURL.openStream())); - String line = br.readLine(); - ArrayList lines = new ArrayList(100); - if(line != null) - lines.add(line); - while(line != null){ - line = br.readLine(); - lines.add(line); - } - - changelog = lines.toArray(new String[0]); - } catch (IOException e) { - e.printStackTrace(); - changelog = new String[]{StatCollector.translateToLocal("log.message.fail")}; - } - } - } - - private class Downloader implements Runnable{ - - private String downloadUrl = ""; - private File file = null; - private File orginial; - private byte[] expectedMd5; - - public Downloader(String url, File location, File originalFile, String md5){ - this.downloadUrl = url; - this.file = location; - this.orginial = originalFile; - if(md5 != null){ - try{ - this.expectedMd5 = DatatypeConverter.parseHexBinary(md5.toUpperCase()); - }catch (Exception e){ - e.printStackTrace(); - this.expectedMd5 = null; - } - } - - } - - @Override - public void run() { - try { - isDownloading = true; - - if(file.exists()) - file.delete(); - file.createNewFile(); - - URL url=new URL(downloadUrl); - HttpURLConnection connection = - (HttpURLConnection) url.openConnection(); - int filesize = connection.getContentLength(); - float totalDataRead=0; - java.io.BufferedInputStream in = new java.io.BufferedInputStream(connection.getInputStream()); - java.io.FileOutputStream fos = new java.io.FileOutputStream(file); - java.io.BufferedOutputStream bout = new BufferedOutputStream(fos,1024); - byte[] data = new byte[1024]; - int i; - while((i=in.read(data,0,1024))>=0) - { - totalDataRead=totalDataRead+i; - bout.write(data,0,i); - downloadPercent=(totalDataRead)/filesize; - } - bout.close(); - in.close(); - - if(expectedMd5 != null){ - DataInputStream dis = null; - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - byte [] fileData = new byte[(int)file.length()]; - dis = new DataInputStream((new FileInputStream(file))); - dis.readFully(fileData); - dis.close(); - byte[] md5 = md.digest(fileData); - - ModUpdateDetector.logger.trace("Expected MD5: "+bytArrayToHex(expectedMd5)); - ModUpdateDetector.logger.trace("File MD5: "+bytArrayToHex(md5)); - - if(Arrays.equals(md5, expectedMd5)){ - downloadComplete = true; - ok.enabled = true; - message = StatCollector.translateToLocal("gui.restart"); - }else{ - downloadComplete = false; - downloadFailed = true; - ok.enabled = true; - message = StatCollector.translateToLocal("gui.md5.fail"); - - //file.delete(); - - } - - } catch (Exception e) { - e.printStackTrace(); - if(dis != null){ - try{ - dis.close(); - }catch (Exception ex){} - } - - downloadFailed = true; - ok.enabled = true; - - } - }else{ - downloadComplete = true; - ok.enabled = true; - message = StatCollector.translateToLocal("gui.restart"); - } - - if(downloadComplete && - orginial.exists() && - !orginial.getName().equals(file.getName()) && - !orginial.isDirectory() - ){ - ModUpdateDetector.logger.trace("Deleting: "+orginial.getAbsolutePath()); - if(!orginial.delete()){ - ModUpdateDetector.logger.trace("Deleting failed, spawning new process to delete"); - String cmd = "java -classpath \""+file.getAbsolutePath()+"\" mods.mud.utils.FileDeleter \""+orginial.getAbsolutePath()+"\""; - Runtime.getRuntime().exec(cmd); - } - } - - } catch (IOException e) { - e.printStackTrace(); - message = StatCollector.translateToLocal(e.getLocalizedMessage()); - downloadFailed = true; - ok.enabled = true; - } - } - - - } - - String bytArrayToHex(byte[] a) { - StringBuilder sb = new StringBuilder(); - for(byte b: a) - sb.append(String.format("%02x", b&0xff)); - return sb.toString(); - } -} diff --git a/src/main/java/mods/mud/gui/GuiModUpdateButton.java b/src/main/java/mods/mud/gui/GuiModUpdateButton.java deleted file mode 100644 index 2cde805f..00000000 --- a/src/main/java/mods/mud/gui/GuiModUpdateButton.java +++ /dev/null @@ -1,61 +0,0 @@ -package mods.mud.gui; - -import java.util.List; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; - -import org.lwjgl.opengl.GL11; - -public class GuiModUpdateButton extends GuiButton{ - - - RenderItem renderItem = new RenderItem(); - ItemStack icon = new ItemStack(Blocks.farmland); - List text = null; - private GuiScreen parent; - public GuiModUpdateButton(int id, int x, int y, GuiScreen parent) { - super(id, x, y, 100, 20, ""); - this.parent = parent; - } - - @Override - public void drawButton(Minecraft par1Minecraft, int par2, int par3) { - super.drawButton(par1Minecraft, par2, par3); - - if(text == null){ - text = par1Minecraft.fontRenderer.listFormattedStringToWidth(StatCollector.translateToLocal("mud.name"), 80); - } - - renderItem.renderItemIntoGUI(par1Minecraft.fontRenderer, par1Minecraft.getTextureManager(), icon, xPosition+2, yPosition+2); - - int l = 14737632; - - if (!this.enabled) - l = -6250336; - else if (this.field_146123_n) - l = 16777120; - - float scale = 1.25F; - GL11.glScalef(1F/scale, 1F/scale, 1F/scale); - - for(int i = 0; i < text.size() && i < 2; i++){ - drawCenteredString(par1Minecraft.fontRenderer, text.get(i), (int)(scale*(xPosition+20+40)), (int)(scale*((yPosition+3)+par1Minecraft.fontRenderer.FONT_HEIGHT*i)), l); - } - GL11.glScalef(scale, scale, scale); - } - - @Override - public boolean mousePressed(Minecraft par1Minecraft, int par2, int par3) { - boolean press = super.mousePressed(par1Minecraft, par2, par3); - if(press){ - Minecraft.getMinecraft().displayGuiScreen(new GuiChangelogDownload(parent)); - } - return press; - } -} diff --git a/src/main/java/mods/mud/gui/GuiSlotModList.java b/src/main/java/mods/mud/gui/GuiSlotModList.java deleted file mode 100644 index 1e922240..00000000 --- a/src/main/java/mods/mud/gui/GuiSlotModList.java +++ /dev/null @@ -1,84 +0,0 @@ -package mods.mud.gui; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import mods.mud.UpdateEntry; -import mods.mud.exceptions.UnknownVersionFormatException; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.resources.I18n; -import cpw.mods.fml.client.GuiScrollingList; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.LoaderState; -import cpw.mods.fml.common.ModContainer; - -public class GuiSlotModList extends GuiScrollingList -{ - private GuiChangelogDownload parent; - private List entries; - - public GuiSlotModList(GuiChangelogDownload parent, Collection entries, int listWidth) - { - super(parent.getMinecraftInstance(), listWidth, parent.height, 32, parent.height - 65 + 4, 10, 25); - this.parent=parent; - this.entries = new ArrayList(entries); - } - - @Override - protected int getSize() - { - return entries.size(); - } - - @Override - protected void elementClicked(int var1, boolean var2) - { - this.parent.selectModIndex(var1); - } - - @Override - protected boolean isSelected(int var1) - { - return this.parent.modIndexSelected(var1); - } - - @Override - protected void drawBackground() - { - this.parent.drawDefaultBackground(); - } - - @Override - protected int getContentHeight() - { - return (this.getSize()) * 25 + 1; - } - - @Override - protected void drawSlot(int listIndex, int var2, int var3, int var4, Tessellator var5) - { - ModContainer mc=entries.get(listIndex).getMc(); - if (Loader.instance().getModState(mc)== LoaderState.ModState.DISABLED) - { - this.parent.getFontRenderer().drawString(this.parent.getFontRenderer().trimStringToWidth(mc.getName(), listWidth - 10), this.left + 3 , var3 + 2, 0xFF2222); - this.parent.getFontRenderer().drawString(this.parent.getFontRenderer().trimStringToWidth("DISABLED", listWidth - 10), this.left + 3 , var3 + 12, 0xFF2222); - } - else - { - this.parent.getFontRenderer().drawString(this.parent.getFontRenderer().trimStringToWidth(mc.getName(), listWidth - 10), this.left + 3 , var3 + 2, 0xFFFFFF); - try{ - if(entries.get(listIndex).isUpToDate()){ - this.parent.getFontRenderer().drawString(this.parent.getFontRenderer().trimStringToWidth(I18n.format("mud.version.latest"), listWidth - 10), this.left + 3 , var3 + 12, 0xFF00FF00); - }else{ - this.parent.getFontRenderer().drawString(this.parent.getFontRenderer().trimStringToWidth(I18n.format("mud.version.out"), listWidth - 10), this.left + 3 , var3 + 12, 0xFFFF0000); - } - }catch (UnknownVersionFormatException e){ - - }catch (NullPointerException e){ - - } - } - } - -} \ No newline at end of file diff --git a/src/main/java/mods/mud/utils/FileDeleter.java b/src/main/java/mods/mud/utils/FileDeleter.java deleted file mode 100644 index 65246212..00000000 --- a/src/main/java/mods/mud/utils/FileDeleter.java +++ /dev/null @@ -1,26 +0,0 @@ -package mods.mud.utils; - -import java.io.File; - -import mods.mud.ModUpdateDetector; - -public class FileDeleter { - public static void main(String[] args){ - if(args.length > 0){ - File f = new File(args[0]); - if(f.exists()){ - while(f.exists()){ - f.delete(); - ModUpdateDetector.logger.trace("File in use, try again in 1 second"); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - - } - } - -} From d4763e3dee5af92fcc950adc334a3fe69930b296 Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 7 Jun 2017 16:12:06 +0700 Subject: [PATCH 011/101] Why not?) --- src/main/java/minefantasy/mf2/MineFantasyII.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index cc0a2380..82ec629c 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -210,6 +210,6 @@ public static boolean isDebug() { * Determines if a player name is that of a MF modder */ public static boolean isNameModder(String name) { - return name.equals("Galactic_Hiker") || name.equals("tim4200"); + return name.equals("Galactic_Hiker") || name.equals("tim4200") || name.equals("Sirse"); } } \ No newline at end of file From 56d1c7c9b39952e72a9527897d20a700bac79c48 Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 7 Jun 2017 23:20:01 +0700 Subject: [PATCH 012/101] Basic NEI support, localization fixes, latest forge version NEI support unfinished, still need some polish --- build.gradle | 25 +- .../java/minefantasy/mf2/MineFantasyII.java | 2 +- .../integration/nei/MFPositionedStack.java | 61 ++++ .../mf2/integration/nei/NEIPlugin.java | 49 +++ .../integration/nei/RecipeHandlerAnvil.java | 130 +++++++ .../nei/RecipeHandlerBigFurnace.java | 110 ++++++ .../nei/RecipeHandlerBlastFurnace.java | 86 +++++ .../integration/nei/RecipeHandlerBloom.java | 119 +++++++ .../nei/RecipeHandlerCarpenter.java | 157 +++++++++ .../nei/RecipeHandlerCrucible.java | 122 +++++++ .../integration/nei/RecipeHandlerQuern.java | 118 +++++++ .../integration/nei/RecipeHandlerTanning.java | 78 +++++ .../minefantasy/mf2/item/ClientItemsMF.java | 10 +- .../mf2/network/ClientProxyMF.java | 321 ++++++++++++------ .../assets/minefantasy2/lang/en_US.lang | 1 + .../assets/minefantasy2/lang/ru_RU.lang | 1 + 16 files changed, 1257 insertions(+), 133 deletions(-) create mode 100644 src/main/java/minefantasy/mf2/integration/nei/MFPositionedStack.java create mode 100644 src/main/java/minefantasy/mf2/integration/nei/NEIPlugin.java create mode 100644 src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java create mode 100644 src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java create mode 100644 src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java create mode 100644 src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java create mode 100644 src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java create mode 100644 src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java create mode 100644 src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java create mode 100644 src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java diff --git a/build.gradle b/build.gradle index 9fbb506b..a36d48e8 100644 --- a/build.gradle +++ b/build.gradle @@ -22,10 +22,17 @@ group= "minefantasy.mf2.minefantasy2" // http://maven.apache.org/guides/mini/gui archivesBaseName = "MineFantasyII" minecraft { - version = "1.7.10-10.13.2.1230" + version = "1.7.10-10.13.4.1614-1.7.10" runDir = "eclipse" } +repositories { + maven { + name = "chickenbones" + url = "http://chickenbones.net/maven/" + } +} + task deobfJar(type: Jar) { from sourceSets.main.output classifier = 'deobf' @@ -35,19 +42,9 @@ task deobfJar(type: Jar) { tasks.build.dependsOn('deobfJar') dependencies { - // you may put jars on which you depend on in ./libs - // or you may define them like so.. - //compile "some.group:artifact:version:classifier" - //compile "some.group:artifact:version" - - // real examples - //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env - //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env - - // for more info... - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html - + compile "codechicken:CodeChickenLib:1.7.10-1.1.3.140:dev" + compile "codechicken:CodeChickenCore:1.7.10-1.0.7.47:dev" + compile "codechicken:NotEnoughItems:1.7.10-1.0.5.120:dev" } processResources diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 82ec629c..1b486546 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -55,7 +55,7 @@ /** * @author Anonymous Productions */ -@Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);required-after:FML@[5.0.5,)", version = MineFantasyII.VERSION) +@Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);required-after:FML@[5.0.5,);after:NotEnoughItems", version = MineFantasyII.VERSION) public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; diff --git a/src/main/java/minefantasy/mf2/integration/nei/MFPositionedStack.java b/src/main/java/minefantasy/mf2/integration/nei/MFPositionedStack.java new file mode 100644 index 00000000..c7bbfae8 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/MFPositionedStack.java @@ -0,0 +1,61 @@ +package minefantasy.mf2.integration.nei; + +import java.util.ArrayList; +import java.util.List; + +import codechicken.nei.ItemList; +import codechicken.nei.PositionedStack; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; + +public class MFPositionedStack extends PositionedStack { + public boolean permutated = false; + + public MFPositionedStack(Object object, int x, int y) { + this(object, x, y, true); + } + + public MFPositionedStack(Object object, int x, int y, boolean genPerm) { + super(object, x, y, genPerm); + } + + @Override + public void generatePermutations() { + if (permutated) + return; + + ArrayList stacks = new ArrayList(); + for (ItemStack item : items) { + if (item == null || item.getItem() == null) + continue; + + if (item.getItemDamage() == Short.MAX_VALUE) { + List permutations = ItemList.itemMap.get(item.getItem()); + if (!permutations.isEmpty()) { + for (ItemStack stack : permutations) { + if (item.getItem().equals(stack.getItem()) + && CustomToolHelper.doesMatchForRecipe(item, stack)) { // TODO: + // Rework + stacks.add(stack.copy()); + } + } + } else { + ItemStack base = new ItemStack(item.getItem(), item.stackSize); + base.setTagCompound(item.getTagCompound()); + stacks.add(base); + } + continue; + } + + stacks.add(item.copy()); + } + items = stacks.toArray(new ItemStack[0]); + + if (items.length == 0) + items = new ItemStack[] { new ItemStack(Blocks.fire) }; + + permutated = true; + setPermutationToRender(0); + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/NEIPlugin.java b/src/main/java/minefantasy/mf2/integration/nei/NEIPlugin.java new file mode 100644 index 00000000..94e5a4c8 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/NEIPlugin.java @@ -0,0 +1,49 @@ +package minefantasy.mf2.integration.nei; + +import codechicken.nei.api.API; +import codechicken.nei.api.IConfigureNEI; +import minefantasy.mf2.MineFantasyII; + +public class NEIPlugin implements IConfigureNEI { + + public NEIPlugin() { + this.loadConfig(); + } + + @Override + public String getName() { + return MineFantasyII.NAME + " NEI Plugin"; + } + + @Override + public String getVersion() { + return MineFantasyII.VERSION; + } + + @Override + public void loadConfig() { + API.registerRecipeHandler(new RecipeHandlerCarpenter()); + API.registerUsageHandler(new RecipeHandlerCarpenter()); + + API.registerRecipeHandler(new RecipeHandlerAnvil()); + API.registerUsageHandler(new RecipeHandlerAnvil()); + + API.registerRecipeHandler(new RecipeHandlerBloom()); + API.registerUsageHandler(new RecipeHandlerBloom()); + + API.registerRecipeHandler(new RecipeHandlerQuern()); + API.registerUsageHandler(new RecipeHandlerQuern()); + + API.registerRecipeHandler(new RecipeHandlerTanning()); + API.registerUsageHandler(new RecipeHandlerTanning()); + + API.registerRecipeHandler(new RecipeHandlerCrucible()); + API.registerUsageHandler(new RecipeHandlerCrucible()); + + API.registerRecipeHandler(new RecipeHandlerBigFurnace()); + API.registerUsageHandler(new RecipeHandlerBigFurnace()); + + API.registerRecipeHandler(new RecipeHandlerBlastFurnace()); + API.registerUsageHandler(new RecipeHandlerBlastFurnace()); + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java new file mode 100644 index 00000000..5a8495d4 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java @@ -0,0 +1,130 @@ +package minefantasy.mf2.integration.nei; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import minefantasy.mf2.api.crafting.anvil.CraftingManagerAnvil; +import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; +import minefantasy.mf2.api.crafting.anvil.ShapedAnvilRecipes; +import minefantasy.mf2.api.crafting.anvil.ShapelessAnvilRecipes; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.api.knowledge.ResearchLogic; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +public class RecipeHandlerAnvil extends TemplateRecipeHandler { + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.anvil"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/knowledge/anvilGrid.png"; + } + + @Override + public void drawBackground(int recipe) { + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 5, 22, 166, 147); + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @SuppressWarnings("unchecked") + @Override + public void loadCraftingRecipes(ItemStack inputStack) { + for (IAnvilRecipe irecipe : (List) CraftingManagerAnvil.getInstance().getRecipeList()) { + if (CustomToolHelper.areEqual(irecipe.getRecipeOutput(), inputStack) + && ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { + CachedAnvilRecipe recipe = handleRecipe(irecipe, inputStack); + + if (recipe == null) { + continue; + } + + arecipes.add(recipe); + } + } + } + + @SuppressWarnings("unchecked") + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (IAnvilRecipe irecipe : (List) CraftingManagerAnvil.getInstance().getRecipeList()) { + if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { + continue; + } + + CachedAnvilRecipe recipe = handleRecipe(irecipe, null); + if (recipe == null || !recipe.contains(recipe.ingredients, ingredient.getItem())) { + continue; + } + + if (recipe.contains(recipe.ingredients, ingredient)) { + recipe.setIngredientPermutation(recipe.ingredients, ingredient); + arecipes.add(recipe); + } + } + } + + private CachedAnvilRecipe handleRecipe(IAnvilRecipe irecipe, ItemStack inputStack) { + if (irecipe instanceof ShapedAnvilRecipes) { + return new CachedAnvilRecipe((ShapedAnvilRecipes) irecipe); + } else if (irecipe instanceof ShapelessAnvilRecipes) { + return new CachedAnvilRecipe((ShapelessAnvilRecipes) irecipe); + } + + return null; + } + + public class CachedAnvilRecipe extends CachedRecipe { + + public final ArrayList ingredients = new ArrayList(); + public final PositionedStack result; + + public CachedAnvilRecipe(ShapedAnvilRecipes recipe) { + result = new PositionedStack(recipe.getRecipeOutput(), 75, 20); + setShapedRecipeIngredients(recipe.recipeWidth, recipe.recipeHeight, recipe.recipeItems); + } + + public CachedAnvilRecipe(ShapelessAnvilRecipes recipe) { + result = new PositionedStack(recipe.getRecipeOutput(), 75, 20); + } + + public void setShapedRecipeIngredients(int width, int height, Object[] items) { + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + if (items[y * width + x] == null) + continue; + + PositionedStack stack = new PositionedStack(items[y * width + x], 31 + x * 18, 54 + y * 18, false); + stack.setMaxSize(1); + ingredients.add(stack); + } + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, ingredients); + } + + @Override + public PositionedStack getResult() { + return result; + } + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java new file mode 100644 index 00000000..02eee747 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java @@ -0,0 +1,110 @@ +package minefantasy.mf2.integration.nei; + +import java.util.ArrayList; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.ItemList; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.api.refine.BigFurnaceRecipes; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +public class RecipeHandlerBigFurnace extends TemplateRecipeHandler { + + private static ArrayList recipeList; + + @Override + public TemplateRecipeHandler newInstance() { + if (recipeList == null || recipeList.isEmpty()) { + fillRecipeList(); + } + + return super.newInstance(); + } + + private void fillRecipeList() { + recipeList = new ArrayList(); + for (ItemStack item : ItemList.items) { + BigFurnaceRecipes tempRecipe = BigFurnaceRecipes.getResult(item); + if (tempRecipe != null) { + recipeList.add(new RecipePair(item, tempRecipe.result)); + } + } + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("nei.method.big_furnace"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/furnace_top.png"; + } + + @Override + public int recipiesPerPage() { + return 2; + } + + @Override + public void drawBackground(int recipe) { + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 5, 11, 166, 63); + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (RecipePair recipePair : recipeList) { + if (CustomToolHelper.areEqual(recipePair.outputStack, result)) { + BigFurnaceRecipe cachedRecipe = new BigFurnaceRecipe(recipePair.inputStack, recipePair.outputStack); + arecipes.add(cachedRecipe); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + BigFurnaceRecipes recipe = BigFurnaceRecipes.getResult(ingredient); + if (recipe != null) { + BigFurnaceRecipe cachedRecipe = new BigFurnaceRecipe(ingredient, recipe.result); + arecipes.add(cachedRecipe); + } + } + + private class RecipePair { + private ItemStack inputStack; + private ItemStack outputStack; + + private RecipePair(ItemStack input, ItemStack output) { + inputStack = input; + outputStack = output; + } + } + + private class BigFurnaceRecipe extends CachedRecipe { + + private PositionedStack input; + private PositionedStack output; + + private BigFurnaceRecipe(ItemStack inputStack, ItemStack outputStack) { + input = new PositionedStack(inputStack, 31, 15); + output = new PositionedStack(outputStack, 102, 16); //Hell of a perfectionist + } + + @Override + public PositionedStack getOtherStack() { + return input; + } + + @Override + public PositionedStack getResult() { + return output; + } + } +} diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java new file mode 100644 index 00000000..730f78b5 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java @@ -0,0 +1,86 @@ +package minefantasy.mf2.integration.nei; + +import java.util.Map.Entry; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.api.knowledge.ResearchLogic; +import minefantasy.mf2.api.refine.BlastFurnaceRecipes; +import minefantasy.mf2.knowledge.KnowledgeListMF; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +public class RecipeHandlerBlastFurnace extends TemplateRecipeHandler { + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.blastfurnace"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/blast_chamber.png"; + } + + @Override + public void drawBackground(int recipe) { + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 0, 0, 133, 112); + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, KnowledgeListMF.blastfurn)) { + for (Entry entry : BlastFurnaceRecipes.smelting().getSmeltingList().entrySet()) { + if (CustomToolHelper.areEqual(entry.getValue(), result)) { + CachedBlastFurnaceRecipe recipe = new CachedBlastFurnaceRecipe(entry.getKey(), result); + arecipes.add(recipe); + } + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, KnowledgeListMF.blastfurn)) { + ItemStack result = BlastFurnaceRecipes.smelting().getSmeltingResult(ingredient); + if (result != null) { + CachedBlastFurnaceRecipe recipe = new CachedBlastFurnaceRecipe(ingredient, result); + arecipes.add(recipe); + } + } + } + + private class CachedBlastFurnaceRecipe extends CachedRecipe { + + private PositionedStack input; + private PositionedStack output; + + private CachedBlastFurnaceRecipe(ItemStack inputStack, ItemStack outputStack) { + input = new PositionedStack(inputStack, 80, 30); + output = new PositionedStack(outputStack, 80, 68); + } + + @Override + public PositionedStack getOtherStack() { + return input; + } + + @Override + public PositionedStack getResult() { + return output; + } + + } +} diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java new file mode 100644 index 00000000..074d4916 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java @@ -0,0 +1,119 @@ +package minefantasy.mf2.integration.nei; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import minefantasy.mf2.api.crafting.MineFantasyFuels; +import minefantasy.mf2.api.crafting.refine.BloomRecipe; +import minefantasy.mf2.api.heating.ForgeFuel; +import minefantasy.mf2.api.heating.ForgeItemHandler; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +public class RecipeHandlerBloom extends TemplateRecipeHandler { + + private static ArrayList afuels; + + @Override + public TemplateRecipeHandler newInstance() { + if (afuels == null || afuels.isEmpty()) { + findFuels(); + } + return super.newInstance(); + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.bloomery"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/bloomery.png"; + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @Override + public void drawBackground(int recipe) { + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 5, 11, 166, 89); + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + Map recipes = (Map) BloomRecipe.recipeList; + for (Entry recipe : recipes.entrySet()) { + if (CustomToolHelper.areEqual(recipe.getValue(), result)) { + arecipes.add(new SmeltingPair(recipe.getKey(), recipe.getValue())); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + ItemStack result = BloomRecipe.getSmeltingResult(ingredient); + if (result != null) { + SmeltingPair arecipe = new SmeltingPair(ingredient, result); + arecipe.setIngredientPermutation(Arrays.asList(arecipe.ingred), ingredient); + arecipes.add(arecipe); + } + } + + private static void findFuels() { + afuels = new ArrayList(); + for (ForgeFuel fuel : ForgeItemHandler.forgeFuel) { + ItemStack item = fuel.fuel; + if (TileEntityBlastFC.isCarbon(item) && MineFantasyFuels.getCarbon(item) > 0) { + afuels.add(new FuelPair(item.copy())); + } + } + } + + private static class FuelPair { + private PositionedStack stack; + + private FuelPair(ItemStack fuel) { + this.stack = new PositionedStack(fuel, 75, 57, false); + } + } + + private class SmeltingPair extends CachedRecipe { + private PositionedStack ingred; + private PositionedStack result; + + private SmeltingPair(ItemStack ingred, ItemStack result) { + this.ingred = new PositionedStack(ingred, 75, 19); + this.result = new PositionedStack(result, 120, 29); + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 48, Arrays.asList(ingred)); + } + + @Override + public PositionedStack getResult() { + return result; + } + + @Override + public PositionedStack getOtherStack() { + return afuels.get((cycleticks / 48) % afuels.size()).stack; + } + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java new file mode 100644 index 00000000..3e598647 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java @@ -0,0 +1,157 @@ +package minefantasy.mf2.integration.nei; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import minefantasy.mf2.api.crafting.carpenter.CraftingManagerCarpenter; +import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; +import minefantasy.mf2.api.crafting.carpenter.ShapedCarpenterRecipes; +import minefantasy.mf2.api.crafting.carpenter.ShapelessCarpenterRecipes; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.api.knowledge.ResearchLogic; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +public class RecipeHandlerCarpenter extends TemplateRecipeHandler { + + public int[][] stackorder = new int[][] { { 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 1, 2 }, { 2, 0 }, + { 2, 1 }, { 2, 2 } }; + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.carpenter"); + } + + @Override + public String getGuiTexture() { + return"minefantasy2:textures/gui/knowledge/carpenterGrid.png"; + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @SuppressWarnings("unchecked") + @Override + public void loadCraftingRecipes(ItemStack result) { + for (ICarpenterRecipe irecipe : (List) CraftingManagerCarpenter.getInstance() + .getRecipeList()) { + if (CustomToolHelper.areEqual(irecipe.getRecipeOutput(), result) + && ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { + CachedCarpenterRecipe recipe = handleRecipe(irecipe); + + if (recipe == null) + continue; + + recipe.computeVisuals(); + arecipes.add(recipe); + } + } + } + + @SuppressWarnings("unchecked") + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (ICarpenterRecipe irecipe : (List) CraftingManagerCarpenter.getInstance() + .getRecipeList()) { + + if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { + continue; + } + + CachedCarpenterRecipe recipe = handleRecipe(irecipe); + + if (recipe == null || !recipe.contains(recipe.ingredients, ingredient.getItem())) + continue; + + recipe.computeVisuals(); + if (recipe.contains(recipe.ingredients, ingredient)) { + recipe.setIngredientPermutation(recipe.ingredients, ingredient); + arecipes.add(recipe); + } + } + } + + @Override + public void drawBackground(int recipe) { + GL11.glColor3f(255, 255, 255); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 5, 33, 166, 171); + } + + private CachedCarpenterRecipe handleRecipe(ICarpenterRecipe irecipe) { + if (irecipe instanceof ShapedCarpenterRecipes) { + return new CachedCarpenterRecipe((ShapedCarpenterRecipes) irecipe); + } else if (irecipe instanceof ShapelessCarpenterRecipes) { + return new CachedCarpenterRecipe((ShapelessCarpenterRecipes) irecipe); + } + return null; + } + + class CachedCarpenterRecipe extends CachedRecipe { + + ICarpenterRecipe carpRecipe; + ArrayList ingredients = new ArrayList(); + PositionedStack result; + + public CachedCarpenterRecipe(ShapedCarpenterRecipes recipe) { + carpRecipe = recipe; + result = new PositionedStack(recipe.getRecipeOutput(), 75, 8); + setIngredients(recipe.recipeWidth, recipe.recipeHeight, recipe.recipeItems); + } + + @SuppressWarnings("unchecked") + public CachedCarpenterRecipe(ShapelessCarpenterRecipes recipe) { + carpRecipe = recipe; + result = new PositionedStack(recipe.getRecipeOutput(), 75, 8); + setIngredients(recipe.recipeItems); + } + + public void setIngredients(List items) { + ingredients.clear(); + for (int ingred = 0; ingred < items.size(); ingred++) { + MFPositionedStack stack = new MFPositionedStack(items.get(ingred), 41 + stackorder[ingred][0] * 18, + 47 + stackorder[ingred][1] * 18); + stack.setMaxSize(1); + ingredients.add(stack); + } + } + + public void setIngredients(int width, int height, Object[] items) { + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + if (items[y * width + x] == null) + continue; + + MFPositionedStack stack = new MFPositionedStack(items[y * width + x], 41 + x * 18, 47 + y * 18, + false); + stack.setMaxSize(1); + ingredients.add(stack); + } + } + } + + public void computeVisuals() { + for (PositionedStack p : ingredients) { + p.generatePermutations(); + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, ingredients); + } + + @Override + public PositionedStack getResult() { + return result; + } + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java new file mode 100644 index 00000000..d5249800 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java @@ -0,0 +1,122 @@ +package minefantasy.mf2.integration.nei; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.api.refine.Alloy; +import minefantasy.mf2.api.refine.AlloyRecipes; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +public class RecipeHandlerCrucible extends TemplateRecipeHandler { + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.crucible"); //TODO: Tiered naming + } + + @Override + public String getGuiTexture() { + return getTexture(0); + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (Alloy alloy : AlloyRecipes.alloys) { + if (CustomToolHelper.areEqual(alloy.recipeOutput, result)) { + CachedAlloyRecipe recipe = new CachedAlloyRecipe(alloy); + arecipes.add(recipe); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (Alloy alloy : AlloyRecipes.alloys) { + for (Object object : alloy.recipeItems) { + ItemStack recipeIngredient = (ItemStack) object; + if (CustomToolHelper.areEqual(recipeIngredient, ingredient)) { + CachedAlloyRecipe recipe = new CachedAlloyRecipe(alloy); + arecipes.add(recipe); + } + } + } + } + + @Override + public void drawBackground(int recipe) { + CachedAlloyRecipe cachedRecipe = (CachedAlloyRecipe) arecipes.get(recipe); + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getTexture(cachedRecipe.tier)); + GuiDraw.drawTexturedModalRect(0, 0, 0, 0, 151, 94); + } + + @Override + public void drawExtras(int recipe) { + CachedAlloyRecipe cachedRecipe = (CachedAlloyRecipe) arecipes.get(recipe); + GuiDraw.drawString("Required tier: " + cachedRecipe.tier, 10, 98, -16777216, false); + } + + private String getTexture(int tier) { + if (tier == 1) { + return "minefantasy2:textures/gui/crucible_advanced.png"; + } + if (tier >= 2) { + return "minefantasy2:textures/gui/crucible_mythic.png"; + } + return "minefantasy2:textures/gui/crucible.png"; + } + + private class CachedAlloyRecipe extends CachedRecipe { + + private ArrayList ingredients = new ArrayList(); + private PositionedStack output; + private int tier; + + @SuppressWarnings("unchecked") + private CachedAlloyRecipe(Alloy alloy) { + setIngridients(alloy.recipeItems); + output = new PositionedStack(alloy.recipeOutput, 129, 32); + tier = alloy.level; + } + + private void setIngridients(List recipeItems) { + for (int x = 0; x < 3; x++) { + for (int y = 0; y < 3; y++) { + int index = y * 3 + x; + if (recipeItems.size() > index) { + ItemStack currentStack = (ItemStack) recipeItems.get(index); + if (currentStack == null) { + continue; + } + + PositionedStack stack = new PositionedStack(currentStack, 62 + x * 18, 14 + y * 18); + ingredients.add(stack); + } + } + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, ingredients); + } + + @Override + public PositionedStack getResult() { + return output; + } + + } +} diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java new file mode 100644 index 00000000..f34c9ce5 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java @@ -0,0 +1,118 @@ +package minefantasy.mf2.integration.nei; + +import java.util.ArrayList; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.ItemList; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import minefantasy.mf2.api.crafting.refine.QuernRecipes; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.item.list.ComponentListMF; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +public class RecipeHandlerQuern extends TemplateRecipeHandler { + + private static ArrayList recipeList; + + @Override + public TemplateRecipeHandler newInstance() { + if (recipeList == null || recipeList.isEmpty()) { + fillRecipeList(); + } + + return super.newInstance(); + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.quern"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/quern.png"; + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @Override + public void drawBackground(int recipe) { + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 0, 0, 122, 80); + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (RecipePair recipeInpit : recipeList) { + if (CustomToolHelper.areEqual(recipeInpit.outputStack, result)) { + CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipeInpit.inputStack, result); + arecipes.add(cachedRecipe); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + QuernRecipes output = QuernRecipes.getResult(ingredient); + if (output != null) { + CachedQuernRecipe recipe = new CachedQuernRecipe(ingredient, output.result); + arecipes.add(recipe); + } + } + + private void fillRecipeList() { + recipeList = new ArrayList(); + for (ItemStack item : ItemList.items) { + QuernRecipes tempRecipe = QuernRecipes.getResult(item); + if (tempRecipe != null) { + recipeList.add(new RecipePair(item, tempRecipe.result)); + } + } + } + + private static class RecipePair { + private ItemStack inputStack; + private ItemStack outputStack; + + private RecipePair(ItemStack input, ItemStack output) { + inputStack = input; + outputStack = output; + } + } + + private class CachedQuernRecipe extends CachedRecipe { + + private PositionedStack resultStack; + private PositionedStack potStack; + private PositionedStack inputStack; + + private CachedQuernRecipe(ItemStack ingredient, ItemStack result) { + inputStack = new PositionedStack(ingredient, 81, 9); + potStack = new PositionedStack(new ItemStack(ComponentListMF.clay_pot), 81, 32); + resultStack = new PositionedStack(result, 81, 55); + } + + @Override + public PositionedStack getIngredient() { + return inputStack; + } + + @Override + public PositionedStack getOtherStack() { + return potStack; + } + + @Override + public PositionedStack getResult() { + return resultStack; + } + } +} diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java new file mode 100644 index 00000000..f47b01e6 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java @@ -0,0 +1,78 @@ +package minefantasy.mf2.integration.nei; + +import java.util.Arrays; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import minefantasy.mf2.api.crafting.tanning.TanningRecipe; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +public class RecipeHandlerTanning extends TemplateRecipeHandler { + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("tile.tannerStrong.name"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/quern.png"; + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (TanningRecipe recipe : TanningRecipe.recipeList) { + if (NEIServerUtils.areStacksSameTypeCrafting(result, recipe.output)) { + TanningPair cachedRecipe = new TanningPair(recipe); + arecipes.add(cachedRecipe); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + TanningRecipe recipe = TanningRecipe.getRecipe(ingredient); + if (recipe != null) { + TanningPair cachedRecipe = new TanningPair(recipe); + cachedRecipe.setIngredientPermutation(Arrays.asList(cachedRecipe.input), ingredient); + arecipes.add(cachedRecipe); + } + } + + @Override + public void drawExtras(int recipe) { + TanningPair cachedRecipe = (TanningPair) this.arecipes.get(recipe); + GuiDraw.drawString(String.format("%s: %s", StatCollector.translateToLocal("nei.method.tanning.tool"), cachedRecipe.toolType), 10, 85, -16777216, false); + } + + @Override + public int recipiesPerPage() { + return 1; + } + + private class TanningPair extends CachedRecipe { + + private PositionedStack input; + private PositionedStack output; + private String toolType; + + private TanningPair(TanningRecipe recipe) { + input = new PositionedStack(recipe.input, 50, 20); + output = new PositionedStack(recipe.output, 100, 20); + toolType = recipe.toolType; + } + + @Override + public PositionedStack getOtherStack() { + return input; + } + + @Override + public PositionedStack getResult() { + return output; + } + } +} diff --git a/src/main/java/minefantasy/mf2/item/ClientItemsMF.java b/src/main/java/minefantasy/mf2/item/ClientItemsMF.java index 5ddcdd8a..0c5dc5b7 100644 --- a/src/main/java/minefantasy/mf2/item/ClientItemsMF.java +++ b/src/main/java/minefantasy/mf2/item/ClientItemsMF.java @@ -4,19 +4,19 @@ import org.lwjgl.input.Keyboard; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.GameSettings; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.util.StatCollector; @SideOnly(Side.CLIENT) public class ClientItemsMF { - public static boolean showSpecials(ItemStack item, EntityPlayer user, List list, boolean fullInfo) + public static boolean showSpecials(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { if(GameSettings.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindSneak)) { @@ -25,7 +25,7 @@ public static boolean showSpecials(ItemStack item, EntityPlayer user, List list, else { String keyname = Keyboard.getKeyName(Minecraft.getMinecraft().gameSettings.keyBindSneak.getKeyCode()); - list.add("Hold [" + EnumChatFormatting.AQUA + keyname.toUpperCase() + EnumChatFormatting.GRAY + "] for more information."); + list.add(StatCollector.translateToLocalFormatted("info.tooltip.moreinfo", keyname.toUpperCase())); return false; } } diff --git a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java index e0269429..7ae7a3ed 100644 --- a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java @@ -2,24 +2,125 @@ import org.lwjgl.input.Keyboard; +import codechicken.nei.NEIModContainer; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.knowledge.InformationList; -import minefantasy.mf2.block.tileentity.*; -import minefantasy.mf2.block.tileentity.blastfurnace.*; -import minefantasy.mf2.block.tileentity.decor.*; +import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; +import minefantasy.mf2.block.tileentity.TileEntityBellows; +import minefantasy.mf2.block.tileentity.TileEntityBigFurnace; +import minefantasy.mf2.block.tileentity.TileEntityBloomery; +import minefantasy.mf2.block.tileentity.TileEntityBombBench; +import minefantasy.mf2.block.tileentity.TileEntityBombPress; +import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; +import minefantasy.mf2.block.tileentity.TileEntityChimney; +import minefantasy.mf2.block.tileentity.TileEntityComponent; +import minefantasy.mf2.block.tileentity.TileEntityCrossbowBench; +import minefantasy.mf2.block.tileentity.TileEntityCrucible; +import minefantasy.mf2.block.tileentity.TileEntityFirepit; +import minefantasy.mf2.block.tileentity.TileEntityForge; +import minefantasy.mf2.block.tileentity.TileEntityQuern; +import minefantasy.mf2.block.tileentity.TileEntityResearch; +import minefantasy.mf2.block.tileentity.TileEntityRoast; +import minefantasy.mf2.block.tileentity.TileEntityTanningRack; +import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; +import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFH; +import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; +import minefantasy.mf2.block.tileentity.decor.TileEntityRack; +import minefantasy.mf2.block.tileentity.decor.TileEntityTrough; import minefantasy.mf2.client.KnowledgePageRegistry; -import minefantasy.mf2.client.gui.*; -import minefantasy.mf2.client.render.*; -import minefantasy.mf2.client.render.block.*; -import minefantasy.mf2.client.render.block.component.*; -import minefantasy.mf2.client.render.mob.*; -import minefantasy.mf2.entity.*; -import minefantasy.mf2.entity.mob.*; +import minefantasy.mf2.client.gui.GuiAnvilMF; +import minefantasy.mf2.client.gui.GuiBigFurnace; +import minefantasy.mf2.client.gui.GuiBlastChamber; +import minefantasy.mf2.client.gui.GuiBlastHeater; +import minefantasy.mf2.client.gui.GuiBloomery; +import minefantasy.mf2.client.gui.GuiBombBench; +import minefantasy.mf2.client.gui.GuiCarpenterMF; +import minefantasy.mf2.client.gui.GuiCrossbowBench; +import minefantasy.mf2.client.gui.GuiCrucible; +import minefantasy.mf2.client.gui.GuiForge; +import minefantasy.mf2.client.gui.GuiKnowledge; +import minefantasy.mf2.client.gui.GuiKnowledgeEntry; +import minefantasy.mf2.client.gui.GuiQuern; +import minefantasy.mf2.client.gui.GuiReload; +import minefantasy.mf2.client.gui.GuiResearchBlock; +import minefantasy.mf2.client.render.AnimationHandlerMF; +import minefantasy.mf2.client.render.HudHandlerMF; +import minefantasy.mf2.client.render.RenderArrowMF; +import minefantasy.mf2.client.render.RenderBombIcon; +import minefantasy.mf2.client.render.RenderBow; +import minefantasy.mf2.client.render.RenderCrossbow; +import minefantasy.mf2.client.render.RenderDragonBreath; +import minefantasy.mf2.client.render.RenderFireBlast; +import minefantasy.mf2.client.render.RenderHeavyWeapon; +import minefantasy.mf2.client.render.RenderLance; +import minefantasy.mf2.client.render.RenderMine; +import minefantasy.mf2.client.render.RenderParachute; +import minefantasy.mf2.client.render.RenderPowerArmour; +import minefantasy.mf2.client.render.RenderSaw; +import minefantasy.mf2.client.render.RenderShrapnel; +import minefantasy.mf2.client.render.RenderSpear; +import minefantasy.mf2.client.render.RenderSword; +import minefantasy.mf2.client.render.block.RenderAmmoBox; +import minefantasy.mf2.client.render.block.RenderAnvilMF; +import minefantasy.mf2.client.render.block.RenderBellows; +import minefantasy.mf2.client.render.block.RenderBigFurnace; +import minefantasy.mf2.client.render.block.RenderBloomery; +import minefantasy.mf2.client.render.block.RenderBombBench; +import minefantasy.mf2.client.render.block.RenderBombPress; +import minefantasy.mf2.client.render.block.RenderCarpenter; +import minefantasy.mf2.client.render.block.RenderCrossbowBench; +import minefantasy.mf2.client.render.block.RenderFirepit; +import minefantasy.mf2.client.render.block.RenderForge; +import minefantasy.mf2.client.render.block.RenderQuern; +import minefantasy.mf2.client.render.block.RenderRack; +import minefantasy.mf2.client.render.block.RenderResearch; +import minefantasy.mf2.client.render.block.RenderRoast; +import minefantasy.mf2.client.render.block.RenderSmokePipe; +import minefantasy.mf2.client.render.block.RenderTanningRack; +import minefantasy.mf2.client.render.block.RenderTrough; +import minefantasy.mf2.client.render.block.TileEntityAmmoBoxRenderer; +import minefantasy.mf2.client.render.block.TileEntityAnvilMFRenderer; +import minefantasy.mf2.client.render.block.TileEntityBellowsRenderer; +import minefantasy.mf2.client.render.block.TileEntityBigFurnaceRenderer; +import minefantasy.mf2.client.render.block.TileEntityBloomeryRenderer; +import minefantasy.mf2.client.render.block.TileEntityBombBenchRenderer; +import minefantasy.mf2.client.render.block.TileEntityBombPressRenderer; +import minefantasy.mf2.client.render.block.TileEntityCarpenterRenderer; +import minefantasy.mf2.client.render.block.TileEntityCrossbowBenchRenderer; +import minefantasy.mf2.client.render.block.TileEntityFirepitRenderer; +import minefantasy.mf2.client.render.block.TileEntityForgeRenderer; +import minefantasy.mf2.client.render.block.TileEntityQuernRenderer; +import minefantasy.mf2.client.render.block.TileEntityRackRenderer; +import minefantasy.mf2.client.render.block.TileEntityResearchRenderer; +import minefantasy.mf2.client.render.block.TileEntityRoastRenderer; +import minefantasy.mf2.client.render.block.TileEntitySmokePipeRenderer; +import minefantasy.mf2.client.render.block.TileEntityTanningRackRenderer; +import minefantasy.mf2.client.render.block.TileEntityTroughRenderer; +import minefantasy.mf2.client.render.block.component.TileEntityComponentRenderer; +import minefantasy.mf2.client.render.mob.ModelHound; +import minefantasy.mf2.client.render.mob.ModelMinotaur; +import minefantasy.mf2.client.render.mob.RenderDragon; +import minefantasy.mf2.client.render.mob.RenderHound; +import minefantasy.mf2.client.render.mob.RenderMinotaur; +import minefantasy.mf2.entity.EntityArrowMF; +import minefantasy.mf2.entity.EntityBomb; +import minefantasy.mf2.entity.EntityCogwork; +import minefantasy.mf2.entity.EntityDragonBreath; +import minefantasy.mf2.entity.EntityFireBlast; +import minefantasy.mf2.entity.EntityMine; +import minefantasy.mf2.entity.EntityParachute; +import minefantasy.mf2.entity.EntityShrapnel; +import minefantasy.mf2.entity.EntitySmoke; +import minefantasy.mf2.entity.mob.EntityDragon; +import minefantasy.mf2.entity.mob.EntityHound; +import minefantasy.mf2.entity.mob.EntityMinotaur; +import minefantasy.mf2.integration.nei.NEIPlugin; import minefantasy.mf2.item.list.CustomToolListMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.item.list.styles.DragonforgedStyle; @@ -33,48 +134,47 @@ import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.common.MinecraftForge; + /** * @author Anonymous Productions */ -public class ClientProxyMF extends CommonProxyMF -{ +public class ClientProxyMF extends CommonProxyMF { @Override - public World getClientWorld() - { - return FMLClientHandler.instance().getClient().theWorld; - } - + public World getClientWorld() { + return FMLClientHandler.instance().getClient().theWorld; + } + @Override - public void preInit() - { + public void preInit() { } - + @Override - public void registerMain() - { + public void registerMain() { super.registerMain(); + + if (Loader.isModLoaded("NotEnoughItems")) { + NEIModContainer.plugins.add(new NEIPlugin()); + } } - + @Override - public void postInit() - { + public void postInit() { super.postInit(); registerRenders(); MineFantasyAPI.init(); KnowledgePageRegistry.registerPages(); } - + @Override - public void registerTickHandlers() - { + public void registerTickHandlers() { super.registerTickHandlers(); FMLCommonHandler.instance().bus().register(new PlayerTickHandlerMF()); FMLCommonHandler.instance().bus().register(new AnimationHandlerMF()); FMLCommonHandler.instance().bus().register(new ExtendedReachMF()); MinecraftForge.EVENT_BUS.register(new HudHandlerMF()); FMLCommonHandler.instance().bus().register(new ClientTickHandler()); - + RenderingRegistry.registerBlockHandler(new RenderAnvilMF()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAnvilMF.class, new TileEntityAnvilMFRenderer()); RenderingRegistry.registerBlockHandler(new RenderCarpenter()); @@ -96,7 +196,8 @@ public void registerTickHandlers() RenderingRegistry.registerBlockHandler(new RenderBloomery()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBloomery.class, new TileEntityBloomeryRenderer()); RenderingRegistry.registerBlockHandler(new RenderCrossbowBench()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCrossbowBench.class, new TileEntityCrossbowBenchRenderer()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCrossbowBench.class, + new TileEntityCrossbowBenchRenderer()); RenderingRegistry.registerBlockHandler(new RenderQuern()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityQuern.class, new TileEntityQuernRenderer()); RenderingRegistry.registerBlockHandler(new RenderFirepit()); @@ -111,14 +212,13 @@ public void registerTickHandlers() ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAmmoBox.class, new TileEntityAmmoBoxRenderer()); RenderingRegistry.registerBlockHandler(new RenderSmokePipe()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityChimney.class, new TileEntitySmokePipeRenderer()); - + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityComponent.class, new TileEntityComponentRenderer()); } - - public void registerEntityRenderer() - { + + public void registerEntityRenderer() { RenderingRegistry.registerEntityRenderingHandler(EntityArrowMF.class, new RenderArrowMF()); - RenderingRegistry.registerEntityRenderingHandler(EntityBomb.class, new RenderBombIcon());//Switch to RenderBomb when syncing is fixed + RenderingRegistry.registerEntityRenderingHandler(EntityBomb.class, new RenderBombIcon());// Switch to RenderBomb when syncing is fixed RenderingRegistry.registerEntityRenderingHandler(EntityMine.class, new RenderMine()); RenderingRegistry.registerEntityRenderingHandler(EntityShrapnel.class, new RenderShrapnel("shrapnel")); RenderingRegistry.registerEntityRenderingHandler(EntityFireBlast.class, new RenderFireBlast()); @@ -126,152 +226,146 @@ public void registerEntityRenderer() RenderingRegistry.registerEntityRenderingHandler(EntityDragonBreath.class, new RenderDragonBreath()); RenderingRegistry.registerEntityRenderingHandler(EntityParachute.class, new RenderParachute()); RenderingRegistry.registerEntityRenderingHandler(EntityCogwork.class, new RenderPowerArmour()); - + RenderingRegistry.registerEntityRenderingHandler(EntityDragon.class, new RenderDragon(2F)); - RenderingRegistry.registerEntityRenderingHandler(EntityMinotaur.class, new RenderMinotaur(new ModelMinotaur(), 1.5F)); + RenderingRegistry.registerEntityRenderingHandler(EntityMinotaur.class, + new RenderMinotaur(new ModelMinotaur(), 1.5F)); RenderingRegistry.registerEntityRenderingHandler(EntityHound.class, new RenderHound(new ModelHound())); } - + @Override - public EntityPlayer getClientPlayer() - { - return Minecraft.getMinecraft().thePlayer; - } + public EntityPlayer getClientPlayer() { + return Minecraft.getMinecraft().thePlayer; + } + @Override - public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) - { + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { Minecraft mc = Minecraft.getMinecraft(); - if(ID == 0) - { - TileEntity tile = world.getTileEntity(x, y, z); + if (ID == 0) { + TileEntity tile = world.getTileEntity(x, y, z); int meta = world.getBlockMetadata(x, y, z); - - if(tile == null) - { + + if (tile == null) { return null; } - - if(tile instanceof TileEntityAnvilMF) - { + + if (tile instanceof TileEntityAnvilMF) { return new GuiAnvilMF(player.inventory, (TileEntityAnvilMF) tile); } - if(tile instanceof TileEntityCarpenterMF) - { + if (tile instanceof TileEntityCarpenterMF) { return new GuiCarpenterMF(player.inventory, (TileEntityCarpenterMF) tile); } - if(tile instanceof TileEntityBombBench) - { + if (tile instanceof TileEntityBombBench) { return new GuiBombBench(player.inventory, (TileEntityBombBench) tile); } - if(tile instanceof TileEntityBlastFH) - { + if (tile instanceof TileEntityBlastFH) { return new GuiBlastHeater(player.inventory, (TileEntityBlastFH) tile); } - if(tile instanceof TileEntityBlastFC) - { + if (tile instanceof TileEntityBlastFC) { return new GuiBlastChamber(player.inventory, (TileEntityBlastFC) tile); } - if(tile instanceof TileEntityCrucible) - { + if (tile instanceof TileEntityCrucible) { return new GuiCrucible(player.inventory, (TileEntityCrucible) tile); } - if(tile instanceof TileEntityForge) - { + if (tile instanceof TileEntityForge) { return new GuiForge(player.inventory, (TileEntityForge) tile); } - if(tile instanceof TileEntityResearch) - { + if (tile instanceof TileEntityResearch) { return new GuiResearchBlock(player.inventory, (TileEntityResearch) tile); } - if(tile instanceof TileEntityBloomery) - { + if (tile instanceof TileEntityBloomery) { return new GuiBloomery(player.inventory, (TileEntityBloomery) tile); } - if(tile instanceof TileEntityCrossbowBench) - { + if (tile instanceof TileEntityCrossbowBench) { return new GuiCrossbowBench(player.inventory, (TileEntityCrossbowBench) tile); } - if(tile instanceof TileEntityQuern) - { + if (tile instanceof TileEntityQuern) { return new GuiQuern(player.inventory, (TileEntityQuern) tile); } - if(tile instanceof TileEntityBigFurnace) - { + if (tile instanceof TileEntityBigFurnace) { return new GuiBigFurnace(player, (TileEntityBigFurnace) tile); } - return null; + return null; } - if(ID == 1) - { - if(x == 0) - {//GuiAchievements - if(y >= 0) - { + if (ID == 1) { + if (x == 0) {// GuiAchievements + if (y >= 0) { return new GuiKnowledgeEntry(mc.currentScreen, InformationList.knowledgeList.get(y)); } return new GuiKnowledge(player); } - if(x == 1 && player.getHeldItem() != null) - { - return new GuiReload(player.inventory, player.getHeldItem()); - } + if (x == 1 && player.getHeldItem() != null) { + return new GuiReload(player.inventory, player.getHeldItem()); + } } - return null; - } + return null; + } - private void registerRenders() - { + private void registerRenders() { registerEntityRenderer(); - + MinecraftForgeClient.registerItemRenderer(ToolListMF.swordStone, new RenderSword()); MinecraftForgeClient.registerItemRenderer(ToolListMF.maceStone, new RenderSword()); MinecraftForgeClient.registerItemRenderer(ToolListMF.waraxeStone, new RenderSword().setAxe()); MinecraftForgeClient.registerItemRenderer(ToolListMF.spearStone, new RenderSpear()); MinecraftForgeClient.registerItemRenderer(ToolListMF.swordTraining, new RenderSword()); MinecraftForgeClient.registerItemRenderer(ToolListMF.crossbow_custom, new RenderCrossbow(2.0F)); - - //STANDARD + + // STANDARD MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_dagger, new RenderSword()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_sword, new RenderSword()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_waraxe, new RenderSword().setAxe()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_mace, new RenderSword()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_scythe, new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_warhammer, new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_battleaxe, new RenderHeavyWeapon().setBlunt().setParryable()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_greatsword, new RenderHeavyWeapon().setGreatsword().setParryable()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_katana, new RenderHeavyWeapon().setKatana().setParryable()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_warhammer, + new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_battleaxe, + new RenderHeavyWeapon().setBlunt().setParryable()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_greatsword, + new RenderHeavyWeapon().setGreatsword().setParryable()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_katana, + new RenderHeavyWeapon().setKatana().setParryable()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_spear, new RenderSpear()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_halbeard, new RenderSpear(true)); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_lance, new RenderLance()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_lumber, new RenderHeavyWeapon().setBlunt()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_saw, new RenderSaw()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_bow, new RenderBow(false)); - //DRAGONFORGED + // DRAGONFORGED MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_dagger, new RenderSword()); MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_sword, new RenderSword()); MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_waraxe, new RenderSword().setAxe()); MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_mace, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_warhammer, new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_battleaxe, new RenderHeavyWeapon().setBlunt().setParryable()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_greatsword, new RenderHeavyWeapon().setGreatsword().setParryable()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_katana, new RenderHeavyWeapon().setKatana().setParryable()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_warhammer, + new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_battleaxe, + new RenderHeavyWeapon().setBlunt().setParryable()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_greatsword, + new RenderHeavyWeapon().setGreatsword().setParryable()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_katana, + new RenderHeavyWeapon().setKatana().setParryable()); MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_spear, new RenderSpear()); MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_halbeard, new RenderSpear(true)); MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_lance, new RenderLance()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_scythe, new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_lumber, new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_scythe, + new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_lumber, + new RenderHeavyWeapon().setBlunt()); MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_saw, new RenderSaw()); MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_bow, new RenderBow(false)); - - //ORNATE + + // ORNATE MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_dagger, new RenderSword()); MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_sword, new RenderSword()); MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_waraxe, new RenderSword().setAxe()); MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_mace, new RenderSword()); MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_warhammer, new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_battleaxe, new RenderHeavyWeapon().setBlunt().setParryable()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_greatsword, new RenderHeavyWeapon().setGreatsword().setParryable()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_katana, new RenderHeavyWeapon().setKatana().setParryable()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_battleaxe, + new RenderHeavyWeapon().setBlunt().setParryable()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_greatsword, + new RenderHeavyWeapon().setGreatsword().setParryable()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_katana, + new RenderHeavyWeapon().setKatana().setParryable()); MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_spear, new RenderSpear()); MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_halbeard, new RenderSpear(true)); MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_lance, new RenderLance()); @@ -279,13 +373,14 @@ private void registerRenders() MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_lumber, new RenderHeavyWeapon().setBlunt()); MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_saw, new RenderSaw()); MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_bow, new RenderBow(false)); - + } + /** * Is the player trying to jump (assuming no screens are open) */ - public static boolean isUserJumpCommand(Entity user) - { - return Minecraft.getMinecraft().currentScreen == null && user == Minecraft.getMinecraft().thePlayer && Keyboard.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindJump.getKeyCode()); + public static boolean isUserJumpCommand(Entity user) { + return Minecraft.getMinecraft().currentScreen == null && user == Minecraft.getMinecraft().thePlayer + && Keyboard.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindJump.getKeyCode()); } } diff --git a/src/main/resources/assets/minefantasy2/lang/en_US.lang b/src/main/resources/assets/minefantasy2/lang/en_US.lang index f940873c..8ee525c1 100644 --- a/src/main/resources/assets/minefantasy2/lang/en_US.lang +++ b/src/main/resources/assets/minefantasy2/lang/en_US.lang @@ -5,6 +5,7 @@ forge.fuel.name=~Fuel~ vehicle.fuel.name=Fuel: %1$s info.bow.reload=Right-Click while sneaking to open firearm. info.firearm.ammo=%1$s/%2$s +info.tooltip.moreinfo=Hold [%1$s] for more information. attribute.kit.salvage.name=Salvage Modifier diff --git a/src/main/resources/assets/minefantasy2/lang/ru_RU.lang b/src/main/resources/assets/minefantasy2/lang/ru_RU.lang index d750bd01..0bfd211f 100644 --- a/src/main/resources/assets/minefantasy2/lang/ru_RU.lang +++ b/src/main/resources/assets/minefantasy2/lang/ru_RU.lang @@ -10,6 +10,7 @@ forge.fuel.name=~Топливо~ vehicle.fuel.name=Топливо: %1$s info.bow.reload="Присесть" + ПКМ для перезарядки info.firearm.ammo=%1$s/%2$s +info.tooltip.moreinfo=Удерживайте [%1$s] для доп. информации attribute.kit.salvage.name=Эффективность разбора From a316b14c0e98feb2cac7208f4349a5a146b3991b Mon Sep 17 00:00:00 2001 From: Sirse Date: Thu, 8 Jun 2017 23:49:09 +0700 Subject: [PATCH 013/101] Fix project --- .gitignore | 20 ++------------------ build.gradle | 20 ++++++++++++-------- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 50514 bytes gradle/wrapper/gradle-wrapper.properties | 6 ++++++ lib/bukkit-1.7.10.jar | Bin 0 -> 805710 bytes 5 files changed, 20 insertions(+), 26 deletions(-) create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 lib/bukkit-1.7.10.jar diff --git a/.gitignore b/.gitignore index 51754332..d25e3b6d 100644 --- a/.gitignore +++ b/.gitignore @@ -50,31 +50,15 @@ Temporary Items # MCP Files # ========================= .classpath -.gradle/2.0/taskArtifacts/cache.properties -.gradle/2.0/taskArtifacts/cache.properties.lock *.bin .gradle/* .project -.settings/org.eclipse.jdt.core.prefs -CREDITS-fml.txt +.settings/* *.location -eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/0.tree -eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs -eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs +eclipse/* *.prefs -eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/Client.launch *.launch -eclipse/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml -*.jar -forge-1.8-11.14.0.1299-changelog.txt -README.txt -MinecraftForge-License.txt -MinecraftForge-Credits.txt gradlew -gradle/wrapper/gradle-wrapper.properties *.bat -LICENSE-fml.txt -forge-1.7.10-10.13.2.1230-changelog.txt bin/* eclipse/* -/bin/ diff --git a/build.gradle b/build.gradle index a36d48e8..5a769d24 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' version = "2.8.13u" -group= "minefantasy.mf2.minefantasy2" // http://maven.apache.org/guides/mini/guide-naming-conventions.html +group= "minefantasy.mf2.minefantasy2" archivesBaseName = "MineFantasyII" minecraft { @@ -31,6 +31,17 @@ repositories { name = "chickenbones" url = "http://chickenbones.net/maven/" } + + flatDir { + dirs 'lib' + } +} + +dependencies { + compile name: 'bukkit-1.7.10' + compile "codechicken:CodeChickenLib:1.7.10-1.1.3.140:dev" + compile "codechicken:CodeChickenCore:1.7.10-1.0.7.47:dev" + compile "codechicken:NotEnoughItems:1.7.10-1.0.5.120:dev" } task deobfJar(type: Jar) { @@ -38,15 +49,8 @@ task deobfJar(type: Jar) { classifier = 'deobf' } - tasks.build.dependsOn('deobfJar') -dependencies { - compile "codechicken:CodeChickenLib:1.7.10-1.1.3.140:dev" - compile "codechicken:CodeChickenCore:1.7.10-1.0.7.47:dev" - compile "codechicken:NotEnoughItems:1.7.10-1.0.5.120:dev" -} - processResources { // this will ensure that this task is redone when the versions change. diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..667288ad6c2b3b87c990ece1267e56f0bcbf3622 GIT binary patch literal 50514 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

-g6JWn+n(Oc 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

)CG!Kf1 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 literal 0 HcmV?d00001 From b02449233b43f0acc45e1ab8f91cf3fc99a1334f Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 9 Jun 2017 00:23:09 +0700 Subject: [PATCH 014/101] Temp fix for Pig Iron ingots crafting, changed steel recipe I'm will fully migrate from refined iron to pig iron little bit later. Steel now requires coal dust for craft, but logically it should be moved to blast furnace. --- src/main/java/minefantasy/mf2/item/list/ComponentListMF.java | 4 ++++ src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java index e15cc610..51a5a2b4 100644 --- a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java @@ -286,6 +286,10 @@ public static ItemStack bar(String material) public static ItemStack bar(String material, int stackSize) { + if(material.equalsIgnoreCase("RefinedIron")) { + material = "PigIron"; + } + return bar.createComm(material, stackSize); } } diff --git a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java index 483a73f0..8870a401 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java @@ -74,7 +74,9 @@ public static void init() KnowledgeListMF.steelR = MineFantasyAPI.addAnvilRecipe(artisanry, ComponentListMF.bar("Steel"), "smeltSteel", true, 1, 1, 5, new Object[] { + "C", "H", + 'C', ComponentListMF.coalDust, 'H', ComponentListMF.bar("RefinedIron") }); KnowledgeListMF.fluxR = From 55101fba8d2d0cfe05145f3682ba84abe159d90c Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 10 Jun 2017 15:44:18 +0700 Subject: [PATCH 015/101] Move TextureHelper log output to debug channel --- .../java/minefantasy/mf2/api/helpers/TextureHelperMF.java | 3 ++- src/main/java/minefantasy/mf2/util/MFLogUtil.java | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java b/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java index b1cc985a..699e2a69 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java +++ b/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java @@ -13,6 +13,7 @@ import com.google.common.collect.Maps; import cpw.mods.fml.client.FMLClientHandler; +import minefantasy.mf2.util.MFLogUtil; public class TextureHelperMF { @@ -28,7 +29,7 @@ public static ResourceLocation getResource(String directory) if (resourcelocation == null) { - System.out.println("MineFantasy: Added Resource: " + directory); + MFLogUtil.logDebug("MineFantasy: Added Resource: " + directory); resourcelocation = new ResourceLocation("minefantasy2", directory); resourceList.put(directory, resourcelocation); diff --git a/src/main/java/minefantasy/mf2/util/MFLogUtil.java b/src/main/java/minefantasy/mf2/util/MFLogUtil.java index af966043..82b028a3 100644 --- a/src/main/java/minefantasy/mf2/util/MFLogUtil.java +++ b/src/main/java/minefantasy/mf2/util/MFLogUtil.java @@ -1,11 +1,9 @@ package minefantasy.mf2.util; -import minefantasy.mf2.MineFantasyII; - -import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; import cpw.mods.fml.common.FMLLog; +import minefantasy.mf2.MineFantasyII; public class MFLogUtil { From 370dd1ab49e0cfc86e3a54b40b797e8a1561c17d Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 10 Jun 2017 18:53:08 +0700 Subject: [PATCH 016/101] Fix weapon sounds foldername --- .../sounds/{weapon => weapon-temp}/arrow_hit.ogg | Bin .../sounds/{weapon => weapon-temp}/bomb_bounce.ogg | Bin .../sounds/{weapon => weapon-temp}/bow_fire.ogg | Bin .../sounds/{Weapon => weapon-temp}/critical.ogg | Bin .../{Weapon => weapon-temp}/crossbow_fire.ogg | Bin .../{Weapon => weapon-temp}/crossbow_load.ogg | Bin .../{Weapon => weapon-temp}/crossbow_load_s1.ogg | Bin .../{Weapon => weapon-temp}/crossbow_load_s2.ogg | Bin .../{Weapon => weapon-temp}/hit/blade/metal1.ogg | Bin .../{Weapon => weapon-temp}/hit/blade/stone1.ogg | Bin .../{Weapon => weapon-temp}/hit/blade/wood1.ogg | Bin .../{Weapon => weapon-temp}/hit/blunt/metal1.ogg | Bin .../{Weapon => weapon-temp}/hit/blunt/stone1.ogg | Bin .../{Weapon => weapon-temp}/hit/blunt/wood1.ogg | Bin .../sounds/{Weapon => weapon-temp}/wood_parry.ogg | Bin 15 files changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/assets/minefantasy2/sounds/{weapon => weapon-temp}/arrow_hit.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon => weapon-temp}/bomb_bounce.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon => weapon-temp}/bow_fire.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/critical.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/crossbow_fire.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/crossbow_load.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/crossbow_load_s1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/crossbow_load_s2.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/hit/blade/metal1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/hit/blade/stone1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/hit/blade/wood1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/hit/blunt/metal1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/hit/blunt/stone1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/hit/blunt/wood1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{Weapon => weapon-temp}/wood_parry.ogg (100%) diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon/arrow_hit.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/arrow_hit.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon/arrow_hit.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/arrow_hit.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon/bomb_bounce.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/bomb_bounce.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon/bomb_bounce.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/bomb_bounce.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon/bow_fire.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/bow_fire.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon/bow_fire.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/bow_fire.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/critical.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/critical.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/critical.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/critical.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/crossbow_fire.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_fire.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/crossbow_fire.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_fire.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/crossbow_load.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/crossbow_load.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/crossbow_load_s1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load_s1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/crossbow_load_s1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load_s1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/crossbow_load_s2.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load_s2.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/crossbow_load_s2.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load_s2.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blade/metal1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/metal1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blade/metal1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/metal1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blade/stone1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/stone1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blade/stone1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/stone1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blade/wood1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/wood1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blade/wood1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/wood1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blunt/metal1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/metal1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blunt/metal1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/metal1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blunt/stone1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/stone1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blunt/stone1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/stone1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blunt/wood1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/wood1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/hit/blunt/wood1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/wood1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/Weapon/wood_parry.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon-temp/wood_parry.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/Weapon/wood_parry.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon-temp/wood_parry.ogg From a40a076cd0310910b19e99db26bb657b33213a79 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 10 Jun 2017 18:53:33 +0700 Subject: [PATCH 017/101] Finally --- .../sounds/{weapon-temp => weapon}/arrow_hit.ogg | Bin .../sounds/{weapon-temp => weapon}/bomb_bounce.ogg | Bin .../sounds/{weapon-temp => weapon}/bow_fire.ogg | Bin .../sounds/{weapon-temp => weapon}/critical.ogg | Bin .../{weapon-temp => weapon}/crossbow_fire.ogg | Bin .../{weapon-temp => weapon}/crossbow_load.ogg | Bin .../{weapon-temp => weapon}/crossbow_load_s1.ogg | Bin .../{weapon-temp => weapon}/crossbow_load_s2.ogg | Bin .../{weapon-temp => weapon}/hit/blade/metal1.ogg | Bin .../{weapon-temp => weapon}/hit/blade/stone1.ogg | Bin .../{weapon-temp => weapon}/hit/blade/wood1.ogg | Bin .../{weapon-temp => weapon}/hit/blunt/metal1.ogg | Bin .../{weapon-temp => weapon}/hit/blunt/stone1.ogg | Bin .../{weapon-temp => weapon}/hit/blunt/wood1.ogg | Bin .../sounds/{weapon-temp => weapon}/wood_parry.ogg | Bin 15 files changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/arrow_hit.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/bomb_bounce.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/bow_fire.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/critical.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/crossbow_fire.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/crossbow_load.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/crossbow_load_s1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/crossbow_load_s2.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/hit/blade/metal1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/hit/blade/stone1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/hit/blade/wood1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/hit/blunt/metal1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/hit/blunt/stone1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/hit/blunt/wood1.ogg (100%) rename src/main/resources/assets/minefantasy2/sounds/{weapon-temp => weapon}/wood_parry.ogg (100%) diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/arrow_hit.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/arrow_hit.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/arrow_hit.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/arrow_hit.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/bomb_bounce.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/bomb_bounce.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/bomb_bounce.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/bomb_bounce.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/bow_fire.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/bow_fire.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/bow_fire.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/bow_fire.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/critical.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/critical.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/critical.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/critical.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_fire.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/crossbow_fire.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_fire.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/crossbow_fire.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/crossbow_load.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/crossbow_load.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load_s1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/crossbow_load_s1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load_s1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/crossbow_load_s1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load_s2.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/crossbow_load_s2.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/crossbow_load_s2.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/crossbow_load_s2.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/metal1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/hit/blade/metal1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/metal1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/hit/blade/metal1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/stone1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/hit/blade/stone1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/stone1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/hit/blade/stone1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/wood1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/hit/blade/wood1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blade/wood1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/hit/blade/wood1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/metal1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/hit/blunt/metal1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/metal1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/hit/blunt/metal1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/stone1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/hit/blunt/stone1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/stone1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/hit/blunt/stone1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/wood1.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/hit/blunt/wood1.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/hit/blunt/wood1.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/hit/blunt/wood1.ogg diff --git a/src/main/resources/assets/minefantasy2/sounds/weapon-temp/wood_parry.ogg b/src/main/resources/assets/minefantasy2/sounds/weapon/wood_parry.ogg similarity index 100% rename from src/main/resources/assets/minefantasy2/sounds/weapon-temp/wood_parry.ogg rename to src/main/resources/assets/minefantasy2/sounds/weapon/wood_parry.ogg From 4e0306005ff89ccb8da1035368d74122b90d4fd9 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 10 Jun 2017 19:08:10 +0700 Subject: [PATCH 018/101] Fix minotaur death sound --- logs/2017-06-10-2.log.gz | Bin 0 -> 628 bytes logs/2017-06-10-3.log.gz | Bin 0 -> 654 bytes .../mf2/entity/mob/EntityMinotaur.java | 1 - 3 files changed, 1 deletion(-) create mode 100644 logs/2017-06-10-2.log.gz create mode 100644 logs/2017-06-10-3.log.gz diff --git a/logs/2017-06-10-2.log.gz b/logs/2017-06-10-2.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..f6ccb13660f0d28b4f31939089e29ae1dcffca26 GIT binary patch literal 628 zcmV-)0*n10iwFP!000000M(UIZ`v>r$KNaUJKUbSNi2;+0!?1KQZWIo%CtTp9bL8T@JLueu6Bv>)T;xz{ zQud82O{XU#7aS+PZ-XxjPQrkhD#GkV)w}7V$lf_lCJ1Qh*F5Mkz zS*n!!C@^=KztIHC!Ze`M?{#=VF9Elh&XSH)IYD1$(6f3{hokyjP^xfZU=x2hXdn$- z30dY-=o*^qYO4+kgL>WVZX09FHa3){uyybUg=+m=&lcupjYMwcpbaWR*-l-F<` z$OKqx#adu!WlBZ*{GpKPOn*gFpgzKeyFOpJ1eK%x&u3KK*cMO3f|dRMg>wxf<_F=Q zP6tsRwQE9mV27lZq+XRVbdhdOTo}rgD+%UXy!uJ9d^)1Qytc>u8m`wQ$a*>78Lbz{ zRSnUtq6I3a*_028a+h=>6%@3j0`@Y;RVJ5HbO>@-a(aY}TPu+g7zr$Bz(mP8>~#?N zm0a8%HnJndBDqRZKS(ibHOElMJhzCrfJbhombc+%4Lk!DwEzu#4r8y)!j}65j4_`z zpdEOA!(MM;5QTnx!J@F;j9V=HQnwEHCGAKuyF`%Ve0R4-L8T6tjsn^}vA|NhXQ%W$ zuf8~)mSU#&25>g8Oz)*Cva|CWD|>X0JHO^Jegm@IsSh&yVL@Gq=h8wyY5p^(I^y?m zI@)ia)6r&cI8{?Oa<}Kuq^2S literal 0 HcmV?d00001 diff --git a/logs/2017-06-10-3.log.gz b/logs/2017-06-10-3.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..faa8d7f8eedd0e387d27746894d4e43bd8fc95db GIT binary patch literal 654 zcmV;90&)ExiwFP!000000M%4oZ`v>veXrF2aQDHfpBwvWG~He9pPo=UjV2q9kZ1esB+yC1w1gKk8lICoo2>8PB0q zD9s;}3QtcaPvFRaFAIiTgPu#I*)wZ!_x)-BzfdYBcmkdiJ7iC52X(YtECkJLxm#4C zlqn7=r@5{C4QI40bPIaJL5~&q47j1`BIya4BMe0b1H(u8HfqQ?rjpJyRQR_+BcY+o zMVZf`uW_mBrFxWWs&@VU;b0weu(2q)>4QxrmAj{Y_GVUl$a6ynrK!}I?b$)CEtlrU zAQK?rmV}^jt4oRMVp@oFq0Xr;sQQ2mv*&EA@}FlEgzwrD5N~U~_k4a|h`3(+Po+1l z{=n1(iED!zqgtBtWm+MF2Im`mFdEcf=RN6Px~iUM&u4sjc(ULi-LWpx+0TTvz( zkZvTdsI;7_eUO;jqB9|(z%>@|qH+b9A$nbu0IxVVmuL`<@ zk}tT}a8Pzix@&_^4lyT7F?CY0aWXTK^MiQ((9pHDn3{oG(Nfv9ZOd_-=Hzs4dQvaa zJsX+8?u0C|vx{p(+t}ri^hRi`lSdN!VN&Sws0I`Qdn*aa+ literal 0 HcmV?d00001 diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java index 398e4ca7..9d06a67b 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java @@ -409,7 +409,6 @@ protected String getHurtSound() @Override protected String getDeathSound() { - return "mob.cow.death"; } @Override public float getSoundPitch() From bd923f63ccd76671b3eac7da1c05e4d790595178 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 10 Jun 2017 19:09:18 +0700 Subject: [PATCH 019/101] Revert "Fix minotaur death sound" This reverts commit 4e0306005ff89ccb8da1035368d74122b90d4fd9. --- logs/2017-06-10-2.log.gz | Bin 628 -> 0 bytes logs/2017-06-10-3.log.gz | Bin 654 -> 0 bytes .../mf2/entity/mob/EntityMinotaur.java | 1 + 3 files changed, 1 insertion(+) delete mode 100644 logs/2017-06-10-2.log.gz delete mode 100644 logs/2017-06-10-3.log.gz diff --git a/logs/2017-06-10-2.log.gz b/logs/2017-06-10-2.log.gz deleted file mode 100644 index f6ccb13660f0d28b4f31939089e29ae1dcffca26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmV-)0*n10iwFP!000000M(UIZ`v>r$KNaUJKUbSNi2;+0!?1KQZWIo%CtTp9bL8T@JLueu6Bv>)T;xz{ zQud82O{XU#7aS+PZ-XxjPQrkhD#GkV)w}7V$lf_lCJ1Qh*F5Mkz zS*n!!C@^=KztIHC!Ze`M?{#=VF9Elh&XSH)IYD1$(6f3{hokyjP^xfZU=x2hXdn$- z30dY-=o*^qYO4+kgL>WVZX09FHa3){uyybUg=+m=&lcupjYMwcpbaWR*-l-F<` z$OKqx#adu!WlBZ*{GpKPOn*gFpgzKeyFOpJ1eK%x&u3KK*cMO3f|dRMg>wxf<_F=Q zP6tsRwQE9mV27lZq+XRVbdhdOTo}rgD+%UXy!uJ9d^)1Qytc>u8m`wQ$a*>78Lbz{ zRSnUtq6I3a*_028a+h=>6%@3j0`@Y;RVJ5HbO>@-a(aY}TPu+g7zr$Bz(mP8>~#?N zm0a8%HnJndBDqRZKS(ibHOElMJhzCrfJbhombc+%4Lk!DwEzu#4r8y)!j}65j4_`z zpdEOA!(MM;5QTnx!J@F;j9V=HQnwEHCGAKuyF`%Ve0R4-L8T6tjsn^}vA|NhXQ%W$ zuf8~)mSU#&25>g8Oz)*Cva|CWD|>X0JHO^Jegm@IsSh&yVL@Gq=h8wyY5p^(I^y?m zI@)ia)6r&cI8{?Oa<}Kuq^2S diff --git a/logs/2017-06-10-3.log.gz b/logs/2017-06-10-3.log.gz deleted file mode 100644 index faa8d7f8eedd0e387d27746894d4e43bd8fc95db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 654 zcmV;90&)ExiwFP!000000M%4oZ`v>veXrF2aQDHfpBwvWG~He9pPo=UjV2q9kZ1esB+yC1w1gKk8lICoo2>8PB0q zD9s;}3QtcaPvFRaFAIiTgPu#I*)wZ!_x)-BzfdYBcmkdiJ7iC52X(YtECkJLxm#4C zlqn7=r@5{C4QI40bPIaJL5~&q47j1`BIya4BMe0b1H(u8HfqQ?rjpJyRQR_+BcY+o zMVZf`uW_mBrFxWWs&@VU;b0weu(2q)>4QxrmAj{Y_GVUl$a6ynrK!}I?b$)CEtlrU zAQK?rmV}^jt4oRMVp@oFq0Xr;sQQ2mv*&EA@}FlEgzwrD5N~U~_k4a|h`3(+Po+1l z{=n1(iED!zqgtBtWm+MF2Im`mFdEcf=RN6Px~iUM&u4sjc(ULi-LWpx+0TTvz( zkZvTdsI;7_eUO;jqB9|(z%>@|qH+b9A$nbu0IxVVmuL`<@ zk}tT}a8Pzix@&_^4lyT7F?CY0aWXTK^MiQ((9pHDn3{oG(Nfv9ZOd_-=Hzs4dQvaa zJsX+8?u0C|vx{p(+t}ri^hRi`lSdN!VN&Sws0I`Qdn*aa+ diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java index 9d06a67b..398e4ca7 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java @@ -409,6 +409,7 @@ protected String getHurtSound() @Override protected String getDeathSound() { + return "mob.cow.death"; } @Override public float getSoundPitch() From 29a7ec6b7b180d8e23ec6070c06446622a25a01d Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 10 Jun 2017 19:10:21 +0700 Subject: [PATCH 020/101] Fix minotaur death sound --- src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java index 398e4ca7..40111146 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java @@ -409,7 +409,7 @@ protected String getHurtSound() @Override protected String getDeathSound() { - return "mob.cow.death"; + return "minefantasy2:mob.minotaur.death"; } @Override public float getSoundPitch() From 23c02f765d8dc4b3d028174ec1f66ca487bc3779 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 11 Jun 2017 00:24:12 +0700 Subject: [PATCH 021/101] Fix minecraft-related files in Git --- .gitignore | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d25e3b6d..358a3dbe 100644 --- a/.gitignore +++ b/.gitignore @@ -60,5 +60,15 @@ eclipse/* *.launch gradlew *.bat -bin/* eclipse/* +/bin/ + +# Minecraft-related +asm/ +saves/ +config/ +options.txt +usercache.json +usernamecache.json +logs/ +crash-reports/ \ No newline at end of file From 3fed32a470322286afebacd7916ce2b2c4ca8e76 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 11 Jun 2017 01:14:43 +0700 Subject: [PATCH 022/101] Some NEI tweaks --- .../nei/RecipeHandlerBlastFurnace.java | 6 +++--- .../mf2/integration/nei/RecipeHandlerBloom.java | 2 +- .../integration/nei/RecipeHandlerCrucible.java | 17 ++++++----------- .../mf2/integration/nei/RecipeHandlerQuern.java | 15 +++++++++++---- .../integration/nei/RecipeHandlerTanning.java | 2 +- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java index 730f78b5..ed4d0998 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java @@ -31,7 +31,7 @@ public String getGuiTexture() { public void drawBackground(int recipe) { GL11.glColor4f(1, 1, 1, 1); GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(0, 0, 0, 0, 133, 112); + GuiDraw.drawTexturedModalRect(0, 0, 5, 0, 133, 112); } @Override @@ -68,8 +68,8 @@ private class CachedBlastFurnaceRecipe extends CachedRecipe { private PositionedStack output; private CachedBlastFurnaceRecipe(ItemStack inputStack, ItemStack outputStack) { - input = new PositionedStack(inputStack, 80, 30); - output = new PositionedStack(outputStack, 80, 68); + input = new PositionedStack(inputStack, 75, 30); + output = new PositionedStack(outputStack, 75, 68); } @Override diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java index 074d4916..3707b26b 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java @@ -51,7 +51,7 @@ public int recipiesPerPage() { public void drawBackground(int recipe) { GL11.glColor4f(1, 1, 1, 1); GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(0, 0, 5, 11, 166, 89); + GuiDraw.drawTexturedModalRect(0, 0, 0, 11, 176, 89); } @Override diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java index d5249800..5d6ddc5e 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java @@ -16,9 +16,11 @@ public class RecipeHandlerCrucible extends TemplateRecipeHandler { + private String recipeName = "method.crucible"; + @Override public String getRecipeName() { - return StatCollector.translateToLocal("method.crucible"); //TODO: Tiered naming + return StatCollector.translateToLocal(recipeName); } @Override @@ -59,13 +61,7 @@ public void drawBackground(int recipe) { CachedAlloyRecipe cachedRecipe = (CachedAlloyRecipe) arecipes.get(recipe); GL11.glColor4f(1, 1, 1, 1); GuiDraw.changeTexture(getTexture(cachedRecipe.tier)); - GuiDraw.drawTexturedModalRect(0, 0, 0, 0, 151, 94); - } - - @Override - public void drawExtras(int recipe) { - CachedAlloyRecipe cachedRecipe = (CachedAlloyRecipe) arecipes.get(recipe); - GuiDraw.drawString("Required tier: " + cachedRecipe.tier, 10, 98, -16777216, false); + GuiDraw.drawTexturedModalRect(0, 0, 5, 0, 151, 94); } private String getTexture(int tier) { @@ -87,7 +83,7 @@ private class CachedAlloyRecipe extends CachedRecipe { @SuppressWarnings("unchecked") private CachedAlloyRecipe(Alloy alloy) { setIngridients(alloy.recipeItems); - output = new PositionedStack(alloy.recipeOutput, 129, 32); + output = new PositionedStack(alloy.recipeOutput, 124, 32); tier = alloy.level; } @@ -101,7 +97,7 @@ private void setIngridients(List recipeItems) { continue; } - PositionedStack stack = new PositionedStack(currentStack, 62 + x * 18, 14 + y * 18); + PositionedStack stack = new PositionedStack(currentStack, 57 + x * 18, 14 + y * 18); ingredients.add(stack); } } @@ -117,6 +113,5 @@ public List getIngredients() { public PositionedStack getResult() { return output; } - } } diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java index f34c9ce5..600e2d65 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java @@ -46,7 +46,7 @@ public int recipiesPerPage() { public void drawBackground(int recipe) { GL11.glColor4f(1, 1, 1, 1); GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(0, 0, 0, 0, 122, 80); + GuiDraw.drawTexturedModalRect(0, 0, 5, 0, 122, 80); } @Override @@ -61,6 +61,13 @@ public void loadCraftingRecipes(ItemStack result) { @Override public void loadUsageRecipes(ItemStack ingredient) { + if(ingredient.getItem().equals(ComponentListMF.clay_pot)) { + for (RecipePair recipePair : recipeList) { + CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipePair.inputStack, recipePair.outputStack); + arecipes.add(cachedRecipe); + } + } + QuernRecipes output = QuernRecipes.getResult(ingredient); if (output != null) { CachedQuernRecipe recipe = new CachedQuernRecipe(ingredient, output.result); @@ -95,9 +102,9 @@ private class CachedQuernRecipe extends CachedRecipe { private PositionedStack inputStack; private CachedQuernRecipe(ItemStack ingredient, ItemStack result) { - inputStack = new PositionedStack(ingredient, 81, 9); - potStack = new PositionedStack(new ItemStack(ComponentListMF.clay_pot), 81, 32); - resultStack = new PositionedStack(result, 81, 55); + inputStack = new PositionedStack(ingredient, 76, 9); + potStack = new PositionedStack(new ItemStack(ComponentListMF.clay_pot), 76, 32); + resultStack = new PositionedStack(result, 76, 55); } @Override diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java index f47b01e6..4017d44e 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java @@ -19,7 +19,7 @@ public String getRecipeName() { @Override public String getGuiTexture() { - return "minefantasy2:textures/gui/quern.png"; + return "minefantasy2:textures/gui/quern.png"; //need to draw texture } @Override From 45b9a36daef54585c987c891c4f6f9c25fce97b2 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 11 Jun 2017 01:51:54 +0700 Subject: [PATCH 023/101] Fix rare EventManager NPE --- .../minefantasy/mf2/integration/nei/RecipeHandlerQuern.java | 1 + src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java index 600e2d65..7a99f784 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java @@ -66,6 +66,7 @@ public void loadUsageRecipes(ItemStack ingredient) { CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipePair.inputStack, recipePair.outputStack); arecipes.add(cachedRecipe); } + return; } QuernRecipes output = QuernRecipes.getResult(ingredient); diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index 3fa8a6d9..3b82cc1d 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -1014,7 +1014,7 @@ public void clonePlayer(PlayerEvent.Clone event) public void startUseItem(PlayerUseItemEvent.Start event) { EntityPlayer player = event.entityPlayer; - if(event.item.getItemUseAction() == EnumAction.block) + if(event.item != null && event.item.getItemUseAction() == EnumAction.block) { if((StaminaBar.isSystemActive && TacticalManager.shouldStaminaBlock && !StaminaBar.isAnyStamina(player, false)) || !CombatMechanics.isParryAvailable(player)) { From 54d5b7195657a0be39f94c477e3dda1799011bc2 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 11 Jun 2017 02:04:21 +0700 Subject: [PATCH 024/101] Make assets lowercase --- .../armour/clothing/leatherapron_layer_1.png | Bin 0 -> 451 bytes .../clothing/leatherapron_layer_1_cloth.png | Bin 0 -> 449 bytes .../models/armour/leather/hide_layer_1.png | Bin 0 -> 897 bytes .../models/armour/leather/hide_layer_1_cloth.png | Bin 0 -> 382 bytes .../models/armour/leather/hide_layer_2.png | Bin 0 -> 343 bytes .../models/armour/leather/hide_layer_2_cloth.png | Bin 0 -> 210 bytes .../armour/leather/roughleather_layer_1.png | Bin 0 -> 1248 bytes .../leather/roughleather_layer_1_cloth.png | Bin 0 -> 440 bytes .../armour/leather/roughleather_layer_2.png | Bin 0 -> 687 bytes .../leather/roughleather_layer_2_cloth.png | Bin 0 -> 132 bytes .../armour/leather/scaleleather_layer_1.png | Bin 0 -> 1054 bytes .../leather/scaleleather_layer_1_cloth.png | Bin 0 -> 950 bytes .../armour/leather/scaleleather_layer_2.png | Bin 0 -> 530 bytes .../leather/scaleleather_layer_2_cloth.png | Bin 0 -> 568 bytes .../armour/leather/strongleather_layer_1.png | Bin 0 -> 1016 bytes .../leather/strongleather_layer_1_cloth.png | Bin 0 -> 950 bytes .../armour/leather/strongleather_layer_2.png | Bin 0 -> 665 bytes .../leather/strongleather_layer_2_cloth.png | Bin 0 -> 568 bytes .../armour/leather/studleather_layer_1.png | Bin 0 -> 1119 bytes .../armour/leather/studleather_layer_1_cloth.png | Bin 0 -> 950 bytes .../armour/leather/studleather_layer_2.png | Bin 0 -> 391 bytes .../armour/leather/studleather_layer_2_cloth.png | Bin 0 -> 568 bytes .../models/armour/padding/padded_layer_1.png | Bin 0 -> 344 bytes .../armour/padding/padded_layer_1_cloth.png | Bin 0 -> 981 bytes .../models/armour/padding/padded_layer_2.png | Bin 0 -> 190 bytes .../armour/padding/padded_layer_2_cloth.png | Bin 0 -> 568 bytes 26 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_2_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_2_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_2_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2_cloth.png diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1.png b/src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef116f34a3772fed2e4fbd5d02b6144d65df141 GIT binary patch literal 451 zcmV;!0X+VRP)s1rU?e`f4*dBcXY^FL3K{xFA$g+&0C?Zt7sr-d?4k-0M z7`h_QbHWYLHuzif{X0~$hGCFpSR12{NF<&liRysv|K;=i@!IQ`0>HWzZjXZ?P-DbyuHAJy0Lfw@Wm(ecbP^)S z4!HGFlWgyN=q89NZyWe8GHOnD-Y+W(Kn`~?xP5k8i(p2YwF002ovPDHLkV1h#9*HZuh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1b9d7ea9f31c1cf36141caed65ca99dd607ae4 GIT binary patch literal 449 zcmV;y0Y3hTP)_m14!SzZF*`@VeuvMi&bCg{M)&5}^6fC?yO_RFzJWt(YKWwZf zqXEEK1kV80oaSuzeSgh7R!js8D0tSkt+KJ2j0SMHgGZ0w=mE&qIF4G9<*XyyC<#^s z6a+hZ11kXKU_5}bES0lxIt;^2hh5jb!h*!nK>41_fB~JN2S5Sbuyh>8r%*=$u$@K$ z+_-cU;5d%TI09t_d@iBWDd7F}iQZlwh}W&(`?{ak=g0e5yYT?N`&F2G2W5a@p(gxY r=F<3+uZ#%*knNwIX9a*g=j|OIaEh4~TMI+m00000NkvXXu0mjfDIB}$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..635c6b5bf4be8553c8d08882ba951b17cc515c2f GIT binary patch literal 897 zcmV-{1AhF8P)Nkl# zJ#O1T5QUjrq{v?p2T-a6veTxB8udDW8UZeK0)c8=sWA}1wa%bI7f_=nRZ87ulSlXy zo))CIvS?CH1{j#+&hE^6Gdo<-Sym(8zkCd?%jGhx*XwZe`F(L;H~*3(gzzfX+DQN( zeEU=YM^gz%a?+AKnSdDld_FH!)gT*<$MZCf)5eiBBqvpXz@mVMfU})+B*_H)xVbv0 zg4JqOkf3eQh?9;aDK-I@iUa|d>RRCSw-G0oEZgliNZAH#37*TQtP*IDFP?y`zz{-GN^B-tEU_t2vs>8{#PhOsCUI0%HGFcE{F8B0yk&KRgu5Vdv3d7>~z=>RQh< z9@|$D;O7YlaRLT|L6GV?&R&)OQarZKNdy4aL6PCjW>YvG4u^&6S^+Q)cweK609PlV z-|q)$839%P%kcO*Nm8|^9gqU>pmYrZZda$r2uepCsdLLc~>1;L&lgZ>|RZtUh-Fv&= zY9gZRcv=^M){iie@Lv+}_3BNKvK6|HC(A1|)vnGSpi;m)30$imNYxv7-U>l-!nXke z)lt|%=~^}f%WINAH3s0^>{*ZX`8X3Fy!6aJ)A6?z0vwPU6o4EQ0W(g}5a8zrfasbm zmYq$suGVnUoP4#7Fe}(RUuj;$)mn0Q*XNDt<1I zeot_ec-869OJ0Cki_FI#UFBOgl)r#E0mno($pk0}HwKh973>(}85Q6J#7AN>%36#= zfS0aUfc&#Qpi{s*3AF;l?l9E>#E~KHs~QxiH-Urz0D1#M7mLMyk9Q&-AX)eFcPaZY z8h2(Y$}0c@|f^5G=$(1X~M15Ckg`{f7)U@FXK9xNms}E^#JKlKUpcERM62wr$0n z@;sN?TmIvLSzR6nz=i;rOj;iR-}k>C0MGO64nQ2oT9Z{(*%1Iznx-NQLwODJRs?`y z7=~e93@u-~uKQEp_o6IInGVAs>bf4^=}prJ2>B4r1A-tJ=K-`FhA=;%c>>*=Wtr5S z-Wi5rc0&Upgh35U;JIZmzQfYlbzLb8ma3-rWAKHpad84kl8lXCvM+#@Bi=TzH?E@V z4M&xY6oDq4QO_eG^V8tsb5Rsh_q6O}$k>v9`*Rzzn4KbxqG++P%|XBqfqKe=il^FC z_)4h$(<)Hs>?)=M4_z?m`iNsODrZj_monGbwFYR5-L%#II+peZ>P4S2uVQ+nOnIL{ cXYy|IKUfLcF>GRA8$DUAO32d=0_9Z{q__oq-d_AVMrA?0hgdcf7(q$C;~HW{fe$ z7-Nhv#u#Ia`74U;B3w?pI501ZRj7`e7}s?jx~_{c#(BRC%x9ds{>i8y%ppn*Xqx6> z0L;PtYqg(`0ndUkxFcQ}K*JEHu75H#pl#bI7`uQw0OGNRIdW)_8j`yH$Ra zHAH&^3`2hE`X{4X9^$kqYOF^D;`_dj4Kj88AAxTgb6hE!2Czpk=5d)t6MO~Vwi>`S z6|QS+lKL#y;`K1R|299h!Q2gOdfX*{N1o>aBXu1=37e>XCfP*!bs03#`!N`kpIYBr p^fRgd2^6A&%3>YH<$wP_;|63SH5JInLQVhx002ovPDHLkV1h%dkre;{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5b69f061f7d37329a7e9e7e30dc3894a03edb3 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQZqeW978JRyuDz{)nXvfmiWG& z{rm*AsjW*qMb{h^QOvyJWqms`?Lh0=vfZu~@)Doqe=K_q)CL6)*cDj329831D zTRkNxMaEsaR5n@U{ocDf*Li2HHM?$g{_?%mwfC29O{@NOegEg$rHm#$ZM&H7Ha@T1 z## z=~5Fx5XaYN@Pl6z5JJKspj_b+p#;%z1abgD1q9#!6~_McOs``MNi0aR$W)~!vpcif z|Gv97Nji+mV$SW(47>XBxcfXi;;KtIS6&=*6`4zOuU)6}kA495=k~O_STE?@Sj)TX z%_(;-Gt4NCy>QbnpSPR`P5Xn4v(7O z&;pjY4_JW0gag^jeZ0Tr12r)bt}`FbhgsH~*?BXhGtc2V&tb zd$YfZ1YB(Qm`Q3rGd@kOF6R^+Oe`;q>2qLOwdg}9OyE6@kVy^(bu<8}4o)PsGd$~og0s|`c6+D+virH8`(FmdRFpEwU5b{fe5&Z9FzwTwUVxBR#79~;m7c?ic zc|;5(W=5+y+Se8gnt}PC1!zbQ$$yy92~a%#o64_wAZ66`FysMQ$o(x(L6a)|2&1TL zB{;S$c8i(kf4a*C7*+B*xAf}0g3Ln-`$a=iTF^x2+%tam zzMeBcUZUUuC16qs;HV$~CRi1SM39&iP7+@8W;O=?k0guzgkbKIHlsbH)2!QdqT{(Q z)g~ZBB8im3$_z?mBouQWCRm|`1^`|_B}WUR2|hupM`a?Kgl`b=iR@48I|R@2{fc2N z!Q=Of8KnPVu4w>2dHw)=fDqeC^G@u8Fn?}rWD^##a(oDSW_T;O!5<2#M1O;Xxi{~#!UQdWLkO}^gp@FY^VLF{lnk2w`;K3~3$rkP;Oa*J0000< KMNUMnLSTXrdQ&(6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..f6f353637dc192962a03416ab0d9ac64213be63c GIT binary patch literal 440 zcmV;p0Z0CcP)misTb&ZdWBx5_$`@ctSq+lXK6cMGU;?# znwf9EPG?ss1L8P7%VNIo$59k%gCB-r;%9vZ%oK+;$h2{0vUBBnD0bVdREGf0NjZ%h#^Njc=Az7SxW0D+(wyz!;_a4+=r{kETsqsZ;^Kks+*mXAXcn8xDmrl*rfQe5gLV9xq!q`n^< z{n|7hNGJ#bZIC?1c#}lU4$a3s=F&mcU8vA zD8OvDA)ogeCc^nL3UEgHs|dqRRW5ew_g?@ApR~&|QL^K1U8Z`ScWOrdbhBb*(BG_J z7v8m>$Z)$VAGA!q?5&wy(f;QKWWMb;I$;EIynq!ne-f51K*ATf=<&v}_rIXf({C{m%_jnTXzG5rq_IB7Ll6>G~>0(7gZ= z{A|zPv`Tkh00^=45K+YNsW8%dC*nuV$MX{4eEQcEz@AL`sCxt7dYzQ)-p@uT_QS2J zO_P4RB8*ag@8#uTLrkRF2*Mxv8C%Y{>Z#?LXSZ> zM6(`~O&M${BkY+lX0LWU=X-Zz%HTMc^@R0u8s(juWyI~sGG%y{?G^GuOK5R3oh(=AJInHCW?57vWWjhegjp~ V$x@r4ei8rx002ovPDHLkV1i%hM~?si literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..e80508fffcdf86fed995e24f32be713f42f45b58 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQr?~}jv*Cu-d;P&$zaIAaNtXP zckhj+vnd~Ev$d46{h3|yz!Ip6fuX-+hwSA_gQctT(%!vosQdGZKVtpr`^g4#kI(pO fonTwe@aG!)g0Jdj(QOy&Kfu6dQbn@d9B|rOglu38epOXNbheh-8JC1o}>&J zxHqm|kDUN`dhgw;Apzjg{}%*6m;wm1@=kbwLDd)|l?~&`66d1t96vRTK97B!*3au_OQ>01QHq1V`YX*H`rN+-?13Bcn6( zQ+g+pc67bOUIX_)+>84YPW{0BkrM#Jkk`y_ggD0pLxa~BXY|+2jI#&ebLi&#HA42( zVe0H{_nxsIMiKQTfFwZR9ob7AcnjbW0rpOi`kYI_Gmr)FBnIF)mIS!jH8cW(G%O}} ze_`g51Vk405CD&qk|4d_IkFlM1|XVW4Zt!uuae^K=0x(e;9|Uxebypuw z8UozjCwniO!h#%#04cJ91ArefUJY~I2#8`+Yy>17a&d%c)HPxuV0resmNIGr-0Vr5 zfb86)UVC(7YzWxf?ww4%?1`O#H}g03hoz}V1O$0Un0c@Pze)W3xE9%-&;(FWz=D8D zQli*15CML|ZL&NhaX(?}$lny@J$_N7!F*=td{{}G0KCNfMzGlXjR3&EZN4%)KYlvp z-XHgP*1%kz73{+j_3fMwJ01!FJV*fmx4j_2ZSRlg)W=-Evx1%TZeu$=>>4qY2%tx$ zhrj1moHGC;g8CTS`tmeN{Ys^x2#nVxkM}MvE{x!sq z(>SDyIS{$%v#0*?@v%BPJ5%T9=Sq?x>kHShqao0)Gbm86d3Z65-VzaDgFz$!q>KP~ zh$-O)p86*zC+hU{)JU~jH6+yQb#q;-)yx=DDwWjH(UAgS<#JhJ9>lj{5iG_R@cQuZ zP!)?svmjnzw}XQN;|@&yn;zv~Uhy*;NcQA)@W%%0>&?h=_r1~?^ZOkDUgvKz# zb)ir&&+LY<1k;U1L$z8h)oeD67hp6&OV6^ZgUn8+W9HLCHVFhDCPE_{g#WPe9dr1twoN{*q6{M*fCboTKb zQ=t0c`J1ua#PIkV^iLFNQ(WRpfZKPKMapX&WG{}jtLj3Um Y0vaO5^E6doJyI2G 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..f190b569366debeb26f4645bce7819170b4fd1d0 GIT binary patch literal 950 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 Dl10$k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2.png b/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..37225d0ae48fb7e66c50a68dd6ba11c02d023cb4 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQmvjYjv*Cu-d;J#+n~VX5P0mv zi<69dteb!P2L}uD3+Z$Os{GZ@G&r=-WT_%hIS4eUD{VS%)n8O|Jn?O*zy9)#K8G`X z|6Vq|mp}J^@;mDTwTu-^t+E%a&R>7RwO|d?l5_E*o7C*I9deaaix0nAcjxE*?sTWT lX?HB|AH7_BpK-5v0`r?C*6D@$N2Y^}_jL7hS?83{1ON#bNsRyi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..abf954a1fcaa273dc42e0b36df11b155956d55d6 GIT binary patch literal 568 zcmV-80>}M{P)$Kf&(|*5Cr_(8w_NQ}fHkLGNtgTWxL?P)LbB?d1)yg&R;_|eIX zi8nw@cv z6cvF4!uHIUm@yFmYZau$1f0F9VjuIznICb>AdF1Rj0lJfHnXYdnx2Hnb%dR~=&)#`KYd*xfYJpGHYknM|%xIhd0000 Date: Sun, 11 Jun 2017 02:18:21 +0700 Subject: [PATCH 025/101] Whooops --- .../armour/clothing/leatherapron_layer_1.png | Bin 451 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1.png diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1.png b/src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1.png deleted file mode 100644 index 4ef116f34a3772fed2e4fbd5d02b6144d65df141..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmV;!0X+VRP)s1rU?e`f4*dBcXY^FL3K{xFA$g+&0C?Zt7sr-d?4k-0M z7`h_QbHWYLHuzif{X0~$hGCFpSR12{NF<&liRysv|K;=i@!IQ`0>HWzZjXZ?P-DbyuHAJy0Lfw@Wm(ecbP^)S z4!HGFlWgyN=q89NZyWe8GHOnD-Y+W(Kn`~?xP5k8i(p2YwF002ovPDHLkV1h#9*HZuh From 97ceef37fdb90eb3679934c6712e7ef2f3552860 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 11 Jun 2017 02:19:17 +0700 Subject: [PATCH 026/101] Cleanup --- .../armour/Clothing/leatherapron_layer_1.png | Bin 451 -> 0 bytes .../Clothing/leatherapron_layer_1_cloth.png | Bin 449 -> 0 bytes .../models/armour/Leather/hide_layer_1.png | Bin 897 -> 0 bytes .../models/armour/Leather/hide_layer_1_cloth.png | Bin 382 -> 0 bytes .../models/armour/Leather/hide_layer_2.png | Bin 343 -> 0 bytes .../models/armour/Leather/hide_layer_2_cloth.png | Bin 210 -> 0 bytes .../armour/Leather/roughleather_layer_1.png | Bin 1248 -> 0 bytes .../Leather/roughleather_layer_1_cloth.png | Bin 440 -> 0 bytes .../armour/Leather/roughleather_layer_2.png | Bin 687 -> 0 bytes .../Leather/roughleather_layer_2_cloth.png | Bin 132 -> 0 bytes .../armour/Leather/scaleleather_layer_1.png | Bin 1054 -> 0 bytes .../Leather/scaleleather_layer_1_cloth.png | Bin 950 -> 0 bytes .../armour/Leather/scaleleather_layer_2.png | Bin 530 -> 0 bytes .../Leather/scaleleather_layer_2_cloth.png | Bin 568 -> 0 bytes .../armour/Leather/strongleather_layer_1.png | Bin 1016 -> 0 bytes .../Leather/strongleather_layer_1_cloth.png | Bin 950 -> 0 bytes .../armour/Leather/strongleather_layer_2.png | Bin 665 -> 0 bytes .../Leather/strongleather_layer_2_cloth.png | Bin 568 -> 0 bytes .../armour/Leather/studleather_layer_1.png | Bin 1119 -> 0 bytes .../armour/Leather/studleather_layer_1_cloth.png | Bin 950 -> 0 bytes .../armour/Leather/studleather_layer_2.png | Bin 391 -> 0 bytes .../armour/Leather/studleather_layer_2_cloth.png | Bin 568 -> 0 bytes .../models/armour/Padding/padded_layer_1.png | Bin 344 -> 0 bytes .../armour/Padding/padded_layer_1_cloth.png | Bin 981 -> 0 bytes .../models/armour/Padding/padded_layer_2.png | Bin 190 -> 0 bytes .../armour/Padding/padded_layer_2_cloth.png | Bin 568 -> 0 bytes .../clothing/leatherapron_layer_1_cloth.png | Bin 449 -> 0 bytes .../models/armour/leather/hide_layer_1.png | Bin 897 -> 0 bytes .../models/armour/leather/hide_layer_1_cloth.png | Bin 382 -> 0 bytes .../models/armour/leather/hide_layer_2.png | Bin 343 -> 0 bytes .../models/armour/leather/hide_layer_2_cloth.png | Bin 210 -> 0 bytes .../armour/leather/roughleather_layer_1.png | Bin 1248 -> 0 bytes .../leather/roughleather_layer_1_cloth.png | Bin 440 -> 0 bytes .../armour/leather/roughleather_layer_2.png | Bin 687 -> 0 bytes .../leather/roughleather_layer_2_cloth.png | Bin 132 -> 0 bytes .../armour/leather/scaleleather_layer_1.png | Bin 1054 -> 0 bytes .../leather/scaleleather_layer_1_cloth.png | Bin 950 -> 0 bytes .../armour/leather/scaleleather_layer_2.png | Bin 530 -> 0 bytes .../leather/scaleleather_layer_2_cloth.png | Bin 568 -> 0 bytes .../armour/leather/strongleather_layer_1.png | Bin 1016 -> 0 bytes .../leather/strongleather_layer_1_cloth.png | Bin 950 -> 0 bytes .../armour/leather/strongleather_layer_2.png | Bin 665 -> 0 bytes .../leather/strongleather_layer_2_cloth.png | Bin 568 -> 0 bytes .../armour/leather/studleather_layer_1.png | Bin 1119 -> 0 bytes .../armour/leather/studleather_layer_1_cloth.png | Bin 950 -> 0 bytes .../armour/leather/studleather_layer_2.png | Bin 391 -> 0 bytes .../armour/leather/studleather_layer_2_cloth.png | Bin 568 -> 0 bytes .../models/armour/padding/padded_layer_1.png | Bin 344 -> 0 bytes .../armour/padding/padded_layer_1_cloth.png | Bin 981 -> 0 bytes .../models/armour/padding/padded_layer_2.png | Bin 190 -> 0 bytes .../armour/padding/padded_layer_2_cloth.png | Bin 568 -> 0 bytes 51 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Clothing/leatherapron_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Clothing/leatherapron_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/hide_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/hide_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/hide_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/hide_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/roughleather_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/roughleather_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/roughleather_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/roughleather_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/scaleleather_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/scaleleather_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/scaleleather_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/scaleleather_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/strongleather_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/strongleather_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/strongleather_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/strongleather_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/studleather_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/studleather_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/studleather_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Leather/studleather_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Padding/padded_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Padding/padded_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Padding/padded_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/Padding/padded_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_2_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_1.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_1_cloth.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2_cloth.png diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/Clothing/leatherapron_layer_1.png b/src/main/resources/assets/minefantasy2/textures/models/armour/Clothing/leatherapron_layer_1.png deleted file mode 100644 index 4ef116f34a3772fed2e4fbd5d02b6144d65df141..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmV;!0X+VRP)s1rU?e`f4*dBcXY^FL3K{xFA$g+&0C?Zt7sr-d?4k-0M z7`h_QbHWYLHuzif{X0~$hGCFpSR12{NF<&liRysv|K;=i@!IQ`0>HWzZjXZ?P-DbyuHAJy0Lfw@Wm(ecbP^)S z4!HGFlWgyN=q89NZyWe8GHOnD-Y+W(Kn`~?xP5k8i(p2YwF002ovPDHLkV1h#9*HZuh diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/Clothing/leatherapron_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/Clothing/leatherapron_layer_1_cloth.png deleted file mode 100644 index fb1b9d7ea9f31c1cf36141caed65ca99dd607ae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 449 zcmV;y0Y3hTP)_m14!SzZF*`@VeuvMi&bCg{M)&5}^6fC?yO_RFzJWt(YKWwZf zqXEEK1kV80oaSuzeSgh7R!js8D0tSkt+KJ2j0SMHgGZ0w=mE&qIF4G9<*XyyC<#^s z6a+hZ11kXKU_5}bES0lxIt;^2hh5jb!h*!nK>41_fB~JN2S5Sbuyh>8r%*=$u$@K$ z+_-cU;5d%TI09t_d@iBWDd7F}iQZlwh}W&(`?{ak=g0e5yYT?N`&F2G2W5a@p(gxY r=F<3+uZ#%*knNwIX9a*g=j|OIaEh4~TMI+m00000NkvXXu0mjfDIB}$ diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/Leather/hide_layer_1.png b/src/main/resources/assets/minefantasy2/textures/models/armour/Leather/hide_layer_1.png deleted file mode 100644 index 635c6b5bf4be8553c8d08882ba951b17cc515c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 897 zcmV-{1AhF8P)Nkl# zJ#O1T5QUjrq{v?p2T-a6veTxB8udDW8UZeK0)c8=sWA}1wa%bI7f_=nRZ87ulSlXy zo))CIvS?CH1{j#+&hE^6Gdo<-Sym(8zkCd?%jGhx*XwZe`F(L;H~*3(gzzfX+DQN( zeEU=YM^gz%a?+AKnSdDld_FH!)gT*<$MZCf)5eiBBqvpXz@mVMfU})+B*_H)xVbv0 zg4JqOkf3eQh?9;aDK-I@iUa|d>RRCSw-G0oEZgliNZAH#37*TQtP*IDFP?y`zz{-GN^B-tEU_t2vs>8{#PhOsCUI0%HGFcE{F8B0yk&KRgu5Vdv3d7>~z=>RQh< z9@|$D;O7YlaRLT|L6GV?&R&)OQarZKNdy4aL6PCjW>YvG4u^&6S^+Q)cweK609PlV z-|q)$839%P%kcO*Nm8|^9gqU>pmYrZZda$r2uepCsdLLc~>1;L&lgZ>|RZtUh-Fv&= zY9gZRcv=^M){iie@Lv+}_3BNKvK6|HC(A1|)vnGSpi;m)30$imNYxv7-U>l-!nXke z)lt|%=~^}f%WINAH3s0^>{*ZX`8X3Fy!6aJ)A6?z0vwPU6o4EQ0W(g}5a8zrfasbm zmYq$suGVnUoP4#7Fe}(RUuj;$)mn0Q*XNDt<1I zeot_ec-869OJ0Cki_FI#UFBOgl)r#E0mno($pk0}HwKh973>(}85Q6J#7AN>%36#= zfS0aUfc&#Qpi{s*3AF;l?l9E>#E~KHs~QxiH-Urz0D1#M7mLMyk9Q&-AX)eFcPaZY z8h2(Y$}0c@|f^5G=$(1X~M15Ckg`{f7)U@FXK9xNms}E^#JKlKUpcERM62wr$0n z@;sN?TmIvLSzR6nz=i;rOj;iR-}k>C0MGO64nQ2oT9Z{(*%1Iznx-NQLwODJRs?`y z7=~e93@u-~uKQEp_o6IInGVAs>bf4^=}prJ2>B4r1A-tJ=K-`FhA=;%c>>*=Wtr5S z-Wi5rc0&Upgh35U;JIZmzQfYlbzLb8ma3-rWAKHpad84kl8lXCvM+#@Bi=TzH?E@V z4M&xY6oDq4QO_eG^V8tsb5Rsh_q6O}$k>v9`*Rzzn4KbxqG++P%|XBqfqKe=il^FC z_)4h$(<)Hs>?)=M4_z?m`iNsODrZj_monGbwFYR5-L%#II+peZ>P4S2uVQ+nOnIL{ cXYy|IKUfLcF>GRA8$DUAO32d=0_9Z{q__oq-d_AVMrA?0hgdcf7(q$C;~HW{fe$ z7-Nhv#u#Ia`74U;B3w?pI501ZRj7`e7}s?jx~_{c#(BRC%x9ds{>i8y%ppn*Xqx6> z0L;PtYqg(`0ndUkxFcQ}K*JEHu75H#pl#bI7`uQw0OGNRIdW)_8j`yH$Ra zHAH&^3`2hE`X{4X9^$kqYOF^D;`_dj4Kj88AAxTgb6hE!2Czpk=5d)t6MO~Vwi>`S z6|QS+lKL#y;`K1R|299h!Q2gOdfX*{N1o>aBXu1=37e>XCfP*!bs03#`!N`kpIYBr p^fRgd2^6A&%3>YH<$wP_;|63SH5JInLQVhx002ovPDHLkV1h%dkre;{ diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/Leather/hide_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/Leather/hide_layer_2_cloth.png deleted file mode 100644 index ff5b69f061f7d37329a7e9e7e30dc3894a03edb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQZqeW978JRyuDz{)nXvfmiWG& z{rm*AsjW*qMb{h^QOvyJWqms`?Lh0=vfZu~@)Doqe=K_q)CL6)*cDj329831D zTRkNxMaEsaR5n@U{ocDf*Li2HHM?$g{_?%mwfC29O{@NOegEg$rHm#$ZM&H7Ha@T1 z## z=~5Fx5XaYN@Pl6z5JJKspj_b+p#;%z1abgD1q9#!6~_McOs``MNi0aR$W)~!vpcif z|Gv97Nji+mV$SW(47>XBxcfXi;;KtIS6&=*6`4zOuU)6}kA495=k~O_STE?@Sj)TX z%_(;-Gt4NCy>QbnpSPR`P5Xn4v(7O z&;pjY4_JW0gag^jeZ0Tr12r)bt}`FbhgsH~*?BXhGtc2V&tb zd$YfZ1YB(Qm`Q3rGd@kOF6R^+Oe`;q>2qLOwdg}9OyE6@kVy^(bu<8}4o)PsGd$~og0s|`c6+D+virH8`(FmdRFpEwU5b{fe5&Z9FzwTwUVxBR#79~;m7c?ic zc|;5(W=5+y+Se8gnt}PC1!zbQ$$yy92~a%#o64_wAZ66`FysMQ$o(x(L6a)|2&1TL zB{;S$c8i(kf4a*C7*+B*xAf}0g3Ln-`$a=iTF^x2+%tam zzMeBcUZUUuC16qs;HV$~CRi1SM39&iP7+@8W;O=?k0guzgkbKIHlsbH)2!QdqT{(Q z)g~ZBB8im3$_z?mBouQWCRm|`1^`|_B}WUR2|hupM`a?Kgl`b=iR@48I|R@2{fc2N z!Q=Of8KnPVu4w>2dHw)=fDqeC^G@u8Fn?}rWD^##a(oDSW_T;O!5<2#M1O;Xxi{~#!UQdWLkO}^gp@FY^VLF{lnk2w`;K3~3$rkP;Oa*J0000< KMNUMnLSTXrdQ&(6 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/Leather/roughleather_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/Leather/roughleather_layer_1_cloth.png deleted file mode 100644 index f6f353637dc192962a03416ab0d9ac64213be63c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440 zcmV;p0Z0CcP)misTb&ZdWBx5_$`@ctSq+lXK6cMGU;?# znwf9EPG?ss1L8P7%VNIo$59k%gCB-r;%9vZ%oK+;$h2{0vUBBnD0bVdREGf0NjZ%h#^Njc=Az7SxW0D+(wyz!;_a4+=r{kETsqsZ;^Kks+*mXAXcn8xDmrl*rfQe5gLV9xq!q`n^< z{n|7hNGJ#bZIC?1c#}lU4$a3s=F&mcU8vA zD8OvDA)ogeCc^nL3UEgHs|dqRRW5ew_g?@ApR~&|QL^K1U8Z`ScWOrdbhBb*(BG_J z7v8m>$Z)$VAGA!q?5&wy(f;QKWWMb;I$;EIynq!ne-f51K*ATf=<&v}_rIXf({C{m%_jnTXzG5rq_IB7Ll6>G~>0(7gZ= z{A|zPv`Tkh00^=45K+YNsW8%dC*nuV$MX{4eEQcEz@AL`sCxt7dYzQ)-p@uT_QS2J zO_P4RB8*ag@8#uTLrkRF2*Mxv8C%Y{>Z#?LXSZ> zM6(`~O&M${BkY+lX0LWU=X-Zz%HTMc^@R0u8s(juWyI~sGG%y{?G^GuOK5R3oh(=AJInHCW?57vWWjhegjp~ V$x@r4ei8rx002ovPDHLkV1i%hM~?si diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/Leather/roughleather_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/Leather/roughleather_layer_2_cloth.png deleted file mode 100644 index e80508fffcdf86fed995e24f32be713f42f45b58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQr?~}jv*Cu-d;P&$zaIAaNtXP zckhj+vnd~Ev$d46{h3|yz!Ip6fuX-+hwSA_gQctT(%!vosQdGZKVtpr`^g4#kI(pO fonTwe@aG!)g0Jdj(QOy&Kfu6dQbn@d9B|rOglu38epOXNbheh-8JC1o}>&J zxHqm|kDUN`dhgw;Apzjg{}%*6m;wm1@=kbwLDd)|l?~&`66d1t96vRTK97B!*3au_OQ>01QHq1V`YX*H`rN+-?13Bcn6( zQ+g+pc67bOUIX_)+>84YPW{0BkrM#Jkk`y_ggD0pLxa~BXY|+2jI#&ebLi&#HA42( zVe0H{_nxsIMiKQTfFwZR9ob7AcnjbW0rpOi`kYI_Gmr)FBnIF)mIS!jH8cW(G%O}} ze_`g51Vk405CD&qk|4d_IkFlM1|XVW4Zt!uuae^K=0x(e;9|Uxebypuw z8UozjCwniO!h#%#04cJ91ArefUJY~I2#8`+Yy>17a&d%c)HPxuV0resmNIGr-0Vr5 zfb86)UVC(7YzWxf?ww4%?1`O#H}g03hoz}V1O$0Un0c@Pze)W3xE9%-&;(FWz=D8D zQli*15CML|ZL&NhaX(?}$lny@J$_N7!F*=td{{}G0KCNfMzGlXjR3&EZN4%)KYlvp z-XHgP*1%kz73{+j_3fMwJ01!FJV*fmx4j_2ZSRlg)W=-Evx1%TZeu$=>>4qY2%tx$ zhrj1moHGC;g8CTS`tmeN{Ys^x2#nVxkM}MvE{x!sq z(>SDyIS{$%v#0*?@v%BPJ5%T9=Sq?x>kHShqao0)Gbm86d3Z65-VzaDgFz$!q>KP~ zh$-O)p86*zC+hU{)JU~jH6+yQb#q;-)yx=DDwWjH(UAgS<#JhJ9>lj{5iG_R@cQuZ zP!)?svmjnzw}XQN;|@&yn;zv~Uhy*;NcQA)@W%%0>&?h=_r1~?^ZOkDUgvKz# zb)ir&&+LY<1k;U1L$z8h)oeD67hp6&OV6^ZgUn8+W9HLCHVFhDCPE_{g#WPe9dr1twoN{*q6{M*fCboTKb zQ=t0c`J1ua#PIkV^iLFNQ(WRpfZKPKMapX&WG{}jtLj3Um Y0vaO5^E6doJyI2G zwFhN592V_%yBG`xMZe!K#^Z5nk4B?{xkvlozRYH`;&QnZtJNxfPp4CA^978m>C0Xs z0O#{LRoYavplbTEmk7Y|cubY{cDpSajmFOh0DG6|!{JcucDvNx@AseK1GIhZULU~N zM*x5cX!mFURe!KtE`L4%czPsF#pz-9T!-{~z25r+(CKv2z3x3folevB2D9`XgW<_! zlG@C%2JK+X%AD_(d)%0040BFE1^8$d+sG9#8 zOzP!Zt=3&;pREF?v-G#o0{jQeFBXdg+DF6@7Jva1Z;q|m1wQ#wle zG0cTH0v{chA-4$^eKjqH&w^l>Zfs$nb?*1f*e~VD4kCOfpdE7yUXvx*&=;wgH>l38 z=Ql{EA_GX+`~nG^e8t~${;P~mgiC-7ql$#Yv||>D6a_#PkBJy_MvZuSwMT|w z%A|{S1km}|&klepYWl1S`hZFmAg@yyGAeWpRS(aY?-7hK$L~kLwR3@6uh)M73V_)G z;1H#zLy~dd24Z>)1B}BIYf)?85!8YxaX~Y`(AgPQ3yKdc`VjU#&aDC20e~q9RI*A#iN+@^pSbkm zYK-wYfG`I`5d`)NaEu8Q0PEBgzR*)jq~}{-yv86@b)+3tR*5lxPemDzCg3yLJsJc8 z@G!MfQ|4%s5UWiar~nRaA3^aA{!R8b71c4RC8aR)FU1E=UwET4R8_66L0b1h*moEka%MYt4PxDaBJ}qSVDld4IRtmDgZ&Jd??YcDpSXI3@z|PNySErIMqKVnVQHwbi@BkldGQ zvk(Q*5Cd`9Y*u~>ilgJXTu#129*TsbVOqeQY|`AP*(!GYk398>IoT+j;&Zq=+3ZCA z%Xq%q`liCPQJtH+8J{KJZGBULE~QSkDS5m#8fl$lVXXg(>-=nIU4Hj^{(qnU2W}M{P)$Kf&(|*5Cr_(8w_NQ}fHkLGNtgTWxL?P)LbB?d1)yg&R;_|eIX zi8nw@cv z6cvF4!uHIUm@yFmYZau$1f0F9VjuIznICb>AdF1Rj0lJfHnXYdnx2Hnb%dR~=&)#`KYd*xfYJpGHYknM|%xIhd0000# z&ubGw6vxLuL{KZVRYVYq;=xw&AYMEu#e*m7j~37V7d;k24<+Of2&IP{LNBF+97+j= zl0(QL|IC=r=vQ8s-Ry3%n+>|~*x8x)X5RPv-kY6loSR(U`&$y1aDCXg=ifcK;kB=q&Soo*beeAZ|T-Px2`*$hioxlJpkH zJFoVTxV6$8E{%Y)ci}v#x|9TbdVb$qshWT|e@Z7{XLHqmf4RO80*dgba02)S@bm5C z(h11oTV8((Awa?gRu%zSWfp(tA|OppPEMST%KDL{^MrKl*1Y7Ax=aqi6=JQJF z1mGy?NL>QXp8cg`&;ID3i;exQK>O(E$Tb>`K&bSiH6MLOe>@%s!9H$}D3t&f0nFv) zWjOLm0CjkH=#Gz%odAjebXCLp(!~Ax`r3^~qmUI4pbW4zuV>Pq3~IOA0sLSvaC(+c z3nKuh5!wL8A%N=OBhal@%SH8Z7-Fy)4u=6qzu$NI%>gI@w{7&*rwmXzYD{}X=>!0d zw4<#k14Ke(Rr^X&Y(xM$lmdG6qemal-%NT?Rfc=CvaO5^E6doJyI2G zwFhN592V_%yBG`xMZe!K#^Z5nk4B?{xkvlozRYH`;&QnZtJNxfPp4CA^978m>C0Xs z0O#{LRoYavplbTEmk7Y|cubY{cDpSajmFOh0DG6|!{JcucDvNx@AseK1GIhZULU~N zM*x5cX!mFURe!KtE`L4%czPsF#pz-9T!-{~z25r+(CKv2z3x3folevB2D9`XgW<_! zlG@C%2JK+X%AD_(d)%0040BFE1^8$d+sG9#8 zOzP!Zt=3&;pREF?v-G#o0{jQeFBXdg+DF6@7Jva1Z;q|m1wQ#wle zG0cTH0v{chA-4$^eKjqH&w^l>Zfs$nb?*1f*e~VD4kCOfpdE7yUXvx*&=;wgH>l38 z=Ql{EA_GX+`~nG^e8t~${;P~mgiC-7ql$#Yv||>D6a_#PkBJy_MvZuSwMT|w z%A|{S1km}|&klepYWl1S`hZFmAg@yyGAeWpRS(aY?-7hK$L~kLwR3@6uh)M73V_)G z;1H#zLy~dd24Z>)1B}BIYf)?85!8YxaX~Y`(AgPQ3yKdc`VjU#&aDC20e~q9RI*A#iN+@^pSbkm zYK-wYfG`I`5d`)NaEu8Q0PEBgzR*)jq~}{-yv86@b)+3tR*5lxPemDzCg3yLJsJc8 z@G!MfQ|4%s5UWiar~nRaA3^aA{!R8b71c4RC8aR)FU1E=UwET4R8_66L0b1h*mo3G#6ose1qtqtGG${!U=||e8v`qpnloC=yNN58gC27fzaVdz1hzmi)g$r>bE?kI+ zATGp(e`exylN-$RVofg9uA z)1Bg82$0X`O|e)s<#O3ntJPa;_dvsU+1flczq2gIDu5{9?`?Z-(sddcYz8zmVtG^#t;Djk&4Ew?6rcou~HK*0SAy zIVU2t+iim&j3IpTZc*aPvqzSE1gqEUCY#NgsjrByYXKqm^ZgScrxk%9j9pJ4AHlR@ zre1)*oiGFugz>-fwPL1T0JjCSB8W^T^M^qAz+lCUd;dcNlWVnFhQ80`ayNu^%zCrg z6cbFPQYMi|NUjPp?)?u9t~)+@2;83FnUjvk<0hR>3t>C}5p>LYG#VZE_J;?g)a3N; zZ!{W0kQ0wYBBoZWNie1&Sl3$sBcyfqo7HUT+rK<@4&*+F*Y8+IYXe zS+GCehQwTtUI%54ypan4DM&*Ga-1rquVYR;7K_Ood5DB)R0?A@sivuf8EfDzzqgm| z`Nt)DxDm8&zIu@R4uJ?G7hqT}M{P)$Kf&(|*5Cr_(8w_NQ}fHkLGNtgTWxL?P)LbB?d1)yg&R;_|eIX zi8nw@cv z6cvF4!uHIUm@yFmYZau$1f0F9VjuIznICb>AdF1Rj0lJfHnXYdnx2Hnb%dR~=&)#`KYd*xfYJpGHYknM|%xIhd000025SnVFlnyYv0bn>TMyDRXJ9?{QI{t5hoKk&zMY);?SJ zdF?1s?+%+|?8&}<+N~gVV`D?t>vgJ^mX-(t#?lsW*DF;3Y-7Y)2rS<86M<|OfTUVu z0l-Q_G{o0xHFE#AqdosW0Nw)2&mWQpKs6&CM13X^VuTmnEe4?E{M`bUgYE)bO` zw7S3J09YjNZ$9h!s6)-iA5WU?q)3?~AXrK`?z81-(s2MRk|Vqn$8fm6GGA0H#a;_V zij=|_7Q>OxmNt3vfF=k+e3N@4@VPO8ALQOIg+*)0ku~0aVBPv@D$l;EOex1E?*G>u)oI zZ2{1#@R3`sR_$q%Ie^COkpA&zDsupF<_6Ia&v{5&0B}J7%nCr<;^q^X187yklAOxu zBRcQjkM-I=RHD8M;yyQNojCx`?|t6_>r(^j`|OZSmD#3Jspv+dLABh^$UFGY7wP6~ zhtUS5O|oxaarJ_0VG(_u+TBwK4^O)mob> zkN~sqX(d@O#4ij#p!S!^emf3ZOcH%S!npAks*QMpfIi0D_qoDZFxS$KgLb9>AOaHy z1c*bQR?~=|f6_&s0P(QlaoEZ}Ry=^90toaBjNf&BEdd-KAFHFIBXxLqNHw>&x3|^K z&W_sK+fxSz2kP|nRGplhC_|R|TU%RbYv}=Kqd+u-)FvLAmFd#FqCCzXAo~n~Jpg^c z$s7O#;l(#MHv|LX(LOsnQ@gvnYIAdw`V_DN@#vqQpR4`-eH?LiCDCRN_*m@GbA$I0 z)S6b*XAd|W1KREZ5Q%?sFD@?Z%1W{D0Kk9^-~bW>LEjS-6tC*%iGIB}d>h~bvDO~X z<`}~6AFRCMn9vpgcqzo2T%WuF1tKpmFKyqrxVpN!B3o>O>+5S82ONF-J#U3UB*X*( zjuRmg2spmU1s>6qIN_c&VpOax& l08P1m(!LKs)Ri{?e*hK>RvzF>tONi6002ovPDHLkV1k!U1;PLT diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/Leather/studleather_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/Leather/studleather_layer_1_cloth.png deleted file mode 100644 index f190b569366debeb26f4645bce7819170b4fd1d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 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 Dl10$k diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/Padding/padded_layer_2.png b/src/main/resources/assets/minefantasy2/textures/models/armour/Padding/padded_layer_2.png deleted file mode 100644 index 37225d0ae48fb7e66c50a68dd6ba11c02d023cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQmvjYjv*Cu-d;J#+n~VX5P0mv zi<69dteb!P2L}uD3+Z$Os{GZ@G&r=-WT_%hIS4eUD{VS%)n8O|Jn?O*zy9)#K8G`X z|6Vq|mp}J^@;mDTwTu-^t+E%a&R>7RwO|d?l5_E*o7C*I9deaaix0nAcjxE*?sTWT lX?HB|AH7_BpK-5v0`r?C*6D@$N2Y^}_jL7hS?83{1ON#bNsRyi diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/Padding/padded_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/Padding/padded_layer_2_cloth.png deleted file mode 100644 index abf954a1fcaa273dc42e0b36df11b155956d55d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 568 zcmV-80>}M{P)$Kf&(|*5Cr_(8w_NQ}fHkLGNtgTWxL?P)LbB?d1)yg&R;_|eIX zi8nw@cv z6cvF4!uHIUm@yFmYZau$1f0F9VjuIznICb>AdF1Rj0lJfHnXYdnx2Hnb%dR~=&)#`KYd*xfYJpGHYknM|%xIhd0000_m14!SzZF*`@VeuvMi&bCg{M)&5}^6fC?yO_RFzJWt(YKWwZf zqXEEK1kV80oaSuzeSgh7R!js8D0tSkt+KJ2j0SMHgGZ0w=mE&qIF4G9<*XyyC<#^s z6a+hZ11kXKU_5}bES0lxIt;^2hh5jb!h*!nK>41_fB~JN2S5Sbuyh>8r%*=$u$@K$ z+_-cU;5d%TI09t_d@iBWDd7F}iQZlwh}W&(`?{ak=g0e5yYT?N`&F2G2W5a@p(gxY r=F<3+uZ#%*knNwIX9a*g=j|OIaEh4~TMI+m00000NkvXXu0mjfDIB}$ diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1.png deleted file mode 100644 index 635c6b5bf4be8553c8d08882ba951b17cc515c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 897 zcmV-{1AhF8P)Nkl# zJ#O1T5QUjrq{v?p2T-a6veTxB8udDW8UZeK0)c8=sWA}1wa%bI7f_=nRZ87ulSlXy zo))CIvS?CH1{j#+&hE^6Gdo<-Sym(8zkCd?%jGhx*XwZe`F(L;H~*3(gzzfX+DQN( zeEU=YM^gz%a?+AKnSdDld_FH!)gT*<$MZCf)5eiBBqvpXz@mVMfU})+B*_H)xVbv0 zg4JqOkf3eQh?9;aDK-I@iUa|d>RRCSw-G0oEZgliNZAH#37*TQtP*IDFP?y`zz{-GN^B-tEU_t2vs>8{#PhOsCUI0%HGFcE{F8B0yk&KRgu5Vdv3d7>~z=>RQh< z9@|$D;O7YlaRLT|L6GV?&R&)OQarZKNdy4aL6PCjW>YvG4u^&6S^+Q)cweK609PlV z-|q)$839%P%kcO*Nm8|^9gqU>pmYrZZda$r2uepCsdLLc~>1;L&lgZ>|RZtUh-Fv&= zY9gZRcv=^M){iie@Lv+}_3BNKvK6|HC(A1|)vnGSpi;m)30$imNYxv7-U>l-!nXke z)lt|%=~^}f%WINAH3s0^>{*ZX`8X3Fy!6aJ)A6?z0vwPU6o4EQ0W(g}5a8zrfasbm zmYq$suGVnUoP4#7Fe}(RUuj;$)mn0Q*XNDt<1I zeot_ec-869OJ0Cki_FI#UFBOgl)r#E0mno($pk0}HwKh973>(}85Q6J#7AN>%36#= zfS0aUfc&#Qpi{s*3AF;l?l9E>#E~KHs~QxiH-Urz0D1#M7mLMyk9Q&-AX)eFcPaZY z8h2(Y$}0c@|f^5G=$(1X~M15Ckg`{f7)U@FXK9xNms}E^#JKlKUpcERM62wr$0n z@;sN?TmIvLSzR6nz=i;rOj;iR-}k>C0MGO64nQ2oT9Z{(*%1Iznx-NQLwODJRs?`y z7=~e93@u-~uKQEp_o6IInGVAs>bf4^=}prJ2>B4r1A-tJ=K-`FhA=;%c>>*=Wtr5S z-Wi5rc0&Upgh35U;JIZmzQfYlbzLb8ma3-rWAKHpad84kl8lXCvM+#@Bi=TzH?E@V z4M&xY6oDq4QO_eG^V8tsb5Rsh_q6O}$k>v9`*Rzzn4KbxqG++P%|XBqfqKe=il^FC z_)4h$(<)Hs>?)=M4_z?m`iNsODrZj_monGbwFYR5-L%#II+peZ>P4S2uVQ+nOnIL{ cXYy|IKUfLcF>GRA8$DUAO32d=0_9Z{q__oq-d_AVMrA?0hgdcf7(q$C;~HW{fe$ z7-Nhv#u#Ia`74U;B3w?pI501ZRj7`e7}s?jx~_{c#(BRC%x9ds{>i8y%ppn*Xqx6> z0L;PtYqg(`0ndUkxFcQ}K*JEHu75H#pl#bI7`uQw0OGNRIdW)_8j`yH$Ra zHAH&^3`2hE`X{4X9^$kqYOF^D;`_dj4Kj88AAxTgb6hE!2Czpk=5d)t6MO~Vwi>`S z6|QS+lKL#y;`K1R|299h!Q2gOdfX*{N1o>aBXu1=37e>XCfP*!bs03#`!N`kpIYBr p^fRgd2^6A&%3>YH<$wP_;|63SH5JInLQVhx002ovPDHLkV1h%dkre;{ diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2_cloth.png deleted file mode 100644 index ff5b69f061f7d37329a7e9e7e30dc3894a03edb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQZqeW978JRyuDz{)nXvfmiWG& z{rm*AsjW*qMb{h^QOvyJWqms`?Lh0=vfZu~@)Doqe=K_q)CL6)*cDj329831D zTRkNxMaEsaR5n@U{ocDf*Li2HHM?$g{_?%mwfC29O{@NOegEg$rHm#$ZM&H7Ha@T1 z## z=~5Fx5XaYN@Pl6z5JJKspj_b+p#;%z1abgD1q9#!6~_McOs``MNi0aR$W)~!vpcif z|Gv97Nji+mV$SW(47>XBxcfXi;;KtIS6&=*6`4zOuU)6}kA495=k~O_STE?@Sj)TX z%_(;-Gt4NCy>QbnpSPR`P5Xn4v(7O z&;pjY4_JW0gag^jeZ0Tr12r)bt}`FbhgsH~*?BXhGtc2V&tb zd$YfZ1YB(Qm`Q3rGd@kOF6R^+Oe`;q>2qLOwdg}9OyE6@kVy^(bu<8}4o)PsGd$~og0s|`c6+D+virH8`(FmdRFpEwU5b{fe5&Z9FzwTwUVxBR#79~;m7c?ic zc|;5(W=5+y+Se8gnt}PC1!zbQ$$yy92~a%#o64_wAZ66`FysMQ$o(x(L6a)|2&1TL zB{;S$c8i(kf4a*C7*+B*xAf}0g3Ln-`$a=iTF^x2+%tam zzMeBcUZUUuC16qs;HV$~CRi1SM39&iP7+@8W;O=?k0guzgkbKIHlsbH)2!QdqT{(Q z)g~ZBB8im3$_z?mBouQWCRm|`1^`|_B}WUR2|hupM`a?Kgl`b=iR@48I|R@2{fc2N z!Q=Of8KnPVu4w>2dHw)=fDqeC^G@u8Fn?}rWD^##a(oDSW_T;O!5<2#M1O;Xxi{~#!UQdWLkO}^gp@FY^VLF{lnk2w`;K3~3$rkP;Oa*J0000< KMNUMnLSTXrdQ&(6 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1_cloth.png deleted file mode 100644 index f6f353637dc192962a03416ab0d9ac64213be63c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440 zcmV;p0Z0CcP)misTb&ZdWBx5_$`@ctSq+lXK6cMGU;?# znwf9EPG?ss1L8P7%VNIo$59k%gCB-r;%9vZ%oK+;$h2{0vUBBnD0bVdREGf0NjZ%h#^Njc=Az7SxW0D+(wyz!;_a4+=r{kETsqsZ;^Kks+*mXAXcn8xDmrl*rfQe5gLV9xq!q`n^< z{n|7hNGJ#bZIC?1c#}lU4$a3s=F&mcU8vA zD8OvDA)ogeCc^nL3UEgHs|dqRRW5ew_g?@ApR~&|QL^K1U8Z`ScWOrdbhBb*(BG_J z7v8m>$Z)$VAGA!q?5&wy(f;QKWWMb;I$;EIynq!ne-f51K*ATf=<&v}_rIXf({C{m%_jnTXzG5rq_IB7Ll6>G~>0(7gZ= z{A|zPv`Tkh00^=45K+YNsW8%dC*nuV$MX{4eEQcEz@AL`sCxt7dYzQ)-p@uT_QS2J zO_P4RB8*ag@8#uTLrkRF2*Mxv8C%Y{>Z#?LXSZ> zM6(`~O&M${BkY+lX0LWU=X-Zz%HTMc^@R0u8s(juWyI~sGG%y{?G^GuOK5R3oh(=AJInHCW?57vWWjhegjp~ V$x@r4ei8rx002ovPDHLkV1i%hM~?si diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2_cloth.png deleted file mode 100644 index e80508fffcdf86fed995e24f32be713f42f45b58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQr?~}jv*Cu-d;P&$zaIAaNtXP zckhj+vnd~Ev$d46{h3|yz!Ip6fuX-+hwSA_gQctT(%!vosQdGZKVtpr`^g4#kI(pO fonTwe@aG!)g0Jdj(QOy&Kfu6dQbn@d9B|rOglu38epOXNbheh-8JC1o}>&J zxHqm|kDUN`dhgw;Apzjg{}%*6m;wm1@=kbwLDd)|l?~&`66d1t96vRTK97B!*3au_OQ>01QHq1V`YX*H`rN+-?13Bcn6( zQ+g+pc67bOUIX_)+>84YPW{0BkrM#Jkk`y_ggD0pLxa~BXY|+2jI#&ebLi&#HA42( zVe0H{_nxsIMiKQTfFwZR9ob7AcnjbW0rpOi`kYI_Gmr)FBnIF)mIS!jH8cW(G%O}} ze_`g51Vk405CD&qk|4d_IkFlM1|XVW4Zt!uuae^K=0x(e;9|Uxebypuw z8UozjCwniO!h#%#04cJ91ArefUJY~I2#8`+Yy>17a&d%c)HPxuV0resmNIGr-0Vr5 zfb86)UVC(7YzWxf?ww4%?1`O#H}g03hoz}V1O$0Un0c@Pze)W3xE9%-&;(FWz=D8D zQli*15CML|ZL&NhaX(?}$lny@J$_N7!F*=td{{}G0KCNfMzGlXjR3&EZN4%)KYlvp z-XHgP*1%kz73{+j_3fMwJ01!FJV*fmx4j_2ZSRlg)W=-Evx1%TZeu$=>>4qY2%tx$ zhrj1moHGC;g8CTS`tmeN{Ys^x2#nVxkM}MvE{x!sq z(>SDyIS{$%v#0*?@v%BPJ5%T9=Sq?x>kHShqao0)Gbm86d3Z65-VzaDgFz$!q>KP~ zh$-O)p86*zC+hU{)JU~jH6+yQb#q;-)yx=DDwWjH(UAgS<#JhJ9>lj{5iG_R@cQuZ zP!)?svmjnzw}XQN;|@&yn;zv~Uhy*;NcQA)@W%%0>&?h=_r1~?^ZOkDUgvKz# zb)ir&&+LY<1k;U1L$z8h)oeD67hp6&OV6^ZgUn8+W9HLCHVFhDCPE_{g#WPe9dr1twoN{*q6{M*fCboTKb zQ=t0c`J1ua#PIkV^iLFNQ(WRpfZKPKMapX&WG{}jtLj3Um Y0vaO5^E6doJyI2G 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 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1_cloth.png deleted file mode 100644 index f190b569366debeb26f4645bce7819170b4fd1d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 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 Dl10$k diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2.png b/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2.png deleted file mode 100644 index 37225d0ae48fb7e66c50a68dd6ba11c02d023cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQmvjYjv*Cu-d;J#+n~VX5P0mv zi<69dteb!P2L}uD3+Z$Os{GZ@G&r=-WT_%hIS4eUD{VS%)n8O|Jn?O*zy9)#K8G`X z|6Vq|mp}J^@;mDTwTu-^t+E%a&R>7RwO|d?l5_E*o7C*I9deaaix0nAcjxE*?sTWT lX?HB|AH7_BpK-5v0`r?C*6D@$N2Y^}_jL7hS?83{1ON#bNsRyi diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2_cloth.png deleted file mode 100644 index abf954a1fcaa273dc42e0b36df11b155956d55d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 568 zcmV-80>}M{P)$Kf&(|*5Cr_(8w_NQ}fHkLGNtgTWxL?P)LbB?d1)yg&R;_|eIX zi8nw@cv z6cvF4!uHIUm@yFmYZau$1f0F9VjuIznICb>AdF1Rj0lJfHnXYdnx2Hnb%dR~=&)#`KYd*xfYJpGHYknM|%xIhd0000 Date: Sun, 11 Jun 2017 02:19:54 +0700 Subject: [PATCH 027/101] Final fix --- .../armour/clothing/leatherapron_layer_1.png | Bin 0 -> 451 bytes .../clothing/leatherapron_layer_1_cloth.png | Bin 0 -> 449 bytes .../models/armour/leather/hide_layer_1.png | Bin 0 -> 897 bytes .../models/armour/leather/hide_layer_1_cloth.png | Bin 0 -> 382 bytes .../models/armour/leather/hide_layer_2.png | Bin 0 -> 343 bytes .../models/armour/leather/hide_layer_2_cloth.png | Bin 0 -> 210 bytes .../armour/leather/roughleather_layer_1.png | Bin 0 -> 1248 bytes .../leather/roughleather_layer_1_cloth.png | Bin 0 -> 440 bytes .../armour/leather/roughleather_layer_2.png | Bin 0 -> 687 bytes .../leather/roughleather_layer_2_cloth.png | Bin 0 -> 132 bytes .../armour/leather/scaleleather_layer_1.png | Bin 0 -> 1054 bytes .../leather/scaleleather_layer_1_cloth.png | Bin 0 -> 950 bytes .../armour/leather/scaleleather_layer_2.png | Bin 0 -> 530 bytes .../leather/scaleleather_layer_2_cloth.png | Bin 0 -> 568 bytes .../armour/leather/strongleather_layer_1.png | Bin 0 -> 1016 bytes .../leather/strongleather_layer_1_cloth.png | Bin 0 -> 950 bytes .../armour/leather/strongleather_layer_2.png | Bin 0 -> 665 bytes .../leather/strongleather_layer_2_cloth.png | Bin 0 -> 568 bytes .../armour/leather/studleather_layer_1.png | Bin 0 -> 1119 bytes .../armour/leather/studleather_layer_1_cloth.png | Bin 0 -> 950 bytes .../armour/leather/studleather_layer_2.png | Bin 0 -> 391 bytes .../armour/leather/studleather_layer_2_cloth.png | Bin 0 -> 568 bytes .../models/armour/padding/padded_layer_1.png | Bin 0 -> 344 bytes .../armour/padding/padded_layer_1_cloth.png | Bin 0 -> 981 bytes .../models/armour/padding/padded_layer_2.png | Bin 0 -> 190 bytes .../armour/padding/padded_layer_2_cloth.png | Bin 0 -> 568 bytes 26 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/scaleleather_layer_2_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/strongleather_layer_2_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_2_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_1.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_1_cloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2_cloth.png diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1.png b/src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef116f34a3772fed2e4fbd5d02b6144d65df141 GIT binary patch literal 451 zcmV;!0X+VRP)s1rU?e`f4*dBcXY^FL3K{xFA$g+&0C?Zt7sr-d?4k-0M z7`h_QbHWYLHuzif{X0~$hGCFpSR12{NF<&liRysv|K;=i@!IQ`0>HWzZjXZ?P-DbyuHAJy0Lfw@Wm(ecbP^)S z4!HGFlWgyN=q89NZyWe8GHOnD-Y+W(Kn`~?xP5k8i(p2YwF002ovPDHLkV1h#9*HZuh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/clothing/leatherapron_layer_1_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1b9d7ea9f31c1cf36141caed65ca99dd607ae4 GIT binary patch literal 449 zcmV;y0Y3hTP)_m14!SzZF*`@VeuvMi&bCg{M)&5}^6fC?yO_RFzJWt(YKWwZf zqXEEK1kV80oaSuzeSgh7R!js8D0tSkt+KJ2j0SMHgGZ0w=mE&qIF4G9<*XyyC<#^s z6a+hZ11kXKU_5}bES0lxIt;^2hh5jb!h*!nK>41_fB~JN2S5Sbuyh>8r%*=$u$@K$ z+_-cU;5d%TI09t_d@iBWDd7F}iQZlwh}W&(`?{ak=g0e5yYT?N`&F2G2W5a@p(gxY r=F<3+uZ#%*knNwIX9a*g=j|OIaEh4~TMI+m00000NkvXXu0mjfDIB}$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..635c6b5bf4be8553c8d08882ba951b17cc515c2f GIT binary patch literal 897 zcmV-{1AhF8P)Nkl# zJ#O1T5QUjrq{v?p2T-a6veTxB8udDW8UZeK0)c8=sWA}1wa%bI7f_=nRZ87ulSlXy zo))CIvS?CH1{j#+&hE^6Gdo<-Sym(8zkCd?%jGhx*XwZe`F(L;H~*3(gzzfX+DQN( zeEU=YM^gz%a?+AKnSdDld_FH!)gT*<$MZCf)5eiBBqvpXz@mVMfU})+B*_H)xVbv0 zg4JqOkf3eQh?9;aDK-I@iUa|d>RRCSw-G0oEZgliNZAH#37*TQtP*IDFP?y`zz{-GN^B-tEU_t2vs>8{#PhOsCUI0%HGFcE{F8B0yk&KRgu5Vdv3d7>~z=>RQh< z9@|$D;O7YlaRLT|L6GV?&R&)OQarZKNdy4aL6PCjW>YvG4u^&6S^+Q)cweK609PlV z-|q)$839%P%kcO*Nm8|^9gqU>pmYrZZda$r2uepCsdLLc~>1;L&lgZ>|RZtUh-Fv&= zY9gZRcv=^M){iie@Lv+}_3BNKvK6|HC(A1|)vnGSpi;m)30$imNYxv7-U>l-!nXke z)lt|%=~^}f%WINAH3s0^>{*ZX`8X3Fy!6aJ)A6?z0vwPU6o4EQ0W(g}5a8zrfasbm zmYq$suGVnUoP4#7Fe}(RUuj;$)mn0Q*XNDt<1I zeot_ec-869OJ0Cki_FI#UFBOgl)r#E0mno($pk0}HwKh973>(}85Q6J#7AN>%36#= zfS0aUfc&#Qpi{s*3AF;l?l9E>#E~KHs~QxiH-Urz0D1#M7mLMyk9Q&-AX)eFcPaZY z8h2(Y$}0c@|f^5G=$(1X~M15Ckg`{f7)U@FXK9xNms}E^#JKlKUpcERM62wr$0n z@;sN?TmIvLSzR6nz=i;rOj;iR-}k>C0MGO64nQ2oT9Z{(*%1Iznx-NQLwODJRs?`y z7=~e93@u-~uKQEp_o6IInGVAs>bf4^=}prJ2>B4r1A-tJ=K-`FhA=;%c>>*=Wtr5S z-Wi5rc0&Upgh35U;JIZmzQfYlbzLb8ma3-rWAKHpad84kl8lXCvM+#@Bi=TzH?E@V z4M&xY6oDq4QO_eG^V8tsb5Rsh_q6O}$k>v9`*Rzzn4KbxqG++P%|XBqfqKe=il^FC z_)4h$(<)Hs>?)=M4_z?m`iNsODrZj_monGbwFYR5-L%#II+peZ>P4S2uVQ+nOnIL{ cXYy|IKUfLcF>GRA8$DUAO32d=0_9Z{q__oq-d_AVMrA?0hgdcf7(q$C;~HW{fe$ z7-Nhv#u#Ia`74U;B3w?pI501ZRj7`e7}s?jx~_{c#(BRC%x9ds{>i8y%ppn*Xqx6> z0L;PtYqg(`0ndUkxFcQ}K*JEHu75H#pl#bI7`uQw0OGNRIdW)_8j`yH$Ra zHAH&^3`2hE`X{4X9^$kqYOF^D;`_dj4Kj88AAxTgb6hE!2Czpk=5d)t6MO~Vwi>`S z6|QS+lKL#y;`K1R|299h!Q2gOdfX*{N1o>aBXu1=37e>XCfP*!bs03#`!N`kpIYBr p^fRgd2^6A&%3>YH<$wP_;|63SH5JInLQVhx002ovPDHLkV1h%dkre;{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/hide_layer_2_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5b69f061f7d37329a7e9e7e30dc3894a03edb3 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQZqeW978JRyuDz{)nXvfmiWG& z{rm*AsjW*qMb{h^QOvyJWqms`?Lh0=vfZu~@)Doqe=K_q)CL6)*cDj329831D zTRkNxMaEsaR5n@U{ocDf*Li2HHM?$g{_?%mwfC29O{@NOegEg$rHm#$ZM&H7Ha@T1 z## z=~5Fx5XaYN@Pl6z5JJKspj_b+p#;%z1abgD1q9#!6~_McOs``MNi0aR$W)~!vpcif z|Gv97Nji+mV$SW(47>XBxcfXi;;KtIS6&=*6`4zOuU)6}kA495=k~O_STE?@Sj)TX z%_(;-Gt4NCy>QbnpSPR`P5Xn4v(7O z&;pjY4_JW0gag^jeZ0Tr12r)bt}`FbhgsH~*?BXhGtc2V&tb zd$YfZ1YB(Qm`Q3rGd@kOF6R^+Oe`;q>2qLOwdg}9OyE6@kVy^(bu<8}4o)PsGd$~og0s|`c6+D+virH8`(FmdRFpEwU5b{fe5&Z9FzwTwUVxBR#79~;m7c?ic zc|;5(W=5+y+Se8gnt}PC1!zbQ$$yy92~a%#o64_wAZ66`FysMQ$o(x(L6a)|2&1TL zB{;S$c8i(kf4a*C7*+B*xAf}0g3Ln-`$a=iTF^x2+%tam zzMeBcUZUUuC16qs;HV$~CRi1SM39&iP7+@8W;O=?k0guzgkbKIHlsbH)2!QdqT{(Q z)g~ZBB8im3$_z?mBouQWCRm|`1^`|_B}WUR2|hupM`a?Kgl`b=iR@48I|R@2{fc2N z!Q=Of8KnPVu4w>2dHw)=fDqeC^G@u8Fn?}rWD^##a(oDSW_T;O!5<2#M1O;Xxi{~#!UQdWLkO}^gp@FY^VLF{lnk2w`;K3~3$rkP;Oa*J0000< KMNUMnLSTXrdQ&(6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_1_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..f6f353637dc192962a03416ab0d9ac64213be63c GIT binary patch literal 440 zcmV;p0Z0CcP)misTb&ZdWBx5_$`@ctSq+lXK6cMGU;?# znwf9EPG?ss1L8P7%VNIo$59k%gCB-r;%9vZ%oK+;$h2{0vUBBnD0bVdREGf0NjZ%h#^Njc=Az7SxW0D+(wyz!;_a4+=r{kETsqsZ;^Kks+*mXAXcn8xDmrl*rfQe5gLV9xq!q`n^< z{n|7hNGJ#bZIC?1c#}lU4$a3s=F&mcU8vA zD8OvDA)ogeCc^nL3UEgHs|dqRRW5ew_g?@ApR~&|QL^K1U8Z`ScWOrdbhBb*(BG_J z7v8m>$Z)$VAGA!q?5&wy(f;QKWWMb;I$;EIynq!ne-f51K*ATf=<&v}_rIXf({C{m%_jnTXzG5rq_IB7Ll6>G~>0(7gZ= z{A|zPv`Tkh00^=45K+YNsW8%dC*nuV$MX{4eEQcEz@AL`sCxt7dYzQ)-p@uT_QS2J zO_P4RB8*ag@8#uTLrkRF2*Mxv8C%Y{>Z#?LXSZ> zM6(`~O&M${BkY+lX0LWU=X-Zz%HTMc^@R0u8s(juWyI~sGG%y{?G^GuOK5R3oh(=AJInHCW?57vWWjhegjp~ V$x@r4ei8rx002ovPDHLkV1i%hM~?si literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/roughleather_layer_2_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..e80508fffcdf86fed995e24f32be713f42f45b58 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQr?~}jv*Cu-d;P&$zaIAaNtXP zckhj+vnd~Ev$d46{h3|yz!Ip6fuX-+hwSA_gQctT(%!vosQdGZKVtpr`^g4#kI(pO fonTwe@aG!)g0Jdj(QOy&Kfu6dQbn@d9B|rOglu38epOXNbheh-8JC1o}>&J zxHqm|kDUN`dhgw;Apzjg{}%*6m;wm1@=kbwLDd)|l?~&`66d1t96vRTK97B!*3au_OQ>01QHq1V`YX*H`rN+-?13Bcn6( zQ+g+pc67bOUIX_)+>84YPW{0BkrM#Jkk`y_ggD0pLxa~BXY|+2jI#&ebLi&#HA42( zVe0H{_nxsIMiKQTfFwZR9ob7AcnjbW0rpOi`kYI_Gmr)FBnIF)mIS!jH8cW(G%O}} ze_`g51Vk405CD&qk|4d_IkFlM1|XVW4Zt!uuae^K=0x(e;9|Uxebypuw z8UozjCwniO!h#%#04cJ91ArefUJY~I2#8`+Yy>17a&d%c)HPxuV0resmNIGr-0Vr5 zfb86)UVC(7YzWxf?ww4%?1`O#H}g03hoz}V1O$0Un0c@Pze)W3xE9%-&;(FWz=D8D zQli*15CML|ZL&NhaX(?}$lny@J$_N7!F*=td{{}G0KCNfMzGlXjR3&EZN4%)KYlvp z-XHgP*1%kz73{+j_3fMwJ01!FJV*fmx4j_2ZSRlg)W=-Evx1%TZeu$=>>4qY2%tx$ zhrj1moHGC;g8CTS`tmeN{Ys^x2#nVxkM}MvE{x!sq z(>SDyIS{$%v#0*?@v%BPJ5%T9=Sq?x>kHShqao0)Gbm86d3Z65-VzaDgFz$!q>KP~ zh$-O)p86*zC+hU{)JU~jH6+yQb#q;-)yx=DDwWjH(UAgS<#JhJ9>lj{5iG_R@cQuZ zP!)?svmjnzw}XQN;|@&yn;zv~Uhy*;NcQA)@W%%0>&?h=_r1~?^ZOkDUgvKz# zb)ir&&+LY<1k;U1L$z8h)oeD67hp6&OV6^ZgUn8+W9HLCHVFhDCPE_{g#WPe9dr1twoN{*q6{M*fCboTKb zQ=t0c`J1ua#PIkV^iLFNQ(WRpfZKPKMapX&WG{}jtLj3Um Y0vaO5^E6doJyI2G zwFhN592V_%yBG`xMZe!K#^Z5nk4B?{xkvlozRYH`;&QnZtJNxfPp4CA^978m>C0Xs z0O#{LRoYavplbTEmk7Y|cubY{cDpSajmFOh0DG6|!{JcucDvNx@AseK1GIhZULU~N zM*x5cX!mFURe!KtE`L4%czPsF#pz-9T!-{~z25r+(CKv2z3x3folevB2D9`XgW<_! zlG@C%2JK+X%AD_(d)%0040BFE1^8$d+sG9#8 zOzP!Zt=3&;pREF?v-G#o0{jQeFBXdg+DF6@7Jva1Z;q|m1wQ#wle zG0cTH0v{chA-4$^eKjqH&w^l>Zfs$nb?*1f*e~VD4kCOfpdE7yUXvx*&=;wgH>l38 z=Ql{EA_GX+`~nG^e8t~${;P~mgiC-7ql$#Yv||>D6a_#PkBJy_MvZuSwMT|w z%A|{S1km}|&klepYWl1S`hZFmAg@yyGAeWpRS(aY?-7hK$L~kLwR3@6uh)M73V_)G z;1H#zLy~dd24Z>)1B}BIYf)?85!8YxaX~Y`(AgPQ3yKdc`VjU#&aDC20e~q9RI*A#iN+@^pSbkm zYK-wYfG`I`5d`)NaEu8Q0PEBgzR*)jq~}{-yv86@b)+3tR*5lxPemDzCg3yLJsJc8 z@G!MfQ|4%s5UWiar~nRaA3^aA{!R8b71c4RC8aR)FU1E=UwET4R8_66L0b1h*moEka%MYt4PxDaBJ}qSVDld4IRtmDgZ&Jd??YcDpSXI3@z|PNySErIMqKVnVQHwbi@BkldGQ zvk(Q*5Cd`9Y*u~>ilgJXTu#129*TsbVOqeQY|`AP*(!GYk398>IoT+j;&Zq=+3ZCA z%Xq%q`liCPQJtH+8J{KJZGBULE~QSkDS5m#8fl$lVXXg(>-=nIU4Hj^{(qnU2W}M{P)$Kf&(|*5Cr_(8w_NQ}fHkLGNtgTWxL?P)LbB?d1)yg&R;_|eIX zi8nw@cv z6cvF4!uHIUm@yFmYZau$1f0F9VjuIznICb>AdF1Rj0lJfHnXYdnx2Hnb%dR~=&)#`KYd*xfYJpGHYknM|%xIhd0000# z&ubGw6vxLuL{KZVRYVYq;=xw&AYMEu#e*m7j~37V7d;k24<+Of2&IP{LNBF+97+j= zl0(QL|IC=r=vQ8s-Ry3%n+>|~*x8x)X5RPv-kY6loSR(U`&$y1aDCXg=ifcK;kB=q&Soo*beeAZ|T-Px2`*$hioxlJpkH zJFoVTxV6$8E{%Y)ci}v#x|9TbdVb$qshWT|e@Z7{XLHqmf4RO80*dgba02)S@bm5C z(h11oTV8((Awa?gRu%zSWfp(tA|OppPEMST%KDL{^MrKl*1Y7Ax=aqi6=JQJF z1mGy?NL>QXp8cg`&;ID3i;exQK>O(E$Tb>`K&bSiH6MLOe>@%s!9H$}D3t&f0nFv) zWjOLm0CjkH=#Gz%odAjebXCLp(!~Ax`r3^~qmUI4pbW4zuV>Pq3~IOA0sLSvaC(+c z3nKuh5!wL8A%N=OBhal@%SH8Z7-Fy)4u=6qzu$NI%>gI@w{7&*rwmXzYD{}X=>!0d zw4<#k14Ke(Rr^X&Y(xM$lmdG6qemal-%NT?Rfc=CvaO5^E6doJyI2G zwFhN592V_%yBG`xMZe!K#^Z5nk4B?{xkvlozRYH`;&QnZtJNxfPp4CA^978m>C0Xs z0O#{LRoYavplbTEmk7Y|cubY{cDpSajmFOh0DG6|!{JcucDvNx@AseK1GIhZULU~N zM*x5cX!mFURe!KtE`L4%czPsF#pz-9T!-{~z25r+(CKv2z3x3folevB2D9`XgW<_! zlG@C%2JK+X%AD_(d)%0040BFE1^8$d+sG9#8 zOzP!Zt=3&;pREF?v-G#o0{jQeFBXdg+DF6@7Jva1Z;q|m1wQ#wle zG0cTH0v{chA-4$^eKjqH&w^l>Zfs$nb?*1f*e~VD4kCOfpdE7yUXvx*&=;wgH>l38 z=Ql{EA_GX+`~nG^e8t~${;P~mgiC-7ql$#Yv||>D6a_#PkBJy_MvZuSwMT|w z%A|{S1km}|&klepYWl1S`hZFmAg@yyGAeWpRS(aY?-7hK$L~kLwR3@6uh)M73V_)G z;1H#zLy~dd24Z>)1B}BIYf)?85!8YxaX~Y`(AgPQ3yKdc`VjU#&aDC20e~q9RI*A#iN+@^pSbkm zYK-wYfG`I`5d`)NaEu8Q0PEBgzR*)jq~}{-yv86@b)+3tR*5lxPemDzCg3yLJsJc8 z@G!MfQ|4%s5UWiar~nRaA3^aA{!R8b71c4RC8aR)FU1E=UwET4R8_66L0b1h*mo3G#6ose1qtqtGG${!U=||e8v`qpnloC=yNN58gC27fzaVdz1hzmi)g$r>bE?kI+ zATGp(e`exylN-$RVofg9uA z)1Bg82$0X`O|e)s<#O3ntJPa;_dvsU+1flczq2gIDu5{9?`?Z-(sddcYz8zmVtG^#t;Djk&4Ew?6rcou~HK*0SAy zIVU2t+iim&j3IpTZc*aPvqzSE1gqEUCY#NgsjrByYXKqm^ZgScrxk%9j9pJ4AHlR@ zre1)*oiGFugz>-fwPL1T0JjCSB8W^T^M^qAz+lCUd;dcNlWVnFhQ80`ayNu^%zCrg z6cbFPQYMi|NUjPp?)?u9t~)+@2;83FnUjvk<0hR>3t>C}5p>LYG#VZE_J;?g)a3N; zZ!{W0kQ0wYBBoZWNie1&Sl3$sBcyfqo7HUT+rK<@4&*+F*Y8+IYXe zS+GCehQwTtUI%54ypan4DM&*Ga-1rquVYR;7K_Ood5DB)R0?A@sivuf8EfDzzqgm| z`Nt)DxDm8&zIu@R4uJ?G7hqT}M{P)$Kf&(|*5Cr_(8w_NQ}fHkLGNtgTWxL?P)LbB?d1)yg&R;_|eIX zi8nw@cv z6cvF4!uHIUm@yFmYZau$1f0F9VjuIznICb>AdF1Rj0lJfHnXYdnx2Hnb%dR~=&)#`KYd*xfYJpGHYknM|%xIhd000025SnVFlnyYv0bn>TMyDRXJ9?{QI{t5hoKk&zMY);?SJ zdF?1s?+%+|?8&}<+N~gVV`D?t>vgJ^mX-(t#?lsW*DF;3Y-7Y)2rS<86M<|OfTUVu z0l-Q_G{o0xHFE#AqdosW0Nw)2&mWQpKs6&CM13X^VuTmnEe4?E{M`bUgYE)bO` zw7S3J09YjNZ$9h!s6)-iA5WU?q)3?~AXrK`?z81-(s2MRk|Vqn$8fm6GGA0H#a;_V zij=|_7Q>OxmNt3vfF=k+e3N@4@VPO8ALQOIg+*)0ku~0aVBPv@D$l;EOex1E?*G>u)oI zZ2{1#@R3`sR_$q%Ie^COkpA&zDsupF<_6Ia&v{5&0B}J7%nCr<;^q^X187yklAOxu zBRcQjkM-I=RHD8M;yyQNojCx`?|t6_>r(^j`|OZSmD#3Jspv+dLABh^$UFGY7wP6~ zhtUS5O|oxaarJ_0VG(_u+TBwK4^O)mob> zkN~sqX(d@O#4ij#p!S!^emf3ZOcH%S!npAks*QMpfIi0D_qoDZFxS$KgLb9>AOaHy z1c*bQR?~=|f6_&s0P(QlaoEZ}Ry=^90toaBjNf&BEdd-KAFHFIBXxLqNHw>&x3|^K z&W_sK+fxSz2kP|nRGplhC_|R|TU%RbYv}=Kqd+u-)FvLAmFd#FqCCzXAo~n~Jpg^c z$s7O#;l(#MHv|LX(LOsnQ@gvnYIAdw`V_DN@#vqQpR4`-eH?LiCDCRN_*m@GbA$I0 z)S6b*XAd|W1KREZ5Q%?sFD@?Z%1W{D0Kk9^-~bW>LEjS-6tC*%iGIB}d>h~bvDO~X z<`}~6AFRCMn9vpgcqzo2T%WuF1tKpmFKyqrxVpN!B3o>O>+5S82ONF-J#U3UB*X*( zjuRmg2spmU1s>6qIN_c&VpOax& l08P1m(!LKs)Ri{?e*hK>RvzF>tONi6002ovPDHLkV1k!U1;PLT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/leather/studleather_layer_1_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..f190b569366debeb26f4645bce7819170b4fd1d0 GIT binary patch literal 950 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 Dl10$k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2.png b/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..37225d0ae48fb7e66c50a68dd6ba11c02d023cb4 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQmvjYjv*Cu-d;J#+n~VX5P0mv zi<69dteb!P2L}uD3+Z$Os{GZ@G&r=-WT_%hIS4eUD{VS%)n8O|Jn?O*zy9)#K8G`X z|6Vq|mp}J^@;mDTwTu-^t+E%a&R>7RwO|d?l5_E*o7C*I9deaaix0nAcjxE*?sTWT lX?HB|AH7_BpK-5v0`r?C*6D@$N2Y^}_jL7hS?83{1ON#bNsRyi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2_cloth.png b/src/main/resources/assets/minefantasy2/textures/models/armour/padding/padded_layer_2_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..abf954a1fcaa273dc42e0b36df11b155956d55d6 GIT binary patch literal 568 zcmV-80>}M{P)$Kf&(|*5Cr_(8w_NQ}fHkLGNtgTWxL?P)LbB?d1)yg&R;_|eIX zi8nw@cv z6cvF4!uHIUm@yFmYZau$1f0F9VjuIznICb>AdF1Rj0lJfHnXYdnx2Hnb%dR~=&)#`KYd*xfYJpGHYknM|%xIhd0000 Date: Sun, 11 Jun 2017 19:25:30 +0700 Subject: [PATCH 028/101] NEI refactoring --- .../mf2/integration/nei/NEIConfig.java | 55 +++++++++++++++++++ .../mf2/integration/nei/NEIPlugin.java | 49 ----------------- .../mf2/network/ClientProxyMF.java | 6 +- 3 files changed, 56 insertions(+), 54 deletions(-) create mode 100644 src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java delete mode 100644 src/main/java/minefantasy/mf2/integration/nei/NEIPlugin.java diff --git a/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java b/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java new file mode 100644 index 00000000..c48ef87d --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java @@ -0,0 +1,55 @@ +package minefantasy.mf2.integration.nei; + +import codechicken.nei.api.API; +import codechicken.nei.api.IConfigureNEI; +import cpw.mods.fml.common.Optional; +import minefantasy.mf2.MineFantasyII; + +@Optional.Interface(iface = "codechicken.nei.api.IConfigureNEI", modid = "NotEnoughItems") +public class NEIConfig implements IConfigureNEI { + + @Override + public String getName() { + return MineFantasyII.NAME + " NEI Plugin"; + } + + @Override + public String getVersion() { + return MineFantasyII.VERSION; + } + + @Override + public void loadConfig() { + RecipeHandlerCarpenter handlerCarpenter = new RecipeHandlerCarpenter(); + API.registerRecipeHandler(handlerCarpenter); + API.registerUsageHandler(handlerCarpenter); + + RecipeHandlerAnvil handlerAnvil = new RecipeHandlerAnvil(); + API.registerRecipeHandler(handlerAnvil); + API.registerUsageHandler(handlerAnvil); + + RecipeHandlerBloom handlerBloom = new RecipeHandlerBloom(); + API.registerRecipeHandler(handlerBloom); + API.registerUsageHandler(handlerBloom); + + RecipeHandlerQuern handlerQuern = new RecipeHandlerQuern(); + API.registerRecipeHandler(handlerQuern); + API.registerUsageHandler(handlerQuern); + + RecipeHandlerTanning handlerTanning = new RecipeHandlerTanning(); + API.registerRecipeHandler(handlerTanning); + API.registerUsageHandler(handlerTanning); + + RecipeHandlerCrucible handlerCrucible = new RecipeHandlerCrucible(); + API.registerRecipeHandler(handlerCrucible); + API.registerUsageHandler(handlerCrucible); + + RecipeHandlerBigFurnace handlerBigFurnace = new RecipeHandlerBigFurnace(); + API.registerRecipeHandler(handlerBigFurnace); + API.registerUsageHandler(handlerBigFurnace); + + RecipeHandlerBlastFurnace handlerBlastFurnace = new RecipeHandlerBlastFurnace(); + API.registerRecipeHandler(handlerBlastFurnace); + API.registerUsageHandler(handlerBlastFurnace); + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/NEIPlugin.java b/src/main/java/minefantasy/mf2/integration/nei/NEIPlugin.java deleted file mode 100644 index 94e5a4c8..00000000 --- a/src/main/java/minefantasy/mf2/integration/nei/NEIPlugin.java +++ /dev/null @@ -1,49 +0,0 @@ -package minefantasy.mf2.integration.nei; - -import codechicken.nei.api.API; -import codechicken.nei.api.IConfigureNEI; -import minefantasy.mf2.MineFantasyII; - -public class NEIPlugin implements IConfigureNEI { - - public NEIPlugin() { - this.loadConfig(); - } - - @Override - public String getName() { - return MineFantasyII.NAME + " NEI Plugin"; - } - - @Override - public String getVersion() { - return MineFantasyII.VERSION; - } - - @Override - public void loadConfig() { - API.registerRecipeHandler(new RecipeHandlerCarpenter()); - API.registerUsageHandler(new RecipeHandlerCarpenter()); - - API.registerRecipeHandler(new RecipeHandlerAnvil()); - API.registerUsageHandler(new RecipeHandlerAnvil()); - - API.registerRecipeHandler(new RecipeHandlerBloom()); - API.registerUsageHandler(new RecipeHandlerBloom()); - - API.registerRecipeHandler(new RecipeHandlerQuern()); - API.registerUsageHandler(new RecipeHandlerQuern()); - - API.registerRecipeHandler(new RecipeHandlerTanning()); - API.registerUsageHandler(new RecipeHandlerTanning()); - - API.registerRecipeHandler(new RecipeHandlerCrucible()); - API.registerUsageHandler(new RecipeHandlerCrucible()); - - API.registerRecipeHandler(new RecipeHandlerBigFurnace()); - API.registerUsageHandler(new RecipeHandlerBigFurnace()); - - API.registerRecipeHandler(new RecipeHandlerBlastFurnace()); - API.registerUsageHandler(new RecipeHandlerBlastFurnace()); - } -} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java index 7ae7a3ed..a78c573a 100644 --- a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java @@ -120,7 +120,7 @@ import minefantasy.mf2.entity.mob.EntityDragon; import minefantasy.mf2.entity.mob.EntityHound; import minefantasy.mf2.entity.mob.EntityMinotaur; -import minefantasy.mf2.integration.nei.NEIPlugin; +import minefantasy.mf2.integration.nei.NEIConfig; import minefantasy.mf2.item.list.CustomToolListMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.item.list.styles.DragonforgedStyle; @@ -152,10 +152,6 @@ public void preInit() { @Override public void registerMain() { super.registerMain(); - - if (Loader.isModLoaded("NotEnoughItems")) { - NEIModContainer.plugins.add(new NEIPlugin()); - } } @Override From c8810f66e0a8d2c799b686f456b52fe4f154c9b9 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 11 Jun 2017 19:38:09 +0700 Subject: [PATCH 029/101] Prepare for minetweaker --- build.gradle | 6 ++++++ .../minefantasy/mf2/integration/minetweaker/MTCompat.java | 5 +++++ 2 files changed, 11 insertions(+) create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java diff --git a/build.gradle b/build.gradle index 5a769d24..780d76bf 100644 --- a/build.gradle +++ b/build.gradle @@ -32,6 +32,11 @@ repositories { url = "http://chickenbones.net/maven/" } + ivy { + name "MineTweaker3" + artifactPattern "http://minetweaker3.powerofbytes.com/download/[module]-[revision].[ext]" + } + flatDir { dirs 'lib' } @@ -39,6 +44,7 @@ repositories { dependencies { compile name: 'bukkit-1.7.10' + compile name: 'MineTweaker3', version: "Dev-1.7.10-3.0.10B", ext: 'jar' compile "codechicken:CodeChickenLib:1.7.10-1.1.3.140:dev" compile "codechicken:CodeChickenCore:1.7.10-1.0.7.47:dev" compile "codechicken:NotEnoughItems:1.7.10-1.0.5.120:dev" diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java new file mode 100644 index 00000000..cfcc0c53 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -0,0 +1,5 @@ +package minefantasy.mf2.integration.minetweaker; + +public class MTCompat { + +} From 8b0af3abbbf047201323e2d8cd4c4d9796d09c33 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 11 Jun 2017 19:43:26 +0700 Subject: [PATCH 030/101] Create README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f830dd1f..65565614 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -# MineFantasy2 (2.6.10+) -Try keep it neat \ No newline at end of file +# MineFantasy2 Unofficial + +Unofficial MineFantasy 2 fork aimed for cross-mod integration, bug fixes, stability and perfomance tweaks. From 17e5d5c5a00a8ca6bef80bc94549b286b5b0755e Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 11 Jun 2017 19:44:42 +0700 Subject: [PATCH 031/101] Create README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 65565614..4b7370e5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ # MineFantasy2 Unofficial Unofficial MineFantasy 2 fork aimed for cross-mod integration, bug fixes, stability and perfomance tweaks. + +Downloads are avaliable on Releases page From d57c116f0e3f0daf65dd8316ce1e678c33cd2294 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 11 Jun 2017 22:47:18 +0700 Subject: [PATCH 032/101] Minetweaker support Only bloomery are supported now --- .gitignore | 4 +- .../java/minefantasy/mf2/MineFantasyII.java | 6 ++ .../integration/minetweaker/BloomTweaker.java | 62 +++++++++++++++++++ .../mf2/integration/minetweaker/MTCompat.java | 9 +++ 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/BloomTweaker.java diff --git a/.gitignore b/.gitignore index 358a3dbe..1fb10f8b 100644 --- a/.gitignore +++ b/.gitignore @@ -71,4 +71,6 @@ options.txt usercache.json usernamecache.json logs/ -crash-reports/ \ No newline at end of file +crash-reports/ +scripts/ +*.log \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 1b486546..c0e0ab69 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -3,6 +3,7 @@ import java.io.File; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; @@ -32,6 +33,7 @@ import minefantasy.mf2.config.ConfigTools; import minefantasy.mf2.config.ConfigWeapon; import minefantasy.mf2.config.ConfigWorldGen; +import minefantasy.mf2.integration.minetweaker.MTCompat; import minefantasy.mf2.item.gadget.ItemLootSack; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.ToolListMF; @@ -115,6 +117,10 @@ public void load(FMLInitializationEvent evt) { eventChannel.register(packetHandler); packetHandler.channels.put(channel, eventChannel); } + + if(Loader.isModLoaded("MineTweaker3")) { + MTCompat.loadTweakers(); + } } @EventHandler diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/BloomTweaker.java b/src/main/java/minefantasy/mf2/integration/minetweaker/BloomTweaker.java new file mode 100644 index 00000000..9b53521b --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/BloomTweaker.java @@ -0,0 +1,62 @@ +package minefantasy.mf2.integration.minetweaker; + +import minefantasy.mf2.api.crafting.refine.BloomRecipe; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.minefantasy.Bloomery") +public class BloomTweaker { + + @ZenMethod + public static void addRecipe(IItemStack input, IItemStack output) { + MineTweakerAPI.apply(new AddBloomRecipe(input, output)); + } + + public static class AddBloomRecipe implements IUndoableAction { + + private ItemStack input; + private ItemStack output; + + public AddBloomRecipe(IItemStack input, IItemStack output) { + this.input = MineTweakerMC.getItemStack(input); + this.output = MineTweakerMC.getItemStack(output); + } + + @Override + public void apply() { + BloomRecipe.addRecipe(input, output); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public String describe() { + return String.format("Adding recipe %s -> %s * %d to Bloomery", input.getDisplayName(), + output.getDisplayName(), output.stackSize); + } + + @Override + public String describeUndo() { + return String.format("Removing recipe %s -> %s * %d from Bloomery", input.getDisplayName(), + output.getDisplayName(), output.stackSize); + } + + @Override + public Object getOverrideKey() { + return null; + } + + @Override + public void undo() { + BloomRecipe.recipeList.remove(input, output); + } + } +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java index cfcc0c53..fba7e77c 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -1,5 +1,14 @@ package minefantasy.mf2.integration.minetweaker; +import minetweaker.MineTweakerAPI; + public class MTCompat { + private static final Class[] tweakers = { /*QuernTweaker.class,*/ BloomTweaker.class }; + + public static void loadTweakers() { + for (Class tweaker : tweakers) { + MineTweakerAPI.registerClass(tweaker); + } + } } From 0c6a02ed19571777f5ccfc1b2854a1f437a86b3e Mon Sep 17 00:00:00 2001 From: Sirse Date: Mon, 12 Jun 2017 00:34:39 +0700 Subject: [PATCH 033/101] Refined Iron > Pig Iron --- .../java/minefantasy/mf2/client/KnowledgePageRegistry.java | 2 +- src/main/java/minefantasy/mf2/item/list/ComponentListMF.java | 5 ----- src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java | 2 +- src/main/java/minefantasy/mf2/material/MetalMaterial.java | 2 +- src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java | 2 +- src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java | 4 ++-- src/main/resources/assets/minefantasy2/lang/en_US.lang | 2 +- src/main/resources/assets/minefantasy2/lang/ru_RU.lang | 2 +- src/main/resources/assets/minefantasy2/lang/zh_CN.lang | 2 +- 9 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java b/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java index dc6df54a..80fc9682 100644 --- a/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java +++ b/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java @@ -23,7 +23,7 @@ public class KnowledgePageRegistry { public static void registerPages() { - ItemStack pigiron = ComponentListMF.bar("RefinedIron"); + ItemStack pigiron = ComponentListMF.bar("PigIron"); ItemStack black = ComponentListMF.bar("BlackSteel"); ItemStack red = ComponentListMF.bar("RedSteel"); ItemStack blue = ComponentListMF.bar("BlueSteel"); diff --git a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java index 51a5a2b4..c8523153 100644 --- a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java @@ -208,11 +208,6 @@ public static void load() ingots[a] = new ItemComponentMF("ingot"+name, rarity); OreDictionary.registerOre("ingot"+name, ingots[a]); - - if(name.equalsIgnoreCase("PigIron")) - { - OreDictionary.registerOre("ingotRefinedIron", ingots[a]); - } } addRandomDrops(); diff --git a/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java b/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java index 5f960934..95dd28c1 100644 --- a/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java +++ b/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java @@ -106,7 +106,7 @@ private static void addArtisanry() add(KnowledgeListMF.crucible2, ComponentListMF.fireclay); add(KnowledgeListMF.blastfurn, Items.iron_ingot, Blocks.iron_ore, Blocks.furnace, BlockListMF.bloomery, BlockListMF.limestone, ComponentListMF.kaolinite); add(KnowledgeListMF.bigfurn, Items.iron_ingot, Blocks.furnace, BlockListMF.bloomery, ComponentListMF.kaolinite, Items.coal); - for(ItemStack pig: OreDictionary.getOres("ingotRefinedIron")) + for(ItemStack pig: OreDictionary.getOres("ingotPigIron")) { add(KnowledgeListMF.smeltSteel, pig); } diff --git a/src/main/java/minefantasy/mf2/material/MetalMaterial.java b/src/main/java/minefantasy/mf2/material/MetalMaterial.java index 412cd248..13c72158 100644 --- a/src/main/java/minefantasy/mf2/material/MetalMaterial.java +++ b/src/main/java/minefantasy/mf2/material/MetalMaterial.java @@ -63,7 +63,7 @@ public static void init() //Standard Mats Name T Dur Flx Shp Rst Wg getOrAddMetal("Bronze", 1, 1.5F, 1.0F, 1.5F, 20F, 3.0F, 207, 165, 118).setCrafterTiers(1).setMeltingPoint(1200); getOrAddMetal("Iron", 2, 2.0F, 1.0F, 2.0F, 20F, 2.5F, 140, 120, 100).setCrafterTiers(2).setMeltingPoint(1200).setArmourStats(1.0F, 1.0F, 1.0F);//Standard - getOrAddMetal("RefinedIron", 2, 2.0F, 0.8F, 2.0F, 20F, 2.5F, 120, 95, 95).setCrafterTiers(2).setMeltingPoint(1200).setArmourStats(1.1F, 0.8F, 1.1F);//Less Blunt for more cutting/piercing + getOrAddMetal("PigIron", 2, 2.0F, 0.8F, 2.0F, 20F, 2.5F, 120, 95, 95).setCrafterTiers(2).setMeltingPoint(1200).setArmourStats(1.1F, 0.8F, 1.1F);//Less Blunt for more cutting/piercing getOrAddMetal("Steel", 3, 3.0F, 1.0F, 2.5F, 30F, 2.5F, 168, 168, 168).setCrafterTiers(3).setMeltingPoint(1500); getOrAddMetal("Encrusted", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 64, 255, 255).setCrafterTiers(3).setMeltingPoint(1800).setArmourStats(1.0F, 1.0F, 1.2F);//Better Piercing getOrAddMetal("Obsidian", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 90 , 45 , 90).setCrafterTiers(3).setMeltingPoint(2000).setArmourStats(1.0F, 1.3F, 1.0F);//Better Blunt diff --git a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java index 8870a401..516654e4 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java @@ -77,7 +77,7 @@ public static void init() "C", "H", 'C', ComponentListMF.coalDust, - 'H', ComponentListMF.bar("RefinedIron") + 'H', ComponentListMF.bar("PigIron") }); KnowledgeListMF.fluxR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ComponentListMF.flux, 4), "", false, -1, -1, 2, new Object[] diff --git a/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java b/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java index 34e0af83..cedeb736 100644 --- a/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java +++ b/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java @@ -27,7 +27,7 @@ public static void init() ItemStack tin = ComponentListMF.bar("Tin"); ItemStack bronze = ComponentListMF.bar("Bronze"); ItemStack iron = ComponentListMF.bar("Iron"); - ItemStack pigiron = ComponentListMF.bar("RefinedIron"); + ItemStack pigiron = ComponentListMF.bar("PigIron"); ItemStack steel = ComponentListMF.bar("Steel"); ItemStack diamond = ComponentListMF.bar("Encrusted"); ItemStack tungsten = ComponentListMF.bar("Tungsten"); @@ -158,7 +158,7 @@ steel, silver, new ItemStack(Items.dye, 1, 4), ComponentListMF.flux_strong, Item adamant, mithril, Items.ender_pearl, Items.ender_pearl }); - MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.iron_prep, ComponentListMF.bar("RefinedIron")); + MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.iron_prep, ComponentListMF.bar("PigIron")); MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[6], black); MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[9], red); MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[11], blue); diff --git a/src/main/resources/assets/minefantasy2/lang/en_US.lang b/src/main/resources/assets/minefantasy2/lang/en_US.lang index 8ee525c1..3b4ad0b3 100644 --- a/src/main/resources/assets/minefantasy2/lang/en_US.lang +++ b/src/main/resources/assets/minefantasy2/lang/en_US.lang @@ -207,7 +207,7 @@ material.tin.name=Tin material.bronze.name=Bronze material.iron.name=Iron -material.refinediron.name=Pig Iron +material.pigiron.name=Pig Iron material.steel.name=Steel material.tungsten.name=Wolframite material.obsidian.name=Obsidian diff --git a/src/main/resources/assets/minefantasy2/lang/ru_RU.lang b/src/main/resources/assets/minefantasy2/lang/ru_RU.lang index 0bfd211f..ff5f0100 100644 --- a/src/main/resources/assets/minefantasy2/lang/ru_RU.lang +++ b/src/main/resources/assets/minefantasy2/lang/ru_RU.lang @@ -213,7 +213,7 @@ material.tin.name=Олово material.bronze.name=Бронза material.iron.name=Железо -material.refinediron.name=Чугун +material.pigiron.name=Чугун material.steel.name=Сталь material.tungsten.name=Вольфрам material.obsidian.name=Обсидиан diff --git a/src/main/resources/assets/minefantasy2/lang/zh_CN.lang b/src/main/resources/assets/minefantasy2/lang/zh_CN.lang index 83f9dd66..3a917241 100644 --- a/src/main/resources/assets/minefantasy2/lang/zh_CN.lang +++ b/src/main/resources/assets/minefantasy2/lang/zh_CN.lang @@ -206,7 +206,7 @@ material.tin.name=锡 material.bronze.name=青铜 material.iron.name=铁 -material.refinediron.name=精铁 +material.pigiron.name=精铁 material.steel.name=钢 material.tungsten.name=黑钨 material.obsidian.name=黑曜石钢 From 00299cea2731b4c16d4dd0c832249efc82b1906f Mon Sep 17 00:00:00 2001 From: Sirse Date: Mon, 12 Jun 2017 01:07:31 +0700 Subject: [PATCH 034/101] Automatically convert old material NBT data --- .../java/minefantasy/mf2/api/material/CustomMaterial.java | 3 +++ .../java/minefantasy/mf2/item/list/ComponentListMF.java | 6 +----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java b/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java index 12709f37..a21f3f62 100644 --- a/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java +++ b/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java @@ -143,6 +143,9 @@ public static CustomMaterial getMaterialFor(ItemStack item, String slot) { if(nbt.hasKey(slot)) { + if(nbt.getString(slot).equalsIgnoreCase("refinediron")) { //fix old namings, it can be removed later + nbt.setString(slot, "pigiron"); + } return getMaterial(nbt.getString(slot)); } } diff --git a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java index c8523153..5ec45504 100644 --- a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java @@ -280,11 +280,7 @@ public static ItemStack bar(String material) } public static ItemStack bar(String material, int stackSize) - { - if(material.equalsIgnoreCase("RefinedIron")) { - material = "PigIron"; - } - + { return bar.createComm(material, stackSize); } } From 56b4706329b4fdefb4a234cc2b1cab916e3e2a76 Mon Sep 17 00:00:00 2001 From: Sirse Date: Mon, 12 Jun 2017 01:11:11 +0700 Subject: [PATCH 035/101] 2.8.13.1u --- build.gradle | 2 +- src/main/java/minefantasy/mf2/MineFantasyII.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 780d76bf..635b037e 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { apply plugin: 'forge' -version = "2.8.13u" +version = "2.8.13.1u" group= "minefantasy.mf2.minefantasy2" archivesBaseName = "MineFantasyII" diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index c0e0ab69..d6fcc3d2 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -61,7 +61,7 @@ public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; - public static final String VERSION = "Alpha_2.8.13u"; + public static final String VERSION = "Alpha_2.8.13.1u"; public static final WorldGenMFBase worldGenManager = new WorldGenMFBase(); @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") From 790bbf15a9e82b58ecab1b291d6ce464712643cb Mon Sep 17 00:00:00 2001 From: Sirse Date: Thu, 22 Jun 2017 00:41:18 +0800 Subject: [PATCH 036/101] Include gradle binaries --- .gitignore | 2 - gradlew | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++ gradlew.bat | 90 ++++++++++++++++++++++++++++ 3 files changed, 254 insertions(+), 2 deletions(-) create mode 100644 gradlew create mode 100644 gradlew.bat diff --git a/.gitignore b/.gitignore index 1fb10f8b..d8753a9b 100644 --- a/.gitignore +++ b/.gitignore @@ -58,8 +58,6 @@ Temporary Items eclipse/* *.prefs *.launch -gradlew -*.bat eclipse/* /bin/ diff --git a/gradlew b/gradlew new file mode 100644 index 00000000..91a7e269 --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..8a0b282a --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From 0b97d31d70e4d755ebac18d37debd3849ddb1bf2 Mon Sep 17 00:00:00 2001 From: Sirse Date: Thu, 13 Jul 2017 11:33:07 +0800 Subject: [PATCH 037/101] Localization fix --- .../java/minefantasy/mf2/api/knowledge/InformationPage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java b/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java index e6b32ba5..c79dd427 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java @@ -101,7 +101,7 @@ public static boolean isInfoInPages(InformationBase achievement) public static String getTitle(int index) { - return StatCollector.translateToLocal(index == -1 ? "Basic" : getInfoPage(index).getName()); + return StatCollector.translateToLocal(index == -1 ? "infoPage.basic" : getInfoPage(index).getName()); } public static Skill getSkill(int index) { From dbcd49a02b4802abf2ea7632668c79556330cb88 Mon Sep 17 00:00:00 2001 From: Sirse Date: Thu, 13 Jul 2017 20:21:55 +0800 Subject: [PATCH 038/101] Config options for integration module --- .../java/minefantasy/mf2/MineFantasyII.java | 6 +- .../mf2/config/ConfigIntegration.java | 24 +++++-- .../mf2/integration/nei/NEIConfig.java | 65 ++++++++++--------- 3 files changed, 55 insertions(+), 40 deletions(-) diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index d6fcc3d2..5bd5d542 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -80,9 +80,7 @@ public void preInit(FMLPreInitializationEvent event) { new ConfigArmour().setConfig(getCfg(event, "Armours")); new ConfigExperiment().setConfig(getCfg(event, "Specials")); new ConfigHardcore().setConfig(getCfg(event, "Hardcore")); - if (FMLCommonHandler.instance().getSide() == Side.SERVER) { - new ConfigIntegration().setConfig(getCfg(event, "Integration")); - } + new ConfigIntegration().setConfig(getCfg(event, "Integration")); new ConfigTools().setConfig(getCfg(event, "Tools")); new ConfigWeapon().setConfig(getCfg(event, "Weapons")); new ConfigStamina().setConfig(getCfg(event, "Stamina_System")); @@ -118,7 +116,7 @@ public void load(FMLInitializationEvent evt) { packetHandler.channels.put(channel, eventChannel); } - if(Loader.isModLoaded("MineTweaker3")) { + if(Loader.isModLoaded("MineTweaker3") && ConfigIntegration.mtIntegration) { MTCompat.loadTweakers(); } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigIntegration.java b/src/main/java/minefantasy/mf2/config/ConfigIntegration.java index cb01a896..51948f46 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigIntegration.java +++ b/src/main/java/minefantasy/mf2/config/ConfigIntegration.java @@ -2,17 +2,31 @@ import java.util.Arrays; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; + public class ConfigIntegration extends ConfigurationBaseMF { - public static final String CATEGORY_BUKKIT = "Bukkit Integration"; + public static final String CATEGORY_MODS = "Cross-mod Integration"; + public static boolean neiIntegration; + public static boolean mtIntegration; + public static final String CATEGORY_BUKKIT = "Bukkit Integration"; public static String[] pluginsList = new String[0]; @Override protected void loadConfig() { - String bpDesc = "This registers listeners of Bukkit plugins (if avaliable). Here you are should list all protection-related plugins (e.g WorldGuard). You are can find correct plugin name in its plugin.yml (inside plugin's .jar file)"; - pluginsList = config.get(CATEGORY_BUKKIT, "Plugins List", new String[] { "WorldGuard" }, bpDesc) - .getStringList(); - Arrays.sort(pluginsList); + neiIntegration = Boolean.getBoolean( + config.get(CATEGORY_MODS, "NEI Integration", true, "Enable Not Enough Items integration").getString()); + mtIntegration = Boolean.getBoolean( + config.get(CATEGORY_MODS, "MT Integration", true, "Enable MineTweaker (CraftTweaker) integration") + .getString()); + + if (FMLCommonHandler.instance().getSide() == Side.SERVER) { + pluginsList = config.get(CATEGORY_BUKKIT, "Plugins List", new String[] { "WorldGuard" }, + "This registers listeners of Bukkit plugins (if avaliable). Here you are should list all protection-related plugins (e.g WorldGuard). You are can find correct plugin name in its plugin.yml (inside plugin's .jar file)") + .getStringList(); + Arrays.sort(pluginsList); + } } } diff --git a/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java b/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java index c48ef87d..b7b14a4b 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java +++ b/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java @@ -4,6 +4,7 @@ import codechicken.nei.api.IConfigureNEI; import cpw.mods.fml.common.Optional; import minefantasy.mf2.MineFantasyII; +import minefantasy.mf2.config.ConfigIntegration; @Optional.Interface(iface = "codechicken.nei.api.IConfigureNEI", modid = "NotEnoughItems") public class NEIConfig implements IConfigureNEI { @@ -20,36 +21,38 @@ public String getVersion() { @Override public void loadConfig() { - RecipeHandlerCarpenter handlerCarpenter = new RecipeHandlerCarpenter(); - API.registerRecipeHandler(handlerCarpenter); - API.registerUsageHandler(handlerCarpenter); - - RecipeHandlerAnvil handlerAnvil = new RecipeHandlerAnvil(); - API.registerRecipeHandler(handlerAnvil); - API.registerUsageHandler(handlerAnvil); - - RecipeHandlerBloom handlerBloom = new RecipeHandlerBloom(); - API.registerRecipeHandler(handlerBloom); - API.registerUsageHandler(handlerBloom); - - RecipeHandlerQuern handlerQuern = new RecipeHandlerQuern(); - API.registerRecipeHandler(handlerQuern); - API.registerUsageHandler(handlerQuern); - - RecipeHandlerTanning handlerTanning = new RecipeHandlerTanning(); - API.registerRecipeHandler(handlerTanning); - API.registerUsageHandler(handlerTanning); - - RecipeHandlerCrucible handlerCrucible = new RecipeHandlerCrucible(); - API.registerRecipeHandler(handlerCrucible); - API.registerUsageHandler(handlerCrucible); - - RecipeHandlerBigFurnace handlerBigFurnace = new RecipeHandlerBigFurnace(); - API.registerRecipeHandler(handlerBigFurnace); - API.registerUsageHandler(handlerBigFurnace); - - RecipeHandlerBlastFurnace handlerBlastFurnace = new RecipeHandlerBlastFurnace(); - API.registerRecipeHandler(handlerBlastFurnace); - API.registerUsageHandler(handlerBlastFurnace); + if (ConfigIntegration.neiIntegration) { + RecipeHandlerCarpenter handlerCarpenter = new RecipeHandlerCarpenter(); + API.registerRecipeHandler(handlerCarpenter); + API.registerUsageHandler(handlerCarpenter); + + RecipeHandlerAnvil handlerAnvil = new RecipeHandlerAnvil(); + API.registerRecipeHandler(handlerAnvil); + API.registerUsageHandler(handlerAnvil); + + RecipeHandlerBloom handlerBloom = new RecipeHandlerBloom(); + API.registerRecipeHandler(handlerBloom); + API.registerUsageHandler(handlerBloom); + + RecipeHandlerQuern handlerQuern = new RecipeHandlerQuern(); + API.registerRecipeHandler(handlerQuern); + API.registerUsageHandler(handlerQuern); + + RecipeHandlerTanning handlerTanning = new RecipeHandlerTanning(); + API.registerRecipeHandler(handlerTanning); + API.registerUsageHandler(handlerTanning); + + RecipeHandlerCrucible handlerCrucible = new RecipeHandlerCrucible(); + API.registerRecipeHandler(handlerCrucible); + API.registerUsageHandler(handlerCrucible); + + RecipeHandlerBigFurnace handlerBigFurnace = new RecipeHandlerBigFurnace(); + API.registerRecipeHandler(handlerBigFurnace); + API.registerUsageHandler(handlerBigFurnace); + + RecipeHandlerBlastFurnace handlerBlastFurnace = new RecipeHandlerBlastFurnace(); + API.registerRecipeHandler(handlerBlastFurnace); + API.registerUsageHandler(handlerBlastFurnace); + } } } \ No newline at end of file From 215d1a2442ae13e3aeda078ae0c505edfa84a897 Mon Sep 17 00:00:00 2001 From: Sirse Date: Tue, 18 Jul 2017 00:12:11 +0800 Subject: [PATCH 039/101] Some stuff - MT compat (based on @Coolmanzz2 plugin, need some refractoring) - Little fixes --- .../integration/minetweaker/BloomTweaker.java | 62 -------- .../mf2/integration/minetweaker/MTCompat.java | 14 +- .../mf2/integration/minetweaker/Skills.java | 38 +++++ .../minetweaker/TweakedAlloyRecipe.java | 61 ++++++++ .../minetweaker/TweakedShapedAnvilRecipe.java | 129 ++++++++++++++++ .../minetweaker/TweakedShapedCBRecipes.java | 127 ++++++++++++++++ .../TweakedShapelessAnvilRecipe.java | 140 ++++++++++++++++++ .../TweakedShapelessCBRecipes.java | 130 ++++++++++++++++ .../minetweaker/tweakers/Anvil.java | 103 +++++++++++++ .../minetweaker/tweakers/Bloomery.java | 67 +++++++++ .../minetweaker/tweakers/CarpentersBench.java | 100 +++++++++++++ .../minetweaker/tweakers/Crucible.java | 60 ++++++++ .../minetweaker/tweakers/Forge.java | 69 +++++++++ .../minetweaker/tweakers/TanningRack.java | 64 ++++++++ .../mf2/mechanics/MonsterUpgrader.java | 1 + .../mf2/network/ClientProxyMF.java | 2 +- .../mf2/network/CommonProxyMF.java | 2 +- 17 files changed, 1104 insertions(+), 65 deletions(-) delete mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/BloomTweaker.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/BloomTweaker.java b/src/main/java/minefantasy/mf2/integration/minetweaker/BloomTweaker.java deleted file mode 100644 index 9b53521b..00000000 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/BloomTweaker.java +++ /dev/null @@ -1,62 +0,0 @@ -package minefantasy.mf2.integration.minetweaker; - -import minefantasy.mf2.api.crafting.refine.BloomRecipe; -import minetweaker.IUndoableAction; -import minetweaker.MineTweakerAPI; -import minetweaker.api.item.IItemStack; -import minetweaker.api.minecraft.MineTweakerMC; -import net.minecraft.item.ItemStack; -import stanhebben.zenscript.annotations.ZenClass; -import stanhebben.zenscript.annotations.ZenMethod; - -@ZenClass("mods.minefantasy.Bloomery") -public class BloomTweaker { - - @ZenMethod - public static void addRecipe(IItemStack input, IItemStack output) { - MineTweakerAPI.apply(new AddBloomRecipe(input, output)); - } - - public static class AddBloomRecipe implements IUndoableAction { - - private ItemStack input; - private ItemStack output; - - public AddBloomRecipe(IItemStack input, IItemStack output) { - this.input = MineTweakerMC.getItemStack(input); - this.output = MineTweakerMC.getItemStack(output); - } - - @Override - public void apply() { - BloomRecipe.addRecipe(input, output); - } - - @Override - public boolean canUndo() { - return true; - } - - @Override - public String describe() { - return String.format("Adding recipe %s -> %s * %d to Bloomery", input.getDisplayName(), - output.getDisplayName(), output.stackSize); - } - - @Override - public String describeUndo() { - return String.format("Removing recipe %s -> %s * %d from Bloomery", input.getDisplayName(), - output.getDisplayName(), output.stackSize); - } - - @Override - public Object getOverrideKey() { - return null; - } - - @Override - public void undo() { - BloomRecipe.recipeList.remove(input, output); - } - } -} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java index fba7e77c..adaf0026 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -1,10 +1,22 @@ package minefantasy.mf2.integration.minetweaker; +import minefantasy.mf2.integration.minetweaker.tweakers.Anvil; +import minefantasy.mf2.integration.minetweaker.tweakers.Bloomery; +import minefantasy.mf2.integration.minetweaker.tweakers.CarpentersBench; +import minefantasy.mf2.integration.minetweaker.tweakers.Crucible; +import minefantasy.mf2.integration.minetweaker.tweakers.Forge; +import minefantasy.mf2.integration.minetweaker.tweakers.TanningRack; import minetweaker.MineTweakerAPI; +/* + * Based on @Coolmanzz2 MineFantasyTweaker mod + * https://github.com/Coolmanzz2/MineFantasyTweaker/ + */ + public class MTCompat { - private static final Class[] tweakers = { /*QuernTweaker.class,*/ BloomTweaker.class }; + private static final Class[] tweakers = { Anvil.class, Bloomery.class, CarpentersBench.class, Crucible.class, + Forge.class, TanningRack.class }; public static void loadTweakers() { for (Class tweaker : tweakers) { diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java b/src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java new file mode 100644 index 00000000..6110839e --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java @@ -0,0 +1,38 @@ +package minefantasy.mf2.integration.minetweaker; + +import minefantasy.mf2.api.rpg.Skill; +import minefantasy.mf2.api.rpg.SkillList; + +public enum Skills { + + /* TODO: Rewrite */ + + Artisanry(SkillList.artisanry, "artisanry"), Construction(SkillList.construction, "construction"), Combat(SkillList.combat, "combat"), + Engineering(SkillList.engineering, "engineering"), Provisioning(SkillList.provisioning, "provisioning"); + + private Skill s; + private String name; + + private Skills(Skill s, String name) { + this.s = s; + this.name = name; + } + + public String getName(){ + return name; + } + + public Skill getSkill(){ + return s; + } + + public static Skills getFromString(String name){ + for(Skills s : Skills.values()){ + if(s.getName().equalsIgnoreCase(name)){ + return s; + } + } + return null; + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java new file mode 100644 index 00000000..95591511 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java @@ -0,0 +1,61 @@ +package minefantasy.mf2.integration.minetweaker; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import minefantasy.mf2.api.crafting.MineFantasyFuels; +import minefantasy.mf2.api.refine.Alloy; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class TweakedAlloyRecipe extends Alloy{ + + public TweakedAlloyRecipe(IItemStack output, int requiredLevel, List items) { + super(MineTweakerMC.getItemStack(output), requiredLevel, items); + } + + @Override + public boolean matches(ItemStack[] inv) { + ArrayList check = new ArrayList(recipeItems); + ArrayList check2 = new ArrayList(recipeItems); + for(ItemStack stack : inv){ + if(stack != null){ + boolean matches = false; + Iterator it = check.iterator(); + while(it.hasNext()){ + IIngredient ingred = (IIngredient) it.next(); + for(IItemStack i : ingred.getItems()){ + ItemStack is = MineTweakerMC.getItemStack(i); + if(stack.isItemEqual(is) && (is.getItemDamage() == OreDictionary.WILDCARD_VALUE || is.getItemDamage() == stack.getItemDamage())){ + matches = true; + check2.remove(ingred); + break; + } + if(areBothCarbon(is, stack)){ + matches = true; + check2.remove(ingred); + break; + } + } + if(matches) break; + } + if(!matches) return false; + } + } + boolean empty = true; + for(Object o : check2){ + if(o != null) empty = false; + } + return empty; + } + + private boolean areBothCarbon(ItemStack item1, ItemStack item2) + { + return MineFantasyFuels.isCarbon(item1) && MineFantasyFuels.isCarbon(item2); + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java new file mode 100644 index 00000000..3b0378a6 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java @@ -0,0 +1,129 @@ +package minefantasy.mf2.integration.minetweaker; + +import minefantasy.mf2.api.crafting.anvil.AnvilCraftMatrix; +import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; +import minefantasy.mf2.api.rpg.Skill; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; + +public class TweakedShapedAnvilRecipe implements IAnvilRecipe { + + private int hammer, anvil, /*craft,*/ time, width, height; + private float exp; + private IItemStack result; + private IIngredient[][] ingreds; + private Skill s; + private String research, tool; + private boolean hot; + + public TweakedShapedAnvilRecipe(IIngredient[][] input, IItemStack output, String tool, int time, int hammer, + int anvil, float exp, boolean hot, String research, Skill s) { + this.height = 4; + this.width = 6; + this.ingreds = input; + this.result = output; + this.tool = tool; + this.hammer = hammer; + this.anvil = anvil; + this.exp = exp; + this.hot = hot; + this.research = research; + this.s = s; + this.time = time; + } + + @Override + public int getAnvil() { + return anvil; + } + + @Override + public int getCraftTime() { + return time; + } + + @Override + public ItemStack getCraftingResult(AnvilCraftMatrix arg0) { + return this.getRecipeOutput().copy(); + } + + @Override + public float getExperiance() { + return exp; + } + + @Override + public int getRecipeHammer() { + return hammer; + } + + @Override + public ItemStack getRecipeOutput() { + return MineTweakerMC.getItemStack(result).copy(); + } + + @Override + public int getRecipeSize() { + return this.width * this.height; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return this.s; + } + + @Override + public String getToolType() { + return tool; + } + + @Override + public boolean matches(AnvilCraftMatrix inv) { + boolean matches = true; + for (int x = 0; x < 6; x++) { + for (int y = 0; y < 4; y++) { + if (!matches) + return false; + ItemStack stack = inv.getStackInRowAndColumn(x, y); + + // int a = y + x * 4; + if (stack == null && this.ingreds[y][x] == null) { + continue; + } + boolean hasMatch = false; + if (stack != null && this.ingreds[y][x] != null) { + for (IItemStack i : this.ingreds[y][x].getItems()) { + ItemStack ingred = MineTweakerMC.getItemStack(i); + if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == stack.getItemDamage()) { + hasMatch = true; + } + } + } else { + matches = false; + } + if (!hasMatch) + matches = false; + } + } + return matches; + } + + @Override + public boolean outputHot() { + return hot; + } + + @Override + public boolean useCustomTiers() { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java new file mode 100644 index 00000000..a233175f --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java @@ -0,0 +1,127 @@ +package minefantasy.mf2.integration.minetweaker; + +import minefantasy.mf2.api.crafting.carpenter.CarpenterCraftMatrix; +import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; +import minefantasy.mf2.api.rpg.Skill; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; + +public class TweakedShapedCBRecipes implements ICarpenterRecipe { + + private int hammer, anvil, /* craft, */ time, width, height; + private float exp; + private IItemStack result; + private IIngredient[][] ingreds; + private Skill s; + private String research, tool, sound; + + public TweakedShapedCBRecipes(IIngredient[][] input, IItemStack output, String tool, int time, int hammer, + int anvil, float exp, String sound, String research, Skill s) { + this.height = 4; + this.width = 6; + this.ingreds = input; + this.result = output; + this.tool = tool; + this.hammer = hammer; + this.anvil = anvil; + this.exp = exp; + this.sound = sound; + this.research = research; + this.s = s; + this.time = time; + } + + @Override + public int getAnvil() { + return anvil; + } + + @Override + public int getCraftTime() { + return time; + } + + @Override + public ItemStack getCraftingResult(CarpenterCraftMatrix arg0) { + return this.getRecipeOutput().copy(); + } + + @Override + public float getExperiance() { + return exp; + } + + @Override + public int getRecipeHammer() { + return hammer; + } + + @Override + public ItemStack getRecipeOutput() { + return MineTweakerMC.getItemStack(result).copy(); + } + + @Override + public int getRecipeSize() { + return this.width * this.height; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return this.s; + } + + @Override + public String getToolType() { + return tool; + } + + @Override + public boolean matches(CarpenterCraftMatrix inv) { + boolean matches = true; + for (int x = 0; x < 4; x++) { + for (int y = 0; y < 4; y++) { + if (!matches) + return false; + ItemStack stack = inv.getStackInRowAndColumn(x, y); + + //int a = y + x * 4; + if (stack == null && this.ingreds[y][x] == null) { + continue; + } + boolean hasMatch = false; + if (stack != null && this.ingreds[y][x] != null) { + for (IItemStack i : this.ingreds[y][x].getItems()) { + ItemStack ingred = MineTweakerMC.getItemStack(i); + if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == stack.getItemDamage()) { + hasMatch = true; + } + } + } else { + matches = false; + } + if (!hasMatch) + matches = false; + } + } + return matches; + } + + @Override + public String getSound() { + return sound; + } + + @Override + public boolean outputHot() { + return false; + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java new file mode 100644 index 00000000..6cc3e865 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java @@ -0,0 +1,140 @@ +package minefantasy.mf2.integration.minetweaker; + +import minefantasy.mf2.api.crafting.anvil.AnvilCraftMatrix; +import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; +import minefantasy.mf2.api.rpg.Skill; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; + +public class TweakedShapelessAnvilRecipe implements IAnvilRecipe { + + private int hammer, anvil, /* craft, */ time, width, height; + private float exp; + private IItemStack result; + private IIngredient[] ingreds; + private Skill s; + private String research, tool; + private boolean hot; + + public TweakedShapelessAnvilRecipe(IIngredient[] input, IItemStack output, String tool, int time, int hammer, + int anvil, float exp, boolean hot, String research, Skill s) { + this.height = 4; + this.width = 4; + this.ingreds = input; + this.result = output; + this.tool = tool; + this.hammer = hammer; + this.anvil = anvil; + this.exp = exp; + this.hot = hot; + this.research = research; + this.s = s; + this.time = 1; + } + + @Override + public int getAnvil() { + return anvil; + } + + @Override + public int getCraftTime() { + return time; + } + + @Override + public ItemStack getCraftingResult(AnvilCraftMatrix arg0) { + return this.getRecipeOutput().copy(); + } + + @Override + public float getExperiance() { + return exp; + } + + @Override + public int getRecipeHammer() { + return hammer; + } + + @Override + public ItemStack getRecipeOutput() { + return MineTweakerMC.getItemStack(result).copy(); + } + + @Override + public int getRecipeSize() { + return this.width * this.height; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return s; + } + + @Override + public String getToolType() { + return tool; + } + + @Override + public boolean matches(AnvilCraftMatrix inv) { + boolean matches[] = new boolean[this.ingreds.length]; + boolean items[][] = new boolean[6][4]; + for (int a = 0; a < this.ingreds.length; a++) { + IIngredient i = this.ingreds[a]; + for (IItemStack s : i.getItems()) { + ItemStack ingred = MineTweakerMC.getItemStack(s); + boolean found = false; + for (int x = 0; x < 6; x++) { + for (int y = 0; y < 4; y++) { + ItemStack stack = inv.getStackInRowAndColumn(x, y); + if (stack == null) + continue; + if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == ingred.getItemDamage() + && !items[x][y]) { + matches[a] = true; + items[x][y] = true; + found = true; + break; + } + } + if (found) + break; + } + if (found) + break; + } + } + boolean isMatch = true; + for (boolean b : matches) + if (!b) + isMatch = false; + for (int x = 0; x < 6; x++) { + for (int y = 0; y < 4; y++) { + if (!items[x][y] && inv.getStackInRowAndColumn(x, y) != null) + isMatch = false; + } + } + return isMatch; + } + + @Override + public boolean outputHot() { + return hot; + } + + @Override + public boolean useCustomTiers() { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java new file mode 100644 index 00000000..984efd7b --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java @@ -0,0 +1,130 @@ +package minefantasy.mf2.integration.minetweaker; + +import minefantasy.mf2.api.crafting.carpenter.CarpenterCraftMatrix; +import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; +import minefantasy.mf2.api.rpg.Skill; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; + +public class TweakedShapelessCBRecipes implements ICarpenterRecipe{ + + private int hammer, anvil, /*craft,*/ time, width, height; + private float exp; + private IItemStack result; + private IIngredient[] ingreds; + private Skill s; + private String research, tool, sound; + + public TweakedShapelessCBRecipes(IIngredient[] input, IItemStack output, String tool, int time, int hammer, int anvil, float exp, String sound, String research, Skill s) { + this.height = 4; + this.width = 4; + this.ingreds = input; + this.result = output; + this.tool = tool; + this.hammer = hammer; + this.anvil = anvil; + this.exp = exp; + this.sound = sound; + this.research = research; + this.s = s; + this.time = 1; + } + + @Override + public int getAnvil() { + return anvil; + } + + @Override + public int getCraftTime() { + return time; + } + + @Override + public ItemStack getCraftingResult(CarpenterCraftMatrix arg0) { + return this.getRecipeOutput().copy(); + } + + @Override + public float getExperiance() { + return exp; + } + + @Override + public int getRecipeHammer() { + return hammer; + } + + @Override + public ItemStack getRecipeOutput() { + return MineTweakerMC.getItemStack(result).copy(); + } + + @Override + public int getRecipeSize() { + return this.width * this.height; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return s; + } + + @Override + public String getToolType() { + return tool; + } + + @Override + public boolean matches(CarpenterCraftMatrix inv) { + boolean matches[] = new boolean[this.ingreds.length]; + boolean items[][] = new boolean[4][4]; + for(int a = 0; a < this.ingreds.length; a++){ + IIngredient i = this.ingreds[a]; + for(IItemStack s : i.getItems()){ + ItemStack ingred = MineTweakerMC.getItemStack(s); + boolean found = false; + for(int x = 0; x < 4; x++){ + for(int y = 0; y < 4; y++){ + ItemStack stack = inv.getStackInRowAndColumn(x, y); + if(stack == null) continue; + if(stack.getItem() == ingred.getItem() && stack.getItemDamage() == ingred.getItemDamage() && !items[x][y]){ + matches[a] = true; + items[x][y] = true; + found = true; + break; + } + } + if(found)break; + } + if(found)break; + } + } + boolean isMatch = true; + for(boolean b : matches) if(!b) isMatch = false; + for(int x = 0; x < 4; x++){ + for(int y = 0; y < 4; y++){ + if(!items[x][y] && inv.getStackInRowAndColumn(x, y) != null) isMatch = false; + } + } + return isMatch; + } + + @Override + public boolean outputHot() { + return false; + } + + @Override + public String getSound() { + return sound; + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java new file mode 100644 index 00000000..606f09fe --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java @@ -0,0 +1,103 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.crafting.anvil.CraftingManagerAnvil; +import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; +import minefantasy.mf2.api.rpg.Skill; +import minefantasy.mf2.integration.minetweaker.Skills; +import minefantasy.mf2.integration.minetweaker.TweakedShapedAnvilRecipe; +import minefantasy.mf2.integration.minetweaker.TweakedShapelessAnvilRecipe; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import stanhebben.zenscript.annotations.NotNull; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.minefantasy.Anvil") +public class Anvil { + + @ZenMethod + public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, boolean hot, double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds){ + MineTweakerAPI.apply(new AnvilAction(output, Skills.getFromString(skill).getSkill(), research, hot, (float)exp, tool, hammer, anvil, time, ingreds)); + } + + @ZenMethod + public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, boolean hot, double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds){ + MineTweakerAPI.apply(new AnvilAction(output, Skills.getFromString(skill).getSkill(), research, hot, (float)exp, tool, hammer, anvil, time, ingreds)); + } + + + public static class AnvilAction implements IUndoableAction{ + + IItemStack out; + Skill s; + String research, tool; + boolean hot; + float exp; + int hammer, anvil, time; + IIngredient[][] ingreds; + IIngredient[] ingreds2; + boolean shaped; + IAnvilRecipe r; + + //private static final char[] chars = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; + + public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { + this.out = out; + this.s = s; + this.research = research; this.tool = tool; + this.hot = hot; + this.exp = exp; + this.hammer = hammer; this.anvil = anvil; this.time = time; + this.ingreds = ingreds; + this.shaped = true; + r = new TweakedShapedAnvilRecipe(ingreds, out, tool, time, hammer, anvil, exp, hot, research, s); + } + + public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { + this.out = out; + this.s = s; + this.research = research; this.tool = tool; + this.hot = hot; + this.exp = exp; + this.hammer = hammer; this.anvil = anvil; this.time = time; + this.ingreds2 = ingreds; + this.shaped = false; + r = new TweakedShapelessAnvilRecipe(ingreds2,out,tool,time,hammer,anvil,exp,hot,research,s); + } + + @Override + public void apply() { + CraftingManagerAnvil.getInstance().recipes.add(r); + } + + @Override + public String describe() { + return "Adding a " + (hot ? "hot" : "") + " Anvil Recipe resulting in " + MineTweakerMC.getItemStack(out); + } + + @Override + public Object getOverrideKey() { + return null; + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public String describeUndo() { + return "Undoing Anvil Recipe"; + } + + @Override + public void undo() { + CraftingManagerAnvil.getInstance().recipes.remove(r); + } + + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java new file mode 100644 index 00000000..0e09b531 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java @@ -0,0 +1,67 @@ + +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.crafting.refine.BloomRecipe; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.minefantasy.Bloomery") +public class Bloomery { + + @ZenMethod + public static void addRecipe(IItemStack result, IIngredient input) { + MineTweakerAPI.apply(new addBloomRecipe(result, input)); + } + + public static class addBloomRecipe implements IUndoableAction { + + IItemStack result; + IIngredient input; + + public addBloomRecipe(IItemStack result, IIngredient input) { + this.result = result; + this.input = input; + } + + @Override + public void apply() { + for (IItemStack stack : input.getItems()) { + ItemStack s = MineTweakerMC.getItemStack(stack); + BloomRecipe.addRecipe(s, MineTweakerMC.getItemStack(result)); + } + } + + @Override + public String describe() { + return "Adding Bloomery Recipe That Results In " + result.getDisplayName(); + } + + @Override + public Object getOverrideKey() { + return null; + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public String describeUndo() { + return "STAHP UNDOOOOIN MAH RECIPES"; + } + + @Override + public void undo() { + BloomRecipe.recipeList.remove(input); + } + + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java new file mode 100644 index 00000000..c2bb34d1 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java @@ -0,0 +1,100 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.crafting.carpenter.CraftingManagerCarpenter; +import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; +import minefantasy.mf2.api.rpg.Skill; +import minefantasy.mf2.integration.minetweaker.Skills; +import minefantasy.mf2.integration.minetweaker.TweakedShapedCBRecipes; +import minefantasy.mf2.integration.minetweaker.TweakedShapelessCBRecipes; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import stanhebben.zenscript.annotations.NotNull; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.minefantasy.CarpenterBench") +public class CarpentersBench { + + @ZenMethod + public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, String sound, double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds){ + MineTweakerAPI.apply(new CarpentersAction(output,Skills.getFromString(skill).getSkill(), research, sound, (float)exp, tool, hammer, anvil, time, ingreds)); + } + + @ZenMethod + public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, String sound, double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds){ + MineTweakerAPI.apply(new CarpentersAction(output,Skills.getFromString(skill).getSkill(), research, sound, (float)exp, tool, hammer, anvil, time, ingreds)); + } + + public static class CarpentersAction implements IUndoableAction{ + + IItemStack out; + Skill s; + String research, tool, sound; + float exp; + int hammer, anvil, time; + IIngredient[][] ingreds; + IIngredient[] ingreds2; + boolean shaped; + ICarpenterRecipe r; + + //private static final char[] chars = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; + + public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { + this.out = out; + this.s = s; + this.research = research; this.tool = tool; + this.sound = sound; + this.exp = exp; + this.hammer = hammer; this.anvil = anvil; this.time = time; + this.ingreds = ingreds; + this.shaped = true; + r = new TweakedShapedCBRecipes(ingreds, out, tool, time, hammer, anvil, exp, sound, research, s); + } + + public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { + this.out = out; + this.s = s; + this.research = research; this.tool = tool; + this.sound = sound; + this.exp = exp; + this.hammer = hammer; this.anvil = anvil; this.time = time; + this.ingreds2 = ingreds; + this.shaped = false; + r = new TweakedShapelessCBRecipes(ingreds2, out, tool, time, hammer, anvil, exp, sound, research, s); + } + + @Override + public void apply() { + CraftingManagerCarpenter.getInstance().recipes.add(r); + } + + @Override + public String describe() { + return "Adding Carpenters Bench Recipe..."; + } + + @Override + public Object getOverrideKey() { + return null; + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public String describeUndo() { + return "Undoing Carpenters Recipe"; + } + + @Override + public void undo() { + CraftingManagerCarpenter.getInstance().recipes.remove(r); + } + + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java new file mode 100644 index 00000000..4e40159f --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java @@ -0,0 +1,60 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import java.util.ArrayList; +import java.util.List; + +import minefantasy.mf2.api.refine.Alloy; +import minefantasy.mf2.api.refine.AlloyRecipes; +import minefantasy.mf2.integration.minetweaker.TweakedAlloyRecipe; +import minetweaker.MineTweakerAPI; +import minetweaker.OneWayAction; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.minefantasy.Crucible") +public class Crucible { + + @ZenMethod + public static void addAlloy(IItemStack out, int level, int dupe, IIngredient[] ingred){ + MineTweakerAPI.apply(new AlloyAction(out, level, ingred, dupe)); + } + + private static class AlloyAction extends OneWayAction{ + + private IItemStack out; + private int level; + private List ingreds; + private int dupe; + Alloy a; + + public AlloyAction(IItemStack out, int level, IIngredient[] ingreds, int dupe) { + this.out = out; + this.level = level; + this.ingreds = new ArrayList(); + this.dupe = dupe; + for(IIngredient i : ingreds){ + this.ingreds.add(i); + } + a = new TweakedAlloyRecipe(out, level, this.ingreds); + } + + @Override + public void apply() { + AlloyRecipes.addAlloy(a); + } + + @Override + public String describe() { + return "Adding Custom Alloy"; + } + + @Override + public Object getOverrideKey() { + return null; + } + + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java new file mode 100644 index 00000000..493645e1 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java @@ -0,0 +1,69 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.heating.Heatable; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.annotations.ModOnly; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.minefantasy.Forge") +public class Forge { + + @ZenMethod + public static void addHeatableItem(IIngredient input, int min, int unstable, int max){ + MineTweakerAPI.apply(new heatableItemAction(input,min,unstable,max)); + } + + public static class heatableItemAction implements IUndoableAction{ + + IIngredient input; + int min, unstable, max; + + public heatableItemAction(IIngredient input, int min, int unstable, int max) { + this.input = input; + this.min = min; + this.unstable = unstable; + this.max = max; + } + + @Override + public void apply() { + for(IItemStack s : input.getItems()){ + Heatable.addItem(MineTweakerMC.getItemStack(s), min, unstable, max); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public String describe() { + return "Adding a heatable item"; + } + + @Override + public String describeUndo() { + return "Removing heatable item"; + } + + @Override + public Object getOverrideKey() { + return null; + } + + @Override + public void undo() { + for(IItemStack s : input.getItems()){ + Heatable.registerList.remove(Heatable.getRegistrationForItem(MineTweakerMC.getItemStack(s))); + } + } + + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java new file mode 100644 index 00000000..b58adfc1 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java @@ -0,0 +1,64 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.crafting.tanning.TanningRecipe; +import minetweaker.MineTweakerAPI; +import minetweaker.OneWayAction; +import minetweaker.annotations.ModOnly; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.minefantasy.TanningRack") +public class TanningRack { + + @ZenMethod + public static void addTieredRecipe(IItemStack output, IIngredient input, float time, int tier){ + MineTweakerAPI.apply(new TanningAction(output, input, time, tier, "knife")); + } + + @ZenMethod + public static void addTieredAndToolRecipe(IItemStack output, IIngredient input, float time, int tier, String tool){ + MineTweakerAPI.apply(new TanningAction(output, input, time, tier, tool)); + } + + + public static class TanningAction extends OneWayAction{ + + IItemStack output; + IIngredient input; + float time; + int tier; + String tool; + + public TanningAction(IItemStack output, IIngredient input, float time, int tier, String tool) { + this.output = output; + this.input = input; + this.time = time; + this.tier = tier; + this.tool = tool; + } + + @Override + public void apply() { + for(IItemStack s : input.getItems()){ + ItemStack stack = MineTweakerMC.getItemStack(s); + TanningRecipe.addRecipe(stack, time, tier, tool, MineTweakerMC.getItemStack(output)); + } + } + + @Override + public String describe() { + return "Creating Tanning Recipe"; + } + + @Override + public Object getOverrideKey() { + return null; + } + + } + +} diff --git a/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java b/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java index c5c00f40..b8563df5 100644 --- a/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java +++ b/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java @@ -214,6 +214,7 @@ private void giveEntityWeapon(EntityLivingBase mob, String tier, int weaponType) { weapon = CustomToolListMF.standard_spear; } + if(mob != null && weapon != null) { mob.setCurrentItemOrArmor(0, weapon.construct(tier,"OakWood")); diff --git a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java index a78c573a..c07baecf 100644 --- a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java @@ -239,7 +239,7 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int Minecraft mc = Minecraft.getMinecraft(); if (ID == 0) { TileEntity tile = world.getTileEntity(x, y, z); - int meta = world.getBlockMetadata(x, y, z); + //int meta = world.getBlockMetadata(x, y, z); if (tile == null) { return null; diff --git a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java index ef43fffc..fa82d5a5 100644 --- a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java @@ -47,7 +47,7 @@ public Object getServerGuiElement(int ID, EntityPlayer player, World world, int else if(ID == 0) { TileEntity tile = world.getTileEntity(x, y, z); - int meta = world.getBlockMetadata(x, y, z); + //int meta = world.getBlockMetadata(x, y, z); if(tile == null) { return null; From 7c981e113aa2e586e1c1b0199befb35f2d0d7d26 Mon Sep 17 00:00:00 2001 From: Sirse Date: Tue, 18 Jul 2017 00:21:47 +0800 Subject: [PATCH 040/101] Code formatting One click IDE action --- .../java/minefantasy/mf2/MineFantasyII.java | 6 +- .../minefantasy/mf2/api/MineFantasyAPI.java | 756 ++--- .../mf2/api/archery/AmmoMechanicsMF.java | 226 +- .../minefantasy/mf2/api/archery/IAmmo.java | 3 +- .../mf2/api/archery/IArrowHandler.java | 7 +- .../minefantasy/mf2/api/archery/IArrowMF.java | 12 +- .../mf2/api/archery/IArrowRetrieve.java | 9 +- .../mf2/api/archery/IDisplayMFAmmo.java | 6 +- .../minefantasy/mf2/api/archery/IFirearm.java | 13 +- .../mf2/api/archery/ISpecialBow.java | 14 +- .../mf2/api/armour/ArmourDesign.java | 145 +- .../mf2/api/armour/ArmourMaterialMF.java | 32 +- .../mf2/api/armour/CustomArmourEntry.java | 151 +- .../api/armour/CustomDamageRatioEntry.java | 59 +- .../minefantasy/mf2/api/armour/IArmourMF.java | 15 +- .../mf2/api/armour/IArmourPenetrationMob.java | 3 +- .../mf2/api/armour/IArmourRating.java | 6 +- .../mf2/api/armour/IArmouredEntity.java | 3 +- .../mf2/api/armour/IElementalResistance.java | 23 +- .../mf2/api/armour/IGasProtector.java | 6 +- .../mf2/api/armour/IPowerArmour.java | 4 +- .../mf2/api/armour/ISpecialArmourMF.java | 11 +- .../mf2/api/armour/ItemArmourMFBase.java | 290 +- .../mf2/api/cooking/CookRecipe.java | 94 +- .../mf2/api/crafting/BasicTierRecipe.java | 291 +- .../mf2/api/crafting/CustomCrafterEntry.java | 69 +- .../mf2/api/crafting/IBasicMetre.java | 5 +- .../mf2/api/crafting/IHeatSource.java | 4 +- .../mf2/api/crafting/IQualityBalance.java | 6 +- .../mf2/api/crafting/ISalvageDrop.java | 5 +- .../mf2/api/crafting/ISpecialSalvage.java | 8 +- .../mf2/api/crafting/ITieredComponent.java | 3 +- .../mf2/api/crafting/MineFantasyFuels.java | 87 +- .../minefantasy/mf2/api/crafting/Salvage.java | 176 +- .../api/crafting/anvil/AnvilCraftMatrix.java | 17 +- .../crafting/anvil/CraftingManagerAnvil.java | 589 ++-- .../api/crafting/anvil/CustomToolRecipe.java | 290 +- .../mf2/api/crafting/anvil/IAnvil.java | 13 +- .../mf2/api/crafting/anvil/IAnvilRecipe.java | 69 +- .../api/crafting/anvil/RecipeSorterAnvil.java | 31 +- .../crafting/anvil/ShapedAnvilRecipes.java | 323 +-- .../crafting/anvil/ShapelessAnvilRecipes.java | 260 +- .../carpenter/CarpenterCraftMatrix.java | 13 +- .../carpenter/CraftingManagerCarpenter.java | 573 ++-- .../carpenter/CustomToolRecipeCarpenter.java | 231 +- .../api/crafting/carpenter/ICarpenter.java | 12 +- .../crafting/carpenter/ICarpenterRecipe.java | 63 +- .../carpenter/RecipeSorterCarpenter.java | 31 +- .../carpenter/ShapedCarpenterRecipes.java | 317 +-- .../carpenter/ShapelessCarpenterRecipes.java | 242 +- .../api/crafting/engineer/IBombComponent.java | 8 +- .../api/crafting/engineer/ICrossbowPart.java | 23 +- .../crafting/exotic/ISpecialCraftItem.java | 3 +- .../api/crafting/exotic/ISpecialDesign.java | 3 +- .../api/crafting/exotic/SpecialForging.java | 57 +- .../mf2/api/crafting/refine/BloomRecipe.java | 65 +- .../api/crafting/refine/PaintOilRecipe.java | 60 +- .../mf2/api/crafting/refine/QuernRecipes.java | 38 +- .../api/crafting/tanning/TanningRecipe.java | 64 +- .../mf2/api/farming/CustomHoeEntry.java | 62 +- .../mf2/api/heating/ForgeFuel.java | 10 +- .../mf2/api/heating/ForgeItemHandler.java | 47 +- .../minefantasy/mf2/api/heating/Heatable.java | 148 +- .../mf2/api/heating/IQuenchBlock.java | 4 +- .../mf2/api/heating/TongsHelper.java | 70 +- .../mf2/api/helpers/ArmourCalculator.java | 664 ++--- .../mf2/api/helpers/ArrowEffectsMF.java | 123 +- .../mf2/api/helpers/BlockPositionHelper.java | 117 +- .../mf2/api/helpers/ClientTickHandler.java | 26 +- .../mf2/api/helpers/CustomToolHelper.java | 726 +++-- .../mf2/api/helpers/EntityHelper.java | 18 +- .../mf2/api/helpers/Functions.java | 50 +- .../mf2/api/helpers/GuiHelper.java | 102 +- .../mf2/api/helpers/PlayerTagData.java | 19 +- .../mf2/api/helpers/PowerArmour.java | 94 +- .../mf2/api/helpers/RenderHelper.java | 33 +- .../mf2/api/helpers/TacticalManager.java | 602 ++-- .../mf2/api/helpers/TextureHelperMF.java | 104 +- .../mf2/api/helpers/ToolHelper.java | 348 +-- .../mf2/api/knowledge/IArtefact.java | 3 +- .../mf2/api/knowledge/InformationBase.java | 448 ++- .../mf2/api/knowledge/InformationList.java | 49 +- .../mf2/api/knowledge/InformationPage.java | 199 +- .../mf2/api/knowledge/ResearchArtefacts.java | 71 +- .../mf2/api/knowledge/ResearchLogic.java | 216 +- .../mf2/api/knowledge/client/EntryPage.java | 12 +- .../client/EntryPageBlastFurnace.java | 93 +- .../api/knowledge/client/EntryPageCraft.java | 57 +- .../knowledge/client/EntryPageCrucible.java | 144 +- .../api/knowledge/client/EntryPageGrind.java | 85 +- .../api/knowledge/client/EntryPageImage.java | 74 +- .../client/EntryPageRecipeAnvil.java | 192 +- .../knowledge/client/EntryPageRecipeBase.java | 192 +- .../client/EntryPageRecipeBloom.java | 86 +- .../client/EntryPageRecipeCarpenter.java | 176 +- .../knowledge/client/EntryPageSmelting.java | 86 +- .../api/knowledge/client/EntryPageText.java | 70 +- .../api/knowledge/client/IGuiRecipebook.java | 3 +- .../mf2/api/material/CustomMaterial.java | 295 +- .../mf2/api/mining/RandomDigs.java | 88 +- .../minefantasy/mf2/api/mining/RandomOre.java | 108 +- .../minefantasy/mf2/api/refine/Alloy.java | 121 +- .../mf2/api/refine/AlloyRecipes.java | 63 +- .../mf2/api/refine/BigFurnaceRecipes.java | 38 +- .../mf2/api/refine/BlastFurnaceRecipes.java | 97 +- .../mf2/api/refine/ISmokeCarrier.java | 6 +- .../mf2/api/refine/ISmokeHandler.java | 6 +- .../mf2/api/refine/SmokeMechanics.java | 141 +- .../minefantasy/mf2/api/rpg/LevelupEvent.java | 8 +- .../minefantasy/mf2/api/rpg/RPGElements.java | 120 +- .../java/minefantasy/mf2/api/rpg/Skill.java | 127 +- .../minefantasy/mf2/api/rpg/SkillList.java | 50 +- .../mf2/api/rpg/SyncSkillEvent.java | 8 +- .../mf2/api/stamina/IHeldStaminaItem.java | 5 +- .../mf2/api/stamina/IStaminaWeapon.java | 3 +- .../mf2/api/stamina/IWornStaminaItem.java | 14 +- .../mf2/api/stamina/StaminaBar.java | 623 ++-- .../mf2/api/tier/IToolMaterial.java | 3 +- .../mf2/api/tool/IHuntingItem.java | 3 +- .../minefantasy/mf2/api/tool/ILighter.java | 1 + .../minefantasy/mf2/api/tool/IToolMF.java | 10 +- .../mf2/api/weapon/DamageSourceAP.java | 9 +- .../mf2/api/weapon/ICustomHitSound.java | 4 +- .../mf2/api/weapon/IDamageModifier.java | 6 +- .../mf2/api/weapon/IDamageType.java | 24 +- .../mf2/api/weapon/IKnockbackWeapon.java | 3 +- .../mf2/api/weapon/IParryable.java | 11 +- .../mf2/api/weapon/IPowerAttack.java | 4 +- .../minefantasy/mf2/api/weapon/IRackItem.java | 4 +- .../mf2/api/weapon/ISharpenable.java | 8 +- .../mf2/api/weapon/ISpecialCombatMob.java | 3 +- .../mf2/api/weapon/ISpecialEffect.java | 3 +- .../mf2/api/weapon/IWeaponClass.java | 3 +- .../mf2/api/weapon/IWeaponSpeed.java | 3 +- .../mf2/api/weapon/IWeightedWeapon.java | 7 +- .../mf2/api/weapon/WeaponClass.java | 52 +- .../mf2/block/basic/BasicBlockMF.java | 56 +- .../mf2/block/basic/BlockMeta.java | 52 +- .../mf2/block/basic/BlockMetalBarsMF.java | 36 +- .../mf2/block/basic/BlockMetalMF.java | 18 +- .../mf2/block/basic/BlockMythicDecor.java | 3 +- .../mf2/block/basic/BlockMythicOre.java | 25 +- .../mf2/block/basic/BlockOreMF.java | 137 +- .../mf2/block/basic/BlockPaneMF.java | 12 +- .../mf2/block/basic/BlockReinforcedStone.java | 42 +- .../mf2/block/basic/BlockWorldGenMarker.java | 9 +- .../mf2/block/basic/ConstructionBlockMF.java | 239 +- .../mf2/block/basic/ItemMetaBlock.java | 42 +- .../mf2/block/basic/ItemOreblockMF.java | 29 +- .../mf2/block/crafting/BlockAnvilMF.java | 335 +-- .../mf2/block/crafting/BlockBombBench.java | 249 +- .../mf2/block/crafting/BlockBombPress.java | 132 +- .../mf2/block/crafting/BlockCarpenter.java | 246 +- .../mf2/block/crafting/BlockCogwork.java | 183 +- .../block/crafting/BlockCrossbowBench.java | 251 +- .../block/crafting/BlockEngineerTanner.java | 22 +- .../mf2/block/crafting/BlockFirepit.java | 335 +-- .../mf2/block/crafting/BlockFrame.java | 189 +- .../mf2/block/crafting/BlockRepairKit.java | 148 +- .../block/crafting/BlockResearchStation.java | 227 +- .../mf2/block/crafting/BlockRoast.java | 215 +- .../mf2/block/crafting/BlockSalvage.java | 246 +- .../mf2/block/crafting/BlockTanningRack.java | 226 +- .../mf2/block/crafting/ItemBlockAnvilMF.java | 10 +- .../block/crafting/ItemBlockRepairKit.java | 45 +- .../mf2/block/crafting/ItemBlockSalvage.java | 17 +- .../mf2/block/decor/BlockAmmoBox.java | 221 +- .../mf2/block/decor/BlockBedMF.java | 661 ++--- .../mf2/block/decor/BlockComponent.java | 386 ++- .../mf2/block/decor/BlockPowRailMF.java | 40 +- .../mf2/block/decor/BlockRack.java | 622 ++-- .../mf2/block/decor/BlockRailMF.java | 43 +- .../mf2/block/decor/BlockRoad.java | 379 ++- .../mf2/block/decor/BlockSchematic.java | 159 +- .../mf2/block/decor/BlockTrough.java | 145 +- .../mf2/block/decor/BlockWoodDecor.java | 129 +- .../mf2/block/decor/ItemBedMF.java | 130 +- .../mf2/block/decor/ItemBlockAmmoBox.java | 66 +- .../mf2/block/decor/ItemBlockToolRack.java | 46 +- .../mf2/block/decor/ItemBlockTrough.java | 175 +- .../mf2/block/food/BlockBerryBush.java | 354 ++- .../mf2/block/food/BlockCakeMF.java | 409 ++- .../minefantasy/mf2/block/food/BlockPie.java | 8 +- .../mf2/block/food/ItemBlockBerries.java | 14 +- .../mf2/block/food/ItemBlockCake.java | 50 +- .../mf2/block/list/BlockListMF.java | 293 +- .../mf2/block/refining/BlockBFC.java | 164 +- .../mf2/block/refining/BlockBFH.java | 251 +- .../mf2/block/refining/BlockBellows.java | 107 +- .../mf2/block/refining/BlockBigFurnace.java | 309 +- .../mf2/block/refining/BlockBloomery.java | 244 +- .../mf2/block/refining/BlockChimney.java | 162 +- .../mf2/block/refining/BlockCrucible.java | 356 ++- .../mf2/block/refining/BlockForge.java | 522 ++-- .../mf2/block/refining/BlockQuern.java | 203 +- .../block/tileentity/TileEntityAnvilMF.java | 1086 ++++--- .../block/tileentity/TileEntityBellows.java | 178 +- .../block/tileentity/TileEntityBerryBush.java | 31 +- .../tileentity/TileEntityBigFurnace.java | 1016 +++---- .../block/tileentity/TileEntityBloomery.java | 364 ++- .../block/tileentity/TileEntityBombBench.java | 478 ++-- .../block/tileentity/TileEntityBombPress.java | 37 +- .../tileentity/TileEntityCarpenterMF.java | 700 ++--- .../block/tileentity/TileEntityChimney.java | 255 +- .../block/tileentity/TileEntityComponent.java | 195 +- .../tileentity/TileEntityCrossbowBench.java | 324 +-- .../block/tileentity/TileEntityCrucible.java | 449 ++- .../block/tileentity/TileEntityFirepit.java | 328 +-- .../mf2/block/tileentity/TileEntityForge.java | 636 ++--- .../mf2/block/tileentity/TileEntityQuern.java | 281 +- .../block/tileentity/TileEntityResearch.java | 361 ++- .../mf2/block/tileentity/TileEntityRoad.java | 115 +- .../mf2/block/tileentity/TileEntityRoast.java | 396 ++- .../tileentity/TileEntityTanningRack.java | 413 ++- .../tileentity/TileEntityWorldGenMarker.java | 49 +- .../blastfurnace/TileEntityBlastFC.java | 305 +- .../blastfurnace/TileEntityBlastFH.java | 261 +- .../tileentity/decor/TileEntityAmmoBox.java | 221 +- .../tileentity/decor/TileEntityRack.java | 336 +-- .../tileentity/decor/TileEntityTrough.java | 119 +- .../tileentity/decor/TileEntityWoodDecor.java | 69 +- .../mf2/block/tree/BlockLeavesMF.java | 130 +- .../mf2/block/tree/BlockLogMF.java | 112 +- .../mf2/block/tree/BlockSaplingMF.java | 211 +- .../minefantasy/mf2/client/FontHelper.java | 9 +- .../mf2/client/KnowledgePageRegistry.java | 1201 +++++--- .../mf2/client/gui/GuiAnvilMF.java | 202 +- .../mf2/client/gui/GuiBigFurnace.java | 112 +- .../mf2/client/gui/GuiBlastChamber.java | 68 +- .../mf2/client/gui/GuiBlastHeater.java | 83 +- .../mf2/client/gui/GuiBloomery.java | 68 +- .../mf2/client/gui/GuiBombBench.java | 83 +- .../mf2/client/gui/GuiCarpenterMF.java | 185 +- .../mf2/client/gui/GuiCrossbowBench.java | 81 +- .../mf2/client/gui/GuiCrucible.java | 112 +- .../mf2/client/gui/GuiDiscovery.java | 261 +- .../minefantasy/mf2/client/gui/GuiForge.java | 90 +- .../mf2/client/gui/GuiKnowledge.java | 1343 +++++---- .../mf2/client/gui/GuiKnowledgeEntry.java | 268 +- .../minefantasy/mf2/client/gui/GuiQuern.java | 68 +- .../minefantasy/mf2/client/gui/GuiReload.java | 75 +- .../mf2/client/gui/GuiResearchBlock.java | 82 +- .../mf2/client/render/AnimationHandlerMF.java | 24 +- .../mf2/client/render/HudHandlerMF.java | 60 +- .../mf2/client/render/MineFantasyHUD.java | 892 +++--- .../mf2/client/render/ModelCogwork.java | 81 +- .../mf2/client/render/ModelParachute.java | 178 +- .../mf2/client/render/RenderArrowMF.java | 165 +- .../mf2/client/render/RenderBomb.java | 104 +- .../mf2/client/render/RenderBombIcon.java | 126 +- .../mf2/client/render/RenderBow.java | 392 ++- .../mf2/client/render/RenderCrossbow.java | 567 ++-- .../mf2/client/render/RenderDragonBreath.java | 136 +- .../mf2/client/render/RenderFireBlast.java | 57 +- .../mf2/client/render/RenderHeavyWeapon.java | 354 ++- .../mf2/client/render/RenderLance.java | 220 +- .../mf2/client/render/RenderMine.java | 104 +- .../mf2/client/render/RenderParachute.java | 126 +- .../mf2/client/render/RenderPowerArmour.java | 1125 ++++---- .../mf2/client/render/RenderSaw.java | 157 +- .../mf2/client/render/RenderShrapnel.java | 165 +- .../mf2/client/render/RenderSpear.java | 194 +- .../mf2/client/render/RenderSword.java | 250 +- .../client/render/armour/ModelFullplate.java | 54 +- .../mf2/client/render/block/ModelAmmoBox.java | 145 +- .../mf2/client/render/block/ModelAnvil.java | 172 +- .../mf2/client/render/block/ModelBellows.java | 199 +- .../client/render/block/ModelBigFurnace.java | 212 +- .../client/render/block/ModelBloomery.java | 115 +- .../client/render/block/ModelBombBench.java | 229 +- .../client/render/block/ModelBombPress.java | 198 +- .../client/render/block/ModelCarpenter.java | 159 +- .../render/block/ModelCrossbowBench.java | 224 +- .../render/block/ModelEngTanningRack.java | 175 +- .../mf2/client/render/block/ModelFirepit.java | 154 +- .../mf2/client/render/block/ModelFoodBox.java | 102 +- .../mf2/client/render/block/ModelForge.java | 25 +- .../client/render/block/ModelForgeTop.java | 167 +- .../mf2/client/render/block/ModelOven.java | 145 +- .../mf2/client/render/block/ModelQuern.java | 90 +- .../mf2/client/render/block/ModelRack.java | 156 +- .../client/render/block/ModelResearch.java | 216 +- .../mf2/client/render/block/ModelRoast.java | 132 +- .../client/render/block/ModelSmallCrate.java | 104 +- .../client/render/block/ModelTanningRack.java | 117 +- .../mf2/client/render/block/ModelTrough.java | 137 +- .../render/block/ModelWoodCarpenter.java | 261 +- .../client/render/block/RenderAmmoBox.java | 19 +- .../client/render/block/RenderAnvilMF.java | 14 +- .../client/render/block/RenderBellows.java | 14 +- .../client/render/block/RenderBigFurnace.java | 16 +- .../client/render/block/RenderBloomery.java | 23 +- .../client/render/block/RenderBombBench.java | 16 +- .../client/render/block/RenderBombPress.java | 9 +- .../client/render/block/RenderCarpenter.java | 9 +- .../render/block/RenderCrossbowBench.java | 9 +- .../client/render/block/RenderFirepit.java | 9 +- .../mf2/client/render/block/RenderForge.java | 16 +- .../mf2/client/render/block/RenderQuern.java | 16 +- .../mf2/client/render/block/RenderRack.java | 17 +- .../client/render/block/RenderResearch.java | 16 +- .../mf2/client/render/block/RenderRoast.java | 15 +- .../client/render/block/RenderSmokePipe.java | 18 +- .../render/block/RenderTanningRack.java | 16 +- .../mf2/client/render/block/RenderTrough.java | 16 +- .../block/TileEntityAmmoBoxRenderer.java | 169 +- .../block/TileEntityAnvilMFRenderer.java | 171 +- .../block/TileEntityBellowsRenderer.java | 165 +- .../block/TileEntityBigFurnaceRenderer.java | 163 +- .../block/TileEntityBloomeryRenderer.java | 173 +- .../block/TileEntityBombBenchRenderer.java | 177 +- .../block/TileEntityBombPressRenderer.java | 165 +- .../block/TileEntityCarpenterRenderer.java | 169 +- .../TileEntityCrossbowBenchRenderer.java | 177 +- .../block/TileEntityFirepitRenderer.java | 123 +- .../render/block/TileEntityForgeRenderer.java | 217 +- .../render/block/TileEntityQuernRenderer.java | 74 +- .../render/block/TileEntityRackRenderer.java | 452 ++- .../block/TileEntityResearchRenderer.java | 145 +- .../render/block/TileEntityRoastRenderer.java | 174 +- .../block/TileEntitySmokePipeRenderer.java | 72 +- .../block/TileEntityTanningRackRenderer.java | 237 +- .../block/TileEntityTroughRenderer.java | 202 +- .../render/block/component/ModelBarStack.java | 44 +- .../block/component/ModelBigPlateStack.java | 17 +- .../render/block/component/ModelJugStack.java | 33 +- .../block/component/ModelPlankStack.java | 36 +- .../render/block/component/ModelPotStack.java | 30 +- .../block/component/ModelSheetStack.java | 19 +- .../TileEntityComponentRenderer.java | 153 +- .../mf2/client/render/mob/ModelAshDragon.java | 1788 ++++++------ .../mf2/client/render/mob/ModelDragon.java | 1760 ++++++------ .../client/render/mob/ModelFrostDragon.java | 1988 +++++++------ .../mf2/client/render/mob/ModelHound.java | 21 +- .../mf2/client/render/mob/ModelMinotaur.java | 571 ++-- .../client/render/mob/ModelVenomDragon.java | 2196 ++++++++------- .../mf2/client/render/mob/RenderDragon.java | 68 +- .../mf2/client/render/mob/RenderHound.java | 125 +- .../mf2/client/render/mob/RenderMinotaur.java | 328 +-- .../minefantasy/mf2/config/ConfigArmour.java | 62 +- .../minefantasy/mf2/config/ConfigClient.java | 135 +- .../mf2/config/ConfigCrafting.java | 23 +- .../mf2/config/ConfigExperiment.java | 50 +- .../minefantasy/mf2/config/ConfigFarming.java | 25 +- .../mf2/config/ConfigHardcore.java | 112 +- .../mf2/config/ConfigItemRegistry.java | 439 ++- .../minefantasy/mf2/config/ConfigMobs.java | 216 +- .../minefantasy/mf2/config/ConfigStamina.java | 94 +- .../minefantasy/mf2/config/ConfigTools.java | 23 +- .../minefantasy/mf2/config/ConfigWeapon.java | 32 +- .../mf2/config/ConfigWorldGen.java | 441 ++- .../mf2/config/ConfigurationBaseMF.java | 18 +- .../mf2/container/ContainerAnvilMF.java | 221 +- .../mf2/container/ContainerBigFurnace.java | 409 ++- .../mf2/container/ContainerBlastChamber.java | 231 +- .../mf2/container/ContainerBlastHeater.java | 274 +- .../mf2/container/ContainerBloomery.java | 221 +- .../mf2/container/ContainerBombBench.java | 274 +- .../mf2/container/ContainerCarpenterMF.java | 239 +- .../mf2/container/ContainerCrossbowBench.java | 272 +- .../mf2/container/ContainerCrucible.java | 259 +- .../mf2/container/ContainerForge.java | 380 ++- .../mf2/container/ContainerQuern.java | 166 +- .../mf2/container/ContainerReload.java | 234 +- .../mf2/container/ContainerResearch.java | 226 +- .../mf2/container/ContainerRoast.java | 194 +- .../mf2/container/ContainerTanner.java | 196 +- .../mf2/container/InventoryReload.java | 38 +- .../mf2/container/SlotBombBench.java | 27 +- .../mf2/container/SlotCrucibleOut.java | 28 +- .../minefantasy/mf2/container/SlotReload.java | 15 +- .../mf2/container/SlotRestrictive.java | 17 +- .../minefantasy/mf2/entity/EntityArrowMF.java | 820 +++--- .../minefantasy/mf2/entity/EntityBomb.java | 767 +++-- .../minefantasy/mf2/entity/EntityCogwork.java | 1538 +++++----- .../mf2/entity/EntityDamageSourceBomb.java | 14 +- .../mf2/entity/EntityDragonBreath.java | 337 +-- .../mf2/entity/EntityFireBlast.java | 484 ++-- .../mf2/entity/EntityItemUnbreakable.java | 257 +- .../minefantasy/mf2/entity/EntityMine.java | 642 ++--- .../mf2/entity/EntityParachute.java | 1017 ++++--- .../mf2/entity/EntityShrapnel.java | 571 ++-- .../minefantasy/mf2/entity/EntitySmoke.java | 616 ++-- .../minefantasy/mf2/entity/Shockwave.java | 447 ++- .../mf2/entity/list/EntityListMF.java | 39 +- .../mf2/entity/list/MobListMF.java | 110 +- .../minefantasy/mf2/entity/mob/AshBreath.java | 39 +- .../mf2/entity/mob/DamageSourceMobMF.java | 44 +- .../mf2/entity/mob/DragonBreath.java | 35 +- .../mf2/entity/mob/DragonBreed.java | 185 +- .../mf2/entity/mob/EntityDragon.java | 1615 +++++------ .../mf2/entity/mob/EntityFlyingMF.java | 165 +- .../mf2/entity/mob/EntityHound.java | 1158 ++++---- .../mf2/entity/mob/EntityMinotaur.java | 1145 ++++---- .../mf2/entity/mob/EntityMobMF.java | 443 ++- .../mf2/entity/mob/FireBreath.java | 62 +- .../mf2/entity/mob/FrostBreath.java | 67 +- .../mf2/entity/mob/MinotaurBreed.java | 211 +- .../mf2/entity/mob/PoisonBreath.java | 62 +- .../mf2/entity/mob/ai/AI_CommonSprint.java | 29 +- .../entity/mob/ai/AI_MinotaurFindTarget.java | 177 +- .../mf2/entity/mob/ai/hound/AI_HoundBeg.java | 123 +- .../entity/mob/ai/hound/AI_HoundFollow.java | 201 +- .../mf2/farming/FarmingHelper.java | 59 +- .../mf2/hunger/HungerSystemMF.java | 144 +- .../mf2/integration/minetweaker/Skills.java | 31 +- .../minetweaker/TweakedAlloyRecipe.java | 33 +- .../minetweaker/TweakedShapedAnvilRecipe.java | 2 +- .../minetweaker/TweakedShapedCBRecipes.java | 2 +- .../TweakedShapelessCBRecipes.java | 46 +- .../minetweaker/tweakers/Anvil.java | 60 +- .../minetweaker/tweakers/CarpentersBench.java | 55 +- .../minetweaker/tweakers/Crucible.java | 18 +- .../minetweaker/tweakers/Forge.java | 25 +- .../minetweaker/tweakers/TanningRack.java | 28 +- .../integration/nei/RecipeHandlerAnvil.java | 4 +- .../nei/RecipeHandlerBigFurnace.java | 4 +- .../integration/nei/RecipeHandlerBloom.java | 12 +- .../nei/RecipeHandlerCarpenter.java | 2 +- .../integration/nei/RecipeHandlerQuern.java | 4 +- .../integration/nei/RecipeHandlerTanning.java | 7 +- .../mf2/item/AdvancedFuelHandlerMF.java | 31 +- .../minefantasy/mf2/item/ClientItemsMF.java | 21 +- .../minefantasy/mf2/item/FuelHandlerMF.java | 22 +- .../minefantasy/mf2/item/ItemArtefact.java | 169 +- .../minefantasy/mf2/item/ItemBandage.java | 264 +- .../minefantasy/mf2/item/ItemBurntFood.java | 30 +- .../minefantasy/mf2/item/ItemComponentMF.java | 370 ++- .../minefantasy/mf2/item/ItemFilledMould.java | 76 +- .../java/minefantasy/mf2/item/ItemHide.java | 121 +- .../java/minefantasy/mf2/item/ItemMFBowl.java | 114 +- .../minefantasy/mf2/item/ItemRawOreMF.java | 12 +- .../mf2/item/ItemResearchBook.java | 73 +- .../minefantasy/mf2/item/ItemSkillBook.java | 69 +- .../mf2/item/ItemSpecialDesign.java | 11 +- .../mf2/item/ItemWorldGenPlacer.java | 184 +- .../mf2/item/archery/ArrowFireFlint.java | 85 +- .../mf2/item/archery/ArrowFirerMF.java | 99 +- .../mf2/item/archery/ArrowType.java | 47 +- .../mf2/item/archery/EnumBowType.java | 24 +- .../mf2/item/archery/ItemArrowMF.java | 315 +-- .../mf2/item/archery/ItemBowMF.java | 694 +++-- .../mf2/item/armour/ItemApron.java | 21 +- .../mf2/item/armour/ItemArmourMF.java | 476 ++-- .../mf2/item/armour/ItemClothingMF.java | 58 +- .../mf2/item/armour/ItemCustomArmour.java | 224 +- .../mf2/item/custom/ItemCustomComponent.java | 250 +- .../minefantasy/mf2/item/food/FoodListMF.java | 224 +- .../minefantasy/mf2/item/food/ItemFoodMF.java | 416 ++- .../mf2/item/food/ItemMultiFood.java | 59 +- .../mf2/item/food/ItemUnfinishedFood.java | 46 +- .../mf2/item/gadget/EnumCasingType.java | 34 +- .../mf2/item/gadget/EnumExplosiveType.java | 25 +- .../mf2/item/gadget/EnumFuseType.java | 21 +- .../mf2/item/gadget/EnumPowderType.java | 21 +- .../mf2/item/gadget/ItemArtefactLoot.java | 28 +- .../minefantasy/mf2/item/gadget/ItemBomb.java | 569 ++-- .../mf2/item/gadget/ItemBombComponent.java | 51 +- .../mf2/item/gadget/ItemClimbingPick.java | 223 +- .../mf2/item/gadget/ItemCrossbow.java | 714 +++-- .../mf2/item/gadget/ItemCrossbowPart.java | 128 +- .../mf2/item/gadget/ItemCrudeBomb.java | 173 +- .../mf2/item/gadget/ItemExplodingArrow.java | 107 +- .../mf2/item/gadget/ItemExplodingBolt.java | 94 +- .../minefantasy/mf2/item/gadget/ItemJug.java | 222 +- .../mf2/item/gadget/ItemLootSack.java | 191 +- .../minefantasy/mf2/item/gadget/ItemMine.java | 459 ++- .../mf2/item/gadget/ItemParachute.java | 40 +- .../mf2/item/gadget/ItemSpyglass.java | 100 +- .../mf2/item/gadget/ItemSyringe.java | 377 ++- .../mf2/item/gadget/MobSpawnerMF.java | 191 +- .../mf2/item/heatable/ItemHeated.java | 151 +- .../mf2/item/list/ArmourListMF.java | 84 +- .../mf2/item/list/ComponentListMF.java | 290 +- .../mf2/item/list/CreativeTabMF.java | 77 +- .../mf2/item/list/CustomArmourListMF.java | 70 +- .../mf2/item/list/CustomToolListMF.java | 145 +- .../minefantasy/mf2/item/list/ToolListMF.java | 363 ++- .../item/list/styles/DragonforgedStyle.java | 248 +- .../mf2/item/list/styles/OrnateStyle.java | 230 +- .../minefantasy/mf2/item/tool/ItemAxeMF.java | 308 +- .../minefantasy/mf2/item/tool/ItemHoeMF.java | 253 +- .../mf2/item/tool/ItemLighterMF.java | 126 +- .../minefantasy/mf2/item/tool/ItemPickMF.java | 343 ++- .../mf2/item/tool/ItemShearsMF.java | 248 +- .../mf2/item/tool/ItemSpadeMF.java | 306 +- .../mf2/item/tool/ToolMaterialMF.java | 33 +- .../mf2/item/tool/advanced/ItemHandpick.java | 392 ++- .../mf2/item/tool/advanced/ItemHvyPick.java | 353 ++- .../mf2/item/tool/advanced/ItemHvyShovel.java | 370 ++- .../mf2/item/tool/advanced/ItemLumberAxe.java | 150 +- .../mf2/item/tool/advanced/ItemMattock.java | 413 ++- .../mf2/item/tool/advanced/ItemScythe.java | 511 ++-- .../mf2/item/tool/advanced/ItemTrowMF.java | 384 ++- .../tool/crafting/ItemBasicCraftTool.java | 162 +- .../item/tool/crafting/ItemEAnvilTools.java | 48 +- .../item/tool/crafting/ItemEngineerTool.java | 91 +- .../mf2/item/tool/crafting/ItemHammer.java | 355 ++- .../mf2/item/tool/crafting/ItemKnifeMF.java | 336 ++- .../mf2/item/tool/crafting/ItemNeedle.java | 317 +-- .../item/tool/crafting/ItemPaintBrush.java | 145 +- .../mf2/item/tool/crafting/ItemSaw.java | 346 ++- .../mf2/item/tool/crafting/ItemSpanner.java | 353 ++- .../mf2/item/tool/crafting/ItemTongs.java | 393 ++- .../mf2/item/weapon/ItemBattleaxeMF.java | 206 +- .../mf2/item/weapon/ItemDagger.java | 97 +- .../mf2/item/weapon/ItemGreatswordMF.java | 97 +- .../mf2/item/weapon/ItemHalbeardMF.java | 94 +- .../mf2/item/weapon/ItemHeavyWeaponMF.java | 99 +- .../mf2/item/weapon/ItemKatanaMF.java | 130 +- .../mf2/item/weapon/ItemLance.java | 152 +- .../mf2/item/weapon/ItemMaceMF.java | 81 +- .../mf2/item/weapon/ItemSpearMF.java | 209 +- .../mf2/item/weapon/ItemSwordMF.java | 65 +- .../mf2/item/weapon/ItemWaraxeMF.java | 205 +- .../mf2/item/weapon/ItemWarhammerMF.java | 86 +- .../mf2/item/weapon/ItemWeaponMF.java | 937 +++---- .../mf2/knowledge/ArtefactListMF.java | 97 +- .../mf2/knowledge/KnowledgeListMF.java | 784 ++++-- .../mf2/material/BaseMaterialMF.java | 327 +-- .../mf2/material/LeatherMaterial.java | 32 +- .../mf2/material/MetalMaterial.java | 208 +- .../mf2/material/WoodMaterial.java | 170 +- .../mf2/mechanics/ArrowHandlerMF.java | 196 +- .../mf2/mechanics/ArrowListMF.java | 16 +- .../mf2/mechanics/BombDispenser.java | 105 +- .../mf2/mechanics/CombatMechanics.java | 1235 ++++---- .../mf2/mechanics/EventManagerMF.java | 1108 ++++---- .../mf2/mechanics/ExtendedReachMF.java | 189 +- .../mf2/mechanics/HitSoundGenerator.java | 49 +- .../mf2/mechanics/MFArrowDispenser.java | 77 +- .../mf2/mechanics/MonsterUpgrader.java | 187 +- .../mf2/mechanics/PlayerTickHandlerMF.java | 614 ++-- .../mf2/mechanics/StaminaMechanics.java | 256 +- .../minefantasy/mf2/mechanics/TierHelper.java | 31 +- .../worldGen/WorldGenBiological.java | 162 +- .../mf2/mechanics/worldGen/WorldGenBush.java | 35 +- .../worldGen/WorldGenDuelMinable.java | 144 +- .../worldGen/WorldGenGeological.java | 191 +- .../mechanics/worldGen/WorldGenMFBase.java | 17 +- .../mechanics/worldGen/WorldGenMFTree.java | 957 +++---- .../mechanics/worldGen/WorldGenMinableMF.java | 139 +- .../worldGen/WorldGenStructures.java | 128 +- .../structure/StructureGenAFRoom.java | 117 +- .../structure/StructureGenAncientAlter.java | 119 +- .../structure/StructureGenAncientForge.java | 203 +- .../StructureGenAncientForgeEntry.java | 58 +- .../worldGen/structure/StructureModuleMF.java | 385 ++- .../structure/WorldGenAncientAlter.java | 34 +- .../structure/WorldGenAncientForge.java | 55 +- .../structure/WorldGenStructureBase.java | 89 +- .../dwarven/StructureDSSurfaceAppendage.java | 287 +- .../dwarven/StructureGenDSCrossroads.java | 320 +-- .../dwarven/StructureGenDSEntry.java | 264 +- .../structure/dwarven/StructureGenDSHall.java | 281 +- .../dwarven/StructureGenDSIntersection.java | 169 +- .../structure/dwarven/StructureGenDSRoom.java | 682 ++--- .../dwarven/StructureGenDSRoomSml.java | 205 +- .../dwarven/StructureGenDSRoomSml2.java | 206 +- .../dwarven/StructureGenDSStairs.java | 298 +- .../dwarven/WorldGenDwarvenStronghold.java | 72 +- .../mf2/network/ClientProxyMF.java | 9 +- .../mf2/network/CommonProxyMF.java | 163 +- .../mf2/network/packet/AmmoBoxPacket.java | 42 +- .../mf2/network/packet/AnvilPacket.java | 92 +- .../mf2/network/packet/BigFurnacePacket.java | 69 +- .../mf2/network/packet/BloomeryPacket.java | 44 +- .../mf2/network/packet/BombBenchPacket.java | 48 +- .../mf2/network/packet/CarpenterPacket.java | 72 +- .../mf2/network/packet/ChimneyPacket.java | 44 +- .../network/packet/CogworkControlPacket.java | 27 +- .../network/packet/CrossbowBenchPacket.java | 48 +- .../mf2/network/packet/DodgeCommand.java | 32 +- .../mf2/network/packet/FirepitPacket.java | 42 +- .../mf2/network/packet/ForgePacket.java | 69 +- .../mf2/network/packet/HitSoundPacket.java | 37 +- .../mf2/network/packet/KnowledgePacket.java | 68 +- .../mf2/network/packet/LevelupPacket.java | 47 +- .../mf2/network/packet/PacketHandlerMF.java | 114 +- .../mf2/network/packet/PacketMF.java | 20 +- .../mf2/network/packet/ParryPacket.java | 36 +- .../mf2/network/packet/RackCommand.java | 28 +- .../mf2/network/packet/ResearchRequest.java | 46 +- .../network/packet/ResearchTablePacket.java | 59 +- .../mf2/network/packet/RoadPacket.java | 74 +- .../mf2/network/packet/SkillPacket.java | 40 +- .../mf2/network/packet/StaminaPacket.java | 49 +- .../network/packet/StorageBlockPacket.java | 58 +- .../mf2/network/packet/TannerPacket.java | 38 +- .../network/packet/TileInventoryPacket.java | 66 +- .../mf2/network/packet/TroughPacket.java | 38 +- .../mf2/network/packet/WoodDecorPacket.java | 38 +- .../mf2/recipe/BasicRecipesMF.java | 560 ++-- .../mf2/recipe/CarpenterRecipes.java | 2496 ++++++----------- .../mf2/recipe/ComponentAnvilRecipe.java | 133 +- .../mf2/recipe/CookingRecipes.java | 142 +- .../mf2/recipe/CustomWoodRecipes.java | 159 +- .../mf2/recipe/ForgedArmourRecipes.java | 464 +-- .../mf2/recipe/ForgedToolRecipes.java | 969 ++----- .../mf2/recipe/ForgingRecipes.java | 1041 +++---- .../mf2/recipe/RecipeArmourDyeMF.java | 270 +- .../minefantasy/mf2/recipe/RecipeRemover.java | 35 +- .../minefantasy/mf2/recipe/RecipeSyringe.java | 147 +- .../mf2/recipe/SalvageRecipes.java | 41 +- .../mf2/recipe/SmeltingRecipesMF.java | 180 +- .../minefantasy/mf2/recipe/TempRecipesMF.java | 154 +- .../java/minefantasy/mf2/util/MFLogUtil.java | 32 +- .../java/mods/battlegear2/api/IAllowItem.java | 5 +- .../mods/battlegear2/api/IDefaultRender.java | 58 +- .../java/mods/battlegear2/api/IDyable.java | 31 +- .../mods/battlegear2/api/IEnchantable.java | 6 +- .../mods/battlegear2/api/IOffhandDual.java | 103 +- .../java/mods/battlegear2/api/ISheathed.java | 13 +- .../battlegear2/api/PlayerEventChild.java | 421 +-- .../battlegear2/api/RenderItemBarEvent.java | 103 +- .../battlegear2/api/core/IBattlePlayer.java | 19 +- .../battlegear2/api/core/IOffhandRender.java | 22 +- .../api/core/InventoryPlayerBattle.java | 712 +++-- .../api/core/InventorySlotType.java | 24 +- .../battlegear2/api/core/package-info.java | 1 - .../mods/battlegear2/api/heraldry/Crest.java | 156 +- .../api/heraldry/HeraldryData.java | 274 +- .../api/heraldry/HeraldryDataBackup.java | 276 +- .../api/heraldry/HeraldryPattern.java | 54 +- .../api/heraldry/HeraldryTextureSmall.java | 40 +- .../battlegear2/api/heraldry/IFlagHolder.java | 67 +- .../api/heraldry/IHeraldryItem.java | 107 +- .../api/heraldry/IHeraldyArmour.java | 6 +- .../mods/battlegear2/api/heraldry/ITool.java | 8 +- .../api/heraldry/PatternStore.java | 346 ++- .../api/heraldry/RefreshableTexture.java | 89 +- .../api/heraldry/package-info.java | 1 - .../mods/battlegear2/api/package-info.java | 1 - .../api/quiver/IArrowContainer2.java | 204 +- .../api/quiver/IArrowFireHandler.java | 47 +- .../api/quiver/IQuiverSelection.java | 17 +- .../api/quiver/QuiverArrowRegistry.java | 381 +-- .../battlegear2/api/quiver/package-info.java | 1 - .../battlegear2/api/shield/IArrowCatcher.java | 22 +- .../battlegear2/api/shield/IArrowDisplay.java | 10 +- .../mods/battlegear2/api/shield/IShield.java | 146 +- .../battlegear2/api/shield/ShieldType.java | 101 +- .../battlegear2/api/shield/package-info.java | 1 - .../api/weapons/IBackStabbable.java | 3 +- .../api/weapons/IBattlegearWeapon.java | 2 +- .../api/weapons/IExtendedReachWeapon.java | 4 +- .../api/weapons/IHitTimeModifier.java | 2 +- .../api/weapons/IPenetrateWeapon.java | 5 +- .../api/weapons/IPotionEffect.java | 24 +- .../api/weapons/ISpecialEffect.java | 5 +- .../api/weapons/WeaponRegistry.java | 88 +- .../battlegear2/api/weapons/package-info.java | 1 - 652 files changed, 56388 insertions(+), 65923 deletions(-) diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 5bd5d542..6caf57ca 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -80,7 +80,7 @@ public void preInit(FMLPreInitializationEvent event) { new ConfigArmour().setConfig(getCfg(event, "Armours")); new ConfigExperiment().setConfig(getCfg(event, "Specials")); new ConfigHardcore().setConfig(getCfg(event, "Hardcore")); - new ConfigIntegration().setConfig(getCfg(event, "Integration")); + new ConfigIntegration().setConfig(getCfg(event, "Integration")); new ConfigTools().setConfig(getCfg(event, "Tools")); new ConfigWeapon().setConfig(getCfg(event, "Weapons")); new ConfigStamina().setConfig(getCfg(event, "Stamina_System")); @@ -115,8 +115,8 @@ public void load(FMLInitializationEvent evt) { eventChannel.register(packetHandler); packetHandler.channels.put(channel, eventChannel); } - - if(Loader.isModLoaded("MineTweaker3") && ConfigIntegration.mtIntegration) { + + if (Loader.isModLoaded("MineTweaker3") && ConfigIntegration.mtIntegration) { MTCompat.loadTweakers(); } } diff --git a/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java b/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java index 25991791..11186461 100644 --- a/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java +++ b/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java @@ -23,375 +23,446 @@ import minefantasy.mf2.api.refine.BigFurnaceRecipes; import minefantasy.mf2.api.refine.BlastFurnaceRecipes; import minefantasy.mf2.api.rpg.Skill; -import minefantasy.mf2.item.archery.ItemArrowMF; import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; import net.minecraftforge.oredict.OreDictionary; -public class MineFantasyAPI -{ +public class MineFantasyAPI { /** * This variable saves if MineFantasy is in debug mode */ public static boolean isInDebugMode; - + @SideOnly(Side.CLIENT) - public static void init() - { + public static void init() { } - public static void debugMsg(String msg) - { + + public static void debugMsg(String msg) { MFLogUtil.logDebug(msg); } - public static void removeAllRecipes(Item result) - { + public static void removeAllRecipes(Item result) { List recipeList = CraftingManager.getInstance().getRecipeList(); - for(int i = 0; i < recipeList.size(); i++) - { - IRecipe recipe = (IRecipe)recipeList.get(i); - if(recipe != null && recipe.getRecipeOutput() != null && recipe.getRecipeOutput().getItem() == result) - { + for (int i = 0; i < recipeList.size(); i++) { + IRecipe recipe = (IRecipe) recipeList.get(i); + if (recipe != null && recipe.getRecipeOutput() != null && recipe.getRecipeOutput().getItem() == result) { debugMsg("Removed Recipe for " + recipe.getRecipeOutput().getDisplayName()); } } } - + /** * Adds a shaped recipe for anvils with all variables * - * @param result The output item - * @param hot True if the result is hot(Does not apply to blocks) - * @param experiance the experiance gained from crafting - * @param toolType the tool type required to hit ("hammer", "hvyHammer", etc) - * @param hammerType the hammer tier required for creation: - * @param anvil the anvil required bronze 0, iron 1, steel 2 - * @param forgeTime The time taken to forge(default is 200. each hit is about 100) - * @param input The input for the item (Exactly the same as regular recipes) + * @param result + * The output item + * @param hot + * True if the result is hot(Does not apply to blocks) + * @param experiance + * the experiance gained from crafting + * @param toolType + * the tool type required to hit ("hammer", "hvyHammer", etc) + * @param hammerType + * the hammer tier required for creation: + * @param anvil + * the anvil required bronze 0, iron 1, steel 2 + * @param forgeTime + * The time taken to forge(default is 200. each hit is about 100) + * @param input + * The input for the item (Exactly the same as regular recipes) */ - public static void addAnvilRecipe(Skill skill, ItemStack result, boolean hot, String toolType, int hammerType, int anvil, int forgeTime, Object... input) - { - CraftingManagerAnvil.getInstance().addRecipe(result, skill, "", hot, 0F, toolType, hammerType, anvil, forgeTime, input); + public static void addAnvilRecipe(Skill skill, ItemStack result, boolean hot, String toolType, int hammerType, + int anvil, int forgeTime, Object... input) { + CraftingManagerAnvil.getInstance().addRecipe(result, skill, "", hot, 0F, toolType, hammerType, anvil, forgeTime, + input); } + /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static void addAnvilRecipe(Skill skill, ItemStack result, boolean hot, int hammerType, int anvil, int forgeTime, Object... input) - { + public static void addAnvilRecipe(Skill skill, ItemStack result, boolean hot, int hammerType, int anvil, + int forgeTime, Object... input) { addAnvilRecipe(skill, result, hot, "hammer", hammerType, anvil, forgeTime, input); } - + /** * Adds a shaped recipe for anvils with all variables * - * @param result The output item - * @param research The research required - * @param hot True if the result is hot(Does not apply to blocks) - * @param experiance the experiance gained from crafting - * @param toolType the tool type required to hit ("hammer", "hvyHammer", etc) - * @param hammerType the hammer tier required for creation: - * @param anvil the anvil required bronze 0, iron 1, steel 2 - * @param forgeTime The time taken to forge(default is 200. each hit is about 100) - * @param input The input for the item (Exactly the same as regular recipes) + * @param result + * The output item + * @param research + * The research required + * @param hot + * True if the result is hot(Does not apply to blocks) + * @param experiance + * the experiance gained from crafting + * @param toolType + * the tool type required to hit ("hammer", "hvyHammer", etc) + * @param hammerType + * the hammer tier required for creation: + * @param anvil + * the anvil required bronze 0, iron 1, steel 2 + * @param forgeTime + * The time taken to forge(default is 200. each hit is about 100) + * @param input + * The input for the item (Exactly the same as regular recipes) */ - public static IAnvilRecipe addAnvilRecipe(Skill skill, ItemStack result, String research, boolean hot, String toolType, int hammerType, int anvil, int forgeTime, Object... input) - { - return CraftingManagerAnvil.getInstance().addRecipe(result, skill, research, hot, 0F, toolType, hammerType, anvil, forgeTime, input); + public static IAnvilRecipe addAnvilRecipe(Skill skill, ItemStack result, String research, boolean hot, + String toolType, int hammerType, int anvil, int forgeTime, Object... input) { + return CraftingManagerAnvil.getInstance().addRecipe(result, skill, research, hot, 0F, toolType, hammerType, + anvil, forgeTime, input); } + /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static IAnvilRecipe addAnvilRecipe(Skill skill, ItemStack result, String research, boolean hot, int hammerType, int anvil, int forgeTime, Object... input) - { + public static IAnvilRecipe addAnvilRecipe(Skill skill, ItemStack result, String research, boolean hot, + int hammerType, int anvil, int forgeTime, Object... input) { return addAnvilRecipe(skill, result, research, hot, "hammer", hammerType, anvil, forgeTime, input); } + /** * A special tier-sensitive recipe system for tools - * @param skill the Skill used - * @param result what item comes out (basic itemstack) - * @param research what research is used - * @param hot whether it requires quenching - * @param toolType the tool used (hammer or hvyHammer) - * @param hammerType the tier of hammer - * @param anvil the tier of anvil - * @param forgeTime the time it takes to forge - * @param input the items input + * + * @param skill + * the Skill used + * @param result + * what item comes out (basic itemstack) + * @param research + * what research is used + * @param hot + * whether it requires quenching + * @param toolType + * the tool used (hammer or hvyHammer) + * @param hammerType + * the tier of hammer + * @param anvil + * the tier of anvil + * @param forgeTime + * the time it takes to forge + * @param input + * the items input * @return */ - public static IAnvilRecipe addAnvilToolRecipe(Skill skill, ItemStack result, String research, boolean hot, String toolType, int hammerType, int anvil, int forgeTime, Object... input) - { - return CraftingManagerAnvil.getInstance().addToolRecipe(result, skill, research, hot, 0F, toolType, hammerType, anvil, forgeTime, input); + public static IAnvilRecipe addAnvilToolRecipe(Skill skill, ItemStack result, String research, boolean hot, + String toolType, int hammerType, int anvil, int forgeTime, Object... input) { + return CraftingManagerAnvil.getInstance().addToolRecipe(result, skill, research, hot, 0F, toolType, hammerType, + anvil, forgeTime, input); } - public static IAnvilRecipe addAnvilToolRecipe(Skill skill, Item result, String research, boolean hot, String toolType, int hammerType, int anvil, int forgeTime, Object... input) - { - return addAnvilToolRecipe(skill, new ItemStack(result), research, hot, toolType, hammerType, anvil, forgeTime, input); + + public static IAnvilRecipe addAnvilToolRecipe(Skill skill, Item result, String research, boolean hot, + String toolType, int hammerType, int anvil, int forgeTime, Object... input) { + return addAnvilToolRecipe(skill, new ItemStack(result), research, hot, toolType, hammerType, anvil, forgeTime, + input); } - + /** * Adds a shaped recipe for carpenter benches sensetive to tiers * - * @param result The output item (basic itemstack) - * @param sound The sound it makes ("minefantasy2:blocks.carpentermallet"), "step.wood", etc - * @param experience the experience gained from crafting - * @param toolType the tool type required to hit - * @param toolTier the tools tier required for creation: - * @param craftTime The time taken to craft(default is 200. each hit is about 100) - * @param input The input for the item (Exactly the same as regular recipes) + * @param result + * The output item (basic itemstack) + * @param sound + * The sound it makes ("minefantasy2:blocks.carpentermallet"), + * "step.wood", etc + * @param experience + * the experience gained from crafting + * @param toolType + * the tool type required to hit + * @param toolTier + * the tools tier required for creation: + * @param craftTime + * The time taken to craft(default is 200. each hit is about 100) + * @param input + * The input for the item (Exactly the same as regular recipes) */ - public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, ItemStack result, String research, String sound, String toolType, int toolTier, int craftTime, Object... input) - { - return CraftingManagerCarpenter.getInstance().addToolRecipe(result, skill, research, sound, 0F, toolType, toolTier, -1, craftTime, input); + public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, ItemStack result, String research, String sound, + String toolType, int toolTier, int craftTime, Object... input) { + return CraftingManagerCarpenter.getInstance().addToolRecipe(result, skill, research, sound, 0F, toolType, + toolTier, -1, craftTime, input); } - public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, Item result, String research, String sound, String toolType, int toolTier, int craftTime, Object... input) - { - return CraftingManagerCarpenter.getInstance().addToolRecipe(new ItemStack(result), skill, research, sound, 0F, toolType, toolTier, -1, craftTime, input); + + public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, Item result, String research, String sound, + String toolType, int toolTier, int craftTime, Object... input) { + return CraftingManagerCarpenter.getInstance().addToolRecipe(new ItemStack(result), skill, research, sound, 0F, + toolType, toolTier, -1, craftTime, input); } - public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, Item result, String research, String sound, int craftTime, Object... input) - { - return CraftingManagerCarpenter.getInstance().addToolRecipe(new ItemStack(result), skill, research, sound, 0F, "hands", -1, -1, craftTime, input); + + public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, Item result, String research, String sound, + int craftTime, Object... input) { + return CraftingManagerCarpenter.getInstance().addToolRecipe(new ItemStack(result), skill, research, sound, 0F, + "hands", -1, -1, craftTime, input); } - + /** * Adds a shaped recipe for carpenter benches with all variables * - * @param result The output item - * @param sound The sound it makes ("minefantasy2:blocks.carpentermallet"), "step.wood", etc - * @param experience the experience gained from crafting - * @param toolType the tool type required to hit - * @param toolTier the tools tier required for creation: - * @param craftTime The time taken to craft(default is 200. each hit is about 100) - * @param input The input for the item (Exactly the same as regular recipes) + * @param result + * The output item + * @param sound + * The sound it makes ("minefantasy2:blocks.carpentermallet"), + * "step.wood", etc + * @param experience + * the experience gained from crafting + * @param toolType + * the tool type required to hit + * @param toolTier + * the tools tier required for creation: + * @param craftTime + * The time taken to craft(default is 200. each hit is about 100) + * @param input + * The input for the item (Exactly the same as regular recipes) */ - public static void addCarpenterRecipe(Skill skill, ItemStack result, String sound, String toolType, int toolTier, int craftTime, Object... input) - { - CraftingManagerCarpenter.getInstance().addRecipe(result, skill, "", sound, 0F, toolType, toolTier, -1, craftTime, input); + public static void addCarpenterRecipe(Skill skill, ItemStack result, String sound, String toolType, int toolTier, + int craftTime, Object... input) { + CraftingManagerCarpenter.getInstance().addRecipe(result, skill, "", sound, 0F, toolType, toolTier, -1, + craftTime, input); } + /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static void addCarpenterRecipe(Skill skill, ItemStack result, String sound, int craftTime, Object... input) - { + public static void addCarpenterRecipe(Skill skill, ItemStack result, String sound, int craftTime, Object... input) { addCarpenterRecipe(skill, result, "", sound, "hands", -1, craftTime, input); } + /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static void addShapelessCarpenterRecipe(Skill skill, ItemStack result, String sound, String toolType, int toolTier, int craftTime, Object... input) - { - CraftingManagerCarpenter.getInstance().addShapelessRecipe(result, skill, "", sound, 0F, toolType, toolTier, -1, craftTime, input); + public static void addShapelessCarpenterRecipe(Skill skill, ItemStack result, String sound, String toolType, + int toolTier, int craftTime, Object... input) { + CraftingManagerCarpenter.getInstance().addShapelessRecipe(result, skill, "", sound, 0F, toolType, toolTier, -1, + craftTime, input); } + /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static void addShapelessCarpenterRecipe(Skill skill, ItemStack result, String sound, int craftTime, Object... input) - { - addShapelessCarpenterRecipe(skill, result, sound, "hands", -1, craftTime, input); + public static void addShapelessCarpenterRecipe(Skill skill, ItemStack result, String sound, int craftTime, + Object... input) { + addShapelessCarpenterRecipe(skill, result, sound, "hands", -1, craftTime, input); } - + /** - * Adds a basic carpenter recipe similar to regular crafting - * This uses a single hit with bare hands + * Adds a basic carpenter recipe similar to regular crafting This uses a single + * hit with bare hands */ - public static ICarpenterRecipe addBasicCarpenterRecipe(ItemStack result, Object... input) - { - return CraftingManagerCarpenter.getInstance().addRecipe(result, null, "", "dig.wood", 0F, "hands", -1, -1, 1, input); + public static ICarpenterRecipe addBasicCarpenterRecipe(ItemStack result, Object... input) { + return CraftingManagerCarpenter.getInstance().addRecipe(result, null, "", "dig.wood", 0F, "hands", -1, -1, 1, + input); } + /** * Adds a shaped recipe for carpenter benches with all variables * - * @param result The output item - * @param research The research required - * @param sound The sound it makes ("minefantasy2:blocks.carpentermallet"), "step.wood", etc - * @param experience the experience gained from crafting - * @param toolType the tool type required to hit - * @param toolTier the tools tier required for creation: - * @param craftTime The time taken to craft(default is 200. each hit is about 100) - * @param input The input for the item (Exactly the same as regular recipes) + * @param result + * The output item + * @param research + * The research required + * @param sound + * The sound it makes ("minefantasy2:blocks.carpentermallet"), + * "step.wood", etc + * @param experience + * the experience gained from crafting + * @param toolType + * the tool type required to hit + * @param toolTier + * the tools tier required for creation: + * @param craftTime + * The time taken to craft(default is 200. each hit is about 100) + * @param input + * The input for the item (Exactly the same as regular recipes) */ - public static ICarpenterRecipe addCarpenterRecipe(Skill skill, ItemStack result, String research, String sound, String toolType, int toolTier, int craftTime, Object... input) - { - return CraftingManagerCarpenter.getInstance().addRecipe(result, skill, research, sound, 0F, toolType, toolTier, -1, craftTime, input); + public static ICarpenterRecipe addCarpenterRecipe(Skill skill, ItemStack result, String research, String sound, + String toolType, int toolTier, int craftTime, Object... input) { + return CraftingManagerCarpenter.getInstance().addRecipe(result, skill, research, sound, 0F, toolType, toolTier, + -1, craftTime, input); } + /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static ICarpenterRecipe addCarpenterRecipe(Skill skill, ItemStack result, String research, String sound, int craftTime, Object... input) - { + public static ICarpenterRecipe addCarpenterRecipe(Skill skill, ItemStack result, String research, String sound, + int craftTime, Object... input) { return addCarpenterRecipe(skill, result, research, sound, "hands", -1, craftTime, input); } + /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static ICarpenterRecipe addShapelessCarpenterRecipe(Skill skill, ItemStack result, String research, String sound, String toolType, int toolTier, int craftTime, Object... input) - { - return CraftingManagerCarpenter.getInstance().addShapelessRecipe(result, skill, research, sound, 0F, toolType, toolTier, -1, craftTime, input); + public static ICarpenterRecipe addShapelessCarpenterRecipe(Skill skill, ItemStack result, String research, + String sound, String toolType, int toolTier, int craftTime, Object... input) { + return CraftingManagerCarpenter.getInstance().addShapelessRecipe(result, skill, research, sound, 0F, toolType, + toolTier, -1, craftTime, input); } + /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static ICarpenterRecipe addShapelessCarpenterRecipe(Skill skill, ItemStack result, String research, String sound, int craftTime, Object... input) - { - return addShapelessCarpenterRecipe(skill, result, research, sound, "hands", -1, craftTime, input); + public static ICarpenterRecipe addShapelessCarpenterRecipe(Skill skill, ItemStack result, String research, + String sound, int craftTime, Object... input) { + return addShapelessCarpenterRecipe(skill, result, research, sound, "hands", -1, craftTime, input); } - public static void addBlastFurnaceRecipe(Block input, ItemStack output) - { + public static void addBlastFurnaceRecipe(Block input, ItemStack output) { BlastFurnaceRecipes.smelting().addRecipe(input, output); } - public static void addBlastFurnaceRecipe(Item input, ItemStack output) - { + + public static void addBlastFurnaceRecipe(Item input, ItemStack output) { BlastFurnaceRecipes.smelting().addRecipe(input, output); } - public static void addBlastFurnaceRecipe(ItemStack input, ItemStack output) - { + + public static void addBlastFurnaceRecipe(ItemStack input, ItemStack output) { BlastFurnaceRecipes.smelting().addRecipe(input, output); } + /** - * This fuel handler is for MineFantasy equipment, it uses real fuel(like coal) not wood + * This fuel handler is for MineFantasy equipment, it uses real fuel(like coal) + * not wood */ private static List fuelHandlers = Lists.newArrayList(); - public static void registerFuelHandler(IFuelHandler handler) - { - fuelHandlers.add(handler); - } - public static int getFuelValue(ItemStack itemStack) - { - int fuelValue = 0; - for (IFuelHandler handler : fuelHandlers) - { - fuelValue = Math.max(fuelValue, handler.getBurnTime(itemStack)); - } - return fuelValue; - } - - /** + + public static void registerFuelHandler(IFuelHandler handler) { + fuelHandlers.add(handler); + } + + public static int getFuelValue(ItemStack itemStack) { + int fuelValue = 0; + for (IFuelHandler handler : fuelHandlers) { + fuelValue = Math.max(fuelValue, handler.getBurnTime(itemStack)); + } + return fuelValue; + } + + /** * Adds an alloy for any Crucible - * @param out The result - * @param in The list of required items + * + * @param out + * The result + * @param in + * The list of required items */ - public static void addAlloy(ItemStack out, Object... in) - { + public static void addAlloy(ItemStack out, Object... in) { AlloyRecipes.addAlloy(out, convertList(in)); } - + /** * Adds an alloy with a minimal furnace level - * @param out The result - * @param level The minimal furnace level - * @param in The list of required items + * + * @param out + * The result + * @param level + * The minimal furnace level + * @param in + * The list of required items */ - public static void addAlloy(ItemStack out, int level, Object... in) - { + public static void addAlloy(ItemStack out, int level, Object... in) { AlloyRecipes.addAlloy(out, level, convertList(in)); } - - + /** * Adds an alloy with a minimal furnace level - * @param dupe the amount of times the ratio can be added - * @param out The result - * @param level The minimal furnace level - * @param in The list of required items + * + * @param dupe + * the amount of times the ratio can be added + * @param out + * The result + * @param level + * The minimal furnace level + * @param in + * The list of required items */ - public static Alloy[] addRatioAlloy(int dupe, ItemStack out, int level, Object... in) - { + public static Alloy[] addRatioAlloy(int dupe, ItemStack out, int level, Object... in) { return AlloyRecipes.addRatioRecipe(out, level, convertList(in), dupe); } - + /** * Adds an alloy with any smelter - * @param dupe the amount of times the ratio can be added - * @param out The result - * @param level The minimal furnace level - * @param in The list of required items + * + * @param dupe + * the amount of times the ratio can be added + * @param out + * The result + * @param level + * The minimal furnace level + * @param in + * The list of required items */ - public static Alloy[] addRatioAlloy(int dupe, ItemStack out, Object... in) - { + public static Alloy[] addRatioAlloy(int dupe, ItemStack out, Object... in) { return AlloyRecipes.addRatioRecipe(out, 0, convertList(in), dupe); } - + /** * Adds a custom alloy - * @param alloy the Alloy to add - * Use this if you want your alloy to have special properties + * + * @param alloy + * the Alloy to add Use this if you want your alloy to have special + * properties * @see Alloy */ - public static void addAlloy(Alloy alloy) - { + public static void addAlloy(Alloy alloy) { AlloyRecipes.addAlloy(alloy); } - - private static List convertList(Object[] in) - { + + private static List convertList(Object[] in) { ArrayList arraylist = new ArrayList(); - Object[] aobject = in; - int i = in.length; - - for (int j = 0; j < i; ++j) - { - Object object1 = aobject[j]; - - if (object1 instanceof ItemStack) - { - arraylist.add(((ItemStack)object1).copy()); - } - else if (object1 instanceof Item) - { - arraylist.add(new ItemStack((Item)object1)); - } - else - { - if (!(object1 instanceof Block)) - { - throw new RuntimeException("MineFantasy: Invalid alloy!"); - } - - arraylist.add(new ItemStack((Block)object1)); - } - } - - return arraylist; - } - + Object[] aobject = in; + int i = in.length; + + for (int j = 0; j < i; ++j) { + Object object1 = aobject[j]; + + if (object1 instanceof ItemStack) { + arraylist.add(((ItemStack) object1).copy()); + } else if (object1 instanceof Item) { + arraylist.add(new ItemStack((Item) object1)); + } else { + if (!(object1 instanceof Block)) { + throw new RuntimeException("MineFantasy: Invalid alloy!"); + } + + arraylist.add(new ItemStack((Block) object1)); + } + } + + return arraylist; + } + /** * Allows an item to be heated * - * @param item the item to heat - * @param min the minimum heat to forge with(celcius) - * @param max the maximum heat until the item is ruined(celcius) - * @param unstable when the ingot is unstable(celcius) + * @param item + * the item to heat + * @param min + * the minimum heat to forge with(celcius) + * @param max + * the maximum heat until the item is ruined(celcius) + * @param unstable + * when the ingot is unstable(celcius) */ - public static void setHeatableStats(ItemStack item, int min, int unstable, int max) - { + public static void setHeatableStats(ItemStack item, int min, int unstable, int max) { Heatable.addItem(item, min, unstable, max); } /** * Allows an item to be heated ignoring subId * - * @param id the item to heat - * @param min the minimum heat to forge with(celcius) - * @param max the maximum heat until the item is ruined(celcius) - * @param unstable when the ingot is unstable(celcius) + * @param id + * the item to heat + * @param min + * the minimum heat to forge with(celcius) + * @param max + * the maximum heat until the item is ruined(celcius) + * @param unstable + * when the ingot is unstable(celcius) */ - public static void setHeatableStats(Item id, int min, int unstable, int max) - { + public static void setHeatableStats(Item id, int min, int unstable, int max) { Heatable.addItem(new ItemStack(id, 1, OreDictionary.WILDCARD_VALUE), min, unstable, max); } - - public static void setHeatableStats(String oredict, int min, int unstable, int max) - { - for(ItemStack item : OreDictionary.getOres(oredict)) - { + + public static void setHeatableStats(String oredict, int min, int unstable, int max) { + for (ItemStack item : OreDictionary.getOres(oredict)) { setHeatableStats(item, min, unstable, max); } } - private static ItemStack convertItem(Object object) - { - if(object instanceof ItemStack) - { - return ((ItemStack)object); + private static ItemStack convertItem(Object object) { + if (object instanceof ItemStack) { + return ((ItemStack) object); } - if(object instanceof Item) - { - return new ItemStack((Item)object, 1, OreDictionary.WILDCARD_VALUE); + if (object instanceof Item) { + return new ItemStack((Item) object, 1, OreDictionary.WILDCARD_VALUE); } - if(object instanceof Block) - { - return new ItemStack((Block)object, 1, OreDictionary.WILDCARD_VALUE); + if (object instanceof Block) { + return new ItemStack((Block) object, 1, OreDictionary.WILDCARD_VALUE); } return null; } @@ -399,129 +470,160 @@ private static ItemStack convertItem(Object object) /** * Adds a crossbow part Make sure to do this when adding the item */ - public static void registerCrossbowPart(ICrossbowPart part) - { - ICrossbowPart.components.put(part.getComponentType()+part.getID(), part); + public static void registerCrossbowPart(ICrossbowPart part) { + ICrossbowPart.components.put(part.getComponentType() + part.getID(), part); } + /** * For Hardcore Crafting: Can remove smelting recipes - * @param input can be an "Item", "Block" or "ItemStack" + * + * @param input + * can be an "Item", "Block" or "ItemStack" */ - public static boolean removeSmelting(Object input) - { + public static boolean removeSmelting(Object input) { ItemStack object = null; - if(input instanceof Item) - { - object = new ItemStack((Item)input, 1, 32767); - } - else if(input instanceof Block) - { - object = new ItemStack((Block)input, 1, 32767); + if (input instanceof Item) { + object = new ItemStack((Item) input, 1, 32767); + } else if (input instanceof Block) { + object = new ItemStack((Block) input, 1, 32767); + } else if (input instanceof ItemStack) { + object = (ItemStack) input; } - else if(input instanceof ItemStack) - { - object = (ItemStack)input; - } - if(object != null) - { + if (object != null) { return removeFurnaceInput(object); } return false; - } - private static boolean removeFurnaceInput(ItemStack input) - { - Iterator iterator = FurnaceRecipes.smelting().getSmeltingList().entrySet().iterator(); - Entry entry; - - do - { - if (!iterator.hasNext()) - { - return false; - } - - entry = (Entry)iterator.next(); - } - while (!checkMatch(input, (ItemStack)entry.getKey())); - - FurnaceRecipes.smelting().getSmeltingList().remove(entry.getKey()); - return true; - } - private static boolean checkMatch(ItemStack item1, ItemStack item2) - { - return item2.getItem() == item1.getItem() && (item2.getItemDamage() == 32767 || item2.getItemDamage() == item1.getItemDamage()); - } - + } + + private static boolean removeFurnaceInput(ItemStack input) { + Iterator iterator = FurnaceRecipes.smelting().getSmeltingList().entrySet().iterator(); + Entry entry; + + do { + if (!iterator.hasNext()) { + return false; + } + + entry = (Entry) iterator.next(); + } while (!checkMatch(input, (ItemStack) entry.getKey())); + + FurnaceRecipes.smelting().getSmeltingList().remove(entry.getKey()); + return true; + } + + private static boolean checkMatch(ItemStack item1, ItemStack item2) { + return item2.getItem() == item1.getItem() + && (item2.getItemDamage() == 32767 || item2.getItemDamage() == item1.getItemDamage()); + } + /** * Add a cooking recipe - * @param input what goes in - * @param output what is made - * @param min_temperature minimal temperature to work - * @param max_temperature maximum temperature until burn - * @param time how many ticks until it finishes - * @param requireBaking whether it needs to be in an oven + * + * @param input + * what goes in + * @param output + * what is made + * @param min_temperature + * minimal temperature to work + * @param max_temperature + * maximum temperature until burn + * @param time + * how many ticks until it finishes + * @param requireBaking + * whether it needs to be in an oven */ - public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, int min_temperature, int max_temperature, int time, boolean requireBaking) - { + public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, int min_temperature, + int max_temperature, int time, boolean requireBaking) { return CookRecipe.addRecipe(input, output, min_temperature, max_temperature, time, requireBaking, true); } - + /** * Add a cooking recipe - * @param input what goes in - * @param output what is made - * @param min_temperature minimal temperature to work - * @param max_temperature maximum temperature until burn - * @param time how many ticks until it finishes - * @param requireBaking whether it needs to be in an oven - * @param canBurn false if it cannot burn by traditional means (such as if its in a container) + * + * @param input + * what goes in + * @param output + * what is made + * @param min_temperature + * minimal temperature to work + * @param max_temperature + * maximum temperature until burn + * @param time + * how many ticks until it finishes + * @param requireBaking + * whether it needs to be in an oven + * @param canBurn + * false if it cannot burn by traditional means (such as if its in a + * container) */ - public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, int min_temperature, int max_temperature, int time, boolean requireBaking, boolean canBurn) - { + public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, int min_temperature, + int max_temperature, int time, boolean requireBaking, boolean canBurn) { return CookRecipe.addRecipe(input, output, min_temperature, max_temperature, time, requireBaking, canBurn); } + /** * Add a cooking recipe - * @param input what goes in - * @param output what is made - * @param min_temperature minimal temperature to work - * @param max_temperature maximum temperature until burn - * @param time how many ticks until it finishes - * @param requireBaking whether it needs to be in an oven - * @param canBurn false if it cannot burn by traditional means (such as if its in a container) + * + * @param input + * what goes in + * @param output + * what is made + * @param min_temperature + * minimal temperature to work + * @param max_temperature + * maximum temperature until burn + * @param time + * how many ticks until it finishes + * @param requireBaking + * whether it needs to be in an oven + * @param canBurn + * false if it cannot burn by traditional means (such as if its in a + * container) */ - public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, int min_temperature, int max_temperature, int time, boolean requireBaking) - { - return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, requireBaking, true); + public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, + int min_temperature, int max_temperature, int time, boolean requireBaking) { + return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, requireBaking, + true); } - + /** * Add a cooking recipe - * @param input what goes in - * @param output what is made - * @param min_temperature minimal temperature to work - * @param max_temperature maximum temperature until burn - * @param time how many ticks until it finishes - * @param burn_time how long until a finished product burns - * @param requireBaking whether it needs to be in an oven - * @param canBurn false if it cannot burn by traditional means (such as if its in a container) + * + * @param input + * what goes in + * @param output + * what is made + * @param min_temperature + * minimal temperature to work + * @param max_temperature + * maximum temperature until burn + * @param time + * how many ticks until it finishes + * @param burn_time + * how long until a finished product burns + * @param requireBaking + * whether it needs to be in an oven + * @param canBurn + * false if it cannot burn by traditional means (such as if its in a + * container) */ - public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, int min_temperature, int max_temperature, int time, int burn_time, boolean requireBaking) - { - return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, burn_time, requireBaking, true); + public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, + int min_temperature, int max_temperature, int time, int burn_time, boolean requireBaking) { + return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, burn_time, + requireBaking, true); } - public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, int min_temperature, int max_temperature, int time, int burn_time, boolean requireBaking, boolean canBurn) - { - return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, burn_time, requireBaking, canBurn); + public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, + int min_temperature, int max_temperature, int time, int burn_time, boolean requireBaking, boolean canBurn) { + return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, burn_time, + requireBaking, canBurn); } - - public static QuernRecipes addQuernRecipe(ItemStack input, ItemStack output) - { + + public static QuernRecipes addQuernRecipe(ItemStack input, ItemStack output) { return QuernRecipes.addRecipe(input, output, 1); } - public static BigFurnaceRecipes addFurnaceRecipe(ItemStack input, ItemStack output, int tier) - { + + public static BigFurnaceRecipes addFurnaceRecipe(ItemStack input, ItemStack output, int tier) { return BigFurnaceRecipes.addRecipe(input, output, tier); } } diff --git a/src/main/java/minefantasy/mf2/api/archery/AmmoMechanicsMF.java b/src/main/java/minefantasy/mf2/api/archery/AmmoMechanicsMF.java index a54fd9d6..b70c3c87 100644 --- a/src/main/java/minefantasy/mf2/api/archery/AmmoMechanicsMF.java +++ b/src/main/java/minefantasy/mf2/api/archery/AmmoMechanicsMF.java @@ -15,8 +15,7 @@ import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; -public class AmmoMechanicsMF -{ +public class AmmoMechanicsMF { /** * List of fireable arrows */ @@ -25,74 +24,64 @@ public class AmmoMechanicsMF * List of handlers */ public static List handlers = new ArrayList(); - + /** * Adds an arrow that can be fired */ - public static void addArrow(ItemStack item) - { + public static void addArrow(ItemStack item) { arrows.add(item); } - + /** * Adds an arrow that can be fired not considering sub Ids */ - public static void addArrow(Item item) - { + public static void addArrow(Item item) { addArrow(new ItemStack(item, 1, OreDictionary.WILDCARD_VALUE)); } - + /** * Adds a handler */ - public static void addHandler(IArrowHandler handler) - { + public static void addHandler(IArrowHandler handler) { handlers.add(handler); } - - public static void putAmmoOnFirearm(ItemStack weapon, ItemStack ammo) - { + + public static void putAmmoOnFirearm(ItemStack weapon, ItemStack ammo) { NBTTagCompound save = new NBTTagCompound(); - if(ammo == null) - { + if (ammo == null) { getNBT(weapon).removeTag(arrowOnBowNBT); return; } ammo.writeToNBT(save); getNBT(weapon).setTag(arrowOnBowNBT, save); } + /** * Gets the arrow loaded on the bow used for rendering and firing */ - public static ItemStack getArrowOnBow(ItemStack bow) - { - if(bow != null && bow.hasTagCompound()) - { - if(bow.getTagCompound().hasKey(arrowOnBowNBT)) - { + public static ItemStack getArrowOnBow(ItemStack bow) { + if (bow != null && bow.hasTagCompound()) { + if (bow.getTagCompound().hasKey(arrowOnBowNBT)) { return ItemStack.loadItemStackFromNBT(bow.getTagCompound().getCompoundTag(arrowOnBowNBT)); } } return null; } - + public static final String arrowOnBowNBT = "loadedArrow"; public static final String savedAmmoNBT = "MF_PresetArrow"; + /** * Gets a loaded arrow from a bow */ - public static ItemStack reloadBow(ItemStack bow) - { - if(!bow.hasTagCompound()) - { + public static ItemStack reloadBow(ItemStack bow) { + if (!bow.hasTagCompound()) { return null; } - if(bow.getTagCompound().hasKey(savedAmmoNBT)) - { + if (bow.getTagCompound().hasKey(savedAmmoNBT)) { ItemStack ammo = ItemStack.loadItemStackFromNBT(bow.getTagCompound().getCompoundTag(savedAmmoNBT)); - - if(ammo != null) - { + + if (ammo != null) { ItemStack arrow = ammo.copy(); arrow.stackSize = 1; return arrow; @@ -100,180 +89,157 @@ public static ItemStack reloadBow(ItemStack bow) } return null; } + /** * Removes 1 from the ammo */ - public static void consumeAmmo(EntityPlayer user, ItemStack bow) - { + public static void consumeAmmo(EntityPlayer user, ItemStack bow) { ItemStack ammo = getAmmo(bow); - if(user.capabilities.isCreativeMode) - { + if (user.capabilities.isCreativeMode) { return; } - if(ammo != null) - { + if (ammo != null) { --ammo.stackSize; - if(ammo.stackSize > 0) - { + if (ammo.stackSize > 0) { setAmmo(bow, ammo); - } - else - { + } else { getNBT(bow).removeTag(savedAmmoNBT); } } } + /** * Gets what ammo is loaded */ - public static ItemStack getAmmo(ItemStack bow) - { - if(!bow.hasTagCompound()) - { + public static ItemStack getAmmo(ItemStack bow) { + if (!bow.hasTagCompound()) { return null; } - if(bow.getTagCompound().hasKey(savedAmmoNBT)) - { + if (bow.getTagCompound().hasKey(savedAmmoNBT)) { return ItemStack.loadItemStackFromNBT(bow.getTagCompound().getCompoundTag(savedAmmoNBT)); } return null; } + /** * Sets the ammo for the bow */ - public static void setAmmo(ItemStack bow, ItemStack ammo) - { - NBTTagCompound nbt = getNBT(bow); - - if(ammo != null) - { - NBTTagCompound save = new NBTTagCompound(); - ammo.writeToNBT(save); - nbt.setTag(savedAmmoNBT, save); - } - else - { - nbt.removeTag(savedAmmoNBT); - } + public static void setAmmo(ItemStack bow, ItemStack ammo) { + NBTTagCompound nbt = getNBT(bow); + + if (ammo != null) { + NBTTagCompound save = new NBTTagCompound(); + ammo.writeToNBT(save); + nbt.setTag(savedAmmoNBT, save); + } else { + nbt.removeTag(savedAmmoNBT); + } } - public static NBTTagCompound getNBT(ItemStack item) - { - if(!item.hasTagCompound()) - { + public static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } return item.getTagCompound(); } - public static void removeAmmo(ItemStack bow) - { + public static void removeAmmo(ItemStack bow) { getNBT(bow).removeTag(savedAmmoNBT); } - - public static boolean isDepleted(ItemStack firearm) - { - return getGunAmmoCount(firearm) == 0 && getAmmo(firearm) == null && EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, firearm) == 0; + + public static boolean isDepleted(ItemStack firearm) { + return getGunAmmoCount(firearm) == 0 && getAmmo(firearm) == null + && EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, firearm) == 0; } - - public static boolean isFirearmLoaded(ItemStack firearm) - { - return getGunAmmoCount(firearm)>0; + + public static boolean isFirearmLoaded(ItemStack firearm) { + return getGunAmmoCount(firearm) > 0; } - public static void modifyAmmo(ItemStack item, int value) - { + + public static void modifyAmmo(ItemStack item, int value) { int ammo = getGunAmmoCount(item) + value; setGunAmmoCount(item, ammo); } + private static final String ammoNBT = "MFammo"; - public static void setGunAmmoCount(ItemStack item, int ammo) - { + + public static void setGunAmmoCount(ItemStack item, int ammo) { NBTTagCompound nbt = getNBT(item); nbt.setInteger(ammoNBT, ammo); } - public static int getGunAmmoCount(ItemStack item) - { - if(getArrowOnBow(item) == null){return 0;} - NBTTagCompound nbt = getNBT(item); - - if(nbt.hasKey(ammoNBT)) - { - return nbt.getInteger(ammoNBT); - } + + public static int getGunAmmoCount(ItemStack item) { + if (getArrowOnBow(item) == null) { + return 0; + } + NBTTagCompound nbt = getNBT(item); + + if (nbt.hasKey(ammoNBT)) { + return nbt.getInteger(ammoNBT); + } return 1; } - public static void dropAmmoCrate(World world, ItemStack crate, double x, double y, double z) - { + public static void dropAmmoCrate(World world, ItemStack crate, double x, double y, double z) { ItemStack drop = BlockAmmoBox.getHeld(crate, true); int stock = BlockAmmoBox.getStock(crate, true); - if(drop != null) - { - while(stock > 0) - { + if (drop != null) { + while (stock > 0) { int stackSize = Math.min(stock, drop.getMaxStackSize()); stock -= stackSize; ItemStack newdrop = drop.copy(); newdrop.stackSize = stackSize; - entityDropItem(world,x, y, z, newdrop); + entityDropItem(world, x, y, z, newdrop); } } } + /** * Drops the loaded and storred ammo for an item, from coords */ - public static void dropAmmo(World world, ItemStack firearm, double x, double y, double z) - { + public static void dropAmmo(World world, ItemStack firearm, double x, double y, double z) { ItemStack ammo = AmmoMechanicsMF.getAmmo(firearm); ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(firearm); - if(ammo != null) - { - entityDropItem(world,x, y, z, ammo); + if (ammo != null) { + entityDropItem(world, x, y, z, ammo); AmmoMechanicsMF.setAmmo(firearm, null); } - if(loaded != null) - { + if (loaded != null) { entityDropItem(world, x, y, z, loaded); AmmoMechanicsMF.putAmmoOnFirearm(firearm, null); } } + /** * Drops the loaded and storred ammo for an item from a user */ - public static void dropContents(World world, ItemStack firearm, EntityLivingBase user) - { - dropAmmo(world, firearm, user.posX, user.posY+user.getEyeHeight(), user.posZ); - dropAmmoCrate(world, firearm, user.posX, user.posY+user.getEyeHeight(), user.posZ); + public static void dropContents(World world, ItemStack firearm, EntityLivingBase user) { + dropAmmo(world, firearm, user.posX, user.posY + user.getEyeHeight(), user.posZ); + dropAmmoCrate(world, firearm, user.posX, user.posY + user.getEyeHeight(), user.posZ); } - private static EntityItem entityDropItem(World world, double x, double y, double z, ItemStack item) - { - if (item.stackSize != 0 && item.getItem() != null) - { - EntityItem entityitem = new EntityItem(world, x, y, z, item); - entityitem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(entityitem); - return entityitem; - } - else - { - return null; - } - } - public static void damageContainer(ItemStack item, EntityPlayer user) - { + private static EntityItem entityDropItem(World world, double x, double y, double z, ItemStack item) { + if (item.stackSize != 0 && item.getItem() != null) { + EntityItem entityitem = new EntityItem(world, x, y, z, item); + entityitem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(entityitem); + return entityitem; + } else { + return null; + } + } + + public static void damageContainer(ItemStack item, EntityPlayer user) { damageContainer(item, user, 1); } + /** * Damages a firearm, dropping inventory if broken */ - public static void damageContainer(ItemStack item, EntityPlayer user, int dam) - { + public static void damageContainer(ItemStack item, EntityPlayer user, int dam) { item.damageItem(dam, user); - if(!user.capabilities.isCreativeMode && item.stackSize == 0) - { - if(!user.worldObj.isRemote) - { + if (!user.capabilities.isCreativeMode && item.stackSize == 0) { + if (!user.worldObj.isRemote) { dropContents(user.worldObj, item, user); } user.setCurrentItemOrArmor(0, null); diff --git a/src/main/java/minefantasy/mf2/api/archery/IAmmo.java b/src/main/java/minefantasy/mf2/api/archery/IAmmo.java index 9f2f772e..2183a286 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IAmmo.java +++ b/src/main/java/minefantasy/mf2/api/archery/IAmmo.java @@ -2,8 +2,7 @@ import net.minecraft.item.ItemStack; -public interface IAmmo -{ +public interface IAmmo { /** * What ammo is it (arrow, bolt, bullet, etc) */ diff --git a/src/main/java/minefantasy/mf2/api/archery/IArrowHandler.java b/src/main/java/minefantasy/mf2/api/archery/IArrowHandler.java index 7260a672..6a314483 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IArrowHandler.java +++ b/src/main/java/minefantasy/mf2/api/archery/IArrowHandler.java @@ -4,11 +4,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public interface IArrowHandler -{ +public interface IArrowHandler { /** * Fires an arrow + * * @return true if the arrow has been fired */ - public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, boolean infinite); + public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, + boolean infinite); } diff --git a/src/main/java/minefantasy/mf2/api/archery/IArrowMF.java b/src/main/java/minefantasy/mf2/api/archery/IArrowMF.java index 8ef73f22..2721a47a 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IArrowMF.java +++ b/src/main/java/minefantasy/mf2/api/archery/IArrowMF.java @@ -3,22 +3,22 @@ import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; -public interface IArrowMF -{ +public interface IArrowMF { /** * Gets the damage modifier (1.0 = Flint arrow) */ public abstract float getDamageModifier(ItemStack arrow); - + /** * Gets the weight (1.0 = regular fall speed) */ public abstract float getGravityModifier(ItemStack arrow); - + /** - * Gets the chance the arrow will break on impace (0.0 = no chance, 1.0 = 100% chance) + * Gets the chance the arrow will break on impace (0.0 = no chance, 1.0 = 100% + * chance) */ public abstract float getBreakChance(Entity entityArrow, ItemStack arrow); - + public abstract void onHitEntity(Entity arrowInstance, Entity shooter, Entity hit, float damage); } diff --git a/src/main/java/minefantasy/mf2/api/archery/IArrowRetrieve.java b/src/main/java/minefantasy/mf2/api/archery/IArrowRetrieve.java index fdd01c41..8103b8fb 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IArrowRetrieve.java +++ b/src/main/java/minefantasy/mf2/api/archery/IArrowRetrieve.java @@ -2,14 +2,13 @@ import net.minecraft.item.ItemStack; -public interface IArrowRetrieve -{ +public interface IArrowRetrieve { /** - * Gets if the arrow will be dropped by a killed mob - * (this pretty much connects to the canBePickedUp variable) + * Gets if the arrow will be dropped by a killed mob (this pretty much connects + * to the canBePickedUp variable) */ public boolean canBePickedUp(); - + /** * Gets the item dropped when the enemy is killed (the arrow item used) */ diff --git a/src/main/java/minefantasy/mf2/api/archery/IDisplayMFAmmo.java b/src/main/java/minefantasy/mf2/api/archery/IDisplayMFAmmo.java index b9d09ccd..e5f113bc 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IDisplayMFAmmo.java +++ b/src/main/java/minefantasy/mf2/api/archery/IDisplayMFAmmo.java @@ -4,9 +4,9 @@ /** * Implement this to your bow item so it displays the preset arrow when wielded - * *Note that the preset arrow only fires if you implement MineFantasy's arrow firer + * *Note that the preset arrow only fires if you implement MineFantasy's arrow + * firer */ -public interface IDisplayMFAmmo -{ +public interface IDisplayMFAmmo { public int getAmmoCapacity(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/archery/IFirearm.java b/src/main/java/minefantasy/mf2/api/archery/IFirearm.java index 808b7279..9093f42e 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IFirearm.java +++ b/src/main/java/minefantasy/mf2/api/archery/IFirearm.java @@ -2,12 +2,15 @@ import net.minecraft.item.ItemStack; -public interface IFirearm -{ +public interface IFirearm { /** - * Determines the type of firing mechanism used (such as arrow, bolt, bullet, etc) - * @param weapon the item that is being accessed - * @param ammo the ammo type that weapon is being loaded with + * Determines the type of firing mechanism used (such as arrow, bolt, bullet, + * etc) + * + * @param weapon + * the item that is being accessed + * @param ammo + * the ammo type that weapon is being loaded with */ public boolean canAcceptAmmo(ItemStack weapon, String ammo); } diff --git a/src/main/java/minefantasy/mf2/api/archery/ISpecialBow.java b/src/main/java/minefantasy/mf2/api/archery/ISpecialBow.java index 49fb82d5..2bc90ffa 100644 --- a/src/main/java/minefantasy/mf2/api/archery/ISpecialBow.java +++ b/src/main/java/minefantasy/mf2/api/archery/ISpecialBow.java @@ -3,18 +3,22 @@ import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; -public interface ISpecialBow -{ +public interface ISpecialBow { /** - * This is called when an arrow is fired from a bow - * if you have your own arrows firing, call this method when spawning it in world + * This is called when an arrow is fired from a bow if you have your own arrows + * firing, call this method when spawning it in world * * Allows to modify an arrow when fired from this bow - * @param arrow the arrow fired(use a cast to determine what class it is) + * + * @param arrow + * the arrow fired(use a cast to determine what class it is) * @return the same arrow, but modified */ public Entity modifyArrow(ItemStack bow, Entity arrow); + public float getMaxCharge(); + public float getRange(ItemStack bow); + public float getSpread(ItemStack bow); } diff --git a/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java b/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java index 0d656fcf..252d8df0 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java +++ b/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java @@ -2,119 +2,134 @@ import java.util.HashMap; -import minefantasy.mf2.api.helpers.ArmourCalculator; - - -public class ArmourDesign -{ +public class ArmourDesign { public static final String light = "light"; public static final String medium = "medium"; public static final String heavy = "heavy"; - //Weight: Above 50kg slows down and increases stamina decay, and classes as heavy armour - //Bulk: Above 0.0 means it slows stamina regen - public static HashMapdesigns = new HashMap(); - // Reg Name Prot Dura Weight Bulk Ctg Bnt Png - public static final ArmourDesign CLOTH = new ArmourDesign( "clothing", "Clothing", 1.0F, 1.0F, 0F, 0.25F).calibrateTraits(0.5F, 1.0F, 0.5F).setWeightGroup(light);//Weak - public static final ArmourDesign SOLID = new ArmourDesign( "default", "Basic", 1.0F, 1.0F, 40F, 1.00F).setWeightGroup(medium);//Basic Armour - public static final ArmourDesign MAIL = new ArmourDesign( "mail", "Mail", 1.0F, 1.0F, 35F, 0.75F).calibrateTraits(1.0F, 0.7F, 0.9F).setWeightGroup(medium);//Vulnerable to blunt - public static final ArmourDesign PLATE = new ArmourDesign( "plate", "Plate", 1.5F, 1.0F, 60F, 1.00F).calibrateTraits(1.0F, 1.0F, 0.6F).setWeightGroup(heavy);//Vulnerable to piercing - - //LIGHT ARMOUR - public static final ArmourDesign LEATHER = new ArmourDesign( "leather", "Leather", 1.0F, 1.0F, 10F, 0.25F).calibrateTraits(0.7F, 1.0F, 0.5F).setWeightGroup(light);//Slightly better blunt - public static final ArmourDesign PADDING = new ArmourDesign( "padding", "Padding", 1.0F, 1.0F, 10F, 1.00F).calibrateTraits(0.6F, 1.2F, 0.4F).setWeightGroup(light);//10kg, Blunt resistent - public static final ArmourDesign STUDDED = new ArmourDesign("studded", "Studded", 0.8F, 1.0F, 10F , 0.25F).calibrateTraits(0.85F, 1.0F, 0.9F).setWeightGroup(light);//10kg, Vulnerable to blunt - //MEDIUM ARMOUR - public static final ArmourDesign SCALEMAIL = new ArmourDesign("scalemail", "Scalemail", 1.0F, 1.0F, 8F, 0.30F).calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(medium);//20kg, Average - public static final ArmourDesign CHAINMAIL = new ArmourDesign("chainmail", "Chainmail", 1.0F, 1.0F, 8F, 0.65F).calibrateTraits(1.20F, 0.60F, 1.20F).setWeightGroup(medium);//20kg, Less blunt more piercing - //HEAVY ARMOUR - public static final ArmourDesign SPLINTMAIL = new ArmourDesign("splintmail","Splintmail", 1.2F, 1.0F, 12F, 0.75F).calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(heavy);//30kg, Average - public static final ArmourDesign FIELDPLATE = new ArmourDesign("fieldplate", "Fieldplate", 1.2F, 1.0F, 16F, 1.00F).calibrateTraits(1.25F, 1.25F, 1.00F).setWeightGroup(heavy);//40kg, Vulnerable to piercing - - public static final ArmourDesign COGWORK = new ArmourDesign("cogwork", "Cogwork", 4.0F, 8.0F, 30F, 2.00F).calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(heavy);//>120kg, Massive Protection - //ArmourCalculator + // Weight: Above 50kg slows down and increases stamina decay, and classes as + // heavy armour + // Bulk: Above 0.0 means it slows stamina regen + public static HashMap designs = new HashMap(); + // Reg Name Prot Dura Weight Bulk Ctg Bnt Png + public static final ArmourDesign CLOTH = new ArmourDesign("clothing", "Clothing", 1.0F, 1.0F, 0F, 0.25F) + .calibrateTraits(0.5F, 1.0F, 0.5F).setWeightGroup(light);// Weak + public static final ArmourDesign SOLID = new ArmourDesign("default", "Basic", 1.0F, 1.0F, 40F, 1.00F) + .setWeightGroup(medium);// Basic Armour + public static final ArmourDesign MAIL = new ArmourDesign("mail", "Mail", 1.0F, 1.0F, 35F, 0.75F) + .calibrateTraits(1.0F, 0.7F, 0.9F).setWeightGroup(medium);// Vulnerable to blunt + public static final ArmourDesign PLATE = new ArmourDesign("plate", "Plate", 1.5F, 1.0F, 60F, 1.00F) + .calibrateTraits(1.0F, 1.0F, 0.6F).setWeightGroup(heavy);// Vulnerable to piercing + + // LIGHT ARMOUR + public static final ArmourDesign LEATHER = new ArmourDesign("leather", "Leather", 1.0F, 1.0F, 10F, 0.25F) + .calibrateTraits(0.7F, 1.0F, 0.5F).setWeightGroup(light);// Slightly better blunt + public static final ArmourDesign PADDING = new ArmourDesign("padding", "Padding", 1.0F, 1.0F, 10F, 1.00F) + .calibrateTraits(0.6F, 1.2F, 0.4F).setWeightGroup(light);// 10kg, Blunt resistent + public static final ArmourDesign STUDDED = new ArmourDesign("studded", "Studded", 0.8F, 1.0F, 10F, 0.25F) + .calibrateTraits(0.85F, 1.0F, 0.9F).setWeightGroup(light);// 10kg, Vulnerable to blunt + // MEDIUM ARMOUR + public static final ArmourDesign SCALEMAIL = new ArmourDesign("scalemail", "Scalemail", 1.0F, 1.0F, 8F, 0.30F) + .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(medium);// 20kg, Average + public static final ArmourDesign CHAINMAIL = new ArmourDesign("chainmail", "Chainmail", 1.0F, 1.0F, 8F, 0.65F) + .calibrateTraits(1.20F, 0.60F, 1.20F).setWeightGroup(medium);// 20kg, Less blunt more piercing + // HEAVY ARMOUR + public static final ArmourDesign SPLINTMAIL = new ArmourDesign("splintmail", "Splintmail", 1.2F, 1.0F, 12F, 0.75F) + .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(heavy);// 30kg, Average + public static final ArmourDesign FIELDPLATE = new ArmourDesign("fieldplate", "Fieldplate", 1.2F, 1.0F, 16F, 1.00F) + .calibrateTraits(1.25F, 1.25F, 1.00F).setWeightGroup(heavy);// 40kg, Vulnerable to piercing + + public static final ArmourDesign COGWORK = new ArmourDesign("cogwork", "Cogwork", 4.0F, 8.0F, 30F, 2.00F) + .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(heavy);// >120kg, Massive Protection + // ArmourCalculator private String name; private float durability; private float armourWeight; - + private float baseProtection; - + private float cuttingModifier = 1.0F; private float piercingModifier = 1.0F; private float bluntModifier = 1.0F; - + private float bulk; - + /** * - * @param register The string that it is registered under (For config) - * @param name The name of the Design - * @param prot The protection against basic damage (1.0F = normal protection for tier) - * @param dura The durability modifier - * @param weight the weight in Kg of the suit - * @param bulk the bulk of the suit (1.0 = plate, 0.5 = splint, etc) + * @param register + * The string that it is registered under (For config) + * @param name + * The name of the Design + * @param prot + * The protection against basic damage (1.0F = normal protection for + * tier) + * @param dura + * The durability modifier + * @param weight + * the weight in Kg of the suit + * @param bulk + * the bulk of the suit (1.0 = plate, 0.5 = splint, etc) */ - public ArmourDesign(String register, String name, float prot, float dura, float weight, float bulk) - { + public ArmourDesign(String register, String name, float prot, float dura, float weight, float bulk) { designs.put(register, this); - this.name=name; + this.name = name; baseProtection = prot; - + durability = dura; armourWeight = weight; - + this.bulk = bulk; } - + /** * These traits only apply when armours are coded to take them */ - public ArmourDesign calibrateTraits(float cutting, float blunt, float pierce) - { + public ArmourDesign calibrateTraits(float cutting, float blunt, float pierce) { cuttingModifier = cutting; bluntModifier = blunt; piercingModifier = pierce; - + return this; } - - public String getName() - { + + public String getName() { return name; } - public float getDurability() - { + + public float getDurability() { return durability; } - public float getWeight() - { + + public float getWeight() { return armourWeight; } - public float getRating() - { + + public float getRating() { return baseProtection; } - public float[] getProtectiveTraits() - { - return new float[]{cuttingModifier, bluntModifier, piercingModifier}; + + public float[] getProtectiveTraits() { + return new float[] { cuttingModifier, bluntModifier, piercingModifier }; } - public float getBulk() - { + + public float getBulk() { return bulk; } + /** - * @param group "light" "medium" or "heavy" + * @param group + * "light" "medium" or "heavy" */ - public ArmourDesign setWeightGroup(String group) - { + public ArmourDesign setWeightGroup(String group) { weightGroup = group; return this; } + private String weightGroup = "medium"; + /** * @return "light" "medium" or "heavy" */ - public String getGroup() - { + public String getGroup() { return weightGroup; } } diff --git a/src/main/java/minefantasy/mf2/api/armour/ArmourMaterialMF.java b/src/main/java/minefantasy/mf2/api/armour/ArmourMaterialMF.java index 9024de28..0447011c 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ArmourMaterialMF.java +++ b/src/main/java/minefantasy/mf2/api/armour/ArmourMaterialMF.java @@ -1,14 +1,10 @@ package minefantasy.mf2.api.armour; -public class ArmourMaterialMF -{ - /**EnumArmorMaterial - * VANILLA GUIDE: - * Leather_____28% Ratio: 1.3 - * Chain_______48% Ratio: 1.9 - * Iron________60% Ratio: 2.5 - * Gold________44% Ratio: 1.7 - * Diamond_____80% Ratio: 5.0 +public class ArmourMaterialMF { + /** + * EnumArmorMaterial VANILLA GUIDE: Leather_____28% Ratio: 1.3 Chain_______48% + * Ratio: 1.9 Iron________60% Ratio: 2.5 Gold________44% Ratio: 1.7 + * Diamond_____80% Ratio: 5.0 */ public final String name; public final int durability; @@ -19,28 +15,26 @@ public class ArmourMaterialMF public float magicResistanceModifier = 0F; public float fireResistanceModifier = 0F; - - public ArmourMaterialMF(String title, int dura, float AC, int enchant, float weight) - { + + public ArmourMaterialMF(String title, int dura, float AC, int enchant, float weight) { name = title; durability = dura; baseAR = AC; enchantment = enchant; armourWeight = weight; } - - public ArmourMaterialMF setMagicResistance(float magic) - { + + public ArmourMaterialMF setMagicResistance(float magic) { magicResistanceModifier = magic; return this; } - public ArmourMaterialMF setFireResistance(float fire) - { + + public ArmourMaterialMF setFireResistance(float fire) { fireResistanceModifier = fire; return this; } - public ArmourMaterialMF setMythic(boolean flag) - { + + public ArmourMaterialMF setMythic(boolean flag) { isMythic = flag; return this; } diff --git a/src/main/java/minefantasy/mf2/api/armour/CustomArmourEntry.java b/src/main/java/minefantasy/mf2/api/armour/CustomArmourEntry.java index 710bdc40..cc658268 100644 --- a/src/main/java/minefantasy/mf2/api/armour/CustomArmourEntry.java +++ b/src/main/java/minefantasy/mf2/api/armour/CustomArmourEntry.java @@ -8,133 +8,143 @@ import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; -public class CustomArmourEntry -{ +public class CustomArmourEntry { /** - * Registers an item to a template of an ArmourDesign, while dividing the suit into the 4 pieces - * If it's unable to divide it, it simply quarters it's value - * @param piece the item to register - * @param template the ArmourDesign to work off + * Registers an item to a template of an ArmourDesign, while dividing the suit + * into the 4 pieces If it's unable to divide it, it simply quarters it's value + * + * @param piece + * the item to register + * @param template + * the ArmourDesign to work off */ - public static void registerItem(Item piece, ArmourDesign template) - { + public static void registerItem(Item piece, ArmourDesign template) { registerItem(piece, template, 1.0F, template.getGroup()); } + /** - * Registers an item to a template of an ArmourDesign, while dividing the suit into the 4 pieces - * If it's unable to divide it, it simply quarters it's value - * @param piece the item to register - * @param template the ArmourDesign to work off - * @param weightMod the multiplier for the tier weight if a tier is heavier or lighter + * Registers an item to a template of an ArmourDesign, while dividing the suit + * into the 4 pieces If it's unable to divide it, it simply quarters it's value + * + * @param piece + * the item to register + * @param template + * the ArmourDesign to work off + * @param weightMod + * the multiplier for the tier weight if a tier is heavier or lighter */ - public static void registerItem(Item piece, ArmourDesign template, float weightMod, String weightType) - { + public static void registerItem(Item piece, ArmourDesign template, float weightMod, String weightType) { float divider = 0.25F; - if(piece instanceof ItemArmor) - { - divider = ArmourCalculator.sizes[((ItemArmor)piece).armorType]; + if (piece instanceof ItemArmor) { + divider = ArmourCalculator.sizes[((ItemArmor) piece).armorType]; } - registerItem(piece, template.getWeight() * weightMod, template.getBulk()*divider, weightType); + registerItem(piece, template.getWeight() * weightMod, template.getBulk() * divider, weightType); } + /** * Registeres a piece (called by code or config) - * @param piece the item to list - * @param weight the weight of the piece (Kg) - * @param bulk the bulk of the piece + * + * @param piece + * the item to list + * @param weight + * the weight of the piece (Kg) + * @param bulk + * the bulk of the piece */ - public static void registerItem(Item piece, float weight, float bulk, String AC) - { + public static void registerItem(Item piece, float weight, float bulk, String AC) { registerItem(piece, weight, bulk, true, AC); } - + /** * Registeres a piece (called by code or config) - * @param piece the item to list - * @param weight the weight of the piece (Kg) - * @param bulk the bulk of the piece - * @param alterSpeed if the armour's weight slows you down + * + * @param piece + * the item to list + * @param weight + * the weight of the piece (Kg) + * @param bulk + * the bulk of the piece + * @param alterSpeed + * if the armour's weight slows you down */ - public static void registerItem(Item piece, float weight, float bulk, boolean alterSpeed, String AC) - { + public static void registerItem(Item piece, float weight, float bulk, boolean alterSpeed, String AC) { int id = Item.getIdFromItem(piece); - - MineFantasyAPI.debugMsg("Added Custom "+AC+" armour: " + piece.getUnlocalizedName() + "(" + id + ") Traits = " + weight + "," + bulk + " alter speed = " + alterSpeed); + + MineFantasyAPI.debugMsg("Added Custom " + AC + " armour: " + piece.getUnlocalizedName() + "(" + id + + ") Traits = " + weight + "," + bulk + " alter speed = " + alterSpeed); entries.put(id, new CustomArmourEntry(id, weight, bulk, alterSpeed, AC)); } - + /** * Returns the "Armour Class" Weight type Light, Medium or Heavy */ - public static String getArmourClass(ItemStack piece) - { + public static String getArmourClass(ItemStack piece) { CustomArmourEntry entry = getEntry(piece); - if(entry != null) - { + if (entry != null) { return entry.AC; } ArmourDesign deft = ArmourCalculator.getDefaultAD(piece); return deft.getGroup(); } - + /** * Gets the variables for the item if there are any: order is weight, bulk - * @param deft the default preset if not present + * + * @param deft + * the default preset if not present */ - public static float[] getEntryVars(ItemStack piece) - { + public static float[] getEntryVars(ItemStack piece) { CustomArmourEntry entry = getEntry(piece); - if(entry != null) - { - return new float[]{entry.weight, entry.bulkiness}; + if (entry != null) { + return new float[] { entry.weight, entry.bulkiness }; } ArmourDesign deft = ArmourCalculator.getDefaultAD(piece); - return new float[]{deft.getWeight(), deft.getBulk()}; + return new float[] { deft.getWeight(), deft.getBulk() }; } - + /** * Determines if a piece can slow you down */ - public static boolean doesPieceSlowDown(ItemStack piece) - { - if(piece != null) - { + public static boolean doesPieceSlowDown(ItemStack piece) { + if (piece != null) { CustomArmourEntry entry = getEntry(piece); - if(entry != null) - { + if (entry != null) { return entry.alterSpeed; } } return false; } + /** * Gets the entry for an item - * @param piece the armour item + * + * @param piece + * the armour item * @return the entry(if there is one), else null */ - public static CustomArmourEntry getEntry(ItemStack piece) - { + public static CustomArmourEntry getEntry(ItemStack piece) { return getEntry(piece.getItem()); } + /** * Gets the entry for an item - * @param piece the armour item + * + * @param piece + * the armour item * @return the entry(if there is one), else null */ - public static CustomArmourEntry getEntry(Item piece) - { - if(piece != null) - { + public static CustomArmourEntry getEntry(Item piece) { + if (piece != null) { int id = Item.getIdFromItem(piece); - if(entries.containsKey(id)) - { + if (entries.containsKey(id)) { return entries.get(id); } } return null; } - + public boolean alterSpeed; - + public int itemID; /** * The Weight of the piece(not suit) @@ -144,16 +154,15 @@ public static CustomArmourEntry getEntry(Item piece) * The Bulk of the piece(not suit) */ public float bulkiness; - + /** * Light Medium or Heavy */ public String AC; - - public static HashMapentries = new HashMap(); - - private CustomArmourEntry(int id, float weight, float bulk, boolean alterSpeed, String AC) - { + + public static HashMap entries = new HashMap(); + + private CustomArmourEntry(int id, float weight, float bulk, boolean alterSpeed, String AC) { this.alterSpeed = alterSpeed; this.itemID = id; this.weight = weight; diff --git a/src/main/java/minefantasy/mf2/api/armour/CustomDamageRatioEntry.java b/src/main/java/minefantasy/mf2/api/armour/CustomDamageRatioEntry.java index 5e2d0d6f..2c91340c 100644 --- a/src/main/java/minefantasy/mf2/api/armour/CustomDamageRatioEntry.java +++ b/src/main/java/minefantasy/mf2/api/armour/CustomDamageRatioEntry.java @@ -4,69 +4,70 @@ import net.minecraft.item.Item; -public class CustomDamageRatioEntry -{ +public class CustomDamageRatioEntry { public static HashMap entries = new HashMap(); public static HashMap entriesProj = new HashMap(); - + public float[] vars; - + /** * Register a weapon to give variables - * @param item the item - * @param vars the damage type ratio cutting:blunt + * + * @param item + * the item + * @param vars + * the damage type ratio cutting:blunt */ - public static void registerItem(Item item, float[] vars) - { + public static void registerItem(Item item, float[] vars) { registerItem(Item.getIdFromItem(item), vars); } - + /** * Register a weapon to give variables - * @param id the item id - * @param vars the damage type ratio cutting:blunt + * + * @param id + * the item id + * @param vars + * the damage type ratio cutting:blunt */ - public static void registerItem(int id, float[] vars) - { + public static void registerItem(int id, float[] vars) { entries.put(id, new CustomDamageRatioEntry(vars)); } - /** * Register an entity (like arrows) to give variables - * @param id the entity id - * @param vars the damage type ratio cutting:blunt + * + * @param id + * the entity id + * @param vars + * the damage type ratio cutting:blunt */ - public static void registerEntity(String id, float[] vars) - { + public static void registerEntity(String id, float[] vars) { entriesProj.put(id, new CustomDamageRatioEntry(vars)); } - + /** * Gets the ratio for an item, null if it's not found */ - public static float[] getTraits(Item item) - { + public static float[] getTraits(Item item) { return getTraits(Item.getIdFromItem(item)); } + /** * Gets the ratio for an item, null if it's not found */ - public static float[] getTraits(int id) - { + public static float[] getTraits(int id) { return entries.get(id) != null ? entries.get(id).vars : null; } - + /** * Gets the ratio for an entity, null if it's not found */ - public static float[] getTraits(String id) - { - return entriesProj.get(id) != null ? entriesProj.get(id).vars : new float[]{1, 1, 1}; + public static float[] getTraits(String id) { + return entriesProj.get(id) != null ? entriesProj.get(id).vars : new float[] { 1, 1, 1 }; } - private CustomDamageRatioEntry(float[] vars) - { + private CustomDamageRatioEntry(float[] vars) { this.vars = vars; } } diff --git a/src/main/java/minefantasy/mf2/api/armour/IArmourMF.java b/src/main/java/minefantasy/mf2/api/armour/IArmourMF.java index bd749eff..90391558 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IArmourMF.java +++ b/src/main/java/minefantasy/mf2/api/armour/IArmourMF.java @@ -1,18 +1,19 @@ package minefantasy.mf2.api.armour; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.item.ItemStack; -public interface IArmourMF -{ - //NOTE: "Slot" Variable works 0=Helmet, 1=Chest, 2=Legs, 3=Boots +public interface IArmourMF { + // NOTE: "Slot" Variable works 0=Helmet, 1=Chest, 2=Legs, 3=Boots /** - * Gets how heavy the piece is. (mesured in Kg). this is used for slowing movement, and stamina decay + * Gets how heavy the piece is. (mesured in Kg). this is used for slowing + * movement, and stamina decay */ public float getPieceWeight(ItemStack item, int slot); + /** - * This is if the suit is light or heavy armour (pretty much anything above 50kg is heavy) + * This is if the suit is light or heavy armour (pretty much anything above 50kg + * is heavy) + * * @return "light" "medium" or "heavy" */ public String getSuitWeigthType(ItemStack item); diff --git a/src/main/java/minefantasy/mf2/api/armour/IArmourPenetrationMob.java b/src/main/java/minefantasy/mf2/api/armour/IArmourPenetrationMob.java index d970a1e5..32cff747 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IArmourPenetrationMob.java +++ b/src/main/java/minefantasy/mf2/api/armour/IArmourPenetrationMob.java @@ -1,6 +1,5 @@ package minefantasy.mf2.api.armour; -public interface IArmourPenetrationMob -{ +public interface IArmourPenetrationMob { public float[] getHitTraits(); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IArmourRating.java b/src/main/java/minefantasy/mf2/api/armour/IArmourRating.java index 7ced5d3a..aec9ef39 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IArmourRating.java +++ b/src/main/java/minefantasy/mf2/api/armour/IArmourRating.java @@ -2,10 +2,10 @@ import net.minecraft.item.ItemStack; -public interface IArmourRating -{ +public interface IArmourRating { /** - * Gets the scale in relation for the total suit (0-4 = head, chest, legs, boots) + * Gets the scale in relation for the total suit (0-4 = head, chest, legs, + * boots) */ public float scalePiece(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IArmouredEntity.java b/src/main/java/minefantasy/mf2/api/armour/IArmouredEntity.java index 0ed30fa9..9176f75a 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IArmouredEntity.java +++ b/src/main/java/minefantasy/mf2/api/armour/IArmouredEntity.java @@ -2,7 +2,6 @@ import net.minecraft.util.DamageSource; -public interface IArmouredEntity -{ +public interface IArmouredEntity { public float getThreshold(DamageSource src); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IElementalResistance.java b/src/main/java/minefantasy/mf2/api/armour/IElementalResistance.java index b2338f32..cf5f4d86 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IElementalResistance.java +++ b/src/main/java/minefantasy/mf2/api/armour/IElementalResistance.java @@ -3,27 +3,28 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; -public interface IElementalResistance -{ +public interface IElementalResistance { /** - * @return this determines the chance an item is to deflect arrows. more damage means less chance + * @return this determines the chance an item is to deflect arrows. more damage + * means less chance */ public float getArrowDeflection(ItemStack item, DamageSource source); + /** - * @return the Magic resistance percent (0-100) (for the whole suit) - * -values mean weakness + * @return the Magic resistance percent (0-100) (for the whole suit) -values + * mean weakness */ public float getMagicResistance(ItemStack item, DamageSource source); - + /** - * @return the Magic resistance percent (0-100) (for the whole suit) - * -values mean weakness + * @return the Magic resistance percent (0-100) (for the whole suit) -values + * mean weakness */ public float getFireResistance(ItemStack item, DamageSource source); - + /** - * @return the Base resistance percent for non magic/fire(0-100) (for the whole suit) - * -values mean weakness + * @return the Base resistance percent for non magic/fire(0-100) (for the whole + * suit) -values mean weakness */ public float getBaseResistance(ItemStack item, DamageSource source); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IGasProtector.java b/src/main/java/minefantasy/mf2/api/armour/IGasProtector.java index d98c3fc4..f49d0e4e 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IGasProtector.java +++ b/src/main/java/minefantasy/mf2/api/armour/IGasProtector.java @@ -2,10 +2,10 @@ import net.minecraft.item.ItemStack; -public interface IGasProtector -{ +public interface IGasProtector { /** - * Applies ONLY to helmets, gets the percentage (1-100) of gas protection from smoke + * Applies ONLY to helmets, gets the percentage (1-100) of gas protection from + * smoke */ public float getGasProtection(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IPowerArmour.java b/src/main/java/minefantasy/mf2/api/armour/IPowerArmour.java index 1e7b4e7c..36286707 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IPowerArmour.java +++ b/src/main/java/minefantasy/mf2/api/armour/IPowerArmour.java @@ -13,7 +13,9 @@ public interface IPowerArmour { /** * Is armour covering a particular limb - * @param limb (head, body, left_arm, right_arm, left_leg, right_leg) + * + * @param limb + * (head, body, left_arm, right_arm, left_leg, right_leg) */ boolean isArmoured(String limb); diff --git a/src/main/java/minefantasy/mf2/api/armour/ISpecialArmourMF.java b/src/main/java/minefantasy/mf2/api/armour/ISpecialArmourMF.java index 9f08c2e5..397c2d6f 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ISpecialArmourMF.java +++ b/src/main/java/minefantasy/mf2/api/armour/ISpecialArmourMF.java @@ -6,19 +6,20 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; -public interface ISpecialArmourMF -{ +public interface ISpecialArmourMF { public float getDTValue(EntityLivingBase user, ItemStack armour, DamageSource src); + @SideOnly(Side.CLIENT) /** - * DamageType: 0=cutting, 1=blunt, 2=piercing + * DamageType: 0=cutting, 1=blunt, 2=piercing */ public float getDTDisplay(ItemStack armour, int damageType); - + public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src); + @SideOnly(Side.CLIENT) /** - * DamageType: 0=cutting, 1=blunt, 2=piercing + * DamageType: 0=cutting, 1=blunt, 2=piercing */ public float getDRDisplay(ItemStack armour, int damageType); } diff --git a/src/main/java/minefantasy/mf2/api/armour/ItemArmourMFBase.java b/src/main/java/minefantasy/mf2/api/armour/ItemArmourMFBase.java index 922876fd..242ecf7b 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ItemArmourMFBase.java +++ b/src/main/java/minefantasy/mf2/api/armour/ItemArmourMFBase.java @@ -18,9 +18,9 @@ import net.minecraftforge.common.ISpecialArmor; import net.minecraftforge.common.util.EnumHelper; -public class ItemArmourMFBase extends ItemArmor implements ISpecialArmor, IArmourMF, IArmourRating, ISpecialArmourMF -{ - public static ArmorMaterial baseMaterial = EnumHelper.addArmorMaterial("MF Armour Base", 0, new int[]{2, 6, 5, 2}, 0); +public class ItemArmourMFBase extends ItemArmor implements ISpecialArmor, IArmourMF, IArmourRating, ISpecialArmourMF { + public static ArmorMaterial baseMaterial = EnumHelper.addArmorMaterial("MF Armour Base", 0, + new int[] { 2, 6, 5, 2 }, 0); private int piece; private int baseRating; public float baseAR; @@ -31,11 +31,10 @@ public class ItemArmourMFBase extends ItemArmor implements ISpecialArmor, IArmou public ArmourDesign design; protected float suitBulk; public float DT; - + public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); - - public ItemArmourMFBase(String name, ArmourMaterialMF material, ArmourDesign AD, int slot, String tex) - { + + public ItemArmourMFBase(String name, ArmourMaterialMF material, ArmourDesign AD, int slot, String tex) { super(baseMaterial, 0, slot); this.material = material; baseAR = material.baseAR; @@ -45,256 +44,231 @@ public ItemArmourMFBase(String name, ArmourMaterialMF material, ArmourDesign AD, design = AD; suitBulk = design.getBulk(); texture = tex; - float baseDura = material.durability * design.getDurability()/2F; - float dura = baseDura /2F + (baseDura /2F * ArmourCalculator.sizes[slot] / ArmourCalculator.sizes[1]); - this.setMaxDamage((int)dura); + float baseDura = material.durability * design.getDurability() / 2F; + float dura = baseDura / 2F + (baseDura / 2F * ArmourCalculator.sizes[slot] / ArmourCalculator.sizes[1]); + this.setMaxDamage((int) dura); this.setUnlocalizedName(name); - setDT(getBaseAC()*scalePiece()); - - baseRating = ArmourCalculator.translateToVanillaAR(getBaseAC()+1F, baseMaterial.getDamageReductionAmount(slot), 15); + setDT(getBaseAC() * scalePiece()); + + baseRating = ArmourCalculator.translateToVanillaAR(getBaseAC() + 1F, + baseMaterial.getDamageReductionAmount(slot), 15); } - public ItemArmourMFBase setDT(float DT) - { + + public ItemArmourMFBase setDT(float DT) { this.DT = DT; return this; } - /* Piece | Slot - * 0 | 3 - * 1 | 2 - * 2 | 1 - * 3 | 0 */ + + /* + * Piece | Slot 0 | 3 1 | 2 2 | 1 3 | 0 + */ @Override - public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) - { - initArmourDamage(entity, stack, (float)damage); + public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { + initArmourDamage(entity, stack, damage); } - public void initArmourDamage(EntityLivingBase user, ItemStack armour, float damage) - { - armour.damageItem((int)(damage/5F)+1, user); + + public void initArmourDamage(EntityLivingBase user, ItemStack armour, float damage) { + armour.damageItem((int) (damage / 5F) + 1, user); } @Override - public int getArmorDisplay(EntityPlayer player, ItemStack armour, int slot) - { - float max = (float)armour.getMaxDamage(); - float dam = max - (float)armour.getItemDamage(); - - return (int)Math.round(5F / max * dam); + public int getArmorDisplay(EntityPlayer player, ItemStack armour, int slot) { + float max = armour.getMaxDamage(); + float dam = max - armour.getItemDamage(); + + return Math.round(5F / max * dam); } @Override - public ArmorProperties getProperties(EntityLivingBase player, ItemStack armour, DamageSource source, double damage, int slot) - { + public ArmorProperties getProperties(EntityLivingBase player, ItemStack armour, DamageSource source, double damage, + int slot) { float AC = getProtectionRatio(armour); AC = ArmourCalculator.getArmourValueMod(armour, AC); - - if(ArmourCalculator.advancedDamageTypes && !player.worldObj.isRemote) - { - AC = ArmourCalculator.adjustACForDamage(source, AC, getProtectiveTrait(armour, 0), getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); + + if (ArmourCalculator.advancedDamageTypes && !player.worldObj.isRemote) { + AC = ArmourCalculator.adjustACForDamage(source, AC, getProtectiveTrait(armour, 0), + getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); } - + AC *= getACModifier(player, armour, source, damage); - - if(source == DamageSource.fall && design == ArmourDesign.PLATE) - { - AC = 1F/material.armourWeight; - } - else if(source.isMagicDamage()) - { + + if (source == DamageSource.fall && design == ArmourDesign.PLATE) { + AC = 1F / material.armourWeight; + } else if (source.isMagicDamage()) { AC = getMagicAC(AC, source, damage, player); - } - else if(source == DamageSource.onFire) - { + } else if (source == DamageSource.onFire) { AC *= getACForBurn(); - } - else if(source.isUnblockable()) - { + } else if (source.isUnblockable()) { AC *= getUnblockableResistance(armour, source); } AC *= getSpecialModifier(armour, source); - - if(player.getEntityData().hasKey("MF_ZombieArmour")) - { + + if (player.getEntityData().hasKey("MF_ZombieArmour")) { AC -= 1.5F; - if(AC < 0)AC = 0; + if (AC < 0) + AC = 0; } - AC++;//because 1.0AC = no armour so it adds ontop of this - + AC++;// because 1.0AC = no armour so it adds ontop of this + double totalPercent = ArmourCalculator.convertToPercent(AC); - double maxPercent = 0.99D;//max percentage is 99% damage to avoid immunity - - if(totalPercent > maxPercent) - { + double maxPercent = 0.99D;// max percentage is 99% damage to avoid immunity + + if (totalPercent > maxPercent) { totalPercent = maxPercent; } - double percent = totalPercent*scalePiece(); - if(percent < 0) - { + double percent = totalPercent * scalePiece(); + if (percent < 0) { percent = 0; } - + return new ArmorProperties(0, percent, Integer.MAX_VALUE); } - + protected float getSpecialModifier(ItemStack armour, DamageSource source) { return 1.0F; } - private float getACForBurn() - { - return armourWeight >= ArmourCalculator.encumberanceArray[1] ? 0.1F : armourWeight >= ArmourCalculator.encumberanceArray[0] ? 0.05F : 0F; + + private float getACForBurn() { + return armourWeight >= ArmourCalculator.encumberanceArray[1] ? 0.1F + : armourWeight >= ArmourCalculator.encumberanceArray[0] ? 0.05F : 0F; } - public float getUnblockableResistance(ItemStack item, DamageSource source) - { + + public float getUnblockableResistance(ItemStack item, DamageSource source) { return 0F; } - - public float getMagicAC(float AC, DamageSource source, double damage, EntityLivingBase player) - { + + public float getMagicAC(float AC, DamageSource source, double damage, EntityLivingBase player) { return 0F; } - protected float getACModifier(EntityLivingBase player, ItemStack armour, DamageSource source, double damage) - { + + protected float getACModifier(EntityLivingBase player, ItemStack armour, DamageSource source, double damage) { return 1.0F; } - public float scalePiece() - { + + public float scalePiece() { return ArmourCalculator.sizes[piece]; } - protected float getProtectionRatio(ItemStack item) - { + protected float getProtectionRatio(ItemStack item) { return getBaseAC(); } - protected float getBaseAC() - { - return material.baseAR*design.getRating(); + + protected float getBaseAC() { + return material.baseAR * design.getRating(); } - private void addModifier(List list, ItemStack item, float ratio, String name) - { - if(getProtectionRatio(item) != ratio) - { - if(getProtectionRatio(item) > ratio) - { - float percent = (ratio / getProtectionRatio(item))-1F; - list.add(EnumChatFormatting.RED+ - StatCollector.translateToLocalFormatted("attribute.modifier.take."+ 1, - decimal_format.format(-percent * 100), - StatCollector.translateToLocal("attribute.armour."+name))); - }else - { - float percent = (ratio / getProtectionRatio(item))-1F; - list.add(EnumChatFormatting.DARK_GREEN+ - StatCollector.translateToLocalFormatted("attribute.modifier.plus."+ 1, - decimal_format.format(percent * 100), - StatCollector.translateToLocal("attribute.armour."+name))); - } - } + private void addModifier(List list, ItemStack item, float ratio, String name) { + if (getProtectionRatio(item) != ratio) { + if (getProtectionRatio(item) > ratio) { + float percent = (ratio / getProtectionRatio(item)) - 1F; + list.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted( + "attribute.modifier.take." + 1, decimal_format.format(-percent * 100), + StatCollector.translateToLocal("attribute.armour." + name))); + } else { + float percent = (ratio / getProtectionRatio(item)) - 1F; + list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( + "attribute.modifier.plus." + 1, decimal_format.format(percent * 100), + StatCollector.translateToLocal("attribute.armour." + name))); + } + } } - public ArmourMaterialMF getMaterial() - { + + public ArmourMaterialMF getMaterial() { return this.material; } - + @Override - public int getMaxDamage(ItemStack stack) - { - if(isUnbreakable()) - { - setUnbreakable(stack); + public int getMaxDamage(ItemStack stack) { + if (isUnbreakable()) { + setUnbreakable(stack); } return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); } - protected boolean isUnbreakable() - { + protected boolean isUnbreakable() { return false; } @Override - public float scalePiece(ItemStack item) - { + public float scalePiece(ItemStack item) { return scalePiece(); } - + @Override - public int getItemEnchantability() - { + public int getItemEnchantability() { return material.enchantment; } @Override - public float getPieceWeight(ItemStack item, int slot) - { + public float getPieceWeight(ItemStack item, int slot) { return armourWeight * ArmourCalculator.sizes[slot]; } - - public static void setUnbreakable(ItemStack tool) - { - if(!tool.hasTagCompound()) - { + + public static void setUnbreakable(ItemStack tool) { + if (!tool.hasTagCompound()) { tool.setTagCompound(new NBTTagCompound()); } tool.getTagCompound().setBoolean("Unbreakable", true); } - - private static final float[] AC = new float[]{40F, 60F}; + + private static final float[] AC = new float[] { 40F, 60F }; @Override - public String getSuitWeigthType(ItemStack item) - { + public String getSuitWeigthType(ItemStack item) { return design.getGroup(); } + @Override - public float getDTValue(EntityLivingBase user, ItemStack armour, DamageSource src) - { + public float getDTValue(EntityLivingBase user, ItemStack armour, DamageSource src) { float DT2 = DT; - - if(ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) - { - DT2 = ArmourCalculator.adjustACForDamage(src, DT2, getProtectiveTrait(armour, 0), getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); + + if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { + DT2 = ArmourCalculator.adjustACForDamage(src, DT2, getProtectiveTrait(armour, 0), + getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); } return DT2; } + @Override @SideOnly(Side.CLIENT) - public float getDTDisplay(ItemStack armour, int damageType) - { - return design.getProtectiveTraits()[damageType]*DT; + public float getDTDisplay(ItemStack armour, int damageType) { + return design.getProtectiveTraits()[damageType] * DT; } + @Override - public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src) - { - float DR = getProtectionRatio(armour)*scalePiece(); - - if(ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) - { - DR = ArmourCalculator.adjustACForDamage(src, DR, getProtectiveTrait(armour, 0), getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); + public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src) { + float DR = getProtectionRatio(armour) * scalePiece(); + + if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { + DR = ArmourCalculator.adjustACForDamage(src, DR, getProtectiveTrait(armour, 0), + getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); } return DR; } + @Override @SideOnly(Side.CLIENT) - public float getDRDisplay(ItemStack armour, int damageType) - { - float DR = getProtectionRatio(armour)*scalePiece(); - - if(ArmourCalculator.advancedDamageTypes) - { - DR = ArmourCalculator.modifyACForType(damageType, DR, getProtectiveTrait(armour, 0), getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); + public float getDRDisplay(ItemStack armour, int damageType) { + float DR = getProtectionRatio(armour) * scalePiece(); + + if (ArmourCalculator.advancedDamageTypes) { + DR = ArmourCalculator.modifyACForType(damageType, DR, getProtectiveTrait(armour, 0), + getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); } return DR; } - public float getProtectiveTrait(ItemStack item, int dtype) - { + + public float getProtectiveTrait(ItemStack item, int dtype) { return design.getProtectiveTraits()[dtype]; } + /** * Gets a modifier, improving resistances against the elements - * @param hazard is the type of damage, like "fire" + * + * @param hazard + * is the type of damage, like "fire" */ - public float getResistanceModifier(ItemStack item, String hazard) - { + public float getResistanceModifier(ItemStack item, String hazard) { return 1.0F; } } diff --git a/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java b/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java index d0194bba..0da370d4 100644 --- a/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java +++ b/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java @@ -8,55 +8,66 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; -public class CookRecipe -{ +public class CookRecipe { public static Item burnt_food = null; - private static final HashMaprecipeList = new HashMap(); - - public static CookRecipe addRecipe(ItemStack in, ItemStack out, int min, int max, int time, boolean bake, boolean canBurn) - { + private static final HashMap recipeList = new HashMap(); + + public static CookRecipe addRecipe(ItemStack in, ItemStack out, int min, int max, int time, boolean bake, + boolean canBurn) { return addRecipe(in, out, new ItemStack(burnt_food), min, max, time, bake, canBurn); } + /** * Add a recipe - * @param output The result item - * @param min the limit temperature for cooking - * @param max the max temperature before burning - * @param time the time in ticks taken - * @param bake whether it needs to be enclosed in an oven + * + * @param output + * The result item + * @param min + * the limit temperature for cooking + * @param max + * the max temperature before burning + * @param time + * the time in ticks taken + * @param bake + * whether it needs to be enclosed in an oven */ - public static CookRecipe addRecipe(ItemStack in, ItemStack out, ItemStack burnt, int min, int max, int time, boolean bake, boolean canBurn) - { - return addRecipe(in, out, burnt, min, max, time, time/2, bake, canBurn); + public static CookRecipe addRecipe(ItemStack in, ItemStack out, ItemStack burnt, int min, int max, int time, + boolean bake, boolean canBurn) { + return addRecipe(in, out, burnt, min, max, time, time / 2, bake, canBurn); } + /** * Add a recipe - * @param output The result item - * @param min the limit temperature for cooking - * @param max the max temperature before burning - * @param time the time in ticks taken - * @param bake whether it needs to be enclosed in an oven + * + * @param output + * The result item + * @param min + * the limit temperature for cooking + * @param max + * the max temperature before burning + * @param time + * the time in ticks taken + * @param bake + * whether it needs to be enclosed in an oven */ - public static CookRecipe addRecipe(ItemStack in, ItemStack out, ItemStack burnt, int min, int max, int time, int burntime, boolean bake, boolean canBurn) - { + public static CookRecipe addRecipe(ItemStack in, ItemStack out, ItemStack burnt, int min, int max, int time, + int burntime, boolean bake, boolean canBurn) { CookRecipe recipe = new CookRecipe(out, burnt, min, max, time, bake, canBurn); recipeList.put(CustomToolHelper.getReferenceName(in), recipe); - - if(canBurn) - { + + if (canBurn) { addRecipe(out, burnt, null, min, max, burntime, bake, false); } return recipe; } - + public final int maxTemperature, minTemperature, time; public final boolean isBaking; public final ItemStack output, burnt; public final boolean canBurn; - public CookRecipe(ItemStack output, ItemStack burnt, int min, int max, int time, boolean bake, boolean burn) - { - this.output=output; + public CookRecipe(ItemStack output, ItemStack burnt, int min, int max, int time, boolean bake, boolean burn) { + this.output = output; this.burnt = burnt; this.minTemperature = min; this.maxTemperature = max; @@ -64,33 +75,28 @@ public CookRecipe(ItemStack output, ItemStack burnt, int min, int max, int time, this.isBaking = bake; this.canBurn = burn; } - - public static CookRecipe getResult(ItemStack item, boolean oven) - { - if(item == null)return null; - + + public static CookRecipe getResult(ItemStack item, boolean oven) { + if (item == null) + return null; + CookRecipe result = recipeList.get(CustomToolHelper.getReferenceName(item)); - if(result != null && !result.isBaking || oven) - { + if (result != null && !result.isBaking || oven) { return result; - } - else - { + } else { result = recipeList.get(CustomToolHelper.getReferenceName(item)); - if(result != null&& !result.isBaking || oven) - { + if (result != null && !result.isBaking || oven) { return result; } } - if(canCookBasics) - { + if (canCookBasics) { ItemStack recipe = FurnaceRecipes.smelting().getSmeltingResult(item); - if(recipe != null && recipe.getItem() instanceof ItemFood) - { + if (recipe != null && recipe.getItem() instanceof ItemFood) { return new CookRecipe(recipe, new ItemStack(burnt_food), 100, 300, 20, false, true); } } return null; } + public static boolean canCookBasics = true; } diff --git a/src/main/java/minefantasy/mf2/api/crafting/BasicTierRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/BasicTierRecipe.java index 74629b84..6230bb86 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/BasicTierRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/BasicTierRecipe.java @@ -8,177 +8,146 @@ import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.world.World; -public class BasicTierRecipe extends ShapedRecipes -{ +public class BasicTierRecipe extends ShapedRecipes { - public BasicTierRecipe(int width, int height, ItemStack[] input, ItemStack output) - { + public BasicTierRecipe(int width, int height, ItemStack[] input, ItemStack output) { super(width, height, input, output); } @Override - public boolean matches(InventoryCrafting matrix, World world) - { - for (int i = 0; i <= 3 - this.recipeWidth; ++i) - { - for (int j = 0; j <= 3 - this.recipeHeight; ++j) - { - if (this.checkTierMatch(matrix, i, j, true)) - { - return true; - } - - if (this.checkTierMatch(matrix, i, j, false)) - { - return true; - } - } - } - - return false; - } - - /** - * Checks if the region of a crafting inventory is match for the recipe. - */ - private boolean checkTierMatch(InventoryCrafting matrix, int x, int y, boolean mirror) - { - String wood = null; - String metal = null; - for (int k = 0; k < 3; ++k) - { - for (int l = 0; l < 3; ++l) - { - int i1 = k - x; - int j1 = l - y; - ItemStack itemstack = null; - - if (i1 >= 0 && j1 >= 0 && i1 < this.recipeWidth && j1 < this.recipeHeight) - { - if (mirror) - { - itemstack = this.recipeItems[this.recipeWidth - i1 - 1 + j1 * this.recipeWidth]; - } - else - { - itemstack = this.recipeItems[i1 + j1 * this.recipeWidth]; - } - } - - ItemStack itemstack1 = matrix.getStackInRowAndColumn(k, l); - - if (itemstack1 != null || itemstack != null) - { - //String recipe_wood = CustomToolHelper.getComponentMaterial(itemstack, "wood"); - String recipe_metal = CustomToolHelper.getComponentMaterial(itemstack, "metal"); - - //String component_wood = CustomToolHelper.getComponentMaterial(itemstack1, "wood"); - String component_metal = CustomToolHelper.getComponentMaterial(itemstack1, "metal"); - - if(recipe_metal != null) - { - if(component_metal == null)return false; - if(!component_metal.equalsIgnoreCase(recipe_metal))return false; - } - - if (itemstack1 == null && itemstack != null || itemstack1 != null && itemstack == null) - { - return false; - } - - if (itemstack.getItem() != itemstack1.getItem()) - { - return false; - } - - if (itemstack.getItemDamage() != 32767 && itemstack.getItemDamage() != itemstack1.getItemDamage()) - { - return false; - } - } - } - } - - return true; - } - public static BasicTierRecipe add(ItemStack result, Object ... input) - { - String var3 = ""; - int var4 = 0; - int var5 = 0; - int var6 = 0; - int var9; - - if (input[var4] instanceof String[]) - { - String[] var7 = ((String[])input[var4++]); - String[] var8 = var7; - var9 = var7.length; - - for (int var10 = 0; var10 < var9; ++var10) - { - String var11 = var8[var10]; - ++var6; - var5 = var11.length(); - var3 = var3 + var11; - } - } - else - { - while (input[var4] instanceof String) - { - String var13 = (String)input[var4++]; - ++var6; - var5 = var13.length(); - var3 = var3 + var13; - } - } - - HashMap var14; - - for (var14 = new HashMap(); var4 < input.length; var4 += 2) - { - Character var16 = (Character)input[var4]; - ItemStack var17 = null; - - if (input[var4 + 1] instanceof Item) - { - var17 = new ItemStack((Item)input[var4 + 1], 1, 32767); - } - else if (input[var4 + 1] instanceof Block) - { - var17 = new ItemStack((Block)input[var4 + 1], 1, 32767); - } - else if (input[var4 + 1] instanceof ItemStack) - { - var17 = (ItemStack)input[var4 + 1]; - } - - var14.put(var16, var17); - } - - ItemStack[] var15 = new ItemStack[var5 * var6]; - - for (var9 = 0; var9 < var5 * var6; ++var9) - { - char var18 = var3.charAt(var9); - - if (var14.containsKey(Character.valueOf(var18))) - { - var15[var9] = ((ItemStack)var14.get(Character.valueOf(var18))).copy(); - } - else - { - var15[var9] = null; - } - } + public boolean matches(InventoryCrafting matrix, World world) { + for (int i = 0; i <= 3 - this.recipeWidth; ++i) { + for (int j = 0; j <= 3 - this.recipeHeight; ++j) { + if (this.checkTierMatch(matrix, i, j, true)) { + return true; + } + + if (this.checkTierMatch(matrix, i, j, false)) { + return true; + } + } + } + + return false; + } + + /** + * Checks if the region of a crafting inventory is match for the recipe. + */ + private boolean checkTierMatch(InventoryCrafting matrix, int x, int y, boolean mirror) { + String wood = null; + String metal = null; + for (int k = 0; k < 3; ++k) { + for (int l = 0; l < 3; ++l) { + int i1 = k - x; + int j1 = l - y; + ItemStack itemstack = null; + + if (i1 >= 0 && j1 >= 0 && i1 < this.recipeWidth && j1 < this.recipeHeight) { + if (mirror) { + itemstack = this.recipeItems[this.recipeWidth - i1 - 1 + j1 * this.recipeWidth]; + } else { + itemstack = this.recipeItems[i1 + j1 * this.recipeWidth]; + } + } + + ItemStack itemstack1 = matrix.getStackInRowAndColumn(k, l); + + if (itemstack1 != null || itemstack != null) { + // String recipe_wood = CustomToolHelper.getComponentMaterial(itemstack, + // "wood"); + String recipe_metal = CustomToolHelper.getComponentMaterial(itemstack, "metal"); + + // String component_wood = CustomToolHelper.getComponentMaterial(itemstack1, + // "wood"); + String component_metal = CustomToolHelper.getComponentMaterial(itemstack1, "metal"); + + if (recipe_metal != null) { + if (component_metal == null) + return false; + if (!component_metal.equalsIgnoreCase(recipe_metal)) + return false; + } + + if (itemstack1 == null && itemstack != null || itemstack1 != null && itemstack == null) { + return false; + } + + if (itemstack.getItem() != itemstack1.getItem()) { + return false; + } + + if (itemstack.getItemDamage() != 32767 && itemstack.getItemDamage() != itemstack1.getItemDamage()) { + return false; + } + } + } + } + + return true; + } + + public static BasicTierRecipe add(ItemStack result, Object... input) { + String var3 = ""; + int var4 = 0; + int var5 = 0; + int var6 = 0; + int var9; + + if (input[var4] instanceof String[]) { + String[] var7 = ((String[]) input[var4++]); + String[] var8 = var7; + var9 = var7.length; + + for (int var10 = 0; var10 < var9; ++var10) { + String var11 = var8[var10]; + ++var6; + var5 = var11.length(); + var3 = var3 + var11; + } + } else { + while (input[var4] instanceof String) { + String var13 = (String) input[var4++]; + ++var6; + var5 = var13.length(); + var3 = var3 + var13; + } + } + + HashMap var14; + + for (var14 = new HashMap(); var4 < input.length; var4 += 2) { + Character var16 = (Character) input[var4]; + ItemStack var17 = null; + + if (input[var4 + 1] instanceof Item) { + var17 = new ItemStack((Item) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof Block) { + var17 = new ItemStack((Block) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof ItemStack) { + var17 = (ItemStack) input[var4 + 1]; + } + + var14.put(var16, var17); + } + + ItemStack[] var15 = new ItemStack[var5 * var6]; + + for (var9 = 0; var9 < var5 * var6; ++var9) { + char var18 = var3.charAt(var9); + + if (var14.containsKey(Character.valueOf(var18))) { + var15[var9] = ((ItemStack) var14.get(Character.valueOf(var18))).copy(); + } else { + var15[var9] = null; + } + } BasicTierRecipe recipe = new BasicTierRecipe(var5, var6, var15, result); GameRegistry.addRecipe(recipe); return recipe; - } + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/CustomCrafterEntry.java b/src/main/java/minefantasy/mf2/api/crafting/CustomCrafterEntry.java index 7b278e91..22dceabd 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/CustomCrafterEntry.java +++ b/src/main/java/minefantasy/mf2/api/crafting/CustomCrafterEntry.java @@ -2,78 +2,76 @@ import java.util.HashMap; -import minefantasy.mf2.api.MineFantasyAPI; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class CustomCrafterEntry -{ +public class CustomCrafterEntry { /** * Registeres a piece (called by code or config) - * @param piece the item to list - * @param type the crafter type + * + * @param piece + * the item to list + * @param type + * the crafter type */ - public static void registerItem(Item piece, String type, float efficiency, int tier) - { + public static void registerItem(Item piece, String type, float efficiency, int tier) { entries.put(piece, new CustomCrafterEntry(piece, type, efficiency, tier)); } - + /** * Gets the variables for the item if there are any: order is weight, bulk */ - public static String getEntryType(ItemStack piece) - { + public static String getEntryType(ItemStack piece) { CustomCrafterEntry entry = getEntry(piece); - if(entry != null) - { + if (entry != null) { return entry.type; } return "nothing"; } - public static float getEntryEfficiency(ItemStack piece) - { + + public static float getEntryEfficiency(ItemStack piece) { CustomCrafterEntry entry = getEntry(piece); - if(entry != null) - { + if (entry != null) { return entry.efficiency; } return 2.0F; } - public static int getEntryTier(ItemStack piece) - { + + public static int getEntryTier(ItemStack piece) { CustomCrafterEntry entry = getEntry(piece); - if(entry != null) - { + if (entry != null) { return entry.tier; } return -1; } + /** * Gets the entry for an item - * @param piece the armour item + * + * @param piece + * the armour item * @return the entry(if there is one), else null */ - public static CustomCrafterEntry getEntry(ItemStack piece) - { + public static CustomCrafterEntry getEntry(ItemStack piece) { return getEntry(piece.getItem()); } + /** * Gets the entry for an item - * @param piece the armour item + * + * @param piece + * the armour item * @return the entry(if there is one), else null */ - public static CustomCrafterEntry getEntry(Item piece) - { - if(piece != null) - { - if(entries.containsKey(piece)) - { + public static CustomCrafterEntry getEntry(Item piece) { + if (piece != null) { + if (entries.containsKey(piece)) { return entries.get(piece); } } return null; } - + public Item itemID; /** * The Efficiency(same variable as dig speed) @@ -81,11 +79,10 @@ public static CustomCrafterEntry getEntry(Item piece) public String type; public float efficiency; public int tier; - - public static HashMapentries = new HashMap(); - - private CustomCrafterEntry(Item id, String type, float efficiency, int tier) - { + + public static HashMap entries = new HashMap(); + + private CustomCrafterEntry(Item id, String type, float efficiency, int tier) { this.itemID = id; this.type = type; this.efficiency = efficiency; diff --git a/src/main/java/minefantasy/mf2/api/crafting/IBasicMetre.java b/src/main/java/minefantasy/mf2/api/crafting/IBasicMetre.java index 4ffd9285..a8d7034d 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/IBasicMetre.java +++ b/src/main/java/minefantasy/mf2/api/crafting/IBasicMetre.java @@ -1,8 +1,9 @@ package minefantasy.mf2.api.crafting; -public interface IBasicMetre -{ +public interface IBasicMetre { int getMetreScale(int size); + boolean shouldShowMetre(); + String getLocalisedName(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/IHeatSource.java b/src/main/java/minefantasy/mf2/api/crafting/IHeatSource.java index 3e78c87f..f464f374 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/IHeatSource.java +++ b/src/main/java/minefantasy/mf2/api/crafting/IHeatSource.java @@ -1,7 +1,7 @@ package minefantasy.mf2.api.crafting; -public interface IHeatSource -{ +public interface IHeatSource { public boolean canPlaceAbove(); + public int getHeat(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/IQualityBalance.java b/src/main/java/minefantasy/mf2/api/crafting/IQualityBalance.java index 77cd695b..4eff5941 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/IQualityBalance.java +++ b/src/main/java/minefantasy/mf2/api/crafting/IQualityBalance.java @@ -1,9 +1,11 @@ package minefantasy.mf2.api.crafting; -public interface IQualityBalance -{ +public interface IQualityBalance { float getMarkerPosition(); + float getThresholdPosition(); + float getSuperThresholdPosition(); + boolean shouldShowMetre(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/ISalvageDrop.java b/src/main/java/minefantasy/mf2/api/crafting/ISalvageDrop.java index 823c897a..9188c123 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/ISalvageDrop.java +++ b/src/main/java/minefantasy/mf2/api/crafting/ISalvageDrop.java @@ -3,8 +3,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -public interface ISalvageDrop -{ +public interface ISalvageDrop { public boolean canSalvage(EntityPlayer user, ItemStack item); - + } diff --git a/src/main/java/minefantasy/mf2/api/crafting/ISpecialSalvage.java b/src/main/java/minefantasy/mf2/api/crafting/ISpecialSalvage.java index 6afd8e32..31c42620 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/ISpecialSalvage.java +++ b/src/main/java/minefantasy/mf2/api/crafting/ISpecialSalvage.java @@ -2,11 +2,11 @@ import net.minecraft.item.ItemStack; -public interface ISpecialSalvage -{ +public interface ISpecialSalvage { /** - * Returns a list of Items, Blocks, or ItemStacks dropped by salvage (similar to the regular function) + * Returns a list of Items, Blocks, or ItemStacks dropped by salvage (similar to + * the regular function) */ public Object[] getSalvage(ItemStack item); - + } diff --git a/src/main/java/minefantasy/mf2/api/crafting/ITieredComponent.java b/src/main/java/minefantasy/mf2/api/crafting/ITieredComponent.java index c8f0755d..ff7985a5 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/ITieredComponent.java +++ b/src/main/java/minefantasy/mf2/api/crafting/ITieredComponent.java @@ -2,8 +2,7 @@ import net.minecraft.item.ItemStack; -public interface ITieredComponent -{ +public interface ITieredComponent { /** * is it made of "wood", "metal", etc */ diff --git a/src/main/java/minefantasy/mf2/api/crafting/MineFantasyFuels.java b/src/main/java/minefantasy/mf2/api/crafting/MineFantasyFuels.java index f5ae7822..880a6b7a 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/MineFantasyFuels.java +++ b/src/main/java/minefantasy/mf2/api/crafting/MineFantasyFuels.java @@ -7,88 +7,79 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class MineFantasyFuels -{ - public static void addForgeFuel(Object input, float time, int temperature) - { +public class MineFantasyFuels { + public static void addForgeFuel(Object input, float time, int temperature) { addForgeFuel(input, time, temperature, false, false); } - public static void addForgeFuel(Object input, float time, int temperature, boolean willLight) - { + + public static void addForgeFuel(Object input, float time, int temperature, boolean willLight) { addForgeFuel(input, time, temperature, willLight, false); } - public static void addForgeFuel(Object input, float time, int temperature, boolean willLight, boolean refined) - { + + public static void addForgeFuel(Object input, float time, int temperature, boolean willLight, boolean refined) { ItemStack item = convert(input); - if(item != null) - { + if (item != null) { ForgeItemHandler.forgeFuel.add(new ForgeFuel(item, time, temperature, willLight, refined)); - if ((int) (temperature * 1.25) > ForgeItemHandler.forgeMaxTemp) - { + if ((int) (temperature * 1.25) > ForgeItemHandler.forgeMaxTemp) { ForgeItemHandler.forgeMaxTemp = (int) (temperature * 1.25); } } } + /** * Adds a carbon item for smelting - * @param input Item Block or ItemStack + * + * @param input + * Item Block or ItemStack * @param uses */ - public static void addCarbon(Object input, int uses) - { + public static void addCarbon(Object input, int uses) { ItemStack itemstack = convert(input); - - if(itemstack != null) - { - OreDictionary.registerOre("Carbon-"+uses, itemstack); + + if (itemstack != null) { + OreDictionary.registerOre("Carbon-" + uses, itemstack); } } + /** * How many smelts (blast furn or bloomery) this can give as carbon */ - public static int getCarbon(ItemStack item) - { - if(item == null)return 0; - - for(int i: OreDictionary.getOreIDs(item)) - { + public static int getCarbon(ItemStack item) { + if (item == null) + return 0; + + for (int i : OreDictionary.getOreIDs(item)) { String name = OreDictionary.getOreName(i); - if(name != null && name.startsWith("Carbon-")) - { + if (name != null && name.startsWith("Carbon-")) { String s = name.substring(7); int uses = Integer.parseInt(s); return uses; } } - + return 0; } + /** * Determines if the item can be used for carbon in smelting. */ - public static boolean isCarbon(ItemStack item) - { - return getCarbon(item)>0; + public static boolean isCarbon(ItemStack item) { + return getCarbon(item) > 0; } - - public static ItemStack convert(Object input) - { - if(input == null)return null; - + + public static ItemStack convert(Object input) { + if (input == null) + return null; + ItemStack itemstack = null; - if(input instanceof ItemStack) - { - return (ItemStack)input; + if (input instanceof ItemStack) { + return (ItemStack) input; + } else if (input instanceof Block) { + return new ItemStack((Block) input); + } else if (input instanceof Item) { + return new ItemStack((Item) input); } - else if(input instanceof Block) - { - return new ItemStack((Block)input); - } - else if(input instanceof Item) - { - return new ItemStack((Item)input); - } - + return null; } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java index 2a724667..e87ac557 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java +++ b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java @@ -2,9 +2,7 @@ import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; -import java.util.Map.Entry; import java.util.Random; import minefantasy.mf2.api.helpers.CustomToolHelper; @@ -15,100 +13,85 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class Salvage -{ +public class Salvage { private static Random random = new Random(); private static HashMap salvageList = new HashMap(); - private static HashMapsharedSalvage = new HashMap(); - - public static void shareSalvage(Item item1, Item item2) - { + private static HashMap sharedSalvage = new HashMap(); + + public static void shareSalvage(Item item1, Item item2) { sharedSalvage.put(CustomToolHelper.getSimpleReferenceName(item1), item2); } - public static void addSalvage(Block input, Object... components) - { + + public static void addSalvage(Block input, Object... components) { addSalvage(Item.getItemFromBlock(input), components); } - public static void addSalvage(Item input, Object... components) - { + + public static void addSalvage(Item input, Object... components) { salvageList.put(CustomToolHelper.getSimpleReferenceName(input), components); } - public static void addSalvage(ItemStack item, Object...components) - { - if(item.isItemStackDamageable()) - { + + public static void addSalvage(ItemStack item, Object... components) { + if (item.isItemStackDamageable()) { item.setItemDamage(OreDictionary.WILDCARD_VALUE); } salvageList.put(CustomToolHelper.getReferenceName(item), components); - } + } /** * Break an item to its parts + * * @return a list of items */ - public static List salvage(EntityPlayer user, ItemStack item) - { + public static List salvage(EntityPlayer user, ItemStack item) { return salvage(user, item, 1.0F); - } - - public static List salvage(EntityPlayer user, ItemStack item, float dropRate) - { - Object[] entryList = getSalvage(item); - if(entryList == null) - { - return null; - } - - float durability = 1F; - if(item.isItemDamaged()) - { - durability = (float)(item.getMaxDamage() - item.getItemDamage()) / (float)item.getMaxDamage(); - } - - float chanceModifier = 1.25F;//80% Succcess rate - float chance = dropRate*durability;//Modifier for skill and durability - - return dropItems(item, user, entryList, chanceModifier, chance); - } - - private static List dropItems(ItemStack mainItem, EntityPlayer user, Object[] entryList, float chanceModifier, float chance) - { - Listitems = new ArrayList(); - for(Object entry : entryList) - { - if(entry != null) - { - if(entry instanceof Item && random.nextFloat()*chanceModifier < chance) - { - items = dropItemStack(mainItem, user, items, new ItemStack((Item)entry), chanceModifier, chance); - } - if(entry instanceof Block && random.nextFloat()*chanceModifier < chance) - { - items = dropItemStack(mainItem, user, items, new ItemStack((Block)entry), chanceModifier, chance); - } - if(entry instanceof ItemStack) - { - items = dropItemStack(mainItem, user, items, (ItemStack)entry, chanceModifier, chance); - } + } + + public static List salvage(EntityPlayer user, ItemStack item, float dropRate) { + Object[] entryList = getSalvage(item); + if (entryList == null) { + return null; + } + + float durability = 1F; + if (item.isItemDamaged()) { + durability = (float) (item.getMaxDamage() - item.getItemDamage()) / (float) item.getMaxDamage(); + } + + float chanceModifier = 1.25F;// 80% Succcess rate + float chance = dropRate * durability;// Modifier for skill and durability + + return dropItems(item, user, entryList, chanceModifier, chance); + } + + private static List dropItems(ItemStack mainItem, EntityPlayer user, Object[] entryList, + float chanceModifier, float chance) { + List items = new ArrayList(); + for (Object entry : entryList) { + if (entry != null) { + if (entry instanceof Item && random.nextFloat() * chanceModifier < chance) { + items = dropItemStack(mainItem, user, items, new ItemStack((Item) entry), chanceModifier, chance); + } + if (entry instanceof Block && random.nextFloat() * chanceModifier < chance) { + items = dropItemStack(mainItem, user, items, new ItemStack((Block) entry), chanceModifier, chance); + } + if (entry instanceof ItemStack) { + items = dropItemStack(mainItem, user, items, (ItemStack) entry, chanceModifier, chance); + } } - } + } return items; } - - private static List dropItemStack(ItemStack mainItem, EntityPlayer user, Listitems, ItemStack entry, float chanceModifier, float chance) - { - for(int a = 0; a < entry.stackSize; a++) - { - if(random.nextFloat()*chanceModifier < chance) - { + + private static List dropItemStack(ItemStack mainItem, EntityPlayer user, List items, + ItemStack entry, float chanceModifier, float chance) { + for (int a = 0; a < entry.stackSize; a++) { + if (random.nextFloat() * chanceModifier < chance) { boolean canSalvage = true; - - if(entry.getItem() instanceof ISalvageDrop) - { - canSalvage = ((ISalvageDrop)entry.getItem()).canSalvage(user, entry); + + if (entry.getItem() instanceof ISalvageDrop) { + canSalvage = ((ISalvageDrop) entry.getItem()).canSalvage(user, entry); } - if(canSalvage) - { + if (canSalvage) { ItemStack newitem = entry.copy(); newitem.stackSize = 1; newitem = CustomToolHelper.tryDeconstruct(newitem, mainItem); @@ -118,43 +101,38 @@ private static List dropItemStack(ItemStack mainItem, EntityPlayer us } return items; } - public static Object[] getSalvage(ItemStack item) - { - //SHARED + + public static Object[] getSalvage(ItemStack item) { + // SHARED Item shared = sharedSalvage.get(CustomToolHelper.getReferenceName(item, "any", false)); - if(shared != null) - { + if (shared != null) { MFLogUtil.logDebug("Found shared: " + shared.getUnlocalizedName()); return getSalvage(new ItemStack(shared)); } - - if(item != null && item.getItem() instanceof ISpecialSalvage) - { - Object[] special = ((ISpecialSalvage)item.getItem()).getSalvage(item); - if(special != null) - { + + if (item != null && item.getItem() instanceof ISpecialSalvage) { + Object[] special = ((ISpecialSalvage) item.getItem()).getSalvage(item); + if (special != null) { return special; } } Object[] specific = salvageList.get(CustomToolHelper.getReferenceName(item)); - if(specific != null) - { + if (specific != null) { return specific; } Object[] specific2 = salvageList.get(CustomToolHelper.getReferenceName(item, "any")); - if(specific2 != null) - { + if (specific2 != null) { return specific2; } - + return salvageList.get(CustomToolHelper.getReferenceName(item, "any", false)); - } - private static boolean doesMatch(ItemStack item1, ItemStack item2) - { - if(!CustomToolHelper.doesMatchForRecipe(item1, item2)) - { - return false; - } - return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE || item2.getItemDamage() == item1.getItemDamage()); - } + } + + private static boolean doesMatch(ItemStack item1, ItemStack item2) { + if (!CustomToolHelper.doesMatchForRecipe(item1, item2)) { + return false; + } + return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE + || item2.getItemDamage() == item1.getItemDamage()); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/AnvilCraftMatrix.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/AnvilCraftMatrix.java index 398117b3..fb725464 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/AnvilCraftMatrix.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/AnvilCraftMatrix.java @@ -1,26 +1,23 @@ package minefantasy.mf2.api.crafting.anvil; -import minefantasy.mf2.api.crafting.anvil.IAnvil; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; -public class AnvilCraftMatrix extends InventoryCrafting -{ +public class AnvilCraftMatrix extends InventoryCrafting { private IAnvil anvil; - public AnvilCraftMatrix(IAnvil anvil, Container instance, int xSize, int ySize) - { + + public AnvilCraftMatrix(IAnvil anvil, Container instance, int xSize, int ySize) { super(instance, xSize, ySize); this.anvil = anvil; } - - public void modifyTier(int hammerTier, int anvilTier, int craftTime) - { + + public void modifyTier(int hammerTier, int anvilTier, int craftTime) { anvil.setHammerUsed(hammerTier); anvil.setRequiredAnvil(anvilTier); anvil.setForgeTime(craftTime); } - public void modifyResearch(String name) - { + + public void modifyResearch(String name) { anvil.setResearch(name); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/CraftingManagerAnvil.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/CraftingManagerAnvil.java index 7e5258b8..2f9385f5 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/CraftingManagerAnvil.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/CraftingManagerAnvil.java @@ -17,327 +17,276 @@ * @author AnonymousProductions * */ -public class CraftingManagerAnvil -{ - /** The static instance of this class */ - private static final CraftingManagerAnvil instance = new CraftingManagerAnvil(); - - /** A list of all the recipes added */ - public List recipes = new ArrayList(); - - /** - * Returns the static instance of this class - */ - public static CraftingManagerAnvil getInstance() - { - return instance; - } - - private CraftingManagerAnvil() - { - Collections.sort(this.recipes, new RecipeSorterAnvil(this)); - System.out.println("MineFantasy: Anvil recipes initiating"); - } - - public IAnvilRecipe addRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, String tool, int hammer, int anvil, int time, Object ... input) - { - return addRecipe(result, skill, research, hot, exp, tool, hammer, anvil, time, (byte)0, input); - } - public IAnvilRecipe addToolRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, String tool, int hammer, int anvil, int time, Object ... input) - { - return addRecipe(result, skill, research, hot, exp, tool, hammer, anvil, time, (byte)1, input); - } - /** - * Adds a recipe. See spreadsheet on first page for details. - */ - private IAnvilRecipe addRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, String tool, int hammer, int anvil, int time, byte recipeType, Object ... input) - { - String var3 = ""; - int var4 = 0; - int var5 = 0; - int var6 = 0; - int var9; - - if (input[var4] instanceof String[]) - { - String[] var7 = ((String[])input[var4++]); - String[] var8 = var7; - var9 = var7.length; - - for (int var10 = 0; var10 < var9; ++var10) - { - String var11 = var8[var10]; - ++var6; - var5 = var11.length(); - var3 = var3 + var11; - } - } - else - { - while (input[var4] instanceof String) - { - String var13 = (String)input[var4++]; - ++var6; - var5 = var13.length(); - var3 = var3 + var13; - } - } - - HashMap var14; - - for (var14 = new HashMap(); var4 < input.length; var4 += 2) - { - Character var16 = (Character)input[var4]; - ItemStack var17 = null; - - if (input[var4 + 1] instanceof Item) - { - var17 = new ItemStack((Item)input[var4 + 1], 1, 32767); - } - else if (input[var4 + 1] instanceof Block) - { - var17 = new ItemStack((Block)input[var4 + 1], 1, 32767); - } - else if (input[var4 + 1] instanceof ItemStack) - { - var17 = (ItemStack)input[var4 + 1]; - } - - var14.put(var16, var17); - } - - ItemStack[] var15 = new ItemStack[var5 * var6]; - - for (var9 = 0; var9 < var5 * var6; ++var9) - { - char var18 = var3.charAt(var9); - - if (var14.containsKey(Character.valueOf(var18))) - { - var15[var9] = ((ItemStack)var14.get(Character.valueOf(var18))).copy(); - } - else - { - var15[var9] = null; - } - } - - IAnvilRecipe recipe; - if(recipeType == (byte)1) - { - recipe = new CustomToolRecipe(var5, var6, var15, result, tool, time, hammer, anvil, exp, hot, research, skill); - } - else - { - recipe = new ShapedAnvilRecipes(var5, var6, var15, result, tool, time, hammer, anvil, exp, hot, research, skill); - } - this.recipes.add(recipe); - return recipe; - } - - public IAnvilRecipe addShapelessRecipe(ItemStack output, Skill skill, String research, boolean hot, float experience, String tool, int hammer, int anvil, int time, Object ... input) - { - ArrayList var3 = new ArrayList(); - Object[] var4 = input; - int var5 = input.length; - - for (int var6 = 0; var6 < var5; ++var6) - { - Object var7 = var4[var6]; - - if (var7 instanceof ItemStack) - { - var3.add(((ItemStack)var7).copy()); - } - else if (var7 instanceof Item) - { - var3.add(new ItemStack((Item)var7)); - } - else - { - if (!(var7 instanceof Block)) - { - throw new RuntimeException("MineFantasy: Invalid shapeless anvil recipe!"); - } - - var3.add(new ItemStack((Block)var7)); - } - } - - IAnvilRecipe recipe = new ShapelessAnvilRecipes(output, tool, experience, hammer, anvil, time, var3, hot, research, skill); - this.recipes.add(recipe); - return recipe; - } - public ItemStack findMatchingRecipe(AnvilCraftMatrix matrix) - { - int var2 = 0; - ItemStack var3 = null; - ItemStack var4 = null; - - for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) - { - ItemStack var6 = matrix.getStackInSlot(var5); - - if (var6 != null) - { - if (var2 == 0) - { - var3 = var6; - } - - if (var2 == 1) - { - var4 = var6; - } - - ++var2; - } - } - - if (var2 == 2 && canRepair(var3, var4)) - { - Item var10 = var3.getItem(); - int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); - int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); - int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; - int var9 = var10.getMaxDamage() - (var8)*2; - - if (var9 < 0) - { - var9 = 0; - } - - return new ItemStack(var3.getItem(), 1, var9); - } - else - { - Iterator var11 = this.recipes.iterator(); - IAnvilRecipe var13; - - do - { - if (!var11.hasNext()) - { - return null; - } - - var13 = (IAnvilRecipe)var11.next(); - } - while (!var13.matches(matrix)); - - return var13.getCraftingResult(matrix); - } - } - - - - private boolean canRepair(ItemStack item1, ItemStack item2) - { - if(item1.getItem() == item2.getItem() && item1.stackSize == 1 && item2.stackSize == 1 && item1.getItem().isRepairable()) - { - return true; - } - if(item1.getItem() == item2.getItem() && item1.stackSize == 1 && item2.stackSize == 1 && item1.isItemDamaged() && CustomToolHelper.areToolsSame(item1, item2)) - { - return true; - } +public class CraftingManagerAnvil { + /** The static instance of this class */ + private static final CraftingManagerAnvil instance = new CraftingManagerAnvil(); + + /** A list of all the recipes added */ + public List recipes = new ArrayList(); + + /** + * Returns the static instance of this class + */ + public static CraftingManagerAnvil getInstance() { + return instance; + } + + private CraftingManagerAnvil() { + Collections.sort(this.recipes, new RecipeSorterAnvil(this)); + System.out.println("MineFantasy: Anvil recipes initiating"); + } + + public IAnvilRecipe addRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, String tool, + int hammer, int anvil, int time, Object... input) { + return addRecipe(result, skill, research, hot, exp, tool, hammer, anvil, time, (byte) 0, input); + } + + public IAnvilRecipe addToolRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, + String tool, int hammer, int anvil, int time, Object... input) { + return addRecipe(result, skill, research, hot, exp, tool, hammer, anvil, time, (byte) 1, input); + } + + /** + * Adds a recipe. See spreadsheet on first page for details. + */ + private IAnvilRecipe addRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, String tool, + int hammer, int anvil, int time, byte recipeType, Object... input) { + String var3 = ""; + int var4 = 0; + int var5 = 0; + int var6 = 0; + int var9; + + if (input[var4] instanceof String[]) { + String[] var7 = ((String[]) input[var4++]); + String[] var8 = var7; + var9 = var7.length; + + for (int var10 = 0; var10 < var9; ++var10) { + String var11 = var8[var10]; + ++var6; + var5 = var11.length(); + var3 = var3 + var11; + } + } else { + while (input[var4] instanceof String) { + String var13 = (String) input[var4++]; + ++var6; + var5 = var13.length(); + var3 = var3 + var13; + } + } + + HashMap var14; + + for (var14 = new HashMap(); var4 < input.length; var4 += 2) { + Character var16 = (Character) input[var4]; + ItemStack var17 = null; + + if (input[var4 + 1] instanceof Item) { + var17 = new ItemStack((Item) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof Block) { + var17 = new ItemStack((Block) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof ItemStack) { + var17 = (ItemStack) input[var4 + 1]; + } + + var14.put(var16, var17); + } + + ItemStack[] var15 = new ItemStack[var5 * var6]; + + for (var9 = 0; var9 < var5 * var6; ++var9) { + char var18 = var3.charAt(var9); + + if (var14.containsKey(Character.valueOf(var18))) { + var15[var9] = ((ItemStack) var14.get(Character.valueOf(var18))).copy(); + } else { + var15[var9] = null; + } + } + + IAnvilRecipe recipe; + if (recipeType == (byte) 1) { + recipe = new CustomToolRecipe(var5, var6, var15, result, tool, time, hammer, anvil, exp, hot, research, + skill); + } else { + recipe = new ShapedAnvilRecipes(var5, var6, var15, result, tool, time, hammer, anvil, exp, hot, research, + skill); + } + this.recipes.add(recipe); + return recipe; + } + + public IAnvilRecipe addShapelessRecipe(ItemStack output, Skill skill, String research, boolean hot, + float experience, String tool, int hammer, int anvil, int time, Object... input) { + ArrayList var3 = new ArrayList(); + Object[] var4 = input; + int var5 = input.length; + + for (int var6 = 0; var6 < var5; ++var6) { + Object var7 = var4[var6]; + + if (var7 instanceof ItemStack) { + var3.add(((ItemStack) var7).copy()); + } else if (var7 instanceof Item) { + var3.add(new ItemStack((Item) var7)); + } else { + if (!(var7 instanceof Block)) { + throw new RuntimeException("MineFantasy: Invalid shapeless anvil recipe!"); + } + + var3.add(new ItemStack((Block) var7)); + } + } + + IAnvilRecipe recipe = new ShapelessAnvilRecipes(output, tool, experience, hammer, anvil, time, var3, hot, + research, skill); + this.recipes.add(recipe); + return recipe; + } + + public ItemStack findMatchingRecipe(AnvilCraftMatrix matrix) { + int var2 = 0; + ItemStack var3 = null; + ItemStack var4 = null; + + for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { + ItemStack var6 = matrix.getStackInSlot(var5); + + if (var6 != null) { + if (var2 == 0) { + var3 = var6; + } + + if (var2 == 1) { + var4 = var6; + } + + ++var2; + } + } + + if (var2 == 2 && canRepair(var3, var4)) { + Item var10 = var3.getItem(); + int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); + int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); + int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; + int var9 = var10.getMaxDamage() - (var8) * 2; + + if (var9 < 0) { + var9 = 0; + } + + return new ItemStack(var3.getItem(), 1, var9); + } else { + Iterator var11 = this.recipes.iterator(); + IAnvilRecipe var13; + + do { + if (!var11.hasNext()) { + return null; + } + + var13 = (IAnvilRecipe) var11.next(); + } while (!var13.matches(matrix)); + + return var13.getCraftingResult(matrix); + } + } + + private boolean canRepair(ItemStack item1, ItemStack item2) { + if (item1.getItem() == item2.getItem() && item1.stackSize == 1 && item2.stackSize == 1 + && item1.getItem().isRepairable()) { + return true; + } + if (item1.getItem() == item2.getItem() && item1.stackSize == 1 && item2.stackSize == 1 && item1.isItemDamaged() + && CustomToolHelper.areToolsSame(item1, item2)) { + return true; + } return false; } - public ItemStack findMatchingRecipe(IAnvil anvil, AnvilCraftMatrix matrix) - { - int time = 200; - int anvi = 1; - boolean hot = false; - int hammer = 0; - int var2 = 0; - String toolType = "hammer"; - ItemStack var3 = null; - ItemStack var4 = null; - - for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) - { - ItemStack var6 = matrix.getStackInSlot(var5); - - if (var6 != null) - { - if (var2 == 0) - { - var3 = var6; - } - - if (var2 == 1) - { - var4 = var6; - } - - ++var2; - } - } - - if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 && var3.getItem().isRepairable()) - { - Item var10 = var3.getItem(); - int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); - int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); - int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; - int var9 = var10.getMaxDamage() - var8; - - if (var9 < 0) - { - var9 = 0; - } - - return new ItemStack(var3.getItem(), 1, var9); - } - else - { - Iterator var11 = this.recipes.iterator(); - IAnvilRecipe var13 = null; - - while(var11.hasNext()) - { - IAnvilRecipe rec = (IAnvilRecipe)var11.next(); - - if(rec.matches(matrix)) - { - var13 = rec; - } - } - - if(var13 != null) - { - time = var13.getCraftTime(); - hammer = var13.getRecipeHammer(); - anvi = var13.getAnvil(); - hot = var13.outputHot(); - toolType = var13.getToolType(); - - if(!var13.useCustomTiers()) - { - anvil.setForgeTime(time); - anvil.setHammerUsed(hammer); - anvil.setRequiredAnvil(anvi); - } - anvil.setHotOutput(hot); - anvil.setToolType(toolType); - if(!var13.getResearch().equalsIgnoreCase("tier")) - { - anvil.setResearch(var13.getResearch()); - } - anvil.setSkill(var13.getSkill()); - - return var13.getCraftingResult(matrix); - } - return null; - } - } - - /** - * returns the List<> of all recipes - */ - public List getRecipeList() - { - return this.recipes; - } + public ItemStack findMatchingRecipe(IAnvil anvil, AnvilCraftMatrix matrix) { + int time = 200; + int anvi = 1; + boolean hot = false; + int hammer = 0; + int var2 = 0; + String toolType = "hammer"; + ItemStack var3 = null; + ItemStack var4 = null; + + for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { + ItemStack var6 = matrix.getStackInSlot(var5); + + if (var6 != null) { + if (var2 == 0) { + var3 = var6; + } + + if (var2 == 1) { + var4 = var6; + } + + ++var2; + } + } + + if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 + && var3.getItem().isRepairable()) { + Item var10 = var3.getItem(); + int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); + int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); + int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; + int var9 = var10.getMaxDamage() - var8; + + if (var9 < 0) { + var9 = 0; + } + + return new ItemStack(var3.getItem(), 1, var9); + } else { + Iterator var11 = this.recipes.iterator(); + IAnvilRecipe var13 = null; + + while (var11.hasNext()) { + IAnvilRecipe rec = (IAnvilRecipe) var11.next(); + + if (rec.matches(matrix)) { + var13 = rec; + } + } + + if (var13 != null) { + time = var13.getCraftTime(); + hammer = var13.getRecipeHammer(); + anvi = var13.getAnvil(); + hot = var13.outputHot(); + toolType = var13.getToolType(); + + if (!var13.useCustomTiers()) { + anvil.setForgeTime(time); + anvil.setHammerUsed(hammer); + anvil.setRequiredAnvil(anvi); + } + anvil.setHotOutput(hot); + anvil.setToolType(toolType); + if (!var13.getResearch().equalsIgnoreCase("tier")) { + anvil.setResearch(var13.getResearch()); + } + anvil.setSkill(var13.getSkill()); + + return var13.getCraftingResult(matrix); + } + return null; + } + } + + /** + * returns the List<> of all recipes + */ + public List getRecipeList() { + return this.recipes; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/CustomToolRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/CustomToolRecipe.java index acf95dad..7aeb7409 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/CustomToolRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/CustomToolRecipe.java @@ -1,12 +1,10 @@ package minefantasy.mf2.api.crafting.anvil; import minefantasy.mf2.api.heating.Heatable; -import minefantasy.mf2.api.heating.IHotItem; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.rpg.Skill; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.oredict.OreDictionary; /** @@ -14,170 +12,142 @@ * @author AnonymousProductions * */ -public class CustomToolRecipe extends ShapedAnvilRecipes -{ - public CustomToolRecipe(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, int hammer, int anvi, float exp, boolean hot, String research, Skill skill) - { - super(wdth, heit, inputs, output, toolType, time, hammer, anvi, exp, hot, research, skill); - } - - /** - * Checks if the region of a crafting inventory is match for the recipe. - */ - @Override - protected boolean checkMatch(AnvilCraftMatrix matrix, int x, int y, boolean b) - { - String wood = null; - String metal = null; - for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) - { - for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) - { - int var7 = var5 - x; - int var8 = var6 - y; - ItemStack recipeItem = null; - - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) - { - if (b) - { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; - } - else - { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; - } - } - - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); - - if (inputItem != null || recipeItem != null) - { - String component_wood = CustomToolHelper.getComponentMaterial(inputItem, "wood"); - String component_metal = CustomToolHelper.getComponentMaterial(inputItem, "metal"); - - if(component_metal != null)//CHECK CUSTOM METAL - { - if(metal == null) - { - metal = component_metal; - } - else - { - if(!metal.equalsIgnoreCase(component_metal)) - { - return false; - } - } - } - - if(component_wood != null)//CHECK CUSTOM WOOD - { - if(wood == null) - { - wood = component_wood; - } - else - { - if(!wood.equalsIgnoreCase(component_wood)) - { - return false; - } - } - } - //HEATING - if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) - { +public class CustomToolRecipe extends ShapedAnvilRecipes { + public CustomToolRecipe(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, + int hammer, int anvi, float exp, boolean hot, String research, Skill skill) { + super(wdth, heit, inputs, output, toolType, time, hammer, anvi, exp, hot, research, skill); + } + + /** + * Checks if the region of a crafting inventory is match for the recipe. + */ + @Override + protected boolean checkMatch(AnvilCraftMatrix matrix, int x, int y, boolean b) { + String wood = null; + String metal = null; + for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) { + for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) { + int var7 = var5 - x; + int var8 = var6 - y; + ItemStack recipeItem = null; + + if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (b) { + recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + } else { + recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + } + } + + ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + + if (inputItem != null || recipeItem != null) { + String component_wood = CustomToolHelper.getComponentMaterial(inputItem, "wood"); + String component_metal = CustomToolHelper.getComponentMaterial(inputItem, "metal"); + + if (component_metal != null)// CHECK CUSTOM METAL + { + if (metal == null) { + metal = component_metal; + } else { + if (!metal.equalsIgnoreCase(component_metal)) { + return false; + } + } + } + + if (component_wood != null)// CHECK CUSTOM WOOD + { + if (wood == null) { + wood = component_wood; + } else { + if (!wood.equalsIgnoreCase(component_wood)) { + return false; + } + } + } + // HEATING + if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { + return false; + } + if (!Heatable.isWorkable(inputItem)) { return false; } - if(!Heatable.isWorkable(inputItem)) - { - return false; - } inputItem = getHotItem(inputItem); - - if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) - { - return false; - } - - if(inputItem == null) - { - return false; - } - - if (recipeItem.getItem() != inputItem.getItem()) - { - return false; - } - - if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE && recipeItem.getItemDamage() != inputItem.getItemDamage()) - { - return false; - } - if(!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) - { - return false; - } - } - } - } - if(!modifyTiers(matrix, metal, true)) - { - modifyTiers(matrix, wood, false); - } - return true; - } - - private boolean modifyTiers(AnvilCraftMatrix matrix, String tier, boolean isMain) - { - CustomMaterial material = CustomMaterial.getMaterial(tier); - if(material != null) - { - int newTier = recipeHammer <0 ? material.crafterTier : recipeHammer; - int newAnvil = anvil <0 ? material.crafterAnvilTier : anvil; - matrix.modifyTier(newTier, newAnvil, (int)(recipeTime * material.craftTimeModifier)); - if(isMain) - { - matrix.modifyResearch("smelt"+material.name); - } - return true; - } - return false; + + if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { + return false; + } + + if (inputItem == null) { + return false; + } + + if (recipeItem.getItem() != inputItem.getItem()) { + return false; + } + + if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE + && recipeItem.getItemDamage() != inputItem.getItemDamage()) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + } + } + } + if (!modifyTiers(matrix, metal, true)) { + modifyTiers(matrix, wood, false); + } + return true; } - + + private boolean modifyTiers(AnvilCraftMatrix matrix, String tier, boolean isMain) { + CustomMaterial material = CustomMaterial.getMaterial(tier); + if (material != null) { + int newTier = recipeHammer < 0 ? material.crafterTier : recipeHammer; + int newAnvil = anvil < 0 ? material.crafterAnvilTier : anvil; + matrix.modifyTier(newTier, newAnvil, (int) (recipeTime * material.craftTimeModifier)); + if (isMain) { + matrix.modifyResearch("smelt" + material.name); + } + return true; + } + return false; + } + /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(AnvilCraftMatrix matrix) - { - ItemStack result = super.getCraftingResult(matrix); - - String wood = null; - String metal = null; - for(int i = 0; i < matrix.getSizeInventory(); i++) - { - ItemStack item = matrix.getStackInSlot(i); - String component_wood = CustomToolHelper.getComponentMaterial(item, "wood"); - String component_metal = CustomToolHelper.getComponentMaterial(item, "metal"); - if(wood == null && component_wood != null){wood = component_wood;} - if(metal == null && component_metal != null){metal = component_metal;} - } - if(metal != null) - { - CustomMaterial.addMaterial(result, CustomToolHelper.slot_main, metal); - } - if(wood != null) - { - CustomMaterial.addMaterial(result, CustomToolHelper.slot_haft, wood); - } - return result; - } - + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(AnvilCraftMatrix matrix) { + ItemStack result = super.getCraftingResult(matrix); + + String wood = null; + String metal = null; + for (int i = 0; i < matrix.getSizeInventory(); i++) { + ItemStack item = matrix.getStackInSlot(i); + String component_wood = CustomToolHelper.getComponentMaterial(item, "wood"); + String component_metal = CustomToolHelper.getComponentMaterial(item, "metal"); + if (wood == null && component_wood != null) { + wood = component_wood; + } + if (metal == null && component_metal != null) { + metal = component_metal; + } + } + if (metal != null) { + CustomMaterial.addMaterial(result, CustomToolHelper.slot_main, metal); + } + if (wood != null) { + CustomMaterial.addMaterial(result, CustomToolHelper.slot_haft, wood); + } + return result; + } + @Override - public boolean useCustomTiers() - { + public boolean useCustomTiers() { return true; } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvil.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvil.java index 741f9a25..74196d19 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvil.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvil.java @@ -4,19 +4,26 @@ /** * - * @author AnonymousProductions - * This interface is used by the anvil in MineFantasy so - * it can be referred to without importing the mod + * @author AnonymousProductions This interface is used by the anvil in + * MineFantasy so it can be referred to without importing the mod * */ public interface IAnvil { void setForgeTime(int i); + void setHammerUsed(int i); + void setRequiredAnvil(int i); + void setHotOutput(boolean i); + void setToolType(String toolType); + void setSkill(Skill skill); + public void setResearch(String research); + int getRecipeHammer(); + int getRecipeAnvil(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvilRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvilRecipe.java index 90e8d024..52d362a1 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvilRecipe.java @@ -8,38 +8,39 @@ * @author AnonymousProductions * */ -public interface IAnvilRecipe -{ - /** - * Used to check if a recipe matches current crafting inventory - */ - boolean matches(AnvilCraftMatrix var1); - - /** - * Returns an Item that is the result of this recipe - */ - ItemStack getCraftingResult(AnvilCraftMatrix var1); - int getCraftTime(); - /** - * Returns the size of the recipe area - */ - int getRecipeSize(); - - int getRecipeHammer(); - - float getExperiance(); - - int getAnvil(); - - boolean outputHot(); - - String getToolType(); - - String getResearch(); - - ItemStack getRecipeOutput(); - - Skill getSkill(); - - boolean useCustomTiers(); +public interface IAnvilRecipe { + /** + * Used to check if a recipe matches current crafting inventory + */ + boolean matches(AnvilCraftMatrix var1); + + /** + * Returns an Item that is the result of this recipe + */ + ItemStack getCraftingResult(AnvilCraftMatrix var1); + + int getCraftTime(); + + /** + * Returns the size of the recipe area + */ + int getRecipeSize(); + + int getRecipeHammer(); + + float getExperiance(); + + int getAnvil(); + + boolean outputHot(); + + String getToolType(); + + String getResearch(); + + ItemStack getRecipeOutput(); + + Skill getSkill(); + + boolean useCustomTiers(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/RecipeSorterAnvil.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/RecipeSorterAnvil.java index ac0630eb..669a3395 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/RecipeSorterAnvil.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/RecipeSorterAnvil.java @@ -7,23 +7,22 @@ * @author AnonymousProductions * */ -class RecipeSorterAnvil implements Comparator -{ - final CraftingManagerAnvil craftingManager; +class RecipeSorterAnvil implements Comparator { + final CraftingManagerAnvil craftingManager; - RecipeSorterAnvil(CraftingManagerAnvil manager) - { - this.craftingManager = manager; - } + RecipeSorterAnvil(CraftingManagerAnvil manager) { + this.craftingManager = manager; + } - public int compareRecipes(IAnvilRecipe recipe1, IAnvilRecipe recipe2) - { - return recipe1 instanceof ShapelessAnvilRecipes && recipe2 instanceof ShapedAnvilRecipes ? 1 : (recipe2 instanceof ShapelessAnvilRecipes && recipe1 instanceof ShapedAnvilRecipes ? -1 : (recipe2.getRecipeSize() < recipe1.getRecipeSize() ? -1 : (recipe2.getRecipeSize() > recipe1.getRecipeSize() ? 1 : 0))); - } + public int compareRecipes(IAnvilRecipe recipe1, IAnvilRecipe recipe2) { + return recipe1 instanceof ShapelessAnvilRecipes && recipe2 instanceof ShapedAnvilRecipes ? 1 + : (recipe2 instanceof ShapelessAnvilRecipes && recipe1 instanceof ShapedAnvilRecipes ? -1 + : (recipe2.getRecipeSize() < recipe1.getRecipeSize() ? -1 + : (recipe2.getRecipeSize() > recipe1.getRecipeSize() ? 1 : 0))); + } - @Override - public int compare(Object input1, Object input2) - { - return this.compareRecipes((IAnvilRecipe)input1, (IAnvilRecipe)input2); - } + @Override + public int compare(Object input1, Object input2) { + return this.compareRecipes((IAnvilRecipe) input1, (IAnvilRecipe) input2); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java index faf73f2a..52e562d9 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java @@ -13,179 +13,156 @@ * @author AnonymousProductions * */ -public class ShapedAnvilRecipes implements IAnvilRecipe -{ - /** How many horizontal slots this recipe is wide. */ +public class ShapedAnvilRecipes implements IAnvilRecipe { + /** How many horizontal slots this recipe is wide. */ public int recipeWidth; - + public final int recipeHammer; public final boolean outputHot; - /** How many vertical slots this recipe uses. */ + /** How many vertical slots this recipe uses. */ public int recipeHeight; - - /** The Anvil needed to craft */ + + /** The Anvil needed to craft */ public final int anvil; - /** Is a array of ItemStack that composes the recipe. */ + /** Is a array of ItemStack that composes the recipe. */ public ItemStack[] recipeItems; - /** Is the ItemStack that you get when craft the recipe. */ + /** Is the ItemStack that you get when craft the recipe. */ public ItemStack recipeOutput; - + public final int recipeTime; public final float recipeExperiance; public final String toolType; public final String research; public final Skill skillUsed; - public ShapedAnvilRecipes(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, int hammer, int anvi, float exp, boolean hot, String research, Skill skill) - { - this.outputHot = hot; - this.recipeWidth = wdth; - this.anvil = anvi; - this.recipeHeight = heit; - this.recipeItems = inputs; - this.recipeOutput = output; - this.recipeTime = time; - this.recipeHammer = hammer; - this.recipeExperiance = exp; - this.toolType = toolType; - this.research = research; - this.skillUsed = skill; - } - - @Override - public ItemStack getRecipeOutput() - { - return this.recipeOutput; - } - @Override - public int getCraftTime() - { - return recipeTime; - } - @Override - public float getExperiance() - { - return this.recipeExperiance; - } - @Override - public int getRecipeHammer() - { - return recipeHammer; - } - - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(AnvilCraftMatrix matrix) - { - for (int var2 = 0; var2 <= ShapelessAnvilRecipes.globalWidth - this.recipeWidth; ++var2) - { - for (int var3 = 0; var3 <= ShapelessAnvilRecipes.globalHeight - this.recipeHeight; ++var3) - { - if (this.checkMatch(matrix, var2, var3, true)) - { - return true; - } - - if (this.checkMatch(matrix, var2, var3, false)) - { - return true; - } - } - } - - return false; - } - - /** - * Checks if the region of a crafting inventory is match for the recipe. - */ - protected boolean checkMatch(AnvilCraftMatrix matrix, int x, int y, boolean b) - { - for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) - { - for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) - { - int var7 = var5 - x; - int var8 = var6 - y; - ItemStack recipeItem = null; - - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) - { - if (b) - { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; - } - else - { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; - } - } - - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); - - if (inputItem != null || recipeItem != null) - { - //HEATING - if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) - { + public ShapedAnvilRecipes(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, + int hammer, int anvi, float exp, boolean hot, String research, Skill skill) { + this.outputHot = hot; + this.recipeWidth = wdth; + this.anvil = anvi; + this.recipeHeight = heit; + this.recipeItems = inputs; + this.recipeOutput = output; + this.recipeTime = time; + this.recipeHammer = hammer; + this.recipeExperiance = exp; + this.toolType = toolType; + this.research = research; + this.skillUsed = skill; + } + + @Override + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + @Override + public int getCraftTime() { + return recipeTime; + } + + @Override + public float getExperiance() { + return this.recipeExperiance; + } + + @Override + public int getRecipeHammer() { + return recipeHammer; + } + + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(AnvilCraftMatrix matrix) { + for (int var2 = 0; var2 <= ShapelessAnvilRecipes.globalWidth - this.recipeWidth; ++var2) { + for (int var3 = 0; var3 <= ShapelessAnvilRecipes.globalHeight - this.recipeHeight; ++var3) { + if (this.checkMatch(matrix, var2, var3, true)) { + return true; + } + + if (this.checkMatch(matrix, var2, var3, false)) { + return true; + } + } + } + + return false; + } + + /** + * Checks if the region of a crafting inventory is match for the recipe. + */ + protected boolean checkMatch(AnvilCraftMatrix matrix, int x, int y, boolean b) { + for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) { + for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) { + int var7 = var5 - x; + int var8 = var6 - y; + ItemStack recipeItem = null; + + if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (b) { + recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + } else { + recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + } + } + + ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + + if (inputItem != null || recipeItem != null) { + // HEATING + if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { + return false; + } + if (!Heatable.isWorkable(inputItem)) { return false; } - if(!Heatable.isWorkable(inputItem)) - { - return false; - } inputItem = getHotItem(inputItem); - - if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) - { - return false; - } - - if(inputItem == null) - { - return false; - } - - if (recipeItem.getItem() != inputItem.getItem()) - { - return false; - } - - if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE && recipeItem.getItemDamage() != inputItem.getItemDamage()) - { - return false; - } - if(!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) - { - return false; - } - } - } - } - - return true; - } - - protected ItemStack getHotItem(ItemStack item) - { - if(item == null)return null; - if(!(item.getItem() instanceof IHotItem)) - { - return item; - } - + + if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { + return false; + } + + if (inputItem == null) { + return false; + } + + if (recipeItem.getItem() != inputItem.getItem()) { + return false; + } + + if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE + && recipeItem.getItemDamage() != inputItem.getItemDamage()) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + } + } + } + + return true; + } + + protected ItemStack getHotItem(ItemStack item) { + if (item == null) + return null; + if (!(item.getItem() instanceof IHotItem)) { + return item; + } + ItemStack hotItem = Heatable.getItem(item); - - if (hotItem != null) - { + + if (hotItem != null) { return hotItem; } - + return item; } @@ -194,24 +171,22 @@ private static NBTTagCompound getNBT(ItemStack item) { item.setTagCompound(new NBTTagCompound()); return item.getTagCompound(); } - + /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(AnvilCraftMatrix matrix) - { - return recipeOutput.copy(); - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() - { - return this.recipeWidth * this.recipeHeight; - } + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(AnvilCraftMatrix matrix) { + return recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return this.recipeWidth * this.recipeHeight; + } @Override public int getAnvil() { @@ -224,26 +199,22 @@ public boolean outputHot() { } @Override - public String getToolType() - { + public String getToolType() { return toolType; } @Override - public String getResearch() - { + public String getResearch() { return research; } @Override - public Skill getSkill() - { + public Skill getSkill() { return skillUsed; } @Override - public boolean useCustomTiers() - { + public boolean useCustomTiers() { return false; } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapelessAnvilRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapelessAnvilRecipes.java index b029a00e..b74b478c 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapelessAnvilRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapelessAnvilRecipes.java @@ -17,125 +17,112 @@ * @author AnonymousProductions * */ -public class ShapelessAnvilRecipes implements IAnvilRecipe -{ - public static final int globalWidth = 6; - public static final int globalHeight = 4; +public class ShapelessAnvilRecipes implements IAnvilRecipe { + public static final int globalWidth = 6; + public static final int globalHeight = 4; /** Is the ItemStack that you get when craft the recipe. */ - public final ItemStack recipeOutput; - - public final boolean outputHot; - /** Is a List of ItemStack that composes the recipe. */ - public final List recipeItems; - - private final int recipeHammer; - - /** The anvil Required */ - public final int anvil; - - public final int recipeTime; - public final float recipeExperiance; - public final String toolType; - public final String research; - public final Skill skillUsed; - - public ShapelessAnvilRecipes(ItemStack output, String toolType, float exp, int hammer, int anvi, int time, List components, boolean hot, String research, Skill skill) - { - this.outputHot = hot; - this.recipeOutput = output; - this.anvil = anvi; - this.recipeItems = components; - this.recipeHammer = hammer; - this.recipeTime = time; - this.recipeExperiance = exp; - this.toolType = toolType; - this.research = research; - this.skillUsed = skill; - } - - @Override - public ItemStack getRecipeOutput() - { - return this.recipeOutput; - } - - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(AnvilCraftMatrix matrix) - { - ArrayList var2 = new ArrayList(this.recipeItems); - - for (int var3 = 0; var3 <= globalWidth; ++var3) - { - for (int var4 = 0; var4 <= globalHeight; ++var4) - { - ItemStack inputItem = matrix.getStackInRowAndColumn(var4, var3); - - if (inputItem != null) - { - boolean var6 = false; - Iterator var7 = var2.iterator(); - - while (var7.hasNext()) - { - ItemStack recipeItem = (ItemStack)var7.next(); - - //HEATING - if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) - { - return false; - } - if(!Heatable.isWorkable(inputItem)) - { - return false; - } - inputItem = getHotItem(inputItem); - - if(inputItem == null) - { - return false; - } - if(!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) - { - return false; - } - if (inputItem.getItem() == recipeItem.getItem() && (recipeItem.getItemDamage() == OreDictionary.WILDCARD_VALUE || inputItem.getItemDamage() == recipeItem.getItemDamage())) - { - var6 = true; - var2.remove(recipeItem); - break; - } - } - - if (!var6) - { - return false; - } - } - } - } - - return var2.isEmpty(); - } - - protected ItemStack getHotItem(ItemStack item) - { - if(item == null)return null; - if(!(item.getItem() instanceof IHotItem)) - { - return item; - } - + public final ItemStack recipeOutput; + + public final boolean outputHot; + /** Is a List of ItemStack that composes the recipe. */ + public final List recipeItems; + + private final int recipeHammer; + + /** The anvil Required */ + public final int anvil; + + public final int recipeTime; + public final float recipeExperiance; + public final String toolType; + public final String research; + public final Skill skillUsed; + + public ShapelessAnvilRecipes(ItemStack output, String toolType, float exp, int hammer, int anvi, int time, + List components, boolean hot, String research, Skill skill) { + this.outputHot = hot; + this.recipeOutput = output; + this.anvil = anvi; + this.recipeItems = components; + this.recipeHammer = hammer; + this.recipeTime = time; + this.recipeExperiance = exp; + this.toolType = toolType; + this.research = research; + this.skillUsed = skill; + } + + @Override + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(AnvilCraftMatrix matrix) { + ArrayList var2 = new ArrayList(this.recipeItems); + + for (int var3 = 0; var3 <= globalWidth; ++var3) { + for (int var4 = 0; var4 <= globalHeight; ++var4) { + ItemStack inputItem = matrix.getStackInRowAndColumn(var4, var3); + + if (inputItem != null) { + boolean var6 = false; + Iterator var7 = var2.iterator(); + + while (var7.hasNext()) { + ItemStack recipeItem = (ItemStack) var7.next(); + + // HEATING + if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { + return false; + } + if (!Heatable.isWorkable(inputItem)) { + return false; + } + inputItem = getHotItem(inputItem); + + if (inputItem == null) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + if (inputItem.getItem() == recipeItem.getItem() + && (recipeItem.getItemDamage() == OreDictionary.WILDCARD_VALUE + || inputItem.getItemDamage() == recipeItem.getItemDamage())) { + var6 = true; + var2.remove(recipeItem); + break; + } + } + + if (!var6) { + return false; + } + } + } + } + + return var2.isEmpty(); + } + + protected ItemStack getHotItem(ItemStack item) { + if (item == null) + return null; + if (!(item.getItem() instanceof IHotItem)) { + return item; + } + ItemStack hotItem = Heatable.getItem(item); - - if (hotItem != null) - { + + if (hotItem != null) { return hotItem; } - + return item; } @@ -144,23 +131,22 @@ private static NBTTagCompound getNBT(ItemStack item) { item.setTagCompound(new NBTTagCompound()); return item.getTagCompound(); } - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(AnvilCraftMatrix par1AnvilCraftMatrix) - { - return this.recipeOutput.copy(); - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() - { - return this.recipeItems.size(); - } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(AnvilCraftMatrix par1AnvilCraftMatrix) { + return this.recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return this.recipeItems.size(); + } @Override public int getCraftTime() { @@ -188,26 +174,22 @@ public boolean outputHot() { } @Override - public String getToolType() - { + public String getToolType() { return toolType; } @Override - public String getResearch() - { + public String getResearch() { return research; } @Override - public Skill getSkill() - { + public Skill getSkill() { return skillUsed; } @Override - public boolean useCustomTiers() - { + public boolean useCustomTiers() { return false; } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CarpenterCraftMatrix.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CarpenterCraftMatrix.java index c7b3373c..f4800a08 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CarpenterCraftMatrix.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CarpenterCraftMatrix.java @@ -1,20 +1,17 @@ package minefantasy.mf2.api.crafting.carpenter; -import minefantasy.mf2.api.crafting.anvil.IAnvil; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; -public class CarpenterCraftMatrix extends InventoryCrafting -{ +public class CarpenterCraftMatrix extends InventoryCrafting { private ICarpenter crafter; - public CarpenterCraftMatrix(ICarpenter crafter, Container instance, int xSize, int ySize) - { + + public CarpenterCraftMatrix(ICarpenter crafter, Container instance, int xSize, int ySize) { super(instance, xSize, ySize); this.crafter = crafter; } - - public void modifyTier(int hammerTier, int craftTime) - { + + public void modifyTier(int hammerTier, int craftTime) { crafter.setToolTier(hammerTier); crafter.setForgeTime(craftTime); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CraftingManagerCarpenter.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CraftingManagerCarpenter.java index 6543cdce..72ae67ed 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CraftingManagerCarpenter.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CraftingManagerCarpenter.java @@ -16,314 +16,267 @@ * @author AnonymousProductions * */ -public class CraftingManagerCarpenter -{ - /** The static instance of this class */ - private static final CraftingManagerCarpenter instance = new CraftingManagerCarpenter(); - - /** A list of all the recipes added */ - public List recipes = new ArrayList(); - - /** - * Returns the static instance of this class - */ - public static CraftingManagerCarpenter getInstance() - { - return instance; - } - - private CraftingManagerCarpenter() - { - Collections.sort(this.recipes, new RecipeSorterCarpenter(this)); - System.out.println("MineFantasy: Anvil recipes initiating"); - } - - /** - * Adds a recipe. See spreadsheet on first page for details. - */ - public ICarpenterRecipe addRecipe(ItemStack result, Skill skill, String research, String sound, float exp, String tool, int hammer, int anvil, int time, Object ... input) - { - return addRecipe(result, skill, research, sound, exp, tool, hammer, anvil, time, (byte)0, input); - } - public ICarpenterRecipe addToolRecipe(ItemStack result, Skill skill, String research, String sound, float exp, String tool, int hammer, int anvil, int time, Object ... input) - { - return addRecipe(result, skill, research, sound, exp, tool, hammer, anvil, time, (byte)1, input); - } - /** - * Adds a recipe. See spreadsheet on first page for details. - */ - public ICarpenterRecipe addRecipe(ItemStack result, Skill skill, String research, String sound, float exp, String tool, int hammer, int anvil, int time, byte id, Object ... input) - { - String var3 = ""; - int var4 = 0; - int var5 = 0; - int var6 = 0; - int var9; - - if (input[var4] instanceof String[]) - { - String[] var7 = ((String[])input[var4++]); - String[] var8 = var7; - var9 = var7.length; - - for (int var10 = 0; var10 < var9; ++var10) - { - String var11 = var8[var10]; - ++var6; - var5 = var11.length(); - var3 = var3 + var11; - } - } - else - { - while (input[var4] instanceof String) - { - String var13 = (String)input[var4++]; - ++var6; - var5 = var13.length(); - var3 = var3 + var13; - } - } - - HashMap var14; - - for (var14 = new HashMap(); var4 < input.length; var4 += 2) - { - Character var16 = (Character)input[var4]; - ItemStack var17 = null; - - if (input[var4 + 1] instanceof Item) - { - var17 = new ItemStack((Item)input[var4 + 1], 1, 32767); - } - else if (input[var4 + 1] instanceof Block) - { - var17 = new ItemStack((Block)input[var4 + 1], 1, 32767); - } - else if (input[var4 + 1] instanceof ItemStack) - { - var17 = (ItemStack)input[var4 + 1]; - } - - var14.put(var16, var17); - } - - ItemStack[] var15 = new ItemStack[var5 * var6]; - - for (var9 = 0; var9 < var5 * var6; ++var9) - { - char var18 = var3.charAt(var9); - - if (var14.containsKey(Character.valueOf(var18))) - { - var15[var9] = ((ItemStack)var14.get(Character.valueOf(var18))).copy(); - } - else - { - var15[var9] = null; - } - } - ICarpenterRecipe recipe; - - if(id == (byte)1) - { - recipe = new CustomToolRecipeCarpenter(var5, var6, var15, result, tool, time, hammer, anvil, exp, false, sound, research, skill); - } - else - { - recipe = new ShapedCarpenterRecipes(var5, var6, var15, result, tool, time, hammer, anvil, exp, false, sound, research, skill); - } - this.recipes.add(recipe); - return recipe; - } - - public ICarpenterRecipe addShapelessRecipe(ItemStack output, Skill skill, String research, String sound, float experience, String tool, int hammer, int anvil, int time, Object ... input) - { - ArrayList var3 = new ArrayList(); - Object[] var4 = input; - int var5 = input.length; - - for (int var6 = 0; var6 < var5; ++var6) - { - Object var7 = var4[var6]; - - if (var7 instanceof ItemStack) - { - var3.add(((ItemStack)var7).copy()); - } - else if (var7 instanceof Item) - { - var3.add(new ItemStack((Item)var7)); - } - else - { - if (!(var7 instanceof Block)) - { - throw new RuntimeException("MineFantasy: Invalid shapeless anvil recipe!"); - } - - var3.add(new ItemStack((Block)var7)); - } - } - - ICarpenterRecipe recipe = new ShapelessCarpenterRecipes(output, tool, experience, hammer, anvil, time, var3, false, sound, research, skill); - this.recipes.add(recipe); - return recipe; - } - public ItemStack findMatchingRecipe(CarpenterCraftMatrix matrix) - { - int var2 = 0; - ItemStack var3 = null; - ItemStack var4 = null; - - for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) - { - ItemStack var6 = matrix.getStackInSlot(var5); - - if (var6 != null) - { - if (var2 == 0) - { - var3 = var6; - } - - if (var2 == 1) - { - var4 = var6; - } - - ++var2; - } - } - - if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 && var3.getItem().isRepairable()) - { - Item var10 = var3.getItem(); - int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); - int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); - int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; - int var9 = var10.getMaxDamage() - (var8)*2; - - if (var9 < 0) - { - var9 = 0; - } - - return new ItemStack(var3.getItem(), 1, var9); - } - else - { - Iterator var11 = this.recipes.iterator(); - ICarpenterRecipe var13; - - do - { - if (!var11.hasNext()) - { - return null; - } - - var13 = (ICarpenterRecipe)var11.next(); - } - while (!var13.matches(matrix)); - - return var13.getCraftingResult(matrix); - } - } - - - - public ItemStack findMatchingRecipe(ICarpenter bench, CarpenterCraftMatrix matrix) - { - int time = 200; - int anvi = 1; - boolean hot = false; - int hammer = 0; - int var2 = 0; - String toolType = "hands"; - String sound = "basic"; - ItemStack var3 = null; - ItemStack var4 = null; - - for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) - { - ItemStack var6 = matrix.getStackInSlot(var5); - - if (var6 != null) - { - if (var2 == 0) - { - var3 = var6; - } - - if (var2 == 1) - { - var4 = var6; - } - - ++var2; - } - } - - if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 && var3.getItem().isRepairable()) - { - Item var10 = var3.getItem(); - int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); - int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); - int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; - int var9 = var10.getMaxDamage() - var8; - - if (var9 < 0) - { - var9 = 0; - } - - return new ItemStack(var3.getItem(), 1, var9); - } - else - { - Iterator var11 = this.recipes.iterator(); - ICarpenterRecipe var13 = null; - - while(var11.hasNext()) - { - ICarpenterRecipe rec = (ICarpenterRecipe)var11.next(); - - if(rec.matches(matrix)) - { - var13 = rec; - } - } - - if(var13 != null) - { - time = var13.getCraftTime(); - hammer = var13.getRecipeHammer(); - anvi = var13.getAnvil(); - hot = var13.outputHot(); - toolType = var13.getToolType(); - sound = var13.getSound(); - - bench.setForgeTime(time); - bench.setToolTier(hammer); - bench.setRequiredCarpenter(anvi); - bench.setHotOutput(hot); - bench.setToolType(toolType); - bench.setCraftingSound(sound); - bench.setResearch(var13.getResearch()); - bench.setSkill(var13.getSkill()); - - return var13.getCraftingResult(matrix); - } - return null; - } - } - - /** - * returns the List<> of all recipes - */ - public List getRecipeList() - { - return this.recipes; - } +public class CraftingManagerCarpenter { + /** The static instance of this class */ + private static final CraftingManagerCarpenter instance = new CraftingManagerCarpenter(); + + /** A list of all the recipes added */ + public List recipes = new ArrayList(); + + /** + * Returns the static instance of this class + */ + public static CraftingManagerCarpenter getInstance() { + return instance; + } + + private CraftingManagerCarpenter() { + Collections.sort(this.recipes, new RecipeSorterCarpenter(this)); + System.out.println("MineFantasy: Anvil recipes initiating"); + } + + /** + * Adds a recipe. See spreadsheet on first page for details. + */ + public ICarpenterRecipe addRecipe(ItemStack result, Skill skill, String research, String sound, float exp, + String tool, int hammer, int anvil, int time, Object... input) { + return addRecipe(result, skill, research, sound, exp, tool, hammer, anvil, time, (byte) 0, input); + } + + public ICarpenterRecipe addToolRecipe(ItemStack result, Skill skill, String research, String sound, float exp, + String tool, int hammer, int anvil, int time, Object... input) { + return addRecipe(result, skill, research, sound, exp, tool, hammer, anvil, time, (byte) 1, input); + } + + /** + * Adds a recipe. See spreadsheet on first page for details. + */ + public ICarpenterRecipe addRecipe(ItemStack result, Skill skill, String research, String sound, float exp, + String tool, int hammer, int anvil, int time, byte id, Object... input) { + String var3 = ""; + int var4 = 0; + int var5 = 0; + int var6 = 0; + int var9; + + if (input[var4] instanceof String[]) { + String[] var7 = ((String[]) input[var4++]); + String[] var8 = var7; + var9 = var7.length; + + for (int var10 = 0; var10 < var9; ++var10) { + String var11 = var8[var10]; + ++var6; + var5 = var11.length(); + var3 = var3 + var11; + } + } else { + while (input[var4] instanceof String) { + String var13 = (String) input[var4++]; + ++var6; + var5 = var13.length(); + var3 = var3 + var13; + } + } + + HashMap var14; + + for (var14 = new HashMap(); var4 < input.length; var4 += 2) { + Character var16 = (Character) input[var4]; + ItemStack var17 = null; + + if (input[var4 + 1] instanceof Item) { + var17 = new ItemStack((Item) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof Block) { + var17 = new ItemStack((Block) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof ItemStack) { + var17 = (ItemStack) input[var4 + 1]; + } + + var14.put(var16, var17); + } + + ItemStack[] var15 = new ItemStack[var5 * var6]; + + for (var9 = 0; var9 < var5 * var6; ++var9) { + char var18 = var3.charAt(var9); + + if (var14.containsKey(Character.valueOf(var18))) { + var15[var9] = ((ItemStack) var14.get(Character.valueOf(var18))).copy(); + } else { + var15[var9] = null; + } + } + ICarpenterRecipe recipe; + + if (id == (byte) 1) { + recipe = new CustomToolRecipeCarpenter(var5, var6, var15, result, tool, time, hammer, anvil, exp, false, + sound, research, skill); + } else { + recipe = new ShapedCarpenterRecipes(var5, var6, var15, result, tool, time, hammer, anvil, exp, false, sound, + research, skill); + } + this.recipes.add(recipe); + return recipe; + } + + public ICarpenterRecipe addShapelessRecipe(ItemStack output, Skill skill, String research, String sound, + float experience, String tool, int hammer, int anvil, int time, Object... input) { + ArrayList var3 = new ArrayList(); + Object[] var4 = input; + int var5 = input.length; + + for (int var6 = 0; var6 < var5; ++var6) { + Object var7 = var4[var6]; + + if (var7 instanceof ItemStack) { + var3.add(((ItemStack) var7).copy()); + } else if (var7 instanceof Item) { + var3.add(new ItemStack((Item) var7)); + } else { + if (!(var7 instanceof Block)) { + throw new RuntimeException("MineFantasy: Invalid shapeless anvil recipe!"); + } + + var3.add(new ItemStack((Block) var7)); + } + } + + ICarpenterRecipe recipe = new ShapelessCarpenterRecipes(output, tool, experience, hammer, anvil, time, var3, + false, sound, research, skill); + this.recipes.add(recipe); + return recipe; + } + + public ItemStack findMatchingRecipe(CarpenterCraftMatrix matrix) { + int var2 = 0; + ItemStack var3 = null; + ItemStack var4 = null; + + for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { + ItemStack var6 = matrix.getStackInSlot(var5); + + if (var6 != null) { + if (var2 == 0) { + var3 = var6; + } + + if (var2 == 1) { + var4 = var6; + } + + ++var2; + } + } + + if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 + && var3.getItem().isRepairable()) { + Item var10 = var3.getItem(); + int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); + int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); + int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; + int var9 = var10.getMaxDamage() - (var8) * 2; + + if (var9 < 0) { + var9 = 0; + } + + return new ItemStack(var3.getItem(), 1, var9); + } else { + Iterator var11 = this.recipes.iterator(); + ICarpenterRecipe var13; + + do { + if (!var11.hasNext()) { + return null; + } + + var13 = (ICarpenterRecipe) var11.next(); + } while (!var13.matches(matrix)); + + return var13.getCraftingResult(matrix); + } + } + + public ItemStack findMatchingRecipe(ICarpenter bench, CarpenterCraftMatrix matrix) { + int time = 200; + int anvi = 1; + boolean hot = false; + int hammer = 0; + int var2 = 0; + String toolType = "hands"; + String sound = "basic"; + ItemStack var3 = null; + ItemStack var4 = null; + + for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { + ItemStack var6 = matrix.getStackInSlot(var5); + + if (var6 != null) { + if (var2 == 0) { + var3 = var6; + } + + if (var2 == 1) { + var4 = var6; + } + + ++var2; + } + } + + if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 + && var3.getItem().isRepairable()) { + Item var10 = var3.getItem(); + int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); + int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); + int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; + int var9 = var10.getMaxDamage() - var8; + + if (var9 < 0) { + var9 = 0; + } + + return new ItemStack(var3.getItem(), 1, var9); + } else { + Iterator var11 = this.recipes.iterator(); + ICarpenterRecipe var13 = null; + + while (var11.hasNext()) { + ICarpenterRecipe rec = (ICarpenterRecipe) var11.next(); + + if (rec.matches(matrix)) { + var13 = rec; + } + } + + if (var13 != null) { + time = var13.getCraftTime(); + hammer = var13.getRecipeHammer(); + anvi = var13.getAnvil(); + hot = var13.outputHot(); + toolType = var13.getToolType(); + sound = var13.getSound(); + + bench.setForgeTime(time); + bench.setToolTier(hammer); + bench.setRequiredCarpenter(anvi); + bench.setHotOutput(hot); + bench.setToolType(toolType); + bench.setCraftingSound(sound); + bench.setResearch(var13.getResearch()); + bench.setSkill(var13.getSkill()); + + return var13.getCraftingResult(matrix); + } + return null; + } + } + + /** + * returns the List<> of all recipes + */ + public List getRecipeList() { + return this.recipes; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CustomToolRecipeCarpenter.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CustomToolRecipeCarpenter.java index d5bc3983..b05392e2 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CustomToolRecipeCarpenter.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CustomToolRecipeCarpenter.java @@ -11,142 +11,119 @@ * @author AnonymousProductions * */ -public class CustomToolRecipeCarpenter extends ShapedCarpenterRecipes -{ - public CustomToolRecipeCarpenter(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, int toolTier, int blockTier, float exp, boolean hot, String sound, String research, Skill skill) - { +public class CustomToolRecipeCarpenter extends ShapedCarpenterRecipes { + public CustomToolRecipeCarpenter(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, + int time, int toolTier, int blockTier, float exp, boolean hot, String sound, String research, Skill skill) { super(wdth, heit, inputs, output, toolType, time, toolTier, blockTier, exp, hot, sound, research, skill); - } + } - private boolean checkMatch(CarpenterCraftMatrix matrix, int x, int y, boolean b) - { + private boolean checkMatch(CarpenterCraftMatrix matrix, int x, int y, boolean b) { String wood = null; - String metal = null; - for (int var5 = 0; var5 < ShapelessCarpenterRecipes.globalWidth; ++var5) - { - for (int var6 = 0; var6 < ShapelessCarpenterRecipes.globalHeight; ++var6) - { - int var7 = var5 - x; - int var8 = var6 - y; - ItemStack recipeItem = null; + String metal = null; + for (int var5 = 0; var5 < ShapelessCarpenterRecipes.globalWidth; ++var5) { + for (int var6 = 0; var6 < ShapelessCarpenterRecipes.globalHeight; ++var6) { + int var7 = var5 - x; + int var8 = var6 - y; + ItemStack recipeItem = null; + + if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (b) { + recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + } else { + recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + } + } + + ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + + if (inputItem != null || recipeItem != null) { + String component_wood = CustomToolHelper.getComponentMaterial(inputItem, "wood"); + String component_metal = CustomToolHelper.getComponentMaterial(inputItem, "metal"); + + if (component_metal != null)// CHECK CUSTOM METAL + { + if (metal == null) { + metal = component_metal; + } else { + if (!metal.equalsIgnoreCase(component_metal)) { + return false; + } + } + } - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) - { - if (b) - { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; - } - else - { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; - } - } + if (component_wood != null)// CHECK CUSTOM WOOD + { + if (wood == null) { + wood = component_wood; + } else { + if (!wood.equalsIgnoreCase(component_wood)) { + return false; + } + } + } - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { + return false; + } - if (inputItem != null || recipeItem != null) - { - String component_wood = CustomToolHelper.getComponentMaterial(inputItem, "wood"); - String component_metal = CustomToolHelper.getComponentMaterial(inputItem, "metal"); - - if(component_metal != null)//CHECK CUSTOM METAL - { - if(metal == null) - { - metal = component_metal; - } - else - { - if(!metal.equalsIgnoreCase(component_metal)) - { - return false; - } - } - } - - if(component_wood != null)//CHECK CUSTOM WOOD - { - if(wood == null) - { - wood = component_wood; - } - else - { - if(!wood.equalsIgnoreCase(component_wood)) - { - return false; - } - } - } - - if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) - { - return false; - } - - if(inputItem == null) - { - return false; - } + if (inputItem == null) { + return false; + } - if (recipeItem.getItem() != inputItem.getItem()) - { - return false; - } - if(!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) - { - return false; - } - if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE && recipeItem.getItemDamage() != inputItem.getItemDamage()) - { - return false; - } - } - } - } - if(!modifyTiers(matrix, metal)) - { - modifyTiers(matrix, wood); - } + if (recipeItem.getItem() != inputItem.getItem()) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE + && recipeItem.getItemDamage() != inputItem.getItemDamage()) { + return false; + } + } + } + } + if (!modifyTiers(matrix, metal)) { + modifyTiers(matrix, wood); + } - return true; - } + return true; + } - private boolean modifyTiers(CarpenterCraftMatrix matrix, String tier) - { - CustomMaterial material = CustomMaterial.getMaterial(tier); - if(material != null) - { - int newTier = recipeHammer <0 ? material.crafterTier : recipeHammer; - matrix.modifyTier(newTier, (int)(recipeTime * material.craftTimeModifier)); - return true; - } - return false; + private boolean modifyTiers(CarpenterCraftMatrix matrix, String tier) { + CustomMaterial material = CustomMaterial.getMaterial(tier); + if (material != null) { + int newTier = recipeHammer < 0 ? material.crafterTier : recipeHammer; + matrix.modifyTier(newTier, (int) (recipeTime * material.craftTimeModifier)); + return true; + } + return false; } - + @Override - public ItemStack getCraftingResult(CarpenterCraftMatrix matrix) - { - ItemStack result = super.getCraftingResult(matrix); - - String wood = null; - String metal = null; - for(int i = 0; i < matrix.getSizeInventory(); i++) - { - ItemStack item = matrix.getStackInSlot(i); - String component_wood = CustomToolHelper.getComponentMaterial(item, "wood"); - String component_metal = CustomToolHelper.getComponentMaterial(item, "metal"); - if(wood == null && component_wood != null){wood = component_wood;} - if(metal == null && component_metal != null){metal = component_metal;} - } - if(metal != null) - { - CustomMaterial.addMaterial(result, CustomToolHelper.slot_main, metal); - } - if(wood != null) - { - CustomMaterial.addMaterial(result, metal == null ? CustomToolHelper.slot_main : CustomToolHelper.slot_haft, wood); - } - return result; - } + public ItemStack getCraftingResult(CarpenterCraftMatrix matrix) { + ItemStack result = super.getCraftingResult(matrix); + + String wood = null; + String metal = null; + for (int i = 0; i < matrix.getSizeInventory(); i++) { + ItemStack item = matrix.getStackInSlot(i); + String component_wood = CustomToolHelper.getComponentMaterial(item, "wood"); + String component_metal = CustomToolHelper.getComponentMaterial(item, "metal"); + if (wood == null && component_wood != null) { + wood = component_wood; + } + if (metal == null && component_metal != null) { + metal = component_metal; + } + } + if (metal != null) { + CustomMaterial.addMaterial(result, CustomToolHelper.slot_main, metal); + } + if (wood != null) { + CustomMaterial.addMaterial(result, metal == null ? CustomToolHelper.slot_main : CustomToolHelper.slot_haft, + wood); + } + return result; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenter.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenter.java index 6b3a6cb2..fef58812 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenter.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenter.java @@ -4,18 +4,24 @@ /** * - * @author AnonymousProductions - * This interface is used by the anvil in MineFantasy so - * it can be referred to without importing the mod + * @author AnonymousProductions This interface is used by the anvil in + * MineFantasy so it can be referred to without importing the mod * */ public interface ICarpenter { void setForgeTime(int i); + void setToolTier(int i); + void setRequiredCarpenter(int i); + void setHotOutput(boolean i); + void setToolType(String toolType); + void setCraftingSound(String trade); + void setResearch(String research); + void setSkill(Skill skill); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenterRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenterRecipe.java index 4ffcb656..2ad2ac73 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenterRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenterRecipe.java @@ -8,38 +8,39 @@ * @author AnonymousProductions * */ -public interface ICarpenterRecipe -{ - /** - * Used to check if a recipe matches current crafting inventory - */ - boolean matches(CarpenterCraftMatrix var1); - - /** - * Returns an Item that is the result of this recipe - */ - ItemStack getCraftingResult(CarpenterCraftMatrix var1); - int getCraftTime(); - /** - * Returns the size of the recipe area - */ - int getRecipeSize(); - - int getRecipeHammer(); - - float getExperiance(); - - int getAnvil(); - - boolean outputHot(); - - String getToolType(); - - String getSound(); - - ItemStack getRecipeOutput(); +public interface ICarpenterRecipe { + /** + * Used to check if a recipe matches current crafting inventory + */ + boolean matches(CarpenterCraftMatrix var1); + + /** + * Returns an Item that is the result of this recipe + */ + ItemStack getCraftingResult(CarpenterCraftMatrix var1); + + int getCraftTime(); + + /** + * Returns the size of the recipe area + */ + int getRecipeSize(); + + int getRecipeHammer(); + + float getExperiance(); + + int getAnvil(); + + boolean outputHot(); + + String getToolType(); + + String getSound(); + + ItemStack getRecipeOutput(); String getResearch(); - + Skill getSkill(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/RecipeSorterCarpenter.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/RecipeSorterCarpenter.java index 85e6bfa0..524a657a 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/RecipeSorterCarpenter.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/RecipeSorterCarpenter.java @@ -7,23 +7,22 @@ * @author AnonymousProductions * */ -class RecipeSorterCarpenter implements Comparator -{ - final CraftingManagerCarpenter craftingManager; +class RecipeSorterCarpenter implements Comparator { + final CraftingManagerCarpenter craftingManager; - RecipeSorterCarpenter(CraftingManagerCarpenter manager) - { - this.craftingManager = manager; - } + RecipeSorterCarpenter(CraftingManagerCarpenter manager) { + this.craftingManager = manager; + } - public int compareRecipes(ICarpenterRecipe recipe1, ICarpenterRecipe recipe2) - { - return recipe1 instanceof ShapelessCarpenterRecipes && recipe2 instanceof ShapedCarpenterRecipes ? 1 : (recipe2 instanceof ShapelessCarpenterRecipes && recipe1 instanceof ShapedCarpenterRecipes ? -1 : (recipe2.getRecipeSize() < recipe1.getRecipeSize() ? -1 : (recipe2.getRecipeSize() > recipe1.getRecipeSize() ? 1 : 0))); - } + public int compareRecipes(ICarpenterRecipe recipe1, ICarpenterRecipe recipe2) { + return recipe1 instanceof ShapelessCarpenterRecipes && recipe2 instanceof ShapedCarpenterRecipes ? 1 + : (recipe2 instanceof ShapelessCarpenterRecipes && recipe1 instanceof ShapedCarpenterRecipes ? -1 + : (recipe2.getRecipeSize() < recipe1.getRecipeSize() ? -1 + : (recipe2.getRecipeSize() > recipe1.getRecipeSize() ? 1 : 0))); + } - @Override - public int compare(Object input1, Object input2) - { - return this.compareRecipes((ICarpenterRecipe)input1, (ICarpenterRecipe)input2); - } + @Override + public int compare(Object input1, Object input2) { + return this.compareRecipes((ICarpenterRecipe) input1, (ICarpenterRecipe) input2); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java index 829022a9..7f324fc3 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java @@ -11,171 +11,150 @@ * @author AnonymousProductions * */ -public class ShapedCarpenterRecipes implements ICarpenterRecipe -{ - /** How many horizontal slots this recipe is wide. */ +public class ShapedCarpenterRecipes implements ICarpenterRecipe { + /** How many horizontal slots this recipe is wide. */ public int recipeWidth; - - public final int recipeHammer; - - public final boolean outputHot; - /** How many vertical slots this recipe uses. */ - public int recipeHeight; - - /** The Block Tier needed to craft */ - public final int blockTier; - - /** Is a array of ItemStack that composes the recipe. */ - public ItemStack[] recipeItems; - - /** Is the ItemStack that you get when craft the recipe. */ - public ItemStack recipeOutput; - - public final int recipeTime; - public final float recipeExperiance; - public final String toolType; - public final String soundOfCraft; - public final String research; - public final Skill skillUsed; - - public ShapedCarpenterRecipes(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, int hammer, int anvi, float exp, boolean hot, String sound, String research, Skill skill) - { - this.research = research; - this.outputHot = hot; - this.recipeWidth = wdth; - this.blockTier = anvi; - this.recipeHeight = heit; - this.recipeItems = inputs; - this.recipeOutput = output; - this.recipeTime = time; - this.recipeHammer = hammer; - this.recipeExperiance = exp; - this.toolType = toolType; - this.soundOfCraft = sound; - this.skillUsed = skill; - } - - @Override - public ItemStack getRecipeOutput() - { - return this.recipeOutput; - } - @Override - public int getCraftTime() - { - return recipeTime; - } - @Override - public float getExperiance() - { - return this.recipeExperiance; - } - @Override - public int getRecipeHammer() - { - return recipeHammer; - } - - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(CarpenterCraftMatrix matrix) - { - for (int var2 = 0; var2 <= ShapelessCarpenterRecipes.globalWidth - this.recipeWidth; ++var2) - { - for (int var3 = 0; var3 <= ShapelessCarpenterRecipes.globalHeight - this.recipeHeight; ++var3) - { - if (this.checkMatch(matrix, var2, var3, true)) - { - return true; - } - - if (this.checkMatch(matrix, var2, var3, false)) - { - return true; - } - } - } - - return false; - } - - /** - * Checks if the region of a crafting inventory is match for the recipe. - */ - private boolean checkMatch(InventoryCrafting matrix, int x, int y, boolean b) - { - for (int var5 = 0; var5 < ShapelessCarpenterRecipes.globalWidth; ++var5) - { - for (int var6 = 0; var6 < ShapelessCarpenterRecipes.globalHeight; ++var6) - { - int var7 = var5 - x; - int var8 = var6 - y; - ItemStack recipeItem = null; - - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) - { - if (b) - { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; - } - else - { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; - } - } - - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); - - if (inputItem != null || recipeItem != null) - { - if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) - { - return false; - } - - if(inputItem == null) - { - return false; - } - - if (recipeItem.getItem() != inputItem.getItem()) - { - return false; - } - if(!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) - { - return false; - } - if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE && recipeItem.getItemDamage() != inputItem.getItemDamage()) - { - return false; - } - } - } - } - - return true; - } + + public final int recipeHammer; + + public final boolean outputHot; + /** How many vertical slots this recipe uses. */ + public int recipeHeight; + + /** The Block Tier needed to craft */ + public final int blockTier; + + /** Is a array of ItemStack that composes the recipe. */ + public ItemStack[] recipeItems; + + /** Is the ItemStack that you get when craft the recipe. */ + public ItemStack recipeOutput; + + public final int recipeTime; + public final float recipeExperiance; + public final String toolType; + public final String soundOfCraft; + public final String research; + public final Skill skillUsed; + + public ShapedCarpenterRecipes(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, + int hammer, int anvi, float exp, boolean hot, String sound, String research, Skill skill) { + this.research = research; + this.outputHot = hot; + this.recipeWidth = wdth; + this.blockTier = anvi; + this.recipeHeight = heit; + this.recipeItems = inputs; + this.recipeOutput = output; + this.recipeTime = time; + this.recipeHammer = hammer; + this.recipeExperiance = exp; + this.toolType = toolType; + this.soundOfCraft = sound; + this.skillUsed = skill; + } + + @Override + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + @Override + public int getCraftTime() { + return recipeTime; + } + + @Override + public float getExperiance() { + return this.recipeExperiance; + } + + @Override + public int getRecipeHammer() { + return recipeHammer; + } /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(CarpenterCraftMatrix matrix) - { - return recipeOutput.copy(); - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() - { - return this.recipeWidth * this.recipeHeight; - } + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(CarpenterCraftMatrix matrix) { + for (int var2 = 0; var2 <= ShapelessCarpenterRecipes.globalWidth - this.recipeWidth; ++var2) { + for (int var3 = 0; var3 <= ShapelessCarpenterRecipes.globalHeight - this.recipeHeight; ++var3) { + if (this.checkMatch(matrix, var2, var3, true)) { + return true; + } + + if (this.checkMatch(matrix, var2, var3, false)) { + return true; + } + } + } + + return false; + } + + /** + * Checks if the region of a crafting inventory is match for the recipe. + */ + private boolean checkMatch(InventoryCrafting matrix, int x, int y, boolean b) { + for (int var5 = 0; var5 < ShapelessCarpenterRecipes.globalWidth; ++var5) { + for (int var6 = 0; var6 < ShapelessCarpenterRecipes.globalHeight; ++var6) { + int var7 = var5 - x; + int var8 = var6 - y; + ItemStack recipeItem = null; + + if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (b) { + recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + } else { + recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + } + } + + ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + + if (inputItem != null || recipeItem != null) { + if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { + return false; + } + + if (inputItem == null) { + return false; + } + + if (recipeItem.getItem() != inputItem.getItem()) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE + && recipeItem.getItemDamage() != inputItem.getItemDamage()) { + return false; + } + } + } + } + + return true; + } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(CarpenterCraftMatrix matrix) { + return recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return this.recipeWidth * this.recipeHeight; + } @Override public int getAnvil() { @@ -188,26 +167,22 @@ public boolean outputHot() { } @Override - public String getToolType() - { + public String getToolType() { return toolType; } - + @Override - public String getSound() - { + public String getSound() { return soundOfCraft; } @Override - public String getResearch() - { + public String getResearch() { return research; } @Override - public Skill getSkill() - { + public Skill getSkill() { return skillUsed; } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapelessCarpenterRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapelessCarpenterRecipes.java index 20cffe3c..9cd08e90 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapelessCarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapelessCarpenterRecipes.java @@ -15,132 +15,122 @@ * @author AnonymousProductions * */ -public class ShapelessCarpenterRecipes implements ICarpenterRecipe -{ - public static final int globalWidth = 4; - public static final int globalHeight = 4; +public class ShapelessCarpenterRecipes implements ICarpenterRecipe { + public static final int globalWidth = 4; + public static final int globalHeight = 4; /** Is the ItemStack that you get when craft the recipe. */ - private final ItemStack recipeOutput; - - private final boolean outputHot; - /** Is a List of ItemStack that composes the recipe. */ - public final List recipeItems; - - private final int recipeHammer; - - /** The Block Tier Required */ - private final int blockTier; - - private final int recipeTime; - private final float recipeExperiance; - private final String toolType; - private final String soundOfCraft; - private final String research; - private final Skill skillUsed; - - public ShapelessCarpenterRecipes(ItemStack output, String toolType, float exp, int hammer, int anvi, int time, List components, boolean hot, String sound, String research, Skill skill) - { - this.research = research; - this.outputHot = hot; - this.recipeOutput = output; - this.blockTier = anvi; - this.recipeItems = components; - this.recipeHammer = hammer; - this.recipeTime = time; - this.recipeExperiance = exp; - this.toolType = toolType; - this.soundOfCraft = sound; - this.skillUsed = skill; - } - - @Override - public ItemStack getRecipeOutput() - { - return this.recipeOutput; - } - - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(CarpenterCraftMatrix par1InventoryCrafting) - { - ArrayList var2 = new ArrayList(this.recipeItems); - - for (int var3 = 0; var3 <= globalWidth; ++var3) - { - for (int var4 = 0; var4 <= globalHeight; ++var4) - { - ItemStack inputItem = par1InventoryCrafting.getStackInRowAndColumn(var4, var3); - - if (inputItem != null) - { - boolean var6 = false; - Iterator var7 = var2.iterator(); - - while (var7.hasNext()) - { - ItemStack recipeItem = (ItemStack)var7.next(); - - if(inputItem == null) - { - return false; - } - if(!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) - { - return false; - } - if (inputItem.getItem() == recipeItem.getItem() && (recipeItem.getItemDamage() == OreDictionary.WILDCARD_VALUE || inputItem.getItemDamage() == recipeItem.getItemDamage())) - { - var6 = true; - var2.remove(recipeItem); - break; - } - } - - if (!var6) - { - return false; - } - } - } - } - - return var2.isEmpty(); - } - public static int getTemp(ItemStack item) - { + private final ItemStack recipeOutput; + + private final boolean outputHot; + /** Is a List of ItemStack that composes the recipe. */ + public final List recipeItems; + + private final int recipeHammer; + + /** The Block Tier Required */ + private final int blockTier; + + private final int recipeTime; + private final float recipeExperiance; + private final String toolType; + private final String soundOfCraft; + private final String research; + private final Skill skillUsed; + + public ShapelessCarpenterRecipes(ItemStack output, String toolType, float exp, int hammer, int anvi, int time, + List components, boolean hot, String sound, String research, Skill skill) { + this.research = research; + this.outputHot = hot; + this.recipeOutput = output; + this.blockTier = anvi; + this.recipeItems = components; + this.recipeHammer = hammer; + this.recipeTime = time; + this.recipeExperiance = exp; + this.toolType = toolType; + this.soundOfCraft = sound; + this.skillUsed = skill; + } + + @Override + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(CarpenterCraftMatrix par1InventoryCrafting) { + ArrayList var2 = new ArrayList(this.recipeItems); + + for (int var3 = 0; var3 <= globalWidth; ++var3) { + for (int var4 = 0; var4 <= globalHeight; ++var4) { + ItemStack inputItem = par1InventoryCrafting.getStackInRowAndColumn(var4, var3); + + if (inputItem != null) { + boolean var6 = false; + Iterator var7 = var2.iterator(); + + while (var7.hasNext()) { + ItemStack recipeItem = (ItemStack) var7.next(); + + if (inputItem == null) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + if (inputItem.getItem() == recipeItem.getItem() + && (recipeItem.getItemDamage() == OreDictionary.WILDCARD_VALUE + || inputItem.getItemDamage() == recipeItem.getItemDamage())) { + var6 = true; + var2.remove(recipeItem); + break; + } + } + + if (!var6) { + return false; + } + } + } + } + + return var2.isEmpty(); + } + + public static int getTemp(ItemStack item) { NBTTagCompound tag = getNBT(item); - - if(tag.hasKey("MFtemp"))return tag.getInteger("MFtemp"); - + + if (tag.hasKey("MFtemp")) + return tag.getInteger("MFtemp"); + return 0; } - - private static NBTTagCompound getNBT(ItemStack item) - { - if(!item.hasTagCompound())item.setTagCompound(new NBTTagCompound()); + + private static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); return item.getTagCompound(); } - - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(CarpenterCraftMatrix par1InventoryCrafting) - { - return this.recipeOutput.copy(); - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() - { - return this.recipeItems.size(); - } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(CarpenterCraftMatrix par1InventoryCrafting) { + return this.recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return this.recipeItems.size(); + } @Override public int getCraftTime() { @@ -168,26 +158,22 @@ public boolean outputHot() { } @Override - public String getToolType() - { + public String getToolType() { return toolType; } - + @Override - public String getSound() - { + public String getSound() { return soundOfCraft; } @Override - public String getResearch() - { + public String getResearch() { return research; } @Override - public Skill getSkill() - { + public Skill getSkill() { return skillUsed; } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/engineer/IBombComponent.java b/src/main/java/minefantasy/mf2/api/crafting/engineer/IBombComponent.java index ba020763..cfb5807a 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/engineer/IBombComponent.java +++ b/src/main/java/minefantasy/mf2/api/crafting/engineer/IBombComponent.java @@ -1,10 +1,10 @@ package minefantasy.mf2.api.crafting.engineer; -public interface IBombComponent -{ - - /** The type of component only supported types (minecase, bombcase, filling)*/ +public interface IBombComponent { + + /** The type of component only supported types (minecase, bombcase, filling) */ public String getComponentType(); + /** The tier, this depends on the component type */ public byte getTier(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/engineer/ICrossbowPart.java b/src/main/java/minefantasy/mf2/api/crafting/engineer/ICrossbowPart.java index 71c9830a..731be172 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/engineer/ICrossbowPart.java +++ b/src/main/java/minefantasy/mf2/api/crafting/engineer/ICrossbowPart.java @@ -6,21 +6,30 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.util.IIcon; -public interface ICrossbowPart -{ +public interface ICrossbowPart { public static final HashMap components = new HashMap(); - - /** The type of component only supported types (minecase, bombcase, filling)*/ + + /** The type of component only supported types (minecase, bombcase, filling) */ public String getComponentType(); + /** The id, this depends on the component type */ public int getID(); - /** The Icon for the finished Model*/ + + /** The Icon for the finished Model */ @SideOnly(Side.CLIENT) public IIcon getIcon(); - /** Gets the name for the part (mostly an adjective like "Heavy" or "Repeating") */ + + /** + * Gets the name for the part (mostly an adjective like "Heavy" or "Repeating") + */ public String getUnlocalisedName(); - /** Modifies a value by name (such as "power" or "spread"), "capacity" is treated as an int */ + + /** + * Modifies a value by name (such as "power" or "spread"), "capacity" is treated + * as an int + */ public float getModifier(String type); + /** * Only for stocks, whether it's defined as a hand crossbow */ diff --git a/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialCraftItem.java b/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialCraftItem.java index 73509672..5d605eda 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialCraftItem.java +++ b/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialCraftItem.java @@ -2,7 +2,6 @@ import net.minecraft.item.ItemStack; -public interface ISpecialCraftItem -{ +public interface ISpecialCraftItem { public String getDesign(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialDesign.java b/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialDesign.java index 3a7aaab5..686aeb67 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialDesign.java +++ b/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialDesign.java @@ -2,7 +2,6 @@ import net.minecraft.item.ItemStack; -public interface ISpecialDesign -{ +public interface ISpecialDesign { String getDesign(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/exotic/SpecialForging.java b/src/main/java/minefantasy/mf2/api/crafting/exotic/SpecialForging.java index a49f7640..ee5ba375 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/exotic/SpecialForging.java +++ b/src/main/java/minefantasy/mf2/api/crafting/exotic/SpecialForging.java @@ -8,57 +8,48 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class SpecialForging -{ - public static HashMapdragonforgeCrafts = new HashMap(); - public static HashMapspecialCrafts = new HashMap(); - - public static void addDragonforgeCraft(Block blackSteel, Block dragon) - { +public class SpecialForging { + public static HashMap dragonforgeCrafts = new HashMap(); + public static HashMap specialCrafts = new HashMap(); + + public static void addDragonforgeCraft(Block blackSteel, Block dragon) { addDragonforgeCraft(Item.getItemFromBlock(blackSteel), Item.getItemFromBlock(dragon)); } - public static void addDragonforgeCraft(Item base, Item dragon) - { + + public static void addDragonforgeCraft(Item base, Item dragon) { dragonforgeCrafts.put(base, dragon); Salvage.shareSalvage(dragon, base); } - public static Item getDragonCraft(ItemStack blacksteel) - { - if(dragonforgeCrafts.containsKey(blacksteel.getItem())) - { + + public static Item getDragonCraft(ItemStack blacksteel) { + if (dragonforgeCrafts.containsKey(blacksteel.getItem())) { return dragonforgeCrafts.get(blacksteel.getItem()); } return null; } - - public static void addSpecialCraft(String special, Item base, Item output) - { + + public static void addSpecialCraft(String special, Item base, Item output) { specialCrafts.put(getIdentifier(base, special), output); Salvage.shareSalvage(output, base); } - public static Item getSpecialCraft(String special, ItemStack input) - { - if(input != null) - { + + public static Item getSpecialCraft(String special, ItemStack input) { + if (input != null) { String id = getIdentifier(input.getItem(), special); - if(specialCrafts.containsKey(id)) - { + if (specialCrafts.containsKey(id)) { return specialCrafts.get(id); - } + } } return null; } - - private static String getIdentifier(Item item, String special) - { - return "["+special+"]" + CustomToolHelper.getSimpleReferenceName(item); + + private static String getIdentifier(Item item, String special) { + return "[" + special + "]" + CustomToolHelper.getSimpleReferenceName(item); } - - public static String getItemDesign(ItemStack item) - { - if(item != null && item.getItem() instanceof ISpecialCraftItem) - { - return ((ISpecialCraftItem)item.getItem()).getDesign(item); + + public static String getItemDesign(ItemStack item) { + if (item != null && item.getItem() instanceof ISpecialCraftItem) { + return ((ISpecialCraftItem) item.getItem()).getDesign(item); } return null; } diff --git a/src/main/java/minefantasy/mf2/api/crafting/refine/BloomRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/refine/BloomRecipe.java index 29a9f423..074d3474 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/refine/BloomRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/refine/BloomRecipe.java @@ -9,55 +9,48 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class BloomRecipe -{//FurnaceRecipes +public class BloomRecipe {// FurnaceRecipes public static HashMap recipeList = new HashMap(); - - public static void addRecipe(ItemStack input, ItemStack output) - { + + public static void addRecipe(ItemStack input, ItemStack output) { recipeList.put(input, output); } - public static void addRecipe(Block input, ItemStack output) - { + + public static void addRecipe(Block input, ItemStack output) { addRecipe(Item.getItemFromBlock(input), output); } - public static void addRecipe(Item input, ItemStack output) - { + + public static void addRecipe(Item input, ItemStack output) { addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output); } - public ItemStack result; public int time; public String research; - - public BloomRecipe(ItemStack result, int time, String research) - { + + public BloomRecipe(ItemStack result, int time, String research) { this.result = result; this.time = time; this.research = research; } - - public static ItemStack getSmeltingResult(ItemStack item) - { - Iterator iterator = recipeList.entrySet().iterator(); - Entry entry; - - do - { - if (!iterator.hasNext()) - { - return null; - } - - entry = (Entry)iterator.next(); - } - while (!doesMatch(item, (ItemStack)entry.getKey())); - - return (ItemStack)entry.getValue(); - } - private static boolean doesMatch(ItemStack item1, ItemStack item2) - { - return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE || item2.getItemDamage() == item1.getItemDamage()); - } + + public static ItemStack getSmeltingResult(ItemStack item) { + Iterator iterator = recipeList.entrySet().iterator(); + Entry entry; + + do { + if (!iterator.hasNext()) { + return null; + } + + entry = (Entry) iterator.next(); + } while (!doesMatch(item, (ItemStack) entry.getKey())); + + return (ItemStack) entry.getValue(); + } + + private static boolean doesMatch(ItemStack item1, ItemStack item2) { + return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE + || item2.getItemDamage() == item1.getItemDamage()); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/refine/PaintOilRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/refine/PaintOilRecipe.java index d70c4ab7..88b32f62 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/refine/PaintOilRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/refine/PaintOilRecipe.java @@ -5,56 +5,50 @@ import java.util.Map.Entry; import net.minecraft.block.Block; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class PaintOilRecipe -{//FurnaceRecipes +public class PaintOilRecipe {// FurnaceRecipes public static HashMap recipeList = new HashMap(); - + /** * Turn one specific meta block to another */ - public static void addRecipe(Block input, int inMeta, Block output, int outMeta) - { + public static void addRecipe(Block input, int inMeta, Block output, int outMeta) { recipeList.put(new ItemStack(input, 1, inMeta), new ItemStack(output, 1, outMeta)); } + /** * Turn a block to a specific meta */ - public static void addRecipe(Block input, Block output, int meta) - { + public static void addRecipe(Block input, Block output, int meta) { addRecipe(input, OreDictionary.WILDCARD_VALUE, output, meta); } + /** * Turn a block to a block without a meta change */ - public static void addRecipe(Block input, Block output) - { + public static void addRecipe(Block input, Block output) { addRecipe(input, OreDictionary.WILDCARD_VALUE, output, OreDictionary.WILDCARD_VALUE); } - - public static ItemStack getPaintResult(ItemStack item) - { - Iterator iterator = recipeList.entrySet().iterator(); - Entry entry; - - do - { - if (!iterator.hasNext()) - { - return null; - } - - entry = (Entry)iterator.next(); - } - while (!doesMatch(item, (ItemStack)entry.getKey())); - - return (ItemStack)entry.getValue(); - } - private static boolean doesMatch(ItemStack item1, ItemStack item2) - { - return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE || item2.getItemDamage() == item1.getItemDamage()); - } + + public static ItemStack getPaintResult(ItemStack item) { + Iterator iterator = recipeList.entrySet().iterator(); + Entry entry; + + do { + if (!iterator.hasNext()) { + return null; + } + + entry = (Entry) iterator.next(); + } while (!doesMatch(item, (ItemStack) entry.getKey())); + + return (ItemStack) entry.getValue(); + } + + private static boolean doesMatch(ItemStack item1, ItemStack item2) { + return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE + || item2.getItemDamage() == item1.getItemDamage()); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java index 52483f88..329cba81 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java @@ -8,38 +8,38 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class QuernRecipes -{ - public static HashMaprecipeList = new HashMap(); - - public static QuernRecipes addRecipe(Block input, ItemStack output, int tier) - { +public class QuernRecipes { + public static HashMap recipeList = new HashMap(); + + public static QuernRecipes addRecipe(Block input, ItemStack output, int tier) { return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); } - public static QuernRecipes addRecipe(Item input, ItemStack output, int tier) - { + + public static QuernRecipes addRecipe(Item input, ItemStack output, int tier) { return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); } - public static QuernRecipes addRecipe(ItemStack input, ItemStack output, int tier) - { + + public static QuernRecipes addRecipe(ItemStack input, ItemStack output, int tier) { QuernRecipes recipe = new QuernRecipes(input, output, tier); recipeList.put(CustomToolHelper.getReferenceName(input), recipe); return recipe; } - public static QuernRecipes getResult(ItemStack input) - { - if(input == null)return null; - + + public static QuernRecipes getResult(ItemStack input) { + if (input == null) + return null; + QuernRecipes specific = recipeList.get(CustomToolHelper.getReferenceName(input)); - if(specific != null)return specific; - + if (specific != null) + return specific; + return recipeList.get(CustomToolHelper.getReferenceName(input, "any")); } - + public final ItemStack result; public final int tier; - public QuernRecipes(ItemStack input, ItemStack output, int tier) - { + + public QuernRecipes(ItemStack input, ItemStack output, int tier) { this.result = output; this.tier = tier; } diff --git a/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java index aee0997e..63cda0b3 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java @@ -8,65 +8,57 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class TanningRecipe -{ - public static final ArrayListrecipeList = new ArrayList(); - - public static void addRecipe(Object input, float time, ItemStack output) - { +public class TanningRecipe { + public static final ArrayList recipeList = new ArrayList(); + + public static void addRecipe(Object input, float time, ItemStack output) { addRecipe(input, time, -1, output); } - public static void addRecipe(Object input, float time, int tier, ItemStack output) - { + + public static void addRecipe(Object input, float time, int tier, ItemStack output) { addRecipe(input, time, tier, "knife", output); } - public static void addRecipe(Object input, float time, int tier, String toolType, ItemStack output) - { + + public static void addRecipe(Object input, float time, int tier, String toolType, ItemStack output) { recipeList.add(new TanningRecipe(convertItem(input), time, tier, toolType, output)); } - - public static ItemStack convertItem(Object input) - { - if(input instanceof ItemStack) - { - return (ItemStack)input; + + public static ItemStack convertItem(Object input) { + if (input instanceof ItemStack) { + return (ItemStack) input; } - if(input instanceof Item) - { - return new ItemStack((Item)input, 1, OreDictionary.WILDCARD_VALUE); + if (input instanceof Item) { + return new ItemStack((Item) input, 1, OreDictionary.WILDCARD_VALUE); } - if(input instanceof Block) - { - return new ItemStack((Block)input, 1, OreDictionary.WILDCARD_VALUE); + if (input instanceof Block) { + return new ItemStack((Block) input, 1, OreDictionary.WILDCARD_VALUE); } MFLogUtil.logWarn("Tanning Recipe found invalid item!"); return null; } - public static TanningRecipe getRecipe(ItemStack item) - { - if(item == null)return null; - - for(int a = 0; a < recipeList.size(); a++) - { + + public static TanningRecipe getRecipe(ItemStack item) { + if (item == null) + return null; + + for (int a = 0; a < recipeList.size(); a++) { TanningRecipe recipe = recipeList.get(a); - if(recipe.input.getItem() == item.getItem()) - { - if(recipe.input.getItemDamage() == OreDictionary.WILDCARD_VALUE || recipe.input.getItemDamage() == item.getItemDamage()) - { + if (recipe.input.getItem() == item.getItem()) { + if (recipe.input.getItemDamage() == OreDictionary.WILDCARD_VALUE + || recipe.input.getItemDamage() == item.getItemDamage()) { return recipe; } } } return null; } - + public int tier; public float time; public ItemStack input, output; public String toolType; - - public TanningRecipe(ItemStack input, float time, int tier, String toolType, ItemStack output) - { + + public TanningRecipe(ItemStack input, float time, int tier, String toolType, ItemStack output) { this.time = time; this.tier = tier; this.input = input; diff --git a/src/main/java/minefantasy/mf2/api/farming/CustomHoeEntry.java b/src/main/java/minefantasy/mf2/api/farming/CustomHoeEntry.java index f84e6993..deddd364 100644 --- a/src/main/java/minefantasy/mf2/api/farming/CustomHoeEntry.java +++ b/src/main/java/minefantasy/mf2/api/farming/CustomHoeEntry.java @@ -6,72 +6,74 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class CustomHoeEntry -{ +public class CustomHoeEntry { /** * Registeres a piece (called by code or config) - * @param piece the item to list - * @param weight the weight of the piece (Kg) - * @param bulk the bulk of the piece - * @param alterSpeed if the armour's weight slows you down + * + * @param piece + * the item to list + * @param weight + * the weight of the piece (Kg) + * @param bulk + * the bulk of the piece + * @param alterSpeed + * if the armour's weight slows you down */ - public static void registerItem(Item piece, float efficiency) - { + public static void registerItem(Item piece, float efficiency) { int id = Item.getIdFromItem(piece); - + MineFantasyAPI.debugMsg("Added Custom hoe: " + piece.getUnlocalizedName() + " Efficiency = " + efficiency); entries.put(id, new CustomHoeEntry(id, efficiency)); } - + /** * Gets the variables for the item if there are any: order is weight, bulk */ - public static float getEntryEfficiency(ItemStack piece, float Default) - { + public static float getEntryEfficiency(ItemStack piece, float Default) { CustomHoeEntry entry = getEntry(piece); - if(entry != null) - { + if (entry != null) { return entry.efficiency; } return Default; } + /** * Gets the entry for an item - * @param piece the armour item + * + * @param piece + * the armour item * @return the entry(if there is one), else null */ - public static CustomHoeEntry getEntry(ItemStack piece) - { + public static CustomHoeEntry getEntry(ItemStack piece) { return getEntry(piece.getItem()); } + /** * Gets the entry for an item - * @param piece the armour item + * + * @param piece + * the armour item * @return the entry(if there is one), else null */ - public static CustomHoeEntry getEntry(Item piece) - { - if(piece != null) - { + public static CustomHoeEntry getEntry(Item piece) { + if (piece != null) { int id = Item.getIdFromItem(piece); - if(entries.containsKey(id)) - { + if (entries.containsKey(id)) { return entries.get(id); } } return null; } - + public int itemID; /** * The Efficiency(same variable as dig speed) */ public float efficiency; - - public static HashMapentries = new HashMap(); - - private CustomHoeEntry(int id, float efficiency) - { + + public static HashMap entries = new HashMap(); + + private CustomHoeEntry(int id, float efficiency) { this.itemID = id; this.efficiency = efficiency; } diff --git a/src/main/java/minefantasy/mf2/api/heating/ForgeFuel.java b/src/main/java/minefantasy/mf2/api/heating/ForgeFuel.java index 329a13bd..a066fa9d 100644 --- a/src/main/java/minefantasy/mf2/api/heating/ForgeFuel.java +++ b/src/main/java/minefantasy/mf2/api/heating/ForgeFuel.java @@ -2,8 +2,7 @@ import net.minecraft.item.ItemStack; -public class ForgeFuel -{ +public class ForgeFuel { public ItemStack fuel; public float duration; public int baseHeat; @@ -16,12 +15,11 @@ public class ForgeFuel */ public boolean doesLight; - public ForgeFuel(ItemStack item, float dura, int heat, boolean light) - { + public ForgeFuel(ItemStack item, float dura, int heat, boolean light) { this(item, dura, heat, light, false); } - public ForgeFuel(ItemStack item, float dura, int heat, boolean light, boolean refined) - { + + public ForgeFuel(ItemStack item, float dura, int heat, boolean light, boolean refined) { this.fuel = item; this.duration = dura; this.baseHeat = heat; diff --git a/src/main/java/minefantasy/mf2/api/heating/ForgeItemHandler.java b/src/main/java/minefantasy/mf2/api/heating/ForgeItemHandler.java index 0650c922..249a4a01 100644 --- a/src/main/java/minefantasy/mf2/api/heating/ForgeItemHandler.java +++ b/src/main/java/minefantasy/mf2/api/heating/ForgeItemHandler.java @@ -7,27 +7,23 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class ForgeItemHandler -{ +public class ForgeItemHandler { public static List forgeFuel = new ArrayList(); public static int forgeMaxTemp = 0; - public static void addFuel(ItemStack item, int fuel, int heat, boolean willLight) - { + public static void addFuel(ItemStack item, int fuel, int heat, boolean willLight) { forgeFuel.add(new ForgeFuel(item, fuel, heat, willLight)); } - public static ForgeFuel getStats(ItemStack item) - { + + public static ForgeFuel getStats(ItemStack item) { if (item == null) return null; - for (ForgeFuel fuel : forgeFuel) - { - if (fuel != null) - { - if (fuel.fuel.getItem() == item.getItem()) - { - if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE || fuel.fuel.getItemDamage() == item.getItemDamage()) { + for (ForgeFuel fuel : forgeFuel) { + if (fuel != null) { + if (fuel.fuel.getItem() == item.getItem()) { + if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE + || fuel.fuel.getItemDamage() == item.getItemDamage()) { return fuel; } } @@ -35,6 +31,7 @@ public static ForgeFuel getStats(ItemStack item) } return null; } + /** * Gets the amount of smelts for an item * @@ -42,18 +39,15 @@ public static ForgeFuel getStats(ItemStack item) * The item in the fuel slot * @return The amount of smelts it has(will not consume if its 0) */ - public static float getForgeFuel(ItemStack item) - { + public static float getForgeFuel(ItemStack item) { if (item == null) return 0; - for (ForgeFuel fuel : forgeFuel) - { - if (fuel != null) - { - if (fuel.fuel.getItem() == item.getItem()) - { - if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE || fuel.fuel.getItemDamage() == item.getItemDamage()) { + for (ForgeFuel fuel : forgeFuel) { + if (fuel != null) { + if (fuel.fuel.getItem() == item.getItem()) { + if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE + || fuel.fuel.getItemDamage() == item.getItemDamage()) { return fuel.duration; } } @@ -70,7 +64,8 @@ public static boolean willLight(ItemStack item) { for (ForgeFuel fuel : forgeFuel) { if (fuel != null) { if (fuel.fuel.getItem() == item.getItem()) { - if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE || fuel.fuel.getItemDamage() == item.getItemDamage()) { + if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE + || fuel.fuel.getItemDamage() == item.getItemDamage()) { return fuel.doesLight; } } @@ -111,7 +106,8 @@ public static int getForgeHeat(ItemStack item) { for (ForgeFuel fuel : forgeFuel) { if (fuel != null) { if (fuel.fuel.getItem() == item.getItem()) { - if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE || fuel.fuel.getItemDamage() == item.getItemDamage()) { + if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE + || fuel.fuel.getItemDamage() == item.getItemDamage()) { return fuel.baseHeat; } } @@ -145,7 +141,8 @@ private static boolean matches(ItemStack item, ItemStack compare) { return false; } - if (item.getItemDamage() != compare.getItemDamage() && compare.getItemDamage() != OreDictionary.WILDCARD_VALUE && item.getItemDamage() != OreDictionary.WILDCARD_VALUE) { + if (item.getItemDamage() != compare.getItemDamage() && compare.getItemDamage() != OreDictionary.WILDCARD_VALUE + && item.getItemDamage() != OreDictionary.WILDCARD_VALUE) { return false; } return true; diff --git a/src/main/java/minefantasy/mf2/api/heating/Heatable.java b/src/main/java/minefantasy/mf2/api/heating/Heatable.java index b110074c..07aad33f 100644 --- a/src/main/java/minefantasy/mf2/api/heating/Heatable.java +++ b/src/main/java/minefantasy/mf2/api/heating/Heatable.java @@ -8,8 +8,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.oredict.OreDictionary; -public class Heatable -{ +public class Heatable { public static final int forgeMaximumMetalHeat = 5000; public static boolean requiresHeating = true; public static HashMap registerList = new HashMap(); @@ -40,8 +39,7 @@ public Heatable(ItemStack item, int min, int unstable, int max) { this.maxTemperature = max; } - public static void addItem(ItemStack item, int min, int unstable, int max) - { + public static void addItem(ItemStack item, int min, int unstable, int max) { registerList.put(getRegistrationForItem(item), new Heatable(item, min, unstable, max)); } @@ -49,8 +47,7 @@ public static boolean canHeatItem(ItemStack item) { return loadStats(item) != null; } - public static Heatable loadStats(ItemStack item) - { + public static Heatable loadStats(ItemStack item) { if (item == null) return null; @@ -58,17 +55,12 @@ public static Heatable loadStats(ItemStack item) return null; Heatable stats = findRegister(item); - if (stats != null) - { - if (stats.object.getItemDamage() == OreDictionary.WILDCARD_VALUE) - { - if (stats.object.getItem() == item.getItem()) - { + if (stats != null) { + if (stats.object.getItemDamage() == OreDictionary.WILDCARD_VALUE) { + if (stats.object.getItem() == item.getItem()) { return stats; } - } - else if (stats.object.isItemEqual(item)) - { + } else if (stats.object.isItemEqual(item)) { return stats; } } @@ -77,24 +69,22 @@ else if (stats.object.isItemEqual(item)) } public static final String NBT_Item = "MFHeatable_ItemSave"; - //public static final String NBT_ItemID = "MFHeatable_ItemID"; - //public static final String NBT_SubID = "MFHeatable_SubID"; + // public static final String NBT_ItemID = "MFHeatable_ItemID"; + // public static final String NBT_SubID = "MFHeatable_SubID"; public static final String NBT_ShouldDisplay = "MFHeatable_DisplayTemperature"; - + public static final String NBT_CurrentTemp = "MFHeatable_Temperature"; public static final String NBT_WorkableTemp = "MFHeatable_WorkTemp"; public static final String NBT_UnstableTemp = "MFHeatable_UnstableTemp"; + /** * 0 = nothing, 1 = soft, 2 = unstable */ - public static byte getHeatableStage(ItemStack item) - { - if(item == null || !(item.getItem() instanceof IHotItem)) - { + public static byte getHeatableStage(ItemStack item) { + if (item == null || !(item.getItem() instanceof IHotItem)) { return 0; } - if (item != null && item.hasTagCompound()) - { + if (item != null && item.hasTagCompound()) { int temp = getTemp(item); int work = item.getTagCompound().getInteger(NBT_WorkableTemp); int unstable = item.getTagCompound().getInteger(NBT_UnstableTemp); @@ -106,10 +96,8 @@ public static byte getHeatableStage(ItemStack item) return (byte) 0; } - public static int getWorkTemp(ItemStack item) - { - if(item == null || !(item.getItem() instanceof IHotItem)) - { + public static int getWorkTemp(ItemStack item) { + if (item == null || !(item.getItem() instanceof IHotItem)) { return 0; } NBTTagCompound tag = getNBT(item); @@ -119,10 +107,9 @@ public static int getWorkTemp(ItemStack item) return 0; } - public static int getUnstableTemp(ItemStack item) - { - if(item == null || !(item.getItem() instanceof IHotItem)) - { + + public static int getUnstableTemp(ItemStack item) { + if (item == null || !(item.getItem() instanceof IHotItem)) { return 0; } NBTTagCompound tag = getNBT(item); @@ -132,10 +119,9 @@ public static int getUnstableTemp(ItemStack item) return 0; } - public static int getTemp(ItemStack item) - { - if(item == null || !(item.getItem() instanceof IHotItem)) - { + + public static int getTemp(ItemStack item) { + if (item == null || !(item.getItem() instanceof IHotItem)) { return 0; } NBTTagCompound tag = getNBT(item); @@ -145,101 +131,95 @@ public static int getTemp(ItemStack item) return 0; } + /** * Hardcore Crafting: Should quencing in inproper sources damage items */ public static boolean HCCquenchRuin = true; - + /** * Gets a hot item - * @param item the hot item - * @param hazard the amount the source is hazardous (damaging the item): usually a percent dura loss + * + * @param item + * the hot item + * @param hazard + * the amount the source is hazardous (damaging the item): usually a + * percent dura loss * @return what item is heated */ - public static ItemStack getQuenchedItem(ItemStack item, float hazard) - { + public static ItemStack getQuenchedItem(ItemStack item, float hazard) { ItemStack cold = Heatable.getItem(item); - - if(HCCquenchRuin && cold.isItemStackDamageable() && hazard > 0) - { - cold.setItemDamage((int) (cold.getMaxDamage()*hazard/100F)); + + if (HCCquenchRuin && cold.isItemStackDamageable() && hazard > 0) { + cold.setItemDamage((int) (cold.getMaxDamage() * hazard / 100F)); } - + return cold; } - - public static ItemStack getItem(ItemStack item) - { - if(item == null || !(item.getItem() instanceof IHotItem)) - { + + public static ItemStack getItem(ItemStack item) { + if (item == null || !(item.getItem() instanceof IHotItem)) { return null; } NBTTagCompound tag = getNBT(item); - if (tag.hasKey(NBT_Item)) - { + if (tag.hasKey(NBT_Item)) { return ItemStack.loadItemStackFromNBT(tag.getCompoundTag(NBT_Item)); } return null; } + private static NBTTagCompound getNBT(ItemStack item) { if (!item.hasTagCompound()) item.setTagCompound(new NBTTagCompound()); return item.getTagCompound(); } - public static boolean isWorkable(ItemStack inputItem) - { - if(inputItem == null || !(inputItem.getItem() instanceof IHotItem)) - { + public static boolean isWorkable(ItemStack inputItem) { + if (inputItem == null || !(inputItem.getItem() instanceof IHotItem)) { return true; } - if(inputItem != null && inputItem.getItem() instanceof IHotItem) - { + if (inputItem != null && inputItem.getItem() instanceof IHotItem) { return getHeatableStage(inputItem) == 1; } return true; } - private static Heatable findRegister(ItemStack item) - { - Heatable specific = registerList.get(item.getItem().getUnlocalizedName() + "_" + item.getItemDamage());//Try Specific first - if(specific != null) - { + private static Heatable findRegister(ItemStack item) { + Heatable specific = registerList.get(item.getItem().getUnlocalizedName() + "_" + item.getItemDamage());// Try + // Specific + // first + if (specific != null) { return specific; } - return registerList.get(item.getUnlocalizedName() + "_any");//Try Any; + return registerList.get(item.getUnlocalizedName() + "_any");// Try Any; } - public static String getRegistrationForItem(ItemStack item) - { + + public static String getRegistrationForItem(ItemStack item) { String s; - if(item.getItemDamage() == OreDictionary.WILDCARD_VALUE) - { + if (item.getItemDamage() == OreDictionary.WILDCARD_VALUE) { s = item.getItem().getUnlocalizedName() + "_any"; - } - else - { - s = item.getItem().getUnlocalizedName() + "_"+item.getItemDamage(); + } else { + s = item.getItem().getUnlocalizedName() + "_" + item.getItemDamage(); } return s; } - - public int getWorkableStat(ItemStack item) - { - if(this.minTemperature == -1) - { + + public int getWorkableStat(ItemStack item) { + if (this.minTemperature == -1) { CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if(material != null)return material.getHeatableStats()[0]; + if (material != null) + return material.getHeatableStats()[0]; } return this.minTemperature; } - public int getUnstableStat(ItemStack item) - { - if(this.unstableTemperature == -1) - { + + public int getUnstableStat(ItemStack item) { + if (this.unstableTemperature == -1) { CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if(material != null)return material.getHeatableStats()[1]; + if (material != null) + return material.getHeatableStats()[1]; } return this.unstableTemperature; } diff --git a/src/main/java/minefantasy/mf2/api/heating/IQuenchBlock.java b/src/main/java/minefantasy/mf2/api/heating/IQuenchBlock.java index 0c1ca58f..4f91c238 100644 --- a/src/main/java/minefantasy/mf2/api/heating/IQuenchBlock.java +++ b/src/main/java/minefantasy/mf2/api/heating/IQuenchBlock.java @@ -1,9 +1,9 @@ package minefantasy.mf2.api.heating; -public interface IQuenchBlock -{ +public interface IQuenchBlock { /** * Quench an item + * * @return 0 means success, 1-100 means item is damaged, <0 means fail. */ public float quench(); diff --git a/src/main/java/minefantasy/mf2/api/heating/TongsHelper.java b/src/main/java/minefantasy/mf2/api/heating/TongsHelper.java index 0bccc1db..dd6930d8 100644 --- a/src/main/java/minefantasy/mf2/api/heating/TongsHelper.java +++ b/src/main/java/minefantasy/mf2/api/heating/TongsHelper.java @@ -3,20 +3,17 @@ import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.Blocks; -import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class TongsHelper -{ +public class TongsHelper { /** * Determines if an item is held */ - public static boolean hasHeldItem(ItemStack tongs) - { + public static boolean hasHeldItem(ItemStack tongs) { NBTTagCompound nbt = getNBT(tongs); return nbt.hasKey("Held") && nbt.getBoolean("Held"); @@ -27,10 +24,8 @@ public static boolean hasHeldItem(ItemStack tongs) * * @return */ - public static ItemStack clearHeldItem(ItemStack tongs, EntityLivingBase user) - { - if (!user.worldObj.isRemote) - { + public static ItemStack clearHeldItem(ItemStack tongs, EntityLivingBase user) { + if (!user.worldObj.isRemote) { NBTTagCompound nbt = getNBT(tongs); nbt.setBoolean("Held", false); } @@ -42,10 +37,8 @@ public static ItemStack clearHeldItem(ItemStack tongs, EntityLivingBase user) /** * Picks up an item */ - public static boolean trySetHeldItem(ItemStack tongs, ItemStack item) - { - if (item == null || item.getItem() == null || !isHotItem(item) || item.getItem() instanceof ItemBlock) - { + public static boolean trySetHeldItem(ItemStack tongs, ItemStack item) { + if (item == null || item.getItem() == null || !isHotItem(item) || item.getItem() instanceof ItemBlock) { return false; } NBTTagCompound nbt = getNBT(tongs); @@ -58,13 +51,10 @@ public static boolean trySetHeldItem(ItemStack tongs, ItemStack item) } /** - * Used to determine if an item burns you when held, and if tongs can pick - * it up + * Used to determine if an item burns you when held, and if tongs can pick it up */ - public static boolean isHotItem(ItemStack item) - { - if (item.getItem() instanceof IHotItem) - { + public static boolean isHotItem(ItemStack item) { + if (item.getItem() instanceof IHotItem) { return ((IHotItem) item.getItem()).isHot(item); } return false; @@ -73,10 +63,8 @@ public static boolean isHotItem(ItemStack item) /** * Determines if it can be cooled in a water source */ - public static boolean isCoolableItem(ItemStack item) - { - if (item.getItem() instanceof IHotItem) - { + public static boolean isCoolableItem(ItemStack item) { + if (item.getItem() instanceof IHotItem) { return ((IHotItem) item.getItem()).isCoolable(item); } return false; @@ -87,12 +75,9 @@ public static boolean isCoolableItem(ItemStack item) */ public static ItemStack getHeldItem(ItemStack tongs) { NBTTagCompound nbt = getNBT(tongs); - if (nbt.hasKey("Held")) - { - if (nbt.getBoolean("Held")) - { - if(nbt.hasKey("Saved")) - { + if (nbt.hasKey("Held")) { + if (nbt.getBoolean("Held")) { + if (nbt.hasKey("Saved")) { NBTTagCompound save = nbt.getCompoundTag("Saved"); return ItemStack.loadItemStackFromNBT(save); } @@ -110,10 +95,8 @@ public static ItemStack getHeldItem(ItemStack tongs) { public static ItemStack getHeldItemTongs(ItemStack tongs) { NBTTagCompound nbt = getNBT(tongs); if (nbt.hasKey("Held")) { - if (nbt.getBoolean("Held")) - { - if(nbt.hasKey("Saved")) - { + if (nbt.getBoolean("Held")) { + if (nbt.hasKey("Saved")) { NBTTagCompound save = nbt.getCompoundTag("Saved"); return ItemStack.loadItemStackFromNBT(save); } @@ -131,16 +114,13 @@ public static NBTTagCompound getNBT(ItemStack item) { } return item.getTagCompound(); } - - public static float getWaterSource(World world, int i, int j, int k) - { + + public static float getWaterSource(World world, int i, int j, int k) { float special = TongsHelper.getQuenced(world, i, j, k); - if(special >= 0) - { + if (special >= 0) { return special; } - if (world.getBlock(i, j, k).getMaterial() == Material.water) - { + if (world.getBlock(i, j, k).getMaterial() == Material.water) { world.setBlockToAir(i, j, k); return 25F; } @@ -149,15 +129,15 @@ public static float getWaterSource(World world, int i, int j, int k) } return -1F; } + public static boolean isCauldron(World world, int x, int y, int z) { return world.getBlock(x, y, z) == Blocks.cauldron && world.getBlockMetadata(x, y, z) > 0; } - public static float getQuenced(World world, int x, int y, int z) - { + + public static float getQuenced(World world, int x, int y, int z) { TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof IQuenchBlock) - { - return ((IQuenchBlock)tile).quench(); + if (tile != null && tile instanceof IQuenchBlock) { + return ((IQuenchBlock) tile).quench(); } return -1F; } diff --git a/src/main/java/minefantasy/mf2/api/helpers/ArmourCalculator.java b/src/main/java/minefantasy/mf2/api/helpers/ArmourCalculator.java index 6577614b..ea59012f 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/ArmourCalculator.java +++ b/src/main/java/minefantasy/mf2/api/helpers/ArmourCalculator.java @@ -5,19 +5,16 @@ import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.armour.CustomArmourEntry; import minefantasy.mf2.api.armour.CustomDamageRatioEntry; -import minefantasy.mf2.api.armour.IArmourPenetrationMob; import minefantasy.mf2.api.armour.IArmourMF; -import minefantasy.mf2.api.armour.IArmourRating; +import minefantasy.mf2.api.armour.IArmourPenetrationMob; import minefantasy.mf2.api.armour.IArmouredEntity; import minefantasy.mf2.api.armour.ISpecialArmourMF; import minefantasy.mf2.api.weapon.IDamageType; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; @@ -28,22 +25,19 @@ import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; -import net.minecraftforge.common.ISpecialArmor; -import net.minecraftforge.common.ISpecialArmor.ArmorProperties; /** - * This class is used to calculate armour values like classes and weight + * This class is used to calculate armour values like classes and weight */ -public class ArmourCalculator -{ +public class ArmourCalculator { public static boolean advancedDamageTypes = true; /** - * This is the scale for helmet, chest, legs and boots. Use this with 'slot' to scale things like weight and DT distribution + * This is the scale for helmet, chest, legs and boots. Use this with 'slot' to + * scale things like weight and DT distribution */ - public static final float[]sizes = new float[]{0.2F, 0.3F, 0.3F, 0.2F}; - + public static final float[] sizes = new float[] { 0.2F, 0.3F, 0.3F, 0.2F }; + /** * For the percentage based armour, how much is ratio 2(50%) viewed as */ @@ -51,80 +45,71 @@ public class ArmourCalculator /** * What affects stamina regen, and what affects stamina cost */ - public static final float[]encumberanceArray = new float[]{10F, 40F}; + public static final float[] encumberanceArray = new float[] { 10F, 40F }; /** * When your movement starts and peaks at slowing down */ public static final float slowAmount = 10F; - public static final float[] moveSpeedThreshold = new float[]{30F, 40F}; + public static final float[] moveSpeedThreshold = new float[] { 30F, 40F }; /** * Gets the default using the items ArmourClass */ - private static float getDefaultSuitWeight(ItemStack armour) - { + private static float getDefaultSuitWeight(ItemStack armour) { return CustomArmourEntry.getEntryVars(armour)[0]; } - private static float getDefaultBulk(ItemStack armour) - { + private static float getDefaultBulk(ItemStack armour) { return CustomArmourEntry.getEntryVars(armour)[1]; } - - public static ArmourDesign getDefaultAD(ItemStack armour) - { + public static ArmourDesign getDefaultAD(ItemStack armour) { return ArmourDesign.SOLID; } - + public static float slowRate = 1.0F; /** * Converts a hit:damage ratio into vanilla AR(rounding off as it is an int) */ - public static int translateToVanillaAR(float ratio) - { - return (int)Math.min(24, 25F*convertToPercent(ratio)); + public static int translateToVanillaAR(float ratio) { + return (int) Math.min(24, 25F * convertToPercent(ratio)); } - + /** - * Converting a single piece to vanilla AR (rounding off as it is an int) Then it divides on the slot. Used for armour bar + * Converting a single piece to vanilla AR (rounding off as it is an int) Then + * it divides on the slot. Used for armour bar */ - public static int translateToVanillaAR(float ratio, int piece, int max) - { - float scale = (float)piece/(float)max; - - return (int)Math.min(24, 25F*convertToPercent(ratio) * scale); + public static int translateToVanillaAR(float ratio, int piece, int max) { + float scale = (float) piece / (float) max; + + return (int) Math.min(24, 25F * convertToPercent(ratio) * scale); } - + /** * Converts a hit:damage ratio into a decimal percentage */ - public static float convertToPercent(float ratio) - { - return (1F - (1F/ratio)); + public static float convertToPercent(float ratio) { + return (1F - (1F / ratio)); } /** * Estimates the distribution of stats over a piece */ - private static float estimateScale(ItemStack item, int slot) - { - if(item == null) - { + private static float estimateScale(ItemStack item, int slot) { + if (item == null) { return 0; } - - if(item.getItem() instanceof ItemArmor) - { - ItemArmor armour = (ItemArmor)item.getItem(); + + if (item.getItem() instanceof ItemArmor) { + ItemArmor armour = (ItemArmor) item.getItem(); ArmorMaterial material = armour.getArmorMaterial(); - - //gets the total added for all 4 pieces - int totalProtection = material.getDamageReductionAmount(0) + material.getDamageReductionAmount(1) + material.getDamageReductionAmount(2) + material.getDamageReductionAmount(3); - if(totalProtection > 0) - { + // gets the total added for all 4 pieces + int totalProtection = material.getDamageReductionAmount(0) + material.getDamageReductionAmount(1) + + material.getDamageReductionAmount(2) + material.getDamageReductionAmount(3); + + if (totalProtection > 0) { float singlePointWorth = 1F / totalProtection; return material.getDamageReductionAmount(slot) * singlePointWorth; } @@ -132,56 +117,49 @@ private static float estimateScale(ItemStack item, int slot) return sizes[slot]; } - public static float getSpeedModForWeight(EntityLivingBase user) - { + public static float getSpeedModForWeight(EntityLivingBase user) { float mod = 0.0F; float min = moveSpeedThreshold[0]; - float max = moveSpeedThreshold[1]-min; + float max = moveSpeedThreshold[1] - min; float mass = getTotalWeightOfWorn(user, true) - min; - if(mass > 0 && max > 0) - { - mod -= (mass/max)*slowAmount*slowRate; + if (mass > 0 && max > 0) { + mod -= (mass / max) * slowAmount * slowRate; } return mod; } private static final String weightNBT = "MF_Worn_Weight"; private static final String weightNBTNS = "MF_Worn_Weight_NS"; - + /** * Gets the total worn weight of a user: this updates every 20 ticks */ - public static float getTotalWeightOfWorn(EntityLivingBase user, boolean considerSpeed) - { + public static float getTotalWeightOfWorn(EntityLivingBase user, boolean considerSpeed) { String tag = considerSpeed ? weightNBTNS : weightNBT; - if(!user.getEntityData().hasKey(tag)) - { + if (!user.getEntityData().hasKey(tag)) { return setTotalWeightOfWorn(user, considerSpeed); - } - else - { + } else { return user.getEntityData().getFloat(tag); } } - public static void updateWeights(EntityLivingBase user) - { + + public static void updateWeights(EntityLivingBase user) { setTotalWeightOfWorn(user, true); setTotalWeightOfWorn(user, false); } + /** - * @param considerSpeed if true: some pieces will be ignored, ment for speed calculations + * @param considerSpeed + * if true: some pieces will be ignored, ment for speed calculations */ - public static float setTotalWeightOfWorn(EntityLivingBase user, boolean considerSpeed) - { + public static float setTotalWeightOfWorn(EntityLivingBase user, boolean considerSpeed) { String tag = considerSpeed ? weightNBTNS : weightNBT; float weight = 0.0F; - - for(int a = 0; a < 4; a ++) - { - ItemStack armour = user.getEquipmentInSlot(4-a); - - if(!considerSpeed || shouldArmourAlterSpeed(armour)) - { + + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(4 - a); + + if (!considerSpeed || shouldArmourAlterSpeed(armour)) { weight += getPieceWeight(armour, a); } } @@ -189,474 +167,410 @@ public static float setTotalWeightOfWorn(EntityLivingBase user, boolean consider return weight; } - public static float getPieceWeight(ItemStack item, int slot) - { - if(item == null) - { + public static float getPieceWeight(ItemStack item, int slot) { + if (item == null) { return 0.0F; } - if(item.getItem() instanceof IArmourMF) - { - return ((IArmourMF)item.getItem()).getPieceWeight(item, slot); + if (item.getItem() instanceof IArmourMF) { + return ((IArmourMF) item.getItem()).getPieceWeight(item, slot); } - if(slot >= sizes.length) - { + if (slot >= sizes.length) { return 0F; } return getDefaultSuitWeight(item) * sizes[slot]; } - - private static boolean shouldArmourAlterSpeed(ItemStack armour) - { - if(armour == null) - { + + private static boolean shouldArmourAlterSpeed(ItemStack armour) { + if (armour == null) { return false; } - + return armour.getItem() instanceof IArmourMF || CustomArmourEntry.doesPieceSlowDown(armour); } - - public static float convertKgToIbs(float kg) - { - return kg*2.5F; + + public static float convertKgToIbs(float kg) { + return kg * 2.5F; } - public static float convertIbsToKg(float pounds) - { - return pounds/2.5F; + + public static float convertIbsToKg(float pounds) { + return pounds / 2.5F; } + /** * Modifes a value for resistence - * @param src the source (breaks down to ratio) - * @param value the variable to modify - * @param cuttingProt the cutting resistence - * @param bluntProt the blunt resistence - * @param pierceProt the piercing resistence + * + * @param src + * the source (breaks down to ratio) + * @param value + * the variable to modify + * @param cuttingProt + * the cutting resistence + * @param bluntProt + * the blunt resistence + * @param pierceProt + * the piercing resistence * @return */ - public static float adjustACForDamage(DamageSource src, float value, float cuttingProt, float bluntProt, float pierceProt) - { + public static float adjustACForDamage(DamageSource src, float value, float cuttingProt, float bluntProt, + float pierceProt) { float[] ratio = getRatioForSource(src); - if(ratio == null) - { - return value;//Null means undefined + if (ratio == null) { + return value;// Null means undefined } - - return modifyACForType(value, ratio[0], ratio[1], ratio[2], cuttingProt, bluntProt, pierceProt, getArmourPenetration(src)); + + return modifyACForType(value, ratio[0], ratio[1], ratio[2], cuttingProt, bluntProt, pierceProt, + getArmourPenetration(src)); } - public static float modifyACForType(int type, float value, float cuttingProt, float bluntProt, float pierceProt) - { - float[] f = new float[]{0F, 0F, 0F}; + + public static float modifyACForType(int type, float value, float cuttingProt, float bluntProt, float pierceProt) { + float[] f = new float[] { 0F, 0F, 0F }; f[type] = 1.0F; return modifyACForType(value, f[0], f[1], f[2], cuttingProt, bluntProt, pierceProt, 0F); } - public static float modifyACForType(float value, float cutting, float blunt, float pierce, float cuttingProt, float bluntProt, float pierceProt, float specialAP) - { - if(advancedDamageTypes) - { - //Averages the ratio between cutting and blunt, while modifying it by the armour traits - value *= (((cutting*cuttingProt) + (blunt*bluntProt) + (pierce*pierceProt)) / (cutting+blunt+pierce)); + + public static float modifyACForType(float value, float cutting, float blunt, float pierce, float cuttingProt, + float bluntProt, float pierceProt, float specialAP) { + if (advancedDamageTypes) { + // Averages the ratio between cutting and blunt, while modifying it by the + // armour traits + value *= (((cutting * cuttingProt) + (blunt * bluntProt) + (pierce * pierceProt)) + / (cutting + blunt + pierce)); } float ACModifier = 1.0F + specialAP; value *= ACModifier; - return value > 0F ? value: 0F; - } - - public static float getArmourPenetration(DamageSource source) - { - if(source != null && source.getEntity() != null) - { - Entity user = source.getEntity();//The attacker - Entity damager = source.getSourceOfDamage();//The thing causing damage(like arrows) - - if(user == damager && user instanceof EntityLivingBase && ((EntityLivingBase)user).getHeldItem() != null) - { - if(((EntityLivingBase)user).getHeldItem().getItem() instanceof IDamageType) - { - return ((IDamageType)((EntityLivingBase)user).getHeldItem().getItem()).getPenetrationLevel(((EntityLivingBase)user).getHeldItem()); + return value > 0F ? value : 0F; + } + + public static float getArmourPenetration(DamageSource source) { + if (source != null && source.getEntity() != null) { + Entity user = source.getEntity();// The attacker + Entity damager = source.getSourceOfDamage();// The thing causing damage(like arrows) + + if (user == damager && user instanceof EntityLivingBase + && ((EntityLivingBase) user).getHeldItem() != null) { + if (((EntityLivingBase) user).getHeldItem().getItem() instanceof IDamageType) { + return ((IDamageType) ((EntityLivingBase) user).getHeldItem().getItem()) + .getPenetrationLevel(((EntityLivingBase) user).getHeldItem()); } } - if(user != damager) - { - if(damager instanceof IDamageType) - { - return ((IDamageType)damager).getPenetrationLevel(damager); + if (user != damager) { + if (damager instanceof IDamageType) { + return ((IDamageType) damager).getPenetrationLevel(damager); } } } return 0F; } - public static float[] getRatioForSource(DamageSource source) - { - if(source.isMagicDamage() || source.isFireDamage() || source == DamageSource.starve) - { + + public static float[] getRatioForSource(DamageSource source) { + if (source.isMagicDamage() || source.isFireDamage() || source == DamageSource.starve) { return null; } - - if(source.isExplosion() || source == DamageSource.anvil || source == DamageSource.fallingBlock) - { - return new float[]{0, 1, 0};//blunt - } - if(source == DamageSource.cactus) - { - return new float[]{0, 0, 1};//pierce - } - if(source != null && source.getSourceOfDamage() != null && source.getEntity() != null) - { - Entity user = source.getEntity();//The attacker - Entity damager = source.getSourceOfDamage();//The thing causing damage(like arrows) - - if(user == damager && user instanceof EntityLivingBase) - { - return getRatioForMelee((EntityLivingBase)user, ((EntityLivingBase)user).getHeldItem()); + + if (source.isExplosion() || source == DamageSource.anvil || source == DamageSource.fallingBlock) { + return new float[] { 0, 1, 0 };// blunt + } + if (source == DamageSource.cactus) { + return new float[] { 0, 0, 1 };// pierce + } + if (source != null && source.getSourceOfDamage() != null && source.getEntity() != null) { + Entity user = source.getEntity();// The attacker + Entity damager = source.getSourceOfDamage();// The thing causing damage(like arrows) + + if (user == damager && user instanceof EntityLivingBase) { + return getRatioForMelee((EntityLivingBase) user, ((EntityLivingBase) user).getHeldItem()); } return getRatioForIndirect(damager); } - - return new float[]{0, 1, 0}; + + return new float[] { 0, 1, 0 }; } - private static float[] getRatioForIndirect(Entity damager) - { - if(damager == null) - { - return new float[]{1,1,1};//No damage type. + private static float[] getRatioForIndirect(Entity damager) { + if (damager == null) { + return new float[] { 1, 1, 1 };// No damage type. } - if(damager instanceof IDamageType) - { - return ((IDamageType)damager).getDamageRatio(damager); + if (damager instanceof IDamageType) { + return ((IDamageType) damager).getDamageRatio(damager); } - if(damager instanceof EntityArrow) - { - return new float[]{0, 0, 1}; + if (damager instanceof EntityArrow) { + return new float[] { 0, 0, 1 }; } - - if(useConfigIndirectDmg) - { + + if (useConfigIndirectDmg) { return CustomDamageRatioEntry.getTraits(getEntityRegisterName(damager)); } - return new float[]{1, 1, 1}; + return new float[] { 1, 1, 1 }; } + public static boolean useConfigIndirectDmg = true; - public static float[] getRatioForMelee(EntityLivingBase user, ItemStack weapon) - { - if(weapon == null) - { + public static float[] getRatioForMelee(EntityLivingBase user, ItemStack weapon) { + if (weapon == null) { return getMobDefault(user); } return getRatioForWeapon(user, weapon); } - public static float[] getRatioForWeapon(ItemStack weapon) - { + + public static float[] getRatioForWeapon(ItemStack weapon) { return getRatioForWeapon(null, weapon); } - public static float[] getRatioForWeapon(EntityLivingBase user, ItemStack weapon) - { + + public static float[] getRatioForWeapon(EntityLivingBase user, ItemStack weapon) { Item item = weapon.getItem(); - - if(item instanceof IDamageType) - { - return user != null ? ((IDamageType)item).getDamageRatio(weapon, user) : ((IDamageType)item).getDamageRatio(weapon); + + if (item instanceof IDamageType) { + return user != null ? ((IDamageType) item).getDamageRatio(weapon, user) + : ((IDamageType) item).getDamageRatio(weapon); } - if(item instanceof ItemSword) - { - return new float[]{1, 0, 0};//sword is cutting by default + if (item instanceof ItemSword) { + return new float[] { 1, 0, 0 };// sword is cutting by default } - if(item instanceof ItemAxe) - { - return new float[]{3, 1, 0};//Axe Ratio is about 3:1 (25%blunt) + if (item instanceof ItemAxe) { + return new float[] { 3, 1, 0 };// Axe Ratio is about 3:1 (25%blunt) } - if(item instanceof ItemPickaxe) - { - return new float[]{0, 0, 1};//Picks are pierce + if (item instanceof ItemPickaxe) { + return new float[] { 0, 0, 1 };// Picks are pierce } - if(item instanceof ItemHoe || item instanceof ItemSpade) - { - return new float[]{0, 1, 0};//Tools are blunt + if (item instanceof ItemHoe || item instanceof ItemSpade) { + return new float[] { 0, 1, 0 };// Tools are blunt } - + return CustomDamageRatioEntry.getTraits(item); } - - private static float[] getMobDefault(EntityLivingBase user) - { - if(user instanceof EntitySpider) - { - return new float[]{20F, 10F, 80F};//10% blunt, 20% slash, 80% pierce + + private static float[] getMobDefault(EntityLivingBase user) { + if (user instanceof EntitySpider) { + return new float[] { 20F, 10F, 80F };// 10% blunt, 20% slash, 80% pierce } - if(user instanceof IArmourPenetrationMob) - { - return ((IArmourPenetrationMob)user).getHitTraits(); + if (user instanceof IArmourPenetrationMob) { + return ((IArmourPenetrationMob) user).getHitTraits(); } - return new float[]{0, 1, 0}; + return new float[] { 0, 1, 0 }; } - public static String getEntityRegisterName(Entity entity) - { - if(entity == null) - { + public static String getEntityRegisterName(Entity entity) { + if (entity == null) { return "genetic"; } - String s = EntityList.getEntityString(entity); + String s = EntityList.getEntityString(entity); - if (s == null) - { - s = "generic"; - } + if (s == null) { + s = "generic"; + } + + return s; + } - return s; - } - public static float getTotalBulk(EntityLivingBase user) - { - if(PowerArmour.isWearingCogwork(user)) - { + public static float getTotalBulk(EntityLivingBase user) { + if (PowerArmour.isWearingCogwork(user)) { return 5F; } return getEquipmentBulk(user); } + /** - * Defined by Light/Medium/Heavy armour average - * 0 for light, 1 for full medium, 2 for full heavy + * Defined by Light/Medium/Heavy armour average 0 for light, 1 for full medium, + * 2 for full heavy */ - public static float getEquipmentBulk(EntityLivingBase user) - { + public static float getEquipmentBulk(EntityLivingBase user) { float bulk = 0.0F; - for(int a = 0; a < 4; a ++) - { - String s = getArmourClass(user.getEquipmentInSlot(4-a)); - if(s != null) - { - if(s.equalsIgnoreCase("Medium")) - { + for (int a = 0; a < 4; a++) { + String s = getArmourClass(user.getEquipmentInSlot(4 - a)); + if (s != null) { + if (s.equalsIgnoreCase("Medium")) { bulk += 1; } - if(s.equalsIgnoreCase("Heavy")) - { + if (s.equalsIgnoreCase("Heavy")) { bulk += 2; } } - + } - return bulk/4; + return bulk / 4; } - public static String getArmourClass(ItemStack armour) - { - if(armour == null) - { + + public static String getArmourClass(ItemStack armour) { + if (armour == null) { return null; } - if(armour.getItem() instanceof IArmourMF) - { - return ((IArmourMF)armour.getItem()).getSuitWeigthType(armour); + if (armour.getItem() instanceof IArmourMF) { + return ((IArmourMF) armour.getItem()).getSuitWeigthType(armour); } - return CustomArmourEntry.getArmourClass(armour); + return CustomArmourEntry.getArmourClass(armour); } - - //THRESHOLD + + // THRESHOLD @SideOnly(Side.CLIENT) /** - * CLIENT WHOLE ENTITY: - * Gets the total DT of an entity by damage type: Used by the Screen renderer + * CLIENT WHOLE ENTITY: Gets the total DT of an entity by damage type: Used by + * the Screen renderer */ - public static float getDTDisplay(EntityLivingBase user, int id) - { + public static float getDTDisplay(EntityLivingBase user, int id) { float armourDT = 0; - for(int a = 0; a < 4; a++) - { - ItemStack armour = user.getEquipmentInSlot(a+1); - if(armour != null && armour.getItem() instanceof ISpecialArmourMF) - { - float threshold = getArmourValueMod(armour, ((ISpecialArmourMF)armour.getItem()).getDTDisplay(armour, id)); + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { + float threshold = getArmourValueMod(armour, + ((ISpecialArmourMF) armour.getItem()).getDTDisplay(armour, id)); armourDT += threshold; } } return armourDT; } - + @SideOnly(Side.CLIENT) /** - * CLIENT SINGLE PIECE: - * Gets a stat for a single piece: Used by Tooltips + * CLIENT SINGLE PIECE: Gets a stat for a single piece: Used by Tooltips */ - public static float getDTForDisplayPiece(ItemStack armour, int id) - { - if(armour != null && armour.getItem() instanceof ISpecialArmourMF) - { - return getArmourValueMod(armour, ((ISpecialArmourMF)armour.getItem()).getDTDisplay(armour, id)); + public static float getDTForDisplayPiece(ItemStack armour, int id) { + if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { + return getArmourValueMod(armour, ((ISpecialArmourMF) armour.getItem()).getDTDisplay(armour, id)); } return 0F; } + @SideOnly(Side.CLIENT) /** - * CLIENT SINGLE PIECE: - * Gets a stat for a single piece: Used by Tooltips + * CLIENT SINGLE PIECE: Gets a stat for a single piece: Used by Tooltips */ - public static float getDRForDisplayPiece(ItemStack armour, int id) - { - if(armour == null) - { + public static float getDRForDisplayPiece(ItemStack armour, int id) { + if (armour == null) { return 0F; } - if(armour.getItem() instanceof ISpecialArmourMF) - { - return getArmourValueMod(armour, ((ISpecialArmourMF)armour.getItem()).getDRDisplay(armour, id)); + if (armour.getItem() instanceof ISpecialArmourMF) { + return getArmourValueMod(armour, ((ISpecialArmourMF) armour.getItem()).getDRDisplay(armour, id)); } return 0F; } + @SideOnly(Side.CLIENT) /** - * CLIENT WHOLE ENTITY: - * Gets the total DT of an entity by damage type: Used by the Screen renderer + * CLIENT WHOLE ENTITY: Gets the total DT of an entity by damage type: Used by + * the Screen renderer */ - public static float getDRDisplay(EntityLivingBase user, int id) - { + public static float getDRDisplay(EntityLivingBase user, int id) { float armourDT = 0; - for(int a = 0; a < 4; a++) - { - ItemStack armour = user.getEquipmentInSlot(a+1); - if(armour != null && armour.getItem() instanceof ISpecialArmourMF) - { - float threshold = getArmourValueMod(armour, ((ISpecialArmourMF)armour.getItem()).getDRDisplay(armour, id)); + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { + float threshold = getArmourValueMod(armour, + ((ISpecialArmourMF) armour.getItem()).getDRDisplay(armour, id)); armourDT += threshold; } } return armourDT; } + /** - * MECHANIC WHOLE ENTITY: - * Gets the threshold of a whole entity + * MECHANIC WHOLE ENTITY: Gets the threshold of a whole entity */ - public static float getACThreshold(EntityLivingBase user, DamageSource src) - { + public static float getACThreshold(EntityLivingBase user, DamageSource src) { float naturalAC = getACForMob(user); - - if(user instanceof IArmouredEntity) - { - naturalAC = ((IArmouredEntity)user).getThreshold(src); + + if (user instanceof IArmouredEntity) { + naturalAC = ((IArmouredEntity) user).getThreshold(src); } - + float armourDT = 0; - for(int a = 0; a < 4; a++) - { - ItemStack armour = user.getEquipmentInSlot(a+1); - if(armour != null && armour.getItem() instanceof ISpecialArmourMF) - { - float threshold = getArmourValueMod(armour, ((ISpecialArmourMF)armour.getItem()).getDTValue(user, armour, src)); + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { + float threshold = getArmourValueMod(armour, + ((ISpecialArmourMF) armour.getItem()).getDTValue(user, armour, src)); armourDT += threshold; } } return naturalAC + armourDT; } - + /** - * MECHANIC DT MODIFIER: - * Gets the DT Modifier for durability loss + * MECHANIC DT MODIFIER: Gets the DT Modifier for durability loss */ - private static float modifyDTOnDura(ItemStack armour) - { + private static float modifyDTOnDura(ItemStack armour) { float percentQuality = getPercentQuality(armour); - + float reduction = 0.8F; - - if(percentQuality < reduction) - { + + if (percentQuality < reduction) { float mod = Math.max(0.1F, percentQuality / reduction); - + return mod; } return 1.0F; } /** - * MECHANIC DAMAGE FINDER: - * Gets the percent durability of an item + * MECHANIC DAMAGE FINDER: Gets the percent durability of an item */ - private static float getPercentQuality(ItemStack armour) - { - return 1F - ((float)armour.getItemDamage() / (float)armour.getMaxDamage()); + private static float getPercentQuality(ItemStack armour) { + return 1F - ((float) armour.getItemDamage() / (float) armour.getMaxDamage()); } /** - * MECHANIC DT CALCULATOR: - * Gets the natural DT of an entity + * MECHANIC DT CALCULATOR: Gets the natural DT of an entity */ - private static float getACForMob(EntityLivingBase user) - { - if(user.getCreatureAttribute() == EnumCreatureAttribute.ARTHROPOD) - { - return user.getMaxHealth()/10F;//1.6AC for spiders + private static float getACForMob(EntityLivingBase user) { + if (user.getCreatureAttribute() == EnumCreatureAttribute.ARTHROPOD) { + return user.getMaxHealth() / 10F;// 1.6AC for spiders } return 0F; } + /** - * MECHANIC DT CALCULATOR: - * Gets the modifiers based on the itemstack (such as damage and NBT) DT OR DR + * MECHANIC DT CALCULATOR: Gets the modifiers based on the itemstack (such as + * damage and NBT) DT OR DR */ - public static float getArmourValueMod(ItemStack armour, float DT) - { + public static float getArmourValueMod(ItemStack armour, float DT) { float initDT = DT; - if(armour.hasTagCompound() && armour.getTagCompound().hasKey("MF_Inferior")) - { + if (armour.hasTagCompound() && armour.getTagCompound().hasKey("MF_Inferior")) { DT *= (armour.getTagCompound().getBoolean("MF_Inferior") ? 0.8F : 1.2F); } DT *= modifyDTOnDura(armour); return DT; } + /** - * MECHANIC DT CALCULATOR: - * How much is armour damaged by a hit + * MECHANIC DT CALCULATOR: How much is armour damaged by a hit */ - public static int getDamageToDura(EntityLivingBase user, DamageSource source, ItemStack armour, float dam) - { - if(source.isUnblockable()) - { + public static int getDamageToDura(EntityLivingBase user, DamageSource source, ItemStack armour, float dam) { + if (source.isUnblockable()) { return 0; } - if(source.getSourceOfDamage() != null && source.getSourceOfDamage() == source.getEntity()) - { + if (source.getSourceOfDamage() != null && source.getSourceOfDamage() == source.getEntity()) { dam *= getMobArmourDamage(source.getSourceOfDamage()); } - if(getPercentQuality(armour) > 0.1F) - { - dam = Math.max(1.0F, dam/4F); + if (getPercentQuality(armour) > 0.1F) { + dam = Math.max(1.0F, dam / 4F); } - return (int)dam; + return (int) dam; } + /** - * MECHANIC DT CALCULATOR: - * How much armour damage the entity does + * MECHANIC DT CALCULATOR: How much armour damage the entity does */ - private static float getMobArmourDamage(Entity src) - { - if(src instanceof EntitySpider) - { + private static float getMobArmourDamage(Entity src) { + if (src instanceof EntitySpider) { return 3.0F; } return 0.5F; } - public static void damageArmour(EntityLivingBase user, int dura) - { - for(int a = 0; a < 4; a++) - { - ItemStack armour = user.getEquipmentInSlot(a+1); - if(armour != null) - { - if(!user.worldObj.isRemote) - { - if(armour.getItemDamage() + dura < armour.getMaxDamage()) - { + public static void damageArmour(EntityLivingBase user, int dura) { + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null) { + if (!user.worldObj.isRemote) { + if (armour.getItemDamage() + dura < armour.getMaxDamage()) { armour.damageItem(dura, user); - } - else - { + } else { armour.setItemDamage(armour.getMaxDamage()); } } - if(armour.getItemDamage() >= armour.getMaxDamage()) - { - user.setCurrentItemOrArmor(a+1, null); - user.worldObj.playSoundEffect(user.posX, user.posY+user.getEyeHeight() - (0.4F*a), user.posZ, "random.break", 1.0F, 1.0F); + if (armour.getItemDamage() >= armour.getMaxDamage()) { + user.setCurrentItemOrArmor(a + 1, null); + user.worldObj.playSoundEffect(user.posX, user.posY + user.getEyeHeight() - (0.4F * a), user.posZ, + "random.break", 1.0F, 1.0F); } } } @@ -665,17 +579,15 @@ public static void damageArmour(EntityLivingBase user, int dura) /** * Determines how much armour reduces parrying ability */ - public static float getParryModifier(EntityLivingBase user) - { + public static float getParryModifier(EntityLivingBase user) { float bulk = getTotalBulk(user); - - return 1.0F / ( (bulk*0.5F) + 1);//50% in heavy + + return 1.0F / ((bulk * 0.5F) + 1);// 50% in heavy } - public static int modifyParryCooldown(EntityLivingBase user, int ticks) - { + public static int modifyParryCooldown(EntityLivingBase user, int ticks) { float bulk = getTotalBulk(user); - - return (int) Math.max(5, ticks + (bulk*5));//plate adds 5t + + return (int) Math.max(5, ticks + (bulk * 5));// plate adds 5t } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/ArrowEffectsMF.java b/src/main/java/minefantasy/mf2/api/helpers/ArrowEffectsMF.java index d7cb3b77..d8dfe4b8 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/ArrowEffectsMF.java +++ b/src/main/java/minefantasy/mf2/api/helpers/ArrowEffectsMF.java @@ -10,108 +10,107 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -public class ArrowEffectsMF -{ - //THE ARROW STICKING CODE IS EXPERIMENTAL AND NOT ACTIVE BY DEFAULT +public class ArrowEffectsMF { + // THE ARROW STICKING CODE IS EXPERIMENTAL AND NOT ACTIVE BY DEFAULT /** * Sticks an arrow into an entity THIS WILL ONLY BE DROPPED ON LIVING ENTITIES. * (This does not render arrows, simply drops them when an enemy is killed) - * @param hit the entity the arrow hit - * @param projectile the arrow entity, it will get the item to drop + * + * @param hit + * the entity the arrow hit + * @param projectile + * the arrow entity, it will get the item to drop */ - public static void stickArrowIn(Entity hit, Entity projectile) - { - stickArrowIn(hit, getDroppedArrow(projectile) ,projectile); + public static void stickArrowIn(Entity hit, Entity projectile) { + stickArrowIn(hit, getDroppedArrow(projectile), projectile); } + /** * Sticks an arrow into an entity THIS WILL ONLY BE DROPPED ON LIVING ENTITIES. * (This does not render arrows, simply drops them when an enemy is killed) - * @param hit the entity the arrow hit - * @param arrow the item that gets dropped when "hit" is killed - * @param projectile the arrow entity + * + * @param hit + * the entity the arrow hit + * @param arrow + * the item that gets dropped when "hit" is killed + * @param projectile + * the arrow entity */ - public static void stickArrowIn(Entity hit, ItemStack arrow, Entity projectile) - { - if(!shouldArrowStick(projectile)) - { + public static void stickArrowIn(Entity hit, ItemStack arrow, Entity projectile) { + if (!shouldArrowStick(projectile)) { return; } NBTTagCompound nbt = hit.getEntityData(); - + int slot = 0; - if(nbt.hasKey("stuckArrowCountMF")) - { + if (nbt.hasKey("stuckArrowCountMF")) { slot = hit.getEntityData().getInteger("stuckArrowCountMF"); } - - NBTTagCompound stuckArrow = new NBTTagCompound();//makes the arrow instance - arrow.writeToNBT(stuckArrow);//put arrow in instance - - nbt.setTag("StuckArrowMF"+slot, stuckArrow);//save arrow list - nbt.setInteger("stuckArrowCountMF", slot+1);//Slot increases + + NBTTagCompound stuckArrow = new NBTTagCompound();// makes the arrow instance + arrow.writeToNBT(stuckArrow);// put arrow in instance + + nbt.setTag("StuckArrowMF" + slot, stuckArrow);// save arrow list + nbt.setInteger("stuckArrowCountMF", slot + 1);// Slot increases } - + /** - * Gets the arrow dropped when an enemy is killed. - * MODS NEED TO ADD THEIR OWN SUPPORT - * @param arrow the arrow fired + * Gets the arrow dropped when an enemy is killed. MODS NEED TO ADD THEIR OWN + * SUPPORT + * + * @param arrow + * the arrow fired */ - public static ItemStack getDroppedArrow(Entity arrow) - { - if(arrow instanceof IArrowRetrieve)//implement this method in your entity arrow classes + public static ItemStack getDroppedArrow(Entity arrow) { + if (arrow instanceof IArrowRetrieve)// implement this method in your entity arrow classes { - return ((IArrowRetrieve)arrow).getDroppedItem(); + return ((IArrowRetrieve) arrow).getDroppedItem(); } - if(arrow.getEntityData().hasKey("MF_ArrowItem")) - { + if (arrow.getEntityData().hasKey("MF_ArrowItem")) { NBTTagCompound heldArrow = arrow.getEntityData().getCompoundTag("MF_ArrowItem"); return ItemStack.loadItemStackFromNBT(heldArrow); } return new ItemStack(Items.arrow); } - + /** * Gets if an arrow entity will drop items when the enemy is killed. - * @param projectile the arrow entity fired + * + * @param projectile + * the arrow entity fired */ - public static boolean shouldArrowStick(Entity projectile) - { - if(projectile instanceof IArrowRetrieve) - { - return ((IArrowRetrieve)projectile).canBePickedUp(); + public static boolean shouldArrowStick(Entity projectile) { + if (projectile instanceof IArrowRetrieve) { + return ((IArrowRetrieve) projectile).canBePickedUp(); } - if(projectile instanceof EntityArrow) - { - return ((EntityArrow)projectile).canBePickedUp == 1; + if (projectile instanceof EntityArrow) { + return ((EntityArrow) projectile).canBePickedUp == 1; } return true; } /** - * Gets the list of items that arrows have stuck in from the "stickArrowIn" method; - * THIS IS ONLY CALLED BY LIVING ENTITIES - * @param entity the entity killed + * Gets the list of items that arrows have stuck in from the "stickArrowIn" + * method; THIS IS ONLY CALLED BY LIVING ENTITIES + * + * @param entity + * the entity killed */ - public static List getStuckArrows(Entity entity) - { + public static List getStuckArrows(Entity entity) { List arrows = new ArrayList(); NBTTagCompound nbt = entity.getEntityData(); - + int arrowCount = 0; - if(nbt.hasKey("stuckArrowCountMF")) - { + if (nbt.hasKey("stuckArrowCountMF")) { arrowCount = entity.getEntityData().getInteger("stuckArrowCountMF"); } - - if(arrowCount > 0) - { - for(int a = 0; a < arrowCount; a ++) - { - NBTTagCompound stuckArrow = (NBTTagCompound) nbt.getTag("StuckArrowMF"+a); - if(stuckArrow != null) - { - arrows.add(ItemStack.loadItemStackFromNBT(stuckArrow)); - } + + if (arrowCount > 0) { + for (int a = 0; a < arrowCount; a++) { + NBTTagCompound stuckArrow = (NBTTagCompound) nbt.getTag("StuckArrowMF" + a); + if (stuckArrow != null) { + arrows.add(ItemStack.loadItemStackFromNBT(stuckArrow)); + } } } return arrows; diff --git a/src/main/java/minefantasy/mf2/api/helpers/BlockPositionHelper.java b/src/main/java/minefantasy/mf2/api/helpers/BlockPositionHelper.java index 7749a573..81a385cc 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/BlockPositionHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/BlockPositionHelper.java @@ -1,96 +1,103 @@ package minefantasy.mf2.api.helpers; -import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; -public class BlockPositionHelper -{ - //private static ForgeDirection[] FD = new ForgeDirection[]{ForgeDirection.SOUTH, ForgeDirection.WEST, ForgeDirection.NORTH, ForgeDirection.EAST}; +public class BlockPositionHelper { + // private static ForgeDirection[] FD = new + // ForgeDirection[]{ForgeDirection.SOUTH, ForgeDirection.WEST, + // ForgeDirection.NORTH, ForgeDirection.EAST}; /** * Gets the Grid slot in relation to mouse click - * @param clickX the area clicked on X (called in blockActivated) - * @param clickY the area clicked on Y (called in blockActivated) - * @param xBound the x boundry of the block - * @param xBound2 the x max boundry of the block - * @param yBound the y boundry of the block - * @param yBound2 the y max boundry of the block - * @param xSlots the slot count x - * @param ySlots the slot count y - * @param direction the direction the block is facing + * + * @param clickX + * the area clicked on X (called in blockActivated) + * @param clickY + * the area clicked on Y (called in blockActivated) + * @param xBound + * the x boundry of the block + * @param xBound2 + * the x max boundry of the block + * @param yBound + * the y boundry of the block + * @param yBound2 + * the y max boundry of the block + * @param xSlots + * the slot count x + * @param ySlots + * the slot count y + * @param direction + * the direction the block is facing */ - public static int[] getCoordsFor(float clickX, float clickY, float xBound, float xBound2, float yBound, float yBound2, int xSlots, int ySlots, int direction) - { - if(clickX < xBound || clickX > xBound2 || clickY < yBound || clickY > yBound2) - { + public static int[] getCoordsFor(float clickX, float clickY, float xBound, float xBound2, float yBound, + float yBound2, int xSlots, int ySlots, int direction) { + if (clickX < xBound || clickX > xBound2 || clickY < yBound || clickY > yBound2) { return null; } - + clickX -= xBound; clickY -= yBound; - + float xMax = xBound2 - xBound; float yMax = yBound2 - yBound; - + int xSlot = 0; int ySlot = 0; - - float xSpace = xMax / (float)xSlots; - float ySpace = yMax / (float)ySlots; - - for(int xT = 0; xT < xSlots; xT ++) - { + + float xSpace = xMax / xSlots; + float ySpace = yMax / ySlots; + + for (int xT = 0; xT < xSlots; xT++) { float MinSpace = xSpace * xT; - float MaxSpace = xSpace * (xT+1); - if(clickX < MaxSpace && clickX > MinSpace) - { + float MaxSpace = xSpace * (xT + 1); + if (clickX < MaxSpace && clickX > MinSpace) { xSlot = xT; } } - - for(int yT = 0; yT < ySlots; yT ++) - { + + for (int yT = 0; yT < ySlots; yT++) { float MinSpace = ySpace * yT; - float MaxSpace = ySpace * (yT+1); - if(clickY < MaxSpace && clickY > MinSpace) - { + float MaxSpace = ySpace * (yT + 1); + if (clickY < MaxSpace && clickY > MinSpace) { ySlot = yT; } } return translateCoords(xSlot, ySlot, xSlots, ySlots, direction); } - + /** * Translates the coords on angles (NORTH is default) - * @param x the slot x - * @param y the slot y - * @param maxX the slot count x - * @param maxY the slot count y - * @param dir the facing direction + * + * @param x + * the slot x + * @param y + * the slot y + * @param maxX + * the slot count x + * @param maxY + * the slot count y + * @param dir + * the facing direction */ - public static int[] translateCoords(int x, int y, int maxX, int maxY, int direction) - { + public static int[] translateCoords(int x, int y, int maxX, int maxY, int direction) { ForgeDirection dir = ForgeDirection.getOrientation(direction); - if(dir == ForgeDirection.NORTH) - { + if (dir == ForgeDirection.NORTH) { int newX = (maxX - x - 1); int newY = (maxY - y - 1); - return new int[]{newX, newY}; + return new int[] { newX, newY }; } - - if(dir == ForgeDirection.WEST) - { + + if (dir == ForgeDirection.WEST) { int newX = (y); int newY = (maxX - x - 1); - return new int[]{newX, newY}; + return new int[] { newX, newY }; } - if(dir == ForgeDirection.EAST) - { + if (dir == ForgeDirection.EAST) { int newY = (x); int newX = (maxY - y - 1); - return new int[]{newX, newY}; + return new int[] { newX, newY }; } - - return new int[]{x, y}; + + return new int[] { x, y }; } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/ClientTickHandler.java b/src/main/java/minefantasy/mf2/api/helpers/ClientTickHandler.java index c975cd80..1cbdc825 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/ClientTickHandler.java +++ b/src/main/java/minefantasy/mf2/api/helpers/ClientTickHandler.java @@ -1,17 +1,11 @@ package minefantasy.mf2.api.helpers; -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; import cpw.mods.fml.common.gameevent.TickEvent.RenderTickEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; public class ClientTickHandler { @@ -20,27 +14,23 @@ public class ClientTickHandler { public static float partialTicks = 0; @SubscribeEvent - public void renderTickStart(RenderTickEvent event) - { - if(event.phase == Phase.START) + public void renderTickStart(RenderTickEvent event) { + if (event.phase == Phase.START) partialTicks = event.renderTickTime; } @SubscribeEvent - public void clientTickEnd(ClientTickEvent event) - { - if(event.phase == Phase.END) - { + public void clientTickEnd(ClientTickEvent event) { + if (event.phase == Phase.END) { GuiScreen gui = Minecraft.getMinecraft().currentScreen; - if(gui == null || !gui.doesGuiPauseGame()) - { + if (gui == null || !gui.doesGuiPauseGame()) { ticksInGame++; } } } public static void notifyPageChange() { - if(pageFlipTicks == 0) + if (pageFlipTicks == 0) pageFlipTicks = 5; } diff --git a/src/main/java/minefantasy/mf2/api/helpers/CustomToolHelper.java b/src/main/java/minefantasy/mf2/api/helpers/CustomToolHelper.java index 40a2d938..e2cfee9b 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/CustomToolHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/CustomToolHelper.java @@ -18,504 +18,460 @@ import net.minecraftforge.common.util.EnumHelper; import net.minecraftforge.oredict.OreDictionary; -public class CustomToolHelper -{ +public class CustomToolHelper { public static final String slot_main = "main_metal"; public static final String slot_haft = "haft_wood"; + /** * A bit of the new system, gets custom materials for the head */ - public static CustomMaterial getCustomPrimaryMaterial(ItemStack item) - { - if(item == null)return null; - + public static CustomMaterial getCustomPrimaryMaterial(ItemStack item) { + if (item == null) + return null; + CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); - if(material != null) - { + if (material != null) { return material; } return null; } - public static CustomMaterial getCustomSecondaryMaterial(ItemStack item) - { - if(item == null)return null; - + + public static CustomMaterial getCustomSecondaryMaterial(ItemStack item) { + if (item == null) + return null; + CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_haft); - if(material != null) - { + if (material != null) { return material; } return null; } - - public static ItemStack construct(Item base, String main) - { - return construct(base,main,"OakWood"); + + public static ItemStack construct(Item base, String main) { + return construct(base, main, "OakWood"); } - - public static ItemStack construct(Item base, String main, String haft) - { + + public static ItemStack construct(Item base, String main, String haft) { ItemStack item = new ItemStack(base); CustomMaterial.addMaterial(item, slot_main, main.toLowerCase()); - if(haft != null) - { + if (haft != null) { CustomMaterial.addMaterial(item, slot_haft, haft.toLowerCase()); } return item; } - - public static ItemStack constructSingleColoredLayer(Item base, String main) - { + + public static ItemStack constructSingleColoredLayer(Item base, String main) { return constructSingleColoredLayer(base, main, 1); } - public static ItemStack constructSingleColoredLayer(Item base, String main, int stacksize) - { + + public static ItemStack constructSingleColoredLayer(Item base, String main, int stacksize) { ItemStack item = new ItemStack(base, stacksize); CustomMaterial.addMaterial(item, slot_main, main.toLowerCase()); return item; } + /** * Gets the rarity for a custom item - * @param itemRarity is the default id + * + * @param itemRarity + * is the default id */ - public static EnumRarity getRarity(ItemStack item, int itemRarity) - { - int lvl = itemRarity+1; - CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); - if(material != null) - { - lvl = material.rarityID+1; - } - - if(item.isItemEnchanted()) - { - if(lvl == 0) - { + public static EnumRarity getRarity(ItemStack item, int itemRarity) { + int lvl = itemRarity + 1; + CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); + if (material != null) { + lvl = material.rarityID + 1; + } + + if (item.isItemEnchanted()) { + if (lvl == 0) { lvl++; } - lvl ++; + lvl++; } - if(lvl >= rarity.length) - { - lvl = rarity.length-1; + if (lvl >= rarity.length) { + lvl = rarity.length - 1; } return rarity[lvl]; } + public static EnumRarity poor = EnumHelper.addRarity("Poor", EnumChatFormatting.DARK_GRAY, "poor"); - public static EnumRarity[] rarity = new EnumRarity[]{poor, EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, EnumRarity.epic}; + public static EnumRarity[] rarity = new EnumRarity[] { poor, EnumRarity.common, EnumRarity.uncommon, + EnumRarity.rare, EnumRarity.epic }; + /** * Gets the max durability - * @param dura is the default dura + * + * @param dura + * is the default dura */ - public static int getMaxDamage(ItemStack stack, int dura) - { + public static int getMaxDamage(ItemStack stack, int dura) { CustomMaterial head = getCustomPrimaryMaterial(stack); CustomMaterial haft = getCustomSecondaryMaterial(stack); - if(head != null) - { - dura = (int)(head.durability * 100); + if (head != null) { + dura = (int) (head.durability * 100); } - if(haft != null) - { - dura += (int)(haft.durability * 100);//Hafts add 50% to the durability + if (haft != null) { + dura += (int) (haft.durability * 100);// Hafts add 50% to the durability } return ToolHelper.setDuraOnQuality(stack, dura); } - + /** * Gets the colour for a layer - * @param base is default colour - * 0 is base - * 1 is haft - * 2 is detail + * + * @param base + * is default colour 0 is base 1 is haft 2 is detail */ - public static int getColourFromItemStack(ItemStack item, int layer, int base) - { - if(layer == 0) - { - CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); - if(material != null) - { - return material.getColourInt(); - } - } - if(layer == 1) - { - CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_haft); - if(material != null) - { - return material.getColourInt(); - } - } - return base; - } - - public static float getWeightModifier(ItemStack item, float base) - { + public static int getColourFromItemStack(ItemStack item, int layer, int base) { + if (layer == 0) { + CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); + if (material != null) { + return material.getColourInt(); + } + } + if (layer == 1) { + CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_haft); + if (material != null) { + return material.getColourInt(); + } + } + return base; + } + + public static float getWeightModifier(ItemStack item, float base) { CustomMaterial metal = getCustomPrimaryMaterial(item); CustomMaterial wood = getCustomSecondaryMaterial(item); - - if(metal != null) - { - base = (metal.density/2.5F) * base; - } - if(wood != null) - { - base += (wood.density/2.5F); - } + + if (metal != null) { + base = (metal.density / 2.5F) * base; + } + if (wood != null) { + base += (wood.density / 2.5F); + } return base; } - + /** * Gets the material modifier if it exists - * @param defaultModifier default if no material exists + * + * @param defaultModifier + * default if no material exists */ - public static float getMeleeDamage(ItemStack item, float defaultModifier) - { - CustomMaterial custom = getCustomPrimaryMaterial(item); - if(custom != null) - { - return custom.sharpness; - } - return defaultModifier; - } - public static float getBowDamage(ItemStack item, float defaultModifier) - { + public static float getMeleeDamage(ItemStack item, float defaultModifier) { + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + return custom.sharpness; + } + return defaultModifier; + } + + public static float getBowDamage(ItemStack item, float defaultModifier) { CustomMaterial base = getCustomSecondaryMaterial(item); CustomMaterial joints = getCustomPrimaryMaterial(item); - - if(base != null) - { - defaultModifier = base.flexibility; - } - if(joints != null) - { - defaultModifier *= joints.flexibility; - } + + if (base != null) { + defaultModifier = base.flexibility; + } + if (joints != null) { + defaultModifier *= joints.flexibility; + } return defaultModifier; } + /** * The total damage of a bow and arrow */ - public static float getBaseDamages(ItemStack item, float defaultModifier) - { + public static float getBaseDamages(ItemStack item, float defaultModifier) { CustomMaterial custom = getCustomPrimaryMaterial(item); - if(custom != null) - { - return getBaseDamage(custom.sharpness*custom.flexibility); - } + if (custom != null) { + return getBaseDamage(custom.sharpness * custom.flexibility); + } return getBaseDamage(defaultModifier); } + /** * The damage a bow and arrow should do (same as a sword) */ - public static float getBaseDamage(float modifier) - { + public static float getBaseDamage(float modifier) { return 4F + modifier; } - - public static float getEfficiencyForHds(ItemStack item, float value, float mod) - { - CustomMaterial custom = getCustomPrimaryMaterial(item); - if(custom != null) - { - value = 2.0F + (custom.hardness*4F);//Efficiency starts at 2 and each point of sharpness adds 2 - } - return ToolHelper.modifyDigOnQuality(item, value) * mod; - } - - public static float getEfficiency(ItemStack item, float value, float mod) - { - CustomMaterial custom = getCustomPrimaryMaterial(item); - if(custom != null) - { - value = 2.0F + (custom.sharpness*2F);//Efficiency starts at 2 and each point of sharpness adds 2 - } - return ToolHelper.modifyDigOnQuality(item, value) * mod; - } - - public static int getCrafterTier(ItemStack item, int value) - { - CustomMaterial custom = getCustomPrimaryMaterial(item); - if(custom != null) - { - return custom.crafterTier; - } - return value; - } - - public static int getHarvestLevel(ItemStack item, int value) - { - if(value <= 0) - { - return value;//If its not effective - } - - CustomMaterial custom = getCustomPrimaryMaterial(item); - if(custom != null) - { - if(custom.tier == 0)return 1; - if(custom.tier <= 2)return 2; - return Math.max(custom.tier, 2); - } - return value; - } - + + public static float getEfficiencyForHds(ItemStack item, float value, float mod) { + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + value = 2.0F + (custom.hardness * 4F);// Efficiency starts at 2 and each point of sharpness adds 2 + } + return ToolHelper.modifyDigOnQuality(item, value) * mod; + } + + public static float getEfficiency(ItemStack item, float value, float mod) { + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + value = 2.0F + (custom.sharpness * 2F);// Efficiency starts at 2 and each point of sharpness adds 2 + } + return ToolHelper.modifyDigOnQuality(item, value) * mod; + } + + public static int getCrafterTier(ItemStack item, int value) { + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + return custom.crafterTier; + } + return value; + } + + public static int getHarvestLevel(ItemStack item, int value) { + if (value <= 0) { + return value;// If its not effective + } + + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + if (custom.tier == 0) + return 1; + if (custom.tier <= 2) + return 2; + return Math.max(custom.tier, 2); + } + return value; + } + @SideOnly(Side.CLIENT) - public static void addInformation(ItemStack item, List list) - { + public static void addInformation(ItemStack item, List list) { CustomMaterial haft = getCustomSecondaryMaterial(item); - - if(materialOnTooltip()) - { + + if (materialOnTooltip()) { CustomMaterial main = getCustomPrimaryMaterial(item); - if(main != null) - { - String matName = StatCollector.translateToLocal(StatCollector.translateToLocal("material."+main.name.toLowerCase() + ".name")); - list.add(EnumChatFormatting.GOLD + matName); + if (main != null) { + String matName = StatCollector.translateToLocal( + StatCollector.translateToLocal("material." + main.name.toLowerCase() + ".name")); + list.add(EnumChatFormatting.GOLD + matName); } } - - if(haft != null) - { - String matName = StatCollector.translateToLocalFormatted("item.mod_haft.name", StatCollector.translateToLocal("material."+haft.name.toLowerCase() + ".name")); - list.add(EnumChatFormatting.GOLD + matName); - } - + + if (haft != null) { + String matName = StatCollector.translateToLocalFormatted("item.mod_haft.name", + StatCollector.translateToLocal("material." + haft.name.toLowerCase() + ".name")); + list.add(EnumChatFormatting.GOLD + matName); + } + } - + /** * Gets if the language puts tiers in the tooltip, leaving the name blank + * * @return */ - public static boolean materialOnTooltip() - { + public static boolean materialOnTooltip() { String cfg = StatCollector.translateToLocal("languagecfg.tooltiptier"); return cfg.equalsIgnoreCase("true"); } + @SideOnly(Side.CLIENT) - public static void addBowInformation(ItemStack item, List list) - { - + public static void addBowInformation(ItemStack item, List list) { + CustomMaterial metals = getCustomPrimaryMaterial(item); - if(metals != null) - { - String matName = StatCollector.translateToLocalFormatted("item.mod_joint.name", StatCollector.translateToLocal("material."+metals.name.toLowerCase() + ".name")); - list.add(EnumChatFormatting.GOLD + matName); - } - - } - - public static String getWoodenLocalisedName(ItemStack item, String unlocalName) - { - if(materialOnTooltip()) - { - StatCollector.translateToLocal(unlocalName); - } - + if (metals != null) { + String matName = StatCollector.translateToLocalFormatted("item.mod_joint.name", + StatCollector.translateToLocal("material." + metals.name.toLowerCase() + ".name")); + list.add(EnumChatFormatting.GOLD + matName); + } + + } + + public static String getWoodenLocalisedName(ItemStack item, String unlocalName) { + if (materialOnTooltip()) { + StatCollector.translateToLocal(unlocalName); + } + CustomMaterial base = getCustomSecondaryMaterial(item); String name = "any"; - if(base != null) - { - name = base.name.toLowerCase(); - } - return StatCollector.translateToLocalFormatted(unlocalName, StatCollector.translateToLocal("material."+name + ".name")); - } - - public static String getLocalisedName(ItemStack item, String unlocalName) - { - if(materialOnTooltip()) - { - StatCollector.translateToLocal(unlocalName); - } - + if (base != null) { + name = base.name.toLowerCase(); + } + return StatCollector.translateToLocalFormatted(unlocalName, + StatCollector.translateToLocal("material." + name + ".name")); + } + + public static String getLocalisedName(ItemStack item, String unlocalName) { + if (materialOnTooltip()) { + StatCollector.translateToLocal(unlocalName); + } + CustomMaterial base = getCustomPrimaryMaterial(item); String name = "any"; - if(base != null) - { - name = base.name.toLowerCase(); - } - return StatCollector.translateToLocalFormatted(unlocalName, StatCollector.translateToLocal("material."+name + ".name")); - } - public static boolean areEqual(ItemStack recipeItem, ItemStack inputItem) - { - if(recipeItem == null) - { + if (base != null) { + name = base.name.toLowerCase(); + } + return StatCollector.translateToLocalFormatted(unlocalName, + StatCollector.translateToLocal("material." + name + ".name")); + } + + public static boolean areEqual(ItemStack recipeItem, ItemStack inputItem) { + if (recipeItem == null) { return inputItem == null; } - if(inputItem == null)return false; - - return recipeItem.isItemEqual(inputItem) && doesMainMatchForRecipe(recipeItem, inputItem) && doesHaftMatchForRecipe(recipeItem, inputItem); + if (inputItem == null) + return false; + + return recipeItem.isItemEqual(inputItem) && doesMainMatchForRecipe(recipeItem, inputItem) + && doesHaftMatchForRecipe(recipeItem, inputItem); } + /** * Checks if two items' materials match */ - public static boolean doesMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) - { + public static boolean doesMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) { return doesMainMatchForRecipe(recipeItem, inputItem) && doesHaftMatchForRecipe(recipeItem, inputItem); } - public static boolean doesMainMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) - { + + public static boolean doesMainMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) { CustomMaterial recipeMat = CustomToolHelper.getCustomPrimaryMaterial(recipeItem); - CustomMaterial inputMat = CustomToolHelper.getCustomPrimaryMaterial(inputItem); - - if(recipeMat == null) - { - return true; - } - - if (inputMat == null && recipeMat != null) - { - return false; - } - if(recipeMat != inputMat) - { - return false; - } + CustomMaterial inputMat = CustomToolHelper.getCustomPrimaryMaterial(inputItem); + + if (recipeMat == null) { + return true; + } + + if (inputMat == null && recipeMat != null) { + return false; + } + if (recipeMat != inputMat) { + return false; + } return true; } - public static boolean doesHaftMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) - { + + public static boolean doesHaftMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) { CustomMaterial recipeMat = CustomToolHelper.getCustomSecondaryMaterial(recipeItem); - CustomMaterial inputMat = CustomToolHelper.getCustomSecondaryMaterial(inputItem); - - if(recipeMat == null) - { - return true; - } - - if (inputMat == null && recipeMat != null) - { - return false; - } - if(recipeMat != inputMat) - { - return false; - } + CustomMaterial inputMat = CustomToolHelper.getCustomSecondaryMaterial(inputItem); + + if (recipeMat == null) { + return true; + } + + if (inputMat == null && recipeMat != null) { + return false; + } + if (recipeMat != inputMat) { + return false; + } return true; } - public static void addComponentString(ItemStack tool, List list, CustomMaterial base) - { + + public static void addComponentString(ItemStack tool, List list, CustomMaterial base) { addComponentString(tool, list, base, 1); } - public static void addComponentString(ItemStack tool, List list, CustomMaterial base, float units) - { - if(base != null) - { - float mass = base.density * units; - list.add(EnumChatFormatting.GOLD + base.getMaterialString()); - if(mass > 0) - list.add(CustomMaterial.getWeightString(mass)); - - if(base.isHeatable()) - { - int maxTemp = base.getHeatableStats()[0]; - int beyondMax = base.getHeatableStats()[1]; - list.add(StatCollector.translateToLocalFormatted("materialtype.workable.name", maxTemp, beyondMax)); - } - } - } - public static float getBurnModifier(ItemStack fuel) - { + + public static void addComponentString(ItemStack tool, List list, CustomMaterial base, float units) { + if (base != null) { + float mass = base.density * units; + list.add(EnumChatFormatting.GOLD + base.getMaterialString()); + if (mass > 0) + list.add(CustomMaterial.getWeightString(mass)); + + if (base.isHeatable()) { + int maxTemp = base.getHeatableStats()[0]; + int beyondMax = base.getHeatableStats()[1]; + list.add(StatCollector.translateToLocalFormatted("materialtype.workable.name", maxTemp, beyondMax)); + } + } + } + + public static float getBurnModifier(ItemStack fuel) { CustomMaterial mat = CustomMaterial.getMaterialFor(fuel, slot_main); - if(mat != null && mat.type.equalsIgnoreCase("wood")) - { - return (2*mat.density) + 0.5F; + if (mat != null && mat.type.equalsIgnoreCase("wood")) { + return (2 * mat.density) + 0.5F; } return 1.0F; } - public static String getReferenceName(ItemStack item) - { + + public static String getReferenceName(ItemStack item) { String dam = "any"; int d = item.getItemDamage(); - if(d != OreDictionary.WILDCARD_VALUE) - { - dam = ""+d; + if (d != OreDictionary.WILDCARD_VALUE) { + dam = "" + d; } - + return getReferenceName(item, dam); } - - - public static String getReferenceName(ItemStack item, String dam) - { + + public static String getReferenceName(ItemStack item, String dam) { return getReferenceName(item, dam, true); } - public static String getReferenceName(ItemStack item, String dam, boolean tiered) - { + + public static String getReferenceName(ItemStack item, String dam, boolean tiered) { String reference = getSimpleReferenceName(item.getItem(), dam); - - if(tiered) - { + + if (tiered) { CustomMaterial base = getCustomPrimaryMaterial(item); CustomMaterial haft = getCustomSecondaryMaterial(item); - - if(base != null) - { - reference += "_"+base.name.toLowerCase(); + + if (base != null) { + reference += "_" + base.name.toLowerCase(); } - if(haft != null) - { - reference += "_"+haft.name.toLowerCase(); + if (haft != null) { + reference += "_" + haft.name.toLowerCase(); } } - + return reference; } - public static String getSimpleReferenceName(Item item, String dam) - { + + public static String getSimpleReferenceName(Item item, String dam) { String reference = Item.itemRegistry.getNameForObject(item).toLowerCase() + "_@" + dam; return reference; } - - public static String getSimpleReferenceName(Item item) - { + + public static String getSimpleReferenceName(Item item) { return getSimpleReferenceName(item, "any"); } - - public static boolean areToolsSame(ItemStack item1, ItemStack item2) - { + + public static boolean areToolsSame(ItemStack item1, ItemStack item2) { CustomMaterial main1 = getCustomPrimaryMaterial(item1); CustomMaterial main2 = getCustomSecondaryMaterial(item2); CustomMaterial haft1 = getCustomPrimaryMaterial(item1); CustomMaterial haft2 = getCustomSecondaryMaterial(item2); - if((main1 == null && main2 != null) || (main2 == null && main1 != null))return false; - if((haft1 == null && haft2 != null) || (haft2 == null && haft1 != null))return false; - - if(main1 != null && main2 != null && main1 != main2)return false; - if(haft1 != null && haft2 != null && haft1 != haft2)return false; - + if ((main1 == null && main2 != null) || (main2 == null && main1 != null)) + return false; + if ((haft1 == null && haft2 != null) || (haft2 == null && haft1 != null)) + return false; + + if (main1 != null && main2 != null && main1 != main2) + return false; + if (haft1 != null && haft2 != null && haft1 != haft2) + return false; + return true; } - public static boolean isMythic(ItemStack result) - { + + public static boolean isMythic(ItemStack result) { CustomMaterial main1 = getCustomPrimaryMaterial(result); CustomMaterial haft1 = getCustomPrimaryMaterial(result); - if(main1 != null && main1.isUnbrekable()) - { - return true; - } - if(haft1 != null && haft1.isUnbrekable()) - { - return true; - } + if (main1 != null && main1.isUnbrekable()) { + return true; + } + if (haft1 != null && haft1.isUnbrekable()) { + return true; + } return false; } - public static void writeToPacket(ByteBuf packet, ItemStack stack) - { + + public static void writeToPacket(ByteBuf packet, ItemStack stack) { packet.writeInt(stack != null ? Item.getIdFromItem(stack.getItem()) : 0); packet.writeInt(stack != null ? stack.stackSize : 0); packet.writeInt(stack != null ? stack.getItemDamage() : 0); - packet.writeInt( (stack != null && stack.isItemEnchanted()) ? 1 : 0); - + packet.writeInt((stack != null && stack.isItemEnchanted()) ? 1 : 0); + CustomMaterial main1 = getCustomPrimaryMaterial(stack); CustomMaterial haft1 = getCustomSecondaryMaterial(stack); - + ByteBufUtils.writeUTF8String(packet, main1 != null ? main1.name : "null"); ByteBufUtils.writeUTF8String(packet, haft1 != null ? haft1.name : "null"); } - public static ItemStack readFromPacket(ByteBuf packet) - { + + public static ItemStack readFromPacket(ByteBuf packet) { int id = packet.readInt(); int ss = packet.readInt(); int md = packet.readInt(); @@ -523,78 +479,66 @@ public static ItemStack readFromPacket(ByteBuf packet) String main1 = ByteBufUtils.readUTF8String(packet); String haft1 = ByteBufUtils.readUTF8String(packet); Item item = Item.getItemById(id); - - if(item != null && ss > 0) - { + + if (item != null && ss > 0) { ItemStack stack = new ItemStack(item, ss, md); - if(!main1.equalsIgnoreCase("null")) - { + if (!main1.equalsIgnoreCase("null")) { CustomMaterial.addMaterial(stack, slot_main, main1); } - if(!haft1.equalsIgnoreCase("null")) - { + if (!haft1.equalsIgnoreCase("null")) { CustomMaterial.addMaterial(stack, slot_haft, haft1); } return stack; } - + return null; } - - public static String getComponentMaterial(ItemStack item, String type) - { - if(item == null || type == null) return null; - - if(item.getItem() instanceof ItemHeated) - { + + public static String getComponentMaterial(ItemStack item, String type) { + if (item == null || type == null) + return null; + + if (item.getItem() instanceof ItemHeated) { return getComponentMaterial(ItemHeated.getItem(item), type); } - + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if(material != null) - { + if (material != null) { return material.type.equalsIgnoreCase(type) ? material.name : null; } return null; } - public static boolean hasAnyMaterial(ItemStack item) - { + + public static boolean hasAnyMaterial(ItemStack item) { return getCustomPrimaryMaterial(item) != null || getCustomSecondaryMaterial(item) != null; } - public static ItemStack tryDeconstruct(ItemStack newitem, ItemStack mainItem) - { + + public static ItemStack tryDeconstruct(ItemStack newitem, ItemStack mainItem) { String type = null; - if(newitem != null && newitem.getItem() instanceof ITieredComponent) - { - type = ((ITieredComponent)newitem.getItem()).getMaterialType(newitem); + if (newitem != null && newitem.getItem() instanceof ITieredComponent) { + type = ((ITieredComponent) newitem.getItem()).getMaterialType(newitem); } - - if(type != null) - { + + if (type != null) { CustomMaterial primary = CustomToolHelper.getCustomPrimaryMaterial(mainItem); CustomMaterial secondary = CustomToolHelper.getCustomSecondaryMaterial(mainItem); - - if(primary != null && primary.type.equalsIgnoreCase(type)) - { + + if (primary != null && primary.type.equalsIgnoreCase(type)) { CustomMaterial.addMaterial(newitem, slot_main, primary.name); - } - else - { - if(secondary != null && secondary.type.equalsIgnoreCase(type)) - { + } else { + if (secondary != null && secondary.type.equalsIgnoreCase(type)) { CustomMaterial.addMaterial(newitem, slot_main, secondary.name); } } } return newitem; } - public static String getCustomStyle(ItemStack weapon) - { - if(weapon != null && weapon.getItem() instanceof ISpecialDesign) - { - return ((ISpecialDesign)weapon.getItem()).getDesign(weapon); + + public static String getCustomStyle(ItemStack weapon) { + if (weapon != null && weapon.getItem() instanceof ISpecialDesign) { + return ((ISpecialDesign) weapon.getItem()).getDesign(weapon); } return null; } - + } diff --git a/src/main/java/minefantasy/mf2/api/helpers/EntityHelper.java b/src/main/java/minefantasy/mf2/api/helpers/EntityHelper.java index 04ac7a2b..f7ac6632 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/EntityHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/EntityHelper.java @@ -3,22 +3,18 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; -public class EntityHelper -{ - public static final String MFNBT = "MineFantasy_KeptNBT"; +public class EntityHelper { + public static final String MFNBT = "MineFantasy_KeptNBT"; - public static NBTTagCompound getMFNBT(EntityPlayer player) - { - if(!player.getEntityData().hasKey(MFNBT)) - { + public static NBTTagCompound getMFNBT(EntityPlayer player) { + if (!player.getEntityData().hasKey(MFNBT)) { player.getEntityData().setTag(MFNBT, new NBTTagCompound()); } return player.getEntityData().getCompoundTag(MFNBT); } - public static void cloneNBT(EntityPlayer origin, EntityPlayer spawn) - { - if(origin.getEntityData().hasKey(MFNBT)) - { + + public static void cloneNBT(EntityPlayer origin, EntityPlayer spawn) { + if (origin.getEntityData().hasKey(MFNBT)) { spawn.getEntityData().setTag(MFNBT, origin.getEntityData().getTag(MFNBT).copy()); } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/Functions.java b/src/main/java/minefantasy/mf2/api/helpers/Functions.java index 8e741a60..5b09ce05 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/Functions.java +++ b/src/main/java/minefantasy/mf2/api/helpers/Functions.java @@ -1,31 +1,39 @@ package minefantasy.mf2.api.helpers; -public class Functions -{ +public class Functions { /** - * f(x) = cos(xPi/(f/2))*(m/2) + (m/2) + c - * Create a wave output from c to m and back between x=f - * @param x the running variable - * @param p period: time between waves (in 20ths of seconds) - * @param a amplitude: the max point at f/2 - * @param c constant: the min point at f==0 + * f(x) = cos(xPi/(f/2))*(m/2) + (m/2) + c Create a wave output from c to m and + * back between x=f + * + * @param x + * the running variable + * @param p + * period: time between waves (in 20ths of seconds) + * @param a + * amplitude: the max point at f/2 + * @param c + * constant: the min point at f==0 */ - public static int getIntervalWave1_i(int x, int p, int a, int c) - { - double fx = Math.cos(x*Math.PI/ (p/2)) * ((a-c)/2) + ((a-c)/2) + c; - return (int)fx; + public static int getIntervalWave1_i(int x, int p, int a, int c) { + double fx = Math.cos(x * Math.PI / (p / 2)) * ((a - c) / 2) + ((a - c) / 2) + c; + return (int) fx; } + /** - * f(x) = cos(xPi/(f/2))*(m/2) + (m/2) + c - * Create a wave output from c to m and back between x=f - * @param x the running variable - * @param p period: time between waves (in 20ths of seconds) - * @param a amplitude: the max point at f/2 - * @param c constant: the min point at f==0 + * f(x) = cos(xPi/(f/2))*(m/2) + (m/2) + c Create a wave output from c to m and + * back between x=f + * + * @param x + * the running variable + * @param p + * period: time between waves (in 20ths of seconds) + * @param a + * amplitude: the max point at f/2 + * @param c + * constant: the min point at f==0 */ - public static double getIntervalWave1_d(double x, double p, double a, double c) - { - double fx = Math.cos(x*Math.PI/ (p/2)) * ((a-c)/2) + ((a-c)/2) + c; + public static double getIntervalWave1_d(double x, double p, double a, double c) { + double fx = Math.cos(x * Math.PI / (p / 2)) * ((a - c) / 2) + ((a - c) / 2) + c; return fx; } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/GuiHelper.java b/src/main/java/minefantasy/mf2/api/helpers/GuiHelper.java index 05f4bab6..534e2f09 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/GuiHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/GuiHelper.java @@ -2,90 +2,76 @@ import org.lwjgl.opengl.GL11; -import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; -public class GuiHelper -{ +public class GuiHelper { private static final Minecraft mc = Minecraft.getMinecraft(); - public static void renderToolIcon(Gui screen, String toolType, int tier, int x, int y, boolean available) - { + + public static void renderToolIcon(Gui screen, String toolType, int tier, int x, int y, boolean available) { renderToolIcon(screen, toolType, tier, x, y, false, available); } - public static void renderToolIcon(Gui screen, String toolType, int tier, int x, int y, boolean outline, boolean available) - { - if(!available) - { + + public static void renderToolIcon(Gui screen, String toolType, int tier, int x, int y, boolean outline, + boolean available) { + if (!available) { GL11.glColor3f(1.0F, 0.3F, 0.3F); } mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/icons.png")); - int[] icon = getToolTypeIcon(toolType); - screen.drawTexturedModalRect(x, y, outline ? 20 : 0, 0, 20, 20); - screen.drawTexturedModalRect(x, y, icon[0], icon[1]+20, 20, 20); - if(tier > -1) - mc.fontRenderer.drawStringWithShadow(""+tier, x + 4, y + 10, 16777215); - GL11.glColor3f(1F, 1F, 1F); + int[] icon = getToolTypeIcon(toolType); + screen.drawTexturedModalRect(x, y, outline ? 20 : 0, 0, 20, 20); + screen.drawTexturedModalRect(x, y, icon[0], icon[1] + 20, 20, 20); + if (tier > -1) + mc.fontRenderer.drawStringWithShadow("" + tier, x + 4, y + 10, 16777215); + GL11.glColor3f(1F, 1F, 1F); } - public static int[] getToolTypeIcon(String s) - { + + public static int[] getToolTypeIcon(String s) { int width = 20; int height = 20; - if(s.equalsIgnoreCase("hands")) - { - return new int[]{0, 0}; + if (s.equalsIgnoreCase("hands")) { + return new int[] { 0, 0 }; } - if(s.equalsIgnoreCase("knife")) - { - return new int[]{width*1, height*0}; + if (s.equalsIgnoreCase("knife")) { + return new int[] { width * 1, height * 0 }; } - if(s.equalsIgnoreCase("saw")) - { - return new int[]{width*2, height*0}; + if (s.equalsIgnoreCase("saw")) { + return new int[] { width * 2, height * 0 }; } - if(s.equalsIgnoreCase("mallet")) - { - return new int[]{width*3, height*0}; + if (s.equalsIgnoreCase("mallet")) { + return new int[] { width * 3, height * 0 }; } - if(s.equalsIgnoreCase("needle")) - { - return new int[]{width*4, height*0}; + if (s.equalsIgnoreCase("needle")) { + return new int[] { width * 4, height * 0 }; } - if(s.equalsIgnoreCase("hammer")) - { - return new int[]{width*5, height*0}; + if (s.equalsIgnoreCase("hammer")) { + return new int[] { width * 5, height * 0 }; } - if(s.equalsIgnoreCase("hvyHammer")) - { - return new int[]{width*6, height*0}; + if (s.equalsIgnoreCase("hvyHammer")) { + return new int[] { width * 6, height * 0 }; } - if(s.equalsIgnoreCase("spoon")) - { - return new int[]{width*7, height*0}; + if (s.equalsIgnoreCase("spoon")) { + return new int[] { width * 7, height * 0 }; } - if(s.equalsIgnoreCase("shears")) - { - return new int[]{width*8, height*0}; + if (s.equalsIgnoreCase("shears")) { + return new int[] { width * 8, height * 0 }; } - if(s.equalsIgnoreCase("spanner")) - { - return new int[]{width*9, height*0}; + if (s.equalsIgnoreCase("spanner")) { + return new int[] { width * 9, height * 0 }; } - if(s.equalsIgnoreCase("brush")) - { - return new int[]{width*11, height*0}; + if (s.equalsIgnoreCase("brush")) { + return new int[] { width * 11, height * 0 }; } - - if(s.equalsIgnoreCase("anvil")) - { - return new int[]{0, height*2}; + + if (s.equalsIgnoreCase("anvil")) { + return new int[] { 0, height * 2 }; } - if(s.equalsIgnoreCase("carpenter")) - { - return new int[]{width*1, height*2}; + if (s.equalsIgnoreCase("carpenter")) { + return new int[] { width * 1, height * 2 }; } - return new int[]{0, 0}; + return new int[] { 0, 0 }; } + public static int getColourForRGB(int red, int green, int blue) { return (red << 16) + (green << 8) + blue; } diff --git a/src/main/java/minefantasy/mf2/api/helpers/PlayerTagData.java b/src/main/java/minefantasy/mf2/api/helpers/PlayerTagData.java index 4b247317..70f7bc5b 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/PlayerTagData.java +++ b/src/main/java/minefantasy/mf2/api/helpers/PlayerTagData.java @@ -3,30 +3,25 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; -public class PlayerTagData -{ +public class PlayerTagData { /** * Saves a custom integer */ - public static void setPersistedVariable(EntityPlayer user, String name, int lvl) - { + public static void setPersistedVariable(EntityPlayer user, String name, int lvl) { NBTTagCompound nbt = getPersistedData(user); nbt.setInteger(name, lvl); } + /** * Gets a custom integer saved */ - public static int getPersistedVariable(EntityPlayer user, String name) - { + public static int getPersistedVariable(EntityPlayer user, String name) { NBTTagCompound nbt = getPersistedData(user); return nbt.hasKey(name) ? nbt.getInteger(name) : 0; } - - - public static NBTTagCompound getPersistedData(EntityPlayer user) - { - if(!user.getEntityData().hasKey(EntityPlayer.PERSISTED_NBT_TAG)) - { + + public static NBTTagCompound getPersistedData(EntityPlayer user) { + if (!user.getEntityData().hasKey(EntityPlayer.PERSISTED_NBT_TAG)) { user.getEntityData().setTag(EntityPlayer.PERSISTED_NBT_TAG, new NBTTagCompound()); } return (NBTTagCompound) (user.getEntityData().getTag(EntityPlayer.PERSISTED_NBT_TAG)); diff --git a/src/main/java/minefantasy/mf2/api/helpers/PowerArmour.java b/src/main/java/minefantasy/mf2/api/helpers/PowerArmour.java index 8ad779f0..7478fb67 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/PowerArmour.java +++ b/src/main/java/minefantasy/mf2/api/helpers/PowerArmour.java @@ -10,82 +10,80 @@ import net.minecraft.util.DamageSource; import net.minecraft.world.World; -public class PowerArmour -{ - public static boolean isWearingCogwork(EntityLivingBase user) - { +public class PowerArmour { + public static boolean isWearingCogwork(EntityLivingBase user) { return user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour; } - public static boolean isPowered(EntityLivingBase user) - { - if(user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour) - { - return ((IPowerArmour)user.ridingEntity).isPowered(); + + public static boolean isPowered(EntityLivingBase user) { + if (user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour) { + return ((IPowerArmour) user.ridingEntity).isPowered(); } return false; } - public static boolean isFullyArmoured(EntityLivingBase user) - { - if(user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour) - { - return ((IPowerArmour)user.ridingEntity).isFullyArmoured(); + + public static boolean isFullyArmoured(EntityLivingBase user) { + if (user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour) { + return ((IPowerArmour) user.ridingEntity).isFullyArmoured(); } return false; } - public static float modifyDamage(EntityLivingBase user, float dam, DamageSource src) - { - if(user.ridingEntity != null) - { - if(user.ridingEntity instanceof IPowerArmour) - { - return ((IPowerArmour)user.ridingEntity).modifyDamage(user, dam, src); + + public static float modifyDamage(EntityLivingBase user, float dam, DamageSource src) { + if (user.ridingEntity != null) { + if (user.ridingEntity instanceof IPowerArmour) { + return ((IPowerArmour) user.ridingEntity).modifyDamage(user, dam, src); } } return dam; } - public static boolean allowDamageToBlock(DamageSource src) - { - if(src == DamageSource.starve || src == DamageSource.outOfWorld || src == DamageSource.drown) - { + + public static boolean allowDamageToBlock(DamageSource src) { + if (src == DamageSource.starve || src == DamageSource.outOfWorld || src == DamageSource.drown) { return false; } return true; } - public static float getFuelValue(ItemStack item) - { + + public static float getFuelValue(ItemStack item) { ForgeFuel stats = ForgeItemHandler.getStats(item); - if(stats != null && stats.isRefined) - { + if (stats != null && stats.isRefined) { return stats.duration; } return 0; } - public static boolean isStationBlock(World world, int x, int y, int z) - { + + public static boolean isStationBlock(World world, int x, int y, int z) { Block block = world.getBlock(x, y, z); - return isBasicStationFrame(world, x, y, z) && block instanceof BlockFrame && ((BlockFrame)block).isCogworkHolder; + return isBasicStationFrame(world, x, y, z) && block instanceof BlockFrame + && ((BlockFrame) block).isCogworkHolder; } - public static boolean isBasicStationFrame(World world, int x, int y, int z) - { - if(!(world.getBlock(x, y, z) instanceof BlockFrame)) - { + + public static boolean isBasicStationFrame(World world, int x, int y, int z) { + if (!(world.getBlock(x, y, z) instanceof BlockFrame)) { return false; } int shafts = 0; - - if(isShaft(world, x+1, y, z)){++shafts;} - if(isShaft(world, x-1, y, z)){++shafts;} - if(isShaft(world, x, y, z+1)){++shafts;} - if(isShaft(world, x, y, z-1)){++shafts;} - + + if (isShaft(world, x + 1, y, z)) { + ++shafts; + } + if (isShaft(world, x - 1, y, z)) { + ++shafts; + } + if (isShaft(world, x, y, z + 1)) { + ++shafts; + } + if (isShaft(world, x, y, z - 1)) { + ++shafts; + } + return shafts == 3; } - public static boolean isShaft(World world, int x, int y, int z) - { - for(int y2 = 0; y2 < 4; y2 ++) - { - if(! (world.getBlock(x, y, z) instanceof BlockFrame)) - { + + public static boolean isShaft(World world, int x, int y, int z) { + for (int y2 = 0; y2 < 4; y2++) { + if (!(world.getBlock(x, y, z) instanceof BlockFrame)) { return false; } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/RenderHelper.java b/src/main/java/minefantasy/mf2/api/helpers/RenderHelper.java index 1f605720..c620d54a 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/RenderHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/RenderHelper.java @@ -1,40 +1,32 @@ package minefantasy.mf2.api.helpers; import java.util.List; -import java.util.Random; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.settings.KeyBinding; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.GL11; -public final class RenderHelper -{ +public final class RenderHelper { - public static void renderTooltip(int x, int y, List tooltipData) - { + public static void renderTooltip(int x, int y, List tooltipData) { int color = 0x505000ff; int color2 = 0xf0100010; renderTooltip(x, y, tooltipData, color, color2); } - public static void renderTooltipOrange(int x, int y, List tooltipData) - { + public static void renderTooltipOrange(int x, int y, List tooltipData) { int color = 0x50a06600; int color2 = 0xf01e1200; renderTooltip(x, y, tooltipData, color, color2); } - public static void renderTooltipGreen(int x, int y, List tooltipData) - { + public static void renderTooltipGreen(int x, int y, List tooltipData) { int color = 0x5000a000; int color2 = 0xf0001e00; @@ -43,7 +35,7 @@ public static void renderTooltipGreen(int x, int y, List tooltipData) public static void renderTooltip(int x, int y, List tooltipData, int colour, int color2) { boolean lighting = GL11.glGetBoolean(GL11.GL_LIGHTING); - if(lighting) + if (lighting) net.minecraft.client.renderer.RenderHelper.disableStandardItemLighting(); if (!tooltipData.isEmpty()) { @@ -83,7 +75,7 @@ public static void renderTooltip(int x, int y, List tooltipData, int col } GL11.glEnable(GL11.GL_DEPTH_TEST); } - if(!lighting) + if (!lighting) net.minecraft.client.renderer.RenderHelper.disableStandardItemLighting(); GL11.glColor4f(1F, 1F, 1F, 1F); } @@ -121,7 +113,8 @@ public static void drawTexturedModalRect(int par1, int par2, float z, int par3, drawTexturedModalRect(par1, par2, z, par3, par4, par5, par6, 0.00390625F, 0.00390625F); } - public static void drawTexturedModalRect(int par1, int par2, float z, int par3, int par4, int par5, int par6, float f, float f1) { + public static void drawTexturedModalRect(int par1, int par2, float z, int par3, int par4, int par5, int par6, + float f, float f1) { Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); tessellator.addVertexWithUV(par1 + 0, par2 + par6, z, (par3 + 0) * f, (par4 + par6) * f1); @@ -134,8 +127,8 @@ public static void drawTexturedModalRect(int par1, int par2, float z, int par3, public static String getKeyDisplayString(String keyName) { String key = null; KeyBinding[] keys = Minecraft.getMinecraft().gameSettings.keyBindings; - for(KeyBinding otherKey : keys) - if(otherKey.getKeyDescription().equals(keyName)) { + for (KeyBinding otherKey : keys) + if (otherKey.getKeyDescription().equals(keyName)) { key = Keyboard.getKeyName(otherKey.getKeyCode()); break; } diff --git a/src/main/java/minefantasy/mf2/api/helpers/TacticalManager.java b/src/main/java/minefantasy/mf2/api/helpers/TacticalManager.java index 20f1dfee..8f276a22 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/TacticalManager.java +++ b/src/main/java/minefantasy/mf2/api/helpers/TacticalManager.java @@ -24,531 +24,495 @@ import net.minecraft.util.MathHelper; /** - * This calculates different tactical contexts for combat like flanking and blocking + * This calculates different tactical contexts for combat like flanking and + * blocking */ -public class TacticalManager -{ +public class TacticalManager { private static Random rand = new Random(); public static boolean shouldSlow = true; public static float minWeightSpeed = 10F; public static float arrowDeflectChance = 1.0F; - + /** * Determines if you cant block with no stamina */ - public static boolean shouldStaminaBlock = false; + public static boolean shouldStaminaBlock = false; + /** * Determines if the defender is hit in the front (180degree arc) - * @param attacker the attacker - * @param defender the defender + * + * @param attacker + * the attacker + * @param defender + * the defender * @return true if the hit is on the front */ - public static boolean canBlock(Entity attacker, EntityLivingBase defender) - { + public static boolean canBlock(Entity attacker, EntityLivingBase defender) { return canBlock(attacker, defender, 180); } + /** * Determines if the defender is hit in the front with a custom arc - * @param attacker the attacker - * @param defender the defender - * @param arc the arc that can be blocked + * + * @param attacker + * the attacker + * @param defender + * the defender + * @param arc + * the arc that can be blocked * @return true if the hit is on the front */ - public static boolean canBlock(Entity attacker, EntityLivingBase defender, float blockAngle) - { - if(attacker == null || defender == null)return false; - + public static boolean canBlock(Entity attacker, EntityLivingBase defender, float blockAngle) { + if (attacker == null || defender == null) + return false; + float yaw = calculateHitAngle(attacker, defender); - - return yaw < blockAngle && yaw > -blockAngle; + + return yaw < blockAngle && yaw > -blockAngle; } - + /** * Determines if an entity is flanking another - * @param source the source of the attack - * @param attacker the attacking entity - * @param defender the entity on view is questioned - * @param angle the angle the defender is flanked by - * @return true if the attacker hit within the back of defender between the angle + * + * @param source + * the source of the attack + * @param attacker + * the attacking entity + * @param defender + * the entity on view is questioned + * @param angle + * the angle the defender is flanked by + * @return true if the attacker hit within the back of defender between the + * angle */ - public static boolean isFlankedBy(Entity attacker, EntityLivingBase defender, float angle) - { + public static boolean isFlankedBy(Entity attacker, EntityLivingBase defender, float angle) { float yaw = calculateHitAngle(attacker, defender); - float blockAngle = (360-angle)/2; - - return !(yaw < blockAngle && yaw > -blockAngle);//Flanking is like reverse block + float blockAngle = (360 - angle) / 2; + + return !(yaw < blockAngle && yaw > -blockAngle);// Flanking is like reverse block } - - public static boolean canParry(DamageSource source, EntityLivingBase user, Entity entityHitting, ItemStack weapon) - { + + public static boolean canParry(DamageSource source, EntityLivingBase user, Entity entityHitting, ItemStack weapon) { boolean autoParry = false; - if(shouldStaminaBlock && StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) && !StaminaBar.isAnyStamina(user, false)) - { + if (shouldStaminaBlock && StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) + && !StaminaBar.isAnyStamina(user, false)) { return false; } - if(user.getHeldItem() != null && !canWeaponBlock(user.getHeldItem())) - { + if (user.getHeldItem() != null && !canWeaponBlock(user.getHeldItem())) { return false; } - if(user instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer)user; + if (user instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) user; autoParry = ResearchLogic.hasInfoUnlocked(player, "autoparry") && !player.isBlocking(); - - if(!player.isBlocking() && !autoParry) - { + + if (!player.isBlocking() && !autoParry) { return false; } - } - else - { - if(!isMobBlocking(user) && didParrySucceed(user, source)) - { + } else { + if (!isMobBlocking(user) && didParrySucceed(user, source)) { return false; } } - - if(!CombatMechanics.isParryAvailable(user)) - { + + if (!CombatMechanics.isParryAvailable(user)) { return false; } int confusion = 0; - if(user.getActivePotionEffect(Potion.confusion) != null) - { - confusion = user.getActivePotionEffect(Potion.confusion).getAmplifier() +1; + if (user.getActivePotionEffect(Potion.confusion) != null) { + confusion = user.getActivePotionEffect(Potion.confusion).getAmplifier() + 1; } - float arc = 20;//DEFAULT - - if(weapon != null && weapon.getItem() instanceof IParryable) - { - IParryable parry = (IParryable)weapon.getItem(); - if(!parry.canUserParry(user)) - { + float arc = 20;// DEFAULT + + if (weapon != null && weapon.getItem() instanceof IParryable) { + IParryable parry = (IParryable) weapon.getItem(); + if (!parry.canUserParry(user)) { return false; } arc = parry.getParryAngle(source, user, weapon); - - if(!parry.canParry(source, user, weapon)) - { + + if (!parry.canParry(source, user, weapon)) { return false; } } - if(source.isProjectile()) - { + if (source.isProjectile()) { arc *= 0.75F; } - + arc *= getHighgroundModifier(user, entityHitting, 1.5F); - arc = ArmourCalculator.adjustACForDamage(source, arc, 1.0F, 1.0F, 0.5F);//Harder to block piercing - if(autoParry) - { + arc = ArmourCalculator.adjustACForDamage(source, arc, 1.0F, 1.0F, 0.5F);// Harder to block piercing + if (autoParry) { arc *= 0.5F; } arc *= ArmourCalculator.getParryModifier(user); - if(confusion > 0 && rand.nextInt(confusion+1) != 0) - { + if (confusion > 0 && rand.nextInt(confusion + 1) != 0) { return false; } return arc > 0 && canBlock(entityHitting, user, arc); } - private static boolean canWeaponBlock(ItemStack item) - { + + private static boolean canWeaponBlock(ItemStack item) { return item.getItem() instanceof ItemSword || item.getItem() instanceof IParryable; } - private static boolean isMobBlocking(EntityLivingBase user) - { - if(!user.isImmuneToFire() && user.isBurning()) - { - return false;//If burning and can't take the heat.. can't block! + + private static boolean isMobBlocking(EntityLivingBase user) { + if (!user.isImmuneToFire() && user.isBurning()) { + return false;// If burning and can't take the heat.. can't block! } - if(user.getHeldItem() != null) - { + if (user.getHeldItem() != null) { return user.getHeldItem().getItem().getItemUseAction(user.getHeldItem()) == EnumAction.block; } return false; } - private static boolean didParrySucceed(EntityLivingBase user, DamageSource source) - { - if(user instanceof ISpecialCombatMob) - { - return ((ISpecialCombatMob)user).canParry(source); + + private static boolean didParrySucceed(EntityLivingBase user, DamageSource source) { + if (user instanceof ISpecialCombatMob) { + return ((ISpecialCombatMob) user).canParry(source); } return rand.nextInt(5) != 0; } - - public static float getHighgroundModifier(Entity target, Entity hitter, float value) - { - if(target == null || hitter == null) - { + + public static float getHighgroundModifier(Entity target, Entity hitter, float value) { + if (target == null || hitter == null) { return 1.0F; } float gap = 0.5F; - if(target.posY > hitter.posY + gap)//Blocker on high ground + if (target.posY > hitter.posY + gap)// Blocker on high ground { - return 1.0F * value; + return 1.0F * value; } - if(target.posY < hitter.posY - gap)//Attacker on high ground + if (target.posY < hitter.posY - gap)// Attacker on high ground { return 1.0F / value; } return 1.0F; } + /** * Knocks the target back from the source - * @param target the enemy to be knocked back - * @param source the source of the knockback - * @param power the power a - pulls - * @param height the height they jump + * + * @param target + * the enemy to be knocked back + * @param source + * the source of the knockback + * @param power + * the power a - pulls + * @param height + * the height they jump */ - public static void knockbackEntity(Entity target, Entity source, float power, float height) - { - target.addVelocity(-MathHelper.sin(source.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F, height, MathHelper.cos(source.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F); - } - + public static void knockbackEntity(Entity target, Entity source, float power, float height) { + target.addVelocity(-MathHelper.sin(source.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F, height, + MathHelper.cos(source.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F); + } + /** * Causes the attacker to fly towards the target - * @param attacker the entity that moves - * @param target the target attacker aims for - * @param power the forward momentum - * @param height the height of the jump + * + * @param attacker + * the entity that moves + * @param target + * the target attacker aims for + * @param power + * the forward momentum + * @param height + * the height of the jump */ - public static void lungeEntity(Entity attacker, Entity target, float power, float height) - { - attacker.addVelocity(-MathHelper.sin(attacker.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F, height, MathHelper.cos(attacker.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F); - } - - public static boolean isRanged(DamageSource source) - { - if(source == null) - { + public static void lungeEntity(Entity attacker, Entity target, float power, float height) { + attacker.addVelocity(-MathHelper.sin(attacker.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F, height, + MathHelper.cos(attacker.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F); + } + + public static boolean isRanged(DamageSource source) { + if (source == null) { return false; } - if(source.isProjectile() || source instanceof EntityDamageSourceIndirect) - { + if (source.isProjectile() || source instanceof EntityDamageSourceIndirect) { return true; } - if(source.getEntity() != null && source.getSourceOfDamage() != null) - { + if (source.getEntity() != null && source.getSourceOfDamage() != null) { return source.getEntity() != source.getSourceOfDamage(); } return false; } - + /** * This gets the angle that "attacker" hit "defender" relating 0 to front - * @param attacker the entity that hit defender - * @param defender the hit entity in question + * + * @param attacker + * the entity that hit defender + * @param defender + * the hit entity in question * @return the angle defender was hit (0 = front) */ - private static float calculateHitAngle(Entity attacker, EntityLivingBase defender) - { - if(attacker == null) - { + private static float calculateHitAngle(Entity attacker, EntityLivingBase defender) { + if (attacker == null) { return 0F; } double xGap = attacker.posX - defender.posX; - double zGap; - - for (zGap = attacker.posZ - defender.posZ; xGap * xGap + zGap * zGap < 1.0E-4D; zGap = (Math.random() - Math.random()) * 0.01D) - { - xGap = (Math.random() - Math.random()) * 0.01D; //makes the zgap - } - - float yaw = (float)(Math.atan2(zGap, xGap) * 180.0D / Math.PI) - defender.rotationYaw; - yaw = yaw - 90; - - - //CONVERTS THE ANGLES - while(yaw < -180) - { - yaw += 360; - } - while(yaw >= 180) - { - yaw -= 360; - } - - return yaw; + double zGap; + + for (zGap = attacker.posZ - defender.posZ; xGap * xGap + + zGap * zGap < 1.0E-4D; zGap = (Math.random() - Math.random()) * 0.01D) { + xGap = (Math.random() - Math.random()) * 0.01D; // makes the zgap + } + + float yaw = (float) (Math.atan2(zGap, xGap) * 180.0D / Math.PI) - defender.rotationYaw; + yaw = yaw - 90; + + // CONVERTS THE ANGLES + while (yaw < -180) { + yaw += 360; + } + while (yaw >= 180) { + yaw -= 360; + } + + return yaw; } - + /** * Modifies the movement of an entity based on armour */ - public static void applyArmourWeight(EntityLivingBase entityLiving) - { - if(entityLiving instanceof EntityPlayer && ((EntityPlayer)entityLiving).capabilities.isCreativeMode) - { + public static void applyArmourWeight(EntityLivingBase entityLiving) { + if (entityLiving instanceof EntityPlayer && ((EntityPlayer) entityLiving).capabilities.isCreativeMode) { return; } - //Default speed is 100% + // Default speed is 100% float totalSpeed = 100F; - - if(shouldSlow && !isImmuneToWeight(entityLiving)) - { - + + if (shouldSlow && !isImmuneToWeight(entityLiving)) { + totalSpeed += ArmourCalculator.getSpeedModForWeight(entityLiving); - //Limit the slowest speed to 1% - if(totalSpeed <= minWeightSpeed) - { + // Limit the slowest speed to 1% + if (totalSpeed <= minWeightSpeed) { totalSpeed = minWeightSpeed; } } - //apply speed mod - if(totalSpeed != 100F && entityLiving.onGround) - { - entityLiving.motionX *= (totalSpeed/100F); - entityLiving.motionZ *= (totalSpeed/100F); + // apply speed mod + if (totalSpeed != 100F && entityLiving.onGround) { + entityLiving.motionX *= (totalSpeed / 100F); + entityLiving.motionZ *= (totalSpeed / 100F); } } + /** * Gets the modifer for magic resistance 1.0=no effect */ - public static float resistMagic(EntityLivingBase user, DamageSource source) - { + public static float resistMagic(EntityLivingBase user, DamageSource source) { float resistance = 100F; - - for(int a = 0; a < 4; a ++) - { - ItemStack armour = user.getEquipmentInSlot(a+1); - if(armour != null && armour.getItem() instanceof IElementalResistance) - { - float modifier = ((IElementalResistance)armour.getItem()).getMagicResistance(armour, source); - modifier *= ArmourCalculator.sizes[3-a]; + + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof IElementalResistance) { + float modifier = ((IElementalResistance) armour.getItem()).getMagicResistance(armour, source); + modifier *= ArmourCalculator.sizes[3 - a]; resistance -= modifier; } } - - return resistance/100F; + + return resistance / 100F; } - + /** * Gets the modifer for fire resistance 1.0=no effect */ - public static float resistFire(EntityLivingBase user, DamageSource source) - { + public static float resistFire(EntityLivingBase user, DamageSource source) { float resistance = 100F; - - for(int a = 0; a < 4; a ++) - { - ItemStack armour = user.getEquipmentInSlot(a+1); - if(armour != null && armour.getItem() instanceof IElementalResistance) - { - float modifier = ((IElementalResistance)armour.getItem()).getFireResistance(armour, source); - modifier *= ArmourCalculator.sizes[3-a]; - + + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof IElementalResistance) { + float modifier = ((IElementalResistance) armour.getItem()).getFireResistance(armour, source); + modifier *= ArmourCalculator.sizes[3 - a]; + resistance -= modifier; } } - - return resistance/100F; + + return resistance / 100F; } - public static boolean resistArrow(EntityLivingBase user, DamageSource source, float dam) - { + + public static boolean resistArrow(EntityLivingBase user, DamageSource source, float dam) { Entity hitter = source.getSourceOfDamage(); - if(hitter == null || !isArrow(hitter)) - { + if (hitter == null || !isArrow(hitter)) { return false; } - + float threshold = 0.25F; float resistance = 1.0F; - - for(int a = 0; a < 4; a ++) - { - ItemStack armour = user.getEquipmentInSlot(4-a); - if(armour != null && armour.getItem() instanceof IElementalResistance) - { - float modifier = ((IElementalResistance)armour.getItem()).getArrowDeflection(armour, source); + + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(4 - a); + if (armour != null && armour.getItem() instanceof IElementalResistance) { + float modifier = ((IElementalResistance) armour.getItem()).getArrowDeflection(armour, source); modifier *= ArmourCalculator.sizes[a]; - + resistance += modifier; } } threshold *= resistance; - - if(!user.worldObj.isRemote) - MineFantasyAPI.debugMsg("Arrow Damage: " + dam + " Projectile Threshold: " + threshold); - + + if (!user.worldObj.isRemote) + MineFantasyAPI.debugMsg("Arrow Damage: " + dam + " Projectile Threshold: " + threshold); + return dam <= threshold && dam > 0; } - + /** - * This tries to see if the projectile is an arrow, just so certain projectiles dont do the armour bouncy thing + * This tries to see if the projectile is an arrow, just so certain projectiles + * dont do the armour bouncy thing */ - public static boolean isArrow(Entity hitter) - { + public static boolean isArrow(Entity hitter) { return hitter instanceof EntityArrow || hitter instanceof EntityArrowMF; } + /** * Gets the modifer for base resistance(non magic/fire) */ - public static float resistBase(EntityLivingBase user, DamageSource source) - { + public static float resistBase(EntityLivingBase user, DamageSource source) { float resistance = 100F; - - for(int a = 0; a < 4; a ++) - { - ItemStack armour = user.getEquipmentInSlot(a+1); - if(armour != null && armour.getItem() instanceof IElementalResistance) - { - float modifier = ((IElementalResistance)armour.getItem()).getBaseResistance(armour, source); - modifier *= ArmourCalculator.sizes[3-a]; + + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof IElementalResistance) { + float modifier = ((IElementalResistance) armour.getItem()).getBaseResistance(armour, source); + modifier *= ArmourCalculator.sizes[3 - a]; resistance -= modifier; } } - return resistance/100F; + return resistance / 100F; } - - - public static float getResistance(EntityLivingBase user, DamageSource source) - { - if(source.isFireDamage()) - { + + public static float getResistance(EntityLivingBase user, DamageSource source) { + if (source.isFireDamage()) { return resistFire(user, source); - } - if(source.isMagicDamage() || source == DamageSource.wither) - { - return resistMagic(user, source); - } + } + if (source.isMagicDamage() || source == DamageSource.wither) { + return resistMagic(user, source); + } return resistBase(user, source); } - + /** * Returns if a target should not be set - * @param entity the attacker - * @param target the target chosen + * + * @param entity + * the attacker + * @param target + * the target chosen */ - public static boolean shouldNotAttack(Entity attacker, EntityLivingBase target) - { - //TODO aggro + public static boolean shouldNotAttack(Entity attacker, EntityLivingBase target) { + // TODO aggro return false; } - public static void throwPlayerOffBalance(EntityPlayer entityPlayer, float balance, boolean throwDown) - { + + public static void throwPlayerOffBalance(EntityPlayer entityPlayer, float balance, boolean throwDown) { float amplify = 30.0F; - - float offsetX = -balance/2; - float offsetY = balance; - - float yawBalance = offsetX*amplify; - float pitchBalance = offsetY*amplify; - entityPlayer.moveStrafing += offsetX; - if(offsetY > 0) - { - entityPlayer.moveForward += offsetY; - } - if(newBalanceSystem) - { - entityPlayer.getEntityData().setFloat("MF_Balance_Pitch", pitchBalance); - entityPlayer.getEntityData().setFloat("MF_Balance_Yaw", yawBalance); - } - else - { - entityPlayer.rotationPitch += pitchBalance; - entityPlayer.rotationYaw += yawBalance; - } + + float offsetX = -balance / 2; + float offsetY = balance; + + float yawBalance = offsetX * amplify; + float pitchBalance = offsetY * amplify; + entityPlayer.moveStrafing += offsetX; + if (offsetY > 0) { + entityPlayer.moveForward += offsetY; + } + if (newBalanceSystem) { + entityPlayer.getEntityData().setFloat("MF_Balance_Pitch", pitchBalance); + entityPlayer.getEntityData().setFloat("MF_Balance_Yaw", yawBalance); + } else { + entityPlayer.rotationPitch += pitchBalance; + entityPlayer.rotationYaw += yawBalance; + } } - + public static boolean newBalanceSystem = false; - - public static boolean isEntityMoving(EntityLivingBase player) - { + + public static boolean isEntityMoving(EntityLivingBase player) { return player.moveForward != 0 || player.moveStrafing != 0; } - public static boolean isMelee(DamageSource source) - { - if(source.getEntity() != null && source.getSourceOfDamage() != null) - { + + public static boolean isMelee(DamageSource source) { + if (source.getEntity() != null && source.getSourceOfDamage() != null) { return source.getEntity() == source.getSourceOfDamage() && !source.isProjectile(); } return false; } - public static boolean isUnholyCreature(Entity entityHit) - { - if(entityHit == null || !(entityHit instanceof EntityLivingBase)) - { + + public static boolean isUnholyCreature(Entity entityHit) { + if (entityHit == null || !(entityHit instanceof EntityLivingBase)) { return false; } - - if(((EntityLivingBase)entityHit).isEntityUndead()) - { + + if (((EntityLivingBase) entityHit).isEntityUndead()) { return true; } - if(entityHit instanceof EntityWitch) - { + if (entityHit instanceof EntityWitch) { return true; } - if(entityHit.getClass().getName().contains("Wraith")) - { + if (entityHit.getClass().getName().contains("Wraith")) { return true; } - if(entityHit.getClass().getName().contains("Werewolf")) - { + if (entityHit.getClass().getName().contains("Werewolf")) { return true; } return false; } - public static boolean isDragon(Entity entityHit) - { - if(entityHit == null || !(entityHit instanceof EntityLivingBase)) - { + + public static boolean isDragon(Entity entityHit) { + if (entityHit == null || !(entityHit instanceof EntityLivingBase)) { return false; } - if(entityHit instanceof net.minecraft.entity.boss.EntityDragon) - { + if (entityHit instanceof net.minecraft.entity.boss.EntityDragon) { return true; } - if(entityHit instanceof minefantasy.mf2.entity.mob.EntityDragon) - { + if (entityHit instanceof minefantasy.mf2.entity.mob.EntityDragon) { return true; } return false; } - + /** * Simply drops an item */ - public static boolean tryDisarm(EntityLivingBase target) - { + public static boolean tryDisarm(EntityLivingBase target) { return tryDisarm(null, target, false); } + /** * Try to disarm the target - * @param attacker Who is attacking (can be null) - * @param target Who is wielding - * @param steal If the attacker should wield the target's weapon + * + * @param attacker + * Who is attacking (can be null) + * @param target + * Who is wielding + * @param steal + * If the attacker should wield the target's weapon */ - public static boolean tryDisarm(EntityLivingBase attacker, EntityLivingBase target, boolean steal) - { - if(target.getHeldItem() == null) - { + public static boolean tryDisarm(EntityLivingBase attacker, EntityLivingBase target, boolean steal) { + if (target.getHeldItem() == null) { return false; } - - if(attacker != null && steal && attacker.getHeldItem() == null) - { + + if (attacker != null && steal && attacker.getHeldItem() == null) { attacker.setCurrentItemOrArmor(0, target.getHeldItem().copy()); - } - else - { + } else { target.entityDropItem(target.getHeldItem(), 1.0F); } target.setCurrentItemOrArmor(0, null); return true; } - - + /** * Checks if Armour Debuffs are Ignored */ - public static boolean isImmuneToWeight(EntityLivingBase entityLiving) - { + public static boolean isImmuneToWeight(EntityLivingBase entityLiving) { return PowerArmour.isPowered(entityLiving); } - - public static void leap(Entity target, float angle, float power, float height) - { - target.addVelocity(-MathHelper.sin(angle * (float) Math.PI / 180.0F) * power, height, MathHelper.cos(angle * (float) Math.PI / 180.0F) * power); - } - + + public static void leap(Entity target, float angle, float power, float height) { + target.addVelocity(-MathHelper.sin(angle * (float) Math.PI / 180.0F) * power, height, + MathHelper.cos(angle * (float) Math.PI / 180.0F) * power); + } + } diff --git a/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java b/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java index 699e2a69..a6e16348 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java +++ b/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java @@ -2,71 +2,65 @@ import java.util.Map; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.util.ResourceLocation; - import org.lwjgl.opengl.GL11; import com.google.common.collect.Maps; import cpw.mods.fml.client.FMLClientHandler; import minefantasy.mf2.util.MFLogUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; -public class TextureHelperMF -{ +public class TextureHelperMF { private static final Map resourceList = Maps.newHashMap(); public static final ResourceLocation ITEM_GLINT = new ResourceLocation("textures/misc/enchanted_item_glint.png"); - + /** - * This gets the resource location from just a simple directory(Beats the shit you have to do nower days!) + * This gets the resource location from just a simple directory(Beats the shit + * you have to do nower days!) */ - public static ResourceLocation getResource(String directory) - { - ResourceLocation resourcelocation = (ResourceLocation)resourceList.get(directory); + public static ResourceLocation getResource(String directory) { + ResourceLocation resourcelocation = (ResourceLocation) resourceList.get(directory); + + if (resourcelocation == null) { + MFLogUtil.logDebug("MineFantasy: Added Resource: " + directory); + + resourcelocation = new ResourceLocation("minefantasy2", directory); + resourceList.put(directory, resourcelocation); + } + + return resourcelocation; + } - if (resourcelocation == null) - { - MFLogUtil.logDebug("MineFantasy: Added Resource: " + directory); - - resourcelocation = new ResourceLocation("minefantasy2", directory); - resourceList.put(directory, resourcelocation); - } - - return resourcelocation; - } - - - public static void renderEnchantmentEffects(Tessellator tessellator) - { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - FMLClientHandler.instance().getClient().renderEngine.bindTexture(ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - float f7 = 0.76F; - GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float f8 = 0.125F; - GL11.glScalef(f8, f8, f8); - float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; - GL11.glTranslatef(f9, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(f8, f8, f8); - f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; - GL11.glTranslatef(-f9, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } + public static void renderEnchantmentEffects(Tessellator tessellator) { + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + float f7 = 0.76F; + GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glPushMatrix(); + float f8 = 0.125F; + GL11.glScalef(f8, f8, f8); + float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; + GL11.glTranslatef(f9, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(f8, f8, f8); + f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; + GL11.glTranslatef(-f9, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java b/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java index 981f7c19..62744e1f 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java @@ -8,352 +8,292 @@ import minefantasy.mf2.api.weapon.ISharpenable; import net.minecraft.item.Item.ToolMaterial; import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemTool; import net.minecraft.nbt.NBTTagCompound; -public class ToolHelper -{ - //CRAFTER TOOLS// - - public static boolean shouldShowTooltip(ItemStack tool) - { +public class ToolHelper { + // CRAFTER TOOLS// + + public static boolean shouldShowTooltip(ItemStack tool) { String type = getCrafterTool(tool); - + return type != null && !type.equalsIgnoreCase("nothing") && !type.equalsIgnoreCase("hands"); } - public static float getCrafterEfficiency(ItemStack tool) - { - if(tool == null) - { + + public static float getCrafterEfficiency(ItemStack tool) { + if (tool == null) { return 1F; } - if(tool.getItem() instanceof IToolMF) - { - return ((IToolMF)tool.getItem()).getEfficiency(tool); + if (tool.getItem() instanceof IToolMF) { + return ((IToolMF) tool.getItem()).getEfficiency(tool); } return CustomCrafterEntry.getEntryEfficiency(tool); } - public static int getCrafterTier(ItemStack tool) - { - if(tool == null) - { + + public static int getCrafterTier(ItemStack tool) { + if (tool == null) { return 0; } - if(tool.getItem() instanceof IToolMF) - { - return ((IToolMF)tool.getItem()).getTier(tool); + if (tool.getItem() instanceof IToolMF) { + return ((IToolMF) tool.getItem()).getTier(tool); } return CustomCrafterEntry.getEntryTier(tool); } - public static String getCrafterTool(ItemStack tool) - { - if(tool == null) - { + + public static String getCrafterTool(ItemStack tool) { + if (tool == null) { return "hands"; } - if(tool.getItem() instanceof IToolMF) - { - return ((IToolMF)tool.getItem()).getToolType(tool); + if (tool.getItem() instanceof IToolMF) { + return ((IToolMF) tool.getItem()).getToolType(tool); } return CustomCrafterEntry.getEntryType(tool); } - - - - //MATERIALS// - + + // MATERIALS// + /** - * Compares an itemstack to see if the item is made from the said material - * ONLY APPLIES TO IToolMaterial in api. + * Compares an itemstack to see if the item is made from the said material ONLY + * APPLIES TO IToolMaterial in api. */ - public static boolean isItemMaterial(ItemStack stack, ToolMaterial material) - { - if(stack != null) - { - //You need the item to implement this so it can see - if(stack.getItem() instanceof IToolMaterial) - { - IToolMaterial mat = (IToolMaterial)stack.getItem(); - - return mat.getMaterial() != null && mat.getMaterial() == material; - } - } + public static boolean isItemMaterial(ItemStack stack, ToolMaterial material) { + if (stack != null) { + // You need the item to implement this so it can see + if (stack.getItem() instanceof IToolMaterial) { + IToolMaterial mat = (IToolMaterial) stack.getItem(); + + return mat.getMaterial() != null && mat.getMaterial() == material; + } + } return false; } - - //QUALITY// - - public static ItemStack setQuality(ItemStack item, float qualityLvl) - { - if(item.getMaxStackSize() > 0)return item; - + + // QUALITY// + + public static ItemStack setQuality(ItemStack item, float qualityLvl) { + if (item.getMaxStackSize() > 0) + return item; + NBTTagCompound nbt = getOrCreateNBT(item); nbt.setFloat("MFCraftQuality", qualityLvl); - + return item; } /** * Gets how well an item has been crafted: 100 is default ranging from 0-200 */ - public static float getQualityLevel(ItemStack stack) - { - if(stack.getMaxStackSize() == 1) - { - if(stack.hasTagCompound() && stack.getTagCompound().hasKey("MFCraftQuality")) - { + public static float getQualityLevel(ItemStack stack) { + if (stack.getMaxStackSize() == 1) { + if (stack.hasTagCompound() && stack.getTagCompound().hasKey("MFCraftQuality")) { return stack.getTagCompound().getFloat("MFCraftQuality"); } } return 100.0F; } - - public static int setDuraOnQuality(ItemStack item, int dura) - { + + public static int setDuraOnQuality(ItemStack item, int dura) { float quality = getQualityLevel(item); - if(item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) - { - if(item.getTagCompound().getBoolean("MF_Inferior")) - { + if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { + if (item.getTagCompound().getBoolean("MF_Inferior")) { dura /= 2; - } - else - { + } else { dura *= 2; } } - - if(quality > 100) - { - dura += ((dura) / 100F * (quality-100) );//This means 100+ adds to 2x durability at level 200 + + if (quality > 100) { + dura += ((dura) / 100F * (quality - 100));// This means 100+ adds to 2x durability at level 200 } - if(quality < 100) - { - dura -= ((dura*0.75) / 100 * (100F - quality));//This means 100- takes upto 75% from it's max durability lvl0 is 25%dura + if (quality < 100) { + dura -= ((dura * 0.75) / 100 * (100F - quality));// This means 100- takes upto 75% from it's max durability + // lvl0 is 25%dura } return dura; } - - public static float modifyDigOnQuality(ItemStack item, float digspeed) - { - if(item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) - { - if(item.getTagCompound().getBoolean("MF_Inferior")) - { + + public static float modifyDigOnQuality(ItemStack item, float digspeed) { + if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { + if (item.getTagCompound().getBoolean("MF_Inferior")) { digspeed /= 1.25F; - } - else - { + } else { digspeed *= 1.25F; } } float quality = getQualityLevel(item); - - if(quality > 100) - { - digspeed += ((digspeed*0.5F) / 100F * (quality-100) );//This means 100+ adds 50% speed at level 200 + + if (quality > 100) { + digspeed += ((digspeed * 0.5F) / 100F * (quality - 100));// This means 100+ adds 50% speed at level 200 } - if(quality < 100) - { - digspeed -= ((digspeed*0.5) / 100 * (100F - quality));//This means 100- takes upto 50% from it's max speed lvl0 is 50% speed + if (quality < 100) { + digspeed -= ((digspeed * 0.5) / 100 * (100F - quality));// This means 100- takes upto 50% from it's max + // speed lvl0 is 50% speed } return digspeed; } - - public static float modifyDamOnQuality(ItemStack item, float damage) - { + + public static float modifyDamOnQuality(ItemStack item, float damage) { float quality = getQualityLevel(item); - if(item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) - { - if(item.getTagCompound().getBoolean("MF_Inferior")) - { + if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { + if (item.getTagCompound().getBoolean("MF_Inferior")) { damage /= 1.25F; - } - else - { + } else { damage *= 1.25F; } } - if(quality > 100) - { - damage += ((damage*0.25F) / 100F * (quality-100) );//This means 100+ adds 25% damage at level 200 + if (quality > 100) { + damage += ((damage * 0.25F) / 100F * (quality - 100));// This means 100+ adds 25% damage at level 200 } - if(quality < 100) - { - damage -= ((damage*0.25) / 100 * (100F - quality));//This means 100- takes upto 25% from it's max damage lvl0 is 75% damage + if (quality < 100) { + damage -= ((damage * 0.25) / 100 * (100F - quality));// This means 100- takes upto 25% from it's max damage + // lvl0 is 75% damage } return damage; } - - public static float modifyArmourRating(ItemStack item, float rating) - { + + public static float modifyArmourRating(ItemStack item, float rating) { float quality = getQualityLevel(item); - if(item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) - { - if(item.getTagCompound().getBoolean("MF_Inferior")) - { + if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { + if (item.getTagCompound().getBoolean("MF_Inferior")) { rating /= 1.25F; - } - else - { + } else { rating *= 1.25F; } } - - if(quality > 100) - { - rating += ((rating*0.5F) / 100F * (quality-100) );//This means 100+ adds 50% armour at level 200 + + if (quality > 100) { + rating += ((rating * 0.5F) / 100F * (quality - 100));// This means 100+ adds 50% armour at level 200 } - if(quality < 100) - { - rating -= ((rating*0.5) / 100 * (100F - quality));//This means 100- takes upto 50% from it's max armour lvl0 is 50% armour + if (quality < 100) { + rating -= ((rating * 0.5) / 100 * (100F - quality));// This means 100- takes upto 50% from it's max armour + // lvl0 is 50% armour } return rating; } - - //NBT// - - private static NBTTagCompound getOrCreateNBT(ItemStack item) - { - if(!item.hasTagCompound()) - { + + // NBT// + + private static NBTTagCompound getOrCreateNBT(ItemStack item) { + if (!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } - + return item.getTagCompound(); } - public static boolean hasCustomQualityTag(ItemStack item) - { + public static boolean hasCustomQualityTag(ItemStack item) { return item.hasTagCompound() && item.getTagCompound().hasKey("MFCraftQuality"); } - + private static String specialItem = "MF_SpecialItemType"; - public static void setSpecial(ItemStack item, String type) - { - if(!item.hasTagCompound()) - { + + public static void setSpecial(ItemStack item, String type) { + if (!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } item.getTagCompound().setString(specialItem, type); } - public static boolean isSpecial(ItemStack item, String type) - { - return getSpecial(item)!= null && getSpecial(item).equals(type); + + public static boolean isSpecial(ItemStack item, String type) { + return getSpecial(item) != null && getSpecial(item).equals(type); } - public static String getSpecial(ItemStack item) - { - if(item.hasTagCompound() && item.getTagCompound().hasKey(specialItem)) - { + + public static String getSpecial(ItemStack item) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(specialItem)) { return item.getTagCompound().getString(specialItem); } return null; } - - public static void setToolSharpness(ItemStack item, float level) - { + + public static void setToolSharpness(ItemStack item, float level) { NBTTagCompound nbt = getOrCreateNBT(item); float currentLevel = getSharpnessLevel(item); float maxLevel = getMaxSharpness(item); - nbt.setFloat(sharpnessLevelNBT, Math.min(maxLevel, currentLevel+level)); + nbt.setFloat(sharpnessLevelNBT, Math.min(maxLevel, currentLevel + level)); } - - public static float getSharpnessLevel(ItemStack item) - { + + public static float getSharpnessLevel(ItemStack item) { NBTTagCompound nbt = item.getTagCompound(); - if(nbt != null && nbt.hasKey(sharpnessLevelNBT)) - { + if (nbt != null && nbt.hasKey(sharpnessLevelNBT)) { return nbt.getFloat(sharpnessLevelNBT); } return 0F; } - + public static final String sharpnessLevelNBT = "MF_Sharpness_Level"; - - public static boolean canBeSharpened(ItemStack itemstack, float level) - { - if(itemstack == null)return false; + + public static boolean canBeSharpened(ItemStack itemstack, float level) { + if (itemstack == null) + return false; return false; } - + /** * The max amount of uses of sharpness */ - public static float getMaxSharpness(ItemStack item) - { + public static float getMaxSharpness(ItemStack item) { return getSharpnessTraits(item)[0]; } + /** * The max percent that it can increase damage */ - public static float getMaxSharpnessPercent(ItemStack item) - { + public static float getMaxSharpnessPercent(ItemStack item) { return getSharpnessTraits(item)[1]; } + /** * The modifier for how much percent is added each use */ - public static float getSharpUsesModifier(ItemStack item) - { + public static float getSharpUsesModifier(ItemStack item) { return getSharpnessTraits(item)[2]; } - //maxSharpness, maxBuff, sharpnessModifier - public static float[] getSharpnessTraits(ItemStack item) - { - float[] list = new float[]{100, 20F, 3F}; - - if(item != null && item.getItem() instanceof ISharpenable) - { - ISharpenable instance = (ISharpenable)item.getItem(); + + // maxSharpness, maxBuff, sharpnessModifier + public static float[] getSharpnessTraits(ItemStack item) { + float[] list = new float[] { 100, 20F, 3F }; + + if (item != null && item.getItem() instanceof ISharpenable) { + ISharpenable instance = (ISharpenable) item.getItem(); list[0] = instance.getMaxSharpness(item); list[1] = instance.getDamagePercentMax(item); list[2] = instance.getSharpUsesModifier(item); } return list; } - - public static String[] breakdownLineForResearchArray(String string) - { + + public static String[] breakdownLineForResearchArray(String string) { String temp = ""; ArrayList entries = new ArrayList(); - - for(int a = 0; a < string.length(); a ++) - { - if(a == string.length()-1) - { + + for (int a = 0; a < string.length(); a++) { + if (a == string.length() - 1) { temp = temp + string.charAt(a); } - if(string.charAt(a) == " ".charAt(0) || a == string.length()-1) - { + if (string.charAt(a) == " ".charAt(0) || a == string.length() - 1) { entries.add(temp); - } - else - { - if(string.charAt(a) != " ".charAt(0)) - { + } else { + if (string.charAt(a) != " ".charAt(0)) { temp = temp + string.charAt(a); } } } int size = entries.size(); String[] stringList = new String[size]; - for(int i = 0; i < size; i++) - { + for (int i = 0; i < size; i++) { stringList[i] = entries.get(i); } return stringList; } - public static boolean isToolSufficient(ItemStack heldItem, String toolNeeded, int toolTierNeeded) - { + + public static boolean isToolSufficient(ItemStack heldItem, String toolNeeded, int toolTierNeeded) { String toolType = getCrafterTool(heldItem); int tier = getCrafterTier(heldItem); - + return toolType.equalsIgnoreCase(toolNeeded) && tier >= toolTierNeeded; } - public static void setUnbreakable(ItemStack tool) - { - if(!tool.hasTagCompound()) - { + + public static void setUnbreakable(ItemStack tool) { + if (!tool.hasTagCompound()) { tool.setTagCompound(new NBTTagCompound()); } tool.getTagCompound().setBoolean("Unbreakable", true); diff --git a/src/main/java/minefantasy/mf2/api/knowledge/IArtefact.java b/src/main/java/minefantasy/mf2/api/knowledge/IArtefact.java index 221a8656..c8b88191 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/IArtefact.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/IArtefact.java @@ -2,7 +2,6 @@ import net.minecraft.item.ItemStack; -public interface IArtefact -{ +public interface IArtefact { public int getStudyTime(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java b/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java index 373f9591..b350daec 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java @@ -2,7 +2,8 @@ import java.util.ArrayList; -import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.knowledge.client.EntryPage; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.Skill; @@ -12,302 +13,267 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.stats.IStatStringFormat; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.StatCollector; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class InformationBase -{ +public class InformationBase { public static boolean easyResearch = false; public static boolean unlockAll = false; public int ID = 0; private static int nextID = 0; private boolean startedUnlocked = false; - public final int displayColumn; - public final int displayRow; - public final InformationBase parentInfo; - private final String description; - @SideOnly(Side.CLIENT) - private IStatStringFormat statStringFormatter; - public final ItemStack theItemStack; - private boolean isSpecial; - private boolean isPerk; - private final String idName; - private ArrayList skills = new ArrayList(); - public String[] requirements = null; - private int artefactCount = 0; - - public InformationBase(String name, int x, int y, int artefacts, Item icon, InformationBase parent) - { - this(name, x, y, artefacts, new ItemStack(icon), parent); - } - public InformationBase(String name, int x, int y, int artefacts, Block icon, InformationBase parent) - { - this(name, x, y, artefacts, new ItemStack(icon), parent); - } - - public InformationBase(String name, int x, int y, int artefacts, ItemStack icon, InformationBase parent) - { - this.idName = name; - this.theItemStack = icon; - this.description = "knowledge." + idName + ".desc"; - this.displayColumn = x; - this.displayRow = y; - - if (x < InformationList.minDisplayColumn) - { - InformationList.minDisplayColumn = x; - } - - if (y < InformationList.minDisplayRow) - { - InformationList.minDisplayRow = y; - } - - if (x > InformationList.maxDisplayColumn) - { - InformationList.maxDisplayColumn = x; - } - - if (y > InformationList.maxDisplayRow) - { - InformationList.maxDisplayRow = y; - } - this.parentInfo = parent; - this.artefactCount = Math.max(0, artefacts); - } - - public InformationBase addSkill(Skill skill, int level) - { - if(RPGElements.isSystemActive) - { - skills.add(new SkillRequirement(skill, level)); - } - return this; - } - - - public InformationBase setUnlocked() - { - startedUnlocked = true; - return this; - } - public InformationBase setPage(InformationPage page) - { - page.addInfo(this); - return this; - } - - /** - * Special achievements have a 'spiked' (on normal texture pack) frame, special achievements are the hardest ones to - * achieve. - */ - public InformationBase setSpecial() - { - this.isSpecial = true; - return this; - } - public InformationBase setPerk() - { - this.isPerk = true; - return this; - } - - /** - * Register the stat into StatList. - */ - public InformationBase registerStat() - { - ID = nextID; - nextID++; - InformationList.knowledgeList.add(this); - InformationList.nameMap.put(idName.toLowerCase(), this); - return this; - } - -/* - public IChatComponent func_150951_e() - { - IChatComponent ichatcomponent = super.func_150951_e(); - ichatcomponent.getChatStyle().setColor(this.getSpecial() ? EnumChatFormatting.DARK_PURPLE : EnumChatFormatting.GREEN); - return ichatcomponent; - } - - public InformationBase func_150953_b(Class p_150953_1_) - { - return (InformationBase)super.func_150953_b(p_150953_1_); - } -*/ - /** - * Returns the fully description of the achievement - ready to be displayed on screen. - */ - public Object[] descriptValues; - public InformationBase setDescriptValues(Object... values) - { - descriptValues = values; - return this; - } - @SideOnly(Side.CLIENT) - public String getDescription() - { - String localised = StatCollector.translateToLocal(this.description); - if(descriptValues != null && descriptValues.length > 0) - { - localised = StatCollector.translateToLocalFormatted(description, descriptValues); - } - String text = this.statStringFormatter != null ? this.statStringFormatter.formatString(localised) : localised; - - if(RPGElements.isSystemActive) - { - String[] requirements = getRequiredSkills(); - if(requirements != null && requirements.length > 0) - { - text += "\n\n"; - for(String s : requirements) - { - text += s + "\n"; - } - } - } - return text; - } - @SideOnly(Side.CLIENT) - public String getDisplayName() - { - String name = this.statStringFormatter != null ? this.statStringFormatter.formatString(StatCollector.translateToLocal("knowledge."+this.idName)) : StatCollector.translateToLocal("knowledge."+this.idName); - - if(!easyResearch) - { - EntityPlayer player = Minecraft.getMinecraft().thePlayer; - if(player != null && !ResearchLogic.hasInfoUnlocked(player, this)) - { - int artefacts = ResearchLogic.getArtefactCount(this.idName, player); - int max = this.getArtefactCount(); - name += StatCollector.translateToLocalFormatted("research.cluecount", artefacts, max); - } - } - - return name; - } - - /** - * Special achievements have a 'spiked' (on normal texture pack) frame, special achievements are the hardest ones to - * achieve. - */ - public boolean getSpecial() - { - return this.isSpecial; - } - public boolean getPerk() - { - return this.isPerk; - } - public boolean onPurchase(EntityPlayer user) - { - if(!hasSkillsUnlocked(user)) - { + public final int displayColumn; + public final int displayRow; + public final InformationBase parentInfo; + private final String description; + @SideOnly(Side.CLIENT) + private IStatStringFormat statStringFormatter; + public final ItemStack theItemStack; + private boolean isSpecial; + private boolean isPerk; + private final String idName; + private ArrayList skills = new ArrayList(); + public String[] requirements = null; + private int artefactCount = 0; + + public InformationBase(String name, int x, int y, int artefacts, Item icon, InformationBase parent) { + this(name, x, y, artefacts, new ItemStack(icon), parent); + } + + public InformationBase(String name, int x, int y, int artefacts, Block icon, InformationBase parent) { + this(name, x, y, artefacts, new ItemStack(icon), parent); + } + + public InformationBase(String name, int x, int y, int artefacts, ItemStack icon, InformationBase parent) { + this.idName = name; + this.theItemStack = icon; + this.description = "knowledge." + idName + ".desc"; + this.displayColumn = x; + this.displayRow = y; + + if (x < InformationList.minDisplayColumn) { + InformationList.minDisplayColumn = x; + } + + if (y < InformationList.minDisplayRow) { + InformationList.minDisplayRow = y; + } + + if (x > InformationList.maxDisplayColumn) { + InformationList.maxDisplayColumn = x; + } + + if (y > InformationList.maxDisplayRow) { + InformationList.maxDisplayRow = y; + } + this.parentInfo = parent; + this.artefactCount = Math.max(0, artefacts); + } + + public InformationBase addSkill(Skill skill, int level) { + if (RPGElements.isSystemActive) { + skills.add(new SkillRequirement(skill, level)); + } + return this; + } + + public InformationBase setUnlocked() { + startedUnlocked = true; + return this; + } + + public InformationBase setPage(InformationPage page) { + page.addInfo(this); + return this; + } + + /** + * Special achievements have a 'spiked' (on normal texture pack) frame, special + * achievements are the hardest ones to achieve. + */ + public InformationBase setSpecial() { + this.isSpecial = true; + return this; + } + + public InformationBase setPerk() { + this.isPerk = true; + return this; + } + + /** + * Register the stat into StatList. + */ + public InformationBase registerStat() { + ID = nextID; + nextID++; + InformationList.knowledgeList.add(this); + InformationList.nameMap.put(idName.toLowerCase(), this); + return this; + } + + /* + * public IChatComponent func_150951_e() { IChatComponent ichatcomponent = + * super.func_150951_e(); + * ichatcomponent.getChatStyle().setColor(this.getSpecial() ? + * EnumChatFormatting.DARK_PURPLE : EnumChatFormatting.GREEN); return + * ichatcomponent; } + * + * public InformationBase func_150953_b(Class p_150953_1_) { return + * (InformationBase)super.func_150953_b(p_150953_1_); } + */ + /** + * Returns the fully description of the achievement - ready to be displayed on + * screen. + */ + public Object[] descriptValues; + + public InformationBase setDescriptValues(Object... values) { + descriptValues = values; + return this; + } + + @SideOnly(Side.CLIENT) + public String getDescription() { + String localised = StatCollector.translateToLocal(this.description); + if (descriptValues != null && descriptValues.length > 0) { + localised = StatCollector.translateToLocalFormatted(description, descriptValues); + } + String text = this.statStringFormatter != null ? this.statStringFormatter.formatString(localised) : localised; + + if (RPGElements.isSystemActive) { + String[] requirements = getRequiredSkills(); + if (requirements != null && requirements.length > 0) { + text += "\n\n"; + for (String s : requirements) { + text += s + "\n"; + } + } + } + return text; + } + + @SideOnly(Side.CLIENT) + public String getDisplayName() { + String name = this.statStringFormatter != null + ? this.statStringFormatter.formatString(StatCollector.translateToLocal("knowledge." + this.idName)) + : StatCollector.translateToLocal("knowledge." + this.idName); + + if (!easyResearch) { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if (player != null && !ResearchLogic.hasInfoUnlocked(player, this)) { + int artefacts = ResearchLogic.getArtefactCount(this.idName, player); + int max = this.getArtefactCount(); + name += StatCollector.translateToLocalFormatted("research.cluecount", artefacts, max); + } + } + + return name; + } + + /** + * Special achievements have a 'spiked' (on normal texture pack) frame, special + * achievements are the hardest ones to achieve. + */ + public boolean getSpecial() { + return this.isSpecial; + } + + public boolean getPerk() { + return this.isPerk; + } + + public boolean onPurchase(EntityPlayer user) { + if (!hasSkillsUnlocked(user)) { return false; } - + boolean success = ResearchLogic.canPurchase(user, this); - if(success && !user.worldObj.isRemote) - { + if (success && !user.worldObj.isRemote) { user.worldObj.playSoundAtEntity(user, "minefantasy2:updateResearch", 1.0F, 1.0F); - if(getPerk()) - { + if (getPerk()) { user.worldObj.playSoundAtEntity(user, "random.levelup", 1.0F, 1.0F); } } - - if(isEasy()) - { + + if (isEasy()) { ResearchLogic.tryUnlock(user, this); - } - else - { + } else { } return true; } + public static Item scroll; - public boolean hasSkillsUnlocked(EntityPlayer player) - { - if(skills == null)return true; - for(int id = 0; id < skills.size(); id++) - { + public boolean hasSkillsUnlocked(EntityPlayer player) { + if (skills == null) + return true; + for (int id = 0; id < skills.size(); id++) { SkillRequirement requirement = skills.get(id); - if(!requirement.isAvailable(player)) - { + if (!requirement.isAvailable(player)) { return false; } } return true; } - public String getUnlocalisedName() - { + + public String getUnlocalisedName() { return idName; } - + private ArrayList pages = new ArrayList(); - public void addPages(EntryPage... info) - { - for(EntryPage page: info) - { + + public void addPages(EntryPage... info) { + for (EntryPage page : info) { pages.add(page); } } - public ArrayList getPages() - { + + public ArrayList getPages() { return pages; } - - public boolean isUnlocked(int id, EntityPlayer player) - { - if(this.skills != null) - { + + public boolean isUnlocked(int id, EntityPlayer player) { + if (this.skills != null) { return skills.get(id) != null && skills.get(id).isAvailable(player); } return true; } - public String[] getRequiredSkills() - { - if(this.requirements == null) - { + + public String[] getRequiredSkills() { + if (this.requirements == null) { requirements = new String[skills.size()]; - for(int id = 0; id < skills.size(); id++) - { + for (int id = 0; id < skills.size(); id++) { SkillRequirement requirement = skills.get(id); - requirements[id] = StatCollector.translateToLocalFormatted("rpg.required", requirement.level, requirement.skill.getDisplayName()); + requirements[id] = StatCollector.translateToLocalFormatted("rpg.required", requirement.level, + requirement.skill.getDisplayName()); } } return requirements; } - - public boolean isPreUnlocked() - { + + public boolean isPreUnlocked() { return !getPerk() && (unlockAll || startedUnlocked); } - public int getArtefactCount() - { + + public int getArtefactCount() { return artefactCount; } - public boolean isEasy() - { + + public boolean isEasy() { return getPerk() || this.getArtefactCount() == 0 || easyResearch; } } -class SkillRequirement -{ + +class SkillRequirement { protected Skill skill; protected int level; - SkillRequirement(Skill skill, int level) - { + + SkillRequirement(Skill skill, int level) { this.skill = skill; this.level = level; } - public boolean isAvailable(EntityPlayer player) - { + + public boolean isAvailable(EntityPlayer player) { return RPGElements.hasLevel(player, skill, level); } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java b/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java index c4f5c405..249678fa 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java @@ -6,27 +6,32 @@ import minefantasy.mf2.api.rpg.SkillList; -public class InformationList -{ - public static InformationPage artisanry = new InformationPage("infoPage.artisanry", SkillList.artisanry).registerInfoPage(); - public static InformationPage construction = new InformationPage("infoPage.construction", SkillList.construction).registerInfoPage(); - public static InformationPage provisioning = new InformationPage("infoPage.provisioning", SkillList.provisioning).registerInfoPage(); - public static InformationPage engineering = new InformationPage("infoPage.engineering", SkillList.engineering).registerInfoPage(); +public class InformationList { + public static InformationPage artisanry = new InformationPage("infoPage.artisanry", SkillList.artisanry) + .registerInfoPage(); + public static InformationPage construction = new InformationPage("infoPage.construction", SkillList.construction) + .registerInfoPage(); + public static InformationPage provisioning = new InformationPage("infoPage.provisioning", SkillList.provisioning) + .registerInfoPage(); + public static InformationPage engineering = new InformationPage("infoPage.engineering", SkillList.engineering) + .registerInfoPage(); public static InformationPage mastery = new InformationPage("infoPage.mastery", null).registerInfoPage(); - - /** Is the smallest column used to display a achievement on the GUI. */ - public static int minDisplayColumn; - /** Is the smallest row used to display a achievement on the GUI. */ - public static int minDisplayRow; - /** Is the biggest column used to display a achievement on the GUI. */ - public static int maxDisplayColumn; - /** Is the biggest row used to display a achievement on the GUI. */ - public static int maxDisplayRow; - /** Holds a list of all registered achievements. */ - public static List knowledgeList = new ArrayList(); - public static HashMapnameMap = new HashMap(); - /** - * A stub functions called to make the static initializer for this class run. - */ - public static void init() {} + + /** Is the smallest column used to display a achievement on the GUI. */ + public static int minDisplayColumn; + /** Is the smallest row used to display a achievement on the GUI. */ + public static int minDisplayRow; + /** Is the biggest column used to display a achievement on the GUI. */ + public static int maxDisplayColumn; + /** Is the biggest row used to display a achievement on the GUI. */ + public static int maxDisplayRow; + /** Holds a list of all registered achievements. */ + public static List knowledgeList = new ArrayList(); + public static HashMap nameMap = new HashMap(); + + /** + * A stub functions called to make the static initializer for this class run. + */ + public static void init() { + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java b/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java index c79dd427..9cdb81b1 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java @@ -9,112 +9,105 @@ import minefantasy.mf2.api.rpg.Skill; import net.minecraft.util.StatCollector; -public class InformationPage -{ - private String name; - private LinkedList entries; - public final Skill baseSkill; - - public InformationPage(String name, Skill skill, InformationBase... achievements) - { - this.name = name; - this.baseSkill = skill; - this.entries = new LinkedList(Arrays.asList(achievements)); - } - - public String getName() - { - return name; - } - - public List getInfoList() - { - return entries; - } - - private static LinkedList infoPages = new LinkedList(); - - /** - * Registers an achievement page. - * @param page The page. - */ - public static void registerInfoPage(InformationPage page) - { - if (getInfoPage(page.getName()) != null) - { - throw new RuntimeException("Duplicate achievement page name \"" + page.getName() + "\"!"); - } - infoPages.add(page); - } - - /** - * Will return an achievement page by its index on the list. - * @param index The page's index. - * @return the achievement page corresponding to the index or null if invalid index - */ - public static InformationPage getInfoPage(int index) - { - return infoPages.get(index); - } - - /** - * Will return an achievement page by its name. - * @param name The page's name. - * @return the achievement page with the given name or null if no such page - */ - public static InformationPage getInfoPage(String name) - { - for (InformationPage page : infoPages) - { - if (page.getName().equals(name)) - { - return page; - } - } - return null; - } - - /** - * Will return the list of achievement pages. - * @return the list's size - */ - public static Set getInfoPages() - { - return new HashSet(infoPages); - } - - /** - * Will return whether an achievement is in any page or not. - * @param achievement The achievement. - */ - public static boolean isInfoInPages(InformationBase achievement) - { - for (InformationPage page : infoPages) - { - if (page.getInfoList().contains(achievement)) - { - return true; - } - } - return false; - } - - public static String getTitle(int index) - { - return StatCollector.translateToLocal(index == -1 ? "infoPage.basic" : getInfoPage(index).getName()); - } - public static Skill getSkill(int index) - { - return index == -1 ? null : getInfoPage(index).baseSkill; - } - - public void addInfo(InformationBase entry) - { +public class InformationPage { + private String name; + private LinkedList entries; + public final Skill baseSkill; + + public InformationPage(String name, Skill skill, InformationBase... achievements) { + this.name = name; + this.baseSkill = skill; + this.entries = new LinkedList(Arrays.asList(achievements)); + } + + public String getName() { + return name; + } + + public List getInfoList() { + return entries; + } + + private static LinkedList infoPages = new LinkedList(); + + /** + * Registers an achievement page. + * + * @param page + * The page. + */ + public static void registerInfoPage(InformationPage page) { + if (getInfoPage(page.getName()) != null) { + throw new RuntimeException("Duplicate achievement page name \"" + page.getName() + "\"!"); + } + infoPages.add(page); + } + + /** + * Will return an achievement page by its index on the list. + * + * @param index + * The page's index. + * @return the achievement page corresponding to the index or null if invalid + * index + */ + public static InformationPage getInfoPage(int index) { + return infoPages.get(index); + } + + /** + * Will return an achievement page by its name. + * + * @param name + * The page's name. + * @return the achievement page with the given name or null if no such page + */ + public static InformationPage getInfoPage(String name) { + for (InformationPage page : infoPages) { + if (page.getName().equals(name)) { + return page; + } + } + return null; + } + + /** + * Will return the list of achievement pages. + * + * @return the list's size + */ + public static Set getInfoPages() { + return new HashSet(infoPages); + } + + /** + * Will return whether an achievement is in any page or not. + * + * @param achievement + * The achievement. + */ + public static boolean isInfoInPages(InformationBase achievement) { + for (InformationPage page : infoPages) { + if (page.getInfoList().contains(achievement)) { + return true; + } + } + return false; + } + + public static String getTitle(int index) { + return StatCollector.translateToLocal(index == -1 ? "infoPage.basic" : getInfoPage(index).getName()); + } + + public static Skill getSkill(int index) { + return index == -1 ? null : getInfoPage(index).baseSkill; + } + + public void addInfo(InformationBase entry) { entries.add(entry); } - public InformationPage registerInfoPage() - { + public InformationPage registerInfoPage() { registerInfoPage(this); return this; } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/ResearchArtefacts.java b/src/main/java/minefantasy/mf2/api/knowledge/ResearchArtefacts.java index b6409023..afb78cd2 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/ResearchArtefacts.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/ResearchArtefacts.java @@ -8,65 +8,54 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class ResearchArtefacts -{ - public static void addArtefact(Object input, InformationBase research) - { +public class ResearchArtefacts { + public static void addArtefact(Object input, InformationBase research) { addArtefact(input, research.getUnlocalisedName()); } - public static void addArtefact(Object input, String research) - { + + public static void addArtefact(Object input, String research) { ItemStack itemstack = convert(input); - - if(itemstack != null) - { - OreDictionary.registerOre("Artefact-"+research, itemstack); + + if (itemstack != null) { + OreDictionary.registerOre("Artefact-" + research, itemstack); } } - public static ArrayList getResearchNames(ItemStack item) - { - ArrayListnames = new ArrayList(); - if(item == null)return names; - - for(int i: OreDictionary.getOreIDs(item)) - { + public static ArrayList getResearchNames(ItemStack item) { + ArrayList names = new ArrayList(); + if (item == null) + return names; + + for (int i : OreDictionary.getOreIDs(item)) { String name = OreDictionary.getOreName(i); - if(name != null && name.startsWith("Artefact-")) - { - String str = name.substring(9); + if (name != null && name.startsWith("Artefact-")) { + String str = name.substring(9); names.add(str); } } return names; } - - public static ItemStack convert(Object input) - { - if(input == null)return null; - + + public static ItemStack convert(Object input) { + if (input == null) + return null; + ItemStack itemstack = null; - if(input instanceof ItemStack) - { - return (ItemStack)input; + if (input instanceof ItemStack) { + return (ItemStack) input; + } else if (input instanceof Block) { + return new ItemStack((Block) input, 1, OreDictionary.WILDCARD_VALUE); + } else if (input instanceof Item) { + return new ItemStack((Item) input, 1, OreDictionary.WILDCARD_VALUE); } - else if(input instanceof Block) - { - return new ItemStack((Block)input, 1, OreDictionary.WILDCARD_VALUE); - } - else if(input instanceof Item) - { - return new ItemStack((Item)input, 1, OreDictionary.WILDCARD_VALUE); - } - + return null; } - public static int useArtefact(ItemStack itemStack, InformationBase base, EntityPlayer user) - { + + public static int useArtefact(ItemStack itemStack, InformationBase base, EntityPlayer user) { int artefacts = ResearchLogic.addArtefact(base.getUnlocalisedName().toLowerCase(), user); ResearchLogic.addArtefactUsed(user, base, itemStack); - if(artefacts >= base.getArtefactCount()) - { + if (artefacts >= base.getArtefactCount()) { ResearchLogic.tryUnlock(user, base); return -1; } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/ResearchLogic.java b/src/main/java/minefantasy/mf2/api/knowledge/ResearchLogic.java index 941a3e07..a460cee6 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/ResearchLogic.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/ResearchLogic.java @@ -9,176 +9,152 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.WorldServer; -public class ResearchLogic -{ - public static boolean canPurchase(EntityPlayer player, InformationBase base) - { - if(base.isPreUnlocked() || !canUnlockInfo(player, base)) - { +public class ResearchLogic { + public static boolean canPurchase(EntityPlayer player, InformationBase base) { + if (base.isPreUnlocked() || !canUnlockInfo(player, base)) { return false; } NBTTagCompound nbt = getNBT(player); - if(!nbt.hasKey("Research_" + base.getUnlocalisedName())) - { + if (!nbt.hasKey("Research_" + base.getUnlocalisedName())) { return true; } return false; - } - public static void forceUnlock(EntityPlayer player, InformationBase base) - { + } + + public static void forceUnlock(EntityPlayer player, InformationBase base) { NBTTagCompound nbt = getNBT(player); nbt.setBoolean("Research_" + base.getUnlocalisedName(), true); - } - - public static boolean tryUnlock(EntityPlayer player, InformationBase base) - { - if(base.isPreUnlocked() || !canUnlockInfo(player, base)) - { + } + + public static boolean tryUnlock(EntityPlayer player, InformationBase base) { + if (base.isPreUnlocked() || !canUnlockInfo(player, base)) { return false; } NBTTagCompound nbt = getNBT(player); - if(!nbt.hasKey("Research_" + base.getUnlocalisedName())) - { + if (!nbt.hasKey("Research_" + base.getUnlocalisedName())) { nbt.setBoolean("Research_" + base.getUnlocalisedName(), true); return true; } return false; - } - - public static boolean hasInfoUnlocked(EntityPlayer player, InformationBase base) - { - if(base.isPreUnlocked())return base.parentInfo == null || hasInfoUnlocked(player, base.parentInfo); - + } + + public static boolean hasInfoUnlocked(EntityPlayer player, InformationBase base) { + if (base.isPreUnlocked()) + return base.parentInfo == null || hasInfoUnlocked(player, base.parentInfo); + NBTTagCompound nbt = getNBT(player); String basename = base.getUnlocalisedName(); - if(nbt.hasKey("Research_" + basename)) - { + if (nbt.hasKey("Research_" + basename)) { return nbt.getBoolean("Research_" + basename); } - return false; - } - - public static boolean hasInfoUnlocked(EntityPlayer player, String basename) - { + return false; + } + + public static boolean hasInfoUnlocked(EntityPlayer player, String basename) { InformationBase base = getResearch(basename); - if(base != null) - { + if (base != null) { return hasInfoUnlocked(player, base); } - return true; - } - - public static boolean hasInfoUnlocked(EntityPlayer player, String[] basenames) - { - for(String basename : basenames) - { + return true; + } + + public static boolean hasInfoUnlocked(EntityPlayer player, String[] basenames) { + for (String basename : basenames) { InformationBase base = InformationList.nameMap.get(basename); - if(base != null) - { - if(!hasInfoUnlocked(player, base)) - { + if (base != null) { + if (!hasInfoUnlocked(player, base)) { return false; } } } - return true; - } - - private static NBTTagCompound getNBT(EntityPlayer player) - { - NBTTagCompound persistant = PlayerTagData.getPersistedData(player); - if(!persistant.hasKey(KnowledgeNBT)) - { - NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger("Layer", knowledgelyr); - persistant.setTag(KnowledgeNBT, tag); - } - NBTTagCompound load = persistant.getCompoundTag(KnowledgeNBT); - if(load.getInteger("Layer") != knowledgelyr) - { - persistant.removeTag(KnowledgeNBT); - - NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger("Layer", knowledgelyr); - persistant.setTag(KnowledgeNBT, tag); - } + return true; + } + + private static NBTTagCompound getNBT(EntityPlayer player) { + NBTTagCompound persistant = PlayerTagData.getPersistedData(player); + if (!persistant.hasKey(KnowledgeNBT)) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("Layer", knowledgelyr); + persistant.setTag(KnowledgeNBT, tag); + } + NBTTagCompound load = persistant.getCompoundTag(KnowledgeNBT); + if (load.getInteger("Layer") != knowledgelyr) { + persistant.removeTag(KnowledgeNBT); + + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("Layer", knowledgelyr); + persistant.setTag(KnowledgeNBT, tag); + } return load; } /** - * Returns true if the parent has been unlocked, or there is no parent - */ - public static boolean canUnlockInfo(EntityPlayer player, InformationBase base) - { - return base.parentInfo == null || hasInfoUnlocked(player, base.parentInfo); - } - - @SideOnly(Side.CLIENT) - public static int func_150874_c(EntityPlayer player, InformationBase base) - { - if (hasInfoUnlocked(player, base)) - { - return 0; - } - else - { - int i = 0; - - for (InformationBase knowledge1 = base.parentInfo; knowledge1 != null && !hasInfoUnlocked(player, knowledge1); ++i) - { - knowledge1 = knowledge1.parentInfo; - } - return i; - } - } - - public static final String KnowledgeNBT = "Knowledge"; - public static int knowledgelyr = 0; - public static void syncData(EntityPlayer player) - { - if(!player.worldObj.isRemote) - { - ((WorldServer)player.worldObj).getEntityTracker().func_151248_b(player, new KnowledgePacket(player).generatePacket()); + * Returns true if the parent has been unlocked, or there is no parent + */ + public static boolean canUnlockInfo(EntityPlayer player, InformationBase base) { + return base.parentInfo == null || hasInfoUnlocked(player, base.parentInfo); + } + + @SideOnly(Side.CLIENT) + public static int func_150874_c(EntityPlayer player, InformationBase base) { + if (hasInfoUnlocked(player, base)) { + return 0; + } else { + int i = 0; + + for (InformationBase knowledge1 = base.parentInfo; knowledge1 != null + && !hasInfoUnlocked(player, knowledge1); ++i) { + knowledge1 = knowledge1.parentInfo; + } + return i; + } + } + + public static final String KnowledgeNBT = "Knowledge"; + public static int knowledgelyr = 0; + + public static void syncData(EntityPlayer player) { + if (!player.worldObj.isRemote) { + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new KnowledgePacket(player).generatePacket()); } - } - public static InformationBase getResearch(String researchName) - { + } + + public static InformationBase getResearch(String researchName) { return InformationList.nameMap.get(researchName.toLowerCase()); } - - public static int getArtefactCount(String research, EntityPlayer user) - { + + public static int getArtefactCount(String research, EntityPlayer user) { NBTTagCompound nbt = getNBT(user); - return nbt.getInteger("ArtefactCount-"+research); + return nbt.getInteger("ArtefactCount-" + research); } - public static void setArtefactCount(String research, EntityPlayer user, int count) - { + + public static void setArtefactCount(String research, EntityPlayer user, int count) { NBTTagCompound nbt = getNBT(user); - nbt.setInteger("ArtefactCount-"+research, count); + nbt.setInteger("ArtefactCount-" + research, count); } - public static int addArtefact(String research, EntityPlayer user) - { + + public static int addArtefact(String research, EntityPlayer user) { int count = getArtefactCount(research, user); ++count; setArtefactCount(research, user, count); return count; } - public static void addArtefactUsed(EntityPlayer user, InformationBase base, ItemStack item) - { + + public static void addArtefactUsed(EntityPlayer user, InformationBase base, ItemStack item) { NBTTagCompound nbt = getNBT(user); nbt.setBoolean(getKeyName(item, base), true); } - public static boolean alreadyUsedArtefact(EntityPlayer user, InformationBase base, ItemStack item) - { + + public static boolean alreadyUsedArtefact(EntityPlayer user, InformationBase base, ItemStack item) { NBTTagCompound nbt = getNBT(user); - if(nbt.hasKey(getKeyName(item, base))) - { + if (nbt.hasKey(getKeyName(item, base))) { return true; } return false; } - private static String getKeyName(ItemStack item, InformationBase base) - { - return "research_"+base.getUnlocalisedName() + "_" + item.getUnlocalizedName() + "_" + item.getItemDamage(); + + private static String getKeyName(ItemStack item, InformationBase base) { + return "research_" + base.getUnlocalisedName() + "_" + item.getUnlocalizedName() + "_" + item.getItemDamage(); } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPage.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPage.java index 385b2f1e..a03c0004 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPage.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPage.java @@ -1,17 +1,17 @@ package minefantasy.mf2.api.knowledge.client; -import net.minecraft.client.gui.GuiScreen; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.GuiScreen; @SideOnly(Side.CLIENT) -public abstract class EntryPage -{ +public abstract class EntryPage { public static final int universalBookImageWidth = 178; public static final int universalBookImageHeight = 227; - + public abstract void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick); + public abstract void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick); - - public static int[]recipeOffsets = new int[]{15, 22}; + + public static int[] recipeOffsets = new int[] { 15, 22 }; } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageBlastFurnace.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageBlastFurnace.java index 96d68fb0..c9a829c0 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageBlastFurnace.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageBlastFurnace.java @@ -7,11 +7,6 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import cpw.mods.fml.relauncher.ReflectionHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.MineFantasyAPI; -import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -19,57 +14,47 @@ import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; -public class EntryPageBlastFurnace extends EntryPage -{ +public class EntryPageBlastFurnace extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); private ItemStack input, output; - - public EntryPageBlastFurnace(ItemStack in, ItemStack out) - { + + public EntryPageBlastFurnace(ItemStack in, ItemStack out) { this.input = in; this.output = out; } - - public EntryPageBlastFurnace(Item i1, ItemStack i2) - { + + public EntryPageBlastFurnace(Item i1, ItemStack i2) { this(new ItemStack(i1), i2); } - - public EntryPageBlastFurnace(Item i1, Item i2) - { + + public EntryPageBlastFurnace(Item i1, Item i2) { this(new ItemStack(i1), new ItemStack(i2)); } @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { tooltipStack = null; - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/blastfurnaceGrid.png")); + + this.mc.getTextureManager() + .bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/blastfurnaceGrid.png")); parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - String cft = "<" + StatCollector.translateToLocal("method.blastfurnace") + ">"; - mc.fontRenderer.drawSplitString(cft, posX+(universalBookImageWidth/2) - (mc.fontRenderer.getStringWidth(cft)/2), posY+150, 117, 0); - - renderRecipe(parent, x, y, f, posX, posY); - if(tooltipStack != null) - { + + String cft = "<" + StatCollector.translateToLocal("method.blastfurnace") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); + + renderRecipe(parent, x, y, f, posX, posY); + if (tooltipStack != null) { List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); List parsedTooltip = new ArrayList(); boolean first = true; - for(String s : tooltipData) - { + for (String s : tooltipData) { String s_ = s; - if(!first) + if (!first) s_ = EnumChatFormatting.GRAY + s; parsedTooltip.add(s_); first = false; @@ -77,39 +62,38 @@ public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); } - + } - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) - { - renderResult(parent, output, false, posX, posY+74, mx, my); + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { + renderResult(parent, output, false, posX, posY + 74, mx, my); renderResult(parent, input, false, posX, posY, mx, my); } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); - if(stack.getItemDamage() == Short.MAX_VALUE) + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); int xPos = xOrigin + 80; int yPos = yOrigin + 41; ItemStack stack1 = stack.copy(); - if(stack1.getItemDamage() == -1) + if (stack1.getItemDamage() == -1) stack1.setItemDamage(0); renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); } - + private ItemStack tooltipStack; - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, int my) - { + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { RenderItem render = new RenderItem(); - if(mx > xPos && mx < (xPos+16) && my > yPos && my < (yPos+16)) - { + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { tooltipStack = stack; } boolean mouseDown = Mouse.isButtonDown(0); @@ -120,8 +104,10 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); RenderHelper.disableStandardItemLighting(); GL11.glPopMatrix(); @@ -129,7 +115,6 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole } @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCraft.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCraft.java index eb8bc97d..95429770 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCraft.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCraft.java @@ -1,66 +1,47 @@ package minefantasy.mf2.api.knowledge.client; -import cpw.mods.fml.relauncher.ReflectionHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.item.crafting.ShapelessRecipes; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; -public class EntryPageCraft extends EntryPage -{ +public class EntryPageCraft extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); - private IRecipe[] recipes = new IRecipe[]{}; + private IRecipe[] recipes = new IRecipe[] {}; public static int switchRate = 15; private int recipeID; - - public EntryPageCraft(IRecipe... recipes) - { + + public EntryPageCraft(IRecipe... recipes) { this.recipes = recipes; } - + @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { - if(onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + if (onTick) { tickRecipes(); } - + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/craftGrid.png")); - parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - IRecipe recipe = recipes[recipeID]; - renderRecipe(parent, x, y, f, posX, posY, recipe); - + parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); + + IRecipe recipe = recipes[recipeID]; + renderRecipe(parent, x, y, f, posX, posY, recipe); + } - private void renderRecipe(GuiScreen parent, int x, int y, float f, int posX, int posY, IRecipe recipe) - { - //TODO: Render Grid + private void renderRecipe(GuiScreen parent, int x, int y, float f, int posX, int posY, IRecipe recipe) { + // TODO: Render Grid } - private void tickRecipes() - { - if(recipeID < recipes.length-1) - { + private void tickRecipes() { + if (recipeID < recipes.length - 1) { ++recipeID; - } - else - { + } else { recipeID = 0; } } @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCrucible.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCrucible.java index a1cbc8e3..c6add8da 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCrucible.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCrucible.java @@ -7,11 +7,6 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import cpw.mods.fml.relauncher.ReflectionHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.MineFantasyAPI; -import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.refine.Alloy; import net.minecraft.client.Minecraft; @@ -19,59 +14,48 @@ import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; -public class EntryPageCrucible extends EntryPage -{ +public class EntryPageCrucible extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); - private Alloy[] recipes = new Alloy[]{}; + private Alloy[] recipes = new Alloy[] {}; public static int switchRate = 15; private int recipeID; private boolean shapelessRecipe = false; private boolean oreDictRecipe = false; - - public EntryPageCrucible(Alloy... recipes) - { + + public EntryPageCrucible(Alloy... recipes) { this.recipes = recipes; } - + @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { - if(onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + if (onTick) { tickRecipes(); } tooltipStack = null; - + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/crucible.png")); parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - Alloy recipe = recipes[recipeID]; - String cft = "<" + StatCollector.translateToLocal("method."+getName()+"") + ">"; - mc.fontRenderer.drawSplitString(cft, posX+(universalBookImageWidth/2) - (mc.fontRenderer.getStringWidth(cft)/2), posY+175, 117, 0); - if(recipe != null) - { - currTier = recipe.getLevel(); - } - renderRecipe(parent, x, y, f, posX, posY, recipe); - - if(tooltipStack != null) - { + + Alloy recipe = recipes[recipeID]; + String cft = "<" + StatCollector.translateToLocal("method." + getName() + "") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 175, 117, 0); + if (recipe != null) { + currTier = recipe.getLevel(); + } + renderRecipe(parent, x, y, f, posX, posY, recipe); + + if (tooltipStack != null) { List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); List parsedTooltip = new ArrayList(); boolean first = true; - for(String s : tooltipData) - { + for (String s : tooltipData) { String s_ = s; - if(!first) + if (!first) s_ = EnumChatFormatting.GRAY + s; parsedTooltip.add(s_); first = false; @@ -80,89 +64,82 @@ public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); } } + private int currTier; - protected String getName() - { + protected String getName() { return currTier == 3 ? "crucibleT4" : currTier == 2 ? "crucibleT3" : currTier == 1 ? "crucibleT2" : "crucible"; } - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, Alloy recipe) - { - drawGrid: - { - for(int y = 0; y < 3; y++) - { - for(int x = 0; x < 3; x++) - { + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, Alloy recipe) { + drawGrid: { + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { int index = y * 3 + x; - - if(index >= recipe.recipeItems.size()) - { + + if (index >= recipe.recipeItems.size()) { break drawGrid; } - - renderItemAtGridPos(parent, 1 + x, (3-y), (ItemStack) recipe.recipeItems.get(index), true, posX, posY, mx, my); + + renderItemAtGridPos(parent, 1 + x, (3 - y), (ItemStack) recipe.recipeItems.get(index), true, posX, + posY, mx, my); } } } - + renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my); } - private void tickRecipes() - { - if(recipeID < recipes.length-1) - { + + private void tickRecipes() { + if (recipeID < recipes.length - 1) { ++recipeID; - } - else - { + } else { recipeID = 0; } } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); - if(stack.getItemDamage() == Short.MAX_VALUE) + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); int xPos = xOrigin + 80; int yPos = yOrigin + 144; ItemStack stack1 = stack.copy(); - if(stack1.getItemDamage() == -1) + if (stack1.getItemDamage() == -1) stack1.setItemDamage(0); renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); } - - public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, + int xOrigin, int yOrigin, int mx, int my) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); - if(stack.getItemDamage() == Short.MAX_VALUE) + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); - int xPos = xOrigin + x * 29 + 7 + (y == 0 && x == 3 ? 10 : 0); + int xPos = xOrigin + x * 29 + 7 + (y == 0 && x == 3 ? 10 : 0); int yPos = yOrigin + y * 29 - 9 - (y == 0 ? 7 : 0); ItemStack stack1 = stack.copy(); - if(stack1.getItemDamage() == -1) + if (stack1.getItemDamage() == -1) stack1.setItemDamage(0); - renderItem(gui, xPos+15, yPos+22, stack1, accountForContainer, mx, my); + renderItem(gui, xPos + 15, yPos + 22, stack1, accountForContainer, mx, my); } - + private ItemStack tooltipStack; - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, int my) - { + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { RenderItem render = new RenderItem(); - if(mx > xPos && mx < (xPos+16) && my > yPos && my < (yPos+16)) - { + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { tooltipStack = stack; } boolean mouseDown = Mouse.isButtonDown(0); @@ -173,8 +150,10 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); RenderHelper.disableStandardItemLighting(); GL11.glPopMatrix(); @@ -182,7 +161,6 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole } @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageGrind.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageGrind.java index 61866bfa..19f6e73d 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageGrind.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageGrind.java @@ -7,11 +7,6 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import cpw.mods.fml.relauncher.ReflectionHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.MineFantasyAPI; -import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -19,52 +14,42 @@ import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; -public class EntryPageGrind extends EntryPage -{ +public class EntryPageGrind extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); private ItemStack input, output; - - public EntryPageGrind(ItemStack in, ItemStack out) - { + + public EntryPageGrind(ItemStack in, ItemStack out) { this.input = in; this.output = out; } - - public EntryPageGrind(Item in, Item out) - { + + public EntryPageGrind(Item in, Item out) { this(new ItemStack(in), new ItemStack(out)); } @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { tooltipStack = null; - + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/grindGrid.png")); parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - String cft = "<" + StatCollector.translateToLocal("method.quern") + ">"; - mc.fontRenderer.drawSplitString(cft, posX+(universalBookImageWidth/2) - (mc.fontRenderer.getStringWidth(cft)/2), posY+150, 117, 0); - - renderRecipe(parent, x, y, f, posX, posY); - if(tooltipStack != null) - { + + String cft = "<" + StatCollector.translateToLocal("method.quern") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); + + renderRecipe(parent, x, y, f, posX, posY); + if (tooltipStack != null) { List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); List parsedTooltip = new ArrayList(); boolean first = true; - for(String s : tooltipData) - { + for (String s : tooltipData) { String s_ = s; - if(!first) + if (!first) s_ = EnumChatFormatting.GRAY + s; parsedTooltip.add(s_); first = false; @@ -72,39 +57,38 @@ public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); } - + } - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) - { - renderResult(parent, output, false, posX, posY+74, mx, my); + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { + renderResult(parent, output, false, posX, posY + 74, mx, my); renderResult(parent, input, false, posX, posY, mx, my); } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); - if(stack.getItemDamage() == Short.MAX_VALUE) + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); int xPos = xOrigin + 80; int yPos = yOrigin + 41; ItemStack stack1 = stack.copy(); - if(stack1.getItemDamage() == -1) + if (stack1.getItemDamage() == -1) stack1.setItemDamage(0); renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); } - + private ItemStack tooltipStack; - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, int my) - { + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { RenderItem render = new RenderItem(); - if(mx > xPos && mx < (xPos+16) && my > yPos && my < (yPos+16)) - { + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { tooltipStack = stack; } boolean mouseDown = Mouse.isButtonDown(0); @@ -115,8 +99,10 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); RenderHelper.disableStandardItemLighting(); GL11.glPopMatrix(); @@ -124,7 +110,6 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole } @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageImage.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageImage.java index b99216df..b1bd3df1 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageImage.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageImage.java @@ -1,7 +1,5 @@ package minefantasy.mf2.api.knowledge.client; -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.RenderHelper; import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; @@ -9,8 +7,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -public class EntryPageImage extends EntryPage -{ +public class EntryPageImage extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); private String paragraph; /** @@ -18,84 +15,65 @@ public class EntryPageImage extends EntryPage */ private String image; private int[] sizes; - - public EntryPageImage(String tex, String paragraphs) - { + + public EntryPageImage(String tex, String paragraphs) { this(tex, 128, 128, paragraphs); } - public EntryPageImage(String tex, int width, int height, String paragraphs) - { + + public EntryPageImage(String tex, int width, int height, String paragraphs) { this.paragraph = paragraphs; this.image = tex; - this.sizes = new int[]{width, height}; + this.sizes = new int[] { width, height }; } + @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { String local = StatCollector.translateToLocal(paragraph); String text = ""; String temp = ""; boolean prefix = false; - for(int a = 0; a < local.length(); a++) - { + for (int a = 0; a < local.length(); a++) { char c = local.charAt(a); - if(a == local.length()-1) - { + if (a == local.length() - 1) { text = text + temp + c; temp = ""; - } - else if(prefix) - { - if(c == "h".charAt(0)) - { + } else if (prefix) { + if (c == "h".charAt(0)) { text = text + temp + EnumChatFormatting.DARK_BLUE + EnumChatFormatting.BOLD; temp = ""; - } - else if(c == "d".charAt(0)) - { + } else if (c == "d".charAt(0)) { text = text + temp + EnumChatFormatting.DARK_RED; temp = ""; - } - else if(c == "y".charAt(0)) - { + } else if (c == "y".charAt(0)) { text = text + temp + EnumChatFormatting.GOLD; temp = ""; - } - else if(c == "u".charAt(0)) - { + } else if (c == "u".charAt(0)) { text = text + temp + EnumChatFormatting.UNDERLINE; temp = ""; - } - else if(c == "r".charAt(0)) - { + } else if (c == "r".charAt(0)) { text = text + temp + EnumChatFormatting.RESET + EnumChatFormatting.BLACK; temp = ""; } prefix = false; - } - else if(c == "^".charAt(0)) - { + } else if (c == "^".charAt(0)) { text = text + temp + "\n\n"; temp = ""; - } - else if(c == "$".charAt(0)) - { + } else if (c == "$".charAt(0)) { prefix = true; - } - else - { + } else { temp = temp + c; } } - - mc.fontRenderer.drawSplitString(text, posX+14, posY+117, 155, 0); + + mc.fontRenderer.drawSplitString(text, posX + 14, posY + 117, 155, 0); } + @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { mc.renderEngine.bindTexture(TextureHelperMF.getResource(image)); - int xOffset = (universalBookImageWidth - sizes[0]) /2; - RenderHelper.drawTexturedModalRect(posX + xOffset, posY+15, 2, 0, 0, sizes[0], sizes[1], 1F/(float)sizes[0], 1F/(float)sizes[1]); + int xOffset = (universalBookImageWidth - sizes[0]) / 2; + RenderHelper.drawTexturedModalRect(posX + xOffset, posY + 15, 2, 0, 0, sizes[0], sizes[1], 1F / sizes[0], + 1F / sizes[1]); } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeAnvil.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeAnvil.java index b4d6c96b..837b60af 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeAnvil.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeAnvil.java @@ -3,22 +3,15 @@ import java.util.ArrayList; import java.util.List; -import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import cpw.mods.fml.relauncher.ReflectionHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; import minefantasy.mf2.api.crafting.anvil.ShapedAnvilRecipes; import minefantasy.mf2.api.crafting.anvil.ShapelessAnvilRecipes; import minefantasy.mf2.api.heating.Heatable; -import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.helpers.GuiHelper; import minefantasy.mf2.api.helpers.TextureHelperMF; -import minefantasy.mf2.item.list.ComponentListMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.RenderHelper; @@ -26,60 +19,52 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; -public class EntryPageRecipeAnvil extends EntryPage -{ +public class EntryPageRecipeAnvil extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); - private IAnvilRecipe[] recipes = new IAnvilRecipe[]{}; + private IAnvilRecipe[] recipes = new IAnvilRecipe[] {}; public static int switchRate = 15; private int recipeID; private boolean shapelessRecipe = false; private boolean oreDictRecipe = false; - - public EntryPageRecipeAnvil(List recipes) - { + + public EntryPageRecipeAnvil(List recipes) { IAnvilRecipe[] array = new IAnvilRecipe[recipes.size()]; - for(int a = 0; a < recipes.size(); a++) - { + for (int a = 0; a < recipes.size(); a++) { array[a] = recipes.get(a); } this.recipes = array; - + } - public EntryPageRecipeAnvil(IAnvilRecipe... recipes) - { + + public EntryPageRecipeAnvil(IAnvilRecipe... recipes) { this.recipes = recipes; } - + @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { tooltipStack = null; - if(onTick) - { + if (onTick) { tickRecipes(); } - + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/anvilGrid.png")); parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - IAnvilRecipe recipe = recipes[recipeID]; - String cft = "<" + StatCollector.translateToLocal("method.anvil") + ">"; - mc.fontRenderer.drawSplitString(cft, posX+(universalBookImageWidth/2) - (mc.fontRenderer.getStringWidth(cft)/2), posY+150, 117, 0); - renderRecipe(parent, x, y, f, posX, posY, recipe); - - if(tooltipStack != null) - { + + IAnvilRecipe recipe = recipes[recipeID]; + String cft = "<" + StatCollector.translateToLocal("method.anvil") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); + renderRecipe(parent, x, y, f, posX, posY, recipe); + + if (tooltipStack != null) { List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); List parsedTooltip = new ArrayList(); boolean first = true; - for(String s : tooltipData) - { + for (String s : tooltipData) { String s_ = s; - if(!first) + if (!first) s_ = EnumChatFormatting.GRAY + s; parsedTooltip.add(s_); first = false; @@ -87,134 +72,128 @@ public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); } - + } - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, IAnvilRecipe recipe) - { - if(recipe == null)return; + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, IAnvilRecipe recipe) { + if (recipe == null) + return; shapelessRecipe = false; oreDictRecipe = false; - + GL11.glColor3f(255, 255, 255); - GuiHelper.renderToolIcon(parent, recipe.getToolType(), recipe.getRecipeHammer(), posX+34, posY+51, true, true); - GuiHelper.renderToolIcon(parent, "anvil", recipe.getAnvil(), posX+124, posY+51, true, true); - - if(recipe instanceof ShapedAnvilRecipes) - { - ShapedAnvilRecipes shaped = (ShapedAnvilRecipes)recipe; - - for(int y = 0; y < shaped.recipeHeight; y++) - { - for(int x = 0; x < shaped.recipeWidth; x++) - { - renderItemAtGridPos(parent, 1 + x, 1 + y, shaped.recipeItems[y * shaped.recipeWidth + x], true, posX, posY, mx, my); + GuiHelper.renderToolIcon(parent, recipe.getToolType(), recipe.getRecipeHammer(), posX + 34, posY + 51, true, + true); + GuiHelper.renderToolIcon(parent, "anvil", recipe.getAnvil(), posX + 124, posY + 51, true, true); + + if (recipe instanceof ShapedAnvilRecipes) { + ShapedAnvilRecipes shaped = (ShapedAnvilRecipes) recipe; + + for (int y = 0; y < shaped.recipeHeight; y++) { + for (int x = 0; x < shaped.recipeWidth; x++) { + renderItemAtGridPos(parent, 1 + x, 1 + y, shaped.recipeItems[y * shaped.recipeWidth + x], true, + posX, posY, mx, my); } } - } - else if(recipe instanceof ShapelessAnvilRecipes) - { + } else if (recipe instanceof ShapelessAnvilRecipes) { ShapelessAnvilRecipes shapeless = (ShapelessAnvilRecipes) recipe; - drawGrid : - { - for(int y = 0; y < 6; y++) - { - for(int x = 0; x < 4; x++) - { + drawGrid: { + for (int y = 0; y < 6; y++) { + for (int x = 0; x < 4; x++) { int index = y * 6 + x; - if(index >= shapeless.recipeItems.size()) + if (index >= shapeless.recipeItems.size()) break drawGrid; - renderItemAtGridPos(parent, 1 + x, 1 + y, (ItemStack) shapeless.recipeItems.get(index), true, posX, posY, mx, my); + renderItemAtGridPos(parent, 1 + x, 1 + y, (ItemStack) shapeless.recipeItems.get(index), true, + posX, posY, mx, my); } } } shapelessRecipe = true; - } + } renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my, recipe.outputHot()); } - private void tickRecipes() - { - if(recipeID < recipes.length-1) - { + + private void tickRecipes() { + if (recipeID < recipes.length - 1) { ++recipeID; - } - else - { + } else { recipeID = 0; } } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my, boolean hot) - { - if(stack == null || stack.getItem() == null) + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my, boolean hot) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); - if(stack.getItemDamage() == Short.MAX_VALUE) + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); - if(stack.getItemDamage() == -1) + if (stack.getItemDamage() == -1) stack.setItemDamage(0); - + int xPos = xOrigin + 80; int yPos = yOrigin + 42; renderItem(gui, xPos, yPos, stack, accountForContainer, mx, my, hot); } - - public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, + int xOrigin, int yOrigin, int mx, int my) { + if (stack == null || stack.getItem() == null) return; - + boolean heatable = Heatable.canHeatItem(stack); - + stack = stack.copy(); int gridSize = 18; - - if(stack.getItemDamage() == Short.MAX_VALUE) + + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); - if(stack.getItemDamage() == -1) + if (stack.getItemDamage() == -1) stack.setItemDamage(0); - x-=1; - y-=1; + x -= 1; + y -= 1; int xPos = xOrigin + (x * gridSize) + 36; int yPos = yOrigin + (y * gridSize) + 76; - + renderItem(gui, xPos, yPos, stack, accountForContainer, mx, my, heatable); } - + private ItemStack tooltipStack; - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, int my, boolean heatable) - { - if(heatable) - { + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my, boolean heatable) { + if (heatable) { GL11.glPushMatrix(); GL11.glColor3f(255, 255, 255); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/anvilGrid.png")); - gui.drawTexturedModalRect(xPos, yPos, 248, 0, 8,8); + this.mc.getTextureManager() + .bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/anvilGrid.png")); + gui.drawTexturedModalRect(xPos, yPos, 248, 0, 8, 8); GL11.glPopMatrix(); } - + RenderItem render = new RenderItem(); - if(mx > xPos && mx < (xPos+16) && my > yPos && my < (yPos+16)) - { + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { tooltipStack = stack; } - + GL11.glPushMatrix(); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); RenderHelper.disableStandardItemLighting(); GL11.glPopMatrix(); @@ -222,7 +201,6 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole } @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBase.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBase.java index abc94a02..909516b5 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBase.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBase.java @@ -8,10 +8,6 @@ import org.lwjgl.opengl.GL12; import cpw.mods.fml.relauncher.ReflectionHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.MineFantasyAPI; -import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -26,58 +22,51 @@ import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; -public class EntryPageRecipeBase extends EntryPage -{ +public class EntryPageRecipeBase extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); - private IRecipe[] recipes = new IRecipe[]{}; + private IRecipe[] recipes = new IRecipe[] {}; public static int switchRate = 15; private int recipeID; private boolean shapelessRecipe = false; private boolean oreDictRecipe = false; - - public EntryPageRecipeBase(List recipes) - { + + public EntryPageRecipeBase(List recipes) { IRecipe[] array = new IRecipe[recipes.size()]; - for(int a = 0; a < recipes.size(); a++) - { + for (int a = 0; a < recipes.size(); a++) { array[a] = recipes.get(a); } this.recipes = array; - + } - - public EntryPageRecipeBase(IRecipe... recipes) - { + + public EntryPageRecipeBase(IRecipe... recipes) { this.recipes = recipes; } - + @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { - if(onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + if (onTick) { tickRecipes(); } tooltipStack = null; - + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/craftGrid.png")); parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - IRecipe recipe = recipes[recipeID]; - String cft = "<" + StatCollector.translateToLocal("method.workbench") + ">"; - mc.fontRenderer.drawSplitString(cft, posX+(universalBookImageWidth/2) - (mc.fontRenderer.getStringWidth(cft)/2), posY+175, 117, 0); - renderRecipe(parent, x, y, f, posX, posY, recipe); - - if(tooltipStack != null) - { + + IRecipe recipe = recipes[recipeID]; + String cft = "<" + StatCollector.translateToLocal("method.workbench") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 175, 117, 0); + renderRecipe(parent, x, y, f, posX, posY, recipe); + + if (tooltipStack != null) { List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); List parsedTooltip = new ArrayList(); boolean first = true; - for(String s : tooltipData) - { + for (String s : tooltipData) { String s_ = s; - if(!first) + if (!first) s_ = EnumChatFormatting.GRAY + s; parsedTooltip.add(s_); first = false; @@ -87,81 +76,68 @@ public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, } } - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, IRecipe recipe) - { + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, IRecipe recipe) { shapelessRecipe = false; oreDictRecipe = false; - - if(recipe instanceof ShapedRecipes) - { - ShapedRecipes shaped = (ShapedRecipes)recipe; - - for(int y = 0; y < shaped.recipeHeight; y++) - { - for(int x = 0; x < shaped.recipeWidth; x++) - { - renderItemAtGridPos(parent, x, y, shaped.recipeItems[y * shaped.recipeWidth + x], true, posX, posY, mx, my); + + if (recipe instanceof ShapedRecipes) { + ShapedRecipes shaped = (ShapedRecipes) recipe; + + for (int y = 0; y < shaped.recipeHeight; y++) { + for (int x = 0; x < shaped.recipeWidth; x++) { + renderItemAtGridPos(parent, x, y, shaped.recipeItems[y * shaped.recipeWidth + x], true, posX, posY, + mx, my); } } - } - else if(recipe instanceof ShapedOreRecipe) - { + } else if (recipe instanceof ShapedOreRecipe) { ShapedOreRecipe shaped = (ShapedOreRecipe) recipe; int width = (Integer) ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, shaped, 4); int height = (Integer) ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, shaped, 5); - for(int y = 0; y < height; y++) - { - for(int x = 0; x < width; x++) - { + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { Object input = shaped.getInput()[y * width + x]; - if(input != null) - renderItemAtGridPos(parent, x, y, input instanceof ItemStack ? (ItemStack) input : ((ArrayList) input).get(0), true, posX, posY, mx, my); + if (input != null) + renderItemAtGridPos(parent, x, y, + input instanceof ItemStack ? (ItemStack) input : ((ArrayList) input).get(0), + true, posX, posY, mx, my); } } oreDictRecipe = true; - } - else if(recipe instanceof ShapelessRecipes) - { + } else if (recipe instanceof ShapelessRecipes) { ShapelessRecipes shapeless = (ShapelessRecipes) recipe; - drawGrid : - { - for(int y = 0; y < 3; y++) - { - for(int x = 0; x < 3; x++) - { + drawGrid: { + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { int index = y * 3 + x; - if(index >= shapeless.recipeItems.size()) + if (index >= shapeless.recipeItems.size()) break drawGrid; - renderItemAtGridPos(parent, x, y, (ItemStack) shapeless.recipeItems.get(index), true, posX, posY, mx, my); + renderItemAtGridPos(parent, x, y, (ItemStack) shapeless.recipeItems.get(index), true, posX, + posY, mx, my); } } } shapelessRecipe = true; - } - else if(recipe instanceof ShapelessOreRecipe) - { + } else if (recipe instanceof ShapelessOreRecipe) { ShapelessOreRecipe shapeless = (ShapelessOreRecipe) recipe; - drawGrid : - { - for(int y = 0; y < 3; y++) - { - for(int x = 0; x < 3; x++) - { + drawGrid: { + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { int index = y * 3 + x; - if(index >= shapeless.getRecipeSize()) + if (index >= shapeless.getRecipeSize()) break drawGrid; Object input = shapeless.getInput().get(index); - if(input != null) - renderItemAtGridPos(parent, x, y, input instanceof ItemStack ? (ItemStack) input : ((ArrayList) input).get(0), true, posX, posY, mx, my); + if (input != null) + renderItemAtGridPos(parent, x, y, input instanceof ItemStack ? (ItemStack) input + : ((ArrayList) input).get(0), true, posX, posY, mx, my); } } } @@ -172,68 +148,65 @@ else if(recipe instanceof ShapelessOreRecipe) renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my); } - private void tickRecipes() - { - if(recipeID < recipes.length-1) - { + + private void tickRecipes() { + if (recipeID < recipes.length - 1) { ++recipeID; - } - else - { + } else { recipeID = 0; } } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); - if(stack.getItemDamage() == Short.MAX_VALUE) + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); int xPos = xOrigin + 80; int yPos = yOrigin + 42; ItemStack stack1 = stack.copy(); - if(stack1.getItemDamage() == -1) + if (stack1.getItemDamage() == -1) stack1.setItemDamage(0); renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); } - - public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, + int xOrigin, int yOrigin, int mx, int my) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); - if(stack.getItemDamage() == Short.MAX_VALUE) + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); int xPos = xOrigin + (x * 29) + 51; int yPos = yOrigin + (y * 29) + 86; ItemStack stack1 = stack.copy(); - if(stack1.getItemDamage() == -1) + if (stack1.getItemDamage() == -1) stack1.setItemDamage(0); renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); } - - public int getGridX() - { + + public int getGridX() { return 7; } - public int getGridY() - { + + public int getGridY() { return 36; } + private ItemStack tooltipStack; - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, int my) - { + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { RenderItem render = new RenderItem(); - if(mx > xPos && mx < (xPos+16) && my > yPos && my < (yPos+16)) - { + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { tooltipStack = stack; } boolean mouseDown = Mouse.isButtonDown(0); @@ -244,8 +217,10 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); RenderHelper.disableStandardItemLighting(); GL11.glPopMatrix(); @@ -253,7 +228,6 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole } @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBloom.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBloom.java index 13b00544..d72e0487 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBloom.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBloom.java @@ -7,11 +7,6 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import cpw.mods.fml.relauncher.ReflectionHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.MineFantasyAPI; -import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -19,53 +14,42 @@ import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; -public class EntryPageRecipeBloom extends EntryPage -{ +public class EntryPageRecipeBloom extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); private ItemStack input, output; - - public EntryPageRecipeBloom(ItemStack in, ItemStack out) - { + + public EntryPageRecipeBloom(ItemStack in, ItemStack out) { this.input = in; this.output = out; } - - public EntryPageRecipeBloom(Item in, Item out) - { + + public EntryPageRecipeBloom(Item in, Item out) { this(new ItemStack(in), new ItemStack(out)); } @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { tooltipStack = null; - - + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/bloomeryGrid.png")); parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - String cft = "<" + StatCollector.translateToLocal("method.bloomery") + ">"; - mc.fontRenderer.drawSplitString(cft, posX+(universalBookImageWidth/2) - (mc.fontRenderer.getStringWidth(cft)/2), posY+150, 117, 0); - - renderRecipe(parent, x, y, f, posX, posY); - if(tooltipStack != null) - { + + String cft = "<" + StatCollector.translateToLocal("method.bloomery") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); + + renderRecipe(parent, x, y, f, posX, posY); + if (tooltipStack != null) { List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); List parsedTooltip = new ArrayList(); boolean first = true; - for(String s : tooltipData) - { + for (String s : tooltipData) { String s_ = s; - if(!first) + if (!first) s_ = EnumChatFormatting.GRAY + s; parsedTooltip.add(s_); first = false; @@ -74,39 +58,38 @@ public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); } - + } - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) - { - renderResult(parent, output, false, posX, posY+74, mx, my); + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { + renderResult(parent, output, false, posX, posY + 74, mx, my); renderResult(parent, input, false, posX, posY, mx, my); } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); - if(stack.getItemDamage() == Short.MAX_VALUE) + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); int xPos = xOrigin + 80; int yPos = yOrigin + 41; ItemStack stack1 = stack.copy(); - if(stack1.getItemDamage() == -1) + if (stack1.getItemDamage() == -1) stack1.setItemDamage(0); renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); } - + private ItemStack tooltipStack; - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, int my) - { + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { RenderItem render = new RenderItem(); - if(mx > xPos && mx < (xPos+16) && my > yPos && my < (yPos+16)) - { + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { tooltipStack = stack; } boolean mouseDown = Mouse.isButtonDown(0); @@ -117,8 +100,10 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); RenderHelper.disableStandardItemLighting(); GL11.glPopMatrix(); @@ -126,7 +111,6 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole } @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeCarpenter.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeCarpenter.java index e33bb432..fa305691 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeCarpenter.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeCarpenter.java @@ -7,14 +7,9 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import cpw.mods.fml.relauncher.ReflectionHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; import minefantasy.mf2.api.crafting.carpenter.ShapedCarpenterRecipes; import minefantasy.mf2.api.crafting.carpenter.ShapelessCarpenterRecipes; -import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.helpers.GuiHelper; import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; @@ -24,60 +19,53 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; -public class EntryPageRecipeCarpenter extends EntryPage -{ +public class EntryPageRecipeCarpenter extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); - private ICarpenterRecipe[] recipes = new ICarpenterRecipe[]{}; + private ICarpenterRecipe[] recipes = new ICarpenterRecipe[] {}; public static int switchRate = 15; private int recipeID; private boolean shapelessRecipe = false; private boolean oreDictRecipe = false; - - public EntryPageRecipeCarpenter(List recipes) - { + + public EntryPageRecipeCarpenter(List recipes) { ICarpenterRecipe[] array = new ICarpenterRecipe[recipes.size()]; - for(int a = 0; a < recipes.size(); a++) - { + for (int a = 0; a < recipes.size(); a++) { array[a] = recipes.get(a); } this.recipes = array; - + } - public EntryPageRecipeCarpenter(ICarpenterRecipe... recipes) - { + + public EntryPageRecipeCarpenter(ICarpenterRecipe... recipes) { this.recipes = recipes; } - + @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { - if(onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + if (onTick) { tickRecipes(); } tooltipStack = null; - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/carpenterGrid.png")); + + this.mc.getTextureManager() + .bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/carpenterGrid.png")); parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - ICarpenterRecipe recipe = recipes[recipeID]; - String cft = "<" + StatCollector.translateToLocal("method.carpenter") + ">"; - mc.fontRenderer.drawSplitString(cft, posX+(universalBookImageWidth/2) - (mc.fontRenderer.getStringWidth(cft)/2), posY+175, 117, 0); - renderRecipe(parent, x, y, f, posX, posY, recipe); - - if(tooltipStack != null) - { + + ICarpenterRecipe recipe = recipes[recipeID]; + String cft = "<" + StatCollector.translateToLocal("method.carpenter") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 175, 117, 0); + renderRecipe(parent, x, y, f, posX, posY, recipe); + + if (tooltipStack != null) { List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); List parsedTooltip = new ArrayList(); boolean first = true; - for(String s : tooltipData) - { + for (String s : tooltipData) { String s_ = s; - if(!first) + if (!first) s_ = EnumChatFormatting.GRAY + s; parsedTooltip.add(s_); first = false; @@ -85,114 +73,107 @@ public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); } - + } - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, ICarpenterRecipe recipe) - { - if(parent == null)return; - if(recipe == null)return; + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, ICarpenterRecipe recipe) { + if (parent == null) + return; + if (recipe == null) + return; shapelessRecipe = false; oreDictRecipe = false; - + GL11.glColor3f(255, 255, 255); - GuiHelper.renderToolIcon(parent, recipe.getToolType(), recipe.getRecipeHammer(), posX+34, posY+51, true, true); - GuiHelper.renderToolIcon(parent, "carpenter", recipe.getAnvil(), posX+124, posY+51, true, true); - - if(recipe instanceof ShapedCarpenterRecipes) - { - ShapedCarpenterRecipes shaped = (ShapedCarpenterRecipes)recipe; - - for(int y = 0; y < shaped.recipeHeight; y++) - { - for(int x = 0; x < shaped.recipeWidth; x++) - { - renderItemAtGridPos(parent, 1 + x, 1 + y, shaped.recipeItems[y * shaped.recipeWidth + x], true, posX, posY, mx, my); + GuiHelper.renderToolIcon(parent, recipe.getToolType(), recipe.getRecipeHammer(), posX + 34, posY + 51, true, + true); + GuiHelper.renderToolIcon(parent, "carpenter", recipe.getAnvil(), posX + 124, posY + 51, true, true); + + if (recipe instanceof ShapedCarpenterRecipes) { + ShapedCarpenterRecipes shaped = (ShapedCarpenterRecipes) recipe; + + for (int y = 0; y < shaped.recipeHeight; y++) { + for (int x = 0; x < shaped.recipeWidth; x++) { + renderItemAtGridPos(parent, 1 + x, 1 + y, shaped.recipeItems[y * shaped.recipeWidth + x], true, + posX, posY, mx, my); } } - } - else if(recipe instanceof ShapelessCarpenterRecipes) - { + } else if (recipe instanceof ShapelessCarpenterRecipes) { ShapelessCarpenterRecipes shapeless = (ShapelessCarpenterRecipes) recipe; - drawGrid : - { - for(int y = 0; y < 4; y++) - { - for(int x = 0; x < 4; x++) - { + drawGrid: { + for (int y = 0; y < 4; y++) { + for (int x = 0; x < 4; x++) { int index = y * 4 + x; - if(index >= shapeless.recipeItems.size()) + if (index >= shapeless.recipeItems.size()) break drawGrid; - renderItemAtGridPos(parent, 1 + x, 1 + y, (ItemStack) shapeless.recipeItems.get(index), true, posX, posY, mx, my); + renderItemAtGridPos(parent, 1 + x, 1 + y, (ItemStack) shapeless.recipeItems.get(index), true, + posX, posY, mx, my); } } } shapelessRecipe = true; - } + } renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my); } - private void tickRecipes() - { - if(recipeID < recipes.length-1) - { + + private void tickRecipes() { + if (recipeID < recipes.length - 1) { ++recipeID; - } - else - { + } else { recipeID = 0; } } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); - if(stack.getItemDamage() == Short.MAX_VALUE) + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); int xPos = xOrigin + 80; int yPos = yOrigin + 42; ItemStack stack1 = stack.copy(); - if(stack1.getItemDamage() == -1) + if (stack1.getItemDamage() == -1) stack1.setItemDamage(0); renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); } - - public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, + int xOrigin, int yOrigin, int mx, int my) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); int gridSize = 23; - - if(stack.getItemDamage() == Short.MAX_VALUE) + + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); - x-=1; - y-=1; + x -= 1; + y -= 1; int xPos = xOrigin + (x * gridSize) + 46; int yPos = yOrigin + (y * gridSize) + 80; ItemStack stack1 = stack.copy(); - if(stack1.getItemDamage() == -1) + if (stack1.getItemDamage() == -1) stack1.setItemDamage(0); renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); } - + private ItemStack tooltipStack; - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, int my) - { + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { RenderItem render = new RenderItem(); - if(mx > xPos && mx < (xPos+16) && my > yPos && my < (yPos+16)) - { + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { tooltipStack = stack; } boolean mouseDown = Mouse.isButtonDown(0); @@ -203,8 +184,10 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); RenderHelper.disableStandardItemLighting(); GL11.glPopMatrix(); @@ -212,7 +195,6 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole } @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageSmelting.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageSmelting.java index 14f5cc64..46647317 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageSmelting.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageSmelting.java @@ -7,11 +7,6 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import cpw.mods.fml.relauncher.ReflectionHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.MineFantasyAPI; -import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -19,53 +14,42 @@ import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; -public class EntryPageSmelting extends EntryPage -{ +public class EntryPageSmelting extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); private ItemStack input, output; - - public EntryPageSmelting(ItemStack in, ItemStack out) - { + + public EntryPageSmelting(ItemStack in, ItemStack out) { this.input = in; this.output = out; } - - public EntryPageSmelting(Item in, Item out) - { + + public EntryPageSmelting(Item in, Item out) { this(new ItemStack(in), new ItemStack(out)); } @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { tooltipStack = null; - - + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/furnaceGrid.png")); parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - String cft = "<" + StatCollector.translateToLocal("method.furnace") + ">"; - mc.fontRenderer.drawSplitString(cft, posX+(universalBookImageWidth/2) - (mc.fontRenderer.getStringWidth(cft)/2), posY+150, 117, 0); - - renderRecipe(parent, x, y, f, posX, posY); - if(tooltipStack != null) - { + + String cft = "<" + StatCollector.translateToLocal("method.furnace") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); + + renderRecipe(parent, x, y, f, posX, posY); + if (tooltipStack != null) { List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); List parsedTooltip = new ArrayList(); boolean first = true; - for(String s : tooltipData) - { + for (String s : tooltipData) { String s_ = s; - if(!first) + if (!first) s_ = EnumChatFormatting.GRAY + s; parsedTooltip.add(s_); first = false; @@ -73,39 +57,38 @@ public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); } - + } - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) - { - renderResult(parent, output, false, posX, posY+74, mx, my); + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { + renderResult(parent, output, false, posX, posY + 74, mx, my); renderResult(parent, input, false, posX, posY, mx, my); } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, int mx, int my) - { - if(stack == null || stack.getItem() == null) + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) return; stack = stack.copy(); - if(stack.getItemDamage() == Short.MAX_VALUE) + if (stack.getItemDamage() == Short.MAX_VALUE) stack.setItemDamage(0); int xPos = xOrigin + 80; int yPos = yOrigin + 41; ItemStack stack1 = stack.copy(); - if(stack1.getItemDamage() == -1) + if (stack1.getItemDamage() == -1) stack1.setItemDamage(0); renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); } - + private ItemStack tooltipStack; - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, int my) - { + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { RenderItem render = new RenderItem(); - if(mx > xPos && mx < (xPos+16) && my > yPos && my < (yPos+16)) - { + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { tooltipStack = stack; } boolean mouseDown = Mouse.isButtonDown(0); @@ -116,8 +99,10 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); RenderHelper.disableStandardItemLighting(); GL11.glPopMatrix(); @@ -125,7 +110,6 @@ public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boole } @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageText.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageText.java index b2c2cc60..0688b7d6 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageText.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageText.java @@ -1,95 +1,69 @@ package minefantasy.mf2.api.knowledge.client; -import minefantasy.mf2.api.armour.ArmourDesign; -import minefantasy.mf2.api.armour.CustomArmourEntry; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.item.Item; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -public class EntryPageText extends EntryPage -{ +public class EntryPageText extends EntryPage { private Minecraft mc = Minecraft.getMinecraft(); private String paragraph; private Object[] additional; - - public EntryPageText(String paragraph, Object...additional) - { + + public EntryPageText(String paragraph, Object... additional) { this(paragraph); this.additional = additional; } - public EntryPageText(String paragraph) - { + + public EntryPageText(String paragraph) { this.paragraph = paragraph; } + @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { String local = StatCollector.translateToLocal(paragraph); - if(additional != null && additional.length > 0) - { + if (additional != null && additional.length > 0) { local = StatCollector.translateToLocalFormatted(paragraph, additional); } String text = ""; String temp = ""; boolean prefix = false; - for(int a = 0; a < local.length(); a++) - { + for (int a = 0; a < local.length(); a++) { char c = local.charAt(a); - if(a == local.length()-1) - { + if (a == local.length() - 1) { text = text + temp + c; temp = ""; - } - else if(prefix) - { - if(c == "h".charAt(0)) - { + } else if (prefix) { + if (c == "h".charAt(0)) { text = text + temp + EnumChatFormatting.DARK_BLUE + EnumChatFormatting.BOLD; temp = ""; - } - else if(c == "d".charAt(0)) - { + } else if (c == "d".charAt(0)) { text = text + temp + EnumChatFormatting.DARK_RED; temp = ""; - } - else if(c == "y".charAt(0)) - { + } else if (c == "y".charAt(0)) { text = text + temp + EnumChatFormatting.GOLD; temp = ""; - } - else if(c == "u".charAt(0)) - { + } else if (c == "u".charAt(0)) { text = text + temp + EnumChatFormatting.UNDERLINE; temp = ""; - } - else if(c == "r".charAt(0)) - { + } else if (c == "r".charAt(0)) { text = text + temp + EnumChatFormatting.RESET + EnumChatFormatting.BLACK; temp = ""; } prefix = false; - } - else if(c == "^".charAt(0)) - { + } else if (c == "^".charAt(0)) { text = text + temp + "\n\n"; temp = ""; - } - else if(c == "$".charAt(0)) - { + } else if (c == "$".charAt(0)) { prefix = true; - } - else - { + } else { temp = temp + c; } } - mc.fontRenderer.drawSplitString(text, posX+14, posY+15, 155, 0); + mc.fontRenderer.drawSplitString(text, posX + 14, posY + 15, 155, 0); } + @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) - { + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/IGuiRecipebook.java b/src/main/java/minefantasy/mf2/api/knowledge/client/IGuiRecipebook.java index 15fcd8ee..4cf30c2c 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/IGuiRecipebook.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/IGuiRecipebook.java @@ -1,7 +1,6 @@ package minefantasy.mf2.api.knowledge.client; -public interface IGuiRecipebook -{ +public interface IGuiRecipebook { int getWidth(); diff --git a/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java b/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java index a21f3f62..ba249a67 100644 --- a/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java +++ b/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java @@ -2,52 +2,46 @@ import java.text.DecimalFormat; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; -import java.util.List; -import net.minecraft.item.EnumRarity; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -import java.util.Iterator; -public class CustomMaterial -{ +public class CustomMaterial { public static final String NBTBase = "MF_CustomMaterials"; public static HashMap materialList = new HashMap(); public static HashMap> typeList = new HashMap>(); - - public ArrayListitems = new ArrayList(); - /** The material colour*/ - public int[] colourRGB = new int[]{255, 255, 255}; - /** Base threshold for armour rating*/ + + public ArrayList items = new ArrayList(); + /** The material colour */ + public int[] colourRGB = new int[] { 255, 255, 255 }; + /** Base threshold for armour rating */ public float hardness; - /** The Modifier for durability (1pt per 250 uses)*/ + /** The Modifier for durability (1pt per 250 uses) */ public float durability; - /** used for bow power.. >1 weakens blunt prot, <1 weakens piercing prot*/ + /** used for bow power.. >1 weakens blunt prot, <1 weakens piercing prot */ public float flexibility; - /** The Efficiency modifier (Like ToolMaterial) Also does damage*/ + /** The Efficiency modifier (Like ToolMaterial) Also does damage */ public float sharpness; - /** The modifier to resist elements like fire and corrosion)*/ + /** The modifier to resist elements like fire and corrosion) */ public float resistance; - /** The weight Kg/U (Kilogram per unit)*/ + /** The weight Kg/U (Kilogram per unit) */ public float density; public int tier; public final String type, name; - private float[] armourProtection = new float[]{1.0F, 1.0F, 1.0F}; + private float[] armourProtection = new float[] { 1.0F, 1.0F, 1.0F }; public int rarityID = 0; - + public int crafterTier = 0; public int crafterAnvilTier = 0; public float craftTimeModifier = 1.0F; - - public CustomMaterial(String name, String type, int tier, float hardness, float durability, float flexibility, float resistance, float sharpness, float density) - { + + public CustomMaterial(String name, String type, int tier, float hardness, float durability, float flexibility, + float resistance, float sharpness, float density) { this.name = name; this.type = type; this.tier = tier; @@ -59,91 +53,96 @@ public CustomMaterial(String name, String type, int tier, float hardness, float this.resistance = resistance; this.craftTimeModifier = 2F + (sharpness * 2F); } - public CustomMaterial setCrafterTiers(int tier) - { + + public CustomMaterial setCrafterTiers(int tier) { this.crafterTier = tier; this.crafterAnvilTier = Math.min(tier, 4); return this; } - public CustomMaterial modifyCraftTime(float time) - { + + public CustomMaterial modifyCraftTime(float time) { this.craftTimeModifier *= time; return this; } - public CustomMaterial setArmourStats(float cutting, float blunt, float piercing) - { - armourProtection = new float[]{cutting, blunt, piercing}; + + public CustomMaterial setArmourStats(float cutting, float blunt, float piercing) { + armourProtection = new float[] { cutting, blunt, piercing }; return this; } - public CustomMaterial setRarity(int id) - { + + public CustomMaterial setRarity(int id) { rarityID = id; return this; } - public CustomMaterial setColour(int red, int green, int blue) - { - colourRGB = new int[]{red, green, blue}; + + public CustomMaterial setColour(int red, int green, int blue) { + colourRGB = new int[] { red, green, blue }; return this; } - - public CustomMaterial register() - { + + public CustomMaterial register() { materialList.put(name.toLowerCase(), this); getList(type).add(this); return this; } - public int getColourInt() - { + + public int getColourInt() { return (colourRGB[0] << 16) + (colourRGB[1] << 8) + colourRGB[2]; } - + /** * Gets a material by name */ - public static CustomMaterial getMaterial(String name) - { - if(name == null)return null; - + public static CustomMaterial getMaterial(String name) { + if (name == null) + return null; + return materialList.get(name.toLowerCase()); } - + /** * Adds a new material - * @param name The name of the material (and registration) - * @param type What it is (Metal, Wood, etc) - * @param tier The tier of the material - * @param hardness How hard the material is to break - * @param flexibility How well the material can bend and retract - * @param sharpness How well it can be sharpened - * @param resistance How well it can handle destructive elements like fire and corrosion, and increased heating temperature - * @param density how dense the element is, increasing mass per unit. (KG/Units) + * + * @param name + * The name of the material (and registration) + * @param type + * What it is (Metal, Wood, etc) + * @param tier + * The tier of the material + * @param hardness + * How hard the material is to break + * @param flexibility + * How well the material can bend and retract + * @param sharpness + * How well it can be sharpened + * @param resistance + * How well it can handle destructive elements like fire and + * corrosion, and increased heating temperature + * @param density + * how dense the element is, increasing mass per unit. (KG/Units) */ - public static CustomMaterial getOrAddMaterial(String name, String type, int tier, float hardness, float durability, float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) - { - if(getMaterial(name) != null) - { + public static CustomMaterial getOrAddMaterial(String name, String type, int tier, float hardness, float durability, + float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) { + if (getMaterial(name) != null) { return getMaterial(name); } - return new CustomMaterial(name, type, tier, hardness, durability, flexibility, sharpness, resistance, density).setColour(red, green, blue).register(); + return new CustomMaterial(name, type, tier, hardness, durability, flexibility, sharpness, resistance, density) + .setColour(red, green, blue).register(); } - - public static void addMaterial(ItemStack item, String slot, String material) - { - if(material == null || material.isEmpty()) - { + + public static void addMaterial(ItemStack item, String slot, String material) { + if (material == null || material.isEmpty()) { return; } NBTTagCompound nbt = getNBT(item, true); nbt.setString(slot, material); } - public static CustomMaterial getMaterialFor(ItemStack item, String slot) - { + + public static CustomMaterial getMaterialFor(ItemStack item, String slot) { NBTTagCompound nbt = getNBT(item, false); - if(nbt != null) - { - if(nbt.hasKey(slot)) - { - if(nbt.getString(slot).equalsIgnoreCase("refinediron")) { //fix old namings, it can be removed later + if (nbt != null) { + if (nbt.hasKey(slot)) { + if (nbt.getString(slot).equalsIgnoreCase("refinediron")) { // fix old namings, it can be removed later nbt.setString(slot, "pigiron"); } return getMaterial(nbt.getString(slot)); @@ -151,14 +150,12 @@ public static CustomMaterial getMaterialFor(ItemStack item, String slot) } return null; } - public static NBTTagCompound getNBT(ItemStack item, boolean createNew) - { - if(item != null && item.hasTagCompound() && item.getTagCompound().hasKey(NBTBase)) - { + + public static NBTTagCompound getNBT(ItemStack item, boolean createNew) { + if (item != null && item.hasTagCompound() && item.getTagCompound().hasKey(NBTBase)) { return (NBTTagCompound) item.getTagCompound().getTag(NBTBase); } - if(createNew) - { + if (createNew) { NBTTagCompound nbt = new NBTTagCompound(); NBTTagCompound nbt2 = new NBTTagCompound(); item.setTagCompound(nbt); @@ -167,142 +164,134 @@ public static NBTTagCompound getNBT(ItemStack item, boolean createNew) } return null; } - - public static ArrayList getList(String type) - { - if(typeList.get(type) == null) - { + + public static ArrayList getList(String type) { + if (typeList.get(type) == null) { typeList.put(type, new ArrayList()); } return typeList.get(type); } - - public static void addOreDict(String material, String name) - { - if(getMaterial(name) != null) - { + + public static void addOreDict(String material, String name) { + if (getMaterial(name) != null) { getMaterial(name).addOreDict(material); } } - public void addOreDict(String name) - { - for(ItemStack item: OreDictionary.getOres(name)) - { + + public void addOreDict(String name) { + for (ItemStack item : OreDictionary.getOres(name)) { items.add(item); } } - public boolean isItemApplicable(ItemStack item) - { + + public boolean isItemApplicable(ItemStack item) { return this.items.contains(item); } + @SideOnly(Side.CLIENT) - public static String getWeightString(float mass) - { + public static String getWeightString(float mass) { DecimalFormat df = decimal_format; String s = "attribute.weightKg.name"; - if(mass > 0 && mass < 1.0F) - { + if (mass > 0 && mass < 1.0F) { s = "attribute.weightg.name"; df = decimal_format_grams; - mass = (int)(mass*1000F); - } - else if(mass > 1000) - { + mass = (int) (mass * 1000F); + } else if (mass > 1000) { s = "attribute.weightt.name"; - mass = (int)(mass/1000F); + mass = (int) (mass / 1000F); } return StatCollector.translateToLocalFormatted(s, decimal_format.format(mass)); } + public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); public static final DecimalFormat decimal_format_grams = new DecimalFormat("#"); + @SideOnly(Side.CLIENT) - public String getMaterialString() - { - return StatCollector.translateToLocalFormatted("materialtype."+this.type+".name", this.crafterTier); + public String getMaterialString() { + return StatCollector.translateToLocalFormatted("materialtype." + this.type + ".name", this.crafterTier); } - - public float getArmourProtection(int id) - { + + public float getArmourProtection(int id) { return armourProtection[id]; } - - public ItemStack getItem() - { + + public ItemStack getItem() { return null; } - public CustomMaterial setMeltingPoint(float heat) - { + + public CustomMaterial setMeltingPoint(float heat) { meltingPoint = heat; return this; } - public float getFireResistance() - { - if(meltingPoint > flameResistArray[0]) - { + + public float getFireResistance() { + if (meltingPoint > flameResistArray[0]) { float max = flameResistArray[1] - flameResistArray[0]; float heat = meltingPoint - flameResistArray[0]; - - int res = (int)(heat / max * 100F); + + int res = (int) (heat / max * 100F); return Math.min(100, res); } return 0F; } + public float meltingPoint; - public int[] getHeatableStats() - { + + public int[] getHeatableStats() { int workableTemp = (int) meltingPoint; int unstableTemp = (int) (workableTemp * 1.5F); int maxTemp = (int) (workableTemp * 2F); - return new int[]{workableTemp, unstableTemp, maxTemp}; + return new int[] { workableTemp, unstableTemp, maxTemp }; } + /** * Min and Max workable temps */ - public static final int[] flameResistArray = new int[]{100, 300}; - - -//-----------------------------------BOW FUNCTIONS----------------------------------------\\ - - //Returns if the material is a hard wood - // false is a non-unique value, this should not be used when youre not sure if the material is a wood - public boolean isHardwood(){ - if(this.name.toLowerCase().contains("wood")) - { - if(this.name.toLowerCase().contains("yew")) - {//Yew is a softwood but has a higher hardness value + public static final int[] flameResistArray = new int[] { 100, 300 }; + + // -----------------------------------BOW + // FUNCTIONS----------------------------------------\\ + + // Returns if the material is a hard wood + // false is a non-unique value, this should not be used when youre not sure if + // the material is a wood + public boolean isHardwood() { + if (this.name.toLowerCase().contains("wood")) { + if (this.name.toLowerCase().contains("yew")) {// Yew is a softwood but has a higher hardness value return false; } - return this.hardness>3.3; + return this.hardness > 3.3; } return false; } - - - //Returns a rating for how well a would would serve as a bow. - //Answers are in irrelevant physical units, so this is scaled in a later function which is meant to be used. - //Bow rating is proportional to power of the bow - //With regular woods, this value is from 6.4 to 11.5 - //A rating BELOW 8.0 means that the wood is not suitable for a bow and this funtion will return zero - private float getBowRating() - { - if(this.name.toLowerCase().contains("wood")) - { - float mid =(0.83F*(this.durability/this.flexibility)); - float result = (10F*this.flexibility*mid*mid)/this.density; - return result > 8.0F? result:0; + + // Returns a rating for how well a would would serve as a bow. + // Answers are in irrelevant physical units, so this is scaled in a later + // function which is meant to be used. + // Bow rating is proportional to power of the bow + // With regular woods, this value is from 6.4 to 11.5 + // A rating BELOW 8.0 means that the wood is not suitable for a bow and this + // funtion will return zero + private float getBowRating() { + if (this.name.toLowerCase().contains("wood")) { + float mid = (0.83F * (this.durability / this.flexibility)); + float result = (10F * this.flexibility * mid * mid) / this.density; + return result > 8.0F ? result : 0; } return 0; } - + public boolean isHeatable() { return type.equalsIgnoreCase("metal"); } - public CustomMaterial setUnbreakable() - { + + public CustomMaterial setUnbreakable() { unbreakable = true; return this; } + private boolean unbreakable = false; + public boolean isUnbrekable() { return unbreakable; } diff --git a/src/main/java/minefantasy/mf2/api/mining/RandomDigs.java b/src/main/java/minefantasy/mf2/api/mining/RandomDigs.java index 79c1f55e..6b7a0c09 100644 --- a/src/main/java/minefantasy/mf2/api/mining/RandomDigs.java +++ b/src/main/java/minefantasy/mf2/api/mining/RandomDigs.java @@ -8,10 +8,9 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class RandomDigs -{ +public class RandomDigs { public static ArrayList drops = new ArrayList(); - + private final ItemStack loot; private final float chanceToDrop; private final Block block; @@ -20,83 +19,80 @@ public class RandomDigs private final int minHeight; private final int maxHeight; private final boolean doesSilktouchDisable; - + /** * Adds an ore to drop - * @param drop the item dropped - * @param chance the chance as a percentage to drop - * @param block the block it drops from (ID, Block, or stack) + * + * @param drop + * the item dropped + * @param chance + * the chance as a percentage to drop + * @param block + * the block it drops from (ID, Block, or stack) */ - public static void addOre(ItemStack drop, float chance, Block block, int meta, int harvestLevel, int min, int max, boolean silkDisable) - { - drops.add(new RandomDigs(drop, chance/100F, block, meta, harvestLevel, min, max, silkDisable)); + public static void addOre(ItemStack drop, float chance, Block block, int meta, int harvestLevel, int min, int max, + boolean silkDisable) { + drops.add(new RandomDigs(drop, chance / 100F, block, meta, harvestLevel, min, max, silkDisable)); } - public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, boolean silkDisable) - { - drops.add(new RandomDigs(drop, chance/100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, silkDisable)); + + public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, + boolean silkDisable) { + drops.add(new RandomDigs(drop, chance / 100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, + silkDisable)); } - - public static ArrayListgetDroppedItems(Block base, int meta, int harvest, int fortune, boolean silktouch, int y) - { - ArrayListloot = new ArrayList(); - - if(!drops.isEmpty()) - { + + public static ArrayList getDroppedItems(Block base, int meta, int harvest, int fortune, + boolean silktouch, int y) { + ArrayList loot = new ArrayList(); + + if (!drops.isEmpty()) { Iterator list = drops.iterator(); - - while(list.hasNext()) - { + + while (list.hasNext()) { RandomDigs ore = (RandomDigs) list.next(); - if(matchesOre(ore, base, meta, harvest, fortune / 2F + 1F, silktouch, y)) - { + if (matchesOre(ore, base, meta, harvest, fortune / 2F + 1F, silktouch, y)) { loot.add(ore.loot); } } } - + return loot; } - - private static boolean matchesOre(RandomDigs ore, Block base, int meta, int harvest, float multiplier, boolean silktouch, int y) - { + + private static boolean matchesOre(RandomDigs ore, Block base, int meta, int harvest, float multiplier, + boolean silktouch, int y) { Random random = new Random(); - - if(ore.doesSilktouchDisable && silktouch) - { + + if (ore.doesSilktouchDisable && silktouch) { return false; } - - if(!(ore.minHeight == -1 && ore.maxHeight == -1)) - { - if(y < ore.minHeight || y > ore.maxHeight) - { + + if (!(ore.minHeight == -1 && ore.maxHeight == -1)) { + if (y < ore.minHeight || y > ore.maxHeight) { return false; } } - if(ore.block != base) - { + if (ore.block != base) { return false; } - if(ore.blockSub != meta && ore.blockSub != OreDictionary.WILDCARD_VALUE) - { + if (ore.blockSub != meta && ore.blockSub != OreDictionary.WILDCARD_VALUE) { return false; } - if(ore.harvestLvl > harvest) - { + if (ore.harvestLvl > harvest) { return false; } return random.nextFloat() < (ore.chanceToDrop * multiplier); } - public RandomDigs(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, boolean silkDisable) - { + public RandomDigs(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, + boolean silkDisable) { doesSilktouchDisable = silkDisable; minHeight = min; maxHeight = max; loot = drop; chanceToDrop = chance; harvestLvl = harvestLevel; - + block = base; blockSub = meta; } diff --git a/src/main/java/minefantasy/mf2/api/mining/RandomOre.java b/src/main/java/minefantasy/mf2/api/mining/RandomOre.java index 65c19408..2267944a 100644 --- a/src/main/java/minefantasy/mf2/api/mining/RandomOre.java +++ b/src/main/java/minefantasy/mf2/api/mining/RandomOre.java @@ -11,10 +11,9 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class RandomOre -{ +public class RandomOre { public static ArrayList drops = new ArrayList(); - + private final ItemStack loot; private final float chanceToDrop; private final Block block; @@ -24,99 +23,96 @@ public class RandomOre private final int maxHeight; private final boolean doesSilktouchDisable; private final String research; - + /** * Adds an ore to drop - * @param drop the item dropped - * @param chance the chance as a percentage to drop - * @param block the block it drops from (ID, Block, or stack) + * + * @param drop + * the item dropped + * @param chance + * the chance as a percentage to drop + * @param block + * the block it drops from (ID, Block, or stack) */ - public static void addOre(ItemStack drop, float chance, Block block, int meta, int harvestLevel, int min, int max, boolean silkDisable) - { - drops.add(new RandomOre(drop, chance/100F, block, meta, harvestLevel, min, max, silkDisable)); + public static void addOre(ItemStack drop, float chance, Block block, int meta, int harvestLevel, int min, int max, + boolean silkDisable) { + drops.add(new RandomOre(drop, chance / 100F, block, meta, harvestLevel, min, max, silkDisable)); } - public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, boolean silkDisable) - { - drops.add(new RandomOre(drop, chance/100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, silkDisable)); + + public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, + boolean silkDisable) { + drops.add(new RandomOre(drop, chance / 100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, + silkDisable)); } - - public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, boolean silkDisable, String research) - { - drops.add(new RandomOre(drop, chance/100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, silkDisable, research)); + + public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, + boolean silkDisable, String research) { + drops.add(new RandomOre(drop, chance / 100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, + silkDisable, research)); } - - public static ArrayListgetDroppedItems(EntityLivingBase user, Block base, int meta, int harvest, int fortune, boolean silktouch, int y) - { - ArrayListloot = new ArrayList(); - - if(!drops.isEmpty()) - { + + public static ArrayList getDroppedItems(EntityLivingBase user, Block base, int meta, int harvest, + int fortune, boolean silktouch, int y) { + ArrayList loot = new ArrayList(); + + if (!drops.isEmpty()) { Iterator list = drops.iterator(); - - while(list.hasNext()) - { + + while (list.hasNext()) { RandomOre ore = (RandomOre) list.next(); - if(matchesOre(user, ore, base, meta, harvest, fortune / 2F + 1F, silktouch, y)) - { + if (matchesOre(user, ore, base, meta, harvest, fortune / 2F + 1F, silktouch, y)) { loot.add(ore.loot); } } } - + return loot; } - - private static boolean matchesOre(EntityLivingBase user, RandomOre ore, Block base, int meta, int harvest, float multiplier, boolean silktouch, int y) - { + + private static boolean matchesOre(EntityLivingBase user, RandomOre ore, Block base, int meta, int harvest, + float multiplier, boolean silktouch, int y) { Random random = new Random(); - - if(ore.doesSilktouchDisable && silktouch) - { + + if (ore.doesSilktouchDisable && silktouch) { return false; } - if(user instanceof EntityPlayer && ore.research != null) - { - if(!ResearchLogic.hasInfoUnlocked((EntityPlayer)user, ore.research)) - { + if (user instanceof EntityPlayer && ore.research != null) { + if (!ResearchLogic.hasInfoUnlocked((EntityPlayer) user, ore.research)) { return false; } } - - if(!(ore.minHeight == -1 && ore.maxHeight == -1)) - { - if(y < ore.minHeight || y > ore.maxHeight) - { + + if (!(ore.minHeight == -1 && ore.maxHeight == -1)) { + if (y < ore.minHeight || y > ore.maxHeight) { return false; } } - if(ore.block != base) - { + if (ore.block != base) { return false; } - if(ore.blockSub != meta && ore.blockSub != OreDictionary.WILDCARD_VALUE) - { + if (ore.blockSub != meta && ore.blockSub != OreDictionary.WILDCARD_VALUE) { return false; } - if(ore.harvestLvl > harvest) - { + if (ore.harvestLvl > harvest) { return false; } return random.nextFloat() < (ore.chanceToDrop * multiplier); } - public RandomOre(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, boolean silkDisable) - { + public RandomOre(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, + boolean silkDisable) { this(drop, chance, base, meta, harvestLevel, min, max, silkDisable, null); } - public RandomOre(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, boolean silkDisable, String research) - { + + public RandomOre(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, + boolean silkDisable, String research) { doesSilktouchDisable = silkDisable; minHeight = min; maxHeight = max; loot = drop; chanceToDrop = chance; harvestLvl = harvestLevel; - + block = base; blockSub = meta; this.research = research; diff --git a/src/main/java/minefantasy/mf2/api/refine/Alloy.java b/src/main/java/minefantasy/mf2/api/refine/Alloy.java index fa96ff71..89a0a1dc 100644 --- a/src/main/java/minefantasy/mf2/api/refine/Alloy.java +++ b/src/main/java/minefantasy/mf2/api/refine/Alloy.java @@ -13,68 +13,60 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class Alloy{ +public class Alloy { public final List recipeItems; public final ItemStack recipeOutput; public final int level; private Map props = new HashMap(); - - public Alloy(ItemStack output, int requiredLevel, List items) - { + + public Alloy(ItemStack output, int requiredLevel, List items) { recipeItems = items; recipeOutput = output; level = requiredLevel; } - - public ItemStack getRecipeOutput() - { - return this.recipeOutput; - } - - public Alloy addProperty(String id, Object prop) - { + + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + public Alloy addProperty(String id, Object prop) { props.put(id, prop); return this; } - public Object getProperty(String id) - { + + public Object getProperty(String id) { return props.get(id); } - /** - * Used to check if a recipe matches current crafting inventory - */ + /** + * Used to check if a recipe matches current crafting inventory + */ public boolean matches(ItemStack[] inventory) { ArrayList checkRecipe = new ArrayList(this.recipeItems); - for (ItemStack itemstack : inventory) - { - if (itemstack != null) - { + for (ItemStack itemstack : inventory) { + if (itemstack != null) { boolean matches = false; Iterator iterator = checkRecipe.iterator(); - while (iterator.hasNext()) - { + while (iterator.hasNext()) { ItemStack checkItem = (ItemStack) iterator.next(); if (itemstack.isItemEqual(checkItem) && areMaterialsEqual(itemstack, checkItem) - && (checkItem.getItemDamage() == OreDictionary.WILDCARD_VALUE || itemstack.getItemDamage() == checkItem.getItemDamage())) - { + && (checkItem.getItemDamage() == OreDictionary.WILDCARD_VALUE + || itemstack.getItemDamage() == checkItem.getItemDamage())) { matches = true; checkRecipe.remove(checkItem); break; } - if (areBothCarbon(itemstack, checkItem)) - { + if (areBothCarbon(itemstack, checkItem)) { matches = true; checkRecipe.remove(checkItem); break; } } - if (!matches) - { + if (!matches) { return false; } } @@ -83,49 +75,44 @@ public boolean matches(ItemStack[] inventory) { return checkRecipe.isEmpty(); } - private boolean areMaterialsEqual(ItemStack itemstack, ItemStack checkItem) - { - CustomMaterial material1 = CustomToolHelper.getCustomPrimaryMaterial(itemstack); - CustomMaterial material2 = CustomToolHelper.getCustomPrimaryMaterial(checkItem); - if(material1 == null && material2 == null) - { - return true; - } - if(material1 != null && material2 != null) - { - return material1 == material2; - } + private boolean areMaterialsEqual(ItemStack itemstack, ItemStack checkItem) { + CustomMaterial material1 = CustomToolHelper.getCustomPrimaryMaterial(itemstack); + CustomMaterial material2 = CustomToolHelper.getCustomPrimaryMaterial(checkItem); + if (material1 == null && material2 == null) { + return true; + } + if (material1 != null && material2 != null) { + return material1 == material2; + } return false; } - private boolean areBothCarbon(ItemStack item1, ItemStack item2) - { + private boolean areBothCarbon(ItemStack item1, ItemStack item2) { return MineFantasyFuels.isCarbon(item1) && MineFantasyFuels.isCarbon(item2); } /** - * Returns an Item that is the result of this recipe - */ - public ItemStack getCraftingResult(InventoryCrafting inv) - { - return this.recipeOutput.copy(); - } - - /** - * Returns the size of the recipe area - */ - public int getRecipeSize() - { - return this.recipeItems.size(); - } - - /** - * Gets the level of the Alloy, requiring a more powerful smelter - * @return the minimal level required to make (crucible is 0, alloy forge = 1, etc) - */ - public int getLevel() - { - return level; - } - + * Returns an Item that is the result of this recipe + */ + public ItemStack getCraftingResult(InventoryCrafting inv) { + return this.recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + public int getRecipeSize() { + return this.recipeItems.size(); + } + + /** + * Gets the level of the Alloy, requiring a more powerful smelter + * + * @return the minimal level required to make (crucible is 0, alloy forge = 1, + * etc) + */ + public int getLevel() { + return level; + } + } diff --git a/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java b/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java index b4d6e322..a59675e0 100644 --- a/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java +++ b/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java @@ -6,69 +6,62 @@ import net.minecraft.item.ItemStack; public class AlloyRecipes { - public static Listalloys = new ArrayList(); - - public static Alloy addAlloy(ItemStack out, int level, List in) - { + public static List alloys = new ArrayList(); + + public static Alloy addAlloy(ItemStack out, int level, List in) { Alloy alloy = new Alloy(out, level, in); alloys.add(alloy); return alloy; } - public static void addAlloy(ItemStack out, List in) - { + + public static void addAlloy(ItemStack out, List in) { addAlloy(out, 0, in); } - public static void addAlloy(Alloy alloy) - { + + public static void addAlloy(Alloy alloy) { alloys.add(alloy); } - - public static Alloy getResult(ItemStack[] inv) - { - for(Alloy alloy : alloys) - { - if(alloy.matches(inv)) - { + + public static Alloy getResult(ItemStack[] inv) { + for (Alloy alloy : alloys) { + if (alloy.matches(inv)) { return alloy; } } return null; } - + /** - * Adds an alloy, and duplicates it so the ratio can be copied - * eg a recipe with 2 'x' ore and 1 'y' ore can be made with 4 'x' ore and 2 'y' ore... - * @param the amount of times the ratio can be added + * Adds an alloy, and duplicates it so the ratio can be copied eg a recipe with + * 2 'x' ore and 1 'y' ore can be made with 4 'x' ore and 2 'y' ore... + * + * @param the + * amount of times the ratio can be added */ - public static Alloy[] addRatioRecipe(ItemStack out, int level, List in, int levels) - { - levels = (int)(9F / in.size()); + public static Alloy[] addRatioRecipe(ItemStack out, int level, List in, int levels) { + levels = (int) (9F / in.size()); Alloy[] alloys = new Alloy[levels]; - for(int a = 1; a <= levels; a ++) - { + for (int a = 1; a <= levels; a++) { List list2 = createDupeList(in, a); ItemStack out2 = out.copy(); int ss = Math.min(out2.getMaxStackSize(), out2.stackSize * a); out2.stackSize = ss; - alloys[a-1] = addAlloy(out2, level, list2); + alloys[a - 1] = addAlloy(out2, level, list2); } return alloys; } - public static List createDupeList(List list) - { + + public static List createDupeList(List list) { return createDupeList(list, 2); } - public static List createDupeList(List list, int dupe) - { - if(dupe == 0) - { + + public static List createDupeList(List list, int dupe) { + if (dupe == 0) { dupe = 1; } List list2 = new ArrayList(); - for(int a = 0; a < dupe; a ++) - { - for(int b = 0; b < list.size(); b ++) - { + for (int a = 0; a < dupe; a++) { + for (int b = 0; b < list.size(); b++) { list2.add(list.get(b)); } } diff --git a/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java b/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java index 62c70175..4c19acc0 100644 --- a/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java +++ b/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java @@ -8,38 +8,38 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class BigFurnaceRecipes -{ - public static HashMaprecipeList = new HashMap(); - - public static BigFurnaceRecipes addRecipe(Block input, ItemStack output, int tier) - { +public class BigFurnaceRecipes { + public static HashMap recipeList = new HashMap(); + + public static BigFurnaceRecipes addRecipe(Block input, ItemStack output, int tier) { return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); } - public static BigFurnaceRecipes addRecipe(Item input, ItemStack output, int tier) - { + + public static BigFurnaceRecipes addRecipe(Item input, ItemStack output, int tier) { return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); } - public static BigFurnaceRecipes addRecipe(ItemStack input, ItemStack output, int tier) - { + + public static BigFurnaceRecipes addRecipe(ItemStack input, ItemStack output, int tier) { BigFurnaceRecipes recipe = new BigFurnaceRecipes(input, output, tier); recipeList.put(CustomToolHelper.getReferenceName(input), recipe); return recipe; } - public static BigFurnaceRecipes getResult(ItemStack input) - { - if(input == null)return null; - + + public static BigFurnaceRecipes getResult(ItemStack input) { + if (input == null) + return null; + BigFurnaceRecipes specific = recipeList.get(CustomToolHelper.getReferenceName(input)); - if(specific != null)return specific; - + if (specific != null) + return specific; + return recipeList.get(CustomToolHelper.getReferenceName(input, "any")); } - + public final ItemStack result; public final int tier; - public BigFurnaceRecipes(ItemStack input, ItemStack output, int tier) - { + + public BigFurnaceRecipes(ItemStack input, ItemStack output, int tier) { this.result = output; this.tier = tier; } diff --git a/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java b/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java index a6c8cc83..0a3af663 100644 --- a/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java +++ b/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java @@ -6,73 +6,60 @@ import java.util.Map.Entry; import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class BlastFurnaceRecipes -{ - private static final BlastFurnaceRecipes smeltingBase = new BlastFurnaceRecipes(); - /** The list of smelting results. */ - private Map smeltingList = new HashMap(); +public class BlastFurnaceRecipes { + private static final BlastFurnaceRecipes smeltingBase = new BlastFurnaceRecipes(); + /** The list of smelting results. */ + private Map smeltingList = new HashMap(); - /** - * Used to call methods addSmelting and getSmeltingResult. - */ - public static BlastFurnaceRecipes smelting() - { - return smeltingBase; - } + /** + * Used to call methods addSmelting and getSmeltingResult. + */ + public static BlastFurnaceRecipes smelting() { + return smeltingBase; + } - private BlastFurnaceRecipes() - { - } + private BlastFurnaceRecipes() { + } - public void addRecipe(Block input, ItemStack output) - { - this.addRecipe(Item.getItemFromBlock(input), output); - } + public void addRecipe(Block input, ItemStack output) { + this.addRecipe(Item.getItemFromBlock(input), output); + } - public void addRecipe(Item input, ItemStack output) - { - this.addRecipe(new ItemStack(input, 1, 32767), output); - } + public void addRecipe(Item input, ItemStack output) { + this.addRecipe(new ItemStack(input, 1, 32767), output); + } - public void addRecipe(ItemStack input, ItemStack output) - { - this.smeltingList.put(input, output); - } + public void addRecipe(ItemStack input, ItemStack output) { + this.smeltingList.put(input, output); + } - /** - * Returns the smelting result of an item. - */ - public ItemStack getSmeltingResult(ItemStack input) - { - Iterator iterator = this.smeltingList.entrySet().iterator(); - Entry entry; + /** + * Returns the smelting result of an item. + */ + public ItemStack getSmeltingResult(ItemStack input) { + Iterator iterator = this.smeltingList.entrySet().iterator(); + Entry entry; - do - { - if (!iterator.hasNext()) - { - return null; - } + do { + if (!iterator.hasNext()) { + return null; + } - entry = (Entry)iterator.next(); - } - while (!this.func_151397_a(input, (ItemStack)entry.getKey())); + entry = (Entry) iterator.next(); + } while (!this.func_151397_a(input, (ItemStack) entry.getKey())); - return (ItemStack)entry.getValue(); - } + return (ItemStack) entry.getValue(); + } - private boolean func_151397_a(ItemStack p_151397_1_, ItemStack p_151397_2_) - { - return p_151397_2_.getItem() == p_151397_1_.getItem() && (p_151397_2_.getItemDamage() == 32767 || p_151397_2_.getItemDamage() == p_151397_1_.getItemDamage()); - } + private boolean func_151397_a(ItemStack p_151397_1_, ItemStack p_151397_2_) { + return p_151397_2_.getItem() == p_151397_1_.getItem() + && (p_151397_2_.getItemDamage() == 32767 || p_151397_2_.getItemDamage() == p_151397_1_.getItemDamage()); + } - public Map getSmeltingList() - { - return this.smeltingList; - } + public Map getSmeltingList() { + return this.smeltingList; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/api/refine/ISmokeCarrier.java b/src/main/java/minefantasy/mf2/api/refine/ISmokeCarrier.java index a282265c..a887a6b6 100644 --- a/src/main/java/minefantasy/mf2/api/refine/ISmokeCarrier.java +++ b/src/main/java/minefantasy/mf2/api/refine/ISmokeCarrier.java @@ -1,9 +1,11 @@ package minefantasy.mf2.api.refine; -public interface ISmokeCarrier -{ +public interface ISmokeCarrier { public int getSmokeValue(); + public void setSmokeValue(int smoke); + public int getMaxSmokeStorage(); + public boolean canAbsorbIndirect(); } diff --git a/src/main/java/minefantasy/mf2/api/refine/ISmokeHandler.java b/src/main/java/minefantasy/mf2/api/refine/ISmokeHandler.java index 3e0799ad..7670516f 100644 --- a/src/main/java/minefantasy/mf2/api/refine/ISmokeHandler.java +++ b/src/main/java/minefantasy/mf2/api/refine/ISmokeHandler.java @@ -3,9 +3,9 @@ import net.minecraft.world.World; /** - * This is only implemented once by MineFantasy just a hook to allow MF entities to be used + * This is only implemented once by MineFantasy just a hook to allow MF entities + * to be used */ -public interface ISmokeHandler -{ +public interface ISmokeHandler { void spawnSmoke(World world, double x, double y, double z, int value); } diff --git a/src/main/java/minefantasy/mf2/api/refine/SmokeMechanics.java b/src/main/java/minefantasy/mf2/api/refine/SmokeMechanics.java index b433b40a..19facf7a 100644 --- a/src/main/java/minefantasy/mf2/api/refine/SmokeMechanics.java +++ b/src/main/java/minefantasy/mf2/api/refine/SmokeMechanics.java @@ -6,65 +6,57 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class SmokeMechanics -{ +public class SmokeMechanics { /** * Emits smoke from a carrying block - * @param max the maximum smoke emitted each tick (-1 for infinite) + * + * @param max + * the maximum smoke emitted each tick (-1 for infinite) * @return true if it's successful */ - public static boolean emitSmokeFromCarrier(World world, int x, int y, int z, ISmokeCarrier tile, int max) - { + public static boolean emitSmokeFromCarrier(World world, int x, int y, int z, ISmokeCarrier tile, int max) { int value = tile.getSmokeValue(); - - if(max >= 0 && value > max) - { + + if (max >= 0 && value > max) { value = max; } - if(value <= 0) - { - return true;//yes it succeeded because it doesn't need to... it just really means nothing went wrong + if (value <= 0) { + return true;// yes it succeeded because it doesn't need to... it just really means nothing + // went wrong } boolean success = emitSmoke(world, x, y, z, value) != -1; - - if(success) - { + + if (success) { modifySmoke(tile, -value); } return success; } + /** - * Tries to emit smoke, sends it to chimneys if possible - * Returns -1 for fail, 0 for shared, 1 for success + * Tries to emit smoke, sends it to chimneys if possible Returns -1 for fail, 0 + * for shared, 1 for success */ - public static int emitSmoke(World world, int x, int y, int z, int value) - { - TileEntity tile = world.getTileEntity(x, y+1, z);//The above block - if(tile == null) //No TileEntity above + public static int emitSmoke(World world, int x, int y, int z, int value) { + TileEntity tile = world.getTileEntity(x, y + 1, z);// The above block + if (tile == null) // No TileEntity above { - if(world.isSideSolid(x, y+1, z, ForgeDirection.DOWN))//if solid above + if (world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))// if solid above { return -1; } - //if(world.canBlockSeeTheSky(x, y+1, z)) + // if(world.canBlockSeeTheSky(x, y+1, z)) { - spawnSmoke(world, x, y+1, z, value); + spawnSmoke(world, x, y + 1, z, value); return 1; } - } - else - { - if(tile instanceof ISmokeCarrier) - { - if(((ISmokeCarrier)tile).getSmokeValue() < ((ISmokeCarrier)tile).getMaxSmokeStorage()) - { - modifySmoke((ISmokeCarrier)tile, value); + } else { + if (tile instanceof ISmokeCarrier) { + if (((ISmokeCarrier) tile).getSmokeValue() < ((ISmokeCarrier) tile).getMaxSmokeStorage()) { + modifySmoke((ISmokeCarrier) tile, value); return 0; } - } - else - { - if(world.isSideSolid(x, y+1, z, ForgeDirection.DOWN))//if solid above + } else { + if (world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))// if solid above { return -1; } @@ -73,68 +65,60 @@ public static int emitSmoke(World world, int x, int y, int z, int value) return -1; } - public static void modifySmoke(ISmokeCarrier tile, int value) - { + public static void modifySmoke(ISmokeCarrier tile, int value) { tile.setSmokeValue(tile.getSmokeValue() + value); - if(tile.getSmokeValue() <= 0) - { + if (tile.getSmokeValue() <= 0) { tile.setSmokeValue(0); } } /** - * Do not use this from blocks, use emitSmoke instead - * Spawns smoke + * Do not use this from blocks, use emitSmoke instead Spawns smoke */ private static Random rand = new Random(); public static ISmokeHandler handler; + /** * Emits smoke to a coord, ignoring chimneys */ - public static void spawnSmoke(World world, int x, int y, int z, int value) - { - spawnSmokeD(world, x+0.5D, y+0.5D, z+0.5D, value); + public static void spawnSmoke(World world, int x, int y, int z, int value) { + spawnSmokeD(world, x + 0.5D, y + 0.5D, z + 0.5D, value); } + /** * Emits smoke, ignoring chimneys */ - public static void spawnSmokeD(World world, double x, double y, double z, int value) - { - if(!world.isRemote && handler != null) - { + public static void spawnSmokeD(World world, double x, double y, double z, int value) { + if (!world.isRemote && handler != null) { handler.spawnSmoke(world, x, y, z, value); } - - for(int a = 0; a < value; a++) - { + + for (int a = 0; a < value; a++) { float sprayRange = 0.2F; - float sprayX = (rand.nextFloat()*sprayRange) - (sprayRange/2); - float sprayZ = (rand.nextFloat()*sprayRange) - (sprayRange/2); + float sprayX = (rand.nextFloat() * sprayRange) - (sprayRange / 2); + float sprayZ = (rand.nextFloat() * sprayRange) - (sprayRange / 2); float height = 0.2F; - world.spawnParticle("smoke",x, y, z, sprayX, height, sprayZ); + world.spawnParticle("smoke", x, y, z, sprayX, height, sprayZ); } } - + /** * Checks if smoke can go through a chimney */ - public static boolean tryUseChimney(World world, int x, int y, int z, int value) - { + public static boolean tryUseChimney(World world, int x, int y, int z, int value) { return tryUseChimney(world, x, y, z, value, true); } + /** * Checks if smoke can go through a chimney */ - public static boolean tryUseChimney(World world, int x, int y, int z, int value, boolean indirect) - { - TileEntity tile = world.getTileEntity(x, y, z);//The block - if(tile != null) - { - if(tile instanceof ISmokeCarrier) - { + public static boolean tryUseChimney(World world, int x, int y, int z, int value, boolean indirect) { + TileEntity tile = world.getTileEntity(x, y, z);// The block + if (tile != null) { + if (tile instanceof ISmokeCarrier) { ISmokeCarrier chimney = (ISmokeCarrier) tile; - if((!indirect || chimney.canAbsorbIndirect()) && chimney.getSmokeValue() < chimney.getMaxSmokeStorage()) - { + if ((!indirect || chimney.canAbsorbIndirect()) + && chimney.getSmokeValue() < chimney.getMaxSmokeStorage()) { modifySmoke(chimney, value); return true; } @@ -142,26 +126,21 @@ public static boolean tryUseChimney(World world, int x, int y, int z, int value, } return false; } + /** * Emits smoke from a source, or goes through a chimney */ - public static void emitSmokeIndirect(World world, int xCoord, int yCoord, int zCoord, int value) - { - if(tryUseChimney(world, xCoord, yCoord, zCoord, value)) - { + public static void emitSmokeIndirect(World world, int xCoord, int yCoord, int zCoord, int value) { + if (tryUseChimney(world, xCoord, yCoord, zCoord, value)) { return; - } - - for(int x = -1; x <= 1; x++) - { - for(int y = 0; y <= 1; y++) - { - for(int z = -1; z <= 1; z++) - { - if(tryUseChimney(world, xCoord + x, yCoord + y, zCoord + z, value)) - { + } + + for (int x = -1; x <= 1; x++) { + for (int y = 0; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + if (tryUseChimney(world, xCoord + x, yCoord + y, zCoord + z, value)) { return; - } + } } } } diff --git a/src/main/java/minefantasy/mf2/api/rpg/LevelupEvent.java b/src/main/java/minefantasy/mf2/api/rpg/LevelupEvent.java index ca181868..3dc47206 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/LevelupEvent.java +++ b/src/main/java/minefantasy/mf2/api/rpg/LevelupEvent.java @@ -3,14 +3,12 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.event.entity.living.LivingEvent; -public class LevelupEvent extends LivingEvent -{ +public class LevelupEvent extends LivingEvent { public final EntityPlayer thePlayer; public final Skill theSkill; public final int theLevel; - - public LevelupEvent(EntityPlayer player, Skill skill, int newlvl) - { + + public LevelupEvent(EntityPlayer player, Skill skill, int newlvl) { super(player); this.thePlayer = player; this.theSkill = skill; diff --git a/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java b/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java index 6443d390..ef41a656 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java +++ b/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java @@ -4,137 +4,117 @@ import java.util.HashMap; import java.util.Random; -import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.helpers.PlayerTagData; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -public class RPGElements -{ +public class RPGElements { public static boolean isSystemActive = true; public static float levelSpeedModifier = 1.0F; public static float levelUpModifier = 1.5F; - - private static HashMapskillsMap = new HashMap(); - private static ArrayListskillsList = new ArrayList(); - - public static void addSkill(String name) - { + + private static HashMap skillsMap = new HashMap(); + private static ArrayList skillsList = new ArrayList(); + + public static void addSkill(String name) { addSkill(new Skill(name)); } - public static void addSkill(Skill skill) - { + + public static void addSkill(Skill skill) { skillsMap.put(skill.skillName, skill); skillsList.add(skill); } + private static final String statsName = "RPGStats_MF"; - public static NBTTagCompound getTagData(EntityPlayer player) - { + + public static NBTTagCompound getTagData(EntityPlayer player) { NBTTagCompound nbt = PlayerTagData.getPersistedData(player); - if(!nbt.hasKey(statsName)) - { + if (!nbt.hasKey(statsName)) { nbt.setTag(statsName, new NBTTagCompound()); } return nbt.getCompoundTag(statsName); } - - public static NBTTagCompound getSkill(EntityPlayer player, String skillname) - { + + public static NBTTagCompound getSkill(EntityPlayer player, String skillname) { NBTTagCompound nbt = getTagData(player); - if(!nbt.hasKey(skillname)) - { + if (!nbt.hasKey(skillname)) { NBTTagCompound tag = new NBTTagCompound(); - + Skill skill = skillsMap.get(skillname); - if(skill != null) - { + if (skill != null) { skill.init(tag, player); } nbt.setTag(skillname, tag); } return nbt.getCompoundTag(skillname); } - - public static void initSkills(EntityPlayer player) - { - for(int id = 0; id < skillsList.size(); id++) - { + + public static void initSkills(EntityPlayer player) { + for (int id = 0; id < skillsList.size(); id++) { Skill skill = skillsList.get(id); skill.sync(player); } } - - static - { - if(isSystemActive) - { + + static { + if (isSystemActive) { SkillList.init(); } } - - public static Skill getSkillByName(String name) - { + + public static Skill getSkillByName(String name) { return skillsMap.get(name); } - public static int getLevel(EntityPlayer player, Skill skill) - { + + public static int getLevel(EntityPlayer player, Skill skill) { return RPGElements.getSkill(player, skill.skillName).getInteger("level"); } - + /** * Modifies the stamina cost for an ability (-1 means impossible) */ - public static float getStaminaCostModifier(EntityPlayer player, Skill skill, int minLevel) - { + public static float getStaminaCostModifier(EntityPlayer player, Skill skill, int minLevel) { NBTTagCompound stat = getSkill(player, skill.skillName); int level = stat.getInteger("level"); - - if(level < minLevel) - { + + if (level < minLevel) { return -1; - } - else - { - if(skill.getMaxLevel()-minLevel <= 0) - { + } else { + if (skill.getMaxLevel() - minLevel <= 0) { return 1.0F; } - float progress = (level-minLevel) / (skill.getMaxLevel()-minLevel); + float progress = (level - minLevel) / (skill.getMaxLevel() - minLevel); return 1.5F - progress; } } - public static float getWeaponModifier(EntityPlayer player, Skill skill) - { - int minSkill = 25;//No bonus damage until level 25+ + + public static float getWeaponModifier(EntityPlayer player, Skill skill) { + int minSkill = 25;// No bonus damage until level 25+ int level = getLevel(player, skill); - if(level <= minSkill) - { + if (level <= minSkill) { return 1.0F; } - - float progress = ((float)level-minSkill) / ((float)skill.getMaxLevel()-minSkill); + + float progress = ((float) level - minSkill) / ((float) skill.getMaxLevel() - minSkill); return 1.0F + (progress); } - public static boolean hasLevel(EntityPlayer player, Skill skill, int requirement) - { + + public static boolean hasLevel(EntityPlayer player, Skill skill, int requirement) { return getSkill(player, skill.skillName).getInteger("level") >= requirement; } + private static Random rand = new Random(); - public static Skill getRandomSkill() - { + + public static Skill getRandomSkill() { int id = rand.nextInt(skillsList.size()); return skillsList.get(id); } - public static void syncAll(EntityPlayer user) - { - if(!user.worldObj.isRemote) - { - for(int a = 0; a < skillsList.size(); a++) - { + + public static void syncAll(EntityPlayer user) { + if (!user.worldObj.isRemote) { + for (int a = 0; a < skillsList.size(); a++) { Skill skill = skillsList.get(a); - if(skill != null) - { + if (skill != null) { skill.sync(user); } } diff --git a/src/main/java/minefantasy/mf2/api/rpg/Skill.java b/src/main/java/minefantasy/mf2/api/rpg/Skill.java index 6def82ec..6329bb16 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/Skill.java +++ b/src/main/java/minefantasy/mf2/api/rpg/Skill.java @@ -3,144 +3,133 @@ import minefantasy.mf2.api.MineFantasyAPI; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.StatCollector; import net.minecraftforge.common.MinecraftForge; -public class Skill -{ +public class Skill { public final String skillName; - public Skill(String name) - { + + public Skill(String name) { this.skillName = name; } - public int getMaxLevel() - { + + public int getMaxLevel() { return 100; } - public int getStartLevel() - { + + public int getStartLevel() { return 1; } - public Skill register() - { + + public Skill register() { RPGElements.addSkill(this); return this; } - + /** * Gets how much xp needed to level up */ - public int getLvlXP(int level, EntityPlayer user) - { - float rise = 0.2F * RPGElements.levelUpModifier;//20% rize each level - return (int) Math.floor(10F * (1.0F + (rise*(level-1)))); + public int getLvlXP(int level, EntityPlayer user) { + float rise = 0.2F * RPGElements.levelUpModifier;// 20% rize each level + return (int) Math.floor(10F * (1.0F + (rise * (level - 1)))); } - - public int[] getXP(EntityPlayer player) - { + + public int[] getXP(EntityPlayer player) { NBTTagCompound skill = RPGElements.getSkill(player, skillName); - - if(skill != null) - { + + if (skill != null) { int value = skill.getInteger("xp"); int max = skill.getInteger("xpMax"); - return new int[]{value, max}; + return new int[] { value, max }; } - return new int[]{0, 0}; + return new int[] { 0, 0 }; } - - public void manualLvlUp(EntityPlayer player, int newLevel) - { + + public void manualLvlUp(EntityPlayer player, int newLevel) { NBTTagCompound skill = RPGElements.getSkill(player, skillName); - if(skill == null)return; - + if (skill == null) + return; + skill.setInteger("xp", 0); - + skill.setInteger("level", newLevel); skill.setInteger("xp", 0); skill.setInteger("xpMax", getLvlXP(newLevel, player)); levelUp(player, newLevel); } - + /** * Adds xp to the skill, negative values take xp away */ - public void addXP(EntityPlayer player, int xp) - { - xp = (int)(RPGElements.levelSpeedModifier * xp); + public void addXP(EntityPlayer player, int xp) { + xp = (int) (RPGElements.levelSpeedModifier * xp); NBTTagCompound skill = RPGElements.getSkill(player, skillName); - if(skill == null)return; - + if (skill == null) + return; + int value = skill.getInteger("xp"); int max = skill.getInteger("xpMax"); int curLvl = RPGElements.getLevel(player, this); - - if(max <= 0 || curLvl >= getMaxLevel()) - { + + if (max <= 0 || curLvl >= getMaxLevel()) { return; } value += xp; skill.setInteger("xp", value); - - if(value >= max) - { + + if (value >= max) { value -= max; int level = skill.getInteger("level") + 1; skill.setInteger("level", level); skill.setInteger("xp", value); skill.setInteger("xpMax", getLvlXP(level, player)); levelUp(player, level); - } - else - { - if(value < 0) - { + } else { + if (value < 0) { int level = skill.getInteger("level") - 1; - if(level < 1)return; - + if (level < 1) + return; + skill.setInteger("level", level); - + int newMax = getLvlXP(level, player); - skill.setInteger("xp", value+newMax); + skill.setInteger("xp", value + newMax); skill.setInteger("xpMax", newMax); } } } - private void levelUp(EntityPlayer player, int newlvl) - { - if(!player.worldObj.isRemote) - { + + private void levelUp(EntityPlayer player, int newlvl) { + if (!player.worldObj.isRemote) { MineFantasyAPI.debugMsg("Level up detected for " + skillName); MinecraftForge.EVENT_BUS.post(new LevelupEvent(player, this, newlvl)); } } + /** * This is a universal way to tell a skill to do something - * @param functionID a string representing what to do, depends on the skill + * + * @param functionID + * a string representing what to do, depends on the skill */ - public void callFunction(EntityPlayer user, String functionID) - { + public void callFunction(EntityPlayer user, String functionID) { } - - public void init(NBTTagCompound tag, EntityPlayer player) - { + + public void init(NBTTagCompound tag, EntityPlayer player) { int start = getStartLevel(); tag.setInteger("level", start); tag.setInteger("xp", 0); tag.setInteger("xpMax", getLvlXP(start, player)); } - public void sync(EntityPlayer player) - { - if(!player.worldObj.isRemote) - { + + public void sync(EntityPlayer player) { + if (!player.worldObj.isRemote) { MineFantasyAPI.debugMsg("Sync skill: " + skillName); MinecraftForge.EVENT_BUS.post(new SyncSkillEvent(player, this)); } } - - public String getDisplayName() - { - return StatCollector.translateToLocal("skill."+skillName+".name"); + + public String getDisplayName() { + return StatCollector.translateToLocal("skill." + skillName + ".name"); } } diff --git a/src/main/java/minefantasy/mf2/api/rpg/SkillList.java b/src/main/java/minefantasy/mf2/api/rpg/SkillList.java index b48351ae..f88971ba 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/SkillList.java +++ b/src/main/java/minefantasy/mf2/api/rpg/SkillList.java @@ -1,35 +1,33 @@ package minefantasy.mf2.api.rpg; -public class SkillList -{ - //MOVEMENT - //public static Skill athletics = new Skill("athletics").register(); - //public static Skill acrobatics = new Skill("acrobatics").register(); - //public static Skill sneak = new Skill("sneak").register(); - - //CRAFTING +public class SkillList { + // MOVEMENT + // public static Skill athletics = new Skill("athletics").register(); + // public static Skill acrobatics = new Skill("acrobatics").register(); + // public static Skill sneak = new Skill("sneak").register(); + + // CRAFTING public static Skill artisanry = new Skill("artisanry").register(); public static Skill engineering = new Skill("engineering").register(); public static Skill construction = new Skill("construction").register(); public static Skill provisioning = new Skill("provisioning").register(); public static Skill combat = new Skill("combat").register(); - - //OFFENSE - //public static Skill unarmed = new Skill("unarmed").register(); - //public static Skill blade = new Skill("blade").register(); - //public static Skill blunt = new Skill("blunt").register(); - //public static Skill axe = new Skill("axe").register(); - //public static Skill polearm = new Skill("polearm").register(); - //public static Skill exotic = new Skill("exotic").register(); - //public static Skill archery = new Skill("archery").register(); - - //DEFENCE - //public static Skill lightarmour = new Skill("lightarmour").register(); - //public static Skill mediumarmour = new Skill("mediumarmour").register(); - //public static Skill heavyarmour = new Skill("heavyarmour").register(); - //public static Skill block = new Skill("block").register(); - - public static void init() - { + + // OFFENSE + // public static Skill unarmed = new Skill("unarmed").register(); + // public static Skill blade = new Skill("blade").register(); + // public static Skill blunt = new Skill("blunt").register(); + // public static Skill axe = new Skill("axe").register(); + // public static Skill polearm = new Skill("polearm").register(); + // public static Skill exotic = new Skill("exotic").register(); + // public static Skill archery = new Skill("archery").register(); + + // DEFENCE + // public static Skill lightarmour = new Skill("lightarmour").register(); + // public static Skill mediumarmour = new Skill("mediumarmour").register(); + // public static Skill heavyarmour = new Skill("heavyarmour").register(); + // public static Skill block = new Skill("block").register(); + + public static void init() { } } diff --git a/src/main/java/minefantasy/mf2/api/rpg/SyncSkillEvent.java b/src/main/java/minefantasy/mf2/api/rpg/SyncSkillEvent.java index 72d8790d..ac2556d1 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/SyncSkillEvent.java +++ b/src/main/java/minefantasy/mf2/api/rpg/SyncSkillEvent.java @@ -3,13 +3,11 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.event.entity.living.LivingEvent; -public class SyncSkillEvent extends LivingEvent -{ +public class SyncSkillEvent extends LivingEvent { public final EntityPlayer thePlayer; public final Skill theSkill; - - public SyncSkillEvent(EntityPlayer player, Skill skill) - { + + public SyncSkillEvent(EntityPlayer player, Skill skill) { super(player); this.thePlayer = player; this.theSkill = skill; diff --git a/src/main/java/minefantasy/mf2/api/stamina/IHeldStaminaItem.java b/src/main/java/minefantasy/mf2/api/stamina/IHeldStaminaItem.java index ed91a653..8b9dbc41 100644 --- a/src/main/java/minefantasy/mf2/api/stamina/IHeldStaminaItem.java +++ b/src/main/java/minefantasy/mf2/api/stamina/IHeldStaminaItem.java @@ -3,9 +3,10 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; -public interface IHeldStaminaItem -{ +public interface IHeldStaminaItem { float getDecayMod(EntityLivingBase user, ItemStack item); + float getRegenModifier(EntityLivingBase user, ItemStack item); + float getIdleModifier(EntityLivingBase user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/stamina/IStaminaWeapon.java b/src/main/java/minefantasy/mf2/api/stamina/IStaminaWeapon.java index 0e6d575a..d260a5ec 100644 --- a/src/main/java/minefantasy/mf2/api/stamina/IStaminaWeapon.java +++ b/src/main/java/minefantasy/mf2/api/stamina/IStaminaWeapon.java @@ -3,7 +3,6 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; -public interface IStaminaWeapon -{ +public interface IStaminaWeapon { public float getStaminaDrainOnHit(EntityLivingBase user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/stamina/IWornStaminaItem.java b/src/main/java/minefantasy/mf2/api/stamina/IWornStaminaItem.java index 5193d776..d162f4d6 100644 --- a/src/main/java/minefantasy/mf2/api/stamina/IWornStaminaItem.java +++ b/src/main/java/minefantasy/mf2/api/stamina/IWornStaminaItem.java @@ -3,18 +3,22 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; -public interface IWornStaminaItem -{ +public interface IWornStaminaItem { /** - * This adds up between armour pieces: a - value takes off points while a + adds to them + * This adds up between armour pieces: a - value takes off points while a + adds + * to them */ float getDecayModifier(EntityLivingBase user, ItemStack item); + /** - * This adds up between armour pieces: a - value takes off points while a + adds to them + * This adds up between armour pieces: a - value takes off points while a + adds + * to them */ float getRegenModifier(EntityLivingBase user, ItemStack item); + /** - * This adds up between armour pieces: a - value takes off points while a + adds to them + * This adds up between armour pieces: a - value takes off points while a + adds + * to them */ float getIdleModifier(EntityLivingBase user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/stamina/StaminaBar.java b/src/main/java/minefantasy/mf2/api/stamina/StaminaBar.java index b840fc15..d7b53864 100644 --- a/src/main/java/minefantasy/mf2/api/stamina/StaminaBar.java +++ b/src/main/java/minefantasy/mf2/api/stamina/StaminaBar.java @@ -12,18 +12,17 @@ import net.minecraft.potion.Potion; import net.minecraft.world.World; -public class StaminaBar -{ +public class StaminaBar { /** * This is the main variable for the entire stamina feature */ public static boolean isSystemActive = true; - + public static float defaultMax = 100F; - + public static final String staminaRegenName = "MineFantasy_staminaRegen"; public static final String staminaRegenTicksName = "MineFantasy_staminaRegenTicks"; - + public static final String staminaBonusName = "MineFantasy_staminaMaxAddon"; public static final String staminaBonusTicksName = "MineFantasy_staminaMaxAddonTicks"; public static final String staminaMaxName = "MineFantasy_staminaMax"; @@ -32,7 +31,8 @@ public class StaminaBar public static final String staminaFlashName = "MineFantasy_staminaFlashing"; /** - * Modifies the decay speed for armour, this scales to what a full suit of plate does + * Modifies the decay speed for armour, this scales to what a full suit of plate + * does */ private static final float armourWeightModifier = 1.0F; private static final float armourWeightModifierClimbing = 5.0F; @@ -41,8 +41,8 @@ public class StaminaBar */ private static float bulkModifier = 1.0F; public static float regenModifier = 1.5F; - - //CONFIG VARS + + // CONFIG VARS /** * The decay modifier before being scaled by difficulty */ @@ -54,614 +54,533 @@ public class StaminaBar public static float configBulk = 1.0F; public static boolean scaleDifficulty = true; - public static boolean levelUp = false; + public static boolean levelUp = false; + + public static float levelAmount = 5F; - public static float levelAmount = 5F; - - //MAX STAMINA// - public static float getTotalMaxStamina(EntityLivingBase user) - { + // MAX STAMINA// + public static float getTotalMaxStamina(EntityLivingBase user) { return getBaseMaxStamina(user) + getBonusStamina(user); } - public static float getBaseMaxStamina(EntityLivingBase user) - { + + public static float getBaseMaxStamina(EntityLivingBase user) { float bonus = getStaminaLevelBoost(user); - if(user.getEntityData() != null) - { - if(!user.getEntityData().hasKey(staminaMaxName)) - { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaMaxName)) { setMaxStamina(user, getDefaultMax(user) + bonus); } - return user.getEntityData().getFloat(staminaMaxName) +bonus; + return user.getEntityData().getFloat(staminaMaxName) + bonus; } return getDefaultMax(user) + bonus; } - public static float getDefaultMax(EntityLivingBase user) - { + + public static float getDefaultMax(EntityLivingBase user) { return defaultMax; } - public static void setMaxStamina(EntityLivingBase user, float value) - { - if(user.getEntityData() != null) - { + + public static void setMaxStamina(EntityLivingBase user, float value) { + if (user.getEntityData() != null) { user.getEntityData().setFloat(staminaMaxName, value); } } - public static void modifyMaxStamina(EntityLivingBase user, float mod) - { - setMaxStamina(user, getBaseMaxStamina(user)+mod); - - if(getStaminaValue(user) < 0) - { + + public static void modifyMaxStamina(EntityLivingBase user, float mod) { + setMaxStamina(user, getBaseMaxStamina(user) + mod); + + if (getStaminaValue(user) < 0) { setStaminaValue(user, 0); } } - //REGEN BUFF STAMINA// - public static float getBonusStaminaRegen(EntityLivingBase user) - { + + // REGEN BUFF STAMINA// + public static float getBonusStaminaRegen(EntityLivingBase user) { float level = 0F; - if(user.getEntityData() != null) - { - if(!user.getEntityData().hasKey(staminaRegenName)) - { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaRegenName)) { setBonusStaminaRegen(user, 0F); } level += user.getEntityData().getFloat(staminaRegenName); } - if(user.getActivePotionEffect(Potion.regeneration) != null) - { - level += (user.getActivePotionEffect(Potion.regeneration).getAmplifier()+1)*2.5F; + if (user.getActivePotionEffect(Potion.regeneration) != null) { + level += (user.getActivePotionEffect(Potion.regeneration).getAmplifier() + 1) * 2.5F; } return level; } - public static void setBonusStaminaRegen(EntityLivingBase user, float value) - { - if(user.getEntityData() != null) - { + + public static void setBonusStaminaRegen(EntityLivingBase user, float value) { + if (user.getEntityData() != null) { user.getEntityData().setFloat(staminaRegenName, value); } } - - public static int getBonusStaminaRegenTicks(EntityLivingBase user) - { - if(user.getEntityData() != null) - { - if(!user.getEntityData().hasKey(staminaRegenTicksName)) - { + + public static int getBonusStaminaRegenTicks(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaRegenTicksName)) { setBonusStaminaRegenTicks(user, 0); } return user.getEntityData().getInteger(staminaRegenTicksName); } return 0; } - public static void setBonusStaminaRegenTicks(EntityLivingBase user, int value) - { - if(user.getEntityData() != null) - { + + public static void setBonusStaminaRegenTicks(EntityLivingBase user, int value) { + if (user.getEntityData() != null) { user.getEntityData().setInteger(staminaRegenTicksName, value); } } - public static float getRegenBonus(EntityLivingBase user) - { - return getBonusStaminaRegen(user)/20F; + + public static float getRegenBonus(EntityLivingBase user) { + return getBonusStaminaRegen(user) / 20F; } - - //TEMP STAMINA// - public static float getBonusStamina(EntityLivingBase user) - { - if(user.getEntityData() != null) - { - if(!user.getEntityData().hasKey(staminaBonusName)) - { + + // TEMP STAMINA// + public static float getBonusStamina(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaBonusName)) { setBonusStamina(user, 0F); } return user.getEntityData().getFloat(staminaBonusName); } return 0F; } - private static float getStaminaLevelBoost(EntityLivingBase user) - { - if(user.worldObj.isRemote)return 0; - + + private static float getStaminaLevelBoost(EntityLivingBase user) { + if (user.worldObj.isRemote) + return 0; + float amount = 0F; - if(user instanceof EntityPlayer && levelUp && levelAmount > 0) - { - EntityPlayer player = (EntityPlayer)user; - if(player.experienceLevel > 0) - { - amount += (player.experienceLevel*levelAmount); + if (user instanceof EntityPlayer && levelUp && levelAmount > 0) { + EntityPlayer player = (EntityPlayer) user; + if (player.experienceLevel > 0) { + amount += (player.experienceLevel * levelAmount); } } return amount; } - public static void setBonusStamina(EntityLivingBase user, float value) - { - if(user.getEntityData() != null) - { + + public static void setBonusStamina(EntityLivingBase user, float value) { + if (user.getEntityData() != null) { user.getEntityData().setFloat(staminaBonusName, value); } } - - public static int getBonusStaminaTicks(EntityLivingBase user) - { - if(user.getEntityData() != null) - { - if(!user.getEntityData().hasKey(staminaBonusTicksName)) - { + + public static int getBonusStaminaTicks(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaBonusTicksName)) { setBonusStaminaTicks(user, 0); } return user.getEntityData().getInteger(staminaBonusTicksName); } return 0; } - public static void setBonusStaminaTicks(EntityLivingBase user, int value) - { - if(user.getEntityData() != null) - { + + public static void setBonusStaminaTicks(EntityLivingBase user, int value) { + if (user.getEntityData() != null) { user.getEntityData().setInteger(staminaBonusTicksName, value); } } - - public static void tickBonus(EntityLivingBase user) - { - if(user.worldObj.isRemote)return; - + + public static void tickBonus(EntityLivingBase user) { + if (user.worldObj.isRemote) + return; + int currentTicks = getBonusStaminaTicks(user); - currentTicks --; - if(currentTicks <= 0) - { + currentTicks--; + if (currentTicks <= 0) { setBonusStaminaTicks(user, 0); setBonusStamina(user, 0); - - if(getStaminaValue(user) > getTotalMaxStamina(user)) - { + + if (getStaminaValue(user) > getTotalMaxStamina(user)) { setStaminaValue(user, getTotalMaxStamina(user)); } return; } setBonusStaminaTicks(user, currentTicks); } - public static void tickBonusRegen(EntityLivingBase user) - { - if(user.worldObj.isRemote)return; - + + public static void tickBonusRegen(EntityLivingBase user) { + if (user.worldObj.isRemote) + return; + int currentTicks = getBonusStaminaRegenTicks(user); - currentTicks --; - if(currentTicks <= 0) - { + currentTicks--; + if (currentTicks <= 0) { setBonusStaminaRegenTicks(user, 0); setBonusStaminaRegen(user, 0); return; } setBonusStaminaRegenTicks(user, currentTicks); } - + /** - * Call this to buff stamina temporarily, it will not override more potent effects - * @param user the entity to buff - * @param mod the amount of stamina added - * @param seconds the time it takes to wear off + * Call this to buff stamina temporarily, it will not override more potent + * effects + * + * @param user + * the entity to buff + * @param mod + * the amount of stamina added + * @param seconds + * the time it takes to wear off * @return true if either time or modification is applied. */ - public static boolean buffStamina(EntityLivingBase user, float mod, int seconds) - { - if(!isSystemActive) - { + public static boolean buffStamina(EntityLivingBase user, float mod, int seconds) { + if (!isSystemActive) { return false; } boolean success = false; int ticks = seconds * 20; - + float current = getBonusStamina(user); int currentTicks = getBonusStaminaTicks(user); - if(mod >= current) - { + if (mod >= current) { success = true; setBonusStaminaTicks(user, ticks); setBonusStamina(user, mod); } return false; } - public static boolean buffStaminaRegen(EntityLivingBase user, float mod, int seconds) - { - if(!isSystemActive) - { + + public static boolean buffStaminaRegen(EntityLivingBase user, float mod, int seconds) { + if (!isSystemActive) { return false; } boolean success = false; int ticks = seconds * 20; - + float current = getBonusStaminaRegen(user); int currentTicks = getBonusStaminaRegenTicks(user); - if(mod >= current && ticks >= currentTicks) - { + if (mod >= current && ticks >= currentTicks) { success = true; setBonusStaminaRegenTicks(user, ticks); setBonusStaminaRegen(user, mod); } return false; } + /** * This increases the users max stamina - * @param user the user - * @param value the amount to add to max stamina - * @param maxBonus the maximum this can achieve (not counting base stamina), <0 means no limit + * + * @param user + * the user + * @param value + * the amount to add to max stamina + * @param maxBonus + * the maximum this can achieve (not counting base stamina), <0 means + * no limit */ - public static boolean incrStaminaMax(EntityLivingBase user, float value, float maxBonus) - { + public static boolean incrStaminaMax(EntityLivingBase user, float value, float maxBonus) { float current = getBaseMaxStamina(user); - if(maxBonus > 0 && current >= maxBonus) - { + if (maxBonus > 0 && current >= maxBonus) { return false; } - setMaxStamina(user, Math.min(maxBonus, current+value)); + setMaxStamina(user, Math.min(maxBonus, current + value)); MineFantasyAPI.debugMsg("Increased Max Stamina by " + value); return true; } - - //STAMINA VALUE// - public static float getStaminaValue(EntityLivingBase user) - { - if(user.getEntityData() != null) - { - if(!user.getEntityData().hasKey(staminaValueName)) - { + + // STAMINA VALUE// + public static float getStaminaValue(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaValueName)) { setStaminaValue(user, getDefaultMax(user)); } return user.getEntityData().getFloat(staminaValueName); } return getDefaultMax(user); } - public static void setStaminaValue(EntityLivingBase user, float value) - { - if(user.getEntityData() != null) - { + + public static void setStaminaValue(EntityLivingBase user, float value) { + if (user.getEntityData() != null) { user.getEntityData().setFloat(staminaValueName, value); } } - public static void modifyStaminaValue(EntityLivingBase user, float mod) - { - if(mod < 0 && PowerArmour.isPowered(user)) - { + + public static void modifyStaminaValue(EntityLivingBase user, float mod) { + if (mod < 0 && PowerArmour.isPowered(user)) { return; } - setStaminaValue(user, getStaminaValue(user)+mod); - - if(mod < 0 && getStaminaValue(user) < 0) - { + setStaminaValue(user, getStaminaValue(user) + mod); + + if (mod < 0 && getStaminaValue(user) < 0) { setStaminaValue(user, 0); } float max = getTotalMaxStamina(user); - if(getStaminaValue(user) > max) - { + if (getStaminaValue(user) > max) { setStaminaValue(user, max); } } - - //DECIMAL PERCENT VALUE// - public static float getStaminaDecimal(EntityLivingBase user) - { + + // DECIMAL PERCENT VALUE// + public static float getStaminaDecimal(EntityLivingBase user) { return getStaminaValue(user) / getTotalMaxStamina(user); } - //INIT// - public static void refreshSystem(EntityLivingBase user) - { - if(user.getEntityData() != null) - { + + // INIT// + public static void refreshSystem(EntityLivingBase user) { + if (user.getEntityData() != null) { NBTTagCompound nbt = user.getEntityData(); - - if(!nbt.hasKey(staminaMaxName)) - { + + if (!nbt.hasKey(staminaMaxName)) { nbt.setFloat(staminaMaxName, getDefaultMax(user)); } - if(!nbt.hasKey(staminaValueName)) - { + if (!nbt.hasKey(staminaValueName)) { nbt.setFloat(staminaValueName, getDefaultMax(user)); } - if(!nbt.hasKey(staminaFlashName)) - { + if (!nbt.hasKey(staminaFlashName)) { nbt.setFloat(staminaFlashName, 0); } } } - - //STAMINA IDLE// - public static float getIdleTime(EntityLivingBase user) - { - if(user.getEntityData() != null) - { - if(!user.getEntityData().hasKey(staminaIdleName)) - { + + // STAMINA IDLE// + public static float getIdleTime(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaIdleName)) { setIdleTime(user, 0); } return user.getEntityData().getFloat(staminaIdleName); } return 0; } - public static void setIdleTime(EntityLivingBase user, float value) - { - if(user.getEntityData() != null) - { + + public static void setIdleTime(EntityLivingBase user, float value) { + if (user.getEntityData() != null) { user.getEntityData().setFloat(staminaIdleName, value); } } - public static void ModifyIdleTime(EntityLivingBase user, float mod) - { - setIdleTime(user, getIdleTime(user)+mod); + + public static void ModifyIdleTime(EntityLivingBase user, float mod) { + setIdleTime(user, getIdleTime(user) + mod); } - - - //STAMINA FLASH// - public static float getFlashTime(EntityLivingBase user) - { - if(user.getEntityData() != null) - { - if(!user.getEntityData().hasKey(staminaFlashName)) - { + + // STAMINA FLASH// + public static float getFlashTime(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaFlashName)) { setFlashTime(user, 0); } return user.getEntityData().getFloat(staminaFlashName); } return 0; } - public static void setFlashTime(EntityLivingBase user, float value) - { - if(!(user instanceof EntityPlayer)) - { + + public static void setFlashTime(EntityLivingBase user, float value) { + if (!(user instanceof EntityPlayer)) { return; } - if(user.getEntityData() != null) - { + if (user.getEntityData() != null) { user.getEntityData().setFloat(staminaFlashName, value); } } - public static void ModifyFlashTime(EntityLivingBase user, float mod) - { - setFlashTime(user, getFlashTime(user)+mod); + + public static void ModifyFlashTime(EntityLivingBase user, float mod) { + setFlashTime(user, getFlashTime(user) + mod); } - + /** - * determines if the stamina can take a specific value + * determines if the stamina can take a specific value */ /** * Checks if stamina is available - * @param onUse whether or not stamina is trying to be used + * + * @param onUse + * whether or not stamina is trying to be used * @return */ - public static boolean isStaminaAvailable(EntityLivingBase user, float level, boolean onUse) - { - if(getStaminaValue(user) >= level) - { + public static boolean isStaminaAvailable(EntityLivingBase user, float level, boolean onUse) { + if (getStaminaValue(user) >= level) { return true; } - if(onUse) - { + if (onUse) { setFlashTime(user, 40); } return false; } - public static boolean isAnyStamina(EntityLivingBase user, boolean flash) - { + + public static boolean isAnyStamina(EntityLivingBase user, boolean flash) { return isStaminaAvailable(user, 1, flash); } - public static boolean isPercentStamAvailable(EntityLivingBase user, float decimal, boolean flash) - { - if(PowerArmour.isPowered(user)) - { - return true;//Cogwork infinite power + + public static boolean isPercentStamAvailable(EntityLivingBase user, float decimal, boolean flash) { + if (PowerArmour.isPowered(user)) { + return true;// Cogwork infinite power } - - return isStaminaAvailable(user, getTotalMaxStamina(user)*decimal, flash); + + return isStaminaAvailable(user, getTotalMaxStamina(user) * decimal, flash); } - - public static float getBaseDecayModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) - { - if(PowerArmour.isPowered(user)) - { + + public static float getBaseDecayModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) { + if (PowerArmour.isPowered(user)) { return 0F; } float value = getDecayModifier(user.worldObj); float AM = 1.0F; - if(user instanceof EntityPlayer) - { - value *= getBasePerkStaminaModifier(value, (EntityPlayer)user); - AM = getPerkArmModifier(value, (EntityPlayer)user); + if (user instanceof EntityPlayer) { + value *= getBasePerkStaminaModifier(value, (EntityPlayer) user); + AM = getPerkArmModifier(value, (EntityPlayer) user); } - if(TacticalManager.isImmuneToWeight(user)) - { + if (TacticalManager.isImmuneToWeight(user)) { return value * 0.5F; } - - if(countHeld) - { - if(user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) - { - value *= (((IHeldStaminaItem)user.getHeldItem().getItem()).getDecayMod(user, user.getHeldItem())); + + if (countHeld) { + if (user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) { + value *= (((IHeldStaminaItem) user.getHeldItem().getItem()).getDecayMod(user, user.getHeldItem())); } } - if(countArmour) - { + if (countArmour) { float armourMod = 1.0F; - for(int slot = 1; slot <= 4; slot ++) - { + for (int slot = 1; slot <= 4; slot++) { ItemStack armour = user.getEquipmentInSlot(slot); - if(armour != null && armour.getItem() instanceof IWornStaminaItem) - { - armourMod += (((IWornStaminaItem)armour.getItem()).getDecayModifier(user, armour)); + if (armour != null && armour.getItem() instanceof IWornStaminaItem) { + armourMod += (((IWornStaminaItem) armour.getItem()).getDecayModifier(user, armour)); } } float min = ArmourCalculator.encumberanceArray[0]; float max = ArmourCalculator.encumberanceArray[1]; float mass = ArmourCalculator.getTotalWeightOfWorn(user, false) - min; - - if(mass > 0F) - { - float modifiers = AM * configArmourWeightModifier* armourWeightModifier; - armourMod += ( (mass+min) / max); + + if (mass > 0F) { + float modifiers = AM * configArmourWeightModifier * armourWeightModifier; + armourMod += ((mass + min) / max); } value *= armourMod; } return value; } - public static float getClimbinbDecayModifier(EntityLivingBase user, boolean countArmour) - { + + public static float getClimbinbDecayModifier(EntityLivingBase user, boolean countArmour) { float value = getDecayModifier(user.worldObj); - - if(!TacticalManager.isImmuneToWeight(user) && countArmour) - { + + if (!TacticalManager.isImmuneToWeight(user) && countArmour) { float armourMod = 1.0F; - for(int slot = 1; slot <= 4; slot ++) - { + for (int slot = 1; slot <= 4; slot++) { ItemStack armour = user.getEquipmentInSlot(slot); - if(armour != null && armour.getItem() instanceof IWornStaminaItem) - { - armourMod += ((IWornStaminaItem)armour.getItem()).getDecayModifier(user, armour); + if (armour != null && armour.getItem() instanceof IWornStaminaItem) { + armourMod += ((IWornStaminaItem) armour.getItem()).getDecayModifier(user, armour); } } float min = ArmourCalculator.encumberanceArray[0]; float max = ArmourCalculator.encumberanceArray[1]; - float mass = ArmourCalculator.getTotalWeightOfWorn(user, false)-min; - if(mass > 0) - { - value *= (1+( (min+mass) / max * configArmourWeightModifier*(armourWeightModifierClimbing-1))); + float mass = ArmourCalculator.getTotalWeightOfWorn(user, false) - min; + if (mass > 0) { + value *= (1 + ((min + mass) / max * configArmourWeightModifier * (armourWeightModifierClimbing - 1))); } value *= armourMod; } return value; } - - public static float getBaseRegenModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) - { - float value = configRegenModifier * regenModifier * (5F/3F); - - if(!TacticalManager.isImmuneToWeight(user)) - { - if(countHeld) - { - if(user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) - { - value *= ((IHeldStaminaItem)user.getHeldItem().getItem()).getRegenModifier(user, user.getHeldItem()); + + public static float getBaseRegenModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) { + float value = configRegenModifier * regenModifier * (5F / 3F); + + if (!TacticalManager.isImmuneToWeight(user)) { + if (countHeld) { + if (user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) { + value *= ((IHeldStaminaItem) user.getHeldItem().getItem()).getRegenModifier(user, + user.getHeldItem()); } } - if(countArmour) - { + if (countArmour) { float AM = 1.0F; - if(user instanceof EntityPlayer) - { - AM = getPerkArmModifier(value, (EntityPlayer)user); + if (user instanceof EntityPlayer) { + AM = getPerkArmModifier(value, (EntityPlayer) user); } - + float armourMod = 1.0F; - for(int slot = 1; slot <= 4; slot ++) - { + for (int slot = 1; slot <= 4; slot++) { ItemStack armour = user.getEquipmentInSlot(slot); - if(armour != null && armour.getItem() instanceof IWornStaminaItem) - { - armourMod += ((IWornStaminaItem)armour.getItem()).getRegenModifier(user, armour); + if (armour != null && armour.getItem() instanceof IWornStaminaItem) { + armourMod += ((IWornStaminaItem) armour.getItem()).getRegenModifier(user, armour); } } - float weightMod = ArmourCalculator.getTotalWeightOfWorn(user, false)*bulkModifier*configBulk; - if(weightMod > 0) - { + float weightMod = ArmourCalculator.getTotalWeightOfWorn(user, false) * bulkModifier * configBulk; + if (weightMod > 0) { float min = ArmourCalculator.encumberanceArray[0]; float max = ArmourCalculator.encumberanceArray[1]; - value /= (1.0F+( (min+weightMod) / (max/2) * AM * 0.5F)); + value /= (1.0F + ((min + weightMod) / (max / 2) * AM * 0.5F)); } value *= armourMod; } } - if(user.isSneaking()) - { + if (user.isSneaking()) { value *= 1.5F; } - + return value; } - - public static float getBaseIdleModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) - { + + public static float getBaseIdleModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) { float value = pauseModifier; - - if(!TacticalManager.isImmuneToWeight(user)) - { - if(countHeld) - { - if(user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) - { - value *= ((IHeldStaminaItem)user.getHeldItem().getItem()).getIdleModifier(user, user.getHeldItem()); + + if (!TacticalManager.isImmuneToWeight(user)) { + if (countHeld) { + if (user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) { + value *= ((IHeldStaminaItem) user.getHeldItem().getItem()).getIdleModifier(user, + user.getHeldItem()); } } - if(countArmour) - { + if (countArmour) { float armourMod = 1.0F; - for(int slot = 1; slot <= 4; slot ++) - { + for (int slot = 1; slot <= 4; slot++) { ItemStack armour = user.getEquipmentInSlot(slot); - if(armour != null && armour.getItem() instanceof IWornStaminaItem) - { - armourMod += ((IWornStaminaItem)armour.getItem()).getIdleModifier(user, armour); + if (armour != null && armour.getItem() instanceof IWornStaminaItem) { + armourMod += ((IWornStaminaItem) armour.getItem()).getIdleModifier(user, armour); } } } } - + return value; } + /** - * This scales the decay modifier across all fields on difficulty - * It's base level is on normal with easy,peaceful being 25% - 50% slower. - * Hard is 25% faster + * This scales the decay modifier across all fields on difficulty It's base + * level is on normal with easy,peaceful being 25% - 50% slower. Hard is 25% + * faster */ - public static float getDecayModifier(World world) - { - if(!scaleDifficulty) - { + public static float getDecayModifier(World world) { + if (!scaleDifficulty) { return decayModifierCfg * decayModifierBase; } - int difficultyMod = world.difficultySetting.getDifficultyId()-2; - return (decayModifierCfg * decayModifierBase) + (0.25F*difficultyMod); + int difficultyMod = world.difficultySetting.getDifficultyId() - 2; + return (decayModifierCfg * decayModifierBase) + (0.25F * difficultyMod); } + private static final String noStaminaNBT = "MF_NoStamina"; - public static boolean restrictSystem = true; - + public static boolean restrictSystem = true; + /** * This toggles the stamina use for entities */ - public static void setStaminaFlag(EntityLivingBase entity, boolean flag) - { + public static void setStaminaFlag(EntityLivingBase entity, boolean flag) { entity.getEntityData().setBoolean(noStaminaNBT, flag); } - public static boolean doesAffectEntity(EntityLivingBase entity) - { - if(entity.getEntityData().hasKey(noStaminaNBT)) - { + + public static boolean doesAffectEntity(EntityLivingBase entity) { + if (entity.getEntityData().hasKey(noStaminaNBT)) { return entity.getEntityData().getBoolean(noStaminaNBT); } - if(entity instanceof EntityPlayer) - { - EntityPlayer p = (EntityPlayer)entity; + if (entity instanceof EntityPlayer) { + EntityPlayer p = (EntityPlayer) entity; return !p.capabilities.isCreativeMode; - } - else if(restrictSystem) - { + } else if (restrictSystem) { return false; } return MineFantasyAPI.isInDebugMode || !entity.isEntityUndead(); } - - private static float getPerkArmModifier(float value, EntityPlayer user) - { - if(ResearchLogic.hasInfoUnlocked(user, "armourpro")) - { + + private static float getPerkArmModifier(float value, EntityPlayer user) { + if (ResearchLogic.hasInfoUnlocked(user, "armourpro")) { value *= 0.5F; } return value; } - private static float getBasePerkStaminaModifier(float value, EntityPlayer user) - { - if(ResearchLogic.hasInfoUnlocked(user, "fitness")) - { + + private static float getBasePerkStaminaModifier(float value, EntityPlayer user) { + if (ResearchLogic.hasInfoUnlocked(user, "fitness")) { value *= 0.75F; } return value; diff --git a/src/main/java/minefantasy/mf2/api/tier/IToolMaterial.java b/src/main/java/minefantasy/mf2/api/tier/IToolMaterial.java index b70c1b99..f7a1f77c 100644 --- a/src/main/java/minefantasy/mf2/api/tier/IToolMaterial.java +++ b/src/main/java/minefantasy/mf2/api/tier/IToolMaterial.java @@ -2,8 +2,7 @@ import net.minecraft.item.Item.ToolMaterial; -public interface IToolMaterial -{ +public interface IToolMaterial { /** * Gets the material for outside reference */ diff --git a/src/main/java/minefantasy/mf2/api/tool/IHuntingItem.java b/src/main/java/minefantasy/mf2/api/tool/IHuntingItem.java index efedff79..113f9d43 100644 --- a/src/main/java/minefantasy/mf2/api/tool/IHuntingItem.java +++ b/src/main/java/minefantasy/mf2/api/tool/IHuntingItem.java @@ -2,8 +2,7 @@ import net.minecraft.item.ItemStack; -public interface IHuntingItem -{ +public interface IHuntingItem { /** * Determines if item can retrive drops from animals */ diff --git a/src/main/java/minefantasy/mf2/api/tool/ILighter.java b/src/main/java/minefantasy/mf2/api/tool/ILighter.java index cfa75c8c..c8b2873f 100644 --- a/src/main/java/minefantasy/mf2/api/tool/ILighter.java +++ b/src/main/java/minefantasy/mf2/api/tool/ILighter.java @@ -3,6 +3,7 @@ public interface ILighter { boolean canLight(); + double getChance(); } diff --git a/src/main/java/minefantasy/mf2/api/tool/IToolMF.java b/src/main/java/minefantasy/mf2/api/tool/IToolMF.java index b3cd3a17..35c9e0cd 100644 --- a/src/main/java/minefantasy/mf2/api/tool/IToolMF.java +++ b/src/main/java/minefantasy/mf2/api/tool/IToolMF.java @@ -2,18 +2,18 @@ import net.minecraft.item.ItemStack; -public interface IToolMF -{ +public interface IToolMF { /** - * Gets the efficienty of this tool for processing (recommended to use ToolMaterial.getEfficiencyOnProperMaterial()) + * Gets the efficienty of this tool for processing (recommended to use + * ToolMaterial.getEfficiencyOnProperMaterial()) */ public float getEfficiency(ItemStack item); - + /** * Gets the tier of the material, some recipes may need certain tiers */ public int getTier(ItemStack item); - + /** * Gets the type of tool for crafting (eg, hammer, knife, needle) */ diff --git a/src/main/java/minefantasy/mf2/api/weapon/DamageSourceAP.java b/src/main/java/minefantasy/mf2/api/weapon/DamageSourceAP.java index 711acdef..20e6573c 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/DamageSourceAP.java +++ b/src/main/java/minefantasy/mf2/api/weapon/DamageSourceAP.java @@ -2,14 +2,13 @@ import net.minecraft.util.DamageSource; -public class DamageSourceAP extends DamageSource -{ +public class DamageSourceAP extends DamageSource { public static DamageSource blunt = new DamageSourceAP(); - public DamageSourceAP() - { + + public DamageSourceAP() { super("battlegearExtra"); this.setDamageBypassesArmor(); this.setDamageIsAbsolute(); } - + } diff --git a/src/main/java/minefantasy/mf2/api/weapon/ICustomHitSound.java b/src/main/java/minefantasy/mf2/api/weapon/ICustomHitSound.java index 88ba32e2..2e4036ea 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/ICustomHitSound.java +++ b/src/main/java/minefantasy/mf2/api/weapon/ICustomHitSound.java @@ -4,10 +4,10 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; -public interface ICustomHitSound -{ +public interface ICustomHitSound { /** * Plays the hit sound + * * @return true if it makes it's own sound */ public boolean playHitSound(ItemStack item, EntityLivingBase attacker, Entity target); diff --git a/src/main/java/minefantasy/mf2/api/weapon/IDamageModifier.java b/src/main/java/minefantasy/mf2/api/weapon/IDamageModifier.java index 7b35b5d7..ac61e136 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IDamageModifier.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IDamageModifier.java @@ -4,7 +4,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; -public interface IDamageModifier -{ - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, boolean properHit); +public interface IDamageModifier { + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IDamageType.java b/src/main/java/minefantasy/mf2/api/weapon/IDamageType.java index 7ce761e1..763abc34 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IDamageType.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IDamageType.java @@ -1,17 +1,25 @@ package minefantasy.mf2.api.weapon; -public interface IDamageType -{ +public interface IDamageType { /** - * Gets the cutting:blunt ratio. use any 3 numbers, the relevant values is what matters - * @param implement the object causing the damage, this is "ItemStack" for items and "Entity" for projectiles - * This can therefore be implemented by projectile entities and items + * Gets the cutting:blunt ratio. use any 3 numbers, the relevant values is what + * matters + * + * @param implement + * the object causing the damage, this is "ItemStack" for items and + * "Entity" for projectiles This can therefore be implemented by + * projectile entities and items */ public float[] getDamageRatio(Object... implement); + /** - * Gets the "Penetration" level: this modifies the armour rating of supported armours, 0 means no effect - * @param implement the object causing the damage, this is "ItemStack" for items and "Entity" for projectiles - * This can therefore be implemented by projectile entities and items + * Gets the "Penetration" level: this modifies the armour rating of supported + * armours, 0 means no effect + * + * @param implement + * the object causing the damage, this is "ItemStack" for items and + * "Entity" for projectiles This can therefore be implemented by + * projectile entities and items */ public float getPenetrationLevel(Object implement); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IKnockbackWeapon.java b/src/main/java/minefantasy/mf2/api/weapon/IKnockbackWeapon.java index 33230160..b15b71b4 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IKnockbackWeapon.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IKnockbackWeapon.java @@ -3,7 +3,6 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; -public interface IKnockbackWeapon -{ +public interface IKnockbackWeapon { public float getAddedKnockback(EntityLivingBase user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IParryable.java b/src/main/java/minefantasy/mf2/api/weapon/IParryable.java index 6846a468..a52e984b 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IParryable.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IParryable.java @@ -5,17 +5,17 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; -public interface IParryable -{ +public interface IParryable { /** * Determines if the weapon can parry in the first place */ public boolean canParry(DamageSource source, EntityLivingBase blocker, ItemStack item); + /** * This gets how accurate you need to be facing to parry */ public float getParryAngle(DamageSource source, EntityLivingBase blocker, ItemStack item); - + /** * Calls a method when the defender parrys the attacker */ @@ -30,13 +30,14 @@ public interface IParryable * Gets the maximum amount of damage parry can reduce */ public float getMaxDamageParry(EntityLivingBase user, ItemStack weapon); - + public boolean canUserParry(EntityLivingBase user); - + /** * Modifies the amount stamina decays when parrying, 1.0 = default */ public float getParryStaminaDecay(DamageSource source, ItemStack weapon); + /** * Gets how many ticks it takes to recover from a parry */ diff --git a/src/main/java/minefantasy/mf2/api/weapon/IPowerAttack.java b/src/main/java/minefantasy/mf2/api/weapon/IPowerAttack.java index 6945dc03..83aee223 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IPowerAttack.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IPowerAttack.java @@ -4,8 +4,8 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; -public interface IPowerAttack -{ +public interface IPowerAttack { public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target); + public void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IRackItem.java b/src/main/java/minefantasy/mf2/api/weapon/IRackItem.java index fbfbcd24..1f52a894 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IRackItem.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IRackItem.java @@ -10,13 +10,13 @@ public interface IRackItem { float getOffsetX(ItemStack itemstack); float getOffsetY(ItemStack itemstack); - + float getOffsetZ(ItemStack itemstack); float getRotationOffset(ItemStack itemstack); boolean canHang(TileEntityRack rack, ItemStack item, int slot); - + boolean isSpecialRender(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/ISharpenable.java b/src/main/java/minefantasy/mf2/api/weapon/ISharpenable.java index 70263859..de2f895b 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/ISharpenable.java +++ b/src/main/java/minefantasy/mf2/api/weapon/ISharpenable.java @@ -2,17 +2,17 @@ import net.minecraft.item.ItemStack; -public interface ISharpenable -{ +public interface ISharpenable { /** - * The max amount of uses of sharpness - * -1 means can't be sharpened + * The max amount of uses of sharpness -1 means can't be sharpened */ public float getMaxSharpness(ItemStack item); + /** * The max percent that it can increase damage */ public float getDamagePercentMax(ItemStack item); + /** * The modifier for how much percent is added each use */ diff --git a/src/main/java/minefantasy/mf2/api/weapon/ISpecialCombatMob.java b/src/main/java/minefantasy/mf2/api/weapon/ISpecialCombatMob.java index 332f404e..126b839f 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/ISpecialCombatMob.java +++ b/src/main/java/minefantasy/mf2/api/weapon/ISpecialCombatMob.java @@ -3,8 +3,7 @@ import net.minecraft.entity.Entity; import net.minecraft.util.DamageSource; -public interface ISpecialCombatMob -{ +public interface ISpecialCombatMob { boolean canParry(DamageSource source); void onParry(DamageSource source, Entity attacker, float dam); diff --git a/src/main/java/minefantasy/mf2/api/weapon/ISpecialEffect.java b/src/main/java/minefantasy/mf2/api/weapon/ISpecialEffect.java index 1f80649e..46c71c79 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/ISpecialEffect.java +++ b/src/main/java/minefantasy/mf2/api/weapon/ISpecialEffect.java @@ -4,7 +4,6 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; -public interface ISpecialEffect -{ +public interface ISpecialEffect { public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IWeaponClass.java b/src/main/java/minefantasy/mf2/api/weapon/IWeaponClass.java index 9181393a..22443bfa 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IWeaponClass.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IWeaponClass.java @@ -1,6 +1,5 @@ package minefantasy.mf2.api.weapon; -public interface IWeaponClass -{ +public interface IWeaponClass { public WeaponClass getWeaponClass(); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IWeaponSpeed.java b/src/main/java/minefantasy/mf2/api/weapon/IWeaponSpeed.java index 45405d98..dbd2106b 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IWeaponSpeed.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IWeaponSpeed.java @@ -3,7 +3,6 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; -public interface IWeaponSpeed -{ +public interface IWeaponSpeed { public int modifyHitTime(EntityLivingBase user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IWeightedWeapon.java b/src/main/java/minefantasy/mf2/api/weapon/IWeightedWeapon.java index 23eb1979..b9567d05 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IWeightedWeapon.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IWeightedWeapon.java @@ -2,11 +2,10 @@ import net.minecraft.entity.EntityLivingBase; -public interface IWeightedWeapon -{ +public interface IWeightedWeapon { /** - * Gets the amount that you are thrown off balance, <= 0 means no effect - * Spears use 0.5 + * Gets the amount that you are thrown off balance, <= 0 means no effect Spears + * use 0.5 */ public float getBalance(EntityLivingBase user); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/WeaponClass.java b/src/main/java/minefantasy/mf2/api/weapon/WeaponClass.java index 181560bb..b81a12f3 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/WeaponClass.java +++ b/src/main/java/minefantasy/mf2/api/weapon/WeaponClass.java @@ -2,63 +2,55 @@ import java.util.HashMap; +import minefantasy.mf2.api.rpg.Skill; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; -import minefantasy.mf2.api.rpg.Skill; -import minefantasy.mf2.api.rpg.SkillList; +public class WeaponClass { + public static HashMap classes = new HashMap(); -public class WeaponClass -{ - public static HashMapclasses = new HashMap(); - public static WeaponClass FIST = new WeaponClass("fist", null, "blunt"); - + public static WeaponClass BLADE = new WeaponClass("blade", null, "blunt"); public static WeaponClass BLUNT = new WeaponClass("blunt", null, "blade"); public static WeaponClass AXE = new WeaponClass("axe", null, "blade"); - public static WeaponClass POLEARM = new WeaponClass("polearm",null, "blade"); + public static WeaponClass POLEARM = new WeaponClass("polearm", null, "blade"); public static WeaponClass MISC = new WeaponClass("misc", null, "blunt"); - + public Skill parentSkill; public String name; public String sound; - - public WeaponClass(String name, Skill parent, String sound) - { + + public WeaponClass(String name, Skill parent, String sound) { this.name = name; this.parentSkill = parent; this.sound = sound; classes.put(name, this); } - public String getSound() - { + + public String getSound() { return sound; } - - public static WeaponClass getWeaponClass(String name) - { + + public static WeaponClass getWeaponClass(String name) { WeaponClass WC = classes.get(name); return WC != null ? WC : WeaponClass.MISC; } - public static WeaponClass getWeaponClass(ItemStack weapon) - { - if(weapon == null) - { + + public static WeaponClass getWeaponClass(ItemStack weapon) { + if (weapon == null) { return WeaponClass.FIST; } - if(weapon.getItem() instanceof IWeaponClass) - { - return ((IWeaponClass)weapon.getItem()).getWeaponClass(); + if (weapon.getItem() instanceof IWeaponClass) { + return ((IWeaponClass) weapon.getItem()).getWeaponClass(); } return WeaponClass.BLADE; } - - public static WeaponClass findClassForAny(ItemStack weapon) - { - if(weapon == null)return FIST; - if(weapon.getItem() instanceof IWeaponClass || weapon.getItem() instanceof ItemSword) - { + + public static WeaponClass findClassForAny(ItemStack weapon) { + if (weapon == null) + return FIST; + if (weapon.getItem() instanceof IWeaponClass || weapon.getItem() instanceof ItemSword) { return getWeaponClass(weapon); } return WeaponClass.MISC; diff --git a/src/main/java/minefantasy/mf2/block/basic/BasicBlockMF.java b/src/main/java/minefantasy/mf2/block/basic/BasicBlockMF.java index a5de39e0..bba5b6bf 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BasicBlockMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/BasicBlockMF.java @@ -2,68 +2,58 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BasicBlockMF extends Block -{ +public class BasicBlockMF extends Block { private Object drop; - - public BasicBlockMF(String name, Material material) - { + + public BasicBlockMF(String name, Material material) { this(name, material, null); } - public BasicBlockMF(String name, Material material, Object drop) - { + + public BasicBlockMF(String name, Material material, Object drop) { super(material); - + GameRegistry.registerBlock(this, name); setBlockName(name); - setBlockTextureName("minefantasy2:basic/"+name); - - if(material == Material.rock) - { + setBlockTextureName("minefantasy2:basic/" + name); + + if (material == Material.rock) { this.setHarvestLevel("pickaxe", 0); } this.drop = drop; this.setCreativeTab(CreativeTabs.tabBlock); } - + @Override @SideOnly(Side.CLIENT) - public boolean isOpaqueCube() - { + public boolean isOpaqueCube() { return this.blockMaterial != Material.glass; } - + @Override - public Item getItemDropped(int meta, Random rand, int i) - { - if(drop != null) - { - if(drop instanceof Item) - { + public Item getItemDropped(int meta, Random rand, int i) { + if (drop != null) { + if (drop instanceof Item) { return (Item) drop; } - if(drop instanceof Block) - { + if (drop instanceof Block) { return Item.getItemFromBlock((Block) drop); } } return Item.getItemFromBlock(this); - } - + } + @Override - public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) - { + public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) { return false; - } + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockMeta.java b/src/main/java/minefantasy/mf2/block/basic/BlockMeta.java index c0668cac..5801a47d 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockMeta.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockMeta.java @@ -9,58 +9,50 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.util.IIcon; -public abstract class BlockMeta extends Block -{ +public abstract class BlockMeta extends Block { protected final String[] names; @SideOnly(Side.CLIENT) protected IIcon[] icons; - public BlockMeta(String name, Material material, String...names) - { + + public BlockMeta(String name, Material material, String... names) { super(material); this.names = names; - + GameRegistry.registerBlock(this, ItemMetaBlock.class, name); - - if(material == Material.rock) - { + + if (material == Material.rock) { this.setHarvestLevel("pickaxe", 0); } this.setHardness(2.0F); this.setResistance(2.0F); this.setCreativeTab(CreativeTabs.tabBlock); } - + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - return icons[Math.min(meta, icons.length-1)]; + public IIcon getIcon(int side, int meta) { + return icons[Math.min(meta, icons.length - 1)]; } - + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - icons = new IIcon[names.length]; - for(int i = 0; i < names.length; i ++) - { - icons[i] = reg.registerIcon("minefantasy2:meta/" + names[i]); - } - } - - public String getUnlocalisedName(int meta) - { - return "tile."+names[Math.min(meta, names.length-1)]; + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[names.length]; + for (int i = 0; i < names.length; i++) { + icons[i] = reg.registerIcon("minefantasy2:meta/" + names[i]); + } + } + + public String getUnlocalisedName(int meta) { + return "tile." + names[Math.min(meta, names.length - 1)]; } - public int getCount() - { + public int getCount() { return names.length; } - + @Override - public int damageDropped(int meta) - { + public int damageDropped(int meta) { return meta; } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockMetalBarsMF.java b/src/main/java/minefantasy/mf2/block/basic/BlockMetalBarsMF.java index 66b2e9cb..44a46602 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockMetalBarsMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockMetalBarsMF.java @@ -2,6 +2,7 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.block.Block; import net.minecraft.block.BlockPane; @@ -10,35 +11,36 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.DamageSource; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -public class BlockMetalBarsMF extends BlockPane -{ +public class BlockMetalBarsMF extends BlockPane { private BaseMaterialMF baseMat; - public BlockMetalBarsMF(BaseMaterialMF material) - { - super("minefantasy2:metal/"+material.name.toLowerCase()+"_bars", "minefantasy2:metal/"+material.name.toLowerCase()+"_bars", Material.iron, true); + + public BlockMetalBarsMF(BaseMaterialMF material) { + super("minefantasy2:metal/" + material.name.toLowerCase() + "_bars", + "minefantasy2:metal/" + material.name.toLowerCase() + "_bars", Material.iron, true); String name = material.name.toLowerCase() + "_bars"; GameRegistry.registerBlock(this, name); setBlockName(name); - + this.setHarvestLevel("pickaxe", material.harvestLevel); this.setStepSound(Block.soundTypeMetal); - this.setHardness(material.hardness+1 / 2F); - this.setResistance(material.hardness+1); + this.setHardness(material.hardness + 1 / 2F); + this.setResistance(material.hardness + 1); this.baseMat = material; } - + private Random rand = new Random(); + @Override - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity hitter) - { - if(baseMat.name.equalsIgnoreCase("dragonforge") && !hitter.isImmuneToFire() && hitter instanceof EntityLivingBase) - { + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity hitter) { + if (baseMat.name.equalsIgnoreCase("dragonforge") && !hitter.isImmuneToFire() + && hitter instanceof EntityLivingBase) { hitter.setFire(10); hitter.attackEntityFrom(DamageSource.inFire, 1); - world.spawnParticle("flame", x+rand.nextDouble(), y+rand.nextDouble(), z+rand.nextDouble(), 0D, 0D, 0D); - world.spawnParticle("smoke", x+rand.nextDouble(), y+rand.nextDouble(), z+rand.nextDouble(), 0D, 0D, 0D); + world.spawnParticle("flame", x + rand.nextDouble(), y + rand.nextDouble(), z + rand.nextDouble(), 0D, 0D, + 0D); + world.spawnParticle("smoke", x + rand.nextDouble(), y + rand.nextDouble(), z + rand.nextDouble(), 0D, 0D, + 0D); } - } + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockMetalMF.java b/src/main/java/minefantasy/mf2/block/basic/BlockMetalMF.java index 4241706d..e2684b9f 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockMetalMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockMetalMF.java @@ -1,26 +1,24 @@ package minefantasy.mf2.block.basic; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; -import cpw.mods.fml.common.registry.GameRegistry; -public class BlockMetalMF extends Block -{ - public BlockMetalMF(BaseMaterialMF material) - { +public class BlockMetalMF extends Block { + public BlockMetalMF(BaseMaterialMF material) { super(Material.iron); - + String name = material.name.toLowerCase() + "_block"; GameRegistry.registerBlock(this, name); setBlockName(name); - - this.setBlockTextureName("minefantasy2:metal/"+name); + + this.setBlockTextureName("minefantasy2:metal/" + name); this.setHarvestLevel("pickaxe", material.harvestLevel); this.setStepSound(Block.soundTypeMetal); - this.setHardness(material.hardness+1 / 2F); - this.setResistance(material.hardness+1); + this.setHardness(material.hardness + 1 / 2F); + this.setResistance(material.hardness + 1); this.setCreativeTab(CreativeTabs.tabBlock); } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockMythicDecor.java b/src/main/java/minefantasy/mf2/block/basic/BlockMythicDecor.java index c95cd438..8e1d9106 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockMythicDecor.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockMythicDecor.java @@ -4,8 +4,7 @@ public class BlockMythicDecor extends BlockMeta { - public BlockMythicDecor() - { + public BlockMythicDecor() { super("mythic_decor", Material.rock, "framed_end", "decorated_end"); } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockMythicOre.java b/src/main/java/minefantasy/mf2/block/basic/BlockMythicOre.java index 0aa15b33..34ff16ec 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockMythicOre.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockMythicOre.java @@ -2,26 +2,25 @@ import java.util.Random; -import net.minecraft.world.World; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.world.World; -public class BlockMythicOre extends BlockOreMF -{ +public class BlockMythicOre extends BlockOreMF { private boolean isPure; - public BlockMythicOre(String name, boolean pure) - { + + public BlockMythicOre(String name, boolean pure) { super(name, 4, pure ? 3 : 2); isPure = pure; } + @SideOnly(Side.CLIENT) @Override - public void randomDisplayTick(World world, int x, int y, int z, Random rand) - { - if (rand.nextInt(20) == 0 && world.isRemote) - { - //"minefantasy2:block.mythicore" - world.playSound(x + 0.5D, y + 0.5D, z + 0.5D, (isPure ? "minefantasy2:block.mythicore" : "random.levelup"), 1.0F, rand.nextFloat() * 0.4F + 1.1F, true); - } - } + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + if (rand.nextInt(20) == 0 && world.isRemote) { + // "minefantasy2:block.mythicore" + world.playSound(x + 0.5D, y + 0.5D, z + 0.5D, (isPure ? "minefantasy2:block.mythicore" : "random.levelup"), + 1.0F, rand.nextFloat() * 0.4F + 1.1F, true); + } + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockOreMF.java b/src/main/java/minefantasy/mf2/block/basic/BlockOreMF.java index 9a103386..3888430a 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockOreMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockOreMF.java @@ -2,6 +2,7 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.item.list.CreativeTabMF; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -10,106 +11,94 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; -import cpw.mods.fml.common.registry.GameRegistry; -public class BlockOreMF extends Block -{ +public class BlockOreMF extends Block { public int rarity; private int xp; private Item drop; private int dropMin; private int dropMax; - - public BlockOreMF(String name, int harvestLevel) - { + + public BlockOreMF(String name, int harvestLevel) { this(name, harvestLevel, 0); } - public BlockOreMF(String name, int harvestLevel, int rarity) - { + + public BlockOreMF(String name, int harvestLevel, int rarity) { this(name, harvestLevel, rarity, null, 1, 1, 0); } - public BlockOreMF(String name, int harvestLevel, int rarity, Item drop, int min, int max, int xp) - { + + public BlockOreMF(String name, int harvestLevel, int rarity, Item drop, int min, int max, int xp) { this(name, harvestLevel, rarity, drop, min, max, xp, Material.rock); } - public BlockOreMF(String name, int harvestLevel, int rarity, Item drop, int min, int max, int xp, Material material) - { + + public BlockOreMF(String name, int harvestLevel, int rarity, Item drop, int min, int max, int xp, + Material material) { super(material); this.xp = xp; this.drop = drop; this.rarity = rarity; - this.dropMin=min; - this.dropMax=max; - + this.dropMin = min; + this.dropMax = max; + this.setStepSound(Block.soundTypePiston); GameRegistry.registerBlock(this, ItemOreblockMF.class, name); setBlockName(name); - setBlockTextureName("minefantasy2:ores/"+name); - - if(material == Material.rock) - { + setBlockTextureName("minefantasy2:ores/" + name); + + if (material == Material.rock) { this.setHarvestLevel("pickaxe", harvestLevel); } this.setCreativeTab(CreativeTabMF.tabOres); OreDictionary.registerOre(name, this); } - + @Override - public Item getItemDropped(int meta, Random rand, int i) - { + public Item getItemDropped(int meta, Random rand, int i) { return drop != null ? drop : Item.getItemFromBlock(this); - } + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random rand) { + return MathHelper.getRandomIntegerInRange(rand, dropMin, dropMax); + } - /** - * Returns the quantity of items to drop on block destruction. - */ + /** + * Returns the usual quantity dropped by the block plus a bonus of 1 to 'i' + * (inclusive). + */ @Override - public int quantityDropped(Random rand) - { - return MathHelper.getRandomIntegerInRange(rand, dropMin, dropMax); - } - - /** - * Returns the usual quantity dropped by the block plus a bonus of 1 to 'i' (inclusive). - */ - @Override - public int quantityDroppedWithBonus(int fortune, Random rand) - { - if (fortune > 0 && Item.getItemFromBlock(this) != this.getItemDropped(0, rand, fortune)) - { - int j = rand.nextInt(fortune + 2) - 1; - - if (j < 0) - { - j = 0; - } - - return this.quantityDropped(rand) * (j + 1); - } - else - { - return this.quantityDropped(rand); - } - } - - /** - * Drops the block items with a specified chance of dropping the specified items - */ - @Override - public void dropBlockAsItemWithChance(World world, int x, int y, int z, int m, float f, int i) - { - super.dropBlockAsItemWithChance(world, x, y, z, m, f, i); - } - - private Random rand = new Random(); - - @Override - public int getExpDrop(IBlockAccess world, int meta, int fortune) - { - if (xp > 0 && this.getItemDropped(meta, rand, fortune) != Item.getItemFromBlock(this)) - { - return MathHelper.getRandomIntegerInRange(rand, xp, xp*2); - } - return 0; - } + public int quantityDroppedWithBonus(int fortune, Random rand) { + if (fortune > 0 && Item.getItemFromBlock(this) != this.getItemDropped(0, rand, fortune)) { + int j = rand.nextInt(fortune + 2) - 1; + + if (j < 0) { + j = 0; + } + + return this.quantityDropped(rand) * (j + 1); + } else { + return this.quantityDropped(rand); + } + } + + /** + * Drops the block items with a specified chance of dropping the specified items + */ + @Override + public void dropBlockAsItemWithChance(World world, int x, int y, int z, int m, float f, int i) { + super.dropBlockAsItemWithChance(world, x, y, z, m, f, i); + } + + private Random rand = new Random(); + + @Override + public int getExpDrop(IBlockAccess world, int meta, int fortune) { + if (xp > 0 && this.getItemDropped(meta, rand, fortune) != Item.getItemFromBlock(this)) { + return MathHelper.getRandomIntegerInRange(rand, xp, xp * 2); + } + return 0; + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockPaneMF.java b/src/main/java/minefantasy/mf2/block/basic/BlockPaneMF.java index 88dc462b..a3afd9fb 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockPaneMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockPaneMF.java @@ -1,16 +1,14 @@ package minefantasy.mf2.block.basic; +import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.BlockPane; import net.minecraft.block.material.Material; -import cpw.mods.fml.common.registry.GameRegistry; -public class BlockPaneMF extends BlockPane -{ +public class BlockPaneMF extends BlockPane { + + public BlockPaneMF(String name, String frontTex, String sideTex, Material material, boolean recoverable) { + super("minefantasy2:basic/" + frontTex, "minefantasy2:basic/" + sideTex, material, recoverable); - public BlockPaneMF(String name, String frontTex, String sideTex, Material material, boolean recoverable) - { - super("minefantasy2:basic/"+frontTex, "minefantasy2:basic/"+sideTex, material, recoverable); - GameRegistry.registerBlock(this, name); setBlockName(name); } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockReinforcedStone.java b/src/main/java/minefantasy/mf2/block/basic/BlockReinforcedStone.java index 1b2be959..d72c107b 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockReinforcedStone.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockReinforcedStone.java @@ -6,42 +6,38 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; -public class BlockReinforcedStone extends BlockMeta -{ +public class BlockReinforcedStone extends BlockMeta { private String currentName; - public BlockReinforcedStone(String name, String...alternates) - { + + public BlockReinforcedStone(String name, String... alternates) { super(name, Material.rock, alternates); this.currentName = name; } @Override - public IIcon getIcon(int side, int meta) - { - if(side < 2 && meta < names.length && (this.names[meta].startsWith("dshall") || this.names[meta].equalsIgnoreCase("engraved"))) - { + public IIcon getIcon(int side, int meta) { + if (side < 2 && meta < names.length + && (this.names[meta].startsWith("dshall") || this.names[meta].equalsIgnoreCase("engraved"))) { return icons[0]; } return super.getIcon(side, meta); } + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - icons = new IIcon[names.length]; - for(int i = 0; i < names.length; i ++) - { - icons[i] = reg.registerIcon("minefantasy2:meta/" + currentName + "_" + names[i]); - } - } - + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[names.length]; + for (int i = 0; i < names.length; i++) { + icons[i] = reg.registerIcon("minefantasy2:meta/" + currentName + "_" + names[i]); + } + } + @Override - public String getUnlocalisedName(int meta) - { - if(meta < names.length && (this.names[meta].startsWith("dshall") || this.names[meta].equalsIgnoreCase("engraved"))) - { - return "tile." + currentName + "_" + names[1]; + public String getUnlocalisedName(int meta) { + if (meta < names.length + && (this.names[meta].startsWith("dshall") || this.names[meta].equalsIgnoreCase("engraved"))) { + return "tile." + currentName + "_" + names[1]; } - return "tile." + currentName + "_" + names[Math.min(meta, names.length-1)]; + return "tile." + currentName + "_" + names[Math.min(meta, names.length - 1)]; } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockWorldGenMarker.java b/src/main/java/minefantasy/mf2/block/basic/BlockWorldGenMarker.java index 4404bddf..4e16e5f2 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockWorldGenMarker.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockWorldGenMarker.java @@ -7,19 +7,16 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class BlockWorldGenMarker extends BlockContainer -{ +public class BlockWorldGenMarker extends BlockContainer { - public BlockWorldGenMarker() - { + public BlockWorldGenMarker() { super(Material.air); this.setBlockUnbreakable(); GameRegistry.registerBlock(this, "WorldGenFlag"); } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityWorldGenMarker(); } diff --git a/src/main/java/minefantasy/mf2/block/basic/ConstructionBlockMF.java b/src/main/java/minefantasy/mf2/block/basic/ConstructionBlockMF.java index 57c9e0fb..4439d5b4 100644 --- a/src/main/java/minefantasy/mf2/block/basic/ConstructionBlockMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/ConstructionBlockMF.java @@ -1,233 +1,188 @@ package minefantasy.mf2.block.basic; -import java.util.HashMap; import java.util.List; -import java.util.Random; import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.block.Block; import net.minecraft.block.BlockStairs; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemBlockWithMetadata; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraft.world.World; public class ConstructionBlockMF extends Block { public IIcon[] m_icons = new IIcon[4]; - public static final String[] m_names = new String[] {"", "_cobblestone", "_brick", "_pavement"}; + public static final String[] m_names = new String[] { "", "_cobblestone", "_brick", "_pavement" }; public Block[] stairblocks = new Block[4]; - public ConstructionBlockMF(String unlocName) - { - this(unlocName, new String[] {"", "_cobblestone", "_brick", "_pavement"}); + + public ConstructionBlockMF(String unlocName) { + this(unlocName, new String[] { "", "_cobblestone", "_brick", "_pavement" }); } - public ConstructionBlockMF(String unlocName, String... types) - { + + public ConstructionBlockMF(String unlocName, String... types) { this(unlocName, Material.rock, types); } - public ConstructionBlockMF(String unlocName, Material material, String... types) - { + + public ConstructionBlockMF(String unlocName, Material material, String... types) { super(material); - + this.setBlockName(unlocName); - + this.setCreativeTab(CreativeTabs.tabBlock); GameRegistry.registerBlock(this, ItemConstBlock.class, unlocName); - for(int i = 0; i < m_names.length; i ++) - { - GameRegistry.registerBlock(stairblocks[i] = new StairsConstBlock(unlocName + m_names[i] + "_stair", this, i).setHardness(1.5F).setResistance(10F), unlocName + m_names[i] + "_stair"); + for (int i = 0; i < m_names.length; i++) { + GameRegistry.registerBlock(stairblocks[i] = new StairsConstBlock(unlocName + m_names[i] + "_stair", this, i) + .setHardness(1.5F).setResistance(10F), unlocName + m_names[i] + "_stair"); } - + setHardness(1.5F); setResistance(10F); - if(material == Material.rock) - { + if (material == Material.rock) { setHarvestLevel("pickaxe", 0); } - + addConstructRecipes(); - + } - + @Override - public Block setHardness(float level) - { - if(stairblocks != null) - { - for(Block stairblock : stairblocks) - stairblock.setHardness(level); + public Block setHardness(float level) { + if (stairblocks != null) { + for (Block stairblock : stairblocks) + stairblock.setHardness(level); } - return super.setHardness(level); - } + return super.setHardness(level); + } + @Override - public Block setResistance(float level) - { - if(stairblocks != null) - { - for(Block stairblock : stairblocks) - stairblock.setResistance(level); + public Block setResistance(float level) { + if (stairblocks != null) { + for (Block stairblock : stairblocks) + stairblock.setResistance(level); } - return super.setResistance(level); - } - - //public Item getItemDropped(int meta, Random rand, int i) { return null; }; - - public void addConstructRecipes() - { + return super.setResistance(level); + } + + // public Item getItemDropped(int meta, Random rand, int i) { return null; }; + + public void addConstructRecipes() { GameRegistry.addSmelting(new ItemStack(this, 1, 1), new ItemStack(this, 1, 0), 0); - - GameRegistry.addRecipe(new ItemStack(this, 4, 3), new Object[] - { - "XX", - "XX", - 'X', new ItemStack(this, 1, 1) - }); - GameRegistry.addRecipe(new ItemStack(this, 4, 2), new Object[] - { - "X X", - " ", - "X X", - 'X', new ItemStack(this, 1, 1) - }); - GameRegistry.addRecipe(new ItemStack(this, 1, 1), new Object[] - { - "X", - 'X', new ItemStack(this, 1, 2) - }); - GameRegistry.addRecipe(new ItemStack(this, 1, 1), new Object[] - { - "X", - 'X', new ItemStack(this, 1, 3) - }); - for(int i = 0; i < 4; i++) - GameRegistry.addRecipe(new ItemStack(stairblocks[i], 4), new Object[] - { - " X", - " XX", - "XXX", - 'X', new ItemStack(this, 1, i) - }); + + GameRegistry.addRecipe(new ItemStack(this, 4, 3), new Object[] { "XX", "XX", 'X', new ItemStack(this, 1, 1) }); + GameRegistry.addRecipe(new ItemStack(this, 4, 2), + new Object[] { "X X", " ", "X X", 'X', new ItemStack(this, 1, 1) }); + GameRegistry.addRecipe(new ItemStack(this, 1, 1), new Object[] { "X", 'X', new ItemStack(this, 1, 2) }); + GameRegistry.addRecipe(new ItemStack(this, 1, 1), new Object[] { "X", 'X', new ItemStack(this, 1, 3) }); + for (int i = 0; i < 4; i++) + GameRegistry.addRecipe(new ItemStack(stairblocks[i], 4), + new Object[] { " X", " XX", "XXX", 'X', new ItemStack(this, 1, i) }); } - + @Override - public int damageDropped(int meta) - { - if(meta == 0)return 1; - + public int damageDropped(int meta) { + if (meta == 0) + return 1; + return meta; } - + @Override - public void registerBlockIcons(IIconRegister register) - { + public void registerBlockIcons(IIconRegister register) { m_icons[0] = register.registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5)); - m_icons[1] = register.registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_cobblestone"); - m_icons[2] = register.registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_brick"); - m_icons[3] = register.registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_pavement"); + m_icons[1] = register.registerIcon( + MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_cobblestone"); + m_icons[2] = register + .registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_brick"); + m_icons[3] = register + .registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_pavement"); } public String getUnlocalizedName(ItemStack itemstack) { return getUnlocalizedName() + "." + m_names[itemstack.getItemDamage()]; } - + @Override - public void getSubBlocks(Item item, CreativeTabs tab, List list) - { - - for(int i = 0; i < 4; i++) - { + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + + for (int i = 0; i < 4; i++) { list.add(new ItemStack(item, 1, i)); } } + @Override - public IIcon getIcon(int side, int meta) - { - switch(meta) - { + public IIcon getIcon(int side, int meta) { + switch (meta) { case 0: return m_icons[0]; - + case 1: return m_icons[1]; - + case 2: return m_icons[2]; - + case 3: return m_icons[3]; - + default: return blockIcon; } } - - public static class StairsConstBlock extends BlockStairs - { + + public static class StairsConstBlock extends BlockStairs { private final Block base; - public StairsConstBlock(String unlocalizedName, Block baseBlock, int metaOfBaseBlock) - { + + public StairsConstBlock(String unlocalizedName, Block baseBlock, int metaOfBaseBlock) { super(baseBlock, metaOfBaseBlock); this.setBlockName(unlocalizedName); - this.setCreativeTab(CreativeTabs.tabBlock); - this.setLightOpacity(0);//They seem to render shadows funny - this.base = baseBlock; + this.setCreativeTab(CreativeTabs.tabBlock); + this.setLightOpacity(0);// They seem to render shadows funny + this.base = baseBlock; } - - public void addRecipe() - { - GameRegistry.addRecipe(new ItemStack(this, 4), new Object[]{ - "B ", - "BB ", - "BBB", - 'B', this.base - }); + + public void addRecipe() { + GameRegistry.addRecipe(new ItemStack(this, 4), new Object[] { "B ", "BB ", "BBB", 'B', this.base }); } - public StairsConstBlock(String unlocalizedName, Block baseBlock) - { - this(unlocalizedName, baseBlock, 0); + public StairsConstBlock(String unlocalizedName, Block baseBlock) { + this(unlocalizedName, baseBlock, 0); } - public Block register(String name) - { + public Block register(String name) { GameRegistry.registerBlock(this, name); return this; } } - - public static class ItemConstBlock extends ItemBlockWithMetadata - { + + public static class ItemConstBlock extends ItemBlockWithMetadata { public ItemConstBlock(Block block) { super(block, block); } - + @Override public String getUnlocalizedName(ItemStack stack) { - switch (stack.getItemDamage()) { - case 1: - return this.getUnlocalizedName() + "_cobblestone"; - case 2: - return this.getUnlocalizedName() + "_brick"; - case 3: - return this.getUnlocalizedName() + "_pavement"; - default: - return this.getUnlocalizedName(); - } + switch (stack.getItemDamage()) { + case 1: + return this.getUnlocalizedName() + "_cobblestone"; + case 2: + return this.getUnlocalizedName() + "_brick"; + case 3: + return this.getUnlocalizedName() + "_pavement"; + default: + return this.getUnlocalizedName(); + } } - + @Override - public int getMetadata(int d) - { + public int getMetadata(int d) { return d; } } - + } diff --git a/src/main/java/minefantasy/mf2/block/basic/ItemMetaBlock.java b/src/main/java/minefantasy/mf2/block/basic/ItemMetaBlock.java index 0e564832..bdfb53c7 100644 --- a/src/main/java/minefantasy/mf2/block/basic/ItemMetaBlock.java +++ b/src/main/java/minefantasy/mf2/block/basic/ItemMetaBlock.java @@ -4,44 +4,36 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.item.list.ToolListMF; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -public class ItemMetaBlock extends ItemBlock -{ +public class ItemMetaBlock extends ItemBlock { private BlockMeta instance; - public ItemMetaBlock(Block block) - { + + public ItemMetaBlock(Block block) { super(block); this.instance = (BlockMeta) block; setHasSubtypes(true); } - + @Override - public String getUnlocalizedName(ItemStack item) - { - return instance.getUnlocalisedName(item.getItemDamage()); - } - + public String getUnlocalizedName(ItemStack item) { + return instance.getUnlocalisedName(item.getItemDamage()); + } + @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs tab, List list) - { - for(int i = 0; i < instance.getCount(); i++) - { - list.add(new ItemStack(this, 1, i)); - } - } - + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i < instance.getCount(); i++) { + list.add(new ItemStack(this, 1, i)); + } + } + @Override - public int getMetadata(int subid) - { - return subid; - } + public int getMetadata(int subid) { + return subid; + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/ItemOreblockMF.java b/src/main/java/minefantasy/mf2/block/basic/ItemOreblockMF.java index 5cfa1812..d73091b1 100644 --- a/src/main/java/minefantasy/mf2/block/basic/ItemOreblockMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/ItemOreblockMF.java @@ -6,31 +6,26 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -public class ItemOreblockMF extends ItemBlock -{ +public class ItemOreblockMF extends ItemBlock { private BlockOreMF ore; - public ItemOreblockMF(Block block) - { + + public ItemOreblockMF(Block block) { super(block); ore = (BlockOreMF) block; } - + @Override - public EnumRarity getRarity(ItemStack item) - { - int lvl = ore.rarity+1; - - if(item.isItemEnchanted()) - { - if(lvl == 0) - { + public EnumRarity getRarity(ItemStack item) { + int lvl = ore.rarity + 1; + + if (item.isItemEnchanted()) { + if (lvl == 0) { lvl++; } - lvl ++; + lvl++; } - if(lvl >= ToolListMF.rarity.length) - { - lvl = ToolListMF.rarity.length-1; + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; } return ToolListMF.rarity[lvl]; } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockAnvilMF.java b/src/main/java/minefantasy/mf2/block/crafting/BlockAnvilMF.java index 0b2bb87d..2c9c1ded 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockAnvilMF.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockAnvilMF.java @@ -2,6 +2,9 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.heating.TongsHelper; import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; @@ -23,218 +26,190 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockAnvilMF extends BlockContainer -{ - public static int anvil_RI = 100; - +public class BlockAnvilMF extends BlockContainer { + public static int anvil_RI = 100; + @SideOnly(Side.CLIENT) - public int anvilRenderSide; - public BaseMaterialMF material; - private int tier; - - public BlockAnvilMF(BaseMaterialMF material) - { - super(Material.anvil); - String name = material.name; - this.material = material; - float height = 1.0F / 16F * 13F; - setBlockBounds(0F, 0F, 0F, 1F, height, 1F); - - this.setBlockTextureName("minefantasy2:metal/"+name.toLowerCase()+"_block"); - name = "anvil"+name; - this.tier = material.tier; - GameRegistry.registerBlock(this, ItemBlockAnvilMF.class, name); + public int anvilRenderSide; + public BaseMaterialMF material; + private int tier; + + public BlockAnvilMF(BaseMaterialMF material) { + super(Material.anvil); + String name = material.name; + this.material = material; + float height = 1.0F / 16F * 13F; + setBlockBounds(0F, 0F, 0F, 1F, height, 1F); + + this.setBlockTextureName("minefantasy2:metal/" + name.toLowerCase() + "_block"); + name = "anvil" + name; + this.tier = material.tier; + GameRegistry.registerBlock(this, ItemBlockAnvilMF.class, name); setBlockName(name); this.setStepSound(Block.soundTypeMetal); - this.setHardness(material.hardness+1 / 2F); - this.setResistance(material.hardness+1); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, dir, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - ItemStack held = user.getHeldItem(); - TileEntityAnvilMF tile = getTile(world, x, y, z); - if(tile != null) - { - if(side == 1 && held != null && held.getItem() instanceof ItemTongs && onUsedTongs(world, user, held, tile)) - { - return true; - } - if(side != 1 || !tile.tryCraft(user, true) && !world.isRemote) - { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - private boolean onUsedTongs(World world, EntityPlayer user, ItemStack held, TileEntityAnvilMF tile) - { - ItemStack result = tile.getStackInSlot(tile.getSizeInventory()-1); - ItemStack grabbed = TongsHelper.getHeldItem(held); - - //GRAB - if(grabbed == null) - { - if(result != null && result.getItem() == ComponentListMF.hotItem) - { - if(TongsHelper.trySetHeldItem(held, result)) - { - tile.setInventorySlotContents(tile.getSizeInventory()-1, null); + this.setHardness(material.hardness + 1 / 2F); + this.setResistance(material.hardness + 1); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, dir, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + ItemStack held = user.getHeldItem(); + TileEntityAnvilMF tile = getTile(world, x, y, z); + if (tile != null) { + if (side == 1 && held != null && held.getItem() instanceof ItemTongs + && onUsedTongs(world, user, held, tile)) { + return true; + } + if (side != 1 || !tile.tryCraft(user, true) && !world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + private boolean onUsedTongs(World world, EntityPlayer user, ItemStack held, TileEntityAnvilMF tile) { + ItemStack result = tile.getStackInSlot(tile.getSizeInventory() - 1); + ItemStack grabbed = TongsHelper.getHeldItem(held); + + // GRAB + if (grabbed == null) { + if (result != null && result.getItem() == ComponentListMF.hotItem) { + if (TongsHelper.trySetHeldItem(held, result)) { + tile.setInventorySlotContents(tile.getSizeInventory() - 1, null); return true; } } - } - else - { - for(int s = 0; s < (tile.getSizeInventory()-1); s++) - { - ItemStack slot = tile.getStackInSlot(s); - if(slot == null) - { - tile.setInventorySlotContents(s, grabbed); - TongsHelper.clearHeldItem(held, user); - return false; - } - } - } + } else { + for (int s = 0; s < (tile.getSizeInventory() - 1); s++) { + ItemStack slot = tile.getStackInSlot(s); + if (slot == null) { + tile.setInventorySlotContents(s, grabbed); + TongsHelper.clearHeldItem(held, user); + return false; + } + } + } return false; } + @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) - { - { - TileEntityAnvilMF tile = getTile(world, x, y, z); - if(tile != null) - { - if(user.isSneaking()) - { - tile.upset(user); - } - else - { - tile.tryCraft(user, false); - } - } - } - } + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + { + TileEntityAnvilMF tile = getTile(world, x, y, z); + if (tile != null) { + if (user.isSneaking()) { + tile.upset(user); + } else { + tile.tryCraft(user, false); + } + } + } + } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityAnvilMF(tier, material.name); } - private TileEntityAnvilMF getTile(World world, int x, int y, int z) - { - return (TileEntityAnvilMF)world.getTileEntity(x, y, z); + private TileEntityAnvilMF getTile(World world, int x, int y, int z) { + return (TileEntityAnvilMF) world.getTileEntity(x, y, z); } - + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityAnvilMF tile = getTile(world, x, y, z); - if (tile != null) - { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - public int getTier() - { + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + public int getTier() { return tier; } + @SideOnly(Side.CLIENT) @Override - public IIcon getIcon(int side, int meta) - { - if(tier == 0) - { + public IIcon getIcon(int side, int meta) { + if (tier == 0) { return side == 1 ? Blocks.stone.getIcon(side, meta) : Blocks.cobblestone.getIcon(side, meta); } return super.getIcon(side, meta); } + @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister reg) - { - if(tier != 0) - super.registerBlockIcons(reg); + public void registerBlockIcons(IIconRegister reg) { + if (tier != 0) + super.registerBlockIcons(reg); } - + @Override - public int getRenderType() - { + public int getRenderType() { return anvil_RI; } + private Random rand = new Random(); } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockBombBench.java b/src/main/java/minefantasy/mf2/block/crafting/BlockBombBench.java index 222be1f9..d01111e2 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockBombBench.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockBombBench.java @@ -1,13 +1,13 @@ package minefantasy.mf2.block.crafting; -import java.util.ArrayList; import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.knowledge.ResearchLogic; -import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.tileentity.TileEntityBombBench; -import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.knowledge.KnowledgeListMF; import net.minecraft.block.Block; @@ -18,8 +18,6 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -29,164 +27,143 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockBombBench extends BlockContainer -{ +public class BlockBombBench extends BlockContainer { public static int bomb_RI = 102; - - public BlockBombBench() - { - super(Material.wood); - GameRegistry.registerBlock(this, "MF_BombCrafter"); + + public BlockBombBench() { + super(Material.wood); + GameRegistry.registerBlock(this, "MF_BombCrafter"); setBlockName("bombBench"); this.setStepSound(Block.soundTypeStone); this.setHardness(5F); this.setResistance(2F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - if(!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) - { - if(world.isRemote) - user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { + if (world.isRemote) + user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); return false; - } - TileEntityBombBench tile = getTile(world, x, y, z); - if(tile != null && (world.isAirBlock(x, y+1, z) || !world.isSideSolid(x, y+1, z, ForgeDirection.DOWN))) - { - if(side != 1 || !tile.tryCraft(user, false) && !world.isRemote) - { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) - { - if(ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) - { - TileEntityBombBench tile = getTile(world, x, y, z); - if(tile != null) - { - tile.tryCraft(user, false); - } - } - } + } + TileEntityBombBench tile = getTile(world, x, y, z); + if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { + if (side != 1 || !tile.tryCraft(user, false) && !world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + if (ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { + TileEntityBombBench tile = getTile(world, x, y, z); + if (tile != null) { + tile.tryCraft(user, false); + } + } + } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityBombBench(); } - private TileEntityBombBench getTile(World world, int x, int y, int z) - { - return (TileEntityBombBench)world.getTileEntity(x, y, z); + private TileEntityBombBench getTile(World world, int x, int y, int z) { + return (TileEntityBombBench) world.getTileEntity(x, y, z); } - + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityBombBench tile = getTile(world, x, y, z); - if (tile != null) - { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - if(side == 1) - { + public IIcon getIcon(int side, int meta) { + if (side == 1) { return Blocks.crafting_table.getIcon(1, meta); } return Blocks.anvil.getIcon(0, 0); } + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - + public void registerBlockIcons(IIconRegister reg) { + } - + @Override - public int getRenderType() - { + public int getRenderType() { return bomb_RI; } + private Random rand = new Random(); } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockBombPress.java b/src/main/java/minefantasy/mf2/block/crafting/BlockBombPress.java index ff850cd4..0149c0f2 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockBombPress.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockBombPress.java @@ -1,13 +1,13 @@ package minefantasy.mf2.block.crafting; -import java.util.ArrayList; import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.block.tileentity.TileEntityBombPress; -import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.knowledge.KnowledgeListMF; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; @@ -16,7 +16,6 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; @@ -24,97 +23,84 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockBombPress extends BlockContainer -{ +public class BlockBombPress extends BlockContainer { public static int bpress_RI = 108; - - public BlockBombPress() - { - super(Material.iron); - GameRegistry.registerBlock(this, "MF_BombPress"); + + public BlockBombPress() { + super(Material.iron); + GameRegistry.registerBlock(this, "MF_BombPress"); setBlockName("bombPress"); this.setStepSound(Block.soundTypeMetal); this.setHardness(5F); this.setResistance(2F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - if(!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) - { - if(world.isRemote) - user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { + if (world.isRemote) + user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); return false; - } - TileEntityBombPress tile = getTile(world, x, y, z); - if(tile != null) - { - tile.use(user); - } - return true; - } + } + TileEntityBombPress tile = getTile(world, x, y, z); + if (tile != null) { + tile.use(user); + } + return true; + } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityBombPress(); } - private TileEntityBombPress getTile(World world, int x, int y, int z) - { - return (TileEntityBombPress)world.getTileEntity(x, y, z); + private TileEntityBombPress getTile(World world, int x, int y, int z) { + return (TileEntityBombPress) world.getTileEntity(x, y, z); } - + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { + public IIcon getIcon(int side, int meta) { return Blocks.anvil.getIcon(0, 0); } + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - + public void registerBlockIcons(IIconRegister reg) { + } - + @Override - public int getRenderType() - { + public int getRenderType() { return bpress_RI; } - + private Random rand = new Random(); } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockCarpenter.java b/src/main/java/minefantasy/mf2/block/crafting/BlockCarpenter.java index bf5f809d..ed17ed84 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockCarpenter.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockCarpenter.java @@ -2,6 +2,9 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; import minefantasy.mf2.item.list.CreativeTabMF; @@ -20,160 +23,143 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockCarpenter extends BlockContainer -{ +public class BlockCarpenter extends BlockContainer { public static int carpenter_RI = 101; - - @SideOnly(Side.CLIENT) - public int CarpenterRenderSide; - private int tier = 0; - - public BlockCarpenter() - { - super(Material.wood); - - GameRegistry.registerBlock(this, "MF_CarpenterBench"); + + @SideOnly(Side.CLIENT) + public int CarpenterRenderSide; + private int tier = 0; + + public BlockCarpenter() { + super(Material.wood); + + GameRegistry.registerBlock(this, "MF_CarpenterBench"); setBlockName("carpenterBench"); this.setStepSound(Block.soundTypeWood); this.setHardness(5F); this.setResistance(2F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - { - TileEntityCarpenterMF tile = getTile(world, x, y, z); - if(tile != null && (world.isAirBlock(x, y+1, z) || !world.isSideSolid(x, y+1, z, ForgeDirection.DOWN))) - { - if(side != 1 || !tile.tryCraft(user) && !world.isRemote) - { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - } - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) - { - { - TileEntityCarpenterMF tile = getTile(world, x, y, z); - if(tile != null) - { - tile.tryCraft(user); - } - } - } + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + /** + * Called upon block activation (right click on the block.) + */ @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + { + TileEntityCarpenterMF tile = getTile(world, x, y, z); + if (tile != null + && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { + if (side != 1 || !tile.tryCraft(user) && !world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + { + TileEntityCarpenterMF tile = getTile(world, x, y, z); + if (tile != null) { + tile.tryCraft(user); + } + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityCarpenterMF(tier); } - private TileEntityCarpenterMF getTile(World world, int x, int y, int z) - { - return (TileEntityCarpenterMF)world.getTileEntity(x, y, z); + private TileEntityCarpenterMF getTile(World world, int x, int y, int z) { + return (TileEntityCarpenterMF) world.getTileEntity(x, y, z); } - + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityCarpenterMF tile = getTile(world, x, y, z); - if (tile != null) - { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { + public IIcon getIcon(int side, int meta) { return Blocks.crafting_table.getIcon(side, meta); } - + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - + public void registerBlockIcons(IIconRegister reg) { + } + @Override - public int getRenderType() - { + public int getRenderType() { return carpenter_RI; } + private Random rand = new Random(); } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockCogwork.java b/src/main/java/minefantasy/mf2/block/crafting/BlockCogwork.java index a134c2d9..3b7ec4e8 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockCogwork.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockCogwork.java @@ -18,109 +18,106 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class BlockCogwork extends BlockDirectional -{ - @SideOnly(Side.CLIENT) - private IIcon toptex; - @SideOnly(Side.CLIENT) - private IIcon facetex; - private String name; - private boolean isMain = false; - public BlockCogwork(String name, boolean helmet) - { - super(Material.circuits); - this.isMain = helmet; - GameRegistry.registerBlock(this, "block"+name); - this.name=name; - this.setTickRandomly(true); - this.name = name; - this.setCreativeTab(CreativeTabMF.tabGadget); - this.setBlockTextureName("minefantasy2:metal/"+name.toLowerCase()); - setBlockName(name); - this.setHardness(1F); +public class BlockCogwork extends BlockDirectional { + @SideOnly(Side.CLIENT) + private IIcon toptex; + @SideOnly(Side.CLIENT) + private IIcon facetex; + private String name; + private boolean isMain = false; + + public BlockCogwork(String name, boolean helmet) { + super(Material.circuits); + this.isMain = helmet; + GameRegistry.registerBlock(this, "block" + name); + this.name = name; + this.setTickRandomly(true); + this.name = name; + this.setCreativeTab(CreativeTabMF.tabGadget); + this.setBlockTextureName("minefantasy2:metal/" + name.toLowerCase()); + setBlockName(name); + this.setHardness(1F); this.setResistance(5F); this.setLightOpacity(0); - } + } - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) - { - return side == 1 ? this.toptex : (side == 0 ? this.toptex : (meta == 2 && side == 2 ? this.facetex : (meta == 3 && side == 5 ? this.facetex : (meta == 0 && side == 3 ? this.facetex : (meta == 1 && side == 4 ? this.facetex : this.blockIcon))))); - } + /** + * Gets the block's texture. Args: side, meta + */ + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + return side == 1 ? this.toptex + : (side == 0 ? this.toptex + : (meta == 2 && side == 2 ? this.facetex + : (meta == 3 && side == 5 ? this.facetex + : (meta == 0 && side == 3 ? this.facetex + : (meta == 1 && side == 4 ? this.facetex : this.blockIcon))))); + } - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, float f2) - { - if(!world.isRemote && ToolHelper.getCrafterTool(player.getHeldItem()).equalsIgnoreCase("spanner")) - { - return tryBuild(player, world, x, y, z); - } - return false; - } - public boolean tryBuild(EntityPlayer builder, World world, int x, int y, int z) - { - if (isMain && PowerArmour.isStationBlock(world, x, y+2, z) && world.getBlock(x, y - 1, z) == BlockListMF.cogwork_legs && world.getBlock(x, y + 1, z) == BlockListMF.cogwork_helm) - { - if (!world.isRemote) - { - world.setBlock(x, y, z, getBlockById(0), 0, 2); - world.setBlock(x, y - 1, z, getBlockById(0), 0, 2); - world.setBlock(x, y + 1, z, getBlockById(0), 0, 2); - - EntityCogwork suit = new EntityCogwork(world); - int m = world.getBlockMetadata(x, y, z); - int angle = getAngleFor(builder); - suit.setLocationAndAngles((double)x + 0.5D, (double)y - 0.95D, (double)z + 0.5D, angle, 0.0F); - suit.rotationYaw = suit.rotationYawHead = suit.prevRotationYaw = suit.prevRotationYawHead = angle; - world.spawnEntityInWorld(suit); - - world.notifyBlockChange(x, y, z, getBlockById(0)); - world.notifyBlockChange(x, y - 1, z, getBlockById(0)); - world.notifyBlockChange(x, y + 1, z, getBlockById(0)); - } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + if (!world.isRemote && ToolHelper.getCrafterTool(player.getHeldItem()).equalsIgnoreCase("spanner")) { + return tryBuild(player, world, x, y, z); + } + return false; + } + + public boolean tryBuild(EntityPlayer builder, World world, int x, int y, int z) { + if (isMain && PowerArmour.isStationBlock(world, x, y + 2, z) + && world.getBlock(x, y - 1, z) == BlockListMF.cogwork_legs + && world.getBlock(x, y + 1, z) == BlockListMF.cogwork_helm) { + if (!world.isRemote) { + world.setBlock(x, y, z, getBlockById(0), 0, 2); + world.setBlock(x, y - 1, z, getBlockById(0), 0, 2); + world.setBlock(x, y + 1, z, getBlockById(0), 0, 2); - } - return false; - } + EntityCogwork suit = new EntityCogwork(world); + int m = world.getBlockMetadata(x, y, z); + int angle = getAngleFor(builder); + suit.setLocationAndAngles(x + 0.5D, y - 0.95D, z + 0.5D, angle, 0.0F); + suit.rotationYaw = suit.rotationYawHead = suit.prevRotationYaw = suit.prevRotationYawHead = angle; + world.spawnEntityInWorld(suit); - private int getAngleFor(EntityPlayer user) - { - int l = MathHelper.floor_double((double)(user.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3; - return (int)(l*90); + world.notifyBlockChange(x, y, z, getBlockById(0)); + world.notifyBlockChange(x, y - 1, z, getBlockById(0)); + world.notifyBlockChange(x, y + 1, z, getBlockById(0)); + } + + } + return false; + } + + private int getAngleFor(EntityPlayer user) { + int l = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 2.5D) & 3; + return l * 90; } @Override - public boolean renderAsNormalBlock() - { - return false; - } + public boolean renderAsNormalBlock() { + return false; + } - @Override - public boolean isOpaqueCube() - { - return false; - } + @Override + public boolean isOpaqueCube() { + return false; + } - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack placed) - { - int l = MathHelper.floor_double((double)(user.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3; - world.setBlockMetadataWithNotify(x, y, z, l, 2); - } + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack placed) { + int l = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 2.5D) & 3; + world.setBlockMetadataWithNotify(x, y, z, l, 2); + } - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister p_149651_1_) - { - this.facetex = p_149651_1_.registerIcon(this.getTextureName() + "_face"); - this.toptex = p_149651_1_.registerIcon(this.getTextureName() + "_top"); - this.blockIcon = p_149651_1_.registerIcon(this.getTextureName() + "_side"); - } + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister p_149651_1_) { + this.facetex = p_149651_1_.registerIcon(this.getTextureName() + "_face"); + this.toptex = p_149651_1_.registerIcon(this.getTextureName() + "_top"); + this.blockIcon = p_149651_1_.registerIcon(this.getTextureName() + "_side"); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockCrossbowBench.java b/src/main/java/minefantasy/mf2/block/crafting/BlockCrossbowBench.java index f5bdf639..288530d0 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockCrossbowBench.java @@ -1,13 +1,13 @@ package minefantasy.mf2.block.crafting; -import java.util.ArrayList; import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.knowledge.ResearchLogic; -import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.tileentity.TileEntityCrossbowBench; -import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.knowledge.KnowledgeListMF; import net.minecraft.block.Block; @@ -18,8 +18,6 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -29,166 +27,143 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockCrossbowBench extends BlockContainer -{ +public class BlockCrossbowBench extends BlockContainer { public static int crossBench_RI = 110; - - public BlockCrossbowBench() - { - super(Material.wood); - GameRegistry.registerBlock(this, "MF_CrossbowCrafter"); + + public BlockCrossbowBench() { + super(Material.wood); + GameRegistry.registerBlock(this, "MF_CrossbowCrafter"); setBlockName("crossbowBench"); this.setStepSound(Block.soundTypeStone); this.setHardness(5F); this.setResistance(2F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - if(!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.crossbows)) - { - if(world.isRemote) - user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.crossbows)) { + if (world.isRemote) + user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); return false; - } - TileEntityCrossbowBench tile = getTile(world, x, y, z); - if(tile != null && (world.isAirBlock(x, y+1, z) || !world.isSideSolid(x, y+1, z, ForgeDirection.DOWN))) - { - if(side != 1 || !tile.tryCraft(user) && !world.isRemote) - { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) - { - if(ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) - { - TileEntityCrossbowBench tile = getTile(world, x, y, z); - if(tile != null) - { - tile.tryCraft(user); - } - } - } + } + TileEntityCrossbowBench tile = getTile(world, x, y, z); + if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { + if (side != 1 || !tile.tryCraft(user) && !world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + if (ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { + TileEntityCrossbowBench tile = getTile(world, x, y, z); + if (tile != null) { + tile.tryCraft(user); + } + } + } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityCrossbowBench(); } - private TileEntityCrossbowBench getTile(World world, int x, int y, int z) - { - return (TileEntityCrossbowBench)world.getTileEntity(x, y, z); + private TileEntityCrossbowBench getTile(World world, int x, int y, int z) { + return (TileEntityCrossbowBench) world.getTileEntity(x, y, z); } - + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityCrossbowBench tile = getTile(world, x, y, z); - if (tile != null) - { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - if(side == 1) - { + public IIcon getIcon(int side, int meta) { + if (side == 1) { return Blocks.crafting_table.getIcon(1, meta); } return Blocks.anvil.getIcon(0, 0); } + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - + public void registerBlockIcons(IIconRegister reg) { + } - - + @Override - public int getRenderType() - { + public int getRenderType() { return crossBench_RI; } - + private Random rand = new Random(); } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockEngineerTanner.java b/src/main/java/minefantasy/mf2/block/crafting/BlockEngineerTanner.java index 82f322e9..72e83311 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockEngineerTanner.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockEngineerTanner.java @@ -4,21 +4,19 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; -public class BlockEngineerTanner extends BlockTanningRack -{ +public class BlockEngineerTanner extends BlockTanningRack { - public BlockEngineerTanner(int tier, String tex) - { + public BlockEngineerTanner(int tier, String tex) { super(tier, tex); } + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { TileEntityTanningRack tile = getTile(world, x, y, z); - if(tile != null) - { - return tile.interact(user, false, side == 1); - } - return true; - } + if (tile != null) { + return tile.interact(user, false, side == 1); + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java b/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java index a4b9ba9a..a44082cc 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java @@ -12,7 +12,6 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -26,74 +25,59 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockFirepit extends BlockContainer -{ +public class BlockFirepit extends BlockContainer { private Random rand = new Random(); - public BlockFirepit() - { - super(Material.wood); - setBlockBounds(0.2F, 0F, 0.2F, 0.8F, 0.5F, 0.8F); - String name = "firepit"; + + public BlockFirepit() { + super(Material.wood); + setBlockBounds(0.2F, 0F, 0.2F, 0.8F, 0.5F, 0.8F); + String name = "firepit"; this.setBlockName(name); GameRegistry.registerBlock(this, name); - this.setLightOpacity(0); - setHardness(2F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - + this.setLightOpacity(0); + setHardness(2F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + @Override - public int quantityDropped(Random rand) - { + public int quantityDropped(Random rand) { return 0; - } + } + @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) - { - if(world.isRemote) - { + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) { + if (world.isRemote) { return; } - - TileEntityFirepit firepit = (TileEntityFirepit)world.getTileEntity(x, y, z); - if(firepit != null && player.getHeldItem() != null) - { - } - } + + TileEntityFirepit firepit = (TileEntityFirepit) world.getTileEntity(x, y, z); + if (firepit != null && player.getHeldItem() != null) { + } + } + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, float f2) - { - TileEntityFirepit firepit = (TileEntityFirepit)world.getTileEntity(x, y, z); - - if(firepit != null) - { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + TileEntityFirepit firepit = (TileEntityFirepit) world.getTileEntity(x, y, z); + + if (firepit != null) { ItemStack held = player.getHeldItem(); boolean burning = firepit.isBurning(); - - if(held != null) - { - if(firepit.addFuel(held) && !player.capabilities.isCreativeMode) - { - if(!world.isRemote) - { - if(held.stackSize == 1) - { - if(held.getItem().getContainerItem(held) != null) - { + + if (held != null) { + if (firepit.addFuel(held) && !player.capabilities.isCreativeMode) { + if (!world.isRemote) { + if (held.stackSize == 1) { + if (held.getItem().getContainerItem(held) != null) { player.setCurrentItemOrArmor(0, held.getItem().getContainerItem(held)); - } - else - { + } else { player.setCurrentItemOrArmor(0, null); } - } - else - { - held.stackSize --; - if(held.getItem().getContainerItem(held) != null) - { - if(!player.inventory.addItemStackToInventory(held.getItem().getContainerItem(held))) - { + } else { + held.stackSize--; + if (held.getItem().getContainerItem(held) != null) { + if (!player.inventory.addItemStackToInventory(held.getItem().getContainerItem(held))) { player.entityDropItem(held.getItem().getContainerItem(held), 0F); } } @@ -101,60 +85,47 @@ public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer p } return true; } - - if(burning) - { - if(firepit.tryCook(player, held) && !player.capabilities.isCreativeMode) - { + + if (burning) { + if (firepit.tryCook(player, held) && !player.capabilities.isCreativeMode) { ItemStack contain = held.getItem().getContainerItem(held); --held.stackSize; - if(held.stackSize <= 0) - { - if(contain != null) - { + if (held.stackSize <= 0) { + if (contain != null) { player.setCurrentItemOrArmor(0, contain); - } - else - player.setCurrentItemOrArmor(0, null); - } - else if(contain != null) - { + } else + player.setCurrentItemOrArmor(0, null); + } else if (contain != null) { firepit.dropItem(player, contain); } } return true; - } - else if(firepit.fuel > 0) - { - if(held.getItem() instanceof ILighter) - { - world.playSoundEffect((double)x + 0.5D, (double)y - 0.5D, (double)z + 0.5D, "fire.ignite", 1.0F, rand.nextFloat() * 0.4F + 0.8F); - world.spawnParticle("flame", (double)x + 0.5D, (double)y - 0.5D, (double)z + 0.5D, 0F, 0F, 0F); - - ILighter lighter = (ILighter)held.getItem(); - if(lighter.canLight()) - { - if(rand.nextDouble() < lighter.getChance()) - { - if(!world.isRemote) - { - firepit.setLit(true); - held.damageItem(1, player); - } - } - return true; + } else if (firepit.fuel > 0) { + if (held.getItem() instanceof ILighter) { + world.playSoundEffect(x + 0.5D, y - 0.5D, z + 0.5D, "fire.ignite", 1.0F, + rand.nextFloat() * 0.4F + 0.8F); + world.spawnParticle("flame", x + 0.5D, y - 0.5D, z + 0.5D, 0F, 0F, 0F); + + ILighter lighter = (ILighter) held.getItem(); + if (lighter.canLight()) { + if (rand.nextDouble() < lighter.getChance()) { + if (!world.isRemote) { + firepit.setLit(true); + held.damageItem(1, player); + } + } + return true; } } - if(held.getItem() instanceof ItemFlintAndSteel) - { - world.playSoundEffect((double)x + 0.5D, (double)y - 0.5D, (double)z + 0.5D, "fire.ignite", 1.0F, rand.nextFloat() * 0.4F + 0.8F); - world.spawnParticle("flame", (double)x + 0.5D, (double)y - 0.5D, (double)z + 0.5D, 0F, 0F, 0F); - - if(!world.isRemote) - { - firepit.setLit(true); - held.damageItem(1, player); - } + if (held.getItem() instanceof ItemFlintAndSteel) { + world.playSoundEffect(x + 0.5D, y - 0.5D, z + 0.5D, "fire.ignite", 1.0F, + rand.nextFloat() * 0.4F + 0.8F); + world.spawnParticle("flame", x + 0.5D, y - 0.5D, z + 0.5D, 0F, 0F, 0F); + + if (!world.isRemote) { + firepit.setLit(true); + held.damageItem(1, player); + } return true; } } @@ -164,102 +135,88 @@ else if(firepit.fuel > 0) } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityFirepit(); } - + @Override - public IIcon getIcon(int side, int meta) - { + public IIcon getIcon(int side, int meta) { return Blocks.planks.getIcon(side, 0); - } - public boolean isOpaqueCube() - { - return false; - } + } + + public boolean isOpaqueCube() { + return false; + } + public static int firepit_RI = 112; - - @SideOnly(Side.CLIENT) - public int getRenderType() - { - return firepit_RI; - } - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) - { - if(world.getBlockMetadata(x, y, z) == 1) - { - return 15; - } - return super.getLightValue(world, x, y, z); - } - - @Override - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) - { - if(world.isRemote) - { - return; - } - TileEntityFirepit tile = (TileEntityFirepit)world.getTileEntity(x, y, z); - if(entity == null || tile == null || tile.hasBlockAbove()) - { - return; - } - if(entity instanceof EntityItem) - { - entity.motionX = entity.motionY = entity.motionZ = 0; - entity.posX = x+0.5D; - entity.posY = y+0.75D; - entity.posZ = z+0.5D; - } - else - { - if(tile.isBurning()) - { - entity.attackEntityFrom(DamageSource.inFire, 1.0F); - entity.setFire(2); - } - } - } - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { - TileEntityFirepit tile = (TileEntityFirepit)world.getTileEntity(x, y, z); - if(tile != null) - { - int charcoal = tile.getCharcoalDrop(); - - if(charcoal > 0) - { - float xDrop = this.rand.nextFloat() * 0.8F + 0.1F; - float yDrop = this.rand.nextFloat() * 0.8F + 0.1F; - float zDrop = this.rand.nextFloat() * 0.8F + 0.1F; - - for(int c = 0; c < charcoal; c ++) - { - EntityItem drop = new EntityItem(world, (double)((float)x + xDrop), (double)((float)y + yDrop), (double)((float)z + zDrop), new ItemStack(Items.coal, 1, 1)); - float jumpFactor = 0.05F; - drop.motionX = (double)((float)this.rand.nextGaussian() * jumpFactor); - drop.motionY = (double)((float)this.rand.nextGaussian() * jumpFactor + 0.2F); - drop.motionZ = (double)((float)this.rand.nextGaussian() * jumpFactor); - world.spawnEntityInWorld(drop); - } - } - } - super.breakBlock(world, x, y, z, block, meta); - } - - @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { + public int getRenderType() { + return firepit_RI; + } + + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getLightValue(IBlockAccess world, int x, int y, int z) { + if (world.getBlockMetadata(x, y, z) == 1) { + return 15; + } + return super.getLightValue(world, x, y, z); + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + if (world.isRemote) { + return; + } + TileEntityFirepit tile = (TileEntityFirepit) world.getTileEntity(x, y, z); + if (entity == null || tile == null || tile.hasBlockAbove()) { + return; + } + if (entity instanceof EntityItem) { + entity.motionX = entity.motionY = entity.motionZ = 0; + entity.posX = x + 0.5D; + entity.posY = y + 0.75D; + entity.posZ = z + 0.5D; + } else { + if (tile.isBurning()) { + entity.attackEntityFrom(DamageSource.inFire, 1.0F); + entity.setFire(2); + } + } + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityFirepit tile = (TileEntityFirepit) world.getTileEntity(x, y, z); + if (tile != null) { + int charcoal = tile.getCharcoalDrop(); + + if (charcoal > 0) { + float xDrop = this.rand.nextFloat() * 0.8F + 0.1F; + float yDrop = this.rand.nextFloat() * 0.8F + 0.1F; + float zDrop = this.rand.nextFloat() * 0.8F + 0.1F; + + for (int c = 0; c < charcoal; c++) { + EntityItem drop = new EntityItem(world, x + xDrop, y + yDrop, z + zDrop, + new ItemStack(Items.coal, 1, 1)); + + float jumpFactor = 0.05F; + drop.motionX = (float) this.rand.nextGaussian() * jumpFactor; + drop.motionY = (float) this.rand.nextGaussian() * jumpFactor + 0.2F; + drop.motionZ = (float) this.rand.nextGaussian() * jumpFactor; + world.spawnEntityInWorld(drop); + } + } + } + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockFrame.java b/src/main/java/minefantasy/mf2/block/crafting/BlockFrame.java index 04600a46..200e4125 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockFrame.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockFrame.java @@ -12,139 +12,122 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockFrame extends BasicBlockMF -{ +public class BlockFrame extends BasicBlockMF { public boolean isCogworkHolder = false; - public BlockFrame(String name) - { + + public BlockFrame(String name) { this(name, null); } - public BlockFrame(String name, Object drop) - { + + public BlockFrame(String name, Object drop) { super(name, Material.iron, drop); - setBlockTextureName("minefantasy2:metal/"+name); + setBlockTextureName("minefantasy2:metal/" + name); this.setCreativeTab(CreativeTabMF.tabGadget); this.setHardness(1.0F); this.setResistance(3.0F); } - public BlockFrame setCogworkHolder() - { + + public BlockFrame setCogworkHolder() { isCogworkHolder = true; this.setCreativeTab(null); return this; } - + @Override - public boolean isOpaqueCube() - { + public boolean isOpaqueCube() { return false; } + @Override - public boolean renderAsNormalBlock() - { + public boolean renderAsNormalBlock() { return false; } + @Override - public void setBlockBoundsForItemRender() - { - if(isCogworkHolder) - { - this.setBlockBounds(0F, 0F, 0F, 1F, 1F-offset, 1F); + public void setBlockBoundsForItemRender() { + if (isCogworkHolder) { + this.setBlockBounds(0F, 0F, 0F, 1F, 1F - offset, 1F); return; } - this.setBlockBounds(offset, offset, offset, 1-offset, 1-offset, 1-offset); - } - + this.setBlockBounds(offset, offset, offset, 1 - offset, 1 - offset, 1 - offset); + } + public static final float offset = 0.28125F; + @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) - { - if(isCogworkHolder) - { - this.setBlockBounds(0F, 0F, 0F, 1F, 1F-offset, 1F); + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + if (isCogworkHolder) { + this.setBlockBounds(0F, 0F, 0F, 1F, 1F - offset, 1F); return; } - boolean mz = this.canInteract(world, x, y, z - 1); - boolean pz = this.canInteract(world, x, y, z + 1); - boolean mx = this.canInteract(world, x - 1, y, z); - boolean px = this.canInteract(world, x + 1, y, z); - boolean my = this.canInteract(world, x, y - 1, z, true); - boolean py = this.canInteract(world, x, y + 1, z); - - float xstart = offset; - float xend = 1-offset; - float zstart = offset; - float zend = 1-offset; - float ystart = offset; - float yend = 1-offset; - - - if (mz) - { - zstart = 0.0F; - } - - if (pz) - { - zend = 1.0F; - } - - if (mx) - { - xstart = 0.0F; - } - - if (px) - { - xend = 1.0F; - } - - if (my) - { - ystart = 0.0F; - } - - if (py) - { - yend = 1.0F; - } - - this.setBlockBounds(xstart, ystart, zstart, xend, yend, zend); - } - - - public boolean canInteract(IBlockAccess world, int x, int y, int z) - { + boolean mz = this.canInteract(world, x, y, z - 1); + boolean pz = this.canInteract(world, x, y, z + 1); + boolean mx = this.canInteract(world, x - 1, y, z); + boolean px = this.canInteract(world, x + 1, y, z); + boolean my = this.canInteract(world, x, y - 1, z, true); + boolean py = this.canInteract(world, x, y + 1, z); + + float xstart = offset; + float xend = 1 - offset; + float zstart = offset; + float zend = 1 - offset; + float ystart = offset; + float yend = 1 - offset; + + if (mz) { + zstart = 0.0F; + } + + if (pz) { + zend = 1.0F; + } + + if (mx) { + xstart = 0.0F; + } + + if (px) { + xend = 1.0F; + } + + if (my) { + ystart = 0.0F; + } + + if (py) { + yend = 1.0F; + } + + this.setBlockBounds(xstart, ystart, zstart, xend, yend, zend); + } + + public boolean canInteract(IBlockAccess world, int x, int y, int z) { return canInteract(world, x, y, z, false); - } - public boolean canInteract(IBlockAccess world, int x, int y, int z, boolean floor) - { - if(floor && world.getBlock(x, y, z).isSideSolid(world, x, y, z, ForgeDirection.UP)) - { + } + + public boolean canInteract(IBlockAccess world, int x, int y, int z, boolean floor) { + if (floor && world.getBlock(x, y, z).isSideSolid(world, x, y, z, ForgeDirection.UP)) { return true; } - return world.getBlock(x, y, z) instanceof BlockFrame; - } - + return world.getBlock(x, y, z) instanceof BlockFrame; + } + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, float f2) - { - if(ToolHelper.getCrafterTool(player.getHeldItem()).equalsIgnoreCase("spanner")) - { - return tryBuild(player, world, x, y, z); - } - return false; - } - private boolean tryBuild(EntityPlayer player, World world, int x, int y, int z) - { - if(PowerArmour.isBasicStationFrame(world, x, y, z) && (player.capabilities.isCreativeMode || player.inventory.hasItem(ComponentListMF.cogwork_pulley))) - { - if(!player.capabilities.isCreativeMode) - { - player.inventory.consumeInventoryItem(ComponentListMF.cogwork_pulley); + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + if (ToolHelper.getCrafterTool(player.getHeldItem()).equalsIgnoreCase("spanner")) { + return tryBuild(player, world, x, y, z); + } + return false; + } + + private boolean tryBuild(EntityPlayer player, World world, int x, int y, int z) { + if (PowerArmour.isBasicStationFrame(world, x, y, z) + && (player.capabilities.isCreativeMode || player.inventory.hasItem(ComponentListMF.cogwork_pulley))) { + if (!player.capabilities.isCreativeMode) { + player.inventory.consumeInventoryItem(ComponentListMF.cogwork_pulley); } - if(!world.isRemote) - { + if (!world.isRemote) { world.setBlock(x, y, z, BlockListMF.cogwork_builder, 0, 2); } return true; diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockRepairKit.java b/src/main/java/minefantasy/mf2/block/crafting/BlockRepairKit.java index 20a2f30c..5a7867fa 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockRepairKit.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockRepairKit.java @@ -5,9 +5,7 @@ import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; import minefantasy.mf2.item.list.CreativeTabMF; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -17,8 +15,7 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class BlockRepairKit extends Block -{ +public class BlockRepairKit extends Block { protected float repairLevel; protected float successRate; protected float breakChance; @@ -26,101 +23,94 @@ public class BlockRepairKit extends Block private String type; protected boolean isOrnate = false; protected float repairLevelEnchant = 0.0F; - - public BlockRepairKit(String name, float repairLevel, float rate, float breakChance) - { + + public BlockRepairKit(String name, float repairLevel, float rate, float breakChance) { super(Material.cloth); - + this.repairLevel = repairLevel; this.successRate = rate; this.breakChance = breakChance; - this.type=name; - setBlockBounds(1F/16F, 0F, 1F/16F, 15F/16F, 6F/16F, 15F/16F); - - this.setBlockTextureName("minefantasy2:processor/"+"repair_"+name+"+top"); - name = "repair_"+name; - GameRegistry.registerBlock(this, ItemBlockRepairKit.class, name); + this.type = name; + setBlockBounds(1F / 16F, 0F, 1F / 16F, 15F / 16F, 6F / 16F, 15F / 16F); + + this.setBlockTextureName("minefantasy2:processor/" + "repair_" + name + "+top"); + name = "repair_" + name; + GameRegistry.registerBlock(this, ItemBlockRepairKit.class, name); setBlockName(name); this.setStepSound(Block.soundTypeCloth); this.setHardness(1F); this.setResistance(0F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabGadget); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabGadget); } - public BlockRepairKit setOrnate(float enc) - { + + public BlockRepairKit setOrnate(float enc) { repairLevelEnchant = enc; isOrnate = true; return this; } @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) - { - return side == 1 ? this.top : (side == 0 ? this.bottom : this.side); - } - + @Override + public IIcon getIcon(int side, int meta) { + return side == 1 ? this.top : (side == 0 ? this.bottom : this.side); + } + @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister reg) - { - this.side = reg.registerIcon("minefantasy2:processor/repair_"+ type + "_side"); - this.top = reg.registerIcon("minefantasy2:processor/repair_"+ type + "_top"); - this.bottom = reg.registerIcon("minefantasy2:processor/repair_"+ type + "_base"); - } - + public void registerBlockIcons(IIconRegister reg) { + this.side = reg.registerIcon("minefantasy2:processor/repair_" + type + "_side"); + this.top = reg.registerIcon("minefantasy2:processor/repair_" + type + "_top"); + this.bottom = reg.registerIcon("minefantasy2:processor/repair_" + type + "_base"); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + private Random rand = new Random(); + @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - private Random rand = new Random(); - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - if(world.isRemote) - { - return true; - } - ItemStack held = user.getHeldItem(); - //held.getItem().isRepairable() Was used but new MF tools disable this to avoid vanilla repairs - if(held != null && canRepair(held) && (!held.isItemEnchanted() || isOrnate)) - { - if(rand.nextFloat() < successRate) - { - boolean broken = rand.nextFloat() < breakChance; - - float lvl = held.isItemEnchanted() ? repairLevelEnchant : repairLevel; - int repairAmount = (int)((float)held.getMaxDamage()*lvl); + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (world.isRemote) { + return true; + } + ItemStack held = user.getHeldItem(); + // held.getItem().isRepairable() Was used but new MF tools disable this to avoid + // vanilla repairs + if (held != null && canRepair(held) && (!held.isItemEnchanted() || isOrnate)) { + if (rand.nextFloat() < successRate) { + boolean broken = rand.nextFloat() < breakChance; + + float lvl = held.isItemEnchanted() ? repairLevelEnchant : repairLevel; + int repairAmount = (int) (held.getMaxDamage() * lvl); held.setItemDamage(Math.max(0, held.getItemDamage() - repairAmount)); world.playAuxSFX(broken ? 1020 : 1021, x, y, z, 0); - - if(broken) - { - world.playSoundEffect(x+0.5D, y+0.3D, z+0.5D, "random.break", 1.0F, 1.0F); - world.setBlockToAir(x, y, z); - } - return true; - } - else - { - world.playSoundEffect(x+0.5D, y+0.3D, z+0.5D, "step.cloth", 0.5F, 0.5F); - } - return true; - } - return false; - } - private boolean canRepair(ItemStack held) - { - if(held == null)return false; - if(held.getItem().isDamageable() && CustomToolHelper.getCustomPrimaryMaterial(held) != null)//Custom Tool + + if (broken) { + world.playSoundEffect(x + 0.5D, y + 0.3D, z + 0.5D, "random.break", 1.0F, 1.0F); + world.setBlockToAir(x, y, z); + } + return true; + } else { + world.playSoundEffect(x + 0.5D, y + 0.3D, z + 0.5D, "step.cloth", 0.5F, 0.5F); + } + return true; + } + return false; + } + + private boolean canRepair(ItemStack held) { + if (held == null) + return false; + if (held.getItem().isDamageable() && CustomToolHelper.getCustomPrimaryMaterial(held) != null)// Custom Tool { return held.isItemDamaged(); } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockResearchStation.java b/src/main/java/minefantasy/mf2/block/crafting/BlockResearchStation.java index a3049b4d..ee20cf4b 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockResearchStation.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockResearchStation.java @@ -2,6 +2,9 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.block.tileentity.TileEntityResearch; import minefantasy.mf2.item.list.CreativeTabMF; @@ -20,153 +23,135 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockResearchStation extends BlockContainer -{ +public class BlockResearchStation extends BlockContainer { public static int research_RI = 106; - private int tier = 0; + private int tier = 0; - public BlockResearchStation() - { - super(Material.wood); - - GameRegistry.registerBlock(this, "MF_Research"); + public BlockResearchStation() { + super(Material.wood); + + GameRegistry.registerBlock(this, "MF_Research"); setBlockName("researchStation"); this.setStepSound(Block.soundTypeWood); this.setHardness(5F); this.setResistance(2F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - TileEntityResearch tile = getTile(world, x, y, z); - if(tile != null && (world.isAirBlock(x, y+1, z) || !world.isSideSolid(x, y+1, z, ForgeDirection.DOWN))) - { - if(!(side == 1 && tile.interact(user))) - { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) - { - TileEntityResearch tile = getTile(world, x, y, z); - if(tile != null && (world.isAirBlock(x, y+1, z) || !world.isSideSolid(x, y+1, z, ForgeDirection.DOWN))) - { + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + TileEntityResearch tile = getTile(world, x, y, z); + if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { + if (!(side == 1 && tile.interact(user))) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + TileEntityResearch tile = getTile(world, x, y, z); + if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { tile.interact(user); - } - } + } + } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityResearch(); } - private TileEntityResearch getTile(World world, int x, int y, int z) - { - return (TileEntityResearch)world.getTileEntity(x, y, z); + private TileEntityResearch getTile(World world, int x, int y, int z) { + return (TileEntityResearch) world.getTileEntity(x, y, z); } - + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { + public IIcon getIcon(int side, int meta) { return Blocks.crafting_table.getIcon(side, meta); } + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - + public void registerBlockIcons(IIconRegister reg) { + } + @Override - public int getRenderType() - { + public int getRenderType() { return research_RI; } - + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityResearch tile = getTile(world, x, y, z); - if (tile != null) - { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + private Random rand = new Random(); } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockRoast.java b/src/main/java/minefantasy/mf2/block/crafting/BlockRoast.java index c0b293cb..ce5f117a 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockRoast.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockRoast.java @@ -2,6 +2,9 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.tileentity.TileEntityRoast; import minefantasy.mf2.item.list.CreativeTabMF; import net.minecraft.block.Block; @@ -18,147 +21,129 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockRoast extends BlockContainer -{ +public class BlockRoast extends BlockContainer { public static int roast_RI = 113; private boolean isOven; private int tier; public String tex; - - public BlockRoast(int tier, String tex, boolean isOven) - { + + public BlockRoast(int tier, String tex, boolean isOven) { super(Material.rock); this.isOven = isOven; this.tex = tex; this.tier = tier; - String name = "food_"+ (isOven ? "oven" : "roast") + "_"+tex; + String name = "food_" + (isOven ? "oven" : "roast") + "_" + tex; this.setBlockName(name); GameRegistry.registerBlock(this, name); this.setHardness(1.5F); this.setResistance(1F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - if(isOven) - { - setBlockBounds(3F/16F, 0F, 3F/16F, 13F/16F, 1F/1.6F, 13F/16F); - } - else - { - setBlockBounds(3F/16F, 0F, 3F/16F, 13F/16F, 0.125F, 13F/16F); - } + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + if (isOven) { + setBlockBounds(3F / 16F, 0F, 3F / 16F, 13F / 16F, 1F / 1.6F, 13F / 16F); + } else { + setBlockBounds(3F / 16F, 0F, 3F / 16F, 13F / 16F, 0.125F, 13F / 16F); + } } + @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityRoast(); } - + @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, dir, 2); - } - - public TileEntityRoast getTile(World world, int x, int y, int z) - { - return (TileEntityRoast)world.getTileEntity(x, y, z); + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, dir, 2); + } + + public TileEntityRoast getTile(World world, int x, int y, int z) { + return (TileEntityRoast) world.getTileEntity(x, y, z); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + TileEntityRoast tile = getTile(world, x, y, z); + if (tile != null) { + return tile.interact(user); + } + return true; + } + + public Random rand = new Random(); + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityRoast tile = getTile(world, x, y, z); + + if (tile != null) { + ItemStack itemstack = tile.items[0]; + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return Blocks.anvil.getIcon(side, 0); } @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - TileEntityRoast tile = getTile(world, x, y, z); - if(tile != null) - { - return tile.interact(user); - } - return true; - } - - public Random rand = new Random(); - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { - TileEntityRoast tile = getTile(world, x, y, z); - - if (tile != null) - { - ItemStack itemstack = tile.items[0]; - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - return Blocks.anvil.getIcon(side, 0); - } - @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - + public void registerBlockIcons(IIconRegister reg) { + + } + + @Override + public boolean renderAsNormalBlock() { + return false; } - - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - public boolean isOven() - { + + @Override + public boolean isOpaqueCube() { + return false; + } + + public boolean isOven() { return isOven; } + @Override - public int getRenderType() - { + public int getRenderType() { return isOven ? roast_RI : super.getRenderType(); } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java b/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java index 1ffa2f1c..537db70b 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java @@ -7,17 +7,13 @@ import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.crafting.Salvage; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.SkillList; -import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.knowledge.KnowledgeListMF; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -28,195 +24,159 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class BlockSalvage extends Block -{ +public class BlockSalvage extends Block { protected float dropLevel; protected IIcon top, side, bottom; private String type; - - public BlockSalvage(String name, float dropLevel) - { + + public BlockSalvage(String name, float dropLevel) { super(Material.wood); - + this.dropLevel = dropLevel; - this.type=name; - - this.setBlockTextureName("minefantasy2:processor/"+"salvage_"+name+"+top"); - name = "salvage_"+name; - GameRegistry.registerBlock(this, ItemBlockSalvage.class, name); + this.type = name; + + this.setBlockTextureName("minefantasy2:processor/" + "salvage_" + name + "+top"); + name = "salvage_" + name; + GameRegistry.registerBlock(this, ItemBlockSalvage.class, name); setBlockName(name); this.setStepSound(Block.soundTypeAnvil); this.setHardness(2F); this.setResistance(1F); - this.setCreativeTab(CreativeTabMF.tabGadget); + this.setCreativeTab(CreativeTabMF.tabGadget); } @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) - { - return side == 1 ? this.top : (side == 0 ? this.bottom : this.side); - } - + @Override + public IIcon getIcon(int side, int meta) { + return side == 1 ? this.top : (side == 0 ? this.bottom : this.side); + } + @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister reg) - { - this.side = reg.registerIcon("minefantasy2:processor/salvage_"+ type + "_side"); - this.top = reg.registerIcon("minefantasy2:processor/salvage_"+ type + "_top"); - this.bottom = reg.registerIcon("minefantasy2:processor/salvage_"+ type + "_base"); - } - - private Random rand = new Random(); - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - if(world.isRemote) - { - return true; - } - ItemStack held = user.getHeldItem(); - String toolType = ToolHelper.getCrafterTool(held); - - /* - Block above = world.getBlock(x, y+1, z); - if(above != null) - { - if(salvageBlock(world, user, above, x, y, z)) - { - world.setBlockToAir(x, y+1, z); - return true; - } - } - */ - - EntityItem drop = getDrop(world, x, y, z); - if(drop != null && !user.isSwingInProgress) - { - ItemStack junk = drop.getEntityItem(); - int amount = Math.min(junk.stackSize, 4); - - for(int a = 0; a < amount; a++) - { - if(salvageItem(world, user, junk, x, y, z)) - { - if(junk.stackSize == 1) - { - AmmoMechanicsMF.dropAmmo(world, junk, x+0.5D, y+1.25D, z+0.5D); - AmmoMechanicsMF.dropAmmoCrate(world, junk, x+0.5D, y+1.25D, z+0.5D); + public void registerBlockIcons(IIconRegister reg) { + this.side = reg.registerIcon("minefantasy2:processor/salvage_" + type + "_side"); + this.top = reg.registerIcon("minefantasy2:processor/salvage_" + type + "_top"); + this.bottom = reg.registerIcon("minefantasy2:processor/salvage_" + type + "_base"); + } + + private Random rand = new Random(); + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (world.isRemote) { + return true; + } + ItemStack held = user.getHeldItem(); + String toolType = ToolHelper.getCrafterTool(held); + + /* + * Block above = world.getBlock(x, y+1, z); if(above != null) { + * if(salvageBlock(world, user, above, x, y, z)) { world.setBlockToAir(x, y+1, + * z); return true; } } + */ + + EntityItem drop = getDrop(world, x, y, z); + if (drop != null && !user.isSwingInProgress) { + ItemStack junk = drop.getEntityItem(); + int amount = Math.min(junk.stackSize, 4); + + for (int a = 0; a < amount; a++) { + if (salvageItem(world, user, junk, x, y, z)) { + if (junk.stackSize == 1) { + AmmoMechanicsMF.dropAmmo(world, junk, x + 0.5D, y + 1.25D, z + 0.5D); + AmmoMechanicsMF.dropAmmoCrate(world, junk, x + 0.5D, y + 1.25D, z + 0.5D); } - + --drop.getEntityItem().stackSize; - if(drop.getEntityItem().stackSize <= 0) - { + if (drop.getEntityItem().stackSize <= 0) { drop.setDead(); return true; } } - } - return true; - } - return false; - } - - private boolean salvageItem(World world, EntityPlayer user, ItemStack junk, int x, int y, int z) - { + } + return true; + } + return false; + } + + private boolean salvageItem(World world, EntityPlayer user, ItemStack junk, int x, int y, int z) { float modifier = 0.5F; ItemStack held = user.getHeldItem(); String type = ToolHelper.getCrafterTool(held); float efficiency = ToolHelper.getCrafterEfficiency(held); - if(type.equalsIgnoreCase("saw")) - { - modifier += (efficiency*0.1F); - world.playSoundEffect(x+0.5, y+0.5, z+0.5, "minefantasy2:block.sawcarpenter", 2F, 1F); + if (type.equalsIgnoreCase("saw")) { + modifier += (efficiency * 0.1F); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "minefantasy2:block.sawcarpenter", 2F, 1F); } - if(type.equalsIgnoreCase("hammer") || type.equalsIgnoreCase("hvyhammer")) - { - modifier += (efficiency*0.05F); - world.playSoundEffect(x+0.5, y+0.5, z+0.5, "minefantasy2:block.anvilsucceed", 1F, 1F); + if (type.equalsIgnoreCase("hammer") || type.equalsIgnoreCase("hvyhammer")) { + modifier += (efficiency * 0.05F); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "minefantasy2:block.anvilsucceed", 1F, 1F); } - + List salvage = Salvage.salvage(user, junk, dropLevel * getPlayerDropLevel(user) * modifier); - - if(salvage != null) - { + + if (salvage != null) { dropSalvage(world, x, y, z, salvage, junk); - world.playSoundEffect(x+0.5, y+0.5, z+0.5, "random.break", 1F, 1F); - world.playSoundEffect(x+0.5, y+0.5, z+0.5, "mob.zombie.woodbreak", 0.5F, 1.5F); - world.playSoundEffect(x+0.5, y+0.5, z+0.5, "dig.glass", 1.0F, 0.5F); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "random.break", 1F, 1F); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "mob.zombie.woodbreak", 0.5F, 1.5F); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "dig.glass", 1.0F, 0.5F); return true; } return false; } /* - private boolean salvageBlock(World world, EntityPlayer user, Block junk, int x, int y, int z) - { - List salvage = Salvage.salvageBlock(junk, dropLevel); - - if(salvage != null) - { - dropSalvage(world, x, y, z, salvage); - world.playAuxSFX(1021, x, y, z, 0); - return true; - } - return false; - } - */ + * private boolean salvageBlock(World world, EntityPlayer user, Block junk, int + * x, int y, int z) { List salvage = Salvage.salvageBlock(junk, + * dropLevel); + * + * if(salvage != null) { dropSalvage(world, x, y, z, salvage); + * world.playAuxSFX(1021, x, y, z, 0); return true; } return false; } + */ - public static float getPlayerDropLevel(EntityPlayer user) - { + public static float getPlayerDropLevel(EntityPlayer user) { float rate = 1.0F; - - if(RPGElements.isSystemActive) - { + + if (RPGElements.isSystemActive) { int lvl = RPGElements.getLevel(user, SkillList.artisanry); - if(lvl > 10) - { - rate += ( (lvl-10) *0.01F); + if (lvl > 10) { + rate += ((lvl - 10) * 0.01F); } } - if(ResearchLogic.hasInfoUnlocked(user, "scrapper")) - { + if (ResearchLogic.hasInfoUnlocked(user, "scrapper")) { rate += 0.5F; } - + return rate; } - private void dropSalvage(World world, int x, int y, int z, List salvage, ItemStack junk) - { + private void dropSalvage(World world, int x, int y, int z, List salvage, ItemStack junk) { Iterator iterator = salvage.iterator(); - while(iterator.hasNext()) - { + while (iterator.hasNext()) { ItemStack drop = (ItemStack) iterator.next(); - if(drop != null)// && !user.inventory.addItemStackToInventory(drop)) + if (drop != null)// && !user.inventory.addItemStackToInventory(drop)) { entityDropItem(world, x, y, z, drop); } } } - public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) - { - if (item.stackSize != 0 && item.getItem() != null) - { - EntityItem entityitem = new EntityItem(world, x+0.5D, y+1.25D, z+0.5D, item); - entityitem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(entityitem); - return entityitem; - } - else - { - return null; - } - } - - private EntityItem getDrop(World world, int x, int y, int z) - { - AxisAlignedBB box = AxisAlignedBB.getBoundingBox(x+0.1D, y+1D, z+0.1D, x+0.9D, y+1.5D, z+0.9D); - Listdrops = world.getEntitiesWithinAABB(EntityItem.class, box); - if(drops != null && !drops.isEmpty()) - { - return ((EntityItem)drops.get(0)); + + public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) { + if (item.stackSize != 0 && item.getItem() != null) { + EntityItem entityitem = new EntityItem(world, x + 0.5D, y + 1.25D, z + 0.5D, item); + entityitem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(entityitem); + return entityitem; + } else { + return null; + } + } + + private EntityItem getDrop(World world, int x, int y, int z) { + AxisAlignedBB box = AxisAlignedBB.getBoundingBox(x + 0.1D, y + 1D, z + 0.1D, x + 0.9D, y + 1.5D, z + 0.9D); + List drops = world.getEntitiesWithinAABB(EntityItem.class, box); + if (drops != null && !drops.isEmpty()) { + return (drops.get(0)); } return null; } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockTanningRack.java b/src/main/java/minefantasy/mf2/block/crafting/BlockTanningRack.java index 7d7f5d0c..cb943042 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockTanningRack.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockTanningRack.java @@ -2,6 +2,9 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.tileentity.TileEntityTanningRack; import minefantasy.mf2.item.list.CreativeTabMF; import net.minecraft.block.Block; @@ -18,145 +21,128 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockTanningRack extends BlockContainer -{ +public class BlockTanningRack extends BlockContainer { public static int tanner_RI = 103; - + public int tier; public String tex; - public BlockTanningRack(int tier, String tex) - { + + public BlockTanningRack(int tier, String tex) { super(Material.wood); - - this.tier=tier; - this.tex=tex; - String name = "tanner"+tex; + + this.tier = tier; + this.tex = tex; + String name = "tanner" + tex; this.setBlockName(name); GameRegistry.registerBlock(this, name); - this.setHardness(1F + 0.5F*tier); + this.setHardness(1F + 0.5F * tier); this.setResistance(1F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityTanningRack(tier, tex); } - + @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, dir, 2); - } - - public TileEntityTanningRack getTile(World world, int x, int y, int z) - { - return (TileEntityTanningRack)world.getTileEntity(x, y, z); + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, dir, 2); + } + + public TileEntityTanningRack getTile(World world, int x, int y, int z) { + return (TileEntityTanningRack) world.getTileEntity(x, y, z); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + TileEntityTanningRack tile = getTile(world, x, y, z); + if (tile != null) { + return tile.interact(user, false, false); + } + return true; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + TileEntityTanningRack tile = getTile(world, x, y, z); + if (tile != null) { + tile.interact(user, true, false); + } + } + + public Random rand = new Random(); + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityTanningRack tile = getTile(world, x, y, z); + + if (tile != null) { + ItemStack itemstack = tile.items[0]; + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); } @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - TileEntityTanningRack tile = getTile(world, x, y, z); - if(tile != null) - { - return tile.interact(user, false, false); - } - return true; - } - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) - { - TileEntityTanningRack tile = getTile(world, x, y, z); - if(tile != null) - { - tile.interact(user, true, false); - } - } - - public Random rand = new Random(); - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { - TileEntityTanningRack tile = getTile(world, x, y, z); - - if (tile != null) - { - ItemStack itemstack = tile.items[0]; - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - return Blocks.planks.getIcon(side, 0); - } - @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - + public void registerBlockIcons(IIconRegister reg) { + + } + + @Override + public boolean renderAsNormalBlock() { + return false; } - - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - @Override - public int getRenderType() - { + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public int getRenderType() { return tanner_RI; } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockAnvilMF.java b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockAnvilMF.java index 758b47ea..33ab4f80 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockAnvilMF.java +++ b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockAnvilMF.java @@ -8,18 +8,16 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; -public class ItemBlockAnvilMF extends ItemBlock -{ +public class ItemBlockAnvilMF extends ItemBlock { private BlockAnvilMF anvil; - public ItemBlockAnvilMF(Block block) - { + + public ItemBlockAnvilMF(Block block) { super(block); this.anvil = (BlockAnvilMF) block; } @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { list.add(StatCollector.translateToLocal("attribute.mfcrafttier.name") + ": " + anvil.getTier()); super.addInformation(item, user, list, extra); } diff --git a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockRepairKit.java b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockRepairKit.java index b5199829..4a22eb83 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockRepairKit.java +++ b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockRepairKit.java @@ -9,42 +9,39 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; -public class ItemBlockRepairKit extends ItemBlock -{ +public class ItemBlockRepairKit extends ItemBlock { private BlockRepairKit kit; - public ItemBlockRepairKit(Block base) - { + + public ItemBlockRepairKit(Block base) { super(base); this.setMaxStackSize(8); - this.kit = (BlockRepairKit)base; + this.kit = (BlockRepairKit) base; } @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(kit.isOrnate) - { - list.add(StatCollector.translateToLocal("attribute.kit.repairRate_normal.name") + ": " + kit.repairLevel*100F + "%"); - list.add(StatCollector.translateToLocal("attribute.kit.repairRate_enchant.name") + ": " + kit.repairLevelEnchant*100F + "%"); - } - else - { - list.add(StatCollector.translateToLocal("attribute.kit.repairRate.name") + ": " + kit.repairLevel*100F + "%"); + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (kit.isOrnate) { + list.add(StatCollector.translateToLocal("attribute.kit.repairRate_normal.name") + ": " + + kit.repairLevel * 100F + "%"); + list.add(StatCollector.translateToLocal("attribute.kit.repairRate_enchant.name") + ": " + + kit.repairLevelEnchant * 100F + "%"); + } else { + list.add(StatCollector.translateToLocal("attribute.kit.repairRate.name") + ": " + kit.repairLevel * 100F + + "%"); } - list.add(StatCollector.translateToLocal("attribute.kit.repairChance.name") + ": " + kit.successRate*100F + "%"); - list.add(StatCollector.translateToLocal("attribute.kit.breakChance.name") + ": " + kit.breakChance*100F + "%"); + list.add(StatCollector.translateToLocal("attribute.kit.repairChance.name") + ": " + kit.successRate * 100F + + "%"); + list.add( + StatCollector.translateToLocal("attribute.kit.breakChance.name") + ": " + kit.breakChance * 100F + "%"); super.addInformation(item, user, list, extra); } - + @Override - public EnumRarity getRarity(ItemStack item) - { - if(kit.isOrnate) - { + public EnumRarity getRarity(ItemStack item) { + if (kit.isOrnate) { return EnumRarity.rare; } - if(kit.repairLevel >= 1.0F) - { + if (kit.repairLevel >= 1.0F) { return EnumRarity.uncommon; } return super.getRarity(item); diff --git a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockSalvage.java b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockSalvage.java index 08dfc6eb..f7fd545b 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockSalvage.java +++ b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockSalvage.java @@ -9,26 +9,23 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; -public class ItemBlockSalvage extends ItemBlock -{ +public class ItemBlockSalvage extends ItemBlock { private BlockSalvage kit; - public ItemBlockSalvage(Block base) - { + + public ItemBlockSalvage(Block base) { super(base); this.setMaxStackSize(8); - this.kit = (BlockSalvage)base; + this.kit = (BlockSalvage) base; } @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { list.add(StatCollector.translateToLocal("attribute.kit.salvage.name") + ": " + kit.dropLevel); super.addInformation(item, user, list, extra); } - + @Override - public EnumRarity getRarity(ItemStack item) - { + public EnumRarity getRarity(ItemStack item) { return super.getRarity(item); } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockAmmoBox.java b/src/main/java/minefantasy/mf2/block/decor/BlockAmmoBox.java index cebc8941..16dd4525 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockAmmoBox.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockAmmoBox.java @@ -21,154 +21,143 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class BlockAmmoBox extends BlockWoodDecor -{ +public class BlockAmmoBox extends BlockWoodDecor { public static int ammo_RI = 116; /** * Food-Ammo-All */ public final byte storageType; public String name; - - public BlockAmmoBox(String name, byte storageType) - { + + public BlockAmmoBox(String name, byte storageType) { this(name, name, storageType); } + /** - * @param storageType (Food, Ammo, All) + * @param storageType + * (Food, Ammo, All) */ - public BlockAmmoBox(String name, String texName, byte storageType) - { + public BlockAmmoBox(String name, String texName, byte storageType) { super(texName); this.storageType = storageType; - float width = (storageType == 0 ? 8F : storageType == 1 ? 14F : 16F) / 16F; - float height = (storageType == 0 ? 4F : storageType == 1 ? 8F : 9F ) / 16F; - - float border = (1F-width)/2; - this.setBlockBounds(border, 0F, border, 1-border, height, 1-border); - - this.name=name; + float width = (storageType == 0 ? 8F : storageType == 1 ? 14F : 16F) / 16F; + float height = (storageType == 0 ? 4F : storageType == 1 ? 8F : 9F) / 16F; + + float border = (1F - width) / 2; + this.setBlockBounds(border, 0F, border, 1 - border, height, 1 - border); + + this.name = name; GameRegistry.registerBlock(this, ItemBlockAmmoBox.class, name); setBlockName(name); this.setHardness(0.5F); this.setResistance(2F); - this.setCreativeTab(CreativeTabMF.tabUtil); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean isOpaqueCube() { + return false; } - + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); + } + @Override - public boolean isOpaqueCube() - { - return false; - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - @Override - public IIcon getIcon(int side, int meta) - { - return Blocks.planks.getIcon(side, 0); - } - @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - - } - @SideOnly(Side.CLIENT) - public int getRenderType() - { - return ammo_RI; - } - public static final String NBT_Ammo = "Ammo", NBT_Stock = "Stock"; - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int direction = MathHelper.floor_double((double)(user.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - - TileEntityAmmoBox tile = getTile(world, x, y, z); - if(tile != null) - { - if(item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Ammo) && item.getTagCompound().hasKey(NBT_Stock)) - { - tile.ammo = ItemStack.loadItemStackFromNBT(item.getTagCompound().getCompoundTag(NBT_Ammo)); - tile.stock = item.getTagCompound().getInteger(NBT_Stock); - } - } - super.onBlockPlacedBy(world, x, y, z, user, item); - } - public static ItemStack getHeld(ItemStack item, boolean removeTag) - { - if(item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Ammo)) - { - ItemStack i = ItemStack.loadItemStackFromNBT(item.getTagCompound().getCompoundTag(NBT_Ammo)); - if(removeTag) - { - item.getTagCompound().removeTag(NBT_Ammo); - } - return i; - } - return null; - } - public static int getStock(ItemStack item, boolean removeTag) - { - if(item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Stock)) - { - int i = item.getTagCompound().getInteger(NBT_Stock); - if(removeTag) - { - item.getTagCompound().removeTag(NBT_Stock); - } - return i; - } - return 0; - } + public void registerBlockIcons(IIconRegister reg) { + + } + + @SideOnly(Side.CLIENT) + public int getRenderType() { + return ammo_RI; + } + + public static final String NBT_Ammo = "Ammo", NBT_Stock = "Stock"; + @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + + TileEntityAmmoBox tile = getTile(world, x, y, z); + if (tile != null) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Ammo) + && item.getTagCompound().hasKey(NBT_Stock)) { + tile.ammo = ItemStack.loadItemStackFromNBT(item.getTagCompound().getCompoundTag(NBT_Ammo)); + tile.stock = item.getTagCompound().getInteger(NBT_Stock); + } + } + super.onBlockPlacedBy(world, x, y, z, user, item); + } + + public static ItemStack getHeld(ItemStack item, boolean removeTag) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Ammo)) { + ItemStack i = ItemStack.loadItemStackFromNBT(item.getTagCompound().getCompoundTag(NBT_Ammo)); + if (removeTag) { + item.getTagCompound().removeTag(NBT_Ammo); + } + return i; + } + return null; + } + + public static int getStock(ItemStack item, boolean removeTag) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Stock)) { + int i = item.getTagCompound().getInteger(NBT_Stock); + if (removeTag) { + item.getTagCompound().removeTag(NBT_Stock); + } + return i; + } + return 0; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityAmmoBox(); } + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { ItemStack held = user.getHeldItem(); TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityAmmoBox) - { - return ((TileEntityAmmoBox)tile).interact(user, held); + if (tile != null && tile instanceof TileEntityAmmoBox) { + return ((TileEntityAmmoBox) tile).interact(user, held); } return false; - } + } + private Random rand = new Random(); - + @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) - { - ArrayList ret = new ArrayList(); - return ret; - } - + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList ret = new ArrayList(); + return ret; + } + @Override - protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) - { - return modifyAmmo((TileEntityAmmoBox)tile, super.modifyDrop(tile, item)); + protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { + return modifyAmmo((TileEntityAmmoBox) tile, super.modifyDrop(tile, item)); } - private ItemStack modifyAmmo(TileEntityAmmoBox tile, ItemStack item) - { - if(tile != null && item != null) - { - if(tile.ammo != null) - { + private ItemStack modifyAmmo(TileEntityAmmoBox tile, ItemStack item) { + if (tile != null && item != null) { + if (tile.ammo != null) { NBTTagCompound nbt = new NBTTagCompound(); - if(!item.hasTagCompound()) - { + if (!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } tile.ammo.writeToNBT(nbt); - + MFLogUtil.logDebug("Added Drop: " + tile.ammo.getDisplayName() + " x" + tile.stock); item.getTagCompound().setTag(NBT_Ammo, nbt); item.getTagCompound().setInteger(NBT_Stock, tile.stock); @@ -177,12 +166,10 @@ private ItemStack modifyAmmo(TileEntityAmmoBox tile, ItemStack item) return item; } - private TileEntityAmmoBox getTile(World world, int x, int y, int z) - { + private TileEntityAmmoBox getTile(World world, int x, int y, int z) { TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityAmmoBox) - { - return (TileEntityAmmoBox)tile; + if (tile != null && tile instanceof TileEntityAmmoBox) { + return (TileEntityAmmoBox) tile; } return null; } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockBedMF.java b/src/main/java/minefantasy/mf2/block/decor/BlockBedMF.java index 49ec64ff..a1aeef23 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockBedMF.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockBedMF.java @@ -6,7 +6,6 @@ import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.mechanics.PlayerTickHandlerMF; import net.minecraft.block.Block; @@ -16,8 +15,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.ChunkCoordinates; @@ -27,358 +24,310 @@ import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; -public class BlockBedMF extends BlockDirectional -{ - public static final int[][] field_149981_a = new int[][] {{0, 1}, { -1, 0}, {0, -1}, {1, 0}}; - @SideOnly(Side.CLIENT) - private IIcon[] endTex; - @SideOnly(Side.CLIENT) - private IIcon[] sideTex; - @SideOnly(Side.CLIENT) - private IIcon[] topTex; - @SideOnly(Side.CLIENT) - private IIcon baseTex; - - private float height = 0.25F; - - public BlockBedMF(String name) - { - super(Material.cloth); - this.setBlockName(name); - GameRegistry.registerBlock(this, name+"_block"); - setBlockTextureName("minefantasy2:furnishings/"+name); - this.resetBounds(); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int meta, float fx, float fy, float fz) - { - if (world.isRemote) - { - return true; - } - else - { - int i1 = world.getBlockMetadata(x, y, z); - - if (!isBlockHeadOfBed(i1)) - { - int j1 = getDirection(i1); - x += field_149981_a[j1][0]; - z += field_149981_a[j1][1]; - - if (world.getBlock(x, y, z) != this) - { - return true; - } - - i1 = world.getBlockMetadata(x, y, z); - } - - if (world.provider.canRespawnHere() && world.getBiomeGenForCoords(x, z) != BiomeGenBase.hell) - { - if (func_149976_c(i1)) - { - EntityPlayer entityplayer1 = null; - Iterator iterator = world.playerEntities.iterator(); - - while (iterator.hasNext()) - { - EntityPlayer entityplayer2 = (EntityPlayer)iterator.next(); - - if (entityplayer2.isPlayerSleeping()) - { - ChunkCoordinates chunkcoordinates = entityplayer2.playerLocation; - - if (chunkcoordinates.posX == x && chunkcoordinates.posY == y && chunkcoordinates.posZ == z) - { - entityplayer1 = entityplayer2; - } - } - } - - if (entityplayer1 != null) - { - user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.occupied", new Object[0])); - return true; - } - - setState(world, x, y, z, false); - } - - EntityPlayer.EnumStatus enumstatus = user.sleepInBedAt(x, y, z); - - if (enumstatus == EntityPlayer.EnumStatus.OK) - { - setState(world, x, y, z, true); - PlayerTickHandlerMF.readyToResetBedPosition(user); - return true; - } - else - { - if (enumstatus == EntityPlayer.EnumStatus.NOT_POSSIBLE_NOW) - { - user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.noSleep", new Object[0])); - } - else if (enumstatus == EntityPlayer.EnumStatus.NOT_SAFE) - { - user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.notSafe", new Object[0])); - } - - return true; - } - } - else - { - double d2 = (double)x + 0.5D; - double d0 = (double)y + 0.5D; - double d1 = (double)z + 0.5D; - world.setBlockToAir(x, y, z); - int k1 = getDirection(i1); - x += field_149981_a[k1][0]; - z += field_149981_a[k1][1]; - - if (world.getBlock(x, y, z) == this) - { - world.setBlockToAir(x, y, z); - d2 = (d2 + (double)x + 0.5D) / 2.0D; - d0 = (d0 + (double)y + 0.5D) / 2.0D; - d1 = (d1 + (double)z + 0.5D) / 2.0D; - } - - world.newExplosion((Entity)null, (double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), 5.0F, true, true); - return true; - } - } - } - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) - { - if (side == 0) - { - return baseTex; - } - else - { - int k = getDirection(meta); - int l = Direction.bedDirection[k][side]; - int i1 = isBlockHeadOfBed(meta) ? 1 : 0; - return (i1 != 1 || l != 2) && (i1 != 0 || l != 3) ? (l != 5 && l != 4 ? this.topTex[i1] : this.sideTex[i1]) : this.endTex[i1]; - } - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister register) - { - this.topTex = new IIcon[] {register.registerIcon(this.getTextureName() + "_feet_top"), register.registerIcon(this.getTextureName() + "_head_top")}; - this.endTex = new IIcon[] {register.registerIcon(this.getTextureName() + "_feet_end"), register.registerIcon(this.getTextureName() + "_head_end")}; - this.sideTex = new IIcon[] {register.registerIcon(this.getTextureName() + "_feet_side"), register.registerIcon(this.getTextureName() + "_head_side")}; - this.baseTex = register.registerIcon(this.getTextureName() + "_base"); - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return 14; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) - { - this.resetBounds(); - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor Block - */ - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) - { - int l = world.getBlockMetadata(x, y, z); - int i1 = getDirection(l); - - if (isBlockHeadOfBed(l)) - { - if (world.getBlock(x - field_149981_a[i1][0], y, z - field_149981_a[i1][1]) != this) - { - world.setBlockToAir(x, y, z); - } - } - else if (world.getBlock(x + field_149981_a[i1][0], y, z + field_149981_a[i1][1]) != this) - { - world.setBlockToAir(x, y, z); - - if (!world.isRemote) - { - this.dropBlockAsItem(world, x, y, z, l, 0); - } - } - } - - @Override - public Item getItemDropped(int meta, Random rand, int fortune) - { - /** - * Returns whether or not this bed block is the head of the bed. - */ - return isBlockHeadOfBed(meta) ? Item.getItemById(0) : ToolListMF.bedroll; - } - - private void resetBounds() - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, height, 1.0F); - } - - /** - * Returns whether or not this bed block is the head of the bed. - */ - public static boolean isBlockHeadOfBed(int meta) - { - return (meta & 8) != 0; - } - - public static boolean func_149976_c(int meta) - { - return (meta & 4) != 0; - } - - public static void setState(World world, int x, int y, int z, boolean flag) - { - int l = world.getBlockMetadata(x, y, z); - - if (flag) - { - l |= 4; - } - else - { - l &= -5; - } - - world.setBlockMetadataWithNotify(x, y, z, l, 4); - } - - public static ChunkCoordinates findBedside(World world, int x, int y, int z, int counter) - { - int i1 = world.getBlockMetadata(x, y, z); - int j1 = BlockDirectional.getDirection(i1); - - for (int k1 = 0; k1 <= 1; ++k1) - { - int l1 = x - field_149981_a[j1][0] * k1 - 1; - int i2 = z - field_149981_a[j1][1] * k1 - 1; - int j2 = l1 + 2; - int k2 = i2 + 2; - - for (int l2 = l1; l2 <= j2; ++l2) - { - for (int i3 = i2; i3 <= k2; ++i3) - { - if (World.doesBlockHaveSolidTopSurface(world, l2, y - 1, i3) && !world.getBlock(l2, y, i3).getMaterial().isOpaque() && !world.getBlock(l2, y + 1, i3).getMaterial().isOpaque()) - { - if (counter <= 0) - { - return new ChunkCoordinates(l2, y, i3); - } - - --counter; - } - } - } - } - - return null; - } - - /** - * Drops the block items with a specified chance of dropping the specified items - */ - @Override - public void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float f, int i) - { - if (!isBlockHeadOfBed(meta)) - { - super.dropBlockAsItemWithChance(world, x, y, z, meta, f, 0); - } - } - - /** - * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility - * and stop pistons - */ - @Override - public int getMobilityFlag() - { - return 1; - } - - /** - * Gets an item for the block being called on. Args: world, x, y, z - */ - @SideOnly(Side.CLIENT) - @Override - public Item getItem(World world, int x, int y, int z) - { - return ToolListMF.bedroll; - } - - /** - * Called when the block is attempted to be harvested - */ - @Override - public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer user) - { - if (user.capabilities.isCreativeMode && isBlockHeadOfBed(meta)) - { - int i1 = getDirection(meta); - x -= field_149981_a[i1][0]; - z -= field_149981_a[i1][1]; - - if (world.getBlock(x, y, z) == this) - { - world.setBlockToAir(x, y, z); - } - } - } - @Override - public boolean isBed(IBlockAccess world, int x, int y, int z, EntityLivingBase player) - { - return true; - } +public class BlockBedMF extends BlockDirectional { + public static final int[][] field_149981_a = new int[][] { { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 } }; + @SideOnly(Side.CLIENT) + private IIcon[] endTex; + @SideOnly(Side.CLIENT) + private IIcon[] sideTex; + @SideOnly(Side.CLIENT) + private IIcon[] topTex; + @SideOnly(Side.CLIENT) + private IIcon baseTex; + + private float height = 0.25F; + + public BlockBedMF(String name) { + super(Material.cloth); + this.setBlockName(name); + GameRegistry.registerBlock(this, name + "_block"); + setBlockTextureName("minefantasy2:furnishings/" + name); + this.resetBounds(); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int meta, float fx, float fy, + float fz) { + if (world.isRemote) { + return true; + } else { + int i1 = world.getBlockMetadata(x, y, z); + + if (!isBlockHeadOfBed(i1)) { + int j1 = getDirection(i1); + x += field_149981_a[j1][0]; + z += field_149981_a[j1][1]; + + if (world.getBlock(x, y, z) != this) { + return true; + } + + i1 = world.getBlockMetadata(x, y, z); + } + + if (world.provider.canRespawnHere() && world.getBiomeGenForCoords(x, z) != BiomeGenBase.hell) { + if (func_149976_c(i1)) { + EntityPlayer entityplayer1 = null; + Iterator iterator = world.playerEntities.iterator(); + + while (iterator.hasNext()) { + EntityPlayer entityplayer2 = (EntityPlayer) iterator.next(); + + if (entityplayer2.isPlayerSleeping()) { + ChunkCoordinates chunkcoordinates = entityplayer2.playerLocation; + + if (chunkcoordinates.posX == x && chunkcoordinates.posY == y + && chunkcoordinates.posZ == z) { + entityplayer1 = entityplayer2; + } + } + } + + if (entityplayer1 != null) { + user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.occupied", new Object[0])); + return true; + } + + setState(world, x, y, z, false); + } + + EntityPlayer.EnumStatus enumstatus = user.sleepInBedAt(x, y, z); + + if (enumstatus == EntityPlayer.EnumStatus.OK) { + setState(world, x, y, z, true); + PlayerTickHandlerMF.readyToResetBedPosition(user); + return true; + } else { + if (enumstatus == EntityPlayer.EnumStatus.NOT_POSSIBLE_NOW) { + user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.noSleep", new Object[0])); + } else if (enumstatus == EntityPlayer.EnumStatus.NOT_SAFE) { + user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.notSafe", new Object[0])); + } + + return true; + } + } else { + double d2 = x + 0.5D; + double d0 = y + 0.5D; + double d1 = z + 0.5D; + world.setBlockToAir(x, y, z); + int k1 = getDirection(i1); + x += field_149981_a[k1][0]; + z += field_149981_a[k1][1]; + + if (world.getBlock(x, y, z) == this) { + world.setBlockToAir(x, y, z); + d2 = (d2 + x + 0.5D) / 2.0D; + d0 = (d0 + y + 0.5D) / 2.0D; + d1 = (d1 + z + 0.5D) / 2.0D; + } + + world.newExplosion((Entity) null, x + 0.5F, y + 0.5F, z + 0.5F, 5.0F, true, true); + return true; + } + } + } + + /** + * Gets the block's texture. Args: side, meta + */ + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + if (side == 0) { + return baseTex; + } else { + int k = getDirection(meta); + int l = Direction.bedDirection[k][side]; + int i1 = isBlockHeadOfBed(meta) ? 1 : 0; + return (i1 != 1 || l != 2) && (i1 != 0 || l != 3) ? (l != 5 && l != 4 ? this.topTex[i1] : this.sideTex[i1]) + : this.endTex[i1]; + } + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister register) { + this.topTex = new IIcon[] { register.registerIcon(this.getTextureName() + "_feet_top"), + register.registerIcon(this.getTextureName() + "_head_top") }; + this.endTex = new IIcon[] { register.registerIcon(this.getTextureName() + "_feet_end"), + register.registerIcon(this.getTextureName() + "_head_end") }; + this.sideTex = new IIcon[] { register.registerIcon(this.getTextureName() + "_feet_side"), + register.registerIcon(this.getTextureName() + "_head_side") }; + this.baseTex = register.registerIcon(this.getTextureName() + "_base"); + } + + /** + * The type of render function that is called for this block + */ + @Override + public int getRenderType() { + return 14; + } + + /** + * If this block doesn't render as an ordinary block it will return False + * (examples: signs, buttons, stairs, etc) + */ + @Override + public boolean renderAsNormalBlock() { + return false; + } + + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or + * not to render the shared face of two adjacent blocks and also whether the + * player can attach torches, redstone wire, etc to this block. + */ + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Updates the blocks bounds based on its current state. Args: world, x, y, z + */ + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.resetBounds(); + } + + /** + * Lets the block know when one of its neighbor changes. Doesn't know which + * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor + * Block + */ + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) { + int l = world.getBlockMetadata(x, y, z); + int i1 = getDirection(l); + + if (isBlockHeadOfBed(l)) { + if (world.getBlock(x - field_149981_a[i1][0], y, z - field_149981_a[i1][1]) != this) { + world.setBlockToAir(x, y, z); + } + } else if (world.getBlock(x + field_149981_a[i1][0], y, z + field_149981_a[i1][1]) != this) { + world.setBlockToAir(x, y, z); + + if (!world.isRemote) { + this.dropBlockAsItem(world, x, y, z, l, 0); + } + } + } + + @Override + public Item getItemDropped(int meta, Random rand, int fortune) { + /** + * Returns whether or not this bed block is the head of the bed. + */ + return isBlockHeadOfBed(meta) ? Item.getItemById(0) : ToolListMF.bedroll; + } + + private void resetBounds() { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, height, 1.0F); + } + + /** + * Returns whether or not this bed block is the head of the bed. + */ + public static boolean isBlockHeadOfBed(int meta) { + return (meta & 8) != 0; + } + + public static boolean func_149976_c(int meta) { + return (meta & 4) != 0; + } + + public static void setState(World world, int x, int y, int z, boolean flag) { + int l = world.getBlockMetadata(x, y, z); + + if (flag) { + l |= 4; + } else { + l &= -5; + } + + world.setBlockMetadataWithNotify(x, y, z, l, 4); + } + + public static ChunkCoordinates findBedside(World world, int x, int y, int z, int counter) { + int i1 = world.getBlockMetadata(x, y, z); + int j1 = BlockDirectional.getDirection(i1); + + for (int k1 = 0; k1 <= 1; ++k1) { + int l1 = x - field_149981_a[j1][0] * k1 - 1; + int i2 = z - field_149981_a[j1][1] * k1 - 1; + int j2 = l1 + 2; + int k2 = i2 + 2; + + for (int l2 = l1; l2 <= j2; ++l2) { + for (int i3 = i2; i3 <= k2; ++i3) { + if (World.doesBlockHaveSolidTopSurface(world, l2, y - 1, i3) + && !world.getBlock(l2, y, i3).getMaterial().isOpaque() + && !world.getBlock(l2, y + 1, i3).getMaterial().isOpaque()) { + if (counter <= 0) { + return new ChunkCoordinates(l2, y, i3); + } + + --counter; + } + } + } + } + + return null; + } + + /** + * Drops the block items with a specified chance of dropping the specified items + */ + @Override + public void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float f, int i) { + if (!isBlockHeadOfBed(meta)) { + super.dropBlockAsItemWithChance(world, x, y, z, meta, f, 0); + } + } + + /** + * Returns the mobility information of the block, 0 = free, 1 = can't push but + * can move over, 2 = total immobility and stop pistons + */ + @Override + public int getMobilityFlag() { + return 1; + } + + /** + * Gets an item for the block being called on. Args: world, x, y, z + */ + @SideOnly(Side.CLIENT) + @Override + public Item getItem(World world, int x, int y, int z) { + return ToolListMF.bedroll; + } + + /** + * Called when the block is attempted to be harvested + */ + @Override + public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer user) { + if (user.capabilities.isCreativeMode && isBlockHeadOfBed(meta)) { + int i1 = getDirection(meta); + x -= field_149981_a[i1][0]; + z -= field_149981_a[i1][1]; + + if (world.getBlock(x, y, z) == this) { + world.setBlockToAir(x, y, z); + } + } + } + + @Override + public boolean isBed(IBlockAccess world, int x, int y, int z, EntityLivingBase player) { + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockComponent.java b/src/main/java/minefantasy/mf2/block/decor/BlockComponent.java index 90aaafce..a30c4e54 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockComponent.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockComponent.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.decor; -import java.util.ArrayList; -import java.util.HashMap; import java.util.Random; import cpw.mods.fml.common.registry.GameRegistry; @@ -9,7 +7,6 @@ import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.tileentity.TileEntityComponent; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -29,107 +26,101 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockComponent extends BlockContainer -{ +public class BlockComponent extends BlockContainer { public static int component_RI = 118; - - public BlockComponent() - { + + public BlockComponent() { super(Material.circuits); GameRegistry.registerBlock(this, ItemBlockAmmoBox.class, "MF_ComponentStorage"); setBlockName(""); this.setHardness(1F); this.setResistance(1F); - this.setBlockBounds(1/16F, 0F, 1/16F, 15/16F, 12/16F, 15/16F); + this.setBlockBounds(1 / 16F, 0F, 1 / 16F, 15 / 16F, 12 / 16F, 15 / 16F); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; } - + @Override - public boolean isOpaqueCube() - { - return false; - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - @Override - public IIcon getIcon(int side, int meta) - { - return Blocks.iron_block.getIcon(side, 0); - } - @Override + public IIcon getIcon(int side, int meta) { + return Blocks.iron_block.getIcon(side, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - + public int getRenderType() { + return component_RI; } - @SideOnly(Side.CLIENT) - public int getRenderType() - { - return component_RI; - } - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int direction = MathHelper.floor_double((double)(user.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityComponent(); } + @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) - { + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { useBlock(world, x, y, z, user, true); } + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { useBlock(world, x, y, z, user, false); return true; - } - private void useBlock(World world, int x, int y, int z, EntityPlayer user, boolean leftClick) - { + } + + private void useBlock(World world, int x, int y, int z, EntityPlayer user, boolean leftClick) { ItemStack held = user.getHeldItem(); TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityComponent) - { - ((TileEntityComponent)tile).interact(user, held, leftClick); + if (tile != null && tile instanceof TileEntityComponent) { + ((TileEntityComponent) tile).interact(user, held, leftClick); } - } + } + @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) - { + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityComponent) - { - ((TileEntityComponent)tile).checkStack(); + if (tile != null && tile instanceof TileEntityComponent) { + ((TileEntityComponent) tile).checkStack(); } } + private Random rand = new Random(); - - private static TileEntityComponent getTile(World world, int x, int y, int z) - { + + private static TileEntityComponent getTile(World world, int x, int y, int z) { TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityComponent) - { - return (TileEntityComponent)tile; + if (tile != null && tile instanceof TileEntityComponent) { + return (TileEntityComponent) tile; } return null; } - - public static int placeComponent(EntityPlayer user, ItemStack item, World world, int x, int y, int z, String type, String tex, int dir) - { - if(world.isAirBlock(x, y, z) && canBuildOn(world, x, y-1, z)) - { + + public static int placeComponent(EntityPlayer user, ItemStack item, World world, int x, int y, int z, String type, + String tex, int dir) { + if (world.isAirBlock(x, y, z) && canBuildOn(world, x, y - 1, z)) { world.setBlock(x, y, z, BlockListMF.components, dir, 2); - + int max = getStorageSize(type); int size = user.isSneaking() ? Math.min(item.stackSize, max) : 1; - + TileEntityComponent tile = new TileEntityComponent(); ItemStack newitem = item.copy(); newitem.stackSize = 1; @@ -140,109 +131,99 @@ public static int placeComponent(EntityPlayer user, ItemStack item, World world, return 0; } - public static boolean canBuildOn(World world, int x, int y, int z) - { + public static boolean canBuildOn(World world, int x, int y, int z) { TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityComponent) - { - return ((TileEntityComponent)tile).isFull(); + if (tile != null && tile instanceof TileEntityComponent) { + return ((TileEntityComponent) tile).isFull(); } return world.isSideSolid(x, y, z, ForgeDirection.UP); } - public static int useComponent(ItemStack item, String type, String tex, World world, EntityPlayer user, MovingObjectPosition movingobjectposition) - { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (movingobjectposition.sideHit == 0) - { - --j; - } - - if (movingobjectposition.sideHit == 1) - { - ++j; - } - - if (movingobjectposition.sideHit == 2) - { - --k; - } - - if (movingobjectposition.sideHit == 3) - { - ++k; - } - - if (movingobjectposition.sideHit == 4) - { - --i; - } - - if (movingobjectposition.sideHit == 5) - { - ++i; - } - - if (user.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) - { - int l = MathHelper.floor_double((double)(user.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; - return placeComponent(user, item, user.worldObj, i, j, k, type, tex, l); - } - } + public static int useComponent(ItemStack item, String type, String tex, World world, EntityPlayer user, + MovingObjectPosition movingobjectposition) { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (movingobjectposition.sideHit == 0) { + --j; + } + + if (movingobjectposition.sideHit == 1) { + ++j; + } + + if (movingobjectposition.sideHit == 2) { + --k; + } + + if (movingobjectposition.sideHit == 3) { + ++k; + } + + if (movingobjectposition.sideHit == 4) { + --i; + } + + if (movingobjectposition.sideHit == 5) { + ++i; + } + + if (user.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + int l = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + return placeComponent(user, item, user.worldObj, i, j, k, type, tex, l); + } + } return 0; } - public static int getStorageSize(String id) - { - if(id == null)return 0; - - if(id.equalsIgnoreCase("bar")) return 64; - if(id.equalsIgnoreCase("plank")) return 64; - if(id.equalsIgnoreCase("pot")) return 64; - if(id.equalsIgnoreCase("jug")) return 32; - if(id.equalsIgnoreCase("sheet")) return 16; - if(id.equalsIgnoreCase("bigplate")) return 8; - + public static int getStorageSize(String id) { + if (id == null) + return 0; + + if (id.equalsIgnoreCase("bar")) + return 64; + if (id.equalsIgnoreCase("plank")) + return 64; + if (id.equalsIgnoreCase("pot")) + return 64; + if (id.equalsIgnoreCase("jug")) + return 32; + if (id.equalsIgnoreCase("sheet")) + return 16; + if (id.equalsIgnoreCase("bigplate")) + return 8; + return 0; } - + @Override - public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) - { + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) { TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityComponent) - { - if(((TileEntityComponent)tile).item != null) - { - ItemStack item = ((TileEntityComponent)tile).item.copy(); + if (tile != null && tile instanceof TileEntityComponent) { + if (((TileEntityComponent) tile).item != null) { + ItemStack item = ((TileEntityComponent) tile).item.copy(); item.stackSize = 1; return item; } } return null; - } + } + @Override - public Item getItemDropped(int meta, Random rand, int fortune) - { + public Item getItemDropped(int meta, Random rand, int fortune) { return null; - } + } + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { - TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityComponent) - { - TileEntityComponent component = (TileEntityComponent)tile; - - if(component.item != null) - { - while(component.stackSize > 0) - { + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityComponent) { + TileEntityComponent component = (TileEntityComponent) tile; + + if (component.item != null) { + while (component.stackSize > 0) { ItemStack drop = component.item.copy(); int count = Math.min(component.stackSize, drop.getMaxStackSize()); drop.stackSize = count; @@ -251,65 +232,58 @@ public void breakBlock(World world, int x, int y, int z, Block block, int meta) } } } - } - - private void dropItem(World world, int x, int y, int z, ItemStack itemstack) - { - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } } - - private AxisAlignedBB getBoundingBox(World world, int x, int y, int z) - { + + private void dropItem(World world, int x, int y, int z, ItemStack itemstack) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + private AxisAlignedBB getBoundingBox(World world, int x, int y, int z) { float height = 1.0F; TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityComponent) - { - height = ((TileEntityComponent)tile).getBlockHeight(); + if (tile != null && tile instanceof TileEntityComponent) { + height = ((TileEntityComponent) tile).getBlockHeight(); } return AxisAlignedBB.getBoundingBox(x + 0.0625D, y + 0D, z + 0.0625D, x + 0.9375D, y + height, z + 0.9375D); } + @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) - { + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { return getBoundingBox(world, x, y, z); - } - - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - @SideOnly(Side.CLIENT) - @Override - public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) - { - return getBoundingBox(world, x, y, z); - } + } + + /** + * Returns the bounding box of the wired rectangular prism to render. + */ + @SideOnly(Side.CLIENT) + @Override + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + return getBoundingBox(world, x, y, z); + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockPowRailMF.java b/src/main/java/minefantasy/mf2/block/decor/BlockPowRailMF.java index 8594a665..6447f0e5 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockPowRailMF.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockPowRailMF.java @@ -1,38 +1,36 @@ package minefantasy.mf2.block.decor; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.block.Block; import net.minecraft.block.BlockRailPowered; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -public class BlockPowRailMF extends BlockRailPowered -{ +public class BlockPowRailMF extends BlockRailPowered { private BaseMaterialMF baseMat; private boolean isPowered = true; - public BlockPowRailMF(BaseMaterialMF material) - { + + public BlockPowRailMF(BaseMaterialMF material) { this(material, material.name.toLowerCase()); - } - public BlockPowRailMF(BaseMaterialMF material, String type) - { - super(); - String name = type + "_rail"; + } + + public BlockPowRailMF(BaseMaterialMF material, String type) { + super(); + String name = type + "_rail"; GameRegistry.registerBlock(this, name); setBlockName(name); - this.setBlockTextureName("minefantasy2:mechanical/"+name); - + this.setBlockTextureName("minefantasy2:mechanical/" + name); + this.setHarvestLevel("pickaxe", material.harvestLevel); this.setStepSound(Block.soundTypeMetal); - this.setHardness(material.hardness+1 / 2F); - this.setResistance(material.hardness+1); + this.setHardness(material.hardness + 1 / 2F); + this.setResistance(material.hardness + 1); this.baseMat = material; - } - - @Override - public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) - { - return 0.8F; - } + } + + @Override + public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) { + return 0.8F; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockRack.java b/src/main/java/minefantasy/mf2/block/decor/BlockRack.java index e925258f..ee252144 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockRack.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockRack.java @@ -11,17 +11,12 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.api.helpers.BlockPositionHelper; import minefantasy.mf2.block.tileentity.decor.TileEntityRack; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.network.packet.RackCommand; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -32,316 +27,291 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; /** * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class BlockRack extends BlockWoodDecor -{ - - private Random rand = new Random(); - - private static final float thickness = 5F/16F; - public BlockRack(String name) - { - super(name); - - setHardness(1.0F); - setResistance(1.0F); - GameRegistry.registerBlock(this, ItemBlockToolRack.class, name); +public class BlockRack extends BlockWoodDecor { + + private Random rand = new Random(); + + private static final float thickness = 5F / 16F; + + public BlockRack(String name) { + super(name); + + setHardness(1.0F); + setResistance(1.0F); + GameRegistry.registerBlock(this, ItemBlockToolRack.class, name); setBlockName(name); this.setCreativeTab(CreativeTabMF.tabUtil); - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_) - { - this.setBlockBoundsBasedOnState(p_149668_1_, p_149668_2_, p_149668_3_, p_149668_4_); - return super.getCollisionBoundingBoxFromPool(p_149668_1_, p_149668_2_, p_149668_3_, p_149668_4_); - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_, int p_149719_4_) - { - this.modifyBoundingbox(p_149719_1_.getBlockMetadata(p_149719_2_, p_149719_3_, p_149719_4_)); - } - - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - @SideOnly(Side.CLIENT) - @Override - public AxisAlignedBB getSelectedBoundingBoxFromPool(World p_149633_1_, int p_149633_2_, int p_149633_3_, int p_149633_4_) - { - this.setBlockBoundsBasedOnState(p_149633_1_, p_149633_2_, p_149633_3_, p_149633_4_); - return super.getSelectedBoundingBoxFromPool(p_149633_1_, p_149633_2_, p_149633_3_, p_149633_4_); - } - - public void modifyBoundingbox(int meta) - { - float f = 0.25F; - - if (meta == 2) - { - this.setBlockBounds(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - } - - if (meta == 3) - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - } - - if (meta == 4) - { - this.setBlockBounds(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - if (meta == 5) - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - } - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() - { - return false; - } - public static int rack_RI = 115; - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return rack_RI; - } - - /** - * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z - */ - @Override - public boolean canPlaceBlockAt(World p_149742_1_, int p_149742_2_, int p_149742_3_, int p_149742_4_) - { - return p_149742_1_.isSideSolid(p_149742_2_ - 1, p_149742_3_, p_149742_4_, EAST ) || - p_149742_1_.isSideSolid(p_149742_2_ + 1, p_149742_3_, p_149742_4_, WEST ) || - p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_, p_149742_4_ - 1, SOUTH) || - p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_, p_149742_4_ + 1, NORTH); - } - - /** - * Called when a block is placed using its ItemBlock. Args: World, X, Y, Z, side, hitX, hitY, hitZ, block metadata - */ - /** - * Convert standard South, West, North, East to rack's (North, South, East, West) - */ - public static int getDirection(int dir) - { - int[] directions = new int[]{3, 4, 2, 5}; - return directions[Math.min(3, dir)]; - } - @Override - public int onBlockPlaced(World p_149660_1_, int p_149660_2_, int p_149660_3_, int p_149660_4_, int p_149660_5_, float p_149660_6_, float p_149660_7_, float p_149660_8_, int p_149660_9_) - { - int j1 = p_149660_9_; - - if ((p_149660_9_ == 0 || p_149660_5_ == 2) && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_, p_149660_4_ + 1, NORTH)) - { - j1 = 2; - } - - if ((j1 == 0 || p_149660_5_ == 3) && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_, p_149660_4_ - 1, SOUTH)) - { - j1 = 3; - } - - if ((j1 == 0 || p_149660_5_ == 4) && p_149660_1_.isSideSolid(p_149660_2_ + 1, p_149660_3_, p_149660_4_, WEST)) - { - j1 = 4; - } - - if ((j1 == 0 || p_149660_5_ == 5) && p_149660_1_.isSideSolid(p_149660_2_ - 1, p_149660_3_, p_149660_4_, EAST)) - { - j1 = 5; - } - - return j1; - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor Block - */ - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) - { - TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityRack) - { - ((TileEntityRack)tile).updateInventory(); - } - int l = world.getBlockMetadata(x, y, z); - boolean flag = false; - - if (l == 2 && world.isSideSolid(x, y, z + 1, NORTH)) - { - flag = true; - } - - if (l == 3 && world.isSideSolid(x, y, z - 1, SOUTH)) - { - flag = true; - } - - if (l == 4 && world.isSideSolid(x + 1, y, z, WEST)) - { - flag = true; - } - - if (l == 5 && world.isSideSolid(x - 1, y, z, EAST)) - { - flag = true; - } - - if (!flag) - { - this.dropBlockAsItem(world, x, y, z, l, 0); - world.setBlockToAir(x, y, z); - } - - super.onNeighborBlockChange(world, x, y, z, block); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random rand) - { - return 1; - } - - @Override - public IIcon getIcon(int side, int meta) - { - return Blocks.planks.getIcon(side, 0); - } - - @Override - public TileEntity createNewTileEntity(World world, int m) - { - return new TileEntityRack(); - } - - /** - * Called whenever the block is removed. - */ - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { - TileEntityRack tile = (TileEntityRack) world.getTileEntity(x, y, z); - - if (tile != null) - { - for (int var6 = 0; var6 < tile.getSizeInventory(); ++var6) { - ItemStack var7 = tile.getStackInSlot(var6); - - if (var7 != null) { - float var8 = this.rand.nextFloat() * 0.8F + 0.1F; - float var9 = this.rand.nextFloat() * 0.8F + 0.1F; - float var10 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (var7.stackSize > 0) { - int var11 = this.rand.nextInt(21) + 10; - - if (var11 > var7.stackSize) { - var11 = var7.stackSize; - } - - var7.stackSize -= var11; - EntityItem var12 = new EntityItem(world, (double) ((float) x + var8), (double) ((float) y + var9), (double) ((float) z + var10), new ItemStack(var7.getItem(), var11, var7.getItemDamage())); - - if (var7.hasTagCompound()) { - var12.getEntityItem().setTagCompound((NBTTagCompound) var7.getTagCompound().copy()); - } - - float var13 = 0.05F; - var12.motionX = (double) ((float) this.rand.nextGaussian() * var13); - var12.motionY = (double) ((float) this.rand.nextGaussian() * var13 + 0.2F); - var12.motionZ = (double) ((float) this.rand.nextGaussian() * var13); - world.spawnEntityInWorld(var12); - } - } - } - } - - super.breakBlock(world, x, y, z, block, meta); - } - - - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int i, float f, float f1, float f2) - { - TileEntityRack tile = (TileEntityRack)world.getTileEntity(x, y, z); - if(world.isRemote) - { + } + + /** + * Returns a bounding box from the pool of bounding boxes (this means this box + * can change after the pool has been cleared to be reused) + */ + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, + int p_149668_4_) { + this.setBlockBoundsBasedOnState(p_149668_1_, p_149668_2_, p_149668_3_, p_149668_4_); + return super.getCollisionBoundingBoxFromPool(p_149668_1_, p_149668_2_, p_149668_3_, p_149668_4_); + } + + /** + * Updates the blocks bounds based on its current state. Args: world, x, y, z + */ + @Override + public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_, + int p_149719_4_) { + this.modifyBoundingbox(p_149719_1_.getBlockMetadata(p_149719_2_, p_149719_3_, p_149719_4_)); + } + + /** + * Returns the bounding box of the wired rectangular prism to render. + */ + @SideOnly(Side.CLIENT) + @Override + public AxisAlignedBB getSelectedBoundingBoxFromPool(World p_149633_1_, int p_149633_2_, int p_149633_3_, + int p_149633_4_) { + this.setBlockBoundsBasedOnState(p_149633_1_, p_149633_2_, p_149633_3_, p_149633_4_); + return super.getSelectedBoundingBoxFromPool(p_149633_1_, p_149633_2_, p_149633_3_, p_149633_4_); + } + + public void modifyBoundingbox(int meta) { + float f = 0.25F; + + if (meta == 2) { + this.setBlockBounds(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); + } + + if (meta == 3) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); + } + + if (meta == 4) { + this.setBlockBounds(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + if (meta == 5) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); + } + } + + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or + * not to render the shared face of two adjacent blocks and also whether the + * player can attach torches, redstone wire, etc to this block. + */ + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * If this block doesn't render as an ordinary block it will return False + * (examples: signs, buttons, stairs, etc) + */ + @Override + public boolean renderAsNormalBlock() { + return false; + } + + public static int rack_RI = 115; + + /** + * The type of render function that is called for this block + */ + @Override + public int getRenderType() { + return rack_RI; + } + + /** + * Checks to see if its valid to put this block at the specified coordinates. + * Args: world, x, y, z + */ + @Override + public boolean canPlaceBlockAt(World p_149742_1_, int p_149742_2_, int p_149742_3_, int p_149742_4_) { + return p_149742_1_.isSideSolid(p_149742_2_ - 1, p_149742_3_, p_149742_4_, EAST) + || p_149742_1_.isSideSolid(p_149742_2_ + 1, p_149742_3_, p_149742_4_, WEST) + || p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_, p_149742_4_ - 1, SOUTH) + || p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_, p_149742_4_ + 1, NORTH); + } + + /** + * Called when a block is placed using its ItemBlock. Args: World, X, Y, Z, + * side, hitX, hitY, hitZ, block metadata + */ + /** + * Convert standard South, West, North, East to rack's (North, South, East, + * West) + */ + public static int getDirection(int dir) { + int[] directions = new int[] { 3, 4, 2, 5 }; + return directions[Math.min(3, dir)]; + } + + @Override + public int onBlockPlaced(World p_149660_1_, int p_149660_2_, int p_149660_3_, int p_149660_4_, int p_149660_5_, + float p_149660_6_, float p_149660_7_, float p_149660_8_, int p_149660_9_) { + int j1 = p_149660_9_; + + if ((p_149660_9_ == 0 || p_149660_5_ == 2) + && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_, p_149660_4_ + 1, NORTH)) { + j1 = 2; + } + + if ((j1 == 0 || p_149660_5_ == 3) + && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_, p_149660_4_ - 1, SOUTH)) { + j1 = 3; + } + + if ((j1 == 0 || p_149660_5_ == 4) && p_149660_1_.isSideSolid(p_149660_2_ + 1, p_149660_3_, p_149660_4_, WEST)) { + j1 = 4; + } + + if ((j1 == 0 || p_149660_5_ == 5) && p_149660_1_.isSideSolid(p_149660_2_ - 1, p_149660_3_, p_149660_4_, EAST)) { + j1 = 5; + } + + return j1; + } + + /** + * Lets the block know when one of its neighbor changes. Doesn't know which + * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor + * Block + */ + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityRack) { + ((TileEntityRack) tile).updateInventory(); + } + int l = world.getBlockMetadata(x, y, z); + boolean flag = false; + + if (l == 2 && world.isSideSolid(x, y, z + 1, NORTH)) { + flag = true; + } + + if (l == 3 && world.isSideSolid(x, y, z - 1, SOUTH)) { + flag = true; + } + + if (l == 4 && world.isSideSolid(x + 1, y, z, WEST)) { + flag = true; + } + + if (l == 5 && world.isSideSolid(x - 1, y, z, EAST)) { + flag = true; + } + + if (!flag) { + this.dropBlockAsItem(world, x, y, z, l, 0); + world.setBlockToAir(x, y, z); + } + + super.onNeighborBlockChange(world, x, y, z, block); + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random rand) { + return 1; + } + + @Override + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); + } + + @Override + public TileEntity createNewTileEntity(World world, int m) { + return new TileEntityRack(); + } + + /** + * Called whenever the block is removed. + */ + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityRack tile = (TileEntityRack) world.getTileEntity(x, y, z); + + if (tile != null) { + for (int var6 = 0; var6 < tile.getSizeInventory(); ++var6) { + ItemStack var7 = tile.getStackInSlot(var6); + + if (var7 != null) { + float var8 = this.rand.nextFloat() * 0.8F + 0.1F; + float var9 = this.rand.nextFloat() * 0.8F + 0.1F; + float var10 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (var7.stackSize > 0) { + int var11 = this.rand.nextInt(21) + 10; + + if (var11 > var7.stackSize) { + var11 = var7.stackSize; + } + + var7.stackSize -= var11; + EntityItem var12 = new EntityItem(world, x + var8, y + var9, z + var10, + new ItemStack(var7.getItem(), var11, var7.getItemDamage())); + + if (var7.hasTagCompound()) { + var12.getEntityItem().setTagCompound((NBTTagCompound) var7.getTagCompound().copy()); + } + + float var13 = 0.05F; + var12.motionX = (float) this.rand.nextGaussian() * var13; + var12.motionY = (float) this.rand.nextGaussian() * var13 + 0.2F; + var12.motionZ = (float) this.rand.nextGaussian() * var13; + world.spawnEntityInWorld(var12); + } + } + } + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int i, float f, float f1, + float f2) { + TileEntityRack tile = (TileEntityRack) world.getTileEntity(x, y, z); + if (world.isRemote) { int slot = tile.getSlotFor(f, f2); - if(slot >= 0 && slot < 4) - { - ((EntityClientPlayerMP)user).sendQueue.addToSendQueue(new RackCommand(slot, user, tile).generatePacket()); + if (slot >= 0 && slot < 4) { + ((EntityClientPlayerMP) user).sendQueue + .addToSendQueue(new RackCommand(slot, user, tile).generatePacket()); } - } - - return true; - } + } + + return true; + } @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg){} - - - public static boolean interact(int slot, World world, TileEntityRack tile, EntityPlayer player) - { - if(player.isSneaking()) - { - player.openGui(MineFantasyII.instance, 0, world, tile.xCoord, tile.yCoord, tile.zCoord); - return false; - } - - ItemStack held = player.getHeldItem(); - if(held == null) - { + public void registerIcons(IIconRegister reg) { + } + + public static boolean interact(int slot, World world, TileEntityRack tile, EntityPlayer player) { + if (player.isSneaking()) { + player.openGui(MineFantasyII.instance, 0, world, tile.xCoord, tile.yCoord, tile.zCoord); + return false; + } + + ItemStack held = player.getHeldItem(); + if (held == null) { ItemStack hung = tile.getStackInSlot(slot); - if(hung != null) - { - if(!world.isRemote) - { + if (hung != null) { + if (!world.isRemote) { player.setCurrentItemOrArmor(0, hung); tile.setInventorySlotContents(slot, null); tile.syncItems(); @@ -349,42 +319,30 @@ public static boolean interact(int slot, World world, TileEntityRack tile, Entit player.swingItem(); return true; } - } - else - { - ItemStack hung = tile.getStackInSlot(slot); - - if(hung == null && tile.canHang(player.getHeldItem(), slot)) - { - if(!world.isRemote) - { + } else { + ItemStack hung = tile.getStackInSlot(slot); + + if (hung == null && tile.canHang(player.getHeldItem(), slot)) { + if (!world.isRemote) { tile.setInventorySlotContents(slot, player.getHeldItem().copy()); player.setCurrentItemOrArmor(0, null); tile.syncItems(); } player.swingItem(); return true; - } - else if(held != null && hung != null) - { - if(hung.isItemEqual(held)) - { + } else if (held != null && hung != null) { + if (hung.isItemEqual(held)) { int space = hung.getMaxStackSize() - hung.stackSize; - - if(held.stackSize > space) - { - if(!world.isRemote) - { + + if (held.stackSize > space) { + if (!world.isRemote) { held.stackSize -= space; hung.stackSize += space; } player.swingItem(); return true; - } - else - { - if(!world.isRemote) - { + } else { + if (!world.isRemote) { hung.stackSize += held.stackSize; player.setCurrentItemOrArmor(0, null); } @@ -393,13 +351,13 @@ else if(held != null && hung != null) } } } - } - player.openGui(MineFantasyII.instance, 0, world, tile.xCoord, tile.yCoord, tile.zCoord); + } + player.openGui(MineFantasyII.instance, 0, world, tile.xCoord, tile.yCoord, tile.zCoord); return false; } - @SideOnly(Side.CLIENT) + + @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister reg) - { - } + public void registerBlockIcons(IIconRegister reg) { + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockRailMF.java b/src/main/java/minefantasy/mf2/block/decor/BlockRailMF.java index d92f452e..337e5ae1 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockRailMF.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockRailMF.java @@ -1,43 +1,36 @@ package minefantasy.mf2.block.decor; import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.block.Block; import net.minecraft.block.BlockRail; -import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityMinecart; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class BlockRailMF extends BlockRail -{ +public class BlockRailMF extends BlockRail { private BaseMaterialMF baseMat; private boolean isPowered = true; - public BlockRailMF(BaseMaterialMF material) - { + + public BlockRailMF(BaseMaterialMF material) { this(material, material.name.toLowerCase()); - } - public BlockRailMF(BaseMaterialMF material, String type) - { - super(); - String name = type + "_rail"; + } + + public BlockRailMF(BaseMaterialMF material, String type) { + super(); + String name = type + "_rail"; GameRegistry.registerBlock(this, name); setBlockName(name); - this.setBlockTextureName("minefantasy2:mechanical/"+name); - + this.setBlockTextureName("minefantasy2:mechanical/" + name); + this.setHarvestLevel("pickaxe", material.harvestLevel); this.setStepSound(Block.soundTypeMetal); - this.setHardness(material.hardness+1 / 2F); - this.setResistance(material.hardness+1); + this.setHardness(material.hardness + 1 / 2F); + this.setResistance(material.hardness + 1); this.baseMat = material; - } - - @Override - public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) - { - return 0.8F; - } + } + + @Override + public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) { + return 0.8F; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockRoad.java b/src/main/java/minefantasy/mf2/block/decor/BlockRoad.java index ef65419a..40eaf90e 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockRoad.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockRoad.java @@ -8,7 +8,6 @@ import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.tileentity.TileEntityRoad; import minefantasy.mf2.item.tool.advanced.ItemMattock; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -26,189 +25,161 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockRoad extends BlockContainer -{ - public BlockRoad(String name, float f) - { - super(Material.ground); - this.setStepSound(Block.soundTypeGravel); - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, f/16F, 1.0F); - this.setLightOpacity(0); - GameRegistry.registerBlock(this, name); +public class BlockRoad extends BlockContainer { + public BlockRoad(String name, float f) { + super(Material.ground); + this.setStepSound(Block.soundTypeGravel); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, f / 16F, 1.0F); + this.setLightOpacity(0); + GameRegistry.registerBlock(this, name); setBlockName(name); setHardness(0.5F); - } - - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) - { - if(this == BlockListMF.lowroad) - return AxisAlignedBB.getBoundingBox((double)(x + 0), (double)(y + 0), (double)(z + 0), (double)(x + 1), (double)(y + 0.5), (double)(z + 1)); - - return AxisAlignedBB.getBoundingBox((double)(x + 0), (double)(y + 0), (double)(z + 0), (double)(x + 1), (double)(y + 1), (double)(z + 1)); - } - - @Override - public IIcon getIcon(int side, int meta) - { - return meta == 1 ? Blocks.sand.getIcon(side, 0) : Blocks.dirt.getIcon(side, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) - { - TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityRoad) - { - if(((TileEntityRoad)tile).surface[0] > 0) - { - Block surface = ((TileEntityRoad)tile).getBaseBlock(); - int surface_m = ((TileEntityRoad)tile).surface[1]; - return surface.getIcon(side, surface_m); - } - } - return this.getIcon(side, world.getBlockMetadata(x, y, z)); - } + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + if (this == BlockListMF.lowroad) + return AxisAlignedBB.getBoundingBox(x + 0, y + 0, z + 0, x + 1, y + 0.5, z + 1); + + return AxisAlignedBB.getBoundingBox(x + 0, y + 0, z + 0, x + 1, y + 1, z + 1); + } + + @Override + public IIcon getIcon(int side, int meta) { + return meta == 1 ? Blocks.sand.getIcon(side, 0) : Blocks.dirt.getIcon(side, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityRoad) { + if (((TileEntityRoad) tile).surface[0] > 0) { + Block surface = ((TileEntityRoad) tile).getBaseBlock(); + int surface_m = ((TileEntityRoad) tile).surface[1]; + return surface.getIcon(side, surface_m); + } + } + return this.getIcon(side, world.getBlockMetadata(x, y, z)); + } - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - public boolean isOpaqueCube() - { - return false; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public void onBlockAdded(World world, int x, int y, int z) - { - this.updateTick(world, x, y, z, new Random()); - super.onBlockAdded(world, x, y, z); - } - - @Override - public void updateTick(World world, int x, int y, int z, Random random) - { - if(world.getBlock(x, y-1, z) == Blocks.grass) - { - world.setBlock(x, y-1, z, Blocks.dirt, 0, 2); - } - super.updateTick(world, x, y, z, random); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, float f2) - { - TileEntityRoad tile = getTile(world, x, y, z); - if(tile == null)return false; - - boolean isLocked = tile.isLocked; - ItemStack itemstack = player.getHeldItem(); - if(itemstack != null) - { - if(!player.canPlayerEdit(x, y, z, i, itemstack)) - { - return false; - } - if(!isLocked) - { - Block block = Block.getBlockFromItem(itemstack.getItem()); - if(itemstack.getItem() instanceof ItemBlock && block != null) - { - if(upgradeRoad(world, x, y, z, 4, itemstack, block)) - { - if(!player.capabilities.isCreativeMode && !world.isRemote) - { - itemstack.stackSize --; - if(itemstack.stackSize <= 0) - { - player.setCurrentItemOrArmor(0, null); - } - } - return true; - } - } - - if(itemstack.getItem() instanceof ItemSpade) - { - if(this == BlockListMF.road) - { - if(!world.isRemote) - { - int m = world.getBlockMetadata(x, y, z); - world.setBlock(x, y, z, BlockListMF.lowroad, m, 2); - } - return true; - } - } - } - if(!world.isRemote && itemstack.getItem() instanceof ItemMattock) - { - toggleLocks(world, x, y, z, 4); - } - } - return !tile.isLocked; - } + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or + * not to render the shared face of two adjacent blocks and also whether the + * player can attach torches, redstone wire, etc to this block. + */ + public boolean isOpaqueCube() { + return false; + } + + /** + * If this block doesn't render as an ordinary block it will return False + * (examples: signs, buttons, stairs, etc) + */ + public boolean renderAsNormalBlock() { + return false; + } - private TileEntityRoad getTile(World world, int x, int y, int z) - { - TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityRoad) - { - return (TileEntityRoad)tile; - } - return null; + @Override + public void onBlockAdded(World world, int x, int y, int z) { + this.updateTick(world, x, y, z, new Random()); + super.onBlockAdded(world, x, y, z); } @Override - public Item getItemDropped(int meta, Random rand, int fortune) - { - Block drop = meta == 1 ? Blocks.sand : Blocks.dirt; - return Item.getItemFromBlock(drop); - } - /** - * Resets the Texture - * @param ID the block right clicked with - * @return - */ - private boolean upgradeRoad(World world, int x, int y, int z, int r, ItemStack held, Block block) - { - if(!block.isNormalCube()) - { - return false; - } - if(held == null) - { - return false; - } - boolean flag = false; - - for(int x2 = -r; x2 <= r; x2 ++) - { - for(int y2 = -r; y2 <= r; y2 ++) - { - for(int z2 = -r; z2 <= r; z2 ++) - { - Block id = world.getBlock(x+x2, y+y2, z+z2); - int m = world.getBlockMetadata(x+x2, y+y2, z+z2); - if((id == BlockListMF.road || id == BlockListMF.lowroad)) - { - if(getDistance(x+x2, y+y2, z+z2, x, y, z) < r) - { + public void updateTick(World world, int x, int y, int z, Random random) { + if (world.getBlock(x, y - 1, z) == Blocks.grass) { + world.setBlock(x, y - 1, z, Blocks.dirt, 0, 2); + } + super.updateTick(world, x, y, z, random); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + TileEntityRoad tile = getTile(world, x, y, z); + if (tile == null) + return false; + + boolean isLocked = tile.isLocked; + ItemStack itemstack = player.getHeldItem(); + if (itemstack != null) { + if (!player.canPlayerEdit(x, y, z, i, itemstack)) { + return false; + } + if (!isLocked) { + Block block = Block.getBlockFromItem(itemstack.getItem()); + if (itemstack.getItem() instanceof ItemBlock && block != null) { + if (upgradeRoad(world, x, y, z, 4, itemstack, block)) { + if (!player.capabilities.isCreativeMode && !world.isRemote) { + itemstack.stackSize--; + if (itemstack.stackSize <= 0) { + player.setCurrentItemOrArmor(0, null); + } + } + return true; + } + } + + if (itemstack.getItem() instanceof ItemSpade) { + if (this == BlockListMF.road) { + if (!world.isRemote) { + int m = world.getBlockMetadata(x, y, z); + world.setBlock(x, y, z, BlockListMF.lowroad, m, 2); + } + return true; + } + } + } + if (!world.isRemote && itemstack.getItem() instanceof ItemMattock) { + toggleLocks(world, x, y, z, 4); + } + } + return !tile.isLocked; + } + + private TileEntityRoad getTile(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityRoad) { + return (TileEntityRoad) tile; + } + return null; + } + + @Override + public Item getItemDropped(int meta, Random rand, int fortune) { + Block drop = meta == 1 ? Blocks.sand : Blocks.dirt; + return Item.getItemFromBlock(drop); + } + + /** + * Resets the Texture + * + * @param ID + * the block right clicked with + * @return + */ + private boolean upgradeRoad(World world, int x, int y, int z, int r, ItemStack held, Block block) { + if (!block.isNormalCube()) { + return false; + } + if (held == null) { + return false; + } + boolean flag = false; + + for (int x2 = -r; x2 <= r; x2++) { + for (int y2 = -r; y2 <= r; y2++) { + for (int z2 = -r; z2 <= r; z2++) { + Block id = world.getBlock(x + x2, y + y2, z + z2); + int m = world.getBlockMetadata(x + x2, y + y2, z + z2); + if ((id == BlockListMF.road || id == BlockListMF.lowroad)) { + if (getDistance(x + x2, y + y2, z + z2, x, y, z) < r) { { - TileEntity tile = world.getTileEntity(x+x2, y+y2, z+z2); - if(tile != null && tile instanceof TileEntityRoad && !((TileEntityRoad)tile).isLocked) - { + TileEntity tile = world.getTileEntity(x + x2, y + y2, z + z2); + if (tile != null && tile instanceof TileEntityRoad + && !((TileEntityRoad) tile).isLocked) { flag = true; - ((TileEntityRoad)tile).setSurface(block, held.getItemDamage()); + ((TileEntityRoad) tile).setSurface(block, held.getItemDamage()); } } } @@ -218,29 +189,23 @@ private boolean upgradeRoad(World world, int x, int y, int z, int r, ItemStack h } return flag; } - private boolean toggleLocks(World world, int x, int y, int z, int r) - { - boolean flag = false; - TileEntityRoad tile = getTile(world, x, y, z); - if(tile == null) - { - return false; - } + + private boolean toggleLocks(World world, int x, int y, int z, int r) { + boolean flag = false; + TileEntityRoad tile = getTile(world, x, y, z); + if (tile == null) { + return false; + } flag = !tile.isLocked; tile.isLocked = flag; tile.sendPacketToClients(); - - for(int x2 = -r; x2 <= r; x2 ++) - { - for(int y2 = -r; y2 <= r; y2 ++) - { - for(int z2 = -r; z2 <= r; z2 ++) - { - if(getDistance(x+x2, y+y2, z+z2, x, y, z) < r) - { - TileEntityRoad tile2 = getTile(world, x+x2, y+y2, z+z2); - if(tile2 != null) - { + + for (int x2 = -r; x2 <= r; x2++) { + for (int y2 = -r; y2 <= r; y2++) { + for (int z2 = -r; z2 <= r; z2++) { + if (getDistance(x + x2, y + y2, z + z2, x, y, z) < r) { + TileEntityRoad tile2 = getTile(world, x + x2, y + y2, z + z2); + if (tile2 != null) { tile2.isLocked = flag; tile2.sendPacketToClients(); } @@ -248,25 +213,23 @@ private boolean toggleLocks(World world, int x, int y, int z, int r) } } } - return true; + return true; } - public double getDistance(double x, double y, double z, int posX, int posY, int posZ) - { - double var7 = posX - x; - double var9 = posY - y; - double var11 = posZ - z; - return (double)MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); - } + public double getDistance(double x, double y, double z, int posX, int posY, int posZ) { + double var7 = posX - x; + double var9 = posY - y; + double var11 = posZ - z; + return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); + } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityRoad(); } + @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister reg) - { - } + public void registerBlockIcons(IIconRegister reg) { + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockSchematic.java b/src/main/java/minefantasy/mf2/block/decor/BlockSchematic.java index a0cbd49d..2a4ce7a7 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockSchematic.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockSchematic.java @@ -8,7 +8,6 @@ import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.item.list.CreativeTabMF; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -17,131 +16,115 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockSchematic extends Block -{ +public class BlockSchematic extends Block { public IIcon[] icons = new IIcon[6]; - public BlockSchematic(String name) - { + + public BlockSchematic(String name) { super(Material.cloth); - + GameRegistry.registerBlock(this, name); setBlockName(name); - setBlockTextureName("minefantasy2:meta/"+name); + setBlockTextureName("minefantasy2:meta/" + name); setBlockBounds(0F, 0F, 0F, 1F, 0F, 1F); } + @Override @SideOnly(Side.CLIENT) - public void getSubBlocks(Item item, CreativeTabs tab, List list) - { - } + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + } + @Override @SideOnly(Side.CLIENT) - public boolean isOpaqueCube() - { + public boolean isOpaqueCube() { return false; } + @Override - public boolean renderAsNormalBlock() - { + public boolean renderAsNormalBlock() { return false; } - + @Override - public Item getItemDropped(int meta, Random rand, int i) - { + public Item getItemDropped(int meta, Random rand, int i) { return ComponentListMF.artefacts; - } + } + @Override - public int damageDropped(int meta) - { + public int damageDropped(int meta) { return meta + 4; } - + @Override - public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) - { + public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) { return false; - } - + } + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - return icons[Math.min(meta, icons.length-1)]; - } - + public IIcon getIcon(int side, int meta) { + return icons[Math.min(meta, icons.length - 1)]; + } + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - for(int i = 0; i < icons.length; i ++) - { - this.icons[i] = reg.registerIcon("minefantasy2:meta/schematic_"+(i+1)); + public void registerBlockIcons(IIconRegister reg) { + for (int i = 0; i < icons.length; i++) { + this.icons[i] = reg.registerIcon("minefantasy2:meta/schematic_" + (i + 1)); + } + } + + public static boolean useSchematic(ItemStack item, World world, EntityPlayer user, + MovingObjectPosition movingobjectposition) { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (movingobjectposition.sideHit == 0) { + --j; + } + + if (movingobjectposition.sideHit == 1) { + ++j; + } + + if (movingobjectposition.sideHit == 2) { + --k; + } + + if (movingobjectposition.sideHit == 3) { + ++k; + } + + if (movingobjectposition.sideHit == 4) { + --i; + } + + if (movingobjectposition.sideHit == 5) { + ++i; + } + + if (user.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return placeSchematic(item.getItemDamage(), user, item, user.worldObj, i, j, k); + } } - } - - public static boolean useSchematic(ItemStack item, World world, EntityPlayer user, MovingObjectPosition movingobjectposition) - { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (movingobjectposition.sideHit == 0) - { - --j; - } - - if (movingobjectposition.sideHit == 1) - { - ++j; - } - - if (movingobjectposition.sideHit == 2) - { - --k; - } - - if (movingobjectposition.sideHit == 3) - { - ++k; - } - - if (movingobjectposition.sideHit == 4) - { - --i; - } - - if (movingobjectposition.sideHit == 5) - { - ++i; - } - - if (user.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) - { - return placeSchematic(item.getItemDamage(), user, item, user.worldObj, i, j, k); - } - } return false; } - public static boolean placeSchematic(int meta, EntityPlayer user, ItemStack item, World world, int x, int y, int z) - { - if(world.isAirBlock(x, y, z) && canBuildOn(world, x, y-1, z)) - { - world.setBlock(x, y, z, BlockListMF.schematic_general, Math.max(0, meta-4), 2); + + public static boolean placeSchematic(int meta, EntityPlayer user, ItemStack item, World world, int x, int y, + int z) { + if (world.isAirBlock(x, y, z) && canBuildOn(world, x, y - 1, z)) { + world.setBlock(x, y, z, BlockListMF.schematic_general, Math.max(0, meta - 4), 2); return true; } return false; } - public static boolean canBuildOn(World world, int x, int y, int z) - { + public static boolean canBuildOn(World world, int x, int y, int z) { return world.isSideSolid(x, y, z, ForgeDirection.UP); } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java b/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java index ee15cdfe..18ddca18 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java @@ -16,111 +16,104 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class BlockTrough extends BlockWoodDecor -{ +public class BlockTrough extends BlockWoodDecor { public static int trough_RI = 107; - public BlockTrough(String name) - { + + public BlockTrough(String name) { super(name); - this.setBlockBounds(0F, 0F, 0F, 1.0F, (7F/16F), 1.0F); - + this.setBlockBounds(0F, 0F, 0F, 1.0F, (7F / 16F), 1.0F); + GameRegistry.registerBlock(this, ItemBlockTrough.class, name); setBlockName(name); this.setHardness(1F); this.setResistance(0.5F); - this.setCreativeTab(CreativeTabMF.tabUtil); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } + + @Override + public boolean renderAsNormalBlock() { + return false; } - + @Override - public boolean isOpaqueCube() - { - return false; - } + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); + } + @Override @SideOnly(Side.CLIENT) - public int getRenderBlockPass() - { - return 1; - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - @Override - public IIcon getIcon(int side, int meta) - { - return Blocks.planks.getIcon(side, 0); - } - @Override + public void registerBlockIcons(IIconRegister reg) { + + } + @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - + public int getRenderType() { + return trough_RI; + } + + public static final String NBT_fill = "Fill_Level"; + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + + TileEntityTrough tile = getTile(world, x, y, z); + if (tile != null) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_fill)) { + tile.fill = item.getTagCompound().getInteger(NBT_fill); + } + } + super.onBlockPlacedBy(world, x, y, z, user, item); } - @SideOnly(Side.CLIENT) - public int getRenderType() - { - return trough_RI; - } - public static final String NBT_fill = "Fill_Level"; - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - int direction = MathHelper.floor_double((double)(user.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - - TileEntityTrough tile = getTile(world, x, y, z); - if(tile != null) - { - if(item.hasTagCompound() && item.getTagCompound().hasKey(NBT_fill)) - { - tile.fill = item.getTagCompound().getInteger(NBT_fill); - } - } - super.onBlockPlacedBy(world, x, y, z, user, item); - } + @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityTrough(); } + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { ItemStack held = user.getHeldItem(); TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityTrough) - { - if( ((TileEntityTrough)tile).interact(user, held)) - { - world.playSoundEffect(x+0.5D, y+0.5D, z+0.5D, "random.splash", 0.125F + user.getRNG().nextFloat()/4F, 0.5F + user.getRNG().nextFloat()); - ((TileEntityTrough)tile).syncData(); + if (tile != null && tile instanceof TileEntityTrough) { + if (((TileEntityTrough) tile).interact(user, held)) { + world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.splash", + 0.125F + user.getRNG().nextFloat() / 4F, 0.5F + user.getRNG().nextFloat()); + ((TileEntityTrough) tile).syncData(); return true; } } return false; - } - private TileEntityTrough getTile(World world, int x, int y, int z) - { + } + + private TileEntityTrough getTile(World world, int x, int y, int z) { TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityTrough) - { - return (TileEntityTrough)tile; + if (tile != null && tile instanceof TileEntityTrough) { + return (TileEntityTrough) tile; } return null; } - + @Override - protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) - { - return modifyFill((TileEntityTrough)tile, super.modifyDrop(tile, item)); + protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { + return modifyFill((TileEntityTrough) tile, super.modifyDrop(tile, item)); } - private ItemStack modifyFill(TileEntityTrough tile, ItemStack item) - { - if(tile != null && item != null) - { + private ItemStack modifyFill(TileEntityTrough tile, ItemStack item) { + if (tile != null && item != null) { item.getTagCompound().setInteger(NBT_fill, tile.fill); } return item; diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java b/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java index 5de876e4..8c35facc 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java @@ -15,110 +15,97 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public abstract class BlockWoodDecor extends BlockContainer -{ +public abstract class BlockWoodDecor extends BlockContainer { private String texname; - public BlockWoodDecor(String tex) - { + + public BlockWoodDecor(String tex) { super(Material.wood); this.texname = tex; } @Override public abstract TileEntity createNewTileEntity(World world, int meta); - + @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { - TileEntityWoodDecor tile = getTile(world, x, y, z); - if(tile != null) - { + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + TileEntityWoodDecor tile = getTile(world, x, y, z); + if (tile != null) { onPlaceTile(tile, world, x, y, z, user, item); - } - } + } + } - protected void onPlaceTile(TileEntityWoodDecor tile, World world, int x, int y, int z, EntityLivingBase user, ItemStack item) - { + protected void onPlaceTile(TileEntityWoodDecor tile, World world, int x, int y, int z, EntityLivingBase user, + ItemStack item) { CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if(material != null) - { - tile.setMaterial(material); - } + if (material != null) { + tile.setMaterial(material); + } } - private TileEntityWoodDecor getTile(World world, int x, int y, int z) - { + private TileEntityWoodDecor getTile(World world, int x, int y, int z) { TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityWoodDecor) - { - return (TileEntityWoodDecor)tile; + if (tile != null && tile instanceof TileEntityWoodDecor) { + return (TileEntityWoodDecor) tile; } return null; } - + @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) - { - ArrayList ret = new ArrayList(); - return ret; - } - - protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) - { - if(tile != null && item != null) - { + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList ret = new ArrayList(); + return ret; + } + + protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { + if (tile != null && item != null) { CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, tile.getMaterialName()); } return item; } - + private Random rand = new Random(); + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityWoodDecor tile = getTile(world, x, y, z); - + ItemStack itemstack = new ItemStack(getItemDropped(meta, world.rand, 0), 1, damageDropped(meta)); - - itemstack = modifyDrop(tile, itemstack); - - if (tile != null) - { - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, itemstack); - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - public String getFullTexName() - { + + itemstack = modifyDrop(tile, itemstack); + + if (tile != null) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, itemstack); + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + public String getFullTexName() { return this.texname; } - public ItemStack construct(String name) - { + public ItemStack construct(String name) { return construct(name, 1); } - public ItemStack construct(String name, int stacksize) - { + + public ItemStack construct(String name, int stacksize) { ItemStack item = new ItemStack(this, stacksize); CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, name.toLowerCase()); - + return item; } } diff --git a/src/main/java/minefantasy/mf2/block/decor/ItemBedMF.java b/src/main/java/minefantasy/mf2/block/decor/ItemBedMF.java index bbeba876..ee35a19a 100644 --- a/src/main/java/minefantasy/mf2/block/decor/ItemBedMF.java +++ b/src/main/java/minefantasy/mf2/block/decor/ItemBedMF.java @@ -4,90 +4,76 @@ import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.item.list.CreativeTabMF; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class ItemBedMF extends Item -{ - public ItemBedMF(String name) - {//ItemBed - this.setUnlocalizedName(name); - setMaxStackSize(4); - setTextureName("minefantasy2:Other/"+name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setCreativeTab(CreativeTabMF.tabGadget); - } +public class ItemBedMF extends Item { + public ItemBedMF(String name) {// ItemBed + this.setUnlocalizedName(name); + setMaxStackSize(4); + setTextureName("minefantasy2:Other/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setCreativeTab(CreativeTabMF.tabGadget); + } - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS - */ - 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_3_.isRemote) - { - return true; - } - else if (p_77648_7_ != 1) - { - return false; - } - else - { - ++p_77648_5_; - BlockBedMF blockbed = (BlockBedMF)BlockListMF.bedroll; - int i1 = MathHelper.floor_double((double)(p_77648_2_.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; - byte b0 = 0; - byte b1 = 0; + /** + * Callback for item usage. If the item does something special on right + * clicking, he will have one of those. Return True if something happen and + * false if it don't. This is for ITEMS, not BLOCKS + */ + 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_3_.isRemote) { + return true; + } else if (p_77648_7_ != 1) { + return false; + } else { + ++p_77648_5_; + BlockBedMF blockbed = (BlockBedMF) BlockListMF.bedroll; + int i1 = MathHelper.floor_double(p_77648_2_.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + byte b0 = 0; + byte b1 = 0; - if (i1 == 0) - { - b1 = 1; - } + if (i1 == 0) { + b1 = 1; + } - if (i1 == 1) - { - b0 = -1; - } + if (i1 == 1) { + b0 = -1; + } - if (i1 == 2) - { - b1 = -1; - } + if (i1 == 2) { + b1 = -1; + } - if (i1 == 3) - { - b0 = 1; - } + if (i1 == 3) { + b0 = 1; + } - if (p_77648_2_.canPlayerEdit(p_77648_4_, p_77648_5_, p_77648_6_, p_77648_7_, p_77648_1_) && p_77648_2_.canPlayerEdit(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1, p_77648_7_, p_77648_1_)) - { - if (p_77648_3_.isAirBlock(p_77648_4_, p_77648_5_, p_77648_6_) && p_77648_3_.isAirBlock(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1) && World.doesBlockHaveSolidTopSurface(p_77648_3_, p_77648_4_, p_77648_5_ - 1, p_77648_6_) && World.doesBlockHaveSolidTopSurface(p_77648_3_, p_77648_4_ + b0, p_77648_5_ - 1, p_77648_6_ + b1)) - { - p_77648_3_.setBlock(p_77648_4_, p_77648_5_, p_77648_6_, blockbed, i1, 3); + if (p_77648_2_.canPlayerEdit(p_77648_4_, p_77648_5_, p_77648_6_, p_77648_7_, p_77648_1_) + && p_77648_2_.canPlayerEdit(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1, p_77648_7_, p_77648_1_)) { + if (p_77648_3_.isAirBlock(p_77648_4_, p_77648_5_, p_77648_6_) + && p_77648_3_.isAirBlock(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1) + && World.doesBlockHaveSolidTopSurface(p_77648_3_, p_77648_4_, p_77648_5_ - 1, p_77648_6_) + && World.doesBlockHaveSolidTopSurface(p_77648_3_, p_77648_4_ + b0, p_77648_5_ - 1, + p_77648_6_ + b1)) { + p_77648_3_.setBlock(p_77648_4_, p_77648_5_, p_77648_6_, blockbed, i1, 3); - if (p_77648_3_.getBlock(p_77648_4_, p_77648_5_, p_77648_6_) == blockbed) - { - p_77648_3_.setBlock(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1, blockbed, i1 + 8, 3); - } + if (p_77648_3_.getBlock(p_77648_4_, p_77648_5_, p_77648_6_) == blockbed) { + p_77648_3_.setBlock(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1, blockbed, i1 + 8, 3); + } - --p_77648_1_.stackSize; - return true; - } - else - { - return false; - } - } - else - { - return false; - } - } - } + --p_77648_1_.stackSize; + return true; + } else { + return false; + } + } else { + return false; + } + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/decor/ItemBlockAmmoBox.java b/src/main/java/minefantasy/mf2/block/decor/ItemBlockAmmoBox.java index 84b0890c..86696d12 100644 --- a/src/main/java/minefantasy/mf2/block/decor/ItemBlockAmmoBox.java +++ b/src/main/java/minefantasy/mf2/block/decor/ItemBlockAmmoBox.java @@ -19,61 +19,51 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; -public class ItemBlockAmmoBox extends ItemBlock implements IStorageBlock -{ - public ItemBlockAmmoBox(Block base) - { +public class ItemBlockAmmoBox extends ItemBlock implements IStorageBlock { + public ItemBlockAmmoBox(Block base) { super(base); } - + @SideOnly(Side.CLIENT) @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean info) - { - if(item.hasTagCompound() && item.getTagCompound().hasKey(BlockAmmoBox.NBT_Ammo) && item.getTagCompound().hasKey(BlockAmmoBox.NBT_Stock)) - { - ItemStack ammo = ItemStack.loadItemStackFromNBT(item.getTagCompound().getCompoundTag(BlockAmmoBox.NBT_Ammo)); + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean info) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(BlockAmmoBox.NBT_Ammo) + && item.getTagCompound().hasKey(BlockAmmoBox.NBT_Stock)) { + ItemStack ammo = ItemStack + .loadItemStackFromNBT(item.getTagCompound().getCompoundTag(BlockAmmoBox.NBT_Ammo)); int stock = item.getTagCompound().getInteger(BlockAmmoBox.NBT_Stock); - if(ammo != null) - { + if (ammo != null) { list.add(ammo.getDisplayName() + " x" + stock); } } - CustomMaterial material = CustomMaterial.getMaterialFor(item,CustomToolHelper.slot_main); - if(material != null) - { - list.add(StatCollector.translateToLocalFormatted("attribute.box.capacity.name", TileEntityAmmoBox.getCapacity(material.tier))); + CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); + if (material != null) { + list.add(StatCollector.translateToLocalFormatted("attribute.box.capacity.name", + TileEntityAmmoBox.getCapacity(material.tier))); } } - + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(MineFantasyII.isDebug()) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (MineFantasyII.isDebug()) { ArrayList wood = CustomMaterial.getList("wood"); Iterator iteratorWood = wood.iterator(); - while(iteratorWood.hasNext()) - { + while (iteratorWood.hasNext()) { CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - list.add( this.construct(customMat.name) ); - } - } - else - { - list.add( this.construct("RefinedWood")); + list.add(this.construct(customMat.name)); + } + } else { + list.add(this.construct("RefinedWood")); } - } - - private ItemStack construct(String name) - { + } + + private ItemStack construct(String name) { return CustomToolHelper.constructSingleColoredLayer(this, name, 1); } - + @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { return CustomToolHelper.getLocalisedName(item, this.getUnlocalizedNameInefficiently(item) + ".name"); - } + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/ItemBlockToolRack.java b/src/main/java/minefantasy/mf2/block/decor/ItemBlockToolRack.java index e7084ebe..e3562f8f 100644 --- a/src/main/java/minefantasy/mf2/block/decor/ItemBlockToolRack.java +++ b/src/main/java/minefantasy/mf2/block/decor/ItemBlockToolRack.java @@ -9,50 +9,38 @@ import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; -import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -public class ItemBlockToolRack extends ItemBlock -{ - public ItemBlockToolRack(Block base) - { +public class ItemBlockToolRack extends ItemBlock { + public ItemBlockToolRack(Block base) { super(base); } - + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(MineFantasyII.isDebug()) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (MineFantasyII.isDebug()) { ArrayList wood = CustomMaterial.getList("wood"); Iterator iteratorWood = wood.iterator(); - while(iteratorWood.hasNext()) - { + while (iteratorWood.hasNext()) { CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - list.add( this.construct(customMat.name) ); - } - } - else - { - list.add( this.construct("RefinedWood")); + list.add(this.construct(customMat.name)); + } + } else { + list.add(this.construct("RefinedWood")); } - } - - private ItemStack construct(String name) - { + } + + private ItemStack construct(String name) { return CustomToolHelper.constructSingleColoredLayer(this, name, 1); } - + @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { return CustomToolHelper.getLocalisedName(item, this.getUnlocalizedNameInefficiently(item) + ".name"); - } + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/ItemBlockTrough.java b/src/main/java/minefantasy/mf2/block/decor/ItemBlockTrough.java index 83c788ea..f12cd938 100644 --- a/src/main/java/minefantasy/mf2/block/decor/ItemBlockTrough.java +++ b/src/main/java/minefantasy/mf2/block/decor/ItemBlockTrough.java @@ -16,7 +16,6 @@ import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -25,133 +24,109 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class ItemBlockTrough extends ItemBlock implements IStorageBlock -{ - public ItemBlockTrough(Block base) - { +public class ItemBlockTrough extends ItemBlock implements IStorageBlock { + public ItemBlockTrough(Block base) { super(base); } - + @SideOnly(Side.CLIENT) @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean info) - { - if(item.hasTagCompound() && item.getTagCompound().hasKey(BlockTrough.NBT_fill)) - { + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean info) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(BlockTrough.NBT_fill)) { int stock = item.getTagCompound().getInteger(BlockTrough.NBT_fill); - if(stock > 0) - { + if (stock > 0) { list.add(StatCollector.translateToLocalFormatted("attribute.fill", stock)); } } - CustomMaterial material = CustomMaterial.getMaterialFor(item,CustomToolHelper.slot_main); - if(material != null) - { - list.add(StatCollector.translateToLocalFormatted("attribute.fill.capacity.name", TileEntityTrough.getCapacity(material.tier) * TileEntityTrough.capacityScale)); + CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); + if (material != null) { + list.add(StatCollector.translateToLocalFormatted("attribute.fill.capacity.name", + TileEntityTrough.getCapacity(material.tier) * TileEntityTrough.capacityScale)); } } - + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(MineFantasyII.isDebug()) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (MineFantasyII.isDebug()) { ArrayList wood = CustomMaterial.getList("wood"); Iterator iteratorWood = wood.iterator(); - while(iteratorWood.hasNext()) - { + while (iteratorWood.hasNext()) { CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - list.add( this.construct(customMat.name) ); - } - } - else - { - list.add( this.construct("RefinedWood")); + list.add(this.construct(customMat.name)); + } + } else { + list.add(this.construct("RefinedWood")); } - } - - private ItemStack construct(String name) - { + } + + private ItemStack construct(String name) { return CustomToolHelper.constructSingleColoredLayer(this, name, 1); } - + @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { return CustomToolHelper.getLocalisedName(item, this.getUnlocalizedNameInefficiently(item) + ".name"); - } - + } + @Override - public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int x, int y, int z, int side, float f, float f1, float f2) - { + public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int x, int y, int z, int side, float f, + float f1, float f2) { MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - if (movingobjectposition == null) - { - return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); - } - else - { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (!world.canMineBlock(player, i, j, k)) - { - return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); - } - - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) - { - return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); - } - - if (isWaterSource(world, i, j, k)) - { - gather(player); - world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat()/4F, 0.5F + rand.nextFloat()); - return false; - } - } - return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); - } - } - - private Random rand = new Random(); - private void gather(EntityPlayer player) - { - ItemStack item = player.getHeldItem(); - if(item != null) - { - int tier = 0; - CustomMaterial material = CustomMaterial.getMaterialFor(item,CustomToolHelper.slot_main); - if(material != null) - { - tier = material.tier; - } - NBTTagCompound nbt = getNBT(item); - nbt.setInteger(BlockTrough.NBT_fill, TileEntityTrough.getCapacity(tier) * TileEntityTrough.capacityScale); - } - player.swingItem(); - + if (movingobjectposition == null) { + return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) { + return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); + } + + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); + } + + if (isWaterSource(world, i, j, k)) { + gather(player); + world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, + 0.5F + rand.nextFloat()); + return false; + } + } + return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); + } } - - private NBTTagCompound getNBT(ItemStack item) - { - if(!item.hasTagCompound()) - { + + private Random rand = new Random(); + + private void gather(EntityPlayer player) { + ItemStack item = player.getHeldItem(); + if (item != null) { + int tier = 0; + CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); + if (material != null) { + tier = material.tier; + } + NBTTagCompound nbt = getNBT(item); + nbt.setInteger(BlockTrough.NBT_fill, TileEntityTrough.getCapacity(tier) * TileEntityTrough.capacityScale); + } + player.swingItem(); + + } + + private NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } return item.getTagCompound(); } - private boolean isWaterSource(World world, int i, int j, int k) - { - if (world.getBlock(i, j, k).getMaterial() == Material.water) - { + private boolean isWaterSource(World world, int i, int j, int k) { + if (world.getBlock(i, j, k).getMaterial() == Material.water) { return true; } return false; diff --git a/src/main/java/minefantasy/mf2/block/food/BlockBerryBush.java b/src/main/java/minefantasy/mf2/block/food/BlockBerryBush.java index 4bb35a4a..fa34dcb1 100644 --- a/src/main/java/minefantasy/mf2/block/food/BlockBerryBush.java +++ b/src/main/java/minefantasy/mf2/block/food/BlockBerryBush.java @@ -3,6 +3,9 @@ import java.util.ArrayList; import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.item.food.FoodListMF; import net.minecraft.block.BlockBush; import net.minecraft.block.material.Material; @@ -18,192 +21,173 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.IShearable; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockBerryBush extends BlockBush implements IShearable -{ - private Random rand = new Random(); +public class BlockBerryBush extends BlockBush implements IShearable { + private Random rand = new Random(); int[] field_150128_a; - @SideOnly(Side.CLIENT) - protected int field_150127_b; - private IIcon[] berriedBush = new IIcon[2]; - private IIcon[] emptyBush = new IIcon[2]; - - public BlockBerryBush(String name) - { - super(Material.leaves); - GameRegistry.registerBlock(this, ItemBlockBerries.class, name); + @SideOnly(Side.CLIENT) + protected int field_150127_b; + private IIcon[] berriedBush = new IIcon[2]; + private IIcon[] emptyBush = new IIcon[2]; + + public BlockBerryBush(String name) { + super(Material.leaves); + GameRegistry.registerBlock(this, ItemBlockBerries.class, name); setBlockName(name); - - this.setTickRandomly(true); - this.setCreativeTab(CreativeTabs.tabDecorations); - this.setHardness(0.3F); - float offset = 1/16F; - this.setBlockBounds(offset, 0F, offset, 1.0F-offset, 1.0F-(offset*2), 1.0F-offset); - this.setLightOpacity(1); - this.setStepSound(soundTypeGrass); - } - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random rand) - { - int meta = world.getBlockMetadata(x, y, z); - if(meta >= 1 && rand.nextInt(120) == 0) - { - world.setBlockMetadataWithNotify(x, y, z, 0, 2); - } - } - - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) - { - berriedBush[0] = reg.registerIcon("minefantasy2:food/berrybushfull"); - berriedBush[1] = reg.registerIcon("minefantasy2:food/berrybushfull_opaque"); - emptyBush[0] = reg.registerIcon("minefantasy2:food/berrybush"); - emptyBush[1] = reg.registerIcon("minefantasy2:food/berrybush_opaque"); - } - - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) - { - int flag = Minecraft.getMinecraft().gameSettings.fancyGraphics ? 0 : 1; - if(meta == 0) - { - return berriedBush[flag]; - } - return emptyBush[flag]; - } - - @Override - public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z) - { - return true; - } - - @Override - public ArrayList onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune) - { - ArrayList ret = new ArrayList(); - ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z) & 3)); - return ret; - } - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - int meta = world.getBlockMetadata(x, y, z); - if(meta == 0 ) - { - if(world.isRemote)return true; - - - world.setBlockMetadataWithNotify(x, y, z, 1, 2); - - ItemStack itemstack = rand.nextInt(10) == 0 ? new ItemStack(FoodListMF.berriesJuicy) : new ItemStack(FoodListMF.berries, 1); - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - - return true; - } - return false; - } - - @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) - { - return new ArrayList(){}; - } - @Override - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) - { - return true; - } - @Override - public int getRenderType() - { - return 0; - } - @SideOnly(Side.CLIENT) - @Override - public int getRenderColor(int i) - { - return ColorizerFoliage.getFoliageColorBasic(); - } - - @SideOnly(Side.CLIENT) - @Override - public int getBlockColor() - { - double d0 = 0.5D; - double d1 = 1.0D; - return ColorizerFoliage.getFoliageColor(d0, d1); - } - - @SideOnly(Side.CLIENT) - @Override - public int colorMultiplier(IBlockAccess world, int x, int y, int z) - { - int l = 0; - int i1 = 0; - int j1 = 0; - - for (int k1 = -1; k1 <= 1; ++k1) - { - for (int l1 = -1; l1 <= 1; ++l1) - { - int i2 = world.getBiomeGenForCoords(x + l1, z + k1).getBiomeFoliageColor(x + l1, y, z + k1); - l += (i2 & 16711680) >> 16; - i1 += (i2 & 65280) >> 8; - j1 += i2 & 255; - } - } - - return (l / 9 & 255) << 16 | (i1 / 9 & 255) << 8 | j1 / 9 & 255; - } + + this.setTickRandomly(true); + this.setCreativeTab(CreativeTabs.tabDecorations); + this.setHardness(0.3F); + float offset = 1 / 16F; + this.setBlockBounds(offset, 0F, offset, 1.0F - offset, 1.0F - (offset * 2), 1.0F - offset); + this.setLightOpacity(1); + this.setStepSound(soundTypeGrass); + } + + /** + * Ticks the block if it's been scheduled + */ + @Override + public void updateTick(World world, int x, int y, int z, Random rand) { + int meta = world.getBlockMetadata(x, y, z); + if (meta >= 1 && rand.nextInt(120) == 0) { + world.setBlockMetadataWithNotify(x, y, z, 0, 2); + } + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + berriedBush[0] = reg.registerIcon("minefantasy2:food/berrybushfull"); + berriedBush[1] = reg.registerIcon("minefantasy2:food/berrybushfull_opaque"); + emptyBush[0] = reg.registerIcon("minefantasy2:food/berrybush"); + emptyBush[1] = reg.registerIcon("minefantasy2:food/berrybush_opaque"); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + int flag = Minecraft.getMinecraft().gameSettings.fancyGraphics ? 0 : 1; + if (meta == 0) { + return berriedBush[flag]; + } + return emptyBush[flag]; + } + + @Override + public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z) { + return true; + } + + @Override + public ArrayList onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune) { + ArrayList ret = new ArrayList(); + ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z) & 3)); + return ret; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + int meta = world.getBlockMetadata(x, y, z); + if (meta == 0) { + if (world.isRemote) + return true; + + world.setBlockMetadataWithNotify(x, y, z, 1, 2); + + ItemStack itemstack = rand.nextInt(10) == 0 ? new ItemStack(FoodListMF.berriesJuicy) + : new ItemStack(FoodListMF.berries, 1); + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + + return true; + } + return false; + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return new ArrayList() { + }; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public int getRenderType() { + return 0; + } + + @SideOnly(Side.CLIENT) + @Override + public int getRenderColor(int i) { + return ColorizerFoliage.getFoliageColorBasic(); + } + + @SideOnly(Side.CLIENT) + @Override + public int getBlockColor() { + double d0 = 0.5D; + double d1 = 1.0D; + return ColorizerFoliage.getFoliageColor(d0, d1); + } + + @SideOnly(Side.CLIENT) + @Override + public int colorMultiplier(IBlockAccess world, int x, int y, int z) { + int l = 0; + int i1 = 0; + int j1 = 0; + + for (int k1 = -1; k1 <= 1; ++k1) { + for (int l1 = -1; l1 <= 1; ++l1) { + int i2 = world.getBiomeGenForCoords(x + l1, z + k1).getBiomeFoliageColor(x + l1, y, z + k1); + l += (i2 & 16711680) >> 16; + i1 += (i2 & 65280) >> 8; + j1 += i2 & 255; + } + } + + return (l / 9 & 255) << 16 | (i1 / 9 & 255) << 8 | j1 / 9 & 255; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/food/BlockCakeMF.java b/src/main/java/minefantasy/mf2/block/food/BlockCakeMF.java index 41c1be4e..e4f63b00 100644 --- a/src/main/java/minefantasy/mf2/block/food/BlockCakeMF.java +++ b/src/main/java/minefantasy/mf2/block/food/BlockCakeMF.java @@ -1,5 +1,8 @@ package minefantasy.mf2.block.food; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.item.food.ItemFoodMF; import minefantasy.mf2.item.list.CreativeTabMF; @@ -14,227 +17,203 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockCakeMF extends Block -{ - @SideOnly(Side.CLIENT) - private IIcon topTex; - @SideOnly(Side.CLIENT) - private IIcon bottomTex; - @SideOnly(Side.CLIENT) - private IIcon insideTex; - private Item cakeSlice; - protected int maxSlices = 8; - protected float height = 0.5F; - protected float width = 14F/16F; - - public BlockCakeMF(String name, Item slice) - { - super(Material.cake); - GameRegistry.registerBlock(this, ItemBlockCake.class, name); +public class BlockCakeMF extends Block { + @SideOnly(Side.CLIENT) + private IIcon topTex; + @SideOnly(Side.CLIENT) + private IIcon bottomTex; + @SideOnly(Side.CLIENT) + private IIcon insideTex; + private Item cakeSlice; + protected int maxSlices = 8; + protected float height = 0.5F; + protected float width = 14F / 16F; + + public BlockCakeMF(String name, Item slice) { + super(Material.cake); + GameRegistry.registerBlock(this, ItemBlockCake.class, name); setBlockName(name); - setBlockTextureName("minefantasy2:food/"+name); - cakeSlice = slice; - this.setTickRandomly(true); - setCreativeTab(CreativeTabMF.tabFood); - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) - { - int slices = world.getBlockMetadata(x, y, z); - float border = (1F-width)/2; - float size = (slices / (float)maxSlices) * (1.0F-(border*2)); - this.setBlockBounds(border + size, 0.0F, border, 1.0F-border, height, 1.0F - border); - } - - /** - * Sets the block's bounds for rendering it as an item - */ - @Override - public void setBlockBoundsForItemRender() - { - float f = (1F-width)/2; - float f1 = height; - this.setBlockBounds(f, 0.0F, f, 1.0F - f, f1, 1.0F - f); - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) - { - int slices = world.getBlockMetadata(x, y, z); - float border =(1F-width)/2; - float size = border + (slices / (float)maxSlices) * (1.0F-(border*2)); - return AxisAlignedBB.getBoundingBox(x + size, y, z + border, x + 1 - border, y + height - border, z + 1 - border); - } - - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - @SideOnly(Side.CLIENT) - @Override - public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) - { - int slices = world.getBlockMetadata(x, y, z); - float border = (1F-width)/2; - float size = border + (slices / (float)maxSlices) * (1.0F-(border*2)); - return AxisAlignedBB.getBoundingBox(x + size, y, z + border, x + 1 - border, y + height, z + 1 - border); - } - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) - { - return side == 1 ? this.topTex : (side == 0 ? this.bottomTex : (meta > 0 && side == 4 ? this.insideTex : this.blockIcon)); - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) - { - this.blockIcon = reg.registerIcon(this.getTextureName() + "_side"); - this.insideTex = reg.registerIcon(this.getTextureName() + "_inner"); - this.topTex = reg.registerIcon(this.getTextureName() + "_top"); - this.bottomTex = reg.registerIcon(this.getTextureName() + "_bottom"); - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xoffset, float yoffset, float zoffset) - { - if(ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("knife")) - { - this.cutSlice(world, x, y, z, user); - return true; - } - return false; - } - - /** - * Called when a player hits the block. Args: world, x, y, z, player - */ - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) - { - if(ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("knife")) - { - this.cutSlice(world, x, y, z, user); - } - } - - private void cutSlice(World world, int x, int y, int z, EntityPlayer user) - { - if(cakeSlice != null) - { - ItemStack slice = new ItemStack(cakeSlice); - if(!user.inventory.addItemStackToInventory(slice)) - { - user.entityDropItem(slice, 1.0F); - } - } - int l = world.getBlockMetadata(x, y, z) + 1; - - if (l >= maxSlices) - { - world.setBlockToAir(x, y, z); - } - else - { - world.setBlockMetadataWithNotify(x, y, z, l, 2); - } - if(user.getHeldItem() != null) - { - user.getHeldItem().damageItem(1, user); - } - } - - /** - * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z - */ - @Override - public boolean canPlaceBlockAt(World world, int x, int y, int z) - { - return !super.canPlaceBlockAt(world, x, y, z) ? false : this.canBlockStay(world, x, y, z); - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor Block - */ - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) - { - if (!this.canBlockStay(world, x, y, z)) - { - ItemStack item = new ItemStack(this, 1, damageDropped(world.getBlockMetadata(x, y, z))); - EntityItem drop = new EntityItem(world, x+0.5D, y+0.5D, z+0.5D, item); - world.spawnEntityInWorld(drop); - world.setBlockToAir(x, y, z); - } - } - - /** - * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants. - */ - @Override - public boolean canBlockStay(World world, int x, int y, int z) - { - return world.getBlock(x, y - 1, z).getMaterial().isSolid(); - } - - @Override - public int damageDropped(int meta) - { - return meta; - } - - public int getRarity() - { - if(cakeSlice instanceof ItemFoodMF) - { - return ((ItemFoodMF)cakeSlice).itemRarity; + setBlockTextureName("minefantasy2:food/" + name); + cakeSlice = slice; + this.setTickRandomly(true); + setCreativeTab(CreativeTabMF.tabFood); + } + + /** + * Updates the blocks bounds based on its current state. Args: world, x, y, z + */ + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + int slices = world.getBlockMetadata(x, y, z); + float border = (1F - width) / 2; + float size = (slices / (float) maxSlices) * (1.0F - (border * 2)); + this.setBlockBounds(border + size, 0.0F, border, 1.0F - border, height, 1.0F - border); + } + + /** + * Sets the block's bounds for rendering it as an item + */ + @Override + public void setBlockBoundsForItemRender() { + float f = (1F - width) / 2; + float f1 = height; + this.setBlockBounds(f, 0.0F, f, 1.0F - f, f1, 1.0F - f); + } + + /** + * Returns a bounding box from the pool of bounding boxes (this means this box + * can change after the pool has been cleared to be reused) + */ + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + int slices = world.getBlockMetadata(x, y, z); + float border = (1F - width) / 2; + float size = border + (slices / (float) maxSlices) * (1.0F - (border * 2)); + return AxisAlignedBB.getBoundingBox(x + size, y, z + border, x + 1 - border, y + height - border, + z + 1 - border); + } + + /** + * Returns the bounding box of the wired rectangular prism to render. + */ + @SideOnly(Side.CLIENT) + @Override + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + int slices = world.getBlockMetadata(x, y, z); + float border = (1F - width) / 2; + float size = border + (slices / (float) maxSlices) * (1.0F - (border * 2)); + return AxisAlignedBB.getBoundingBox(x + size, y, z + border, x + 1 - border, y + height, z + 1 - border); + } + + /** + * Gets the block's texture. Args: side, meta + */ + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + return side == 1 ? this.topTex + : (side == 0 ? this.bottomTex : (meta > 0 && side == 4 ? this.insideTex : this.blockIcon)); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(this.getTextureName() + "_side"); + this.insideTex = reg.registerIcon(this.getTextureName() + "_inner"); + this.topTex = reg.registerIcon(this.getTextureName() + "_top"); + this.bottomTex = reg.registerIcon(this.getTextureName() + "_bottom"); + } + + /** + * If this block doesn't render as an ordinary block it will return False + * (examples: signs, buttons, stairs, etc) + */ + @Override + public boolean renderAsNormalBlock() { + return false; + } + + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or + * not to render the shared face of two adjacent blocks and also whether the + * player can attach torches, redstone wire, etc to this block. + */ + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xoffset, + float yoffset, float zoffset) { + if (ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("knife")) { + this.cutSlice(world, x, y, z, user); + return true; + } + return false; + } + + /** + * Called when a player hits the block. Args: world, x, y, z, player + */ + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + if (ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("knife")) { + this.cutSlice(world, x, y, z, user); + } + } + + private void cutSlice(World world, int x, int y, int z, EntityPlayer user) { + if (cakeSlice != null) { + ItemStack slice = new ItemStack(cakeSlice); + if (!user.inventory.addItemStackToInventory(slice)) { + user.entityDropItem(slice, 1.0F); + } + } + int l = world.getBlockMetadata(x, y, z) + 1; + + if (l >= maxSlices) { + world.setBlockToAir(x, y, z); + } else { + world.setBlockMetadataWithNotify(x, y, z, l, 2); + } + if (user.getHeldItem() != null) { + user.getHeldItem().damageItem(1, user); + } + } + + /** + * Checks to see if its valid to put this block at the specified coordinates. + * Args: world, x, y, z + */ + @Override + public boolean canPlaceBlockAt(World world, int x, int y, int z) { + return !super.canPlaceBlockAt(world, x, y, z) ? false : this.canBlockStay(world, x, y, z); + } + + /** + * Lets the block know when one of its neighbor changes. Doesn't know which + * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor + * Block + */ + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + if (!this.canBlockStay(world, x, y, z)) { + ItemStack item = new ItemStack(this, 1, damageDropped(world.getBlockMetadata(x, y, z))); + EntityItem drop = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, item); + world.spawnEntityInWorld(drop); + world.setBlockToAir(x, y, z); + } + } + + /** + * Can this block stay at this position. Similar to canPlaceBlockAt except gets + * checked often with plants. + */ + @Override + public boolean canBlockStay(World world, int x, int y, int z) { + return world.getBlock(x, y - 1, z).getMaterial().isSolid(); + } + + @Override + public int damageDropped(int meta) { + return meta; + } + + public int getRarity() { + if (cakeSlice instanceof ItemFoodMF) { + return ((ItemFoodMF) cakeSlice).itemRarity; } return 0; } - - public Block setCheese() - { + + public Block setCheese() { width = 0.5F; - height = 5F/16F; + height = 5F / 16F; return this; } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/food/BlockPie.java b/src/main/java/minefantasy/mf2/block/food/BlockPie.java index 099401dc..368b8e16 100644 --- a/src/main/java/minefantasy/mf2/block/food/BlockPie.java +++ b/src/main/java/minefantasy/mf2/block/food/BlockPie.java @@ -2,13 +2,11 @@ import net.minecraft.item.Item; -public class BlockPie extends BlockCakeMF -{ +public class BlockPie extends BlockCakeMF { - public BlockPie(String name, Item slice) - { + public BlockPie(String name, Item slice) { super(name, slice); - this.height = 1F/16F*6F; + this.height = 1F / 16F * 6F; } } diff --git a/src/main/java/minefantasy/mf2/block/food/ItemBlockBerries.java b/src/main/java/minefantasy/mf2/block/food/ItemBlockBerries.java index e2331ab1..9a68f9db 100644 --- a/src/main/java/minefantasy/mf2/block/food/ItemBlockBerries.java +++ b/src/main/java/minefantasy/mf2/block/food/ItemBlockBerries.java @@ -3,16 +3,14 @@ import net.minecraft.block.Block; import net.minecraft.item.ItemBlock; -public class ItemBlockBerries extends ItemBlock -{ - public ItemBlockBerries(Block block) - { +public class ItemBlockBerries extends ItemBlock { + public ItemBlockBerries(Block block) { super(block); setHasSubtypes(true); } + @Override - public int getMetadata(int id) - { - return id; - } + public int getMetadata(int id) { + return id; + } } diff --git a/src/main/java/minefantasy/mf2/block/food/ItemBlockCake.java b/src/main/java/minefantasy/mf2/block/food/ItemBlockCake.java index 6a00cbff..c2cf8977 100644 --- a/src/main/java/minefantasy/mf2/block/food/ItemBlockCake.java +++ b/src/main/java/minefantasy/mf2/block/food/ItemBlockCake.java @@ -7,33 +7,29 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -public class ItemBlockCake extends ItemBlock -{ +public class ItemBlockCake extends ItemBlock { private BlockCakeMF cake; - public ItemBlockCake(Block block) - { - super(block); - cake=(BlockCakeMF) block; - setMaxStackSize(1); - this.setMaxDamage(0); - this.setHasSubtypes(true); - setCreativeTab(CreativeTabs.tabDecorations); - } - - @Override - public int getMetadata(int damage) - { - return damage; - } - - @Override - public EnumRarity getRarity(ItemStack item) - { - int lvl = cake.getRarity()+1; - if(lvl >= ToolListMF.rarity.length) - { - lvl = ToolListMF.rarity.length-1; + + public ItemBlockCake(Block block) { + super(block); + cake = (BlockCakeMF) block; + setMaxStackSize(1); + this.setMaxDamage(0); + this.setHasSubtypes(true); + setCreativeTab(CreativeTabs.tabDecorations); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = cake.getRarity() + 1; + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; } - return ToolListMF.rarity[lvl]; - } + return ToolListMF.rarity[lvl]; + } } diff --git a/src/main/java/minefantasy/mf2/block/list/BlockListMF.java b/src/main/java/minefantasy/mf2/block/list/BlockListMF.java index 6595f4f3..c38a2b5a 100644 --- a/src/main/java/minefantasy/mf2/block/list/BlockListMF.java +++ b/src/main/java/minefantasy/mf2/block/list/BlockListMF.java @@ -56,56 +56,70 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class BlockListMF -{ - public static final String[] metalBlocks = new String[] - { - "copper", "tin", "silver", "bronze", "pigiron", "steel", "blacksteel", "redsteel", "bluesteel", "adamantium", "mithril", "ignotumite", "mithium", "ender" - }; - public static final String[] specialMetalBlocks = new String[] - { - "bronze", "iron", "steel", "blacksteel", "redsteel", "bluesteel" - }; - public static final String[] anvils = new String[] - { - "bronze", "iron", "steel", "blacksteel", "bluesteel", "redsteel" - }; - +public class BlockListMF { + public static final String[] metalBlocks = new String[] { "copper", "tin", "silver", "bronze", "pigiron", "steel", + "blacksteel", "redsteel", "bluesteel", "adamantium", "mithril", "ignotumite", "mithium", "ender" }; + public static final String[] specialMetalBlocks = new String[] { "bronze", "iron", "steel", "blacksteel", + "redsteel", "bluesteel" }; + public static final String[] anvils = new String[] { "bronze", "iron", "steel", "blacksteel", "bluesteel", + "redsteel" }; + public static Block oreCopper = new BlockOreMF("oreCopper", 0, -1).setHardness(2.0F).setResistance(3.0F); public static Block oreTin = new BlockOreMF("oreTin", 0).setHardness(2.5F).setResistance(4.0F); public static Block oreSilver = new BlockOreMF("oreSilver", 2).setHardness(3.0F).setResistance(5.0F); public static Block oreMythic = new BlockMythicOre("oreMythic", false).setHardness(10.0F).setResistance(100.0F); - - public static Block oreKaolinite = new BlockOreMF("oreKaolinite", 1, 0, ComponentListMF.kaolinite, 1, 1, 1).setHardness(3.0F).setResistance(5.0F); - public static Block oreNitre = new BlockOreMF("oreNitre", 2, 0, ComponentListMF.nitre, 1, 2, 1).setHardness(3.0F).setResistance(5.0F); - public static Block oreSulfur = new BlockOreMF("oreSulfur", 2, 0, ComponentListMF.sulfur, 1, 4, 2).setHardness(3.0F).setResistance(2.0F); - public static Block oreBorax = new BlockOreMF("oreBorax", 2, 1, ComponentListMF.flux_strong, 1, 8, 4).setHardness(3.0F).setResistance(2.0F); - public static Block oreTungsten = new BlockOreMF("oreTungsten", 3, 1, ComponentListMF.oreTungsten, 1, 1, 4).setHardness(4.0F).setResistance(2.5F); - public static Block oreClay = new BlockOreMF("oreClay", 0, 0, Items.clay_ball, 1, 4, 1, Material.ground).setHardness(0.5F).setStepSound(Block.soundTypeGravel); - public static Block oreCoalRich = new BlockOreMF("oreCoalRich", 2, 1, Items.coal, 2, 6, 2).setHardness(5.0F).setResistance(10.0F); - - public static Block mud_brick = new BasicBlockMF("mud_brick", Material.ground).setHardness(1.0F).setResistance(0.5F); + + public static Block oreKaolinite = new BlockOreMF("oreKaolinite", 1, 0, ComponentListMF.kaolinite, 1, 1, 1) + .setHardness(3.0F).setResistance(5.0F); + public static Block oreNitre = new BlockOreMF("oreNitre", 2, 0, ComponentListMF.nitre, 1, 2, 1).setHardness(3.0F) + .setResistance(5.0F); + public static Block oreSulfur = new BlockOreMF("oreSulfur", 2, 0, ComponentListMF.sulfur, 1, 4, 2).setHardness(3.0F) + .setResistance(2.0F); + public static Block oreBorax = new BlockOreMF("oreBorax", 2, 1, ComponentListMF.flux_strong, 1, 8, 4) + .setHardness(3.0F).setResistance(2.0F); + public static Block oreTungsten = new BlockOreMF("oreTungsten", 3, 1, ComponentListMF.oreTungsten, 1, 1, 4) + .setHardness(4.0F).setResistance(2.5F); + public static Block oreClay = new BlockOreMF("oreClay", 0, 0, Items.clay_ball, 1, 4, 1, Material.ground) + .setHardness(0.5F).setStepSound(Block.soundTypeGravel); + public static Block oreCoalRich = new BlockOreMF("oreCoalRich", 2, 1, Items.coal, 2, 6, 2).setHardness(5.0F) + .setResistance(10.0F); + + public static Block mud_brick = new BasicBlockMF("mud_brick", Material.ground).setHardness(1.0F) + .setResistance(0.5F); public static Block mud_pavement = new BasicBlockMF("mud_pavement", Material.ground).setHardness(0.5F); - - public static Block cobble_brick = new BasicBlockMF("cobble_brick", Material.rock).setHardness(2.5F).setResistance(12.0F).setStepSound(Block.soundTypePiston); - public static Block cobble_pavement = new BasicBlockMF("cobble_pavement", Material.rock).setHardness(2.0F).setResistance(10.0F).setStepSound(Block.soundTypePiston); - - public static Block window = new BasicBlockMF("window", Material.glass).setHardness(0.9F).setResistance(0.1F).setStepSound(Block.soundTypeGlass); - public static Block framed_glass = new BasicBlockMF("framed_glass", Material.glass).setHardness(0.6F).setResistance(0.2F).setStepSound(Block.soundTypeGlass); - public static Block framed_pane = new BlockPaneMF("framed_pane", "framed_glass", "framed_glass_pane", Material.glass, true).setHardness(0.6F).setResistance(0.1F).setStepSound(Block.soundTypeGlass); - public static Block window_pane = new BlockPaneMF("window_pane", "window", "framed_glass_pane", Material.glass, true).setHardness(0.9F).setResistance(0.2F).setStepSound(Block.soundTypeGlass); - - public static Block thatch = new BasicBlockMF("thatch", Material.leaves).setHardness(1.0F).setStepSound(Block.soundTypeGrass); - public static Block thatch_stair = new ConstructionBlockMF.StairsConstBlock("thatch_stair", thatch).register("thatch_stair"); - -// public static Block limestone_cobblestone = new BasicBlockMF("limestone_cobblestone", Material.rock).setHardness(0.8F).setResistance(4.0F).setStepSound(Block.soundTypePiston); -// public static Block limestone = new BasicBlockMF("limestone", Material.rock, limestone_cobblestone).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundTypeStone); - + + public static Block cobble_brick = new BasicBlockMF("cobble_brick", Material.rock).setHardness(2.5F) + .setResistance(12.0F).setStepSound(Block.soundTypePiston); + public static Block cobble_pavement = new BasicBlockMF("cobble_pavement", Material.rock).setHardness(2.0F) + .setResistance(10.0F).setStepSound(Block.soundTypePiston); + + public static Block window = new BasicBlockMF("window", Material.glass).setHardness(0.9F).setResistance(0.1F) + .setStepSound(Block.soundTypeGlass); + public static Block framed_glass = new BasicBlockMF("framed_glass", Material.glass).setHardness(0.6F) + .setResistance(0.2F).setStepSound(Block.soundTypeGlass); + public static Block framed_pane = new BlockPaneMF("framed_pane", "framed_glass", "framed_glass_pane", + Material.glass, true).setHardness(0.6F).setResistance(0.1F).setStepSound(Block.soundTypeGlass); + public static Block window_pane = new BlockPaneMF("window_pane", "window", "framed_glass_pane", Material.glass, + true).setHardness(0.9F).setResistance(0.2F).setStepSound(Block.soundTypeGlass); + + public static Block thatch = new BasicBlockMF("thatch", Material.leaves).setHardness(1.0F) + .setStepSound(Block.soundTypeGrass); + public static Block thatch_stair = new ConstructionBlockMF.StairsConstBlock("thatch_stair", thatch) + .register("thatch_stair"); + + // public static Block limestone_cobblestone = new + // BasicBlockMF("limestone_cobblestone", + // Material.rock).setHardness(0.8F).setResistance(4.0F).setStepSound(Block.soundTypePiston); + // public static Block limestone = new BasicBlockMF("limestone", Material.rock, + // limestone_cobblestone).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundTypeStone); + public static Block limestone = new ConstructionBlockMF("limestone").setHardness(1.2F).setResistance(8F); - - public static Block firebricks = new BasicBlockMF("firebricks", Material.rock).setHardness(5.0F).setResistance(15.0F).setStepSound(Block.soundTypePiston); - public static Block clayWall = new BasicBlockMF("clayWall", Material.wood).setHardness(1.0F).setResistance(1.0F).setStepSound(Block.soundTypeWood); - + + public static Block firebricks = new BasicBlockMF("firebricks", Material.rock).setHardness(5.0F) + .setResistance(15.0F).setStepSound(Block.soundTypePiston); + public static Block clayWall = new BasicBlockMF("clayWall", Material.wood).setHardness(1.0F).setResistance(1.0F) + .setStepSound(Block.soundTypeWood); + public static BlockMetalBarsMF[] bars = new BlockMetalBarsMF[specialMetalBlocks.length]; public static BlockMetalMF[] storage = new BlockMetalMF[metalBlocks.length]; public static BlockAnvilMF anvilStone; @@ -113,201 +127,216 @@ public class BlockListMF public static BlockCarpenter carpenter = new BlockCarpenter(); public static BlockBombBench bombBench = new BlockBombBench(); public static BlockCrossbowBench crossbowBench = new BlockCrossbowBench(); - + public static Block cheese_wheel = new BlockCakeMF("cheese", FoodListMF.cheese_slice).setCheese(); - + public static Block cake_vanilla = new BlockCakeMF("cake_vanilla", FoodListMF.cake_slice); public static Block cake_carrot = new BlockCakeMF("cake_carrot", FoodListMF.carrotcake_slice); public static Block cake_chocolate = new BlockCakeMF("cake_chocolate", FoodListMF.choccake_slice); public static Block cake_bf = new BlockCakeMF("cake_bf", FoodListMF.bfcake_slice); - + public static Block pie_meat = new BlockPie("pie_meat", FoodListMF.meatpie_slice); - + public static Block pie_apple = new BlockPie("pie_apple", FoodListMF.pieslice_apple); public static Block pie_berry = new BlockPie("pie_berry", FoodListMF.pieslice_berry); - + public static Block pie_shepards = new BlockPie("pie_shepards", FoodListMF.pieslice_shepards); - + public static Block berryBush = new BlockBerryBush("berries"); public static Block blast_chamber = new BlockBFC(); public static Block blast_heater = new BlockBFH(false); public static Block blast_heater_active = new BlockBFH(true).setLightLevel(10F); - + public static Block crucible = new BlockCrucible("stone", 0, false); public static Block crucible_active = new BlockCrucible("stone", 0, true).setLightLevel(12F); public static Block crucibleadv = new BlockCrucible("fireclay", 1, false); public static Block crucibleadv_active = new BlockCrucible("fireclay", 1, true).setLightLevel(12F); public static Block crucibleauto = new BlockCrucible("auto", 1, false).setAuto().setHardness(12F); - public static Block crucibleauto_active = new BlockCrucible("auto", 1, true).setAuto().setHardness(12F).setLightLevel(12F); - + public static Block crucibleauto_active = new BlockCrucible("auto", 1, true).setAuto().setHardness(12F) + .setLightLevel(12F); + public static Block chimney_stone = new BlockChimney("stone", false, false, 5); public static Block chimney_stone_wide = new BlockChimney("stone", true, false, 10); public static Block chimney_stone_extractor = new BlockChimney("stone_extractor", true, true, 15); public static Block chimney_pipe = new BlockChimney("pipe", false, false, 10).setPipe(); - + public static Block tanner = new BlockTanningRack(0, ""); - + public static Block forge = new BlockForge("stone", 0, false); public static Block forge_active = new BlockForge("stone", 0, true); public static Block forge_metal = new BlockForge("metal", 1, false); public static Block forge_metal_active = new BlockForge("metal", 1, true); - + public static Block repair_basic = new BlockRepairKit("basic", 0.25F, 0.05F, 0.2F); public static Block repair_advanced = new BlockRepairKit("advanced", 1.0F, 0.2F, 0.05F); public static Block repair_ornate = new BlockRepairKit("ornate", 1.0F, 0.25F, 0.03F).setOrnate(0.5F); - + public static Block bellows = new BlockBellows(); - - public static Block refined_planks = new BasicBlockMF("refined_planks", Material.wood).setHardness(2.5F).setResistance(10F).setStepSound(Block.soundTypeWood); - public static Block nailed_planks = new BasicBlockMF("nailed_planks", Material.wood).setHardness(1.5F).setResistance(7F).setStepSound(Block.soundTypeWood); - public static Block refined_planks_stair = new ConstructionBlockMF.StairsConstBlock("refined_planks_stair", refined_planks).register("refined_planks_stair"); - public static Block nailed_planks_stair = new ConstructionBlockMF.StairsConstBlock("nailed_planks_stair", nailed_planks).register("nailed_planks_stair"); - - public static Block reinforced_stone = new BlockReinforcedStone("reinforced_stone", "base", "engraved", "dshall_0", "dshall_1", "dshall_2").setHardness(2.0F).setResistance(15F).setStepSound(Block.soundTypeStone); - public static Block reinforced_stone_bricks = new BlockReinforcedStone("reinforced_stone_bricks", "base", "mossy", "cracked").setHardness(2.0F).setResistance(15F).setStepSound(Block.soundTypeStone); - public static Block reinforced_stone_framed = new BasicBlockMF("reinforced_stone_framed", Material.rock).setHardness(2.5F).setResistance(20F).setStepSound(Block.soundTypeStone); - public static Block reinforced_stone_framediron = new BasicBlockMF("reinforced_stone_framediron", Material.rock).setHardness(2.5F).setResistance(20F).setStepSound(Block.soundTypeStone).setBlockName("reinforced_stone_framed"); - + + public static Block refined_planks = new BasicBlockMF("refined_planks", Material.wood).setHardness(2.5F) + .setResistance(10F).setStepSound(Block.soundTypeWood); + public static Block nailed_planks = new BasicBlockMF("nailed_planks", Material.wood).setHardness(1.5F) + .setResistance(7F).setStepSound(Block.soundTypeWood); + public static Block refined_planks_stair = new ConstructionBlockMF.StairsConstBlock("refined_planks_stair", + refined_planks).register("refined_planks_stair"); + public static Block nailed_planks_stair = new ConstructionBlockMF.StairsConstBlock("nailed_planks_stair", + nailed_planks).register("nailed_planks_stair"); + + public static Block reinforced_stone = new BlockReinforcedStone("reinforced_stone", "base", "engraved", "dshall_0", + "dshall_1", "dshall_2").setHardness(2.0F).setResistance(15F).setStepSound(Block.soundTypeStone); + public static Block reinforced_stone_bricks = new BlockReinforcedStone("reinforced_stone_bricks", "base", "mossy", + "cracked").setHardness(2.0F).setResistance(15F).setStepSound(Block.soundTypeStone); + public static Block reinforced_stone_framed = new BasicBlockMF("reinforced_stone_framed", Material.rock) + .setHardness(2.5F).setResistance(20F).setStepSound(Block.soundTypeStone); + public static Block reinforced_stone_framediron = new BasicBlockMF("reinforced_stone_framediron", Material.rock) + .setHardness(2.5F).setResistance(20F).setStepSound(Block.soundTypeStone) + .setBlockName("reinforced_stone_framed"); + public static Block advTanner = new BlockTanningRack(1, "Strong"); public static Block research = new BlockResearchStation(); public static Block trough_wood = new BlockTrough("trough_wood"); public static Block engTanner = new BlockEngineerTanner(2, "Metal"); - + public static Block bombPress = new BlockBombPress(); - + public static Block road = new BlockRoad("road_mf", 14F); public static Block lowroad = new BlockRoad("road_mf_short", 7F); - + public static Block salvage_basic = new BlockSalvage("basic", 1.0F); public static Block bloomery = new BlockBloomery(); public static Block log_yew = new BlockLogMF("yew").setHardness(2F).setResistance(6F); public static Block log_ironbark = new BlockLogMF("ironbark").setHardness(3F).setResistance(8F); public static Block log_ebony = new BlockLogMF("ebony").setHardness(5F).setResistance(10F); - + public static Block leaves_yew = new BlockLeavesMF("yew", 100); public static Block leaves_ironbark = new BlockLeavesMF("ironbark", 40).setHardness(0.3F); public static Block leaves_ebony = new BlockLeavesMF("ebony", 1000).setHardness(0.5F); - + public static Block sapling_yew = new BlockSaplingMF("yew", log_yew, leaves_yew, 4F); public static Block sapling_ironbark = new BlockSaplingMF("ironbark", log_ironbark, leaves_ironbark, 8F); public static Block sapling_ebony = new BlockSaplingMF("ebony", log_ebony, leaves_ebony, 10F); - - public static Block yew_planks = new BasicBlockMF("yew_planks", Material.wood).setHardness(3F).setResistance(6F).setStepSound(Block.soundTypeWood); - public static Block ironbark_planks = new BasicBlockMF("ironbark_planks", Material.wood).setHardness(4F).setResistance(10F).setStepSound(Block.soundTypeWood); - public static Block ebony_planks = new BasicBlockMF("ebony_planks", Material.wood).setHardness(6F).setResistance(12F).setStepSound(Block.soundTypeWood); - + + public static Block yew_planks = new BasicBlockMF("yew_planks", Material.wood).setHardness(3F).setResistance(6F) + .setStepSound(Block.soundTypeWood); + public static Block ironbark_planks = new BasicBlockMF("ironbark_planks", Material.wood).setHardness(4F) + .setResistance(10F).setStepSound(Block.soundTypeWood); + public static Block ebony_planks = new BasicBlockMF("ebony_planks", Material.wood).setHardness(6F) + .setResistance(12F).setStepSound(Block.soundTypeWood); + public static Block quern = new BlockQuern("quern"); - - public static Block mud_brick_stair = new ConstructionBlockMF.StairsConstBlock("mud_brick_stair", mud_brick).register("mud_brick_stair"); - public static Block mud_pavement_stair = new ConstructionBlockMF.StairsConstBlock("mud_pavement_stair", mud_pavement).register("mud_pavement_stair"); - public static Block cobble_brick_stair = new ConstructionBlockMF.StairsConstBlock("cobble_brick_stair", cobble_brick).register("cobble_brick_stair"); - public static Block cobble_pavement_stair = new ConstructionBlockMF.StairsConstBlock("cobble_pavement_stair", cobble_pavement).register("cobble_pavement_stair"); - public static Block firebrick_stair = new ConstructionBlockMF.StairsConstBlock("firebrick_stair", firebricks).register("firebrick_stair"); - public static Block reinforced_stone_stair = new ConstructionBlockMF.StairsConstBlock("reinforced_stone_stair", reinforced_stone).register("reinforced_stone_stair"); - public static Block reinforced_stone_brick_stair = new ConstructionBlockMF.StairsConstBlock("reinforced_stone_brick_stair", reinforced_stone_bricks).register("reinforced_stone_brick_stair"); - - public static Block yew_stair = new ConstructionBlockMF.StairsConstBlock("yew_stair", yew_planks).register("yew_stair"); - public static Block ironbark_stair = new ConstructionBlockMF.StairsConstBlock("ironbark_stair", ironbark_planks).register("ironbark_stair"); - public static Block ebony_stair = new ConstructionBlockMF.StairsConstBlock("ebony_stair", ebony_planks).register("ebony_stair"); - + + public static Block mud_brick_stair = new ConstructionBlockMF.StairsConstBlock("mud_brick_stair", mud_brick) + .register("mud_brick_stair"); + public static Block mud_pavement_stair = new ConstructionBlockMF.StairsConstBlock("mud_pavement_stair", + mud_pavement).register("mud_pavement_stair"); + public static Block cobble_brick_stair = new ConstructionBlockMF.StairsConstBlock("cobble_brick_stair", + cobble_brick).register("cobble_brick_stair"); + public static Block cobble_pavement_stair = new ConstructionBlockMF.StairsConstBlock("cobble_pavement_stair", + cobble_pavement).register("cobble_pavement_stair"); + public static Block firebrick_stair = new ConstructionBlockMF.StairsConstBlock("firebrick_stair", firebricks) + .register("firebrick_stair"); + public static Block reinforced_stone_stair = new ConstructionBlockMF.StairsConstBlock("reinforced_stone_stair", + reinforced_stone).register("reinforced_stone_stair"); + public static Block reinforced_stone_brick_stair = new ConstructionBlockMF.StairsConstBlock( + "reinforced_stone_brick_stair", reinforced_stone_bricks).register("reinforced_stone_brick_stair"); + + public static Block yew_stair = new ConstructionBlockMF.StairsConstBlock("yew_stair", yew_planks) + .register("yew_stair"); + public static Block ironbark_stair = new ConstructionBlockMF.StairsConstBlock("ironbark_stair", ironbark_planks) + .register("ironbark_stair"); + public static Block ebony_stair = new ConstructionBlockMF.StairsConstBlock("ebony_stair", ebony_planks) + .register("ebony_stair"); + public static Block firepit = new BlockFirepit(); public static Block roast = new BlockRoast(0, "basic", false); public static Block oven_stone = new BlockRoast(0, "basic", true); - + public static Block furnace_heater = new BlockBigFurnace("furnace_heater", true, -1); public static Block furnace_stone = new BlockBigFurnace("furnace_stone", false, 0); - + public static Block rack_wood = new BlockRack("rack_wood"); - public static Block food_box_basic = new BlockAmmoBox("food_box_basic", (byte)0); - public static Block ammo_box_basic = new BlockAmmoBox("ammo_box_basic", (byte)1); - public static Block crate_basic = new BlockAmmoBox("crate_basic", (byte)2); - + public static Block food_box_basic = new BlockAmmoBox("food_box_basic", (byte) 0); + public static Block ammo_box_basic = new BlockAmmoBox("ammo_box_basic", (byte) 1); + public static Block crate_basic = new BlockAmmoBox("crate_basic", (byte) 2); + public static Block bedroll = new BlockBedMF("bedroll"); public static Block cogwork_helm = new BlockCogwork("cogwork_helm", false); public static Block cogwork_legs = new BlockCogwork("cogwork_legs", false); public static Block cogwork_chest = new BlockCogwork("cogwork_chest", true); public static Block frame_block = new BlockFrame("frame_block"); public static Block cogwork_builder = new BlockFrame("cogwork_builder", frame_block).setCogworkHolder(); - + public static Block cruciblemythic = new BlockCrucible("mythic", 2, false).setAuto().setBlockUnbreakable(); - public static Block cruciblemythic_active = new BlockCrucible("mythic", 2, true).setAuto().setBlockUnbreakable().setLightLevel(12F); + public static Block cruciblemythic_active = new BlockCrucible("mythic", 2, true).setAuto().setBlockUnbreakable() + .setLightLevel(12F); public static Block cruciblemaster = new BlockCrucible("master", 3, false).setAuto().setBlockUnbreakable(); - public static Block cruciblemaster_active = new BlockCrucible("master", 3, true).setAuto().setBlockUnbreakable().setLightLevel(12F); - + public static Block cruciblemaster_active = new BlockCrucible("master", 3, true).setAuto().setBlockUnbreakable() + .setLightLevel(12F); + public static Block mythic_decor = new BlockMythicDecor(); public static Block WG_Mark = new BlockWorldGenMarker(); public static Block components = new BlockComponent(); public static Block schematic_general = new BlockSchematic("schematic_general"); - public static void load() - { + + public static void load() { anvilStone = new BlockAnvilMF(BaseMaterialMF.getMaterial("stone")); - //5:20 default planks + // 5:20 default planks Blocks.fire.setFireInfo(refined_planks, 3, 10); - Blocks.fire.setFireInfo(log_ironbark, 2, 8);//IRONBARK: Logs are resistant to fire but raw planks are not + Blocks.fire.setFireInfo(log_ironbark, 2, 8);// IRONBARK: Logs are resistant to fire but raw planks are not Blocks.fire.setFireInfo(ironbark_planks, 5, 30); - Blocks.fire.setFireInfo(log_ebony, 3, 10);//EBONY: Resistant + Blocks.fire.setFireInfo(log_ebony, 3, 10);// EBONY: Resistant Blocks.fire.setFireInfo(ebony_planks, 3, 10); - - for(int a = 0; a < specialMetalBlocks.length; a++) - { + + for (int a = 0; a < specialMetalBlocks.length; a++) { BaseMaterialMF material = BaseMaterialMF.getMaterial(specialMetalBlocks[a]); - if(material != null) - { + if (material != null) { bars[a] = new BlockMetalBarsMF(material); } } - for(int a = 0; a < metalBlocks.length; a++) - { + for (int a = 0; a < metalBlocks.length; a++) { BaseMaterialMF material = BaseMaterialMF.getMaterial(metalBlocks[a]); - if(material != null) - { + if (material != null) { storage[a] = new BlockMetalMF(material); } } - for(int a = 0; a < anvils.length; a++) - { + for (int a = 0; a < anvils.length; a++) { BaseMaterialMF material = BaseMaterialMF.getMaterial(anvils[a]); - if(material != null) - { + if (material != null) { anvil[a] = new BlockAnvilMF(material); } } - + OreDictionary.registerOre("cobblestone", new ItemStack(limestone, 1, 1)); OreDictionary.registerOre("stone", new ItemStack(limestone, 1, 0)); OreDictionary.registerOre("limestone", new ItemStack(limestone, 1, OreDictionary.WILDCARD_VALUE)); OreDictionary.registerOre("cobblestone", new ItemStack(cobble_brick, 1, OreDictionary.WILDCARD_VALUE)); OreDictionary.registerOre("cobblestone", new ItemStack(cobble_pavement, 1, OreDictionary.WILDCARD_VALUE)); - + OreDictionary.registerOre("blockGlass", new ItemStack(window, 1, OreDictionary.WILDCARD_VALUE)); OreDictionary.registerOre("blockGlass", new ItemStack(framed_glass, 1, OreDictionary.WILDCARD_VALUE)); OreDictionary.registerOre("paneGlass", new ItemStack(window_pane, 1, OreDictionary.WILDCARD_VALUE)); OreDictionary.registerOre("paneGlass", new ItemStack(framed_pane, 1, OreDictionary.WILDCARD_VALUE)); - + OreDictionary.registerOre("planksOakWood", new ItemStack(Blocks.planks, 1, 0)); OreDictionary.registerOre("planksSpruceWood", new ItemStack(Blocks.planks, 1, 1)); OreDictionary.registerOre("planksBirchWood", new ItemStack(Blocks.planks, 1, 2)); OreDictionary.registerOre("planksJungleWood", new ItemStack(Blocks.planks, 1, 3)); OreDictionary.registerOre("planksAcaciaWood", new ItemStack(Blocks.planks, 1, 4)); OreDictionary.registerOre("planksDarkOakWood", new ItemStack(Blocks.planks, 1, 5)); - + OreDictionary.registerOre("planksIronbarkWood", ironbark_planks); OreDictionary.registerOre("planksEbonyWood", ebony_planks); OreDictionary.registerOre("planksYewWood", yew_planks); OreDictionary.registerOre("planksIronbarkWood", ironbark_planks); OreDictionary.registerOre("planksEbonyWood", ebony_planks); OreDictionary.registerOre("planksYewWood", yew_planks); - - for(ItemStack plank: OreDictionary.getOres("plankWood")) - { - if(plank.getItem().getClass().getName().contains("BlockWoodenDevice")) - { - if(plank.getUnlocalizedName().equalsIgnoreCase("tile.blockWoodenDevice.6")) - { + + for (ItemStack plank : OreDictionary.getOres("plankWood")) { + if (plank.getItem().getClass().getName().contains("BlockWoodenDevice")) { + if (plank.getUnlocalizedName().equalsIgnoreCase("tile.blockWoodenDevice.6")) { OreDictionary.registerOre("planksGreatwoodWood", plank); } - if(plank.getUnlocalizedName().equalsIgnoreCase("tile.blockWoodenDevice.7")) - { + if (plank.getUnlocalizedName().equalsIgnoreCase("tile.blockWoodenDevice.7")) { OreDictionary.registerOre("planksSilverwoodWood", plank); } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockBFC.java b/src/main/java/minefantasy/mf2/block/refining/BlockBFC.java index b766fe42..e88fb7c7 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockBFC.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockBFC.java @@ -7,7 +7,6 @@ import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.knowledge.ResearchLogic; -import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.knowledge.KnowledgeListMF; @@ -17,7 +16,6 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -26,125 +24,111 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class BlockBFC extends BlockContainer -{ +public class BlockBFC extends BlockContainer { private Random rand = new Random(); public IIcon bottomTex; public IIcon sideTex; - public BlockBFC() - { + + public BlockBFC() { super(Material.anvil); - GameRegistry.registerBlock(this, "MF_BlastChamber"); + GameRegistry.registerBlock(this, "MF_BlastChamber"); setBlockName("blastfurnchamber"); this.setStepSound(Block.soundTypeMetal); this.setHardness(8F); this.setResistance(10F); - this.setCreativeTab(CreativeTabMF.tabUtil); + this.setCreativeTab(CreativeTabMF.tabUtil); } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityBlastFC(); } - - private TileEntityBlastFC getTile(IBlockAccess world, int x, int y, int z) - { - return (TileEntityBlastFC)world.getTileEntity(x, y, z); + + private TileEntityBlastFC getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityBlastFC) world.getTileEntity(x, y, z); } - + @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) - { + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) { TileEntityBlastFC tile = getTile(world, x, y, z); - if(tile != null)tile.updateBuild(); - } + if (tile != null) + tile.updateBuild(); + } + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityBlastFC tile = getTile(world, x, y, z); - if (tile != null) - { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - if(side == 1 || side == 0) - { + public IIcon getIcon(int side, int meta) { + if (side == 1 || side == 0) { return bottomTex; } return sideTex; } - + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - if(!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.blastfurn)) - { - if(world.isRemote) - user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.blastfurn)) { + if (world.isRemote) + user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); return false; - } + } TileEntityBlastFC tile = getTile(world, x, y, z); - if(tile != null) - { - if(!world.isRemote) - { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - + if (tile != null) { + if (!world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { + public void registerBlockIcons(IIconRegister reg) { sideTex = reg.registerIcon("minefantasy2:processor/blast_chamber_side"); bottomTex = reg.registerIcon("minefantasy2:processor/blast_chamber_top"); } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockBFH.java b/src/main/java/minefantasy/mf2/block/refining/BlockBFH.java index 7927f05c..96f39694 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockBFH.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockBFH.java @@ -9,7 +9,6 @@ import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFH; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.knowledge.KnowledgeListMF; @@ -20,7 +19,6 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.item.EntityItem; 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; @@ -30,183 +28,162 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class BlockBFH extends BlockContainer -{ +public class BlockBFH extends BlockContainer { private static boolean keepInventory; private Random rand = new Random(); public IIcon bottomTex; public IIcon sideTex; public boolean isActive; - public BlockBFH(boolean isActive) - { + + public BlockBFH(boolean isActive) { super(Material.anvil); this.isActive = isActive; - GameRegistry.registerBlock(this, isActive ? "MF_BlastHeaterActive" : "MF_BlastHeater"); + GameRegistry.registerBlock(this, isActive ? "MF_BlastHeaterActive" : "MF_BlastHeater"); setBlockName("blastfurnheater"); this.setStepSound(Block.soundTypeMetal); this.setHardness(10F); this.setResistance(10F); - this.setCreativeTab(CreativeTabMF.tabUtil); + this.setCreativeTab(CreativeTabMF.tabUtil); } - + @Override @SideOnly(Side.CLIENT) - public void randomDisplayTick(World world, int x, int y, int z, Random rand) - { - if (isActive && rand.nextInt(20) == 0) - { - world.playSound((double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), "fire.fire", 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F, false); - } - } + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + if (isActive && rand.nextInt(20) == 0) { + world.playSound(x + 0.5F, y + 0.5F, z + 0.5F, "fire.fire", 1.0F + rand.nextFloat(), + rand.nextFloat() * 0.7F + 0.3F, false); + } + } @Override - public void getSubBlocks(Item item, CreativeTabs tab, List list) - { - if(!isActive) - { + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + if (!isActive) { super.getSubBlocks(item, tab, list); } - } - + } + @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityBlastFH(); } - - private TileEntityBlastFH getTile(IBlockAccess world, int x, int y, int z) - { - return (TileEntityBlastFH)world.getTileEntity(x, y, z); + + private TileEntityBlastFH getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityBlastFH) world.getTileEntity(x, y, z); } - + @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) - { + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) { TileEntityBlastFH tile = getTile(world, x, y, z); - if(tile != null)tile.updateBuild(); - } + if (tile != null) + tile.updateBuild(); + } + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { - if(keepInventory)return; - + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + if (keepInventory) + return; + TileEntityBlastFH tile = getTile(world, x, y, z); - if (tile != null) - { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - if(side == 1 || side == 0) - { + public IIcon getIcon(int side, int meta) { + if (side == 1 || side == 0) { return bottomTex; } return sideTex; } - + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - if(!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.blastfurn)) - { - if(world.isRemote) - user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.blastfurn)) { + if (world.isRemote) + user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); return false; - } + } TileEntityBlastFH tile = getTile(world, x, y, z); - if(tile != null) - { - if(!world.isRemote) - { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) - { - int l = world.getBlockMetadata(x, y, z); - TileEntity tileentity = world.getTileEntity(x, y, z); - keepInventory = true; - - if (state) - { - world.setBlock(x, y, z, BlockListMF.blast_heater_active); - } - else - { - world.setBlock(x, y, z, BlockListMF.blast_heater); - } - - keepInventory = false; - world.setBlockMetadataWithNotify(x, y, z, l, 2); - - if (tileentity != null) - { - tileentity.validate(); - world.setTileEntity(x, y, z, tileentity); - } - } - + if (tile != null) { + if (!world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) { + int l = world.getBlockMetadata(x, y, z); + TileEntity tileentity = world.getTileEntity(x, y, z); + keepInventory = true; + + if (state) { + world.setBlock(x, y, z, BlockListMF.blast_heater_active); + } else { + world.setBlock(x, y, z, BlockListMF.blast_heater); + } + + keepInventory = false; + world.setBlockMetadataWithNotify(x, y, z, l, 2); + + if (tileentity != null) { + tileentity.validate(); + world.setTileEntity(x, y, z, tileentity); + } + } + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - sideTex = isActive ? reg.registerIcon("minefantasy2:processor/blast_heater_active") : reg.registerIcon("minefantasy2:processor/blast_heater"); + public void registerBlockIcons(IIconRegister reg) { + sideTex = isActive ? reg.registerIcon("minefantasy2:processor/blast_heater_active") + : reg.registerIcon("minefantasy2:processor/blast_heater"); bottomTex = reg.registerIcon("minefantasy2:processor/blast_chamber_top"); } - + @Override @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) - { - return Item.getItemFromBlock(BlockListMF.blast_heater); - } + public Item getItem(World world, int x, int y, int z) { + return Item.getItemFromBlock(BlockListMF.blast_heater); + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockBellows.java b/src/main/java/minefantasy/mf2/block/refining/BlockBellows.java index 213181f0..4c423f90 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockBellows.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockBellows.java @@ -2,6 +2,9 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.tileentity.TileEntityBellows; import minefantasy.mf2.item.list.CreativeTabMF; import net.minecraft.block.BlockContainer; @@ -15,80 +18,72 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; /** * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class BlockBellows extends BlockContainer -{ +public class BlockBellows extends BlockContainer { public static int bellows_RI = 105; - - private Random rand = new Random(); - public BlockBellows() - { - super(Material.wood); - GameRegistry.registerBlock(this, "MF_Bellows"); + private Random rand = new Random(); + + public BlockBellows() { + super(Material.wood); + GameRegistry.registerBlock(this, "MF_Bellows"); setBlockName("bellows"); this.setHardness(1F); this.setResistance(0.5F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - @Override - public boolean isOpaqueCube() - { - return false; - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - @Override - public IIcon getIcon(int side, int meta) - { - return Blocks.planks.getIcon(side, 0); - } - @SideOnly(Side.CLIENT) - public int getRenderType() - { - return bellows_RI; - } + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @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 user, ItemStack item) - { - int direction = MathHelper.floor_double((double)(user.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + @Override + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); + } - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } + @SideOnly(Side.CLIENT) + public int getRenderType() { + return bellows_RI; + } - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, float f2) - { - TileEntityBellows bellows = (TileEntityBellows)world.getTileEntity(x, y, z); - if(bellows != null) - { - bellows.interact(player, 2F); - } - return true; - } + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + TileEntityBellows bellows = (TileEntityBellows) world.getTileEntity(x, y, z); + if (bellows != null) { + bellows.interact(player, 2F); + } + return true; + } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityBellows(); } - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg){} + @Override + public void registerBlockIcons(IIconRegister reg) { + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockBigFurnace.java b/src/main/java/minefantasy/mf2/block/refining/BlockBigFurnace.java index a8dfba0d..fdc99ff2 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockBigFurnace.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockBigFurnace.java @@ -24,173 +24,156 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockBigFurnace extends BlockContainer -{ - /** - * Is the random generator used by furnace to drop the inventory contents in random directions. - */ - private Random rand = new Random(); - public final boolean isHeater; - public final int tier; - - /** - * This flag is used to prevent the furnace inventory to be dropped upon block removal, is used internally when the - * furnace block changes from idle to active and vice-versa. - */ - private static boolean keepFurnaceInventory = false; +public class BlockBigFurnace extends BlockContainer { + /** + * Is the random generator used by furnace to drop the inventory contents in + * random directions. + */ + private Random rand = new Random(); + public final boolean isHeater; + public final int tier; + + /** + * This flag is used to prevent the furnace inventory to be dropped upon block + * removal, is used internally when the furnace block changes from idle to + * active and vice-versa. + */ + private static boolean keepFurnaceInventory = false; public static int furn_RI = 114; - public BlockBigFurnace(String name, boolean isHeater, int tier) - { - super(Material.rock); - this.isHeater = isHeater; - this.tier = tier; - this.setCreativeTab(CreativeTabMF.tabUtil); - GameRegistry.registerBlock(this, name); + public BlockBigFurnace(String name, boolean isHeater, int tier) { + super(Material.rock); + this.isHeater = isHeater; + this.tier = tier; + this.setCreativeTab(CreativeTabMF.tabUtil); + GameRegistry.registerBlock(this, name); setBlockName(name); this.setStepSound(Block.soundTypeStone); this.setHardness(3.5F); this.setResistance(2F); - } - - @Override - public IIcon getIcon(int side, int meta) - { - return BlockListMF.firebricks.getIcon(side, meta); - } - - public boolean isOpaqueCube() { - return false; - } - - public boolean renderAsNormalBlock() { - return false; - } - - - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) - { - TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null && tile instanceof TileEntityBigFurnace) - { - if(((TileEntityBigFurnace)tile).isBurning()) - { - return 10; - } - } - return super.getLightValue(world, x, y, z); - } - /** - * Called whenever the block is added into the world. Args: world, x, y, z - */ - public void onBlockAdded(World world, int x, int y, int z) - { - super.onBlockAdded(world, x, y, z); - } - @Override - @SideOnly(Side.CLIENT) - public int getRenderType() - { - return furn_RI; - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, float f2) - { - if (world.isRemote) - { - return true; - } - else - { - TileEntityBigFurnace tile = (TileEntityBigFurnace)world.getTileEntity(x, y, z); - - ItemStack item = player.getHeldItem(); - - if (tile != null) - { - player.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - - return true; - } - } - - /** - - /** - * Returns the TileEntity used by this block. - */ - public TileEntity createNewTileEntity(World world, int meta) - { - return new TileEntityBigFurnace(); - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item) { - int dir = MathHelper.floor_double((double) (entity.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, dir, 2); - } - - /** - * Called whenever the block is removed. - */ - @Override - public void breakBlock(World world, int x, int y, int z, Block i1, int i2) - { - if (!keepFurnaceInventory) - { - TileEntityBigFurnace tile = (TileEntityBigFurnace)world.getTileEntity(x, y, z); - - if (tile != null) - { - for (int var6 = 0; var6 < tile.getSizeInventory(); ++var6) - { - ItemStack var7 = tile.getStackInSlot(var6); - - if (var7 != null) - { - float var8 = this.rand.nextFloat() * 0.8F + 0.1F; - float var9 = this.rand.nextFloat() * 0.8F + 0.1F; - float var10 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (var7.stackSize > 0) - { - int var11 = this.rand.nextInt(21) + 10; - - if (var11 > var7.stackSize) - { - var11 = var7.stackSize; - } - - var7.stackSize -= var11; - EntityItem var12 = new EntityItem(world, (double)((float)x + var8), (double)((float)y + var9), (double)((float)z + var10), new ItemStack(var7.getItem(), var11, var7.getItemDamage())); - - if (var7.hasTagCompound()) - { - var12.getEntityItem().setTagCompound((NBTTagCompound)var7.getTagCompound().copy()); - } - - float var13 = 0.05F; - var12.motionX = (double)((float)this.rand.nextGaussian() * var13); - var12.motionY = (double)((float)this.rand.nextGaussian() * var13 + 0.2F); - var12.motionZ = (double)((float)this.rand.nextGaussian() * var13); - world.spawnEntityInWorld(var12); - } - } - } - } - } - - super.breakBlock(world, x, y, z, i1, i2); - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg){} + } + + @Override + public IIcon getIcon(int side, int meta) { + return BlockListMF.firebricks.getIcon(side, meta); + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getLightValue(IBlockAccess world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityBigFurnace) { + if (((TileEntityBigFurnace) tile).isBurning()) { + return 10; + } + } + return super.getLightValue(world, x, y, z); + } + + /** + * Called whenever the block is added into the world. Args: world, x, y, z + */ + public void onBlockAdded(World world, int x, int y, int z) { + super.onBlockAdded(world, x, y, z); + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderType() { + return furn_RI; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + if (world.isRemote) { + return true; + } else { + TileEntityBigFurnace tile = (TileEntityBigFurnace) world.getTileEntity(x, y, z); + + ItemStack item = player.getHeldItem(); + + if (tile != null) { + player.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + + return true; + } + } + + /** + * + * /** Returns the TileEntity used by this block. + */ + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityBigFurnace(); + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item) { + int dir = MathHelper.floor_double(entity.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, dir, 2); + } + + /** + * Called whenever the block is removed. + */ + @Override + public void breakBlock(World world, int x, int y, int z, Block i1, int i2) { + if (!keepFurnaceInventory) { + TileEntityBigFurnace tile = (TileEntityBigFurnace) world.getTileEntity(x, y, z); + + if (tile != null) { + for (int var6 = 0; var6 < tile.getSizeInventory(); ++var6) { + ItemStack var7 = tile.getStackInSlot(var6); + + if (var7 != null) { + float var8 = this.rand.nextFloat() * 0.8F + 0.1F; + float var9 = this.rand.nextFloat() * 0.8F + 0.1F; + float var10 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (var7.stackSize > 0) { + int var11 = this.rand.nextInt(21) + 10; + + if (var11 > var7.stackSize) { + var11 = var7.stackSize; + } + + var7.stackSize -= var11; + EntityItem var12 = new EntityItem(world, x + var8, y + var9, z + var10, + new ItemStack(var7.getItem(), var11, var7.getItemDamage())); + + if (var7.hasTagCompound()) { + var12.getEntityItem().setTagCompound((NBTTagCompound) var7.getTagCompound().copy()); + } + + float var13 = 0.05F; + var12.motionX = (float) this.rand.nextGaussian() * var13; + var12.motionY = (float) this.rand.nextGaussian() * var13 + 0.2F; + var12.motionZ = (float) this.rand.nextGaussian() * var13; + world.spawnEntityInWorld(var12); + } + } + } + } + } + + super.breakBlock(world, x, y, z, i1, i2); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockBloomery.java b/src/main/java/minefantasy/mf2/block/refining/BlockBloomery.java index 82819734..16ec8c5a 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockBloomery.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockBloomery.java @@ -6,183 +6,159 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.api.knowledge.ResearchLogic; -import minefantasy.mf2.api.tool.ILighter; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.tileentity.TileEntityBloomery; -import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.tool.ItemLighterMF; -import minefantasy.mf2.knowledge.KnowledgeListMF; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemFlintAndSteel; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class BlockBloomery extends BlockContainer -{ +public class BlockBloomery extends BlockContainer { public static int bloomery_RI = 109; - + private Random rand = new Random(); public IIcon bottomTex; public IIcon sideTex; - public BlockBloomery() - { + + public BlockBloomery() { super(Material.rock); - GameRegistry.registerBlock(this, "MF_Bloomery"); + GameRegistry.registerBlock(this, "MF_Bloomery"); setBlockName("bloomery"); this.setStepSound(Block.soundTypeStone); this.setHardness(8F); this.setResistance(10F); - this.setCreativeTab(CreativeTabMF.tabUtil); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean isOpaqueCube() { + return false; } + @Override - public boolean isOpaqueCube() - { - return false; - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } + public boolean renderAsNormalBlock() { + return false; + } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityBloomery(); } - - private TileEntityBloomery getTile(IBlockAccess world, int x, int y, int z) - { - return (TileEntityBloomery)world.getTileEntity(x, y, z); + + private TileEntityBloomery getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityBloomery) world.getTileEntity(x, y, z); } - + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityBloomery tile = getTile(world, x, y, z); - if (tile != null) - { - for (int i1 = 0; i1 < (tile.getSizeInventory()-1); ++i1)//breaking does not retrieve the result - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - + if (tile != null) { + for (int i1 = 0; i1 < (tile.getSizeInventory() - 1); ++i1)// breaking does not retrieve the result + { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { TileEntityBloomery tile = getTile(world, x, y, z); - if(tile != null) - { - ItemStack held = user.getHeldItem(); - - //Hammer - if(!user.isSwingInProgress && tile.tryHammer(user)) - { - return true; - } - //Light - int l = ItemLighterMF.tryUse(held, user); - if(!tile.isActive && !tile.hasBloom()) - { - if(held != null && l != 0) - { - user.playSound("fire.ignite", 1.0F, 1.0F); - if(world.isRemote)return true; - if(l == 1 && tile.light(user)) - { - held.damageItem(1, user); - } + if (tile != null) { + ItemStack held = user.getHeldItem(); + + // Hammer + if (!user.isSwingInProgress && tile.tryHammer(user)) { + return true; + } + // Light + int l = ItemLighterMF.tryUse(held, user); + if (!tile.isActive && !tile.hasBloom()) { + if (held != null && l != 0) { + user.playSound("fire.ignite", 1.0F, 1.0F); + if (world.isRemote) + return true; + if (l == 1 && tile.light(user)) { + held.damageItem(1, user); + } return true; } - } - //GUI - if(!world.isRemote && !tile.isActive && !tile.hasBloom()) - { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } + } + // GUI + if (!world.isRemote && !tile.isActive && !tile.hasBloom()) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) - { + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { TileEntityBloomery tile = getTile(world, x, y, z); - if(tile != null) - { - if(user.swingProgress <= 0.1F) - { - tile.tryHammer(user); - } - } - } - + if (tile != null) { + if (user.swingProgress <= 0.1F) { + tile.tryHammer(user); + } + } + } + @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg){} - @Override - public IIcon getIcon(int side, int meta) - { - return BlockListMF.crucible.getIcon(side, 0); - } - @SideOnly(Side.CLIENT) - public int getRenderType() - { - return bloomery_RI; - } + public void registerBlockIcons(IIconRegister reg) { + } + + @Override + public IIcon getIcon(int side, int meta) { + return BlockListMF.crucible.getIcon(side, 0); + } + + @SideOnly(Side.CLIENT) + public int getRenderType() { + return bloomery_RI; + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockChimney.java b/src/main/java/minefantasy/mf2/block/refining/BlockChimney.java index cb86e9e4..3c4ce2bf 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockChimney.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockChimney.java @@ -1,41 +1,23 @@ package minefantasy.mf2.block.refining; -import java.util.ArrayList; -import java.util.List; import java.util.Random; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.tileentity.TileEntityChimney; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.knowledge.KnowledgeListMF; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class BlockChimney extends BlockContainer -{ +public class BlockChimney extends BlockContainer { private Random rand = new Random(); public IIcon bottomTex; public IIcon sideTex; @@ -46,141 +28,113 @@ public class BlockChimney extends BlockContainer */ public boolean isIndirect; private String chimneyType; - public BlockChimney(String type, boolean wide, boolean indirect, int size) - { + + public BlockChimney(String type, boolean wide, boolean indirect, int size) { super(Material.rock); this.isIndirect = indirect; isWide = wide; this.chimneyType = type; this.size = size; - if(wide) - { + if (wide) { this.setLightOpacity(255); + } else { + this.setBlockBounds(1F / 4F, 0, 1F / 4F, 3F / 4F, 1F, 3F / 4F); } - else - { - this.setBlockBounds(1F/4F, 0, 1F/4F, 3F/4F, 1F, 3F/4F); - } - GameRegistry.registerBlock(this, "MF_Chimney_" + type + (isWide ? "_Wide" : "_Thin")); - setBlockName("chimney."+type + (isWide ? ".wide" : "")); + GameRegistry.registerBlock(this, "MF_Chimney_" + type + (isWide ? "_Wide" : "_Thin")); + setBlockName("chimney." + type + (isWide ? ".wide" : "")); this.setStepSound(Block.soundTypeMetal); this.setHardness(5F); this.setResistance(10F); - this.setCreativeTab(CreativeTabMF.tabUtil); + this.setCreativeTab(CreativeTabMF.tabUtil); } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityChimney(); } - - private TileEntityChimney getTile(IBlockAccess world, int x, int y, int z) - { - return (TileEntityChimney)world.getTileEntity(x, y, z); + + private TileEntityChimney getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityChimney) world.getTileEntity(x, y, z); } - public boolean isWideChimney() - { + + public boolean isWideChimney() { return isWide; } + @Override - public boolean isOpaqueCube() - { + public boolean isOpaqueCube() { return isWide; } + @Override - public boolean renderAsNormalBlock() - { + public boolean renderAsNormalBlock() { return isWide; } - + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - if(isPipe) - { + public IIcon getIcon(int side, int meta) { + if (isPipe) { return BlockListMF.reinforced_stone.getIcon(side, meta); } - if(side == 1 || side == 0) - { + if (side == 1 || side == 0) { return bottomTex; } return sideTex; } - + /* * - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) - { - TileEntityChimney chimney = (TileEntityChimney)world.getTileEntity(x, y, z); - if(chimney != null && chimney.maskBlock != null && chimney.maskBlock != Blocks.air) - { - return chimney.maskBlock.getIcon(side, chimney.maskMeta); - } - return getIcon(side, world.getBlockMetadata(x, y, z)); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { - int m = world.getBlockMetadata(x, y, z); - TileEntityChimney chimney = getTile(world, x, y, z); - - if(chimney != null) - { - ItemStack held = user.getHeldItem(); - if(!world.isRemote && held != null && held.getItem() instanceof ItemBlock) - { - ItemBlock item = (ItemBlock)held.getItem(); - if(item.field_150939_a.isNormalCube()) - { - chimney.maskBlock = item.field_150939_a; - chimney.maskMeta = item.getMetadata(held.getItemDamage()); - chimney.sync(); - world.setBlock(x, y, z, BlockListMF.chimney_wide, m, 2); - return true; - } - } - } - return false; - } - @Override - public void getSubBlocks(Item item, CreativeTabs tab, List list) - { - if(!isWide) - { - super.getSubBlocks(item, tab, list); - } - } - */ + * @SideOnly(Side.CLIENT) public IIcon getIcon(IBlockAccess world, int x, int y, + * int z, int side) { TileEntityChimney chimney = + * (TileEntityChimney)world.getTileEntity(x, y, z); if(chimney != null && + * chimney.maskBlock != null && chimney.maskBlock != Blocks.air) { return + * chimney.maskBlock.getIcon(side, chimney.maskMeta); } return getIcon(side, + * world.getBlockMetadata(x, y, z)); } + * + * @Override public boolean onBlockActivated(World world, int x, int y, int z, + * EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) { + * int m = world.getBlockMetadata(x, y, z); TileEntityChimney chimney = + * getTile(world, x, y, z); + * + * if(chimney != null) { ItemStack held = user.getHeldItem(); if(!world.isRemote + * && held != null && held.getItem() instanceof ItemBlock) { ItemBlock item = + * (ItemBlock)held.getItem(); if(item.field_150939_a.isNormalCube()) { + * chimney.maskBlock = item.field_150939_a; chimney.maskMeta = + * item.getMetadata(held.getItemDamage()); chimney.sync(); world.setBlock(x, y, + * z, BlockListMF.chimney_wide, m, 2); return true; } } } return false; } + * + * @Override public void getSubBlocks(Item item, CreativeTabs tab, List list) { + * if(!isWide) { super.getSubBlocks(item, tab, list); } } + */ @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - if(isPipe)return; - - sideTex = reg.registerIcon("minefantasy2:chimney/chimney_"+chimneyType+"_side" + (isWide ? "Wide" : "")); - bottomTex = reg.registerIcon("minefantasy2:chimney/chimney_"+chimneyType+"_top" + (isWide ? "Wide" : "")); + public void registerBlockIcons(IIconRegister reg) { + if (isPipe) + return; + + sideTex = reg.registerIcon("minefantasy2:chimney/chimney_" + chimneyType + "_side" + (isWide ? "Wide" : "")); + bottomTex = reg.registerIcon("minefantasy2:chimney/chimney_" + chimneyType + "_top" + (isWide ? "Wide" : "")); } + private boolean isPipe; - public Block setPipe() - { + public Block setPipe() { this.setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F); isPipe = true; isWide = false; return this; } + public boolean isPipe() { return isPipe; } + @Override - public int getRenderType() - { + public int getRenderType() { return isPipe() ? pipe_RI : super.getRenderType(); } + public static int pipe_RI = 117; } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockCrucible.java b/src/main/java/minefantasy/mf2/block/refining/BlockCrucible.java index 594ae963..64c6ea1e 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockCrucible.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockCrucible.java @@ -30,167 +30,144 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockCrucible extends BlockContainer -{ +public class BlockCrucible extends BlockContainer { private Random rand = new Random(); public final boolean isActive; private static boolean keepInventory; public int tier; public String type; - - public BlockCrucible(String tex, int tier, boolean isActive) - { + + public BlockCrucible(String tex, int tier, boolean isActive) { super(Material.rock); this.tier = tier; this.type = tex; this.isActive = isActive; - GameRegistry.registerBlock(this, "MF_Crucible"+tex + (isActive ? "Active" : "")); - setBlockName("crucible."+tex); + GameRegistry.registerBlock(this, "MF_Crucible" + tex + (isActive ? "Active" : "")); + setBlockName("crucible." + tex); this.setStepSound(Block.soundTypeStone); this.setHardness(8F); this.setResistance(8F); - this.setCreativeTab(CreativeTabMF.tabUtil); + this.setCreativeTab(CreativeTabMF.tabUtil); } + public boolean isAuto; - public BlockCrucible setAuto() - { + + public BlockCrucible setAuto() { isAuto = true; return this; } @Override - public void getSubBlocks(Item item, CreativeTabs tab, List list) - { - if(!isActive) - { + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + if (!isActive) { super.getSubBlocks(item, tab, list); } - } - + } + @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityCrucible(); } - - private static TileEntityCrucible getTile(IBlockAccess world, int x, int y, int z) - { - return (TileEntityCrucible)world.getTileEntity(x, y, z); + + private static TileEntityCrucible getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityCrucible) world.getTileEntity(x, y, z); } - - + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { - if(keepInventory)return; - + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + if (keepInventory) + return; + TileEntityCrucible tile = getTile(world, x, y, z); - if (tile != null) - { - int size = (!isAuto && ConfigHardcore.HCCreduceIngots) ? tile.getSizeInventory()-1 : tile.getSizeInventory(); - for (int i1 = 0; i1 < size; ++i1) - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) - { - int l = world.getBlockMetadata(x, y, z); - TileEntityCrucible tileentity = getTile(world, x, y, z); - keepInventory = true; - Block block = world.getBlock(x, y, z); - - if(block != null && block instanceof BlockCrucible) - { - int blocktier = ((BlockCrucible)block).tier; - boolean auto = ((BlockCrucible)block).isAuto; - if (state) - { - world.setBlock(x, y, z, getActiveBlock(blocktier, auto)); - } - else - { - world.setBlock(x, y, z, getInactiveBlock(blocktier, auto)); - } - } - - keepInventory = false; - world.setBlockMetadataWithNotify(x, y, z, l, 2); - - if (tileentity != null) - { - tileentity.validate(); - world.setTileEntity(x, y, z, tileentity); - } - } - - private static Block getActiveBlock(int tier, boolean auto) - { - if(tier == 1) - { + if (tile != null) { + int size = (!isAuto && ConfigHardcore.HCCreduceIngots) ? tile.getSizeInventory() - 1 + : tile.getSizeInventory(); + for (int i1 = 0; i1 < size; ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) { + int l = world.getBlockMetadata(x, y, z); + TileEntityCrucible tileentity = getTile(world, x, y, z); + keepInventory = true; + Block block = world.getBlock(x, y, z); + + if (block != null && block instanceof BlockCrucible) { + int blocktier = ((BlockCrucible) block).tier; + boolean auto = ((BlockCrucible) block).isAuto; + if (state) { + world.setBlock(x, y, z, getActiveBlock(blocktier, auto)); + } else { + world.setBlock(x, y, z, getInactiveBlock(blocktier, auto)); + } + } + + keepInventory = false; + world.setBlockMetadataWithNotify(x, y, z, l, 2); + + if (tileentity != null) { + tileentity.validate(); + world.setTileEntity(x, y, z, tileentity); + } + } + + private static Block getActiveBlock(int tier, boolean auto) { + if (tier == 1) { return auto ? BlockListMF.crucibleauto_active : BlockListMF.crucibleadv_active; } - if(tier == 2) - { - return BlockListMF.cruciblemythic_active; + if (tier == 2) { + return BlockListMF.cruciblemythic_active; } - if(tier == 3) - { - return BlockListMF.cruciblemaster_active; + if (tier == 3) { + return BlockListMF.cruciblemaster_active; } return BlockListMF.crucible_active; } - private static Block getInactiveBlock(int tier, boolean auto) - { - if(tier == 1) - { + private static Block getInactiveBlock(int tier, boolean auto) { + if (tier == 1) { return auto ? BlockListMF.crucibleauto : BlockListMF.crucibleadv; } - if(tier == 2) - { + if (tier == 2) { return BlockListMF.cruciblemythic; } - if(tier == 3) - { + if (tier == 3) { return BlockListMF.cruciblemaster; } return BlockListMF.crucible; @@ -198,88 +175,77 @@ private static Block getInactiveBlock(int tier, boolean auto) @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { + public IIcon getIcon(int side, int meta) { return side == 1 ? topTex : sideTex; } - + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { TileEntityCrucible tile = getTile(world, x, y, z); - if(tile != null) - { - ItemStack held = user.getHeldItem(); - if(held != null && held.getItem() == ComponentListMF.artefacts && held.getItemDamage() == 3) - { - if(tier == 2 && isActive) - { - --held.stackSize; - if(held.stackSize <= 0) - { - user.setCurrentItemOrArmor(0, null); - } - if(!world.isRemote) - { - world.spawnEntityInWorld(new EntityLightningBolt(world, x+0.5, y+1.5, z+0.5)); - world.setBlock(x, y, z, BlockListMF.cruciblemaster_active, 0, 2); - } - } - return true; - } - if(tier >= 2) - { - BlockCrucible.updateFurnaceBlockState(tile.isCoated(), world, x, y, z); - } - ItemStack out = tile.getStackInSlot(tile.getSizeInventory()-1); - if(held != null && held.getItem() == ComponentListMF.ingot_mould && out != null && !(out.getItem() instanceof ItemBlock)) - { - ItemStack result = out.copy(); - result.stackSize = 1; - tile.decrStackSize(tile.getSizeInventory()-1, 1); - - ItemStack mould = ItemFilledMould.createMould(result); - if(held.stackSize == 1) - { - user.setCurrentItemOrArmor(0, mould); - } - else - { - --held.stackSize; - if(!world.isRemote) - { - EntityItem drop = new EntityItem(world, user.posX, user.posY, user.posZ, mould); - drop.delayBeforeCanPickup = 0; - world.spawnEntityInWorld(drop); - } - } - return true; - } - if(!world.isRemote) - { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } + if (tile != null) { + ItemStack held = user.getHeldItem(); + if (held != null && held.getItem() == ComponentListMF.artefacts && held.getItemDamage() == 3) { + if (tier == 2 && isActive) { + --held.stackSize; + if (held.stackSize <= 0) { + user.setCurrentItemOrArmor(0, null); + } + if (!world.isRemote) { + world.spawnEntityInWorld(new EntityLightningBolt(world, x + 0.5, y + 1.5, z + 0.5)); + world.setBlock(x, y, z, BlockListMF.cruciblemaster_active, 0, 2); + } + } + return true; + } + if (tier >= 2) { + BlockCrucible.updateFurnaceBlockState(tile.isCoated(), world, x, y, z); + } + ItemStack out = tile.getStackInSlot(tile.getSizeInventory() - 1); + if (held != null && held.getItem() == ComponentListMF.ingot_mould && out != null + && !(out.getItem() instanceof ItemBlock)) { + ItemStack result = out.copy(); + result.stackSize = 1; + tile.decrStackSize(tile.getSizeInventory() - 1, 1); + + ItemStack mould = ItemFilledMould.createMould(result); + if (held.stackSize == 1) { + user.setCurrentItemOrArmor(0, mould); + } else { + --held.stackSize; + if (!world.isRemote) { + EntityItem drop = new EntityItem(world, user.posX, user.posY, user.posZ, mould); + drop.delayBeforeCanPickup = 0; + world.spawnEntityInWorld(drop); + } + } + return true; + } + if (!world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + private IIcon sideTex, topTex; - + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - topTex = isActive ? reg.registerIcon("minefantasy2:processor/crucible_top_active_"+type) : reg.registerIcon("minefantasy2:processor/crucible_top_"+type); - sideTex = reg.registerIcon("minefantasy2:processor/crucible_side_"+type); + public void registerBlockIcons(IIconRegister reg) { + topTex = isActive ? reg.registerIcon("minefantasy2:processor/crucible_top_active_" + type) + : reg.registerIcon("minefantasy2:processor/crucible_top_" + type); + sideTex = reg.registerIcon("minefantasy2:processor/crucible_side_" + type); } + @Override @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) - { - return Item.getItemFromBlock(getInactiveBlock(tier, isAuto)); - } + public Item getItem(World world, int x, int y, int z) { + return Item.getItemFromBlock(getInactiveBlock(tier, isAuto)); + } + @Override - public Item getItemDropped(int meta, Random rand, int fort) - { - return Item.getItemFromBlock(getInactiveBlock(tier, isAuto)); - } + public Item getItemDropped(int meta, Random rand, int fort) { + return Item.getItemFromBlock(getInactiveBlock(tier, isAuto)); + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockForge.java b/src/main/java/minefantasy/mf2/block/refining/BlockForge.java index 21ad127f..2eddf602 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockForge.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockForge.java @@ -1,16 +1,17 @@ package minefantasy.mf2.block.refining; -import java.util.ArrayList; import java.util.List; import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.heating.ForgeFuel; import minefantasy.mf2.api.heating.ForgeItemHandler; import minefantasy.mf2.api.heating.Heatable; import minefantasy.mf2.api.heating.TongsHelper; import minefantasy.mf2.api.knowledge.ResearchLogic; -import minefantasy.mf2.api.tool.ILighter; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.tileentity.TileEntityForge; import minefantasy.mf2.item.armour.ItemApron; @@ -26,10 +27,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; import net.minecraft.item.Item; -import net.minecraft.item.ItemFlintAndSteel; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -37,363 +35,297 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockForge extends BlockContainer -{ +public class BlockForge extends BlockContainer { public static int forge_RI = 104; - + private Random rand = new Random(); public final boolean isActive; private static boolean keepInventory; public int tier; public String type; - - public BlockForge(String tex, int tier, boolean isActive) - { + + public BlockForge(String tex, int tier, boolean isActive) { super(tier == 1 ? Material.iron : Material.rock); this.tier = tier; this.type = tex; this.isActive = isActive; - //setBlockBounds(0F, 0F, 0F, 1F, 12F/16F, 1F); - GameRegistry.registerBlock(this, "MF_Forge"+tex + (isActive ? "Active" : "")); - setBlockName("forge."+tex); + // setBlockBounds(0F, 0F, 0F, 1F, 12F/16F, 1F); + GameRegistry.registerBlock(this, "MF_Forge" + tex + (isActive ? "Active" : "")); + setBlockName("forge." + tex); this.setStepSound(Block.soundTypeStone); this.setHardness(5F); this.setResistance(8F); - this.setCreativeTab(CreativeTabMF.tabUtil); - setBlockBounds(0F, 0F, 0F, 1F, 0.5F, 1F); - this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + setBlockBounds(0F, 0F, 0F, 1F, 0.5F, 1F); + this.setLightOpacity(0); } - + @Override - public void getSubBlocks(Item item, CreativeTabs tab, List list) - { - if(!isActive) - { + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + if (!isActive) { super.getSubBlocks(item, tab, list); } - } - + } + @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityForge(); } - - private static TileEntityForge getTile(IBlockAccess world, int x, int y, int z) - { - return (TileEntityForge)world.getTileEntity(x, y, z); + + private static TileEntityForge getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityForge) world.getTileEntity(x, y, z); } - - + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { - if(keepInventory)return; - + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + if (keepInventory) + return; + TileEntityForge tile = getTile(world, x, y, z); - if (tile != null) - { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) - { - int l = world.getBlockMetadata(x, y, z); - TileEntityForge tileentity = getTile(world, x, y, z); - keepInventory = true; - Block block = world.getBlock(x, y, z); - - if(block != null && block instanceof BlockForge) - { - int blocktier = ((BlockForge)block).tier; - if (state) - { - world.setBlock(x, y, z, getActiveBlock(blocktier)); - } - else - { - world.setBlock(x, y, z, getInactiveBlock(blocktier)); - } - } - - keepInventory = false; - world.setBlockMetadataWithNotify(x, y, z, l, 2); - - if (tileentity != null) - { - tileentity.validate(); - world.setTileEntity(x, y, z, tileentity); - } - } - - private static Block getActiveBlock(int tier) - { + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) { + int l = world.getBlockMetadata(x, y, z); + TileEntityForge tileentity = getTile(world, x, y, z); + keepInventory = true; + Block block = world.getBlock(x, y, z); + + if (block != null && block instanceof BlockForge) { + int blocktier = ((BlockForge) block).tier; + if (state) { + world.setBlock(x, y, z, getActiveBlock(blocktier)); + } else { + world.setBlock(x, y, z, getInactiveBlock(blocktier)); + } + } + + keepInventory = false; + world.setBlockMetadataWithNotify(x, y, z, l, 2); + + if (tileentity != null) { + tileentity.validate(); + world.setTileEntity(x, y, z, tileentity); + } + } + + private static Block getActiveBlock(int tier) { return tier == 1 ? BlockListMF.forge_metal_active : BlockListMF.forge_active; } - private static Block getInactiveBlock(int tier) - { + private static Block getInactiveBlock(int tier) { return tier == 1 ? BlockListMF.forge_metal : BlockListMF.forge; } @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { + public IIcon getIcon(int side, int meta) { return BlockListMF.crucible.getIcon(side, meta); } - + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { ItemStack held = user.getHeldItem(); TileEntityForge tile = getTile(world, x, y, z); - if(tile != null) - { - if(tile.isLit() && !ItemApron.isUserProtected(user)) - { - user.setFire(5); - user.attackEntityFrom(DamageSource.onFire, 1.0F); - } - if(held != null) - { - if(side == 1 && held != null && held.getItem() instanceof ItemTongs && onUsedTongs(world, user, held, tile)) - { - return true; - } - int l = ItemLighterMF.tryUse(held, user); - if(!isActive && l != 0) - { - user.playSound("fire.ignite", 1.0F, 1.0F); - if(l == 1) - { + if (tile != null) { + if (tile.isLit() && !ItemApron.isUserProtected(user)) { + user.setFire(5); + user.attackEntityFrom(DamageSource.onFire, 1.0F); + } + if (held != null) { + if (side == 1 && held != null && held.getItem() instanceof ItemTongs + && onUsedTongs(world, user, held, tile)) { + return true; + } + int l = ItemLighterMF.tryUse(held, user); + if (!isActive && l != 0) { + user.playSound("fire.ignite", 1.0F, 1.0F); + if (l == 1) { tile.fireUpForge(); - held.damageItem(1, user); - } - return true; - } - if(Heatable.canHeatItem(held) && tile.tryAddHeatable(held)) - { - --held.stackSize; - if(held.stackSize <= 0) - { - user.setCurrentItemOrArmor(0, null); - } - return true; - } - - ForgeFuel stats = ForgeItemHandler.getStats(held); - if(stats != null && tile.addFuel(stats, true, tier)) - { - if(user.capabilities.isCreativeMode) - { - return true; - } - if(user.getHeldItem().getItem().getContainerItem() != null) - { + held.damageItem(1, user); + } + return true; + } + if (Heatable.canHeatItem(held) && tile.tryAddHeatable(held)) { + --held.stackSize; + if (held.stackSize <= 0) { + user.setCurrentItemOrArmor(0, null); + } + return true; + } + + ForgeFuel stats = ForgeItemHandler.getStats(held); + if (stats != null && tile.addFuel(stats, true, tier)) { + if (user.capabilities.isCreativeMode) { + return true; + } + if (user.getHeldItem().getItem().getContainerItem() != null) { ItemStack cont = new ItemStack(user.getHeldItem().getItem().getContainerItem()); - if(user.getHeldItem().stackSize == 1) - { + if (user.getHeldItem().stackSize == 1) { user.setCurrentItemOrArmor(0, cont); return true; - } - else - { - if(!user.inventory.addItemStackToInventory(cont)) - { + } else { + if (!user.inventory.addItemStackToInventory(cont)) { user.entityDropItem(cont, 0.0F); } } } - if(user.getHeldItem().stackSize == 1) - { - user.setCurrentItemOrArmor(0, null); - } - else - { - user.getHeldItem().stackSize --; + if (user.getHeldItem().stackSize == 1) { + user.setCurrentItemOrArmor(0, null); + } else { + user.getHeldItem().stackSize--; + } + return true; + } + if (!world.isRemote && ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.smeltDragonforge) + && held.getItem() == ComponentListMF.dragon_heart) { + if (user.getHeldItem().stackSize == 1) { + user.setCurrentItemOrArmor(0, null); + } else { + user.getHeldItem().stackSize--; } - return true; - } - if(!world.isRemote && ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.smeltDragonforge) && held.getItem() == ComponentListMF.dragon_heart) - { - if(user.getHeldItem().stackSize == 1) - { - user.setCurrentItemOrArmor(0, null); - } - else - { - user.getHeldItem().stackSize --; - } - tile.dragonHeartPower = 1.0F; - return true; - } - } - if(!world.isRemote && !tile.hasBlockAbove()) - { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - private boolean onUsedTongs(World world, EntityPlayer user, ItemStack held, TileEntityForge tile) - { - ItemStack contents = tile.getStackInSlot(0); - ItemStack grabbed = TongsHelper.getHeldItem(held); - - //GRAB - if(grabbed == null) - { - if(contents != null && contents.getItem() == ComponentListMF.hotItem) - { - if(TongsHelper.trySetHeldItem(held, contents)) - { + tile.dragonHeartPower = 1.0F; + return true; + } + } + if (!world.isRemote && !tile.hasBlockAbove()) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + private boolean onUsedTongs(World world, EntityPlayer user, ItemStack held, TileEntityForge tile) { + ItemStack contents = tile.getStackInSlot(0); + ItemStack grabbed = TongsHelper.getHeldItem(held); + + // GRAB + if (grabbed == null) { + if (contents != null && contents.getItem() == ComponentListMF.hotItem) { + if (TongsHelper.trySetHeldItem(held, contents)) { tile.setInventorySlotContents(0, null); return true; } } - } - else - { - if(contents == null) - { + } else { + if (contents == null) { tile.setInventorySlotContents(0, grabbed); TongsHelper.clearHeldItem(held, user); return true; } - } + } return false; } + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { + public void registerBlockIcons(IIconRegister reg) { } + @Override @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) - { - return Item.getItemFromBlock(getInactiveBlock(tier)); - } + public Item getItem(World world, int x, int y, int z) { + return Item.getItemFromBlock(getInactiveBlock(tier)); + } + + @Override + public Item getItemDropped(int meta, Random rand, int fort) { + return Item.getItemFromBlock(getInactiveBlock(tier)); + } + @Override - public Item getItemDropped(int meta, Random rand, int fort) - { - return Item.getItemFromBlock(getInactiveBlock(tier)); - } - + public boolean renderAsNormalBlock() { + return false; + } + @Override - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - + public boolean isOpaqueCube() { + return false; + } + @Override - public int getRenderType() - { + public int getRenderType() { return forge_RI; } - - + /** - * Called whenever the block is added into the world. Args: world, x, y, z - */ + * Called whenever the block is added into the world. Args: world, x, y, z + */ @Override - public void onBlockAdded(World world, int x, int y, int z) - { - if (tier == 1 && !world.isRemote) - { - if (this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) - { - world.scheduleBlockUpdate(x, y, z, this, 4); - } - else if (!this.isActive && world.isBlockIndirectlyGettingPowered(x, y, z)) - { - updateFurnaceBlockState(true, world, x, y, z); - } - } - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor Block - */ - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) - { - if (tier == 1 && !world.isRemote) - { - if (this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) - { - world.scheduleBlockUpdate(x, y, z, this, 4); - } - else if (!this.isActive && world.isBlockIndirectlyGettingPowered(x, y, z)) - { - updateFurnaceBlockState(true, world, x, y, z); - } - } - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random rand) - { - if (tier == 1 && !world.isRemote && this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) - { - updateFurnaceBlockState(false, world, x, y, z); - } - } - + public void onBlockAdded(World world, int x, int y, int z) { + if (tier == 1 && !world.isRemote) { + if (this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) { + world.scheduleBlockUpdate(x, y, z, this, 4); + } else if (!this.isActive && world.isBlockIndirectlyGettingPowered(x, y, z)) { + updateFurnaceBlockState(true, world, x, y, z); + } + } + } + + /** + * Lets the block know when one of its neighbor changes. Doesn't know which + * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor + * Block + */ + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + if (tier == 1 && !world.isRemote) { + if (this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) { + world.scheduleBlockUpdate(x, y, z, this, 4); + } else if (!this.isActive && world.isBlockIndirectlyGettingPowered(x, y, z)) { + updateFurnaceBlockState(true, world, x, y, z); + } + } + } + + /** + * Ticks the block if it's been scheduled + */ + @Override + public void updateTick(World world, int x, int y, int z, Random rand) { + if (tier == 1 && !world.isRemote && this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) { + updateFurnaceBlockState(false, world, x, y, z); + } + } + } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockQuern.java b/src/main/java/minefantasy/mf2/block/refining/BlockQuern.java index ce87bde9..8b2840ba 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockQuern.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockQuern.java @@ -6,166 +6,139 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.api.knowledge.ResearchLogic; -import minefantasy.mf2.api.tool.ILighter; -import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.tileentity.TileEntityQuern; -import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.knowledge.KnowledgeListMF; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemFlintAndSteel; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class BlockQuern extends BlockContainer -{ +public class BlockQuern extends BlockContainer { private Random rand = new Random(); public IIcon bottomTex, sideTex, topTex; private String type; - - public BlockQuern(String type) - { + + public BlockQuern(String type) { super(Material.rock); this.type = type; - GameRegistry.registerBlock(this, "MF_Grind_"+type); + GameRegistry.registerBlock(this, "MF_Grind_" + type); setBlockName(type); this.setStepSound(Block.soundTypeStone); this.setHardness(5F); this.setResistance(5F); - this.setCreativeTab(CreativeTabMF.tabUtil); + this.setCreativeTab(CreativeTabMF.tabUtil); } @Override - public TileEntity createNewTileEntity(World world, int meta) - { + public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityQuern(); } - - private TileEntityQuern getTile(IBlockAccess world, int x, int y, int z) - { - return (TileEntityQuern)world.getTileEntity(x, y, z); + + private TileEntityQuern getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityQuern) world.getTileEntity(x, y, z); } - + @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntityQuern tile = getTile(world, x, y, z); - if (tile != null) - { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) - { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { TileEntityQuern tile = getTile(world, x, y, z); - if(tile != null) - { - if(side == 1) - { + if (tile != null) { + if (side == 1) { tile.onUse(user); - } - else - { + } else { user.openGui(MineFantasyII.instance, 0, world, x, y, z); } - } - return true; - } + } + return true; + } + @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) - { + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { TileEntityQuern tile = getTile(world, x, y, z); - if(tile != null) - { + if (tile != null) { tile.onUse(user); - } - } - + } + } + @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) - { - this.topTex = reg.registerIcon("minefantasy2:processor/"+type + "_top"); - this.sideTex = reg.registerIcon("minefantasy2:processor/"+type + "_side"); - this.bottomTex = reg.registerIcon("minefantasy2:processor/"+type + "_base"); + @Override + public void registerBlockIcons(IIconRegister reg) { + this.topTex = reg.registerIcon("minefantasy2:processor/" + type + "_top"); + this.sideTex = reg.registerIcon("minefantasy2:processor/" + type + "_side"); + this.bottomTex = reg.registerIcon("minefantasy2:processor/" + type + "_base"); } - + @Override - public IIcon getIcon(int side, int meta) - { + public IIcon getIcon(int side, int meta) { return side == 0 ? bottomTex : side == 1 ? topTex : sideTex; - } - + } + @Override - public boolean isOpaqueCube() - { - return false; - } - @Override - public boolean renderAsNormalBlock() - { - return false; - } - @SideOnly(Side.CLIENT) - public int getRenderType() - { - return quern_RI; - } + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @SideOnly(Side.CLIENT) + public int getRenderType() { + return quern_RI; + } + public static int quern_RI = 111; } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java index 16ca5467..279e1900 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java @@ -33,12 +33,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; -public class TileEntityAnvilMF extends TileEntity implements IInventory, IAnvil, IQualityBalance -{ +public class TileEntityAnvilMF extends TileEntity implements IInventory, IAnvil, IQualityBalance { public int tier; private ItemStack[] inventory; private Random rand = new Random(); - private int ticksExisted; + private int ticksExisted; private ContainerAnvilMF syncAnvil; private AnvilCraftMatrix craftMatrix; private String lastPlayerHit = ""; @@ -47,971 +46,850 @@ public class TileEntityAnvilMF extends TileEntity implements IInventory, IAnvil, private boolean outputHot = false; private Skill skillUsed; private boolean resetRecipe = false; - - public TileEntityAnvilMF() - { + + public TileEntityAnvilMF() { this(0, "Iron"); } - public TileEntityAnvilMF(int tier, String name) - { + + public TileEntityAnvilMF(int tier, String name) { inventory = new ItemStack[25]; - this.tier=tier; - texName=name; + this.tier = tier; + texName = name; setContainer(new ContainerAnvilMF(this)); } + private boolean isFakeAnvil = false; - public TileEntityAnvilMF setDisplay() - { + + public TileEntityAnvilMF setDisplay() { isFakeAnvil = true; return this; } - + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); tier = nbt.getInteger("tier"); NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inventory = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inventory.length) - { - this.inventory[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - progress = nbt.getFloat("Progress"); - progressMax = nbt.getFloat("ProgressMax"); - resName = nbt.getString("ResultName"); - toolTypeRequired = nbt.getString("toolTypeRequired"); - researchRequired = nbt.getString("researchRequired"); - texName = nbt.getString("TextureName"); - outputHot = nbt.getBoolean("outputHot"); - qualityBalance = nbt.getFloat("Quality"); - leftHit = nbt.getFloat("leftHit"); - rightHit = nbt.getFloat("rightHit"); - } - + this.inventory = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inventory.length) { + this.inventory[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + progress = nbt.getFloat("Progress"); + progressMax = nbt.getFloat("ProgressMax"); + resName = nbt.getString("ResultName"); + toolTypeRequired = nbt.getString("toolTypeRequired"); + researchRequired = nbt.getString("researchRequired"); + texName = nbt.getString("TextureName"); + outputHot = nbt.getBoolean("outputHot"); + qualityBalance = nbt.getFloat("Quality"); + leftHit = nbt.getFloat("leftHit"); + rightHit = nbt.getFloat("rightHit"); + } + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("tier", tier); - + NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.inventory.length; ++i) - { - if (this.inventory[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.inventory[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - - nbt.setFloat("Progress", progress); - nbt.setFloat("ProgressMax", progressMax); - nbt.setString("ResName", resName); - nbt.setString("toolTypeRequired", toolTypeRequired); - nbt.setString("researchRequired", researchRequired); - nbt.setString("TextureName", texName); - nbt.setBoolean("outputHot", outputHot); - nbt.setFloat("Quality", qualityBalance); - nbt.setFloat("leftHit", leftHit); - nbt.setFloat("rightHit", rightHit); + for (int i = 0; i < this.inventory.length; ++i) { + if (this.inventory[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inventory[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + + nbt.setFloat("Progress", progress); + nbt.setFloat("ProgressMax", progressMax); + nbt.setString("ResName", resName); + nbt.setString("toolTypeRequired", toolTypeRequired); + nbt.setString("researchRequired", researchRequired); + nbt.setString("TextureName", texName); + nbt.setBoolean("outputHot", outputHot); + nbt.setFloat("Quality", qualityBalance); + nbt.setFloat("leftHit", leftHit); + nbt.setFloat("rightHit", rightHit); } @Override - public int getSizeInventory() - { + public int getSizeInventory() { return inventory.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return inventory[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { onInventoryChanged(); - if (this.inventory[slot] != null) - { - ItemStack itemstack; - - if (this.inventory[slot].stackSize <= num) - { - itemstack = this.inventory[slot]; - this.inventory[slot] = null; - return itemstack; - } - else - { - itemstack = this.inventory[slot].splitStack(num); - - if (this.inventory[slot].stackSize == 0) - { - this.inventory[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + if (this.inventory[slot] != null) { + ItemStack itemstack; + + if (this.inventory[slot].stackSize <= num) { + itemstack = this.inventory[slot]; + this.inventory[slot] = null; + return itemstack; + } else { + itemstack = this.inventory[slot].splitStack(num); + + if (this.inventory[slot].stackSize == 0) { + this.inventory[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return inventory[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { onInventoryChanged(); inventory[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return "gui.carpentermf.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { return true; } + @Override - public void updateEntity() - { + public void updateEntity() { ++ticksExisted; - if(!worldObj.isRemote && (leftHit == 0 || rightHit == 0)) - { + if (!worldObj.isRemote && (leftHit == 0 || rightHit == 0)) { reassignHitValues(); } super.updateEntity(); - if(!worldObj.isRemote) - { - if(!isFakeAnvil && ticksExisted % 20 == 0) - { + if (!worldObj.isRemote) { + if (!isFakeAnvil && ticksExisted % 20 == 0) { updateCraftingData(); } - if(!canCraft() && ticksExisted > 1) - { + if (!canCraft() && ticksExisted > 1) { progress = progressMax = 0; this.resName = ""; this.recipe = null; } } - if(!worldObj.isRemote) - { + if (!worldObj.isRemote) { updateThreshold(); } resetRecipe = false; } - - public void onInventoryChanged() - { - if(!resetRecipe) - { + + public void onInventoryChanged() { + if (!resetRecipe) { updateCraftingData(); resetRecipe = true; } } - - public boolean tryCraft(EntityPlayer user, boolean rightClick) - { - if(user == null)return false; - + + public boolean tryCraft(EntityPlayer user, boolean rightClick) { + if (user == null) + return false; + String toolType = ToolHelper.getCrafterTool(user.getHeldItem()); int hammerTier = ToolHelper.getCrafterTier(user.getHeldItem()); - if(toolType.equalsIgnoreCase("hammer") || toolType.equalsIgnoreCase("hvyHammer")) - { - if(user.getHeldItem() != null) - { + if (toolType.equalsIgnoreCase("hammer") || toolType.equalsIgnoreCase("hvyHammer")) { + if (user.getHeldItem() != null) { user.getHeldItem().damageItem(1, user); - if(user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) - { - if(worldObj.isRemote) + if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { + if (worldObj.isRemote) user.renderBrokenItemStack(user.getHeldItem()); - + user.destroyCurrentEquippedItem(); } } - if(worldObj.isRemote) + if (worldObj.isRemote) return true; - - if(doesPlayerKnowCraft(user) && canCraft() && toolType.equalsIgnoreCase(toolTypeRequired)) - { + + if (doesPlayerKnowCraft(user) && canCraft() && toolType.equalsIgnoreCase(toolTypeRequired)) { float mod = 1.0F; - if(hammerTier < hammerTierRequired) - { + if (hammerTier < hammerTierRequired) { mod = 2.0F; - if(rand.nextInt(5) == 0) - { + if (rand.nextInt(5) == 0) { reassignHitValues(); } } - if(rightClick) - { - this.qualityBalance += (rightHit*mod); + if (rightClick) { + this.qualityBalance += (rightHit * mod); + } else { + this.qualityBalance -= (leftHit * mod); } - else - { - this.qualityBalance -= (leftHit*mod); - } - if(qualityBalance >= 1.0F || qualityBalance <= -1.0F) - { + if (qualityBalance >= 1.0F || qualityBalance <= -1.0F) { ruinCraft(); } - - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "minefantasy2:block.anvilsucceed", 0.25F, rightClick ? 1.2F : 1.0F); + + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilsucceed", + 0.25F, rightClick ? 1.2F : 1.0F); float efficiency = ToolHelper.getCrafterEfficiency(user.getHeldItem()) * (rightClick ? 0.75F : 1.0F); float toolEfficiency = efficiency; - - if(user.swingProgress > 0 && user.swingProgress <= 1.0) - { - efficiency *= (0.5F-user.swingProgress); + + if (user.swingProgress > 0 && user.swingProgress <= 1.0) { + efficiency *= (0.5F - user.swingProgress); } - + progress += Math.max(0.2F, efficiency); - if(progress >= progressMax) - { + if (progress >= progressMax) { craftItem(user); } - } - else - { - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "minefantasy2:block.anvilfail", 0.25F, 1.0F); + } else { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilfail", + 0.25F, 1.0F); } lastPlayerHit = user.getCommandSenderName(); updateCraftingData(); - + return true; } updateCraftingData(); return false; } - - private void ruinCraft() - { - if(!worldObj.isRemote) - { + + private void ruinCraft() { + if (!worldObj.isRemote) { consumeResources(); reassignHitValues(); progress = progressMax = qualityBalance = 0; } - worldObj.playSoundEffect(xCoord+0.5, yCoord+0.8, zCoord+0.5, "random.break", 1.0F, 0.8F); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.8, zCoord + 0.5, "random.break", 1.0F, 0.8F); } - public boolean doesPlayerKnowCraft(EntityPlayer user) - { + + public boolean doesPlayerKnowCraft(EntityPlayer user) { return getResearchNeeded().isEmpty() || ResearchLogic.hasInfoUnlocked(user, getResearchNeeded()); } - private void craftItem(EntityPlayer lastHit) - { - if (this.canCraft()) - { + + private void craftItem(EntityPlayer lastHit) { + if (this.canCraft()) { ItemStack result = modifySpecials(recipe); - if(result == null) - { + if (result == null) { return; } - if(result != null && result.getItem() instanceof ItemArmourMF) - { + if (result != null && result.getItem() instanceof ItemArmourMF) { result = modifyArmour(result); } - int output = getSizeInventory()-1; - + int output = getSizeInventory() - 1; + int temp = this.averageTemp(); boolean hot = outputHot && temp > 0; - - if(hot) - { - if(result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) - { - getNBT(result).setString("MF_CraftedByName", lastPlayerHit); - } - ItemStack out = ItemHeated.createHotItem(result, temp); - if(inventory[output] == null || (inventory[output].stackSize == 1 && SpecialForging.getItemDesign(inventory[output]) != null) ) - { - addXP(lastHit); - this.inventory[output] = out; - consumeResources(); - } - else if(inventory[output].isItemEqual(out) && (inventory[output].stackSize + out.stackSize <= getStackSize(inventory[output]))) - { - addXP(lastHit); - inventory[output].stackSize += out.stackSize; - consumeResources(); - } - } - else if (!hot) - { - if (this.inventory[output] == null) - { - if(result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) - { - getNBT(result).setString("MF_CraftedByName", lastPlayerHit); - } - this.inventory[output] = result; - } - else if (this.inventory[output].getItem() == result.getItem()) - { - this.inventory[output].stackSize += result.stackSize; // Forge BugFix: Results may have multiple items - } - addXP(lastHit); - consumeResources(); + + if (hot) { + if (result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) { + getNBT(result).setString("MF_CraftedByName", lastPlayerHit); + } + ItemStack out = ItemHeated.createHotItem(result, temp); + if (inventory[output] == null || (inventory[output].stackSize == 1 + && SpecialForging.getItemDesign(inventory[output]) != null)) { + addXP(lastHit); + this.inventory[output] = out; + consumeResources(); + } else if (inventory[output].isItemEqual(out) + && (inventory[output].stackSize + out.stackSize <= getStackSize(inventory[output]))) { + addXP(lastHit); + inventory[output].stackSize += out.stackSize; + consumeResources(); + } + } else if (!hot) { + if (this.inventory[output] == null) { + if (result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) { + getNBT(result).setString("MF_CraftedByName", lastPlayerHit); + } + this.inventory[output] = result; + } else if (this.inventory[output].getItem() == result.getItem()) { + this.inventory[output].stackSize += result.stackSize; // Forge BugFix: Results may have multiple + // items + } + addXP(lastHit); + consumeResources(); } - } + } onInventoryChanged(); progress = 0; reassignHitValues(); qualityBalance = 0; } - private void addXP(EntityPlayer smith) - { - if(skillUsed == null)return; - + + private void addXP(EntityPlayer smith) { + if (skillUsed == null) + return; + float baseXP = this.progressMax / 10F; baseXP /= (1.0F + getAbsoluteBalance()); - - skillUsed.addXP(smith, (int)baseXP + 1); + + skillUsed.addXP(smith, (int) baseXP + 1); } - private ItemStack modifyArmour(ItemStack result) - { - ItemArmourMF item = (ItemArmourMF)result.getItem(); + + private ItemStack modifyArmour(ItemStack result) { + ItemArmourMF item = (ItemArmourMF) result.getItem(); boolean canColour = item.canColour(); int colour = -1; - for(int a = 0; a < getSizeInventory()-1; a++) - { + for (int a = 0; a < getSizeInventory() - 1; a++) { ItemStack slot = getStackInSlot(a); - if(slot != null && slot.getItem() instanceof ItemArmor) - { - ItemArmor slotitem = (ItemArmor)slot.getItem(); - if(canColour && slotitem.hasColor(slot)) - { + if (slot != null && slot.getItem() instanceof ItemArmor) { + ItemArmor slotitem = (ItemArmor) slot.getItem(); + if (canColour && slotitem.hasColor(slot)) { colour = slotitem.getColor(slot); } - if(result.isItemStackDamageable()) - { + if (result.isItemStackDamageable()) { result.setItemDamage(slot.getItemDamage()); } } } - if(colour != -1 && canColour) - { + if (colour != -1 && canColour) { item.func_82813_b(result, colour); } return result; } - private ItemStack modifySpecials(ItemStack result) - { + + private ItemStack modifySpecials(ItemStack result) { boolean hasHeart = false; boolean isTool = result.getMaxStackSize() == 1 && result.isItemStackDamageable(); EntityPlayer player = worldObj.getPlayerEntityByName(lastPlayerHit); - + Item DF = SpecialForging.getDragonCraft(result); - - if(DF != null) - { - //DRAGONFORGE - for(int x = -4; x <= 4; x++) - { - for(int y = -4; y <= 4; y++) - { - for(int z = -4; z <= 4; z++) - { - TileEntity tile = worldObj.getTileEntity(xCoord+x, yCoord+y, zCoord+z); - if(player != null && ResearchLogic.hasInfoUnlocked(player, KnowledgeListMF.smeltDragonforge) && tile != null && tile instanceof TileEntityForge) - { - if(((TileEntityForge)tile).dragonHeartPower > 0) - { + + if (DF != null) { + // DRAGONFORGE + for (int x = -4; x <= 4; x++) { + for (int y = -4; y <= 4; y++) { + for (int z = -4; z <= 4; z++) { + TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord + y, zCoord + z); + if (player != null && ResearchLogic.hasInfoUnlocked(player, KnowledgeListMF.smeltDragonforge) + && tile != null && tile instanceof TileEntityForge) { + if (((TileEntityForge) tile).dragonHeartPower > 0) { hasHeart = true; - ((TileEntityForge)tile).dragonHeartPower = 0; - worldObj.createExplosion(null, xCoord+x, yCoord+y, zCoord+z, 1F, false); + ((TileEntityForge) tile).dragonHeartPower = 0; + worldObj.createExplosion(null, xCoord + x, yCoord + y, zCoord + z, 1F, false); PlayerTickHandlerMF.spawnDragon(player); PlayerTickHandlerMF.addDragonEnemyPts(player, 2); - + break; } } - } - } + } + } } } - if(hasHeart) - { + if (hasHeart) { NBTBase nbt = !(result.hasTagCompound()) ? null : result.getTagCompound().copy(); result = new ItemStack(DF, result.stackSize, result.getItemDamage()); - if(nbt != null) - { + if (nbt != null) { result.setTagCompound((NBTTagCompound) nbt); } - } - else - { - Item special = SpecialForging.getSpecialCraft(SpecialForging.getItemDesign(inventory[getSizeInventory()-1]), result); - if(special != null) - { + } else { + Item special = SpecialForging + .getSpecialCraft(SpecialForging.getItemDesign(inventory[getSizeInventory() - 1]), result); + if (special != null) { NBTBase nbt = !(result.hasTagCompound()) ? null : result.getTagCompound().copy(); result = new ItemStack(special, result.stackSize, result.getItemDamage()); - if(nbt != null) - { + if (nbt != null) { result.setTagCompound((NBTTagCompound) nbt); } } } - - if(isPerfectItem() && !isMythicRecipe()) - { + + if (isPerfectItem() && !isMythicRecipe()) { this.setTrait(result, "MF_Inferior", false); - if(CustomToolHelper.isMythic(result)) - { + if (CustomToolHelper.isMythic(result)) { result.getTagCompound().setBoolean("Unbreakable", true); - } - else - { + } else { ToolHelper.setQuality(result, 200.0F); } return result; } - if(isTool) - { + if (isTool) { result = modifyQualityComponents(result); } return damageItem(result); } - private ItemStack modifyQualityComponents(ItemStack result) - { + + private ItemStack modifyQualityComponents(ItemStack result) { float totalPts = 0F; int totalItems = 0; - for(ItemStack item: inventory) - { - if(item != null && item.hasTagCompound()) - { - if(item.getTagCompound().hasKey("MF_Inferior")) - { + for (ItemStack item : inventory) { + if (item != null && item.hasTagCompound()) { + if (item.getTagCompound().hasKey("MF_Inferior")) { ++totalItems; boolean inf = item.getTagCompound().getBoolean("MF_Inferior"); totalPts += (inf ? -50F : 100F); } } } - if(totalItems > 0 && totalPts > 0) - { + if (totalItems > 0 && totalPts > 0) { totalPts /= totalItems; - ToolHelper.setQuality(result, ToolHelper.getQualityLevel(result)+totalPts); - if(totalPts <= -85F) - { + ToolHelper.setQuality(result, ToolHelper.getQualityLevel(result) + totalPts); + if (totalPts <= -85F) { this.setTrait(result, "MF_Inferior", true); } - if(totalPts >= 80) - { + if (totalPts >= 80) { this.setTrait(result, "MF_Inferior", false); } } return result; } - private int averageTemp() - { + + private int averageTemp() { float totalTemp = 0; int itemCount = 0; - for(int a = 0; a < getSizeInventory()-1; a++) - { + for (int a = 0; a < getSizeInventory() - 1; a++) { ItemStack item = getStackInSlot(a); - if(item != null && item.getItem() instanceof IHotItem) - { + if (item != null && item.getItem() instanceof IHotItem) { ++itemCount; - totalTemp += (float)Heatable.getTemp(item); + totalTemp += Heatable.getTemp(item); } } - if(totalTemp > 0 && itemCount > 0) - { - return (int)(totalTemp / itemCount); + if (totalTemp > 0 && itemCount > 0) { + return (int) (totalTemp / itemCount); } return 0; } - private NBTTagCompound getNBT(ItemStack item) - { - if(!item.hasTagCompound()) - { + + private NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } return item.getTagCompound(); } - private void dropItem(ItemStack itemstack) - { - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.4F + 0.3F; - float f1 = this.rand.nextFloat() * 0.4F + 0.3F; - float f2 = this.rand.nextFloat() * 0.4F + 0.3F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - boolean delay = true; - double[] positions = new double[]{xCoord+f, yCoord+f1+1, zCoord+f2}; - if(worldObj.getBlock(xCoord, yCoord+1, zCoord).getMaterial().isSolid() && lastPlayerHit != null) - { - EntityPlayer smith = worldObj.getPlayerEntityByName(lastPlayerHit); - if(smith != null) - { - delay = false; - positions = new double[]{smith.posX, smith.posY, smith.posZ}; - } - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(worldObj, positions[0], positions[1], positions[2], new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - entityitem.delayBeforeCanPickup = delay ? 20 : 0; - entityitem.motionX = entityitem.motionY = entityitem.motionZ = 0; - - worldObj.spawnEntityInWorld(entityitem); - } - } - } - - public boolean hasItems(EntityPlayer user, ItemStack[] items) - { - for(ItemStack check: items) - { - if(!hasItems(user, check)) - { + + private void dropItem(ItemStack itemstack) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.4F + 0.3F; + float f1 = this.rand.nextFloat() * 0.4F + 0.3F; + float f2 = this.rand.nextFloat() * 0.4F + 0.3F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + boolean delay = true; + double[] positions = new double[] { xCoord + f, yCoord + f1 + 1, zCoord + f2 }; + if (worldObj.getBlock(xCoord, yCoord + 1, zCoord).getMaterial().isSolid() && lastPlayerHit != null) { + EntityPlayer smith = worldObj.getPlayerEntityByName(lastPlayerHit); + if (smith != null) { + delay = false; + positions = new double[] { smith.posX, smith.posY, smith.posZ }; + } + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(worldObj, positions[0], positions[1], positions[2], + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + entityitem.delayBeforeCanPickup = delay ? 20 : 0; + entityitem.motionX = entityitem.motionY = entityitem.motionZ = 0; + + worldObj.spawnEntityInWorld(entityitem); + } + } + } + + public boolean hasItems(EntityPlayer user, ItemStack[] items) { + for (ItemStack check : items) { + if (!hasItems(user, check)) { return false; } } return true; } - public boolean hasItems(EntityPlayer user, ItemStack item) - { + + public boolean hasItems(EntityPlayer user, ItemStack item) { return hasItems(user, item, item.stackSize); } - public boolean hasItems(EntityPlayer user, ItemStack item, int number) - { + + public boolean hasItems(EntityPlayer user, ItemStack item, int number) { int count = 0; - for(int a = 0; a < user.inventory.getSizeInventory(); a++) - { + for (int a = 0; a < user.inventory.getSizeInventory(); a++) { ItemStack slot = user.inventory.getStackInSlot(a); - if(slot != null && slot.isItemEqual(item)) - { + if (slot != null && slot.isItemEqual(item)) { count += slot.stackSize; } } return count >= number; } - public void syncData() - { - - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + public void syncData() { + + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new AnvilPacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new AnvilPacket(this).generatePacket()); } } + public String resName = ""; - public String getResultName() - { - if(!worldObj.isRemote && recipe != null && recipe.getDisplayName() != null) - { + + public String getResultName() { + if (!worldObj.isRemote && recipe != null && recipe.getDisplayName() != null) { resName = recipe.getDisplayName(); } return resName; } - public String getResearchNeeded() - { + + public String getResearchNeeded() { return researchRequired; } - public String getToolNeeded() - { + + public String getToolNeeded() { return toolTypeRequired; } - public int getToolTierNeeded() - { + + public int getToolTierNeeded() { return this.hammerTierRequired; } - public int getAnvilTierNeeded() - { + + public int getAnvilTierNeeded() { return this.anvilTierRequired; } - public void consumeResources() - { + + public void consumeResources() { resetRecipe = true; - for(int slot = 0; slot < getSizeInventory()-1; slot++) - { + for (int slot = 0; slot < getSizeInventory() - 1; slot++) { ItemStack item = getStackInSlot(slot); - if(item != null && item.getItem() != null && item.getItem().getContainerItem(item) != null) - { - if(item.stackSize == 1) - { + if (item != null && item.getItem() != null && item.getItem().getContainerItem(item) != null) { + if (item.stackSize == 1) { setInventorySlotContents(slot, item.getItem().getContainerItem(item)); - } - else - { + } else { this.dropItem(item.getItem().getContainerItem(item)); this.decrStackSize(slot, 1); } - } - else - { + } else { this.decrStackSize(slot, 1); } } resetRecipe = false; this.onInventoryChanged(); } - private boolean canFitResult(ItemStack result) - { - ItemStack resSlot = inventory[getSizeInventory()-1]; - if(resSlot != null && result != null) - { + + private boolean canFitResult(ItemStack result) { + ItemStack resSlot = inventory[getSizeInventory() - 1]; + if (resSlot != null && result != null) { int maxStack = getStackSize(resSlot); - if(resSlot.stackSize + result.stackSize > maxStack) - { + if (resSlot.stackSize + result.stackSize > maxStack) { return false; } - if(resSlot.getItem() instanceof IHotItem) - { + if (resSlot.getItem() instanceof IHotItem) { ItemStack heated = Heatable.getItem(resSlot); - if(heated != null) - { + if (heated != null) { resSlot = heated; } } - if(!resSlot.isItemEqual(result) && (SpecialForging.getItemDesign(resSlot) == null || resSlot.stackSize >1) ) - { + if (!resSlot.isItemEqual(result) + && (SpecialForging.getItemDesign(resSlot) == null || resSlot.stackSize > 1)) { return false; } } return true; } - private int getStackSize(ItemStack slot) - { - if(slot == null)return 0; - - if(slot.getItem() instanceof IHotItem) - { + + private int getStackSize(ItemStack slot) { + if (slot == null) + return 0; + + if (slot.getItem() instanceof IHotItem) { ItemStack held = Heatable.getItem(slot); - if(held != null)return held.getMaxStackSize(); + if (held != null) + return held.getMaxStackSize(); } return slot.getMaxStackSize(); } - //CRAFTING CODE - public ItemStack getResult() - { - if(syncAnvil == null || craftMatrix == null) - { - return null; - } - - if(ticksExisted <= 1) - return null; - - for(int a = 0 ; a < getSizeInventory()-1 ; a ++) - { - craftMatrix.setInventorySlotContents(a, inventory[a]); - } - - return CraftingManagerAnvil.getInstance().findMatchingRecipe(this, craftMatrix); - } - public void updateCraftingData() - { - if(!worldObj.isRemote) - { - ItemStack oldRecipe = recipe; - recipe = getResult(); - //syncItems(); - - if (!canCraft() && progress > 0) - { - progress = 0; - reassignHitValues(); - qualityBalance = 0; - } - - if(recipe != null && oldRecipe != null && !recipe.isItemEqual(oldRecipe)) - { - progress = 0; - reassignHitValues(); - qualityBalance = 0; - } - if(progress > progressMax)progress = progressMax-1; - syncData(); - } - } - public boolean canCraft() - { - if(worldObj.isRemote) - { - //return canCraft == 1; - } - - if(this.isMythicRecipe() && !this.isMythicReady()) - { + + // CRAFTING CODE + public ItemStack getResult() { + if (syncAnvil == null || craftMatrix == null) { + return null; + } + + if (ticksExisted <= 1) + return null; + + for (int a = 0; a < getSizeInventory() - 1; a++) { + craftMatrix.setInventorySlotContents(a, inventory[a]); + } + + return CraftingManagerAnvil.getInstance().findMatchingRecipe(this, craftMatrix); + } + + public void updateCraftingData() { + if (!worldObj.isRemote) { + ItemStack oldRecipe = recipe; + recipe = getResult(); + // syncItems(); + + if (!canCraft() && progress > 0) { + progress = 0; + reassignHitValues(); + qualityBalance = 0; + } + + if (recipe != null && oldRecipe != null && !recipe.isItemEqual(oldRecipe)) { + progress = 0; + reassignHitValues(); + qualityBalance = 0; + } + if (progress > progressMax) + progress = progressMax - 1; + syncData(); + } + } + + public boolean canCraft() { + if (worldObj.isRemote) { + // return canCraft == 1; + } + + if (this.isMythicRecipe() && !this.isMythicReady()) { return false; } - - if(progressMax > 0 && recipe != null && recipe instanceof ItemStack) - { - return this.canFitResult(recipe); - } - return false; - } - + + if (progressMax > 0 && recipe != null && recipe instanceof ItemStack) { + return this.canFitResult(recipe); + } + return false; + } + private ItemStack recipe; public float progressMax; public float progress; private int hammerTierRequired; private int anvilTierRequired; - + @Override - public void setForgeTime(int i) - { + public void setForgeTime(int i) { progressMax = i; } + @Override - public void setHammerUsed(int i) - { + public void setHammerUsed(int i) { hammerTierRequired = i; } + @Override - public void setRequiredAnvil(int i) - { + public void setRequiredAnvil(int i) { anvilTierRequired = i; } + @Override - public void setHotOutput(boolean i) - { + public void setHotOutput(boolean i) { outputHot = i; } - public void setContainer(ContainerAnvilMF container) - { + + public void setContainer(ContainerAnvilMF container) { syncAnvil = container; - craftMatrix = new AnvilCraftMatrix(this, syncAnvil, ShapelessAnvilRecipes.globalWidth, ShapelessAnvilRecipes.globalHeight); + craftMatrix = new AnvilCraftMatrix(this, syncAnvil, ShapelessAnvilRecipes.globalWidth, + ShapelessAnvilRecipes.globalHeight); } - public boolean shouldRenderCraftMetre() - { + + public boolean shouldRenderCraftMetre() { return recipe != null; } - public int getProgressBar(int i) - { - return (int)Math.ceil(i / progressMax * progress); + + public int getProgressBar(int i) { + return (int) Math.ceil(i / progressMax * progress); } + @Override - public void setToolType(String toolType) - { + public void setToolType(String toolType) { this.toolTypeRequired = toolType; } + @Override - public void setResearch(String research) - { + public void setResearch(String research) { this.researchRequired = research; } - - private boolean isMythicRecipe() - { - return false;//this.hammerTierRequired >= 6; + + private boolean isMythicRecipe() { + return false;// this.hammerTierRequired >= 6; } - private boolean isMythicReady() - { + + private boolean isMythicReady() { return true; } + public String texName = ""; - public String getTextureName() - { + + public String getTextureName() { return texName; } + public float qualityBalance = 0F; public float thresholdPosition = 0.1F; + @Override - public float getMarkerPosition() - { + public float getMarkerPosition() { return qualityBalance; } + @Override - public boolean shouldShowMetre() - { + public boolean shouldShowMetre() { return true; } + @Override - public float getThresholdPosition() - { + public float getThresholdPosition() { return thresholdPosition; } + @Override - public float getSuperThresholdPosition() - { - return thresholdPosition/3.5F; + public float getSuperThresholdPosition() { + return thresholdPosition / 3.5F; } - - private float getAbsoluteBalance() - { + + private float getAbsoluteBalance() { return qualityBalance < 0 ? -qualityBalance : qualityBalance; } - private float getItemDamage() - { - int threshold = (int)(100F * thresholdPosition / 2F); - int total = (int)(100F * getAbsoluteBalance() - threshold); - - if(total > threshold) - { - float percent = ((float)total - (float)threshold) / (100F-(float)threshold); + + private float getItemDamage() { + int threshold = (int) (100F * thresholdPosition / 2F); + int total = (int) (100F * getAbsoluteBalance() - threshold); + + if (total > threshold) { + float percent = ((float) total - (float) threshold) / (100F - threshold); return percent; } return 0F; } - private boolean isPerfectItem() - { - int threshold = (int)(100F * getSuperThresholdPosition() / 2F); - int total = (int)(100F * getAbsoluteBalance() - threshold); - + + private boolean isPerfectItem() { + int threshold = (int) (100F * getSuperThresholdPosition() / 2F); + int total = (int) (100F * getAbsoluteBalance() - threshold); + return total <= threshold; } - private ItemStack damageItem(ItemStack item) - { + + private ItemStack damageItem(ItemStack item) { float itemdam = getItemDamage(); - if(itemdam > 0.5F) - { + if (itemdam > 0.5F) { setTrait(item, "MF_Inferior"); - float q = 100F*(0.75F-(itemdam-0.5F)); + float q = 100F * (0.75F - (itemdam - 0.5F)); ToolHelper.setQuality(item, Math.max(10F, q)); } float damage = itemdam * item.getMaxDamage(); - if(item.isItemStackDamageable()) - { - if(damage > 0) - { - item.setItemDamage((int)(damage)); - if(isMythicRecipe()) - { + if (item.isItemStackDamageable()) { + if (damage > 0) { + item.setItemDamage((int) (damage)); + if (isMythicRecipe()) { setTrait(item, "MF_Inferior"); } - } - else if(isMythicRecipe()) - { + } else if (isMythicRecipe()) { setTrait(item, "Unbreakable"); } } return item; } - private void setTrait(ItemStack item, String trait) - { + + private void setTrait(ItemStack item, String trait) { setTrait(item, trait, true); } - private void setTrait(ItemStack item, String trait, boolean flag) - { - if(item == null)return; - if(item.getMaxStackSize() > 1 || !item.isItemStackDamageable()) - { + + private void setTrait(ItemStack item, String trait, boolean flag) { + if (item == null) + return; + if (item.getMaxStackSize() > 1 || !item.isItemStackDamageable()) { return; } - + NBTTagCompound nbt = this.getNBT(item); nbt.setBoolean(trait, flag); } - private void updateThreshold() - { + + private void updateThreshold() { float modifier = 1.0F; - if(tier < anvilTierRequired) - { + if (tier < anvilTierRequired) { modifier *= 0.25F; } - - float baseThreshold = worldObj.difficultySetting.getDifficultyId()>= 2 ? 7.5F : 10F; - thresholdPosition = (isMythicRecipe() ? 0.05F : baseThreshold/100F)*modifier; - } - public void upset(EntityPlayer user) - { - if(this.progress > 0 && this.progressMax > 0) - { - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "minefantasy2:block.anvilsucceed", 0.25F, 0.75F); - if(!worldObj.isRemote) - { - progress -= (progressMax/10F); - if(progress < 0) - { + + float baseThreshold = worldObj.difficultySetting.getDifficultyId() >= 2 ? 7.5F : 10F; + thresholdPosition = (isMythicRecipe() ? 0.05F : baseThreshold / 100F) * modifier; + } + + public void upset(EntityPlayer user) { + if (this.progress > 0 && this.progressMax > 0) { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilsucceed", + 0.25F, 0.75F); + if (!worldObj.isRemote) { + progress -= (progressMax / 10F); + if (progress < 0) { ruinCraft(); } } } } + public float leftHit = 0F; public float rightHit = 0F; - private void reassignHitValues() - { - if(!worldObj.isRemote) - { - leftHit = 0.1F + (0.01F*rand.nextInt(11)); - rightHit = 0.1F + (0.01F*rand.nextInt(11)); + + private void reassignHitValues() { + if (!worldObj.isRemote) { + leftHit = 0.1F + (0.01F * rand.nextInt(11)); + rightHit = 0.1F + (0.01F * rand.nextInt(11)); } } + @Override - public void setSkill(Skill skill) - { + public void setSkill(Skill skill) { skillUsed = skill; } + @Override public int getRecipeHammer() { return hammerTierRequired; } + @Override public int getRecipeAnvil() { return anvilTierRequired; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBellows.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBellows.java index a9d4c135..2d85f349 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBellows.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBellows.java @@ -6,122 +6,106 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -import com.google.common.io.ByteArrayDataInput; - -import cpw.mods.fml.common.FMLCommonHandler; - -public class TileEntityBellows extends TileEntity -{ +public class TileEntityBellows extends TileEntity { public int direction; public int press = 0; - public TileEntityBellows() - { - + + public TileEntityBellows() { + } - public void interact(EntityPlayer player, float powerLevel) - { - int x = (int)xCoord; - int y = (int)yCoord; - int z = (int)zCoord; + + public void interact(EntityPlayer player, float powerLevel) { + int x = xCoord; + int y = yCoord; + int z = zCoord; IBellowsUseable forge = getFacingForge(); - if(press < 10) - { - if(player != null) - { + if (press < 10) { + if (player != null) { player.playSound("minefantasy2:block.bellows", 1, 1); - } - else - { + } else { worldObj.playSound(xCoord, yCoord, zCoord, "minefantasy2:block.bellows", 1.0F, 1.0F, false); } press = 50; - if(forge != null) - { + if (forge != null) { forge.onUsedWithBellows(powerLevel); } sendPacketToClients(); } } - + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); - if(press > 0)press -= 2; - if(press < 0)press = 0; + if (press > 0) + press -= 2; + if (press < 0) + press = 0; sendPacketToClients(); } - + private void sendPacketToClients() { // TODO Auto-generated method stub - + + } + + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + direction = nbt.getInteger("direction"); + press = nbt.getInteger("press"); + } + + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("direction", direction); + nbt.setInteger("press", press); } - public void readFromNBT(NBTTagCompound nbt) - { - super.readFromNBT(nbt); - direction = nbt.getInteger("direction"); - press = nbt.getInteger("press"); - } - - - public void writeToNBT(NBTTagCompound nbt) - { - super.writeToNBT(nbt); - nbt.setInteger("direction", direction); - nbt.setInteger("press", press); - } - - - - public ForgeDirection getFacing() - { + + public ForgeDirection getFacing() { int dir = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - switch(dir)//clockwise - { - case 0: //SOUTH - return ForgeDirection.SOUTH; - case 1: //WEST - return ForgeDirection.WEST; - case 2: //NORTH - return ForgeDirection.NORTH; - case 3: //EAST - return ForgeDirection.EAST; - } - return ForgeDirection.SOUTH; - } - public IBellowsUseable getFacingForge() - { - ForgeDirection dir = getFacing(); - int x2 = xCoord + dir.offsetX; - int y2 = yCoord + dir.offsetY; - int z2 = zCoord + dir.offsetZ; - - TileEntity tile = worldObj.getTileEntity(x2, y2, z2); - - if(tile != null && tile instanceof IBellowsUseable) - return (IBellowsUseable)tile; - - if(worldObj.getBlock(x2, y2, z2).getMaterial() != null && worldObj.getBlock(x2, y2, z2).getMaterial().isSolid()) - { - return getFacingForgeThroughWall(); - } - return null; - } - - public IBellowsUseable getFacingForgeThroughWall() - { - ForgeDirection dir = getFacing(); - int x2 = xCoord + (dir.offsetX*2); - int y2 = yCoord + (dir.offsetY*2); - int z2 = zCoord + (dir.offsetZ*2); - - TileEntity tile = worldObj.getTileEntity(x2, y2, z2); - if(tile == null) - return null; - if(tile instanceof IBellowsUseable) - { - return (IBellowsUseable)tile; - } - return null; - } + switch (dir)// clockwise + { + case 0: // SOUTH + return ForgeDirection.SOUTH; + case 1: // WEST + return ForgeDirection.WEST; + case 2: // NORTH + return ForgeDirection.NORTH; + case 3: // EAST + return ForgeDirection.EAST; + } + return ForgeDirection.SOUTH; + } + + public IBellowsUseable getFacingForge() { + ForgeDirection dir = getFacing(); + int x2 = xCoord + dir.offsetX; + int y2 = yCoord + dir.offsetY; + int z2 = zCoord + dir.offsetZ; + + TileEntity tile = worldObj.getTileEntity(x2, y2, z2); + + if (tile != null && tile instanceof IBellowsUseable) + return (IBellowsUseable) tile; + + if (worldObj.getBlock(x2, y2, z2).getMaterial() != null + && worldObj.getBlock(x2, y2, z2).getMaterial().isSolid()) { + return getFacingForgeThroughWall(); + } + return null; + } + + public IBellowsUseable getFacingForgeThroughWall() { + ForgeDirection dir = getFacing(); + int x2 = xCoord + (dir.offsetX * 2); + int y2 = yCoord + (dir.offsetY * 2); + int z2 = zCoord + (dir.offsetZ * 2); + + TileEntity tile = worldObj.getTileEntity(x2, y2, z2); + if (tile == null) + return null; + if (tile instanceof IBellowsUseable) { + return (IBellowsUseable) tile; + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBerryBush.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBerryBush.java index 272a414f..51d7b879 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBerryBush.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBerryBush.java @@ -6,39 +6,34 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; -public class TileEntityBerryBush extends TileEntity -{ +public class TileEntityBerryBush extends TileEntity { private long nextGrowbackTime; private Random rand = new Random(); - + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); - - if(!worldObj.isRemote && worldObj.getTotalWorldTime() >= nextGrowbackTime) - {//Regrow + + if (!worldObj.isRemote && worldObj.getTotalWorldTime() >= nextGrowbackTime) {// Regrow worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); } } - - public void harvestBerries() - { - double[] days = new double[]{2D, 7D}; + + public void harvestBerries() { + double[] days = new double[] { 2D, 7D }; double modifier = MathHelper.getRandomDoubleInRange(rand, days[0], days[1]); - nextGrowbackTime = worldObj.getTotalWorldTime() + (int)(24000*modifier); + nextGrowbackTime = worldObj.getTotalWorldTime() + (int) (24000 * modifier); worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setLong("nextGrowbackTime", nextGrowbackTime); } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); nextGrowbackTime = nbt.getLong("nextGrowbackTime"); } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java index c7019ae6..675de940 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java @@ -14,7 +14,6 @@ import minefantasy.mf2.block.refining.BlockBigFurnace; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.network.packet.BigFurnacePacket; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -27,248 +26,206 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityFurnace; import net.minecraft.util.StatCollector; import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityBigFurnace extends TileEntity implements IBellowsUseable, IInventory, ISidedInventory -{ +public class TileEntityBigFurnace extends TileEntity implements IBellowsUseable, IInventory, ISidedInventory { - //UNIVERSAL + // UNIVERSAL public int fuel; public int maxFuel; public ItemStack[] inv; public int itemMeta; public boolean built = false; private Random rand = new Random(); - - //ANIMATE + + // ANIMATE public int numUsers; public int doorAngle; - - //HEATER + + // HEATER public float heat; public float maxHeat; private int aboveType; public int justShared; - - //FURNACE + + // FURNACE public int progress; private int ticksExisted; private int ticksSinceSync; - + /** - * CLIENT VAR - * This is used to determine if the block is able to emit smoke + * CLIENT VAR This is used to determine if the block is able to emit smoke */ public boolean isBurningClient; - - public TileEntityBigFurnace setBlockType(Block block) - { + + public TileEntityBigFurnace setBlockType(Block block) { blockType = block; return this; } - public TileEntityBigFurnace() - { + + public TileEntityBigFurnace() { super(); inv = new ItemStack[8]; fuel = maxFuel = progress = 0; } - public TileEntityBigFurnace(int meta) - { + + public TileEntityBigFurnace(int meta) { this(); itemMeta = meta; } - @Override - public void onUsedWithBellows(float powerLevel) - { - if(isHeater()) - { - if(justShared > 0) - { + public void onUsedWithBellows(float powerLevel) { + if (isHeater()) { + if (justShared > 0) { return; } justShared = 5; - - if(fuel > 0) - { - int max = (int)((float)maxHeat * 1.5F); - if(heat < max) - { - heat += 50*powerLevel; + + if (fuel > 0) { + int max = (int) (maxHeat * 1.5F); + if (heat < max) { + heat += 50 * powerLevel; } - - for(int a = 0; a < 10; a ++) - { - worldObj.spawnParticle("flame", xCoord+(rand.nextDouble()*0.8D)+0.1D, yCoord + 0.4D, zCoord+(rand.nextDouble()*0.8D)+0.1D, 0, 0.01, 0); + + for (int a = 0; a < 10; a++) { + worldObj.spawnParticle("flame", xCoord + (rand.nextDouble() * 0.8D) + 0.1D, yCoord + 0.4D, + zCoord + (rand.nextDouble() * 0.8D) + 0.1D, 0, 0.01, 0); } } - pumpBellows(-1, 0, powerLevel*0.9F); - pumpBellows(0, -1, powerLevel*0.9F); - pumpBellows(0, 1, powerLevel*0.9F); - pumpBellows(1, 0, powerLevel*0.9F); + pumpBellows(-1, 0, powerLevel * 0.9F); + pumpBellows(0, -1, powerLevel * 0.9F); + pumpBellows(0, 1, powerLevel * 0.9F); + pumpBellows(1, 0, powerLevel * 0.9F); } } - - - private void pumpBellows(int x, int z, float pump) - { + + private void pumpBellows(int x, int z, float pump) { int share = 2; - TileEntity tile = worldObj.getTileEntity(xCoord+x, yCoord, zCoord+z); - if(tile == null)return; - - if(tile instanceof TileEntityBigFurnace) - { - TileEntityBigFurnace furn = (TileEntityBigFurnace)tile; - if(furn.isHeater()) - furn.onUsedWithBellows(pump); + TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord, zCoord + z); + if (tile == null) + return; + + if (tile instanceof TileEntityBigFurnace) { + TileEntityBigFurnace furn = (TileEntityBigFurnace) tile; + if (furn.isHeater()) + furn.onUsedWithBellows(pump); } } + private boolean wasBurning; + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); - - if(!worldObj.isRemote) - { - if(numUsers > 0 && doorAngle < 20) - { - doorAngle ++; + + if (!worldObj.isRemote) { + if (numUsers > 0 && doorAngle < 20) { + doorAngle++; } - - if(numUsers <= 0 && doorAngle > 0) - { - doorAngle --; + + if (numUsers <= 0 && doorAngle > 0) { + doorAngle--; } - if(doorAngle < 0)doorAngle = 0; - if(doorAngle > 20)doorAngle = 20; + if (doorAngle < 0) + doorAngle = 0; + if (doorAngle > 20) + doorAngle = 20; } - + ++ticksExisted; - if(justShared > 0)justShared --; - if(ticksExisted % 10 == 0) - { + if (justShared > 0) + justShared--; + if (ticksExisted % 10 == 0) { built = structureExists(); } - if(isHeater()) - { + if (isHeater()) { updateHeater(); - } - else - { + } else { updateFurnace(); } - //UNIVERSAL - if(isBurning() != wasBurning || ticksExisted == 20) - { + // UNIVERSAL + if (isBurning() != wasBurning || ticksExisted == 20) { worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord); } - if(!worldObj.isRemote) - { + if (!worldObj.isRemote) { sendPacketToClients(); } wasBurning = isBurning(); } - - private void updateFurnace() - { - if(isBurning()) - { - if(worldObj.isRemote && rand.nextInt(10)==0) - { - worldObj.spawnParticle("flame", xCoord+(rand.nextDouble()*0.8D)+0.1D, yCoord + 0.4D, zCoord+(rand.nextDouble()*0.8D)+0.1D, 0, 0.01, 0); + + private void updateFurnace() { + if (isBurning()) { + if (worldObj.isRemote && rand.nextInt(10) == 0) { + worldObj.spawnParticle("flame", xCoord + (rand.nextDouble() * 0.8D) + 0.1D, yCoord + 0.4D, + zCoord + (rand.nextDouble() * 0.8D) + 0.1D, 0, 0.01, 0); } } - if(worldObj.isRemote) - { + if (worldObj.isRemote) { return; } - if(isBurning()) - { + if (isBurning()) { puffSmoke(new Random(), worldObj, xCoord, yCoord, zCoord); } TileEntityBigFurnace heater = getHeater(); - - if(heater != null) - { + + if (heater != null) { heat = heater.heat; - } - else - { + } else { heat -= 4; } boolean canSmelt = false; boolean smelted = false; - - if(getSpecialResult() != null) - { - if(!canFitSpecialResult()) - { + + if (getSpecialResult() != null) { + if (!canFitSpecialResult()) { canSmelt = false; - } - else - { + } else { canSmelt = true; - - if(progress >= getMaxTime()) - { + + if (progress >= getMaxTime()) { smeltSpecial(); smelted = true; } } - } - else for(int a = 0; a < 4; a ++) - { - if(canSmelt(inv[a], inv[a+4])) - { - canSmelt = true; - - if(progress >= getMaxTime()) - { - smeltItem(a, a+4); - smelted = true; + } else + for (int a = 0; a < 4; a++) { + if (canSmelt(inv[a], inv[a + 4])) { + canSmelt = true; + + if (progress >= getMaxTime()) { + smeltItem(a, a + 4); + smelted = true; + } } } - } - - if(canSmelt) - { + + if (canSmelt) { progress += heat; } - if(!canSmelt || smelted) - { + if (!canSmelt || smelted) { progress = 0; } } - - private boolean canFitSpecialResult() - { + + private boolean canFitSpecialResult() { ItemStack spec = getSpecialResult(); - - if(spec != null) - { + + if (spec != null) { int spaceNeeded = spec.stackSize; int spaceLeft = 0; - - for(int a = 4; a < 8; a ++) - { + + for (int a = 4; a < 8; a++) { ItemStack item = inv[a]; - if(inv[a] == null) - { + if (inv[a] == null) { spaceLeft += 64; - } - else - { - if(CustomToolHelper.areEqual(inv[a], spec)) - { - if(inv[a].stackSize < inv[a].getMaxStackSize()) - { + } else { + if (CustomToolHelper.areEqual(inv[a], spec)) { + if (inv[a].stackSize < inv[a].getMaxStackSize()) { spaceLeft += inv[a].getMaxStackSize() - inv[a].stackSize; } } @@ -278,231 +235,181 @@ private boolean canFitSpecialResult() } return false; } - private void smeltSpecial() - { + + private void smeltSpecial() { ItemStack res = getSpecialResult().copy(); - - for(int output = 4; output < 8; output ++) - { - if(res.stackSize <= 0)break; - - if(inv[output] == null) - { + + for (int output = 4; output < 8; output++) { + if (res.stackSize <= 0) + break; + + if (inv[output] == null) { setInventorySlotContents(output, res); break; - } - else - { - if(CustomToolHelper.areEqual(inv[output], res)) - { + } else { + if (CustomToolHelper.areEqual(inv[output], res)) { int spaceLeft = inv[output].getMaxStackSize() - inv[output].stackSize; - - if(res.stackSize <= spaceLeft) - { + + if (res.stackSize <= spaceLeft) { inv[output].stackSize += res.stackSize; break; - } - else - { + } else { inv[output].stackSize += spaceLeft; res.stackSize -= spaceLeft; } } } } - for(int input = 0; input < 4; input ++) - decrStackSize(input, 1); + for (int input = 0; input < 4; input++) + decrStackSize(input, 1); } - - public void puffSmoke(Random rand, World world, int x, int y, int z) - { - if(rand.nextInt(5) != 0) - { + + public void puffSmoke(Random rand, World world, int x, int y, int z) { + if (rand.nextInt(5) != 0) { return; } ForgeDirection dir = getBack(); - SmokeMechanics.emitSmokeIndirect(world, x+dir.offsetX, y+(isHeater() ? 2 : 1), z+dir.offsetZ, 1); + SmokeMechanics.emitSmokeIndirect(world, x + dir.offsetX, y + (isHeater() ? 2 : 1), z + dir.offsetZ, 1); } - - private int getMaxTime() - { + + private int getMaxTime() { return (int) 1.0E+5; } - private void smeltItem(int input, int output) - { + + private void smeltItem(int input, int output) { ItemStack res = getResult(inv[input]).copy(); - - if(inv[output] == null) - { + + if (inv[output] == null) { setInventorySlotContents(output, res); - } - else - { - if(CustomToolHelper.areEqual(inv[output], res)) - { + } else { + if (CustomToolHelper.areEqual(inv[output], res)) { inv[output].stackSize += res.stackSize; } } - + decrStackSize(input, 1); } - private boolean canSmelt(ItemStack in, ItemStack out) - { - if(isHeater()) return false; - - if(!built)return false; - + + private boolean canSmelt(ItemStack in, ItemStack out) { + if (isHeater()) + return false; + + if (!built) + return false; + ItemStack res = getResult(in); - if(res == null) - { + if (res == null) { return false; } - if(out == null) - { + if (out == null) { return true; } - if(CustomToolHelper.areEqual(out, res)) - { + if (CustomToolHelper.areEqual(out, res)) { int max = res.getMaxStackSize(); - if((out.stackSize + res.stackSize) > max) - { + if ((out.stackSize + res.stackSize) > max) { return false; } - } - else - { + } else { return false; } - + return true; } - - private TileEntityBigFurnace getHeater() - { - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord-1, zCoord); - if(tile != null && tile instanceof TileEntityBigFurnace) - { - if(((TileEntityBigFurnace)tile).isHeater()) - return (TileEntityBigFurnace)tile; + + private TileEntityBigFurnace getHeater() { + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (tile != null && tile instanceof TileEntityBigFurnace) { + if (((TileEntityBigFurnace) tile).isHeater()) + return (TileEntityBigFurnace) tile; } return null; } - - private TileEntityBigFurnace getFurnace() - { - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord+1, zCoord); - if(tile != null && tile instanceof TileEntityBigFurnace) - { - if(!((TileEntityBigFurnace)tile).isHeater()) - return (TileEntityBigFurnace)tile; + + private TileEntityBigFurnace getFurnace() { + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + if (tile != null && tile instanceof TileEntityBigFurnace) { + if (!((TileEntityBigFurnace) tile).isHeater()) + return (TileEntityBigFurnace) tile; } return null; } - - private void updateHeater() - { - if(worldObj.isRemote)return; - + + private void updateHeater() { + if (worldObj.isRemote) + return; + TileEntityBigFurnace furn = getFurnace(); - if(furn != null) - { + if (furn != null) { aboveType = furn.getType(); } - if(!built) - { + if (!built) { heat = maxHeat = fuel = maxFuel = 0; return; } - if(heat < maxHeat) - { - heat ++; + if (heat < maxHeat) { + heat++; } - if(heat > maxHeat) - { - heat --; - } - if(fuel > 0) - { - fuel --; + if (heat > maxHeat) { + heat--; } - else - { - if(inv[0] != null && isItemFuel(inv[0])) - { + if (fuel > 0) { + fuel--; + } else { + if (inv[0] != null && isItemFuel(inv[0])) { fuel = maxFuel = getItemBurnTime(inv[0]); maxHeat = getItemHeat(inv[0]); ItemStack cont = inv[0].getItem().getContainerItem(inv[0]); - - if(cont != null) - { + + if (cont != null) { inv[0] = cont; - } - else - { + } else { decrStackSize(0, 1); } } - if(fuel <= 0) - { - if(heat > 0)heat --; + if (fuel <= 0) { + if (heat > 0) + heat--; maxHeat = 0; } } - - + } - - - - private float getItemHeat(ItemStack itemStack) - { + + private float getItemHeat(ItemStack itemStack) { return ForgeItemHandler.getForgeHeat(itemStack); } - public ItemStack getResult(ItemStack item) - { - if(item == null)return null; - - //SPECIAL SMELTING + + public ItemStack getResult(ItemStack item) { + if (item == null) + return null; + + // SPECIAL SMELTING BigFurnaceRecipes recipe = BigFurnaceRecipes.getResult(item); - if(recipe != null && recipe.tier <= this.getTier()) - { + if (recipe != null && recipe.tier <= this.getTier()) { return recipe.result; } - - ItemStack res = FurnaceRecipes.smelting().getSmeltingResult(item);//If no special: try vanilla - if(res != null) - { - if(res.getItem() instanceof ItemFood || item.getItem() instanceof ItemFood) - { + + ItemStack res = FurnaceRecipes.smelting().getSmeltingResult(item);// If no special: try vanilla + if (res != null) { + if (res.getItem() instanceof ItemFood || item.getItem() instanceof ItemFood) { return new ItemStack(FoodListMF.burnt_food, 1, 1); } return res; } - + return null; } - - public ItemStack getSpecialResult() - { + + public ItemStack getSpecialResult() { return null; /* - ItemStack[] input = new ItemStack[4]; - for(int a = 0; a < 4; a ++) - { - input[a] = inv[a]; - } - Alloy alloy = SpecialFurnaceRecipes.getResult(input); - if(alloy != null) - { - if(alloy.getLevel() <= getSmeltLevel()) - { - return SpecialFurnaceRecipes.getResult(input).getRecipeOutput(); - } - } - return null; - */ + * ItemStack[] input = new ItemStack[4]; for(int a = 0; a < 4; a ++) { input[a] + * = inv[a]; } Alloy alloy = SpecialFurnaceRecipes.getResult(input); if(alloy != + * null) { if(alloy.getLevel() <= getSmeltLevel()) { return + * SpecialFurnaceRecipes.getResult(input).getRecipeOutput(); } } return null; + */ } - + public int getSizeInventory() { return inv.length; } @@ -529,35 +436,32 @@ public ItemStack decrStackSize(int i, int j) { } @SideOnly(Side.CLIENT) - public int getBurnTimeRemainingScaled(int height) - { - if (this.maxFuel == 0) - { - this.maxFuel = 200; - } - - return this.fuel * height / this.maxFuel; - } - + public int getBurnTimeRemainingScaled(int height) { + if (this.maxFuel == 0) { + this.maxFuel = 200; + } + + return this.fuel * height / this.maxFuel; + } + @SideOnly(Side.CLIENT) - public int getHeatScaled(int height) - { - if(heat <= 0)return 0; - int size = (int)((float)height / TileEntityForge.maxTemperature * this.heat); - - return (int)Math.min(size, height); - } - + public int getHeatScaled(int height) { + if (heat <= 0) + return 0; + int size = (int) (height / TileEntityForge.maxTemperature * this.heat); + + return Math.min(size, height); + } + @SideOnly(Side.CLIENT) - public int getItemHeatScaled(int height) - { - if(maxHeat <= 0)return 0; - int size = (int)((float)height / TileEntityForge.maxTemperature * this.maxHeat); - - return (int)Math.min(size, height); - } - - + public int getItemHeatScaled(int height) { + if (maxHeat <= 0) + return 0; + int size = (int) (height / TileEntityForge.maxTemperature * this.maxHeat); + + return Math.min(size, height); + } + public void setInventorySlotContents(int i, ItemStack itemstack) { inv[i] = itemstack; if (itemstack != null && itemstack.stackSize > getInventoryStackLimit()) { @@ -565,23 +469,20 @@ public void setInventorySlotContents(int i, ItemStack itemstack) { } } - public String getInvName() - { + public String getInvName() { int t = getType(); String tier = ""; - - if(isHeater()) - { - return StatCollector.translateToLocal("tile.furnace.name") + " " + StatCollector.translateToLocal("block.furnace.heater"); - } - - return tier + " " + StatCollector.translateToLocal("tile.furnace.name"); + + if (isHeater()) { + return StatCollector.translateToLocal("tile.furnace.name") + " " + + StatCollector.translateToLocal("block.furnace.heater"); + } + + return tier + " " + StatCollector.translateToLocal("tile.furnace.name"); } - - + public int getSmeltLevel() { - if(isHeater()) - { + if (isHeater()) { return -1; } return getType() - 1; @@ -589,511 +490,436 @@ public int getSmeltLevel() { public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; + this.inv = new ItemStack[this.getSizeInventory()]; - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); - if (slotNum >= 0 && slotNum < this.inv.length) - { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } justShared = nbt.getInteger("Shared"); built = nbt.getBoolean("Built"); - + fuel = nbt.getInteger("fuel"); maxFuel = nbt.getInteger("MaxFuel"); - + heat = nbt.getFloat("heat"); maxHeat = nbt.getFloat("maxHeat"); - + progress = nbt.getInteger("progress"); aboveType = nbt.getInteger("Level"); } public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setInteger("Shared", justShared); nbt.setInteger("Level", aboveType); nbt.setBoolean("Built", built); - + nbt.setInteger("fuel", fuel); nbt.setInteger("maxFuel", maxFuel); - + nbt.setFloat("heat", heat); nbt.setFloat("maxHeat", maxHeat); - + nbt.setInteger("progress", progress); - + NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.inv.length; ++i) - { - if (this.inv[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } - nbt.setTag("Items", savedItems); + nbt.setTag("Items", savedItems); } public int getInventoryStackLimit() { return 64; } - - - public boolean isBurning() - { - if(worldObj == null) - { + + public boolean isBurning() { + if (worldObj == null) { return false; } - if(worldObj.isRemote) - { + if (worldObj.isRemote) { return isBurningClient; } - if(isHeater()) - { + if (isHeater()) { return heat > 0; } return progress > 0 && heat > 0; } - public boolean isHeater() - { + + public boolean isHeater() { Block block = worldObj != null ? getBlockType() : blockType; - - if(block != null && block instanceof BlockBigFurnace) - { - return ((BlockBigFurnace)block).isHeater; + + if (block != null && block instanceof BlockBigFurnace) { + return ((BlockBigFurnace) block).isHeater; } return false; } - - - public int getTier() - { + + public int getTier() { Block block = worldObj != null ? getBlockType() : blockType; - - if(block != null && block instanceof BlockBigFurnace) - { - return ((BlockBigFurnace)block).tier; + + if (block != null && block instanceof BlockBigFurnace) { + return ((BlockBigFurnace) block).tier; } return 0; } - + public int getItemBurnTime(ItemStack itemstack) { if (itemstack == null) { return 0; } - return (int)Math.ceil(ForgeItemHandler.getForgeFuel(itemstack)/8); + return (int) Math.ceil(ForgeItemHandler.getForgeFuel(itemstack) / 8); } - + public boolean isUseableByPlayer(EntityPlayer entityplayer) { if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { return false; } - return entityplayer.getDistanceSq((double) xCoord + 0.5D, - (double) yCoord + 0.5D, (double) zCoord + 0.5D) <= 64D; + return entityplayer.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64D; } - public void openChest() - { - if(numUsers == 0) - { - this.worldObj.playSoundEffect(xCoord+0.5D, (double)this.yCoord + 0.5D, zCoord+0.5D, "minefantasy2:block.furnace_open", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + public void openChest() { + if (numUsers == 0) { + this.worldObj.playSoundEffect(xCoord + 0.5D, this.yCoord + 0.5D, zCoord + 0.5D, + "minefantasy2:block.furnace_open", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); } ++numUsers; - } + } - public void closeChest() - { - --numUsers; - if(numUsers == 0 && doorAngle >= 15) - { - this.worldObj.playSoundEffect(xCoord+0.5D, (double)this.yCoord + 0.5D, zCoord+0.5D, "minefantasy2:block.furnace_close", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + public void closeChest() { + --numUsers; + if (numUsers == 0 && doorAngle >= 15) { + this.worldObj.playSoundEffect(xCoord + 0.5D, this.yCoord + 0.5D, zCoord + 0.5D, + "minefantasy2:block.furnace_close", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); } - } + } @Override public ItemStack getStackInSlotOnClosing(int var1) { return null; } - - private void sendPacketToClients() - { - if (!worldObj.isRemote) - { - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + private void sendPacketToClients() { + if (!worldObj.isRemote) { + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new BigFurnacePacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, + new BigFurnacePacket(this).generatePacket()); } } } /* - @Override - public void recievePacket(ByteArrayDataInput data) - { - fuel = data.readInt(); - progress = data.readInt(); - direction = data.readInt(); - heat = data.readInt(); - int burn = data.readInt(); - isBurningClient = burn == 1; - justShared = data.readInt(); - doorAngle = data.readInt(); - } - */ - - public int getBlockMetadata() - { - if(worldObj == null) - return itemMeta*2; - - - if (this.blockMetadata == -1) - { - this.blockMetadata = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); - } - - return this.blockMetadata; - } - + * @Override public void recievePacket(ByteArrayDataInput data) { fuel = + * data.readInt(); progress = data.readInt(); direction = data.readInt(); heat = + * data.readInt(); int burn = data.readInt(); isBurningClient = burn == 1; + * justShared = data.readInt(); doorAngle = data.readInt(); } + */ + + public int getBlockMetadata() { + if (worldObj == null) + return itemMeta * 2; + + if (this.blockMetadata == -1) { + this.blockMetadata = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); + } + + return this.blockMetadata; + } + /** - * Heater:0||Stone :1; + * Heater:0||Stone :1; */ - public int getType() - { + public int getType() { return isHeater() ? 0 : 1; } - - private int getOnMetadata() - { - return getType()*2 + 1; + + private int getOnMetadata() { + return getType() * 2 + 1; } - - private int getOffMetadata() - { - return getType()*2; + + private int getOffMetadata() { + return getType() * 2; } - - + @Override public int[] getAccessibleSlotsFromSide(int side) { - if(isHeater()) - { - return new int[]{0}; + if (isHeater()) { + return new int[] { 0 }; } - return new int[]{0, 1, 2, 3, 4, 5, 6, 7}; + return new int[] { 0, 1, 2, 3, 4, 5, 6, 7 }; } - + @Override public boolean canInsertItem(int slot, ItemStack item, int side) { - if(isHeater()) - { + if (isHeater()) { return slot == 0 && isItemFuel(item); } return slot < 4 && getResult(item) != null; } - + @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { return canInsertItem(slot, item, 0); - } - - public boolean isItemFuel(ItemStack item) - { + } + + public boolean isItemFuel(ItemStack item) { return this.getItemBurnTime(item) > 0; } - + @Override - public boolean canExtractItem(int slot, ItemStack item, int side) - { - if(!isHeater()) - { + public boolean canExtractItem(int slot, ItemStack item, int side) { + if (!isHeater()) { return slot >= 4; } return item.getItem() == Items.bucket; } - - - - public int getCookProgressScaled(int i) - { + + public int getCookProgressScaled(int i) { return (progress * i) / getMaxTime(); } - - public boolean isBlockValidForSide(int x, int y, int z) - { - if(worldObj == null) - { + + public boolean isBlockValidForSide(int x, int y, int z) { + if (worldObj == null) { return false; } - + Block block = worldObj.getBlock(x, y, z); - - if(block == null) - { + + if (block == null) { return false; } - - if(block == worldObj.getBlock(xCoord, yCoord, zCoord)) - { + + if (block == worldObj.getBlock(xCoord, yCoord, zCoord)) { return true; } return block == BlockListMF.firebricks; } - - + /** * Checks a valid block for sides. It must be the required block. * - * HEATER: Requires any stone block for bronze, stone above hardness 2.0(like slate)for iron, - * and stone above hardness above 5.0(like granite) for steel + * HEATER: Requires any stone block for bronze, stone above hardness 2.0(like + * slate)for iron, and stone above hardness above 5.0(like granite) for steel * * FURNACES require metal blocks of their material */ - public boolean isBlockValidForTop(int x, int y, int z) - { - if(worldObj == null) - { + public boolean isBlockValidForTop(int x, int y, int z) { + if (worldObj == null) { return false; } Block block = worldObj.getBlock(x, y, z); - - if(block == null) - { + + if (block == null) { return false; } return block == BlockListMF.firebricks; } - - - - public boolean isBlockValidForSide(ForgeDirection side) - { - if(worldObj == null) - { + + public boolean isBlockValidForSide(ForgeDirection side) { + if (worldObj == null) { return false; } - + int x = xCoord + side.offsetX; int y = yCoord + side.offsetY; int z = zCoord + side.offsetZ; - + return isBlockValidForSide(x, y, z); } - - - public boolean isSolid(ForgeDirection side) - { - if(worldObj == null) - { + + public boolean isSolid(ForgeDirection side) { + if (worldObj == null) { return false; } - + int x = xCoord + side.offsetX; int y = yCoord + side.offsetY; int z = zCoord + side.offsetZ; - + Material mat = worldObj.getBlock(x, y, z).getMaterial(); - + return mat.isSolid(); } - - - + /** - * Determines if the furnace is built properly - * HEATER must have sides blocked by stone - * FURNACES must have walls built to specifications + * Determines if the furnace is built properly HEATER must have sides blocked by + * stone FURNACES must have walls built to specifications */ - private boolean structureExists() - { - if(worldObj == null) - { + private boolean structureExists() { + if (worldObj == null) { return false; } - - if(isSolid(getFront())) - { + + if (isSolid(getFront())) { return false; } - - if(!isHeater() && !isBlockValidForTop(xCoord, yCoord+1, zCoord)) - { + + if (!isHeater() && !isBlockValidForTop(xCoord, yCoord + 1, zCoord)) { return false; } - - if(!isBlockValidForSide(getLeft())) - { + + if (!isBlockValidForSide(getLeft())) { return false; } - if(!isBlockValidForSide(getRight())) - { + if (!isBlockValidForSide(getRight())) { return false; } - if(!isBlockValidForSide(getBack())) - { + if (!isBlockValidForSide(getBack())) { return false; } - - + return true; } - - - - - + /** - * Gets the direction the face is at(Opposite to the placer) + * Gets the direction the face is at(Opposite to the placer) */ - public ForgeDirection getFront() - { + public ForgeDirection getFront() { int direction = getDirection(); - if(direction == 0)//SOUTH PLACE + if (direction == 0)// SOUTH PLACE { return ForgeDirection.NORTH; } - if(direction == 1)//WEST PLACE + if (direction == 1)// WEST PLACE { return ForgeDirection.EAST; } - if(direction == 2)//NORTH PLACE + if (direction == 2)// NORTH PLACE { return ForgeDirection.SOUTH; } - if(direction == 3)//EAST PLACE + if (direction == 3)// EAST PLACE { return ForgeDirection.WEST; } return ForgeDirection.UNKNOWN; } - + /** - * Gets the direction the back is facing (Same dir as placer) + * Gets the direction the back is facing (Same dir as placer) */ - public ForgeDirection getBack() - { + public ForgeDirection getBack() { int direction = getDirection(); - if(direction == 0)//SOUTH PLACE + if (direction == 0)// SOUTH PLACE { return ForgeDirection.SOUTH; } - if(direction == 1)//WEST PLACE + if (direction == 1)// WEST PLACE { return ForgeDirection.WEST; } - if(direction == 2)//NORTH PLACE + if (direction == 2)// NORTH PLACE { return ForgeDirection.NORTH; } - if(direction == 3)//EAST PLACE + if (direction == 3)// EAST PLACE { return ForgeDirection.EAST; } return ForgeDirection.UNKNOWN; } - + /** - * Gets the direction the left is facing + * Gets the direction the left is facing */ - public ForgeDirection getLeft() - { + public ForgeDirection getLeft() { int direction = getDirection(); - if(direction == 0)//SOUTH PLACE + if (direction == 0)// SOUTH PLACE { return ForgeDirection.WEST; } - if(direction == 1)//WEST PLACE + if (direction == 1)// WEST PLACE { return ForgeDirection.NORTH; } - if(direction == 2)//NORTH PLACE + if (direction == 2)// NORTH PLACE { return ForgeDirection.EAST; } - if(direction == 3)//EAST PLACE + if (direction == 3)// EAST PLACE { return ForgeDirection.SOUTH; } return ForgeDirection.UNKNOWN; } - + /** - * Gets the direction the right is facing + * Gets the direction the right is facing */ - public ForgeDirection getRight() - { + public ForgeDirection getRight() { int direction = getDirection(); - if(direction == 0)//SOUTH PLACE + if (direction == 0)// SOUTH PLACE { return ForgeDirection.EAST; } - if(direction == 1)//WEST PLACE + if (direction == 1)// WEST PLACE { return ForgeDirection.SOUTH; } - if(direction == 2)//NORTH PLACE + if (direction == 2)// NORTH PLACE { return ForgeDirection.WEST; } - if(direction == 3)//EAST PLACE + if (direction == 3)// EAST PLACE { return ForgeDirection.NORTH; } return ForgeDirection.UNKNOWN; } - - private int getDirection() - { - if(worldObj != null) - { + + private int getDirection() { + if (worldObj != null) { return worldObj.getBlockMetadata(xCoord, yCoord, zCoord); } return 0; } - public String getTexture() - { - if(isHeater()) - { + + public String getTexture() { + if (isHeater()) { return "furnace_heater"; } - return "furnace_rock"; + return "furnace_rock"; } + @Override public String getInventoryName() { // TODO Auto-generated method stub return null; } + @Override public boolean hasCustomInventoryName() { // TODO Auto-generated method stub return false; } + @Override public void openInventory() { // TODO Auto-generated method stub - + } + @Override public void closeInventory() { // TODO Auto-generated method stub - + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java index ce147d46..c63d385a 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.Random; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.crafting.MineFantasyFuels; import minefantasy.mf2.api.crafting.refine.BloomRecipe; import minefantasy.mf2.api.helpers.ToolHelper; @@ -20,130 +22,117 @@ import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraft.world.WorldServer; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class TileEntityBloomery extends TileEntity implements IInventory -{ +public class TileEntityBloomery extends TileEntity implements IInventory { private ItemStack[] inv = new ItemStack[3]; public float progress, progressMax; public boolean hasBloom, isActive; - - public ItemStack getResult() - { + + public ItemStack getResult() { ItemStack input = inv[0]; ItemStack coal = inv[1]; - - if(hasBloom())return null;//Cannot smelt if a bloom exists - if(input == null || coal == null)return null;//Needs input - - if(!hasEnoughCarbon(input, coal)) - { + + if (hasBloom()) + return null;// Cannot smelt if a bloom exists + if (input == null || coal == null) + return null;// Needs input + + if (!hasEnoughCarbon(input, coal)) { return null; } - + return getResult(input); } - private boolean hasEnoughCarbon(ItemStack input, ItemStack coal) - { + + private boolean hasEnoughCarbon(ItemStack input, ItemStack coal) { int amount = input.stackSize; int uses = MineFantasyFuels.getCarbon(coal); - if(uses > 0) - { - int coalNeeded = (int)Math.ceil((float)amount / (float) uses); + if (uses > 0) { + int coalNeeded = (int) Math.ceil((float) amount / (float) uses); MFLogUtil.logDebug("Required Coal: " + coalNeeded); return coal.stackSize == coalNeeded; } return false; } + private Random rand = new Random(); + @Override - public void updateEntity() - { + public void updateEntity() { ++ticksExisted; - if(isActive && progressMax > 0) - { - if(!worldObj.canBlockSeeTheSky(xCoord, yCoord+1, zCoord)) - { + if (isActive && progressMax > 0) { + if (!worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord)) { progressMax = progress = 0; isActive = false; return; } - if(!worldObj.isRemote) - { + if (!worldObj.isRemote) { ++progress; - if(progress >= progressMax) - { + if (progress >= progressMax) { smeltItem(); } - if(rand.nextInt(4) == 0) - { + if (rand.nextInt(4) == 0) { SmokeMechanics.spawnSmoke(worldObj, xCoord, yCoord, zCoord, 1); } } } - if(!worldObj.isRemote && ticksExisted % 20 == 0) - { + if (!worldObj.isRemote && ticksExisted % 20 == 0) { syncData(); } } - - public void syncData() - { - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + public void syncData() { + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new BloomeryPacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, + new BloomeryPacket(this).generatePacket()); } } - + private int ticksExisted; + /** * Light the bloomery, starting the process. + * * @return true if it can smelt */ - public boolean light(EntityPlayer user) - { + public boolean light(EntityPlayer user) { ItemStack res = getResult(); - if(worldObj.canBlockSeeTheSky(xCoord, yCoord+1, zCoord) && res != null && !isActive) - { - if(!worldObj.isRemote) - { - if(res.getItem() == Items.iron_ingot && !ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.smeltIron)) - { + if (worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord) && res != null && !isActive) { + if (!worldObj.isRemote) { + if (res.getItem() == Items.iron_ingot + && !ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.smeltIron)) { return false; } isActive = true; - progressMax = inv[0].stackSize * getTime(inv[0]);//15s per item - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "fire.ignite", 1.0F, 1.0F); + progressMax = inv[0].stackSize * getTime(inv[0]);// 15s per item + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "fire.ignite", 1.0F, 1.0F); } - + return true; } return false; } - private int getTime(ItemStack itemStack) - { + + private int getTime(ItemStack itemStack) { return 300; } /** - * Consumes ALL input and sets output + * Consumes ALL input and sets output */ - public void smeltItem() - { + public void smeltItem() { ItemStack result = getResult(); - if(result != null) - { + if (result != null) { ItemStack res2 = result.copy(); res2.stackSize = inv[0].stackSize; inv[0] = inv[1] = null; @@ -152,40 +141,36 @@ public void smeltItem() isActive = false; progress = progressMax = 0; } - - public boolean tryHammer(EntityPlayer user) - { - if(worldObj.getBlock(xCoord, yCoord+1, zCoord).getMaterial().isSolid()) - { + + public boolean tryHammer(EntityPlayer user) { + if (worldObj.getBlock(xCoord, yCoord + 1, zCoord).getMaterial().isSolid()) { return false; } ItemStack held = user.getHeldItem(); - if(!hasBloom() || isActive) - { + if (!hasBloom() || isActive) { return false; } String toolType = ToolHelper.getCrafterTool(held); float pwr = ToolHelper.getCrafterEfficiency(held); - if(toolType.equalsIgnoreCase("hammer") || toolType.equalsIgnoreCase("hvyHammer")) - { - if(user.worldObj.isRemote)return true; - + if (toolType.equalsIgnoreCase("hammer") || toolType.equalsIgnoreCase("hvyHammer")) { + if (user.worldObj.isRemote) + return true; + held.damageItem(1, user); - if(held.getItemDamage() >= held.getMaxDamage()) - { + if (held.getItemDamage() >= held.getMaxDamage()) { user.destroyCurrentEquippedItem(); user.setCurrentItemOrArmor(0, null); } - - if(rand.nextFloat()*10F < pwr) - { + + if (rand.nextFloat() * 10F < pwr) { ItemStack drop = inv[2].copy(); --inv[2].stackSize; - if(inv[2].stackSize <= 0) - { + if (inv[2].stackSize <= 0) { inv[2] = null; } - if(RPGElements.isSystemActive && RPGElements.getLevel(user, SkillList.artisanry) <= 20)//Only gain xp up to level 20 + if (RPGElements.isSystemActive && RPGElements.getLevel(user, SkillList.artisanry) <= 20)// Only gain xp + // up to level + // 20 { SkillList.artisanry.addXP(user, 1); } @@ -194,201 +179,168 @@ public boolean tryHammer(EntityPlayer user) entityDropItem(worldObj, xCoord, yCoord, zCoord, drop); syncData(); } - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "minefantasy2:block.anvilsucceed", 0.25F, 1.0F); - + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilsucceed", + 0.25F, 1.0F); + return true; } return false; } - public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) - { - if (item.stackSize != 0 && item.getItem() != null) - { - EntityItem entityitem = new EntityItem(world, x+0.5D, y+1.25F, z+0.5D, item); - entityitem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(entityitem); - entityitem.motionX = entityitem.motionY = entityitem.motionZ = 0; - return entityitem; - } - else - { - return null; - } - } - - public boolean hasBloom() - { - if(worldObj.isRemote) - { + + public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) { + if (item.stackSize != 0 && item.getItem() != null) { + EntityItem entityitem = new EntityItem(world, x + 0.5D, y + 1.25F, z + 0.5D, item); + entityitem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(entityitem); + entityitem.motionX = entityitem.motionY = entityitem.motionZ = 0; + return entityitem; + } else { + return null; + } + } + + public boolean hasBloom() { + if (worldObj.isRemote) { return hasBloom; } return inv[2] != null; } @Override - public int getSizeInventory() - { + public int getSizeInventory() { return inv.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return inv[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { - if (this.inv[slot] != null) - { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) - { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } - else - { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) - { - this.inv[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + public ItemStack decrStackSize(int slot, int num) { + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return inv[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { inv[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return "gui.carpentermf.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { - if(item != null && TileEntityBlastFC.isCarbon(item)) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (item != null && TileEntityBlastFC.isCarbon(item)) { return slot == 1; } - if(item != null && getResult(item) != null) - { + if (item != null && getResult(item) != null) { return slot == 0; } return false; } - + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) - { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - progress = nbt.getFloat("Progress"); - progressMax = nbt.getFloat("ProgressMax"); - hasBloom = nbt.getBoolean("hasBloom"); - isActive = nbt.getBoolean("isActive"); -} - + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + progress = nbt.getFloat("Progress"); + progressMax = nbt.getFloat("ProgressMax"); + hasBloom = nbt.getBoolean("hasBloom"); + isActive = nbt.getBoolean("isActive"); + } + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.inv.length; ++i) - { - if (this.inv[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - - nbt.setFloat("Progress", progress); - nbt.setFloat("ProgressMax", progressMax); - nbt.setBoolean("hasBloom", hasBloom); - nbt.setBoolean("isActive", isActive); + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + + nbt.setFloat("Progress", progress); + nbt.setFloat("ProgressMax", progressMax); + nbt.setBoolean("hasBloom", hasBloom); + nbt.setBoolean("isActive", isActive); } - public static boolean isInput(ItemStack input) - { + public static boolean isInput(ItemStack input) { return getResult(input) != null; } - private static ItemStack getResult(ItemStack input) - { + private static ItemStack getResult(ItemStack input) { return BloomRecipe.getSmeltingResult(input); } + @SideOnly(Side.CLIENT) - public String getTextureName() - { + public String getTextureName() { return "bloomery_basic"; } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java index b47143fd..cb991ca6 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java @@ -7,7 +7,6 @@ import minefantasy.mf2.api.crafting.engineer.IBombComponent; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.knowledge.ResearchLogic; -import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.item.gadget.ItemBomb; import minefantasy.mf2.item.gadget.ItemExplodingArrow; @@ -27,190 +26,157 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.WorldServer; -public class TileEntityBombBench extends TileEntity implements IInventory, ISidedInventory, IBasicMetre -{ +public class TileEntityBombBench extends TileEntity implements IInventory, ISidedInventory, IBasicMetre { private ItemStack[] inv = new ItemStack[6]; private Random rand = new Random(); public float progress; public float maxProgress = 25F; - + public boolean hasRecipe; - + private int ticksExisted; + @Override - public void updateEntity() - { + public void updateEntity() { ++ticksExisted; - if(!worldObj.isRemote && (hasRecipe || ticksExisted % 100 == 0)) - { + if (!worldObj.isRemote && (hasRecipe || ticksExisted % 100 == 0)) { syncData(); } } - public boolean tryCraft(EntityPlayer user, boolean pressUsed) - { - boolean sticky = !pressUsed && ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.stickybomb) && user.getHeldItem() != null && user.getHeldItem().getItem() == Items.slime_ball; - if(!worldObj.isRemote && sticky && applySlime()) - { + + public boolean tryCraft(EntityPlayer user, boolean pressUsed) { + boolean sticky = !pressUsed && ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.stickybomb) + && user.getHeldItem() != null && user.getHeldItem().getItem() == Items.slime_ball; + if (!worldObj.isRemote && sticky && applySlime()) { user.inventory.consumeInventoryItem(Items.slime_ball); return true; } ItemStack result = findResult(); hasRecipe = result != null; - - if(result == null) - { + + if (result == null) { progress = 0F; - } - else if((pressUsed || ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("spanner"))) - { - if(!pressUsed && user.getHeldItem() != null) - { - worldObj.playSoundEffect(xCoord+0.5, yCoord, zCoord+0.5, "minefantasy2:block.twistbolt", 0.25F, 1.0F); + } else if ((pressUsed || ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("spanner"))) { + if (!pressUsed && user.getHeldItem() != null) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "minefantasy2:block.twistbolt", 0.25F, + 1.0F); user.getHeldItem().damageItem(1, user); - if(user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) - { + if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { user.destroyCurrentEquippedItem(); } } float efficiency = pressUsed ? maxProgress : ToolHelper.getCrafterEfficiency(user.getHeldItem()); - - if(!pressUsed && user.swingProgress > 0 && user.swingProgress <= 1.0) - { - efficiency *= (0.5F-user.swingProgress); + + if (!pressUsed && user.swingProgress > 0 && user.swingProgress <= 1.0) { + efficiency *= (0.5F - user.swingProgress); } - - if(!worldObj.isRemote) - { + + if (!worldObj.isRemote) { progress += efficiency; } - if((progress >= maxProgress && craftItem(result))) - { - worldObj.playSoundEffect(xCoord+0.5, yCoord, zCoord+0.5, "random.door_open", 0.35F, 0.5F); + if ((progress >= maxProgress && craftItem(result))) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "random.door_open", 0.35F, 0.5F); progress = 0; - if(user != null) - { + if (user != null) { SkillList.engineering.addXP(user, 2); } boolean isArrow = isMatch(0, "arrow") || isMatch(0, "bolt"); - for(int a = 0; a < 4; a++) - { - if(!(isArrow && a == 3)) - { + for (int a = 0; a < 4; a++) { + if (!(isArrow && a == 3)) { ItemStack item = getStackInSlot(a); - if(item != null && item.getItem().getContainerItem(item) != null) - { - //START CONTAINER CODE + if (item != null && item.getItem().getContainerItem(item) != null) { + // START CONTAINER CODE ItemStack cont = item.getItem().getContainerItem(item); ItemStack spare = getStackInSlot(5); - if(spare == null) - { + if (spare == null) { setInventorySlotContents(5, cont); cont = null; - } - else if(spare.isItemEqual(cont)) - { - if(spare.stackSize + cont.stackSize <= spare.getMaxStackSize()) - { + } else if (spare.isItemEqual(cont)) { + if (spare.stackSize + cont.stackSize <= spare.getMaxStackSize()) { spare.stackSize += cont.stackSize; cont = null; - } - else - { + } else { int room_left = spare.getMaxStackSize() - spare.stackSize; spare.stackSize += room_left; cont.stackSize -= room_left; } } - if(cont != null && !worldObj.isRemote) - { - EntityItem ei = new EntityItem(worldObj, xCoord+0.5, yCoord+0.5, zCoord+0.5, cont); + if (cont != null && !worldObj.isRemote) { + EntityItem ei = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, + cont); worldObj.spawnEntityInWorld(ei); } } - //END CONTAINER CODE + // END CONTAINER CODE decrStackSize(a, 1); } - } + } } return true; } return false; } - private boolean applySlime() - { + + private boolean applySlime() { ItemStack res = getStackInSlot(4); - - if(res != null && res.getItem() instanceof ItemBomb) - { - if(res.hasTagCompound() && !res.getTagCompound().hasKey("stickyBomb")) - { + + if (res != null && res.getItem() instanceof ItemBomb) { + if (res.hasTagCompound() && !res.getTagCompound().hasKey("stickyBomb")) { res.getTagCompound().setBoolean("stickyBomb", true); return true; } } return false; } - private boolean craftItem(ItemStack result) - { - if(inv[4] == null) - { + + private boolean craftItem(ItemStack result) { + if (inv[4] == null) { this.setInventorySlotContents(4, result); return true; - } - else - { - if(areItemsEqual(result, inv[4]) && (inv[4].stackSize + result.stackSize) <= inv[4].getMaxStackSize()) - { + } else { + if (areItemsEqual(result, inv[4]) && (inv[4].stackSize + result.stackSize) <= inv[4].getMaxStackSize()) { inv[4].stackSize++; return true; - } - else - { + } else { return false; } } } - public void syncData() - { - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + public void syncData() { + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new BombBenchPacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, + new BombBenchPacket(this).generatePacket()); } } - - private boolean areItemsEqual(ItemStack bomb1, ItemStack bomb2) - { - if(ItemBomb.getCasing(bomb1) != ItemBomb.getCasing(bomb2)) - { + + private boolean areItemsEqual(ItemStack bomb1, ItemStack bomb2) { + if (ItemBomb.getCasing(bomb1) != ItemBomb.getCasing(bomb2)) { return false; } - if(ItemBomb.getPowder(bomb1) != ItemBomb.getPowder(bomb2)) - { + if (ItemBomb.getPowder(bomb1) != ItemBomb.getPowder(bomb2)) { return false; } - if(ItemBomb.getFilling(bomb1) != ItemBomb.getFilling(bomb2)) - { + if (ItemBomb.getFilling(bomb1) != ItemBomb.getFilling(bomb2)) { return false; } - if(ItemBomb.getFuse(bomb1) != ItemBomb.getFuse(bomb2)) - { + if (ItemBomb.getFuse(bomb1) != ItemBomb.getFuse(bomb2)) { return false; } return bomb1.isItemEqual(bomb2); } - public void onInventoryChanged() - { + + public void onInventoryChanged() { } - - private ItemStack findResult() - { + + private ItemStack findResult() { boolean isArrow = isMatch(0, "arrow") || isMatch(0, "bolt"); - if(!isMatch(1, "powder") || (!isArrow && !isMatch(3, "fuse"))) - { + if (!isMatch(1, "powder") || (!isArrow && !isMatch(3, "fuse"))) { return null; } byte caseTier = -1; @@ -222,299 +188,245 @@ private ItemStack findResult() String com1 = getComponentType(inv[1]); String com2 = getComponentType(inv[2]); String com3 = getComponentType(inv[3]); - if(com0 != null) - { + if (com0 != null) { caseTier = getComponentTier(inv[0]); String type = com0; design = getDesignCrafted(type); } - if(com1 != null) - { - if(com1.equalsIgnoreCase("powder")) - { + if (com1 != null) { + if (com1.equalsIgnoreCase("powder")) { powder = getComponentTier(inv[1]); - } - else - { + } else { return null; } - } - else return null; - if(com2 != null) - { - if(com2.equalsIgnoreCase("filling")) - { + } else + return null; + if (com2 != null) { + if (com2.equalsIgnoreCase("filling")) { filling = getComponentTier(inv[2]); - } - else - { + } else { return null; } } - if(isArrow || com3 != null) - { - if(!isArrow) - { - if(com3.equalsIgnoreCase("fuse")) - { + if (isArrow || com3 != null) { + if (!isArrow) { + if (com3.equalsIgnoreCase("fuse")) { fuse = getComponentTier(inv[3]); - } - else - { + } else { return null; } } - } - else return null; - - if(design != null && isArrow && powder > -1) - { + } else + return null; + + if (design != null && isArrow && powder > -1) { return ItemExplodingArrow.createBombArrow(design, powder, filling); - } - else if(design != null && fuse > -1 && powder > -1) - { + } else if (design != null && fuse > -1 && powder > -1) { return ItemBomb.createExplosive(design, caseTier, filling, fuse, powder, 1, false); } return null; } - - private Item getDesignCrafted(String type) - { - if(type.equalsIgnoreCase("bombcase")) - { + + private Item getDesignCrafted(String type) { + if (type.equalsIgnoreCase("bombcase")) { return ToolListMF.bomb_custom; } - if(type.equalsIgnoreCase("minecase")) - { + if (type.equalsIgnoreCase("minecase")) { return ToolListMF.mine_custom; } - if(type.equalsIgnoreCase("arrow")) - { + if (type.equalsIgnoreCase("arrow")) { return ToolListMF.exploding_arrow; } - if(type.equalsIgnoreCase("bolt")) - { + if (type.equalsIgnoreCase("bolt")) { return ToolListMF.exploding_bolt; } return null; } - private boolean isMatch(int slot, String type) - { + + private boolean isMatch(int slot, String type) { return isMatch(inv[slot], type); } - public static boolean isMatch(ItemStack item, String type) - { + + public static boolean isMatch(ItemStack item, String type) { String component = getComponentType(item); return component != null && component.equalsIgnoreCase(type); } - public static String getComponentType(ItemStack item) - { - if(item != null && item.getItem() != null && item.getItem() instanceof IBombComponent) - { - return ((IBombComponent)item.getItem()).getComponentType(); + + public static String getComponentType(ItemStack item) { + if (item != null && item.getItem() != null && item.getItem() instanceof IBombComponent) { + return ((IBombComponent) item.getItem()).getComponentType(); } return null; } - public static byte getComponentTier(ItemStack item) - { - if(item != null && item.getItem() != null && item.getItem() instanceof IBombComponent) - { - return ((IBombComponent)item.getItem()).getTier(); + + public static byte getComponentTier(ItemStack item) { + if (item != null && item.getItem() != null && item.getItem() instanceof IBombComponent) { + return ((IBombComponent) item.getItem()).getTier(); } - return (byte)0; + return (byte) 0; } - - - //INVENORY - + + // INVENORY + @Override - public int getSizeInventory() - { + public int getSizeInventory() { return inv.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return inv[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { onInventoryChanged(); - if (this.inv[slot] != null) - { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) - { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } - else - { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) - { - this.inv[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return inv[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { onInventoryChanged(); inv[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return "gui.bombcraftmf.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { - if(this.isMatch(item, "bolt") || this.isMatch(item, "arrow") || this.isMatch(item, "bombcase") || this.isMatch(item, "minecase")) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (this.isMatch(item, "bolt") || this.isMatch(item, "arrow") || this.isMatch(item, "bombcase") + || this.isMatch(item, "minecase")) { return slot == 0; } - if(this.isMatch(item, "powder")) - { + if (this.isMatch(item, "powder")) { return slot == 1; } - if(this.isMatch(item, "filling")) - { + if (this.isMatch(item, "filling")) { return slot == 2; } - if(this.isMatch(item, "fuse")) - { + if (this.isMatch(item, "fuse")) { return slot == 3; } return false; } - - + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) - { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - progress = nbt.getFloat("progress"); - maxProgress = nbt.getFloat("maxProgress"); - hasRecipe = nbt.getBoolean("hasRecipe"); - } - + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + progress = nbt.getFloat("progress"); + maxProgress = nbt.getFloat("maxProgress"); + hasRecipe = nbt.getBoolean("hasRecipe"); + } + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.inv.length; ++i) - { - if (this.inv[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - nbt.setFloat("progress", progress); - nbt.setFloat("maxProgress", maxProgress); - nbt.setBoolean("hasRecipe", hasRecipe); + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + nbt.setFloat("progress", progress); + nbt.setFloat("maxProgress", maxProgress); + nbt.setBoolean("hasRecipe", hasRecipe); } + @Override - public int[] getAccessibleSlotsFromSide(int side) - { - return new int[]{0, 1, 2, 3, 4}; + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] { 0, 1, 2, 3, 4 }; } + @Override - public boolean canInsertItem(int slot, ItemStack item, int side) - { + public boolean canInsertItem(int slot, ItemStack item, int side) { return this.isItemValidForSlot(slot, item); } + @Override - public boolean canExtractItem(int slot, ItemStack item, int side) - { + public boolean canExtractItem(int slot, ItemStack item, int side) { return slot == 4; } + @Override - public int getMetreScale(int size) - { - return (int)Math.min(size, (float)size / maxProgress * progress); + public int getMetreScale(int size) { + return (int) Math.min(size, size / maxProgress * progress); } + @Override - public boolean shouldShowMetre() - { + public boolean shouldShowMetre() { return true; } + @Override - public String getLocalisedName() - { + public String getLocalisedName() { return StatCollector.translateToLocal("tile.bombBench.name"); } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombPress.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombPress.java index bcdb6df4..f8089550 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombPress.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombPress.java @@ -1,43 +1,32 @@ package minefantasy.mf2.block.tileentity; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -public class TileEntityBombPress extends TileEntity -{ +public class TileEntityBombPress extends TileEntity { public float animation = 0F; - + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); - if(worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) - { - if(animation <= 0) - { + if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) { + if (animation <= 0) { use(null); } animation = 1.0F; - } - else - { - if(animation > 0) - { + } else { + if (animation > 0) { animation -= 0.05F; } } } - - public void use(EntityPlayer user) - { - TileEntity under = worldObj.getTileEntity(xCoord, yCoord-1, zCoord); - if(animation <= 0 && under != null && under instanceof TileEntityBombBench) - { - ((TileEntityBombBench)under).tryCraft(user, true); + + public void use(EntityPlayer user) { + TileEntity under = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (animation <= 0 && under != null && under instanceof TileEntityBombBench) { + ((TileEntityBombBench) under).tryCraft(user, true); animation = 1.0F; - worldObj.playSoundEffect(xCoord+0.5, yCoord+0.5, zCoord+0.5, "tile.piston.out", 1.0F, 0.75F); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "tile.piston.out", 1.0F, 0.75F); } } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java index 82a2d22a..cb10bf9d 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java @@ -17,7 +17,6 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -25,12 +24,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; -public class TileEntityCarpenterMF extends TileEntity implements IInventory, ICarpenter -{ +public class TileEntityCarpenterMF extends TileEntity implements IInventory, ICarpenter { private int tier; private ItemStack[] inventory; private Random rand = new Random(); - private int ticksExisted; + private int ticksExisted; private ContainerCarpenterMF syncCarpenter; private CarpenterCraftMatrix craftMatrix; private String lastPlayerHit = ""; @@ -39,185 +37,157 @@ public class TileEntityCarpenterMF extends TileEntity implements IInventory, ICa private String researchRequired = ""; private Skill skillUsed; private boolean resetRecipe = false; - + public final int width = 4; public final int height = 4; - public TileEntityCarpenterMF() - { + + public TileEntityCarpenterMF() { this(0); } - public TileEntityCarpenterMF(int tier) - { - inventory = new ItemStack[width*height+5]; - this.tier=tier; + + public TileEntityCarpenterMF(int tier) { + inventory = new ItemStack[width * height + 5]; + this.tier = tier; setContainer(new ContainerCarpenterMF(this)); } - + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); tier = nbt.getInteger("tier"); - + NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inventory = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inventory.length) - { - this.inventory[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - progress = nbt.getFloat("Progress"); - progressMax = nbt.getFloat("ProgressMax"); - resName = nbt.getString("ResultName"); - toolTypeRequired = nbt.getString("toolTypeRequired"); - craftSound = nbt.getString("craftSound"); - researchRequired = nbt.getString("researchRequired"); - } - + this.inventory = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inventory.length) { + this.inventory[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + progress = nbt.getFloat("Progress"); + progressMax = nbt.getFloat("ProgressMax"); + resName = nbt.getString("ResultName"); + toolTypeRequired = nbt.getString("toolTypeRequired"); + craftSound = nbt.getString("craftSound"); + researchRequired = nbt.getString("researchRequired"); + } + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("tier", tier); - + NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.inventory.length; ++i) - { - if (this.inventory[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.inventory[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - - nbt.setFloat("Progress", progress); - nbt.setFloat("ProgressMax", progressMax); - nbt.setString("ResName", resName); - nbt.setString("toolTypeRequired", toolTypeRequired); - nbt.setString("craftSound", craftSound); - nbt.setString("researchRequired", researchRequired); + for (int i = 0; i < this.inventory.length; ++i) { + if (this.inventory[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inventory[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + + nbt.setFloat("Progress", progress); + nbt.setFloat("ProgressMax", progressMax); + nbt.setString("ResName", resName); + nbt.setString("toolTypeRequired", toolTypeRequired); + nbt.setString("craftSound", craftSound); + nbt.setString("researchRequired", researchRequired); } @Override - public int getSizeInventory() - { + public int getSizeInventory() { return inventory.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return inventory[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { onInventoryChanged(); - if (this.inventory[slot] != null) - { - ItemStack itemstack; - - if (this.inventory[slot].stackSize <= num) - { - itemstack = this.inventory[slot]; - this.inventory[slot] = null; - return itemstack; - } - else - { - itemstack = this.inventory[slot].splitStack(num); - - if (this.inventory[slot].stackSize == 0) - { - this.inventory[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + if (this.inventory[slot] != null) { + ItemStack itemstack; + + if (this.inventory[slot].stackSize <= num) { + itemstack = this.inventory[slot]; + this.inventory[slot] = null; + return itemstack; + } else { + itemstack = this.inventory[slot].splitStack(num); + + if (this.inventory[slot].stackSize == 0) { + this.inventory[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return inventory[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { onInventoryChanged(); inventory[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return "gui.carpentermf.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { return true; } + @Override - public void updateEntity() - { + public void updateEntity() { ++ticksExisted; super.updateEntity(); - if(!worldObj.isRemote) - { - if(ticksExisted % 20 == 0) - { + if (!worldObj.isRemote) { + if (ticksExisted % 20 == 0) { updateCraftingData(); } - if(!canCraft() && ticksExisted > 1) - { + if (!canCraft() && ticksExisted > 1) { progress = progressMax = 0; this.resName = ""; this.recipe = null; @@ -225,58 +195,49 @@ public void updateEntity() } resetRecipe = false; } - - public void onInventoryChanged() - { - if(!resetRecipe) - { + + public void onInventoryChanged() { + if (!resetRecipe) { updateCraftingData(); MFLogUtil.logDebug("Carpenter: Optimised Inv Tick"); resetRecipe = true; } } - - public boolean tryCraft(EntityPlayer user) - { - if(user == null)return false; - + + public boolean tryCraft(EntityPlayer user) { + if (user == null) + return false; + String toolType = ToolHelper.getCrafterTool(user.getHeldItem()); int hammerTier = ToolHelper.getCrafterTier(user.getHeldItem()); - if(!toolType.equalsIgnoreCase("nothing")) - { - if(user.getHeldItem() != null) - { + if (!toolType.equalsIgnoreCase("nothing")) { + if (user.getHeldItem() != null) { user.getHeldItem().damageItem(1, user); - if(user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) - { - if(worldObj.isRemote) + if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { + if (worldObj.isRemote) user.renderBrokenItemStack(user.getHeldItem()); - + user.destroyCurrentEquippedItem(); } } - if(worldObj.isRemote) + if (worldObj.isRemote) return true; - - if(doesPlayerKnowCraft(user) && canCraft() && toolType.equalsIgnoreCase(toolTypeRequired) && tier >= CarpenterTierRequired && hammerTier >= hammerTierRequired) - { - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, getUseSound(), 1.0F, 1.0F); + + if (doesPlayerKnowCraft(user) && canCraft() && toolType.equalsIgnoreCase(toolTypeRequired) + && tier >= CarpenterTierRequired && hammerTier >= hammerTierRequired) { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, getUseSound(), 1.0F, 1.0F); float efficiency = ToolHelper.getCrafterEfficiency(user.getHeldItem()); - - if(user.swingProgress > 0 && user.swingProgress <= 1.0) - { - efficiency *= (0.5F-user.swingProgress); + + if (user.swingProgress > 0 && user.swingProgress <= 1.0) { + efficiency *= (0.5F - user.swingProgress); } - + progress += Math.max(0.2F, efficiency); - if(progress >= progressMax) - { + if (progress >= progressMax) { craftItem(user); } - } - else - { - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "step.stone", 1.25F, 1.5F); + } else { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "step.stone", 1.25F, 1.5F); } lastPlayerHit = user.getCommandSenderName(); updateCraftingData(); @@ -285,372 +246,325 @@ public boolean tryCraft(EntityPlayer user) updateCraftingData(); return false; } - - private String getUseSound() - { - if(craftSound.equalsIgnoreCase("engineering")) - { - if(rand.nextInt(5) == 0) - { + + private String getUseSound() { + if (craftSound.equalsIgnoreCase("engineering")) { + if (rand.nextInt(5) == 0) { return "random.click"; } - if(rand.nextInt(20) == 0) - { + if (rand.nextInt(20) == 0) { return "random.door_open"; } return "step.wood"; } return craftSound; } - private void craftItem(EntityPlayer user) - { - if (this.canCraft()) - { + + private void craftItem(EntityPlayer user) { + if (this.canCraft()) { addXP(user); ItemStack result = recipe.copy(); - if(result != null && result.getItem() instanceof ItemArmourMF) - { + if (result != null && result.getItem() instanceof ItemArmourMF) { result = modifyArmour(result); } int output = getOutputSlotNum(); - - if (this.inventory[output] == null) - { - if(result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) - { - getNBT(result).setString("MF_CraftedByName", lastPlayerHit); - } - this.inventory[output] = result; - } - else if (this.inventory[output].getItem() == result.getItem()) - { - this.inventory[output].stackSize += result.stackSize; // Forge BugFix: Results may have multiple items - } - consumeResources(); - } + + if (this.inventory[output] == null) { + if (result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) { + getNBT(result).setString("MF_CraftedByName", lastPlayerHit); + } + this.inventory[output] = result; + } else if (this.inventory[output].getItem() == result.getItem()) { + this.inventory[output].stackSize += result.stackSize; // Forge BugFix: Results may have multiple items + } + consumeResources(); + } onInventoryChanged(); progress = 0; } - private int getOutputSlotNum() - { - return getSizeInventory()-5; + + private int getOutputSlotNum() { + return getSizeInventory() - 5; } - private ItemStack modifyArmour(ItemStack result) - { - ItemArmourMF item = (ItemArmourMF)result.getItem(); + + private ItemStack modifyArmour(ItemStack result) { + ItemArmourMF item = (ItemArmourMF) result.getItem(); boolean canColour = item.canColour(); int colour = -1; - for(int a = 0; a < getOutputSlotNum(); a++) - { + for (int a = 0; a < getOutputSlotNum(); a++) { ItemStack slot = getStackInSlot(a); - if(slot != null && slot.getItem() instanceof ItemArmor) - { - ItemArmor slotitem = (ItemArmor)slot.getItem(); - if(canColour && slotitem.hasColor(slot)) - { + if (slot != null && slot.getItem() instanceof ItemArmor) { + ItemArmor slotitem = (ItemArmor) slot.getItem(); + if (canColour && slotitem.hasColor(slot)) { colour = slotitem.getColor(slot); } - if(result.isItemStackDamageable()) - { + if (result.isItemStackDamageable()) { result.setItemDamage(slot.getItemDamage()); } } } - if(colour != -1 && canColour) - { + if (colour != -1 && canColour) { item.func_82813_b(result, colour); } return result; } - private NBTTagCompound getNBT(ItemStack item) - { - if(!item.hasTagCompound()) - { + + private NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } return item.getTagCompound(); } - private void dropItem(ItemStack itemstack) - { - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - worldObj.spawnEntityInWorld(entityitem); - } - } - } - - public void syncData() - { - - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + private void dropItem(ItemStack itemstack) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + worldObj.spawnEntityInWorld(entityitem); + } + } + } + + public void syncData() { + + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new CarpenterPacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, + new CarpenterPacket(this).generatePacket()); } } + public String resName = ""; - public String getResultName() - { - if(!worldObj.isRemote && recipe != null && recipe.getItem() != null && recipe.getDisplayName() != null) - { + + public String getResultName() { + if (!worldObj.isRemote && recipe != null && recipe.getItem() != null && recipe.getDisplayName() != null) { resName = recipe.getDisplayName(); } return resName; } - public String getToolNeeded() - { + + public String getToolNeeded() { return toolTypeRequired; } - public String getCraftingSound() - { + + public String getCraftingSound() { return craftSound; } - public int getToolTierNeeded() - { + + public int getToolTierNeeded() { return this.hammerTierRequired; } - public int getCarpenterTierNeeded() - { + + public int getCarpenterTierNeeded() { return this.CarpenterTierRequired; } - public void consumeResources() - { + + public void consumeResources() { resetRecipe = true; - for(int slot = 0; slot < getOutputSlotNum(); slot++) - { + for (int slot = 0; slot < getOutputSlotNum(); slot++) { ItemStack item = getStackInSlot(slot); - if(item != null && item.getItem() != null && item.getItem().getContainerItem(item) != null) - { - if(item.stackSize == 1) - { + if (item != null && item.getItem() != null && item.getItem().getContainerItem(item) != null) { + if (item.stackSize == 1) { setInventorySlotContents(slot, item.getItem().getContainerItem(item)); - } - else - { + } else { ItemStack drop = processSurplus(item.getItem().getContainerItem(item)); - if(drop != null) - { + if (drop != null) { this.dropItem(drop); } this.decrStackSize(slot, 1); } - } - else - { + } else { this.decrStackSize(slot, 1); } } resetRecipe = false; this.onInventoryChanged(); } - private ItemStack processSurplus(ItemStack item) - { - for(int a = 0; a < 4; a++) - { - if(item == null) - { - return null;//If item was sorted + + private ItemStack processSurplus(ItemStack item) { + for (int a = 0; a < 4; a++) { + if (item == null) { + return null;// If item was sorted } - - int s = getSizeInventory()-4 + a; + + int s = getSizeInventory() - 4 + a; ItemStack slot = inventory[s]; - if(slot == null) - { - setInventorySlotContents(s, item); - return null;//All Placed - } - else - { - if(slot.isItemEqual(item) && slot.stackSize < slot.getMaxStackSize()) - { - if(slot.stackSize + item.stackSize <= slot.getMaxStackSize()) - { + if (slot == null) { + setInventorySlotContents(s, item); + return null;// All Placed + } else { + if (slot.isItemEqual(item) && slot.stackSize < slot.getMaxStackSize()) { + if (slot.stackSize + item.stackSize <= slot.getMaxStackSize()) { slot.stackSize += item.stackSize; - return null;//All Shared - } - else - { + return null;// All Shared + } else { int room_left = slot.getMaxStackSize() - slot.stackSize; slot.stackSize += room_left; - item.stackSize -= room_left;//Share + item.stackSize -= room_left;// Share } } } } return item; } - private boolean canFitResult(ItemStack result) - { + + private boolean canFitResult(ItemStack result) { ItemStack resSlot = inventory[getOutputSlotNum()]; - if(resSlot != null && result != null) - { - if(!resSlot.isItemEqual(result)) - { + if (resSlot != null && result != null) { + if (!resSlot.isItemEqual(result)) { return false; } - if(resSlot.stackSize + result.stackSize > resSlot.getMaxStackSize()) - { + if (resSlot.stackSize + result.stackSize > resSlot.getMaxStackSize()) { return false; } } return true; } - //CRAFTING CODE - public ItemStack getResult() - { - if(syncCarpenter == null || craftMatrix == null) - { - return null; - } - - if(ticksExisted <= 1) - return null; - - for(int a = 0 ; a < getOutputSlotNum() ; a ++) - { - craftMatrix.setInventorySlotContents(a, inventory[a]); - } - - return CraftingManagerCarpenter.getInstance().findMatchingRecipe(this, craftMatrix); - } - public void updateCraftingData() - { - if(!worldObj.isRemote) - { - ItemStack oldRecipe = recipe; - recipe = getResult(); - //syncItems(); - - if (!canCraft() && progress > 0) - { - progress = 0; - //quality = 100; - } - if(recipe != null && oldRecipe != null && !recipe.isItemEqual(oldRecipe)) - { - progress = 0; - } - if(progress > progressMax)progress = progressMax-1; - syncData(); - } - } - public boolean canCraft() - { - if(worldObj.isRemote) - { - //return canCraft == 1; + + // CRAFTING CODE + public ItemStack getResult() { + if (syncCarpenter == null || craftMatrix == null) { + return null; + } + + if (ticksExisted <= 1) + return null; + + for (int a = 0; a < getOutputSlotNum(); a++) { + craftMatrix.setInventorySlotContents(a, inventory[a]); + } + + return CraftingManagerCarpenter.getInstance().findMatchingRecipe(this, craftMatrix); + } + + public void updateCraftingData() { + if (!worldObj.isRemote) { + ItemStack oldRecipe = recipe; + recipe = getResult(); + // syncItems(); + + if (!canCraft() && progress > 0) { + progress = 0; + // quality = 100; + } + if (recipe != null && oldRecipe != null && !recipe.isItemEqual(oldRecipe)) { + progress = 0; + } + if (progress > progressMax) + progress = progressMax - 1; + syncData(); + } + } + + public boolean canCraft() { + if (worldObj.isRemote) { + // return canCraft == 1; } - if(progressMax > 0 && recipe != null && recipe instanceof ItemStack) - { - return this.canFitResult(recipe); - } - return false; - } - + if (progressMax > 0 && recipe != null && recipe instanceof ItemStack) { + return this.canFitResult(recipe); + } + return false; + } + private ItemStack recipe; public float progressMax; public float progress; private int hammerTierRequired; private int CarpenterTierRequired; - + @Override - public void setForgeTime(int i) - { + public void setForgeTime(int i) { progressMax = i; } + @Override - public void setToolTier(int i) - { + public void setToolTier(int i) { hammerTierRequired = i; } + @Override - public void setRequiredCarpenter(int i) - { + public void setRequiredCarpenter(int i) { CarpenterTierRequired = i; } + @Override - public void setHotOutput(boolean i) - { + public void setHotOutput(boolean i) { } - public void setContainer(ContainerCarpenterMF container) - { + + public void setContainer(ContainerCarpenterMF container) { syncCarpenter = container; - craftMatrix = new CarpenterCraftMatrix(this, syncCarpenter, ShapelessCarpenterRecipes.globalWidth, ShapelessCarpenterRecipes.globalHeight); + craftMatrix = new CarpenterCraftMatrix(this, syncCarpenter, ShapelessCarpenterRecipes.globalWidth, + ShapelessCarpenterRecipes.globalHeight); } - public boolean shouldRenderCraftMetre() - { + + public boolean shouldRenderCraftMetre() { return recipe != null; } - public int getProgressBar(int i) - { - return (int)Math.ceil(i / progressMax * progress); + + public int getProgressBar(int i) { + return (int) Math.ceil(i / progressMax * progress); } + @Override - public void setToolType(String toolType) - { + public void setToolType(String toolType) { this.toolTypeRequired = toolType; } + @Override - public void setCraftingSound(String sound) - { + public void setCraftingSound(String sound) { this.craftSound = sound; } + @Override - public void setResearch(String research) - { + public void setResearch(String research) { this.researchRequired = research; } - public String getResearchNeeded() - { + + public String getResearchNeeded() { return researchRequired; } - public boolean doesPlayerKnowCraft(EntityPlayer user) - { - if(getResearchNeeded().isEmpty()) - { + + public boolean doesPlayerKnowCraft(EntityPlayer user) { + if (getResearchNeeded().isEmpty()) { return true; } return ResearchLogic.hasInfoUnlocked(user, getResearchNeeded()); } - private void addXP(EntityPlayer smith) - { - if(skillUsed != null) - { + + private void addXP(EntityPlayer smith) { + if (skillUsed != null) { float baseXP = this.progressMax / 10F; - skillUsed.addXP(smith, (int)baseXP + 1); + skillUsed.addXP(smith, (int) baseXP + 1); } } + @Override - public void setSkill(Skill skill) - { + public void setSkill(Skill skill) { skillUsed = skill; } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java index 853f38eb..68b95515 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java @@ -1,260 +1,213 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; import java.util.Random; -import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.api.refine.BlastFurnaceRecipes; import minefantasy.mf2.api.refine.ISmokeCarrier; import minefantasy.mf2.api.refine.SmokeMechanics; -import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.refining.BlockChimney; -import minefantasy.mf2.block.refining.BlockChimney; -import minefantasy.mf2.block.refining.BlockForge; -import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFH; -import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.network.packet.ChimneyPacket; import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.oredict.OreDictionary; -public class TileEntityChimney extends TileEntity implements ISmokeCarrier -{ +public class TileEntityChimney extends TileEntity implements ISmokeCarrier { public Block maskBlock = Blocks.air; public int maskMeta = 0; private int isIndirect = -1; - + protected int smokeStorage; public int ticksExisted; public int ticksExistedTemp; private Random rand = new Random(); - + public int lastSharedInt = 0; + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); ++ticksExisted; ++ticksExistedTemp; - if(lastSharedInt > 0)--lastSharedInt; - - /*TODO Custom Tex - if(ticksExistedTemp == 20) - { - MineFantasyII.debugMsg("Chimney Loaded R = " + worldObj.isRemote); - sync(); - } - */ - if(smokeStorage > 0) - { - if(!isPipeChimney()) - { + if (lastSharedInt > 0) + --lastSharedInt; + + /* + * TODO Custom Tex if(ticksExistedTemp == 20) { + * MineFantasyII.debugMsg("Chimney Loaded R = " + worldObj.isRemote); sync(); } + */ + if (smokeStorage > 0) { + if (!isPipeChimney()) { SmokeMechanics.emitSmokeFromCarrier(worldObj, xCoord, yCoord, zCoord, this, 5); - } - else if(tryShareSmoke()) - { + } else if (tryShareSmoke()) { lastSharedInt = 5; } } - if(!worldObj.isRemote && smokeStorage > getMaxSmokeStorage() && rand.nextInt(500) == 0) - { - worldObj.newExplosion(null, xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, 2F, false, true); + if (!worldObj.isRemote && smokeStorage > getMaxSmokeStorage() && rand.nextInt(500) == 0) { + worldObj.newExplosion(null, xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 2F, false, true); } } - public boolean isPipeChimney() - { - if(worldObj != null) - { + + public boolean isPipeChimney() { + if (worldObj != null) { Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - return block instanceof BlockChimney && ((BlockChimney)block).isPipe(); + return block instanceof BlockChimney && ((BlockChimney) block).isPipe(); } return false; } - private boolean tryShareSmoke() - { - if(!isPipeChimney())return false; - if(tryPassTo(0, 1, 0, true, false)) - { - return true;//Up First + + private boolean tryShareSmoke() { + if (!isPipeChimney()) + return false; + if (tryPassTo(0, 1, 0, true, false)) { + return true;// Up First } - if(tryPassTo(-1, 0, 0, false, true) || tryPassTo(1, 0, 0, false, true) || tryPassTo(0, 0, -1, false, true) || tryPassTo(0, 0, 1, false, true)) - { - return true;//Sides + if (tryPassTo(-1, 0, 0, false, true) || tryPassTo(1, 0, 0, false, true) || tryPassTo(0, 0, -1, false, true) + || tryPassTo(0, 0, 1, false, true)) { + return true;// Sides } - if(this.getMaxSmokeStorage() - this.getSmokeValue() <= 5) - { - return tryPassTo(0, -1, 0, false, false);//Down last only when nearly full + if (this.getMaxSmokeStorage() - this.getSmokeValue() <= 5) { + return tryPassTo(0, -1, 0, false, false);// Down last only when nearly full } return false; } - private boolean tryPassTo(int x, int y, int z, boolean priority, boolean sideways) - { + private boolean tryPassTo(int x, int y, int z, boolean priority, boolean sideways) { TileEntity tile = worldObj.getTileEntity(x + xCoord, y + yCoord, z + zCoord); - if(tile != null && tile instanceof TileEntityChimney) - { - TileEntityChimney carrier = (TileEntityChimney)tile; + if (tile != null && tile instanceof TileEntityChimney) { + TileEntityChimney carrier = (TileEntityChimney) tile; boolean canPass = !sideways || carrier.canAcceptSideways(); - + int smoke = carrier.getSmokeValue(); int max = carrier.getMaxSmokeStorage(); - int room_left = max-smoke; - int limit = priority ? max : this.getSmokeValue();//When going up, it fills all, sideways follows concentration gradient - if(canPass && carrier.lastSharedInt <= 0 && room_left > 0 && smoke < limit) - { + int room_left = max - smoke; + int limit = priority ? max : this.getSmokeValue();// When going up, it fills all, sideways follows + // concentration gradient + if (canPass && carrier.lastSharedInt <= 0 && room_left > 0 && smoke < limit) { int pass = Math.min(room_left, 5); - carrier.setSmokeValue(smoke+pass); + carrier.setSmokeValue(smoke + pass); this.smokeStorage -= pass; return true; } } - + return false; } - private boolean canAcceptSideways() - { + private boolean canAcceptSideways() { BlockChimney block = this.getActiveBlock(); - if(block != null) - { + if (block != null) { return block.isWideChimney() || block.isPipe(); } return false; } + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setInteger("ticksExisted", ticksExisted); nbt.setInteger("StoredSmoke", smokeStorage); NBTTagList savedItems = new NBTTagList(); - + nbt.setInteger("BlockID", Block.getIdFromBlock(maskBlock)); } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + ticksExisted = nbt.getInteger("ticksExisted"); smokeStorage = nbt.getInteger("StoredSmoke"); setBlock(nbt.getInteger("BlockID")); } - - public void setBlock(int id) - { + + public void setBlock(int id) { setBlock(id, 0); } - public void setBlock(int id, int subId) - { - /*TODO Custom Tex - maskMeta = subId; - Block newblock = Block.getBlockById(id); - if(newblock != null) - { - maskBlock = newblock; - } - if(worldObj != null && worldObj.isRemote) - { - worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord); - } - */ + + public void setBlock(int id, int subId) { + /* + * TODO Custom Tex maskMeta = subId; Block newblock = Block.getBlockById(id); + * if(newblock != null) { maskBlock = newblock; } if(worldObj != null && + * worldObj.isRemote) { worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, + * zCoord, xCoord, yCoord, zCoord); } + */ } @Override - public int getSmokeValue() - { + public int getSmokeValue() { return smokeStorage; } + @Override - public void setSmokeValue(int smoke) - { + public void setSmokeValue(int smoke) { smokeStorage = smoke; } + @Override - public int getMaxSmokeStorage() - { - if(this.blockType != null && blockType instanceof BlockChimney) - { - return ((BlockChimney)blockType).size; + public int getMaxSmokeStorage() { + if (this.blockType != null && blockType instanceof BlockChimney) { + return ((BlockChimney) blockType).size; } return 5; } - public void sync() - { - /*TODO Custom Tex - MineFantasyII.debugMsg("Block For Chimney = " + maskBlock.getUnlocalizedName() + " R = " + worldObj.isRemote); - if(!worldObj.isRemote) - { - MineFantasyII.debugMsg("Syncing Chimney " + xCoord + ", " + yCoord + ", " + zCoord); - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { - EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new ChimneyPacket(this).generatePacket()); - } - } - MineFantasyII.debugMsg("Syncing Render " + xCoord + ", " + yCoord + ", " + zCoord); - worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord); - */ + public void sync() { + /* + * TODO Custom Tex MineFantasyII.debugMsg("Block For Chimney = " + + * maskBlock.getUnlocalizedName() + " R = " + worldObj.isRemote); + * if(!worldObj.isRemote) { MineFantasyII.debugMsg("Syncing Chimney " + xCoord + + * ", " + yCoord + ", " + zCoord); List players = + * ((WorldServer)worldObj).playerEntities; for(int i = 0; i < players.size(); + * i++) { EntityPlayer player = players.get(i); + * ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new + * ChimneyPacket(this).generatePacket()); } } + * MineFantasyII.debugMsg("Syncing Render " + xCoord + ", " + yCoord + ", " + + * zCoord); worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, + * xCoord, yCoord, zCoord); + */ } - public BlockChimney getActiveBlock() - { - if(worldObj == null)return null; - + public BlockChimney getActiveBlock() { + if (worldObj == null) + return null; + Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - - if(block != null && block instanceof BlockChimney) - { - return (BlockChimney)block; + + if (block != null && block instanceof BlockChimney) { + return (BlockChimney) block; } return null; } - public boolean isIndirect() - { - BlockChimney block = getActiveBlock(); + + public boolean isIndirect() { + BlockChimney block = getActiveBlock(); return block != null && block.isIndirect; } + @Override - public boolean canAbsorbIndirect() - { - if(isIndirect == -1) - { + public boolean canAbsorbIndirect() { + if (isIndirect == -1) { isIndirect = isIndirect() ? 1 : 0; } return isIndirect == 1; } - public boolean canAccept(int x, int y, int z) - { - Block block = worldObj.getBlock(x+xCoord, y+yCoord, z+zCoord); - if(block instanceof BlockChimney) - { - if(x == 0 && z == 0)//Not sideways + + public boolean canAccept(int x, int y, int z) { + Block block = worldObj.getBlock(x + xCoord, y + yCoord, z + zCoord); + if (block instanceof BlockChimney) { + if (x == 0 && z == 0)// Not sideways { return true; - } - else - { - return ((BlockChimney)block).isPipe() || ((BlockChimney)block).isWideChimney(); + } else { + return ((BlockChimney) block).isPipe() || ((BlockChimney) block).isWideChimney(); } } return false; } - public boolean canAccept(ForgeDirection fd) - { + + public boolean canAccept(ForgeDirection fd) { return canAccept(fd.offsetX, fd.offsetY, fd.offsetZ); } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java index 626e59a2..522e1a85 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java @@ -10,20 +10,17 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; import net.minecraft.world.WorldServer; -public class TileEntityComponent extends TileEntity -{ +public class TileEntityComponent extends TileEntity { public ItemStack item; public int stackSize, max; public String type = "bar"; public String tex = "bar"; public CustomMaterial material; private int ticksExisted; - - public void setItem(ItemStack item, String type, String tex, int max, int stackSize) - { + + public void setItem(ItemStack item, String type, String tex, int max, int stackSize) { this.item = item; this.item.stackSize = 1; this.stackSize = stackSize; @@ -33,44 +30,35 @@ public void setItem(ItemStack item, String type, String tex, int max, int stackS this.material = CustomToolHelper.getCustomPrimaryMaterial(item); this.ticksExisted = 19; } - public void interact(EntityPlayer user, ItemStack held, boolean leftClick) - { - if(item != null && stackSize > 0) - { - if(leftClick)//Take + + public void interact(EntityPlayer user, ItemStack held, boolean leftClick) { + if (item != null && stackSize > 0) { + if (leftClick)// Take { - if(held == null) - { + if (held == null) { held = item.copy(); held.stackSize = 1; user.setCurrentItemOrArmor(0, held); --stackSize; - } - else - { + } else { ItemStack newitem = item.copy(); newitem.stackSize = 1; - if(user.inventory.addItemStackToInventory(newitem)) - { + if (user.inventory.addItemStackToInventory(newitem)) { --stackSize; } } - if(item == null || stackSize <= 0) - { + if (item == null || stackSize <= 0) { worldObj.setBlockToAir(xCoord, yCoord, zCoord); worldObj.removeTileEntity(xCoord, yCoord, zCoord); } - } - else if(held != null)//PLACE + } else if (held != null)// PLACE { - if(stackSize < max && item.isItemEqual(held) && ItemStack.areItemStackTagsEqual(item, held)) - { + if (stackSize < max && item.isItemEqual(held) && ItemStack.areItemStackTagsEqual(item, held)) { ++stackSize; --held.stackSize; } - - if(held.stackSize <= 0) - { + + if (held.stackSize <= 0) { user.setCurrentItemOrArmor(0, null); } } @@ -78,131 +66,134 @@ else if(held != null)//PLACE checkStack(); syncData(); } - - public void checkStack() - { - if(!BlockComponent.canBuildOn(worldObj, xCoord, yCoord-1, zCoord)) - { + + public void checkStack() { + if (!BlockComponent.canBuildOn(worldObj, xCoord, yCoord - 1, zCoord)) { worldObj.setBlockToAir(xCoord, yCoord, zCoord); } - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord+1, zCoord); - if(tile != null && tile instanceof TileEntityComponent) - { - ((TileEntityComponent)tile).checkStack(); + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + if (tile != null && tile instanceof TileEntityComponent) { + ((TileEntityComponent) tile).checkStack(); } } + @Override - public void updateEntity() - { + public void updateEntity() { ++ticksExisted; - - if(ticksExisted == 20 || ticksExisted % 120 == 0) - { + + if (ticksExisted == 20 || ticksExisted % 120 == 0) { syncData(); } } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + max = nbt.getInteger("MaxStack"); type = nbt.getString("type"); tex = nbt.getString("tex"); stackSize = nbt.getInteger("StackSize"); - + NBTTagCompound itemsave = nbt.getCompoundTag("ItemSave"); item = ItemStack.loadItemStackFromNBT(itemsave); - if(nbt.hasKey("MaterialName")) - { + if (nbt.hasKey("MaterialName")) { this.material = CustomMaterial.getMaterial(nbt.getString("MaterialName")); } } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setInteger("MaxStack", max); nbt.setString("type", type); nbt.setString("tex", tex); nbt.setInteger("StackSize", stackSize); - - if(item != null) - { + + if (item != null) { NBTTagCompound itemsave = new NBTTagCompound(); item.writeToNBT(itemsave); nbt.setTag("ItemSave", itemsave); } - if(material != null) - { + if (material != null) { nbt.setString("MaterialName", material.name); } } - - public void syncData() - { - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + public void syncData() { + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new StorageBlockPacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, + new StorageBlockPacket(this).generatePacket()); } } - public boolean isFull() - { + + public boolean isFull() { return stackSize >= max; } - public float getBlockHeight() - { - if(type.equalsIgnoreCase("sheet")) - { + + public float getBlockHeight() { + if (type.equalsIgnoreCase("sheet")) { return stackSize * 0.0625F; } - if(type.equalsIgnoreCase("plank")) - { + if (type.equalsIgnoreCase("plank")) { float f = 0.125F; - if(stackSize > 42)return 8F*f; - if(stackSize > 36)return 7F*f; - if(stackSize > 30)return 6F*f; - if(stackSize > 24)return 5F*f; - if(stackSize > 18)return 4F*f; - if(stackSize > 12)return 3F*f; - if(stackSize > 6)return 2F*f; - + if (stackSize > 42) + return 8F * f; + if (stackSize > 36) + return 7F * f; + if (stackSize > 30) + return 6F * f; + if (stackSize > 24) + return 5F * f; + if (stackSize > 18) + return 4F * f; + if (stackSize > 12) + return 3F * f; + if (stackSize > 6) + return 2F * f; + return f; } - if(type.equalsIgnoreCase("bar")) - { + if (type.equalsIgnoreCase("bar")) { float f = 0.125F; - if(stackSize > 50)return 8F*f; - if(stackSize > 48)return 7F*f; - if(stackSize > 34)return 6F*f; - if(stackSize > 32)return 5F*f; - if(stackSize > 18)return 4F*f; - if(stackSize > 16)return 3F*f; - if(stackSize > 2)return 2F*f; - + if (stackSize > 50) + return 8F * f; + if (stackSize > 48) + return 7F * f; + if (stackSize > 34) + return 6F * f; + if (stackSize > 32) + return 5F * f; + if (stackSize > 18) + return 4F * f; + if (stackSize > 16) + return 3F * f; + if (stackSize > 2) + return 2F * f; + return f; } - if(type.equalsIgnoreCase("pot")) - { + if (type.equalsIgnoreCase("pot")) { float f = 0.25F; - if(stackSize > 48)return 4F*f; - if(stackSize > 32)return 3F*f; - if(stackSize > 16)return 2F*f; - + if (stackSize > 48) + return 4F * f; + if (stackSize > 32) + return 3F * f; + if (stackSize > 16) + return 2F * f; + return f; } - if(type.equalsIgnoreCase("bigplate")) - { - return Math.max(0.125F, stackSize*0.125F); + if (type.equalsIgnoreCase("bigplate")) { + return Math.max(0.125F, stackSize * 0.125F); } - if(type.equalsIgnoreCase("jug")) - { + if (type.equalsIgnoreCase("jug")) { return stackSize > 16 ? 1.0F : 0.5F; } return 1.0F; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java index 784bfc2d..70ff3ba2 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java @@ -19,8 +19,7 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.WorldServer; -public class TileEntityCrossbowBench extends TileEntity implements IInventory, ISidedInventory, IBasicMetre -{ +public class TileEntityCrossbowBench extends TileEntity implements IInventory, ISidedInventory, IBasicMetre { /** * Stock, Head, Mod, Muzzle, Result */ @@ -28,312 +27,267 @@ public class TileEntityCrossbowBench extends TileEntity implements IInventory, I private Random rand = new Random(); public float progress; public float maxProgress = 25F; - + public boolean hasRecipe; - + private int ticksExisted; + @Override - public void updateEntity() - { + public void updateEntity() { ++ticksExisted; - if(!worldObj.isRemote && (hasRecipe || ticksExisted % 100 == 0)) - { + if (!worldObj.isRemote && (hasRecipe || ticksExisted % 100 == 0)) { syncData(); } } - public boolean tryCraft(EntityPlayer user) - { + + public boolean tryCraft(EntityPlayer user) { ItemStack result = findResult(); hasRecipe = result != null; - - if(result == null) - { + + if (result == null) { progress = 0F; - } - else if(ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("spanner")) - { - if(user.getHeldItem() != null) - { - worldObj.playSoundEffect(xCoord+0.5, yCoord, zCoord+0.5, "minefantasy2:block.twistbolt", 0.25F, 1.0F); + } else if (ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("spanner")) { + if (user.getHeldItem() != null) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "minefantasy2:block.twistbolt", 0.25F, + 1.0F); user.getHeldItem().damageItem(1, user); - if(user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) - { + if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { user.destroyCurrentEquippedItem(); } } float efficiency = ToolHelper.getCrafterEfficiency(user.getHeldItem()); - - if(user.swingProgress > 0 && user.swingProgress <= 1.0) - { - efficiency *= (0.5F-user.swingProgress); + + if (user.swingProgress > 0 && user.swingProgress <= 1.0) { + efficiency *= (0.5F - user.swingProgress); } - - if(!worldObj.isRemote) - { + + if (!worldObj.isRemote) { progress += efficiency; } - if((progress >= maxProgress && craftItem(result))) - { - worldObj.playSoundEffect(xCoord+0.5, yCoord, zCoord+0.5, "random.door_open", 0.35F, 0.5F); + if ((progress >= maxProgress && craftItem(result))) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "random.door_open", 0.35F, 0.5F); progress = 0; - if(user != null) - { + if (user != null) { SkillList.engineering.addXP(user, 10); } - for(int a = 0; a < 4; a++) - { + for (int a = 0; a < 4; a++) { decrStackSize(a, 1); - } + } } return true; } return false; } - private boolean craftItem(ItemStack result) - { - if(inv[4] == null) - { + + private boolean craftItem(ItemStack result) { + if (inv[4] == null) { this.setInventorySlotContents(4, result); return true; - } - else - { + } else { return false; } } - public void syncData() - { - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + public void syncData() { + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new CrossbowBenchPacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, + new CrossbowBenchPacket(this).generatePacket()); } } - - public void onInventoryChanged() - { + + public void onInventoryChanged() { } - - private ItemStack findResult() - { + + private ItemStack findResult() { ICrossbowPart stock = getCrossbowPart(inv[0]); ICrossbowPart head = getCrossbowPart(inv[1]); ICrossbowPart mod = getCrossbowPart(inv[2]); ICrossbowPart muzzle = getCrossbowPart(inv[3]); - - if(stock == null || head == null)return null; - + + if (stock == null || head == null) + return null; + return ToolListMF.crossbow_custom.constructCrossbow(stock, head, mod, muzzle); } - - //INVENORY - - private static ICrossbowPart getCrossbowPart(ItemStack item) - { - if(item != null && item.getItem() instanceof ICrossbowPart) - { - return (ICrossbowPart)item.getItem(); + + // INVENORY + + private static ICrossbowPart getCrossbowPart(ItemStack item) { + if (item != null && item.getItem() instanceof ICrossbowPart) { + return (ICrossbowPart) item.getItem(); } return null; } + @Override - public int getSizeInventory() - { + public int getSizeInventory() { return inv.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return inv[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { onInventoryChanged(); - if (this.inv[slot] != null) - { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) - { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } - else - { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) - { - this.inv[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return inv[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { onInventoryChanged(); inv[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return "gui.crossbowcraftmf.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { - if(this.isMatch(item, "stock")) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (this.isMatch(item, "stock")) { return slot == 0; } - if(this.isMatch(item, "mechanism")) - { + if (this.isMatch(item, "mechanism")) { return slot == 1; } - if(this.isMatch(item, "mod")) - { + if (this.isMatch(item, "mod")) { return slot == 2; } - if(this.isMatch(item, "muzzle")) - { + if (this.isMatch(item, "muzzle")) { return slot == 3; } return false; } - - + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) - { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - progress = nbt.getFloat("progress"); - maxProgress = nbt.getFloat("maxProgress"); - hasRecipe = nbt.getBoolean("hasRecipe"); + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + progress = nbt.getFloat("progress"); + maxProgress = nbt.getFloat("maxProgress"); + hasRecipe = nbt.getBoolean("hasRecipe"); } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.inv.length; ++i) - { - if (this.inv[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - nbt.setFloat("progress", progress); - nbt.setFloat("maxProgress", maxProgress); - nbt.setBoolean("hasRecipe", hasRecipe); + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + nbt.setFloat("progress", progress); + nbt.setFloat("maxProgress", maxProgress); + nbt.setBoolean("hasRecipe", hasRecipe); } + @Override - public int[] getAccessibleSlotsFromSide(int side) - { - return new int[]{0, 1, 2, 3, 4}; + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] { 0, 1, 2, 3, 4 }; } + @Override - public boolean canInsertItem(int slot, ItemStack item, int side) - { + public boolean canInsertItem(int slot, ItemStack item, int side) { return this.isItemValidForSlot(slot, item); } + @Override - public boolean canExtractItem(int slot, ItemStack item, int side) - { + public boolean canExtractItem(int slot, ItemStack item, int side) { return slot == 4; } + @Override - public int getMetreScale(int size) - { - return (int)Math.min(size, (float)size / maxProgress * progress); + public int getMetreScale(int size) { + return (int) Math.min(size, size / maxProgress * progress); } + @Override - public boolean shouldShowMetre() - { + public boolean shouldShowMetre() { return true; } + @Override - public String getLocalisedName() - { + public String getLocalisedName() { return StatCollector.translateToLocal("tile.crossbowBench.name"); } - public static boolean isMatch(ItemStack item, String var) - { + + public static boolean isMatch(ItemStack item, String var) { ICrossbowPart part = getCrossbowPart(item); - if(part != null) - { + if (part != null) { return part.getComponentType().equalsIgnoreCase(var); } return false; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java index c9e435f8..4cd1e826 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java @@ -22,452 +22,361 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; -public class TileEntityCrucible extends TileEntity implements IInventory, ISidedInventory, IHeatUser -{ +public class TileEntityCrucible extends TileEntity implements IInventory, ISidedInventory, IHeatUser { private ItemStack[] inv = new ItemStack[10]; public float progress = 0, progressMax = 400; public float temperature; private Random rand = new Random(); - + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); boolean isHot = getIsHot(); temperature = getTemperature(); - if(getTier() >= 2) - { + if (getTier() >= 2) { progressMax = 2000; } - + /* - int time = 400; - for(int a = 1; a < getSizeInventory()-1; a ++) - { - if(inv[a] != null) - { - time += 50; - } - } - if(!worldObj.isRemote) - { - progressMax = time; - } - */ - - if (isHot && canSmelt()) - { - progress += (temperature/600F); - if (progress >= progressMax) - { + * int time = 400; for(int a = 1; a < getSizeInventory()-1; a ++) { if(inv[a] != + * null) { time += 50; } } if(!worldObj.isRemote) { progressMax = time; } + */ + + if (isHot && canSmelt()) { + progress += (temperature / 600F); + if (progress >= progressMax) { progress = 0; smeltItem(); - if(isAuto()) - { + if (isAuto()) { onAutoSmelt(); } } - } - else - { + } else { progress = 0; } - if(progress > 0 && rand.nextInt(4) == 0 && !isOutside() && this.getTier() < 2) - { + if (progress > 0 && rand.nextInt(4) == 0 && !isOutside() && this.getTier() < 2) { SmokeMechanics.emitSmokeIndirect(worldObj, xCoord, yCoord, zCoord, 1); } - - if(isHot != getIsHot()) - { + + if (isHot != getIsHot()) { BlockCrucible.updateFurnaceBlockState(getTemperature() > 0, worldObj, xCoord, yCoord, zCoord); } } - - private boolean getIsHot() - { - if(this.getTier() >= 2) - { + + private boolean getIsHot() { + if (this.getTier() >= 2) { return this.isCoated(); } return getTemperature() > 0; } - private void onAutoSmelt() - { - worldObj.playSoundEffect(xCoord+0.5, yCoord+0.5, zCoord+0.5, "random.fizz", 1.0F, 1.0F); - worldObj.playSoundEffect(xCoord+0.5, yCoord+0.5, zCoord+0.5, "random.piston.out", 1.0F, 1.0F); + private void onAutoSmelt() { + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 1.0F, 1.0F); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.piston.out", 1.0F, 1.0F); } - private boolean isOutside() - { - for(int x = -1; x <= 1; x++) - { - for(int y = -1; y <= 1; y++) - { - if(!worldObj.canBlockSeeTheSky(xCoord + x, yCoord+1, zCoord + y)) - { + private boolean isOutside() { + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + if (!worldObj.canBlockSeeTheSky(xCoord + x, yCoord + 1, zCoord + y)) { return false; } - } + } } return true; } - public void smeltItem() - { - if (!canSmelt()) - { + public void smeltItem() { + if (!canSmelt()) { return; } - + ItemStack itemstack = getRecipe(); - - if (inv[getOutSlot()] == null) - { + + if (inv[getOutSlot()] == null) { inv[getOutSlot()] = itemstack.copy(); - } - - else if ( CustomToolHelper.areEqual(inv[getOutSlot()], itemstack) ) - { + } + + else if (CustomToolHelper.areEqual(inv[getOutSlot()], itemstack)) { inv[getOutSlot()].stackSize += itemstack.stackSize; } - - for(int a = 0; a < (getSizeInventory()-1); a ++) - { - if (inv[a] != null) - { + + for (int a = 0; a < (getSizeInventory() - 1); a++) { + if (inv[a] != null) { inv[a].stackSize--; if (inv[a].stackSize <= 0) { inv[a] = null; } } } - if(worldObj.isRemote && getTier() >= 2) - { + if (worldObj.isRemote && getTier() >= 2) { spawnParticle(-3, 0, 0); - spawnParticle(3, 0, 0); - spawnParticle(0, 0, -3); - spawnParticle(0, 0, 3); + spawnParticle(3, 0, 0); + spawnParticle(0, 0, -3); + spawnParticle(0, 0, 3); } } - - - private void spawnParticle(int x, int y, int z) - { - this.worldObj.playAuxSFX(2003, xCoord+x, yCoord+y, zCoord+z, 0); + + private void spawnParticle(int x, int y, int z) { + this.worldObj.playAuxSFX(2003, xCoord + x, yCoord + y, zCoord + z, 0); } - private boolean canSmelt() - { - if(temperature <= 0) - { + private boolean canSmelt() { + if (temperature <= 0) { return false; } - + ItemStack result = getRecipe(); - - if (result == null) - { + + if (result == null) { return false; } - + if (inv[getOutSlot()] == null) return true; - if (inv[getOutSlot()] != null - && CustomToolHelper.areEqual(inv[getOutSlot()], result) - && inv[getOutSlot()].stackSize < (inv[getOutSlot()] - .getMaxStackSize() - (result.stackSize - 1))) + if (inv[getOutSlot()] != null && CustomToolHelper.areEqual(inv[getOutSlot()], result) + && inv[getOutSlot()].stackSize < (inv[getOutSlot()].getMaxStackSize() - (result.stackSize - 1))) return true; return false; } - + private int getOutSlot() { return 9; } - - private ItemStack getRecipe() - { - ItemStack[] input = new ItemStack[getSizeInventory()-1]; - for(int a = 0; a < 9; a ++) - { + + private ItemStack getRecipe() { + ItemStack[] input = new ItemStack[getSizeInventory() - 1]; + for (int a = 0; a < 9; a++) { input[a] = inv[a]; } Alloy alloy = AlloyRecipes.getResult(input); - if(alloy != null) - { - if(alloy.getLevel() <= getTier()) - { + if (alloy != null) { + if (alloy.getLevel() <= getTier()) { return AlloyRecipes.getResult(input).getRecipeOutput(); } } return null; } - + @Override - public Block getBlockType() - { - if(worldObj == null)return Blocks.air; - + public Block getBlockType() { + if (worldObj == null) + return Blocks.air; + return super.getBlockType(); - } - public int getTier() - { - if(this.getBlockType() != null && this.getBlockType() instanceof BlockCrucible) - { - return ((BlockCrucible)this.getBlockType()).tier; + } + + public int getTier() { + if (this.getBlockType() != null && this.getBlockType() instanceof BlockCrucible) { + return ((BlockCrucible) this.getBlockType()).tier; } return 0; } - public boolean isAuto() - { - if(this.getBlockType() != null && this.getBlockType() instanceof BlockCrucible) - { - return ((BlockCrucible)this.getBlockType()).isAuto; + + public boolean isAuto() { + if (this.getBlockType() != null && this.getBlockType() instanceof BlockCrucible) { + return ((BlockCrucible) this.getBlockType()).isAuto; } return false; } - public float getTemperature() - { - if(this.getTier() >= 1 && !isCoated()) - { + + public float getTemperature() { + if (this.getTier() >= 1 && !isCoated()) { return 0F; } - if(getTier() >= 2) - { + if (getTier() >= 2) { return 500; } - Block under = worldObj.getBlock(xCoord, yCoord-1, zCoord); - - if(under.getMaterial() == Material.fire) - { + Block under = worldObj.getBlock(xCoord, yCoord - 1, zCoord); + + if (under.getMaterial() == Material.fire) { return 10F; } - if(under.getMaterial() == Material.lava) - { + if (under.getMaterial() == Material.lava) { return 50F; } - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord-1, zCoord); - if(tile != null && tile instanceof TileEntityForge) - { - return ((TileEntityForge)tile).getBlockTemperature(); + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (tile != null && tile instanceof TileEntityForge) { + return ((TileEntityForge) tile).getBlockTemperature(); } return 0F; } - public boolean isCoated() - { - if(this.getTier() >= 2) - { - return isEnderAlter(-1, -1, -3) - && isEnderAlter(-1, -1, 3) - && isEnderAlter(-3, -1, -1) - && isEnderAlter( 3, -1, -1) - && isEnderAlter(1, -1, -3) - && isEnderAlter(1, -1, 3) - && isEnderAlter(-3, -1, 1) - && isEnderAlter( 3, -1, 1); + + public boolean isCoated() { + if (this.getTier() >= 2) { + return isEnderAlter(-1, -1, -3) && isEnderAlter(-1, -1, 3) && isEnderAlter(-3, -1, -1) + && isEnderAlter(3, -1, -1) && isEnderAlter(1, -1, -3) && isEnderAlter(1, -1, 3) + && isEnderAlter(-3, -1, 1) && isEnderAlter(3, -1, 1); } - return isFirebrick(0, 0, -1) - && isFirebrick(0, 0, 1) - && isFirebrick(-1, 0, 0) - && isFirebrick( 1, 0, 0); - } - - private boolean isFirebrick(int x, int y, int z) - { - return worldObj.getBlock(xCoord+x, yCoord+y, zCoord+z) == BlockListMF.firebricks; - } - private boolean isEnderAlter(int x, int y, int z) - { - Block block = worldObj.getBlock(xCoord+x, yCoord+y, zCoord+z); - int meta = worldObj.getBlockMetadata(xCoord+x, yCoord+y, zCoord+z); - - if(block == Blocks.end_portal_frame && BlockEndPortalFrame.isEnderEyeInserted(meta)) - { + return isFirebrick(0, 0, -1) && isFirebrick(0, 0, 1) && isFirebrick(-1, 0, 0) && isFirebrick(1, 0, 0); + } + + private boolean isFirebrick(int x, int y, int z) { + return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) == BlockListMF.firebricks; + } + + private boolean isEnderAlter(int x, int y, int z) { + Block block = worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z); + int meta = worldObj.getBlockMetadata(xCoord + x, yCoord + y, zCoord + z); + + if (block == Blocks.end_portal_frame && BlockEndPortalFrame.isEnderEyeInserted(meta)) { return true; - } - else - { - //worldObj.setBlock(xCoord+x, yCoord+y, zCoord+z, Blocks.end_portal_frame, 0, 2); + } else { + // worldObj.setBlock(xCoord+x, yCoord+y, zCoord+z, Blocks.end_portal_frame, 0, + // 2); return false; } } @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setFloat("progress", progress); nbt.setFloat("progressMax", progressMax); - + NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.inv.length; ++i) - { - if (this.inv[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } - nbt.setTag("Items", savedItems); + nbt.setTag("Items", savedItems); } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + progress = nbt.getFloat("progress"); progressMax = nbt.getFloat("progressMax"); - + NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; + this.inv = new ItemStack[this.getSizeInventory()]; - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); - if (slotNum >= 0 && slotNum < this.inv.length) - { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } } - //INVENTORY + // INVENTORY @Override - public int getSizeInventory() - { + public int getSizeInventory() { return inv.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return inv[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { onInventoryChanged(); - if (this.inv[slot] != null) - { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) - { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } - else - { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) - { - this.inv[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return inv[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { onInventoryChanged(); inv[slot] = item; } - public void onInventoryChanged() - { + public void onInventoryChanged() { } @Override - public String getInventoryName() - { + public String getInventoryName() { return "gui.crucible.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { return true; } - private boolean isBlastOutput() - { - if(worldObj == null)return false; - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord+1, zCoord); + private boolean isBlastOutput() { + if (worldObj == null) + return false; + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); return tile != null && tile instanceof TileEntityBlastFH; } - private final int[] grid = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8}; - private final int[] output = new int[]{9}; - private final int[] whole = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + + private final int[] grid = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; + private final int[] output = new int[] { 9 }; + private final int[] whole = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + @Override - public int[] getAccessibleSlotsFromSide(int side) - { - if(isBlastOutput()) - { + public int[] getAccessibleSlotsFromSide(int side) { + if (isBlastOutput()) { return whole; } return side == 0 ? output : grid; } @Override - public boolean canInsertItem(int slot, ItemStack item, int side) - { + public boolean canInsertItem(int slot, ItemStack item, int side) { return !isBlastOutput() && slot < getOutSlot(); } @Override - public boolean canExtractItem(int slot, ItemStack item, int side) - { + public boolean canExtractItem(int slot, ItemStack item, int side) { return isAuto() && slot == getOutSlot(); } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java index d6376b1c..647c1b67 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java @@ -32,316 +32,272 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.WorldServer; -public class TileEntityFirepit extends TileEntity implements IBasicMetre, IHeatSource -{ +public class TileEntityFirepit extends TileEntity implements IBasicMetre, IHeatSource { public int fuel = 0; - private int maxFuel = 12000; //10 minutes + private int maxFuel = 12000; // 10 minutes private float charcoal = 0; private int ticksExisted; private Random rand = new Random(); - + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); ++ticksExisted; - - if(!worldObj.isRemote) - { - if(!isLit() && fuel > 0 && ticksExisted % 10 == 0) - { + + if (!worldObj.isRemote) { + if (!isLit() && fuel > 0 && ticksExisted % 10 == 0) { tryLight(); } - - if(isLit()) - { - if(fuel > 0) - { - fuel --; + + if (isLit()) { + if (fuel > 0) { + fuel--; charcoal += (0.25F / 20F / 60F); } - - if(fuel <= 0) - { + + if (fuel <= 0) { setLit(false); } - - if(isLit() && isWet()) - { + + if (isLit() && isWet()) { extinguish(Blocks.water, 0); } } sendPacketToClients(); } - if(worldObj.isRemote) - { - if(ticksExisted % 5 == 0 && isLit()) - { - worldObj.spawnParticle("smoke", xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, 0.0D, 0.0D, 0.0D); - worldObj.spawnParticle("flame", xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, 0.0D, 0.0D, 0.0D); - - if(rand.nextInt(100) == 0) - { - worldObj.playSound((double)((float)xCoord + 0.5F), (double)((float)yCoord + 0.5F), (double)((float)zCoord + 0.5F), "fire.fire", 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F, false); + if (worldObj.isRemote) { + if (ticksExisted % 5 == 0 && isLit()) { + worldObj.spawnParticle("smoke", xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 0.0D, 0.0D, 0.0D); + worldObj.spawnParticle("flame", xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 0.0D, 0.0D, 0.0D); + + if (rand.nextInt(100) == 0) { + worldObj.playSound(xCoord + 0.5F, yCoord + 0.5F, zCoord + 0.5F, "fire.fire", + 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F, false); } } - - if(ticksExisted % 20 == 0) - { - if(worldObj.getBlock(xCoord, yCoord, zCoord) != BlockListMF.firepit) - { + + if (ticksExisted % 20 == 0) { + if (worldObj.getBlock(xCoord, yCoord, zCoord) != BlockListMF.firepit) { worldObj.removeTileEntity(xCoord, yCoord, zCoord); MFLogUtil.logWarn("Firepit missing block"); } } } } - - public boolean hasBlockAbove() - { - if(worldObj == null)return false; - - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord+1, zCoord); - if(tile != null && tile instanceof IHeatUser) - { - return ((IHeatUser)tile).canAccept(this); + + public boolean hasBlockAbove() { + if (worldObj == null) + return false; + + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + if (tile != null && tile instanceof IHeatUser) { + return ((IHeatUser) tile).canAccept(this); } - + return false; } - private boolean isWet() - { - if(isWater(-1, 0, 0) || isWater(1, 0, 0) || isWater(0, 0, -1) || isWater(0, 0, 1) || isWater(0, 1, 0)) - { + private boolean isWet() { + if (isWater(-1, 0, 0) || isWater(1, 0, 0) || isWater(0, 0, -1) || isWater(0, 0, 1) || isWater(0, 1, 0)) { return true; } /* - if(worldObj.getBlock(xCoord, yCoord+1, zCoord) == BlockListMF.roast.blockID) - { - if(worldObj.canLightningStrikeAt(xCoord, yCoord+2, zCoord)) - { - return true; - } - } - */ - - return worldObj.canLightningStrikeAt(xCoord, yCoord+1, zCoord); + * if(worldObj.getBlock(xCoord, yCoord+1, zCoord) == BlockListMF.roast.blockID) + * { if(worldObj.canLightningStrikeAt(xCoord, yCoord+2, zCoord)) { return true; + * } } + */ + + return worldObj.canLightningStrikeAt(xCoord, yCoord + 1, zCoord); } - public int getCharcoalDrop() - { - return (int)(Math.floor(charcoal)); + public int getCharcoalDrop() { + return (int) (Math.floor(charcoal)); } - - public boolean isBurning() - { + + public boolean isBurning() { return isLit() && fuel > 0; } - public boolean isLit() - { + public boolean isLit() { return worldObj.getBlockMetadata(xCoord, yCoord, zCoord) == 1; } - - private void tryLight() - { - if(isFire(-1, 0, 0) || isFire(1, 0, 0) || isFire(0, 0, -1) || isFire(0, 0, 1) || isFire(0, -1, 0) || isFire(0, 1, 0)) - { + + private void tryLight() { + if (isFire(-1, 0, 0) || isFire(1, 0, 0) || isFire(0, 0, -1) || isFire(0, 0, 1) || isFire(0, -1, 0) + || isFire(0, 1, 0)) { setLit(true); } } - - private boolean isFire(int x, int y, int z) - { - return worldObj.getBlock(xCoord+x, yCoord+y, zCoord+z).getMaterial() == Material.fire; + + private boolean isFire(int x, int y, int z) { + return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z).getMaterial() == Material.fire; } - private boolean isWater(int x, int y, int z) - { - return worldObj.getBlock(xCoord+x, yCoord+y, zCoord+z).getMaterial() == Material.water; + + private boolean isWater(int x, int y, int z) { + return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z).getMaterial() == Material.water; } - public boolean addFuel(ItemStack input) - { + public boolean addFuel(ItemStack input) { int amount = getItemBurnTime(input); - if(amount > 0 && fuel < maxFuel) - { + if (amount > 0 && fuel < maxFuel) { fuel += amount; - if(fuel > maxFuel) - { + if (fuel > maxFuel) { fuel = maxFuel; } return true; } return false; } - public void setLit(boolean lit) - { - if(worldObj != null) - { + + public void setLit(boolean lit) { + if (worldObj != null) { worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, lit ? 1 : 0, 2); } } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setInteger("fuel", fuel); nbt.setInteger("maxFuel", maxFuel); nbt.setInteger("ticksExisted", ticksExisted); - + nbt.setFloat("charcoal", charcoal); } - + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + setLit(nbt.getBoolean("isLit")); - + fuel = nbt.getInteger("fuel"); maxFuel = nbt.getInteger("maxFuel"); ticksExisted = nbt.getInteger("ticksExisted"); - + charcoal = nbt.getFloat("charcoal"); } - + /** * Gets the burn time * - * Wood tools and plank item are 1 minute - * sticks and saplings are 30seconds + * Wood tools and plank item are 1 minute sticks and saplings are 30seconds */ - public static int getItemBurnTime(ItemStack input) - { - if (input == null) - { - return 0; - } - else - { - Item i = input.getItem(); - int d = input.getItemDamage(); - Item item = input.getItem(); - - if (i == Items.stick) return 600;//30Sec - if (i == ComponentListMF.plank || i == ComponentListMF.plank_cut) - { - return (int)(200 * CustomToolHelper.getBurnModifier(input)); - } - if (i == ComponentListMF.plank_pane) - { - return (int)(600 * CustomToolHelper.getBurnModifier(input)); - } - - return 0; - } - } + public static int getItemBurnTime(ItemStack input) { + if (input == null) { + return 0; + } else { + Item i = input.getItem(); + int d = input.getItemDamage(); + Item item = input.getItem(); + + if (i == Items.stick) + return 600;// 30Sec + if (i == ComponentListMF.plank || i == ComponentListMF.plank_cut) { + return (int) (200 * CustomToolHelper.getBurnModifier(input)); + } + if (i == ComponentListMF.plank_pane) { + return (int) (600 * CustomToolHelper.getBurnModifier(input)); + } + + return 0; + } + } @Override - public boolean canPlaceAbove() - { + public boolean canPlaceAbove() { return true; } @Override - public int getHeat() - { - if(!isBurning())return 0; - return Functions.getIntervalWave1_i(ticksExisted, 30, 100, 200);//100*-300* + public int getHeat() { + if (!isBurning()) + return 0; + return Functions.getIntervalWave1_i(ticksExisted, 30, 100, 200);// 100*-300* } - - private void sendPacketToClients() - { - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + private void sendPacketToClients() { + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new FirepitPacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new FirepitPacket(this).generatePacket()); } } @Override @SideOnly(Side.CLIENT) - public boolean shouldShowMetre() - { + public boolean shouldShowMetre() { return fuel > 0; } + @Override @SideOnly(Side.CLIENT) - public int getMetreScale(int width) - { + public int getMetreScale(int width) { return this.fuel * width / (maxFuel); } + @Override @SideOnly(Side.CLIENT) - public String getLocalisedName() - { - int seconds = (int)Math.floor(fuel/20); - int mins = (int)Math.floor(seconds/60); - seconds -= mins*60; - + public String getLocalisedName() { + int seconds = (int) Math.floor(fuel / 20); + int mins = (int) Math.floor(seconds / 60); + seconds -= mins * 60; + String s = ""; - if(seconds < 10) - { + if (seconds < 10) { s += "0"; } - - return "150C "+StatCollector.translateToLocal("forge.fuel.name") + " " + mins + ":" + s + seconds; + + return "150C " + StatCollector.translateToLocal("forge.fuel.name") + " " + mins + ":" + s + seconds; } - public void extinguish() - { + public void extinguish() { extinguish(Blocks.sand, 0); } - - public void extinguish(Block block, int meta) - { - worldObj.playSoundEffect(xCoord+0.5F, yCoord+0.25F, zCoord+0.5F, "random.fizz", 0.4F, 2.0F + this.rand.nextFloat() * 0.4F); - worldObj.spawnParticle("largesmoke", xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, 0.0D, 0.0D, 0.0D); - worldObj.spawnParticle("tilecrack_" + block + "_" + meta, xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, 0.0D, 0.0D, 0.0D); - + + public void extinguish(Block block, int meta) { + worldObj.playSoundEffect(xCoord + 0.5F, yCoord + 0.25F, zCoord + 0.5F, "random.fizz", 0.4F, + 2.0F + this.rand.nextFloat() * 0.4F); + worldObj.spawnParticle("largesmoke", xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 0.0D, 0.0D, 0.0D); + worldObj.spawnParticle("tilecrack_" + block + "_" + meta, xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 0.0D, + 0.0D, 0.0D); + setLit(false); } - public boolean tryCook(EntityPlayer player, ItemStack held) - { - if(rand.nextInt(10) != 0)return false; - if(held == null)return false; - if(held.getItem() instanceof ItemFood) - { + public boolean tryCook(EntityPlayer player, ItemStack held) { + if (rand.nextInt(10) != 0) + return false; + if (held == null) + return false; + if (held.getItem() instanceof ItemFood) { player.swingItem(); - if(worldObj.isRemote) - { + if (worldObj.isRemote) { return false; } ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(held); - if(result != null) - { + if (result != null) { float chance = 75F; - if(RPGElements.isSystemActive) - { + if (RPGElements.isSystemActive) { int skill = RPGElements.getLevel(player, SkillList.provisioning); - chance += (int)((float)skill/4); + chance += (int) ((float) skill / 4); } - boolean success = (rand.nextFloat()*100) < chance; + boolean success = (rand.nextFloat() * 100) < chance; ItemStack creation = success ? result.copy() : new ItemStack(FoodListMF.burnt_food); dropItem(player, creation); SkillList.provisioning.addXP(player, success ? 2 : 1); - + return true; } } return false; } - public void dropItem(EntityPlayer player, ItemStack item) - { + public void dropItem(EntityPlayer player, ItemStack item) { EntityItem drop = new EntityItem(worldObj, player.posX, player.posY, player.posZ, item); drop.delayBeforeCanPickup = 0; drop.motionX = drop.motionY = drop.motionZ = 0; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java index 77f13f37..ef6f7331 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java @@ -29,11 +29,10 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.WorldServer; -public class TileEntityForge extends TileEntity implements IInventory, IBasicMetre, IHeatSource, IBellowsUseable -{ +public class TileEntityForge extends TileEntity implements IInventory, IBasicMetre, IHeatSource, IBellowsUseable { private ItemStack[] inv = new ItemStack[1]; public float fuel; - public float maxFuel = 6000;//5m + public float maxFuel = 6000;// 5m public float temperature, fuelTemperature; public static final float maxTemperature = 5000; private Random rand = new Random(); @@ -42,9 +41,8 @@ public class TileEntityForge extends TileEntity implements IInventory, IBasicMet public String texTypeForRender = "stone"; private boolean isBurning = false; public int workableState = 0; - - public TileEntityForge(Block block, String type) - { + + public TileEntityForge(Block block, String type) { texTypeForRender = type; blockType = block; blockMetadata = 0; @@ -54,20 +52,19 @@ public TileEntityForge() { } @Override - public void updateEntity() - { + public void updateEntity() { ++ticksExisted; - - if(worldObj.isRemote)return; - - if(justShared > 0)--justShared; + + if (worldObj.isRemote) + return; + + if (justShared > 0) + --justShared; super.updateEntity(); - - if(ticksExisted % 20 == 0) - { + + if (ticksExisted % 20 == 0) { ItemStack item = getStackInSlot(0); - if(item != null && !worldObj.isRemote) - { + if (item != null && !worldObj.isRemote) { modifyItem(item, 0); } syncData(); @@ -75,69 +72,56 @@ public void updateEntity() if (ticksExisted % 10 == 0) { shareTemp(); } - - if(!isLit() && !worldObj.isRemote) - { - if(temperature > 0 && ticksExisted % 5 == 0) - { + + if (!isLit() && !worldObj.isRemote) { + if (temperature > 0 && ticksExisted % 5 == 0) { temperature = 0; } return; } tickFuel(); - if(fuel <= 0) - { + if (fuel <= 0) { this.extinguish(); return; } - isBurning = isBurning();//Check if it's burning + isBurning = isBurning();// Check if it's burning float maxTemp = isLit() ? (fuelTemperature + getUnderTemperature()) : 0; - - if(temperature < maxTemp) - { + + if (temperature < maxTemp) { float amount = 2.0F; temperature += amount; - if(temperature > maxTemp) - { + if (temperature > maxTemp) { temperature = maxTemp; } - } - else if(temperature > maxTemp && rand.nextInt(20) == 0) - { + } else if (temperature > maxTemp && rand.nextInt(20) == 0) { temperature -= 10; } - - if(isBurning && temperature > 250 && rand.nextInt(20) == 0 && !isOutside()) - { + + if (isBurning && temperature > 250 && rand.nextInt(20) == 0 && !isOutside()) { int val = this.getTier() == 1 ? 3 : 1; - if(this.hasBlockAbove()) - { - SmokeMechanics.emitSmokeIndirect(worldObj, xCoord, yCoord+1, zCoord, val); - } - else - { + if (this.hasBlockAbove()) { + SmokeMechanics.emitSmokeIndirect(worldObj, xCoord, yCoord + 1, zCoord, val); + } else { SmokeMechanics.emitSmokeIndirect(worldObj, xCoord, yCoord, zCoord, val); } } maxFuel = getTier() == 1 ? 12000 : 6000; } - private boolean isOutside() - { - for(int x = -1; x <= 1; x++) - { - for(int y = -1; y <= 1; y++) - { - if(!worldObj.canBlockSeeTheSky(xCoord + x, yCoord+1, zCoord + y)) - { + + private boolean isOutside() { + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + if (!worldObj.canBlockSeeTheSky(xCoord + x, yCoord + 1, zCoord + y)) { return false; } - } + } } return true; } + public boolean isLit; - private void shareTemp() - { + + private void shareTemp() { isLit = isLit(); shareTo(-1, 0); shareTo(1, 0); @@ -145,8 +129,7 @@ private void shareTemp() shareTo(0, 1); } - private void shareTo(int x, int z) - { + private void shareTo(int x, int z) { if (fuel <= 0) return; @@ -155,16 +138,13 @@ private void shareTo(int x, int z) if (tile == null) return; - if (tile instanceof TileEntityForge) - { + if (tile instanceof TileEntityForge) { TileEntityForge forge = (TileEntityForge) tile; - if (isLit && !forge.isLit && forge.fuel > 0) - { + if (isLit && !forge.isLit && forge.fuel > 0) { forge.fireUpForge(); } - if (!forge.isBurning() && temperature > 1) - { + if (!forge.isBurning() && temperature > 1) { forge.temperature = 1; } if (forge.temperature < (temperature - share)) { @@ -179,380 +159,323 @@ private void shareTo(int x, int z) } } - private void tickFuel() - { - if(fuel > 0) - { + private void tickFuel() { + if (fuel > 0) { fuel -= 0.2F; } - - if(fuel < 0)fuel = 0; + + if (fuel < 0) + fuel = 0; } - private boolean isBurning() - { + private boolean isBurning() { return fuel > 0 && temperature > 0; } + @SideOnly(Side.CLIENT) - private boolean shouldRenderFlame() - { + private boolean shouldRenderFlame() { return fuel > 0 && temperature > 1; } - private void modifyItem(ItemStack item, int slot) - { - if(item.getItem() == ComponentListMF.hotItem) - { + private void modifyItem(ItemStack item, int slot) { + if (item.getItem() == ComponentListMF.hotItem) { int temp = ItemHeated.getTemp(item); - if(temp > temperature) - { - int i = (int)(temperature/5F); + if (temp > temperature) { + int i = (int) (temperature / 5F); temp -= i; - } - else - { - int increase = (int)(temperature / (20F*getStackModifier(item.stackSize))); - if(temp >= (temperature-increase)) - { + } else { + int increase = (int) (temperature / (20F * getStackModifier(item.stackSize))); + if (temp >= (temperature - increase)) { temp = (int) temperature; - } - else - { + } else { temp += increase; } } - if(temp <= 0) - { - //this.setInventorySlotContents(slot, ItemHeated.getItem(item)); - } - else - { + if (temp <= 0) { + // this.setInventorySlotContents(slot, ItemHeated.getItem(item)); + } else { ItemHeated.setTemp(item, Math.max(0, temp)); } - } - else if(temperature > 0) - { + } else if (temperature > 0) { this.setInventorySlotContents(slot, ItemHeated.createHotItem(item)); - + } } - private float getStackModifier(int stackSize) - { - float mod = 1F + (float)stackSize / 16F;//1x to 5x + private float getStackModifier(int stackSize) { + float mod = 1F + stackSize / 16F;// 1x to 5x return mod; } - public int getTier() - { + public int getTier() { Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - if(block != null && block instanceof BlockForge) - { - return ((BlockForge)block).tier; + if (block != null && block instanceof BlockForge) { + return ((BlockForge) block).tier; } return 0; } - public float getUnderTemperature() - { - Block under = worldObj.getBlock(xCoord, yCoord-1, zCoord); - - if(under.getMaterial() == Material.fire) - { + + public float getUnderTemperature() { + Block under = worldObj.getBlock(xCoord, yCoord - 1, zCoord); + + if (under.getMaterial() == Material.fire) { return 50F; } - if(under.getMaterial() == Material.lava) - { + if (under.getMaterial() == Material.lava) { return 100F; } return 0F; } + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setFloat("temperature", temperature); nbt.setFloat("fuelTemperature", fuelTemperature); nbt.setFloat("dragonHeartPower", dragonHeartPower); nbt.setFloat("fuel", fuel); nbt.setFloat("maxFuel", maxFuel); - + NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.inv.length; ++i) - { - if (this.inv[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } - nbt.setTag("Items", savedItems); + nbt.setTag("Items", savedItems); } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + temperature = nbt.getFloat("temperature"); fuelTemperature = nbt.getFloat("fuelTemperature"); dragonHeartPower = nbt.getFloat("dragonHeartPower"); fuel = nbt.getFloat("fuel"); maxFuel = nbt.getFloat("maxFuel"); - + NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; + this.inv = new ItemStack[this.getSizeInventory()]; - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); - if (slotNum >= 0 && slotNum < this.inv.length) - { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } } - //INVENTORY + // INVENTORY @Override - public int getSizeInventory() - { + public int getSizeInventory() { return inv.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return inv[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { onInventoryChanged(); - if (this.inv[slot] != null) - { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) - { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } - else - { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) - { - this.inv[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return inv[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { onInventoryChanged(); inv[slot] = item; } - public void onInventoryChanged() - { + public void onInventoryChanged() { } @Override - public String getInventoryName() - { + public String getInventoryName() { return "gui.crucible.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { return true; } - public BlockForge getActiveBlock() - { - if(worldObj == null)return null; - + public BlockForge getActiveBlock() { + if (worldObj == null) + return null; + Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - - if(block != null && block instanceof BlockForge) - { - return (BlockForge)block; + + if (block != null && block instanceof BlockForge) { + return (BlockForge) block; } return null; } + @SideOnly(Side.CLIENT) - public String getTextureName() - { + public String getTextureName() { BlockForge forge = getActiveBlock(); - if(forge == null)return "forge_"+texTypeForRender; - + if (forge == null) + return "forge_" + texTypeForRender; + return "forge_" + forge.type + (shouldRenderFlame() ? "_active" : ""); } - public boolean hasFuel() - { + public boolean hasFuel() { return worldObj != null && fuel > 0; } - - public boolean isLit() - { - BlockForge forge = getActiveBlock(); + + public boolean isLit() { + BlockForge forge = getActiveBlock(); return forge != null && forge.isActive; } - + /** * Puts the fire out */ - public void extinguish() - { - if(getTier() == 1) - { + public void extinguish() { + if (getTier() == 1) { return; } BlockForge.updateFurnaceBlockState(false, worldObj, xCoord, yCoord, zCoord); } + /** * Fires the forge up */ - public void fireUpForge() - { - if(getTier() == 1) - { + public void fireUpForge() { + if (getTier() == 1) { return; } BlockForge.updateFurnaceBlockState(true, worldObj, xCoord, yCoord, zCoord); } - - public float getBellowsEffect() - { + + public float getBellowsEffect() { return getTier() == 1 ? 2.0F : 1.5F; } - private float getBellowsMax() - { - return Math.min(fuelTemperature*getBellowsEffect(), getMaxTemp()); + + private float getBellowsMax() { + return Math.min(fuelTemperature * getBellowsEffect(), getMaxTemp()); } - public int getMaxTemp() - { + + public int getMaxTemp() { return (int) maxTemperature; } - public boolean addFuel(ForgeFuel stats, boolean hand, int tier) - { + + public boolean addFuel(ForgeFuel stats, boolean hand, int tier) { maxFuel = tier == 1 ? 12000 : 6000; - + boolean hasUsed = false; - - if(stats.baseHeat > this.fuelTemperature) // uses if hotter + + if (stats.baseHeat > this.fuelTemperature) // uses if hotter { hasUsed = true; } int room_left = (int) (maxFuel - fuel); - if(hand && room_left > 0) - { + if (hand && room_left > 0) { hasUsed = true; - fuel = Math.min(fuel + stats.duration, maxFuel);//Fill as much as can fit - } - else if(!hand && (fuel == 0 || room_left >= stats.duration))//For hoppers: only fill when there's full room + fuel = Math.min(fuel + stats.duration, maxFuel);// Fill as much as can fit + } else if (!hand && (fuel == 0 || room_left >= stats.duration))// For hoppers: only fill when there's full room { hasUsed = true; - fuel = Math.min(fuel + stats.duration, maxFuel);//Fill as much as can fit + fuel = Math.min(fuel + stats.duration, maxFuel);// Fill as much as can fit } - if(stats.doesLight && !isLit()) - { + if (stats.doesLight && !isLit()) { fireUpForge(); hasUsed = true; } - if(hasUsed) - { + if (hasUsed) { fuelTemperature = stats.baseHeat; } return hasUsed; } @Override - public int getMetreScale(int size) - { - if(shouldShowMetre()) - { - return (int)((float)size / maxFuel * fuel); + public int getMetreScale(int size) { + if (shouldShowMetre()) { + return (int) (size / maxFuel * fuel); } return 0; } - public int[] getTempsScaled(int size) - { + public int[] getTempsScaled(int size) { int[] temps = new int[2]; - if(shouldShowMetre()) - { - temps[0] = (int)((float)size / this.maxTemperature * this.temperature); - temps[1] = (int)((float)size / this.maxTemperature * this.fuelTemperature); - } - if(temps[0] > size)temps[0] = size; - if(temps[1] > size)temps[1] = size; + if (shouldShowMetre()) { + temps[0] = (int) (size / this.maxTemperature * this.temperature); + temps[1] = (int) (size / this.maxTemperature * this.fuelTemperature); + } + if (temps[0] > size) + temps[0] = size; + if (temps[1] > size) + temps[1] = size; return temps; } @Override - public boolean shouldShowMetre() - { + public boolean shouldShowMetre() { return true; } @Override - public String getLocalisedName() - { - return (int)this.temperature+"C " + StatCollector.translateToLocal(workableState >= 2 ? "state.unstable" : workableState == 1 ? "state.workable" : "forge.fuel.name"); + public String getLocalisedName() { + return (int) this.temperature + "C " + StatCollector.translateToLocal( + workableState >= 2 ? "state.unstable" : workableState == 1 ? "state.workable" : "forge.fuel.name"); } public boolean[] showSides() { @@ -566,165 +489,138 @@ public boolean[] showSides() { return new boolean[] { front, left, right, back }; } - + private boolean isForge(int x, int y, int z) { return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) instanceof BlockForge; } - public void syncData() - { - - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + public void syncData() { + + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new ForgePacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new ForgePacket(this).generatePacket()); } } + int justShared; - public void onUsedWithBellows(float powerLevel) - { - if(!isBurning())return; - if(justShared > 0) - { + + public void onUsedWithBellows(float powerLevel) { + if (!isBurning()) + return; + if (justShared > 0) { return; } - if(fuel <= 0) - { + if (fuel <= 0) { return; } float max = getBellowsMax(); justShared = 5; - if(temperature < max) - { - temperature = Math.min(max, temperature + (500F*powerLevel)); - } - - for(int a = 0; a < 10; a ++) - { - worldObj.spawnParticle("flame", xCoord+(rand.nextDouble()*0.8D)+0.1D, yCoord + 0.4D, zCoord+(rand.nextDouble()*0.8D)+0.1D, 0, 0.01, 0); + if (temperature < max) { + temperature = Math.min(max, temperature + (500F * powerLevel)); } - - pumpBellows(-1, 0, powerLevel*0.9F); - pumpBellows(0, -1, powerLevel*0.9F); - pumpBellows(0, 1, powerLevel*0.9F); - pumpBellows(1, 0, powerLevel*0.9F); - + + for (int a = 0; a < 10; a++) { + worldObj.spawnParticle("flame", xCoord + (rand.nextDouble() * 0.8D) + 0.1D, yCoord + 0.4D, + zCoord + (rand.nextDouble() * 0.8D) + 0.1D, 0, 0.01, 0); + } + + pumpBellows(-1, 0, powerLevel * 0.9F); + pumpBellows(0, -1, powerLevel * 0.9F); + pumpBellows(0, 1, powerLevel * 0.9F); + pumpBellows(1, 0, powerLevel * 0.9F); + } - private void pumpBellows(int x, int z, float pump) - { - if(fuel <= 0)return; - + private void pumpBellows(int x, int z, float pump) { + if (fuel <= 0) + return; + int share = 2; - TileEntity tile = worldObj.getTileEntity(xCoord+x, yCoord, zCoord+z); - if(tile == null)return; - - if(tile instanceof TileEntityForge) - { - TileEntityForge forge = (TileEntityForge)tile; + TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord, zCoord + z); + if (tile == null) + return; + + if (tile instanceof TileEntityForge) { + TileEntityForge forge = (TileEntityForge) tile; forge.onUsedWithBellows(pump); } } - public float getBlockTemperature() - { - if(this.isLit) - { + public float getBlockTemperature() { + if (this.isLit) { return temperature; } return 0; } - - public boolean hasBlockAbove() - { - if(worldObj == null)return false; - - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord+1, zCoord); - if(tile != null && tile instanceof IHeatUser) - { - return ((IHeatUser)tile).canAccept(this); + + public boolean hasBlockAbove() { + if (worldObj == null) + return false; + + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + if (tile != null && tile instanceof IHeatUser) { + return ((IHeatUser) tile).canAccept(this); } - + return tile != null && tile instanceof TileEntityFurnace; } - - private void averageAllItems() - { + + private void averageAllItems() { /* - int temp = 0; - int items = 0; - for(ItemStack item: inv) - { - if(item != null && item.getItem() instanceof IHotItem) - { - ++items; - temp += ItemHeated.getTemp(item); - } - } - int average = (int)((float)temp / items); - for(ItemStack item: inv) - { - if(item != null && item.getItem() instanceof IHotItem) - { - ItemHeated.setTemp(item, average); - } - } - */ + * int temp = 0; int items = 0; for(ItemStack item: inv) { if(item != null && + * item.getItem() instanceof IHotItem) { ++items; temp += + * ItemHeated.getTemp(item); } } int average = (int)((float)temp / items); + * for(ItemStack item: inv) { if(item != null && item.getItem() instanceof + * IHotItem) { ItemHeated.setTemp(item, average); } } + */ } - public boolean tryAddHeatable(ItemStack held) - { + public boolean tryAddHeatable(ItemStack held) { ItemStack contents = inv[0]; - if(contents == null) - { + if (contents == null) { ItemStack placed = held.copy(); placed.stackSize = 1; setInventorySlotContents(0, placed); return true; - } - else if(contents.getItem() instanceof ItemHeated) - { + } else if (contents.getItem() instanceof ItemHeated) { ItemStack hot = Heatable.getItem(contents); - if(hot != null && hot.isItemEqual(held) && ItemStack.areItemStackTagsEqual(held, hot) && contents.stackSize < contents.getMaxStackSize()) - { - contents.stackSize ++; + if (hot != null && hot.isItemEqual(held) && ItemStack.areItemStackTagsEqual(held, hot) + && contents.stackSize < contents.getMaxStackSize()) { + contents.stackSize++; return true; } } return false; } - - public int getWorkableState() - { - if(worldObj == null || worldObj.isRemote) - { + + public int getWorkableState() { + if (worldObj == null || worldObj.isRemote) { return workableState; } - if(this.inv[0] != null) - { - return (int)Heatable.getHeatableStage(inv[0]); + if (this.inv[0] != null) { + return Heatable.getHeatableStage(inv[0]); } return 0; } - + @Override - public boolean canPlaceAbove() - { + public boolean canPlaceAbove() { return true; } public int exactTemperature; + @Override - public int getHeat() - { - if(worldObj.isRemote) - { + public int getHeat() { + if (worldObj.isRemote) { return exactTemperature; } - int mx = (int)(temperature*1.2F); - int mn = (int)(temperature*0.8F); + int mx = (int) (temperature * 1.2F); + int mn = (int) (temperature * 0.8F); return Functions.getIntervalWave1_i(ticksExisted, 400, mx, mn); } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java index 484f4425..343889d4 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java @@ -14,289 +14,248 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; -public class TileEntityQuern extends TileEntity implements IInventory, ISidedInventory -{ +public class TileEntityQuern extends TileEntity implements IInventory, ISidedInventory { private ItemStack[] inv = new ItemStack[3]; - + private Random rand = new Random(); @Override - public void updateEntity() - { + public void updateEntity() { int max = getMaxRevs(); - int levels = max/4; - - if(postUseTicks > 0) - { + int levels = max / 4; + + if (postUseTicks > 0) { --postUseTicks; } - if(postUseTicks > 0 || !((turnAngle == levels || turnAngle == levels*2 || turnAngle == levels*3 || turnAngle == 0))) - { - this.turnAngle ++; - if(!worldObj.isRemote && (turnAngle == levels || turnAngle == levels*2 || turnAngle == levels*3 || turnAngle == max)) - { + if (postUseTicks > 0 + || !((turnAngle == levels || turnAngle == levels * 2 || turnAngle == levels * 3 || turnAngle == 0))) { + this.turnAngle++; + if (!worldObj.isRemote && (turnAngle == levels || turnAngle == levels * 2 || turnAngle == levels * 3 + || turnAngle == max)) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.quern", 1.0F, 1.0F); onRevolutionComplete(); } - if(turnAngle >= max) - { + if (turnAngle >= max) { turnAngle = 0; } } } - public static final int getMaxRevs() - { + + public static final int getMaxRevs() { return 100; } - public boolean onUse(EntityPlayer user) - { - if(!worldObj.isRemote && turnAngle == 0 && postUseTicks == 0) - { + + public boolean onUse(EntityPlayer user) { + if (!worldObj.isRemote && turnAngle == 0 && postUseTicks == 0) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.quern", 1.0F, 1.0F); } this.postUseTicks = 10; return true; } - public boolean onRevolutionComplete() - { + + public boolean onRevolutionComplete() { QuernRecipes result = this.getResult(inv[0]); - if(result != null && inv[1] != null && result.tier <= getTier()) - { + if (result != null && inv[1] != null && result.tier <= getTier()) { ItemStack craft = result.result; - if(canFitResult(craft)) - { - if(!worldObj.isRemote) - { + if (canFitResult(craft)) { + if (!worldObj.isRemote) { return tryCraft(craft); - } - else - { - worldObj.spawnParticle("smoke", xCoord+0.5F, yCoord+1F, zCoord+0.5F, 0F, 0.2F, 0F); + } else { + worldObj.spawnParticle("smoke", xCoord + 0.5F, yCoord + 1F, zCoord + 0.5F, 0F, 0.2F, 0F); return true; } } } - + return false; } - private int getTier() - { + + private int getTier() { return 0; } - private boolean canFitResult(ItemStack result) - { + + private boolean canFitResult(ItemStack result) { ItemStack out = inv[2]; - if(out == null)return true; - - if(!out.isItemEqual(result))return false; - if(out.stackSize + result.stackSize > result.getMaxStackSize())return false; - + if (out == null) + return true; + + if (!out.isItemEqual(result)) + return false; + if (out.stackSize + result.stackSize > result.getMaxStackSize()) + return false; + return true; } - private boolean tryCraft(ItemStack result) - { + + private boolean tryCraft(ItemStack result) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.craftprimitive", 0.5F, 1.2F); /* - if(rand.nextFloat() > 0.20F)//20% success rate - { - worldObj.playSoundEffect(xCoord, yCoord, zCoord, "dig.gravel", 1.0F, 0.5F); - return false; - } - else - */ + * if(rand.nextFloat() > 0.20F)//20% success rate { + * worldObj.playSoundEffect(xCoord, yCoord, zCoord, "dig.gravel", 1.0F, 0.5F); + * return false; } else + */ { this.decrStackSize(0, 1); this.decrStackSize(1, 1); - + ItemStack out = inv[2]; - if(out == null) - { + if (out == null) { this.setInventorySlotContents(2, result.copy()); - } - else - { + } else { out.stackSize += result.stackSize; } return true; } } + @Override - public int getSizeInventory() - { + public int getSizeInventory() { return inv.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return inv[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { - if (this.inv[slot] != null) - { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) - { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } - else - { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) - { - this.inv[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + public ItemStack decrStackSize(int slot, int num) { + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return inv[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { inv[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return "gui.quern.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { - if(item != null && getResult(item) != null) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (item != null && getResult(item) != null) { return slot == 0; } - if(item != null && item.getItem() == ComponentListMF.clay_pot) - { + if (item != null && item.getItem() == ComponentListMF.clay_pot) { return slot == 1; } return false; } - + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) - { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.inv.length; ++i) - { - if (this.inv[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); } - public static boolean isInput(ItemStack input) - { + public static boolean isInput(ItemStack input) { return getResult(input) != null; } - private static QuernRecipes getResult(ItemStack input) - { + private static QuernRecipes getResult(ItemStack input) { return QuernRecipes.getResult(input); } + @SideOnly(Side.CLIENT) - public String getTextureName() - { + public String getTextureName() { return "quern_basic"; } - public static boolean isPot(ItemStack item) - { + + public static boolean isPot(ItemStack item) { return item != null && item.getItem() == ComponentListMF.clay_pot; } + private int postUseTicks; public int turnAngle; @Override - public int[] getAccessibleSlotsFromSide(int side) - { - return new int[]{0, 1, 2}; + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] { 0, 1, 2 }; } + @Override - public boolean canInsertItem(int slot, ItemStack item, int side) - { + public boolean canInsertItem(int slot, ItemStack item, int side) { return isItemValidForSlot(slot, item); } + @Override - public boolean canExtractItem(int slot, ItemStack item, int side) - { + public boolean canExtractItem(int slot, ItemStack item, int side) { return slot == 2; } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java index 0ccb4526..bcc6616d 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java @@ -21,354 +21,305 @@ import net.minecraft.util.ChatComponentTranslation; import net.minecraft.world.WorldServer; -public class TileEntityResearch extends TileEntity implements IInventory, IBasicMetre -{ +public class TileEntityResearch extends TileEntity implements IInventory, IBasicMetre { private ItemStack[] items = new ItemStack[1]; public float progress; public float maxProgress; public int researchID = -1; - - public boolean interact(EntityPlayer user) - { - if(worldObj.isRemote) - { + + public boolean interact(EntityPlayer user) { + if (worldObj.isRemote) { return true; } ArrayList research = this.getInfo(items[0]); int result = canResearch(user, research); - - if(research != null && research.size() > 0 && result != 0) - { - if(result == -1) - { - if(!user.worldObj.isRemote) - user.addChatComponentMessage(new ChatComponentTranslation("research.noskill", new Object[0])); - return true; + + if (research != null && research.size() > 0 && result != 0) { + if (result == -1) { + if (!user.worldObj.isRemote) + user.addChatComponentMessage(new ChatComponentTranslation("research.noskill", new Object[0])); + return true; } maxProgress = getMaxTime(); - if(maxProgress > 0) - { + if (maxProgress > 0) { addProgress(user); - - if(progress >= maxProgress) - { + + if (progress >= maxProgress) { addResearch(research, user); progress = 0; } - + return true; } - } - else - { - if(result == 0) - { - if(!user.worldObj.isRemote) - user.addChatComponentMessage(new ChatComponentTranslation("research.null", new Object[0])); + } else { + if (result == 0) { + if (!user.worldObj.isRemote) + user.addChatComponentMessage(new ChatComponentTranslation("research.null", new Object[0])); } progress = 0; } - + return items[0] != null; } - private void addResearch(ArrayList research, EntityPlayer user) - { - for(int id = 0; id < research.size(); id++) - { + + private void addResearch(ArrayList research, EntityPlayer user) { + for (int id = 0; id < research.size(); id++) { InformationBase base = ResearchLogic.getResearch(research.get(id)); - if(base != null && !ResearchLogic.alreadyUsedArtefact(user, base, items[0]) && ResearchLogic.canPurchase(user, base) && base.hasSkillsUnlocked(user)) - { + if (base != null && !ResearchLogic.alreadyUsedArtefact(user, base, items[0]) + && ResearchLogic.canPurchase(user, base) && base.hasSkillsUnlocked(user)) { int artefacts = ResearchArtefacts.useArtefact(items[0], base, user); - worldObj.playSoundEffect(xCoord+0.5, yCoord+0.5, zCoord+0.5, "minefantasy2:updateResearch", 1.0F, 1.0F); - if(!user.worldObj.isRemote) - { - Object name = new ChatComponentTranslation("knowledge."+base.getUnlocalisedName()); - if(artefacts == -1) - { + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "minefantasy2:updateResearch", 1.0F, + 1.0F); + if (!user.worldObj.isRemote) { + Object name = new ChatComponentTranslation("knowledge." + base.getUnlocalisedName()); + if (artefacts == -1) { user.addChatComponentMessage(new ChatComponentTranslation("research.finishResearch", name)); - } - else - { - user.addChatComponentMessage(new ChatComponentTranslation("research.addArtefact", name, artefacts, base.getArtefactCount())); + } else { + user.addChatComponentMessage(new ChatComponentTranslation("research.addArtefact", name, + artefacts, base.getArtefactCount())); } } return; } - + } } - //0 nothing, -1 for no skill, 1 for yes - private int canResearch(EntityPlayer user, ArrayList research) - { - if(research == null){return 0;} + + // 0 nothing, -1 for no skill, 1 for yes + private int canResearch(EntityPlayer user, ArrayList research) { + if (research == null) { + return 0; + } int result = 0; - - for(int id = 0; id < research.size(); id++) - { + + for (int id = 0; id < research.size(); id++) { InformationBase base = ResearchLogic.getResearch(research.get(id)); - if(base != null && !ResearchLogic.alreadyUsedArtefact(user, base, items[0])) - { - if(ResearchLogic.canPurchase(user, base) && base.hasSkillsUnlocked(user)) - { + if (base != null && !ResearchLogic.alreadyUsedArtefact(user, base, items[0])) { + if (ResearchLogic.canPurchase(user, base) && base.hasSkillsUnlocked(user)) { return 1; - } - else if (!ResearchLogic.hasInfoUnlocked(user, base)) - { + } else if (!ResearchLogic.hasInfoUnlocked(user, base)) { result = -1; } } } return result; } - private float getMaxTime() - { + + private float getMaxTime() { int t = 10; - if(items[0] != null && items[0].getItem() instanceof IArtefact) - { - return ((IArtefact)items[0].getItem()).getStudyTime(items[0]); + if (items[0] != null && items[0].getItem() instanceof IArtefact) { + return ((IArtefact) items[0].getItem()).getStudyTime(items[0]); } return this.getInfo(items[0]) != null ? t : 0; } - private void addProgress(EntityPlayer user) - { + + private void addProgress(EntityPlayer user) { ItemStack held = user.getHeldItem(); - if(held != null && (held.getItem() == ComponentListMF.talisman_lesser || held.getItem() == ComponentListMF.talisman_greater)) - { + if (held != null && (held.getItem() == ComponentListMF.talisman_lesser + || held.getItem() == ComponentListMF.talisman_greater)) { progress = maxProgress; - if(!user.capabilities.isCreativeMode && held.getItem() == ComponentListMF.talisman_lesser) - { + if (!user.capabilities.isCreativeMode && held.getItem() == ComponentListMF.talisman_lesser) { --held.stackSize; - if(held.stackSize <= 0) - { + if (held.stackSize <= 0) { user.setCurrentItemOrArmor(0, null); } } return; } float efficiency = 1.0F; - if(user.swingProgress > 0) - { - efficiency *= Math.max(0F, 1.0F-user.swingProgress); + if (user.swingProgress > 0) { + efficiency *= Math.max(0F, 1.0F - user.swingProgress); } - worldObj.playSoundEffect(xCoord+0.5, yCoord+0.5, zCoord+0.5, "minefantasy2:block.flipPage", 1.0F, rand.nextFloat()*0.4F+0.8F); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "minefantasy2:block.flipPage", 1.0F, + rand.nextFloat() * 0.4F + 0.8F); efficiency *= getEnvironmentBoost(); progress += efficiency; } - private float getEnvironmentBoost() - { + + private float getEnvironmentBoost() { int books = 0; - for(int x = -8; x <= 8; x++) - { - for(int y = -8; y <= 8; y++) - { - for(int z = -8; z <= 8; z++) - { - if(worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) == Blocks.bookshelf) - { + for (int x = -8; x <= 8; x++) { + for (int y = -8; y <= 8; y++) { + for (int z = -8; z <= 8; z++) { + if (worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) == Blocks.bookshelf) { ++books; } - } - } + } + } } - return 1.0F + (0.1F*books); + return 1.0F + (0.1F * books); } + private Random rand = new Random(); - + private int ticksExisted; + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); - + syncData(); } - public void syncData() - { - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + public void syncData() { + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new ResearchTablePacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, + new ResearchTablePacket(this).generatePacket()); } } - - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setInteger("researchID", researchID); nbt.setInteger("ticksExisted", ticksExisted); nbt.setFloat("progress", progress); nbt.setFloat("maxProgress", maxProgress); NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.items.length; ++i) - { - if (this.items[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.items[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); + for (int i = 0; i < this.items.length; ++i) { + if (this.items[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.items[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + ticksExisted = nbt.getInteger("ticksExisted"); researchID = nbt.getInteger("researchID"); progress = nbt.getFloat("progress"); maxProgress = nbt.getFloat("maxProgress"); NBTTagList savedItems = nbt.getTagList("Items", 10); - this.items = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.items.length) - { - this.items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } + this.items = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.items.length) { + this.items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } } - + @Override - public int getSizeInventory() - { + public int getSizeInventory() { return items.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return items[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { - if (this.items[slot] != null) - { - ItemStack itemstack; - - if (this.items[slot].stackSize <= num) - { - itemstack = this.items[slot]; - this.items[slot] = null; - return itemstack; - } - else - { - itemstack = this.items[slot].splitStack(num); - - if (this.items[slot].stackSize == 0) - { - this.items[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } - + public ItemStack decrStackSize(int slot, int num) { + if (this.items[slot] != null) { + ItemStack itemstack; + + if (this.items[slot].stackSize <= num) { + itemstack = this.items[slot]; + this.items[slot] = null; + return itemstack; + } else { + itemstack = this.items[slot].splitStack(num); + + if (this.items[slot].stackSize == 0) { + this.items[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return items[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { items[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return "gui.bombcraftmf.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { return canAccept(item); } - public static ArrayList getInfo(ItemStack item) - { - if(item == null) - { + + public static ArrayList getInfo(ItemStack item) { + if (item == null) { return null; } - + return ResearchArtefacts.getResearchNames(item); } - public static boolean canAccept(ItemStack item) - { + + public static boolean canAccept(ItemStack item) { ArrayList info = getInfo(item); return info != null && info.size() > 0; } - + @Override - public int getMetreScale(int size) - { - if(maxProgress <= 0) - { + public int getMetreScale(int size) { + if (maxProgress <= 0) { return 0; } - return (int)Math.min(size, Math.ceil(size / maxProgress * progress)); + return (int) Math.min(size, Math.ceil(size / maxProgress * progress)); } + @Override - public boolean shouldShowMetre() - { + public boolean shouldShowMetre() { return maxProgress > 0; } + @Override - public String getLocalisedName() - { + public String getLocalisedName() { return ""; } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java index c5b30d45..2ef37b29 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java @@ -13,44 +13,34 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; -public class TileEntityRoad extends TileEntity -{ - public int[] surface = new int[]{0, 0}; +public class TileEntityRoad extends TileEntity { + public int[] surface = new int[] { 0, 0 }; public boolean isLocked = false; private int ticksExisted; private Random rand = new Random(); - - public TileEntityRoad() - { + + public TileEntityRoad() { } @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); - + ++ticksExisted; - if(!worldObj.isRemote) - { - if(ticksExisted % 1200 == 0) - { + if (!worldObj.isRemote) { + if (ticksExisted % 1200 == 0) { sendPacketToClients(); } - } - else if(ticksExisted == 20) - { + } else if (ticksExisted == 20) { requestPacket(); } } - - public void setSurface(Block id, int meta) - { - if(worldObj == null) - { + + public void setSurface(Block id, int meta) { + if (worldObj == null) { return; } - if(id == Blocks.grass) - { + if (id == Blocks.grass) { id = Blocks.dirt; } worldObj.playSoundEffect(xCoord, yCoord, zCoord, "dig.grass", 0.5F, 1.0F); @@ -60,73 +50,66 @@ public void setSurface(Block id, int meta) refreshSurface(); } - public void sendPacketToClients() - { - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + public void sendPacketToClients() { + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new RoadPacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new RoadPacket(this).generatePacket()); } } - public void requestPacket() - { - if(!worldObj.isRemote)return; + + public void requestPacket() { + if (!worldObj.isRemote) + return; EntityPlayer player = MineFantasyII.proxy.getClientPlayer(); - if(player != null) - { - ((EntityClientPlayerMP)player).sendQueue.addToSendQueue(new RoadPacket(this).request().generatePacket()); + if (player != null) { + ((EntityClientPlayerMP) player).sendQueue.addToSendQueue(new RoadPacket(this).request().generatePacket()); } - } - private boolean blockChange(int id, int meta) - { - if(id != surface[0])return true; - if(meta != surface[1])return true; - + } + + private boolean blockChange(int id, int meta) { + if (id != surface[0]) + return true; + if (meta != surface[1]) + return true; + return false; } - - - public void writeToNBT(NBTTagCompound nbt) - { + + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setIntArray("surface", surface); nbt.setBoolean("isLocked", isLocked); - } - public void readFromNBT(NBTTagCompound nbt) - { + } + + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + surface = nbt.getIntArray("surface"); isLocked = nbt.getBoolean("isLocked"); - } + } - public int[] getSurface() - { + public int[] getSurface() { return surface; } - public boolean canBuild() - { - if(worldObj == null) - { + public boolean canBuild() { + if (worldObj == null) { return false; } return true; } - public void refreshSurface() - { + public void refreshSurface() { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } - - public Block getBaseBlock() - { - if(surface[0] <= 0) - { + + public Block getBaseBlock() { + if (surface[0] <= 0) { return Blocks.dirt; } Block block = Block.getBlockById(surface[0]); diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java index bbfc5409..30801603 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java @@ -22,109 +22,97 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; -public class TileEntityRoast extends TileEntity implements IInventory, IHeatUser -{ +public class TileEntityRoast extends TileEntity implements IInventory, IHeatUser { public ItemStack[] items = new ItemStack[1]; public float progress; public float maxProgress; private int tempTicksExisted = 0; private Random rand = new Random(); private int ticksExisted; - - public TileEntityRoast() - { + + public TileEntityRoast() { } + private CookRecipe recipe; + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); ++tempTicksExisted; - if(tempTicksExisted == 10) - { + if (tempTicksExisted == 10) { blockMetadata = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); updateRecipe(); } int temp = getTemp(); ++ticksExisted; - if(ticksExisted % 20 == 0 && !worldObj.isRemote) - { - if(recipe != null && temp > 0 && maxProgress > 0 && temp > recipe.minTemperature) - { - if(enableOverheat && recipe.canBurn && temp > recipe.maxTemperature) - { + if (ticksExisted % 20 == 0 && !worldObj.isRemote) { + if (recipe != null && temp > 0 && maxProgress > 0 && temp > recipe.minTemperature) { + if (enableOverheat && recipe.canBurn && temp > recipe.maxTemperature) { setInventorySlotContents(0, recipe.burnt.copy()); updateRecipe(); } - progress += (temp/100F); - if(progress >= maxProgress) - { + progress += (temp / 100F); + if (progress >= maxProgress) { setInventorySlotContents(0, recipe.output.copy()); updateRecipe(); } } } - if(temp > 0 && worldObj.isRemote && rand.nextInt(20) == 0) - { - worldObj.spawnParticle("flame", xCoord+0.2F+(rand.nextFloat()*0.6F), yCoord+0.2F, zCoord+0.2F+(rand.nextFloat()*0.6F) - ,0F, 0F, 0F); + if (temp > 0 && worldObj.isRemote && rand.nextInt(20) == 0) { + worldObj.spawnParticle("flame", xCoord + 0.2F + (rand.nextFloat() * 0.6F), yCoord + 0.2F, + zCoord + 0.2F + (rand.nextFloat() * 0.6F), 0F, 0F, 0F); } } + /** * Enable high temperatures ruin cooking */ public static boolean enableOverheat = true; - - private int getTemp() - { - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord-1, zCoord); - if(tile != null && tile instanceof IHeatSource) - { - return ((IHeatSource)tile).getHeat(); + + private int getTemp() { + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (tile != null && tile instanceof IHeatSource) { + return ((IHeatSource) tile).getHeat(); } return 0; } - public TileEntityRoast setInventoryModel(String tex, boolean isOven) - { + + public TileEntityRoast setInventoryModel(String tex, boolean isOven) { this.isOvenTemp = isOven; this.texname = tex; return this; } + private boolean isOvenTemp; - public boolean isOven() - { - if(worldObj == null)return isOvenTemp; + + public boolean isOven() { + if (worldObj == null) + return isOvenTemp; Block base = worldObj.getBlock(xCoord, yCoord, zCoord); - if(base instanceof BlockRoast) - { - return ((BlockRoast)base).isOven(); + if (base instanceof BlockRoast) { + return ((BlockRoast) base).isOven(); } return false; } - public boolean interact(EntityPlayer player) - { + + public boolean interact(EntityPlayer player) { ItemStack held = player.getHeldItem(); ItemStack item = items[0]; - if(item == null) - { - if(held != null && !(held.getItem() instanceof ItemBlock) && CookRecipe.getResult(held, isOven()) != null) - { + if (item == null) { + if (held != null && !(held.getItem() instanceof ItemBlock) + && CookRecipe.getResult(held, isOven()) != null) { ItemStack item2 = held.copy(); item2.stackSize = 1; setInventorySlotContents(0, item2); tryDecrMainItem(player); updateRecipe(); - if(!isOven() && this.getTemp() > 0) - { - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "random.fizz", 1.0F, 1.0F); + if (!isOven() && this.getTemp() > 0) { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "random.fizz", 1.0F, 1.0F); } return true; } - } - else - { - if(!player.inventory.addItemStackToInventory(item)) - { + } else { + if (!player.inventory.addItemStackToInventory(item)) { player.entityDropItem(item, 0.0F); } setInventorySlotContents(0, null); @@ -134,262 +122,228 @@ public boolean interact(EntityPlayer player) return false; } - private void tryDecrMainItem(EntityPlayer player) - { + private void tryDecrMainItem(EntityPlayer player) { int held = player.inventory.currentItem; - if(held >= 0 && held < 9) - { + if (held >= 0 && held < 9) { player.inventory.decrStackSize(held, 1); } } - public void updateRecipe() - { + + public void updateRecipe() { recipe = CookRecipe.getResult(getStackInSlot(0), isOven()); - if(recipe != null) - { + if (recipe != null) { maxProgress = recipe.time; } progress = 0; sendPacketToClients(); } - public int getProgressBar(int i) - { - if(maxProgress <= 0)return 0; - return (int)((float)i / maxProgress * progress); + + public int getProgressBar(int i) { + if (maxProgress <= 0) + return 0; + return (int) (i / maxProgress * progress); } - public String getResultName() - { - if(recipe != null) - { + + public String getResultName() { + if (recipe != null) { return recipe.output.getDisplayName(); } return ""; } - - + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); progress = nbt.getFloat("Progress"); - maxProgress = nbt.getFloat("maxProgress"); - + maxProgress = nbt.getFloat("maxProgress"); + NBTTagList savedItems = nbt.getTagList("Items", 10); - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); - if (slotNum >= 0 && slotNum < items.length) - { - items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } + if (slotNum >= 0 && slotNum < items.length) { + items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setFloat("Progress", progress); - nbt.setFloat("maxProgress", maxProgress); - + nbt.setFloat("maxProgress", maxProgress); + NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < items.length; ++i) - { - if (items[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - items[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); + + for (int i = 0; i < items.length; ++i) { + if (items[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + items[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); } - - //INVENTORY - public void onInventoryChanged() - { + + // INVENTORY + public void onInventoryChanged() { } - + @Override - public int getSizeInventory() - { + public int getSizeInventory() { return items.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return items[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { onInventoryChanged(); - if (this.items[slot] != null) - { - ItemStack itemstack; - - if (this.items[slot].stackSize <= num) - { - itemstack = this.items[slot]; - this.items[slot] = null; - return itemstack; - } - else - { - itemstack = this.items[slot].splitStack(num); - - if (this.items[slot].stackSize == 0) - { - this.items[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + if (this.items[slot] != null) { + ItemStack itemstack; + + if (this.items[slot].stackSize <= num) { + itemstack = this.items[slot]; + this.items[slot] = null; + return itemstack; + } else { + itemstack = this.items[slot].splitStack(num); + + if (this.items[slot].stackSize == 0) { + this.items[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return items[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { onInventoryChanged(); items[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return "tile.roast.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 1; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { return false; } - - private void dropItem(ItemStack itemstack) - { - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - worldObj.spawnEntityInWorld(entityitem); - } - } + + private void dropItem(ItemStack itemstack) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + worldObj.spawnEntityInWorld(entityitem); + } + } } + @Override - public boolean canAccept(TileEntity tile) - { + public boolean canAccept(TileEntity tile) { return true; } - - private void sendPacketToClients() - { - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + private void sendPacketToClients() { + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new TileInventoryPacket(this, this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, + new TileInventoryPacket(this, this).generatePacket()); } } - + public String texname = "basic"; - + @SideOnly(Side.CLIENT) - public String getTexName() - { - if(worldObj == null)return texname; - + public String getTexName() { + if (worldObj == null) + return texname; + Block base = worldObj.getBlock(xCoord, yCoord, zCoord); - if(base instanceof BlockRoast) - { - return ((BlockRoast)base).tex; + if (base instanceof BlockRoast) { + return ((BlockRoast) base).tex; } return "basic"; } - + @Override - public Block getBlockType() - { - if(worldObj == null) return BlockListMF.oven_stone; - - return super.getBlockType(); - } + public Block getBlockType() { + if (worldObj == null) + return BlockListMF.oven_stone; + + return super.getBlockType(); + } + @Override - public int getBlockMetadata() - { - if(worldObj == null) return 0; + public int getBlockMetadata() { + if (worldObj == null) + return 0; return super.getBlockMetadata(); - } + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityTanningRack.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityTanningRack.java index e24d6b92..25efbd08 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityTanningRack.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityTanningRack.java @@ -1,34 +1,25 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; import java.util.Random; import minefantasy.mf2.api.crafting.tanning.TanningRecipe; import minefantasy.mf2.api.helpers.ToolHelper; -import minefantasy.mf2.api.refine.BlastFurnaceRecipes; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.SkillList; -import minefantasy.mf2.block.crafting.BlockTanningRack; import minefantasy.mf2.block.crafting.BlockEngineerTanner; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.container.ContainerTanner; -import minefantasy.mf2.item.ItemComponentMF; import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.util.MFLogUtil; -import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.WorldServer; -public class TileEntityTanningRack extends TileEntity implements IInventory -{ +public class TileEntityTanningRack extends TileEntity implements IInventory { public ItemStack[] items = new ItemStack[2]; public float progress; public float maxProgress; @@ -38,89 +29,72 @@ public class TileEntityTanningRack extends TileEntity implements IInventory public final ContainerTanner container; private int tempTicksExisted = 0; private Random rand = new Random(); - + public float acTime; - - public TileEntityTanningRack() - { + + public TileEntityTanningRack() { this(0, "Basic"); } - public TileEntityTanningRack(int tier, String tex) - { + + public TileEntityTanningRack(int tier, String tex) { container = new ContainerTanner(this); - this.tier=tier; - this.tex=tex; + this.tier = tier; + this.tex = tex; } - + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); ++tempTicksExisted; - if(tempTicksExisted == 10) - { + if (tempTicksExisted == 10) { blockMetadata = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); } - if(isAutomated()) - { - if(acTime > 0) - { - acTime -= (1F/20); + if (isAutomated()) { + if (acTime > 0) { + acTime -= (1F / 20); } - //syncAnimations(); + // syncAnimations(); } } - public boolean interact(EntityPlayer player, boolean leftClick, boolean leverPull) - { - if(leverPull && acTime > 0) - { + + public boolean interact(EntityPlayer player, boolean leftClick, boolean leverPull) { + if (leverPull && acTime > 0) { return true; } container.detectAndSendChanges(); - + ItemStack held = player.getHeldItem(); - - //Interaction - if(items[1] != null && (leverPull || ToolHelper.getCrafterTool(held).equalsIgnoreCase(toolType))) - { - if(leverPull || ToolHelper.getCrafterTier(held) >= tier) - { - if(!leverPull) - { + + // Interaction + if (items[1] != null && (leverPull || ToolHelper.getCrafterTool(held).equalsIgnoreCase(toolType))) { + if (leverPull || ToolHelper.getCrafterTier(held) >= tier) { + if (!leverPull) { held.damageItem(1, player); - if(held.getItemDamage() >= held.getMaxDamage()) - { + if (held.getItemDamage() >= held.getMaxDamage()) { player.destroyCurrentEquippedItem(); } - } - else - { - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "tile.piston.out", 0.75F, 0.85F); + } else { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "tile.piston.out", 0.75F, + 0.85F); acTime = 1.0F; } - - float efficiency = leverPull ? 100F : ToolHelper.getCrafterEfficiency(held); - if(!leverPull && player.swingProgress > 0 && player.swingProgress <= 1.0) - { - efficiency *= (0.5F-player.swingProgress); + + float efficiency = leverPull ? 100F : ToolHelper.getCrafterEfficiency(held); + if (!leverPull && player.swingProgress > 0 && player.swingProgress <= 1.0) { + efficiency *= (0.5F - player.swingProgress); } - - if(efficiency > 0) - { + + if (efficiency > 0) { progress += efficiency; } - if(toolType.equalsIgnoreCase("shears")) - { - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "mob.sheep.shear", 1.0F, 1.0F); - } - else - { - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "dig.cloth", 1.0F, 1.0F); + if (toolType.equalsIgnoreCase("shears")) { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "mob.sheep.shear", 1.0F, + 1.0F); + } else { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "dig.cloth", 1.0F, 1.0F); } - if(progress >= maxProgress) - { - if(RPGElements.isSystemActive) - { + if (progress >= maxProgress) { + if (RPGElements.isSystemActive) { SkillList.artisanry.addXP(player, 1); } progress = 0; @@ -129,12 +103,11 @@ public boolean interact(EntityPlayer player, boolean leftClick, boolean leverPul out.stackSize *= ss; setInventorySlotContents(0, out); updateRecipe(); - if(isShabbyRack() && rand.nextInt(10) == 0 && !worldObj.isRemote) - { - for(int a = 0; a < rand.nextInt(10); a++) - { - ItemStack plank = ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood"); - worldObj.playSoundEffect(xCoord+0.5, yCoord+0.5, zCoord+0.5, "mob.zombie.woodbreak", 1.0F, 1.5F); + if (isShabbyRack() && rand.nextInt(10) == 0 && !worldObj.isRemote) { + for (int a = 0; a < rand.nextInt(10); a++) { + ItemStack plank = ComponentListMF.plank.construct("ScrapWood"); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "mob.zombie.woodbreak", + 1.0F, 1.5F); dropItem(plank); } worldObj.setBlockToAir(xCoord, yCoord, zCoord); @@ -144,64 +117,54 @@ public boolean interact(EntityPlayer player, boolean leftClick, boolean leverPul } return true; } - if(!leftClick && (ToolHelper.getCrafterTool(held).equalsIgnoreCase("nothing") || ToolHelper.getCrafterTool(held).equalsIgnoreCase("hands"))) - { - //Item placement + if (!leftClick && (ToolHelper.getCrafterTool(held).equalsIgnoreCase("nothing") + || ToolHelper.getCrafterTool(held).equalsIgnoreCase("hands"))) { + // Item placement ItemStack item = items[0]; - if(item == null) - { - if(held != null && !(held.getItem() instanceof ItemBlock) && TanningRecipe.getRecipe(held) != null) - { + if (item == null) { + if (held != null && !(held.getItem() instanceof ItemBlock) && TanningRecipe.getRecipe(held) != null) { ItemStack item2 = held.copy(); item2.stackSize = 1; setInventorySlotContents(0, item2); tryDecrMainItem(player); updateRecipe(); - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "mob.horse.leather", 1.0F, 1.0F); + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "mob.horse.leather", 1.0F, + 1.0F); return true; } - } - else - { - if(!player.inventory.addItemStackToInventory(item)) - { + } else { + if (!player.inventory.addItemStackToInventory(item)) { player.entityDropItem(item, 0.0F); } setInventorySlotContents(0, null); updateRecipe(); - worldObj.playSoundEffect(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, "mob.horse.leather", 1.0F, 1.0F); + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "mob.horse.leather", 1.0F, 1.0F); return true; } } return false; } - public boolean isAutomated() - { - if(worldObj == null) - { + public boolean isAutomated() { + if (worldObj == null) { return tex.equalsIgnoreCase("metal"); } - return worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockEngineerTanner; + return worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockEngineerTanner; } - private void tryDecrMainItem(EntityPlayer player) - { + + private void tryDecrMainItem(EntityPlayer player) { int held = player.inventory.currentItem; - if(held >= 0 && held < 9) - { + if (held >= 0 && held < 9) { player.inventory.decrStackSize(held, 1); } } - public void updateRecipe() - { + + public void updateRecipe() { TanningRecipe recipe = TanningRecipe.getRecipe(items[0]); - if(recipe == null) - { + if (recipe == null) { setInventorySlotContents(1, null); progress = maxProgress = tier = 0; - } - else - { + } else { setInventorySlotContents(1, recipe.output); tier = recipe.tier; maxProgress = recipe.time; @@ -209,215 +172,183 @@ public void updateRecipe() } progress = 0; } - public boolean doesPlayerKnowCraft(EntityPlayer thePlayer) - { + + public boolean doesPlayerKnowCraft(EntityPlayer thePlayer) { return true; } - public int getProgressBar(int i) - { - if(maxProgress <= 0)return 0; - return (int)((float)i / maxProgress * progress); + + public int getProgressBar(int i) { + if (maxProgress <= 0) + return 0; + return (int) (i / maxProgress * progress); } - public String getResultName() - { - if(items[1] != null) - { + + public String getResultName() { + if (items[1] != null) { return items[1].getDisplayName(); } return ""; } - - + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); acTime = nbt.getFloat("acTime"); tex = nbt.getString("tex"); tier = nbt.getInteger("tier"); progress = nbt.getFloat("Progress"); - maxProgress = nbt.getFloat("maxProgress"); - toolType = nbt.getString("toolType"); - + maxProgress = nbt.getFloat("maxProgress"); + toolType = nbt.getString("toolType"); + NBTTagList savedItems = nbt.getTagList("Items", 10); - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); - if (slotNum >= 0 && slotNum < items.length) - { - items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } + if (slotNum >= 0 && slotNum < items.length) { + items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setFloat("acTime", acTime); nbt.setString("tex", tex); nbt.setInteger("tier", tier); nbt.setFloat("Progress", progress); - nbt.setFloat("maxProgress", maxProgress); - nbt.setString("toolType", toolType); - + nbt.setFloat("maxProgress", maxProgress); + nbt.setString("toolType", toolType); + NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < items.length; ++i) - { - if (items[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - items[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); + + for (int i = 0; i < items.length; ++i) { + if (items[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + items[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); } - - //INVENTORY - public void onInventoryChanged() - { + + // INVENTORY + public void onInventoryChanged() { } - + @Override - public int getSizeInventory() - { + public int getSizeInventory() { return items.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return items[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { onInventoryChanged(); - if (this.items[slot] != null) - { - ItemStack itemstack; - - if (this.items[slot].stackSize <= num) - { - itemstack = this.items[slot]; - this.items[slot] = null; - return itemstack; - } - else - { - itemstack = this.items[slot].splitStack(num); - - if (this.items[slot].stackSize == 0) - { - this.items[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + if (this.items[slot] != null) { + ItemStack itemstack; + + if (this.items[slot].stackSize <= num) { + itemstack = this.items[slot]; + this.items[slot] = null; + return itemstack; + } else { + itemstack = this.items[slot].splitStack(num); + + if (this.items[slot].stackSize == 0) { + this.items[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return items[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { onInventoryChanged(); items[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return "tile.tanner.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 1; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { return false; } - - private boolean isShabbyRack() - { + + private boolean isShabbyRack() { return worldObj.getBlock(xCoord, yCoord, zCoord) == BlockListMF.tanner; } - - private void dropItem(ItemStack itemstack) - { - if (itemstack != null) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - worldObj.spawnEntityInWorld(entityitem); - } - } + + private void dropItem(ItemStack itemstack) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + worldObj.spawnEntityInWorld(entityitem); + } + } } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityWorldGenMarker.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityWorldGenMarker.java index c14406ea..56541060 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityWorldGenMarker.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityWorldGenMarker.java @@ -8,46 +8,40 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.chunk.Chunk; -public class TileEntityWorldGenMarker extends TileEntity -{ +public class TileEntityWorldGenMarker extends TileEntity { public String className, type; public int ticks = 0, length = 0, deviation = 0, prevID, prevMeta; + @Override - public void updateEntity() - { - if(!worldObj.isRemote && areChunksLoaded() && ticks >= getSpawnTime()) - { + public void updateEntity() { + if (!worldObj.isRemote && areChunksLoaded() && ticks >= getSpawnTime()) { Block block = Block.getBlockById(prevID); worldObj.setBlock(xCoord, yCoord, zCoord, block != null ? block : Blocks.air, prevMeta, 2); - StructureModuleMF.placeStructure(className, type, length, deviation, worldObj, xCoord, yCoord, zCoord, this.getBlockMetadata()); + StructureModuleMF.placeStructure(className, type, length, deviation, worldObj, xCoord, yCoord, zCoord, + this.getBlockMetadata()); } - + ++ticks; } - - private boolean areChunksLoaded() - { - return chunkLoaded(0, 0) && - chunkLoaded(-16, 0) && - chunkLoaded(16, 0) && - chunkLoaded(0, -16) && - chunkLoaded(0, 16); + + private boolean areChunksLoaded() { + return chunkLoaded(0, 0) && chunkLoaded(-16, 0) && chunkLoaded(16, 0) && chunkLoaded(0, -16) + && chunkLoaded(0, 16); } - private boolean chunkLoaded(int x, int z) - { + + private boolean chunkLoaded(int x, int z) { Chunk chunk = worldObj.getChunkFromBlockCoords(x, z); return chunk != null && chunk.isChunkLoaded; } - - private int getSpawnTime() - { + + private int getSpawnTime() { return ConfigWorldGen.structureTickRate; } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + className = nbt.getString("ClassDirectory"); type = nbt.getString("SubType"); length = nbt.getInteger("LengthPosition"); @@ -55,12 +49,11 @@ public void readFromNBT(NBTTagCompound nbt) prevID = nbt.getInteger("prevID"); prevMeta = nbt.getInteger("prevMeta"); } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setString("ClassDirectory", className); nbt.setString("SubType", type); nbt.setInteger("LengthPosition", length); diff --git a/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFC.java b/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFC.java index d729e380..def3c170 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFC.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFC.java @@ -18,65 +18,54 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; -public class TileEntityBlastFC extends TileEntity implements IInventory, ISidedInventory, ISmokeCarrier -{ +public class TileEntityBlastFC extends TileEntity implements IInventory, ISidedInventory, ISmokeCarrier { protected ItemStack[] items = new ItemStack[2]; protected int smokeStorage; public int ticksExisted; public boolean isBuilt = false; public int fireTime; protected Random rand = new Random(); - + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); ++ticksExisted; int dropFrequency = 5; - - if(!worldObj.isRemote && ticksExisted % dropFrequency == 0) - { - TileEntity neighbour = worldObj.getTileEntity(xCoord, yCoord-1, zCoord); - if(neighbour != null && neighbour instanceof TileEntityBlastFC && !(neighbour instanceof TileEntityBlastFH)) - { - interact((TileEntityBlastFC)neighbour); + + if (!worldObj.isRemote && ticksExisted % dropFrequency == 0) { + TileEntity neighbour = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (neighbour != null && neighbour instanceof TileEntityBlastFC + && !(neighbour instanceof TileEntityBlastFH)) { + interact((TileEntityBlastFC) neighbour); } } - if(ticksExisted % 200 == 0) - { + if (ticksExisted % 200 == 0) { updateBuild(); } - if(smokeStorage > 0) - { + if (smokeStorage > 0) { SmokeMechanics.emitSmokeFromCarrier(worldObj, xCoord, yCoord, zCoord, this, 5); } - if(!worldObj.isRemote && smokeStorage > getMaxSmokeStorage() && rand.nextInt(1000) == 0) - { - worldObj.newExplosion(null, xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, 5F, true, true); + if (!worldObj.isRemote && smokeStorage > getMaxSmokeStorage() && rand.nextInt(1000) == 0) { + worldObj.newExplosion(null, xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 5F, true, true); } } - protected void interact(TileEntityBlastFC tile) - { - if(!tile.isBuilt)return; - - for(int a = 0; a < getSizeInventory(); a++) - { + + protected void interact(TileEntityBlastFC tile) { + if (!tile.isBuilt) + return; + + for (int a = 0; a < getSizeInventory(); a++) { ItemStack mySlot = getStackInSlot(a); - - if(mySlot != null && canShare(mySlot, a)) - { + + if (mySlot != null && canShare(mySlot, a)) { ItemStack theirSlot = tile.getStackInSlot(a); - if(theirSlot == null) - { + if (theirSlot == null) { ItemStack copy = mySlot.copy(); copy.stackSize = 1; tile.setInventorySlotContents(a, copy); this.decrStackSize(a, 1); - } - else if(CustomToolHelper.areEqual(theirSlot, mySlot)) - { - if((theirSlot.stackSize) < getMaxStackSizeForDistribute()) - { + } else if (CustomToolHelper.areEqual(theirSlot, mySlot)) { + if ((theirSlot.stackSize) < getMaxStackSizeForDistribute()) { theirSlot.stackSize++; this.decrStackSize(a, 1); tile.setInventorySlotContents(a, theirSlot); @@ -85,259 +74,229 @@ else if(CustomToolHelper.areEqual(theirSlot, mySlot)) } } } - - private boolean canShare(ItemStack mySlot, int a) - { - if(a == 1)return isInput(mySlot); + + private boolean canShare(ItemStack mySlot, int a) { + if (a == 1) + return isInput(mySlot); return isCarbon(mySlot); } - public void updateBuild() - { + + public void updateBuild() { isBuilt = getIsBuilt(); } - protected boolean getIsBuilt() - { + + protected boolean getIsBuilt() { return (isFirebrick(-1, 0, 0) && isFirebrick(1, 0, 0) && isFirebrick(0, 0, -1) && isFirebrick(0, 0, 1)); } - protected boolean isFirebrick(int x, int y, int z) - { - Block block = worldObj.getBlock(xCoord+x, yCoord+y, zCoord+z); - if(block != null) - { + + protected boolean isFirebrick(int x, int y, int z) { + Block block = worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z); + if (block != null) { return block == BlockListMF.firebricks; } return false; } - protected boolean isAir(int x, int y, int z) - { - return !worldObj.isBlockNormalCubeDefault(xCoord+x, yCoord+y, zCoord+z, false); + + protected boolean isAir(int x, int y, int z) { + return !worldObj.isBlockNormalCubeDefault(xCoord + x, yCoord + y, zCoord + z, false); } - private int getMaxStackSizeForDistribute() - { + + private int getMaxStackSizeForDistribute() { return 1; } + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setInteger("fireTime", fireTime); nbt.setBoolean("isBuilt", isBuilt); nbt.setInteger("ticksExisted", ticksExisted); nbt.setInteger("StoredSmoke", smokeStorage); NBTTagList savedItems = new NBTTagList(); - for (int i = 0; i < this.items.length; ++i) - { - if (this.items[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.items[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } + for (int i = 0; i < this.items.length; ++i) { + if (this.items[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.items[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } - nbt.setTag("Items", savedItems); + nbt.setTag("Items", savedItems); } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + fireTime = nbt.getInteger("fireTime"); isBuilt = nbt.getBoolean("isBuilt"); ticksExisted = nbt.getInteger("ticksExisted"); smokeStorage = nbt.getInteger("StoredSmoke"); NBTTagList savedItems = nbt.getTagList("Items", 10); - this.items = new ItemStack[this.getSizeInventory()]; + this.items = new ItemStack[this.getSizeInventory()]; - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); - if (slotNum >= 0 && slotNum < this.items.length) - { - this.items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } + if (slotNum >= 0 && slotNum < this.items.length) { + this.items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } } - - //INVENTORY - public void onInventoryChanged() - { + + // INVENTORY + public void onInventoryChanged() { } - + @Override - public int getSizeInventory() - { + public int getSizeInventory() { return items.length; } @Override - public ItemStack getStackInSlot(int slot) - { + public ItemStack getStackInSlot(int slot) { return items[slot]; } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { onInventoryChanged(); - if (this.items[slot] != null) - { - ItemStack itemstack; - - if (this.items[slot].stackSize <= num) - { - itemstack = this.items[slot]; - this.items[slot] = null; - return itemstack; - } - else - { - itemstack = this.items[slot].splitStack(num); - - if (this.items[slot].stackSize == 0) - { - this.items[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } + if (this.items[slot] != null) { + ItemStack itemstack; + + if (this.items[slot].stackSize <= num) { + itemstack = this.items[slot]; + this.items[slot] = null; + return itemstack; + } else { + itemstack = this.items[slot].splitStack(num); + + if (this.items[slot].stackSize == 0) { + this.items[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } @Override - public ItemStack getStackInSlotOnClosing(int slot) - { + public ItemStack getStackInSlotOnClosing(int slot) { return items[slot]; } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { + public void setInventorySlotContents(int slot, ItemStack item) { onInventoryChanged(); items[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return "gui.bombcraftmf.name"; } @Override - public boolean hasCustomInventoryName() - { + public boolean hasCustomInventoryName() { return false; } @Override - public int getInventoryStackLimit() - { + public int getInventoryStackLimit() { return 64; } @Override - public boolean isUseableByPlayer(EntityPlayer user) - { - return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D; + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; } @Override - public void openInventory() - { + public void openInventory() { } @Override - public void closeInventory() - { + public void closeInventory() { } @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { - if(slot == 0) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (slot == 0) { return isCarbon(item); } return isInput(item); } - public static boolean isCarbon(ItemStack item) - { + + public static boolean isCarbon(ItemStack item) { return MineFantasyFuels.isCarbon(item); } - public static boolean isFlux(ItemStack item) - { + + public static boolean isFlux(ItemStack item) { return true; } - public static boolean isInput(ItemStack item) - { + + public static boolean isInput(ItemStack item) { return getResult(item) != null; } - protected static ItemStack getResult(ItemStack input) - { - if(BlastFurnaceRecipes.smelting().getSmeltingResult(input) != null) - { + + protected static ItemStack getResult(ItemStack input) { + if (BlastFurnaceRecipes.smelting().getSmeltingResult(input) != null) { return BlastFurnaceRecipes.smelting().getSmeltingResult(input).copy(); } return null; } + @Override - public int[] getAccessibleSlotsFromSide(int side) - { - return side == 1 ? new int[]{0, 1} : new int[]{}; + public int[] getAccessibleSlotsFromSide(int side) { + return side == 1 ? new int[] { 0, 1 } : new int[] {}; } + @Override - public boolean canInsertItem(int slot, ItemStack item, int side) - { + public boolean canInsertItem(int slot, ItemStack item, int side) { return isItemValidForSlot(slot, item); } + @Override - public boolean canExtractItem(int slot, ItemStack item, int side) - { + public boolean canExtractItem(int slot, ItemStack item, int side) { return false; } + @Override - public int getSmokeValue() - { + public int getSmokeValue() { return smokeStorage; } + @Override - public void setSmokeValue(int smoke) - { + public void setSmokeValue(int smoke) { smokeStorage = smoke; } + @Override - public int getMaxSmokeStorage() - { + public int getMaxSmokeStorage() { return 10; } + @Override - public boolean canAbsorbIndirect() - { + public boolean canAbsorbIndirect() { return false; } + public int tempUses; - public boolean shouldRemoveCarbon() - { - if(tempUses > 0) - { + + public boolean shouldRemoveCarbon() { + if (tempUses > 0) { --tempUses; MFLogUtil.logDebug("Decr Carbon Uses: " + tempUses); return false; - } - else - { + } else { int carb = MineFantasyFuels.getCarbon(getStackInSlot(0)) - 1; - if(carb > 0) - { + if (carb > 0) { tempUses = carb; MFLogUtil.logDebug("Set Carbon Uses: " + tempUses); } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFH.java b/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFH.java index e747ee2b..a8cf4bc7 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFH.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFH.java @@ -1,189 +1,159 @@ package minefantasy.mf2.block.tileentity.blastfurnace; import minefantasy.mf2.api.MineFantasyAPI; -import minefantasy.mf2.api.crafting.MineFantasyFuels; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.block.refining.BlockBFH; import minefantasy.mf2.block.tileentity.TileEntityCrucible; import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.entity.EntityFireBlast; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -public class TileEntityBlastFH extends TileEntityBlastFC -{ +public class TileEntityBlastFH extends TileEntityBlastFC { public int fuel; public int maxFuel; public float heat; public float progress; - + @Override - public void updateEntity() - { + public void updateEntity() { super.updateEntity(); - + boolean wasBurning = isBurning(); - if(fuel > 0) - { + if (fuel > 0) { --fuel; } - if(isBuilt && smokeStorage < getMaxSmokeStorage()) - { - if(fuel > 0) - { + if (isBuilt && smokeStorage < getMaxSmokeStorage()) { + if (fuel > 0) { ++progress; float maxProgress = getMaxProgress(); - if(progress >= maxProgress) - { + if (progress >= maxProgress) { progress -= maxProgress; smeltItem(); } - if(ticksExisted % 10 == 0) - { - smokeStorage+=2; + if (ticksExisted % 10 == 0) { + smokeStorage += 2; } - } - else if(!worldObj.isRemote) - { - if(isFuel(items[0])) - { + } else if (!worldObj.isRemote) { + if (isFuel(items[0])) { fuel = maxFuel = getItemBurnTime(items[0]); decrStackSize(0, 1); } } } - if(fireTime > 0) - { - if(fuel > 0)--fuel; + if (fireTime > 0) { + if (fuel > 0) + --fuel; smokeStorage++; fireTime--; - if(ticksExisted % 2 == 0) - shootFire(); - + if (ticksExisted % 2 == 0) + shootFire(); + + } + if (!worldObj.isRemote && wasBurning != isBurning()) { + BlockBFH.updateFurnaceBlockState(isBurning(), this.worldObj, this.xCoord, this.yCoord, this.zCoord); } - if (!worldObj.isRemote && wasBurning != isBurning()) - { - BlockBFH.updateFurnaceBlockState(isBurning(), this.worldObj, this.xCoord, this.yCoord, this.zCoord); - } } + public static float maxProgress = 1200; - private float getMaxProgress() - { + + private float getMaxProgress() { return maxProgress; } + public static int maxFurnaceHeight = 8; - private void smeltItem() - { - for(int y = 0; y < maxFurnaceHeight; y++) - { - TileEntity tileEntity = worldObj.getTileEntity(xCoord, yCoord+y+1, zCoord); - if(tileEntity != null && tileEntity instanceof TileEntityBlastFC && !(tileEntity instanceof TileEntityBlastFH)) - { - ItemStack result = getSmeltedResult((TileEntityBlastFC) tileEntity, y+1); - if(result != null) - { + + private void smeltItem() { + for (int y = 0; y < maxFurnaceHeight; y++) { + TileEntity tileEntity = worldObj.getTileEntity(xCoord, yCoord + y + 1, zCoord); + if (tileEntity != null && tileEntity instanceof TileEntityBlastFC + && !(tileEntity instanceof TileEntityBlastFH)) { + ItemStack result = getSmeltedResult((TileEntityBlastFC) tileEntity, y + 1); + if (result != null) { dropItem(result); } - } - else - { + } else { break; } } fireTime = 20; - worldObj.playSoundEffect(xCoord+0.5, yCoord+0.5, zCoord+0.5, "random.fizz", 2.0F, 0.5F); - worldObj.playSoundEffect(xCoord+0.5, yCoord+0.25, zCoord+0.5, "fire.fire", 1.0F, 0.75F); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 2.0F, 0.5F); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "fire.fire", 1.0F, 0.75F); startFire(1, 0, 0); startFire(-1, 0, 0); startFire(0, 0, 1); startFire(0, 0, -1); } - - private void dropItem(ItemStack result) - { - TileEntity under = worldObj.getTileEntity(xCoord, yCoord-1, zCoord); - if(under != null && under instanceof TileEntityCrucible) - { - TileEntityCrucible crucible = (TileEntityCrucible)under; - int slot = crucible.getSizeInventory()-1; + + private void dropItem(ItemStack result) { + TileEntity under = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (under != null && under instanceof TileEntityCrucible) { + TileEntityCrucible crucible = (TileEntityCrucible) under; + int slot = crucible.getSizeInventory() - 1; { - if(crucible.getStackInSlot(slot) == null) - { + if (crucible.getStackInSlot(slot) == null) { crucible.setInventorySlotContents(slot, result); return; - } - else if(CustomToolHelper.areEqual(crucible.getStackInSlot(slot), result)) - { - int freeSpace = crucible.getStackInSlot(slot).getMaxStackSize() - crucible.getStackInSlot(slot).stackSize; - if(freeSpace >= result.stackSize) - { + } else if (CustomToolHelper.areEqual(crucible.getStackInSlot(slot), result)) { + int freeSpace = crucible.getStackInSlot(slot).getMaxStackSize() + - crucible.getStackInSlot(slot).stackSize; + if (freeSpace >= result.stackSize) { crucible.getStackInSlot(slot).stackSize += result.stackSize; return; - } - else - { + } else { crucible.getStackInSlot(slot).stackSize += freeSpace; result.stackSize -= freeSpace; } } } } - if(result.stackSize <= 0)return; - - if(ConfigHardcore.HCCreduceIngots && rand.nextInt(3) == 0) - { - EntityItem entity = new EntityItem(worldObj, xCoord+0.5, yCoord+0.5, zCoord+0.5, result); + if (result.stackSize <= 0) + return; + + if (ConfigHardcore.HCCreduceIngots && rand.nextInt(3) == 0) { + EntityItem entity = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, result); worldObj.spawnEntityInWorld(entity); } } - private void startFire(int x, int y, int z) - { - if(!worldObj.isRemote && worldObj.isAirBlock(x, y, z)) - { - worldObj.setBlock(xCoord+x, yCoord+y, zCoord+z, Blocks.fire); + + private void startFire(int x, int y, int z) { + if (!worldObj.isRemote && worldObj.isAirBlock(x, y, z)) { + worldObj.setBlock(xCoord + x, yCoord + y, zCoord + z, Blocks.fire); } } - private void shootFire() - { - if(!worldObj.isRemote) - { + + private void shootFire() { + if (!worldObj.isRemote) { shootFire(-1, 0, 0); shootFire(1, 0, 0); shootFire(0, 0, -1); shootFire(0, 0, 1); } } - private void shootFire(int x, int y, int z) - { + + private void shootFire(int x, int y, int z) { double v = 0.125D; - EntityFireBlast fireball = new EntityFireBlast(worldObj, xCoord+0.5+x, yCoord, zCoord+0.5+z, (double)x*v, (double)y*v, (double)z*v); + EntityFireBlast fireball = new EntityFireBlast(worldObj, xCoord + 0.5 + x, yCoord, zCoord + 0.5 + z, x * v, + y * v, z * v); fireball.getEntityData().setString("Preset", "BlastFurnace"); fireball.modifySpeed(0.5F); worldObj.spawnEntityInWorld(fireball); } - - private ItemStack getSmeltedResult(TileEntityBlastFC shaft, int y) - { - if(shaft.getIsBuilt()) - { + + private ItemStack getSmeltedResult(TileEntityBlastFC shaft, int y) { + if (shaft.getIsBuilt()) { ItemStack input = shaft.getStackInSlot(1); - if(shaft.tempUses <=0 && shaft.getStackInSlot(0) == null || !isCarbon(shaft.getStackInSlot(0))) - { + if (shaft.tempUses <= 0 && shaft.getStackInSlot(0) == null || !isCarbon(shaft.getStackInSlot(0))) { return null; } - if(input != null) - { + if (input != null) { ItemStack result = getResult(input); - if(result != null) - { - for(int a = 0; a < shaft.getSizeInventory(); a++) - { - if(a > 0 || shaft.shouldRemoveCarbon()) - { + if (result != null) { + for (int a = 0; a < shaft.getSizeInventory(); a++) { + if (a > 0 || shaft.shouldRemoveCarbon()) { shaft.decrStackSize(a, 1); } } @@ -195,96 +165,89 @@ private ItemStack getSmeltedResult(TileEntityBlastFC shaft, int y) } @Override - protected void interact(TileEntityBlastFC tile) - { - + protected void interact(TileEntityBlastFC tile) { + } + @Override - public void updateBuild() - { + public void updateBuild() { isBuilt = getIsBuilt(); } + @Override - protected boolean getIsBuilt() - { - return (isFirebrick(-1, 0, -1) && isFirebrick(1, 0, -1) && isFirebrick(-1, 0, 1) && isFirebrick(1, 0, -1)) && (isAir(-1, 0, 0) && isAir(1, 0, 0) && isAir(0, 0, -1) && isAir(0, 0, 1)); + protected boolean getIsBuilt() { + return (isFirebrick(-1, 0, -1) && isFirebrick(1, 0, -1) && isFirebrick(-1, 0, 1) && isFirebrick(1, 0, -1)) + && (isAir(-1, 0, 0) && isAir(1, 0, 0) && isAir(0, 0, -1) && isAir(0, 0, 1)); } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setFloat("progress", progress); nbt.setInteger("fuel", fuel); nbt.setInteger("maxFuel", maxFuel); } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + progress = nbt.getFloat("progress"); fuel = nbt.getInteger("fuel"); maxFuel = nbt.getInteger("maxFuel"); } - public static boolean isFuel(ItemStack item) - { + + public static boolean isFuel(ItemStack item) { return getItemBurnTime(item) > 0; } + @Override - public int[] getAccessibleSlotsFromSide(int side) - { - return side > 0 ? new int[]{0} : new int[]{}; + public int[] getAccessibleSlotsFromSide(int side) { + return side > 0 ? new int[] { 0 } : new int[] {}; } + @Override - public boolean canInsertItem(int slot, ItemStack item, int side) - { + public boolean canInsertItem(int slot, ItemStack item, int side) { return side != 0 && isItemValidForSlot(slot, item); } + @Override - public boolean canExtractItem(int slot, ItemStack item, int side) - { + public boolean canExtractItem(int slot, ItemStack item, int side) { return false; } + @Override - public boolean isItemValidForSlot(int slot, ItemStack item) - { - if(slot == 0) - { + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (slot == 0) { return isFuel(item); } return false; } - - public static int getItemBurnTime(ItemStack fuel) - { - return MineFantasyAPI.getFuelValue(fuel)/4; - } - - public boolean isBurning() - { + + public static int getItemBurnTime(ItemStack fuel) { + return MineFantasyAPI.getFuelValue(fuel) / 4; + } + + public boolean isBurning() { return fuel > 0; } - public int getBurnTimeRemainingScaled(int i) - { - if (this.maxFuel <= 0) - { + public int getBurnTimeRemainingScaled(int i) { + if (this.maxFuel <= 0) { return 0; - } + } - return fuel * i / maxFuel; + return fuel * i / maxFuel; } - + @Override - public int getSizeInventory() - { + public int getSizeInventory() { return 1; } + @Override - public int getMaxSmokeStorage() - { + public int getMaxSmokeStorage() { return 10; } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java index 5008ce85..beaa0d97 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java @@ -18,53 +18,43 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.WorldServer; -public class TileEntityAmmoBox extends TileEntityWoodDecor implements IBasicMetre -{ + +public class TileEntityAmmoBox extends TileEntityWoodDecor implements IBasicMetre { public int angle, stock; public ItemStack ammo; private byte storageSize = -1; - - public TileEntityAmmoBox() - { + + public TileEntityAmmoBox() { super("ammo_box_basic", CustomMaterial.getMaterial("RefinedWood")); } - public TileEntityAmmoBox(String tex, CustomMaterial material, byte size) - { + + public TileEntityAmmoBox(String tex, CustomMaterial material, byte size) { super(tex, material); this.storageSize = size; } - - public boolean interact(EntityPlayer user, ItemStack held) - { - if(held != null) - { - if(this.getStorageType() == 1 && ammo != null && held.getItem() instanceof IFirearm && loadGun(held)) - { + + public boolean interact(EntityPlayer user, ItemStack held) { + if (held != null) { + if (this.getStorageType() == 1 && ammo != null && held.getItem() instanceof IFirearm && loadGun(held)) { open(); syncData(); return true; } - if(canAcceptItem(held)) - { + if (canAcceptItem(held)) { int max = this.getMaxAmmo(ammo != null ? ammo : held); - if(ammo == null) - { + if (ammo == null) { open(); placeInEmpty(user, held, max); - } - else if(areItemStacksEqual(held, ammo) && stock < max) - { + } else if (areItemStacksEqual(held, ammo) && stock < max) { open(); addToBox(user, held, max); } - + syncData(); return true; } return false; - } - else if(ammo != null) - { + } else if (ammo != null) { open(); takeStack(user, held); syncData(); @@ -73,216 +63,193 @@ else if(ammo != null) syncData(); return false; } - private boolean canAcceptItem(ItemStack held) - { - if(held.getItem() instanceof IStorageBlock) - { + + private boolean canAcceptItem(ItemStack held) { + if (held.getItem() instanceof IStorageBlock) { return false; } byte type = this.getStorageType(); - + return type == 0 ? isFood(held) : type == 1 ? held.getItem() instanceof IAmmo : type == 2; } - private boolean isFood(ItemStack held) - { - return held.getItem() instanceof ItemFood || held.getItem() instanceof ItemBandage || held.getItem() instanceof ItemSyringe; + + private boolean isFood(ItemStack held) { + return held.getItem() instanceof ItemFood || held.getItem() instanceof ItemBandage + || held.getItem() instanceof ItemSyringe; } - private boolean loadGun(ItemStack held) - { - IFirearm gun = (IFirearm)held.getItem(); - if(gun.canAcceptAmmo(held, getAmmoClass())) - { + + private boolean loadGun(ItemStack held) { + IFirearm gun = (IFirearm) held.getItem(); + if (gun.canAcceptAmmo(held, getAmmoClass())) { ItemStack loaded = AmmoMechanicsMF.getAmmo(held); - if(loaded == null) - { + if (loaded == null) { int ss = Math.min(ammo.getMaxStackSize(), stock); ItemStack newloaded = ammo.copy(); newloaded.stackSize = ss; AmmoMechanicsMF.setAmmo(held, newloaded); stock -= ss; - if(stock <= 0) - { + if (stock <= 0) { ammo = null; } return true; - } - else if(areItemStacksEqual(loaded, ammo)) - { + } else if (areItemStacksEqual(loaded, ammo)) { int room_left = loaded.getMaxStackSize() - loaded.stackSize; - if(stock > room_left) - { + if (stock > room_left) { stock -= room_left; loaded.stackSize += room_left; AmmoMechanicsMF.setAmmo(held, loaded); - } - else - { + } else { loaded.stackSize += stock; AmmoMechanicsMF.setAmmo(held, loaded); stock = 0; ammo = null; } - + return true; } } return false; } - private void addToBox(EntityPlayer user, ItemStack held, int max) - { + + private void addToBox(EntityPlayer user, ItemStack held, int max) { int room_left = max - stock; - if(held.stackSize <= room_left) - { + if (held.stackSize <= room_left) { stock += held.stackSize; user.setCurrentItemOrArmor(0, null); - } - else - { + } else { held.stackSize -= room_left; stock += room_left; } } - - private void takeStack(EntityPlayer user, ItemStack held) - { + + private void takeStack(EntityPlayer user, ItemStack held) { int ss = stock; ItemStack taken = ammo.copy(); - if(ss > taken.getMaxStackSize()) - { + if (ss > taken.getMaxStackSize()) { ss = taken.getMaxStackSize(); } taken.stackSize = ss; stock -= ss; user.setCurrentItemOrArmor(0, taken); - if(stock <= 0) - { + if (stock <= 0) { ammo = null; } } + /** * Place ammo in empty box */ - private void placeInEmpty(EntityPlayer user, ItemStack held, int max) - { + private void placeInEmpty(EntityPlayer user, ItemStack held, int max) { ammo = held.copy(); int ss = held.stackSize; - if(held.stackSize <= max)//Place all + if (held.stackSize <= max)// Place all { user.setCurrentItemOrArmor(0, null); - } - else //Fill as much + } else // Fill as much { stock = max; held.stackSize -= max; } stock = ss; } - private void open() - { + + private void open() { angle = 16; - this.worldObj.playSoundEffect((double)this.xCoord + 0.5D, (double)this.yCoord + 0.25D, (double)this.zCoord + 0.5D, "random.chestclosed", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 1.4F); + this.worldObj.playSoundEffect(this.xCoord + 0.5D, this.yCoord + 0.25D, this.zCoord + 0.5D, "random.chestclosed", + 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 1.4F); } + private int ticksExisted; - + @Override - public void updateEntity() - { + public void updateEntity() { ++ticksExisted; - if(ticksExisted == 20 || ticksExisted % 100 == 0) - { + if (ticksExisted == 20 || ticksExisted % 100 == 0) { syncData(); } - if(angle > 0)--angle; + if (angle > 0) + --angle; } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("stock", stock); - if(ammo != null) - { + if (ammo != null) { NBTTagCompound itemsave = new NBTTagCompound(); ammo.writeToNBT(itemsave); nbt.setTag("storage", itemsave); } } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); stock = nbt.getInteger("stock"); - if(nbt.hasKey("storage")) - { + if (nbt.hasKey("storage")) { NBTTagCompound itemsave = nbt.getCompoundTag("storage"); ammo = ItemStack.loadItemStackFromNBT(itemsave); } } - - public void syncData() - { - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + + public void syncData() { + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new AmmoBoxPacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new AmmoBoxPacket(this).generatePacket()); super.sendPacketToClient(player); } } - public int getMaxAmmo(ItemStack ammo) - { + + public int getMaxAmmo(ItemStack ammo) { return ammo.getMaxStackSize() * getCapacity(getMaterial().tier); } + @Override - public int getMetreScale(int size) - { - if(ammo != null) - { - return (int)Math.min(size, (float)size / (float)getMaxAmmo(ammo) * (float)stock); + public int getMetreScale(int size) { + if (ammo != null) { + return (int) Math.min(size, (float) size / (float) getMaxAmmo(ammo) * stock); } return 0; } + @Override public boolean shouldShowMetre() { return ammo != null; } + @Override - public String getLocalisedName() - { - if(ammo != null) - { + public String getLocalisedName() { + if (ammo != null) { return ammo.getDisplayName() + " x" + stock; } return ""; } - - private boolean areItemStacksEqual(ItemStack i1, ItemStack i2) - { - if(i1 == null || i2 == null)return false; - + + private boolean areItemStacksEqual(ItemStack i1, ItemStack i2) { + if (i1 == null || i2 == null) + return false; + return i1.isItemEqual(i2) && ItemStack.areItemStackTagsEqual(i1, i2); } - private String getAmmoClass() - { - if(ammo != null && ammo.getItem() instanceof IAmmo) - { - return ((IAmmo)ammo.getItem()).getAmmoType(ammo); + + private String getAmmoClass() { + if (ammo != null && ammo.getItem() instanceof IAmmo) { + return ((IAmmo) ammo.getItem()).getAmmoType(ammo); } return "null"; } - - public byte getStorageType() - { - if(worldObj != null) - { + + public byte getStorageType() { + if (worldObj != null) { Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - if(block instanceof BlockAmmoBox) - { - return ((BlockAmmoBox)block).storageType; + if (block instanceof BlockAmmoBox) { + return ((BlockAmmoBox) block).storageType; } } - return storageSize; + return storageSize; } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java index a96658b4..39ebf3b6 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java @@ -17,153 +17,135 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityRack extends TileEntityWoodDecor - implements IInventory -{ - private ItemStack inv[]; +public class TileEntityRack extends TileEntityWoodDecor implements IInventory { + private ItemStack inv[]; private int ticksExisted; - public TileEntityRack() - { - super("rack_wood"); - inv = new ItemStack[4]; - } - @Override - public int getSizeInventory() - { - return inv.length; - } - @Override - public ItemStack getStackInSlot(int i) - { - return inv[i]; - } - @Override - public ItemStack decrStackSize(int i, int j) - { - if (inv[i] != null) - { - if (inv[i].stackSize <= j) - { - ItemStack itemstack = inv[i]; - inv[i] = null; - syncItems(); - return itemstack; - } - ItemStack itemstack1 = inv[i].splitStack(j); - if (inv[i].stackSize == 0) - { - inv[i] = null; - } - syncItems(); - return itemstack1; - } - else - { - syncItems(); - updateInventory(); - return null; - } - } - @Override - public void setInventorySlotContents(int i, ItemStack itemstack) - { - inv[i] = itemstack; - updateInventory(); - syncItems(); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) - { - super.readFromNBT(nbt); - - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) - { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) - { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) - { - super.writeToNBT(nbt); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inv.length; ++i) - { - if (this.inv[i] != null) - { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte)i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - } - - @Override - public int getInventoryStackLimit() - { - return 64; - } - @Override - public void updateEntity() - { - ++ticksExisted; - if(ticksExisted == 10 || ticksExisted % 50 == 0) - { - syncItems(); - } - } - - - public void syncItems() - { - if(!worldObj.isRemote) - { - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { - EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new TileInventoryPacket(this, this).generatePacket()); - super.sendPacketToClient(player); - } - } + public TileEntityRack() { + super("rack_wood"); + inv = new ItemStack[4]; + } + + @Override + public int getSizeInventory() { + return inv.length; + } + + @Override + public ItemStack getStackInSlot(int i) { + return inv[i]; + } + + @Override + public ItemStack decrStackSize(int i, int j) { + if (inv[i] != null) { + if (inv[i].stackSize <= j) { + ItemStack itemstack = inv[i]; + inv[i] = null; + syncItems(); + return itemstack; + } + ItemStack itemstack1 = inv[i].splitStack(j); + if (inv[i].stackSize == 0) { + inv[i] = null; + } + syncItems(); + return itemstack1; + } else { + syncItems(); + updateInventory(); + return null; + } + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemstack) { + inv[i] = itemstack; + updateInventory(); + syncItems(); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public void updateEntity() { + ++ticksExisted; + if (ticksExisted == 10 || ticksExisted % 50 == 0) { + syncItems(); + } + } + + public void syncItems() { + if (!worldObj.isRemote) { + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { + EntityPlayer player = players.get(i); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, + new TileInventoryPacket(this, this).generatePacket()); + super.sendPacketToClient(player); + } + } + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) { + if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { + return false; + } + return entityplayer.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64D; + } + + @Override + public ItemStack getStackInSlotOnClosing(int var1) { + return null; } - @Override - public boolean isUseableByPlayer(EntityPlayer entityplayer) - { - if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { - return false; - } - return entityplayer.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64D; - } - - @Override - public ItemStack getStackInSlotOnClosing(int var1) { - return null; - } private int getEnchantment(int i) { ItemStack is = this.getStackInSlot(i); - if(is == null)return 0; - - if(is.isItemEnchanted())return 1; - + if (is == null) + return 0; + + if (is.isItemEnchanted()) + return 1; + return 0; } @@ -171,24 +153,20 @@ private int getEnchantment(int i) { public boolean isItemValidForSlot(int i, ItemStack itemstack) { return false; } + /* - * North: WEST: 0=2 - * South: SOUTH: 1=1 - * West: EAST: 2=3 - * East: NORTH: 3=0 + * North: WEST: 0=2 South: SOUTH: 1=1 West: EAST: 2=3 East: NORTH: 3=0 */ - public int getSlotFor(float x, float y) - { - int direction =worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + public int getSlotFor(float x, float y) { + int direction = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); ForgeDirection FD = ForgeDirection.getOrientation(direction); - float offset = 1F/16F; - + float offset = 1F / 16F; + float x1 = 0.0F + offset; float x2 = 1.0F - offset; float y1 = 0.0F; float y2 = 1.0F; - if(FD == ForgeDirection.EAST || FD == ForgeDirection.WEST) - { + if (FD == ForgeDirection.EAST || FD == ForgeDirection.WEST) { x1 = 0.0F; x2 = 1.0F; y1 = 0.0F + offset; @@ -196,30 +174,27 @@ public int getSlotFor(float x, float y) } int[] coord = BlockPositionHelper.getCoordsFor(x, y, x1, x2, y1, y2, 4, 4, direction); - if(coord == null) - { + if (coord == null) { return -1; } return coord[0]; - + } - public boolean canHang(ItemStack item, int slot) - { - if(item == null || item.getItem() == null) - { + public boolean canHang(ItemStack item, int slot) { + if (item == null || item.getItem() == null) { return false; } - if(item.getItem() instanceof ItemBlock) - { + if (item.getItem() instanceof ItemBlock) { return false; } - if(item.getItem() instanceof IRackItem) - { - return ((IRackItem)item.getItem()).canHang(this, item, slot); + if (item.getItem() instanceof IRackItem) { + return ((IRackItem) item.getItem()).canHang(this, item, slot); } - if(item.getItem() instanceof ItemArmor)return false; - //if(item.getItem() instanceof ItemCrossbow || item.getItem() instanceof ItemBomb || item.getItem() instanceof ItemMine)return false; + if (item.getItem() instanceof ItemArmor) + return false; + // if(item.getItem() instanceof ItemCrossbow || item.getItem() instanceof + // ItemBomb || item.getItem() instanceof ItemMine)return false; return item.getItem().isItemTool(item); } @@ -235,32 +210,29 @@ public boolean hasCustomInventoryName() { @Override public void openInventory() { - + } @Override public void closeInventory() { } - public boolean hasRackAbove(int slot) - { - TileEntity side = worldObj.getTileEntity(xCoord, yCoord+1, zCoord); + + public boolean hasRackAbove(int slot) { + TileEntity side = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); return side != null && side instanceof TileEntityRack;// && ((TileEntityRack)side).getStackInSlot(slot) == null; } - public boolean hasRackBelow(int slot) - { - TileEntity side = worldObj.getTileEntity(xCoord, yCoord-1, zCoord); + + public boolean hasRackBelow(int slot) { + TileEntity side = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); return side != null && side instanceof TileEntityRack;// && ((TileEntityRack)side).getStackInSlot(slot) == null; } - public void updateInventory() - { - if(!worldObj.isRemote) - { - for(int x = 0; x < getSizeInventory(); x++) - { + + public void updateInventory() { + if (!worldObj.isRemote) { + for (int x = 0; x < getSizeInventory(); x++) { ItemStack item = this.getStackInSlot(x); - if(item != null && !canHang(item, x)) - { - EntityItem drop = new EntityItem(worldObj, xCoord+0.5, yCoord+0.5, zCoord+0.5, item); + if (item != null && !canHang(item, x)) { + EntityItem drop = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, item); worldObj.spawnEntityInWorld(drop); setInventorySlotContents(x, null); } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java index 44c24bb7..752b0fef 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java @@ -3,151 +3,130 @@ import java.util.List; import minefantasy.mf2.api.heating.IQuenchBlock; -import minefantasy.mf2.block.decor.BlockTrough; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.network.packet.TroughPacket; -import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.WorldServer; -public class TileEntityTrough extends TileEntityWoodDecor implements IQuenchBlock -{ + +public class TileEntityTrough extends TileEntityWoodDecor implements IQuenchBlock { public int fill; - - public TileEntityTrough() - { + + public TileEntityTrough() { super("trough_wood"); } + @Override - public float quench() - { - if(fill > 0) - { + public float quench() { + if (fill > 0) { --fill; return 0F; } return -1F; } - - public boolean interact(EntityPlayer user, ItemStack held) - { - if(held != null) - { - int glass_bottle = 1, - jug = 1, - bucket = 16; - if(fill < getCapacity())//Give + + public boolean interact(EntityPlayer user, ItemStack held) { + if (held != null) { + int glass_bottle = 1, jug = 1, bucket = 16; + if (fill < getCapacity())// Give { - if(held.getItem() == Items.water_bucket) - { + if (held.getItem() == Items.water_bucket) { user.setCurrentItemOrArmor(0, new ItemStack(Items.bucket)); addCapacity(bucket); return true; } - if(held.getItem() == FoodListMF.jug_water) - { + if (held.getItem() == FoodListMF.jug_water) { givePlayerItem(user, held, new ItemStack(FoodListMF.jug_empty)); addCapacity(jug); return true; } - if(held.getItem() == Items.potionitem && held.getItemDamage() == 0) - { + if (held.getItem() == Items.potionitem && held.getItemDamage() == 0) { givePlayerItem(user, held, new ItemStack(Items.glass_bottle)); addCapacity(glass_bottle); return true; } } - - - //Take - if(fill >=1 && held.getItem() == Items.glass_bottle && held.getItemDamage() == 0) - { + + // Take + if (fill >= 1 && held.getItem() == Items.glass_bottle && held.getItemDamage() == 0) { givePlayerItem(user, held, new ItemStack(Items.potionitem)); addCapacity(-glass_bottle); return true; } - if(fill >=16 && held.getItem() == Items.bucket) - { + if (fill >= 16 && held.getItem() == Items.bucket) { givePlayerItem(user, held, new ItemStack(Items.water_bucket)); addCapacity(-bucket); return true; } - + } return false; } - private void givePlayerItem(EntityPlayer user, ItemStack held, ItemStack jug) - { - if(held.stackSize == 1) - { + + private void givePlayerItem(EntityPlayer user, ItemStack held, ItemStack jug) { + if (held.stackSize == 1) { user.setCurrentItemOrArmor(0, jug); return; } - + --held.stackSize; - if(!user.inventory.addItemStackToInventory(jug)) - { - if(!user.worldObj.isRemote) - { + if (!user.inventory.addItemStackToInventory(jug)) { + if (!user.worldObj.isRemote) { user.entityDropItem(jug, 0F); } } } - + private int ticksExisted; - + @Override - public void updateEntity() - { + public void updateEntity() { ++ticksExisted; - if(ticksExisted == 20 || ticksExisted % 100 == 0) - { + if (ticksExisted == 20 || ticksExisted % 100 == 0) { syncData(); } - if(ticksExisted % 100 == 0 && worldObj.canLightningStrikeAt(xCoord, yCoord+1, zCoord)) - { + if (ticksExisted % 100 == 0 && worldObj.canLightningStrikeAt(xCoord, yCoord + 1, zCoord)) { addCapacity(1); } } - + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("fill", fill); } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); fill = nbt.getInteger("fill"); } - private void addCapacity(int i) - { + + private void addCapacity(int i) { int cap = getCapacity(); - fill = Math.min(cap, fill+i); + fill = Math.min(cap, fill + i); syncData(); } + public static int capacityScale = 8; + @Override - public int getCapacity() - { + public int getCapacity() { return super.getCapacity() * capacityScale; } - public void syncData() - { - if(worldObj.isRemote)return; - - List players = ((WorldServer)worldObj).playerEntities; - for(int i = 0; i < players.size(); i++) - { + public void syncData() { + if (worldObj.isRemote) + return; + + List players = ((WorldServer) worldObj).playerEntities; + for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new TroughPacket(this).generatePacket()); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new TroughPacket(this).generatePacket()); super.sendPacketToClient(player); } } - + } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java index a6681055..722419e3 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java @@ -9,86 +9,75 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; -public abstract class TileEntityWoodDecor extends TileEntity -{ +public abstract class TileEntityWoodDecor extends TileEntity { private String tex; private CustomMaterial material; - - public TileEntityWoodDecor(String tex) - { + + public TileEntityWoodDecor(String tex) { this.tex = tex; this.material = CustomMaterial.getMaterial("RefinedWood"); } - - public TileEntityWoodDecor(String tex, CustomMaterial material) - { + + public TileEntityWoodDecor(String tex, CustomMaterial material) { this.tex = tex; this.material = material; } - - public CustomMaterial getMaterial() - { + + public CustomMaterial getMaterial() { return this.material != null ? this.material : trySetMaterial("RefinedWood"); } - public String getMaterialName() - { + + public String getMaterialName() { return this.material != null ? material.name : "RefinedWood"; } - public void setMaterial(CustomMaterial material) - { + + public void setMaterial(CustomMaterial material) { this.material = material; } - public CustomMaterial trySetMaterial(String materialName) - { + + public CustomMaterial trySetMaterial(String materialName) { CustomMaterial material = CustomMaterial.getMaterial(materialName); - if(material != null) - { + if (material != null) { this.material = material; } return this.material; } + @Override - public void writeToNBT(NBTTagCompound nbt) - { + public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setString("Material", this.getMaterialName()); } + @Override - public void readFromNBT(NBTTagCompound nbt) - { + public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.trySetMaterial(nbt.getString("Material")); } - public int getCapacity() - { + public int getCapacity() { CustomMaterial material = getMaterial(); - if(material != null) - { + if (material != null) { return getCapacity(material.tier); } return getCapacity(0); } - public static int getCapacity(int tier) - { - return (tier)*4 + 4; + + public static int getCapacity(int tier) { + return (tier) * 4 + 4; } - public String getTexName() - { - if(worldObj != null) - { + public String getTexName() { + if (worldObj != null) { Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - if(block instanceof BlockWoodDecor) - { - this.tex = ((BlockWoodDecor)block).getFullTexName(); + if (block instanceof BlockWoodDecor) { + this.tex = ((BlockWoodDecor) block).getFullTexName(); } } return tex; } - public void sendPacketToClient(EntityPlayer player) - { - ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new WoodDecorPacket(this).generatePacket()); + public void sendPacketToClient(EntityPlayer player) { + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new WoodDecorPacket(this).generatePacket()); } } diff --git a/src/main/java/minefantasy/mf2/block/tree/BlockLeavesMF.java b/src/main/java/minefantasy/mf2/block/tree/BlockLeavesMF.java index 7a9e9066..3d80657b 100644 --- a/src/main/java/minefantasy/mf2/block/tree/BlockLeavesMF.java +++ b/src/main/java/minefantasy/mf2/block/tree/BlockLeavesMF.java @@ -2,6 +2,9 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.list.BlockListMF; import net.minecraft.block.Block; import net.minecraft.block.BlockLeaves; @@ -12,93 +15,84 @@ import net.minecraft.world.ColorizerFoliage; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.IShearable; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockLeavesMF extends BlockLeaves implements IShearable -{ +public class BlockLeavesMF extends BlockLeaves implements IShearable { private String name; private Block sapling; private int dropRate; - public BlockLeavesMF(String baseWood) - { - this(baseWood, 20); - } - public BlockLeavesMF(String baseWood, int droprate) - { - this.name = baseWood.toLowerCase() + "_leaves"; + + public BlockLeavesMF(String baseWood) { + this(baseWood, 20); + } + + public BlockLeavesMF(String baseWood, int droprate) { + this.name = baseWood.toLowerCase() + "_leaves"; GameRegistry.registerBlock(this, name); this.dropRate = droprate; this.setTickRandomly(true); this.setBlockName(name); - this.setBlockTextureName("minefantasy2:tree/"+name); - } - - @SideOnly(Side.CLIENT) - @Override - public int getRenderColor(int id) - { - return ColorizerFoliage.getFoliageColorBasic(); - } - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) - { - return Blocks.leaves.shouldSideBeRendered(world, x, y, z, side); - } - @Override - public boolean isOpaqueCube() - { - return Blocks.leaves.isOpaqueCube(); - } - - @Override - public int quantityDropped(Random rand) - { - return 1; - } + this.setBlockTextureName("minefantasy2:tree/" + name); + } + + @SideOnly(Side.CLIENT) + @Override + public int getRenderColor(int id) { + return ColorizerFoliage.getFoliageColorBasic(); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return Blocks.leaves.shouldSideBeRendered(world, x, y, z, side); + } + + @Override + public boolean isOpaqueCube() { + return Blocks.leaves.isOpaqueCube(); + } @Override - public Item getItemDropped(int meta, Random rand, int fort) - { - return Item.getItemFromBlock(getBlockDrop()); - } + public int quantityDropped(Random rand) { + return 1; + } @Override - protected int func_150123_b(int meta) - { - return meta == 15 ? dropRate*2 : dropRate; - } - - private Block getBlockDrop() - { - return this == BlockListMF.leaves_ebony ? BlockListMF.sapling_ebony : this == BlockListMF.leaves_ironbark ? BlockListMF.sapling_ironbark : BlockListMF.sapling_yew; + public Item getItemDropped(int meta, Random rand, int fort) { + return Item.getItemFromBlock(getBlockDrop()); } + + @Override + protected int func_150123_b(int meta) { + return meta == 15 ? dropRate * 2 : dropRate; + } + + private Block getBlockDrop() { + return this == BlockListMF.leaves_ebony ? BlockListMF.sapling_ebony + : this == BlockListMF.leaves_ironbark ? BlockListMF.sapling_ironbark : BlockListMF.sapling_yew; + } + @Override - public int damageDropped(int meta) - { - return 0; - } - + public int damageDropped(int meta) { + return 0; + } + @SideOnly(Side.CLIENT) private IIcon opaque_icon; - - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) - { - return Blocks.leaves.isOpaqueCube() ? opaque_icon : blockIcon; - } + + @SideOnly(Side.CLIENT) @Override - public String[] func_150125_e() - { - return new String[]{""}; + public IIcon getIcon(int side, int meta) { + return Blocks.leaves.isOpaqueCube() ? opaque_icon : blockIcon; } + + @Override + public String[] func_150125_e() { + return new String[] { "" }; + } + @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister reg) - { + public void registerBlockIcons(IIconRegister reg) { super.registerBlockIcons(reg); - this.opaque_icon = reg.registerIcon(this.getTextureName()+"_opaque"); - } + this.opaque_icon = reg.registerIcon(this.getTextureName() + "_opaque"); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/tree/BlockLogMF.java b/src/main/java/minefantasy/mf2/block/tree/BlockLogMF.java index 413bea24..60ce2fb1 100644 --- a/src/main/java/minefantasy/mf2/block/tree/BlockLogMF.java +++ b/src/main/java/minefantasy/mf2/block/tree/BlockLogMF.java @@ -2,6 +2,9 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.list.BlockListMF; import net.minecraft.block.Block; import net.minecraft.block.BlockLog; @@ -11,83 +14,74 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockLogMF extends BlockLog -{ +public class BlockLogMF extends BlockLog { private IIcon sideTex, topTex; private String name; - - public BlockLogMF(String baseWood) - { + + public BlockLogMF(String baseWood) { name = baseWood.toLowerCase() + "_log"; GameRegistry.registerBlock(this, name); setBlockName(name); this.setHarvestLevel("axe", 0); this.setCreativeTab(CreativeTabs.tabBlock); } - + @SideOnly(Side.CLIENT) @Override - public IIcon getIcon(int side, int meta) - { - if(meta == 15) - { + public IIcon getIcon(int side, int meta) { + if (meta == 15) { return side <= 1 ? topTex : sideTex; } return super.getIcon(side, meta); - } - + } + @SideOnly(Side.CLIENT) @Override - protected IIcon getSideIcon(int meta) - { + protected IIcon getSideIcon(int meta) { return sideTex; - } + } + + @SideOnly(Side.CLIENT) + @Override + protected IIcon getTopIcon(int meta) { + return topTex; + } - @SideOnly(Side.CLIENT) - @Override - protected IIcon getTopIcon(int meta) - { - return topTex; - } - @Override + @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) - { - sideTex = reg.registerIcon("minefantasy2:tree/"+name+"_side"); - topTex = reg.registerIcon("minefantasy2:tree/"+name+"_top"); - } - - private Block getSaplingDrop() - { - return this == BlockListMF.log_ebony ? BlockListMF.sapling_ebony : this == BlockListMF.log_ironbark ? BlockListMF.sapling_ironbark : BlockListMF.sapling_yew; + public void registerBlockIcons(IIconRegister reg) { + sideTex = reg.registerIcon("minefantasy2:tree/" + name + "_side"); + topTex = reg.registerIcon("minefantasy2:tree/" + name + "_top"); + } + + private Block getSaplingDrop() { + return this == BlockListMF.log_ebony ? BlockListMF.sapling_ebony + : this == BlockListMF.log_ironbark ? BlockListMF.sapling_ironbark : BlockListMF.sapling_yew; + } + + private Random rand = new Random(); + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + super.breakBlock(world, x, y, z, block, meta); + if (meta == 15) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(getSaplingDrop(), 1)); + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + + @Override + public int damageDropped(int meta) { + return 0; } - private Random rand = new Random(); - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) - { - super.breakBlock(world, x, y, z, block, meta); - if(meta == 15) - { - float f = this.rand .nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(getSaplingDrop(), 1)); - - float f3 = 0.05F; - entityitem.motionX = (float)this.rand.nextGaussian() * f3; - entityitem.motionY = (float)this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - @Override - public int damageDropped(int meta) - { - return 0; - } } diff --git a/src/main/java/minefantasy/mf2/block/tree/BlockSaplingMF.java b/src/main/java/minefantasy/mf2/block/tree/BlockSaplingMF.java index fbe65fda..bda393ab 100644 --- a/src/main/java/minefantasy/mf2/block/tree/BlockSaplingMF.java +++ b/src/main/java/minefantasy/mf2/block/tree/BlockSaplingMF.java @@ -1,8 +1,8 @@ package minefantasy.mf2.block.tree; -import java.util.List; import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.mechanics.worldGen.WorldGenMFTree; import net.minecraft.block.Block; import net.minecraft.block.BlockBush; @@ -10,129 +10,104 @@ import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenCanopyTree; -import net.minecraft.world.gen.feature.WorldGenForest; -import net.minecraft.world.gen.feature.WorldGenMegaJungle; -import net.minecraft.world.gen.feature.WorldGenMegaPineTree; -import net.minecraft.world.gen.feature.WorldGenSavannaTree; -import net.minecraft.world.gen.feature.WorldGenTaiga2; -import net.minecraft.world.gen.feature.WorldGenTrees; import net.minecraft.world.gen.feature.WorldGenerator; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class BlockSaplingMF extends BlockBush implements IGrowable -{ +public class BlockSaplingMF extends BlockBush implements IGrowable { private final Block log, leaves; private float growthModifier; private String name; - - public BlockSaplingMF(String baseWood, Block log, Block leaves, float growthModifier) - { - super(Material.plants); - setStepSound(Block.soundTypeGrass); - float f = 0.4F; - this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f); - this.setCreativeTab(CreativeTabs.tabDecorations); - this.growthModifier = growthModifier; - name = baseWood.toLowerCase() + "_sapling"; - this.log = log; - this.leaves = leaves; - - setBlockTextureName("minefantasy2:tree/"+name); - GameRegistry.registerBlock(this, name); + + public BlockSaplingMF(String baseWood, Block log, Block leaves, float growthModifier) { + super(Material.plants); + setStepSound(Block.soundTypeGrass); + float f = 0.4F; + this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f); + this.setCreativeTab(CreativeTabs.tabDecorations); + this.growthModifier = growthModifier; + name = baseWood.toLowerCase() + "_sapling"; + this.log = log; + this.leaves = leaves; + + setBlockTextureName("minefantasy2:tree/" + name); + GameRegistry.registerBlock(this, name); setBlockName(name); - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random rand) - { - if (!world.isRemote) - { - super.updateTick(world, x, y, z, rand); - - if (world.getBlockLightValue(x, y + 1, z) >= 9 && rand.nextFloat()*100F < (14.30F)/growthModifier) - { - this.initGrow(world, x, y, z, rand); - } - } - } - - public void initGrow(World world, int x, int y, int z, Random rand) - { - int l = world.getBlockMetadata(x, y, z); - - if ((l & 8) == 0) - { - world.setBlockMetadataWithNotify(x, y, z, l | 8, 4); - } - else - { - this.tryGrow(world, x, y, z, rand); - } - } - - public void tryGrow(World world, int x, int y, int z, Random rand) - { - if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, rand, x, y, z)) return; - int l = world.getBlockMetadata(x, y, z) & 7; - Object treegen = new WorldGenMFTree(true, log, leaves); - int i1 = 0; - int j1 = 0; - boolean flag = false; - - Block block = Blocks.air; - world.setBlock(x, y, z, block, 0, 4); - - if (!((WorldGenerator)treegen).generate(world, rand, x + i1, y, z + j1)) - { - if (flag) - { - world.setBlock(x + i1, y, z + j1, this, l, 4); - world.setBlock(x + i1 + 1, y, z + j1, this, l, 4); - world.setBlock(x + i1, y, z + j1 + 1, this, l, 4); - world.setBlock(x + i1 + 1, y, z + j1 + 1, this, l, 4); - } - else - { - world.setBlock(x, y, z, this, l, 4); - } - } - } - - public boolean func_149880_a(World p_149880_1_, int p_149880_2_, int p_149880_3_, int p_149880_4_, int p_149880_5_) - { - return p_149880_1_.getBlock(p_149880_2_, p_149880_3_, p_149880_4_) == this && (p_149880_1_.getBlockMetadata(p_149880_2_, p_149880_3_, p_149880_4_) & 7) == p_149880_5_; - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - public int damageDropped(int p_149692_1_) - { - return MathHelper.clamp_int(p_149692_1_ & 7, 0, 5); - } - - public boolean func_149851_a(World p_149851_1_, int p_149851_2_, int p_149851_3_, int p_149851_4_, boolean p_149851_5_) - { - return true; - } - - public boolean func_149852_a(World p_149852_1_, Random p_149852_2_, int p_149852_3_, int p_149852_4_, int p_149852_5_) - { - return (double)p_149852_1_.rand.nextFloat() < (0.45D)/growthModifier; - } - - public void func_149853_b(World p_149853_1_, Random p_149853_2_, int p_149853_3_, int p_149853_4_, int p_149853_5_) - { - this.initGrow(p_149853_1_, p_149853_3_, p_149853_4_, p_149853_5_, p_149853_2_); - } + } + + /** + * Ticks the block if it's been scheduled + */ + @Override + public void updateTick(World world, int x, int y, int z, Random rand) { + if (!world.isRemote) { + super.updateTick(world, x, y, z, rand); + + if (world.getBlockLightValue(x, y + 1, z) >= 9 && rand.nextFloat() * 100F < (14.30F) / growthModifier) { + this.initGrow(world, x, y, z, rand); + } + } + } + + public void initGrow(World world, int x, int y, int z, Random rand) { + int l = world.getBlockMetadata(x, y, z); + + if ((l & 8) == 0) { + world.setBlockMetadataWithNotify(x, y, z, l | 8, 4); + } else { + this.tryGrow(world, x, y, z, rand); + } + } + + public void tryGrow(World world, int x, int y, int z, Random rand) { + if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, rand, x, y, z)) + return; + int l = world.getBlockMetadata(x, y, z) & 7; + Object treegen = new WorldGenMFTree(true, log, leaves); + int i1 = 0; + int j1 = 0; + boolean flag = false; + + Block block = Blocks.air; + world.setBlock(x, y, z, block, 0, 4); + + if (!((WorldGenerator) treegen).generate(world, rand, x + i1, y, z + j1)) { + if (flag) { + world.setBlock(x + i1, y, z + j1, this, l, 4); + world.setBlock(x + i1 + 1, y, z + j1, this, l, 4); + world.setBlock(x + i1, y, z + j1 + 1, this, l, 4); + world.setBlock(x + i1 + 1, y, z + j1 + 1, this, l, 4); + } else { + world.setBlock(x, y, z, this, l, 4); + } + } + } + + public boolean func_149880_a(World p_149880_1_, int p_149880_2_, int p_149880_3_, int p_149880_4_, + int p_149880_5_) { + return p_149880_1_.getBlock(p_149880_2_, p_149880_3_, p_149880_4_) == this + && (p_149880_1_.getBlockMetadata(p_149880_2_, p_149880_3_, p_149880_4_) & 7) == p_149880_5_; + } + + /** + * Determines the damage on the item the block drops. Used in cloth and wood. + */ + public int damageDropped(int p_149692_1_) { + return MathHelper.clamp_int(p_149692_1_ & 7, 0, 5); + } + + public boolean func_149851_a(World p_149851_1_, int p_149851_2_, int p_149851_3_, int p_149851_4_, + boolean p_149851_5_) { + return true; + } + + public boolean func_149852_a(World p_149852_1_, Random p_149852_2_, int p_149852_3_, int p_149852_4_, + int p_149852_5_) { + return p_149852_1_.rand.nextFloat() < (0.45D) / growthModifier; + } + + public void func_149853_b(World p_149853_1_, Random p_149853_2_, int p_149853_3_, int p_149853_4_, + int p_149853_5_) { + this.initGrow(p_149853_1_, p_149853_3_, p_149853_4_, p_149853_5_, p_149853_2_); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/FontHelper.java b/src/main/java/minefantasy/mf2/client/FontHelper.java index a2e0a6d9..46cc4937 100644 --- a/src/main/java/minefantasy/mf2/client/FontHelper.java +++ b/src/main/java/minefantasy/mf2/client/FontHelper.java @@ -2,18 +2,15 @@ public final class FontHelper { - public static boolean isFormatColour(char colour) - { + public static boolean isFormatColour(char colour) { return colour >= 48 && colour <= 57 || colour >= 97 && colour <= 102 || colour >= 65 && colour <= 70; } - public static boolean isFormatSpecial(char chars) - { + public static boolean isFormatSpecial(char chars) { return chars >= 107 && chars <= 111 || chars >= 75 && chars <= 79 || chars == 114 || chars == 82; } - public static String getFormatFromString(String string) - { + public static String getFormatFromString(String string) { String s1 = ""; int i = -1; int j = string.length(); diff --git a/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java b/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java index 80fc9682..09618a1d 100644 --- a/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java +++ b/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java @@ -1,80 +1,166 @@ package minefantasy.mf2.client; -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import minefantasy.mf2.api.knowledge.client.*; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import minefantasy.mf2.api.knowledge.client.EntryPage; +import minefantasy.mf2.api.knowledge.client.EntryPageBlastFurnace; +import minefantasy.mf2.api.knowledge.client.EntryPageCrucible; +import minefantasy.mf2.api.knowledge.client.EntryPageGrind; +import minefantasy.mf2.api.knowledge.client.EntryPageImage; +import minefantasy.mf2.api.knowledge.client.EntryPageRecipeAnvil; +import minefantasy.mf2.api.knowledge.client.EntryPageRecipeBase; +import minefantasy.mf2.api.knowledge.client.EntryPageRecipeBloom; +import minefantasy.mf2.api.knowledge.client.EntryPageRecipeCarpenter; +import minefantasy.mf2.api.knowledge.client.EntryPageSmelting; +import minefantasy.mf2.api.knowledge.client.EntryPageText; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.knowledge.KnowledgeListMF; -import minefantasy.mf2.material.MetalMaterial; -import minefantasy.mf2.recipe.ForgedToolRecipes; import minefantasy.mf2.recipe.ForgingRecipes; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; @SideOnly(Side.CLIENT) -public class KnowledgePageRegistry -{ - public static void registerPages() - { +public class KnowledgePageRegistry { + public static void registerPages() { ItemStack pigiron = ComponentListMF.bar("PigIron"); ItemStack black = ComponentListMF.bar("BlackSteel"); ItemStack red = ComponentListMF.bar("RedSteel"); ItemStack blue = ComponentListMF.bar("BlueSteel"); - if(ConfigHardcore.HCCallowRocks) - { - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.hcc"), new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.dirtRockR), new EntryPageRecipeCarpenter(KnowledgeListMF.stonePickR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), new EntryPageRecipeCarpenter(KnowledgeListMF.sharpRocksR)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpearR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAxeR)); + if (ConfigHardcore.HCCallowRocks) { + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.hcc"), + new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.dirtRockR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stonePickR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), + new EntryPageRecipeCarpenter(KnowledgeListMF.sharpRocksR)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpearR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAxeR)); } - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.1"), new EntryPageText("knowledge.gettingStarted.2")); - - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.carpenter"), new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.fire"), new EntryPageRecipeBase(KnowledgeListMF.firepitRecipe), new EntryPageRecipeBase(KnowledgeListMF.dryrocksR)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.food"), new EntryPageRecipeBase(KnowledgeListMF.cooktopRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneovenRecipe)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.tanning"), new EntryPageRecipeCarpenter(KnowledgeListMF.tannerRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.forging"), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAnvilRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.forgeRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), new EntryPageRecipeBase(KnowledgeListMF.dryrocksR), new EntryPageRecipeCarpenter(KnowledgeListMF.apronRecipe)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.forgingbars"), new EntryPageRecipeAnvil(KnowledgeListMF.barR)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.flux"), new EntryPageRecipeAnvil(KnowledgeListMF.fluxR)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.3"), new EntryPageRecipeAnvil(KnowledgeListMF.shearsR), new EntryPageText("knowledge.gettingStarted.4"), new EntryPageText("knowledge.gettingStarted.5"), new EntryPageRecipeAnvil(KnowledgeListMF.hammerR), new EntryPageRecipeAnvil(KnowledgeListMF.tongsR), new EntryPageText("knowledge.gettingStarted.6")); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.upgrade"), new EntryPageRecipeCarpenter(KnowledgeListMF.researchTableRecipe), new EntryPageText("knowledge.gettingStarted.7")); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.10"), new EntryPageRecipeCarpenter(KnowledgeListMF.potRecipe), new EntryPageSmelting(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot), new EntryPageRecipeCarpenter(KnowledgeListMF.quernR), new EntryPageText("knowledge.gettingStarted.11"), new EntryPageText("knowledge.gettingStarted.12")); - KnowledgeListMF.gettingStarted.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.bSalvageR), new EntryPageText("knowledge.gettingStarted.13")); - - KnowledgeListMF.research.addPages(new EntryPageText("knowledge.research.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.researchTableRecipe), new EntryPageText("knowledge.research.2")); - KnowledgeListMF.talisman.addPages(new EntryPageText("knowledge.talisman.1"), new EntryPageRecipeAnvil(KnowledgeListMF.talismanRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.artBookR), new EntryPageRecipeCarpenter(KnowledgeListMF.conBookR), new EntryPageRecipeCarpenter(KnowledgeListMF.proBookR), new EntryPageRecipeCarpenter(KnowledgeListMF.engBookR), new EntryPageRecipeCarpenter(KnowledgeListMF.comBookR), new EntryPageText("knowledge.talisman.2"), new EntryPageRecipeAnvil(KnowledgeListMF.greatTalismanRecipe)); - KnowledgeListMF.talisman.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.artBook2R), new EntryPageRecipeCarpenter(KnowledgeListMF.conBook2R), new EntryPageRecipeCarpenter(KnowledgeListMF.proBook2R), new EntryPageRecipeCarpenter(KnowledgeListMF.engBook2R), new EntryPageRecipeCarpenter(KnowledgeListMF.comBook2R)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.1"), + new EntryPageText("knowledge.gettingStarted.2")); + + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.carpenter"), + new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.fire"), + new EntryPageRecipeBase(KnowledgeListMF.firepitRecipe), + new EntryPageRecipeBase(KnowledgeListMF.dryrocksR)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.food"), + new EntryPageRecipeBase(KnowledgeListMF.cooktopRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneovenRecipe)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.tanning"), + new EntryPageRecipeCarpenter(KnowledgeListMF.tannerRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.forging"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAnvilRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.forgeRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), + new EntryPageRecipeBase(KnowledgeListMF.dryrocksR), + new EntryPageRecipeCarpenter(KnowledgeListMF.apronRecipe)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.forgingbars"), + new EntryPageRecipeAnvil(KnowledgeListMF.barR)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.flux"), + new EntryPageRecipeAnvil(KnowledgeListMF.fluxR)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.3"), + new EntryPageRecipeAnvil(KnowledgeListMF.shearsR), new EntryPageText("knowledge.gettingStarted.4"), + new EntryPageText("knowledge.gettingStarted.5"), new EntryPageRecipeAnvil(KnowledgeListMF.hammerR), + new EntryPageRecipeAnvil(KnowledgeListMF.tongsR), new EntryPageText("knowledge.gettingStarted.6")); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.upgrade"), + new EntryPageRecipeCarpenter(KnowledgeListMF.researchTableRecipe), + new EntryPageText("knowledge.gettingStarted.7")); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.10"), + new EntryPageRecipeCarpenter(KnowledgeListMF.potRecipe), + new EntryPageSmelting(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot), + new EntryPageRecipeCarpenter(KnowledgeListMF.quernR), new EntryPageText("knowledge.gettingStarted.11"), + new EntryPageText("knowledge.gettingStarted.12")); + KnowledgeListMF.gettingStarted.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.bSalvageR), + new EntryPageText("knowledge.gettingStarted.13")); + + KnowledgeListMF.research.addPages(new EntryPageText("knowledge.research.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.researchTableRecipe), + new EntryPageText("knowledge.research.2")); + KnowledgeListMF.talisman.addPages(new EntryPageText("knowledge.talisman.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.talismanRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.artBookR), + new EntryPageRecipeCarpenter(KnowledgeListMF.conBookR), + new EntryPageRecipeCarpenter(KnowledgeListMF.proBookR), + new EntryPageRecipeCarpenter(KnowledgeListMF.engBookR), + new EntryPageRecipeCarpenter(KnowledgeListMF.comBookR), new EntryPageText("knowledge.talisman.2"), + new EntryPageRecipeAnvil(KnowledgeListMF.greatTalismanRecipe)); + KnowledgeListMF.talisman.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.artBook2R), + new EntryPageRecipeCarpenter(KnowledgeListMF.conBook2R), + new EntryPageRecipeCarpenter(KnowledgeListMF.proBook2R), + new EntryPageRecipeCarpenter(KnowledgeListMF.engBook2R), + new EntryPageRecipeCarpenter(KnowledgeListMF.comBook2R)); KnowledgeListMF.stamina.addPages(new EntryPageText("knowledge.stamina.1")); - KnowledgeListMF.combat.addPages(new EntryPageText("knowledge.combat.1"), new EntryPageText("knowledge.parry.info"), new EntryPageText("knowledge.advparry.info"), new EntryPageText("knowledge.poweratt.info"), new EntryPageText("knowledge.dodge.info"), new EntryPageText("knowledge.armour.info")); - KnowledgeListMF.craftArmourBasic.addPages(new EntryPageText("knowledge.craftArmourBasic.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.hideHelmR), new EntryPageRecipeCarpenter(KnowledgeListMF.hideChestR), new EntryPageRecipeCarpenter(KnowledgeListMF.hideLegsR), new EntryPageRecipeCarpenter(KnowledgeListMF.hideBootsR)); - KnowledgeListMF.craftArmourBasic.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.roughHelmetR), new EntryPageRecipeCarpenter(KnowledgeListMF.roughChestR), new EntryPageRecipeCarpenter(KnowledgeListMF.roughLegsR), new EntryPageRecipeCarpenter(KnowledgeListMF.roughBootsR)); - - KnowledgeListMF.carpenter.addPages(new EntryPageText("knowledge.carpenter.1"), new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe)); - KnowledgeListMF.salvage.addPages(new EntryPageText("knowledge.salvage.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.bSalvageR), new EntryPageText("knowledge.salvage.2")); - + KnowledgeListMF.combat.addPages(new EntryPageText("knowledge.combat.1"), + new EntryPageText("knowledge.parry.info"), new EntryPageText("knowledge.advparry.info"), + new EntryPageText("knowledge.poweratt.info"), new EntryPageText("knowledge.dodge.info"), + new EntryPageText("knowledge.armour.info")); + KnowledgeListMF.craftArmourBasic.addPages(new EntryPageText("knowledge.craftArmourBasic.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.hideHelmR), + new EntryPageRecipeCarpenter(KnowledgeListMF.hideChestR), + new EntryPageRecipeCarpenter(KnowledgeListMF.hideLegsR), + new EntryPageRecipeCarpenter(KnowledgeListMF.hideBootsR)); + KnowledgeListMF.craftArmourBasic.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.roughHelmetR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughChestR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughLegsR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughBootsR)); + + KnowledgeListMF.carpenter.addPages(new EntryPageText("knowledge.carpenter.1"), + new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe)); + KnowledgeListMF.salvage.addPages(new EntryPageText("knowledge.salvage.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bSalvageR), new EntryPageText("knowledge.salvage.2")); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.1")); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.plank"), new EntryPageRecipeBase(KnowledgeListMF.plankRecipe), new EntryPageRecipeBase(KnowledgeListMF.stickRecipe)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.refinedplank"), new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), new EntryPageRecipeBase(KnowledgeListMF.plantOilR), new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.flux"), new EntryPageRecipeAnvil(KnowledgeListMF.fluxR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.plank"), + new EntryPageRecipeBase(KnowledgeListMF.plankRecipe), + new EntryPageRecipeBase(KnowledgeListMF.stickRecipe)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.refinedplank"), + new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), + new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), + new EntryPageRecipeBase(KnowledgeListMF.plantOilR), + new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.flux"), + new EntryPageRecipeAnvil(KnowledgeListMF.fluxR)); KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.bar.1")); - KnowledgeListMF.commodities.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.barR), new EntryPageRecipeAnvil(KnowledgeListMF.baringotR)); - - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.hunks"), new EntryPageRecipeAnvil(KnowledgeListMF.hunkR), new EntryPageRecipeAnvil(KnowledgeListMF.ingotR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.nail"), new EntryPageRecipeAnvil(KnowledgeListMF.nailR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.rivet"), new EntryPageRecipeAnvil(KnowledgeListMF.rivetR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.leatherstrip"), new EntryPageRecipeCarpenter(KnowledgeListMF.lStripsR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.thread"), new EntryPageRecipeCarpenter(KnowledgeListMF.threadR), new EntryPageRecipeCarpenter(KnowledgeListMF.stringR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.bucket"), new EntryPageRecipeAnvil(KnowledgeListMF.bucketR)); - - KnowledgeListMF.dust.addPages(new EntryPageText("knowledge.dust.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.potRecipe), new EntryPageSmelting(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot), new EntryPageRecipeCarpenter(KnowledgeListMF.quernR), new EntryPageText("knowledge.dust.quern")); - KnowledgeListMF.dust.addPages(new EntryPageGrind(new ItemStack(Items.coal), new ItemStack(ComponentListMF.coalDust)), new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), new ItemStack(ComponentListMF.kaolinite_dust)), new EntryPageGrind(new ItemStack(Items.wheat), new ItemStack(FoodListMF.flour)), new EntryPageGrind(new ItemStack(Items.dye, 1, 3), new ItemStack(FoodListMF.coca_powder))); - KnowledgeListMF.dust.addPages(new EntryPageText("knowledge.dust.icing"), new EntryPageRecipeCarpenter(KnowledgeListMF.spoonR), new EntryPageRecipeCarpenter(KnowledgeListMF.icingRecipe)); - + KnowledgeListMF.commodities.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.barR), + new EntryPageRecipeAnvil(KnowledgeListMF.baringotR)); + + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.hunks"), + new EntryPageRecipeAnvil(KnowledgeListMF.hunkR), new EntryPageRecipeAnvil(KnowledgeListMF.ingotR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.nail"), + new EntryPageRecipeAnvil(KnowledgeListMF.nailR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.rivet"), + new EntryPageRecipeAnvil(KnowledgeListMF.rivetR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.leatherstrip"), + new EntryPageRecipeCarpenter(KnowledgeListMF.lStripsR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.thread"), + new EntryPageRecipeCarpenter(KnowledgeListMF.threadR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stringR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.bucket"), + new EntryPageRecipeAnvil(KnowledgeListMF.bucketR)); + + KnowledgeListMF.dust.addPages(new EntryPageText("knowledge.dust.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.potRecipe), + new EntryPageSmelting(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot), + new EntryPageRecipeCarpenter(KnowledgeListMF.quernR), new EntryPageText("knowledge.dust.quern")); + KnowledgeListMF.dust.addPages( + new EntryPageGrind(new ItemStack(Items.coal), new ItemStack(ComponentListMF.coalDust)), + new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), + new ItemStack(ComponentListMF.kaolinite_dust)), + new EntryPageGrind(new ItemStack(Items.wheat), new ItemStack(FoodListMF.flour)), + new EntryPageGrind(new ItemStack(Items.dye, 1, 3), new ItemStack(FoodListMF.coca_powder))); + KnowledgeListMF.dust.addPages(new EntryPageText("knowledge.dust.icing"), + new EntryPageRecipeCarpenter(KnowledgeListMF.spoonR), + new EntryPageRecipeCarpenter(KnowledgeListMF.icingRecipe)); + KnowledgeListMF.ores.addPages(new EntryPageText("knowledge.ores.1"), new EntryPageText("")); KnowledgeListMF.ores.addPages(assembleOreDescHC("copper", BlockListMF.oreCopper, ComponentListMF.ingots[0])); KnowledgeListMF.ores.addPages(assembleOreDescHC("tin", BlockListMF.oreTin, ComponentListMF.ingots[1])); @@ -89,358 +175,727 @@ public static void registerPages() KnowledgeListMF.ores.addPages(assembleMineralDesc("borax", BlockListMF.oreBorax)); KnowledgeListMF.ores.addPages(assembleMineralDesc("nitre", BlockListMF.oreNitre)); KnowledgeListMF.ores.addPages(assembleMineralDesc("sulfur", BlockListMF.oreSulfur)); - + KnowledgeListMF.plants.addPages(new EntryPageText("knowledge.plants.1")); KnowledgeListMF.plants.addPages(assembleImgPage("berry", BlockListMF.berryBush)); KnowledgeListMF.plants.addPages(new EntryPageText("knowledge.plants.2")); KnowledgeListMF.plants.addPages(assembleImgPage("yew", BlockListMF.log_yew)); KnowledgeListMF.plants.addPages(assembleImgPage("ironbark", BlockListMF.log_ironbark)); KnowledgeListMF.plants.addPages(assembleImgPage("ebony", BlockListMF.log_ebony)); - - KnowledgeListMF.minotaurs.addPages(new EntryPageText("knowledge.minotaurs.1"), new EntryPageText("knowledge.minotaurs.2"), new EntryPageText("knowledge.minotaurs.3"), new EntryPageText("knowledge.minotaurs.4")); + + KnowledgeListMF.minotaurs.addPages(new EntryPageText("knowledge.minotaurs.1"), + new EntryPageText("knowledge.minotaurs.2"), new EntryPageText("knowledge.minotaurs.3"), + new EntryPageText("knowledge.minotaurs.4")); KnowledgeListMF.minotaurs.addPages(assembleMobDesc("minotaur")); KnowledgeListMF.minotaurs.addPages(assembleMobDesc("minotaur_frost")); KnowledgeListMF.minotaurs.addPages(assembleMobDesc("minotaur_dread")); KnowledgeListMF.minotaurs.addPages(new EntryPageText("knowledge.minotaurs.combat")); - - KnowledgeListMF.dragons.addPages(new EntryPageText("knowledge.dragons.1"), new EntryPageText("knowledge.dragons.2")); + + KnowledgeListMF.dragons.addPages(new EntryPageText("knowledge.dragons.1"), + new EntryPageText("knowledge.dragons.2")); KnowledgeListMF.dragons.addPages(assembleMobDesc("red_dragon")); KnowledgeListMF.dragons.addPages(assembleMobDesc("blue_dragon")); KnowledgeListMF.dragons.addPages(assembleMobDesc("green_dragon")); KnowledgeListMF.dragons.addPages(assembleMobDesc("ash_dragon")); KnowledgeListMF.dragons.addPages(new EntryPageText("knowledge.dragons.combat")); - - KnowledgeListMF.chimney.addPages(new EntryPageText("knowledge.chimney.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.chimneyRecipe), new EntryPageText("knowledge.chimney.2"), new EntryPageRecipeCarpenter(KnowledgeListMF.wideChimneyRecipe), new EntryPageText("knowledge.chimney.3"), new EntryPageRecipeCarpenter(KnowledgeListMF.extractChimneyRecipe)); - KnowledgeListMF.chimney.addPages(new EntryPageText("knowledge.chimney.pipe"), new EntryPageRecipeAnvil(KnowledgeListMF.smokePipeR)); + + KnowledgeListMF.chimney.addPages(new EntryPageText("knowledge.chimney.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.chimneyRecipe), new EntryPageText("knowledge.chimney.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.wideChimneyRecipe), + new EntryPageText("knowledge.chimney.3"), + new EntryPageRecipeCarpenter(KnowledgeListMF.extractChimneyRecipe)); + KnowledgeListMF.chimney.addPages(new EntryPageText("knowledge.chimney.pipe"), + new EntryPageRecipeAnvil(KnowledgeListMF.smokePipeR)); KnowledgeListMF.chimney.addPages(assembleSimpleImgPage("smoke_pipe_example", "knowledge.chimney.pipe.2")); - - KnowledgeListMF.tanning.addPages(new EntryPageText("knowledge.tanning.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.tannerRecipe), new EntryPageText("knowledge.tanning.2"), new EntryPageRecipeCarpenter(KnowledgeListMF.strongRackR)); - - KnowledgeListMF.bloomery.addPages(new EntryPageText("knowledge.bloomery.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.bloomeryR), new EntryPageText("knowledge.bloomery.2"), new EntryPageText("knowledge.bloomery.3")); - KnowledgeListMF.crucible.addPages(assembleSimpleImgPage("crucible_example", "knowledge.crucible.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.crucibleRecipe), new EntryPageText("knowledge.crucible.2")); - if(ConfigHardcore.HCCreduceIngots) - { - KnowledgeListMF.crucible.addPages(new EntryPageText("knowledge.crucible.hcc"), new EntryPageRecipeCarpenter(KnowledgeListMF.mouldRecipe), new EntryPageSmelting(ComponentListMF.ingot_mould_uncooked, ComponentListMF.ingot_mould)); + + KnowledgeListMF.tanning.addPages(new EntryPageText("knowledge.tanning.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.tannerRecipe), new EntryPageText("knowledge.tanning.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.strongRackR)); + + KnowledgeListMF.bloomery.addPages(new EntryPageText("knowledge.bloomery.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bloomeryR), new EntryPageText("knowledge.bloomery.2"), + new EntryPageText("knowledge.bloomery.3")); + KnowledgeListMF.crucible.addPages(assembleSimpleImgPage("crucible_example", "knowledge.crucible.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crucibleRecipe), + new EntryPageText("knowledge.crucible.2")); + if (ConfigHardcore.HCCreduceIngots) { + KnowledgeListMF.crucible.addPages(new EntryPageText("knowledge.crucible.hcc"), + new EntryPageRecipeCarpenter(KnowledgeListMF.mouldRecipe), + new EntryPageSmelting(ComponentListMF.ingot_mould_uncooked, ComponentListMF.ingot_mould)); } - KnowledgeListMF.crucible2.addPages(assembleSimpleImgPage("fire_crucible_example", "knowledge.crucible2.1"), new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), new ItemStack(ComponentListMF.kaolinite_dust)), new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), new EntryPageRecipeCarpenter(KnowledgeListMF.advCrucibleRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), assembleSimpleImgPage("fire_crucible", "knowledge.crucible2.blocks")); - + KnowledgeListMF.crucible2.addPages(assembleSimpleImgPage("fire_crucible_example", "knowledge.crucible2.1"), + new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), + new ItemStack(ComponentListMF.kaolinite_dust)), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), + new EntryPageRecipeCarpenter(KnowledgeListMF.advCrucibleRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), + assembleSimpleImgPage("fire_crucible", "knowledge.crucible2.blocks")); + KnowledgeListMF.bar.addPages(new EntryPageText("knowledge.bar.1")); - KnowledgeListMF.bar.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.barR), new EntryPageRecipeAnvil(KnowledgeListMF.baringotR)); + KnowledgeListMF.bar.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.barR), + new EntryPageRecipeAnvil(KnowledgeListMF.baringotR)); KnowledgeListMF.smeltCopper.addPages(new EntryPageText("knowledge.smeltCopper.1")); KnowledgeListMF.smeltBronze.addPages(new EntryPageText("knowledge.smeltBronze.1")); - if(ConfigHardcore.HCCreduceIngots) - { + if (ConfigHardcore.HCCreduceIngots) { KnowledgeListMF.smeltIron.addPages(new EntryPageText("knowledge.smeltIron.1")); - KnowledgeListMF.smeltCopper.addPages(new EntryPageRecipeBloom(new ItemStack(BlockListMF.oreCopper), new ItemStack(ComponentListMF.ingots[0]))); - KnowledgeListMF.smeltBronze.addPages(new EntryPageRecipeBloom(new ItemStack(BlockListMF.oreTin), new ItemStack(ComponentListMF.ingots[1]))); - } - else - { - KnowledgeListMF.smeltCopper.addPages(new EntryPageSmelting(new ItemStack(BlockListMF.oreCopper), new ItemStack(ComponentListMF.ingots[0]))); - KnowledgeListMF.smeltBronze.addPages(new EntryPageSmelting(new ItemStack(BlockListMF.oreTin), new ItemStack(ComponentListMF.ingots[1]))); + KnowledgeListMF.smeltCopper.addPages(new EntryPageRecipeBloom(new ItemStack(BlockListMF.oreCopper), + new ItemStack(ComponentListMF.ingots[0]))); + KnowledgeListMF.smeltBronze.addPages(new EntryPageRecipeBloom(new ItemStack(BlockListMF.oreTin), + new ItemStack(ComponentListMF.ingots[1]))); + } else { + KnowledgeListMF.smeltCopper.addPages(new EntryPageSmelting(new ItemStack(BlockListMF.oreCopper), + new ItemStack(ComponentListMF.ingots[0]))); + KnowledgeListMF.smeltBronze.addPages( + new EntryPageSmelting(new ItemStack(BlockListMF.oreTin), new ItemStack(ComponentListMF.ingots[1]))); } KnowledgeListMF.smeltBronze.addPages(new EntryPageCrucible(KnowledgeListMF.bronze)); KnowledgeListMF.smeltIron.addPages(new EntryPageText("knowledge.smeltIron.2")); - KnowledgeListMF.smeltPig.addPages(new EntryPageText("knowledge.smeltPig.1"), new EntryPageRecipeAnvil(KnowledgeListMF.ironPrepR), new EntryPageRecipeAnvil(KnowledgeListMF.ironPrepR2), new EntryPageBlastFurnace(ComponentListMF.iron_prep, pigiron), new EntryPageText("knowledge.blastfurn.9")); - KnowledgeListMF.smeltSteel.addPages(new EntryPageText("knowledge.smeltSteel.1"), new EntryPageRecipeAnvil(KnowledgeListMF.steelR)); - if(!ConfigHardcore.HCCreduceIngots) - { + KnowledgeListMF.smeltPig.addPages(new EntryPageText("knowledge.smeltPig.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.ironPrepR), + new EntryPageRecipeAnvil(KnowledgeListMF.ironPrepR2), + new EntryPageBlastFurnace(ComponentListMF.iron_prep, pigiron), + new EntryPageText("knowledge.blastfurn.9")); + KnowledgeListMF.smeltSteel.addPages(new EntryPageText("knowledge.smeltSteel.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.steelR)); + if (!ConfigHardcore.HCCreduceIngots) { KnowledgeListMF.smeltSteel.addPages(new EntryPageCrucible(KnowledgeListMF.steel)); } - KnowledgeListMF.encrusted.addPages(new EntryPageText("knowledge.smeltEncrusted.1"), new EntryPageRecipeAnvil(KnowledgeListMF.diamondR), new EntryPageRecipeAnvil(KnowledgeListMF.encrustedR)); - KnowledgeListMF.obsidian.addPages(new EntryPageText("knowledge.smeltObsidian.1"), new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), new EntryPageCrucible(KnowledgeListMF.obsidalloy)); - - if(ConfigHardcore.HCCreduceIngots) - { - KnowledgeListMF.smeltIron.addPages(new EntryPageRecipeBloom(new ItemStack(Blocks.iron_ore), new ItemStack(Items.iron_ingot))); + KnowledgeListMF.encrusted.addPages(new EntryPageText("knowledge.smeltEncrusted.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.diamondR), + new EntryPageRecipeAnvil(KnowledgeListMF.encrustedR)); + KnowledgeListMF.obsidian.addPages(new EntryPageText("knowledge.smeltObsidian.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), + new EntryPageCrucible(KnowledgeListMF.obsidalloy)); + + if (ConfigHardcore.HCCreduceIngots) { + KnowledgeListMF.smeltIron.addPages( + new EntryPageRecipeBloom(new ItemStack(Blocks.iron_ore), new ItemStack(Items.iron_ingot))); + } else { + KnowledgeListMF.smeltIron + .addPages(new EntryPageSmelting(new ItemStack(Blocks.iron_ore), new ItemStack(Items.iron_ingot))); } - else - { - KnowledgeListMF.smeltIron.addPages(new EntryPageSmelting(new ItemStack(Blocks.iron_ore), new ItemStack(Items.iron_ingot))); + + KnowledgeListMF.apron.addPages(new EntryPageText("knowledge.apron.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.apronRecipe)); + KnowledgeListMF.bellows.addPages(new EntryPageText("knowledge.bellows.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bellowsRecipe)); + KnowledgeListMF.trough.addPages(new EntryPageText("knowledge.trough.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.woodTroughRecipe), new EntryPageText("knowledge.trough.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.nailTroughR)); + KnowledgeListMF.forge.addPages(assembleSimpleImgPage("forge_example", "knowledge.forge.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.forgeRecipe), new EntryPageText("knowledge.forge.2"), + new EntryPageText("knowledge.forge.3")); + KnowledgeListMF.anvil.addPages(assembleSimpleImgPage("smithy_example", "knowledge.anvil.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAnvilRecipe), + new EntryPageRecipeAnvil(ForgingRecipes.recipeMap.get("anvilCrafting")), + new EntryPageText("knowledge.anvil.2"), + new EntryPageImage("textures/gui/knowledge/anvilGuiExample.png", 128, 128, ""), + new EntryPageText("knowledge.anvil.3"), new EntryPageText("knowledge.anvil.4"), + new EntryPageText("knowledge.anvil.5")); + KnowledgeListMF.anvil.addPages(new EntryPageText("knowledge.anvil.6"), + new EntryPageImage("textures/gui/knowledge/qualityExample.png", 128, 128, "knowledge.anvil.7")); + + KnowledgeListMF.smeltDragonforge.addPages(new EntryPageText("knowledge.smeltDragonforge.1"), + new EntryPageText("knowledge.smeltDragonforge.2")); + KnowledgeListMF.craftOrnate.addPages(new EntryPageText("knowledge.craftOrnate.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.crestR)); + + KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.1"), + new EntryPageText("knowledge.craftArmourLight.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughHelmetR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughChestR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughLegsR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughBootsR)); + KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.3")); + KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.padding[0]), + new EntryPageRecipeCarpenter(KnowledgeListMF.padding[1]), + new EntryPageRecipeCarpenter(KnowledgeListMF.padding[2]), + new EntryPageRecipeCarpenter(KnowledgeListMF.padding[3])); + KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.4")); + KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.reHelmetR), + new EntryPageRecipeCarpenter(KnowledgeListMF.reChestR), + new EntryPageRecipeCarpenter(KnowledgeListMF.reLegsR), + new EntryPageRecipeCarpenter(KnowledgeListMF.reBootsR)); + KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.studHelmetR), + new EntryPageRecipeAnvil(KnowledgeListMF.studChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.studLegsR), + new EntryPageRecipeAnvil(KnowledgeListMF.studBootsR)); + KnowledgeListMF.craftArmourMedium.addPages(new EntryPageText("knowledge.craftArmourMedium.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.mailRecipes), + new EntryPageRecipeAnvil(KnowledgeListMF.mailHelmetR), + new EntryPageRecipeAnvil(KnowledgeListMF.mailChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.mailLegsR), + new EntryPageRecipeAnvil(KnowledgeListMF.mailBootsR)); + KnowledgeListMF.craftArmourMedium.addPages(new EntryPageText("knowledge.craftArmourMedium.scale"), + new EntryPageRecipeAnvil(KnowledgeListMF.scaleRecipes), + new EntryPageRecipeAnvil(KnowledgeListMF.scaleHelmetR), + new EntryPageRecipeAnvil(KnowledgeListMF.scaleChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.scaleLegsR), + new EntryPageRecipeAnvil(KnowledgeListMF.scaleBootsR)); + KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.1"), + new EntryPageText("knowledge.craftArmourHeavy.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.padding)); + KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.splint"), + new EntryPageRecipeAnvil(KnowledgeListMF.splintRecipes), + new EntryPageRecipeAnvil(KnowledgeListMF.splintHelmetR), + new EntryPageRecipeAnvil(KnowledgeListMF.splintChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.splintLegsR), + new EntryPageRecipeAnvil(KnowledgeListMF.splintBootsR)); + KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.plate"), + new EntryPageRecipeAnvil(KnowledgeListMF.plateRecipes), + new EntryPageRecipeAnvil(KnowledgeListMF.plateHelmetR), + new EntryPageRecipeAnvil(KnowledgeListMF.plateChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.plateLegsR), + new EntryPageRecipeAnvil(KnowledgeListMF.plateBootsR)); + + KnowledgeListMF.coalflux.addPages(new EntryPageText("knowledge.coalflux.1"), + new EntryPageGrind(new ItemStack(ComponentListMF.flux), new ItemStack(ComponentListMF.flux_pot)), + new EntryPageRecipeAnvil(KnowledgeListMF.coalfluxR)); + + KnowledgeListMF.bigfurn.addPages(assembleSimpleImgPage("furnace_example", "knowledge.bigfurn.1"), + new EntryPageText("knowledge.bigfurn.2")); + KnowledgeListMF.bigfurn.addPages( + new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), + new ItemStack(ComponentListMF.kaolinite_dust)), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickR), + new EntryPageSmelting(new ItemStack(ComponentListMF.fireclay_brick), + new ItemStack(ComponentListMF.strong_brick)), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR)); + KnowledgeListMF.bigfurn.addPages(new EntryPageText("knowledge.bigfurn.heater"), + new EntryPageRecipeAnvil(KnowledgeListMF.bigHeatR), + assembleSimpleImgPage("furnace_heater", BlockListMF.furnace_heater.getUnlocalizedName() + ".name")); + KnowledgeListMF.bigfurn.addPages(new EntryPageText("knowledge.bigfurn.top"), + new EntryPageRecipeAnvil(KnowledgeListMF.bigFurnR), + assembleSimpleImgPage("furnace_full", "knowledge.bigfurn.structure")); + + KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.1"), + new EntryPageText("knowledge.blastfurn.2")); + KnowledgeListMF.blastfurn.addPages( + new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), + new ItemStack(ComponentListMF.kaolinite_dust)), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickR), + new EntryPageSmelting(new ItemStack(ComponentListMF.fireclay_brick), + new ItemStack(ComponentListMF.strong_brick)), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR)); + KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.3"), + new EntryPageRecipeAnvil(KnowledgeListMF.blastChamR), + new EntryPageRecipeAnvil(KnowledgeListMF.blastHeatR), new EntryPageText("knowledge.blastfurn.4"), + new EntryPageText("knowledge.blastfurn.5")); + KnowledgeListMF.blastfurn.addPages( + new EntryPageImage("textures/gui/knowledge/blast_example.png", 96, 96, "knowledge.blastfurn.6")); + KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.7")); + if (ConfigHardcore.HCCreduceIngots) { + KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.hcc")); } - - KnowledgeListMF.apron.addPages(new EntryPageText("knowledge.apron.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.apronRecipe)); - KnowledgeListMF.bellows.addPages(new EntryPageText("knowledge.bellows.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.bellowsRecipe)); - KnowledgeListMF.trough.addPages(new EntryPageText("knowledge.trough.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.woodTroughRecipe), new EntryPageText("knowledge.trough.2"), new EntryPageRecipeCarpenter(KnowledgeListMF.nailTroughR)); - KnowledgeListMF.forge.addPages(assembleSimpleImgPage("forge_example", "knowledge.forge.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.forgeRecipe), new EntryPageText("knowledge.forge.2"), new EntryPageText("knowledge.forge.3")); - KnowledgeListMF.anvil.addPages(assembleSimpleImgPage("smithy_example", "knowledge.anvil.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAnvilRecipe), new EntryPageRecipeAnvil(ForgingRecipes.recipeMap.get("anvilCrafting")), new EntryPageText( "knowledge.anvil.2"), new EntryPageImage("textures/gui/knowledge/anvilGuiExample.png", 128, 128, ""), new EntryPageText( "knowledge.anvil.3"), new EntryPageText( "knowledge.anvil.4"), new EntryPageText( "knowledge.anvil.5")); - KnowledgeListMF.anvil.addPages(new EntryPageText("knowledge.anvil.6"), new EntryPageImage("textures/gui/knowledge/qualityExample.png", 128, 128, "knowledge.anvil.7")); - - KnowledgeListMF.smeltDragonforge.addPages(new EntryPageText("knowledge.smeltDragonforge.1"), new EntryPageText("knowledge.smeltDragonforge.2")); - KnowledgeListMF.craftOrnate.addPages(new EntryPageText("knowledge.craftOrnate.1"), new EntryPageRecipeAnvil(KnowledgeListMF.crestR)); - - KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.1"), new EntryPageText("knowledge.craftArmourLight.2"), new EntryPageRecipeCarpenter(KnowledgeListMF.roughHelmetR), new EntryPageRecipeCarpenter(KnowledgeListMF.roughChestR), new EntryPageRecipeCarpenter(KnowledgeListMF.roughLegsR), new EntryPageRecipeCarpenter(KnowledgeListMF.roughBootsR)); - KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.3")); - KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.padding[0]), new EntryPageRecipeCarpenter(KnowledgeListMF.padding[1]), new EntryPageRecipeCarpenter(KnowledgeListMF.padding[2]), new EntryPageRecipeCarpenter(KnowledgeListMF.padding[3])); - KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.4")); - KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.reHelmetR), new EntryPageRecipeCarpenter(KnowledgeListMF.reChestR), new EntryPageRecipeCarpenter(KnowledgeListMF.reLegsR), new EntryPageRecipeCarpenter(KnowledgeListMF.reBootsR)); - KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.studHelmetR), new EntryPageRecipeAnvil(KnowledgeListMF.studChestR), new EntryPageRecipeAnvil(KnowledgeListMF.studLegsR), new EntryPageRecipeAnvil(KnowledgeListMF.studBootsR)); - KnowledgeListMF.craftArmourMedium.addPages(new EntryPageText("knowledge.craftArmourMedium.1"), new EntryPageRecipeAnvil(KnowledgeListMF.mailRecipes), new EntryPageRecipeAnvil(KnowledgeListMF.mailHelmetR), new EntryPageRecipeAnvil(KnowledgeListMF.mailChestR), new EntryPageRecipeAnvil(KnowledgeListMF.mailLegsR), new EntryPageRecipeAnvil(KnowledgeListMF.mailBootsR)); - KnowledgeListMF.craftArmourMedium.addPages(new EntryPageText("knowledge.craftArmourMedium.scale"), new EntryPageRecipeAnvil(KnowledgeListMF.scaleRecipes), new EntryPageRecipeAnvil(KnowledgeListMF.scaleHelmetR), new EntryPageRecipeAnvil(KnowledgeListMF.scaleChestR), new EntryPageRecipeAnvil(KnowledgeListMF.scaleLegsR), new EntryPageRecipeAnvil(KnowledgeListMF.scaleBootsR)); - KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.1"), new EntryPageText("knowledge.craftArmourHeavy.2"), new EntryPageRecipeCarpenter(KnowledgeListMF.padding)); - KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.splint"), new EntryPageRecipeAnvil(KnowledgeListMF.splintRecipes), new EntryPageRecipeAnvil(KnowledgeListMF.splintHelmetR), new EntryPageRecipeAnvil(KnowledgeListMF.splintChestR), new EntryPageRecipeAnvil(KnowledgeListMF.splintLegsR), new EntryPageRecipeAnvil(KnowledgeListMF.splintBootsR)); - KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.plate"), new EntryPageRecipeAnvil(KnowledgeListMF.plateRecipes), new EntryPageRecipeAnvil(KnowledgeListMF.plateHelmetR), new EntryPageRecipeAnvil(KnowledgeListMF.plateChestR), new EntryPageRecipeAnvil(KnowledgeListMF.plateLegsR), new EntryPageRecipeAnvil(KnowledgeListMF.plateBootsR)); - - KnowledgeListMF.coalflux.addPages(new EntryPageText("knowledge.coalflux.1"), new EntryPageGrind(new ItemStack(ComponentListMF.flux), new ItemStack(ComponentListMF.flux_pot)), new EntryPageRecipeAnvil(KnowledgeListMF.coalfluxR)); - - KnowledgeListMF.bigfurn.addPages(assembleSimpleImgPage("furnace_example", "knowledge.bigfurn.1"), new EntryPageText("knowledge.bigfurn.2")); - KnowledgeListMF.bigfurn.addPages(new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), new ItemStack(ComponentListMF.kaolinite_dust)), new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickR), new EntryPageSmelting(new ItemStack(ComponentListMF.fireclay_brick), new ItemStack(ComponentListMF.strong_brick)), new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR)); - KnowledgeListMF.bigfurn.addPages(new EntryPageText("knowledge.bigfurn.heater"), new EntryPageRecipeAnvil(KnowledgeListMF.bigHeatR), assembleSimpleImgPage("furnace_heater", BlockListMF.furnace_heater.getUnlocalizedName()+".name")); - KnowledgeListMF.bigfurn.addPages(new EntryPageText("knowledge.bigfurn.top"), new EntryPageRecipeAnvil(KnowledgeListMF.bigFurnR), assembleSimpleImgPage("furnace_full", "knowledge.bigfurn.structure")); - - - KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.1"), new EntryPageText("knowledge.blastfurn.2")); - KnowledgeListMF.blastfurn.addPages(new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), new ItemStack(ComponentListMF.kaolinite_dust)), new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickR), new EntryPageSmelting(new ItemStack(ComponentListMF.fireclay_brick), new ItemStack(ComponentListMF.strong_brick)), new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR)); - KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.3"), new EntryPageRecipeAnvil(KnowledgeListMF.blastChamR), new EntryPageRecipeAnvil(KnowledgeListMF.blastHeatR), new EntryPageText("knowledge.blastfurn.4"), new EntryPageText("knowledge.blastfurn.5")); - KnowledgeListMF.blastfurn.addPages(new EntryPageImage("textures/gui/knowledge/blast_example.png", 96, 96, "knowledge.blastfurn.6")); - KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.7")); - if(ConfigHardcore.HCCreduceIngots) - { - KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.hcc")); - } - - KnowledgeListMF.etools.addPages(new EntryPageText("knowledge.etools.1"), new EntryPageRecipeAnvil(KnowledgeListMF.spannerR), new EntryPageRecipeAnvil(KnowledgeListMF.eatoolsR)); - KnowledgeListMF.ecomponents.addPages(new EntryPageText("knowledge.ecomponents.1"), new EntryPageRecipeAnvil(KnowledgeListMF.boltR), new EntryPageText("knowledge.ecomponents.2"), new EntryPageRecipeAnvil(KnowledgeListMF.iframeR), new EntryPageRecipeAnvil(KnowledgeListMF.bgearR), new EntryPageRecipeAnvil(KnowledgeListMF.tgearR), new EntryPageRecipeAnvil(KnowledgeListMF.istrutR), new EntryPageRecipeAnvil(KnowledgeListMF.stubeR)); - KnowledgeListMF.tungsten.addPages(new EntryPageText("knowledge.tungsten.1"), new EntryPageText("knowledge.tungsten.2"), new EntryPageText("knowledge.tungsten.3"), new EntryPageCrucible(KnowledgeListMF.wolframiteR)); - KnowledgeListMF.climber.addPages(new EntryPageText("knowledge.climber.1"), new EntryPageRecipeAnvil(KnowledgeListMF.climbPickbR), new EntryPageText("knowledge.climber.2")); - KnowledgeListMF.spyglass.addPages(new EntryPageText("knowledge.spyglass.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.spyglassR)); - KnowledgeListMF.parachute.addPages(new EntryPageText("knowledge.parachute.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.parachuteR)); - KnowledgeListMF.syringe.addPages(new EntryPageText("knowledge.syringe.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.syringeR)); - KnowledgeListMF.engTanner.addPages(new EntryPageText("knowledge.engTanner.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.engTannerR)); - KnowledgeListMF.advcrucible.addPages(assembleSimpleImgPage("auto_crucible_example", BlockListMF.crucibleauto.getUnlocalizedName()+".name"), new EntryPageText("knowledge.advcrucible.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.autoCrucibleR), new EntryPageText("knowledge.crucible2.blocks"), new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), assembleSimpleImgPage("auto_crucible", "knowledge.basicstructure")); - KnowledgeListMF.advforge.addPages(new EntryPageText("knowledge.advforge.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.advancedForgeR)); - KnowledgeListMF.coke.addPages(new EntryPageText("knowledge.coke.1"), new EntryPageRecipeAnvil(KnowledgeListMF.coalPrepR), new EntryPageSmelting(ComponentListMF.coal_prep, ComponentListMF.coke)); - - KnowledgeListMF.blackpowder.addPages(new EntryPageText("knowledge.blackpowder.1"), new EntryPageGrind(new ItemStack(Items.coal), new ItemStack(ComponentListMF.coalDust)), new EntryPageRecipeCarpenter(KnowledgeListMF.blackpowderRec), new EntryPageRecipeCarpenter(KnowledgeListMF.crudeBombR)); - KnowledgeListMF.advblackpowder.addPages(new EntryPageText("knowledge.advblackpowder.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.advblackpowderRec)); - KnowledgeListMF.bombs.addPages(new EntryPageText("knowledge.bombs.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.bombBenchCraft), new EntryPageText("knowledge.bombs.2"), new EntryPageImage("textures/gui/knowledge/bombGuiExample.png", 128, 128, "knowledge.guiSubtitle"), new EntryPageText("knowledge.bombs.3"), new EntryPageText("knowledge.bombs.4")); - KnowledgeListMF.bpress.addPages(new EntryPageText("knowledge.bpress.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.bombPressCraft)); - KnowledgeListMF.bombarrow.addPages(new EntryPageText("knowledge.bombarrow.1"), new EntryPageRecipeAnvil(KnowledgeListMF.bombarrowR), new EntryPageRecipeAnvil(KnowledgeListMF.bombBoltR)); - KnowledgeListMF.shrapnel.addPages(new EntryPageText("knowledge.shrapnel.1"), new EntryPageGrind(new ItemStack(Items.flint), new ItemStack(ComponentListMF.shrapnel))); - KnowledgeListMF.firebomb.addPages(new EntryPageText("knowledge.firebomb.1"), new EntryPageText("knowledge.firebomb.2"), new EntryPageText("knowledge.firebomb.3"), new EntryPageRecipeCarpenter(KnowledgeListMF.magmaRefinedR)); - KnowledgeListMF.bombCeramic.addPages(new EntryPageText("knowledge.bombCeramic.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.bombCaseCeramicR), new EntryPageSmelting(ComponentListMF.bomb_casing_uncooked, ComponentListMF.bomb_casing)); - KnowledgeListMF.bombIron.addPages(new EntryPageText("knowledge.bombIron.1"), new EntryPageRecipeAnvil(KnowledgeListMF.bombCaseIronR)); - KnowledgeListMF.bombObsidian.addPages(new EntryPageText("knowledge.bombObsidian.1"), new EntryPageRecipeAnvil(KnowledgeListMF.bombCaseObsidianR)); - KnowledgeListMF.bombCrystal.addPages(new EntryPageText("knowledge.bombCrystal.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.bombCaseCrystalR)); - - KnowledgeListMF.mineCeramic.addPages(new EntryPageText("knowledge.mineCeramic.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.mineCaseCeramicR), new EntryPageSmelting(ComponentListMF.mine_casing_uncooked, ComponentListMF.mine_casing)); - KnowledgeListMF.mineIron.addPages(new EntryPageText("knowledge.mineIron.1"), new EntryPageRecipeAnvil(KnowledgeListMF.mineCaseIronR)); - KnowledgeListMF.mineObsidian.addPages(new EntryPageText("knowledge.mineObsidian.1"), new EntryPageRecipeAnvil(KnowledgeListMF.mineCaseObsidianR)); - KnowledgeListMF.mineCrystal.addPages(new EntryPageText("knowledge.mineCrystal.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.mineCaseCrystalR)); - KnowledgeListMF.bombFuse.addPages(new EntryPageText("knowledge.bombFuse.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.bombFuseR), new EntryPageText("knowledge.bombFuse.2"), new EntryPageRecipeCarpenter(KnowledgeListMF.longFuseR)); - KnowledgeListMF.stickybomb.addPages(new EntryPageText("knowledge.stickybomb.1"), new EntryPageText("knowledge.stickybomb.2")); - - KnowledgeListMF.crossbows.addPages(new EntryPageText("knowledge.crossbows.1"), new EntryPageText("knowledge.crossbows.2"), new EntryPageRecipeCarpenter(KnowledgeListMF.crossBenchCraft), new EntryPageText("knowledge.crossbows.3"), new EntryPageText("knowledge.crossbows.4"), new EntryPageText("knowledge.crossbows.5"), new EntryPageText("knowledge.crossbows.6"), new EntryPageRecipeAnvil(KnowledgeListMF.crossBoltR)); - KnowledgeListMF.crossShafts.addPages(new EntryPageText("knowledge.crossShafts.handle"), new EntryPageRecipeCarpenter(KnowledgeListMF.crossHandleWoodR), new EntryPageText("knowledge.crossShafts.stock"), new EntryPageRecipeCarpenter(KnowledgeListMF.crossStockWoodR)); - KnowledgeListMF.crossHeads.addPages(new EntryPageText("knowledge.crossHeads.light"), new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadLightR), new EntryPageText("knowledge.crossHeads.medium"), new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadMediumR), new EntryPageText("knowledge.crossHeads.heavy"), new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadHeavyR)); - KnowledgeListMF.crossHeadAdvanced.addPages(new EntryPageText("knowledge.crossHeads.advanced"), new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadAdvancedR)); - KnowledgeListMF.crossShaftAdvanced.addPages(new EntryPageText("knowledge.crossShafts.advanced"), new EntryPageRecipeCarpenter(KnowledgeListMF.crossStockIronR)); - KnowledgeListMF.crossScope.addPages(new EntryPageText("knowledge.crossScope.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.crossScopeR)); - KnowledgeListMF.crossAmmo.addPages(new EntryPageText("knowledge.crossAmmo.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.crossAmmoR)); - KnowledgeListMF.crossBayonet.addPages(new EntryPageText("knowledge.crossBayonet.1"), new EntryPageRecipeAnvil(KnowledgeListMF.crossBayonetR)); - - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.1"), new EntryPageText("knowledge.cogArmour.2")); - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.station"), new EntryPageRecipeAnvil(KnowledgeListMF.frameBlockR), assembleSimpleImgPage("cogwork_station", "knowledge.cogwork_station")); - //EXAMPLE - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.station.2"), new EntryPageRecipeAnvil(KnowledgeListMF.cogPulleyR), assembleSimpleImgPage("cogwork_station_2", "knowledge.rightclickspanner")); - - //RECIPE - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.crafting"), new EntryPageRecipeCarpenter(KnowledgeListMF.cogShaftR), new EntryPageRecipeAnvil(KnowledgeListMF.cogHelmR), new EntryPageRecipeAnvil(KnowledgeListMF.cogChestR), new EntryPageRecipeAnvil(KnowledgeListMF.cogLegsR), assembleSimpleImgPage("cogwork_suit_craft", "knowledge.rightclickspanner")); - - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.armour")); - KnowledgeListMF.cogArmour.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hugePlateR), new EntryPageRecipeAnvil(KnowledgeListMF.cogPlateR)); - - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.advantage"), new EntryPageText("knowledge.cogArmour.advantage.2"), new EntryPageText("knowledge.cogArmour.advantage.3")); - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.disadvantage"), new EntryPageText("knowledge.cogArmour.disadvantage.2")); - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.removal")); - - KnowledgeListMF.compPlate.addPages(new EntryPageText("knowledge.compPlate.1"), new EntryPageRecipeAnvil(KnowledgeListMF.compPlateR)); - //KnowledgeListMF.craftOrnateWeapons.addPages(new EntryPageText("knowledge.craftOrnateWeapons.1")); - - KnowledgeListMF.repair_basic.addPages(new EntryPageText("knowledge.repair_basic.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.repairBasicR)); - KnowledgeListMF.repair_advanced.addPages(new EntryPageText("knowledge.repair_advanced.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.repairAdvancedR)); - KnowledgeListMF.repair_ornate.addPages(new EntryPageText("knowledge.repair_ornate.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.repairOrnateR)); - - KnowledgeListMF.refined_planks.addPages(new EntryPageText("knowledge.refined_planks.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.nailPlanksR), new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankBlockR), new EntryPageRecipeCarpenter(KnowledgeListMF.nailStairR), new EntryPageRecipeCarpenter(KnowledgeListMF.refinedStairR)); - KnowledgeListMF.reinforced_stone.addPages(new EntryPageText("knowledge.reinforced_stone.1"), new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), new EntryPageCrucible(KnowledgeListMF.reStone)); - KnowledgeListMF.brickworks.addPages(new EntryPageText("knowledge.brickworks.1"), new EntryPageRecipeBase(KnowledgeListMF.stoneBricksR), new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickStairR)); - KnowledgeListMF.clay_wall.addPages(new EntryPageText("knowledge.clay_wall.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.clayWallR)); - KnowledgeListMF.glass.addPages(new EntryPageText("knowledge.glass.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.framedGlassR), new EntryPageRecipeCarpenter(KnowledgeListMF.windowR)); - KnowledgeListMF.thatch.addPages(new EntryPageText("knowledge.thatch.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.thatchR), new EntryPageRecipeCarpenter(KnowledgeListMF.thatchStairR)); - KnowledgeListMF.bars.addPages(new EntryPageText("knowledge.bars.1"), new EntryPageRecipeAnvil(KnowledgeListMF.barsR)); - KnowledgeListMF.paint_brush.addPages(new EntryPageText("knowledge.paint_brush.1"), new EntryPageRecipeAnvil(KnowledgeListMF.brushRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.easyPaintPlank)); - KnowledgeListMF.decorated_stone.addPages(new EntryPageText("knowledge.decorated_stone.1"), new EntryPageRecipeAnvil(KnowledgeListMF.framedStoneR), new EntryPageRecipeAnvil(KnowledgeListMF.iframedStoneR)); - - KnowledgeListMF.bed_roll.addPages(new EntryPageText("knowledge.bed_roll.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.bedrollR)); - KnowledgeListMF.tool_rack.addPages(new EntryPageText("knowledge.tool_rack.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.rackRecipe), new EntryPageText("knowledge.tool_rack.rules")); - KnowledgeListMF.food_box.addPages(new EntryPageText("knowledge.food_box.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.foodboxR), new EntryPageText("knowledge.ammo_box.2")); - KnowledgeListMF.ammo_box.addPages(new EntryPageText("knowledge.ammo_box.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.ammoboxR), new EntryPageText("knowledge.ammo_box.2")); - KnowledgeListMF.big_box.addPages(new EntryPageText("knowledge.big_box.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.bigboxR), new EntryPageText("knowledge.ammo_box.2")); - - KnowledgeListMF.constructionPts.addPages(new EntryPageText("knowledge.constructionPts.1")); - KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.sawnPlankR)); - KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.plankPaneR)); + + KnowledgeListMF.etools.addPages(new EntryPageText("knowledge.etools.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.spannerR), new EntryPageRecipeAnvil(KnowledgeListMF.eatoolsR)); + KnowledgeListMF.ecomponents.addPages(new EntryPageText("knowledge.ecomponents.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.boltR), new EntryPageText("knowledge.ecomponents.2"), + new EntryPageRecipeAnvil(KnowledgeListMF.iframeR), new EntryPageRecipeAnvil(KnowledgeListMF.bgearR), + new EntryPageRecipeAnvil(KnowledgeListMF.tgearR), new EntryPageRecipeAnvil(KnowledgeListMF.istrutR), + new EntryPageRecipeAnvil(KnowledgeListMF.stubeR)); + KnowledgeListMF.tungsten.addPages(new EntryPageText("knowledge.tungsten.1"), + new EntryPageText("knowledge.tungsten.2"), new EntryPageText("knowledge.tungsten.3"), + new EntryPageCrucible(KnowledgeListMF.wolframiteR)); + KnowledgeListMF.climber.addPages(new EntryPageText("knowledge.climber.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.climbPickbR), new EntryPageText("knowledge.climber.2")); + KnowledgeListMF.spyglass.addPages(new EntryPageText("knowledge.spyglass.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.spyglassR)); + KnowledgeListMF.parachute.addPages(new EntryPageText("knowledge.parachute.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.parachuteR)); + KnowledgeListMF.syringe.addPages(new EntryPageText("knowledge.syringe.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.syringeR)); + KnowledgeListMF.engTanner.addPages(new EntryPageText("knowledge.engTanner.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.engTannerR)); + KnowledgeListMF.advcrucible.addPages( + assembleSimpleImgPage("auto_crucible_example", BlockListMF.crucibleauto.getUnlocalizedName() + ".name"), + new EntryPageText("knowledge.advcrucible.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.autoCrucibleR), + new EntryPageText("knowledge.crucible2.blocks"), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), + assembleSimpleImgPage("auto_crucible", "knowledge.basicstructure")); + KnowledgeListMF.advforge.addPages(new EntryPageText("knowledge.advforge.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.advancedForgeR)); + KnowledgeListMF.coke.addPages(new EntryPageText("knowledge.coke.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.coalPrepR), + new EntryPageSmelting(ComponentListMF.coal_prep, ComponentListMF.coke)); + + KnowledgeListMF.blackpowder.addPages(new EntryPageText("knowledge.blackpowder.1"), + new EntryPageGrind(new ItemStack(Items.coal), new ItemStack(ComponentListMF.coalDust)), + new EntryPageRecipeCarpenter(KnowledgeListMF.blackpowderRec), + new EntryPageRecipeCarpenter(KnowledgeListMF.crudeBombR)); + KnowledgeListMF.advblackpowder.addPages(new EntryPageText("knowledge.advblackpowder.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.advblackpowderRec)); + KnowledgeListMF.bombs.addPages(new EntryPageText("knowledge.bombs.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bombBenchCraft), new EntryPageText("knowledge.bombs.2"), + new EntryPageImage("textures/gui/knowledge/bombGuiExample.png", 128, 128, "knowledge.guiSubtitle"), + new EntryPageText("knowledge.bombs.3"), new EntryPageText("knowledge.bombs.4")); + KnowledgeListMF.bpress.addPages(new EntryPageText("knowledge.bpress.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bombPressCraft)); + KnowledgeListMF.bombarrow.addPages(new EntryPageText("knowledge.bombarrow.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.bombarrowR), + new EntryPageRecipeAnvil(KnowledgeListMF.bombBoltR)); + KnowledgeListMF.shrapnel.addPages(new EntryPageText("knowledge.shrapnel.1"), + new EntryPageGrind(new ItemStack(Items.flint), new ItemStack(ComponentListMF.shrapnel))); + KnowledgeListMF.firebomb.addPages(new EntryPageText("knowledge.firebomb.1"), + new EntryPageText("knowledge.firebomb.2"), new EntryPageText("knowledge.firebomb.3"), + new EntryPageRecipeCarpenter(KnowledgeListMF.magmaRefinedR)); + KnowledgeListMF.bombCeramic.addPages(new EntryPageText("knowledge.bombCeramic.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bombCaseCeramicR), + new EntryPageSmelting(ComponentListMF.bomb_casing_uncooked, ComponentListMF.bomb_casing)); + KnowledgeListMF.bombIron.addPages(new EntryPageText("knowledge.bombIron.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.bombCaseIronR)); + KnowledgeListMF.bombObsidian.addPages(new EntryPageText("knowledge.bombObsidian.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.bombCaseObsidianR)); + KnowledgeListMF.bombCrystal.addPages(new EntryPageText("knowledge.bombCrystal.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bombCaseCrystalR)); + + KnowledgeListMF.mineCeramic.addPages(new EntryPageText("knowledge.mineCeramic.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.mineCaseCeramicR), + new EntryPageSmelting(ComponentListMF.mine_casing_uncooked, ComponentListMF.mine_casing)); + KnowledgeListMF.mineIron.addPages(new EntryPageText("knowledge.mineIron.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.mineCaseIronR)); + KnowledgeListMF.mineObsidian.addPages(new EntryPageText("knowledge.mineObsidian.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.mineCaseObsidianR)); + KnowledgeListMF.mineCrystal.addPages(new EntryPageText("knowledge.mineCrystal.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.mineCaseCrystalR)); + KnowledgeListMF.bombFuse.addPages(new EntryPageText("knowledge.bombFuse.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bombFuseR), new EntryPageText("knowledge.bombFuse.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.longFuseR)); + KnowledgeListMF.stickybomb.addPages(new EntryPageText("knowledge.stickybomb.1"), + new EntryPageText("knowledge.stickybomb.2")); + + KnowledgeListMF.crossbows.addPages(new EntryPageText("knowledge.crossbows.1"), + new EntryPageText("knowledge.crossbows.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossBenchCraft), + new EntryPageText("knowledge.crossbows.3"), new EntryPageText("knowledge.crossbows.4"), + new EntryPageText("knowledge.crossbows.5"), new EntryPageText("knowledge.crossbows.6"), + new EntryPageRecipeAnvil(KnowledgeListMF.crossBoltR)); + KnowledgeListMF.crossShafts.addPages(new EntryPageText("knowledge.crossShafts.handle"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossHandleWoodR), + new EntryPageText("knowledge.crossShafts.stock"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossStockWoodR)); + KnowledgeListMF.crossHeads.addPages(new EntryPageText("knowledge.crossHeads.light"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadLightR), + new EntryPageText("knowledge.crossHeads.medium"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadMediumR), + new EntryPageText("knowledge.crossHeads.heavy"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadHeavyR)); + KnowledgeListMF.crossHeadAdvanced.addPages(new EntryPageText("knowledge.crossHeads.advanced"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadAdvancedR)); + KnowledgeListMF.crossShaftAdvanced.addPages(new EntryPageText("knowledge.crossShafts.advanced"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossStockIronR)); + KnowledgeListMF.crossScope.addPages(new EntryPageText("knowledge.crossScope.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossScopeR)); + KnowledgeListMF.crossAmmo.addPages(new EntryPageText("knowledge.crossAmmo.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossAmmoR)); + KnowledgeListMF.crossBayonet.addPages(new EntryPageText("knowledge.crossBayonet.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.crossBayonetR)); + + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.1"), + new EntryPageText("knowledge.cogArmour.2")); + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.station"), + new EntryPageRecipeAnvil(KnowledgeListMF.frameBlockR), + assembleSimpleImgPage("cogwork_station", "knowledge.cogwork_station")); + // EXAMPLE + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.station.2"), + new EntryPageRecipeAnvil(KnowledgeListMF.cogPulleyR), + assembleSimpleImgPage("cogwork_station_2", "knowledge.rightclickspanner")); + + // RECIPE + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.crafting"), + new EntryPageRecipeCarpenter(KnowledgeListMF.cogShaftR), + new EntryPageRecipeAnvil(KnowledgeListMF.cogHelmR), new EntryPageRecipeAnvil(KnowledgeListMF.cogChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.cogLegsR), + assembleSimpleImgPage("cogwork_suit_craft", "knowledge.rightclickspanner")); + + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.armour")); + KnowledgeListMF.cogArmour.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hugePlateR), + new EntryPageRecipeAnvil(KnowledgeListMF.cogPlateR)); + + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.advantage"), + new EntryPageText("knowledge.cogArmour.advantage.2"), + new EntryPageText("knowledge.cogArmour.advantage.3")); + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.disadvantage"), + new EntryPageText("knowledge.cogArmour.disadvantage.2")); + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.removal")); + + KnowledgeListMF.compPlate.addPages(new EntryPageText("knowledge.compPlate.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.compPlateR)); + // KnowledgeListMF.craftOrnateWeapons.addPages(new + // EntryPageText("knowledge.craftOrnateWeapons.1")); + + KnowledgeListMF.repair_basic.addPages(new EntryPageText("knowledge.repair_basic.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.repairBasicR)); + KnowledgeListMF.repair_advanced.addPages(new EntryPageText("knowledge.repair_advanced.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.repairAdvancedR)); + KnowledgeListMF.repair_ornate.addPages(new EntryPageText("knowledge.repair_ornate.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.repairOrnateR)); + + KnowledgeListMF.refined_planks.addPages(new EntryPageText("knowledge.refined_planks.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.nailPlanksR), + new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankBlockR), + new EntryPageRecipeCarpenter(KnowledgeListMF.nailStairR), + new EntryPageRecipeCarpenter(KnowledgeListMF.refinedStairR)); + KnowledgeListMF.reinforced_stone.addPages(new EntryPageText("knowledge.reinforced_stone.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), + new EntryPageCrucible(KnowledgeListMF.reStone)); + KnowledgeListMF.brickworks.addPages(new EntryPageText("knowledge.brickworks.1"), + new EntryPageRecipeBase(KnowledgeListMF.stoneBricksR), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickStairR)); + KnowledgeListMF.clay_wall.addPages(new EntryPageText("knowledge.clay_wall.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.clayWallR)); + KnowledgeListMF.glass.addPages(new EntryPageText("knowledge.glass.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.framedGlassR), + new EntryPageRecipeCarpenter(KnowledgeListMF.windowR)); + KnowledgeListMF.thatch.addPages(new EntryPageText("knowledge.thatch.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.thatchR), + new EntryPageRecipeCarpenter(KnowledgeListMF.thatchStairR)); + KnowledgeListMF.bars.addPages(new EntryPageText("knowledge.bars.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.barsR)); + KnowledgeListMF.paint_brush.addPages(new EntryPageText("knowledge.paint_brush.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.brushRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.easyPaintPlank)); + KnowledgeListMF.decorated_stone.addPages(new EntryPageText("knowledge.decorated_stone.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.framedStoneR), + new EntryPageRecipeAnvil(KnowledgeListMF.iframedStoneR)); + + KnowledgeListMF.bed_roll.addPages(new EntryPageText("knowledge.bed_roll.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bedrollR)); + KnowledgeListMF.tool_rack.addPages(new EntryPageText("knowledge.tool_rack.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.rackRecipe), + new EntryPageText("knowledge.tool_rack.rules")); + KnowledgeListMF.food_box.addPages(new EntryPageText("knowledge.food_box.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.foodboxR), new EntryPageText("knowledge.ammo_box.2")); + KnowledgeListMF.ammo_box.addPages(new EntryPageText("knowledge.ammo_box.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.ammoboxR), new EntryPageText("knowledge.ammo_box.2")); + KnowledgeListMF.big_box.addPages(new EntryPageText("knowledge.big_box.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bigboxR), new EntryPageText("knowledge.ammo_box.2")); + + KnowledgeListMF.constructionPts.addPages(new EntryPageText("knowledge.constructionPts.1")); + KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.sawnPlankR)); + KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.plankPaneR)); KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hingeRecipe)); - KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), new EntryPageRecipeBase(KnowledgeListMF.plantOilR), new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankR)); - - if(ConfigHardcore.HCCallowRocks) - { - KnowledgeListMF.craftHCCTools.addPages(new EntryPageText("knowledge.craftHCCTools.1"), new EntryPageText("knowledge.craftHCCTools.2")); - KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.sharpRocksR), new EntryPageText("knowledge.craftHCCTools.3")); - KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stonePickR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpadeR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAxeR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHoeR)); - KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), new EntryPageRecipeCarpenter(KnowledgeListMF.boneNeedleR)); - KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSwordR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneMaceR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneWarR), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpearR)); + KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), + new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), + new EntryPageRecipeBase(KnowledgeListMF.plantOilR), + new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankR)); + + if (ConfigHardcore.HCCallowRocks) { + KnowledgeListMF.craftHCCTools.addPages(new EntryPageText("knowledge.craftHCCTools.1"), + new EntryPageText("knowledge.craftHCCTools.2")); + KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.sharpRocksR), + new EntryPageText("knowledge.craftHCCTools.3")); + KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stonePickR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpadeR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAxeR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHoeR)); + KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), + new EntryPageRecipeCarpenter(KnowledgeListMF.boneNeedleR)); + KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSwordR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneMaceR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneWarR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpearR)); } - KnowledgeListMF.craftTools.addPages(new EntryPageText("knowledge.craftTools.1")); - KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.pickR)); - KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.axeR)); - KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.spadeR)); - KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hoeR)); - KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.shearsR)); - - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.craftAdvTools.1")); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.handpickR)); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.hvypick.info"), new EntryPageRecipeAnvil(KnowledgeListMF.hvyPickR)); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.trow.info"), new EntryPageRecipeAnvil(KnowledgeListMF.trowR)); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.hvyshovel.info"), new EntryPageRecipeAnvil(KnowledgeListMF.hvyShovelR)); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.scythe.info"), new EntryPageRecipeAnvil(KnowledgeListMF.scytheR)); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.mattock.info"), new EntryPageRecipeAnvil(KnowledgeListMF.mattockR), new EntryPageText("knowledge.mattock.use")); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.lumber.info"), new EntryPageRecipeAnvil(KnowledgeListMF.lumberR)); - - KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.dryrocks.info"), new EntryPageRecipeBase(KnowledgeListMF.dryrocksR)); - KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.tinderbox.info"), new EntryPageRecipeAnvil(KnowledgeListMF.tinderboxR)); - KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.flintsteel.info"), new EntryPageRecipeAnvil(KnowledgeListMF.flintAndSteelR)); - - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.craftCrafters.1")); - KnowledgeListMF.craftCrafters.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), new EntryPageRecipeAnvil(KnowledgeListMF.hammerR), new EntryPageText("")); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.hvyhammer.info"), new EntryPageRecipeAnvil(KnowledgeListMF.hvyHammerR)); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.tongs.info"), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), new EntryPageRecipeAnvil(KnowledgeListMF.tongsR), new EntryPageText("")); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.knife.info"), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR), new EntryPageRecipeAnvil(KnowledgeListMF.knifeR), new EntryPageText("")); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.saw.info"), new EntryPageRecipeAnvil(KnowledgeListMF.sawsR)); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.needle.info"), new EntryPageRecipeCarpenter(KnowledgeListMF.boneNeedleR), new EntryPageRecipeAnvil(KnowledgeListMF.needleR), new EntryPageText("")); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.mallet.info"), new EntryPageRecipeCarpenter(KnowledgeListMF.malletR)); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.spoon.info"), new EntryPageRecipeCarpenter(KnowledgeListMF.spoonR)); - - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.craftWeapons.1")); - KnowledgeListMF.craftWeapons.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.daggerR)); - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.sword.info"), new EntryPageRecipeAnvil(KnowledgeListMF.swordR)); - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.waraxe.info"), new EntryPageRecipeAnvil(KnowledgeListMF.waraxeR)); - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.mace.info"), new EntryPageRecipeAnvil(KnowledgeListMF.maceR)); - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.spear.info"), new EntryPageRecipeAnvil(KnowledgeListMF.spearR)); - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.bow.info"), new EntryPageRecipeAnvil(KnowledgeListMF.bowR)); - - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.craftAdvWeapons.1")); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.katanaR)); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.greatsword.info"), new EntryPageRecipeAnvil(KnowledgeListMF.gswordR)); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.battleaxe.info"), new EntryPageRecipeAnvil(KnowledgeListMF.battleaxeR)); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.warhammer.info"), new EntryPageRecipeAnvil(KnowledgeListMF.whammerR)); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.halbeard.info"), new EntryPageRecipeAnvil(KnowledgeListMF.halbeardR)); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.lance.info"), new EntryPageRecipeAnvil(KnowledgeListMF.lanceR)); - - KnowledgeListMF.arrows.addPages(new EntryPageText("knowledge.arrows.1")); - KnowledgeListMF.arrows.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.fletchingR), new EntryPageRecipeCarpenter(KnowledgeListMF.fletchingR2)); - KnowledgeListMF.arrows.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.arrowheadR)); - KnowledgeListMF.arrows.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.arrowR)); - KnowledgeListMF.arrowsBodkin.addPages(new EntryPageText("knowledge.arrowsBodkin.1")); - KnowledgeListMF.arrowsBodkin.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.bodkinheadR)); - KnowledgeListMF.arrowsBroad.addPages(new EntryPageText("knowledge.arrowsBroad.1")); - KnowledgeListMF.arrowsBroad.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.broadheadR)); - - KnowledgeListMF.smeltBlackSteel.addPages(new EntryPageText("knowledge.smeltBlackSteel.1"), new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), new EntryPageCrucible(KnowledgeListMF.black), new EntryPageBlastFurnace(ComponentListMF.ingots[6], black)); - KnowledgeListMF.smeltRedSteel.addPages(new EntryPageText("knowledge.smeltRedSteel.1"), new EntryPageCrucible(KnowledgeListMF.red), new EntryPageBlastFurnace(ComponentListMF.ingots[9], red)); - KnowledgeListMF.smeltBlueSteel.addPages(new EntryPageText("knowledge.smeltBlueSteel.1"), new EntryPageCrucible(KnowledgeListMF.blue), new EntryPageBlastFurnace(ComponentListMF.ingots[11], blue)); - KnowledgeListMF.smeltAdamant.addPages(new EntryPageText("knowledge.smeltAdamantium.1"), new EntryPageText("knowledge.smeltAdamantium.2"), new EntryPageCrucible(KnowledgeListMF.adamantium)); - KnowledgeListMF.smeltMithril.addPages(new EntryPageText("knowledge.smeltMithril.1"), new EntryPageText("knowledge.smeltMithril.2"), new EntryPageCrucible(KnowledgeListMF.mithril)); - - KnowledgeListMF.smeltMaster.addPages(new EntryPageText("knowledge.smeltMaster.1"), new EntryPageText("knowledge.smeltMaster.2"), new EntryPageText("knowledge.smeltMaster.3")); - KnowledgeListMF.smeltMaster.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.trilogyRecipe)); - KnowledgeListMF.smeltIgnotumite.addPages(new EntryPageText("knowledge.smeltIgnotumite.1"), new EntryPageCrucible(KnowledgeListMF.ignotumite)); - KnowledgeListMF.smeltMithium.addPages(new EntryPageText("knowledge.smeltMithium.1"), new EntryPageCrucible(KnowledgeListMF.mithium)); - KnowledgeListMF.smeltEnderforge.addPages(new EntryPageText("knowledge.smeltEnderforge.1"), new EntryPageCrucible(KnowledgeListMF.enderforge)); - - KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.1"), new EntryPageRecipeBase(KnowledgeListMF.firepitRecipe)); - KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.2"), new EntryPageRecipeBase(KnowledgeListMF.cooktopRecipe)); - KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.3"), new EntryPageRecipeCarpenter(KnowledgeListMF.stoneovenRecipe)); - KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.4")); - - KnowledgeListMF.cookingutensil.addPages(new EntryPageText("knowledge.cookingutensil.1"), new EntryPageRecipeAnvil(KnowledgeListMF.caketinRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.pieTrayRecipe), new EntryPageSmelting(ComponentListMF.pie_tray_uncooked, FoodListMF.pie_tray)); - KnowledgeListMF.salt.addPages(new EntryPageText("knowledge.salt.1"), new EntryPageSmelting(new ItemStack(FoodListMF.bowl_water_salt), new ItemStack(FoodListMF.salt))); - KnowledgeListMF.jug.addPages(new EntryPageText("knowledge.jug.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), new EntryPageText("knowledge.jug.2"), new EntryPageRecipeBase(KnowledgeListMF.waterJugR), new EntryPageRecipeBase(KnowledgeListMF.milkJugR)); - - KnowledgeListMF.generic_meat.addPages(new EntryPageText("knowledge.generic_meat.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.meatRecipes), new EntryPageRecipeCarpenter(KnowledgeListMF.meatStripR), new EntryPageRecipeCarpenter(KnowledgeListMF.meatHunkR), new EntryPageGrind(new ItemStack(FoodListMF.generic_meat_uncooked), new ItemStack(FoodListMF.generic_meat_mince_uncooked))); - KnowledgeListMF.stew.addPages(new EntryPageText("knowledge.stew.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.stewRecipe)); - KnowledgeListMF.jerky.addPages(new EntryPageText("knowledge.jerky.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.jerkyRecipe)); - KnowledgeListMF.saussage.addPages(new EntryPageText("knowledge.saussage.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.gutsRecipe), new EntryPageGrind(new ItemStack(FoodListMF.breadroll), new ItemStack(FoodListMF.breadcrumbs)), new EntryPageRecipeCarpenter(KnowledgeListMF.saussageR), new EntryPageSmelting(new ItemStack(FoodListMF.saussage_raw), new ItemStack(FoodListMF.saussage_cooked))); - KnowledgeListMF.sandwitch.addPages(new EntryPageText("knowledge.sandwitch.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.breadSliceR), new EntryPageRecipeCarpenter(KnowledgeListMF.sandwitchRecipe)); - KnowledgeListMF.sandwitchBig.addPages(new EntryPageText("knowledge.sandwitchBig.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.sandwitchBigRecipe)); - KnowledgeListMF.meatpie.addPages(new EntryPageText("knowledge.meatpie.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.meatPieRecipe), new EntryPageSmelting(new ItemStack(FoodListMF.pie_meat_uncooked), new ItemStack(FoodListMF.pie_meat_cooked)), new EntryPageRecipeBase(KnowledgeListMF.meatpieOut)); - KnowledgeListMF.shepardpie.addPages(new EntryPageText("knowledge.shepardpie.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.shepardRecipe), new EntryPageSmelting(new ItemStack(FoodListMF.pie_shepard_uncooked), new ItemStack(FoodListMF.pie_shepard_cooked)), new EntryPageRecipeBase(KnowledgeListMF.shepardOut)); - - KnowledgeListMF.bread.addPages(new EntryPageText("knowledge.bread.1"), new EntryPageGrind(new ItemStack(Items.wheat), new ItemStack(FoodListMF.flour)), new EntryPageRecipeCarpenter(KnowledgeListMF.doughRecipe), new EntryPageSmelting(new ItemStack(FoodListMF.dough), new ItemStack(FoodListMF.breadroll)), new EntryPageRecipeCarpenter(KnowledgeListMF.breadRecipe), new EntryPageSmelting(new ItemStack(FoodListMF.raw_bread), new ItemStack(Items.bread)), new EntryPageRecipeCarpenter(KnowledgeListMF.pastryRecipe), new EntryPageGrind(new ItemStack(FoodListMF.breadroll), new ItemStack(FoodListMF.breadcrumbs))); - KnowledgeListMF.bread.addPages(new EntryPageText("knowledge.bread.other"), new EntryPageRecipeCarpenter(KnowledgeListMF.pumpPieR), new EntryPageSmelting(new ItemStack(FoodListMF.pie_pumpkin_uncooked), new ItemStack(FoodListMF.pie_pumpkin_cooked)), new EntryPageRecipeBase(KnowledgeListMF.pumpPieOut)); - KnowledgeListMF.bread.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.simpCakeR), new EntryPageSmelting(new ItemStack(FoodListMF.cake_simple_raw), new ItemStack(FoodListMF.cake_simple_uniced)), new EntryPageRecipeCarpenter(KnowledgeListMF.simpCakeOut)); - - KnowledgeListMF.oats.addPages(new EntryPageText("knowledge.oats.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.oatsRecipe)); - - KnowledgeListMF.berry.addPages(assembleImgPage("berry", BlockListMF.berryBush)); - KnowledgeListMF.icing.addPages(new EntryPageText("knowledge.icing.1"), new EntryPageGrind(new ItemStack(Items.reeds), new ItemStack(FoodListMF.sugarpot)), new EntryPageRecipeBase(KnowledgeListMF.sugarRecipe), new EntryPageText("knowledge.icing.2"), new EntryPageRecipeCarpenter(KnowledgeListMF.icingRecipe)); - KnowledgeListMF.sweetroll.addPages(new EntryPageText("knowledge.sweetroll.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.sweetrollRecipe), new EntryPageSmelting(new ItemStack(FoodListMF.sweetroll_raw), new ItemStack(FoodListMF.sweetroll_uniced)), new EntryPageRecipeCarpenter(KnowledgeListMF.iceSR)); - KnowledgeListMF.cake.addPages(new EntryPageText("knowledge.cake.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.cakeR), new EntryPageSmelting(new ItemStack(FoodListMF.cake_raw), new ItemStack(FoodListMF.cake_uniced)), new EntryPageRecipeCarpenter(KnowledgeListMF.cakeI)); - KnowledgeListMF.carrotcake.addPages(new EntryPageText("knowledge.carrotcake.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.carrotCakeR), new EntryPageSmelting(new ItemStack(FoodListMF.cake_carrot_raw), new ItemStack(FoodListMF.cake_carrot_uniced)), new EntryPageRecipeCarpenter(KnowledgeListMF.carrotCakeI)); - KnowledgeListMF.chococake.addPages(new EntryPageText("knowledge.chococake.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.chocoCakeR), new EntryPageSmelting(new ItemStack(FoodListMF.cake_choc_raw), new ItemStack(FoodListMF.cake_choc_uniced)), new EntryPageRecipeCarpenter(KnowledgeListMF.chocoCakeI)); - KnowledgeListMF.bfcake.addPages(new EntryPageText("knowledge.bfcake.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.bfCakeR), new EntryPageSmelting(new ItemStack(FoodListMF.cake_bf_raw), new ItemStack(FoodListMF.cake_bf_uniced)), new EntryPageRecipeCarpenter(KnowledgeListMF.bfCakeI)); - KnowledgeListMF.berrypie.addPages(new EntryPageText("knowledge.berrypie.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.berryR), new EntryPageSmelting(new ItemStack(FoodListMF.pie_berry_uncooked), new ItemStack(FoodListMF.pie_berry_cooked)), new EntryPageRecipeBase(KnowledgeListMF.berryOut)); - KnowledgeListMF.applepie.addPages(new EntryPageText("knowledge.applepie.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.appleR), new EntryPageSmelting(new ItemStack(FoodListMF.pie_apple_uncooked), new ItemStack(FoodListMF.pie_apple_cooked)), new EntryPageRecipeBase(KnowledgeListMF.appleOut)); - KnowledgeListMF.eclair.addPages(new EntryPageText("knowledge.eclair.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.eclairDoughR), new EntryPageSmelting(new ItemStack(FoodListMF.eclair_raw), new ItemStack(FoodListMF.eclair_uniced)), new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.eclairIceR), new EntryPageRecipeCarpenter(KnowledgeListMF.custardRecipe), new EntryPageRecipeCarpenter(KnowledgeListMF.eclairFillR)); - - KnowledgeListMF.cheese.addPages(new EntryPageText("knowledge.cheese.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.curdRecipe), new EntryPageSmelting(new ItemStack(FoodListMF.curds), new ItemStack(FoodListMF.cheese_pot)), new EntryPageRecipeBase(KnowledgeListMF.cheeseOut)); - KnowledgeListMF.cheeseroll.addPages(new EntryPageText("knowledge.cheeseroll.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.cheeserollR)); - - KnowledgeListMF.bandage.addPages(new EntryPageText("knowledge.bandage.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.badBandageR), new EntryPageRecipeCarpenter(KnowledgeListMF.bandageR)); - KnowledgeListMF.bandageadv.addPages(new EntryPageText("knowledge.bandageadv.1"), new EntryPageRecipeCarpenter(KnowledgeListMF.goodBandageR)); - - //MASTERY - KnowledgeListMF.toughness.addPages(new EntryPageText("knowledge.toughness.1")); - KnowledgeListMF.fitness.addPages(new EntryPageText("knowledge.fitness.1")); - KnowledgeListMF.armourpro.addPages(new EntryPageText("knowledge.armourpro.1")); - KnowledgeListMF.parrypro.addPages(new EntryPageText("knowledge.parrypro.1")); - KnowledgeListMF.counteratt.addPages(new EntryPageText("knowledge.counteratt.1"), new EntryPageText("knowledge.counteratt.2")); - KnowledgeListMF.autoparry.addPages(new EntryPageText("knowledge.autoparry.1")); - KnowledgeListMF.firstaid.addPages(new EntryPageText("knowledge.firstaid.1")); - KnowledgeListMF.doctor.addPages(new EntryPageText("knowledge.doctor.1")); - KnowledgeListMF.scrapper.addPages(new EntryPageText("knowledge.scrapper.1")); + KnowledgeListMF.craftTools.addPages(new EntryPageText("knowledge.craftTools.1")); + KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.pickR)); + KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.axeR)); + KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.spadeR)); + KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hoeR)); + KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.shearsR)); + + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.craftAdvTools.1")); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.handpickR)); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.hvypick.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.hvyPickR)); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.trow.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.trowR)); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.hvyshovel.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.hvyShovelR)); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.scythe.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.scytheR)); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.mattock.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.mattockR), new EntryPageText("knowledge.mattock.use")); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.lumber.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.lumberR)); + + KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.dryrocks.info"), + new EntryPageRecipeBase(KnowledgeListMF.dryrocksR)); + KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.tinderbox.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.tinderboxR)); + KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.flintsteel.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.flintAndSteelR)); + + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.craftCrafters.1")); + KnowledgeListMF.craftCrafters.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), + new EntryPageRecipeAnvil(KnowledgeListMF.hammerR), new EntryPageText("")); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.hvyhammer.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.hvyHammerR)); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.tongs.info"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), + new EntryPageRecipeAnvil(KnowledgeListMF.tongsR), new EntryPageText("")); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.knife.info"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR), + new EntryPageRecipeAnvil(KnowledgeListMF.knifeR), new EntryPageText("")); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.saw.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.sawsR)); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.needle.info"), + new EntryPageRecipeCarpenter(KnowledgeListMF.boneNeedleR), + new EntryPageRecipeAnvil(KnowledgeListMF.needleR), new EntryPageText("")); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.mallet.info"), + new EntryPageRecipeCarpenter(KnowledgeListMF.malletR)); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.spoon.info"), + new EntryPageRecipeCarpenter(KnowledgeListMF.spoonR)); + + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.craftWeapons.1")); + KnowledgeListMF.craftWeapons.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.daggerR)); + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.sword.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.swordR)); + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.waraxe.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.waraxeR)); + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.mace.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.maceR)); + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.spear.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.spearR)); + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.bow.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.bowR)); + + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.craftAdvWeapons.1")); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.katanaR)); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.greatsword.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.gswordR)); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.battleaxe.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.battleaxeR)); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.warhammer.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.whammerR)); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.halbeard.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.halbeardR)); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.lance.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.lanceR)); + + KnowledgeListMF.arrows.addPages(new EntryPageText("knowledge.arrows.1")); + KnowledgeListMF.arrows.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.fletchingR), + new EntryPageRecipeCarpenter(KnowledgeListMF.fletchingR2)); + KnowledgeListMF.arrows.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.arrowheadR)); + KnowledgeListMF.arrows.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.arrowR)); + KnowledgeListMF.arrowsBodkin.addPages(new EntryPageText("knowledge.arrowsBodkin.1")); + KnowledgeListMF.arrowsBodkin.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.bodkinheadR)); + KnowledgeListMF.arrowsBroad.addPages(new EntryPageText("knowledge.arrowsBroad.1")); + KnowledgeListMF.arrowsBroad.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.broadheadR)); + + KnowledgeListMF.smeltBlackSteel.addPages(new EntryPageText("knowledge.smeltBlackSteel.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), new EntryPageCrucible(KnowledgeListMF.black), + new EntryPageBlastFurnace(ComponentListMF.ingots[6], black)); + KnowledgeListMF.smeltRedSteel.addPages(new EntryPageText("knowledge.smeltRedSteel.1"), + new EntryPageCrucible(KnowledgeListMF.red), new EntryPageBlastFurnace(ComponentListMF.ingots[9], red)); + KnowledgeListMF.smeltBlueSteel.addPages(new EntryPageText("knowledge.smeltBlueSteel.1"), + new EntryPageCrucible(KnowledgeListMF.blue), + new EntryPageBlastFurnace(ComponentListMF.ingots[11], blue)); + KnowledgeListMF.smeltAdamant.addPages(new EntryPageText("knowledge.smeltAdamantium.1"), + new EntryPageText("knowledge.smeltAdamantium.2"), new EntryPageCrucible(KnowledgeListMF.adamantium)); + KnowledgeListMF.smeltMithril.addPages(new EntryPageText("knowledge.smeltMithril.1"), + new EntryPageText("knowledge.smeltMithril.2"), new EntryPageCrucible(KnowledgeListMF.mithril)); + + KnowledgeListMF.smeltMaster.addPages(new EntryPageText("knowledge.smeltMaster.1"), + new EntryPageText("knowledge.smeltMaster.2"), new EntryPageText("knowledge.smeltMaster.3")); + KnowledgeListMF.smeltMaster.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.trilogyRecipe)); + KnowledgeListMF.smeltIgnotumite.addPages(new EntryPageText("knowledge.smeltIgnotumite.1"), + new EntryPageCrucible(KnowledgeListMF.ignotumite)); + KnowledgeListMF.smeltMithium.addPages(new EntryPageText("knowledge.smeltMithium.1"), + new EntryPageCrucible(KnowledgeListMF.mithium)); + KnowledgeListMF.smeltEnderforge.addPages(new EntryPageText("knowledge.smeltEnderforge.1"), + new EntryPageCrucible(KnowledgeListMF.enderforge)); + + KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.1"), + new EntryPageRecipeBase(KnowledgeListMF.firepitRecipe)); + KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.2"), + new EntryPageRecipeBase(KnowledgeListMF.cooktopRecipe)); + KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.3"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneovenRecipe)); + KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.4")); + + KnowledgeListMF.cookingutensil.addPages(new EntryPageText("knowledge.cookingutensil.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.caketinRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.pieTrayRecipe), + new EntryPageSmelting(ComponentListMF.pie_tray_uncooked, FoodListMF.pie_tray)); + KnowledgeListMF.salt.addPages(new EntryPageText("knowledge.salt.1"), + new EntryPageSmelting(new ItemStack(FoodListMF.bowl_water_salt), new ItemStack(FoodListMF.salt))); + KnowledgeListMF.jug.addPages(new EntryPageText("knowledge.jug.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), + new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), + new EntryPageText("knowledge.jug.2"), new EntryPageRecipeBase(KnowledgeListMF.waterJugR), + new EntryPageRecipeBase(KnowledgeListMF.milkJugR)); + + KnowledgeListMF.generic_meat.addPages(new EntryPageText("knowledge.generic_meat.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.meatRecipes), + new EntryPageRecipeCarpenter(KnowledgeListMF.meatStripR), + new EntryPageRecipeCarpenter(KnowledgeListMF.meatHunkR), + new EntryPageGrind(new ItemStack(FoodListMF.generic_meat_uncooked), + new ItemStack(FoodListMF.generic_meat_mince_uncooked))); + KnowledgeListMF.stew.addPages(new EntryPageText("knowledge.stew.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stewRecipe)); + KnowledgeListMF.jerky.addPages(new EntryPageText("knowledge.jerky.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.jerkyRecipe)); + KnowledgeListMF.saussage.addPages(new EntryPageText("knowledge.saussage.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.gutsRecipe), + new EntryPageGrind(new ItemStack(FoodListMF.breadroll), new ItemStack(FoodListMF.breadcrumbs)), + new EntryPageRecipeCarpenter(KnowledgeListMF.saussageR), new EntryPageSmelting( + new ItemStack(FoodListMF.saussage_raw), new ItemStack(FoodListMF.saussage_cooked))); + KnowledgeListMF.sandwitch.addPages(new EntryPageText("knowledge.sandwitch.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.breadSliceR), + new EntryPageRecipeCarpenter(KnowledgeListMF.sandwitchRecipe)); + KnowledgeListMF.sandwitchBig.addPages(new EntryPageText("knowledge.sandwitchBig.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.sandwitchBigRecipe)); + KnowledgeListMF.meatpie.addPages(new EntryPageText("knowledge.meatpie.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.meatPieRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.pie_meat_uncooked), + new ItemStack(FoodListMF.pie_meat_cooked)), + new EntryPageRecipeBase(KnowledgeListMF.meatpieOut)); + KnowledgeListMF.shepardpie.addPages(new EntryPageText("knowledge.shepardpie.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.shepardRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.pie_shepard_uncooked), + new ItemStack(FoodListMF.pie_shepard_cooked)), + new EntryPageRecipeBase(KnowledgeListMF.shepardOut)); + + KnowledgeListMF.bread.addPages(new EntryPageText("knowledge.bread.1"), + new EntryPageGrind(new ItemStack(Items.wheat), new ItemStack(FoodListMF.flour)), + new EntryPageRecipeCarpenter(KnowledgeListMF.doughRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.dough), new ItemStack(FoodListMF.breadroll)), + new EntryPageRecipeCarpenter(KnowledgeListMF.breadRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.raw_bread), new ItemStack(Items.bread)), + new EntryPageRecipeCarpenter(KnowledgeListMF.pastryRecipe), + new EntryPageGrind(new ItemStack(FoodListMF.breadroll), new ItemStack(FoodListMF.breadcrumbs))); + KnowledgeListMF.bread.addPages(new EntryPageText("knowledge.bread.other"), + new EntryPageRecipeCarpenter(KnowledgeListMF.pumpPieR), + new EntryPageSmelting(new ItemStack(FoodListMF.pie_pumpkin_uncooked), + new ItemStack(FoodListMF.pie_pumpkin_cooked)), + new EntryPageRecipeBase(KnowledgeListMF.pumpPieOut)); + KnowledgeListMF.bread.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.simpCakeR), + new EntryPageSmelting(new ItemStack(FoodListMF.cake_simple_raw), + new ItemStack(FoodListMF.cake_simple_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.simpCakeOut)); + + KnowledgeListMF.oats.addPages(new EntryPageText("knowledge.oats.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.oatsRecipe)); + + KnowledgeListMF.berry.addPages(assembleImgPage("berry", BlockListMF.berryBush)); + KnowledgeListMF.icing.addPages(new EntryPageText("knowledge.icing.1"), + new EntryPageGrind(new ItemStack(Items.reeds), new ItemStack(FoodListMF.sugarpot)), + new EntryPageRecipeBase(KnowledgeListMF.sugarRecipe), new EntryPageText("knowledge.icing.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.icingRecipe)); + KnowledgeListMF.sweetroll.addPages(new EntryPageText("knowledge.sweetroll.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.sweetrollRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.sweetroll_raw), + new ItemStack(FoodListMF.sweetroll_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.iceSR)); + KnowledgeListMF.cake.addPages(new EntryPageText("knowledge.cake.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.cakeR), + new EntryPageSmelting(new ItemStack(FoodListMF.cake_raw), new ItemStack(FoodListMF.cake_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.cakeI)); + KnowledgeListMF.carrotcake.addPages(new EntryPageText("knowledge.carrotcake.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.carrotCakeR), + new EntryPageSmelting(new ItemStack(FoodListMF.cake_carrot_raw), + new ItemStack(FoodListMF.cake_carrot_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.carrotCakeI)); + KnowledgeListMF.chococake.addPages(new EntryPageText("knowledge.chococake.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.chocoCakeR), + new EntryPageSmelting(new ItemStack(FoodListMF.cake_choc_raw), + new ItemStack(FoodListMF.cake_choc_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.chocoCakeI)); + KnowledgeListMF.bfcake.addPages(new EntryPageText("knowledge.bfcake.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.bfCakeR), + new EntryPageSmelting(new ItemStack(FoodListMF.cake_bf_raw), new ItemStack(FoodListMF.cake_bf_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.bfCakeI)); + KnowledgeListMF.berrypie + .addPages(new EntryPageText("knowledge.berrypie.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.berryR), + new EntryPageSmelting(new ItemStack(FoodListMF.pie_berry_uncooked), + new ItemStack(FoodListMF.pie_berry_cooked)), + new EntryPageRecipeBase(KnowledgeListMF.berryOut)); + KnowledgeListMF.applepie + .addPages(new EntryPageText("knowledge.applepie.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.appleR), + new EntryPageSmelting(new ItemStack(FoodListMF.pie_apple_uncooked), + new ItemStack(FoodListMF.pie_apple_cooked)), + new EntryPageRecipeBase(KnowledgeListMF.appleOut)); + KnowledgeListMF.eclair.addPages(new EntryPageText("knowledge.eclair.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.eclairDoughR), + new EntryPageSmelting(new ItemStack(FoodListMF.eclair_raw), new ItemStack(FoodListMF.eclair_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.eclairIceR), + new EntryPageRecipeCarpenter(KnowledgeListMF.custardRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.eclairFillR)); + + KnowledgeListMF.cheese.addPages(new EntryPageText("knowledge.cheese.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.curdRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.curds), new ItemStack(FoodListMF.cheese_pot)), + new EntryPageRecipeBase(KnowledgeListMF.cheeseOut)); + KnowledgeListMF.cheeseroll.addPages(new EntryPageText("knowledge.cheeseroll.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.cheeserollR)); + + KnowledgeListMF.bandage.addPages(new EntryPageText("knowledge.bandage.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.badBandageR), + new EntryPageRecipeCarpenter(KnowledgeListMF.bandageR)); + KnowledgeListMF.bandageadv.addPages(new EntryPageText("knowledge.bandageadv.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.goodBandageR)); + + // MASTERY + KnowledgeListMF.toughness.addPages(new EntryPageText("knowledge.toughness.1")); + KnowledgeListMF.fitness.addPages(new EntryPageText("knowledge.fitness.1")); + KnowledgeListMF.armourpro.addPages(new EntryPageText("knowledge.armourpro.1")); + KnowledgeListMF.parrypro.addPages(new EntryPageText("knowledge.parrypro.1")); + KnowledgeListMF.counteratt.addPages(new EntryPageText("knowledge.counteratt.1"), + new EntryPageText("knowledge.counteratt.2")); + KnowledgeListMF.autoparry.addPages(new EntryPageText("knowledge.autoparry.1")); + KnowledgeListMF.firstaid.addPages(new EntryPageText("knowledge.firstaid.1")); + KnowledgeListMF.doctor.addPages(new EntryPageText("knowledge.doctor.1")); + KnowledgeListMF.scrapper.addPages(new EntryPageText("knowledge.scrapper.1")); } - - private static EntryPage[] assembleOreDesc(String orename, Block ore, Item ingot) - { - return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/"+orename+".png", 96, 96, "knowledge.ores."+orename), new EntryPageSmelting(new ItemStack(ore), new ItemStack(ingot))}; + + private static EntryPage[] assembleOreDesc(String orename, Block ore, Item ingot) { + return new EntryPage[] { new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, + "knowledge.ores." + orename), new EntryPageSmelting(new ItemStack(ore), new ItemStack(ingot)) }; } - private static EntryPage[] assembleOreDescHC(String orename, Block ore, Item ingot) - { - if(ConfigHardcore.HCCreduceIngots) - { - return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/"+orename+".png", 96, 96, "knowledge.ores."+orename), new EntryPageRecipeBloom(new ItemStack(ore), new ItemStack(ingot))}; + + private static EntryPage[] assembleOreDescHC(String orename, Block ore, Item ingot) { + if (ConfigHardcore.HCCreduceIngots) { + return new EntryPage[] { + new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, + "knowledge.ores." + orename), + new EntryPageRecipeBloom(new ItemStack(ore), new ItemStack(ingot)) }; } return assembleOreDesc(orename, ore, ingot); } - private static EntryPage[] assembleOreDesc(String orename, Block ore) - { - return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/"+orename+".png", 96, 96, "knowledge.ores."+orename)}; + + private static EntryPage[] assembleOreDesc(String orename, Block ore) { + return new EntryPage[] { new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, + "knowledge.ores." + orename) }; } - private static EntryPage[] assembleMineralDesc(String orename, Block ore) - { - return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/"+orename+".png", 96, 96, "knowledge.minerals."+orename)}; + + private static EntryPage[] assembleMineralDesc(String orename, Block ore) { + return new EntryPage[] { new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, + "knowledge.minerals." + orename) }; } - private static EntryPage[] assembleImgPage(String name, Block blockname) - { - return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/"+name+".png", 96, 96, "knowledge."+name+".1")}; + + private static EntryPage[] assembleImgPage(String name, Block blockname) { + return new EntryPage[] { new EntryPageImage("textures/gui/knowledge/image/" + name + ".png", 96, 96, + "knowledge." + name + ".1") }; } - private static EntryPage[] assembleMobDesc(String name) - { - return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/mob/"+name+".png", 96, 96, "knowledge."+name+".1")}; + + private static EntryPage[] assembleMobDesc(String name) { + return new EntryPage[] { new EntryPageImage("textures/gui/knowledge/image/mob/" + name + ".png", 96, 96, + "knowledge." + name + ".1") }; } - private static EntryPage assembleSimpleImgPage(String name, String text) - { - return new EntryPageImage("textures/gui/knowledge/image/"+name+".png", 96, 96, text); + + private static EntryPage assembleSimpleImgPage(String name, String text) { + return new EntryPageImage("textures/gui/knowledge/image/" + name + ".png", 96, 96, text); } } diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiAnvilMF.java b/src/main/java/minefantasy/mf2/client/gui/GuiAnvilMF.java index 3882c203..86f8a1c3 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiAnvilMF.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiAnvilMF.java @@ -1,119 +1,121 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.GuiHelper; +import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; -import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.container.ContainerAnvilMF; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiAnvilMF extends GuiContainer { + private TileEntityAnvilMF tile; + private int regularXSize = 176; + private int xInvOffset = 28; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + public GuiAnvilMF(InventoryPlayer user, TileEntityAnvilMF tile) { + super(new ContainerAnvilMF(user, tile)); + this.xSize = 235; + this.ySize = 210; + this.tile = tile; + } -@SideOnly(Side.CLIENT) -public class GuiAnvilMF extends GuiContainer -{ - private TileEntityAnvilMF tile; - private int regularXSize = 176; - private int xInvOffset = 28; - - public GuiAnvilMF(InventoryPlayer user, TileEntityAnvilMF tile) - { - super(new ContainerAnvilMF(user, tile)); - this.xSize = 235; - this.ySize = 210; - this.tile = tile; - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + boolean knowsCraft = tile.doesPlayerKnowCraft(mc.thePlayer); + String s = MineFantasyII.isDebug() ? "Anvil Crafting" + : knowsCraft ? StatCollector.translateToLocal(tile.getResultName()) : "????"; + this.fontRendererObj.drawString(s, 10 + xInvOffset, 8, 0); + + int xPoint = (this.width - this.xSize) / 2 + 30; + int yPoint = (this.height - this.ySize) / 2; - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - boolean knowsCraft = tile.doesPlayerKnowCraft(mc.thePlayer); - String s = MineFantasyII.isDebug() ? "Anvil Crafting" : knowsCraft ? StatCollector.translateToLocal(tile.getResultName()) : "????"; - this.fontRendererObj.drawString(s, 10+xInvOffset, 8, 0); - - int xPoint = (this.width - this.xSize) / 2 + 30; - int yPoint = (this.height - this.ySize) / 2; - - if(knowsCraft && !tile.resName.equalsIgnoreCase("")) - { - if(tile.getToolNeeded() != null) - { - if(x < xPoint && x > xPoint-20 && y < yPoint+20 && y > yPoint) - { - String s2 = StatCollector.translateToLocal("tooltype."+tile.getToolNeeded()) + ", " + (tile.getToolTierNeeded() > -1 ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + tile.getToolTierNeeded() : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); - this.fontRendererObj.drawStringWithShadow(s2, -18+xInvOffset, -12, isToolSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); - } - } - if(x < xPoint+regularXSize+20 && x > xPoint+regularXSize && y < yPoint+20 && y > yPoint) - { - String s2 = StatCollector.translateToLocal("tooltype.anvil") + ", " + (tile.getAnvilTierNeeded() > -1 ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + tile.getAnvilTierNeeded() : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); - this.fontRendererObj.drawStringWithShadow(s2, regularXSize-fontRendererObj.getStringWidth(s2)+18+xInvOffset, -12, isBlockSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); - } - } - } + if (knowsCraft && !tile.resName.equalsIgnoreCase("")) { + if (tile.getToolNeeded() != null) { + if (x < xPoint && x > xPoint - 20 && y < yPoint + 20 && y > yPoint) { + String s2 = StatCollector.translateToLocal("tooltype." + tile.getToolNeeded()) + ", " + + (tile.getToolTierNeeded() > -1 + ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + + tile.getToolTierNeeded() + : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); + this.fontRendererObj.drawStringWithShadow(s2, -18 + xInvOffset, -12, + isToolSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); + } + } + if (x < xPoint + regularXSize + 20 && x > xPoint + regularXSize && y < yPoint + 20 && y > yPoint) { + String s2 = StatCollector.translateToLocal("tooltype.anvil") + ", " + + (tile.getAnvilTierNeeded() > -1 + ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + + tile.getAnvilTierNeeded() + : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); + this.fontRendererObj.drawStringWithShadow(s2, + regularXSize - fontRendererObj.getStringWidth(s2) + 18 + xInvOffset, -12, + isBlockSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); + } + } + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager() + .bindTexture(TextureHelperMF.getResource("textures/gui/anvil" + tile.getTextureName() + ".png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + + if (tile.progressMax > 0 && tile.progress > 0) { + int progressWidth = (int) (160F / tile.progressMax * tile.progress); + this.drawTexturedModalRect(xPoint + 8 + xInvOffset, yPoint + 21, 0, 210, progressWidth, 3); + } + if (tile.doesPlayerKnowCraft(mc.thePlayer) && !tile.resName.equalsIgnoreCase("")) { + GuiHelper.renderToolIcon(this, "anvil", tile.getAnvilTierNeeded(), xPoint + regularXSize + xInvOffset, + yPoint, isBlockSufficient()); + + if (tile.getToolNeeded() != null) { + GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPoint - 20 + xInvOffset, + yPoint, isToolSufficient()); + } + } + } + + private boolean isBlockSufficient() { + return tile.tier >= tile.getAnvilTierNeeded(); + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/anvil"+tile.getTextureName()+".png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - - if(tile.progressMax > 0 && tile.progress > 0) - { - int progressWidth = (int)(160F/tile.progressMax*tile.progress); - this.drawTexturedModalRect(xPoint+8+xInvOffset, yPoint+21, 0, 210, progressWidth, 3); - } - if(tile.doesPlayerKnowCraft(mc.thePlayer) && !tile.resName.equalsIgnoreCase("")) - { - GuiHelper.renderToolIcon(this, "anvil", tile.getAnvilTierNeeded(), xPoint+regularXSize+xInvOffset, yPoint, isBlockSufficient()); - - if(tile.getToolNeeded() != null) - { - GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPoint-20+xInvOffset, yPoint, isToolSufficient()); - } - } - } - private boolean isBlockSufficient() - { - return tile.tier >= tile.getAnvilTierNeeded(); - } - private boolean isToolSufficient() - { - if(mc.thePlayer != null) - { - return ToolHelper.isToolSufficient(mc.thePlayer.getHeldItem(), tile.getToolNeeded(), tile.getToolTierNeeded()); - } + private boolean isToolSufficient() { + if (mc.thePlayer != null) { + return ToolHelper.isToolSufficient(mc.thePlayer.getHeldItem(), tile.getToolNeeded(), + tile.getToolTierNeeded()); + } return false; } - - @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } - private void renderItem(ItemStack itemstack, int x, int y, int mouseX, int mouseY) - { - itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); - itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); - } - private void renderItemName(ItemStack itemstack, int x, int y, int mouseX, int mouseY) - { - if (this.func_146978_c(x-guiLeft, y-guiTop, 16, 16, mouseX, mouseY)) - { - this.renderToolTip(itemstack, mouseX, mouseY); - } - } + + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } + + private void renderItem(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); + } + + private void renderItemName(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { + if (this.func_146978_c(x - guiLeft, y - guiTop, 16, 16, mouseX, mouseY)) { + this.renderToolTip(itemstack, mouseX, mouseY); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiBigFurnace.java b/src/main/java/minefantasy/mf2/client/gui/GuiBigFurnace.java index e65dd4ee..423b10db 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiBigFurnace.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiBigFurnace.java @@ -1,6 +1,5 @@ package minefantasy.mf2.client.gui; - import org.lwjgl.opengl.GL11; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -8,80 +7,61 @@ import minefantasy.mf2.container.ContainerBigFurnace; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.StatCollector; - - /** * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class GuiBigFurnace extends GuiContainer -{ - private TileEntityBigFurnace smelter; +public class GuiBigFurnace extends GuiContainer { + private TileEntityBigFurnace smelter; - public GuiBigFurnace(EntityPlayer play, TileEntityBigFurnace tile) - { - super(new ContainerBigFurnace(play, tile)); - smelter = tile; - } + public GuiBigFurnace(EntityPlayer play, TileEntityBigFurnace tile) { + super(new ContainerBigFurnace(play, tile)); + smelter = tile; + } + + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - protected void drawGuiContainerForegroundLayer(int x, int y) - { - } + protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + if (smelter.isHeater()) { + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/furnace_heater.png")); + } else { + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/furnace_top.png")); + } + int posX = (width - xSize) / 2; + int posY = (height - ySize) / 2; + + drawTexturedModalRect(posX, posY, 0, 0, xSize, ySize); + + if (this.smelter.isBurning()) { + if (smelter.isHeater()) { + // FUEL + int fuelSc = this.smelter.getBurnTimeRemainingScaled(12); + if (smelter.fuel > 0) + this.drawTexturedModalRect(posX + 59, posY + 27 + 12 - fuelSc, 176, 12 - fuelSc, 14, fuelSc + 2); + + // HEATMAX + int heatScM = this.smelter.getItemHeatScaled(68); + this.drawTexturedModalRect(posX + 104, posY + 76 - heatScM, 176, 14, 16, 3); + + // HEAT + int heatSc = this.smelter.getHeatScaled(68); + this.drawTexturedModalRect(posX + 107, posY + 76 - heatSc, 176, 17, 10, 5); + } else { + if (smelter.progress > 0) { + int prog = smelter.getCookProgressScaled(24); + drawTexturedModalRect(posX + 76, posY + 34, 176, 0, prog + 1, 16); + } + } + } + } - protected void drawGuiContainerBackgroundLayer(float f, int i, int j) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - if(smelter.isHeater()) - { - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/furnace_heater.png")); - } - else - { - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/furnace_top.png")); - } - int posX = (width - xSize) / 2; - int posY = (height - ySize) / 2; - - drawTexturedModalRect(posX, posY, 0, 0, xSize, ySize); - - - - - if (this.smelter.isBurning()) - { - if(smelter.isHeater()) - { - //FUEL - int fuelSc = this.smelter.getBurnTimeRemainingScaled(12); - if(smelter.fuel > 0) - this.drawTexturedModalRect(posX + 59, posY + 27 + 12 - fuelSc, 176, 12 - fuelSc, 14, fuelSc + 2); - - //HEATMAX - int heatScM = this.smelter.getItemHeatScaled(68); - this.drawTexturedModalRect(posX + 104, posY + 76 - heatScM, 176, 14, 16, 3); - - //HEAT - int heatSc = this.smelter.getHeatScaled(68); - this.drawTexturedModalRect(posX + 107, posY + 76 - heatSc, 176, 17, 10, 5); - } - else - { - if(smelter.progress > 0) - { - int prog = smelter.getCookProgressScaled(24); - drawTexturedModalRect(posX + 76, posY + 34, 176, 0, prog + 1, 16); - } - } - } - } - private void bindTexture(String image) - { + private void bindTexture(String image) { this.mc.renderEngine.bindTexture(TextureHelperMF.getResource(image)); } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiBlastChamber.java b/src/main/java/minefantasy/mf2/client/gui/GuiBlastChamber.java index d8a3617c..4a74c0a2 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiBlastChamber.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiBlastChamber.java @@ -1,50 +1,44 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; import minefantasy.mf2.container.ContainerBlastChamber; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiBlastChamber extends GuiContainer { + private TileEntityBlastFC tile; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + public GuiBlastChamber(InventoryPlayer user, TileEntityBlastFC tile) { + super(new ContainerBlastChamber(user, tile)); + this.ySize = 208; + this.tile = tile; + } -@SideOnly(Side.CLIENT) -public class GuiBlastChamber extends GuiContainer -{ - private TileEntityBlastFC tile; - - public GuiBlastChamber(InventoryPlayer user, TileEntityBlastFC tile) - { - super(new ContainerBlastChamber(user, tile)); - this.ySize = 208; - this.tile = tile; - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - } + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/blast_chamber.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/blast_chamber.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } - - @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiBlastHeater.java b/src/main/java/minefantasy/mf2/client/gui/GuiBlastHeater.java index 5d6374fa..b5a48d60 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiBlastHeater.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiBlastHeater.java @@ -1,56 +1,49 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFH; import minefantasy.mf2.container.ContainerBlastHeater; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiBlastHeater extends GuiContainer { + private TileEntityBlastFH tile; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + public GuiBlastHeater(InventoryPlayer user, TileEntityBlastFH tile) { + super(new ContainerBlastHeater(user, tile)); + this.ySize = 208; + this.tile = tile; + } -@SideOnly(Side.CLIENT) -public class GuiBlastHeater extends GuiContainer -{ - private TileEntityBlastFH tile; - - public GuiBlastHeater(InventoryPlayer user, TileEntityBlastFH tile) - { - super(new ContainerBlastHeater(user, tile)); - this.ySize = 208; - this.tile = tile; - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/blast_heater.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - - if (this.tile.isBurning()) - { - int i1 = this.tile.getBurnTimeRemainingScaled(13); - this.drawTexturedModalRect(xPoint + 82, yPoint + 42 + 12 - i1, 243, 12 - i1, 14, i1 + 1); - } - } - - @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/blast_heater.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + + if (this.tile.isBurning()) { + int i1 = this.tile.getBurnTimeRemainingScaled(13); + this.drawTexturedModalRect(xPoint + 82, yPoint + 42 + 12 - i1, 243, 12 - i1, 14, i1 + 1); + } + } + + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiBloomery.java b/src/main/java/minefantasy/mf2/client/gui/GuiBloomery.java index f2128b68..3ead4fcd 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiBloomery.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiBloomery.java @@ -1,50 +1,44 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityBloomery; import minefantasy.mf2.container.ContainerBloomery; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiBloomery extends GuiContainer { + private TileEntityBloomery tile; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + public GuiBloomery(InventoryPlayer user, TileEntityBloomery tile) { + super(new ContainerBloomery(user, tile)); + this.ySize = 208; + this.tile = tile; + } -@SideOnly(Side.CLIENT) -public class GuiBloomery extends GuiContainer -{ - private TileEntityBloomery tile; - - public GuiBloomery(InventoryPlayer user, TileEntityBloomery tile) - { - super(new ContainerBloomery(user, tile)); - this.ySize = 208; - this.tile = tile; - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - } + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/bloomery.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/bloomery.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } - - @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiBombBench.java b/src/main/java/minefantasy/mf2/client/gui/GuiBombBench.java index ae4cbdff..49effec6 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiBombBench.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiBombBench.java @@ -1,55 +1,50 @@ package minefantasy.mf2.client.gui; -import minefantasy.mf2.block.tileentity.TileEntityBombBench; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; +import minefantasy.mf2.block.tileentity.TileEntityBombBench; import minefantasy.mf2.container.ContainerBombBench; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiBombBench extends GuiContainer { + private TileEntityBombBench tile; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + public GuiBombBench(InventoryPlayer user, TileEntityBombBench tile) { + super(new ContainerBombBench(user, tile)); + this.ySize = 208; + this.tile = tile; + } -@SideOnly(Side.CLIENT) -public class GuiBombBench extends GuiContainer -{ - private TileEntityBombBench tile; - - public GuiBombBench(InventoryPlayer user, TileEntityBombBench tile) - { - super(new ContainerBombBench(user, tile)); - this.ySize = 208; - this.tile = tile; - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - String s = StatCollector.translateToLocal("tile.bombBench.name"); - //this.fontRendererObj.drawString(s, 10, 6, 0); - - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/bombCraft.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } - - @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + String s = StatCollector.translateToLocal("tile.bombBench.name"); + // this.fontRendererObj.drawString(s, 10, 6, 0); + + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/bombCraft.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } + + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiCarpenterMF.java b/src/main/java/minefantasy/mf2/client/gui/GuiCarpenterMF.java index c5fa7107..be80e609 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiCarpenterMF.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiCarpenterMF.java @@ -1,113 +1,114 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.GuiHelper; +import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; -import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.container.ContainerCarpenterMF; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiCarpenterMF extends GuiContainer { + private TileEntityCarpenterMF tile; + private int regularXSize = 176; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + public GuiCarpenterMF(InventoryPlayer user, TileEntityCarpenterMF tile) { + super(new ContainerCarpenterMF(user, tile)); + this.xSize = 195; + this.ySize = 240; + this.tile = tile; + } -@SideOnly(Side.CLIENT) -public class GuiCarpenterMF extends GuiContainer -{ - private TileEntityCarpenterMF tile; - private int regularXSize = 176; - public GuiCarpenterMF(InventoryPlayer user, TileEntityCarpenterMF tile) - { - super(new ContainerCarpenterMF(user, tile)); - this.xSize = 195; - this.ySize = 240; - this.tile = tile; - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + boolean knowsCraft = tile.doesPlayerKnowCraft(mc.thePlayer); + String s = MineFantasyII.isDebug() ? "Carpenter Bench Crafting" + : knowsCraft ? StatCollector.translateToLocal(tile.getResultName()) : "????"; + this.fontRendererObj.drawString(s, 10, 8, 0); - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - boolean knowsCraft = tile.doesPlayerKnowCraft(mc.thePlayer); - String s = MineFantasyII.isDebug() ? "Carpenter Bench Crafting" : knowsCraft ? StatCollector.translateToLocal(tile.getResultName()) : "????"; - this.fontRendererObj.drawString(s, 10, 8, 0); - - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - - if(knowsCraft && !tile.resName.equalsIgnoreCase("")) - { - if(tile.getToolNeeded() != null) - { - if(x < xPoint && x > xPoint-20 && y < yPoint+20 && y > yPoint) - { - String s2 = StatCollector.translateToLocal("tooltype."+tile.getToolNeeded()) + ", " + (tile.getToolTierNeeded() > -1 ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + tile.getToolTierNeeded() : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); - this.fontRendererObj.drawStringWithShadow(s2, -18, -12, isToolSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); - } - } - if(x < xPoint+regularXSize+20 && x > xPoint+regularXSize && y < yPoint+20 && y > yPoint) - { - String s2 = StatCollector.translateToLocal("tooltype.carpenter") + ", " + (tile.getCarpenterTierNeeded() > -1 ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + tile.getCarpenterTierNeeded() : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); - this.fontRendererObj.drawStringWithShadow(s2, regularXSize-fontRendererObj.getStringWidth(s2)+18, -12, 16777215); - } - } - } + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/carpenter.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - - if(tile.progressMax > 0 && tile.progress > 0) - { - int progressWidth = (int)(160F/tile.progressMax*tile.progress); - this.drawTexturedModalRect(xPoint+8, yPoint+21, 0, 240, progressWidth, 3); - } - if(tile.doesPlayerKnowCraft(mc.thePlayer) && !tile.resName.equalsIgnoreCase("")) - { - GuiHelper.renderToolIcon(this, "carpenter", tile.getCarpenterTierNeeded(), xPoint+regularXSize, yPoint, true); - - if(tile.getToolNeeded() != null) - { - GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPoint-20, yPoint, isToolSufficient()); - } - } - } - private boolean isToolSufficient() - { - if(mc.thePlayer != null) - { - return ToolHelper.isToolSufficient(mc.thePlayer.getHeldItem(), tile.getToolNeeded(), tile.getToolTierNeeded()); - } + if (knowsCraft && !tile.resName.equalsIgnoreCase("")) { + if (tile.getToolNeeded() != null) { + if (x < xPoint && x > xPoint - 20 && y < yPoint + 20 && y > yPoint) { + String s2 = StatCollector.translateToLocal("tooltype." + tile.getToolNeeded()) + ", " + + (tile.getToolTierNeeded() > -1 + ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + + tile.getToolTierNeeded() + : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); + this.fontRendererObj.drawStringWithShadow(s2, -18, -12, + isToolSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); + } + } + if (x < xPoint + regularXSize + 20 && x > xPoint + regularXSize && y < yPoint + 20 && y > yPoint) { + String s2 = StatCollector.translateToLocal("tooltype.carpenter") + ", " + + (tile.getCarpenterTierNeeded() > -1 + ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + + tile.getCarpenterTierNeeded() + : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); + this.fontRendererObj.drawStringWithShadow(s2, regularXSize - fontRendererObj.getStringWidth(s2) + 18, + -12, 16777215); + } + } + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/carpenter.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + + if (tile.progressMax > 0 && tile.progress > 0) { + int progressWidth = (int) (160F / tile.progressMax * tile.progress); + this.drawTexturedModalRect(xPoint + 8, yPoint + 21, 0, 240, progressWidth, 3); + } + if (tile.doesPlayerKnowCraft(mc.thePlayer) && !tile.resName.equalsIgnoreCase("")) { + GuiHelper.renderToolIcon(this, "carpenter", tile.getCarpenterTierNeeded(), xPoint + regularXSize, yPoint, + true); + + if (tile.getToolNeeded() != null) { + GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPoint - 20, yPoint, + isToolSufficient()); + } + } + } + + private boolean isToolSufficient() { + if (mc.thePlayer != null) { + return ToolHelper.isToolSufficient(mc.thePlayer.getHeldItem(), tile.getToolNeeded(), + tile.getToolTierNeeded()); + } return false; } @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } - private void renderItem(ItemStack itemstack, int x, int y, int mouseX, int mouseY) - { - itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); - itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); - } - private void renderItemName(ItemStack itemstack, int x, int y, int mouseX, int mouseY) - { - if (this.func_146978_c(x-guiLeft, y-guiTop, 16, 16, mouseX, mouseY)) - { - this.renderToolTip(itemstack, mouseX, mouseY); - } - } + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } + + private void renderItem(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); + } + + private void renderItemName(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { + if (this.func_146978_c(x - guiLeft, y - guiTop, 16, 16, mouseX, mouseY)) { + this.renderToolTip(itemstack, mouseX, mouseY); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiCrossbowBench.java b/src/main/java/minefantasy/mf2/client/gui/GuiCrossbowBench.java index d8410afa..2d11e1a3 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiCrossbowBench.java @@ -1,5 +1,9 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityCrossbowBench; import minefantasy.mf2.container.ContainerCrossbowBench; @@ -7,49 +11,40 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiCrossbowBench extends GuiContainer { + private TileEntityCrossbowBench tile; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + public GuiCrossbowBench(InventoryPlayer user, TileEntityCrossbowBench tile) { + super(new ContainerCrossbowBench(user, tile)); + this.ySize = 208; + this.tile = tile; + } -@SideOnly(Side.CLIENT) -public class GuiCrossbowBench extends GuiContainer -{ - private TileEntityCrossbowBench tile; - - public GuiCrossbowBench(InventoryPlayer user, TileEntityCrossbowBench tile) - { - super(new ContainerCrossbowBench(user, tile)); - this.ySize = 208; - this.tile = tile; - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - String s = StatCollector.translateToLocal("tile.crossbowBench.name"); - //this.fontRendererObj.drawString(s, 10, 6, 0); - - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/crossbowCraft.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } - - @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + String s = StatCollector.translateToLocal("tile.crossbowBench.name"); + // this.fontRendererObj.drawString(s, 10, 6, 0); + + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/crossbowCraft.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } + + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiCrucible.java b/src/main/java/minefantasy/mf2/client/gui/GuiCrucible.java index f7ffbb62..59ea314f 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiCrucible.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiCrucible.java @@ -1,5 +1,9 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityCrucible; import minefantasy.mf2.config.ConfigHardcore; @@ -7,74 +11,60 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemBlock; -import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiCrucible extends GuiContainer { + private TileEntityCrucible tile; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + public GuiCrucible(InventoryPlayer user, TileEntityCrucible tile) { + super(new ContainerCrucible(user, tile)); + this.ySize = 186; + this.tile = tile; + } -@SideOnly(Side.CLIENT) -public class GuiCrucible extends GuiContainer -{ - private TileEntityCrucible tile; - - public GuiCrucible(InventoryPlayer user, TileEntityCrucible tile) - { - super(new ContainerCrucible(user, tile)); - this.ySize = 186; - this.tile = tile; - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource(getTex())); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + + if (tile.getStackInSlot(tile.getSizeInventory() - 1) != null + && !(tile.getStackInSlot(tile.getSizeInventory() - 1).getItem() instanceof ItemBlock) + && ConfigHardcore.HCCreduceIngots && !tile.isAuto()) { + this.drawTexturedModalRect(xPoint + 128, yPoint + 31, 225, 2, 18, 18); + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - } + if (this.tile.temperature > 0) { + this.drawTexturedModalRect(xPoint + 81, yPoint + 75, 243, 0, 14, 12); + } + if (this.tile.progress > 0 && tile.progressMax > 0) { + int value = (int) (54F / tile.progressMax * tile.progress); + this.drawTexturedModalRect(xPoint + 61, yPoint + 70, 189, 0, value, 2); + } + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource(getTex())); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - - if(tile.getStackInSlot(tile.getSizeInventory()-1) != null && !(tile.getStackInSlot(tile.getSizeInventory()-1).getItem() instanceof ItemBlock) && ConfigHardcore.HCCreduceIngots && !tile.isAuto()) - { - this.drawTexturedModalRect(xPoint+128, yPoint+31, 225, 2, 18, 18); - } - - if (this.tile.temperature > 0) - { - this.drawTexturedModalRect(xPoint + 81, yPoint + 75, 243, 0, 14, 12); - } - if (this.tile.progress > 0 && tile.progressMax > 0) - { - int value = (int)(54F / tile.progressMax * tile.progress); - this.drawTexturedModalRect(xPoint + 61, yPoint + 70, 189, 0, value, 2); - } - } - - private String getTex() - { - if(tile.getTier() == 1) - { - return "textures/gui/crucible_advanced.png"; - } - if(tile.getTier() >= 2) - { - return "textures/gui/crucible_mythic.png"; - } + private String getTex() { + if (tile.getTier() == 1) { + return "textures/gui/crucible_advanced.png"; + } + if (tile.getTier() >= 2) { + return "textures/gui/crucible_mythic.png"; + } return "textures/gui/crucible.png"; } @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiDiscovery.java b/src/main/java/minefantasy/mf2/client/gui/GuiDiscovery.java index a21902a4..aff0a469 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiDiscovery.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiDiscovery.java @@ -1,5 +1,10 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.knowledge.InformationBase; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; @@ -9,143 +14,123 @@ import net.minecraft.client.resources.I18n; import net.minecraft.util.ResourceLocation; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - @SideOnly(Side.CLIENT) -public class GuiDiscovery extends Gui -{ - private static final ResourceLocation field_146261_a = new ResourceLocation("textures/gui/achievement/achievement_background.png"); - private Minecraft field_146259_f; - private int field_146260_g; - private int field_146267_h; - private String field_146268_i; - private String field_146265_j; - private InformationBase field_146266_k; - private long field_146263_l; - private RenderItem field_146264_m; - private boolean field_146262_n; - - public GuiDiscovery(Minecraft p_i1063_1_) - { - this.field_146259_f = p_i1063_1_; - this.field_146264_m = new RenderItem(); - } - - public void func_146256_a(InformationBase p_146256_1_) - { - this.field_146268_i = I18n.format("knowledge.discover", new Object[0]); - this.field_146265_j = p_146256_1_.getDisplayName(); - this.field_146263_l = Minecraft.getSystemTime(); - this.field_146266_k = p_146256_1_; - this.field_146262_n = false; - } - - public void func_146255_b(InformationBase p_146255_1_) - { - this.field_146268_i = p_146255_1_.getDisplayName(); - this.field_146265_j = p_146255_1_.getDescription(); - this.field_146263_l = Minecraft.getSystemTime() + 2500L; - this.field_146266_k = p_146255_1_; - this.field_146262_n = true; - } - - private void func_146258_c() - { - GL11.glViewport(0, 0, this.field_146259_f.displayWidth, this.field_146259_f.displayHeight); - GL11.glMatrixMode(GL11.GL_PROJECTION); - GL11.glLoadIdentity(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glLoadIdentity(); - this.field_146260_g = this.field_146259_f.displayWidth; - this.field_146267_h = this.field_146259_f.displayHeight; - ScaledResolution scaledresolution = new ScaledResolution(this.field_146259_f, this.field_146259_f.displayWidth, this.field_146259_f.displayHeight); - this.field_146260_g = scaledresolution.getScaledWidth(); - this.field_146267_h = scaledresolution.getScaledHeight(); - GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); - GL11.glMatrixMode(GL11.GL_PROJECTION); - GL11.glLoadIdentity(); - GL11.glOrtho(0.0D, this.field_146260_g, this.field_146267_h, 0.0D, 1000.0D, 3000.0D); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glLoadIdentity(); - GL11.glTranslatef(0.0F, 0.0F, -2000.0F); - } - - public void func_146254_a() - { - if (this.field_146266_k != null && this.field_146263_l != 0L && Minecraft.getMinecraft().thePlayer != null) - { - double d0 = (Minecraft.getSystemTime() - this.field_146263_l) / 3000.0D; - - if (!this.field_146262_n) - { - if (d0 < 0.0D || d0 > 1.0D) - { - this.field_146263_l = 0L; - return; - } - } - else if (d0 > 0.5D) - { - d0 = 0.5D; - } - - this.func_146258_c(); - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glDepthMask(false); - double d1 = d0 * 2.0D; - - if (d1 > 1.0D) - { - d1 = 2.0D - d1; - } - - d1 *= 4.0D; - d1 = 1.0D - d1; - - if (d1 < 0.0D) - { - d1 = 0.0D; - } - - d1 *= d1; - d1 *= d1; - int i = this.field_146260_g - 160; - int j = 0 - (int)(d1 * 36.0D); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glEnable(GL11.GL_TEXTURE_2D); - this.field_146259_f.getTextureManager().bindTexture(field_146261_a); - GL11.glDisable(GL11.GL_LIGHTING); - this.drawTexturedModalRect(i, j, 96, 202, 160, 32); - - if (this.field_146262_n) - { - this.field_146259_f.fontRenderer.drawSplitString(this.field_146265_j, i + 30, j + 7, 120, -1); - } - else - { - this.field_146259_f.fontRenderer.drawString(this.field_146268_i, i + 30, j + 7, -256); - this.field_146259_f.fontRenderer.drawString(this.field_146265_j, i + 30, j + 18, -1); - } - - RenderHelper.enableGUIStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_COLOR_MATERIAL); - GL11.glEnable(GL11.GL_LIGHTING); - this.field_146264_m.renderItemAndEffectIntoGUI(this.field_146259_f.fontRenderer, this.field_146259_f.getTextureManager(), this.field_146266_k.theItemStack, i + 8, j + 8); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDepthMask(true); - GL11.glEnable(GL11.GL_DEPTH_TEST); - } - } - - public void func_146257_b() - { - this.field_146266_k = null; - this.field_146263_l = 0L; - } +public class GuiDiscovery extends Gui { + private static final ResourceLocation field_146261_a = new ResourceLocation( + "textures/gui/achievement/achievement_background.png"); + private Minecraft field_146259_f; + private int field_146260_g; + private int field_146267_h; + private String field_146268_i; + private String field_146265_j; + private InformationBase field_146266_k; + private long field_146263_l; + private RenderItem field_146264_m; + private boolean field_146262_n; + + public GuiDiscovery(Minecraft p_i1063_1_) { + this.field_146259_f = p_i1063_1_; + this.field_146264_m = new RenderItem(); + } + + public void func_146256_a(InformationBase p_146256_1_) { + this.field_146268_i = I18n.format("knowledge.discover", new Object[0]); + this.field_146265_j = p_146256_1_.getDisplayName(); + this.field_146263_l = Minecraft.getSystemTime(); + this.field_146266_k = p_146256_1_; + this.field_146262_n = false; + } + + public void func_146255_b(InformationBase p_146255_1_) { + this.field_146268_i = p_146255_1_.getDisplayName(); + this.field_146265_j = p_146255_1_.getDescription(); + this.field_146263_l = Minecraft.getSystemTime() + 2500L; + this.field_146266_k = p_146255_1_; + this.field_146262_n = true; + } + + private void func_146258_c() { + GL11.glViewport(0, 0, this.field_146259_f.displayWidth, this.field_146259_f.displayHeight); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + this.field_146260_g = this.field_146259_f.displayWidth; + this.field_146267_h = this.field_146259_f.displayHeight; + ScaledResolution scaledresolution = new ScaledResolution(this.field_146259_f, this.field_146259_f.displayWidth, + this.field_146259_f.displayHeight); + this.field_146260_g = scaledresolution.getScaledWidth(); + this.field_146267_h = scaledresolution.getScaledHeight(); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, this.field_146260_g, this.field_146267_h, 0.0D, 1000.0D, 3000.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -2000.0F); + } + + public void func_146254_a() { + if (this.field_146266_k != null && this.field_146263_l != 0L && Minecraft.getMinecraft().thePlayer != null) { + double d0 = (Minecraft.getSystemTime() - this.field_146263_l) / 3000.0D; + + if (!this.field_146262_n) { + if (d0 < 0.0D || d0 > 1.0D) { + this.field_146263_l = 0L; + return; + } + } else if (d0 > 0.5D) { + d0 = 0.5D; + } + + this.func_146258_c(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDepthMask(false); + double d1 = d0 * 2.0D; + + if (d1 > 1.0D) { + d1 = 2.0D - d1; + } + + d1 *= 4.0D; + d1 = 1.0D - d1; + + if (d1 < 0.0D) { + d1 = 0.0D; + } + + d1 *= d1; + d1 *= d1; + int i = this.field_146260_g - 160; + int j = 0 - (int) (d1 * 36.0D); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glEnable(GL11.GL_TEXTURE_2D); + this.field_146259_f.getTextureManager().bindTexture(field_146261_a); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawTexturedModalRect(i, j, 96, 202, 160, 32); + + if (this.field_146262_n) { + this.field_146259_f.fontRenderer.drawSplitString(this.field_146265_j, i + 30, j + 7, 120, -1); + } else { + this.field_146259_f.fontRenderer.drawString(this.field_146268_i, i + 30, j + 7, -256); + this.field_146259_f.fontRenderer.drawString(this.field_146265_j, i + 30, j + 18, -1); + } + + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glEnable(GL11.GL_LIGHTING); + this.field_146264_m.renderItemAndEffectIntoGUI(this.field_146259_f.fontRenderer, + this.field_146259_f.getTextureManager(), this.field_146266_k.theItemStack, i + 8, j + 8); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + } + + public void func_146257_b() { + this.field_146266_k = null; + this.field_146263_l = 0L; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiForge.java b/src/main/java/minefantasy/mf2/client/gui/GuiForge.java index 01cb6b49..a4343afe 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiForge.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiForge.java @@ -1,73 +1,63 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityForge; import minefantasy.mf2.container.ContainerForge; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.StatCollector; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class GuiForge extends GuiContainer -{ - private TileEntityForge tile; - - public GuiForge(InventoryPlayer user, TileEntityForge tile) - { - super(new ContainerForge(user, tile)); - this.ySize = 175; - this.tile = tile; - } +public class GuiForge extends GuiContainer { + private TileEntityForge tile; - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - } + public GuiForge(InventoryPlayer user, TileEntityForge tile) { + super(new ContainerForge(user, tile)); + this.ySize = 175; + this.tile = tile; + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource(getTex())); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - - if (this.tile.fuel > 0 && tile.maxFuel > 0) - { - int scale = tile.getMetreScale(12); - this.drawTexturedModalRect(xPoint + 33, yPoint + 63 + 11 - scale, 176, 11 - scale+8, 14, scale + 1); - } - int[] scale = tile.getTempsScaled(53); + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - if (this.tile.temperature > 0) - { - if (this.tile.isLit) - { + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource(getTex())); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + + if (this.tile.fuel > 0 && tile.maxFuel > 0) { + int scale = tile.getMetreScale(12); + this.drawTexturedModalRect(xPoint + 33, yPoint + 63 + 11 - scale, 176, 11 - scale + 8, 14, scale + 1); + } + int[] scale = tile.getTempsScaled(53); + + if (this.tile.temperature > 0) { + if (this.tile.isLit) { int heatScM = scale[1]; this.drawTexturedModalRect(xPoint + 32, yPoint + 58 - heatScM, 176, 0, 16, 3); } int heatSc = scale[0]; this.drawTexturedModalRect(xPoint + 35, yPoint + 58 - heatSc, 176, 3, 10, 5); } - } - - private String getTex() - { + } + + private String getTex() { return "textures/gui/" + tile.getTextureName() + ".png"; } @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiKnowledge.java b/src/main/java/minefantasy/mf2/client/gui/GuiKnowledge.java index f84732bb..a7bf5a7f 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiKnowledge.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiKnowledge.java @@ -31,7 +31,6 @@ import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; @@ -39,730 +38,640 @@ import net.minecraft.util.StatCollector; @SideOnly(Side.CLIENT) -public class GuiKnowledge extends GuiScreen -{ +public class GuiKnowledge extends GuiScreen { int offsetByX = 70; int offsetByY = 0; - public int buyWidth = 225; - public int buyHeight = 72; + public int buyWidth = 225; + public int buyHeight = 72; private RenderItem itemrender = new RenderItem(); private InformationBase selected = null; private InformationBase highlighted = null; - private static final int field_146572_y = InformationList.minDisplayColumn * 24 - 112; - private static final int field_146571_z = InformationList.minDisplayRow * 24 - 112; - private static final int field_146559_A = InformationList.maxDisplayColumn * 24 - 77; - private static final int field_146560_B = InformationList.maxDisplayRow * 24 - 77; - private static final ResourceLocation screenTex = new ResourceLocation("minefantasy2:textures/gui/knowledge/knowledge.png"); - private static final ResourceLocation buyTex = new ResourceLocation("minefantasy2:textures/gui/knowledge/purchase.png"); - private static final ResourceLocation skillTex = new ResourceLocation("minefantasy2:textures/gui/knowledge/skilllist.png"); - protected static int field_146555_f = 256; - protected static int field_146557_g = 202; - protected static int field_146563_h; - protected static int field_146564_i; - protected static float field_146570_r = 1.0F; - protected static double field_146569_s; - protected static double field_146568_t; - protected static double field_146567_u; - protected static double field_146566_v; - protected static double field_146565_w; - protected static double field_146573_x; - private static int field_146554_D; - private static boolean allDiscovered = true; - - private static int currentPage = -1; - private GuiButton button; - private LinkedList informationList = new LinkedList(); - private EntityPlayer player; + private static final int field_146572_y = InformationList.minDisplayColumn * 24 - 112; + private static final int field_146571_z = InformationList.minDisplayRow * 24 - 112; + private static final int field_146559_A = InformationList.maxDisplayColumn * 24 - 77; + private static final int field_146560_B = InformationList.maxDisplayRow * 24 - 77; + private static final ResourceLocation screenTex = new ResourceLocation( + "minefantasy2:textures/gui/knowledge/knowledge.png"); + private static final ResourceLocation buyTex = new ResourceLocation( + "minefantasy2:textures/gui/knowledge/purchase.png"); + private static final ResourceLocation skillTex = new ResourceLocation( + "minefantasy2:textures/gui/knowledge/skilllist.png"); + protected static int field_146555_f = 256; + protected static int field_146557_g = 202; + protected static int field_146563_h; + protected static int field_146564_i; + protected static float field_146570_r = 1.0F; + protected static double field_146569_s; + protected static double field_146568_t; + protected static double field_146567_u; + protected static double field_146566_v; + protected static double field_146565_w; + protected static double field_146573_x; + private static int field_146554_D; + private static boolean allDiscovered = true; + + private static int currentPage = -1; + private GuiButton button; + private LinkedList informationList = new LinkedList(); + private EntityPlayer player; private boolean hasScroll = false; private boolean canPurchase = false; - - public GuiKnowledge(EntityPlayer user) - { - this.player = user; - short short1 = 141; - short short2 = 141; - GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u = GuiKnowledge.field_146565_w = KnowledgeListMF.gettingStarted.displayColumn * 24 - short1 / 2 - 12; - GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v = GuiKnowledge.field_146573_x = KnowledgeListMF.gettingStarted.displayRow * 24 - short2 / 2; - informationList.clear(); - for (Object achievement : InformationList.knowledgeList) - { - if (!InformationPage.isInfoInPages((InformationBase)achievement)) - { - informationList.add((InformationBase)achievement); - } - } - for(Object base: InformationList.knowledgeList.toArray()) - { - if(!ResearchLogic.hasInfoUnlocked(user, (InformationBase)base)) - { - allDiscovered = false; - break; - } - } - } - - /** - * Adds the buttons (and other controls) to the screen in question. - */ - @Override - public void initGui() - { - int i1 = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; - int j1 = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; - - this.buttonList.clear(); - this.buttonList.add(new GuiOptionButton(1, this.width / 2 + 24, this.height / 2 + 101, 80, 20, I18n.format("gui.done", new Object[0]))); - this.buttonList.add(button = new GuiButton(2, (width - field_146555_f) / 2 + 24, height / 2 + 101, 125, 20, InformationPage.getTitle(currentPage))); - - int purchasex = i1 + (field_146555_f - buyWidth)/2; - int purchasey =j1 + (field_146557_g - buyHeight)/2; - //PURCHASE SCREEN - this.buttonList.add(new GuiOptionButton(3, purchasex + 19, purchasey + 47, 80, 20, I18n.format("gui.purchase", new Object[0]))); - this.buttonList.add(new GuiOptionButton(4, purchasex + 125, purchasey + 47, 80, 20, I18n.format("gui.cancel", new Object[0]))); - } - - @Override - protected void mouseClicked(int x, int y, int button) - { - if(selected == null && button == 0 && highlighted != null) - { - if(ResearchLogic.hasInfoUnlocked(player, highlighted) && !highlighted.getPages().isEmpty()) - { - player.openGui(MineFantasyII.instance, 1, player.worldObj, 0, highlighted.ID, 0); - } - else if(highlighted.isEasy() && ResearchLogic.canPurchase(player, highlighted)) - { - selected = highlighted; - setPurchaseAvailable(player); - } - } - super.mouseClicked(x, y, button); - } - @Override - protected void actionPerformed(GuiButton p_146284_1_) - { - if (p_146284_1_.id == 1) - { - this.mc.displayGuiScreen((GuiScreen)null); - } - - if (selected == null && p_146284_1_.id == 2) - { - currentPage++; - - if (currentPage >= InformationPage.getInfoPages().size()) - { - currentPage = -1; - } - button.displayString = InformationPage.getTitle(currentPage); - } - - if (p_146284_1_.id == 3 && selected != null) - { - ((EntityClientPlayerMP)player).sendQueue.addToSendQueue(new ResearchRequest(player, selected.ID).generatePacket()); - selected = null; - } - if (p_146284_1_.id == 4 && selected != null) - { - selected = null; - } - } - - /** - * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e). - */ - @Override - protected void keyTyped(char p_73869_1_, int p_73869_2_) - { - if (p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) - { - this.mc.displayGuiScreen((GuiScreen)null); - this.mc.setIngameFocus(); - } - else - { - super.keyTyped(p_73869_1_, p_73869_2_); - } - } - - /** - * Draws the screen and all the components in it. - */ - @Override - public void drawScreen(int mx, int my, float f) - { - { - int k; - - if (selected == null && Mouse.isButtonDown(0)) - { - k = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; - int l = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; - int i1 = k + 8; - int j1 = l + 17; - - if ((GuiKnowledge.field_146554_D == 0 || GuiKnowledge.field_146554_D == 1) && mx >= i1 && mx < i1 + 224 && my >= j1 && my < j1 + 155) - { - if (GuiKnowledge.field_146554_D == 0) - { - GuiKnowledge.field_146554_D = 1; - } - else - { - GuiKnowledge.field_146567_u -= (mx - GuiKnowledge.field_146563_h) * GuiKnowledge.field_146570_r; - GuiKnowledge.field_146566_v -= (my - GuiKnowledge.field_146564_i) * GuiKnowledge.field_146570_r; - GuiKnowledge.field_146565_w = GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; - GuiKnowledge.field_146573_x = GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; - } - - GuiKnowledge.field_146563_h = mx; - GuiKnowledge.field_146564_i = my; - } - } - else - { - GuiKnowledge.field_146554_D = 0; - } - - k = Mouse.getDWheel(); - float f4 = GuiKnowledge.field_146570_r; - - if (k < 0) - { - GuiKnowledge.field_146570_r += 0.25F; - } - else if (k > 0) - { - GuiKnowledge.field_146570_r -= 0.25F; - } - - GuiKnowledge.field_146570_r = MathHelper.clamp_float(GuiKnowledge.field_146570_r, 1.0F, 3.0F); - - if (GuiKnowledge.field_146570_r != f4) - { - float f6 = f4 - GuiKnowledge.field_146570_r; - float f5 = f4 * GuiKnowledge.field_146555_f; - float f1 = f4 * GuiKnowledge.field_146557_g; - float f2 = GuiKnowledge.field_146570_r * GuiKnowledge.field_146555_f; - float f3 = GuiKnowledge.field_146570_r * GuiKnowledge.field_146557_g; - GuiKnowledge.field_146567_u -= (f2 - f5) * 0.5F; - GuiKnowledge.field_146566_v -= (f3 - f1) * 0.5F; - GuiKnowledge.field_146565_w = GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; - GuiKnowledge.field_146573_x = GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; - } - - if (GuiKnowledge.field_146565_w < field_146572_y) - { - GuiKnowledge.field_146565_w = field_146572_y; - } - - if (GuiKnowledge.field_146573_x < field_146571_z) - { - GuiKnowledge.field_146573_x = field_146571_z; - } - - if (GuiKnowledge.field_146565_w >= field_146559_A) - { - GuiKnowledge.field_146565_w = field_146559_A - 1; - } - - if (GuiKnowledge.field_146573_x >= field_146560_B) - { - GuiKnowledge.field_146573_x = field_146560_B - 1; - } - - this.drawDefaultBackground(); - this.renderMainPage(mx, my, f); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_DEPTH_TEST); - this.drawOverlay(); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_DEPTH_TEST); - } - if(buttonList.get(2) != null) - { - ((GuiButton)buttonList.get(2)).visible = selected != null; - ((GuiButton)buttonList.get(2)).enabled = selected != null && canPurchase ; - ((GuiButton)buttonList.get(3)).visible = selected != null; - } - } - - /** - * Called from the main game loop to update the screen. - */ - @Override - public void updateScreen() - { - { - GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; - GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; - double d0 = GuiKnowledge.field_146565_w - GuiKnowledge.field_146567_u; - double d1 = GuiKnowledge.field_146573_x - GuiKnowledge.field_146566_v; - - if (d0 * d0 + d1 * d1 < 4.0D) - { - GuiKnowledge.field_146567_u += d0; - GuiKnowledge.field_146566_v += d1; - } - else - { - GuiKnowledge.field_146567_u += d0 * 0.85D; - GuiKnowledge.field_146566_v += d1 * 0.85D; - } - } - } - - protected void drawOverlay() - { - int i = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; - int j = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; - - this.fontRendererObj.drawString(I18n.format("gui.information", new Object[0]), i + 15, j + 5, 4210752); - } - - protected void renderMainPage(int mx, int my, float f) - { - int k = MathHelper.floor_double(GuiKnowledge.field_146569_s + (GuiKnowledge.field_146567_u - GuiKnowledge.field_146569_s) * f); - int l = MathHelper.floor_double(GuiKnowledge.field_146568_t + (GuiKnowledge.field_146566_v - GuiKnowledge.field_146568_t) * f); - - if (k < field_146572_y) - { - k = field_146572_y; - } - - if (l < field_146571_z) - { - l = field_146571_z; - } - - if (k >= field_146559_A) - { - k = field_146559_A - 1; - } - - if (l >= field_146560_B) - { - l = field_146560_B - 1; - } - - int i1 = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; - int j1 = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; - int k1 = i1 + 16; - int l1 = j1 + 17; - this.zLevel = 0.0F; - GL11.glDepthFunc(GL11.GL_GEQUAL); - GL11.glPushMatrix(); - GL11.glTranslatef(k1, l1, -200.0F); - GL11.glScalef(1.0F / GuiKnowledge.field_146570_r, 1.0F / GuiKnowledge.field_146570_r, 0.0F); - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_COLOR_MATERIAL); - - int i2 = k + 288 >> 4; - int j2 = l + 288 >> 4; - int k2 = (k + 288) % 16; - int l2 = (l + 288) % 16; - boolean flag = true; - boolean flag1 = true; - boolean flag2 = true; - boolean flag3 = true; - boolean flag4 = true; - Random random = new Random(); - float f1 = 16.0F / GuiKnowledge.field_146570_r; - float f2 = 16.0F / GuiKnowledge.field_146570_r; - int i3; - int j3; - int k3; - - for (i3 = 0; i3 * f1 - l2 < 155.0F; ++i3) - { - float f3 = 0.6F - (j2 + i3) / 25.0F * 0.3F; - GL11.glColor4f(f3, f3, f3, 1.0F); - - for (j3 = 0; j3 * f2 - k2 < 224.0F; ++j3) - { - IIcon iicon = Blocks.planks.getIcon(0, 0); - - this.mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture); - this.drawTexturedModelRectFromIcon(j3 * 16 - k2, i3 * 16 - l2, iicon, 16, 16); - } - } - - GL11.glEnable(GL11.GL_DEPTH_TEST); - GL11.glDepthFunc(GL11.GL_LEQUAL); - this.mc.getTextureManager().bindTexture(screenTex); - int researchVisibility; - int j4; - int l4; - - List achievementList = (currentPage == -1 ? informationList : InformationPage.getInfoPage(currentPage).getInfoList()); - for (i3 = 0; i3 < achievementList.size(); ++i3) - { - InformationBase achievement1 = achievementList.get(i3); - - if (achievement1.parentInfo != null && achievementList.contains(achievement1.parentInfo)) - { - j3 = achievement1.displayColumn * 24 - k + 11; - k3 = achievement1.displayRow * 24 - l + 11; - l4 = achievement1.parentInfo.displayColumn * 24 - k + 11; - int l3 = achievement1.parentInfo.displayRow * 24 - l + 11; - boolean flag5 = ResearchLogic.hasInfoUnlocked(player, achievement1); - boolean flag6 = ResearchLogic.canUnlockInfo(player, achievement1); - researchVisibility = ResearchLogic.func_150874_c(player, achievement1); - - if (researchVisibility <= getVisibleRange()[0]) - { - j4 = -16777216; - - if (flag5) - { - j4 = -6250336; - } - else if (flag6) - { - j4 = -16711936; - } - - this.drawHorizontalLine(j3, l4, k3, j4); - this.drawVerticalLine(l4, k3, l3, j4); - - if (j3 > l4) - { - this.drawTexturedModalRect(j3 - 11 - 7, k3 - 5, 114, 234, 7, 11); - } - else if (j3 < l4) - { - this.drawTexturedModalRect(j3 + 11, k3 - 5, 107, 234, 7, 11); - } - else if (k3 > l3) - { - this.drawTexturedModalRect(j3 - 5, k3 - 11 - 7, 96, 234, 11, 7); - } - else if (k3 < l3) - { - this.drawTexturedModalRect(j3 - 5, k3 + 11, 96, 241, 11, 7); - } - } - } - } - - InformationBase achievement = null; - RenderItem renderitem = new RenderItem(); - float f4 = (mx - k1) * GuiKnowledge.field_146570_r; - float f5 = (my - l1) * GuiKnowledge.field_146570_r; - RenderHelper.enableGUIStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_COLOR_MATERIAL); - int i5; - int j5; - - for (l4 = 0; l4 < achievementList.size(); ++l4) - { - InformationBase achievement2 = achievementList.get(l4); - i5 = achievement2.displayColumn * 24 - k; - j5 = achievement2.displayRow * 24 - l; - - if (i5 >= -24 && j5 >= -24 && i5 <= 224.0F * GuiKnowledge.field_146570_r && j5 <= 155.0F * GuiKnowledge.field_146570_r) - { - researchVisibility = ResearchLogic.func_150874_c(player, achievement2); - float f6; - - if (ResearchLogic.hasInfoUnlocked(player, achievement2)) - { - f6 = 0.75F; - GL11.glColor4f(f6, f6, f6, 1.0F); - } - else if (ResearchLogic.canUnlockInfo(player, achievement2)) - { - f6 = 1.0F; - GL11.glColor4f(0.5F, 1.0F, 0.5F, 1.0F); - } - else if (researchVisibility < getVisibleRange()[1]) - { - f6 = 0.3F; - GL11.glColor4f(f6, f6, f6, 1.0F); - } - else if (researchVisibility == getVisibleRange()[1]) - { - f6 = 0.2F; - GL11.glColor4f(f6, f6, f6, 1.0F); - } - else - { - if (researchVisibility != getVisibleRange()[2]) - { - continue; - } - - f6 = 0.1F; - GL11.glColor4f(f6, f6, f6, 1.0F); - } - - this.mc.getTextureManager().bindTexture(screenTex); - - GL11.glEnable(GL11.GL_BLEND);// Forge: Specifically enable blend because it is needed here. And we fix Generic RenderItem's leakage of it. - if (achievement2.getSpecial()) - { - this.drawTexturedModalRect(i5 - 2, j5 - 2, 26, 202, 26, 26); - } - else if (achievement2.getPerk()) - { - this.drawTexturedModalRect(i5 - 2, j5 - 2, 52, 202, 26, 26); - } - else - { - this.drawTexturedModalRect(i5 - 2, j5 - 2, 0, 202, 26, 26); - } - GL11.glDisable(GL11.GL_BLEND); //Forge: Cleanup states we set. - - if (!ResearchLogic.canUnlockInfo(player, achievement2)) - { - f6 = 0.1F; - GL11.glColor4f(f6, f6, f6, 1.0F); - renderitem.renderWithColor = false; - } - - GL11.glDisable(GL11.GL_LIGHTING); //Forge: Make sure Lighting is disabled. Fixes MC-33065 - GL11.glEnable(GL11.GL_CULL_FACE); - renderitem.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), achievement2.theItemStack, i5 + 3, j5 + 3); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glDisable(GL11.GL_LIGHTING); - - if (!ResearchLogic.canUnlockInfo(player, achievement2)) - { - renderitem.renderWithColor = true; - } - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - if (f4 >= i5 && f4 <= i5 + 22 && f5 >= j5 && f5 <= j5 + 22) - { - achievement = achievement2; - } - } - } - - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glEnable(GL11.GL_BLEND); - GL11.glPopMatrix(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(screenTex); - this.drawTexturedModalRect(i1, j1, 0, 0, GuiKnowledge.field_146555_f, GuiKnowledge.field_146557_g); - - this.zLevel = 0.0F; - GL11.glDepthFunc(GL11.GL_LEQUAL); - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glEnable(GL11.GL_TEXTURE_2D); - - if(selected != null) - { - int purchasex = i1 + (field_146555_f - buyWidth)/2; - int purchasey =j1 + (field_146557_g - buyHeight)/2; - renderPurchaseScreen(purchasex, purchasey, mx, my); - } - drawSkillList(); - super.drawScreen(mx, my, f); - - highlighted = achievement; - if (selected == null && achievement != null) - { - String s1 = achievement.getDisplayName(); - String s2 = achievement.getDescription(); - i5 = mx + 12; - j5 = my - 4; - researchVisibility = ResearchLogic.func_150874_c(player, achievement); - - if (!ResearchLogic.canUnlockInfo(player, achievement)) - { - String s; - int k4; - - if (researchVisibility == 3) - { - s1 = I18n.format("achievement.unknown", new Object[0]); - j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); - s = (new ChatComponentTranslation("achievement.requires", new Object[] {achievement.parentInfo.getDisplayName()})).getUnformattedText(); - k4 = this.fontRendererObj.splitStringWidth(s, j4); - this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k4 + 12 + 3, -1073741824, -1073741824); - this.fontRendererObj.drawSplitString(s, i5, j5 + 12, j4, -9416624); - } - else if (researchVisibility < 3) - { - j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); - s = (new ChatComponentTranslation("achievement.requires", new Object[] {achievement.parentInfo.getDisplayName()})).getUnformattedText(); - k4 = this.fontRendererObj.splitStringWidth(s, j4); - this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k4 + 12 + 3, -1073741824, -1073741824); - this.fontRendererObj.drawSplitString(s, i5, j5 + 12, j4, -9416624); - } - else - { - s1 = null; - } - } - else - { - j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); - int k5 = this.fontRendererObj.splitStringWidth(s2, j4); - - if (ResearchLogic.hasInfoUnlocked(player, achievement) || ResearchLogic.canUnlockInfo(player, achievement)) - { - k5 += 12; - } - - this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k5 + 3 + 12, -1073741824, -1073741824); - this.fontRendererObj.drawSplitString(s2, i5, j5 + 12, j4, -6250336); - - if (ResearchLogic.hasInfoUnlocked(player, achievement)) - { - this.fontRendererObj.drawStringWithShadow(I18n.format("information.discovered", new Object[0]), i5, j5 + k5 + 4, -7302913); - } - else if(InformationBase.easyResearch && ResearchLogic.canUnlockInfo(player, achievement)) - { - this.fontRendererObj.drawStringWithShadow(StatCollector.translateToLocal("information.buy"), i5, j5 + k5 + 4, -7302913); - } - } - - if (s1 != null) - { - this.fontRendererObj.drawStringWithShadow(s1, i5, j5, ResearchLogic.canUnlockInfo(player, achievement) ? (achievement.getSpecial() ? -128 : -1) : (achievement.getSpecial() ? -8355776 : -8355712)); - } - } - - GL11.glEnable(GL11.GL_DEPTH_TEST); - GL11.glEnable(GL11.GL_LIGHTING); - RenderHelper.disableStandardItemLighting(); - } + + public GuiKnowledge(EntityPlayer user) { + this.player = user; + short short1 = 141; + short short2 = 141; + GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u = GuiKnowledge.field_146565_w = KnowledgeListMF.gettingStarted.displayColumn + * 24 - short1 / 2 - 12; + GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v = GuiKnowledge.field_146573_x = KnowledgeListMF.gettingStarted.displayRow + * 24 - short2 / 2; + informationList.clear(); + for (Object achievement : InformationList.knowledgeList) { + if (!InformationPage.isInfoInPages((InformationBase) achievement)) { + informationList.add((InformationBase) achievement); + } + } + for (Object base : InformationList.knowledgeList.toArray()) { + if (!ResearchLogic.hasInfoUnlocked(user, (InformationBase) base)) { + allDiscovered = false; + break; + } + } + } + + /** + * Adds the buttons (and other controls) to the screen in question. + */ + @Override + public void initGui() { + int i1 = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; + int j1 = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; + + this.buttonList.clear(); + this.buttonList.add(new GuiOptionButton(1, this.width / 2 + 24, this.height / 2 + 101, 80, 20, + I18n.format("gui.done", new Object[0]))); + this.buttonList.add(button = new GuiButton(2, (width - field_146555_f) / 2 + 24, height / 2 + 101, 125, 20, + InformationPage.getTitle(currentPage))); + + int purchasex = i1 + (field_146555_f - buyWidth) / 2; + int purchasey = j1 + (field_146557_g - buyHeight) / 2; + // PURCHASE SCREEN + this.buttonList.add(new GuiOptionButton(3, purchasex + 19, purchasey + 47, 80, 20, + I18n.format("gui.purchase", new Object[0]))); + this.buttonList.add(new GuiOptionButton(4, purchasex + 125, purchasey + 47, 80, 20, + I18n.format("gui.cancel", new Object[0]))); + } + + @Override + protected void mouseClicked(int x, int y, int button) { + if (selected == null && button == 0 && highlighted != null) { + if (ResearchLogic.hasInfoUnlocked(player, highlighted) && !highlighted.getPages().isEmpty()) { + player.openGui(MineFantasyII.instance, 1, player.worldObj, 0, highlighted.ID, 0); + } else if (highlighted.isEasy() && ResearchLogic.canPurchase(player, highlighted)) { + selected = highlighted; + setPurchaseAvailable(player); + } + } + super.mouseClicked(x, y, button); + } + + @Override + protected void actionPerformed(GuiButton p_146284_1_) { + if (p_146284_1_.id == 1) { + this.mc.displayGuiScreen((GuiScreen) null); + } + + if (selected == null && p_146284_1_.id == 2) { + currentPage++; + + if (currentPage >= InformationPage.getInfoPages().size()) { + currentPage = -1; + } + button.displayString = InformationPage.getTitle(currentPage); + } + + if (p_146284_1_.id == 3 && selected != null) { + ((EntityClientPlayerMP) player).sendQueue + .addToSendQueue(new ResearchRequest(player, selected.ID).generatePacket()); + selected = null; + } + if (p_146284_1_.id == 4 && selected != null) { + selected = null; + } + } + + /** + * Fired when a key is typed. This is the equivalent of + * KeyListener.keyTyped(KeyEvent e). + */ + @Override + protected void keyTyped(char p_73869_1_, int p_73869_2_) { + if (p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + this.mc.displayGuiScreen((GuiScreen) null); + this.mc.setIngameFocus(); + } else { + super.keyTyped(p_73869_1_, p_73869_2_); + } + } + + /** + * Draws the screen and all the components in it. + */ + @Override + public void drawScreen(int mx, int my, float f) { + { + int k; + + if (selected == null && Mouse.isButtonDown(0)) { + k = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; + int l = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; + int i1 = k + 8; + int j1 = l + 17; + + if ((GuiKnowledge.field_146554_D == 0 || GuiKnowledge.field_146554_D == 1) && mx >= i1 && mx < i1 + 224 + && my >= j1 && my < j1 + 155) { + if (GuiKnowledge.field_146554_D == 0) { + GuiKnowledge.field_146554_D = 1; + } else { + GuiKnowledge.field_146567_u -= (mx - GuiKnowledge.field_146563_h) * GuiKnowledge.field_146570_r; + GuiKnowledge.field_146566_v -= (my - GuiKnowledge.field_146564_i) * GuiKnowledge.field_146570_r; + GuiKnowledge.field_146565_w = GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; + GuiKnowledge.field_146573_x = GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; + } + + GuiKnowledge.field_146563_h = mx; + GuiKnowledge.field_146564_i = my; + } + } else { + GuiKnowledge.field_146554_D = 0; + } + + k = Mouse.getDWheel(); + float f4 = GuiKnowledge.field_146570_r; + + if (k < 0) { + GuiKnowledge.field_146570_r += 0.25F; + } else if (k > 0) { + GuiKnowledge.field_146570_r -= 0.25F; + } + + GuiKnowledge.field_146570_r = MathHelper.clamp_float(GuiKnowledge.field_146570_r, 1.0F, 3.0F); + + if (GuiKnowledge.field_146570_r != f4) { + float f6 = f4 - GuiKnowledge.field_146570_r; + float f5 = f4 * GuiKnowledge.field_146555_f; + float f1 = f4 * GuiKnowledge.field_146557_g; + float f2 = GuiKnowledge.field_146570_r * GuiKnowledge.field_146555_f; + float f3 = GuiKnowledge.field_146570_r * GuiKnowledge.field_146557_g; + GuiKnowledge.field_146567_u -= (f2 - f5) * 0.5F; + GuiKnowledge.field_146566_v -= (f3 - f1) * 0.5F; + GuiKnowledge.field_146565_w = GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; + GuiKnowledge.field_146573_x = GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; + } + + if (GuiKnowledge.field_146565_w < field_146572_y) { + GuiKnowledge.field_146565_w = field_146572_y; + } + + if (GuiKnowledge.field_146573_x < field_146571_z) { + GuiKnowledge.field_146573_x = field_146571_z; + } + + if (GuiKnowledge.field_146565_w >= field_146559_A) { + GuiKnowledge.field_146565_w = field_146559_A - 1; + } + + if (GuiKnowledge.field_146573_x >= field_146560_B) { + GuiKnowledge.field_146573_x = field_146560_B - 1; + } + + this.drawDefaultBackground(); + this.renderMainPage(mx, my, f); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + this.drawOverlay(); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + if (buttonList.get(2) != null) { + ((GuiButton) buttonList.get(2)).visible = selected != null; + ((GuiButton) buttonList.get(2)).enabled = selected != null && canPurchase; + ((GuiButton) buttonList.get(3)).visible = selected != null; + } + } + + /** + * Called from the main game loop to update the screen. + */ + @Override + public void updateScreen() { + { + GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; + GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; + double d0 = GuiKnowledge.field_146565_w - GuiKnowledge.field_146567_u; + double d1 = GuiKnowledge.field_146573_x - GuiKnowledge.field_146566_v; + + if (d0 * d0 + d1 * d1 < 4.0D) { + GuiKnowledge.field_146567_u += d0; + GuiKnowledge.field_146566_v += d1; + } else { + GuiKnowledge.field_146567_u += d0 * 0.85D; + GuiKnowledge.field_146566_v += d1 * 0.85D; + } + } + } + + protected void drawOverlay() { + int i = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; + int j = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; + + this.fontRendererObj.drawString(I18n.format("gui.information", new Object[0]), i + 15, j + 5, 4210752); + } + + protected void renderMainPage(int mx, int my, float f) { + int k = MathHelper.floor_double( + GuiKnowledge.field_146569_s + (GuiKnowledge.field_146567_u - GuiKnowledge.field_146569_s) * f); + int l = MathHelper.floor_double( + GuiKnowledge.field_146568_t + (GuiKnowledge.field_146566_v - GuiKnowledge.field_146568_t) * f); + + if (k < field_146572_y) { + k = field_146572_y; + } + + if (l < field_146571_z) { + l = field_146571_z; + } + + if (k >= field_146559_A) { + k = field_146559_A - 1; + } + + if (l >= field_146560_B) { + l = field_146560_B - 1; + } + + int i1 = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; + int j1 = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; + int k1 = i1 + 16; + int l1 = j1 + 17; + this.zLevel = 0.0F; + GL11.glDepthFunc(GL11.GL_GEQUAL); + GL11.glPushMatrix(); + GL11.glTranslatef(k1, l1, -200.0F); + GL11.glScalef(1.0F / GuiKnowledge.field_146570_r, 1.0F / GuiKnowledge.field_146570_r, 0.0F); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + + int i2 = k + 288 >> 4; + int j2 = l + 288 >> 4; + int k2 = (k + 288) % 16; + int l2 = (l + 288) % 16; + boolean flag = true; + boolean flag1 = true; + boolean flag2 = true; + boolean flag3 = true; + boolean flag4 = true; + Random random = new Random(); + float f1 = 16.0F / GuiKnowledge.field_146570_r; + float f2 = 16.0F / GuiKnowledge.field_146570_r; + int i3; + int j3; + int k3; + + for (i3 = 0; i3 * f1 - l2 < 155.0F; ++i3) { + float f3 = 0.6F - (j2 + i3) / 25.0F * 0.3F; + GL11.glColor4f(f3, f3, f3, 1.0F); + + for (j3 = 0; j3 * f2 - k2 < 224.0F; ++j3) { + IIcon iicon = Blocks.planks.getIcon(0, 0); + + this.mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + this.drawTexturedModelRectFromIcon(j3 * 16 - k2, i3 * 16 - l2, iicon, 16, 16); + } + } + + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glDepthFunc(GL11.GL_LEQUAL); + this.mc.getTextureManager().bindTexture(screenTex); + int researchVisibility; + int j4; + int l4; + + List achievementList = (currentPage == -1 ? informationList + : InformationPage.getInfoPage(currentPage).getInfoList()); + for (i3 = 0; i3 < achievementList.size(); ++i3) { + InformationBase achievement1 = achievementList.get(i3); + + if (achievement1.parentInfo != null && achievementList.contains(achievement1.parentInfo)) { + j3 = achievement1.displayColumn * 24 - k + 11; + k3 = achievement1.displayRow * 24 - l + 11; + l4 = achievement1.parentInfo.displayColumn * 24 - k + 11; + int l3 = achievement1.parentInfo.displayRow * 24 - l + 11; + boolean flag5 = ResearchLogic.hasInfoUnlocked(player, achievement1); + boolean flag6 = ResearchLogic.canUnlockInfo(player, achievement1); + researchVisibility = ResearchLogic.func_150874_c(player, achievement1); + + if (researchVisibility <= getVisibleRange()[0]) { + j4 = -16777216; + + if (flag5) { + j4 = -6250336; + } else if (flag6) { + j4 = -16711936; + } + + this.drawHorizontalLine(j3, l4, k3, j4); + this.drawVerticalLine(l4, k3, l3, j4); + + if (j3 > l4) { + this.drawTexturedModalRect(j3 - 11 - 7, k3 - 5, 114, 234, 7, 11); + } else if (j3 < l4) { + this.drawTexturedModalRect(j3 + 11, k3 - 5, 107, 234, 7, 11); + } else if (k3 > l3) { + this.drawTexturedModalRect(j3 - 5, k3 - 11 - 7, 96, 234, 11, 7); + } else if (k3 < l3) { + this.drawTexturedModalRect(j3 - 5, k3 + 11, 96, 241, 11, 7); + } + } + } + } + + InformationBase achievement = null; + RenderItem renderitem = new RenderItem(); + float f4 = (mx - k1) * GuiKnowledge.field_146570_r; + float f5 = (my - l1) * GuiKnowledge.field_146570_r; + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + int i5; + int j5; + + for (l4 = 0; l4 < achievementList.size(); ++l4) { + InformationBase achievement2 = achievementList.get(l4); + i5 = achievement2.displayColumn * 24 - k; + j5 = achievement2.displayRow * 24 - l; + + if (i5 >= -24 && j5 >= -24 && i5 <= 224.0F * GuiKnowledge.field_146570_r + && j5 <= 155.0F * GuiKnowledge.field_146570_r) { + researchVisibility = ResearchLogic.func_150874_c(player, achievement2); + float f6; + + if (ResearchLogic.hasInfoUnlocked(player, achievement2)) { + f6 = 0.75F; + GL11.glColor4f(f6, f6, f6, 1.0F); + } else if (ResearchLogic.canUnlockInfo(player, achievement2)) { + f6 = 1.0F; + GL11.glColor4f(0.5F, 1.0F, 0.5F, 1.0F); + } else if (researchVisibility < getVisibleRange()[1]) { + f6 = 0.3F; + GL11.glColor4f(f6, f6, f6, 1.0F); + } else if (researchVisibility == getVisibleRange()[1]) { + f6 = 0.2F; + GL11.glColor4f(f6, f6, f6, 1.0F); + } else { + if (researchVisibility != getVisibleRange()[2]) { + continue; + } + + f6 = 0.1F; + GL11.glColor4f(f6, f6, f6, 1.0F); + } + + this.mc.getTextureManager().bindTexture(screenTex); + + GL11.glEnable(GL11.GL_BLEND);// Forge: Specifically enable blend because it is needed here. And we fix + // Generic RenderItem's leakage of it. + if (achievement2.getSpecial()) { + this.drawTexturedModalRect(i5 - 2, j5 - 2, 26, 202, 26, 26); + } else if (achievement2.getPerk()) { + this.drawTexturedModalRect(i5 - 2, j5 - 2, 52, 202, 26, 26); + } else { + this.drawTexturedModalRect(i5 - 2, j5 - 2, 0, 202, 26, 26); + } + GL11.glDisable(GL11.GL_BLEND); // Forge: Cleanup states we set. + + if (!ResearchLogic.canUnlockInfo(player, achievement2)) { + f6 = 0.1F; + GL11.glColor4f(f6, f6, f6, 1.0F); + renderitem.renderWithColor = false; + } + + GL11.glDisable(GL11.GL_LIGHTING); // Forge: Make sure Lighting is disabled. Fixes MC-33065 + GL11.glEnable(GL11.GL_CULL_FACE); + renderitem.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), + achievement2.theItemStack, i5 + 3, j5 + 3); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDisable(GL11.GL_LIGHTING); + + if (!ResearchLogic.canUnlockInfo(player, achievement2)) { + renderitem.renderWithColor = true; + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + if (f4 >= i5 && f4 <= i5 + 22 && f5 >= j5 && f5 <= j5 + 22) { + achievement = achievement2; + } + } + } + + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glPopMatrix(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(screenTex); + this.drawTexturedModalRect(i1, j1, 0, 0, GuiKnowledge.field_146555_f, GuiKnowledge.field_146557_g); + + this.zLevel = 0.0F; + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + + if (selected != null) { + int purchasex = i1 + (field_146555_f - buyWidth) / 2; + int purchasey = j1 + (field_146557_g - buyHeight) / 2; + renderPurchaseScreen(purchasex, purchasey, mx, my); + } + drawSkillList(); + super.drawScreen(mx, my, f); + + highlighted = achievement; + if (selected == null && achievement != null) { + String s1 = achievement.getDisplayName(); + String s2 = achievement.getDescription(); + i5 = mx + 12; + j5 = my - 4; + researchVisibility = ResearchLogic.func_150874_c(player, achievement); + + if (!ResearchLogic.canUnlockInfo(player, achievement)) { + String s; + int k4; + + if (researchVisibility == 3) { + s1 = I18n.format("achievement.unknown", new Object[0]); + j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); + s = (new ChatComponentTranslation("achievement.requires", + new Object[] { achievement.parentInfo.getDisplayName() })).getUnformattedText(); + k4 = this.fontRendererObj.splitStringWidth(s, j4); + this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k4 + 12 + 3, -1073741824, -1073741824); + this.fontRendererObj.drawSplitString(s, i5, j5 + 12, j4, -9416624); + } else if (researchVisibility < 3) { + j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); + s = (new ChatComponentTranslation("achievement.requires", + new Object[] { achievement.parentInfo.getDisplayName() })).getUnformattedText(); + k4 = this.fontRendererObj.splitStringWidth(s, j4); + this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k4 + 12 + 3, -1073741824, -1073741824); + this.fontRendererObj.drawSplitString(s, i5, j5 + 12, j4, -9416624); + } else { + s1 = null; + } + } else { + j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); + int k5 = this.fontRendererObj.splitStringWidth(s2, j4); + + if (ResearchLogic.hasInfoUnlocked(player, achievement) + || ResearchLogic.canUnlockInfo(player, achievement)) { + k5 += 12; + } + + this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k5 + 3 + 12, -1073741824, -1073741824); + this.fontRendererObj.drawSplitString(s2, i5, j5 + 12, j4, -6250336); + + if (ResearchLogic.hasInfoUnlocked(player, achievement)) { + this.fontRendererObj.drawStringWithShadow(I18n.format("information.discovered", new Object[0]), i5, + j5 + k5 + 4, -7302913); + } else if (InformationBase.easyResearch && ResearchLogic.canUnlockInfo(player, achievement)) { + this.fontRendererObj.drawStringWithShadow(StatCollector.translateToLocal("information.buy"), i5, + j5 + k5 + 4, -7302913); + } + } + + if (s1 != null) { + this.fontRendererObj.drawStringWithShadow(s1, i5, j5, + ResearchLogic.canUnlockInfo(player, achievement) ? (achievement.getSpecial() ? -128 : -1) + : (achievement.getSpecial() ? -8355776 : -8355712)); + } + } + + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_LIGHTING); + RenderHelper.disableStandardItemLighting(); + } /** - * Returns true if this GUI should pause the game when it is displayed in single-player - */ - @Override - public boolean doesGuiPauseGame() - { - return false; - } - - private int[] getVisibleRange() - { - return new int[]{1, 2, 3}; - } - - private void renderPurchaseScreen(int x, int y, int mx, int my) - { - if(selected != null) - { - String[] requirements = selected.getRequiredSkills(); - int size = 0; - if(requirements != null) - { - size = requirements.length; - } - this.mc.getTextureManager().bindTexture(buyTex); - this.drawTexturedModalRect(x, y, 0, 0, buyWidth, 27);//Top - for(int a = 0; a < size; a++) - { - this.drawTexturedModalRect(x, y+27 + (a*19), 0, 27, buyWidth, 19);//Middle - } - this.drawTexturedModalRect(x, y+27 + (size*19), 0, 46, buyWidth, 26);//Bottom - - if(buttonList.get(2) != null && buttonList.get(3) != null) - { - int j1 = (this.height - GuiKnowledge.field_146557_g) / 2; - int purchasey =j1 + (field_146557_g - buyHeight)/2; - - int offset = -19; - if(requirements != null) - { - offset += (19*requirements.length); - } - ((GuiButton)buttonList.get(2)).yPosition = purchasey + 47 + offset; - ((GuiButton)buttonList.get(3)).yPosition = purchasey + 47 + offset; - } - int red = GuiHelper.getColourForRGB(220, 0, 0); - int white = 16777215; - mc.fontRenderer.drawString(selected.getDisplayName(), x+22, y+12, white, false); - - if(hasScroll) - { - mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("knowledge.hasScroll"), x+20, y+32, red); - } - else - { - for(int a = 0; a < requirements.length; a ++) - { - boolean isUnlocked = selected.isUnlocked(a, mc.thePlayer); - String text = requirements[a]; - mc.fontRenderer.drawStringWithShadow(text, x+20, y+32 + (a*19), isUnlocked ? white : red); - } - } - } - GL11.glColor3f(255, 255, 255); + * Returns true if this GUI should pause the game when it is displayed in + * single-player + */ + @Override + public boolean doesGuiPauseGame() { + return false; + } + + private int[] getVisibleRange() { + return new int[] { 1, 2, 3 }; + } + + private void renderPurchaseScreen(int x, int y, int mx, int my) { + if (selected != null) { + String[] requirements = selected.getRequiredSkills(); + int size = 0; + if (requirements != null) { + size = requirements.length; + } + this.mc.getTextureManager().bindTexture(buyTex); + this.drawTexturedModalRect(x, y, 0, 0, buyWidth, 27);// Top + for (int a = 0; a < size; a++) { + this.drawTexturedModalRect(x, y + 27 + (a * 19), 0, 27, buyWidth, 19);// Middle + } + this.drawTexturedModalRect(x, y + 27 + (size * 19), 0, 46, buyWidth, 26);// Bottom + + if (buttonList.get(2) != null && buttonList.get(3) != null) { + int j1 = (this.height - GuiKnowledge.field_146557_g) / 2; + int purchasey = j1 + (field_146557_g - buyHeight) / 2; + + int offset = -19; + if (requirements != null) { + offset += (19 * requirements.length); + } + ((GuiButton) buttonList.get(2)).yPosition = purchasey + 47 + offset; + ((GuiButton) buttonList.get(3)).yPosition = purchasey + 47 + offset; + } + int red = GuiHelper.getColourForRGB(220, 0, 0); + int white = 16777215; + mc.fontRenderer.drawString(selected.getDisplayName(), x + 22, y + 12, white, false); + + if (hasScroll) { + mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("knowledge.hasScroll"), x + 20, + y + 32, red); + } else { + for (int a = 0; a < requirements.length; a++) { + boolean isUnlocked = selected.isUnlocked(a, mc.thePlayer); + String text = requirements[a]; + mc.fontRenderer.drawStringWithShadow(text, x + 20, y + 32 + (a * 19), isUnlocked ? white : red); + } + } + } + GL11.glColor3f(255, 255, 255); + } + + private void setPurchaseAvailable(EntityPlayer user) { + if (selected != null) { + canPurchase = selected.hasSkillsUnlocked(user); + } else { + canPurchase = false; + } + } + + protected void drawSkillList() { + GL11.glPushMatrix(); + + int skillWidth = 143; + int skillHeight = 156; + int x = (this.width - GuiKnowledge.field_146555_f) / 2 - skillWidth + offsetByX; + int y = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; + this.mc.getTextureManager().bindTexture(skillTex); + + this.drawTexturedModalRect(x, y, 0, 0, skillWidth, skillHeight); + + drawSkill(x + 20, y + 20, SkillList.artisanry); + drawSkill(x + 20, y + 44, SkillList.construction); + drawSkill(x + 20, y + 68, SkillList.provisioning); + drawSkill(x + 20, y + 92, SkillList.engineering); + drawSkill(x + 20, y + 116, SkillList.combat); + + drawSkillName(x + 20, y + 20, SkillList.artisanry); + drawSkillName(x + 20, y + 44, SkillList.construction); + drawSkillName(x + 20, y + 68, SkillList.provisioning); + drawSkillName(x + 20, y + 92, SkillList.engineering); + drawSkillName(x + 20, y + 116, SkillList.combat); + + GL11.glPopMatrix(); + } + + protected void drawSkill(int x, int y, Skill skill) { + if (skill != null) { + int level = RPGElements.getLevel(mc.thePlayer, skill); + int xp = skill.getXP(player)[0]; + int max = skill.getXP(player)[1]; + if (xp > max) + xp = max; + + float scale = (float) xp / (float) max; + this.drawTexturedModalRect(x + 22, y + 13, 0, 156, (int) (78F * scale), 5); + + // mc.fontRenderer.drawString(skill.getDisplayName(), x+2, y+1, 0); + // mc.fontRenderer.drawString(""+level, x+1, y+10, 0); + } + } + + protected void drawSkillName(int x, int y, Skill skill) { + if (skill != null) { + int level = RPGElements.getLevel(mc.thePlayer, skill); + mc.fontRenderer.drawString(skill.getDisplayName(), x + 2, y + 1, 0); + mc.fontRenderer.drawString("" + level, x + 1, y + 10, 0); + } } - - private void setPurchaseAvailable(EntityPlayer user) - { - if(selected != null) - { - canPurchase = selected.hasSkillsUnlocked(user); - } - else - { - canPurchase = false; - } - } - - protected void drawSkillList() - { - GL11.glPushMatrix(); - - int skillWidth = 143; - int skillHeight = 156; - int x = (this.width - GuiKnowledge.field_146555_f) / 2 - skillWidth + offsetByX; - int y = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; - this.mc.getTextureManager().bindTexture(skillTex); - - this.drawTexturedModalRect(x, y, 0, 0, skillWidth, skillHeight); - - drawSkill(x+20, y+20, SkillList.artisanry); - drawSkill(x+20, y+44, SkillList.construction); - drawSkill(x+20, y+68, SkillList.provisioning); - drawSkill(x+20, y+92, SkillList.engineering); - drawSkill(x+20, y+116, SkillList.combat); - - drawSkillName(x+20, y+20, SkillList.artisanry); - drawSkillName(x+20, y+44, SkillList.construction); - drawSkillName(x+20, y+68, SkillList.provisioning); - drawSkillName(x+20, y+92, SkillList.engineering); - drawSkillName(x+20, y+116, SkillList.combat); - - GL11.glPopMatrix(); - } - - protected void drawSkill(int x, int y, Skill skill) - { - if(skill != null) - { - int level = RPGElements.getLevel(mc.thePlayer, skill); - int xp = skill.getXP(player)[0]; - int max = skill.getXP(player)[1]; - if(xp > max)xp = max; - - float scale = (float)xp / (float)max; - this.drawTexturedModalRect(x+22, y+13, 0, 156, (int)(78F * scale), 5); - - //mc.fontRenderer.drawString(skill.getDisplayName(), x+2, y+1, 0); - //mc.fontRenderer.drawString(""+level, x+1, y+10, 0); - } - } - protected void drawSkillName(int x, int y, Skill skill) - { - if(skill != null) - { - int level = RPGElements.getLevel(mc.thePlayer, skill); - mc.fontRenderer.drawString(skill.getDisplayName(), x+2, y+1, 0); - mc.fontRenderer.drawString(""+level, x+1, y+10, 0); - } - } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiKnowledgeEntry.java b/src/main/java/minefantasy/mf2/client/gui/GuiKnowledgeEntry.java index 3be717fa..776bb78b 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiKnowledgeEntry.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiKnowledgeEntry.java @@ -19,183 +19,163 @@ import net.minecraft.util.ResourceLocation; @SideOnly(Side.CLIENT) -public class GuiKnowledgeEntry extends GuiScreen -{ - //GuiScreenBook +public class GuiKnowledgeEntry extends GuiScreen { + // GuiScreenBook private final GuiScreen parentGui; private final InformationBase infoBase; private Minecraft mc = Minecraft.getMinecraft(); private int pages = 1; private int currentPage = 0; - public int bookImageWidth = EntryPageCraft.universalBookImageWidth; - public int bookImageHeight = EntryPageCraft.universalBookImageHeight; - private GuiKnowledgeEntry.NextPageButton buttonNextPage; - private GuiKnowledgeEntry.NextPageButton buttonPreviousPage; - private GuiButton buttonDone; - - public GuiKnowledgeEntry(GuiScreen parent, InformationBase info) - { + public int bookImageWidth = EntryPageCraft.universalBookImageWidth; + public int bookImageHeight = EntryPageCraft.universalBookImageHeight; + private GuiKnowledgeEntry.NextPageButton buttonNextPage; + private GuiKnowledgeEntry.NextPageButton buttonPreviousPage; + private GuiButton buttonDone; + + public GuiKnowledgeEntry(GuiScreen parent, InformationBase info) { this.parentGui = parent; this.infoBase = info; pages = info.getPages().size(); } - + @Override - public void initGui() - { + public void initGui() { int xPoint = this.width / 2; - int yPoint = (this.height - this.bookImageHeight) / 2; - - this.buttonList.clear(); - this.buttonList.add(this.buttonDone = new GuiButton(0, this.width / 2 - 100, 4 + yPoint + this.bookImageHeight-16, 200, 20, I18n.format("gui.done", new Object[0]))); - this.buttonList.add(this.buttonNextPage = new GuiKnowledgeEntry.NextPageButton(1, xPoint +bookImageWidth - 22, yPoint + 209, true)); - this.buttonList.add(this.buttonPreviousPage = new GuiKnowledgeEntry.NextPageButton(2, xPoint -bookImageWidth + 4, yPoint + 209, false)); - this.updateButtons(); - } - - private void updateButtons() - { - this.buttonNextPage.visible = (this.currentPage < this.pages - 2); - this.buttonPreviousPage.visible = this.currentPage > 1; - } + int yPoint = (this.height - this.bookImageHeight) / 2; + + this.buttonList.clear(); + this.buttonList.add(this.buttonDone = new GuiButton(0, this.width / 2 - 100, + 4 + yPoint + this.bookImageHeight - 16, 200, 20, I18n.format("gui.done", new Object[0]))); + this.buttonList.add(this.buttonNextPage = new GuiKnowledgeEntry.NextPageButton(1, xPoint + bookImageWidth - 22, + yPoint + 209, true)); + this.buttonList.add(this.buttonPreviousPage = new GuiKnowledgeEntry.NextPageButton(2, + xPoint - bookImageWidth + 4, yPoint + 209, false)); + this.updateButtons(); + } + + private void updateButtons() { + this.buttonNextPage.visible = (this.currentPage < this.pages - 2); + this.buttonPreviousPage.visible = this.currentPage > 1; + } + private static boolean lastTick = true; private static boolean canTick = true; + @Override - public void drawScreen(int x, int y, float f) - { + public void drawScreen(int x, int y, float f) { boolean onTick = false; - - boolean currTick = mc.theWorld.getTotalWorldTime() % 10 == 0;//has a second passed - - if(currTick != lastTick) - { + + boolean currTick = mc.theWorld.getTotalWorldTime() % 10 == 0;// has a second passed + + if (currTick != lastTick) { canTick = !canTick; - if(canTick) - { + if (canTick) { onTick = true; } } lastTick = currTick; - + drawPage(x, y, f, currentPage, -(bookImageWidth / 2), "left_page", onTick); - drawPage(x, y, f, currentPage+1, (bookImageWidth / 2), "right_page", onTick); - + drawPage(x, y, f, currentPage + 1, (bookImageWidth / 2), "right_page", onTick); + super.drawScreen(x, y, f); - } - public void drawPage(int x, int y, float f, int num, int offset, String tex, boolean onTick) - { + } + + public void drawPage(int x, int y, float f, int num, int offset, String tex, boolean onTick) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + int xPoint = (this.width - this.bookImageWidth) / 2 + offset; - int yPoint = (this.height - this.bookImageHeight) / 2; - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/"+tex+".png")); - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.bookImageWidth, this.bookImageHeight); - - if(num < infoBase.getPages().size()) - { - EntryPage page = infoBase.getPages().get(num); - if(page != null) - { + int yPoint = (this.height - this.bookImageHeight) / 2; + + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/" + tex + ".png")); + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.bookImageWidth, this.bookImageHeight); + + if (num < infoBase.getPages().size()) { + EntryPage page = infoBase.getPages().get(num); + if (page != null) { page.preRender(this, x, y, f, xPoint, yPoint, onTick); page.render(this, x, y, f, xPoint, yPoint, onTick); } } - - String s = I18n.format("book.pageIndicator", new Object[] {Integer.valueOf(num + 1), Integer.valueOf(this.pages)}); - int l = mc.fontRenderer.getStringWidth(s) / 2; - this.fontRendererObj.drawString(s, xPoint + (bookImageWidth/2) - l, yPoint + bookImageHeight-16, 0); - } - + + String s = I18n.format("book.pageIndicator", + new Object[] { Integer.valueOf(num + 1), Integer.valueOf(this.pages) }); + int l = mc.fontRenderer.getStringWidth(s) / 2; + this.fontRendererObj.drawString(s, xPoint + (bookImageWidth / 2) - l, yPoint + bookImageHeight - 16, 0); + } + @Override - protected void actionPerformed(GuiButton button) - { - if (button.id == 0) - { - this.mc.displayGuiScreen(parentGui); - } - if (button.id == 1) - { - if(currentPage < pages-2) - { - currentPage +=2; - } - } - if (button.id == 2) - { - if(currentPage > 1) - { - currentPage -= 2; - } - } - updateButtons(); - } - + protected void actionPerformed(GuiButton button) { + if (button.id == 0) { + this.mc.displayGuiScreen(parentGui); + } + if (button.id == 1) { + if (currentPage < pages - 2) { + currentPage += 2; + } + } + if (button.id == 2) { + if (currentPage > 1) { + currentPage -= 2; + } + } + updateButtons(); + } + @Override - protected void keyTyped(char p_73869_1_, int p_73869_2_) - { - if (p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) - { - mc.thePlayer.openGui(MineFantasyII.instance, 1, mc.thePlayer.worldObj, 0, -1, 0); - } - else - { - super.keyTyped(p_73869_1_, p_73869_2_); - } - } - + protected void keyTyped(char p_73869_1_, int p_73869_2_) { + if (p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + mc.thePlayer.openGui(MineFantasyII.instance, 1, mc.thePlayer.worldObj, 0, -1, 0); + } else { + super.keyTyped(p_73869_1_, p_73869_2_); + } + } + @Override - public boolean doesGuiPauseGame() - { + public boolean doesGuiPauseGame() { return false; } - - + @SideOnly(Side.CLIENT) - static class NextPageButton extends GuiButton - { - private final boolean isNextPage; - - public NextPageButton(int p_i1079_1_, int p_i1079_2_, int p_i1079_3_, boolean p_i1079_4_) - { - super(p_i1079_1_, p_i1079_2_, p_i1079_3_, 23, 13, ""); - this.isNextPage = p_i1079_4_; - } - - /** - * Draws this button to the screen. - */ - public void drawButton(Minecraft mc, int x, int y) - { - if (this.visible) - { - boolean flag = x >= this.xPosition && y >= this.yPosition && x < this.xPosition + this.width && y < this.yPosition + this.height; - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/book.png")); - int k = 0; - int l = 228; - - if (flag) - { - k += 18; - } - - if (!this.isNextPage) - { - l += 10; - } - - this.drawTexturedModalRect(this.xPosition, this.yPosition, k, l, 18, 10); - } - } - - @Override - public void func_146113_a(SoundHandler snd) - { - snd.playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("minefantasy2:block.flipPage"), 1.0F)); - } - } + static class NextPageButton extends GuiButton { + private final boolean isNextPage; + + public NextPageButton(int p_i1079_1_, int p_i1079_2_, int p_i1079_3_, boolean p_i1079_4_) { + super(p_i1079_1_, p_i1079_2_, p_i1079_3_, 23, 13, ""); + this.isNextPage = p_i1079_4_; + } + + /** + * Draws this button to the screen. + */ + public void drawButton(Minecraft mc, int x, int y) { + if (this.visible) { + boolean flag = x >= this.xPosition && y >= this.yPosition && x < this.xPosition + this.width + && y < this.yPosition + this.height; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/book.png")); + int k = 0; + int l = 228; + + if (flag) { + k += 18; + } + + if (!this.isNextPage) { + l += 10; + } + + this.drawTexturedModalRect(this.xPosition, this.yPosition, k, l, 18, 10); + } + } + + @Override + public void func_146113_a(SoundHandler snd) { + snd.playSound( + PositionedSoundRecord.func_147674_a(new ResourceLocation("minefantasy2:block.flipPage"), 1.0F)); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiQuern.java b/src/main/java/minefantasy/mf2/client/gui/GuiQuern.java index aeea75dd..e6ab320b 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiQuern.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiQuern.java @@ -1,50 +1,44 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityQuern; import minefantasy.mf2.container.ContainerQuern; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiQuern extends GuiContainer { + private TileEntityQuern tile; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + public GuiQuern(InventoryPlayer user, TileEntityQuern tile) { + super(new ContainerQuern(user, tile)); + this.ySize = 175; + this.tile = tile; + } -@SideOnly(Side.CLIENT) -public class GuiQuern extends GuiContainer -{ - private TileEntityQuern tile; - - public GuiQuern(InventoryPlayer user, TileEntityQuern tile) - { - super(new ContainerQuern(user, tile)); - this.ySize = 175; - this.tile = tile; - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - } + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/quern.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/quern.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } - - @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiReload.java b/src/main/java/minefantasy/mf2/client/gui/GuiReload.java index 4467c93c..9c57d33a 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiReload.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiReload.java @@ -1,54 +1,47 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.container.ContainerReload; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiReload extends GuiContainer { + public GuiReload(InventoryPlayer user, ItemStack weapon) { + super(new ContainerReload(user, weapon)); + this.ySize = 148; + this.xSize = 176; + } -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } -@SideOnly(Side.CLIENT) -public class GuiReload extends GuiContainer -{ - public GuiReload(InventoryPlayer user, ItemStack weapon) - { - super(new ContainerReload(user, weapon)); - this.ySize = 148; - this.xSize = 176; - } + @Override + protected boolean checkHotbarKeys(int id) { + return false; + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - } - - @Override - protected boolean checkHotbarKeys(int id) - { - return false; - } + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/reload.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/reload.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } - - @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiResearchBlock.java b/src/main/java/minefantasy/mf2/client/gui/GuiResearchBlock.java index 368cb15e..ce07eeba 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiResearchBlock.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiResearchBlock.java @@ -1,55 +1,49 @@ package minefantasy.mf2.client.gui; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityResearch; import minefantasy.mf2.container.ContainerResearch; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.StatCollector; -import org.lwjgl.opengl.GL11; +@SideOnly(Side.CLIENT) +public class GuiResearchBlock extends GuiContainer { + private TileEntityResearch tile; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + public GuiResearchBlock(InventoryPlayer user, TileEntityResearch tile) { + super(new ContainerResearch(user, tile)); + this.ySize = 158; + this.xSize = 178; + this.tile = tile; + } -@SideOnly(Side.CLIENT) -public class GuiResearchBlock extends GuiContainer -{ - private TileEntityResearch tile; - - public GuiResearchBlock(InventoryPlayer user, TileEntityResearch tile) - { - super(new ContainerResearch(user, tile)); - this.ySize = 158; - this.xSize = 178; - this.tile = tile; - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) - { - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/research.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - - int scale = tile.getMetreScale(161); - this.drawTexturedModalRect(xPoint+10, yPoint+33, 0, 158, scale, 3); - fontRendererObj.drawString(tile.getLocalisedName(), xPoint+9, yPoint+11, 0); - } - - @Override - public void drawScreen(int x, int y, float f) - { - super.drawScreen(x, y, f); - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/research.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + + int scale = tile.getMetreScale(161); + this.drawTexturedModalRect(xPoint + 10, yPoint + 33, 0, 158, scale, 3); + fontRendererObj.drawString(tile.getLocalisedName(), xPoint + 9, yPoint + 11, 0); + } + + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/AnimationHandlerMF.java b/src/main/java/minefantasy/mf2/client/render/AnimationHandlerMF.java index 39016e20..e0bce709 100644 --- a/src/main/java/minefantasy/mf2/client/render/AnimationHandlerMF.java +++ b/src/main/java/minefantasy/mf2/client/render/AnimationHandlerMF.java @@ -1,23 +1,17 @@ package minefantasy.mf2.client.render; -import minefantasy.mf2.item.weapon.ItemWeaponMF; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; +import net.minecraft.entity.player.EntityPlayer; -public class AnimationHandlerMF -{ +public class AnimationHandlerMF { @SubscribeEvent - public void onPlayerTick(TickEvent.PlayerTickEvent event) - { - if(event.phase == TickEvent.Phase.START) - { - tickStart(event.player); - } - } + public void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + tickStart(event.player); + } + } - public void tickStart(EntityPlayer entityPlayer) - { - } + public void tickStart(EntityPlayer entityPlayer) { + } } diff --git a/src/main/java/minefantasy/mf2/client/render/HudHandlerMF.java b/src/main/java/minefantasy/mf2/client/render/HudHandlerMF.java index bae8faf7..380599cf 100644 --- a/src/main/java/minefantasy/mf2/client/render/HudHandlerMF.java +++ b/src/main/java/minefantasy/mf2/client/render/HudHandlerMF.java @@ -1,54 +1,44 @@ package minefantasy.mf2.client.render; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.item.archery.ItemBowMF; import minefantasy.mf2.item.gadget.IScope; -import minefantasy.mf2.item.gadget.ItemSpyglass; import net.minecraft.item.ItemStack; import net.minecraftforge.client.event.FOVUpdateEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class HudHandlerMF -{ +public class HudHandlerMF { private MineFantasyHUD inGameGUI = new MineFantasyHUD(); - + @SubscribeEvent - public void postRenderOverlay(RenderGameOverlayEvent.Post event) - { - if (event.type == RenderGameOverlayEvent.ElementType.HOTBAR) - { + public void postRenderOverlay(RenderGameOverlayEvent.Post event) { + if (event.type == RenderGameOverlayEvent.ElementType.HOTBAR) { inGameGUI.renderGameOverlay(event.partialTicks, event.mouseX, event.mouseY); } - if (event.type == RenderGameOverlayEvent.ElementType.HELMET) - { + if (event.type == RenderGameOverlayEvent.ElementType.HELMET) { inGameGUI.renderViewport(); } } - + @SubscribeEvent - public void onBowFOV(FOVUpdateEvent event) - { + public void onBowFOV(FOVUpdateEvent event) { ItemStack stack = event.entity.getItemInUse(); - if (stack != null && stack.getItem() instanceof ItemBowMF) - { - int i = event.entity.getItemInUseDuration(); - float f1 = i / 20.0F; - if (f1 > 1.0F) - { - f1 = 1.0F; - } - else{ - f1 *= f1; - } - event.newfov *= 1.0F - f1 * 0.15F; - } - if (stack != null && stack.getItem() instanceof IScope) - { - IScope spyglass = (IScope)stack.getItem(); - event.newfov *= 1.0F - spyglass.getZoom(stack); - } - } + if (stack != null && stack.getItem() instanceof ItemBowMF) { + int i = event.entity.getItemInUseDuration(); + float f1 = i / 20.0F; + if (f1 > 1.0F) { + f1 = 1.0F; + } else { + f1 *= f1; + } + event.newfov *= 1.0F - f1 * 0.15F; + } + if (stack != null && stack.getItem() instanceof IScope) { + IScope spyglass = (IScope) stack.getItem(); + event.newfov *= 1.0F - spyglass.getZoom(stack); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java b/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java index 1142f1ff..e963ae88 100644 --- a/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java +++ b/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java @@ -41,577 +41,533 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class MineFantasyHUD extends Gui -{ +public class MineFantasyHUD extends Gui { private static Minecraft mc = Minecraft.getMinecraft(); - public void renderViewport() - { - if(mc.thePlayer != null) - { + + public void renderViewport() { + if (mc.thePlayer != null) { EntityPlayer player = mc.thePlayer; - - if(this.mc.gameSettings.thirdPersonView == 0) - { - if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IScope) - { + + if (this.mc.gameSettings.thirdPersonView == 0) { + if (player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IScope) { renderScope(player.getHeldItem(), player); } - if(player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) - { - renderPowerHelmet(player, (EntityCogwork)player.ridingEntity); + if (player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) { + renderPowerHelmet(player, (EntityCogwork) player.ridingEntity); } } } } - public void renderGameOverlay(float partialTicks, int mouseX, int mouseY) - { - if(mc.thePlayer != null) - { + + public void renderGameOverlay(float partialTicks, int mouseX, int mouseY) { + if (mc.thePlayer != null) { EntityPlayer player = mc.thePlayer; - - if(mc.currentScreen != null && (mc.currentScreen instanceof GuiInventory || mc.currentScreen instanceof GuiContainerCreative)) - { + + if (mc.currentScreen != null + && (mc.currentScreen instanceof GuiInventory || mc.currentScreen instanceof GuiContainerCreative)) { renderArmourRating(player); - } - else - { + } else { renderAmmo(player); } - if(StaminaBar.isSystemActive && !player.capabilities.isCreativeMode && !PowerArmour.isWearingCogwork(player)) - { + if (StaminaBar.isSystemActive && !player.capabilities.isCreativeMode + && !PowerArmour.isWearingCogwork(player)) { renderStaminaBar(player); } Entity highlight = getClickedEntity(partialTicks, mouseX, mouseY); - if(highlight != null && highlight instanceof EntityCogwork) - { - lookAtCogwork((EntityCogwork)highlight); + if (highlight != null && highlight instanceof EntityCogwork) { + lookAtCogwork((EntityCogwork) highlight); } - + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - + int[] coords = getClickedBlock(partialTicks, mouseX, mouseY); - if(coords == null)return; - + if (coords == null) + return; + int x = coords[0]; int y = coords[1]; int z = coords[2]; World world = player.worldObj; TileEntity tile = world.getTileEntity(x, y, z); - if(tile != null) - { - if(tile instanceof TileEntityAnvilMF) - { - this.renderCraftMetre(world, player, (TileEntityAnvilMF)tile); + if (tile != null) { + if (tile instanceof TileEntityAnvilMF) { + this.renderCraftMetre(world, player, (TileEntityAnvilMF) tile); } - if(tile instanceof TileEntityCarpenterMF) - { - this.renderCraftMetre(world, player, (TileEntityCarpenterMF)tile); + if (tile instanceof TileEntityCarpenterMF) { + this.renderCraftMetre(world, player, (TileEntityCarpenterMF) tile); } - if(tile instanceof TileEntityTanningRack) - { - this.renderCraftMetre(world, player, (TileEntityTanningRack)tile); + if (tile instanceof TileEntityTanningRack) { + this.renderCraftMetre(world, player, (TileEntityTanningRack) tile); } - if(tile instanceof IBasicMetre) - { - this.renderCraftMetre(world, player, (IBasicMetre)tile); + if (tile instanceof IBasicMetre) { + this.renderCraftMetre(world, player, (IBasicMetre) tile); } - if(tile instanceof IQualityBalance) - { - this.renderQualityBalance(world, player, (IQualityBalance)tile); + if (tile instanceof IQualityBalance) { + this.renderQualityBalance(world, player, (IQualityBalance) tile); } - if(tile instanceof TileEntityRoad) - { - renderRoad(world, player, ((TileEntityRoad)tile)); + if (tile instanceof TileEntityRoad) { + renderRoad(world, player, ((TileEntityRoad) tile)); } } } } + protected static final ResourceLocation pumpkinBlurTexPath = new ResourceLocation("textures/misc/pumpkinblur.png"); - - protected void renderPowerHelmet() - { + + protected void renderPowerHelmet() { GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/scopes/cogwork_helm.png"); - int x = (width/2 - 256); - int y = height - 256; - - this.drawTexturedModalRect(x, y, 0, 64, 128, 64); - - GL11.glPopMatrix(); - } - - private void renderScope(ItemStack item, EntityPlayer user) - { - if(item.getItem() instanceof IFirearm) - { - float factor = ((IScope)item.getItem()).getZoom(item); - if(factor > 0.1F) - { + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/scopes/cogwork_helm.png"); + int x = (width / 2 - 256); + int y = height - 256; + + this.drawTexturedModalRect(x, y, 0, 64, 128, 64); + + GL11.glPopMatrix(); + } + + private void renderScope(ItemStack item, EntityPlayer user) { + if (item.getItem() instanceof IFirearm) { + float factor = ((IScope) item.getItem()).getZoom(item); + if (factor > 0.1F) { GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/scopes/scope_basic.png"); - int xPos = width/2 -128; - int yPos = height/2 -128; - this.drawTexturedModalRect(xPos, yPos, 0, 0, 256, 256); - - GL11.glPopMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, + MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/scopes/scope_basic.png"); + int xPos = width / 2 - 128; + int yPos = height / 2 - 128; + this.drawTexturedModalRect(xPos, yPos, 0, 0, 256, 256); + + GL11.glPopMatrix(); } } } - private void lookAtCogwork(EntityCogwork suit) - { + + private void lookAtCogwork(EntityCogwork suit) { GL11.glPushMatrix(); GL11.glColor3f(1.0F, 1.0F, 1.0F); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - renderCogworkFuel(width, height, suit); - - GL11.glPopMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + renderCogworkFuel(width, height, suit); + + GL11.glPopMatrix(); } - private void renderPowerHelmet(EntityPlayer user, EntityCogwork suit) - { + + private void renderPowerHelmet(EntityPlayer user, EntityCogwork suit) { GL11.glPushMatrix(); - GL11.glColor3f(1.0F, 1.0F, 1.0F); + GL11.glColor3f(1.0F, 1.0F, 1.0F); GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - renderHelmetBlur(width, height); - renderCogworkFuel(width, height, suit); - - GL11.glPopMatrix(); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + renderHelmetBlur(width, height); + renderCogworkFuel(width, height, suit); + + GL11.glPopMatrix(); } - private void renderCogworkFuel(int width, int height, EntityCogwork suit) - { - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - - bindTexture("textures/gui/hud_overlay.png"); - int[] orientationAR = getOrientsFor(width, height, ConfigClient.CF_xOrient, ConfigClient.CF_yOrient); - int xPos = orientationAR[0] + ConfigClient.CF_xPos; - int yPos = orientationAR[1] + ConfigClient.CF_yPos; - - this.drawTexturedModalRect(xPos, yPos, 84, 38, 172, 20); - int i = suit.getMetreScaled(160); - this.drawTexturedModalRect(xPos+6+(160-i), yPos+11, 90, 20, i, 3); + + private void renderCogworkFuel(int width, int height, EntityCogwork suit) { + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + + bindTexture("textures/gui/hud_overlay.png"); + int[] orientationAR = getOrientsFor(width, height, ConfigClient.CF_xOrient, ConfigClient.CF_yOrient); + int xPos = orientationAR[0] + ConfigClient.CF_xPos; + int yPos = orientationAR[1] + ConfigClient.CF_yPos; + + this.drawTexturedModalRect(xPos, yPos, 84, 38, 172, 20); + int i = suit.getMetreScaled(160); + this.drawTexturedModalRect(xPos + 6 + (160 - i), yPos + 11, 90, 20, i, 3); } - - private void renderHelmetBlur(int width, int height) - { - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glDepthMask(false); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_ALPHA_TEST); - bindTexture("textures/gui/scopes/cogwork_helm.png"); - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV(0.0D, (double)height, -90.0D, 0.0D, 1.0D); - tessellator.addVertexWithUV((double)width, (double)height, -90.0D, 1.0D, 1.0D); - tessellator.addVertexWithUV((double)width, 0.0D, -90.0D, 1.0D, 0.0D); - tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D); - tessellator.draw(); - GL11.glDepthMask(true); - GL11.glEnable(GL11.GL_DEPTH_TEST); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - } - - - public int[] getClickedBlock(float ticks, int mouseX, int mouseY) - { - if (mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { - int j = mc.objectMouseOver.blockX; - int k = mc.objectMouseOver.blockY; - int l = mc.objectMouseOver.blockZ; - - return new int[]{j, k, l}; - } + + private void renderHelmetBlur(int width, int height) { + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDepthMask(false); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_ALPHA_TEST); + bindTexture("textures/gui/scopes/cogwork_helm.png"); + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(0.0D, height, -90.0D, 0.0D, 1.0D); + tessellator.addVertexWithUV(width, height, -90.0D, 1.0D, 1.0D); + tessellator.addVertexWithUV(width, 0.0D, -90.0D, 1.0D, 0.0D); + tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D); + tessellator.draw(); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + public int[] getClickedBlock(float ticks, int mouseX, int mouseY) { + if (mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int j = mc.objectMouseOver.blockX; + int k = mc.objectMouseOver.blockY; + int l = mc.objectMouseOver.blockZ; + + return new int[] { j, k, l }; + } return null; } - - public Entity getClickedEntity(float ticks, int mouseX, int mouseY) - { - if (mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) - { + + public Entity getClickedEntity(float ticks, int mouseX, int mouseY) { + if (mc.objectMouseOver != null + && mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) { return mc.objectMouseOver.entityHit; - } + } return null; } - private void renderArmourRating(EntityPlayer player) - { + + private void renderArmourRating(EntityPlayer player) { int base = getBaseRating(player); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - - int[] orientationAR = getOrientsFor(width, height, ConfigClient.AR_xOrient, ConfigClient.AR_yOrient); - int xPosAR = orientationAR[0] + ConfigClient.AR_xPos; - int yPosAR = orientationAR[1] + ConfigClient.AR_yPos; - int y = 8; - if(ArmourCalculator.advancedDamageTypes) - { - mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.protection"), xPosAR, yPosAR, Color.WHITE.getRGB()); - displayTraitValue(xPosAR, yPosAR+8, orientationAR, 0, player, base); - displayTraitValue(xPosAR, yPosAR+16, orientationAR, 2, player, base); - displayTraitValue(xPosAR, yPosAR+24, orientationAR, 1, player, base); - y = 32; - } - else - { - displayGeneralAR(xPosAR, yPosAR, orientationAR, player, base); - } - - float weight = getBaseWeight(player); - - for(int a = 0; a < 4; a ++) - { - ItemStack armour = mc.thePlayer.getEquipmentInSlot(4-a); + int height = scaledresolution.getScaledHeight(); + + int[] orientationAR = getOrientsFor(width, height, ConfigClient.AR_xOrient, ConfigClient.AR_yOrient); + int xPosAR = orientationAR[0] + ConfigClient.AR_xPos; + int yPosAR = orientationAR[1] + ConfigClient.AR_yPos; + int y = 8; + if (ArmourCalculator.advancedDamageTypes) { + mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.protection"), xPosAR, + yPosAR, Color.WHITE.getRGB()); + displayTraitValue(xPosAR, yPosAR + 8, orientationAR, 0, player, base); + displayTraitValue(xPosAR, yPosAR + 16, orientationAR, 2, player, base); + displayTraitValue(xPosAR, yPosAR + 24, orientationAR, 1, player, base); + y = 32; + } else { + displayGeneralAR(xPosAR, yPosAR, orientationAR, player, base); + } + + float weight = getBaseWeight(player); + + for (int a = 0; a < 4; a++) { + ItemStack armour = mc.thePlayer.getEquipmentInSlot(4 - a); weight += ArmourCalculator.getPieceWeight(armour, a); } - - String massString = CustomMaterial.getWeightString(weight); - mc.fontRenderer.drawStringWithShadow(massString, xPosAR, yPosAR+y, Color.WHITE.getRGB()); + + String massString = CustomMaterial.getWeightString(weight); + mc.fontRenderer.drawStringWithShadow(massString, xPosAR, yPosAR + y, Color.WHITE.getRGB()); } - private int getBaseRating(EntityPlayer player) - { - if(player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) - { - return ((EntityCogwork)player.ridingEntity).getArmourRating(); + + private int getBaseRating(EntityPlayer player) { + if (player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) { + return ((EntityCogwork) player.ridingEntity).getArmourRating(); } return 0; } - private float getBaseWeight(EntityPlayer player) - { - if(player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) - { - return ((EntityCogwork)player.ridingEntity).getWeight(); + + private float getBaseWeight(EntityPlayer player) { + if (player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) { + return ((EntityCogwork) player.ridingEntity).getWeight(); } return 0; } - private void renderAmmo(EntityPlayer player) - { - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); + + private void renderAmmo(EntityPlayer player) { + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - - int[] orientationAR = getOrientsFor(width, height, ConfigClient.AR_xOrient, ConfigClient.AR_yOrient); - int xPosAR = orientationAR[0] + ConfigClient.AR_xPos; - int yPosAR = orientationAR[1] + ConfigClient.AR_yPos; - - ItemStack held = player.getHeldItem(); - if(held != null && (held.getItem() instanceof IDisplayMFAmmo)) - { - ItemStack arrow = AmmoMechanicsMF.getAmmo(held); - - String text = StatCollector.translateToLocal("info.bow.reload"); - if(arrow != null) - { - text = arrow.getDisplayName() + " x" + arrow.stackSize ; - } - int[] orientationAC = getOrientsFor(width, height, ConfigClient.AC_xOrient, ConfigClient.AC_yOrient); - int xPosAC = orientationAR[0] + ConfigClient.AC_xPos; - int yPosAC = orientationAR[1] + ConfigClient.AC_yPos; - - mc.fontRenderer.drawStringWithShadow(text, xPosAC, yPosAC, Color.WHITE.getRGB()); - - - int cap = ((IDisplayMFAmmo)held.getItem()).getAmmoCapacity(held); - - ItemStack ammo = AmmoMechanicsMF.getArrowOnBow(held); - int ammocount = ammo == null ? 0 : ammo.stackSize; - if(cap > 1) - { - String ammostring = StatCollector.translateToLocalFormatted("info.firearm.ammo", ammocount, cap); - mc.fontRenderer.drawStringWithShadow(ammostring, xPosAC, yPosAC+10, Color.WHITE.getRGB()); - } - } + int height = scaledresolution.getScaledHeight(); + + int[] orientationAR = getOrientsFor(width, height, ConfigClient.AR_xOrient, ConfigClient.AR_yOrient); + int xPosAR = orientationAR[0] + ConfigClient.AR_xPos; + int yPosAR = orientationAR[1] + ConfigClient.AR_yPos; + + ItemStack held = player.getHeldItem(); + if (held != null && (held.getItem() instanceof IDisplayMFAmmo)) { + ItemStack arrow = AmmoMechanicsMF.getAmmo(held); + + String text = StatCollector.translateToLocal("info.bow.reload"); + if (arrow != null) { + text = arrow.getDisplayName() + " x" + arrow.stackSize; + } + int[] orientationAC = getOrientsFor(width, height, ConfigClient.AC_xOrient, ConfigClient.AC_yOrient); + int xPosAC = orientationAR[0] + ConfigClient.AC_xPos; + int yPosAC = orientationAR[1] + ConfigClient.AC_yPos; + + mc.fontRenderer.drawStringWithShadow(text, xPosAC, yPosAC, Color.WHITE.getRGB()); + + int cap = ((IDisplayMFAmmo) held.getItem()).getAmmoCapacity(held); + + ItemStack ammo = AmmoMechanicsMF.getArrowOnBow(held); + int ammocount = ammo == null ? 0 : ammo.stackSize; + if (cap > 1) { + String ammostring = StatCollector.translateToLocalFormatted("info.firearm.ammo", ammocount, cap); + mc.fontRenderer.drawStringWithShadow(ammostring, xPosAC, yPosAC + 10, Color.WHITE.getRGB()); + } + } } - - private void displayTraitValue(int xPosAR, int yPosAR, int[] orientationAR, int id, EntityPlayer player, int base) - { - float AR = (int)(ArmourCalculator.getDRDisplay(player, id)*100F) + base; - mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.rating."+id)+" " + ItemWeaponMF.decimal_format.format(AR), xPosAR, yPosAR, Color.WHITE.getRGB()); + + private void displayTraitValue(int xPosAR, int yPosAR, int[] orientationAR, int id, EntityPlayer player, int base) { + float AR = (int) (ArmourCalculator.getDRDisplay(player, id) * 100F) + base; + mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.rating." + id) + " " + + ItemWeaponMF.decimal_format.format(AR), xPosAR, yPosAR, Color.WHITE.getRGB()); } - private void displayGeneralAR(int xPosAR, int yPosAR, int[] orientationAR, EntityPlayer player, int base) - { - float AR = ((int)(ArmourCalculator.getDRDisplay(player, 0)*100F) + base); - - mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.protection")+": " + ItemWeaponMF.decimal_format.format(AR), xPosAR, yPosAR, Color.WHITE.getRGB()); + + private void displayGeneralAR(int xPosAR, int yPosAR, int[] orientationAR, EntityPlayer player, int base) { + float AR = ((int) (ArmourCalculator.getDRDisplay(player, 0) * 100F) + base); + + mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.protection") + ": " + + ItemWeaponMF.decimal_format.format(AR), xPosAR, yPosAR, Color.WHITE.getRGB()); } - private void renderStaminaBar(EntityPlayer player) - { + private void renderStaminaBar(EntityPlayer player) { GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - float staminaMax = StaminaBar.getTotalMaxStamina(player); - float staminaAt = StaminaBar.getStaminaValue(player); - + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + float staminaMax = StaminaBar.getTotalMaxStamina(player); + float staminaAt = StaminaBar.getStaminaValue(player); + float staminaPercentage = staminaMax > 0 ? Math.min(1.0F, staminaAt / staminaMax) : 0F; - + float flash = StaminaBar.getFlashTime(player); - int stam = (int)Math.min(81F, (81F * staminaPercentage)); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); + int stam = (int) Math.min(81F, (81F * staminaPercentage)); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); + int height = scaledresolution.getScaledHeight(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - bindTexture("textures/gui/hud_overlay.png"); - - int[] orientation = getOrientsFor(width, height, ConfigClient.stam_xOrient, ConfigClient.stam_yOrient); - int xPos = orientation[0] + ConfigClient.stam_xPos; - int yPos = orientation[1] + ConfigClient.stam_yPos; - this.drawTexturedModalRect(xPos, yPos, 0, 0, 81, 5); - - int modifier = modifyMetre(stam, 81, ConfigClient.stam_direction); - this.drawTexturedModalRect(xPos + modifier, yPos, 0, 5, stam, 5); - - if(flash > 0 && player.ticksExisted % 10 < 5) - { - this.drawTexturedModalRect(xPos, yPos, 0, 10, 81, 5); - } - /* - else if(StaminaBar.getBonusStaminaRegenTicks(player) > 0 && player.ticksExisted % 10 < 5) - { - this.drawTexturedModalRect(xPos, yPos, 0, 15, 81, 5); - } - */ - - String stamTxt = (int)staminaAt + " / " + (int)staminaMax; - boolean bonus = StaminaBar.getBonusStamina(player) > 0; - - if(mc.currentScreen != null && mc.currentScreen instanceof GuiInventory) - { - mc.fontRenderer.drawStringWithShadow(stamTxt, xPos + 41 - (mc.fontRenderer.getStringWidth(stamTxt)/2), yPos-2, bonus ? Color.CYAN.getRGB() : Color.WHITE.getRGB()); - } - GL11.glDisable(GL11.GL_BLEND); + bindTexture("textures/gui/hud_overlay.png"); + + int[] orientation = getOrientsFor(width, height, ConfigClient.stam_xOrient, ConfigClient.stam_yOrient); + int xPos = orientation[0] + ConfigClient.stam_xPos; + int yPos = orientation[1] + ConfigClient.stam_yPos; + this.drawTexturedModalRect(xPos, yPos, 0, 0, 81, 5); + + int modifier = modifyMetre(stam, 81, ConfigClient.stam_direction); + this.drawTexturedModalRect(xPos + modifier, yPos, 0, 5, stam, 5); + + if (flash > 0 && player.ticksExisted % 10 < 5) { + this.drawTexturedModalRect(xPos, yPos, 0, 10, 81, 5); + } + /* + * else if(StaminaBar.getBonusStaminaRegenTicks(player) > 0 && + * player.ticksExisted % 10 < 5) { this.drawTexturedModalRect(xPos, yPos, 0, 15, + * 81, 5); } + */ + + String stamTxt = (int) staminaAt + " / " + (int) staminaMax; + boolean bonus = StaminaBar.getBonusStamina(player) > 0; + + if (mc.currentScreen != null && mc.currentScreen instanceof GuiInventory) { + mc.fontRenderer.drawStringWithShadow(stamTxt, xPos + 41 - (mc.fontRenderer.getStringWidth(stamTxt) / 2), + yPos - 2, bonus ? Color.CYAN.getRGB() : Color.WHITE.getRGB()); + } + GL11.glDisable(GL11.GL_BLEND); } - - private int modifyMetre(int i, int max, int cfg) - { - if(cfg == 0) - { - if(max == i) - { - return (max-i)/2; - } - else - { - return (max-i-1)/2; + + private int modifyMetre(int i, int max, int cfg) { + if (cfg == 0) { + if (max == i) { + return (max - i) / 2; + } else { + return (max - i - 1) / 2; } } - if(cfg == 1) - { - if(max == i) - { - return max-i; - } - else - { - return max-i-1; + if (cfg == 1) { + if (max == i) { + return max - i; + } else { + return max - i - 1; } } return 0; } - public void bindTexture(String image) - { + public void bindTexture(String image) { mc.renderEngine.bindTexture(TextureHelperMF.getResource(image)); } - + /** * Gets the 2 config values to get the X,Y orient */ - public static int[] getOrientsFor(int screenX, int screenY, int cfgX, int cfgY) - { - int xOrient = cfgX == -1 ? 0 : cfgX == 1 ? screenX : screenX/2; - int yOrient = cfgY == -1 ? 0 : cfgY == 1 ? screenY : screenY/2; - - return new int[]{xOrient, yOrient}; + public static int[] getOrientsFor(int screenX, int screenY, int cfgX, int cfgY) { + int xOrient = cfgX == -1 ? 0 : cfgX == 1 ? screenX : screenX / 2; + int yOrient = cfgY == -1 ? 0 : cfgY == 1 ? screenY : screenY / 2; + + return new int[] { xOrient, yOrient }; } - - private void renderCraftMetre(World world, EntityPlayer player, TileEntityAnvilMF tile) - { + + private void renderCraftMetre(World world, EntityPlayer player, TileEntityAnvilMF tile) { boolean knowsCraft = tile.doesPlayerKnowCraft(player); GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width/2 + -86; - int yPos = height - 69; - - this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); - this.drawTexturedModalRect(xPos+6, yPos+12, 90, 20, tile.getProgressBar(160), 3); - - String s = knowsCraft ? tile.getResultName() : "????"; - mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos+3, 0); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - - if(knowsCraft && !tile.resName.equalsIgnoreCase("") && tile.getToolNeeded() != null) - { - boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.getToolNeeded(), tile.getToolTierNeeded()); - GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPos-20, yPos, available); - if(tile.getAnvilTierNeeded() > -1) - { - GuiHelper.renderToolIcon(this, "anvil", tile.getAnvilTierNeeded(), xPos+172, yPos, tile.tier >= tile.getAnvilTierNeeded()); - } - } - - GL11.glPopMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + -86; + int yPos = height - 69; + + this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); + this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getProgressBar(160), 3); + + String s = knowsCraft ? tile.getResultName() : "????"; + mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + + if (knowsCraft && !tile.resName.equalsIgnoreCase("") && tile.getToolNeeded() != null) { + boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.getToolNeeded(), + tile.getToolTierNeeded()); + GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPos - 20, yPos, available); + if (tile.getAnvilTierNeeded() > -1) { + GuiHelper.renderToolIcon(this, "anvil", tile.getAnvilTierNeeded(), xPos + 172, yPos, + tile.tier >= tile.getAnvilTierNeeded()); + } + } + + GL11.glPopMatrix(); } - - - private void renderCraftMetre(World world, EntityPlayer player, TileEntityCarpenterMF tile) - { + + private void renderCraftMetre(World world, EntityPlayer player, TileEntityCarpenterMF tile) { boolean knowsCraft = tile.doesPlayerKnowCraft(player); GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width/2 + -86; - int yPos = height - 69; - - this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); - this.drawTexturedModalRect(xPos+6, yPos+12, 90, 20, tile.getProgressBar(160), 3); - - String s = knowsCraft ? tile.getResultName() : "????"; - mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos+3, 0); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - - if(knowsCraft && !tile.resName.equalsIgnoreCase("") && tile.getToolNeeded() != null) - { - boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.getToolNeeded(), tile.getToolTierNeeded()); - GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPos-20, yPos, available); - } - - GL11.glPopMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + -86; + int yPos = height - 69; + + this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); + this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getProgressBar(160), 3); + + String s = knowsCraft ? tile.getResultName() : "????"; + mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + + if (knowsCraft && !tile.resName.equalsIgnoreCase("") && tile.getToolNeeded() != null) { + boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.getToolNeeded(), + tile.getToolTierNeeded()); + GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPos - 20, yPos, available); + } + + GL11.glPopMatrix(); } - - private void renderCraftMetre(World world, EntityPlayer player, TileEntityTanningRack tile) - { + + private void renderCraftMetre(World world, EntityPlayer player, TileEntityTanningRack tile) { boolean knowsCraft = tile.doesPlayerKnowCraft(player); GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width/2 + -86; - int yPos = height - 69; - - this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); - this.drawTexturedModalRect(xPos+6, yPos+12, 90, 20, tile.getProgressBar(160), 3); - - String s = knowsCraft ? tile.getResultName() : "????"; - ItemStack result = tile.items[1]; - if(result != null && result.stackSize > 1) - { - s += " x"+result.stackSize; - } - mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos+3, 0); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - - String resName = tile.getResultName(); - - if(knowsCraft && !resName.equalsIgnoreCase("") && tile.toolType != null) - { - boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.toolType, -1); - GuiHelper.renderToolIcon(this, tile.toolType, tile.tier, xPos-20, yPos, available); - } - - GL11.glPopMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + -86; + int yPos = height - 69; + + this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); + this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getProgressBar(160), 3); + + String s = knowsCraft ? tile.getResultName() : "????"; + ItemStack result = tile.items[1]; + if (result != null && result.stackSize > 1) { + s += " x" + result.stackSize; + } + mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + + String resName = tile.getResultName(); + + if (knowsCraft && !resName.equalsIgnoreCase("") && tile.toolType != null) { + boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.toolType, -1); + GuiHelper.renderToolIcon(this, tile.toolType, tile.tier, xPos - 20, yPos, available); + } + + GL11.glPopMatrix(); } - - private void renderCraftMetre(World world, EntityPlayer player, IBasicMetre tile) - { - if(!tile.shouldShowMetre()) - { + + private void renderCraftMetre(World world, EntityPlayer player, IBasicMetre tile) { + if (!tile.shouldShowMetre()) { return; } GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width/2 + -86; - int yPos = height - 69; - - this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); - this.drawTexturedModalRect(xPos+6, yPos+12, 90, 20, tile.getMetreScale(160), 3); - - String s = tile.getLocalisedName(); - mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos+3, 0); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - GL11.glPopMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + -86; + int yPos = height - 69; + + this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); + this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getMetreScale(160), 3); + + String s = tile.getLocalisedName(); + mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + GL11.glPopMatrix(); } - private void renderQualityBalance(World world, EntityPlayer player, IQualityBalance tile) - { - if(!tile.shouldShowMetre()) - { + + private void renderQualityBalance(World world, EntityPlayer player, IQualityBalance tile) { + if (!tile.shouldShowMetre()) { return; } GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width/2 + -86; - int yPos = height - 69+17; - int barwidth = 160; - int centre = xPos+5+(barwidth/2); - - this.drawTexturedModalRect(xPos, yPos, 84, 23, 172, 10); - int markerPos = (int) (centre + (tile.getMarkerPosition()*barwidth/2F)); - this.drawTexturedModalRect(markerPos, yPos+1, 84, 33, 3, 5); - - int offset = (int)(tile.getThresholdPosition()/2F*barwidth); - this.drawTexturedModalRect(centre-offset-1, yPos+1, 87, 33, 2, 4); - this.drawTexturedModalRect(centre+offset, yPos+1, 89, 33, 2, 4); - - int offset2 = (int)(tile.getSuperThresholdPosition()/2F*barwidth); - this.drawTexturedModalRect(centre-offset2, yPos+1, 91, 33, 1, 4); - this.drawTexturedModalRect(centre+offset2, yPos+1, 91, 33, 1, 4); - - GL11.glColor3f(1.0F, 1.0F, 1.0F); - GL11.glPopMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + -86; + int yPos = height - 69 + 17; + int barwidth = 160; + int centre = xPos + 5 + (barwidth / 2); + + this.drawTexturedModalRect(xPos, yPos, 84, 23, 172, 10); + int markerPos = (int) (centre + (tile.getMarkerPosition() * barwidth / 2F)); + this.drawTexturedModalRect(markerPos, yPos + 1, 84, 33, 3, 5); + + int offset = (int) (tile.getThresholdPosition() / 2F * barwidth); + this.drawTexturedModalRect(centre - offset - 1, yPos + 1, 87, 33, 2, 4); + this.drawTexturedModalRect(centre + offset, yPos + 1, 89, 33, 2, 4); + + int offset2 = (int) (tile.getSuperThresholdPosition() / 2F * barwidth); + this.drawTexturedModalRect(centre - offset2, yPos + 1, 91, 33, 1, 4); + this.drawTexturedModalRect(centre + offset2, yPos + 1, 91, 33, 1, 4); + + GL11.glColor3f(1.0F, 1.0F, 1.0F); + GL11.glPopMatrix(); } - - private void renderRoad(World world, EntityPlayer player, TileEntityRoad tile) - { - if(mc.thePlayer.getHeldItem() != null) - { - if(mc.thePlayer.getHeldItem().getItem() instanceof ItemMattock) - { + + private void renderRoad(World world, EntityPlayer player, TileEntityRoad tile) { + if (mc.thePlayer.getHeldItem() != null) { + if (mc.thePlayer.getHeldItem().getItem() instanceof ItemMattock) { GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width/2 + 12; - int yPos = height/2 - 6;; - - this.drawTexturedModalRect(xPos, yPos, tile.isLocked ? 0 : 8, 20, 8, 12); - GL11.glPopMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, + MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + 12; + int yPos = height / 2 - 6; + ; + + this.drawTexturedModalRect(xPos, yPos, tile.isLocked ? 0 : 8, 20, 8, 12); + GL11.glPopMatrix(); } } } diff --git a/src/main/java/minefantasy/mf2/client/render/ModelCogwork.java b/src/main/java/minefantasy/mf2/client/render/ModelCogwork.java index a1d9c005..3a91ddcc 100644 --- a/src/main/java/minefantasy/mf2/client/render/ModelCogwork.java +++ b/src/main/java/minefantasy/mf2/client/render/ModelCogwork.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.render; -import org.lwjgl.opengl.GL11; - import net.minecraft.client.Minecraft; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelRenderer; @@ -10,11 +8,10 @@ import net.minecraft.item.EnumAction; import net.minecraft.item.ItemStack; -public class ModelCogwork extends ModelBiped -{ +public class ModelCogwork extends ModelBiped { ModelRenderer rightfoot; - ModelRenderer leftfoot; - + ModelRenderer leftfoot; + ModelRenderer headMask; ModelRenderer bodyBack; ModelRenderer rightarmPauldron; @@ -26,7 +23,7 @@ public class ModelCogwork extends ModelBiped ModelRenderer headArmour; ModelRenderer bodyArmour; - //RenderCogwork + // RenderCogwork public ModelCogwork() { this(1F); } @@ -35,11 +32,10 @@ public ModelCogwork(float scale) { this(scale, -2F * scale, 128, 64); } - public ModelCogwork(float scale, float offset, int texWidth, int texHeight) - { + public ModelCogwork(float scale, float offset, int texWidth, int texHeight) { this.textureWidth = texWidth; this.textureHeight = texHeight; -//FRAME + // FRAME this.bipedHead = new ModelRenderer(this, 0, 0); this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, scale); this.bipedHead.setRotationPoint(0.0F, 0F + offset, 0.0F); @@ -75,14 +71,14 @@ public ModelCogwork(float scale, float offset, int texWidth, int texHeight) rightfoot.setRotationPoint(0F, 10F, 0F); rightfoot.setTextureSize(128, 64); setRotation(rightfoot, 0F, 0F, 0F); - + leftfoot = new ModelRenderer(this, 0, 53); leftfoot.mirror = true; leftfoot.addBox(-2F, 0F, -3F, 4, 3, 5, scale); leftfoot.setRotationPoint(0F, 10F, 0F); leftfoot.setTextureSize(128, 64); - -//HEAD ARMOUR + + // HEAD ARMOUR headMask = new ModelRenderer(this, 76, 18); headMask.addBox(-2F, -3.5F, -6.5F, 4, 5, 3, scale); headMask.setRotationPoint(0F, 0F, 0F); @@ -93,8 +89,8 @@ public ModelCogwork(float scale, float offset, int texWidth, int texHeight) headArmour.setRotationPoint(0F, 0F, 0F); headArmour.setTextureSize(128, 64); setRotation(headArmour, 0F, 0F, 0F); - -//BODY ARMOUR + + // BODY ARMOUR bodyBack = new ModelRenderer(this, 34, 32); bodyBack.addBox(-3.5F, -0.5F, 4F, 7, 9, 3, scale); bodyBack.setRotationPoint(0F, 0F, 0F); @@ -106,8 +102,8 @@ public ModelCogwork(float scale, float offset, int texWidth, int texHeight) bodyArmour.setRotationPoint(0F, 0F, 0F); bodyArmour.setTextureSize(128, 64); setRotation(bodyArmour, 0F, 0F, 0F); - -//ARMS ARMOUR + + // ARMS ARMOUR leftarmPauldron = new ModelRenderer(this, 76, 27); leftarmPauldron.mirror = true; leftarmPauldron.addBox(0F, -4F, -3F, 5, 5, 6, scale); @@ -120,21 +116,21 @@ public ModelCogwork(float scale, float offset, int texWidth, int texHeight) rightarmPauldron.setRotationPoint(0F, 0F, 0F); rightarmPauldron.setTextureSize(128, 64); setRotation(rightarmPauldron, 0F, 0F, -0.2792527F); - + leftarmArmour = new ModelRenderer(this, 76, 38); leftarmArmour.mirror = true; leftarmArmour.addBox(-1.0F, -2.5F, -2.5F, 5, 9, 5, scale); leftarmArmour.setRotationPoint(0F, 0F, 0F); leftarmArmour.setTextureSize(128, 64); setRotation(leftarmArmour, 0F, -0F, 0F); - + rightarmArmour = new ModelRenderer(this, 76, 38); rightarmArmour.addBox(-4F, -2.5F, -2.5F, 5, 9, 5, scale); rightarmArmour.setRotationPoint(0F, 0F, 0F); rightarmArmour.setTextureSize(128, 64); setRotation(rightarmArmour, 0F, 0F, 0F); -//LEGS ARMOUR + // LEGS ARMOUR rightlegArmour = new ModelRenderer(this, 56, 16); rightlegArmour.addBox(-2.5F, -0.5F, -2.5F, 5, 9, 5, scale); rightlegArmour.setRotationPoint(0F, 0F, 0F); @@ -147,8 +143,8 @@ public ModelCogwork(float scale, float offset, int texWidth, int texHeight) leftlegArmour.setRotationPoint(0F, 0F, 0F); leftlegArmour.setTextureSize(128, 64); setRotation(leftlegArmour, 0F, -0F, 0F); - -//GROUPING + + // GROUPING this.bipedBody.addChild(bodyArmour); this.bipedBody.addChild(bodyBack); @@ -174,43 +170,38 @@ private void setRotation(ModelRenderer model, float x, float y, float z) { } @Override - public void render(Entity entity, float f1, float f2, float f3, float f4, float f5, float scale) - { + public void render(Entity entity, float f1, float f2, float f3, float f4, float f5, float scale) { heldItemRight = 0; aimedBow = false; boolean isEmpty = true; boolean isWornByPlayer = false; - if (entity instanceof EntityPlayer) - { + if (entity instanceof EntityPlayer) { isEmpty = false; boolean CP = Minecraft.getMinecraft().thePlayer == entity; isWornByPlayer = Minecraft.getMinecraft().gameSettings.thirdPersonView == 0 && CP; - + EntityPlayer player = (EntityPlayer) entity; - + ItemStack itemstack = player.getHeldItem(); heldItemRight = itemstack == null ? 0 : 1; - if (itemstack != null && player.getItemInUseCount() > 0) - { - EnumAction enumaction = itemstack.getItemUseAction(); - - if (enumaction == EnumAction.block) - { - heldItemRight = 3; - } - else if (enumaction == EnumAction.bow) - { - aimedBow = true; - } - } + if (itemstack != null && player.getItemInUseCount() > 0) { + EnumAction enumaction = itemstack.getItemUseAction(); + + if (enumaction == EnumAction.block) { + heldItemRight = 3; + } else if (enumaction == EnumAction.bow) { + aimedBow = true; + } + } } this.setRotationAngles(f1, f2, isEmpty ? 0F : f3, f4, f5, scale, entity); bipedHead.rotationPointY = bipedHeadwear.rotationPointY = -2F; - this.bipedBody.rotationPointZ = this.bipedLeftLeg.rotationPointZ = this.bipedRightLeg.rotationPointZ = isWornByPlayer ? 6F : 0F; + this.bipedBody.rotationPointZ = this.bipedLeftLeg.rotationPointZ = this.bipedRightLeg.rotationPointZ = isWornByPlayer + ? 6F + : 0F; this.bipedLeftArm.isHidden = this.bipedRightArm.isHidden = this.leftarmArmour.isHidden = this.rightarmArmour.isHidden = isWornByPlayer; - - if(!isWornByPlayer) - { + + if (!isWornByPlayer) { this.bipedHead.render(scale); this.bipedHeadwear.render(scale); } diff --git a/src/main/java/minefantasy/mf2/client/render/ModelParachute.java b/src/main/java/minefantasy/mf2/client/render/ModelParachute.java index 9ff48c61..db6655bb 100644 --- a/src/main/java/minefantasy/mf2/client/render/ModelParachute.java +++ b/src/main/java/minefantasy/mf2/client/render/ModelParachute.java @@ -4,96 +4,92 @@ import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; -public class ModelParachute extends ModelBase -{ - //fields +public class ModelParachute extends ModelBase { + // fields ModelRenderer chuteSegment5; - ModelRenderer harness; - ModelRenderer chuteSegment1; - ModelRenderer chuteSegment2; - ModelRenderer chuteSegment3; - ModelRenderer chuteSegment4; - ModelRenderer cable4; - ModelRenderer cable1; - ModelRenderer cable2; - ModelRenderer cable3; - - public ModelParachute() - { - textureWidth = 64; - textureHeight = 32; - - chuteSegment5 = new ModelRenderer(this, 28, 14); - chuteSegment5.addBox(-4.5F, -32F, -13.5F, 9, 9, 9); - chuteSegment5.setRotationPoint(0F, 0F, 0F); - chuteSegment5.setTextureSize(64, 32); - setRotation(chuteSegment5, 0F, 0F, 0F); - harness = new ModelRenderer(this, 28, -9); - harness.addBox(-4.5F, -4.5F, -4.5F, 9, 9, 9); - harness.setRotationPoint(0F, 0F, 0F); - harness.setTextureSize(64, 32); - setRotation(harness, 0F, 0F, 0F); - chuteSegment1 = new ModelRenderer(this, 28, 14); - chuteSegment1.addBox(-4.5F, -41F, -4.5F, 9, 9, 9); - chuteSegment1.setRotationPoint(0F, 0F, 0F); - chuteSegment1.setTextureSize(64, 32); - setRotation(chuteSegment1, 0F, 0F, 0F); - chuteSegment2 = new ModelRenderer(this, 28, 14); - chuteSegment2.addBox(-13.5F, -32F, -4.5F, 9, 9, 9); - chuteSegment2.setRotationPoint(0F, 0F, 0F); - chuteSegment2.setTextureSize(64, 32); - setRotation(chuteSegment2, 0F, 0F, 0F); - chuteSegment3 = new ModelRenderer(this, 28, 14); - chuteSegment3.addBox(4.5F, -32F, -4.5F, 9, 9, 9); - chuteSegment3.setRotationPoint(0F, 0F, 0F); - chuteSegment3.setTextureSize(64, 32); - setRotation(chuteSegment3, 0F, 0F, 0F); - chuteSegment4 = new ModelRenderer(this, 28, 14); - chuteSegment4.addBox(-4.5F, -32F, 4.5F, 9, 9, 9); - chuteSegment4.setRotationPoint(0F, 0F, 0F); - chuteSegment4.setTextureSize(64, 32); - setRotation(chuteSegment4, 0F, 0F, 0F); - cable4 = new ModelRenderer(this, 0, 0); - cable4.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); - cable4.setRotationPoint(0F, -4F, 0F); - cable4.setTextureSize(64, 32); - setRotation(cable4, 0F, 0F, -0.5235988F); - cable1 = new ModelRenderer(this, 0, 0); - cable1.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); - cable1.setRotationPoint(0F, -4F, 0F); - cable1.setTextureSize(64, 32); - setRotation(cable1, 0.5235988F, 0F, 0F); - cable2 = new ModelRenderer(this, 0, 0); - cable2.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); - cable2.setRotationPoint(0F, -4F, 0F); - cable2.setTextureSize(64, 32); - setRotation(cable2, -0.5235988F, 0F, 0F); - cable3 = new ModelRenderer(this, 0, 0); - cable3.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); - cable3.setRotationPoint(0F, -4F, 0F); - cable3.setTextureSize(64, 32); - setRotation(cable3, 0F, 0F, 0.5235988F); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - chuteSegment5.render(f5); - harness.render(f5); - chuteSegment1.render(f5); - chuteSegment2.render(f5); - chuteSegment3.render(f5); - chuteSegment4.render(f5); - cable4.render(f5); - cable1.render(f5); - cable2.render(f5); - cable3.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + ModelRenderer harness; + ModelRenderer chuteSegment1; + ModelRenderer chuteSegment2; + ModelRenderer chuteSegment3; + ModelRenderer chuteSegment4; + ModelRenderer cable4; + ModelRenderer cable1; + ModelRenderer cable2; + ModelRenderer cable3; + + public ModelParachute() { + textureWidth = 64; + textureHeight = 32; + + chuteSegment5 = new ModelRenderer(this, 28, 14); + chuteSegment5.addBox(-4.5F, -32F, -13.5F, 9, 9, 9); + chuteSegment5.setRotationPoint(0F, 0F, 0F); + chuteSegment5.setTextureSize(64, 32); + setRotation(chuteSegment5, 0F, 0F, 0F); + harness = new ModelRenderer(this, 28, -9); + harness.addBox(-4.5F, -4.5F, -4.5F, 9, 9, 9); + harness.setRotationPoint(0F, 0F, 0F); + harness.setTextureSize(64, 32); + setRotation(harness, 0F, 0F, 0F); + chuteSegment1 = new ModelRenderer(this, 28, 14); + chuteSegment1.addBox(-4.5F, -41F, -4.5F, 9, 9, 9); + chuteSegment1.setRotationPoint(0F, 0F, 0F); + chuteSegment1.setTextureSize(64, 32); + setRotation(chuteSegment1, 0F, 0F, 0F); + chuteSegment2 = new ModelRenderer(this, 28, 14); + chuteSegment2.addBox(-13.5F, -32F, -4.5F, 9, 9, 9); + chuteSegment2.setRotationPoint(0F, 0F, 0F); + chuteSegment2.setTextureSize(64, 32); + setRotation(chuteSegment2, 0F, 0F, 0F); + chuteSegment3 = new ModelRenderer(this, 28, 14); + chuteSegment3.addBox(4.5F, -32F, -4.5F, 9, 9, 9); + chuteSegment3.setRotationPoint(0F, 0F, 0F); + chuteSegment3.setTextureSize(64, 32); + setRotation(chuteSegment3, 0F, 0F, 0F); + chuteSegment4 = new ModelRenderer(this, 28, 14); + chuteSegment4.addBox(-4.5F, -32F, 4.5F, 9, 9, 9); + chuteSegment4.setRotationPoint(0F, 0F, 0F); + chuteSegment4.setTextureSize(64, 32); + setRotation(chuteSegment4, 0F, 0F, 0F); + cable4 = new ModelRenderer(this, 0, 0); + cable4.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); + cable4.setRotationPoint(0F, -4F, 0F); + cable4.setTextureSize(64, 32); + setRotation(cable4, 0F, 0F, -0.5235988F); + cable1 = new ModelRenderer(this, 0, 0); + cable1.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); + cable1.setRotationPoint(0F, -4F, 0F); + cable1.setTextureSize(64, 32); + setRotation(cable1, 0.5235988F, 0F, 0F); + cable2 = new ModelRenderer(this, 0, 0); + cable2.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); + cable2.setRotationPoint(0F, -4F, 0F); + cable2.setTextureSize(64, 32); + setRotation(cable2, -0.5235988F, 0F, 0F); + cable3 = new ModelRenderer(this, 0, 0); + cable3.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); + cable3.setRotationPoint(0F, -4F, 0F); + cable3.setTextureSize(64, 32); + setRotation(cable3, 0F, 0F, 0.5235988F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + chuteSegment5.render(f5); + harness.render(f5); + chuteSegment1.render(f5); + chuteSegment2.render(f5); + chuteSegment3.render(f5); + chuteSegment4.render(f5); + cable4.render(f5); + cable1.render(f5); + cable2.render(f5); + cable3.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/RenderArrowMF.java b/src/main/java/minefantasy/mf2/client/render/RenderArrowMF.java index 40c8711a..ba7c61be 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderArrowMF.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderArrowMF.java @@ -1,102 +1,99 @@ package minefantasy.mf2.client.render; -import minefantasy.mf2.entity.EntityArrowMF; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; +import minefantasy.mf2.entity.EntityArrowMF; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - @SideOnly(Side.CLIENT) -public class RenderArrowMF extends Render -{ - public void renderArrow(EntityArrowMF arrow, double x, double y, double z, float xr, float yr) - { - this.loadTexture(arrow.getTexture()+".png"); - GL11.glPushMatrix(); - GL11.glTranslatef((float)x, (float)y, (float)z); - GL11.glRotatef(arrow.prevRotationYaw + (arrow.rotationYaw - arrow.prevRotationYaw) * yr - 90.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(arrow.prevRotationPitch + (arrow.rotationPitch - arrow.prevRotationPitch) * yr, 0.0F, 0.0F, 1.0F); - Tessellator var10 = Tessellator.instance; - byte var11 = 0; - float var12 = 0.0F; - float var13 = 0.5F; - float var14 = (0 + var11 * 10) / 32.0F; - float var15 = (5 + var11 * 10) / 32.0F; - float var16 = 0.0F; - float var17 = 0.15625F; - float var18 = (5 + var11 * 10) / 32.0F; - float var19 = (10 + var11 * 10) / 32.0F; - float var20 = 0.05625F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - float var21 = arrow.arrowShake - yr; - - if (var21 > 0.0F) - { - float var22 = -MathHelper.sin(var21 * 3.0F) * var21; - GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F); - } - - GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); - GL11.glScalef(var20, var20, var20); - GL11.glTranslatef(-4.0F, 0.0F, 0.0F); - GL11.glNormal3f(var20, 0.0F, 0.0F); - var10.startDrawingQuads(); - var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var18); - var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var18); - var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var19); - var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var19); - var10.draw(); - GL11.glNormal3f(-var20, 0.0F, 0.0F); - var10.startDrawingQuads(); - var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var18); - var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var18); - var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var19); - var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var19); - var10.draw(); - - for (int var23 = 0; var23 < 4; ++var23) - { - GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); - GL11.glNormal3f(0.0F, 0.0F, var20); - var10.startDrawingQuads(); - var10.addVertexWithUV(-8.0D, -2.0D, 0.0D, var12, var14); - var10.addVertexWithUV(8.0D, -2.0D, 0.0D, var13, var14); - var10.addVertexWithUV(8.0D, 2.0D, 0.0D, var13, var15); - var10.addVertexWithUV(-8.0D, 2.0D, 0.0D, var12, var15); - var10.draw(); - } - - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - GL11.glPopMatrix(); - } - +public class RenderArrowMF extends Render { + public void renderArrow(EntityArrowMF arrow, double x, double y, double z, float xr, float yr) { + this.loadTexture(arrow.getTexture() + ".png"); + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y, (float) z); + GL11.glRotatef(arrow.prevRotationYaw + (arrow.rotationYaw - arrow.prevRotationYaw) * yr - 90.0F, 0.0F, 1.0F, + 0.0F); + GL11.glRotatef(arrow.prevRotationPitch + (arrow.rotationPitch - arrow.prevRotationPitch) * yr, 0.0F, 0.0F, + 1.0F); + Tessellator var10 = Tessellator.instance; + byte var11 = 0; + float var12 = 0.0F; + float var13 = 0.5F; + float var14 = (0 + var11 * 10) / 32.0F; + float var15 = (5 + var11 * 10) / 32.0F; + float var16 = 0.0F; + float var17 = 0.15625F; + float var18 = (5 + var11 * 10) / 32.0F; + float var19 = (10 + var11 * 10) / 32.0F; + float var20 = 0.05625F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + float var21 = arrow.arrowShake - yr; + + if (var21 > 0.0F) { + float var22 = -MathHelper.sin(var21 * 3.0F) * var21; + GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F); + } + + GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); + GL11.glScalef(var20, var20, var20); + GL11.glTranslatef(-4.0F, 0.0F, 0.0F); + GL11.glNormal3f(var20, 0.0F, 0.0F); + var10.startDrawingQuads(); + var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var18); + var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var18); + var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var19); + var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var19); + var10.draw(); + GL11.glNormal3f(-var20, 0.0F, 0.0F); + var10.startDrawingQuads(); + var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var18); + var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var18); + var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var19); + var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var19); + var10.draw(); + + for (int var23 = 0; var23 < 4; ++var23) { + GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); + GL11.glNormal3f(0.0F, 0.0F, var20); + var10.startDrawingQuads(); + var10.addVertexWithUV(-8.0D, -2.0D, 0.0D, var12, var14); + var10.addVertexWithUV(8.0D, -2.0D, 0.0D, var13, var14); + var10.addVertexWithUV(8.0D, 2.0D, 0.0D, var13, var15); + var10.addVertexWithUV(-8.0D, 2.0D, 0.0D, var12, var15); + var10.draw(); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } /** - * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then - * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic - * (Render= 18) - drawAmount = 2; - else if (timer > 13) - drawAmount = 1; - else if (timer > 0) - drawAmount = 0; - - } - - ItemStack quiver = QuiverArrowRegistry.getArrowContainer(item, (EntityPlayer) entityLivingBase); - if(quiver != null){ - arrowStack = ((IArrowContainer2)quiver.getItem()).getStackInSlot(quiver, ((IArrowContainer2)quiver.getItem()).getSelectedSlot(quiver)); - } - - if(timer == 0) - { - arrowStack = null; - } - } - else - { - drawAmount = 2; - } - - Tessellator tessellator = Tessellator.instance; - - GL11.glPushMatrix(); - if(isLongbow) - { - GL11.glTranslatef(-1/3F, -1/3F, 0F); - GL11.glScalef(1.5F, 1.5F, 1.0F); - if(entityLivingBase == null) - { - GL11.glTranslatef((0F/16F), -(4F/16F), 0F); - } - } - for(int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer ++) - { - IIcon icon = item.getItem().getIcon(item, layer); - - if(bow != null) - { - icon = bow.getIcon(item, layer, drawAmount); - } - - GL11.glPushMatrix(); - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); - } - GL11.glPopMatrix(); - - if(arrowStack == null && drawAmount > -2) - { - arrowStack = new ItemStack(Items.arrow); - } - if(arrowStack != null && entityLivingBase != null) - { - int x = -3; - int y = -20; - - if(isLongbow) - { - x += 1; - y += 1; - } - for(int layer = 0; layer < arrowStack.getItem().getRenderPasses(arrowStack.getItemDamage()); layer++) - { - IIcon icon = arrowStack.getItem().getIcon(arrowStack, layer); - GL11.glPushMatrix(); - - int colour = arrowStack.getItem().getColorFromItemStack(arrowStack, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - GL11.glTranslatef(-(x+drawAmount)/16F, -(y+drawAmount)/16F, firstPerson?-0.5F/16F:0.5F/16F); - GL11.glRotatef(-90, 0, 0, 1); - ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); - } - } - - if(item.isItemEnchanted()) - { - renderEnchantmentEffects(tessellator); - } - GL11.glPopMatrix(); - } - - - public static void renderEnchantmentEffects(Tessellator tessellator) - { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - FMLClientHandler.instance().getClient().renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - float f7 = 0.76F; - GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float f8 = 0.125F; - GL11.glScalef(f8, f8, f8); - float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; - GL11.glTranslatef(f9, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(f8, f8, f8); - f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; - GL11.glTranslatef(-f9, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + if (data.length < 2 || !(data[1] instanceof EntityLivingBase)) { + renderEquippedBow(item, (EntityLivingBase) null, false); + } else { + switch (type) { + case EQUIPPED_FIRST_PERSON: + renderEquippedBow(item, (EntityLivingBase) data[1], true); + break; + case EQUIPPED: + renderEquippedBow(item, (EntityLivingBase) data[1], false); + break; + default: + break; + } + } + } + + private void renderEquippedBow(ItemStack item, EntityLivingBase entityLivingBase, boolean firstPerson) { + GL11.glPushMatrix(); + if (firstPerson) { + GL11.glTranslatef(0.1F, -0.1F, 0F); + } else { + GL11.glTranslatef(0.2F, -0.25F, 0F); + } + + ItemBowMF bow = null; + if (item != null && item.getItem() instanceof ItemBowMF) { + bow = (ItemBowMF) item.getItem(); + } + + ItemStack arrowStack = AmmoMechanicsMF.getArrowOnBow(item); + + int drawAmount = -2; + + if (entityLivingBase != null && entityLivingBase instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) entityLivingBase; + + int timer = player.getItemInUseDuration(); + + if (bow != null) { + drawAmount = bow.getDrawAmount(timer); + // arrowStack = bow.getArrow(item); + } else { + if (timer >= 18) + drawAmount = 2; + else if (timer > 13) + drawAmount = 1; + else if (timer > 0) + drawAmount = 0; + + } + + ItemStack quiver = QuiverArrowRegistry.getArrowContainer(item, (EntityPlayer) entityLivingBase); + if (quiver != null) { + arrowStack = ((IArrowContainer2) quiver.getItem()).getStackInSlot(quiver, + ((IArrowContainer2) quiver.getItem()).getSelectedSlot(quiver)); + } + + if (timer == 0) { + arrowStack = null; + } + } else { + drawAmount = 2; + } + + Tessellator tessellator = Tessellator.instance; + + GL11.glPushMatrix(); + if (isLongbow) { + GL11.glTranslatef(-1 / 3F, -1 / 3F, 0F); + GL11.glScalef(1.5F, 1.5F, 1.0F); + if (entityLivingBase == null) { + GL11.glTranslatef((0F / 16F), -(4F / 16F), 0F); + } + } + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + IIcon icon = item.getItem().getIcon(item, layer); + + if (bow != null) { + icon = bow.getIcon(item, layer, drawAmount); + } + + GL11.glPushMatrix(); + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 0.0625F); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + + if (arrowStack == null && drawAmount > -2) { + arrowStack = new ItemStack(Items.arrow); + } + if (arrowStack != null && entityLivingBase != null) { + int x = -3; + int y = -20; + + if (isLongbow) { + x += 1; + y += 1; + } + for (int layer = 0; layer < arrowStack.getItem().getRenderPasses(arrowStack.getItemDamage()); layer++) { + IIcon icon = arrowStack.getItem().getIcon(arrowStack, layer); + GL11.glPushMatrix(); + + int colour = arrowStack.getItem().getColorFromItemStack(arrowStack, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + GL11.glTranslatef(-(x + drawAmount) / 16F, -(y + drawAmount) / 16F, + firstPerson ? -0.5F / 16F : 0.5F / 16F); + GL11.glRotatef(-90, 0, 0, 1); + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 0.0625F); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); + } + } + + if (item.isItemEnchanted()) { + renderEnchantmentEffects(tessellator); + } + GL11.glPopMatrix(); + } + + public static void renderEnchantmentEffects(Tessellator tessellator) { + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + float f7 = 0.76F; + GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glPushMatrix(); + float f8 = 0.125F; + GL11.glScalef(f8, f8, f8); + float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; + GL11.glTranslatef(f9, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(f8, f8, f8); + f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; + GL11.glTranslatef(-f9, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java b/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java index 336ecc9c..f92da2af 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java @@ -1,5 +1,9 @@ package minefantasy.mf2.client.render; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import cpw.mods.fml.client.FMLClientHandler; /** * * @author Anonymous Productions @@ -11,313 +15,286 @@ import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.item.gadget.ItemCrossbow; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.inventory.GuiInventory; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumAction; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; +public class RenderCrossbow implements IItemRenderer { -import cpw.mods.fml.client.FMLClientHandler; + private float scale; + RenderItem renderItem = new RenderItem(); -public class RenderCrossbow implements IItemRenderer -{ + public RenderCrossbow(float sc) { + scale = sc; + } - private float scale; - RenderItem renderItem = new RenderItem(); - - public RenderCrossbow(float sc) - { - scale = sc; - } - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, - ItemRendererHelper helper) { - return false; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) - { - Minecraft mc = FMLClientHandler.instance().getClient(); - EntityLivingBase player = null; - ItemCrossbow crossbow = (ItemCrossbow)item.getItem(); - - if (type.equals(ItemRenderType.EQUIPPED)) - { - //GL11.glRotatef(45, 0F, 1F, -1F); - renderPart(item, player, "stock"); - renderPart(item, player, "mechanism"); - renderPart(item, player, "string"); - renderPart(item, player, "muzzle"); - renderPart(item, player, "mod"); - } - if (type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON) && crossbow.getZoom(item) < 0.1F) - { - renderPart(item, player, "stock"); - renderPart(item, player, "mechanism"); - renderPart(item, player, "string"); - renderPart(item, player, "muzzle"); - renderPart(item, player, "mod"); - } - } - - private void renderPart(ItemStack item, EntityLivingBase player, String iconName) { - - GL11.glPushMatrix(); - - GL11.glTranslatef(0.75F, -0.25F, 0F); - GL11.glTranslatef(0f, 0f, 0); - doRenderPart(item, iconName); - - GL11.glPopMatrix(); - - } - - private void doRenderPart(ItemStack item, String iconName) - { - boolean flip = iconName.equalsIgnoreCase("mechanism") || iconName.equalsIgnoreCase("string"); - boolean isHead = iconName.equalsIgnoreCase("mechanism"); - - GL11.glPushMatrix(); - float x = -0.35F; - float y = 0.5F; - - ItemCrossbow bow = (ItemCrossbow)item.getItem(); - if(scale == 2.0F) - { - x -= 0.625F; - y -= 0.425F; - } - if(flip) - { - y += 0F;//bow.headYoffset(); - x += 0F;//bow.headXoffset(); - } - GL11.glTranslatef(x, y, 0); - if(flip) - { - GL11.glTranslatef(0, -0.1F, 0); - GL11.glScalef(scale, scale, scale); - } - else - { - GL11.glScalef(scale, scale, 1.0F); - GL11.glTranslatef(0F, 0F, 0.0625F/2F); - } - Minecraft mc = FMLClientHandler.instance().getClient(); - if(item != null) - mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - - if(flip) - { - GL11.glRotatef(90, 1, 1, 0); - } - if(iconName.equalsIgnoreCase("string")) - { - GL11.glTranslatef(0F, 0F, -(4/64F)); - GL11.glScaled(1F, 1F, 0.25F); - } - - - Tessellator tessellator = Tessellator.instance; - ItemCrossbow crossbow = (ItemCrossbow)item.getItem(); - IIcon icon = crossbow.getPartIcon(item, iconName); - renderIcon(mc, item, tessellator, icon, true); - - if(isHead) - { - int slot = 1; - GL11.glPushMatrix(); - float m = 0.01F; - if(slot % 2 == 0) - { - m = 0; - } - - GL11.glTranslatef(0.1F-m+(7F/32F), 0.35F-m+(7F/32F), -(slot+1)/64F-(1F/32F)); - - float ammoSize = 0.5F; - - - GL11.glScalef(0.5F, 0.5F, 0.5F); - GL11.glRotatef(90F, 0F, 0F, -1F); - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); - - if(loaded != null) - { - mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - for(int layer = 0; layer < loaded.getItem().getRenderPasses(loaded.getItemDamage()); layer ++) - { - GL11.glPushMatrix(); - IIcon bolt = loaded.getItem().getIcon(loaded, layer); - - int colour = loaded.getItem().getColorFromItemStack(loaded, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - renderIcon(mc, item, tessellator, bolt, ammoSize, false); - GL11.glPopMatrix(); - } - } - GL11.glPopMatrix(); - } - GL11.glPopMatrix(); - - } - - private void renderIcon(Minecraft mc, ItemStack item, Tessellator tessellator, IIcon icon, boolean enchant) - { - renderIcon(mc, item, tessellator, icon, 1.0F, enchant); - } - private void renderIcon(Minecraft mc, ItemStack item, Tessellator tessellator, IIcon icon, float scale, boolean enchant) - { - if(icon == null)return; - - float x1 = icon.getMinU(); - float x2 = icon.getMaxU(); - float y1 = icon.getMinV(); - float y2 = icon.getMaxV(); - float var10 = 0.0F; - float var11 = 0.3F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - /* - GL11.glTranslatef(-var10, -var11, 0.0F); - float var12 = 1.5F; - GL11.glScalef(var12, var12, var12); - GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); - */ - - - GL11.glScalef(scale, scale, scale); - ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (int)(icon.getIconWidth()), (int)(icon.getIconHeight()), 0.0625F); - - if (enchant && item != null && item.isItemEnchanted()) - { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - mc.renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - float var13 = 0.76F; - GL11.glColor4f(0.5F * var13, 0.25F * var13, 0.8F * var13, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float var14 = 0.125F; - GL11.glScalef(var14, var14, var14); - float var15 = (float) (System.currentTimeMillis() % 3000L) / 3000.0F * 8.0F; - GL11.glTranslatef(var15, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (int)(icon.getIconWidth()*scale), (int)(icon.getIconHeight()*scale), 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(var14, var14, var14); - var15 = (float) (System.currentTimeMillis() % 4873L) / 4873.0F * 8.0F; - GL11.glTranslatef(-var15, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (int)(icon.getIconWidth()*scale), (int)(icon.getIconHeight()*scale), 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - GL11.glDisable(GL12.GL_RESCALE_NORMAL); + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + Minecraft mc = FMLClientHandler.instance().getClient(); + EntityLivingBase player = null; + ItemCrossbow crossbow = (ItemCrossbow) item.getItem(); + + if (type.equals(ItemRenderType.EQUIPPED)) { + // GL11.glRotatef(45, 0F, 1F, -1F); + renderPart(item, player, "stock"); + renderPart(item, player, "mechanism"); + renderPart(item, player, "string"); + renderPart(item, player, "muzzle"); + renderPart(item, player, "mod"); + } + if (type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON) && crossbow.getZoom(item) < 0.1F) { + renderPart(item, player, "stock"); + renderPart(item, player, "mechanism"); + renderPart(item, player, "string"); + renderPart(item, player, "muzzle"); + renderPart(item, player, "mod"); + } + } + + private void renderPart(ItemStack item, EntityLivingBase player, String iconName) { + + GL11.glPushMatrix(); + + GL11.glTranslatef(0.75F, -0.25F, 0F); + GL11.glTranslatef(0f, 0f, 0); + doRenderPart(item, iconName); + + GL11.glPopMatrix(); + + } + + private void doRenderPart(ItemStack item, String iconName) { + boolean flip = iconName.equalsIgnoreCase("mechanism") || iconName.equalsIgnoreCase("string"); + boolean isHead = iconName.equalsIgnoreCase("mechanism"); + + GL11.glPushMatrix(); + float x = -0.35F; + float y = 0.5F; + + ItemCrossbow bow = (ItemCrossbow) item.getItem(); + if (scale == 2.0F) { + x -= 0.625F; + y -= 0.425F; + } + if (flip) { + y += 0F;// bow.headYoffset(); + x += 0F;// bow.headXoffset(); + } + GL11.glTranslatef(x, y, 0); + if (flip) { + GL11.glTranslatef(0, -0.1F, 0); + GL11.glScalef(scale, scale, scale); + } else { + GL11.glScalef(scale, scale, 1.0F); + GL11.glTranslatef(0F, 0F, 0.0625F / 2F); + } + Minecraft mc = FMLClientHandler.instance().getClient(); + if (item != null) + mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + + if (flip) { + GL11.glRotatef(90, 1, 1, 0); + } + if (iconName.equalsIgnoreCase("string")) { + GL11.glTranslatef(0F, 0F, -(4 / 64F)); + GL11.glScaled(1F, 1F, 0.25F); + } + + Tessellator tessellator = Tessellator.instance; + ItemCrossbow crossbow = (ItemCrossbow) item.getItem(); + IIcon icon = crossbow.getPartIcon(item, iconName); + renderIcon(mc, item, tessellator, icon, true); + + if (isHead) { + int slot = 1; + GL11.glPushMatrix(); + float m = 0.01F; + if (slot % 2 == 0) { + m = 0; + } + + GL11.glTranslatef(0.1F - m + (7F / 32F), 0.35F - m + (7F / 32F), -(slot + 1) / 64F - (1F / 32F)); + + float ammoSize = 0.5F; + + GL11.glScalef(0.5F, 0.5F, 0.5F); + GL11.glRotatef(90F, 0F, 0F, -1F); + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); + + if (loaded != null) { + mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + for (int layer = 0; layer < loaded.getItem().getRenderPasses(loaded.getItemDamage()); layer++) { + GL11.glPushMatrix(); + IIcon bolt = loaded.getItem().getIcon(loaded, layer); + + int colour = loaded.getItem().getColorFromItemStack(loaded, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + renderIcon(mc, item, tessellator, bolt, ammoSize, false); + GL11.glPopMatrix(); + } + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + + } + + private void renderIcon(Minecraft mc, ItemStack item, Tessellator tessellator, IIcon icon, boolean enchant) { + renderIcon(mc, item, tessellator, icon, 1.0F, enchant); + } + + private void renderIcon(Minecraft mc, ItemStack item, Tessellator tessellator, IIcon icon, float scale, + boolean enchant) { + if (icon == null) + return; + + float x1 = icon.getMinU(); + float x2 = icon.getMaxU(); + float y1 = icon.getMinV(); + float y2 = icon.getMaxV(); + float var10 = 0.0F; + float var11 = 0.3F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + /* + * GL11.glTranslatef(-var10, -var11, 0.0F); float var12 = 1.5F; + * GL11.glScalef(var12, var12, var12); GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); + * GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(-0.9375F, + * -0.0625F, 0.0F); + */ + + GL11.glScalef(scale, scale, scale); + ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (icon.getIconWidth()), (icon.getIconHeight()), + 0.0625F); + + if (enchant && item != null && item.isItemEnchanted()) { + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + mc.renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + float var13 = 0.76F; + GL11.glColor4f(0.5F * var13, 0.25F * var13, 0.8F * var13, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glPushMatrix(); + float var14 = 0.125F; + GL11.glScalef(var14, var14, var14); + float var15 = System.currentTimeMillis() % 3000L / 3000.0F * 8.0F; + GL11.glTranslatef(var15, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (int) (icon.getIconWidth() * scale), + (int) (icon.getIconHeight() * scale), 0.0625F); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(var14, var14, var14); + var15 = System.currentTimeMillis() % 4873L / 4873.0F * 8.0F; + GL11.glTranslatef(-var15, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (int) (icon.getIconWidth() * scale), + (int) (icon.getIconHeight() * scale), 0.0625F); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + + } + + public static void draw2dItem(Tessellator tessellator, float f, float f1, float f2, float f3, float thickness, + float res, float resSq) { + float f4 = 1.0F; + float f5 = 0.0625F * thickness; + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, f, f3); + tessellator.addVertexWithUV(f4, 0.0D, 0.0D, f2, f3); + tessellator.addVertexWithUV(f4, 1.0D, 0.0D, f2, f1); + tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, f, f1); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, -1F); + tessellator.addVertexWithUV(0.0D, 1.0D, 0.0F - f5, f, f1); + tessellator.addVertexWithUV(f4, 1.0D, 0.0F - f5, f2, f1); + tessellator.addVertexWithUV(f4, 0.0D, 0.0F - f5, f2, f3); + tessellator.addVertexWithUV(0.0D, 0.0D, 0.0F - f5, f, f3); + tessellator.draw(); + + tessellator.startDrawingQuads(); + tessellator.setNormal(-1F, 0.0F, 0.0F); + for (int i = 0; i < res; i++) { + float f6 = i / res; + float f10 = (f + (f2 - f) * f6) - (1 / (2 * resSq)); + float f14 = f4 * f6; + tessellator.addVertexWithUV(f14, 0.0D, 0.0F - f5, f10, f3); + tessellator.addVertexWithUV(f14, 0.0D, 0.0D, f10, f3); + tessellator.addVertexWithUV(f14, 1.0D, 0.0D, f10, f1); + tessellator.addVertexWithUV(f14, 1.0D, 0.0F - f5, f10, f1); + } + + tessellator.draw(); + + tessellator.startDrawingQuads(); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + for (int j = 0; j < res; j++) { + float f7 = j / res; + float f11 = (f + (f2 - f) * f7) - (1 / (2 * resSq)); + float f15 = f4 * f7 + 1 / (res - .01F); + tessellator.addVertexWithUV(f15, 1.0D, 0.0F - f5, f11, f1); + tessellator.addVertexWithUV(f15, 1.0D, 0.0D, f11, f1); + tessellator.addVertexWithUV(f15, 0.0D, 0.0D, f11, f3); + tessellator.addVertexWithUV(f15, 0.0D, 0.0F - f5, f11, f3); + } + + tessellator.draw(); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + for (int k = 0; k < res; k++) { + float f8 = k / res; + float f12 = (f3 + (f1 - f3) * f8) - (1 / (2 * resSq)); + float f16 = f4 * f8 + 1 / (res - .01F); + tessellator.addVertexWithUV(0.0D, f16, 0.0D, f, f12); + tessellator.addVertexWithUV(f4, f16, 0.0D, f2, f12); + tessellator.addVertexWithUV(f4, f16, 0.0F - f5, f2, f12); + tessellator.addVertexWithUV(0.0D, f16, 0.0F - f5, f, f12); + } + + tessellator.draw(); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, -1F, 0.0F); + for (int l = 0; l < res; l++) { + float f9 = l / res; + float f13 = (f3 + (f1 - f3) * f9) - (1 / (2 * resSq)); + float f17 = f4 * f9; + tessellator.addVertexWithUV(f4, f17, 0.0D, f2, f13); + tessellator.addVertexWithUV(0.0D, f17, 0.0D, f, f13); + tessellator.addVertexWithUV(0.0D, f17, 0.0F - f5, f, f13); + tessellator.addVertexWithUV(f4, f17, 0.0F - f5, f2, f13); + } + tessellator.draw(); } - public static void draw2dItem(Tessellator tessellator, float f, float f1, float f2, float f3, float thickness, float res, float resSq) { - float f4 = 1.0F; - float f5 = 0.0625F * thickness; - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, f, f3); - tessellator.addVertexWithUV(f4, 0.0D, 0.0D, f2, f3); - tessellator.addVertexWithUV(f4, 1.0D, 0.0D, f2, f1); - tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, f, f1); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, -1F); - tessellator.addVertexWithUV(0.0D, 1.0D, 0.0F - f5, f, f1); - tessellator.addVertexWithUV(f4, 1.0D, 0.0F - f5, f2, f1); - tessellator.addVertexWithUV(f4, 0.0D, 0.0F - f5, f2, f3); - tessellator.addVertexWithUV(0.0D, 0.0D, 0.0F - f5, f, f3); - tessellator.draw(); - - tessellator.startDrawingQuads(); - tessellator.setNormal(-1F, 0.0F, 0.0F); - for (int i = 0; i < res; i++) { - float f6 = (float) i / res; - float f10 = (f + (f2 - f) * f6) - (1 / (2 * resSq)); - float f14 = f4 * f6; - tessellator.addVertexWithUV(f14, 0.0D, 0.0F - f5, f10, f3); - tessellator.addVertexWithUV(f14, 0.0D, 0.0D, f10, f3); - tessellator.addVertexWithUV(f14, 1.0D, 0.0D, f10, f1); - tessellator.addVertexWithUV(f14, 1.0D, 0.0F - f5, f10, f1); - } - - tessellator.draw(); - - - tessellator.startDrawingQuads(); - tessellator.setNormal(1.0F, 0.0F, 0.0F); - for (int j = 0; j < res; j++) { - float f7 = (float) j / res; - float f11 = (f + (f2 - f) * f7) - (1 / (2 * resSq)); - float f15 = f4 * f7 + 1 / (res - .01F); - tessellator.addVertexWithUV(f15, 1.0D, 0.0F - f5, f11, f1); - tessellator.addVertexWithUV(f15, 1.0D, 0.0D, f11, f1); - tessellator.addVertexWithUV(f15, 0.0D, 0.0D, f11, f3); - tessellator.addVertexWithUV(f15, 0.0D, 0.0F - f5, f11, f3); - } - - tessellator.draw(); - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - for (int k = 0; k < res; k++) { - float f8 = (float) k / res; - float f12 = (f3 + (f1 - f3) * f8) - (1 / (2 * resSq)); - float f16 = f4 * f8 + 1 / (res - .01F); - tessellator.addVertexWithUV(0.0D, f16, 0.0D, f, f12); - tessellator.addVertexWithUV(f4, f16, 0.0D, f2, f12); - tessellator.addVertexWithUV(f4, f16, 0.0F - f5, f2, f12); - tessellator.addVertexWithUV(0.0D, f16, 0.0F - f5, f, f12); - } - - tessellator.draw(); - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1F, 0.0F); - for (int l = 0; l < res; l++) { - float f9 = (float) l / res; - float f13 = (f3 + (f1 - f3) * f9) - (1 / (2 * resSq)); - float f17 = f4 * f9; - tessellator.addVertexWithUV(f4, f17, 0.0D, f2, f13); - tessellator.addVertexWithUV(0.0D, f17, 0.0D, f, f13); - tessellator.addVertexWithUV(0.0D, f17, 0.0F - f5, f, f13); - tessellator.addVertexWithUV(f4, f17, 0.0F - f5, f2, f13); - } - - tessellator.draw(); - } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderDragonBreath.java b/src/main/java/minefantasy/mf2/client/render/RenderDragonBreath.java index 9e992148..cd5d7ed8 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderDragonBreath.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderDragonBreath.java @@ -1,5 +1,10 @@ package minefantasy.mf2.client.render; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.entity.EntityDragonBreath; import net.minecraft.client.Minecraft; @@ -9,76 +14,71 @@ import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - @SideOnly(Side.CLIENT) -public class RenderDragonBreath extends Render -{ - public RenderDragonBreath() - { - } +public class RenderDragonBreath extends Render { + public RenderDragonBreath() { + } + + /** + * Actually renders the given argument. This is a synthetic bridge method, + * always casting down its argument and then handing it off to a worker function + * which does the actual work. In all probabilty, the class Render is generic + * (Render 0 && ResearchLogic.hasInfoUnlocked((EntityPlayer)user, "counteratt"); - } - else if(!(user instanceof EntityPlayer) && item != null && item.getItem() instanceof IParryable) - { - hasParried = user.hurtResistantTime > 0; - } - } - - this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator tessellator = Tessellator.instance; - - if (type == ItemRenderType.EQUIPPED) - { - if(user != null && hasParried) - { - if(user instanceof EntityPlayer) - { - if(willStab) - { - GL11.glRotatef(-90, 0, 0, 1); - GL11.glTranslatef(-1.5F, 0.5F, 0); - } - else - { - GL11.glRotatef(90, 0, 0, 1); - GL11.glTranslatef(0F, -1.0F, 0); - } - } - else - { - GL11.glRotatef(-90, -1, 0, 0); - GL11.glTranslatef(0F, 0F, -0.25F); - } - } - GL11.glTranslatef(0.25F*offset, -0.25F*offset, 0); - GL11.glTranslatef(-1.0F, 0F, 0); - GL11.glScalef(scale,scale,1); - - for(int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer ++) - { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, - icon.getMaxU(), - icon.getMinV(), - icon.getMinU(), - icon.getMaxV(), - icon.getIconWidth(), - icon.getIconHeight(), 1F/16F); - } - - if (item != null && item.hasEffect(0)) - { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - - }else if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) - { - if(hasParried) - { - if(willStab) - { - GL11.glRotatef(-90, 0, 0, 1); - GL11.glTranslatef(-1.5F, 0.5F, 0); - } - else - { - GL11.glRotatef(90, 0, 0, 1); - GL11.glTranslatef(0F, -1.0F, 0); - } - } - GL11.glTranslatef(0.05F*offset, -0.05F*offset, 0); - GL11.glTranslatef(-0.75F, -0.25F, 0); - GL11.glScalef(scale,scale,1); - - for(int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer ++) - { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, - icon.getMaxU(), - icon.getMinV(), - icon.getMinU(), - icon.getMaxV(), - icon.getIconWidth(), - icon.getIconHeight(), 1F/16F); - } - - if (item != null && item.hasEffect(0)) { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - } - - GL11.glPopMatrix(); - } + } + + public RenderHeavyWeapon setKatana() { + offset = 1.0F; + willStab = true; + return this; + } + + public RenderHeavyWeapon setGreatsword() { + offset = 1.0F; + return this; + } + + public RenderHeavyWeapon setAxe() { + offset = 1.0F; + return this; + } + + public RenderHeavyWeapon setBlunt() { + offset = 1.2F; + return this; + } + + public RenderHeavyWeapon setScythe() { + offset = 1.8F; + return this; + } + + public RenderHeavyWeapon() { + this(true); + } + + public RenderHeavyWeapon(boolean rot) { + this(rot, 2.0F); + } + + public RenderHeavyWeapon(boolean rot, float sc) { + rotate = rot; + scale = sc; + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + + GL11.glPushMatrix(); + + boolean hasParried = false; + if (mc == null) { + mc = FMLClientHandler.instance().getClient(); + itemRenderer = new RenderItem(); + } + EntityLivingBase user = null; + if (doesRenderParry) { + user = ((EntityLivingBase) data[1]); + + if (user instanceof EntityPlayer && item != null) { + hasParried = ItemWeaponMF.getParry(item) > 0 + && ResearchLogic.hasInfoUnlocked((EntityPlayer) user, "counteratt"); + } else if (!(user instanceof EntityPlayer) && item != null && item.getItem() instanceof IParryable) { + hasParried = user.hurtResistantTime > 0; + } + } + + this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + Tessellator tessellator = Tessellator.instance; + + if (type == ItemRenderType.EQUIPPED) { + if (user != null && hasParried) { + if (user instanceof EntityPlayer) { + if (willStab) { + GL11.glRotatef(-90, 0, 0, 1); + GL11.glTranslatef(-1.5F, 0.5F, 0); + } else { + GL11.glRotatef(90, 0, 0, 1); + GL11.glTranslatef(0F, -1.0F, 0); + } + } else { + GL11.glRotatef(-90, -1, 0, 0); + GL11.glTranslatef(0F, 0F, -0.25F); + } + } + GL11.glTranslatef(0.25F * offset, -0.25F * offset, 0); + GL11.glTranslatef(-1.0F, 0F, 0); + GL11.glScalef(scale, scale, 1); + + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + + } else if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + if (hasParried) { + if (willStab) { + GL11.glRotatef(-90, 0, 0, 1); + GL11.glTranslatef(-1.5F, 0.5F, 0); + } else { + GL11.glRotatef(90, 0, 0, 1); + GL11.glTranslatef(0F, -1.0F, 0); + } + } + GL11.glTranslatef(0.05F * offset, -0.05F * offset, 0); + GL11.glTranslatef(-0.75F, -0.25F, 0); + GL11.glScalef(scale, scale, 1); + + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + } + + GL11.glPopMatrix(); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderLance.java b/src/main/java/minefantasy/mf2/client/render/RenderLance.java index 410d7430..3ab4e4d9 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderLance.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderLance.java @@ -1,16 +1,18 @@ package minefantasy.mf2.client.render; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.FMLClientHandler; +import minefantasy.mf2.api.helpers.TextureHelperMF; /** * * @author Anonymous Productions * */ import net.minecraft.client.Minecraft; -import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -19,129 +21,101 @@ import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; -import org.lwjgl.opengl.GL11; +public class RenderLance implements IItemRenderer { + private Minecraft mc; + private RenderItem itemRenderer; -import cpw.mods.fml.client.FMLClientHandler; + public RenderLance() { + } -public class RenderLance implements IItemRenderer -{ - private Minecraft mc; - private RenderItem itemRenderer; - - public RenderLance() - { - } - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, - ItemRendererHelper helper) { - return false; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) - { - GL11.glPushMatrix(); - - if (mc == null) - { - mc = FMLClientHandler.instance().getClient(); - itemRenderer = new RenderItem(); - } - this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator tessellator = Tessellator.instance; - - if (type == ItemRenderType.EQUIPPED_FIRST_PERSON || type == ItemRenderType.EQUIPPED) - { - GL11.glTranslatef(0.8F, 0.2F, 0); - - GL11.glPushMatrix(); - float r = 0F; - if(getRotationFor(data)) - { - if(type == ItemRenderType.EQUIPPED_FIRST_PERSON) - { - r = 90F; - } - else - { - r = 45F; - } - } - GL11.glRotatef(r, 0, 0, -1); - GL11.glScalef(3F,3F,1F); - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.8F, -0.2F, 0F); - - for(int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer ++) - { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, - icon.getMaxU(), - icon.getMinV(), - icon.getMinU(), - icon.getMaxV(), - icon.getIconWidth(), - icon.getIconHeight(), 1F/16F); - } - - if (item != null && item.hasEffect(0)) - { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - GL11.glPopMatrix(); - GL11.glPopMatrix(); - } - GL11.glPopMatrix(); - } - private boolean getRotationFor(Object... data) - { - for(int a = 0; a < data.length; a ++) - { - if(data[a] instanceof EntityLivingBase) - { - EntityLivingBase living = (EntityLivingBase)data[a]; - if(living.isSwingInProgress) - { - return true; - } - - if(living.isRiding()) - { - Entity mount = living.ridingEntity; - float speed = (float)Math.hypot(mount.motionX, mount.motionZ) * 20F; - - if(speed > 4.0F) - { - return true; - } - } - - } - - if(data[a] instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer)data[a]; - if(player.isUsingItem()) - { - return true; - } - } - } + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + GL11.glPushMatrix(); + + if (mc == null) { + mc = FMLClientHandler.instance().getClient(); + itemRenderer = new RenderItem(); + } + this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + Tessellator tessellator = Tessellator.instance; + + if (type == ItemRenderType.EQUIPPED_FIRST_PERSON || type == ItemRenderType.EQUIPPED) { + GL11.glTranslatef(0.8F, 0.2F, 0); + + GL11.glPushMatrix(); + float r = 0F; + if (getRotationFor(data)) { + if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + r = 90F; + } else { + r = 45F; + } + } + GL11.glRotatef(r, 0, 0, -1); + GL11.glScalef(3F, 3F, 1F); + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.8F, -0.2F, 0F); + + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + GL11.glPopMatrix(); + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + + private boolean getRotationFor(Object... data) { + for (int a = 0; a < data.length; a++) { + if (data[a] instanceof EntityLivingBase) { + EntityLivingBase living = (EntityLivingBase) data[a]; + if (living.isSwingInProgress) { + return true; + } + + if (living.isRiding()) { + Entity mount = living.ridingEntity; + float speed = (float) Math.hypot(mount.motionX, mount.motionZ) * 20F; + + if (speed > 4.0F) { + return true; + } + } + + } + + if (data[a] instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) data[a]; + if (player.isUsingItem()) { + return true; + } + } + } return false; } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderMine.java b/src/main/java/minefantasy/mf2/client/render/RenderMine.java index 1d119577..049e2d4a 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderMine.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderMine.java @@ -1,5 +1,9 @@ package minefantasy.mf2.client.render; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.entity.EntityMine; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; @@ -9,64 +13,60 @@ import net.minecraft.init.Blocks; import net.minecraft.util.ResourceLocation; -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - @SideOnly(Side.CLIENT) -public class RenderMine extends Render -{ - private RenderBlocks blockRenderer = new RenderBlocks(); +public class RenderMine extends Render { + private RenderBlocks blockRenderer = new RenderBlocks(); + + public RenderMine() { + this.shadowSize = 0.25F; + } - public RenderMine() - { - this.shadowSize = 0.25F; - } + public void doRender(EntityMine mine, double x, double y, double z, float f, float f1) { + Block block = mine.getCasing() == 3 ? Blocks.glass + : mine.getCasing() == 2 ? Blocks.obsidian + : mine.getCasing() == 1 ? Blocks.iron_block : Blocks.hardened_clay; + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y - 0.3F, (float) z); - public void doRender(EntityMine mine, double x, double y, double z, float f, float f1) - { - Block block = mine.getCasing() == 3 ? Blocks.glass : mine.getCasing() == 2 ? Blocks.obsidian : mine.getCasing() == 1 ? Blocks.iron_block : Blocks.hardened_clay; - GL11.glPushMatrix(); - GL11.glTranslatef((float)x, (float)y-0.3F, (float)z); + this.bindEntityTexture(mine); + GL11.glScalef(0.5F, 0.25F, 0.5F); + this.blockRenderer.renderBlockAsItem(block, 0, mine.getBrightness(f1)); - this.bindEntityTexture(mine); - GL11.glScalef(0.5F, 0.25F, 0.5F); - this.blockRenderer.renderBlockAsItem(block, 0, mine.getBrightness(f1)); - - GL11.glTranslatef(0F, 0.3F, 0F); - GL11.glScalef(0.5F, 1.0F, 0.5F); - this.blockRenderer.renderBlockAsItem(block, 0, mine.getBrightness(f1)); + GL11.glTranslatef(0F, 0.3F, 0F); + GL11.glScalef(0.5F, 1.0F, 0.5F); + this.blockRenderer.renderBlockAsItem(block, 0, mine.getBrightness(f1)); - GL11.glPopMatrix(); - } + GL11.glPopMatrix(); + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntityMine p_110775_1_) - { - return TextureMap.locationBlocksTexture; - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(EntityMine p_110775_1_) { + return TextureMap.locationBlocksTexture; + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. - */ - @Override - protected ResourceLocation getEntityTexture(Entity p_110775_1_) - { - return this.getEntityTexture((EntityMine)p_110775_1_); - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture((EntityMine) p_110775_1_); + } - /** - * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then - * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic - * (Render 0.0F) - { - GL11.glRotatef(MathHelper.sin(f2) * f2 * f3 / 10.0F * (float)entity.getForwardDirection(), 1.0F, 0.0F, 0.0F); - } + if (f2 > 0.0F) { + GL11.glRotatef(MathHelper.sin(f2) * f2 * f3 / 10.0F * entity.getForwardDirection(), 1.0F, 0.0F, 0.0F); + } - float f4 = 1F; - GL11.glTranslatef(-0.5F, 0F, 0F); - GL11.glScalef(f4, f4, f4); - GL11.glScalef(1.0F / f4, 1.0F / f4, 1.0F / f4); - this.bindEntityTexture(entity); - GL11.glScalef(-1.0F, -1.0F, 1.0F); - this.modelParachute.render(entity, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); - GL11.glPopMatrix(); - } + float f4 = 1F; + GL11.glTranslatef(-0.5F, 0F, 0F); + GL11.glScalef(f4, f4, f4); + GL11.glScalef(1.0F / f4, 1.0F / f4, 1.0F / f4); + this.bindEntityTexture(entity); + GL11.glScalef(-1.0F, -1.0F, 1.0F); + this.modelParachute.render(entity, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); + GL11.glPopMatrix(); + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntityParachute p_110775_1_) - { - return TextureHelperMF.getResource("textures/models/object/parachute.png"); - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(EntityParachute p_110775_1_) { + return TextureHelperMF.getResource("textures/models/object/parachute.png"); + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(Entity p_110775_1_) - { - return this.getEntityTexture((EntityParachute)p_110775_1_); - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture((EntityParachute) p_110775_1_); + } - /** - * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then - * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic - * (Render= 85.0F) - { - f4 = 85.0F; - } - - f2 = f3 - f4; - - if (f4 * f4 > 2500.0F) - { - f2 += f4 * 0.2F; - } - } - - float f13 = entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * f1; - this.renderLivingAt(entity, x, y, z); - f4 = this.handleRotationFloat(entity, f1); - this.rotateCorpse(entity, f4, f2, f1); - float f5 = 0.0625F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glScalef(-1.0F, -1.0F, 1.0F); - this.preRenderCallback(entity, f1); - GL11.glTranslatef(0.0F, -24.0F * f5 - 0.0078125F, 0.0F); - float f6 = entity.prevLimbSwingAmount + (entity.limbSwingAmount - entity.prevLimbSwingAmount) * f1; - float f7 = entity.limbSwing - entity.limbSwingAmount * (1.0F - f1); - - if (entity.isChild()) - { - f7 *= 3.0F; - } - - if (f6 > 1.0F) - { - f6 = 1.0F; - } - if(entity instanceof EntityCogwork && entity.riddenByEntity == null && ((EntityCogwork)entity).isUnderRepairFrame()) - { - GL11.glTranslatef(0F, -0.5F, 0F); - } - if(suit != null) - { - GL11.glTranslatef(0F, -0.15625F, 0F); - } - - GL11.glEnable(GL11.GL_ALPHA_TEST); - this.mainModel.setLivingAnimations(entity, f7, f6, f1); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - this.renderModel(0, entity, f7, f6, f4, f3 - f2, f13, f5); - - CustomMaterial plating = getPlating(entity); - if(plating != null) - { - colourPlating(plating); - this.renderModel(1, entity, f7, f6, f4, f3 - f2, f13, f5); - } - GL11.glColor3f(1.0F, 1.0F, 1.0F); - int j; - float f8; - float f9; - float f10; - - for (int i = 0; i < 4; ++i) - { - j = this.shouldRenderPass(entity, i, f1); - - if (j > 0) - { - this.renderPassModel.setLivingAnimations(entity, f7, f6, f1); - this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - - if ((j & 240) == 16) - { - this.func_82408_c(entity, i, f1); - this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - } - - if ((j & 15) == 15) - { - f8 = (float)entity.ticksExisted + f1; - this.bindTexture(RES_ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - f9 = 0.5F; - GL11.glColor4f(f9, f9, f9, 1.0F); - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDepthMask(false); - - for (int k = 0; k < 2; ++k) - { - GL11.glDisable(GL11.GL_LIGHTING); - f10 = 0.76F; - GL11.glColor4f(0.5F * f10, 0.25F * f10, 0.8F * f10, 1.0F); - GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glLoadIdentity(); - float f11 = f8 * (0.001F + (float)k * 0.003F) * 20.0F; - float f12 = 0.33333334F; - GL11.glScalef(f12, f12, f12); - GL11.glRotatef(30.0F - (float)k * 60.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.0F, f11, 0.0F); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - } - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glDepthMask(true); - GL11.glLoadIdentity(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_BLEND); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_ALPHA_TEST); - } - } - - GL11.glDepthMask(true); - if(!isFrame && !isFirstPersonRender(entity)) - { - this.renderEquippedItems(entity, f1); - } - float f14 = entity.getBrightness(f1); - j = this.getColorMultiplier(entity, f14, f1); - OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); - GL11.glDisable(GL11.GL_TEXTURE_2D); - OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); - - if ((j >> 24 & 255) > 0 || entity.hurtTime > 0 || entity.deathTime > 0) - { - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glDepthFunc(GL11.GL_EQUAL); - - if (entity.hurtTime > 0 || entity.deathTime > 0) - { - GL11.glColor4f(f14, 0.0F, 0.0F, 0.4F); - this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - - for (int l = 0; l < 4; ++l) - { - if (this.inheritRenderPass(entity, l, f1) >= 0) - { - GL11.glColor4f(f14, 0.0F, 0.0F, 0.4F); - this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - } - } - } - - if ((j >> 24 & 255) > 0) - { - f8 = (float)(j >> 16 & 255) / 255.0F; - f9 = (float)(j >> 8 & 255) / 255.0F; - float f15 = (float)(j & 255) / 255.0F; - f10 = (float)(j >> 24 & 255) / 255.0F; - GL11.glColor4f(f8, f9, f15, f10); - this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - - for (int i1 = 0; i1 < 4; ++i1) - { - if (this.inheritRenderPass(entity, i1, f1) >= 0) - { - GL11.glColor4f(f8, f9, f15, f10); - this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - } - } - } - - GL11.glDepthFunc(GL11.GL_LEQUAL); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_TEXTURE_2D); - } - - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - } - catch (Exception exception) - { - } - - OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); - GL11.glEnable(GL11.GL_TEXTURE_2D); - OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glPopMatrix(); - this.passSpecialRender(entity, x, y, z); - MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Post(entity, this, x, y, z)); - } - - public static boolean isFirstPersonRender(EntityLivingBase entity) - { + private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation( + "textures/misc/enchanted_item_glint.png"); + + public RenderPowerArmour() { + super(new ModelCogwork(1F), 1.5F); + this.cogworkSuit = (ModelBiped) this.mainModel; + } + + @Override + protected boolean func_110813_b(EntityLivingBase entity) { + return false; + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(int layer) { + String tex = layer == 0 ? "base" : "plating"; + return TextureHelperMF.getResource("textures/models/armour/cogwork/cogwork_suit_" + tex + ".png"); + } + + protected void bindEntityTexture(int layer) { + this.bindTexture(this.getEntityTexture(layer)); + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture(0); + } + + protected void offsetHeldItem() { + GL11.glTranslatef(0.0F, 0.1875F, 0.0F); + } + + /** + * Actually renders the given argument. This is a synthetic bridge method, + * always casting down its argument and then handing it off to a worker function + * which does the actual work. In all probabilty, the class Render is generic + * (Render= 85.0F) { + f4 = 85.0F; + } + + f2 = f3 - f4; + + if (f4 * f4 > 2500.0F) { + f2 += f4 * 0.2F; + } + } + + float f13 = entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * f1; + this.renderLivingAt(entity, x, y, z); + f4 = this.handleRotationFloat(entity, f1); + this.rotateCorpse(entity, f4, f2, f1); + float f5 = 0.0625F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glScalef(-1.0F, -1.0F, 1.0F); + this.preRenderCallback(entity, f1); + GL11.glTranslatef(0.0F, -24.0F * f5 - 0.0078125F, 0.0F); + float f6 = entity.prevLimbSwingAmount + (entity.limbSwingAmount - entity.prevLimbSwingAmount) * f1; + float f7 = entity.limbSwing - entity.limbSwingAmount * (1.0F - f1); + + if (entity.isChild()) { + f7 *= 3.0F; + } + + if (f6 > 1.0F) { + f6 = 1.0F; + } + if (entity instanceof EntityCogwork && entity.riddenByEntity == null + && ((EntityCogwork) entity).isUnderRepairFrame()) { + GL11.glTranslatef(0F, -0.5F, 0F); + } + if (suit != null) { + GL11.glTranslatef(0F, -0.15625F, 0F); + } + + GL11.glEnable(GL11.GL_ALPHA_TEST); + this.mainModel.setLivingAnimations(entity, f7, f6, f1); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + this.renderModel(0, entity, f7, f6, f4, f3 - f2, f13, f5); + + CustomMaterial plating = getPlating(entity); + if (plating != null) { + colourPlating(plating); + this.renderModel(1, entity, f7, f6, f4, f3 - f2, f13, f5); + } + GL11.glColor3f(1.0F, 1.0F, 1.0F); + int j; + float f8; + float f9; + float f10; + + for (int i = 0; i < 4; ++i) { + j = this.shouldRenderPass(entity, i, f1); + + if (j > 0) { + this.renderPassModel.setLivingAnimations(entity, f7, f6, f1); + this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + + if ((j & 240) == 16) { + this.func_82408_c(entity, i, f1); + this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + } + + if ((j & 15) == 15) { + f8 = entity.ticksExisted + f1; + this.bindTexture(RES_ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + f9 = 0.5F; + GL11.glColor4f(f9, f9, f9, 1.0F); + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDepthMask(false); + + for (int k = 0; k < 2; ++k) { + GL11.glDisable(GL11.GL_LIGHTING); + f10 = 0.76F; + GL11.glColor4f(0.5F * f10, 0.25F * f10, 0.8F * f10, 1.0F); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glLoadIdentity(); + float f11 = f8 * (0.001F + k * 0.003F) * 20.0F; + float f12 = 0.33333334F; + GL11.glScalef(f12, f12, f12); + GL11.glRotatef(30.0F - k * 60.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0F, f11, 0.0F); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glDepthMask(true); + GL11.glLoadIdentity(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + } + + GL11.glDepthMask(true); + if (!isFrame && !isFirstPersonRender(entity)) { + this.renderEquippedItems(entity, f1); + } + float f14 = entity.getBrightness(f1); + j = this.getColorMultiplier(entity, f14, f1); + OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GL11.glDisable(GL11.GL_TEXTURE_2D); + OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); + + if ((j >> 24 & 255) > 0 || entity.hurtTime > 0 || entity.deathTime > 0) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDepthFunc(GL11.GL_EQUAL); + + if (entity.hurtTime > 0 || entity.deathTime > 0) { + GL11.glColor4f(f14, 0.0F, 0.0F, 0.4F); + this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + + for (int l = 0; l < 4; ++l) { + if (this.inheritRenderPass(entity, l, f1) >= 0) { + GL11.glColor4f(f14, 0.0F, 0.0F, 0.4F); + this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + } + } + } + + if ((j >> 24 & 255) > 0) { + f8 = (j >> 16 & 255) / 255.0F; + f9 = (j >> 8 & 255) / 255.0F; + float f15 = (j & 255) / 255.0F; + f10 = (j >> 24 & 255) / 255.0F; + GL11.glColor4f(f8, f9, f15, f10); + this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + + for (int i1 = 0; i1 < 4; ++i1) { + if (this.inheritRenderPass(entity, i1, f1) >= 0) { + GL11.glColor4f(f8, f9, f15, f10); + this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + } + } + } + + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + } catch (Exception exception) { + } + + OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GL11.glEnable(GL11.GL_TEXTURE_2D); + OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glPopMatrix(); + this.passSpecialRender(entity, x, y, z); + MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Post(entity, this, x, y, z)); + } + + public static boolean isFirstPersonRender(EntityLivingBase entity) { Minecraft mc = Minecraft.getMinecraft(); - return mc.gameSettings.thirdPersonView == 0 && entity == mc.thePlayer; + return mc.gameSettings.thirdPersonView == 0 && entity == mc.thePlayer; } - private CustomMaterial getPlating(EntityLivingBase base) - { - EntityCogwork suit = getCogwork(base); - if(suit != null) - { - return suit.getPlating(); - } - return null; - } - private EntityCogwork getCogwork(EntityLivingBase base) - { - if(base instanceof EntityCogwork) - { - return (EntityCogwork)base; - } - if(base.ridingEntity != null && base.ridingEntity instanceof EntityCogwork) - { - return (EntityCogwork)base.ridingEntity; - } + private CustomMaterial getPlating(EntityLivingBase base) { + EntityCogwork suit = getCogwork(base); + if (suit != null) { + return suit.getPlating(); + } return null; } - private void colourPlating(CustomMaterial material) - { - GL11.glColor3f((float)material.colourRGB[0]/255F, (float)material.colourRGB[1]/255F, (float)material.colourRGB[2]/255F); + private EntityCogwork getCogwork(EntityLivingBase base) { + if (base instanceof EntityCogwork) { + return (EntityCogwork) base; + } + if (base.ridingEntity != null && base.ridingEntity instanceof EntityCogwork) { + return (EntityCogwork) base.ridingEntity; + } + return null; + } + + private void colourPlating(CustomMaterial material) { + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + } + + @Override + protected void renderModel(EntityLivingBase p_77036_1_, float p_77036_2_, float p_77036_3_, float p_77036_4_, + float p_77036_5_, float p_77036_6_, float p_77036_7_) { + this.renderModel(0, p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); } - @Override - protected void renderModel(EntityLivingBase p_77036_1_, float p_77036_2_, float p_77036_3_, float p_77036_4_, float p_77036_5_, float p_77036_6_, float p_77036_7_) - { - this.renderModel(0, p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); - } - protected void renderModel(int layer, EntityLivingBase p_77036_1_, float p_77036_2_, float p_77036_3_, float p_77036_4_, float p_77036_5_, float p_77036_6_, float p_77036_7_) - { - this.bindEntityTexture(layer); - - if (!p_77036_1_.isInvisible()) - { - this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); - } - else if (!p_77036_1_.isInvisibleToPlayer(Minecraft.getMinecraft().thePlayer)) - { - GL11.glPushMatrix(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.15F); - GL11.glDepthMask(false); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.003921569F); - this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); - GL11.glDisable(GL11.GL_BLEND); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); - GL11.glPopMatrix(); - GL11.glDepthMask(true); - } - else - { - this.mainModel.setRotationAngles(p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_, p_77036_1_); - } - } - - private float interpolateRotation(float p_77034_1_, float p_77034_2_, float p_77034_3_) - { - float f3; - - for (f3 = p_77034_2_ - p_77034_1_; f3 < -180.0F; f3 += 360.0F) - { - ; - } - - while (f3 >= 180.0F) - { - f3 -= 360.0F; - } - - return p_77034_1_ + p_77034_3_ * f3; - } - - @Override - protected void renderEquippedItems(EntityLivingBase entity, float offset) - { - if(entity instanceof AbstractClientPlayer) - { - renderPlayerItems((AbstractClientPlayer)entity, offset); - return; - } - renderCogworkItems(entity, offset); - } - protected void renderCogworkItems(EntityLivingBase entity, float offset) - { - GL11.glColor3f(1.0F, 1.0F, 1.0F); - //RenderBiped - ItemStack itemstack = entity.getHeldItem(); - Item item; - float f1; - - if (itemstack != null && itemstack.getItem() != null) - { - item = itemstack.getItem(); - GL11.glPushMatrix(); - - if (this.mainModel.isChild) - { - f1 = 0.5F; - GL11.glTranslatef(0.0F, 0.625F, 0.0F); - GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F); - GL11.glScalef(f1, f1, f1); - } - - this.cogworkSuit.bipedRightArm.postRender(0.0625F); - GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); - - net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient.getItemRenderer(itemstack, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); - boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack, net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); - - if (item instanceof ItemBlock && (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType()))) - { - f1 = 0.5F; - GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); - f1 *= 0.75F; - GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(-f1, -f1, f1); - } - else if (item == Items.bow) - { - f1 = 0.625F; - GL11.glTranslatef(0.0F, 0.125F, 0.3125F); - GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(f1, -f1, f1); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } - else if (item.isFull3D()) - { - f1 = 0.625F; - - if (item.shouldRotateAroundWhenRendering()) - { - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.0F, -0.125F, 0.0F); - } - - this.offsetHeldItem(); - GL11.glScalef(f1, -f1, f1); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } - else - { - f1 = 0.375F; - GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); - GL11.glScalef(f1, f1, f1); - GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); - } - - float f2; - int i; - float f5; - - if (itemstack.getItem().requiresMultipleRenderPasses()) - { - for (i = 0; i < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++i) - { - int j = itemstack.getItem().getColorFromItemStack(itemstack, i); - f5 = (float)(j >> 16 & 255) / 255.0F; - f2 = (float)(j >> 8 & 255) / 255.0F; - float f3 = (float)(j & 255) / 255.0F; - GL11.glColor4f(f5, f2, f3, 1.0F); - this.renderManager.itemRenderer.renderItem(entity, itemstack, i); - } - } - else - { - i = itemstack.getItem().getColorFromItemStack(itemstack, 0); - float f4 = (float)(i >> 16 & 255) / 255.0F; - f5 = (float)(i >> 8 & 255) / 255.0F; - f2 = (float)(i & 255) / 255.0F; - GL11.glColor4f(f4, f5, f2, 1.0F); - this.renderManager.itemRenderer.renderItem(entity, itemstack, 0); - } - - GL11.glPopMatrix(); - } - } - - protected void renderPlayerItems(AbstractClientPlayer player, float offset) - { - GL11.glColor3f(1.0F, 1.0F, 1.0F); - super.renderArrowsStuckInEntity(player, offset); - float f2; - float f4; - - ItemStack held = player.inventory.getCurrentItem(); - if (held != null) - { - GL11.glPushMatrix(); - this.cogworkSuit.bipedRightArm.postRender(0.0625F); - GL11.glTranslatef(-0.0625F, 0.5F, -0.0625F); - - if (player.fishEntity != null) - { - held = new ItemStack(Items.stick); - } - - EnumAction enumaction = null; - - if (player.getItemInUseCount() > 0) - { - enumaction = held.getItemUseAction(); - } - - net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient.getItemRenderer(held, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); - boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, held, net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); - - if (is3D || held.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(held.getItem()).getRenderType())) - { - f2 = 0.5F; - GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); - f2 *= 0.75F; - GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(-f2, -f2, f2); - } - else if (held.getItem() == Items.bow) - { - f2 = 0.625F; - GL11.glTranslatef(0.0F, 0.125F, 0.3125F); - GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(f2, -f2, f2); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } - else if (held.getItem().isFull3D()) - { - f2 = 0.625F; - - if (held.getItem().shouldRotateAroundWhenRendering()) - { - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.0F, -0.125F, 0.0F); - } - - if (player.getItemInUseCount() > 0 && enumaction == EnumAction.block) - { - GL11.glTranslatef(0.05F, 0.0F, -0.1F); - GL11.glRotatef(-50.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(-10.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(-60.0F, 0.0F, 0.0F, 1.0F); - } - - GL11.glTranslatef(0.0F, 0.1875F, 0.0F); - GL11.glScalef(f2, -f2, f2); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } - else - { - f2 = 0.375F; - GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); - GL11.glScalef(f2, f2, f2); - GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); - } - - float f3; - int k; - float f12; - - if (held.getItem().requiresMultipleRenderPasses()) - { - for (k = 0; k < held.getItem().getRenderPasses(held.getItemDamage()); ++k) - { - int i = held.getItem().getColorFromItemStack(held, k); - f12 = (float)(i >> 16 & 255) / 255.0F; - f3 = (float)(i >> 8 & 255) / 255.0F; - f4 = (float)(i & 255) / 255.0F; - GL11.glColor4f(f12, f3, f4, 1.0F); - this.renderManager.itemRenderer.renderItem(player, held, k); - } - } - else - { - k = held.getItem().getColorFromItemStack(held, 0); - float f11 = (float)(k >> 16 & 255) / 255.0F; - f12 = (float)(k >> 8 & 255) / 255.0F; - f3 = (float)(k & 255) / 255.0F; - GL11.glColor4f(f11, f12, f3, 1.0F); - this.renderManager.itemRenderer.renderItem(player, held, 0); - } - - GL11.glPopMatrix(); - } - } + protected void renderModel(int layer, EntityLivingBase p_77036_1_, float p_77036_2_, float p_77036_3_, + float p_77036_4_, float p_77036_5_, float p_77036_6_, float p_77036_7_) { + this.bindEntityTexture(layer); + + if (!p_77036_1_.isInvisible()) { + this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); + } else if (!p_77036_1_.isInvisibleToPlayer(Minecraft.getMinecraft().thePlayer)) { + GL11.glPushMatrix(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.15F); + GL11.glDepthMask(false); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.003921569F); + this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); + GL11.glDisable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glPopMatrix(); + GL11.glDepthMask(true); + } else { + this.mainModel.setRotationAngles(p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_, + p_77036_1_); + } + } + + private float interpolateRotation(float p_77034_1_, float p_77034_2_, float p_77034_3_) { + float f3; + + for (f3 = p_77034_2_ - p_77034_1_; f3 < -180.0F; f3 += 360.0F) { + ; + } + + while (f3 >= 180.0F) { + f3 -= 360.0F; + } + + return p_77034_1_ + p_77034_3_ * f3; + } + + @Override + protected void renderEquippedItems(EntityLivingBase entity, float offset) { + if (entity instanceof AbstractClientPlayer) { + renderPlayerItems((AbstractClientPlayer) entity, offset); + return; + } + renderCogworkItems(entity, offset); + } + + protected void renderCogworkItems(EntityLivingBase entity, float offset) { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + // RenderBiped + ItemStack itemstack = entity.getHeldItem(); + Item item; + float f1; + + if (itemstack != null && itemstack.getItem() != null) { + item = itemstack.getItem(); + GL11.glPushMatrix(); + + if (this.mainModel.isChild) { + f1 = 0.5F; + GL11.glTranslatef(0.0F, 0.625F, 0.0F); + GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F); + GL11.glScalef(f1, f1, f1); + } + + this.cogworkSuit.bipedRightArm.postRender(0.0625F); + GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); + + net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient + .getItemRenderer(itemstack, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); + boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( + net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack, + net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); + + if (item instanceof ItemBlock + && (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType()))) { + f1 = 0.5F; + GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); + f1 *= 0.75F; + GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(-f1, -f1, f1); + } else if (item == Items.bow) { + f1 = 0.625F; + GL11.glTranslatef(0.0F, 0.125F, 0.3125F); + GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(f1, -f1, f1); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else if (item.isFull3D()) { + f1 = 0.625F; + + if (item.shouldRotateAroundWhenRendering()) { + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0F, -0.125F, 0.0F); + } + + this.offsetHeldItem(); + GL11.glScalef(f1, -f1, f1); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else { + f1 = 0.375F; + GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); + GL11.glScalef(f1, f1, f1); + GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); + } + + float f2; + int i; + float f5; + + if (itemstack.getItem().requiresMultipleRenderPasses()) { + for (i = 0; i < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++i) { + int j = itemstack.getItem().getColorFromItemStack(itemstack, i); + f5 = (j >> 16 & 255) / 255.0F; + f2 = (j >> 8 & 255) / 255.0F; + float f3 = (j & 255) / 255.0F; + GL11.glColor4f(f5, f2, f3, 1.0F); + this.renderManager.itemRenderer.renderItem(entity, itemstack, i); + } + } else { + i = itemstack.getItem().getColorFromItemStack(itemstack, 0); + float f4 = (i >> 16 & 255) / 255.0F; + f5 = (i >> 8 & 255) / 255.0F; + f2 = (i & 255) / 255.0F; + GL11.glColor4f(f4, f5, f2, 1.0F); + this.renderManager.itemRenderer.renderItem(entity, itemstack, 0); + } + + GL11.glPopMatrix(); + } + } + + protected void renderPlayerItems(AbstractClientPlayer player, float offset) { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + super.renderArrowsStuckInEntity(player, offset); + float f2; + float f4; + + ItemStack held = player.inventory.getCurrentItem(); + if (held != null) { + GL11.glPushMatrix(); + this.cogworkSuit.bipedRightArm.postRender(0.0625F); + GL11.glTranslatef(-0.0625F, 0.5F, -0.0625F); + + if (player.fishEntity != null) { + held = new ItemStack(Items.stick); + } + + EnumAction enumaction = null; + + if (player.getItemInUseCount() > 0) { + enumaction = held.getItemUseAction(); + } + + net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient + .getItemRenderer(held, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); + boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( + net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, held, + net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); + + if (is3D || held.getItem() instanceof ItemBlock + && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(held.getItem()).getRenderType())) { + f2 = 0.5F; + GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); + f2 *= 0.75F; + GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(-f2, -f2, f2); + } else if (held.getItem() == Items.bow) { + f2 = 0.625F; + GL11.glTranslatef(0.0F, 0.125F, 0.3125F); + GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(f2, -f2, f2); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else if (held.getItem().isFull3D()) { + f2 = 0.625F; + + if (held.getItem().shouldRotateAroundWhenRendering()) { + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0F, -0.125F, 0.0F); + } + + if (player.getItemInUseCount() > 0 && enumaction == EnumAction.block) { + GL11.glTranslatef(0.05F, 0.0F, -0.1F); + GL11.glRotatef(-50.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-10.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(-60.0F, 0.0F, 0.0F, 1.0F); + } + + GL11.glTranslatef(0.0F, 0.1875F, 0.0F); + GL11.glScalef(f2, -f2, f2); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else { + f2 = 0.375F; + GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); + GL11.glScalef(f2, f2, f2); + GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); + } + + float f3; + int k; + float f12; + + if (held.getItem().requiresMultipleRenderPasses()) { + for (k = 0; k < held.getItem().getRenderPasses(held.getItemDamage()); ++k) { + int i = held.getItem().getColorFromItemStack(held, k); + f12 = (i >> 16 & 255) / 255.0F; + f3 = (i >> 8 & 255) / 255.0F; + f4 = (i & 255) / 255.0F; + GL11.glColor4f(f12, f3, f4, 1.0F); + this.renderManager.itemRenderer.renderItem(player, held, k); + } + } else { + k = held.getItem().getColorFromItemStack(held, 0); + float f11 = (k >> 16 & 255) / 255.0F; + f12 = (k >> 8 & 255) / 255.0F; + f3 = (k & 255) / 255.0F; + GL11.glColor4f(f11, f12, f3, 1.0F); + this.renderManager.itemRenderer.renderItem(player, held, 0); + } + + GL11.glPopMatrix(); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderSaw.java b/src/main/java/minefantasy/mf2/client/render/RenderSaw.java index 46248418..bb1fcd05 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderSaw.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderSaw.java @@ -1,11 +1,15 @@ package minefantasy.mf2.client.render; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import cpw.mods.fml.client.FMLClientHandler; +import minefantasy.mf2.api.helpers.TextureHelperMF; /** * * @author Anonymous Productions */ import net.minecraft.client.Minecraft; -import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; @@ -14,91 +18,72 @@ import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; +public class RenderSaw implements IItemRenderer { + RenderItem renderItem = new RenderItem(); + private float scale; -import cpw.mods.fml.client.FMLClientHandler; + public RenderSaw() { + this(1.0F); + } + + public RenderSaw(float Sc) { + scale = Sc; + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + Minecraft mc = FMLClientHandler.instance().getClient(); + if (type.equals(ItemRenderType.EQUIPPED)) { + renderItem(item); + } + + } + + private void renderItem(ItemStack item) { + GL11.glPushMatrix(); + + Minecraft mc = FMLClientHandler.instance().getClient(); + mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + Tessellator tessellator = Tessellator.instance; + + float xOffset = 0.05F + (0.5F * (scale - 1)); + float yOffset = 0.35F - (0.5F * (scale - 1)); + float xPos = 0.0F + xOffset - yOffset; + float yPos = 0.3F - xOffset - yOffset; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-xPos, -yPos, 0.0F); + GL11.glScalef(scale, scale, 1); + + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + + GL11.glPopMatrix(); -public class RenderSaw implements IItemRenderer -{ - RenderItem renderItem = new RenderItem(); - private float scale; - - public RenderSaw() - { - this(1.0F); - } - public RenderSaw(float Sc) - { - scale = Sc; - } - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) - { - return type.equals(ItemRenderType.EQUIPPED); - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) - { - return false; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) - { - Minecraft mc = FMLClientHandler.instance().getClient(); - if (type.equals(ItemRenderType.EQUIPPED)) - { - renderItem(item); - } - - } - - private void renderItem(ItemStack item) - { - GL11.glPushMatrix(); - - Minecraft mc = FMLClientHandler.instance().getClient(); - mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator tessellator = Tessellator.instance; - - float xOffset = 0.05F+(0.5F * (scale - 1)); - float yOffset = 0.35F-(0.5F * (scale - 1)); - float xPos = 0.0F+xOffset-yOffset; - float yPos = 0.3F-xOffset-yOffset; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-xPos, -yPos, 0.0F); - GL11.glScalef(scale, scale, 1); - - for(int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer ++) - { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, - icon.getMaxU(), - icon.getMinV(), - icon.getMinU(), - icon.getMaxV(), - icon.getIconWidth(), - icon.getIconHeight(), 1F/16F); - } - if (item != null && item.hasEffect(0)) - { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - - GL11.glPopMatrix(); - - } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderShrapnel.java b/src/main/java/minefantasy/mf2/client/render/RenderShrapnel.java index b104de5f..e2e53099 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderShrapnel.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderShrapnel.java @@ -1,5 +1,10 @@ package minefantasy.mf2.client.render; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.entity.EntityShrapnel; import net.minecraft.client.renderer.Tessellator; @@ -8,101 +13,89 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - @SideOnly(Side.CLIENT) -public class RenderShrapnel extends Render -{ +public class RenderShrapnel extends Render { private String tex; - - public RenderShrapnel(String tex) - { + + public RenderShrapnel(String tex) { this.tex = tex; } + @Override - public void doRender(Entity entity, double x, double y, double z, float xr, float yr) - { - if(entity instanceof EntityShrapnel) - { - render(entity, ((EntityShrapnel)entity).getTexture(), x, y, z, xr, yr); - } - else - { + public void doRender(Entity entity, double x, double y, double z, float xr, float yr) { + if (entity instanceof EntityShrapnel) { + render(entity, ((EntityShrapnel) entity).getTexture(), x, y, z, xr, yr); + } else { render(entity, this.tex, x, y, z, xr, yr); } - } - public void render(Entity entity, String tex, double x, double y, double z, float xr, float yr) - { - this.loadTexture("textures/projectile/"+tex+".png"); - GL11.glPushMatrix(); - GL11.glTranslatef((float)x, (float)y, (float)z); - GL11.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * yr - 90.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * yr, 0.0F, 0.0F, 1.0F); - Tessellator var10 = Tessellator.instance; - byte var11 = 0; - float var12 = 0.0F; - float var13 = 0.5F; - float var14 = (0 + var11 * 10) / 32.0F; - float var15 = (5 + var11 * 10) / 32.0F; - float var16 = 0.0F; - float var17 = 0.15625F; - float var18 = (5 + var11 * 10) / 32.0F; - float var19 = (10 + var11 * 10) / 32.0F; - float var20 = 0.05625F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - float var21 = - yr; - - if (var21 > 0.0F) - { - float var22 = -MathHelper.sin(var21 * 3.0F) * var21; - GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F); - } - - GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); - GL11.glScalef(var20, var20, var20); - GL11.glTranslatef(-4.0F, 0.0F, 0.0F); - GL11.glNormal3f(var20, 0.0F, 0.0F); - var10.startDrawingQuads(); - var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var18); - var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var18); - var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var19); - var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var19); - var10.draw(); - GL11.glNormal3f(-var20, 0.0F, 0.0F); - var10.startDrawingQuads(); - var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var18); - var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var18); - var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var19); - var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var19); - var10.draw(); - - for (int var23 = 0; var23 < 4; ++var23) - { - GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); - GL11.glNormal3f(0.0F, 0.0F, var20); - var10.startDrawingQuads(); - var10.addVertexWithUV(-8.0D, -2.0D, 0.0D, var12, var14); - var10.addVertexWithUV(8.0D, -2.0D, 0.0D, var13, var14); - var10.addVertexWithUV(8.0D, 2.0D, 0.0D, var13, var15); - var10.addVertexWithUV(-8.0D, 2.0D, 0.0D, var12, var15); - var10.draw(); - } - - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - GL11.glPopMatrix(); - } - + } + + public void render(Entity entity, String tex, double x, double y, double z, float xr, float yr) { + this.loadTexture("textures/projectile/" + tex + ".png"); + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y, (float) z); + GL11.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * yr - 90.0F, 0.0F, 1.0F, + 0.0F); + GL11.glRotatef(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * yr, 0.0F, 0.0F, + 1.0F); + Tessellator var10 = Tessellator.instance; + byte var11 = 0; + float var12 = 0.0F; + float var13 = 0.5F; + float var14 = (0 + var11 * 10) / 32.0F; + float var15 = (5 + var11 * 10) / 32.0F; + float var16 = 0.0F; + float var17 = 0.15625F; + float var18 = (5 + var11 * 10) / 32.0F; + float var19 = (10 + var11 * 10) / 32.0F; + float var20 = 0.05625F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + float var21 = -yr; + + if (var21 > 0.0F) { + float var22 = -MathHelper.sin(var21 * 3.0F) * var21; + GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F); + } + + GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); + GL11.glScalef(var20, var20, var20); + GL11.glTranslatef(-4.0F, 0.0F, 0.0F); + GL11.glNormal3f(var20, 0.0F, 0.0F); + var10.startDrawingQuads(); + var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var18); + var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var18); + var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var19); + var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var19); + var10.draw(); + GL11.glNormal3f(-var20, 0.0F, 0.0F); + var10.startDrawingQuads(); + var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var18); + var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var18); + var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var19); + var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var19); + var10.draw(); + + for (int var23 = 0; var23 < 4; ++var23) { + GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); + GL11.glNormal3f(0.0F, 0.0F, var20); + var10.startDrawingQuads(); + var10.addVertexWithUV(-8.0D, -2.0D, 0.0D, var12, var14); + var10.addVertexWithUV(8.0D, -2.0D, 0.0D, var13, var14); + var10.addVertexWithUV(8.0D, 2.0D, 0.0D, var13, var15); + var10.addVertexWithUV(-8.0D, 2.0D, 0.0D, var12, var15); + var10.draw(); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + @Override - protected ResourceLocation getEntityTexture(Entity entity) - { + protected ResourceLocation getEntityTexture(Entity entity) { return null; } - private void loadTexture(String image) - { - bindTexture(TextureHelperMF.getResource(image)); + + private void loadTexture(String image) { + bindTexture(TextureHelperMF.getResource(image)); } } diff --git a/src/main/java/minefantasy/mf2/client/render/RenderSpear.java b/src/main/java/minefantasy/mf2/client/render/RenderSpear.java index 33ccd625..42121aa9 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderSpear.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderSpear.java @@ -1,5 +1,8 @@ package minefantasy.mf2.client.render; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.FMLClientHandler; /** * * @author Anonymous Productions @@ -14,7 +17,6 @@ import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -22,116 +24,92 @@ import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; -import org.lwjgl.opengl.GL11; +public class RenderSpear implements IItemRenderer { + private Minecraft mc; + private RenderItem itemRenderer; + private boolean isHalbeard; -import cpw.mods.fml.client.FMLClientHandler; + public RenderSpear() { + this(false); + } -public class RenderSpear implements IItemRenderer -{ - private Minecraft mc; - private RenderItem itemRenderer; - private boolean isHalbeard; - - public RenderSpear() - { - this(false); - } - public RenderSpear(boolean halbeard) - { - isHalbeard = halbeard; - } - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) - { - return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) - { - return false; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) - { - GL11.glPushMatrix(); - - if (mc == null) - { - mc = FMLClientHandler.instance().getClient(); - itemRenderer = new RenderItem(); - } - this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator tessellator = Tessellator.instance; - - boolean rotate = getRotationFor(type == ItemRenderType.EQUIPPED_FIRST_PERSON, data); - GL11.glTranslatef(-1.0F, -1.0F, 0); - GL11.glScalef(3,3,1); - - GL11.glPushMatrix(); - - for(int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer ++) - { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - float x = icon.getMaxU(); - float x2 = icon.getMinU(); - - if(rotate) - { - x2 = icon.getMaxU(); - x = icon.getMinU(); - } - - ItemRenderer.renderItemIn2D(tessellator, - x, - icon.getMinV(), - x2, - icon.getMaxV(), - icon.getIconWidth(), - icon.getIconHeight(), 1F/16F); - } - if (item != null && item.hasEffect(0)) - { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - - GL11.glPopMatrix(); - GL11.glPopMatrix(); - } - private boolean getRotationFor(boolean FP, Object... data) - { + public RenderSpear(boolean halbeard) { + isHalbeard = halbeard; + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + GL11.glPushMatrix(); + + if (mc == null) { + mc = FMLClientHandler.instance().getClient(); + itemRenderer = new RenderItem(); + } + this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + Tessellator tessellator = Tessellator.instance; + + boolean rotate = getRotationFor(type == ItemRenderType.EQUIPPED_FIRST_PERSON, data); + GL11.glTranslatef(-1.0F, -1.0F, 0); + GL11.glScalef(3, 3, 1); + + GL11.glPushMatrix(); + + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + float x = icon.getMaxU(); + float x2 = icon.getMinU(); + + if (rotate) { + x2 = icon.getMaxU(); + x = icon.getMinU(); + } + + ItemRenderer.renderItemIn2D(tessellator, x, icon.getMinV(), x2, icon.getMaxV(), icon.getIconWidth(), + icon.getIconHeight(), 1F / 16F); + } + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + + GL11.glPopMatrix(); + GL11.glPopMatrix(); + } + + private boolean getRotationFor(boolean FP, Object... data) { boolean charge = false; - for(int a = 0; a < data.length; a ++) - { - if(data[a] instanceof EntityLivingBase) - { - if(((EntityLivingBase)data[a]).isSwingInProgress && !isHalbeard) - { - return true; - } - if(((EntityLivingBase)data[a]).isSprinting() && FP) - { - charge = true; - } - } - if(data[a] instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer)data[a]; - if(player.isUsingItem()) - { - charge = false; - } - } - } + for (int a = 0; a < data.length; a++) { + if (data[a] instanceof EntityLivingBase) { + if (((EntityLivingBase) data[a]).isSwingInProgress && !isHalbeard) { + return true; + } + if (((EntityLivingBase) data[a]).isSprinting() && FP) { + charge = true; + } + } + if (data[a] instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) data[a]; + if (player.isUsingItem()) { + charge = false; + } + } + } return charge; } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderSword.java b/src/main/java/minefantasy/mf2/client/render/RenderSword.java index 68769b31..673fc184 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderSword.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderSword.java @@ -1,15 +1,16 @@ package minefantasy.mf2.client.render; -import javafx.scene.paint.Color; -import minefantasy.mf2.api.weapon.IParryable; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.FMLClientHandler; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.knowledge.ResearchLogic; +import minefantasy.mf2.api.weapon.IParryable; import minefantasy.mf2.item.weapon.ItemWeaponMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -17,154 +18,115 @@ import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; -import org.lwjgl.opengl.GL11; +public class RenderSword implements IItemRenderer { + private Minecraft mc; + private RenderItem itemRenderer; + private boolean isAxe = false; -import cpw.mods.fml.client.FMLClientHandler; + public RenderSword setAxe() { + isAxe = true; + return this; + } -public class RenderSword implements IItemRenderer -{ - private Minecraft mc; - private RenderItem itemRenderer; - private boolean isAxe = false; - - public RenderSword setAxe() - { - isAxe = true; - return this; - } - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) - { - boolean hasParried = false; - EntityLivingBase user = null; - if(data.length> 0 && data[1] instanceof EntityLivingBase) - { - user = ((EntityLivingBase)data[1]); + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + boolean hasParried = false; + EntityLivingBase user = null; + if (data.length > 0 && data[1] instanceof EntityLivingBase) { + user = ((EntityLivingBase) data[1]); + } + + ItemStack weapon = user.getHeldItem(); + + if (user instanceof EntityPlayer && weapon != null) { + hasParried = ItemWeaponMF.getParry(weapon) > 0 + && ResearchLogic.hasInfoUnlocked((EntityPlayer) user, "counteratt"); + } else if (!(user instanceof EntityPlayer) && weapon != null && weapon.getItem() instanceof IParryable) { + hasParried = user.hurtResistantTime > 0; + } + + GL11.glPushMatrix(); + + if (mc == null) { + mc = FMLClientHandler.instance().getClient(); + itemRenderer = new RenderItem(); } - - ItemStack weapon = user.getHeldItem(); - - if(user instanceof EntityPlayer && weapon != null) - { - hasParried = ItemWeaponMF.getParry(weapon) > 0 && ResearchLogic.hasInfoUnlocked((EntityPlayer)user, "counteratt"); - } - else if(!(user instanceof EntityPlayer) && weapon != null && weapon.getItem() instanceof IParryable) - { - hasParried = user.hurtResistantTime > 0; - } - - GL11.glPushMatrix(); - - if (mc == null) - { - mc = FMLClientHandler.instance().getClient(); - itemRenderer = new RenderItem(); - } - this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator tessellator = Tessellator.instance; - - if (type == ItemRenderType.EQUIPPED) - { - if(hasParried) - { - if(user instanceof EntityPlayer) - { - if(isAxe) - { - GL11.glRotatef(180, 1, 0, 0); - GL11.glRotatef(90, 0, 0, 1); - GL11.glTranslatef(-1F, -1F, 0); - } - else - { - GL11.glRotatef(-90, 0, 0, 1); - GL11.glTranslatef(-1F, 0.5F, 0); - } - } - else - { - GL11.glRotatef(-90, -1, 0, 0); - GL11.glTranslatef(0F, 0F, -0.25F); - } - } - for(int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer ++) - { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, - icon.getMaxU(), - icon.getMinV(), - icon.getMinU(), - icon.getMaxV(), - icon.getIconWidth(), - icon.getIconHeight(), 1F/16F); - } - if (item != null && item.hasEffect(0)) - { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - - } - else if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) - { - if(hasParried) - { - if(isAxe) - { - GL11.glRotatef(180, 1, 0, 0); - GL11.glRotatef(90, 0, 0, 1); - GL11.glTranslatef(-1F, -1F, 0); - } - else - { - GL11.glRotatef(-90, 0, 0, 1); - GL11.glTranslatef(-1F, 0.5F, 0); - } - } - for(int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer ++) - { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, - icon.getMaxU(), - icon.getMinV(), - icon.getMinU(), - icon.getMaxV(), - icon.getIconWidth(), - icon.getIconHeight(), 1F/16F); - } - - if (item != null && item.hasEffect(0)) { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - } - - GL11.glPopMatrix(); - } + this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + Tessellator tessellator = Tessellator.instance; + + if (type == ItemRenderType.EQUIPPED) { + if (hasParried) { + if (user instanceof EntityPlayer) { + if (isAxe) { + GL11.glRotatef(180, 1, 0, 0); + GL11.glRotatef(90, 0, 0, 1); + GL11.glTranslatef(-1F, -1F, 0); + } else { + GL11.glRotatef(-90, 0, 0, 1); + GL11.glTranslatef(-1F, 0.5F, 0); + } + } else { + GL11.glRotatef(-90, -1, 0, 0); + GL11.glTranslatef(0F, 0F, -0.25F); + } + } + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + + } else if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + if (hasParried) { + if (isAxe) { + GL11.glRotatef(180, 1, 0, 0); + GL11.glRotatef(90, 0, 0, 1); + GL11.glTranslatef(-1F, -1F, 0); + } else { + GL11.glRotatef(-90, 0, 0, 1); + GL11.glTranslatef(-1F, 0.5F, 0); + } + } + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + } + + GL11.glPopMatrix(); + } @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) - { + public boolean handleRenderType(ItemStack item, ItemRenderType type) { return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); } @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) - { - return false; - } + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java b/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java index 30214e61..9d09a32c 100644 --- a/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java +++ b/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java @@ -3,21 +3,19 @@ import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelRenderer; -public class ModelFullplate extends ModelBiped -{ +public class ModelFullplate extends ModelBiped { ModelRenderer rightPauldron; ModelRenderer leftPauldron; - - ModelRenderer armetridge; - ModelRenderer armetjaw; - ModelRenderer armetface; - - ModelRenderer bascinetRhorn; - ModelRenderer bascinetLhorn; - ModelRenderer bascinetface; - - public ModelFullplate(float f) - { + + ModelRenderer armetridge; + ModelRenderer armetjaw; + ModelRenderer armetface; + + ModelRenderer bascinetRhorn; + ModelRenderer bascinetLhorn; + ModelRenderer bascinetface; + + public ModelFullplate(float f) { super(f, 0F, 64, 64); rightPauldron = new ModelRenderer(this, 40, 32); @@ -25,7 +23,7 @@ public ModelFullplate(float f) rightPauldron.setTextureSize(64, 64); setRotation(rightPauldron, 0F, 0F, -0.418879F); - + leftPauldron = new ModelRenderer(this, 40, 32); leftPauldron.mirror = true; leftPauldron.addBox(-1.5F, -3.5F, -2.5F, 5, 5, 5, f); @@ -42,18 +40,17 @@ public ModelFullplate(float f) armetjaw.setRotationPoint(0F, 0F, 0F); setRotation(armetjaw, 0.3316126F, 0F, 0F); - armetface = new ModelRenderer(this, 20, 32); - armetface.addBox(-2.5F, -2.5F, -2.6F, 5, 4, 5); - armetface.setRotationPoint(0F, -1F, -5F); - setRotation(armetface, 0F, 0.7853982F, 0F); - - /* armetface = new ModelRenderer(this, 20, 32); armetface.addBox(-2.5F, -2.5F, -2.6F, 5, 4, 5); - armetface.setRotationPoint(0F, -0.5F, -4F); - setRotation(armetface, 0.2617994F, 0.7853982F, 0.2617994F); - */ - + armetface.setRotationPoint(0F, -1F, -5F); + setRotation(armetface, 0F, 0.7853982F, 0F); + + /* + * armetface = new ModelRenderer(this, 20, 32); armetface.addBox(-2.5F, -2.5F, + * -2.6F, 5, 4, 5); armetface.setRotationPoint(0F, -0.5F, -4F); + * setRotation(armetface, 0.2617994F, 0.7853982F, 0.2617994F); + */ + bascinetface = new ModelRenderer(this, 0, 54); bascinetface.addBox(-2.5F, -5F, -7F, 5, 4, 3); bascinetface.setRotationPoint(0F, 0F, 0F); @@ -72,20 +69,19 @@ public ModelFullplate(float f) this.bipedRightArm.addChild(rightPauldron); this.bipedLeftArm.addChild(leftPauldron); - + this.bipedHead.addChild(armetridge); this.bipedHead.addChild(armetjaw); this.bipedHead.addChild(armetface); - + this.bipedHead.addChild(bascinetface); this.bipedHead.addChild(bascinetLhorn); this.bipedHead.addChild(bascinetRhorn); - + this.bipedLeftLeg.showModel = this.bipedRightLeg.showModel = this.bipedEars.showModel = false; } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelAmmoBox.java b/src/main/java/minefantasy/mf2/client/render/block/ModelAmmoBox.java index a6be41db..4c511cfc 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelAmmoBox.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelAmmoBox.java @@ -8,95 +8,90 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelAmmoBox extends ModelBase -{ +public class ModelAmmoBox extends ModelBase { protected ModelRenderer LeftWall; protected ModelRenderer FrontWall; protected ModelRenderer BackWall; - protected ModelRenderer RightWall; + protected ModelRenderer RightWall; protected ModelRenderer lid; protected ModelRenderer Base; protected ModelRenderer lock2; protected ModelRenderer lock1; - - public ModelAmmoBox() - { - textureWidth = 64; - textureHeight = 32; - - LeftWall = new ModelRenderer(this, 34, 0); - LeftWall.addBox(-6F, -4F, -3F, 1, 5, 6); - LeftWall.setRotationPoint(0F, 0F, 0F); - LeftWall.setTextureSize(64, 32); - setRotation(LeftWall, 0F, 0F, 0F); - FrontWall = new ModelRenderer(this, 0, 7); - FrontWall.addBox(-6F, -4F, -4F, 12, 5, 1); - FrontWall.setRotationPoint(0F, 0F, 0F); - FrontWall.setTextureSize(64, 32); - setRotation(FrontWall, 0F, 0F, 0F); - BackWall = new ModelRenderer(this, 0, 7); - BackWall.addBox(-6F, -4F, 3F, 12, 5, 1); - BackWall.setRotationPoint(0F, 0F, 0F); - BackWall.setTextureSize(64, 32); - setRotation(BackWall, 0F, 0F, 0F); - RightWall = new ModelRenderer(this, 34, 0); - RightWall.addBox(5F, -4F, -3F, 1, 5, 6); - RightWall.setRotationPoint(0F, 0F, 0F); - RightWall.setTextureSize(64, 32); - - setRotation(RightWall, 0F, 0F, 0F); - lid = new ModelRenderer(this, 0, 13); - lid.addBox(-6F, -1F, -8F, 12, 1, 8); - lid.setRotationPoint(0F, -4F, 4F); - lid.setTextureSize(64, 32); - setRotation(lid, 0F, 0F, 0F); - Base = new ModelRenderer(this, 2, 0); - Base.addBox(-5F, 0F, -3F, 10, 1, 6); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - setRotation(Base, 0F, 0F, 0F); - lock2 = new ModelRenderer(this, 0, 0); - lock2.addBox(2F, -1.5F, -9.5F, 2, 3, 2); - lock2.setRotationPoint(0F, -4F, 5F); - lock2.setTextureSize(64, 32); - setRotation(lock2, 0F, 0F, 0F); - lock1 = new ModelRenderer(this, 0, 0); - lock1.addBox(-4F, -1.5F, -9.5F, 2, 3, 2); - lock1.setRotationPoint(0F, -4F, 5F); - lock1.setTextureSize(64, 32); - setRotation(lock1, 0F, 0F, 0F); - - RightWall.mirror = true; - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } - - protected void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - public void renderModel(float f) - { + public ModelAmmoBox() { + textureWidth = 64; + textureHeight = 32; + + LeftWall = new ModelRenderer(this, 34, 0); + LeftWall.addBox(-6F, -4F, -3F, 1, 5, 6); + LeftWall.setRotationPoint(0F, 0F, 0F); + LeftWall.setTextureSize(64, 32); + setRotation(LeftWall, 0F, 0F, 0F); + FrontWall = new ModelRenderer(this, 0, 7); + FrontWall.addBox(-6F, -4F, -4F, 12, 5, 1); + FrontWall.setRotationPoint(0F, 0F, 0F); + FrontWall.setTextureSize(64, 32); + setRotation(FrontWall, 0F, 0F, 0F); + BackWall = new ModelRenderer(this, 0, 7); + BackWall.addBox(-6F, -4F, 3F, 12, 5, 1); + BackWall.setRotationPoint(0F, 0F, 0F); + BackWall.setTextureSize(64, 32); + setRotation(BackWall, 0F, 0F, 0F); + RightWall = new ModelRenderer(this, 34, 0); + RightWall.addBox(5F, -4F, -3F, 1, 5, 6); + RightWall.setRotationPoint(0F, 0F, 0F); + RightWall.setTextureSize(64, 32); + + setRotation(RightWall, 0F, 0F, 0F); + lid = new ModelRenderer(this, 0, 13); + lid.addBox(-6F, -1F, -8F, 12, 1, 8); + lid.setRotationPoint(0F, -4F, 4F); + lid.setTextureSize(64, 32); + setRotation(lid, 0F, 0F, 0F); + Base = new ModelRenderer(this, 2, 0); + Base.addBox(-5F, 0F, -3F, 10, 1, 6); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + setRotation(Base, 0F, 0F, 0F); + lock2 = new ModelRenderer(this, 0, 0); + lock2.addBox(2F, -1.5F, -9.5F, 2, 3, 2); + lock2.setRotationPoint(0F, -4F, 5F); + lock2.setTextureSize(64, 32); + setRotation(lock2, 0F, 0F, 0F); + lock1 = new ModelRenderer(this, 0, 0); + lock1.addBox(-4F, -1.5F, -9.5F, 2, 3, 2); + lock1.setRotationPoint(0F, -4F, 5F); + lock1.setTextureSize(64, 32); + setRotation(lock1, 0F, 0F, 0F); + + RightWall.mirror = true; + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } + + protected void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderModel(float f) { LeftWall.render(f); RightWall.render(f); FrontWall.render(f); BackWall.render(f); - Base.render(f); + Base.render(f); } - public void renderLid(float f, float angle) - { - lock1.rotateAngleX = lock2.rotateAngleX = lid.rotateAngleX = -(float)Math.toRadians(angle); + + public void renderLid(float f, float angle) { + lock1.rotateAngleX = lock2.rotateAngleX = lid.rotateAngleX = -(float) Math.toRadians(angle); lid.render(f); lock1.render(f); lock2.render(f); diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelAnvil.java b/src/main/java/minefantasy/mf2/client/render/block/ModelAnvil.java index 9cdaa173..e106e32f 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelAnvil.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelAnvil.java @@ -8,95 +8,91 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelAnvil extends ModelBase { - //fields - ModelRenderer End; - ModelRenderer Post; - ModelRenderer Body; - ModelRenderer Tip; - ModelRenderer Back; - ModelRenderer floor; - ModelRenderer Base; - - public ModelAnvil() - { - textureWidth = 64; - textureHeight = 32; - - End = new ModelRenderer(this, 0, 24); - End.addBox(-10F, -3F, -2F, 3, 4, 4); - End.setRotationPoint(0F, -5F, 0F); - End.setTextureSize(64, 32); - End.mirror = true; - setRotation(End, 0F, 0F, 0F); - Post = new ModelRenderer(this, 48, 24); - Post.addBox(-2F, 0F, -2F, 4, 4, 4); - Post.setRotationPoint(0F, -4F, 0F); - Post.setTextureSize(64, 32); - Post.mirror = true; - setRotation(Post, 0F, 0F, 0F); - Body = new ModelRenderer(this, 32, 0); - Body.addBox(-5F, -3F, -3F, 10, 4, 6); - Body.setRotationPoint(0F, -5F, 0F); - Body.setTextureSize(64, 32); - Body.mirror = true; - setRotation(Body, 0F, 0F, 0F); - Tip = new ModelRenderer(this, 0, 10); - Tip.addBox(5F, -2F, -1F, 3, 2, 2); - Tip.setRotationPoint(0F, -5F, 0F); - Tip.setTextureSize(64, 32); - Tip.mirror = true; - setRotation(Tip, 0F, 0F, 0F); - Back = new ModelRenderer(this, 0, 19); - Back.addBox(-7F, -2F, -1F, 2, 3, 2); - Back.setRotationPoint(0F, -5F, 0F); - Back.setTextureSize(64, 32); - Back.mirror = true; - setRotation(Back, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-3F, 0F, -3F, 6, 2, 6); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - floor = new ModelRenderer(this, 14, 21); - floor.addBox(-4F, 2F, -4F, 8, 3, 8); - floor.setRotationPoint(0F, 0F, 0F); - floor.setTextureSize(64, 32); - floor.mirror = true; - } - - @Override -public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - End.render(f5); - Base.render(f5); - Post.render(f5); - Body.render(f5); - Tip.render(f5); - Back.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + // fields + ModelRenderer End; + ModelRenderer Post; + ModelRenderer Body; + ModelRenderer Tip; + ModelRenderer Back; + ModelRenderer floor; + ModelRenderer Base; - public void renderModel(float f) - { - End.render(f); - Base.render(f); - Post.render(f); - Body.render(f); - Tip.render(f); - Back.render(f); - floor.render(f); - } + public ModelAnvil() { + textureWidth = 64; + textureHeight = 32; + + End = new ModelRenderer(this, 0, 24); + End.addBox(-10F, -3F, -2F, 3, 4, 4); + End.setRotationPoint(0F, -5F, 0F); + End.setTextureSize(64, 32); + End.mirror = true; + setRotation(End, 0F, 0F, 0F); + Post = new ModelRenderer(this, 48, 24); + Post.addBox(-2F, 0F, -2F, 4, 4, 4); + Post.setRotationPoint(0F, -4F, 0F); + Post.setTextureSize(64, 32); + Post.mirror = true; + setRotation(Post, 0F, 0F, 0F); + Body = new ModelRenderer(this, 32, 0); + Body.addBox(-5F, -3F, -3F, 10, 4, 6); + Body.setRotationPoint(0F, -5F, 0F); + Body.setTextureSize(64, 32); + Body.mirror = true; + setRotation(Body, 0F, 0F, 0F); + Tip = new ModelRenderer(this, 0, 10); + Tip.addBox(5F, -2F, -1F, 3, 2, 2); + Tip.setRotationPoint(0F, -5F, 0F); + Tip.setTextureSize(64, 32); + Tip.mirror = true; + setRotation(Tip, 0F, 0F, 0F); + Back = new ModelRenderer(this, 0, 19); + Back.addBox(-7F, -2F, -1F, 2, 3, 2); + Back.setRotationPoint(0F, -5F, 0F); + Back.setTextureSize(64, 32); + Back.mirror = true; + setRotation(Back, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-3F, 0F, -3F, 6, 2, 6); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + floor = new ModelRenderer(this, 14, 21); + floor.addBox(-4F, 2F, -4F, 8, 3, 8); + floor.setRotationPoint(0F, 0F, 0F); + floor.setTextureSize(64, 32); + floor.mirror = true; + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + End.render(f5); + Base.render(f5); + Post.render(f5); + Body.render(f5); + Tip.render(f5); + Back.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderModel(float f) { + End.render(f); + Base.render(f); + Post.render(f); + Body.render(f); + Tip.render(f); + Back.render(f); + floor.render(f); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelBellows.java b/src/main/java/minefantasy/mf2/client/render/block/ModelBellows.java index ac772207..e6e2ea1d 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelBellows.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelBellows.java @@ -8,110 +8,105 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelBellows extends ModelBase -{ - //fields +public class ModelBellows extends ModelBase { + // fields ModelRenderer Flap4; - ModelRenderer Handle; - ModelRenderer Flap1; - ModelRenderer Flap2; - ModelRenderer Flap3; - ModelRenderer Base; - ModelRenderer Top; - - public ModelBellows() - { - textureWidth = 64; - textureHeight = 32; - - Flap4 = new ModelRenderer(this, 0, 23); - Flap4.addBox(0F, 0F, -4F, 10, 1, 8); - Flap4.setRotationPoint(-8F, 23F, 0F); - Flap4.setTextureSize(64, 32); - Flap4.mirror = true; - setRotation(Flap4, 0F, 0F, -0.418879F); - Handle = new ModelRenderer(this, 40, 0); - Handle.addBox(7F, -1F, -1F, 10, 2, 2); - Handle.setRotationPoint(-8F, 23F, 0F); - Handle.setTextureSize(64, 32); - Handle.mirror = true; - setRotation(Handle, 0F, 0F, -0.5235988F); - Flap1 = new ModelRenderer(this, 34, 23); - Flap1.addBox(0F, 0F, -3F, 9, 1, 6); - Flap1.setRotationPoint(-8F, 23F, 0F); - Flap1.setTextureSize(64, 32); - Flap1.mirror = true; - setRotation(Flap1, 0F, 0F, -0.1047198F); - Flap2 = new ModelRenderer(this, 0, 23); - Flap2.addBox(0F, 0F, -4F, 10, 1, 8); - Flap2.setRotationPoint(-8F, 23F, 0F); - Flap2.setTextureSize(64, 32); - Flap2.mirror = true; - setRotation(Flap2, 0F, 0F, -0.2094395F); - Flap3 = new ModelRenderer(this, 34, 23); - Flap3.addBox(0F, 0F, -3F, 9, 1, 6); - Flap3.setRotationPoint(-8F, 23F, 0F); - Flap3.setTextureSize(64, 32); - Flap3.mirror = true; - setRotation(Flap3, 0F, 0F, -0.3141593F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(0F, 0F, -5F, 11, 1, 10); - Base.setRotationPoint(-8F, 23F, 0F); - Base.setTextureSize(64, 32); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - Top = new ModelRenderer(this, 0, 14); - Top.addBox(0F, 0F, -4F, 11, 1, 8); - Top.setRotationPoint(-8F, 23F, 0F); - Top.setTextureSize(64, 32); - Top.mirror = true; - setRotation(Top, 0F, 0F, -0.5235988F); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - Flap4.render(f5); - Handle.render(f5); - Flap1.render(f5); - Flap2.render(f5); - Flap3.render(f5); - Base.render(f5); - Top.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + ModelRenderer Handle; + ModelRenderer Flap1; + ModelRenderer Flap2; + ModelRenderer Flap3; + ModelRenderer Base; + ModelRenderer Top; -public void renderModel(int press, float f) { - Flap4.render(f); - Handle.render(f); - Flap1.render(f); - Flap2.render(f); - Flap3.render(f); - Base.render(f); - Top.render(f); -} -public void rotate(int p) -{ - Top.rotateAngleZ = Handle.rotateAngleZ = -getRotationForPart(p,5); - Flap4.rotateAngleZ = -getRotationForPart(p,4); - Flap3.rotateAngleZ = -getRotationForPart(p,3); - Flap2.rotateAngleZ = -getRotationForPart(p,2); - Flap1.rotateAngleZ = -getRotationForPart(p,1); -} + public ModelBellows() { + textureWidth = 64; + textureHeight = 32; -public float getRotationForPart(int press, int part) -{ - float angle = (float)Math.toRadians(50-press); - return (angle/5) * part; -} + Flap4 = new ModelRenderer(this, 0, 23); + Flap4.addBox(0F, 0F, -4F, 10, 1, 8); + Flap4.setRotationPoint(-8F, 23F, 0F); + Flap4.setTextureSize(64, 32); + Flap4.mirror = true; + setRotation(Flap4, 0F, 0F, -0.418879F); + Handle = new ModelRenderer(this, 40, 0); + Handle.addBox(7F, -1F, -1F, 10, 2, 2); + Handle.setRotationPoint(-8F, 23F, 0F); + Handle.setTextureSize(64, 32); + Handle.mirror = true; + setRotation(Handle, 0F, 0F, -0.5235988F); + Flap1 = new ModelRenderer(this, 34, 23); + Flap1.addBox(0F, 0F, -3F, 9, 1, 6); + Flap1.setRotationPoint(-8F, 23F, 0F); + Flap1.setTextureSize(64, 32); + Flap1.mirror = true; + setRotation(Flap1, 0F, 0F, -0.1047198F); + Flap2 = new ModelRenderer(this, 0, 23); + Flap2.addBox(0F, 0F, -4F, 10, 1, 8); + Flap2.setRotationPoint(-8F, 23F, 0F); + Flap2.setTextureSize(64, 32); + Flap2.mirror = true; + setRotation(Flap2, 0F, 0F, -0.2094395F); + Flap3 = new ModelRenderer(this, 34, 23); + Flap3.addBox(0F, 0F, -3F, 9, 1, 6); + Flap3.setRotationPoint(-8F, 23F, 0F); + Flap3.setTextureSize(64, 32); + Flap3.mirror = true; + setRotation(Flap3, 0F, 0F, -0.3141593F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(0F, 0F, -5F, 11, 1, 10); + Base.setRotationPoint(-8F, 23F, 0F); + Base.setTextureSize(64, 32); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + Top = new ModelRenderer(this, 0, 14); + Top.addBox(0F, 0F, -4F, 11, 1, 8); + Top.setRotationPoint(-8F, 23F, 0F); + Top.setTextureSize(64, 32); + Top.mirror = true; + setRotation(Top, 0F, 0F, -0.5235988F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + Flap4.render(f5); + Handle.render(f5); + Flap1.render(f5); + Flap2.render(f5); + Flap3.render(f5); + Base.render(f5); + Top.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderModel(int press, float f) { + Flap4.render(f); + Handle.render(f); + Flap1.render(f); + Flap2.render(f); + Flap3.render(f); + Base.render(f); + Top.render(f); + } + + public void rotate(int p) { + Top.rotateAngleZ = Handle.rotateAngleZ = -getRotationForPart(p, 5); + Flap4.rotateAngleZ = -getRotationForPart(p, 4); + Flap3.rotateAngleZ = -getRotationForPart(p, 3); + Flap2.rotateAngleZ = -getRotationForPart(p, 2); + Flap1.rotateAngleZ = -getRotationForPart(p, 1); + } + + public float getRotationForPart(int press, int part) { + float angle = (float) Math.toRadians(50 - press); + return (angle / 5) * part; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelBigFurnace.java b/src/main/java/minefantasy/mf2/client/render/block/ModelBigFurnace.java index 49dac42b..6150edef 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelBigFurnace.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelBigFurnace.java @@ -4,114 +4,108 @@ import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; -public class ModelBigFurnace extends ModelBase -{ +public class ModelBigFurnace extends ModelBase { ModelRenderer Wall4t; - ModelRenderer Wall1; - ModelRenderer Wall2; - ModelRenderer Top; - ModelRenderer Wall3; - ModelRenderer Wall4; - ModelRenderer lava; - ModelRenderer Base; - ModelRenderer contents; - - public ModelBigFurnace() - { - textureWidth = 128; - textureHeight = 64; - - Wall4t = new ModelRenderer(this, 76, 50); - Wall1 = new ModelRenderer(this, 0, 27); - Wall2 = new ModelRenderer(this, 0, 27); - Top = new ModelRenderer(this, 0, 0); - Wall3 = new ModelRenderer(this, 48, 50); - Wall4 = new ModelRenderer(this, 76, 60); - lava = new ModelRenderer(this, 26, 27); - Base = new ModelRenderer(this, 0, 0); - contents = new ModelRenderer(this, 0, 41); - - Wall4t.addBox(-6F, -12F, -8F, 12, 3, 2); - Wall4t.setRotationPoint(0F, 0F, 0F); - Wall4t.setTextureSize(128, 64); - Wall4t.mirror = true; - setRotation(Wall4t, 0F, 1.570796F, 0F); - - Wall1.addBox(-8F, -12F, 6F, 16, 12, 2); - Wall1.setRotationPoint(0F, 0F, 0F); - Wall1.setTextureSize(128, 64); - Wall1.mirror = true; - setRotation(Wall1, 0F, 3.141593F, 0F); - - Wall2.addBox(-8F, -12F, 6F, 16, 12, 2); - Wall2.setRotationPoint(0F, 0F, 0F); - Wall2.setTextureSize(128, 64); - Wall2.mirror = true; - setRotation(Wall2, 0F, 0F, 0F); - - Top.addBox(-8F, -14F, -8F, 16, 2, 16); - Top.setRotationPoint(0F, 0F, 0F); - Top.setTextureSize(128, 64); - Top.mirror = true; - setRotation(Top, 0F, 0F, 0F); - - Wall3.addBox(-6F, -12F, 6F, 12, 12, 2); - Wall3.setRotationPoint(0F, 0F, 0F); - Wall3.setTextureSize(128, 64); - Wall3.mirror = true; - setRotation(Wall3, 0F, 1.570796F, 0F); - - Wall4.addBox(-6F, -2F, -8F, 12, 2, 2); - Wall4.setRotationPoint(0F, 0F, 0F); - Wall4.setTextureSize(128, 64); - Wall4.mirror = true; - setRotation(Wall4, 0F, 1.570796F, 0F); - - lava.addBox(-5F, -2F, -5F, 10, 0, 10); - lava.setRotationPoint(0F, 0F, 0F); - lava.setTextureSize(128, 64); - lava.mirror = true; - setRotation(lava, 0F, 0F, 0F); - - Base.addBox(-8F, -2F, -8F, 16, 2, 16); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(128, 64); - Base.mirror = true; - setRotation(Base, 3.141593F, 0F, 0F); - - contents.addBox(-6F, -1F, -6F, 12, 1, 12); - contents.setRotationPoint(0F, 0F, 0F); - contents.setTextureSize(128, 64); - contents.mirror = true; - setRotation(contents, 0F, 0F, 0F); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - renderModel(false, f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - public void renderModel(boolean lit, float f) - { - if(lit) - { - lava.render(f); - } - Top.render(f); - contents.render(f); - Base.render(f); - Wall4t.render(f); - Wall1.render(f); - Wall2.render(f); - Wall3.render(f); - Wall4.render(f); - } + ModelRenderer Wall1; + ModelRenderer Wall2; + ModelRenderer Top; + ModelRenderer Wall3; + ModelRenderer Wall4; + ModelRenderer lava; + ModelRenderer Base; + ModelRenderer contents; + + public ModelBigFurnace() { + textureWidth = 128; + textureHeight = 64; + + Wall4t = new ModelRenderer(this, 76, 50); + Wall1 = new ModelRenderer(this, 0, 27); + Wall2 = new ModelRenderer(this, 0, 27); + Top = new ModelRenderer(this, 0, 0); + Wall3 = new ModelRenderer(this, 48, 50); + Wall4 = new ModelRenderer(this, 76, 60); + lava = new ModelRenderer(this, 26, 27); + Base = new ModelRenderer(this, 0, 0); + contents = new ModelRenderer(this, 0, 41); + + Wall4t.addBox(-6F, -12F, -8F, 12, 3, 2); + Wall4t.setRotationPoint(0F, 0F, 0F); + Wall4t.setTextureSize(128, 64); + Wall4t.mirror = true; + setRotation(Wall4t, 0F, 1.570796F, 0F); + + Wall1.addBox(-8F, -12F, 6F, 16, 12, 2); + Wall1.setRotationPoint(0F, 0F, 0F); + Wall1.setTextureSize(128, 64); + Wall1.mirror = true; + setRotation(Wall1, 0F, 3.141593F, 0F); + + Wall2.addBox(-8F, -12F, 6F, 16, 12, 2); + Wall2.setRotationPoint(0F, 0F, 0F); + Wall2.setTextureSize(128, 64); + Wall2.mirror = true; + setRotation(Wall2, 0F, 0F, 0F); + + Top.addBox(-8F, -14F, -8F, 16, 2, 16); + Top.setRotationPoint(0F, 0F, 0F); + Top.setTextureSize(128, 64); + Top.mirror = true; + setRotation(Top, 0F, 0F, 0F); + + Wall3.addBox(-6F, -12F, 6F, 12, 12, 2); + Wall3.setRotationPoint(0F, 0F, 0F); + Wall3.setTextureSize(128, 64); + Wall3.mirror = true; + setRotation(Wall3, 0F, 1.570796F, 0F); + + Wall4.addBox(-6F, -2F, -8F, 12, 2, 2); + Wall4.setRotationPoint(0F, 0F, 0F); + Wall4.setTextureSize(128, 64); + Wall4.mirror = true; + setRotation(Wall4, 0F, 1.570796F, 0F); + + lava.addBox(-5F, -2F, -5F, 10, 0, 10); + lava.setRotationPoint(0F, 0F, 0F); + lava.setTextureSize(128, 64); + lava.mirror = true; + setRotation(lava, 0F, 0F, 0F); + + Base.addBox(-8F, -2F, -8F, 16, 2, 16); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(128, 64); + Base.mirror = true; + setRotation(Base, 3.141593F, 0F, 0F); + + contents.addBox(-6F, -1F, -6F, 12, 1, 12); + contents.setRotationPoint(0F, 0F, 0F); + contents.setTextureSize(128, 64); + contents.mirror = true; + setRotation(contents, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + renderModel(false, f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderModel(boolean lit, float f) { + if (lit) { + lava.render(f); + } + Top.render(f); + contents.render(f); + Base.render(f); + Wall4t.render(f); + Wall1.render(f); + Wall2.render(f); + Wall3.render(f); + Wall4.render(f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelBloomery.java b/src/main/java/minefantasy/mf2/client/render/block/ModelBloomery.java index 191eafaf..b39d5f15 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelBloomery.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelBloomery.java @@ -9,67 +9,60 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelBloomery extends ModelBase -{ - //fields +public class ModelBloomery extends ModelBase { + // fields ModelRenderer top; - ModelRenderer base; - ModelRenderer neck; - ModelRenderer body; - ModelRenderer bloom; - - public ModelBloomery() - { - textureWidth = 128; - textureHeight = 64; - - top = new ModelRenderer(this, 84, 43); - top.addBox(-5.5F, 0F, -5.5F, 11, 2, 11); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(128, 64); - - base = new ModelRenderer(this, 0, 0); - base.addBox(-9F, 14F, -9F, 18, 2, 18); - base.setRotationPoint(0F, 0F, 0F); - base.setTextureSize(128, 64); - - neck = new ModelRenderer(this, 0, 46); - neck.addBox(-7F, 2F, -7F, 14, 3, 14); - neck.setRotationPoint(0F, 0F, 0F); - neck.setTextureSize(128, 64); - - body = new ModelRenderer(this, 64, 11); - body.addBox(-8F, 5F, -8F, 16, 9, 16); - body.setRotationPoint(0F, 0F, 0F); - body.setTextureSize(128, 64); - - bloom = new ModelRenderer(this, 0, 20); - bloom.addBox(-4F, -4F, -4F, 8, 8, 8); - bloom.setRotationPoint(0F, 6F, 0F); - bloom.setTextureSize(128, 64); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - } - - public void renderModel(TileEntityBloomery bloomery, float f) - { - base.render(f); - body.render(f); - - if(bloomery != null && bloomery.hasBloom) - { - bloom.render(f); - } - else - { - neck.render(f); - top.render(f); - } - } + ModelRenderer base; + ModelRenderer neck; + ModelRenderer body; + ModelRenderer bloom; + + public ModelBloomery() { + textureWidth = 128; + textureHeight = 64; + + top = new ModelRenderer(this, 84, 43); + top.addBox(-5.5F, 0F, -5.5F, 11, 2, 11); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(128, 64); + + base = new ModelRenderer(this, 0, 0); + base.addBox(-9F, 14F, -9F, 18, 2, 18); + base.setRotationPoint(0F, 0F, 0F); + base.setTextureSize(128, 64); + + neck = new ModelRenderer(this, 0, 46); + neck.addBox(-7F, 2F, -7F, 14, 3, 14); + neck.setRotationPoint(0F, 0F, 0F); + neck.setTextureSize(128, 64); + + body = new ModelRenderer(this, 64, 11); + body.addBox(-8F, 5F, -8F, 16, 9, 16); + body.setRotationPoint(0F, 0F, 0F); + body.setTextureSize(128, 64); + + bloom = new ModelRenderer(this, 0, 20); + bloom.addBox(-4F, -4F, -4F, 8, 8, 8); + bloom.setRotationPoint(0F, 6F, 0F); + bloom.setTextureSize(128, 64); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + } + + public void renderModel(TileEntityBloomery bloomery, float f) { + base.render(f); + body.render(f); + + if (bloomery != null && bloomery.hasBloom) { + bloom.render(f); + } else { + neck.render(f); + top.render(f); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelBombBench.java b/src/main/java/minefantasy/mf2/client/render/block/ModelBombBench.java index 07462de7..b90e0458 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelBombBench.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelBombBench.java @@ -8,124 +8,119 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelBombBench extends ModelBase -{ - //fields +public class ModelBombBench extends ModelBase { + // fields ModelRenderer top; - ModelRenderer FRleg; - ModelRenderer bottom; - ModelRenderer BRleg; - ModelRenderer BLleg; - ModelRenderer FLleg; - ModelRenderer box; - ModelRenderer casing; - ModelRenderer powder; - ModelRenderer bomb; - ModelRenderer fuse; - - public ModelBombBench() - { - textureWidth = 64; - textureHeight = 64; - - top = new ModelRenderer(this, 0, 0); - top.addBox(-8F, 4F, -8F, 16, 4, 16); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 64); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - FRleg = new ModelRenderer(this, 0, 35); - FRleg.addBox(3F, 8F, -7F, 4, 12, 4); - FRleg.setRotationPoint(0F, 0F, 0F); - FRleg.setTextureSize(64, 64); - FRleg.mirror = true; - setRotation(FRleg, 0F, 0F, 0F); - bottom = new ModelRenderer(this, 0, 20); - bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); - bottom.setRotationPoint(0F, 0F, 0F); - bottom.setTextureSize(64, 64); - bottom.mirror = true; - setRotation(bottom, 0F, 0F, 0F); - BRleg = new ModelRenderer(this, 0, 35); - BRleg.addBox(3F, 8F, 3F, 4, 12, 4); - BRleg.setRotationPoint(0F, 0F, 0F); - BRleg.setTextureSize(64, 64); - BRleg.mirror = true; - setRotation(BRleg, 0F, 0F, 0F); - BLleg = new ModelRenderer(this, 0, 35); - BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); - BLleg.setRotationPoint(0F, 0F, 0F); - BLleg.setTextureSize(64, 64); - BLleg.mirror = true; - setRotation(BLleg, 0F, 0F, 0F); - FLleg = new ModelRenderer(this, 0, 35); - FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); - FLleg.setRotationPoint(0F, 0F, 0F); - FLleg.setTextureSize(64, 64); - FLleg.mirror = true; - setRotation(FLleg, 0F, 0F, 0F); - box = new ModelRenderer(this, 0, 51); - box.addBox(-3F, -1F, -2F, 6, 3, 4); - box.setRotationPoint(0F, 12F, 0F); - box.setTextureSize(64, 64); - box.mirror = true; - setRotation(box, 0F, 0.1396263F, 0F); - casing = new ModelRenderer(this, 0, 20); - casing.addBox(-1F, -1F, -1F, 3, 2, 3); - casing.setRotationPoint(-2F, 3F, -5F); - casing.setTextureSize(64, 64); - casing.mirror = true; - setRotation(casing, 0F, -0.418879F, 0F); - powder = new ModelRenderer(this, 0, 0); - powder.addBox(-2F, -2F, -2F, 4, 4, 4); - powder.setRotationPoint(-2F, 4.5F, 0F); - powder.setTextureSize(64, 64); - powder.mirror = true; - setRotation(powder, 0.7853982F, 0.7853982F, 0.6632251F); - bomb = new ModelRenderer(this, 0, 8); - bomb.addBox(-1F, -1F, -1F, 3, 3, 3); - bomb.setRotationPoint(2F, 2F, -1F); - bomb.setTextureSize(64, 64); - bomb.mirror = true; - setRotation(bomb, 0F, 0.1396263F, 0F); - fuse = new ModelRenderer(this, 6, 2); - fuse.addBox(1F, -2F, 0F, 2, 3, 1); - fuse.setRotationPoint(2F, 2F, -1F); - fuse.setTextureSize(64, 64); - fuse.mirror = true; - setRotation(fuse, 0F, 0.1396263F, 0F); - } - - @Override -public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + ModelRenderer FRleg; + ModelRenderer bottom; + ModelRenderer BRleg; + ModelRenderer BLleg; + ModelRenderer FLleg; + ModelRenderer box; + ModelRenderer casing; + ModelRenderer powder; + ModelRenderer bomb; + ModelRenderer fuse; - public void renderModel(float f) - { - top.render(f); - FRleg.render(f); - bottom.render(f); - BRleg.render(f); - BLleg.render(f); - FLleg.render(f); - box.render(f); - casing.render(f); - powder.render(f); - bomb.render(f); - fuse.render(f); - } + public ModelBombBench() { + textureWidth = 64; + textureHeight = 64; + + top = new ModelRenderer(this, 0, 0); + top.addBox(-8F, 4F, -8F, 16, 4, 16); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 64); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + FRleg = new ModelRenderer(this, 0, 35); + FRleg.addBox(3F, 8F, -7F, 4, 12, 4); + FRleg.setRotationPoint(0F, 0F, 0F); + FRleg.setTextureSize(64, 64); + FRleg.mirror = true; + setRotation(FRleg, 0F, 0F, 0F); + bottom = new ModelRenderer(this, 0, 20); + bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); + bottom.setRotationPoint(0F, 0F, 0F); + bottom.setTextureSize(64, 64); + bottom.mirror = true; + setRotation(bottom, 0F, 0F, 0F); + BRleg = new ModelRenderer(this, 0, 35); + BRleg.addBox(3F, 8F, 3F, 4, 12, 4); + BRleg.setRotationPoint(0F, 0F, 0F); + BRleg.setTextureSize(64, 64); + BRleg.mirror = true; + setRotation(BRleg, 0F, 0F, 0F); + BLleg = new ModelRenderer(this, 0, 35); + BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); + BLleg.setRotationPoint(0F, 0F, 0F); + BLleg.setTextureSize(64, 64); + BLleg.mirror = true; + setRotation(BLleg, 0F, 0F, 0F); + FLleg = new ModelRenderer(this, 0, 35); + FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); + FLleg.setRotationPoint(0F, 0F, 0F); + FLleg.setTextureSize(64, 64); + FLleg.mirror = true; + setRotation(FLleg, 0F, 0F, 0F); + box = new ModelRenderer(this, 0, 51); + box.addBox(-3F, -1F, -2F, 6, 3, 4); + box.setRotationPoint(0F, 12F, 0F); + box.setTextureSize(64, 64); + box.mirror = true; + setRotation(box, 0F, 0.1396263F, 0F); + casing = new ModelRenderer(this, 0, 20); + casing.addBox(-1F, -1F, -1F, 3, 2, 3); + casing.setRotationPoint(-2F, 3F, -5F); + casing.setTextureSize(64, 64); + casing.mirror = true; + setRotation(casing, 0F, -0.418879F, 0F); + powder = new ModelRenderer(this, 0, 0); + powder.addBox(-2F, -2F, -2F, 4, 4, 4); + powder.setRotationPoint(-2F, 4.5F, 0F); + powder.setTextureSize(64, 64); + powder.mirror = true; + setRotation(powder, 0.7853982F, 0.7853982F, 0.6632251F); + bomb = new ModelRenderer(this, 0, 8); + bomb.addBox(-1F, -1F, -1F, 3, 3, 3); + bomb.setRotationPoint(2F, 2F, -1F); + bomb.setTextureSize(64, 64); + bomb.mirror = true; + setRotation(bomb, 0F, 0.1396263F, 0F); + fuse = new ModelRenderer(this, 6, 2); + fuse.addBox(1F, -2F, 0F, 2, 3, 1); + fuse.setRotationPoint(2F, 2F, -1F); + fuse.setTextureSize(64, 64); + fuse.mirror = true; + setRotation(fuse, 0F, 0.1396263F, 0F); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderModel(float f) { + top.render(f); + FRleg.render(f); + bottom.render(f); + BRleg.render(f); + BLleg.render(f); + FLleg.render(f); + box.render(f); + casing.render(f); + powder.render(f); + bomb.render(f); + fuse.render(f); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelBombPress.java b/src/main/java/minefantasy/mf2/client/render/block/ModelBombPress.java index 55b0ffd0..25969840 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelBombPress.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelBombPress.java @@ -8,108 +8,104 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelBombPress extends ModelBase -{ +public class ModelBombPress extends ModelBase { ModelRenderer frame3; - ModelRenderer socket; - ModelRenderer frame2; - ModelRenderer Leg2; - ModelRenderer frame4; - ModelRenderer handle; - ModelRenderer frame1; - ModelRenderer body; - ModelRenderer Leg1; - ModelRenderer Lever; - - public ModelBombPress() - { - textureWidth = 64; - textureHeight = 32; - - frame4 = new ModelRenderer(this, 0, 0); - frame4.addBox(-8F, 2F, 7F, 16, 2, 1); - frame4.setRotationPoint(0F, 0F, 0F); - frame4.setTextureSize(64, 32); - setRotation(frame4, 0F, 1.570796F, 0F); - socket = new ModelRenderer(this, 0, 21); - socket.addBox(-1F, 5F, -1F, 2, 3, 2); - socket.setRotationPoint(0F, 0F, 0F); - socket.setTextureSize(64, 32); - setRotation(socket, 0F, 0F, 0F); - frame2 = new ModelRenderer(this, 0, 0); - frame2.addBox(-8F, 0F, -6F, 16, 2, 1); - frame2.setRotationPoint(0F, 0F, 0F); - frame2.setTextureSize(64, 32); - setRotation(frame2, 0F, 0F, 0F); - Leg2 = new ModelRenderer(this, 0, 3); - Leg2.addBox(-7F, 2F, 3F, 3, 14, 4); - Leg2.setRotationPoint(0F, 0F, 0F); - Leg2.setTextureSize(64, 32); - setRotation(Leg2, 0F, 0F, 0F); - frame3 = new ModelRenderer(this, 0, 0); - frame3.addBox(-8F, 2F, -8F, 16, 2, 1); - frame3.setRotationPoint(0F, 0F, 0F); - frame3.setTextureSize(64, 32); - setRotation(frame3, 0F, 1.570796F, 0F); - handle = new ModelRenderer(this, 32, 16); - handle.addBox(-0.5F, 9.5F, -1.5F, 2, 3, 2); - handle.setRotationPoint(7F, 3F, 6F); - handle.setTextureSize(64, 32); - setRotation(handle, -1.308997F, 0F, 0F); - frame1 = new ModelRenderer(this, 0, 0); - frame1.addBox(-8F, 0F, 5F, 16, 2, 1); - frame1.setRotationPoint(0F, 0F, 0F); - frame1.setTextureSize(64, 32); - setRotation(frame1, 0F, 0F, 0F); - body = new ModelRenderer(this, 14, 3); - body.addBox(-2F, -5F, -5F, 4, 10, 5); - body.setRotationPoint(0F, 0F, 0F); - body.setTextureSize(64, 32); - setRotation(body, 1.570796F, 0F, 0F); - Leg1 = new ModelRenderer(this, 0, 3); - Leg1.addBox(4F, 2F, 3F, 3, 14, 4); - Leg1.setRotationPoint(0F, 0F, 0F); - Leg1.setTextureSize(64, 32); - setRotation(Leg1, 0F, 0F, 0F); - Leg1.mirror = false; - Lever = new ModelRenderer(this, 32, 3); - Lever.addBox(0F, 0F, -1F, 1, 12, 1); - Lever.setRotationPoint(7F, 3F, 6F); - Lever.setTextureSize(64, 32); - setRotation(Lever, -1.308997F, 0F, 0F); - } - - @Override -public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5, 0F); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + ModelRenderer socket; + ModelRenderer frame2; + ModelRenderer Leg2; + ModelRenderer frame4; + ModelRenderer handle; + ModelRenderer frame1; + ModelRenderer body; + ModelRenderer Leg1; + ModelRenderer Lever; - public void renderModel(float f, float f2) - { - Lever.rotateAngleX = handle.rotateAngleX = -0.75F + (0.55F*f2); - frame1.rotationPointY = frame2.rotationPointY = frame3.rotationPointY = frame4.rotationPointY = socket.rotationPointY = body.rotationPointY = (12F*f2); - frame3.render(f); - socket.render(f); - frame2.render(f); - Leg2.render(f); - frame4.render(f); - handle.render(f); - frame1.render(f); - body.render(f); - Leg1.render(f); - Lever.render(f); - } + public ModelBombPress() { + textureWidth = 64; + textureHeight = 32; + + frame4 = new ModelRenderer(this, 0, 0); + frame4.addBox(-8F, 2F, 7F, 16, 2, 1); + frame4.setRotationPoint(0F, 0F, 0F); + frame4.setTextureSize(64, 32); + setRotation(frame4, 0F, 1.570796F, 0F); + socket = new ModelRenderer(this, 0, 21); + socket.addBox(-1F, 5F, -1F, 2, 3, 2); + socket.setRotationPoint(0F, 0F, 0F); + socket.setTextureSize(64, 32); + setRotation(socket, 0F, 0F, 0F); + frame2 = new ModelRenderer(this, 0, 0); + frame2.addBox(-8F, 0F, -6F, 16, 2, 1); + frame2.setRotationPoint(0F, 0F, 0F); + frame2.setTextureSize(64, 32); + setRotation(frame2, 0F, 0F, 0F); + Leg2 = new ModelRenderer(this, 0, 3); + Leg2.addBox(-7F, 2F, 3F, 3, 14, 4); + Leg2.setRotationPoint(0F, 0F, 0F); + Leg2.setTextureSize(64, 32); + setRotation(Leg2, 0F, 0F, 0F); + frame3 = new ModelRenderer(this, 0, 0); + frame3.addBox(-8F, 2F, -8F, 16, 2, 1); + frame3.setRotationPoint(0F, 0F, 0F); + frame3.setTextureSize(64, 32); + setRotation(frame3, 0F, 1.570796F, 0F); + handle = new ModelRenderer(this, 32, 16); + handle.addBox(-0.5F, 9.5F, -1.5F, 2, 3, 2); + handle.setRotationPoint(7F, 3F, 6F); + handle.setTextureSize(64, 32); + setRotation(handle, -1.308997F, 0F, 0F); + frame1 = new ModelRenderer(this, 0, 0); + frame1.addBox(-8F, 0F, 5F, 16, 2, 1); + frame1.setRotationPoint(0F, 0F, 0F); + frame1.setTextureSize(64, 32); + setRotation(frame1, 0F, 0F, 0F); + body = new ModelRenderer(this, 14, 3); + body.addBox(-2F, -5F, -5F, 4, 10, 5); + body.setRotationPoint(0F, 0F, 0F); + body.setTextureSize(64, 32); + setRotation(body, 1.570796F, 0F, 0F); + Leg1 = new ModelRenderer(this, 0, 3); + Leg1.addBox(4F, 2F, 3F, 3, 14, 4); + Leg1.setRotationPoint(0F, 0F, 0F); + Leg1.setTextureSize(64, 32); + setRotation(Leg1, 0F, 0F, 0F); + Leg1.mirror = false; + Lever = new ModelRenderer(this, 32, 3); + Lever.addBox(0F, 0F, -1F, 1, 12, 1); + Lever.setRotationPoint(7F, 3F, 6F); + Lever.setTextureSize(64, 32); + setRotation(Lever, -1.308997F, 0F, 0F); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5, 0F); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderModel(float f, float f2) { + Lever.rotateAngleX = handle.rotateAngleX = -0.75F + (0.55F * f2); + frame1.rotationPointY = frame2.rotationPointY = frame3.rotationPointY = frame4.rotationPointY = socket.rotationPointY = body.rotationPointY = (12F + * f2); + frame3.render(f); + socket.render(f); + frame2.render(f); + Leg2.render(f); + frame4.render(f); + handle.render(f); + frame1.render(f); + body.render(f); + Leg1.render(f); + Lever.render(f); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelCarpenter.java b/src/main/java/minefantasy/mf2/client/render/block/ModelCarpenter.java index 393f39a0..563fafe7 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelCarpenter.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelCarpenter.java @@ -8,89 +8,84 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelCarpenter extends ModelBase -{ - //fields +public class ModelCarpenter extends ModelBase { + // fields ModelRenderer leg4; - ModelRenderer top; - ModelRenderer bottom; - ModelRenderer leg3; - ModelRenderer leg1; - ModelRenderer leg2; - - public ModelCarpenter() - { - textureWidth = 64; - textureHeight = 64; - - leg4 = new ModelRenderer(this, 0, 35); - leg4.addBox(3F, 4F, 3F, 4, 12, 4); - leg4.setRotationPoint(0F, 0F, 0F); - leg4.setTextureSize(64, 64); - leg4.mirror = true; - setRotation(leg4, 0F, 0F, 0F); - top = new ModelRenderer(this, 0, 0); - top.addBox(-8F, 0F, -8F, 16, 4, 16); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 64); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - bottom = new ModelRenderer(this, 0, 20); - bottom.addBox(-6.5F, 11F, -6.5F, 13, 2, 13); - bottom.setRotationPoint(0F, 0F, 0F); - bottom.setTextureSize(64, 64); - bottom.mirror = true; - setRotation(bottom, 0F, 0F, 0F); - leg3 = new ModelRenderer(this, 0, 35); - leg3.addBox(-7F, 4F, 3F, 4, 12, 4); - leg3.setRotationPoint(0F, 0F, 0F); - leg3.setTextureSize(64, 64); - leg3.mirror = true; - setRotation(leg3, 0F, 0F, 0F); - leg1 = new ModelRenderer(this, 0, 35); - leg1.addBox(-7F, 4F, -7F, 4, 12, 4); - leg1.setRotationPoint(0F, 0F, 0F); - leg1.setTextureSize(64, 64); - leg1.mirror = true; - setRotation(leg1, 0F, 0F, 0F); - leg2 = new ModelRenderer(this, 0, 35); - leg2.addBox(3F, 4F, -7F, 4, 12, 4); - leg2.setRotationPoint(0F, 0F, 0F); - leg2.setTextureSize(64, 64); - leg2.mirror = true; - setRotation(leg2, 0F, 0F, 0F); - } - - @Override -public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - top.render(f5); - bottom.render(f5); - leg1.render(f5); - leg2.render(f5); - leg3.render(f5); - leg4.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + ModelRenderer top; + ModelRenderer bottom; + ModelRenderer leg3; + ModelRenderer leg1; + ModelRenderer leg2; - public void renderModel(float f) - { - top.render(f); - bottom.render(f); - leg1.render(f); - leg2.render(f); - leg3.render(f); - leg4.render(f); - } + public ModelCarpenter() { + textureWidth = 64; + textureHeight = 64; + + leg4 = new ModelRenderer(this, 0, 35); + leg4.addBox(3F, 4F, 3F, 4, 12, 4); + leg4.setRotationPoint(0F, 0F, 0F); + leg4.setTextureSize(64, 64); + leg4.mirror = true; + setRotation(leg4, 0F, 0F, 0F); + top = new ModelRenderer(this, 0, 0); + top.addBox(-8F, 0F, -8F, 16, 4, 16); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 64); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + bottom = new ModelRenderer(this, 0, 20); + bottom.addBox(-6.5F, 11F, -6.5F, 13, 2, 13); + bottom.setRotationPoint(0F, 0F, 0F); + bottom.setTextureSize(64, 64); + bottom.mirror = true; + setRotation(bottom, 0F, 0F, 0F); + leg3 = new ModelRenderer(this, 0, 35); + leg3.addBox(-7F, 4F, 3F, 4, 12, 4); + leg3.setRotationPoint(0F, 0F, 0F); + leg3.setTextureSize(64, 64); + leg3.mirror = true; + setRotation(leg3, 0F, 0F, 0F); + leg1 = new ModelRenderer(this, 0, 35); + leg1.addBox(-7F, 4F, -7F, 4, 12, 4); + leg1.setRotationPoint(0F, 0F, 0F); + leg1.setTextureSize(64, 64); + leg1.mirror = true; + setRotation(leg1, 0F, 0F, 0F); + leg2 = new ModelRenderer(this, 0, 35); + leg2.addBox(3F, 4F, -7F, 4, 12, 4); + leg2.setRotationPoint(0F, 0F, 0F); + leg2.setTextureSize(64, 64); + leg2.mirror = true; + setRotation(leg2, 0F, 0F, 0F); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + top.render(f5); + bottom.render(f5); + leg1.render(f5); + leg2.render(f5); + leg3.render(f5); + leg4.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderModel(float f) { + top.render(f); + bottom.render(f); + leg1.render(f); + leg2.render(f); + leg3.render(f); + leg4.render(f); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelCrossbowBench.java b/src/main/java/minefantasy/mf2/client/render/block/ModelCrossbowBench.java index 39443eff..c85705fb 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelCrossbowBench.java @@ -8,120 +8,116 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelCrossbowBench extends ModelBase -{ - //fields +public class ModelCrossbowBench extends ModelBase { + // fields ModelRenderer top; - ModelRenderer FRleg; - ModelRenderer bottom; - ModelRenderer BRleg; - ModelRenderer BLleg; - ModelRenderer FLleg; - ModelRenderer shaft; - ModelRenderer stock; - ModelRenderer arms; - ModelRenderer chest; - - public ModelCrossbowBench() - { - textureWidth = 64; - textureHeight = 64; - - top = new ModelRenderer(this, 0, 0); - top.addBox(-8F, 4F, -8F, 16, 4, 16); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 64); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - FRleg = new ModelRenderer(this, 0, 35); - FRleg.addBox(3F, 8F, -7F, 4, 12, 4); - FRleg.setRotationPoint(0F, 0F, 0F); - FRleg.setTextureSize(64, 64); - FRleg.mirror = true; - setRotation(FRleg, 0F, 0F, 0F); - bottom = new ModelRenderer(this, 0, 20); - bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); - bottom.setRotationPoint(0F, 0F, 0F); - bottom.setTextureSize(64, 64); - bottom.mirror = true; - setRotation(bottom, 0F, 0F, 0F); - BRleg = new ModelRenderer(this, 0, 35); - BRleg.addBox(3F, 8F, 3F, 4, 12, 4); - BRleg.setRotationPoint(0F, 0F, 0F); - BRleg.setTextureSize(64, 64); - BRleg.mirror = true; - setRotation(BRleg, 0F, 0F, 0F); - BLleg = new ModelRenderer(this, 0, 35); - BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); - BLleg.setRotationPoint(0F, 0F, 0F); - BLleg.setTextureSize(64, 64); - BLleg.mirror = true; - setRotation(BLleg, 0F, 0F, 0F); - FLleg = new ModelRenderer(this, 0, 35); - FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); - FLleg.setRotationPoint(0F, 0F, 0F); - FLleg.setTextureSize(64, 64); - FLleg.mirror = true; - setRotation(FLleg, 0F, 0F, 0F); - - shaft = new ModelRenderer(this, 0, 56); - shaft.addBox(-3F, -1F, -0.9666666F, 6, 1, 2); - shaft.setRotationPoint(-2F, 3F, -2F); - shaft.setTextureSize(64, 64); - shaft.mirror = true; - setRotation(shaft, 0F, 0F, 0F); - - stock = new ModelRenderer(this, 0, 59); - stock.addBox(-3F, -2F, -1F, 6, 3, 2); - stock.setRotationPoint(4F, 3F, -2F); - stock.setTextureSize(64, 64); - stock.mirror = true; - setRotation(stock, 0F, 0F, 0F); - - arms = new ModelRenderer(this, 0, 54); - arms.addBox(-5F, 0F, 0F, 10, 1, 1); - arms.setRotationPoint(-5F, 1F, -2F); - arms.setTextureSize(64, 64); - arms.mirror = true; - setRotation(arms, 0F, 1.570796F, 0F); - - chest = new ModelRenderer(this, 16, 35); - chest.addBox(-3F, 0F, -2F, 6, 3, 4); - chest.setRotationPoint(4F, 1F, 5F); - chest.setTextureSize(64, 64); - chest.mirror = true; - setRotation(chest, 0F, 0.3316126F, 0F); - } - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } - public void renderModel(float f) - { - top.render(f); - bottom.render(f); - FLleg.render(f); - BLleg.render(f); - FRleg.render(f); - BRleg.render(f); - shaft.render(f); - stock.render(f); - arms.render(f); - chest.render(f); - - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + ModelRenderer FRleg; + ModelRenderer bottom; + ModelRenderer BRleg; + ModelRenderer BLleg; + ModelRenderer FLleg; + ModelRenderer shaft; + ModelRenderer stock; + ModelRenderer arms; + ModelRenderer chest; + + public ModelCrossbowBench() { + textureWidth = 64; + textureHeight = 64; + + top = new ModelRenderer(this, 0, 0); + top.addBox(-8F, 4F, -8F, 16, 4, 16); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 64); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + FRleg = new ModelRenderer(this, 0, 35); + FRleg.addBox(3F, 8F, -7F, 4, 12, 4); + FRleg.setRotationPoint(0F, 0F, 0F); + FRleg.setTextureSize(64, 64); + FRleg.mirror = true; + setRotation(FRleg, 0F, 0F, 0F); + bottom = new ModelRenderer(this, 0, 20); + bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); + bottom.setRotationPoint(0F, 0F, 0F); + bottom.setTextureSize(64, 64); + bottom.mirror = true; + setRotation(bottom, 0F, 0F, 0F); + BRleg = new ModelRenderer(this, 0, 35); + BRleg.addBox(3F, 8F, 3F, 4, 12, 4); + BRleg.setRotationPoint(0F, 0F, 0F); + BRleg.setTextureSize(64, 64); + BRleg.mirror = true; + setRotation(BRleg, 0F, 0F, 0F); + BLleg = new ModelRenderer(this, 0, 35); + BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); + BLleg.setRotationPoint(0F, 0F, 0F); + BLleg.setTextureSize(64, 64); + BLleg.mirror = true; + setRotation(BLleg, 0F, 0F, 0F); + FLleg = new ModelRenderer(this, 0, 35); + FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); + FLleg.setRotationPoint(0F, 0F, 0F); + FLleg.setTextureSize(64, 64); + FLleg.mirror = true; + setRotation(FLleg, 0F, 0F, 0F); + + shaft = new ModelRenderer(this, 0, 56); + shaft.addBox(-3F, -1F, -0.9666666F, 6, 1, 2); + shaft.setRotationPoint(-2F, 3F, -2F); + shaft.setTextureSize(64, 64); + shaft.mirror = true; + setRotation(shaft, 0F, 0F, 0F); + + stock = new ModelRenderer(this, 0, 59); + stock.addBox(-3F, -2F, -1F, 6, 3, 2); + stock.setRotationPoint(4F, 3F, -2F); + stock.setTextureSize(64, 64); + stock.mirror = true; + setRotation(stock, 0F, 0F, 0F); + + arms = new ModelRenderer(this, 0, 54); + arms.addBox(-5F, 0F, 0F, 10, 1, 1); + arms.setRotationPoint(-5F, 1F, -2F); + arms.setTextureSize(64, 64); + arms.mirror = true; + setRotation(arms, 0F, 1.570796F, 0F); + + chest = new ModelRenderer(this, 16, 35); + chest.addBox(-3F, 0F, -2F, 6, 3, 4); + chest.setRotationPoint(4F, 1F, 5F); + chest.setTextureSize(64, 64); + chest.mirror = true; + setRotation(chest, 0F, 0.3316126F, 0F); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } + + public void renderModel(float f) { + top.render(f); + bottom.render(f); + FLleg.render(f); + BLleg.render(f); + FRleg.render(f); + BRleg.render(f); + shaft.render(f); + stock.render(f); + arms.render(f); + chest.render(f); + + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelEngTanningRack.java b/src/main/java/minefantasy/mf2/client/render/block/ModelEngTanningRack.java index 0e970e5a..908dfcb3 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelEngTanningRack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelEngTanningRack.java @@ -8,99 +8,96 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelEngTanningRack extends ModelBase { - //fields + // fields ModelRenderer side2; - ModelRenderer side1; - ModelRenderer Blade2; - ModelRenderer Top; - ModelRenderer Base; - ModelRenderer Blade; - ModelRenderer Lever; - ModelRenderer pivot; - - public ModelEngTanningRack() - { - textureWidth = 64; - textureHeight = 32; - - side2 = new ModelRenderer(this, 50, 0); - side2.addBox(6F, 5F, -2.5F, 2, 17, 5); - side2.setRotationPoint(0F, 0F, 0F); - side2.setTextureSize(64, 32); - setRotation(side2, 0F, 0F, 0F); - side1 = new ModelRenderer(this, 50, 0); - side1.addBox(-8F, 5F, -2.5F, 2, 17, 5); - side1.setRotationPoint(0F, 0F, 0F); - side1.setTextureSize(64, 32); - setRotation(side1, 0F, 0F, 0F); - Blade2 = new ModelRenderer(this, 26, 28); - Blade2.addBox(-6F, 1F, -0.5F, 12, 3, 1); - Blade2.setRotationPoint(0F, 4F, 1F); - Blade2.setTextureSize(64, 32); - setRotation(Blade2, -0.2443461F, 0F, 0F); - Top = new ModelRenderer(this, 0, 28); - Top.addBox(-6F, 5F, -0.5F, 12, 3, 1); - Top.setRotationPoint(0F, 0F, 0F); - Top.setTextureSize(64, 32); - setRotation(Top, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-8F, 22F, -3.5F, 16, 2, 6); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - setRotation(Base, 0F, 0F, 0F); - Blade = new ModelRenderer(this, 26, 28); - Blade.addBox(-6F, 1F, -0.5F, 12, 3, 1); - Blade.setRotationPoint(0F, 4F, -1F); - Blade.setTextureSize(64, 32); - setRotation(Blade, 0.2443461F, 0F, 0F); - Lever = new ModelRenderer(this, 0, 8); - Lever.addBox(-1F, 1F, -0.5F, 1, 10, 1); - Lever.setRotationPoint(5F, 5F, 0F); - Lever.setTextureSize(64, 32); - setRotation(Lever, 0F, 0F, 1.570796F); - pivot = new ModelRenderer(this, 4, 8); - pivot.addBox(-1.5F, -1F, -1F, 2, 2, 2); - pivot.setRotationPoint(5F, 5F, 0F); - pivot.setTextureSize(64, 32); - setRotation(pivot, 0F, 0F, 1.570796F); - } + ModelRenderer side1; + ModelRenderer Blade2; + ModelRenderer Top; + ModelRenderer Base; + ModelRenderer Blade; + ModelRenderer Lever; + ModelRenderer pivot; - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } + public ModelEngTanningRack() { + textureWidth = 64; + textureHeight = 32; - public void renderModel(float f5) - { - Base.render(f5); - Top.render(f5); - side1.render(f5); - side2.render(f5); - } - public void renderBlade(float f5) - { - Blade.render(f5); - Blade2.render(f5); - } - public void rotateLever(float animation) - { - pivot.rotateAngleX = Lever.rotateAngleX = (float) Math.toRadians(animation*45F); - } - public void renderLever(float f5) - { - pivot.render(f5); - Lever.render(f5); - } + side2 = new ModelRenderer(this, 50, 0); + side2.addBox(6F, 5F, -2.5F, 2, 17, 5); + side2.setRotationPoint(0F, 0F, 0F); + side2.setTextureSize(64, 32); + setRotation(side2, 0F, 0F, 0F); + side1 = new ModelRenderer(this, 50, 0); + side1.addBox(-8F, 5F, -2.5F, 2, 17, 5); + side1.setRotationPoint(0F, 0F, 0F); + side1.setTextureSize(64, 32); + setRotation(side1, 0F, 0F, 0F); + Blade2 = new ModelRenderer(this, 26, 28); + Blade2.addBox(-6F, 1F, -0.5F, 12, 3, 1); + Blade2.setRotationPoint(0F, 4F, 1F); + Blade2.setTextureSize(64, 32); + setRotation(Blade2, -0.2443461F, 0F, 0F); + Top = new ModelRenderer(this, 0, 28); + Top.addBox(-6F, 5F, -0.5F, 12, 3, 1); + Top.setRotationPoint(0F, 0F, 0F); + Top.setTextureSize(64, 32); + setRotation(Top, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-8F, 22F, -3.5F, 16, 2, 6); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + setRotation(Base, 0F, 0F, 0F); + Blade = new ModelRenderer(this, 26, 28); + Blade.addBox(-6F, 1F, -0.5F, 12, 3, 1); + Blade.setRotationPoint(0F, 4F, -1F); + Blade.setTextureSize(64, 32); + setRotation(Blade, 0.2443461F, 0F, 0F); + Lever = new ModelRenderer(this, 0, 8); + Lever.addBox(-1F, 1F, -0.5F, 1, 10, 1); + Lever.setRotationPoint(5F, 5F, 0F); + Lever.setTextureSize(64, 32); + setRotation(Lever, 0F, 0F, 1.570796F); + pivot = new ModelRenderer(this, 4, 8); + pivot.addBox(-1.5F, -1F, -1F, 2, 2, 2); + pivot.setRotationPoint(5F, 5F, 0F); + pivot.setTextureSize(64, 32); + setRotation(pivot, 0F, 0F, 1.570796F); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } + + public void renderModel(float f5) { + Base.render(f5); + Top.render(f5); + side1.render(f5); + side2.render(f5); + } + + public void renderBlade(float f5) { + Blade.render(f5); + Blade2.render(f5); + } + + public void rotateLever(float animation) { + pivot.rotateAngleX = Lever.rotateAngleX = (float) Math.toRadians(animation * 45F); + } + + public void renderLever(float f5) { + pivot.render(f5); + Lever.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelFirepit.java b/src/main/java/minefantasy/mf2/client/render/block/ModelFirepit.java index 97f2ad62..9ba76fdb 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelFirepit.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelFirepit.java @@ -1,6 +1,5 @@ package minefantasy.mf2.client.render.block; -import minefantasy.mf2.block.tileentity.TileEntityBloomery; import minefantasy.mf2.block.tileentity.TileEntityFirepit; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; @@ -10,89 +9,84 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelFirepit extends ModelBase -{ - //fields +public class ModelFirepit extends ModelBase { + // fields ModelRenderer Base; ModelRenderer Plank1; ModelRenderer Plank2; ModelRenderer Plank3; ModelRenderer Plank4; - ModelRenderer Pile; - - public ModelFirepit() - { - textureWidth = 64; - textureHeight = 32; - - Base = new ModelRenderer(this, 0, 15); - Pile = new ModelRenderer(this, 0, 6); - - Plank1 = new ModelRenderer(this, 24, 0); - Plank2 = new ModelRenderer(this, 24, 0); - Plank3 = new ModelRenderer(this, 0, 0); - Plank4 = new ModelRenderer(this, 0, 0); - - Base.addBox(-5F, 3F, -5F, 10, 3, 10); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - Plank2.addBox(-1.5F, -1.5F, -4.5F, 3, 3, 9); - Plank2.setRotationPoint(0F, 3F, 5F); - Plank2.setTextureSize(64, 32); - Plank2.mirror = true; - Plank1.addBox(-1.5F, -1.5F, -4.5F, 3, 3, 9); - Plank1.setRotationPoint(0F, 3F, -5F); - Plank1.setTextureSize(64, 32); - Plank1.mirror = true; - Plank3.addBox(-4.5F, -1.5F, -1.5F, 9, 3, 3); - Plank3.setRotationPoint(-5F, 3F, 0F); - Plank3.setTextureSize(64, 32); - Plank3.mirror = true; - Plank4.addBox(-4.5F, -1.5F, -1.5F, 9, 3, 3); - Plank4.setRotationPoint(5F, 3F, 0F); - Plank4.setTextureSize(64, 32); - Plank4.mirror = true; - Pile.addBox(-3F, 0F, -3F, 6, 3, 6); - Pile.setRotationPoint(0F, 0F, 0F); - Pile.setTextureSize(64, 32); - Pile.mirror = true; - setRotation(Pile, 0F, 0F, 0F); - - float angle = 0.7853982F; - - setRotation(Plank1, angle, 0F, 0F); - setRotation(Plank2, -angle, 0F, 0F); - setRotation(Plank3, 0F, 0F, -angle); - setRotation(Plank4, 0F, 0F, angle); - } - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - } - - public void renderModel(TileEntityFirepit pit, float f) - { - Base.render(f); - - if(pit == null || pit.fuel > 0) - { - Plank1.render(f); - Plank2.render(f); - Plank3.render(f); - Plank4.render(f); - Pile.render(f); - } - } + ModelRenderer Pile; + + public ModelFirepit() { + textureWidth = 64; + textureHeight = 32; + + Base = new ModelRenderer(this, 0, 15); + Pile = new ModelRenderer(this, 0, 6); + + Plank1 = new ModelRenderer(this, 24, 0); + Plank2 = new ModelRenderer(this, 24, 0); + Plank3 = new ModelRenderer(this, 0, 0); + Plank4 = new ModelRenderer(this, 0, 0); + + Base.addBox(-5F, 3F, -5F, 10, 3, 10); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + Plank2.addBox(-1.5F, -1.5F, -4.5F, 3, 3, 9); + Plank2.setRotationPoint(0F, 3F, 5F); + Plank2.setTextureSize(64, 32); + Plank2.mirror = true; + Plank1.addBox(-1.5F, -1.5F, -4.5F, 3, 3, 9); + Plank1.setRotationPoint(0F, 3F, -5F); + Plank1.setTextureSize(64, 32); + Plank1.mirror = true; + Plank3.addBox(-4.5F, -1.5F, -1.5F, 9, 3, 3); + Plank3.setRotationPoint(-5F, 3F, 0F); + Plank3.setTextureSize(64, 32); + Plank3.mirror = true; + Plank4.addBox(-4.5F, -1.5F, -1.5F, 9, 3, 3); + Plank4.setRotationPoint(5F, 3F, 0F); + Plank4.setTextureSize(64, 32); + Plank4.mirror = true; + Pile.addBox(-3F, 0F, -3F, 6, 3, 6); + Pile.setRotationPoint(0F, 0F, 0F); + Pile.setTextureSize(64, 32); + Pile.mirror = true; + setRotation(Pile, 0F, 0F, 0F); + + float angle = 0.7853982F; + + setRotation(Plank1, angle, 0F, 0F); + setRotation(Plank2, -angle, 0F, 0F); + setRotation(Plank3, 0F, 0F, -angle); + setRotation(Plank4, 0F, 0F, angle); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + } + + public void renderModel(TileEntityFirepit pit, float f) { + Base.render(f); + + if (pit == null || pit.fuel > 0) { + Plank1.render(f); + Plank2.render(f); + Plank3.render(f); + Plank4.render(f); + Pile.render(f); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelFoodBox.java b/src/main/java/minefantasy/mf2/client/render/block/ModelFoodBox.java index 2d826555..0fdb4d80 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelFoodBox.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelFoodBox.java @@ -1,65 +1,61 @@ package minefantasy.mf2.client.render.block; -import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; /** * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelFoodBox extends ModelAmmoBox -{ - public ModelFoodBox() - { - textureWidth = 64; - textureHeight = 32; - - LeftWall = new ModelRenderer(this, 20, 0); - LeftWall.addBox(-4F, -2F, -2F, 1, 3, 4); - LeftWall.setRotationPoint(0F, 0F, 0F); - LeftWall.setTextureSize(64, 32); - setRotation(LeftWall, 0F, 0F, 0F); - FrontWall = new ModelRenderer(this, 0, 5); - FrontWall.addBox(-4F, -2F, -3F, 8, 3, 1); - FrontWall.setRotationPoint(0F, 0F, 0F); - FrontWall.setTextureSize(64, 32); - setRotation(FrontWall, 0F, 0F, 0F); - BackWall = new ModelRenderer(this, 0, 5); - BackWall.addBox(-4F, -2F, 2F, 8, 3, 1); - BackWall.setRotationPoint(0F, 0F, 0F); - BackWall.setTextureSize(64, 32); - setRotation(BackWall, 0F, 0F, 0F); - RightWall = new ModelRenderer(this, 20, 0); - RightWall.addBox(3F, -2F, -2F, 1, 3, 4); - RightWall.setRotationPoint(0F, 0F, 0F); - RightWall.setTextureSize(64, 32); - setRotation(RightWall, 0F, 0F, 0F); - lid = new ModelRenderer(this, 0, 11); - lid.addBox(-4F, -1F, -6F, 8, 1, 6); - lid.setRotationPoint(0F, -2F, 3F); - lid.setTextureSize(64, 32); - setRotation(lid, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-3F, 0F, -2F, 6, 1, 4); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - setRotation(Base, 0F, 0F, 0F); - lock1 = new ModelRenderer(this, 0, 0); - lock1.addBox(-0.5F, -1.5F, -6.5F, 1, 2, 1); - lock1.setRotationPoint(0F, -2F, 3F); - lock1.setTextureSize(64, 32); - setRotation(lock1, 0F, 0F, 0F); - - RightWall.mirror = true; - } - @Override - public void renderLid(float f, float angle) - { - lock1.rotateAngleX = lid.rotateAngleX = -(float)Math.toRadians(angle); +public class ModelFoodBox extends ModelAmmoBox { + public ModelFoodBox() { + textureWidth = 64; + textureHeight = 32; + + LeftWall = new ModelRenderer(this, 20, 0); + LeftWall.addBox(-4F, -2F, -2F, 1, 3, 4); + LeftWall.setRotationPoint(0F, 0F, 0F); + LeftWall.setTextureSize(64, 32); + setRotation(LeftWall, 0F, 0F, 0F); + FrontWall = new ModelRenderer(this, 0, 5); + FrontWall.addBox(-4F, -2F, -3F, 8, 3, 1); + FrontWall.setRotationPoint(0F, 0F, 0F); + FrontWall.setTextureSize(64, 32); + setRotation(FrontWall, 0F, 0F, 0F); + BackWall = new ModelRenderer(this, 0, 5); + BackWall.addBox(-4F, -2F, 2F, 8, 3, 1); + BackWall.setRotationPoint(0F, 0F, 0F); + BackWall.setTextureSize(64, 32); + setRotation(BackWall, 0F, 0F, 0F); + RightWall = new ModelRenderer(this, 20, 0); + RightWall.addBox(3F, -2F, -2F, 1, 3, 4); + RightWall.setRotationPoint(0F, 0F, 0F); + RightWall.setTextureSize(64, 32); + setRotation(RightWall, 0F, 0F, 0F); + lid = new ModelRenderer(this, 0, 11); + lid.addBox(-4F, -1F, -6F, 8, 1, 6); + lid.setRotationPoint(0F, -2F, 3F); + lid.setTextureSize(64, 32); + setRotation(lid, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-3F, 0F, -2F, 6, 1, 4); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + setRotation(Base, 0F, 0F, 0F); + lock1 = new ModelRenderer(this, 0, 0); + lock1.addBox(-0.5F, -1.5F, -6.5F, 1, 2, 1); + lock1.setRotationPoint(0F, -2F, 3F); + lock1.setTextureSize(64, 32); + setRotation(lock1, 0F, 0F, 0F); + + RightWall.mirror = true; + } + + @Override + public void renderLid(float f, float angle) { + lock1.rotateAngleX = lid.rotateAngleX = -(float) Math.toRadians(angle); lid.render(f); lock1.render(f); } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelForge.java b/src/main/java/minefantasy/mf2/client/render/block/ModelForge.java index b7ae7ec4..f99b970e 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelForge.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelForge.java @@ -12,8 +12,7 @@ * Sources are provided for educational reasons. though small bits of * code, or methods can be used in your own creations. */ -public class ModelForge extends ModelBase -{ +public class ModelForge extends ModelBase { // fields ModelRenderer Back; ModelRenderer Right; @@ -26,8 +25,7 @@ public class ModelForge extends ModelBase ModelRenderer cornerFL; ModelRenderer fuel; - public ModelForge() - { + public ModelForge() { textureWidth = 64; textureHeight = 64; @@ -95,8 +93,7 @@ public ModelForge() setRotation(fuel, 0F, 0F, 0F); } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { super.render(entity, f, f1, f2, f3, f4, f5); Back.render(f5); Right.render(f5); @@ -110,18 +107,15 @@ public void render(Entity entity, float f, float f1, float f2, float f3, float f fuel.render(f5); } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } - public void renderModel(TileEntityForge forge, float f, boolean hasFuel, float height) - { - boolean[] sides = new boolean[]{true, true, true, true}; - if(forge != null) - { + public void renderModel(TileEntityForge forge, float f, boolean hasFuel, float height) { + boolean[] sides = new boolean[] { true, true, true, true }; + if (forge != null) { sides = forge.showSides(); } @@ -149,9 +143,8 @@ public void renderModel(TileEntityForge forge, float f, boolean hasFuel, float h if (sides[0] || sides[1]) cornerFL.render(f); Base.render(f); - if(hasFuel) - { - fuel.offsetY = -height*0.3F +0.3F; + if (hasFuel) { + fuel.offsetY = -height * 0.3F + 0.3F; fuel.render(f); } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelForgeTop.java b/src/main/java/minefantasy/mf2/client/render/block/ModelForgeTop.java index 478063e0..1a4c99cc 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelForgeTop.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelForgeTop.java @@ -1,6 +1,5 @@ package minefantasy.mf2.client.render.block; -import minefantasy.mf2.block.tileentity.TileEntityForge; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; @@ -12,99 +11,95 @@ * Sources are provided for educational reasons. though small bits of * code, or methods can be used in your own creations. */ -public class ModelForgeTop extends ModelBase -{ +public class ModelForgeTop extends ModelBase { // fields ModelRenderer Back; - ModelRenderer Right; - ModelRenderer cornerBR; - ModelRenderer Left; - ModelRenderer front; - ModelRenderer cornerBL; - ModelRenderer cornerFR; - ModelRenderer cornerFL; - ModelRenderer Top; - - public ModelForgeTop() - { - textureWidth = 64; - textureHeight = 32; - - Back = new ModelRenderer(this, 0, 0); - Back.addBox(-4F, -5F, -6F, 8, 6, 2); - Back.setRotationPoint(0F, 22F, 0F); - Back.setTextureSize(64, 32); - Back.mirror = true; - setRotation(Back, 0F, 1.570796F, 0F); - Right = new ModelRenderer(this, 0, 0); - Right.addBox(-4F, -7F, -6F, 8, 6, 2); - Right.setRotationPoint(0F, 24F, 0F); - Right.setTextureSize(64, 32); - Right.mirror = true; - setRotation(Right, 0F, 3.154392F, 0F); - cornerBR = new ModelRenderer(this, 0, 8); - cornerBR.addBox(-6F, -13F, -6F, 2, 12, 2); - cornerBR.setRotationPoint(0F, 24F, 0F); - cornerBR.setTextureSize(64, 32); - cornerBR.mirror = true; - setRotation(cornerBR, 0F, 1.570796F, 0F); - Left = new ModelRenderer(this, 0, 0); - Left.addBox(-4F, -5F, -6F, 8, 6, 2); - Left.setRotationPoint(0F, 22F, 0F); - Left.setTextureSize(64, 32); - Left.mirror = true; - setRotation(Left, 0F, 0F, 0F); - front = new ModelRenderer(this, 0, 0); - front.addBox(-4F, -7F, -6F, 8, 6, 2); - front.setRotationPoint(0F, 24F, 0F); - front.setTextureSize(64, 32); - front.mirror = true; - setRotation(front, 0F, -1.570796F, 0F); - cornerBL = new ModelRenderer(this, 0, 8); - cornerBL.addBox(4F, -11F, -6F, 2, 12, 2); - cornerBL.setRotationPoint(0F, 22F, 0F); - cornerBL.setTextureSize(64, 32); - cornerBL.mirror = true; - setRotation(cornerBL, 0F, 1.570796F, 0F); - cornerFR = new ModelRenderer(this, 0, 8); - cornerFR.addBox(-6F, -13F, 4F, 2, 12, 2); - cornerFR.setRotationPoint(0F, 24F, 0F); - cornerFR.setTextureSize(64, 32); - cornerFR.mirror = true; - setRotation(cornerFR, 0F, 1.570796F, 0F); - cornerFL = new ModelRenderer(this, 0, 8); - cornerFL.addBox(4F, -13F, 4F, 2, 12, 2); - cornerFL.setRotationPoint(0F, 24F, 0F); - cornerFL.setTextureSize(64, 32); - cornerFL.mirror = true; - setRotation(cornerFL, 0F, 1.570796F, 0F); - Top = new ModelRenderer(this, 20, 0); - Top.addBox(-6F, -14F, -6F, 12, 3, 12); - Top.setRotationPoint(0F, 22F, 0F); - Top.setTextureSize(64, 32); - Top.mirror = true; - setRotation(Top, 0F, 0F, 0F); - } + ModelRenderer Right; + ModelRenderer cornerBR; + ModelRenderer Left; + ModelRenderer front; + ModelRenderer cornerBL; + ModelRenderer cornerFR; + ModelRenderer cornerFL; + ModelRenderer Top; - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { + public ModelForgeTop() { + textureWidth = 64; + textureHeight = 32; + + Back = new ModelRenderer(this, 0, 0); + Back.addBox(-4F, -5F, -6F, 8, 6, 2); + Back.setRotationPoint(0F, 22F, 0F); + Back.setTextureSize(64, 32); + Back.mirror = true; + setRotation(Back, 0F, 1.570796F, 0F); + Right = new ModelRenderer(this, 0, 0); + Right.addBox(-4F, -7F, -6F, 8, 6, 2); + Right.setRotationPoint(0F, 24F, 0F); + Right.setTextureSize(64, 32); + Right.mirror = true; + setRotation(Right, 0F, 3.154392F, 0F); + cornerBR = new ModelRenderer(this, 0, 8); + cornerBR.addBox(-6F, -13F, -6F, 2, 12, 2); + cornerBR.setRotationPoint(0F, 24F, 0F); + cornerBR.setTextureSize(64, 32); + cornerBR.mirror = true; + setRotation(cornerBR, 0F, 1.570796F, 0F); + Left = new ModelRenderer(this, 0, 0); + Left.addBox(-4F, -5F, -6F, 8, 6, 2); + Left.setRotationPoint(0F, 22F, 0F); + Left.setTextureSize(64, 32); + Left.mirror = true; + setRotation(Left, 0F, 0F, 0F); + front = new ModelRenderer(this, 0, 0); + front.addBox(-4F, -7F, -6F, 8, 6, 2); + front.setRotationPoint(0F, 24F, 0F); + front.setTextureSize(64, 32); + front.mirror = true; + setRotation(front, 0F, -1.570796F, 0F); + cornerBL = new ModelRenderer(this, 0, 8); + cornerBL.addBox(4F, -11F, -6F, 2, 12, 2); + cornerBL.setRotationPoint(0F, 22F, 0F); + cornerBL.setTextureSize(64, 32); + cornerBL.mirror = true; + setRotation(cornerBL, 0F, 1.570796F, 0F); + cornerFR = new ModelRenderer(this, 0, 8); + cornerFR.addBox(-6F, -13F, 4F, 2, 12, 2); + cornerFR.setRotationPoint(0F, 24F, 0F); + cornerFR.setTextureSize(64, 32); + cornerFR.mirror = true; + setRotation(cornerFR, 0F, 1.570796F, 0F); + cornerFL = new ModelRenderer(this, 0, 8); + cornerFL.addBox(4F, -13F, 4F, 2, 12, 2); + cornerFL.setRotationPoint(0F, 24F, 0F); + cornerFL.setTextureSize(64, 32); + cornerFL.mirror = true; + setRotation(cornerFL, 0F, 1.570796F, 0F); + Top = new ModelRenderer(this, 20, 0); + Top.addBox(-6F, -14F, -6F, 12, 3, 12); + Top.setRotationPoint(0F, 22F, 0F); + Top.setTextureSize(64, 32); + Top.mirror = true; + setRotation(Top, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { super.render(entity, f, f1, f2, f3, f4, f5); } - public void render(float f) - { + + public void render(float f) { Back.render(f); - Right.render(f); - cornerBR.render(f); - Left.render(f); - front.render(f); - cornerBL.render(f); - cornerFR.render(f); - cornerFL.render(f); - Top.render(f); + Right.render(f); + cornerBR.render(f); + Left.render(f); + front.render(f); + cornerBL.render(f); + cornerFR.render(f); + cornerFL.render(f); + Top.render(f); } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelOven.java b/src/main/java/minefantasy/mf2/client/render/block/ModelOven.java index cfe722f6..3305a375 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelOven.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelOven.java @@ -1,6 +1,5 @@ package minefantasy.mf2.client.render.block; -import minefantasy.mf2.block.tileentity.TileEntityForge; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; @@ -12,89 +11,85 @@ * Sources are provided for educational reasons. though small bits of * code, or methods can be used in your own creations. */ -public class ModelOven extends ModelBase -{ +public class ModelOven extends ModelBase { ModelRenderer top; - ModelRenderer base; - ModelRenderer right; - ModelRenderer topfront; - ModelRenderer left; - ModelRenderer back; - ModelRenderer front; - - public ModelOven() - { - float offsetY = 1F; + ModelRenderer base; + ModelRenderer right; + ModelRenderer topfront; + ModelRenderer left; + ModelRenderer back; + ModelRenderer front; + + public ModelOven() { + float offsetY = 1F; textureWidth = 64; textureHeight = 32; - - top = new ModelRenderer(this, 24, 0); - top.addBox(-5F, -11F+offsetY, -5F, 10, 1, 10); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 32); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - - base = new ModelRenderer(this, 24, 21); - base.addBox(-5F, offsetY, -5F, 10, 1, 10); - base.setRotationPoint(0F, 0F, 0F); - base.setTextureSize(64, 32); - base.mirror = true; - setRotation(base, 0F, 0F, 0F); - - right = new ModelRenderer(this, 0, 11); - right.addBox(-5F, -10F+offsetY, 5F, 10, 10, 1); - right.setRotationPoint(0F, 0F, 0F); - right.setTextureSize(64, 32); - right.mirror = true; - setRotation(right, 0F, 1.570796F, 0F); - - topfront = new ModelRenderer(this, 22, 11); - topfront.addBox(-5F, -10F+offsetY, -6F, 10, 2, 1); - topfront.setRotationPoint(0F, 0F, 0F); - topfront.setTextureSize(64, 32); - topfront.mirror = true; - setRotation(topfront, 0F, 0F, 0F); - - left = new ModelRenderer(this, 0, 11); - left.addBox(-5F, -10F+offsetY, 5F, 10, 10, 1); - left.setRotationPoint(0F, 0F, 0F); - left.setTextureSize(64, 32); - left.mirror = true; - setRotation(left, 0F, -1.570796F, 0F); - - back = new ModelRenderer(this, 0, 11); - back.addBox(-5F, -10F+offsetY, 5F, 10, 10, 1); - back.setRotationPoint(0F, 0F, 0F); - back.setTextureSize(64, 32); - back.mirror = true; - setRotation(back, 0F, 0F, 0F); - - front = new ModelRenderer(this, 22, 18); - front.addBox(-5F, -2F+offsetY, -6F, 10, 2, 1); - front.setRotationPoint(0F, 0F, 0F); - front.setTextureSize(64, 32); - front.mirror = true; - setRotation(front, 0F, 0F, 0F); - } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { + top = new ModelRenderer(this, 24, 0); + top.addBox(-5F, -11F + offsetY, -5F, 10, 1, 10); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 32); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + + base = new ModelRenderer(this, 24, 21); + base.addBox(-5F, offsetY, -5F, 10, 1, 10); + base.setRotationPoint(0F, 0F, 0F); + base.setTextureSize(64, 32); + base.mirror = true; + setRotation(base, 0F, 0F, 0F); + + right = new ModelRenderer(this, 0, 11); + right.addBox(-5F, -10F + offsetY, 5F, 10, 10, 1); + right.setRotationPoint(0F, 0F, 0F); + right.setTextureSize(64, 32); + right.mirror = true; + setRotation(right, 0F, 1.570796F, 0F); + + topfront = new ModelRenderer(this, 22, 11); + topfront.addBox(-5F, -10F + offsetY, -6F, 10, 2, 1); + topfront.setRotationPoint(0F, 0F, 0F); + topfront.setTextureSize(64, 32); + topfront.mirror = true; + setRotation(topfront, 0F, 0F, 0F); + + left = new ModelRenderer(this, 0, 11); + left.addBox(-5F, -10F + offsetY, 5F, 10, 10, 1); + left.setRotationPoint(0F, 0F, 0F); + left.setTextureSize(64, 32); + left.mirror = true; + setRotation(left, 0F, -1.570796F, 0F); + + back = new ModelRenderer(this, 0, 11); + back.addBox(-5F, -10F + offsetY, 5F, 10, 10, 1); + back.setRotationPoint(0F, 0F, 0F); + back.setTextureSize(64, 32); + back.mirror = true; + setRotation(back, 0F, 0F, 0F); + + front = new ModelRenderer(this, 22, 18); + front.addBox(-5F, -2F + offsetY, -6F, 10, 2, 1); + front.setRotationPoint(0F, 0F, 0F); + front.setTextureSize(64, 32); + front.mirror = true; + setRotation(front, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { super.render(entity, f, f1, f2, f3, f4, f5); } - public void render(float f) - { + + public void render(float f) { top.render(f); - base.render(f); - right.render(f); - topfront.render(f); - left.render(f); - back.render(f); - front.render(f); + base.render(f); + right.render(f); + topfront.render(f); + left.render(f); + back.render(f); + front.render(f); } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelQuern.java b/src/main/java/minefantasy/mf2/client/render/block/ModelQuern.java index d3713c71..4f29c12f 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelQuern.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelQuern.java @@ -9,58 +9,54 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelQuern extends ModelBase -{ +public class ModelQuern extends ModelBase { ModelRenderer base; - ModelRenderer top; - ModelRenderer handle; - ModelRenderer core; - - public ModelQuern() - { - textureWidth = 64; - textureHeight = 64; - - base = new ModelRenderer(this, 0, 0); - base.addBox(-8F, 3F, -8F, 16, 13, 16); - base.setRotationPoint(0F, 0F, 0F); - base.setTextureSize(64, 32); - - top = new ModelRenderer(this, 0, 29); - top.addBox(-6F, 2F, -6F, 12, 1, 12); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 32); - - handle = new ModelRenderer(this, 48, 29); - handle.addBox(3F, 0F, -5F, 2, 2, 2); - handle.setRotationPoint(0F, 0F, 0F); - handle.setTextureSize(64, 32); - - core = new ModelRenderer(this, 48, 29); - core.addBox(-1, 0F, -1F, 2, 2, 2); - core.setRotationPoint(0F, 0F, 0F); - core.setTextureSize(64, 32); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - } - - public void renderModel(TileEntityQuern quern, float f) - { - if(quern != null) - { - top.rotateAngleY = handle.rotateAngleY = (float) (Math.PI * quern.turnAngle) / TileEntityQuern.getMaxRevs()*2; - } - + ModelRenderer top; + ModelRenderer handle; + ModelRenderer core; + + public ModelQuern() { + textureWidth = 64; + textureHeight = 64; + + base = new ModelRenderer(this, 0, 0); + base.addBox(-8F, 3F, -8F, 16, 13, 16); + base.setRotationPoint(0F, 0F, 0F); + base.setTextureSize(64, 32); + + top = new ModelRenderer(this, 0, 29); + top.addBox(-6F, 2F, -6F, 12, 1, 12); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 32); + + handle = new ModelRenderer(this, 48, 29); + handle.addBox(3F, 0F, -5F, 2, 2, 2); + handle.setRotationPoint(0F, 0F, 0F); + handle.setTextureSize(64, 32); + + core = new ModelRenderer(this, 48, 29); + core.addBox(-1, 0F, -1F, 2, 2, 2); + core.setRotationPoint(0F, 0F, 0F); + core.setTextureSize(64, 32); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + } + + public void renderModel(TileEntityQuern quern, float f) { + if (quern != null) { + top.rotateAngleY = handle.rotateAngleY = (float) (Math.PI * quern.turnAngle) / TileEntityQuern.getMaxRevs() + * 2; + } + base.render(f); top.render(f); core.render(f); handle.render(f); } - + } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelRack.java b/src/main/java/minefantasy/mf2/client/render/block/ModelRack.java index 4a541762..cebf6258 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelRack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelRack.java @@ -4,87 +4,83 @@ import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; -public class ModelRack extends ModelBase -{ - //fields +public class ModelRack extends ModelBase { + // fields ModelRenderer rStrut; - ModelRenderer beam; - ModelRenderer rack1; - ModelRenderer lStrut; - ModelRenderer divider3; - ModelRenderer divider1; - ModelRenderer dividerR; - ModelRenderer divider2; - ModelRenderer dividerL; - - public ModelRack() - { - textureWidth = 64; - textureHeight = 32; - - rStrut = new ModelRenderer(this, 0, 0); - rStrut.addBox(7F, 0F, 6F, 1, 16, 2); - rStrut.setRotationPoint(0F, 0F, 0F); - - beam = new ModelRenderer(this, 0, 29); - beam.addBox(-8F, 13F, 5F, 16, 1, 1); - beam.setRotationPoint(0F, 0F, 0F); - - rack1 = new ModelRenderer(this, 0, 29); - rack1.addBox(-8F, 3F, 5F, 16, 2, 1); - rack1.setRotationPoint(0F, 0F, 0F); - - lStrut = new ModelRenderer(this, 0, 0); - lStrut.addBox(-8F, 0F, 6F, 1, 16, 2); - lStrut.setRotationPoint(0F, 0F, 0F); + ModelRenderer beam; + ModelRenderer rack1; + ModelRenderer lStrut; + ModelRenderer divider3; + ModelRenderer divider1; + ModelRenderer dividerR; + ModelRenderer divider2; + ModelRenderer dividerL; - divider3 = new ModelRenderer(this, 0, 29); - divider3.addBox(3F, 4F, 3F, 2, 1, 2); - divider3.setRotationPoint(0F, 0F, 0F); - - divider1 = new ModelRenderer(this, 0, 29); - divider1.addBox(-1F, 4F, 3F, 2, 1, 2); - divider1.setRotationPoint(0F, 0F, 0F); - - dividerR = new ModelRenderer(this, 1, 29); - dividerR.addBox(7F, 4F, 3F, 1, 1, 2); - dividerR.setRotationPoint(0F, 0F, 0F); - - divider2 = new ModelRenderer(this, 0, 29); - divider2.addBox(-5F, 4F, 3F, 2, 1, 2); - divider2.setRotationPoint(0F, 0F, 0F); - - dividerL = new ModelRenderer(this, 0, 29); - dividerL.addBox(-8F, 4F, 3F, 1, 1, 2); - dividerL.setRotationPoint(0F, 0F, 0F); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - rStrut.render(f5); - beam.render(f5); - rack1.render(f5); - lStrut.render(f5); - divider3.render(f5); - divider1.render(f5); - dividerR.render(f5); - divider2.render(f5); - dividerL.render(f5); - } - - public void renderModel(float scale) - { - rStrut.render(scale); - beam.render(scale); - rack1.render(scale); - lStrut.render(scale); - divider3.render(scale); - divider1.render(scale); - dividerR.render(scale); - divider2.render(scale); - dividerL.render(scale); - } + public ModelRack() { + textureWidth = 64; + textureHeight = 32; + + rStrut = new ModelRenderer(this, 0, 0); + rStrut.addBox(7F, 0F, 6F, 1, 16, 2); + rStrut.setRotationPoint(0F, 0F, 0F); + + beam = new ModelRenderer(this, 0, 29); + beam.addBox(-8F, 13F, 5F, 16, 1, 1); + beam.setRotationPoint(0F, 0F, 0F); + + rack1 = new ModelRenderer(this, 0, 29); + rack1.addBox(-8F, 3F, 5F, 16, 2, 1); + rack1.setRotationPoint(0F, 0F, 0F); + + lStrut = new ModelRenderer(this, 0, 0); + lStrut.addBox(-8F, 0F, 6F, 1, 16, 2); + lStrut.setRotationPoint(0F, 0F, 0F); + + divider3 = new ModelRenderer(this, 0, 29); + divider3.addBox(3F, 4F, 3F, 2, 1, 2); + divider3.setRotationPoint(0F, 0F, 0F); + + divider1 = new ModelRenderer(this, 0, 29); + divider1.addBox(-1F, 4F, 3F, 2, 1, 2); + divider1.setRotationPoint(0F, 0F, 0F); + + dividerR = new ModelRenderer(this, 1, 29); + dividerR.addBox(7F, 4F, 3F, 1, 1, 2); + dividerR.setRotationPoint(0F, 0F, 0F); + + divider2 = new ModelRenderer(this, 0, 29); + divider2.addBox(-5F, 4F, 3F, 2, 1, 2); + divider2.setRotationPoint(0F, 0F, 0F); + + dividerL = new ModelRenderer(this, 0, 29); + dividerL.addBox(-8F, 4F, 3F, 1, 1, 2); + dividerL.setRotationPoint(0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + rStrut.render(f5); + beam.render(f5); + rack1.render(f5); + lStrut.render(f5); + divider3.render(f5); + divider1.render(f5); + dividerR.render(f5); + divider2.render(f5); + dividerL.render(f5); + } + + public void renderModel(float scale) { + rStrut.render(scale); + beam.render(scale); + rack1.render(scale); + lStrut.render(scale); + divider3.render(scale); + divider1.render(scale); + dividerR.render(scale); + divider2.render(scale); + dividerL.render(scale); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelResearch.java b/src/main/java/minefantasy/mf2/client/render/block/ModelResearch.java index 66bd3696..f250ab74 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelResearch.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelResearch.java @@ -8,116 +8,112 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelResearch extends ModelBase -{ - //fields +public class ModelResearch extends ModelBase { + // fields ModelRenderer top; - ModelRenderer FRleg; - ModelRenderer bottom; - ModelRenderer BRleg; - ModelRenderer BLleg; - ModelRenderer FLleg; - ModelRenderer papers2; - ModelRenderer ink; - ModelRenderer book; - ModelRenderer papers; - - public ModelResearch() - { - textureWidth = 64; - textureHeight = 64; - - top = new ModelRenderer(this, 0, 0); - top.addBox(-8F, 4F, -8F, 16, 4, 16); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 64); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - FRleg = new ModelRenderer(this, 0, 35); - FRleg.addBox(3F, 8F, -7F, 4, 12, 4); - FRleg.setRotationPoint(0F, 0F, 0F); - FRleg.setTextureSize(64, 64); - FRleg.mirror = true; - setRotation(FRleg, 0F, 0F, 0F); - bottom = new ModelRenderer(this, 0, 20); - bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); - bottom.setRotationPoint(0F, 0F, 0F); - bottom.setTextureSize(64, 64); - bottom.mirror = true; - setRotation(bottom, 0F, 0F, 0F); - BRleg = new ModelRenderer(this, 0, 35); - BRleg.addBox(3F, 8F, 3F, 4, 12, 4); - BRleg.setRotationPoint(0F, 0F, 0F); - BRleg.setTextureSize(64, 64); - BRleg.mirror = true; - setRotation(BRleg, 0F, 0F, 0F); - BLleg = new ModelRenderer(this, 0, 35); - BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); - BLleg.setRotationPoint(0F, 0F, 0F); - BLleg.setTextureSize(64, 64); - BLleg.mirror = true; - setRotation(BLleg, 0F, 0F, 0F); - FLleg = new ModelRenderer(this, 0, 35); - FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); - FLleg.setRotationPoint(0F, 0F, 0F); - FLleg.setTextureSize(64, 64); - FLleg.mirror = true; - setRotation(FLleg, 0F, 0F, 0F); - papers = new ModelRenderer(this, 0, 51); - papers.addBox(-3F, -1F, -4F, 6, 0, 8); - papers.setRotationPoint(0F, 4.5F, -2F); - papers.setTextureSize(64, 64); - papers.mirror = true; - setRotation(papers, 0F, 0.296706F, 0F); - ink = new ModelRenderer(this, 0, 0); - ink.addBox(-1F, -1F, -1F, 2, 2, 2); - ink.setRotationPoint(5F, 3F, 4F); - ink.setTextureSize(64, 64); - ink.mirror = true; - setRotation(ink, 0F, 0F, 0F); - book = new ModelRenderer(this, 16, 35); - book.addBox(-3F, -1F, -4F, 6, 3, 8); - book.setRotationPoint(-4F, 2F, 4F); - book.setTextureSize(64, 64); - book.mirror = true; - setRotation(book, 0F, -0.1396263F, 0F); - papers2 = new ModelRenderer(this, 0, 51); - papers2.addBox(-3F, -1F, -4F, 6, 1, 8); - papers2.setRotationPoint(0F, 14F, 0F); - papers2.setTextureSize(64, 64); - papers2.mirror = true; - setRotation(papers2, 0F, 0.6283185F, 0F); - } - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } - public void renderModel(float f) - { - top.render(f); - bottom.render(f); - FLleg.render(f); - BLleg.render(f); - FRleg.render(f); - BRleg.render(f); - papers.render(f); - papers2.render(f); - ink.render(f); - book.render(f); - - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + ModelRenderer FRleg; + ModelRenderer bottom; + ModelRenderer BRleg; + ModelRenderer BLleg; + ModelRenderer FLleg; + ModelRenderer papers2; + ModelRenderer ink; + ModelRenderer book; + ModelRenderer papers; + + public ModelResearch() { + textureWidth = 64; + textureHeight = 64; + + top = new ModelRenderer(this, 0, 0); + top.addBox(-8F, 4F, -8F, 16, 4, 16); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 64); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + FRleg = new ModelRenderer(this, 0, 35); + FRleg.addBox(3F, 8F, -7F, 4, 12, 4); + FRleg.setRotationPoint(0F, 0F, 0F); + FRleg.setTextureSize(64, 64); + FRleg.mirror = true; + setRotation(FRleg, 0F, 0F, 0F); + bottom = new ModelRenderer(this, 0, 20); + bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); + bottom.setRotationPoint(0F, 0F, 0F); + bottom.setTextureSize(64, 64); + bottom.mirror = true; + setRotation(bottom, 0F, 0F, 0F); + BRleg = new ModelRenderer(this, 0, 35); + BRleg.addBox(3F, 8F, 3F, 4, 12, 4); + BRleg.setRotationPoint(0F, 0F, 0F); + BRleg.setTextureSize(64, 64); + BRleg.mirror = true; + setRotation(BRleg, 0F, 0F, 0F); + BLleg = new ModelRenderer(this, 0, 35); + BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); + BLleg.setRotationPoint(0F, 0F, 0F); + BLleg.setTextureSize(64, 64); + BLleg.mirror = true; + setRotation(BLleg, 0F, 0F, 0F); + FLleg = new ModelRenderer(this, 0, 35); + FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); + FLleg.setRotationPoint(0F, 0F, 0F); + FLleg.setTextureSize(64, 64); + FLleg.mirror = true; + setRotation(FLleg, 0F, 0F, 0F); + papers = new ModelRenderer(this, 0, 51); + papers.addBox(-3F, -1F, -4F, 6, 0, 8); + papers.setRotationPoint(0F, 4.5F, -2F); + papers.setTextureSize(64, 64); + papers.mirror = true; + setRotation(papers, 0F, 0.296706F, 0F); + ink = new ModelRenderer(this, 0, 0); + ink.addBox(-1F, -1F, -1F, 2, 2, 2); + ink.setRotationPoint(5F, 3F, 4F); + ink.setTextureSize(64, 64); + ink.mirror = true; + setRotation(ink, 0F, 0F, 0F); + book = new ModelRenderer(this, 16, 35); + book.addBox(-3F, -1F, -4F, 6, 3, 8); + book.setRotationPoint(-4F, 2F, 4F); + book.setTextureSize(64, 64); + book.mirror = true; + setRotation(book, 0F, -0.1396263F, 0F); + papers2 = new ModelRenderer(this, 0, 51); + papers2.addBox(-3F, -1F, -4F, 6, 1, 8); + papers2.setRotationPoint(0F, 14F, 0F); + papers2.setTextureSize(64, 64); + papers2.mirror = true; + setRotation(papers2, 0F, 0.6283185F, 0F); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } + + public void renderModel(float f) { + top.render(f); + bottom.render(f); + FLleg.render(f); + BLleg.render(f); + FRleg.render(f); + BRleg.render(f); + papers.render(f); + papers2.render(f); + ink.render(f); + book.render(f); + + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelRoast.java b/src/main/java/minefantasy/mf2/client/render/block/ModelRoast.java index a86220dc..278b7695 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelRoast.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelRoast.java @@ -8,79 +8,75 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelRoast extends ModelBase { ModelRenderer side2B; - ModelRenderer side1B; - ModelRenderer Top; - ModelRenderer side2; - ModelRenderer side1; - - public ModelRoast() - { + ModelRenderer side1B; + ModelRenderer Top; + ModelRenderer side2; + ModelRenderer side1; + + public ModelRoast() { textureWidth = 64; textureHeight = 32; - - side2B = new ModelRenderer(this, 10, 4); - side1B = new ModelRenderer(this, 10, 4); - Top = new ModelRenderer(this, 0, 0); - side2 = new ModelRenderer(this, 0, 4); - side1 = new ModelRenderer(this, 0, 4); - - side2B.addBox(7F, 22F, -1.5F, 2, 17, 3); - side2B.setRotationPoint(0F, 2F, 0F); - side2B.setTextureSize(64, 32); - side2B.mirror = true; - side1B.mirror = true; - side1B.addBox(-9F, 22F, -1.5F, 2, 17, 3); - side1B.setRotationPoint(0F, 2F, 0F); - side1B.setTextureSize(64, 32); - side1B.mirror = true; - side1B.mirror = false; - Top.addBox(-8F, 12F, -1F, 16, 2, 2); - Top.setRotationPoint(0F, 2F, 0F); - Top.setTextureSize(64, 32); - Top.mirror = true; - side2.addBox(7F, 5F, -1.5F, 2, 17, 3); - side2.setRotationPoint(0F, 2F, 0F); - side2.setTextureSize(64, 32); - side2.mirror = true; - side1.addBox(-9F, 5F, -1.5F, 2, 17, 3); - side1.setRotationPoint(0F, 2F, 0F); - side1.setTextureSize(64, 32); - side1.mirror = true; - } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - Top.render(f5); - side1.render(f5); - side2.render(f5); - } + side2B = new ModelRenderer(this, 10, 4); + side1B = new ModelRenderer(this, 10, 4); + Top = new ModelRenderer(this, 0, 0); + side2 = new ModelRenderer(this, 0, 4); + side1 = new ModelRenderer(this, 0, 4); + + side2B.addBox(7F, 22F, -1.5F, 2, 17, 3); + side2B.setRotationPoint(0F, 2F, 0F); + side2B.setTextureSize(64, 32); + side2B.mirror = true; + side1B.mirror = true; + side1B.addBox(-9F, 22F, -1.5F, 2, 17, 3); + side1B.setRotationPoint(0F, 2F, 0F); + side1B.setTextureSize(64, 32); + side1B.mirror = true; + side1B.mirror = false; + Top.addBox(-8F, 12F, -1F, 16, 2, 2); + Top.setRotationPoint(0F, 2F, 0F); + Top.setTextureSize(64, 32); + Top.mirror = true; + side2.addBox(7F, 5F, -1.5F, 2, 17, 3); + side2.setRotationPoint(0F, 2F, 0F); + side2.setTextureSize(64, 32); + side2.mirror = true; + side1.addBox(-9F, 5F, -1.5F, 2, 17, 3); + side1.setRotationPoint(0F, 2F, 0F); + side1.setTextureSize(64, 32); + side1.mirror = true; + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + Top.render(f5); + side1.render(f5); + side2.render(f5); + } + + public void renderModel(float f5) { + Top.render(f5); + side1.render(f5); + side2.render(f5); + } - public void renderModel(float f5) - { - Top.render(f5); - side1.render(f5); - side2.render(f5); - } - - public void renderModel(boolean L, boolean R, float scale, boolean base) - { - Top.render(scale); - if(L) - side1.render(scale); - if(R) - side2.render(scale); - if(base) - { - if(L) - side1B.render(scale); - if(R) - side2B.render(scale); - } - } + public void renderModel(boolean L, boolean R, float scale, boolean base) { + Top.render(scale); + if (L) + side1.render(scale); + if (R) + side2.render(scale); + if (base) { + if (L) + side1B.render(scale); + if (R) + side2B.render(scale); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelSmallCrate.java b/src/main/java/minefantasy/mf2/client/render/block/ModelSmallCrate.java index 9133af62..f03404eb 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelSmallCrate.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelSmallCrate.java @@ -1,64 +1,60 @@ package minefantasy.mf2.client.render.block; -import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; /** * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelSmallCrate extends ModelAmmoBox -{ - public ModelSmallCrate() - { - textureWidth = 64; - textureHeight = 32; - - LeftWall = new ModelRenderer(this, 40, 1); - LeftWall.addBox(-8F, -7F, -5F, 1, 7, 10); - LeftWall.setRotationPoint(0F, 0F, 0F); - LeftWall.setTextureSize(64, 32); - setRotation(LeftWall, 0F, 0F, 0F); - FrontWall = new ModelRenderer(this, 0, 10); - FrontWall.addBox(-7F, -7F, -6F, 14, 8, 1); - FrontWall.setRotationPoint(0F, 0F, 0F); - FrontWall.setTextureSize(64, 32); - setRotation(FrontWall, 0F, 0F, 0F); - BackWall = new ModelRenderer(this, 0, 10); - BackWall.addBox(-7F, -7F, 5F, 14, 8, 1); - BackWall.setRotationPoint(0F, 0F, 0F); - BackWall.setTextureSize(64, 32); - setRotation(BackWall, 0F, 0F, 0F); - RightWall = new ModelRenderer(this, 40, 1); - RightWall.addBox(7F, -7F, -5F, 1, 7, 10); - RightWall.setRotationPoint(0F, 0F, 0F); - RightWall.setTextureSize(64, 32); - setRotation(RightWall, 0F, 0F, 0F); - lid = new ModelRenderer(this, 0, 19); - lid.addBox(-7F, -1F, -12F, 14, 1, 12); - lid.setRotationPoint(0F, -7F, 6F); - lid.setTextureSize(64, 32); - setRotation(lid, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-7F, 0F, -5F, 14, 1, 10); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - setRotation(Base, 0F, 0F, 0F); - lock2 = new ModelRenderer(this, 0, 0); - lock2.addBox(2F, -1.5F, -12.5F, 2, 3, 2); - lock2.setRotationPoint(0F, -7F, 6F); - lock2.setTextureSize(64, 32); - setRotation(lock2, 0F, 0F, 0F); - lock1 = new ModelRenderer(this, 0, 0); - lock1.addBox(-4F, -1.5F, -12.5F, 2, 3, 2); - lock1.setRotationPoint(0F, -7F, 6F); - lock1.setTextureSize(64, 32); - setRotation(lock1, 0F, 0F, 0F); - - RightWall.mirror = true; - } +public class ModelSmallCrate extends ModelAmmoBox { + public ModelSmallCrate() { + textureWidth = 64; + textureHeight = 32; + + LeftWall = new ModelRenderer(this, 40, 1); + LeftWall.addBox(-8F, -7F, -5F, 1, 7, 10); + LeftWall.setRotationPoint(0F, 0F, 0F); + LeftWall.setTextureSize(64, 32); + setRotation(LeftWall, 0F, 0F, 0F); + FrontWall = new ModelRenderer(this, 0, 10); + FrontWall.addBox(-7F, -7F, -6F, 14, 8, 1); + FrontWall.setRotationPoint(0F, 0F, 0F); + FrontWall.setTextureSize(64, 32); + setRotation(FrontWall, 0F, 0F, 0F); + BackWall = new ModelRenderer(this, 0, 10); + BackWall.addBox(-7F, -7F, 5F, 14, 8, 1); + BackWall.setRotationPoint(0F, 0F, 0F); + BackWall.setTextureSize(64, 32); + setRotation(BackWall, 0F, 0F, 0F); + RightWall = new ModelRenderer(this, 40, 1); + RightWall.addBox(7F, -7F, -5F, 1, 7, 10); + RightWall.setRotationPoint(0F, 0F, 0F); + RightWall.setTextureSize(64, 32); + setRotation(RightWall, 0F, 0F, 0F); + lid = new ModelRenderer(this, 0, 19); + lid.addBox(-7F, -1F, -12F, 14, 1, 12); + lid.setRotationPoint(0F, -7F, 6F); + lid.setTextureSize(64, 32); + setRotation(lid, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-7F, 0F, -5F, 14, 1, 10); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + setRotation(Base, 0F, 0F, 0F); + lock2 = new ModelRenderer(this, 0, 0); + lock2.addBox(2F, -1.5F, -12.5F, 2, 3, 2); + lock2.setRotationPoint(0F, -7F, 6F); + lock2.setTextureSize(64, 32); + setRotation(lock2, 0F, 0F, 0F); + lock1 = new ModelRenderer(this, 0, 0); + lock1.addBox(-4F, -1.5F, -12.5F, 2, 3, 2); + lock1.setRotationPoint(0F, -7F, 6F); + lock1.setTextureSize(64, 32); + setRotation(lock1, 0F, 0F, 0F); + + RightWall.mirror = true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelTanningRack.java b/src/main/java/minefantasy/mf2/client/render/block/ModelTanningRack.java index 64368277..8305af5a 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelTanningRack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelTanningRack.java @@ -8,68 +8,67 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelTanningRack extends ModelBase { - //fields - ModelRenderer Base; - ModelRenderer side2; - ModelRenderer side1; - ModelRenderer Top; - - public ModelTanningRack() - { - textureWidth = 64; - textureHeight = 32; - - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-8F, 22F, -2.5F, 16, 2, 5); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - side2 = new ModelRenderer(this, 54, 0); - side2.addBox(6F, 5F, -1.5F, 2, 17, 3); - side2.setRotationPoint(0F, 0F, 0F); - side2.setTextureSize(64, 32); - side2.mirror = true; - setRotation(side2, 0F, 0F, 0F); - side1 = new ModelRenderer(this, 54, 0); - side1.mirror = true; - side1.addBox(-8F, 5F, -1.5F, 2, 17, 3); - side1.setRotationPoint(0F, 0F, 0F); - side1.setTextureSize(64, 32); - side1.mirror = true; - setRotation(side1, 0F, 0F, 0F); - side1.mirror = false; - Top = new ModelRenderer(this, 0, 27); - Top.addBox(-6F, 6F, -0.5F, 12, 3, 2); - Top.setRotationPoint(0F, 0F, 0F); - Top.setTextureSize(64, 32); - Top.mirror = true; - setRotation(Top, 0F, 0F, 0F); - } + // fields + ModelRenderer Base; + ModelRenderer side2; + ModelRenderer side1; + ModelRenderer Top; - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - Base.render(f5); - Top.render(f5); - side1.render(f5); - side2.render(f5); - } + public ModelTanningRack() { + textureWidth = 64; + textureHeight = 32; - public void renderModel(float f5) { - Base.render(f5); - Top.render(f5); - side1.render(f5); - side2.render(f5); - } + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-8F, 22F, -2.5F, 16, 2, 5); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + side2 = new ModelRenderer(this, 54, 0); + side2.addBox(6F, 5F, -1.5F, 2, 17, 3); + side2.setRotationPoint(0F, 0F, 0F); + side2.setTextureSize(64, 32); + side2.mirror = true; + setRotation(side2, 0F, 0F, 0F); + side1 = new ModelRenderer(this, 54, 0); + side1.mirror = true; + side1.addBox(-8F, 5F, -1.5F, 2, 17, 3); + side1.setRotationPoint(0F, 0F, 0F); + side1.setTextureSize(64, 32); + side1.mirror = true; + setRotation(side1, 0F, 0F, 0F); + side1.mirror = false; + Top = new ModelRenderer(this, 0, 27); + Top.addBox(-6F, 6F, -0.5F, 12, 3, 2); + Top.setRotationPoint(0F, 0F, 0F); + Top.setTextureSize(64, 32); + Top.mirror = true; + setRotation(Top, 0F, 0F, 0F); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + Base.render(f5); + Top.render(f5); + side1.render(f5); + side2.render(f5); + } + + public void renderModel(float f5) { + Base.render(f5); + Top.render(f5); + side1.render(f5); + side2.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelTrough.java b/src/main/java/minefantasy/mf2/client/render/block/ModelTrough.java index 657a9a52..49744d45 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelTrough.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelTrough.java @@ -8,85 +8,80 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelTrough extends ModelBase -{ +public class ModelTrough extends ModelBase { ModelRenderer LeftWall; - ModelRenderer Fill; - ModelRenderer FrontWall; - ModelRenderer BackWall; - ModelRenderer RightWall; - ModelRenderer Base; - - public ModelTrough() - { - textureWidth = 64; - textureHeight = 32; - - LeftWall = new ModelRenderer(this, 42, 15); - LeftWall.addBox(-8F, -6F, -5F, 1, 7, 10); - LeftWall.setRotationPoint(0F, 0F, 0F); - LeftWall.setTextureSize(64, 32); - LeftWall.mirror = true; - setRotation(LeftWall, 0F, 0F, 0F); - Fill = new ModelRenderer(this, 40, 0); - Fill.addBox(-7F, 0F, -5F, 14, 0, 10); - Fill.setRotationPoint(0F, 0F, 0F); - Fill.setTextureSize(64, 32); - Fill.mirror = true; - setRotation(Fill, 0F, 0F, 0F); - FrontWall = new ModelRenderer(this, 0, 11); - FrontWall.addBox(-8F, -6F, -6F, 16, 7, 1); - FrontWall.setRotationPoint(0F, 0F, 0F); - FrontWall.setTextureSize(64, 32); - FrontWall.mirror = true; - setRotation(FrontWall, 0F, 0F, 0F); - BackWall = new ModelRenderer(this, 0, 11); - BackWall.addBox(-8F, -6F, 5F, 16, 7, 1); - BackWall.setRotationPoint(0F, 0F, 0F); - BackWall.setTextureSize(64, 32); - BackWall.mirror = true; - setRotation(BackWall, 0F, 0F, 0F); - RightWall = new ModelRenderer(this, 42, 15); - RightWall.addBox(7F, -6F, -5F, 1, 7, 10); - RightWall.setRotationPoint(0F, 0F, 0F); - RightWall.setTextureSize(64, 32); - RightWall.mirror = true; - setRotation(RightWall, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-7F, 0F, -5F, 14, 1, 10); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + ModelRenderer Fill; + ModelRenderer FrontWall; + ModelRenderer BackWall; + ModelRenderer RightWall; + ModelRenderer Base; - public void renderModel(float f) - { + public ModelTrough() { + textureWidth = 64; + textureHeight = 32; + + LeftWall = new ModelRenderer(this, 42, 15); + LeftWall.addBox(-8F, -6F, -5F, 1, 7, 10); + LeftWall.setRotationPoint(0F, 0F, 0F); + LeftWall.setTextureSize(64, 32); + LeftWall.mirror = true; + setRotation(LeftWall, 0F, 0F, 0F); + Fill = new ModelRenderer(this, 40, 0); + Fill.addBox(-7F, 0F, -5F, 14, 0, 10); + Fill.setRotationPoint(0F, 0F, 0F); + Fill.setTextureSize(64, 32); + Fill.mirror = true; + setRotation(Fill, 0F, 0F, 0F); + FrontWall = new ModelRenderer(this, 0, 11); + FrontWall.addBox(-8F, -6F, -6F, 16, 7, 1); + FrontWall.setRotationPoint(0F, 0F, 0F); + FrontWall.setTextureSize(64, 32); + FrontWall.mirror = true; + setRotation(FrontWall, 0F, 0F, 0F); + BackWall = new ModelRenderer(this, 0, 11); + BackWall.addBox(-8F, -6F, 5F, 16, 7, 1); + BackWall.setRotationPoint(0F, 0F, 0F); + BackWall.setTextureSize(64, 32); + BackWall.mirror = true; + setRotation(BackWall, 0F, 0F, 0F); + RightWall = new ModelRenderer(this, 42, 15); + RightWall.addBox(7F, -6F, -5F, 1, 7, 10); + RightWall.setRotationPoint(0F, 0F, 0F); + RightWall.setTextureSize(64, 32); + RightWall.mirror = true; + setRotation(RightWall, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-7F, 0F, -5F, 14, 1, 10); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderModel(float f) { LeftWall.render(f); RightWall.render(f); FrontWall.render(f); BackWall.render(f); - Base.render(f); + Base.render(f); } - public void renderWater(float f) - { + + public void renderWater(float f) { Fill.render(f); } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelWoodCarpenter.java b/src/main/java/minefantasy/mf2/client/render/block/ModelWoodCarpenter.java index a92ca6fa..8c4c76ba 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelWoodCarpenter.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelWoodCarpenter.java @@ -8,140 +8,135 @@ * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ModelWoodCarpenter extends ModelBase -{ - //fields +public class ModelWoodCarpenter extends ModelBase { + // fields ModelRenderer top; - ModelRenderer FRleg; - ModelRenderer bottom; - ModelRenderer BRleg; - ModelRenderer BLleg; - ModelRenderer FLleg; - ModelRenderer plank2; - ModelRenderer hammerhandle; - ModelRenderer block; - ModelRenderer nail; - ModelRenderer vice; - ModelRenderer hammerhead; - ModelRenderer plank; - - public ModelWoodCarpenter() - { - textureWidth = 64; - textureHeight = 64; - - top = new ModelRenderer(this, 0, 0); - top.addBox(-8F, 4F, -8F, 16, 4, 16); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 64); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - FRleg = new ModelRenderer(this, 0, 35); - FRleg.addBox(3F, 8F, -7F, 4, 12, 4); - FRleg.setRotationPoint(0F, 0F, 0F); - FRleg.setTextureSize(64, 64); - FRleg.mirror = true; - setRotation(FRleg, 0F, 0F, 0F); - bottom = new ModelRenderer(this, 0, 20); - bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); - bottom.setRotationPoint(0F, 0F, 0F); - bottom.setTextureSize(64, 64); - bottom.mirror = true; - setRotation(bottom, 0F, 0F, 0F); - BRleg = new ModelRenderer(this, 0, 35); - BRleg.addBox(3F, 8F, 3F, 4, 12, 4); - BRleg.setRotationPoint(0F, 0F, 0F); - BRleg.setTextureSize(64, 64); - BRleg.mirror = true; - setRotation(BRleg, 0F, 0F, 0F); - BLleg = new ModelRenderer(this, 0, 35); - BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); - BLleg.setRotationPoint(0F, 0F, 0F); - BLleg.setTextureSize(64, 64); - BLleg.mirror = true; - setRotation(BLleg, 0F, 0F, 0F); - FLleg = new ModelRenderer(this, 0, 35); - FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); - FLleg.setRotationPoint(0F, 0F, 0F); - FLleg.setTextureSize(64, 64); - FLleg.mirror = true; - setRotation(FLleg, 0F, 0F, 0F); - plank2 = new ModelRenderer(this, 0, 51); - plank2.addBox(-5F, -1F, -1F, 10, 1, 2); - plank2.setRotationPoint(2F, 4F, 6F); - plank2.setTextureSize(64, 64); - plank2.mirror = true; - setRotation(plank2, 0F, -0.0698132F, 0F); - hammerhandle = new ModelRenderer(this, 5, 51); - hammerhandle.addBox(-3F, 0F, 0F, 6, 1, 1); - hammerhandle.setRotationPoint(-2F, 13F, -2F); - hammerhandle.setTextureSize(64, 64); - hammerhandle.mirror = true; - setRotation(hammerhandle, 0F, 1.570796F, 0F); - block = new ModelRenderer(this, 0, 0); - block.addBox(-2F, -2F, -2F, 4, 4, 4); - block.setRotationPoint(0F, 2F, 0F); - block.setTextureSize(64, 64); - block.mirror = true; - setRotation(block, 0F, -0.0523599F, 0F); - nail = new ModelRenderer(this, 0, 8); - nail.addBox(0F, -2F, 0F, 1, 3, 1); - nail.setRotationPoint(0F, 0F, 0F); - nail.setTextureSize(64, 64); - nail.mirror = true; - setRotation(nail, 0F, 0F, 0F); - vice = new ModelRenderer(this, 4, 11); - vice.addBox(-2F, -1F, -1F, 4, 3, 2); - vice.setRotationPoint(5F, 4F, -8F); - vice.setTextureSize(64, 64); - vice.mirror = true; - setRotation(vice, 0F, 0F, 0F); - hammerhead = new ModelRenderer(this, 4, 12); - hammerhead.addBox(-1F, -1F, -1F, 3, 2, 2); - hammerhead.setRotationPoint(-2F, 13F, 2F); - hammerhead.setTextureSize(64, 64); - hammerhead.mirror = true; - setRotation(hammerhead, 0F, 0F, 0F); - plank = new ModelRenderer(this, 0, 51); - plank.addBox(-5F, -1F, -1F, 10, 1, 2); - plank.setRotationPoint(-4F, 4F, -3F); - plank.setTextureSize(64, 64); - plank.mirror = true; - setRotation(plank, 0F, 0.7679449F, 0F); - } - - @Override -public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + ModelRenderer FRleg; + ModelRenderer bottom; + ModelRenderer BRleg; + ModelRenderer BLleg; + ModelRenderer FLleg; + ModelRenderer plank2; + ModelRenderer hammerhandle; + ModelRenderer block; + ModelRenderer nail; + ModelRenderer vice; + ModelRenderer hammerhead; + ModelRenderer plank; - public void renderModel(float f) - { - top.render(f); - FRleg.render(f); - bottom.render(f); - BRleg.render(f); - BLleg.render(f); - FLleg.render(f); - plank2.render(f); - hammerhandle.render(f); - block.render(f); - nail.render(f); - vice.render(f); - hammerhead.render(f); - plank.render(f); - } + public ModelWoodCarpenter() { + textureWidth = 64; + textureHeight = 64; + + top = new ModelRenderer(this, 0, 0); + top.addBox(-8F, 4F, -8F, 16, 4, 16); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 64); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + FRleg = new ModelRenderer(this, 0, 35); + FRleg.addBox(3F, 8F, -7F, 4, 12, 4); + FRleg.setRotationPoint(0F, 0F, 0F); + FRleg.setTextureSize(64, 64); + FRleg.mirror = true; + setRotation(FRleg, 0F, 0F, 0F); + bottom = new ModelRenderer(this, 0, 20); + bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); + bottom.setRotationPoint(0F, 0F, 0F); + bottom.setTextureSize(64, 64); + bottom.mirror = true; + setRotation(bottom, 0F, 0F, 0F); + BRleg = new ModelRenderer(this, 0, 35); + BRleg.addBox(3F, 8F, 3F, 4, 12, 4); + BRleg.setRotationPoint(0F, 0F, 0F); + BRleg.setTextureSize(64, 64); + BRleg.mirror = true; + setRotation(BRleg, 0F, 0F, 0F); + BLleg = new ModelRenderer(this, 0, 35); + BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); + BLleg.setRotationPoint(0F, 0F, 0F); + BLleg.setTextureSize(64, 64); + BLleg.mirror = true; + setRotation(BLleg, 0F, 0F, 0F); + FLleg = new ModelRenderer(this, 0, 35); + FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); + FLleg.setRotationPoint(0F, 0F, 0F); + FLleg.setTextureSize(64, 64); + FLleg.mirror = true; + setRotation(FLleg, 0F, 0F, 0F); + plank2 = new ModelRenderer(this, 0, 51); + plank2.addBox(-5F, -1F, -1F, 10, 1, 2); + plank2.setRotationPoint(2F, 4F, 6F); + plank2.setTextureSize(64, 64); + plank2.mirror = true; + setRotation(plank2, 0F, -0.0698132F, 0F); + hammerhandle = new ModelRenderer(this, 5, 51); + hammerhandle.addBox(-3F, 0F, 0F, 6, 1, 1); + hammerhandle.setRotationPoint(-2F, 13F, -2F); + hammerhandle.setTextureSize(64, 64); + hammerhandle.mirror = true; + setRotation(hammerhandle, 0F, 1.570796F, 0F); + block = new ModelRenderer(this, 0, 0); + block.addBox(-2F, -2F, -2F, 4, 4, 4); + block.setRotationPoint(0F, 2F, 0F); + block.setTextureSize(64, 64); + block.mirror = true; + setRotation(block, 0F, -0.0523599F, 0F); + nail = new ModelRenderer(this, 0, 8); + nail.addBox(0F, -2F, 0F, 1, 3, 1); + nail.setRotationPoint(0F, 0F, 0F); + nail.setTextureSize(64, 64); + nail.mirror = true; + setRotation(nail, 0F, 0F, 0F); + vice = new ModelRenderer(this, 4, 11); + vice.addBox(-2F, -1F, -1F, 4, 3, 2); + vice.setRotationPoint(5F, 4F, -8F); + vice.setTextureSize(64, 64); + vice.mirror = true; + setRotation(vice, 0F, 0F, 0F); + hammerhead = new ModelRenderer(this, 4, 12); + hammerhead.addBox(-1F, -1F, -1F, 3, 2, 2); + hammerhead.setRotationPoint(-2F, 13F, 2F); + hammerhead.setTextureSize(64, 64); + hammerhead.mirror = true; + setRotation(hammerhead, 0F, 0F, 0F); + plank = new ModelRenderer(this, 0, 51); + plank.addBox(-5F, -1F, -1F, 10, 1, 2); + plank.setRotationPoint(-4F, 4F, -3F); + plank.setTextureSize(64, 64); + plank.mirror = true; + setRotation(plank, 0F, 0.7679449F, 0F); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderModel(float f) { + top.render(f); + FRleg.render(f); + bottom.render(f); + BRleg.render(f); + BLleg.render(f); + FLleg.render(f); + plank2.render(f); + hammerhandle.render(f); + block.render(f); + nail.render(f); + vice.render(f); + hammerhead.render(f); + plank.render(f); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderAmmoBox.java b/src/main/java/minefantasy/mf2/client/render/block/RenderAmmoBox.java index 84c1dece..738c9aa0 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderAmmoBox.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderAmmoBox.java @@ -5,28 +5,29 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockAmmoBox; -import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderAmmoBox implements ISimpleBlockRenderingHandler -{ +public class RenderAmmoBox implements ISimpleBlockRenderingHandler { private static final TileEntityAmmoBoxRenderer invModel = new TileEntityAmmoBoxRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(block == null || !(block instanceof BlockAmmoBox))return; - + if (block == null || !(block instanceof BlockAmmoBox)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockAmmoBox box = (BlockAmmoBox)block; - invModel.renderInvModel(box.getFullTexName(), box.storageType, CustomMaterial.getMaterial("refinedWood"), 0F, 0F, 0F, 0F); + BlockAmmoBox box = (BlockAmmoBox) block; + invModel.renderInvModel(box.getFullTexName(), box.storageType, CustomMaterial.getMaterial("refinedWood"), 0F, + 0F, 0F, 0F); GL11.glPopMatrix(); } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderAnvilMF.java b/src/main/java/minefantasy/mf2/client/render/block/RenderAnvilMF.java index 6970d24f..912af664 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderAnvilMF.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderAnvilMF.java @@ -8,22 +8,24 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; -public class RenderAnvilMF implements ISimpleBlockRenderingHandler -{ +public class RenderAnvilMF implements ISimpleBlockRenderingHandler { private static final TileEntityAnvilMFRenderer renderAnvil = new TileEntityAnvilMFRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(!(block instanceof BlockAnvilMF))return; - + if (!(block instanceof BlockAnvilMF)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockAnvilMF anvil = (BlockAnvilMF)block; + BlockAnvilMF anvil = (BlockAnvilMF) block; renderAnvil.renderModelAt(anvil.material.name, 0, 0.0F, 0.0F, 0.0F, 0.0F, 0); GL11.glPopMatrix(); } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java index 50f9d2c4..9fefe631 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java @@ -4,19 +4,18 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.refining.BlockBellows; -import minefantasy.mf2.block.tileentity.TileEntityBellows; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderBellows implements ISimpleBlockRenderingHandler -{ +public class RenderBellows implements ISimpleBlockRenderingHandler { private static final TileEntityBellowsRenderer invModel = new TileEntityBellowsRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(block == null || !(block instanceof BlockBellows))return; - + if (block == null || !(block instanceof BlockBellows)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); invModel.renderInvModel(0F, 0F, 0F, 0F); @@ -24,7 +23,8 @@ public void renderInventoryBlock(Block block, int metadata, int modelID, RenderB } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java index c46b4806..56c8e206 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java @@ -4,28 +4,28 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.refining.BlockBigFurnace; -import minefantasy.mf2.block.tileentity.TileEntityBigFurnace; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderBigFurnace implements ISimpleBlockRenderingHandler -{ +public class RenderBigFurnace implements ISimpleBlockRenderingHandler { private static final TileEntityBigFurnaceRenderer invModel = new TileEntityBigFurnaceRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(block == null || !(block instanceof BlockBigFurnace))return; - + if (block == null || !(block instanceof BlockBigFurnace)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockBigFurnace furnace = (BlockBigFurnace)block; + BlockBigFurnace furnace = (BlockBigFurnace) block; invModel.renderInvModel(furnace.isHeater, furnace.isHeater ? "furnace_heater" : "furnace_rock", 0F, 0F, 0F, 0F); GL11.glPopMatrix(); } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java index 61bad33b..34977ede 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java @@ -1,32 +1,31 @@ package minefantasy.mf2.client.render.block; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.refining.BlockBloomery; -import minefantasy.mf2.block.tileentity.TileEntityBloomery; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBloomery implements ISimpleBlockRenderingHandler -{ +public class RenderBloomery implements ISimpleBlockRenderingHandler { private static final TileEntityBloomeryRenderer invModel = new TileEntityBloomeryRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(block == null || !(block instanceof BlockBloomery))return; - + if (block == null || !(block instanceof BlockBloomery)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockBloomery bloomery = (BlockBloomery)block; + BlockBloomery bloomery = (BlockBloomery) block; invModel.renderInvModel("bloomery_basic", 0F, 0F, 0F, 0F); GL11.glPopMatrix(); } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBombBench.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBombBench.java index 7644c3f6..f8d2ab38 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBombBench.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBombBench.java @@ -1,19 +1,16 @@ package minefantasy.mf2.client.render.block; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockBombBench; -import minefantasy.mf2.block.tileentity.TileEntityBombBench; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBombBench implements ISimpleBlockRenderingHandler -{ +public class RenderBombBench implements ISimpleBlockRenderingHandler { private static final TileEntityBombBenchRenderer invModel = new TileEntityBombBenchRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { GL11.glPushMatrix(); @@ -23,7 +20,8 @@ public void renderInventoryBlock(Block block, int metadata, int modelID, RenderB } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBombPress.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBombPress.java index 39e28629..29f08546 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBombPress.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBombPress.java @@ -4,15 +4,13 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockBombPress; -import minefantasy.mf2.block.tileentity.TileEntityBombPress; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderBombPress implements ISimpleBlockRenderingHandler -{ +public class RenderBombPress implements ISimpleBlockRenderingHandler { private static final TileEntityBombPressRenderer invModel = new TileEntityBombPressRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { GL11.glPushMatrix(); @@ -22,7 +20,8 @@ public void renderInventoryBlock(Block block, int metadata, int modelID, RenderB } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderCarpenter.java b/src/main/java/minefantasy/mf2/client/render/block/RenderCarpenter.java index 1db34460..531f0259 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderCarpenter.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderCarpenter.java @@ -4,15 +4,13 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockCarpenter; -import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderCarpenter implements ISimpleBlockRenderingHandler -{ +public class RenderCarpenter implements ISimpleBlockRenderingHandler { private static final TileEntityCarpenterRenderer invModel = new TileEntityCarpenterRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { GL11.glPushMatrix(); @@ -22,7 +20,8 @@ public void renderInventoryBlock(Block block, int metadata, int modelID, RenderB } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderCrossbowBench.java b/src/main/java/minefantasy/mf2/client/render/block/RenderCrossbowBench.java index f0dfc6d9..f843d539 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderCrossbowBench.java @@ -4,15 +4,13 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockCrossbowBench; -import minefantasy.mf2.block.tileentity.TileEntityCrossbowBench; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderCrossbowBench implements ISimpleBlockRenderingHandler -{ +public class RenderCrossbowBench implements ISimpleBlockRenderingHandler { private static final TileEntityCrossbowBenchRenderer invModel = new TileEntityCrossbowBenchRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { GL11.glPushMatrix(); @@ -22,7 +20,8 @@ public void renderInventoryBlock(Block block, int metadata, int modelID, RenderB } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderFirepit.java b/src/main/java/minefantasy/mf2/client/render/block/RenderFirepit.java index 27bf5195..e1a55d1a 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderFirepit.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderFirepit.java @@ -4,15 +4,13 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockFirepit; -import minefantasy.mf2.block.tileentity.TileEntityFirepit; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderFirepit implements ISimpleBlockRenderingHandler -{ +public class RenderFirepit implements ISimpleBlockRenderingHandler { private static final TileEntityFirepitRenderer invModel = new TileEntityFirepitRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { GL11.glPushMatrix(); @@ -22,7 +20,8 @@ public void renderInventoryBlock(Block block, int metadata, int modelID, RenderB } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderForge.java b/src/main/java/minefantasy/mf2/client/render/block/RenderForge.java index c7281995..5ef9e85f 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderForge.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderForge.java @@ -8,22 +8,24 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; -public class RenderForge implements ISimpleBlockRenderingHandler -{ +public class RenderForge implements ISimpleBlockRenderingHandler { private static final TileEntityForgeRenderer invModel = new TileEntityForgeRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(block == null || !(block instanceof BlockForge))return; - + if (block == null || !(block instanceof BlockForge)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockForge forge = (BlockForge)block; - invModel.renderInvModel("forge_"+forge.type, 0F, 0F, 0F, 0F); + BlockForge forge = (BlockForge) block; + invModel.renderInvModel("forge_" + forge.type, 0F, 0F, 0F, 0F); GL11.glPopMatrix(); } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderQuern.java b/src/main/java/minefantasy/mf2/client/render/block/RenderQuern.java index 782a66aa..2aac04de 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderQuern.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderQuern.java @@ -4,28 +4,28 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.refining.BlockQuern; -import minefantasy.mf2.block.tileentity.TileEntityQuern; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderQuern implements ISimpleBlockRenderingHandler -{ +public class RenderQuern implements ISimpleBlockRenderingHandler { private static final TileEntityQuernRenderer invModel = new TileEntityQuernRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(block == null || !(block instanceof BlockQuern))return; - + if (block == null || !(block instanceof BlockQuern)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockQuern quern = (BlockQuern)block; + BlockQuern quern = (BlockQuern) block; invModel.renderModelAt(null, "quern_basic", 0F, 0F, 0F, 0F, true); GL11.glPopMatrix(); } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderRack.java b/src/main/java/minefantasy/mf2/client/render/block/RenderRack.java index 19c6dd1c..b8620cdc 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderRack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderRack.java @@ -5,29 +5,28 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockRack; -import minefantasy.mf2.block.decor.BlockTrough; -import minefantasy.mf2.block.tileentity.decor.TileEntityRack; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderRack implements ISimpleBlockRenderingHandler -{ +public class RenderRack implements ISimpleBlockRenderingHandler { private static final TileEntityRackRenderer invModel = new TileEntityRackRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(block == null || !(block instanceof BlockRack))return; - + if (block == null || !(block instanceof BlockRack)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockRack rack = (BlockRack)block; + BlockRack rack = (BlockRack) block; invModel.renderInvModel(CustomMaterial.getMaterial("refinedWood"), rack.getFullTexName(), 0F, 0F, 0F, 0F); GL11.glPopMatrix(); } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderResearch.java b/src/main/java/minefantasy/mf2/client/render/block/RenderResearch.java index b662a171..e1a16885 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderResearch.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderResearch.java @@ -1,19 +1,16 @@ package minefantasy.mf2.client.render.block; +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockResearchStation; -import minefantasy.mf2.block.tileentity.TileEntityResearch; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderResearch implements ISimpleBlockRenderingHandler -{ +public class RenderResearch implements ISimpleBlockRenderingHandler { private static final TileEntityResearchRenderer invModel = new TileEntityResearchRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { GL11.glPushMatrix(); @@ -23,7 +20,8 @@ public void renderInventoryBlock(Block block, int metadata, int modelID, RenderB } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderRoast.java b/src/main/java/minefantasy/mf2/client/render/block/RenderRoast.java index fcc3717d..d82d14d8 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderRoast.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderRoast.java @@ -8,15 +8,15 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; -public class RenderRoast implements ISimpleBlockRenderingHandler -{ +public class RenderRoast implements ISimpleBlockRenderingHandler { private static final TileEntityRoastRenderer invModel = new TileEntityRoastRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(!(block instanceof BlockRoast))return; - BlockRoast roast = (BlockRoast)block; - if(roast.isOven()) - { + if (!(block instanceof BlockRoast)) + return; + BlockRoast roast = (BlockRoast) block; + if (roast.isOven()) { GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); invModel.renderInvModel(roast.tex, true, 0F, 0F, 0F, 0F); @@ -25,7 +25,8 @@ public void renderInventoryBlock(Block block, int metadata, int modelID, RenderB } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderSmokePipe.java b/src/main/java/minefantasy/mf2/client/render/block/RenderSmokePipe.java index adb44c58..5e599c12 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderSmokePipe.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderSmokePipe.java @@ -8,26 +8,26 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; -public class RenderSmokePipe implements ISimpleBlockRenderingHandler -{ +public class RenderSmokePipe implements ISimpleBlockRenderingHandler { private static final TileEntitySmokePipeRenderer tileRender = new TileEntitySmokePipeRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(!(block instanceof BlockChimney))return; - + if (!(block instanceof BlockChimney)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - - if(((BlockChimney)block).isPipe()) - { + + if (((BlockChimney) block).isPipe()) { tileRender.renderAModelAt(null, 0D, 0D, 0D, 0F); } GL11.glPopMatrix(); } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) - { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderTanningRack.java b/src/main/java/minefantasy/mf2/client/render/block/RenderTanningRack.java index fc7c79d0..77b08d87 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderTanningRack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderTanningRack.java @@ -4,28 +4,28 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockTanningRack; -import minefantasy.mf2.block.tileentity.TileEntityTanningRack; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderTanningRack implements ISimpleBlockRenderingHandler -{ +public class RenderTanningRack implements ISimpleBlockRenderingHandler { private static final TileEntityTanningRackRenderer invModel = new TileEntityTanningRackRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(!(block instanceof BlockTanningRack))return; - + if (!(block instanceof BlockTanningRack)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockTanningRack rack = (BlockTanningRack)block; + BlockTanningRack rack = (BlockTanningRack) block; invModel.renderInvModel(rack.tex, rack.tex.equalsIgnoreCase("metal"), 0F, 0F, 0F, 0F); GL11.glPopMatrix(); } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java b/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java index fef0d10c..84f5142d 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java @@ -5,28 +5,28 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockTrough; -import minefantasy.mf2.block.tileentity.decor.TileEntityTrough; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.world.IBlockAccess; -public class RenderTrough implements ISimpleBlockRenderingHandler -{ +public class RenderTrough implements ISimpleBlockRenderingHandler { private static final TileEntityTroughRenderer invModel = new TileEntityTroughRenderer(); + @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if(block == null || !(block instanceof BlockTrough))return; - + if (block == null || !(block instanceof BlockTrough)) + return; + GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockTrough trough = (BlockTrough)block; + BlockTrough trough = (BlockTrough) block; invModel.renderInvModel(trough.getFullTexName(), CustomMaterial.getMaterial("refinedWood"), 0F, 0F, 0F, 0F); GL11.glPopMatrix(); } @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { return false; } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityAmmoBoxRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityAmmoBoxRenderer.java index 67208eaa..1954c8b3 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityAmmoBoxRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityAmmoBoxRenderer.java @@ -8,110 +8,101 @@ import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -public class TileEntityAmmoBoxRenderer extends TileEntitySpecialRenderer -{ - public TileEntityAmmoBoxRenderer() - { - model = new ModelAmmoBox(); - modelbig = new ModelSmallCrate(); - modelsml = new ModelFoodBox(); - } - - public void renderAModelAt(TileEntityAmmoBox tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } + +public class TileEntityAmmoBoxRenderer extends TileEntitySpecialRenderer { + public TileEntityAmmoBoxRenderer() { + model = new ModelAmmoBox(); + modelbig = new ModelSmallCrate(); + modelsml = new ModelFoodBox(); + } + + public void renderAModelAt(TileEntityAmmoBox tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } this.renderModelAt(tile, i, d, d1, d2, f); - } - - public void renderInvModel(String tex, byte type, CustomMaterial material, double d, double d1, double d2, float f) - { + } + + public void renderInvModel(String tex, byte type, CustomMaterial material, double d, double d1, double d2, + float f) { ModelAmmoBox baseMdl = type == 0 ? modelsml : type == 1 ? model : modelbig; int i = 2; int j = 450 - (90 * i); - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1/16F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j+90, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - - GL11.glColor3f((float)material.colourRGB[0]/255F, (float)material.colourRGB[1]/255F, (float)material.colourRGB[2]/255F); - - bindTextureByName("textures/models/tileentity/"+tex+"_base.png"); //texture - baseMdl.renderModel(0.0625F); - baseMdl.renderLid(0.0625F, 0F); - - GL11.glColor3f(1F, 1F, 1F); - - bindTextureByName("textures/models/tileentity/"+tex+"_detail.png"); //texture - baseMdl.renderModel(0.0625F); - baseMdl.renderLid(0.0625F, 0F); - GL11.glPopMatrix(); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); //end - - } - - public void renderModelAt(TileEntityAmmoBox tile, int meta, double d, double d1, double d2, float f) - { + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1 / 16F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 90, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tex + "_base.png"); // texture + baseMdl.renderModel(0.0625F); + baseMdl.renderLid(0.0625F, 0F); + + GL11.glColor3f(1F, 1F, 1F); + + bindTextureByName("textures/models/tileentity/" + tex + "_detail.png"); // texture + baseMdl.renderModel(0.0625F); + baseMdl.renderLid(0.0625F, 0F); + GL11.glPopMatrix(); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); // end + + } + + public void renderModelAt(TileEntityAmmoBox tile, int meta, double d, double d1, double d2, float f) { ModelAmmoBox baseMdl = tile.getStorageType() == 0 ? modelsml : tile.getStorageType() == 1 ? model : modelbig; int i = meta; - if(!tile.hasWorldObj()) - { + if (!tile.hasWorldObj()) { i = 2; } int j = 450 - (90 * i); - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1/16F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j+90, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - - CustomMaterial material = tile.getMaterial(); - GL11.glColor3f((float)material.colourRGB[0]/255F, (float)material.colourRGB[1]/255F, (float)material.colourRGB[2]/255F); - - bindTextureByName("textures/models/tileentity/"+tile.getTexName()+"_base.png"); //texture - baseMdl.renderModel(0.0625F); - baseMdl.renderLid(0.0625F, tile.angle); - - GL11.glColor3f(1F, 1F, 1F); - - bindTextureByName("textures/models/tileentity/"+tile.getTexName()+"_detail.png"); //texture - baseMdl.renderModel(0.0625F); - baseMdl.renderLid(0.0625F, tile.angle); - GL11.glPopMatrix(); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); //end - - } - - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1 / 16F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 90, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + + CustomMaterial material = tile.getMaterial(); + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_base.png"); // texture + baseMdl.renderModel(0.0625F); + baseMdl.renderLid(0.0625F, tile.angle); + + GL11.glColor3f(1F, 1F, 1F); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_detail.png"); // texture + baseMdl.renderModel(0.0625F); + baseMdl.renderLid(0.0625F, tile.angle); + GL11.glPopMatrix(); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); // end + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityAmmoBox) tileentity, d, d1, d2, f); //where to render - } - - private ModelAmmoBox modelbig, model, modelsml; - private Random random = new Random(); + renderAModelAt((TileEntityAmmoBox) tileentity, d, d1, d2, f); // where to render + } + + private ModelAmmoBox modelbig, model, modelsml; + private Random random = new Random(); } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityAnvilMFRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityAnvilMFRenderer.java index 38b005bb..a4119e78 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityAnvilMFRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityAnvilMFRenderer.java @@ -2,108 +2,97 @@ import java.util.Random; -import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; +import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; - public class TileEntityAnvilMFRenderer extends TileEntitySpecialRenderer { - public TileEntityAnvilMFRenderer() - { - model = new ModelAnvil(); - } + public TileEntityAnvilMFRenderer() { + model = new ModelAnvil(); + } + + public void renderAModelAt(TileEntityAnvilMF tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + for (int a = 0; a < 2; a++) { + if (shouldRender(tile, a)) { + this.renderModelAt(tile.getTextureName(), i, d, d1, d2, f, a); + } + } + } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + if (renderPass == 1) { + bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture + } else { + bindTextureByName("textures/models/tileentity/anvil" + tex + ".png"); // texture + } + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 0F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + (0.3F * scale) + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end - public void renderAModelAt(TileEntityAnvilMF tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } - for(int a = 0; a < 2; a ++) - { - if(shouldRender(tile, a)) - { - this.renderModelAt(tile.getTextureName(), i, d, d1, d2, f, a); - } - } - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) - { - int i = meta; - - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - if(renderPass == 1) - { - bindTextureByName("textures/models/tileentity/anvilGrid.png"); //texture - } - else - { - bindTextureByName("textures/models/tileentity/anvil"+tex+".png"); //texture - } - - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 0F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + (0.3F*scale)+yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j+180F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityAnvilMF) tileentity, d, d1, d2, f); //where to render - } - - private ModelAnvil model; - private Random random = new Random(); - - - private boolean shouldRender(TileEntityAnvilMF tile, int p) - { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if(p == 1)//GRID - { - return false; - } - return true; + renderAModelAt((TileEntityAnvilMF) tileentity, d, d1, d2, f); // where to render + } + + private ModelAnvil model; + private Random random = new Random(); + + private boolean shouldRender(TileEntityAnvilMF tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBellowsRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBellowsRenderer.java index 5347b6e0..3f87ef03 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBellowsRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBellowsRenderer.java @@ -2,107 +2,100 @@ import java.util.Random; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityBellows; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; +public class TileEntityBellowsRenderer extends TileEntitySpecialRenderer { + public TileEntityBellowsRenderer() { + model = new ModelBellows(); + } -public class TileEntityBellowsRenderer extends TileEntitySpecialRenderer -{ - public TileEntityBellowsRenderer() - { - model = new ModelBellows(); - } - - public void renderAModelAt(TileEntityBellows tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } + public void renderAModelAt(TileEntityBellows tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } this.renderModelAt(tile, i, d, d1, d2, f); - } - - public void renderInvModel(double d, double d1, double d2, float f) - { + } + + public void renderInvModel(double d, double d1, double d2, float f) { int j = 90; - model.rotate(0); - bindTextureByName("textures/models/tileentity/bellows.png"); //texture - - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1.525F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - model.renderModel(0, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - - public void renderModelAt(TileEntityBellows tile, int meta, double d, double d1, double d2, float f) - { + model.rotate(0); + bindTextureByName("textures/models/tileentity/bellows.png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.525F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + model.renderModel(0, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + public void renderModelAt(TileEntityBellows tile, int meta, double d, double d1, double d2, float f) { int i = meta; - int j = 90 * i; - if (i == 1) { - j = 0; - } - - if (i == 2) { - j = 270; - } - - if (i == 3) { - j = 180; - } - - if (i == 0) { - j = 90; - } - if (i == 0) { - j = 90; - } - model.rotate(tile.press); - bindTextureByName("textures/models/tileentity/bellows.png"); //texture - - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1.525F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - model.renderModel(tile.press, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + if (i == 1) { + j = 0; + } + + if (i == 2) { + j = 270; + } + + if (i == 3) { + j = 180; + } + + if (i == 0) { + j = 90; + } + if (i == 0) { + j = 90; + } + model.rotate(tile.press); + bindTextureByName("textures/models/tileentity/bellows.png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.525F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + model.renderModel(tile.press, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityBellows) tileentity, d, d1, d2, f); //where to render - } - - private ModelBellows model; - private Random random = new Random(); + renderAModelAt((TileEntityBellows) tileentity, d, d1, d2, f); // where to render + } + + private ModelBellows model; + private Random random = new Random(); } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBigFurnaceRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBigFurnaceRenderer.java index 908e6913..f51498ae 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBigFurnaceRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBigFurnaceRenderer.java @@ -14,26 +14,21 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; - /** * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class TileEntityBigFurnaceRenderer extends TileEntitySpecialRenderer -{ - public TileEntityBigFurnaceRenderer() - { +public class TileEntityBigFurnaceRenderer extends TileEntitySpecialRenderer { + public TileEntityBigFurnaceRenderer() { model = new ModelBigFurnace(); } - public void renderAModelAt(TileEntityBigFurnace tile, double d, double d1, double d2, float f) - { + public void renderAModelAt(TileEntityBigFurnace tile, double d, double d1, double d2, float f) { int i = 1; - if (tile.hasWorldObj()) - { + if (tile.hasWorldObj()) { i = tile.getBlockMetadata(); } @@ -74,7 +69,7 @@ public void renderAModelAt(TileEntityBigFurnace tile, double d, double d1, doubl model.renderModel(display, 0.0625F); float sc = 0.75F; - float angle = 90F / 20F * (float) tile.doorAngle; + float angle = 90F / 20F * tile.doorAngle; GL11.glPushMatrix(); GL11.glTranslatef(-pixel(8), -pixel(12), 0); if (tile.isHeater()) { @@ -97,8 +92,7 @@ public void renderAModelAt(TileEntityBigFurnace tile, double d, double d1, doubl } - public void renderInvModel(boolean heater, String type, double d, double d1, double d2, float f) - { + public void renderInvModel(boolean heater, String type, double d, double d1, double d2, float f) { int j = 90; bindTextureByName("textures/models/tileentity/" + type + ".png"); // texture @@ -135,80 +129,75 @@ public void renderInvModel(boolean heater, String type, double d, double d1, dou GL11.glPopMatrix(); // end } - private void bindTextureByName(String image) - { + + private void bindTextureByName(String image) { bindTexture(TextureHelperMF.getResource(image)); } -public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { -renderAModelAt((TileEntityBigFurnace) tileentity, d, d1, d2, f); //where to render -} - - -private void renderDoor(int x, int y, int w, int h, int tw, int th) { - Minecraft mc = Minecraft.getMinecraft(); - - float f = 0.01F / (float)tw; - float f1 = 0.01F / (float)th; - - float x1 = (float)x / (float)tw + f; - float x2 = (float)(x + w) / tw - f; - float y1 = (float)y / th + f1; - float y2 = (float)(y + h) / th - f1; - - Tessellator image = Tessellator.instance; - float xPos = 0.5F; - float yPos = 0.0F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-xPos, -yPos, pixel(0.5F)); - float var13 = 1F; - GL11.glScalef(var13, var13, var13); - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(-1F, -1F, 0.0F); - ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, tw, th, 0.0625F); - - -} -@Override -protected void bindTexture(ResourceLocation p_147499_1_) -{ - TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; - - if (texturemanager != null) - { - texturemanager.bindTexture(p_147499_1_); - } -} - -private void renderDoorHeater(int x, int y, int w, int h, int tw, int th) { - Minecraft mc = Minecraft.getMinecraft(); - - float f = 0.01F / (float)tw; - float f1 = 0.01F / (float)th; - - float x1 = (float)x / (float)tw + f; - float x2 = (float)(x + w) / tw - f; - float y1 = (float)y / th + f1; - float y2 = (float)(y + h) / th - f1; - - Tessellator image = Tessellator.instance; - float xPos = 0.5F; - float yPos = 1.0F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-xPos, -yPos, pixel(0.5F)); - float var13 = 1F; - GL11.glScalef(var13, var13, var13); - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(-1F, -1F, 0.0F); - ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, tw, th, 0.0625F); - - -} -public float pixel(float count) -{ - return count * 0.0625F; -} - - -private ModelBigFurnace model; + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityBigFurnace) tileentity, d, d1, d2, f); // where to render + } + + private void renderDoor(int x, int y, int w, int h, int tw, int th) { + Minecraft mc = Minecraft.getMinecraft(); + + float f = 0.01F / tw; + float f1 = 0.01F / th; + + float x1 = (float) x / (float) tw + f; + float x2 = (float) (x + w) / tw - f; + float y1 = (float) y / th + f1; + float y2 = (float) (y + h) / th - f1; + + Tessellator image = Tessellator.instance; + float xPos = 0.5F; + float yPos = 0.0F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-xPos, -yPos, pixel(0.5F)); + float var13 = 1F; + GL11.glScalef(var13, var13, var13); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-1F, -1F, 0.0F); + ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, tw, th, 0.0625F); + + } + + @Override + protected void bindTexture(ResourceLocation p_147499_1_) { + TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + + if (texturemanager != null) { + texturemanager.bindTexture(p_147499_1_); + } + } + + private void renderDoorHeater(int x, int y, int w, int h, int tw, int th) { + Minecraft mc = Minecraft.getMinecraft(); + + float f = 0.01F / tw; + float f1 = 0.01F / th; + + float x1 = (float) x / (float) tw + f; + float x2 = (float) (x + w) / tw - f; + float y1 = (float) y / th + f1; + float y2 = (float) (y + h) / th - f1; + + Tessellator image = Tessellator.instance; + float xPos = 0.5F; + float yPos = 1.0F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-xPos, -yPos, pixel(0.5F)); + float var13 = 1F; + GL11.glScalef(var13, var13, var13); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-1F, -1F, 0.0F); + ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, tw, th, 0.0625F); + + } + + public float pixel(float count) { + return count * 0.0625F; + } + + private ModelBigFurnace model; } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBloomeryRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBloomeryRenderer.java index f39c0568..bde9cf42 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBloomeryRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBloomeryRenderer.java @@ -2,105 +2,98 @@ import java.util.Random; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityBloomery; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; +public class TileEntityBloomeryRenderer extends TileEntitySpecialRenderer { + public TileEntityBloomeryRenderer() { + model = new ModelBloomery(); + } -public class TileEntityBloomeryRenderer extends TileEntitySpecialRenderer -{ - public TileEntityBloomeryRenderer() - { - model = new ModelBloomery(); - } - - public void renderAModelAt(TileEntityBloomery tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } + public void renderAModelAt(TileEntityBloomery tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } this.renderModelAt(tile, tile.getTextureName(), i, d, d1, d2, f, tile.getWorldObj() == null); - } - - public void renderModelAt(TileEntityBloomery tile, String tex, int meta, double d, double d1, double d2, float f, boolean inv) - { - int i = meta; - - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - bindTextureByName("textures/models/tileentity/"+tex+".png"); //texture - - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1.0F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j-90F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(tile, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - - public void renderInvModel(String tex, double d, double d1, double d2, float f) - { - int j = 90; - bindTextureByName("textures/models/tileentity/"+tex+".png"); //texture - - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1.0F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j-90F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(null, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); } + + public void renderModelAt(TileEntityBloomery tile, String tex, int meta, double d, double d1, double d2, float f, + boolean inv) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.0F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(tile, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + public void renderInvModel(String tex, double d, double d1, double d2, float f) { + int j = 90; + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.0F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(null, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityBloomery) tileentity, d, d1, d2, f); //where to render - } - - private ModelBloomery model; - private Random random = new Random(); - + renderAModelAt((TileEntityBloomery) tileentity, d, d1, d2, f); // where to render + } + + private ModelBloomery model; + private Random random = new Random(); + } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombBenchRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombBenchRenderer.java index e0bcb680..3fe03f50 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombBenchRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombBenchRenderer.java @@ -2,115 +2,102 @@ import java.util.Random; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; - - /** * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. * - * Custom renderers based off render tutorial by MC_DucksAreBest + * Custom renderers based off render tutorial by MC_DucksAreBest */ -public class TileEntityBombBenchRenderer extends TileEntitySpecialRenderer -{ - public TileEntityBombBenchRenderer() - { - model = new ModelBombBench(); - } - - public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } - for(int a = 0; a < 2; a ++) - { - if(shouldRender(tile, a)) - { - this.renderModelAt("carpenter_bomb", i, d, d1, d2, f, a); - } - } - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) - { - int i = meta; - - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - if(renderPass == 1) - { - bindTextureByName("textures/models/tileentity/anvilGrid.png"); //texture - } - else - { - bindTextureByName("textures/models/tileentity/"+tex+".png"); //texture - } - - GL11.glPushMatrix(); //start - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); //size - GL11.glRotatef(j+180F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(1F, -1F, -1F); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); +public class TileEntityBombBenchRenderer extends TileEntitySpecialRenderer { + public TileEntityBombBenchRenderer() { + model = new ModelBombBench(); + } + + public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + for (int a = 0; a < 2; a++) { + if (shouldRender(tile, a)) { + this.renderModelAt("carpenter_bomb", i, d, d1, d2, f, a); + } + } + } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + if (renderPass == 1) { + bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture + } else { + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + } + + GL11.glPushMatrix(); // start + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt (tileentity, d, d1, d2, f); //where to render - } - - private ModelBombBench model; - private Random random = new Random(); - - - private boolean shouldRender(TileEntity tile, int p) - { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if(p == 1)//GRID - { - return false; - } - return true; + renderAModelAt(tileentity, d, d1, d2, f); // where to render + } + + private ModelBombBench model; + private Random random = new Random(); + + private boolean shouldRender(TileEntity tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombPressRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombPressRenderer.java index c5961579..528561fc 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombPressRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombPressRenderer.java @@ -2,6 +2,8 @@ import java.util.Random; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityBombPress; import net.minecraft.client.Minecraft; @@ -9,101 +11,90 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; - - /** * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. * - * Custom renderers based off render tutorial by MC_DucksAreBest + * Custom renderers based off render tutorial by MC_DucksAreBest */ -public class TileEntityBombPressRenderer extends TileEntitySpecialRenderer -{ - public TileEntityBombPressRenderer() - { - model = new ModelBombPress(); - } - - public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } - for(int a = 0; a < 2; a ++) - { - if(shouldRender(tile, a)) - { - this.renderModelAt("bombPress", i, d, d1, d2, f, a, ((TileEntityBombPress)tile).animation); - } - } - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass, float animation) - { - int i = meta; - - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - bindTextureByName("textures/models/tileentity/"+tex+".png"); //texture - - GL11.glPushMatrix(); //start - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1, (float) d2 + 0.5F); //size - GL11.glRotatef(j+180F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(1F, -1F, -1F); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F, animation); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); +public class TileEntityBombPressRenderer extends TileEntitySpecialRenderer { + public TileEntityBombPressRenderer() { + model = new ModelBombPress(); } + + public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + for (int a = 0; a < 2; a++) { + if (shouldRender(tile, a)) { + this.renderModelAt("bombPress", i, d, d1, d2, f, a, ((TileEntityBombPress) tile).animation); + } + } + } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass, + float animation) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F, animation); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt (tileentity, d, d1, d2, f); //where to render - } - - private ModelBombPress model; - private Random random = new Random(); - - - private boolean shouldRender(TileEntity tile, int p) - { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if(p == 1)//GRID - { - return false; - } - return true; + renderAModelAt(tileentity, d, d1, d2, f); // where to render + } + + private ModelBombPress model; + private Random random = new Random(); + + private boolean shouldRender(TileEntity tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityCarpenterRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityCarpenterRenderer.java index c4bdab5e..2a75ca83 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityCarpenterRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityCarpenterRenderer.java @@ -2,106 +2,93 @@ import java.util.Random; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; -import minefantasy.mf2.block.tileentity.TileEntityBombBench; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; +public class TileEntityCarpenterRenderer extends TileEntitySpecialRenderer { + public TileEntityCarpenterRenderer() { + model = new ModelWoodCarpenter(); + } -public class TileEntityCarpenterRenderer extends TileEntitySpecialRenderer -{ - public TileEntityCarpenterRenderer() - { - model = new ModelWoodCarpenter(); - } - - public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } - for(int a = 0; a < 2; a ++) - { - if(shouldRender(tile, a)) - { - this.renderModelAt("carpenter", i, d, d1, d2, f, a); - } - } - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) - { - int i = meta; - - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - if(renderPass == 1) - { - bindTextureByName("textures/models/tileentity/anvilGrid.png"); //texture - } - else - { - bindTextureByName("textures/models/tileentity/"+tex+".png"); //texture - } - - GL11.glPushMatrix(); //start - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); //size - GL11.glRotatef(j+180F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(1F, -1F, -1F); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + for (int a = 0; a < 2; a++) { + if (shouldRender(tile, a)) { + this.renderModelAt("carpenter", i, d, d1, d2, f, a); + } + } } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + if (renderPass == 1) { + bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture + } else { + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + } + + GL11.glPushMatrix(); // start + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt (tileentity, d, d1, d2, f); //where to render - } - - private ModelWoodCarpenter model; - private Random random = new Random(); - - - private boolean shouldRender(TileEntity tile, int p) - { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if(p == 1)//GRID - { - return false; - } - return true; + renderAModelAt(tileentity, d, d1, d2, f); // where to render + } + + private ModelWoodCarpenter model; + private Random random = new Random(); + + private boolean shouldRender(TileEntity tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityCrossbowBenchRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityCrossbowBenchRenderer.java index 4294289d..0765260b 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityCrossbowBenchRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityCrossbowBenchRenderer.java @@ -2,115 +2,102 @@ import java.util.Random; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; - - /** * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. * - * Custom renderers based off render tutorial by MC_DucksAreBest + * Custom renderers based off render tutorial by MC_DucksAreBest */ -public class TileEntityCrossbowBenchRenderer extends TileEntitySpecialRenderer -{ - public TileEntityCrossbowBenchRenderer() - { - model = new ModelCrossbowBench(); - } - - public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } - for(int a = 0; a < 2; a ++) - { - if(shouldRender(tile, a)) - { - this.renderModelAt("carpenter_crossbow", i, d, d1, d2, f, a); - } - } - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) - { - int i = meta; - - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - if(renderPass == 1) - { - bindTextureByName("textures/models/tileentity/anvilGrid.png"); //texture - } - else - { - bindTextureByName("textures/models/tileentity/"+tex+".png"); //texture - } - - GL11.glPushMatrix(); //start - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); //size - GL11.glRotatef(j+180F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(1F, -1F, -1F); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); +public class TileEntityCrossbowBenchRenderer extends TileEntitySpecialRenderer { + public TileEntityCrossbowBenchRenderer() { + model = new ModelCrossbowBench(); + } + + public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + for (int a = 0; a < 2; a++) { + if (shouldRender(tile, a)) { + this.renderModelAt("carpenter_crossbow", i, d, d1, d2, f, a); + } + } + } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + if (renderPass == 1) { + bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture + } else { + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + } + + GL11.glPushMatrix(); // start + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt (tileentity, d, d1, d2, f); //where to render - } - - private ModelCrossbowBench model; - private Random random = new Random(); - - - private boolean shouldRender(TileEntity tile, int p) - { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if(p == 1)//GRID - { - return false; - } - return true; + renderAModelAt(tileentity, d, d1, d2, f); // where to render + } + + private ModelCrossbowBench model; + private Random random = new Random(); + + private boolean shouldRender(TileEntity tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityFirepitRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityFirepitRenderer.java index 01b1fa22..fb2a4752 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityFirepitRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityFirepitRenderer.java @@ -1,87 +1,72 @@ package minefantasy.mf2.client.render.block; +import org.lwjgl.opengl.GL11; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityFirepit; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - -public class TileEntityFirepitRenderer extends TileEntitySpecialRenderer -{ +public class TileEntityFirepitRenderer extends TileEntitySpecialRenderer { private ModelForgeTop topModel; - public TileEntityFirepitRenderer() - { - model = new ModelFirepit(); - topModel = new ModelForgeTop(); - } - - public void renderAModelAt(TileEntityFirepit tile, double d, double d1, double d2, float f) { - bindTextureByName("textures/models/tileentity/firepit.png"); - GL11.glPushMatrix(); - float yOffset = 0.0625F * 5F; - - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); - GL11.glScalef(1.0F, -1F, -1F); - + + public TileEntityFirepitRenderer() { + model = new ModelFirepit(); + topModel = new ModelForgeTop(); + } + + public void renderAModelAt(TileEntityFirepit tile, double d, double d1, double d2, float f) { + bindTextureByName("textures/models/tileentity/firepit.png"); + GL11.glPushMatrix(); + float yOffset = 0.0625F * 5F; + + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); + GL11.glScalef(1.0F, -1F, -1F); + model.renderModel(tile, 0.0625F); - - if(tile.hasBlockAbove()) - { - GL11.glTranslatef(0F, -(1.5F-yOffset), 0F); - bindTextureByName("textures/models/tileentity/forge_top.png"); //texture - topModel.render(0.0625F); - } - GL11.glPopMatrix(); - - - } - public void renderInvModel(double d, double d1, double d2, float f) - { - bindTextureByName("textures/models/tileentity/firepit.png"); - GL11.glPushMatrix(); - float yOffset = 0.0625F * 5F; - - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); - GL11.glScalef(1.0F, -1F, -1F); - + + if (tile.hasBlockAbove()) { + GL11.glTranslatef(0F, -(1.5F - yOffset), 0F); + bindTextureByName("textures/models/tileentity/forge_top.png"); // texture + topModel.render(0.0625F); + } + GL11.glPopMatrix(); + + } + + public void renderInvModel(double d, double d1, double d2, float f) { + bindTextureByName("textures/models/tileentity/firepit.png"); + GL11.glPushMatrix(); + float yOffset = 0.0625F * 5F; + + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); + GL11.glScalef(1.0F, -1F, -1F); + model.renderModel(null, 0.0625F); - - GL11.glPopMatrix(); - - - } - @Override - protected void bindTexture(ResourceLocation p_147499_1_) - { - TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; - - if (texturemanager != null) - { - texturemanager.bindTexture(p_147499_1_); - } - } - - private void bindTextureByName(String image) - { - bindTexture(TextureHelperMF.getResource(image)); + + GL11.glPopMatrix(); + + } + + @Override + protected void bindTexture(ResourceLocation p_147499_1_) { + TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + + if (texturemanager != null) { + texturemanager.bindTexture(p_147499_1_); + } + } + + private void bindTextureByName(String image) { + bindTexture(TextureHelperMF.getResource(image)); } public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityFirepit) tileentity, d, d1, d2, f); - } - - private ModelFirepit model; + renderAModelAt((TileEntityFirepit) tileentity, d, d1, d2, f); + } + + private ModelFirepit model; } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityForgeRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityForgeRenderer.java index d160ec26..4ba5fc88 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityForgeRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityForgeRenderer.java @@ -2,129 +2,120 @@ import java.util.Random; -import minefantasy.mf2.block.tileentity.TileEntityForge; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; +import minefantasy.mf2.block.tileentity.TileEntityForge; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; +public class TileEntityForgeRenderer extends TileEntitySpecialRenderer { + public TileEntityForgeRenderer() { + model = new ModelForge(); + topModel = new ModelForgeTop(); + } -public class TileEntityForgeRenderer extends TileEntitySpecialRenderer -{ - public TileEntityForgeRenderer() - { - model = new ModelForge(); - topModel = new ModelForgeTop(); - } - - public void renderAModelAt(TileEntityForge tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } + public void renderAModelAt(TileEntityForge tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } this.renderModelAt(tile, tile.getTextureName(), i, d, d1, d2, f, tile.getWorldObj() == null, tile.hasFuel()); - } - - public void renderModelAt(TileEntityForge tile, String tex, int meta, double d, double d1, double d2, float f, boolean inv, boolean hasFuel) - { - int i = meta; - - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - bindTextureByName("textures/models/tileentity/"+tex+".png"); //texture - - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = inv ? 1.75F : 1.5F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j-90F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - if(tile != null && tile.fuel > 0 && tile.maxFuel > 0) - { - level = tile.fuel / tile.maxFuel; - } - model.renderModel(tile, 0.0625F, hasFuel, level); - - if(tile != null && tile.hasBlockAbove()) - { - bindTextureByName("textures/models/tileentity/forge_top.png"); //texture - topModel.render(0.0625F); - } - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - - public void renderInvModel(String tex, double d, double d1, double d2, float f) - { - int j = 90; - - bindTextureByName("textures/models/tileentity/"+tex+".png"); //texture - - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1.75F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j-90F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - model.renderModel(null, 0.0625F, false, level); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); } + + public void renderModelAt(TileEntityForge tile, String tex, int meta, double d, double d1, double d2, float f, + boolean inv, boolean hasFuel) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = inv ? 1.75F : 1.5F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + if (tile != null && tile.fuel > 0 && tile.maxFuel > 0) { + level = tile.fuel / tile.maxFuel; + } + model.renderModel(tile, 0.0625F, hasFuel, level); + + if (tile != null && tile.hasBlockAbove()) { + bindTextureByName("textures/models/tileentity/forge_top.png"); // texture + topModel.render(0.0625F); + } + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + public void renderInvModel(String tex, double d, double d1, double d2, float f) { + int j = 90; + + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.75F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + model.renderModel(null, 0.0625F, false, level); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityForge) tileentity, d, d1, d2, f); //where to render - } - - private ModelForge model; - private ModelForgeTop topModel; - private Random random = new Random(); - - - private boolean shouldRender(TileEntityForge tile, int p) - { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if(p == 1)//GRID - { - return false; - } - return true; + renderAModelAt((TileEntityForge) tileentity, d, d1, d2, f); // where to render + } + + private ModelForge model; + private ModelForgeTop topModel; + private Random random = new Random(); + + private boolean shouldRender(TileEntityForge tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityQuernRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityQuernRenderer.java index 47d6036e..48d68ba4 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityQuernRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityQuernRenderer.java @@ -2,54 +2,50 @@ import java.util.Random; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityQuern; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; - -public class TileEntityQuernRenderer extends TileEntitySpecialRenderer -{ - public TileEntityQuernRenderer() - { - model = new ModelQuern(); - } +public class TileEntityQuernRenderer extends TileEntitySpecialRenderer { + public TileEntityQuernRenderer() { + model = new ModelQuern(); + } - public void renderAModelAt(TileEntityQuern tile, double d, double d1, double d2, float f) - { + public void renderAModelAt(TileEntityQuern tile, double d, double d1, double d2, float f) { this.renderModelAt(tile, tile.getTextureName(), d, d1, d2, f, tile.getWorldObj() == null); - } - - public void renderModelAt(TileEntityQuern tile, String tex, double d, double d1, double d2, float f, boolean inv) - { - bindTextureByName("textures/models/tileentity/"+tex+".png"); //texture - - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1.0F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(tile, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); } + + public void renderModelAt(TileEntityQuern tile, String tex, double d, double d1, double d2, float f, boolean inv) { + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.0F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(tile, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityQuern) tileentity, d, d1, d2, f); //where to render - } - - private ModelQuern model; - private Random random = new Random(); - + renderAModelAt((TileEntityQuern) tileentity, d, d1, d2, f); // where to render + } + + private ModelQuern model; + private Random random = new Random(); + } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityRackRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityRackRenderer.java index 7787a577..b7bc09d1 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityRackRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityRackRenderer.java @@ -1,6 +1,5 @@ package minefantasy.mf2.client.render.block; - import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; @@ -25,259 +24,236 @@ import net.minecraftforge.client.IItemRenderer.ItemRendererHelper; import net.minecraftforge.client.MinecraftForgeClient; -public class TileEntityRackRenderer extends TileEntitySpecialRenderer -{ +public class TileEntityRackRenderer extends TileEntitySpecialRenderer { private static Minecraft mc = Minecraft.getMinecraft(); - public TileEntityRackRenderer() - { - model = new ModelRack(); - } - - public void renderAModelAt(TileEntityRack tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata()-2; - } - int j = i*90; - if(i == 1)j = 180; - if(i == 2)j = 90; - - GL11.glPushMatrix();//Start all - GL11.glTranslatef((float) d + 0.5F, (float) d1+1F, (float) d2 + 0.5F); - GL11.glRotatef(j+180, 0.0F, 1.0F, 0.0F); - GL11.glScalef(1.0F, -1F, -1F); - float itemsStart = -(3F/16F); - float itemsGap = 4F/16F; - - CustomMaterial material = tile.getMaterial(); - GL11.glColor3f((float)material.colourRGB[0]/255F, (float)material.colourRGB[1]/255F, (float)material.colourRGB[2]/255F); - - bindTextureByName("textures/models/tileentity/"+tile.getTexName()+"_base.png"); //texture - model.renderModel(0.0625F); - - GL11.glColor3f(1F, 1F, 1F); - - bindTextureByName("textures/models/tileentity/"+tile.getTexName()+"_detail.png"); //texture - model.renderModel(0.0625F); - - for(int a = 0; a < 4; a ++) - { - GL11.glPushMatrix();//Start Individual Items - ItemStack itemstack = tile.getStackInSlot(a); - if(itemstack != null) - { - float o = tile.yCoord%2 == 0 ? 2F : 3F; - float x = itemsStart + (a*itemsGap) - (o/16F); - float y = 0.3F; - float z = a % 2 == 0 ? 0.4F : 0.45F; - z -= 6F/16F; - float r = getRotationForItem(itemstack.getItem()); - float scale = 1.0F; - if(itemstack.getItem() instanceof IRackItem) - { - IRackItem rackitem = (IRackItem)itemstack.getItem(); - scale = rackitem.getScale(itemstack); - x += rackitem.getOffsetX(itemstack); - y += rackitem.getOffsetY(itemstack); - z -= rackitem.getOffsetZ(itemstack); - r += rackitem.getRotationOffset(itemstack); - z -= (scale-1)/2 * 5.5F/16F; - y -= (scale-1)/2F; - } - - GL11.glTranslatef(x, y, z); - - GL11.glPushMatrix(); - GL11.glRotatef(90F, 0, 1F, 0); - GL11.glRotatef(r, 0, 0, 1F); - GL11.glScalef(scale, scale, 1); - - - IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(itemstack, ItemRenderType.EQUIPPED); - if (isCustom(itemstack) && customRenderer != null) - { - this.mc.getTextureManager().bindTexture(this.mc.getTextureManager().getResourceLocation(itemstack.getItemSpriteNumber())); - renderEquippedItem(ItemRenderType.EQUIPPED, customRenderer, new RenderBlocks(), itemstack); - } - else - { - for(int layer = 0; layer < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); layer ++) - { - IIcon icon = itemstack.getItem().getIcon(itemstack, layer); - if(icon != null) - { - GL11.glPushMatrix(); - int colour = itemstack.getItem().getColorFromItemStack(itemstack, layer); - float red = (float)(colour >> 16 & 255) / 255.0F; - float green = (float)(colour >> 8 & 255) / 255.0F; - float blue = (float)(colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - - renderItem(tile, itemstack, icon, a, layer); - GL11.glPopMatrix(); - } + + public TileEntityRackRenderer() { + model = new ModelRack(); + } + + public void renderAModelAt(TileEntityRack tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata() - 2; + } + int j = i * 90; + if (i == 1) + j = 180; + if (i == 2) + j = 90; + + GL11.glPushMatrix();// Start all + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1F, (float) d2 + 0.5F); + GL11.glRotatef(j + 180, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, -1F, -1F); + float itemsStart = -(3F / 16F); + float itemsGap = 4F / 16F; + + CustomMaterial material = tile.getMaterial(); + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_base.png"); // texture + model.renderModel(0.0625F); + + GL11.glColor3f(1F, 1F, 1F); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_detail.png"); // texture + model.renderModel(0.0625F); + + for (int a = 0; a < 4; a++) { + GL11.glPushMatrix();// Start Individual Items + ItemStack itemstack = tile.getStackInSlot(a); + if (itemstack != null) { + float o = tile.yCoord % 2 == 0 ? 2F : 3F; + float x = itemsStart + (a * itemsGap) - (o / 16F); + float y = 0.3F; + float z = a % 2 == 0 ? 0.4F : 0.45F; + z -= 6F / 16F; + float r = getRotationForItem(itemstack.getItem()); + float scale = 1.0F; + if (itemstack.getItem() instanceof IRackItem) { + IRackItem rackitem = (IRackItem) itemstack.getItem(); + scale = rackitem.getScale(itemstack); + x += rackitem.getOffsetX(itemstack); + y += rackitem.getOffsetY(itemstack); + z -= rackitem.getOffsetZ(itemstack); + r += rackitem.getRotationOffset(itemstack); + z -= (scale - 1) / 2 * 5.5F / 16F; + y -= (scale - 1) / 2F; + } + + GL11.glTranslatef(x, y, z); + + GL11.glPushMatrix(); + GL11.glRotatef(90F, 0, 1F, 0); + GL11.glRotatef(r, 0, 0, 1F); + GL11.glScalef(scale, scale, 1); + + IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(itemstack, ItemRenderType.EQUIPPED); + if (isCustom(itemstack) && customRenderer != null) { + this.mc.getTextureManager().bindTexture( + this.mc.getTextureManager().getResourceLocation(itemstack.getItemSpriteNumber())); + renderEquippedItem(ItemRenderType.EQUIPPED, customRenderer, new RenderBlocks(), itemstack); + } else { + for (int layer = 0; layer < itemstack.getItem() + .getRenderPasses(itemstack.getItemDamage()); layer++) { + IIcon icon = itemstack.getItem().getIcon(itemstack, layer); + if (icon != null) { + GL11.glPushMatrix(); + int colour = itemstack.getItem().getColorFromItemStack(itemstack, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + renderItem(tile, itemstack, icon, a, layer); + GL11.glPopMatrix(); + } } - } - GL11.glPopMatrix(); - } - - GL11.glPopMatrix();//END individual item placement - } - GL11.glPopMatrix(); //end all - - - } - - public void renderInvModel(CustomMaterial material, String tex, double d, double d1, double d2, float f) - { - int j = 0; - - GL11.glPushMatrix();//Start all - GL11.glTranslatef((float) d + 0.5F, (float) d1+1F, (float) d2 + 0.5F); - GL11.glRotatef(j+180, 0.0F, 1.0F, 0.0F); - GL11.glScalef(1.0F, -1F, -1F); - float itemsStart = -(3F/16F); - float itemsGap = 4F/16F; - - GL11.glColor3f((float)material.colourRGB[0]/255F, (float)material.colourRGB[1]/255F, (float)material.colourRGB[2]/255F); - - bindTextureByName("textures/models/tileentity/"+tex+"_base.png"); //texture - model.renderModel(0.0625F); - - GL11.glColor3f(1F, 1F, 1F); - - bindTextureByName("textures/models/tileentity/"+tex+"_detail.png"); //texture - model.renderModel(0.0625F); - - GL11.glPopMatrix(); //end all - - - } - + } + GL11.glPopMatrix(); + } + + GL11.glPopMatrix();// END individual item placement + } + GL11.glPopMatrix(); // end all + + } + + public void renderInvModel(CustomMaterial material, String tex, double d, double d1, double d2, float f) { + int j = 0; + + GL11.glPushMatrix();// Start all + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1F, (float) d2 + 0.5F); + GL11.glRotatef(j + 180, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, -1F, -1F); + float itemsStart = -(3F / 16F); + float itemsGap = 4F / 16F; + + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tex + "_base.png"); // texture + model.renderModel(0.0625F); + + GL11.glColor3f(1F, 1F, 1F); + + bindTextureByName("textures/models/tileentity/" + tex + "_detail.png"); // texture + model.renderModel(0.0625F); + + GL11.glPopMatrix(); // end all + + } + private float getRotationForItem(Item item) { String classname = item.getClass().getName(); - if(classname.endsWith("ItemCrossbow") || classname.endsWith("ItemBlunderbuss") || classname.endsWith("ItemBlowgun") || classname.endsWith("ItemMusket")) - { + if (classname.endsWith("ItemCrossbow") || classname.endsWith("ItemBlunderbuss") + || classname.endsWith("ItemBlowgun") || classname.endsWith("ItemMusket")) { return 45F; } return -45F; } @Override - protected void bindTexture(ResourceLocation p_147499_1_) - { - TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; - - if (texturemanager != null) - { - texturemanager.bindTexture(p_147499_1_); - } + protected void bindTexture(ResourceLocation p_147499_1_) { + TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + + if (texturemanager != null) { + texturemanager.bindTexture(p_147499_1_); + } } - private void bindTextureByName(String image) - { - bindTexture(TextureHelperMF.getResource(image)); + + private void bindTextureByName(String image) { + bindTexture(TextureHelperMF.getResource(image)); } - + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityRack) tileentity, d, d1, d2, f); //where to render - } - - - private void renderItem(TileEntityRack tile, ItemStack itemstack, IIcon icon, int slot, int layer) - { + renderAModelAt((TileEntityRack) tileentity, d, d1, d2, f); // where to render + } + + private void renderItem(TileEntityRack tile, ItemStack itemstack, IIcon icon, int slot, int layer) { GL11.glPushMatrix(); - TextureManager texturemanager = this.mc.getTextureManager(); - GL11.glScalef(0.85F, 0.85F, 0.85F); - - if (icon == null) - { - GL11.glPopMatrix(); - return; - } - - texturemanager.bindTexture(texturemanager.getResourceLocation(itemstack.getItemSpriteNumber())); - Tessellator tessellator = Tessellator.instance; - float f = icon.getMinU(); - float f1 = icon.getMaxU(); - float f2 = icon.getMinV(); - float f3 = icon.getMaxV(); - float f4 = 0.0F; - float f5 = 0.3F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-f4, -f5, 0.0F); - GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); - ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), 0.0625F); - - if (itemstack.hasEffect(layer)) - { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - texturemanager.bindTexture(TextureHelperMF.ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - float f7 = 0.76F; - GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float f8 = 0.125F; - GL11.glScalef(f8, f8, f8); - float f9 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; - GL11.glTranslatef(f9, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(f8, f8, f8); - f9 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; - GL11.glTranslatef(-f9, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - - GL11.glPopMatrix(); + TextureManager texturemanager = this.mc.getTextureManager(); + GL11.glScalef(0.85F, 0.85F, 0.85F); + + if (icon == null) { + GL11.glPopMatrix(); + return; + } + + texturemanager.bindTexture(texturemanager.getResourceLocation(itemstack.getItemSpriteNumber())); + Tessellator tessellator = Tessellator.instance; + float f = icon.getMinU(); + float f1 = icon.getMaxU(); + float f2 = icon.getMinV(); + float f3 = icon.getMaxV(); + float f4 = 0.0F; + float f5 = 0.3F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-f4, -f5, 0.0F); + GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); + ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), 0.0625F); + + if (itemstack.hasEffect(layer)) { + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + texturemanager.bindTexture(TextureHelperMF.ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + float f7 = 0.76F; + GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glPushMatrix(); + float f8 = 0.125F; + GL11.glScalef(f8, f8, f8); + float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; + GL11.glTranslatef(f9, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(f8, f8, f8); + f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; + GL11.glTranslatef(-f9, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + + GL11.glPopMatrix(); } - - private boolean isCustom(ItemStack itemstack) - { - if(itemstack != null && itemstack.getItem() instanceof IRackItem) - { - return ((IRackItem)itemstack.getItem()).isSpecialRender(itemstack); - } + + private boolean isCustom(ItemStack itemstack) { + if (itemstack != null && itemstack.getItem() instanceof IRackItem) { + return ((IRackItem) itemstack.getItem()).isSpecialRender(itemstack); + } return false; } - public static void renderEquippedItem(ItemRenderType type, IItemRenderer customRenderer, RenderBlocks renderBlocks, ItemStack item) - { - if (customRenderer.shouldUseRenderHelper(type, item, ItemRendererHelper.EQUIPPED_BLOCK)) - { - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - customRenderer.renderItem(type, item, renderBlocks); - GL11.glPopMatrix(); - } - else - { - GL11.glPushMatrix(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(0.0F, -0.3F, 0.0F); - - GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); - customRenderer.renderItem(type, item, renderBlocks); - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - GL11.glPopMatrix(); - } - } - - private ModelRack model; + public static void renderEquippedItem(ItemRenderType type, IItemRenderer customRenderer, RenderBlocks renderBlocks, + ItemStack item) { + if (customRenderer.shouldUseRenderHelper(type, item, ItemRendererHelper.EQUIPPED_BLOCK)) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + customRenderer.renderItem(type, item, renderBlocks); + GL11.glPopMatrix(); + } else { + GL11.glPushMatrix(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(0.0F, -0.3F, 0.0F); + + GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); + customRenderer.renderItem(type, item, renderBlocks); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + } + + private ModelRack model; } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityResearchRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityResearchRenderer.java index e2df5e0d..2f9b204c 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityResearchRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityResearchRenderer.java @@ -2,92 +2,85 @@ import java.util.Random; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; +public class TileEntityResearchRenderer extends TileEntitySpecialRenderer { + public TileEntityResearchRenderer() { + model = new ModelResearch(); + } -public class TileEntityResearchRenderer extends TileEntitySpecialRenderer -{ - public TileEntityResearchRenderer() - { - model = new ModelResearch(); - } - - public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } + public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } this.renderModelAt("researchTable", i, d, d1, d2, f); - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f) - { - int i = meta; - - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - bindTextureByName("textures/models/tileentity/"+tex+".png"); //texture - - GL11.glPushMatrix(); //start - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); //size - GL11.glRotatef(j+180F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(1F, -1F, -1F); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt (tileentity, d, d1, d2, f); //where to render - } - - private ModelResearch model; - private Random random = new Random(); - - - private boolean shouldRender(TileEntity tile, int p) - { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if(p == 1)//GRID - { - return false; - } - return true; + renderAModelAt(tileentity, d, d1, d2, f); // where to render + } + + private ModelResearch model; + private Random random = new Random(); + + private boolean shouldRender(TileEntity tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityRoastRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityRoastRenderer.java index 17eecf6e..0a7d6900 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityRoastRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityRoastRenderer.java @@ -1,6 +1,5 @@ package minefantasy.mf2.client.render.block; - import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; @@ -22,110 +21,103 @@ import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; -public class TileEntityRoastRenderer extends TileEntitySpecialRenderer -{ +public class TileEntityRoastRenderer extends TileEntitySpecialRenderer { private final RenderBlocks blockrender = new RenderBlocks(); private ModelOven ovenModel; - public TileEntityRoastRenderer() - { - ovenModel = new ModelOven(); - } - public void renderAModelAt(TileEntityRoast tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.blockMetadata; - } - int j = 360 - (90 * i); - float pixelHeight = tile.isOven() ? 3F : 5F; - GL11.glPushMatrix(); - GL11.glTranslatef((float) d +0.5F, (float) d1 + (pixelHeight/32), (float) d2 + 0.5F); - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); - GL11.glScalef(1.0F, -1F, -1F); - if(tile.isOven()) - { - GL11.glPushMatrix(); - GL11.glRotatef(180, 0, 1, 0); - bindTextureByName("textures/models/tileentity/oven_"+ tile.getTexName() +".png"); - ovenModel.render(0.0625F); - GL11.glPopMatrix(); - } - - GL11.glRotatef(90, 1.0F, 0F, 0F); - renderHungItem((TileEntityRoast) tile, d, d1, d2, f); - GL11.glPopMatrix(); - } - public void renderInvModel(String tex, boolean oven, double d, double d1, double d2, float f) { - - float pixelHeight = oven ? 3F : 5F; - GL11.glPushMatrix(); - GL11.glTranslatef((float) d +0.5F, (float) d1 + (pixelHeight/32), (float) d2 + 0.5F); - GL11.glScalef(1.0F, -1F, -1F); - if(oven) - { - GL11.glPushMatrix(); - GL11.glRotatef(180, 0, 1, 0); - bindTextureByName("textures/models/tileentity/oven_"+ tex +".png"); - ovenModel.render(0.0625F); - GL11.glPopMatrix(); - } - - GL11.glPopMatrix(); - } - - @Override - protected void bindTexture(ResourceLocation p_147499_1_) - { - TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + public TileEntityRoastRenderer() { + ovenModel = new ModelOven(); + } + + public void renderAModelAt(TileEntityRoast tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.blockMetadata; + } + int j = 360 - (90 * i); + float pixelHeight = tile.isOven() ? 3F : 5F; + GL11.glPushMatrix(); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + (pixelHeight / 32), (float) d2 + 0.5F); + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, -1F, -1F); + if (tile.isOven()) { + GL11.glPushMatrix(); + GL11.glRotatef(180, 0, 1, 0); + bindTextureByName("textures/models/tileentity/oven_" + tile.getTexName() + ".png"); + ovenModel.render(0.0625F); + GL11.glPopMatrix(); + } - if (texturemanager != null) - { - texturemanager.bindTexture(p_147499_1_); - } + GL11.glRotatef(90, 1.0F, 0F, 0F); + renderHungItem(tile, d, d1, d2, f); + GL11.glPopMatrix(); } - private void bindTextureByName(String image) - { - bindTexture(TextureHelperMF.getResource(image)); + + public void renderInvModel(String tex, boolean oven, double d, double d1, double d2, float f) { + + float pixelHeight = oven ? 3F : 5F; + GL11.glPushMatrix(); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + (pixelHeight / 32), (float) d2 + 0.5F); + GL11.glScalef(1.0F, -1F, -1F); + if (oven) { + GL11.glPushMatrix(); + GL11.glRotatef(180, 0, 1, 0); + bindTextureByName("textures/models/tileentity/oven_" + tex + ".png"); + ovenModel.render(0.0625F); + GL11.glPopMatrix(); + } + + GL11.glPopMatrix(); + } + + @Override + protected void bindTexture(ResourceLocation p_147499_1_) { + TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + + if (texturemanager != null) { + texturemanager.bindTexture(p_147499_1_); + } + } + + private void bindTextureByName(String image) { + bindTexture(TextureHelperMF.getResource(image)); } public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityRoast) tileentity, d, d1, d2, f); - } - - private void renderHungItem(TileEntityRoast tile, double d, double d1, double d2, float f) - { + renderAModelAt((TileEntityRoast) tileentity, d, d1, d2, f); + } + + private void renderHungItem(TileEntityRoast tile, double d, double d1, double d2, float f) { Minecraft mc = Minecraft.getMinecraft(); ItemStack itemstack = tile.getStackInSlot(0); - if(itemstack == null)return; - //Block - if (itemstack.getItemSpriteNumber() == 0 && itemstack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(itemstack.getItem()).getRenderType())) - { + if (itemstack == null) + return; + // Block + if (itemstack.getItemSpriteNumber() == 0 && itemstack.getItem() instanceof ItemBlock + && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(itemstack.getItem()).getRenderType())) { Block block = Block.getBlockFromItem(itemstack.getItem()); - if(block != null) - { - //this.blockrender.renderBlockAsItem(block, itemstack.getItemDamage(), 1.0F); + if (block != null) { + // this.blockrender.renderBlockAsItem(block, itemstack.getItemDamage(), 1.0F); } - } - //Item - else if(itemstack.getItem().getIconFromDamage(itemstack.getItemDamage()) != null) - { + } + // Item + else if (itemstack.getItem().getIconFromDamage(itemstack.getItemDamage()) != null) { Item item = itemstack.getItem(); mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - - Tessellator image = Tessellator.instance; - IIcon index = item.getIconFromDamage(itemstack.getItemDamage()); - float x1 = index.getMaxU(); - float x2 = index.getMinU(); - float y1 = index.getMinV(); - float y2 = index.getMaxV(); - float scale = 0.5F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-scale/2, -scale/2, 0.0F); - GL11.glScalef(scale, scale, scale); - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(-1F, -1F, 0.0F); - ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, index.getIconWidth(), index.getIconHeight(), 0.0625F); + + Tessellator image = Tessellator.instance; + IIcon index = item.getIconFromDamage(itemstack.getItemDamage()); + float x1 = index.getMaxU(); + float x2 = index.getMinU(); + float y1 = index.getMinV(); + float y2 = index.getMaxV(); + float scale = 0.5F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-scale / 2, -scale / 2, 0.0F); + GL11.glScalef(scale, scale, scale); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-1F, -1F, 0.0F); + ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, index.getIconWidth(), index.getIconHeight(), 0.0625F); } } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntitySmokePipeRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntitySmokePipeRenderer.java index 7e8d95ab..12ba9213 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntitySmokePipeRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntitySmokePipeRenderer.java @@ -5,50 +5,46 @@ import org.lwjgl.opengl.GL11; import minefantasy.mf2.api.helpers.TextureHelperMF; -import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.tileentity.TileEntityChimney; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; -public class TileEntitySmokePipeRenderer extends TileEntitySpecialRenderer -{ - public TileEntitySmokePipeRenderer() - { - } - - public void renderAModelAt(TileEntityChimney tile, double d, double d1, double d2, float f) - { - if(tile != null && !tile.isPipeChimney()) - { - return; - } - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 0.5F; - - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - - bindTextureByName("textures/models/tileentity/smoke_pipe.png"); //texture - model.renderModel(tile, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); +public class TileEntitySmokePipeRenderer extends TileEntitySpecialRenderer { + public TileEntitySmokePipeRenderer() { } + + public void renderAModelAt(TileEntityChimney tile, double d, double d1, double d2, float f) { + if (tile != null && !tile.isPipeChimney()) { + return; + } + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 0.5F; + + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + + bindTextureByName("textures/models/tileentity/smoke_pipe.png"); // texture + model.renderModel(tile, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityChimney) tileentity, d, d1, d2, f); //where to render - } - - private static ModelSmokePipe model = new ModelSmokePipe(); - private Random random = new Random(); + renderAModelAt((TileEntityChimney) tileentity, d, d1, d2, f); // where to render + } + + private static ModelSmokePipe model = new ModelSmokePipe(); + private Random random = new Random(); } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityTanningRackRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityTanningRackRenderer.java index 0427cf5b..92e02c2b 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityTanningRackRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityTanningRackRenderer.java @@ -1,5 +1,7 @@ package minefantasy.mf2.client.render.block; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityTanningRack; @@ -16,140 +18,125 @@ import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; +public class TileEntityTanningRackRenderer extends TileEntitySpecialRenderer { -public class TileEntityTanningRackRenderer extends TileEntitySpecialRenderer -{ - - public TileEntityTanningRackRenderer() - { - engmodel = new ModelEngTanningRack(); - model = new ModelTanningRack(); - } - - public void renderAModelAt(TileEntityTanningRack tile, double d, double d1, double d2, float f) { - if (tile != null); - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.blockMetadata; - } - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - bindTextureByName("textures/models/tileentity/tanner"+tile.tex+".png"); - GL11.glPushMatrix(); - GL11.glTranslatef((float) d + 0.5F, (float) d1+1.45F, (float) d2 + 0.5F); - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); - GL11.glScalef(1.0F, -1F, -1F); - if(tile.isAutomated()) - { - engmodel.renderModel(0.0625F); - GL11.glPushMatrix(); - GL11.glTranslatef(0F, tile.acTime, 0F); - engmodel.renderBlade(0.0625F); - GL11.glPopMatrix(); - engmodel.rotateLever(tile.acTime); - engmodel.renderLever(0.0625F); - } - else - { - model.renderModel(0.0625F); - } - renderHungItem((TileEntityTanningRack) tile, d, d1, d2, f); - GL11.glPopMatrix(); - - - } - - public void renderInvModel(String tex, boolean isAuto, double d, double d1, double d2, float f) { - int j = 90; - bindTextureByName("textures/models/tileentity/tanner"+tex+".png"); - GL11.glPushMatrix(); - GL11.glTranslatef((float) d + 0.5F, (float) d1+1.45F, (float) d2 + 0.5F); - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); - GL11.glScalef(1.0F, -1F, -1F); - if(isAuto) - { - engmodel.renderModel(0.0625F); - GL11.glPushMatrix(); - engmodel.renderBlade(0.0625F); - GL11.glPopMatrix(); - engmodel.renderLever(0.0625F); - } - else - { - model.renderModel(0.0625F); - } - GL11.glPopMatrix(); - - - } - @Override - protected void bindTexture(ResourceLocation p_147499_1_) - { - TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; - - if (texturemanager != null) - { - texturemanager.bindTexture(p_147499_1_); - } + public TileEntityTanningRackRenderer() { + engmodel = new ModelEngTanningRack(); + model = new ModelTanningRack(); } - private void bindTextureByName(String image) - { - bindTexture(TextureHelperMF.getResource(image)); + + public void renderAModelAt(TileEntityTanningRack tile, double d, double d1, double d2, float f) { + if (tile != null) + ; + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.blockMetadata; + } + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + bindTextureByName("textures/models/tileentity/tanner" + tile.tex + ".png"); + GL11.glPushMatrix(); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.45F, (float) d2 + 0.5F); + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, -1F, -1F); + if (tile.isAutomated()) { + engmodel.renderModel(0.0625F); + GL11.glPushMatrix(); + GL11.glTranslatef(0F, tile.acTime, 0F); + engmodel.renderBlade(0.0625F); + GL11.glPopMatrix(); + engmodel.rotateLever(tile.acTime); + engmodel.renderLever(0.0625F); + } else { + model.renderModel(0.0625F); + } + renderHungItem(tile, d, d1, d2, f); + GL11.glPopMatrix(); + + } + + public void renderInvModel(String tex, boolean isAuto, double d, double d1, double d2, float f) { + int j = 90; + bindTextureByName("textures/models/tileentity/tanner" + tex + ".png"); + GL11.glPushMatrix(); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.45F, (float) d2 + 0.5F); + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, -1F, -1F); + if (isAuto) { + engmodel.renderModel(0.0625F); + GL11.glPushMatrix(); + engmodel.renderBlade(0.0625F); + GL11.glPopMatrix(); + engmodel.renderLever(0.0625F); + } else { + model.renderModel(0.0625F); + } + GL11.glPopMatrix(); + + } + + @Override + protected void bindTexture(ResourceLocation p_147499_1_) { + TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + + if (texturemanager != null) { + texturemanager.bindTexture(p_147499_1_); + } + } + + private void bindTextureByName(String image) { + bindTexture(TextureHelperMF.getResource(image)); } public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityTanningRack) tileentity, d, d1, d2, f); - } - - private void renderHungItem(TileEntityTanningRack tile, double d, double d1, - double d2, float f) { + renderAModelAt((TileEntityTanningRack) tileentity, d, d1, d2, f); + } + + private void renderHungItem(TileEntityTanningRack tile, double d, double d1, double d2, float f) { Minecraft mc = Minecraft.getMinecraft(); ItemStack itemstack = tile.getStackInSlot(0); - if(itemstack != null && itemstack.getItem().getIconFromDamage(itemstack.getItemDamage()) != null) - { + if (itemstack != null && itemstack.getItem().getIconFromDamage(itemstack.getItemDamage()) != null) { Item item = itemstack.getItem(); mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - - Tessellator image = Tessellator.instance; - IIcon index = item.getIconFromDamage(itemstack.getItemDamage()); - float x1 = index.getMinU(); - float x2 = index.getMaxU(); - float y1 = index.getMinV(); - float y2 = index.getMaxV(); - float xPos = 0.5F; - float yPos = -0.5F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-xPos, -yPos, 0.0F); - float var13 = 1F; - GL11.glScalef(var13, var13, var13); - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(-1F, -1F, 0.0F); - ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, index.getIconWidth(), index.getIconHeight(), 0.0625F); + + Tessellator image = Tessellator.instance; + IIcon index = item.getIconFromDamage(itemstack.getItemDamage()); + float x1 = index.getMinU(); + float x2 = index.getMaxU(); + float y1 = index.getMinV(); + float y2 = index.getMaxV(); + float xPos = 0.5F; + float yPos = -0.5F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-xPos, -yPos, 0.0F); + float var13 = 1F; + GL11.glScalef(var13, var13, var13); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-1F, -1F, 0.0F); + ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, index.getIconWidth(), index.getIconHeight(), 0.0625F); } - + } - - private ModelTanningRack model; - private ModelEngTanningRack engmodel; + + private ModelTanningRack model; + private ModelEngTanningRack engmodel; } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java index 049e2950..ebfdc0d8 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java @@ -2,127 +2,119 @@ import java.util.Random; +import org.lwjgl.opengl.GL11; + import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.tileentity.decor.TileEntityTrough; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL11; +public class TileEntityTroughRenderer extends TileEntitySpecialRenderer { + public TileEntityTroughRenderer() { + model = new ModelTrough(); + } -public class TileEntityTroughRenderer extends TileEntitySpecialRenderer -{ - public TileEntityTroughRenderer() - { - model = new ModelTrough(); - } - - public void renderAModelAt(TileEntityTrough tile, double d, double d1, double d2, float f) - { - int i = 0; - if (tile.getWorldObj() != null) - { - i = tile.getBlockMetadata(); - } + public void renderAModelAt(TileEntityTrough tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } this.renderModelAt(tile, i, d, d1, d2, f); - } - - public void renderModelAt(TileEntityTrough tile, int meta, double d, double d1, double d2, float f) - { + } + + public void renderModelAt(TileEntityTrough tile, int meta, double d, double d1, double d2, float f) { int i = meta; - int j = 90 * i; - if (i == 1) { - j = 0; - } - - if (i == 2) { - j = 270; - } - - if (i == 3) { - j = 180; - } - - if (i == 0) { - j = 90; - } - if (i == 0) { - j = 90; - } - - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1/16F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - - CustomMaterial material = tile.getMaterial(); - GL11.glColor3f((float)material.colourRGB[0]/255F, (float)material.colourRGB[1]/255F, (float)material.colourRGB[2]/255F); - - bindTextureByName("textures/models/tileentity/"+tile.getTexName()+"_base.png"); //texture - model.renderModel(0.0625F); - - GL11.glColor3f(1F, 1F, 1F); - - float height = (float)tile.fill / (float)tile.getCapacity(); - if(tile.fill > 0) - { - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - bindTextureByName("textures/models/tileentity/"+tile.getTexName()+"_water.png"); //texture - GL11.glColor4f(1F, 1F, 1F, 0.5F); - GL11.glTranslatef(0F, -height*0.35F, 0F); - model.renderWater(0.0625F); - } - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - - public void renderInvModel(String tex, CustomMaterial material, double d, double d1, double d2, float f) - { + if (i == 1) { + j = 0; + } + + if (i == 2) { + j = 270; + } + + if (i == 3) { + j = 180; + } + + if (i == 0) { + j = 90; + } + if (i == 0) { + j = 90; + } + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1 / 16F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + + CustomMaterial material = tile.getMaterial(); + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_base.png"); // texture + model.renderModel(0.0625F); + + GL11.glColor3f(1F, 1F, 1F); + + float height = (float) tile.fill / (float) tile.getCapacity(); + if (tile.fill > 0) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_water.png"); // texture + GL11.glColor4f(1F, 1F, 1F, 0.5F); + GL11.glTranslatef(0F, -height * 0.35F, 0F); + model.renderWater(0.0625F); + } + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + public void renderInvModel(String tex, CustomMaterial material, double d, double d1, double d2, float f) { int j = 90; - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1/16F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - - GL11.glColor3f((float)material.colourRGB[0]/255F, (float)material.colourRGB[1]/255F, (float)material.colourRGB[2]/255F); - - bindTextureByName("textures/models/tileentity/"+tex+"_base.png"); //texture - model.renderModel(0.0625F); - - GL11.glColor3f(1F, 1F, 1F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); //end - - } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1 / 16F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tex + "_base.png"); // texture + model.renderModel(0.0625F); + + GL11.glColor3f(1F, 1F, 1F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityTrough) tileentity, d, d1, d2, f); //where to render - } - - private ModelTrough model; - private Random random = new Random(); + renderAModelAt((TileEntityTrough) tileentity, d, d1, d2, f); // where to render + } + + private ModelTrough model; + private Random random = new Random(); } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelBarStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelBarStack.java index b2564a49..bad87c6c 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelBarStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelBarStack.java @@ -3,46 +3,41 @@ import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; -public class ModelBarStack extends ModelBase -{ +public class ModelBarStack extends ModelBase { private ModelRenderer[] bar = new ModelRenderer[64]; - - public ModelBarStack() - { + + public ModelBarStack() { textureWidth = 32; textureHeight = 16; int i = 0; - for(int y = 0; y < 4; y ++) - { - for(int z = 0; z < 2; z ++) - { - for(int x = 0; x < 2; x ++) - { - float xCoord = -7.5F + (x*8F); - float yCoord = 12F - (y*4F); - float zCoord = 7.5F - (z*8F); - + for (int y = 0; y < 4; y++) { + for (int z = 0; z < 2; z++) { + for (int x = 0; x < 2; x++) { + float xCoord = -7.5F + (x * 8F); + float yCoord = 12F - (y * 4F); + float zCoord = 7.5F - (z * 8F); + bar[i] = new ModelRenderer(this, 0, 0); bar[i].addBox(0F, 2F, -7F, 3, 2, 7); bar[i].setRotationPoint(xCoord, yCoord, zCoord); bar[i].setTextureSize(64, 32); setRotation(bar[i], 0F, 0F, 0F); ++i; - + bar[i] = new ModelRenderer(this, 0, 0); bar[i].addBox(4F, 2F, -7F, 3, 2, 7); bar[i].setRotationPoint(xCoord, yCoord, zCoord); bar[i].setTextureSize(64, 32); setRotation(bar[i], 0F, 0F, 0F); ++i; - + bar[i] = new ModelRenderer(this, 0, 0); bar[i].addBox(-3F, 0F, -7F, 3, 2, 7); bar[i].setRotationPoint(xCoord, yCoord, zCoord); bar[i].setTextureSize(64, 32); setRotation(bar[i], 0F, -1.570796F, 0F); ++i; - + bar[i] = new ModelRenderer(this, 0, 0); bar[i].addBox(-7F, 0F, -7F, 3, 2, 7); bar[i].setRotationPoint(xCoord, yCoord, zCoord); @@ -52,18 +47,17 @@ public ModelBarStack() } } } - + } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + + private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } - public void render(int stackSize, float f) - { - for(int i = 0; i < stackSize; i ++) - { + + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { bar[i].render(f); } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelBigPlateStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelBigPlateStack.java index 350e59b8..5d24b929 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelBigPlateStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelBigPlateStack.java @@ -3,15 +3,13 @@ import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; -public class ModelBigPlateStack extends ModelBase -{ +public class ModelBigPlateStack extends ModelBase { private ModelRenderer[] sheet = new ModelRenderer[8]; - public ModelBigPlateStack() - { + public ModelBigPlateStack() { textureWidth = 64; textureHeight = 16; - + sheet[0] = new ModelRenderer(this, 0, 0); sheet[0].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); sheet[0].setRotationPoint(0F, 14F, 0F); @@ -61,17 +59,14 @@ public ModelBigPlateStack() setRotation(sheet[7], 0F, 0.0698132F, 0F); } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } - public void render(int stackSize, float f) - { - for (int i = 0; i < stackSize; i++) - { + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { sheet[i].render(f); } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelJugStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelJugStack.java index 0055fcda..a4daf497 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelJugStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelJugStack.java @@ -3,26 +3,20 @@ import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; -public class ModelJugStack extends ModelBase -{ +public class ModelJugStack extends ModelBase { private ModelRenderer[] jug = new ModelRenderer[32]; - - public ModelJugStack() - { + + public ModelJugStack() { textureWidth = 32; - textureHeight =16; + textureHeight = 16; int i = 0; - for(int y = 0; y < 2; y ++) - { - for(int z = 0; z < 4; z ++) - { - for(int x = 0; x < 4; x ++) - { + for (int y = 0; y < 2; y++) { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 4; x++) { float xCoord = -8F + (x * 4F); float yCoord = 8F - (y * 8F); float zCoord = 8F - (z * 4F); - jug[i] = new ModelRenderer(this, 0, 4); jug[i].addBox(0F, 2F, -3F, 3, 6, 3); jug[i].setTextureOffset(12, 0); @@ -36,18 +30,17 @@ public ModelJugStack() } } } - + } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + + private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } - public void render(int stackSize, float f) - { - for(int i = 0; i < stackSize; i ++) - { + + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { jug[i].render(f); } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelPlankStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelPlankStack.java index 4a2bd59f..99e1a641 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelPlankStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelPlankStack.java @@ -3,27 +3,22 @@ import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; -public class ModelPlankStack extends ModelBase -{ +public class ModelPlankStack extends ModelBase { private ModelRenderer[] plank = new ModelRenderer[64]; - - public ModelPlankStack() - { + + public ModelPlankStack() { textureWidth = 32; textureHeight = 32; int i = 0; - for(int y = 0; y < 16; y ++) - { - for(int x = 0; x < 4; x ++) - { - float xCoord = -8F + x*4F; - float yCoord = 15F - y; + for (int y = 0; y < 16; y++) { + for (int x = 0; x < 4; x++) { + float xCoord = -8F + x * 4F; + float yCoord = 15F - y; float zCoord = 8F; - if(y % 2 == 0) - { + if (y % 2 == 0) { xCoord += 1F; } - + plank[i] = new ModelRenderer(this, 0, 0); plank[i].addBox(0F, 0F, 0F, 3, 16, 1); plank[i].setRotationPoint(xCoord, yCoord, zCoord); @@ -32,18 +27,17 @@ public ModelPlankStack() ++i; } } - + } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + + private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } - public void render(int stackSize, float f) - { - for(int i = 0; i < stackSize; i ++) - { + + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { plank[i].render(f); } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelPotStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelPotStack.java index 7f08bd7b..752905d9 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelPotStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelPotStack.java @@ -3,21 +3,16 @@ import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; -public class ModelPotStack extends ModelBase -{ +public class ModelPotStack extends ModelBase { private ModelRenderer[] pot = new ModelRenderer[64]; - - public ModelPotStack() - { + + public ModelPotStack() { textureWidth = 16; textureHeight = 8; int i = 0; - for(int y = 0; y < 4; y ++) - { - for(int z = 0; z < 4; z ++) - { - for(int x = 0; x < 4; x ++) - { + for (int y = 0; y < 4; y++) { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 4; x++) { float xCoord = -8F + (x * 4F); float yCoord = 12F - (y * 4F); float zCoord = 8F - (z * 4F); @@ -32,18 +27,17 @@ public ModelPotStack() } } } - + } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + + private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } - public void render(int stackSize, float f) - { - for(int i = 0; i < stackSize; i ++) - { + + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { pot[i].render(f); } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelSheetStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelSheetStack.java index 903b0e04..9b210f42 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelSheetStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelSheetStack.java @@ -3,12 +3,10 @@ import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; -public class ModelSheetStack extends ModelBase -{ +public class ModelSheetStack extends ModelBase { private ModelRenderer[] sheet = new ModelRenderer[16]; - public ModelSheetStack() - { + public ModelSheetStack() { textureWidth = 64; textureHeight = 16; @@ -16,13 +14,13 @@ public ModelSheetStack() sheet[0].addBox(-7F, 0F, -7F, 14, 1, 14); sheet[0].setRotationPoint(0F, 15F, 0F); sheet[0].setTextureSize(64, 16); - + setRotation(sheet[0], 0F, 0F, 0F); sheet[1] = new ModelRenderer(this, 0, 0); sheet[1].addBox(-7F, 0F, -7F, 14, 1, 14); sheet[1].setRotationPoint(0F, 14F, 0F); sheet[1].setTextureSize(64, 16); - + setRotation(sheet[1], 0F, -0.122173F, 0F); sheet[2] = new ModelRenderer(this, 0, 0); sheet[2].addBox(-7F, 0F, -7F, 14, 1, 14); @@ -96,17 +94,14 @@ public ModelSheetStack() setRotation(sheet[15], 0F, 0F, 0F); } - private void setRotation(ModelRenderer model, float x, float y, float z) - { + private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } - public void render(int stackSize, float f) - { - for (int i = 0; i < stackSize; i++) - { + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { sheet[i].render(f); } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/TileEntityComponentRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/component/TileEntityComponentRenderer.java index 993a1b7f..ac0a60ea 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/TileEntityComponentRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/TileEntityComponentRenderer.java @@ -5,101 +5,88 @@ import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.tileentity.TileEntityComponent; -import minefantasy.mf2.client.render.block.component.*; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; -public class TileEntityComponentRenderer extends TileEntitySpecialRenderer -{ +public class TileEntityComponentRenderer extends TileEntitySpecialRenderer { private ModelBarStack bars; - private ModelSheetStack sheets; - private ModelPlankStack planks; - private ModelPotStack pots; - private ModelBigPlateStack bigplates; - private ModelJugStack jugs; - - public TileEntityComponentRenderer() - { - this.bars = new ModelBarStack(); - this.sheets = new ModelSheetStack(); - this.planks = new ModelPlankStack(); - this.pots = new ModelPotStack(); - this.bigplates = new ModelBigPlateStack(); - this.jugs = new ModelJugStack(); - } - - public void renderModelAt(TileEntityComponent tile, double d, double d1, double d2, float f) - { - if(tile.item != null) - { + private ModelSheetStack sheets; + private ModelPlankStack planks; + private ModelPotStack pots; + private ModelBigPlateStack bigplates; + private ModelJugStack jugs; + + public TileEntityComponentRenderer() { + this.bars = new ModelBarStack(); + this.sheets = new ModelSheetStack(); + this.planks = new ModelPlankStack(); + this.pots = new ModelPotStack(); + this.bigplates = new ModelBigPlateStack(); + this.jugs = new ModelJugStack(); + } + + public void renderModelAt(TileEntityComponent tile, double d, double d1, double d2, float f) { + if (tile.item != null) { int i = tile.getBlockMetadata(); - + int j = 180 + (-90 * i); - - GL11.glPushMatrix(); //start - float scale = 1.0F; - float yOffset = 1.0F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); //size - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); //rotate based on metadata - GL11.glScalef(scale, -scale, -scale); //if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - - CustomMaterial material = tile.material; - if(material != null) - { - GL11.glColor3f((float)material.colourRGB[0]/255F, (float)material.colourRGB[1]/255F, (float)material.colourRGB[2]/255F); - } - - bindTextureByName("textures/models/object/component/placed_"+tile.tex+".png"); //texture - render(tile.type, tile.stackSize, 0.0625F); - - - GL11.glColor3f(1F, 1F, 1F); - - GL11.glPopMatrix(); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); //end + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.0F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + + CustomMaterial material = tile.material; + if (material != null) { + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, + material.colourRGB[2] / 255F); + } + + bindTextureByName("textures/models/object/component/placed_" + tile.tex + ".png"); // texture + render(tile.type, tile.stackSize, 0.0625F); + + GL11.glColor3f(1F, 1F, 1F); + + GL11.glPopMatrix(); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); // end } - } - - private void render(String type, int stackSize, float f) - { - if(type.equalsIgnoreCase("bar")) - { - bars.render(stackSize, f); - } - if(type.equalsIgnoreCase("sheet")) - { - sheets.render(stackSize, f); - } - if(type.equalsIgnoreCase("plank")) - { - planks.render(stackSize, f); - } - if(type.equalsIgnoreCase("pot")) - { - pots.render(stackSize, f); - } - if(type.equalsIgnoreCase("bigplate")) - { - bigplates.render(stackSize, f); - } - if(type.equalsIgnoreCase("jug")) - { - jugs.render(stackSize, f); - } } - private void bindTextureByName(String image) - { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + private void render(String type, int stackSize, float f) { + if (type.equalsIgnoreCase("bar")) { + bars.render(stackSize, f); + } + if (type.equalsIgnoreCase("sheet")) { + sheets.render(stackSize, f); + } + if (type.equalsIgnoreCase("plank")) { + planks.render(stackSize, f); + } + if (type.equalsIgnoreCase("pot")) { + pots.render(stackSize, f); + } + if (type.equalsIgnoreCase("bigplate")) { + bigplates.render(stackSize, f); + } + if (type.equalsIgnoreCase("jug")) { + jugs.render(stackSize, f); + } + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); } + @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderModelAt((TileEntityComponent) tileentity, d, d1, d2, f); //where to render - } - + renderModelAt((TileEntityComponent) tileentity, d, d1, d2, f); // where to render + } + } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelAshDragon.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelAshDragon.java index f703dc9f..8bfec043 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelAshDragon.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelAshDragon.java @@ -6,906 +6,898 @@ import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; -public class ModelAshDragon extends ModelBase -{ +public class ModelAshDragon extends ModelBase { public ModelRenderer Bodyfront; - public ModelRenderer Tail1; - public ModelRenderer Neck1; - public ModelRenderer Wingshoulderright; - public ModelRenderer Wingshoulderleft; - public ModelRenderer shape122; - public ModelRenderer shape124; - public ModelRenderer shape127; - public ModelRenderer shape144; - public ModelRenderer shape153; - public ModelRenderer shape145; - public ModelRenderer shape146; - public ModelRenderer shape147; - public ModelRenderer shape148; - public ModelRenderer shape149; - public ModelRenderer Tail2; - public ModelRenderer ThighR; - public ModelRenderer ThighL; - public ModelRenderer shape134; - public ModelRenderer shape136; - public ModelRenderer shape138; - public ModelRenderer shape150; - public ModelRenderer shape151; - public ModelRenderer shape152; - public ModelRenderer shape154; - public ModelRenderer shape155; - public ModelRenderer Tail3; - public ModelRenderer shape140; - public ModelRenderer shape142; - public ModelRenderer Tail4; - public ModelRenderer shape143; - public ModelRenderer Tail5; - public ModelRenderer Tail7; - public ModelRenderer Tail8; - public ModelRenderer RTailSpike; - public ModelRenderer LTailSpike; - public ModelRenderer RTailMembrane; - public ModelRenderer LTailMembrane; - public ModelRenderer shape141; - public ModelRenderer ShinR; - public ModelRenderer FootR; - public ModelRenderer MidtoeR1; - public ModelRenderer RighttoeR1; - public ModelRenderer LefttoeR1; - public ModelRenderer MidtoeR2; - public ModelRenderer RighttoeR2; - public ModelRenderer LefttoeR2; - public ModelRenderer ShinL; - public ModelRenderer FootL; - public ModelRenderer MidtoeL1; - public ModelRenderer LefttoeL1; - public ModelRenderer RighttoeL1; - public ModelRenderer MidtoeL2; - public ModelRenderer LefttoeL2; - public ModelRenderer RighttoeL2; - public ModelRenderer shape135; - public ModelRenderer shape137; - public ModelRenderer shape139; - public ModelRenderer Neck2; - public ModelRenderer Neck3; - public ModelRenderer Head1; - public ModelRenderer Headtop; - public ModelRenderer Mouthback_MOVE_TO_OPEN; - public ModelRenderer HornbaseR; - public ModelRenderer HornbaseL; - public ModelRenderer Headmidhornlowerright; - public ModelRenderer Headmidhornlowerleft; - public ModelRenderer BrowfrontR; - public ModelRenderer BrowfrontL; - public ModelRenderer Upperjaw; - public ModelRenderer shape113; - public ModelRenderer ToothR4; - public ModelRenderer ToothL4; - public ModelRenderer ToothR3; - public ModelRenderer ToothL3; - public ModelRenderer ToothR2; - public ModelRenderer ToothL2; - public ModelRenderer ToothR1; - public ModelRenderer ToothL1; - public ModelRenderer shape114; - public ModelRenderer shape115; - public ModelRenderer Lowerjawback; - public ModelRenderer Lowerjaw; - public ModelRenderer Underlowerjaw2; - public ModelRenderer Underlowerjaw; - public ModelRenderer ToothlowerR3; - public ModelRenderer ToothlowerR3_1; - public ModelRenderer ToothlowerR2; - public ModelRenderer ToothlowerL2; - public ModelRenderer ToothlowerR1; - public ModelRenderer ToothlowerL1; - public ModelRenderer Underlowerjaw3; - public ModelRenderer shape108; - public ModelRenderer HornmidR; - public ModelRenderer HornendR; - public ModelRenderer HornmidL; - public ModelRenderer HornendL; - public ModelRenderer Headmidhornupperright; - public ModelRenderer Headmidhornupperleft; - public ModelRenderer RBrowback; - public ModelRenderer BrowbackL; - public ModelRenderer Wingupperarmright; - public ModelRenderer Winglowerarmright; - public ModelRenderer Wingmembramesmallright; - public ModelRenderer Wingfinger1right; - public ModelRenderer Wingmembramemidright; - public ModelRenderer Rfinger1; - public ModelRenderer Wingfinger2right; - public ModelRenderer Wingfinger3right; - public ModelRenderer Wingfingerlower1right; - public ModelRenderer Wingmembramelargeright1; - public ModelRenderer Wingfingerlower2right; - public ModelRenderer Wingfingerlower3right; - public ModelRenderer Wingmembramelargeright2; - public ModelRenderer Rfinger2; - public ModelRenderer Wingupperarmleft; - public ModelRenderer Winglowerarmleft; - public ModelRenderer Wingmembramesmallleft; - public ModelRenderer Wingfinger1left; - public ModelRenderer Wingmembramemidleft; - public ModelRenderer Lfinger1; - public ModelRenderer Wingfingerlower1left; - public ModelRenderer Wingfinger2left; - public ModelRenderer Wingfinger3left; - public ModelRenderer Wingmembramelargeleft1; - public ModelRenderer Wingmembramelargeleft2; - public ModelRenderer Wingfingerlower2left; - public ModelRenderer Wingfingerlower3left; - public ModelRenderer Lfinger2; - public ModelRenderer shape123; - public ModelRenderer shape125; - public ModelRenderer shape126; - public ModelRenderer shape128; - public ModelRenderer shape129; + public ModelRenderer Tail1; + public ModelRenderer Neck1; + public ModelRenderer Wingshoulderright; + public ModelRenderer Wingshoulderleft; + public ModelRenderer shape122; + public ModelRenderer shape124; + public ModelRenderer shape127; + public ModelRenderer shape144; + public ModelRenderer shape153; + public ModelRenderer shape145; + public ModelRenderer shape146; + public ModelRenderer shape147; + public ModelRenderer shape148; + public ModelRenderer shape149; + public ModelRenderer Tail2; + public ModelRenderer ThighR; + public ModelRenderer ThighL; + public ModelRenderer shape134; + public ModelRenderer shape136; + public ModelRenderer shape138; + public ModelRenderer shape150; + public ModelRenderer shape151; + public ModelRenderer shape152; + public ModelRenderer shape154; + public ModelRenderer shape155; + public ModelRenderer Tail3; + public ModelRenderer shape140; + public ModelRenderer shape142; + public ModelRenderer Tail4; + public ModelRenderer shape143; + public ModelRenderer Tail5; + public ModelRenderer Tail7; + public ModelRenderer Tail8; + public ModelRenderer RTailSpike; + public ModelRenderer LTailSpike; + public ModelRenderer RTailMembrane; + public ModelRenderer LTailMembrane; + public ModelRenderer shape141; + public ModelRenderer ShinR; + public ModelRenderer FootR; + public ModelRenderer MidtoeR1; + public ModelRenderer RighttoeR1; + public ModelRenderer LefttoeR1; + public ModelRenderer MidtoeR2; + public ModelRenderer RighttoeR2; + public ModelRenderer LefttoeR2; + public ModelRenderer ShinL; + public ModelRenderer FootL; + public ModelRenderer MidtoeL1; + public ModelRenderer LefttoeL1; + public ModelRenderer RighttoeL1; + public ModelRenderer MidtoeL2; + public ModelRenderer LefttoeL2; + public ModelRenderer RighttoeL2; + public ModelRenderer shape135; + public ModelRenderer shape137; + public ModelRenderer shape139; + public ModelRenderer Neck2; + public ModelRenderer Neck3; + public ModelRenderer Head1; + public ModelRenderer Headtop; + public ModelRenderer Mouthback_MOVE_TO_OPEN; + public ModelRenderer HornbaseR; + public ModelRenderer HornbaseL; + public ModelRenderer Headmidhornlowerright; + public ModelRenderer Headmidhornlowerleft; + public ModelRenderer BrowfrontR; + public ModelRenderer BrowfrontL; + public ModelRenderer Upperjaw; + public ModelRenderer shape113; + public ModelRenderer ToothR4; + public ModelRenderer ToothL4; + public ModelRenderer ToothR3; + public ModelRenderer ToothL3; + public ModelRenderer ToothR2; + public ModelRenderer ToothL2; + public ModelRenderer ToothR1; + public ModelRenderer ToothL1; + public ModelRenderer shape114; + public ModelRenderer shape115; + public ModelRenderer Lowerjawback; + public ModelRenderer Lowerjaw; + public ModelRenderer Underlowerjaw2; + public ModelRenderer Underlowerjaw; + public ModelRenderer ToothlowerR3; + public ModelRenderer ToothlowerR3_1; + public ModelRenderer ToothlowerR2; + public ModelRenderer ToothlowerL2; + public ModelRenderer ToothlowerR1; + public ModelRenderer ToothlowerL1; + public ModelRenderer Underlowerjaw3; + public ModelRenderer shape108; + public ModelRenderer HornmidR; + public ModelRenderer HornendR; + public ModelRenderer HornmidL; + public ModelRenderer HornendL; + public ModelRenderer Headmidhornupperright; + public ModelRenderer Headmidhornupperleft; + public ModelRenderer RBrowback; + public ModelRenderer BrowbackL; + public ModelRenderer Wingupperarmright; + public ModelRenderer Winglowerarmright; + public ModelRenderer Wingmembramesmallright; + public ModelRenderer Wingfinger1right; + public ModelRenderer Wingmembramemidright; + public ModelRenderer Rfinger1; + public ModelRenderer Wingfinger2right; + public ModelRenderer Wingfinger3right; + public ModelRenderer Wingfingerlower1right; + public ModelRenderer Wingmembramelargeright1; + public ModelRenderer Wingfingerlower2right; + public ModelRenderer Wingfingerlower3right; + public ModelRenderer Wingmembramelargeright2; + public ModelRenderer Rfinger2; + public ModelRenderer Wingupperarmleft; + public ModelRenderer Winglowerarmleft; + public ModelRenderer Wingmembramesmallleft; + public ModelRenderer Wingfinger1left; + public ModelRenderer Wingmembramemidleft; + public ModelRenderer Lfinger1; + public ModelRenderer Wingfingerlower1left; + public ModelRenderer Wingfinger2left; + public ModelRenderer Wingfinger3left; + public ModelRenderer Wingmembramelargeleft1; + public ModelRenderer Wingmembramelargeleft2; + public ModelRenderer Wingfingerlower2left; + public ModelRenderer Wingfingerlower3left; + public ModelRenderer Lfinger2; + public ModelRenderer shape123; + public ModelRenderer shape125; + public ModelRenderer shape126; + public ModelRenderer shape128; + public ModelRenderer shape129; - public ModelAshDragon() - { - this.textureWidth = 512; - this.textureHeight = 512; - this.Wingshoulderleft = new ModelRenderer(this, 470, 230); - this.Wingshoulderleft.setRotationPoint(3.0F, 4.0F, 4.0F); - this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderleft, 0.5009094953223726F, 0.27314402793711257F, 0.6829473363053812F); - this.ToothlowerR3_1 = new ModelRenderer(this, 50, 420); - this.ToothlowerR3_1.setRotationPoint(2.5F, 0.0F, -6.9F); - this.ToothlowerR3_1.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerR3_1, 0.18203784098300857F, 0.0F, 0.31869712141416456F); - this.FootL = new ModelRenderer(this, 180, 190); - this.FootL.mirror = true; - this.FootL.setRotationPoint(-0.01F, 12.0F, 6.0F); - this.FootL.addBox(-4.0F, 0.0F, -5.0F, 4, 9, 5, 0.0F); - this.setRotateAngle(FootL, -0.7838273670706533F, 0.0F, 0.0F); - this.Neck3 = new ModelRenderer(this, 5, 320); - this.Neck3.setRotationPoint(0.0F, 0.5F, -6.0F); - this.Neck3.addBox(-2.5F, 0.0F, -5.0F, 5, 9, 9, 0.0F); - this.setRotateAngle(Neck3, 0.136659280431156F, 0.0F, 0.0F); - this.shape108 = new ModelRenderer(this, 125, 165); - this.shape108.setRotationPoint(0.0F, 0.8F, -5.8F); - this.shape108.addBox(-2.0F, -1.0F, -2.0F, 4, 1, 2, 0.0F); - this.setRotateAngle(shape108, -0.16179202165987433F, 0.0F, 0.0F); - this.RighttoeL2 = new ModelRenderer(this, 180, 170); - this.RighttoeL2.mirror = true; - this.RighttoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); - this.RighttoeL2.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(RighttoeL2, -0.36425021489121656F, 0.0F, 0.0F); - this.LTailMembrane = new ModelRenderer(this, 380, 250); - this.LTailMembrane.setRotationPoint(0.0F, 0.21F, 1.0F); - this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 7, 1, 15, 0.0F); - this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); - this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); - this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); - this.Wingmembramesmallright.addBox(-24.0F, 0.0F, 0.0F, 24, 0, 18, 0.0F); - this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); - this.shape144 = new ModelRenderer(this, 125, 175); - this.shape144.setRotationPoint(4.0F, 0.0F, 0.0F); - this.shape144.addBox(0.0F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape144, -0.36425021489121656F, 0.0F, 0.22759093446006054F); - this.shape152 = new ModelRenderer(this, 125, 175); - this.shape152.setRotationPoint(3.0F, 0.0F, 5.0F); - this.shape152.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(shape152, -0.136659280431156F, 0.136659280431156F, 0.18203784098300857F); - this.Headmidhornupperright = new ModelRenderer(this, 190, 430); - this.Headmidhornupperright.setRotationPoint(-1.0F, 0.1F, 4.9F); - this.Headmidhornupperright.addBox(0.0F, 0.0F, 0.0F, 2, 1, 6, 0.0F); - this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.22759093446006054F, 0.0F); - this.Lfinger1 = new ModelRenderer(this, 350, 140); - this.Lfinger1.setRotationPoint(24.0F, 2.0F, 3.0F); - this.Lfinger1.addBox(-2.0F, 0.0F, -5.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Lfinger1, 0.0F, -1.0016444577195458F, 0.0F); - this.shape150 = new ModelRenderer(this, 0, 0); - this.shape150.setRotationPoint(2.4F, 0.0F, 0.0F); - this.shape150.addBox(0.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); - this.setRotateAngle(shape150, -0.27314402793711257F, -0.136659280431156F, 0.18203784098300857F); - this.ToothR1 = new ModelRenderer(this, 50, 420); - this.ToothR1.setRotationPoint(-2.7F, 3.5F, -1.0F); - this.ToothR1.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothR1, 0.0F, 0.0F, 0.31869712141416456F); - this.ShinR = new ModelRenderer(this, 180, 210); - this.ShinR.setRotationPoint(0.7F, 13.0F, 0.0F); - this.ShinR.addBox(0.0F, 0.0F, 0.0F, 4, 12, 6, 0.0F); - this.setRotateAngle(ShinR, 1.0471975511965976F, 0.0F, -0.136659280431156F); - this.Lfinger2 = new ModelRenderer(this, 330, 140); - this.Lfinger2.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Lfinger2.addBox(-2.0F, 0.0F, -4.0F, 2, 2, 4, 0.0F); - this.setRotateAngle(Lfinger2, 0.40980330836826856F, 0.0F, 0.0F); - this.shape142 = new ModelRenderer(this, 125, 175); - this.shape142.setRotationPoint(0.0F, 0.0F, 12.0F); - this.shape142.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); - this.setRotateAngle(shape142, -0.5009094953223726F, 0.0F, 0.0F); - this.Wingmembramesmallleft = new ModelRenderer(this, 420, 280); - this.Wingmembramesmallleft.mirror = true; - this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); - this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 24, 0, 18, 0.0F); - this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); - this.Wingmembramelargeleft2 = new ModelRenderer(this, 355, 430); - this.Wingmembramelargeleft2.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeleft2.addBox(0.0F, 0.0F, 0.0F, 41, 0, 57, 0.0F); - this.ToothL3 = new ModelRenderer(this, 50, 420); - this.ToothL3.setRotationPoint(2.7F, 3.5F, -6.0F); - this.ToothL3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothL3, 0.0F, 0.0F, -0.31869712141416456F); - this.HornendL = new ModelRenderer(this, 50, 430); - this.HornendL.setRotationPoint(0.0F, 0.0F, 5.0F); - this.HornendL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 4, 0.0F); - this.setRotateAngle(HornendL, 0.0F, -0.27314402793711257F, 0.0F); - this.ThighL = new ModelRenderer(this, 180, 230); - this.ThighL.mirror = true; - this.ThighL.setRotationPoint(9.0F, 5.0F, 15.0F); - this.ThighL.addBox(-5.0F, 0.0F, 0.0F, 5, 13, 8, 0.0F); - this.setRotateAngle(ThighL, -0.4553564018453205F, 0.0F, -0.136659280431156F); - this.RighttoeR1 = new ModelRenderer(this, 180, 180); - this.RighttoeR1.setRotationPoint(1.8F, 6.0F, -4.0F); - this.RighttoeR1.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(RighttoeR1, -0.5462880558742251F, 0.40980330836826856F, 0.18203784098300857F); - this.Wingfinger1right = new ModelRenderer(this, 350, 200); - this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); - this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1right, 0.0F, 1.593485607070823F, 0.0F); - this.BrowfrontL = new ModelRenderer(this, 190, 390); - this.BrowfrontL.setRotationPoint(3.0F, 0.8F, -9.0F); - this.BrowfrontL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(BrowfrontL, 0.091106186954104F, 0.27314402793711257F, 0.0F); - this.Tail2 = new ModelRenderer(this, 5, 85); - this.Tail2.setRotationPoint(0.0F, 0.5F, 20.0F); - this.Tail2.addBox(-5.5F, 0.0F, 0.0F, 11, 12, 19, 0.0F); - this.setRotateAngle(Tail2, -0.091106186954104F, 0.0F, 0.0F); - this.shape143 = new ModelRenderer(this, 125, 175); - this.shape143.setRotationPoint(0.0F, 0.0F, 0.0F); - this.shape143.addBox(-0.5F, -3.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(shape143, -0.6373942428283291F, 0.0F, 0.0F); - this.ToothL4 = new ModelRenderer(this, 50, 420); - this.ToothL4.setRotationPoint(2.7F, 3.6F, -8.0F); - this.ToothL4.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothL4, -0.18203784098300857F, 0.0F, -0.31869712141416456F); - this.shape146 = new ModelRenderer(this, 125, 175); - this.shape146.setRotationPoint(3.0F, 0.0F, 7.0F); - this.shape146.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(shape146, -0.27314402793711257F, 0.0F, 0.045553093477052F); - this.shape123 = new ModelRenderer(this, 125, 175); - this.shape123.setRotationPoint(0.0F, -5.0F, 0.0F); - this.shape123.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); - this.setRotateAngle(shape123, -0.18203784098300857F, 0.0F, 0.091106186954104F); - this.RighttoeL1 = new ModelRenderer(this, 180, 180); - this.RighttoeL1.mirror = true; - this.RighttoeL1.setRotationPoint(-2.4F, 6.0F, -4.0F); - this.RighttoeL1.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(RighttoeL1, -0.5462880558742251F, 0.40980330836826856F, 0.18203784098300857F); - this.Underlowerjaw2 = new ModelRenderer(this, 5, 430); - this.Underlowerjaw2.setRotationPoint(0.0F, 0.0F, -7.0F); - this.Underlowerjaw2.addBox(-2.5F, -1.0F, 0.0F, 5, 1, 4, 0.0F); - this.setRotateAngle(Underlowerjaw2, -0.18203784098300857F, 0.0F, 0.0F); - this.RTailSpike = new ModelRenderer(this, 350, 300); - this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.RTailSpike.addBox(-8.0F, 0.0F, 0.0F, 8, 1, 3, 0.0F); - this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, 0.0F); - this.Wingupperarmleft = new ModelRenderer(this, 390, 230); - this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); - this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); - this.Wingmembramelargeleft1 = new ModelRenderer(this, 270, 430); - this.Wingmembramelargeleft1.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeleft1.addBox(0.0F, 0.0F, 0.0F, 37, 0, 61, 0.0F); - this.LTailSpike = new ModelRenderer(this, 350, 300); - this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 8, 1, 3, 0.0F); - this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.0F); - this.shape153 = new ModelRenderer(this, 125, 175); - this.shape153.setRotationPoint(-3.0F, 0.0F, 2.0F); - this.shape153.addBox(-1.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(shape153, -0.5009094953223726F, -0.36425021489121656F, 0.22759093446006054F); - this.shape154 = new ModelRenderer(this, 125, 175); - this.shape154.setRotationPoint(4.0F, 0.0F, 9.0F); - this.shape154.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); - this.setRotateAngle(shape154, -0.36425021489121656F, 0.0F, -0.136659280431156F); - this.Wingmembramemidright = new ModelRenderer(this, 350, 340); - this.Wingmembramemidright.mirror = true; - this.Wingmembramemidright.setRotationPoint(-20.5F, 2.9F, 5.1F); - this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); - this.BrowbackL = new ModelRenderer(this, 190, 380); - this.BrowbackL.setRotationPoint(0.0F, 0.0F, 5.0F); - this.BrowbackL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(BrowbackL, 0.0F, -0.4553564018453205F, 0.0F); - this.shape149 = new ModelRenderer(this, 125, 175); - this.shape149.setRotationPoint(-4.0F, 0.0F, 15.0F); - this.shape149.addBox(-1.0F, -6.0F, 0.0F, 1, 6, 2, 0.0F); - this.setRotateAngle(shape149, -0.36425021489121656F, 0.18203784098300857F, 0.045553093477052F); - this.LefttoeR1 = new ModelRenderer(this, 180, 180); - this.LefttoeR1.setRotationPoint(2.4F, 6.0F, -4.0F); - this.LefttoeR1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(LefttoeR1, -0.5462880558742251F, -0.40980330836826856F, -0.18203784098300857F); - this.Lowerjaw = new ModelRenderer(this, 5, 410); - this.Lowerjaw.setRotationPoint(0.0F, -1.0F, -7.0F); - this.Lowerjaw.addBox(-2.5F, -1.0F, -8.0F, 5, 1, 8, 0.0F); - this.shape147 = new ModelRenderer(this, 125, 175); - this.shape147.setRotationPoint(2.0F, 0.0F, 12.0F); - this.shape147.addBox(0.0F, -6.0F, 0.0F, 1, 6, 2, 0.0F); - this.setRotateAngle(shape147, -0.40980330836826856F, 0.22759093446006054F, 0.27314402793711257F); - this.shape141 = new ModelRenderer(this, 125, 175); - this.shape141.setRotationPoint(0.0F, -4.0F, 0.0F); - this.shape141.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape141, -0.18203784098300857F, 0.0F, 0.27314402793711257F); - this.shape151 = new ModelRenderer(this, 125, 175); - this.shape151.setRotationPoint(-2.8F, 0.0F, 3.0F); - this.shape151.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); - this.setRotateAngle(shape151, -0.18203784098300857F, 0.0F, -0.136659280431156F); - this.ToothlowerL2 = new ModelRenderer(this, 50, 420); - this.ToothlowerL2.setRotationPoint(2.5F, 0.0F, -4.7F); - this.ToothlowerL2.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerL2, 0.0F, 0.0F, 0.31869712141416456F); - this.Tail4 = new ModelRenderer(this, 5, 150); - this.Tail4.setRotationPoint(0.0F, 0.5F, 17.0F); - this.Tail4.addBox(-3.5F, 0.0F, 0.0F, 7, 8, 19, 0.0F); - this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); - this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); - this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); - this.shape125 = new ModelRenderer(this, 125, 175); - this.shape125.setRotationPoint(0.0F, -5.0F, 0.0F); - this.shape125.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape125, -0.18203784098300857F, 0.0F, 0.091106186954104F); - this.Tail1 = new ModelRenderer(this, 5, 45); - this.Tail1.setRotationPoint(0.0F, 0.5F, 18.0F); - this.Tail1.addBox(-6.0F, 0.0F, 0.0F, 12, 15, 21, 0.0F); - this.setRotateAngle(Tail1, -0.5009094953223726F, 0.0F, 0.0F); - this.RTailMembrane = new ModelRenderer(this, 381, 270); - this.RTailMembrane.mirror = true; - this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 1.0F); - this.RTailMembrane.addBox(-6.0F, 0.0F, 0.0F, 6, 1, 15, 0.0F); - this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); - this.Wingupperarmright = new ModelRenderer(this, 390, 230); - this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); - this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); - this.Lowerjawback = new ModelRenderer(this, 5, 400); - this.Lowerjawback.setRotationPoint(0.0F, 4.5F, 1.1F); - this.Lowerjawback.addBox(-3.0F, -2.0F, -7.0F, 6, 2, 7, 0.0F); - this.setRotateAngle(Lowerjawback, 0.136659280431156F, 0.0F, 0.0F); - this.shape126 = new ModelRenderer(this, 125, 175); - this.shape126.setRotationPoint(0.0F, -5.0F, 2.0F); - this.shape126.addBox(-0.5F, -4.0F, -2.0F, 1, 4, 2, 0.0F); - this.setRotateAngle(shape126, 0.27314402793711257F, 0.0F, -0.27314402793711257F); - this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); - this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); - this.shape138 = new ModelRenderer(this, 125, 190); - this.shape138.setRotationPoint(0.0F, 0.0F, 18.0F); - this.shape138.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(shape138, -0.31869712141416456F, 0.0F, 0.0F); - this.ThighR = new ModelRenderer(this, 180, 230); - this.ThighR.setRotationPoint(-9.0F, 5.0F, 15.0F); - this.ThighR.addBox(0.0F, 0.0F, 0.0F, 5, 13, 8, 0.0F); - this.setRotateAngle(ThighR, -0.4553564018453205F, 0.0F, 0.136659280431156F); - this.Head1 = new ModelRenderer(this, 5, 340); - this.Head1.setRotationPoint(0.0F, -0.2F, -5.5F); - this.Head1.addBox(-3.5F, 0.0F, -7.0F, 7, 6, 7, 0.0F); - this.setRotateAngle(Head1, 0.136659280431156F, 0.0F, 0.0F); - this.Tail3 = new ModelRenderer(this, 5, 120); - this.Tail3.setRotationPoint(0.0F, 0.5F, 18.0F); - this.Tail3.addBox(-4.5F, 0.0F, 0.0F, 9, 10, 18, 0.0F); - this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); - this.shape127 = new ModelRenderer(this, 125, 210); - this.shape127.setRotationPoint(0.0F, 0.0F, 15.0F); - this.shape127.addBox(-1.0F, -6.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(shape127, -0.6373942428283291F, 0.0F, 0.0F); - this.shape155 = new ModelRenderer(this, 125, 175); - this.shape155.setRotationPoint(-3.5F, 0.0F, 9.0F); - this.shape155.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(shape155, -0.40980330836826856F, -0.045553093477052F, 0.136659280431156F); - this.shape137 = new ModelRenderer(this, 125, 175); - this.shape137.setRotationPoint(0.0F, -5.0F, 0.0F); - this.shape137.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(shape137, -0.136659280431156F, 0.136659280431156F, 0.18203784098300857F); - this.Wingmembramelargeright1 = new ModelRenderer(this, 270, 430); - this.Wingmembramelargeright1.mirror = true; - this.Wingmembramelargeright1.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeright1.addBox(-37.0F, 0.0F, 0.0F, 37, 0, 61, 0.0F); - this.Neck1 = new ModelRenderer(this, 5, 270); - this.Neck1.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Neck1.addBox(-4.5F, 0.0F, -6.0F, 9, 13, 10, 0.0F); - this.setRotateAngle(Neck1, -0.091106186954104F, 0.0F, 0.0F); - this.shape115 = new ModelRenderer(this, 125, 255); - this.shape115.setRotationPoint(0.0F, 0.7F, 6.8F); - this.shape115.addBox(-1.5F, 0.0F, 0.0F, 3, 1, 6, 0.0F); - this.setRotateAngle(shape115, -0.17575465567582899F, 0.0F, 0.0F); - this.shape140 = new ModelRenderer(this, 125, 190); - this.shape140.setRotationPoint(0.0F, 0.0F, 5.0F); - this.shape140.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(shape140, -0.40980330836826856F, 0.0F, -0.136659280431156F); - this.MidtoeL1 = new ModelRenderer(this, 180, 180); - this.MidtoeL1.mirror = true; - this.MidtoeL1.setRotationPoint(-2.0F, 6.1F, -4.0F); - this.MidtoeL1.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(MidtoeL1, -0.5462880558742251F, 0.0F, 0.0F); - this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerright.setRotationPoint(-2.5F, 2.7F, -3.9F); - this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Headmidhornlowerright, 0.31869712141416456F, -0.31869712141416456F, -0.9560913642424937F); - this.shape114 = new ModelRenderer(this, 125, 240); - this.shape114.setRotationPoint(0.0F, -4.0F, 3.0F); - this.shape114.addBox(-2.0F, 0.0F, 0.0F, 4, 3, 7, 0.0F); - this.setRotateAngle(shape114, -0.6373942428283291F, 0.0F, 0.0F); - this.RBrowback = new ModelRenderer(this, 190, 380); - this.RBrowback.setRotationPoint(0.0F, 0.0F, 5.0F); - this.RBrowback.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(RBrowback, 0.0F, 0.4553564018453205F, 0.0F); - this.shape128 = new ModelRenderer(this, 125, 175); - this.shape128.setRotationPoint(0.0F, -6.0F, 0.0F); - this.shape128.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape128, -0.18203784098300857F, 0.0F, 0.0F); - this.LefttoeR2 = new ModelRenderer(this, 180, 170); - this.LefttoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); - this.LefttoeR2.addBox(0.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(LefttoeR2, -0.36425021489121656F, 0.0F, 0.0F); - this.shape129 = new ModelRenderer(this, 125, 175); - this.shape129.setRotationPoint(0.0F, -5.0F, 2.0F); - this.shape129.addBox(-0.5F, -5.0F, -2.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape129, 0.31869712141416456F, 0.0F, 0.18203784098300857F); - this.Bodyfront = new ModelRenderer(this, 5, 5); - this.Bodyfront.setRotationPoint(0.0F, -4.0F, -14.0F); - this.Bodyfront.addBox(-6.5F, 0.0F, 0.0F, 13, 16, 18, 0.0F); - this.setRotateAngle(Bodyfront, 0.40980330836826856F, 0.0F, 0.0F); - this.Rfinger2 = new ModelRenderer(this, 330, 140); - this.Rfinger2.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Rfinger2.addBox(0.0F, 0.0F, -4.0F, 2, 2, 4, 0.0F); - this.setRotateAngle(Rfinger2, 0.40980330836826856F, 0.0F, 0.0F); - this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); - this.Wingmembramemidleft.setRotationPoint(20.5F, 2.9F, 5.1F); - this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); - this.shape139 = new ModelRenderer(this, 125, 175); - this.shape139.setRotationPoint(0.0F, -4.0F, 0.0F); - this.shape139.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); - this.setRotateAngle(shape139, -0.27314402793711257F, 0.0F, 0.0F); - this.ToothlowerR2 = new ModelRenderer(this, 50, 420); - this.ToothlowerR2.setRotationPoint(-2.5F, 0.0F, -4.7F); - this.ToothlowerR2.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerR2, 0.0F, 0.0F, -0.31869712141416456F); - this.HornmidR = new ModelRenderer(this, 50, 410); - this.HornmidR.setRotationPoint(-2.0F, 0.0F, 4.0F); - this.HornmidR.addBox(0.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(HornmidR, 0.0F, 0.045553093477052F, 0.0F); - this.HornbaseL = new ModelRenderer(this, 50, 400); - this.HornbaseL.setRotationPoint(1.5F, 0.3F, -3.8F); - this.HornbaseL.addBox(-1.0F, 0.0F, 0.0F, 3, 2, 4, 0.0F); - this.setRotateAngle(HornbaseL, 0.36425021489121656F, -0.091106186954104F, 0.9560913642424937F); - this.RighttoeR2 = new ModelRenderer(this, 180, 170); - this.RighttoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); - this.RighttoeR2.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(RighttoeR2, -0.40980330836826856F, 0.0F, 0.0F); - this.Wingfinger3left = new ModelRenderer(this, 390, 170); - this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); - this.ShinL = new ModelRenderer(this, 180, 210); - this.ShinL.mirror = true; - this.ShinL.setRotationPoint(-0.7F, 13.0F, 0.0F); - this.ShinL.addBox(-4.0F, 0.0F, 0.0F, 4, 12, 6, 0.0F); - this.setRotateAngle(ShinL, 1.0471975511965976F, 0.0F, 0.136659280431156F); - this.Underlowerjaw3 = new ModelRenderer(this, 5, 420); - this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 4.0F); - this.Underlowerjaw3.addBox(-2.5F, -1.0F, 0.0F, 5, 1, 5, 0.0F); - this.setRotateAngle(Underlowerjaw3, 0.136659280431156F, 0.0F, 0.0F); - this.Wingshoulderright = new ModelRenderer(this, 470, 230); - this.Wingshoulderright.setRotationPoint(-3.0F, 4.0F, 4.0F); - this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderright, 0.5009094953223726F, -0.27314402793711257F, -0.6829473363053812F); - this.shape122 = new ModelRenderer(this, 125, 200); - this.shape122.setRotationPoint(0.0F, 0.0F, 1.0F); - this.shape122.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(shape122, -0.5009094953223726F, 0.0F, 0.136659280431156F); - this.Winglowerarmleft = new ModelRenderer(this, 400, 215); - this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); - this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); - this.Wingmembramelargeright2 = new ModelRenderer(this, 355, 430); - this.Wingmembramelargeright2.mirror = true; - this.Wingmembramelargeright2.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeright2.addBox(-41.0F, 0.0F, 0.0F, 41, 0, 57, 0.0F); - this.Wingfinger3right = new ModelRenderer(this, 390, 170); - this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); - this.Wingfinger1left = new ModelRenderer(this, 350, 200); - this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); - this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1left, 0.0F, -1.593485607070823F, 0.0F); - this.shape134 = new ModelRenderer(this, 125, 200); - this.shape134.setRotationPoint(0.0F, 0.0F, 4.3F); - this.shape134.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(shape134, -0.22759093446006054F, 0.0F, -0.091106186954104F); - this.ToothlowerR1 = new ModelRenderer(this, 50, 420); - this.ToothlowerR1.setRotationPoint(-2.5F, 0.0F, -2.4F); - this.ToothlowerR1.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerR1, 0.0F, 0.0F, -0.31869712141416456F); - this.Tail5 = new ModelRenderer(this, 5, 180); - this.Tail5.setRotationPoint(0.0F, 0.5F, 18.0F); - this.Tail5.addBox(-2.5F, 0.0F, 0.0F, 5, 6, 20, 0.0F); - this.setRotateAngle(Tail5, 0.091106186954104F, 0.0F, 0.0F); - this.shape113 = new ModelRenderer(this, 125, 225); - this.shape113.setRotationPoint(0.0F, 3.4F, -5.6F); - this.shape113.addBox(-2.5F, -4.0F, 0.0F, 5, 4, 4, 0.0F); - this.setRotateAngle(shape113, 0.6609561877302526F, 0.0F, 0.0F); - this.HornbaseR = new ModelRenderer(this, 50, 400); - this.HornbaseR.setRotationPoint(-1.5F, 0.3F, -3.8F); - this.HornbaseR.addBox(-2.0F, 0.0F, 0.0F, 3, 2, 4, 0.0F); - this.setRotateAngle(HornbaseR, 0.36425021489121656F, 0.091106186954104F, -0.9560913642424937F); - this.shape145 = new ModelRenderer(this, 125, 175); - this.shape145.setRotationPoint(-4.0F, 0.0F, 6.0F); - this.shape145.addBox(0.0F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape145, -0.36425021489121656F, 0.0F, -0.36425021489121656F); - this.LefttoeL1 = new ModelRenderer(this, 180, 180); - this.LefttoeL1.mirror = true; - this.LefttoeL1.setRotationPoint(-1.8F, 6.0F, -4.0F); - this.LefttoeL1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(LefttoeL1, -0.5462880558742251F, -0.40980330836826856F, -0.18203784098300857F); - this.shape135 = new ModelRenderer(this, 125, 175); - this.shape135.setRotationPoint(0.0F, -5.0F, 2.0F); - this.shape135.addBox(-0.5F, -8.0F, -2.0F, 1, 8, 2, 0.0F); - this.setRotateAngle(shape135, 0.27314402793711257F, 0.0F, -0.136659280431156F); - this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); - this.Headmidhornupperleft.setRotationPoint(1.0F, 0.1F, 4.9F); - this.Headmidhornupperleft.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 6, 0.0F); - this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.22759093446006054F, 0.0F); - this.Winglowerarmright = new ModelRenderer(this, 400, 215); - this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); - this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); - this.ToothL1 = new ModelRenderer(this, 50, 420); - this.ToothL1.setRotationPoint(2.7F, 3.5F, -1.0F); - this.ToothL1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothL1, 0.0F, 0.0F, -0.31869712141416456F); - this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); - this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); - this.ToothL2 = new ModelRenderer(this, 50, 420); - this.ToothL2.setRotationPoint(2.7F, 3.5F, -3.5F); - this.ToothL2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothL2, 0.0F, 0.0F, -0.31869712141416456F); - this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); - this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); - this.shape124 = new ModelRenderer(this, 125, 200); - this.shape124.setRotationPoint(0.0F, 0.0F, 8.0F); - this.shape124.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(shape124, -0.5462880558742251F, 0.0F, 0.0F); - this.shape136 = new ModelRenderer(this, 125, 200); - this.shape136.setRotationPoint(0.0F, 0.0F, 11.0F); - this.shape136.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(shape136, -0.27314402793711257F, 0.0F, 0.0F); - this.Tail8 = new ModelRenderer(this, 5, 220); - this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); - this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); - this.FootR = new ModelRenderer(this, 180, 190); - this.FootR.setRotationPoint(0.01F, 12.0F, 6.0F); - this.FootR.addBox(0.0F, 0.0F, -5.0F, 4, 9, 5, 0.0F); - this.setRotateAngle(FootR, -0.7740535232594852F, 0.0F, 0.0F); - this.BrowfrontR = new ModelRenderer(this, 190, 390); - this.BrowfrontR.setRotationPoint(-3.0F, 0.8F, -9.0F); - this.BrowfrontR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(BrowfrontR, 0.091106186954104F, -0.27314402793711257F, 0.0F); - this.HornendR = new ModelRenderer(this, 50, 430); - this.HornendR.setRotationPoint(0.0F, 0.0F, 5.0F); - this.HornendR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 4, 0.0F); - this.setRotateAngle(HornendR, 0.0F, 0.27314402793711257F, 0.0F); - this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); - this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); - this.Mouthback_MOVE_TO_OPEN = new ModelRenderer(this, 5, 390); - this.Mouthback_MOVE_TO_OPEN.setRotationPoint(0.01F, 3.5F, -0.3F); - this.Mouthback_MOVE_TO_OPEN.addBox(-2.5F, 0.0F, -5.0F, 5, 4, 5, 0.0F); - this.setRotateAngle(Mouthback_MOVE_TO_OPEN, -0.18203784098300857F, 0.0F, 0.0F); - this.Tail7 = new ModelRenderer(this, 5, 240); - this.Tail7.setRotationPoint(0.0F, 0.3F, 19.0F); - this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); - this.setRotateAngle(Tail7, 0.18203784098300857F, 0.0F, 0.0F); - this.ToothR2 = new ModelRenderer(this, 50, 420); - this.ToothR2.setRotationPoint(-2.7F, 3.5F, -3.5F); - this.ToothR2.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothR2, 0.0F, 0.0F, 0.31869712141416456F); - this.Upperjaw = new ModelRenderer(this, 5, 370); - this.Upperjaw.setRotationPoint(-0.01F, 0.7F, -0.1F); - this.Upperjaw.addBox(-3.0F, 0.0F, -8.0F, 6, 5, 10, 0.0F); - this.setRotateAngle(Upperjaw, -0.091106186954104F, 0.0F, 0.0F); - this.Underlowerjaw = new ModelRenderer(this, 5, 440); - this.Underlowerjaw.setRotationPoint(0.0F, 1.0F, 0.0F); - this.Underlowerjaw.addBox(-2.0F, -1.0F, -6.0F, 4, 1, 6, 0.0F); - this.setRotateAngle(Underlowerjaw, -0.045553093477052F, 0.0F, 0.0F); - this.ToothlowerR3 = new ModelRenderer(this, 50, 420); - this.ToothlowerR3.setRotationPoint(-2.5F, 0.0F, -6.9F); - this.ToothlowerR3.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerR3, 0.18203784098300857F, 0.0F, -0.31869712141416456F); - this.Wingfinger2right = new ModelRenderer(this, 330, 150); - this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); - this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); - this.ToothR4 = new ModelRenderer(this, 50, 420); - this.ToothR4.setRotationPoint(-2.7F, 3.6F, -8.0F); - this.ToothR4.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothR4, -0.18203784098300857F, 0.0F, 0.31869712141416456F); - this.MidtoeL2 = new ModelRenderer(this, 180, 170); - this.MidtoeL2.mirror = true; - this.MidtoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); - this.MidtoeL2.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(MidtoeL2, -0.4553564018453205F, 0.0F, 0.0F); - this.ToothR3 = new ModelRenderer(this, 50, 420); - this.ToothR3.setRotationPoint(-2.7F, 3.5F, -6.0F); - this.ToothR3.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothR3, 0.0F, 0.0F, 0.31869712141416456F); - this.Neck2 = new ModelRenderer(this, 5, 299); - this.Neck2.setRotationPoint(0.0F, 0.7F, -6.0F); - this.Neck2.addBox(-3.5F, 0.0F, -6.0F, 7, 11, 9, 0.0F); - this.setRotateAngle(Neck2, 0.045553093477052F, 0.0F, 0.0F); - this.Headtop = new ModelRenderer(this, 5, 355); - this.Headtop.setRotationPoint(0.01F, 0.2F, -7.0F); - this.Headtop.addBox(-3.0F, 0.0F, -8.0F, 6, 4, 8, 0.0F); - this.setRotateAngle(Headtop, 0.045553093477052F, 0.0F, 0.0F); - this.ToothlowerL1 = new ModelRenderer(this, 50, 420); - this.ToothlowerL1.setRotationPoint(2.5F, 0.0F, -2.4F); - this.ToothlowerL1.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerL1, 0.0F, 0.0F, 0.31869712141416456F); - this.Rfinger1 = new ModelRenderer(this, 350, 140); - this.Rfinger1.setRotationPoint(-24.0F, 2.0F, 3.0F); - this.Rfinger1.addBox(0.0F, 0.0F, -5.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Rfinger1, 0.31869712141416456F, 1.0016444577195458F, 0.0F); - this.HornmidL = new ModelRenderer(this, 50, 410); - this.HornmidL.setRotationPoint(2.0F, 0.0F, 4.0F); - this.HornmidL.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(HornmidL, 0.0F, -0.045553093477052F, 0.0F); - this.MidtoeR1 = new ModelRenderer(this, 180, 180); - this.MidtoeR1.setRotationPoint(2.0F, 6.1F, -4.0F); - this.MidtoeR1.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(MidtoeR1, -0.6373942428283291F, 0.0F, 0.0F); - this.Wingfinger2left = new ModelRenderer(this, 330, 150); - this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); - this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); - this.MidtoeR2 = new ModelRenderer(this, 180, 170); - this.MidtoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); - this.MidtoeR2.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(MidtoeR2, -0.4553564018453205F, 0.0F, 0.0F); - this.LefttoeL2 = new ModelRenderer(this, 180, 170); - this.LefttoeL2.mirror = true; - this.LefttoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); - this.LefttoeL2.addBox(0.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(LefttoeL2, -0.40980330836826856F, 0.0F, 0.0F); - this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerleft.setRotationPoint(2.5F, 2.7F, -3.9F); - this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Headmidhornlowerleft, 0.31869712141416456F, 0.31869712141416456F, 0.9560913642424937F); - this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); - this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); - this.shape148 = new ModelRenderer(this, 125, 175); - this.shape148.setRotationPoint(-2.0F, 0.2F, 11.3F); - this.shape148.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); - this.setRotateAngle(shape148, 0.0F, 0.0F, 0.091106186954104F); - this.Bodyfront.addChild(this.Wingshoulderleft); - this.Lowerjaw.addChild(this.ToothlowerR3_1); - this.ShinL.addChild(this.FootL); - this.Neck2.addChild(this.Neck3); - this.Underlowerjaw2.addChild(this.shape108); - this.RighttoeL1.addChild(this.RighttoeL2); - this.LTailSpike.addChild(this.LTailMembrane); - this.Wingupperarmright.addChild(this.Wingmembramesmallright); - this.Bodyfront.addChild(this.shape144); - this.Tail1.addChild(this.shape152); - this.Headmidhornlowerright.addChild(this.Headmidhornupperright); - this.Winglowerarmleft.addChild(this.Lfinger1); - this.Tail1.addChild(this.shape150); - this.Upperjaw.addChild(this.ToothR1); - this.ThighR.addChild(this.ShinR); - this.Lfinger1.addChild(this.Lfinger2); - this.Tail2.addChild(this.shape142); - this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); - this.Wingfingerlower1left.addChild(this.Wingmembramelargeleft2); - this.Upperjaw.addChild(this.ToothL3); - this.HornmidL.addChild(this.HornendL); - this.Tail1.addChild(this.ThighL); - this.FootR.addChild(this.RighttoeR1); - this.Winglowerarmright.addChild(this.Wingfinger1right); - this.Head1.addChild(this.BrowfrontL); - this.Tail1.addChild(this.Tail2); - this.Tail3.addChild(this.shape143); - this.Upperjaw.addChild(this.ToothL4); - this.Bodyfront.addChild(this.shape146); - this.shape122.addChild(this.shape123); - this.FootL.addChild(this.RighttoeL1); - this.Lowerjawback.addChild(this.Underlowerjaw2); - this.Tail8.addChild(this.RTailSpike); - this.Wingshoulderleft.addChild(this.Wingupperarmleft); - this.Wingfinger1left.addChild(this.Wingmembramelargeleft1); - this.Tail8.addChild(this.LTailSpike); - this.Bodyfront.addChild(this.shape153); - this.Tail1.addChild(this.shape154); - this.Winglowerarmright.addChild(this.Wingmembramemidright); - this.BrowfrontL.addChild(this.BrowbackL); - this.Bodyfront.addChild(this.shape149); - this.FootR.addChild(this.LefttoeR1); - this.Lowerjawback.addChild(this.Lowerjaw); - this.Bodyfront.addChild(this.shape147); - this.shape140.addChild(this.shape141); - this.Tail1.addChild(this.shape151); - this.Lowerjaw.addChild(this.ToothlowerL2); - this.Tail3.addChild(this.Tail4); - this.Wingfinger1right.addChild(this.Wingfingerlower1right); - this.shape124.addChild(this.shape125); - this.Bodyfront.addChild(this.Tail1); - this.RTailSpike.addChild(this.RTailMembrane); - this.Wingshoulderright.addChild(this.Wingupperarmright); - this.Mouthback_MOVE_TO_OPEN.addChild(this.Lowerjawback); - this.shape125.addChild(this.shape126); - this.Wingfinger2right.addChild(this.Wingfingerlower2right); - this.Tail1.addChild(this.shape138); - this.Tail1.addChild(this.ThighR); - this.Neck3.addChild(this.Head1); - this.Tail2.addChild(this.Tail3); - this.Bodyfront.addChild(this.shape127); - this.Tail1.addChild(this.shape155); - this.shape136.addChild(this.shape137); - this.Wingfinger1right.addChild(this.Wingmembramelargeright1); - this.Bodyfront.addChild(this.Neck1); - this.shape114.addChild(this.shape115); - this.Tail2.addChild(this.shape140); - this.FootL.addChild(this.MidtoeL1); - this.Head1.addChild(this.Headmidhornlowerright); - this.shape113.addChild(this.shape114); - this.BrowfrontR.addChild(this.RBrowback); - this.shape127.addChild(this.shape128); - this.LefttoeR1.addChild(this.LefttoeR2); - this.shape128.addChild(this.shape129); - this.Rfinger1.addChild(this.Rfinger2); - this.Winglowerarmleft.addChild(this.Wingmembramemidleft); - this.shape138.addChild(this.shape139); - this.Lowerjaw.addChild(this.ToothlowerR2); - this.HornbaseR.addChild(this.HornmidR); - this.Head1.addChild(this.HornbaseL); - this.RighttoeR1.addChild(this.RighttoeR2); - this.Wingfinger1left.addChild(this.Wingfinger3left); - this.ThighL.addChild(this.ShinL); - this.Underlowerjaw2.addChild(this.Underlowerjaw3); - this.Bodyfront.addChild(this.Wingshoulderright); - this.Bodyfront.addChild(this.shape122); - this.Wingupperarmleft.addChild(this.Winglowerarmleft); - this.Wingfingerlower1right.addChild(this.Wingmembramelargeright2); - this.Wingfinger1right.addChild(this.Wingfinger3right); - this.Winglowerarmleft.addChild(this.Wingfinger1left); - this.Tail1.addChild(this.shape134); - this.Lowerjaw.addChild(this.ToothlowerR1); - this.Tail4.addChild(this.Tail5); - this.Headtop.addChild(this.shape113); - this.Head1.addChild(this.HornbaseR); - this.Bodyfront.addChild(this.shape145); - this.FootL.addChild(this.LefttoeL1); - this.shape134.addChild(this.shape135); - this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); - this.Wingupperarmright.addChild(this.Winglowerarmright); - this.Upperjaw.addChild(this.ToothL1); - this.Wingfinger3left.addChild(this.Wingfingerlower3left); - this.Upperjaw.addChild(this.ToothL2); - this.Wingfinger2left.addChild(this.Wingfingerlower2left); - this.Bodyfront.addChild(this.shape124); - this.Tail1.addChild(this.shape136); - this.Tail7.addChild(this.Tail8); - this.ShinR.addChild(this.FootR); - this.Head1.addChild(this.BrowfrontR); - this.HornmidR.addChild(this.HornendR); - this.Wingfinger3right.addChild(this.Wingfingerlower3right); - this.Head1.addChild(this.Mouthback_MOVE_TO_OPEN); - this.Tail5.addChild(this.Tail7); - this.Upperjaw.addChild(this.ToothR2); - this.Headtop.addChild(this.Upperjaw); - this.Lowerjaw.addChild(this.Underlowerjaw); - this.Lowerjaw.addChild(this.ToothlowerR3); - this.Wingfinger1right.addChild(this.Wingfinger2right); - this.Upperjaw.addChild(this.ToothR4); - this.MidtoeL1.addChild(this.MidtoeL2); - this.Upperjaw.addChild(this.ToothR3); - this.Neck1.addChild(this.Neck2); - this.Head1.addChild(this.Headtop); - this.Lowerjaw.addChild(this.ToothlowerL1); - this.Winglowerarmright.addChild(this.Rfinger1); - this.HornbaseL.addChild(this.HornmidL); - this.FootR.addChild(this.MidtoeR1); - this.Wingfinger1left.addChild(this.Wingfinger2left); - this.MidtoeR1.addChild(this.MidtoeR2); - this.LefttoeL1.addChild(this.LefttoeL2); - this.Head1.addChild(this.Headmidhornlowerleft); - this.Wingfinger1left.addChild(this.Wingfingerlower1left); - this.Bodyfront.addChild(this.shape148); - } - public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) - { - modelRenderer.rotateAngleX = x; - modelRenderer.rotateAngleY = y; - modelRenderer.rotateAngleZ = z; - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); - this.Bodyfront.render(f5); - } + public ModelAshDragon() { + this.textureWidth = 512; + this.textureHeight = 512; + this.Wingshoulderleft = new ModelRenderer(this, 470, 230); + this.Wingshoulderleft.setRotationPoint(3.0F, 4.0F, 4.0F); + this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderleft, 0.5009094953223726F, 0.27314402793711257F, 0.6829473363053812F); + this.ToothlowerR3_1 = new ModelRenderer(this, 50, 420); + this.ToothlowerR3_1.setRotationPoint(2.5F, 0.0F, -6.9F); + this.ToothlowerR3_1.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerR3_1, 0.18203784098300857F, 0.0F, 0.31869712141416456F); + this.FootL = new ModelRenderer(this, 180, 190); + this.FootL.mirror = true; + this.FootL.setRotationPoint(-0.01F, 12.0F, 6.0F); + this.FootL.addBox(-4.0F, 0.0F, -5.0F, 4, 9, 5, 0.0F); + this.setRotateAngle(FootL, -0.7838273670706533F, 0.0F, 0.0F); + this.Neck3 = new ModelRenderer(this, 5, 320); + this.Neck3.setRotationPoint(0.0F, 0.5F, -6.0F); + this.Neck3.addBox(-2.5F, 0.0F, -5.0F, 5, 9, 9, 0.0F); + this.setRotateAngle(Neck3, 0.136659280431156F, 0.0F, 0.0F); + this.shape108 = new ModelRenderer(this, 125, 165); + this.shape108.setRotationPoint(0.0F, 0.8F, -5.8F); + this.shape108.addBox(-2.0F, -1.0F, -2.0F, 4, 1, 2, 0.0F); + this.setRotateAngle(shape108, -0.16179202165987433F, 0.0F, 0.0F); + this.RighttoeL2 = new ModelRenderer(this, 180, 170); + this.RighttoeL2.mirror = true; + this.RighttoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); + this.RighttoeL2.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(RighttoeL2, -0.36425021489121656F, 0.0F, 0.0F); + this.LTailMembrane = new ModelRenderer(this, 380, 250); + this.LTailMembrane.setRotationPoint(0.0F, 0.21F, 1.0F); + this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 7, 1, 15, 0.0F); + this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); + this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); + this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); + this.Wingmembramesmallright.addBox(-24.0F, 0.0F, 0.0F, 24, 0, 18, 0.0F); + this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); + this.shape144 = new ModelRenderer(this, 125, 175); + this.shape144.setRotationPoint(4.0F, 0.0F, 0.0F); + this.shape144.addBox(0.0F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape144, -0.36425021489121656F, 0.0F, 0.22759093446006054F); + this.shape152 = new ModelRenderer(this, 125, 175); + this.shape152.setRotationPoint(3.0F, 0.0F, 5.0F); + this.shape152.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(shape152, -0.136659280431156F, 0.136659280431156F, 0.18203784098300857F); + this.Headmidhornupperright = new ModelRenderer(this, 190, 430); + this.Headmidhornupperright.setRotationPoint(-1.0F, 0.1F, 4.9F); + this.Headmidhornupperright.addBox(0.0F, 0.0F, 0.0F, 2, 1, 6, 0.0F); + this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.22759093446006054F, 0.0F); + this.Lfinger1 = new ModelRenderer(this, 350, 140); + this.Lfinger1.setRotationPoint(24.0F, 2.0F, 3.0F); + this.Lfinger1.addBox(-2.0F, 0.0F, -5.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Lfinger1, 0.0F, -1.0016444577195458F, 0.0F); + this.shape150 = new ModelRenderer(this, 0, 0); + this.shape150.setRotationPoint(2.4F, 0.0F, 0.0F); + this.shape150.addBox(0.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); + this.setRotateAngle(shape150, -0.27314402793711257F, -0.136659280431156F, 0.18203784098300857F); + this.ToothR1 = new ModelRenderer(this, 50, 420); + this.ToothR1.setRotationPoint(-2.7F, 3.5F, -1.0F); + this.ToothR1.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothR1, 0.0F, 0.0F, 0.31869712141416456F); + this.ShinR = new ModelRenderer(this, 180, 210); + this.ShinR.setRotationPoint(0.7F, 13.0F, 0.0F); + this.ShinR.addBox(0.0F, 0.0F, 0.0F, 4, 12, 6, 0.0F); + this.setRotateAngle(ShinR, 1.0471975511965976F, 0.0F, -0.136659280431156F); + this.Lfinger2 = new ModelRenderer(this, 330, 140); + this.Lfinger2.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Lfinger2.addBox(-2.0F, 0.0F, -4.0F, 2, 2, 4, 0.0F); + this.setRotateAngle(Lfinger2, 0.40980330836826856F, 0.0F, 0.0F); + this.shape142 = new ModelRenderer(this, 125, 175); + this.shape142.setRotationPoint(0.0F, 0.0F, 12.0F); + this.shape142.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); + this.setRotateAngle(shape142, -0.5009094953223726F, 0.0F, 0.0F); + this.Wingmembramesmallleft = new ModelRenderer(this, 420, 280); + this.Wingmembramesmallleft.mirror = true; + this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); + this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 24, 0, 18, 0.0F); + this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); + this.Wingmembramelargeleft2 = new ModelRenderer(this, 355, 430); + this.Wingmembramelargeleft2.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeleft2.addBox(0.0F, 0.0F, 0.0F, 41, 0, 57, 0.0F); + this.ToothL3 = new ModelRenderer(this, 50, 420); + this.ToothL3.setRotationPoint(2.7F, 3.5F, -6.0F); + this.ToothL3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothL3, 0.0F, 0.0F, -0.31869712141416456F); + this.HornendL = new ModelRenderer(this, 50, 430); + this.HornendL.setRotationPoint(0.0F, 0.0F, 5.0F); + this.HornendL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 4, 0.0F); + this.setRotateAngle(HornendL, 0.0F, -0.27314402793711257F, 0.0F); + this.ThighL = new ModelRenderer(this, 180, 230); + this.ThighL.mirror = true; + this.ThighL.setRotationPoint(9.0F, 5.0F, 15.0F); + this.ThighL.addBox(-5.0F, 0.0F, 0.0F, 5, 13, 8, 0.0F); + this.setRotateAngle(ThighL, -0.4553564018453205F, 0.0F, -0.136659280431156F); + this.RighttoeR1 = new ModelRenderer(this, 180, 180); + this.RighttoeR1.setRotationPoint(1.8F, 6.0F, -4.0F); + this.RighttoeR1.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(RighttoeR1, -0.5462880558742251F, 0.40980330836826856F, 0.18203784098300857F); + this.Wingfinger1right = new ModelRenderer(this, 350, 200); + this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); + this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1right, 0.0F, 1.593485607070823F, 0.0F); + this.BrowfrontL = new ModelRenderer(this, 190, 390); + this.BrowfrontL.setRotationPoint(3.0F, 0.8F, -9.0F); + this.BrowfrontL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(BrowfrontL, 0.091106186954104F, 0.27314402793711257F, 0.0F); + this.Tail2 = new ModelRenderer(this, 5, 85); + this.Tail2.setRotationPoint(0.0F, 0.5F, 20.0F); + this.Tail2.addBox(-5.5F, 0.0F, 0.0F, 11, 12, 19, 0.0F); + this.setRotateAngle(Tail2, -0.091106186954104F, 0.0F, 0.0F); + this.shape143 = new ModelRenderer(this, 125, 175); + this.shape143.setRotationPoint(0.0F, 0.0F, 0.0F); + this.shape143.addBox(-0.5F, -3.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(shape143, -0.6373942428283291F, 0.0F, 0.0F); + this.ToothL4 = new ModelRenderer(this, 50, 420); + this.ToothL4.setRotationPoint(2.7F, 3.6F, -8.0F); + this.ToothL4.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothL4, -0.18203784098300857F, 0.0F, -0.31869712141416456F); + this.shape146 = new ModelRenderer(this, 125, 175); + this.shape146.setRotationPoint(3.0F, 0.0F, 7.0F); + this.shape146.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(shape146, -0.27314402793711257F, 0.0F, 0.045553093477052F); + this.shape123 = new ModelRenderer(this, 125, 175); + this.shape123.setRotationPoint(0.0F, -5.0F, 0.0F); + this.shape123.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); + this.setRotateAngle(shape123, -0.18203784098300857F, 0.0F, 0.091106186954104F); + this.RighttoeL1 = new ModelRenderer(this, 180, 180); + this.RighttoeL1.mirror = true; + this.RighttoeL1.setRotationPoint(-2.4F, 6.0F, -4.0F); + this.RighttoeL1.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(RighttoeL1, -0.5462880558742251F, 0.40980330836826856F, 0.18203784098300857F); + this.Underlowerjaw2 = new ModelRenderer(this, 5, 430); + this.Underlowerjaw2.setRotationPoint(0.0F, 0.0F, -7.0F); + this.Underlowerjaw2.addBox(-2.5F, -1.0F, 0.0F, 5, 1, 4, 0.0F); + this.setRotateAngle(Underlowerjaw2, -0.18203784098300857F, 0.0F, 0.0F); + this.RTailSpike = new ModelRenderer(this, 350, 300); + this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.RTailSpike.addBox(-8.0F, 0.0F, 0.0F, 8, 1, 3, 0.0F); + this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, 0.0F); + this.Wingupperarmleft = new ModelRenderer(this, 390, 230); + this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); + this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); + this.Wingmembramelargeleft1 = new ModelRenderer(this, 270, 430); + this.Wingmembramelargeleft1.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeleft1.addBox(0.0F, 0.0F, 0.0F, 37, 0, 61, 0.0F); + this.LTailSpike = new ModelRenderer(this, 350, 300); + this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 8, 1, 3, 0.0F); + this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.0F); + this.shape153 = new ModelRenderer(this, 125, 175); + this.shape153.setRotationPoint(-3.0F, 0.0F, 2.0F); + this.shape153.addBox(-1.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(shape153, -0.5009094953223726F, -0.36425021489121656F, 0.22759093446006054F); + this.shape154 = new ModelRenderer(this, 125, 175); + this.shape154.setRotationPoint(4.0F, 0.0F, 9.0F); + this.shape154.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); + this.setRotateAngle(shape154, -0.36425021489121656F, 0.0F, -0.136659280431156F); + this.Wingmembramemidright = new ModelRenderer(this, 350, 340); + this.Wingmembramemidright.mirror = true; + this.Wingmembramemidright.setRotationPoint(-20.5F, 2.9F, 5.1F); + this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); + this.BrowbackL = new ModelRenderer(this, 190, 380); + this.BrowbackL.setRotationPoint(0.0F, 0.0F, 5.0F); + this.BrowbackL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(BrowbackL, 0.0F, -0.4553564018453205F, 0.0F); + this.shape149 = new ModelRenderer(this, 125, 175); + this.shape149.setRotationPoint(-4.0F, 0.0F, 15.0F); + this.shape149.addBox(-1.0F, -6.0F, 0.0F, 1, 6, 2, 0.0F); + this.setRotateAngle(shape149, -0.36425021489121656F, 0.18203784098300857F, 0.045553093477052F); + this.LefttoeR1 = new ModelRenderer(this, 180, 180); + this.LefttoeR1.setRotationPoint(2.4F, 6.0F, -4.0F); + this.LefttoeR1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(LefttoeR1, -0.5462880558742251F, -0.40980330836826856F, -0.18203784098300857F); + this.Lowerjaw = new ModelRenderer(this, 5, 410); + this.Lowerjaw.setRotationPoint(0.0F, -1.0F, -7.0F); + this.Lowerjaw.addBox(-2.5F, -1.0F, -8.0F, 5, 1, 8, 0.0F); + this.shape147 = new ModelRenderer(this, 125, 175); + this.shape147.setRotationPoint(2.0F, 0.0F, 12.0F); + this.shape147.addBox(0.0F, -6.0F, 0.0F, 1, 6, 2, 0.0F); + this.setRotateAngle(shape147, -0.40980330836826856F, 0.22759093446006054F, 0.27314402793711257F); + this.shape141 = new ModelRenderer(this, 125, 175); + this.shape141.setRotationPoint(0.0F, -4.0F, 0.0F); + this.shape141.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape141, -0.18203784098300857F, 0.0F, 0.27314402793711257F); + this.shape151 = new ModelRenderer(this, 125, 175); + this.shape151.setRotationPoint(-2.8F, 0.0F, 3.0F); + this.shape151.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); + this.setRotateAngle(shape151, -0.18203784098300857F, 0.0F, -0.136659280431156F); + this.ToothlowerL2 = new ModelRenderer(this, 50, 420); + this.ToothlowerL2.setRotationPoint(2.5F, 0.0F, -4.7F); + this.ToothlowerL2.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerL2, 0.0F, 0.0F, 0.31869712141416456F); + this.Tail4 = new ModelRenderer(this, 5, 150); + this.Tail4.setRotationPoint(0.0F, 0.5F, 17.0F); + this.Tail4.addBox(-3.5F, 0.0F, 0.0F, 7, 8, 19, 0.0F); + this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); + this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); + this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); + this.shape125 = new ModelRenderer(this, 125, 175); + this.shape125.setRotationPoint(0.0F, -5.0F, 0.0F); + this.shape125.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape125, -0.18203784098300857F, 0.0F, 0.091106186954104F); + this.Tail1 = new ModelRenderer(this, 5, 45); + this.Tail1.setRotationPoint(0.0F, 0.5F, 18.0F); + this.Tail1.addBox(-6.0F, 0.0F, 0.0F, 12, 15, 21, 0.0F); + this.setRotateAngle(Tail1, -0.5009094953223726F, 0.0F, 0.0F); + this.RTailMembrane = new ModelRenderer(this, 381, 270); + this.RTailMembrane.mirror = true; + this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 1.0F); + this.RTailMembrane.addBox(-6.0F, 0.0F, 0.0F, 6, 1, 15, 0.0F); + this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); + this.Wingupperarmright = new ModelRenderer(this, 390, 230); + this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); + this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); + this.Lowerjawback = new ModelRenderer(this, 5, 400); + this.Lowerjawback.setRotationPoint(0.0F, 4.5F, 1.1F); + this.Lowerjawback.addBox(-3.0F, -2.0F, -7.0F, 6, 2, 7, 0.0F); + this.setRotateAngle(Lowerjawback, 0.136659280431156F, 0.0F, 0.0F); + this.shape126 = new ModelRenderer(this, 125, 175); + this.shape126.setRotationPoint(0.0F, -5.0F, 2.0F); + this.shape126.addBox(-0.5F, -4.0F, -2.0F, 1, 4, 2, 0.0F); + this.setRotateAngle(shape126, 0.27314402793711257F, 0.0F, -0.27314402793711257F); + this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); + this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); + this.shape138 = new ModelRenderer(this, 125, 190); + this.shape138.setRotationPoint(0.0F, 0.0F, 18.0F); + this.shape138.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(shape138, -0.31869712141416456F, 0.0F, 0.0F); + this.ThighR = new ModelRenderer(this, 180, 230); + this.ThighR.setRotationPoint(-9.0F, 5.0F, 15.0F); + this.ThighR.addBox(0.0F, 0.0F, 0.0F, 5, 13, 8, 0.0F); + this.setRotateAngle(ThighR, -0.4553564018453205F, 0.0F, 0.136659280431156F); + this.Head1 = new ModelRenderer(this, 5, 340); + this.Head1.setRotationPoint(0.0F, -0.2F, -5.5F); + this.Head1.addBox(-3.5F, 0.0F, -7.0F, 7, 6, 7, 0.0F); + this.setRotateAngle(Head1, 0.136659280431156F, 0.0F, 0.0F); + this.Tail3 = new ModelRenderer(this, 5, 120); + this.Tail3.setRotationPoint(0.0F, 0.5F, 18.0F); + this.Tail3.addBox(-4.5F, 0.0F, 0.0F, 9, 10, 18, 0.0F); + this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); + this.shape127 = new ModelRenderer(this, 125, 210); + this.shape127.setRotationPoint(0.0F, 0.0F, 15.0F); + this.shape127.addBox(-1.0F, -6.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(shape127, -0.6373942428283291F, 0.0F, 0.0F); + this.shape155 = new ModelRenderer(this, 125, 175); + this.shape155.setRotationPoint(-3.5F, 0.0F, 9.0F); + this.shape155.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(shape155, -0.40980330836826856F, -0.045553093477052F, 0.136659280431156F); + this.shape137 = new ModelRenderer(this, 125, 175); + this.shape137.setRotationPoint(0.0F, -5.0F, 0.0F); + this.shape137.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(shape137, -0.136659280431156F, 0.136659280431156F, 0.18203784098300857F); + this.Wingmembramelargeright1 = new ModelRenderer(this, 270, 430); + this.Wingmembramelargeright1.mirror = true; + this.Wingmembramelargeright1.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeright1.addBox(-37.0F, 0.0F, 0.0F, 37, 0, 61, 0.0F); + this.Neck1 = new ModelRenderer(this, 5, 270); + this.Neck1.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Neck1.addBox(-4.5F, 0.0F, -6.0F, 9, 13, 10, 0.0F); + this.setRotateAngle(Neck1, -0.091106186954104F, 0.0F, 0.0F); + this.shape115 = new ModelRenderer(this, 125, 255); + this.shape115.setRotationPoint(0.0F, 0.7F, 6.8F); + this.shape115.addBox(-1.5F, 0.0F, 0.0F, 3, 1, 6, 0.0F); + this.setRotateAngle(shape115, -0.17575465567582899F, 0.0F, 0.0F); + this.shape140 = new ModelRenderer(this, 125, 190); + this.shape140.setRotationPoint(0.0F, 0.0F, 5.0F); + this.shape140.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(shape140, -0.40980330836826856F, 0.0F, -0.136659280431156F); + this.MidtoeL1 = new ModelRenderer(this, 180, 180); + this.MidtoeL1.mirror = true; + this.MidtoeL1.setRotationPoint(-2.0F, 6.1F, -4.0F); + this.MidtoeL1.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(MidtoeL1, -0.5462880558742251F, 0.0F, 0.0F); + this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerright.setRotationPoint(-2.5F, 2.7F, -3.9F); + this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Headmidhornlowerright, 0.31869712141416456F, -0.31869712141416456F, -0.9560913642424937F); + this.shape114 = new ModelRenderer(this, 125, 240); + this.shape114.setRotationPoint(0.0F, -4.0F, 3.0F); + this.shape114.addBox(-2.0F, 0.0F, 0.0F, 4, 3, 7, 0.0F); + this.setRotateAngle(shape114, -0.6373942428283291F, 0.0F, 0.0F); + this.RBrowback = new ModelRenderer(this, 190, 380); + this.RBrowback.setRotationPoint(0.0F, 0.0F, 5.0F); + this.RBrowback.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(RBrowback, 0.0F, 0.4553564018453205F, 0.0F); + this.shape128 = new ModelRenderer(this, 125, 175); + this.shape128.setRotationPoint(0.0F, -6.0F, 0.0F); + this.shape128.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape128, -0.18203784098300857F, 0.0F, 0.0F); + this.LefttoeR2 = new ModelRenderer(this, 180, 170); + this.LefttoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); + this.LefttoeR2.addBox(0.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(LefttoeR2, -0.36425021489121656F, 0.0F, 0.0F); + this.shape129 = new ModelRenderer(this, 125, 175); + this.shape129.setRotationPoint(0.0F, -5.0F, 2.0F); + this.shape129.addBox(-0.5F, -5.0F, -2.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape129, 0.31869712141416456F, 0.0F, 0.18203784098300857F); + this.Bodyfront = new ModelRenderer(this, 5, 5); + this.Bodyfront.setRotationPoint(0.0F, -4.0F, -14.0F); + this.Bodyfront.addBox(-6.5F, 0.0F, 0.0F, 13, 16, 18, 0.0F); + this.setRotateAngle(Bodyfront, 0.40980330836826856F, 0.0F, 0.0F); + this.Rfinger2 = new ModelRenderer(this, 330, 140); + this.Rfinger2.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Rfinger2.addBox(0.0F, 0.0F, -4.0F, 2, 2, 4, 0.0F); + this.setRotateAngle(Rfinger2, 0.40980330836826856F, 0.0F, 0.0F); + this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); + this.Wingmembramemidleft.setRotationPoint(20.5F, 2.9F, 5.1F); + this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); + this.shape139 = new ModelRenderer(this, 125, 175); + this.shape139.setRotationPoint(0.0F, -4.0F, 0.0F); + this.shape139.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); + this.setRotateAngle(shape139, -0.27314402793711257F, 0.0F, 0.0F); + this.ToothlowerR2 = new ModelRenderer(this, 50, 420); + this.ToothlowerR2.setRotationPoint(-2.5F, 0.0F, -4.7F); + this.ToothlowerR2.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerR2, 0.0F, 0.0F, -0.31869712141416456F); + this.HornmidR = new ModelRenderer(this, 50, 410); + this.HornmidR.setRotationPoint(-2.0F, 0.0F, 4.0F); + this.HornmidR.addBox(0.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(HornmidR, 0.0F, 0.045553093477052F, 0.0F); + this.HornbaseL = new ModelRenderer(this, 50, 400); + this.HornbaseL.setRotationPoint(1.5F, 0.3F, -3.8F); + this.HornbaseL.addBox(-1.0F, 0.0F, 0.0F, 3, 2, 4, 0.0F); + this.setRotateAngle(HornbaseL, 0.36425021489121656F, -0.091106186954104F, 0.9560913642424937F); + this.RighttoeR2 = new ModelRenderer(this, 180, 170); + this.RighttoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); + this.RighttoeR2.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(RighttoeR2, -0.40980330836826856F, 0.0F, 0.0F); + this.Wingfinger3left = new ModelRenderer(this, 390, 170); + this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); + this.ShinL = new ModelRenderer(this, 180, 210); + this.ShinL.mirror = true; + this.ShinL.setRotationPoint(-0.7F, 13.0F, 0.0F); + this.ShinL.addBox(-4.0F, 0.0F, 0.0F, 4, 12, 6, 0.0F); + this.setRotateAngle(ShinL, 1.0471975511965976F, 0.0F, 0.136659280431156F); + this.Underlowerjaw3 = new ModelRenderer(this, 5, 420); + this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 4.0F); + this.Underlowerjaw3.addBox(-2.5F, -1.0F, 0.0F, 5, 1, 5, 0.0F); + this.setRotateAngle(Underlowerjaw3, 0.136659280431156F, 0.0F, 0.0F); + this.Wingshoulderright = new ModelRenderer(this, 470, 230); + this.Wingshoulderright.setRotationPoint(-3.0F, 4.0F, 4.0F); + this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderright, 0.5009094953223726F, -0.27314402793711257F, -0.6829473363053812F); + this.shape122 = new ModelRenderer(this, 125, 200); + this.shape122.setRotationPoint(0.0F, 0.0F, 1.0F); + this.shape122.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(shape122, -0.5009094953223726F, 0.0F, 0.136659280431156F); + this.Winglowerarmleft = new ModelRenderer(this, 400, 215); + this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); + this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); + this.Wingmembramelargeright2 = new ModelRenderer(this, 355, 430); + this.Wingmembramelargeright2.mirror = true; + this.Wingmembramelargeright2.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeright2.addBox(-41.0F, 0.0F, 0.0F, 41, 0, 57, 0.0F); + this.Wingfinger3right = new ModelRenderer(this, 390, 170); + this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); + this.Wingfinger1left = new ModelRenderer(this, 350, 200); + this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); + this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1left, 0.0F, -1.593485607070823F, 0.0F); + this.shape134 = new ModelRenderer(this, 125, 200); + this.shape134.setRotationPoint(0.0F, 0.0F, 4.3F); + this.shape134.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(shape134, -0.22759093446006054F, 0.0F, -0.091106186954104F); + this.ToothlowerR1 = new ModelRenderer(this, 50, 420); + this.ToothlowerR1.setRotationPoint(-2.5F, 0.0F, -2.4F); + this.ToothlowerR1.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerR1, 0.0F, 0.0F, -0.31869712141416456F); + this.Tail5 = new ModelRenderer(this, 5, 180); + this.Tail5.setRotationPoint(0.0F, 0.5F, 18.0F); + this.Tail5.addBox(-2.5F, 0.0F, 0.0F, 5, 6, 20, 0.0F); + this.setRotateAngle(Tail5, 0.091106186954104F, 0.0F, 0.0F); + this.shape113 = new ModelRenderer(this, 125, 225); + this.shape113.setRotationPoint(0.0F, 3.4F, -5.6F); + this.shape113.addBox(-2.5F, -4.0F, 0.0F, 5, 4, 4, 0.0F); + this.setRotateAngle(shape113, 0.6609561877302526F, 0.0F, 0.0F); + this.HornbaseR = new ModelRenderer(this, 50, 400); + this.HornbaseR.setRotationPoint(-1.5F, 0.3F, -3.8F); + this.HornbaseR.addBox(-2.0F, 0.0F, 0.0F, 3, 2, 4, 0.0F); + this.setRotateAngle(HornbaseR, 0.36425021489121656F, 0.091106186954104F, -0.9560913642424937F); + this.shape145 = new ModelRenderer(this, 125, 175); + this.shape145.setRotationPoint(-4.0F, 0.0F, 6.0F); + this.shape145.addBox(0.0F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape145, -0.36425021489121656F, 0.0F, -0.36425021489121656F); + this.LefttoeL1 = new ModelRenderer(this, 180, 180); + this.LefttoeL1.mirror = true; + this.LefttoeL1.setRotationPoint(-1.8F, 6.0F, -4.0F); + this.LefttoeL1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(LefttoeL1, -0.5462880558742251F, -0.40980330836826856F, -0.18203784098300857F); + this.shape135 = new ModelRenderer(this, 125, 175); + this.shape135.setRotationPoint(0.0F, -5.0F, 2.0F); + this.shape135.addBox(-0.5F, -8.0F, -2.0F, 1, 8, 2, 0.0F); + this.setRotateAngle(shape135, 0.27314402793711257F, 0.0F, -0.136659280431156F); + this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); + this.Headmidhornupperleft.setRotationPoint(1.0F, 0.1F, 4.9F); + this.Headmidhornupperleft.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 6, 0.0F); + this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.22759093446006054F, 0.0F); + this.Winglowerarmright = new ModelRenderer(this, 400, 215); + this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); + this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); + this.ToothL1 = new ModelRenderer(this, 50, 420); + this.ToothL1.setRotationPoint(2.7F, 3.5F, -1.0F); + this.ToothL1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothL1, 0.0F, 0.0F, -0.31869712141416456F); + this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); + this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); + this.ToothL2 = new ModelRenderer(this, 50, 420); + this.ToothL2.setRotationPoint(2.7F, 3.5F, -3.5F); + this.ToothL2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothL2, 0.0F, 0.0F, -0.31869712141416456F); + this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); + this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); + this.shape124 = new ModelRenderer(this, 125, 200); + this.shape124.setRotationPoint(0.0F, 0.0F, 8.0F); + this.shape124.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(shape124, -0.5462880558742251F, 0.0F, 0.0F); + this.shape136 = new ModelRenderer(this, 125, 200); + this.shape136.setRotationPoint(0.0F, 0.0F, 11.0F); + this.shape136.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(shape136, -0.27314402793711257F, 0.0F, 0.0F); + this.Tail8 = new ModelRenderer(this, 5, 220); + this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); + this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); + this.FootR = new ModelRenderer(this, 180, 190); + this.FootR.setRotationPoint(0.01F, 12.0F, 6.0F); + this.FootR.addBox(0.0F, 0.0F, -5.0F, 4, 9, 5, 0.0F); + this.setRotateAngle(FootR, -0.7740535232594852F, 0.0F, 0.0F); + this.BrowfrontR = new ModelRenderer(this, 190, 390); + this.BrowfrontR.setRotationPoint(-3.0F, 0.8F, -9.0F); + this.BrowfrontR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(BrowfrontR, 0.091106186954104F, -0.27314402793711257F, 0.0F); + this.HornendR = new ModelRenderer(this, 50, 430); + this.HornendR.setRotationPoint(0.0F, 0.0F, 5.0F); + this.HornendR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 4, 0.0F); + this.setRotateAngle(HornendR, 0.0F, 0.27314402793711257F, 0.0F); + this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); + this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); + this.Mouthback_MOVE_TO_OPEN = new ModelRenderer(this, 5, 390); + this.Mouthback_MOVE_TO_OPEN.setRotationPoint(0.01F, 3.5F, -0.3F); + this.Mouthback_MOVE_TO_OPEN.addBox(-2.5F, 0.0F, -5.0F, 5, 4, 5, 0.0F); + this.setRotateAngle(Mouthback_MOVE_TO_OPEN, -0.18203784098300857F, 0.0F, 0.0F); + this.Tail7 = new ModelRenderer(this, 5, 240); + this.Tail7.setRotationPoint(0.0F, 0.3F, 19.0F); + this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); + this.setRotateAngle(Tail7, 0.18203784098300857F, 0.0F, 0.0F); + this.ToothR2 = new ModelRenderer(this, 50, 420); + this.ToothR2.setRotationPoint(-2.7F, 3.5F, -3.5F); + this.ToothR2.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothR2, 0.0F, 0.0F, 0.31869712141416456F); + this.Upperjaw = new ModelRenderer(this, 5, 370); + this.Upperjaw.setRotationPoint(-0.01F, 0.7F, -0.1F); + this.Upperjaw.addBox(-3.0F, 0.0F, -8.0F, 6, 5, 10, 0.0F); + this.setRotateAngle(Upperjaw, -0.091106186954104F, 0.0F, 0.0F); + this.Underlowerjaw = new ModelRenderer(this, 5, 440); + this.Underlowerjaw.setRotationPoint(0.0F, 1.0F, 0.0F); + this.Underlowerjaw.addBox(-2.0F, -1.0F, -6.0F, 4, 1, 6, 0.0F); + this.setRotateAngle(Underlowerjaw, -0.045553093477052F, 0.0F, 0.0F); + this.ToothlowerR3 = new ModelRenderer(this, 50, 420); + this.ToothlowerR3.setRotationPoint(-2.5F, 0.0F, -6.9F); + this.ToothlowerR3.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerR3, 0.18203784098300857F, 0.0F, -0.31869712141416456F); + this.Wingfinger2right = new ModelRenderer(this, 330, 150); + this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); + this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); + this.ToothR4 = new ModelRenderer(this, 50, 420); + this.ToothR4.setRotationPoint(-2.7F, 3.6F, -8.0F); + this.ToothR4.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothR4, -0.18203784098300857F, 0.0F, 0.31869712141416456F); + this.MidtoeL2 = new ModelRenderer(this, 180, 170); + this.MidtoeL2.mirror = true; + this.MidtoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); + this.MidtoeL2.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(MidtoeL2, -0.4553564018453205F, 0.0F, 0.0F); + this.ToothR3 = new ModelRenderer(this, 50, 420); + this.ToothR3.setRotationPoint(-2.7F, 3.5F, -6.0F); + this.ToothR3.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothR3, 0.0F, 0.0F, 0.31869712141416456F); + this.Neck2 = new ModelRenderer(this, 5, 299); + this.Neck2.setRotationPoint(0.0F, 0.7F, -6.0F); + this.Neck2.addBox(-3.5F, 0.0F, -6.0F, 7, 11, 9, 0.0F); + this.setRotateAngle(Neck2, 0.045553093477052F, 0.0F, 0.0F); + this.Headtop = new ModelRenderer(this, 5, 355); + this.Headtop.setRotationPoint(0.01F, 0.2F, -7.0F); + this.Headtop.addBox(-3.0F, 0.0F, -8.0F, 6, 4, 8, 0.0F); + this.setRotateAngle(Headtop, 0.045553093477052F, 0.0F, 0.0F); + this.ToothlowerL1 = new ModelRenderer(this, 50, 420); + this.ToothlowerL1.setRotationPoint(2.5F, 0.0F, -2.4F); + this.ToothlowerL1.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerL1, 0.0F, 0.0F, 0.31869712141416456F); + this.Rfinger1 = new ModelRenderer(this, 350, 140); + this.Rfinger1.setRotationPoint(-24.0F, 2.0F, 3.0F); + this.Rfinger1.addBox(0.0F, 0.0F, -5.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Rfinger1, 0.31869712141416456F, 1.0016444577195458F, 0.0F); + this.HornmidL = new ModelRenderer(this, 50, 410); + this.HornmidL.setRotationPoint(2.0F, 0.0F, 4.0F); + this.HornmidL.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(HornmidL, 0.0F, -0.045553093477052F, 0.0F); + this.MidtoeR1 = new ModelRenderer(this, 180, 180); + this.MidtoeR1.setRotationPoint(2.0F, 6.1F, -4.0F); + this.MidtoeR1.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(MidtoeR1, -0.6373942428283291F, 0.0F, 0.0F); + this.Wingfinger2left = new ModelRenderer(this, 330, 150); + this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); + this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); + this.MidtoeR2 = new ModelRenderer(this, 180, 170); + this.MidtoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); + this.MidtoeR2.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(MidtoeR2, -0.4553564018453205F, 0.0F, 0.0F); + this.LefttoeL2 = new ModelRenderer(this, 180, 170); + this.LefttoeL2.mirror = true; + this.LefttoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); + this.LefttoeL2.addBox(0.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(LefttoeL2, -0.40980330836826856F, 0.0F, 0.0F); + this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerleft.setRotationPoint(2.5F, 2.7F, -3.9F); + this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Headmidhornlowerleft, 0.31869712141416456F, 0.31869712141416456F, 0.9560913642424937F); + this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); + this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); + this.shape148 = new ModelRenderer(this, 125, 175); + this.shape148.setRotationPoint(-2.0F, 0.2F, 11.3F); + this.shape148.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); + this.setRotateAngle(shape148, 0.0F, 0.0F, 0.091106186954104F); + this.Bodyfront.addChild(this.Wingshoulderleft); + this.Lowerjaw.addChild(this.ToothlowerR3_1); + this.ShinL.addChild(this.FootL); + this.Neck2.addChild(this.Neck3); + this.Underlowerjaw2.addChild(this.shape108); + this.RighttoeL1.addChild(this.RighttoeL2); + this.LTailSpike.addChild(this.LTailMembrane); + this.Wingupperarmright.addChild(this.Wingmembramesmallright); + this.Bodyfront.addChild(this.shape144); + this.Tail1.addChild(this.shape152); + this.Headmidhornlowerright.addChild(this.Headmidhornupperright); + this.Winglowerarmleft.addChild(this.Lfinger1); + this.Tail1.addChild(this.shape150); + this.Upperjaw.addChild(this.ToothR1); + this.ThighR.addChild(this.ShinR); + this.Lfinger1.addChild(this.Lfinger2); + this.Tail2.addChild(this.shape142); + this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); + this.Wingfingerlower1left.addChild(this.Wingmembramelargeleft2); + this.Upperjaw.addChild(this.ToothL3); + this.HornmidL.addChild(this.HornendL); + this.Tail1.addChild(this.ThighL); + this.FootR.addChild(this.RighttoeR1); + this.Winglowerarmright.addChild(this.Wingfinger1right); + this.Head1.addChild(this.BrowfrontL); + this.Tail1.addChild(this.Tail2); + this.Tail3.addChild(this.shape143); + this.Upperjaw.addChild(this.ToothL4); + this.Bodyfront.addChild(this.shape146); + this.shape122.addChild(this.shape123); + this.FootL.addChild(this.RighttoeL1); + this.Lowerjawback.addChild(this.Underlowerjaw2); + this.Tail8.addChild(this.RTailSpike); + this.Wingshoulderleft.addChild(this.Wingupperarmleft); + this.Wingfinger1left.addChild(this.Wingmembramelargeleft1); + this.Tail8.addChild(this.LTailSpike); + this.Bodyfront.addChild(this.shape153); + this.Tail1.addChild(this.shape154); + this.Winglowerarmright.addChild(this.Wingmembramemidright); + this.BrowfrontL.addChild(this.BrowbackL); + this.Bodyfront.addChild(this.shape149); + this.FootR.addChild(this.LefttoeR1); + this.Lowerjawback.addChild(this.Lowerjaw); + this.Bodyfront.addChild(this.shape147); + this.shape140.addChild(this.shape141); + this.Tail1.addChild(this.shape151); + this.Lowerjaw.addChild(this.ToothlowerL2); + this.Tail3.addChild(this.Tail4); + this.Wingfinger1right.addChild(this.Wingfingerlower1right); + this.shape124.addChild(this.shape125); + this.Bodyfront.addChild(this.Tail1); + this.RTailSpike.addChild(this.RTailMembrane); + this.Wingshoulderright.addChild(this.Wingupperarmright); + this.Mouthback_MOVE_TO_OPEN.addChild(this.Lowerjawback); + this.shape125.addChild(this.shape126); + this.Wingfinger2right.addChild(this.Wingfingerlower2right); + this.Tail1.addChild(this.shape138); + this.Tail1.addChild(this.ThighR); + this.Neck3.addChild(this.Head1); + this.Tail2.addChild(this.Tail3); + this.Bodyfront.addChild(this.shape127); + this.Tail1.addChild(this.shape155); + this.shape136.addChild(this.shape137); + this.Wingfinger1right.addChild(this.Wingmembramelargeright1); + this.Bodyfront.addChild(this.Neck1); + this.shape114.addChild(this.shape115); + this.Tail2.addChild(this.shape140); + this.FootL.addChild(this.MidtoeL1); + this.Head1.addChild(this.Headmidhornlowerright); + this.shape113.addChild(this.shape114); + this.BrowfrontR.addChild(this.RBrowback); + this.shape127.addChild(this.shape128); + this.LefttoeR1.addChild(this.LefttoeR2); + this.shape128.addChild(this.shape129); + this.Rfinger1.addChild(this.Rfinger2); + this.Winglowerarmleft.addChild(this.Wingmembramemidleft); + this.shape138.addChild(this.shape139); + this.Lowerjaw.addChild(this.ToothlowerR2); + this.HornbaseR.addChild(this.HornmidR); + this.Head1.addChild(this.HornbaseL); + this.RighttoeR1.addChild(this.RighttoeR2); + this.Wingfinger1left.addChild(this.Wingfinger3left); + this.ThighL.addChild(this.ShinL); + this.Underlowerjaw2.addChild(this.Underlowerjaw3); + this.Bodyfront.addChild(this.Wingshoulderright); + this.Bodyfront.addChild(this.shape122); + this.Wingupperarmleft.addChild(this.Winglowerarmleft); + this.Wingfingerlower1right.addChild(this.Wingmembramelargeright2); + this.Wingfinger1right.addChild(this.Wingfinger3right); + this.Winglowerarmleft.addChild(this.Wingfinger1left); + this.Tail1.addChild(this.shape134); + this.Lowerjaw.addChild(this.ToothlowerR1); + this.Tail4.addChild(this.Tail5); + this.Headtop.addChild(this.shape113); + this.Head1.addChild(this.HornbaseR); + this.Bodyfront.addChild(this.shape145); + this.FootL.addChild(this.LefttoeL1); + this.shape134.addChild(this.shape135); + this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); + this.Wingupperarmright.addChild(this.Winglowerarmright); + this.Upperjaw.addChild(this.ToothL1); + this.Wingfinger3left.addChild(this.Wingfingerlower3left); + this.Upperjaw.addChild(this.ToothL2); + this.Wingfinger2left.addChild(this.Wingfingerlower2left); + this.Bodyfront.addChild(this.shape124); + this.Tail1.addChild(this.shape136); + this.Tail7.addChild(this.Tail8); + this.ShinR.addChild(this.FootR); + this.Head1.addChild(this.BrowfrontR); + this.HornmidR.addChild(this.HornendR); + this.Wingfinger3right.addChild(this.Wingfingerlower3right); + this.Head1.addChild(this.Mouthback_MOVE_TO_OPEN); + this.Tail5.addChild(this.Tail7); + this.Upperjaw.addChild(this.ToothR2); + this.Headtop.addChild(this.Upperjaw); + this.Lowerjaw.addChild(this.Underlowerjaw); + this.Lowerjaw.addChild(this.ToothlowerR3); + this.Wingfinger1right.addChild(this.Wingfinger2right); + this.Upperjaw.addChild(this.ToothR4); + this.MidtoeL1.addChild(this.MidtoeL2); + this.Upperjaw.addChild(this.ToothR3); + this.Neck1.addChild(this.Neck2); + this.Head1.addChild(this.Headtop); + this.Lowerjaw.addChild(this.ToothlowerL1); + this.Winglowerarmright.addChild(this.Rfinger1); + this.HornbaseL.addChild(this.HornmidL); + this.FootR.addChild(this.MidtoeR1); + this.Wingfinger1left.addChild(this.Wingfinger2left); + this.MidtoeR1.addChild(this.MidtoeR2); + this.LefttoeL1.addChild(this.LefttoeL2); + this.Head1.addChild(this.Headmidhornlowerleft); + this.Wingfinger1left.addChild(this.Wingfingerlower1left); + this.Bodyfront.addChild(this.shape148); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } - public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, float head4) - { - super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); - float wingFlap = (float) Math.toRadians(dragon.wingFlap()); - float jawAngle = (float)Math.toRadians(dragon.getJawMove()); - float neckAngle = -(float)Math.toRadians(4.5F * dragon.getNeckAngle()); - - this.Head1.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; - this.Head1.rotateAngleY = neckY / (180F / (float) Math.PI); - - this.Mouthback_MOVE_TO_OPEN.rotateAngleX = jawAngle - (3.141F / 9F); - //this.Tail1.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - //this.Tail3.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - //this.Tail4.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - - if (!dragon.isTerrestrial()) //Fly - { - if(!dragon.onGround) - { - float angle = (float) Math.toRadians(dragon.getVertTailAngle()); - this.Bodyfront.rotateAngleX = 0.546F - angle; - } - else - { - this.Bodyfront.rotateAngleX = 0.5462880558742251F; - } - - if(dragon.motionY < -0.01F)//Glide - { - wingFlap = 0; - } - else if (dragon.motionX == 0 && dragon.motionZ == 0) //Hover - { - wingFlap = (float) Math.toRadians(dragon.wingFlap()); - } - else - { - wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;//Move - } - this.Wingshoulderleft.rotateAngleZ = (float) (wingFlap*0.25F); - this.Wingshoulderright.rotateAngleZ = (float) -(wingFlap*0.25F); - this.Wingshoulderleft.rotateAngleX = 0.5F; - this.Wingshoulderright.rotateAngleX = 0.5F; - } - else //Walk - { - this.Bodyfront.rotateAngleX = 0.5462880558742251F; - // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); - //this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); - - this.ThighR.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - this.ThighL.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - - if(dragon.onGround) - { - this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); - this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); - this.Wingshoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Wingshoulderright.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - } - } - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); + this.Bodyfront.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, + float head4) { + super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); + float wingFlap = (float) Math.toRadians(dragon.wingFlap()); + float jawAngle = (float) Math.toRadians(dragon.getJawMove()); + float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); + + this.Head1.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; + this.Head1.rotateAngleY = neckY / (180F / (float) Math.PI); + + this.Mouthback_MOVE_TO_OPEN.rotateAngleX = jawAngle - (3.141F / 9F); + // this.Tail1.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail3.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail4.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + + if (!dragon.isTerrestrial()) // Fly + { + if (!dragon.onGround) { + float angle = (float) Math.toRadians(dragon.getVertTailAngle()); + this.Bodyfront.rotateAngleX = 0.546F - angle; + } else { + this.Bodyfront.rotateAngleX = 0.5462880558742251F; + } + + if (dragon.motionY < -0.01F)// Glide + { + wingFlap = 0; + } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover + { + wingFlap = (float) Math.toRadians(dragon.wingFlap()); + } else { + wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move + } + this.Wingshoulderleft.rotateAngleZ = wingFlap * 0.25F; + this.Wingshoulderright.rotateAngleZ = -(wingFlap * 0.25F); + this.Wingshoulderleft.rotateAngleX = 0.5F; + this.Wingshoulderright.rotateAngleX = 0.5F; + } else // Walk + { + this.Bodyfront.rotateAngleX = 0.5462880558742251F; + // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); + // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); + + this.ThighR.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + this.ThighL.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + + if (dragon.onGround) { + this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); + this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); + this.Wingshoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Wingshoulderright.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + } + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelDragon.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelDragon.java index 0a0fbf00..948afe2b 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelDragon.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelDragon.java @@ -6,891 +6,885 @@ import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; -public class ModelDragon extends ModelBase -{ +public class ModelDragon extends ModelBase { public ModelRenderer Body; - public ModelRenderer Tail1; - public ModelRenderer Neckbase; - public ModelRenderer shape16; - public ModelRenderer Wingshoulderleft; - public ModelRenderer Shoulderleft; - public ModelRenderer Shoulderleft_1; - public ModelRenderer Spikebase1; - public ModelRenderer Spikebase2; - public ModelRenderer Spkebase3; - public ModelRenderer Spikebase4; - public ModelRenderer Wingshoulderright; - public ModelRenderer Tail3; - public ModelRenderer Righthip; - public ModelRenderer Lefthip; - public ModelRenderer Spikebase5; - public ModelRenderer Spikebase6; - public ModelRenderer Spikebase7; - public ModelRenderer Spiketop10; - public ModelRenderer Tail4; - public ModelRenderer Spiketop11; - public ModelRenderer Spiketop12; - public ModelRenderer Spiketop13; - public ModelRenderer Tail6; - public ModelRenderer Spiketop14; - public ModelRenderer Spiketop15; - public ModelRenderer Spiketop16; - public ModelRenderer Tail7; - public ModelRenderer Spiketop17; - public ModelRenderer Spiketop18; - public ModelRenderer Spiketop19; - public ModelRenderer Tail8; - public ModelRenderer LTailSpike; - public ModelRenderer RTailSpike; - public ModelRenderer LTailMembrane; - public ModelRenderer RTailMembrane; - public ModelRenderer RightLeg; - public ModelRenderer RightFoot; - public ModelRenderer Righttoemid; - public ModelRenderer Righttoeleft; - public ModelRenderer Righttoeright; - public ModelRenderer Outertoelowerright; - public ModelRenderer Righttoelowermid; - public ModelRenderer Righttoelowerleft; - public ModelRenderer Righttoelowerright; - public ModelRenderer Outertoelowerright_1; - public ModelRenderer Rightleg; - public ModelRenderer Rightfoot; - public ModelRenderer Lefttoemid; - public ModelRenderer Lefttoeright; - public ModelRenderer Lefttoeleft; - public ModelRenderer Outertoeleft; - public ModelRenderer Lefttoelowermid; - public ModelRenderer Lefttoelowerright; - public ModelRenderer Lefttoelowerleft; - public ModelRenderer Outertoelowerleft; - public ModelRenderer Spiketop7; - public ModelRenderer Spiketop8; - public ModelRenderer Spiketop9; - public ModelRenderer Neckmid; - public ModelRenderer Spiketop2; - public ModelRenderer Neckend; - public ModelRenderer Spiketop1; - public ModelRenderer Headback; - public ModelRenderer Snout; - public ModelRenderer Lowerjaw; - public ModelRenderer Headlargehornlowerleft; - public ModelRenderer Headlargehornlowerright; - public ModelRenderer Smallheadhornleft2; - public ModelRenderer Smallheadhornright2; - public ModelRenderer Smallheadhornleft1; - public ModelRenderer Smallheadhornright1; - public ModelRenderer Headmidhornlowerleft; - public ModelRenderer Headmidhornlowerright; - public ModelRenderer Tooth5; - public ModelRenderer Tooth4; - public ModelRenderer Tooth3; - public ModelRenderer Tooth2; - public ModelRenderer Tooth1; - public ModelRenderer Tooth6; - public ModelRenderer Tooth7; - public ModelRenderer Tooth8; - public ModelRenderer Tooth9; - public ModelRenderer Tooth10; - public ModelRenderer Headlargehornupperleft; - public ModelRenderer Headlargehornupperright; - public ModelRenderer Smallheadhornleft3; - public ModelRenderer Smallheadhornright3; - public ModelRenderer Headmidhornupperleft; - public ModelRenderer Headmidhornupperright; - public ModelRenderer Wingupperarmleft; - public ModelRenderer Winglowerarmleft; - public ModelRenderer Wingmembramesmallleft; - public ModelRenderer Wingfinger1left; - public ModelRenderer Wingmembramemidleft; - public ModelRenderer Wingfingerlower1left; - public ModelRenderer Wingfinger2left; - public ModelRenderer Wingfinger3left; - public ModelRenderer Wingmembramelargeleft; - public ModelRenderer Wingfingerlower2left; - public ModelRenderer Wingfingerlower3left; - public ModelRenderer Lowerarmleft; - public ModelRenderer Lefthandrightfinger; - public ModelRenderer Lefthandmidfinger; - public ModelRenderer Lefthandrightfinger_1; - public ModelRenderer Thumbtoeupperleft; - public ModelRenderer Clawlefthandright; - public ModelRenderer Clawlefthandmid; - public ModelRenderer Clawlefthandleft; - public ModelRenderer Thumbtoelowerleft; - public ModelRenderer Lowerarmleft_1; - public ModelRenderer Righthandleftfinger; - public ModelRenderer Righthandmidfinger; - public ModelRenderer Righthandrightfinger; - public ModelRenderer Thumbtoeupperright; - public ModelRenderer Clawrighthandleft; - public ModelRenderer Clawrighthandmid; - public ModelRenderer Clawrighthandright; - public ModelRenderer Thumbtoelowerright; - public ModelRenderer Spiketop3; - public ModelRenderer Spiketop4; - public ModelRenderer Spiketop5; - public ModelRenderer Spiketop6; - public ModelRenderer Wingupperarmright; - public ModelRenderer Winglowerarmright; - public ModelRenderer Wingmembramesmallright; - public ModelRenderer Wingfinger1right; - public ModelRenderer Wingmembramemidright; - public ModelRenderer Wingfinger2right; - public ModelRenderer Wingfinger3right; - public ModelRenderer Wingfingerlower1right; - public ModelRenderer Wingmembramelargeright; - public ModelRenderer Wingfingerlower2right; - public ModelRenderer Wingfingerlower3right; + public ModelRenderer Tail1; + public ModelRenderer Neckbase; + public ModelRenderer shape16; + public ModelRenderer Wingshoulderleft; + public ModelRenderer Shoulderleft; + public ModelRenderer Shoulderleft_1; + public ModelRenderer Spikebase1; + public ModelRenderer Spikebase2; + public ModelRenderer Spkebase3; + public ModelRenderer Spikebase4; + public ModelRenderer Wingshoulderright; + public ModelRenderer Tail3; + public ModelRenderer Righthip; + public ModelRenderer Lefthip; + public ModelRenderer Spikebase5; + public ModelRenderer Spikebase6; + public ModelRenderer Spikebase7; + public ModelRenderer Spiketop10; + public ModelRenderer Tail4; + public ModelRenderer Spiketop11; + public ModelRenderer Spiketop12; + public ModelRenderer Spiketop13; + public ModelRenderer Tail6; + public ModelRenderer Spiketop14; + public ModelRenderer Spiketop15; + public ModelRenderer Spiketop16; + public ModelRenderer Tail7; + public ModelRenderer Spiketop17; + public ModelRenderer Spiketop18; + public ModelRenderer Spiketop19; + public ModelRenderer Tail8; + public ModelRenderer LTailSpike; + public ModelRenderer RTailSpike; + public ModelRenderer LTailMembrane; + public ModelRenderer RTailMembrane; + public ModelRenderer RightLeg; + public ModelRenderer RightFoot; + public ModelRenderer Righttoemid; + public ModelRenderer Righttoeleft; + public ModelRenderer Righttoeright; + public ModelRenderer Outertoelowerright; + public ModelRenderer Righttoelowermid; + public ModelRenderer Righttoelowerleft; + public ModelRenderer Righttoelowerright; + public ModelRenderer Outertoelowerright_1; + public ModelRenderer Rightleg; + public ModelRenderer Rightfoot; + public ModelRenderer Lefttoemid; + public ModelRenderer Lefttoeright; + public ModelRenderer Lefttoeleft; + public ModelRenderer Outertoeleft; + public ModelRenderer Lefttoelowermid; + public ModelRenderer Lefttoelowerright; + public ModelRenderer Lefttoelowerleft; + public ModelRenderer Outertoelowerleft; + public ModelRenderer Spiketop7; + public ModelRenderer Spiketop8; + public ModelRenderer Spiketop9; + public ModelRenderer Neckmid; + public ModelRenderer Spiketop2; + public ModelRenderer Neckend; + public ModelRenderer Spiketop1; + public ModelRenderer Headback; + public ModelRenderer Snout; + public ModelRenderer Lowerjaw; + public ModelRenderer Headlargehornlowerleft; + public ModelRenderer Headlargehornlowerright; + public ModelRenderer Smallheadhornleft2; + public ModelRenderer Smallheadhornright2; + public ModelRenderer Smallheadhornleft1; + public ModelRenderer Smallheadhornright1; + public ModelRenderer Headmidhornlowerleft; + public ModelRenderer Headmidhornlowerright; + public ModelRenderer Tooth5; + public ModelRenderer Tooth4; + public ModelRenderer Tooth3; + public ModelRenderer Tooth2; + public ModelRenderer Tooth1; + public ModelRenderer Tooth6; + public ModelRenderer Tooth7; + public ModelRenderer Tooth8; + public ModelRenderer Tooth9; + public ModelRenderer Tooth10; + public ModelRenderer Headlargehornupperleft; + public ModelRenderer Headlargehornupperright; + public ModelRenderer Smallheadhornleft3; + public ModelRenderer Smallheadhornright3; + public ModelRenderer Headmidhornupperleft; + public ModelRenderer Headmidhornupperright; + public ModelRenderer Wingupperarmleft; + public ModelRenderer Winglowerarmleft; + public ModelRenderer Wingmembramesmallleft; + public ModelRenderer Wingfinger1left; + public ModelRenderer Wingmembramemidleft; + public ModelRenderer Wingfingerlower1left; + public ModelRenderer Wingfinger2left; + public ModelRenderer Wingfinger3left; + public ModelRenderer Wingmembramelargeleft; + public ModelRenderer Wingfingerlower2left; + public ModelRenderer Wingfingerlower3left; + public ModelRenderer Lowerarmleft; + public ModelRenderer Lefthandrightfinger; + public ModelRenderer Lefthandmidfinger; + public ModelRenderer Lefthandrightfinger_1; + public ModelRenderer Thumbtoeupperleft; + public ModelRenderer Clawlefthandright; + public ModelRenderer Clawlefthandmid; + public ModelRenderer Clawlefthandleft; + public ModelRenderer Thumbtoelowerleft; + public ModelRenderer Lowerarmleft_1; + public ModelRenderer Righthandleftfinger; + public ModelRenderer Righthandmidfinger; + public ModelRenderer Righthandrightfinger; + public ModelRenderer Thumbtoeupperright; + public ModelRenderer Clawrighthandleft; + public ModelRenderer Clawrighthandmid; + public ModelRenderer Clawrighthandright; + public ModelRenderer Thumbtoelowerright; + public ModelRenderer Spiketop3; + public ModelRenderer Spiketop4; + public ModelRenderer Spiketop5; + public ModelRenderer Spiketop6; + public ModelRenderer Wingupperarmright; + public ModelRenderer Winglowerarmright; + public ModelRenderer Wingmembramesmallright; + public ModelRenderer Wingfinger1right; + public ModelRenderer Wingmembramemidright; + public ModelRenderer Wingfinger2right; + public ModelRenderer Wingfinger3right; + public ModelRenderer Wingfingerlower1right; + public ModelRenderer Wingmembramelargeright; + public ModelRenderer Wingfingerlower2right; + public ModelRenderer Wingfingerlower3right; - public ModelDragon() - { - this.textureWidth = 512; - this.textureHeight = 512; - this.Righttoeleft = new ModelRenderer(this, 290, 280); - this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); - this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); - this.Spiketop6 = new ModelRenderer(this, 300, 460); - this.Spiketop6.setRotationPoint(0.0F, 0.0F, 0.1F); - this.Spiketop6.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop6, -0.136659280431156F, 0.0F, 0.0F); - this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); - this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); - this.Spiketop4 = new ModelRenderer(this, 300, 460); - this.Spiketop4.setRotationPoint(0.0F, -3.0F, 0.1F); - this.Spiketop4.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop4, -0.27314402793711257F, 0.0F, 0.0F); - this.Wingmembramesmallleft = new ModelRenderer(this, 420, 255); - this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.6F, -1.0F); - this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); - this.Spiketop1 = new ModelRenderer(this, 300, 460); - this.Spiketop1.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Spiketop1.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop1, -0.091106186954104F, 0.0F, 0.0F); - this.Snout = new ModelRenderer(this, 120, 365); - this.Snout.setRotationPoint(0.0F, 0.01F, -8.0F); - this.Snout.addBox(-3.0F, 0.0F, -12.0F, 6, 6, 12, 0.0F); - this.setRotateAngle(Snout, 0.045553093477052F, 0.0F, 0.015485315777647711F); - this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); - this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); - this.Rightfoot = new ModelRenderer(this, 260, 255); - this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); - this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Smallheadhornleft1 = new ModelRenderer(this, 190, 420); - this.Smallheadhornleft1.setRotationPoint(0.4F, 0.0F, -1.0F); - this.Smallheadhornleft1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornleft1, 0.18203784098300857F, 0.22759093446006054F, 0.18203784098300857F); - this.Wingfinger3left = new ModelRenderer(this, 390, 170); - this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); - this.Tooth10 = new ModelRenderer(this, 180, 500); - this.Tooth10.setRotationPoint(-2.7F, 4.8F, -10.7F); - this.Tooth10.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth10, 0.6829473363053812F, -1.9123572614101867F, -0.31869712141416456F); - this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); - this.Headmidhornupperleft.setRotationPoint(0.0F, 0.1F, 3.9F); - this.Headmidhornupperleft.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); - this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.136659280431156F, 0.0F); - this.Righttoeright = new ModelRenderer(this, 290, 280); - this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); - this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); - this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerright.setRotationPoint(-3.0F, 2.0F, -4.0F); - this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Headmidhornlowerright, -0.136659280431156F, -0.5462880558742251F, 0.0F); - this.Spikebase6 = new ModelRenderer(this, 300, 440); - this.Spikebase6.setRotationPoint(0.0F, 1.0F, 12.0F); - this.Spikebase6.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Spikebase6, -0.27314402793711257F, 0.0F, 0.0F); - this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); - this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); - this.Spiketop14 = new ModelRenderer(this, 300, 460); - this.Spiketop14.setRotationPoint(0.0F, 0.0F, 4.5F); - this.Spiketop14.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); - this.setRotateAngle(Spiketop14, -0.40980330836826856F, 0.0F, 0.0F); - this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); - this.Headlargehornupperleft.setRotationPoint(1.1F, 0.1F, 6.7F); - this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 7, 0.0F); - this.setRotateAngle(Headlargehornupperleft, 0.0F, -0.5918411493512771F, 0.0F); - this.Spiketop3 = new ModelRenderer(this, 300, 460); - this.Spiketop3.setRotationPoint(0.0F, -1.0F, 0.1F); - this.Spiketop3.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop3, -0.22759093446006054F, 0.0F, 0.0F); - this.Wingfinger3right = new ModelRenderer(this, 390, 170); - this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); - this.Tooth1 = new ModelRenderer(this, 180, 500); - this.Tooth1.setRotationPoint(2.8F, 5.0F, -5.2F); - this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); - this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); - this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); - this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornright3.setRotationPoint(1.0F, 1.0F, 0.0F); - this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Smallheadhornright3, -0.27314402793711257F, 0.0F, 0.0F); - this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); - this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); - this.Righthip = new ModelRenderer(this, 260, 300); - this.Righthip.setRotationPoint(-6.0F, 3.0F, 15.0F); - this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Righthip, -0.27314402793711257F, -0.27314402793711257F, 0.18203784098300857F); - this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornleft3.setRotationPoint(-1.0F, 1.0F, 0.0F); - this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Smallheadhornleft3, -0.27314402793711257F, 0.0F, 0.0F); - this.Spiketop12 = new ModelRenderer(this, 300, 460); - this.Spiketop12.setRotationPoint(0.0F, 1.5F, 12.0F); - this.Spiketop12.addBox(-0.5F, -10.0F, 0.0F, 1, 10, 2, 0.0F); - this.setRotateAngle(Spiketop12, -0.36425021489121656F, 0.0F, 0.0F); - this.Headmidhornupperright = new ModelRenderer(this, 190, 430); - this.Headmidhornupperright.setRotationPoint(0.0F, 0.1F, 3.9F); - this.Headmidhornupperright.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); - this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.136659280431156F, 0.0F); - this.Tooth6 = new ModelRenderer(this, 180, 500); - this.Tooth6.setRotationPoint(-0.5F, 5.0F, -11.0F); - this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); - this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); - this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); - this.Body = new ModelRenderer(this, 5, 460); - this.Body.setRotationPoint(0.0F, -4.0F, -20.0F); - this.Body.addBox(-9.0F, 0.0F, 0.0F, 18, 18, 23, 0.0F); - this.setRotateAngle(Body, 0.5462880558742251F, 0.0F, 0.0F); - this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); - this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); - this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); - this.Spiketop15 = new ModelRenderer(this, 300, 460); - this.Spiketop15.setRotationPoint(0.0F, 3.6F, 9.0F); - this.Spiketop15.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); - this.setRotateAngle(Spiketop15, -0.18203784098300857F, 0.0F, 0.0F); - this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); - this.Lowerarmleft_1.setRotationPoint(-3.01F, 8.0F, -2.0F); - this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, 0.0F, 0.0F); - this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerright.setRotationPoint(-1.6F, 0.0F, -2.0F); - this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 8, 0.0F); - this.setRotateAngle(Headlargehornlowerright, 0.18203784098300857F, -0.22759093446006054F, -0.36425021489121656F); - this.Wingshoulderright = new ModelRenderer(this, 470, 230); - this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 12.0F); - this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); - this.Spiketop11 = new ModelRenderer(this, 300, 460); - this.Spiketop11.setRotationPoint(0.0F, 1.5F, 8.0F); - this.Spiketop11.addBox(-0.5F, -11.0F, -1.0F, 1, 11, 2, 0.0F); - this.setRotateAngle(Spiketop11, -0.36425021489121656F, 0.0F, 0.0F); - this.Clawrighthandright = new ModelRenderer(this, 200, 260); - this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); - this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); - this.Lefttoelowermid = new ModelRenderer(this, 290, 270); - this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); - this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornleft2.setRotationPoint(4.0F, 5.0F, -3.0F); - this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); - this.Clawlefthandright = new ModelRenderer(this, 200, 260); - this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); - this.Spiketop8 = new ModelRenderer(this, 300, 460); - this.Spiketop8.setRotationPoint(0.0F, -3.0F, 0.1F); - this.Spiketop8.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop8, -0.045553093477052F, 0.0F, 0.0F); - this.RTailMembrane = new ModelRenderer(this, 381, 270); - this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); - this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); - this.Righthandrightfinger = new ModelRenderer(this, 220, 260); - this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); - this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); - this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); - this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); - this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); - this.Tail1 = new ModelRenderer(this, 5, 370); - this.Tail1.setRotationPoint(0.0F, 1.0F, 23.0F); - this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); - this.setRotateAngle(Tail1, -0.8196066167365371F, 0.0F, 0.0F); - this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornright2.setRotationPoint(-4.0F, 5.0F, -3.0F); - this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); - this.Spiketop5 = new ModelRenderer(this, 300, 460); - this.Spiketop5.setRotationPoint(0.0F, -7.0F, 2.1F); - this.Spiketop5.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); - this.setRotateAngle(Spiketop5, -0.136659280431156F, 0.0F, 0.0F); - this.Lefttoelowerright = new ModelRenderer(this, 290, 270); - this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); - this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Wingmembramelargeright = new ModelRenderer(this, 270, 430); - this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Spiketop9 = new ModelRenderer(this, 300, 460); - this.Spiketop9.setRotationPoint(0.0F, -0.5F, 0.1F); - this.Spiketop9.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); - this.setRotateAngle(Spiketop9, -0.045553093477052F, 0.0F, 0.0F); - this.Winglowerarmleft = new ModelRenderer(this, 400, 215); - this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); - this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); - this.Tail8 = new ModelRenderer(this, 5, 220); - this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); - this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); - this.Tooth4 = new ModelRenderer(this, 180, 500); - this.Tooth4.setRotationPoint(2.6F, 4.8F, -10.7F); - this.Tooth4.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth4, 0.6829473363053812F, 1.8668041679331349F, 0.31869712141416456F); - this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); - this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); - this.RTailSpike = new ModelRenderer(this, 350, 300); - this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); - this.Outertoelowerright = new ModelRenderer(this, 320, 280); - this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); - this.Wingfinger1left = new ModelRenderer(this, 350, 200); - this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); - this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); - this.Clawlefthandmid = new ModelRenderer(this, 200, 260); - this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Righttoelowerleft = new ModelRenderer(this, 290, 270); - this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); - this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.Shoulderleft = new ModelRenderer(this, 220, 300); - this.Shoulderleft.setRotationPoint(8.0F, 8.0F, 6.0F); - this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); - this.Wingupperarmleft = new ModelRenderer(this, 390, 230); - this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); - this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); - this.LTailMembrane = new ModelRenderer(this, 380, 250); - this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); - this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); - this.Tooth3 = new ModelRenderer(this, 180, 500); - this.Tooth3.setRotationPoint(2.7F, 5.0F, -9.1F); - this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); - this.Tooth2 = new ModelRenderer(this, 180, 500); - this.Tooth2.setRotationPoint(2.8F, 5.0F, -7.0F); - this.Tooth2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth2, -0.045553093477052F, 0.045553093477052F, -0.31869712141416456F); - this.Neckend = new ModelRenderer(this, 120, 420); - this.Neckend.setRotationPoint(0.0F, 0.0F, -11.0F); - this.Neckend.addBox(-3.5F, 1.0F, -7.0F, 7, 9, 10, 0.0F); - this.setRotateAngle(Neckend, 0.27314402793711257F, 0.0F, 0.0F); - this.Spiketop16 = new ModelRenderer(this, 300, 460); - this.Spiketop16.setRotationPoint(0.0F, 3.5F, 14.0F); - this.Spiketop16.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop16, -0.091106186954104F, 0.0F, 0.0F); - this.Headlargehornupperright = new ModelRenderer(this, 190, 470); - this.Headlargehornupperright.setRotationPoint(-1.1F, 0.1F, 6.7F); - this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 7, 0.0F); - this.setRotateAngle(Headlargehornupperright, 0.0F, 0.5918411493512771F, 0.0F); - this.Righttoelowermid = new ModelRenderer(this, 290, 270); - this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); - this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Neckmid = new ModelRenderer(this, 120, 445); - this.Neckmid.setRotationPoint(0.0F, 1.0F, -12.0F); - this.Neckmid.addBox(-4.5F, 0.0F, -9.0F, 9, 11, 12, 0.0F); - this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); - this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); - this.Tail7 = new ModelRenderer(this, 5, 240); - this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); - this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); - this.setRotateAngle(Tail7, 0.22759093446006054F, 0.0F, 0.0F); - this.Spikebase1 = new ModelRenderer(this, 300, 440); - this.Spikebase1.setRotationPoint(0.0F, 0.0F, 1.0F); - this.Spikebase1.addBox(-1.0F, -3.0F, 0.0F, 2, 3, 3, 0.0F); - this.setRotateAngle(Spikebase1, -0.36425021489121656F, 0.0F, 0.0F); - this.Righttoemid = new ModelRenderer(this, 290, 280); - this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); - this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.Lefttoeleft = new ModelRenderer(this, 290, 280); - this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); - this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); - this.Clawrighthandleft = new ModelRenderer(this, 200, 260); - this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); - this.Spiketop7 = new ModelRenderer(this, 300, 460); - this.Spiketop7.setRotationPoint(0.0F, -6.0F, 0.1F); - this.Spiketop7.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop7, -0.136659280431156F, 0.0F, 0.0F); - this.Headback = new ModelRenderer(this, 120, 390); - this.Headback.setRotationPoint(-0.01F, 0.0F, -5.0F); - this.Headback.addBox(-4.0F, 0.0F, -9.0F, 8, 9, 9, 0.0F); - this.setRotateAngle(Headback, 0.36425021489121656F, 0.0F, 0.0F); - this.Lowerjaw = new ModelRenderer(this, 120, 345); - this.Lowerjaw.setRotationPoint(0.0F, 6.15F, -8.0F); - this.Lowerjaw.addBox(-2.5F, 0.0F, -11.0F, 5, 2, 11, 0.0F); - this.setRotateAngle(Lowerjaw, -0.045553093477052F, 0.0F, 0.0F); - this.Lowerarmleft = new ModelRenderer(this, 220, 275); - this.Lowerarmleft.setRotationPoint(1.01F, 8.0F, -2.0F); - this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.0F, 0.0F); - this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); - this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); - this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); - this.Shoulderleft_1.setRotationPoint(-6.0F, 8.0F, 6.0F); - this.Shoulderleft_1.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); - this.Wingfinger1right = new ModelRenderer(this, 350, 200); - this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); - this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); - this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); - this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); - this.RightFoot = new ModelRenderer(this, 260, 255); - this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); - this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); - this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); - this.Winglowerarmright = new ModelRenderer(this, 400, 215); - this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); - this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); - this.Righttoelowerright = new ModelRenderer(this, 290, 270); - this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); - this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Rightleg = new ModelRenderer(this, 260, 275); - this.Rightleg.setRotationPoint(1.0F, 14.6F, 0.0F); - this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.22759093446006054F, 0.136659280431156F); - this.Tooth5 = new ModelRenderer(this, 180, 500); - this.Tooth5.setRotationPoint(0.5F, 5.0F, -11.0F); - this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); - this.Spiketop17 = new ModelRenderer(this, 300, 460); - this.Spiketop17.setRotationPoint(0.0F, 3.5F, 2.0F); - this.Spiketop17.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop17, -0.18203784098300857F, 0.0F, 0.0F); - this.Spiketop18 = new ModelRenderer(this, 300, 460); - this.Spiketop18.setRotationPoint(0.0F, 2.5F, 7.0F); - this.Spiketop18.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.Outertoeleft = new ModelRenderer(this, 305, 280); - this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.22759093446006054F, 0.40980330836826856F); - this.Wingfinger2right = new ModelRenderer(this, 330, 150); - this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); - this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); - this.Tooth8 = new ModelRenderer(this, 180, 500); - this.Tooth8.setRotationPoint(-2.8F, 5.0F, -7.0F); - this.Tooth8.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth8, 0.045553093477052F, -0.045553093477052F, 0.31869712141416456F); - this.Spikebase4 = new ModelRenderer(this, 280, 440); - this.Spikebase4.setRotationPoint(0.0F, -2.0F, 25.0F); - this.Spikebase4.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 4, 0.0F); - this.setRotateAngle(Spikebase4, -0.8651597102135892F, 0.0F, 0.0F); - this.Spikebase5 = new ModelRenderer(this, 280, 440); - this.Spikebase5.setRotationPoint(0.0F, 3.0F, 4.5F); - this.Spikebase5.addBox(-1.0F, -7.0F, 0.0F, 2, 7, 4, 0.0F); - this.setRotateAngle(Spikebase5, -0.18203784098300857F, 0.0F, 0.0F); - this.LTailSpike = new ModelRenderer(this, 350, 300); - this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); - this.Clawrighthandmid = new ModelRenderer(this, 200, 260); - this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Tooth9 = new ModelRenderer(this, 180, 500); - this.Tooth9.setRotationPoint(-2.7F, 5.0F, -9.1F); - this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); - this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); - this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); - this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); - this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); - this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); - this.Spiketop2 = new ModelRenderer(this, 300, 460); - this.Spiketop2.setRotationPoint(0.0F, 1.0F, -12.5F); - this.Spiketop2.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(Spiketop2, -0.22759093446006054F, 0.0F, 0.0F); - this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerleft.setRotationPoint(1.6F, 0.0F, -2.0F); - this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 8, 0.0F); - this.setRotateAngle(Headlargehornlowerleft, 0.18203784098300857F, 0.22759093446006054F, 0.36425021489121656F); - this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); - this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); - this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); - this.Tail4 = new ModelRenderer(this, 5, 300); - this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); - this.setRotateAngle(Tail4, 0.22759093446006054F, 0.0F, 0.0F); - this.Tail3 = new ModelRenderer(this, 5, 335); - this.Tail3.setRotationPoint(0.0F, 1.0F, 24.0F); - this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); - this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); - this.Wingupperarmright = new ModelRenderer(this, 390, 230); - this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); - this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); - this.Outertoelowerleft = new ModelRenderer(this, 305, 270); - this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); - this.Spkebase3 = new ModelRenderer(this, 280, 440); - this.Spkebase3.setRotationPoint(0.0F, 0.0F, 11.5F); - this.Spkebase3.addBox(-1.0F, -7.0F, 2.0F, 2, 7, 4, 0.0F); - this.setRotateAngle(Spkebase3, -0.7285004297824331F, 0.0F, 0.0F); - this.Wingshoulderleft = new ModelRenderer(this, 470, 230); - this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 12.0F); - this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); - this.Wingfinger2left = new ModelRenderer(this, 330, 150); - this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); - this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); - this.Lefthip = new ModelRenderer(this, 260, 300); - this.Lefthip.setRotationPoint(6.0F, 3.0F, 15.0F); - this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Lefthip, -0.27314402793711257F, 0.27314402793711257F, -0.18203784098300857F); - this.Righthandmidfinger = new ModelRenderer(this, 220, 260); - this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); - this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); - this.Righthandleftfinger = new ModelRenderer(this, 220, 260); - this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); - this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); - this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerleft.setRotationPoint(3.0F, 2.0F, -4.0F); - this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Headmidhornlowerleft, -0.136659280431156F, 0.5462880558742251F, 0.0F); - this.Tail6 = new ModelRenderer(this, 5, 275); - this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); - this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); - this.setRotateAngle(Tail6, 0.27314402793711257F, 0.0F, 0.0F); - this.Lefttoeright = new ModelRenderer(this, 290, 280); - this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); - this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); - this.Spiketop13 = new ModelRenderer(this, 300, 460); - this.Spiketop13.setRotationPoint(0.0F, 1.9F, 17.0F); - this.Spiketop13.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(Spiketop13, -0.27314402793711257F, 0.0F, 0.0F); - this.Tooth7 = new ModelRenderer(this, 180, 500); - this.Tooth7.setRotationPoint(-2.8F, 5.0F, -5.2F); - this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); - this.Spikebase2 = new ModelRenderer(this, 280, 440); - this.Spikebase2.setRotationPoint(0.0F, 0.0F, 7.0F); - this.Spikebase2.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 4, 0.0F); - this.setRotateAngle(Spikebase2, -0.4553564018453205F, 0.0F, 0.0F); - this.Smallheadhornright1 = new ModelRenderer(this, 190, 420); - this.Smallheadhornright1.setRotationPoint(-0.4F, 0.0F, -1.0F); - this.Smallheadhornright1.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornright1, 0.18203784098300857F, -0.22759093446006054F, -0.18203784098300857F); - this.Wingmembramemidright = new ModelRenderer(this, 350, 320); - this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); - this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); - this.shape16 = new ModelRenderer(this, 5, 415); - this.shape16.setRotationPoint(0.0F, 18.0F, 2.0F); - this.shape16.addBox(-6.5F, -10.0F, 0.0F, 13, 10, 30, 0.0F); - this.setRotateAngle(shape16, -0.31869712141416456F, 0.0F, 0.0F); - this.Neckbase = new ModelRenderer(this, 120, 470); - this.Neckbase.setRotationPoint(0.0F, 4.0F, 8.0F); - this.Neckbase.addBox(-6.0F, 0.0F, -14.0F, 12, 14, 14, 0.0F); - this.setRotateAngle(Neckbase, -0.4553564018453205F, 0.0F, 0.0F); - this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); - this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); - this.Spiketop10 = new ModelRenderer(this, 300, 460); - this.Spiketop10.setRotationPoint(0.0F, 1.0F, 25.0F); - this.Spiketop10.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop10, -0.31869712141416456F, 0.0F, 0.0F); - this.RightLeg = new ModelRenderer(this, 260, 275); - this.RightLeg.setRotationPoint(-1.0F, 14.6F, 0.0F); - this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.23911010752322312F, -0.091106186954104F); - this.Lefttoemid = new ModelRenderer(this, 290, 280); - this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); - this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.Spikebase7 = new ModelRenderer(this, 300, 440); - this.Spikebase7.setRotationPoint(0.0F, 1.0F, 18.5F); - this.Spikebase7.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Spikebase7, -0.27314402793711257F, 0.0F, 0.0F); - this.Clawlefthandleft = new ModelRenderer(this, 200, 260); - this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); - this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); - this.Spiketop19 = new ModelRenderer(this, 300, 460); - this.Spiketop19.setRotationPoint(0.0F, 5.0F, 11.0F); - this.Spiketop19.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - //Grouping - this.RightFoot.addChild(this.Righttoeleft); - this.Spikebase4.addChild(this.Spiketop6); - this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); - this.Spikebase2.addChild(this.Spiketop4); - this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); - this.Neckmid.addChild(this.Spiketop1); - this.Headback.addChild(this.Snout); - this.Lowerarmleft.addChild(this.Thumbtoeupperleft); - this.Rightleg.addChild(this.Rightfoot); - this.Headback.addChild(this.Smallheadhornleft1); - this.Wingfinger1left.addChild(this.Wingfinger3left); - this.Snout.addChild(this.Tooth10); - this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); - this.RightFoot.addChild(this.Righttoeright); - this.Headback.addChild(this.Headmidhornlowerright); - this.Tail1.addChild(this.Spikebase6); - this.Outertoelowerright.addChild(this.Outertoelowerright_1); - this.Tail4.addChild(this.Spiketop14); - this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); - this.Spikebase1.addChild(this.Spiketop3); - this.Wingfinger1right.addChild(this.Wingfinger3right); - this.Snout.addChild(this.Tooth1); - this.Lefttoeleft.addChild(this.Lefttoelowerleft); - this.Smallheadhornright2.addChild(this.Smallheadhornright3); - this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); - this.Tail1.addChild(this.Righthip); - this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); - this.Tail3.addChild(this.Spiketop12); - this.Headmidhornlowerright.addChild(this.Headmidhornupperright); - this.Snout.addChild(this.Tooth6); - this.Wingfinger3left.addChild(this.Wingfingerlower3left); - this.Lowerarmleft.addChild(this.Lefthandmidfinger); - this.Tail4.addChild(this.Spiketop15); - this.Shoulderleft_1.addChild(this.Lowerarmleft_1); - this.Headback.addChild(this.Headlargehornlowerright); - this.Body.addChild(this.Wingshoulderright); - this.Tail3.addChild(this.Spiketop11); - this.Righthandrightfinger.addChild(this.Clawrighthandright); - this.Lefttoemid.addChild(this.Lefttoelowermid); - this.Headback.addChild(this.Smallheadhornleft2); - this.Lefthandrightfinger.addChild(this.Clawlefthandright); - this.Spikebase6.addChild(this.Spiketop8); - this.RTailSpike.addChild(this.RTailMembrane); - this.Lowerarmleft_1.addChild(this.Righthandrightfinger); - this.Winglowerarmleft.addChild(this.Wingmembramemidleft); - this.Body.addChild(this.Tail1); - this.Headback.addChild(this.Smallheadhornright2); - this.Spkebase3.addChild(this.Spiketop5); - this.Lefttoeright.addChild(this.Lefttoelowerright); - this.Wingfinger1right.addChild(this.Wingmembramelargeright); - this.Spikebase7.addChild(this.Spiketop9); - this.Wingupperarmleft.addChild(this.Winglowerarmleft); - this.Tail7.addChild(this.Tail8); - this.Snout.addChild(this.Tooth4); - this.Wingfinger1left.addChild(this.Wingfingerlower1left); - this.Tail8.addChild(this.RTailSpike); - this.RightFoot.addChild(this.Outertoelowerright); - this.Winglowerarmleft.addChild(this.Wingfinger1left); - this.Lefthandmidfinger.addChild(this.Clawlefthandmid); - this.Righttoeleft.addChild(this.Righttoelowerleft); - this.Body.addChild(this.Shoulderleft); - this.Wingshoulderleft.addChild(this.Wingupperarmleft); - this.LTailSpike.addChild(this.LTailMembrane); - this.Snout.addChild(this.Tooth3); - this.Snout.addChild(this.Tooth2); - this.Neckmid.addChild(this.Neckend); - this.Tail4.addChild(this.Spiketop16); - this.Headlargehornlowerright.addChild(this.Headlargehornupperright); - this.Righttoemid.addChild(this.Righttoelowermid); - this.Neckbase.addChild(this.Neckmid); - this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); - this.Tail6.addChild(this.Tail7); - this.Body.addChild(this.Spikebase1); - this.RightFoot.addChild(this.Righttoemid); - this.Rightfoot.addChild(this.Lefttoeleft); - this.Righthandleftfinger.addChild(this.Clawrighthandleft); - this.Spikebase5.addChild(this.Spiketop7); - this.Neckend.addChild(this.Headback); - this.Headback.addChild(this.Lowerjaw); - this.Shoulderleft.addChild(this.Lowerarmleft); - this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); - this.Body.addChild(this.Shoulderleft_1); - this.Winglowerarmright.addChild(this.Wingfinger1right); - this.Wingfinger2right.addChild(this.Wingfingerlower2right); - this.RightLeg.addChild(this.RightFoot); - this.Wingfinger2left.addChild(this.Wingfingerlower2left); - this.Wingupperarmright.addChild(this.Winglowerarmright); - this.Righttoeright.addChild(this.Righttoelowerright); - this.Lefthip.addChild(this.Rightleg); - this.Snout.addChild(this.Tooth5); - this.Tail6.addChild(this.Spiketop17); - this.Tail6.addChild(this.Spiketop18); - this.Rightfoot.addChild(this.Outertoeleft); - this.Wingfinger1right.addChild(this.Wingfinger2right); - this.Snout.addChild(this.Tooth8); - this.Body.addChild(this.Spikebase4); - this.Tail1.addChild(this.Spikebase5); - this.Tail8.addChild(this.LTailSpike); - this.Righthandmidfinger.addChild(this.Clawrighthandmid); - this.Snout.addChild(this.Tooth9); - this.Wingfinger1right.addChild(this.Wingfingerlower1right); - this.Wingupperarmright.addChild(this.Wingmembramesmallright); - this.Neckbase.addChild(this.Spiketop2); - this.Headback.addChild(this.Headlargehornlowerleft); - this.Wingfinger1left.addChild(this.Wingmembramelargeleft); - this.Wingfinger3right.addChild(this.Wingfingerlower3right); - this.Tail3.addChild(this.Tail4); - this.Tail1.addChild(this.Tail3); - this.Wingshoulderright.addChild(this.Wingupperarmright); - this.Outertoeleft.addChild(this.Outertoelowerleft); - this.Body.addChild(this.Spkebase3); - this.Body.addChild(this.Wingshoulderleft); - this.Wingfinger1left.addChild(this.Wingfinger2left); - this.Tail1.addChild(this.Lefthip); - this.Lowerarmleft_1.addChild(this.Righthandmidfinger); - this.Lowerarmleft_1.addChild(this.Righthandleftfinger); - this.Headback.addChild(this.Headmidhornlowerleft); - this.Tail4.addChild(this.Tail6); - this.Rightfoot.addChild(this.Lefttoeright); - this.Tail3.addChild(this.Spiketop13); - this.Snout.addChild(this.Tooth7); - this.Body.addChild(this.Spikebase2); - this.Headback.addChild(this.Smallheadhornright1); - this.Winglowerarmright.addChild(this.Wingmembramemidright); - this.Body.addChild(this.shape16); - this.Body.addChild(this.Neckbase); - this.Lowerarmleft.addChild(this.Lefthandrightfinger); - this.Tail1.addChild(this.Spiketop10); - this.Righthip.addChild(this.RightLeg); - this.Rightfoot.addChild(this.Lefttoemid); - this.Tail1.addChild(this.Spikebase7); - this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); - this.Tail6.addChild(this.Spiketop19); - } - public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) - { - modelRenderer.rotateAngleX = x; - modelRenderer.rotateAngleY = y; - modelRenderer.rotateAngleZ = z; - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); - this.Body.render(f5); - } + public ModelDragon() { + this.textureWidth = 512; + this.textureHeight = 512; + this.Righttoeleft = new ModelRenderer(this, 290, 280); + this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); + this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); + this.Spiketop6 = new ModelRenderer(this, 300, 460); + this.Spiketop6.setRotationPoint(0.0F, 0.0F, 0.1F); + this.Spiketop6.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop6, -0.136659280431156F, 0.0F, 0.0F); + this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); + this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); + this.Spiketop4 = new ModelRenderer(this, 300, 460); + this.Spiketop4.setRotationPoint(0.0F, -3.0F, 0.1F); + this.Spiketop4.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop4, -0.27314402793711257F, 0.0F, 0.0F); + this.Wingmembramesmallleft = new ModelRenderer(this, 420, 255); + this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.6F, -1.0F); + this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); + this.Spiketop1 = new ModelRenderer(this, 300, 460); + this.Spiketop1.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Spiketop1.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop1, -0.091106186954104F, 0.0F, 0.0F); + this.Snout = new ModelRenderer(this, 120, 365); + this.Snout.setRotationPoint(0.0F, 0.01F, -8.0F); + this.Snout.addBox(-3.0F, 0.0F, -12.0F, 6, 6, 12, 0.0F); + this.setRotateAngle(Snout, 0.045553093477052F, 0.0F, 0.015485315777647711F); + this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); + this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); + this.Rightfoot = new ModelRenderer(this, 260, 255); + this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); + this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Smallheadhornleft1 = new ModelRenderer(this, 190, 420); + this.Smallheadhornleft1.setRotationPoint(0.4F, 0.0F, -1.0F); + this.Smallheadhornleft1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornleft1, 0.18203784098300857F, 0.22759093446006054F, 0.18203784098300857F); + this.Wingfinger3left = new ModelRenderer(this, 390, 170); + this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); + this.Tooth10 = new ModelRenderer(this, 180, 500); + this.Tooth10.setRotationPoint(-2.7F, 4.8F, -10.7F); + this.Tooth10.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth10, 0.6829473363053812F, -1.9123572614101867F, -0.31869712141416456F); + this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); + this.Headmidhornupperleft.setRotationPoint(0.0F, 0.1F, 3.9F); + this.Headmidhornupperleft.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); + this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.136659280431156F, 0.0F); + this.Righttoeright = new ModelRenderer(this, 290, 280); + this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); + this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); + this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerright.setRotationPoint(-3.0F, 2.0F, -4.0F); + this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Headmidhornlowerright, -0.136659280431156F, -0.5462880558742251F, 0.0F); + this.Spikebase6 = new ModelRenderer(this, 300, 440); + this.Spikebase6.setRotationPoint(0.0F, 1.0F, 12.0F); + this.Spikebase6.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Spikebase6, -0.27314402793711257F, 0.0F, 0.0F); + this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); + this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); + this.Spiketop14 = new ModelRenderer(this, 300, 460); + this.Spiketop14.setRotationPoint(0.0F, 0.0F, 4.5F); + this.Spiketop14.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); + this.setRotateAngle(Spiketop14, -0.40980330836826856F, 0.0F, 0.0F); + this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); + this.Headlargehornupperleft.setRotationPoint(1.1F, 0.1F, 6.7F); + this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 7, 0.0F); + this.setRotateAngle(Headlargehornupperleft, 0.0F, -0.5918411493512771F, 0.0F); + this.Spiketop3 = new ModelRenderer(this, 300, 460); + this.Spiketop3.setRotationPoint(0.0F, -1.0F, 0.1F); + this.Spiketop3.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop3, -0.22759093446006054F, 0.0F, 0.0F); + this.Wingfinger3right = new ModelRenderer(this, 390, 170); + this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); + this.Tooth1 = new ModelRenderer(this, 180, 500); + this.Tooth1.setRotationPoint(2.8F, 5.0F, -5.2F); + this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); + this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); + this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); + this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornright3.setRotationPoint(1.0F, 1.0F, 0.0F); + this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Smallheadhornright3, -0.27314402793711257F, 0.0F, 0.0F); + this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); + this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); + this.Righthip = new ModelRenderer(this, 260, 300); + this.Righthip.setRotationPoint(-6.0F, 3.0F, 15.0F); + this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Righthip, -0.27314402793711257F, -0.27314402793711257F, 0.18203784098300857F); + this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornleft3.setRotationPoint(-1.0F, 1.0F, 0.0F); + this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Smallheadhornleft3, -0.27314402793711257F, 0.0F, 0.0F); + this.Spiketop12 = new ModelRenderer(this, 300, 460); + this.Spiketop12.setRotationPoint(0.0F, 1.5F, 12.0F); + this.Spiketop12.addBox(-0.5F, -10.0F, 0.0F, 1, 10, 2, 0.0F); + this.setRotateAngle(Spiketop12, -0.36425021489121656F, 0.0F, 0.0F); + this.Headmidhornupperright = new ModelRenderer(this, 190, 430); + this.Headmidhornupperright.setRotationPoint(0.0F, 0.1F, 3.9F); + this.Headmidhornupperright.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); + this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.136659280431156F, 0.0F); + this.Tooth6 = new ModelRenderer(this, 180, 500); + this.Tooth6.setRotationPoint(-0.5F, 5.0F, -11.0F); + this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); + this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); + this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); + this.Body = new ModelRenderer(this, 5, 460); + this.Body.setRotationPoint(0.0F, -4.0F, -20.0F); + this.Body.addBox(-9.0F, 0.0F, 0.0F, 18, 18, 23, 0.0F); + this.setRotateAngle(Body, 0.5462880558742251F, 0.0F, 0.0F); + this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); + this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); + this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); + this.Spiketop15 = new ModelRenderer(this, 300, 460); + this.Spiketop15.setRotationPoint(0.0F, 3.6F, 9.0F); + this.Spiketop15.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); + this.setRotateAngle(Spiketop15, -0.18203784098300857F, 0.0F, 0.0F); + this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); + this.Lowerarmleft_1.setRotationPoint(-3.01F, 8.0F, -2.0F); + this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, 0.0F, 0.0F); + this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerright.setRotationPoint(-1.6F, 0.0F, -2.0F); + this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 8, 0.0F); + this.setRotateAngle(Headlargehornlowerright, 0.18203784098300857F, -0.22759093446006054F, + -0.36425021489121656F); + this.Wingshoulderright = new ModelRenderer(this, 470, 230); + this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 12.0F); + this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); + this.Spiketop11 = new ModelRenderer(this, 300, 460); + this.Spiketop11.setRotationPoint(0.0F, 1.5F, 8.0F); + this.Spiketop11.addBox(-0.5F, -11.0F, -1.0F, 1, 11, 2, 0.0F); + this.setRotateAngle(Spiketop11, -0.36425021489121656F, 0.0F, 0.0F); + this.Clawrighthandright = new ModelRenderer(this, 200, 260); + this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); + this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); + this.Lefttoelowermid = new ModelRenderer(this, 290, 270); + this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); + this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornleft2.setRotationPoint(4.0F, 5.0F, -3.0F); + this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); + this.Clawlefthandright = new ModelRenderer(this, 200, 260); + this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); + this.Spiketop8 = new ModelRenderer(this, 300, 460); + this.Spiketop8.setRotationPoint(0.0F, -3.0F, 0.1F); + this.Spiketop8.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop8, -0.045553093477052F, 0.0F, 0.0F); + this.RTailMembrane = new ModelRenderer(this, 381, 270); + this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); + this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); + this.Righthandrightfinger = new ModelRenderer(this, 220, 260); + this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); + this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); + this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); + this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); + this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); + this.Tail1 = new ModelRenderer(this, 5, 370); + this.Tail1.setRotationPoint(0.0F, 1.0F, 23.0F); + this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); + this.setRotateAngle(Tail1, -0.8196066167365371F, 0.0F, 0.0F); + this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornright2.setRotationPoint(-4.0F, 5.0F, -3.0F); + this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); + this.Spiketop5 = new ModelRenderer(this, 300, 460); + this.Spiketop5.setRotationPoint(0.0F, -7.0F, 2.1F); + this.Spiketop5.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); + this.setRotateAngle(Spiketop5, -0.136659280431156F, 0.0F, 0.0F); + this.Lefttoelowerright = new ModelRenderer(this, 290, 270); + this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); + this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Wingmembramelargeright = new ModelRenderer(this, 270, 430); + this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Spiketop9 = new ModelRenderer(this, 300, 460); + this.Spiketop9.setRotationPoint(0.0F, -0.5F, 0.1F); + this.Spiketop9.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); + this.setRotateAngle(Spiketop9, -0.045553093477052F, 0.0F, 0.0F); + this.Winglowerarmleft = new ModelRenderer(this, 400, 215); + this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); + this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); + this.Tail8 = new ModelRenderer(this, 5, 220); + this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); + this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); + this.Tooth4 = new ModelRenderer(this, 180, 500); + this.Tooth4.setRotationPoint(2.6F, 4.8F, -10.7F); + this.Tooth4.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth4, 0.6829473363053812F, 1.8668041679331349F, 0.31869712141416456F); + this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); + this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); + this.RTailSpike = new ModelRenderer(this, 350, 300); + this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); + this.Outertoelowerright = new ModelRenderer(this, 320, 280); + this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); + this.Wingfinger1left = new ModelRenderer(this, 350, 200); + this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); + this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); + this.Clawlefthandmid = new ModelRenderer(this, 200, 260); + this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Righttoelowerleft = new ModelRenderer(this, 290, 270); + this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); + this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.Shoulderleft = new ModelRenderer(this, 220, 300); + this.Shoulderleft.setRotationPoint(8.0F, 8.0F, 6.0F); + this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); + this.Wingupperarmleft = new ModelRenderer(this, 390, 230); + this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); + this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); + this.LTailMembrane = new ModelRenderer(this, 380, 250); + this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); + this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); + this.Tooth3 = new ModelRenderer(this, 180, 500); + this.Tooth3.setRotationPoint(2.7F, 5.0F, -9.1F); + this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); + this.Tooth2 = new ModelRenderer(this, 180, 500); + this.Tooth2.setRotationPoint(2.8F, 5.0F, -7.0F); + this.Tooth2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth2, -0.045553093477052F, 0.045553093477052F, -0.31869712141416456F); + this.Neckend = new ModelRenderer(this, 120, 420); + this.Neckend.setRotationPoint(0.0F, 0.0F, -11.0F); + this.Neckend.addBox(-3.5F, 1.0F, -7.0F, 7, 9, 10, 0.0F); + this.setRotateAngle(Neckend, 0.27314402793711257F, 0.0F, 0.0F); + this.Spiketop16 = new ModelRenderer(this, 300, 460); + this.Spiketop16.setRotationPoint(0.0F, 3.5F, 14.0F); + this.Spiketop16.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop16, -0.091106186954104F, 0.0F, 0.0F); + this.Headlargehornupperright = new ModelRenderer(this, 190, 470); + this.Headlargehornupperright.setRotationPoint(-1.1F, 0.1F, 6.7F); + this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 7, 0.0F); + this.setRotateAngle(Headlargehornupperright, 0.0F, 0.5918411493512771F, 0.0F); + this.Righttoelowermid = new ModelRenderer(this, 290, 270); + this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); + this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Neckmid = new ModelRenderer(this, 120, 445); + this.Neckmid.setRotationPoint(0.0F, 1.0F, -12.0F); + this.Neckmid.addBox(-4.5F, 0.0F, -9.0F, 9, 11, 12, 0.0F); + this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); + this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); + this.Tail7 = new ModelRenderer(this, 5, 240); + this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); + this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); + this.setRotateAngle(Tail7, 0.22759093446006054F, 0.0F, 0.0F); + this.Spikebase1 = new ModelRenderer(this, 300, 440); + this.Spikebase1.setRotationPoint(0.0F, 0.0F, 1.0F); + this.Spikebase1.addBox(-1.0F, -3.0F, 0.0F, 2, 3, 3, 0.0F); + this.setRotateAngle(Spikebase1, -0.36425021489121656F, 0.0F, 0.0F); + this.Righttoemid = new ModelRenderer(this, 290, 280); + this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); + this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.Lefttoeleft = new ModelRenderer(this, 290, 280); + this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); + this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); + this.Clawrighthandleft = new ModelRenderer(this, 200, 260); + this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); + this.Spiketop7 = new ModelRenderer(this, 300, 460); + this.Spiketop7.setRotationPoint(0.0F, -6.0F, 0.1F); + this.Spiketop7.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop7, -0.136659280431156F, 0.0F, 0.0F); + this.Headback = new ModelRenderer(this, 120, 390); + this.Headback.setRotationPoint(-0.01F, 0.0F, -5.0F); + this.Headback.addBox(-4.0F, 0.0F, -9.0F, 8, 9, 9, 0.0F); + this.setRotateAngle(Headback, 0.36425021489121656F, 0.0F, 0.0F); + this.Lowerjaw = new ModelRenderer(this, 120, 345); + this.Lowerjaw.setRotationPoint(0.0F, 6.15F, -8.0F); + this.Lowerjaw.addBox(-2.5F, 0.0F, -11.0F, 5, 2, 11, 0.0F); + this.setRotateAngle(Lowerjaw, -0.045553093477052F, 0.0F, 0.0F); + this.Lowerarmleft = new ModelRenderer(this, 220, 275); + this.Lowerarmleft.setRotationPoint(1.01F, 8.0F, -2.0F); + this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.0F, 0.0F); + this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); + this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); + this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); + this.Shoulderleft_1.setRotationPoint(-6.0F, 8.0F, 6.0F); + this.Shoulderleft_1.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); + this.Wingfinger1right = new ModelRenderer(this, 350, 200); + this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); + this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); + this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); + this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); + this.RightFoot = new ModelRenderer(this, 260, 255); + this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); + this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); + this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); + this.Winglowerarmright = new ModelRenderer(this, 400, 215); + this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); + this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); + this.Righttoelowerright = new ModelRenderer(this, 290, 270); + this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); + this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Rightleg = new ModelRenderer(this, 260, 275); + this.Rightleg.setRotationPoint(1.0F, 14.6F, 0.0F); + this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.22759093446006054F, 0.136659280431156F); + this.Tooth5 = new ModelRenderer(this, 180, 500); + this.Tooth5.setRotationPoint(0.5F, 5.0F, -11.0F); + this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); + this.Spiketop17 = new ModelRenderer(this, 300, 460); + this.Spiketop17.setRotationPoint(0.0F, 3.5F, 2.0F); + this.Spiketop17.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop17, -0.18203784098300857F, 0.0F, 0.0F); + this.Spiketop18 = new ModelRenderer(this, 300, 460); + this.Spiketop18.setRotationPoint(0.0F, 2.5F, 7.0F); + this.Spiketop18.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.Outertoeleft = new ModelRenderer(this, 305, 280); + this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.22759093446006054F, 0.40980330836826856F); + this.Wingfinger2right = new ModelRenderer(this, 330, 150); + this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); + this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); + this.Tooth8 = new ModelRenderer(this, 180, 500); + this.Tooth8.setRotationPoint(-2.8F, 5.0F, -7.0F); + this.Tooth8.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth8, 0.045553093477052F, -0.045553093477052F, 0.31869712141416456F); + this.Spikebase4 = new ModelRenderer(this, 280, 440); + this.Spikebase4.setRotationPoint(0.0F, -2.0F, 25.0F); + this.Spikebase4.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 4, 0.0F); + this.setRotateAngle(Spikebase4, -0.8651597102135892F, 0.0F, 0.0F); + this.Spikebase5 = new ModelRenderer(this, 280, 440); + this.Spikebase5.setRotationPoint(0.0F, 3.0F, 4.5F); + this.Spikebase5.addBox(-1.0F, -7.0F, 0.0F, 2, 7, 4, 0.0F); + this.setRotateAngle(Spikebase5, -0.18203784098300857F, 0.0F, 0.0F); + this.LTailSpike = new ModelRenderer(this, 350, 300); + this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); + this.Clawrighthandmid = new ModelRenderer(this, 200, 260); + this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Tooth9 = new ModelRenderer(this, 180, 500); + this.Tooth9.setRotationPoint(-2.7F, 5.0F, -9.1F); + this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); + this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); + this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); + this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); + this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); + this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); + this.Spiketop2 = new ModelRenderer(this, 300, 460); + this.Spiketop2.setRotationPoint(0.0F, 1.0F, -12.5F); + this.Spiketop2.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(Spiketop2, -0.22759093446006054F, 0.0F, 0.0F); + this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerleft.setRotationPoint(1.6F, 0.0F, -2.0F); + this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 8, 0.0F); + this.setRotateAngle(Headlargehornlowerleft, 0.18203784098300857F, 0.22759093446006054F, 0.36425021489121656F); + this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); + this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); + this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); + this.Tail4 = new ModelRenderer(this, 5, 300); + this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); + this.setRotateAngle(Tail4, 0.22759093446006054F, 0.0F, 0.0F); + this.Tail3 = new ModelRenderer(this, 5, 335); + this.Tail3.setRotationPoint(0.0F, 1.0F, 24.0F); + this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); + this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); + this.Wingupperarmright = new ModelRenderer(this, 390, 230); + this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); + this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); + this.Outertoelowerleft = new ModelRenderer(this, 305, 270); + this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); + this.Spkebase3 = new ModelRenderer(this, 280, 440); + this.Spkebase3.setRotationPoint(0.0F, 0.0F, 11.5F); + this.Spkebase3.addBox(-1.0F, -7.0F, 2.0F, 2, 7, 4, 0.0F); + this.setRotateAngle(Spkebase3, -0.7285004297824331F, 0.0F, 0.0F); + this.Wingshoulderleft = new ModelRenderer(this, 470, 230); + this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 12.0F); + this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); + this.Wingfinger2left = new ModelRenderer(this, 330, 150); + this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); + this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); + this.Lefthip = new ModelRenderer(this, 260, 300); + this.Lefthip.setRotationPoint(6.0F, 3.0F, 15.0F); + this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Lefthip, -0.27314402793711257F, 0.27314402793711257F, -0.18203784098300857F); + this.Righthandmidfinger = new ModelRenderer(this, 220, 260); + this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); + this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); + this.Righthandleftfinger = new ModelRenderer(this, 220, 260); + this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); + this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); + this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerleft.setRotationPoint(3.0F, 2.0F, -4.0F); + this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Headmidhornlowerleft, -0.136659280431156F, 0.5462880558742251F, 0.0F); + this.Tail6 = new ModelRenderer(this, 5, 275); + this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); + this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); + this.setRotateAngle(Tail6, 0.27314402793711257F, 0.0F, 0.0F); + this.Lefttoeright = new ModelRenderer(this, 290, 280); + this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); + this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); + this.Spiketop13 = new ModelRenderer(this, 300, 460); + this.Spiketop13.setRotationPoint(0.0F, 1.9F, 17.0F); + this.Spiketop13.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(Spiketop13, -0.27314402793711257F, 0.0F, 0.0F); + this.Tooth7 = new ModelRenderer(this, 180, 500); + this.Tooth7.setRotationPoint(-2.8F, 5.0F, -5.2F); + this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); + this.Spikebase2 = new ModelRenderer(this, 280, 440); + this.Spikebase2.setRotationPoint(0.0F, 0.0F, 7.0F); + this.Spikebase2.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 4, 0.0F); + this.setRotateAngle(Spikebase2, -0.4553564018453205F, 0.0F, 0.0F); + this.Smallheadhornright1 = new ModelRenderer(this, 190, 420); + this.Smallheadhornright1.setRotationPoint(-0.4F, 0.0F, -1.0F); + this.Smallheadhornright1.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornright1, 0.18203784098300857F, -0.22759093446006054F, -0.18203784098300857F); + this.Wingmembramemidright = new ModelRenderer(this, 350, 320); + this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); + this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); + this.shape16 = new ModelRenderer(this, 5, 415); + this.shape16.setRotationPoint(0.0F, 18.0F, 2.0F); + this.shape16.addBox(-6.5F, -10.0F, 0.0F, 13, 10, 30, 0.0F); + this.setRotateAngle(shape16, -0.31869712141416456F, 0.0F, 0.0F); + this.Neckbase = new ModelRenderer(this, 120, 470); + this.Neckbase.setRotationPoint(0.0F, 4.0F, 8.0F); + this.Neckbase.addBox(-6.0F, 0.0F, -14.0F, 12, 14, 14, 0.0F); + this.setRotateAngle(Neckbase, -0.4553564018453205F, 0.0F, 0.0F); + this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); + this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); + this.Spiketop10 = new ModelRenderer(this, 300, 460); + this.Spiketop10.setRotationPoint(0.0F, 1.0F, 25.0F); + this.Spiketop10.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop10, -0.31869712141416456F, 0.0F, 0.0F); + this.RightLeg = new ModelRenderer(this, 260, 275); + this.RightLeg.setRotationPoint(-1.0F, 14.6F, 0.0F); + this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.23911010752322312F, -0.091106186954104F); + this.Lefttoemid = new ModelRenderer(this, 290, 280); + this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); + this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.Spikebase7 = new ModelRenderer(this, 300, 440); + this.Spikebase7.setRotationPoint(0.0F, 1.0F, 18.5F); + this.Spikebase7.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Spikebase7, -0.27314402793711257F, 0.0F, 0.0F); + this.Clawlefthandleft = new ModelRenderer(this, 200, 260); + this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); + this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); + this.Spiketop19 = new ModelRenderer(this, 300, 460); + this.Spiketop19.setRotationPoint(0.0F, 5.0F, 11.0F); + this.Spiketop19.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + // Grouping + this.RightFoot.addChild(this.Righttoeleft); + this.Spikebase4.addChild(this.Spiketop6); + this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); + this.Spikebase2.addChild(this.Spiketop4); + this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); + this.Neckmid.addChild(this.Spiketop1); + this.Headback.addChild(this.Snout); + this.Lowerarmleft.addChild(this.Thumbtoeupperleft); + this.Rightleg.addChild(this.Rightfoot); + this.Headback.addChild(this.Smallheadhornleft1); + this.Wingfinger1left.addChild(this.Wingfinger3left); + this.Snout.addChild(this.Tooth10); + this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); + this.RightFoot.addChild(this.Righttoeright); + this.Headback.addChild(this.Headmidhornlowerright); + this.Tail1.addChild(this.Spikebase6); + this.Outertoelowerright.addChild(this.Outertoelowerright_1); + this.Tail4.addChild(this.Spiketop14); + this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); + this.Spikebase1.addChild(this.Spiketop3); + this.Wingfinger1right.addChild(this.Wingfinger3right); + this.Snout.addChild(this.Tooth1); + this.Lefttoeleft.addChild(this.Lefttoelowerleft); + this.Smallheadhornright2.addChild(this.Smallheadhornright3); + this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); + this.Tail1.addChild(this.Righthip); + this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); + this.Tail3.addChild(this.Spiketop12); + this.Headmidhornlowerright.addChild(this.Headmidhornupperright); + this.Snout.addChild(this.Tooth6); + this.Wingfinger3left.addChild(this.Wingfingerlower3left); + this.Lowerarmleft.addChild(this.Lefthandmidfinger); + this.Tail4.addChild(this.Spiketop15); + this.Shoulderleft_1.addChild(this.Lowerarmleft_1); + this.Headback.addChild(this.Headlargehornlowerright); + this.Body.addChild(this.Wingshoulderright); + this.Tail3.addChild(this.Spiketop11); + this.Righthandrightfinger.addChild(this.Clawrighthandright); + this.Lefttoemid.addChild(this.Lefttoelowermid); + this.Headback.addChild(this.Smallheadhornleft2); + this.Lefthandrightfinger.addChild(this.Clawlefthandright); + this.Spikebase6.addChild(this.Spiketop8); + this.RTailSpike.addChild(this.RTailMembrane); + this.Lowerarmleft_1.addChild(this.Righthandrightfinger); + this.Winglowerarmleft.addChild(this.Wingmembramemidleft); + this.Body.addChild(this.Tail1); + this.Headback.addChild(this.Smallheadhornright2); + this.Spkebase3.addChild(this.Spiketop5); + this.Lefttoeright.addChild(this.Lefttoelowerright); + this.Wingfinger1right.addChild(this.Wingmembramelargeright); + this.Spikebase7.addChild(this.Spiketop9); + this.Wingupperarmleft.addChild(this.Winglowerarmleft); + this.Tail7.addChild(this.Tail8); + this.Snout.addChild(this.Tooth4); + this.Wingfinger1left.addChild(this.Wingfingerlower1left); + this.Tail8.addChild(this.RTailSpike); + this.RightFoot.addChild(this.Outertoelowerright); + this.Winglowerarmleft.addChild(this.Wingfinger1left); + this.Lefthandmidfinger.addChild(this.Clawlefthandmid); + this.Righttoeleft.addChild(this.Righttoelowerleft); + this.Body.addChild(this.Shoulderleft); + this.Wingshoulderleft.addChild(this.Wingupperarmleft); + this.LTailSpike.addChild(this.LTailMembrane); + this.Snout.addChild(this.Tooth3); + this.Snout.addChild(this.Tooth2); + this.Neckmid.addChild(this.Neckend); + this.Tail4.addChild(this.Spiketop16); + this.Headlargehornlowerright.addChild(this.Headlargehornupperright); + this.Righttoemid.addChild(this.Righttoelowermid); + this.Neckbase.addChild(this.Neckmid); + this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); + this.Tail6.addChild(this.Tail7); + this.Body.addChild(this.Spikebase1); + this.RightFoot.addChild(this.Righttoemid); + this.Rightfoot.addChild(this.Lefttoeleft); + this.Righthandleftfinger.addChild(this.Clawrighthandleft); + this.Spikebase5.addChild(this.Spiketop7); + this.Neckend.addChild(this.Headback); + this.Headback.addChild(this.Lowerjaw); + this.Shoulderleft.addChild(this.Lowerarmleft); + this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); + this.Body.addChild(this.Shoulderleft_1); + this.Winglowerarmright.addChild(this.Wingfinger1right); + this.Wingfinger2right.addChild(this.Wingfingerlower2right); + this.RightLeg.addChild(this.RightFoot); + this.Wingfinger2left.addChild(this.Wingfingerlower2left); + this.Wingupperarmright.addChild(this.Winglowerarmright); + this.Righttoeright.addChild(this.Righttoelowerright); + this.Lefthip.addChild(this.Rightleg); + this.Snout.addChild(this.Tooth5); + this.Tail6.addChild(this.Spiketop17); + this.Tail6.addChild(this.Spiketop18); + this.Rightfoot.addChild(this.Outertoeleft); + this.Wingfinger1right.addChild(this.Wingfinger2right); + this.Snout.addChild(this.Tooth8); + this.Body.addChild(this.Spikebase4); + this.Tail1.addChild(this.Spikebase5); + this.Tail8.addChild(this.LTailSpike); + this.Righthandmidfinger.addChild(this.Clawrighthandmid); + this.Snout.addChild(this.Tooth9); + this.Wingfinger1right.addChild(this.Wingfingerlower1right); + this.Wingupperarmright.addChild(this.Wingmembramesmallright); + this.Neckbase.addChild(this.Spiketop2); + this.Headback.addChild(this.Headlargehornlowerleft); + this.Wingfinger1left.addChild(this.Wingmembramelargeleft); + this.Wingfinger3right.addChild(this.Wingfingerlower3right); + this.Tail3.addChild(this.Tail4); + this.Tail1.addChild(this.Tail3); + this.Wingshoulderright.addChild(this.Wingupperarmright); + this.Outertoeleft.addChild(this.Outertoelowerleft); + this.Body.addChild(this.Spkebase3); + this.Body.addChild(this.Wingshoulderleft); + this.Wingfinger1left.addChild(this.Wingfinger2left); + this.Tail1.addChild(this.Lefthip); + this.Lowerarmleft_1.addChild(this.Righthandmidfinger); + this.Lowerarmleft_1.addChild(this.Righthandleftfinger); + this.Headback.addChild(this.Headmidhornlowerleft); + this.Tail4.addChild(this.Tail6); + this.Rightfoot.addChild(this.Lefttoeright); + this.Tail3.addChild(this.Spiketop13); + this.Snout.addChild(this.Tooth7); + this.Body.addChild(this.Spikebase2); + this.Headback.addChild(this.Smallheadhornright1); + this.Winglowerarmright.addChild(this.Wingmembramemidright); + this.Body.addChild(this.shape16); + this.Body.addChild(this.Neckbase); + this.Lowerarmleft.addChild(this.Lefthandrightfinger); + this.Tail1.addChild(this.Spiketop10); + this.Righthip.addChild(this.RightLeg); + this.Rightfoot.addChild(this.Lefttoemid); + this.Tail1.addChild(this.Spikebase7); + this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); + this.Tail6.addChild(this.Spiketop19); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } - public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, float head4) - { - super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); - float wingFlap = (float) Math.toRadians(dragon.wingFlap()); - float jawAngle = (float)Math.toRadians(dragon.getJawMove()); - float neckAngle = -(float)Math.toRadians(4.5F * dragon.getNeckAngle()); - - this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; - this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); - - this.Lowerjaw.rotateAngleX = -0.045553093477052F - jawAngle; - //this.Tail1.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - //this.Tail3.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - //this.Tail4.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - - if (!dragon.isTerrestrial()) //Fly - { - if(!dragon.onGround) - { - float angle = (float) Math.toRadians(dragon.getVertTailAngle()); - this.Body.rotateAngleX = 0.546F - angle; - } - else - { - this.Body.rotateAngleX = 0.5462880558742251F; - } - - if(dragon.motionY < -0.01F)//Glide - { - wingFlap = 0; - } - else if (dragon.motionX == 0 && dragon.motionZ == 0) //Hover - { - wingFlap = (float) Math.toRadians(dragon.wingFlap()); - } - else - { - wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;//Move - } - this.Wingshoulderright.rotateAngleZ = (float) (wingFlap*0.75F); - this.Wingshoulderleft.rotateAngleZ = (float) -(wingFlap*0.75F); - this.Wingupperarmright.rotateAngleZ = (float) (wingFlap*0.25F); - this.Wingupperarmleft.rotateAngleZ = (float) -(wingFlap*0.25F); - - } - else //Walk - { - this.Body.rotateAngleX = 0.5462880558742251F; - this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); - this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); - // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); - //this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); - - this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - } - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); + this.Body.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, + float head4) { + super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); + float wingFlap = (float) Math.toRadians(dragon.wingFlap()); + float jawAngle = (float) Math.toRadians(dragon.getJawMove()); + float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); + + this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; + this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); + + this.Lowerjaw.rotateAngleX = -0.045553093477052F - jawAngle; + // this.Tail1.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail3.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail4.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + + if (!dragon.isTerrestrial()) // Fly + { + if (!dragon.onGround) { + float angle = (float) Math.toRadians(dragon.getVertTailAngle()); + this.Body.rotateAngleX = 0.546F - angle; + } else { + this.Body.rotateAngleX = 0.5462880558742251F; + } + + if (dragon.motionY < -0.01F)// Glide + { + wingFlap = 0; + } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover + { + wingFlap = (float) Math.toRadians(dragon.wingFlap()); + } else { + wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move + } + this.Wingshoulderright.rotateAngleZ = wingFlap * 0.75F; + this.Wingshoulderleft.rotateAngleZ = -(wingFlap * 0.75F); + this.Wingupperarmright.rotateAngleZ = wingFlap * 0.25F; + this.Wingupperarmleft.rotateAngleZ = -(wingFlap * 0.25F); + + } else // Walk + { + this.Body.rotateAngleX = 0.5462880558742251F; + this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); + this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); + // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); + // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); + + this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelFrostDragon.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelFrostDragon.java index e9ff53dd..6551c188 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelFrostDragon.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelFrostDragon.java @@ -6,1005 +6,999 @@ import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; -public class ModelFrostDragon extends ModelBase -{ +public class ModelFrostDragon extends ModelBase { public ModelRenderer Body; - public ModelRenderer Tail1; - public ModelRenderer Neckbase; - public ModelRenderer Belly1; - public ModelRenderer Wingshoulderleft; - public ModelRenderer Shoulderleft; - public ModelRenderer Shoulderleft_1; - public ModelRenderer Spikebase1; - public ModelRenderer Spikebase2; - public ModelRenderer Spkebase3; - public ModelRenderer Spikebase4; - public ModelRenderer Wingshoulderright; - public ModelRenderer Tail3; - public ModelRenderer Righthip; - public ModelRenderer Lefthip; - public ModelRenderer Spikebase5; - public ModelRenderer Spikebase6; - public ModelRenderer Spikebase7; - public ModelRenderer Spiketop10; - public ModelRenderer Tail4; - public ModelRenderer Spiketop11; - public ModelRenderer Spiketop12; - public ModelRenderer Spiketop13; - public ModelRenderer Tail6; - public ModelRenderer Spiketop14; - public ModelRenderer Spiketop15; - public ModelRenderer Spiketop16; - public ModelRenderer Tail7; - public ModelRenderer Spiketop17; - public ModelRenderer Spiketop18; - public ModelRenderer Spiketop19; - public ModelRenderer Tail8; - public ModelRenderer LTailSpike; - public ModelRenderer RTailSpike; - public ModelRenderer LTailMembrane; - public ModelRenderer RTailMembrane; - public ModelRenderer RightLeg; - public ModelRenderer RightFoot; - public ModelRenderer Righttoemid; - public ModelRenderer Righttoeleft; - public ModelRenderer Righttoeright; - public ModelRenderer Outertoelowerright; - public ModelRenderer Righttoelowermid; - public ModelRenderer Righttoelowerleft; - public ModelRenderer Righttoelowerright; - public ModelRenderer Outertoelowerright_1; - public ModelRenderer Rightleg; - public ModelRenderer Rightfoot; - public ModelRenderer Lefttoemid; - public ModelRenderer Lefttoeright; - public ModelRenderer Lefttoeleft; - public ModelRenderer Outertoeleft; - public ModelRenderer Lefttoelowermid; - public ModelRenderer Lefttoelowerright; - public ModelRenderer Lefttoelowerleft; - public ModelRenderer Outertoelowerleft; - public ModelRenderer Spiketop7; - public ModelRenderer Spiketop8; - public ModelRenderer Spiketop9; - public ModelRenderer Neckmid; - public ModelRenderer Spiketop2; - public ModelRenderer Neckend; - public ModelRenderer Spiketop1; - public ModelRenderer Headback; - public ModelRenderer Snout; - public ModelRenderer Headlargehornlowerleft; - public ModelRenderer Headlargehornlowerright; - public ModelRenderer Smallheadhornleft2; - public ModelRenderer Smallheadhornright2; - public ModelRenderer Headmidhornlowerleft; - public ModelRenderer Headmidhornlowerright; - public ModelRenderer Mouthback_MOVE_THIS_TO_OPEN_MOUTH; - public ModelRenderer Tooth5; - public ModelRenderer Tooth4; - public ModelRenderer Tooth3; - public ModelRenderer Tooth2; - public ModelRenderer Tooth1; - public ModelRenderer Tooth6; - public ModelRenderer Tooth7; - public ModelRenderer Tooth8; - public ModelRenderer Tooth9; - public ModelRenderer Tooth10; - public ModelRenderer shape159; - public ModelRenderer Headlargehornupperleft; - public ModelRenderer Smallheadhornleft1; - public ModelRenderer Headlargehornupperright; - public ModelRenderer Smallheadhornright1; - public ModelRenderer Smallheadhornleft3; - public ModelRenderer Smallheadhornright3; - public ModelRenderer Headmidhornupperleft; - public ModelRenderer Headmidhornupperright; - public ModelRenderer Lowerjawback; - public ModelRenderer Lowerjaw; - public ModelRenderer Smallheadhornright3_1; - public ModelRenderer Smallheadhornleft3_1; - public ModelRenderer Underlowerjaw2; - public ModelRenderer Underlowerjaw; - public ModelRenderer Tooth17; - public ModelRenderer Tooth13; - public ModelRenderer Tooth16; - public ModelRenderer Tooth12; - public ModelRenderer Tooth18; - public ModelRenderer Tooth14; - public ModelRenderer Tooth15; - public ModelRenderer Tooth11; - public ModelRenderer Underlowerjaw3; - public ModelRenderer Wingupperarmleft; - public ModelRenderer Winglowerarmleft; - public ModelRenderer Wingmembramesmallleft; - public ModelRenderer Wingfinger1left; - public ModelRenderer Wingmembramemidleft; - public ModelRenderer Wingfingerlower1left; - public ModelRenderer Wingfinger2left; - public ModelRenderer Wingfinger3left; - public ModelRenderer Wingmembramelargeleft; - public ModelRenderer Wingfingerlower2left; - public ModelRenderer Wingfingerlower3left; - public ModelRenderer Lowerarmleft; - public ModelRenderer Lefthandrightfinger; - public ModelRenderer Lefthandmidfinger; - public ModelRenderer Lefthandrightfinger_1; - public ModelRenderer Thumbtoeupperleft; - public ModelRenderer Clawlefthandright; - public ModelRenderer Clawlefthandmid; - public ModelRenderer Clawlefthandleft; - public ModelRenderer Thumbtoelowerleft; - public ModelRenderer Lowerarmleft_1; - public ModelRenderer Righthandleftfinger; - public ModelRenderer Righthandmidfinger; - public ModelRenderer Righthandrightfinger; - public ModelRenderer Thumbtoeupperright; - public ModelRenderer Clawrighthandleft; - public ModelRenderer Clawrighthandmid; - public ModelRenderer Clawrighthandright; - public ModelRenderer Thumbtoelowerright; - public ModelRenderer Spiketop3; - public ModelRenderer Spiketop4; - public ModelRenderer Spiketop5; - public ModelRenderer Spiketop6; - public ModelRenderer Wingupperarmright; - public ModelRenderer Winglowerarmright; - public ModelRenderer Wingmembramesmallright; - public ModelRenderer Wingfinger1right; - public ModelRenderer Wingmembramemidright; - public ModelRenderer Wingfinger2right; - public ModelRenderer Wingfinger3right; - public ModelRenderer Wingfingerlower1right; - public ModelRenderer Wingmembramelargeright; - public ModelRenderer Wingfingerlower2right; - public ModelRenderer Wingfingerlower3right; + public ModelRenderer Tail1; + public ModelRenderer Neckbase; + public ModelRenderer Belly1; + public ModelRenderer Wingshoulderleft; + public ModelRenderer Shoulderleft; + public ModelRenderer Shoulderleft_1; + public ModelRenderer Spikebase1; + public ModelRenderer Spikebase2; + public ModelRenderer Spkebase3; + public ModelRenderer Spikebase4; + public ModelRenderer Wingshoulderright; + public ModelRenderer Tail3; + public ModelRenderer Righthip; + public ModelRenderer Lefthip; + public ModelRenderer Spikebase5; + public ModelRenderer Spikebase6; + public ModelRenderer Spikebase7; + public ModelRenderer Spiketop10; + public ModelRenderer Tail4; + public ModelRenderer Spiketop11; + public ModelRenderer Spiketop12; + public ModelRenderer Spiketop13; + public ModelRenderer Tail6; + public ModelRenderer Spiketop14; + public ModelRenderer Spiketop15; + public ModelRenderer Spiketop16; + public ModelRenderer Tail7; + public ModelRenderer Spiketop17; + public ModelRenderer Spiketop18; + public ModelRenderer Spiketop19; + public ModelRenderer Tail8; + public ModelRenderer LTailSpike; + public ModelRenderer RTailSpike; + public ModelRenderer LTailMembrane; + public ModelRenderer RTailMembrane; + public ModelRenderer RightLeg; + public ModelRenderer RightFoot; + public ModelRenderer Righttoemid; + public ModelRenderer Righttoeleft; + public ModelRenderer Righttoeright; + public ModelRenderer Outertoelowerright; + public ModelRenderer Righttoelowermid; + public ModelRenderer Righttoelowerleft; + public ModelRenderer Righttoelowerright; + public ModelRenderer Outertoelowerright_1; + public ModelRenderer Rightleg; + public ModelRenderer Rightfoot; + public ModelRenderer Lefttoemid; + public ModelRenderer Lefttoeright; + public ModelRenderer Lefttoeleft; + public ModelRenderer Outertoeleft; + public ModelRenderer Lefttoelowermid; + public ModelRenderer Lefttoelowerright; + public ModelRenderer Lefttoelowerleft; + public ModelRenderer Outertoelowerleft; + public ModelRenderer Spiketop7; + public ModelRenderer Spiketop8; + public ModelRenderer Spiketop9; + public ModelRenderer Neckmid; + public ModelRenderer Spiketop2; + public ModelRenderer Neckend; + public ModelRenderer Spiketop1; + public ModelRenderer Headback; + public ModelRenderer Snout; + public ModelRenderer Headlargehornlowerleft; + public ModelRenderer Headlargehornlowerright; + public ModelRenderer Smallheadhornleft2; + public ModelRenderer Smallheadhornright2; + public ModelRenderer Headmidhornlowerleft; + public ModelRenderer Headmidhornlowerright; + public ModelRenderer Mouthback_MOVE_THIS_TO_OPEN_MOUTH; + public ModelRenderer Tooth5; + public ModelRenderer Tooth4; + public ModelRenderer Tooth3; + public ModelRenderer Tooth2; + public ModelRenderer Tooth1; + public ModelRenderer Tooth6; + public ModelRenderer Tooth7; + public ModelRenderer Tooth8; + public ModelRenderer Tooth9; + public ModelRenderer Tooth10; + public ModelRenderer shape159; + public ModelRenderer Headlargehornupperleft; + public ModelRenderer Smallheadhornleft1; + public ModelRenderer Headlargehornupperright; + public ModelRenderer Smallheadhornright1; + public ModelRenderer Smallheadhornleft3; + public ModelRenderer Smallheadhornright3; + public ModelRenderer Headmidhornupperleft; + public ModelRenderer Headmidhornupperright; + public ModelRenderer Lowerjawback; + public ModelRenderer Lowerjaw; + public ModelRenderer Smallheadhornright3_1; + public ModelRenderer Smallheadhornleft3_1; + public ModelRenderer Underlowerjaw2; + public ModelRenderer Underlowerjaw; + public ModelRenderer Tooth17; + public ModelRenderer Tooth13; + public ModelRenderer Tooth16; + public ModelRenderer Tooth12; + public ModelRenderer Tooth18; + public ModelRenderer Tooth14; + public ModelRenderer Tooth15; + public ModelRenderer Tooth11; + public ModelRenderer Underlowerjaw3; + public ModelRenderer Wingupperarmleft; + public ModelRenderer Winglowerarmleft; + public ModelRenderer Wingmembramesmallleft; + public ModelRenderer Wingfinger1left; + public ModelRenderer Wingmembramemidleft; + public ModelRenderer Wingfingerlower1left; + public ModelRenderer Wingfinger2left; + public ModelRenderer Wingfinger3left; + public ModelRenderer Wingmembramelargeleft; + public ModelRenderer Wingfingerlower2left; + public ModelRenderer Wingfingerlower3left; + public ModelRenderer Lowerarmleft; + public ModelRenderer Lefthandrightfinger; + public ModelRenderer Lefthandmidfinger; + public ModelRenderer Lefthandrightfinger_1; + public ModelRenderer Thumbtoeupperleft; + public ModelRenderer Clawlefthandright; + public ModelRenderer Clawlefthandmid; + public ModelRenderer Clawlefthandleft; + public ModelRenderer Thumbtoelowerleft; + public ModelRenderer Lowerarmleft_1; + public ModelRenderer Righthandleftfinger; + public ModelRenderer Righthandmidfinger; + public ModelRenderer Righthandrightfinger; + public ModelRenderer Thumbtoeupperright; + public ModelRenderer Clawrighthandleft; + public ModelRenderer Clawrighthandmid; + public ModelRenderer Clawrighthandright; + public ModelRenderer Thumbtoelowerright; + public ModelRenderer Spiketop3; + public ModelRenderer Spiketop4; + public ModelRenderer Spiketop5; + public ModelRenderer Spiketop6; + public ModelRenderer Wingupperarmright; + public ModelRenderer Winglowerarmright; + public ModelRenderer Wingmembramesmallright; + public ModelRenderer Wingfinger1right; + public ModelRenderer Wingmembramemidright; + public ModelRenderer Wingfinger2right; + public ModelRenderer Wingfinger3right; + public ModelRenderer Wingfingerlower1right; + public ModelRenderer Wingmembramelargeright; + public ModelRenderer Wingfingerlower2right; + public ModelRenderer Wingfingerlower3right; - public ModelFrostDragon() - { - this.textureWidth = 512; - this.textureHeight = 512; - this.Tooth13 = new ModelRenderer(this, 180, 500); - this.Tooth13.setRotationPoint(2.5F, 0.6F, -7.5F); - this.Tooth13.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth13, 0.0F, 0.0F, 0.22759093446006054F); - this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornright3.setRotationPoint(1.0F, 1.0F, 0.0F); - this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Smallheadhornright3, -0.27314402793711257F, 0.0F, 0.0F); - this.Headmidhornupperright = new ModelRenderer(this, 190, 430); - this.Headmidhornupperright.setRotationPoint(-1.0F, 0.1F, 5.9F); - this.Headmidhornupperright.addBox(0.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); - this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.31869712141416456F, 0.0F); - this.Spikebase4 = new ModelRenderer(this, 280, 440); - this.Spikebase4.setRotationPoint(0.0F, -2.0F, 25.0F); - this.Spikebase4.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 4, 0.0F); - this.setRotateAngle(Spikebase4, -0.8651597102135892F, 0.0F, 0.0F); - this.Spiketop16 = new ModelRenderer(this, 300, 460); - this.Spiketop16.setRotationPoint(0.0F, 1.5F, 14.0F); - this.Spiketop16.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop16, -0.091106186954104F, 0.0F, 0.0F); - this.Righttoelowerleft = new ModelRenderer(this, 290, 270); - this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); - this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.Underlowerjaw2 = new ModelRenderer(this, 160, 340); - this.Underlowerjaw2.setRotationPoint(0.0F, 4.0F, -3.0F); - this.Underlowerjaw2.addBox(-2.0F, -1.0F, -4.0F, 4, 1, 4, 0.0F); - this.setRotateAngle(Underlowerjaw2, -0.22759093446006054F, 0.0F, 0.0F); - this.Spiketop10 = new ModelRenderer(this, 300, 460); - this.Spiketop10.setRotationPoint(0.0F, 0.0F, 25.0F); - this.Spiketop10.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); - this.setRotateAngle(Spiketop10, -0.31869712141416456F, 0.0F, 0.0F); - this.Clawrighthandright = new ModelRenderer(this, 200, 260); - this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); - this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); - this.Rightleg = new ModelRenderer(this, 260, 275); - this.Rightleg.mirror = true; - this.Rightleg.setRotationPoint(1.0F, 14.6F, 0.0F); - this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.22759093446006054F, 0.136659280431156F); - this.Righthip = new ModelRenderer(this, 260, 300); - this.Righthip.setRotationPoint(-5.5F, 3.0F, 15.0F); - this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Righthip, -0.27314402793711257F, -0.27314402793711257F, 0.18203784098300857F); - this.Tooth10 = new ModelRenderer(this, 180, 500); - this.Tooth10.setRotationPoint(-2.7F, 4.8F, -9.7F); - this.Tooth10.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth10, 0.6829473363053812F, -1.9123572614101867F, -0.31869712141416456F); - this.Tooth3 = new ModelRenderer(this, 180, 500); - this.Tooth3.setRotationPoint(2.7F, 5.0F, -8.1F); - this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); - this.Shoulderleft = new ModelRenderer(this, 220, 300); - this.Shoulderleft.mirror = true; - this.Shoulderleft.setRotationPoint(8.0F, 8.0F, 6.0F); - this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); - this.Outertoeleft = new ModelRenderer(this, 305, 280); - this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.22759093446006054F, 0.40980330836826856F); - this.Spikebase1 = new ModelRenderer(this, 300, 440); - this.Spikebase1.setRotationPoint(0.0F, 0.0F, 1.0F); - this.Spikebase1.addBox(-1.0F, -3.0F, 0.0F, 2, 3, 3, 0.0F); - this.setRotateAngle(Spikebase1, -0.4553564018453205F, 0.0F, 0.0F); - this.Tooth12 = new ModelRenderer(this, 180, 500); - this.Tooth12.setRotationPoint(2.5F, 0.4F, -4.5F); - this.Tooth12.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth12, 0.0F, 0.0F, 0.22759093446006054F); - this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); - this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); - this.Tooth8 = new ModelRenderer(this, 180, 500); - this.Tooth8.setRotationPoint(-2.8F, 5.0F, -5.5F); - this.Tooth8.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth8, 0.045553093477052F, -0.045553093477052F, 0.31869712141416456F); - this.Tooth18 = new ModelRenderer(this, 180, 500); - this.Tooth18.setRotationPoint(-2.5F, 0.6F, -10.0F); - this.Tooth18.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth18, 0.22759093446006054F, 0.0F, -0.22759093446006054F); - this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); - this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); - this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerright.setRotationPoint(-1.6F, 0.0F, -3.0F); - this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornlowerright, 0.18203784098300857F, -0.27314402793711257F, -0.36425021489121656F); - this.Tooth16 = new ModelRenderer(this, 180, 500); - this.Tooth16.setRotationPoint(-2.5F, 0.4F, -4.5F); - this.Tooth16.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth16, 0.0F, 0.0F, -0.22759093446006054F); - this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); - this.Headlargehornupperleft.setRotationPoint(1.1F, 0.1F, 4.7F); - this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornupperleft, 0.0F, -0.7285004297824331F, 0.0F); - this.Spiketop7 = new ModelRenderer(this, 300, 460); - this.Spiketop7.setRotationPoint(0.0F, -5.0F, 0.1F); - this.Spiketop7.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop7, -0.136659280431156F, 0.0F, 0.0F); - this.Snout = new ModelRenderer(this, 120, 365); - this.Snout.setRotationPoint(0.0F, 0.61F, -10.0F); - this.Snout.addBox(-3.0F, 0.0F, -10.0F, 6, 6, 10, 0.0F); - this.setRotateAngle(Snout, -0.091106186954104F, 0.0F, 0.015533430342749534F); - this.Lefttoeleft = new ModelRenderer(this, 290, 280); - this.Lefttoeleft.mirror = true; - this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); - this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); - this.Lefttoeright = new ModelRenderer(this, 290, 280); - this.Lefttoeright.mirror = true; - this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); - this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); - this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); - this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); - this.Smallheadhornright1 = new ModelRenderer(this, 190, 420); - this.Smallheadhornright1.setRotationPoint(0.0F, 0.1F, 6.0F); - this.Smallheadhornright1.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornright1, 0.0F, -0.5009094953223726F, 0.0F); - this.Wingmembramesmallleft = new ModelRenderer(this, 420, 280); - this.Wingmembramesmallleft.mirror = true; - this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); - this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); - this.Smallheadhornright3_1 = new ModelRenderer(this, 190, 410); - this.Smallheadhornright3_1.setRotationPoint(-2.0F, -2.4F, -1.5F); - this.Smallheadhornright3_1.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); - this.setRotateAngle(Smallheadhornright3_1, -0.6373942428283291F, -0.4553564018453205F, 0.0F); - this.Winglowerarmright = new ModelRenderer(this, 400, 215); - this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); - this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); - this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger_1.mirror = true; - this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); - this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); - this.Tail3 = new ModelRenderer(this, 5, 335); - this.Tail3.setRotationPoint(0.0F, 1.0F, 24.0F); - this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); - this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); - this.Smallheadhornleft3_1 = new ModelRenderer(this, 190, 410); - this.Smallheadhornleft3_1.setRotationPoint(2.0F, -2.4F, -2.5F); - this.Smallheadhornleft3_1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); - this.setRotateAngle(Smallheadhornleft3_1, -0.6373942428283291F, 0.4553564018453205F, 0.0F); - this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); - this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); - this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); - this.RTailMembrane = new ModelRenderer(this, 381, 270); - this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); - this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); - this.Wingshoulderleft = new ModelRenderer(this, 470, 230); - this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 4.0F); - this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); - this.Neckbase = new ModelRenderer(this, 120, 470); - this.Neckbase.setRotationPoint(0.0F, 4.0F, 8.0F); - this.Neckbase.addBox(-6.0F, 0.0F, -14.0F, 12, 14, 14, 0.0F); - this.setRotateAngle(Neckbase, -0.4553564018453205F, 0.0F, 0.0F); - this.Spiketop4 = new ModelRenderer(this, 300, 460); - this.Spiketop4.setRotationPoint(0.0F, -2.0F, 0.1F); - this.Spiketop4.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop4, -0.27314402793711257F, 0.0F, 0.0F); - this.Clawlefthandmid = new ModelRenderer(this, 200, 260); - this.Clawlefthandmid.mirror = true; - this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Body = new ModelRenderer(this, 6, 460); - this.Body.setRotationPoint(0.0F, -3.0F, -16.0F); - this.Body.addBox(-8.0F, 0.0F, 0.0F, 16, 18, 23, 0.0F); - this.setRotateAngle(Body, 0.5462880558742251F, 0.0F, 0.0F); - this.Tooth9 = new ModelRenderer(this, 180, 500); - this.Tooth9.setRotationPoint(-2.7F, 5.0F, -8.1F); - this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); - this.Wingfinger3right = new ModelRenderer(this, 390, 170); - this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); - this.Wingfinger1left = new ModelRenderer(this, 350, 200); - this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); - this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); - this.Tooth15 = new ModelRenderer(this, 180, 500); - this.Tooth15.setRotationPoint(-2.5F, 0.6F, -1.3F); - this.Tooth15.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth15, 0.0F, 0.0F, -0.22759093446006054F); - this.Neckmid = new ModelRenderer(this, 120, 445); - this.Neckmid.setRotationPoint(0.0F, 1.0F, -12.0F); - this.Neckmid.addBox(-4.5F, 0.0F, -9.0F, 9, 11, 12, 0.0F); - this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Tooth17 = new ModelRenderer(this, 180, 500); - this.Tooth17.setRotationPoint(-2.5F, 0.6F, -7.5F); - this.Tooth17.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth17, 0.0F, 0.0F, -0.22759093446006054F); - this.RightFoot = new ModelRenderer(this, 260, 255); - this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); - this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Spiketop13 = new ModelRenderer(this, 300, 460); - this.Spiketop13.setRotationPoint(0.0F, 1.9F, 17.0F); - this.Spiketop13.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(Spiketop13, -0.27314402793711257F, 0.0F, 0.0F); - this.Tooth2 = new ModelRenderer(this, 180, 500); - this.Tooth2.setRotationPoint(2.8F, 5.0F, -5.5F); - this.Tooth2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth2, -0.045553093477052F, 0.045553093477052F, -0.31869712141416456F); - this.Tail8 = new ModelRenderer(this, 5, 220); - this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); - this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); - this.LTailMembrane = new ModelRenderer(this, 380, 250); - this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); - this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); - this.Righttoemid = new ModelRenderer(this, 290, 280); - this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); - this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.Righthandrightfinger = new ModelRenderer(this, 220, 260); - this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); - this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); - this.Tail1 = new ModelRenderer(this, 5, 370); - this.Tail1.setRotationPoint(0.0F, 1.0F, 23.0F); - this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); - this.setRotateAngle(Tail1, -0.6829473363053812F, 0.0F, 0.0F); - this.Tooth11 = new ModelRenderer(this, 180, 500); - this.Tooth11.setRotationPoint(2.5F, 0.6F, -1.3F); - this.Tooth11.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth11, 0.0F, 0.0F, 0.22759093446006054F); - this.Tail4 = new ModelRenderer(this, 5, 300); - this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); - this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); - this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerright.setRotationPoint(-3.0F, 2.0F, -3.8F); - this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headmidhornlowerright, -0.136659280431156F, -0.5462880558742251F, 0.0F); - this.Spiketop1 = new ModelRenderer(this, 300, 460); - this.Spiketop1.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Spiketop1.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop1, -0.091106186954104F, 0.0F, 0.0F); - this.Headlargehornupperright = new ModelRenderer(this, 190, 470); - this.Headlargehornupperright.setRotationPoint(-1.1F, 0.1F, 4.7F); - this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornupperright, 0.0F, 0.7285004297824331F, 0.0F); - this.Wingupperarmright = new ModelRenderer(this, 390, 230); - this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); - this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); - this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); - this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); - this.Clawrighthandleft = new ModelRenderer(this, 200, 260); - this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); - this.Rightfoot = new ModelRenderer(this, 260, 255); - this.Rightfoot.mirror = true; - this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); - this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); - this.Lowerarmleft_1.setRotationPoint(-3.01F, 8.5F, 0.0F); - this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, 0.0F, 0.0F); - this.Tooth1 = new ModelRenderer(this, 180, 500); - this.Tooth1.setRotationPoint(2.8F, 5.0F, -3.2F); - this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); - this.LTailSpike = new ModelRenderer(this, 350, 300); - this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); - this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); - this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Wingfinger2right = new ModelRenderer(this, 330, 150); - this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); - this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); - this.Righttoelowerright = new ModelRenderer(this, 290, 270); - this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); - this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Outertoelowerleft = new ModelRenderer(this, 305, 270); - this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); - this.Spikebase5 = new ModelRenderer(this, 280, 440); - this.Spikebase5.setRotationPoint(0.0F, 2.5F, 5.3F); - this.Spikebase5.addBox(-1.0F, -7.0F, 0.0F, 2, 7, 4, 0.0F); - this.setRotateAngle(Spikebase5, -0.18203784098300857F, 0.0F, 0.0F); - this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); - this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); - this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); - this.Neckend = new ModelRenderer(this, 120, 420); - this.Neckend.setRotationPoint(0.0F, -0.9F, -8.5F); - this.Neckend.addBox(-3.5F, 1.0F, -10.0F, 7, 9, 10, 0.0F); - this.setRotateAngle(Neckend, 0.27314402793711257F, 0.0F, 0.0F); - this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerleft.setRotationPoint(3.0F, 2.0F, -3.8F); - this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headmidhornlowerleft, -0.136659280431156F, 0.5462880558742251F, 0.0F); - this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornleft3.setRotationPoint(-1.0F, 1.0F, 0.0F); - this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Smallheadhornleft3, -0.27314402793711257F, 0.0F, 0.0F); - this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornright2.setRotationPoint(-4.0F, 5.0F, -3.0F); - this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); - this.Wingfinger1right = new ModelRenderer(this, 350, 200); - this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); - this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); - this.Spiketop17 = new ModelRenderer(this, 300, 460); - this.Spiketop17.setRotationPoint(0.0F, 1.5F, 2.0F); - this.Spiketop17.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop17, -0.18203784098300857F, 0.0F, 0.0F); - this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); - this.Headmidhornupperleft.setRotationPoint(1.0F, 0.1F, 5.9F); - this.Headmidhornupperleft.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); - this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.31869712141416456F, 0.0F); - this.Spiketop15 = new ModelRenderer(this, 300, 460); - this.Spiketop15.setRotationPoint(0.0F, 2.6F, 9.0F); - this.Spiketop15.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); - this.setRotateAngle(Spiketop15, -0.18203784098300857F, 0.0F, 0.0F); - this.Outertoelowerright = new ModelRenderer(this, 320, 280); - this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); - this.Headback = new ModelRenderer(this, 120, 390); - this.Headback.setRotationPoint(-0.01F, 0.6F, -9.0F); - this.Headback.addBox(-4.0F, 0.0F, -11.0F, 8, 7, 11, 0.0F); - this.setRotateAngle(Headback, 0.27314402793711257F, 0.0F, 0.0F); - this.Lowerarmleft = new ModelRenderer(this, 220, 275); - this.Lowerarmleft.mirror = true; - this.Lowerarmleft.setRotationPoint(1.01F, 8.5F, 0.0F); - this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.0F, 0.0F); - this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); - this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); - this.Wingshoulderright = new ModelRenderer(this, 470, 230); - this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 4.0F); - this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); - this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); - this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); - this.Spiketop12 = new ModelRenderer(this, 300, 460); - this.Spiketop12.setRotationPoint(0.0F, 0.5F, 12.0F); - this.Spiketop12.addBox(-0.5F, -11.0F, 0.0F, 1, 11, 2, 0.0F); - this.setRotateAngle(Spiketop12, -0.36425021489121656F, 0.0F, 0.0F); - this.Righthandmidfinger = new ModelRenderer(this, 220, 260); - this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); - this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); - this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); - this.Shoulderleft_1.setRotationPoint(-6.0F, 8.0F, 6.0F); - this.Shoulderleft_1.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); - this.Lefttoemid = new ModelRenderer(this, 290, 280); - this.Lefttoemid.mirror = true; - this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); - this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.RightLeg = new ModelRenderer(this, 260, 275); - this.RightLeg.setRotationPoint(-1.0F, 14.6F, 0.0F); - this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.23911010752322312F, -0.091106186954104F); - this.Spiketop9 = new ModelRenderer(this, 300, 460); - this.Spiketop9.setRotationPoint(0.0F, -1.5F, 0.1F); - this.Spiketop9.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); - this.setRotateAngle(Spiketop9, -0.045553093477052F, 0.0F, 0.0F); - this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); - this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); - this.Spiketop11 = new ModelRenderer(this, 300, 460); - this.Spiketop11.setRotationPoint(0.0F, 0.5F, 8.0F); - this.Spiketop11.addBox(-0.5F, -12.0F, -1.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop11, -0.36425021489121656F, 0.0F, 0.0F); - this.Tooth6 = new ModelRenderer(this, 180, 500); - this.Tooth6.setRotationPoint(-0.5F, 5.0F, -9.0F); - this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); - this.Righttoeright = new ModelRenderer(this, 290, 280); - this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); - this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); - this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); - this.Lefttoelowerleft.mirror = true; - this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); - this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); - this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); - this.Lowerjaw = new ModelRenderer(this, 120, 345); - this.Lowerjaw.setRotationPoint(0.0F, -0.05F, -6.7F); - this.Lowerjaw.addBox(-2.5F, 0.0F, -10.0F, 5, 2, 10, 0.0F); - this.setRotateAngle(Lowerjaw, 0.045553093477052F, 0.0F, 0.0F); - this.Spiketop18 = new ModelRenderer(this, 300, 460); - this.Spiketop18.setRotationPoint(0.0F, 1.5F, 7.0F); - this.Spiketop18.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.Belly1 = new ModelRenderer(this, 5, 415); - this.Belly1.setRotationPoint(0.0F, 18.0F, 2.0F); - this.Belly1.addBox(-6.5F, -10.0F, 0.0F, 13, 10, 30, 0.0F); - this.setRotateAngle(Belly1, -0.22759093446006054F, 0.0F, 0.0F); - this.Tooth5 = new ModelRenderer(this, 180, 500); - this.Tooth5.setRotationPoint(0.5F, 5.0F, -9.0F); - this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); - this.Spikebase6 = new ModelRenderer(this, 300, 440); - this.Spikebase6.setRotationPoint(0.0F, 0.5F, 12.0F); - this.Spikebase6.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Spikebase6, -0.27314402793711257F, 0.0F, 0.0F); - this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); - this.Lefthandmidfinger.mirror = true; - this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); - this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); - this.Lefttoelowermid = new ModelRenderer(this, 290, 270); - this.Lefttoelowermid.mirror = true; - this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); - this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Underlowerjaw3 = new ModelRenderer(this, 160, 325); - this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Underlowerjaw3.addBox(-2.0F, -3.0F, 0.0F, 4, 3, 6, 0.0F); - this.setRotateAngle(Underlowerjaw3, 0.4553564018453205F, 0.0F, 0.0F); - this.Tooth4 = new ModelRenderer(this, 180, 500); - this.Tooth4.setRotationPoint(2.6F, 4.8F, -9.7F); - this.Tooth4.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth4, 0.6829473363053812F, 1.8668041679331349F, 0.31869712141416456F); - this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH = new ModelRenderer(this, 120, 320); - this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.setRotationPoint(0.0F, 6.0F, -4.0F); - this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.addBox(-2.5F, 0.0F, -5.0F, 5, 3, 6, 0.0F); - this.setRotateAngle(Mouthback_MOVE_THIS_TO_OPEN_MOUTH, 0F, 0.0F, 0.0F); - this.Spikebase2 = new ModelRenderer(this, 280, 440); - this.Spikebase2.setRotationPoint(0.0F, 0.0F, 7.0F); - this.Spikebase2.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 4, 0.0F); - this.setRotateAngle(Spikebase2, -0.4553564018453205F, 0.0F, 0.0F); - this.Spiketop14 = new ModelRenderer(this, 300, 460); - this.Spiketop14.setRotationPoint(0.0F, 1.0F, 4.5F); - this.Spiketop14.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(Spiketop14, -0.27314402793711257F, 0.0F, 0.0F); - this.shape159 = new ModelRenderer(this, 0, 0); - this.shape159.setRotationPoint(0.0F, 0.0F, 0.0F); - this.shape159.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F); - this.Wingmembramemidright = new ModelRenderer(this, 350, 340); - this.Wingmembramemidright.mirror = true; - this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); - this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); - this.Lefttoelowerright = new ModelRenderer(this, 290, 270); - this.Lefttoelowerright.mirror = true; - this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); - this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Clawlefthandleft = new ModelRenderer(this, 200, 260); - this.Clawlefthandleft.mirror = true; - this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); - this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); - this.Spiketop2 = new ModelRenderer(this, 300, 460); - this.Spiketop2.setRotationPoint(0.0F, 1.0F, -12.5F); - this.Spiketop2.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(Spiketop2, -0.22759093446006054F, 0.0F, 0.0F); - this.Wingmembramelargeright = new ModelRenderer(this, 270, 365); - this.Wingmembramelargeright.mirror = true; - this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Spiketop5 = new ModelRenderer(this, 300, 460); - this.Spiketop5.setRotationPoint(0.0F, -7.0F, 2.1F); - this.Spiketop5.addBox(-0.5F, -15.0F, 0.0F, 1, 15, 2, 0.0F); - this.setRotateAngle(Spiketop5, -0.136659280431156F, 0.0F, 0.0F); - this.Winglowerarmleft = new ModelRenderer(this, 400, 215); - this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); - this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); - this.Clawrighthandmid = new ModelRenderer(this, 200, 260); - this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Spiketop19 = new ModelRenderer(this, 300, 460); - this.Spiketop19.setRotationPoint(0.0F, 3.0F, 11.0F); - this.Spiketop19.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); - this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); - this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); - this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); - this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerleft.setRotationPoint(1.6F, 0.0F, -3.0F); - this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornlowerleft, 0.18203784098300857F, 0.27314402793711257F, 0.36425021489121656F); - this.Wingfinger3left = new ModelRenderer(this, 390, 170); - this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); - this.RTailSpike = new ModelRenderer(this, 350, 300); - this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); - this.Tail7 = new ModelRenderer(this, 5, 240); - this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); - this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); - this.setRotateAngle(Tail7, 0.136659280431156F, 0.0F, 0.0F); - this.Lowerjawback = new ModelRenderer(this, 120, 330); - this.Lowerjawback.setRotationPoint(0.0F, 0.5F, 1.0F); - this.Lowerjawback.addBox(-3.0F, 0.0F, -7.0F, 6, 3, 7, 0.0F); - this.setRotateAngle(Lowerjawback, 0.31869712141416456F, 0.0F, 0.0F); - this.Tooth14 = new ModelRenderer(this, 180, 500); - this.Tooth14.setRotationPoint(2.5F, 0.5F, -10.0F); - this.Tooth14.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth14, 0.22759093446006054F, 0.0F, 0.22759093446006054F); - this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger.mirror = true; - this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); - this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); - this.Clawlefthandright = new ModelRenderer(this, 200, 260); - this.Clawlefthandright.mirror = true; - this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); - this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); - this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); - this.Spikebase7 = new ModelRenderer(this, 300, 440); - this.Spikebase7.setRotationPoint(0.0F, 0.0F, 18.5F); - this.Spikebase7.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Spikebase7, -0.27314402793711257F, 0.0F, 0.0F); - this.Lefthip = new ModelRenderer(this, 260, 300); - this.Lefthip.mirror = true; - this.Lefthip.setRotationPoint(5.5F, 3.0F, 15.0F); - this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Lefthip, -0.27314402793711257F, 0.27314402793711257F, -0.18203784098300857F); - this.Righttoeleft = new ModelRenderer(this, 290, 280); - this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); - this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); - this.Wingfinger2left = new ModelRenderer(this, 330, 150); - this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); - this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); - this.Spiketop3 = new ModelRenderer(this, 300, 460); - this.Spiketop3.setRotationPoint(0.0F, -3.0F, 0.1F); - this.Spiketop3.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop3, -0.22759093446006054F, 0.0F, 0.0F); - this.Underlowerjaw = new ModelRenderer(this, 160, 350); - this.Underlowerjaw.setRotationPoint(0.0F, 3.0F, -7.0F); - this.Underlowerjaw.addBox(-1.5F, -1.0F, -8.0F, 3, 1, 8, 0.0F); - this.setRotateAngle(Underlowerjaw, -0.091106186954104F, 0.0F, 0.0F); - this.Tooth7 = new ModelRenderer(this, 180, 500); - this.Tooth7.setRotationPoint(-2.8F, 5.0F, -3.2F); - this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); - this.Spkebase3 = new ModelRenderer(this, 280, 440); - this.Spkebase3.setRotationPoint(0.0F, 0.0F, 11.5F); - this.Spkebase3.addBox(-1.0F, -7.0F, 2.0F, 2, 7, 4, 0.0F); - this.setRotateAngle(Spkebase3, -0.7285004297824331F, 0.0F, 0.0F); - this.Tail6 = new ModelRenderer(this, 5, 275); - this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); - this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); - this.setRotateAngle(Tail6, 0.091106186954104F, 0.0F, 0.0F); - this.Righthandleftfinger = new ModelRenderer(this, 220, 260); - this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); - this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); - this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornleft2.setRotationPoint(4.0F, 5.0F, -3.0F); - this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); - this.Righttoelowermid = new ModelRenderer(this, 290, 270); - this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); - this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Smallheadhornleft1 = new ModelRenderer(this, 190, 420); - this.Smallheadhornleft1.setRotationPoint(0.0F, 0.0F, 6.0F); - this.Smallheadhornleft1.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornleft1, 0.0F, 0.5009094953223726F, 0.0F); - this.Spiketop6 = new ModelRenderer(this, 300, 460); - this.Spiketop6.setRotationPoint(0.0F, 1.0F, 0.1F); - this.Spiketop6.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop6, -0.136659280431156F, 0.0F, 0.0F); - this.Wingupperarmleft = new ModelRenderer(this, 390, 230); - this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); - this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); - this.Spiketop8 = new ModelRenderer(this, 300, 460); - this.Spiketop8.setRotationPoint(0.0F, -5.0F, 0.1F); - this.Spiketop8.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop8, -0.045553093477052F, 0.0F, 0.0F); - this.Lowerjaw.addChild(this.Tooth13); - this.Smallheadhornright2.addChild(this.Smallheadhornright3); - this.Headmidhornlowerright.addChild(this.Headmidhornupperright); - this.Body.addChild(this.Spikebase4); - this.Tail4.addChild(this.Spiketop16); - this.Righttoeleft.addChild(this.Righttoelowerleft); - this.Lowerjawback.addChild(this.Underlowerjaw2); - this.Tail1.addChild(this.Spiketop10); - this.Righthandrightfinger.addChild(this.Clawrighthandright); - this.Lefthip.addChild(this.Rightleg); - this.Tail1.addChild(this.Righthip); - this.Snout.addChild(this.Tooth10); - this.Snout.addChild(this.Tooth3); - this.Body.addChild(this.Shoulderleft); - this.Rightfoot.addChild(this.Outertoeleft); - this.Body.addChild(this.Spikebase1); - this.Lowerjaw.addChild(this.Tooth12); - this.Wingfinger2right.addChild(this.Wingfingerlower2right); - this.Snout.addChild(this.Tooth8); - this.Lowerjaw.addChild(this.Tooth18); - this.Lowerarmleft.addChild(this.Thumbtoeupperleft); - this.Headback.addChild(this.Headlargehornlowerright); - this.Lowerjaw.addChild(this.Tooth16); - this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); - this.Spikebase5.addChild(this.Spiketop7); - this.Headback.addChild(this.Snout); - this.Rightfoot.addChild(this.Lefttoeleft); - this.Rightfoot.addChild(this.Lefttoeright); - this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); - this.Headlargehornupperright.addChild(this.Smallheadhornright1); - this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); - this.Lowerjawback.addChild(this.Smallheadhornright3_1); - this.Wingupperarmright.addChild(this.Winglowerarmright); - this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); - this.Tail1.addChild(this.Tail3); - this.Lowerjawback.addChild(this.Smallheadhornleft3_1); - this.Wingupperarmright.addChild(this.Wingmembramesmallright); - this.RTailSpike.addChild(this.RTailMembrane); - this.Body.addChild(this.Wingshoulderleft); - this.Body.addChild(this.Neckbase); - this.Spikebase2.addChild(this.Spiketop4); - this.Lefthandmidfinger.addChild(this.Clawlefthandmid); - this.Snout.addChild(this.Tooth9); - this.Wingfinger1right.addChild(this.Wingfinger3right); - this.Winglowerarmleft.addChild(this.Wingfinger1left); - this.Lowerjaw.addChild(this.Tooth15); - this.Neckbase.addChild(this.Neckmid); - this.Lowerjaw.addChild(this.Tooth17); - this.RightLeg.addChild(this.RightFoot); - this.Tail3.addChild(this.Spiketop13); - this.Snout.addChild(this.Tooth2); - this.Tail7.addChild(this.Tail8); - this.LTailSpike.addChild(this.LTailMembrane); - this.RightFoot.addChild(this.Righttoemid); - this.Lowerarmleft_1.addChild(this.Righthandrightfinger); - this.Body.addChild(this.Tail1); - this.Lowerjaw.addChild(this.Tooth11); - this.Tail3.addChild(this.Tail4); - this.Headback.addChild(this.Headmidhornlowerright); - this.Neckmid.addChild(this.Spiketop1); - this.Headlargehornlowerright.addChild(this.Headlargehornupperright); - this.Wingshoulderright.addChild(this.Wingupperarmright); - this.Wingfinger2left.addChild(this.Wingfingerlower2left); - this.Righthandleftfinger.addChild(this.Clawrighthandleft); - this.Rightleg.addChild(this.Rightfoot); - this.Shoulderleft_1.addChild(this.Lowerarmleft_1); - this.Snout.addChild(this.Tooth1); - this.Tail8.addChild(this.LTailSpike); - this.Wingfinger1left.addChild(this.Wingmembramelargeleft); - this.Wingfinger1right.addChild(this.Wingfinger2right); - this.Righttoeright.addChild(this.Righttoelowerright); - this.Outertoeleft.addChild(this.Outertoelowerleft); - this.Tail1.addChild(this.Spikebase5); - this.Winglowerarmleft.addChild(this.Wingmembramemidleft); - this.Neckmid.addChild(this.Neckend); - this.Headback.addChild(this.Headmidhornlowerleft); - this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); - this.Headback.addChild(this.Smallheadhornright2); - this.Winglowerarmright.addChild(this.Wingfinger1right); - this.Tail6.addChild(this.Spiketop17); - this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); - this.Tail4.addChild(this.Spiketop15); - this.RightFoot.addChild(this.Outertoelowerright); - this.Neckend.addChild(this.Headback); - this.Shoulderleft.addChild(this.Lowerarmleft); - this.Wingfinger3right.addChild(this.Wingfingerlower3right); - this.Body.addChild(this.Wingshoulderright); - this.Wingfinger1left.addChild(this.Wingfingerlower1left); - this.Tail3.addChild(this.Spiketop12); - this.Lowerarmleft_1.addChild(this.Righthandmidfinger); - this.Body.addChild(this.Shoulderleft_1); - this.Rightfoot.addChild(this.Lefttoemid); - this.Righthip.addChild(this.RightLeg); - this.Spikebase7.addChild(this.Spiketop9); - this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); - this.Tail3.addChild(this.Spiketop11); - this.Snout.addChild(this.Tooth6); - this.RightFoot.addChild(this.Righttoeright); - this.Lefttoeleft.addChild(this.Lefttoelowerleft); - this.Wingfinger1right.addChild(this.Wingfingerlower1right); - this.Lowerjawback.addChild(this.Lowerjaw); - this.Tail6.addChild(this.Spiketop18); - this.Body.addChild(this.Belly1); - this.Snout.addChild(this.Tooth5); - this.Tail1.addChild(this.Spikebase6); - this.Lowerarmleft.addChild(this.Lefthandmidfinger); - this.Lefttoemid.addChild(this.Lefttoelowermid); - this.Underlowerjaw2.addChild(this.Underlowerjaw3); - this.Snout.addChild(this.Tooth4); - this.Headback.addChild(this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH); - this.Body.addChild(this.Spikebase2); - this.Tail4.addChild(this.Spiketop14); - this.Snout.addChild(this.shape159); - this.Winglowerarmright.addChild(this.Wingmembramemidright); - this.Lefttoeright.addChild(this.Lefttoelowerright); - this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); - this.Neckbase.addChild(this.Spiketop2); - this.Wingfinger1right.addChild(this.Wingmembramelargeright); - this.Spkebase3.addChild(this.Spiketop5); - this.Wingupperarmleft.addChild(this.Winglowerarmleft); - this.Righthandmidfinger.addChild(this.Clawrighthandmid); - this.Tail6.addChild(this.Spiketop19); - this.Outertoelowerright.addChild(this.Outertoelowerright_1); - this.Wingfinger3left.addChild(this.Wingfingerlower3left); - this.Headback.addChild(this.Headlargehornlowerleft); - this.Wingfinger1left.addChild(this.Wingfinger3left); - this.Tail8.addChild(this.RTailSpike); - this.Tail6.addChild(this.Tail7); - this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.addChild(this.Lowerjawback); - this.Lowerjaw.addChild(this.Tooth14); - this.Lowerarmleft.addChild(this.Lefthandrightfinger); - this.Lefthandrightfinger.addChild(this.Clawlefthandright); - this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); - this.Tail1.addChild(this.Spikebase7); - this.Tail1.addChild(this.Lefthip); - this.RightFoot.addChild(this.Righttoeleft); - this.Wingfinger1left.addChild(this.Wingfinger2left); - this.Spikebase1.addChild(this.Spiketop3); - this.Lowerjawback.addChild(this.Underlowerjaw); - this.Snout.addChild(this.Tooth7); - this.Body.addChild(this.Spkebase3); - this.Tail4.addChild(this.Tail6); - this.Lowerarmleft_1.addChild(this.Righthandleftfinger); - this.Headback.addChild(this.Smallheadhornleft2); - this.Righttoemid.addChild(this.Righttoelowermid); - this.Headlargehornupperleft.addChild(this.Smallheadhornleft1); - this.Spikebase4.addChild(this.Spiketop6); - this.Wingshoulderleft.addChild(this.Wingupperarmleft); - this.Spikebase6.addChild(this.Spiketop8); - } - public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) - { - modelRenderer.rotateAngleX = x; - modelRenderer.rotateAngleY = y; - modelRenderer.rotateAngleZ = z; - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); - this.Body.render(f5); - } + public ModelFrostDragon() { + this.textureWidth = 512; + this.textureHeight = 512; + this.Tooth13 = new ModelRenderer(this, 180, 500); + this.Tooth13.setRotationPoint(2.5F, 0.6F, -7.5F); + this.Tooth13.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth13, 0.0F, 0.0F, 0.22759093446006054F); + this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornright3.setRotationPoint(1.0F, 1.0F, 0.0F); + this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Smallheadhornright3, -0.27314402793711257F, 0.0F, 0.0F); + this.Headmidhornupperright = new ModelRenderer(this, 190, 430); + this.Headmidhornupperright.setRotationPoint(-1.0F, 0.1F, 5.9F); + this.Headmidhornupperright.addBox(0.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); + this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.31869712141416456F, 0.0F); + this.Spikebase4 = new ModelRenderer(this, 280, 440); + this.Spikebase4.setRotationPoint(0.0F, -2.0F, 25.0F); + this.Spikebase4.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 4, 0.0F); + this.setRotateAngle(Spikebase4, -0.8651597102135892F, 0.0F, 0.0F); + this.Spiketop16 = new ModelRenderer(this, 300, 460); + this.Spiketop16.setRotationPoint(0.0F, 1.5F, 14.0F); + this.Spiketop16.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop16, -0.091106186954104F, 0.0F, 0.0F); + this.Righttoelowerleft = new ModelRenderer(this, 290, 270); + this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); + this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.Underlowerjaw2 = new ModelRenderer(this, 160, 340); + this.Underlowerjaw2.setRotationPoint(0.0F, 4.0F, -3.0F); + this.Underlowerjaw2.addBox(-2.0F, -1.0F, -4.0F, 4, 1, 4, 0.0F); + this.setRotateAngle(Underlowerjaw2, -0.22759093446006054F, 0.0F, 0.0F); + this.Spiketop10 = new ModelRenderer(this, 300, 460); + this.Spiketop10.setRotationPoint(0.0F, 0.0F, 25.0F); + this.Spiketop10.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); + this.setRotateAngle(Spiketop10, -0.31869712141416456F, 0.0F, 0.0F); + this.Clawrighthandright = new ModelRenderer(this, 200, 260); + this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); + this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); + this.Rightleg = new ModelRenderer(this, 260, 275); + this.Rightleg.mirror = true; + this.Rightleg.setRotationPoint(1.0F, 14.6F, 0.0F); + this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.22759093446006054F, 0.136659280431156F); + this.Righthip = new ModelRenderer(this, 260, 300); + this.Righthip.setRotationPoint(-5.5F, 3.0F, 15.0F); + this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Righthip, -0.27314402793711257F, -0.27314402793711257F, 0.18203784098300857F); + this.Tooth10 = new ModelRenderer(this, 180, 500); + this.Tooth10.setRotationPoint(-2.7F, 4.8F, -9.7F); + this.Tooth10.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth10, 0.6829473363053812F, -1.9123572614101867F, -0.31869712141416456F); + this.Tooth3 = new ModelRenderer(this, 180, 500); + this.Tooth3.setRotationPoint(2.7F, 5.0F, -8.1F); + this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); + this.Shoulderleft = new ModelRenderer(this, 220, 300); + this.Shoulderleft.mirror = true; + this.Shoulderleft.setRotationPoint(8.0F, 8.0F, 6.0F); + this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); + this.Outertoeleft = new ModelRenderer(this, 305, 280); + this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.22759093446006054F, 0.40980330836826856F); + this.Spikebase1 = new ModelRenderer(this, 300, 440); + this.Spikebase1.setRotationPoint(0.0F, 0.0F, 1.0F); + this.Spikebase1.addBox(-1.0F, -3.0F, 0.0F, 2, 3, 3, 0.0F); + this.setRotateAngle(Spikebase1, -0.4553564018453205F, 0.0F, 0.0F); + this.Tooth12 = new ModelRenderer(this, 180, 500); + this.Tooth12.setRotationPoint(2.5F, 0.4F, -4.5F); + this.Tooth12.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth12, 0.0F, 0.0F, 0.22759093446006054F); + this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); + this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); + this.Tooth8 = new ModelRenderer(this, 180, 500); + this.Tooth8.setRotationPoint(-2.8F, 5.0F, -5.5F); + this.Tooth8.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth8, 0.045553093477052F, -0.045553093477052F, 0.31869712141416456F); + this.Tooth18 = new ModelRenderer(this, 180, 500); + this.Tooth18.setRotationPoint(-2.5F, 0.6F, -10.0F); + this.Tooth18.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth18, 0.22759093446006054F, 0.0F, -0.22759093446006054F); + this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); + this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); + this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerright.setRotationPoint(-1.6F, 0.0F, -3.0F); + this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornlowerright, 0.18203784098300857F, -0.27314402793711257F, + -0.36425021489121656F); + this.Tooth16 = new ModelRenderer(this, 180, 500); + this.Tooth16.setRotationPoint(-2.5F, 0.4F, -4.5F); + this.Tooth16.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth16, 0.0F, 0.0F, -0.22759093446006054F); + this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); + this.Headlargehornupperleft.setRotationPoint(1.1F, 0.1F, 4.7F); + this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornupperleft, 0.0F, -0.7285004297824331F, 0.0F); + this.Spiketop7 = new ModelRenderer(this, 300, 460); + this.Spiketop7.setRotationPoint(0.0F, -5.0F, 0.1F); + this.Spiketop7.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop7, -0.136659280431156F, 0.0F, 0.0F); + this.Snout = new ModelRenderer(this, 120, 365); + this.Snout.setRotationPoint(0.0F, 0.61F, -10.0F); + this.Snout.addBox(-3.0F, 0.0F, -10.0F, 6, 6, 10, 0.0F); + this.setRotateAngle(Snout, -0.091106186954104F, 0.0F, 0.015533430342749534F); + this.Lefttoeleft = new ModelRenderer(this, 290, 280); + this.Lefttoeleft.mirror = true; + this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); + this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); + this.Lefttoeright = new ModelRenderer(this, 290, 280); + this.Lefttoeright.mirror = true; + this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); + this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); + this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); + this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); + this.Smallheadhornright1 = new ModelRenderer(this, 190, 420); + this.Smallheadhornright1.setRotationPoint(0.0F, 0.1F, 6.0F); + this.Smallheadhornright1.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornright1, 0.0F, -0.5009094953223726F, 0.0F); + this.Wingmembramesmallleft = new ModelRenderer(this, 420, 280); + this.Wingmembramesmallleft.mirror = true; + this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); + this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); + this.Smallheadhornright3_1 = new ModelRenderer(this, 190, 410); + this.Smallheadhornright3_1.setRotationPoint(-2.0F, -2.4F, -1.5F); + this.Smallheadhornright3_1.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(Smallheadhornright3_1, -0.6373942428283291F, -0.4553564018453205F, 0.0F); + this.Winglowerarmright = new ModelRenderer(this, 400, 215); + this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); + this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); + this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger_1.mirror = true; + this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); + this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); + this.Tail3 = new ModelRenderer(this, 5, 335); + this.Tail3.setRotationPoint(0.0F, 1.0F, 24.0F); + this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); + this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); + this.Smallheadhornleft3_1 = new ModelRenderer(this, 190, 410); + this.Smallheadhornleft3_1.setRotationPoint(2.0F, -2.4F, -2.5F); + this.Smallheadhornleft3_1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(Smallheadhornleft3_1, -0.6373942428283291F, 0.4553564018453205F, 0.0F); + this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); + this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); + this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); + this.RTailMembrane = new ModelRenderer(this, 381, 270); + this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); + this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); + this.Wingshoulderleft = new ModelRenderer(this, 470, 230); + this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 4.0F); + this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); + this.Neckbase = new ModelRenderer(this, 120, 470); + this.Neckbase.setRotationPoint(0.0F, 4.0F, 8.0F); + this.Neckbase.addBox(-6.0F, 0.0F, -14.0F, 12, 14, 14, 0.0F); + this.setRotateAngle(Neckbase, -0.4553564018453205F, 0.0F, 0.0F); + this.Spiketop4 = new ModelRenderer(this, 300, 460); + this.Spiketop4.setRotationPoint(0.0F, -2.0F, 0.1F); + this.Spiketop4.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop4, -0.27314402793711257F, 0.0F, 0.0F); + this.Clawlefthandmid = new ModelRenderer(this, 200, 260); + this.Clawlefthandmid.mirror = true; + this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Body = new ModelRenderer(this, 6, 460); + this.Body.setRotationPoint(0.0F, -3.0F, -16.0F); + this.Body.addBox(-8.0F, 0.0F, 0.0F, 16, 18, 23, 0.0F); + this.setRotateAngle(Body, 0.5462880558742251F, 0.0F, 0.0F); + this.Tooth9 = new ModelRenderer(this, 180, 500); + this.Tooth9.setRotationPoint(-2.7F, 5.0F, -8.1F); + this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); + this.Wingfinger3right = new ModelRenderer(this, 390, 170); + this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); + this.Wingfinger1left = new ModelRenderer(this, 350, 200); + this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); + this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); + this.Tooth15 = new ModelRenderer(this, 180, 500); + this.Tooth15.setRotationPoint(-2.5F, 0.6F, -1.3F); + this.Tooth15.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth15, 0.0F, 0.0F, -0.22759093446006054F); + this.Neckmid = new ModelRenderer(this, 120, 445); + this.Neckmid.setRotationPoint(0.0F, 1.0F, -12.0F); + this.Neckmid.addBox(-4.5F, 0.0F, -9.0F, 9, 11, 12, 0.0F); + this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Tooth17 = new ModelRenderer(this, 180, 500); + this.Tooth17.setRotationPoint(-2.5F, 0.6F, -7.5F); + this.Tooth17.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth17, 0.0F, 0.0F, -0.22759093446006054F); + this.RightFoot = new ModelRenderer(this, 260, 255); + this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); + this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Spiketop13 = new ModelRenderer(this, 300, 460); + this.Spiketop13.setRotationPoint(0.0F, 1.9F, 17.0F); + this.Spiketop13.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(Spiketop13, -0.27314402793711257F, 0.0F, 0.0F); + this.Tooth2 = new ModelRenderer(this, 180, 500); + this.Tooth2.setRotationPoint(2.8F, 5.0F, -5.5F); + this.Tooth2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth2, -0.045553093477052F, 0.045553093477052F, -0.31869712141416456F); + this.Tail8 = new ModelRenderer(this, 5, 220); + this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); + this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); + this.LTailMembrane = new ModelRenderer(this, 380, 250); + this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); + this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); + this.Righttoemid = new ModelRenderer(this, 290, 280); + this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); + this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.Righthandrightfinger = new ModelRenderer(this, 220, 260); + this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); + this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); + this.Tail1 = new ModelRenderer(this, 5, 370); + this.Tail1.setRotationPoint(0.0F, 1.0F, 23.0F); + this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); + this.setRotateAngle(Tail1, -0.6829473363053812F, 0.0F, 0.0F); + this.Tooth11 = new ModelRenderer(this, 180, 500); + this.Tooth11.setRotationPoint(2.5F, 0.6F, -1.3F); + this.Tooth11.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth11, 0.0F, 0.0F, 0.22759093446006054F); + this.Tail4 = new ModelRenderer(this, 5, 300); + this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); + this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); + this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerright.setRotationPoint(-3.0F, 2.0F, -3.8F); + this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headmidhornlowerright, -0.136659280431156F, -0.5462880558742251F, 0.0F); + this.Spiketop1 = new ModelRenderer(this, 300, 460); + this.Spiketop1.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Spiketop1.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop1, -0.091106186954104F, 0.0F, 0.0F); + this.Headlargehornupperright = new ModelRenderer(this, 190, 470); + this.Headlargehornupperright.setRotationPoint(-1.1F, 0.1F, 4.7F); + this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornupperright, 0.0F, 0.7285004297824331F, 0.0F); + this.Wingupperarmright = new ModelRenderer(this, 390, 230); + this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); + this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); + this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); + this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); + this.Clawrighthandleft = new ModelRenderer(this, 200, 260); + this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); + this.Rightfoot = new ModelRenderer(this, 260, 255); + this.Rightfoot.mirror = true; + this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); + this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); + this.Lowerarmleft_1.setRotationPoint(-3.01F, 8.5F, 0.0F); + this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, 0.0F, 0.0F); + this.Tooth1 = new ModelRenderer(this, 180, 500); + this.Tooth1.setRotationPoint(2.8F, 5.0F, -3.2F); + this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); + this.LTailSpike = new ModelRenderer(this, 350, 300); + this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); + this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); + this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Wingfinger2right = new ModelRenderer(this, 330, 150); + this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); + this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); + this.Righttoelowerright = new ModelRenderer(this, 290, 270); + this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); + this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Outertoelowerleft = new ModelRenderer(this, 305, 270); + this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); + this.Spikebase5 = new ModelRenderer(this, 280, 440); + this.Spikebase5.setRotationPoint(0.0F, 2.5F, 5.3F); + this.Spikebase5.addBox(-1.0F, -7.0F, 0.0F, 2, 7, 4, 0.0F); + this.setRotateAngle(Spikebase5, -0.18203784098300857F, 0.0F, 0.0F); + this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); + this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); + this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); + this.Neckend = new ModelRenderer(this, 120, 420); + this.Neckend.setRotationPoint(0.0F, -0.9F, -8.5F); + this.Neckend.addBox(-3.5F, 1.0F, -10.0F, 7, 9, 10, 0.0F); + this.setRotateAngle(Neckend, 0.27314402793711257F, 0.0F, 0.0F); + this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerleft.setRotationPoint(3.0F, 2.0F, -3.8F); + this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headmidhornlowerleft, -0.136659280431156F, 0.5462880558742251F, 0.0F); + this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornleft3.setRotationPoint(-1.0F, 1.0F, 0.0F); + this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Smallheadhornleft3, -0.27314402793711257F, 0.0F, 0.0F); + this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornright2.setRotationPoint(-4.0F, 5.0F, -3.0F); + this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); + this.Wingfinger1right = new ModelRenderer(this, 350, 200); + this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); + this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); + this.Spiketop17 = new ModelRenderer(this, 300, 460); + this.Spiketop17.setRotationPoint(0.0F, 1.5F, 2.0F); + this.Spiketop17.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop17, -0.18203784098300857F, 0.0F, 0.0F); + this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); + this.Headmidhornupperleft.setRotationPoint(1.0F, 0.1F, 5.9F); + this.Headmidhornupperleft.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); + this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.31869712141416456F, 0.0F); + this.Spiketop15 = new ModelRenderer(this, 300, 460); + this.Spiketop15.setRotationPoint(0.0F, 2.6F, 9.0F); + this.Spiketop15.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); + this.setRotateAngle(Spiketop15, -0.18203784098300857F, 0.0F, 0.0F); + this.Outertoelowerright = new ModelRenderer(this, 320, 280); + this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); + this.Headback = new ModelRenderer(this, 120, 390); + this.Headback.setRotationPoint(-0.01F, 0.6F, -9.0F); + this.Headback.addBox(-4.0F, 0.0F, -11.0F, 8, 7, 11, 0.0F); + this.setRotateAngle(Headback, 0.27314402793711257F, 0.0F, 0.0F); + this.Lowerarmleft = new ModelRenderer(this, 220, 275); + this.Lowerarmleft.mirror = true; + this.Lowerarmleft.setRotationPoint(1.01F, 8.5F, 0.0F); + this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.0F, 0.0F); + this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); + this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); + this.Wingshoulderright = new ModelRenderer(this, 470, 230); + this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 4.0F); + this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); + this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); + this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); + this.Spiketop12 = new ModelRenderer(this, 300, 460); + this.Spiketop12.setRotationPoint(0.0F, 0.5F, 12.0F); + this.Spiketop12.addBox(-0.5F, -11.0F, 0.0F, 1, 11, 2, 0.0F); + this.setRotateAngle(Spiketop12, -0.36425021489121656F, 0.0F, 0.0F); + this.Righthandmidfinger = new ModelRenderer(this, 220, 260); + this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); + this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); + this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); + this.Shoulderleft_1.setRotationPoint(-6.0F, 8.0F, 6.0F); + this.Shoulderleft_1.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); + this.Lefttoemid = new ModelRenderer(this, 290, 280); + this.Lefttoemid.mirror = true; + this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); + this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.RightLeg = new ModelRenderer(this, 260, 275); + this.RightLeg.setRotationPoint(-1.0F, 14.6F, 0.0F); + this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.23911010752322312F, -0.091106186954104F); + this.Spiketop9 = new ModelRenderer(this, 300, 460); + this.Spiketop9.setRotationPoint(0.0F, -1.5F, 0.1F); + this.Spiketop9.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); + this.setRotateAngle(Spiketop9, -0.045553093477052F, 0.0F, 0.0F); + this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); + this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); + this.Spiketop11 = new ModelRenderer(this, 300, 460); + this.Spiketop11.setRotationPoint(0.0F, 0.5F, 8.0F); + this.Spiketop11.addBox(-0.5F, -12.0F, -1.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop11, -0.36425021489121656F, 0.0F, 0.0F); + this.Tooth6 = new ModelRenderer(this, 180, 500); + this.Tooth6.setRotationPoint(-0.5F, 5.0F, -9.0F); + this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); + this.Righttoeright = new ModelRenderer(this, 290, 280); + this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); + this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); + this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); + this.Lefttoelowerleft.mirror = true; + this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); + this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); + this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); + this.Lowerjaw = new ModelRenderer(this, 120, 345); + this.Lowerjaw.setRotationPoint(0.0F, -0.05F, -6.7F); + this.Lowerjaw.addBox(-2.5F, 0.0F, -10.0F, 5, 2, 10, 0.0F); + this.setRotateAngle(Lowerjaw, 0.045553093477052F, 0.0F, 0.0F); + this.Spiketop18 = new ModelRenderer(this, 300, 460); + this.Spiketop18.setRotationPoint(0.0F, 1.5F, 7.0F); + this.Spiketop18.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.Belly1 = new ModelRenderer(this, 5, 415); + this.Belly1.setRotationPoint(0.0F, 18.0F, 2.0F); + this.Belly1.addBox(-6.5F, -10.0F, 0.0F, 13, 10, 30, 0.0F); + this.setRotateAngle(Belly1, -0.22759093446006054F, 0.0F, 0.0F); + this.Tooth5 = new ModelRenderer(this, 180, 500); + this.Tooth5.setRotationPoint(0.5F, 5.0F, -9.0F); + this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); + this.Spikebase6 = new ModelRenderer(this, 300, 440); + this.Spikebase6.setRotationPoint(0.0F, 0.5F, 12.0F); + this.Spikebase6.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Spikebase6, -0.27314402793711257F, 0.0F, 0.0F); + this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); + this.Lefthandmidfinger.mirror = true; + this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); + this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); + this.Lefttoelowermid = new ModelRenderer(this, 290, 270); + this.Lefttoelowermid.mirror = true; + this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); + this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Underlowerjaw3 = new ModelRenderer(this, 160, 325); + this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Underlowerjaw3.addBox(-2.0F, -3.0F, 0.0F, 4, 3, 6, 0.0F); + this.setRotateAngle(Underlowerjaw3, 0.4553564018453205F, 0.0F, 0.0F); + this.Tooth4 = new ModelRenderer(this, 180, 500); + this.Tooth4.setRotationPoint(2.6F, 4.8F, -9.7F); + this.Tooth4.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth4, 0.6829473363053812F, 1.8668041679331349F, 0.31869712141416456F); + this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH = new ModelRenderer(this, 120, 320); + this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.setRotationPoint(0.0F, 6.0F, -4.0F); + this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.addBox(-2.5F, 0.0F, -5.0F, 5, 3, 6, 0.0F); + this.setRotateAngle(Mouthback_MOVE_THIS_TO_OPEN_MOUTH, 0F, 0.0F, 0.0F); + this.Spikebase2 = new ModelRenderer(this, 280, 440); + this.Spikebase2.setRotationPoint(0.0F, 0.0F, 7.0F); + this.Spikebase2.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 4, 0.0F); + this.setRotateAngle(Spikebase2, -0.4553564018453205F, 0.0F, 0.0F); + this.Spiketop14 = new ModelRenderer(this, 300, 460); + this.Spiketop14.setRotationPoint(0.0F, 1.0F, 4.5F); + this.Spiketop14.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(Spiketop14, -0.27314402793711257F, 0.0F, 0.0F); + this.shape159 = new ModelRenderer(this, 0, 0); + this.shape159.setRotationPoint(0.0F, 0.0F, 0.0F); + this.shape159.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F); + this.Wingmembramemidright = new ModelRenderer(this, 350, 340); + this.Wingmembramemidright.mirror = true; + this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); + this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); + this.Lefttoelowerright = new ModelRenderer(this, 290, 270); + this.Lefttoelowerright.mirror = true; + this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); + this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Clawlefthandleft = new ModelRenderer(this, 200, 260); + this.Clawlefthandleft.mirror = true; + this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); + this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); + this.Spiketop2 = new ModelRenderer(this, 300, 460); + this.Spiketop2.setRotationPoint(0.0F, 1.0F, -12.5F); + this.Spiketop2.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(Spiketop2, -0.22759093446006054F, 0.0F, 0.0F); + this.Wingmembramelargeright = new ModelRenderer(this, 270, 365); + this.Wingmembramelargeright.mirror = true; + this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Spiketop5 = new ModelRenderer(this, 300, 460); + this.Spiketop5.setRotationPoint(0.0F, -7.0F, 2.1F); + this.Spiketop5.addBox(-0.5F, -15.0F, 0.0F, 1, 15, 2, 0.0F); + this.setRotateAngle(Spiketop5, -0.136659280431156F, 0.0F, 0.0F); + this.Winglowerarmleft = new ModelRenderer(this, 400, 215); + this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); + this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); + this.Clawrighthandmid = new ModelRenderer(this, 200, 260); + this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Spiketop19 = new ModelRenderer(this, 300, 460); + this.Spiketop19.setRotationPoint(0.0F, 3.0F, 11.0F); + this.Spiketop19.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); + this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); + this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); + this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); + this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerleft.setRotationPoint(1.6F, 0.0F, -3.0F); + this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornlowerleft, 0.18203784098300857F, 0.27314402793711257F, 0.36425021489121656F); + this.Wingfinger3left = new ModelRenderer(this, 390, 170); + this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); + this.RTailSpike = new ModelRenderer(this, 350, 300); + this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); + this.Tail7 = new ModelRenderer(this, 5, 240); + this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); + this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); + this.setRotateAngle(Tail7, 0.136659280431156F, 0.0F, 0.0F); + this.Lowerjawback = new ModelRenderer(this, 120, 330); + this.Lowerjawback.setRotationPoint(0.0F, 0.5F, 1.0F); + this.Lowerjawback.addBox(-3.0F, 0.0F, -7.0F, 6, 3, 7, 0.0F); + this.setRotateAngle(Lowerjawback, 0.31869712141416456F, 0.0F, 0.0F); + this.Tooth14 = new ModelRenderer(this, 180, 500); + this.Tooth14.setRotationPoint(2.5F, 0.5F, -10.0F); + this.Tooth14.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth14, 0.22759093446006054F, 0.0F, 0.22759093446006054F); + this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger.mirror = true; + this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); + this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); + this.Clawlefthandright = new ModelRenderer(this, 200, 260); + this.Clawlefthandright.mirror = true; + this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); + this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); + this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); + this.Spikebase7 = new ModelRenderer(this, 300, 440); + this.Spikebase7.setRotationPoint(0.0F, 0.0F, 18.5F); + this.Spikebase7.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Spikebase7, -0.27314402793711257F, 0.0F, 0.0F); + this.Lefthip = new ModelRenderer(this, 260, 300); + this.Lefthip.mirror = true; + this.Lefthip.setRotationPoint(5.5F, 3.0F, 15.0F); + this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Lefthip, -0.27314402793711257F, 0.27314402793711257F, -0.18203784098300857F); + this.Righttoeleft = new ModelRenderer(this, 290, 280); + this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); + this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); + this.Wingfinger2left = new ModelRenderer(this, 330, 150); + this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); + this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); + this.Spiketop3 = new ModelRenderer(this, 300, 460); + this.Spiketop3.setRotationPoint(0.0F, -3.0F, 0.1F); + this.Spiketop3.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop3, -0.22759093446006054F, 0.0F, 0.0F); + this.Underlowerjaw = new ModelRenderer(this, 160, 350); + this.Underlowerjaw.setRotationPoint(0.0F, 3.0F, -7.0F); + this.Underlowerjaw.addBox(-1.5F, -1.0F, -8.0F, 3, 1, 8, 0.0F); + this.setRotateAngle(Underlowerjaw, -0.091106186954104F, 0.0F, 0.0F); + this.Tooth7 = new ModelRenderer(this, 180, 500); + this.Tooth7.setRotationPoint(-2.8F, 5.0F, -3.2F); + this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); + this.Spkebase3 = new ModelRenderer(this, 280, 440); + this.Spkebase3.setRotationPoint(0.0F, 0.0F, 11.5F); + this.Spkebase3.addBox(-1.0F, -7.0F, 2.0F, 2, 7, 4, 0.0F); + this.setRotateAngle(Spkebase3, -0.7285004297824331F, 0.0F, 0.0F); + this.Tail6 = new ModelRenderer(this, 5, 275); + this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); + this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); + this.setRotateAngle(Tail6, 0.091106186954104F, 0.0F, 0.0F); + this.Righthandleftfinger = new ModelRenderer(this, 220, 260); + this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); + this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); + this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornleft2.setRotationPoint(4.0F, 5.0F, -3.0F); + this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); + this.Righttoelowermid = new ModelRenderer(this, 290, 270); + this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); + this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Smallheadhornleft1 = new ModelRenderer(this, 190, 420); + this.Smallheadhornleft1.setRotationPoint(0.0F, 0.0F, 6.0F); + this.Smallheadhornleft1.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornleft1, 0.0F, 0.5009094953223726F, 0.0F); + this.Spiketop6 = new ModelRenderer(this, 300, 460); + this.Spiketop6.setRotationPoint(0.0F, 1.0F, 0.1F); + this.Spiketop6.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop6, -0.136659280431156F, 0.0F, 0.0F); + this.Wingupperarmleft = new ModelRenderer(this, 390, 230); + this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); + this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); + this.Spiketop8 = new ModelRenderer(this, 300, 460); + this.Spiketop8.setRotationPoint(0.0F, -5.0F, 0.1F); + this.Spiketop8.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop8, -0.045553093477052F, 0.0F, 0.0F); + this.Lowerjaw.addChild(this.Tooth13); + this.Smallheadhornright2.addChild(this.Smallheadhornright3); + this.Headmidhornlowerright.addChild(this.Headmidhornupperright); + this.Body.addChild(this.Spikebase4); + this.Tail4.addChild(this.Spiketop16); + this.Righttoeleft.addChild(this.Righttoelowerleft); + this.Lowerjawback.addChild(this.Underlowerjaw2); + this.Tail1.addChild(this.Spiketop10); + this.Righthandrightfinger.addChild(this.Clawrighthandright); + this.Lefthip.addChild(this.Rightleg); + this.Tail1.addChild(this.Righthip); + this.Snout.addChild(this.Tooth10); + this.Snout.addChild(this.Tooth3); + this.Body.addChild(this.Shoulderleft); + this.Rightfoot.addChild(this.Outertoeleft); + this.Body.addChild(this.Spikebase1); + this.Lowerjaw.addChild(this.Tooth12); + this.Wingfinger2right.addChild(this.Wingfingerlower2right); + this.Snout.addChild(this.Tooth8); + this.Lowerjaw.addChild(this.Tooth18); + this.Lowerarmleft.addChild(this.Thumbtoeupperleft); + this.Headback.addChild(this.Headlargehornlowerright); + this.Lowerjaw.addChild(this.Tooth16); + this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); + this.Spikebase5.addChild(this.Spiketop7); + this.Headback.addChild(this.Snout); + this.Rightfoot.addChild(this.Lefttoeleft); + this.Rightfoot.addChild(this.Lefttoeright); + this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); + this.Headlargehornupperright.addChild(this.Smallheadhornright1); + this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); + this.Lowerjawback.addChild(this.Smallheadhornright3_1); + this.Wingupperarmright.addChild(this.Winglowerarmright); + this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); + this.Tail1.addChild(this.Tail3); + this.Lowerjawback.addChild(this.Smallheadhornleft3_1); + this.Wingupperarmright.addChild(this.Wingmembramesmallright); + this.RTailSpike.addChild(this.RTailMembrane); + this.Body.addChild(this.Wingshoulderleft); + this.Body.addChild(this.Neckbase); + this.Spikebase2.addChild(this.Spiketop4); + this.Lefthandmidfinger.addChild(this.Clawlefthandmid); + this.Snout.addChild(this.Tooth9); + this.Wingfinger1right.addChild(this.Wingfinger3right); + this.Winglowerarmleft.addChild(this.Wingfinger1left); + this.Lowerjaw.addChild(this.Tooth15); + this.Neckbase.addChild(this.Neckmid); + this.Lowerjaw.addChild(this.Tooth17); + this.RightLeg.addChild(this.RightFoot); + this.Tail3.addChild(this.Spiketop13); + this.Snout.addChild(this.Tooth2); + this.Tail7.addChild(this.Tail8); + this.LTailSpike.addChild(this.LTailMembrane); + this.RightFoot.addChild(this.Righttoemid); + this.Lowerarmleft_1.addChild(this.Righthandrightfinger); + this.Body.addChild(this.Tail1); + this.Lowerjaw.addChild(this.Tooth11); + this.Tail3.addChild(this.Tail4); + this.Headback.addChild(this.Headmidhornlowerright); + this.Neckmid.addChild(this.Spiketop1); + this.Headlargehornlowerright.addChild(this.Headlargehornupperright); + this.Wingshoulderright.addChild(this.Wingupperarmright); + this.Wingfinger2left.addChild(this.Wingfingerlower2left); + this.Righthandleftfinger.addChild(this.Clawrighthandleft); + this.Rightleg.addChild(this.Rightfoot); + this.Shoulderleft_1.addChild(this.Lowerarmleft_1); + this.Snout.addChild(this.Tooth1); + this.Tail8.addChild(this.LTailSpike); + this.Wingfinger1left.addChild(this.Wingmembramelargeleft); + this.Wingfinger1right.addChild(this.Wingfinger2right); + this.Righttoeright.addChild(this.Righttoelowerright); + this.Outertoeleft.addChild(this.Outertoelowerleft); + this.Tail1.addChild(this.Spikebase5); + this.Winglowerarmleft.addChild(this.Wingmembramemidleft); + this.Neckmid.addChild(this.Neckend); + this.Headback.addChild(this.Headmidhornlowerleft); + this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); + this.Headback.addChild(this.Smallheadhornright2); + this.Winglowerarmright.addChild(this.Wingfinger1right); + this.Tail6.addChild(this.Spiketop17); + this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); + this.Tail4.addChild(this.Spiketop15); + this.RightFoot.addChild(this.Outertoelowerright); + this.Neckend.addChild(this.Headback); + this.Shoulderleft.addChild(this.Lowerarmleft); + this.Wingfinger3right.addChild(this.Wingfingerlower3right); + this.Body.addChild(this.Wingshoulderright); + this.Wingfinger1left.addChild(this.Wingfingerlower1left); + this.Tail3.addChild(this.Spiketop12); + this.Lowerarmleft_1.addChild(this.Righthandmidfinger); + this.Body.addChild(this.Shoulderleft_1); + this.Rightfoot.addChild(this.Lefttoemid); + this.Righthip.addChild(this.RightLeg); + this.Spikebase7.addChild(this.Spiketop9); + this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); + this.Tail3.addChild(this.Spiketop11); + this.Snout.addChild(this.Tooth6); + this.RightFoot.addChild(this.Righttoeright); + this.Lefttoeleft.addChild(this.Lefttoelowerleft); + this.Wingfinger1right.addChild(this.Wingfingerlower1right); + this.Lowerjawback.addChild(this.Lowerjaw); + this.Tail6.addChild(this.Spiketop18); + this.Body.addChild(this.Belly1); + this.Snout.addChild(this.Tooth5); + this.Tail1.addChild(this.Spikebase6); + this.Lowerarmleft.addChild(this.Lefthandmidfinger); + this.Lefttoemid.addChild(this.Lefttoelowermid); + this.Underlowerjaw2.addChild(this.Underlowerjaw3); + this.Snout.addChild(this.Tooth4); + this.Headback.addChild(this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH); + this.Body.addChild(this.Spikebase2); + this.Tail4.addChild(this.Spiketop14); + this.Snout.addChild(this.shape159); + this.Winglowerarmright.addChild(this.Wingmembramemidright); + this.Lefttoeright.addChild(this.Lefttoelowerright); + this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); + this.Neckbase.addChild(this.Spiketop2); + this.Wingfinger1right.addChild(this.Wingmembramelargeright); + this.Spkebase3.addChild(this.Spiketop5); + this.Wingupperarmleft.addChild(this.Winglowerarmleft); + this.Righthandmidfinger.addChild(this.Clawrighthandmid); + this.Tail6.addChild(this.Spiketop19); + this.Outertoelowerright.addChild(this.Outertoelowerright_1); + this.Wingfinger3left.addChild(this.Wingfingerlower3left); + this.Headback.addChild(this.Headlargehornlowerleft); + this.Wingfinger1left.addChild(this.Wingfinger3left); + this.Tail8.addChild(this.RTailSpike); + this.Tail6.addChild(this.Tail7); + this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.addChild(this.Lowerjawback); + this.Lowerjaw.addChild(this.Tooth14); + this.Lowerarmleft.addChild(this.Lefthandrightfinger); + this.Lefthandrightfinger.addChild(this.Clawlefthandright); + this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); + this.Tail1.addChild(this.Spikebase7); + this.Tail1.addChild(this.Lefthip); + this.RightFoot.addChild(this.Righttoeleft); + this.Wingfinger1left.addChild(this.Wingfinger2left); + this.Spikebase1.addChild(this.Spiketop3); + this.Lowerjawback.addChild(this.Underlowerjaw); + this.Snout.addChild(this.Tooth7); + this.Body.addChild(this.Spkebase3); + this.Tail4.addChild(this.Tail6); + this.Lowerarmleft_1.addChild(this.Righthandleftfinger); + this.Headback.addChild(this.Smallheadhornleft2); + this.Righttoemid.addChild(this.Righttoelowermid); + this.Headlargehornupperleft.addChild(this.Smallheadhornleft1); + this.Spikebase4.addChild(this.Spiketop6); + this.Wingshoulderleft.addChild(this.Wingupperarmleft); + this.Spikebase6.addChild(this.Spiketop8); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } - public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, float head4) - { - super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); - float wingFlap = (float) Math.toRadians(dragon.wingFlap()); - float jawAngle = (float)Math.toRadians(dragon.getJawMove()); - float neckAngle = -(float)Math.toRadians(4.5F * dragon.getNeckAngle()); - - this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; - this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); - - this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.rotateAngleX = jawAngle - (3.141F / 9F); - //this.Tail1.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - //this.Tail3.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - //this.Tail4.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - - if (!dragon.isTerrestrial()) //Fly - { - if(!dragon.onGround) - { - float angle = (float) Math.toRadians(dragon.getVertTailAngle()); - this.Body.rotateAngleX = 0.546F - angle; - } - else - { - this.Body.rotateAngleX = 0.5462880558742251F; - } - - if(dragon.motionY < -0.01F)//Glide - { - wingFlap = 0; - } - else if (dragon.motionX == 0 && dragon.motionZ == 0) //Hover - { - wingFlap = (float) Math.toRadians(dragon.wingFlap()); - } - else - { - wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;//Move - } - this.Wingshoulderright.rotateAngleZ = (float) (wingFlap*0.75F); - this.Wingshoulderleft.rotateAngleZ = (float) -(wingFlap*0.75F); - this.Wingupperarmright.rotateAngleZ = (float) (wingFlap*0.25F); - this.Wingupperarmleft.rotateAngleZ = (float) -(wingFlap*0.25F); - - } - else //Walk - { - this.Body.rotateAngleX = 0.5462880558742251F; - this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); - this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); - // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); - //this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); - - this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - } - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); + this.Body.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, + float head4) { + super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); + float wingFlap = (float) Math.toRadians(dragon.wingFlap()); + float jawAngle = (float) Math.toRadians(dragon.getJawMove()); + float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); + + this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; + this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); + + this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.rotateAngleX = jawAngle - (3.141F / 9F); + // this.Tail1.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail3.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail4.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + + if (!dragon.isTerrestrial()) // Fly + { + if (!dragon.onGround) { + float angle = (float) Math.toRadians(dragon.getVertTailAngle()); + this.Body.rotateAngleX = 0.546F - angle; + } else { + this.Body.rotateAngleX = 0.5462880558742251F; + } + + if (dragon.motionY < -0.01F)// Glide + { + wingFlap = 0; + } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover + { + wingFlap = (float) Math.toRadians(dragon.wingFlap()); + } else { + wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move + } + this.Wingshoulderright.rotateAngleZ = wingFlap * 0.75F; + this.Wingshoulderleft.rotateAngleZ = -(wingFlap * 0.75F); + this.Wingupperarmright.rotateAngleZ = wingFlap * 0.25F; + this.Wingupperarmleft.rotateAngleZ = -(wingFlap * 0.25F); + + } else // Walk + { + this.Body.rotateAngleX = 0.5462880558742251F; + this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); + this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); + // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); + // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); + + this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelHound.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelHound.java index 05f55bba..ba12f94e 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelHound.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelHound.java @@ -180,25 +180,23 @@ public void render(Entity entity, float f1, float f2, float f3, float f4, float /** * Used for easily adding entity-dependent animations. The second and third - * float params here are the same second and third as in the - * setRotationAngles method. + * float params here are the same second and third as in the setRotationAngles + * method. */ @Override - public void setLivingAnimations(EntityLivingBase living, float step1, float step2, float z) - { + public void setLivingAnimations(EntityLivingBase living, float step1, float step2, float z) { EntityHound var5 = (EntityHound) living; float walk1 = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; float walk2 = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - + if (var5.isAngry()) { this.Tail.rotateAngleY = 0F; } else { this.Tail.rotateAngleY = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; } - if (var5.isSitting()) - { + if (var5.isSitting()) { float dig = 0; this.Mane.setRotationPoint(-1F, 16F, -2F); this.Mane.rotateAngleX = ((float) Math.PI * 2F / 5F); @@ -214,8 +212,7 @@ public void setLivingAnimations(EntityLivingBase living, float step1, float step this.Leg3.setRotationPoint(-2.49F, 17F, -4F); this.Leg4.rotateAngleX = 5.811947F - dig; this.Leg4.setRotationPoint(0.51F, 17F, -4F); - } - else //WALK + } else // WALK { this.Body.setRotationPoint(0F, 14F, 2F); this.Body.rotateAngleX = ((float) Math.PI / 2F); @@ -227,15 +224,13 @@ public void setLivingAnimations(EntityLivingBase living, float step1, float step this.Leg3.setRotationPoint(-2.5F, 16F, -4F); this.Leg4.setRotationPoint(0.5F, 16F, -4F); - if(var5.isChild() || var5.isSprinting())//Alternate run + if (var5.isChild() || var5.isSprinting())// Alternate run { this.Leg1.rotateAngleX = walk1; this.Leg2.rotateAngleX = walk1; this.Leg3.rotateAngleX = walk2; this.Leg4.rotateAngleX = walk2; - } - else - { + } else { this.Leg2.rotateAngleX = walk1; this.Leg3.rotateAngleX = walk1; this.Leg1.rotateAngleX = walk2; diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelMinotaur.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelMinotaur.java index 5f931819..ad2652ef 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelMinotaur.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelMinotaur.java @@ -2,190 +2,186 @@ package minefantasy.mf2.client.render.mob; import minefantasy.mf2.entity.mob.EntityMinotaur; -import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; -public class ModelMinotaur extends ModelBiped -{ +public class ModelMinotaur extends ModelBiped { ModelRenderer Nose; - ModelRenderer Mane; - ModelRenderer bipedLeftForearm; - ModelRenderer tailEnd; - ModelRenderer bipedRightThigh; - ModelRenderer Lhorn1; - ModelRenderer Lhorn2; - ModelRenderer Rhorn1; - ModelRenderer Rhorn2; - ModelRenderer bipedLeftThigh; - ModelRenderer bipedLeftFoot; - ModelRenderer bipedRightFoot; - ModelRenderer tail; - ModelRenderer bipedRightForearm; - ModelRenderer shoulders; - ModelRenderer trapezius; - - ModelRenderer helmet; - ModelRenderer armour; - ModelRenderer warlordhelm; - - public ModelMinotaur() - { - //AXIAL - textureWidth = 128; - textureHeight = 128; - - bipedHead = new ModelRenderer(this, 0, 0); - bipedHead.addBox(-2F, -3F, -5F, 4, 6, 6); - bipedHead.setRotationPoint(0F, -9F, -2F); - bipedHead.setTextureSize(128, 128); - - Nose = new ModelRenderer(this, 0, 54); - Nose.addBox(-2F, -1F, -9F, 4, 4, 4); - Nose.setRotationPoint(0F, -9F, -2F); - Nose.setTextureSize(128, 128); - - Mane = new ModelRenderer(this, 0, 88); - Mane.addBox(-3F, -3F, -2F, 6, 12, 8); - Mane.setRotationPoint(0F, -8F, 1F); - Mane.setTextureSize(128, 128); - - tailEnd = new ModelRenderer(this, 64, 0); - tailEnd.addBox(-1F, 4F, 10F, 2, 2, 11); - tailEnd.setRotationPoint(0F, 4F, 0F); - tailEnd.setTextureSize(128, 128); - setRotation(tailEnd, -0.5363927F, 0F, 0F); - - bipedBody = new ModelRenderer(this, 0, 12); - bipedBody.addBox(-5F, 0F, -5F, 10, 14, 9); - bipedBody.setRotationPoint(0F, -8F, 1F); - bipedBody.setTextureSize(128, 128); - - tail = new ModelRenderer(this, 64, 17); - tail.addBox(-2F, -3F, 2F, 4, 3, 11); - tail.setRotationPoint(0F, 4F, 0F); - tail.setTextureSize(128, 128); - setRotation(tail, -1.182165F, 0F, 0F); - - shoulders = new ModelRenderer(this, 86, 50); - shoulders.addBox(-7.5F, -1F, -4F, 15, 7, 6); - shoulders.setRotationPoint(0F, -8F, 1F); - shoulders.setTextureSize(128, 128); - - trapezius = new ModelRenderer(this, 0, 64); - trapezius.addBox(-4F, -2F, -4F, 8, 13, 9); - trapezius.setRotationPoint(0F, -8F, 1F); - trapezius.setTextureSize(128, 128); - - //APPENDICULAR - LEFT - Lhorn1 = new ModelRenderer(this, 20, 5); - Lhorn1.mirror = true; - Lhorn1.addBox(2F, -2F, -2F, 5, 2, 2); - Lhorn1.setRotationPoint(0F, -9F, -2F); - Lhorn1.setTextureSize(128, 128); - - Lhorn2 = new ModelRenderer(this, 20, 0); - Lhorn2.mirror = true; - Lhorn2.addBox(6F, -6F, -2F, 1, 4, 1); - Lhorn2.setRotationPoint(0F, -9F, -2F); - Lhorn2.setTextureSize(128, 128); - - bipedLeftArm = new ModelRenderer(this, 38, 33); - bipedLeftArm.mirror = true; - bipedLeftArm.addBox(-1F, -2F, -3F, 5, 10, 7); - bipedLeftArm.setRotationPoint(7F, -6F, 1F); - bipedLeftArm.setTextureSize(128, 128); - - bipedLeftForearm = new ModelRenderer(this, 62, 33); - bipedLeftForearm.mirror = true; - bipedLeftForearm.addBox(0F, 8F, -1F, 4, 10, 4); - bipedLeftForearm.setRotationPoint(7F, -6F, 1F); - bipedLeftForearm.setTextureSize(128, 128); - - bipedLeftThigh = new ModelRenderer(this, 38, 0); - bipedLeftThigh.mirror = true; - bipedLeftThigh.addBox(-2F, 0F, -3F, 5, 10, 8); - bipedLeftThigh.setRotationPoint(3F, 4F, 0F); - bipedLeftThigh.setTextureSize(128, 128); - - bipedLeftLeg = new ModelRenderer(this, 20, 50); - bipedLeftLeg.mirror = true; - bipedLeftLeg.addBox(-1F, 10F, 0F, 4, 6, 5); - bipedLeftLeg.setRotationPoint(3F, 4F, 0F); - bipedLeftLeg.setTextureSize(128, 128); - - bipedLeftFoot = new ModelRenderer(this, 20, 38); - bipedLeftFoot.mirror = true; - bipedLeftFoot.addBox(-1F, 13F, -2F, 4, 7, 5); - bipedLeftFoot.setRotationPoint(3F, 4F, 0F); - bipedLeftFoot.setTextureSize(128, 128); - - //APPENDICULAR - RIGHT - Rhorn1 = new ModelRenderer(this, 20, 5); - Rhorn1.addBox(-7F, -2F, -2F, 5, 2, 2); - Rhorn1.setRotationPoint(0F, -9F, -2F); - Rhorn1.setTextureSize(128, 128); - - Rhorn2 = new ModelRenderer(this, 20, 0); - Rhorn2.addBox(-7F, -6F, -2F, 1, 4, 1); - Rhorn2.setRotationPoint(0F, -9F, -2F); - Rhorn2.setTextureSize(128, 128); - - bipedRightArm = new ModelRenderer(this, 38, 33); - bipedRightArm.addBox(-4F, -2F, -3F, 5, 10, 7); - bipedRightArm.setRotationPoint(-7F, -6F, 1F); - bipedRightArm.setTextureSize(128, 128); - - bipedRightForearm = new ModelRenderer(this, 62, 33); - bipedRightForearm.addBox(-4F, 8F, -1F, 4, 10, 4); - bipedRightForearm.setRotationPoint(-7F, -6F, 1F); - bipedRightForearm.setTextureSize(128, 128); - - bipedRightThigh = new ModelRenderer(this, 38, 0); - bipedRightThigh.addBox(-3F, 0F, -3F, 5, 10, 8); - bipedRightThigh.setRotationPoint(-3F, 4F, 0F); - bipedRightThigh.setTextureSize(128, 128); - - bipedRightLeg = new ModelRenderer(this, 20, 50); - bipedRightLeg.addBox(-3F, 10F, 0F, 4, 6, 5); - bipedRightLeg.setRotationPoint(-3F, 4F, 0F); - bipedRightLeg.setTextureSize(128, 128); - - bipedRightFoot = new ModelRenderer(this, 20, 38); - bipedRightFoot.addBox(-3F, 13F, -2F, 4, 7, 5); - bipedRightFoot.setRotationPoint(-3F, 4F, 0F); - bipedRightFoot.setTextureSize(128, 128); - - //ARMOUR - helmet = new ModelRenderer(this, 74, 98); - helmet.addBox(-2.5F, -3.5F, -5.5F, 5, 6, 6); - helmet.setRotationPoint(0F, -9F, -2F); - - armour = new ModelRenderer(this, 86, 103); - armour.setTextureOffset(86, 103).addBox(-5.5F, -0.5F, -5.5F, 11, 15, 10);//chest - armour.setTextureOffset(90, 77).addBox(-4.5F, -4.5F, -2.5F, 9, 16, 10);//back - armour.setTextureOffset(34, 110).addBox(-8F, -1.5F, -5F, 16, 8, 10);//shoulders - armour.setRotationPoint(0F, -8F, 1F); - - warlordhelm = new ModelRenderer(this, 46, 97); - warlordhelm.addBox(-3.5F, -2F, -10F, 7, 6, 7); - warlordhelm.setRotationPoint(-32F, -9F, -2F); - } - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - renderMinotaur((EntityMinotaur)entity, f, f1, f2, f3, f4, f5); + ModelRenderer Mane; + ModelRenderer bipedLeftForearm; + ModelRenderer tailEnd; + ModelRenderer bipedRightThigh; + ModelRenderer Lhorn1; + ModelRenderer Lhorn2; + ModelRenderer Rhorn1; + ModelRenderer Rhorn2; + ModelRenderer bipedLeftThigh; + ModelRenderer bipedLeftFoot; + ModelRenderer bipedRightFoot; + ModelRenderer tail; + ModelRenderer bipedRightForearm; + ModelRenderer shoulders; + ModelRenderer trapezius; + + ModelRenderer helmet; + ModelRenderer armour; + ModelRenderer warlordhelm; + + public ModelMinotaur() { + // AXIAL + textureWidth = 128; + textureHeight = 128; + + bipedHead = new ModelRenderer(this, 0, 0); + bipedHead.addBox(-2F, -3F, -5F, 4, 6, 6); + bipedHead.setRotationPoint(0F, -9F, -2F); + bipedHead.setTextureSize(128, 128); + + Nose = new ModelRenderer(this, 0, 54); + Nose.addBox(-2F, -1F, -9F, 4, 4, 4); + Nose.setRotationPoint(0F, -9F, -2F); + Nose.setTextureSize(128, 128); + + Mane = new ModelRenderer(this, 0, 88); + Mane.addBox(-3F, -3F, -2F, 6, 12, 8); + Mane.setRotationPoint(0F, -8F, 1F); + Mane.setTextureSize(128, 128); + + tailEnd = new ModelRenderer(this, 64, 0); + tailEnd.addBox(-1F, 4F, 10F, 2, 2, 11); + tailEnd.setRotationPoint(0F, 4F, 0F); + tailEnd.setTextureSize(128, 128); + setRotation(tailEnd, -0.5363927F, 0F, 0F); + + bipedBody = new ModelRenderer(this, 0, 12); + bipedBody.addBox(-5F, 0F, -5F, 10, 14, 9); + bipedBody.setRotationPoint(0F, -8F, 1F); + bipedBody.setTextureSize(128, 128); + + tail = new ModelRenderer(this, 64, 17); + tail.addBox(-2F, -3F, 2F, 4, 3, 11); + tail.setRotationPoint(0F, 4F, 0F); + tail.setTextureSize(128, 128); + setRotation(tail, -1.182165F, 0F, 0F); + + shoulders = new ModelRenderer(this, 86, 50); + shoulders.addBox(-7.5F, -1F, -4F, 15, 7, 6); + shoulders.setRotationPoint(0F, -8F, 1F); + shoulders.setTextureSize(128, 128); + + trapezius = new ModelRenderer(this, 0, 64); + trapezius.addBox(-4F, -2F, -4F, 8, 13, 9); + trapezius.setRotationPoint(0F, -8F, 1F); + trapezius.setTextureSize(128, 128); + + // APPENDICULAR - LEFT + Lhorn1 = new ModelRenderer(this, 20, 5); + Lhorn1.mirror = true; + Lhorn1.addBox(2F, -2F, -2F, 5, 2, 2); + Lhorn1.setRotationPoint(0F, -9F, -2F); + Lhorn1.setTextureSize(128, 128); + + Lhorn2 = new ModelRenderer(this, 20, 0); + Lhorn2.mirror = true; + Lhorn2.addBox(6F, -6F, -2F, 1, 4, 1); + Lhorn2.setRotationPoint(0F, -9F, -2F); + Lhorn2.setTextureSize(128, 128); + + bipedLeftArm = new ModelRenderer(this, 38, 33); + bipedLeftArm.mirror = true; + bipedLeftArm.addBox(-1F, -2F, -3F, 5, 10, 7); + bipedLeftArm.setRotationPoint(7F, -6F, 1F); + bipedLeftArm.setTextureSize(128, 128); + + bipedLeftForearm = new ModelRenderer(this, 62, 33); + bipedLeftForearm.mirror = true; + bipedLeftForearm.addBox(0F, 8F, -1F, 4, 10, 4); + bipedLeftForearm.setRotationPoint(7F, -6F, 1F); + bipedLeftForearm.setTextureSize(128, 128); + + bipedLeftThigh = new ModelRenderer(this, 38, 0); + bipedLeftThigh.mirror = true; + bipedLeftThigh.addBox(-2F, 0F, -3F, 5, 10, 8); + bipedLeftThigh.setRotationPoint(3F, 4F, 0F); + bipedLeftThigh.setTextureSize(128, 128); + + bipedLeftLeg = new ModelRenderer(this, 20, 50); + bipedLeftLeg.mirror = true; + bipedLeftLeg.addBox(-1F, 10F, 0F, 4, 6, 5); + bipedLeftLeg.setRotationPoint(3F, 4F, 0F); + bipedLeftLeg.setTextureSize(128, 128); + + bipedLeftFoot = new ModelRenderer(this, 20, 38); + bipedLeftFoot.mirror = true; + bipedLeftFoot.addBox(-1F, 13F, -2F, 4, 7, 5); + bipedLeftFoot.setRotationPoint(3F, 4F, 0F); + bipedLeftFoot.setTextureSize(128, 128); + + // APPENDICULAR - RIGHT + Rhorn1 = new ModelRenderer(this, 20, 5); + Rhorn1.addBox(-7F, -2F, -2F, 5, 2, 2); + Rhorn1.setRotationPoint(0F, -9F, -2F); + Rhorn1.setTextureSize(128, 128); + + Rhorn2 = new ModelRenderer(this, 20, 0); + Rhorn2.addBox(-7F, -6F, -2F, 1, 4, 1); + Rhorn2.setRotationPoint(0F, -9F, -2F); + Rhorn2.setTextureSize(128, 128); + + bipedRightArm = new ModelRenderer(this, 38, 33); + bipedRightArm.addBox(-4F, -2F, -3F, 5, 10, 7); + bipedRightArm.setRotationPoint(-7F, -6F, 1F); + bipedRightArm.setTextureSize(128, 128); + + bipedRightForearm = new ModelRenderer(this, 62, 33); + bipedRightForearm.addBox(-4F, 8F, -1F, 4, 10, 4); + bipedRightForearm.setRotationPoint(-7F, -6F, 1F); + bipedRightForearm.setTextureSize(128, 128); + + bipedRightThigh = new ModelRenderer(this, 38, 0); + bipedRightThigh.addBox(-3F, 0F, -3F, 5, 10, 8); + bipedRightThigh.setRotationPoint(-3F, 4F, 0F); + bipedRightThigh.setTextureSize(128, 128); + + bipedRightLeg = new ModelRenderer(this, 20, 50); + bipedRightLeg.addBox(-3F, 10F, 0F, 4, 6, 5); + bipedRightLeg.setRotationPoint(-3F, 4F, 0F); + bipedRightLeg.setTextureSize(128, 128); + + bipedRightFoot = new ModelRenderer(this, 20, 38); + bipedRightFoot.addBox(-3F, 13F, -2F, 4, 7, 5); + bipedRightFoot.setRotationPoint(-3F, 4F, 0F); + bipedRightFoot.setTextureSize(128, 128); + + // ARMOUR + helmet = new ModelRenderer(this, 74, 98); + helmet.addBox(-2.5F, -3.5F, -5.5F, 5, 6, 6); + helmet.setRotationPoint(0F, -9F, -2F); + + armour = new ModelRenderer(this, 86, 103); + armour.setTextureOffset(86, 103).addBox(-5.5F, -0.5F, -5.5F, 11, 15, 10);// chest + armour.setTextureOffset(90, 77).addBox(-4.5F, -4.5F, -2.5F, 9, 16, 10);// back + armour.setTextureOffset(34, 110).addBox(-8F, -1.5F, -5F, 16, 8, 10);// shoulders + armour.setRotationPoint(0F, -8F, 1F); + + warlordhelm = new ModelRenderer(this, 46, 97); + warlordhelm.addBox(-3.5F, -2F, -10F, 7, 6, 7); + warlordhelm.setRotationPoint(-32F, -9F, -2F); } - public void renderMinotaur(EntityMinotaur mino, float f, float f1, float f2, float f3, float f4, float f5) - { + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + renderMinotaur((EntityMinotaur) entity, f, f1, f2, f3, f4, f5); + } + + public void renderMinotaur(EntityMinotaur mino, float f, float f1, float f2, float f3, float f4, float f5) { setRotationAngles(mino, f, f1, f2, f3, f4, f5); Nose.render(f5); tailEnd.render(f5); @@ -198,8 +194,7 @@ public void renderMinotaur(EntityMinotaur mino, float f, float f1, float f2, flo Rhorn1.render(f5); Rhorn2.render(f5); Lhorn1.render(f5); - if(!mino.isBloodied()) - { + if (!mino.isBloodied()) { Lhorn2.render(f5); } bipedHead.render(f5); @@ -214,121 +209,115 @@ public void renderMinotaur(EntityMinotaur mino, float f, float f1, float f2, flo bipedLeftLeg.render(f5); Mane.render(f5); trapezius.render(f5); - + armour.render(f5); helmet.render(f5); warlordhelm.render(f5); } - public void setRotationAngles(EntityMinotaur mino, float f, float f1, float f2, float f3, float f4, float f5) - { - int swingAngle = 28 * mino.swing; - double swingRad = Math.toRadians(swingAngle); - - int swingAngleY = 9 * mino.swing; - double swingRadY = Math.toRadians(swingAngleY); - bipedHead.rotateAngleY = f3 / 57.29578F; - bipedHead.rotateAngleX = f4 / 57.29578F + (float)Math.toRadians(mino.getHeadChargeAngle()); - if (mino.swing <= 0) - { - bipedRightArm.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 2.0F * f1 * 0.5F; - bipedLeftArm.rotateAngleX = MathHelper.cos(f * 0.6662F) * 2.0F * f1 * 0.5F; - bipedRightArm.rotateAngleY = 0.0F; - bipedLeftArm.rotateAngleY = 0.0F; - } - else - { - bipedRightArm.rotateAngleX = (float) -swingRad; - bipedLeftArm.rotateAngleX = (float) -swingRad; - bipedRightArm.rotateAngleY = (float)swingRadY; - bipedLeftArm.rotateAngleY = (float)-swingRadY; - } - bipedRightArm.rotateAngleZ = 0.0F; - bipedLeftArm.rotateAngleZ = 0.0F; - bipedRightLeg.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; - bipedLeftLeg.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 1.4F * f1; - bipedRightLeg.rotateAngleY = 0.0F; - bipedLeftLeg.rotateAngleY = 0.0F; - - tail.rotateAngleX = -1.182165F; - tailEnd.rotateAngleX = -0.5363927F; - Nose.rotateAngleX = bipedHead.rotateAngleX; - Nose.rotateAngleY = bipedHead.rotateAngleY; - Rhorn1.rotateAngleX = bipedHead.rotateAngleX; - Rhorn1.rotateAngleY = bipedHead.rotateAngleY; - Rhorn2.rotateAngleX = bipedHead.rotateAngleX; - Rhorn2.rotateAngleY = bipedHead.rotateAngleY; - Lhorn1.rotateAngleX = bipedHead.rotateAngleX; - Lhorn1.rotateAngleY = bipedHead.rotateAngleY; - Lhorn2.rotateAngleX = bipedHead.rotateAngleX; - Lhorn2.rotateAngleY = bipedHead.rotateAngleY; - - if (onGround > -9990F) { - float f6 = onGround; - bipedBody.rotateAngleY = MathHelper.sin(MathHelper.sqrt_float(f6) * 3.141593F * 2.0F) * 0.2F; - bipedRightArm.rotationPointZ = MathHelper.sin(bipedBody.rotateAngleY) * 5F; - bipedRightArm.rotationPointX = -MathHelper.cos(bipedBody.rotateAngleY) * 5F; - bipedLeftArm.rotationPointZ = -MathHelper.sin(bipedBody.rotateAngleY) * 5F; - bipedLeftArm.rotationPointX = MathHelper.cos(bipedBody.rotateAngleY) * 5F; - bipedRightArm.rotateAngleY += bipedBody.rotateAngleY; - bipedLeftArm.rotateAngleY += bipedBody.rotateAngleY; - bipedLeftArm.rotateAngleX += bipedBody.rotateAngleY; - f6 = 1.0F - onGround; - f6 *= f6; - f6 *= f6; - f6 = 1.0F - f6; - float f8 = MathHelper.sin(f6 * 3.141593F); - float f10 = MathHelper.sin(onGround * 3.141593F) * -(bipedHead.rotateAngleX - 0.7F) * 0.75F; - bipedRightArm.rotateAngleX -= (double) f8 * 1.2D + (double) f10; - bipedRightArm.rotateAngleY += bipedBody.rotateAngleY * 2.0F; - bipedRightArm.rotateAngleZ = MathHelper.sin(onGround * 3.141593F) * -0.4F; - } - if(mino.riddenByEntity != null) - { - bipedLeftArm.rotateAngleX = (float) Math.toRadians(180F); - } - if(mino.getAttack() == 3 && mino.getHeldItem() == null)//if is power attack - { - bipedLeftArm.rotateAngleX = (float) Math.toRadians(-135F); - bipedRightArm.rotateAngleX = (float) Math.toRadians(-135F); - } - - bipedRightArm.rotateAngleZ += MathHelper.cos(f2 * 0.09F) * 0.05F + 0.05F; - bipedLeftArm.rotateAngleZ -= MathHelper.cos(f2 * 0.09F) * 0.05F + 0.05F; - bipedRightArm.rotateAngleX += MathHelper.sin(f2 * 0.067F) * 0.05F; - bipedLeftArm.rotateAngleX -= MathHelper.sin(f2 * 0.067F) * 0.05F; - - bipedLeftThigh.rotateAngleX = bipedLeftFoot.rotateAngleX = bipedLeftLeg.rotateAngleX; - bipedRightThigh.rotateAngleX = bipedRightFoot.rotateAngleX = bipedRightLeg.rotateAngleX; - - joinBlocks(Mane, bipedBody); - joinBlocks(trapezius, bipedBody); - joinBlocks2(bipedLeftForearm, bipedLeftArm); - joinBlocks2(bipedRightForearm, bipedRightArm); - - joinBlocks(armour, bipedBody); - joinBlocks2(helmet, bipedHead); - joinBlocks2(warlordhelm, bipedHead); - } - private void joinBlocks(ModelRenderer model, ModelRenderer anchor) - { - joinBlocks(model, anchor, 1.0F); - } - private void joinBlocks2(ModelRenderer model, ModelRenderer anchor) - { - model.rotateAngleX = anchor.rotateAngleX; - model.rotateAngleY = anchor.rotateAngleY; - model.rotateAngleZ = anchor.rotateAngleZ; - - model.rotationPointX = anchor.rotationPointX; - model.rotationPointY = anchor.rotationPointY; - model.rotationPointZ = anchor.rotationPointZ; - } - - private void joinBlocks(ModelRenderer model, ModelRenderer anchor, float ratio) - { - model.rotateAngleX = anchor.rotateAngleX * ratio; - model.rotateAngleY = anchor.rotateAngleY * ratio; - model.rotateAngleZ = anchor.rotateAngleZ * ratio; - } + public void setRotationAngles(EntityMinotaur mino, float f, float f1, float f2, float f3, float f4, float f5) { + int swingAngle = 28 * mino.swing; + double swingRad = Math.toRadians(swingAngle); + + int swingAngleY = 9 * mino.swing; + double swingRadY = Math.toRadians(swingAngleY); + bipedHead.rotateAngleY = f3 / 57.29578F; + bipedHead.rotateAngleX = f4 / 57.29578F + (float) Math.toRadians(mino.getHeadChargeAngle()); + if (mino.swing <= 0) { + bipedRightArm.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 2.0F * f1 * 0.5F; + bipedLeftArm.rotateAngleX = MathHelper.cos(f * 0.6662F) * 2.0F * f1 * 0.5F; + bipedRightArm.rotateAngleY = 0.0F; + bipedLeftArm.rotateAngleY = 0.0F; + } else { + bipedRightArm.rotateAngleX = (float) -swingRad; + bipedLeftArm.rotateAngleX = (float) -swingRad; + bipedRightArm.rotateAngleY = (float) swingRadY; + bipedLeftArm.rotateAngleY = (float) -swingRadY; + } + bipedRightArm.rotateAngleZ = 0.0F; + bipedLeftArm.rotateAngleZ = 0.0F; + bipedRightLeg.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; + bipedLeftLeg.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 1.4F * f1; + bipedRightLeg.rotateAngleY = 0.0F; + bipedLeftLeg.rotateAngleY = 0.0F; + + tail.rotateAngleX = -1.182165F; + tailEnd.rotateAngleX = -0.5363927F; + Nose.rotateAngleX = bipedHead.rotateAngleX; + Nose.rotateAngleY = bipedHead.rotateAngleY; + Rhorn1.rotateAngleX = bipedHead.rotateAngleX; + Rhorn1.rotateAngleY = bipedHead.rotateAngleY; + Rhorn2.rotateAngleX = bipedHead.rotateAngleX; + Rhorn2.rotateAngleY = bipedHead.rotateAngleY; + Lhorn1.rotateAngleX = bipedHead.rotateAngleX; + Lhorn1.rotateAngleY = bipedHead.rotateAngleY; + Lhorn2.rotateAngleX = bipedHead.rotateAngleX; + Lhorn2.rotateAngleY = bipedHead.rotateAngleY; + + if (onGround > -9990F) { + float f6 = onGround; + bipedBody.rotateAngleY = MathHelper.sin(MathHelper.sqrt_float(f6) * 3.141593F * 2.0F) * 0.2F; + bipedRightArm.rotationPointZ = MathHelper.sin(bipedBody.rotateAngleY) * 5F; + bipedRightArm.rotationPointX = -MathHelper.cos(bipedBody.rotateAngleY) * 5F; + bipedLeftArm.rotationPointZ = -MathHelper.sin(bipedBody.rotateAngleY) * 5F; + bipedLeftArm.rotationPointX = MathHelper.cos(bipedBody.rotateAngleY) * 5F; + bipedRightArm.rotateAngleY += bipedBody.rotateAngleY; + bipedLeftArm.rotateAngleY += bipedBody.rotateAngleY; + bipedLeftArm.rotateAngleX += bipedBody.rotateAngleY; + f6 = 1.0F - onGround; + f6 *= f6; + f6 *= f6; + f6 = 1.0F - f6; + float f8 = MathHelper.sin(f6 * 3.141593F); + float f10 = MathHelper.sin(onGround * 3.141593F) * -(bipedHead.rotateAngleX - 0.7F) * 0.75F; + bipedRightArm.rotateAngleX -= f8 * 1.2D + f10; + bipedRightArm.rotateAngleY += bipedBody.rotateAngleY * 2.0F; + bipedRightArm.rotateAngleZ = MathHelper.sin(onGround * 3.141593F) * -0.4F; + } + if (mino.riddenByEntity != null) { + bipedLeftArm.rotateAngleX = (float) Math.toRadians(180F); + } + if (mino.getAttack() == 3 && mino.getHeldItem() == null)// if is power attack + { + bipedLeftArm.rotateAngleX = (float) Math.toRadians(-135F); + bipedRightArm.rotateAngleX = (float) Math.toRadians(-135F); + } + + bipedRightArm.rotateAngleZ += MathHelper.cos(f2 * 0.09F) * 0.05F + 0.05F; + bipedLeftArm.rotateAngleZ -= MathHelper.cos(f2 * 0.09F) * 0.05F + 0.05F; + bipedRightArm.rotateAngleX += MathHelper.sin(f2 * 0.067F) * 0.05F; + bipedLeftArm.rotateAngleX -= MathHelper.sin(f2 * 0.067F) * 0.05F; + + bipedLeftThigh.rotateAngleX = bipedLeftFoot.rotateAngleX = bipedLeftLeg.rotateAngleX; + bipedRightThigh.rotateAngleX = bipedRightFoot.rotateAngleX = bipedRightLeg.rotateAngleX; + + joinBlocks(Mane, bipedBody); + joinBlocks(trapezius, bipedBody); + joinBlocks2(bipedLeftForearm, bipedLeftArm); + joinBlocks2(bipedRightForearm, bipedRightArm); + + joinBlocks(armour, bipedBody); + joinBlocks2(helmet, bipedHead); + joinBlocks2(warlordhelm, bipedHead); + } + + private void joinBlocks(ModelRenderer model, ModelRenderer anchor) { + joinBlocks(model, anchor, 1.0F); + } + + private void joinBlocks2(ModelRenderer model, ModelRenderer anchor) { + model.rotateAngleX = anchor.rotateAngleX; + model.rotateAngleY = anchor.rotateAngleY; + model.rotateAngleZ = anchor.rotateAngleZ; + + model.rotationPointX = anchor.rotationPointX; + model.rotationPointY = anchor.rotationPointY; + model.rotationPointZ = anchor.rotationPointZ; + } + + private void joinBlocks(ModelRenderer model, ModelRenderer anchor, float ratio) { + model.rotateAngleX = anchor.rotateAngleX * ratio; + model.rotateAngleY = anchor.rotateAngleY * ratio; + model.rotateAngleZ = anchor.rotateAngleZ * ratio; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelVenomDragon.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelVenomDragon.java index 48a5fdf4..a52d01d4 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelVenomDragon.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelVenomDragon.java @@ -6,1110 +6,1102 @@ import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; -public class ModelVenomDragon extends ModelBase -{ +public class ModelVenomDragon extends ModelBase { public ModelRenderer Body; - public ModelRenderer Tail1; - public ModelRenderer Belly1; - public ModelRenderer Wingshoulderright; - public ModelRenderer Wingshoulderleft; - public ModelRenderer Neckbase; - public ModelRenderer Shoulderleft; - public ModelRenderer Shoulderleft_1; - public ModelRenderer Spike1; - public ModelRenderer Spike2; - public ModelRenderer Spike3; - public ModelRenderer Tail3; - public ModelRenderer Righthip; - public ModelRenderer Lefthip; - public ModelRenderer Spike4; - public ModelRenderer Spike5; - public ModelRenderer Spike6; - public ModelRenderer Spike7; - public ModelRenderer Tail4; - public ModelRenderer Spike8; - public ModelRenderer Spike9; - public ModelRenderer Tail6; - public ModelRenderer Spike10; - public ModelRenderer Spike11; - public ModelRenderer Tail7; - public ModelRenderer Spike12; - public ModelRenderer Spike13; - public ModelRenderer Tail8; - public ModelRenderer Spike14; - public ModelRenderer Spike15; - public ModelRenderer LTailSpike; - public ModelRenderer RTailSpike; - public ModelRenderer LTailMembrane; - public ModelRenderer RTailMembrane; - public ModelRenderer RightLeg; - public ModelRenderer RightFoot; - public ModelRenderer Righttoemid; - public ModelRenderer Righttoeleft; - public ModelRenderer Righttoeright; - public ModelRenderer Outertoelowerright; - public ModelRenderer Righttoelowermid; - public ModelRenderer Righttoelowerleft; - public ModelRenderer Righttoelowerright; - public ModelRenderer Outertoelowerright_1; - public ModelRenderer Rightleg; - public ModelRenderer Rightfoot; - public ModelRenderer Lefttoemid; - public ModelRenderer Lefttoeright; - public ModelRenderer Lefttoeleft; - public ModelRenderer Outertoeleft; - public ModelRenderer Lefttoelowermid; - public ModelRenderer Lefttoelowerright; - public ModelRenderer Lefttoelowerleft; - public ModelRenderer Outertoelowerleft; - public ModelRenderer Belly2; - public ModelRenderer Wingupperarmright; - public ModelRenderer Winglowerarmright; - public ModelRenderer Wingmembramesmallright; - public ModelRenderer Wingfinger1right; - public ModelRenderer Wingmembramemidright; - public ModelRenderer Wingfinger2right; - public ModelRenderer Wingfinger3right; - public ModelRenderer Wingfingerlower1right; - public ModelRenderer Wingmembramelargeright; - public ModelRenderer Wingfingerlower2right; - public ModelRenderer Wingfingerlower3right; - public ModelRenderer Wingupperarmleft; - public ModelRenderer Winglowerarmleft; - public ModelRenderer Wingmembramesmallleft; - public ModelRenderer Wingfinger1left; - public ModelRenderer Wingmembramemidleft; - public ModelRenderer Wingfingerlower1left; - public ModelRenderer Wingfinger2left; - public ModelRenderer Wingfinger3left; - public ModelRenderer Wingmembramelargeleft; - public ModelRenderer Wingfingerlower2left; - public ModelRenderer Wingfingerlower3left; - public ModelRenderer Neckmid; - public ModelRenderer Neckend; - public ModelRenderer Headback; - public ModelRenderer Snout; - public ModelRenderer Headlargehornlowerleft; - public ModelRenderer Headlargehornlowerright; - public ModelRenderer Smallheadhornleft2; - public ModelRenderer Smallheadhornright2; - public ModelRenderer Headmidhornlowerleft; - public ModelRenderer Headmidhornlowerright; - public ModelRenderer shape151; - public ModelRenderer Tooth5; - public ModelRenderer Tooth4; - public ModelRenderer Tooth3; - public ModelRenderer Tooth1; - public ModelRenderer Tooth6; - public ModelRenderer Tooth7; - public ModelRenderer Tooth9; - public ModelRenderer Tooth10; - public ModelRenderer BrowfrontR; - public ModelRenderer BrowfrontL; - public ModelRenderer RBrowback; - public ModelRenderer BrowbackL; - public ModelRenderer Headlargehornupperleft; - public ModelRenderer Lheadhorncrown1; - public ModelRenderer Lheadhorncrown1_1; - public ModelRenderer LHeadhornlargeback; - public ModelRenderer Lheadhorncrown2; - public ModelRenderer Lheadhorncrown3; - public ModelRenderer Lheadhorncrown2_1; - public ModelRenderer Lheadhorncrown3_1; - public ModelRenderer Headlargehornupperright; - public ModelRenderer Rheadhorncrown1; - public ModelRenderer Rheadhorncrown1_1; - public ModelRenderer RHeadhornlargeback; - public ModelRenderer Rheadhorncrown2; - public ModelRenderer Rheadhorncrown3; - public ModelRenderer Rhorncrownlower2; - public ModelRenderer Rhorncrownlower3; - public ModelRenderer Headmidhornupperleft; - public ModelRenderer Headmidhornupperright; - public ModelRenderer Lowerjawback; - public ModelRenderer Lowerjaw; - public ModelRenderer Smallheadhornright3; - public ModelRenderer Smallheadhornleft3; - public ModelRenderer Underlowerjaw2; - public ModelRenderer Underlowerjaw; - public ModelRenderer Tooth17; - public ModelRenderer Tooth13; - public ModelRenderer Tooth16; - public ModelRenderer Tooth12; - public ModelRenderer Tooth18; - public ModelRenderer Tooth14; - public ModelRenderer Tooth15; - public ModelRenderer Tooth11; - public ModelRenderer Underlowerjaw3; - public ModelRenderer Lowerarmleft; - public ModelRenderer Lefthandrightfinger; - public ModelRenderer Lefthandmidfinger; - public ModelRenderer Lefthandrightfinger_1; - public ModelRenderer Thumbtoeupperleft; - public ModelRenderer Clawlefthandright; - public ModelRenderer Clawlefthandmid; - public ModelRenderer Clawlefthandleft; - public ModelRenderer Thumbtoelowerleft; - public ModelRenderer Lowerarmleft_1; - public ModelRenderer Righthandleftfinger; - public ModelRenderer Righthandmidfinger; - public ModelRenderer Righthandrightfinger; - public ModelRenderer Thumbtoeupperright; - public ModelRenderer Clawrighthandleft; - public ModelRenderer Clawrighthandmid; - public ModelRenderer Clawrighthandright; - public ModelRenderer Thumbtoelowerright; + public ModelRenderer Tail1; + public ModelRenderer Belly1; + public ModelRenderer Wingshoulderright; + public ModelRenderer Wingshoulderleft; + public ModelRenderer Neckbase; + public ModelRenderer Shoulderleft; + public ModelRenderer Shoulderleft_1; + public ModelRenderer Spike1; + public ModelRenderer Spike2; + public ModelRenderer Spike3; + public ModelRenderer Tail3; + public ModelRenderer Righthip; + public ModelRenderer Lefthip; + public ModelRenderer Spike4; + public ModelRenderer Spike5; + public ModelRenderer Spike6; + public ModelRenderer Spike7; + public ModelRenderer Tail4; + public ModelRenderer Spike8; + public ModelRenderer Spike9; + public ModelRenderer Tail6; + public ModelRenderer Spike10; + public ModelRenderer Spike11; + public ModelRenderer Tail7; + public ModelRenderer Spike12; + public ModelRenderer Spike13; + public ModelRenderer Tail8; + public ModelRenderer Spike14; + public ModelRenderer Spike15; + public ModelRenderer LTailSpike; + public ModelRenderer RTailSpike; + public ModelRenderer LTailMembrane; + public ModelRenderer RTailMembrane; + public ModelRenderer RightLeg; + public ModelRenderer RightFoot; + public ModelRenderer Righttoemid; + public ModelRenderer Righttoeleft; + public ModelRenderer Righttoeright; + public ModelRenderer Outertoelowerright; + public ModelRenderer Righttoelowermid; + public ModelRenderer Righttoelowerleft; + public ModelRenderer Righttoelowerright; + public ModelRenderer Outertoelowerright_1; + public ModelRenderer Rightleg; + public ModelRenderer Rightfoot; + public ModelRenderer Lefttoemid; + public ModelRenderer Lefttoeright; + public ModelRenderer Lefttoeleft; + public ModelRenderer Outertoeleft; + public ModelRenderer Lefttoelowermid; + public ModelRenderer Lefttoelowerright; + public ModelRenderer Lefttoelowerleft; + public ModelRenderer Outertoelowerleft; + public ModelRenderer Belly2; + public ModelRenderer Wingupperarmright; + public ModelRenderer Winglowerarmright; + public ModelRenderer Wingmembramesmallright; + public ModelRenderer Wingfinger1right; + public ModelRenderer Wingmembramemidright; + public ModelRenderer Wingfinger2right; + public ModelRenderer Wingfinger3right; + public ModelRenderer Wingfingerlower1right; + public ModelRenderer Wingmembramelargeright; + public ModelRenderer Wingfingerlower2right; + public ModelRenderer Wingfingerlower3right; + public ModelRenderer Wingupperarmleft; + public ModelRenderer Winglowerarmleft; + public ModelRenderer Wingmembramesmallleft; + public ModelRenderer Wingfinger1left; + public ModelRenderer Wingmembramemidleft; + public ModelRenderer Wingfingerlower1left; + public ModelRenderer Wingfinger2left; + public ModelRenderer Wingfinger3left; + public ModelRenderer Wingmembramelargeleft; + public ModelRenderer Wingfingerlower2left; + public ModelRenderer Wingfingerlower3left; + public ModelRenderer Neckmid; + public ModelRenderer Neckend; + public ModelRenderer Headback; + public ModelRenderer Snout; + public ModelRenderer Headlargehornlowerleft; + public ModelRenderer Headlargehornlowerright; + public ModelRenderer Smallheadhornleft2; + public ModelRenderer Smallheadhornright2; + public ModelRenderer Headmidhornlowerleft; + public ModelRenderer Headmidhornlowerright; + public ModelRenderer shape151; + public ModelRenderer Tooth5; + public ModelRenderer Tooth4; + public ModelRenderer Tooth3; + public ModelRenderer Tooth1; + public ModelRenderer Tooth6; + public ModelRenderer Tooth7; + public ModelRenderer Tooth9; + public ModelRenderer Tooth10; + public ModelRenderer BrowfrontR; + public ModelRenderer BrowfrontL; + public ModelRenderer RBrowback; + public ModelRenderer BrowbackL; + public ModelRenderer Headlargehornupperleft; + public ModelRenderer Lheadhorncrown1; + public ModelRenderer Lheadhorncrown1_1; + public ModelRenderer LHeadhornlargeback; + public ModelRenderer Lheadhorncrown2; + public ModelRenderer Lheadhorncrown3; + public ModelRenderer Lheadhorncrown2_1; + public ModelRenderer Lheadhorncrown3_1; + public ModelRenderer Headlargehornupperright; + public ModelRenderer Rheadhorncrown1; + public ModelRenderer Rheadhorncrown1_1; + public ModelRenderer RHeadhornlargeback; + public ModelRenderer Rheadhorncrown2; + public ModelRenderer Rheadhorncrown3; + public ModelRenderer Rhorncrownlower2; + public ModelRenderer Rhorncrownlower3; + public ModelRenderer Headmidhornupperleft; + public ModelRenderer Headmidhornupperright; + public ModelRenderer Lowerjawback; + public ModelRenderer Lowerjaw; + public ModelRenderer Smallheadhornright3; + public ModelRenderer Smallheadhornleft3; + public ModelRenderer Underlowerjaw2; + public ModelRenderer Underlowerjaw; + public ModelRenderer Tooth17; + public ModelRenderer Tooth13; + public ModelRenderer Tooth16; + public ModelRenderer Tooth12; + public ModelRenderer Tooth18; + public ModelRenderer Tooth14; + public ModelRenderer Tooth15; + public ModelRenderer Tooth11; + public ModelRenderer Underlowerjaw3; + public ModelRenderer Lowerarmleft; + public ModelRenderer Lefthandrightfinger; + public ModelRenderer Lefthandmidfinger; + public ModelRenderer Lefthandrightfinger_1; + public ModelRenderer Thumbtoeupperleft; + public ModelRenderer Clawlefthandright; + public ModelRenderer Clawlefthandmid; + public ModelRenderer Clawlefthandleft; + public ModelRenderer Thumbtoelowerleft; + public ModelRenderer Lowerarmleft_1; + public ModelRenderer Righthandleftfinger; + public ModelRenderer Righthandmidfinger; + public ModelRenderer Righthandrightfinger; + public ModelRenderer Thumbtoeupperright; + public ModelRenderer Clawrighthandleft; + public ModelRenderer Clawrighthandmid; + public ModelRenderer Clawrighthandright; + public ModelRenderer Thumbtoelowerright; - public ModelVenomDragon() - { - this.textureWidth = 512; - this.textureHeight = 512; - this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); - this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); - this.Outertoelowerleft = new ModelRenderer(this, 305, 270); - this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); - this.Spike7 = new ModelRenderer(this, 230, 500); - this.Spike7.setRotationPoint(0.0F, 0.0F, 22.1F); - this.Spike7.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike7, 0.5918411493512771F, 0.0F, 0.0F); - this.Wingmembramesmallleft = new ModelRenderer(this, 420, 255); - this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); - this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); - this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); - this.Outertoelowerright_1.mirror = true; - this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); - this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornleft3.setRotationPoint(2.0F, -2.4F, -2.5F); - this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); - this.setRotateAngle(Smallheadhornleft3, -0.6373942428283291F, 0.4553564018453205F, 0.0F); - this.LTailSpike = new ModelRenderer(this, 350, 300); - this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); - this.Clawlefthandright = new ModelRenderer(this, 200, 260); - this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); - this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerleft.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 5, 0.0F); - this.setRotateAngle(Headlargehornlowerleft, 0.5462880558742251F, 0.091106186954104F, 0.36425021489121656F); - this.Lefttoeleft = new ModelRenderer(this, 290, 280); - this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); - this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); - this.RightLeg = new ModelRenderer(this, 260, 275); - this.RightLeg.setRotationPoint(0.0F, 14.6F, 0.0F); - this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.045553093477052F, -0.091106186954104F); - this.Righttoeright = new ModelRenderer(this, 290, 280); - this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); - this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); - this.Headmidhornupperright = new ModelRenderer(this, 190, 420); - this.Headmidhornupperright.setRotationPoint(0.0F, 0.1F, 2.7F); - this.Headmidhornupperright.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, -0.091106186954104F, 0.0F); - this.Wingfinger1left = new ModelRenderer(this, 350, 200); - this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); - this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); - this.Rheadhorncrown1 = new ModelRenderer(this, 190, 400); - this.Rheadhorncrown1.setRotationPoint(-2.0F, 0.0F, 1.0F); - this.Rheadhorncrown1.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 4, 0.0F); - this.setRotateAngle(Rheadhorncrown1, -0.40980330836826856F, -0.31869712141416456F, 0.40980330836826856F); - this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); - this.Shoulderleft_1.setRotationPoint(-8.0F, 11.0F, 9.0F); - this.Shoulderleft_1.addBox(-2.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); - this.RTailMembrane = new ModelRenderer(this, 381, 270); - this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); - this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); - this.BrowfrontL = new ModelRenderer(this, 190, 390); - this.BrowfrontL.setRotationPoint(2.3F, 0.7F, -4.7F); - this.BrowfrontL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(BrowfrontL, 0.091106186954104F, 0.36425021489121656F, -0.18203784098300857F); - this.Wingupperarmright = new ModelRenderer(this, 390, 230); - this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); - this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); - this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); - this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Headlargehornupperright = new ModelRenderer(this, 190, 470); - this.Headlargehornupperright.setRotationPoint(-0.1F, 0.0F, 4.5F); - this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornupperright, 0.18203784098300857F, -0.136659280431156F, 0.0F); - this.Headback = new ModelRenderer(this, 120, 390); - this.Headback.setRotationPoint(-0.01F, -0.8F, -9.0F); - this.Headback.addBox(-3.5F, 0.0F, -11.0F, 7, 6, 11, 0.0F); - this.setRotateAngle(Headback, 0.27314402793711257F, 0.0F, 0.0F); - this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); - this.Headlargehornupperleft.setRotationPoint(0.1F, 0.0F, 4.5F); - this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornupperleft, 0.18203784098300857F, 0.136659280431156F, 0.0F); - this.Lheadhorncrown2 = new ModelRenderer(this, 205, 420); - this.Lheadhorncrown2.setRotationPoint(0.0F, 0.0F, 3.0F); - this.Lheadhorncrown2.addBox(0.0F, 0.0F, 0.0F, 2, 1, 2, 0.0F); - this.setRotateAngle(Lheadhorncrown2, 0.0F, 0.7285004297824331F, 0.0F); - this.Spike1 = new ModelRenderer(this, 230, 500); - this.Spike1.setRotationPoint(0.0F, 0.0F, 1.0F); - this.Spike1.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike1, 0.8196066167365371F, 0.0F, 0.0F); - this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerright.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 5, 0.0F); - this.setRotateAngle(Headlargehornlowerright, 0.5462880558742251F, -0.091106186954104F, -0.36425021489121656F); - this.Spike10 = new ModelRenderer(this, 230, 500); - this.Spike10.setRotationPoint(0.0F, 0.0F, 3.0F); - this.Spike10.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike10, 0.36425021489121656F, 0.0F, 0.0F); - this.Tooth3 = new ModelRenderer(this, 180, 500); - this.Tooth3.setRotationPoint(2.7F, 4.0F, -6.1F); - this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); - this.Righttoemid = new ModelRenderer(this, 290, 280); - this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); - this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.Spike12 = new ModelRenderer(this, 230, 490); - this.Spike12.setRotationPoint(0.0F, 0.0F, 3.0F); - this.Spike12.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); - this.setRotateAngle(Spike12, 0.36425021489121656F, 0.0F, 0.0F); - this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); - this.Thumbtoelowerright.mirror = true; - this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); - this.Clawrighthandmid = new ModelRenderer(this, 200, 260); - this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Body = new ModelRenderer(this, 5, 470); - this.Body.setRotationPoint(0.0F, -4.0F, -23.0F); - this.Body.addBox(-9.0F, 0.0F, 0.0F, 18, 18, 23, 0.0F); - this.setRotateAngle(Body, 0.5009094953223726F, 0.0F, 0.0F); - this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); - this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); - this.Tooth9 = new ModelRenderer(this, 180, 500); - this.Tooth9.setRotationPoint(-2.7F, 4.0F, -6.1F); - this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); - this.Clawrighthandright = new ModelRenderer(this, 200, 260); - this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); - this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); - this.Rheadhorncrown2 = new ModelRenderer(this, 205, 420); - this.Rheadhorncrown2.setRotationPoint(0.0F, 0.0F, 3.0F); - this.Rheadhorncrown2.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 2, 0.0F); - this.setRotateAngle(Rheadhorncrown2, 0.0F, -0.7285004297824331F, 0.0F); - this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); - this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); - this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); - this.Neckend = new ModelRenderer(this, 120, 420); - this.Neckend.setRotationPoint(0.0F, 0.5F, -8.0F); - this.Neckend.addBox(-3.5F, 0.0F, -9.0F, 7, 9, 9, 0.0F); - this.setRotateAngle(Neckend, 0.18203784098300857F, 0.0F, 0.0F); - this.Tooth10 = new ModelRenderer(this, 180, 500); - this.Tooth10.setRotationPoint(-2.8F, 3.9F, -8.4F); - this.Tooth10.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth10, 0.0F, 0.0F, 0.22759093446006054F); - this.Lefttoelowerright = new ModelRenderer(this, 290, 270); - this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); - this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Rheadhorncrown1_1 = new ModelRenderer(this, 190, 420); - this.Rheadhorncrown1_1.setRotationPoint(-0.4F, 0.0F, 2.51F); - this.Rheadhorncrown1_1.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(Rheadhorncrown1_1, -0.091106186954104F, -0.6373942428283291F, -0.091106186954104F); - this.Wingshoulderright = new ModelRenderer(this, 470, 230); - this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 4.0F); - this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); - this.Shoulderleft = new ModelRenderer(this, 220, 300); - this.Shoulderleft.mirror = true; - this.Shoulderleft.setRotationPoint(8.0F, 11.0F, 9.0F); - this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); - this.Wingshoulderleft = new ModelRenderer(this, 470, 230); - this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 4.0F); - this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); - this.Neckbase = new ModelRenderer(this, 120, 470); - this.Neckbase.setRotationPoint(0.0F, 2.0F, 7.0F); - this.Neckbase.addBox(-6.0F, 0.0F, -13.0F, 12, 14, 13, 0.0F); - this.setRotateAngle(Neckbase, -0.136659280431156F, 0.0F, 0.0F); - this.Tail4 = new ModelRenderer(this, 5, 300); - this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); - this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); - this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); - this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); - this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.RTailSpike = new ModelRenderer(this, 350, 300); - this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); - this.Lheadhorncrown1_1 = new ModelRenderer(this, 190, 420); - this.Lheadhorncrown1_1.setRotationPoint(0.4F, 0.0F, 2.51F); - this.Lheadhorncrown1_1.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(Lheadhorncrown1_1, 0.091106186954104F, 0.6373942428283291F, 0.18203784098300857F); - this.Tooth15 = new ModelRenderer(this, 180, 500); - this.Tooth15.setRotationPoint(-2.5F, 0.6F, -1.3F); - this.Tooth15.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth15, 0.0F, 0.0F, -0.22759093446006054F); - this.Spike2 = new ModelRenderer(this, 230, 475); - this.Spike2.setRotationPoint(0.0F, 0.0F, 8.0F); - this.Spike2.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 7, 0.0F); - this.setRotateAngle(Spike2, 0.9560913642424937F, 0.0F, 0.0F); - this.Spike3 = new ModelRenderer(this, 230, 460); - this.Spike3.setRotationPoint(0.0F, 0.0F, 16.0F); - this.Spike3.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 8, 0.0F); - this.setRotateAngle(Spike3, 0.9560913642424937F, 0.0F, 0.0F); - this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); - this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); - this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); - this.Wingfinger2left = new ModelRenderer(this, 330, 150); - this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); - this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); - this.Belly1 = new ModelRenderer(this, 0, 180); - this.Belly1.setRotationPoint(0.0F, 18.0F, 0.0F); - this.Belly1.addBox(-7.5F, -11.0F, 0.0F, 15, 11, 21, 0.0F); - this.setRotateAngle(Belly1, -0.27314402793711257F, 0.0F, 0.0F); - this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerleft.setRotationPoint(1.8F, 0.5F, -8.0F); - this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); - this.setRotateAngle(Headmidhornlowerleft, 0.091106186954104F, 0.5462880558742251F, -0.31869712141416456F); - this.shape151 = new ModelRenderer(this, 120, 320); - this.shape151.setRotationPoint(0.0F, 6.0F, -3.0F); - this.shape151.addBox(-2.5F, 0.0F, -5.0F, 5, 3, 6, 0.0F); - this.Clawlefthandmid = new ModelRenderer(this, 200, 260); - this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Underlowerjaw3 = new ModelRenderer(this, 160, 325); - this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Underlowerjaw3.addBox(-2.0F, -3.0F, 0.0F, 4, 3, 6, 0.0F); - this.setRotateAngle(Underlowerjaw3, 0.31869712141416456F, 0.0F, 0.0F); - this.Wingmembramemidright = new ModelRenderer(this, 350, 340); - this.Wingmembramemidright.mirror = true; - this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); - this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); - this.Neckmid = new ModelRenderer(this, 120, 445); - this.Neckmid.setRotationPoint(0.0F, 2.6F, -7.0F); - this.Neckmid.addBox(-4.5F, 0.0F, -10.0F, 9, 11, 10, 0.0F); - this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); - this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); - this.Rheadhorncrown3 = new ModelRenderer(this, 220, 420); - this.Rheadhorncrown3.setRotationPoint(0.0F, 0.0F, 2.0F); - this.Rheadhorncrown3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); - this.setRotateAngle(Rheadhorncrown3, 0.0F, -0.8196066167365371F, 0.0F); - this.Belly2 = new ModelRenderer(this, 5, 145); - this.Belly2.setRotationPoint(0.0F, 0.0F, 21.0F); - this.Belly2.addBox(-5.5F, -9.0F, 0.0F, 11, 9, 20, 0.0F); - this.setRotateAngle(Belly2, 0.18203784098300857F, 0.0F, 0.0F); - this.Tooth17 = new ModelRenderer(this, 180, 500); - this.Tooth17.setRotationPoint(-2.5F, 0.6F, -7.5F); - this.Tooth17.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth17, 0.0F, 0.0F, -0.22759093446006054F); - this.Spike11 = new ModelRenderer(this, 230, 490); - this.Spike11.setRotationPoint(0.0F, 0.0F, 11.0F); - this.Spike11.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); - this.setRotateAngle(Spike11, 0.36425021489121656F, 0.0F, 0.0F); - this.Underlowerjaw2 = new ModelRenderer(this, 160, 340); - this.Underlowerjaw2.setRotationPoint(0.0F, 4.0F, -3.0F); - this.Underlowerjaw2.addBox(-2.0F, -1.0F, -4.0F, 4, 1, 4, 0.0F); - this.setRotateAngle(Underlowerjaw2, -0.22759093446006054F, 0.0F, 0.0F); - this.Tooth12 = new ModelRenderer(this, 180, 500); - this.Tooth12.setRotationPoint(2.5F, 0.4F, -4.5F); - this.Tooth12.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth12, 0.0F, 0.0F, 0.22759093446006054F); - this.Outertoelowerright = new ModelRenderer(this, 320, 280); - this.Outertoelowerright.mirror = true; - this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); - this.LHeadhornlargeback = new ModelRenderer(this, 190, 370); - this.LHeadhornlargeback.setRotationPoint(-0.01F, 0.0F, 0.0F); - this.LHeadhornlargeback.addBox(0.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(LHeadhornlargeback, -0.7285004297824331F, 0.0F, 0.0F); - this.Righthip = new ModelRenderer(this, 260, 300); - this.Righthip.setRotationPoint(-7.0F, 5.0F, 14.0F); - this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Righthip, -0.27314402793711257F, 0.27314402793711257F, 0.18203784098300857F); - this.Lheadhorncrown2_1 = new ModelRenderer(this, 205, 400); - this.Lheadhorncrown2_1.setRotationPoint(0.0F, 0.01F, 4.0F); - this.Lheadhorncrown2_1.addBox(0.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); - this.setRotateAngle(Lheadhorncrown2_1, 0.0F, 0.9105382707654417F, 0.0F); - this.Winglowerarmleft = new ModelRenderer(this, 400, 215); - this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); - this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); - this.Righttoeleft = new ModelRenderer(this, 290, 280); - this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); - this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); - this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornright3.setRotationPoint(-2.0F, -2.4F, -1.5F); - this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); - this.setRotateAngle(Smallheadhornright3, -0.6373942428283291F, -0.4553564018453205F, 0.0F); - this.Lheadhorncrown1 = new ModelRenderer(this, 190, 400); - this.Lheadhorncrown1.setRotationPoint(2.0F, 0.0F, 1.0F); - this.Lheadhorncrown1.addBox(0.0F, 0.0F, 0.0F, 2, 2, 4, 0.0F); - this.setRotateAngle(Lheadhorncrown1, -0.40980330836826856F, 0.31869712141416456F, -0.40980330836826856F); - this.Lefttoelowermid = new ModelRenderer(this, 290, 270); - this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); - this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Tooth18 = new ModelRenderer(this, 180, 500); - this.Tooth18.setRotationPoint(-2.5F, 0.6F, -10.0F); - this.Tooth18.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth18, 0.22759093446006054F, 0.0F, -0.22759093446006054F); - this.Snout = new ModelRenderer(this, 120, 365); - this.Snout.setRotationPoint(0.0F, 0.61F, -9.0F); - this.Snout.addBox(-3.0F, 0.0F, -10.0F, 6, 5, 10, 0.0F); - this.setRotateAngle(Snout, -0.045553093477052F, 0.0F, 0.015533430342749534F); - this.Tooth5 = new ModelRenderer(this, 180, 500); - this.Tooth5.setRotationPoint(0.4F, 4.3F, -8.9F); - this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); - this.Tooth6 = new ModelRenderer(this, 180, 500); - this.Tooth6.setRotationPoint(-0.4F, 4.3F, -8.9F); - this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); - this.Lowerjaw = new ModelRenderer(this, 120, 345); - this.Lowerjaw.setRotationPoint(0.0F, -0.05F, -6.7F); - this.Lowerjaw.addBox(-2.5F, 0.0F, -10.0F, 5, 2, 10, 0.0F); - this.setRotateAngle(Lowerjaw, 0.045553093477052F, 0.0F, 0.0F); - this.Winglowerarmright = new ModelRenderer(this, 400, 215); - this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); - this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); - this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); - this.Lowerarmleft_1.setRotationPoint(-2.01F, 8.5F, 0.0F); - this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, -0.136659280431156F, -0.136659280431156F); - this.Lefttoeright = new ModelRenderer(this, 290, 280); - this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); - this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); - this.Clawlefthandleft = new ModelRenderer(this, 200, 260); - this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); - this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); - this.LTailMembrane = new ModelRenderer(this, 380, 250); - this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); - this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); - this.Righttoelowerright = new ModelRenderer(this, 290, 270); - this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); - this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); - this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); - this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerright.setRotationPoint(-1.8F, 0.5F, -8.0F); - this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); - this.setRotateAngle(Headmidhornlowerright, 0.091106186954104F, -0.5462880558742251F, 0.31869712141416456F); - this.Wingfinger3right = new ModelRenderer(this, 390, 170); - this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); - this.Lheadhorncrown3_1 = new ModelRenderer(this, 220, 400); - this.Lheadhorncrown3_1.setRotationPoint(0.0F, 0.5F, 3.0F); - this.Lheadhorncrown3_1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Lheadhorncrown3_1, 0.22759093446006054F, 1.0471975511965976F, 0.0F); - this.Rhorncrownlower3 = new ModelRenderer(this, 220, 400); - this.Rhorncrownlower3.setRotationPoint(0.0F, 0.5F, 3.0F); - this.Rhorncrownlower3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Rhorncrownlower3, 0.22759093446006054F, -1.0471975511965976F, 0.0F); - this.RHeadhornlargeback = new ModelRenderer(this, 190, 370); - this.RHeadhornlargeback.setRotationPoint(0.01F, 0.0F, 0.0F); - this.RHeadhornlargeback.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(RHeadhornlargeback, -0.7285004297824331F, 0.0F, 0.0F); - this.Underlowerjaw = new ModelRenderer(this, 160, 350); - this.Underlowerjaw.setRotationPoint(0.0F, 3.0F, -7.0F); - this.Underlowerjaw.addBox(-1.5F, -1.0F, -8.0F, 3, 1, 8, 0.0F); - this.setRotateAngle(Underlowerjaw, -0.091106186954104F, 0.0F, 0.0F); - this.Rightleg = new ModelRenderer(this, 260, 275); - this.Rightleg.mirror = true; - this.Rightleg.setRotationPoint(0.0F, 14.6F, 0.0F); - this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.045553093477052F, 0.091106186954104F); - this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornright2.setRotationPoint(-3.2F, 5.0F, -3.0F); - this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); - this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); - this.Spike5 = new ModelRenderer(this, 230, 500); - this.Spike5.setRotationPoint(0.0F, 0.0F, 7.7F); - this.Spike5.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike5, 0.9105382707654417F, 0.0F, 0.0F); - this.Lowerjawback = new ModelRenderer(this, 120, 330); - this.Lowerjawback.setRotationPoint(0.0F, 0.5F, 1.0F); - this.Lowerjawback.addBox(-3.0F, 0.0F, -7.0F, 6, 3, 7, 0.0F); - this.setRotateAngle(Lowerjawback, -0.091106186954104F, 0.0F, 0.0F); - this.Tooth14 = new ModelRenderer(this, 180, 500); - this.Tooth14.setRotationPoint(2.5F, 0.5F, -10.0F); - this.Tooth14.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth14, 0.22759093446006054F, 0.0F, 0.22759093446006054F); - this.RightFoot = new ModelRenderer(this, 260, 255); - this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); - this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Lheadhorncrown3 = new ModelRenderer(this, 220, 420); - this.Lheadhorncrown3.setRotationPoint(0.0F, 0.0F, 2.0F); - this.Lheadhorncrown3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); - this.setRotateAngle(Lheadhorncrown3, 0.0F, 0.8196066167365371F, 0.0F); - this.Spike9 = new ModelRenderer(this, 230, 500); - this.Spike9.setRotationPoint(0.0F, 0.0F, 13.5F); - this.Spike9.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike9, 0.40980330836826856F, 0.0F, 0.0F); - this.Tail3 = new ModelRenderer(this, 5, 335); - this.Tail3.setRotationPoint(0.0F, 0.5F, 24.0F); - this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); - this.setRotateAngle(Tail3, -0.091106186954104F, 0.0F, 0.0F); - this.Spike13 = new ModelRenderer(this, 230, 490); - this.Spike13.setRotationPoint(0.0F, 0.0F, 11.0F); - this.Spike13.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); - this.setRotateAngle(Spike13, 0.36425021489121656F, 0.0F, 0.0F); - this.RBrowback = new ModelRenderer(this, 190, 380); - this.RBrowback.setRotationPoint(0.0F, 0.0F, 5.0F); - this.RBrowback.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(RBrowback, 0.0F, 0.4553564018453205F, 0.0F); - this.Tail6 = new ModelRenderer(this, 5, 275); - this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); - this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); - this.setRotateAngle(Tail6, 0.136659280431156F, 0.0F, 0.0F); - this.Tooth4 = new ModelRenderer(this, 180, 500); - this.Tooth4.setRotationPoint(2.8F, 3.9F, -8.4F); - this.Tooth4.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth4, 0.0F, 0.0F, -0.31869712141416456F); - this.Spike15 = new ModelRenderer(this, 230, 490); - this.Spike15.setRotationPoint(0.0F, 0.0F, 12.0F); - this.Spike15.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); - this.setRotateAngle(Spike15, 0.36425021489121656F, 0.0F, 0.0F); - this.Righttoelowermid = new ModelRenderer(this, 290, 270); - this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); - this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Tooth16 = new ModelRenderer(this, 180, 500); - this.Tooth16.setRotationPoint(-2.5F, 0.4F, -4.5F); - this.Tooth16.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth16, 0.0F, 0.0F, -0.22759093446006054F); - this.Tail7 = new ModelRenderer(this, 5, 240); - this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); - this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); - this.setRotateAngle(Tail7, 0.136659280431156F, 0.0F, 0.0F); - this.BrowfrontR = new ModelRenderer(this, 190, 390); - this.BrowfrontR.setRotationPoint(-2.3F, 0.7F, -4.7F); - this.BrowfrontR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(BrowfrontR, 0.091106186954104F, -0.36425021489121656F, 0.18203784098300857F); - this.Clawrighthandleft = new ModelRenderer(this, 200, 260); - this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); - this.Wingmembramesmallright = new ModelRenderer(this, 420, 255); - this.Wingmembramesmallright.mirror = true; - this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); - this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); - this.Tooth1 = new ModelRenderer(this, 180, 500); - this.Tooth1.setRotationPoint(2.8F, 4.0F, -3.2F); - this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); - this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperright.mirror = true; - this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); - this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); - this.Rightfoot = new ModelRenderer(this, 260, 255); - this.Rightfoot.mirror = true; - this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); - this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); - this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); - this.BrowbackL = new ModelRenderer(this, 190, 380); - this.BrowbackL.setRotationPoint(0.0F, 0.0F, 5.0F); - this.BrowbackL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(BrowbackL, 0.0F, -0.4553564018453205F, 0.0F); - this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); - this.Headmidhornupperleft.setRotationPoint(0.0F, 0.1F, 2.7F); - this.Headmidhornupperleft.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, 0.091106186954104F, 0.0F); - this.Tail1 = new ModelRenderer(this, 5, 425); - this.Tail1.setRotationPoint(0.0F, 0.0F, 23.0F); - this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); - this.setRotateAngle(Tail1, -0.5462880558742251F, 0.0F, 0.0F); - this.Rhorncrownlower2 = new ModelRenderer(this, 205, 400); - this.Rhorncrownlower2.setRotationPoint(0.0F, 0.01F, 4.0F); - this.Rhorncrownlower2.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); - this.setRotateAngle(Rhorncrownlower2, 0.0F, -0.9105382707654417F, 0.0F); - this.Righttoelowerleft = new ModelRenderer(this, 290, 270); - this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); - this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.Outertoeleft = new ModelRenderer(this, 305, 280); - this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.31869712141416456F, 0.40980330836826856F); - this.Righthandmidfinger = new ModelRenderer(this, 220, 260); - this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); - this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); - this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); - this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); - this.Lowerarmleft = new ModelRenderer(this, 220, 275); - this.Lowerarmleft.mirror = true; - this.Lowerarmleft.setRotationPoint(2.01F, 8.5F, 0.0F); - this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.136659280431156F, 0.136659280431156F); - this.Spike14 = new ModelRenderer(this, 230, 490); - this.Spike14.setRotationPoint(0.0F, 0.0F, 5.0F); - this.Spike14.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); - this.setRotateAngle(Spike14, 0.36425021489121656F, 0.0F, 0.0F); - this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); - this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); - this.Lefthip = new ModelRenderer(this, 260, 300); - this.Lefthip.mirror = true; - this.Lefthip.setRotationPoint(7.0F, 5.0F, 14.0F); - this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Lefthip, -0.27314402793711257F, -0.27314402793711257F, -0.18203784098300857F); - this.Tail8 = new ModelRenderer(this, 5, 220); - this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); - this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); - this.Spike8 = new ModelRenderer(this, 230, 500); - this.Spike8.setRotationPoint(0.0F, 0.0F, 5.5F); - this.Spike8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike8, 0.40980330836826856F, 0.0F, 0.0F); - this.Lefttoemid = new ModelRenderer(this, 290, 280); - this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); - this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.Righthandleftfinger = new ModelRenderer(this, 220, 260); - this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); - this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); - this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornleft2.setRotationPoint(3.2F, 5.0F, -4.0F); - this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); - this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); - this.Righthandrightfinger = new ModelRenderer(this, 220, 260); - this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); - this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); - this.Spike6 = new ModelRenderer(this, 230, 500); - this.Spike6.setRotationPoint(0.0F, 0.0F, 15.7F); - this.Spike6.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike6, 0.8196066167365371F, 0.0F, 0.0F); - this.Tooth11 = new ModelRenderer(this, 180, 500); - this.Tooth11.setRotationPoint(2.5F, 0.6F, -1.3F); - this.Tooth11.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth11, 0.0F, 0.0F, 0.22759093446006054F); - this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); - this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); - this.Spike4 = new ModelRenderer(this, 230, 450); - this.Spike4.setRotationPoint(0.0F, 0.0F, 1.0F); - this.Spike4.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 5, 0.0F); - this.setRotateAngle(Spike4, 1.1838568316277536F, 0.0F, 0.0F); - this.Wingupperarmleft = new ModelRenderer(this, 390, 230); - this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); - this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); - this.Tooth7 = new ModelRenderer(this, 180, 500); - this.Tooth7.setRotationPoint(-2.8F, 4.0F, -3.2F); - this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); - this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); - this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); - this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); - this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); - this.Wingfinger3left = new ModelRenderer(this, 390, 170); - this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); - this.Tooth13 = new ModelRenderer(this, 180, 500); - this.Tooth13.setRotationPoint(2.5F, 0.6F, -7.5F); - this.Tooth13.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth13, 0.0F, 0.0F, 0.22759093446006054F); - this.Wingfinger1right = new ModelRenderer(this, 350, 200); - this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); - this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); - this.Wingfinger2right = new ModelRenderer(this, 330, 150); - this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); - this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); - this.Wingmembramelargeright = new ModelRenderer(this, 270, 365); - this.Wingmembramelargeright.mirror = true; - this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Lowerarmleft.addChild(this.Thumbtoeupperleft); - this.Outertoeleft.addChild(this.Outertoelowerleft); - this.Tail1.addChild(this.Spike7); - this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); - this.Outertoelowerright.addChild(this.Outertoelowerright_1); - this.Lowerjawback.addChild(this.Smallheadhornleft3); - this.Tail8.addChild(this.LTailSpike); - this.Lefthandrightfinger.addChild(this.Clawlefthandright); - this.Headback.addChild(this.Headlargehornlowerleft); - this.Rightfoot.addChild(this.Lefttoeleft); - this.Righthip.addChild(this.RightLeg); - this.RightFoot.addChild(this.Righttoeright); - this.Headmidhornlowerright.addChild(this.Headmidhornupperright); - this.Winglowerarmleft.addChild(this.Wingfinger1left); - this.Headlargehornlowerright.addChild(this.Rheadhorncrown1); - this.Body.addChild(this.Shoulderleft_1); - this.RTailSpike.addChild(this.RTailMembrane); - this.Snout.addChild(this.BrowfrontL); - this.Wingshoulderright.addChild(this.Wingupperarmright); - this.Wingfinger1left.addChild(this.Wingmembramelargeleft); - this.Headlargehornlowerright.addChild(this.Headlargehornupperright); - this.Neckend.addChild(this.Headback); - this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); - this.Lheadhorncrown1_1.addChild(this.Lheadhorncrown2); - this.Body.addChild(this.Spike1); - this.Headback.addChild(this.Headlargehornlowerright); - this.Tail4.addChild(this.Spike10); - this.Snout.addChild(this.Tooth3); - this.RightFoot.addChild(this.Righttoemid); - this.Tail6.addChild(this.Spike12); - this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); - this.Righthandmidfinger.addChild(this.Clawrighthandmid); - this.Wingfinger2left.addChild(this.Wingfingerlower2left); - this.Snout.addChild(this.Tooth9); - this.Righthandrightfinger.addChild(this.Clawrighthandright); - this.Rheadhorncrown1_1.addChild(this.Rheadhorncrown2); - this.Winglowerarmleft.addChild(this.Wingmembramemidleft); - this.Neckmid.addChild(this.Neckend); - this.Snout.addChild(this.Tooth10); - this.Lefttoeright.addChild(this.Lefttoelowerright); - this.Headlargehornupperright.addChild(this.Rheadhorncrown1_1); - this.Body.addChild(this.Wingshoulderright); - this.Body.addChild(this.Shoulderleft); - this.Body.addChild(this.Wingshoulderleft); - this.Body.addChild(this.Neckbase); - this.Tail3.addChild(this.Tail4); - this.Lefttoeleft.addChild(this.Lefttoelowerleft); - this.Tail8.addChild(this.RTailSpike); - this.Headlargehornupperleft.addChild(this.Lheadhorncrown1_1); - this.Lowerjaw.addChild(this.Tooth15); - this.Body.addChild(this.Spike2); - this.Body.addChild(this.Spike3); - this.Lowerarmleft.addChild(this.Lefthandmidfinger); - this.Wingfinger1left.addChild(this.Wingfinger2left); - this.Body.addChild(this.Belly1); - this.Headback.addChild(this.Headmidhornlowerleft); - this.Headback.addChild(this.shape151); - this.Lefthandmidfinger.addChild(this.Clawlefthandmid); - this.Underlowerjaw2.addChild(this.Underlowerjaw3); - this.Winglowerarmright.addChild(this.Wingmembramemidright); - this.Neckbase.addChild(this.Neckmid); - this.Wingfinger2right.addChild(this.Wingfingerlower2right); - this.Rheadhorncrown2.addChild(this.Rheadhorncrown3); - this.Belly1.addChild(this.Belly2); - this.Lowerjaw.addChild(this.Tooth17); - this.Tail4.addChild(this.Spike11); - this.Lowerjawback.addChild(this.Underlowerjaw2); - this.Lowerjaw.addChild(this.Tooth12); - this.RightFoot.addChild(this.Outertoelowerright); - this.Headlargehornupperleft.addChild(this.LHeadhornlargeback); - this.Tail1.addChild(this.Righthip); - this.Lheadhorncrown1.addChild(this.Lheadhorncrown2_1); - this.Wingupperarmleft.addChild(this.Winglowerarmleft); - this.RightFoot.addChild(this.Righttoeleft); - this.Lowerjawback.addChild(this.Smallheadhornright3); - this.Headlargehornlowerleft.addChild(this.Lheadhorncrown1); - this.Lefttoemid.addChild(this.Lefttoelowermid); - this.Lowerjaw.addChild(this.Tooth18); - this.Headback.addChild(this.Snout); - this.Snout.addChild(this.Tooth5); - this.Snout.addChild(this.Tooth6); - this.Lowerjawback.addChild(this.Lowerjaw); - this.Wingupperarmright.addChild(this.Winglowerarmright); - this.Shoulderleft_1.addChild(this.Lowerarmleft_1); - this.Rightfoot.addChild(this.Lefttoeright); - this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); - this.LTailSpike.addChild(this.LTailMembrane); - this.Righttoeright.addChild(this.Righttoelowerright); - this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); - this.Headback.addChild(this.Headmidhornlowerright); - this.Wingfinger1right.addChild(this.Wingfinger3right); - this.Lheadhorncrown2_1.addChild(this.Lheadhorncrown3_1); - this.Rhorncrownlower2.addChild(this.Rhorncrownlower3); - this.Headlargehornupperright.addChild(this.RHeadhornlargeback); - this.Lowerjawback.addChild(this.Underlowerjaw); - this.Lefthip.addChild(this.Rightleg); - this.Headback.addChild(this.Smallheadhornright2); - this.Tail1.addChild(this.Spike5); - this.shape151.addChild(this.Lowerjawback); - this.Lowerjaw.addChild(this.Tooth14); - this.RightLeg.addChild(this.RightFoot); - this.Lheadhorncrown2.addChild(this.Lheadhorncrown3); - this.Tail3.addChild(this.Spike9); - this.Tail1.addChild(this.Tail3); - this.Tail6.addChild(this.Spike13); - this.BrowfrontR.addChild(this.RBrowback); - this.Tail4.addChild(this.Tail6); - this.Snout.addChild(this.Tooth4); - this.Tail7.addChild(this.Spike15); - this.Righttoemid.addChild(this.Righttoelowermid); - this.Lowerjaw.addChild(this.Tooth16); - this.Tail6.addChild(this.Tail7); - this.Snout.addChild(this.BrowfrontR); - this.Righthandleftfinger.addChild(this.Clawrighthandleft); - this.Wingupperarmright.addChild(this.Wingmembramesmallright); - this.Snout.addChild(this.Tooth1); - this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); - this.Rightleg.addChild(this.Rightfoot); - this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); - this.BrowfrontL.addChild(this.BrowbackL); - this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); - this.Body.addChild(this.Tail1); - this.Rheadhorncrown1.addChild(this.Rhorncrownlower2); - this.Righttoeleft.addChild(this.Righttoelowerleft); - this.Rightfoot.addChild(this.Outertoeleft); - this.Lowerarmleft_1.addChild(this.Righthandmidfinger); - this.Wingfinger3left.addChild(this.Wingfingerlower3left); - this.Shoulderleft.addChild(this.Lowerarmleft); - this.Tail7.addChild(this.Spike14); - this.Wingfinger3right.addChild(this.Wingfingerlower3right); - this.Tail1.addChild(this.Lefthip); - this.Tail7.addChild(this.Tail8); - this.Tail3.addChild(this.Spike8); - this.Rightfoot.addChild(this.Lefttoemid); - this.Lowerarmleft_1.addChild(this.Righthandleftfinger); - this.Headback.addChild(this.Smallheadhornleft2); - this.Lowerarmleft_1.addChild(this.Righthandrightfinger); - this.Tail1.addChild(this.Spike6); - this.Lowerjaw.addChild(this.Tooth11); - this.Wingfinger1left.addChild(this.Wingfingerlower1left); - this.Tail1.addChild(this.Spike4); - this.Wingshoulderleft.addChild(this.Wingupperarmleft); - this.Snout.addChild(this.Tooth7); - this.Lowerarmleft.addChild(this.Lefthandrightfinger); - this.Wingfinger1right.addChild(this.Wingfingerlower1right); - this.Wingfinger1left.addChild(this.Wingfinger3left); - this.Lowerjaw.addChild(this.Tooth13); - this.Winglowerarmright.addChild(this.Wingfinger1right); - this.Wingfinger1right.addChild(this.Wingfinger2right); - this.Wingfinger1right.addChild(this.Wingmembramelargeright); - - - //Grouping - this.RightFoot.addChild(this.Righttoeleft); - this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); - this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); - this.Headback.addChild(this.Snout); - this.Lowerarmleft.addChild(this.Thumbtoeupperleft); - this.Rightleg.addChild(this.Rightfoot); - this.Wingfinger1left.addChild(this.Wingfinger3left); - this.Snout.addChild(this.Tooth10); - this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); - this.RightFoot.addChild(this.Righttoeright); - this.Headback.addChild(this.Headmidhornlowerright); - this.Outertoelowerright.addChild(this.Outertoelowerright_1); - this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); - this.Wingfinger1right.addChild(this.Wingfinger3right); - this.Snout.addChild(this.Tooth1); - this.Lefttoeleft.addChild(this.Lefttoelowerleft); - this.Smallheadhornright2.addChild(this.Smallheadhornright3); - this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); - this.Tail1.addChild(this.Righthip); - this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); - this.Headmidhornlowerright.addChild(this.Headmidhornupperright); - this.Snout.addChild(this.Tooth6); - this.Wingfinger3left.addChild(this.Wingfingerlower3left); - this.Lowerarmleft.addChild(this.Lefthandmidfinger); - this.Shoulderleft_1.addChild(this.Lowerarmleft_1); - this.Headback.addChild(this.Headlargehornlowerright); - this.Body.addChild(this.Wingshoulderright); - this.Righthandrightfinger.addChild(this.Clawrighthandright); - this.Lefttoemid.addChild(this.Lefttoelowermid); - this.Headback.addChild(this.Smallheadhornleft2); - this.Lefthandrightfinger.addChild(this.Clawlefthandright); - this.RTailSpike.addChild(this.RTailMembrane); - this.Lowerarmleft_1.addChild(this.Righthandrightfinger); - this.Winglowerarmleft.addChild(this.Wingmembramemidleft); - this.Body.addChild(this.Tail1); - this.Headback.addChild(this.Smallheadhornright2); - this.Lefttoeright.addChild(this.Lefttoelowerright); - this.Wingfinger1right.addChild(this.Wingmembramelargeright); - this.Wingupperarmleft.addChild(this.Winglowerarmleft); - this.Tail7.addChild(this.Tail8); - this.Snout.addChild(this.Tooth4); - this.Wingfinger1left.addChild(this.Wingfingerlower1left); - this.Tail8.addChild(this.RTailSpike); - this.RightFoot.addChild(this.Outertoelowerright); - this.Winglowerarmleft.addChild(this.Wingfinger1left); - this.Lefthandmidfinger.addChild(this.Clawlefthandmid); - this.Righttoeleft.addChild(this.Righttoelowerleft); - this.Body.addChild(this.Shoulderleft); - this.Wingshoulderleft.addChild(this.Wingupperarmleft); - this.LTailSpike.addChild(this.LTailMembrane); - this.Snout.addChild(this.Tooth3); - this.Neckmid.addChild(this.Neckend); - this.Headlargehornlowerright.addChild(this.Headlargehornupperright); - this.Righttoemid.addChild(this.Righttoelowermid); - this.Neckbase.addChild(this.Neckmid); - this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); - this.Tail6.addChild(this.Tail7); - this.RightFoot.addChild(this.Righttoemid); - this.Rightfoot.addChild(this.Lefttoeleft); - this.Righthandleftfinger.addChild(this.Clawrighthandleft); - this.Neckend.addChild(this.Headback); - //this.Headback.addChild(this.Lowerjaw); - this.Shoulderleft.addChild(this.Lowerarmleft); - this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); - this.Body.addChild(this.Shoulderleft_1); - this.Winglowerarmright.addChild(this.Wingfinger1right); - this.Wingfinger2right.addChild(this.Wingfingerlower2right); - this.RightLeg.addChild(this.RightFoot); - this.Wingfinger2left.addChild(this.Wingfingerlower2left); - this.Wingupperarmright.addChild(this.Winglowerarmright); - this.Righttoeright.addChild(this.Righttoelowerright); - this.Lefthip.addChild(this.Rightleg); - this.Snout.addChild(this.Tooth5); - this.Rightfoot.addChild(this.Outertoeleft); - this.Wingfinger1right.addChild(this.Wingfinger2right); - this.Tail8.addChild(this.LTailSpike); - this.Righthandmidfinger.addChild(this.Clawrighthandmid); - this.Snout.addChild(this.Tooth9); - this.Wingfinger1right.addChild(this.Wingfingerlower1right); - this.Wingupperarmright.addChild(this.Wingmembramesmallright); - this.Headback.addChild(this.Headlargehornlowerleft); - this.Wingfinger1left.addChild(this.Wingmembramelargeleft); - this.Wingfinger3right.addChild(this.Wingfingerlower3right); - this.Tail3.addChild(this.Tail4); - this.Tail1.addChild(this.Tail3); - this.Wingshoulderright.addChild(this.Wingupperarmright); - this.Outertoeleft.addChild(this.Outertoelowerleft); - this.Body.addChild(this.Wingshoulderleft); - this.Wingfinger1left.addChild(this.Wingfinger2left); - this.Tail1.addChild(this.Lefthip); - this.Lowerarmleft_1.addChild(this.Righthandmidfinger); - this.Lowerarmleft_1.addChild(this.Righthandleftfinger); - this.Headback.addChild(this.Headmidhornlowerleft); - this.Tail4.addChild(this.Tail6); - this.Rightfoot.addChild(this.Lefttoeright); - this.Snout.addChild(this.Tooth7); - this.Winglowerarmright.addChild(this.Wingmembramemidright); - this.Body.addChild(this.Neckbase); - this.Lowerarmleft.addChild(this.Lefthandrightfinger); - this.Righthip.addChild(this.RightLeg); - this.Rightfoot.addChild(this.Lefttoemid); - this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); - } - public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) - { - modelRenderer.rotateAngleX = x; - modelRenderer.rotateAngleY = y; - modelRenderer.rotateAngleZ = z; - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); - this.Body.render(f5); - } + public ModelVenomDragon() { + this.textureWidth = 512; + this.textureHeight = 512; + this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); + this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); + this.Outertoelowerleft = new ModelRenderer(this, 305, 270); + this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); + this.Spike7 = new ModelRenderer(this, 230, 500); + this.Spike7.setRotationPoint(0.0F, 0.0F, 22.1F); + this.Spike7.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike7, 0.5918411493512771F, 0.0F, 0.0F); + this.Wingmembramesmallleft = new ModelRenderer(this, 420, 255); + this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); + this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); + this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); + this.Outertoelowerright_1.mirror = true; + this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); + this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornleft3.setRotationPoint(2.0F, -2.4F, -2.5F); + this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(Smallheadhornleft3, -0.6373942428283291F, 0.4553564018453205F, 0.0F); + this.LTailSpike = new ModelRenderer(this, 350, 300); + this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); + this.Clawlefthandright = new ModelRenderer(this, 200, 260); + this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); + this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerleft.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 5, 0.0F); + this.setRotateAngle(Headlargehornlowerleft, 0.5462880558742251F, 0.091106186954104F, 0.36425021489121656F); + this.Lefttoeleft = new ModelRenderer(this, 290, 280); + this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); + this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); + this.RightLeg = new ModelRenderer(this, 260, 275); + this.RightLeg.setRotationPoint(0.0F, 14.6F, 0.0F); + this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.045553093477052F, -0.091106186954104F); + this.Righttoeright = new ModelRenderer(this, 290, 280); + this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); + this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); + this.Headmidhornupperright = new ModelRenderer(this, 190, 420); + this.Headmidhornupperright.setRotationPoint(0.0F, 0.1F, 2.7F); + this.Headmidhornupperright.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, -0.091106186954104F, 0.0F); + this.Wingfinger1left = new ModelRenderer(this, 350, 200); + this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); + this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); + this.Rheadhorncrown1 = new ModelRenderer(this, 190, 400); + this.Rheadhorncrown1.setRotationPoint(-2.0F, 0.0F, 1.0F); + this.Rheadhorncrown1.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 4, 0.0F); + this.setRotateAngle(Rheadhorncrown1, -0.40980330836826856F, -0.31869712141416456F, 0.40980330836826856F); + this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); + this.Shoulderleft_1.setRotationPoint(-8.0F, 11.0F, 9.0F); + this.Shoulderleft_1.addBox(-2.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); + this.RTailMembrane = new ModelRenderer(this, 381, 270); + this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); + this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); + this.BrowfrontL = new ModelRenderer(this, 190, 390); + this.BrowfrontL.setRotationPoint(2.3F, 0.7F, -4.7F); + this.BrowfrontL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(BrowfrontL, 0.091106186954104F, 0.36425021489121656F, -0.18203784098300857F); + this.Wingupperarmright = new ModelRenderer(this, 390, 230); + this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); + this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); + this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); + this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Headlargehornupperright = new ModelRenderer(this, 190, 470); + this.Headlargehornupperright.setRotationPoint(-0.1F, 0.0F, 4.5F); + this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornupperright, 0.18203784098300857F, -0.136659280431156F, 0.0F); + this.Headback = new ModelRenderer(this, 120, 390); + this.Headback.setRotationPoint(-0.01F, -0.8F, -9.0F); + this.Headback.addBox(-3.5F, 0.0F, -11.0F, 7, 6, 11, 0.0F); + this.setRotateAngle(Headback, 0.27314402793711257F, 0.0F, 0.0F); + this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); + this.Headlargehornupperleft.setRotationPoint(0.1F, 0.0F, 4.5F); + this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornupperleft, 0.18203784098300857F, 0.136659280431156F, 0.0F); + this.Lheadhorncrown2 = new ModelRenderer(this, 205, 420); + this.Lheadhorncrown2.setRotationPoint(0.0F, 0.0F, 3.0F); + this.Lheadhorncrown2.addBox(0.0F, 0.0F, 0.0F, 2, 1, 2, 0.0F); + this.setRotateAngle(Lheadhorncrown2, 0.0F, 0.7285004297824331F, 0.0F); + this.Spike1 = new ModelRenderer(this, 230, 500); + this.Spike1.setRotationPoint(0.0F, 0.0F, 1.0F); + this.Spike1.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike1, 0.8196066167365371F, 0.0F, 0.0F); + this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerright.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 5, 0.0F); + this.setRotateAngle(Headlargehornlowerright, 0.5462880558742251F, -0.091106186954104F, -0.36425021489121656F); + this.Spike10 = new ModelRenderer(this, 230, 500); + this.Spike10.setRotationPoint(0.0F, 0.0F, 3.0F); + this.Spike10.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike10, 0.36425021489121656F, 0.0F, 0.0F); + this.Tooth3 = new ModelRenderer(this, 180, 500); + this.Tooth3.setRotationPoint(2.7F, 4.0F, -6.1F); + this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); + this.Righttoemid = new ModelRenderer(this, 290, 280); + this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); + this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.Spike12 = new ModelRenderer(this, 230, 490); + this.Spike12.setRotationPoint(0.0F, 0.0F, 3.0F); + this.Spike12.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); + this.setRotateAngle(Spike12, 0.36425021489121656F, 0.0F, 0.0F); + this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); + this.Thumbtoelowerright.mirror = true; + this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); + this.Clawrighthandmid = new ModelRenderer(this, 200, 260); + this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Body = new ModelRenderer(this, 5, 470); + this.Body.setRotationPoint(0.0F, -4.0F, -23.0F); + this.Body.addBox(-9.0F, 0.0F, 0.0F, 18, 18, 23, 0.0F); + this.setRotateAngle(Body, 0.5009094953223726F, 0.0F, 0.0F); + this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); + this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); + this.Tooth9 = new ModelRenderer(this, 180, 500); + this.Tooth9.setRotationPoint(-2.7F, 4.0F, -6.1F); + this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); + this.Clawrighthandright = new ModelRenderer(this, 200, 260); + this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); + this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); + this.Rheadhorncrown2 = new ModelRenderer(this, 205, 420); + this.Rheadhorncrown2.setRotationPoint(0.0F, 0.0F, 3.0F); + this.Rheadhorncrown2.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 2, 0.0F); + this.setRotateAngle(Rheadhorncrown2, 0.0F, -0.7285004297824331F, 0.0F); + this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); + this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); + this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); + this.Neckend = new ModelRenderer(this, 120, 420); + this.Neckend.setRotationPoint(0.0F, 0.5F, -8.0F); + this.Neckend.addBox(-3.5F, 0.0F, -9.0F, 7, 9, 9, 0.0F); + this.setRotateAngle(Neckend, 0.18203784098300857F, 0.0F, 0.0F); + this.Tooth10 = new ModelRenderer(this, 180, 500); + this.Tooth10.setRotationPoint(-2.8F, 3.9F, -8.4F); + this.Tooth10.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth10, 0.0F, 0.0F, 0.22759093446006054F); + this.Lefttoelowerright = new ModelRenderer(this, 290, 270); + this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); + this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Rheadhorncrown1_1 = new ModelRenderer(this, 190, 420); + this.Rheadhorncrown1_1.setRotationPoint(-0.4F, 0.0F, 2.51F); + this.Rheadhorncrown1_1.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(Rheadhorncrown1_1, -0.091106186954104F, -0.6373942428283291F, -0.091106186954104F); + this.Wingshoulderright = new ModelRenderer(this, 470, 230); + this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 4.0F); + this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); + this.Shoulderleft = new ModelRenderer(this, 220, 300); + this.Shoulderleft.mirror = true; + this.Shoulderleft.setRotationPoint(8.0F, 11.0F, 9.0F); + this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); + this.Wingshoulderleft = new ModelRenderer(this, 470, 230); + this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 4.0F); + this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); + this.Neckbase = new ModelRenderer(this, 120, 470); + this.Neckbase.setRotationPoint(0.0F, 2.0F, 7.0F); + this.Neckbase.addBox(-6.0F, 0.0F, -13.0F, 12, 14, 13, 0.0F); + this.setRotateAngle(Neckbase, -0.136659280431156F, 0.0F, 0.0F); + this.Tail4 = new ModelRenderer(this, 5, 300); + this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); + this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); + this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); + this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); + this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.RTailSpike = new ModelRenderer(this, 350, 300); + this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); + this.Lheadhorncrown1_1 = new ModelRenderer(this, 190, 420); + this.Lheadhorncrown1_1.setRotationPoint(0.4F, 0.0F, 2.51F); + this.Lheadhorncrown1_1.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(Lheadhorncrown1_1, 0.091106186954104F, 0.6373942428283291F, 0.18203784098300857F); + this.Tooth15 = new ModelRenderer(this, 180, 500); + this.Tooth15.setRotationPoint(-2.5F, 0.6F, -1.3F); + this.Tooth15.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth15, 0.0F, 0.0F, -0.22759093446006054F); + this.Spike2 = new ModelRenderer(this, 230, 475); + this.Spike2.setRotationPoint(0.0F, 0.0F, 8.0F); + this.Spike2.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 7, 0.0F); + this.setRotateAngle(Spike2, 0.9560913642424937F, 0.0F, 0.0F); + this.Spike3 = new ModelRenderer(this, 230, 460); + this.Spike3.setRotationPoint(0.0F, 0.0F, 16.0F); + this.Spike3.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 8, 0.0F); + this.setRotateAngle(Spike3, 0.9560913642424937F, 0.0F, 0.0F); + this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); + this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); + this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); + this.Wingfinger2left = new ModelRenderer(this, 330, 150); + this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); + this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); + this.Belly1 = new ModelRenderer(this, 0, 180); + this.Belly1.setRotationPoint(0.0F, 18.0F, 0.0F); + this.Belly1.addBox(-7.5F, -11.0F, 0.0F, 15, 11, 21, 0.0F); + this.setRotateAngle(Belly1, -0.27314402793711257F, 0.0F, 0.0F); + this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerleft.setRotationPoint(1.8F, 0.5F, -8.0F); + this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); + this.setRotateAngle(Headmidhornlowerleft, 0.091106186954104F, 0.5462880558742251F, -0.31869712141416456F); + this.shape151 = new ModelRenderer(this, 120, 320); + this.shape151.setRotationPoint(0.0F, 6.0F, -3.0F); + this.shape151.addBox(-2.5F, 0.0F, -5.0F, 5, 3, 6, 0.0F); + this.Clawlefthandmid = new ModelRenderer(this, 200, 260); + this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Underlowerjaw3 = new ModelRenderer(this, 160, 325); + this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Underlowerjaw3.addBox(-2.0F, -3.0F, 0.0F, 4, 3, 6, 0.0F); + this.setRotateAngle(Underlowerjaw3, 0.31869712141416456F, 0.0F, 0.0F); + this.Wingmembramemidright = new ModelRenderer(this, 350, 340); + this.Wingmembramemidright.mirror = true; + this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); + this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); + this.Neckmid = new ModelRenderer(this, 120, 445); + this.Neckmid.setRotationPoint(0.0F, 2.6F, -7.0F); + this.Neckmid.addBox(-4.5F, 0.0F, -10.0F, 9, 11, 10, 0.0F); + this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); + this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); + this.Rheadhorncrown3 = new ModelRenderer(this, 220, 420); + this.Rheadhorncrown3.setRotationPoint(0.0F, 0.0F, 2.0F); + this.Rheadhorncrown3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); + this.setRotateAngle(Rheadhorncrown3, 0.0F, -0.8196066167365371F, 0.0F); + this.Belly2 = new ModelRenderer(this, 5, 145); + this.Belly2.setRotationPoint(0.0F, 0.0F, 21.0F); + this.Belly2.addBox(-5.5F, -9.0F, 0.0F, 11, 9, 20, 0.0F); + this.setRotateAngle(Belly2, 0.18203784098300857F, 0.0F, 0.0F); + this.Tooth17 = new ModelRenderer(this, 180, 500); + this.Tooth17.setRotationPoint(-2.5F, 0.6F, -7.5F); + this.Tooth17.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth17, 0.0F, 0.0F, -0.22759093446006054F); + this.Spike11 = new ModelRenderer(this, 230, 490); + this.Spike11.setRotationPoint(0.0F, 0.0F, 11.0F); + this.Spike11.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); + this.setRotateAngle(Spike11, 0.36425021489121656F, 0.0F, 0.0F); + this.Underlowerjaw2 = new ModelRenderer(this, 160, 340); + this.Underlowerjaw2.setRotationPoint(0.0F, 4.0F, -3.0F); + this.Underlowerjaw2.addBox(-2.0F, -1.0F, -4.0F, 4, 1, 4, 0.0F); + this.setRotateAngle(Underlowerjaw2, -0.22759093446006054F, 0.0F, 0.0F); + this.Tooth12 = new ModelRenderer(this, 180, 500); + this.Tooth12.setRotationPoint(2.5F, 0.4F, -4.5F); + this.Tooth12.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth12, 0.0F, 0.0F, 0.22759093446006054F); + this.Outertoelowerright = new ModelRenderer(this, 320, 280); + this.Outertoelowerright.mirror = true; + this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); + this.LHeadhornlargeback = new ModelRenderer(this, 190, 370); + this.LHeadhornlargeback.setRotationPoint(-0.01F, 0.0F, 0.0F); + this.LHeadhornlargeback.addBox(0.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(LHeadhornlargeback, -0.7285004297824331F, 0.0F, 0.0F); + this.Righthip = new ModelRenderer(this, 260, 300); + this.Righthip.setRotationPoint(-7.0F, 5.0F, 14.0F); + this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Righthip, -0.27314402793711257F, 0.27314402793711257F, 0.18203784098300857F); + this.Lheadhorncrown2_1 = new ModelRenderer(this, 205, 400); + this.Lheadhorncrown2_1.setRotationPoint(0.0F, 0.01F, 4.0F); + this.Lheadhorncrown2_1.addBox(0.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); + this.setRotateAngle(Lheadhorncrown2_1, 0.0F, 0.9105382707654417F, 0.0F); + this.Winglowerarmleft = new ModelRenderer(this, 400, 215); + this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); + this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); + this.Righttoeleft = new ModelRenderer(this, 290, 280); + this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); + this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); + this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornright3.setRotationPoint(-2.0F, -2.4F, -1.5F); + this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(Smallheadhornright3, -0.6373942428283291F, -0.4553564018453205F, 0.0F); + this.Lheadhorncrown1 = new ModelRenderer(this, 190, 400); + this.Lheadhorncrown1.setRotationPoint(2.0F, 0.0F, 1.0F); + this.Lheadhorncrown1.addBox(0.0F, 0.0F, 0.0F, 2, 2, 4, 0.0F); + this.setRotateAngle(Lheadhorncrown1, -0.40980330836826856F, 0.31869712141416456F, -0.40980330836826856F); + this.Lefttoelowermid = new ModelRenderer(this, 290, 270); + this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); + this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Tooth18 = new ModelRenderer(this, 180, 500); + this.Tooth18.setRotationPoint(-2.5F, 0.6F, -10.0F); + this.Tooth18.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth18, 0.22759093446006054F, 0.0F, -0.22759093446006054F); + this.Snout = new ModelRenderer(this, 120, 365); + this.Snout.setRotationPoint(0.0F, 0.61F, -9.0F); + this.Snout.addBox(-3.0F, 0.0F, -10.0F, 6, 5, 10, 0.0F); + this.setRotateAngle(Snout, -0.045553093477052F, 0.0F, 0.015533430342749534F); + this.Tooth5 = new ModelRenderer(this, 180, 500); + this.Tooth5.setRotationPoint(0.4F, 4.3F, -8.9F); + this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); + this.Tooth6 = new ModelRenderer(this, 180, 500); + this.Tooth6.setRotationPoint(-0.4F, 4.3F, -8.9F); + this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); + this.Lowerjaw = new ModelRenderer(this, 120, 345); + this.Lowerjaw.setRotationPoint(0.0F, -0.05F, -6.7F); + this.Lowerjaw.addBox(-2.5F, 0.0F, -10.0F, 5, 2, 10, 0.0F); + this.setRotateAngle(Lowerjaw, 0.045553093477052F, 0.0F, 0.0F); + this.Winglowerarmright = new ModelRenderer(this, 400, 215); + this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); + this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); + this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); + this.Lowerarmleft_1.setRotationPoint(-2.01F, 8.5F, 0.0F); + this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, -0.136659280431156F, -0.136659280431156F); + this.Lefttoeright = new ModelRenderer(this, 290, 280); + this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); + this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); + this.Clawlefthandleft = new ModelRenderer(this, 200, 260); + this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); + this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); + this.LTailMembrane = new ModelRenderer(this, 380, 250); + this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); + this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); + this.Righttoelowerright = new ModelRenderer(this, 290, 270); + this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); + this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); + this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); + this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerright.setRotationPoint(-1.8F, 0.5F, -8.0F); + this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); + this.setRotateAngle(Headmidhornlowerright, 0.091106186954104F, -0.5462880558742251F, 0.31869712141416456F); + this.Wingfinger3right = new ModelRenderer(this, 390, 170); + this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); + this.Lheadhorncrown3_1 = new ModelRenderer(this, 220, 400); + this.Lheadhorncrown3_1.setRotationPoint(0.0F, 0.5F, 3.0F); + this.Lheadhorncrown3_1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Lheadhorncrown3_1, 0.22759093446006054F, 1.0471975511965976F, 0.0F); + this.Rhorncrownlower3 = new ModelRenderer(this, 220, 400); + this.Rhorncrownlower3.setRotationPoint(0.0F, 0.5F, 3.0F); + this.Rhorncrownlower3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Rhorncrownlower3, 0.22759093446006054F, -1.0471975511965976F, 0.0F); + this.RHeadhornlargeback = new ModelRenderer(this, 190, 370); + this.RHeadhornlargeback.setRotationPoint(0.01F, 0.0F, 0.0F); + this.RHeadhornlargeback.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(RHeadhornlargeback, -0.7285004297824331F, 0.0F, 0.0F); + this.Underlowerjaw = new ModelRenderer(this, 160, 350); + this.Underlowerjaw.setRotationPoint(0.0F, 3.0F, -7.0F); + this.Underlowerjaw.addBox(-1.5F, -1.0F, -8.0F, 3, 1, 8, 0.0F); + this.setRotateAngle(Underlowerjaw, -0.091106186954104F, 0.0F, 0.0F); + this.Rightleg = new ModelRenderer(this, 260, 275); + this.Rightleg.mirror = true; + this.Rightleg.setRotationPoint(0.0F, 14.6F, 0.0F); + this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.045553093477052F, 0.091106186954104F); + this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornright2.setRotationPoint(-3.2F, 5.0F, -3.0F); + this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); + this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); + this.Spike5 = new ModelRenderer(this, 230, 500); + this.Spike5.setRotationPoint(0.0F, 0.0F, 7.7F); + this.Spike5.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike5, 0.9105382707654417F, 0.0F, 0.0F); + this.Lowerjawback = new ModelRenderer(this, 120, 330); + this.Lowerjawback.setRotationPoint(0.0F, 0.5F, 1.0F); + this.Lowerjawback.addBox(-3.0F, 0.0F, -7.0F, 6, 3, 7, 0.0F); + this.setRotateAngle(Lowerjawback, -0.091106186954104F, 0.0F, 0.0F); + this.Tooth14 = new ModelRenderer(this, 180, 500); + this.Tooth14.setRotationPoint(2.5F, 0.5F, -10.0F); + this.Tooth14.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth14, 0.22759093446006054F, 0.0F, 0.22759093446006054F); + this.RightFoot = new ModelRenderer(this, 260, 255); + this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); + this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Lheadhorncrown3 = new ModelRenderer(this, 220, 420); + this.Lheadhorncrown3.setRotationPoint(0.0F, 0.0F, 2.0F); + this.Lheadhorncrown3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); + this.setRotateAngle(Lheadhorncrown3, 0.0F, 0.8196066167365371F, 0.0F); + this.Spike9 = new ModelRenderer(this, 230, 500); + this.Spike9.setRotationPoint(0.0F, 0.0F, 13.5F); + this.Spike9.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike9, 0.40980330836826856F, 0.0F, 0.0F); + this.Tail3 = new ModelRenderer(this, 5, 335); + this.Tail3.setRotationPoint(0.0F, 0.5F, 24.0F); + this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); + this.setRotateAngle(Tail3, -0.091106186954104F, 0.0F, 0.0F); + this.Spike13 = new ModelRenderer(this, 230, 490); + this.Spike13.setRotationPoint(0.0F, 0.0F, 11.0F); + this.Spike13.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); + this.setRotateAngle(Spike13, 0.36425021489121656F, 0.0F, 0.0F); + this.RBrowback = new ModelRenderer(this, 190, 380); + this.RBrowback.setRotationPoint(0.0F, 0.0F, 5.0F); + this.RBrowback.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(RBrowback, 0.0F, 0.4553564018453205F, 0.0F); + this.Tail6 = new ModelRenderer(this, 5, 275); + this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); + this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); + this.setRotateAngle(Tail6, 0.136659280431156F, 0.0F, 0.0F); + this.Tooth4 = new ModelRenderer(this, 180, 500); + this.Tooth4.setRotationPoint(2.8F, 3.9F, -8.4F); + this.Tooth4.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth4, 0.0F, 0.0F, -0.31869712141416456F); + this.Spike15 = new ModelRenderer(this, 230, 490); + this.Spike15.setRotationPoint(0.0F, 0.0F, 12.0F); + this.Spike15.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); + this.setRotateAngle(Spike15, 0.36425021489121656F, 0.0F, 0.0F); + this.Righttoelowermid = new ModelRenderer(this, 290, 270); + this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); + this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Tooth16 = new ModelRenderer(this, 180, 500); + this.Tooth16.setRotationPoint(-2.5F, 0.4F, -4.5F); + this.Tooth16.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth16, 0.0F, 0.0F, -0.22759093446006054F); + this.Tail7 = new ModelRenderer(this, 5, 240); + this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); + this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); + this.setRotateAngle(Tail7, 0.136659280431156F, 0.0F, 0.0F); + this.BrowfrontR = new ModelRenderer(this, 190, 390); + this.BrowfrontR.setRotationPoint(-2.3F, 0.7F, -4.7F); + this.BrowfrontR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(BrowfrontR, 0.091106186954104F, -0.36425021489121656F, 0.18203784098300857F); + this.Clawrighthandleft = new ModelRenderer(this, 200, 260); + this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); + this.Wingmembramesmallright = new ModelRenderer(this, 420, 255); + this.Wingmembramesmallright.mirror = true; + this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); + this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); + this.Tooth1 = new ModelRenderer(this, 180, 500); + this.Tooth1.setRotationPoint(2.8F, 4.0F, -3.2F); + this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); + this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperright.mirror = true; + this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); + this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); + this.Rightfoot = new ModelRenderer(this, 260, 255); + this.Rightfoot.mirror = true; + this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); + this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); + this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); + this.BrowbackL = new ModelRenderer(this, 190, 380); + this.BrowbackL.setRotationPoint(0.0F, 0.0F, 5.0F); + this.BrowbackL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(BrowbackL, 0.0F, -0.4553564018453205F, 0.0F); + this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); + this.Headmidhornupperleft.setRotationPoint(0.0F, 0.1F, 2.7F); + this.Headmidhornupperleft.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, 0.091106186954104F, 0.0F); + this.Tail1 = new ModelRenderer(this, 5, 425); + this.Tail1.setRotationPoint(0.0F, 0.0F, 23.0F); + this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); + this.setRotateAngle(Tail1, -0.5462880558742251F, 0.0F, 0.0F); + this.Rhorncrownlower2 = new ModelRenderer(this, 205, 400); + this.Rhorncrownlower2.setRotationPoint(0.0F, 0.01F, 4.0F); + this.Rhorncrownlower2.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); + this.setRotateAngle(Rhorncrownlower2, 0.0F, -0.9105382707654417F, 0.0F); + this.Righttoelowerleft = new ModelRenderer(this, 290, 270); + this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); + this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.Outertoeleft = new ModelRenderer(this, 305, 280); + this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.31869712141416456F, 0.40980330836826856F); + this.Righthandmidfinger = new ModelRenderer(this, 220, 260); + this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); + this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); + this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); + this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); + this.Lowerarmleft = new ModelRenderer(this, 220, 275); + this.Lowerarmleft.mirror = true; + this.Lowerarmleft.setRotationPoint(2.01F, 8.5F, 0.0F); + this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.136659280431156F, 0.136659280431156F); + this.Spike14 = new ModelRenderer(this, 230, 490); + this.Spike14.setRotationPoint(0.0F, 0.0F, 5.0F); + this.Spike14.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); + this.setRotateAngle(Spike14, 0.36425021489121656F, 0.0F, 0.0F); + this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); + this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); + this.Lefthip = new ModelRenderer(this, 260, 300); + this.Lefthip.mirror = true; + this.Lefthip.setRotationPoint(7.0F, 5.0F, 14.0F); + this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Lefthip, -0.27314402793711257F, -0.27314402793711257F, -0.18203784098300857F); + this.Tail8 = new ModelRenderer(this, 5, 220); + this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); + this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); + this.Spike8 = new ModelRenderer(this, 230, 500); + this.Spike8.setRotationPoint(0.0F, 0.0F, 5.5F); + this.Spike8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike8, 0.40980330836826856F, 0.0F, 0.0F); + this.Lefttoemid = new ModelRenderer(this, 290, 280); + this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); + this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.Righthandleftfinger = new ModelRenderer(this, 220, 260); + this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); + this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); + this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornleft2.setRotationPoint(3.2F, 5.0F, -4.0F); + this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); + this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); + this.Righthandrightfinger = new ModelRenderer(this, 220, 260); + this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); + this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); + this.Spike6 = new ModelRenderer(this, 230, 500); + this.Spike6.setRotationPoint(0.0F, 0.0F, 15.7F); + this.Spike6.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike6, 0.8196066167365371F, 0.0F, 0.0F); + this.Tooth11 = new ModelRenderer(this, 180, 500); + this.Tooth11.setRotationPoint(2.5F, 0.6F, -1.3F); + this.Tooth11.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth11, 0.0F, 0.0F, 0.22759093446006054F); + this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); + this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); + this.Spike4 = new ModelRenderer(this, 230, 450); + this.Spike4.setRotationPoint(0.0F, 0.0F, 1.0F); + this.Spike4.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 5, 0.0F); + this.setRotateAngle(Spike4, 1.1838568316277536F, 0.0F, 0.0F); + this.Wingupperarmleft = new ModelRenderer(this, 390, 230); + this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); + this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); + this.Tooth7 = new ModelRenderer(this, 180, 500); + this.Tooth7.setRotationPoint(-2.8F, 4.0F, -3.2F); + this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); + this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); + this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); + this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); + this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); + this.Wingfinger3left = new ModelRenderer(this, 390, 170); + this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); + this.Tooth13 = new ModelRenderer(this, 180, 500); + this.Tooth13.setRotationPoint(2.5F, 0.6F, -7.5F); + this.Tooth13.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth13, 0.0F, 0.0F, 0.22759093446006054F); + this.Wingfinger1right = new ModelRenderer(this, 350, 200); + this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); + this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); + this.Wingfinger2right = new ModelRenderer(this, 330, 150); + this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); + this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); + this.Wingmembramelargeright = new ModelRenderer(this, 270, 365); + this.Wingmembramelargeright.mirror = true; + this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Lowerarmleft.addChild(this.Thumbtoeupperleft); + this.Outertoeleft.addChild(this.Outertoelowerleft); + this.Tail1.addChild(this.Spike7); + this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); + this.Outertoelowerright.addChild(this.Outertoelowerright_1); + this.Lowerjawback.addChild(this.Smallheadhornleft3); + this.Tail8.addChild(this.LTailSpike); + this.Lefthandrightfinger.addChild(this.Clawlefthandright); + this.Headback.addChild(this.Headlargehornlowerleft); + this.Rightfoot.addChild(this.Lefttoeleft); + this.Righthip.addChild(this.RightLeg); + this.RightFoot.addChild(this.Righttoeright); + this.Headmidhornlowerright.addChild(this.Headmidhornupperright); + this.Winglowerarmleft.addChild(this.Wingfinger1left); + this.Headlargehornlowerright.addChild(this.Rheadhorncrown1); + this.Body.addChild(this.Shoulderleft_1); + this.RTailSpike.addChild(this.RTailMembrane); + this.Snout.addChild(this.BrowfrontL); + this.Wingshoulderright.addChild(this.Wingupperarmright); + this.Wingfinger1left.addChild(this.Wingmembramelargeleft); + this.Headlargehornlowerright.addChild(this.Headlargehornupperright); + this.Neckend.addChild(this.Headback); + this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); + this.Lheadhorncrown1_1.addChild(this.Lheadhorncrown2); + this.Body.addChild(this.Spike1); + this.Headback.addChild(this.Headlargehornlowerright); + this.Tail4.addChild(this.Spike10); + this.Snout.addChild(this.Tooth3); + this.RightFoot.addChild(this.Righttoemid); + this.Tail6.addChild(this.Spike12); + this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); + this.Righthandmidfinger.addChild(this.Clawrighthandmid); + this.Wingfinger2left.addChild(this.Wingfingerlower2left); + this.Snout.addChild(this.Tooth9); + this.Righthandrightfinger.addChild(this.Clawrighthandright); + this.Rheadhorncrown1_1.addChild(this.Rheadhorncrown2); + this.Winglowerarmleft.addChild(this.Wingmembramemidleft); + this.Neckmid.addChild(this.Neckend); + this.Snout.addChild(this.Tooth10); + this.Lefttoeright.addChild(this.Lefttoelowerright); + this.Headlargehornupperright.addChild(this.Rheadhorncrown1_1); + this.Body.addChild(this.Wingshoulderright); + this.Body.addChild(this.Shoulderleft); + this.Body.addChild(this.Wingshoulderleft); + this.Body.addChild(this.Neckbase); + this.Tail3.addChild(this.Tail4); + this.Lefttoeleft.addChild(this.Lefttoelowerleft); + this.Tail8.addChild(this.RTailSpike); + this.Headlargehornupperleft.addChild(this.Lheadhorncrown1_1); + this.Lowerjaw.addChild(this.Tooth15); + this.Body.addChild(this.Spike2); + this.Body.addChild(this.Spike3); + this.Lowerarmleft.addChild(this.Lefthandmidfinger); + this.Wingfinger1left.addChild(this.Wingfinger2left); + this.Body.addChild(this.Belly1); + this.Headback.addChild(this.Headmidhornlowerleft); + this.Headback.addChild(this.shape151); + this.Lefthandmidfinger.addChild(this.Clawlefthandmid); + this.Underlowerjaw2.addChild(this.Underlowerjaw3); + this.Winglowerarmright.addChild(this.Wingmembramemidright); + this.Neckbase.addChild(this.Neckmid); + this.Wingfinger2right.addChild(this.Wingfingerlower2right); + this.Rheadhorncrown2.addChild(this.Rheadhorncrown3); + this.Belly1.addChild(this.Belly2); + this.Lowerjaw.addChild(this.Tooth17); + this.Tail4.addChild(this.Spike11); + this.Lowerjawback.addChild(this.Underlowerjaw2); + this.Lowerjaw.addChild(this.Tooth12); + this.RightFoot.addChild(this.Outertoelowerright); + this.Headlargehornupperleft.addChild(this.LHeadhornlargeback); + this.Tail1.addChild(this.Righthip); + this.Lheadhorncrown1.addChild(this.Lheadhorncrown2_1); + this.Wingupperarmleft.addChild(this.Winglowerarmleft); + this.RightFoot.addChild(this.Righttoeleft); + this.Lowerjawback.addChild(this.Smallheadhornright3); + this.Headlargehornlowerleft.addChild(this.Lheadhorncrown1); + this.Lefttoemid.addChild(this.Lefttoelowermid); + this.Lowerjaw.addChild(this.Tooth18); + this.Headback.addChild(this.Snout); + this.Snout.addChild(this.Tooth5); + this.Snout.addChild(this.Tooth6); + this.Lowerjawback.addChild(this.Lowerjaw); + this.Wingupperarmright.addChild(this.Winglowerarmright); + this.Shoulderleft_1.addChild(this.Lowerarmleft_1); + this.Rightfoot.addChild(this.Lefttoeright); + this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); + this.LTailSpike.addChild(this.LTailMembrane); + this.Righttoeright.addChild(this.Righttoelowerright); + this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); + this.Headback.addChild(this.Headmidhornlowerright); + this.Wingfinger1right.addChild(this.Wingfinger3right); + this.Lheadhorncrown2_1.addChild(this.Lheadhorncrown3_1); + this.Rhorncrownlower2.addChild(this.Rhorncrownlower3); + this.Headlargehornupperright.addChild(this.RHeadhornlargeback); + this.Lowerjawback.addChild(this.Underlowerjaw); + this.Lefthip.addChild(this.Rightleg); + this.Headback.addChild(this.Smallheadhornright2); + this.Tail1.addChild(this.Spike5); + this.shape151.addChild(this.Lowerjawback); + this.Lowerjaw.addChild(this.Tooth14); + this.RightLeg.addChild(this.RightFoot); + this.Lheadhorncrown2.addChild(this.Lheadhorncrown3); + this.Tail3.addChild(this.Spike9); + this.Tail1.addChild(this.Tail3); + this.Tail6.addChild(this.Spike13); + this.BrowfrontR.addChild(this.RBrowback); + this.Tail4.addChild(this.Tail6); + this.Snout.addChild(this.Tooth4); + this.Tail7.addChild(this.Spike15); + this.Righttoemid.addChild(this.Righttoelowermid); + this.Lowerjaw.addChild(this.Tooth16); + this.Tail6.addChild(this.Tail7); + this.Snout.addChild(this.BrowfrontR); + this.Righthandleftfinger.addChild(this.Clawrighthandleft); + this.Wingupperarmright.addChild(this.Wingmembramesmallright); + this.Snout.addChild(this.Tooth1); + this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); + this.Rightleg.addChild(this.Rightfoot); + this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); + this.BrowfrontL.addChild(this.BrowbackL); + this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); + this.Body.addChild(this.Tail1); + this.Rheadhorncrown1.addChild(this.Rhorncrownlower2); + this.Righttoeleft.addChild(this.Righttoelowerleft); + this.Rightfoot.addChild(this.Outertoeleft); + this.Lowerarmleft_1.addChild(this.Righthandmidfinger); + this.Wingfinger3left.addChild(this.Wingfingerlower3left); + this.Shoulderleft.addChild(this.Lowerarmleft); + this.Tail7.addChild(this.Spike14); + this.Wingfinger3right.addChild(this.Wingfingerlower3right); + this.Tail1.addChild(this.Lefthip); + this.Tail7.addChild(this.Tail8); + this.Tail3.addChild(this.Spike8); + this.Rightfoot.addChild(this.Lefttoemid); + this.Lowerarmleft_1.addChild(this.Righthandleftfinger); + this.Headback.addChild(this.Smallheadhornleft2); + this.Lowerarmleft_1.addChild(this.Righthandrightfinger); + this.Tail1.addChild(this.Spike6); + this.Lowerjaw.addChild(this.Tooth11); + this.Wingfinger1left.addChild(this.Wingfingerlower1left); + this.Tail1.addChild(this.Spike4); + this.Wingshoulderleft.addChild(this.Wingupperarmleft); + this.Snout.addChild(this.Tooth7); + this.Lowerarmleft.addChild(this.Lefthandrightfinger); + this.Wingfinger1right.addChild(this.Wingfingerlower1right); + this.Wingfinger1left.addChild(this.Wingfinger3left); + this.Lowerjaw.addChild(this.Tooth13); + this.Winglowerarmright.addChild(this.Wingfinger1right); + this.Wingfinger1right.addChild(this.Wingfinger2right); + this.Wingfinger1right.addChild(this.Wingmembramelargeright); - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + // Grouping + this.RightFoot.addChild(this.Righttoeleft); + this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); + this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); + this.Headback.addChild(this.Snout); + this.Lowerarmleft.addChild(this.Thumbtoeupperleft); + this.Rightleg.addChild(this.Rightfoot); + this.Wingfinger1left.addChild(this.Wingfinger3left); + this.Snout.addChild(this.Tooth10); + this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); + this.RightFoot.addChild(this.Righttoeright); + this.Headback.addChild(this.Headmidhornlowerright); + this.Outertoelowerright.addChild(this.Outertoelowerright_1); + this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); + this.Wingfinger1right.addChild(this.Wingfinger3right); + this.Snout.addChild(this.Tooth1); + this.Lefttoeleft.addChild(this.Lefttoelowerleft); + this.Smallheadhornright2.addChild(this.Smallheadhornright3); + this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); + this.Tail1.addChild(this.Righthip); + this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); + this.Headmidhornlowerright.addChild(this.Headmidhornupperright); + this.Snout.addChild(this.Tooth6); + this.Wingfinger3left.addChild(this.Wingfingerlower3left); + this.Lowerarmleft.addChild(this.Lefthandmidfinger); + this.Shoulderleft_1.addChild(this.Lowerarmleft_1); + this.Headback.addChild(this.Headlargehornlowerright); + this.Body.addChild(this.Wingshoulderright); + this.Righthandrightfinger.addChild(this.Clawrighthandright); + this.Lefttoemid.addChild(this.Lefttoelowermid); + this.Headback.addChild(this.Smallheadhornleft2); + this.Lefthandrightfinger.addChild(this.Clawlefthandright); + this.RTailSpike.addChild(this.RTailMembrane); + this.Lowerarmleft_1.addChild(this.Righthandrightfinger); + this.Winglowerarmleft.addChild(this.Wingmembramemidleft); + this.Body.addChild(this.Tail1); + this.Headback.addChild(this.Smallheadhornright2); + this.Lefttoeright.addChild(this.Lefttoelowerright); + this.Wingfinger1right.addChild(this.Wingmembramelargeright); + this.Wingupperarmleft.addChild(this.Winglowerarmleft); + this.Tail7.addChild(this.Tail8); + this.Snout.addChild(this.Tooth4); + this.Wingfinger1left.addChild(this.Wingfingerlower1left); + this.Tail8.addChild(this.RTailSpike); + this.RightFoot.addChild(this.Outertoelowerright); + this.Winglowerarmleft.addChild(this.Wingfinger1left); + this.Lefthandmidfinger.addChild(this.Clawlefthandmid); + this.Righttoeleft.addChild(this.Righttoelowerleft); + this.Body.addChild(this.Shoulderleft); + this.Wingshoulderleft.addChild(this.Wingupperarmleft); + this.LTailSpike.addChild(this.LTailMembrane); + this.Snout.addChild(this.Tooth3); + this.Neckmid.addChild(this.Neckend); + this.Headlargehornlowerright.addChild(this.Headlargehornupperright); + this.Righttoemid.addChild(this.Righttoelowermid); + this.Neckbase.addChild(this.Neckmid); + this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); + this.Tail6.addChild(this.Tail7); + this.RightFoot.addChild(this.Righttoemid); + this.Rightfoot.addChild(this.Lefttoeleft); + this.Righthandleftfinger.addChild(this.Clawrighthandleft); + this.Neckend.addChild(this.Headback); + // this.Headback.addChild(this.Lowerjaw); + this.Shoulderleft.addChild(this.Lowerarmleft); + this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); + this.Body.addChild(this.Shoulderleft_1); + this.Winglowerarmright.addChild(this.Wingfinger1right); + this.Wingfinger2right.addChild(this.Wingfingerlower2right); + this.RightLeg.addChild(this.RightFoot); + this.Wingfinger2left.addChild(this.Wingfingerlower2left); + this.Wingupperarmright.addChild(this.Winglowerarmright); + this.Righttoeright.addChild(this.Righttoelowerright); + this.Lefthip.addChild(this.Rightleg); + this.Snout.addChild(this.Tooth5); + this.Rightfoot.addChild(this.Outertoeleft); + this.Wingfinger1right.addChild(this.Wingfinger2right); + this.Tail8.addChild(this.LTailSpike); + this.Righthandmidfinger.addChild(this.Clawrighthandmid); + this.Snout.addChild(this.Tooth9); + this.Wingfinger1right.addChild(this.Wingfingerlower1right); + this.Wingupperarmright.addChild(this.Wingmembramesmallright); + this.Headback.addChild(this.Headlargehornlowerleft); + this.Wingfinger1left.addChild(this.Wingmembramelargeleft); + this.Wingfinger3right.addChild(this.Wingfingerlower3right); + this.Tail3.addChild(this.Tail4); + this.Tail1.addChild(this.Tail3); + this.Wingshoulderright.addChild(this.Wingupperarmright); + this.Outertoeleft.addChild(this.Outertoelowerleft); + this.Body.addChild(this.Wingshoulderleft); + this.Wingfinger1left.addChild(this.Wingfinger2left); + this.Tail1.addChild(this.Lefthip); + this.Lowerarmleft_1.addChild(this.Righthandmidfinger); + this.Lowerarmleft_1.addChild(this.Righthandleftfinger); + this.Headback.addChild(this.Headmidhornlowerleft); + this.Tail4.addChild(this.Tail6); + this.Rightfoot.addChild(this.Lefttoeright); + this.Snout.addChild(this.Tooth7); + this.Winglowerarmright.addChild(this.Wingmembramemidright); + this.Body.addChild(this.Neckbase); + this.Lowerarmleft.addChild(this.Lefthandrightfinger); + this.Righthip.addChild(this.RightLeg); + this.Rightfoot.addChild(this.Lefttoemid); + this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); + } - public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, float head4) - { - super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); - float wingFlap = (float) Math.toRadians(dragon.wingFlap()); - float jawAngle = (float)Math.toRadians(dragon.getJawMove()); - float neckAngle = -(float)Math.toRadians(4.5F * dragon.getNeckAngle()); - - this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; - this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); - - this.Lowerjaw.rotateAngleX = 0.045553093477052F + jawAngle; - //this.Tail1.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - //this.Tail3.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - //this.Tail4.rotateAngleY = (float) Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - - if (!dragon.isTerrestrial()) //Fly - { - if(!dragon.onGround) - { - float angle = (float) Math.toRadians(dragon.getVertTailAngle()); - this.Body.rotateAngleX = 0.546F - angle; - } - else - { - this.Body.rotateAngleX = 0.5462880558742251F; - } - - if(dragon.motionY < -0.01F)//Glide - { - wingFlap = 0; - } - else if (dragon.motionX == 0 && dragon.motionZ == 0) //Hover - { - wingFlap = (float) Math.toRadians(dragon.wingFlap()); - } - else - { - wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;//Move - } - this.Wingshoulderright.rotateAngleZ = (float) (wingFlap*0.75F); - this.Wingshoulderleft.rotateAngleZ = (float) -(wingFlap*0.75F); - this.Wingupperarmright.rotateAngleZ = (float) (wingFlap*0.25F); - this.Wingupperarmleft.rotateAngleZ = (float) -(wingFlap*0.25F); - - } - else //Walk - { - this.Body.rotateAngleX = 0.5462880558742251F; - this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); - this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); - // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); - //this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); - - this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - } - } + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); + this.Body.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, + float head4) { + super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); + float wingFlap = (float) Math.toRadians(dragon.wingFlap()); + float jawAngle = (float) Math.toRadians(dragon.getJawMove()); + float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); + + this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; + this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); + + this.Lowerjaw.rotateAngleX = 0.045553093477052F + jawAngle; + // this.Tail1.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail3.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail4.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + + if (!dragon.isTerrestrial()) // Fly + { + if (!dragon.onGround) { + float angle = (float) Math.toRadians(dragon.getVertTailAngle()); + this.Body.rotateAngleX = 0.546F - angle; + } else { + this.Body.rotateAngleX = 0.5462880558742251F; + } + + if (dragon.motionY < -0.01F)// Glide + { + wingFlap = 0; + } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover + { + wingFlap = (float) Math.toRadians(dragon.wingFlap()); + } else { + wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move + } + this.Wingshoulderright.rotateAngleZ = wingFlap * 0.75F; + this.Wingshoulderleft.rotateAngleZ = -(wingFlap * 0.75F); + this.Wingupperarmright.rotateAngleZ = wingFlap * 0.25F; + this.Wingupperarmleft.rotateAngleZ = -(wingFlap * 0.25F); + + } else // Walk + { + this.Body.rotateAngleX = 0.5462880558742251F; + this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); + this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); + // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); + // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); + + this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/RenderDragon.java b/src/main/java/minefantasy/mf2/client/render/mob/RenderDragon.java index f6303fff..314e0d2a 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/RenderDragon.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/RenderDragon.java @@ -2,6 +2,8 @@ import org.lwjgl.opengl.GL11; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.entity.mob.EntityDragon; import net.minecraft.client.model.ModelBase; @@ -11,47 +13,43 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.boss.BossStatus; import net.minecraft.util.ResourceLocation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class RenderDragon extends RenderLiving -{ +public class RenderDragon extends RenderLiving { private static ModelBase dragonModel = new ModelDragon(); private static ModelBase venomModel = new ModelVenomDragon(); private static ModelBase frostModel = new ModelFrostDragon(); private static ModelBase ashModel = new ModelAshDragon(); - public RenderDragon(float shadow) - { - super(dragonModel, shadow); - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) - { - if(entity instanceof EntityDragon) - { - return TextureHelperMF.getResource("textures/models/monster/dragon/"+((EntityDragon)entity).getTexture() + ".png"); - } + + public RenderDragon(float shadow) { + super(dragonModel, shadow); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + if (entity instanceof EntityDragon) { + return TextureHelperMF + .getResource("textures/models/monster/dragon/" + ((EntityDragon) entity).getTexture() + ".png"); + } return TextureHelperMF.getResource("textures/models/monster/dragon/dragonGreen.png"); } - - @Override - protected void preRenderCallback(EntityLivingBase entity, float f) - { - this.preRenderCallback((EntityDragon)entity, f); - } - public void doRender(EntityLiving entity, double x, double y, double z, float f, float f1) - { - String breed = ((EntityDragon)entity).getType().breedName; - this.mainModel = breed.equalsIgnoreCase("ash") ? ashModel : breed.equalsIgnoreCase("white") ? frostModel : breed.equalsIgnoreCase("green") ? venomModel : dragonModel; - super.doRender(entity, x, y, z, f, 1); - BossStatus.setBossStatus((EntityDragon)entity, ((EntityDragon)entity).getType().tier == 4); - } - - protected void preRenderCallback(EntityDragon mob, float f) - { - float scale = mob.getScale(); - GL11.glScalef(scale, scale, scale); - } + + @Override + protected void preRenderCallback(EntityLivingBase entity, float f) { + this.preRenderCallback((EntityDragon) entity, f); + } + + public void doRender(EntityLiving entity, double x, double y, double z, float f, float f1) { + String breed = ((EntityDragon) entity).getType().breedName; + this.mainModel = breed.equalsIgnoreCase("ash") ? ashModel + : breed.equalsIgnoreCase("white") ? frostModel + : breed.equalsIgnoreCase("green") ? venomModel : dragonModel; + super.doRender(entity, x, y, z, f, 1); + BossStatus.setBossStatus((EntityDragon) entity, ((EntityDragon) entity).getType().tier == 4); + } + + protected void preRenderCallback(EntityDragon mob, float f) { + float scale = mob.getScale(); + GL11.glScalef(scale, scale, scale); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/RenderHound.java b/src/main/java/minefantasy/mf2/client/render/mob/RenderHound.java index 3f65d8ba..80a8d5a1 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/RenderHound.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/RenderHound.java @@ -14,81 +14,70 @@ import net.minecraft.util.ResourceLocation; @SideOnly(Side.CLIENT) -public class RenderHound extends RenderLiving -{ - public RenderHound(ModelBase modelbase) - { - super(modelbase, 1.0F); - this.setRenderPassModel(modelbase); - } +public class RenderHound extends RenderLiving { + public RenderHound(ModelBase modelbase) { + super(modelbase, 1.0F); + this.setRenderPassModel(modelbase); + } - /** - * Defines what float the third param in setRotationAngles of ModelBase is - */ - protected float handleRotationFloat(EntityHound mob, float f) - { - return mob.getTailRotation(); - } + /** + * Defines what float the third param in setRotationAngles of ModelBase is + */ + protected float handleRotationFloat(EntityHound mob, float f) { + return mob.getTailRotation(); + } - /** - * Queries whether should render the specified pass or not. - */ - protected int shouldRenderPass(EntityHound hound, int layer, float f) - { - if (layer == 0 && hound.getWolfShaking()) - { - float f1 = hound.getBrightness(f) * hound.getShadingWhileShaking(f); - this.bindTexture("hound"); - GL11.glColor3f(f1, f1, f1); - return 1; - } - else if (layer == 1 && hound.isTamed()) - { - this.bindTexture("collar"); - int j = hound.getCollarColor(); - GL11.glColor3f(EntitySheep.fleeceColorTable[j][0], EntitySheep.fleeceColorTable[j][1], EntitySheep.fleeceColorTable[j][2]); - return 1; - } - else - { - return -1; - } - } + /** + * Queries whether should render the specified pass or not. + */ + protected int shouldRenderPass(EntityHound hound, int layer, float f) { + if (layer == 0 && hound.getWolfShaking()) { + float f1 = hound.getBrightness(f) * hound.getShadingWhileShaking(f); + this.bindTexture("hound"); + GL11.glColor3f(f1, f1, f1); + return 1; + } else if (layer == 1 && hound.isTamed()) { + this.bindTexture("collar"); + int j = hound.getCollarColor(); + GL11.glColor3f(EntitySheep.fleeceColorTable[j][0], EntitySheep.fleeceColorTable[j][1], + EntitySheep.fleeceColorTable[j][2]); + return 1; + } else { + return -1; + } + } - private void bindTexture(String string) - { - bindTexture(TextureHelperMF.getResource("textures/models/animal/hound/"+string+".png")); + private void bindTexture(String string) { + bindTexture(TextureHelperMF.getResource("textures/models/animal/hound/" + string + ".png")); } /** - * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntityHound p_110775_1_) - { - return TextureHelperMF.getResource("textures/models/animal/hound/hound.png"); - } + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(EntityHound p_110775_1_) { + return TextureHelperMF.getResource("textures/models/animal/hound/hound.png"); + } - /** - * Queries whether should render the specified pass or not. - */ - protected int shouldRenderPass(EntityLivingBase p_77032_1_, int p_77032_2_, float p_77032_3_) - { - return this.shouldRenderPass((EntityHound)p_77032_1_, p_77032_2_, p_77032_3_); - } + /** + * Queries whether should render the specified pass or not. + */ + protected int shouldRenderPass(EntityLivingBase p_77032_1_, int p_77032_2_, float p_77032_3_) { + return this.shouldRenderPass((EntityHound) p_77032_1_, p_77032_2_, p_77032_3_); + } - /** - * Defines what float the third param in setRotationAngles of ModelBase is - */ - protected float handleRotationFloat(EntityLivingBase p_77044_1_, float p_77044_2_) - { - return this.handleRotationFloat((EntityHound)p_77044_1_, p_77044_2_); - } + /** + * Defines what float the third param in setRotationAngles of ModelBase is + */ + protected float handleRotationFloat(EntityLivingBase p_77044_1_, float p_77044_2_) { + return this.handleRotationFloat((EntityHound) p_77044_1_, p_77044_2_); + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(Entity p_110775_1_) - { - return this.getEntityTexture((EntityHound)p_110775_1_); - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture((EntityHound) p_110775_1_); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/mob/RenderMinotaur.java b/src/main/java/minefantasy/mf2/client/render/mob/RenderMinotaur.java index 2ee9c40d..0881cb5a 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/RenderMinotaur.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/RenderMinotaur.java @@ -6,18 +6,17 @@ import com.mojang.authlib.GameProfile; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.entity.mob.EntityMinotaur; import net.minecraft.block.Block; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.entity.RenderBiped; -import net.minecraft.client.renderer.entity.RenderLiving; import net.minecraft.client.renderer.tileentity.TileEntitySkullRenderer; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.boss.BossStatus; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; @@ -26,180 +25,159 @@ import net.minecraft.nbt.NBTUtil; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StringUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class RenderMinotaur extends RenderBiped -{ - public RenderMinotaur(ModelBiped model, float shadow) - { - super(model, shadow); - - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) - { - if(entity instanceof EntityMinotaur) - { - return TextureHelperMF.getResource("textures/models/monster/minotaur/"+((EntityMinotaur)entity).getTexture() + ".png"); - } +public class RenderMinotaur extends RenderBiped { + public RenderMinotaur(ModelBiped model, float shadow) { + super(model, shadow); + + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + if (entity instanceof EntityMinotaur) { + return TextureHelperMF + .getResource("textures/models/monster/minotaur/" + ((EntityMinotaur) entity).getTexture() + ".png"); + } return TextureHelperMF.getResource("textures/models/monster/minotaur/minotaurBrown.png"); } - - @Override - public void doRender(EntityLiving entity, double x, double y, double z, float f, float f1) - { - super.doRender(entity, x, y, z, f, 1); - } - - @Override - protected void renderEquippedItems(EntityLiving p_77029_1_, float p_77029_2_) - { - GL11.glColor3f(1.0F, 1.0F, 1.0F); - ItemStack itemstack = p_77029_1_.getHeldItem(); - ItemStack itemstack1 = p_77029_1_.func_130225_q(3); - Item item; - float f1; - - if (itemstack1 != null) - { - GL11.glPushMatrix(); - this.modelBipedMain.bipedHead.postRender(0.0625F); - item = itemstack1.getItem(); - - net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient.getItemRenderer(itemstack1, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); - boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack1, net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); - - if (item instanceof ItemBlock) - { - if (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType())) - { - f1 = 0.625F; - GL11.glTranslatef(0.0F, -0.25F, 0.0F); - GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(f1, -f1, -f1); - } - - this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack1, 0); - } - else if (item == Items.skull) - { - f1 = 1.0625F; - GL11.glScalef(f1, -f1, -f1); - GameProfile gameprofile = null; - - if (itemstack1.hasTagCompound()) - { - NBTTagCompound nbttagcompound = itemstack1.getTagCompound(); - - if (nbttagcompound.hasKey("SkullOwner", 10)) - { - gameprofile = NBTUtil.func_152459_a(nbttagcompound.getCompoundTag("SkullOwner")); - } - else if (nbttagcompound.hasKey("SkullOwner", 8) && !StringUtils.isNullOrEmpty(nbttagcompound.getString("SkullOwner"))) - { - gameprofile = new GameProfile((UUID)null, nbttagcompound.getString("SkullOwner")); - } - } - - TileEntitySkullRenderer.field_147536_b.func_152674_a(-0.5F, 0.0F, -0.5F, 1, 180.0F, itemstack1.getItemDamage(), gameprofile); - } - - GL11.glPopMatrix(); - } - - if (itemstack != null && itemstack.getItem() != null) - { - item = itemstack.getItem(); - GL11.glPushMatrix(); - - if (this.mainModel.isChild) - { - f1 = 0.5F; - GL11.glTranslatef(0.0F, 0.625F, 0.0F); - GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F); - GL11.glScalef(f1, f1, f1); - } - GL11.glTranslatef(0.0F, 8F/16F, 0.0F); - - this.modelBipedMain.bipedRightArm.postRender(0.0625F); - GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); - - net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient.getItemRenderer(itemstack, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); - boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack, net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); - - if (item instanceof ItemBlock && (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType()))) - { - f1 = 0.5F; - GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); - f1 *= 0.75F; - GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(-f1, -f1, f1); - } - else if (item == Items.bow) - { - f1 = 0.625F; - GL11.glTranslatef(0.0F, 0.125F, 0.3125F); - GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(f1, -f1, f1); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } - else if (item.isFull3D()) - { - f1 = 0.625F; - - if (item.shouldRotateAroundWhenRendering()) - { - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.0F, -0.125F, 0.0F); - } - - this.func_82422_c(); - GL11.glScalef(f1, -f1, f1); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } - else - { - f1 = 0.375F; - GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); - GL11.glScalef(f1, f1, f1); - GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); - } - - float f2; - int i; - float f5; - - if (itemstack.getItem().requiresMultipleRenderPasses()) - { - for (i = 0; i < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++i) - { - int j = itemstack.getItem().getColorFromItemStack(itemstack, i); - f5 = (float)(j >> 16 & 255) / 255.0F; - f2 = (float)(j >> 8 & 255) / 255.0F; - float f3 = (float)(j & 255) / 255.0F; - GL11.glColor4f(f5, f2, f3, 1.0F); - this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack, i); - } - } - else - { - i = itemstack.getItem().getColorFromItemStack(itemstack, 0); - float f4 = (float)(i >> 16 & 255) / 255.0F; - f5 = (float)(i >> 8 & 255) / 255.0F; - f2 = (float)(i & 255) / 255.0F; - GL11.glColor4f(f4, f5, f2, 1.0F); - this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack, 0); - } - - GL11.glPopMatrix(); - } - } + + @Override + public void doRender(EntityLiving entity, double x, double y, double z, float f, float f1) { + super.doRender(entity, x, y, z, f, 1); + } + + @Override + protected void renderEquippedItems(EntityLiving p_77029_1_, float p_77029_2_) { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + ItemStack itemstack = p_77029_1_.getHeldItem(); + ItemStack itemstack1 = p_77029_1_.func_130225_q(3); + Item item; + float f1; + + if (itemstack1 != null) { + GL11.glPushMatrix(); + this.modelBipedMain.bipedHead.postRender(0.0625F); + item = itemstack1.getItem(); + + net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient + .getItemRenderer(itemstack1, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); + boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( + net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack1, + net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); + + if (item instanceof ItemBlock) { + if (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType())) { + f1 = 0.625F; + GL11.glTranslatef(0.0F, -0.25F, 0.0F); + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(f1, -f1, -f1); + } + + this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack1, 0); + } else if (item == Items.skull) { + f1 = 1.0625F; + GL11.glScalef(f1, -f1, -f1); + GameProfile gameprofile = null; + + if (itemstack1.hasTagCompound()) { + NBTTagCompound nbttagcompound = itemstack1.getTagCompound(); + + if (nbttagcompound.hasKey("SkullOwner", 10)) { + gameprofile = NBTUtil.func_152459_a(nbttagcompound.getCompoundTag("SkullOwner")); + } else if (nbttagcompound.hasKey("SkullOwner", 8) + && !StringUtils.isNullOrEmpty(nbttagcompound.getString("SkullOwner"))) { + gameprofile = new GameProfile((UUID) null, nbttagcompound.getString("SkullOwner")); + } + } + + TileEntitySkullRenderer.field_147536_b.func_152674_a(-0.5F, 0.0F, -0.5F, 1, 180.0F, + itemstack1.getItemDamage(), gameprofile); + } + + GL11.glPopMatrix(); + } + + if (itemstack != null && itemstack.getItem() != null) { + item = itemstack.getItem(); + GL11.glPushMatrix(); + + if (this.mainModel.isChild) { + f1 = 0.5F; + GL11.glTranslatef(0.0F, 0.625F, 0.0F); + GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F); + GL11.glScalef(f1, f1, f1); + } + GL11.glTranslatef(0.0F, 8F / 16F, 0.0F); + + this.modelBipedMain.bipedRightArm.postRender(0.0625F); + GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); + + net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient + .getItemRenderer(itemstack, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); + boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( + net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack, + net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); + + if (item instanceof ItemBlock + && (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType()))) { + f1 = 0.5F; + GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); + f1 *= 0.75F; + GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(-f1, -f1, f1); + } else if (item == Items.bow) { + f1 = 0.625F; + GL11.glTranslatef(0.0F, 0.125F, 0.3125F); + GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(f1, -f1, f1); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else if (item.isFull3D()) { + f1 = 0.625F; + + if (item.shouldRotateAroundWhenRendering()) { + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0F, -0.125F, 0.0F); + } + + this.func_82422_c(); + GL11.glScalef(f1, -f1, f1); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else { + f1 = 0.375F; + GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); + GL11.glScalef(f1, f1, f1); + GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); + } + + float f2; + int i; + float f5; + + if (itemstack.getItem().requiresMultipleRenderPasses()) { + for (i = 0; i < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++i) { + int j = itemstack.getItem().getColorFromItemStack(itemstack, i); + f5 = (j >> 16 & 255) / 255.0F; + f2 = (j >> 8 & 255) / 255.0F; + float f3 = (j & 255) / 255.0F; + GL11.glColor4f(f5, f2, f3, 1.0F); + this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack, i); + } + } else { + i = itemstack.getItem().getColorFromItemStack(itemstack, 0); + float f4 = (i >> 16 & 255) / 255.0F; + f5 = (i >> 8 & 255) / 255.0F; + f2 = (i & 255) / 255.0F; + GL11.glColor4f(f4, f5, f2, 1.0F); + this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack, 0); + } + + GL11.glPopMatrix(); + } + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigArmour.java b/src/main/java/minefantasy/mf2/config/ConfigArmour.java index a512ed6b..e9229492 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigArmour.java +++ b/src/main/java/minefantasy/mf2/config/ConfigArmour.java @@ -4,35 +4,53 @@ import minefantasy.mf2.api.helpers.TacticalManager; import minefantasy.mf2.entity.EntityCogwork; -public class ConfigArmour extends ConfigurationBaseMF -{ +public class ConfigArmour extends ConfigurationBaseMF { public static final String CATEGORY_BONUS = "Bonuses"; - + public static boolean resistArrow; - + public static final String CATEGORY_PENALTIES = "Penalties"; - - + public static final String CATEGORY_COGWORK = "Cogwork Features"; public static boolean cogworkGrief; public static float cogworkFuelUnits; @Override - protected void loadConfig() - { - resistArrow = Boolean.parseBoolean(config.get(CATEGORY_BONUS, "Deflect Arrows", true, "With this option; arrows have a chance to deflect off armour. It compares the arrow damage and armour rating. Chain and plate have higher rates. Arrows bounced off can hurt enemies").getString()); - TacticalManager.arrowDeflectChance = Float.parseFloat(config.get(CATEGORY_BONUS, "Deflect Arrows Modifier", 1.0F, "This modifies the chance for arrows to deflect off armour: Increasing this increases the deflect chance, decreasing decreases the chance, 0 means it's impossible").getString()); - - TacticalManager.shouldSlow = Boolean.parseBoolean(config.get(CATEGORY_PENALTIES, "Armour Slow Movement", true, "With this: Heavier armours slow your movement down acrosss both walking and sprinting. Speed is affected by design and material").getString()); - TacticalManager.minWeightSpeed = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Min armour weigh speed", 10F, "The minimal speed percent capable from weight (10 = 10%), MF armours don't go lower than 75% anyway").getString()); - ArmourCalculator.slowRate = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Slowdown Rate", 1.0F, "A modifier for the rate armours slow down movement, increasing this slows you more, decreasing it slows less, just keep it above 0").getString()); - - ArmourCalculator.useConfigIndirectDmg = Boolean.parseBoolean(config.get("Misc", "Use config indrect damage", true, "Allows config for indirect projectiles, disable if you get problems when getting hit by modded projectiles").getString()); - - cogworkGrief = Boolean.parseBoolean(config.get(CATEGORY_COGWORK, "Cogwork Grief", true, "Should cogwork armour cause envionmental damage when impact landing").getString()); - cogworkFuelUnits = Float.parseFloat(config.get(CATEGORY_COGWORK, "Cogwork Fuel Modifier", 1F, "Modify the amount of fuel added to cogworks").getString()); - EntityCogwork.health_modifier = Float.parseFloat(config.get(CATEGORY_COGWORK, "Cogwork Durability Modifier", 1.0F, "Modify the relative durability of cogwork armour").getString()); - EntityCogwork.rating_modifier = Float.parseFloat(config.get(CATEGORY_COGWORK, "Cogwork Armour Modifier", 1.0F, "Modify the relative armour rating of cogwork armour").getString()); - EntityCogwork.allowedBulk = Integer.parseInt(config.get(CATEGORY_COGWORK, "Worn Apparel Restrict", 0, "-1: can't wear armour with cogwork, 0=Can enter cogwork with light armour, 1=can enter with medium, 2=can enter in any armour").getString()); + protected void loadConfig() { + resistArrow = Boolean.parseBoolean(config.get(CATEGORY_BONUS, "Deflect Arrows", true, + "With this option; arrows have a chance to deflect off armour. It compares the arrow damage and armour rating. Chain and plate have higher rates. Arrows bounced off can hurt enemies") + .getString()); + TacticalManager.arrowDeflectChance = Float.parseFloat(config.get(CATEGORY_BONUS, "Deflect Arrows Modifier", + 1.0F, + "This modifies the chance for arrows to deflect off armour: Increasing this increases the deflect chance, decreasing decreases the chance, 0 means it's impossible") + .getString()); + + TacticalManager.shouldSlow = Boolean.parseBoolean(config.get(CATEGORY_PENALTIES, "Armour Slow Movement", true, + "With this: Heavier armours slow your movement down acrosss both walking and sprinting. Speed is affected by design and material") + .getString()); + TacticalManager.minWeightSpeed = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Min armour weigh speed", 10F, + "The minimal speed percent capable from weight (10 = 10%), MF armours don't go lower than 75% anyway") + .getString()); + ArmourCalculator.slowRate = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Slowdown Rate", 1.0F, + "A modifier for the rate armours slow down movement, increasing this slows you more, decreasing it slows less, just keep it above 0") + .getString()); + + ArmourCalculator.useConfigIndirectDmg = Boolean.parseBoolean(config.get("Misc", "Use config indrect damage", + true, + "Allows config for indirect projectiles, disable if you get problems when getting hit by modded projectiles") + .getString()); + + cogworkGrief = Boolean.parseBoolean(config.get(CATEGORY_COGWORK, "Cogwork Grief", true, + "Should cogwork armour cause envionmental damage when impact landing").getString()); + cogworkFuelUnits = Float.parseFloat( + config.get(CATEGORY_COGWORK, "Cogwork Fuel Modifier", 1F, "Modify the amount of fuel added to cogworks") + .getString()); + EntityCogwork.health_modifier = Float.parseFloat(config.get(CATEGORY_COGWORK, "Cogwork Durability Modifier", + 1.0F, "Modify the relative durability of cogwork armour").getString()); + EntityCogwork.rating_modifier = Float.parseFloat(config.get(CATEGORY_COGWORK, "Cogwork Armour Modifier", 1.0F, + "Modify the relative armour rating of cogwork armour").getString()); + EntityCogwork.allowedBulk = Integer.parseInt(config.get(CATEGORY_COGWORK, "Worn Apparel Restrict", 0, + "-1: can't wear armour with cogwork, 0=Can enter cogwork with light armour, 1=can enter with medium, 2=can enter in any armour") + .getString()); } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigClient.java b/src/main/java/minefantasy/mf2/config/ConfigClient.java index e3f4adcc..7a784e15 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigClient.java +++ b/src/main/java/minefantasy/mf2/config/ConfigClient.java @@ -24,93 +24,126 @@ import minefantasy.mf2.mechanics.EventManagerMF; @SideOnly(Side.CLIENT) -public class ConfigClient extends ConfigurationBaseMF -{ +public class ConfigClient extends ConfigurationBaseMF { public static final String CATEGORY_GUI = "Gui/Hud Features"; - - + public static final String CATEGORY_AESTHETIC = "Aesthetics"; - + public static boolean playBreath; public static boolean playHitsound; public static boolean customModel; - - + public static final String GUI_STAMINA = "Stamina Bar Positioning"; - + public static int stam_xOrient; public static int stam_yOrient; public static int stam_xPos; public static int stam_yPos; public static int stam_direction; - - + public static final String GUI_ARATING = "Armour Rating Positioning"; - + public static int AR_xOrient; public static int AR_yOrient; public static int AR_xPos; public static int AR_yPos; - public static final String GUI_ACOUNT = "Arrow Count Positioning"; - public static int AC_xOrient; public static int AC_yOrient; public static int AC_xPos; public static int AC_yPos; - + public static final String GUI_CAFUEL = "Clockwork Armour Fuel Positioning"; - + public static int CF_xOrient; public static int CF_yOrient; public static int CF_xPos; public static int CF_yPos; - - + public static final String CATEGORY_BLOCK = "Block Render Ids"; - + public static final String CATEGORY_DEBUG = "Debug Info"; + @Override - protected void loadConfig() - { - playBreath = Boolean.parseBoolean(config.get(CATEGORY_AESTHETIC, "Make Breathe Sound", true, "[With Stamina System] Plays breath sounds when low on energy(sound may be annoying to some...)").getString()); - playHitsound = Boolean.parseBoolean(config.get(CATEGORY_AESTHETIC, "Make Hit Sound", true, "Plays sounds when hitting entities with different items").getString()); - customModel = Boolean.parseBoolean(config.get(CATEGORY_AESTHETIC, "Custom Apparel Model", true, "Determines if some work apparel (like aprons and clothing) use special models").getString()); - - stam_xOrient = Integer.parseInt(config.get(GUI_STAMINA, "X Orient", 1, "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to").getString()); - stam_yOrient = Integer.parseInt(config.get(GUI_STAMINA, "Y Orient", 1, "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to").getString()); - stam_xPos = Integer.parseInt(config.get(GUI_STAMINA, "X Position", -82, "The Offset value away from the orient (-)left, (+)right").getString()); - stam_yPos = Integer.parseInt(config.get(GUI_STAMINA, "Y Position", -7, "The Offset value away from the orient (-)up, (+)down").getString()); - stam_direction = Integer.parseInt(config.get(GUI_STAMINA, "Metre Direction", 1, "The direction the metre goes down: -1 = left to right, 0 = middle, 1 = right to left (May have subtle flaws in altered directions 1 and 0)").getString()); - - AR_xOrient = Integer.parseInt(config.get(GUI_ARATING, "X Orient", -1, "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to").getString()); - AR_yOrient = Integer.parseInt(config.get(GUI_ARATING, "Y Orient", -1, "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to").getString()); - AR_xPos = Integer.parseInt(config.get(GUI_ARATING, "X Position", 4, "The Offset value away from the orient (-)left, (+)right").getString()); - AR_yPos = Integer.parseInt(config.get(GUI_ARATING, "Y Position", 4, "The Offset value away from the orient (-)up, (+)down").getString()); - - AC_xOrient = Integer.parseInt(config.get(GUI_ACOUNT, "X Orient", -1, "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to").getString()); - AC_yOrient = Integer.parseInt(config.get(GUI_ACOUNT, "Y Orient", -1, "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to").getString()); - AC_xPos = Integer.parseInt(config.get(GUI_ACOUNT, "X Position", 4, "The Offset value away from the orient (-)left, (+)right").getString()); - AC_yPos = Integer.parseInt(config.get(GUI_ACOUNT, "Y Position", 4, "The Offset value away from the orient (-)up, (+)down").getString()); - - CF_xOrient = Integer.parseInt(config.get(GUI_CAFUEL, "X Orient", 1, "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to").getString()); - CF_yOrient = Integer.parseInt(config.get(GUI_CAFUEL, "Y Orient", -1, "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to").getString()); - CF_xPos = Integer.parseInt(config.get(GUI_CAFUEL, "X Position", -164, "The Offset value away from the orient (-)left, (+)right").getString()); - CF_yPos = Integer.parseInt(config.get(GUI_CAFUEL, "Y Position", -4, "The Offset value away from the orient (-)up, (+)down").getString()); - + protected void loadConfig() { + playBreath = Boolean.parseBoolean(config.get(CATEGORY_AESTHETIC, "Make Breathe Sound", true, + "[With Stamina System] Plays breath sounds when low on energy(sound may be annoying to some...)") + .getString()); + playHitsound = Boolean.parseBoolean(config.get(CATEGORY_AESTHETIC, "Make Hit Sound", true, + "Plays sounds when hitting entities with different items").getString()); + customModel = Boolean + .parseBoolean(config + .get(CATEGORY_AESTHETIC, "Custom Apparel Model", true, + "Determines if some work apparel (like aprons and clothing) use special models") + .getString()); + + stam_xOrient = Integer.parseInt(config.get(GUI_STAMINA, "X Orient", 1, + "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") + .getString()); + stam_yOrient = Integer.parseInt(config.get(GUI_STAMINA, "Y Orient", 1, + "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") + .getString()); + stam_xPos = Integer.parseInt( + config.get(GUI_STAMINA, "X Position", -82, "The Offset value away from the orient (-)left, (+)right") + .getString()); + stam_yPos = Integer.parseInt( + config.get(GUI_STAMINA, "Y Position", -7, "The Offset value away from the orient (-)up, (+)down") + .getString()); + stam_direction = Integer.parseInt(config.get(GUI_STAMINA, "Metre Direction", 1, + "The direction the metre goes down: -1 = left to right, 0 = middle, 1 = right to left (May have subtle flaws in altered directions 1 and 0)") + .getString()); + + AR_xOrient = Integer.parseInt(config.get(GUI_ARATING, "X Orient", -1, + "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") + .getString()); + AR_yOrient = Integer.parseInt(config.get(GUI_ARATING, "Y Orient", -1, + "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") + .getString()); + AR_xPos = Integer.parseInt( + config.get(GUI_ARATING, "X Position", 4, "The Offset value away from the orient (-)left, (+)right") + .getString()); + AR_yPos = Integer.parseInt(config + .get(GUI_ARATING, "Y Position", 4, "The Offset value away from the orient (-)up, (+)down").getString()); + + AC_xOrient = Integer.parseInt(config.get(GUI_ACOUNT, "X Orient", -1, + "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") + .getString()); + AC_yOrient = Integer.parseInt(config.get(GUI_ACOUNT, "Y Orient", -1, + "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") + .getString()); + AC_xPos = Integer.parseInt( + config.get(GUI_ACOUNT, "X Position", 4, "The Offset value away from the orient (-)left, (+)right") + .getString()); + AC_yPos = Integer.parseInt(config + .get(GUI_ACOUNT, "Y Position", 4, "The Offset value away from the orient (-)up, (+)down").getString()); + + CF_xOrient = Integer.parseInt(config.get(GUI_CAFUEL, "X Orient", 1, + "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") + .getString()); + CF_yOrient = Integer.parseInt(config.get(GUI_CAFUEL, "Y Orient", -1, + "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") + .getString()); + CF_xPos = Integer.parseInt( + config.get(GUI_CAFUEL, "X Position", -164, "The Offset value away from the orient (-)left, (+)right") + .getString()); + CF_yPos = Integer.parseInt(config + .get(GUI_CAFUEL, "Y Position", -4, "The Offset value away from the orient (-)up, (+)down").getString()); + BlockAnvilMF.anvil_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Anvil", -100).getString()); BlockCarpenter.carpenter_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Carpenter", -101).getString()); BlockBombBench.bomb_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bomb Bench", -102).getString()); BlockTanningRack.tanner_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Tanning Rack", -103).getString()); BlockForge.forge_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Forge", -104).getString()); BlockBellows.bellows_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bellows", -105).getString()); - BlockResearchStation.research_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "ResearchTable", -106).getString()); + BlockResearchStation.research_RI = Integer + .parseInt(config.get(CATEGORY_BLOCK, "ResearchTable", -106).getString()); BlockBombPress.bpress_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bomb Press", -107).getString()); BlockTrough.trough_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Trough", -108).getString()); BlockBloomery.bloomery_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bloomery", -109).getString()); - BlockCrossbowBench.crossBench_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Crossbow Bench", -110).getString()); + BlockCrossbowBench.crossBench_RI = Integer + .parseInt(config.get(CATEGORY_BLOCK, "Crossbow Bench", -110).getString()); BlockQuern.quern_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Quern", -111).getString()); BlockFirepit.firepit_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Firepit", -112).getString()); BlockRoast.roast_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Roast", -113).getString()); @@ -118,9 +151,11 @@ protected void loadConfig() BlockRack.rack_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Rack", -115).getString()); BlockAmmoBox.ammo_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Ammo Box", -116).getString()); BlockChimney.pipe_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Smoke Pipe", -117).getString()); - BlockComponent.component_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Component Storage", -118).getString()); - - EventManagerMF.displayOreDict = Boolean.parseBoolean(config.get(CATEGORY_DEBUG, "Show Debug OreDict", false, "Displays a list of Ore Dictionary entries to tooltips").getString()); + BlockComponent.component_RI = Integer + .parseInt(config.get(CATEGORY_BLOCK, "Component Storage", -118).getString()); + + EventManagerMF.displayOreDict = Boolean.parseBoolean(config.get(CATEGORY_DEBUG, "Show Debug OreDict", false, + "Displays a list of Ore Dictionary entries to tooltips").getString()); } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigCrafting.java b/src/main/java/minefantasy/mf2/config/ConfigCrafting.java index cec48002..a9a008ce 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigCrafting.java +++ b/src/main/java/minefantasy/mf2/config/ConfigCrafting.java @@ -2,21 +2,22 @@ import minefantasy.mf2.api.cooking.CookRecipe; import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFH; -import minefantasy.mf2.mechanics.CombatMechanics; -import minefantasy.mf2.recipe.ForgedToolRecipes; -public class ConfigCrafting extends ConfigurationBaseMF -{ +public class ConfigCrafting extends ConfigurationBaseMF { public static final String CATEGORY_REFINING = "Refining"; - public static boolean allowIronResmelt; + public static boolean allowIronResmelt; public static final String CATEGORY_COOKING = "Cooking"; - + @Override - protected void loadConfig() - { - allowIronResmelt = Boolean.parseBoolean(config.get(CATEGORY_REFINING, "Allow Iron ingots to make Pig Iron", false, "If you're not resoureful: you can allow iron ingots to make prepared iron for refining.").getString()); - TileEntityBlastFH.maxFurnaceHeight = Integer.parseInt(config.get(CATEGORY_REFINING, "Max Blast Furnace Height", 16, "The max amount of chambers a blast furnace can read").getString()); - CookRecipe.canCookBasics = Boolean.parseBoolean(config.get(CATEGORY_COOKING, "Cook non-mf food on cooktop", true, "This means non-mf food cooked in a furnace can work on a cooking plate").getString()); + protected void loadConfig() { + allowIronResmelt = Boolean.parseBoolean(config + .get(CATEGORY_REFINING, "Allow Iron ingots to make Pig Iron", false, + "If you're not resoureful: you can allow iron ingots to make prepared iron for refining.") + .getString()); + TileEntityBlastFH.maxFurnaceHeight = Integer.parseInt(config.get(CATEGORY_REFINING, "Max Blast Furnace Height", + 16, "The max amount of chambers a blast furnace can read").getString()); + CookRecipe.canCookBasics = Boolean.parseBoolean(config.get(CATEGORY_COOKING, "Cook non-mf food on cooktop", + true, "This means non-mf food cooked in a furnace can work on a cooking plate").getString()); } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigExperiment.java b/src/main/java/minefantasy/mf2/config/ConfigExperiment.java index 8e16aec4..2044560a 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigExperiment.java +++ b/src/main/java/minefantasy/mf2/config/ConfigExperiment.java @@ -1,41 +1,43 @@ package minefantasy.mf2.config; import minefantasy.mf2.api.helpers.ArmourCalculator; -import minefantasy.mf2.api.rpg.RPGElements; -public class ConfigExperiment extends ConfigurationBaseMF -{ +public class ConfigExperiment extends ConfigurationBaseMF { public static final String CATEGORY_EARLY = "Unfinished Features"; public static final String CATEGORY_ARCHERY = "Archery Features"; - + public static boolean stickArrows; public static boolean dynamicArrows; - public static final String CATEGORY_ARMOUR = "Armour Features"; - public static final String CATEGORY_FOOD = "Experimental: Hunger Modification"; - + public static String debug = ""; - + @Override - protected void loadConfig() - { - //RPGElements.isSystemActive = Boolean.parseBoolean(config.get(CATEGORY_EARLY, "Enable Skills", false, "This will be a later feature where skills determine a number of actions ingame, also will be used to unlock perks").getString()); - stickArrows = Boolean.parseBoolean(config.get(CATEGORY_ARCHERY, "Save Arrows", true, "With this active; arrows fired into enemies save, so they can be dropped on death").getString()); - dynamicArrows = Boolean.parseBoolean(config.get(CATEGORY_ARCHERY, "Dynamic arrow sync", true, "This is for whatever hosts the world (singleplayer, or servers); it increases the rate arrows sync their data for smoother rendering for players. This however increases packet traffic. If you have a lot of players on a server or a lot of arrows, disable this to help clean it up").getString()); - - String AADesc = - "This feature Sets supported armours to calculate weapons differently: \n" + - "Damage is divided into cutting and blunt, and MF armours will alter their ratings depending \n" + - "Both weapons and ranged entities can be registered to deliver a certain ratio \n" + - "Armours can't be registered, all coding needs to be hardwired into the code themselves \n" + - "So this means mod armours can not support this, they need to have a system built-in to their own coding" + - "But this ratio only effects armours that are told to. so it should have no effect on unsupported armours, being balanced as usual \n" + - "Undefined weapon damages however have no effect either, but it will try and guess \n" + - "This will also change change axes and blunt weapons to match blade damage (since armour is vulnerable to blunt"; - ArmourCalculator.advancedDamageTypes = Boolean.parseBoolean(config.get(CATEGORY_ARMOUR, "Advanced Armour Calculator", true, AADesc).getString()); + protected void loadConfig() { + // RPGElements.isSystemActive = Boolean.parseBoolean(config.get(CATEGORY_EARLY, + // "Enable Skills", false, "This will be a later feature where skills determine + // a number of actions ingame, also will be used to unlock perks").getString()); + stickArrows = Boolean.parseBoolean(config + .get(CATEGORY_ARCHERY, "Save Arrows", true, + "With this active; arrows fired into enemies save, so they can be dropped on death") + .getString()); + dynamicArrows = Boolean.parseBoolean(config.get(CATEGORY_ARCHERY, "Dynamic arrow sync", true, + "This is for whatever hosts the world (singleplayer, or servers); it increases the rate arrows sync their data for smoother rendering for players. This however increases packet traffic. If you have a lot of players on a server or a lot of arrows, disable this to help clean it up") + .getString()); + + String AADesc = "This feature Sets supported armours to calculate weapons differently: \n" + + "Damage is divided into cutting and blunt, and MF armours will alter their ratings depending \n" + + "Both weapons and ranged entities can be registered to deliver a certain ratio \n" + + "Armours can't be registered, all coding needs to be hardwired into the code themselves \n" + + "So this means mod armours can not support this, they need to have a system built-in to their own coding" + + "But this ratio only effects armours that are told to. so it should have no effect on unsupported armours, being balanced as usual \n" + + "Undefined weapon damages however have no effect either, but it will try and guess \n" + + "This will also change change axes and blunt weapons to match blade damage (since armour is vulnerable to blunt"; + ArmourCalculator.advancedDamageTypes = Boolean + .parseBoolean(config.get(CATEGORY_ARMOUR, "Advanced Armour Calculator", true, AADesc).getString()); debug = config.get("###Enable Debug Mode###", "Debug Passcode", "").getString(); } diff --git a/src/main/java/minefantasy/mf2/config/ConfigFarming.java b/src/main/java/minefantasy/mf2/config/ConfigFarming.java index 91bc6e82..8adb057d 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigFarming.java +++ b/src/main/java/minefantasy/mf2/config/ConfigFarming.java @@ -2,22 +2,25 @@ import minefantasy.mf2.farming.FarmingHelper; -public class ConfigFarming extends ConfigurationBaseMF -{ +public class ConfigFarming extends ConfigurationBaseMF { public static final String CATEGORY_BONUS = "Bonuses"; - + public static final String CATEGORY_PENALTIES = "Penalties"; - - + public static final String CATEGORY_MISC = "Other Features"; @Override - protected void loadConfig() - { - FarmingHelper.isEnabled = Boolean.parseBoolean(config.get("##Enable System##", "isEnabled", true, "This toggles the farming mechanics").getString()); - - FarmingHelper.hoeFailChanceCfg = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Hoe Fail Modifier", 1.0F, "Modifies the rate for hoes to fail making fields").getString()); - FarmingHelper.farmBreakCfg = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Harvest Ruin Modifier", 1.0F, "Modifies the rate for ruining fields when harvesting (scythes increase this chance)").getString()); + protected void loadConfig() { + FarmingHelper.isEnabled = Boolean.parseBoolean( + config.get("##Enable System##", "isEnabled", true, "This toggles the farming mechanics").getString()); + + FarmingHelper.hoeFailChanceCfg = Float.parseFloat(config + .get(CATEGORY_PENALTIES, "Hoe Fail Modifier", 1.0F, "Modifies the rate for hoes to fail making fields") + .getString()); + FarmingHelper.farmBreakCfg = Float.parseFloat(config + .get(CATEGORY_PENALTIES, "Harvest Ruin Modifier", 1.0F, + "Modifies the rate for ruining fields when harvesting (scythes increase this chance)") + .getString()); } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigHardcore.java b/src/main/java/minefantasy/mf2/config/ConfigHardcore.java index e45f1a1a..8da5d169 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigHardcore.java +++ b/src/main/java/minefantasy/mf2/config/ConfigHardcore.java @@ -7,8 +7,7 @@ import minefantasy.mf2.hunger.HungerSystemMF; import minefantasy.mf2.mechanics.CombatMechanics; -public class ConfigHardcore extends ConfigurationBaseMF -{ +public class ConfigHardcore extends ConfigurationBaseMF { public static final String CATEGORY_CRAFTING = "1: HARDCORE CRAFTING"; public static boolean HCCreduceIngots = true; public static boolean HCChotBurn = true; @@ -17,52 +16,93 @@ public class ConfigHardcore extends ConfigurationBaseMF public static boolean HCCRemoveCraft = true; public static boolean HCCRemoveBooksCraft = false; public static boolean HCCRemoveTalismansCraft = false; - + public static final String CATEGORY_RESEARCH = "2: Research"; - + public static final String CATEGORY_FOOD = "3: Food and Hunting"; - + public static boolean hunterKnife; public static boolean lessHunt; public static boolean preventCook; - - + public static final String CATEGORY_MOB = "4: Monster Upgrades"; - + public static boolean upgradeZombieWep; public static float zombieWepChance; public static boolean fastZombies; - + public static final String CATEGORY_USER = "5: Player Debuffs"; public static boolean critLimp; - + @Override - protected void loadConfig() - { - HCCreduceIngots = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Hardcore Ingots", true, "Some Metals (Like iron, steel and direct ore smelts) Must be worked manually on an anvil rather than smelted. They may also cost more! Big furnace still works.").getString()); - HCChotBurn = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Hot burns", true, "You cannot hold hot items (apron or not), tongs must be used.").getString()); - Heatable.HCCquenchRuin = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Hardcore Quench", true, "Hot items can be damaged if a trough is not used.").getString()); - HCCWeakItems = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Weaken Basic items", true, "This will significantly reduce the durability of basic items (made on basic crafting table), they can still be crafted but are practically useless.").getString()); - HCCallowRocks = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Allow Stone-Age", true, "Allows punching stone for sharp rocks, and using them on leaves for sticks/vines: These make primitive stone tools").getString()); - HCCRemoveCraft = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Remove Recipes", true, "Some recipes (Such as Bread, or Flint and Steel) will be removed, since MF has its own recipe for such items.").getString()); - HCCRemoveBooksCraft = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Remove Books Recipes", false, "Skill books recipes will be disabled, but you still can find them it the world.").getString()); - HCCRemoveTalismansCraft = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Remove Talismans Recipes", false, "Research talismans recipes will be disabled, but you still can find them it the world.").getString()); - - ResearchLogic.knowledgelyr = Integer.parseInt(config.get(CATEGORY_RESEARCH, "###CHANGE RESEARCH ID###", 0, "This changes the research ID, removing all entries").getString()); - InformationBase.unlockAll = Boolean.parseBoolean(config.get(CATEGORY_RESEARCH, "Unlock entries", false, "If you don't want to research, this will unlock all entries.").getString()); - InformationBase.easyResearch = Boolean.parseBoolean(config.get(CATEGORY_RESEARCH, "Baby-Mode Research", false, "This removes the process of examining artefacts, research is unlocked by clicking entries in the book.").getString()); - - hunterKnife = Boolean.parseBoolean(config.get(CATEGORY_FOOD, "Restrict to hunting weapon", false, "This option means animals ONLY drop meat and hide when killed with a hunting weapon such as a knife, only the killing blow counts").getString()); - lessHunt = Boolean.parseBoolean(config.get(CATEGORY_FOOD, "Reduce Meat Drops", false, "This will alter the stack size of animal meat drops, meaning they only drop 1 every time").getString()); - preventCook = Boolean.parseBoolean(config.get(CATEGORY_FOOD, "Prevent furnace food", false, "Stop food from being cooked in a furnace").getString()); - HungerSystemMF.slowdownRate = Integer.parseInt(config.get(CATEGORY_FOOD, "Hunger slow rate", 3, "how many added points per haunch is slows by. Default is 3: meaning it's takes 3 additional haunches to remove 1, meaning each haunch takes 4 times to be removed").getString()); - TileEntityRoast.enableOverheat = Boolean.parseBoolean(config.get(CATEGORY_FOOD, "Burn at high temperature", true, "Cooking food on a stove or oven will automatically burn at high temperatures").getString()); - - upgradeZombieWep = Boolean.parseBoolean(config.get(CATEGORY_MOB, "Give Zombie Weapon", true, "Zombies have a chance on spawning with forged iron weapons, It also controls some zombies having MF armour").getString()); - zombieWepChance = Float.parseFloat(config.get(CATEGORY_MOB, "Zombie Weapon Spawn Chance Modifier", 1.0F, "Chance for Zombies to have forged weapons, increased with difficulty").getString()); - fastZombies = Boolean.parseBoolean(config.get(CATEGORY_MOB, "Speed up zombies", true, "Speed up zombies (Sure it's not as real.. but it makes them a bit more dangerous)").getString()); - critLimp = Boolean.parseBoolean(config.get(CATEGORY_MOB, "Critical Injury Limp", true, "This means when you're badly wounded, you slow down and limp").getString()); - CombatMechanics.swordSkeleton = Boolean.parseBoolean(config.get(CATEGORY_MOB, "Skeleton Swords", true, "Some Skeletons use swords").getString()); + protected void loadConfig() { + HCCreduceIngots = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Hardcore Ingots", true, + "Some Metals (Like iron, steel and direct ore smelts) Must be worked manually on an anvil rather than smelted. They may also cost more! Big furnace still works.") + .getString()); + HCChotBurn = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Hot burns", true, + "You cannot hold hot items (apron or not), tongs must be used.").getString()); + Heatable.HCCquenchRuin = Boolean.parseBoolean(config + .get(CATEGORY_CRAFTING, "Hardcore Quench", true, "Hot items can be damaged if a trough is not used.") + .getString()); + HCCWeakItems = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Weaken Basic items", true, + "This will significantly reduce the durability of basic items (made on basic crafting table), they can still be crafted but are practically useless.") + .getString()); + HCCallowRocks = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Allow Stone-Age", true, + "Allows punching stone for sharp rocks, and using them on leaves for sticks/vines: These make primitive stone tools") + .getString()); + HCCRemoveCraft = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Remove Recipes", true, + "Some recipes (Such as Bread, or Flint and Steel) will be removed, since MF has its own recipe for such items.") + .getString()); + HCCRemoveBooksCraft = Boolean + .parseBoolean(config + .get(CATEGORY_CRAFTING, "Remove Books Recipes", false, + "Skill books recipes will be disabled, but you still can find them it the world.") + .getString()); + HCCRemoveTalismansCraft = Boolean.parseBoolean(config + .get(CATEGORY_CRAFTING, "Remove Talismans Recipes", false, + "Research talismans recipes will be disabled, but you still can find them it the world.") + .getString()); + + ResearchLogic.knowledgelyr = Integer.parseInt(config.get(CATEGORY_RESEARCH, "###CHANGE RESEARCH ID###", 0, + "This changes the research ID, removing all entries").getString()); + InformationBase.unlockAll = Boolean.parseBoolean(config.get(CATEGORY_RESEARCH, "Unlock entries", false, + "If you don't want to research, this will unlock all entries.").getString()); + InformationBase.easyResearch = Boolean.parseBoolean(config.get(CATEGORY_RESEARCH, "Baby-Mode Research", false, + "This removes the process of examining artefacts, research is unlocked by clicking entries in the book.") + .getString()); + + hunterKnife = Boolean.parseBoolean(config.get(CATEGORY_FOOD, "Restrict to hunting weapon", false, + "This option means animals ONLY drop meat and hide when killed with a hunting weapon such as a knife, only the killing blow counts") + .getString()); + lessHunt = Boolean.parseBoolean(config + .get(CATEGORY_FOOD, "Reduce Meat Drops", false, + "This will alter the stack size of animal meat drops, meaning they only drop 1 every time") + .getString()); + preventCook = Boolean.parseBoolean( + config.get(CATEGORY_FOOD, "Prevent furnace food", false, "Stop food from being cooked in a furnace") + .getString()); + HungerSystemMF.slowdownRate = Integer.parseInt(config.get(CATEGORY_FOOD, "Hunger slow rate", 3, + "how many added points per haunch is slows by. Default is 3: meaning it's takes 3 additional haunches to remove 1, meaning each haunch takes 4 times to be removed") + .getString()); + TileEntityRoast.enableOverheat = Boolean + .parseBoolean(config + .get(CATEGORY_FOOD, "Burn at high temperature", true, + "Cooking food on a stove or oven will automatically burn at high temperatures") + .getString()); + + upgradeZombieWep = Boolean.parseBoolean(config.get(CATEGORY_MOB, "Give Zombie Weapon", true, + "Zombies have a chance on spawning with forged iron weapons, It also controls some zombies having MF armour") + .getString()); + zombieWepChance = Float.parseFloat(config.get(CATEGORY_MOB, "Zombie Weapon Spawn Chance Modifier", 1.0F, + "Chance for Zombies to have forged weapons, increased with difficulty").getString()); + fastZombies = Boolean.parseBoolean(config + .get(CATEGORY_MOB, "Speed up zombies", true, + "Speed up zombies (Sure it's not as real.. but it makes them a bit more dangerous)") + .getString()); + critLimp = Boolean.parseBoolean(config.get(CATEGORY_MOB, "Critical Injury Limp", true, + "This means when you're badly wounded, you slow down and limp").getString()); + CombatMechanics.swordSkeleton = Boolean.parseBoolean( + config.get(CATEGORY_MOB, "Skeleton Swords", true, "Some Skeletons use swords").getString()); } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigItemRegistry.java b/src/main/java/minefantasy/mf2/config/ConfigItemRegistry.java index acc95f68..ef1f3a2b 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigItemRegistry.java +++ b/src/main/java/minefantasy/mf2/config/ConfigItemRegistry.java @@ -10,429 +10,338 @@ import minefantasy.mf2.util.MFLogUtil; import net.minecraft.item.Item; -public class ConfigItemRegistry extends ConfigurationBaseMF -{ +public class ConfigItemRegistry extends ConfigurationBaseMF { public static final String CATEGORY_ARMOUR = "Armour List"; - + public static String[] armourListAC = new String[0]; - - + public static final String CATEGORY_FARM = "Farming"; - + public static String[] hoeList = new String[0]; - + public static final String CATEGORY_TOOL = "Tools"; - + public static String[] crafterList = new String[0]; - + public static final String CATEGORY_WEPS = "Weapon Register"; - + public static String[] customDamagerList = new String[0]; public static String[] customDamagerEntityList = new String[0]; @Override - protected void loadConfig() - { - //Weight - - String AAdesc = - "This will register items under a certain 'Design' calculating the variables itself.\n Each entry has it's own line:\n" + - "Order itemid|Design|WeightGroup|WeightModifier \n" + - "The WeightModifier alters the weight for heavier or lighter materials keep it at 1.0 unless you have a special material (like mithril and adamamantium)\n" + - "Designs can be any that are registered: MineFantasy designs are 'clothing', 'leather', 'mail', 'default'(that's just basic metal armour), and 'plate'\n" + - "WeightGroup refers to whether it is light medium or heavy armour \n" + - "EXAMPLE (This is what vanilla gold is registered under) \n" + - "minecraft:golden_helmet|default|medium|2.0 \n"+ - "minecraft:golden_chestplate|default|medium|2.0 \n"+ - "minecraft:golden_leggings|default|medium|2.0 \n"+ - "minecraft:golden_boots|default|medium|2.0 \n"+ - "The 2.0 means it is 2x heavier than other vanilla armours \n"+ - "This does not override existing MF armours \n"; - + protected void loadConfig() { + // Weight + + String AAdesc = "This will register items under a certain 'Design' calculating the variables itself.\n Each entry has it's own line:\n" + + "Order itemid|Design|WeightGroup|WeightModifier \n" + + "The WeightModifier alters the weight for heavier or lighter materials keep it at 1.0 unless you have a special material (like mithril and adamamantium)\n" + + "Designs can be any that are registered: MineFantasy designs are 'clothing', 'leather', 'mail', 'default'(that's just basic metal armour), and 'plate'\n" + + "WeightGroup refers to whether it is light medium or heavy armour \n" + + "EXAMPLE (This is what vanilla gold is registered under) \n" + + "minecraft:golden_helmet|default|medium|2.0 \n" + "minecraft:golden_chestplate|default|medium|2.0 \n" + + "minecraft:golden_leggings|default|medium|2.0 \n" + "minecraft:golden_boots|default|medium|2.0 \n" + + "The 2.0 means it is 2x heavier than other vanilla armours \n" + + "This does not override existing MF armours \n"; + armourListAC = config.get(CATEGORY_ARMOUR, "Auto-Armour Registry", new String[0], AAdesc).getStringList(); - Arrays.sort(armourListAC); - - //Hoes - - String hoeDesc = - "This Registers Hoe items to an efficiency level: (It uses the same variable as efficiency, you may need to find that out first, by default: it should be able to guess it:\n" + - "Order itemid|efficicncy \n" + - "Efficicney is a variable that goes into play with the failure chance, higher efficicnecy has easier tiling\n"; - + Arrays.sort(armourListAC); + + // Hoes + + String hoeDesc = "This Registers Hoe items to an efficiency level: (It uses the same variable as efficiency, you may need to find that out first, by default: it should be able to guess it:\n" + + "Order itemid|efficicncy \n" + + "Efficicney is a variable that goes into play with the failure chance, higher efficicnecy has easier tiling\n"; + hoeList = config.get(CATEGORY_FARM, "Hoe Registry", new String[0], hoeDesc).getStringList(); - Arrays.sort(hoeList); - - //Crafters - - String craftDesc = - "This Registers items to a tool type and efficiency (such as hammer, hvyHammer, knife, saw, etc):\n" + - "Order itemid|efficiency|tier|tooltype \n" + - "tooltype can be hammer, hvyHammer, knife, shears, needle, spoon, mallet, saw, spanner \n" + - "efficiency is the measure of how fast it works (similar to dig speed)"; - - crafterList = config.get(CATEGORY_TOOL, "Crafter Registry", new String[0], craftDesc).getStringList(); - Arrays.sort(crafterList); - - //Weapons - - String damageDesc = - "[Experimental] This registers weapons for the damage variable mechanics implemented by option. \n" + - "Though mod-added armours have absolutely no support, and never can without being specifically coded to \n" + - "MineFantasy armours will take these variables and function differently on the values. But weapon items can \n" + - "be added to the list: Put each entry on it's own line set out like this: \n" + - "id|cutting|pierce|blunt \n" + - "id is the item id as a string (you need to find it out yourself), cutting and blunt are the ratio. \n" + - "EXAMPLE (for example... making a stick to piercing damage) \n" + - "minecraft:stick|0|1.0|0 \n"+ - "The difference between the ratio is what determines damage 1|0 means 100% cutting damage, 3|1 means it's 3 cutting to 1 blunt (or 75%, 25%). use whatever numbers you need to make the ratio."; - - customDamagerList = config.get(CATEGORY_WEPS, "Custom Damage Ratios", new String[0], damageDesc).getStringList(); - Arrays.sort(customDamagerList); - - String damageEDesc = - "Similar method to 'Custom Damage Ratios' only with entities, This is for registering things like arrows, same format only with the entity registry name (usually modid:name)"; - - customDamagerEntityList = config.get(CATEGORY_WEPS, "Custom Entity Damage Ratios", new String[0], damageEDesc).getStringList(); - Arrays.sort(customDamagerEntityList); + Arrays.sort(hoeList); + + // Crafters + + String craftDesc = "This Registers items to a tool type and efficiency (such as hammer, hvyHammer, knife, saw, etc):\n" + + "Order itemid|efficiency|tier|tooltype \n" + + "tooltype can be hammer, hvyHammer, knife, shears, needle, spoon, mallet, saw, spanner \n" + + "efficiency is the measure of how fast it works (similar to dig speed)"; + + crafterList = config.get(CATEGORY_TOOL, "Crafter Registry", new String[0], craftDesc).getStringList(); + Arrays.sort(crafterList); + + // Weapons + + String damageDesc = "[Experimental] This registers weapons for the damage variable mechanics implemented by option. \n" + + "Though mod-added armours have absolutely no support, and never can without being specifically coded to \n" + + "MineFantasy armours will take these variables and function differently on the values. But weapon items can \n" + + "be added to the list: Put each entry on it's own line set out like this: \n" + + "id|cutting|pierce|blunt \n" + + "id is the item id as a string (you need to find it out yourself), cutting and blunt are the ratio. \n" + + "EXAMPLE (for example... making a stick to piercing damage) \n" + "minecraft:stick|0|1.0|0 \n" + + "The difference between the ratio is what determines damage 1|0 means 100% cutting damage, 3|1 means it's 3 cutting to 1 blunt (or 75%, 25%). use whatever numbers you need to make the ratio."; + + customDamagerList = config.get(CATEGORY_WEPS, "Custom Damage Ratios", new String[0], damageDesc) + .getStringList(); + Arrays.sort(customDamagerList); + + String damageEDesc = "Similar method to 'Custom Damage Ratios' only with entities, This is for registering things like arrows, same format only with the entity registry name (usually modid:name)"; + + customDamagerEntityList = config.get(CATEGORY_WEPS, "Custom Entity Damage Ratios", new String[0], damageEDesc) + .getStringList(); + Arrays.sort(customDamagerEntityList); } - - public static void readCustoms() - { + + public static void readCustoms() { MFLogUtil.logDebug("Loading Custom Item Entries from config..."); - try - { - for(String s: armourListAC) - { - breakdownLineForAutoarmour(s); - } - for(String s: hoeList) - { + try { + for (String s : armourListAC) { + breakdownLineForAutoarmour(s); + } + for (String s : hoeList) { breakdownLineForHoe(s); - } - for(String s: crafterList) - { + } + for (String s : crafterList) { breakdownLineForCrafter(s); - } - for(String s: customDamagerList) - { + } + for (String s : customDamagerList) { breakdownLineForDamage(s); - } - for(String s: customDamagerEntityList) - { + } + for (String s : customDamagerEntityList) { breakdownLineForDamage(s); - } - } - catch(Exception e) - { + } + } catch (Exception e) { MFLogUtil.logWarn("Failed to load Custom Item Entries from config. Check the config file"); } } - private static void registerArmourclassEntry(Item piece, String design, float weight) - { + private static void registerArmourclassEntry(Item piece, String design, float weight) { ArmourDesign AC = getClassFor(design); - if(AC == null) - { - MFLogUtil.logWarn("Could not define armour design '" + design + "' for item id: " + Item.getIdFromItem(piece)); + if (AC == null) { + MFLogUtil.logWarn( + "Could not define armour design '" + design + "' for item id: " + Item.getIdFromItem(piece)); return; } CustomArmourEntry.registerItem(piece, AC, weight, AC.getGroup()); } - private static ArmourDesign getClassFor(String name) - { + private static ArmourDesign getClassFor(String name) { ArmourDesign design = ArmourDesign.designs.get(name); - if(design != null) - { + if (design != null) { return design; } return null; } - - private static void breakdownLineForAutoarmour(String config) - { + + private static void breakdownLineForAutoarmour(String config) { String temp = ""; int phase = 0; String id = ""; ArmourDesign AD = null; String weightGroup = "medium"; float weight = 1.0F; - for(int a = 0; a < config.length(); a ++) - { - if(a == config.length()-1) - { + for (int a = 0; a < config.length(); a++) { + if (a == config.length() - 1) { temp = temp + config.charAt(a); } - if(config.charAt(a) == "|".charAt(0) || a == config.length()-1) - { - if(phase == 0) - { + if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { + if (phase == 0) { id = temp; temp = ""; - phase ++; - } - else if(phase == 1) - { + phase++; + } else if (phase == 1) { ArmourDesign design = getClassFor(temp); - if(design != null) - { + if (design != null) { AD = design; } temp = ""; - phase ++; - } - else if(phase == 2) - { + phase++; + } else if (phase == 2) { weightGroup = temp; temp = ""; - phase ++; - } - else if(phase == 3) - { + phase++; + } else if (phase == 3) { weight = Float.valueOf(temp); temp = ""; - + Item piece = getItemFromString(id); - if(AD != null && piece != null) - { + if (AD != null && piece != null) { CustomArmourEntry.registerItem(piece, AD, weight, weightGroup); - MFLogUtil.logDebug("Added Armour: " + piece.getUnlocalizedName() + "(" + AD.getName() + ") To " + weightGroup + " armour category... Modified weight is " + weight); + MFLogUtil.logDebug("Added Armour: " + piece.getUnlocalizedName() + "(" + AD.getName() + ") To " + + weightGroup + " armour category... Modified weight is " + weight); } phase = 0; } - } - else - { - if(config.charAt(a) != " ".charAt(0)) - { + } else { + if (config.charAt(a) != " ".charAt(0)) { temp = temp + config.charAt(a); } } } } - - - private static void breakdownLineForHoe(String config) - { + + private static void breakdownLineForHoe(String config) { String temp = ""; int phase = 0; String id = ""; float eff = 6.0F; - - for(int a = 0; a < config.length(); a ++) - { - if(a == config.length()-1) - { + + for (int a = 0; a < config.length(); a++) { + if (a == config.length() - 1) { temp = temp + config.charAt(a); } - if(config.charAt(a) == "|".charAt(0) || a == config.length()-1) - { - if(phase == 0) - { + if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { + if (phase == 0) { id = temp; temp = ""; - phase ++; - } - else if(phase == 1) - { + phase++; + } else if (phase == 1) { eff = Float.valueOf(temp); temp = ""; - + Item hoe = getItemFromString(id); - if(hoe != null) - { + if (hoe != null) { CustomHoeEntry.registerItem(hoe, eff); MFLogUtil.logDebug("Added Hoe: " + id + " With Efficiency " + eff); } phase = 0; } - } - else - { - if(config.charAt(a) != " ".charAt(0)) - { + } else { + if (config.charAt(a) != " ".charAt(0)) { temp = temp + config.charAt(a); } } } } - - private static void breakdownLineForCrafter(String config) - { + + private static void breakdownLineForCrafter(String config) { String temp = ""; int phase = 0; String id = ""; String type = ""; int tier = -1; float efficiency = 2.0F; - - for(int a = 0; a < config.length(); a ++) - { - if(a == config.length()-1) - { + + for (int a = 0; a < config.length(); a++) { + if (a == config.length() - 1) { temp = temp + config.charAt(a); } - if(config.charAt(a) == "|".charAt(0) || a == config.length()-1) - { - if(phase == 0) - { + if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { + if (phase == 0) { id = temp; temp = ""; - phase ++; - } - else if(phase == 1) - { + phase++; + } else if (phase == 1) { efficiency = Float.valueOf(temp); temp = ""; - phase ++; - } - else if(phase == 2) - { + phase++; + } else if (phase == 2) { tier = Integer.valueOf(temp); temp = ""; - phase ++; - } - else if(phase == 3) - { + phase++; + } else if (phase == 3) { type = temp; temp = ""; - + Item hoe = getItemFromString(id); - if(hoe != null) - { + if (hoe != null) { CustomCrafterEntry.registerItem(hoe, type, efficiency, tier); MFLogUtil.logDebug("Added Crafter: " + id + " as " + type + " for efficiency " + efficiency); } phase = 0; } - } - else - { - if(config.charAt(a) != " ".charAt(0)) - { + } else { + if (config.charAt(a) != " ".charAt(0)) { temp = temp + config.charAt(a); } } } } - - private static void breakdownLineForDamage(String config) - { + + private static void breakdownLineForDamage(String config) { String temp = ""; int phase = 0; String id = ""; float cut = 0; float blunt = 0; float pierce = 0; - - for(int a = 0; a < config.length(); a ++) - { - if(a == config.length()-1) - { + + for (int a = 0; a < config.length(); a++) { + if (a == config.length() - 1) { temp = temp + config.charAt(a); } - if(config.charAt(a) == "|".charAt(0) || a == config.length()-1) - { - if(phase == 0) - { + if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { + if (phase == 0) { id = temp; temp = ""; - phase ++; - } - else if(phase == 1) - { + phase++; + } else if (phase == 1) { cut = Float.valueOf(temp); temp = ""; - phase ++; - } - else if(phase == 2) - { + phase++; + } else if (phase == 2) { pierce = Float.valueOf(temp); temp = ""; - phase ++; - } - else if(phase == 3) - { + phase++; + } else if (phase == 3) { blunt = Float.valueOf(temp); temp = ""; - + Item weapon = getItemFromString(id); - if(weapon != null) - { - CustomDamageRatioEntry.registerItem(weapon, new float[]{cut, blunt, pierce}); - MFLogUtil.logDebug("Added Custom weapon: " + id + " With Ratio " + cut + ":" + pierce + ":" + blunt); + if (weapon != null) { + CustomDamageRatioEntry.registerItem(weapon, new float[] { cut, blunt, pierce }); + MFLogUtil.logDebug( + "Added Custom weapon: " + id + " With Ratio " + cut + ":" + pierce + ":" + blunt); } phase = 0; } - } - else - { - if(config.charAt(a) != " ".charAt(0)) - { + } else { + if (config.charAt(a) != " ".charAt(0)) { temp = temp + config.charAt(a); } } } } - - private static void breakdownLineForDamageEntity(String config) - { + + private static void breakdownLineForDamageEntity(String config) { String temp = ""; int phase = 0; String id = ""; float cut = 0; float pierce = 0; float blunt = 0; - - for(int a = 0; a < config.length(); a ++) - { - if(a == config.length()-1) - { + + for (int a = 0; a < config.length(); a++) { + if (a == config.length() - 1) { temp = temp + config.charAt(a); } - if(config.charAt(a) == "|".charAt(0) || a == config.length()-1) - { - if(phase == 0) - { + if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { + if (phase == 0) { id = temp; temp = ""; - phase ++; - } - else if(phase == 1) - { + phase++; + } else if (phase == 1) { cut = Float.valueOf(temp); temp = ""; - phase ++; - } - else if(phase == 2) - { + phase++; + } else if (phase == 2) { pierce = Float.valueOf(temp); temp = ""; - phase ++; - } - else if(phase == 3) - { + phase++; + } else if (phase == 3) { blunt = Float.valueOf(temp); temp = ""; - - CustomDamageRatioEntry.registerEntity(id, new float[]{cut, blunt, pierce}); - MFLogUtil.logDebug("Added Custom entity: " + id + " With Ratio " + cut + ":" + pierce + ":" + blunt); + + CustomDamageRatioEntry.registerEntity(id, new float[] { cut, blunt, pierce }); + MFLogUtil + .logDebug("Added Custom entity: " + id + " With Ratio " + cut + ":" + pierce + ":" + blunt); phase = 0; } - } - else - { - if(config.charAt(a) != " ".charAt(0)) - { + } else { + if (config.charAt(a) != " ".charAt(0)) { temp = temp + config.charAt(a); } } } } - - private static Item getItemFromString(String id) - { + + private static Item getItemFromString(String id) { Object object = Item.itemRegistry.getObject(id); - return object != null && object instanceof Item ? (Item)object : null; + return object != null && object instanceof Item ? (Item) object : null; } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigMobs.java b/src/main/java/minefantasy/mf2/config/ConfigMobs.java index b1cc3391..208c10c8 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigMobs.java +++ b/src/main/java/minefantasy/mf2/config/ConfigMobs.java @@ -1,14 +1,11 @@ package minefantasy.mf2.config; -import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFH; import minefantasy.mf2.entity.mob.EntityDragon; -import minefantasy.mf2.mechanics.CombatMechanics; -public class ConfigMobs extends ConfigurationBaseMF -{ +public class ConfigMobs extends ConfigurationBaseMF { public static final String BASIC = "1-1: Basic Entities"; public static final String MOB_DRAGON = "2-4: DRAGON"; - + public static int youngdragonHP, dragonHP, diredragonHP, elderdragonHP, ancientdragonHP; public static int youngdragonMD, dragonMD, diredragonMD, elderdragonMD, ancientdragonMD; public static int youngdragonFD, dragonFD, diredragonFD, elderdragonFD, ancientdragonFD; @@ -19,103 +16,126 @@ public class ConfigMobs extends ConfigurationBaseMF public static boolean dragonGriefFire; public static boolean dragonGriefGeneral; public static boolean dragonMSG; - + public static final String MOB_MINOTAUR = "5-5: MINOTAUR"; - public static int minotaurHP, minotaurMD, minotaurGD, minotaurBT, minotaurBD, minotaurDC, minotaurGC, minotaurGCB, minotaurTC; - public static int guardminotaurHP, guardminotaurMD, guardminotaurGD, guardminotaurBT, guardminotaurBD, guardminotaurDC, guardminotaurGC, guardminotaurGCB, guardminotaurTC; - public static int eliteminotaurHP, eliteminotaurMD, eliteminotaurGD, eliteminotaurBT, eliteminotaurBD, eliteminotaurDC, eliteminotaurGC, eliteminotaurGCB, eliteminotaurTC; - public static int bossminotaurHP, bossminotaurMD, bossminotaurGD, bossminotaurBT, bossminotaurBD, bossminotaurDC, bossminotaurGC, bossminotaurGCB, bossminotaurTC; + public static int minotaurHP, minotaurMD, minotaurGD, minotaurBT, minotaurBD, minotaurDC, minotaurGC, minotaurGCB, + minotaurTC; + public static int guardminotaurHP, guardminotaurMD, guardminotaurGD, guardminotaurBT, guardminotaurBD, + guardminotaurDC, guardminotaurGC, guardminotaurGCB, guardminotaurTC; + public static int eliteminotaurHP, eliteminotaurMD, eliteminotaurGD, eliteminotaurBT, eliteminotaurBD, + eliteminotaurDC, eliteminotaurGC, eliteminotaurGCB, eliteminotaurTC; + public static int bossminotaurHP, bossminotaurMD, bossminotaurGD, bossminotaurBT, bossminotaurBD, bossminotaurDC, + bossminotaurGC, bossminotaurGCB, bossminotaurTC; public static int lightminotaurAR, mediumminotaurAR, heavyminotaurAR, frostminotaurAR, dreadminotaurAR; public static int minotaurSpawnrate, minotaurSpawnrateNether; - + @Override - protected void loadConfig() - { - youngdragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Aa: Health", 60, "Young Dragon Stats").getString()); - youngdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Ab: Bite dmg", 4).getString()); - youngdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Ab: Fire dmg", 2).getString()); - youngdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Ac: Fire time", 10).getString()); - - dragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Ba: Health", 100, "Adult Dragon Stats").getString()); - dragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Bb: Bite dmg", 7).getString()); - dragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Bb: Fire dmg", 5).getString()); - dragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Bc: Fire time", 40).getString()); - - diredragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Ca: Health", 200, "Dire Dragon Stats").getString()); - diredragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Cb: Bite dmg", 8).getString()); - diredragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Cb: Fire dmg", 8).getString()); - diredragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Cc: Fire time", 40).getString()); - - elderdragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Da: Health", 500, "Elder Dragon Stats").getString()); - elderdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Db: Bite dmg", 14).getString()); - elderdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Db: Fire dmg", 10).getString()); - elderdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Dc: Fire time", 50).getString()); - - ancientdragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Ea: Health", 1000, "Ancient Dragon Stats").getString()); - ancientdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Eb: Bite dmg", 20).getString()); - ancientdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Eb: Fire dmg", 10).getString()); - ancientdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Ec: Fire time", 100).getString()); - - - dragonInterval = Integer.parseInt(config.get(MOB_DRAGON, "3A: Dragon Spawn Interval", 12000, "How many ticks between visits (12000 means 4 times a day), there is a chance for a dragon each time").getString()); - dragonChance = Float.parseFloat(config.get(MOB_DRAGON, "3B: Spawn Chance", 5F, "A Percent (0-100) chance that a dragon spawns at set times").getString()); - - dragonKillNPC = Boolean.parseBoolean(config.get(MOB_DRAGON, "4A: Kill NPC Grief", true, "Should dragons kill NPCs (including villages as well as animals/mobs)... Not as determined though").getString()); - dragonGriefFire = Boolean.parseBoolean(config.get(MOB_DRAGON, "4B: Fire Grief", true, "Should fire breath start fires").getString()); - dragonGriefGeneral = Boolean.parseBoolean(config.get(MOB_DRAGON, "4C: General Block Grief", true, "Should blocks be frozen by frost breath, melted by fire, or glass shatter with fire and stomping").getString()); - dragonMSG = Boolean.parseBoolean(config.get(MOB_DRAGON, "4D: Spawn Message", true, "Will players get a message when dragons enter/leave").getString()); - EntityDragon.interestTimeSeconds = Integer.parseInt(config.get(MOB_DRAGON, "4E: Dragon Interest Time", 90, "How many seconds until a dragon leaves (2x as long if wounded) ").getString()); - EntityDragon.heartChance = Float.parseFloat(config.get(MOB_DRAGON, "4F: Heart Drop chance modifier", 1F, "Modify chance of getting a heart").getString()); - - minotaurSpawnrate = Integer.parseInt(config.get(MOB_MINOTAUR, "5Aa: Overworld Spawnrate", 5).getString()); - minotaurSpawnrateNether = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ab: Nether Spawnrate", 25).getString()); - - minotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ba: Health", 30, "Lesser Minotaur").getString()); - minotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bb: Pound dmg", 5).getString()); - minotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bc: Gore dmg", 5).getString()); - minotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bd: Beserk dmg", 7).getString()); - minotaurBT = Integer.parseInt(config.get(MOB_MINOTAUR, "5Be: Beserk threshold (% health)", 25).getString()); - minotaurDC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bf: Disarm chance when mob power attacks", 10).getString()); - minotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bg: Grab Chance", 5).getString()); - minotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bh: Grab Chance (Beserk)", 10).getString()); - minotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bi: Throw Chance", 20).getString()); - - guardminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ca: Health", 30, "Minotaur Warrior").getString()); - guardminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cb: Pound dmg", 6).getString()); - guardminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cc: Gore dmg", 7).getString()); - guardminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cd: Beserk dmg", 8).getString()); - guardminotaurBT = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ce: Beserk threshold (% health)", 35).getString()); - guardminotaurDC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cf: Disarm chance when mob power attacks", 10).getString()); - guardminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cg: Grab Chance", 5).getString()); - guardminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ch: Grab Chance (Beserk)", 10).getString()); - guardminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ci: Throw Chance", 20).getString()); - lightminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cj: Armour rating", 100).getString()); - - eliteminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Da: Health", 50, "Elite Minotaur").getString()); - eliteminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Db: Pound dmg", 6).getString()); - eliteminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dc: Gore dmg", 6).getString()); - eliteminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dd: Beserk dmg", 8).getString()); - eliteminotaurBT = Integer.parseInt(config.get(MOB_MINOTAUR, "5De: Beserk threshold (% health)", 40).getString()); - eliteminotaurDC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Df: Disarm chance when mob power attacks", 20).getString()); - eliteminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dg: Grab Chance", 10).getString()); - eliteminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dh: Grab Chance (Beserk)", 20).getString()); - eliteminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Di: Throw Chance", 20).getString()); - mediumminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dj: Armour rating", 400).getString()); - - bossminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ea: Health", 60, "Minotaur Warlord").getString()); - bossminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eb: Pound dmg", 8).getString()); - bossminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ec: Gore dmg", 10).getString()); - bossminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ed: Beserk dmg", 10).getString()); - bossminotaurBT = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ee: Beserk threshold (% health)", 40).getString()); - bossminotaurDC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ef: Disarm chance when mob power attacks", 40).getString()); - bossminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eg: Grab Chance", 20).getString()); - bossminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eh: Grab Chance (Beserk)", 40).getString()); - bossminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ei: Throw Chance", 20).getString()); - heavyminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ej: Armour rating", 600).getString()); - - frostminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Fa: Frost armour bonus", 50, "Species Bonus").getString()); - dreadminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Fb: Dread armour bonus", 100).getString()); - + protected void loadConfig() { + youngdragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Aa: Health", 60, "Young Dragon Stats").getString()); + youngdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Ab: Bite dmg", 4).getString()); + youngdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Ab: Fire dmg", 2).getString()); + youngdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Ac: Fire time", 10).getString()); + + dragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Ba: Health", 100, "Adult Dragon Stats").getString()); + dragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Bb: Bite dmg", 7).getString()); + dragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Bb: Fire dmg", 5).getString()); + dragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Bc: Fire time", 40).getString()); + + diredragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Ca: Health", 200, "Dire Dragon Stats").getString()); + diredragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Cb: Bite dmg", 8).getString()); + diredragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Cb: Fire dmg", 8).getString()); + diredragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Cc: Fire time", 40).getString()); + + elderdragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Da: Health", 500, "Elder Dragon Stats").getString()); + elderdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Db: Bite dmg", 14).getString()); + elderdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Db: Fire dmg", 10).getString()); + elderdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Dc: Fire time", 50).getString()); + + ancientdragonHP = Integer + .parseInt(config.get(MOB_DRAGON, "2Ea: Health", 1000, "Ancient Dragon Stats").getString()); + ancientdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Eb: Bite dmg", 20).getString()); + ancientdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Eb: Fire dmg", 10).getString()); + ancientdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Ec: Fire time", 100).getString()); + + dragonInterval = Integer.parseInt(config.get(MOB_DRAGON, "3A: Dragon Spawn Interval", 12000, + "How many ticks between visits (12000 means 4 times a day), there is a chance for a dragon each time") + .getString()); + dragonChance = Float.parseFloat(config + .get(MOB_DRAGON, "3B: Spawn Chance", 5F, "A Percent (0-100) chance that a dragon spawns at set times") + .getString()); + + dragonKillNPC = Boolean.parseBoolean(config.get(MOB_DRAGON, "4A: Kill NPC Grief", true, + "Should dragons kill NPCs (including villages as well as animals/mobs)... Not as determined though") + .getString()); + dragonGriefFire = Boolean.parseBoolean( + config.get(MOB_DRAGON, "4B: Fire Grief", true, "Should fire breath start fires").getString()); + dragonGriefGeneral = Boolean.parseBoolean(config.get(MOB_DRAGON, "4C: General Block Grief", true, + "Should blocks be frozen by frost breath, melted by fire, or glass shatter with fire and stomping") + .getString()); + dragonMSG = Boolean.parseBoolean( + config.get(MOB_DRAGON, "4D: Spawn Message", true, "Will players get a message when dragons enter/leave") + .getString()); + EntityDragon.interestTimeSeconds = Integer.parseInt(config.get(MOB_DRAGON, "4E: Dragon Interest Time", 90, + "How many seconds until a dragon leaves (2x as long if wounded) ").getString()); + EntityDragon.heartChance = Float.parseFloat(config + .get(MOB_DRAGON, "4F: Heart Drop chance modifier", 1F, "Modify chance of getting a heart").getString()); + + minotaurSpawnrate = Integer.parseInt(config.get(MOB_MINOTAUR, "5Aa: Overworld Spawnrate", 5).getString()); + minotaurSpawnrateNether = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ab: Nether Spawnrate", 25).getString()); + + minotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ba: Health", 30, "Lesser Minotaur").getString()); + minotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bb: Pound dmg", 5).getString()); + minotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bc: Gore dmg", 5).getString()); + minotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bd: Beserk dmg", 7).getString()); + minotaurBT = Integer.parseInt(config.get(MOB_MINOTAUR, "5Be: Beserk threshold (% health)", 25).getString()); + minotaurDC = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Bf: Disarm chance when mob power attacks", 10).getString()); + minotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bg: Grab Chance", 5).getString()); + minotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bh: Grab Chance (Beserk)", 10).getString()); + minotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bi: Throw Chance", 20).getString()); + + guardminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ca: Health", 30, "Minotaur Warrior").getString()); + guardminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cb: Pound dmg", 6).getString()); + guardminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cc: Gore dmg", 7).getString()); + guardminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cd: Beserk dmg", 8).getString()); + guardminotaurBT = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Ce: Beserk threshold (% health)", 35).getString()); + guardminotaurDC = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Cf: Disarm chance when mob power attacks", 10).getString()); + guardminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cg: Grab Chance", 5).getString()); + guardminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ch: Grab Chance (Beserk)", 10).getString()); + guardminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ci: Throw Chance", 20).getString()); + lightminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cj: Armour rating", 100).getString()); + + eliteminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Da: Health", 50, "Elite Minotaur").getString()); + eliteminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Db: Pound dmg", 6).getString()); + eliteminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dc: Gore dmg", 6).getString()); + eliteminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dd: Beserk dmg", 8).getString()); + eliteminotaurBT = Integer + .parseInt(config.get(MOB_MINOTAUR, "5De: Beserk threshold (% health)", 40).getString()); + eliteminotaurDC = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Df: Disarm chance when mob power attacks", 20).getString()); + eliteminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dg: Grab Chance", 10).getString()); + eliteminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dh: Grab Chance (Beserk)", 20).getString()); + eliteminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Di: Throw Chance", 20).getString()); + mediumminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dj: Armour rating", 400).getString()); + + bossminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ea: Health", 60, "Minotaur Warlord").getString()); + bossminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eb: Pound dmg", 8).getString()); + bossminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ec: Gore dmg", 10).getString()); + bossminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ed: Beserk dmg", 10).getString()); + bossminotaurBT = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ee: Beserk threshold (% health)", 40).getString()); + bossminotaurDC = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Ef: Disarm chance when mob power attacks", 40).getString()); + bossminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eg: Grab Chance", 20).getString()); + bossminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eh: Grab Chance (Beserk)", 40).getString()); + bossminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ei: Throw Chance", 20).getString()); + heavyminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ej: Armour rating", 600).getString()); + + frostminotaurAR = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Fa: Frost armour bonus", 50, "Species Bonus").getString()); + dreadminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Fb: Dread armour bonus", 100).getString()); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigStamina.java b/src/main/java/minefantasy/mf2/config/ConfigStamina.java index 1a80a6fb..e63c762b 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigStamina.java +++ b/src/main/java/minefantasy/mf2/config/ConfigStamina.java @@ -2,10 +2,9 @@ import minefantasy.mf2.api.stamina.StaminaBar; -public class ConfigStamina extends ConfigurationBaseMF -{ +public class ConfigStamina extends ConfigurationBaseMF { public static String VALUES = "Value Modifiers"; - + public static float exhaustDamage; public static float weaponModifier; public static float sprintModifier; @@ -14,42 +13,69 @@ public class ConfigStamina extends ConfigurationBaseMF public static float bowModifier; public static float miningSpeed; - public static String OPTION = "Options"; - + public static boolean affectSpeed; public static boolean affectMining; - - + public static String OTHER = "Misc"; - + @Override - protected void loadConfig() - { - StaminaBar.isSystemActive = Boolean.parseBoolean(config.get("##Activate Stamina System##", "Is enabled", true, "This is the main switch for the stamina bar and all it's features. Setting false disables the system entirely").getString()); - - StaminaBar.decayModifierCfg = Float.parseFloat(config.get(VALUES, "Decay Modifier", 1.0F, "This modifies the rate of decay").getString()); - StaminaBar.configRegenModifier = Float.parseFloat(config.get(VALUES, "Regen Modifier", 1.0F, "This modifies the rate of regen").getString()); - StaminaBar.pauseModifier = Float.parseFloat(config.get(VALUES, "Idle Modifier", 1.0F, "This modifies the time between decaying and regenning back").getString()); - StaminaBar.configBulk = Float.parseFloat(config.get(VALUES, "Bulk Regen Modifier", 1.0F, "This is the rate that worn apparel slows regen: Most items bring it down by 25%, plate is more scale/leather is less").getString()); - StaminaBar.scaleDifficulty = Boolean.parseBoolean(config.get(VALUES, "Difficulty Scale Decay", false, "This makes difficulty change your decay rate across all fields: peaceful(-50%), easy(-25%), normal(base), hard(+25%)").getString()); - StaminaBar.defaultMax = Float.parseFloat(config.get(VALUES, "Max stamina base", 100F, "This is where your stamina starts on spawning, Note that when changed: it only applies on death or new worlds").getString()); - //StaminaBar.restrictSystem = Boolean.parseBoolean(config.get("Restrict use to players", "Will restrict", false, "This restricts the stamina system only to players").getString()); - - weaponModifier = Float.parseFloat(config.get(VALUES, "Weapon Modifier", 1.0F, "This modifies the amount using weapons influences stamina").getString()); - sprintModifier = Float.parseFloat(config.get(VALUES, "Sprint Modifier", 1.0F, "Modify how fast sprinting decays stamina").getString()); - fullRegenSeconds = Integer.parseInt(config.get(VALUES, "Regen Time", 15, "Base time(seconds) until the metre is refilled(this is the base, other variables will be modified)").getString()); - weaponDrain = Float.parseFloat(config.get(VALUES, "Exhausted Damage Modifier", 0.85F, "This is how being exhausted(empty stamina) influences your damage as a decimal. 0.85 = 85%. A value more than 1 increases the damage when out of stamina").getString()); - bowModifier = Float.parseFloat(config.get(VALUES, "Bow Time", 1.0F, "Modifies the rate drawing bows will drain stamina").getString()); - StaminaBar.configArmourWeightModifier = Float.parseFloat(config.get(VALUES, "Weight Modifier", 1.0F, "Modifies the amount weight of armour slows decay").getString()); - miningSpeed = Float.parseFloat(config.get(VALUES, "Mining Modifier", 1.0F, "Modifies the rate block breaking drains stamina").getString()); - exhaustDamage = Float.parseFloat(config.get(VALUES, "Exhausted Damage Modifier", 1.5F, "How much damage you take when out of stamina (1.5 = +50% more damage)").getString()); - - affectSpeed = Boolean.parseBoolean(config.get(OPTION, "Affect Speed", true, "Slowness effect adds when out of stamina").getString()); - affectMining = Boolean.parseBoolean(config.get(OPTION, "Affect Mining", true, "Breaking blocks drains stamina, adds mining fatigue").getString()); - - StaminaBar.levelUp = Boolean.parseBoolean(config.get(OTHER, "Level Max Stamina", false, "This makes your experience bar increase max stamina").getString()); - StaminaBar.levelAmount = Float.parseFloat(config.get(OTHER, "Level Up Amount", 5F, "How much an experience level increases stamina max").getString()); + protected void loadConfig() { + StaminaBar.isSystemActive = Boolean.parseBoolean(config.get("##Activate Stamina System##", "Is enabled", true, + "This is the main switch for the stamina bar and all it's features. Setting false disables the system entirely") + .getString()); + + StaminaBar.decayModifierCfg = Float + .parseFloat(config.get(VALUES, "Decay Modifier", 1.0F, "This modifies the rate of decay").getString()); + StaminaBar.configRegenModifier = Float + .parseFloat(config.get(VALUES, "Regen Modifier", 1.0F, "This modifies the rate of regen").getString()); + StaminaBar.pauseModifier = Float.parseFloat( + config.get(VALUES, "Idle Modifier", 1.0F, "This modifies the time between decaying and regenning back") + .getString()); + StaminaBar.configBulk = Float.parseFloat(config.get(VALUES, "Bulk Regen Modifier", 1.0F, + "This is the rate that worn apparel slows regen: Most items bring it down by 25%, plate is more scale/leather is less") + .getString()); + StaminaBar.scaleDifficulty = Boolean.parseBoolean(config.get(VALUES, "Difficulty Scale Decay", false, + "This makes difficulty change your decay rate across all fields: peaceful(-50%), easy(-25%), normal(base), hard(+25%)") + .getString()); + StaminaBar.defaultMax = Float.parseFloat(config.get(VALUES, "Max stamina base", 100F, + "This is where your stamina starts on spawning, Note that when changed: it only applies on death or new worlds") + .getString()); + // StaminaBar.restrictSystem = Boolean.parseBoolean(config.get("Restrict use to + // players", "Will restrict", false, "This restricts the stamina system only to + // players").getString()); + + weaponModifier = Float.parseFloat( + config.get(VALUES, "Weapon Modifier", 1.0F, "This modifies the amount using weapons influences stamina") + .getString()); + sprintModifier = Float.parseFloat( + config.get(VALUES, "Sprint Modifier", 1.0F, "Modify how fast sprinting decays stamina").getString()); + fullRegenSeconds = Integer.parseInt(config.get(VALUES, "Regen Time", 15, + "Base time(seconds) until the metre is refilled(this is the base, other variables will be modified)") + .getString()); + weaponDrain = Float.parseFloat(config.get(VALUES, "Exhausted Damage Modifier", 0.85F, + "This is how being exhausted(empty stamina) influences your damage as a decimal. 0.85 = 85%. A value more than 1 increases the damage when out of stamina") + .getString()); + bowModifier = Float.parseFloat( + config.get(VALUES, "Bow Time", 1.0F, "Modifies the rate drawing bows will drain stamina").getString()); + StaminaBar.configArmourWeightModifier = Float.parseFloat(config + .get(VALUES, "Weight Modifier", 1.0F, "Modifies the amount weight of armour slows decay").getString()); + miningSpeed = Float.parseFloat(config + .get(VALUES, "Mining Modifier", 1.0F, "Modifies the rate block breaking drains stamina").getString()); + exhaustDamage = Float.parseFloat(config.get(VALUES, "Exhausted Damage Modifier", 1.5F, + "How much damage you take when out of stamina (1.5 = +50% more damage)").getString()); + + affectSpeed = Boolean.parseBoolean( + config.get(OPTION, "Affect Speed", true, "Slowness effect adds when out of stamina").getString()); + affectMining = Boolean.parseBoolean(config + .get(OPTION, "Affect Mining", true, "Breaking blocks drains stamina, adds mining fatigue").getString()); + + StaminaBar.levelUp = Boolean.parseBoolean( + config.get(OTHER, "Level Max Stamina", false, "This makes your experience bar increase max stamina") + .getString()); + StaminaBar.levelAmount = Float.parseFloat(config + .get(OTHER, "Level Up Amount", 5F, "How much an experience level increases stamina max").getString()); } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigTools.java b/src/main/java/minefantasy/mf2/config/ConfigTools.java index a9eefd28..29049890 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigTools.java +++ b/src/main/java/minefantasy/mf2/config/ConfigTools.java @@ -1,23 +1,22 @@ package minefantasy.mf2.config; -public class ConfigTools extends ConfigurationBaseMF -{ +public class ConfigTools extends ConfigurationBaseMF { public static final String CATEGORY_BONUS = "Bonuses"; - + public static float handpickBonus; - public static final String CATEGORY_PENALTIES = "Penalties"; - + public static float hvyDropChance; - - + @Override - protected void loadConfig() - { - handpickBonus = Float.parseFloat(config.get(CATEGORY_BONUS, "Handpick double-drop chance", 20F, "This is the percent value (0-100) handpicks double item drops").getString()); - - hvyDropChance = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Heavy ruin-drop chance", 25F, "This is the percent value (0-100) heavy picks/shovels and lumber axe do NOT drop blocks on break").getString()); + protected void loadConfig() { + handpickBonus = Float.parseFloat(config.get(CATEGORY_BONUS, "Handpick double-drop chance", 20F, + "This is the percent value (0-100) handpicks double item drops").getString()); + + hvyDropChance = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Heavy ruin-drop chance", 25F, + "This is the percent value (0-100) heavy picks/shovels and lumber axe do NOT drop blocks on break") + .getString()); } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigWeapon.java b/src/main/java/minefantasy/mf2/config/ConfigWeapon.java index 1305224a..31e63d74 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigWeapon.java +++ b/src/main/java/minefantasy/mf2/config/ConfigWeapon.java @@ -1,26 +1,32 @@ package minefantasy.mf2.config; -public class ConfigWeapon extends ConfigurationBaseMF -{ +public class ConfigWeapon extends ConfigurationBaseMF { public static final String CATEGORY_PENALTIES = "Penalties"; - + public static boolean useBalance; public static boolean breakArrowsGround; public static float arrowBreakMod; - + public static final String CATEGORY_BONUS = "Bonuses"; - + public static boolean xpTrain; - @Override - protected void loadConfig() - { - useBalance = Boolean.parseBoolean(config.get(CATEGORY_PENALTIES, "Heavy Weapon Balance", true, "This causes heavy weapons to throw the camera off angle. This is recommended as it gives a downside to avoid overpowering heavy weapons. With this active: spamming hits is difficult").getString()); - breakArrowsGround = Boolean.parseBoolean(config.get(CATEGORY_PENALTIES, "Arrow Ground Break", true, "Arrows can break when hitting the ground").getString()); - arrowBreakMod = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Arrow Break Chance modifier", 1.0F, "This modifies the rate that arrows break when hitting blocks, 1.0=normal higher numbers increases the break chance").getString()); - - xpTrain = Boolean.parseBoolean(config.get(CATEGORY_BONUS, "Training weapon xp", true, "This option allows training weapons to increase your xp level slowly when hitting with them").getString()); + protected void loadConfig() { + useBalance = Boolean.parseBoolean(config.get(CATEGORY_PENALTIES, "Heavy Weapon Balance", true, + "This causes heavy weapons to throw the camera off angle. This is recommended as it gives a downside to avoid overpowering heavy weapons. With this active: spamming hits is difficult") + .getString()); + breakArrowsGround = Boolean.parseBoolean( + config.get(CATEGORY_PENALTIES, "Arrow Ground Break", true, "Arrows can break when hitting the ground") + .getString()); + arrowBreakMod = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Arrow Break Chance modifier", 1.0F, + "This modifies the rate that arrows break when hitting blocks, 1.0=normal higher numbers increases the break chance") + .getString()); + + xpTrain = Boolean.parseBoolean(config + .get(CATEGORY_BONUS, "Training weapon xp", true, + "This option allows training weapons to increase your xp level slowly when hitting with them") + .getString()); } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigWorldGen.java b/src/main/java/minefantasy/mf2/config/ConfigWorldGen.java index 6b4cf6cd..6b232307 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigWorldGen.java +++ b/src/main/java/minefantasy/mf2/config/ConfigWorldGen.java @@ -1,9 +1,6 @@ package minefantasy.mf2.config; -import minefantasy.mf2.mechanics.worldGen.WorldGenMFBase; - -public class ConfigWorldGen extends ConfigurationBaseMF -{ +public class ConfigWorldGen extends ConfigurationBaseMF { public static String copper = "1A: [Ore Gen] Copper Ore"; public static float copperRarity; public static int copperFrequencyMin; @@ -11,8 +8,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int copperLayerMin; public static int copperLayerMax; public static int copperSize; - - + public static String tin = "1B: [Ore Gen] Tin Ore"; public static float tinRarity; public static int tinFrequencyMin; @@ -20,8 +16,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int tinLayerMin; public static int tinLayerMax; public static int tinSize; - - + public static String silver = "1C: [Ore Gen] Silver Ore"; public static float silverRarity; public static int silverFrequencyMin; @@ -29,7 +24,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int silverLayerMin; public static int silverLayerMax; public static int silverSize; - + public static String wolframite = "1D: [Ore Gen] Wolframite Ore"; public static float wolframiteRarity; public static int wolframiteFrequencyMin; @@ -37,7 +32,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int wolframiteLayerMin; public static int wolframiteLayerMax; public static int wolframiteSize; - + public static String mythic = "1E: [Ore Gen] Mythic Ore"; public static float mythicRarity; public static int mythicFrequencyMin; @@ -45,8 +40,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int mythicLayerMin; public static int mythicLayerMax; public static int mythicSize; - - + public static String kaolinite = "2A: [Mineral Gen] Kaolinite Deposit"; public static float kaoliniteRarity; public static int kaoliniteFrequencyMin; @@ -54,7 +48,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int kaoliniteLayerMin; public static int kaoliniteLayerMax; public static int kaoliniteSize; - + public static String clay = "2B: [Mineral Gen] Clay Deposit"; public static float clayRarity; public static int clayFrequencyMin; @@ -62,7 +56,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int clayLayerMin; public static int clayLayerMax; public static int claySize; - + public static String nitre = "2C: [Mineral Gen] Nitre Deposit"; public static float nitreRarity; public static int nitreFrequencyMin; @@ -70,7 +64,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int nitreLayerMin; public static int nitreLayerMax; public static int nitreSize; - + public static String sulfur = "2D: [Mineral Gen] Sulfur Deposit"; public static float sulfurRarity; public static int sulfurFrequencyMin; @@ -78,7 +72,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int sulfurLayerMin; public static int sulfurLayerMax; public static int sulfurSize; - + public static String borax = "2E: [Mineral Gen] Borax Deposit"; public static float boraxRarity; public static int boraxFrequencyMin; @@ -86,7 +80,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int boraxLayerMin; public static int boraxLayerMax; public static int boraxSize; - + public static String coal = "2F: [Mineral Gen] Rich Coal Deposit"; public static float coalRarity; public static int coalFrequencyMin; @@ -94,7 +88,7 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int coalLayerMin; public static int coalLayerMax; public static int coalSize; - + public static String limestone = "3A: [Rock Gen] Limestone"; public static float limestoneRarity; public static int limestoneFrequencyMax; @@ -102,35 +96,35 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static int limestoneLayerMax; public static int limestoneLayerMin; public static int limestoneSize; - + public static String berry = "4A: [Plant Gen] Berry Bush"; public static float berryRarity; public static float berryMinTemp; public static float berryMaxTemp; public static float berryMinRain; public static float berryMaxRain; - + public static String yew = "5A: [Tree Gen] Yew"; public static float yewRarity; public static float yewMinTemp; public static float yewMaxTemp; public static float yewMinRain; public static float yewMaxRain; - + public static String ironbark = "5B: [Tree Gen] Ironbark"; public static float ironbarkRarity; public static float ironbarkMinTemp; public static float ironbarkMaxTemp; public static float ironbarkMinRain; public static float ironbarkMaxRain; - + public static String ebony = "5C: [Tree Gen] Ebony"; public static float ebonyRarity; public static float ebonyMinTemp; public static float ebonyMaxTemp; public static float ebonyMinRain; public static float ebonyMaxRain; - + public static String structure = "6A: [Structure Gen] General"; public static int structureTickRate; public static String ancientForge = "6B: [Structure Gen] Ancient Forge"; @@ -140,132 +134,285 @@ public class ConfigWorldGen extends ConfigurationBaseMF public static String dwarvenSH = "6D: [Structure Gen] Dwarven Stronghold"; public static float DSChance; public static int DSGrid, DSLength, DSDeviations; - + @Override - protected void loadConfig() - { - copperRarity = Float.parseFloat(config.get(copper, "Copper Rarity", 1.0D, "The chance for copper to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any copper").getString()); - copperFrequencyMin = Integer.parseInt(config.get(copper, "Copper Frequency Min", 8, "Copper will try spawn between this and max veins per chunk").getString()); - copperFrequencyMax = Integer.parseInt(config.get(copper, "Copper Frequency Max", 8, "Copper will try spawn between min and this veins per chunk").getString()); - copperLayerMin = Integer.parseInt(config.get(copper, "Copper Layer Min", 48, "Copper veins spawn above this layer").getString()); - copperLayerMax = Integer.parseInt(config.get(copper, "Copper Layer Max", 96, "Copper veins spawn below this layer").getString()); - copperSize = Integer.parseInt(config.get(copper, "Copper Size", 8, "How many blocks consist of the vein").getString()); - - tinRarity = Float.parseFloat(config.get(tin, "Tin Rarity", 1.0D, "The chance for tin to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any tin").getString()); - tinFrequencyMin = Integer.parseInt(config.get(tin, "Tin Frequency Min", 8, "Tin will try spawn between this and max veins per chunk").getString()); - tinFrequencyMax = Integer.parseInt(config.get(tin, "Tin Frequency Max", 8, "Tin will try spawn between min and this veins per chunk").getString()); - tinLayerMin = Integer.parseInt(config.get(tin, "Tin Layer Min", 48, "Tin veins spawn above this layer").getString()); - tinLayerMax = Integer.parseInt(config.get(tin, "Tin Layer Max", 96, "Tin veins spawn below this layer").getString()); + protected void loadConfig() { + copperRarity = Float.parseFloat(config.get(copper, "Copper Rarity", 1.0D, + "The chance for copper to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any copper") + .getString()); + copperFrequencyMin = Integer.parseInt(config + .get(copper, "Copper Frequency Min", 8, "Copper will try spawn between this and max veins per chunk") + .getString()); + copperFrequencyMax = Integer.parseInt(config + .get(copper, "Copper Frequency Max", 8, "Copper will try spawn between min and this veins per chunk") + .getString()); + copperLayerMin = Integer.parseInt( + config.get(copper, "Copper Layer Min", 48, "Copper veins spawn above this layer").getString()); + copperLayerMax = Integer.parseInt( + config.get(copper, "Copper Layer Max", 96, "Copper veins spawn below this layer").getString()); + copperSize = Integer + .parseInt(config.get(copper, "Copper Size", 8, "How many blocks consist of the vein").getString()); + + tinRarity = Float.parseFloat(config.get(tin, "Tin Rarity", 1.0D, + "The chance for tin to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any tin") + .getString()); + tinFrequencyMin = Integer.parseInt( + config.get(tin, "Tin Frequency Min", 8, "Tin will try spawn between this and max veins per chunk") + .getString()); + tinFrequencyMax = Integer.parseInt( + config.get(tin, "Tin Frequency Max", 8, "Tin will try spawn between min and this veins per chunk") + .getString()); + tinLayerMin = Integer + .parseInt(config.get(tin, "Tin Layer Min", 48, "Tin veins spawn above this layer").getString()); + tinLayerMax = Integer + .parseInt(config.get(tin, "Tin Layer Max", 96, "Tin veins spawn below this layer").getString()); tinSize = Integer.parseInt(config.get(tin, "Tin Size", 5, "How many blocks consist of the vein").getString()); - - silverRarity = Float.parseFloat(config.get(silver, "Silver Rarity", 1.0D, "The chance for silver to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any ").getString()); - silverFrequencyMin = Integer.parseInt(config.get(silver, "Silver Frequency Min", 3, "Silver will try spawn between this and max veins per chunk").getString()); - silverFrequencyMax = Integer.parseInt(config.get(silver, "Silver Frequency Max", 4, "Silver will try spawn between min and this veins per chunk").getString()); - silverLayerMin = Integer.parseInt(config.get(silver, "Silver Layer Min", 0, "Silver veins spawn above this layer").getString()); - silverLayerMax = Integer.parseInt(config.get(silver, "Silver Layer Max", 32, "Silver veins spawn below this layer").getString()); - silverSize = Integer.parseInt(config.get(silver, "Silver Size", 8, "How many blocks consist of the vein").getString()); - - wolframiteRarity = Float.parseFloat(config.get(wolframite, "Wolframite Rarity", 1.0D, "The chance for wolframite to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any ").getString()); - wolframiteFrequencyMin = Integer.parseInt(config.get(wolframite, "Wolframite Frequency Min", 1, "Wolframite will try spawn between this and max veins per chunk").getString()); - wolframiteFrequencyMax = Integer.parseInt(config.get(wolframite, "Wolframite Frequency Max", 1, "Wolframite will try spawn between min and this veins per chunk").getString()); - wolframiteLayerMin = Integer.parseInt(config.get(wolframite, "Wolframite Layer Min", 0, "Wolframite veins spawn above this layer").getString()); - wolframiteLayerMax = Integer.parseInt(config.get(wolframite, "Wolframite Layer Max", 16, "Wolframite veins spawn below this layer").getString()); - wolframiteSize = Integer.parseInt(config.get(wolframite, "Wolframite Size", 7, "How many blocks consist of the vein").getString()); - - mythicRarity = Float.parseFloat(config.get(mythic, "Mythic Rarity", 0.05D, "The chance for mythic to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any mythic").getString()); - mythicFrequencyMin = Integer.parseInt(config.get(mythic, "Mythic Frequency Min", 2, "Mythic will try spawn between this and max veins per chunk").getString()); - mythicFrequencyMax = Integer.parseInt(config.get(mythic, "Mythic Frequency Max", 5, "Mythic will try spawn between min and this veins per chunk").getString()); - mythicLayerMin = Integer.parseInt(config.get(mythic, "Mythic Layer Min", 4, "Mythic veins spawn above this layer").getString()); - mythicLayerMax = Integer.parseInt(config.get(mythic, "Mythic Layer Max", 6, "Mythic veins spawn below this layer").getString()); - mythicSize = Integer.parseInt(config.get(mythic, "Mythic Size", 8, "How many blocks consist of the vein").getString()); - - - kaoliniteRarity = Float.parseFloat(config.get(kaolinite, "Kaolinite Rarity", 0.25D, "The chance for kaolinite to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any kaolinite").getString()); - kaoliniteFrequencyMin = Integer.parseInt(config.get(kaolinite, "Kaolinite Frequency Min", 1, "Kaolinite will try spawn between this and max deposits per chunk").getString()); - kaoliniteFrequencyMax = Integer.parseInt(config.get(kaolinite, "Kaolinite Frequency Max", 1, "Kaolinite will try spawn between min and this deposits per chunk").getString()); - kaoliniteLayerMin = Integer.parseInt(config.get(kaolinite, "Kaolinite Layer Min", 48, "Kaolinite deposits spawn above this layer").getString()); - kaoliniteLayerMax = Integer.parseInt(config.get(kaolinite, "Kaolinite Layer Max", 72, "Kaolinite deposits spawn below this layer").getString()); - kaoliniteSize = Integer.parseInt(config.get(kaolinite, "Kaolinite Size", 16, "How many blocks consist of the deposit").getString()); - - //Coal: 20 deposits of 16: Up to 320 coal value per chunk - //Rich Coal: 10 deposits of 8: up to 80 coal value - coalRarity = Float.parseFloat(config.get(coal, "Rich Coal Rarity", 1F, "The chance for rich coal to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any rich coal deposits").getString()); - coalFrequencyMin = Integer.parseInt(config.get(coal, "Rich Coal Frequency Min", 5, "Rich Coal will try spawn between this and max deposits per chunk").getString()); - coalFrequencyMax = Integer.parseInt(config.get(coal, "Rich Coal Frequency Max", 5, "Rich Coal will try spawn between min and this deposits per chunk").getString()); - coalLayerMin = Integer.parseInt(config.get(coal, "Rich Coal Layer Min", 0, "Rich Coal deposits spawn above this layer").getString()); - coalLayerMax = Integer.parseInt(config.get(coal, "Rich Coal Layer Max", 64, "Rich Coal deposits spawn below this layer").getString()); - coalSize = Integer.parseInt(config.get(coal, "Rich Coal Size", 8, "How many blocks consist of the deposit").getString()); - - clayRarity = Float.parseFloat(config.get(clay, "Clay Rarity", 0.15D, "The chance for clay to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any clay").getString()); - clayFrequencyMin = Integer.parseInt(config.get(clay, "Clay Frequency Min", 1, "Clay will try spawn between this and max deposits per chunk").getString()); - clayFrequencyMax = Integer.parseInt(config.get(clay, "Clay Frequency Max", 1, "Clay will try spawn between min and this deposits per chunk").getString()); - clayLayerMin = Integer.parseInt(config.get(clay, "Clay Layer Min", 60, "Clay deposits spawn above this layer").getString()); - clayLayerMax = Integer.parseInt(config.get(clay, "Clay Layer Max", 68, "Clay deposits spawn below this layer").getString()); - claySize = Integer.parseInt(config.get(clay, "Clay Size", 32, "How many blocks consist of the deposit").getString()); - - nitreRarity = Float.parseFloat(config.get(nitre, "Nitre Rarity", 1.0D, "The chance for nitre to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any nitre").getString()); - nitreFrequencyMin = Integer.parseInt(config.get(nitre, "Nitre Frequency Min", 2, "Nitre will try spawn between this and max deposits per chunk").getString()); - nitreFrequencyMax = Integer.parseInt(config.get(nitre, "Nitre Frequency Max", 5, "Nitre will try spawn between min and this deposits per chunk").getString()); - nitreLayerMin = Integer.parseInt(config.get(nitre, "Nitre Layer Min", 16, "Nitre deposits spawn above this layer").getString()); - nitreLayerMax = Integer.parseInt(config.get(nitre, "Nitre Layer Max", 64, "Nitre deposits spawn below this layer").getString()); - nitreSize = Integer.parseInt(config.get(nitre, "Nitre Size", 8, "How many blocks consist of the deposit").getString()); - - sulfurRarity = Float.parseFloat(config.get(sulfur, "Sulfur Rarity", 1.0D, "The chance for sulfur to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any sulfur").getString()); - sulfurFrequencyMin = Integer.parseInt(config.get(sulfur, "Sulfur Frequency Min", 6, "Sulfur will try spawn between this and max deposits per chunk").getString()); - sulfurFrequencyMax = Integer.parseInt(config.get(sulfur, "Sulfur Frequency Max", 12, "Sulfur will try spawn between min and this deposits per chunk").getString()); - sulfurLayerMin = Integer.parseInt(config.get(sulfur, "Sulfur Layer Min", 0, "Sulfur deposits spawn above this layer").getString()); - sulfurLayerMax = Integer.parseInt(config.get(sulfur, "Sulfur Layer Max", 16, "Sulfur deposits spawn below this layer").getString()); - sulfurSize = Integer.parseInt(config.get(sulfur, "Sulfur Size", 4, "How many blocks consist of the deposit").getString()); - - boraxRarity = Float.parseFloat(config.get(borax, "Borax Rarity", 0.1D, "The chance for borax to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any borax").getString()); - boraxFrequencyMin = Integer.parseInt(config.get(borax, "Borax Frequency Min", 5, "Borax will try spawn between this and max deposits per chunk").getString()); - boraxFrequencyMax = Integer.parseInt(config.get(borax, "Borax Frequency Max", 10, "Borax will try spawn between min and this deposits per chunk").getString()); - boraxLayerMin = Integer.parseInt(config.get(borax, "Borax Layer Min", 48, "Borax deposits spawn above this layer").getString()); - boraxLayerMax = Integer.parseInt(config.get(borax, "Borax Layer Max", 96, "Borax deposits spawn below this layer").getString()); - boraxSize = Integer.parseInt(config.get(borax, "Borax Size", 8, "How many blocks consist of the deposit").getString()); - - limestoneRarity = Float.parseFloat(config.get(limestone, "Limestone Rarity", 2.5E-2D, "The chance for limestone to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any limestone").getString()); - limestoneFrequencyMin = Integer.parseInt(config.get(limestone, "Limestone Frequency Min", 1, "Limestone will try spawn between this and max deposits per chunk").getString()); - limestoneFrequencyMax = Integer.parseInt(config.get(limestone, "Limestone Frequency Max", 1, "Limestone will try spawn between min and this deposits per chunk").getString()); - limestoneLayerMin = Integer.parseInt(config.get(limestone, "Limestone Layer Min", 48, "Limestone deposits spawn above this layer").getString()); - limestoneLayerMax = Integer.parseInt(config.get(limestone, "Limestone Layer Max", 96, "Limestone deposits spawn below this layer").getString()); - limestoneSize = Integer.parseInt(config.get(limestone, "Limestone Size", 128, "How many blocks consist of the deposit").getString()); - - //Trees and Plants use SN values to make them more compact (since their pretty rare) - berryRarity = Float.parseFloat(config.get(berry, "Berry Bush Rarity", 3.0E-2D, "The chance for berry bushes to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any berries").getString()); - yewRarity = Float.parseFloat(config.get(yew, "Yew Tree Rarity", 1.0E-3D, "The chance for yew trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees").getString()); - ironbarkRarity = Float.parseFloat(config.get(ironbark, "Ironbark Tree Rarity", 1.5E-3D, "The chance for ironbark trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees").getString()); - ebonyRarity = Float.parseFloat(config.get(ebony, "Ebony Tree Rarity", 5.0E-4D, "The chance for ebony trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees").getString()); - - berryMinTemp = Float.parseFloat(config.get(berry, "Berry Bush Spawn Temp Min", 0.2D, "The minimal biome temperature berries can spawn").getString()); - berryMaxTemp = Float.parseFloat(config.get(berry, "Berry Bush Spawn Temp Max", 1.0D, "The maximum biome temperature berries can spawn").getString()); - berryMinRain = Float.parseFloat(config.get(berry, "Berry Bush Spawn Rain Min", 0.3D, "The minimal biome rainfall berries can spawn").getString()); - berryMaxRain = Float.parseFloat(config.get(berry, "Berry Bush Spawn Rain Max", 1.0D, "The maximum biome rainfall berries can spawn").getString()); - - yewMinTemp = Float.parseFloat(config.get(yew, "Yew Tree Spawn Temp Min", 0.2D, "The minimal biome temperature yew can spawn").getString()); - yewMaxTemp = Float.parseFloat(config.get(yew, "Yew Tree Spawn Temp Max", 1.0D, "The maximum biome temperature yew can spawn").getString()); - yewMinRain = Float.parseFloat(config.get(yew, "Yew Tree Spawn Rain Min", 0.3D, "The minimal biome rainfall yew can spawn").getString()); - yewMaxRain = Float.parseFloat(config.get(yew, "Yew Tree Spawn Rain Max", 1.0D, "The maximum biome rainfall yew can spawn").getString()); - - ironbarkMinTemp = Float.parseFloat(config.get(ironbark, "Ironbark Tree Spawn Temp Min", 0.4D, "The minimal biome temperature ironbark can spawn").getString()); - ironbarkMaxTemp = Float.parseFloat(config.get(ironbark, "Ironbark Tree Spawn Temp Max", 1.2D, "The maximum biome temperature ironbark can spawn").getString()); - ironbarkMinRain = Float.parseFloat(config.get(ironbark, "Ironbark Tree Spawn Rain Min", 0.0D, "The minimal biome rainfall ironbark can spawn").getString()); - ironbarkMaxRain = Float.parseFloat(config.get(ironbark, "Ironbark Tree Spawn Rain Max", 0.8D, "The maximum biome rainfall ironbark can spawn").getString()); - - ebonyMinTemp = Float.parseFloat(config.get(ebony, "Ebony Tree Spawn Temp Min", 0.2D, "The minimal biome temperature ebony can spawn").getString()); - ebonyMaxTemp = Float.parseFloat(config.get(ebony, "Ebony Tree Spawn Temp Max", 1.0D, "The maximum biome temperature ebony can spawn").getString()); - ebonyMinRain = Float.parseFloat(config.get(ebony, "Ebony Tree Spawn Rain Min", 0.4D, "The minimal biome rainfall ebony can spawn").getString()); - ebonyMaxRain = Float.parseFloat(config.get(ebony, "Ebony Tree Spawn Rain Max", 1.0D, "The maximum biome rainfall ebony can spawn").getString()); - - structureTickRate = Integer.parseInt(config.get(structure, "Generation Tick rate", 1, "How many ticks (1/20seconds) for each section to generate").getString()); - MFChance = Float.parseFloat(config.get(ancientForge, "Spawn Chance", 1.5E-2D, "The chance for this structure to generate in a chunk. (0=never, 1.0=always)").getString()); - MAChance = Float.parseFloat(config.get(ancientAlter, "Spawn Chance", 1.0E-2D, "The chance for this structure to generate in a chunk. (0=never, 1.0=always)").getString()); - DSChance = Float.parseFloat(config.get(dwarvenSH, "Spawn Chance", 5.0E-2D, "The chance for this structure to generate in a chunk. (0=never, 1.0=always)").getString()); - - DSGrid = Integer.parseInt(config.get(dwarvenSH, "Stronghold Grid size", 8, "Strongholds generate on a grid on the map to avoid overlaps, this defines the minimum distance between two strongholds (in 16x16 block chunks)").getString()); - DSLength = Integer.parseInt(config.get(dwarvenSH, "Stronghold max length", 8, "Max amount of halls making the length of dwarf strongholds (some may be smaller or larger, but this is a guideline)").getString()); - DSDeviations = Integer.parseInt(config.get(dwarvenSH, "Stronghold max deviations", 1, "Max amount of intersections in dwarf stronghold hallways (not including living hubs). This can significantly increase complexity of strongholds and in turn lag when generating").getString()); - + + silverRarity = Float.parseFloat(config.get(silver, "Silver Rarity", 1.0D, + "The chance for silver to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any ") + .getString()); + silverFrequencyMin = Integer.parseInt(config + .get(silver, "Silver Frequency Min", 3, "Silver will try spawn between this and max veins per chunk") + .getString()); + silverFrequencyMax = Integer.parseInt(config + .get(silver, "Silver Frequency Max", 4, "Silver will try spawn between min and this veins per chunk") + .getString()); + silverLayerMin = Integer + .parseInt(config.get(silver, "Silver Layer Min", 0, "Silver veins spawn above this layer").getString()); + silverLayerMax = Integer.parseInt( + config.get(silver, "Silver Layer Max", 32, "Silver veins spawn below this layer").getString()); + silverSize = Integer + .parseInt(config.get(silver, "Silver Size", 8, "How many blocks consist of the vein").getString()); + + wolframiteRarity = Float.parseFloat(config.get(wolframite, "Wolframite Rarity", 1.0D, + "The chance for wolframite to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any ") + .getString()); + wolframiteFrequencyMin = Integer.parseInt(config.get(wolframite, "Wolframite Frequency Min", 1, + "Wolframite will try spawn between this and max veins per chunk").getString()); + wolframiteFrequencyMax = Integer.parseInt(config.get(wolframite, "Wolframite Frequency Max", 1, + "Wolframite will try spawn between min and this veins per chunk").getString()); + wolframiteLayerMin = Integer.parseInt(config + .get(wolframite, "Wolframite Layer Min", 0, "Wolframite veins spawn above this layer").getString()); + wolframiteLayerMax = Integer.parseInt(config + .get(wolframite, "Wolframite Layer Max", 16, "Wolframite veins spawn below this layer").getString()); + wolframiteSize = Integer.parseInt( + config.get(wolframite, "Wolframite Size", 7, "How many blocks consist of the vein").getString()); + + mythicRarity = Float.parseFloat(config.get(mythic, "Mythic Rarity", 0.05D, + "The chance for mythic to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any mythic") + .getString()); + mythicFrequencyMin = Integer.parseInt(config + .get(mythic, "Mythic Frequency Min", 2, "Mythic will try spawn between this and max veins per chunk") + .getString()); + mythicFrequencyMax = Integer.parseInt(config + .get(mythic, "Mythic Frequency Max", 5, "Mythic will try spawn between min and this veins per chunk") + .getString()); + mythicLayerMin = Integer + .parseInt(config.get(mythic, "Mythic Layer Min", 4, "Mythic veins spawn above this layer").getString()); + mythicLayerMax = Integer + .parseInt(config.get(mythic, "Mythic Layer Max", 6, "Mythic veins spawn below this layer").getString()); + mythicSize = Integer + .parseInt(config.get(mythic, "Mythic Size", 8, "How many blocks consist of the vein").getString()); + + kaoliniteRarity = Float.parseFloat(config.get(kaolinite, "Kaolinite Rarity", 0.25D, + "The chance for kaolinite to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any kaolinite") + .getString()); + kaoliniteFrequencyMin = Integer.parseInt(config.get(kaolinite, "Kaolinite Frequency Min", 1, + "Kaolinite will try spawn between this and max deposits per chunk").getString()); + kaoliniteFrequencyMax = Integer.parseInt(config.get(kaolinite, "Kaolinite Frequency Max", 1, + "Kaolinite will try spawn between min and this deposits per chunk").getString()); + kaoliniteLayerMin = Integer.parseInt(config + .get(kaolinite, "Kaolinite Layer Min", 48, "Kaolinite deposits spawn above this layer").getString()); + kaoliniteLayerMax = Integer.parseInt(config + .get(kaolinite, "Kaolinite Layer Max", 72, "Kaolinite deposits spawn below this layer").getString()); + kaoliniteSize = Integer.parseInt( + config.get(kaolinite, "Kaolinite Size", 16, "How many blocks consist of the deposit").getString()); + + // Coal: 20 deposits of 16: Up to 320 coal value per chunk + // Rich Coal: 10 deposits of 8: up to 80 coal value + coalRarity = Float.parseFloat(config.get(coal, "Rich Coal Rarity", 1F, + "The chance for rich coal to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any rich coal deposits") + .getString()); + coalFrequencyMin = Integer.parseInt(config.get(coal, "Rich Coal Frequency Min", 5, + "Rich Coal will try spawn between this and max deposits per chunk").getString()); + coalFrequencyMax = Integer.parseInt(config.get(coal, "Rich Coal Frequency Max", 5, + "Rich Coal will try spawn between min and this deposits per chunk").getString()); + coalLayerMin = Integer.parseInt( + config.get(coal, "Rich Coal Layer Min", 0, "Rich Coal deposits spawn above this layer").getString()); + coalLayerMax = Integer.parseInt( + config.get(coal, "Rich Coal Layer Max", 64, "Rich Coal deposits spawn below this layer").getString()); + coalSize = Integer + .parseInt(config.get(coal, "Rich Coal Size", 8, "How many blocks consist of the deposit").getString()); + + clayRarity = Float.parseFloat(config.get(clay, "Clay Rarity", 0.15D, + "The chance for clay to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any clay") + .getString()); + clayFrequencyMin = Integer.parseInt( + config.get(clay, "Clay Frequency Min", 1, "Clay will try spawn between this and max deposits per chunk") + .getString()); + clayFrequencyMax = Integer.parseInt( + config.get(clay, "Clay Frequency Max", 1, "Clay will try spawn between min and this deposits per chunk") + .getString()); + clayLayerMin = Integer + .parseInt(config.get(clay, "Clay Layer Min", 60, "Clay deposits spawn above this layer").getString()); + clayLayerMax = Integer + .parseInt(config.get(clay, "Clay Layer Max", 68, "Clay deposits spawn below this layer").getString()); + claySize = Integer + .parseInt(config.get(clay, "Clay Size", 32, "How many blocks consist of the deposit").getString()); + + nitreRarity = Float.parseFloat(config.get(nitre, "Nitre Rarity", 1.0D, + "The chance for nitre to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any nitre") + .getString()); + nitreFrequencyMin = Integer.parseInt(config + .get(nitre, "Nitre Frequency Min", 2, "Nitre will try spawn between this and max deposits per chunk") + .getString()); + nitreFrequencyMax = Integer.parseInt(config + .get(nitre, "Nitre Frequency Max", 5, "Nitre will try spawn between min and this deposits per chunk") + .getString()); + nitreLayerMin = Integer.parseInt( + config.get(nitre, "Nitre Layer Min", 16, "Nitre deposits spawn above this layer").getString()); + nitreLayerMax = Integer.parseInt( + config.get(nitre, "Nitre Layer Max", 64, "Nitre deposits spawn below this layer").getString()); + nitreSize = Integer + .parseInt(config.get(nitre, "Nitre Size", 8, "How many blocks consist of the deposit").getString()); + + sulfurRarity = Float.parseFloat(config.get(sulfur, "Sulfur Rarity", 1.0D, + "The chance for sulfur to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any sulfur") + .getString()); + sulfurFrequencyMin = Integer.parseInt(config + .get(sulfur, "Sulfur Frequency Min", 6, "Sulfur will try spawn between this and max deposits per chunk") + .getString()); + sulfurFrequencyMax = Integer.parseInt(config.get(sulfur, "Sulfur Frequency Max", 12, + "Sulfur will try spawn between min and this deposits per chunk").getString()); + sulfurLayerMin = Integer.parseInt( + config.get(sulfur, "Sulfur Layer Min", 0, "Sulfur deposits spawn above this layer").getString()); + sulfurLayerMax = Integer.parseInt( + config.get(sulfur, "Sulfur Layer Max", 16, "Sulfur deposits spawn below this layer").getString()); + sulfurSize = Integer + .parseInt(config.get(sulfur, "Sulfur Size", 4, "How many blocks consist of the deposit").getString()); + + boraxRarity = Float.parseFloat(config.get(borax, "Borax Rarity", 0.1D, + "The chance for borax to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any borax") + .getString()); + boraxFrequencyMin = Integer.parseInt(config + .get(borax, "Borax Frequency Min", 5, "Borax will try spawn between this and max deposits per chunk") + .getString()); + boraxFrequencyMax = Integer.parseInt(config + .get(borax, "Borax Frequency Max", 10, "Borax will try spawn between min and this deposits per chunk") + .getString()); + boraxLayerMin = Integer.parseInt( + config.get(borax, "Borax Layer Min", 48, "Borax deposits spawn above this layer").getString()); + boraxLayerMax = Integer.parseInt( + config.get(borax, "Borax Layer Max", 96, "Borax deposits spawn below this layer").getString()); + boraxSize = Integer + .parseInt(config.get(borax, "Borax Size", 8, "How many blocks consist of the deposit").getString()); + + limestoneRarity = Float.parseFloat(config.get(limestone, "Limestone Rarity", 2.5E-2D, + "The chance for limestone to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any limestone") + .getString()); + limestoneFrequencyMin = Integer.parseInt(config.get(limestone, "Limestone Frequency Min", 1, + "Limestone will try spawn between this and max deposits per chunk").getString()); + limestoneFrequencyMax = Integer.parseInt(config.get(limestone, "Limestone Frequency Max", 1, + "Limestone will try spawn between min and this deposits per chunk").getString()); + limestoneLayerMin = Integer.parseInt(config + .get(limestone, "Limestone Layer Min", 48, "Limestone deposits spawn above this layer").getString()); + limestoneLayerMax = Integer.parseInt(config + .get(limestone, "Limestone Layer Max", 96, "Limestone deposits spawn below this layer").getString()); + limestoneSize = Integer.parseInt( + config.get(limestone, "Limestone Size", 128, "How many blocks consist of the deposit").getString()); + + // Trees and Plants use SN values to make them more compact (since their pretty + // rare) + berryRarity = Float.parseFloat(config.get(berry, "Berry Bush Rarity", 3.0E-2D, + "The chance for berry bushes to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any berries") + .getString()); + yewRarity = Float.parseFloat(config.get(yew, "Yew Tree Rarity", 1.0E-3D, + "The chance for yew trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees") + .getString()); + ironbarkRarity = Float.parseFloat(config.get(ironbark, "Ironbark Tree Rarity", 1.5E-3D, + "The chance for ironbark trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees") + .getString()); + ebonyRarity = Float.parseFloat(config.get(ebony, "Ebony Tree Rarity", 5.0E-4D, + "The chance for ebony trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees") + .getString()); + + berryMinTemp = Float.parseFloat( + config.get(berry, "Berry Bush Spawn Temp Min", 0.2D, "The minimal biome temperature berries can spawn") + .getString()); + berryMaxTemp = Float.parseFloat( + config.get(berry, "Berry Bush Spawn Temp Max", 1.0D, "The maximum biome temperature berries can spawn") + .getString()); + berryMinRain = Float.parseFloat( + config.get(berry, "Berry Bush Spawn Rain Min", 0.3D, "The minimal biome rainfall berries can spawn") + .getString()); + berryMaxRain = Float.parseFloat( + config.get(berry, "Berry Bush Spawn Rain Max", 1.0D, "The maximum biome rainfall berries can spawn") + .getString()); + + yewMinTemp = Float.parseFloat(config + .get(yew, "Yew Tree Spawn Temp Min", 0.2D, "The minimal biome temperature yew can spawn").getString()); + yewMaxTemp = Float.parseFloat(config + .get(yew, "Yew Tree Spawn Temp Max", 1.0D, "The maximum biome temperature yew can spawn").getString()); + yewMinRain = Float.parseFloat(config + .get(yew, "Yew Tree Spawn Rain Min", 0.3D, "The minimal biome rainfall yew can spawn").getString()); + yewMaxRain = Float.parseFloat(config + .get(yew, "Yew Tree Spawn Rain Max", 1.0D, "The maximum biome rainfall yew can spawn").getString()); + + ironbarkMinTemp = Float.parseFloat(config + .get(ironbark, "Ironbark Tree Spawn Temp Min", 0.4D, "The minimal biome temperature ironbark can spawn") + .getString()); + ironbarkMaxTemp = Float.parseFloat(config + .get(ironbark, "Ironbark Tree Spawn Temp Max", 1.2D, "The maximum biome temperature ironbark can spawn") + .getString()); + ironbarkMinRain = Float.parseFloat(config + .get(ironbark, "Ironbark Tree Spawn Rain Min", 0.0D, "The minimal biome rainfall ironbark can spawn") + .getString()); + ironbarkMaxRain = Float.parseFloat(config + .get(ironbark, "Ironbark Tree Spawn Rain Max", 0.8D, "The maximum biome rainfall ironbark can spawn") + .getString()); + + ebonyMinTemp = Float.parseFloat( + config.get(ebony, "Ebony Tree Spawn Temp Min", 0.2D, "The minimal biome temperature ebony can spawn") + .getString()); + ebonyMaxTemp = Float.parseFloat( + config.get(ebony, "Ebony Tree Spawn Temp Max", 1.0D, "The maximum biome temperature ebony can spawn") + .getString()); + ebonyMinRain = Float.parseFloat( + config.get(ebony, "Ebony Tree Spawn Rain Min", 0.4D, "The minimal biome rainfall ebony can spawn") + .getString()); + ebonyMaxRain = Float.parseFloat( + config.get(ebony, "Ebony Tree Spawn Rain Max", 1.0D, "The maximum biome rainfall ebony can spawn") + .getString()); + + structureTickRate = Integer.parseInt(config + .get(structure, "Generation Tick rate", 1, "How many ticks (1/20seconds) for each section to generate") + .getString()); + MFChance = Float + .parseFloat(config + .get(ancientForge, "Spawn Chance", 1.5E-2D, + "The chance for this structure to generate in a chunk. (0=never, 1.0=always)") + .getString()); + MAChance = Float + .parseFloat(config + .get(ancientAlter, "Spawn Chance", 1.0E-2D, + "The chance for this structure to generate in a chunk. (0=never, 1.0=always)") + .getString()); + DSChance = Float + .parseFloat(config + .get(dwarvenSH, "Spawn Chance", 5.0E-2D, + "The chance for this structure to generate in a chunk. (0=never, 1.0=always)") + .getString()); + + DSGrid = Integer.parseInt(config.get(dwarvenSH, "Stronghold Grid size", 8, + "Strongholds generate on a grid on the map to avoid overlaps, this defines the minimum distance between two strongholds (in 16x16 block chunks)") + .getString()); + DSLength = Integer.parseInt(config.get(dwarvenSH, "Stronghold max length", 8, + "Max amount of halls making the length of dwarf strongholds (some may be smaller or larger, but this is a guideline)") + .getString()); + DSDeviations = Integer.parseInt(config.get(dwarvenSH, "Stronghold max deviations", 1, + "Max amount of intersections in dwarf stronghold hallways (not including living hubs). This can significantly increase complexity of strongholds and in turn lag when generating") + .getString()); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigurationBaseMF.java b/src/main/java/minefantasy/mf2/config/ConfigurationBaseMF.java index efdc1d4c..806d6c04 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigurationBaseMF.java +++ b/src/main/java/minefantasy/mf2/config/ConfigurationBaseMF.java @@ -2,17 +2,15 @@ import net.minecraftforge.common.config.Configuration; -public abstract class ConfigurationBaseMF -{ +public abstract class ConfigurationBaseMF { protected Configuration config; - - public void setConfig(Configuration configuration) - { - configuration.load(); - config = configuration; - loadConfig(); - configuration.save(); - } + + public void setConfig(Configuration configuration) { + configuration.load(); + config = configuration; + loadConfig(); + configuration.save(); + } protected abstract void loadConfig(); } diff --git a/src/main/java/minefantasy/mf2/container/ContainerAnvilMF.java b/src/main/java/minefantasy/mf2/container/ContainerAnvilMF.java index e75d26dd..559259d4 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerAnvilMF.java +++ b/src/main/java/minefantasy/mf2/container/ContainerAnvilMF.java @@ -8,127 +8,102 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class ContainerAnvilMF extends Container -{ - private TileEntityAnvilMF tile; - private boolean isGuiContainer = false; - private int xInvOffset = 28; - - public ContainerAnvilMF(TileEntityAnvilMF tile) - { - isGuiContainer = false; - this.tile = tile; - int width = 6; - int height = 4; - for(int x = 0; x < width; x ++) - { - for (int y = 0; y < height; y ++) - { - int slot = y*width+x; - this.addSlotToContainer(new Slot(tile, slot, 8 + x * 18, 38 + y * 18)); - } - } - this.addSlotToContainer(new Slot(tile, tile.getSizeInventory()-1, 150, 65)); - } - - public ContainerAnvilMF(InventoryPlayer user, TileEntityAnvilMF tile) - { - isGuiContainer = true; - this.tile = tile; - int width = 6; - int height = 4; - - for(int x = 0; x < width; x ++) - { - for (int y = 0; y < height; y ++) - { - int slot = y*width+x; - this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 39 + y * 18)); - } - } - this.addSlotToContainer(new Slot(tile, tile.getSizeInventory()-1, 214, 66)); - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18+xInvOffset, 128 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18+xInvOffset, 186)); - } - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - if(isGuiContainer) - { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) - { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) - { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 0, slotCount-1, false)) - { - return null; - } - - if (itemstack1.stackSize <= 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - } - - return itemstack; - } +public class ContainerAnvilMF extends Container { + private TileEntityAnvilMF tile; + private boolean isGuiContainer = false; + private int xInvOffset = 28; + + public ContainerAnvilMF(TileEntityAnvilMF tile) { + isGuiContainer = false; + this.tile = tile; + int width = 6; + int height = 4; + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int slot = y * width + x; + this.addSlotToContainer(new Slot(tile, slot, 8 + x * 18, 38 + y * 18)); + } + } + this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 1, 150, 65)); + } + + public ContainerAnvilMF(InventoryPlayer user, TileEntityAnvilMF tile) { + isGuiContainer = true; + this.tile = tile; + int width = 6; + int height = 4; + + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int slot = y * width + x; + this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 39 + y * 18)); + } + } + this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 1, 214, 66)); + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18 + xInvOffset, 128 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18 + xInvOffset, 186)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerBigFurnace.java b/src/main/java/minefantasy/mf2/container/ContainerBigFurnace.java index aebf8d2b..7be79a65 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerBigFurnace.java +++ b/src/main/java/minefantasy/mf2/container/ContainerBigFurnace.java @@ -4,243 +4,196 @@ import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.tileentity.TileEntityBigFurnace; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.inventory.SlotFurnace; import net.minecraft.item.ItemStack; - /** * * @author Anonymous Productions * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. + * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ -public class ContainerBigFurnace extends Container -{ - public TileEntityBigFurnace smelter; - public int lastProgress; - public int lastFuel; - public int lastMaxFuel; - public int lastHeat; - public int lastMaxHeat; - - public ContainerBigFurnace(EntityPlayer play, TileEntityBigFurnace tileentityfurnace) - { - lastProgress = 0; - lastFuel = 0; - lastMaxFuel = 0; - lastHeat = 0; - lastMaxHeat = 0; - smelter = tileentityfurnace; - tileentityfurnace.openChest(); - - if(smelter.isHeater()) - { - addSlotToContainer(new Slot(smelter, 0, 59, 44)); - } - else - { - //IN - addSlotToContainer(new Slot(smelter, 0, 36, 26)); - addSlotToContainer(new Slot(smelter, 1, 54, 26)); - addSlotToContainer(new Slot(smelter, 2, 36, 44)); - addSlotToContainer(new Slot(smelter, 3, 54, 44)); - - //OUT - addSlotToContainer(new SlotFurnace(play, smelter, 4, 106, 26)); - addSlotToContainer(new SlotFurnace(play, smelter, 5, 124, 26)); - addSlotToContainer(new SlotFurnace(play, smelter, 6, 106, 44)); - addSlotToContainer(new SlotFurnace(play, smelter, 7, 124, 44)); - } - - //PLAYER INV - for (int i = 0; i < 3; i++) - { - for (int k = 0; k < 9; k++) - { - addSlotToContainer(new Slot(play.inventory, k + i * 9 + 9, 8 + k * 18, 84 + i * 18)); - } - } - - for (int j = 0; j < 9; j++) - { - addSlotToContainer(new Slot(play.inventory, j, 8 + j * 18, 142)); - } - } - - @Override - public void onContainerClosed(EntityPlayer player) - { - super.onContainerClosed(player); - this.smelter.closeChest(); - } - - @Override - public void addCraftingToCrafters(ICrafting icrafting) - { - super.addCraftingToCrafters(icrafting); - icrafting.sendProgressBarUpdate(this, 0, smelter.progress); - icrafting.sendProgressBarUpdate(this, 1, smelter.fuel); - icrafting.sendProgressBarUpdate(this, 2, smelter.maxFuel); - icrafting.sendProgressBarUpdate(this, 3, (int)smelter.heat); - icrafting.sendProgressBarUpdate(this, 4, (int)smelter.maxHeat); - } - - @Override - public void detectAndSendChanges() - { - super.detectAndSendChanges(); - - for (int i = 0; i < this.crafters.size(); ++i) - { - ICrafting icrafting = (ICrafting)this.crafters.get(i); - - if (this.lastProgress != this.smelter.progress) - { - icrafting.sendProgressBarUpdate(this, 0, this.smelter.progress); - } - - if (this.lastFuel != this.smelter.fuel) - { - icrafting.sendProgressBarUpdate(this, 1, this.smelter.fuel); - } - - if (this.lastMaxFuel != this.smelter.maxFuel) - { - icrafting.sendProgressBarUpdate(this, 2, this.smelter.maxFuel); - } - - - if (this.lastHeat != this.smelter.heat) - { - icrafting.sendProgressBarUpdate(this, 3, (int)this.smelter.heat); - } - - if (this.lastMaxHeat != this.smelter.maxHeat) - { - icrafting.sendProgressBarUpdate(this, 4, (int)this.smelter.maxHeat); - } - - } - - this.lastProgress = this.smelter.progress; - this.lastFuel = this.smelter.fuel; - this.lastMaxFuel = this.smelter.maxFuel; - this.lastHeat = (int)this.smelter.heat; - this.lastMaxHeat = (int)this.smelter.maxHeat; - } - - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) - { - if (id == 0) - { - this.smelter.progress = value; - } - - if (id == 1) - { - this.smelter.fuel = value; - } - - if (id == 2) - { - this.smelter.maxFuel = value; - } - - if (id == 3) - { - this.smelter.heat = value; - } - - if (id == 4) - { - this.smelter.maxHeat = value; - } - } - - public boolean canInteractWith(EntityPlayer entityplayer) - { - return smelter.isUseableByPlayer(entityplayer); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int num) - { - int invSize = 8; - if(smelter.isHeater()) - { - invSize = 1; - } - ItemStack placedItem = null; - Slot slot = (Slot)this.inventorySlots.get(num); - - - - - if (slot != null && slot.getHasStack()) - { - ItemStack itemSlot = slot.getStack(); - placedItem = itemSlot.copy(); - - //Take - if (num < invSize) - { - if (!this.mergeItemStack(itemSlot, invSize, 36 + invSize, true)) - { - return null; - } - - slot.onSlotChange(itemSlot, placedItem); - } - //Put - else - { - if(smelter.isHeater()) - { - if(smelter.isItemFuel(itemSlot)) - { - if (!this.mergeItemStack(itemSlot, 0, 1, false)) - { - return null; - } - } - } - else - { - if(smelter.getResult(itemSlot) != null) - { - if (!this.mergeItemStack(itemSlot, 0, 4, false)) - { - return null; - } - } - } - - slot.onSlotChange(itemSlot, placedItem); - } - - if (itemSlot.stackSize == 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - - if (itemSlot.stackSize == placedItem.stackSize) - { - return null; - } - - slot.onPickupFromSlot(player, itemSlot); - } - - return placedItem; - } +public class ContainerBigFurnace extends Container { + public TileEntityBigFurnace smelter; + public int lastProgress; + public int lastFuel; + public int lastMaxFuel; + public int lastHeat; + public int lastMaxHeat; + + public ContainerBigFurnace(EntityPlayer play, TileEntityBigFurnace tileentityfurnace) { + lastProgress = 0; + lastFuel = 0; + lastMaxFuel = 0; + lastHeat = 0; + lastMaxHeat = 0; + smelter = tileentityfurnace; + tileentityfurnace.openChest(); + + if (smelter.isHeater()) { + addSlotToContainer(new Slot(smelter, 0, 59, 44)); + } else { + // IN + addSlotToContainer(new Slot(smelter, 0, 36, 26)); + addSlotToContainer(new Slot(smelter, 1, 54, 26)); + addSlotToContainer(new Slot(smelter, 2, 36, 44)); + addSlotToContainer(new Slot(smelter, 3, 54, 44)); + + // OUT + addSlotToContainer(new SlotFurnace(play, smelter, 4, 106, 26)); + addSlotToContainer(new SlotFurnace(play, smelter, 5, 124, 26)); + addSlotToContainer(new SlotFurnace(play, smelter, 6, 106, 44)); + addSlotToContainer(new SlotFurnace(play, smelter, 7, 124, 44)); + } + + // PLAYER INV + for (int i = 0; i < 3; i++) { + for (int k = 0; k < 9; k++) { + addSlotToContainer(new Slot(play.inventory, k + i * 9 + 9, 8 + k * 18, 84 + i * 18)); + } + } + + for (int j = 0; j < 9; j++) { + addSlotToContainer(new Slot(play.inventory, j, 8 + j * 18, 142)); + } + } + + @Override + public void onContainerClosed(EntityPlayer player) { + super.onContainerClosed(player); + this.smelter.closeChest(); + } + + @Override + public void addCraftingToCrafters(ICrafting icrafting) { + super.addCraftingToCrafters(icrafting); + icrafting.sendProgressBarUpdate(this, 0, smelter.progress); + icrafting.sendProgressBarUpdate(this, 1, smelter.fuel); + icrafting.sendProgressBarUpdate(this, 2, smelter.maxFuel); + icrafting.sendProgressBarUpdate(this, 3, (int) smelter.heat); + icrafting.sendProgressBarUpdate(this, 4, (int) smelter.maxHeat); + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastProgress != this.smelter.progress) { + icrafting.sendProgressBarUpdate(this, 0, this.smelter.progress); + } + + if (this.lastFuel != this.smelter.fuel) { + icrafting.sendProgressBarUpdate(this, 1, this.smelter.fuel); + } + + if (this.lastMaxFuel != this.smelter.maxFuel) { + icrafting.sendProgressBarUpdate(this, 2, this.smelter.maxFuel); + } + + if (this.lastHeat != this.smelter.heat) { + icrafting.sendProgressBarUpdate(this, 3, (int) this.smelter.heat); + } + + if (this.lastMaxHeat != this.smelter.maxHeat) { + icrafting.sendProgressBarUpdate(this, 4, (int) this.smelter.maxHeat); + } + + } + + this.lastProgress = this.smelter.progress; + this.lastFuel = this.smelter.fuel; + this.lastMaxFuel = this.smelter.maxFuel; + this.lastHeat = (int) this.smelter.heat; + this.lastMaxHeat = (int) this.smelter.maxHeat; + } + + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + this.smelter.progress = value; + } + + if (id == 1) { + this.smelter.fuel = value; + } + + if (id == 2) { + this.smelter.maxFuel = value; + } + + if (id == 3) { + this.smelter.heat = value; + } + + if (id == 4) { + this.smelter.maxHeat = value; + } + } + + public boolean canInteractWith(EntityPlayer entityplayer) { + return smelter.isUseableByPlayer(entityplayer); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int num) { + int invSize = 8; + if (smelter.isHeater()) { + invSize = 1; + } + ItemStack placedItem = null; + Slot slot = (Slot) this.inventorySlots.get(num); + + if (slot != null && slot.getHasStack()) { + ItemStack itemSlot = slot.getStack(); + placedItem = itemSlot.copy(); + + // Take + if (num < invSize) { + if (!this.mergeItemStack(itemSlot, invSize, 36 + invSize, true)) { + return null; + } + + slot.onSlotChange(itemSlot, placedItem); + } + // Put + else { + if (smelter.isHeater()) { + if (smelter.isItemFuel(itemSlot)) { + if (!this.mergeItemStack(itemSlot, 0, 1, false)) { + return null; + } + } + } else { + if (smelter.getResult(itemSlot) != null) { + if (!this.mergeItemStack(itemSlot, 0, 4, false)) { + return null; + } + } + } + + slot.onSlotChange(itemSlot, placedItem); + } + + if (itemSlot.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemSlot.stackSize == placedItem.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemSlot); + } + + return placedItem; + } } diff --git a/src/main/java/minefantasy/mf2/container/ContainerBlastChamber.java b/src/main/java/minefantasy/mf2/container/ContainerBlastChamber.java index 05f58090..b6e8acf1 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerBlastChamber.java +++ b/src/main/java/minefantasy/mf2/container/ContainerBlastChamber.java @@ -7,136 +7,107 @@ import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.tileentity.TileEntityFurnace; - -public class ContainerBlastChamber extends Container -{ - private TileEntityBlastFC tile; - private boolean isGuiContainer = false; - - public ContainerBlastChamber(InventoryPlayer user, TileEntityBlastFC tile) - { - isGuiContainer = true; - this.tile = tile; - + +public class ContainerBlastChamber extends Container { + private TileEntityBlastFC tile; + private boolean isGuiContainer = false; + + public ContainerBlastChamber(InventoryPlayer user, TileEntityBlastFC tile) { + isGuiContainer = true; + this.tile = tile; + this.addSlotToContainer(new SlotRestrictive(tile, 0, 80, 30)); this.addSlotToContainer(new SlotRestrictive(tile, 1, 80, 68)); - - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); - } - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - if(isGuiContainer) - { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) - { - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(clicked); - //TOTAL SLOTS: 38 = 2+27+9 - //Chamber = 0-1 - //Inv = 2-28 - //Bar = 29-47 - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked > 1)//INVENTORY - { - if (TileEntityBlastFC.isCarbon(itemstack1)) - { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) - { - return null; - } - } - else if (TileEntityBlastFC.isInput(itemstack1)) - { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) - { - return null; - } - } - else if (clicked >= 2 && clicked < 29)//INVENTORY - { - if (!this.mergeItemStack(itemstack1, 29, 38, false)) - { - return null; - } - } - //BAR - else if (clicked >= 29 && clicked < 38 && !this.mergeItemStack(itemstack1, 2, 29, false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 2, 38, false)) - { - return null; - } - - if (itemstack1.stackSize == 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) - { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + // TOTAL SLOTS: 38 = 2+27+9 + // Chamber = 0-1 + // Inv = 2-28 + // Bar = 29-47 + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked > 1)// INVENTORY + { + if (TileEntityBlastFC.isCarbon(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (TileEntityBlastFC.isInput(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) { + return null; + } + } else if (clicked >= 2 && clicked < 29)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 29, 38, false)) { + return null; + } + } + // BAR + else if (clicked >= 29 && clicked < 38 && !this.mergeItemStack(itemstack1, 2, 29, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 2, 38, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerBlastHeater.java b/src/main/java/minefantasy/mf2/container/ContainerBlastHeater.java index a18fe542..9ddf0047 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerBlastHeater.java +++ b/src/main/java/minefantasy/mf2/container/ContainerBlastHeater.java @@ -9,158 +9,126 @@ import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.tileentity.TileEntityFurnace; - -public class ContainerBlastHeater extends Container -{ - private TileEntityBlastFH tile; - private boolean isGuiContainer = false; - private int lastFuel; - private int lastFuelMax; - - public ContainerBlastHeater(InventoryPlayer user, TileEntityBlastFH tile) - { - isGuiContainer = true; - this.tile = tile; - + +public class ContainerBlastHeater extends Container { + private TileEntityBlastFH tile; + private boolean isGuiContainer = false; + private int lastFuel; + private int lastFuelMax; + + public ContainerBlastHeater(InventoryPlayer user, TileEntityBlastFH tile) { + isGuiContainer = true; + this.tile = tile; + this.addSlotToContainer(new Slot(tile, 0, 80, 76)); - - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); - } - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.crafters.size(); ++i) - { - ICrafting icrafting = (ICrafting)this.crafters.get(i); - - if (this.lastFuel != tile.fuel) - { - icrafting.sendProgressBarUpdate(this, 0, tile.fuel); - } - - if (this.lastFuelMax != tile.maxFuel) - { - icrafting.sendProgressBarUpdate(this, 1, tile.maxFuel); - } - } - this.lastFuel = tile.fuel; - this.lastFuelMax = tile.maxFuel; - - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - if(isGuiContainer) - { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) - { - if (id == 0) - { - tile.fuel = value; - } - - if (id == 1) - { - tile.maxFuel = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) - { - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(clicked); - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked > 0)//INVENTORY - { - if (TileEntityBlastFH.isFuel(itemstack1)) - { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) - { - return null; - } - } - else if (clicked >= 1 && clicked < 28)//INVENTORY - { - if (!this.mergeItemStack(itemstack1, 28, 37, false)) - { - return null; - } - } - //BAR - else if (clicked >= 28 && clicked < 37 && !this.mergeItemStack(itemstack1, 1, 28, false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 1, 37, false)) - { - return null; - } - - if (itemstack1.stackSize == 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) - { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastFuel != tile.fuel) { + icrafting.sendProgressBarUpdate(this, 0, tile.fuel); + } + + if (this.lastFuelMax != tile.maxFuel) { + icrafting.sendProgressBarUpdate(this, 1, tile.maxFuel); + } + } + this.lastFuel = tile.fuel; + this.lastFuelMax = tile.maxFuel; + + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.fuel = value; + } + + if (id == 1) { + tile.maxFuel = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked > 0)// INVENTORY + { + if (TileEntityBlastFH.isFuel(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (clicked >= 1 && clicked < 28)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 28, 37, false)) { + return null; + } + } + // BAR + else if (clicked >= 28 && clicked < 37 && !this.mergeItemStack(itemstack1, 1, 28, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 1, 37, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerBloomery.java b/src/main/java/minefantasy/mf2/container/ContainerBloomery.java index 96670e5e..c2be9051 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerBloomery.java +++ b/src/main/java/minefantasy/mf2/container/ContainerBloomery.java @@ -8,130 +8,103 @@ import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; - -public class ContainerBloomery extends Container -{ - private TileEntityBloomery tile; - private boolean isGuiContainer = false; - - public ContainerBloomery(InventoryPlayer user, TileEntityBloomery tile) - { - isGuiContainer = true; - this.tile = tile; - + +public class ContainerBloomery extends Container { + private TileEntityBloomery tile; + private boolean isGuiContainer = false; + + public ContainerBloomery(InventoryPlayer user, TileEntityBloomery tile) { + isGuiContainer = true; + this.tile = tile; + this.addSlotToContainer(new SlotRestrictive(tile, 0, 80, 30)); this.addSlotToContainer(new SlotRestrictive(tile, 1, 80, 68)); - - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); - } - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) - { - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(clicked); - //TOTAL SLOTS: 38 = 2+27+9 - //Chamber = 0-1 - //Inv = 2-28 - //Bar = 29-47 - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked > 1)//INVENTORY - { - if (TileEntityBloomery.isInput(itemstack1)) - { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) - { - return null; - } - } - else if (TileEntityBlastFC.isCarbon(itemstack1)) - { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) - { - return null; - } - } - else if (clicked >= 2 && clicked < 29)//INVENTORY - { - if (!this.mergeItemStack(itemstack1, 29, 38, false)) - { - return null; - } - } - //BAR - else if (clicked >= 29 && clicked < 38 && !this.mergeItemStack(itemstack1, 2, 29, false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 2, 38, false)) - { - return null; - } - - if (itemstack1.stackSize == 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) - { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + // TOTAL SLOTS: 38 = 2+27+9 + // Chamber = 0-1 + // Inv = 2-28 + // Bar = 29-47 + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked > 1)// INVENTORY + { + if (TileEntityBloomery.isInput(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (TileEntityBlastFC.isCarbon(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) { + return null; + } + } else if (clicked >= 2 && clicked < 29)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 29, 38, false)) { + return null; + } + } + // BAR + else if (clicked >= 29 && clicked < 38 && !this.mergeItemStack(itemstack1, 2, 29, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 2, 38, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerBombBench.java b/src/main/java/minefantasy/mf2/container/ContainerBombBench.java index e4370669..ac3fd0db 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerBombBench.java +++ b/src/main/java/minefantasy/mf2/container/ContainerBombBench.java @@ -7,163 +7,129 @@ import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.tileentity.TileEntityFurnace; - -public class ContainerBombBench extends Container -{ - private TileEntityBombBench tile; - private boolean isGuiContainer = false; - - public ContainerBombBench(InventoryPlayer user, TileEntityBombBench tile) - { - isGuiContainer = true; - this.tile = tile; - - this.addSlotToContainer(new SlotBombBench("case", tile, 0, 77, 74)); + +public class ContainerBombBench extends Container { + private TileEntityBombBench tile; + private boolean isGuiContainer = false; + + public ContainerBombBench(InventoryPlayer user, TileEntityBombBench tile) { + isGuiContainer = true; + this.tile = tile; + + this.addSlotToContainer(new SlotBombBench("case", tile, 0, 77, 74)); this.addSlotToContainer(new SlotBombBench("powder", tile, 1, 77, 48)); this.addSlotToContainer(new SlotBombBench("filling", tile, 2, 52, 23)); this.addSlotToContainer(new SlotBombBench("fuse", tile, 3, 102, 23)); this.addSlotToContainer(new SlotBombBench("bomb", tile, 4, 147, 48)); this.addSlotToContainer(new SlotBombBench("misc", tile, 5, 147, 75)); - - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); - } - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - if(isGuiContainer) - { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) - { - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(clicked); - //TOTAL SLOTS: 41 = 5+27+9 - //Bomb = 0-4 - //Inv = 5-31 - //Bar = 32-40 - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked == 4)//OUTPUT - { - if (!this.mergeItemStack(itemstack1, 5, 41, true)) - { - return null; - } - - slot.onSlotChange(itemstack1, itemstack); - } - else if (clicked > 4)//INVENTORY - { - if (TileEntityBombBench.isMatch(itemstack1, "bolt") || TileEntityBombBench.isMatch(itemstack1, "arrow") || TileEntityBombBench.isMatch(itemstack1, "bombcase") || TileEntityBombBench.isMatch(itemstack1, "minecase")) - { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) - { - return null; - } - } - else if (TileEntityBombBench.isMatch(itemstack1, "powder")) - { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) - { - return null; - } - } - else if (TileEntityBombBench.isMatch(itemstack1, "filling")) - { - if (!this.mergeItemStack(itemstack1, 2, 3, false)) - { - return null; - } - } - else if (TileEntityBombBench.isMatch(itemstack1, "fuse")) - { - if (!this.mergeItemStack(itemstack1, 3, 4, false)) - { - return null; - } - } - else if (clicked >= 5 && clicked < 32)//INVENTORY - { - if (!this.mergeItemStack(itemstack1, 32, 41, false)) - { - return null; - } - } - //BAR - else if (clicked >= 32 && clicked < 41 && !this.mergeItemStack(itemstack1, 5, 32, false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 5, 41, false))//BOMB INVENTORY - { - return null; - } - - if (itemstack1.stackSize == 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) - { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + // TOTAL SLOTS: 41 = 5+27+9 + // Bomb = 0-4 + // Inv = 5-31 + // Bar = 32-40 + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked == 4)// OUTPUT + { + if (!this.mergeItemStack(itemstack1, 5, 41, true)) { + return null; + } + + slot.onSlotChange(itemstack1, itemstack); + } else if (clicked > 4)// INVENTORY + { + if (TileEntityBombBench.isMatch(itemstack1, "bolt") || TileEntityBombBench.isMatch(itemstack1, "arrow") + || TileEntityBombBench.isMatch(itemstack1, "bombcase") + || TileEntityBombBench.isMatch(itemstack1, "minecase")) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (TileEntityBombBench.isMatch(itemstack1, "powder")) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) { + return null; + } + } else if (TileEntityBombBench.isMatch(itemstack1, "filling")) { + if (!this.mergeItemStack(itemstack1, 2, 3, false)) { + return null; + } + } else if (TileEntityBombBench.isMatch(itemstack1, "fuse")) { + if (!this.mergeItemStack(itemstack1, 3, 4, false)) { + return null; + } + } else if (clicked >= 5 && clicked < 32)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 32, 41, false)) { + return null; + } + } + // BAR + else if (clicked >= 32 && clicked < 41 && !this.mergeItemStack(itemstack1, 5, 32, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 5, 41, false))// BOMB INVENTORY + { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerCarpenterMF.java b/src/main/java/minefantasy/mf2/container/ContainerCarpenterMF.java index 6576f2d5..522b8072 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerCarpenterMF.java +++ b/src/main/java/minefantasy/mf2/container/ContainerCarpenterMF.java @@ -8,137 +8,110 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class ContainerCarpenterMF extends Container -{ - private TileEntityCarpenterMF tile; - private boolean isGuiContainer = false; - - public ContainerCarpenterMF(TileEntityCarpenterMF tile) - { - isGuiContainer = false; - this.tile = tile; - int width = tile.width; - int height = tile.height; - for(int x = 0; x < width; x ++) - { - for (int y = 0; y < height; y ++) - { - int slot = y*width+x; - this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 54 + y * 18)); - } - } - this.addSlotToContainer(new Slot(tile, tile.getSizeInventory()-5, 174, 80)); - for (int y = 0; y < 4; y ++) - { - int slot = tile.getSizeInventory()-4 + y; - this.addSlotToContainer(new Slot(tile, slot, 3, 54 + y * 18)); - } - } - - public ContainerCarpenterMF(InventoryPlayer user, TileEntityCarpenterMF tile) - { - isGuiContainer = true; - this.tile = tile; - int width = tile.width; - int height = tile.height; - - for(int x = 0; x < width; x ++) - { - for (int y = 0; y < height; y ++) - { - int slot = y*width+x; - this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 54 + y * 18)); - } - } - this.addSlotToContainer(new Slot(tile, tile.getSizeInventory()-5, 174, 80)); - for (int y = 0; y < 4; y ++) - { - int slot = tile.getSizeInventory()-4 + y; - this.addSlotToContainer(new Slot(tile, slot, 3, 54 + y * 18)); - } - - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 158 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 216)); - } - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - if(isGuiContainer) - { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) - { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) - { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 0, slotCount-5, false)) - { - return null; - } - - if (itemstack1.stackSize <= 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - } - - return itemstack; - } +public class ContainerCarpenterMF extends Container { + private TileEntityCarpenterMF tile; + private boolean isGuiContainer = false; + + public ContainerCarpenterMF(TileEntityCarpenterMF tile) { + isGuiContainer = false; + this.tile = tile; + int width = tile.width; + int height = tile.height; + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int slot = y * width + x; + this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 54 + y * 18)); + } + } + this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 5, 174, 80)); + for (int y = 0; y < 4; y++) { + int slot = tile.getSizeInventory() - 4 + y; + this.addSlotToContainer(new Slot(tile, slot, 3, 54 + y * 18)); + } + } + + public ContainerCarpenterMF(InventoryPlayer user, TileEntityCarpenterMF tile) { + isGuiContainer = true; + this.tile = tile; + int width = tile.width; + int height = tile.height; + + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int slot = y * width + x; + this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 54 + y * 18)); + } + } + this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 5, 174, 80)); + for (int y = 0; y < 4; y++) { + int slot = tile.getSizeInventory() - 4 + y; + this.addSlotToContainer(new Slot(tile, slot, 3, 54 + y * 18)); + } + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 158 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 216)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 5, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerCrossbowBench.java b/src/main/java/minefantasy/mf2/container/ContainerCrossbowBench.java index 7b5350bb..c33e84a4 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/container/ContainerCrossbowBench.java @@ -7,162 +7,126 @@ import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.tileentity.TileEntityFurnace; - -public class ContainerCrossbowBench extends Container -{ - private TileEntityCrossbowBench tile; - private boolean isGuiContainer = false; - - public ContainerCrossbowBench(InventoryPlayer user, TileEntityCrossbowBench tile) - { - isGuiContainer = true; - this.tile = tile; - - this.addSlotToContainer(new SlotRestrictive(tile, 0, 77, 74)); + +public class ContainerCrossbowBench extends Container { + private TileEntityCrossbowBench tile; + private boolean isGuiContainer = false; + + public ContainerCrossbowBench(InventoryPlayer user, TileEntityCrossbowBench tile) { + isGuiContainer = true; + this.tile = tile; + + this.addSlotToContainer(new SlotRestrictive(tile, 0, 77, 74)); this.addSlotToContainer(new SlotRestrictive(tile, 1, 77, 48)); this.addSlotToContainer(new SlotRestrictive(tile, 2, 52, 48)); this.addSlotToContainer(new SlotRestrictive(tile, 3, 100, 30)); this.addSlotToContainer(new SlotRestrictive(tile, 4, 147, 48)); - - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); - } - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - if(isGuiContainer) - { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) - { - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(clicked); - //TOTAL SLOTS: 41 = 5+27+9 - //Crossbow = 0-4 - //Inv = 5-31 - //Bar = 32-40 - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked == 4)//OUTPUT - { - if (!this.mergeItemStack(itemstack1, 5, 41, true)) - { - return null; - } - - slot.onSlotChange(itemstack1, itemstack); - } - else if (clicked > 4)//INVENTORY - { - if (TileEntityCrossbowBench.isMatch(itemstack1, "stock")) - { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) - { - return null; - } - } - else if (TileEntityCrossbowBench.isMatch(itemstack1, "mechanism")) - { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) - { - return null; - } - } - else if (TileEntityCrossbowBench.isMatch(itemstack1, "mod")) - { - if (!this.mergeItemStack(itemstack1, 2, 3, false)) - { - return null; - } - } - else if (TileEntityCrossbowBench.isMatch(itemstack1, "muzzle")) - { - if (!this.mergeItemStack(itemstack1, 3, 4, false)) - { - return null; - } - } - else if (clicked >= 5 && clicked < 32)//INVENTORY - { - if (!this.mergeItemStack(itemstack1, 32, 41, false)) - { - return null; - } - } - //BAR - else if (clicked >= 32 && clicked < 41 && !this.mergeItemStack(itemstack1, 5, 32, false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 5, 41, false))//BOMB INVENTORY - { - return null; - } - - if (itemstack1.stackSize == 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) - { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + // TOTAL SLOTS: 41 = 5+27+9 + // Crossbow = 0-4 + // Inv = 5-31 + // Bar = 32-40 + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked == 4)// OUTPUT + { + if (!this.mergeItemStack(itemstack1, 5, 41, true)) { + return null; + } + + slot.onSlotChange(itemstack1, itemstack); + } else if (clicked > 4)// INVENTORY + { + if (TileEntityCrossbowBench.isMatch(itemstack1, "stock")) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (TileEntityCrossbowBench.isMatch(itemstack1, "mechanism")) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) { + return null; + } + } else if (TileEntityCrossbowBench.isMatch(itemstack1, "mod")) { + if (!this.mergeItemStack(itemstack1, 2, 3, false)) { + return null; + } + } else if (TileEntityCrossbowBench.isMatch(itemstack1, "muzzle")) { + if (!this.mergeItemStack(itemstack1, 3, 4, false)) { + return null; + } + } else if (clicked >= 5 && clicked < 32)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 32, 41, false)) { + return null; + } + } + // BAR + else if (clicked >= 32 && clicked < 41 && !this.mergeItemStack(itemstack1, 5, 32, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 5, 41, false))// BOMB INVENTORY + { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerCrucible.java b/src/main/java/minefantasy/mf2/container/ContainerCrucible.java index b288f47f..dcfd1f50 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerCrucible.java +++ b/src/main/java/minefantasy/mf2/container/ContainerCrucible.java @@ -10,148 +10,119 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class ContainerCrucible extends Container -{ - private TileEntityCrucible tile; - private int lastProgress; - private int lastProgressMax; - private int lastTemp; - - public ContainerCrucible(InventoryPlayer user, TileEntityCrucible tile) - { - this.tile = tile; - int width = 3; - int height = 3; - - for(int x = 0; x < width; x ++) - { - for (int y = 0; y < height; y ++) - { - int slot = y*width+x; - this.addSlotToContainer(new Slot(tile, slot, 62 + x * 18, 14 + y * 18)); - } - } - this.addSlotToContainer(new SlotCrucibleOut(tile, tile.getSizeInventory()-1, 129, 32)); - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 162)); - } - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.crafters.size(); ++i) - { - ICrafting icrafting = (ICrafting)this.crafters.get(i); - - if (this.lastProgress != (int)tile.progress) - { - icrafting.sendProgressBarUpdate(this, 0, (int)tile.progress); - } - if (this.lastProgressMax != (int)tile.progressMax) - { - icrafting.sendProgressBarUpdate(this, 1, (int)tile.progressMax); - } - if (this.lastTemp != (int)tile.temperature) - { - icrafting.sendProgressBarUpdate(this, 2, (int)tile.temperature); - } - } - this.lastProgress = (int)tile.progress; - this.lastProgressMax = (int)tile.progressMax; - this.lastTemp = (int)tile.temperature; - - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - tile.onInventoryChanged(); - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) - { - if (id == 0) - { - tile.progress = value; - } - - if (id == 1) - { - tile.progressMax = value; - } - - if (id == 2) - { - tile.temperature = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) - { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) - { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 0, slotCount-1, false)) - { - return null; - } - - if (itemstack1.stackSize <= 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - } - - return itemstack; - } +public class ContainerCrucible extends Container { + private TileEntityCrucible tile; + private int lastProgress; + private int lastProgressMax; + private int lastTemp; + + public ContainerCrucible(InventoryPlayer user, TileEntityCrucible tile) { + this.tile = tile; + int width = 3; + int height = 3; + + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int slot = y * width + x; + this.addSlotToContainer(new Slot(tile, slot, 62 + x * 18, 14 + y * 18)); + } + } + this.addSlotToContainer(new SlotCrucibleOut(tile, tile.getSizeInventory() - 1, 129, 32)); + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 162)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastProgress != (int) tile.progress) { + icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); + } + if (this.lastProgressMax != (int) tile.progressMax) { + icrafting.sendProgressBarUpdate(this, 1, (int) tile.progressMax); + } + if (this.lastTemp != (int) tile.temperature) { + icrafting.sendProgressBarUpdate(this, 2, (int) tile.temperature); + } + } + this.lastProgress = (int) tile.progress; + this.lastProgressMax = (int) tile.progressMax; + this.lastTemp = (int) tile.temperature; + + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + tile.onInventoryChanged(); + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.progress = value; + } + + if (id == 1) { + tile.progressMax = value; + } + + if (id == 2) { + tile.temperature = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerForge.java b/src/main/java/minefantasy/mf2/container/ContainerForge.java index feff900c..579e8cbf 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerForge.java +++ b/src/main/java/minefantasy/mf2/container/ContainerForge.java @@ -10,215 +10,175 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class ContainerForge extends Container -{ - private TileEntityForge tile; - private int lastTemp; - - public ContainerForge(InventoryPlayer user, TileEntityForge tile) - { - this.tile = tile; - int width = 3; - int height = 3; - +public class ContainerForge extends Container { + private TileEntityForge tile; + private int lastTemp; + + public ContainerForge(InventoryPlayer user, TileEntityForge tile) { + this.tile = tile; + int width = 3; + int height = 3; + this.addSlotToContainer(new Slot(tile, 0, 70 + 18, 14 + 18)); - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 93 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 151)); - } - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.crafters.size(); ++i) - { - ICrafting icrafting = (ICrafting)this.crafters.get(i); - - if (this.lastTemp != (int)tile.temperature) - { - icrafting.sendProgressBarUpdate(this, 0, (int)tile.temperature); - } - } - this.lastTemp = (int)tile.temperature; - - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - tile.onInventoryChanged(); - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) - { - if (id == 0) - { - tile.temperature = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) - { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) - { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) - { - return null; - } - } - else if (!this.mergeItemStack(true, itemstack1, 0, slotCount, false)) - { - return null; - } - - if (itemstack1.stackSize <= 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - } - - return itemstack; - } - - @Override - protected boolean mergeItemStack(ItemStack item, int minSlot, int maxSlot, boolean goBackwards) - { - return mergeItemStack(true, item, minSlot, maxSlot, goBackwards); - } - protected boolean mergeItemStack(boolean allowStack, ItemStack item, int minSlot, int maxSlot, boolean goBackwards) - { - boolean flag1 = false; - int k = minSlot; - - if (goBackwards) - { - k = maxSlot - 1; - } - - Slot slot; - ItemStack itemstack1; - - if (allowStack && item.isStackable()) - { - while (item.stackSize > 0 && (!goBackwards && k < maxSlot || goBackwards && k >= minSlot)) - { - slot = (Slot)this.inventorySlots.get(k); - itemstack1 = slot.getStack(); - - if (itemstack1 != null && itemstack1.getItem() == item.getItem() && (!item.getHasSubtypes() || item.getItemDamage() == itemstack1.getItemDamage()) && ItemStack.areItemStackTagsEqual(item, itemstack1)) - { - int l = itemstack1.stackSize + item.stackSize; - - if (l <= item.getMaxStackSize()) - { - item.stackSize = 0; - itemstack1.stackSize = l; - slot.onSlotChanged(); - flag1 = true; - } - else if (itemstack1.stackSize < item.getMaxStackSize()) - { - item.stackSize -= item.getMaxStackSize() - itemstack1.stackSize; - itemstack1.stackSize = item.getMaxStackSize(); - slot.onSlotChanged(); - flag1 = true; - } - } - - if (goBackwards) - { - --k; - } - else - { - ++k; - } - } - } - - if (item.stackSize > 0) - { - if (goBackwards) - { - k = maxSlot - 1; - } - else - { - k = minSlot; - } - - while (!goBackwards && k < maxSlot || goBackwards && k >= minSlot) - { - slot = (Slot)this.inventorySlots.get(k); - itemstack1 = slot.getStack(); - - if (itemstack1 == null) - { - ItemStack i2 = item.copy(); - i2.stackSize = 1; - slot.putStack(i2); - slot.onSlotChanged(); - item.stackSize--; - flag1 = true; - break; - } - - if (goBackwards) - { - --k; - } - else - { - ++k; - } - } - } - - return flag1; - } + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 93 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 151)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastTemp != (int) tile.temperature) { + icrafting.sendProgressBarUpdate(this, 0, (int) tile.temperature); + } + } + this.lastTemp = (int) tile.temperature; + + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + tile.onInventoryChanged(); + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.temperature = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(true, itemstack1, 0, slotCount, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } + + @Override + protected boolean mergeItemStack(ItemStack item, int minSlot, int maxSlot, boolean goBackwards) { + return mergeItemStack(true, item, minSlot, maxSlot, goBackwards); + } + + protected boolean mergeItemStack(boolean allowStack, ItemStack item, int minSlot, int maxSlot, + boolean goBackwards) { + boolean flag1 = false; + int k = minSlot; + + if (goBackwards) { + k = maxSlot - 1; + } + + Slot slot; + ItemStack itemstack1; + + if (allowStack && item.isStackable()) { + while (item.stackSize > 0 && (!goBackwards && k < maxSlot || goBackwards && k >= minSlot)) { + slot = (Slot) this.inventorySlots.get(k); + itemstack1 = slot.getStack(); + + if (itemstack1 != null && itemstack1.getItem() == item.getItem() + && (!item.getHasSubtypes() || item.getItemDamage() == itemstack1.getItemDamage()) + && ItemStack.areItemStackTagsEqual(item, itemstack1)) { + int l = itemstack1.stackSize + item.stackSize; + + if (l <= item.getMaxStackSize()) { + item.stackSize = 0; + itemstack1.stackSize = l; + slot.onSlotChanged(); + flag1 = true; + } else if (itemstack1.stackSize < item.getMaxStackSize()) { + item.stackSize -= item.getMaxStackSize() - itemstack1.stackSize; + itemstack1.stackSize = item.getMaxStackSize(); + slot.onSlotChanged(); + flag1 = true; + } + } + + if (goBackwards) { + --k; + } else { + ++k; + } + } + } + + if (item.stackSize > 0) { + if (goBackwards) { + k = maxSlot - 1; + } else { + k = minSlot; + } + + while (!goBackwards && k < maxSlot || goBackwards && k >= minSlot) { + slot = (Slot) this.inventorySlots.get(k); + itemstack1 = slot.getStack(); + + if (itemstack1 == null) { + ItemStack i2 = item.copy(); + i2.stackSize = 1; + slot.putStack(i2); + slot.onSlotChanged(); + item.stackSize--; + flag1 = true; + break; + } + + if (goBackwards) { + --k; + } else { + ++k; + } + } + } + + return flag1; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerQuern.java b/src/main/java/minefantasy/mf2/container/ContainerQuern.java index eead2e64..05d8bb8d 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerQuern.java +++ b/src/main/java/minefantasy/mf2/container/ContainerQuern.java @@ -1,116 +1,92 @@ package minefantasy.mf2.container; import minefantasy.mf2.block.tileentity.TileEntityQuern; -import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; -import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -public class ContainerQuern extends Container -{ - private TileEntityQuern tile; - private boolean isGuiContainer = false; - - public ContainerQuern(InventoryPlayer user, TileEntityQuern tile) - { - isGuiContainer = true; - this.tile = tile; - +public class ContainerQuern extends Container { + private TileEntityQuern tile; + private boolean isGuiContainer = false; + + public ContainerQuern(InventoryPlayer user, TileEntityQuern tile) { + isGuiContainer = true; + this.tile = tile; + this.addSlotToContainer(new SlotRestrictive(tile, 0, 81, 9)); this.addSlotToContainer(new SlotRestrictive(tile, 1, 81, 32)); this.addSlotToContainer(new SlotRestrictive(tile, 2, 81, 55)); - - int i; - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 93 + i * 18)); - } - } + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 93 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 151)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer user) { + return this.tile.isUseableByPlayer(user); + } - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 151)); - } - } - @Override - public boolean canInteractWith(EntityPlayer user) - { - return this.tile.isUseableByPlayer(user); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) - { - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(clicked); - //TOTAL SLOTS: 39 = 3+27+9 - //Chamber = 0-2 - //Inv = 2-28 - //Bar = 29-47 + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + // TOTAL SLOTS: 39 = 3+27+9 + // Chamber = 0-2 + // Inv = 2-28 + // Bar = 29-47 - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); - if (clicked > 2)//INVENTORY - { - if (TileEntityQuern.isInput(itemstack1)) - { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) - { - return null; - } - } - else if (TileEntityQuern.isPot(itemstack1)) - { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) - { - return null; - } - } - else if (clicked >= 3 && clicked < 30)//INVENTORY - { - if (!this.mergeItemStack(itemstack1, 30, 39, false)) - { - return null; - } - } - //BAR - else if (clicked >= 30 && clicked < 39 && !this.mergeItemStack(itemstack1, 3, 30, false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 3, 39, false)) - { - return null; - } + if (clicked > 2)// INVENTORY + { + if (TileEntityQuern.isInput(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (TileEntityQuern.isPot(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) { + return null; + } + } else if (clicked >= 3 && clicked < 30)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 30, 39, false)) { + return null; + } + } + // BAR + else if (clicked >= 30 && clicked < 39 && !this.mergeItemStack(itemstack1, 3, 30, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 3, 39, false)) { + return null; + } - if (itemstack1.stackSize == 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } - if (itemstack1.stackSize == itemstack.stackSize) - { - return null; - } + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } - slot.onPickupFromSlot(user, itemstack1); - } + slot.onPickupFromSlot(user, itemstack1); + } - return itemstack; - } + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerReload.java b/src/main/java/minefantasy/mf2/container/ContainerReload.java index 12741860..3f6dd4c8 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerReload.java +++ b/src/main/java/minefantasy/mf2/container/ContainerReload.java @@ -3,7 +3,6 @@ import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.archery.IAmmo; import minefantasy.mf2.api.archery.IFirearm; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; @@ -12,138 +11,115 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class ContainerReload extends Container -{ - private InventoryBasic weaponInv; - private ItemStack weapon; - public ContainerReload(InventoryPlayer user, ItemStack weapon) - { - this.weapon = weapon; - weaponInv = new InventoryBasic("reload", false, 1); - weaponInv.setInventorySlotContents(0, AmmoMechanicsMF.getAmmo(weapon)); +public class ContainerReload extends Container { + private InventoryBasic weaponInv; + private ItemStack weapon; + + public ContainerReload(InventoryPlayer user, ItemStack weapon) { + this.weapon = weapon; + weaponInv = new InventoryBasic("reload", false, 1); + weaponInv.setInventorySlotContents(0, AmmoMechanicsMF.getAmmo(weapon)); this.addSlotToContainer(new SlotReload(this, weaponInv, 0, 79, 11)); - - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 66 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - if(i != user.currentItem) - { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 124)); - } - } - } - - @Override - public ItemStack slotClick(int p_75144_1_, int p_75144_2_, int p_75144_3_, EntityPlayer p_75144_4_) - { - ItemStack result = super.slotClick(p_75144_1_, p_75144_2_, p_75144_3_, p_75144_4_); - - ItemStack ammo = weaponInv.getStackInSlot(0); - AmmoMechanicsMF.setAmmo(weapon, ammo); - - return result; - } - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - previousAmmo = weaponInv.getStackInSlot(0); - } - private ItemStack previousAmmo; - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) - { - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(clicked); - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked > 0)//INVENTORY - { - if (canAccept(itemstack1)) - { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) - { - return null; - } - } - else if (clicked >= 1 && clicked < 27)//INVENTORY - { - if (!this.mergeItemStack(itemstack1, 27, 36, false)) - { - return null; - } - } - //BAR - else if (clicked >= 27 && clicked < 36 && !this.mergeItemStack(itemstack1, 1, 27, false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 1, 36, false)) - { - return null; - } - - if (itemstack1.stackSize == 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) - { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } - - public boolean canAccept(ItemStack ammo) - { + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 66 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + if (i != user.currentItem) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 124)); + } + } + } + + @Override + public ItemStack slotClick(int p_75144_1_, int p_75144_2_, int p_75144_3_, EntityPlayer p_75144_4_) { + ItemStack result = super.slotClick(p_75144_1_, p_75144_2_, p_75144_3_, p_75144_4_); + + ItemStack ammo = weaponInv.getStackInSlot(0); + AmmoMechanicsMF.setAmmo(weapon, ammo); + + return result; + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + previousAmmo = weaponInv.getStackInSlot(0); + } + + private ItemStack previousAmmo; + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked > 0)// INVENTORY + { + if (canAccept(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (clicked >= 1 && clicked < 27)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 27, 36, false)) { + return null; + } + } + // BAR + else if (clicked >= 27 && clicked < 36 && !this.mergeItemStack(itemstack1, 1, 27, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 1, 36, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } + + public boolean canAccept(ItemStack ammo) { String ammoType = "null"; - if(ammo != null && ammo.getItem() instanceof IAmmo) - { - ammoType = ((IAmmo)ammo.getItem()).getAmmoType(ammo); + if (ammo != null && ammo.getItem() instanceof IAmmo) { + ammoType = ((IAmmo) ammo.getItem()).getAmmoType(ammo); } - - if(weapon != null && weapon.getItem() instanceof IFirearm) - { - return ((IFirearm)weapon.getItem()).canAcceptAmmo(weapon, ammoType); + + if (weapon != null && weapon.getItem() instanceof IFirearm) { + return ((IFirearm) weapon.getItem()).canAcceptAmmo(weapon, ammoType); } - + return ammoType.equalsIgnoreCase("arrow"); } diff --git a/src/main/java/minefantasy/mf2/container/ContainerResearch.java b/src/main/java/minefantasy/mf2/container/ContainerResearch.java index 1aac627f..911604da 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerResearch.java +++ b/src/main/java/minefantasy/mf2/container/ContainerResearch.java @@ -10,131 +10,105 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class ContainerResearch extends Container -{ - private TileEntityResearch tile; - private boolean isGuiContainer = false; - private int lastProgress; - private int lastProgressMax; - - public ContainerResearch(InventoryPlayer user, TileEntityResearch tile) - { - isGuiContainer = true; - this.tile = tile; - +public class ContainerResearch extends Container { + private TileEntityResearch tile; + private boolean isGuiContainer = false; + private int lastProgress; + private int lastProgressMax; + + public ContainerResearch(InventoryPlayer user, TileEntityResearch tile) { + isGuiContainer = true; + this.tile = tile; + this.addSlotToContainer(new Slot(tile, 0, 83, 40)); - - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 10 + j * 18, 76 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(user, i, 10 + i * 18, 134)); - } - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.crafters.size(); ++i) - { - ICrafting icrafting = (ICrafting)this.crafters.get(i); - - if (this.lastProgress != tile.progress) - { - icrafting.sendProgressBarUpdate(this, 0, (int)tile.progress); - } - if (this.lastProgressMax != tile.maxProgress) - { - icrafting.sendProgressBarUpdate(this, 1, (int)tile.maxProgress); - } - } - this.lastProgress = (int)tile.progress; - this.lastProgressMax = (int)tile.maxProgress; - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) - { - if (id == 0) - { - tile.progress = value; - } - if (id == 1) - { - tile.maxProgress = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer user) - { - return this.tile.isUseableByPlayer(user); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) - { - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(clicked); - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked > 0)//INVENTORY - { - if (TileEntityResearch.canAccept(itemstack1)) - { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) - { - return null; - } - } - else if (clicked >= 1 && clicked < 28)//INVENTORY - { - if (!this.mergeItemStack(itemstack1, 28, 37, false)) - { - return null; - } - } - //BAR - else if (clicked >= 28 && clicked < 37 && !this.mergeItemStack(itemstack1, 1, 28, false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 1, 37, false)) - { - return null; - } - - if (itemstack1.stackSize == 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) - { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 10 + j * 18, 76 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 10 + i * 18, 134)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastProgress != tile.progress) { + icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); + } + if (this.lastProgressMax != tile.maxProgress) { + icrafting.sendProgressBarUpdate(this, 1, (int) tile.maxProgress); + } + } + this.lastProgress = (int) tile.progress; + this.lastProgressMax = (int) tile.maxProgress; + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.progress = value; + } + if (id == 1) { + tile.maxProgress = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer user) { + return this.tile.isUseableByPlayer(user); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked > 0)// INVENTORY + { + if (TileEntityResearch.canAccept(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (clicked >= 1 && clicked < 28)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 28, 37, false)) { + return null; + } + } + // BAR + else if (clicked >= 28 && clicked < 37 && !this.mergeItemStack(itemstack1, 1, 28, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 1, 37, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerRoast.java b/src/main/java/minefantasy/mf2/container/ContainerRoast.java index 60920a06..ada3eb74 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerRoast.java +++ b/src/main/java/minefantasy/mf2/container/ContainerRoast.java @@ -9,112 +9,90 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class ContainerRoast extends Container -{ - private TileEntityRoast tile; - private int lastProgress; - private int lastProgressMax; - - public ContainerRoast(TileEntityRoast tile) - { - this.tile = tile; - this.addSlotToContainer(new Slot(tile, 0, 0, 0)); - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.crafters.size(); ++i) - { - ICrafting icrafting = (ICrafting)this.crafters.get(i); - - if (this.lastProgress != (int)tile.progress) - { - icrafting.sendProgressBarUpdate(this, 0, (int)tile.progress); - } - if (this.lastProgressMax != (int)tile.maxProgress) - { - icrafting.sendProgressBarUpdate(this, 1, (int)tile.maxProgress); - } - } - this.lastProgress = (int)tile.progress; - this.lastProgressMax = (int)tile.maxProgress; - - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - tile.onInventoryChanged(); - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) - { - if (id == 0) - { - tile.progress = value; - } - - if (id == 1) - { - tile.maxProgress = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) - { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) - { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 0, slotCount-1, false)) - { - return null; - } - - if (itemstack1.stackSize <= 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - } - - return itemstack; - } +public class ContainerRoast extends Container { + private TileEntityRoast tile; + private int lastProgress; + private int lastProgressMax; + + public ContainerRoast(TileEntityRoast tile) { + this.tile = tile; + this.addSlotToContainer(new Slot(tile, 0, 0, 0)); + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastProgress != (int) tile.progress) { + icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); + } + if (this.lastProgressMax != (int) tile.maxProgress) { + icrafting.sendProgressBarUpdate(this, 1, (int) tile.maxProgress); + } + } + this.lastProgress = (int) tile.progress; + this.lastProgressMax = (int) tile.maxProgress; + + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + tile.onInventoryChanged(); + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.progress = value; + } + + if (id == 1) { + tile.maxProgress = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerTanner.java b/src/main/java/minefantasy/mf2/container/ContainerTanner.java index d1ab3ec2..56ab9e59 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerTanner.java +++ b/src/main/java/minefantasy/mf2/container/ContainerTanner.java @@ -9,113 +9,91 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class ContainerTanner extends Container -{ - private TileEntityTanningRack tile; - private int lastProgress; - private int lastProgressMax; - - public ContainerTanner(TileEntityTanningRack tile) - { - this.tile = tile; - for(int a = 0; a < 2; a++) - this.addSlotToContainer(new Slot(tile, a, 0, 0)); - } - - @Override - public void detectAndSendChanges() - { - for (int i = 0; i < this.crafters.size(); ++i) - { - ICrafting icrafting = (ICrafting)this.crafters.get(i); - - if (this.lastProgress != (int)tile.progress) - { - icrafting.sendProgressBarUpdate(this, 0, (int)tile.progress); - } - if (this.lastProgressMax != (int)tile.maxProgress) - { - icrafting.sendProgressBarUpdate(this, 1, (int)tile.maxProgress); - } - } - this.lastProgress = (int)tile.progress; - this.lastProgressMax = (int)tile.maxProgress; - - for (int i = 0; i < this.inventorySlots.size(); ++i) - { - ItemStack itemstack = ((Slot)this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) - { - tile.onInventoryChanged(); - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) - { - ((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) - { - if (id == 0) - { - tile.progress = value; - } - - if (id == 1) - { - tile.maxProgress = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) - { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) - { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 0, slotCount-1, false)) - { - return null; - } - - if (itemstack1.stackSize <= 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - } - - return itemstack; - } +public class ContainerTanner extends Container { + private TileEntityTanningRack tile; + private int lastProgress; + private int lastProgressMax; + + public ContainerTanner(TileEntityTanningRack tile) { + this.tile = tile; + for (int a = 0; a < 2; a++) + this.addSlotToContainer(new Slot(tile, a, 0, 0)); + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastProgress != (int) tile.progress) { + icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); + } + if (this.lastProgressMax != (int) tile.maxProgress) { + icrafting.sendProgressBarUpdate(this, 1, (int) tile.maxProgress); + } + } + this.lastProgress = (int) tile.progress; + this.lastProgressMax = (int) tile.maxProgress; + + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + tile.onInventoryChanged(); + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.progress = value; + } + + if (id == 1) { + tile.maxProgress = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/InventoryReload.java b/src/main/java/minefantasy/mf2/container/InventoryReload.java index 5fdc6c39..98e607d4 100644 --- a/src/main/java/minefantasy/mf2/container/InventoryReload.java +++ b/src/main/java/minefantasy/mf2/container/InventoryReload.java @@ -5,41 +5,33 @@ import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; -public class InventoryReload implements IInventory -{ +public class InventoryReload implements IInventory { private ItemStack weapon; - public InventoryReload(ItemStack weapon) - { + + public InventoryReload(ItemStack weapon) { this.weapon = weapon; } - + @Override - public int getSizeInventory() - { + public int getSizeInventory() { return 1; } @Override - public ItemStack getStackInSlot(int i) - { + public ItemStack getStackInSlot(int i) { return AmmoMechanicsMF.getAmmo(weapon); } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { ItemStack ammo = AmmoMechanicsMF.getAmmo(weapon); - if(ammo != null) - { + if (ammo != null) { ItemStack ammo2 = ammo.copy(); ammo.stackSize -= num; ammo2.stackSize = num; - if(ammo.stackSize > 0) - { + if (ammo.stackSize > 0) { setInventorySlotContents(slot, ammo); - } - else - { + } else { setInventorySlotContents(slot, null); } return ammo2; @@ -53,14 +45,10 @@ public ItemStack getStackInSlotOnClosing(int slot) { } @Override - public void setInventorySlotContents(int slot, ItemStack item) - { - if(item != null) - { + public void setInventorySlotContents(int slot, ItemStack item) { + if (item != null) { AmmoMechanicsMF.setAmmo(weapon, item); - } - else - { + } else { AmmoMechanicsMF.removeAmmo(weapon); } } diff --git a/src/main/java/minefantasy/mf2/container/SlotBombBench.java b/src/main/java/minefantasy/mf2/container/SlotBombBench.java index bb55ee80..707ce81f 100644 --- a/src/main/java/minefantasy/mf2/container/SlotBombBench.java +++ b/src/main/java/minefantasy/mf2/container/SlotBombBench.java @@ -3,32 +3,27 @@ import minefantasy.mf2.block.tileentity.TileEntityBombBench; import minefantasy.mf2.item.gadget.ItemBomb; import minefantasy.mf2.item.gadget.ItemMine; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; - -public class SlotBombBench extends Slot -{ +public class SlotBombBench extends Slot { private final String type; - public SlotBombBench(String type, IInventory parent, int id, int x, int y) - { + + public SlotBombBench(String type, IInventory parent, int id, int x, int y) { super(parent, id, x, y); this.type = type; } - + @Override - public boolean isItemValid(ItemStack item) - { - if(type.equalsIgnoreCase("case")) - { - return TileEntityBombBench.isMatch(item, "arrow") || TileEntityBombBench.isMatch(item, "bolt") || TileEntityBombBench.isMatch(item, "bombCase") || TileEntityBombBench.isMatch(item, "mineCase"); + public boolean isItemValid(ItemStack item) { + if (type.equalsIgnoreCase("case")) { + return TileEntityBombBench.isMatch(item, "arrow") || TileEntityBombBench.isMatch(item, "bolt") + || TileEntityBombBench.isMatch(item, "bombCase") || TileEntityBombBench.isMatch(item, "mineCase"); } - if(type.equalsIgnoreCase("bomb")) - { + if (type.equalsIgnoreCase("bomb")) { return item.getItem() instanceof ItemBomb || item.getItem() instanceof ItemMine; } - return TileEntityBombBench.isMatch(item, type); - } + return TileEntityBombBench.isMatch(item, type); + } } diff --git a/src/main/java/minefantasy/mf2/container/SlotCrucibleOut.java b/src/main/java/minefantasy/mf2/container/SlotCrucibleOut.java index 845ccda9..5b946508 100644 --- a/src/main/java/minefantasy/mf2/container/SlotCrucibleOut.java +++ b/src/main/java/minefantasy/mf2/container/SlotCrucibleOut.java @@ -7,35 +7,31 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; - -public class SlotCrucibleOut extends Slot -{ +public class SlotCrucibleOut extends Slot { private TileEntityCrucible tile; private int slotNum; - public SlotCrucibleOut(TileEntityCrucible parent, int id, int x, int y) - { + + public SlotCrucibleOut(TileEntityCrucible parent, int id, int x, int y) { super(parent, id, x, y); - this.tile=parent; + this.tile = parent; this.slotNum = id; } - + @Override - public boolean canTakeStack(EntityPlayer player) - { + public boolean canTakeStack(EntityPlayer player) { return canTakeStack(); } - public boolean canTakeStack() - { + + public boolean canTakeStack() { ItemStack slot = tile.getStackInSlot(slotNum); - if(slot != null && slot.getItem() instanceof ItemBlock) - { + if (slot != null && slot.getItem() instanceof ItemBlock) { return true; } return !ConfigHardcore.HCCreduceIngots || tile.isAuto(); } + @Override - public boolean isItemValid(ItemStack item) - { + public boolean isItemValid(ItemStack item) { return true; - } + } } diff --git a/src/main/java/minefantasy/mf2/container/SlotReload.java b/src/main/java/minefantasy/mf2/container/SlotReload.java index f4a3e4fe..1e2bb46d 100644 --- a/src/main/java/minefantasy/mf2/container/SlotReload.java +++ b/src/main/java/minefantasy/mf2/container/SlotReload.java @@ -4,21 +4,18 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; - -public class SlotReload extends Slot -{ +public class SlotReload extends Slot { private ContainerReload container; private int slot; - public SlotReload(ContainerReload container, IInventory parent, int id, int x, int y) - { + + public SlotReload(ContainerReload container, IInventory parent, int id, int x, int y) { super(parent, id, x, y); this.container = container; this.slot = id; } - + @Override - public boolean isItemValid(ItemStack item) - { + public boolean isItemValid(ItemStack item) { return container.canAccept(item); - } + } } diff --git a/src/main/java/minefantasy/mf2/container/SlotRestrictive.java b/src/main/java/minefantasy/mf2/container/SlotRestrictive.java index 9cabc5ef..c1975d81 100644 --- a/src/main/java/minefantasy/mf2/container/SlotRestrictive.java +++ b/src/main/java/minefantasy/mf2/container/SlotRestrictive.java @@ -4,21 +4,18 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; - -public class SlotRestrictive extends Slot -{ +public class SlotRestrictive extends Slot { private IInventory tile; private int slot; - public SlotRestrictive(IInventory parent, int id, int x, int y) - { + + public SlotRestrictive(IInventory parent, int id, int x, int y) { super(parent, id, x, y); - this.tile=parent; + this.tile = parent; this.slot = id; } - + @Override - public boolean isItemValid(ItemStack item) - { + public boolean isItemValid(ItemStack item) { return tile.isItemValidForSlot(slot, item); - } + } } diff --git a/src/main/java/minefantasy/mf2/entity/EntityArrowMF.java b/src/main/java/minefantasy/mf2/entity/EntityArrowMF.java index f917fd87..ed1fd322 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityArrowMF.java +++ b/src/main/java/minefantasy/mf2/entity/EntityArrowMF.java @@ -8,7 +8,6 @@ import minefantasy.mf2.api.archery.IArrowMF; import minefantasy.mf2.api.archery.IArrowRetrieve; import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.TacticalManager; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.weapon.IDamageType; import minefantasy.mf2.config.ConfigExperiment; @@ -40,8 +39,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class EntityArrowMF extends EntityArrow implements IProjectile, IDamageType, IArrowRetrieve -{ +public class EntityArrowMF extends EntityArrow implements IProjectile, IDamageType, IArrowRetrieve { private boolean playedSound = false; private int xTile = -1; private int yTile = -1; @@ -64,15 +62,13 @@ public class EntityArrowMF extends EntityArrow implements IProjectile, IDamageTy public ArrowType arrowtype = ArrowType.NORMAL; public float firepower = 1F; - public EntityArrowMF(World world) - { + public EntityArrowMF(World world) { super(world); this.renderDistanceWeight = 10.0D; this.setSize(0.5F, 0.5F); } - public EntityArrowMF(World world, double x, double y, double z) - { + public EntityArrowMF(World world, double x, double y, double z) { super(world); this.renderDistanceWeight = 10.0D; this.setSize(0.5F, 0.5F); @@ -81,17 +77,16 @@ public EntityArrowMF(World world, double x, double y, double z) } /** - * This is for shooting an arrow from a shooting entity to a target(Like skeletons and such) + * This is for shooting an arrow from a shooting entity to a target(Like + * skeletons and such) */ - public EntityArrowMF(World world, EntityLivingBase shooter, EntityLivingBase target, float accuracy, float power) - { + public EntityArrowMF(World world, EntityLivingBase shooter, EntityLivingBase target, float accuracy, float power) { super(world); this.renderDistanceWeight = 10.0D; this.shootingEntity = shooter; this.firepower = power; - if (shooter instanceof EntityPlayer) - { + if (shooter instanceof EntityPlayer) { this.canBePickedUp = 1; } @@ -101,8 +96,7 @@ public EntityArrowMF(World world, EntityLivingBase shooter, EntityLivingBase tar double d2 = target.posZ - shooter.posZ; double d3 = MathHelper.sqrt_double(d0 * d0 + d2 * d2); - if (d3 >= 1.0E-7D) - { + if (d3 >= 1.0E-7D) { float f2 = (float) (Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F; float f3 = (float) (-(Math.atan2(d1, d3) * 180.0D / Math.PI)); double d4 = d0 / d3; @@ -117,14 +111,13 @@ public EntityArrowMF(World world, EntityLivingBase shooter, EntityLivingBase tar /** * This method is for firing an arrow from an entity (Mostly player shooting) */ - public EntityArrowMF(World world, EntityLivingBase shooter, float power) - { + public EntityArrowMF(World world, EntityLivingBase shooter, float power) { this(world, shooter, 1.0F, power); } - public EntityArrowMF(World world, EntityLivingBase shooter, float spread, float power) - { + + public EntityArrowMF(World world, EntityLivingBase shooter, float spread, float power) { super(world); - this.firepower = power/2F; + this.firepower = power / 2F; this.renderDistanceWeight = 10.0D; this.shootingEntity = shooter; @@ -133,56 +126,47 @@ public EntityArrowMF(World world, EntityLivingBase shooter, float spread, float } this.setSize(0.5F, 0.5F); - this.setLocationAndAngles( - shooter.posX, - shooter.posY + shooter.getEyeHeight(), - shooter.posZ, shooter.rotationYaw, - shooter.rotationPitch); - this.posX -= MathHelper.cos(this.rotationYaw / 180.0F - * (float) Math.PI) * 0.16F; + this.setLocationAndAngles(shooter.posX, shooter.posY + shooter.getEyeHeight(), shooter.posZ, + shooter.rotationYaw, shooter.rotationPitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; this.posY -= 0.10000000149011612D; - this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F - * (float) Math.PI) * 0.16F; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; this.setPosition(this.posX, this.posY, this.posZ); this.yOffset = 0.0F; - this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F - * (float) Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F - * (float) Math.PI); - this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F - * (float) Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F - * (float) Math.PI); - this.motionY = (-MathHelper.sin(this.rotationPitch / 180.0F - * (float) Math.PI)); - this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, - power * 1.5F, spread); + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); + this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); + this.motionY = (-MathHelper.sin(this.rotationPitch / 180.0F * (float) Math.PI)); + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, power * 1.5F, spread); } - public EntityArrowMF setDeisgn(ArrowType type) - { + public EntityArrowMF setDeisgn(ArrowType type) { this.arrowtype = type; return this; } + /** * Implement this with the constructor */ - public EntityArrowMF setArrow(ItemStack arrow) - { + public EntityArrowMF setArrow(ItemStack arrow) { ItemStack arrowStack = arrow.copy(); arrowStack.stackSize = 1; setArrowStack(arrowStack); return this; } - public EntityArrowMF setArrowTex(String tex) - { + + public EntityArrowMF setArrowTex(String tex) { updateTex(tex); return this; } + private final int texture_dw = 18; - private float power = 0F; + private float power = 0F; + @Override - protected void entityInit() - { - this.dataWatcher.addObject(16, Byte.valueOf((byte) 0));//Critical + protected void entityInit() { + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0));// Critical this.dataWatcher.addObject(texture_dw, "steel_arrow"); } @@ -191,18 +175,14 @@ protected void entityInit() * direction. */ @Override - public void setThrowableHeading(double x, double y, double z, float power, float spread) - { + public void setThrowableHeading(double x, double y, double z, float power, float spread) { float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); x /= f2; y /= f2; z /= f2; - x += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) - * 0.007499999832361937D * spread; - y += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) - * 0.007499999832361937D * spread; - z += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) - * 0.007499999832361937D * spread; + x += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * spread; + y += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * spread; + z += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * spread; x *= power; y *= power; z *= power; @@ -221,17 +201,16 @@ public void setThrowableHeading(double x, double y, double z, float power, float */ @Override @SideOnly(Side.CLIENT) - public void setPositionAndRotation2(double x, double y, double z, float yaw, float pitch, int i) - { + public void setPositionAndRotation2(double x, double y, double z, float yaw, float pitch, int i) { this.setPosition(x, y, z); this.setRotation(yaw, pitch); } + /** * Sets the position and rotation. Only difference from the other one is no * bounding on the rotation. Args: posX, posY, posZ, yaw, pitch */ - public void setPositionAndRotation(double x, double y, double z, float yaw, float pitch, int i) - { + public void setPositionAndRotation(double x, double y, double z, float yaw, float pitch, int i) { this.setPosition(x, y, z); this.setRotation(yaw, pitch); } @@ -241,84 +220,66 @@ public void setPositionAndRotation(double x, double y, double z, float yaw, floa */ @Override @SideOnly(Side.CLIENT) - public void setVelocity(double xv, double yv, double zv) - { + public void setVelocity(double xv, double yv, double zv) { this.motionX = xv; this.motionY = yv; this.motionZ = zv; - if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) - { + if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { float f = MathHelper.sqrt_double(xv * xv + zv * zv); - this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(xv, - zv) * 180.0D / Math.PI); - this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2( - yv, f) * 180.0D / Math.PI); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(xv, zv) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(yv, f) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch; this.prevRotationYaw = this.rotationYaw; - this.setLocationAndAngles(this.posX, this.posY, this.posZ, - this.rotationYaw, this.rotationPitch); + this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); this.ticksInGround = 0; } } + /** * Called to update the entity's position/logic. */ @Override - public void onUpdate() - { + public void onUpdate() { super.onEntityUpdate(); - if(ConfigExperiment.dynamicArrows && worldObj.isRemote) - { + if (ConfigExperiment.dynamicArrows && worldObj.isRemote) { return; } - if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) - { - float f = MathHelper.sqrt_double(this.motionX * this.motionX - + this.motionZ * this.motionZ); - this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2( - this.motionX, this.motionZ) * 180.0D / Math.PI); - this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2( - this.motionY, f) * 180.0D / Math.PI); + if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { + float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D + / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(this.motionY, f) * 180.0D / Math.PI); } - Block block = this.worldObj.getBlock(this.xTile, - this.yTile, this.zTile); + Block block = this.worldObj.getBlock(this.xTile, this.yTile, this.zTile); if (block.getMaterial() != Material.air) { - block.setBlockBoundsBasedOnState(this.worldObj, - this.xTile, this.yTile, + block.setBlockBoundsBasedOnState(this.worldObj, this.xTile, this.yTile, this.zTile); + AxisAlignedBB axisalignedbb = block.getCollisionBoundingBoxFromPool(this.worldObj, this.xTile, this.yTile, this.zTile); - AxisAlignedBB axisalignedbb = block - .getCollisionBoundingBoxFromPool(this.worldObj, - this.xTile, this.yTile, - this.zTile); - - if (axisalignedbb != null && axisalignedbb.isVecInside(Vec3.createVectorHelper(this.posX, this.posY, this.posZ))) - { - this.inGround = true; - } + + if (axisalignedbb != null + && axisalignedbb.isVecInside(Vec3.createVectorHelper(this.posX, this.posY, this.posZ))) { + this.inGround = true; + } } if (this.arrowShake > 0) { --this.arrowShake; } - if (this.inGround) - { - int j = this.worldObj.getBlockMetadata(this.xTile, - this.yTile, this.zTile); + if (this.inGround) { + int j = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile); if (block == this.inBlock && j == this.inData) { ++this.ticksInGround; - if (this.ticksInGround == 1200) - { + if (this.ticksInGround == 1200) { this.setDead(); } - } else - { + } else { this.inGround = false; this.motionX *= this.rand.nextFloat() * 0.2F; this.motionY *= this.rand.nextFloat() * 0.2F; @@ -326,25 +287,24 @@ public void onUpdate() this.ticksInGround = 0; this.ticksInAir = 0; } - } else - { + } else { ++this.ticksInAir; Vec3 vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - Vec3 vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(vec31, vec3, false, true, false); - vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - - if (movingobjectposition != null) - { - vec3 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord); - } + Vec3 vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(vec31, vec3, false, true, false); + vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + + if (movingobjectposition != null) { + vec3 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, + movingobjectposition.hitVec.zCoord); + } Entity entity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity( - this, - this.boundingBox.addCoord(this.motionX, this.motionY, - this.motionZ).expand(1.0D, 1.0D, 1.0D)); + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, + this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); double d0 = 0.0D; int i; float f1; @@ -352,17 +312,13 @@ public void onUpdate() for (i = 0; i < list.size(); ++i) { Entity entity1 = (Entity) list.get(i); - if (entity1.canBeCollidedWith() - && (entity1 != this.shootingEntity || this.ticksInAir >= 5)) { + if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5)) { f1 = 0.3F; - AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand( - f1, f1, f1); - MovingObjectPosition movingobjectposition1 = axisalignedbb1 - .calculateIntercept(vec31, vec3); + AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand(f1, f1, f1); + MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3); if (movingobjectposition1 != null) { - double d1 = vec31 - .distanceTo(movingobjectposition1.hitVec); + double d1 = vec31.distanceTo(movingobjectposition1.hitVec); if (d1 < d0 || d0 == 0.0D) { entity = entity1; @@ -376,15 +332,12 @@ public void onUpdate() movingobjectposition = new MovingObjectPosition(entity); } - if (movingobjectposition != null - && movingobjectposition.entityHit != null + if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer) movingobjectposition.entityHit; - if (entityplayer.capabilities.disableDamage - || this.shootingEntity instanceof EntityPlayer - && !((EntityPlayer) this.shootingEntity) - .canAttackPlayer(entityplayer)) { + if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer + && !((EntityPlayer) this.shootingEntity).canAttackPlayer(entityplayer)) { movingobjectposition = null; } } @@ -392,96 +345,81 @@ public void onUpdate() float f2; float f4; - if (movingobjectposition != null) - { - if(isExplosive()) - { + if (movingobjectposition != null) { + if (isExplosive()) { explode(); } - if (movingobjectposition.entityHit != null) - { - f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ) / velocityModifier; - - float dam = Math.max(0.1F, this.getHitDamage() * firepower);//(getDamageModifier()*power) / 10F * (float)k; - + if (movingobjectposition.entityHit != null) { + f2 = MathHelper.sqrt_double( + this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ) + / velocityModifier; + + float dam = Math.max(0.1F, this.getHitDamage() * firepower);// (getDamageModifier()*power) / 10F * + // (float)k; + dam *= getDamageModifier(movingobjectposition.entityHit); - - if (this.getIsCritical()) - { - dam *= (rand.nextFloat()*0.5F)+1.0F; + + if (this.getIsCritical()) { + dam *= (rand.nextFloat() * 0.5F) + 1.0F; } DamageSource damagesource = null; - if (this.shootingEntity == null) - { - damagesource = DamageSource - .causeArrowDamage(this, this); - } - else - { - damagesource = DamageSource.causeArrowDamage(this, - this.shootingEntity); + if (this.shootingEntity == null) { + damagesource = DamageSource.causeArrowDamage(this, this); + } else { + damagesource = DamageSource.causeArrowDamage(this, this.shootingEntity); } - if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman)) - { + if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman)) { movingobjectposition.entityHit.setFire(5); } - if(isExplosive()) - { + if (isExplosive()) { dam = this.getExplosionDamage(); damagesource.setExplosion(); - if(this.getFilling() == 2) - { + if (this.getFilling() == 2) { damagesource.setFireDamage(); } } - if (movingobjectposition.entityHit.attackEntityFrom(damagesource, dam)) - { + if (movingobjectposition.entityHit.attackEntityFrom(damagesource, dam)) { onHitEntity(movingobjectposition.entityHit, dam); - if (movingobjectposition.entityHit instanceof EntityLivingBase) - { + if (movingobjectposition.entityHit instanceof EntityLivingBase) { EntityLivingBase entitylivingbase = (EntityLivingBase) movingobjectposition.entityHit; - if (!this.worldObj.isRemote) - { - entitylivingbase .setArrowCountInEntity(entitylivingbase.getArrowCountInEntity() + 1); + if (!this.worldObj.isRemote) { + entitylivingbase.setArrowCountInEntity(entitylivingbase.getArrowCountInEntity() + 1); } - if (this.knockbackStrength > 0) - { - f4 = MathHelper.sqrt_double(this.motionX* this.motionX + this.motionZ* this.motionZ); + if (this.knockbackStrength > 0) { + f4 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - if (f4 > 0.0F) - { - movingobjectposition.entityHit.addVelocity(this.motionX* this.knockbackStrength* 0.6000000238418579D/ f4,0.1D,this.motionZ* this.knockbackStrength* 0.6000000238418579D/ f4); + if (f4 > 0.0F) { + movingobjectposition.entityHit.addVelocity( + this.motionX * this.knockbackStrength * 0.6000000238418579D / f4, 0.1D, + this.motionZ * this.knockbackStrength * 0.6000000238418579D / f4); } } - if (this.shootingEntity != null && this.shootingEntity instanceof EntityLivingBase) - { + if (this.shootingEntity != null && this.shootingEntity instanceof EntityLivingBase) { EnchantmentHelper.func_151384_a(entitylivingbase, this.shootingEntity); - EnchantmentHelper.func_151385_b((EntityLivingBase) this.shootingEntity,entitylivingbase); + EnchantmentHelper.func_151385_b((EntityLivingBase) this.shootingEntity, + entitylivingbase); } - if (this.shootingEntity != null&& movingobjectposition.entityHit != this.shootingEntity&& movingobjectposition.entityHit instanceof EntityPlayer && this.shootingEntity instanceof EntityPlayerMP) - { + if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity + && movingobjectposition.entityHit instanceof EntityPlayer + && this.shootingEntity instanceof EntityPlayerMP) { ((EntityPlayerMP) this.shootingEntity).playerNetServerHandler - .sendPacket(new S2BPacketChangeGameState( - 6, 0.0F)); + .sendPacket(new S2BPacketChangeGameState(6, 0.0F)); } } playHitSound(); - if (!(movingobjectposition.entityHit instanceof EntityEnderman)) - { + if (!(movingobjectposition.entityHit instanceof EntityEnderman)) { this.setDead(); } - } - else - { + } else { this.motionX *= -0.10000000149011612D; this.motionY *= -0.10000000149011612D; this.motionZ *= -0.10000000149011612D; @@ -489,79 +427,56 @@ public void onUpdate() this.prevRotationYaw += 180.0F; this.ticksInAir = 0; } - if(isMagicArrow()) - { + if (isMagicArrow()) { setDead(); } - } - else - { + } else { this.xTile = movingobjectposition.blockX; this.yTile = movingobjectposition.blockY; this.zTile = movingobjectposition.blockZ; this.inBlock = block; - this.inData = this.worldObj.getBlockMetadata( - this.xTile, this.yTile, - this.zTile); + this.inData = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile); this.motionX = ((float) (movingobjectposition.hitVec.xCoord - this.posX)); this.motionY = ((float) (movingobjectposition.hitVec.yCoord - this.posY)); this.motionZ = ((float) (movingobjectposition.hitVec.zCoord - this.posZ)); - f2 = MathHelper.sqrt_double(this.motionX * this.motionX - + this.motionY * this.motionY + this.motionZ - * this.motionZ); - this.posX -= this.motionX / f2 - * 0.05000000074505806D; - this.posY -= this.motionY / f2 - * 0.05000000074505806D; - this.posZ -= this.motionZ / f2 - * 0.05000000074505806D; + f2 = MathHelper.sqrt_double( + this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + this.posX -= this.motionX / f2 * 0.05000000074505806D; + this.posY -= this.motionY / f2 * 0.05000000074505806D; + this.posZ -= this.motionZ / f2 * 0.05000000074505806D; playHitSound(); this.inGround = true; this.arrowShake = 7; this.setIsCritical(false); - if (this.inBlock.getMaterial() != Material.air) - { - this.inBlock.onEntityCollidedWithBlock( - this.worldObj, this.xTile, - this.yTile, this.zTile, this); + if (this.inBlock.getMaterial() != Material.air) { + this.inBlock.onEntityCollidedWithBlock(this.worldObj, this.xTile, this.yTile, this.zTile, this); } - if(isMagicArrow()) - { + if (isMagicArrow()) { setDead(); } - if(ConfigWeapon.breakArrowsGround && didArrowBreak()) - { + if (ConfigWeapon.breakArrowsGround && didArrowBreak()) { breakArrow(); } } - if(getEntityData().hasKey("hasBroken_MFArrow")) - { + if (getEntityData().hasKey("hasBroken_MFArrow")) { worldObj.playSoundAtEntity(this, "random.break", 1.0F, 1.0F); setDead(); } } - if(isMagicArrow()) - { - for (i = 0; i < 4; ++i) - { - this.worldObj.spawnParticle("reddust", this.posX - + this.motionX * i / 4.0D, this.posY - + this.motionY * i / 4.0D, this.posZ - + this.motionZ * i / 4.0D, -this.motionX, + if (isMagicArrow()) { + for (i = 0; i < 4; ++i) { + this.worldObj.spawnParticle("reddust", this.posX + this.motionX * i / 4.0D, + this.posY + this.motionY * i / 4.0D, this.posZ + this.motionZ * i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ); } } - - if (this.getIsCritical()) - { - for (i = 0; i < 4; ++i) - { - this.worldObj.spawnParticle("crit", this.posX - + this.motionX * i / 4.0D, this.posY - + this.motionY * i / 4.0D, this.posZ - + this.motionZ * i / 4.0D, -this.motionX, + + if (this.getIsCritical()) { + for (i = 0; i < 4; ++i) { + this.worldObj.spawnParticle("crit", this.posX + this.motionX * i / 4.0D, + this.posY + this.motionY * i / 4.0D, this.posZ + this.motionZ * i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ); } } @@ -569,12 +484,10 @@ public void onUpdate() this.posX += this.motionX; this.posY += this.motionY; this.posZ += this.motionZ; - f2 = MathHelper.sqrt_double(this.motionX * this.motionX - + this.motionZ * this.motionZ); + f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); - for (this.rotationPitch = (float) (Math.atan2(this.motionY, - f2) * 180.0D / Math.PI); this.rotationPitch + for (this.rotationPitch = (float) (Math.atan2(this.motionY, f2) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { ; } @@ -591,21 +504,16 @@ public void onUpdate() this.prevRotationYaw += 360.0F; } - this.rotationPitch = this.prevRotationPitch - + (this.rotationPitch - this.prevRotationPitch) * 0.2F; - this.rotationYaw = this.prevRotationYaw - + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; float f3 = 0.99F; f1 = 0.05F; if (this.isInWater()) { for (int l = 0; l < 4; ++l) { f4 = 0.25F; - this.worldObj.spawnParticle("bubble", this.posX - - this.motionX * f4, this.posY - - this.motionY * f4, this.posZ - - this.motionZ * f4, this.motionX, - this.motionY, this.motionZ); + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * f4, this.posY - this.motionY * f4, + this.posZ - this.motionZ * f4, this.motionX, this.motionY, this.motionZ); } f3 = 0.8F; @@ -618,51 +526,44 @@ public void onUpdate() this.motionX *= f3; this.motionY *= f3; this.motionZ *= f3; - this.motionY -= f1*getGravityModifier(); + this.motionY -= f1 * getGravityModifier(); this.setPosition(this.posX, this.posY, this.posZ); this.func_145775_I(); } } - private float getDamageModifier(Entity target) - { + private float getDamageModifier(Entity target) { CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(getArrowStack()); return CombatMechanics.getSpecialModifier(material, "standard", target, true); } - private float getModifiedVelocity() - { + private float getModifiedVelocity() { String s = "MF_Bow_Velocity"; - if(getEntityData().hasKey(s)) - { + if (getEntityData().hasKey(s)) { return getEntityData().getFloat(s); } return 1.0F; } - private boolean isExplosive() - { + private boolean isExplosive() { return getEntityData().hasKey("Explosive"); } - private void playHitSound() - { - if(worldObj.isRemote || playedSound)return; + private void playHitSound() { + if (worldObj.isRemote || playedSound) + return; float pitch = 1.0F / (this.rand.nextFloat() * 0.2F + 0.9F); - if(this.arrowtype != null && this.arrowtype == ArrowType.BROADHEAD) - { + if (this.arrowtype != null && this.arrowtype == ArrowType.BROADHEAD) { pitch *= 0.75F; } this.playSound("minefantasy2:weapon.arrowHit", 0.5F, pitch); playedSound = true; } - private void onHitEntity(Entity entityHit, float dam) - { + private void onHitEntity(Entity entityHit, float dam) { ItemStack arrow = getArrowStack(); - if(arrow != null && arrow.getItem() instanceof IArrowMF) - { - ((IArrowMF)arrow.getItem()).onHitEntity(this, shootingEntity, entityHit, dam); + if (arrow != null && arrow.getItem() instanceof IArrowMF) { + ((IArrowMF) arrow.getItem()).onHitEntity(this, shootingEntity, entityHit, dam); } } @@ -670,8 +571,7 @@ private void onHitEntity(Entity entityHit, float dam) * (abstract) Protected helper method to write subclass entity data to NBT. */ @Override - public void writeEntityToNBT(NBTTagCompound nbt) - { + public void writeEntityToNBT(NBTTagCompound nbt) { nbt.setFloat("firepower", firepower); nbt.setBoolean("PlayedSound", playedSound); nbt.setFloat("pierceChance", velocityModifier); @@ -685,7 +585,7 @@ public void writeEntityToNBT(NBTTagCompound nbt) nbt.setByte("inGround", (byte) (this.inGround ? 1 : 0)); nbt.setByte("pickup", (byte) this.canBePickedUp); nbt.setDouble("damage", this.damage); - + nbt.setString("arrowTexture", this.getCustomTex()); nbt.setString("arrowtype", arrowtype.name); nbt.setFloat("FirePower", power); @@ -695,8 +595,7 @@ public void writeEntityToNBT(NBTTagCompound nbt) * (abstract) Protected helper method to read subclass entity data from NBT. */ @Override - public void readEntityFromNBT(NBTTagCompound nbt) - { + public void readEntityFromNBT(NBTTagCompound nbt) { firepower = nbt.getFloat("firepower"); playedSound = nbt.getBoolean("PlayedSound"); velocityModifier = nbt.getFloat("pierceChance"); @@ -704,8 +603,7 @@ public void readEntityFromNBT(NBTTagCompound nbt) this.yTile = nbt.getShort("yTile"); this.zTile = nbt.getShort("zTile"); this.ticksInGround = nbt.getShort("life"); - this.inBlock = Block.getBlockById(nbt - .getByte("inTile") & 255); + this.inBlock = Block.getBlockById(nbt.getByte("inTile") & 255); this.inData = nbt.getByte("inData") & 255; this.arrowShake = nbt.getByte("shake") & 255; this.inGround = nbt.getByte("inGround") == 1; @@ -717,19 +615,15 @@ public void readEntityFromNBT(NBTTagCompound nbt) if (nbt.hasKey("pickup", 99)) { this.canBePickedUp = nbt.getByte("pickup"); } else if (nbt.hasKey("player", 99)) { - this.canBePickedUp = nbt.getBoolean("player") ? 1 - : 0; + this.canBePickedUp = nbt.getBoolean("player") ? 1 : 0; } - - if(nbt.hasKey("arrowTexture")) - { + + if (nbt.hasKey("arrowTexture")) { updateTex(nbt.getString("arrowTexture")); } - if(nbt.hasKey("arrowtype")) - { + if (nbt.hasKey("arrowtype")) { ArrowType arrow = ArrowType.arrowMap.get(nbt.getString("arrowtype")); - if(arrow != null) - { + if (arrow != null) { arrowtype = arrow; } } @@ -740,20 +634,18 @@ public void readEntityFromNBT(NBTTagCompound nbt) * Called by a player entity when they collide with an entity */ @Override - public void onCollideWithPlayer(EntityPlayer player) - { - if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0) - { - boolean canPickUp = this.canBePickedUp == 1 || this.canBePickedUp == 2 && player.capabilities.isCreativeMode; - - if (this.canBePickedUp == 1 && !player.inventory.addItemStackToInventory(getPickedUpItem())) - { + public void onCollideWithPlayer(EntityPlayer player) { + if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0) { + boolean canPickUp = this.canBePickedUp == 1 + || this.canBePickedUp == 2 && player.capabilities.isCreativeMode; + + if (this.canBePickedUp == 1 && !player.inventory.addItemStackToInventory(getPickedUpItem())) { canPickUp = false; } - if (canPickUp) - { - this.playSound( "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); + if (canPickUp) { + this.playSound("random.pop", 0.2F, + ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); player.onItemPickup(this, 1); this.setDead(); } @@ -761,31 +653,27 @@ public void onCollideWithPlayer(EntityPlayer player) } /** - * returns if this entity triggers Block.onEntityWalking on the blocks they - * walk on. used for spiders and wolves to prevent them from trampling crops + * returns if this entity triggers Block.onEntityWalking on the blocks they walk + * on. used for spiders and wolves to prevent them from trampling crops */ @Override - protected boolean canTriggerWalking() - { + protected boolean canTriggerWalking() { return false; } @Override @SideOnly(Side.CLIENT) - public float getShadowSize() - { + public float getShadowSize() { return 0.0F; } @Override - public void setDamage(double dam) - { + public void setDamage(double dam) { this.damage = dam; } @Override - public double getDamage() - { + public double getDamage() { return this.damage; } @@ -793,8 +681,7 @@ public double getDamage() * Sets the amount of knockback the arrow applies when it hits a mob. */ @Override - public void setKnockbackStrength(int str) - { + public void setKnockbackStrength(int str) { this.knockbackStrength = str; } @@ -802,309 +689,266 @@ public void setKnockbackStrength(int str) * If returns false, the item will not inflict any damage against entities. */ @Override - public boolean canAttackWithItem() - { + public boolean canAttackWithItem() { return false; } - + /** * The old critical method called on full charge, I use my own */ @Override - public void setIsCritical(boolean flag) - { - + public void setIsCritical(boolean flag) { + } + /** - * [New Method] Whether the arrow has a stream of critical hit particles flying behind - * it. Called by chance + * [New Method] Whether the arrow has a stream of critical hit particles flying + * behind it. Called by chance */ - public void setCritical(boolean flag) - { + public void setCritical(boolean flag) { byte b0 = this.dataWatcher.getWatchableObjectByte(16); - if (flag) - { + if (flag) { this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 1))); - } else - { + } else { this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -2))); } } /** - * Whether the arrow has a stream of critical hit particles flying behind - * it. + * Whether the arrow has a stream of critical hit particles flying behind it. */ @Override - public boolean getIsCritical() - { + public boolean getIsCritical() { byte b0 = this.dataWatcher.getWatchableObjectByte(16); return (b0 & 1) != 0; } - - public float getHitDamage() - { + + public float getHitDamage() { float dam = 2.0F; ItemStack arrowStack = getArrowStack(); - if(arrowStack != null) - { - if(arrowStack.getItem() instanceof IArrowMF) - { - dam = ((IArrowMF)arrowStack.getItem()).getDamageModifier(arrowStack); + if (arrowStack != null) { + if (arrowStack.getItem() instanceof IArrowMF) { + dam = ((IArrowMF) arrowStack.getItem()).getDamageModifier(arrowStack); } } - if(getEntityData().hasKey("MF_Bow_Damage")) - { + if (getEntityData().hasKey("MF_Bow_Damage")) { dam *= getEntityData().getFloat("MF_Bow_Damage"); } return dam; } - - public float getGravityModifier() - { + + public float getGravityModifier() { ItemStack arrowStack = getArrowStack(); - if(arrowStack != null) - { - if(arrowStack.getItem() instanceof IArrowMF) - { - return ((IArrowMF)arrowStack.getItem()).getGravityModifier(arrowStack); + if (arrowStack != null) { + if (arrowStack.getItem() instanceof IArrowMF) { + return ((IArrowMF) arrowStack.getItem()).getGravityModifier(arrowStack); } } return 1.0F; } - - public float getBreakChance() - { + + public float getBreakChance() { ItemStack arrowStack = getArrowStack(); - if(arrowStack != null) - { - if(arrowStack.getItem() instanceof IArrowMF) - { - return ((IArrowMF)arrowStack.getItem()).getBreakChance(this, arrowStack); + if (arrowStack != null) { + if (arrowStack.getItem() instanceof IArrowMF) { + return ((IArrowMF) arrowStack.getItem()).getBreakChance(this, arrowStack); } } return 1.0F; } - + @SideOnly(Side.CLIENT) - public String getTexture() - { - return "textures/projectile/"+getCustomTex(); + public String getTexture() { + return "textures/projectile/" + getCustomTex(); } - - public ItemStack getPickedUpItem() - { + + public ItemStack getPickedUpItem() { return getArrowStack(); } /** * Saves the arrow to the NBT + * * @param arrow */ - private void setArrowStack(ItemStack arrow) - { + private void setArrowStack(ItemStack arrow) { NBTTagCompound arrowNBT = new NBTTagCompound(); - arrow.writeToNBT(arrowNBT); - getEntityData().setTag("MF_ArrowItem", arrowNBT); + arrow.writeToNBT(arrowNBT); + getEntityData().setTag("MF_ArrowItem", arrowNBT); } - - private ItemStack getArrowStack() - { - if(getEntityData().hasKey("MF_ArrowItem")) - { + + private ItemStack getArrowStack() { + if (getEntityData().hasKey("MF_ArrowItem")) { NBTTagCompound heldArrow = getEntityData().getCompoundTag("MF_ArrowItem"); return ItemStack.loadItemStackFromNBT(heldArrow); } return new ItemStack(Items.arrow); } - private void updateTex(String tex) - { + + private void updateTex(String tex) { dataWatcher.updateObject(texture_dw, tex); } - private String getCustomTex() - { - try - { + + private String getCustomTex() { + try { return dataWatcher.getWatchableObjectString(texture_dw); - }catch(Exception e) - { + } catch (Exception e) { MFLogUtil.logWarn("Arrow Failed To Load Texture"); return "steel_arrow"; } } @Override - public boolean canBePickedUp() - { - if(isMagicArrow()) - { + public boolean canBePickedUp() { + if (isMagicArrow()) { return false; } - if(didArrowBreak()) - { + if (didArrowBreak()) { breakArrow(); return false; } return canBePickedUp == 1; } - private void breakArrow() - { + private void breakArrow() { getEntityData().setBoolean("hasBroken_MFArrow", true); } - private boolean didArrowBreak() - { - if(isExplosive()) - { + private boolean didArrowBreak() { + if (isExplosive()) { return false; } float c = rand.nextFloat(); float br = getBreakChance() * ConfigWeapon.arrowBreakMod; return c < br; } + @Override - public ItemStack getDroppedItem() - { + public ItemStack getDroppedItem() { return getArrowStack(); } @Override - public float[] getDamageRatio(Object... implement) - { - if(isExplosive()) - { - return new float[]{0,1, 0}; + public float[] getDamageRatio(Object... implement) { + if (isExplosive()) { + return new float[] { 0, 1, 0 }; } - if(arrowtype != null) - { + if (arrowtype != null) { return arrowtype.ratio; } - return new float[]{0,0, 1}; + return new float[] { 0, 0, 1 }; } - public void modifyVelocity(float velocity) - { + public void modifyVelocity(float velocity) { this.velocityModifier = velocity; - motionX*=velocity; - motionY*=velocity; - motionZ*=velocity; + motionX *= velocity; + motionY *= velocity; + motionZ *= velocity; } + @Override - public float getPenetrationLevel(Object implement) - { + public float getPenetrationLevel(Object implement) { return arrowtype == ArrowType.BROADHEAD ? -0.5F : 0F; } - public void setPower(float f) - { + public void setPower(float f) { power = f; } - - public EntityArrowMF setBombStats(int powder, int filling) - { + + public EntityArrowMF setBombStats(int powder, int filling) { getEntityData().setInteger("powder", powder); getEntityData().setInteger("filling", filling); getEntityData().setBoolean("Explosive", true); return this; } - public void explode() - { + + public void explode() { worldObj.playSoundAtEntity(this, "random.explode", 0.3F, 10F - 5F); - worldObj.createExplosion(this, posX, posY, posZ, 0, false); - if (!this.worldObj.isRemote) - { - double area = getRangeOfBlast()*2D; - AxisAlignedBB var3 = this.boundingBox.expand(area, area/2, area); - List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); - - if (var4 != null && !var4.isEmpty()) - { - Iterator splashDamage = var4.iterator(); - - while (splashDamage.hasNext()) - { - Entity entityHit = (Entity)splashDamage.next(); - double distanceToEntity = this.getDistanceToEntity(entityHit); - - double radius = getRangeOfBlast(); - if (distanceToEntity < radius) - { - float dam = getExplosionDamage(); - - if(distanceToEntity > radius/2) - { - double sc = distanceToEntity-(radius/2); - if(sc < 0)sc = 0; - if(sc > (radius/2))sc = (radius/2); - dam *= (sc / (radius/2)); - } - if(!(entityHit instanceof EntityItem)) - { - DamageSource source = causeBombDamage(this, shootingEntity != null ? shootingEntity:this); - source.setExplosion(); - if(getFilling() == 2) - { - source.setFireDamage(); - } - entityHit.attackEntityFrom(source, dam); - } - } - } - } - this.setDead(); - } - - int filling = getFilling(); - if(filling > 0) - { - for(int a = 0; a < 16; a++) - { - float range = 0.6F; - EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY+0.5D, posZ, (rand.nextDouble()-0.5)*range, (rand.nextDouble()-0.5)*range, (rand.nextDouble()-0.5)*range); - - if(filling == 2) - { - shrapnel.setFire(10); - } - worldObj.spawnEntityInWorld(shrapnel); - } - } + worldObj.createExplosion(this, posX, posY, posZ, 0, false); + if (!this.worldObj.isRemote) { + double area = getRangeOfBlast() * 2D; + AxisAlignedBB var3 = this.boundingBox.expand(area, area / 2, area); + List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); + + if (var4 != null && !var4.isEmpty()) { + Iterator splashDamage = var4.iterator(); + + while (splashDamage.hasNext()) { + Entity entityHit = (Entity) splashDamage.next(); + double distanceToEntity = this.getDistanceToEntity(entityHit); + + double radius = getRangeOfBlast(); + if (distanceToEntity < radius) { + float dam = getExplosionDamage(); + + if (distanceToEntity > radius / 2) { + double sc = distanceToEntity - (radius / 2); + if (sc < 0) + sc = 0; + if (sc > (radius / 2)) + sc = (radius / 2); + dam *= (sc / (radius / 2)); + } + if (!(entityHit instanceof EntityItem)) { + DamageSource source = causeBombDamage(this, shootingEntity != null ? shootingEntity : this); + source.setExplosion(); + if (getFilling() == 2) { + source.setFireDamage(); + } + entityHit.attackEntityFrom(source, dam); + } + } + } + } + this.setDead(); + } + + int filling = getFilling(); + if (filling > 0) { + for (int a = 0; a < 16; a++) { + float range = 0.6F; + EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY + 0.5D, posZ, + (rand.nextDouble() - 0.5) * range, (rand.nextDouble() - 0.5) * range, + (rand.nextDouble() - 0.5) * range); + + if (filling == 2) { + shrapnel.setFire(10); + } + worldObj.spawnEntityInWorld(shrapnel); + } + } } - private int getFilling() - { + + private int getFilling() { return getEntityData().getInteger("filling"); } - private int getPowder() - { + + private int getPowder() { return getEntityData().getInteger("powder"); } - private EnumExplosiveType getBlast() - { - return EnumExplosiveType.getType((byte)getFilling()); + private EnumExplosiveType getBlast() { + return EnumExplosiveType.getType((byte) getFilling()); + } + + private EnumPowderType getPowderType() { + return EnumPowderType.getType((byte) getPowder()); } - private EnumPowderType getPowderType() - { - return EnumPowderType.getType((byte)getPowder()); + + private double getRangeOfBlast() { + return getBlast().range * getPowderType().rangeModifier * 0.5F; } - private double getRangeOfBlast() - { - return getBlast().range * getPowderType().rangeModifier*0.5F; + + private int getExplosionDamage() { + return (int) (getBlast().damage * getPowderType().damageModifier * 0.5F); } - private int getExplosionDamage() - { - return (int)(getBlast().damage* getPowderType().damageModifier*0.5F); + public static DamageSource causeBombDamage(Entity bomb, Entity user) { + return (new EntityDamageSourceBomb(bomb, user)).setProjectile(); } - public static DamageSource causeBombDamage(Entity bomb, Entity user) - { - return (new EntityDamageSourceBomb(bomb, user)).setProjectile(); - } - - public boolean isMagicArrow() - { + + public boolean isMagicArrow() { CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(getArrowStack()); return material != null && material.type.equalsIgnoreCase("magic"); } diff --git a/src/main/java/minefantasy/mf2/entity/EntityBomb.java b/src/main/java/minefantasy/mf2/entity/EntityBomb.java index 2917a228..0c720f27 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityBomb.java +++ b/src/main/java/minefantasy/mf2/entity/EntityBomb.java @@ -26,455 +26,406 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class EntityBomb extends Entity -{ - /** How long the fuse is */ - public int fuse; - private EntityLivingBase thrower; - - public EntityBomb(World world) - { - super(world); - this.fuse = getFuseTime(); - this.preventEntitySpawning = true; - this.setSize(0.5F, 0.5F); - this.yOffset = this.height / 2.0F; - } - - public EntityBomb(World world, EntityLivingBase thrower) - { - this(world); - this.thrower = thrower; - - this.setLocationAndAngles(thrower.posX, thrower.posY + thrower.getEyeHeight(), thrower.posZ, thrower.rotationYaw, thrower.rotationPitch); - this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; - this.posY -= 0.10000000149011612D; - this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; - this.setPosition(this.posX, this.posY, this.posZ); - - float force = this.getThrownForce() + (CombatMechanics.getStrengthEnhancement(thrower)/4); - - float f = 0.4F; - this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * f; - this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * f; - this.motionY = -MathHelper.sin((this.rotationPitch + this.getThrownOffset()) / 180.0F * (float)Math.PI) * f; - this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, force, 1.0F); - - this.prevPosX = posX; - this.prevPosY = posY; - this.prevPosZ = posZ; - } - - private int getFuseTime() - { +public class EntityBomb extends Entity { + /** How long the fuse is */ + public int fuse; + private EntityLivingBase thrower; + + public EntityBomb(World world) { + super(world); + this.fuse = getFuseTime(); + this.preventEntitySpawning = true; + this.setSize(0.5F, 0.5F); + this.yOffset = this.height / 2.0F; + } + + public EntityBomb(World world, EntityLivingBase thrower) { + this(world); + this.thrower = thrower; + + this.setLocationAndAngles(thrower.posX, thrower.posY + thrower.getEyeHeight(), thrower.posZ, + thrower.rotationYaw, thrower.rotationPitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.posY -= 0.10000000149011612D; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + + float force = this.getThrownForce() + (CombatMechanics.getStrengthEnhancement(thrower) / 4); + + float f = 0.4F; + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; + this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; + this.motionY = -MathHelper.sin((this.rotationPitch + this.getThrownOffset()) / 180.0F * (float) Math.PI) * f; + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, force, 1.0F); + + this.prevPosX = posX; + this.prevPosY = posY; + this.prevPosZ = posZ; + } + + private int getFuseTime() { return (this.fuse = getFuseType().time) + (isSticky() ? 20 : 0); } - public void setThrowableHeading(double x, double y, double z, float offset, float force) - { - float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); - x /= f2; - y /= f2; - z /= f2; - x += this.rand.nextGaussian() * 0.007499999832361937D * force; - y += this.rand.nextGaussian() * 0.007499999832361937D * force; - z += this.rand.nextGaussian() * 0.007499999832361937D * force; - x *= offset; - y *= offset; - z *= offset; - this.motionX = x; - this.motionY = y; - this.motionZ = z; - float f3 = MathHelper.sqrt_double(x * x + z * z); - this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(x, z) * 180.0D / Math.PI); - this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(y, f3) * 180.0D / Math.PI); - } - protected float getThrownOffset() - { - return 0.0F; - } - protected float getThrownForce() - { - return 1.5F; - } - - @Override - protected void entityInit() - { - dataWatcher.addObject(typeId, (byte)0); - dataWatcher.addObject(typeId+1, (byte)0); - dataWatcher.addObject(typeId+2, (byte)0); - dataWatcher.addObject(typeId+3, (byte)0); - } - - /** - * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to - * prevent them from trampling crops - */ - @Override - protected boolean canTriggerWalking() - { - return false; - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - @Override - public boolean canBeCollidedWith() - { - return true; - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - this.motionY -= (0.03999999910593033D * getGravityModifier()); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.9800000190734863D; - this.motionY *= 0.9800000190734863D; - this.motionZ *= 0.9800000190734863D; - - if (this.onGround) - { - double d = 0.75D; - this.motionX *= d; - this.motionZ *= d; - this.motionY *= -0.99D; - } - List collide = worldObj.getEntitiesWithinAABBExcludingEntity(this, boundingBox); - if (!collide.isEmpty() && !(thrower != null && collide.contains(thrower))) - { - if(isSticky()) - { - Object object = collide.get(0); - if(object instanceof Entity && object != this) - { - if(this.ridingEntity == null && ((Entity) object).riddenByEntity == null && canStick((Entity) object)) - { - this.mountEntity((Entity) object); - this.fuse = getFuseTime(); - } - } - } - this.motionX = motionZ = 0; - } - - if (this.fuse-- <= 0) - { - this.setDead(); - - if (!this.worldObj.isRemote) - { - this.explode(); - } - } - else - { - this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.125D, this.posZ, 0.0D, 0.0D, 0.0D); - this.worldObj.spawnParticle("flame", this.posX, this.posY + 0.125D, this.posZ, 0.0D, 0.0D, 0.0D); - } - - if(!worldObj.isRemote && this.ridingEntity != null && ridingEntity instanceof EntityLivingBase) - { - if(!(ridingEntity instanceof EntityChicken)) - { - CombatMechanics.panic((EntityLivingBase)ridingEntity, 1.0F, 30); - } - } - if(isStuckInBlock()) - { - motionX = motionY = motionZ = 0; - } - } - - private boolean canStick(Entity entity) - { - return ! (entity instanceof EntityCogwork); + public void setThrowableHeading(double x, double y, double z, float offset, float force) { + float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); + x /= f2; + y /= f2; + z /= f2; + x += this.rand.nextGaussian() * 0.007499999832361937D * force; + y += this.rand.nextGaussian() * 0.007499999832361937D * force; + z += this.rand.nextGaussian() * 0.007499999832361937D * force; + x *= offset; + y *= offset; + z *= offset; + this.motionX = x; + this.motionY = y; + this.motionZ = z; + float f3 = MathHelper.sqrt_double(x * x + z * z); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(x, z) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(y, f3) * 180.0D / Math.PI); + } + + protected float getThrownOffset() { + return 0.0F; + } + + protected float getThrownForce() { + return 1.5F; } @Override - public void mountEntity(Entity object) - { - super.mountEntity(object); - - if(object instanceof EntityChicken) - { - EntityChicken chook = (EntityChicken)object; - Entity target = worldObj.findNearestEntityWithinAABB(IMob.class, chook.boundingBox.expand(64, 8, 64),chook); - if(target != null) - { - if(target instanceof EntityLivingBase) - { + protected void entityInit() { + dataWatcher.addObject(typeId, (byte) 0); + dataWatcher.addObject(typeId + 1, (byte) 0); + dataWatcher.addObject(typeId + 2, (byte) 0); + dataWatcher.addObject(typeId + 3, (byte) 0); + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they walk + * on. used for spiders and wolves to prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() { + return false; + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + @Override + public boolean canBeCollidedWith() { + return true; + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY -= (0.03999999910593033D * getGravityModifier()); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.9800000190734863D; + this.motionY *= 0.9800000190734863D; + this.motionZ *= 0.9800000190734863D; + + if (this.onGround) { + double d = 0.75D; + this.motionX *= d; + this.motionZ *= d; + this.motionY *= -0.99D; + } + List collide = worldObj.getEntitiesWithinAABBExcludingEntity(this, boundingBox); + if (!collide.isEmpty() && !(thrower != null && collide.contains(thrower))) { + if (isSticky()) { + Object object = collide.get(0); + if (object instanceof Entity && object != this) { + if (this.ridingEntity == null && ((Entity) object).riddenByEntity == null + && canStick((Entity) object)) { + this.mountEntity((Entity) object); + this.fuse = getFuseTime(); + } + } + } + this.motionX = motionZ = 0; + } + + if (this.fuse-- <= 0) { + this.setDead(); + + if (!this.worldObj.isRemote) { + this.explode(); + } + } else { + this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.125D, this.posZ, 0.0D, 0.0D, 0.0D); + this.worldObj.spawnParticle("flame", this.posX, this.posY + 0.125D, this.posZ, 0.0D, 0.0D, 0.0D); + } + + if (!worldObj.isRemote && this.ridingEntity != null && ridingEntity instanceof EntityLivingBase) { + if (!(ridingEntity instanceof EntityChicken)) { + CombatMechanics.panic((EntityLivingBase) ridingEntity, 1.0F, 30); + } + } + if (isStuckInBlock()) { + motionX = motionY = motionZ = 0; + } + } + + private boolean canStick(Entity entity) { + return !(entity instanceof EntityCogwork); + } + + @Override + public void mountEntity(Entity object) { + super.mountEntity(object); + + if (object instanceof EntityChicken) { + EntityChicken chook = (EntityChicken) object; + Entity target = worldObj.findNearestEntityWithinAABB(IMob.class, chook.boundingBox.expand(64, 8, 64), + chook); + if (target != null) { + if (target instanceof EntityLivingBase) { chook.setCustomNameTag("Suicide Chook!"); - fuse = getFuseTime()*2; - chook.getNavigator().clearPathEntity(); - chook.setAttackTarget((EntityLivingBase)target); + fuse = getFuseTime() * 2; + chook.getNavigator().clearPathEntity(); + chook.setAttackTarget((EntityLivingBase) target); chook.targetTasks.addTask(1, new EntityAIAttackOnCollide(chook, IMob.class, 1.25D, true)); - chook.setAIMoveSpeed(0.5F); + chook.setAIMoveSpeed(0.5F); } } } - } + } - private boolean isStuckInBlock() - { - return false;//isSticky() && isAABBInSolid(boundingBox.expand(0.5D, 0.5D, 0.5D)); + private boolean isStuckInBlock() { + return false;// isSticky() && isAABBInSolid(boundingBox.expand(0.5D, 0.5D, 0.5D)); } - private boolean isSticky() - { + private boolean isSticky() { return getEntityData().hasKey("stickyBomb"); } - private double getGravityModifier() - { + private double getGravityModifier() { return isStuckInBlock() ? 0F : getCase().weightModifier; } - private void explode2() - { - float power = 3.5F; - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, power, false); - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - protected void writeEntityToNBT(NBTTagCompound nbt) - { - nbt.setByte("Fuse", (byte)this.fuse); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - protected void readEntityFromNBT(NBTTagCompound nbt) - { - this.fuse = nbt.getByte("Fuse"); - } - - @Override + private void explode2() { + float power = 3.5F; + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, power, false); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + protected void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setByte("Fuse", (byte) this.fuse); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + protected void readEntityFromNBT(NBTTagCompound nbt) { + this.fuse = nbt.getByte("Fuse"); + } + + @Override @SideOnly(Side.CLIENT) - public float getShadowSize() - { - return 0.25F; - } - - /** - * returns null or the entityliving it was placed or ignited by - */ - public EntityLivingBase getTntPlacedBy() - { - return this.thrower; - } - - @Override - public void applyEntityCollision(Entity entity) - { - if(!(thrower != null && thrower == entity)) - { - this.motionX = 0; - this.motionZ = 0; - } - } - - public void explode() - { + public float getShadowSize() { + return 0.25F; + } + + /** + * returns null or the entityliving it was placed or ignited by + */ + public EntityLivingBase getTntPlacedBy() { + return this.thrower; + } + + @Override + public void applyEntityCollision(Entity entity) { + if (!(thrower != null && thrower == entity)) { + this.motionX = 0; + this.motionZ = 0; + } + } + + public void explode() { worldObj.playSoundAtEntity(this, "random.explode", 0.3F, 10F - 5F); - worldObj.createExplosion(this, posX, posY, posZ, 0, false); - if (!this.worldObj.isRemote) - { - double area = getRangeOfBlast()*2D; - AxisAlignedBB var3 = this.boundingBox.expand(area, area/2, area); - List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); - - if (var4 != null && !var4.isEmpty()) - { - Iterator splashDamage = var4.iterator(); - - while (splashDamage.hasNext()) - { - Entity entityHit = (Entity)splashDamage.next(); - - if(MineFantasyII.isBukkitServer() && BukkitUtils.cantDamage(thrower != null ? thrower:this, entityHit)) { - continue; - } - - double distanceToEntity = this.getDistanceToEntity(entityHit); - double radius = getRangeOfBlast(); - if (distanceToEntity < radius) - { - float dam = getDamage(); - - if(getCasing() != 2 && distanceToEntity > radius/2) - { - double sc = distanceToEntity-(radius/2); - if(sc < 0)sc = 0; - if(sc > (radius/2))sc = (radius/2); - dam *= (sc / (radius/2)); - } - if(!(entityHit instanceof EntityItem)) - { - - DamageSource source = causeBombDamage(this, thrower != null ? thrower:this); - source.setExplosion(); - if(getFilling() == 2) - { - source.setFireDamage(); - } - if(ridingEntity != null && entityHit == ridingEntity) - { - dam *= 1.5F; - } - if(entityHit.attackEntityFrom(source, dam)) - { - applyEffects(entityHit); - } - } - } - } - } - this.setDead(); - } - - int t = getFilling(); - if(t > 0) - { - for(int a = 0; a < 16; a++) - { - float range = 0.6F; - EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY+0.5D, posZ, (rand.nextDouble()-0.5)*range, (rand.nextDouble()-0.5F)*range, (rand.nextDouble()-0.5)*range); - - if(t == 2) - { - shrapnel.setFire(10); - } - worldObj.spawnEntityInWorld(shrapnel); - } - } - } - private void applyEffects(Entity hit) - { - if(getFilling() == 2) - { - hit.setFire(5); - } - if(hit instanceof EntityLivingBase) - { - EntityLivingBase live = (EntityLivingBase)hit; - } - } - - private double getRangeOfBlast() - { + worldObj.createExplosion(this, posX, posY, posZ, 0, false); + if (!this.worldObj.isRemote) { + double area = getRangeOfBlast() * 2D; + AxisAlignedBB var3 = this.boundingBox.expand(area, area / 2, area); + List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); + + if (var4 != null && !var4.isEmpty()) { + Iterator splashDamage = var4.iterator(); + + while (splashDamage.hasNext()) { + Entity entityHit = (Entity) splashDamage.next(); + + if (MineFantasyII.isBukkitServer() + && BukkitUtils.cantDamage(thrower != null ? thrower : this, entityHit)) { + continue; + } + + double distanceToEntity = this.getDistanceToEntity(entityHit); + double radius = getRangeOfBlast(); + if (distanceToEntity < radius) { + float dam = getDamage(); + + if (getCasing() != 2 && distanceToEntity > radius / 2) { + double sc = distanceToEntity - (radius / 2); + if (sc < 0) + sc = 0; + if (sc > (radius / 2)) + sc = (radius / 2); + dam *= (sc / (radius / 2)); + } + if (!(entityHit instanceof EntityItem)) { + + DamageSource source = causeBombDamage(this, thrower != null ? thrower : this); + source.setExplosion(); + if (getFilling() == 2) { + source.setFireDamage(); + } + if (ridingEntity != null && entityHit == ridingEntity) { + dam *= 1.5F; + } + if (entityHit.attackEntityFrom(source, dam)) { + applyEffects(entityHit); + } + } + } + } + } + this.setDead(); + } + + int t = getFilling(); + if (t > 0) { + for (int a = 0; a < 16; a++) { + float range = 0.6F; + EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY + 0.5D, posZ, + (rand.nextDouble() - 0.5) * range, (rand.nextDouble() - 0.5F) * range, + (rand.nextDouble() - 0.5) * range); + + if (t == 2) { + shrapnel.setFire(10); + } + worldObj.spawnEntityInWorld(shrapnel); + } + } + } + + private void applyEffects(Entity hit) { + if (getFilling() == 2) { + hit.setFire(5); + } + if (hit instanceof EntityLivingBase) { + EntityLivingBase live = (EntityLivingBase) hit; + } + } + + private double getRangeOfBlast() { return getBlast().range * getCase().rangeModifier * getPowderType().rangeModifier; } - private int getDamage() - { - return (int)(getBlast().damage* getCase().damageModifier * getPowderType().damageModifier); - } - - public static DamageSource causeBombDamage(Entity bomb, Entity user) - { - return (new EntityDamageSourceBomb(bomb, user)).setProjectile(); - } - - public boolean canEntityBeSeen(Entity entity) - { - return this.worldObj.rayTraceBlocks(Vec3.createVectorHelper(this.posX, this.posY + this.getEyeHeight(), this.posZ), Vec3.createVectorHelper(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ)) == null; - } - + private int getDamage() { + return (int) (getBlast().damage * getCase().damageModifier * getPowderType().damageModifier); + } + + public static DamageSource causeBombDamage(Entity bomb, Entity user) { + return (new EntityDamageSourceBomb(bomb, user)).setProjectile(); + } + + public boolean canEntityBeSeen(Entity entity) { + return this.worldObj.rayTraceBlocks( + Vec3.createVectorHelper(this.posX, this.posY + this.getEyeHeight(), this.posZ), + Vec3.createVectorHelper(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ)) == null; + } + private final int typeId = 2; - public byte getFilling() - { + + public byte getFilling() { return dataWatcher.getWatchableObjectByte(typeId); } - public byte getCasing() - { - return dataWatcher.getWatchableObjectByte(typeId+1); + + public byte getCasing() { + return dataWatcher.getWatchableObjectByte(typeId + 1); } - public byte getFuse() - { - return dataWatcher.getWatchableObjectByte(typeId+2); + + public byte getFuse() { + return dataWatcher.getWatchableObjectByte(typeId + 2); } - public byte getPowder() - { - return dataWatcher.getWatchableObjectByte(typeId+3); + + public byte getPowder() { + return dataWatcher.getWatchableObjectByte(typeId + 3); } - public EntityBomb setType(byte fill, byte casing, byte fuse, byte powder) - { + + public EntityBomb setType(byte fill, byte casing, byte fuse, byte powder) { dataWatcher.updateObject(typeId, fill); - dataWatcher.updateObject(typeId+1, casing); - dataWatcher.updateObject(typeId+2, fuse); - dataWatcher.updateObject(typeId+3, powder); - + dataWatcher.updateObject(typeId + 1, casing); + dataWatcher.updateObject(typeId + 2, fuse); + dataWatcher.updateObject(typeId + 3, powder); + this.fuse = getFuseType().time; - + return this; } - private EnumExplosiveType getBlast() - { + + private EnumExplosiveType getBlast() { return EnumExplosiveType.getType(getFilling()); } - private EnumCasingType getCase() - { + + private EnumCasingType getCase() { return EnumCasingType.getType(getCasing()); } - private EnumFuseType getFuseType() - { + + private EnumFuseType getFuseType() { return EnumFuseType.getType(getFuse()); } - private EnumPowderType getPowderType() - { + + private EnumPowderType getPowderType() { return EnumPowderType.getType(getPowder()); } - - public boolean isAABBInSolid(AxisAlignedBB field) - { - int i = MathHelper.floor_double(field.minX); - int j = MathHelper.floor_double(field.maxX + 1.0D); - int k = MathHelper.floor_double(field.minY); - int l = MathHelper.floor_double(field.maxY + 1.0D); - int i1 = MathHelper.floor_double(field.minZ); - int j1 = MathHelper.floor_double(field.maxZ + 1.0D); - - for (int k1 = i; k1 < j; ++k1) - { - for (int l1 = k; l1 < l; ++l1) - { - for (int i2 = i1; i2 < j1; ++i2) - { - Block block = worldObj.getBlock(k1, l1, i2); - - if (block.getMaterial().isSolid()) - { - int j2 = worldObj.getBlockMetadata(k1, l1, i2); - double d0 = (double)(l1 + 1); - - if (j2 < 8) - { - d0 = (double)(l1 + 1) - (double)j2 / 8.0D; - } - - if (d0 >= field.minY) - { - return true; - } - } - } - } - } - - return false; - } + + public boolean isAABBInSolid(AxisAlignedBB field) { + int i = MathHelper.floor_double(field.minX); + int j = MathHelper.floor_double(field.maxX + 1.0D); + int k = MathHelper.floor_double(field.minY); + int l = MathHelper.floor_double(field.maxY + 1.0D); + int i1 = MathHelper.floor_double(field.minZ); + int j1 = MathHelper.floor_double(field.maxZ + 1.0D); + + for (int k1 = i; k1 < j; ++k1) { + for (int l1 = k; l1 < l; ++l1) { + for (int i2 = i1; i2 < j1; ++i2) { + Block block = worldObj.getBlock(k1, l1, i2); + + if (block.getMaterial().isSolid()) { + int j2 = worldObj.getBlockMetadata(k1, l1, i2); + double d0 = l1 + 1; + + if (j2 < 8) { + d0 = l1 + 1 - j2 / 8.0D; + } + + if (d0 >= field.minY) { + return true; + } + } + } + } + } + + return false; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityCogwork.java b/src/main/java/minefantasy/mf2/entity/EntityCogwork.java index 4f6bf321..8c8beadb 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityCogwork.java +++ b/src/main/java/minefantasy/mf2/entity/EntityCogwork.java @@ -35,446 +35,398 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.common.ForgeHooks; -public class EntityCogwork extends EntityLivingBase implements IPowerArmour -{ +public class EntityCogwork extends EntityLivingBase implements IPowerArmour { public static float base_fuel_minutes = 20F; - + private static final float general_step_height = 1.0F; private int noMoveTime = 0; - public EntityCogwork(World world) - { + + public EntityCogwork(World world) { super(world); - this.stepHeight = general_step_height; + this.stepHeight = general_step_height; this.preventEntitySpawning = true; this.setSize(1.5F, 2.5F); } - public EntityCogwork(World world, double posX, double posY, double posZ) - { + + public EntityCogwork(World world, double posX, double posY, double posZ) { this(world); this.setPosition(posX, posY, posZ); } - + @Override - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(12, ""); - this.dataWatcher.addObject(13, Float.valueOf(0F)); - this.dataWatcher.addObject(14, Integer.valueOf(0)); - } - - - public void setBolts(int value) - { - this.dataWatcher.updateObject(14, value); - } - - public int getBolts() - { - return this.dataWatcher.getWatchableObjectInt(14); - } - - - public void setFuel(float level) - { - this.dataWatcher.updateObject(13, level); - } - - public float getFuel() - { - return this.dataWatcher.getWatchableObjectFloat(13); - } - - public void setCustomMaterial(String name) - { - if(name.length() == 0) - { + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(12, ""); + this.dataWatcher.addObject(13, Float.valueOf(0F)); + this.dataWatcher.addObject(14, Integer.valueOf(0)); + } + + public void setBolts(int value) { + this.dataWatcher.updateObject(14, value); + } + + public int getBolts() { + return this.dataWatcher.getWatchableObjectInt(14); + } + + public void setFuel(float level) { + this.dataWatcher.updateObject(13, level); + } + + public float getFuel() { + return this.dataWatcher.getWatchableObjectFloat(13); + } + + public void setCustomMaterial(String name) { + if (name.length() == 0) { setHealth(getMaxHealth()); } - this.dataWatcher.updateObject(12, name); - } + this.dataWatcher.updateObject(12, name); + } - public String getCustomMaterial() - { - return this.dataWatcher.getWatchableObjectString(12); - } + public String getCustomMaterial() { + return this.dataWatcher.getWatchableObjectString(12); + } @Override public ItemStack getHeldItem() { return null; } + @Override public ItemStack getEquipmentInSlot(int p_71124_1_) { return null; } + @Override public void setCurrentItemOrArmor(int p_70062_1_, ItemStack p_70062_2_) { } - private ItemStack[] items = new ItemStack[]{}; + + private ItemStack[] items = new ItemStack[] {}; + @Override public ItemStack[] getLastActiveItems() { return items; } - + @Override - public void onUpdate() - { - super.onUpdate(); - if(noMoveTime > 0) - { - moveForward = moveStrafing = 0; - --noMoveTime; - } - - float fuel = this.getFuel(); - float maxfuel = this.getMaxFuel(); - if(isPowered()) - { - fuel -= getFuelDecay(); - } - fuel = MathHelper.clamp_float(fuel, 0F, maxfuel); - setFuel(fuel); - - /* if(isSprinting()) - { - if(riddenByEntity == null || this.getMoveForward() <= 0 || !isPowered()) - { - setSprinting(false); - } - }*/ - if(this.riddenByEntity != null) - { - stepHeight = general_step_height; - updateRider(); - if(riddenByEntity.isBurning() && this.isFullyArmoured()) - { - riddenByEntity.extinguish(); - } - - //ARROWS - if(riddenByEntity instanceof EntityLivingBase) - { - int arrows = ((EntityLivingBase)riddenByEntity).getArrowCountInEntity(); - ((EntityLivingBase)riddenByEntity).setArrowCountInEntity(0); - int my_arrows = this.getArrowCountInEntity(); - this.setArrowCountInEntity(my_arrows + arrows); - - if(this.isFullyArmoured()) - { - ((EntityLivingBase)riddenByEntity).setAir(300); - } - - if(ticksExisted % 20 == 0) - { - for(int a = 0; a < 4; a ++) - { - if(!allowEquipment( (EntityLivingBase)riddenByEntity) ) - { - riddenByEntity.mountEntity(null); - break; - } - } - } - } - - //DAMAGE - if (this.motionX * this.motionX + this.motionZ * this.motionZ > 2.500000277905201E-7D && this.rand.nextInt(5) == 0) - { - int i = MathHelper.floor_double(this.posX); - int j = MathHelper.floor_double(this.posY - 0.20000000298023224D - (double)this.yOffset); - int k = MathHelper.floor_double(this.posZ); - Block block = this.worldObj.getBlock(i, j, k); - - if (block.getMaterial() != Material.air) - { - this.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(block) + "_" + this.worldObj.getBlockMetadata(i, j, k), this.posX + ((double)this.rand.nextFloat() - 0.5D) * (double)this.width, this.boundingBox.minY + 0.1D, this.posZ + ((double)this.rand.nextFloat() - 0.5D) * (double)this.width, 4.0D * ((double)this.rand.nextFloat() - 0.5D), 0.5D, ((double)this.rand.nextFloat() - 0.5D) * 4.0D); - } - if(!worldObj.isRemote && ConfigArmour.cogworkGrief) - { - damageBlock(block, i, j, k, worldObj.getBlockMetadata(i, j, k)); - block = this.worldObj.getBlock(i, j+1, k); - damageSurface(block, i, j+1, k, worldObj.getBlockMetadata(i, j, k)); - } - } - } - else - { - motionX = motionZ = 0; - this.setMoveForward(0F); - this.setMoveStrafe(0F); - stepHeight = 0; - this.limbSwing = this.limbSwingAmount = this.prevLimbSwingAmount = 0; - this.rotationPitch = 20F; - this.rotationYawHead = this.rotationYaw; - this.prevRotationYawHead = this.prevRotationYaw; - this.swingProgress = this.swingProgressInt = 0; - } - if(jumpTimer > 0) - { - --jumpTimer; - } - onPortalTick(); - } - + public void onUpdate() { + super.onUpdate(); + if (noMoveTime > 0) { + moveForward = moveStrafing = 0; + --noMoveTime; + } + + float fuel = this.getFuel(); + float maxfuel = this.getMaxFuel(); + if (isPowered()) { + fuel -= getFuelDecay(); + } + fuel = MathHelper.clamp_float(fuel, 0F, maxfuel); + setFuel(fuel); + + /* + * if(isSprinting()) { if(riddenByEntity == null || this.getMoveForward() <= 0 + * || !isPowered()) { setSprinting(false); } } + */ + if (this.riddenByEntity != null) { + stepHeight = general_step_height; + updateRider(); + if (riddenByEntity.isBurning() && this.isFullyArmoured()) { + riddenByEntity.extinguish(); + } + + // ARROWS + if (riddenByEntity instanceof EntityLivingBase) { + int arrows = ((EntityLivingBase) riddenByEntity).getArrowCountInEntity(); + ((EntityLivingBase) riddenByEntity).setArrowCountInEntity(0); + int my_arrows = this.getArrowCountInEntity(); + this.setArrowCountInEntity(my_arrows + arrows); + + if (this.isFullyArmoured()) { + ((EntityLivingBase) riddenByEntity).setAir(300); + } + + if (ticksExisted % 20 == 0) { + for (int a = 0; a < 4; a++) { + if (!allowEquipment((EntityLivingBase) riddenByEntity)) { + riddenByEntity.mountEntity(null); + break; + } + } + } + } + + // DAMAGE + if (this.motionX * this.motionX + this.motionZ * this.motionZ > 2.500000277905201E-7D + && this.rand.nextInt(5) == 0) { + int i = MathHelper.floor_double(this.posX); + int j = MathHelper.floor_double(this.posY - 0.20000000298023224D - this.yOffset); + int k = MathHelper.floor_double(this.posZ); + Block block = this.worldObj.getBlock(i, j, k); + + if (block.getMaterial() != Material.air) { + this.worldObj.spawnParticle( + "blockcrack_" + Block.getIdFromBlock(block) + "_" + this.worldObj.getBlockMetadata(i, j, k), + this.posX + (this.rand.nextFloat() - 0.5D) * this.width, this.boundingBox.minY + 0.1D, + this.posZ + (this.rand.nextFloat() - 0.5D) * this.width, + 4.0D * (this.rand.nextFloat() - 0.5D), 0.5D, (this.rand.nextFloat() - 0.5D) * 4.0D); + } + if (!worldObj.isRemote && ConfigArmour.cogworkGrief) { + damageBlock(block, i, j, k, worldObj.getBlockMetadata(i, j, k)); + block = this.worldObj.getBlock(i, j + 1, k); + damageSurface(block, i, j + 1, k, worldObj.getBlockMetadata(i, j, k)); + } + } + } else { + motionX = motionZ = 0; + this.setMoveForward(0F); + this.setMoveStrafe(0F); + stepHeight = 0; + this.limbSwing = this.limbSwingAmount = this.prevLimbSwingAmount = 0; + this.rotationPitch = 20F; + this.rotationYawHead = this.rotationYaw; + this.prevRotationYawHead = this.prevRotationYaw; + this.swingProgress = this.swingProgressInt = 0; + } + if (jumpTimer > 0) { + --jumpTimer; + } + onPortalTick(); + } + /** * Modifier for actions and fuel decay (weight of the suit) */ - private float getFuelCost() - { + private float getFuelCost() { float mass = this.getWeight(); - return mass/200F; + return mass / 200F; } + /** * Rate of constant fuel droppage + * * @return */ - private float getFuelDecay() - { + private float getFuelDecay() { return getFuelCost() * (isSprinting() ? 3.0F : 1.0F); } - private void damageBlock(Block block, int x, int y, int z, int blockMetadata) - { - if(block == Blocks.grass || block == Blocks.farmland) - { + + private void damageBlock(Block block, int x, int y, int z, int blockMetadata) { + if (block == Blocks.grass || block == Blocks.farmland) { worldObj.setBlock(x, y, z, Blocks.dirt, 0, 2); } - if(block.getMaterial() == Material.glass) - { + if (block.getMaterial() == Material.glass) { worldObj.setBlockToAir(x, y, z); - this.worldObj.playSoundEffect(x+0.5D, y+0.5D, z+0.5D, "dig.glass", 1.0F, 0.9F+(rand.nextFloat() * 0.2F)); + this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.glass", 1.0F, + 0.9F + (rand.nextFloat() * 0.2F)); } - if(block == Blocks.ice) - { + if (block == Blocks.ice) { worldObj.setBlock(x, y, z, Blocks.water, 0, 2); - this.worldObj.playSoundEffect(x+0.5D, y+0.5D, z+0.5D, "dig.glass", 1.0F, 0.9F+(rand.nextFloat() * 0.2F)); + this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.glass", 1.0F, + 0.9F + (rand.nextFloat() * 0.2F)); } - if(block.getMaterial() == Material.leaves) - { + if (block.getMaterial() == Material.leaves) { worldObj.setBlock(x, y, z, Blocks.water, 0, 2); - this.worldObj.playSoundEffect(x+0.5D, y+0.5D, z+0.5D, "dig.grass", 1.0F, 0.9F+(rand.nextFloat() * 0.2F)); + this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.grass", 1.0F, + 0.9F + (rand.nextFloat() * 0.2F)); } } - private void damageSurface(Block block, int x, int y, int z, int blockMetadata) - { - if(block.getBlockHardness(worldObj, x, y, z) == 0 && (block.getMaterial() == Material.vine || block.getMaterial() == Material.plants)) - { + + private void damageSurface(Block block, int x, int y, int z, int blockMetadata) { + if (block.getBlockHardness(worldObj, x, y, z) == 0 + && (block.getMaterial() == Material.vine || block.getMaterial() == Material.plants)) { worldObj.setBlockToAir(x, y, z); - this.worldObj.playSoundEffect(x+0.5D, y+0.5D, z+0.5D, "dig.grass", 1.0F, 0.9F+(rand.nextFloat() * 0.2F)); + this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.grass", 1.0F, + 0.9F + (rand.nextFloat() * 0.2F)); } - if(block == Blocks.snow_layer) - { + if (block == Blocks.snow_layer) { worldObj.setBlockToAir(x, y, z); - this.worldObj.playSoundEffect(x+0.5D, y+0.5D, z+0.5D, "dig.cloth", 1.0F, 0.9F+(rand.nextFloat() * 0.2F)); + this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.cloth", 1.0F, + 0.9F + (rand.nextFloat() * 0.2F)); } } + @Override - public void knockBack(Entity hitter, float f, double d, double d1) - { - } - - public CustomMaterial getPlating() - { + public void knockBack(Entity hitter, float f, double d, double d1) { + } + + public CustomMaterial getPlating() { return CustomMaterial.getMaterial(getCustomMaterial()); } - public void updateRider() - { - if(!isPowered())return; - - if(worldObj.isRemote && riddenByEntity != null && riddenByEntity instanceof EntityPlayer) - { - float forward = ((EntityPlayer)riddenByEntity).moveForward; - float strafe = ((EntityPlayer)riddenByEntity).moveStrafing; - - if(riddenByEntity instanceof EntityClientPlayerMP) - { + + public void updateRider() { + if (!isPowered()) + return; + + if (worldObj.isRemote && riddenByEntity != null && riddenByEntity instanceof EntityPlayer) { + float forward = ((EntityPlayer) riddenByEntity).moveForward; + float strafe = ((EntityPlayer) riddenByEntity).moveStrafing; + + if (riddenByEntity instanceof EntityClientPlayerMP) { boolean jump = ClientProxyMF.isUserJumpCommand(riddenByEntity); - if(jump != jumpControl || forward != forwardControl || strafe != strafeControl) - { + if (jump != jumpControl || forward != forwardControl || strafe != strafeControl) { this.forwardControl = forward; this.strafeControl = strafe; this.jumpControl = jump; - - ((EntityClientPlayerMP)riddenByEntity).sendQueue.addToSendQueue(new CogworkControlPacket(this).generatePacket()); + + ((EntityClientPlayerMP) riddenByEntity).sendQueue + .addToSendQueue(new CogworkControlPacket(this).generatePacket()); } } } - if(ticksExisted % 100 == 0) - { - if(rand.nextInt(20) == 0) - { + if (ticksExisted % 100 == 0) { + if (rand.nextInt(20) == 0) { this.playSound("minefantasy2:entity.cogwork.toot", 0.5F, 1.0F); } - this.playSound("minefantasy2:entity.cogwork.idle", 0.5F, 0.75F + rand.nextFloat()*0.5F); + this.playSound("minefantasy2:entity.cogwork.idle", 0.5F, 0.75F + rand.nextFloat() * 0.5F); } - - if (!worldObj.isRemote) - { - if(this.jumpControl && jumpTimer == 0) - { + + if (!worldObj.isRemote) { + if (this.jumpControl && jumpTimer == 0) { this.jumpTimer = 10; } - if (!this.isInWater() && !this.handleLavaMovement()) - { - if (this.onGround && jumpTimer == 8) - { - this.jump(); - } - } - } - } - protected void jump() - { + if (!this.isInWater() && !this.handleLavaMovement()) { + if (this.onGround && jumpTimer == 8) { + this.jump(); + } + } + } + } + + protected void jump() { spendFuel(5F); worldObj.playSoundEffect(posX, posY, posZ, "tile.piston.out", 2.0F, 1.0F); - this.motionY = 0.41999998688697815D; - if (this.isSprinting()) - { - float f = this.rotationYaw * 0.017453292F; - this.motionX -= (double)(MathHelper.sin(f) * 0.2F); - this.motionZ += (double)(MathHelper.cos(f) * 0.2F); - } - this.isAirBorne = true; - ForgeHooks.onLivingJump(this); - } - - private void spendFuel(float cost) - { - this.setFuel(Math.max(0F, getFuel() - cost*getFuelCost()) ); + this.motionY = 0.41999998688697815D; + if (this.isSprinting()) { + float f = this.rotationYaw * 0.017453292F; + this.motionX -= MathHelper.sin(f) * 0.2F; + this.motionZ += MathHelper.cos(f) * 0.2F; + } + this.isAirBorne = true; + ForgeHooks.onLivingJump(this); + } + + private void spendFuel(float cost) { + this.setFuel(Math.max(0F, getFuel() - cost * getFuelCost())); } + @Override - public boolean isSprinting() - { - return isPowered() && forwardControl > 0 && riddenByEntity != null && riddenByEntity.isSprinting(); - } + public boolean isSprinting() { + return isPowered() && forwardControl > 0 && riddenByEntity != null && riddenByEntity.isSprinting(); + } + private float forwardControl, strafeControl; private boolean jumpControl; private int jumpTimer = 0; - - public void setMoveForward(float f) - { + + public void setMoveForward(float f) { forwardControl = f; } - public float getMoveForward() - { + + public float getMoveForward() { return forwardControl; } - public void setMoveStrafe(float f) - { + + public void setMoveStrafe(float f) { strafeControl = f; } - public float getMoveStrafe() - { + + public float getMoveStrafe() { return strafeControl; } - public void setJumpControl(boolean b) - { - this.jumpControl = b;; + + public void setJumpControl(boolean b) { + this.jumpControl = b; + ; } - public boolean getJumpControl() - { + + public boolean getJumpControl() { return jumpControl; } - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25F); - } - + + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25F); + } + @Override - public boolean shouldRiderFaceForward(EntityPlayer player) - { - return true; - } - + public boolean shouldRiderFaceForward(EntityPlayer player) { + return true; + } + @Override - public boolean shouldRiderSit() - { + public boolean shouldRiderSit() { return false; } - + @Override - public double getMountedYOffset() - { + public double getMountedYOffset() { return 0.8625D; } + @Override - public boolean canBeCollidedWith() - { - return riddenByEntity == null && super.canBeCollidedWith(); - } - + public boolean canBeCollidedWith() { + return riddenByEntity == null && super.canBeCollidedWith(); + } + @Override - public boolean canBePushed() - { - return false; - } + public boolean canBePushed() { + return false; + } + public static int maxBolts = 16; + @Override - public boolean interactFirst(EntityPlayer user) - { - if(user.isSwingInProgress) - { + public boolean interactFirst(EntityPlayer user) { + if (user.isSwingInProgress) { return false; } - + ItemStack item = user.getHeldItem(); - if(item != null) - { + if (item != null) { float fuel_item = PowerArmour.getFuelValue(item); - if(fuel_item > 0) - { + if (fuel_item > 0) { float fuel = getFuel(); float max = getMaxFuel(); - if(fuel < max) - { + if (fuel < max) { fuel += Math.max(0F, fuel_item * ConfigArmour.cogworkFuelUnits); - if(fuel > max) - { + if (fuel > max) { fuel = max; } setFuel(fuel); - - if(!user.capabilities.isCreativeMode) - { + + if (!user.capabilities.isCreativeMode) { --item.stackSize; - + ItemStack container = item.getItem().getContainerItem(item); - if(container != null) - { - if(item.stackSize >= 1) - { - if(!user.inventory.addItemStackToInventory(container)) - { + if (container != null) { + if (item.stackSize >= 1) { + if (!user.inventory.addItemStackToInventory(container)) { user.entityDropItem(container, 0F); } } } - if(item.stackSize <= 0) - { + if (item.stackSize <= 0) { user.setCurrentItemOrArmor(0, container); } } } return true; } - if(this.riddenByEntity != null) - { + if (this.riddenByEntity != null) { return false; } - if(this.isUnderRepairFrame()) - { - if(getPlating() == null && item.getItem() == ComponentListMF.cogwork_armour) - { + if (this.isUnderRepairFrame()) { + if (getPlating() == null && item.getItem() == ComponentListMF.cogwork_armour) { CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if(material != null) - { + if (material != null) { this.playSound("mob.horse.armor", 1.0F, 1.0F); int boltCount = this.getBolts(); - if(boltCount < maxBolts) - { - if(!user.isSwingInProgress && user.capabilities.isCreativeMode || user.inventory.consumeInventoryItem(ComponentListMF.bolt)) - { + if (boltCount < maxBolts) { + if (!user.isSwingInProgress && user.capabilities.isCreativeMode + || user.inventory.consumeInventoryItem(ComponentListMF.bolt)) { ++boltCount; setBolts(boltCount); } @@ -482,13 +434,11 @@ public boolean interactFirst(EntityPlayer user) return true; } this.setCustomMaterial(material.name); - float damagePercent = 1F - ((float)item.getItemDamage() / (float)item.getMaxDamage()); + float damagePercent = 1F - ((float) item.getItemDamage() / (float) item.getMaxDamage()); this.setHealth(getMaxHealth() * damagePercent); - if(!user.capabilities.isCreativeMode) - { + if (!user.capabilities.isCreativeMode) { --item.stackSize; - if(item.stackSize <= 0) - { + if (item.stackSize <= 0) { user.setCurrentItemOrArmor(0, null); } } @@ -496,46 +446,37 @@ public boolean interactFirst(EntityPlayer user) return true; } } - if(this.getPlating() != null && ToolHelper.getCrafterTool(item).equalsIgnoreCase("spanner")) - { + if (this.getPlating() != null && ToolHelper.getCrafterTool(item).equalsIgnoreCase("spanner")) { this.playSound("mob.horse.armor", 1.2F, 1.0F); user.swingItem(); int boltCount = this.getBolts(); - if(boltCount > 0) - { - if(!worldObj.isRemote) - { + if (boltCount > 0) { + if (!worldObj.isRemote) { ItemStack bolt = new ItemStack(ComponentListMF.bolt, boltCount); - if(!user.capabilities.isCreativeMode && !user.inventory.addItemStackToInventory(bolt)) - { + if (!user.capabilities.isCreativeMode && !user.inventory.addItemStackToInventory(bolt)) { this.entityDropItem(bolt, 0.0F); } } setBolts(0); } float damagePercent = 1F - (getHealth() / getMaxHealth()); - if(!worldObj.isRemote) - { - ItemStack armour = ComponentListMF.cogwork_armour.createComm(getPlating().name, 1, damagePercent); - if(!user.capabilities.isCreativeMode && !user.inventory.addItemStackToInventory(armour)) - { + if (!worldObj.isRemote) { + ItemStack armour = ComponentListMF.cogwork_armour.createComm(getPlating().name, 1, + damagePercent); + if (!user.capabilities.isCreativeMode && !user.inventory.addItemStackToInventory(armour)) { this.entityDropItem(armour, 0.0F); } } - this.playSound("mob.irongolem.hit", 1.0F, 1.0F); + this.playSound("mob.irongolem.hit", 1.0F, 1.0F); this.setCustomMaterial(""); return true; } } } - if(user.ridingEntity == null) - { - if(!this.allowEquipment(user)) - { + if (user.ridingEntity == null) { + if (!this.allowEquipment(user)) { return true; - } - else - { + } else { this.noMoveTime = 20; user.moveForward = user.moveStrafing = 0F; user.mountEntity(this); @@ -544,616 +485,537 @@ public boolean interactFirst(EntityPlayer user) } } return false; - } - + } + private float getMaxFuel() { return base_fuel_minutes * 1200F; } + public static int allowedBulk = 1; - private boolean allowEquipment(EntityLivingBase user) - { - if(allowedBulk >= 2) - { - return true;//Any Armour + + private boolean allowEquipment(EntityLivingBase user) { + if (allowedBulk >= 2) { + return true;// Any Armour } - + float bulk = ArmourCalculator.getEquipmentBulk(user); - if(allowedBulk >= 0) - { - if(bulk > allowedBulk) - { - if(user instanceof EntityPlayer && worldObj.isRemote) - { - ((EntityPlayer)user).addChatComponentMessage(new ChatComponentTranslation("vehicle.tooBigArmour")); + if (allowedBulk >= 0) { + if (bulk > allowedBulk) { + if (user instanceof EntityPlayer && worldObj.isRemote) { + ((EntityPlayer) user).addChatComponentMessage(new ChatComponentTranslation("vehicle.tooBigArmour")); } return false; } return true; } - for(int a = 0; a < 4; a ++) - { - if(user.getEquipmentInSlot(a+1) != null) - { - if(user instanceof EntityPlayer && worldObj.isRemote) - { - ((EntityPlayer)user).addChatComponentMessage(new ChatComponentTranslation("vehicle.noArmour")); + for (int a = 0; a < 4; a++) { + if (user.getEquipmentInSlot(a + 1) != null) { + if (user instanceof EntityPlayer && worldObj.isRemote) { + ((EntityPlayer) user).addChatComponentMessage(new ChatComponentTranslation("vehicle.noArmour")); } return false; } } return true; } + @Override - protected boolean isMovementBlocked() - { - return true; - } - + protected boolean isMovementBlocked() { + return true; + } + @Override - public boolean isPowered() - { + public boolean isPowered() { return noMoveTime == 0 && getFuel() > 0 && riddenByEntity != null; } + @Override - public void moveEntityWithHeading(float strafe, float forward) - { - if (isPowered() && this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase) - { - EntityLivingBase user = (EntityLivingBase)riddenByEntity; - - this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw; - this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F; - this.setRotation(this.rotationYaw, this.rotationPitch); - this.rotationYawHead = this.renderYawOffset = this.rotationYaw; - strafe = MathHelper.clamp_float(this.getMoveStrafe(), -1F, 1F) * 0.5F; - forward = MathHelper.clamp_float(this.getMoveForward(), -1F, 1F) * 0.5F; - - if (forward <= 0.0F) - { - forward *= 0.5F;//Backstep slower - } - - if (!this.worldObj.isRemote) - { - this.setAIMoveSpeed((float)this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue()); - moveCogwork(strafe, forward); - } - - user.prevLimbSwingAmount = user.limbSwingAmount; - double d1 = this.posX - this.prevPosX; - double d0 = this.posZ - this.prevPosZ; - float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F; - - if (f4 > 1.0F) - { - f4 = 1.0F; - } - - user.limbSwingAmount += (f4 - user.limbSwingAmount) * 0.4F; - user.limbSwing += user.limbSwingAmount; - } - else - { - super.moveEntityWithHeading(strafe, forward); - } - } - - private float getSpeedModifier() - { + public void moveEntityWithHeading(float strafe, float forward) { + if (isPowered() && this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase) { + EntityLivingBase user = (EntityLivingBase) riddenByEntity; + + this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw; + this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F; + this.setRotation(this.rotationYaw, this.rotationPitch); + this.rotationYawHead = this.renderYawOffset = this.rotationYaw; + strafe = MathHelper.clamp_float(this.getMoveStrafe(), -1F, 1F) * 0.5F; + forward = MathHelper.clamp_float(this.getMoveForward(), -1F, 1F) * 0.5F; + + if (forward <= 0.0F) { + forward *= 0.5F;// Backstep slower + } + + if (!this.worldObj.isRemote) { + this.setAIMoveSpeed( + (float) this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue()); + moveCogwork(strafe, forward); + } + + user.prevLimbSwingAmount = user.limbSwingAmount; + double d1 = this.posX - this.prevPosX; + double d0 = this.posZ - this.prevPosZ; + float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F; + + if (f4 > 1.0F) { + f4 = 1.0F; + } + + user.limbSwingAmount += (f4 - user.limbSwingAmount) * 0.4F; + user.limbSwing += user.limbSwingAmount; + } else { + super.moveEntityWithHeading(strafe, forward); + } + } + + private float getSpeedModifier() { return isSprinting() ? 2.0F : 1.0F; } - public void moveCogwork(float p_70612_1_, float p_70612_2_) - { - double d0; - - if (this.isInWater() || this.handleLavaMovement()) - { - d0 = this.posY; - this.motionY -= 0.03D; - - if (this.isCollidedHorizontally && this.isOffsetPositionInLiquid(this.motionX, this.motionY + 0.6000000238418579D - this.posY + d0, this.motionZ)) - { - this.motionY = 0.30000001192092896D; - } - } - { - float f2 = 0.91F; - - if (this.onGround) - { - f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; - } - - float f3 = 0.16277136F / (f2 * f2 * f2); - float f4; - - if (this.onGround) - { - f4 = this.getAIMoveSpeed() * f3; - } - else - { - f4 = this.jumpMovementFactor; - } - if(riddenByEntity == null) - { - f4 = 0F; - } - if(isSprinting()) - { - f4 *= 2.0F; - } - - this.moveFlying(p_70612_1_, p_70612_2_, f4); - f2 = 0.91F; - - if (this.onGround) - { - f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; - } - - if (this.isOnLadder()) - { - float f5 = 0.15F; - - if (this.motionX < (double)(-f5)) - { - this.motionX = (double)(-f5); - } - - if (this.motionX > (double)f5) - { - this.motionX = (double)f5; - } - - if (this.motionZ < (double)(-f5)) - { - this.motionZ = (double)(-f5); - } - - if (this.motionZ > (double)f5) - { - this.motionZ = (double)f5; - } - - this.fallDistance = 0.0F; - - if (this.motionY < -0.15D) - { - this.motionY = -0.15D; - } - } - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - - if (this.isCollidedHorizontally && this.isOnLadder()) - { - this.motionY = 0.2D; - } - - if (this.worldObj.isRemote && (!this.worldObj.blockExists((int)this.posX, 0, (int)this.posZ) || !this.worldObj.getChunkFromBlockCoords((int)this.posX, (int)this.posZ).isChunkLoaded)) - { - if (this.posY > 0.0D) - { - this.motionY = -0.1D; - } - else - { - this.motionY = 0.0D; - } - } - else - { - this.motionY -= 0.08D; - } - - this.motionY *= 0.9800000190734863D; - this.motionX *= (double)f2; - this.motionZ *= (double)f2; - } - - this.prevLimbSwingAmount = this.limbSwingAmount; - d0 = this.posX - this.prevPosX; - double d1 = this.posZ - this.prevPosZ; - float f6 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F; - - if (f6 > 1.0F) - { - f6 = 1.0F; - } - - this.limbSwingAmount += (f6 - this.limbSwingAmount) * 0.4F; - this.limbSwing += this.limbSwingAmount; - } - + + public void moveCogwork(float p_70612_1_, float p_70612_2_) { + double d0; + + if (this.isInWater() || this.handleLavaMovement()) { + d0 = this.posY; + this.motionY -= 0.03D; + + if (this.isCollidedHorizontally && this.isOffsetPositionInLiquid(this.motionX, + this.motionY + 0.6000000238418579D - this.posY + d0, this.motionZ)) { + this.motionY = 0.30000001192092896D; + } + } + { + float f2 = 0.91F; + + if (this.onGround) { + f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), + MathHelper.floor_double(this.boundingBox.minY) - 1, + MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; + } + + float f3 = 0.16277136F / (f2 * f2 * f2); + float f4; + + if (this.onGround) { + f4 = this.getAIMoveSpeed() * f3; + } else { + f4 = this.jumpMovementFactor; + } + if (riddenByEntity == null) { + f4 = 0F; + } + if (isSprinting()) { + f4 *= 2.0F; + } + + this.moveFlying(p_70612_1_, p_70612_2_, f4); + f2 = 0.91F; + + if (this.onGround) { + f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), + MathHelper.floor_double(this.boundingBox.minY) - 1, + MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; + } + + if (this.isOnLadder()) { + float f5 = 0.15F; + + if (this.motionX < (-f5)) { + this.motionX = (-f5); + } + + if (this.motionX > f5) { + this.motionX = f5; + } + + if (this.motionZ < (-f5)) { + this.motionZ = (-f5); + } + + if (this.motionZ > f5) { + this.motionZ = f5; + } + + this.fallDistance = 0.0F; + + if (this.motionY < -0.15D) { + this.motionY = -0.15D; + } + } + + this.moveEntity(this.motionX, this.motionY, this.motionZ); + + if (this.isCollidedHorizontally && this.isOnLadder()) { + this.motionY = 0.2D; + } + + if (this.worldObj.isRemote && (!this.worldObj.blockExists((int) this.posX, 0, (int) this.posZ) + || !this.worldObj.getChunkFromBlockCoords((int) this.posX, (int) this.posZ).isChunkLoaded)) { + if (this.posY > 0.0D) { + this.motionY = -0.1D; + } else { + this.motionY = 0.0D; + } + } else { + this.motionY -= 0.08D; + } + + this.motionY *= 0.9800000190734863D; + this.motionX *= f2; + this.motionZ *= f2; + } + + this.prevLimbSwingAmount = this.limbSwingAmount; + d0 = this.posX - this.prevPosX; + double d1 = this.posZ - this.prevPosZ; + float f6 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F; + + if (f6 > 1.0F) { + f6 = 1.0F; + } + + this.limbSwingAmount += (f6 - this.limbSwingAmount) * 0.4F; + this.limbSwing += this.limbSwingAmount; + } + @Override - public void writeEntityToNBT(NBTTagCompound nbt) - { - super.writeEntityToNBT(nbt); - nbt.setString("Plating", this.getCustomMaterial()); - nbt.setFloat("Fuel", getFuel()); - nbt.setInteger("Bolts", getBolts()); - } + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setString("Plating", this.getCustomMaterial()); + nbt.setFloat("Fuel", getFuel()); + nbt.setInteger("Bolts", getBolts()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + if (nbt.hasKey("Plating", 8) && nbt.getString("Plating").length() > 0) { + this.setCustomMaterial(nbt.getString("Plating")); + } + this.setFuel(nbt.getFloat("Fuel")); + setBolts(nbt.getInteger("Bolts")); + } + @Override - public void readEntityFromNBT(NBTTagCompound nbt) - { - super.readEntityFromNBT(nbt); - if (nbt.hasKey("Plating", 8) && nbt.getString("Plating").length() > 0) - { - this.setCustomMaterial(nbt.getString("Plating")); - } - this.setFuel(nbt.getFloat("Fuel")); - setBolts(nbt.getInteger("Bolts")); - } - + public boolean canBreatheUnderwater() { + return true; + } + + /** + * Returns the sound this mob makes on death. + */ @Override - public boolean canBreatheUnderwater() - { - return true; - } - - /** - * Returns the sound this mob makes on death. - */ + protected String getDeathSound() { + return "mob.irongolem.death"; + } + @Override - protected String getDeathSound() - { - return "mob.irongolem.death"; - } - + protected String getHurtSound() { + return "mob.irongolem.hurt"; + } + + private boolean alternateStep; + @Override - protected String getHurtSound() - { - return "mob.irongolem.hurt"; - } - - private boolean alternateStep; - @Override - protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) - { - String s = alternateStep ? "in" : "out"; - alternateStep = !alternateStep; - this.playSound("tile.piston."+s, 0.25F, 1.0F); - this.playSound("mob.irongolem.walk", 1.0F, 1.0F); - } - + protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) { + String s = alternateStep ? "in" : "out"; + alternateStep = !alternateStep; + this.playSound("tile.piston." + s, 0.25F, 1.0F); + this.playSound("mob.irongolem.walk", 1.0F, 1.0F); + } + @Override - protected void updatePotionEffects() - { - } - + protected void updatePotionEffects() { + } + @Override - public void addPotionEffect(PotionEffect effect) - { - } - + public void addPotionEffect(PotionEffect effect) { + } + @Override - public boolean isPotionApplicable(PotionEffect effect) - { + public boolean isPotionApplicable(PotionEffect effect) { return false; - } - + } + @Override @SideOnly(Side.CLIENT) - public void performHurtAnimation() - { - } - + public void performHurtAnimation() { + } + @Override - public float getAIMoveSpeed() - { + public float getAIMoveSpeed() { return riddenByEntity == null ? 1F : super.getAIMoveSpeed(); } + @Override public boolean isFullyArmoured() { return getPlating() != null; } + @Override - public boolean attackEntityFrom(DamageSource source, float damage) - { + public boolean attackEntityFrom(DamageSource source, float damage) { return attackEntityFrom(source, damage, true); } + /** * Modified attackEntityFrom - * @param shouldPass is used to determine if the wearer should take the hit + * + * @param shouldPass + * is used to determine if the wearer should take the hit */ - public boolean attackEntityFrom(DamageSource source, float damage, boolean shouldPass) - { - if(shouldPass && this.riddenByEntity != null) - { + public boolean attackEntityFrom(DamageSource source, float damage, boolean shouldPass) { + if (shouldPass && this.riddenByEntity != null) { return this.riddenByEntity.attackEntityFrom(source, damage); } - - if(source.isExplosion()) - { + + if (source.isExplosion()) { this.noMoveTime = 20; damage *= 1.5F; } return super.attackEntityFrom(source, modifyDamage(this, damage, source)); } - public boolean shouldBlockPoisonOrMagic() - { + + public boolean shouldBlockPoisonOrMagic() { return getPlating() != null; } + @Override - public float modifyDamage(EntityLivingBase user, float damage, DamageSource src) - { - if(src.getDamageType().equalsIgnoreCase("humanstomp")) - { + public float modifyDamage(EntityLivingBase user, float damage, DamageSource src) { + if (src.getDamageType().equalsIgnoreCase("humanstomp")) { return 0F; } - if(src == DamageSource.wither || src.isMagicDamage()) - { + if (src == DamageSource.wither || src.isMagicDamage()) { return shouldBlockPoisonOrMagic() ? 0F : damage; } - - if(user != this) - { + + if (user != this) { this.attackEntityFrom(src, damage, false); } - + float AC = 2.0F; float fResist = 0.0F; CustomMaterial plating = getPlating(); - if(plating != null) - { + if (plating != null) { AC = plating.hardness * ArmourDesign.COGWORK.getRating() * rating_modifier; fResist = plating.getFireResistance() / 100F; } - - if(src.isFireDamage()) - { - if(user == this) - { - return damage * MathHelper.clamp_float(1F-fResist, 0F, 1F); - } - else if(isFullyArmoured()) - { - return 0F;//All or nothing depends on if armour is full + + if (src.isFireDamage()) { + if (user == this) { + return damage * MathHelper.clamp_float(1F - fResist, 0F, 1F); + } else if (isFullyArmoured()) { + return 0F;// All or nothing depends on if armour is full } } - if(user == this) - { + if (user == this) { return damage; } - - if(src.isUnblockable() && !isFullyArmoured()) - { + + if (src.isUnblockable() && !isFullyArmoured()) { return damage; } - return damage * 1F/AC; + return damage * 1F / AC; } - + @Override - public void setFire(int i) - { + public void setFire(int i) { } - + @Override - protected void damageEntity(DamageSource source, float dam) - { + protected void damageEntity(DamageSource source, float dam) { CustomMaterial plating = this.getPlating(); - boolean canDestroy = false;//Only spanner or fire can destroy frames + boolean canDestroy = false;// Only spanner or fire can destroy frames boolean isFrame = plating == null; - - if(source.getSourceOfDamage() != null && source.getSourceOfDamage() instanceof EntityLivingBase) - { - canDestroy = ToolHelper.getCrafterTool(((EntityLivingBase)source.getSourceOfDamage()).getHeldItem()).equalsIgnoreCase("spanner"); - } - if(source.isFireDamage() || source.canHarmInCreative()) - { - canDestroy = true; - } - - - if(isFrame) - { - if(canDestroy && riddenByEntity == null) - { - setHealth(0); - } - else - { - setHealth(getMaxHealth()); - } - return; - } - else if (dam != 0.0F) - { - if(plating != null) - { - float HP = plating.durability * ArmourDesign.COGWORK.getDurability() * 20F * health_modifier; - dam *= (this.getMaxHealth() / HP); - } - dam = this.applyPotionDamageCalculations(source, dam); - - - float hp = this.getHealth() - dam; - if(hp <= 1.0F) - { - hp = getMaxHealth(); - destroyArmour(); - } - this.setHealth(hp); - - if(!source.isFireDamage()) - { - this.playSound("mob.irongolem.hit", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); - } - } - } - - private void destroyArmour() - { + + if (source.getSourceOfDamage() != null && source.getSourceOfDamage() instanceof EntityLivingBase) { + canDestroy = ToolHelper.getCrafterTool(((EntityLivingBase) source.getSourceOfDamage()).getHeldItem()) + .equalsIgnoreCase("spanner"); + } + if (source.isFireDamage() || source.canHarmInCreative()) { + canDestroy = true; + } + + if (isFrame) { + if (canDestroy && riddenByEntity == null) { + setHealth(0); + } else { + setHealth(getMaxHealth()); + } + return; + } else if (dam != 0.0F) { + if (plating != null) { + float HP = plating.durability * ArmourDesign.COGWORK.getDurability() * 20F * health_modifier; + dam *= (this.getMaxHealth() / HP); + } + dam = this.applyPotionDamageCalculations(source, dam); + + float hp = this.getHealth() - dam; + if (hp <= 1.0F) { + hp = getMaxHealth(); + destroyArmour(); + } + this.setHealth(hp); + + if (!source.isFireDamage()) { + this.playSound("mob.irongolem.hit", 1.0F, + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + } + } + } + + private void destroyArmour() { this.setCustomMaterial(""); } + @Override - public void heal(float amount) - { - } + public void heal(float amount) { + } + @SideOnly(Side.CLIENT) - public int getMetreScaled(int i) - { - return (int)((float)i / getMaxFuel() * getFuel()); + public int getMetreScaled(int i) { + return (int) (i / getMaxFuel() * getFuel()); } - + @Override - protected void fall(float distance) - { - if(distance > 2) - { - float power = Math.min(distance/2F, 3F); + protected void fall(float distance) { + if (distance > 2) { + float power = Math.min(distance / 2F, 3F); initImpactLanding(posX, posY, posZ, power / 2F, ConfigArmour.cogworkGrief); } - } - - public Shockwave initImpactLanding(double x, double y, double z, float power, boolean grief) - { + } + + public Shockwave initImpactLanding(double x, double y, double z, float power, boolean grief) { noMoveTime = 10; - return newShockwave(x, y, z, power, false, grief); - } - + return newShockwave(x, y, z, power, false, grief); + } + @Override - protected void collideWithEntity(Entity hit) - { + protected void collideWithEntity(Entity hit) { super.collideWithEntity(hit); - if(!isSprinting() || !isPowered() || hit == riddenByEntity) - { + if (!isSprinting() || !isPowered() || hit == riddenByEntity) { return; } this.playSound(this.getHurtSound(), this.getSoundVolume(), this.getSoundPitch()); - float modifier = width*width*height / hit.width*hit.width*hit.height;//compare volume - float force = (float)Math.hypot(motionX, motionZ) * modifier; - TacticalManager.knockbackEntity(hit, this, force, force/4F); - hit.attackEntityFrom(DamageSource.causeMobDamage( (riddenByEntity != null && riddenByEntity instanceof EntityLivingBase) ? (EntityLivingBase)riddenByEntity : this), force); - } - - /** - * returns a new explosion. Does initiation (at time of writing Explosion is not finished) - */ - public Shockwave newShockwave(double x, double y, double z, float power, boolean fire, boolean grief) - { - Shockwave explosion = new Shockwave("humanstomp", worldObj, this.riddenByEntity != null ? this.riddenByEntity : this, x, y, z, power); - explosion.isFlaming = fire; - explosion.isGriefing = grief; - explosion.isSmoking = grief; - explosion.initiate(); - explosion.decorateWave(true); - return explosion; - } - - @Override - protected void dropFewItems(boolean pkill, int looting) - { + float modifier = width * width * height / hit.width * hit.width * hit.height;// compare volume + float force = (float) Math.hypot(motionX, motionZ) * modifier; + TacticalManager.knockbackEntity(hit, this, force, force / 4F); + hit.attackEntityFrom( + DamageSource.causeMobDamage((riddenByEntity != null && riddenByEntity instanceof EntityLivingBase) + ? (EntityLivingBase) riddenByEntity + : this), + force); + } + + /** + * returns a new explosion. Does initiation (at time of writing Explosion is not + * finished) + */ + public Shockwave newShockwave(double x, double y, double z, float power, boolean fire, boolean grief) { + Shockwave explosion = new Shockwave("humanstomp", worldObj, + this.riddenByEntity != null ? this.riddenByEntity : this, x, y, z, power); + explosion.isFlaming = fire; + explosion.isGriefing = grief; + explosion.isSmoking = grief; + explosion.initiate(); + explosion.decorateWave(true); + return explosion; + } + + @Override + protected void dropFewItems(boolean pkill, int looting) { this.dropItem(Item.getItemFromBlock(BlockListMF.cogwork_helm), 1); this.dropItem(Item.getItemFromBlock(BlockListMF.cogwork_chest), 1); this.dropItem(Item.getItemFromBlock(BlockListMF.cogwork_legs), 1); - - } - @SideOnly(Side.CLIENT) - public int getArmourRating() - { - return getArmourRating(getPlating()); - } - public static float rating_modifier = 1.0F; - public static float health_modifier = 1.0F; - @SideOnly(Side.CLIENT) - public static int getArmourRating(CustomMaterial base) - { - if(base != null) - { - float ratio = base.hardness * ArmourDesign.COGWORK.getRating() * rating_modifier; - return (int)(ratio * ArmourCalculator.armourRatingScale); + + } + + @SideOnly(Side.CLIENT) + public int getArmourRating() { + return getArmourRating(getPlating()); + } + + public static float rating_modifier = 1.0F; + public static float health_modifier = 1.0F; + + @SideOnly(Side.CLIENT) + public static int getArmourRating(CustomMaterial base) { + if (base != null) { + float ratio = base.hardness * ArmourDesign.COGWORK.getRating() * rating_modifier; + return (int) (ratio * ArmourCalculator.armourRatingScale); } return 0; } - private static final float base_frame_weight = 100F; - public static final float base_armour_units = 30F; - - public float getWeight() - { - float weight = base_frame_weight;//Weight of frame - CustomMaterial plating = getPlating(); - if(plating != null) - { - weight += plating.density * base_armour_units; - } + + private static final float base_frame_weight = 100F; + public static final float base_armour_units = 30F; + + public float getWeight() { + float weight = base_frame_weight;// Weight of frame + CustomMaterial plating = getPlating(); + if (plating != null) { + weight += plating.density * base_armour_units; + } return weight; } - public boolean isUnderRepairFrame() - { + + public boolean isUnderRepairFrame() { int i = MathHelper.floor_double(this.posX); - int j = MathHelper.floor_double(this.posY +3); - int k = MathHelper.floor_double(this.posZ); - + int j = MathHelper.floor_double(this.posY + 3); + int k = MathHelper.floor_double(this.posZ); + return PowerArmour.isStationBlock(worldObj, i, j, k); } - - private void onPortalTick() - { - if (!this.worldObj.isRemote && this.worldObj instanceof WorldServer) - { - this.worldObj.theProfiler.startSection("portal"); - MinecraftServer minecraftserver = ((WorldServer)this.worldObj).func_73046_m(); - int i = this.getMaxInPortalTime(); - - if (this.inPortal) - { - if (minecraftserver.getAllowNether()) - { - if (this.ridingEntity == null && this.portalCounter++ >= i) - { - this.portalCounter = i; - this.timeUntilPortal = this.getPortalCooldown(); - byte b0; - - if (this.worldObj.provider.dimensionId == -1) - { - b0 = 0; - } - else - { - b0 = -1; - } - this.travelToDimension(b0); - } - - this.inPortal = false; - } - } - else - { - if (this.portalCounter > 0) - { - this.portalCounter -= 4; - } - - if (this.portalCounter < 0) - { - this.portalCounter = 0; - } - } - - if (this.timeUntilPortal > 0) - { - --this.timeUntilPortal; - } - - this.worldObj.theProfiler.endSection(); - } + + private void onPortalTick() { + if (!this.worldObj.isRemote && this.worldObj instanceof WorldServer) { + this.worldObj.theProfiler.startSection("portal"); + MinecraftServer minecraftserver = ((WorldServer) this.worldObj).func_73046_m(); + int i = this.getMaxInPortalTime(); + + if (this.inPortal) { + if (minecraftserver.getAllowNether()) { + if (this.ridingEntity == null && this.portalCounter++ >= i) { + this.portalCounter = i; + this.timeUntilPortal = this.getPortalCooldown(); + byte b0; + + if (this.worldObj.provider.dimensionId == -1) { + b0 = 0; + } else { + b0 = -1; + } + this.travelToDimension(b0); + } + + this.inPortal = false; + } + } else { + if (this.portalCounter > 0) { + this.portalCounter -= 4; + } + + if (this.portalCounter < 0) { + this.portalCounter = 0; + } + } + + if (this.timeUntilPortal > 0) { + --this.timeUntilPortal; + } + + this.worldObj.theProfiler.endSection(); + } } + @Override - public void travelToDimension(int id) - { - if(this.riddenByEntity != null) - { - riddenByEntity.travelToDimension(id); - } + public void travelToDimension(int id) { + if (this.riddenByEntity != null) { + riddenByEntity.travelToDimension(id); + } super.travelToDimension(id); - } + } + @Override - public boolean isArmoured(String piece) - { + public boolean isArmoured(String piece) { return isFullyArmoured(); } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityDamageSourceBomb.java b/src/main/java/minefantasy/mf2/entity/EntityDamageSourceBomb.java index c6c2c95b..4b335cf2 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityDamageSourceBomb.java +++ b/src/main/java/minefantasy/mf2/entity/EntityDamageSourceBomb.java @@ -3,13 +3,11 @@ import net.minecraft.entity.Entity; import net.minecraft.util.EntityDamageSourceIndirect; -public class EntityDamageSourceBomb extends EntityDamageSourceIndirect -{ - private Entity thrower; +public class EntityDamageSourceBomb extends EntityDamageSourceIndirect { + private Entity thrower; - public EntityDamageSourceBomb(Entity bomb, Entity user) - { - super("bomb", bomb, user); - thrower = user; - } + public EntityDamageSourceBomb(Entity bomb, Entity user) { + super("bomb", bomb, user); + thrower = user; + } } diff --git a/src/main/java/minefantasy/mf2/entity/EntityDragonBreath.java b/src/main/java/minefantasy/mf2/entity/EntityDragonBreath.java index c7c564f6..ddba9074 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityDragonBreath.java +++ b/src/main/java/minefantasy/mf2/entity/EntityDragonBreath.java @@ -3,223 +3,194 @@ import java.util.Random; import minefantasy.mf2.entity.mob.DragonBreath; -import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityFireball; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -public class EntityDragonBreath extends EntityFireball -{ - private static final float size =0.75F; - public Random rand = new Random(); - - public EntityDragonBreath(World world) - { - super(world); - this.setSize(size, size); - } - - public EntityDragonBreath(World world, EntityLivingBase shooter, double xVelocity, double yVelocity, double zVelocity, float spread) - { - this(world); - this.shootingEntity = shooter; - this.setSize(1.0F, 1.0F); - this.setLocationAndAngles(shooter.posX, shooter.posY, shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); - this.setPosition(this.posX, this.posY, this.posZ); - this.yOffset = 0.0F; - this.motionX = this.motionY = this.motionZ = 0.0D; - xVelocity += this.rand.nextGaussian() * spread; - yVelocity += this.rand.nextGaussian() * spread; - zVelocity += this.rand.nextGaussian() * spread; - double d3 = (double)MathHelper.sqrt_double(xVelocity * xVelocity + yVelocity * yVelocity + zVelocity * zVelocity); - this.accelerationX = xVelocity / d3 * 0.1D; - this.accelerationY = yVelocity / d3 * 0.1D; - this.accelerationZ = zVelocity / d3 * 0.1D; - } - - private final int typeId = 2; - @Override - protected void entityInit() - { - dataWatcher.addObject(typeId, 0); - } - public EntityDragonBreath setType(int type) - { - dataWatcher.updateObject(typeId, type); - return this; - } - - @Override - public void setFire(int time) - { - } - public int getType() - { - return dataWatcher.getWatchableObjectInt(typeId); - } - - @Override - public void onUpdate() - { - super.onUpdate(); - if(this.ticksExisted >= getLifeSpan()) - { - setDead(); - } - if(ticksExisted % 5 == 0 && shouldExpand()) - { - int lifeScale = (int) Math.floor((float)ticksExisted / 5F); - float newSize = size + (size/4*lifeScale); - this.setSize(newSize, newSize); - } - if(ticksExisted % 10 == 0) - { - for(int x = -1; x <= 1; x++) - { - for(int y = -1; y <= 1; y++) - { - for(int z = -1; z <= 1; z++) - { - int i = (int)posX + x; - int j = (int)posY + y; - int k = (int)posZ + z; - getBreath().hitBlock(worldObj, this, i, j, k, false); - } - } - } - } - } +public class EntityDragonBreath extends EntityFireball { + private static final float size = 0.75F; + public Random rand = new Random(); + + public EntityDragonBreath(World world) { + super(world); + this.setSize(size, size); + } + + public EntityDragonBreath(World world, EntityLivingBase shooter, double xVelocity, double yVelocity, + double zVelocity, float spread) { + this(world); + this.shootingEntity = shooter; + this.setSize(1.0F, 1.0F); + this.setLocationAndAngles(shooter.posX, shooter.posY, shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = this.motionY = this.motionZ = 0.0D; + xVelocity += this.rand.nextGaussian() * spread; + yVelocity += this.rand.nextGaussian() * spread; + zVelocity += this.rand.nextGaussian() * spread; + double d3 = MathHelper.sqrt_double(xVelocity * xVelocity + yVelocity * yVelocity + zVelocity * zVelocity); + this.accelerationX = xVelocity / d3 * 0.1D; + this.accelerationY = yVelocity / d3 * 0.1D; + this.accelerationZ = zVelocity / d3 * 0.1D; + } + + private final int typeId = 2; + + @Override + protected void entityInit() { + dataWatcher.addObject(typeId, 0); + } + + public EntityDragonBreath setType(int type) { + dataWatcher.updateObject(typeId, type); + return this; + } + + @Override + public void setFire(int time) { + } + + public int getType() { + return dataWatcher.getWatchableObjectInt(typeId); + } + + @Override + public void onUpdate() { + super.onUpdate(); + if (this.ticksExisted >= getLifeSpan()) { + setDead(); + } + if (ticksExisted % 5 == 0 && shouldExpand()) { + int lifeScale = (int) Math.floor(ticksExisted / 5F); + float newSize = size + (size / 4 * lifeScale); + this.setSize(newSize, newSize); + } + if (ticksExisted % 10 == 0) { + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + int i = (int) posX + x; + int j = (int) posY + y; + int k = (int) posZ + z; + getBreath().hitBlock(worldObj, this, i, j, k, false); + } + } + } + } + } private boolean shouldExpand() { return getBreath().shouldExpand(); } - private int getLifeSpan() - { + private int getLifeSpan() { return getBreath().getLifeSpan(); } /** - * Called when this EntityFireball hits a block or entity. - */ - protected void onImpact(MovingObjectPosition pos) - { - if (!this.worldObj.isRemote) - { - if (pos.entityHit != null && (shootingEntity == null || shootingEntity != pos.entityHit)) - { - getBreath().onHitEntity(pos.entityHit, this); - } - else - { - int i = pos.blockX; - int j = pos.blockY; - int k = pos.blockZ; - - switch (pos.sideHit) - { - case 0: - --j; - break; - case 1: - ++j; - break; - case 2: - --k; - break; - case 3: - ++k; - break; - case 4: - --i; - break; - case 5: - ++i; - } - getBreath().hitBlock(worldObj, this, i, j, k, true); - } - - this.setDead(); - } - } + * Called when this EntityFireball hits a block or entity. + */ + protected void onImpact(MovingObjectPosition pos) { + if (!this.worldObj.isRemote) { + if (pos.entityHit != null && (shootingEntity == null || shootingEntity != pos.entityHit)) { + getBreath().onHitEntity(pos.entityHit, this); + } else { + int i = pos.blockX; + int j = pos.blockY; + int k = pos.blockZ; + + switch (pos.sideHit) { + case 0: + --j; + break; + case 1: + ++j; + break; + case 2: + --k; + break; + case 3: + ++k; + break; + case 4: + --i; + break; + case 5: + ++i; + } + getBreath().hitBlock(worldObj, this, i, j, k, true); + } + + this.setDead(); + } + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + public boolean canBeCollidedWith() { + return false; + } /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - public boolean canBeCollidedWith() - { - return false; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource src, float power) - { - return false; - } - - public void modifySpeed(float mod) - { - this.accelerationX *= mod; - this.accelerationY *= mod; - this.accelerationZ *= mod; - } - - public EntityDragonBreath setDamage(float dam) - { + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource src, float power) { + return false; + } + + public void modifySpeed(float mod) { + this.accelerationX *= mod; + this.accelerationY *= mod; + this.accelerationZ *= mod; + } + + public EntityDragonBreath setDamage(float dam) { getEntityData().setFloat("Damage", dam); return this; } - public float getDamage() - { - if(getEntityData().hasKey("Damage")) - { + + public float getDamage() { + if (getEntityData().hasKey("Damage")) { return getEntityData().getFloat("Damage"); } return 2.0F; } + private DragonBreath breath; - public DragonBreath getBreath() - { - if(breath == null) - { + + public DragonBreath getBreath() { + if (breath == null) { DragonBreath load = DragonBreath.projectiles.get(getType()); - if(load != null) - { + if (load != null) { breath = load; - } - else - { + } else { breath = DragonBreath.frost; } } return breath; } - - public DamageSource causeFireblastDamage() - { - return this.getBreath().getDamageSource(this, this.shootingEntity); - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbt) - { - nbt.setInteger("type", getType()); - } - @Override - public void readEntityFromNBT(NBTTagCompound nbt) - { - setType(nbt.getInteger("type")); - } - - public String getTextureName() - { + + public DamageSource causeFireblastDamage() { + return this.getBreath().getDamageSource(this, this.shootingEntity); + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setInteger("type", getType()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + setType(nbt.getInteger("type")); + } + + public String getTextureName() { return getBreath().getTexture(this); } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityFireBlast.java b/src/main/java/minefantasy/mf2/entity/EntityFireBlast.java index 8a2eaed3..b6d46d2a 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityFireBlast.java +++ b/src/main/java/minefantasy/mf2/entity/EntityFireBlast.java @@ -1,307 +1,261 @@ package minefantasy.mf2.entity; import static net.minecraftforge.common.util.ForgeDirection.UP; + import minefantasy.mf2.config.ConfigMobs; import minefantasy.mf2.entity.mob.EntityDragon; import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityFireball; import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSourceIndirect; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class EntityFireBlast extends EntityFireball -{ - private static final float size =0.75F; - - public EntityFireBlast(World world) - { - super(world); - this.setInvisible(true); - this.setSize(size, size); - } - - public EntityFireBlast(World world, EntityLivingBase shooter, double xv, double yv, double zv) - { - super(world, shooter, xv, yv, zv); - this.setInvisible(true); - this.setSize(size, size); - } - - public EntityFireBlast(World world, double x, double y, double z, double xv, double yv, double zv) - { - super(world, x, y, z, xv, yv, zv); - this.setInvisible(true); - this.setSize(size, size); - } - - @Override - public void onUpdate() - { - super.onUpdate(); - if(this.ticksExisted >= getLifeSpan()) - { - setDead(); - } - if(ticksExisted % 5 == 0) - { - int lifeScale = (int) Math.floor((float)ticksExisted / 5F); - float newSize = size + (size/4*lifeScale); - this.setSize(newSize, newSize); - } - if(ticksExisted % 10 == 0) - { - for(int x = -1; x <= 1; x++) - { - for(int y = -1; y <= 1; y++) - { - for(int z = -1; z <= 1; z++) - { - int i = (int)posX + x; - int j = (int)posY + y; - int k = (int)posZ + z; - - if (!worldObj.isRemote && canBlockCatchFire(i, j-1, k) && worldObj.isAirBlock(i, j, k) && rand.nextFloat() < getPyro()) - { - this.worldObj.setBlock(i, j, k, Blocks.fire); - } - } - } - } - } - AxisAlignedBB bb = this.boundingBox.expand(1D, 1D, 1D); - if(!worldObj.isRemote) - this.destroyBlocksInAABB(bb); - } - - private int getLifeSpan() - { - if(isPreset("BlastFurnace")) - { - return 15; - } +public class EntityFireBlast extends EntityFireball { + private static final float size = 0.75F; + + public EntityFireBlast(World world) { + super(world); + this.setInvisible(true); + this.setSize(size, size); + } + + public EntityFireBlast(World world, EntityLivingBase shooter, double xv, double yv, double zv) { + super(world, shooter, xv, yv, zv); + this.setInvisible(true); + this.setSize(size, size); + } + + public EntityFireBlast(World world, double x, double y, double z, double xv, double yv, double zv) { + super(world, x, y, z, xv, yv, zv); + this.setInvisible(true); + this.setSize(size, size); + } + + @Override + public void onUpdate() { + super.onUpdate(); + if (this.ticksExisted >= getLifeSpan()) { + setDead(); + } + if (ticksExisted % 5 == 0) { + int lifeScale = (int) Math.floor(ticksExisted / 5F); + float newSize = size + (size / 4 * lifeScale); + this.setSize(newSize, newSize); + } + if (ticksExisted % 10 == 0) { + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + int i = (int) posX + x; + int j = (int) posY + y; + int k = (int) posZ + z; + + if (!worldObj.isRemote && canBlockCatchFire(i, j - 1, k) && worldObj.isAirBlock(i, j, k) + && rand.nextFloat() < getPyro()) { + this.worldObj.setBlock(i, j, k, Blocks.fire); + } + } + } + } + } + AxisAlignedBB bb = this.boundingBox.expand(1D, 1D, 1D); + if (!worldObj.isRemote) + this.destroyBlocksInAABB(bb); + } + + private int getLifeSpan() { + if (isPreset("BlastFurnace")) { + return 15; + } return 30; } /** - * Called when this EntityFireball hits a block or entity. - */ - protected void onImpact(MovingObjectPosition pos) - { - if (!this.worldObj.isRemote) - { - if (pos.entityHit != null) - { - if (!pos.entityHit.isImmuneToFire()) - { - pos.entityHit.setFire(isPreset("Dragon") ? 2 : 4); - pos.entityHit.attackEntityFrom(causeFireblastDamage(), getDamage()); - } - } - else - { - int i = pos.blockX; - int j = pos.blockY; - int k = pos.blockZ; - - switch (pos.sideHit) - { - case 0: - --j; - break; - case 1: - ++j; - break; - case 2: - --k; - break; - case 3: - ++k; - break; - case 4: - --i; - break; - case 5: - ++i; - } - - if (!worldObj.isRemote && this.worldObj.isAirBlock(i, j, k) && rand.nextFloat() < getPyro()) - { - this.worldObj.setBlock(i, j, k, Blocks.fire); - } - boolean tnt = worldObj.getBlock(pos.blockX, pos.blockY, pos.blockZ).getMaterial() == Material.tnt; - if(isPreset("BlastFurnace") && (rand.nextInt(50) == 0) || tnt) - { - boolean solid = worldObj.isBlockNormalCubeDefault(pos.blockX, pos.blockY, pos.blockZ, false); - worldObj.newExplosion(this, posX, posY, posZ, solid ? 1.5F : 0.5F, true, true); - } - } - - this.setDead(); - } - } - - private float getPyro() - { - - if(!ConfigMobs.dragonGriefFire && shootingEntity != null && shootingEntity instanceof EntityDragon) - { - return 0F; - } - - if(getEntityData().hasKey("Pyro")) - { + * Called when this EntityFireball hits a block or entity. + */ + protected void onImpact(MovingObjectPosition pos) { + if (!this.worldObj.isRemote) { + if (pos.entityHit != null) { + if (!pos.entityHit.isImmuneToFire()) { + pos.entityHit.setFire(isPreset("Dragon") ? 2 : 4); + pos.entityHit.attackEntityFrom(causeFireblastDamage(), getDamage()); + } + } else { + int i = pos.blockX; + int j = pos.blockY; + int k = pos.blockZ; + + switch (pos.sideHit) { + case 0: + --j; + break; + case 1: + ++j; + break; + case 2: + --k; + break; + case 3: + ++k; + break; + case 4: + --i; + break; + case 5: + ++i; + } + + if (!worldObj.isRemote && this.worldObj.isAirBlock(i, j, k) && rand.nextFloat() < getPyro()) { + this.worldObj.setBlock(i, j, k, Blocks.fire); + } + boolean tnt = worldObj.getBlock(pos.blockX, pos.blockY, pos.blockZ).getMaterial() == Material.tnt; + if (isPreset("BlastFurnace") && (rand.nextInt(50) == 0) || tnt) { + boolean solid = worldObj.isBlockNormalCubeDefault(pos.blockX, pos.blockY, pos.blockZ, false); + worldObj.newExplosion(this, posX, posY, posZ, solid ? 1.5F : 0.5F, true, true); + } + } + + this.setDead(); + } + } + + private float getPyro() { + + if (!ConfigMobs.dragonGriefFire && shootingEntity != null && shootingEntity instanceof EntityDragon) { + return 0F; + } + + if (getEntityData().hasKey("Pyro")) { return getEntityData().getFloat("Pyro"); } - - return 0.75F; - } - private float getDamage() - { - if(getEntityData().hasKey("Damage")) - { + + return 0.75F; + } + + private float getDamage() { + if (getEntityData().hasKey("Damage")) { return getEntityData().getFloat("Damage"); } - - if(isPreset("BlastFurnace")) - { - return 8F; - } + + if (isPreset("BlastFurnace")) { + return 8F; + } return 2.0F; } /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - public boolean canBeCollidedWith() - { - return false; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource src, float power) - { - return false; - } - - @Override - public boolean isInvisible() - { - return true; - } - - public void modifySpeed(float mod) - { - this.accelerationX *= mod; - this.accelerationY *= mod; - this.accelerationZ *= mod; - } - - public boolean isPreset(String s) - { - if(getEntityData().hasKey("Preset")) - { - return getEntityData().getString("Preset").equalsIgnoreCase(s); - } - return false; - } - public boolean canBlockCatchFire(int x, int y, int z) - { - return canCatchFire(x, y, z, UP); - } - public boolean canCatchFire(int x, int y, int z, ForgeDirection face) - { - return worldObj.getBlock(x, y, z).isFlammable(worldObj, x, y, z, face); - } - - public EntityFireBlast preset(String string) - { + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + public boolean canBeCollidedWith() { + return false; + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource src, float power) { + return false; + } + + @Override + public boolean isInvisible() { + return true; + } + + public void modifySpeed(float mod) { + this.accelerationX *= mod; + this.accelerationY *= mod; + this.accelerationZ *= mod; + } + + public boolean isPreset(String s) { + if (getEntityData().hasKey("Preset")) { + return getEntityData().getString("Preset").equalsIgnoreCase(s); + } + return false; + } + + public boolean canBlockCatchFire(int x, int y, int z) { + return canCatchFire(x, y, z, UP); + } + + public boolean canCatchFire(int x, int y, int z, ForgeDirection face) { + return worldObj.getBlock(x, y, z).isFlammable(worldObj, x, y, z, face); + } + + public EntityFireBlast preset(String string) { getEntityData().setBoolean(string, true); return this; } - public EntityFireBlast setDamage(float dam) - { + + public EntityFireBlast setDamage(float dam) { getEntityData().setFloat("Damage", dam); return this; } - public EntityFireBlast setPyro(float dam) - { + + public EntityFireBlast setPyro(float dam) { getEntityData().setFloat("Pyro", dam); return this; } - - private boolean destroyBlocksInAABB(AxisAlignedBB box) - { - int var2 = MathHelper.floor_double(box.minX); - int var3 = MathHelper.floor_double(box.minY); - int var4 = MathHelper.floor_double(box.minZ); - int var5 = MathHelper.floor_double(box.maxX); - int var6 = MathHelper.floor_double(box.maxY); - int var7 = MathHelper.floor_double(box.maxZ); - boolean var8 = false; - boolean var9 = false; - - for (int var10 = var2; var10 <= var5; ++var10) - { - for (int var11 = var3; var11 <= var6; ++var11) - { - for (int var12 = var4; var12 <= var7; ++var12) - { - Material var13 = this.worldObj.getBlock(var10, var11, var12).getMaterial(); - - if (var13 != null) - { - if (var13 == Material.glass) - { - var9 = true; - this.worldObj.setBlockToAir(var10, var11, var12); - } - else if (var13 == Material.tnt) - { - var9 = true; - this.worldObj.setBlockToAir(var10, var11, var12); - this.worldObj.createExplosion(this, var10, var11, var12, 4.0F, true); - } - else - { - var8 = true; - } - } - } - } - } - - if (var9) - { - double var16 = box.minX + (box.maxX - box.minX) * (double)this.rand.nextFloat(); - double var17 = box.minY + (box.maxY - box.minY) * (double)this.rand.nextFloat(); - double var14 = box.minZ + (box.maxZ - box.minZ) * (double)this.rand.nextFloat(); - this.worldObj.spawnParticle("largeexplode", var16, var17, var14, 0.0D, 0.0D, 0.0D); - for(int a = 0 ; a < 1+rand.nextInt(4); a ++) - this.worldObj.playSoundAtEntity(this, "dig.glass", 1F, 1F); - } - - return var8; - } - + + private boolean destroyBlocksInAABB(AxisAlignedBB box) { + int var2 = MathHelper.floor_double(box.minX); + int var3 = MathHelper.floor_double(box.minY); + int var4 = MathHelper.floor_double(box.minZ); + int var5 = MathHelper.floor_double(box.maxX); + int var6 = MathHelper.floor_double(box.maxY); + int var7 = MathHelper.floor_double(box.maxZ); + boolean var8 = false; + boolean var9 = false; + + for (int var10 = var2; var10 <= var5; ++var10) { + for (int var11 = var3; var11 <= var6; ++var11) { + for (int var12 = var4; var12 <= var7; ++var12) { + Material var13 = this.worldObj.getBlock(var10, var11, var12).getMaterial(); + + if (var13 != null) { + if (var13 == Material.glass) { + var9 = true; + this.worldObj.setBlockToAir(var10, var11, var12); + } else if (var13 == Material.tnt) { + var9 = true; + this.worldObj.setBlockToAir(var10, var11, var12); + this.worldObj.createExplosion(this, var10, var11, var12, 4.0F, true); + } else { + var8 = true; + } + } + } + } + } + + if (var9) { + double var16 = box.minX + (box.maxX - box.minX) * this.rand.nextFloat(); + double var17 = box.minY + (box.maxY - box.minY) * this.rand.nextFloat(); + double var14 = box.minZ + (box.maxZ - box.minZ) * this.rand.nextFloat(); + this.worldObj.spawnParticle("largeexplode", var16, var17, var14, 0.0D, 0.0D, 0.0D); + for (int a = 0; a < 1 + rand.nextInt(4); a++) + this.worldObj.playSoundAtEntity(this, "dig.glass", 1F, 1F); + } + + return var8; + } + public static DamageSource blastDamage = (new DamageSource("blastfurn")).setFireDamage(); public static DamageSource basicDamage = (new DamageSource("fireblastBase")).setFireDamage(); - public DamageSource causeFireblastDamage() - { - if(isPreset("BlastFurnace")) - { + + public DamageSource causeFireblastDamage() { + if (isPreset("BlastFurnace")) { return blastDamage; - } - return shootingEntity == null ? basicDamage : (new EntityDamageSourceIndirect("fireblast", this, shootingEntity)).setFireDamage().setProjectile(); - } + } + return shootingEntity == null ? basicDamage + : (new EntityDamageSourceIndirect("fireblast", this, shootingEntity)).setFireDamage().setProjectile(); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityItemUnbreakable.java b/src/main/java/minefantasy/mf2/entity/EntityItemUnbreakable.java index 7fefc868..0b25c512 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityItemUnbreakable.java +++ b/src/main/java/minefantasy/mf2/entity/EntityItemUnbreakable.java @@ -2,7 +2,6 @@ import java.util.Iterator; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; @@ -12,162 +11,138 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.item.ItemExpireEvent; -public class EntityItemUnbreakable extends EntityItem -{ - public EntityItemUnbreakable(World world) - { +public class EntityItemUnbreakable extends EntityItem { + public EntityItemUnbreakable(World world) { super(world); } - public EntityItemUnbreakable(World world, EntityItem parent) - { + + public EntityItemUnbreakable(World world, EntityItem parent) { super(world, parent.posX, parent.posY, parent.posZ, parent.getEntityItem()); this.mimicSpeed(parent); delayBeforeCanPickup = parent.delayBeforeCanPickup; isImmuneToFire = true; } - public void mimicSpeed(EntityItem parent) - { - this.motionX = parent.motionX; - this.motionY = parent.motionY; - this.motionZ = parent.motionZ; - } - + + public void mimicSpeed(EntityItem parent) { + this.motionX = parent.motionX; + this.motionY = parent.motionY; + this.motionZ = parent.motionZ; + } + @Override - public boolean attackEntityFrom(DamageSource src, float dam) - { - if(isBreakable() && !src.isFireDamage()) - { + public boolean attackEntityFrom(DamageSource src, float dam) { + if (isBreakable() && !src.isFireDamage()) { return super.attackEntityFrom(src, dam); } return false; } - + @Override - public void onUpdate() - { - ItemStack stack = this.getDataWatcher().getWatchableObjectItemStack(10); - if (stack != null && stack.getItem() != null) - { - if (stack.getItem().onEntityItemUpdate(this)) - { - return; - } - } - - if (this.getEntityItem() == null) - { - this.setDead(); - } - else - { - this.onEntityUpdate(); - - if (this.delayBeforeCanPickup > 0) - { - --this.delayBeforeCanPickup; - } - - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - if(!isBreakable() && posY <= 1.0F) - { - motionY = 0D; - } - else - { - this.motionY -= 0.03999999910593033D; - } - this.noClip = this.func_145771_j(this.posX, (this.boundingBox.minY + this.boundingBox.maxY) / 2.0D, this.posZ); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - boolean flag = (int)this.prevPosX != (int)this.posX || (int)this.prevPosY != (int)this.posY || (int)this.prevPosZ != (int)this.posZ; - - if (flag || this.ticksExisted % 25 == 0) - { - if (this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)).getMaterial() == Material.lava) - { - this.motionY = 0.20000000298023224D; - this.motionX = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F); - this.motionZ = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F); - } - - if (!this.worldObj.isRemote) - { - this.searchForOtherItemsNearby(); - } - } - - float f = 0.98F; - - if (this.onGround) - { - f = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)).slipperiness * 0.98F; - } - - this.motionX *= (double)f; - this.motionY *= 0.9800000190734863D; - this.motionZ *= (double)f; - - if (this.onGround) - { - this.motionY *= -0.5D; - } - - ++this.age; - - ItemStack item = getDataWatcher().getWatchableObjectItemStack(10); - - if(isBreakable()) - { - if (!this.worldObj.isRemote && this.age >= lifespan) - { - if (item != null) - { - ItemExpireEvent event = new ItemExpireEvent(this, (item.getItem() == null ? 6000 : item.getItem().getEntityLifespan(item, worldObj))); - if (MinecraftForge.EVENT_BUS.post(event)) - { - lifespan += event.extraLife; - } - else - { - this.setDead(); - } - } - else - { - this.setDead(); - } - } - } - - if (item != null && item.stackSize <= 0) - { - this.setDead(); - } - } - } - private boolean isBreakable() - { + public void onUpdate() { + ItemStack stack = this.getDataWatcher().getWatchableObjectItemStack(10); + if (stack != null && stack.getItem() != null) { + if (stack.getItem().onEntityItemUpdate(this)) { + return; + } + } + + if (this.getEntityItem() == null) { + this.setDead(); + } else { + this.onEntityUpdate(); + + if (this.delayBeforeCanPickup > 0) { + --this.delayBeforeCanPickup; + } + + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if (!isBreakable() && posY <= 1.0F) { + motionY = 0D; + } else { + this.motionY -= 0.03999999910593033D; + } + this.noClip = this.func_145771_j(this.posX, (this.boundingBox.minY + this.boundingBox.maxY) / 2.0D, + this.posZ); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + boolean flag = (int) this.prevPosX != (int) this.posX || (int) this.prevPosY != (int) this.posY + || (int) this.prevPosZ != (int) this.posZ; + + if (flag || this.ticksExisted % 25 == 0) { + if (this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), + MathHelper.floor_double(this.posZ)).getMaterial() == Material.lava) { + this.motionY = 0.20000000298023224D; + this.motionX = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F; + this.motionZ = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F; + } + + if (!this.worldObj.isRemote) { + this.searchForOtherItemsNearby(); + } + } + + float f = 0.98F; + + if (this.onGround) { + f = this.worldObj.getBlock(MathHelper.floor_double(this.posX), + MathHelper.floor_double(this.boundingBox.minY) - 1, + MathHelper.floor_double(this.posZ)).slipperiness * 0.98F; + } + + this.motionX *= f; + this.motionY *= 0.9800000190734863D; + this.motionZ *= f; + + if (this.onGround) { + this.motionY *= -0.5D; + } + + ++this.age; + + ItemStack item = getDataWatcher().getWatchableObjectItemStack(10); + + if (isBreakable()) { + if (!this.worldObj.isRemote && this.age >= lifespan) { + if (item != null) { + ItemExpireEvent event = new ItemExpireEvent(this, + (item.getItem() == null ? 6000 : item.getItem().getEntityLifespan(item, worldObj))); + if (MinecraftForge.EVENT_BUS.post(event)) { + lifespan += event.extraLife; + } else { + this.setDead(); + } + } else { + this.setDead(); + } + } + } + + if (item != null && item.stackSize <= 0) { + this.setDead(); + } + } + } + + private boolean isBreakable() { return false; } - private void searchForOtherItemsNearby() - { - Iterator iterator = this.worldObj.getEntitiesWithinAABB(EntityItem.class, this.boundingBox.expand(0.5D, 0.0D, 0.5D)).iterator(); - - while (iterator.hasNext()) - { - EntityItem entityitem = (EntityItem)iterator.next(); - this.combineItems(entityitem); - } - } - + + private void searchForOtherItemsNearby() { + Iterator iterator = this.worldObj + .getEntitiesWithinAABB(EntityItem.class, this.boundingBox.expand(0.5D, 0.0D, 0.5D)).iterator(); + + while (iterator.hasNext()) { + EntityItem entityitem = (EntityItem) iterator.next(); + this.combineItems(entityitem); + } + } + @Override - public void playSound(String sound, float volume, float pitch) - { - if(sound.equalsIgnoreCase("random.fizz")) - { + public void playSound(String sound, float volume, float pitch) { + if (sound.equalsIgnoreCase("random.fizz")) { return; } - this.worldObj.playSoundAtEntity(this, sound, volume, pitch); - } + this.worldObj.playSoundAtEntity(this, sound, volume, pitch); + } } diff --git a/src/main/java/minefantasy/mf2/entity/EntityMine.java b/src/main/java/minefantasy/mf2/entity/EntityMine.java index 7013449e..834ef4ba 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityMine.java +++ b/src/main/java/minefantasy/mf2/entity/EntityMine.java @@ -3,6 +3,8 @@ import java.util.Iterator; import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.item.gadget.EnumCasingType; import minefantasy.mf2.item.gadget.EnumExplosiveType; @@ -21,372 +23,338 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class EntityMine extends Entity -{ - /** How long the fuse is */ - public int fuse; - private EntityLivingBase thrower; - - public EntityMine(World world) - { - super(world); - this.preventEntitySpawning = true; - this.setSize(0.5F, 0.25F); - this.yOffset = this.height / 2.0F; - } - - public EntityMine(World world, EntityLivingBase thrower) - { - this(world); - this.thrower = thrower; - this.fuse = 40; - - this.setLocationAndAngles(thrower.posX, thrower.posY + thrower.getEyeHeight(), thrower.posZ, thrower.rotationYaw, thrower.rotationPitch); - this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; - this.posY -= 0.10000000149011612D; - this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; - this.setPosition(this.posX, this.posY, this.posZ); - - float f = 0.4F; - this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * f; - this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * f; - this.motionY = -MathHelper.sin((this.rotationPitch + this.getThrownOffset()) / 180.0F * (float)Math.PI) * f; - this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, this.getThrownForce(), 1.0F); - - this.prevPosX = posX; - this.prevPosY = posY; - this.prevPosZ = posZ; - } - - - @Override - public boolean interactFirst(EntityPlayer user) - { - if(user.isSneaking()) - { - //DISARM - setDead(); - user.swingItem(); - if(!worldObj.isRemote) - { - ItemStack item = ToolListMF.mine_custom.createMine(getCasing(), getFilling(), getFuse(), getPowder(), 1); - if(!user.inventory.addItemStackToInventory(item)) - { - this.entityDropItem(item, 0.0F); - } - } - } - return super.interactFirst(user); - } - - public void setThrowableHeading(double x, double y, double z, float offset, float force) - { - float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); - x /= f2; - y /= f2; - z /= f2; - x += this.rand.nextGaussian() * 0.007499999832361937D * force; - y += this.rand.nextGaussian() * 0.007499999832361937D * force; - z += this.rand.nextGaussian() * 0.007499999832361937D * force; - x *= offset; - y *= offset; - z *= offset; - this.motionX = x; - this.motionY = y; - this.motionZ = z; - float f3 = MathHelper.sqrt_double(x * x + z * z); - this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(x, z) * 180.0D / Math.PI); - this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(y, f3) * 180.0D / Math.PI); - } - protected float getThrownOffset() - { - return 0.0F; - } - protected float getThrownForce() - { - return 0.5F; - } - - @Override - protected void entityInit() - { - dataWatcher.addObject(typeId, (byte)0); - dataWatcher.addObject(typeId+1, (byte)0); - dataWatcher.addObject(typeId+2, (byte)0); - dataWatcher.addObject(typeId+3, (byte)0); - } - - /** - * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to - * prevent them from trampling crops - */ - @Override - protected boolean canTriggerWalking() - { - return false; - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - @Override - public boolean canBeCollidedWith() - { - return !this.isDead; - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - this.motionY -= (0.03999999910593033D * getCase().weightModifier); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.9800000190734863D; - this.motionY *= 0.9800000190734863D; - this.motionZ *= 0.9800000190734863D; - - if (this.onGround) - { - this.motionX = 0; - this.motionZ = 0; - this.motionY *= -0.99D; - } - - if(fuse > 0) - { - --fuse; - } - double radius = Math.max(1.0D, getRangeOfBlast()-1.5D); - - if(ticksExisted % 5 == 0) - { - List list = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, boundingBox.expand(radius*2, radius, radius*2)); - if (fuse == 0 && !list.isEmpty()) - { - boolean detonate = false; - Iterator i = list.iterator(); - while(i.hasNext()) - { - EntityLivingBase e = (EntityLivingBase) i.next(); - if(e.getDistanceToEntity(this) < radius) - { - detonate = true; - break; - } - } - - if(detonate) - { - worldObj.playSoundEffect(posX, posY, posZ, "game.tnt.primed", 1.0F, 0.75F); - --fuse; - } - } - } - if(fuse < 0) - { - fuse --; - - if(fuse < -10) - { - this.setDead(); - - if (!this.worldObj.isRemote) - { - this.explode(); - } - } - } - } - - private void explode2() - { - float power = 5.0F; - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, power, false); - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - protected void writeEntityToNBT(NBTTagCompound nbt) - { - nbt.setByte("Fuse", (byte)this.fuse); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - protected void readEntityFromNBT(NBTTagCompound nbt) - { - this.fuse = nbt.getByte("Fuse"); - } - - @Override +public class EntityMine extends Entity { + /** How long the fuse is */ + public int fuse; + private EntityLivingBase thrower; + + public EntityMine(World world) { + super(world); + this.preventEntitySpawning = true; + this.setSize(0.5F, 0.25F); + this.yOffset = this.height / 2.0F; + } + + public EntityMine(World world, EntityLivingBase thrower) { + this(world); + this.thrower = thrower; + this.fuse = 40; + + this.setLocationAndAngles(thrower.posX, thrower.posY + thrower.getEyeHeight(), thrower.posZ, + thrower.rotationYaw, thrower.rotationPitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.posY -= 0.10000000149011612D; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + + float f = 0.4F; + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; + this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; + this.motionY = -MathHelper.sin((this.rotationPitch + this.getThrownOffset()) / 180.0F * (float) Math.PI) * f; + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, this.getThrownForce(), 1.0F); + + this.prevPosX = posX; + this.prevPosY = posY; + this.prevPosZ = posZ; + } + + @Override + public boolean interactFirst(EntityPlayer user) { + if (user.isSneaking()) { + // DISARM + setDead(); + user.swingItem(); + if (!worldObj.isRemote) { + ItemStack item = ToolListMF.mine_custom.createMine(getCasing(), getFilling(), getFuse(), getPowder(), + 1); + if (!user.inventory.addItemStackToInventory(item)) { + this.entityDropItem(item, 0.0F); + } + } + } + return super.interactFirst(user); + } + + public void setThrowableHeading(double x, double y, double z, float offset, float force) { + float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); + x /= f2; + y /= f2; + z /= f2; + x += this.rand.nextGaussian() * 0.007499999832361937D * force; + y += this.rand.nextGaussian() * 0.007499999832361937D * force; + z += this.rand.nextGaussian() * 0.007499999832361937D * force; + x *= offset; + y *= offset; + z *= offset; + this.motionX = x; + this.motionY = y; + this.motionZ = z; + float f3 = MathHelper.sqrt_double(x * x + z * z); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(x, z) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(y, f3) * 180.0D / Math.PI); + } + + protected float getThrownOffset() { + return 0.0F; + } + + protected float getThrownForce() { + return 0.5F; + } + + @Override + protected void entityInit() { + dataWatcher.addObject(typeId, (byte) 0); + dataWatcher.addObject(typeId + 1, (byte) 0); + dataWatcher.addObject(typeId + 2, (byte) 0); + dataWatcher.addObject(typeId + 3, (byte) 0); + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they walk + * on. used for spiders and wolves to prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() { + return false; + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + @Override + public boolean canBeCollidedWith() { + return !this.isDead; + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY -= (0.03999999910593033D * getCase().weightModifier); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.9800000190734863D; + this.motionY *= 0.9800000190734863D; + this.motionZ *= 0.9800000190734863D; + + if (this.onGround) { + this.motionX = 0; + this.motionZ = 0; + this.motionY *= -0.99D; + } + + if (fuse > 0) { + --fuse; + } + double radius = Math.max(1.0D, getRangeOfBlast() - 1.5D); + + if (ticksExisted % 5 == 0) { + List list = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, + boundingBox.expand(radius * 2, radius, radius * 2)); + if (fuse == 0 && !list.isEmpty()) { + boolean detonate = false; + Iterator i = list.iterator(); + while (i.hasNext()) { + EntityLivingBase e = (EntityLivingBase) i.next(); + if (e.getDistanceToEntity(this) < radius) { + detonate = true; + break; + } + } + + if (detonate) { + worldObj.playSoundEffect(posX, posY, posZ, "game.tnt.primed", 1.0F, 0.75F); + --fuse; + } + } + } + if (fuse < 0) { + fuse--; + + if (fuse < -10) { + this.setDead(); + + if (!this.worldObj.isRemote) { + this.explode(); + } + } + } + } + + private void explode2() { + float power = 5.0F; + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, power, false); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + protected void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setByte("Fuse", (byte) this.fuse); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + protected void readEntityFromNBT(NBTTagCompound nbt) { + this.fuse = nbt.getByte("Fuse"); + } + + @Override @SideOnly(Side.CLIENT) - public float getShadowSize() - { - return 0.25F; - } - - /** - * returns null or the entityliving it was placed or ignited by - */ - public EntityLivingBase getTntPlacedBy() - { - return this.thrower; - } - - public void explode() - { + public float getShadowSize() { + return 0.25F; + } + + /** + * returns null or the entityliving it was placed or ignited by + */ + public EntityLivingBase getTntPlacedBy() { + return this.thrower; + } + + public void explode() { worldObj.playSoundAtEntity(this, "random.explode", 0.3F, 10F - 5F); - worldObj.createExplosion(this, posX, posY, posZ, 0, false); - if (!this.worldObj.isRemote) - { - double area = getRangeOfBlast()*2D* getPowderType().rangeModifier; - AxisAlignedBB var3 = this.boundingBox.expand(area, area/2, area); - List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); - - if (var4 != null && !var4.isEmpty()) - { - Iterator splashDamage = var4.iterator(); - - while (splashDamage.hasNext()) - { - Entity entityHit = (Entity)splashDamage.next(); - - if(MineFantasyII.isBukkitServer() && BukkitUtils.cantDamage(thrower != null ? thrower:this, entityHit)) { - continue; - } - - double distanceToEntity = this.getDistanceToEntity(entityHit); - - double radius = getRangeOfBlast()* getPowderType().rangeModifier; - if (distanceToEntity < radius) - { - float dam = getDamage(); - - if(getCasing() != 2 && distanceToEntity > radius/2) - { - double sc = distanceToEntity-(radius/2); - if(sc < 0)sc = 0; - if(sc > (radius/2))sc = (radius/2); - dam *= (sc / (radius/2)); - } - if(!(entityHit instanceof EntityItem)) - { - DamageSource source = mineDmg; - if(getFilling() == 2) - { - source = mineFireDmg; - } - if(entityHit.attackEntityFrom(source, dam)) - { - applyEffects(entityHit); - } - } - } - } - } - this.setDead(); - } - - int t = getFilling(); - if(t > 0) - { - for(int a = 0; a < 16; a++) - { - float range = 0.6F; - EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY+0.5D, posZ, (rand.nextDouble()-0.5)*(range/2), (rand.nextDouble())*range, (rand.nextDouble()-0.5)*(range/2)); - - if(t == 2) - { - shrapnel.setFire(10); - } - worldObj.spawnEntityInWorld(shrapnel); - } - } + worldObj.createExplosion(this, posX, posY, posZ, 0, false); + if (!this.worldObj.isRemote) { + double area = getRangeOfBlast() * 2D * getPowderType().rangeModifier; + AxisAlignedBB var3 = this.boundingBox.expand(area, area / 2, area); + List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); + + if (var4 != null && !var4.isEmpty()) { + Iterator splashDamage = var4.iterator(); + + while (splashDamage.hasNext()) { + Entity entityHit = (Entity) splashDamage.next(); + + if (MineFantasyII.isBukkitServer() + && BukkitUtils.cantDamage(thrower != null ? thrower : this, entityHit)) { + continue; + } + + double distanceToEntity = this.getDistanceToEntity(entityHit); + + double radius = getRangeOfBlast() * getPowderType().rangeModifier; + if (distanceToEntity < radius) { + float dam = getDamage(); + + if (getCasing() != 2 && distanceToEntity > radius / 2) { + double sc = distanceToEntity - (radius / 2); + if (sc < 0) + sc = 0; + if (sc > (radius / 2)) + sc = (radius / 2); + dam *= (sc / (radius / 2)); + } + if (!(entityHit instanceof EntityItem)) { + DamageSource source = mineDmg; + if (getFilling() == 2) { + source = mineFireDmg; + } + if (entityHit.attackEntityFrom(source, dam)) { + applyEffects(entityHit); + } + } + } + } + } + this.setDead(); + } + + int t = getFilling(); + if (t > 0) { + for (int a = 0; a < 16; a++) { + float range = 0.6F; + EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY + 0.5D, posZ, + (rand.nextDouble() - 0.5) * (range / 2), (rand.nextDouble()) * range, + (rand.nextDouble() - 0.5) * (range / 2)); + + if (t == 2) { + shrapnel.setFire(10); + } + worldObj.spawnEntityInWorld(shrapnel); + } + } } - private void applyEffects(Entity hit) - { - if(getFilling() == 2) - { - hit.setFire(8); - } - if(hit instanceof EntityLivingBase) - { - EntityLivingBase live = (EntityLivingBase)hit; - } + + private void applyEffects(Entity hit) { + if (getFilling() == 2) { + hit.setFire(8); + } + if (hit instanceof EntityLivingBase) { + EntityLivingBase live = (EntityLivingBase) hit; + } } - private double getRangeOfBlast() - { + private double getRangeOfBlast() { return getBlast().range * getCase().rangeModifier; } - private float getDamage() - { + private float getDamage() { return getBlast().damage * getCase().damageModifier * getPowderType().damageModifier; } - + private static DamageSource mineDmg = new DamageSource("mine").setExplosion(); private static DamageSource mineFireDmg = new DamageSource("mine").setExplosion().setFireDamage(); - - public boolean canEntityBeSeen(Entity entity) - { - return this.worldObj.rayTraceBlocks(Vec3.createVectorHelper(this.posX, this.posY + this.getEyeHeight(), this.posZ), Vec3.createVectorHelper(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ)) == null; - } - + + public boolean canEntityBeSeen(Entity entity) { + return this.worldObj.rayTraceBlocks( + Vec3.createVectorHelper(this.posX, this.posY + this.getEyeHeight(), this.posZ), + Vec3.createVectorHelper(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ)) == null; + } + private final int typeId = 2; - public byte getFilling() - { + + public byte getFilling() { return dataWatcher.getWatchableObjectByte(typeId); } - public byte getCasing() - { - return dataWatcher.getWatchableObjectByte(typeId+1); + + public byte getCasing() { + return dataWatcher.getWatchableObjectByte(typeId + 1); } - public byte getFuse() - { - return dataWatcher.getWatchableObjectByte(typeId+2); + + public byte getFuse() { + return dataWatcher.getWatchableObjectByte(typeId + 2); } - public byte getPowder() - { - return dataWatcher.getWatchableObjectByte(typeId+3); + + public byte getPowder() { + return dataWatcher.getWatchableObjectByte(typeId + 3); } - public EntityMine setType(byte fill, byte casing, byte fuse, byte powder) - { + + public EntityMine setType(byte fill, byte casing, byte fuse, byte powder) { dataWatcher.updateObject(typeId, fill); - dataWatcher.updateObject(typeId+1, casing); - dataWatcher.updateObject(typeId+2, fuse); - dataWatcher.updateObject(typeId+3, powder); - + dataWatcher.updateObject(typeId + 1, casing); + dataWatcher.updateObject(typeId + 2, fuse); + dataWatcher.updateObject(typeId + 3, powder); + this.fuse = getFuseType().time; - + return this; } - private EnumExplosiveType getBlast() - { + + private EnumExplosiveType getBlast() { return EnumExplosiveType.getType(getFilling()); } - private EnumCasingType getCase() - { + + private EnumCasingType getCase() { return EnumCasingType.getType(getCasing()); } - private EnumFuseType getFuseType() - { + + private EnumFuseType getFuseType() { return EnumFuseType.getType(getFuse()); } - private EnumPowderType getPowderType() - { + + private EnumPowderType getPowderType() { return EnumPowderType.getType(getPowder()); } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityParachute.java b/src/main/java/minefantasy/mf2/entity/EntityParachute.java index cae61c97..866c1971 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityParachute.java +++ b/src/main/java/minefantasy/mf2/entity/EntityParachute.java @@ -1,20 +1,17 @@ package minefantasy.mf2.entity; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.ArmourCalculator; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.util.MFLogUtil; -import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; @@ -22,546 +19,478 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class EntityParachute extends Entity -{ - /** true if no player in parachute */ - private boolean isParachuteEmpty; - private double speedMultiplier; - private int parachutePosRotationIncrements; - private double parachuteX; - private double parachuteY; - private double parachuteZ; - private double parachuteYaw; - private double parachutePitch; - @SideOnly(Side.CLIENT) - private double velocityX; - @SideOnly(Side.CLIENT) - private double velocityY; - @SideOnly(Side.CLIENT) - private double velocityZ; - - public EntityParachute(World world) - { - super(world); - this.isParachuteEmpty = true; - this.speedMultiplier = 0.07D; - this.preventEntitySpawning = true; - this.setSize(2F, 4F); - } - - /** - * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to - * prevent them from trampling crops - */ - @Override - protected boolean canTriggerWalking() - { - return false; - } - @Override - public boolean canRiderInteract() - { - return false; - } - - protected void entityInit() - { - this.dataWatcher.addObject(17, new Integer(0)); - this.dataWatcher.addObject(18, new Integer(1)); - this.dataWatcher.addObject(19, new Float(0.0F)); - } - - /** - * Returns a boundingBox used to collide the entity with other entities and blocks. This enables the entity to be - * pushable on contact, like parachutes or minecarts. - */ - public AxisAlignedBB getCollisionBox(Entity entity) - { - return entity.boundingBox; - } - - /** - * returns the bounding box for this entity - */ - public AxisAlignedBB getBoundingBox() - { - return this.boundingBox; - } - - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - public boolean canBePushed() - { - return true; - } - - public EntityParachute(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y + (double)this.yOffset, z); - this.motionX = 0.0D; - this.motionY = 0.0D; - this.motionZ = 0.0D; - this.prevPosX = x; - this.prevPosY = y; - this.prevPosZ = z; - } - - /** - * Returns the Y offset from the entity's position for any entity riding this one. - */ - public double getMountedYOffset() - { - return 1D; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource src, float dam) - { - if (this.isEntityInvulnerable()) - { - return false; - } - else if (!this.worldObj.isRemote && !this.isDead) - { - this.setForwardDirection(-this.getForwardDirection()); - this.setTimeSinceHit(10); - this.setDamageTaken(this.getDamageTaken() + dam * 10.0F); - this.setBeenAttacked(); - boolean flag = src.getEntity() instanceof EntityPlayer && ((EntityPlayer)src.getEntity()).capabilities.isCreativeMode; - - if (flag || this.getDamageTaken() > 20.0F) - { - if (this.riddenByEntity != null) - { - this.riddenByEntity.mountEntity(this); - } - - if (!flag) - { - this.func_145778_a(ToolListMF.parachute, 1, 0.0F); - } - - this.setDead(); - } - - return true; - } - else - { - return true; - } - } - - /** - * Setups the entity to do the hurt animation. Only used by packets in multiplayer. - */ - @SideOnly(Side.CLIENT) - public void performHurtAnimation() - { - this.setForwardDirection(-this.getForwardDirection()); - this.setTimeSinceHit(10); - this.setDamageTaken(this.getDamageTaken() * 11.0F); - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - public boolean canBeCollidedWith() - { - return !this.isDead; - } - - /** - * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, - * posY, posZ, yaw, pitch - */ - @SideOnly(Side.CLIENT) - public void setPositionAndRotation2(double x, double y, double z, float xr, float yr, int zr) - { - if (this.isParachuteEmpty) - { - this.parachutePosRotationIncrements = zr + 5; - } - else - { - double d3 = x - this.posX; - double d4 = y - this.posY; - double d5 = z - this.posZ; - double d6 = d3 * d3 + d4 * d4 + d5 * d5; - - if (d6 <= 1.0D) - { - return; - } - - this.parachutePosRotationIncrements = 3; - } - - this.parachuteX = x; - this.parachuteY = y; - this.parachuteZ = z; - this.parachuteYaw = (double)xr; - this.parachutePitch = (double)yr; - this.motionX = this.velocityX; - this.motionY = this.velocityY; - this.motionZ = this.velocityZ; - } - - /** - * Sets the velocity to the args. Args: x, y, z - */ - @SideOnly(Side.CLIENT) - public void setVelocity(double xv, double yv, double zv) - { - this.velocityX = this.motionX = xv; - this.velocityY = this.motionY = yv; - this.velocityZ = this.motionZ = zv; - } - - /** - * Called to update the entity's position/logic. - */ - protected void fall(float distance) - { - } - - public void onUpdate() - { - if(this.riddenByEntity != null) - { - riddenByEntity.fallDistance = 0; - //this.rotationYaw = riddenByEntity.rotationYaw; - } - super.onUpdate(); - - if (this.getTimeSinceHit() > 0) - { - this.setTimeSinceHit(this.getTimeSinceHit() - 1); - } - - if (this.getDamageTaken() > 0.0F) - { - this.setDamageTaken(this.getDamageTaken() - 1.0F); - } - - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - byte b0 = 5; - double d0 = 0.0D; - - for (int i = 0; i < b0; ++i) - { - double d1 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(i + 0) / (double)b0 - 0.125D; - double d3 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(i + 1) / (double)b0 - 0.125D; - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.boundingBox.minX, d1, this.boundingBox.minZ, this.boundingBox.maxX, d3, this.boundingBox.maxZ); - - if (this.worldObj.isAABBInMaterial(axisalignedbb, Material.water)) - { - d0 += 1.0D / (double)b0; - } - } - - double d10 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); - double d2; - double d4; - double d11; - double d12; - - if (this.worldObj.isRemote && this.isParachuteEmpty) - { - if (this.parachutePosRotationIncrements > 0) - { - d2 = this.posX + (this.parachuteX - this.posX) / (double)this.parachutePosRotationIncrements; - d4 = this.posY + (this.parachuteY - this.posY) / (double)this.parachutePosRotationIncrements; - d11 = this.posZ + (this.parachuteZ - this.posZ) / (double)this.parachutePosRotationIncrements; - d12 = MathHelper.wrapAngleTo180_double(this.parachuteYaw - (double)this.rotationYaw); - this.rotationYaw = (float)((double)this.rotationYaw + d12 / (double)this.parachutePosRotationIncrements); - this.rotationPitch = (float)((double)this.rotationPitch + (this.parachutePitch - (double)this.rotationPitch) / (double)this.parachutePosRotationIncrements); - --this.parachutePosRotationIncrements; - this.setPosition(d2, d4, d11); - this.setRotation(this.rotationYaw, this.rotationPitch); - } - else - { - d2 = this.posX + this.motionX; - d4 = this.posY + this.motionY; - d11 = this.posZ + this.motionZ; - this.setPosition(d2, d4, d11); - - if (this.onGround) - { - this.motionX *= 0.5D; - this.motionY *= 0.5D; - this.motionZ *= 0.5D; - } - - this.motionX *= 0.9900000095367432D; - this.motionY *= 0.949999988079071D; - this.motionZ *= 0.9900000095367432D; - } - } - else - { - if (d0 < 1.0D) - { - d2 = d0 * 2.0D - 1.0D; - this.motionY += 0.03999999910593033D * d2; - } - else - { - if (this.motionY < 0.0D) - { - this.motionY /= 2.0D; - } - - this.motionY += 0.007000000216066837D; - } - - if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase) - { - EntityLivingBase entitylivingbase = (EntityLivingBase)this.riddenByEntity; - float f = this.riddenByEntity.rotationYaw + -entitylivingbase.moveStrafing * 90.0F; - this.motionX += -Math.sin((double)(f * (float)Math.PI / 180.0F)) * this.speedMultiplier * (double)entitylivingbase.moveForward * 0.05000000074505806D; - this.motionZ += Math.cos((double)(f * (float)Math.PI / 180.0F)) * this.speedMultiplier * (double)entitylivingbase.moveForward * 0.05000000074505806D; - } - - d2 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); - - if (d2 > 0.35D) - { - d4 = 0.35D / d2; - this.motionX *= d4; - this.motionZ *= d4; - d2 = 0.35D; - } - - if (d2 > d10 && this.speedMultiplier < 0.35D) - { - this.speedMultiplier += (0.35D - this.speedMultiplier) / 35.0D; - - if (this.speedMultiplier > 0.35D) - { - this.speedMultiplier = 0.35D; - } - } - else - { - this.speedMultiplier -= (this.speedMultiplier - 0.07D) / 35.0D; - - if (this.speedMultiplier < 0.07D) - { - this.speedMultiplier = 0.07D; - } - } - - int l; - - this.motionY *= 0.5D; - if (this.onGround) - { - this.motionX *= 0.5D; - this.motionZ *= 0.5D; - } - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - - if ( (this.isCollidedHorizontally && d10 > 0D) || isTooHeavy()) - { - if (!this.worldObj.isRemote && !this.isDead) - { - this.setDead(); - - for (l = 0; l < 3; ++l) - { - this.func_145778_a(Item.getItemFromBlock(Blocks.wool), 1, 0.0F); - } - - for (l = 0; l < 2; ++l) - { - this.func_145778_a(ComponentListMF.leather_strip, 1, 0.0F); - } - } - } - else - { - this.motionX *= 0.9900000095367432D; - this.motionY *= 0.949999988079071D; - this.motionZ *= 0.9900000095367432D; - } - - this.rotationPitch = 0.0F; - d4 = (double)this.rotationYaw; - d11 = this.prevPosX - this.posX; - d12 = this.prevPosZ - this.posZ; - - if (d11 * d11 + d12 * d12 > 0.001D) - { - d4 = (double)((float)(Math.atan2(d12, d11) * 180.0D / Math.PI)); - } - - double d7 = MathHelper.wrapAngleTo180_double(d4 - (double)this.rotationYaw); - - if (d7 > 20.0D) - { - d7 = 20.0D; - } - - if (d7 < -20.0D) - { - d7 = -20.0D; - } - - this.rotationYaw = (float)((double)this.rotationYaw + d7); - this.setRotation(this.rotationYaw, this.rotationPitch); - - if (!this.worldObj.isRemote) - { - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - - if (list != null && !list.isEmpty()) - { - for (int k1 = 0; k1 < list.size(); ++k1) - { - Entity entity = (Entity)list.get(k1); - - if (entity != this.riddenByEntity && entity.canBePushed() && entity instanceof EntityParachute) - { - entity.applyEntityCollision(this); - } - } - } - - if (this.riddenByEntity != null && this.riddenByEntity.isDead) - { - this.riddenByEntity = null; - } - } - } - } - - private boolean isTooHeavy() - { - if(riddenByEntity != null && riddenByEntity instanceof EntityLivingBase) - { - return ArmourCalculator.getTotalWeightOfWorn((EntityLivingBase)riddenByEntity, false) > 100F; - } +public class EntityParachute extends Entity { + /** true if no player in parachute */ + private boolean isParachuteEmpty; + private double speedMultiplier; + private int parachutePosRotationIncrements; + private double parachuteX; + private double parachuteY; + private double parachuteZ; + private double parachuteYaw; + private double parachutePitch; + @SideOnly(Side.CLIENT) + private double velocityX; + @SideOnly(Side.CLIENT) + private double velocityY; + @SideOnly(Side.CLIENT) + private double velocityZ; + + public EntityParachute(World world) { + super(world); + this.isParachuteEmpty = true; + this.speedMultiplier = 0.07D; + this.preventEntitySpawning = true; + this.setSize(2F, 4F); + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they walk + * on. used for spiders and wolves to prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + public boolean canRiderInteract() { return false; } - public void updateRiderPosition() - { - if (this.riddenByEntity != null) - { - double d0 = Math.cos((double)this.rotationYaw * Math.PI / 180.0D) * 0.4D; - double d1 = Math.sin((double)this.rotationYaw * Math.PI / 180.0D) * 0.4D; - this.riddenByEntity.setPosition(this.posX + d0, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ + d1); - } - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - protected void writeEntityToNBT(NBTTagCompound nbt) {} - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - protected void readEntityFromNBT(NBTTagCompound nbt) {} - - @SideOnly(Side.CLIENT) - public float getShadowSize() - { - return 0.0F; - } - - /** - * Takes in the distance the entity has fallen this tick and whether its on the ground to update the fall distance - * and deal fall damage if landing on the ground. Args: distanceFallenThisTick, onGround - */ - protected void updateFallState(double dist, boolean hitGound) - { - int i = MathHelper.floor_double(this.posX); - int j = MathHelper.floor_double(this.posY); - int k = MathHelper.floor_double(this.posZ); - - if (hitGound) - { - if (this.fallDistance > 0.0F || onGround) - { - if (!this.worldObj.isRemote && !this.isDead) - { - this.setDead(); - this.func_145778_a(ToolListMF.parachute, 1, 0.0F); - } - - this.fallDistance = 0.0F; - } - } - else if (this.worldObj.getBlock(i, j - 1, k).getMaterial() != Material.water && dist < 0.0D) - { - this.fallDistance = (float)((double)this.fallDistance - dist); - } - } - - /** - * Sets the damage taken from the last hit. - */ - public void setDamageTaken(float dam) - { - this.dataWatcher.updateObject(19, Float.valueOf(dam)); - } - - /** - * Gets the damage taken from the last hit. - */ - public float getDamageTaken() - { - return this.dataWatcher.getWatchableObjectFloat(19); - } - - /** - * Sets the time to count down from since the last time entity was hit. - */ - public void setTimeSinceHit(int time) - { - this.dataWatcher.updateObject(17, Integer.valueOf(time)); - } - - /** - * Gets the time since the last hit. - */ - public int getTimeSinceHit() - { - return this.dataWatcher.getWatchableObjectInt(17); - } - - /** - * Sets the forward direction of the entity. - */ - public void setForwardDirection(int dir) - { - this.dataWatcher.updateObject(18, Integer.valueOf(dir)); - } - - /** - * Gets the forward direction of the entity. - */ - public int getForwardDirection() - { - return this.dataWatcher.getWatchableObjectInt(18); - } - - /** - * true if no player in parachute - */ - @SideOnly(Side.CLIENT) - public void setIsParachuteEmpty(boolean flag) - { - this.isParachuteEmpty = flag; - } + protected void entityInit() { + this.dataWatcher.addObject(17, new Integer(0)); + this.dataWatcher.addObject(18, new Integer(1)); + this.dataWatcher.addObject(19, new Float(0.0F)); + } + + /** + * Returns a boundingBox used to collide the entity with other entities and + * blocks. This enables the entity to be pushable on contact, like parachutes or + * minecarts. + */ + public AxisAlignedBB getCollisionBox(Entity entity) { + return entity.boundingBox; + } + + /** + * returns the bounding box for this entity + */ + public AxisAlignedBB getBoundingBox() { + return this.boundingBox; + } + + /** + * Returns true if this entity should push and be pushed by other entities when + * colliding. + */ + public boolean canBePushed() { + return true; + } + + public EntityParachute(World world, double x, double y, double z) { + this(world); + this.setPosition(x, y + this.yOffset, z); + this.motionX = 0.0D; + this.motionY = 0.0D; + this.motionZ = 0.0D; + this.prevPosX = x; + this.prevPosY = y; + this.prevPosZ = z; + } + + /** + * Returns the Y offset from the entity's position for any entity riding this + * one. + */ + public double getMountedYOffset() { + return 1D; + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource src, float dam) { + if (this.isEntityInvulnerable()) { + return false; + } else if (!this.worldObj.isRemote && !this.isDead) { + this.setForwardDirection(-this.getForwardDirection()); + this.setTimeSinceHit(10); + this.setDamageTaken(this.getDamageTaken() + dam * 10.0F); + this.setBeenAttacked(); + boolean flag = src.getEntity() instanceof EntityPlayer + && ((EntityPlayer) src.getEntity()).capabilities.isCreativeMode; + + if (flag || this.getDamageTaken() > 20.0F) { + if (this.riddenByEntity != null) { + this.riddenByEntity.mountEntity(this); + } + + if (!flag) { + this.func_145778_a(ToolListMF.parachute, 1, 0.0F); + } + + this.setDead(); + } + + return true; + } else { + return true; + } + } + + /** + * Setups the entity to do the hurt animation. Only used by packets in + * multiplayer. + */ + @SideOnly(Side.CLIENT) + public void performHurtAnimation() { + this.setForwardDirection(-this.getForwardDirection()); + this.setTimeSinceHit(10); + this.setDamageTaken(this.getDamageTaken() * 11.0F); + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + public boolean canBeCollidedWith() { + return !this.isDead; + } + + /** + * Sets the position and rotation. Only difference from the other one is no + * bounding on the rotation. Args: posX, posY, posZ, yaw, pitch + */ + @SideOnly(Side.CLIENT) + public void setPositionAndRotation2(double x, double y, double z, float xr, float yr, int zr) { + if (this.isParachuteEmpty) { + this.parachutePosRotationIncrements = zr + 5; + } else { + double d3 = x - this.posX; + double d4 = y - this.posY; + double d5 = z - this.posZ; + double d6 = d3 * d3 + d4 * d4 + d5 * d5; + + if (d6 <= 1.0D) { + return; + } + + this.parachutePosRotationIncrements = 3; + } + + this.parachuteX = x; + this.parachuteY = y; + this.parachuteZ = z; + this.parachuteYaw = xr; + this.parachutePitch = yr; + this.motionX = this.velocityX; + this.motionY = this.velocityY; + this.motionZ = this.velocityZ; + } + + /** + * Sets the velocity to the args. Args: x, y, z + */ + @SideOnly(Side.CLIENT) + public void setVelocity(double xv, double yv, double zv) { + this.velocityX = this.motionX = xv; + this.velocityY = this.motionY = yv; + this.velocityZ = this.motionZ = zv; + } + + /** + * Called to update the entity's position/logic. + */ + protected void fall(float distance) { + } + + public void onUpdate() { + if (this.riddenByEntity != null) { + riddenByEntity.fallDistance = 0; + // this.rotationYaw = riddenByEntity.rotationYaw; + } + super.onUpdate(); + + if (this.getTimeSinceHit() > 0) { + this.setTimeSinceHit(this.getTimeSinceHit() - 1); + } + + if (this.getDamageTaken() > 0.0F) { + this.setDamageTaken(this.getDamageTaken() - 1.0F); + } + + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + byte b0 = 5; + double d0 = 0.0D; + + for (int i = 0; i < b0; ++i) { + double d1 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (i + 0) / b0 - 0.125D; + double d3 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (i + 1) / b0 - 0.125D; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.boundingBox.minX, d1, this.boundingBox.minZ, + this.boundingBox.maxX, d3, this.boundingBox.maxZ); + + if (this.worldObj.isAABBInMaterial(axisalignedbb, Material.water)) { + d0 += 1.0D / b0; + } + } + + double d10 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); + double d2; + double d4; + double d11; + double d12; + + if (this.worldObj.isRemote && this.isParachuteEmpty) { + if (this.parachutePosRotationIncrements > 0) { + d2 = this.posX + (this.parachuteX - this.posX) / this.parachutePosRotationIncrements; + d4 = this.posY + (this.parachuteY - this.posY) / this.parachutePosRotationIncrements; + d11 = this.posZ + (this.parachuteZ - this.posZ) / this.parachutePosRotationIncrements; + d12 = MathHelper.wrapAngleTo180_double(this.parachuteYaw - this.rotationYaw); + this.rotationYaw = (float) (this.rotationYaw + d12 / this.parachutePosRotationIncrements); + this.rotationPitch = (float) (this.rotationPitch + + (this.parachutePitch - this.rotationPitch) / this.parachutePosRotationIncrements); + --this.parachutePosRotationIncrements; + this.setPosition(d2, d4, d11); + this.setRotation(this.rotationYaw, this.rotationPitch); + } else { + d2 = this.posX + this.motionX; + d4 = this.posY + this.motionY; + d11 = this.posZ + this.motionZ; + this.setPosition(d2, d4, d11); + + if (this.onGround) { + this.motionX *= 0.5D; + this.motionY *= 0.5D; + this.motionZ *= 0.5D; + } + + this.motionX *= 0.9900000095367432D; + this.motionY *= 0.949999988079071D; + this.motionZ *= 0.9900000095367432D; + } + } else { + if (d0 < 1.0D) { + d2 = d0 * 2.0D - 1.0D; + this.motionY += 0.03999999910593033D * d2; + } else { + if (this.motionY < 0.0D) { + this.motionY /= 2.0D; + } + + this.motionY += 0.007000000216066837D; + } + + if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase) { + EntityLivingBase entitylivingbase = (EntityLivingBase) this.riddenByEntity; + float f = this.riddenByEntity.rotationYaw + -entitylivingbase.moveStrafing * 90.0F; + this.motionX += -Math.sin(f * (float) Math.PI / 180.0F) * this.speedMultiplier + * entitylivingbase.moveForward * 0.05000000074505806D; + this.motionZ += Math.cos(f * (float) Math.PI / 180.0F) * this.speedMultiplier + * entitylivingbase.moveForward * 0.05000000074505806D; + } + + d2 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); + + if (d2 > 0.35D) { + d4 = 0.35D / d2; + this.motionX *= d4; + this.motionZ *= d4; + d2 = 0.35D; + } + + if (d2 > d10 && this.speedMultiplier < 0.35D) { + this.speedMultiplier += (0.35D - this.speedMultiplier) / 35.0D; + + if (this.speedMultiplier > 0.35D) { + this.speedMultiplier = 0.35D; + } + } else { + this.speedMultiplier -= (this.speedMultiplier - 0.07D) / 35.0D; + + if (this.speedMultiplier < 0.07D) { + this.speedMultiplier = 0.07D; + } + } + + int l; + + this.motionY *= 0.5D; + if (this.onGround) { + this.motionX *= 0.5D; + this.motionZ *= 0.5D; + } + + this.moveEntity(this.motionX, this.motionY, this.motionZ); + + if ((this.isCollidedHorizontally && d10 > 0D) || isTooHeavy()) { + if (!this.worldObj.isRemote && !this.isDead) { + this.setDead(); + + for (l = 0; l < 3; ++l) { + this.func_145778_a(Item.getItemFromBlock(Blocks.wool), 1, 0.0F); + } + + for (l = 0; l < 2; ++l) { + this.func_145778_a(ComponentListMF.leather_strip, 1, 0.0F); + } + } + } else { + this.motionX *= 0.9900000095367432D; + this.motionY *= 0.949999988079071D; + this.motionZ *= 0.9900000095367432D; + } + + this.rotationPitch = 0.0F; + d4 = this.rotationYaw; + d11 = this.prevPosX - this.posX; + d12 = this.prevPosZ - this.posZ; + + if (d11 * d11 + d12 * d12 > 0.001D) { + d4 = ((float) (Math.atan2(d12, d11) * 180.0D / Math.PI)); + } + + double d7 = MathHelper.wrapAngleTo180_double(d4 - this.rotationYaw); + + if (d7 > 20.0D) { + d7 = 20.0D; + } + + if (d7 < -20.0D) { + d7 = -20.0D; + } + + this.rotationYaw = (float) (this.rotationYaw + d7); + this.setRotation(this.rotationYaw, this.rotationPitch); + + if (!this.worldObj.isRemote) { + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, + this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D)); + + if (list != null && !list.isEmpty()) { + for (int k1 = 0; k1 < list.size(); ++k1) { + Entity entity = (Entity) list.get(k1); + + if (entity != this.riddenByEntity && entity.canBePushed() + && entity instanceof EntityParachute) { + entity.applyEntityCollision(this); + } + } + } + + if (this.riddenByEntity != null && this.riddenByEntity.isDead) { + this.riddenByEntity = null; + } + } + } + } + + private boolean isTooHeavy() { + if (riddenByEntity != null && riddenByEntity instanceof EntityLivingBase) { + return ArmourCalculator.getTotalWeightOfWorn((EntityLivingBase) riddenByEntity, false) > 100F; + } + return false; + } + + public void updateRiderPosition() { + if (this.riddenByEntity != null) { + double d0 = Math.cos(this.rotationYaw * Math.PI / 180.0D) * 0.4D; + double d1 = Math.sin(this.rotationYaw * Math.PI / 180.0D) * 0.4D; + this.riddenByEntity.setPosition(this.posX + d0, + this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ + d1); + } + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + protected void writeEntityToNBT(NBTTagCompound nbt) { + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + protected void readEntityFromNBT(NBTTagCompound nbt) { + } + + @SideOnly(Side.CLIENT) + public float getShadowSize() { + return 0.0F; + } + + /** + * Takes in the distance the entity has fallen this tick and whether its on the + * ground to update the fall distance and deal fall damage if landing on the + * ground. Args: distanceFallenThisTick, onGround + */ + protected void updateFallState(double dist, boolean hitGound) { + int i = MathHelper.floor_double(this.posX); + int j = MathHelper.floor_double(this.posY); + int k = MathHelper.floor_double(this.posZ); + + if (hitGound) { + if (this.fallDistance > 0.0F || onGround) { + if (!this.worldObj.isRemote && !this.isDead) { + this.setDead(); + this.func_145778_a(ToolListMF.parachute, 1, 0.0F); + } + + this.fallDistance = 0.0F; + } + } else if (this.worldObj.getBlock(i, j - 1, k).getMaterial() != Material.water && dist < 0.0D) { + this.fallDistance = (float) (this.fallDistance - dist); + } + } + + /** + * Sets the damage taken from the last hit. + */ + public void setDamageTaken(float dam) { + this.dataWatcher.updateObject(19, Float.valueOf(dam)); + } + + /** + * Gets the damage taken from the last hit. + */ + public float getDamageTaken() { + return this.dataWatcher.getWatchableObjectFloat(19); + } + + /** + * Sets the time to count down from since the last time entity was hit. + */ + public void setTimeSinceHit(int time) { + this.dataWatcher.updateObject(17, Integer.valueOf(time)); + } + + /** + * Gets the time since the last hit. + */ + public int getTimeSinceHit() { + return this.dataWatcher.getWatchableObjectInt(17); + } + + /** + * Sets the forward direction of the entity. + */ + public void setForwardDirection(int dir) { + this.dataWatcher.updateObject(18, Integer.valueOf(dir)); + } + + /** + * Gets the forward direction of the entity. + */ + public int getForwardDirection() { + return this.dataWatcher.getWatchableObjectInt(18); + } + + /** + * true if no player in parachute + */ + @SideOnly(Side.CLIENT) + public void setIsParachuteEmpty(boolean flag) { + this.isParachuteEmpty = flag; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityShrapnel.java b/src/main/java/minefantasy/mf2/entity/EntityShrapnel.java index b5baa471..bfb6d0b2 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityShrapnel.java +++ b/src/main/java/minefantasy/mf2/entity/EntityShrapnel.java @@ -2,6 +2,8 @@ import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.weapon.IDamageType; import net.minecraft.block.Block; import net.minecraft.entity.Entity; @@ -13,312 +15,285 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class EntityShrapnel extends Entity implements IDamageType -{ - private int field_145795_e = -1; - private int field_145793_f = -1; - private int field_145794_g = -1; - private Block field_145796_h; - private boolean inGround; - public EntityLivingBase shootingEntity; - private int ticksAlive; - private int ticksInAir; - public double accelerationX; - public double accelerationY; - public double accelerationZ; - - public EntityShrapnel(World world) - { - super(world); - this.setSize(0.5F, 0.5F); - } - - @Override - protected void entityInit() {} - - /** - * Checks if the entity is in range to render by using the past in distance and comparing it to its average edge - * length * 64 * renderDistanceWeight Args: distance - */ - @Override +public class EntityShrapnel extends Entity implements IDamageType { + private int field_145795_e = -1; + private int field_145793_f = -1; + private int field_145794_g = -1; + private Block field_145796_h; + private boolean inGround; + public EntityLivingBase shootingEntity; + private int ticksAlive; + private int ticksInAir; + public double accelerationX; + public double accelerationY; + public double accelerationZ; + + public EntityShrapnel(World world) { + super(world); + this.setSize(0.5F, 0.5F); + } + + @Override + protected void entityInit() { + } + + /** + * Checks if the entity is in range to render by using the past in distance and + * comparing it to its average edge length * 64 * renderDistanceWeight Args: + * distance + */ + @Override @SideOnly(Side.CLIENT) - public boolean isInRangeToRenderDist(double dist) - { - double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D; - d1 *= 64.0D; - return dist < d1 * d1; - } - - public EntityShrapnel(World world, double x, double y, double z, double xv, double yv, double zv) - { - super(world); - this.setSize(1.0F, 1.0F); - this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); - this.setPosition(x, y, z); - double d6 = MathHelper.sqrt_double(xv * xv + yv * yv + zv * zv); - this.accelerationX = xv / d6 * 0.1D; - this.accelerationY = yv / d6 * 0.1D; - this.accelerationZ = zv / d6 * 0.1D; - } - - public EntityShrapnel(World world, EntityLivingBase shooter, double x, double y, double z) - { - super(world); - this.shootingEntity = shooter; - this.setSize(1.0F, 1.0F); - this.setLocationAndAngles(shooter.posX, shooter.posY, shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); - this.setPosition(this.posX, this.posY, this.posZ); - this.yOffset = 0.0F; - this.motionX = this.motionY = this.motionZ = 0.0D; - x += this.rand.nextGaussian() * 0.4D; - y += this.rand.nextGaussian() * 0.4D; - z += this.rand.nextGaussian() * 0.4D; - double d3 = MathHelper.sqrt_double(x * x + y * y + z * z); - this.accelerationX = x / d3 * 0.1D; - this.accelerationY = y / d3 * 0.1D; - this.accelerationZ = z / d3 * 0.1D; - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() - { - if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead || !this.worldObj.blockExists((int)this.posX, (int)this.posY, (int)this.posZ))) - { - this.setDead(); - } - else - { - super.onUpdate(); - - if (this.inGround) - { - this.setDead(); - this.inGround = false; - this.motionX *= this.rand.nextFloat() * 0.2F; - this.motionY *= this.rand.nextFloat() * 0.2F; - this.motionZ *= this.rand.nextFloat() * 0.2F; - this.ticksAlive = 0; - this.ticksInAir = 0; - return; - } - else - { - ++this.ticksInAir; - if(ticksInAir >= 10)setDead(); - } - - Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31); - vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - - if (movingobjectposition != null) - { - vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord); - } - - Entity entity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - - for (int i = 0; i < list.size(); ++i) - { - Entity entity1 = (Entity)list.get(i); - - if (entity1.canBeCollidedWith() && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) - { - float f = 0.3F; - AxisAlignedBB axisalignedbb = entity1.boundingBox.expand(f, f, f); - MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31); - - if (movingobjectposition1 != null) - { - double d1 = vec3.distanceTo(movingobjectposition1.hitVec); - - if (d1 < d0 || d0 == 0.0D) - { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) - { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null) - { - this.onImpact(movingobjectposition); - } - - this.posX += this.motionX; - this.posY += this.motionY; - this.posZ += this.motionZ; - float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.rotationYaw = (float)(Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F; - - for (this.rotationPitch = (float)(Math.atan2(f1, this.motionY) * 180.0D / Math.PI) - 90.0F; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) - { - ; - } - - while (this.rotationPitch - this.prevRotationPitch >= 180.0F) - { - this.prevRotationPitch += 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw < -180.0F) - { - this.prevRotationYaw -= 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw >= 180.0F) - { - this.prevRotationYaw += 360.0F; - } - - this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; - this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; - float f2 = this.getMotionFactor(); - - if (this.isInWater()) - { - for (int j = 0; j < 4; ++j) - { - float f3 = 0.25F; - this.worldObj.spawnParticle("bubble", this.posX - this.motionX * f3, this.posY - this.motionY * f3, this.posZ - this.motionZ * f3, this.motionX, this.motionY, this.motionZ); - } - - f2 = 0.8F; - } - - this.motionX += this.accelerationX; - this.motionY += this.accelerationY; - this.motionZ += this.accelerationZ; - this.motionX *= f2; - this.motionY *= f2; - this.motionZ *= f2; - this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); - this.setPosition(this.posX, this.posY, this.posZ); - } - } - - /** - * Return the motion factor for this projectile. The factor is multiplied by the original motion. - */ - protected float getMotionFactor() - { - return 0.95F; - } - - /** - * Called when this EntityFireball hits a block or entity. - */ - protected void onImpact(MovingObjectPosition hitPos) - { - if (isBurning() && hitPos.entityHit != null) - { - hitPos.entityHit.setFire(1); - } - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound p_70014_1_) - { - p_70014_1_.setShort("xTile", (short)this.field_145795_e); - p_70014_1_.setShort("yTile", (short)this.field_145793_f); - p_70014_1_.setShort("zTile", (short)this.field_145794_g); - p_70014_1_.setByte("inTile", (byte)Block.getIdFromBlock(this.field_145796_h)); - p_70014_1_.setByte("inGround", (byte)(this.inGround ? 1 : 0)); - p_70014_1_.setTag("direction", this.newDoubleNBTList(new double[] {this.motionX, this.motionY, this.motionZ})); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound p_70037_1_) - { - this.field_145795_e = p_70037_1_.getShort("xTile"); - this.field_145793_f = p_70037_1_.getShort("yTile"); - this.field_145794_g = p_70037_1_.getShort("zTile"); - this.field_145796_h = Block.getBlockById(p_70037_1_.getByte("inTile") & 255); - this.inGround = p_70037_1_.getByte("inGround") == 1; - - if (p_70037_1_.hasKey("direction", 9)) - { - NBTTagList nbttaglist = p_70037_1_.getTagList("direction", 6); - this.motionX = nbttaglist.func_150309_d(0); - this.motionY = nbttaglist.func_150309_d(1); - this.motionZ = nbttaglist.func_150309_d(2); - } - else - { - this.setDead(); - } - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - @Override - public boolean canBeCollidedWith() - { - return true; - } - - @Override - public float getCollisionBorderSize() - { - return 1.0F; - } - - @Override + public boolean isInRangeToRenderDist(double dist) { + double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D; + d1 *= 64.0D; + return dist < d1 * d1; + } + + public EntityShrapnel(World world, double x, double y, double z, double xv, double yv, double zv) { + super(world); + this.setSize(1.0F, 1.0F); + this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); + this.setPosition(x, y, z); + double d6 = MathHelper.sqrt_double(xv * xv + yv * yv + zv * zv); + this.accelerationX = xv / d6 * 0.1D; + this.accelerationY = yv / d6 * 0.1D; + this.accelerationZ = zv / d6 * 0.1D; + } + + public EntityShrapnel(World world, EntityLivingBase shooter, double x, double y, double z) { + super(world); + this.shootingEntity = shooter; + this.setSize(1.0F, 1.0F); + this.setLocationAndAngles(shooter.posX, shooter.posY, shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = this.motionY = this.motionZ = 0.0D; + x += this.rand.nextGaussian() * 0.4D; + y += this.rand.nextGaussian() * 0.4D; + z += this.rand.nextGaussian() * 0.4D; + double d3 = MathHelper.sqrt_double(x * x + y * y + z * z); + this.accelerationX = x / d3 * 0.1D; + this.accelerationY = y / d3 * 0.1D; + this.accelerationZ = z / d3 * 0.1D; + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead + || !this.worldObj.blockExists((int) this.posX, (int) this.posY, (int) this.posZ))) { + this.setDead(); + } else { + super.onUpdate(); + + if (this.inGround) { + this.setDead(); + this.inGround = false; + this.motionX *= this.rand.nextFloat() * 0.2F; + this.motionY *= this.rand.nextFloat() * 0.2F; + this.motionZ *= this.rand.nextFloat() * 0.2F; + this.ticksAlive = 0; + this.ticksInAir = 0; + return; + } else { + ++this.ticksInAir; + if (ticksInAir >= 10) + setDead(); + } + + Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31); + vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + + if (movingobjectposition != null) { + vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, + movingobjectposition.hitVec.zCoord); + } + + Entity entity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, + this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double d0 = 0.0D; + + for (int i = 0; i < list.size(); ++i) { + Entity entity1 = (Entity) list.get(i); + + if (entity1.canBeCollidedWith() + && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) { + float f = 0.3F; + AxisAlignedBB axisalignedbb = entity1.boundingBox.expand(f, f, f); + MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31); + + if (movingobjectposition1 != null) { + double d1 = vec3.distanceTo(movingobjectposition1.hitVec); + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; + d0 = d1; + } + } + } + } + + if (entity != null) { + movingobjectposition = new MovingObjectPosition(entity); + } + + if (movingobjectposition != null) { + this.onImpact(movingobjectposition); + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float) (Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F; + + for (this.rotationPitch = (float) (Math.atan2(f1, this.motionY) * 180.0D / Math.PI) + - 90.0F; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + ; + } + + while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float f2 = this.getMotionFactor(); + + if (this.isInWater()) { + for (int j = 0; j < 4; ++j) { + float f3 = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * f3, this.posY - this.motionY * f3, + this.posZ - this.motionZ * f3, this.motionX, this.motionY, this.motionZ); + } + + f2 = 0.8F; + } + + this.motionX += this.accelerationX; + this.motionY += this.accelerationY; + this.motionZ += this.accelerationZ; + this.motionX *= f2; + this.motionY *= f2; + this.motionZ *= f2; + this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); + this.setPosition(this.posX, this.posY, this.posZ); + } + } + + /** + * Return the motion factor for this projectile. The factor is multiplied by the + * original motion. + */ + protected float getMotionFactor() { + return 0.95F; + } + + /** + * Called when this EntityFireball hits a block or entity. + */ + protected void onImpact(MovingObjectPosition hitPos) { + if (isBurning() && hitPos.entityHit != null) { + hitPos.entityHit.setFire(1); + } + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + public void writeEntityToNBT(NBTTagCompound p_70014_1_) { + p_70014_1_.setShort("xTile", (short) this.field_145795_e); + p_70014_1_.setShort("yTile", (short) this.field_145793_f); + p_70014_1_.setShort("zTile", (short) this.field_145794_g); + p_70014_1_.setByte("inTile", (byte) Block.getIdFromBlock(this.field_145796_h)); + p_70014_1_.setByte("inGround", (byte) (this.inGround ? 1 : 0)); + p_70014_1_.setTag("direction", + this.newDoubleNBTList(new double[] { this.motionX, this.motionY, this.motionZ })); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + public void readEntityFromNBT(NBTTagCompound p_70037_1_) { + this.field_145795_e = p_70037_1_.getShort("xTile"); + this.field_145793_f = p_70037_1_.getShort("yTile"); + this.field_145794_g = p_70037_1_.getShort("zTile"); + this.field_145796_h = Block.getBlockById(p_70037_1_.getByte("inTile") & 255); + this.inGround = p_70037_1_.getByte("inGround") == 1; + + if (p_70037_1_.hasKey("direction", 9)) { + NBTTagList nbttaglist = p_70037_1_.getTagList("direction", 6); + this.motionX = nbttaglist.func_150309_d(0); + this.motionY = nbttaglist.func_150309_d(1); + this.motionZ = nbttaglist.func_150309_d(2); + } else { + this.setDead(); + } + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public float getCollisionBorderSize() { + return 1.0F; + } + + @Override @SideOnly(Side.CLIENT) - public float getShadowSize() - { - return 0.0F; - } - - /** - * Gets how bright this entity is. - */ - @Override - public float getBrightness(float p_70013_1_) - { - return 1.0F; - } - - @Override + public float getShadowSize() { + return 0.0F; + } + + /** + * Gets how bright this entity is. + */ + @Override + public float getBrightness(float p_70013_1_) { + return 1.0F; + } + + @Override + @SideOnly(Side.CLIENT) + public int getBrightnessForRender(float p_70070_1_) { + return 15728880; + } + @SideOnly(Side.CLIENT) - public int getBrightnessForRender(float p_70070_1_) - { - return 15728880; - } - - @SideOnly(Side.CLIENT) - public String getTexture() - { + public String getTexture() { return isBurning() ? "fireshrapnel" : "shrapnel"; } @Override - public float[] getDamageRatio(Object... implement) - { - return isBurning() ? new float[]{0, 1, 0} : new float[]{0, 1, 1};//50/50 blunt and piercing, fire bombs are full blunt + public float[] getDamageRatio(Object... implement) { + return isBurning() ? new float[] { 0, 1, 0 } : new float[] { 0, 1, 1 };// 50/50 blunt and piercing, fire bombs + // are full blunt } @Override diff --git a/src/main/java/minefantasy/mf2/entity/EntitySmoke.java b/src/main/java/minefantasy/mf2/entity/EntitySmoke.java index 77e05c31..70081b78 100644 --- a/src/main/java/minefantasy/mf2/entity/EntitySmoke.java +++ b/src/main/java/minefantasy/mf2/entity/EntitySmoke.java @@ -24,334 +24,296 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class EntitySmoke extends Entity -{ - private int field_145795_e = -1; - private int field_145793_f = -1; - private int field_145794_g = -1; - private Block field_145796_h; - private boolean inGround; - public EntityLivingBase shootingEntity; - private int ticksAlive; - private int ticksInAir; - public double accelerationX; - public double accelerationY; - public double accelerationZ; - - public EntitySmoke(World world) - { - super(world); - this.setSize(0.2F, 0.2F); - } - @Override - protected boolean canTriggerWalking() - { - return false; - } - @Override - public boolean canAttackWithItem() - { - return false; - } - - protected void entityInit() {} - - /** - * Checks if the entity is in range to render by using the past in distance and comparing it to its average edge - * length * 64 * renderDistanceWeight Args: distance - */ - @SideOnly(Side.CLIENT) - public boolean isInRangeToRenderDist(double dist) - { - double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D; - d1 *= 64.0D; - return dist < d1 * d1; - } - - public EntitySmoke(World world, double x, double y, double z, double xv, double yv, double zv) - { - super(world); - noClip = false; - this.setSize(0.5F, 0.5F); - this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); - this.setPosition(x, y, z); - double d6 = (double)MathHelper.sqrt_double(xv * xv + yv * yv + zv * zv); - this.accelerationX = xv / d6 * 0.1D; - this.accelerationY = yv / d6 * 0.1D; - this.accelerationZ = zv / d6 * 0.1D; - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead || !this.worldObj.blockExists((int)this.posX, (int)this.posY, (int)this.posZ))) - { - this.setDead(); - } - else - { - super.onUpdate(); - - if (this.inGround) - { - if (this.worldObj.getBlock(this.field_145795_e, this.field_145793_f, this.field_145794_g) == this.field_145796_h) - { - ++this.ticksAlive; - - if (this.ticksAlive == 600) - { - this.setDead(); - } - - return; - } - - this.inGround = false; - this.motionX *= (double)(this.rand.nextFloat() * 0.2F); - this.motionY *= (double)(this.rand.nextFloat() * 0.2F); - this.motionZ *= (double)(this.rand.nextFloat() * 0.2F); - this.ticksAlive = 0; - this.ticksInAir = 0; - } - else - { - ++this.ticksInAir; - } - - Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31); - vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - - if (movingobjectposition != null) - { - vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord); - } - - Entity entity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - - for (int i = 0; i < list.size(); ++i) - { - Entity entity1 = (Entity)list.get(i); - - if (entity1.canBeCollidedWith() && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) - { - float f = 0.3F; - AxisAlignedBB axisalignedbb = entity1.boundingBox.expand((double)f, (double)f, (double)f); - MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31); - - if (movingobjectposition1 != null) - { - double d1 = vec3.distanceTo(movingobjectposition1.hitVec); - - if (d1 < d0 || d0 == 0.0D) - { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) - { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null) - { - this.onImpact(movingobjectposition); - } - - this.posX += this.motionX; - this.posY += this.motionY; - this.posZ += this.motionZ; - float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.rotationYaw = (float)(Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F; - - for (this.rotationPitch = (float)(Math.atan2((double)f1, this.motionY) * 180.0D / Math.PI) - 90.0F; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) - { - ; - } - - while (this.rotationPitch - this.prevRotationPitch >= 180.0F) - { - this.prevRotationPitch += 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw < -180.0F) - { - this.prevRotationYaw -= 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw >= 180.0F) - { - this.prevRotationYaw += 360.0F; - } - - this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; - this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; - float f2 = this.getMotionFactor(); - - if (this.isInWater()) - { - f2 = 0.8F; - } - - double floating = 0.01F; - this.motionX += this.accelerationX; - this.motionY += this.accelerationY + floating; - this.motionZ += this.accelerationZ; - - double slowdownRate = 0.5F; - this.accelerationX *= slowdownRate; - this.accelerationY *= slowdownRate; - this.accelerationZ *= slowdownRate; - - this.motionX *= (double)f2; - this.motionY *= (double)f2; - this.motionZ *= (double)f2; - this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); - this.setPosition(this.posX, this.posY, this.posZ); - } - } - - /** - * Return the motion factor for this projectile. The factor is multiplied by the original motion. - */ - protected float getMotionFactor() - { - return 0.95F; - } - - /** - * Called when this EntityFireball hits a block or entity. - */ - protected void onImpact(MovingObjectPosition pos) - { - if (!this.worldObj.isRemote) - { - if (pos.entityHit != null) - { - if(pos.entityHit instanceof EntityLivingBase && !worldObj.isRemote) - { - EntityLivingBase hit = (EntityLivingBase)pos.entityHit; - - if(canPoison(hit, rand)) - { - hit.addPotionEffect(new PotionEffect(Potion.hunger.id, 20, 0)); - if(rand.nextInt(20) == 0) - { - if(hit.getActivePotionEffect(Potion.blindness) != null) - { - hit.addPotionEffect(new PotionEffect(Potion.wither.id, 200, 0)); - } - else if(hit.getActivePotionEffect(Potion.confusion) != null) - { - hit.addPotionEffect(new PotionEffect(Potion.blindness.id, 200, 0)); - } - else - { - hit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 0)); - } - } - } - } - } - if(pos.typeOfHit == MovingObjectType.BLOCK) - { - setDead(); - } - } - } - - public static boolean canPoison(Entity hit, Random rand) - { - if(!(hit instanceof EntityLivingBase))return false; - - ItemStack helmet = ((EntityLivingBase)hit).getEquipmentInSlot(4); - if(helmet != null && helmet.getItem() instanceof IGasProtector) - { - float prot = ((IGasProtector)helmet.getItem()).getGasProtection(helmet); - if(prot >= 100F || rand.nextFloat()*100 < prot) - { - return false; - } - } - if(PowerArmour.isWearingCogwork( (EntityLivingBase)hit)) - { - return false; - } - return ((EntityLivingBase)hit).getCreatureAttribute() != EnumCreatureAttribute.UNDEAD; +public class EntitySmoke extends Entity { + private int field_145795_e = -1; + private int field_145793_f = -1; + private int field_145794_g = -1; + private Block field_145796_h; + private boolean inGround; + public EntityLivingBase shootingEntity; + private int ticksAlive; + private int ticksInAir; + public double accelerationX; + public double accelerationY; + public double accelerationZ; + + public EntitySmoke(World world) { + super(world); + this.setSize(0.2F, 0.2F); + } + + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + public boolean canAttackWithItem() { + return false; + } + + protected void entityInit() { + } + + /** + * Checks if the entity is in range to render by using the past in distance and + * comparing it to its average edge length * 64 * renderDistanceWeight Args: + * distance + */ + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double dist) { + double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D; + d1 *= 64.0D; + return dist < d1 * d1; + } + + public EntitySmoke(World world, double x, double y, double z, double xv, double yv, double zv) { + super(world); + noClip = false; + this.setSize(0.5F, 0.5F); + this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); + this.setPosition(x, y, z); + double d6 = MathHelper.sqrt_double(xv * xv + yv * yv + zv * zv); + this.accelerationX = xv / d6 * 0.1D; + this.accelerationY = yv / d6 * 0.1D; + this.accelerationZ = zv / d6 * 0.1D; + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() { + if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead + || !this.worldObj.blockExists((int) this.posX, (int) this.posY, (int) this.posZ))) { + this.setDead(); + } else { + super.onUpdate(); + + if (this.inGround) { + if (this.worldObj.getBlock(this.field_145795_e, this.field_145793_f, + this.field_145794_g) == this.field_145796_h) { + ++this.ticksAlive; + + if (this.ticksAlive == 600) { + this.setDead(); + } + + return; + } + + this.inGround = false; + this.motionX *= this.rand.nextFloat() * 0.2F; + this.motionY *= this.rand.nextFloat() * 0.2F; + this.motionZ *= this.rand.nextFloat() * 0.2F; + this.ticksAlive = 0; + this.ticksInAir = 0; + } else { + ++this.ticksInAir; + } + + Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31); + vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + + if (movingobjectposition != null) { + vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, + movingobjectposition.hitVec.zCoord); + } + + Entity entity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, + this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double d0 = 0.0D; + + for (int i = 0; i < list.size(); ++i) { + Entity entity1 = (Entity) list.get(i); + + if (entity1.canBeCollidedWith() + && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) { + float f = 0.3F; + AxisAlignedBB axisalignedbb = entity1.boundingBox.expand(f, f, f); + MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31); + + if (movingobjectposition1 != null) { + double d1 = vec3.distanceTo(movingobjectposition1.hitVec); + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; + d0 = d1; + } + } + } + } + + if (entity != null) { + movingobjectposition = new MovingObjectPosition(entity); + } + + if (movingobjectposition != null) { + this.onImpact(movingobjectposition); + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float) (Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F; + + for (this.rotationPitch = (float) (Math.atan2(f1, this.motionY) * 180.0D / Math.PI) + - 90.0F; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + ; + } + + while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float f2 = this.getMotionFactor(); + + if (this.isInWater()) { + f2 = 0.8F; + } + + double floating = 0.01F; + this.motionX += this.accelerationX; + this.motionY += this.accelerationY + floating; + this.motionZ += this.accelerationZ; + + double slowdownRate = 0.5F; + this.accelerationX *= slowdownRate; + this.accelerationY *= slowdownRate; + this.accelerationZ *= slowdownRate; + + this.motionX *= f2; + this.motionY *= f2; + this.motionZ *= f2; + this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); + this.setPosition(this.posX, this.posY, this.posZ); + } + } + + /** + * Return the motion factor for this projectile. The factor is multiplied by the + * original motion. + */ + protected float getMotionFactor() { + return 0.95F; + } + + /** + * Called when this EntityFireball hits a block or entity. + */ + protected void onImpact(MovingObjectPosition pos) { + if (!this.worldObj.isRemote) { + if (pos.entityHit != null) { + if (pos.entityHit instanceof EntityLivingBase && !worldObj.isRemote) { + EntityLivingBase hit = (EntityLivingBase) pos.entityHit; + + if (canPoison(hit, rand)) { + hit.addPotionEffect(new PotionEffect(Potion.hunger.id, 20, 0)); + if (rand.nextInt(20) == 0) { + if (hit.getActivePotionEffect(Potion.blindness) != null) { + hit.addPotionEffect(new PotionEffect(Potion.wither.id, 200, 0)); + } else if (hit.getActivePotionEffect(Potion.confusion) != null) { + hit.addPotionEffect(new PotionEffect(Potion.blindness.id, 200, 0)); + } else { + hit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 0)); + } + } + } + } + } + if (pos.typeOfHit == MovingObjectType.BLOCK) { + setDead(); + } + } + } + + public static boolean canPoison(Entity hit, Random rand) { + if (!(hit instanceof EntityLivingBase)) + return false; + + ItemStack helmet = ((EntityLivingBase) hit).getEquipmentInSlot(4); + if (helmet != null && helmet.getItem() instanceof IGasProtector) { + float prot = ((IGasProtector) helmet.getItem()).getGasProtection(helmet); + if (prot >= 100F || rand.nextFloat() * 100 < prot) { + return false; + } + } + if (PowerArmour.isWearingCogwork((EntityLivingBase) hit)) { + return false; + } + return ((EntityLivingBase) hit).getCreatureAttribute() != EnumCreatureAttribute.UNDEAD; + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setShort("xTile", (short) this.field_145795_e); + nbt.setShort("yTile", (short) this.field_145793_f); + nbt.setShort("zTile", (short) this.field_145794_g); + nbt.setByte("inTile", (byte) Block.getIdFromBlock(this.field_145796_h)); + nbt.setByte("inGround", (byte) (this.inGround ? 1 : 0)); + nbt.setTag("direction", this.newDoubleNBTList(new double[] { this.motionX, this.motionY, this.motionZ })); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound nbt) { + this.field_145795_e = nbt.getShort("xTile"); + this.field_145793_f = nbt.getShort("yTile"); + this.field_145794_g = nbt.getShort("zTile"); + this.field_145796_h = Block.getBlockById(nbt.getByte("inTile") & 255); + this.inGround = nbt.getByte("inGround") == 1; + + if (nbt.hasKey("direction", 9)) { + NBTTagList nbttaglist = nbt.getTagList("direction", 6); + this.motionX = nbttaglist.func_150309_d(0); + this.motionY = nbttaglist.func_150309_d(1); + this.motionZ = nbttaglist.func_150309_d(2); + } else { + this.setDead(); + } } /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - public void writeEntityToNBT(NBTTagCompound nbt) - { - nbt.setShort("xTile", (short)this.field_145795_e); - nbt.setShort("yTile", (short)this.field_145793_f); - nbt.setShort("zTile", (short)this.field_145794_g); - nbt.setByte("inTile", (byte)Block.getIdFromBlock(this.field_145796_h)); - nbt.setByte("inGround", (byte)(this.inGround ? 1 : 0)); - nbt.setTag("direction", this.newDoubleNBTList(new double[] {this.motionX, this.motionY, this.motionZ})); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - public void readEntityFromNBT(NBTTagCompound nbt) - { - this.field_145795_e = nbt.getShort("xTile"); - this.field_145793_f = nbt.getShort("yTile"); - this.field_145794_g = nbt.getShort("zTile"); - this.field_145796_h = Block.getBlockById(nbt.getByte("inTile") & 255); - this.inGround = nbt.getByte("inGround") == 1; - - if (nbt.hasKey("direction", 9)) - { - NBTTagList nbttaglist = nbt.getTagList("direction", 6); - this.motionX = nbttaglist.func_150309_d(0); - this.motionY = nbttaglist.func_150309_d(1); - this.motionZ = nbttaglist.func_150309_d(2); - } - else - { - this.setDead(); - } - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - @Override - public boolean canBeCollidedWith() - { - return false; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource source, float amount) - { - return false; - } - - @SideOnly(Side.CLIENT) - public float getShadowSize() - { - return 1.0F; - } - - @Override - public void setFire(int i) - { - } + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + @Override + public boolean canBeCollidedWith() { + return false; + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource source, float amount) { + return false; + } + + @SideOnly(Side.CLIENT) + public float getShadowSize() { + return 1.0F; + } + + @Override + public void setFire(int i) { + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/Shockwave.java b/src/main/java/minefantasy/mf2/entity/Shockwave.java index dc0d25a0..30c16f51 100644 --- a/src/main/java/minefantasy/mf2/entity/Shockwave.java +++ b/src/main/java/minefantasy/mf2/entity/Shockwave.java @@ -7,13 +7,12 @@ import java.util.List; import java.util.Map; import java.util.Random; + import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.enchantment.EnchantmentProtection; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.item.EntityTNTPrimed; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.util.AxisAlignedBB; @@ -24,236 +23,216 @@ import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; -public class Shockwave -{//Explosion - /** whether or not the explosion sets fire to blocks around it */ - public boolean isFlaming; - /** whether or not this explosion spawns smoke particles */ - public boolean isSmoking = true; - public boolean isGriefing = true; - private int maxRange = 16; - private Random explosionRNG = new Random(); - private World worldObj; - public double explosionX; - public double explosionY; - public double explosionZ; - public Entity exploder; - public float explosionSize; - /** A list of ChunkPositions of blocks affected by this explosion */ - public List affectedBlockPositions = new ArrayList(); - private Map field_77288_k = new HashMap(); - private String type; - - public Shockwave(String type, World world, Entity cause, double x, double y, double z, float power) - { - this.worldObj = world; - this.exploder = cause; - this.explosionSize = power; - this.explosionX = x; - this.explosionY = y; - this.explosionZ = z; - this.type = type; - } - - /** - * Does the first part of the explosion (destroy blocks) - */ - public void initiate() - { - float f = this.explosionSize; - HashSet hashset = new HashSet(); - int i; - int j; - int k; - double d5; - double d6; - double d7; - - for (i = 0; i < this.maxRange; ++i) - { - for (j = 0; j < this.maxRange; ++j) - { - for (k = 0; k < this.maxRange; ++k) - { - if (i == 0 || i == this.maxRange - 1 || j == 0 || j == this.maxRange - 1 || k == 0 || k == this.maxRange - 1) - { - double d0 = (double)((float)i / ((float)this.maxRange - 1.0F) * 2.0F - 1.0F); - double d1 = (double)((float)j / ((float)this.maxRange - 1.0F) * 2.0F - 1.0F); - double d2 = (double)((float)k / ((float)this.maxRange - 1.0F) * 2.0F - 1.0F); - double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - d0 /= d3; - d1 /= d3; - d2 /= d3; - float f1 = this.explosionSize * (0.7F + this.worldObj.rand.nextFloat() * 0.6F); - d5 = this.explosionX; - d6 = this.explosionY; - d7 = this.explosionZ; - - for (float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) - { - int j1 = MathHelper.floor_double(d5); - int k1 = MathHelper.floor_double(d6); - int l1 = MathHelper.floor_double(d7); - Block block = this.worldObj.getBlock(j1, k1, l1); - - if (block.getMaterial() == Material.glass) - { - hashset.add(new ChunkPosition(j1, k1, l1)); - } - - d5 += d0 * (double)f2; - d6 += d1 * (double)f2; - d7 += d2 * (double)f2; - } - } - } - } - } - - this.affectedBlockPositions.addAll(hashset); - this.explosionSize *= 2.0F; - i = MathHelper.floor_double(this.explosionX - (double)this.explosionSize - 1.0D); - j = MathHelper.floor_double(this.explosionX + (double)this.explosionSize + 1.0D); - k = MathHelper.floor_double(this.explosionY - (double)this.explosionSize - 1.0D); - int i2 = MathHelper.floor_double(this.explosionY + (double)this.explosionSize + 1.0D); - int l = MathHelper.floor_double(this.explosionZ - (double)this.explosionSize - 1.0D); - int j2 = MathHelper.floor_double(this.explosionZ + (double)this.explosionSize + 1.0D); - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.exploder, AxisAlignedBB.getBoundingBox((double)i, (double)k, (double)l, (double)j, (double)i2, (double)j2)); - Vec3 vec3 = Vec3.createVectorHelper(this.explosionX, this.explosionY, this.explosionZ); - - for (int i1 = 0; i1 < list.size(); ++i1) - { - Entity entity = (Entity)list.get(i1); - double d4 = entity.getDistance(this.explosionX, this.explosionY, this.explosionZ) / (double)this.explosionSize; - - if (d4 <= 1.0D && !(entity instanceof EntityItem)) - { - d5 = entity.posX - this.explosionX; - d6 = entity.posY + (double)entity.getEyeHeight() - this.explosionY; - d7 = entity.posZ - this.explosionZ; - double d9 = (double)MathHelper.sqrt_double(d5 * d5 + d6 * d6 + d7 * d7); - - if (d9 != 0.0D) - { - d5 /= d9; - d6 /= d9; - d7 /= d9; - double d10 = (double)this.worldObj.getBlockDensity(vec3, entity.boundingBox); - double d11 = (1.0D - d4) * d10; - float damage = (float)((int)((d11 * d11 + d11) / 2.0D * 8.0D * (double)this.explosionSize + 1.0D)); - entity.attackEntityFrom(getExplosionSource(), Math.min(64F, 4F + (damage/2F))); - double d8 = EnchantmentProtection.func_92092_a(entity, d11); - entity.motionX += d5 * d8; - entity.motionY += d6 * d8; - entity.motionZ += d7 * d8; - - if (entity instanceof EntityPlayer) - { - this.field_77288_k.put((EntityPlayer)entity, Vec3.createVectorHelper(d5 * d11, d6 * d11, d7 * d11)); - } - } - } - } - - this.explosionSize = f; - } - - /** - * Does the second part of the explosion (sound, particles, drop spawn) - */ - public void decorateWave(boolean flag) - { - this.worldObj.playSoundEffect(this.explosionX, this.explosionY, this.explosionZ, "random.explode", 4.0F, (1.0F + (this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F) * 0.7F); - - if (this.explosionSize >= 2.0F && this.isSmoking) - { - this.worldObj.spawnParticle("largesmoke", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D); - } - else - { - this.worldObj.spawnParticle("smoke", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D); - } - - Iterator iterator; - ChunkPosition chunkposition; - int i; - int j; - int k; - Block block; - - if (this.isSmoking) - { - iterator = this.affectedBlockPositions.iterator(); - - while (iterator.hasNext()) - { - chunkposition = (ChunkPosition)iterator.next(); - i = chunkposition.chunkPosX; - j = chunkposition.chunkPosY; - k = chunkposition.chunkPosZ; - block = this.worldObj.getBlock(i, j, k); - - if (flag) - { - double d0 = (double)((float)i + this.worldObj.rand.nextFloat()); - double d1 = (double)((float)j + this.worldObj.rand.nextFloat()); - double d2 = (double)((float)k + this.worldObj.rand.nextFloat()); - double d3 = d0 - this.explosionX; - double d4 = d1 - this.explosionY; - double d5 = d2 - this.explosionZ; - double d6 = (double)MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5); - d3 /= d6; - d4 /= d6; - d5 /= d6; - double d7 = 0.5D / (d6 / (double)this.explosionSize + 0.1D); - d7 *= (double)(this.worldObj.rand.nextFloat() * this.worldObj.rand.nextFloat() + 0.3F); - d3 *= d7; - d4 *= d7; - d5 *= d7; - this.worldObj.spawnParticle("explode", (d0 + this.explosionX * 1.0D) / 2.0D, (d1 + this.explosionY * 1.0D) / 2.0D, (d2 + this.explosionZ * 1.0D) / 2.0D, d3, d4, d5); - this.worldObj.spawnParticle("smoke", d0, d1, d2, d3, d4, d5); - } - - if (isGriefing && block.getMaterial() == Material.glass) - { - this.worldObj.setBlockToAir(i, j, k); - this.worldObj.playSoundEffect(i, j, k, "break.glass", 1.0F, 0.75F+(explosionRNG.nextFloat()*0.5F)); - } - } - } - - if (this.isFlaming) - { - iterator = this.affectedBlockPositions.iterator(); - - while (iterator.hasNext()) - { - chunkposition = (ChunkPosition)iterator.next(); - i = chunkposition.chunkPosX; - j = chunkposition.chunkPosY; - k = chunkposition.chunkPosZ; - block = this.worldObj.getBlock(i, j, k); - Block block1 = this.worldObj.getBlock(i, j - 1, k); - - if (block.getMaterial() == Material.air && block1.func_149730_j() && this.explosionRNG.nextInt(3) == 0) - { - this.worldObj.setBlock(i, j, k, Blocks.fire); - } - } - } - } - - public Map func_77277_b() - { - return this.field_77288_k; - } - - public DamageSource getExplosionSource() - { - if(exploder != null) - { - return new EntityDamageSource(type, exploder).setExplosion(); - } - return new DamageSource(type).setExplosion(); - } +public class Shockwave {// Explosion + /** whether or not the explosion sets fire to blocks around it */ + public boolean isFlaming; + /** whether or not this explosion spawns smoke particles */ + public boolean isSmoking = true; + public boolean isGriefing = true; + private int maxRange = 16; + private Random explosionRNG = new Random(); + private World worldObj; + public double explosionX; + public double explosionY; + public double explosionZ; + public Entity exploder; + public float explosionSize; + /** A list of ChunkPositions of blocks affected by this explosion */ + public List affectedBlockPositions = new ArrayList(); + private Map field_77288_k = new HashMap(); + private String type; + + public Shockwave(String type, World world, Entity cause, double x, double y, double z, float power) { + this.worldObj = world; + this.exploder = cause; + this.explosionSize = power; + this.explosionX = x; + this.explosionY = y; + this.explosionZ = z; + this.type = type; + } + + /** + * Does the first part of the explosion (destroy blocks) + */ + public void initiate() { + float f = this.explosionSize; + HashSet hashset = new HashSet(); + int i; + int j; + int k; + double d5; + double d6; + double d7; + + for (i = 0; i < this.maxRange; ++i) { + for (j = 0; j < this.maxRange; ++j) { + for (k = 0; k < this.maxRange; ++k) { + if (i == 0 || i == this.maxRange - 1 || j == 0 || j == this.maxRange - 1 || k == 0 + || k == this.maxRange - 1) { + double d0 = i / (this.maxRange - 1.0F) * 2.0F - 1.0F; + double d1 = j / (this.maxRange - 1.0F) * 2.0F - 1.0F; + double d2 = k / (this.maxRange - 1.0F) * 2.0F - 1.0F; + double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2); + d0 /= d3; + d1 /= d3; + d2 /= d3; + float f1 = this.explosionSize * (0.7F + this.worldObj.rand.nextFloat() * 0.6F); + d5 = this.explosionX; + d6 = this.explosionY; + d7 = this.explosionZ; + + for (float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) { + int j1 = MathHelper.floor_double(d5); + int k1 = MathHelper.floor_double(d6); + int l1 = MathHelper.floor_double(d7); + Block block = this.worldObj.getBlock(j1, k1, l1); + + if (block.getMaterial() == Material.glass) { + hashset.add(new ChunkPosition(j1, k1, l1)); + } + + d5 += d0 * f2; + d6 += d1 * f2; + d7 += d2 * f2; + } + } + } + } + } + + this.affectedBlockPositions.addAll(hashset); + this.explosionSize *= 2.0F; + i = MathHelper.floor_double(this.explosionX - this.explosionSize - 1.0D); + j = MathHelper.floor_double(this.explosionX + this.explosionSize + 1.0D); + k = MathHelper.floor_double(this.explosionY - this.explosionSize - 1.0D); + int i2 = MathHelper.floor_double(this.explosionY + this.explosionSize + 1.0D); + int l = MathHelper.floor_double(this.explosionZ - this.explosionSize - 1.0D); + int j2 = MathHelper.floor_double(this.explosionZ + this.explosionSize + 1.0D); + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.exploder, + AxisAlignedBB.getBoundingBox(i, k, l, j, i2, j2)); + Vec3 vec3 = Vec3.createVectorHelper(this.explosionX, this.explosionY, this.explosionZ); + + for (int i1 = 0; i1 < list.size(); ++i1) { + Entity entity = (Entity) list.get(i1); + double d4 = entity.getDistance(this.explosionX, this.explosionY, this.explosionZ) / this.explosionSize; + + if (d4 <= 1.0D && !(entity instanceof EntityItem)) { + d5 = entity.posX - this.explosionX; + d6 = entity.posY + entity.getEyeHeight() - this.explosionY; + d7 = entity.posZ - this.explosionZ; + double d9 = MathHelper.sqrt_double(d5 * d5 + d6 * d6 + d7 * d7); + + if (d9 != 0.0D) { + d5 /= d9; + d6 /= d9; + d7 /= d9; + double d10 = this.worldObj.getBlockDensity(vec3, entity.boundingBox); + double d11 = (1.0D - d4) * d10; + float damage = ((int) ((d11 * d11 + d11) / 2.0D * 8.0D * this.explosionSize + 1.0D)); + entity.attackEntityFrom(getExplosionSource(), Math.min(64F, 4F + (damage / 2F))); + double d8 = EnchantmentProtection.func_92092_a(entity, d11); + entity.motionX += d5 * d8; + entity.motionY += d6 * d8; + entity.motionZ += d7 * d8; + + if (entity instanceof EntityPlayer) { + this.field_77288_k.put(entity, Vec3.createVectorHelper(d5 * d11, d6 * d11, d7 * d11)); + } + } + } + } + + this.explosionSize = f; + } + + /** + * Does the second part of the explosion (sound, particles, drop spawn) + */ + public void decorateWave(boolean flag) { + this.worldObj.playSoundEffect(this.explosionX, this.explosionY, this.explosionZ, "random.explode", 4.0F, + (1.0F + (this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F) * 0.7F); + + if (this.explosionSize >= 2.0F && this.isSmoking) { + this.worldObj.spawnParticle("largesmoke", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, + 0.0D); + } else { + this.worldObj.spawnParticle("smoke", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D); + } + + Iterator iterator; + ChunkPosition chunkposition; + int i; + int j; + int k; + Block block; + + if (this.isSmoking) { + iterator = this.affectedBlockPositions.iterator(); + + while (iterator.hasNext()) { + chunkposition = (ChunkPosition) iterator.next(); + i = chunkposition.chunkPosX; + j = chunkposition.chunkPosY; + k = chunkposition.chunkPosZ; + block = this.worldObj.getBlock(i, j, k); + + if (flag) { + double d0 = i + this.worldObj.rand.nextFloat(); + double d1 = j + this.worldObj.rand.nextFloat(); + double d2 = k + this.worldObj.rand.nextFloat(); + double d3 = d0 - this.explosionX; + double d4 = d1 - this.explosionY; + double d5 = d2 - this.explosionZ; + double d6 = MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5); + d3 /= d6; + d4 /= d6; + d5 /= d6; + double d7 = 0.5D / (d6 / this.explosionSize + 0.1D); + d7 *= this.worldObj.rand.nextFloat() * this.worldObj.rand.nextFloat() + 0.3F; + d3 *= d7; + d4 *= d7; + d5 *= d7; + this.worldObj.spawnParticle("explode", (d0 + this.explosionX * 1.0D) / 2.0D, + (d1 + this.explosionY * 1.0D) / 2.0D, (d2 + this.explosionZ * 1.0D) / 2.0D, d3, d4, d5); + this.worldObj.spawnParticle("smoke", d0, d1, d2, d3, d4, d5); + } + + if (isGriefing && block.getMaterial() == Material.glass) { + this.worldObj.setBlockToAir(i, j, k); + this.worldObj.playSoundEffect(i, j, k, "break.glass", 1.0F, + 0.75F + (explosionRNG.nextFloat() * 0.5F)); + } + } + } + + if (this.isFlaming) { + iterator = this.affectedBlockPositions.iterator(); + + while (iterator.hasNext()) { + chunkposition = (ChunkPosition) iterator.next(); + i = chunkposition.chunkPosX; + j = chunkposition.chunkPosY; + k = chunkposition.chunkPosZ; + block = this.worldObj.getBlock(i, j, k); + Block block1 = this.worldObj.getBlock(i, j - 1, k); + + if (block.getMaterial() == Material.air && block1.func_149730_j() + && this.explosionRNG.nextInt(3) == 0) { + this.worldObj.setBlock(i, j, k, Blocks.fire); + } + } + } + } + + public Map func_77277_b() { + return this.field_77288_k; + } + + public DamageSource getExplosionSource() { + if (exploder != null) { + return new EntityDamageSource(type, exploder).setExplosion(); + } + return new DamageSource(type).setExplosion(); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/list/EntityListMF.java b/src/main/java/minefantasy/mf2/entity/list/EntityListMF.java index cc5a56c0..b86335b7 100644 --- a/src/main/java/minefantasy/mf2/entity/list/EntityListMF.java +++ b/src/main/java/minefantasy/mf2/entity/list/EntityListMF.java @@ -3,7 +3,6 @@ import cpw.mods.fml.common.registry.EntityRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.config.ConfigExperiment; -import minefantasy.mf2.config.ConfigMobs; import minefantasy.mf2.entity.EntityArrowMF; import minefantasy.mf2.entity.EntityBomb; import minefantasy.mf2.entity.EntityDragonBreath; @@ -16,38 +15,36 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; -public class EntityListMF -{ - public static void register() - { +public class EntityListMF { + public static void register() { addEntity(EntityArrowMF.class, "arrowMF", 1, 16, ConfigExperiment.dynamicArrows ? 1 : 20); addEntity(EntityBomb.class, "bombMF", 2, 16, ConfigExperiment.dynamicArrows ? 1 : 20); addEntity(EntityShrapnel.class, "shrapnel_mf", 3, 16, ConfigExperiment.dynamicArrows ? 1 : 20); addEntity(EntityFireBlast.class, "fire_blast", 4, 16, ConfigExperiment.dynamicArrows ? 2 : 20); addEntity(EntitySmoke.class, "smoke_mf", 5, 16, ConfigExperiment.dynamicArrows ? 2 : 20); addEntity(EntityItemUnbreakable.class, "special_eitem_mf", 6, 16, ConfigExperiment.dynamicArrows ? 2 : 20); - + addEntity(EntityMine.class, "landmineMF", 7, 16, 10); addEntity(EntityParachute.class, "parachute_mf", 8, 16, 20); - + addEntity(EntityDragonBreath.class, "dragonbreath", 9, 16, ConfigExperiment.dynamicArrows ? 2 : 20); - + MobListMF.register(); } - public static int autoAssign() - { - for(int a = 0; a <= 255; a++) - { - if (!EntityList.IDtoClassMapping.containsKey(Integer.valueOf(a))) - { - System.out.println("MineFantasy: Autoassigned EntityID " +a); + + public static int autoAssign() { + for (int a = 0; a <= 255; a++) { + if (!EntityList.IDtoClassMapping.containsKey(Integer.valueOf(a))) { + System.out.println("MineFantasy: Autoassigned EntityID " + a); return a; - } + } } - throw new IllegalArgumentException("MineFantasy: No Available Entity ID!, you can try manually adding them in Config/Mobs.cfg"); + throw new IllegalArgumentException( + "MineFantasy: No Available Entity ID!, you can try manually adding them in Config/Mobs.cfg"); + } + + private static void addEntity(Class entityClass, String entityName, int id, int range, + int ticks) { + EntityRegistry.registerModEntity(entityClass, entityName, id, MineFantasyII.instance, range, ticks, true); } - private static void addEntity(Class entityClass, String entityName, int id, int range, int ticks) - { - EntityRegistry.registerModEntity(entityClass, entityName, id, MineFantasyII.instance, range, ticks, true); - } } diff --git a/src/main/java/minefantasy/mf2/entity/list/MobListMF.java b/src/main/java/minefantasy/mf2/entity/list/MobListMF.java index 0ca0bd9a..d2f6dd17 100644 --- a/src/main/java/minefantasy/mf2/entity/list/MobListMF.java +++ b/src/main/java/minefantasy/mf2/entity/list/MobListMF.java @@ -1,87 +1,73 @@ package minefantasy.mf2.entity.list; - import cpw.mods.fml.common.registry.EntityRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.config.ConfigMobs; import minefantasy.mf2.entity.EntityCogwork; -import minefantasy.mf2.entity.mob.*; -import minefantasy.mf2.util.MFLogUtil; +import minefantasy.mf2.entity.mob.DragonBreath; +import minefantasy.mf2.entity.mob.EntityDragon; +import minefantasy.mf2.entity.mob.EntityHound; +import minefantasy.mf2.entity.mob.EntityMinotaur; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EnumCreatureType; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.BiomeDictionary; import net.minecraftforge.common.BiomeDictionary.Type; -public class MobListMF -{ - public static void register() - { +public class MobListMF { + public static void register() { DragonBreath.init(); addEntity(10, EntityDragon.class, "MF_Dragon"); addEntity(11, EntityMinotaur.class, "MF_Minotaur"); addEntity(12, EntityCogwork.class, "MF_CogSuit"); addEntity(13, EntityHound.class, "MF_Hound"); - + addSpawn(EntityDragon.class, 1, 1, 1, EnumCreatureType.monster, Type.NETHER); - if(ConfigMobs.minotaurSpawnrate > 0) - { + if (ConfigMobs.minotaurSpawnrate > 0) { addSpawn(EntityMinotaur.class, ConfigMobs.minotaurSpawnrate, 1, 1, EnumCreatureType.monster); } - if(ConfigMobs.minotaurSpawnrateNether > 0) - { - addSpawn(EntityMinotaur.class, ConfigMobs.minotaurSpawnrateNether, 1, 1, EnumCreatureType.monster, Type.NETHER); + if (ConfigMobs.minotaurSpawnrateNether > 0) { + addSpawn(EntityMinotaur.class, ConfigMobs.minotaurSpawnrateNether, 1, 1, EnumCreatureType.monster, + Type.NETHER); } } - - private static void addEntity(int IDBase, Class entityClass, String entityName) - { + + private static void addEntity(int IDBase, Class entityClass, String entityName) { EntityRegistry.registerModEntity(entityClass, entityName, IDBase, MineFantasyII.instance, 128, 1, true); - } - - public static void addSpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType typeOfCreature) - { - for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) - { - if(biome != null) - { - if(BiomeDictionary.isBiomeRegistered(biome)) - { - if(BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.END)) - { - return; - } - if(BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.NETHER)) - { - return; - } - if(BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.MUSHROOM)) - { - return; - } - } - - EntityRegistry.addSpawn(entityClass, weightedProb, min, max, typeOfCreature, biome); - } - } - } - - public static void addSpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType typeOfCreature, BiomeDictionary.Type type) - { - for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) - { - if(biome != null) - { - if(BiomeDictionary.isBiomeRegistered(biome)) - { - if(BiomeDictionary.isBiomeOfType(biome, type)) - { - EntityRegistry.addSpawn(entityClass, weightedProb, min, max, typeOfCreature, biome); - } - } - } - } - } + } + + public static void addSpawn(Class entityClass, int weightedProb, int min, int max, + EnumCreatureType typeOfCreature) { + for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) { + if (biome != null) { + if (BiomeDictionary.isBiomeRegistered(biome)) { + if (BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.END)) { + return; + } + if (BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.NETHER)) { + return; + } + if (BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.MUSHROOM)) { + return; + } + } + + EntityRegistry.addSpawn(entityClass, weightedProb, min, max, typeOfCreature, biome); + } + } + } + + public static void addSpawn(Class entityClass, int weightedProb, int min, int max, + EnumCreatureType typeOfCreature, BiomeDictionary.Type type) { + for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) { + if (biome != null) { + if (BiomeDictionary.isBiomeRegistered(biome)) { + if (BiomeDictionary.isBiomeOfType(biome, type)) { + EntityRegistry.addSpawn(entityClass, weightedProb, min, max, typeOfCreature, biome); + } + } + } + } + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/AshBreath.java b/src/main/java/minefantasy/mf2/entity/mob/AshBreath.java index 019a9efc..1db136b5 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/AshBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/AshBreath.java @@ -2,57 +2,48 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.entity.EntityCogwork; import minefantasy.mf2.entity.EntityDragonBreath; import minefantasy.mf2.entity.EntitySmoke; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSourceIndirect; import net.minecraft.world.World; -public class AshBreath extends DragonBreath -{ +public class AshBreath extends DragonBreath { - public AshBreath(String name) - { + public AshBreath(String name) { super(name); } @Override - public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) - { - return shooter == null ? new DamageSource("ashblastBase").setDamageBypassesArmor() : (new EntityDamageSourceIndirect("ashblast", breath, shooter).setDamageBypassesArmor()); + public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { + return shooter == null ? new DamageSource("ashblastBase").setDamageBypassesArmor() + : (new EntityDamageSourceIndirect("ashblast", breath, shooter).setDamageBypassesArmor()); } @Override @SideOnly(Side.CLIENT) - public String getTexture(EntityDragonBreath instance) - { + public String getTexture(EntityDragonBreath instance) { return "textures/projectile/dragonbreath_ash"; } - - public void onHitEntity(Entity target, EntityDragonBreath instance) - { + + public void onHitEntity(Entity target, EntityDragonBreath instance) { super.onHitEntity(target, instance); - if(target instanceof EntityLivingBase) - { + if (target instanceof EntityLivingBase) { float dam = instance.getDamage(); - ((EntityLivingBase)target).addPotionEffect(new PotionEffect(Potion.blindness.id, 100, 0)); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.blindness.id, 100, 0)); } } - + @Override - public float modifyDamage(Entity hit, float dam) - { - return EntitySmoke.canPoison(hit, random) ? (dam/5F + 1) : 0F; + public float modifyDamage(Entity hit, float dam) { + return EntitySmoke.canPoison(hit, random) ? (dam / 5F + 1) : 0F; } - + @Override - public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) - { + public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/DamageSourceMobMF.java b/src/main/java/minefantasy/mf2/entity/mob/DamageSourceMobMF.java index 99795c9d..e58fb213 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/DamageSourceMobMF.java +++ b/src/main/java/minefantasy/mf2/entity/mob/DamageSourceMobMF.java @@ -2,35 +2,29 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.EntityDamageSource; import net.minecraft.util.IChatComponent; -import net.minecraft.util.StatCollector; -public class DamageSourceMobMF extends EntityDamageSource -{ - protected Entity damageSourceEntity; - private String attackName; - - public DamageSourceMobMF(String name, Entity attacker) - { - super("mob", attacker); - this.attackName=name; - this.damageSourceEntity = attacker; - } +public class DamageSourceMobMF extends EntityDamageSource { + protected Entity damageSourceEntity; + private String attackName; - @Override - public Entity getEntity() - { - return this.damageSourceEntity; - } + public DamageSourceMobMF(String name, Entity attacker) { + super("mob", attacker); + this.attackName = name; + this.damageSourceEntity = attacker; + } - @Override - public IChatComponent func_151519_b(EntityLivingBase target) - { - String s = "death.attack." + this.damageType + "." + attackName; - return new ChatComponentTranslation(s, new Object[] {target.func_145748_c_(), this.damageSourceEntity.func_145748_c_()}); - } + @Override + public Entity getEntity() { + return this.damageSourceEntity; + } + + @Override + public IChatComponent func_151519_b(EntityLivingBase target) { + String s = "death.attack." + this.damageType + "." + attackName; + return new ChatComponentTranslation(s, + new Object[] { target.func_145748_c_(), this.damageSourceEntity.func_145748_c_() }); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java b/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java index 2d29903a..ea7d318a 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java @@ -11,31 +11,29 @@ import net.minecraft.util.DamageSource; import net.minecraft.world.World; -public abstract class DragonBreath -{ +public abstract class DragonBreath { public static ArrayList projectiles = new ArrayList(); - + public static int nextID = 0; protected Random random = new Random(); public static DragonBreath fire, frost, poison, ash; - public static void init() - { + + public static void init() { fire = new FireBreath("fire"); frost = new FrostBreath("frost"); poison = new PoisonBreath("poison"); ash = new AshBreath("ash"); } - + public int id = 0; public final String name; - public DragonBreath(String name) - { + + public DragonBreath(String name) { this.name = name; register(); } - - public void register() - { + + public void register() { this.id = nextID; projectiles.add(this); ++nextID; @@ -43,7 +41,7 @@ public void register() public abstract DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter); - public boolean shouldExpand(){ + public boolean shouldExpand() { return true; } @@ -53,17 +51,16 @@ public int getLifeSpan() { @SideOnly(Side.CLIENT) public abstract String getTexture(EntityDragonBreath instance); - + public void onHitEntity(Entity entityHit, EntityDragonBreath instance) { - entityHit.attackEntityFrom(getDamageSource(instance, instance.shootingEntity), modifyDamage(entityHit, instance.getDamage())); + entityHit.attackEntityFrom(getDamageSource(instance, instance.shootingEntity), + modifyDamage(entityHit, instance.getDamage())); } - - public float modifyDamage(Entity hit, float dam) - { + + public float modifyDamage(Entity hit, float dam) { return dam; } - public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) - { + public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/DragonBreed.java b/src/main/java/minefantasy/mf2/entity/mob/DragonBreed.java index 65d1e4a4..1815f886 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/DragonBreed.java +++ b/src/main/java/minefantasy/mf2/entity/mob/DragonBreed.java @@ -3,53 +3,81 @@ import java.util.ArrayList; import java.util.Random; +import minefantasy.mf2.config.ConfigMobs; import net.minecraft.world.biome.BiomeGenBase; -import net.minecraftforge.common.BiomeManager; -import net.minecraftforge.common.BiomeManager.BiomeType; -import minefantasy.mf2.config.ConfigMobs; -import minefantasy.mf2.util.MFLogUtil; - -public class DragonBreed -{ - private static final ArrayList[]breeds = new ArrayList[]{new ArrayList(), new ArrayList(), new ArrayList(), new ArrayList(), new ArrayList()}; - - /* New System Breeds - * Red: Fire, plains and hills - * Green: Poison, swamps, forests and plains - * White: Frost, cold regions - * Black: Dire, nether +public class DragonBreed { + private static final ArrayList[] breeds = new ArrayList[] { new ArrayList(), + new ArrayList(), new ArrayList(), new ArrayList(), + new ArrayList() }; + + /* + * New System Breeds Red: Fire, plains and hills Green: Poison, swamps, forests + * and plains White: Frost, cold regions Black: Dire, nether * */ - public static DragonBreed YOUNGRED = new DragonBreed(0, "dragon_young", "red", "dragon_red", DragonBreath.fire).setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 15, 200).setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 1000, 0.05F).register(); - public static DragonBreed YOUNGWHITE = new DragonBreed(0, "dragon_young", "white", "dragon_frost", DragonBreath.frost).setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 25, 200).setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 800, 0.05F).register(); - public static DragonBreed YOUNGGREEN = new DragonBreed(0, "dragon_young", "green", "dragon_green", DragonBreath.poison).setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 35, 100).setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 400, 0.05F).register(); - public static DragonBreed YOUNGASH = new DragonBreed(0, "dragon_young", "ash", "dragon_ash", DragonBreath.ash).setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 15, 200).setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 200, 0.05F).setBlind().register(); - - public static DragonBreed RED = new DragonBreed(1, "dragon", "red", "dragon_red", DragonBreath.fire).setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 15, 300).setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 500, 0.1F).register(); - public static DragonBreed WHITE = new DragonBreed(1, "dragon", "white", "dragon_frost", DragonBreath.frost).setCombat(ConfigMobs.youngdragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 25, 300).setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 400, 0.1F).register(); - public static DragonBreed GREEN = new DragonBreed(1, "dragon", "green", "dragon_green", DragonBreath.poison).setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 35, 200).setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 300, 0.1F).register(); - public static DragonBreed ASH = new DragonBreed(1, "dragon", "ash", "dragon_ash", DragonBreath.ash).setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 15, 300).setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 150, 0.1F).setBlind().register(); - - public static DragonBreed REDM = new DragonBreed(2, "dragon_mature", "red", "dragon_red", DragonBreath.fire).setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 15, 300).setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 400, 0.25F).register(); - public static DragonBreed WHITEM = new DragonBreed(2, "dragon_mature", "white", "dragon_frost", DragonBreath.frost).setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 25, 300).setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 300, 0.25F).register(); - public static DragonBreed GREENM = new DragonBreed(2, "dragon_mature", "green", "dragon_green", DragonBreath.poison).setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 30, 200).setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 200, 0.25F).register(); - public static DragonBreed ASHM = new DragonBreed(2, "dragon_mature", "ash", "dragon_ash", DragonBreath.ash).setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 15, 300).setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 100, 0.25F).setBlind().register(); - - public static DragonBreed ELDERRED = new DragonBreed(3, "dragon_elder", "red", "dragon_red", DragonBreath.fire).setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 15, 300).setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 400, 0.35F).register(); - public static DragonBreed ELDERWHITE = new DragonBreed(3, "dragon_elder", "white", "dragon_frost", DragonBreath.frost).setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 25, 300).setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 300, 0.35F).register(); - public static DragonBreed ELDERGREEN = new DragonBreed(3, "dragon_elder", "green", "dragon_green", DragonBreath.poison).setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 35, 200).setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 200, 0.35F).register(); - public static DragonBreed ELDERASH = new DragonBreed(3, "dragon_elder", "ash", "dragon_ash", DragonBreath.ash).setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 15, 300).setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 100, 0.35F).setBlind().register(); - - public static DragonBreed ANCIENT = new DragonBreed(4, "dragon_ancient", "dire", "dragon_ancient", DragonBreath.fire).setCombat(ConfigMobs.ancientdragonHP, 2.0F, 5F, ConfigMobs.ancientdragonMD, 20, 300).setProjectile(ConfigMobs.ancientdragonFD, ConfigMobs.ancientdragonFT, 400, 1.0F).register(); - - + public static DragonBreed YOUNGRED = new DragonBreed(0, "dragon_young", "red", "dragon_red", DragonBreath.fire) + .setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 15, 200) + .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 1000, 0.05F).register(); + public static DragonBreed YOUNGWHITE = new DragonBreed(0, "dragon_young", "white", "dragon_frost", + DragonBreath.frost).setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 25, 200) + .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 800, 0.05F).register(); + public static DragonBreed YOUNGGREEN = new DragonBreed(0, "dragon_young", "green", "dragon_green", + DragonBreath.poison).setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 35, 100) + .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 400, 0.05F).register(); + public static DragonBreed YOUNGASH = new DragonBreed(0, "dragon_young", "ash", "dragon_ash", DragonBreath.ash) + .setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 15, 200) + .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 200, 0.05F).setBlind().register(); + + public static DragonBreed RED = new DragonBreed(1, "dragon", "red", "dragon_red", DragonBreath.fire) + .setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 15, 300) + .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 500, 0.1F).register(); + public static DragonBreed WHITE = new DragonBreed(1, "dragon", "white", "dragon_frost", DragonBreath.frost) + .setCombat(ConfigMobs.youngdragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 25, 300) + .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 400, 0.1F).register(); + public static DragonBreed GREEN = new DragonBreed(1, "dragon", "green", "dragon_green", DragonBreath.poison) + .setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 35, 200) + .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 300, 0.1F).register(); + public static DragonBreed ASH = new DragonBreed(1, "dragon", "ash", "dragon_ash", DragonBreath.ash) + .setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 15, 300) + .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 150, 0.1F).setBlind().register(); + + public static DragonBreed REDM = new DragonBreed(2, "dragon_mature", "red", "dragon_red", DragonBreath.fire) + .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 15, 300) + .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 400, 0.25F).register(); + public static DragonBreed WHITEM = new DragonBreed(2, "dragon_mature", "white", "dragon_frost", DragonBreath.frost) + .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 25, 300) + .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 300, 0.25F).register(); + public static DragonBreed GREENM = new DragonBreed(2, "dragon_mature", "green", "dragon_green", DragonBreath.poison) + .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 30, 200) + .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 200, 0.25F).register(); + public static DragonBreed ASHM = new DragonBreed(2, "dragon_mature", "ash", "dragon_ash", DragonBreath.ash) + .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 15, 300) + .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 100, 0.25F).setBlind().register(); + + public static DragonBreed ELDERRED = new DragonBreed(3, "dragon_elder", "red", "dragon_red", DragonBreath.fire) + .setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 15, 300) + .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 400, 0.35F).register(); + public static DragonBreed ELDERWHITE = new DragonBreed(3, "dragon_elder", "white", "dragon_frost", + DragonBreath.frost).setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 25, 300) + .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 300, 0.35F).register(); + public static DragonBreed ELDERGREEN = new DragonBreed(3, "dragon_elder", "green", "dragon_green", + DragonBreath.poison).setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 35, 200) + .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 200, 0.35F).register(); + public static DragonBreed ELDERASH = new DragonBreed(3, "dragon_elder", "ash", "dragon_ash", DragonBreath.ash) + .setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 15, 300) + .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 100, 0.35F).setBlind().register(); + + public static DragonBreed ANCIENT = new DragonBreed(4, "dragon_ancient", "dire", "dragon_ancient", + DragonBreath.fire).setCombat(ConfigMobs.ancientdragonHP, 2.0F, 5F, ConfigMobs.ancientdragonMD, 20, 300) + .setProjectile(ConfigMobs.ancientdragonFD, ConfigMobs.ancientdragonFT, 400, 1.0F).register(); + public int tier = 0; public String name = "dragon"; public String breedName = "red"; public DragonBreath rangedAttack; public String tex = "dragonGreen"; - public float health = 200; + public float health = 200; public float regenRate = 0; public float meleeDamage = 8; public float fireDamage = 5; @@ -59,17 +87,17 @@ public class DragonBreed public int coolTimer = 200; public int meleeSpeed = 20; public float DT = 2.0F; - - public DragonBreed(int tier, String name, String breedname, String tex, DragonBreath breath) - { + + public DragonBreed(int tier, String name, String breedname, String tex, DragonBreath breath) { this.tier = tier; this.name = name; this.breedName = breedname; this.tex = tex; this.rangedAttack = breath; } - public DragonBreed setCombat(float health, float DT, float regenRate, float meleeDamage, int meleeSpeed, int disengageChance) - { + + public DragonBreed setCombat(float health, float DT, float regenRate, float meleeDamage, int meleeSpeed, + int disengageChance) { this.health = health; this.regenRate = regenRate; this.meleeDamage = meleeDamage; @@ -78,60 +106,65 @@ public DragonBreed setCombat(float health, float DT, float regenRate, float mele this.DT = DT; return this; } - public DragonBreed setProjectile(float fireDamage, int fireTimer, int coolTimer, float pyro) - { + + public DragonBreed setProjectile(float fireDamage, int fireTimer, int coolTimer, float pyro) { this.fireDamage = fireDamage; this.fireTimer = fireTimer; this.coolTimer = coolTimer; this.pyro = pyro; return this; } - public DragonBreed register() - { + + public DragonBreed register() { breeds[tier].add(this); return this; } + private boolean isBlind = false; - public DragonBreed setBlind() - { + + public DragonBreed setBlind() { isBlind = true; return this; } - public boolean isBlind() - { + + public boolean isBlind() { return isBlind; } - - public static DragonBreed getBreed(int tier, int id) - { - tier = Math.min(breeds.length-1, tier); - id = Math.min(breeds[tier].size()-1, id); + + public static DragonBreed getBreed(int tier, int id) { + tier = Math.min(breeds.length - 1, tier); + id = Math.min(breeds[tier].size() - 1, id); DragonBreed breed = breeds[tier].get(id); return breed != null ? breed : breeds[tier].get(0); } + private static Random rand = new Random(); - public static int getRandomDragon(EntityDragon dragon, int tier) - { - ArrayList pool = breeds[tier]; - BiomeGenBase biome = dragon.worldObj.getBiomeGenForCoords((int)(dragon.posX), (int)(dragon.posZ)); - int id = getIdForBiome(biome, dragon.worldObj.canLightningStrikeAt((int)dragon.posX, (int)dragon.posY, (int)dragon.posZ), dragon.dimension); - if(id >= pool.size()) - { - id = pool.size()-1; - } - return id; + + public static int getRandomDragon(EntityDragon dragon, int tier) { + ArrayList pool = breeds[tier]; + BiomeGenBase biome = dragon.worldObj.getBiomeGenForCoords((int) (dragon.posX), (int) (dragon.posZ)); + int id = getIdForBiome(biome, + dragon.worldObj.canLightningStrikeAt((int) dragon.posX, (int) dragon.posY, (int) dragon.posZ), + dragon.dimension); + if (id >= pool.size()) { + id = pool.size() - 1; + } + return id; } - private static int getIdForBiome(BiomeGenBase biome, boolean isRaining, int dimension) - { - if(dimension == -1) - { - return rand.nextBoolean() ? 3 : 0;//Ash or Fire + + private static int getIdForBiome(BiomeGenBase biome, boolean isRaining, int dimension) { + if (dimension == -1) { + return rand.nextBoolean() ? 3 : 0;// Ash or Fire } BiomeGenBase.TempCategory category = biome.getTempCategory(); - if(!biome.func_150559_j() && !biome.canSpawnLightningBolt()) return 3;//Ash - if(biome.getEnableSnow() || biome.temperature <= 0.25F || category == BiomeGenBase.TempCategory.COLD)return 1;//Frost - if(biome.isHighHumidity() || (category == BiomeGenBase.TempCategory.MEDIUM && isRaining)) return 2;//Poison - if(category == BiomeGenBase.TempCategory.OCEAN)return 2;//Poison - return 0;//Fire + if (!biome.func_150559_j() && !biome.canSpawnLightningBolt()) + return 3;// Ash + if (biome.getEnableSnow() || biome.temperature <= 0.25F || category == BiomeGenBase.TempCategory.COLD) + return 1;// Frost + if (biome.isHighHumidity() || (category == BiomeGenBase.TempCategory.MEDIUM && isRaining)) + return 2;// Poison + if (category == BiomeGenBase.TempCategory.OCEAN) + return 2;// Poison + return 0;// Fire } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityDragon.java b/src/main/java/minefantasy/mf2/entity/mob/EntityDragon.java index ef2cec70..bfedcd68 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityDragon.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityDragon.java @@ -3,6 +3,8 @@ import java.util.Iterator; import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.armour.IArmourPenetrationMob; import minefantasy.mf2.api.armour.IArmouredEntity; import minefantasy.mf2.api.helpers.ArmourCalculator; @@ -35,19 +37,17 @@ import net.minecraft.util.Vec3; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class EntityDragon extends EntityFlyingMF implements IMob, IBossDisplayData, IArmouredEntity, IArmourPenetrationMob -{ +public class EntityDragon extends EntityFlyingMF + implements IMob, IBossDisplayData, IArmouredEntity, IArmourPenetrationMob { public static int interestTimeSeconds = 90; public static float heartChance = 1.0F; - - public int courseChangeCooldown; - public double waypointX; - public double waypointY; - public double waypointZ; - private Entity targetedEntity; + + public int courseChangeCooldown; + public double waypointX; + public double waypointY; + public double waypointZ; + private Entity targetedEntity; private int attackCounter; private int fireBreathTick; public int fireBreathCooldown; @@ -55,405 +55,364 @@ public class EntityDragon extends EntityFlyingMF implements IMob, IBossDisplayDa private int interestTime; @SideOnly(Side.CLIENT) private int wingFlap, wingTick; - public EntityDragon(World world) - { - super(world); - this.setSize(4.0F, 3.0F); - this.isImmuneToFire = true; - this.experienceValue = 50; - stepHeight = 1.25F; - } - - @Override - protected void fall(float distance) - { - if(isTerrestrial()) - { - float power = Math.min(distance/2F, 3F) * getScale(); - createShockwave(posX, posY, posZ, power / 2F, ConfigMobs.dragonGriefGeneral); - } - } - - public void setDragon(int tier) - { - setTier(tier); - setBreed(DragonBreed.getRandomDragon(this, tier)); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(getType().health); - setHealth(getMaxHealth()); - this.setSize(3.0F*getScale(), 2.0F*getScale()); - stepHeight = 1.25F + (tier*0.25F); - this.experienceValue = 50 * (tier+1); - } - - @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) - { - setDragon(getRandomTier()); - return super.onSpawnWithEgg(data); - } - - private int getRandomTier() - { - float f = rand.nextFloat()*100F; - - if(f < 25F) - { - return 0;//0-25 (25%) - } - if(f < 50F) - { - return 2;//25-50 (25%) - } - if(f < 59F) - { - return 3;//50-59 (9%) - } - if(f < 60F)//59-60 (1%) - { - return 4;//55-60 - } - return 1;//60-100 40% + + public EntityDragon(World world) { + super(world); + this.setSize(4.0F, 3.0F); + this.isImmuneToFire = true; + this.experienceValue = 50; + stepHeight = 1.25F; + } + + @Override + protected void fall(float distance) { + if (isTerrestrial()) { + float power = Math.min(distance / 2F, 3F) * getScale(); + createShockwave(posX, posY, posZ, power / 2F, ConfigMobs.dragonGriefGeneral); + } + } + + public void setDragon(int tier) { + setTier(tier); + setBreed(DragonBreed.getRandomDragon(this, tier)); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(getType().health); + setHealth(getMaxHealth()); + this.setSize(3.0F * getScale(), 2.0F * getScale()); + stepHeight = 1.25F + (tier * 0.25F); + this.experienceValue = 50 * (tier + 1); + } + + @Override + public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { + setDragon(getRandomTier()); + return super.onSpawnWithEgg(data); + } + + private int getRandomTier() { + float f = rand.nextFloat() * 100F; + + if (f < 25F) { + return 0;// 0-25 (25%) + } + if (f < 50F) { + return 2;// 25-50 (25%) + } + if (f < 59F) { + return 3;// 50-59 (9%) + } + if (f < 60F)// 59-60 (1%) + { + return 4;// 55-60 + } + return 1;// 60-100 40% } private static final int dataID = 12; - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(dataID, Byte.valueOf((byte)0)); - this.dataWatcher.addObject(dataID+1, Float.valueOf(0F)); - this.dataWatcher.addObject(dataID+2, Float.valueOf(0F)); - this.dataWatcher.addObject(dataID+3, Integer.valueOf(0)); - this.dataWatcher.addObject(dataID+4, Integer.valueOf(0)); - this.dataWatcher.addObject(dataID+5, Integer.valueOf(rand.nextInt(5))); - } - - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(ConfigMobs.dragonHP); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(1.5D); - } - - @Override - public void onUpdate() - { - super.onUpdate(); - - if(fireBreathTick > 0)--fireBreathTick; - if(fireBreathCooldown > 0)--fireBreathCooldown; - - if(!isTerrestrial()) - { - this.fallDistance = 0; - } - if(!worldObj.isRemote) - { - if(isInWater()) - { - if (rand.nextFloat() < 0.8F) - { - getJumpHelper().setJumping(); - } - } - - int disengageTime = getDisengageTime(); - if(disengageTime > 0) - { - if(targetedEntity != null)targetedEntity = null; - --disengageTime; - } - if(disengageTime == 1 && lastEnemy != null && this.canAttackEntity(lastEnemy)) - { - setTarget(lastEnemy); - lastEnemy = null; - } - setDisengageTime(disengageTime); - if(rand.nextInt(this.getDisengageChance()) == 0 && disengageTime <= 0) - { - disengage(100); - } - - if(onGround)//Ground begin walk - { - setTerrestrial(true); - } - if(targetedEntity != null && targetedEntity.posY < (posY-5D) && this.getDistance(targetedEntity.posX, posY, targetedEntity.posZ) < 2D)//Slam to enemy - { - setTerrestrial(true); - } - if(rand.nextInt(100) == 0 && targetedEntity == null)//Idle take off - { - setTerrestrial(false); - jump(); - } - if(targetedEntity != null && targetedEntity.posY > (posY+2D))//Combat take off - { - setTerrestrial(false); - jump(); - } - - if(fireBreathTick > 0 && targetedEntity != null) - { - this.faceEntity(targetedEntity, 1F, 1F); - breatheFire(); - } - - if (targetedEntity == null && (rand.nextInt(100) == 0) && disengageTime <= 0) - { - this.waypointX = this.posX + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.waypointY = this.posY + (double) ((this.rand.nextFloat() * 1.5F - 1.0F) * 12.0F); - this.waypointZ = this.posZ + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - } - if (targetedEntity == null && (rand.nextInt(100) == 0) && disengageTime > 0) - { - this.waypointX = this.posX + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.waypointY = this.posY - 4D; - this.waypointZ = this.posZ + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - } - if(getHealth() < getMaxHealth() && this.ticksExisted % 100 == 0 && getType().regenRate > 0) - { - heal(getType().regenRate); - if(getHealth() > getMaxHealth()) - { - setHealth(getMaxHealth()); - } - } - int time = getInterestTime(); - int maxTime = ((getHealth() > (getMaxHealth()*0.75F)) ? time : time*2) * 20; - if(dimension != -1) - { - ++interestTime; - if(interestTime > maxTime && worldObj.canBlockSeeTheSky((int)posX, (int)posY, (int)posZ) && posY > 128F) - { - if(ConfigMobs.dragonMSG) - { - List list = worldObj.playerEntities; - Iterator players = list.iterator(); - while(players.hasNext()) - { - Object instance = players.next(); - if(instance != null && instance instanceof EntityPlayer) - { - if(((EntityPlayer)instance).getDistanceToEntity(this) < 128D) - { - ((EntityPlayer)instance).addChatMessage(new ChatComponentText(StatCollector.translateToLocal("event.dragonaway.name"))); - } - } - } - } - this.setDead(); - } - if(interestTime > maxTime - 60 && worldObj.canBlockSeeTheSky((int)posX, (int)posY, (int)posZ)) - { - this.waypointY = this.posY + 4D; - } - } - } - else - { - float jawMove = getJawMove(); - if(jawMove > 0) - { - -- jawMove; - } - setJawMove(jawMove); - float neckAngle = getNeckAngle(); - if(neckAngle > 0) - { - -- neckAngle; - } - setNeckAngle(neckAngle); - - wingTick++; - if (wingTick == 20) { - wingTick = 0; - if(!isTerrestrial()) - worldObj.playSoundAtEntity(this,"mob.enderdragon.flap", 0.5F, 1.5F); - } - int i = (120 / 20) * wingTick; - wingFlap = -40 + i; - } - } - - private int getInterestTime() { + + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(dataID, Byte.valueOf((byte) 0)); + this.dataWatcher.addObject(dataID + 1, Float.valueOf(0F)); + this.dataWatcher.addObject(dataID + 2, Float.valueOf(0F)); + this.dataWatcher.addObject(dataID + 3, Integer.valueOf(0)); + this.dataWatcher.addObject(dataID + 4, Integer.valueOf(0)); + this.dataWatcher.addObject(dataID + 5, Integer.valueOf(rand.nextInt(5))); + } + + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(ConfigMobs.dragonHP); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(1.5D); + } + + @Override + public void onUpdate() { + super.onUpdate(); + + if (fireBreathTick > 0) + --fireBreathTick; + if (fireBreathCooldown > 0) + --fireBreathCooldown; + + if (!isTerrestrial()) { + this.fallDistance = 0; + } + if (!worldObj.isRemote) { + if (isInWater()) { + if (rand.nextFloat() < 0.8F) { + getJumpHelper().setJumping(); + } + } + + int disengageTime = getDisengageTime(); + if (disengageTime > 0) { + if (targetedEntity != null) + targetedEntity = null; + --disengageTime; + } + if (disengageTime == 1 && lastEnemy != null && this.canAttackEntity(lastEnemy)) { + setTarget(lastEnemy); + lastEnemy = null; + } + setDisengageTime(disengageTime); + if (rand.nextInt(this.getDisengageChance()) == 0 && disengageTime <= 0) { + disengage(100); + } + + if (onGround)// Ground begin walk + { + setTerrestrial(true); + } + if (targetedEntity != null && targetedEntity.posY < (posY - 5D) + && this.getDistance(targetedEntity.posX, posY, targetedEntity.posZ) < 2D)// Slam to enemy + { + setTerrestrial(true); + } + if (rand.nextInt(100) == 0 && targetedEntity == null)// Idle take off + { + setTerrestrial(false); + jump(); + } + if (targetedEntity != null && targetedEntity.posY > (posY + 2D))// Combat take off + { + setTerrestrial(false); + jump(); + } + + if (fireBreathTick > 0 && targetedEntity != null) { + this.faceEntity(targetedEntity, 1F, 1F); + breatheFire(); + } + + if (targetedEntity == null && (rand.nextInt(100) == 0) && disengageTime <= 0) { + this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.waypointY = this.posY + (this.rand.nextFloat() * 1.5F - 1.0F) * 12.0F; + this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + } + if (targetedEntity == null && (rand.nextInt(100) == 0) && disengageTime > 0) { + this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.waypointY = this.posY - 4D; + this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + } + if (getHealth() < getMaxHealth() && this.ticksExisted % 100 == 0 && getType().regenRate > 0) { + heal(getType().regenRate); + if (getHealth() > getMaxHealth()) { + setHealth(getMaxHealth()); + } + } + int time = getInterestTime(); + int maxTime = ((getHealth() > (getMaxHealth() * 0.75F)) ? time : time * 2) * 20; + if (dimension != -1) { + ++interestTime; + if (interestTime > maxTime && worldObj.canBlockSeeTheSky((int) posX, (int) posY, (int) posZ) + && posY > 128F) { + if (ConfigMobs.dragonMSG) { + List list = worldObj.playerEntities; + Iterator players = list.iterator(); + while (players.hasNext()) { + Object instance = players.next(); + if (instance != null && instance instanceof EntityPlayer) { + if (((EntityPlayer) instance).getDistanceToEntity(this) < 128D) { + ((EntityPlayer) instance).addChatMessage(new ChatComponentText( + StatCollector.translateToLocal("event.dragonaway.name"))); + } + } + } + } + this.setDead(); + } + if (interestTime > maxTime - 60 && worldObj.canBlockSeeTheSky((int) posX, (int) posY, (int) posZ)) { + this.waypointY = this.posY + 4D; + } + } + } else { + float jawMove = getJawMove(); + if (jawMove > 0) { + --jawMove; + } + setJawMove(jawMove); + float neckAngle = getNeckAngle(); + if (neckAngle > 0) { + --neckAngle; + } + setNeckAngle(neckAngle); + + wingTick++; + if (wingTick == 20) { + wingTick = 0; + if (!isTerrestrial()) + worldObj.playSoundAtEntity(this, "mob.enderdragon.flap", 0.5F, 1.5F); + } + int i = (120 / 20) * wingTick; + wingFlap = -40 + i; + } + } + + private int getInterestTime() { return interestTimeSeconds; } - private void breatheFire() - { - int spread = 4; - - for(int a = 0; a < spread; a ++) - { - double xAngle = this.targetedEntity.posX - this.posX; - double yAngle = this.targetedEntity.boundingBox.minY + (double) (this.targetedEntity.height / 2.0F) - (this.posY + (double) (this.height / 2.0F)); - double zAngle = this.targetedEntity.posZ - this.posZ; - double power = 1.0D; - Vec3 var20 = this.getLook(1.0F); - Entity breath = getBreath(xAngle, yAngle, zAngle); - breath.posX = this.posX + var20.xCoord * power; - breath.posY = this.posY + (double) (this.height / 2.0F) + 0.5D; - breath.posZ = this.posZ + var20.zCoord * power; - this.worldObj.spawnEntityInWorld(breath); - } - } - private Entity getBreath(double xAngle, double yAngle, double zAngle) - { - return new EntityDragonBreath(this.worldObj, this, xAngle, yAngle, zAngle, 1.0F).setDamage(getType().fireDamage).setType(getType().rangedAttack.id); + private void breatheFire() { + int spread = 4; + + for (int a = 0; a < spread; a++) { + double xAngle = this.targetedEntity.posX - this.posX; + double yAngle = this.targetedEntity.boundingBox.minY + this.targetedEntity.height / 2.0F + - (this.posY + this.height / 2.0F); + double zAngle = this.targetedEntity.posZ - this.posZ; + double power = 1.0D; + Vec3 var20 = this.getLook(1.0F); + Entity breath = getBreath(xAngle, yAngle, zAngle); + breath.posX = this.posX + var20.xCoord * power; + breath.posY = this.posY + this.height / 2.0F + 0.5D; + breath.posZ = this.posZ + var20.zCoord * power; + this.worldObj.spawnEntityInWorld(breath); + } + } + + private Entity getBreath(double xAngle, double yAngle, double zAngle) { + return new EntityDragonBreath(this.worldObj, this, xAngle, yAngle, zAngle, 1.0F).setDamage(getType().fireDamage) + .setType(getType().rangedAttack.id); } @Override - protected void updateEntityActionState() - { - if (!this.worldObj.isRemote && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) - { - this.setDead(); - } - - this.despawnEntity(); - double d0 = this.waypointX - this.posX; - double d1 = this.waypointY - this.posY; - double d2 = this.waypointZ - this.posZ; - double d3 = d0 * d0 + d1 * d1 + d2 * d2; - - if (d3 < 1.0D || d3 > 3600.0D) - { - this.waypointX = this.posX + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.waypointY = this.posY + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.waypointZ = this.posZ + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - } - - if (this.courseChangeCooldown-- <= 0) - { - this.courseChangeCooldown += this.rand.nextInt(5) + 2; - d3 = (double)MathHelper.sqrt_double(d3); - double flyspd = getFlightSpeed(); - if (this.isCourseTraversable(this.waypointX, this.waypointY, this.waypointZ, d3)) - { - this.motionX += d0 / d3 * 0.5D * flyspd; - this.motionY += d1 / d3 * 0.5D * flyspd; - this.motionZ += d2 / d3 * 0.5D * flyspd; - } - else - { - this.waypointX = this.posX; - this.waypointY = this.posY; - this.waypointZ = this.posZ; - } - } - - if (this.targetedEntity != null && this.targetedEntity.isDead) - { - this.targetedEntity = null; - } - - if (this.targetedEntity == null) - { - EntityPlayer closest = this.worldObj.getClosestVulnerablePlayerToEntity(this, 100.0D); - if(closest != null && canAttackEntity(closest)) - { - targetedEntity = closest; - closest = null; - } - if (this.targetedEntity != null) - { - this.moveToTarget(); - } - } - - if (this.targetedEntity != null && this.targetedEntity.isDead) { - this.targetedEntity = null; - } - - if (this.targetedEntity == null) - { - this.setEntityToAttack(EntityPlayer.class); - } - if (ConfigMobs.dragonKillNPC && this.targetedEntity == null) - { - this.setEntityToAttack(EntityLiving.class); - } - - double var9 = 200.0D; - - if (this.targetedEntity != null && getDisengageTime() <= 0 && this.targetedEntity.getDistanceSqToEntity(this) < var9 * var9) - { - if (!worldObj.isRemote && !this.canEntityBeSeen(this.targetedEntity) && getDisengageTime() <= 0 && (targetedEntity instanceof EntityPlayer ? rand.nextInt(40) == 0 : true)) - { - disengage(200); - return; - } - float range = getAttackRange(); - - double var11 = this.targetedEntity.posX - this.posX; - double var13 = this.targetedEntity.boundingBox.minY + (double) (this.targetedEntity.height / 2.0F) - (this.posY + (double) (this.height / 2.0F)); - double var15 = this.targetedEntity.posZ - this.posZ; - this.renderYawOffset = this.rotationYaw = -((float) Math.atan2(var11, var15)) * 180.0F / (float) Math.PI; - - boolean inRangeOfAttack = this.targetedEntity.getDistanceToEntity(this) < (range*getScale()) && this.canEntityBeSeen(targetedEntity); - boolean inRangeOfLeap = onGround && this.targetedEntity.getDistanceToEntity(this) > range*2 && this.targetedEntity.getDistanceToEntity(this) < range*8; - boolean inRangeOfFire = this.targetedEntity.getDistanceToEntity(this) > range && this.targetedEntity.getDistanceToEntity(this) < range*6 && fireBreathCooldown <= 0; - - if (this.canEntityBeSeen(this.targetedEntity) && inRangeOfFire) - { - this.fireBreathTick = getType().fireTimer; - - fireBreathCooldown = 600 + getBreathCooldown() + rand.nextInt(getBreathCooldown()); - worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.fire", 1, 1); - setJawMove(20); - } - if (this.canEntityBeSeen(this.targetedEntity) && inRangeOfLeap && rand.nextInt(100) == 0) - { - TacticalManager.lungeEntity(this, targetedEntity, 3.0F, 1.5F); - } - if (fallDistance <= 0 && this.canEntityBeSeen(this.targetedEntity) && inRangeOfAttack) - { - if ((targetedEntity.isSneaking() && !targetedEntity.onGround ) || this.attackCounter <= 0) - { - if(targetedEntity.isRiding() && posY > (targetedEntity.posY)) - { - targetedEntity.mountEntity(null); - targetedEntity.motionY = 1.0F; - targetedEntity.motionX = this.motionX; - targetedEntity.motionZ = this.motionZ; - if(targetedEntity instanceof EntityLivingBase) - { - ((EntityLivingBase)targetedEntity).addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 5)); - ((EntityLivingBase)targetedEntity).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 5)); - ((EntityLivingBase)targetedEntity).addPotionEffect(new PotionEffect(Potion.weakness.id, 200, 2)); - } - } - attackEntity(targetedEntity, this.getAttackStrength(targetedEntity)); - this.attackCounter = getAttackTime(); - setJawMove(40); - if(getHealth() <= this.getLowHPThreshold()) - { - disengage(50); - } - worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.bite", 1, 1); - } - } if (this.attackCounter > 0) { - --this.attackCounter; - } - if (this.canEntityBeSeen(this.targetedEntity) && !inRangeOfAttack) - { - this.faceEntity(targetedEntity, 1F, 1F); - waypointX = targetedEntity.posX; - waypointY = targetedEntity.posY; - waypointZ = targetedEntity.posZ; - } - } - else - { - this.renderYawOffset = this.rotationYaw = -((float) Math.atan2(this.motionX, this.motionZ)) * 180.0F / (float) Math.PI; - - if (this.attackCounter > 0) { - --this.attackCounter; - } - } - } - private float getAttackRange() - { + protected void updateEntityActionState() { + if (!this.worldObj.isRemote && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + this.setDead(); + } + + this.despawnEntity(); + double d0 = this.waypointX - this.posX; + double d1 = this.waypointY - this.posY; + double d2 = this.waypointZ - this.posZ; + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + + if (d3 < 1.0D || d3 > 3600.0D) { + this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.waypointY = this.posY + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + } + + if (this.courseChangeCooldown-- <= 0) { + this.courseChangeCooldown += this.rand.nextInt(5) + 2; + d3 = MathHelper.sqrt_double(d3); + double flyspd = getFlightSpeed(); + if (this.isCourseTraversable(this.waypointX, this.waypointY, this.waypointZ, d3)) { + this.motionX += d0 / d3 * 0.5D * flyspd; + this.motionY += d1 / d3 * 0.5D * flyspd; + this.motionZ += d2 / d3 * 0.5D * flyspd; + } else { + this.waypointX = this.posX; + this.waypointY = this.posY; + this.waypointZ = this.posZ; + } + } + + if (this.targetedEntity != null && this.targetedEntity.isDead) { + this.targetedEntity = null; + } + + if (this.targetedEntity == null) { + EntityPlayer closest = this.worldObj.getClosestVulnerablePlayerToEntity(this, 100.0D); + if (closest != null && canAttackEntity(closest)) { + targetedEntity = closest; + closest = null; + } + if (this.targetedEntity != null) { + this.moveToTarget(); + } + } + + if (this.targetedEntity != null && this.targetedEntity.isDead) { + this.targetedEntity = null; + } + + if (this.targetedEntity == null) { + this.setEntityToAttack(EntityPlayer.class); + } + if (ConfigMobs.dragonKillNPC && this.targetedEntity == null) { + this.setEntityToAttack(EntityLiving.class); + } + + double var9 = 200.0D; + + if (this.targetedEntity != null && getDisengageTime() <= 0 + && this.targetedEntity.getDistanceSqToEntity(this) < var9 * var9) { + if (!worldObj.isRemote && !this.canEntityBeSeen(this.targetedEntity) && getDisengageTime() <= 0 + && (targetedEntity instanceof EntityPlayer ? rand.nextInt(40) == 0 : true)) { + disengage(200); + return; + } + float range = getAttackRange(); + + double var11 = this.targetedEntity.posX - this.posX; + double var13 = this.targetedEntity.boundingBox.minY + this.targetedEntity.height / 2.0F + - (this.posY + this.height / 2.0F); + double var15 = this.targetedEntity.posZ - this.posZ; + this.renderYawOffset = this.rotationYaw = -((float) Math.atan2(var11, var15)) * 180.0F / (float) Math.PI; + + boolean inRangeOfAttack = this.targetedEntity.getDistanceToEntity(this) < (range * getScale()) + && this.canEntityBeSeen(targetedEntity); + boolean inRangeOfLeap = onGround && this.targetedEntity.getDistanceToEntity(this) > range * 2 + && this.targetedEntity.getDistanceToEntity(this) < range * 8; + boolean inRangeOfFire = this.targetedEntity.getDistanceToEntity(this) > range + && this.targetedEntity.getDistanceToEntity(this) < range * 6 && fireBreathCooldown <= 0; + + if (this.canEntityBeSeen(this.targetedEntity) && inRangeOfFire) { + this.fireBreathTick = getType().fireTimer; + + fireBreathCooldown = 600 + getBreathCooldown() + rand.nextInt(getBreathCooldown()); + worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.fire", 1, 1); + setJawMove(20); + } + if (this.canEntityBeSeen(this.targetedEntity) && inRangeOfLeap && rand.nextInt(100) == 0) { + TacticalManager.lungeEntity(this, targetedEntity, 3.0F, 1.5F); + } + if (fallDistance <= 0 && this.canEntityBeSeen(this.targetedEntity) && inRangeOfAttack) { + if ((targetedEntity.isSneaking() && !targetedEntity.onGround) || this.attackCounter <= 0) { + if (targetedEntity.isRiding() && posY > (targetedEntity.posY)) { + targetedEntity.mountEntity(null); + targetedEntity.motionY = 1.0F; + targetedEntity.motionX = this.motionX; + targetedEntity.motionZ = this.motionZ; + if (targetedEntity instanceof EntityLivingBase) { + ((EntityLivingBase) targetedEntity) + .addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 5)); + ((EntityLivingBase) targetedEntity) + .addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 5)); + ((EntityLivingBase) targetedEntity) + .addPotionEffect(new PotionEffect(Potion.weakness.id, 200, 2)); + } + } + attackEntity(targetedEntity, this.getAttackStrength(targetedEntity)); + this.attackCounter = getAttackTime(); + setJawMove(40); + if (getHealth() <= this.getLowHPThreshold()) { + disengage(50); + } + worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.bite", 1, 1); + } + } + if (this.attackCounter > 0) { + --this.attackCounter; + } + if (this.canEntityBeSeen(this.targetedEntity) && !inRangeOfAttack) { + this.faceEntity(targetedEntity, 1F, 1F); + waypointX = targetedEntity.posX; + waypointY = targetedEntity.posY; + waypointZ = targetedEntity.posZ; + } + } else { + this.renderYawOffset = this.rotationYaw = -((float) Math.atan2(this.motionX, this.motionZ)) * 180.0F + / (float) Math.PI; + + if (this.attackCounter > 0) { + --this.attackCounter; + } + } + } + + private float getAttackRange() { return 6.0F; } @@ -462,550 +421,480 @@ private float getFlightSpeed() { } @Override - public boolean canEntityBeSeen(Entity entity) - { - return entity != null && super.canEntityBeSeen(entity); - } + public boolean canEntityBeSeen(Entity entity) { + return entity != null && super.canEntityBeSeen(entity); + } - private int getBreathCooldown() - { + private int getBreathCooldown() { return getType().coolTimer; } - private int getAttackTime() - { + private int getAttackTime() { return getType().meleeSpeed; } /** - * True if the ghast has an unobstructed line of travel to the waypoint. - */ - private boolean isCourseTraversable(double x, double y, double z, double distance) - { - double d4 = (this.waypointX - this.posX) / distance; - double d5 = (this.waypointY - this.posY) / distance; - double d6 = (this.waypointZ - this.posZ) / distance; - AxisAlignedBB axisalignedbb = this.boundingBox.copy(); - - for (int i = 1; (double)i < distance; ++i) - { - axisalignedbb.offset(d4, d5, d6); - - if (!this.worldObj.getCollidingBoundingBoxes(this, axisalignedbb).isEmpty()) - { - return false; - } - Block block = worldObj.getBlock((int)d4, (int)d5, (int)d6); - if(block.getMaterial().isLiquid()) - { - return false; - } - } - - return true; - } - - protected void attackEntity(Entity entity, float f) - { - float damage = this.getAttackStrength(entity); - - if (rand.nextInt(3) == 0) - { - targetedEntity.motionY = 2; - jump(); - setNeckAngle(10); - damage = 2.0F; - } - worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.bite", 1, 1); - entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage); - } - - @Override - public void playLivingSound() - { - super.playLivingSound(); - setJawMove(20); - } - - - private float getAttackStrength(Entity entity) - { + * True if the ghast has an unobstructed line of travel to the waypoint. + */ + private boolean isCourseTraversable(double x, double y, double z, double distance) { + double d4 = (this.waypointX - this.posX) / distance; + double d5 = (this.waypointY - this.posY) / distance; + double d6 = (this.waypointZ - this.posZ) / distance; + AxisAlignedBB axisalignedbb = this.boundingBox.copy(); + + for (int i = 1; i < distance; ++i) { + axisalignedbb.offset(d4, d5, d6); + + if (!this.worldObj.getCollidingBoundingBoxes(this, axisalignedbb).isEmpty()) { + return false; + } + Block block = worldObj.getBlock((int) d4, (int) d5, (int) d6); + if (block.getMaterial().isLiquid()) { + return false; + } + } + + return true; + } + + protected void attackEntity(Entity entity, float f) { + float damage = this.getAttackStrength(entity); + + if (rand.nextInt(3) == 0) { + targetedEntity.motionY = 2; + jump(); + setNeckAngle(10); + damage = 2.0F; + } + worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.bite", 1, 1); + entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage); + } + + @Override + public void playLivingSound() { + super.playLivingSound(); + setJawMove(20); + } + + private float getAttackStrength(Entity entity) { return getType().meleeDamage; } - public void setEntityToAttack(Class enClass) - { - List list = worldObj.getEntitiesWithinAABB(enClass, AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1.0D, posY + 1.0D, posZ + 1.0D).expand(getAggro(), getAggro(), getAggro())); - while (!list.isEmpty()) - { - Entity target = (Entity) list.get(0); - if (canAttackEntity(target)) - { - double r = getAggro(); - boolean inRange = this.getDistanceToEntity(target) <= r; - if(getDisengageTime() <= 0 && inRange) - { - setTarget(target); - list.clear(); - } - else - { - list.remove(0); - } - } - else - { - list.remove(0); - } - } - } - - public void setTarget(Entity target) - { - this.targetedEntity = target; - } - private boolean canAttackEntity(Entity target) - { - if(this.getType().isBlind() && !this.canHearEntity(target) ) - { - return false; - } - if(getDisengageTime() > 0) - { - return false; - } - if(!this.canEntityBeSeen(target))return false; - if (target instanceof EntityDragon || target == this.riddenByEntity) - { - return false; - } - if (target instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer)target; - return !player.capabilities.isCreativeMode; - } - return canEntityBeSeen(target); - } - - private double getAggro() - { - return 256D; - } - + public void setEntityToAttack(Class enClass) { + List list = worldObj.getEntitiesWithinAABB(enClass, + AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1.0D, posY + 1.0D, posZ + 1.0D).expand(getAggro(), + getAggro(), getAggro())); + while (!list.isEmpty()) { + Entity target = (Entity) list.get(0); + if (canAttackEntity(target)) { + double r = getAggro(); + boolean inRange = this.getDistanceToEntity(target) <= r; + if (getDisengageTime() <= 0 && inRange) { + setTarget(target); + list.clear(); + } else { + list.remove(0); + } + } else { + list.remove(0); + } + } + } + + public void setTarget(Entity target) { + this.targetedEntity = target; + } + + private boolean canAttackEntity(Entity target) { + if (this.getType().isBlind() && !this.canHearEntity(target)) { + return false; + } + if (getDisengageTime() > 0) { + return false; + } + if (!this.canEntityBeSeen(target)) + return false; + if (target instanceof EntityDragon || target == this.riddenByEntity) { + return false; + } + if (target instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) target; + return !player.capabilities.isCreativeMode; + } + return canEntityBeSeen(target); + } + + private double getAggro() { + return 256D; + } + @Override - public boolean attackEntityFrom(DamageSource source, float damage) - { - if(source.getEntity() != null) - { + public boolean attackEntityFrom(DamageSource source, float damage) { + if (source.getEntity() != null) { this.interestTime = 0; } - if(getDisengageTime() <= 0 && this.getHealth() < getLowHPThreshold()) - { + if (getDisengageTime() <= 0 && this.getHealth() < getLowHPThreshold()) { disengage(100); } - if(source.isFireDamage()) - return false; - - if(source == DamageSource.inWall) - return false; - - if(source.getEntity() != null && source.getEntity() instanceof EntityPlayer) - { - if(getDisengageTime() <= 0 && getAttackTarget() == null || damage > 16 || (targetedEntity != null && !(targetedEntity instanceof EntityPlayer))) - setTarget(source.getEntity()); - } - - if(source.getEntity() != null) - { - if(getDisengageTime() <= 0 && getAttackTarget() == null) - setTarget(source.getEntity()); - } - return super.attackEntityFrom(source, damage); - } - + if (source.isFireDamage()) + return false; + + if (source == DamageSource.inWall) + return false; + + if (source.getEntity() != null && source.getEntity() instanceof EntityPlayer) { + if (getDisengageTime() <= 0 && getAttackTarget() == null || damage > 16 + || (targetedEntity != null && !(targetedEntity instanceof EntityPlayer))) + setTarget(source.getEntity()); + } + + if (source.getEntity() != null) { + if (getDisengageTime() <= 0 && getAttackTarget() == null) + setTarget(source.getEntity()); + } + return super.attackEntityFrom(source, damage); + } + /** * @return The health threshold where dragons constantly retreat */ - private float getLowHPThreshold() - { + private float getLowHPThreshold() { return getType().health / 4; } - private int getDisengageChance() - { + private int getDisengageChance() { return getType().disengageChance; } @Override - protected String getLivingSound() - { - return "minefantasy2:mob.dragon.say"; - } - + protected String getLivingSound() { + return "minefantasy2:mob.dragon.say"; + } + @Override - protected void func_145780_a(int x, int y, int z, Block floor) - { - this.playSound("minefantasy2:mob.dragon.step", 1.0F, 1.0F); - } - - /** - * Returns the sound this mob makes when it is hurt. - */ + protected void func_145780_a(int x, int y, int z, Block floor) { + this.playSound("minefantasy2:mob.dragon.step", 1.0F, 1.0F); + } + + /** + * Returns the sound this mob makes when it is hurt. + */ @Override - protected String getHurtSound() - { - return "minefantasy2:mob.dragon.hurt"; - } - - /** - * Returns the volume for the sounds this mob makes. - */ + protected String getHurtSound() { + return "minefantasy2:mob.dragon.hurt"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + @Override + protected float getSoundVolume() { + return 2.0F; + } + @Override - protected float getSoundVolume() - { - return 2.0F; - } + protected float getSoundPitch() { + return 1.0F; + } + + protected Item getDropItem() { + return ComponentListMF.dragon_heart; + } + + /** + * Drop 0-2 items of this living's type. @param par1 - Whether this entity has + * recently been hit by a player. @param par2 - Level of Looting used to kill + * this mob. + */ @Override - protected float getSoundPitch() - { - return 1.0F; - } - - protected Item getDropItem() - { - return ComponentListMF.dragon_heart; - } - - /** - * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param - * par2 - Level of Looting used to kill this mob. - */ - @Override - protected void dropFewItems(boolean playerKill, int looting) - { - int count = getLootCount(getTier()) + rand.nextInt(looting+1); - for(int a = 0; a < count; a++) - { - Item drop = getLoot(getTier()); - this.dropItem(drop, 1); - } - if(getTier() == 4)//ANCIENT - { - this.dropItem(Items.nether_star, 1); - } - if(didDropHeart(this.getTier())) - { - this.dropItem(ComponentListMF.dragon_heart, 1); - } - } - - private Item getLoot(int tier) - { - if(tier == 4)//Ancient - { - return ToolListMF.loot_sack_rare; - } - return ToolListMF.loot_sack_uc;//Any - } - - private boolean didDropHeart(int tier) - { - if(tier == 4)//Ancient - { - return true; - } - if(tier == 3)//Elder - { - return true; - } - if(tier == 2)//Mature - { - return rand.nextFloat() * heartChance > 0.25F;//75% chance - } - if(tier == 1)//Adult - { - return rand.nextFloat() * heartChance >0.85F;//15% chance - } - return false;//Young - } - - private int getLootCount(int tier) - { - if(tier == 4)//Ancient - { - return 1;//1 Exquisite - } - if(tier == 3)//Elder - { - return 2 + rand.nextInt(4);//2-5 Valuable - } - if(tier == 2)//Mature - { - return 2 + rand.nextInt(1);//2-3 Valuable - } - if(tier == 1)//Adult - { - return 1 + rand.nextInt(1);//1-2 Valuable - } - return 1;//Young, 1 Valuable + protected void dropFewItems(boolean playerKill, int looting) { + int count = getLootCount(getTier()) + rand.nextInt(looting + 1); + for (int a = 0; a < count; a++) { + Item drop = getLoot(getTier()); + this.dropItem(drop, 1); + } + if (getTier() == 4)// ANCIENT + { + this.dropItem(Items.nether_star, 1); + } + if (didDropHeart(this.getTier())) { + this.dropItem(ComponentListMF.dragon_heart, 1); + } + } + + private Item getLoot(int tier) { + if (tier == 4)// Ancient + { + return ToolListMF.loot_sack_rare; + } + return ToolListMF.loot_sack_uc;// Any + } + + private boolean didDropHeart(int tier) { + if (tier == 4)// Ancient + { + return true; + } + if (tier == 3)// Elder + { + return true; + } + if (tier == 2)// Mature + { + return rand.nextFloat() * heartChance > 0.25F;// 75% chance + } + if (tier == 1)// Adult + { + return rand.nextFloat() * heartChance > 0.85F;// 15% chance + } + return false;// Young + } + + private int getLootCount(int tier) { + if (tier == 4)// Ancient + { + return 1;// 1 Exquisite + } + if (tier == 3)// Elder + { + return 2 + rand.nextInt(4);// 2-5 Valuable + } + if (tier == 2)// Mature + { + return 2 + rand.nextInt(1);// 2-3 Valuable + } + if (tier == 1)// Adult + { + return 1 + rand.nextInt(1);// 1-2 Valuable + } + return 1;// Young, 1 Valuable } /** - * Checks if the entity's current position is a valid location to spawn this entity. - */ - @Override - public boolean getCanSpawnHere() - { + * Checks if the entity's current position is a valid location to spawn this + * entity. + */ + @Override + public boolean getCanSpawnHere() { return super.getCanSpawnHere() && this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL; - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - public int getMaxSpawnedInChunk() - { - return 1; - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - public void writeEntityToNBT(NBTTagCompound nbt) - { - super.writeEntityToNBT(nbt); - - nbt.setInteger("FireBreath", fireBreathTick); - nbt.setInteger("FireBreathCooldown", fireBreathTick); - - nbt.setInteger("Breed", getBreed()); - nbt.setInteger("Tier", getTier()); - nbt.setInteger("interestTime", interestTime); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - public void readEntityFromNBT(NBTTagCompound nbt) - { - super.readEntityFromNBT(nbt); - - fireBreathTick = nbt.getInteger("FireBreath"); - fireBreathCooldown =nbt.getInteger("FireBreathCooldown"); - - setBreed(nbt.getInteger("Breed")); - setTier(nbt.getInteger("Tier")); - interestTime = nbt.getInteger("interestTime"); - - } - - @SideOnly(Side.CLIENT) - public String getTexture() - { + } + + /** + * Will return how many at most can spawn in a chunk at once. + */ + public int getMaxSpawnedInChunk() { + return 1; + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + + nbt.setInteger("FireBreath", fireBreathTick); + nbt.setInteger("FireBreathCooldown", fireBreathTick); + + nbt.setInteger("Breed", getBreed()); + nbt.setInteger("Tier", getTier()); + nbt.setInteger("interestTime", interestTime); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + + fireBreathTick = nbt.getInteger("FireBreath"); + fireBreathCooldown = nbt.getInteger("FireBreathCooldown"); + + setBreed(nbt.getInteger("Breed")); + setTier(nbt.getInteger("Tier")); + interestTime = nbt.getInteger("interestTime"); + + } + + @SideOnly(Side.CLIENT) + public String getTexture() { return getType().tex; } - - @SideOnly(Side.CLIENT) - public double wingFlap() - { + + @SideOnly(Side.CLIENT) + public double wingFlap() { return wingFlap; } - - @SideOnly(Side.CLIENT) - public float getJawMove() - { - return dataWatcher.getWatchableObjectFloat(dataID+1); - } - - @SideOnly(Side.CLIENT) - public float getNeckAngle() - { - return dataWatcher.getWatchableObjectFloat(dataID+2); - } - - public int getDisengageTime() - { - return dataWatcher.getWatchableObjectInt(dataID+3); - } - - public void setJawMove(float i) - { - dataWatcher.updateObject(dataID+1, i); - } - - public void setNeckAngle(float i) - { - dataWatcher.updateObject(dataID+2, i); - } - - public void setDisengageTime(int i) - { - dataWatcher.updateObject(dataID+3, i); - } - - @Override - public boolean isTerrestrial() - { + + @SideOnly(Side.CLIENT) + public float getJawMove() { + return dataWatcher.getWatchableObjectFloat(dataID + 1); + } + + @SideOnly(Side.CLIENT) + public float getNeckAngle() { + return dataWatcher.getWatchableObjectFloat(dataID + 2); + } + + public int getDisengageTime() { + return dataWatcher.getWatchableObjectInt(dataID + 3); + } + + public void setJawMove(float i) { + dataWatcher.updateObject(dataID + 1, i); + } + + public void setNeckAngle(float i) { + dataWatcher.updateObject(dataID + 2, i); + } + + public void setDisengageTime(int i) { + dataWatcher.updateObject(dataID + 3, i); + } + + @Override + public boolean isTerrestrial() { return dataWatcher.getWatchableObjectByte(dataID) == 1; } - - public void setTerrestrial(boolean flag) - { - dataWatcher.updateObject(dataID, (byte)(flag ? 1 : 0)); - } - public double wingAngle() - { + public void setTerrestrial(boolean flag) { + dataWatcher.updateObject(dataID, (byte) (flag ? 1 : 0)); + } + + public double wingAngle() { return isTerrestrial() ? 0D : 45D; } - - private void moveToTarget() - { - if(getDisengageTime() <= 0 && targetedEntity != null) - { - this.faceEntity(targetedEntity, 1F, 1F); - this.waypointX = targetedEntity.posX; - this.waypointY = targetedEntity.posY; - this.waypointZ = targetedEntity.posZ; - } - } - - public void disengage(int time) - { - if(targetedEntity != null && targetedEntity instanceof EntityPlayer) - { + + private void moveToTarget() { + if (getDisengageTime() <= 0 && targetedEntity != null) { + this.faceEntity(targetedEntity, 1F, 1F); + this.waypointX = targetedEntity.posX; + this.waypointY = targetedEntity.posY; + this.waypointZ = targetedEntity.posZ; + } + } + + public void disengage(int time) { + if (targetedEntity != null && targetedEntity instanceof EntityPlayer) { lastEnemy = targetedEntity; } setDisengageTime(time); setTerrestrial(false); - this.waypointX = this.posX + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.waypointY = this.posY + (double) ((this.rand.nextFloat()) * 16.0F); - this.waypointZ = this.posZ + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - targetedEntity = null; - } - - public DragonBreed getType() - { + this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.waypointY = this.posY + (this.rand.nextFloat()) * 16.0F; + this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + targetedEntity = null; + } + + public DragonBreed getType() { return DragonBreed.getBreed(getTier(), getBreed()); } - public int getBreed() - { - return dataWatcher.getWatchableObjectInt(dataID+4); - } - - public void setBreed(int i) - { - dataWatcher.updateObject(dataID+4, i); - } - public int getTier() - { - return dataWatcher.getWatchableObjectInt(dataID+5); - } - - public void setTier(int i) - { - dataWatcher.updateObject(dataID+5, i); - } - public String getCommandSenderName() - { - String tierName = StatCollector.translateToLocal("entity." + getType().name + ".name"); - String breedName = StatCollector.translateToLocal("entity.dragonbreed." + getType().breedName + ".name"); - return StatCollector.translateToLocalFormatted(tierName, breedName); - } - - public float getScale() - { + + public int getBreed() { + return dataWatcher.getWatchableObjectInt(dataID + 4); + } + + public void setBreed(int i) { + dataWatcher.updateObject(dataID + 4, i); + } + + public int getTier() { + return dataWatcher.getWatchableObjectInt(dataID + 5); + } + + public void setTier(int i) { + dataWatcher.updateObject(dataID + 5, i); + } + + public String getCommandSenderName() { + String tierName = StatCollector.translateToLocal("entity." + getType().name + ".name"); + String breedName = StatCollector.translateToLocal("entity.dragonbreed." + getType().breedName + ".name"); + return StatCollector.translateToLocalFormatted(tierName, breedName); + } + + public float getScale() { return 0.6F + (getTier() * 0.2F); } - - public Shockwave createShockwave(double x, double y, double z, float power, boolean grief) - { - return newShockwave(x, y, z, power, false, grief); - } - - /** - * returns a new explosion. Does initiation (at time of writing Explosion is not finished) - */ - public Shockwave newShockwave(double x, double y, double z, float power, boolean fire, boolean smoke) - { - Shockwave explosion = new Shockwave("dragonstomp", worldObj, this, x, y, z, power); - explosion.isFlaming = fire; - explosion.isGriefing = worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"); - explosion.isSmoking = smoke; - explosion.initiate(); - explosion.decorateWave(true); - return explosion; - } - - public float getFirePyro() - { - if(!ConfigMobs.dragonGriefFire) - { + + public Shockwave createShockwave(double x, double y, double z, float power, boolean grief) { + return newShockwave(x, y, z, power, false, grief); + } + + /** + * returns a new explosion. Does initiation (at time of writing Explosion is not + * finished) + */ + public Shockwave newShockwave(double x, double y, double z, float power, boolean fire, boolean smoke) { + Shockwave explosion = new Shockwave("dragonstomp", worldObj, this, x, y, z, power); + explosion.isFlaming = fire; + explosion.isGriefing = worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"); + explosion.isSmoking = smoke; + explosion.initiate(); + explosion.decorateWave(true); + return explosion; + } + + public float getFirePyro() { + if (!ConfigMobs.dragonGriefFire) { return 0F; } return getType().pyro; } @Override - public float getThreshold(DamageSource src) - { - if(!src.isUnblockable()) - { + public float getThreshold(DamageSource src) { + if (!src.isUnblockable()) { return getType().DT; } return 0; } @Override - public float[] getHitTraits() - { - return new float[]{0, 1, 9};//90% Piercing, 10% BLunt + public float[] getHitTraits() { + return new float[] { 0, 1, 9 };// 90% Piercing, 10% BLunt } - + @SideOnly(Side.CLIENT) - public float getVertTailAngle() - { - if(this.motionY > 0.05F || this.motionY < -0.05F)//accend or decend + public float getVertTailAngle() { + if (this.motionY > 0.05F || this.motionY < -0.05F)// accend or decend { - if(!(this.motionX == 0 && this.motionZ == 0))//moving + if (!(this.motionX == 0 && this.motionZ == 0))// moving { - float angle = (float) (45F * this.motionY)*5; - if(angle < -45) angle = -45; - if(angle > 45) angle = 45; - + float angle = (float) (45F * this.motionY) * 5; + if (angle < -45) + angle = -45; + if (angle > 45) + angle = 45; + return angle; } } return 0; } - private boolean canHearEntity(Entity target) - { - if(target instanceof EntityLivingBase && PowerArmour.isWearingCogwork((EntityLivingBase)target)) return true; - + + private boolean canHearEntity(Entity target) { + if (target instanceof EntityLivingBase && PowerArmour.isWearingCogwork((EntityLivingBase) target)) + return true; + double distance = getDistanceToEntity(target); - - - if(distance < width/2) - { - return true;//touching + + if (distance < width / 2) { + return true;// touching } - if(distance < 16 && this.getAttackTarget() != null && getAttackTarget() == target) - { - return true;//Smell + if (distance < 16 && this.getAttackTarget() != null && getAttackTarget() == target) { + return true;// Smell } - float tarSpeed = (float)Math.hypot (target.motionX, target.motionZ); - - if(tarSpeed < 0.1F) - { + float tarSpeed = (float) Math.hypot(target.motionX, target.motionZ); + + if (tarSpeed < 0.1F) { return false; } - if(target instanceof EntityLivingBase) - { - return getSound((EntityLivingBase)target, tarSpeed) >= distance; + if (target instanceof EntityLivingBase) { + return getSound((EntityLivingBase) target, tarSpeed) >= distance; } return true; } - private double getSound(EntityLivingBase target, float speed) - { + private double getSound(EntityLivingBase target, float speed) { float value = 10F * (60F + ArmourCalculator.getTotalWeightOfWorn(target, false)) * speed; return value; } diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityFlyingMF.java b/src/main/java/minefantasy/mf2/entity/mob/EntityFlyingMF.java index a32d19d9..b4276816 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityFlyingMF.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityFlyingMF.java @@ -4,102 +4,93 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public abstract class EntityFlyingMF extends EntityLiving -{ - public EntityFlyingMF(World world) - { - super(world); - } +public abstract class EntityFlyingMF extends EntityLiving { + public EntityFlyingMF(World world) { + super(world); + } - /** - * Called when the mob is falling. Calculates and applies fall damage. - */ - protected void fall(float distance) {} + /** + * Called when the mob is falling. Calculates and applies fall damage. + */ + protected void fall(float distance) { + } - /** - * Takes in the distance the entity has fallen this tick and whether its on the ground to update the fall distance - * and deal fall damage if landing on the ground. Args: distanceFallenThisTick, onGround - */ - protected void updateFallState(double distance, boolean hitground) - { - if(isTerrestrial()) - { - super.updateFallState(distance, hitground); - } - } + /** + * Takes in the distance the entity has fallen this tick and whether its on the + * ground to update the fall distance and deal fall damage if landing on the + * ground. Args: distanceFallenThisTick, onGround + */ + protected void updateFallState(double distance, boolean hitground) { + if (isTerrestrial()) { + super.updateFallState(distance, hitground); + } + } - /** - * Moves the entity based on the specified heading. Args: strafe, forward - */ - @Override - public void moveEntityWithHeading(float strafe, float forward) - { - if(isTerrestrial()) - { - super.moveEntityWithHeading(strafe, forward); - return; - } - if (this.isInWater()) - { - this.moveFlying(strafe, forward, 0.02F); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.800000011920929D; - this.motionY *= 0.800000011920929D; - this.motionZ *= 0.800000011920929D; - } - else if (this.handleLavaMovement()) - { - this.moveFlying(strafe, forward, 0.02F); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.5D; - this.motionY *= 0.5D; - this.motionZ *= 0.5D; - } - else - { - float f2 = 0.91F; + /** + * Moves the entity based on the specified heading. Args: strafe, forward + */ + @Override + public void moveEntityWithHeading(float strafe, float forward) { + if (isTerrestrial()) { + super.moveEntityWithHeading(strafe, forward); + return; + } + if (this.isInWater()) { + this.moveFlying(strafe, forward, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.800000011920929D; + this.motionY *= 0.800000011920929D; + this.motionZ *= 0.800000011920929D; + } else if (this.handleLavaMovement()) { + this.moveFlying(strafe, forward, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.5D; + this.motionY *= 0.5D; + this.motionZ *= 0.5D; + } else { + float f2 = 0.91F; - if (this.onGround) - { - f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; - } + if (this.onGround) { + f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), + MathHelper.floor_double(this.boundingBox.minY) - 1, + MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; + } - float f3 = 0.16277136F / (f2 * f2 * f2); - this.moveFlying(strafe, forward, this.onGround ? 0.1F * f3 : 0.02F); - f2 = 0.91F; + float f3 = 0.16277136F / (f2 * f2 * f2); + this.moveFlying(strafe, forward, this.onGround ? 0.1F * f3 : 0.02F); + f2 = 0.91F; - if (this.onGround) - { - f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; - } + if (this.onGround) { + f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), + MathHelper.floor_double(this.boundingBox.minY) - 1, + MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; + } - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= (double)f2; - this.motionY *= (double)f2; - this.motionZ *= (double)f2; - } + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= f2; + this.motionY *= f2; + this.motionZ *= f2; + } - this.prevLimbSwingAmount = this.limbSwingAmount; - double d1 = this.posX - this.prevPosX; - double d0 = this.posZ - this.prevPosZ; - float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F; + this.prevLimbSwingAmount = this.limbSwingAmount; + double d1 = this.posX - this.prevPosX; + double d0 = this.posZ - this.prevPosZ; + float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F; - if (f4 > 1.0F) - { - f4 = 1.0F; - } + if (f4 > 1.0F) { + f4 = 1.0F; + } - this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F; - this.limbSwing += this.limbSwingAmount; - } + this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F; + this.limbSwing += this.limbSwingAmount; + } - /** - * returns true if this entity is by a ladder, false otherwise - */ - public boolean isOnLadder() - { - return isTerrestrial() ? super.isOnLadder() : false; - } - - public abstract boolean isTerrestrial(); + /** + * returns true if this entity is by a ladder, false otherwise + */ + public boolean isOnLadder() { + return isTerrestrial() ? super.isOnLadder() : false; + } + + public abstract boolean isTerrestrial(); } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityHound.java b/src/main/java/minefantasy/mf2/entity/mob/EntityHound.java index 562beef7..a72d1ed1 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityHound.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityHound.java @@ -40,637 +40,543 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class EntityHound extends EntityTameable -{ - private float field_70926_e; - private float field_70924_f; - /** true is the wolf is wet else false */ - private boolean isShaking; - private boolean field_70928_h; - /** This time increases while wolf is shaking and emitting water particles. */ - private float timeWolfIsShaking; - private float prevTimeWolfIsShaking; - - public EntityHound(World world) - { - super(world); - this.setSize(0.6F, 0.8F); - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(1, new AI_CommonSprint(this, 16.0F)); - this.tasks.addTask(2, this.aiSit); - this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); - this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); - this.tasks.addTask(5, new AI_HoundFollow(this, 1.0D, 6.0F, 2.0F)); - this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(8, new AI_HoundBeg(this, 8.0F)); - this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(9, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); - this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); - this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); - - this.setTamed(false); - } - - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); - - if (this.isTamed()) - { - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); - } - else - { - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D); - } - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - public boolean isAIEnabled() - { - return true; - } - - /** - * Sets the active target the Task system uses for tracking - */ - @Override - public void setAttackTarget(EntityLivingBase target) - { - super.setAttackTarget(target); - - if (target == null) - { - this.setAngry(false); - } - else if (!this.isTamed()) - { - this.setAngry(true); - } - } - - /** - * main AI tick function, replaces updateEntityActionState - */ - @Override - protected void updateAITick() - { - this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); - } - - @Override - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(18, new Float(this.getHealth())); - this.dataWatcher.addObject(19, new Byte((byte)0)); - this.dataWatcher.addObject(20, new Byte((byte)BlockColored.func_150032_b(1))); - } - - @Override - protected void func_145780_a(int x, int y, int z, Block surface) - { - this.playSound("mob.wolf.step", 0.15F, 1.0F); - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound nbt) - { - super.writeEntityToNBT(nbt); - nbt.setBoolean("Angry", this.isAngry()); - nbt.setByte("CollarColor", (byte)this.getCollarColor()); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound nbt) - { - super.readEntityFromNBT(nbt); - this.setAngry(nbt.getBoolean("Angry")); - - if (nbt.hasKey("CollarColor", 99)) - { - this.setCollarColor(nbt.getByte("CollarColor")); - } - } - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return this.isAngry() ? "mob.wolf.growl" : (this.rand.nextInt(3) == 0 ? (this.isTamed() && this.dataWatcher.getWatchableObjectFloat(18) < 10.0F ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return "mob.wolf.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return "mob.wolf.death"; - } - - /** - * Returns the volume for the sounds this mob makes. - */ - @Override - protected float getSoundVolume() - { - return 0.4F; - } - - @Override - protected Item getDropItem() - { - return Item.getItemById(-1); - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - super.onLivingUpdate(); - - if (!this.worldObj.isRemote && this.isShaking && !this.field_70928_h && !this.hasPath() && this.onGround) - { - this.field_70928_h = true; - this.timeWolfIsShaking = 0.0F; - this.prevTimeWolfIsShaking = 0.0F; - this.worldObj.setEntityState(this, (byte)8); - } - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() - { - super.onUpdate(); - this.field_70924_f = this.field_70926_e; - - if (this.func_70922_bv()) - { - this.field_70926_e += (1.0F - this.field_70926_e) * 0.4F; - } - else - { - this.field_70926_e += (0.0F - this.field_70926_e) * 0.4F; - } - - if (this.func_70922_bv()) - { - this.numTicksToChaseTarget = 10; - } - - if (this.isWet()) - { - this.isShaking = true; - this.field_70928_h = false; - this.timeWolfIsShaking = 0.0F; - this.prevTimeWolfIsShaking = 0.0F; - } - else if ((this.isShaking || this.field_70928_h) && this.field_70928_h) - { - if (this.timeWolfIsShaking == 0.0F) - { - this.playSound("mob.wolf.shake", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); - } - - this.prevTimeWolfIsShaking = this.timeWolfIsShaking; - this.timeWolfIsShaking += 0.05F; - - if (this.prevTimeWolfIsShaking >= 2.0F) - { - this.isShaking = false; - this.field_70928_h = false; - this.prevTimeWolfIsShaking = 0.0F; - this.timeWolfIsShaking = 0.0F; - } - - if (this.timeWolfIsShaking > 0.4F) - { - float f = (float)this.boundingBox.minY; - int i = (int)(MathHelper.sin((this.timeWolfIsShaking - 0.4F) * (float)Math.PI) * 7.0F); - - for (int j = 0; j < i; ++j) - { - float f1 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; - float f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; - this.worldObj.spawnParticle("splash", this.posX + (double)f1, (double)(f + 0.8F), this.posZ + (double)f2, this.motionX, this.motionY, this.motionZ); - } - } - } - } - - @SideOnly(Side.CLIENT) - public boolean getWolfShaking() - { - return this.isShaking; - } - - /** - * Used when calculating the amount of shading to apply while the wolf is shaking. - */ - @SideOnly(Side.CLIENT) - public float getShadingWhileShaking(float p_70915_1_) - { - return 0.75F + (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70915_1_) / 2.0F * 0.25F; - } - - @SideOnly(Side.CLIENT) - public float getShakeAngle(float p_70923_1_, float p_70923_2_) - { - float f2 = (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70923_1_ + p_70923_2_) / 1.8F; - - if (f2 < 0.0F) - { - f2 = 0.0F; - } - else if (f2 > 1.0F) - { - f2 = 1.0F; - } - - return MathHelper.sin(f2 * (float)Math.PI) * MathHelper.sin(f2 * (float)Math.PI * 11.0F) * 0.15F * (float)Math.PI; - } - - @Override - public float getEyeHeight() - { - return this.height * 0.8F; - } - - @SideOnly(Side.CLIENT) - public float getInterestedAngle(float p_70917_1_) - { - return (this.field_70924_f + (this.field_70926_e - this.field_70924_f) * p_70917_1_) * 0.15F * (float)Math.PI; - } - - /** - * The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently - * use in wolves. - */ - @Override - public int getVerticalFaceSpeed() - { - return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); - } - - /** - * Called when the entity is attacked. - */ - @Override - public boolean attackEntityFrom(DamageSource source, float dam) - { - if (this.isEntityInvulnerable()) - { - return false; - } - else - { - Entity entity = source.getEntity(); - this.aiSit.setSitting(false); - - if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) - { - dam = (dam + 1.0F) / 2.0F; - } - - return super.attackEntityFrom(source, dam); - } - } - - @Override - public boolean attackEntityAsMob(Entity target) - { - int i = this.isTamed() ? 4 : 2; - return target.attackEntityFrom(DamageSource.causeMobDamage(this), (float)i); - } - - @Override - public void setTamed(boolean flag) - { - super.setTamed(flag); - - if (flag) - { - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); - } - else - { - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D); - } - } - - /** - * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. - */ - @Override - public boolean interact(EntityPlayer user) - { - ItemStack itemstack = user.inventory.getCurrentItem(); - - if (this.isTamed()) - { - if (itemstack != null) - { - if (itemstack.getItem() instanceof ItemFood) - { - ItemFood itemfood = (ItemFood)itemstack.getItem(); - - if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < 20.0F) - { - if (!user.capabilities.isCreativeMode) - { - --itemstack.stackSize; - } - - this.heal((float)itemfood.func_150905_g(itemstack)); - - if (itemstack.stackSize <= 0) - { - user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack)null); - } - - return true; - } - } - else if (itemstack.getItem() == Items.dye) - { - int i = BlockColored.func_150032_b(itemstack.getItemDamage()); - - if (i != this.getCollarColor()) - { - this.setCollarColor(i); - - if (!user.capabilities.isCreativeMode && --itemstack.stackSize <= 0) - { - user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack)null); - } - - return true; - } - } - } - - if (this.func_152114_e(user) && !this.worldObj.isRemote && !this.isBreedingItem(itemstack)) - { - this.aiSit.setSitting(!this.isSitting()); - this.isJumping = false; - this.setPathToEntity((PathEntity)null); - this.setTarget((Entity)null); - this.setAttackTarget((EntityLivingBase)null); - } - } - else if (itemstack != null && itemstack.getItem() == Items.bone && !this.isAngry()) - { - if (!user.capabilities.isCreativeMode) - { - --itemstack.stackSize; - } - - if (itemstack.stackSize <= 0) - { - user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack)null); - } - - if (!this.worldObj.isRemote) - { - if (this.rand.nextInt(3) == 0) - { - this.setTamed(true); - this.setPathToEntity((PathEntity)null); - this.setAttackTarget((EntityLivingBase)null); - this.aiSit.setSitting(true); - this.setHealth(20.0F); - this.func_152115_b(user.getUniqueID().toString()); - this.playTameEffect(true); - this.worldObj.setEntityState(this, (byte)7); - } - else - { - this.playTameEffect(false); - this.worldObj.setEntityState(this, (byte)6); - } - } - - return true; - } - - return super.interact(user); - } - - @SideOnly(Side.CLIENT) - @Override - public void handleHealthUpdate(byte id) - { - if (id == 8) - { - this.field_70928_h = true; - this.timeWolfIsShaking = 0.0F; - this.prevTimeWolfIsShaking = 0.0F; - } - else - { - super.handleHealthUpdate(id); - } - } - - @SideOnly(Side.CLIENT) - public float getTailRotation() - { - return this.isAngry() ? 1.5393804F : (this.isTamed() ? (0.55F - (20.0F - this.dataWatcher.getWatchableObjectFloat(18)) * 0.02F) * (float)Math.PI : ((float)Math.PI / 5F)); - } - - /** - * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on - * the animal type) - */ - @Override - public boolean isBreedingItem(ItemStack item) - { - return item == null ? false : (!(item.getItem() instanceof ItemFood) ? false : ((ItemFood)item.getItem()).isWolfsFavoriteMeat()); - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - @Override - public int getMaxSpawnedInChunk() - { - return 8; - } - - /** - * Determines whether this wolf is angry or not. - */ - public boolean isAngry() - { - return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; - } - - /** - * Sets whether this wolf is angry or not. - */ - public void setAngry(boolean flag) - { - byte b0 = this.dataWatcher.getWatchableObjectByte(16); - - if (flag) - { - this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 2))); - } - else - { - this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -3))); - } - } - - /** - * Return this wolf's collar color. - */ - public int getCollarColor() - { - return this.dataWatcher.getWatchableObjectByte(20) & 15; - } - - /** - * Set this wolf's collar color. - */ - public void setCollarColor(int colour) - { - this.dataWatcher.updateObject(20, Byte.valueOf((byte)(colour & 15))); - } - - @Override - public EntityHound createChild(EntityAgeable parent) - { - EntityHound entitywolf = new EntityHound(this.worldObj); - String s = this.func_152113_b(); - - if (s != null && s.trim().length() > 0) - { - entitywolf.func_152115_b(s); - entitywolf.setTamed(true); - } - - return entitywolf; - } - - public void func_70918_i(boolean flag) - { - if (flag) - { - this.dataWatcher.updateObject(19, Byte.valueOf((byte)1)); - } - else - { - this.dataWatcher.updateObject(19, Byte.valueOf((byte)0)); - } - } - - /** - * Returns true if the mob is currently able to mate with the specified mob. - */ - @Override - public boolean canMateWith(EntityAnimal mate) - { - if (mate == this) - { - return false; - } - else if (!this.isTamed()) - { - return false; - } - else if (!(mate instanceof EntityHound)) - { - return false; - } - else - { - EntityHound entitywolf = (EntityHound)mate; - return !entitywolf.isTamed() ? false : (entitywolf.isSitting() ? false : this.isInLove() && entitywolf.isInLove()); - } - } - - public boolean func_70922_bv() - { - return this.dataWatcher.getWatchableObjectByte(19) == 1; - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return !this.isTamed() && this.ticksExisted > 2400; - } - - @Override - public boolean func_142018_a(EntityLivingBase target, EntityLivingBase owner) - { - if (!(target instanceof EntityCreeper) && !(target instanceof EntityGhast)) - { - if (target instanceof EntityHound) - { - EntityHound entitywolf = (EntityHound)target; - - if (entitywolf.isTamed() && entitywolf.getOwner() == owner) - { - return false; - } - } - - return target instanceof EntityPlayer && owner instanceof EntityPlayer && !((EntityPlayer)owner).canAttackPlayer((EntityPlayer)target) ? false : !(target instanceof EntityHorse) || !((EntityHorse)target).isTame(); - } - else - { - return false; - } - } - - //Animations - public float jawMove; +public class EntityHound extends EntityTameable { + private float field_70926_e; + private float field_70924_f; + /** true is the wolf is wet else false */ + private boolean isShaking; + private boolean field_70928_h; + /** This time increases while wolf is shaking and emitting water particles. */ + private float timeWolfIsShaking; + private float prevTimeWolfIsShaking; + + public EntityHound(World world) { + super(world); + this.setSize(0.6F, 0.8F); + this.getNavigator().setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + this.tasks.addTask(1, new AI_CommonSprint(this, 16.0F)); + this.tasks.addTask(2, this.aiSit); + this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(5, new AI_HoundFollow(this, 1.0D, 6.0F, 2.0F)); + this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + this.tasks.addTask(8, new AI_HoundBeg(this, 8.0F)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); + this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); + this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); + + this.setTamed(false); + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); + + if (this.isTamed()) { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); + } else { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D); + } + } + + /** + * Returns true if the newer Entity AI code should be run + */ + @Override + public boolean isAIEnabled() { + return true; + } + + /** + * Sets the active target the Task system uses for tracking + */ + @Override + public void setAttackTarget(EntityLivingBase target) { + super.setAttackTarget(target); + + if (target == null) { + this.setAngry(false); + } else if (!this.isTamed()) { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + @Override + protected void updateAITick() { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + @Override + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + this.dataWatcher.addObject(20, new Byte((byte) BlockColored.func_150032_b(1))); + } + + @Override + protected void func_145780_a(int x, int y, int z, Block surface) { + this.playSound("mob.wolf.step", 0.15F, 1.0F); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setBoolean("Angry", this.isAngry()); + nbt.setByte("CollarColor", (byte) this.getCollarColor()); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + this.setAngry(nbt.getBoolean("Angry")); + + if (nbt.hasKey("CollarColor", 99)) { + this.setCollarColor(nbt.getByte("CollarColor")); + } + } + + /** + * Returns the sound this mob makes while it's alive. + */ + @Override + protected String getLivingSound() { + return this.isAngry() ? "mob.wolf.growl" + : (this.rand.nextInt(3) == 0 + ? (this.isTamed() && this.dataWatcher.getWatchableObjectFloat(18) < 10.0F ? "mob.wolf.whine" + : "mob.wolf.panting") + : "mob.wolf.bark"); + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + @Override + protected String getHurtSound() { + return "mob.wolf.hurt"; + } + + /** + * Returns the sound this mob makes on death. + */ + @Override + protected String getDeathSound() { + return "mob.wolf.death"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + @Override + protected float getSoundVolume() { + return 0.4F; + } + + @Override + protected Item getDropItem() { + return Item.getItemById(-1); + } + + /** + * Called frequently so the entity can update its state every tick as required. + * For example, zombies and skeletons use this to react to sunlight and start to + * burn. + */ + @Override + public void onLivingUpdate() { + super.onLivingUpdate(); + + if (!this.worldObj.isRemote && this.isShaking && !this.field_70928_h && !this.hasPath() && this.onGround) { + this.field_70928_h = true; + this.timeWolfIsShaking = 0.0F; + this.prevTimeWolfIsShaking = 0.0F; + this.worldObj.setEntityState(this, (byte) 8); + } + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + super.onUpdate(); + this.field_70924_f = this.field_70926_e; + + if (this.func_70922_bv()) { + this.field_70926_e += (1.0F - this.field_70926_e) * 0.4F; + } else { + this.field_70926_e += (0.0F - this.field_70926_e) * 0.4F; + } + + if (this.func_70922_bv()) { + this.numTicksToChaseTarget = 10; + } + + if (this.isWet()) { + this.isShaking = true; + this.field_70928_h = false; + this.timeWolfIsShaking = 0.0F; + this.prevTimeWolfIsShaking = 0.0F; + } else if ((this.isShaking || this.field_70928_h) && this.field_70928_h) { + if (this.timeWolfIsShaking == 0.0F) { + this.playSound("mob.wolf.shake", this.getSoundVolume(), + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + } + + this.prevTimeWolfIsShaking = this.timeWolfIsShaking; + this.timeWolfIsShaking += 0.05F; + + if (this.prevTimeWolfIsShaking >= 2.0F) { + this.isShaking = false; + this.field_70928_h = false; + this.prevTimeWolfIsShaking = 0.0F; + this.timeWolfIsShaking = 0.0F; + } + + if (this.timeWolfIsShaking > 0.4F) { + float f = (float) this.boundingBox.minY; + int i = (int) (MathHelper.sin((this.timeWolfIsShaking - 0.4F) * (float) Math.PI) * 7.0F); + + for (int j = 0; j < i; ++j) { + float f1 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; + float f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; + this.worldObj.spawnParticle("splash", this.posX + f1, f + 0.8F, this.posZ + f2, this.motionX, + this.motionY, this.motionZ); + } + } + } + } + + @SideOnly(Side.CLIENT) + public boolean getWolfShaking() { + return this.isShaking; + } + + /** + * Used when calculating the amount of shading to apply while the wolf is + * shaking. + */ + @SideOnly(Side.CLIENT) + public float getShadingWhileShaking(float p_70915_1_) { + return 0.75F + (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70915_1_) + / 2.0F * 0.25F; + } + + @SideOnly(Side.CLIENT) + public float getShakeAngle(float p_70923_1_, float p_70923_2_) { + float f2 = (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70923_1_ + + p_70923_2_) / 1.8F; + + if (f2 < 0.0F) { + f2 = 0.0F; + } else if (f2 > 1.0F) { + f2 = 1.0F; + } + + return MathHelper.sin(f2 * (float) Math.PI) * MathHelper.sin(f2 * (float) Math.PI * 11.0F) * 0.15F + * (float) Math.PI; + } + + @Override + public float getEyeHeight() { + return this.height * 0.8F; + } + + @SideOnly(Side.CLIENT) + public float getInterestedAngle(float p_70917_1_) { + return (this.field_70924_f + (this.field_70926_e - this.field_70924_f) * p_70917_1_) * 0.15F * (float) Math.PI; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the + * faceEntity method. This is only currently use in wolves. + */ + @Override + public int getVerticalFaceSpeed() { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + @Override + public boolean attackEntityFrom(DamageSource source, float dam) { + if (this.isEntityInvulnerable()) { + return false; + } else { + Entity entity = source.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) { + dam = (dam + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(source, dam); + } + } + + @Override + public boolean attackEntityAsMob(Entity target) { + int i = this.isTamed() ? 4 : 2; + return target.attackEntityFrom(DamageSource.causeMobDamage(this), i); + } + + @Override + public void setTamed(boolean flag) { + super.setTamed(flag); + + if (flag) { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); + } else { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets + * into the saddle on a pig. + */ + @Override + public boolean interact(EntityPlayer user) { + ItemStack itemstack = user.inventory.getCurrentItem(); + + if (this.isTamed()) { + if (itemstack != null) { + if (itemstack.getItem() instanceof ItemFood) { + ItemFood itemfood = (ItemFood) itemstack.getItem(); + + if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < 20.0F) { + if (!user.capabilities.isCreativeMode) { + --itemstack.stackSize; + } + + this.heal(itemfood.func_150905_g(itemstack)); + + if (itemstack.stackSize <= 0) { + user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } else if (itemstack.getItem() == Items.dye) { + int i = BlockColored.func_150032_b(itemstack.getItemDamage()); + + if (i != this.getCollarColor()) { + this.setCollarColor(i); + + if (!user.capabilities.isCreativeMode && --itemstack.stackSize <= 0) { + user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } + } + + if (this.func_152114_e(user) && !this.worldObj.isRemote && !this.isBreedingItem(itemstack)) { + this.aiSit.setSitting(!this.isSitting()); + this.isJumping = false; + this.setPathToEntity((PathEntity) null); + this.setTarget((Entity) null); + this.setAttackTarget((EntityLivingBase) null); + } + } else if (itemstack != null && itemstack.getItem() == Items.bone && !this.isAngry()) { + if (!user.capabilities.isCreativeMode) { + --itemstack.stackSize; + } + + if (itemstack.stackSize <= 0) { + user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack) null); + } + + if (!this.worldObj.isRemote) { + if (this.rand.nextInt(3) == 0) { + this.setTamed(true); + this.setPathToEntity((PathEntity) null); + this.setAttackTarget((EntityLivingBase) null); + this.aiSit.setSitting(true); + this.setHealth(20.0F); + this.func_152115_b(user.getUniqueID().toString()); + this.playTameEffect(true); + this.worldObj.setEntityState(this, (byte) 7); + } else { + this.playTameEffect(false); + this.worldObj.setEntityState(this, (byte) 6); + } + } + + return true; + } + + return super.interact(user); + } + + @SideOnly(Side.CLIENT) + @Override + public void handleHealthUpdate(byte id) { + if (id == 8) { + this.field_70928_h = true; + this.timeWolfIsShaking = 0.0F; + this.prevTimeWolfIsShaking = 0.0F; + } else { + super.handleHealthUpdate(id); + } + } + + @SideOnly(Side.CLIENT) + public float getTailRotation() { + return this.isAngry() ? 1.5393804F + : (this.isTamed() + ? (0.55F - (20.0F - this.dataWatcher.getWatchableObjectFloat(18)) * 0.02F) * (float) Math.PI + : ((float) Math.PI / 5F)); + } + + /** + * Checks if the parameter is an item which this animal can be fed to breed it + * (wheat, carrots or seeds depending on the animal type) + */ + @Override + public boolean isBreedingItem(ItemStack item) { + return item == null ? false + : (!(item.getItem() instanceof ItemFood) ? false : ((ItemFood) item.getItem()).isWolfsFavoriteMeat()); + } + + /** + * Will return how many at most can spawn in a chunk at once. + */ + @Override + public int getMaxSpawnedInChunk() { + return 8; + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean flag) { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (flag) { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int colour) { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (colour & 15))); + } + + @Override + public EntityHound createChild(EntityAgeable parent) { + EntityHound entitywolf = new EntityHound(this.worldObj); + String s = this.func_152113_b(); + + if (s != null && s.trim().length() > 0) { + entitywolf.func_152115_b(s); + entitywolf.setTamed(true); + } + + return entitywolf; + } + + public void func_70918_i(boolean flag) { + if (flag) { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + @Override + public boolean canMateWith(EntityAnimal mate) { + if (mate == this) { + return false; + } else if (!this.isTamed()) { + return false; + } else if (!(mate instanceof EntityHound)) { + return false; + } else { + EntityHound entitywolf = (EntityHound) mate; + return !entitywolf.isTamed() ? false + : (entitywolf.isSitting() ? false : this.isInLove() && entitywolf.isInLove()); + } + } + + public boolean func_70922_bv() { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + @Override + protected boolean canDespawn() { + return !this.isTamed() && this.ticksExisted > 2400; + } + + @Override + public boolean func_142018_a(EntityLivingBase target, EntityLivingBase owner) { + if (!(target instanceof EntityCreeper) && !(target instanceof EntityGhast)) { + if (target instanceof EntityHound) { + EntityHound entitywolf = (EntityHound) target; + + if (entitywolf.isTamed() && entitywolf.getOwner() == owner) { + return false; + } + } + + return target instanceof EntityPlayer && owner instanceof EntityPlayer + && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) target) ? false + : !(target instanceof EntityHorse) || !((EntityHorse) target).isTame(); + } else { + return false; + } + } + + // Animations + public float jawMove; public int eatAnimation; - public String getTexture() - { + public String getTexture() { return "hound"; } - public boolean shouldFollowOwner() - { + public boolean shouldFollowOwner() { return true; } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java index 40111146..7a7cec70 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java @@ -41,628 +41,547 @@ import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; -public class EntityMinotaur extends EntityMobMF implements IArmourPenetrationMob, ISpecialCombatMob -{ +public class EntityMinotaur extends EntityMobMF implements IArmourPenetrationMob, ISpecialCombatMob { public int swing; private int grabCooldown; private int hitCooldownTime; - - public EntityMinotaur(World world) - { + + public EntityMinotaur(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(4, new EntityAIAttackOnCollide(this, EntityLivingBase.class, 1.0D, true)); - this.tasks.addTask(5, new EntityAIMoveTowardsRestriction(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWander(this, 0.5D)); - this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 12.0F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new AI_MinotaurFindTarget(this, EntityPlayer.class, 0, true)); - - this.setSize(1.5F, 2.5F); - this.stepHeight = 1.0F; - this.experienceValue = 40; - - for (int i = 0; i < this.equipmentDropChances.length; ++i) - { - this.equipmentDropChances[i] = 1F; - } - } - public void worldGenTier(int species, int tier) - { - setMob(species, tier); - setLoadout(); - if(tier > 0) - { - this.setHomeArea((int)posX, (int)posY, (int)posZ, getRange(tier)); - } - } - private int getRange(int tier) - { + this.tasks.addTask(0, new EntityAISwimming(this)); + this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); + this.tasks.addTask(4, new EntityAIAttackOnCollide(this, EntityLivingBase.class, 1.0D, true)); + this.tasks.addTask(5, new EntityAIMoveTowardsRestriction(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 0.5D)); + this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 12.0F)); + this.tasks.addTask(8, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(2, new AI_MinotaurFindTarget(this, EntityPlayer.class, 0, true)); + + this.setSize(1.5F, 2.5F); + this.stepHeight = 1.0F; + this.experienceValue = 40; + + for (int i = 0; i < this.equipmentDropChances.length; ++i) { + this.equipmentDropChances[i] = 1F; + } + } + + public void worldGenTier(int species, int tier) { + setMob(species, tier); + setLoadout(); + if (tier > 0) { + this.setHomeArea((int) posX, (int) posY, (int) posZ, getRange(tier)); + } + } + + private int getRange(int tier) { return tier > 1 ? 12 : 24; } + @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) - { + public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { int species = MinotaurBreed.getEnvironment(this); - - setMob(species, 0); - setLoadout(); - return super.onSpawnWithEgg(data); - } - - public void setLoadout() - { + + setMob(species, 0); + setLoadout(); + return super.onSpawnWithEgg(data); + } + + public void setLoadout() { String tier = getMinotaur().weaponTier; - if(tier != null) - { - this.setCurrentItemOrArmor(0, getRandomWeapon().construct(tier, "OakWood")); - } - } - public ItemWeaponMF getRandomWeapon() - { - if(getTier() == 3) - { + if (tier != null) { + this.setCurrentItemOrArmor(0, getRandomWeapon().construct(tier, "OakWood")); + } + } + + public ItemWeaponMF getRandomWeapon() { + if (getTier() == 3) { return OrnateStyle.ornate_greatsword; } - ItemWeaponMF[] list = new ItemWeaponMF[]{ - CustomToolListMF.standard_greatsword, - CustomToolListMF.standard_katana, - CustomToolListMF.standard_battleaxe, - CustomToolListMF.standard_warhammer, - CustomToolListMF.standard_spear, - CustomToolListMF.standard_halbeard - }; + ItemWeaponMF[] list = new ItemWeaponMF[] { CustomToolListMF.standard_greatsword, + CustomToolListMF.standard_katana, CustomToolListMF.standard_battleaxe, + CustomToolListMF.standard_warhammer, CustomToolListMF.standard_spear, + CustomToolListMF.standard_halbeard }; return list[rand.nextInt(list.length)]; } + @Override - public String getCommandSenderName() - { - return StatCollector.translateToLocal("entity." + getMinotaur().name + ".name"); - } + public String getCommandSenderName() { + return StatCollector.translateToLocal("entity." + getMinotaur().name + ".name"); + } + @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(24.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.35F); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(ConfigMobs.minotaurMD); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(ConfigMobs.minotaurHP); - } + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(24.0D); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.35F); + this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(ConfigMobs.minotaurMD); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(ConfigMobs.minotaurHP); + } + @Override - protected boolean isAIEnabled() - { - return true; - } + protected boolean isAIEnabled() { + return true; + } + private static final int dataID = 12; - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(dataID, Byte.valueOf((byte)0)); - this.dataWatcher.addObject(dataID+1, Integer.valueOf((byte)1)); - this.dataWatcher.addObject(dataID+2, Integer.valueOf(2)); - this.dataWatcher.addObject(dataID+3, Integer.valueOf(0)); - } - @Override - public float getBlockPathWeight(int x, int y, int z) - { - return super.getBlockPathWeight(x, y, z); - } - @Override - public void onUpdate() - { - super.onUpdate(); - - if(!worldObj.isRemote) - { - if(getRageLevel() == 0 && getAttackTarget() == null) - { - if(ticksExisted % 40 == 0) - { - forage(); - } - } - if(ticksExisted % 20 == 0) - { - if(!isBloodied()) - { - if(getRageVariable() > 0) - { - addRage(-1); - if(getRageVariable() > 50) - { - setRage(50); - } + + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(dataID, Byte.valueOf((byte) 0)); + this.dataWatcher.addObject(dataID + 1, Integer.valueOf((byte) 1)); + this.dataWatcher.addObject(dataID + 2, Integer.valueOf(2)); + this.dataWatcher.addObject(dataID + 3, Integer.valueOf(0)); + } + + @Override + public float getBlockPathWeight(int x, int y, int z) { + return super.getBlockPathWeight(x, y, z); + } + + @Override + public void onUpdate() { + super.onUpdate(); + + if (!worldObj.isRemote) { + if (getRageLevel() == 0 && getAttackTarget() == null) { + if (ticksExisted % 40 == 0) { + forage(); + } + } + if (ticksExisted % 20 == 0) { + if (!isBloodied()) { + if (getRageVariable() > 0) { + addRage(-1); + if (getRageVariable() > 50) { + setRage(50); + } + } + } + } + if (hitCooldownTime > 0) + --hitCooldownTime; + if (grabCooldown > 0) { + --grabCooldown; + } + if (specialAttackTime > 0) { + --specialAttackTime; + } + if ((getAttack() == (byte) 1 || getAttack() == (byte) 3) && specialAttackTime == 0) { + initBasicAttack(); + } + if (this.getAttackTarget() != null) { + if (getRageLevel() > 20 && getAttack() != (byte) 2 && getHeldItem() == null && rand.nextInt(100) == 0) { + this.initHeadbutt(); + } + EntityLivingBase target = getAttackTarget(); + int intLvl = getIntLvl(); + + if (intLvl > 0)// Smarter means more likely + { + if (getAttack() != 2 && rand.nextInt(10) < intLvl && onGround && target instanceof EntityPlayer + && ((EntityPlayer) target).isBlocking() && this.getDistanceToEntity(target) < 4F) { + this.jump(); + this.initPowerAttack(); } - } - } - if(hitCooldownTime > 0)--hitCooldownTime; - if(grabCooldown > 0) - { - --grabCooldown; - } - if(specialAttackTime > 0) - { - --specialAttackTime; - } - if((getAttack() == (byte)1 || getAttack() == (byte)3) && specialAttackTime == 0) - { - initBasicAttack(); - } - if(this.getAttackTarget() != null) - { - if(getRageLevel() > 20 && getAttack() != (byte)2 && getHeldItem() == null && rand.nextInt(100) == 0) - { - this.initHeadbutt(); - } - EntityLivingBase target = getAttackTarget(); - int intLvl = getIntLvl(); - - if(intLvl > 0)//Smarter means more likely - { - if(getAttack() !=2 && rand.nextInt(10) < intLvl && onGround && target instanceof EntityPlayer && ((EntityPlayer)target).isBlocking() && this.getDistanceToEntity(target) < 4F) - { - this.jump(); - this.initPowerAttack(); - } - } - else - { - if(getRageLevel() > 40 && getAttack() !=2 && rand.nextInt(50) == 0 && onGround && target instanceof EntityPlayer && ((EntityPlayer)target).isBlocking() && this.getDistanceToEntity(target) < 4F) - { - this.jump(); - this.initPowerAttack(); - } - } - double distance = this.getDistanceSqToEntity(target); - if(!TacticalManager.isFlankedBy(target, this, 270) && distance > 6 && distance < 12 && rand.nextInt(50) == 0 && this.getAttack() == (byte)0 && this.getMinotaur().throwsBombs) - { - this.throwBomb(target, 1.0F); - } - - if(this.ticksExisted % 20 == 0 && (getRageLevel() <= 0 || !canEntityBeSeen(getAttackTarget()))) - { - if(rand.nextInt( 50 + (50*getIntLvl())) == 0) - { - this.setAttackTarget(null); - } - } - } - - boolean inBeserk = getRageLevel() >= 100 && isBloodied(); - if(getAttack() == (byte)2) - { - if(!inBeserk) - { - initBasicAttack(); - } - else - { - this.swingItem(); - } - } - if(getAttack() != (byte)2 && inBeserk) - { + } else { + if (getRageLevel() > 40 && getAttack() != 2 && rand.nextInt(50) == 0 && onGround + && target instanceof EntityPlayer && ((EntityPlayer) target).isBlocking() + && this.getDistanceToEntity(target) < 4F) { + this.jump(); + this.initPowerAttack(); + } + } + double distance = this.getDistanceSqToEntity(target); + if (!TacticalManager.isFlankedBy(target, this, 270) && distance > 6 && distance < 12 + && rand.nextInt(50) == 0 && this.getAttack() == (byte) 0 && this.getMinotaur().throwsBombs) { + this.throwBomb(target, 1.0F); + } + + if (this.ticksExisted % 20 == 0 && (getRageLevel() <= 0 || !canEntityBeSeen(getAttackTarget()))) { + if (rand.nextInt(50 + (50 * getIntLvl())) == 0) { + this.setAttackTarget(null); + } + } + } + + boolean inBeserk = getRageLevel() >= 100 && isBloodied(); + if (getAttack() == (byte) 2) { + if (!inBeserk) { + initBasicAttack(); + } else { + this.swingItem(); + } + } + if (getAttack() != (byte) 2 && inBeserk) { initBeserk(); - } - } - } - - private void forage() - { - if(rand.nextInt(100) == 0) - { - int radius = 8; - for(int x = -radius; x <= radius; x++) - { - for(int y = -2; y <= 2; y++) - { - for(int z = -radius; z <= radius; z++) - { - int xPos = (int)posX + x; - int yPos = (int)posY + y; - int zPos = (int)posZ + z; - if(rand.nextInt(10) == 0) - { - if(worldObj.getBlock(xPos, yPos, zPos) == BlockListMF.berryBush && worldObj.getBlockMetadata(xPos, yPos, zPos) == 0) - { - getNavigator().tryMoveToXYZ(xPos+0.5, yPos+1, zPos+0.5, 0.6F); - return; - } - if(worldObj.getBlock(xPos, yPos, zPos) instanceof BlockCrops && worldObj.getBlockMetadata(xPos, yPos, zPos) >= 4) - { - getNavigator().tryMoveToXYZ(xPos+0.5, yPos+1, zPos+0.5, 0.6F); - return; - } - } - } - } - } - return; - } - if(worldObj.getBlock((int)posX, (int)posY, (int)posZ) == BlockListMF.berryBush && worldObj.getBlockMetadata((int)posX, (int)posY, (int)posZ) == 0) - { - worldObj.playSoundEffect(posX, posY+getEyeHeight(), posZ, "random.eat", 1.0F, 0.75F); - swingItem(); - heal(10); - worldObj.setBlockMetadataWithNotify((int)posX, (int)posY, (int)posZ, 1, 2); - } - else if(worldObj.getBlock((int)posX, (int)posY, (int)posZ) instanceof BlockCrops && worldObj.getBlockMetadata((int)posX, (int)posY, (int)posZ) > 0) - { - worldObj.playSoundEffect(posX, posY+getEyeHeight(), posZ, "random.eat", 1.0F, 0.75F); - worldObj.playSoundEffect(posX, posY+getEyeHeight(), posZ, "dig.grass", 1.0F, 1.00F); - swingItem(); - heal(5); - worldObj.setBlockToAir((int)posX, (int)posY, (int)posZ); - } + } + } + } + + private void forage() { + if (rand.nextInt(100) == 0) { + int radius = 8; + for (int x = -radius; x <= radius; x++) { + for (int y = -2; y <= 2; y++) { + for (int z = -radius; z <= radius; z++) { + int xPos = (int) posX + x; + int yPos = (int) posY + y; + int zPos = (int) posZ + z; + if (rand.nextInt(10) == 0) { + if (worldObj.getBlock(xPos, yPos, zPos) == BlockListMF.berryBush + && worldObj.getBlockMetadata(xPos, yPos, zPos) == 0) { + getNavigator().tryMoveToXYZ(xPos + 0.5, yPos + 1, zPos + 0.5, 0.6F); + return; + } + if (worldObj.getBlock(xPos, yPos, zPos) instanceof BlockCrops + && worldObj.getBlockMetadata(xPos, yPos, zPos) >= 4) { + getNavigator().tryMoveToXYZ(xPos + 0.5, yPos + 1, zPos + 0.5, 0.6F); + return; + } + } + } + } + } + return; + } + if (worldObj.getBlock((int) posX, (int) posY, (int) posZ) == BlockListMF.berryBush + && worldObj.getBlockMetadata((int) posX, (int) posY, (int) posZ) == 0) { + worldObj.playSoundEffect(posX, posY + getEyeHeight(), posZ, "random.eat", 1.0F, 0.75F); + swingItem(); + heal(10); + worldObj.setBlockMetadataWithNotify((int) posX, (int) posY, (int) posZ, 1, 2); + } else if (worldObj.getBlock((int) posX, (int) posY, (int) posZ) instanceof BlockCrops + && worldObj.getBlockMetadata((int) posX, (int) posY, (int) posZ) > 0) { + worldObj.playSoundEffect(posX, posY + getEyeHeight(), posZ, "random.eat", 1.0F, 0.75F); + worldObj.playSoundEffect(posX, posY + getEyeHeight(), posZ, "dig.grass", 1.0F, 1.00F); + swingItem(); + heal(5); + worldObj.setBlockToAir((int) posX, (int) posY, (int) posZ); + } } @Override - protected void dropFewItems(boolean playerKill, int looting) - { - int count = getLootCount() == 1 ? 1 : rand.nextInt(looting+getLootCount()+1); - for(int a = 0; a < count; a++) - { - Item drop = getLoot(); - this.dropItem(drop, 1); - } - count = rand.nextInt(looting+4)+1; - for(int a = 0; a < count; a++) - { - this.dropItem(ComponentListMF.rawhideLarge, 1); - } - count = rand.nextInt(looting+2)+1; - for(int a = 0; a < count; a++) - { - this.dropItem(isBurning() ? Items.cooked_beef : Items.beef, 1); - } - } - - private Item getLoot() - { - int breed = getTier(); - if(breed > 2) - { - return ToolListMF.loot_sack_rare; - } - if(breed > 0) - { - return ToolListMF.loot_sack_uc; - } - return ToolListMF.loot_sack; - } - private int getLootCount() - { - int breed = getTier(); - if(breed > 2) - { - return 1; - } + protected void dropFewItems(boolean playerKill, int looting) { + int count = getLootCount() == 1 ? 1 : rand.nextInt(looting + getLootCount() + 1); + for (int a = 0; a < count; a++) { + Item drop = getLoot(); + this.dropItem(drop, 1); + } + count = rand.nextInt(looting + 4) + 1; + for (int a = 0; a < count; a++) { + this.dropItem(ComponentListMF.rawhideLarge, 1); + } + count = rand.nextInt(looting + 2) + 1; + for (int a = 0; a < count; a++) { + this.dropItem(isBurning() ? Items.cooked_beef : Items.beef, 1); + } + } + + private Item getLoot() { + int breed = getTier(); + if (breed > 2) { + return ToolListMF.loot_sack_rare; + } + if (breed > 0) { + return ToolListMF.loot_sack_uc; + } + return ToolListMF.loot_sack; + } + + private int getLootCount() { + int breed = getTier(); + if (breed > 2) { + return 1; + } return 2 + breed; } - + @Override - public boolean attackEntityFrom(DamageSource source, float damage) - { - if (!super.attackEntityFrom(source, damage)) - { - return false; - } - else - { - Entity entity = source.getEntity(); - if(entity != null) - { - addRage(this.getIntLvl() >= 1 ? (int)(damage/2) : (int)damage); - } - } - return true; - } - - public void initBeserk() - { + public boolean attackEntityFrom(DamageSource source, float damage) { + if (!super.attackEntityFrom(source, damage)) { + return false; + } else { + Entity entity = source.getEntity(); + if (entity != null) { + addRage(this.getIntLvl() >= 1 ? (int) (damage / 2) : (int) damage); + } + } + return true; + } + + public void initBeserk() { TacticalManager.tryDisarm(this); - //this.playSound("minefantasy2:mob.minotaur.beserk", 1.0F, 1.0F); + // this.playSound("minefantasy2:mob.minotaur.beserk", 1.0F, 1.0F); setSprinting(true); - setAttack((byte)2); + setAttack((byte) 2); } - public void initPowerAttack() - { + + public void initPowerAttack() { setSprinting(true); specialAttackTime = 30; hitCooldownTime = 0; - setAttack((byte)3); + setAttack((byte) 3); } - public void initHeadbutt() - { + + public void initHeadbutt() { setSprinting(true); specialAttackTime = 20; this.hitCooldownTime = 0; - setAttack((byte)1); + setAttack((byte) 1); } - public void initBasicAttack() - { + + public void initBasicAttack() { setSprinting(false); specialAttackTime = 0; - setAttack((byte)0); + setAttack((byte) 0); } + @Override - protected String getLivingSound() - { - return "mob.cow.say"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ + protected String getLivingSound() { + return "mob.cow.say"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ @Override - protected String getHurtSound() - { - return "mob.cow.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return "minefantasy2:mob.minotaur.death"; - } - @Override - public float getSoundPitch() - { - return 0.5F; - } - - protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) - { - this.playSound("mob.cow.step", 0.75F, 0.9F); - } - - protected Item getDropItem() - { - return ComponentListMF.hideLarge; - } - public double getHeadChargeAngle() - { - return getAttack() == (byte)1 ? 80F : 0F; - } - - public float getArmourRating(DamageSource src) - { + protected String getHurtSound() { + return "mob.cow.hurt"; + } + + /** + * Returns the sound this mob makes on death. + */ + @Override + protected String getDeathSound() { + return "minefantasy2:mob.minotaur.death"; + } + + @Override + public float getSoundPitch() { + return 0.5F; + } + + protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) { + this.playSound("mob.cow.step", 0.75F, 0.9F); + } + + protected Item getDropItem() { + return ComponentListMF.hideLarge; + } + + public double getHeadChargeAngle() { + return getAttack() == (byte) 1 ? 80F : 0F; + } + + public float getArmourRating(DamageSource src) { float[] armour = getValueResistences(); - return (getMinotaur().armour_rating/100F) * ArmourCalculator.adjustACForDamage(src, getDT(), armour[0], armour[1], armour[2]); + return (getMinotaur().armour_rating / 100F) + * ArmourCalculator.adjustACForDamage(src, getDT(), armour[0], armour[1], armour[2]); } - + @Override - protected void damageEntity(DamageSource source, float dam) - { + protected void damageEntity(DamageSource source, float dam) { float AR = 1.0F + Math.max(0.0F, getArmourRating(source)); - + super.damageEntity(source, dam / AR); - } + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + + nbt.setInteger("Attack", getAttack()); + nbt.setInteger("Species", getSpecies()); + nbt.setInteger("Breed", getTier()); + nbt.setInteger("Rage", getRageVariable()); + } + @Override - public void writeEntityToNBT(NBTTagCompound nbt) - { - super.writeEntityToNBT(nbt); - - nbt.setInteger("Attack", (int)getAttack()); - nbt.setInteger("Species", (int)getSpecies()); - nbt.setInteger("Breed", (int)getTier()); - nbt.setInteger("Rage", (int)getRageVariable()); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbt) - { - super.readEntityFromNBT(nbt); - - setAttack((byte)nbt.getInteger("Attack")); - int species = nbt.getInteger("Species"); - int breed = nbt.getInteger("Breed"); - setMob(species, breed); - - setRage(nbt.getInteger("Rage")); - } - - private float getDT() - { + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + + setAttack((byte) nbt.getInteger("Attack")); + int species = nbt.getInteger("Species"); + int breed = nbt.getInteger("Breed"); + setMob(species, breed); + + setRage(nbt.getInteger("Rage")); + } + + private float getDT() { byte att = getAttack(); - if(att == (byte)2) - { + if (att == (byte) 2) { return 5F; } return 2F; } + /** * Cutting, Blunt, Piercing */ - private float[] getValueResistences() - { - return new float[]{0.75F, 1F, 0.5F}; + private float[] getValueResistences() { + return new float[] { 0.75F, 1F, 0.5F }; } - + /** * 0=Normal, 1=Headbutt, 2=Beserk, 3=Power */ - public byte getAttack() - { + public byte getAttack() { return dataWatcher.getWatchableObjectByte(dataID); } - + /** * 0=Normal, 1=Headbutt, 2=Beserk, 3=Power */ - public void setAttack(byte type) - { - dataWatcher.updateObject(dataID, type); - } - - /** - * @param species Brown, Snow, Nether - * @param subspecies the tier such as normal, warlord, etc - */ - public void setMob(int species, int subspecies) - { - MinotaurBreed minotaur = MinotaurBreed.getBreed(species, subspecies); - - setSpecies(species); - setTier(subspecies); - + public void setAttack(byte type) { + dataWatcher.updateObject(dataID, type); + } + + /** + * @param species + * Brown, Snow, Nether + * @param subspecies + * the tier such as normal, warlord, etc + */ + public void setMob(int species, int subspecies) { + MinotaurBreed minotaur = MinotaurBreed.getBreed(species, subspecies); + + setSpecies(species); + setTier(subspecies); + this.preventEntitySpawning = minotaur.isSpecial; - this.isImmuneToFire = species == 1; - this.experienceValue = minotaur.experienceValue; - - if(subspecies == 0) - { - this.targetTasks.addTask(2, new AI_MinotaurFindTarget(this, EntityLiving.class, 0, false)); - } - if(subspecies >= 3) - { - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(16.0D); - } - } - - @Override - protected boolean canDespawn() - { - return !getMinotaur().isSpecial; - } - /** + this.isImmuneToFire = species == 1; + this.experienceValue = minotaur.experienceValue; + + if (subspecies == 0) { + this.targetTasks.addTask(2, new AI_MinotaurFindTarget(this, EntityLiving.class, 0, false)); + } + if (subspecies >= 3) { + this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(16.0D); + } + } + + @Override + protected boolean canDespawn() { + return !getMinotaur().isSpecial; + } + + /** * 0=Normal, 1=Nether */ - public int getSpecies() - { - return dataWatcher.getWatchableObjectInt(dataID+1); + public int getSpecies() { + return dataWatcher.getWatchableObjectInt(dataID + 1); } + /** * 0=Normal, 1=Nether */ - public void setSpecies(int type) - { - dataWatcher.updateObject(dataID+1, type); - - - } - public int getTier() - { - return dataWatcher.getWatchableObjectInt(dataID+2); - } - public void setTier(int type) - { - dataWatcher.updateObject(dataID+2, type); - } - - private int specialAttackTime; - - private float[]punch = new float[]{0F, 1F, 0F}; - private float[]headbutt = new float[]{0F, 1F, 4F}; + public void setSpecies(int type) { + dataWatcher.updateObject(dataID + 1, type); + + } + + public int getTier() { + return dataWatcher.getWatchableObjectInt(dataID + 2); + } + + public void setTier(int type) { + dataWatcher.updateObject(dataID + 2, type); + } + + private int specialAttackTime; + + private float[] punch = new float[] { 0F, 1F, 0F }; + private float[] headbutt = new float[] { 0F, 1F, 4F }; + @Override - public float[] getHitTraits() - { + public float[] getHitTraits() { byte att = getAttack(); - if(att == (byte)1) - { + if (att == (byte) 1) { return headbutt; } return punch; } - + @Override - public boolean attackEntityAsMob(Entity target) - { - if(worldObj.difficultySetting == EnumDifficulty.PEACEFUL && target instanceof EntityPlayer) - { + public boolean attackEntityAsMob(Entity target) { + if (worldObj.difficultySetting == EnumDifficulty.PEACEFUL && target instanceof EntityPlayer) { return false; } - //if(hitCooldownTime > 0)return false; - - if(!canEntityBeSeen(target)) - { + // if(hitCooldownTime > 0)return false; + + if (!canEntityBeSeen(target)) { return false; } - if(getAttack() == 3 && motionY > 0 && target.posY < posY) - { + if (getAttack() == 3 && motionY > 0 && target.posY < posY) { return false; } - - + float dam = getHitDamage(); - - if(getRageLevel() > 50) - { - addRage((int) (dam*1.5)); + + if (getRageLevel() > 50) { + addRage((int) (dam * 1.5)); } - if(getAttack() == 2 && this.riddenByEntity != null && this.riddenByEntity == target) - { - if(target instanceof EntityLivingBase && rand.nextInt(4) == 0) - { - ArmourCalculator.damageArmour((EntityLivingBase) target, (int)(dam*0.25F)); + if (getAttack() == 2 && this.riddenByEntity != null && this.riddenByEntity == target) { + if (target instanceof EntityLivingBase && rand.nextInt(4) == 0) { + ArmourCalculator.damageArmour((EntityLivingBase) target, (int) (dam * 0.25F)); } } - if(this.riddenByEntity == null) - { - if(grabCooldown <= 0 && rand.nextInt(100) < getGrabChance() && canPickUp(target)) - { + if (this.riddenByEntity == null) { + if (grabCooldown <= 0 && rand.nextInt(100) < getGrabChance() && canPickUp(target)) { target.mountEntity(this); } - } - else if(rand.nextInt(100) < ConfigMobs.minotaurTC && riddenByEntity == target) - { + } else if (rand.nextInt(100) < ConfigMobs.minotaurTC && riddenByEntity == target) { riddenByEntity.mountEntity(null); grabCooldown = 60; TacticalManager.knockbackEntity(target, this, 4F, 1F); } - if(getAttack() == 3 && fallDistance > 0 && target instanceof EntityPlayer && ((EntityPlayer)target).isBlocking() && rand.nextInt(100) < getDisarmChance()) - { - TacticalManager.tryDisarm(this, (EntityLivingBase)target, true); - } - - int i = getKnockbackBoost(); - - if (target instanceof EntityLivingBase) - { - dam += EnchantmentHelper.getEnchantmentModifierLiving(this, (EntityLivingBase)target); - i += EnchantmentHelper.getKnockbackModifier(this, (EntityLivingBase)target); - } - - boolean flag = target.attackEntityFrom(new DamageSourceMobMF(getAttackType(), this), dam); - - if (flag) - { - this.hitCooldownTime = getAttackSpeed(); - this.swingItem(); - if (i > 0) - { - target.addVelocity((double)(-MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F) * (float)i * 0.5F), 0.1D, (double)(MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F) * (float)i * 0.5F)); - this.motionX *= 0.6D; - this.motionZ *= 0.6D; - } - - int j = EnchantmentHelper.getFireAspectModifier(this); - - if (j > 0) - { - target.setFire(j * 4); - } - - if (target instanceof EntityLivingBase) - { - EnchantmentHelper.func_151384_a((EntityLivingBase)target, this); - } - - EnchantmentHelper.func_151385_b(this, target); - } - - return flag; - } - private boolean canPickUp(Entity target) - { - if(target instanceof EntityLivingBase && PowerArmour.isWearingCogwork((EntityLivingBase)target)) - { + if (getAttack() == 3 && fallDistance > 0 && target instanceof EntityPlayer + && ((EntityPlayer) target).isBlocking() && rand.nextInt(100) < getDisarmChance()) { + TacticalManager.tryDisarm(this, (EntityLivingBase) target, true); + } + + int i = getKnockbackBoost(); + + if (target instanceof EntityLivingBase) { + dam += EnchantmentHelper.getEnchantmentModifierLiving(this, (EntityLivingBase) target); + i += EnchantmentHelper.getKnockbackModifier(this, (EntityLivingBase) target); + } + + boolean flag = target.attackEntityFrom(new DamageSourceMobMF(getAttackType(), this), dam); + + if (flag) { + this.hitCooldownTime = getAttackSpeed(); + this.swingItem(); + if (i > 0) { + target.addVelocity(-MathHelper.sin(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F, 0.1D, + MathHelper.cos(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F); + this.motionX *= 0.6D; + this.motionZ *= 0.6D; + } + + int j = EnchantmentHelper.getFireAspectModifier(this); + + if (j > 0) { + target.setFire(j * 4); + } + + if (target instanceof EntityLivingBase) { + EnchantmentHelper.func_151384_a((EntityLivingBase) target, this); + } + + EnchantmentHelper.func_151385_b(this, target); + } + + return flag; + } + + private boolean canPickUp(Entity target) { + if (target instanceof EntityLivingBase && PowerArmour.isWearingCogwork((EntityLivingBase) target)) { return false; } float mysize = getVolume(this); @@ -670,179 +589,143 @@ private boolean canPickUp(Entity target) return mysize > theirsize; } - private float getVolume(Entity entity) - { - return entity.width*entity.width*entity.height; + private float getVolume(Entity entity) { + return entity.width * entity.width * entity.height; } - private int getAttackSpeed() - { + private int getAttackSpeed() { return 0; /* - if(rage >= 100) - { - return 10; - } - if(rage > 80) - { - return 15; - } - if(rage > 50) - { - return 20; - } - if(rage > 25) - { - return 30; - } - return 35; - */ + * if(rage >= 100) { return 10; } if(rage > 80) { return 15; } if(rage > 50) { + * return 20; } if(rage > 25) { return 30; } return 35; + */ } @Override - public void onKillEntity(EntityLivingBase victim) - { + public void onKillEntity(EntityLivingBase victim) { super.onKillEntity(victim); - if(!isBloodied()) - { + if (!isBloodied()) { addRage(-20); } - if(getHealth() < getMaxHealth()*0.75F) - { + if (getHealth() < getMaxHealth() * 0.75F) { this.heal(5); } } - - public MinotaurBreed getMinotaur() - { + + public MinotaurBreed getMinotaur() { return MinotaurBreed.getBreed(getSpecies(), getTier()); } - - private int getDisarmChance() - { + + private int getDisarmChance() { return getMinotaur().disarmChance; } - private int getGrabChance() - { + + private int getGrabChance() { return (getAttack() == 2 ? getMinotaur().grabChanceBeserk : getMinotaur().grabChance); } - private int getThrowChance() - { + + private int getThrowChance() { return getMinotaur().throwChance; } - private String getAttackType() - { + + private String getAttackType() { byte att = getAttack(); - if(att == (byte)1) - { + if (att == (byte) 1) { return "gore"; } - if(att == (byte)2) - { + if (att == (byte) 2) { return "beserk"; } return "pound"; } - private int getKnockbackBoost() - { + + private int getKnockbackBoost() { byte att = getAttack(); - if(att == (byte)1) - { + if (att == (byte) 1) { return getSpecies() == 1 ? 4 : 2; } return 0; } - private float getHitDamage() - { + + private float getHitDamage() { MinotaurBreed breed = getMinotaur(); byte att = getAttack(); - - if(att != (byte)1 && getHeldItem() != null)//no weapon dam on gore + + if (att != (byte) 1 && getHeldItem() != null)// no weapon dam on gore { - float melee = att == (byte)2 ? breed.beserkDamage : breed.poundDamage; - - return Math.max(2F, melee-2F);//Weapon Dam + float melee = att == (byte) 2 ? breed.beserkDamage : breed.poundDamage; + + return Math.max(2F, melee - 2F);// Weapon Dam } - - if(att == (byte)1) - { + + if (att == (byte) 1) { return breed.goreDamage; } - if(att == (byte)2) - { + if (att == (byte) 2) { return breed.beserkDamage; } return breed.poundDamage; } - - public boolean isBloodied() - { - float t = this.getMinotaur().beserkThreshold/100F; - return getHealth() < (getMaxHealth()*t); + + public boolean isBloodied() { + float t = this.getMinotaur().beserkThreshold / 100F; + return getHealth() < (getMaxHealth() * t); } + @SideOnly(Side.CLIENT) - public String getTexture() - { + public String getTexture() { String tex = "minotaur" + getMinotaur().tex; - if(isBloodied()) - { + if (isBloodied()) { tex += "_bloodied"; } return tex; } - public int getRageVariable() - { - return dataWatcher.getWatchableObjectInt(dataID+3); + public int getRageVariable() { + return dataWatcher.getWatchableObjectInt(dataID + 3); } - public void addRage(int level) - { + + public void addRage(int level) { setRage(getRageVariable() + level); } - public void setRage(int level) - { - if(!worldObj.isRemote) - dataWatcher.updateObject(dataID+3, Math.max(0, level)); + + public void setRage(int level) { + if (!worldObj.isRemote) + dataWatcher.updateObject(dataID + 3, Math.max(0, level)); } - - - public int getRageLevel() - { + + public int getRageLevel() { return isBloodied() ? 100 : getRageVariable(); } - - private int getIntLvl() - { + + private int getIntLvl() { return this.getMinotaur().intelligenceLvl; } - - public boolean isDocile() - { + + public boolean isDocile() { return getIntLvl() <= 0; } + @Override - public boolean canParry(DamageSource source) - { + public boolean canParry(DamageSource source) { int intLvl = this.getIntLvl(); - if(intLvl == 0) - { + if (intLvl == 0) { return rand.nextInt(8) == 0; } - return this.getAttack() == (byte)0; + return this.getAttack() == (byte) 0; } - public void throwBomb(EntityLivingBase attackTarget, float spread) - { - EntityBomb bomb = new EntityBomb(worldObj, this).setType((byte)1, (byte)0, (byte)0, (byte)0); - worldObj.spawnEntityInWorld(bomb); - this.swingItem(); + + public void throwBomb(EntityLivingBase attackTarget, float spread) { + EntityBomb bomb = new EntityBomb(worldObj, this).setType((byte) 1, (byte) 0, (byte) 0, (byte) 0); + worldObj.spawnEntityInWorld(bomb); + this.swingItem(); } + @Override - public void onParry(DamageSource source, Entity attacker, float dam) - { + public void onParry(DamageSource source, Entity attacker, float dam) { Entity target = this.getEntityToAttack(); - if(getIntLvl() > 1 && target != null && attacker == target && this.getDistanceSqToEntity(attacker) < 4) - { - this.setAttack((byte)1); + if (getIntLvl() > 1 && target != null && attacker == target && this.getDistanceSqToEntity(attacker) < 4) { + this.setAttack((byte) 1); TacticalManager.lungeEntity(this, attacker, 2.0F, 0.2F); } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityMobMF.java b/src/main/java/minefantasy/mf2/entity/mob/EntityMobMF.java index 5f2c4461..e55d5d7b 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityMobMF.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityMobMF.java @@ -13,244 +13,211 @@ import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; -public abstract class EntityMobMF extends EntityCreature implements IMob -{ - public EntityMobMF(World world) - { - super(world); - this.experienceValue = 5; - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - this.updateArmSwingProgress(); - float f = this.getBrightness(1.0F); - - if (f > 0.5F) - { - this.entityAge += 2; - } - - super.onLivingUpdate(); - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() - { - super.onUpdate(); - - if (this.canDespawn() && !this.worldObj.isRemote && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) - { - this.setDead(); - } - } - - @Override - protected String getSwimSound() - { - return "game.hostile.swim"; - } - - @Override - protected String getSplashSound() - { - return "game.hostile.swim.splash"; - } - - /** - * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking - * (Animals, Spiders at day, peaceful PigZombies). - */ - @Override - protected Entity findPlayerToAttack() - { - EntityPlayer entityplayer = this.worldObj.getClosestVulnerablePlayerToEntity(this, 16.0D); - return entityplayer != null && this.canEntityBeSeen(entityplayer) ? entityplayer : null; - } - - /** - * Called when the entity is attacked. - */ - @Override - public boolean attackEntityFrom(DamageSource source, float dam) - { - if (this.isEntityInvulnerable()) - { - return false; - } - else if (super.attackEntityFrom(source, dam)) - { - Entity entity = source.getEntity(); - - if (this.riddenByEntity != entity && this.ridingEntity != entity) - { - if (entity != this) - { - this.entityToAttack = entity; - } - - return true; - } - else - { - return true; - } - } - else - { - return false; - } - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return "game.hostile.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return "game.hostile.die"; - } - - @Override - protected String func_146067_o(int distance) - { - return distance > 4 ? "game.hostile.hurt.fall.big" : "game.hostile.hurt.fall.small"; - } - - @Override - public boolean attackEntityAsMob(Entity target) - { - if(worldObj.difficultySetting == EnumDifficulty.PEACEFUL && target instanceof EntityPlayer) - { +public abstract class EntityMobMF extends EntityCreature implements IMob { + public EntityMobMF(World world) { + super(world); + this.experienceValue = 5; + } + + /** + * Called frequently so the entity can update its state every tick as required. + * For example, zombies and skeletons use this to react to sunlight and start to + * burn. + */ + @Override + public void onLivingUpdate() { + this.updateArmSwingProgress(); + float f = this.getBrightness(1.0F); + + if (f > 0.5F) { + this.entityAge += 2; + } + + super.onLivingUpdate(); + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + super.onUpdate(); + + if (this.canDespawn() && !this.worldObj.isRemote + && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + this.setDead(); + } + } + + @Override + protected String getSwimSound() { + return "game.hostile.swim"; + } + + @Override + protected String getSplashSound() { + return "game.hostile.swim.splash"; + } + + /** + * Finds the closest player within 16 blocks to attack, or null if this Entity + * isn't interested in attacking (Animals, Spiders at day, peaceful PigZombies). + */ + @Override + protected Entity findPlayerToAttack() { + EntityPlayer entityplayer = this.worldObj.getClosestVulnerablePlayerToEntity(this, 16.0D); + return entityplayer != null && this.canEntityBeSeen(entityplayer) ? entityplayer : null; + } + + /** + * Called when the entity is attacked. + */ + @Override + public boolean attackEntityFrom(DamageSource source, float dam) { + if (this.isEntityInvulnerable()) { + return false; + } else if (super.attackEntityFrom(source, dam)) { + Entity entity = source.getEntity(); + + if (this.riddenByEntity != entity && this.ridingEntity != entity) { + if (entity != this) { + this.entityToAttack = entity; + } + + return true; + } else { + return true; + } + } else { + return false; + } + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + @Override + protected String getHurtSound() { + return "game.hostile.hurt"; + } + + /** + * Returns the sound this mob makes on death. + */ + @Override + protected String getDeathSound() { + return "game.hostile.die"; + } + + @Override + protected String func_146067_o(int distance) { + return distance > 4 ? "game.hostile.hurt.fall.big" : "game.hostile.hurt.fall.small"; + } + + @Override + public boolean attackEntityAsMob(Entity target) { + if (worldObj.difficultySetting == EnumDifficulty.PEACEFUL && target instanceof EntityPlayer) { + return false; + } + + float f = (float) this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue(); + int i = 0; + + if (target instanceof EntityLivingBase) { + f += EnchantmentHelper.getEnchantmentModifierLiving(this, (EntityLivingBase) target); + i += EnchantmentHelper.getKnockbackModifier(this, (EntityLivingBase) target); + } + + boolean flag = target.attackEntityFrom(DamageSource.causeMobDamage(this), f); + + if (flag) { + if (i > 0) { + target.addVelocity(-MathHelper.sin(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F, 0.1D, + MathHelper.cos(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F); + this.motionX *= 0.6D; + this.motionZ *= 0.6D; + } + + int j = EnchantmentHelper.getFireAspectModifier(this); + + if (j > 0) { + target.setFire(j * 4); + } + + if (target instanceof EntityLivingBase) { + EnchantmentHelper.func_151384_a((EntityLivingBase) target, this); + } + + EnchantmentHelper.func_151385_b(this, target); + } + + return flag; + } + + /** + * Basic mob attack. Default to touch of death in EntityCreature. Overridden by + * each mob to define their attack. + */ + @Override + protected void attackEntity(Entity target, float dam) { + if (this.attackTime <= 0 && dam < 2.0F && target.boundingBox.maxY > this.boundingBox.minY + && target.boundingBox.minY < this.boundingBox.maxY) { + this.attackTime = 20; + this.attackEntityAsMob(target); + } + } + + /** + * Takes a coordinate in and returns a weight to determine how likely this + * creature will try to path to the block. Args: x, y, z + */ + @Override + public float getBlockPathWeight(int x, int y, int z) { + return 0.5F - this.worldObj.getLightBrightness(x, y, z); + } + + /** + * Checks to make sure the light is not too bright where the mob is spawning + */ + protected boolean isValidLightLevel() { + int i = MathHelper.floor_double(this.posX); + int j = MathHelper.floor_double(this.boundingBox.minY); + int k = MathHelper.floor_double(this.posZ); + + if (this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, i, j, k) > this.rand.nextInt(32)) { return false; + } else { + int l = this.worldObj.getBlockLightValue(i, j, k); + + if (this.worldObj.isThundering()) { + int i1 = this.worldObj.skylightSubtracted; + this.worldObj.skylightSubtracted = 10; + l = this.worldObj.getBlockLightValue(i, j, k); + this.worldObj.skylightSubtracted = i1; + } + + return l <= this.rand.nextInt(8); } - - float f = (float)this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue(); - int i = 0; - - if (target instanceof EntityLivingBase) - { - f += EnchantmentHelper.getEnchantmentModifierLiving(this, (EntityLivingBase)target); - i += EnchantmentHelper.getKnockbackModifier(this, (EntityLivingBase)target); - } - - boolean flag = target.attackEntityFrom(DamageSource.causeMobDamage(this), f); - - if (flag) - { - if (i > 0) - { - target.addVelocity((double)(-MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F) * (float)i * 0.5F), 0.1D, (double)(MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F) * (float)i * 0.5F)); - this.motionX *= 0.6D; - this.motionZ *= 0.6D; - } - - int j = EnchantmentHelper.getFireAspectModifier(this); - - if (j > 0) - { - target.setFire(j * 4); - } - - if (target instanceof EntityLivingBase) - { - EnchantmentHelper.func_151384_a((EntityLivingBase)target, this); - } - - EnchantmentHelper.func_151385_b(this, target); - } - - return flag; - } - - /** - * Basic mob attack. Default to touch of death in EntityCreature. Overridden by each mob to define their attack. - */ - @Override - protected void attackEntity(Entity target, float dam) - { - if (this.attackTime <= 0 && dam < 2.0F && target.boundingBox.maxY > this.boundingBox.minY && target.boundingBox.minY < this.boundingBox.maxY) - { - this.attackTime = 20; - this.attackEntityAsMob(target); - } - } - - /** - * Takes a coordinate in and returns a weight to determine how likely this creature will try to path to the block. - * Args: x, y, z - */ - @Override - public float getBlockPathWeight(int x, int y, int z) - { - return 0.5F - this.worldObj.getLightBrightness(x, y, z); - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - protected boolean isValidLightLevel() - { - int i = MathHelper.floor_double(this.posX); - int j = MathHelper.floor_double(this.boundingBox.minY); - int k = MathHelper.floor_double(this.posZ); - - if (this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, i, j, k) > this.rand.nextInt(32)) - { - return false; - } - else - { - int l = this.worldObj.getBlockLightValue(i, j, k); - - if (this.worldObj.isThundering()) - { - int i1 = this.worldObj.skylightSubtracted; - this.worldObj.skylightSubtracted = 10; - l = this.worldObj.getBlockLightValue(i, j, k); - this.worldObj.skylightSubtracted = i1; - } - - return l <= this.rand.nextInt(8); - } - } - - /** - * Checks if the entity's current position is a valid location to spawn this entity. - */ - @Override - public boolean getCanSpawnHere() - { - return this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && this.isValidLightLevel() && super.getCanSpawnHere(); - } - - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getAttributeMap().registerAttribute(SharedMonsterAttributes.attackDamage); - } - - @Override - protected boolean func_146066_aG() - { - return true; - } + } + + /** + * Checks if the entity's current position is a valid location to spawn this + * entity. + */ + @Override + public boolean getCanSpawnHere() { + return this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && this.isValidLightLevel() + && super.getCanSpawnHere(); + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getAttributeMap().registerAttribute(SharedMonsterAttributes.attackDamage); + } + + @Override + protected boolean func_146066_aG() { + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/FireBreath.java b/src/main/java/minefantasy/mf2/entity/mob/FireBreath.java index 6ba88489..782f9853 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/FireBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/FireBreath.java @@ -1,5 +1,7 @@ package minefantasy.mf2.entity.mob; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.config.ConfigMobs; import minefantasy.mf2.entity.EntityDragonBreath; import net.minecraft.block.Block; @@ -11,66 +13,54 @@ import net.minecraft.util.EntityDamageSourceIndirect; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class FireBreath extends DragonBreath -{ +public class FireBreath extends DragonBreath { - public FireBreath(String name) - { + public FireBreath(String name) { super(name); } @Override - public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) - { - return shooter == null ? new DamageSource("fireblastBase").setFireDamage() : (new EntityDamageSourceIndirect("fireblast", breath, shooter)).setFireDamage(); + public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { + return shooter == null ? new DamageSource("fireblastBase").setFireDamage() + : (new EntityDamageSourceIndirect("fireblast", breath, shooter)).setFireDamage(); } @Override @SideOnly(Side.CLIENT) - public String getTexture(EntityDragonBreath instance) - { + public String getTexture(EntityDragonBreath instance) { return "textures/projectile/dragonbreath_fire"; } - - public void onHitEntity(Entity target, EntityDragonBreath instance) - { + + public void onHitEntity(Entity target, EntityDragonBreath instance) { super.onHitEntity(target, instance); - if(target instanceof EntityLivingBase) - { + if (target instanceof EntityLivingBase) { target.setFire(5); } } - + @Override - public float modifyDamage(Entity hit, float dam) - { + public float modifyDamage(Entity hit, float dam) { return dam; } - + @Override - public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) - { + public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { Block hit = world.getBlock(x, y, z); - if(!world.isRemote && (impact || instance.rand.nextInt(20) == 0)) - { - if(!world.isRemote && world.isAirBlock(x, y+1, z)) - { - if(ConfigMobs.dragonGriefFire && hit.isSideSolid(world, x, y, z, ForgeDirection.UP) && hit.isFlammable(world, x, y+1, z, ForgeDirection.UP)) - { - world.setBlock(x, y+1, z, Blocks.fire); + if (!world.isRemote && (impact || instance.rand.nextInt(20) == 0)) { + if (!world.isRemote && world.isAirBlock(x, y + 1, z)) { + if (ConfigMobs.dragonGriefFire && hit.isSideSolid(world, x, y, z, ForgeDirection.UP) + && hit.isFlammable(world, x, y + 1, z, ForgeDirection.UP)) { + world.setBlock(x, y + 1, z, Blocks.fire); } - if(!world.getGameRules().getGameRuleBooleanValue("mobGriefing"))return; - - if(ConfigMobs.dragonGriefGeneral && hit == Blocks.ice) - { + if (!world.getGameRules().getGameRuleBooleanValue("mobGriefing")) + return; + + if (ConfigMobs.dragonGriefGeneral && hit == Blocks.ice) { world.setBlock(x, y, z, Blocks.water); } - if(ConfigMobs.dragonGriefGeneral && hit.getMaterial() == Material.glass) - { - world.playSoundEffect(x+0.5D, y+0.5D, z+0.5D, "dig.glass", 1.0F, 1.0F); + if (ConfigMobs.dragonGriefGeneral && hit.getMaterial() == Material.glass) { + world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.glass", 1.0F, 1.0F); world.setBlockToAir(x, y, z); } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/FrostBreath.java b/src/main/java/minefantasy/mf2/entity/mob/FrostBreath.java index cb81196b..75f120e8 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/FrostBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/FrostBreath.java @@ -1,5 +1,7 @@ package minefantasy.mf2.entity.mob; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.config.ConfigMobs; import minefantasy.mf2.entity.EntityDragonBreath; @@ -13,73 +15,58 @@ import net.minecraft.util.EntityDamageSourceIndirect; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class FrostBreath extends DragonBreath -{ +public class FrostBreath extends DragonBreath { - public FrostBreath(String name) - { + public FrostBreath(String name) { super(name); } @Override - public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) - { - return shooter == null ? new DamageSource("frostblastBase") : (new EntityDamageSourceIndirect("frostblast", breath, shooter)); + public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { + return shooter == null ? new DamageSource("frostblastBase") + : (new EntityDamageSourceIndirect("frostblast", breath, shooter)); } @Override @SideOnly(Side.CLIENT) - public String getTexture(EntityDragonBreath instance) - { + public String getTexture(EntityDragonBreath instance) { return "textures/projectile/dragonbreath_frost"; } - - public void onHitEntity(Entity target, EntityDragonBreath instance) - { + + public void onHitEntity(Entity target, EntityDragonBreath instance) { super.onHitEntity(target, instance); - if(target instanceof EntityLivingBase) - { - if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity((EntityLivingBase) target)) - { + if (target instanceof EntityLivingBase) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity((EntityLivingBase) target)) { StaminaBar.modifyStaminaValue((EntityLivingBase) target, -1F); } - ((EntityLivingBase)target).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 2)); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 2)); } } - + @Override - public float modifyDamage(Entity hit, float dam) - { + public float modifyDamage(Entity hit, float dam) { return dam; } - + @Override - public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) - { + public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { Block hit = world.getBlock(x, y, z); - if(!world.isRemote && (impact || instance.rand.nextInt(20) == 0)) - { - if(ConfigMobs.dragonGriefGeneral && world.isAirBlock(x, y+1, z)) - { - if(hit.isSideSolid(world, x, y, z, ForgeDirection.UP)) - { - world.setBlock(x, y+1, z, Blocks.snow_layer); + if (!world.isRemote && (impact || instance.rand.nextInt(20) == 0)) { + if (ConfigMobs.dragonGriefGeneral && world.isAirBlock(x, y + 1, z)) { + if (hit.isSideSolid(world, x, y, z, ForgeDirection.UP)) { + world.setBlock(x, y + 1, z, Blocks.snow_layer); } - - if(!world.getGameRules().getGameRuleBooleanValue("mobGriefing"))return; - if(hit == Blocks.water || hit == Blocks.flowing_water) - { + + if (!world.getGameRules().getGameRuleBooleanValue("mobGriefing")) + return; + if (hit == Blocks.water || hit == Blocks.flowing_water) { world.setBlock(x, y, z, Blocks.ice); } - if(hit == Blocks.water || hit == Blocks.lava) - { + if (hit == Blocks.water || hit == Blocks.lava) { world.setBlock(x, y, z, Blocks.obsidian); } - if(hit == Blocks.water || hit == Blocks.flowing_lava) - { + if (hit == Blocks.water || hit == Blocks.flowing_lava) { world.setBlock(x, y, z, Blocks.cobblestone); } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/MinotaurBreed.java b/src/main/java/minefantasy/mf2/entity/mob/MinotaurBreed.java index efad33f3..69edcd24 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/MinotaurBreed.java +++ b/src/main/java/minefantasy/mf2/entity/mob/MinotaurBreed.java @@ -7,31 +7,83 @@ import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; -public class MinotaurBreed -{ +public class MinotaurBreed { public static final ArrayList normal = new ArrayList(); public static final ArrayList frost = new ArrayList(); public static final ArrayList nether = new ArrayList(); private static Random rand = new Random(); - - public static MinotaurBreed BROWN = new MinotaurBreed(normal, "minotaur", "Brown", null, 10, ConfigMobs.minotaurHP, ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, 0).setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC).setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); - public static MinotaurBreed BROWNGUARD = new MinotaurBreed(normal, "minotaur_guard", "GuardBrown", "iron", 20, ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, ConfigMobs.lightminotaurAR).setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC).setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB).setIntelligence(1); - public static MinotaurBreed BROWNELITE = new MinotaurBreed(normal, "minotaur_elite", "EliteBrown", "steel", 40, ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, ConfigMobs.mediumminotaurAR).setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC).setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB).setIntelligence(2); - public static MinotaurBreed BROWNBOSS = new MinotaurBreed(normal, "minotaur_boss", "BossBrown", "obsidian", 100, ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, ConfigMobs.heavyminotaurAR).setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC).setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB).setIntelligence(3).throwBombs(); - - public static MinotaurBreed FROST = new MinotaurBreed(frost, "frostminotaur", "White", null, 15, ConfigMobs.minotaurHP, ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, ConfigMobs.frostminotaurAR).setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC).setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); - public static MinotaurBreed FROSTGUARD = new MinotaurBreed(frost, "frostminotaur_guard", "GuardWhite", "iron", 25, ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, ConfigMobs.lightminotaurAR + ConfigMobs.frostminotaurAR).setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC).setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB).setIntelligence(1); - public static MinotaurBreed FROSTELITE = new MinotaurBreed(frost, "frostminotaur_elite", "EliteWhite", "steel", 50, ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, ConfigMobs.mediumminotaurAR + ConfigMobs.frostminotaurAR).setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC).setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB).setIntelligence(2); - public static MinotaurBreed FROSTBOSS = new MinotaurBreed(frost, "frostminotaurr_boss", "BossWhite", "obsidian", 120, ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, ConfigMobs.heavyminotaurAR + ConfigMobs.frostminotaurAR).setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC).setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB).setIntelligence(3).throwBombs(); - - public static MinotaurBreed NETHER = new MinotaurBreed(nether, "dredminotaur", "Nether", null, 15, ConfigMobs.minotaurHP, ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, ConfigMobs.dreadminotaurAR).setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC).setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); - public static MinotaurBreed NETHERGUARD = new MinotaurBreed(nether, "dredminotaur_guard", "GuardNether", "iron", 25, ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, ConfigMobs.lightminotaurAR + ConfigMobs.dreadminotaurAR).setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC).setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB).setIntelligence(1); - public static MinotaurBreed NETHERELITE = new MinotaurBreed(nether, "dredminotaur_elite", "EliteNether", "steel", 50, ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, ConfigMobs.mediumminotaurAR + ConfigMobs.dreadminotaurAR).setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC).setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB).setIntelligence(2); - public static MinotaurBreed NETHERBOSS = new MinotaurBreed(nether, "dredminotaur_boss", "BossNether", "obsidian", 150, ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, ConfigMobs.heavyminotaurAR + ConfigMobs.dreadminotaurAR).setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC).setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB).setIntelligence(3).throwBombs(); - + + public static MinotaurBreed BROWN = new MinotaurBreed(normal, "minotaur", "Brown", null, 10, ConfigMobs.minotaurHP, + ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, 0) + .setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC) + .setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); + public static MinotaurBreed BROWNGUARD = new MinotaurBreed(normal, "minotaur_guard", "GuardBrown", "iron", 20, + ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, + ConfigMobs.lightminotaurAR) + .setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC) + .setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB) + .setIntelligence(1); + public static MinotaurBreed BROWNELITE = new MinotaurBreed(normal, "minotaur_elite", "EliteBrown", "steel", 40, + ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, + ConfigMobs.mediumminotaurAR) + .setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC) + .setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB) + .setIntelligence(2); + public static MinotaurBreed BROWNBOSS = new MinotaurBreed(normal, "minotaur_boss", "BossBrown", "obsidian", 100, + ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, ConfigMobs.heavyminotaurAR) + .setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC) + .setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB) + .setIntelligence(3).throwBombs(); + + public static MinotaurBreed FROST = new MinotaurBreed(frost, "frostminotaur", "White", null, 15, + ConfigMobs.minotaurHP, ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, ConfigMobs.frostminotaurAR) + .setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC) + .setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); + public static MinotaurBreed FROSTGUARD = new MinotaurBreed(frost, "frostminotaur_guard", "GuardWhite", "iron", 25, + ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, + ConfigMobs.lightminotaurAR + ConfigMobs.frostminotaurAR) + .setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC) + .setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB) + .setIntelligence(1); + public static MinotaurBreed FROSTELITE = new MinotaurBreed(frost, "frostminotaur_elite", "EliteWhite", "steel", 50, + ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, + ConfigMobs.mediumminotaurAR + ConfigMobs.frostminotaurAR) + .setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC) + .setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB) + .setIntelligence(2); + public static MinotaurBreed FROSTBOSS = new MinotaurBreed(frost, "frostminotaurr_boss", "BossWhite", "obsidian", + 120, ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, + ConfigMobs.heavyminotaurAR + ConfigMobs.frostminotaurAR) + .setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC) + .setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB) + .setIntelligence(3).throwBombs(); + + public static MinotaurBreed NETHER = new MinotaurBreed(nether, "dredminotaur", "Nether", null, 15, + ConfigMobs.minotaurHP, ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, ConfigMobs.dreadminotaurAR) + .setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC) + .setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); + public static MinotaurBreed NETHERGUARD = new MinotaurBreed(nether, "dredminotaur_guard", "GuardNether", "iron", 25, + ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, + ConfigMobs.lightminotaurAR + ConfigMobs.dreadminotaurAR) + .setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC) + .setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB) + .setIntelligence(1); + public static MinotaurBreed NETHERELITE = new MinotaurBreed(nether, "dredminotaur_elite", "EliteNether", "steel", + 50, ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, + ConfigMobs.mediumminotaurAR + ConfigMobs.dreadminotaurAR) + .setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC) + .setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB) + .setIntelligence(2); + public static MinotaurBreed NETHERBOSS = new MinotaurBreed(nether, "dredminotaur_boss", "BossNether", "obsidian", + 150, ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, + ConfigMobs.heavyminotaurAR + ConfigMobs.dreadminotaurAR) + .setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC) + .setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB) + .setIntelligence(3).throwBombs(); + public String name = "minotaur"; public String tex = "Brown"; - public float health = 50; + public float health = 50; public float poundDamage = 8; public float goreDamage = 8; public float beserkDamage = 12; @@ -42,15 +94,15 @@ public class MinotaurBreed public int disarmChance = 10; public ArrayList pool; public int intelligenceLvl = 0; - + public int experienceValue; public boolean isSpecial = true; public String weaponTier; public int armour_rating; public boolean throwsBombs = false; - - public MinotaurBreed(ArrayList pool, String name, String tex, String weapons, int xp, float health, float poundDamage, float goreDamage, int AR) - { + + public MinotaurBreed(ArrayList pool, String name, String tex, String weapons, int xp, float health, + float poundDamage, float goreDamage, int AR) { this.pool = pool; pool.add(this); this.name = name; @@ -58,108 +110,115 @@ public MinotaurBreed(ArrayList pool, String name, String tex, String weapons, in this.health = health; this.poundDamage = poundDamage; this.goreDamage = goreDamage; - this.beserkDamage = poundDamage *1.5F; + this.beserkDamage = poundDamage * 1.5F; this.weaponTier = weapons; this.experienceValue = xp; this.armour_rating = AR; } + /** * Set beserk stats - * @param threshold the percent (0-100) health where it triggers (Default 25%) - * @param damage (The damage done by melee) - * @param grabChance the percent (0-100) chance to grab enemies when beserked (Default 25%) + * + * @param threshold + * the percent (0-100) health where it triggers (Default 25%) + * @param damage + * (The damage done by melee) + * @param grabChance + * the percent (0-100) chance to grab enemies when beserked (Default + * 25%) */ - public MinotaurBreed setBeserk(int threshold, float damage, int grabChance) - { + public MinotaurBreed setBeserk(int threshold, float damage, int grabChance) { this.beserkThreshold = threshold; this.beserkDamage = damage; this.grabChanceBeserk = grabChance; return this; } + /** * - * @param grabChance the percent (0-100) chance to disarm enemies with a power attack (Default 10%) - * @param grabChance the percent (0-100) chance to grab enemies (Default 10%) - * @param grabChance the percent (0-100) chance to throw grabbed enemies when hit (Default 20%) + * @param grabChance + * the percent (0-100) chance to disarm enemies with a power attack + * (Default 10%) + * @param grabChance + * the percent (0-100) chance to grab enemies (Default 10%) + * @param grabChance + * the percent (0-100) chance to throw grabbed enemies when hit + * (Default 20%) * @return */ - public MinotaurBreed setGrabs(int disarmChance, int grabChance, int throwChance) - { + public MinotaurBreed setGrabs(int disarmChance, int grabChance, int throwChance) { this.disarmChance = disarmChance; this.grabChance = grabChance; this.throwChance = throwChance; return this; } - + /** * Set the intelligence for the mob 0 For docile... 1 For basic... 2 For Orderly */ - public MinotaurBreed setIntelligence(int level) - { + public MinotaurBreed setIntelligence(int level) { this.intelligenceLvl = level; return this; } + /** * Enables spawning and despawning */ - public MinotaurBreed setLesser() - { + public MinotaurBreed setLesser() { this.isSpecial = false; return this; } - public MinotaurBreed throwBombs() - { + + public MinotaurBreed throwBombs() { this.throwsBombs = true; return this; } - - public static int getRandomMinotaur(int species) - { + + public static int getRandomMinotaur(int species) { return getRandomMinotaur(species == 1 ? MinotaurBreed.nether : MinotaurBreed.normal); } - public static int getRandomMinotaur(ArrayList pool) - { - if(pool.size() <= 1) - { - return 0; - } - return rand.nextInt(pool.size()); + + public static int getRandomMinotaur(ArrayList pool) { + if (pool.size() <= 1) { + return 0; + } + return rand.nextInt(pool.size()); } - public static MinotaurBreed getBreed(int species, int id) - { - return getBreed(species == 2 ? MinotaurBreed.frost : species == 1 ? MinotaurBreed.nether : MinotaurBreed.normal, id); + + public static MinotaurBreed getBreed(int species, int id) { + return getBreed(species == 2 ? MinotaurBreed.frost : species == 1 ? MinotaurBreed.nether : MinotaurBreed.normal, + id); } - public static MinotaurBreed getBreed(ArrayList pool, int id) - { - if(id >= pool.size()) - { - id = (pool.size()-1); + + public static MinotaurBreed getBreed(ArrayList pool, int id) { + if (id >= pool.size()) { + id = (pool.size() - 1); } return pool.get(id); } - public static int getEnvironment(EntityMinotaur mob) - { - return getEnvironment(mob.worldObj, (int)mob.posX, (int)mob.posZ, mob.dimension); + + public static int getEnvironment(EntityMinotaur mob) { + return getEnvironment(mob.worldObj, (int) mob.posX, (int) mob.posZ, mob.dimension); } - public static int getEnvironment(World world, int x, int z, int dimension) - { - if(dimension == -1)return 1;//NETHER - - BiomeGenBase biome =world.getBiomeGenForCoords(x, z); - if(biome != null) - { - if(biome.getEnableSnow() || biome.temperature <= 0.25F || biome.getTempCategory() == BiomeGenBase.TempCategory.COLD) - { - return 2;//FROST + + public static int getEnvironment(World world, int x, int z, int dimension) { + if (dimension == -1) + return 1;// NETHER + + BiomeGenBase biome = world.getBiomeGenForCoords(x, z); + if (biome != null) { + if (biome.getEnableSnow() || biome.temperature <= 0.25F + || biome.getTempCategory() == BiomeGenBase.TempCategory.COLD) { + return 2;// FROST } } - return 0;//BROWN + return 0;// BROWN } + /** * What environment is a particular structure */ - public static int getEnvironment(String subtype) - { - return subtype.equalsIgnoreCase("Frost") ? (byte)2 : subtype.equalsIgnoreCase("Nether") ? (byte)1 : (byte)0; + public static int getEnvironment(String subtype) { + return subtype.equalsIgnoreCase("Frost") ? (byte) 2 : subtype.equalsIgnoreCase("Nether") ? (byte) 1 : (byte) 0; } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/PoisonBreath.java b/src/main/java/minefantasy/mf2/entity/mob/PoisonBreath.java index fe3ea8ac..9f9e3dde 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/PoisonBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/PoisonBreath.java @@ -13,67 +13,55 @@ import net.minecraft.util.EntityDamageSourceIndirect; import net.minecraft.world.World; -public class PoisonBreath extends DragonBreath -{ +public class PoisonBreath extends DragonBreath { - public PoisonBreath(String name) - { + public PoisonBreath(String name) { super(name); } @Override - public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) - { - return shooter == null ? new DamageSource("acidblastBase") : (new EntityDamageSourceIndirect("acidblast", breath, shooter)); + public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { + return shooter == null ? new DamageSource("acidblastBase") + : (new EntityDamageSourceIndirect("acidblast", breath, shooter)); } @Override @SideOnly(Side.CLIENT) - public String getTexture(EntityDragonBreath instance) - { + public String getTexture(EntityDragonBreath instance) { return "textures/projectile/dragonbreath_poison"; } - - public void onHitEntity(Entity target, EntityDragonBreath instance) - { + + public void onHitEntity(Entity target, EntityDragonBreath instance) { super.onHitEntity(target, instance); - if(target instanceof EntityLivingBase) - { + if (target instanceof EntityLivingBase) { float dam = instance.getDamage(); - ((EntityLivingBase)target).addPotionEffect(new PotionEffect(Potion.poison.id, 40, (int)dam)); - ((EntityLivingBase)target).addPotionEffect(new PotionEffect(Potion.confusion.id, 50, 10)); - - if(instance.rand.nextInt(10) == 0) - { - for(int a = 0; a < 5; a++) - { - ItemStack item = ((EntityLivingBase)target).getEquipmentInSlot(a); - if(item != null) - { - item.damageItem((int)dam, ((EntityLivingBase)target)); - if(item.getItemDamage() >= item.getMaxDamage()) - { - ((EntityLivingBase)target).renderBrokenItemStack(item); - ((EntityLivingBase)target).setCurrentItemOrArmor(a, null); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.poison.id, 40, (int) dam)); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.confusion.id, 50, 10)); + + if (instance.rand.nextInt(10) == 0) { + for (int a = 0; a < 5; a++) { + ItemStack item = ((EntityLivingBase) target).getEquipmentInSlot(a); + if (item != null) { + item.damageItem((int) dam, ((EntityLivingBase) target)); + if (item.getItemDamage() >= item.getMaxDamage()) { + ((EntityLivingBase) target).renderBrokenItemStack(item); + ((EntityLivingBase) target).setCurrentItemOrArmor(a, null); } } } } } } - + @Override - public float modifyDamage(Entity hit, float dam) - { - if(hit instanceof EntityCogwork) - { + public float modifyDamage(Entity hit, float dam) { + if (hit instanceof EntityCogwork) { return dam * 2; } return dam; } - + @Override - public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) - { + public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/ai/AI_CommonSprint.java b/src/main/java/minefantasy/mf2/entity/mob/ai/AI_CommonSprint.java index cc48557d..80313cee 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/ai/AI_CommonSprint.java +++ b/src/main/java/minefantasy/mf2/entity/mob/ai/AI_CommonSprint.java @@ -5,41 +5,36 @@ import net.minecraft.pathfinding.PathEntity; import net.minecraft.pathfinding.PathPoint; -public class AI_CommonSprint extends EntityAIBase -{ +public class AI_CommonSprint extends EntityAIBase { public EntityLiving entity; public float range; - public AI_CommonSprint(EntityLiving entity, float range) - { + + public AI_CommonSprint(EntityLiving entity, float range) { this.entity = entity; this.range = range; } + @Override - public boolean shouldExecute() - { + public boolean shouldExecute() { return !this.entity.isChild(); } - + @Override - public void updateTask() - { + public void updateTask() { double distance = 0; PathEntity path = this.entity.getNavigator().getPath(); - if(path != null) - { + if (path != null) { PathPoint end = path.getFinalPathPoint(); - if(path != null) - { + if (path != null) { distance = this.entity.getDistanceSq(end.xCoord, end.yCoord, end.zCoord); } - + } boolean isSprinting = this.entity.isSprinting(); boolean shouldSprint = distance >= this.range; - if(isSprinting != shouldSprint) - { + if (isSprinting != shouldSprint) { this.entity.setSprinting(shouldSprint); } - } + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/ai/AI_MinotaurFindTarget.java b/src/main/java/minefantasy/mf2/entity/mob/ai/AI_MinotaurFindTarget.java index e922fbb3..03481bb9 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/ai/AI_MinotaurFindTarget.java +++ b/src/main/java/minefantasy/mf2/entity/mob/ai/AI_MinotaurFindTarget.java @@ -7,114 +7,97 @@ import minefantasy.mf2.entity.mob.EntityMinotaur; import net.minecraft.command.IEntitySelector; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityCreature; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAITarget; -public class AI_MinotaurFindTarget extends EntityAITarget -{ - private final Class targetClass; - private final int targetChance; - private final AI_MinotaurFindTarget.Sorter theNearestAttackableTargetSorter; - private final IEntitySelector targetEntitySelector; - private EntityLivingBase targetEntity; - - private final EntityMinotaur minotaur; +public class AI_MinotaurFindTarget extends EntityAITarget { + private final Class targetClass; + private final int targetChance; + private final AI_MinotaurFindTarget.Sorter theNearestAttackableTargetSorter; + private final IEntitySelector targetEntitySelector; + private EntityLivingBase targetEntity; - public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight) - { - this(mob, target, chance, sight, false); - } + private final EntityMinotaur minotaur; - public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight, boolean nearby) - { - this(mob, target, chance, sight, nearby, (IEntitySelector)null); - } + public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight) { + this(mob, target, chance, sight, false); + } - public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight, boolean nearby, final IEntitySelector selector) - { - super(mob, sight, nearby); - this.minotaur = mob; - this.targetClass = target; - this.targetChance = chance; - this.theNearestAttackableTargetSorter = new AI_MinotaurFindTarget.Sorter(mob); - this.setMutexBits(1); - this.targetEntitySelector = new IEntitySelector() - { - public boolean isEntityApplicable(Entity target) - { - if(target instanceof EntityMinotaur) - { - return false; - } - return !(target instanceof EntityLivingBase) ? false : (selector != null && !selector.isEntityApplicable(target) ? false : AI_MinotaurFindTarget.this.isSuitableTarget((EntityLivingBase)target, false)); - } - }; - } + public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight, boolean nearby) { + this(mob, target, chance, sight, nearby, (IEntitySelector) null); + } - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() - { - if (this.targetChance > 0 && this.taskOwner.getRNG().nextInt(this.targetChance) != 0) - { - return false; - } - else - { - double d0 = this.getTargetDistance(); - if(minotaur.isDocile())//Docile are less aggro when calm - { - if(minotaur.getRageLevel() < 10) - { - d0 = 1.5D; - } - } - - List list = this.taskOwner.worldObj.selectEntitiesWithinAABB(this.targetClass, this.taskOwner.boundingBox.expand(d0, 4.0D, d0), this.targetEntitySelector); - Collections.sort(list, this.theNearestAttackableTargetSorter); + public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight, boolean nearby, + final IEntitySelector selector) { + super(mob, sight, nearby); + this.minotaur = mob; + this.targetClass = target; + this.targetChance = chance; + this.theNearestAttackableTargetSorter = new AI_MinotaurFindTarget.Sorter(mob); + this.setMutexBits(1); + this.targetEntitySelector = new IEntitySelector() { + public boolean isEntityApplicable(Entity target) { + if (target instanceof EntityMinotaur) { + return false; + } + return !(target instanceof EntityLivingBase) ? false + : (selector != null && !selector.isEntityApplicable(target) ? false + : AI_MinotaurFindTarget.this.isSuitableTarget((EntityLivingBase) target, false)); + } + }; + } - if (list.isEmpty()) - { - return false; - } - else - { - this.targetEntity = (EntityLivingBase)list.get(0); - return true; - } - } - } + /** + * Returns whether the EntityAIBase should begin execution. + */ + public boolean shouldExecute() { + if (this.targetChance > 0 && this.taskOwner.getRNG().nextInt(this.targetChance) != 0) { + return false; + } else { + double d0 = this.getTargetDistance(); + if (minotaur.isDocile())// Docile are less aggro when calm + { + if (minotaur.getRageLevel() < 10) { + d0 = 1.5D; + } + } - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() - { - this.taskOwner.setAttackTarget(this.targetEntity); - super.startExecuting(); - } + List list = this.taskOwner.worldObj.selectEntitiesWithinAABB(this.targetClass, + this.taskOwner.boundingBox.expand(d0, 4.0D, d0), this.targetEntitySelector); + Collections.sort(list, this.theNearestAttackableTargetSorter); - public static class Sorter implements Comparator - { - private final Entity theEntity; + if (list.isEmpty()) { + return false; + } else { + this.targetEntity = (EntityLivingBase) list.get(0); + return true; + } + } + } - public Sorter(Entity p_i1662_1_) - { - this.theEntity = p_i1662_1_; - } + /** + * Execute a one shot task or start executing a continuous task + */ + public void startExecuting() { + this.taskOwner.setAttackTarget(this.targetEntity); + super.startExecuting(); + } - public int compare(Entity p_compare_1_, Entity p_compare_2_) - { - double d0 = this.theEntity.getDistanceSqToEntity(p_compare_1_); - double d1 = this.theEntity.getDistanceSqToEntity(p_compare_2_); - return d0 < d1 ? -1 : (d0 > d1 ? 1 : 0); - } + public static class Sorter implements Comparator { + private final Entity theEntity; - public int compare(Object p_compare_1_, Object p_compare_2_) - { - return this.compare((Entity)p_compare_1_, (Entity)p_compare_2_); - } - } + public Sorter(Entity p_i1662_1_) { + this.theEntity = p_i1662_1_; + } + + public int compare(Entity p_compare_1_, Entity p_compare_2_) { + double d0 = this.theEntity.getDistanceSqToEntity(p_compare_1_); + double d1 = this.theEntity.getDistanceSqToEntity(p_compare_2_); + return d0 < d1 ? -1 : (d0 > d1 ? 1 : 0); + } + + public int compare(Object p_compare_1_, Object p_compare_2_) { + return this.compare((Entity) p_compare_1_, (Entity) p_compare_2_); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundBeg.java b/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundBeg.java index 70cacbf8..7f89d8e4 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundBeg.java +++ b/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundBeg.java @@ -7,73 +7,72 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class AI_HoundBeg extends EntityAIBase -{ - private EntityHound theWolf; - private EntityPlayer thePlayer; - private World worldObject; - private float minPlayerDistance; - private int field_75384_e; - private static final String __OBFID = "CL_00001576"; +public class AI_HoundBeg extends EntityAIBase { + private EntityHound theWolf; + private EntityPlayer thePlayer; + private World worldObject; + private float minPlayerDistance; + private int field_75384_e; + private static final String __OBFID = "CL_00001576"; - public AI_HoundBeg(EntityHound p_i1617_1_, float p_i1617_2_) - { - this.theWolf = p_i1617_1_; - this.worldObject = p_i1617_1_.worldObj; - this.minPlayerDistance = p_i1617_2_; - this.setMutexBits(2); - } + public AI_HoundBeg(EntityHound p_i1617_1_, float p_i1617_2_) { + this.theWolf = p_i1617_1_; + this.worldObject = p_i1617_1_.worldObj; + this.minPlayerDistance = p_i1617_2_; + this.setMutexBits(2); + } - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() - { - this.thePlayer = this.worldObject.getClosestPlayerToEntity(this.theWolf, (double)this.minPlayerDistance); - return this.thePlayer == null ? false : this.hasPlayerGotBoneInHand(this.thePlayer); - } + /** + * Returns whether the EntityAIBase should begin execution. + */ + public boolean shouldExecute() { + this.thePlayer = this.worldObject.getClosestPlayerToEntity(this.theWolf, this.minPlayerDistance); + return this.thePlayer == null ? false : this.hasPlayerGotBoneInHand(this.thePlayer); + } - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() - { - return !this.thePlayer.isEntityAlive() ? false : (this.theWolf.getDistanceSqToEntity(this.thePlayer) > (double)(this.minPlayerDistance * this.minPlayerDistance) ? false : this.field_75384_e > 0 && this.hasPlayerGotBoneInHand(this.thePlayer)); - } + /** + * Returns whether an in-progress EntityAIBase should continue executing + */ + public boolean continueExecuting() { + return !this.thePlayer.isEntityAlive() ? false + : (this.theWolf.getDistanceSqToEntity(this.thePlayer) > this.minPlayerDistance * this.minPlayerDistance + ? false + : this.field_75384_e > 0 && this.hasPlayerGotBoneInHand(this.thePlayer)); + } - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() - { - this.theWolf.func_70918_i(true); - this.field_75384_e = 40 + this.theWolf.getRNG().nextInt(40); - } + /** + * Execute a one shot task or start executing a continuous task + */ + public void startExecuting() { + this.theWolf.func_70918_i(true); + this.field_75384_e = 40 + this.theWolf.getRNG().nextInt(40); + } - /** - * Resets the task - */ - public void resetTask() - { - this.theWolf.func_70918_i(false); - this.thePlayer = null; - } + /** + * Resets the task + */ + public void resetTask() { + this.theWolf.func_70918_i(false); + this.thePlayer = null; + } - /** - * Updates the task - */ - public void updateTask() - { - this.theWolf.getLookHelper().setLookPosition(this.thePlayer.posX, this.thePlayer.posY + (double)this.thePlayer.getEyeHeight(), this.thePlayer.posZ, 10.0F, (float)this.theWolf.getVerticalFaceSpeed()); - --this.field_75384_e; - } + /** + * Updates the task + */ + public void updateTask() { + this.theWolf.getLookHelper().setLookPosition(this.thePlayer.posX, + this.thePlayer.posY + this.thePlayer.getEyeHeight(), this.thePlayer.posZ, 10.0F, + this.theWolf.getVerticalFaceSpeed()); + --this.field_75384_e; + } - /** - * Gets if the Player has the Bone in the hand. - */ - private boolean hasPlayerGotBoneInHand(EntityPlayer p_75382_1_) - { - ItemStack itemstack = p_75382_1_.inventory.getCurrentItem(); - return itemstack == null ? false : (!this.theWolf.isTamed() && itemstack.getItem() == Items.bone ? true : this.theWolf.isBreedingItem(itemstack)); - } + /** + * Gets if the Player has the Bone in the hand. + */ + private boolean hasPlayerGotBoneInHand(EntityPlayer p_75382_1_) { + ItemStack itemstack = p_75382_1_.inventory.getCurrentItem(); + return itemstack == null ? false + : (!this.theWolf.isTamed() && itemstack.getItem() == Items.bone ? true + : this.theWolf.isBreedingItem(itemstack)); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundFollow.java b/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundFollow.java index 273d84a4..ec1256f8 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundFollow.java +++ b/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundFollow.java @@ -7,122 +7,107 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class AI_HoundFollow extends EntityAIBase -{ - private EntityHound thePet; - private EntityLivingBase theOwner; - World theWorld; - private double field_75336_f; - private PathNavigate petPathfinder; - private int field_75343_h; - float maxDist; - float minDist; - private boolean field_75344_i; +public class AI_HoundFollow extends EntityAIBase { + private EntityHound thePet; + private EntityLivingBase theOwner; + World theWorld; + private double field_75336_f; + private PathNavigate petPathfinder; + private int field_75343_h; + float maxDist; + float minDist; + private boolean field_75344_i; - public AI_HoundFollow(EntityHound dog, double p_i1625_2_, float min, float max) - { - this.thePet = dog; - this.theWorld = dog.worldObj; - this.field_75336_f = p_i1625_2_; - this.petPathfinder = dog.getNavigator(); - this.minDist = min; - this.maxDist = max; - this.setMutexBits(3); - } + public AI_HoundFollow(EntityHound dog, double p_i1625_2_, float min, float max) { + this.thePet = dog; + this.theWorld = dog.worldObj; + this.field_75336_f = p_i1625_2_; + this.petPathfinder = dog.getNavigator(); + this.minDist = min; + this.maxDist = max; + this.setMutexBits(3); + } - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() - { - EntityLivingBase entitylivingbase = this.thePet.getOwner(); + /** + * Returns whether the EntityAIBase should begin execution. + */ + public boolean shouldExecute() { + EntityLivingBase entitylivingbase = this.thePet.getOwner(); - if (entitylivingbase == null) - { - return false; - } - else if (this.thePet.isSitting()) - { - return false; - } - else if (this.thePet.getDistanceSqToEntity(entitylivingbase) < (double)(this.minDist * this.minDist)) - { - return false; - } - else - { - this.theOwner = entitylivingbase; - return true; - } - } + if (entitylivingbase == null) { + return false; + } else if (this.thePet.isSitting()) { + return false; + } else if (this.thePet.getDistanceSqToEntity(entitylivingbase) < this.minDist * this.minDist) { + return false; + } else { + this.theOwner = entitylivingbase; + return true; + } + } - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() - { - return !this.petPathfinder.noPath() && this.thePet.getDistanceSqToEntity(this.theOwner) > (double)(this.maxDist * this.maxDist) && !this.thePet.isSitting(); - } + /** + * Returns whether an in-progress EntityAIBase should continue executing + */ + public boolean continueExecuting() { + return !this.petPathfinder.noPath() + && this.thePet.getDistanceSqToEntity(this.theOwner) > this.maxDist * this.maxDist + && !this.thePet.isSitting(); + } - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() - { - this.field_75343_h = 0; - this.field_75344_i = this.thePet.getNavigator().getAvoidsWater(); - this.thePet.getNavigator().setAvoidsWater(false); - } + /** + * Execute a one shot task or start executing a continuous task + */ + public void startExecuting() { + this.field_75343_h = 0; + this.field_75344_i = this.thePet.getNavigator().getAvoidsWater(); + this.thePet.getNavigator().setAvoidsWater(false); + } - /** - * Resets the task - */ - public void resetTask() - { - this.theOwner = null; - this.petPathfinder.clearPathEntity(); - this.thePet.getNavigator().setAvoidsWater(this.field_75344_i); - } + /** + * Resets the task + */ + public void resetTask() { + this.theOwner = null; + this.petPathfinder.clearPathEntity(); + this.thePet.getNavigator().setAvoidsWater(this.field_75344_i); + } - /** - * Updates the task - */ - public void updateTask() - { - this.thePet.getLookHelper().setLookPositionWithEntity(this.theOwner, 10.0F, (float)this.thePet.getVerticalFaceSpeed()); + /** + * Updates the task + */ + public void updateTask() { + this.thePet.getLookHelper().setLookPositionWithEntity(this.theOwner, 10.0F, this.thePet.getVerticalFaceSpeed()); - if (!this.thePet.isSitting() && this.thePet.shouldFollowOwner()) - { - if (--this.field_75343_h <= 0) - { - this.field_75343_h = 10; + if (!this.thePet.isSitting() && this.thePet.shouldFollowOwner()) { + if (--this.field_75343_h <= 0) { + this.field_75343_h = 10; - if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.field_75336_f)) - { - if (!this.thePet.getLeashed()) - { - if (this.thePet.getDistanceSqToEntity(this.theOwner) >= 144.0D)//Teleport - { - int i = MathHelper.floor_double(this.theOwner.posX) - 2; - int j = MathHelper.floor_double(this.theOwner.posZ) - 2; - int k = MathHelper.floor_double(this.theOwner.boundingBox.minY); + if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.field_75336_f)) { + if (!this.thePet.getLeashed()) { + if (this.thePet.getDistanceSqToEntity(this.theOwner) >= 144.0D)// Teleport + { + int i = MathHelper.floor_double(this.theOwner.posX) - 2; + int j = MathHelper.floor_double(this.theOwner.posZ) - 2; + int k = MathHelper.floor_double(this.theOwner.boundingBox.minY); - for (int l = 0; l <= 4; ++l) - { - for (int i1 = 0; i1 <= 4; ++i1) - { - if ((l < 1 || i1 < 1 || l > 3 || i1 > 3) && World.doesBlockHaveSolidTopSurface(this.theWorld, i + l, k - 1, j + i1) && !this.theWorld.getBlock(i + l, k, j + i1).isNormalCube() && !this.theWorld.getBlock(i + l, k + 1, j + i1).isNormalCube()) - { - this.thePet.setLocationAndAngles((double)((float)(i + l) + 0.5F), (double)k, (double)((float)(j + i1) + 0.5F), this.thePet.rotationYaw, this.thePet.rotationPitch); - this.petPathfinder.clearPathEntity(); - return; - } - } - } - } - } - } - } - } - } + for (int l = 0; l <= 4; ++l) { + for (int i1 = 0; i1 <= 4; ++i1) { + if ((l < 1 || i1 < 1 || l > 3 || i1 > 3) + && World.doesBlockHaveSolidTopSurface(this.theWorld, i + l, k - 1, j + i1) + && !this.theWorld.getBlock(i + l, k, j + i1).isNormalCube() + && !this.theWorld.getBlock(i + l, k + 1, j + i1).isNormalCube()) { + this.thePet.setLocationAndAngles(i + l + 0.5F, k, j + i1 + 0.5F, + this.thePet.rotationYaw, this.thePet.rotationPitch); + this.petPathfinder.clearPathEntity(); + return; + } + } + } + } + } + } + } + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/farming/FarmingHelper.java b/src/main/java/minefantasy/mf2/farming/FarmingHelper.java index 0c2783ff..6fdb5a7b 100644 --- a/src/main/java/minefantasy/mf2/farming/FarmingHelper.java +++ b/src/main/java/minefantasy/mf2/farming/FarmingHelper.java @@ -9,53 +9,44 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class FarmingHelper -{ +public class FarmingHelper { private static Random rand = new Random(); private static float hoeFailChanceModifier = 1.0F; - - + public static boolean isEnabled = true; - + public static float hoeFailChanceCfg = 1.0F; public static float farmBreakCfg = 1.0F; - - public static boolean didHoeFail(ItemStack hoe, World world, boolean grass) - { - if(!isEnabled) - { + + public static boolean didHoeFail(ItemStack hoe, World world, boolean grass) { + if (!isEnabled) { return false; } - float chanceMax = 30F*hoeFailChanceModifier*hoeFailChanceCfg; - float chance = rand.nextFloat()*chanceMax; - float efficiency = (getHoeEfficiency(hoe)*(grass ? 2.0F : 3.0F)); - + float chanceMax = 30F * hoeFailChanceModifier * hoeFailChanceCfg; + float chance = rand.nextFloat() * chanceMax; + float efficiency = (getHoeEfficiency(hoe) * (grass ? 2.0F : 3.0F)); + MineFantasyAPI.debugMsg("Hoe Chance Fail = " + chance + " / " + efficiency + " (max= " + chanceMax + ")"); - return chance > efficiency;//Dirt is easier to hoe + return chance > efficiency;// Dirt is easier to hoe } - - public static boolean didHarvestRuinBlock(World world, boolean scythe) - { - if(!isEnabled) - { + + public static boolean didHarvestRuinBlock(World world, boolean scythe) { + if (!isEnabled) { return false; } - float chance = 20F + (world.difficultySetting.getDifficultyId()*10F); - if(scythe)chance *= 2F; - return rand.nextFloat()*100F <= chance*farmBreakCfg ; + float chance = 20F + (world.difficultySetting.getDifficultyId() * 10F); + if (scythe) + chance *= 2F; + return rand.nextFloat() * 100F <= chance * farmBreakCfg; } - - private static float getHoeEfficiency(ItemStack hoe) - { - if(hoe != null) - { - if(hoe.getItem() instanceof ItemHoe) - { - String name = ((ItemHoe)hoe.getItem()).getToolMaterialName(); + + private static float getHoeEfficiency(ItemStack hoe) { + if (hoe != null) { + if (hoe.getItem() instanceof ItemHoe) { + String name = ((ItemHoe) hoe.getItem()).getToolMaterialName(); ToolMaterial mat = ToolMaterial.valueOf(name); - - if(mat != null) - { + + if (mat != null) { return CustomHoeEntry.getEntryEfficiency(hoe, mat.getEfficiencyOnProperMaterial()); } } diff --git a/src/main/java/minefantasy/mf2/hunger/HungerSystemMF.java b/src/main/java/minefantasy/mf2/hunger/HungerSystemMF.java index 376078e5..61c30fc5 100644 --- a/src/main/java/minefantasy/mf2/hunger/HungerSystemMF.java +++ b/src/main/java/minefantasy/mf2/hunger/HungerSystemMF.java @@ -1,118 +1,100 @@ package minefantasy.mf2.hunger; -import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.api.MineFantasyAPI; -import net.minecraft.entity.player.EntityPlayer; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; +import minefantasy.mf2.api.MineFantasyAPI; +import net.minecraft.entity.player.EntityPlayer; -public class HungerSystemMF -{ +public class HungerSystemMF { private static final String prevFoodNBT = "MF_previousFoodLevel"; private static final String tempFoodNBT = "MF_tempFood"; private static final String saturationNBT = "MF_saturationTicks"; + @SubscribeEvent - public void onPlayerTick(TickEvent.PlayerTickEvent event) - { - if(!event.player.worldObj.isRemote) - { - if(event.phase == TickEvent.Phase.START) - { - event.player.getEntityData().setInteger(prevFoodNBT, event.player.getFoodStats().getFoodLevel()); - } - if(event.phase == TickEvent.Phase.END) - { - slowHunger(event.player); - } - } + public void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (!event.player.worldObj.isRemote) { + if (event.phase == TickEvent.Phase.START) { + event.player.getEntityData().setInteger(prevFoodNBT, event.player.getFoodStats().getFoodLevel()); + } + if (event.phase == TickEvent.Phase.END) { + slowHunger(event.player); + } + } } - - public void slowHunger(EntityPlayer player) - { - //init vars + + public void slowHunger(EntityPlayer player) { + // init vars int food = player.getFoodStats().getFoodLevel(); - - int prevFood = food; - if(player.getEntityData().hasKey(prevFoodNBT)) - { - prevFood = player.getEntityData().getInteger(prevFoodNBT); - } - - if(food < prevFood) - { - float sat = getSaturation(player); - float temp = getTempFood(player); - MineFantasyAPI.debugMsg("Saturation: " + sat + " Temp: " + temp); - - if(slowdownRate < 0 || temp > 0) - { - MineFantasyAPI.debugMsg("Hunger drop cancelled: Temp"); - setTempFood(player, temp-1); - player.getFoodStats().addStats(1, 0.0F); - } - else if(sat > 0) - { - decrSaturation(player); - MineFantasyAPI.debugMsg("Hunger drop cancelled: Sat = " + (sat-1)); - player.getFoodStats().addStats(1, 0.0F); - } - - if(temp <= 0) - { - setTempFood(player, getTempSlowdownLvl(player)); - } - } - } - - private float getTempSlowdownLvl(EntityPlayer player) - { + + int prevFood = food; + if (player.getEntityData().hasKey(prevFoodNBT)) { + prevFood = player.getEntityData().getInteger(prevFoodNBT); + } + + if (food < prevFood) { + float sat = getSaturation(player); + float temp = getTempFood(player); + MineFantasyAPI.debugMsg("Saturation: " + sat + " Temp: " + temp); + + if (slowdownRate < 0 || temp > 0) { + MineFantasyAPI.debugMsg("Hunger drop cancelled: Temp"); + setTempFood(player, temp - 1); + player.getFoodStats().addStats(1, 0.0F); + } else if (sat > 0) { + decrSaturation(player); + MineFantasyAPI.debugMsg("Hunger drop cancelled: Sat = " + (sat - 1)); + player.getFoodStats().addStats(1, 0.0F); + } + + if (temp <= 0) { + setTempFood(player, getTempSlowdownLvl(player)); + } + } + } + + private float getTempSlowdownLvl(EntityPlayer player) { return slowdownRate; } + public static int slowdownRate = 3; - public static void setSaturation(EntityPlayer user, float value) - { + public static void setSaturation(EntityPlayer user, float value) { user.getEntityData().setFloat(saturationNBT, value); } - public static float getSaturation(EntityPlayer user) - { - if(user.getEntityData().hasKey(saturationNBT)) - { + + public static float getSaturation(EntityPlayer user) { + if (user.getEntityData().hasKey(saturationNBT)) { return user.getEntityData().getFloat(saturationNBT); } return 0F; } - public static void setTempFood(EntityPlayer user, float value) - { + + public static void setTempFood(EntityPlayer user, float value) { user.getEntityData().setFloat(tempFoodNBT, value); } - public static float getTempFood(EntityPlayer user) - { - if(user.getEntityData().hasKey(tempFoodNBT)) - { + + public static float getTempFood(EntityPlayer user) { + if (user.getEntityData().hasKey(tempFoodNBT)) { return user.getEntityData().getFloat(tempFoodNBT); } return 0F; } - public static void decrSaturation(EntityPlayer user) - { + + public static void decrSaturation(EntityPlayer user) { float sat = getSaturation(user); - sat --; - if(sat < 0) - { + sat--; + if (sat < 0) { sat = -1; } - if(!user.worldObj.isRemote) - { + if (!user.worldObj.isRemote) { setSaturation(user, sat); } } - public static void applySaturation(EntityPlayer consumer, float newValue) - { + + public static void applySaturation(EntityPlayer consumer, float newValue) { float value = getSaturation(consumer); - - if(newValue > value) - { + + if (newValue > value) { setSaturation(consumer, newValue); } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java b/src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java index 6110839e..adf026e2 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java @@ -4,35 +4,36 @@ import minefantasy.mf2.api.rpg.SkillList; public enum Skills { - + /* TODO: Rewrite */ - - Artisanry(SkillList.artisanry, "artisanry"), Construction(SkillList.construction, "construction"), Combat(SkillList.combat, "combat"), - Engineering(SkillList.engineering, "engineering"), Provisioning(SkillList.provisioning, "provisioning"); - + + Artisanry(SkillList.artisanry, "artisanry"), Construction(SkillList.construction, "construction"), Combat( + SkillList.combat, "combat"), Engineering(SkillList.engineering, + "engineering"), Provisioning(SkillList.provisioning, "provisioning"); + private Skill s; private String name; - + private Skills(Skill s, String name) { this.s = s; this.name = name; } - - public String getName(){ + + public String getName() { return name; } - - public Skill getSkill(){ + + public Skill getSkill() { return s; } - - public static Skills getFromString(String name){ - for(Skills s : Skills.values()){ - if(s.getName().equalsIgnoreCase(name)){ + + public static Skills getFromString(String name) { + for (Skills s : Skills.values()) { + if (s.getName().equalsIgnoreCase(name)) { return s; } } return null; } - + } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java index 95591511..82cee0f0 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java @@ -12,49 +12,52 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class TweakedAlloyRecipe extends Alloy{ +public class TweakedAlloyRecipe extends Alloy { public TweakedAlloyRecipe(IItemStack output, int requiredLevel, List items) { super(MineTweakerMC.getItemStack(output), requiredLevel, items); } - + @Override public boolean matches(ItemStack[] inv) { ArrayList check = new ArrayList(recipeItems); ArrayList check2 = new ArrayList(recipeItems); - for(ItemStack stack : inv){ - if(stack != null){ + for (ItemStack stack : inv) { + if (stack != null) { boolean matches = false; Iterator it = check.iterator(); - while(it.hasNext()){ + while (it.hasNext()) { IIngredient ingred = (IIngredient) it.next(); - for(IItemStack i : ingred.getItems()){ + for (IItemStack i : ingred.getItems()) { ItemStack is = MineTweakerMC.getItemStack(i); - if(stack.isItemEqual(is) && (is.getItemDamage() == OreDictionary.WILDCARD_VALUE || is.getItemDamage() == stack.getItemDamage())){ + if (stack.isItemEqual(is) && (is.getItemDamage() == OreDictionary.WILDCARD_VALUE + || is.getItemDamage() == stack.getItemDamage())) { matches = true; check2.remove(ingred); break; } - if(areBothCarbon(is, stack)){ + if (areBothCarbon(is, stack)) { matches = true; check2.remove(ingred); break; } } - if(matches) break; + if (matches) + break; } - if(!matches) return false; + if (!matches) + return false; } } boolean empty = true; - for(Object o : check2){ - if(o != null) empty = false; + for (Object o : check2) { + if (o != null) + empty = false; } return empty; } - - private boolean areBothCarbon(ItemStack item1, ItemStack item2) - { + + private boolean areBothCarbon(ItemStack item1, ItemStack item2) { return MineFantasyFuels.isCarbon(item1) && MineFantasyFuels.isCarbon(item2); } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java index 3b0378a6..b69eb386 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java @@ -10,7 +10,7 @@ public class TweakedShapedAnvilRecipe implements IAnvilRecipe { - private int hammer, anvil, /*craft,*/ time, width, height; + private int hammer, anvil, /* craft, */ time, width, height; private float exp; private IItemStack result; private IIngredient[][] ingreds; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java index a233175f..46f4b2cb 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java @@ -92,7 +92,7 @@ public boolean matches(CarpenterCraftMatrix inv) { return false; ItemStack stack = inv.getStackInRowAndColumn(x, y); - //int a = y + x * 4; + // int a = y + x * 4; if (stack == null && this.ingreds[y][x] == null) { continue; } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java index 984efd7b..cae140ac 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java @@ -8,16 +8,17 @@ import minetweaker.api.minecraft.MineTweakerMC; import net.minecraft.item.ItemStack; -public class TweakedShapelessCBRecipes implements ICarpenterRecipe{ - - private int hammer, anvil, /*craft,*/ time, width, height; +public class TweakedShapelessCBRecipes implements ICarpenterRecipe { + + private int hammer, anvil, /* craft, */ time, width, height; private float exp; private IItemStack result; private IIngredient[] ingreds; private Skill s; private String research, tool, sound; - - public TweakedShapelessCBRecipes(IIngredient[] input, IItemStack output, String tool, int time, int hammer, int anvil, float exp, String sound, String research, Skill s) { + + public TweakedShapelessCBRecipes(IIngredient[] input, IItemStack output, String tool, int time, int hammer, + int anvil, float exp, String sound, String research, Skill s) { this.height = 4; this.width = 4; this.ingreds = input; @@ -31,7 +32,7 @@ public TweakedShapelessCBRecipes(IIngredient[] input, IItemStack output, String this.s = s; this.time = 1; } - + @Override public int getAnvil() { return anvil; @@ -86,32 +87,39 @@ public String getToolType() { public boolean matches(CarpenterCraftMatrix inv) { boolean matches[] = new boolean[this.ingreds.length]; boolean items[][] = new boolean[4][4]; - for(int a = 0; a < this.ingreds.length; a++){ + for (int a = 0; a < this.ingreds.length; a++) { IIngredient i = this.ingreds[a]; - for(IItemStack s : i.getItems()){ + for (IItemStack s : i.getItems()) { ItemStack ingred = MineTweakerMC.getItemStack(s); boolean found = false; - for(int x = 0; x < 4; x++){ - for(int y = 0; y < 4; y++){ + for (int x = 0; x < 4; x++) { + for (int y = 0; y < 4; y++) { ItemStack stack = inv.getStackInRowAndColumn(x, y); - if(stack == null) continue; - if(stack.getItem() == ingred.getItem() && stack.getItemDamage() == ingred.getItemDamage() && !items[x][y]){ + if (stack == null) + continue; + if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == ingred.getItemDamage() + && !items[x][y]) { matches[a] = true; items[x][y] = true; found = true; break; } } - if(found)break; + if (found) + break; } - if(found)break; + if (found) + break; } } boolean isMatch = true; - for(boolean b : matches) if(!b) isMatch = false; - for(int x = 0; x < 4; x++){ - for(int y = 0; y < 4; y++){ - if(!items[x][y] && inv.getStackInRowAndColumn(x, y) != null) isMatch = false; + for (boolean b : matches) + if (!b) + isMatch = false; + for (int x = 0; x < 4; x++) { + for (int y = 0; y < 4; y++) { + if (!items[x][y] && inv.getStackInRowAndColumn(x, y) != null) + isMatch = false; } } return isMatch; @@ -126,5 +134,5 @@ public boolean outputHot() { public String getSound() { return sound; } - + } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java index 606f09fe..5573b537 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java @@ -17,20 +17,23 @@ @ZenClass("mods.minefantasy.Anvil") public class Anvil { - + @ZenMethod - public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, boolean hot, double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds){ - MineTweakerAPI.apply(new AnvilAction(output, Skills.getFromString(skill).getSkill(), research, hot, (float)exp, tool, hammer, anvil, time, ingreds)); + public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, boolean hot, + double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { + MineTweakerAPI.apply(new AnvilAction(output, Skills.getFromString(skill).getSkill(), research, hot, (float) exp, + tool, hammer, anvil, time, ingreds)); } - + @ZenMethod - public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, boolean hot, double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds){ - MineTweakerAPI.apply(new AnvilAction(output, Skills.getFromString(skill).getSkill(), research, hot, (float)exp, tool, hammer, anvil, time, ingreds)); + public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, boolean hot, + double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { + MineTweakerAPI.apply(new AnvilAction(output, Skills.getFromString(skill).getSkill(), research, hot, (float) exp, + tool, hammer, anvil, time, ingreds)); } - - - public static class AnvilAction implements IUndoableAction{ - + + public static class AnvilAction implements IUndoableAction { + IItemStack out; Skill s; String research, tool; @@ -41,33 +44,42 @@ public static class AnvilAction implements IUndoableAction{ IIngredient[] ingreds2; boolean shaped; IAnvilRecipe r; - - //private static final char[] chars = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; - - public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { + + // private static final char[] chars = + // {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; + + public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, + int anvil, int time, IIngredient[][] ingreds) { this.out = out; this.s = s; - this.research = research; this.tool = tool; + this.research = research; + this.tool = tool; this.hot = hot; this.exp = exp; - this.hammer = hammer; this.anvil = anvil; this.time = time; + this.hammer = hammer; + this.anvil = anvil; + this.time = time; this.ingreds = ingreds; this.shaped = true; r = new TweakedShapedAnvilRecipe(ingreds, out, tool, time, hammer, anvil, exp, hot, research, s); } - - public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { + + public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, + int anvil, int time, IIngredient[] ingreds) { this.out = out; this.s = s; - this.research = research; this.tool = tool; + this.research = research; + this.tool = tool; this.hot = hot; this.exp = exp; - this.hammer = hammer; this.anvil = anvil; this.time = time; + this.hammer = hammer; + this.anvil = anvil; + this.time = time; this.ingreds2 = ingreds; this.shaped = false; - r = new TweakedShapelessAnvilRecipe(ingreds2,out,tool,time,hammer,anvil,exp,hot,research,s); + r = new TweakedShapelessAnvilRecipe(ingreds2, out, tool, time, hammer, anvil, exp, hot, research, s); } - + @Override public void apply() { CraftingManagerAnvil.getInstance().recipes.add(r); @@ -97,7 +109,7 @@ public String describeUndo() { public void undo() { CraftingManagerAnvil.getInstance().recipes.remove(r); } - + } - + } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java index c2bb34d1..3022e650 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java @@ -16,19 +16,23 @@ @ZenClass("mods.minefantasy.CarpenterBench") public class CarpentersBench { - + @ZenMethod - public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, String sound, double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds){ - MineTweakerAPI.apply(new CarpentersAction(output,Skills.getFromString(skill).getSkill(), research, sound, (float)exp, tool, hammer, anvil, time, ingreds)); + public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, String sound, + double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { + MineTweakerAPI.apply(new CarpentersAction(output, Skills.getFromString(skill).getSkill(), research, sound, + (float) exp, tool, hammer, anvil, time, ingreds)); } - + @ZenMethod - public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, String sound, double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds){ - MineTweakerAPI.apply(new CarpentersAction(output,Skills.getFromString(skill).getSkill(), research, sound, (float)exp, tool, hammer, anvil, time, ingreds)); + public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, String sound, + double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { + MineTweakerAPI.apply(new CarpentersAction(output, Skills.getFromString(skill).getSkill(), research, sound, + (float) exp, tool, hammer, anvil, time, ingreds)); } - - public static class CarpentersAction implements IUndoableAction{ - + + public static class CarpentersAction implements IUndoableAction { + IItemStack out; Skill s; String research, tool, sound; @@ -38,33 +42,42 @@ public static class CarpentersAction implements IUndoableAction{ IIngredient[] ingreds2; boolean shaped; ICarpenterRecipe r; - - //private static final char[] chars = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; - - public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { + + // private static final char[] chars = + // {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; + + public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, + int hammer, int anvil, int time, IIngredient[][] ingreds) { this.out = out; this.s = s; - this.research = research; this.tool = tool; + this.research = research; + this.tool = tool; this.sound = sound; this.exp = exp; - this.hammer = hammer; this.anvil = anvil; this.time = time; + this.hammer = hammer; + this.anvil = anvil; + this.time = time; this.ingreds = ingreds; this.shaped = true; r = new TweakedShapedCBRecipes(ingreds, out, tool, time, hammer, anvil, exp, sound, research, s); } - - public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { + + public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, + int hammer, int anvil, int time, IIngredient[] ingreds) { this.out = out; this.s = s; - this.research = research; this.tool = tool; + this.research = research; + this.tool = tool; this.sound = sound; this.exp = exp; - this.hammer = hammer; this.anvil = anvil; this.time = time; + this.hammer = hammer; + this.anvil = anvil; + this.time = time; this.ingreds2 = ingreds; this.shaped = false; r = new TweakedShapelessCBRecipes(ingreds2, out, tool, time, hammer, anvil, exp, sound, research, s); } - + @Override public void apply() { CraftingManagerCarpenter.getInstance().recipes.add(r); @@ -94,7 +107,7 @@ public String describeUndo() { public void undo() { CraftingManagerCarpenter.getInstance().recipes.remove(r); } - + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java index 4e40159f..2b5afc98 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java @@ -15,31 +15,31 @@ @ZenClass("mods.minefantasy.Crucible") public class Crucible { - + @ZenMethod - public static void addAlloy(IItemStack out, int level, int dupe, IIngredient[] ingred){ + public static void addAlloy(IItemStack out, int level, int dupe, IIngredient[] ingred) { MineTweakerAPI.apply(new AlloyAction(out, level, ingred, dupe)); } - - private static class AlloyAction extends OneWayAction{ - + + private static class AlloyAction extends OneWayAction { + private IItemStack out; private int level; private List ingreds; private int dupe; Alloy a; - + public AlloyAction(IItemStack out, int level, IIngredient[] ingreds, int dupe) { this.out = out; this.level = level; this.ingreds = new ArrayList(); this.dupe = dupe; - for(IIngredient i : ingreds){ + for (IIngredient i : ingreds) { this.ingreds.add(i); } a = new TweakedAlloyRecipe(out, level, this.ingreds); } - + @Override public void apply() { AlloyRecipes.addAlloy(a); @@ -54,7 +54,7 @@ public String describe() { public Object getOverrideKey() { return null; } - + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java index 493645e1..561849c1 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java @@ -3,7 +3,6 @@ import minefantasy.mf2.api.heating.Heatable; import minetweaker.IUndoableAction; import minetweaker.MineTweakerAPI; -import minetweaker.annotations.ModOnly; import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; import minetweaker.api.minecraft.MineTweakerMC; @@ -12,27 +11,27 @@ @ZenClass("mods.minefantasy.Forge") public class Forge { - + @ZenMethod - public static void addHeatableItem(IIngredient input, int min, int unstable, int max){ - MineTweakerAPI.apply(new heatableItemAction(input,min,unstable,max)); + public static void addHeatableItem(IIngredient input, int min, int unstable, int max) { + MineTweakerAPI.apply(new heatableItemAction(input, min, unstable, max)); } - - public static class heatableItemAction implements IUndoableAction{ - + + public static class heatableItemAction implements IUndoableAction { + IIngredient input; int min, unstable, max; - + public heatableItemAction(IIngredient input, int min, int unstable, int max) { this.input = input; this.min = min; this.unstable = unstable; this.max = max; } - + @Override public void apply() { - for(IItemStack s : input.getItems()){ + for (IItemStack s : input.getItems()) { Heatable.addItem(MineTweakerMC.getItemStack(s), min, unstable, max); } } @@ -59,11 +58,11 @@ public Object getOverrideKey() { @Override public void undo() { - for(IItemStack s : input.getItems()){ + for (IItemStack s : input.getItems()) { Heatable.registerList.remove(Heatable.getRegistrationForItem(MineTweakerMC.getItemStack(s))); } } - + } - + } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java index b58adfc1..ed899cad 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java @@ -3,7 +3,6 @@ import minefantasy.mf2.api.crafting.tanning.TanningRecipe; import minetweaker.MineTweakerAPI; import minetweaker.OneWayAction; -import minetweaker.annotations.ModOnly; import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; import minetweaker.api.minecraft.MineTweakerMC; @@ -13,26 +12,25 @@ @ZenClass("mods.minefantasy.TanningRack") public class TanningRack { - + @ZenMethod - public static void addTieredRecipe(IItemStack output, IIngredient input, float time, int tier){ + public static void addTieredRecipe(IItemStack output, IIngredient input, float time, int tier) { MineTweakerAPI.apply(new TanningAction(output, input, time, tier, "knife")); } - + @ZenMethod - public static void addTieredAndToolRecipe(IItemStack output, IIngredient input, float time, int tier, String tool){ + public static void addTieredAndToolRecipe(IItemStack output, IIngredient input, float time, int tier, String tool) { MineTweakerAPI.apply(new TanningAction(output, input, time, tier, tool)); } - - - public static class TanningAction extends OneWayAction{ - + + public static class TanningAction extends OneWayAction { + IItemStack output; IIngredient input; float time; int tier; String tool; - + public TanningAction(IItemStack output, IIngredient input, float time, int tier, String tool) { this.output = output; this.input = input; @@ -40,10 +38,10 @@ public TanningAction(IItemStack output, IIngredient input, float time, int tier, this.tier = tier; this.tool = tool; } - + @Override public void apply() { - for(IItemStack s : input.getItems()){ + for (IItemStack s : input.getItems()) { ItemStack stack = MineTweakerMC.getItemStack(s); TanningRecipe.addRecipe(stack, time, tier, tool, MineTweakerMC.getItemStack(output)); } @@ -53,12 +51,12 @@ public void apply() { public String describe() { return "Creating Tanning Recipe"; } - + @Override public Object getOverrideKey() { return null; } - + } - + } diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java index 5a8495d4..0cbaf281 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java @@ -53,7 +53,7 @@ public void loadCraftingRecipes(ItemStack inputStack) { if (recipe == null) { continue; } - + arecipes.add(recipe); } } @@ -85,7 +85,7 @@ private CachedAnvilRecipe handleRecipe(IAnvilRecipe irecipe, ItemStack inputStac } else if (irecipe instanceof ShapelessAnvilRecipes) { return new CachedAnvilRecipe((ShapelessAnvilRecipes) irecipe); } - + return null; } diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java index 02eee747..3da92050 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java @@ -57,7 +57,7 @@ public void drawBackground(int recipe) { GuiDraw.changeTexture(getGuiTexture()); GuiDraw.drawTexturedModalRect(0, 0, 5, 11, 166, 63); } - + @Override public void loadCraftingRecipes(ItemStack result) { for (RecipePair recipePair : recipeList) { @@ -94,7 +94,7 @@ private class BigFurnaceRecipe extends CachedRecipe { private BigFurnaceRecipe(ItemStack inputStack, ItemStack outputStack) { input = new PositionedStack(inputStack, 31, 15); - output = new PositionedStack(outputStack, 102, 16); //Hell of a perfectionist + output = new PositionedStack(outputStack, 102, 16); // Hell of a perfectionist } @Override diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java index 3707b26b..e97a9ac7 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java @@ -47,7 +47,7 @@ public int recipiesPerPage() { return 1; } - @Override + @Override public void drawBackground(int recipe) { GL11.glColor4f(1, 1, 1, 1); GuiDraw.changeTexture(getGuiTexture()); @@ -56,7 +56,7 @@ public void drawBackground(int recipe) { @Override public void loadCraftingRecipes(ItemStack result) { - Map recipes = (Map) BloomRecipe.recipeList; + Map recipes = BloomRecipe.recipeList; for (Entry recipe : recipes.entrySet()) { if (CustomToolHelper.areEqual(recipe.getValue(), result)) { arecipes.add(new SmeltingPair(recipe.getKey(), recipe.getValue())); @@ -73,7 +73,7 @@ public void loadUsageRecipes(ItemStack ingredient) { arecipes.add(arecipe); } } - + private static void findFuels() { afuels = new ArrayList(); for (ForgeFuel fuel : ForgeItemHandler.forgeFuel) { @@ -91,16 +91,16 @@ private FuelPair(ItemStack fuel) { this.stack = new PositionedStack(fuel, 75, 57, false); } } - + private class SmeltingPair extends CachedRecipe { private PositionedStack ingred; private PositionedStack result; - private SmeltingPair(ItemStack ingred, ItemStack result) { + private SmeltingPair(ItemStack ingred, ItemStack result) { this.ingred = new PositionedStack(ingred, 75, 19); this.result = new PositionedStack(result, 120, 29); } - + @Override public List getIngredients() { return getCycledIngredients(cycleticks / 48, Arrays.asList(ingred)); diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java index 3e598647..de26d71a 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java @@ -30,7 +30,7 @@ public String getRecipeName() { @Override public String getGuiTexture() { - return"minefantasy2:textures/gui/knowledge/carpenterGrid.png"; + return "minefantasy2:textures/gui/knowledge/carpenterGrid.png"; } @Override diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java index 7a99f784..a8e1f61c 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java @@ -61,14 +61,14 @@ public void loadCraftingRecipes(ItemStack result) { @Override public void loadUsageRecipes(ItemStack ingredient) { - if(ingredient.getItem().equals(ComponentListMF.clay_pot)) { + if (ingredient.getItem().equals(ComponentListMF.clay_pot)) { for (RecipePair recipePair : recipeList) { CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipePair.inputStack, recipePair.outputStack); arecipes.add(cachedRecipe); } return; } - + QuernRecipes output = QuernRecipes.getResult(ingredient); if (output != null) { CachedQuernRecipe recipe = new CachedQuernRecipe(ingredient, output.result); diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java index 4017d44e..a5f0bdcb 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java @@ -19,7 +19,7 @@ public String getRecipeName() { @Override public String getGuiTexture() { - return "minefantasy2:textures/gui/quern.png"; //need to draw texture + return "minefantasy2:textures/gui/quern.png"; // need to draw texture } @Override @@ -45,9 +45,10 @@ public void loadUsageRecipes(ItemStack ingredient) { @Override public void drawExtras(int recipe) { TanningPair cachedRecipe = (TanningPair) this.arecipes.get(recipe); - GuiDraw.drawString(String.format("%s: %s", StatCollector.translateToLocal("nei.method.tanning.tool"), cachedRecipe.toolType), 10, 85, -16777216, false); + GuiDraw.drawString(String.format("%s: %s", StatCollector.translateToLocal("nei.method.tanning.tool"), + cachedRecipe.toolType), 10, 85, -16777216, false); } - + @Override public int recipiesPerPage() { return 1; diff --git a/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java b/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java index ce81b6f4..2dc0eb81 100644 --- a/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java +++ b/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java @@ -1,5 +1,6 @@ package minefantasy.mf2.item; +import cpw.mods.fml.common.IFuelHandler; import minefantasy.mf2.api.crafting.MineFantasyFuels; import minefantasy.mf2.item.list.ComponentListMF; import net.minecraft.init.Blocks; @@ -7,39 +8,31 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -import cpw.mods.fml.common.IFuelHandler; -public class AdvancedFuelHandlerMF implements IFuelHandler -{ +public class AdvancedFuelHandlerMF implements IFuelHandler { - public static void registerItems() - { - MineFantasyFuels.addCarbon( new ItemStack(Items.coal, 1, OreDictionary.WILDCARD_VALUE), 1); + public static void registerItems() { + MineFantasyFuels.addCarbon(new ItemStack(Items.coal, 1, OreDictionary.WILDCARD_VALUE), 1); MineFantasyFuels.addCarbon(ComponentListMF.coke, 1); MineFantasyFuels.addCarbon(ComponentListMF.coal_flux, 1); MineFantasyFuels.addCarbon(Blocks.coal_block, 9); } + @Override - public int getBurnTime(ItemStack fuel) - { - if(fuel == null) - { + public int getBurnTime(ItemStack fuel) { + if (fuel == null) { return 0; } - if(fuel.getItem() == ComponentListMF.coalDust) - { - return 300;//15s + if (fuel.getItem() == ComponentListMF.coalDust) { + return 300;// 15s } - if(fuel.getItem() == ComponentListMF.coke) - { + if (fuel.getItem() == ComponentListMF.coke) { return 2400; } - if(fuel.getItem() == Items.coal) - { + if (fuel.getItem() == Items.coal) { return 1200; } - if(fuel.getItem() == Item.getItemFromBlock(Blocks.coal_block)) - { + if (fuel.getItem() == Item.getItemFromBlock(Blocks.coal_block)) { return 10800; } return 0; diff --git a/src/main/java/minefantasy/mf2/item/ClientItemsMF.java b/src/main/java/minefantasy/mf2/item/ClientItemsMF.java index 0c5dc5b7..d9a970a5 100644 --- a/src/main/java/minefantasy/mf2/item/ClientItemsMF.java +++ b/src/main/java/minefantasy/mf2/item/ClientItemsMF.java @@ -13,21 +13,16 @@ import net.minecraft.util.StatCollector; @SideOnly(Side.CLIENT) -public class ClientItemsMF -{ +public class ClientItemsMF { - public static boolean showSpecials(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { - if(GameSettings.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindSneak)) - { + public static boolean showSpecials(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + if (GameSettings.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindSneak)) { return true; - } - else - { - String keyname = Keyboard.getKeyName(Minecraft.getMinecraft().gameSettings.keyBindSneak.getKeyCode()); - list.add(StatCollector.translateToLocalFormatted("info.tooltip.moreinfo", keyname.toUpperCase())); - return false; - } + } else { + String keyname = Keyboard.getKeyName(Minecraft.getMinecraft().gameSettings.keyBindSneak.getKeyCode()); + list.add(StatCollector.translateToLocalFormatted("info.tooltip.moreinfo", keyname.toUpperCase())); + return false; + } } } diff --git a/src/main/java/minefantasy/mf2/item/FuelHandlerMF.java b/src/main/java/minefantasy/mf2/item/FuelHandlerMF.java index 75d7743c..03a1c07f 100644 --- a/src/main/java/minefantasy/mf2/item/FuelHandlerMF.java +++ b/src/main/java/minefantasy/mf2/item/FuelHandlerMF.java @@ -1,30 +1,24 @@ package minefantasy.mf2.item; +import cpw.mods.fml.common.IFuelHandler; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.item.list.ComponentListMF; import net.minecraft.item.ItemStack; -import cpw.mods.fml.common.IFuelHandler; -public class FuelHandlerMF implements IFuelHandler -{ +public class FuelHandlerMF implements IFuelHandler { @Override - public int getBurnTime(ItemStack fuel) - { - if(fuel.getItem() == null) - { + public int getBurnTime(ItemStack fuel) { + if (fuel.getItem() == null) { return 0; } - if(fuel.getItem() == ComponentListMF.plank) - { - return (int)(200 * CustomToolHelper.getBurnModifier(fuel)); + if (fuel.getItem() == ComponentListMF.plank) { + return (int) (200 * CustomToolHelper.getBurnModifier(fuel)); } - if(fuel.getItem() == ComponentListMF.coalDust) - { + if (fuel.getItem() == ComponentListMF.coalDust) { return 400; } - if(fuel.getItem() == ComponentListMF.coke) - { + if (fuel.getItem() == ComponentListMF.coke) { return 2400; } return 0; diff --git a/src/main/java/minefantasy/mf2/item/ItemArtefact.java b/src/main/java/minefantasy/mf2/item/ItemArtefact.java index 5e7f4ca3..e212c785 100644 --- a/src/main/java/minefantasy/mf2/item/ItemArtefact.java +++ b/src/main/java/minefantasy/mf2/item/ItemArtefact.java @@ -23,145 +23,126 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -public class ItemArtefact extends Item implements IArtefact -{ +public class ItemArtefact extends Item implements IArtefact { public static final String MYTHIC = "mythic_artefacts"; public static final String DWARVEN = "dwarven_artefacts"; public static final String GNOMISH = "gnomish_artefacts"; - - private static final Artefact[] types = new Artefact[] - { - new Artefact("ancient_jewel", "mithril_jewel", 20, 2, MYTHIC, 2, "smeltMithril", "smeltMaster"), - new Artefact("ancient_jewel", "adamant_jewel", 20, 2, MYTHIC, 2, "smeltAdamantium", "smeltMaster"), - new Artefact("ancient_jewel", "master_jewel", 30, 2, MYTHIC, 1, "smeltMaster"), - new Artefact("trilogy_jewel", "trilogy_jewel", 3, null, 1), - new Artefact("schem_bomb", "schem_bomb", 50, 2, null, 1, "bombObsidian", "mineObsidian"), - new Artefact("schem_crossbow", "schem_crossbow", 50, 2, null, 1, "crossShaftAdvanced", "crossHeadAdvanced"), - new Artefact("schem_forge", "schem_forge", 50, 2, null, 1 , "advforge", "advcrucible"), - new Artefact("schem_gears", "schem_gears", 50, 2, null, 1, "cogArmour"), - new Artefact("schem_cogwork", "schem_cogwork", 50, 2, null, 1 , "cogArmour"), - new Artefact("schem_alloy", "schem_alloy", 50, 2, null, 1 , "compPlate"), - }; - + + private static final Artefact[] types = new Artefact[] { + new Artefact("ancient_jewel", "mithril_jewel", 20, 2, MYTHIC, 2, "smeltMithril", "smeltMaster"), + new Artefact("ancient_jewel", "adamant_jewel", 20, 2, MYTHIC, 2, "smeltAdamantium", "smeltMaster"), + new Artefact("ancient_jewel", "master_jewel", 30, 2, MYTHIC, 1, "smeltMaster"), + new Artefact("trilogy_jewel", "trilogy_jewel", 3, null, 1), + new Artefact("schem_bomb", "schem_bomb", 50, 2, null, 1, "bombObsidian", "mineObsidian"), + new Artefact("schem_crossbow", "schem_crossbow", 50, 2, null, 1, "crossShaftAdvanced", "crossHeadAdvanced"), + new Artefact("schem_forge", "schem_forge", 50, 2, null, 1, "advforge", "advcrucible"), + new Artefact("schem_gears", "schem_gears", 50, 2, null, 1, "cogArmour"), + new Artefact("schem_cogwork", "schem_cogwork", 50, 2, null, 1, "cogArmour"), + new Artefact("schem_alloy", "schem_alloy", 50, 2, null, 1, "compPlate"), }; + @SideOnly(Side.CLIENT) private static IIcon[] icons; - public ItemArtefact(String name) - { + + public ItemArtefact(String name) { this(name, 2); } - public ItemArtefact(String name, int rarity) - { + public ItemArtefact(String name, int rarity) { this.setCreativeTab(CreativeTabMF.tabMaterialsMF); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setHasSubtypes(true); } + @Override @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int dam) - { - return icons[Math.min(dam, icons.length-1)]; + public IIcon getIconFromDamage(int dam) { + return icons[Math.min(dam, icons.length - 1)]; } + @Override @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { + public void registerIcons(IIconRegister reg) { icons = new IIcon[types.length]; - for(int i = 0; i < types.length; ++i) - { - icons[i] = reg.registerIcon("minefantasy2:artefact/"+types[i].tex); + for (int i = 0; i < types.length; ++i) { + icons[i] = reg.registerIcon("minefantasy2:artefact/" + types[i].tex); } } + @Override - public String getUnlocalizedName(ItemStack item) - { - return "item."+getArtefact(item).name; + public String getUnlocalizedName(ItemStack item) { + return "item." + getArtefact(item).name; } - private Artefact getArtefact(ItemStack item) - { - return types[Math.min(item.getItemDamage(), types.length-1)]; + + private Artefact getArtefact(ItemStack item) { + return types[Math.min(item.getItemDamage(), types.length - 1)]; } - + @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs tab, List list) - { - for(int i = 0; i < types.length; i ++) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i < types.length; i++) { list.add(new ItemStack(item, 1, i)); } - } + } + @Override - public EnumRarity getRarity(ItemStack item) - { - int lvl = getArtefact(item).rarity+1; - - if(item.isItemEnchanted()) - { - if(lvl == 0) - { + public EnumRarity getRarity(ItemStack item) { + int lvl = getArtefact(item).rarity + 1; + + if (item.isItemEnchanted()) { + if (lvl == 0) { lvl++; } - lvl ++; + lvl++; } - if(lvl >= ToolListMF.rarity.length) - { - lvl = ToolListMF.rarity.length-1; + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; } return ToolListMF.rarity[lvl]; } - - public void registerAll() - { - for(int id = 0; id < types.length; id++) - { + + public void registerAll() { + for (int id = 0; id < types.length; id++) { types[id].register(this, id); } } @Override - public int getStudyTime(ItemStack item) - { + public int getStudyTime(ItemStack item) { return getArtefact(item).time; } - + @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { int meta = item.getItemDamage(); - if(!world.isRemote && meta > 3) - { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); - - if (movingobjectposition == null) - { - return item; - } - else - { - if(BlockSchematic.useSchematic(item, world, user, movingobjectposition)) - { - item.stackSize --; - return item; - } - } + if (!world.isRemote && meta > 3) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); + + if (movingobjectposition == null) { + return item; + } else { + if (BlockSchematic.useSchematic(item, world, user, movingobjectposition)) { + item.stackSize--; + return item; + } + } } return item; - } + } } -class Artefact -{ + +class Artefact { public final String name, tex; public final int rarity, time; public final String[] researches; public final String lootType; public final int dropWeight; - Artefact(String name, String tex, int rarity, String lootType, int dropChance) - { + + Artefact(String name, String tex, int rarity, String lootType, int dropChance) { this(name, tex, 0, rarity, lootType, dropChance); } - Artefact(String name, String tex, int time, int rarity, String lootType, int dropChance, String...researches) - { + + Artefact(String name, String tex, int time, int rarity, String lootType, int dropChance, String... researches) { this.name = name; this.time = time; this.tex = tex; @@ -170,18 +151,16 @@ class Artefact this.lootType = lootType; this.dropWeight = dropChance; } - public void register(Item item, int id) - { - if(researches != null) - { - for(String research : this.researches) - { + + public void register(Item item, int id) { + if (researches != null) { + for (String research : this.researches) { ResearchArtefacts.addArtefact(new ItemStack(item, 1, id), research.toLowerCase()); } } - if(lootType != null) - { - ChestGenHooks.addItem(lootType, new WeightedRandomChestContent(new ItemStack(item, 1, id), 1, 1, dropWeight)); + if (lootType != null) { + ChestGenHooks.addItem(lootType, + new WeightedRandomChestContent(new ItemStack(item, 1, id), 1, 1, dropWeight)); } } } diff --git a/src/main/java/minefantasy/mf2/item/ItemBandage.java b/src/main/java/minefantasy/mf2/item/ItemBandage.java index f6325209..607be2b6 100644 --- a/src/main/java/minefantasy/mf2/item/ItemBandage.java +++ b/src/main/java/minefantasy/mf2/item/ItemBandage.java @@ -1,5 +1,6 @@ package minefantasy.mf2.item; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.item.list.CreativeTabMF; @@ -12,176 +13,155 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -public class ItemBandage extends Item -{ - private String name; - private float healPwr; +public class ItemBandage extends Item { + private String name; + private float healPwr; private float secondsToUse = 5F; - public ItemBandage(String id, float healAmount) - { - super(); - name = id; - healPwr = healAmount; - setMaxStackSize(16); - setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/"+name); - GameRegistry.registerItem(this, "MF_Aid_"+name, MineFantasyII.MODID); + public ItemBandage(String id, float healAmount) { + super(); + name = id; + healPwr = healAmount; + setMaxStackSize(16); + setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/" + name); + GameRegistry.registerItem(this, "MF_Aid_" + name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } - - @Override - public EnumRarity getRarity(ItemStack item) - { - if(healPwr <= 5) - { - return ToolListMF.poor; - } - return super.getRarity(item); } - /** - * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer - */ - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(!user.isSneaking() && canHeal(user) && user.hurtResistantTime <= 0) - { - int time = this.getMaxItemUseDuration(item); - if(ResearchLogic.hasInfoUnlocked(user, "firstaid")) - { - time /= 3; - } - user.setItemInUse(item, time); - } - return item; - } - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack item) - { - return EnumAction.block; - } - @Override - public int getMaxItemUseDuration(ItemStack item) - { - return (int)(20F*secondsToUse); - } - @Override - public ItemStack onEaten(ItemStack item, World world, EntityPlayer player) - { - return heal(player, player, item); - } - - @Override - public void onUsingTick(ItemStack stack, EntityPlayer player, int count) - { - super.onUsingTick(stack, player, count); - - if(!canHeal(player) && !player.worldObj.isRemote) - { - player.stopUsingItem(); - } - if(count % 5 == 0) - { - player.playSound("dig.cloth", 1F, 0.005F); - } - player.swingItem(); - } - - @Override - public boolean itemInteractionForEntity(ItemStack itemstack, EntityPlayer player, EntityLivingBase entity) - { - if(player.isSneaking() && isReadyToHeal(player, entity)) - { - heal(player, entity, itemstack); - return true; - } - return super.itemInteractionForEntity(itemstack, player, entity); - } - private ItemStack heal(EntityPlayer player, EntityLivingBase toHeal, ItemStack item) - { - if(player.worldObj.isRemote) - { + + @Override + public EnumRarity getRarity(ItemStack item) { + if (healPwr <= 5) { + return ToolListMF.poor; + } + return super.getRarity(item); + } + + /** + * Called whenever this item is equipped and the right mouse button is pressed. + * Args: itemStack, world, entityPlayer + */ + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!user.isSneaking() && canHeal(user) && user.hurtResistantTime <= 0) { + int time = this.getMaxItemUseDuration(item); + if (ResearchLogic.hasInfoUnlocked(user, "firstaid")) { + time /= 3; + } + user.setItemInUse(item, time); + } + return item; + } + + /** + * returns the action that specifies what animation to play when the items is + * being used + */ + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.block; + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + return (int) (20F * secondsToUse); + } + + @Override + public ItemStack onEaten(ItemStack item, World world, EntityPlayer player) { + return heal(player, player, item); + } + + @Override + public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { + super.onUsingTick(stack, player, count); + + if (!canHeal(player) && !player.worldObj.isRemote) { + player.stopUsingItem(); + } + if (count % 5 == 0) { + player.playSound("dig.cloth", 1F, 0.005F); + } + player.swingItem(); + } + + @Override + public boolean itemInteractionForEntity(ItemStack itemstack, EntityPlayer player, EntityLivingBase entity) { + if (player.isSneaking() && isReadyToHeal(player, entity)) { + heal(player, entity, itemstack); + return true; + } + return super.itemInteractionForEntity(itemstack, player, entity); + } + + private ItemStack heal(EntityPlayer player, EntityLivingBase toHeal, ItemStack item) { + if (player.worldObj.isRemote) { return item; } - - if(toHeal != null) - { - if(canHeal(toHeal)) - { - toHeal.worldObj.playSoundEffect(toHeal.posX, toHeal.posY, toHeal.posZ, "dig.cloth", 1.0F, 3.0F); - player.swingItem(); - - if(!player.worldObj.isRemote) - { - float power = healPwr; - if(ResearchLogic.hasInfoUnlocked(player, "doctor")) - { - power *= 1.5F; - } - toHeal.heal(power); - - if(!player.capabilities.isCreativeMode) - { - item.stackSize --; - if(item.stackSize <= 0) - { - - } - } - } - toHeal.getEntityData().setInteger(EventManagerMF.injuredNBT, 0); - } - } - return item; + + if (toHeal != null) { + if (canHeal(toHeal)) { + toHeal.worldObj.playSoundEffect(toHeal.posX, toHeal.posY, toHeal.posZ, "dig.cloth", 1.0F, 3.0F); + player.swingItem(); + + if (!player.worldObj.isRemote) { + float power = healPwr; + if (ResearchLogic.hasInfoUnlocked(player, "doctor")) { + power *= 1.5F; + } + toHeal.heal(power); + + if (!player.capabilities.isCreativeMode) { + item.stackSize--; + if (item.stackSize <= 0) { + + } + } + } + toHeal.getEntityData().setInteger(EventManagerMF.injuredNBT, 0); + } + } + return item; } - private boolean canHeal(EntityLivingBase toHeal) - { - return toHeal.hurtResistantTime <= 0 && (toHeal.getHealth() <= (toHeal.getMaxHealth()-1F) || EventManagerMF.getInjuredTime(toHeal) > 0) && !toHeal.isBurning(); + private boolean canHeal(EntityLivingBase toHeal) { + return toHeal.hurtResistantTime <= 0 + && (toHeal.getHealth() <= (toHeal.getMaxHealth() - 1F) || EventManagerMF.getInjuredTime(toHeal) > 0) + && !toHeal.isBurning(); } - - public boolean isReadyToHeal(EntityPlayer player, EntityLivingBase patient) - { + + public boolean isReadyToHeal(EntityPlayer player, EntityLivingBase patient) { int time = getUserHealTime(patient) + 1; - if(ResearchLogic.hasInfoUnlocked(player, "firstaid")) - { + if (ResearchLogic.hasInfoUnlocked(player, "firstaid")) { time += 3; } patient.playSound("dig.cloth", 1F, 0.005F); player.swingItem(); - - if(time >= (int)(4*secondsToUse)) - { + + if (time >= (int) (4 * secondsToUse)) { setUserHealTime(patient, 0); return true; } - + setUserHealTime(patient, time); return false; } - public void setUserHealTime(EntityLivingBase user, int value) - { - if(user.getEntityData() != null) - { + + public void setUserHealTime(EntityLivingBase user, int value) { + if (user.getEntityData() != null) { user.getEntityData().setInteger(healingID, value); } } - public int getUserHealTime(EntityLivingBase user) - { - if(user.getEntityData() != null) - { - if(user.getEntityData().hasKey(healingID)) - { + + public int getUserHealTime(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (user.getEntityData().hasKey(healingID)) { return user.getEntityData().getInteger(healingID); } } return 0; } + private static final String healingID = "MF_Bandage_progress"; } diff --git a/src/main/java/minefantasy/mf2/item/ItemBurntFood.java b/src/main/java/minefantasy/mf2/item/ItemBurntFood.java index 7e021b99..69718f10 100644 --- a/src/main/java/minefantasy/mf2/item/ItemBurntFood.java +++ b/src/main/java/minefantasy/mf2/item/ItemBurntFood.java @@ -8,36 +8,32 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class ItemBurntFood extends ItemComponentMF -{ +public class ItemBurntFood extends ItemComponentMF { - public ItemBurntFood(String name) - { + public ItemBurntFood(String name) { super(name, -1); - setTextureName("minefantasy2:food/"+name); + setTextureName("minefantasy2:food/" + name); } + private Random rand = new Random(); + @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) - { - if(this == FoodListMF.burnt_food) - { - if(!world.isRemote && rand.nextInt(5) == 0) - { + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + if (this == FoodListMF.burnt_food) { + if (!world.isRemote && rand.nextInt(5) == 0) { player.entityDropItem(new ItemStack(Items.coal, 1, 1), 0.0F); } --item.stackSize; return item; } - if(!world.isRemote) - { + if (!world.isRemote) { player.entityDropItem(new ItemStack(FoodListMF.burnt_food, item.stackSize), 0.0F); } return item.getItem().getContainerItem(item); } + @Override - public ItemStack getContainerItem(ItemStack itemStack) - { - return new ItemStack(getContainerItem(), itemStack.stackSize); - } + public ItemStack getContainerItem(ItemStack itemStack) { + return new ItemStack(getContainerItem(), itemStack.stackSize); + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemComponentMF.java b/src/main/java/minefantasy/mf2/item/ItemComponentMF.java index 17983e5d..8126bb3f 100644 --- a/src/main/java/minefantasy/mf2/item/ItemComponentMF.java +++ b/src/main/java/minefantasy/mf2/item/ItemComponentMF.java @@ -24,100 +24,79 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; + /** * @author Anonymous Productions */ -public class ItemComponentMF extends Item implements ITieredComponent -{ +public class ItemComponentMF extends Item implements ITieredComponent { protected String name; - public ItemComponentMF(int rarity) - { + + public ItemComponentMF(int rarity) { itemRarity = rarity; } - public ItemComponentMF(String name) - { + + public ItemComponentMF(String name) { this(name, 0); } - public ItemComponentMF(String name, int rarity) - { + + public ItemComponentMF(String name, int rarity) { itemRarity = rarity; this.name = name; - setTextureName("minefantasy2:component/"+name); + setTextureName("minefantasy2:component/" + name); this.setCreativeTab(CreativeTabMF.tabMaterialsMF); - GameRegistry.registerItem(this, "MF_Com_"+name, MineFantasyII.MODID); - - - + GameRegistry.registerItem(this, "MF_Com_" + name, MineFantasyII.MODID); + this.setUnlocalizedName(name); } - - /*private int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - int lvl = itemRarity+1; - - if(item.isItemEnchanted()) - { - if(lvl == 0) - { - lvl++; - } - lvl ++; - } - if(lvl >= ToolListMF.rarity.length) - { - lvl = ToolListMF.rarity.length-1; + + /* + * private int itemRarity; + * + * @Override public EnumRarity getRarity(ItemStack item) { int lvl = + * itemRarity+1; + * + * if(item.isItemEnchanted()) { if(lvl == 0) { lvl++; } lvl ++; } if(lvl >= + * ToolListMF.rarity.length) { lvl = ToolListMF.rarity.length-1; } return + * ToolListMF.rarity[lvl]; } + */ + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (this.getCreativeTab() != CreativeTabMF.tabMaterialsMF) { + super.getSubItems(item, tab, list); + return; } - return ToolListMF.rarity[lvl]; - }*/ - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(this.getCreativeTab() != CreativeTabMF.tabMaterialsMF) - { - super.getSubItems(item, tab, list); - return; - } - - if(this != ComponentListMF.plank) - { + + if (this != ComponentListMF.plank) { return; } - - for(Item ingot: ComponentListMF.ingots) - { - if(ingot == ComponentListMF.ingots[3]) - { + + for (Item ingot : ComponentListMF.ingots) { + if (ingot == ComponentListMF.ingots[3]) { add(list, Items.iron_ingot); } - if(ingot == ComponentListMF.ingots[7]) - { + if (ingot == ComponentListMF.ingots[7]) { add(list, Items.gold_ingot); } add(list, ingot); } - - if(isCustom) - { - ArrayList wood = CustomMaterial.getList("wood"); - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorWood = wood.iterator(); - while(iteratorWood.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - list.add( this.construct(customMat.name) ); - list.add( ((ItemComponentMF)ComponentListMF.plank_pane).construct(customMat.name) ); - } - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - list.add( ComponentListMF.bar(customMat.name) ); - } - } - + + if (isCustom) { + ArrayList wood = CustomMaterial.getList("wood"); + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorWood = wood.iterator(); + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + list.add(this.construct(customMat.name)); + list.add(((ItemComponentMF) ComponentListMF.plank_pane).construct(customMat.name)); + } + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + list.add(ComponentListMF.bar(customMat.name)); + } + } + add(list, ComponentListMF.nail); add(list, ComponentListMF.rivet); add(list, ComponentListMF.thread); @@ -125,7 +104,7 @@ public void getSubItems(Item item, CreativeTabs tab, List list) add(list, ComponentListMF.clay_pot); add(list, ComponentListMF.ingot_mould_uncooked); add(list, ComponentListMF.ingot_mould); - + add(list, ComponentListMF.leather_strip); add(list, ComponentListMF.rawhideSmall); add(list, ComponentListMF.rawhideMedium); @@ -133,14 +112,14 @@ public void getSubItems(Item item, CreativeTabs tab, List list) add(list, ComponentListMF.hideSmall); add(list, ComponentListMF.hideMedium); add(list, ComponentListMF.hideLarge); - + add(list, ComponentListMF.oreCopper); add(list, ComponentListMF.oreTin); add(list, ComponentListMF.oreIron); add(list, ComponentListMF.oreSilver); add(list, ComponentListMF.oreGold); add(list, ComponentListMF.oreTungsten); - + add(list, ComponentListMF.flux); add(list, ComponentListMF.flux_strong); add(list, ComponentListMF.flux_pot); @@ -149,7 +128,7 @@ public void getSubItems(Item item, CreativeTabs tab, List list) add(list, ComponentListMF.diamond_shards); add(list, ComponentListMF.fletching); add(list, ComponentListMF.plant_oil); - + add(list, ComponentListMF.coalDust); add(list, ComponentListMF.iron_prep); add(list, ComponentListMF.obsidian_rock); @@ -173,7 +152,7 @@ public void getSubItems(Item item, CreativeTabs tab, List list) add(list, ComponentListMF.mine_casing_crystal); add(list, ComponentListMF.bomb_casing_arrow); add(list, ComponentListMF.bomb_casing_bolt); - + add(list, ComponentListMF.clay_brick); add(list, ComponentListMF.kaolinite); add(list, ComponentListMF.kaolinite_dust); @@ -182,10 +161,10 @@ public void getSubItems(Item item, CreativeTabs tab, List list) add(list, ComponentListMF.strong_brick); add(list, ComponentListMF.dragon_heart); add(list, ComponentListMF.ornate_items); - + add(list, ComponentListMF.talisman_lesser); add(list, ComponentListMF.talisman_greater); - + add(list, ComponentListMF.bolt); add(list, ComponentListMF.iron_frame); add(list, ComponentListMF.iron_strut); @@ -194,164 +173,155 @@ public void getSubItems(Item item, CreativeTabs tab, List list) add(list, ComponentListMF.tungsten_gears); add(list, ComponentListMF.cogwork_shaft); add(list, ComponentListMF.ingotCompositeAlloy); - + add(list, ComponentListMF.crossbow_handle_wood); add(list, ComponentListMF.crossbow_stock_wood); add(list, ComponentListMF.crossbow_stock_iron); - + add(list, ComponentListMF.cross_arms_basic); add(list, ComponentListMF.cross_arms_light); add(list, ComponentListMF.cross_arms_heavy); add(list, ComponentListMF.cross_arms_advanced); - + add(list, ComponentListMF.cross_ammo); add(list, ComponentListMF.cross_scope); add(list, ComponentListMF.cross_bayonet); - + add(list, ComponentListMF.copper_coin); add(list, ComponentListMF.silver_coin); add(list, ComponentListMF.gold_coin); - } - private void add(List list, Item item) - { - list.add(new ItemStack(item)); - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - - super.addInformation(item, user, list, extra); - if(isCustom) - { - CustomToolHelper.addComponentString(item, list,CustomMaterial.getMaterialFor(item,CustomToolHelper.slot_main), this.unitCount); - } - } - - //===================================================== CUSTOM START =============================================================\\ + } + + private void add(List list, Item item) { + list.add(new ItemStack(item)); + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + + super.addInformation(item, user, list, extra); + if (isCustom) { + CustomToolHelper.addComponentString(item, list, + CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main), this.unitCount); + } + } + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; private float unitCount = 1; - public ItemComponentMF setCustom(float units, String type) - { + + public ItemComponentMF setCustom(float units, String type) { canRepair = false; this.unitCount = units; - setTextureName("minefantasy2:custom/component/"+name); + setTextureName("minefantasy2:custom/component/" + name); isCustom = true; this.setHasSubtypes(true); this.materialType = type; return this; } - - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } + private IIcon componentTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - componentTex = reg.registerIcon(this.getIconString()); - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom ) - { - return componentTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - ////Probably not the cleanest way to do this, but I decided to because for this item, - /// the color will always be only one layer from only one material - - public int getColorFromItemStack(ItemStack item, int layer) - { - //return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - if(isCustom) - { - CustomMaterial mat = CustomMaterial.getMaterialFor(item,CustomToolHelper.slot_main); - if(mat != null) - return mat.getColourInt(); - } - return super.getColorFromItemStack(item, layer); - } - + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + componentTex = reg.registerIcon(this.getIconString()); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom) { + return componentTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + //// Probably not the cleanest way to do this, but I decided to because for this + //// item, + /// the color will always be only one layer from only one material + + public int getColorFromItemStack(ItemStack item, int layer) { + // return CustomToolHelper.getColourFromItemStack(item, layer, + // super.getColorFromItemStack(item, layer)); + if (isCustom) { + CustomMaterial mat = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); + if (mat != null) + return mat.getColourInt(); + } + return super.getColorFromItemStack(item, layer); + } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); } - - public ItemStack construct(String main) - { - return construct(main, 1); + + public ItemStack construct(String main) { + return construct(main, 1); } - public ItemStack construct(String main, int stacksize) - { + + public ItemStack construct(String main, int stacksize) { return CustomToolHelper.constructSingleColoredLayer(this, main, stacksize); } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - if(isCustom){ - return CustomToolHelper.getLocalisedName(item, "item.commodity_"+name+".name"); - } - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - private String materialType = null; - @Override - public String getMaterialType(ItemStack item) - { + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + if (isCustom) { + return CustomToolHelper.getLocalisedName(item, "item.commodity_" + name + ".name"); + } + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + private String materialType = null; + + @Override + public String getMaterialType(ItemStack item) { return isCustom ? materialType : null; } - //====================================================== CUSTOM END ==============================================================\\ - - //STORAGE - protected String blocktex; - protected String storageType; - - public ItemComponentMF setStoragePlacement(String type, String tex) - { - this.blocktex = tex; - this.storageType = type; - return this; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if (!world.isRemote && storageType != null) - { + // ====================================================== CUSTOM END + // ==============================================================\\ + + // STORAGE + protected String blocktex; + protected String storageType; + + public ItemComponentMF setStoragePlacement(String type, String tex) { + this.blocktex = tex; + this.storageType = type; + return this; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote && storageType != null) { MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); - if (movingobjectposition == null) - { + if (movingobjectposition == null) { return item; - } else - { - int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, movingobjectposition); - if (placed > 0) - { + } else { + int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, + movingobjectposition); + if (placed > 0) { item.stackSize -= placed; return item; } diff --git a/src/main/java/minefantasy/mf2/item/ItemFilledMould.java b/src/main/java/minefantasy/mf2/item/ItemFilledMould.java index 258e477a..9cbb768c 100644 --- a/src/main/java/minefantasy/mf2/item/ItemFilledMould.java +++ b/src/main/java/minefantasy/mf2/item/ItemFilledMould.java @@ -4,7 +4,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.heating.Heatable; import minefantasy.mf2.api.heating.TongsHelper; import minefantasy.mf2.item.list.ComponentListMF; import net.minecraft.entity.item.EntityItem; @@ -12,21 +11,19 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class ItemFilledMould extends ItemComponentMF -{ +public class ItemFilledMould extends ItemComponentMF { - public ItemFilledMould() - { + public ItemFilledMould() { super("ingot_mould_filled"); - //setMaxStackSize(1); + // setMaxStackSize(1); this.setUnlocalizedName("ingot_mould"); } + private static final String itemNBT = "MF_HeldItem"; - public static ItemStack createMould(ItemStack fill) - { + + public static ItemStack createMould(ItemStack fill) { ItemStack mould = new ItemStack(ComponentListMF.ingot_mould_filled); NBTTagCompound nbt = getOrCreateNBT(mould); NBTTagCompound save = new NBTTagCompound(); @@ -34,37 +31,33 @@ public static ItemStack createMould(ItemStack fill) nbt.setTag(itemNBT, save); return mould; } - public ItemStack getHeldItem(ItemStack item) - { + + public ItemStack getHeldItem(ItemStack item) { NBTTagCompound nbt = getOrCreateNBT(item); - if(nbt.hasKey(itemNBT)) - { + if (nbt.hasKey(itemNBT)) { return ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(itemNBT)); } return null; } - public static NBTTagCompound getOrCreateNBT(ItemStack item) - { - if(!item.hasTagCompound()) - { + + public static NBTTagCompound getOrCreateNBT(ItemStack item) { + if (!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } return item.getTagCompound(); } + @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { ItemStack held = getHeldItem(item); - if(held != null) - { + if (held != null) { list.add(held.getDisplayName()); } } - + @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) - { + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); if (movingobjectposition == null) { @@ -85,26 +78,21 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer play float water = TongsHelper.getWaterSource(world, i, j, k); ItemStack drop = getHeldItem(item); - - if (drop != null && water >= 0) - { + + if (drop != null && water >= 0) { player.playSound("random.splash", 1F, 1F); player.playSound("random.fizz", 2F, 0.5F); for (int a = 0; a < 5; a++) { world.spawnParticle("largesmoke", i + 0.5F, j + 1, k + 0.5F, 0, 0.065F, 0); } - - if (!world.isRemote) - { + + if (!world.isRemote) { ItemStack mould = new ItemStack(ComponentListMF.ingot_mould); - if(!world.getBlock(i, j+1, k).getMaterial().isSolid()) - { - dropItem(world, i, j+1, k, drop); - dropItem(world, i, j+1, k, mould); - } - else - { + if (!world.getBlock(i, j + 1, k).getMaterial().isSolid()) { + dropItem(world, i, j + 1, k, drop); + dropItem(world, i, j + 1, k, mould); + } else { dropItem(world, player.posX, player.posY, player.posZ, drop, false); dropItem(world, player.posX, player.posY, player.posZ, mould, false); } @@ -117,15 +105,15 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer play return item; } } - private void dropItem(World world, int i, int j, int k, ItemStack drop) - { - dropItem(world, i+0.5, j+0.5, k+0.5, drop, true); + + private void dropItem(World world, int i, int j, int k, ItemStack drop) { + dropItem(world, i + 0.5, j + 0.5, k + 0.5, drop, true); } - private void dropItem(World world, double i, double j, double k, ItemStack drop, boolean delay) - { + + private void dropItem(World world, double i, double j, double k, ItemStack drop, boolean delay) { EntityItem entity = new EntityItem(world, i, j, k, drop); - if(delay) - entity.delayBeforeCanPickup = 20; + if (delay) + entity.delayBeforeCanPickup = 20; entity.motionX = entity.motionY = entity.motionZ = 0F; world.spawnEntityInWorld(entity); } diff --git a/src/main/java/minefantasy/mf2/item/ItemHide.java b/src/main/java/minefantasy/mf2/item/ItemHide.java index b376fa83..93f2d09f 100644 --- a/src/main/java/minefantasy/mf2/item/ItemHide.java +++ b/src/main/java/minefantasy/mf2/item/ItemHide.java @@ -7,100 +7,85 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -public class ItemHide extends ItemComponentMF -{ +public class ItemHide extends ItemComponentMF { private final Item result; private float hardness; - public ItemHide(String name, Item result, float hardness) - { + + public ItemHide(String name, Item result, float hardness) { super(name, -1); this.result = result; this.hardness = hardness; } @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) - { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + + if (movingobjectposition == null) { + return item; + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) { + return item; + } - if (movingobjectposition == null) - { - return item; - } - else - { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return item; + } - if (!world.canMineBlock(player, i, j, k)) - { - return item; - } + if (isWaterSource(world, i, j, k)) { + tryClean(item, world, player); + } + } - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) - { - return item; - } + return item; + } + } - if (isWaterSource(world, i, j, k)) - { - tryClean(item, world, player); - } - } + private Random rand = new Random(); - return item; - } - } - - private Random rand = new Random(); - private void tryClean(ItemStack item, World world, EntityPlayer player) - { - player.swingItem(); - if (!world.isRemote) - { - world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat()/4F, 0.5F + rand.nextFloat()); - if (rand.nextFloat()*2*hardness < 1.0F) - { - item.stackSize--; - EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, new ItemStack(result)); - world.spawnEntityInWorld(resultItem); - } - } + private void tryClean(ItemStack item, World world, EntityPlayer player) { + player.swingItem(); + if (!world.isRemote) { + world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, 0.5F + rand.nextFloat()); + if (rand.nextFloat() * 2 * hardness < 1.0F) { + item.stackSize--; + EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, + new ItemStack(result)); + world.spawnEntityInWorld(resultItem); + } + } } - - private boolean isWaterSource(World world, int i, int j, int k) { - if(world.getBlock(i, j, k).getMaterial() == Material.water) - { + + private boolean isWaterSource(World world, int i, int j, int k) { + if (world.getBlock(i, j, k).getMaterial() == Material.water) { return true; } - if(isCauldron(world, i, j, k)) - { + if (isCauldron(world, i, j, k)) { return true; } - if(isTrough(world, i, j, k)) - { + if (isTrough(world, i, j, k)) { return true; } return false; } - - public boolean isTrough(World world, int x, int y, int z) - { - TileEntity tile = world.getTileEntity(x, y, z); - return tile != null && tile instanceof IQuenchBlock; - } - public boolean isCauldron(World world, int x, int y, int z) - { - return world.getBlock(x, y, z) == Blocks.cauldron && world.getBlockMetadata(x, y, z)>0; - } + + public boolean isTrough(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + return tile != null && tile instanceof IQuenchBlock; + } + + public boolean isCauldron(World world, int x, int y, int z) { + return world.getBlock(x, y, z) == Blocks.cauldron && world.getBlockMetadata(x, y, z) > 0; + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemMFBowl.java b/src/main/java/minefantasy/mf2/item/ItemMFBowl.java index 6dc55115..d1fe47af 100644 --- a/src/main/java/minefantasy/mf2/item/ItemMFBowl.java +++ b/src/main/java/minefantasy/mf2/item/ItemMFBowl.java @@ -8,85 +8,69 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; -public class ItemMFBowl extends ItemComponentMF -{ - public ItemMFBowl(String name) - { +public class ItemMFBowl extends ItemComponentMF { + public ItemMFBowl(String name) { super(name, 0); } @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) - { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - if (movingobjectposition == null) - { - return super.onItemRightClick(item, world, player); - } - else - { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; + if (movingobjectposition == null) { + return super.onItemRightClick(item, world, player); + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; - if (!world.canMineBlock(player, i, j, k)) - { - return super.onItemRightClick(item, world, player); - } + if (!world.canMineBlock(player, i, j, k)) { + return super.onItemRightClick(item, world, player); + } - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) - { - return super.onItemRightClick(item, world, player); - } + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return super.onItemRightClick(item, world, player); + } - if (isWaterSource(world, i, j, k)) - { - gather(item, world, player); - return item; - } - } - } - return super.onItemRightClick(item, world, player); - } - - private Random rand = new Random(); - private void gather(ItemStack item, World world, EntityPlayer player) - { - player.swingItem(); - if (!world.isRemote) - { - world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat()/4F, 0.5F + rand.nextFloat()); - item.stackSize--; - EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, new ItemStack(FoodListMF.bowl_water_salt)); - world.spawnEntityInWorld(resultItem); - } + if (isWaterSource(world, i, j, k)) { + gather(item, world, player); + return item; + } + } + } + return super.onItemRightClick(item, world, player); + } + + private Random rand = new Random(); + + private void gather(ItemStack item, World world, EntityPlayer player) { + player.swingItem(); + if (!world.isRemote) { + world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, 0.5F + rand.nextFloat()); + item.stackSize--; + EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, + new ItemStack(FoodListMF.bowl_water_salt)); + world.spawnEntityInWorld(resultItem); + } } - - private boolean isWaterSource(World world, int i, int j, int k) - { - if(world.getBlock(i, j, k).getMaterial() != Material.water) - { - return false; - } - - BiomeGenBase biome = world.getBiomeGenForCoords(i, k); - if(biome == BiomeGenBase.ocean || biome == BiomeGenBase.deepOcean || biome == BiomeGenBase.beach) - { - return true; - } - MFLogUtil.logDebug("Biome = " + biome.biomeName); - if(world.getBlock(i, j-1, k) == Blocks.sand) - { + + private boolean isWaterSource(World world, int i, int j, int k) { + if (world.getBlock(i, j, k).getMaterial() != Material.water) { + return false; + } + + BiomeGenBase biome = world.getBiomeGenForCoords(i, k); + if (biome == BiomeGenBase.ocean || biome == BiomeGenBase.deepOcean || biome == BiomeGenBase.beach) { + return true; + } + MFLogUtil.logDebug("Biome = " + biome.biomeName); + if (world.getBlock(i, j - 1, k) == Blocks.sand) { return true; } return false; diff --git a/src/main/java/minefantasy/mf2/item/ItemRawOreMF.java b/src/main/java/minefantasy/mf2/item/ItemRawOreMF.java index 158e4f41..ea378b70 100644 --- a/src/main/java/minefantasy/mf2/item/ItemRawOreMF.java +++ b/src/main/java/minefantasy/mf2/item/ItemRawOreMF.java @@ -1,17 +1,15 @@ package minefantasy.mf2.item; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.item.list.CreativeTabMF; -import cpw.mods.fml.common.registry.GameRegistry; -public class ItemRawOreMF extends ItemComponentMF -{ - public ItemRawOreMF(String name, int rarity) - { +public class ItemRawOreMF extends ItemComponentMF { + public ItemRawOreMF(String name, int rarity) { super(rarity); - setTextureName("minefantasy2:oreItem/"+name); + setTextureName("minefantasy2:oreItem/" + name); this.setCreativeTab(CreativeTabMF.tabMaterialsMF); - GameRegistry.registerItem(this, "MF_Ore_"+name, MineFantasyII.MODID); + GameRegistry.registerItem(this, "MF_Ore_" + name, MineFantasyII.MODID); this.setUnlocalizedName(name); } } diff --git a/src/main/java/minefantasy/mf2/item/ItemResearchBook.java b/src/main/java/minefantasy/mf2/item/ItemResearchBook.java index e5fc7ff6..9dce0778 100644 --- a/src/main/java/minefantasy/mf2/item/ItemResearchBook.java +++ b/src/main/java/minefantasy/mf2/item/ItemResearchBook.java @@ -2,10 +2,10 @@ import java.util.List; -import org.lwjgl.input.Keyboard; - +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.api.knowledge.KnowledgeType; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.item.list.CreativeTabMF; @@ -13,50 +13,41 @@ import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class ItemResearchBook extends Item -{ - public ItemResearchBook() - { - super(); - setMaxStackSize(1); - setCreativeTab(CreativeTabMF.tabGadget); +public class ItemResearchBook extends Item { + public ItemResearchBook() { + super(); + setMaxStackSize(1); + setCreativeTab(CreativeTabMF.tabGadget); GameRegistry.registerItem(this, "MF_ResearchBook", MineFantasyII.MODID); this.setUnlocalizedName("infobook"); this.setTextureName("minefantasy2:Other/research_book"); setContainerItem(this); - } + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return EnumRarity.uncommon; + } + + /** + * Called whenever this item is equipped and the right mouse button is pressed. + * Args: itemStack, world, entityPlayer + */ + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote) { + ResearchLogic.syncData(user); + RPGElements.syncAll(user); + } + user.openGui(MineFantasyII.instance, 1, world, 0, -1, 0); + return item; + } - @Override - public EnumRarity getRarity(ItemStack item) - { - return EnumRarity.uncommon; + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); } - - /** - * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer - */ - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(!world.isRemote) - { - ResearchLogic.syncData(user); - RPGElements.syncAll(user); - } - user.openGui(MineFantasyII.instance, 1, world, 0, -1, 0); - return item; - } - - @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { - super.addInformation(item, user, list, fullInfo); - } } diff --git a/src/main/java/minefantasy/mf2/item/ItemSkillBook.java b/src/main/java/minefantasy/mf2/item/ItemSkillBook.java index 354c6e90..706e94b6 100644 --- a/src/main/java/minefantasy/mf2/item/ItemSkillBook.java +++ b/src/main/java/minefantasy/mf2/item/ItemSkillBook.java @@ -1,94 +1,73 @@ package minefantasy.mf2.item; import java.util.List; -import java.util.Random; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; - -import minefantasy.mf2.api.knowledge.InformationBase; -import minefantasy.mf2.api.knowledge.InformationList; -import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.Skill; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.ToolListMF; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class ItemSkillBook extends ItemComponentMF -{ +public class ItemSkillBook extends ItemComponentMF { private Skill skill; private String name; private boolean isMax = false; - public ItemSkillBook(String name, Skill skill) - { + + public ItemSkillBook(String name, Skill skill) { super(name, 1); setMaxStackSize(16); - setTextureName("minefantasy2:Other/"+name); + setTextureName("minefantasy2:Other/" + name); this.setCreativeTab(CreativeTabMF.tabGadget); this.skill = skill; - this.name=name; + this.name = name; } - - public Item setMax() - { + + public Item setMax() { isMax = true; return setMaxStackSize(1); } + @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { - if(isMax) - { - list.add(StatCollector.translateToLocal("item."+name+".desc")); - } - else - { - list.add(StatCollector.translateToLocalFormatted("item."+name+".desc", 1)); + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + if (isMax) { + list.add(StatCollector.translateToLocal("item." + name + ".desc")); + } else { + list.add(StatCollector.translateToLocalFormatted("item." + name + ".desc", 1)); } } - + @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { boolean used = false; - if(skill != null) - { + if (skill != null) { int lvl = RPGElements.getLevel(user, skill); - if(lvl < skill.getMaxLevel()) - { - if(isMax) - { + if (lvl < skill.getMaxLevel()) { + if (isMax) { skill.manualLvlUp(user, 100); - } - else - { + } else { skill.addXP(user, skill.getLvlXP(lvl, user)); } used = true; } } - if(used) - { + if (used) { user.worldObj.playSoundEffect(user.posX, user.posY, user.posZ, "minefantasy2:updateResearch", 1.0F, 1.0F); - if(!user.capabilities.isCreativeMode) - { + if (!user.capabilities.isCreativeMode) { --item.stackSize; } } return item; } + @Override - public EnumRarity getRarity(ItemStack item) - { - return isMax ? EnumRarity.epic : EnumRarity.uncommon; + public EnumRarity getRarity(ItemStack item) { + return isMax ? EnumRarity.epic : EnumRarity.uncommon; } } diff --git a/src/main/java/minefantasy/mf2/item/ItemSpecialDesign.java b/src/main/java/minefantasy/mf2/item/ItemSpecialDesign.java index aded5355..bda11d53 100644 --- a/src/main/java/minefantasy/mf2/item/ItemSpecialDesign.java +++ b/src/main/java/minefantasy/mf2/item/ItemSpecialDesign.java @@ -3,17 +3,16 @@ import minefantasy.mf2.api.crafting.exotic.ISpecialCraftItem; import net.minecraft.item.ItemStack; -public class ItemSpecialDesign extends ItemComponentMF implements ISpecialCraftItem -{ +public class ItemSpecialDesign extends ItemComponentMF implements ISpecialCraftItem { private String design; - public ItemSpecialDesign(String name, int rarity, String design) - { + + public ItemSpecialDesign(String name, int rarity, String design) { super(name, rarity); this.design = design; } + @Override - public String getDesign(ItemStack item) - { + public String getDesign(ItemStack item) { return this.design; } diff --git a/src/main/java/minefantasy/mf2/item/ItemWorldGenPlacer.java b/src/main/java/minefantasy/mf2/item/ItemWorldGenPlacer.java index f42d0e4d..c3c4ebbb 100644 --- a/src/main/java/minefantasy/mf2/item/ItemWorldGenPlacer.java +++ b/src/main/java/minefantasy/mf2/item/ItemWorldGenPlacer.java @@ -6,7 +6,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.mechanics.worldGen.structure.WorldGenAncientAlter; import minefantasy.mf2.mechanics.worldGen.structure.WorldGenAncientForge; import minefantasy.mf2.mechanics.worldGen.structure.WorldGenStructureBase; @@ -15,138 +14,111 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class ItemWorldGenPlacer extends Item -{ - private static final String[] types = new String[]{"AncientForge", "AncientAlter", "DwarvenStronghold"}; +public class ItemWorldGenPlacer extends Item { + private static final String[] types = new String[] { "AncientForge", "AncientAlter", "DwarvenStronghold" }; public IIcon[] icons; - - public ItemWorldGenPlacer() - { + + public ItemWorldGenPlacer() { this.setCreativeTab(CreativeTabs.tabMisc); GameRegistry.registerItem(this, "PlaceWorldGenMF", MineFantasyII.MODID); this.setHasSubtypes(true); } + @Override - public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int side, float offsetX, float offsetY, float offsetZ) - { - if (side == 0) - { - --y; - } - - if (side == 1) - { - ++y; - } - - if (side == 2) - { - --z; - } - - if (side == 3) - { - ++z; - } - - if (side == 4) - { - --x; - } - - if (side == 5) - { - ++x; - } - - if (!user.canPlayerEdit(x, y, z, side, item)) - { - return false; - } - else - { - if(!world.isRemote) - { - WorldGenStructureBase wg = getWorldGen(item.getItemDamage()); - if(wg instanceof WorldGenDwarvenStronghold) - { - WorldGenDwarvenStronghold ds = (WorldGenDwarvenStronghold)wg; - MFLogUtil.logDebug("DS: Try Cliff Build"); - if(!ds.generate(world, itemRand, x, y, z)) - { - MFLogUtil.logDebug("Failed... DS: Try Surface Build"); - ds.setSurfaceMode(true); - if(ds.generate(world, itemRand, x, y, z)) - { - MFLogUtil.logDebug("Success... DS: Placed Surface Build"); - } - else - { - MFLogUtil.logDebug("Failed... DS: No Build Placed"); - } - } - else - { - MFLogUtil.logDebug("Success... DS: Placed Cliff Build"); - } - } - else - { - wg.generate(world, itemRand, x, y, z); - } - } - return true; - } - } + public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int side, + float offsetX, float offsetY, float offsetZ) { + if (side == 0) { + --y; + } + + if (side == 1) { + ++y; + } + + if (side == 2) { + --z; + } + + if (side == 3) { + ++z; + } + + if (side == 4) { + --x; + } + + if (side == 5) { + ++x; + } + + if (!user.canPlayerEdit(x, y, z, side, item)) { + return false; + } else { + if (!world.isRemote) { + WorldGenStructureBase wg = getWorldGen(item.getItemDamage()); + if (wg instanceof WorldGenDwarvenStronghold) { + WorldGenDwarvenStronghold ds = (WorldGenDwarvenStronghold) wg; + MFLogUtil.logDebug("DS: Try Cliff Build"); + if (!ds.generate(world, itemRand, x, y, z)) { + MFLogUtil.logDebug("Failed... DS: Try Surface Build"); + ds.setSurfaceMode(true); + if (ds.generate(world, itemRand, x, y, z)) { + MFLogUtil.logDebug("Success... DS: Placed Surface Build"); + } else { + MFLogUtil.logDebug("Failed... DS: No Build Placed"); + } + } else { + MFLogUtil.logDebug("Success... DS: Placed Cliff Build"); + } + } else { + wg.generate(world, itemRand, x, y, z); + } + } + return true; + } + } + @Override - public String getItemStackDisplayName(ItemStack item) - { - int d = MathHelper.clamp_int(item.getItemDamage(), 0, types.length-1); + public String getItemStackDisplayName(ItemStack item) { + int d = MathHelper.clamp_int(item.getItemDamage(), 0, types.length - 1); return "World Gen " + types[d]; } - + @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs tab, List list) - { - for(int id = 0; id < types.length; id++) - list.add(new ItemStack(item, 1, id)); - } - - private WorldGenStructureBase getWorldGen(int meta) - { - if(meta == 1) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int id = 0; id < types.length; id++) + list.add(new ItemStack(item, 1, id)); + } + + private WorldGenStructureBase getWorldGen(int meta) { + if (meta == 1) { return new WorldGenAncientAlter(); } - if(meta == 2) - { + if (meta == 2) { return new WorldGenDwarvenStronghold(); } return new WorldGenAncientForge(); } - + @Override @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int d) - { - return icons[Math.min(icons.length-1, d)]; - } + public IIcon getIconFromDamage(int d) { + return icons[Math.min(icons.length - 1, d)]; + } + @SideOnly(Side.CLIENT) @Override - public void registerIcons(IIconRegister reg) - { + public void registerIcons(IIconRegister reg) { icons = new IIcon[types.length]; - for(int i = 0; i < types.length; i ++) - { - icons[i] = reg.registerIcon("minefantasy2:Other/generate_"+types[i]); + for (int i = 0; i < types.length; i++) { + icons[i] = reg.registerIcon("minefantasy2:Other/generate_" + types[i]); } - } + } } diff --git a/src/main/java/minefantasy/mf2/item/archery/ArrowFireFlint.java b/src/main/java/minefantasy/mf2/item/archery/ArrowFireFlint.java index 466edb72..639b00d0 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ArrowFireFlint.java +++ b/src/main/java/minefantasy/mf2/item/archery/ArrowFireFlint.java @@ -11,69 +11,58 @@ import net.minecraft.world.World; /** - * This class is an example used to fire custom arrows. + * This class is an example used to fire custom arrows. */ -public class ArrowFireFlint implements IArrowHandler -{ +public class ArrowFireFlint implements IArrowHandler { @Override - public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, boolean infinite) - { - if(infinite || arrow.getItem() != Items.arrow) - { + public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, + boolean infinite) { + if (infinite || arrow.getItem() != Items.arrow) { return false; } float maxCharge = 20F; - if(bow != null && bow.getItem() instanceof ISpecialBow) - { - maxCharge = ((ISpecialBow)bow.getItem()).getMaxCharge(); + if (bow != null && bow.getItem() instanceof ISpecialBow) { + maxCharge = ((ISpecialBow) bow.getItem()).getMaxCharge(); } float firepower = charge / maxCharge; - if (firepower < 0.1D) - { - return false; - } - if (firepower > 1.0F) - { - firepower = 1.0F; - } - - EntityArrow entArrow = new EntityArrow(world, user, firepower * 2.0F); + if (firepower < 0.1D) { + return false; + } + if (firepower > 1.0F) { + firepower = 1.0F; + } + + EntityArrow entArrow = new EntityArrow(world, user, firepower * 2.0F); + + int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); + + if (var9 > 0) { + entArrow.setDamage(entArrow.getDamage() + var9 * 0.5D + 0.5D); + } - int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); + int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); - if (var9 > 0) - { - entArrow.setDamage(entArrow.getDamage() + var9 * 0.5D + 0.5D); - } + if (var10 > 0) { + entArrow.setKnockbackStrength(var10); + } - int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); + if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) { + entArrow.setFire(100); + } - if (var10 > 0) - { - entArrow.setKnockbackStrength(var10); - } + if (infinite) { + entArrow.canBePickedUp = 2; + } - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) - { - entArrow.setFire(100); - } + if (bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) { + entArrow = (EntityArrow) ((ISpecialBow) bow.getItem()).modifyArrow(bow, entArrow); + } + if (!world.isRemote) { + world.spawnEntityInWorld(entArrow); + } - if(infinite) - { - entArrow.canBePickedUp = 2; - } - - if(bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) - { - entArrow = (EntityArrow) ((ISpecialBow)bow.getItem()).modifyArrow(bow, entArrow); - } - if (!world.isRemote) - { - world.spawnEntityInWorld(entArrow); - } - return true; } diff --git a/src/main/java/minefantasy/mf2/item/archery/ArrowFirerMF.java b/src/main/java/minefantasy/mf2/item/archery/ArrowFirerMF.java index b6a438fa..0af44234 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ArrowFirerMF.java +++ b/src/main/java/minefantasy/mf2/item/archery/ArrowFirerMF.java @@ -10,78 +10,65 @@ import net.minecraft.world.World; /** - * This class is an example used to fire custom arrows. + * This class is an example used to fire custom arrows. */ -public class ArrowFirerMF implements IArrowHandler -{ +public class ArrowFirerMF implements IArrowHandler { @Override - public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, boolean infinite) - { - if(arrow == null || !(arrow.getItem() instanceof ItemArrowMF)) - { + public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, + boolean infinite) { + if (arrow == null || !(arrow.getItem() instanceof ItemArrowMF)) { return false; } - + float maxCharge = 20F; - if(bow != null && bow.getItem() instanceof ISpecialBow) - { - //maxCharge = ((ISpecialBow)bow.getItem()).getMaxCharge(); - } - else - { + if (bow != null && bow.getItem() instanceof ISpecialBow) { + // maxCharge = ((ISpecialBow)bow.getItem()).getMaxCharge(); + } else { return false; } float firepower = charge / maxCharge * 20F; - - if (firepower < 0.1D) - { - return false; - } - if (firepower > 1.0F) - { - firepower = 1.0F; - } - - ItemArrowMF ammo = (ItemArrowMF)arrow.getItem(); + + if (firepower < 0.1D) { + return false; + } + if (firepower > 1.0F) { + firepower = 1.0F; + } + + ItemArrowMF ammo = (ItemArrowMF) arrow.getItem(); float spread = 1.0F; - if(bow != null && bow.getItem() instanceof ISpecialBow) - { - firepower *= ((ISpecialBow)bow.getItem()).getRange(bow); - spread = ((ISpecialBow)bow.getItem()).getSpread(bow); + if (bow != null && bow.getItem() instanceof ISpecialBow) { + firepower *= ((ISpecialBow) bow.getItem()).getRange(bow); + spread = ((ISpecialBow) bow.getItem()).getSpread(bow); } - - EntityArrowMF entArrow = ammo.getFiredArrow(new EntityArrowMF(world, user, spread, firepower*2.0F), arrow); - int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); - entArrow.setPower(1+(0.25F*var9)); + EntityArrowMF entArrow = ammo.getFiredArrow(new EntityArrowMF(world, user, spread, firepower * 2.0F), arrow); - int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); + int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); + entArrow.setPower(1 + (0.25F * var9)); - if (var10 > 0) - { - entArrow.setKnockbackStrength(var10); - } + int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) - { - entArrow.setFire(100); - } + if (var10 > 0) { + entArrow.setKnockbackStrength(var10); + } + + if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) { + entArrow.setFire(100); + } + + if (infinite) { + entArrow.canBePickedUp = 2; + } + + if (bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) { + entArrow = (EntityArrowMF) ((ISpecialBow) bow.getItem()).modifyArrow(bow, entArrow); + } + if (!world.isRemote) { + world.spawnEntityInWorld(entArrow); + } - if(infinite) - { - entArrow.canBePickedUp = 2; - } - - if(bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) - { - entArrow = (EntityArrowMF) ((ISpecialBow)bow.getItem()).modifyArrow(bow, entArrow); - } - if (!world.isRemote) - { - world.spawnEntityInWorld(entArrow); - } - return true; } diff --git a/src/main/java/minefantasy/mf2/item/archery/ArrowType.java b/src/main/java/minefantasy/mf2/item/archery/ArrowType.java index 455975a8..81692f04 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ArrowType.java +++ b/src/main/java/minefantasy/mf2/item/archery/ArrowType.java @@ -2,42 +2,47 @@ import java.util.HashMap; -public class ArrowType -{ - public static HashMaparrowMap = new HashMap(); +public class ArrowType { + public static HashMap arrowMap = new HashMap(); public final float weightModifier; public final float damageModifier; public final float velocity; public final String name; - public float[] ratio = new float[]{0F, 0F, 1F}; - - public static ArrowType BOLT = new ArrowType("bolt", 1.50F, 1.50F, 1.50F).setRatio(0F, 1F, 0F);//Crossbow Bolt - public static ArrowType EXPLOSIVEBOLT = new ArrowType("explosivebolt", 1.50F, 1.50F, 0.25F).setRatio(0F, 0F, 1F);//Blunt - - public static ArrowType NORMAL = new ArrowType("normal", 1.00F, 1.00F, 1.00F).setRatio(1F, 3F, 0F);//Some cut, most pierce - public static ArrowType BODKIN = new ArrowType("bodkin", 1.50F, 0.65F, 0.75F).setRatio(0F, 1F, 0F);//Pure piercing - public static ArrowType BROADHEAD = new ArrowType("broad", 0.80F, 1.20F, 1.50F).setRatio(1F, 2F, 0F);//More cutting than normal - public static ArrowType EXPLOSIVE = new ArrowType("explosive", 1.0F, 1.50F, 0.25F).setRatio(0F, 0F, 1F);//Blunt + public float[] ratio = new float[] { 0F, 0F, 1F }; - public ArrowType(String name, float velocity, float weightModifier, float damageModifier) - { + public static ArrowType BOLT = new ArrowType("bolt", 1.50F, 1.50F, 1.50F).setRatio(0F, 1F, 0F);// Crossbow Bolt + public static ArrowType EXPLOSIVEBOLT = new ArrowType("explosivebolt", 1.50F, 1.50F, 0.25F).setRatio(0F, 0F, 1F);// Blunt + + public static ArrowType NORMAL = new ArrowType("normal", 1.00F, 1.00F, 1.00F).setRatio(1F, 3F, 0F);// Some cut, most + // pierce + public static ArrowType BODKIN = new ArrowType("bodkin", 1.50F, 0.65F, 0.75F).setRatio(0F, 1F, 0F);// Pure piercing + public static ArrowType BROADHEAD = new ArrowType("broad", 0.80F, 1.20F, 1.50F).setRatio(1F, 2F, 0F);// More cutting + // than + // normal + public static ArrowType EXPLOSIVE = new ArrowType("explosive", 1.0F, 1.50F, 0.25F).setRatio(0F, 0F, 1F);// Blunt + + public ArrowType(String name, float velocity, float weightModifier, float damageModifier) { this.name = name; this.velocity = velocity; this.weightModifier = weightModifier; this.damageModifier = damageModifier; arrowMap.put(name, this); } + /** * Sets up a ratio system for damage values - * @param cutting the amount cutting damage - * @param piercing the amount piercing damage - * @param blunt the amount blunt damage + * + * @param cutting + * the amount cutting damage + * @param piercing + * the amount piercing damage + * @param blunt + * the amount blunt damage * @return */ - public ArrowType setRatio(float cutting, float piercing, float blunt) - { - ratio = new float[]{cutting, blunt, piercing}; + public ArrowType setRatio(float cutting, float piercing, float blunt) { + ratio = new float[] { cutting, blunt, piercing }; return this; } - + } diff --git a/src/main/java/minefantasy/mf2/item/archery/EnumBowType.java b/src/main/java/minefantasy/mf2/item/archery/EnumBowType.java index 113ecd1e..c76390db 100644 --- a/src/main/java/minefantasy/mf2/item/archery/EnumBowType.java +++ b/src/main/java/minefantasy/mf2/item/archery/EnumBowType.java @@ -1,7 +1,6 @@ package minefantasy.mf2.item.archery; -public enum EnumBowType -{ +public enum EnumBowType { /** * Standard bow Reinforced with metal */ @@ -10,23 +9,26 @@ public enum EnumBowType * Larger varient, more power */ LONGBOW(1.0F, 1.5F, 1.0F, 1.5F, 0.5F); - + public final float damageModifier; public final float velocity; public final float spread; public final float chargeTime; public final float durabilityModifier; - + /** - * @param dam modifes damage (1.0=normal) - * @param time is how many seconds until it reaches full charge - * @param durability modifies the durability (1.0=normal) - * @param velocity modifies the speed of the fired projectile + * @param dam + * modifes damage (1.0=normal) + * @param time + * is how many seconds until it reaches full charge + * @param durability + * modifies the durability (1.0=normal) + * @param velocity + * modifies the speed of the fired projectile */ - private EnumBowType(float dam, float time, float durability, float velocity, float spread) - { + private EnumBowType(float dam, float time, float durability, float velocity, float spread) { this.damageModifier = dam; - this.chargeTime = time*20F; + this.chargeTime = time * 20F; this.durabilityModifier = durability; this.velocity = velocity; this.spread = spread; diff --git a/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java b/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java index 4160b9c4..95eb98e5 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java +++ b/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java @@ -5,6 +5,9 @@ import java.util.Iterator; import java.util.List; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.archery.IAmmo; @@ -15,7 +18,6 @@ import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.material.BaseMaterialMF; import minefantasy.mf2.mechanics.MFArrowDispenser; -import minefantasy.mf2.util.MFLogUtil; import mods.battlegear2.api.quiver.QuiverArrowRegistry; import net.minecraft.block.BlockDispenser; import net.minecraft.client.renderer.texture.IIconRegister; @@ -28,246 +30,225 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; + /** * @author Anonymous Productions */ -public class ItemArrowMF extends Item implements IArrowMF, IAmmo -{ +public class ItemArrowMF extends Item implements IArrowMF, IAmmo { protected float damage; protected String arrowName; protected ArrowType design; private ToolMaterial arrowMat; public static final DecimalFormat decimal_format = new DecimalFormat("#.##"); public static final MFArrowDispenser dispenser = new MFArrowDispenser(); - - public ItemArrowMF(String name, ArrowType type, int stackSize) - { + + public ItemArrowMF(String name, ArrowType type, int stackSize) { this(name, 0, ToolMaterial.WOOD, type); setMaxStackSize(stackSize); } - public ItemArrowMF(String name, ArrowType type) - { + + public ItemArrowMF(String name, ArrowType type) { this(name, 0, ToolMaterial.WOOD, type); } - public ItemArrowMF(String name) - { + + public ItemArrowMF(String name) { this(name, 0, ToolMaterial.WOOD); } - public ItemArrowMF(String name, int rarity, ToolMaterial material) - { + + public ItemArrowMF(String name, int rarity, ToolMaterial material) { this(name, rarity, material, ArrowType.NORMAL); } - public ItemArrowMF(String name, int rarity, ToolMaterial material, ArrowType type) - { + + public ItemArrowMF(String name, int rarity, ToolMaterial material, ArrowType type) { name = convertName(name); material = convertMaterial(material); - - super.setUnlocalizedName((type == ArrowType.EXPLOSIVE || type == ArrowType.EXPLOSIVEBOLT) ? name : type == ArrowType.BOLT ? (name+"_bolt") : (name+"_arrow")); + + super.setUnlocalizedName((type == ArrowType.EXPLOSIVE || type == ArrowType.EXPLOSIVEBOLT) ? name + : type == ArrowType.BOLT ? (name + "_bolt") : (name + "_arrow")); name = getName(name, type); design = type; arrowName = name; arrowMat = material; - damage = (3+material.getDamageVsEntity()) * type.damageModifier; - if(type == ArrowType.EXPLOSIVE || type == ArrowType.EXPLOSIVEBOLT) - { + damage = (3 + material.getDamageVsEntity()) * type.damageModifier; + if (type == ArrowType.EXPLOSIVE || type == ArrowType.EXPLOSIVEBOLT) { damage = 1; } itemRarity = rarity; - setTextureName("minefantasy2:Ammo/"+name); + setTextureName("minefantasy2:Ammo/" + name); setCreativeTab(CreativeTabMF.tabOldTools); - GameRegistry.registerItem(this, "MF_Com_"+name, MineFantasyII.MODID); - + GameRegistry.registerItem(this, "MF_Com_" + name, MineFantasyII.MODID); + AmmoMechanicsMF.addArrow(new ItemStack(this)); QuiverArrowRegistry.addArrowToRegistry(new ItemStack(this), null); BlockDispenser.dispenseBehaviorRegistry.putObject(this, dispenser); } - private ToolMaterial convertMaterial(ToolMaterial material) - { - if(material == BaseMaterialMF.getMaterial("ornate").getToolConversion()) - { + + private ToolMaterial convertMaterial(ToolMaterial material) { + if (material == BaseMaterialMF.getMaterial("ornate").getToolConversion()) { return BaseMaterialMF.getMaterial("silver").getToolConversion(); } return material; } - private String convertName(String name) - { - if(name.equalsIgnoreCase("ornate")) - { + + private String convertName(String name) { + if (name.equalsIgnoreCase("ornate")) { return "silver"; } return name; } - - private String getName(String mat, ArrowType type) - { - if(type == ArrowType.EXPLOSIVE) - { + + private String getName(String mat, ArrowType type) { + if (type == ArrowType.EXPLOSIVE) { return "exploding_arrow"; } - if(type == ArrowType.EXPLOSIVEBOLT) - { + if (type == ArrowType.EXPLOSIVEBOLT) { return "exploding_bolt"; } - if(type.name.equalsIgnoreCase("normal")) - { - return mat +"_arrow"; + if (type.name.equalsIgnoreCase("normal")) { + return mat + "_arrow"; } - if(type.name.equalsIgnoreCase("bolt")) - { - return mat +"_bolt"; + if (type.name.equalsIgnoreCase("bolt")) { + return mat + "_bolt"; } return mat + "_arrow_" + type.name.toLowerCase(); } - public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) - { - instance.modifyVelocity(design.velocity); - return instance.setArrow(arrow).setArrowTex(arrowName); - } + public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) { + instance.modifyVelocity(design.velocity); + return instance.setArrow(arrow).setArrowTex(arrowName); + } + @Override - public void onHitEntity(Entity arrowInstance, Entity shooter, Entity hit, float damage) - { - if(arrowMat == BaseMaterialMF.getMaterial("dragonforge").getToolConversion()) - { - hit.setFire((int)(damage * (arrowInstance.isBurning() ? 2.0F : 1.0F))); + public void onHitEntity(Entity arrowInstance, Entity shooter, Entity hit, float damage) { + if (arrowMat == BaseMaterialMF.getMaterial("dragonforge").getToolConversion()) { + hit.setFire((int) (damage * (arrowInstance.isBurning() ? 2.0F : 1.0F))); } } - public ItemArrowMF setAmmoType(String type) - { + + public ItemArrowMF setAmmoType(String type) { ammoType = type; return this; } + private String ammoType = "arrow"; + @Override - public String getAmmoType(ItemStack arrow) - { + public String getAmmoType(ItemStack arrow) { return ammoType; } - - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemArrowMF setCustom(String designType) - { + + public ItemArrowMF setCustom(String designType) { canRepair = false; - setTextureName("minefantasy2:custom/ammo/"+designType+"/"+arrowName); + setTextureName("minefantasy2:custom/ammo/" + designType + "/" + arrowName); isCustom = true; return this; } - + @Override - public float getDamageModifier(ItemStack arrow) - { + public float getDamageModifier(ItemStack arrow) { return (4F + CustomToolHelper.getMeleeDamage(arrow, damage)) * design.damageModifier; } + @Override - public float getGravityModifier(ItemStack arrow) - { + public float getGravityModifier(ItemStack arrow) { float weight = 1.0F * design.weightModifier; return CustomToolHelper.getWeightModifier(arrow, weight); } - + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @SideOnly(Side.CLIENT) + private IIcon detailTex; + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass > 0 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + int c = CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + + return c; } - @SideOnly(Side.CLIENT) - private IIcon detailTex; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - } - super.registerIcons(reg); - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass > 0 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - int c = CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - - return c; - } - - public ItemStack construct(String main) - { + + public ItemStack construct(String main) { return CustomToolHelper.construct(this, main, null); } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name)); - } - } - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.arrowPower.name") + ": " + decimal_format.format(getDamageModifier(item))); - } - - @Override - public String getItemStackDisplayName(ItemStack item) - { - String name = ("" + StatCollector.translateToLocal(this.getUnlocalizedNameInefficiently(item) + ".name")).trim(); - - if(isCustom) - name = CustomToolHelper.getLocalisedName(item, name); - - if(design != ArrowType.NORMAL && design != ArrowType.EXPLOSIVE && design != ArrowType.BOLT && design != ArrowType.EXPLOSIVEBOLT) - { - name += " (" + StatCollector.translateToLocal("arrow.head."+ design.name.toLowerCase() +".name") + ")"; - } - - return name; - } - @Override - public float getBreakChance(Entity entityArrow, ItemStack arrow) - { - int maxUses = CustomToolHelper.getMaxDamage(arrow, arrowMat.getMaxUses()); - return 1F / (maxUses/150); + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name)); + } + } + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.arrowPower.name") + ": " + + decimal_format.format(getDamageModifier(item))); + } + + @Override + public String getItemStackDisplayName(ItemStack item) { + String name = ("" + StatCollector.translateToLocal(this.getUnlocalizedNameInefficiently(item) + ".name")) + .trim(); + + if (isCustom) + name = CustomToolHelper.getLocalisedName(item, name); + + if (design != ArrowType.NORMAL && design != ArrowType.EXPLOSIVE && design != ArrowType.BOLT + && design != ArrowType.EXPLOSIVEBOLT) { + name += " (" + StatCollector.translateToLocal("arrow.head." + design.name.toLowerCase() + ".name") + ")"; + } + + return name; + } + + @Override + public float getBreakChance(Entity entityArrow, ItemStack arrow) { + int maxUses = CustomToolHelper.getMaxDamage(arrow, arrowMat.getMaxUses()); + return 1F / (maxUses / 150); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //====================================================== CUSTOM END ==============================================================\\ + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java b/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java index f7d7814f..d7b25f71 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java +++ b/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java @@ -5,6 +5,9 @@ import java.util.Iterator; import java.util.List; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.archery.IAmmo; @@ -12,13 +15,8 @@ import minefantasy.mf2.api.archery.IFirearm; import minefantasy.mf2.api.archery.ISpecialBow; import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.CustomToolListMF; -import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.item.tool.ToolMaterialMF; -import minefantasy.mf2.material.BaseMaterialMF; import mods.battlegear2.api.PlayerEventChild.OffhandAttackEvent; import mods.battlegear2.api.weapons.IBattlegearWeapon; import net.minecraft.client.renderer.texture.IIconRegister; @@ -43,325 +41,282 @@ import net.minecraftforge.event.entity.player.ArrowLooseEvent; import net.minecraftforge.event.entity.player.ArrowNockEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.container.ContainerReload; -public class ItemBowMF extends ItemBow implements ISpecialBow, IDisplayMFAmmo, IBattlegearWeapon, IFirearm -{ +public class ItemBowMF extends ItemBow implements ISpecialBow, IDisplayMFAmmo, IBattlegearWeapon, IFirearm { public static final DecimalFormat decimal_format = new DecimalFormat("#.##"); private final EnumBowType model; private ToolMaterial material = ToolMaterial.WOOD; private int itemRarity; private float baseDamage = 1.0F; private String name; - - public ItemBowMF(String name, EnumBowType type) - { + + public ItemBowMF(String name, EnumBowType type) { this(name, ToolMaterial.WOOD, type, 0); - } - public ItemBowMF(String name, ToolMaterial mat, EnumBowType type, int rarity) - { - this(name, (int)(mat.getMaxUses()*type.durabilityModifier), type, mat.getDamageVsEntity(), rarity); + } + + public ItemBowMF(String name, ToolMaterial mat, EnumBowType type, int rarity) { + this(name, (int) (mat.getMaxUses() * type.durabilityModifier), type, mat.getDamageVsEntity(), rarity); material = mat; this.enchantmentLvl = mat.getEnchantability(); - } - - private ItemBowMF(String name, int dura, EnumBowType type, float damage, int rarity) - { - this.name=name; - this.baseDamage = damage; - model = type; - this.maxStackSize = 1; - this.setMaxDamage(dura); - itemRarity = rarity; - setTextureName("minefantasy2:Bow/"+name); + } + + private ItemBowMF(String name, int dura, EnumBowType type, float damage, int rarity) { + this.name = name; + this.baseDamage = damage; + model = type; + this.maxStackSize = 1; + this.setMaxDamage(dura); + itemRarity = rarity; + setTextureName("minefantasy2:Bow/" + name); this.setUnlocalizedName(name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - setCreativeTab(CreativeTabMF.tabOldTools); - } - - @Override + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + setCreativeTab(CreativeTabMF.tabOldTools); + } + + @Override @SideOnly(Side.CLIENT) - /** - * Returns True is the item is renderer in full 3D when hold. - */ - public boolean isFull3D() - { - return true; - } - - /** - * called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount - */ - @Override - public void onPlayerStoppedUsing(ItemStack item, World world, EntityPlayer player, int time) - { - int power = (this.getMaxItemUseDuration(item) - time); - - ArrowLooseEvent event = new ArrowLooseEvent(player, item, power); - MinecraftForge.EVENT_BUS.post(event); - - if (event.isCanceled()) - { - return; - } - boolean var5 = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, item) > 0; - power = event.charge; - - - if (var5 || player.inventory.hasItem(Items.arrow)) - { - float firepower = power / model.chargeTime; - - if (firepower < 0.1D) - { - return; - } - if (firepower > 1.0F) - { - firepower = 1.0F; - } - - EntityArrow var8 = new EntityArrow(world, player, firepower * 2.0F); - - if (firepower == 1.0F) - { - var8.setIsCritical(true); - } - - int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, item); - - if (var9 > 0) - { - var8.setDamage(var8.getDamage() + var9 * 0.5D + 0.5D); - } - - int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, item); - - if (var10 > 0) - { - var8.setKnockbackStrength(var10); - } - - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, item) > 0) - { - var8.setFire(100); - } - - AmmoMechanicsMF.damageContainer(item, player, 1); - world.playSoundAtEntity(player, "minefantasy2:weapon.bowFire", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + firepower * 0.5F); - - if (var5) - { - var8.canBePickedUp = 2; - } - else - { - player.inventory.consumeInventoryItem(Items.arrow); - } - var8 = (EntityArrow) modifyArrow(item, var8); - - if (!world.isRemote) - { - world.spawnEntityInWorld(var8); - } - } - } - - public ItemStack onFoodEaten(ItemStack item, World world, EntityPlayer player) - { - return item; - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack item) - { - return 72000; - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack item) - { - return EnumAction.bow; - } - - @Override - public void addInformation(ItemStack item, EntityPlayer player, List desc, boolean flag) - { + /** + * Returns True is the item is renderer in full 3D when hold. + */ + public boolean isFull3D() { + return true; + } + + /** + * called when the player releases the use item button. Args: itemstack, world, + * entityplayer, itemInUseCount + */ + @Override + public void onPlayerStoppedUsing(ItemStack item, World world, EntityPlayer player, int time) { + int power = (this.getMaxItemUseDuration(item) - time); + + ArrowLooseEvent event = new ArrowLooseEvent(player, item, power); + MinecraftForge.EVENT_BUS.post(event); + + if (event.isCanceled()) { + return; + } + boolean var5 = player.capabilities.isCreativeMode + || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, item) > 0; + power = event.charge; + + if (var5 || player.inventory.hasItem(Items.arrow)) { + float firepower = power / model.chargeTime; + + if (firepower < 0.1D) { + return; + } + if (firepower > 1.0F) { + firepower = 1.0F; + } + + EntityArrow var8 = new EntityArrow(world, player, firepower * 2.0F); + + if (firepower == 1.0F) { + var8.setIsCritical(true); + } + + int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, item); + + if (var9 > 0) { + var8.setDamage(var8.getDamage() + var9 * 0.5D + 0.5D); + } + + int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, item); + + if (var10 > 0) { + var8.setKnockbackStrength(var10); + } + + if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, item) > 0) { + var8.setFire(100); + } + + AmmoMechanicsMF.damageContainer(item, player, 1); + world.playSoundAtEntity(player, "minefantasy2:weapon.bowFire", 1.0F, + 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + firepower * 0.5F); + + if (var5) { + var8.canBePickedUp = 2; + } else { + player.inventory.consumeInventoryItem(Items.arrow); + } + var8 = (EntityArrow) modifyArrow(item, var8); + + if (!world.isRemote) { + world.spawnEntityInWorld(var8); + } + } + } + + public ItemStack onFoodEaten(ItemStack item, World world, EntityPlayer player) { + return item; + } + + /** + * How long it takes to use or consume an item + */ + @Override + public int getMaxItemUseDuration(ItemStack item) { + return 72000; + } + + /** + * returns the action that specifies what animation to play when the items is + * being used + */ + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.bow; + } + + @Override + public void addInformation(ItemStack item, EntityPlayer player, List desc, boolean flag) { super.addInformation(item, player, desc, flag); - + CustomToolHelper.addBowInformation(item, desc); ItemStack ammo = AmmoMechanicsMF.getAmmo(item); - if(ammo != null) - { + if (ammo != null) { desc.add(EnumChatFormatting.DARK_GRAY + ammo.getDisplayName() + " x" + ammo.stackSize); } - - desc.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.bowPower.name", decimal_format.format(getBowDamage(item)))); - } + + desc.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.bowPower.name", + decimal_format.format(getBowDamage(item)))); + } /** - * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer - */ - @Override - ///Item is the bow. - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) - { - - if(!world.isRemote && player.isSneaking() || AmmoMechanicsMF.isDepleted(item)) - { - reloadBow(item, player); - return item; - } - ArrowNockEvent event = new ArrowNockEvent(player, item); - MinecraftForge.EVENT_BUS.post(event); - if (event.isCanceled()) - { - return event.result; - } - return item; - - //player.inventory.hasItem(Items.arrow) - } - - public boolean canAccept(ItemStack ammo) - { + * Called whenever this item is equipped and the right mouse button is pressed. + * Args: itemStack, world, entityPlayer + */ + @Override + /// Item is the bow. + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + + if (!world.isRemote && player.isSneaking() || AmmoMechanicsMF.isDepleted(item)) { + reloadBow(item, player); + return item; + } + ArrowNockEvent event = new ArrowNockEvent(player, item); + MinecraftForge.EVENT_BUS.post(event); + if (event.isCanceled()) { + return event.result; + } + return item; + + // player.inventory.hasItem(Items.arrow) + } + + public boolean canAccept(ItemStack ammo) { String ammoType = "null"; ItemStack weapon = new ItemStack(this); - if(ammo != null && ammo.getItem() instanceof IAmmo) - { - ammoType = ((IAmmo)ammo.getItem()).getAmmoType(ammo); + if (ammo != null && ammo.getItem() instanceof IAmmo) { + ammoType = ((IAmmo) ammo.getItem()).getAmmoType(ammo); } - - if(weapon != null && weapon.getItem() instanceof IFirearm) - { - return ((IFirearm)weapon.getItem()).canAcceptAmmo(weapon, ammoType); + + if (weapon != null && weapon.getItem() instanceof IFirearm) { + return ((IFirearm) weapon.getItem()).canAcceptAmmo(weapon, ammoType); } - + return ammoType.equalsIgnoreCase("arrow"); } - private void reloadBow(ItemStack item, EntityPlayer player) - { + private void reloadBow(ItemStack item, EntityPlayer player) { player.openGui(MineFantasyII.instance, 1, player.worldObj, 1, 0, 0); } /** - * Return the enchantability factor of the item, most of the time is based on material. - */ + * Return the enchantability factor of the item, most of the time is based on + * material. + */ private int enchantmentLvl = 1; - @Override - public int getItemEnchantability() - { - return enchantmentLvl; - } - - @Override - public void onUpdate(ItemStack item, World world, Entity entity, int i, boolean b) - { - super.onUpdate(item, world, entity, i, b); - if(!item.hasTagCompound()) - item.setTagCompound(new NBTTagCompound()); - item.stackTagCompound.setInteger("Use", i); - } - - public int getDrawAmount(int timer) - { + + @Override + public int getItemEnchantability() { + return enchantmentLvl; + } + + @Override + public void onUpdate(ItemStack item, World world, Entity entity, int i, boolean b) { + super.onUpdate(item, world, entity, i, b); + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + item.stackTagCompound.setInteger("Use", i); + } + + public int getDrawAmount(int timer) { float maxCharge = this.getMaxCharge(); - if (timer > (maxCharge*0.9F)) - return 2; - else if (timer > (maxCharge*0.65F)) - return 1; - else if (timer > 0) - return 0; - + if (timer > (maxCharge * 0.9F)) + return 2; + else if (timer > (maxCharge * 0.65F)) + return 1; + else if (timer > 0) + return 0; + return -2; } + @Override - public EnumRarity getRarity(ItemStack item) - { + public EnumRarity getRarity(ItemStack item) { int lvl = itemRarity; - - EnumRarity[] rarity = new EnumRarity[]{EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, EnumRarity.epic}; - if(item.isItemEnchanted()) - { - if(lvl == 0) - { + + EnumRarity[] rarity = new EnumRarity[] { EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, + EnumRarity.epic }; + if (item.isItemEnchanted()) { + if (lvl == 0) { lvl++; } - lvl ++; + lvl++; } - if(lvl >= rarity.length) - { - lvl = rarity.length-1; + if (lvl >= rarity.length) { + lvl = rarity.length - 1; } return rarity[lvl]; } - - - private EnumRarity rarity(ItemStack item, int lvl) - { - EnumRarity[] rarity = new EnumRarity[]{EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, EnumRarity.epic}; - if(item.isItemEnchanted()) - { - if(lvl == 0) - { + + private EnumRarity rarity(ItemStack item, int lvl) { + EnumRarity[] rarity = new EnumRarity[] { EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, + EnumRarity.epic }; + if (item.isItemEnchanted()) { + if (lvl == 0) { lvl++; } - lvl ++; + lvl++; } - if(lvl >= rarity.length) - { - lvl = rarity.length-1; + if (lvl >= rarity.length) { + lvl = rarity.length - 1; } return rarity[lvl]; } - + @Override - public Entity modifyArrow(ItemStack bow, Entity arrow) - { - if(this.isCustom) - { + public Entity modifyArrow(ItemStack bow, Entity arrow) { + if (this.isCustom) { CustomMaterial custom = CustomToolHelper.getCustomPrimaryMaterial(bow); - if(custom != null) - { - if(custom.name.equalsIgnoreCase("silver")) - { + if (custom != null) { + if (custom.name.equalsIgnoreCase("silver")) { arrow.getEntityData().setBoolean("MF_Silverbow", true); } } } - - + float dam = getBowDamage(bow); - + arrow.getEntityData().setFloat("MF_Bow_Damage", dam); arrow.getEntityData().setString("Design", designType); - + return arrow; } - - public boolean canUseRenderer(ItemStack item) - { + + public boolean canUseRenderer(ItemStack item) { return true; } - - private void addSet(List list, Item[] items) - { - for(Item item:items) - { + + private void addSet(List list, Item[] items) { + for (Item item : items) { list.add(new ItemStack(item)); } } - + @Override public boolean sheatheOnBack(ItemStack item) { return true; @@ -373,37 +328,31 @@ public boolean isOffhandHandDual(ItemStack off) { } @Override - public boolean offhandAttackEntity(OffhandAttackEvent event, - ItemStack mainhandItem, ItemStack offhandItem) { + public boolean offhandAttackEntity(OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) { return false; } @Override - public boolean offhandClickAir(PlayerInteractEvent event, - ItemStack mainhandItem, ItemStack offhandItem) { + public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { return false; } @Override - public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) - { + public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { return false; } @Override - public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem) - { + public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem) { } @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) - { + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { return false; } @Override - public boolean canAcceptAmmo(ItemStack weapon, String ammo) - { + public boolean canAcceptAmmo(ItemStack weapon, String ammo) { return ammo.equalsIgnoreCase("arrow"); } @@ -411,157 +360,140 @@ public boolean canAcceptAmmo(ItemStack weapon, String ammo) public int getAmmoCapacity(ItemStack item) { return 1; } - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; private String designType = "standard"; - public ItemBowMF setCustom(String designType) - { + + public ItemBowMF setCustom(String designType) { canRepair = false; - setTextureName("minefantasy2:custom/bow/"+designType+"/"+name); + setTextureName("minefantasy2:custom/bow/" + designType + "/" + name); isCustom = true; this.designType = designType; return this; } + public IIcon[] mainIcons = new IIcon[3]; - + public IIcon cus_metal_standby; public IIcon[] cus_metal_pulling = new IIcon[3]; public IIcon cus_wood_standby; public IIcon[] cus_wood_pulling = new IIcon[3]; public IIcon cus_detail_standby; public IIcon[] cus_detail_pulling = new IIcon[3]; - - + @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack stack, int pass) - { + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack stack, int pass) { return getIcon(stack, pass, -1); - } + } + @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack bow, int layer, int pull) - { - if(!isCustom) - { + public IIcon getIcon(ItemStack bow, int layer, int pull) { + if (!isCustom) { return pull >= 0 ? mainIcons[pull] : this.itemIcon; } - - if(layer == 0) - { + + if (layer == 0) { return pull >= 0 ? cus_metal_pulling[pull] : cus_metal_standby; } - if(layer == 1) - { + if (layer == 1) { return pull >= 0 ? cus_wood_pulling[pull] : cus_wood_standby; - } - else - { + } else { return pull >= 0 ? cus_detail_pulling[pull] : cus_detail_standby; } } + @SideOnly(Side.CLIENT) - @Override - public void registerIcons(IIconRegister reg) - { - this.itemIcon = reg.registerIcon(this.getIconString()+"_standby"); - for (int i = 0; i < 3; ++i) - { - this.mainIcons[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i)); - } - - if(isCustom) - { - this.cus_metal_standby = reg.registerIcon(this.getIconString()+"_standby"); - this.cus_wood_standby = reg.registerIcon(this.getIconString()+"_standby_haft"); - this.cus_detail_standby = reg.registerIcon(this.getIconString()+"_standby_detail"); - - for (int i = 0; i < 3; ++i) - { - this.cus_metal_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i)); - this.cus_wood_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i) + "_haft"); - this.cus_detail_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i) + "_detail"); - } - } - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { + public void registerIcons(IIconRegister reg) { + this.itemIcon = reg.registerIcon(this.getIconString() + "_standby"); + for (int i = 0; i < 3; ++i) { + this.mainIcons[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i)); + } + + if (isCustom) { + this.cus_metal_standby = reg.registerIcon(this.getIconString() + "_standby"); + this.cus_wood_standby = reg.registerIcon(this.getIconString() + "_standby_haft"); + this.cus_detail_standby = reg.registerIcon(this.getIconString() + "_standby_detail"); + + for (int i = 0; i < 3; ++i) { + this.cus_metal_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i)); + this.cus_wood_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i) + "_haft"); + this.cus_detail_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i) + "_detail"); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { int c = CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - return c; - } - - public ItemStack construct(String main, String haft) - { + return c; + } + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getWoodenLocalisedName(item, unlocalName); - } - - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getWoodenLocalisedName(item, unlocalName); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList wood = CustomMaterial.getList("wood"); - Iterator iteratorWood = wood.iterator(); - while(iteratorWood.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct("Iron", customMat.name)); - } - } - return; - } - } - - public float getBowDamage(ItemStack item) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList wood = CustomMaterial.getList("wood"); + Iterator iteratorWood = wood.iterator(); + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct("Iron", customMat.name)); + } + } + return; + } + } + + public float getBowDamage(ItemStack item) { return CustomToolHelper.getBowDamage(item, baseDamage) * model.damageModifier; } + @Override - public float getRange(ItemStack item) - { + public float getRange(ItemStack item) { return model.velocity; } + @Override - public float getSpread(ItemStack item) - { + public float getSpread(ItemStack item) { return model.spread; } - //====================================================== CUSTOM END ==============================================================\\ + + // ====================================================== CUSTOM END + // ==============================================================\\ @Override - public float getMaxCharge() - { + public float getMaxCharge() { return model.chargeTime; } } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemApron.java b/src/main/java/minefantasy/mf2/item/armour/ItemApron.java index a4510e15..0c106be5 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemApron.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemApron.java @@ -1,26 +1,17 @@ package minefantasy.mf2.item.armour; -import net.minecraft.client.model.ModelBiped; -import net.minecraft.entity.EntityLivingBase; +import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.armour.ArmourDesign; -import minefantasy.mf2.material.BaseMaterialMF; -public class ItemApron extends ItemClothingMF -{ - public ItemApron(String name, BaseMaterialMF material, String tex, int rarity) - { +public class ItemApron extends ItemClothingMF { + public ItemApron(String name, BaseMaterialMF material, String tex, int rarity) { super(name, material, 1, tex, rarity); } - - public static boolean isUserProtected(EntityPlayer user) - { + + public static boolean isUserProtected(EntityPlayer user) { ItemStack worn = user.getCurrentArmor(2); - if(worn == null) - { + if (worn == null) { return false; } return worn.getItem() instanceof ItemApron; diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java index b15c5b6b..f2330774 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java @@ -17,7 +17,6 @@ import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.material.BaseMaterialMF; -import minefantasy.mf2.mechanics.CombatMechanics; import minefantasy.mf2.util.MFLogUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -33,65 +32,56 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.IIcon; -public class ItemArmourMF extends ItemArmourMFBase implements IElementalResistance -{ +public class ItemArmourMF extends ItemArmourMFBase implements IElementalResistance { @SideOnly(Side.CLIENT) private static Object fullplate; - + private int itemRarity; protected BaseMaterialMF baseMaterial; - - public ItemArmourMF(String name, BaseMaterialMF material, ArmourDesign AD, int slot, String tex, int rarity) - { + + public ItemArmourMF(String name, BaseMaterialMF material, ArmourDesign AD, int slot, String tex, int rarity) { super(name, material.getArmourConversion(), AD, slot, tex); baseMaterial = material; - this.setTextureName("minefantasy2:apparel/"+AD.getName().toLowerCase()+"/"+name); + this.setTextureName("minefantasy2:apparel/" + AD.getName().toLowerCase() + "/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); setCreativeTab(CreativeTabMF.tabArmour); - + itemRarity = rarity; } - public ItemArmourMF(String name, BaseMaterialMF material, ArmourDesign AD, int slot, String tex, int rarity, float customBulk) - { + public ItemArmourMF(String name, BaseMaterialMF material, ArmourDesign AD, int slot, String tex, int rarity, + float customBulk) { this(name, material, AD, slot, tex, rarity); this.suitBulk = customBulk; } + @Override - public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) - { - if(source.isMagicDamage() && this.getMagicResistance(stack, source) > 100F) - { + public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { + if (source.isMagicDamage() && this.getMagicResistance(stack, source) > 100F) { return; } - if(source.isFireDamage() && this.getFireResistance(stack, source) > 100F) - { + if (source.isFireDamage() && this.getFireResistance(stack, source) > 100F) { return; } - if(ArmourListMF.isUnbreakable(baseMaterial, entity)) - { + if (ArmourListMF.isUnbreakable(baseMaterial, entity)) { return; } initArmourDamage(entity, stack, damage); } @Override - public float getMagicResistance(ItemStack item, DamageSource source) - { + public float getMagicResistance(ItemStack item, DamageSource source) { CustomMaterial custom = getCustomMaterial(item); - if(custom != null) - { + if (custom != null) { return custom.resistance; } return material.magicResistanceModifier; } @Override - public float getFireResistance(ItemStack item, DamageSource source) - { + public float getFireResistance(ItemStack item, DamageSource source) { CustomMaterial custom = getCustomMaterial(item); - if(custom != null) - { + if (custom != null) { MFLogUtil.logDebug("Fire Resist: " + custom.getFireResistance()); return custom.getFireResistance() * design.getRating(); } @@ -99,319 +89,275 @@ public float getFireResistance(ItemStack item, DamageSource source) } @Override - public float getArrowDeflection(ItemStack item, DamageSource source) - { + public float getArrowDeflection(ItemStack item, DamageSource source) { return (design == ArmourDesign.MAIL || design == ArmourDesign.PLATE) ? 0.5F : 0.0F; } @Override - public float getBaseResistance(ItemStack item, DamageSource source) - { - if(baseMaterial == BaseMaterialMF.getMaterial("ender") && source.getSourceOfDamage() != null && source.getSourceOfDamage() instanceof EntityEnderPearl) - { + public float getBaseResistance(ItemStack item, DamageSource source) { + if (baseMaterial == BaseMaterialMF.getMaterial("ender") && source.getSourceOfDamage() != null + && source.getSourceOfDamage() instanceof EntityEnderPearl) { return 100F; } return 0; } - - + @Override - public EnumRarity getRarity(ItemStack item) - { + public EnumRarity getRarity(ItemStack item) { int lvl = itemRarity + 1; - - if(item.isItemEnchanted()) - { - if(lvl == 0) - { + + if (item.isItemEnchanted()) { + if (lvl == 0) { lvl++; } - lvl ++; + lvl++; } - if(design == ArmourDesign.PLATE) - { - lvl ++; + if (design == ArmourDesign.PLATE) { + lvl++; } - if(lvl >= ToolListMF.rarity.length) - { - lvl = ToolListMF.rarity.length-1; + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; } return ToolListMF.rarity[lvl]; } + @Override - protected boolean isUnbreakable() - { + protected boolean isUnbreakable() { return baseMaterial == BaseMaterialMF.getMaterial("ender"); } - + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(this != ArmourListMF.leather[0]) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (this != ArmourListMF.leather[0]) { return; } list.add(new ItemStack(ArmourListMF.leatherapron)); addSet(list, ArmourListMF.leather); - } - private void addSet(List list, Item[] items) - { - for(Item item:items) - { + } + + private void addSet(List list, Item[] items) { + for (Item item : items) { list.add(new ItemStack(item)); } } @SideOnly(Side.CLIENT) - private IIcon clothIcon; + private IIcon clothIcon; @SideOnly(Side.CLIENT) - private IIcon armourIcon; - + private IIcon armourIcon; + @Override @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(!canColour()) - { + public void registerIcons(IIconRegister reg) { + if (!canColour()) { super.registerIcons(reg); - } - else - { + } else { String baseLayer = isMetal() ? "" : "_overlay"; - this.armourIcon = reg.registerIcon(this.getIconString()+baseLayer); + this.armourIcon = reg.registerIcon(this.getIconString() + baseLayer); String dyeLayer = isMetal() ? "_cloth" : ""; - this.clothIcon = reg.registerIcon(this.getIconString()+dyeLayer); + this.clothIcon = reg.registerIcon(this.getIconString() + dyeLayer); } - } + } + @Override @SideOnly(Side.CLIENT) - public IIcon getIconFromDamageForRenderPass(int dam, int layer) - { - if(!canColour()) - { + public IIcon getIconFromDamageForRenderPass(int dam, int layer) { + if (!canColour()) { return super.getIconFromDamage(dam); } - return layer == 1 ? armourIcon : clothIcon; - } - - public boolean canColour() - { - return design == ArmourDesign.PADDING || design == ArmourDesign.LEATHER || design == ArmourDesign.CLOTH || isMetal(); + return layer == 1 ? armourIcon : clothIcon; + } + + public boolean canColour() { + return design == ArmourDesign.PADDING || design == ArmourDesign.LEATHER || design == ArmourDesign.CLOTH + || isMetal(); } - public boolean isMetal() - { + + public boolean isMetal() { return design == ArmourDesign.MAIL || design == ArmourDesign.PLATE; } - + @SideOnly(Side.CLIENT) @Override - public boolean requiresMultipleRenderPasses() - { - return canColour(); - } - + public boolean requiresMultipleRenderPasses() { + return canColour(); + } + /** - * Return whether the specified armor ItemStack has a color. - */ + * Return whether the specified armor ItemStack has a color. + */ @Override - public boolean hasColor(ItemStack item) - { - return !canColour() ? false : (!item.hasTagCompound() ? false : (!item.getTagCompound().hasKey("display", 10) ? false : item.getTagCompound().getCompoundTag("display").hasKey("color", 3))); - } + public boolean hasColor(ItemStack item) { + return !canColour() ? false + : (!item.hasTagCompound() ? false + : (!item.getTagCompound().hasKey("display", 10) ? false + : item.getTagCompound().getCompoundTag("display").hasKey("color", 3))); + } + /** * The Colour of the armour when not dyed */ - public int getBaseColour(ItemStack item) - { - if(!this.isCustom()) - { + public int getBaseColour(ItemStack item) { + if (!this.isCustom()) { return 10511680; } return -1; } - /** - * Return the color for the specified armor ItemStack. - */ + /** + * Return the color for the specified armor ItemStack. + */ @Override - public int getColor(ItemStack item) - { + public int getColor(ItemStack item) { int metal = getBaseColour(item); - if (!canColour()) - { - return metal; - } - else - { - NBTTagCompound nbttagcompound = item.getTagCompound(); - - if (nbttagcompound == null) - { - return metal; - } - else - { - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); - return nbttagcompound1 == null ? metal : (nbttagcompound1.hasKey("color", 3) ? nbttagcompound1.getInteger("color") : metal); - } - } - } - + if (!canColour()) { + return metal; + } else { + NBTTagCompound nbttagcompound = item.getTagCompound(); + + if (nbttagcompound == null) { + return metal; + } else { + NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); + return nbttagcompound1 == null ? metal + : (nbttagcompound1.hasKey("color", 3) ? nbttagcompound1.getInteger("color") : metal); + } + } + } + /** - * Remove the color from the specified armor ItemStack. - */ + * Remove the color from the specified armor ItemStack. + */ @Override - public void removeColor(ItemStack item) - { - if (canColour()) - { - NBTTagCompound nbttagcompound = item.getTagCompound(); - - if (nbttagcompound != null) - { - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); - - if (nbttagcompound1.hasKey("color")) - { - nbttagcompound1.removeTag("color"); - } - } - } - } - - @Override - public void func_82813_b(ItemStack item, int colour) - { - if (!canColour()) - { - return; - } - else - { - NBTTagCompound nbttagcompound = item.getTagCompound(); - - if (nbttagcompound == null) - { - nbttagcompound = new NBTTagCompound(); - item.setTagCompound(nbttagcompound); - } - - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); - - if (!nbttagcompound.hasKey("display", 10)) - { - nbttagcompound.setTag("display", nbttagcompound1); - } - - nbttagcompound1.setInteger("color", colour); - } - } - @Override - public float getMagicAC(float AC, DamageSource source, double damage, EntityLivingBase player) - { - if(damage > 1 && material.isMythic) - { - return AC; - } + public void removeColor(ItemStack item) { + if (canColour()) { + NBTTagCompound nbttagcompound = item.getTagCompound(); + + if (nbttagcompound != null) { + NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); + + if (nbttagcompound1.hasKey("color")) { + nbttagcompound1.removeTag("color"); + } + } + } + } + + @Override + public void func_82813_b(ItemStack item, int colour) { + if (!canColour()) { + return; + } else { + NBTTagCompound nbttagcompound = item.getTagCompound(); + + if (nbttagcompound == null) { + nbttagcompound = new NBTTagCompound(); + item.setTagCompound(nbttagcompound); + } + + NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); + + if (!nbttagcompound.hasKey("display", 10)) { + nbttagcompound.setTag("display", nbttagcompound1); + } + + nbttagcompound1.setInteger("color", colour); + } + } + + @Override + public float getMagicAC(float AC, DamageSource source, double damage, EntityLivingBase player) { + if (damage > 1 && material.isMythic) { + return AC; + } return 0F; } @Override - public String getSuitWeigthType(ItemStack item) - { - if(design == ArmourDesign.MAIL) - { + public String getSuitWeigthType(ItemStack item) { + if (design == ArmourDesign.MAIL) { return "medium"; } - if(design == ArmourDesign.PLATE) - { + if (design == ArmourDesign.PLATE) { return "heavy"; } return super.getSuitWeigthType(item); } - - - public ItemStack construct(String plate) - { + + public ItemStack construct(String plate) { ItemStack item = new ItemStack(this); CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, plate.toLowerCase()); return item; } /** - * A bit of the new system, gets custom materials for armour Only used on cogwork armour though + * A bit of the new system, gets custom materials for armour Only used on + * cogwork armour though */ - public CustomMaterial getCustomMaterial(ItemStack item) - { + public CustomMaterial getCustomMaterial(ItemStack item) { CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); - if(material != null) - { + if (material != null) { return material; } return null; } - + @Override - public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src) - { - float DR = getProtectionRatio(armour)*scalePiece(); - - if(ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) - { - DR = ArmourCalculator.adjustACForDamage(src, DR, getProtectiveTrait(armour, 0), getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); + public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src) { + float DR = getProtectionRatio(armour) * scalePiece(); + + if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { + DR = ArmourCalculator.adjustACForDamage(src, DR, getProtectiveTrait(armour, 0), + getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); } MFLogUtil.logDebug(">>>>DR<<<< = " + DR); return DR; } + @Override - protected float getProtectionRatio(ItemStack item) - { + protected float getProtectionRatio(ItemStack item) { CustomMaterial main = getCustomMaterial(item); - if(main != null) - { - return main.hardness*design.getRating(); + if (main != null) { + return main.hardness * design.getRating(); } return super.getProtectionRatio(item); } - + /** * Gets the modifier for a certain damage type (Cutting, Blunt, Piercing) */ @Override - public float getProtectiveTrait(ItemStack item, int dtype) - { - float value = super.getProtectiveTrait(item, dtype); + public float getProtectiveTrait(ItemStack item, int dtype) { + float value = super.getProtectiveTrait(item, dtype); float cutting = 1.0F; float piercing = 1.0F; float blunt = 1.0F; - + CustomMaterial material = getCustomMaterial(item); - if(material != null) - { + if (material != null) { cutting = material.getArmourProtection(0); blunt = material.getArmourProtection(1); piercing = material.getArmourProtection(2); } - - if(dtype == 0)//Cutting + + if (dtype == 0)// Cutting { value *= cutting; } - if(dtype == 2)//Piercing + if (dtype == 2)// Piercing { value *= piercing; } - if(dtype == 1)//Blunt + if (dtype == 1)// Blunt { value *= blunt; } return value; } - public float getResistanceModifier(ItemStack item, String hazard) - { + + public float getResistanceModifier(ItemStack item, String hazard) { CustomMaterial custom = getCustomMaterial(item); - if(custom != null) - { + if (custom != null) { return custom.resistance; } return super.getResistanceModifier(item, hazard); @@ -420,86 +366,76 @@ public float getResistanceModifier(ItemStack item, String hazard) public boolean isCustom() { return false; } - + @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean full) - { + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean full) { CustomToolHelper.addInformation(item, list); float mass = getPieceWeight(item, armorType); - - list.add(CustomMaterial.getWeightString(mass)); + + list.add(CustomMaterial.getWeightString(mass)); super.addInformation(item, user, list, full); } - @Override - public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) - { - if(entity instanceof EntityPlayer && armorType < 2 && design == ArmourDesign.FIELDPLATE && ConfigClient.customModel) - { + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) { + if (entity instanceof EntityPlayer && armorType < 2 && design == ArmourDesign.FIELDPLATE + && ConfigClient.customModel) { return getArmourTextureName(stack, entity, slot, type) + "_S.png"; } return getArmourTextureName(stack, entity, slot, type) + ".png"; } - public String getArmourTextureName(ItemStack stack, Entity entity, int slot, String type) - { - String tex = "minefantasy2:textures/models/armour/"+design.getName().toLowerCase()+"/"+texture; - if(type == null && canColour())//bottom layer + + public String getArmourTextureName(ItemStack stack, Entity entity, int slot, String type) { + String tex = "minefantasy2:textures/models/armour/" + design.getName().toLowerCase() + "/" + texture; + if (type == null && canColour())// bottom layer { return tex + "_cloth"; } return tex; } - + @Override @SideOnly(Side.CLIENT) - public net.minecraft.client.model.ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) - { - if( !(entityLiving instanceof EntityPlayer) || armorType >= 2 || !ConfigClient.customModel) - { + public net.minecraft.client.model.ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, + int armorSlot) { + if (!(entityLiving instanceof EntityPlayer) || armorType >= 2 || !ConfigClient.customModel) { return super.getArmorModel(entityLiving, itemStack, armorSlot); } - - if(fullplate == null) - { + + if (fullplate == null) { fullplate = new minefantasy.mf2.client.render.armour.ModelFullplate(1.0F); } - net.minecraft.client.model.ModelBiped model = this.design == ArmourDesign.FIELDPLATE ? (net.minecraft.client.model.ModelBiped)fullplate : null; - if( model == null) - { + net.minecraft.client.model.ModelBiped model = this.design == ArmourDesign.FIELDPLATE + ? (net.minecraft.client.model.ModelBiped) fullplate + : null; + if (model == null) { return super.getArmorModel(entityLiving, itemStack, armorSlot); } - if(entityLiving != null) - { + if (entityLiving != null) { model.heldItemRight = entityLiving.getHeldItem() != null ? 1 : 0; model.aimedBow = false; - if(entityLiving instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer)entityLiving; + if (entityLiving instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) entityLiving; ItemStack held = player.getHeldItem(); - if (held != null && player.getItemInUseCount() > 0) - { - EnumAction enumaction = held.getItemUseAction(); - - if (enumaction == EnumAction.block) - { - model.heldItemRight = 3; - } - else if (enumaction == EnumAction.bow) - { - model.aimedBow = true; - } - } + if (held != null && player.getItemInUseCount() > 0) { + EnumAction enumaction = held.getItemUseAction(); + + if (enumaction == EnumAction.block) { + model.heldItemRight = 3; + } else if (enumaction == EnumAction.bow) { + model.aimedBow = true; + } + } } } model.bipedHead.showModel = (this.armorType == 0); model.bipedHeadwear.showModel = (this.armorType == 0); - + model.bipedCloak.showModel = (this.armorType == 1); model.bipedBody.showModel = (this.armorType == 1); model.bipedLeftArm.showModel = (this.armorType == 1); model.bipedRightArm.showModel = (this.armorType == 1); - return model; - } + return model; + } } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemClothingMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemClothingMF.java index 07227440..9554f4e8 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemClothingMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemClothingMF.java @@ -1,60 +1,52 @@ package minefantasy.mf2.item.armour; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.config.ConfigClient; import minefantasy.mf2.material.BaseMaterialMF; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; -public class ItemClothingMF extends ItemArmourMF -{ +public class ItemClothingMF extends ItemArmourMF { @SideOnly(Side.CLIENT) private Object model; + /** - * @param piece 0head, 1body, 2legs, 3boots + * @param piece + * 0head, 1body, 2legs, 3boots */ - public ItemClothingMF(String name, BaseMaterialMF material, int piece, String tex, int rarity) - { + public ItemClothingMF(String name, BaseMaterialMF material, int piece, String tex, int rarity) { super(name, material, ArmourDesign.CLOTH, piece, tex, rarity); } - + @Override - public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) - { - String tex = "minefantasy2:textures/models/armour/"+design.getName().toLowerCase()+"/"+texture; - if(type == null && canColour())//bottom layer + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) { + String tex = "minefantasy2:textures/models/armour/" + design.getName().toLowerCase() + "/" + texture; + if (type == null && canColour())// bottom layer { return tex + "_cloth.png"; } - return tex+".png"; + return tex + ".png"; } - + @Override @SideOnly(Side.CLIENT) - public net.minecraft.client.model.ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) - { - - if(!ConfigClient.customModel) - { + public net.minecraft.client.model.ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, + int armorSlot) { + + if (!ConfigClient.customModel) { return super.getArmorModel(entityLiving, itemStack, armorSlot); } - if(model == null) - { + if (model == null) { model = new net.minecraft.client.model.ModelBiped(0.25F); } - - if(entityLiving != null) - { - ((net.minecraft.client.model.ModelBiped)model).heldItemRight = entityLiving.getHeldItem() != null ? 1 : 0; + + if (entityLiving != null) { + ((net.minecraft.client.model.ModelBiped) model).heldItemRight = entityLiving.getHeldItem() != null ? 1 : 0; } - return (net.minecraft.client.model.ModelBiped)model; - } - + return (net.minecraft.client.model.ModelBiped) model; + } + } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemCustomArmour.java b/src/main/java/minefantasy/mf2/item/armour/ItemCustomArmour.java index 263183bf..df0aecfe 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemCustomArmour.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemCustomArmour.java @@ -4,13 +4,13 @@ import java.util.Iterator; import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.helpers.ArmourCalculator; import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.TacticalManager; import minefantasy.mf2.api.material.CustomMaterial; -import minefantasy.mf2.entity.mob.EntityDragon; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.CustomArmourListMF; import minefantasy.mf2.material.BaseMaterialMF; @@ -20,218 +20,194 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class ItemCustomArmour extends ItemArmourMF -{ +public class ItemCustomArmour extends ItemArmourMF { private String specialDesign = "standard"; private float ratingModifier = 1.0F; - public ItemCustomArmour(String craftDesign, String name, ArmourDesign AD, int slot, String tex, int rarity) - { - super(craftDesign + "_"+name, BaseMaterialMF.iron, AD, slot, craftDesign + "_"+tex, rarity); - this.setTextureName("minefantasy2:custom/apparel/" + craftDesign + "/"+craftDesign+"_"+name); + + public ItemCustomArmour(String craftDesign, String name, ArmourDesign AD, int slot, String tex, int rarity) { + super(craftDesign + "_" + name, BaseMaterialMF.iron, AD, slot, craftDesign + "_" + tex, rarity); + this.setTextureName("minefantasy2:custom/apparel/" + craftDesign + "/" + craftDesign + "_" + name); this.specialDesign = craftDesign; canRepair = false; } - public ItemCustomArmour modifyRating(float rating) - { + + public ItemCustomArmour modifyRating(float rating) { this.ratingModifier = rating; return this; } + @Override - public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) - { + public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { super.damageArmor(entity, stack, source, damage, slot); } - + @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + @Override - public String getArmourTextureName(ItemStack stack, Entity entity, int slot, String type) - { - String tex = "minefantasy2:textures/models/armour/custom/" + specialDesign + "/"+texture; - if(type == null)//bottom layer + public String getArmourTextureName(ItemStack stack, Entity entity, int slot, String type) { + String tex = "minefantasy2:textures/models/armour/custom/" + specialDesign + "/" + texture; + if (type == null)// bottom layer { - return tex;//COLOUR LAYER + return tex;// COLOUR LAYER } - return tex +"_detail";//STATIC LAYER + return tex + "_detail";// STATIC LAYER } @Override - public boolean hasColor(ItemStack item) - { - return true; - } + public boolean hasColor(ItemStack item) { + return true; + } + @Override - public boolean canColour() - { - return true; - } - - /** - * Return the colour of the material it is made of. - */ + public boolean canColour() { + return true; + } + + /** + * Return the colour of the material it is made of. + */ @Override - public int getBaseColour(ItemStack item) - { - CustomMaterial material = getCustomMaterial(item); - if(material == null) - { + public int getBaseColour(ItemStack item) { + CustomMaterial material = getCustomMaterial(item); + if (material == null) { return (255 << 16) + (255 << 8) + 255; } - return material.getColourInt(); - } - + return material.getColourInt(); + } + @Override - public CustomMaterial getCustomMaterial(ItemStack item) - { + public CustomMaterial getCustomMaterial(ItemStack item) { CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); - if(material != null) - { + if (material != null) { return material; } return null; } - /** - * Adds a suit ONLY IF the material ingot exists - */ - public static void tryAddSuits(List list, String plating) - { - ArrayList mats = OreDictionary.getOres("ingot"+plating); - if(MineFantasyII.isDebug() || (mats != null && !mats.isEmpty())) - { + /** + * Adds a suit ONLY IF the material ingot exists + */ + public static void tryAddSuits(List list, String plating) { + ArrayList mats = OreDictionary.getOres("ingot" + plating); + if (MineFantasyII.isDebug() || (mats != null && !mats.isEmpty())) { addSuits(list, plating); } } - public static void addSuits(List list, String material) - { + + public static void addSuits(List list, String material) { list.add(CustomArmourListMF.standard_chain_helmet.construct(material)); list.add(CustomArmourListMF.standard_chain_chest.construct(material)); list.add(CustomArmourListMF.standard_chain_legs.construct(material)); list.add(CustomArmourListMF.standard_chain_boots.construct(material)); - + list.add(CustomArmourListMF.standard_scale_helmet.construct(material)); list.add(CustomArmourListMF.standard_scale_chest.construct(material)); list.add(CustomArmourListMF.standard_scale_legs.construct(material)); list.add(CustomArmourListMF.standard_scale_boots.construct(material)); - + list.add(CustomArmourListMF.standard_splint_helmet.construct(material)); list.add(CustomArmourListMF.standard_splint_chest.construct(material)); list.add(CustomArmourListMF.standard_splint_legs.construct(material)); list.add(CustomArmourListMF.standard_splint_boots.construct(material)); - + list.add(CustomArmourListMF.standard_plate_helmet.construct(material)); list.add(CustomArmourListMF.standard_plate_chest.construct(material)); list.add(CustomArmourListMF.standard_plate_legs.construct(material)); list.add(CustomArmourListMF.standard_plate_boots.construct(material)); } - + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { ArrayList metal = CustomMaterial.getList("metal"); Iterator iteratorMetal = metal.iterator(); - if(this.getCreativeTab() != CreativeTabMF.tabArmour) - { - while(iteratorMetal.hasNext()) - { + if (this.getCreativeTab() != CreativeTabMF.tabArmour) { + while (iteratorMetal.hasNext()) { CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - - if(customMat.getItem() != null) - { + + if (customMat.getItem() != null) { list.add(construct(customMat.name)); } - } + } return; } - if(this != CustomArmourListMF.standard_chain_boots)return; - - while(iteratorMetal.hasNext()) - { + if (this != CustomArmourListMF.standard_chain_boots) + return; + + while (iteratorMetal.hasNext()) { CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - - if(customMat.getItem() != null) - { + + if (customMat.getItem() != null) { addSuits(list, customMat.name); } - } - } - + } + } + private IIcon plateIcon, detailIcon; + @Override @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { + public void registerIcons(IIconRegister reg) { this.plateIcon = reg.registerIcon(this.getIconString()); - this.detailIcon = reg.registerIcon(this.getIconString()+"_detail"); - } + this.detailIcon = reg.registerIcon(this.getIconString() + "_detail"); + } + @Override @SideOnly(Side.CLIENT) - public IIcon getIconFromDamageForRenderPass(int dam, int layer) - { - return layer == 1 ? detailIcon : plateIcon; - } + public IIcon getIconFromDamageForRenderPass(int dam, int layer) { + return layer == 1 ? detailIcon : plateIcon; + } + @SideOnly(Side.CLIENT) @Override - public boolean requiresMultipleRenderPasses() - { - return true; - } - + public boolean requiresMultipleRenderPasses() { + return true; + } + @Override - public float getPieceWeight(ItemStack item, int slot) - { + public float getPieceWeight(ItemStack item, int slot) { float baseWeight = armourWeight * ArmourCalculator.sizes[slot]; CustomMaterial material = this.getCustomMaterial(item); - if(material != null) - { + if (material != null) { baseWeight *= material.density; } return baseWeight; } - - public int getMaxDamage(ItemStack stack) - { + + public int getMaxDamage(ItemStack stack) { CustomMaterial material = this.getCustomMaterial(stack); - if(material != null) - { - return (int)((material.durability*250) * (design.getDurability()/2F)); + if (material != null) { + return (int) ((material.durability * 250) * (design.getDurability() / 2F)); } - return getMaxDamage(); - } - + return getMaxDamage(); + } + public boolean isCustom() { return true; } - + @Override - protected float getSpecialModifier(ItemStack armour, DamageSource source) - { - float modifier = CombatMechanics.getSpecialModifier(this.getCustomMaterial(armour), this.specialDesign, source.getEntity(), false); - + protected float getSpecialModifier(ItemStack armour, DamageSource source) { + float modifier = CombatMechanics.getSpecialModifier(this.getCustomMaterial(armour), this.specialDesign, + source.getEntity(), false); + MFLogUtil.logDebug("Modifier = " + modifier); - + return super.getSpecialModifier(armour, source) * modifier; } + @Override - protected float getProtectionRatio(ItemStack item) - { - return super.getProtectionRatio(item)*ratingModifier; + protected float getProtectionRatio(ItemStack item) { + return super.getProtectionRatio(item) * ratingModifier; } } diff --git a/src/main/java/minefantasy/mf2/item/custom/ItemCustomComponent.java b/src/main/java/minefantasy/mf2/item/custom/ItemCustomComponent.java index 3971ed99..5603a0d1 100644 --- a/src/main/java/minefantasy/mf2/item/custom/ItemCustomComponent.java +++ b/src/main/java/minefantasy/mf2/item/custom/ItemCustomComponent.java @@ -25,207 +25,185 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class ItemCustomComponent extends Item implements ITieredComponent -{ +public class ItemCustomComponent extends Item implements ITieredComponent { @SideOnly(Side.CLIENT) public IIcon baseTex; private String name; private float mass; - - public ItemCustomComponent(String name, String type) - { + + public ItemCustomComponent(String name, String type) { this(name, -1F, type); } - public ItemCustomComponent(String name, float mass, String type) - { + + public ItemCustomComponent(String name, float mass, String type) { this.name = name; this.setCreativeTab(CreativeTabMF.tabMaterials); - GameRegistry.registerItem(this, "custom_"+name, MineFantasyII.MODID); + GameRegistry.registerItem(this, "custom_" + name, MineFantasyII.MODID); this.setUnlocalizedName(name); - this.mass=mass; + this.mass = mass; this.materialType = type; } + private boolean canDamage = false;; - public ItemCustomComponent setCanDamage() - { + + public ItemCustomComponent setCanDamage() { this.canDamage = true; this.setHasSubtypes(false); return this; } + @Override - public boolean isDamageable() - { + public boolean isDamageable() { return canDamage; - } + } + @Override - public boolean isRepairable() - { - return false; - } - + public boolean isRepairable() { + return false; + } + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if (tab != CreativeTabMF.tabMaterialsMF) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (tab != CreativeTabMF.tabMaterialsMF) { ArrayList wood = CustomMaterial.getList("metal"); Iterator iteratorWood = wood.iterator(); - while (iteratorWood.hasNext()) - { + while (iteratorWood.hasNext()) { CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); list.add(this.createComm(customMat.name)); } } } - - public float getWeightInKg(ItemStack tool) - { - CustomMaterial base = getBase(tool); - if(base != null) - { - return base.density * mass; - } - return mass; - } - + + public float getWeightInKg(ItemStack tool) { + CustomMaterial base = getBase(tool); + if (base != null) { + return base.density * mass; + } + return mass; + } + @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack tool, EntityPlayer user, List list, boolean fullInfo) - { - super.addInformation(tool, user, list, fullInfo); - if(!canDamage) - { - CustomToolHelper.addComponentString(tool, list, getBase(tool), mass); - } - if(this == ComponentListMF.cogwork_armour) - { - int AR = EntityCogwork.getArmourRating(getBase(tool)); - list.add(StatCollector.translateToLocal("attribute.armour.protection") + " " + AR); - if(mass > 0) - list.add(CustomMaterial.getWeightString(getWeightInKg(tool))); - } - } - + public void addInformation(ItemStack tool, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(tool, user, list, fullInfo); + if (!canDamage) { + CustomToolHelper.addComponentString(tool, list, getBase(tool), mass); + } + if (this == ComponentListMF.cogwork_armour) { + int AR = EntityCogwork.getArmourRating(getBase(tool)); + list.add(StatCollector.translateToLocal("attribute.armour.protection") + " " + AR); + if (mass > 0) + list.add(CustomMaterial.getWeightString(getWeightInKg(tool))); + } + } + @Override - public String getItemStackDisplayName(ItemStack tool) - { - return CustomToolHelper.getLocalisedName(tool, "item.commodity_"+name+".name"); - } - - public CustomMaterial getBase(ItemStack component) - { + public String getItemStackDisplayName(ItemStack tool) { + return CustomToolHelper.getLocalisedName(tool, "item.commodity_" + name + ".name"); + } + + public CustomMaterial getBase(ItemStack component) { return CustomToolHelper.getCustomPrimaryMaterial(component); } - + @Override - @SideOnly(Side.CLIENT) - public int getRenderPasses(int metadata) - { - return 1; - } - + @SideOnly(Side.CLIENT) + public int getRenderPasses(int metadata) { + return 1; + } + @Override @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { + public int getColorFromItemStack(ItemStack item, int layer) { CustomMaterial base = getBase(item); - if(base != null) - { - return base.getColourInt(); - } - return super.getColorFromItemStack(item, layer); - } - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack item, int layer) - { + if (base != null) { + return base.getColourInt(); + } + return super.getColorFromItemStack(item, layer); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack item, int layer) { return baseTex; - } - - @Override + } + + @Override @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return true; - } - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - baseTex = reg.registerIcon("minefantasy2:custom/component/"+name); - } - - public ItemStack createComm(String base) - { - return createComm(base, 1); - } - public ItemStack createComm(String base, int stack) - { + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + baseTex = reg.registerIcon("minefantasy2:custom/component/" + name); + } + + public ItemStack createComm(String base) { + return createComm(base, 1); + } + + public ItemStack createComm(String base, int stack) { return createComm(base, stack, 0); } - public ItemStack createComm(String base, int stack, float damage) - { + + public ItemStack createComm(String base, int stack, float damage) { ItemStack item = new ItemStack(this, stack); CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, base); int maxdam = this.getMaxDamage(item); - - item.setItemDamage( (int) ((float)maxdam*damage)); + + item.setItemDamage((int) (maxdam * damage)); return item; } - + @Override - public int getMaxDamage(ItemStack stack) - { - if(canDamage) - { + public int getMaxDamage(ItemStack stack) { + if (canDamage) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } return super.getMaxDamage(stack); } - public ItemStack createComm(String base, int stack, int damage) - { + + public ItemStack createComm(String base, int stack, int damage) { ItemStack item = new ItemStack(this, stack, damage); CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, base); return item; } + private final String materialType; + @Override - public String getMaterialType(ItemStack item) - { + public String getMaterialType(ItemStack item) { return materialType; } - //STORAGE + + // STORAGE private String blocktex; private String storageType; - - public ItemCustomComponent setStoragePlacement(String type, String tex) - { + + public ItemCustomComponent setStoragePlacement(String type, String tex) { this.blocktex = tex; this.storageType = type; return this; } - + @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(!world.isRemote && storageType != null) - { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); - - if (movingobjectposition == null) - { - return item; - } - else - { - int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, movingobjectposition); - if(placed > 0) - { - item.stackSize -= placed; - return item; - } - } + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote && storageType != null) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); + + if (movingobjectposition == null) { + return item; + } else { + int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, + movingobjectposition); + if (placed > 0) { + item.stackSize -= placed; + return item; + } + } } return item; - } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/food/FoodListMF.java b/src/main/java/minefantasy/mf2/item/food/FoodListMF.java index 705caafe..9b52b39e 100644 --- a/src/main/java/minefantasy/mf2/item/food/FoodListMF.java +++ b/src/main/java/minefantasy/mf2/item/food/FoodListMF.java @@ -10,83 +10,125 @@ import net.minecraft.item.Item; import net.minecraft.potion.Potion; -public class FoodListMF -{ - //MORSELS +public class FoodListMF { + // MORSELS public static Item wolf_raw = (new ItemFoodMF("wolf_raw", 2, 0.2F, true)); public static Item wolf_cooked = (new ItemFoodMF("wolf_cooked", 6, 0.6F, true)); - public static Item horse_raw = (new ItemFoodMF("horse_raw", 4, 0.4F, true)).setPotionEffect(Potion.hunger.id, 50, 0, 0.5F); + public static Item horse_raw = (new ItemFoodMF("horse_raw", 4, 0.4F, true)).setPotionEffect(Potion.hunger.id, 50, 0, + 0.5F); public static Item horse_cooked = (new ItemFoodMF("horse_cooked", 10, 1.0F, true)); - + public static Item generic_meat_uncooked = (new ItemFoodMF("generic_meat_uncooked", 2, 0.2F, true)); - public static Item generic_meat_cooked = (new ItemFoodMF("generic_meat_cooked", 5, 0.5F, true)); + public static Item generic_meat_cooked = (new ItemFoodMF("generic_meat_cooked", 5, 0.5F, true)); public static Item generic_meat_strip_uncooked = (new ItemFoodMF("generic_meat_strip_uncooked", 2, 0.2F, true)); - public static Item generic_meat_strip_cooked = (new ItemFoodMF("generic_meat_strip_cooked", 5, 0.5F, true)); + public static Item generic_meat_strip_cooked = (new ItemFoodMF("generic_meat_strip_cooked", 5, 0.5F, true)); public static Item generic_meat_chunk_uncooked = (new ItemFoodMF("generic_meat_chunk_uncooked", 2, 0.2F, true)); - public static Item generic_meat_chunk_cooked = (new ItemFoodMF("generic_meat_chunk_cooked", 5, 0.5F, true)); - public static Item generic_meat_mince_uncooked = (new ItemFoodMF("generic_meat_mince_uncooked", 2, 0.2F, true)).setContainerItem(ComponentListMF.clay_pot); - public static Item generic_meat_mince_cooked = (new ItemFoodMF("generic_meat_mince_cooked", 5, 0.5F, true)).setContainerItem(ComponentListMF.clay_pot); - - public static Item flour = new ItemComponentMF("flour", 0).setCreativeTab(CreativeTabMF.tabFood).setContainerItem(ComponentListMF.clay_pot); - public static Item breadcrumbs = new ItemComponentMF("breadcrumbs", 0).setCreativeTab(CreativeTabMF.tabFood).setContainerItem(ComponentListMF.clay_pot); + public static Item generic_meat_chunk_cooked = (new ItemFoodMF("generic_meat_chunk_cooked", 5, 0.5F, true)); + public static Item generic_meat_mince_uncooked = (new ItemFoodMF("generic_meat_mince_uncooked", 2, 0.2F, true)) + .setContainerItem(ComponentListMF.clay_pot); + public static Item generic_meat_mince_cooked = (new ItemFoodMF("generic_meat_mince_cooked", 5, 0.5F, true)) + .setContainerItem(ComponentListMF.clay_pot); + + public static Item flour = new ItemComponentMF("flour", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item breadcrumbs = new ItemComponentMF("breadcrumbs", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); public static Item guts = new ItemComponentMF("guts", 0).setCreativeTab(CreativeTabMF.tabFood); - + public static Item breadroll = (new ItemFoodMF("breadroll", 5, 1.0F, false)); public static Item breadSlice = (new ItemFoodMF("breadslice", 2, 1.0F, false)); - + public static Item curds = new ItemUnfinishedFood("curds"); public static Item cheese_pot = new ItemUnfinishedFood("cheese_pot").setContainerItem(ComponentListMF.clay_pot); - public static Item cheese_slice = (new ItemFoodMF("cheese_slice", 4, 1.0F, false, 0).setFoodStats(1, 0.0F, 0.0F, 1.0F)); - - //T1 (basic mixing) - //Util: Roast, Prep Block (Stone-Bronze Age) - public static Item stew = (new ItemFoodMF("stew" , 5, 1.0F, false, 0)).setFoodStats(1, 0.0F, 0.0F, 1.0F).setReturnItem(Items.bowl).setMaxStackSize(1); - public static Item oats = (new ItemFoodMF("oats" , 5, 1.0F, false, 0)).setFoodStats(1, 0.0F, 0.8F, 0.2F).setReturnItem(Items.bowl).setMaxStackSize(1); - - //T2 (Basic baking, stone oven, processed mixing) - //Util: Stone Oven, Prep Block (Bronze Age - Early Iron Age) - public static Item cheese_roll = (new ItemFoodMF("cheese_roll", 6, 1.0F, false, 0)).setFoodStats(2, 0.0F, 0.4F, 0.6F).setMaxStackSize(1); - public static Item jerky = (new ItemFoodMF("jerky", 6, 1.0F, true, 0)).setFoodStats(2, 0.0F, 0.0F, 1.0F).setMaxStackSize(8); - public static Item saussage_raw = (new ItemFoodMF("saussage_raw", 4, 1.0F, true, 0)).setFoodStats(2, 0.0F, 0.1F, 0.6F).setMaxStackSize(16); - public static Item saussage_cooked = (new ItemFoodMF("saussage_cooked", 8, 1.0F, true, 0)).setFoodStats(2, 0.0F, 0.2F, 0.8F).setMaxStackSize(16); - public static Item sweetroll_uniced = (new ItemFoodMF("sweetroll_uniced", 5, 1.0F, false, 0)).setFoodStats(2, 0.5F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64); - public static Item sweetroll = (new ItemMultiFood("sweetroll", 2,3, 1.0F, false, 0)).setFoodStats(2, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible(); - public static Item sandwitch_meat = (new ItemMultiFood("sandwitch_meat", 2,6, 1.0F, false, 0)).setFoodStats(2, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/sandwitch").setUnlocalizedName("sandwitch"); - public static Item sandwitch_big = (new ItemMultiFood("sandwitch_big", 4,6, 1.0F, false, 1)).setFoodStats(2, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/sandwitchbig").setUnlocalizedName("sandwitch"); - - //T3 (Quality baking, metal oven) - //Util: Metal Oven, Prep Block, Steel Tools (Mid Iron Age) - public static Item meatpie_slice = (new ItemFoodMF("meatpie_slice", 8, 1.0F, false, 0)).setFoodStats(3, 0.0F, 0.2F, 0.8F).setMaxStackSize(1); - public static Item pieslice_apple = (new ItemFoodMF("pieslice_apple", 5, 1.0F, false, 0)).setFoodStats(3, 0.8F, 0.2F, 0.0F).setEatTime(16).setAlwaysEdible().setAlwaysEdible().setTextureName("minefantasy2:food/applepie_slice").setMaxStackSize(1); - public static Item pieslice_berry = (new ItemFoodMF("pieslice_berry", 5 , 1.0F, false, 0)).setFoodStats(3, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setAlwaysEdible().setTextureName("minefantasy2:food/berrypie_slice").setMaxStackSize(1); - - //T4 (Advanced baking, multiple processes, temperature regulation) - //Util : Metal Oven, Prep Block, Full tool set, Proper kitchen setup (Mid Iron Age) - public static Item pieslice_shepards = (new ItemFoodMF("pieslice_shepards", 10, 1.0F, false, 1)).setFoodStats(4, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/shepardspie_slice").setMaxStackSize(1); - - public static Item cake_slice = (new ItemFoodMF("cake_slice", 3, 0.8F, false, 0)).setFoodStats(3, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); - public static Item carrotcake_slice = (new ItemFoodMF("carrotcake_slice",4, 0.8F, false, 0)).setFoodStats(4, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); - public static Item choccake_slice = (new ItemFoodMF("choccake_slice", 4, 0.8F, false, 0)).setFoodStats(4, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); - - //T5 (Advanced baking, multiple process, temperature regulation, many ingreedients) - - //T6 (Perfeted meals, extremely difficylt to create) - public static Item bfcake_slice = (new ItemFoodMF("bfcake_slice", 6, 1.0F, false, 1)).setFoodStats(5, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); - public static Item eclair_uniced = (new ItemFoodMF("eclair_uniced", 5, 1.0F, false, 0)).setFoodStats(5, 0.3F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64).setTextureName("minefantasy2:food/unfinished/eclair_uniced"); - public static Item eclair_empty = (new ItemFoodMF("eclair_empty", 5, 1.0F, false, 0)).setFoodStats(5, 0.5F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64).setTextureName("minefantasy2:food/unfinished/eclair_empty"); - public static Item eclair = (new ItemMultiFood("eclair", 4,4, 1.0F, false, 1)).setFoodStats(5, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); - - //MISC + public static Item cheese_slice = (new ItemFoodMF("cheese_slice", 4, 1.0F, false, 0).setFoodStats(1, 0.0F, 0.0F, + 1.0F)); + + // T1 (basic mixing) + // Util: Roast, Prep Block (Stone-Bronze Age) + public static Item stew = (new ItemFoodMF("stew", 5, 1.0F, false, 0)).setFoodStats(1, 0.0F, 0.0F, 1.0F) + .setReturnItem(Items.bowl).setMaxStackSize(1); + public static Item oats = (new ItemFoodMF("oats", 5, 1.0F, false, 0)).setFoodStats(1, 0.0F, 0.8F, 0.2F) + .setReturnItem(Items.bowl).setMaxStackSize(1); + + // T2 (Basic baking, stone oven, processed mixing) + // Util: Stone Oven, Prep Block (Bronze Age - Early Iron Age) + public static Item cheese_roll = (new ItemFoodMF("cheese_roll", 6, 1.0F, false, 0)) + .setFoodStats(2, 0.0F, 0.4F, 0.6F).setMaxStackSize(1); + public static Item jerky = (new ItemFoodMF("jerky", 6, 1.0F, true, 0)).setFoodStats(2, 0.0F, 0.0F, 1.0F) + .setMaxStackSize(8); + public static Item saussage_raw = (new ItemFoodMF("saussage_raw", 4, 1.0F, true, 0)) + .setFoodStats(2, 0.0F, 0.1F, 0.6F).setMaxStackSize(16); + public static Item saussage_cooked = (new ItemFoodMF("saussage_cooked", 8, 1.0F, true, 0)) + .setFoodStats(2, 0.0F, 0.2F, 0.8F).setMaxStackSize(16); + public static Item sweetroll_uniced = (new ItemFoodMF("sweetroll_uniced", 5, 1.0F, false, 0)) + .setFoodStats(2, 0.5F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64); + public static Item sweetroll = (new ItemMultiFood("sweetroll", 2, 3, 1.0F, false, 0)) + .setFoodStats(2, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible(); + public static Item sandwitch_meat = (new ItemMultiFood("sandwitch_meat", 2, 6, 1.0F, false, 0)) + .setFoodStats(2, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/sandwitch") + .setUnlocalizedName("sandwitch"); + public static Item sandwitch_big = (new ItemMultiFood("sandwitch_big", 4, 6, 1.0F, false, 1)) + .setFoodStats(2, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/sandwitchbig") + .setUnlocalizedName("sandwitch"); + + // T3 (Quality baking, metal oven) + // Util: Metal Oven, Prep Block, Steel Tools (Mid Iron Age) + public static Item meatpie_slice = (new ItemFoodMF("meatpie_slice", 8, 1.0F, false, 0)) + .setFoodStats(3, 0.0F, 0.2F, 0.8F).setMaxStackSize(1); + public static Item pieslice_apple = (new ItemFoodMF("pieslice_apple", 5, 1.0F, false, 0)) + .setFoodStats(3, 0.8F, 0.2F, 0.0F).setEatTime(16).setAlwaysEdible().setAlwaysEdible() + .setTextureName("minefantasy2:food/applepie_slice").setMaxStackSize(1); + public static Item pieslice_berry = (new ItemFoodMF("pieslice_berry", 5, 1.0F, false, 0)) + .setFoodStats(3, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setAlwaysEdible() + .setTextureName("minefantasy2:food/berrypie_slice").setMaxStackSize(1); + + // T4 (Advanced baking, multiple processes, temperature regulation) + // Util : Metal Oven, Prep Block, Full tool set, Proper kitchen setup (Mid Iron + // Age) + public static Item pieslice_shepards = (new ItemFoodMF("pieslice_shepards", 10, 1.0F, false, 1)) + .setFoodStats(4, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/shepardspie_slice").setMaxStackSize(1); + + public static Item cake_slice = (new ItemFoodMF("cake_slice", 3, 0.8F, false, 0)).setFoodStats(3, 1.0F, 0.0F, 0.0F) + .setEatTime(16).setAlwaysEdible().setMaxStackSize(1); + public static Item carrotcake_slice = (new ItemFoodMF("carrotcake_slice", 4, 0.8F, false, 0)) + .setFoodStats(4, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); + public static Item choccake_slice = (new ItemFoodMF("choccake_slice", 4, 0.8F, false, 0)) + .setFoodStats(4, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); + + // T5 (Advanced baking, multiple process, temperature regulation, many + // ingreedients) + + // T6 (Perfeted meals, extremely difficylt to create) + public static Item bfcake_slice = (new ItemFoodMF("bfcake_slice", 6, 1.0F, false, 1)) + .setFoodStats(5, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); + public static Item eclair_uniced = (new ItemFoodMF("eclair_uniced", 5, 1.0F, false, 0)) + .setFoodStats(5, 0.3F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64) + .setTextureName("minefantasy2:food/unfinished/eclair_uniced"); + public static Item eclair_empty = (new ItemFoodMF("eclair_empty", 5, 1.0F, false, 0)) + .setFoodStats(5, 0.5F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64) + .setTextureName("minefantasy2:food/unfinished/eclair_empty"); + public static Item eclair = (new ItemMultiFood("eclair", 4, 4, 1.0F, false, 1)).setFoodStats(5, 1.0F, 0.0F, 0.0F) + .setEatTime(16).setAlwaysEdible().setMaxStackSize(1); + + // MISC public static Item cake_tin = new ItemComponentMF("cake_tin", 0).setCreativeTab(CreativeTabMF.tabFood); - public static Item pie_tray = new ItemComponentMF("pie_tin", 0).setStoragePlacement("bigplate", "tray").setCreativeTab(CreativeTabMF.tabFood); - public static Item icing = new ItemComponentMF("icing", 0).setCreativeTab(CreativeTabMF.tabFood).setContainerItem(ComponentListMF.clay_pot); - public static Item custard = new ItemComponentMF("custard", 0).setCreativeTab(CreativeTabMF.tabFood).setContainerItem(ComponentListMF.clay_pot); - public static Item coca_powder = new ItemComponentMF("coca_powder", 0).setCreativeTab(CreativeTabMF.tabFood).setContainerItem(ComponentListMF.clay_pot); - public static Item chocolate = new ItemComponentMF("chocolate", 0).setCreativeTab(CreativeTabMF.tabFood).setContainerItem(ComponentListMF.clay_pot); - public static Item chocchips = new ItemComponentMF("chocchips", 0).setCreativeTab(CreativeTabMF.tabFood).setContainerItem(ComponentListMF.clay_pot); - public static Item berries = (new ItemFoodMF("berries", 2, 2.0F, false)).setEatTime(10).setStaminaRestore(10F).setAlwaysEdible(); - public static Item berriesJuicy = (new ItemFoodMF("berriesJuicy", 3, 5.0F, false)).setEatTime(10).setStaminaRestore(25F).setRarity(1).setAlwaysEdible(); - + public static Item pie_tray = new ItemComponentMF("pie_tin", 0).setStoragePlacement("bigplate", "tray") + .setCreativeTab(CreativeTabMF.tabFood); + public static Item icing = new ItemComponentMF("icing", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item custard = new ItemComponentMF("custard", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item coca_powder = new ItemComponentMF("coca_powder", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item chocolate = new ItemComponentMF("chocolate", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item chocchips = new ItemComponentMF("chocchips", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item berries = (new ItemFoodMF("berries", 2, 2.0F, false)).setEatTime(10).setStaminaRestore(10F) + .setAlwaysEdible(); + public static Item berriesJuicy = (new ItemFoodMF("berriesJuicy", 3, 5.0F, false)).setEatTime(10) + .setStaminaRestore(25F).setRarity(1).setAlwaysEdible(); + public static Item sweetroll_raw = new ItemUnfinishedFood("sweetroll_raw").setMaxStackSize(64); public static Item eclair_raw = new ItemUnfinishedFood("eclair_raw").setMaxStackSize(64); public static Item cake_raw = new ItemUnfinishedFood("cake_raw"); @@ -94,59 +136,61 @@ public class FoodListMF public static Item cake_carrot_raw = new ItemUnfinishedFood("cake_carrot_raw"); public static Item cake_choc_raw = new ItemUnfinishedFood("cake_choc_raw"); public static Item cake_bf_raw = new ItemUnfinishedFood("cake_bf_raw"); - + public static Item cake_uniced = new ItemUnfinishedFood("cake_uniced").setContainerItem(cake_tin); public static Item cake_simple_uniced = new ItemUnfinishedFood("cake_simple_uniced").setContainerItem(cake_tin); public static Item cake_carrot_uniced = new ItemUnfinishedFood("cake_carrot_uniced").setContainerItem(cake_tin); public static Item cake_choc_uniced = new ItemUnfinishedFood("cake_choc_uniced").setContainerItem(cake_tin); public static Item cake_bf_uniced = new ItemUnfinishedFood("cake_bf_uniced").setContainerItem(cake_tin); - - public static Item pie_meat_uncooked = new ItemUnfinishedFood("pie_meat_uncooked").setTextureName("minefantasy2:food/unfinished/pie_meat_uncooked"); - + + public static Item pie_meat_uncooked = new ItemUnfinishedFood("pie_meat_uncooked") + .setTextureName("minefantasy2:food/unfinished/pie_meat_uncooked"); + public static Item pie_apple_uncooked = new ItemUnfinishedFood("pie_apple_uncooked"); public static Item pie_berry_uncooked = new ItemUnfinishedFood("pie_berry_uncooked"); public static Item pie_shepard_uncooked = new ItemUnfinishedFood("pie_shepard_uncooked"); public static Item pie_pumpkin_uncooked = new ItemUnfinishedFood("pie_pumpkin_uncooked"); - - public static Item pie_meat_cooked = new ItemUnfinishedFood("pie_meat_cooked").setTextureName("minefantasy2:food/unfinished/pie_meat_cooked").setContainerItem(pie_tray); - + + public static Item pie_meat_cooked = new ItemUnfinishedFood("pie_meat_cooked") + .setTextureName("minefantasy2:food/unfinished/pie_meat_cooked").setContainerItem(pie_tray); + public static Item pie_apple_cooked = new ItemUnfinishedFood("pie_apple_cooked").setContainerItem(pie_tray); public static Item pie_berry_cooked = new ItemUnfinishedFood("pie_berry_cooked").setContainerItem(pie_tray); public static Item pie_shepard_cooked = new ItemUnfinishedFood("pie_shepard_cooked").setContainerItem(pie_tray); public static Item pie_pumpkin_cooked = new ItemUnfinishedFood("pie_pumpkin_cooked").setContainerItem(pie_tray); - public static Item salt = new ItemComponentMF("salt", 0).setCreativeTab(CreativeTabMF.tabFood).setContainerItem(ComponentListMF.clay_pot); - public static Item sugarpot = new ItemComponentMF("sugarpot", 0).setCreativeTab(CreativeTabMF.tabFood).setContainerItem(ComponentListMF.clay_pot); - public static Item bowl_water_salt = new ItemComponentMF("bowl_water_salt", 0).setCreativeTab(CreativeTabMF.tabFood); - + public static Item salt = new ItemComponentMF("salt", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item sugarpot = new ItemComponentMF("sugarpot", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item bowl_water_salt = new ItemComponentMF("bowl_water_salt", 0) + .setCreativeTab(CreativeTabMF.tabFood); + public static Item dough = new ItemUnfinishedFood("dough").setMaxStackSize(64); public static Item pastry = new ItemUnfinishedFood("pastry").setMaxStackSize(64); public static Item raw_bread = new ItemUnfinishedFood("raw_bread").setMaxStackSize(64); - + public static Item jug_uncooked = new ItemJug("uncooked"); public static Item jug_empty = new ItemJug("empty").setStoragePlacement("jug", "jug"); - public static Item jug_water = new ItemJug("water").setStoragePlacement("jug", "jugwater").setContainerItem(jug_empty); + public static Item jug_water = new ItemJug("water").setStoragePlacement("jug", "jugwater") + .setContainerItem(jug_empty); public static Item jug_milk = new ItemJug("milk").setStoragePlacement("jug", "jugmilk").setContainerItem(jug_empty); - + public static Item burnt_food = new ItemBurntFood("burnt_food"); public static Item burnt_pot = new ItemBurntFood("burnt_pot").setContainerItem(ComponentListMF.clay_pot); public static Item burnt_pie = new ItemBurntFood("burnt_pie").setContainerItem(pie_tray); public static Item burnt_cake = new ItemBurntFood("burnt_cake").setContainerItem(cake_tin); - //SPECIAL RECIPES - + // SPECIAL RECIPES + public static final float satModifier = 1.0F; - public static void load() - { + + public static void load() { CookRecipe.burnt_food = burnt_food; } - + /** - * FOOD TYPES: - * Sugar: Stamina Regen - * Dairy: Saturation - * Grain: Stamina Max + * FOOD TYPES: Sugar: Stamina Regen Dairy: Saturation Grain: Stamina Max * - * Protien: Saturation / Stamina Max - * Fruit: Stamina Max / Stamina Time + * Protien: Saturation / Stamina Max Fruit: Stamina Max / Stamina Time * Vegetable: Stamina Time / Saturation */ diff --git a/src/main/java/minefantasy/mf2/item/food/ItemFoodMF.java b/src/main/java/minefantasy/mf2/item/food/ItemFoodMF.java index 49023e3e..42c361f4 100644 --- a/src/main/java/minefantasy/mf2/item/food/ItemFoodMF.java +++ b/src/main/java/minefantasy/mf2/item/food/ItemFoodMF.java @@ -3,14 +3,15 @@ import java.text.DecimalFormat; import java.util.List; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.hunger.HungerSystemMF; import minefantasy.mf2.item.ClientItemsMF; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.mechanics.TierHelper; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -24,133 +25,122 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class ItemFoodMF extends ItemFood -{ - private static final String eatDelayNBT = "MF_EatenFoodDelay"; +public class ItemFoodMF extends ItemFood { + private static final String eatDelayNBT = "MF_EatenFoodDelay"; private float staminaRestore = 0F; private Item leftOver; private float mfSaturation = 0F; protected int hungerLevel; protected float saturationLevel; - - public ItemFoodMF(String name, int hunger, float saturation, boolean isMeat) - { + + public ItemFoodMF(String name, int hunger, float saturation, boolean isMeat) { super(hunger, 0F, isMeat); - + hungerLevel = hunger; saturationLevel = saturation; setCreativeTab(CreativeTabMF.tabFood); - GameRegistry.registerItem(this, "MF2_food_"+name, MineFantasyII.MODID); + GameRegistry.registerItem(this, "MF2_food_" + name, MineFantasyII.MODID); this.setUnlocalizedName(name); - this.setTextureName("minefantasy2:food/"+name); + this.setTextureName("minefantasy2:food/" + name); } - - public ItemFoodMF(String name, int hunger, float saturation, boolean isMeat, int rarity) - { + + public ItemFoodMF(String name, int hunger, float saturation, boolean isMeat, int rarity) { this(name, hunger, saturation, isMeat); itemRarity = rarity; } - protected void onMFFoodEaten(ItemStack food, World world, EntityPlayer consumer) - { - if(StaminaBar.isSystemActive) - { - if(staminaRestore > 0) - { - StaminaBar.modifyStaminaValue(consumer, staminaRestore); - } - if(staminaSeconds > 0) - { + + protected void onMFFoodEaten(ItemStack food, World world, EntityPlayer consumer) { + if (StaminaBar.isSystemActive) { + if (staminaRestore > 0) { + StaminaBar.modifyStaminaValue(consumer, staminaRestore); + } + if (staminaSeconds > 0) { StaminaBar.buffStamina(consumer, staminaBuff, staminaSeconds); } - if(staminaRegenSeconds > 0) - { + if (staminaRegenSeconds > 0) { StaminaBar.buffStaminaRegen(consumer, staminaRegenBuff, staminaRegenSeconds); } } - if(mfSaturation > 0) - { + if (mfSaturation > 0) { int foodLeftOver = consumer.getFoodStats().getFoodLevel(); - - float saturation = mfSaturation - (20-foodLeftOver); - - if(saturation > 0) - { + + float saturation = mfSaturation - (20 - foodLeftOver); + + if (saturation > 0) { HungerSystemMF.applySaturation(consumer, saturation); - + } } - - if(this == FoodListMF.berriesJuicy) - { + + if (this == FoodListMF.berriesJuicy) { PotionEffect poison = consumer.getActivePotionEffect(Potion.poison); - if(poison != null) - { + if (poison != null) { poison.addCurativeItem(food); consumer.curePotionEffects(food); } } - } - public ItemFoodMF setRarity(int i) - { + } + + public ItemFoodMF setRarity(int i) { itemRarity = i; return this; } - public ItemFoodMF setStaminaRestore(float f) - { + + public ItemFoodMF setStaminaRestore(float f) { staminaRestore = f; hasEffect = true; return this; } - + /** - * Grade Sugar, Carbs and Fats from 0-1 and tier does the rest - * 0 means non-existent - * @param sugar restore stamina and add regen - * @param carbs increase max stamina for 1 hr - * @param fats saturation + * Grade Sugar, Carbs and Fats from 0-1 and tier does the rest 0 means + * non-existent + * + * @param sugar + * restore stamina and add regen + * @param carbs + * increase max stamina for 1 hr + * @param fats + * saturation */ - public ItemFoodMF setFoodStats(int tier, float sugar, float carbs, float fats) - { - return setFoodStats(sugar*tier, carbs*tier, fats*tier); + public ItemFoodMF setFoodStats(int tier, float sugar, float carbs, float fats) { + return setFoodStats(sugar * tier, carbs * tier, fats * tier); } + /** - * New system for setting food vales: Values should be based on tier value (t1, t2, t3,...,tx) - * 0 means non-existent - * @param sugar restore stamina and add regen - * @param carbs increase max stamina for 1 hr - * @param fats saturation + * New system for setting food vales: Values should be based on tier value (t1, + * t2, t3,...,tx) 0 means non-existent + * + * @param sugar + * restore stamina and add regen + * @param carbs + * increase max stamina for 1 hr + * @param fats + * saturation */ - public ItemFoodMF setFoodStats(float sugar, float carbs, float fats) - { - if(sugar > 0) - { - setStaminaRestore((int)(sugar*50)); - setStaminaRegenModifier((int)sugar, sugar/30); + public ItemFoodMF setFoodStats(float sugar, float carbs, float fats) { + if (sugar > 0) { + setStaminaRestore((int) (sugar * 50)); + setStaminaRegenModifier((int) sugar, sugar / 30); } - if(carbs > 0) - { - setStaminaModifier(50*carbs, 1F); + if (carbs > 0) { + setStaminaModifier(50 * carbs, 1F); } - if(fats > 0) - { - setSaturation(10*fats); + if (fats > 0) { + setSaturation(10 * fats); } return this; } - public ItemFoodMF setSaturation(float amount) - { + + public ItemFoodMF setSaturation(float amount) { hasEffect = true; this.mfSaturation = amount * FoodListMF.satModifier; return this; } - - public ItemFoodMF setStaminaModifier(float buff, float hours) - { - int secondsLasting = (int) (hours*3600F); + + public ItemFoodMF setStaminaModifier(float buff, float hours) { + int secondsLasting = (int) (hours * 3600F); staminaBuff = buff; staminaSeconds = secondsLasting; staminaInMinutes = secondsLasting > 60; @@ -158,148 +148,129 @@ public ItemFoodMF setStaminaModifier(float buff, float hours) hasEffect = true; return this; } - public ItemFoodMF setStaminaRegenModifier(float buff, float minutesLasting) - { - int secondsLasting = (int) (minutesLasting*60F); + + public ItemFoodMF setStaminaRegenModifier(float buff, float minutesLasting) { + int secondsLasting = (int) (minutesLasting * 60F); staminaRegenBuff = buff; staminaRegenSeconds = secondsLasting; staminaRegenInMinutes = secondsLasting > 60; hasEffect = true; return this; } + public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); + @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack food, EntityPlayer user, List list, boolean extra) - { - super.addInformation(food, user, list, extra); - list.add(StatCollector.translateToLocalFormatted("food.stat.hunger.name", hungerLevel)); - - if(hasEffect && ClientItemsMF.showSpecials(food, user, list, extra)) - { - list.add(""); - list.add(EnumChatFormatting.WHITE + StatCollector.translateToLocal("food.stat.list.name")); - if(mfSaturation > 0) - { - list.add(StatCollector.translateToLocalFormatted("food.stat.saturation.name", decimal_format.format(mfSaturation))); - } - if(staminaRestore > 0) - { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminaPlus.name", (int)staminaRestore)); - } - if(staminaBuff > 0) - { - if(staminaInHours) - { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffHours.name", decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds/3600F))); - } - else if(staminaInMinutes) - { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffMinutes.name", decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds/60F))); - } - else - { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffSeconds.name", decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds))); - } - } - if(staminaRegenBuff > 0) - { - if(staminaRegenInMinutes) - { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffRegenMinutes.name", decimal_format.format(staminaRegenBuff), decimal_format.format(staminaRegenSeconds/60F))); - } - else - { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffRegenSeconds.name", decimal_format.format(staminaRegenBuff), decimal_format.format(staminaRegenSeconds))); - } - } - } - if(this == FoodListMF.berriesJuicy) - { - list.add(StatCollector.translateToLocal("food.stat.cure.poison")); - } - } - + public void addInformation(ItemStack food, EntityPlayer user, List list, boolean extra) { + super.addInformation(food, user, list, extra); + list.add(StatCollector.translateToLocalFormatted("food.stat.hunger.name", hungerLevel)); + + if (hasEffect && ClientItemsMF.showSpecials(food, user, list, extra)) { + list.add(""); + list.add(EnumChatFormatting.WHITE + StatCollector.translateToLocal("food.stat.list.name")); + if (mfSaturation > 0) { + list.add(StatCollector.translateToLocalFormatted("food.stat.saturation.name", + decimal_format.format(mfSaturation))); + } + if (staminaRestore > 0) { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminaPlus.name", (int) staminaRestore)); + } + if (staminaBuff > 0) { + if (staminaInHours) { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffHours.name", + decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds / 3600F))); + } else if (staminaInMinutes) { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffMinutes.name", + decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds / 60F))); + } else { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffSeconds.name", + decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds))); + } + } + if (staminaRegenBuff > 0) { + if (staminaRegenInMinutes) { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffRegenMinutes.name", + decimal_format.format(staminaRegenBuff), decimal_format.format(staminaRegenSeconds / 60F))); + } else { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffRegenSeconds.name", + decimal_format.format(staminaRegenBuff), decimal_format.format(staminaRegenSeconds))); + } + } + } + if (this == FoodListMF.berriesJuicy) { + list.add(StatCollector.translateToLocal("food.stat.cure.poison")); + } + } + public int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - int lvl = itemRarity+1; - - if(item.isItemEnchanted()) - { - if(lvl == 0) - { + + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = itemRarity + 1; + + if (item.isItemEnchanted()) { + if (lvl == 0) { lvl++; } - lvl ++; + lvl++; } - if(lvl >= ToolListMF.rarity.length) - { - lvl = ToolListMF.rarity.length-1; + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; } return ToolListMF.rarity[lvl]; } - + private boolean hasEffect = false; private float staminaBuff = 0F; private int staminaSeconds = 0; private boolean staminaInMinutes = false; private boolean staminaInHours = false; - + private float staminaRegenBuff = 0F; private int staminaRegenSeconds = 0; private boolean staminaRegenInMinutes = false; - + private static final String leftOverNbt = "MF_Food_leftover"; - public ItemFoodMF setReturnItem(Item item) - { + public ItemFoodMF setReturnItem(Item item) { leftOver = item; return this; } + @Override - public ItemStack onEaten(ItemStack food, World world, EntityPlayer consumer) - { - setEatDelay(consumer, 10); - consumer.getFoodStats().func_151686_a(this, food); - world.playSoundAtEntity(consumer, "random.burp", 0.5F, world.rand.nextFloat() * 0.1F + 0.9F); - this.onMFFoodEaten(food, world, consumer); - - if(this.isDamageable())//Multifood - { - if(food.attemptDamageItem(1, consumer.getRNG())) - { - --food.stackSize; - if(food.stackSize < 0) - { - food.stackSize = 0; - } - } - } - else//Food - { - ItemStack left = getLeftOver(food); - if(left != null) - { - if(food.stackSize == 1) - { - return left; - } - if(!consumer.inventory.addItemStackToInventory(left) && !consumer.worldObj.isRemote) - { - consumer.entityDropItem(left, 1.0F); - } - } - -- food.stackSize; - } - return food; - } - - public static void setLeftOver(ItemStack food, ItemStack leftover) - { - if(!food.hasTagCompound()) + public ItemStack onEaten(ItemStack food, World world, EntityPlayer consumer) { + setEatDelay(consumer, 10); + consumer.getFoodStats().func_151686_a(this, food); + world.playSoundAtEntity(consumer, "random.burp", 0.5F, world.rand.nextFloat() * 0.1F + 0.9F); + this.onMFFoodEaten(food, world, consumer); + + if (this.isDamageable())// Multifood + { + if (food.attemptDamageItem(1, consumer.getRNG())) { + --food.stackSize; + if (food.stackSize < 0) { + food.stackSize = 0; + } + } + } else// Food { + ItemStack left = getLeftOver(food); + if (left != null) { + if (food.stackSize == 1) { + return left; + } + if (!consumer.inventory.addItemStackToInventory(left) && !consumer.worldObj.isRemote) { + consumer.entityDropItem(left, 1.0F); + } + } + --food.stackSize; + } + return food; + } + + public static void setLeftOver(ItemStack food, ItemStack leftover) { + if (!food.hasTagCompound()) { food.setTagCompound(new NBTTagCompound()); } NBTTagCompound savedItem = new NBTTagCompound(); @@ -307,74 +278,63 @@ public static void setLeftOver(ItemStack food, ItemStack leftover) food.getTagCompound().setTag(leftOverNbt, savedItem); } - protected ItemStack getLeftOver(ItemStack food) - { - if(food.hasTagCompound() && food.getTagCompound().hasKey(leftOverNbt)) - { + protected ItemStack getLeftOver(ItemStack food) { + if (food.hasTagCompound() && food.getTagCompound().hasKey(leftOverNbt)) { return ItemStack.loadItemStackFromNBT(food.getTagCompound().getCompoundTag(leftOverNbt)); } - if(leftOver != null) - { + if (leftOver != null) { return new ItemStack(leftOver); } return getContainerItem(food); } @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { ItemStack food = new ItemStack(item); - if(this.getUnlocalizedName().contains("stew")) - { + if (this.getUnlocalizedName().contains("stew")) { setLeftOver(food, new ItemStack(Items.bowl)); } list.add(food); } + private int useTime = 32; - - public ItemFoodMF setEatTime(int i) - { + + public ItemFoodMF setEatTime(int i) { useTime = i; return this; } - + @Override - public int getMaxItemUseDuration(ItemStack item) - { - return useTime; - } + public int getMaxItemUseDuration(ItemStack item) { + return useTime; + } - public static void onTick(EntityPlayer player) - { + public static void onTick(EntityPlayer player) { int time = getEatDelay(player); - if(time > 0) - { - time --; + if (time > 0) { + time--; setEatDelay(player, time); } } - private static void setEatDelay(EntityPlayer player, int time) - { - time += getEatDelay(player);//add to existing - - player.getEntityData().setInteger(eatDelayNBT , time); + private static void setEatDelay(EntityPlayer player, int time) { + time += getEatDelay(player);// add to existing + + player.getEntityData().setInteger(eatDelayNBT, time); } - private static int getEatDelay(EntityPlayer player) - { - if(player.getEntityData().hasKey(eatDelayNBT)) - { + + private static int getEatDelay(EntityPlayer player) { + if (player.getEntityData().hasKey(eatDelayNBT)) { return player.getEntityData().getInteger(eatDelayNBT); } return 0; } + @Override - public ItemStack onItemRightClick(ItemStack food, World world, EntityPlayer user) - { - if(getEatDelay(user) > 0) - { + public ItemStack onItemRightClick(ItemStack food, World world, EntityPlayer user) { + if (getEatDelay(user) > 0) { return food; } - return super.onItemRightClick(food, world, user); - } + return super.onItemRightClick(food, world, user); + } } diff --git a/src/main/java/minefantasy/mf2/item/food/ItemMultiFood.java b/src/main/java/minefantasy/mf2/item/food/ItemMultiFood.java index cf600881..4ca273d9 100644 --- a/src/main/java/minefantasy/mf2/item/food/ItemMultiFood.java +++ b/src/main/java/minefantasy/mf2/item/food/ItemMultiFood.java @@ -1,58 +1,51 @@ package minefantasy.mf2.item.food; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class ItemMultiFood extends ItemFoodMF -{ +public class ItemMultiFood extends ItemFoodMF { private IIcon[] icons; private int bites = 6; - public ItemMultiFood(String name, int bites, int hunger, float saturation, int rarity) - { + + public ItemMultiFood(String name, int bites, int hunger, float saturation, int rarity) { this(name, bites, hunger, saturation, false, rarity); } - public ItemMultiFood(String name, int bites, int hunger, float saturation, boolean meat, int rarity) - { + + public ItemMultiFood(String name, int bites, int hunger, float saturation, boolean meat, int rarity) { super(name, hunger, saturation, meat, rarity); setMaxStackSize(1); this.bites = bites; - setMaxDamage(bites-1); + setMaxDamage(bites - 1); } - + @Override @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int damage) - { - int index = MathHelper.clamp_int(damage, 0, bites-1); - return this.icons[index]; - } - + public IIcon getIconFromDamage(int damage) { + int index = MathHelper.clamp_int(damage, 0, bites - 1); + return this.icons[index]; + } + @Override - public boolean isRepairable() - { + public boolean isRepairable() { return false; - } - + } + @Override - public boolean isItemTool(ItemStack item) - { + public boolean isItemTool(ItemStack item) { return false; } + @Override @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister register) - { - this.icons = new IIcon[bites]; - - for (int i = 0; i < bites; ++i) - { - this.icons[i] = register.registerIcon(this.getIconString() + "_" + i); - } - } + public void registerIcons(IIconRegister register) { + this.icons = new IIcon[bites]; + + for (int i = 0; i < bites; ++i) { + this.icons[i] = register.registerIcon(this.getIconString() + "_" + i); + } + } } diff --git a/src/main/java/minefantasy/mf2/item/food/ItemUnfinishedFood.java b/src/main/java/minefantasy/mf2/item/food/ItemUnfinishedFood.java index 1540e3f1..12a903a6 100644 --- a/src/main/java/minefantasy/mf2/item/food/ItemUnfinishedFood.java +++ b/src/main/java/minefantasy/mf2/item/food/ItemUnfinishedFood.java @@ -1,5 +1,6 @@ package minefantasy.mf2.item.food; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; @@ -7,48 +8,43 @@ import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import cpw.mods.fml.common.registry.GameRegistry; + /** * @author Anonymous Productions */ -public class ItemUnfinishedFood extends Item -{ - public ItemUnfinishedFood(String name) - { +public class ItemUnfinishedFood extends Item { + public ItemUnfinishedFood(String name) { this(name, 0); } - public ItemUnfinishedFood(String name, int rarity) - { + + public ItemUnfinishedFood(String name, int rarity) { super(); setMaxStackSize(1); itemRarity = rarity; - setTextureName("minefantasy2:food/unfinished/"+name); + setTextureName("minefantasy2:food/unfinished/" + name); this.setCreativeTab(CreativeTabMF.tabFood); - GameRegistry.registerItem(this, "MF_UFood"+name, MineFantasyII.MODID); + GameRegistry.registerItem(this, "MF_UFood" + name, MineFantasyII.MODID); this.setUnlocalizedName(name); } - + private int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - int lvl = itemRarity+1; - - if(item.isItemEnchanted()) - { - if(lvl == 0) - { + + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = itemRarity + 1; + + if (item.isItemEnchanted()) { + if (lvl == 0) { lvl++; } - lvl ++; + lvl++; } - if(lvl >= ToolListMF.rarity.length) - { - lvl = ToolListMF.rarity.length-1; + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; } return ToolListMF.rarity[lvl]; } - public void onCrafted(EntityPlayer user, ItemStack item) - { + + public void onCrafted(EntityPlayer user, ItemStack item) { } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/EnumCasingType.java b/src/main/java/minefantasy/mf2/item/gadget/EnumCasingType.java index 7ffcd9c5..420378cb 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/EnumCasingType.java +++ b/src/main/java/minefantasy/mf2/item/gadget/EnumCasingType.java @@ -1,42 +1,32 @@ package minefantasy.mf2.item.gadget; -public enum EnumCasingType -{ - CRUDE("crude", 0.5F, 3F, 1.0F), - CERAMIC("ceramic", 1.0F, 5F, 1.0F), - IRON("iron", 1.5F, 4F, 2.0F), - OBSIDIAN("obsidian",2.0F, 4F, 1.5F), - CRYSTAL("crystal", 1.5F, 5F, 0.75F); - +public enum EnumCasingType { + CRUDE("crude", 0.5F, 3F, 1.0F), CERAMIC("ceramic", 1.0F, 5F, 1.0F), IRON("iron", 1.5F, 4F, + 2.0F), OBSIDIAN("obsidian", 2.0F, 4F, 1.5F), CRYSTAL("crystal", 1.5F, 5F, 0.75F); + public String name; public float damageModifier; public float rangeModifier; public float weightModifier; - - private EnumCasingType(String name, float damage, float range, float weight) - { + + private EnumCasingType(String name, float damage, float range, float weight) { this.name = name; this.damageModifier = damage; this.rangeModifier = range; this.weightModifier = weight; } - - public static EnumCasingType getType(byte i) - { - if(i == -1) - { + + public static EnumCasingType getType(byte i) { + if (i == -1) { return CRUDE; } - if(i == 1) - { + if (i == 1) { return IRON; } - if(i == 2) - { + if (i == 2) { return OBSIDIAN; } - if(i == 3) - { + if (i == 3) { return CRYSTAL; } return CERAMIC; diff --git a/src/main/java/minefantasy/mf2/item/gadget/EnumExplosiveType.java b/src/main/java/minefantasy/mf2/item/gadget/EnumExplosiveType.java index 5e22b1fb..a9375e0b 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/EnumExplosiveType.java +++ b/src/main/java/minefantasy/mf2/item/gadget/EnumExplosiveType.java @@ -1,30 +1,23 @@ package minefantasy.mf2.item.gadget; -public enum EnumExplosiveType -{ - BASIC("basic", 24F, 1.0F), - SHRAPNEL("shrapnel", 32F, 1.0F), - FIRE("fire", 40F, 1.0F); - +public enum EnumExplosiveType { + BASIC("basic", 24F, 1.0F), SHRAPNEL("shrapnel", 32F, 1.0F), FIRE("fire", 40F, 1.0F); + public String name; public float damage; public float range; - - private EnumExplosiveType(String name, float damage, float range) - { + + private EnumExplosiveType(String name, float damage, float range) { this.name = name; this.damage = damage; this.range = range; } - - public static EnumExplosiveType getType(byte i) - { - if(i == 1) - { + + public static EnumExplosiveType getType(byte i) { + if (i == 1) { return SHRAPNEL; } - if(i == 2) - { + if (i == 2) { return FIRE; } return BASIC; diff --git a/src/main/java/minefantasy/mf2/item/gadget/EnumFuseType.java b/src/main/java/minefantasy/mf2/item/gadget/EnumFuseType.java index b5a64871..053added 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/EnumFuseType.java +++ b/src/main/java/minefantasy/mf2/item/gadget/EnumFuseType.java @@ -1,23 +1,18 @@ package minefantasy.mf2.item.gadget; -public enum EnumFuseType -{ - BASIC("basic", 30), - LONGFUSE("long", 60); - +public enum EnumFuseType { + BASIC("basic", 30), LONGFUSE("long", 60); + public String name; public int time; - - private EnumFuseType(String name, int time) - { + + private EnumFuseType(String name, int time) { this.name = name; this.time = time; } - - public static EnumFuseType getType(byte i) - { - if(i == 1) - { + + public static EnumFuseType getType(byte i) { + if (i == 1) { return LONGFUSE; } return BASIC; diff --git a/src/main/java/minefantasy/mf2/item/gadget/EnumPowderType.java b/src/main/java/minefantasy/mf2/item/gadget/EnumPowderType.java index 20a80241..4c802972 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/EnumPowderType.java +++ b/src/main/java/minefantasy/mf2/item/gadget/EnumPowderType.java @@ -1,25 +1,20 @@ package minefantasy.mf2.item.gadget; -public enum EnumPowderType -{ - BLACKPOWDER("blackpowder", 1.0F, 1.0F), - ADVBLACKPOWDER("advBlackpowder", 1.5F, 1.0F); - +public enum EnumPowderType { + BLACKPOWDER("blackpowder", 1.0F, 1.0F), ADVBLACKPOWDER("advBlackpowder", 1.5F, 1.0F); + public String name; public float damageModifier; public float rangeModifier; - - private EnumPowderType(String name, float damage, float range) - { + + private EnumPowderType(String name, float damage, float range) { this.name = name; this.damageModifier = damage; this.rangeModifier = range; } - - public static EnumPowderType getType(byte i) - { - if(i == 1) - { + + public static EnumPowderType getType(byte i) { + if (i == 1) { return ADVBLACKPOWDER; } return BLACKPOWDER; diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemArtefactLoot.java b/src/main/java/minefantasy/mf2/item/gadget/ItemArtefactLoot.java index 55de42d7..7880cbe0 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemArtefactLoot.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemArtefactLoot.java @@ -1,29 +1,9 @@ package minefantasy.mf2.item.gadget; -import java.util.Random; - -import cpw.mods.fml.common.registry.GameRegistry; -import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.item.ItemComponentMF; -import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.ToolListMF; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.WeightedRandomChestContent; -import net.minecraft.world.World; -import net.minecraftforge.common.ChestGenHooks; - -public class ItemArtefactLoot extends ItemLootSack -{ - public ItemArtefactLoot(String name, String pool, int ammount) - { +public class ItemArtefactLoot extends ItemLootSack { + public ItemArtefactLoot(String name, String pool, int ammount) { super(name, ammount, 2); - this.pool=pool; - setTextureName("minefantasy2:artefact/box/"+name); + this.pool = pool; + setTextureName("minefantasy2:artefact/box/" + name); } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemBomb.java b/src/main/java/minefantasy/mf2/item/gadget/ItemBomb.java index 1ba07ed9..3d4df858 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemBomb.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemBomb.java @@ -27,328 +27,293 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class ItemBomb extends Item implements ISpecialSalvage, IAmmo -{ - public ItemBomb(String name) - { - this.maxStackSize = 16; - this.setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/"+name); +public class ItemBomb extends Item implements ISpecialSalvage, IAmmo { + public ItemBomb(String name) { + this.maxStackSize = 16; + this.setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); BlockDispenser.dispenseBehaviorRegistry.putObject(this, new BombDispenser()); - } - - @Override - public EnumAction getItemUseAction(ItemStack item) - { - return EnumAction.block; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(!user.isSwingInProgress) - { - world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "fire.ignite", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F); - world.playSoundEffect(user.posX, user.posY+1.5, user.posZ, "game.tnt.primed", 1.0F, 1.0F); - user.setItemInUse(item, getMaxItemUseDuration(item)); - } - return item; - } - @Override - public int getMaxItemUseDuration(ItemStack item) - { - return 15; - } - @Override - public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) - { - user.swingItem(); - if (!user.capabilities.isCreativeMode) - { - --item.stackSize; - } - - if (!world.isRemote) - { - EntityBomb bomb = new EntityBomb(world, user).setType(getFilling(item), getCasing(item), getFuse(item), getPowder(item)); - world.spawnEntityInWorld(bomb); - if(item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) - { - bomb.getEntityData().setBoolean("stickyBomb", true); - } - } - return item; - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { - super.addInformation(item, user, list, fullInfo); - - if(item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) - { - list.add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("bomb.case.sticky") + EnumChatFormatting.GRAY); - } - EnumExplosiveType fill = EnumExplosiveType.getType(getFilling(item)); - EnumCasingType casing = EnumCasingType.getType(getCasing(item)); - EnumFuseType fuse = EnumFuseType.getType(getFuse(item)); - EnumPowderType powder = EnumPowderType.getType(getPowder(item)); - - int damage = (int) (fill.damage*casing.damageModifier*powder.damageModifier); - float range = fill.range*casing.rangeModifier*powder.rangeModifier; - float fusetime = (float)fuse.time/20F; - - list.add(StatCollector.translateToLocal("bomb.case."+casing.name+".name")); - list.add(StatCollector.translateToLocal("bomb.powder."+powder.name+".name")); - list.add(StatCollector.translateToLocal("bomb.fuse."+fuse.name+".name")); - list.add(""); - list.add(StatCollector.translateToLocalFormatted("bomb.fusetime.name", fusetime)); - list.add(StatCollector.translateToLocal("bomb.damage.name")+": "+damage); - list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); - } - @Override - public String getUnlocalizedName(ItemStack item) - { - EnumExplosiveType type = EnumExplosiveType.getType(getFilling(item)); - return "item.bomb_"+type.name; - } - private static final String powderNBT = "MineFantasy_PowderType"; - private static final String fuseNBT = "MineFantasy_FuseType"; - private static final String fillingNBT = "MineFantasy_ExplosiveType"; - private static final String casingNBT = "MineFantasy_CaseType"; - - public static void setSticky(ItemStack item) - { - NBTTagCompound nbt = getNBT(item); - nbt.setBoolean("stickyBomb", true); - } - - public static void setFuse(ItemStack item, byte fuse) - { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(fuseNBT, fuse); - } - public static byte getFuse(ItemStack item) - { - NBTTagCompound nbt = getNBT(item); - if(item.getItem() instanceof ItemBomb) - { - return ((ItemBomb)item.getItem()).getItemFuse(nbt.getByte(fuseNBT)); - } + } + + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.block; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!user.isSwingInProgress) { + world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "fire.ignite", 1.0F, + itemRand.nextFloat() * 0.4F + 0.8F); + world.playSoundEffect(user.posX, user.posY + 1.5, user.posZ, "game.tnt.primed", 1.0F, 1.0F); + user.setItemInUse(item, getMaxItemUseDuration(item)); + } + return item; + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + return 15; + } + + @Override + public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { + user.swingItem(); + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + + if (!world.isRemote) { + EntityBomb bomb = new EntityBomb(world, user).setType(getFilling(item), getCasing(item), getFuse(item), + getPowder(item)); + world.spawnEntityInWorld(bomb); + if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { + bomb.getEntityData().setBoolean("stickyBomb", true); + } + } + return item; + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); + + if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { + list.add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("bomb.case.sticky") + + EnumChatFormatting.GRAY); + } + EnumExplosiveType fill = EnumExplosiveType.getType(getFilling(item)); + EnumCasingType casing = EnumCasingType.getType(getCasing(item)); + EnumFuseType fuse = EnumFuseType.getType(getFuse(item)); + EnumPowderType powder = EnumPowderType.getType(getPowder(item)); + + int damage = (int) (fill.damage * casing.damageModifier * powder.damageModifier); + float range = fill.range * casing.rangeModifier * powder.rangeModifier; + float fusetime = fuse.time / 20F; + + list.add(StatCollector.translateToLocal("bomb.case." + casing.name + ".name")); + list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); + list.add(StatCollector.translateToLocal("bomb.fuse." + fuse.name + ".name")); + list.add(""); + list.add(StatCollector.translateToLocalFormatted("bomb.fusetime.name", fusetime)); + list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); + list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); + } + + @Override + public String getUnlocalizedName(ItemStack item) { + EnumExplosiveType type = EnumExplosiveType.getType(getFilling(item)); + return "item.bomb_" + type.name; + } + + private static final String powderNBT = "MineFantasy_PowderType"; + private static final String fuseNBT = "MineFantasy_FuseType"; + private static final String fillingNBT = "MineFantasy_ExplosiveType"; + private static final String casingNBT = "MineFantasy_CaseType"; + + public static void setSticky(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + nbt.setBoolean("stickyBomb", true); + } + + public static void setFuse(ItemStack item, byte fuse) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(fuseNBT, fuse); + } + + public static byte getFuse(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (item.getItem() instanceof ItemBomb) { + return ((ItemBomb) item.getItem()).getItemFuse(nbt.getByte(fuseNBT)); + } return nbt.getByte(fuseNBT); - } - - public static void setPowder(ItemStack item, byte powder) - { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(powderNBT, powder); - } - public static byte getPowder(ItemStack item) - { - NBTTagCompound nbt = getNBT(item); - if(item.getItem() instanceof ItemBomb) - { - return ((ItemBomb)item.getItem()).getItemPowder(nbt.getByte(powderNBT)); - } + } + + public static void setPowder(ItemStack item, byte powder) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(powderNBT, powder); + } + + public static byte getPowder(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (item.getItem() instanceof ItemBomb) { + return ((ItemBomb) item.getItem()).getItemPowder(nbt.getByte(powderNBT)); + } return nbt.getByte(powderNBT); - } - /** - * 0 = Basic - * 1 = Shrapnel - * 2 = Fire - */ - public static void setFilling(ItemStack item, byte filling) - { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(fillingNBT, filling); - } - public static byte getFilling(ItemStack item) - { - NBTTagCompound nbt = getNBT(item); - if(item.getItem() instanceof ItemBomb) - { - return ((ItemBomb)item.getItem()).getItemFilling(nbt.getByte(fillingNBT)); - } + } + + /** + * 0 = Basic 1 = Shrapnel 2 = Fire + */ + public static void setFilling(ItemStack item, byte filling) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(fillingNBT, filling); + } + + public static byte getFilling(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (item.getItem() instanceof ItemBomb) { + return ((ItemBomb) item.getItem()).getItemFilling(nbt.getByte(fillingNBT)); + } return nbt.getByte(fillingNBT); - } - - /** - * 0 = Ceramic - * 1 = Iron - */ - public static void setCasing(ItemStack item, byte casing) - { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(casingNBT, casing); - } - public static byte getCasing(ItemStack item) - { - NBTTagCompound nbt = getNBT(item); - if(item.getItem() instanceof ItemBomb) - { - return ((ItemBomb)item.getItem()).getItemCasing(nbt.getByte(casingNBT)); - } + } + + /** + * 0 = Ceramic 1 = Iron + */ + public static void setCasing(ItemStack item, byte casing) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(casingNBT, casing); + } + + public static byte getCasing(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (item.getItem() instanceof ItemBomb) { + return ((ItemBomb) item.getItem()).getItemCasing(nbt.getByte(casingNBT)); + } return nbt.getByte(casingNBT); - } - - public static NBTTagCompound getNBT(ItemStack item) - { - if(!item.hasTagCompound())item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - public static ItemStack createExplosive(Item item, byte casing, byte filling, byte fuse, byte powder, int stackSize, boolean sticky) - { - ItemStack bomb = new ItemStack(item, stackSize); - setFilling(bomb, filling); - setCasing(bomb, casing); - setFuse(bomb, fuse); - setPowder(bomb, powder); - if(sticky) - { - setSticky(bomb); - } - return bomb; - } - - public static ItemStack createExplosive(Item item, byte casing, byte filling, byte fuse, byte powder, int stackSize) - { - return createExplosive(item, casing, filling, fuse, powder, stackSize, false); - } - - public ItemStack createBomb(byte casing, byte filling, byte fuse, byte powder, int stackSize) - { - return ItemBomb.createExplosive(this, casing, filling, fuse, powder, stackSize); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - list.add(createBomb((byte)0, (byte)0, (byte)0, (byte)0, 1)); - list.add(createBomb((byte)0, (byte)1, (byte)0, (byte)0, 1)); - list.add(createBomb((byte)0, (byte)2, (byte)0, (byte)0, 1)); - - list.add(createBomb((byte)1, (byte)0, (byte)0, (byte)0, 1)); - list.add(createBomb((byte)1, (byte)1, (byte)0, (byte)0, 1)); - list.add(createBomb((byte)1, (byte)2, (byte)0, (byte)0, 1)); - - list.add(createBomb((byte)2, (byte)0, (byte)0, (byte)0, 1)); - list.add(createBomb((byte)2, (byte)1, (byte)0, (byte)0, 1)); - list.add(createBomb((byte)2, (byte)2, (byte)0, (byte)0, 1)); - - list.add(createBomb((byte)3, (byte)0, (byte)0, (byte)0, 1)); - list.add(createBomb((byte)3, (byte)1, (byte)0, (byte)0, 1)); - list.add(createBomb((byte)3, (byte)2, (byte)0, (byte)0, 1)); - } - - //TODO Icons - @SideOnly(Side.CLIENT) - public IIcon getIcon(byte type) - { - if(type < 0) - { - return ToolListMF.bomb_crude.getIcon(type); - } + } + + public static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + public static ItemStack createExplosive(Item item, byte casing, byte filling, byte fuse, byte powder, int stackSize, + boolean sticky) { + ItemStack bomb = new ItemStack(item, stackSize); + setFilling(bomb, filling); + setCasing(bomb, casing); + setFuse(bomb, fuse); + setPowder(bomb, powder); + if (sticky) { + setSticky(bomb); + } + return bomb; + } + + public static ItemStack createExplosive(Item item, byte casing, byte filling, byte fuse, byte powder, + int stackSize) { + return createExplosive(item, casing, filling, fuse, powder, stackSize, false); + } + + public ItemStack createBomb(byte casing, byte filling, byte fuse, byte powder, int stackSize) { + return ItemBomb.createExplosive(this, casing, filling, fuse, powder, stackSize); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(createBomb((byte) 0, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 0, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 0, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createBomb((byte) 1, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 1, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createBomb((byte) 2, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 2, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 2, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createBomb((byte) 3, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 3, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 3, (byte) 2, (byte) 0, (byte) 0, 1)); + } + + // TODO Icons + @SideOnly(Side.CLIENT) + public IIcon getIcon(byte type) { + if (type < 0) { + return ToolListMF.bomb_crude.getIcon(type); + } + return bombs[type]; + } + + public IIcon[] icons = new IIcon[2]; + private IIcon[] bombs = new IIcon[4]; + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + icons[0] = reg.registerIcon("minefantasy2:Other/bomb_icon_shrapnel"); + icons[1] = reg.registerIcon("minefantasy2:Other/bomb_icon_fire"); + + this.itemIcon = bombs[0] = reg.registerIcon("minefantasy2:Other/bomb_ceramic"); + bombs[1] = reg.registerIcon("minefantasy2:Other/bomb_iron"); + bombs[2] = reg.registerIcon("minefantasy2:Other/bomb_obsidian"); + bombs[3] = reg.registerIcon("minefantasy2:Other/bomb_crystal"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack item) { + int type = getCasing(item); return bombs[type]; } - public IIcon[] icons = new IIcon[2]; - private IIcon[] bombs = new IIcon[4]; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - icons[0] = reg.registerIcon("minefantasy2:Other/bomb_icon_shrapnel"); - icons[1] = reg.registerIcon("minefantasy2:Other/bomb_icon_fire"); - - this.itemIcon = bombs[0] = reg.registerIcon("minefantasy2:Other/bomb_ceramic"); - bombs[1] = reg.registerIcon("minefantasy2:Other/bomb_iron"); - bombs[2] = reg.registerIcon("minefantasy2:Other/bomb_obsidian"); - bombs[3] = reg.registerIcon("minefantasy2:Other/bomb_crystal"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconIndex(ItemStack item) - { - int type = getCasing(item); - return bombs[type]; - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack item, int layer) - { - boolean sticky = item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb"); - if(layer == 0 && sticky) - { - return Items.slime_ball.getIconFromDamage(0); - } - if(layer > (sticky ? 1 : 0)) - { - int type = getFilling(item); - if(type != 0) - { - return icons[type-1]; - } - } - return getIconIndex(item); - } - - @Override + + @Override + @SideOnly(Side.CLIENT) + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack item, int layer) { + boolean sticky = item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb"); + if (layer == 0 && sticky) { + return Items.slime_ball.getIconFromDamage(0); + } + if (layer > (sticky ? 1 : 0)) { + int type = getFilling(item); + if (type != 0) { + return icons[type - 1]; + } + } + return getIconIndex(item); + } + + @Override @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return true; - } - - @Override - public EnumRarity getRarity(ItemStack item) - { - if(getFilling(item) >= 2 || getCasing(item) >= 2) - { - return EnumRarity.uncommon; - } - return EnumRarity.common; - } + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + if (getFilling(item) >= 2 || getCasing(item) >= 2) { + return EnumRarity.uncommon; + } + return EnumRarity.common; + } @Override - public Object[] getSalvage(ItemStack item) - { - return new Object[] - { - ItemBombComponent.getBombComponent("bombcase", getCasing(item)), - ItemBombComponent.getBombComponent("fuse", getFuse(item)), - ItemBombComponent.getBombComponent("powder", getPowder(item)), - ItemBombComponent.getBombComponent("filling", getFilling(item)), - }; - } - - public byte getItemFuse(byte value) - { + public Object[] getSalvage(ItemStack item) { + return new Object[] { ItemBombComponent.getBombComponent("bombcase", getCasing(item)), + ItemBombComponent.getBombComponent("fuse", getFuse(item)), + ItemBombComponent.getBombComponent("powder", getPowder(item)), + ItemBombComponent.getBombComponent("filling", getFilling(item)), }; + } + + public byte getItemFuse(byte value) { return value; } - public byte getItemFilling(byte value) - { + + public byte getItemFilling(byte value) { return value; } - public byte getItemCasing(byte value) - { + + public byte getItemCasing(byte value) { return value; } - public byte getItemPowder(byte value) - { + + public byte getItemPowder(byte value) { return value; } - + @Override public String getAmmoType(ItemStack arrow) { return "mine"; diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemBombComponent.java b/src/main/java/minefantasy/mf2/item/gadget/ItemBombComponent.java index 8263f33b..6181361f 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemBombComponent.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemBombComponent.java @@ -3,65 +3,58 @@ import java.util.HashMap; import java.util.List; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.crafting.ISalvageDrop; import minefantasy.mf2.api.crafting.engineer.IBombComponent; import minefantasy.mf2.item.ItemComponentMF; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; -public class ItemBombComponent extends ItemComponentMF implements IBombComponent, ISalvageDrop -{ +public class ItemBombComponent extends ItemComponentMF implements IBombComponent, ISalvageDrop { private static HashMap components = new HashMap(); - + private byte tier; private String type; - public ItemBombComponent(String name, String type, int tier) - { + + public ItemBombComponent(String name, String type, int tier) { this(name, 0, type, tier); } - + @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { - list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("bomb.component.name")); + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("bomb.component.name")); list.add(EnumChatFormatting.ITALIC + StatCollector.translateToLocal("bomb.component." + type)); } - public ItemBombComponent(String name, int rarity, String type, int tier) - { + + public ItemBombComponent(String name, int rarity, String type, int tier) { super(name, rarity); this.type = type; - this.tier = (byte)tier; - components.put(type+tier, this); + this.tier = (byte) tier; + components.put(type + tier, this); } @Override - public String getComponentType() - { + public String getComponentType() { return type; } @Override - public byte getTier() - { + public byte getTier() { return tier; } - public static Item getBombComponent(String name, int tier) - { - return components.get(name+tier); + public static Item getBombComponent(String name, int tier) { + return components.get(name + tier); } @Override - public boolean canSalvage(EntityPlayer user, ItemStack item) - { - if(getContainerItem() != null) - { + public boolean canSalvage(EntityPlayer user, ItemStack item) { + if (getContainerItem() != null) { return false; } return true; diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemClimbingPick.java b/src/main/java/minefantasy/mf2/item/gadget/ItemClimbingPick.java index 4f480225..a62cf70c 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemClimbingPick.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemClimbingPick.java @@ -1,195 +1,155 @@ package minefantasy.mf2.item.gadget; -import java.util.ArrayList; -import java.util.Iterator; import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.api.tier.IToolMaterial; -import minefantasy.mf2.config.ConfigTools; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.item.tool.ToolMaterialMF; import minefantasy.mf2.item.weapon.ItemWeaponMF; import net.minecraft.block.Block; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumAction; import net.minecraft.item.EnumRarity; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; /** * @author Anonymous Productions */ -public class ItemClimbingPick extends ItemPickaxe implements IToolMaterial -{ +public class ItemClimbingPick extends ItemPickaxe implements IToolMaterial { private Random rand = new Random(); - - public ItemClimbingPick(String name, ToolMaterial material, int rarity) - { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabGadget); - - setTextureName("minefantasy2:Other/"+name); + + public ItemClimbingPick(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabGadget); + + setTextureName("minefantasy2:Other/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); setMaxDamage(material.getMaxUses()); - } - - private int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - int lvl = itemRarity+1; - - if(item.isItemEnchanted()) - { - if(lvl == 0) - { + } + + private int itemRarity; + + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = itemRarity + 1; + + if (item.isItemEnchanted()) { + if (lvl == 0) { lvl++; } - lvl ++; + lvl++; } - if(lvl >= ToolListMF.rarity.length) - { - lvl = ToolListMF.rarity.length-1; + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; } return ToolListMF.rarity[lvl]; } - - @Override - public ToolMaterial getMaterial() - { + + @Override + public ToolMaterial getMaterial() { return toolMaterial; } - + @Override - public int getMaxDamage(ItemStack stack) - { + public int getMaxDamage(ItemStack stack) { return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); } - - public boolean isInWall(EntityPlayer player, boolean init) - { - if(player.getHeldItem() == null)return false; - + + public boolean isInWall(EntityPlayer player, boolean init) { + if (player.getHeldItem() == null) + return false; + World world = player.worldObj; MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - if (movingobjectposition == null) - { + if (movingobjectposition == null) { return false; - } else - { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { int x = movingobjectposition.blockX; int y = movingobjectposition.blockY; int z = movingobjectposition.blockZ; - + NBTTagCompound nbt = getOrCreateNBT(player.getHeldItem()); - if(init) - { + if (init) { nbt.setInteger("MF_HeldPosX", x); nbt.setInteger("MF_HeldPosY", y); nbt.setInteger("MF_HeldPosZ", z); - } - else - { + } else { int x1 = nbt.getInteger("MF_HeldPosX"); int y1 = nbt.getInteger("MF_HeldPosY"); int z1 = nbt.getInteger("MF_HeldPosZ"); - - if(x1 != x || y1 != y || z1 != z) - { + + if (x1 != x || y1 != y || z1 != z) { player.stopUsingItem(); return false; } } - + Block block = world.getBlock(x, y, z); - - if(player.posY < (y+2.8F) && player.posY > (y-3) && player.getDistance(x+0.5, player.posY, z+0.5) < 1D && player.fallDistance < 5 && block.getMaterial().isSolid() && block.isOpaqueCube()) - { + + if (player.posY < (y + 2.8F) && player.posY > (y - 3) + && player.getDistance(x + 0.5, player.posY, z + 0.5) < 1D && player.fallDistance < 5 + && block.getMaterial().isSolid() && block.isOpaqueCube()) { return true; } } } return false; } - - private NBTTagCompound getOrCreateNBT(ItemStack item) - { - if(!item.hasTagCompound()) - { + + private NBTTagCompound getOrCreateNBT(ItemStack item) { + if (!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } return item.getTagCompound(); } @Override - public void onUsingTick(ItemStack stack, EntityPlayer player, int count) - { + public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { float cost = 0.5F; - if(stack.getItemDamage() >= stack.getMaxDamage()) - { + if (stack.getItemDamage() >= stack.getMaxDamage()) { player.destroyCurrentEquippedItem(); } World world = player.worldObj; MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - if (movingobjectposition == null) - { - if(!world.isRemote && StaminaBar.isSystemActive && !tryPerformAbility(player, cost)) - { + if (movingobjectposition == null) { + if (!world.isRemote && StaminaBar.isSystemActive && !tryPerformAbility(player, cost)) { player.stopUsingItem(); } return; - } else - { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { int x = movingobjectposition.blockX; int y = movingobjectposition.blockY; int z = movingobjectposition.blockZ; Block block = world.getBlock(x, y, z); - - if(isInWall(player, false)) - { - if(!player.isSwingInProgress) - { + + if (isInWall(player, false)) { + if (!player.isSwingInProgress) { cost *= 0.5F; player.motionY = 0; - } - else - { - + } else { + player.fallDistance = 0; - if(!player.isSneaking() && player.posY < y+3) - { + if (!player.isSneaking() && player.posY < y + 3) { player.motionY = 0.05D; - } - else if(player.isSneaking() && player.posY > y-2) - { + } else if (player.isSneaking() && player.posY > y - 2) { player.motionY = -0.05D; cost *= 0.75F; - } - else - { + } else { player.motionY = 0; cost *= 0.5F; } @@ -197,55 +157,46 @@ else if(player.isSneaking() && player.posY > y-2) } } } - if(!world.isRemote && StaminaBar.isSystemActive && !tryPerformAbility(player, cost)) - { + if (!world.isRemote && StaminaBar.isSystemActive && !tryPerformAbility(player, cost)) { player.stopUsingItem(); } } - + @Override - public EnumAction getItemUseAction(ItemStack item) - { - return EnumAction.bow; - } + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.bow; + } + @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(user.isUsingItem())return item; - if(StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(user, true)) - { + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (user.isUsingItem()) + return item; + if (StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(user, true)) { return item; } - - if(isInWall(user, true)) - { + + if (isInWall(user, true)) { user.setItemInUse(item, getMaxItemUseDuration(item)); - if(!world.isRemote) - { + if (!world.isRemote) { item.damageItem(1, user); } - user.playSound("mob.sheep.shear", 1.0F, 2.0F); + user.playSound("mob.sheep.shear", 1.0F, 2.0F); } - return item; - } + return item; + } + @Override - public int getMaxItemUseDuration(ItemStack item) - { - return Integer.MAX_VALUE; - } - - public static boolean tryPerformAbility(EntityLivingBase user, float points) - { - if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) - { + public int getMaxItemUseDuration(ItemStack item) { + return Integer.MAX_VALUE; + } + + public static boolean tryPerformAbility(EntityLivingBase user, float points) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { points *= StaminaBar.getClimbinbDecayModifier(user, true); - if(StaminaBar.isStaminaAvailable(user, points, true)) - { + if (StaminaBar.isStaminaAvailable(user, points, true)) { ItemWeaponMF.applyFatigue(user, points); return true; - } - else - { + } else { return false; } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbow.java b/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbow.java index cc35152d..020f0c27 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbow.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbow.java @@ -38,380 +38,352 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class ItemCrossbow extends Item implements IFirearm, IDisplayMFAmmo, IDamageModifier, IRackItem, IDamageType, IScope, ISpecialSalvage -{ - public ItemCrossbow() - { - String name = "MF_CrossbowCustom"; - this.setCreativeTab(CreativeTabMF.tabGadget); +public class ItemCrossbow extends Item + implements IFirearm, IDisplayMFAmmo, IDamageModifier, IRackItem, IDamageType, IScope, ISpecialSalvage { + public ItemCrossbow() { + String name = "MF_CrossbowCustom"; + this.setCreativeTab(CreativeTabMF.tabGadget); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); this.setFull3D(); this.setTextureName("minefantasy2:gun/stock/cross_stock_wood"); this.setMaxDamage(150); this.setMaxStackSize(1); - } - - @Override - public EnumAction getItemUseAction(ItemStack item) - { - String action = getUseAction(item); - if(action.equalsIgnoreCase("reload")) - { - return EnumAction.block; - } - return EnumAction.bow; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(!world.isRemote && user.isSneaking() || AmmoMechanicsMF.isDepleted(item))//OPEN INV - { - user.openGui(MineFantasyII.instance, 1, user.worldObj, 1, 0, 0); - return item; - } - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); - if(loaded == null || user.isSwingInProgress)//RELOAD - { - startUse(user, item, "reload"); - return item; - } - else //FIRE - { - } - startUse(user, item, "fire"); - return item; - } - @Override - public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) - { - boolean infinity = EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, item) > 0; - user.swingItem(); - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); - ItemStack storage = AmmoMechanicsMF.getAmmo(item); - String action = getUseAction(item); - boolean shouldConsume = true; - - if(action.equalsIgnoreCase("reload")) + } + + @Override + public EnumAction getItemUseAction(ItemStack item) { + String action = getUseAction(item); + if (action.equalsIgnoreCase("reload")) { + return EnumAction.block; + } + return EnumAction.bow; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote && user.isSneaking() || AmmoMechanicsMF.isDepleted(item))// OPEN INV + { + user.openGui(MineFantasyII.instance, 1, user.worldObj, 1, 0, 0); + return item; + } + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); + if (loaded == null || user.isSwingInProgress)// RELOAD + { + startUse(user, item, "reload"); + return item; + } else // FIRE { - if(storage == null && infinity) - { - shouldConsume = false; - storage = CustomToolListMF.standard_bolt.construct("Magic"); - } - if(storage != null)//RELOAD + } + startUse(user, item, "fire"); + return item; + } + + @Override + public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { + boolean infinity = EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, item) > 0; + user.swingItem(); + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); + ItemStack storage = AmmoMechanicsMF.getAmmo(item); + String action = getUseAction(item); + boolean shouldConsume = true; + + if (action.equalsIgnoreCase("reload")) { + if (storage == null && infinity) { + shouldConsume = false; + storage = CustomToolListMF.standard_bolt.construct("Magic"); + } + if (storage != null)// RELOAD { - boolean success = false; - if(loaded == null) - { - ItemStack ammo = storage.copy(); - ammo.stackSize = 1; - if(shouldConsume) - AmmoMechanicsMF.consumeAmmo(user, item); - AmmoMechanicsMF.putAmmoOnFirearm(item, ammo); - success = true; - } - else if(loaded.isItemEqual(storage) && loaded.stackSize < getAmmoCapacity(item)) - { - if(shouldConsume) - AmmoMechanicsMF.consumeAmmo(user, item); + boolean success = false; + if (loaded == null) { + ItemStack ammo = storage.copy(); + ammo.stackSize = 1; + if (shouldConsume) + AmmoMechanicsMF.consumeAmmo(user, item); + AmmoMechanicsMF.putAmmoOnFirearm(item, ammo); + success = true; + } else if (loaded.isItemEqual(storage) && loaded.stackSize < getAmmoCapacity(item)) { + if (shouldConsume) + AmmoMechanicsMF.consumeAmmo(user, item); ++loaded.stackSize; AmmoMechanicsMF.putAmmoOnFirearm(item, loaded); success = true; } - if(success) - { + if (success) { user.playSound("random.click", 1.0F, 1.0F); } } } - return super.onEaten(item, world, user); - } - - @Override - public void onUsingTick(ItemStack item, EntityPlayer player, int time) - { - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); - int max = getMaxItemUseDuration(item); - - if(time == (max-5) && getUseAction(item).equalsIgnoreCase("reload") && (loaded == null || loaded.stackSize < getAmmoCapacity(item))) - { + return super.onEaten(item, world, user); + } + + @Override + public void onUsingTick(ItemStack item, EntityPlayer player, int time) { + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); + int max = getMaxItemUseDuration(item); + + if (time == (max - 5) && getUseAction(item).equalsIgnoreCase("reload") + && (loaded == null || loaded.stackSize < getAmmoCapacity(item))) { player.playSound("minefantasy2:weapon.crossbowload", 1.0F, 1 / (getFullValue(item, "speed") / 4F)); - } - } - @Override - public void onPlayerStoppedUsing(ItemStack item, World world, EntityPlayer user, int time) - { - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); - String action = getUseAction(item); - - if(action.equalsIgnoreCase("fire") && this.onFireArrow(user.worldObj, AmmoMechanicsMF.getArrowOnBow(item), item, user, this.getFullValue(item, "power"), false)) - { - if(loaded != null) - { + } + } + + @Override + public void onPlayerStoppedUsing(ItemStack item, World world, EntityPlayer user, int time) { + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); + String action = getUseAction(item); + + if (action.equalsIgnoreCase("fire") && this.onFireArrow(user.worldObj, AmmoMechanicsMF.getArrowOnBow(item), + item, user, this.getFullValue(item, "power"), false)) { + if (loaded != null) { --loaded.stackSize; AmmoMechanicsMF.putAmmoOnFirearm(item, (loaded.stackSize > 0 ? loaded : null)); } recoilUser(user, getFullValue(item, "recoil")); AmmoMechanicsMF.damageContainer(item, user, 1); } - stopUse(item); - } - public void startUse(EntityPlayer user, ItemStack item, String action) - { - setUseAction(item, action); - if(user != null) - user.setItemInUse(item, getMaxItemUseDuration(item)); - } - public void stopUse(ItemStack item) - { - startUse(null, item, "null"); - } - public static String useTypeNBT = "MF_ActionInUse"; - public static void setUseAction(ItemStack item, String action) - { - AmmoMechanicsMF.getNBT(item).setString(useTypeNBT, action); - } - public static String getUseAction(ItemStack item) - { - String action = AmmoMechanicsMF.getNBT(item).getString(useTypeNBT); - - return action != null ? action : "null"; - } - - private void recoilUser(EntityPlayer user, float value) - { - if(PowerArmour.isPowered(user)) - { - return; - } - float str = CombatMechanics.getStrengthEnhancement(user)+1; - value /= str; - - float angle = value; - user.rotationPitch -= itemRand.nextFloat()*angle; - user.rotationYawHead += itemRand.nextFloat()*angle-0.5F; + stopUse(item); + } + + public void startUse(EntityPlayer user, ItemStack item, String action) { + setUseAction(item, action); + if (user != null) + user.setItemInUse(item, getMaxItemUseDuration(item)); + } + + public void stopUse(ItemStack item) { + startUse(null, item, "null"); + } + + public static String useTypeNBT = "MF_ActionInUse"; + + public static void setUseAction(ItemStack item, String action) { + AmmoMechanicsMF.getNBT(item).setString(useTypeNBT, action); + } + + public static String getUseAction(ItemStack item) { + String action = AmmoMechanicsMF.getNBT(item).getString(useTypeNBT); + + return action != null ? action : "null"; + } + + private void recoilUser(EntityPlayer user, float value) { + if (PowerArmour.isPowered(user)) { + return; + } + float str = CombatMechanics.getStrengthEnhancement(user) + 1; + value /= str; + + float angle = value; + user.rotationPitch -= itemRand.nextFloat() * angle; + user.rotationYawHead += itemRand.nextFloat() * angle - 0.5F; } @Override - public int getMaxItemUseDuration(ItemStack item) - { + public int getMaxItemUseDuration(ItemStack item) { String action = getUseAction(item); - if(action.equalsIgnoreCase("reload")) - { - return (int)(getFullValue(item, "speed")*20F); - } + if (action.equalsIgnoreCase("reload")) { + return (int) (getFullValue(item, "speed") * 20F); + } return 72000; - } - + } + @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { - super.addInformation(item, user, list, fullInfo); - - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.power.name", getFullValue(item, "power"))); - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.speed.name", getFullValue(item, "speed"))); - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.recoil.name", getFullValue(item, "recoil"))); - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.spread.name", getFullValue(item, "spread"))); - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.capacity.name", getAmmoCapacity(item))); - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.bash.name", getMeleeDmg(item))); - } - - public String getItemStackDisplayName(ItemStack item) - { - String base = getNameModifier(item, "stock"); - String arms = getNameModifier(item, "mechanism"); - String mod = getNameModifier(item, "mod"); - - String fullName = "Crossbow"; - - if(base != null)fullName=base; - if(arms != null)fullName=arms + " " + fullName; - if(mod != null)fullName=mod + " " + fullName; - - return fullName; - } - private static final String partNBT = "MineFantasy_GunPiece_"; - - public static void setPart(String part, ItemStack item, int id) - { - NBTTagCompound nbt = getNBT(item); - nbt.setInteger(partNBT+part, id); - } - public static int getPart(String part, ItemStack item) - { - NBTTagCompound nbt = getNBT(item); - if(nbt.hasKey(partNBT+part)) - { - return nbt.getInteger(partNBT+part); - } - return -1; - } - - /** - * Constructs a crossbow with a list of parts - */ - public ItemStack constructCrossbow(ICrossbowPart...crossbowParts) - { - ItemStack crossbow = new ItemStack(this); - - for(ICrossbowPart part : crossbowParts) - { - if(part != null) - { - setPart(crossbow, part); - } - } - return crossbow; - } - /** - * Adds a part to a crossbow - */ - public ItemStack setPart(ItemStack item, ICrossbowPart part) - { - setPart(part.getComponentType(), item, part.getID()); - return item; - } - - public static NBTTagCompound getNBT(ItemStack item) - { - if(!item.hasTagCompound())item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack item, int layer) - { + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); + + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.power.name", getFullValue(item, "power"))); + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.speed.name", getFullValue(item, "speed"))); + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.recoil.name", + getFullValue(item, "recoil"))); + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.spread.name", + getFullValue(item, "spread"))); + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.capacity.name", getAmmoCapacity(item))); + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.bash.name", getMeleeDmg(item))); + } + + public String getItemStackDisplayName(ItemStack item) { + String base = getNameModifier(item, "stock"); + String arms = getNameModifier(item, "mechanism"); + String mod = getNameModifier(item, "mod"); + + String fullName = "Crossbow"; + + if (base != null) + fullName = base; + if (arms != null) + fullName = arms + " " + fullName; + if (mod != null) + fullName = mod + " " + fullName; + + return fullName; + } + + private static final String partNBT = "MineFantasy_GunPiece_"; + + public static void setPart(String part, ItemStack item, int id) { + NBTTagCompound nbt = getNBT(item); + nbt.setInteger(partNBT + part, id); + } + + public static int getPart(String part, ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (nbt.hasKey(partNBT + part)) { + return nbt.getInteger(partNBT + part); + } + return -1; + } + + /** + * Constructs a crossbow with a list of parts + */ + public ItemStack constructCrossbow(ICrossbowPart... crossbowParts) { + ItemStack crossbow = new ItemStack(this); + + for (ICrossbowPart part : crossbowParts) { + if (part != null) { + setPart(crossbow, part); + } + } + return crossbow; + } + + /** + * Adds a part to a crossbow + */ + public ItemStack setPart(ItemStack item, ICrossbowPart part) { + setPart(part.getComponentType(), item, part.getID()); + return item; + } + + public static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack item, int layer) { IIcon stock = getPartIcon(item, "stock"); - if(stock != null && layer == 0) - { + if (stock != null && layer == 0) { return stock; } IIcon muzzle = getPartIcon(item, "muzzle"); - if(muzzle != null && layer == 1) - { + if (muzzle != null && layer == 1) { return muzzle; } IIcon mod = getPartIcon(item, "mod"); - if(mod != null && layer == 2) - { + if (mod != null && layer == 2) { return mod; } IIcon head = getPartIcon(item, "mechanism"); - return head != null ? head : getIconIndex(item); - } - - @Override + return head != null ? head : getIconIndex(item); + } + + @Override @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return true; - } - @Override - @SideOnly(Side.CLIENT) - public int getRenderPasses(int metadata) - { - return 4; - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - list.add(constructCrossbow((ICrossbowPart)ComponentListMF.crossbow_handle_wood, (ICrossbowPart)ComponentListMF.cross_arms_basic)); - list.add(constructCrossbow((ICrossbowPart)ComponentListMF.crossbow_stock_wood, (ICrossbowPart)ComponentListMF.cross_arms_light)); - - list.add(constructCrossbow((ICrossbowPart)ComponentListMF.crossbow_stock_wood, (ICrossbowPart)ComponentListMF.cross_arms_basic, (ICrossbowPart)ComponentListMF.cross_ammo)); - list.add(constructCrossbow((ICrossbowPart)ComponentListMF.crossbow_stock_wood, (ICrossbowPart)ComponentListMF.cross_arms_heavy, (ICrossbowPart)ComponentListMF.cross_bayonet)); - list.add(constructCrossbow((ICrossbowPart)ComponentListMF.crossbow_stock_iron, (ICrossbowPart)ComponentListMF.cross_arms_advanced, (ICrossbowPart)ComponentListMF.cross_scope)); - } - @SideOnly(Side.CLIENT) - public IIcon getPartIcon(ItemStack item, String partname) - { - if(partname.equalsIgnoreCase("string")) - { - return strings[AmmoMechanicsMF.getArrowOnBow(item) != null ? 1 : 0]; - } - ICrossbowPart part = ItemCrossbowPart.getPart(partname, getPart(partname, item)); - if(part != null) - { + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderPasses(int metadata) { + return 4; + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_handle_wood, + (ICrossbowPart) ComponentListMF.cross_arms_basic)); + list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_wood, + (ICrossbowPart) ComponentListMF.cross_arms_light)); + + list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_wood, + (ICrossbowPart) ComponentListMF.cross_arms_basic, (ICrossbowPart) ComponentListMF.cross_ammo)); + list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_wood, + (ICrossbowPart) ComponentListMF.cross_arms_heavy, (ICrossbowPart) ComponentListMF.cross_bayonet)); + list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_iron, + (ICrossbowPart) ComponentListMF.cross_arms_advanced, (ICrossbowPart) ComponentListMF.cross_scope)); + } + + @SideOnly(Side.CLIENT) + public IIcon getPartIcon(ItemStack item, String partname) { + if (partname.equalsIgnoreCase("string")) { + return strings[AmmoMechanicsMF.getArrowOnBow(item) != null ? 1 : 0]; + } + ICrossbowPart part = ItemCrossbowPart.getPart(partname, getPart(partname, item)); + if (part != null) { return part.getIcon(); } return null; } - - public String getNameModifier(ItemStack item, String partname) - { - ICrossbowPart part = ItemCrossbowPart.getPart(partname, getPart(partname, item)); - if(part != null) - { + + public String getNameModifier(ItemStack item, String partname) { + ICrossbowPart part = ItemCrossbowPart.getPart(partname, getPart(partname, item)); + if (part != null) { String name = part.getUnlocalisedName(); - if(name != null) - { + if (name != null) { return StatCollector.translateToLocal(name); } } return null; } + /** - * Get the modifier for a part (such as power, speed, recoil, capacity and spread) + * Get the modifier for a part (such as power, speed, recoil, capacity and + * spread) */ - public float getModifierForPart(ItemStack item, String partName, String variable) - { - ICrossbowPart part = ItemCrossbowPart.getPart(partName, getPart(partName, item)); - if(part != null) - { + public float getModifierForPart(ItemStack item, String partName, String variable) { + ICrossbowPart part = ItemCrossbowPart.getPart(partName, getPart(partName, item)); + if (part != null) { return part.getModifier(variable); } return 0F; } - private String[] fullParts = new String[]{"mod", "muzzle", "mechanism", "stock"}; - + + private String[] fullParts = new String[] { "mod", "muzzle", "mechanism", "stock" }; + /** * Checks all "fullParts" for value modifiers */ - public float getFullValue(ItemStack item, String variable) - { - float min = variable.equalsIgnoreCase("speed") ? 0.5F: 0F; + public float getFullValue(ItemStack item, String variable) { + float min = variable.equalsIgnoreCase("speed") ? 0.5F : 0F; float value = 0F; - - for(String part: fullParts) - { + + for (String part : fullParts) { value += getModifierForPart(item, part, variable); } - + return Math.max(min, value); } - + @Override - public int getAmmoCapacity(ItemStack item) - { - return 1 + (int)getModifierForPart(item, "mod", "capacity");//only mod affects capacity + public int getAmmoCapacity(ItemStack item) { + return 1 + (int) getModifierForPart(item, "mod", "capacity");// only mod affects capacity } - public float getMeleeDmg(ItemStack item) - { - return 1 + getModifierForPart(item, "muzzle", "bash");//only muzzle affects capacity + + public float getMeleeDmg(ItemStack item) { + return 1 + getModifierForPart(item, "muzzle", "bash");// only muzzle affects capacity } @Override - public boolean canAcceptAmmo(ItemStack weapon, String ammo) - { + public boolean canAcceptAmmo(ItemStack weapon, String ammo) { return ammo.equalsIgnoreCase("bolt"); } @Override - public float[] getDamageRatio(Object... implement) - { - if(implement.length > 0 && implement[0] instanceof ItemStack) - { - if(this.getMeleeDmg((ItemStack)implement[0]) > 1.0F)//Bayonet is used + public float[] getDamageRatio(Object... implement) { + if (implement.length > 0 && implement[0] instanceof ItemStack) { + if (this.getMeleeDmg((ItemStack) implement[0]) > 1.0F)// Bayonet is used { - return new float[]{0F, 0F, 1F}; + return new float[] { 0F, 0F, 1F }; } } - return new float[]{0F, 1F, 0F}; + return new float[] { 0F, 1F, 0F }; } @Override @@ -420,97 +392,84 @@ public float getPenetrationLevel(Object implement) { } private IIcon[] strings; + @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { super.registerIcons(reg); strings = new IIcon[2]; strings[0] = reg.registerIcon("minefantasy2:gun/mechanism/cross_string_unload"); strings[1] = reg.registerIcon("minefantasy2:gun/mechanism/cross_string_load"); - } - + } + @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, boolean properHit) - { - return initialDam + this.getMeleeDmg(item)-1; - } - - public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, boolean infinite) - { - if(arrow == null || !(arrow.getItem() instanceof ItemArrowMF)) - { + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + return initialDam + this.getMeleeDmg(item) - 1; + } + + public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, + boolean infinite) { + if (arrow == null || !(arrow.getItem() instanceof ItemArrowMF)) { return false; } - ItemArrowMF ammo = (ItemArrowMF)arrow.getItem(); - if(!(ammo.getAmmoType(arrow).equalsIgnoreCase("bolt"))) - { + ItemArrowMF ammo = (ItemArrowMF) arrow.getItem(); + if (!(ammo.getAmmoType(arrow).equalsIgnoreCase("bolt"))) { return false; } - //TODO Arrow entity instance - EntityArrowMF entArrow = ammo.getFiredArrow(new EntityArrowMF(world, user, getFullValue(bow, "spread"), charge*2.0F), arrow); - - int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); - entArrow.setPower(1+(0.25F*var9)); - - int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); - - if (var10 > 0) - { - entArrow.setKnockbackStrength(var10); - } - - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) - { - entArrow.setFire(100); - } - - if(infinite) - { - entArrow.canBePickedUp = 2; - } - - if(bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) - { - entArrow = (EntityArrowMF) ((ISpecialBow)bow.getItem()).modifyArrow(bow, entArrow); - } - if (!world.isRemote) - { - world.spawnEntityInWorld(entArrow); - } - world.playSoundAtEntity(user, "minefantasy2:weapon.crossbow_fire", 1.0F, 1.0F); - + // TODO Arrow entity instance + EntityArrowMF entArrow = ammo + .getFiredArrow(new EntityArrowMF(world, user, getFullValue(bow, "spread"), charge * 2.0F), arrow); + + int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); + entArrow.setPower(1 + (0.25F * var9)); + + int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); + + if (var10 > 0) { + entArrow.setKnockbackStrength(var10); + } + + if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) { + entArrow.setFire(100); + } + + if (infinite) { + entArrow.canBePickedUp = 2; + } + + if (bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) { + entArrow = (EntityArrowMF) ((ISpecialBow) bow.getItem()).modifyArrow(bow, entArrow); + } + if (!world.isRemote) { + world.spawnEntityInWorld(entArrow); + } + world.playSoundAtEntity(user, "minefantasy2:weapon.crossbow_fire", 1.0F, 1.0F); + return true; } @Override - public float getZoom(ItemStack item) - { - return getUseAction(item).equalsIgnoreCase("fire") ? getModifierForPart(item, "mod", "zoom") : 0F;//only mod affects zoom; + public float getZoom(ItemStack item) { + return getUseAction(item).equalsIgnoreCase("fire") ? getModifierForPart(item, "mod", "zoom") : 0F;// only mod + // affects + // zoom; } @Override - public Object[] getSalvage(ItemStack item) - { - return new Object[] - { - getItem(item, "stock"), - getItem(item, "mechanism"), - getItem(item, "muzzle"), - getItem(item, "mod") - }; + public Object[] getSalvage(ItemStack item) { + return new Object[] { getItem(item, "stock"), getItem(item, "mechanism"), getItem(item, "muzzle"), + getItem(item, "mod") }; } - private Object getItem(ItemStack item, String type) - { + private Object getItem(ItemStack item, String type) { return ItemCrossbowPart.getPart(type, this.getPart(type, item)); } - + @Override - public int getMaxDamage(ItemStack item) - { - return super.getMaxDamage(item) + (int)getFullValue(item, "durability"); - } + public int getMaxDamage(ItemStack item) { + return super.getMaxDamage(item) + (int) getFullValue(item, "durability"); + } @Override public float getScale(ItemStack itemstack) { @@ -523,11 +482,10 @@ public float getOffsetX(ItemStack itemstack) { } @Override - public float getOffsetY(ItemStack itemstack) - { - return (isHandCrossbow(itemstack) ? 0F : 0.5F) + 1/8F; + public float getOffsetY(ItemStack itemstack) { + return (isHandCrossbow(itemstack) ? 0F : 0.5F) + 1 / 8F; } - + @Override public float getOffsetZ(ItemStack itemstack) { return 0.25F; @@ -539,10 +497,10 @@ public float getRotationOffset(ItemStack itemstack) { } @Override - public boolean canHang(TileEntityRack rack, ItemStack item, int slot) - { - if(slot == 0 || slot == 3)return false; - + public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { + if (slot == 0 || slot == 3) + return false; + return isHandCrossbow(item) || rack.hasRackBelow(slot); } @@ -550,12 +508,10 @@ public boolean canHang(TileEntityRack rack, ItemStack item, int slot) public boolean isSpecialRender(ItemStack item) { return true; } - - public boolean isHandCrossbow(ItemStack item) - { + + public boolean isHandCrossbow(ItemStack item) { ICrossbowPart part = ItemCrossbowPart.getPart("stock", getPart("stock", item)); - if(part != null) - { + if (part != null) { return part.makesSmallWeapon(); } return true; diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbowPart.java b/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbowPart.java index b26953c8..eef91fc4 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbowPart.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbowPart.java @@ -1,71 +1,62 @@ package minefantasy.mf2.item.gadget; -import java.util.HashMap; import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.engineer.ICrossbowPart; import minefantasy.mf2.item.ItemComponentMF; import minefantasy.mf2.item.list.ComponentListMF; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class ItemCrossbowPart extends ItemComponentMF implements ICrossbowPart -{ +public class ItemCrossbowPart extends ItemComponentMF implements ICrossbowPart { private int tier; private String type, partname; public IIcon modelIcon; - - public ItemCrossbowPart(String name, String type) - { + + public ItemCrossbowPart(String name, String type) { this(name, type, ICrossbowPart.components.size(), name); } - - public ItemCrossbowPart(String name, String type, int tier) - { + + public ItemCrossbowPart(String name, String type, int tier) { this(name, type, tier, name); } - public ItemCrossbowPart(String name, String type, int tier, String model) - { + + public ItemCrossbowPart(String name, String type, int tier, String model) { super(name, 0); this.setFull3D(); this.type = type; this.tier = tier; - this.partname=model; + this.partname = model; MineFantasyAPI.registerCrossbowPart(this); } @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { - list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("crossbow.component.name")); + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("crossbow.component.name")); list.add(EnumChatFormatting.ITALIC + StatCollector.translateToLocal("crossbow.component." + type)); list.add(EnumChatFormatting.DARK_GRAY + StatCollector.translateToLocal(getUnlocalizedName() + ".desc")); } - + @Override - public String getComponentType() - { + public String getComponentType() { return type; } @Override - public int getID() - { + public int getID() { return tier; } - public static ICrossbowPart getPart(String type, int id) - { - return components.get(type+id); + public static ICrossbowPart getPart(String type, int id) { + return components.get(type + id); } @Override @@ -73,86 +64,93 @@ public static ICrossbowPart getPart(String type, int id) public IIcon getIcon() { return modelIcon; } - + @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { super.registerIcons(reg); - modelIcon = reg.registerIcon("minefantasy2:gun/"+type+"/"+partname); - } + modelIcon = reg.registerIcon("minefantasy2:gun/" + type + "/" + partname); + } @Override - public String getUnlocalisedName() - { - if(this == ComponentListMF.cross_arms_basic) - { + public String getUnlocalisedName() { + if (this == ComponentListMF.cross_arms_basic) { return null; } - return "crosspart."+type+"."+partname; + return "crosspart." + type + "." + partname; } private int capacity = 0, durability = 50; private float power, spread, recoil, speed, bash, zoom; - public ItemCrossbowPart addPower(float power) - { + + public ItemCrossbowPart addPower(float power) { this.power = power; return this; } - public ItemCrossbowPart setScope(float zoom) - { + + public ItemCrossbowPart setScope(float zoom) { this.zoom = zoom; return this; } - public ItemCrossbowPart addSpread(float spread) - { + + public ItemCrossbowPart addSpread(float spread) { this.spread = spread; return this; } - public ItemCrossbowPart addRecoil(float recoil) - { + + public ItemCrossbowPart addRecoil(float recoil) { this.recoil = recoil; return this; } - public ItemCrossbowPart addSpeed(float speed) - { + + public ItemCrossbowPart addSpeed(float speed) { this.speed = speed; return this; } - public ItemCrossbowPart addBash(float bash) - { + + public ItemCrossbowPart addBash(float bash) { this.bash = bash; return this; } - public ItemCrossbowPart addCapacity(int capacity) - { + + public ItemCrossbowPart addCapacity(int capacity) { this.capacity = capacity; return this; } - public ItemCrossbowPart addDurability(int durability) - { + + public ItemCrossbowPart addDurability(int durability) { this.durability = durability; return this; } - public ItemCrossbowPart setHandCrossbow(boolean flag) - { + + public ItemCrossbowPart setHandCrossbow(boolean flag) { this.isHandle = flag; return this; } + @Override - public float getModifier(String type) - { - if(type.equalsIgnoreCase("power"))return power; - if(type.equalsIgnoreCase("spread"))return spread; - if(type.equalsIgnoreCase("recoil"))return recoil; - if(type.equalsIgnoreCase("speed"))return speed; - if(type.equalsIgnoreCase("capacity"))return capacity; - if(type.equalsIgnoreCase("bash"))return bash; - if(type.equalsIgnoreCase("zoom"))return zoom; - if(type.equalsIgnoreCase("durability"))return durability; + public float getModifier(String type) { + if (type.equalsIgnoreCase("power")) + return power; + if (type.equalsIgnoreCase("spread")) + return spread; + if (type.equalsIgnoreCase("recoil")) + return recoil; + if (type.equalsIgnoreCase("speed")) + return speed; + if (type.equalsIgnoreCase("capacity")) + return capacity; + if (type.equalsIgnoreCase("bash")) + return bash; + if (type.equalsIgnoreCase("zoom")) + return zoom; + if (type.equalsIgnoreCase("durability")) + return durability; return 0F; } + private boolean isHandle = false; + @Override public boolean makesSmallWeapon() { return isHandle; diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemCrudeBomb.java b/src/main/java/minefantasy/mf2/item/gadget/ItemCrudeBomb.java index 01ed9fac..b7dcdf8b 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemCrudeBomb.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemCrudeBomb.java @@ -1,134 +1,105 @@ package minefantasy.mf2.item.gadget; -import java.util.ArrayList; import java.util.List; -import minefantasy.mf2.MineFantasyII; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.crafting.ISpecialSalvage; -import minefantasy.mf2.entity.EntityBomb; import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.mechanics.BombDispenser; -import net.minecraft.block.BlockDispenser; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.passive.EntityChicken; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; -import net.minecraft.item.EnumAction; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; -import net.minecraft.item.ItemMonsterPlacer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class ItemCrudeBomb extends ItemBomb implements ISpecialSalvage -{ - public ItemCrudeBomb(String name) - { - super(name); - } - @Override - public int getMaxItemUseDuration(ItemStack item) - { - return 20; - } - @Override - public String getUnlocalizedName(ItemStack item) - { - return "item.bomb_crude"; - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - list.add(new ItemStack(this)); - } - - //TODO Icons - @SideOnly(Side.CLIENT) - public IIcon getIcon(byte type) - { +public class ItemCrudeBomb extends ItemBomb implements ISpecialSalvage { + public ItemCrudeBomb(String name) { + super(name); + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + return 20; + } + + @Override + public String getUnlocalizedName(ItemStack item) { + return "item.bomb_crude"; + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(new ItemStack(this)); + } + + // TODO Icons + @SideOnly(Side.CLIENT) + public IIcon getIcon(byte type) { return basicIcon; } - private IIcon basicIcon; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - basicIcon = reg.registerIcon("minefantasy2:Other/bomb_crude"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconIndex(ItemStack item) - { - return basicIcon; - } - @Override - @SideOnly(Side.CLIENT) - public int getRenderPasses(int metadata) - { - return 1; - } - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack item, int layer) - { - return getIconIndex(item); - } - - @Override + + private IIcon basicIcon; + + @Override @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return false; - } - - @Override - public EnumRarity getRarity(ItemStack item) - { - return ToolListMF.poor; - } + public void registerIcons(IIconRegister reg) { + basicIcon = reg.registerIcon("minefantasy2:Other/bomb_crude"); + } @Override - public Object[] getSalvage(ItemStack item) - { - return new Object[] - { - Items.paper, ComponentListMF.thread, ComponentListMF.blackpowder - }; - } - + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack item) { + return basicIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderPasses(int metadata) { + return 1; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack item, int layer) { + return getIconIndex(item); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return false; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return ToolListMF.poor; + } + @Override - public byte getItemFuse(byte value) - { + public Object[] getSalvage(ItemStack item) { + return new Object[] { Items.paper, ComponentListMF.thread, ComponentListMF.blackpowder }; + } + + @Override + public byte getItemFuse(byte value) { return 0; } + @Override - public byte getItemFilling(byte value) - { + public byte getItemFilling(byte value) { return 0; } + @Override - public byte getItemCasing(byte value) - { + public byte getItemCasing(byte value) { return -1; } + @Override - public byte getItemPowder(byte value) - { + public byte getItemPowder(byte value) { return 0; } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingArrow.java b/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingArrow.java index 549d06f3..85d1b8b4 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingArrow.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingArrow.java @@ -2,13 +2,6 @@ import java.util.List; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; import minefantasy.mf2.api.crafting.ISpecialSalvage; import minefantasy.mf2.entity.EntityArrowMF; import minefantasy.mf2.item.archery.ArrowType; @@ -17,79 +10,75 @@ import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.material.BaseMaterialMF; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; -public class ItemExplodingArrow extends ItemArrowMF implements ISpecialSalvage -{ +public class ItemExplodingArrow extends ItemArrowMF implements ISpecialSalvage { - public ItemExplodingArrow() - { + public ItemExplodingArrow() { super("exploding_arrow", 1, BaseMaterialMF.iron.getToolConversion(), ArrowType.EXPLOSIVE); setCreativeTab(CreativeTabMF.tabGadget); setMaxStackSize(16); } + @Override - public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) - { + public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) { instance = super.getFiredArrow(instance, arrow); instance.canBePickedUp = 0; - return instance.setBombStats(ItemBomb.getPowder(arrow), ItemBomb.getFilling(arrow)); - } - + return instance.setBombStats(ItemBomb.getPowder(arrow), ItemBomb.getFilling(arrow)); + } + @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { - super.addInformation(item, user, list, fullInfo); - - if(item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) - { - list.add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("bomb.case.sticky") + EnumChatFormatting.GRAY); - } - EnumExplosiveType fill = EnumExplosiveType.getType(ItemBomb.getFilling(item)); - EnumPowderType powder = EnumPowderType.getType(ItemBomb.getPowder(item)); - - int damage = (int) (fill.damage*powder.damageModifier*0.5F); - float range = fill.range*powder.rangeModifier*0.5F; - - list.add(StatCollector.translateToLocal(ToolListMF.bomb_custom.getUnlocalizedName(item)+".name")); - list.add(StatCollector.translateToLocal("bomb.powder."+powder.name+".name")); - list.add(""); - list.add(StatCollector.translateToLocal("bomb.damage.name")+": "+damage); - list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); - } - - public static ItemStack createBombArrow(byte powder, byte filling) - { + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); + + if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { + list.add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("bomb.case.sticky") + + EnumChatFormatting.GRAY); + } + EnumExplosiveType fill = EnumExplosiveType.getType(ItemBomb.getFilling(item)); + EnumPowderType powder = EnumPowderType.getType(ItemBomb.getPowder(item)); + + int damage = (int) (fill.damage * powder.damageModifier * 0.5F); + float range = fill.range * powder.rangeModifier * 0.5F; + + list.add(StatCollector.translateToLocal(ToolListMF.bomb_custom.getUnlocalizedName(item) + ".name")); + list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); + list.add(""); + list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); + list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); + } + + public static ItemStack createBombArrow(byte powder, byte filling) { return createBombArrow(ToolListMF.exploding_arrow, powder, filling); } - public static ItemStack createBombArrow(Item design, byte powder, byte filling) - { + + public static ItemStack createBombArrow(Item design, byte powder, byte filling) { ItemStack arrow = new ItemStack(design); - + ItemBomb.setFilling(arrow, filling); ItemBomb.setPowder(arrow, powder); - + return arrow; } + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - for(byte pdr = 0; pdr < 2; pdr ++) - { - for(byte fill = 0; fill < 3; fill ++) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (byte pdr = 0; pdr < 2; pdr++) { + for (byte fill = 0; fill < 3; fill++) { list.add(createBombArrow(pdr, fill)); } } - } - + } + @Override - public Object[] getSalvage(ItemStack item) - { - return new Object[] - { - ComponentListMF.bomb_casing_arrow, - ItemBombComponent.getBombComponent("powder", ItemBomb.getPowder(item)), - ItemBombComponent.getBombComponent("filling", ItemBomb.getFilling(item)), - }; + public Object[] getSalvage(ItemStack item) { + return new Object[] { ComponentListMF.bomb_casing_arrow, + ItemBombComponent.getBombComponent("powder", ItemBomb.getPowder(item)), + ItemBombComponent.getBombComponent("filling", ItemBomb.getFilling(item)), }; } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingBolt.java b/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingBolt.java index 691421fa..493b859e 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingBolt.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingBolt.java @@ -2,13 +2,6 @@ import java.util.List; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; import minefantasy.mf2.api.crafting.ISpecialSalvage; import minefantasy.mf2.entity.EntityArrowMF; import minefantasy.mf2.item.archery.ArrowType; @@ -17,72 +10,67 @@ import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.material.BaseMaterialMF; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; -public class ItemExplodingBolt extends ItemArrowMF implements ISpecialSalvage -{ +public class ItemExplodingBolt extends ItemArrowMF implements ISpecialSalvage { - public ItemExplodingBolt() - { + public ItemExplodingBolt() { super("exploding_bolt", 1, BaseMaterialMF.iron.getToolConversion(), ArrowType.EXPLOSIVEBOLT); setCreativeTab(CreativeTabMF.tabGadget); setAmmoType("bolt"); setMaxStackSize(20); } + @Override - public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) - { + public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) { instance = super.getFiredArrow(instance, arrow); instance.canBePickedUp = 0; - return instance.setBombStats(ItemBomb.getPowder(arrow), ItemBomb.getFilling(arrow)); - } - + return instance.setBombStats(ItemBomb.getPowder(arrow), ItemBomb.getFilling(arrow)); + } + @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { - super.addInformation(item, user, list, fullInfo); - - EnumExplosiveType fill = EnumExplosiveType.getType(ItemBomb.getFilling(item)); - EnumPowderType powder = EnumPowderType.getType(ItemBomb.getPowder(item)); - - int damage = (int) (fill.damage*powder.damageModifier*0.5F); - float range = fill.range*powder.rangeModifier*0.5F; - - list.add(StatCollector.translateToLocal(ToolListMF.bomb_custom.getUnlocalizedName(item)+".name")); - list.add(StatCollector.translateToLocal("bomb.powder."+powder.name+".name")); - list.add(""); - list.add(StatCollector.translateToLocal("bomb.damage.name")+": "+damage); - list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); - } - - public static ItemStack createBombArrow(byte powder, byte filling) - { + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); + + EnumExplosiveType fill = EnumExplosiveType.getType(ItemBomb.getFilling(item)); + EnumPowderType powder = EnumPowderType.getType(ItemBomb.getPowder(item)); + + int damage = (int) (fill.damage * powder.damageModifier * 0.5F); + float range = fill.range * powder.rangeModifier * 0.5F; + + list.add(StatCollector.translateToLocal(ToolListMF.bomb_custom.getUnlocalizedName(item) + ".name")); + list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); + list.add(""); + list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); + list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); + } + + public static ItemStack createBombArrow(byte powder, byte filling) { ItemStack arrow = new ItemStack(ToolListMF.exploding_bolt); - + ItemBomb.setFilling(arrow, filling); ItemBomb.setPowder(arrow, powder); - + return arrow; } + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - for(byte pdr = 0; pdr < 2; pdr ++) - { - for(byte fill = 0; fill < 3; fill ++) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (byte pdr = 0; pdr < 2; pdr++) { + for (byte fill = 0; fill < 3; fill++) { list.add(createBombArrow(pdr, fill)); } } - } - + } + @Override - public Object[] getSalvage(ItemStack item) - { - return new Object[] - { - ComponentListMF.bomb_casing_bolt, - ItemBombComponent.getBombComponent("powder", ItemBomb.getPowder(item)), - ItemBombComponent.getBombComponent("filling", ItemBomb.getFilling(item)), - }; + public Object[] getSalvage(ItemStack item) { + return new Object[] { ComponentListMF.bomb_casing_bolt, + ItemBombComponent.getBombComponent("powder", ItemBomb.getPowder(item)), + ItemBombComponent.getBombComponent("filling", ItemBomb.getFilling(item)), }; } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemJug.java b/src/main/java/minefantasy/mf2/item/gadget/ItemJug.java index 403984c0..bbfb0588 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemJug.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemJug.java @@ -1,6 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.Iterator; import java.util.Random; import minefantasy.mf2.api.heating.TongsHelper; @@ -9,168 +8,133 @@ import minefantasy.mf2.item.ItemComponentMF; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.util.MFLogUtil; -import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; -public class ItemJug extends ItemComponentMF -{ +public class ItemJug extends ItemComponentMF { private String type; - public ItemJug(String type) - { - super("jug_"+type, 0); + + public ItemJug(String type) { + super("jug_" + type, 0); setCreativeTab(CreativeTabMF.tabFood); this.type = type; } @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) - { - if(type.equalsIgnoreCase("uncooked")) - { + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + if (type.equalsIgnoreCase("uncooked")) { return super.onItemRightClick(item, world, player); } - if(type.equalsIgnoreCase("empty")) - { + if (type.equalsIgnoreCase("empty")) { return rightClickEmpty(item, world, player); } return useFilled(item, world, player); - } - + } + @Override - public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) - { - if (!world.isRemote) - { - if(type.equalsIgnoreCase("milk")) - { - curePotionEffects(user); - } - if(StaminaBar.isSystemActive) - { - StaminaBar.modifyStaminaValue(user, 10); - } - } - ItemStack container = getContainerItem(item); - if(item.stackSize > 1) - { - if (!user.capabilities.isCreativeMode) - { - --item.stackSize; - } - if(!user.inventory.addItemStackToInventory(container)) - { - user.entityDropItem(container, 0F); - } - return item; - } - - return container; - } - - private void curePotionEffects(EntityPlayer user) - { - user.clearActivePotions(); + public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote) { + if (type.equalsIgnoreCase("milk")) { + curePotionEffects(user); + } + if (StaminaBar.isSystemActive) { + StaminaBar.modifyStaminaValue(user, 10); + } + } + ItemStack container = getContainerItem(item); + if (item.stackSize > 1) { + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + if (!user.inventory.addItemStackToInventory(container)) { + user.entityDropItem(container, 0F); + } + return item; + } + + return container; + } + + private void curePotionEffects(EntityPlayer user) { + user.clearActivePotions(); } /** - * How long it takes to use or consume an item - */ + * How long it takes to use or consume an item + */ @Override - public int getMaxItemUseDuration(ItemStack item) - { - return 24; - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ + public int getMaxItemUseDuration(ItemStack item) { + return 24; + } + + /** + * returns the action that specifies what animation to play when the items is + * being used + */ @Override - public EnumAction getItemUseAction(ItemStack item) - { - return EnumAction.drink; - } - - private ItemStack rightClickEmpty(ItemStack item, World world, EntityPlayer player) - { + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.drink; + } + + private ItemStack rightClickEmpty(ItemStack item, World world, EntityPlayer player) { MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - if (movingobjectposition == null) - { - return super.onItemRightClick(item, world, player); - } - else - { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (!world.canMineBlock(player, i, j, k)) - { - return super.onItemRightClick(item, world, player); - } - - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) - { - return super.onItemRightClick(item, world, player); - } - - if (isWaterSource(world, i, j, k)) - { - gather(item, world, player); - return item; - } - } - return super.onItemRightClick(item, world, player); - } + if (movingobjectposition == null) { + return super.onItemRightClick(item, world, player); + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) { + return super.onItemRightClick(item, world, player); + } + + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return super.onItemRightClick(item, world, player); + } + + if (isWaterSource(world, i, j, k)) { + gather(item, world, player); + return item; + } + } + return super.onItemRightClick(item, world, player); + } } - private Random rand = new Random(); - private void gather(ItemStack item, World world, EntityPlayer player) - { - player.swingItem(); - if (!world.isRemote) - { - world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat()/4F, 0.5F + rand.nextFloat()); - item.stackSize--; - EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, new ItemStack(FoodListMF.jug_water)); - world.spawnEntityInWorld(resultItem); - } + private Random rand = new Random(); + + private void gather(ItemStack item, World world, EntityPlayer player) { + player.swingItem(); + if (!world.isRemote) { + world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, 0.5F + rand.nextFloat()); + item.stackSize--; + EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, + new ItemStack(FoodListMF.jug_water)); + world.spawnEntityInWorld(resultItem); + } } - - private boolean isWaterSource(World world, int i, int j, int k) - { + + private boolean isWaterSource(World world, int i, int j, int k) { return TongsHelper.getWaterSource(world, i, j, k) >= 0; } - - public ItemStack useFilled(ItemStack item, World world, EntityPlayer user) - { - if (!world.isRemote && storageType != null) - { + + public ItemStack useFilled(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote && storageType != null) { MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); - if (movingobjectposition == null) - { + if (movingobjectposition == null) { return item; - } - else - { - int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, movingobjectposition); - if (placed > 0) - { + } else { + int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, + movingobjectposition); + if (placed > 0) { item.stackSize -= placed; return item; } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemLootSack.java b/src/main/java/minefantasy/mf2/item/gadget/ItemLootSack.java index b0717e83..91860c8a 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemLootSack.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemLootSack.java @@ -2,9 +2,9 @@ import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.item.ItemComponentMF; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; @@ -17,52 +17,45 @@ import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -import cpw.mods.fml.common.registry.GameRegistry; -public class ItemLootSack extends Item -{ - public static final String COMMON = "commonLootBag"; - public static final String VALUABLE = "valuableLootBag"; - public static final String EXQUISITE = "exquisiteLootBag"; - +public class ItemLootSack extends Item { + public static final String COMMON = "commonLootBag"; + public static final String VALUABLE = "valuableLootBag"; + public static final String EXQUISITE = "exquisiteLootBag"; + protected int amount, tier; protected String pool; - public ItemLootSack(String name, int amount, int tier) - { - this.setCreativeTab(CreativeTabMF.tabGadget); - this.amount = amount; - this.tier = tier; - pool = tier == 0 ? COMMON : tier == 1 ? VALUABLE : EXQUISITE; - setTextureName("minefantasy2:Other/"+name); + + public ItemLootSack(String name, int amount, int tier) { + this.setCreativeTab(CreativeTabMF.tabGadget); + this.amount = amount; + this.tier = tier; + pool = tier == 0 ? COMMON : tier == 1 ? VALUABLE : EXQUISITE; + setTextureName("minefantasy2:Other/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); } - + @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(user.isSwingInProgress)return item; - + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (user.isSwingInProgress) + return item; + user.swingItem(); - if (!user.capabilities.isCreativeMode) - { - --item.stackSize; - } + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } user.playSound("mob.horse.leather", 1.0F, 1.5F); - - if(!world.isRemote) - { + + if (!world.isRemote) { ChestGenHooks gen = ChestGenHooks.getInfo(pool); IInventory inv = new Loot(amount); Random rand = new Random(); WeightedRandomChestContent.generateChestContents(rand, gen.getItems(rand), inv, 1 + rand.nextInt(amount)); - for(int a = 0; a < inv.getSizeInventory(); a++) - { - if(inv.getStackInSlot(a) != null) - { + for (int a = 0; a < inv.getSizeInventory(); a++) { + if (inv.getStackInSlot(a) != null) { ItemStack drop = inv.getStackInSlot(a); - if(!user.inventory.addItemStackToInventory(drop)) - { + if (!user.inventory.addItemStackToInventory(drop)) { user.entityDropItem(drop, 0F); } } @@ -70,22 +63,21 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user } return item; } + @Override - public EnumRarity getRarity(ItemStack item) - { - return tier == 0 ? EnumRarity.common : tier == 1 ? EnumRarity.uncommon : EnumRarity.epic; - } - - public static class Loot implements IInventory - { + public EnumRarity getRarity(ItemStack item) { + return tier == 0 ? EnumRarity.common : tier == 1 ? EnumRarity.uncommon : EnumRarity.epic; + } + + public static class Loot implements IInventory { public ItemStack[] contents; - public Loot(int count) - { + + public Loot(int count) { contents = new ItemStack[count]; } + @Override - public int getSizeInventory() - { + public int getSizeInventory() { return contents.length; } @@ -95,8 +87,7 @@ public ItemStack getStackInSlot(int slot) { } @Override - public ItemStack decrStackSize(int slot, int num) - { + public ItemStack decrStackSize(int slot, int num) { contents[slot].stackSize -= num; return contents[slot]; } @@ -107,14 +98,12 @@ public ItemStack getStackInSlotOnClosing(int slot) { } @Override - public void setInventorySlotContents(int slot, - ItemStack item) { + public void setInventorySlotContents(int slot, ItemStack item) { contents[slot] = item; } @Override - public String getInventoryName() - { + public String getInventoryName() { return null; } @@ -131,7 +120,7 @@ public int getInventoryStackLimit() { @Override public void markDirty() { // TODO Auto-generated method stub - + } @Override @@ -151,67 +140,85 @@ public void closeInventory() { public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) { return false; } - + } - public static void addItems() - { - String loot = COMMON; //Some books, Commodities - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 1, 1, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 1, 1, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 1, 1, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 1, 1, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 1, 1, 5)); + + public static void addItems() { + String loot = COMMON; // Some books, Commodities + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 1, 1, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 1, 1, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 1, 1, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 1, 1, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 1, 1, 5)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_basic), 1, 1, 10)); - + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.coal), 4, 12, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(((ItemComponentMF)ComponentListMF.plank).construct("OakWood"), 1, 8, 20)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(ComponentListMF.plank.construct("OakWood"), 1, 8, 20)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 20)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.leather), 1, 4, 20)); - + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.string), 1, 2, 10)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), 1, 2, 10)); - - - loot = VALUABLE; //Books, Valued commodities - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 1, 3, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 1, 3, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 1, 3, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 1, 3, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 1, 3, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_advanced), 1, 1, 2)); - + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(ComponentListMF.plank.construct("RefinedWood"), 1, 2, 10)); + + loot = VALUABLE; // Books, Valued commodities + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 1, 3, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 1, 3, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 1, 3, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 1, 3, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 1, 3, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_advanced), 1, 1, 2)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ComponentListMF.kaolinite), 1, 8, 10)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.dye, 1, 4), 1, 8, 20)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20));//Silver - + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20));// Silver + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 2, 10)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 2, 10)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.ender_pearl), 1, 2, 10)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 4, 10)); - addRecords(loot, 2); - - loot = EXQUISITE; //Many books, Highly sought commodities - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 2, 5, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 2, 5, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 2, 5, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 2, 5, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 2, 5, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 4, 10)); + addRecords(loot, 2); + + loot = EXQUISITE; // Many books, Highly sought commodities + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 2, 5, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 2, 5, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 2, 5, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 2, 5, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 2, 5, 5)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_ornate), 1, 1, 5)); - - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ComponentListMF.flux_strong), 12, 32, 20)); + + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.flux_strong), 12, 32, 20)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.diamond), 4, 8, 20)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.emerald), 4, 8, 20)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.ender_eye), 4, 8, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20));//Wolframite - + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20));// Wolframite + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.golden_apple, 1, 1), 1, 1, 10)); addRecords(loot, 5); - + } - private static void addRecords(String loot, int rarity) - { + private static void addRecords(String loot, int rarity) { ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_11), 1, 1, rarity)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_13), 1, 1, rarity)); ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_blocks), 1, 1, rarity)); diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemMine.java b/src/main/java/minefantasy/mf2/item/gadget/ItemMine.java index 1bc74957..b1ea68c4 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemMine.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemMine.java @@ -25,255 +25,228 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class ItemMine extends Item implements ISpecialSalvage, IAmmo -{ - public ItemMine(String name) - { - this.maxStackSize = 16; - this.setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/"+name); +public class ItemMine extends Item implements ISpecialSalvage, IAmmo { + public ItemMine(String name) { + this.maxStackSize = 16; + this.setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); BlockDispenser.dispenseBehaviorRegistry.putObject(this, new BombDispenser()); - } - - @Override - public EnumAction getItemUseAction(ItemStack item) - { - return EnumAction.block; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(!user.isSwingInProgress) - { - world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "fire.ignite", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F); - user.setItemInUse(item, getMaxItemUseDuration(item)); - } - return item; - } - @Override - public int getMaxItemUseDuration(ItemStack item) - { - return 35; - } - @Override - public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) - { - world.playSoundEffect(user.posX, user.posY+1.5, user.posZ, "random.click", 1.0F, 1.0F); - user.swingItem(); - if (!user.capabilities.isCreativeMode) - { - --item.stackSize; - } - - if (!world.isRemote) - { - world.spawnEntityInWorld(new EntityMine(world, user).setType(getFilling(item), getCasing(item), getFuse(item), getPowder(item))); - } - - return item; - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) - { - super.addInformation(item, user, list, fullInfo); - - EnumExplosiveType fill = EnumExplosiveType.getType(getFilling(item)); - EnumCasingType casing = EnumCasingType.getType(getCasing(item)); - EnumFuseType fuse = EnumFuseType.getType(getFuse(item)); - EnumPowderType powder = EnumPowderType.getType(getPowder(item)); - - int damage = (int) (fill.damage*casing.damageModifier*powder.damageModifier); - float range = fill.range*casing.rangeModifier*powder.rangeModifier; - float fusetime = (float)fuse.time/20F; - - list.add(StatCollector.translateToLocal("bomb.case."+casing.name+".name")); - list.add(StatCollector.translateToLocal("bomb.powder."+powder.name+".name")); - list.add(StatCollector.translateToLocal("bomb.fuse."+fuse.name+".name")); - list.add(""); - list.add(StatCollector.translateToLocalFormatted("bomb.fusetime.name", fusetime)); - list.add(StatCollector.translateToLocal("bomb.damage.name")+": "+damage); - list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); - } - @Override - public String getUnlocalizedName(ItemStack item) - { - EnumExplosiveType type = EnumExplosiveType.getType(getFilling(item)); - return "item.mine_"+type.name; - } - private static final String powderNBT = "MineFantasy_PowderType"; - private static final String fuseNBT = "MineFantasy_FuseType"; - private static final String fillingNBT = "MineFantasy_ExplosiveType"; - private static final String casingNBT = "MineFantasy_CaseType"; - - - public static void setFuse(ItemStack item, byte fuse) - { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(fuseNBT, fuse); - } - public static byte getFuse(ItemStack item) - { - NBTTagCompound nbt = getNBT(item); - if(nbt.hasKey(fuseNBT)) - { - return nbt.getByte(fuseNBT); - } - return (byte)0; - } - - public static void setPowder(ItemStack item, byte powder) - { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(powderNBT, powder); - } - public static byte getPowder(ItemStack item) - { - NBTTagCompound nbt = getNBT(item); - if(nbt.hasKey(powderNBT)) - { - return nbt.getByte(powderNBT); - } - return (byte)0; - } - /** - * 0 = Basic - * 1 = Shrapnel - * 2 = Fire - */ - public static void setFilling(ItemStack item, byte filling) - { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(fillingNBT, filling); - } - public static byte getFilling(ItemStack item) - { - NBTTagCompound nbt = getNBT(item); - if(nbt.hasKey(fillingNBT)) - { - return nbt.getByte(fillingNBT); - } - return (byte)0; - } - - /** - * 0 = Ceramic - * 1 = Iron - */ - public static void setCasing(ItemStack item, byte casing) - { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(casingNBT, casing); - } - public static byte getCasing(ItemStack item) - { - NBTTagCompound nbt = getNBT(item); - if(nbt.hasKey(casingNBT)) - { - return nbt.getByte(casingNBT); - } - return (byte)0; - } - - public static NBTTagCompound getNBT(ItemStack item) - { - if(!item.hasTagCompound())item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - public ItemStack createMine(byte casing, byte filling, byte fuse, byte powder, int stackSize) - { - return ItemBomb.createExplosive(this, casing, filling, fuse, powder, stackSize); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - list.add(createMine((byte)0, (byte)0, (byte)0, (byte)0, 1)); - list.add(createMine((byte)0, (byte)1, (byte)0, (byte)0, 1)); - list.add(createMine((byte)0, (byte)2, (byte)0, (byte)0, 1)); - - list.add(createMine((byte)1, (byte)0, (byte)0, (byte)0, 1)); - list.add(createMine((byte)1, (byte)1, (byte)0, (byte)0, 1)); - list.add(createMine((byte)1, (byte)2, (byte)0, (byte)0, 1)); - - list.add(createMine((byte)2, (byte)0, (byte)0, (byte)0, 1)); - list.add(createMine((byte)2, (byte)1, (byte)0, (byte)0, 1)); - list.add(createMine((byte)2, (byte)2, (byte)0, (byte)0, 1)); - - list.add(createMine((byte)3, (byte)0, (byte)0, (byte)0, 1)); - list.add(createMine((byte)3, (byte)1, (byte)0, (byte)0, 1)); - list.add(createMine((byte)3, (byte)2, (byte)0, (byte)0, 1)); - } - - //TODO Icons - @SideOnly(Side.CLIENT) - public IIcon getIcon(byte type) - { + } + + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.block; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!user.isSwingInProgress) { + world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "fire.ignite", 1.0F, + itemRand.nextFloat() * 0.4F + 0.8F); + user.setItemInUse(item, getMaxItemUseDuration(item)); + } + return item; + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + return 35; + } + + @Override + public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { + world.playSoundEffect(user.posX, user.posY + 1.5, user.posZ, "random.click", 1.0F, 1.0F); + user.swingItem(); + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + + if (!world.isRemote) { + world.spawnEntityInWorld(new EntityMine(world, user).setType(getFilling(item), getCasing(item), + getFuse(item), getPowder(item))); + } + + return item; + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); + + EnumExplosiveType fill = EnumExplosiveType.getType(getFilling(item)); + EnumCasingType casing = EnumCasingType.getType(getCasing(item)); + EnumFuseType fuse = EnumFuseType.getType(getFuse(item)); + EnumPowderType powder = EnumPowderType.getType(getPowder(item)); + + int damage = (int) (fill.damage * casing.damageModifier * powder.damageModifier); + float range = fill.range * casing.rangeModifier * powder.rangeModifier; + float fusetime = fuse.time / 20F; + + list.add(StatCollector.translateToLocal("bomb.case." + casing.name + ".name")); + list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); + list.add(StatCollector.translateToLocal("bomb.fuse." + fuse.name + ".name")); + list.add(""); + list.add(StatCollector.translateToLocalFormatted("bomb.fusetime.name", fusetime)); + list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); + list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); + } + + @Override + public String getUnlocalizedName(ItemStack item) { + EnumExplosiveType type = EnumExplosiveType.getType(getFilling(item)); + return "item.mine_" + type.name; + } + + private static final String powderNBT = "MineFantasy_PowderType"; + private static final String fuseNBT = "MineFantasy_FuseType"; + private static final String fillingNBT = "MineFantasy_ExplosiveType"; + private static final String casingNBT = "MineFantasy_CaseType"; + + public static void setFuse(ItemStack item, byte fuse) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(fuseNBT, fuse); + } + + public static byte getFuse(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (nbt.hasKey(fuseNBT)) { + return nbt.getByte(fuseNBT); + } + return (byte) 0; + } + + public static void setPowder(ItemStack item, byte powder) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(powderNBT, powder); + } + + public static byte getPowder(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (nbt.hasKey(powderNBT)) { + return nbt.getByte(powderNBT); + } + return (byte) 0; + } + + /** + * 0 = Basic 1 = Shrapnel 2 = Fire + */ + public static void setFilling(ItemStack item, byte filling) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(fillingNBT, filling); + } + + public static byte getFilling(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (nbt.hasKey(fillingNBT)) { + return nbt.getByte(fillingNBT); + } + return (byte) 0; + } + + /** + * 0 = Ceramic 1 = Iron + */ + public static void setCasing(ItemStack item, byte casing) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(casingNBT, casing); + } + + public static byte getCasing(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (nbt.hasKey(casingNBT)) { + return nbt.getByte(casingNBT); + } + return (byte) 0; + } + + public static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + public ItemStack createMine(byte casing, byte filling, byte fuse, byte powder, int stackSize) { + return ItemBomb.createExplosive(this, casing, filling, fuse, powder, stackSize); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(createMine((byte) 0, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 0, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 0, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createMine((byte) 1, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 1, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createMine((byte) 2, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 2, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 2, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createMine((byte) 3, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 3, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 3, (byte) 2, (byte) 0, (byte) 0, 1)); + } + + // TODO Icons + @SideOnly(Side.CLIENT) + public IIcon getIcon(byte type) { return mines[type]; } - private IIcon[] mines = new IIcon[4]; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - this.itemIcon = mines[0] = reg.registerIcon("minefantasy2:Other/mine_ceramic"); - mines[1] = reg.registerIcon("minefantasy2:Other/mine_iron"); - mines[2] = reg.registerIcon("minefantasy2:Other/mine_obsidian"); - mines[3] = reg.registerIcon("minefantasy2:Other/mine_crystal"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconIndex(ItemStack item) - { - int type = getCasing(item); - return mines[type]; - } - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack item, int layer) - { - if(layer > 0) - { - int type = getFilling(item); - if(type != 0) - { - return ToolListMF.bomb_custom.icons[type-1]; - } - } - return getIconIndex(item); - } - - @Override + + private IIcon[] mines = new IIcon[4]; + + @Override @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return true; - } - - @Override - public EnumRarity getRarity(ItemStack item) - { - if(getFilling(item) >= 2 || getCasing(item) >= 2) - { - return EnumRarity.uncommon; - } - return EnumRarity.common; - } - @Override - public Object[] getSalvage(ItemStack item) - { - return new Object[] - { - ItemBombComponent.getBombComponent("minecase", getCasing(item)), - ItemBombComponent.getBombComponent("fuse", getFuse(item)), - ItemBombComponent.getBombComponent("powder", getPowder(item)), - ItemBombComponent.getBombComponent("filling", getFilling(item)), - }; + public void registerIcons(IIconRegister reg) { + this.itemIcon = mines[0] = reg.registerIcon("minefantasy2:Other/mine_ceramic"); + mines[1] = reg.registerIcon("minefantasy2:Other/mine_iron"); + mines[2] = reg.registerIcon("minefantasy2:Other/mine_obsidian"); + mines[3] = reg.registerIcon("minefantasy2:Other/mine_crystal"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack item) { + int type = getCasing(item); + return mines[type]; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack item, int layer) { + if (layer > 0) { + int type = getFilling(item); + if (type != 0) { + return ToolListMF.bomb_custom.icons[type - 1]; + } + } + return getIconIndex(item); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + if (getFilling(item) >= 2 || getCasing(item) >= 2) { + return EnumRarity.uncommon; + } + return EnumRarity.common; + } + + @Override + public Object[] getSalvage(ItemStack item) { + return new Object[] { ItemBombComponent.getBombComponent("minecase", getCasing(item)), + ItemBombComponent.getBombComponent("fuse", getFuse(item)), + ItemBombComponent.getBombComponent("powder", getPowder(item)), + ItemBombComponent.getBombComponent("filling", getFilling(item)), }; } @Override diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemParachute.java b/src/main/java/minefantasy/mf2/item/gadget/ItemParachute.java index 22a46ca3..792ba8b5 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemParachute.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemParachute.java @@ -9,29 +9,25 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class ItemParachute extends Item -{ - public ItemParachute() - { - String name = "parachute"; - this.maxStackSize = 1; - this.setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/"+name); +public class ItemParachute extends Item { + public ItemParachute() { + String name = "parachute"; + this.maxStackSize = 1; + this.setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } + } - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(!world.isRemote) - { - world.playSoundAtEntity(user, "mob.horse.leather", 1.0F, 0.5F); - EntityParachute chute = new EntityParachute(world, user.posX, user.posY, user.posZ); - world.spawnEntityInWorld(chute); - user.mountEntity(chute); - --item.stackSize; - } - return item; - } + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote) { + world.playSoundAtEntity(user, "mob.horse.leather", 1.0F, 0.5F); + EntityParachute chute = new EntityParachute(world, user.posX, user.posY, user.posZ); + world.spawnEntityInWorld(chute); + user.mountEntity(chute); + --item.stackSize; + } + return item; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemSpyglass.java b/src/main/java/minefantasy/mf2/item/gadget/ItemSpyglass.java index 6bb7f0e8..0ead0c75 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemSpyglass.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemSpyglass.java @@ -13,74 +13,66 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class ItemSpyglass extends Item implements IScope -{ - public ItemSpyglass() - { +public class ItemSpyglass extends Item implements IScope { + public ItemSpyglass() { this.setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/spyglass_small"); + setTextureName("minefantasy2:Other/spyglass_small"); GameRegistry.registerItem(this, "spyglass", MineFantasyII.MODID); this.setUnlocalizedName("spyglass"); this.setHasSubtypes(true); this.setMaxDamage(0); this.setMaxStackSize(1); } + @Override - public EnumAction getItemUseAction(ItemStack item) - { - return EnumAction.bow; - } + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.bow; + } + @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(user.isSneaking()) - { + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (user.isSneaking()) { world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "random.click", 1.0F, 1.5F); - toggleMode(item); - user.swingItem(); - } - else - { - user.setItemInUse(item, getMaxItemUseDuration(item)); - } - return item; - } - private void toggleMode(ItemStack item) - { - int dam = item.getItemDamage(); - item.setItemDamage(dam == 2 ? 0 : dam+1); + toggleMode(item); + user.swingItem(); + } else { + user.setItemInUse(item, getMaxItemUseDuration(item)); + } + return item; + } + + private void toggleMode(ItemStack item) { + int dam = item.getItemDamage(); + item.setItemDamage(dam == 2 ? 0 : dam + 1); } + @Override - public int getMaxItemUseDuration(ItemStack item) - { - return Integer.MAX_VALUE; - } - + public int getMaxItemUseDuration(ItemStack item) { + return Integer.MAX_VALUE; + } + public IIcon[] icons = new IIcon[3]; + @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { icons[0] = reg.registerIcon("minefantasy2:Other/spyglass_small"); icons[1] = reg.registerIcon("minefantasy2:Other/spyglass_medium"); - icons[2] = reg.registerIcon("minefantasy2:Other/spyglass_long"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int id) - { - if(id > 2) - { - id = 2; - } - return icons[id]; - } - - @Override - public float getZoom(ItemStack item) - { - int id = item.getItemDamage(); - return 0.5F + (0.25F* id); - } + icons[2] = reg.registerIcon("minefantasy2:Other/spyglass_long"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int id) { + if (id > 2) { + id = 2; + } + return icons[id]; + } + + @Override + public float getZoom(ItemStack item) { + int id = item.getItemDamage(); + return 0.5F + (0.25F * id); + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemSyringe.java b/src/main/java/minefantasy/mf2/item/gadget/ItemSyringe.java index b3f58a8a..ee50ec42 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemSyringe.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemSyringe.java @@ -30,217 +30,180 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class ItemSyringe extends ItemPotion -{ - public ItemSyringe() - { - super(); - this.setMaxStackSize(16); - String name = "syringe"; - this.setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/"+name); +public class ItemSyringe extends ItemPotion { + public ItemSyringe() { + super(); + this.setMaxStackSize(16); + String name = "syringe"; + this.setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) - { + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", 0, 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", 0, 0)); + + return map; } - @Override - public boolean hitEntity(ItemStack item, EntityLivingBase target, EntityLivingBase user) - { - World world = user.worldObj; - - target.playSound("random.drink", 1.0F, 2.0F); - target.playSound("minefantasy2:weapon.hit.blade.metal", 1.0F, 1.5F); - if (!world.isRemote) - { - apply(target, item); - } - - if (user instanceof EntityPlayer && !((EntityPlayer)user).capabilities.isCreativeMode) - { - --item.stackSize; - - if (item.stackSize <= 0) - { - user.setCurrentItemOrArmor(0, new ItemStack(ToolListMF.syringe_empty)); - } - else - { - if(!((EntityPlayer)user).inventory.addItemStackToInventory(new ItemStack(ToolListMF.syringe_empty))) - { - user.entityDropItem(new ItemStack(ToolListMF.syringe_empty), 0F); - } - } - } - - return true; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) - { - if(user.isSwingInProgress) - { - return item; - } - user.swingItem(); - - if (!user.capabilities.isCreativeMode) - { - --item.stackSize; - } - - user.playSound("random.drink", 1.0F, 2.0F); - user.playSound("minefantasy2:weapon.hit.blade.metal", 1.0F, 1.5F); - if (!world.isRemote) - { - apply(user, item); - } - - if (!user.capabilities.isCreativeMode) - { - if (item.stackSize <= 0) - { - return new ItemStack(ToolListMF.syringe_empty); - } - - if(!user.inventory.addItemStackToInventory(new ItemStack(ToolListMF.syringe_empty))) - { - user.entityDropItem(new ItemStack(ToolListMF.syringe_empty), 0F); - } - } - - return item; - } - private void apply(EntityLivingBase target, ItemStack item) - { - List list = this.getEffects(item); - - if (list != null) - { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) - { - PotionEffect potioneffect = (PotionEffect)iterator.next(); - target.addPotionEffect(new PotionEffect(potioneffect)); - } - } + + @Override + public boolean hitEntity(ItemStack item, EntityLivingBase target, EntityLivingBase user) { + World world = user.worldObj; + + target.playSound("random.drink", 1.0F, 2.0F); + target.playSound("minefantasy2:weapon.hit.blade.metal", 1.0F, 1.5F); + if (!world.isRemote) { + apply(target, item); + } + + if (user instanceof EntityPlayer && !((EntityPlayer) user).capabilities.isCreativeMode) { + --item.stackSize; + + if (item.stackSize <= 0) { + user.setCurrentItemOrArmor(0, new ItemStack(ToolListMF.syringe_empty)); + } else { + if (!((EntityPlayer) user).inventory.addItemStackToInventory(new ItemStack(ToolListMF.syringe_empty))) { + user.entityDropItem(new ItemStack(ToolListMF.syringe_empty), 0F); + } + } + } + + return true; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (user.isSwingInProgress) { + return item; + } + user.swingItem(); + + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + + user.playSound("random.drink", 1.0F, 2.0F); + user.playSound("minefantasy2:weapon.hit.blade.metal", 1.0F, 1.5F); + if (!world.isRemote) { + apply(user, item); + } + + if (!user.capabilities.isCreativeMode) { + if (item.stackSize <= 0) { + return new ItemStack(ToolListMF.syringe_empty); + } + + if (!user.inventory.addItemStackToInventory(new ItemStack(ToolListMF.syringe_empty))) { + user.entityDropItem(new ItemStack(ToolListMF.syringe_empty), 0F); + } + } + + return item; } + + private void apply(EntityLivingBase target, ItemStack item) { + List list = this.getEffects(item); + + if (list != null) { + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) { + PotionEffect potioneffect = (PotionEffect) iterator.next(); + target.addPotionEffect(new PotionEffect(potioneffect)); + } + } + } + private IIcon icon, fill; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - this.icon = reg.registerIcon(this.getIconString()); - this.fill = reg.registerIcon(this.getIconString() + "_" + "fill"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int p_77617_1_) - { - return icon; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamageForRenderPass(int p_77618_1_, int p_77618_2_) - { - return p_77618_2_ == 0 ? fill : super.getIconFromDamageForRenderPass(p_77618_1_, p_77618_2_); - } - - @Override - public String getItemStackDisplayName(ItemStack item) - { - if (item.getItemDamage() == 0) - { - return StatCollector.translateToLocal("item.syringe_empty.name"); - } - else - { - String s = ""; - - List list = Items.potionitem.getEffects(item); - String s1; - - if (list != null && !list.isEmpty()) - { - s1 = ((PotionEffect)list.get(0)).getEffectName(); - s1 = s1 + ".postfix"; - return s + StatCollector.translateToLocal(s1).trim(); - } - else - { - s1 = PotionHelper.func_77905_c(item.getItemDamage()); - return StatCollector.translateToLocal(s1).trim() + " " + super.getItemStackDisplayName(item); - } - } - } - private static final Map potionMap = new LinkedHashMap(); - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs tab, List list) - { - int sub; - - if (potionMap.isEmpty()) - { - for (int i = 0; i <= 15; ++i) - { - for (sub = 0; sub <= 0; ++sub) - { - int k; - - if (sub == 0) - { - k = i | 8192; - } - else - { - k = i | 16384; - } - - for (int l = 0; l <= 2; ++l) - { - int i1 = k; - - if (l != 0) - { - if (l == 1) - { - i1 = k | 32; - } - else if (l == 2) - { - i1 = k | 64; - } - } - - List list1 = PotionHelper.getPotionEffects(i1, false); - - if (list1 != null && !list1.isEmpty() && !ItemPotion.isSplash(i1)) - { - potionMap.put(list1, Integer.valueOf(i1)); - } - } - } - } - } - - Iterator iterator = potionMap.values().iterator(); - - while (iterator.hasNext()) - { - sub = ((Integer)iterator.next()).intValue(); - list.add(new ItemStack(item, 1, sub)); - } - } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + this.icon = reg.registerIcon(this.getIconString()); + this.fill = reg.registerIcon(this.getIconString() + "_" + "fill"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int p_77617_1_) { + return icon; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamageForRenderPass(int p_77618_1_, int p_77618_2_) { + return p_77618_2_ == 0 ? fill : super.getIconFromDamageForRenderPass(p_77618_1_, p_77618_2_); + } + + @Override + public String getItemStackDisplayName(ItemStack item) { + if (item.getItemDamage() == 0) { + return StatCollector.translateToLocal("item.syringe_empty.name"); + } else { + String s = ""; + + List list = Items.potionitem.getEffects(item); + String s1; + + if (list != null && !list.isEmpty()) { + s1 = ((PotionEffect) list.get(0)).getEffectName(); + s1 = s1 + ".postfix"; + return s + StatCollector.translateToLocal(s1).trim(); + } else { + s1 = PotionHelper.func_77905_c(item.getItemDamage()); + return StatCollector.translateToLocal(s1).trim() + " " + super.getItemStackDisplayName(item); + } + } + } + + private static final Map potionMap = new LinkedHashMap(); + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + int sub; + + if (potionMap.isEmpty()) { + for (int i = 0; i <= 15; ++i) { + for (sub = 0; sub <= 0; ++sub) { + int k; + + if (sub == 0) { + k = i | 8192; + } else { + k = i | 16384; + } + + for (int l = 0; l <= 2; ++l) { + int i1 = k; + + if (l != 0) { + if (l == 1) { + i1 = k | 32; + } else if (l == 2) { + i1 = k | 64; + } + } + + List list1 = PotionHelper.getPotionEffects(i1, false); + + if (list1 != null && !list1.isEmpty() && !ItemPotion.isSplash(i1)) { + potionMap.put(list1, Integer.valueOf(i1)); + } + } + } + } + } + + Iterator iterator = potionMap.values().iterator(); + + while (iterator.hasNext()) { + sub = ((Integer) iterator.next()).intValue(); + list.add(new ItemStack(item, 1, sub)); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/gadget/MobSpawnerMF.java b/src/main/java/minefantasy/mf2/item/gadget/MobSpawnerMF.java index e909b342..93adafe3 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/MobSpawnerMF.java +++ b/src/main/java/minefantasy/mf2/item/gadget/MobSpawnerMF.java @@ -5,11 +5,11 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.entity.EntityCogwork; -import minefantasy.mf2.entity.mob.*; +import minefantasy.mf2.entity.mob.EntityDragon; +import minefantasy.mf2.entity.mob.EntityHound; +import minefantasy.mf2.entity.mob.EntityMinotaur; import minefantasy.mf2.item.ItemComponentMF; -import minefantasy.mf2.item.list.CreativeTabMF; import net.minecraft.block.Block; -import net.minecraft.block.BlockLiquid; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; @@ -17,22 +17,19 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IEntityLivingData; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.Facing; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class MobSpawnerMF extends ItemComponentMF -{ - public String[] types = new String[]{"dragon", "minotaur", "hound", "cogwork"}; +public class MobSpawnerMF extends ItemComponentMF { + public String[] types = new String[] { "dragon", "minotaur", "hound", "cogwork" }; public IIcon[] icons; - public MobSpawnerMF() - { + + public MobSpawnerMF() { super("MF_Spawner"); this.setHasSubtypes(true); this.setCreativeTab(CreativeTabs.tabMisc); @@ -40,111 +37,103 @@ public MobSpawnerMF() @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - list.add(StatCollector.translateToLocal("item.spawn_"+types[Math.min(types.length-1, item.getItemDamage())]+".desc")); - } + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + list.add(StatCollector + .translateToLocal("item.spawn_" + types[Math.min(types.length - 1, item.getItemDamage())] + ".desc")); + } + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - for(int i = 0; i < types.length; i ++) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i < types.length; i++) { list.add(new ItemStack(item, 1, i)); } - } - + } + @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - return StatCollector.translateToLocal("item.spawn_"+types[Math.min(types.length-1, item.getItemDamage())]+".name"); - } - + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + return StatCollector + .translateToLocal("item.spawn_" + types[Math.min(types.length - 1, item.getItemDamage())] + ".name"); + } + @Override - public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int blockX, int blockY, int blockZ, int face, float ox, float oy, float oz) - { - if (world.isRemote) - { - return true; - } - else - { - Block block = world.getBlock(blockX, blockY, blockZ); - blockX += Facing.offsetsXForSide[face]; - blockY += Facing.offsetsYForSide[face]; - blockZ += Facing.offsetsZForSide[face]; - double d0 = 0.0D; - - if (face == 1 && block.getRenderType() == 11) - { - d0 = 0.5D; - } - - Entity entity = spawnCreature(world, item.getItemDamage(), (double)blockX + 0.5D, (double)blockY + d0, (double)blockZ + 0.5D); - - if (entity != null) - { - if (entity instanceof EntityLivingBase && item.hasDisplayName()) - { - ((EntityLiving)entity).setCustomNameTag(item.getDisplayName()); - } - - if (!user.capabilities.isCreativeMode) - { - --item.stackSize; - } - } - - return true; - } - } - - private Entity spawnCreature(World world, int itemDamage, double x, double y, double z) - { + public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int blockX, int blockY, int blockZ, + int face, float ox, float oy, float oz) { + if (world.isRemote) { + return true; + } else { + Block block = world.getBlock(blockX, blockY, blockZ); + blockX += Facing.offsetsXForSide[face]; + blockY += Facing.offsetsYForSide[face]; + blockZ += Facing.offsetsZForSide[face]; + double d0 = 0.0D; + + if (face == 1 && block.getRenderType() == 11) { + d0 = 0.5D; + } + + Entity entity = spawnCreature(world, item.getItemDamage(), blockX + 0.5D, blockY + d0, blockZ + 0.5D); + + if (entity != null) { + if (entity instanceof EntityLivingBase && item.hasDisplayName()) { + ((EntityLiving) entity).setCustomNameTag(item.getDisplayName()); + } + + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + } + + return true; + } + } + + private Entity spawnCreature(World world, int itemDamage, double x, double y, double z) { EntityLivingBase entityliving = getLiving(world, itemDamage); - - entityliving.setLocationAndAngles(x, y, z, MathHelper.wrapAngleTo180_float(world.rand.nextFloat() * 360.0F), 0.0F); - entityliving.rotationYawHead = entityliving.rotationYaw; - entityliving.renderYawOffset = entityliving.rotationYaw; - if(entityliving instanceof EntityLiving) - { - ((EntityLiving) entityliving).onSpawnWithEgg((IEntityLivingData)null); - } - world.spawnEntityInWorld(entityliving); - if(entityliving instanceof EntityLiving) - { - ((EntityLiving) entityliving).playLivingSound(); - } - - return entityliving; + + entityliving.setLocationAndAngles(x, y, z, MathHelper.wrapAngleTo180_float(world.rand.nextFloat() * 360.0F), + 0.0F); + entityliving.rotationYawHead = entityliving.rotationYaw; + entityliving.renderYawOffset = entityliving.rotationYaw; + if (entityliving instanceof EntityLiving) { + ((EntityLiving) entityliving).onSpawnWithEgg((IEntityLivingData) null); + } + world.spawnEntityInWorld(entityliving); + if (entityliving instanceof EntityLiving) { + ((EntityLiving) entityliving).playLivingSound(); + } + + return entityliving; } - private EntityLivingBase getLiving(World world, int id) - { - switch(id) - { - case 0: return new EntityDragon(world); - case 1: return new EntityMinotaur(world); - case 2: return new EntityHound(world); - case 3: return new EntityCogwork(world); - - default: return new EntityDragon(world); + private EntityLivingBase getLiving(World world, int id) { + switch (id) { + case 0: + return new EntityDragon(world); + case 1: + return new EntityMinotaur(world); + case 2: + return new EntityHound(world); + case 3: + return new EntityCogwork(world); + + default: + return new EntityDragon(world); } } + @Override @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int d) - { - return icons[Math.min(icons.length-1, d)]; - } + public IIcon getIconFromDamage(int d) { + return icons[Math.min(icons.length - 1, d)]; + } + @SideOnly(Side.CLIENT) @Override - public void registerIcons(IIconRegister reg) - { + public void registerIcons(IIconRegister reg) { icons = new IIcon[types.length]; - for(int i = 0; i < types.length; i ++) - { - icons[i] = reg.registerIcon("minefantasy2:Other/spawn_"+types[i]); + for (int i = 0; i < types.length; i++) { + icons[i] = reg.registerIcon("minefantasy2:Other/spawn_" + types[i]); } - } + } } diff --git a/src/main/java/minefantasy/mf2/item/heatable/ItemHeated.java b/src/main/java/minefantasy/mf2/item/heatable/ItemHeated.java index 2b13be49..ff9a2055 100644 --- a/src/main/java/minefantasy/mf2/item/heatable/ItemHeated.java +++ b/src/main/java/minefantasy/mf2/item/heatable/ItemHeated.java @@ -3,18 +3,16 @@ import java.awt.Color; import java.util.List; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.heating.Heatable; import minefantasy.mf2.api.heating.IHotItem; import minefantasy.mf2.api.heating.TongsHelper; -import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.helpers.GuiHelper; -import minefantasy.mf2.api.material.CustomMaterial; -import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.util.MFLogUtil; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -27,14 +25,9 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class ItemHeated extends Item implements IHotItem -{ - public ItemHeated() - { +public class ItemHeated extends Item implements IHotItem { + public ItemHeated() { GameRegistry.registerItem(this, "MF_Hot_Item", MineFantasyII.MODID); this.setUnlocalizedName("MF_Hot_Item"); this.setHasSubtypes(true); @@ -44,15 +37,16 @@ public ItemHeated() public static int getTemp(ItemStack item) { return Heatable.getTemp(item); } + public static int getWorkTemp(ItemStack item) { return Heatable.getWorkTemp(item); } + public static int getUnstableTemp(ItemStack item) { return Heatable.getWorkTemp(item); } - public static ItemStack getItem(ItemStack item) - { + public static ItemStack getItem(ItemStack item) { return Heatable.getItem(item); } @@ -61,11 +55,13 @@ public static void setTemp(ItemStack item, int heat) { nbt.setInteger(Heatable.NBT_CurrentTemp, heat); } + public static void setWorkTemp(ItemStack item, int heat) { NBTTagCompound nbt = getNBT(item); MFLogUtil.logDebug("Set Workable Temp: " + heat); nbt.setInteger(Heatable.NBT_WorkableTemp, heat); } + public static void setUnstableTemp(ItemStack item, int heat) { NBTTagCompound nbt = getNBT(item); MFLogUtil.logDebug("Set Unstable Temp: " + heat); @@ -75,67 +71,59 @@ public static void setUnstableTemp(ItemStack item, int heat) { public static ItemStack createHotItem(ItemStack item) { return createHotItem(item, false); } - public static ItemStack createHotItem(ItemStack item, int temp) - { + + public static ItemStack createHotItem(ItemStack item, int temp) { ItemStack hot = createHotItem(item, true); setTemp(hot, temp); - + return hot; } - public static ItemStack createHotItem(ItemStack item, boolean ignoreStats) - { + + public static ItemStack createHotItem(ItemStack item, boolean ignoreStats) { Heatable stats = Heatable.loadStats(item); - if(stats != null) - { + if (stats != null) { ItemStack out = new ItemStack(ComponentListMF.hotItem, item.stackSize); NBTTagCompound nbt = getNBT(out); NBTTagCompound save = new NBTTagCompound(); item.writeToNBT(save); nbt.setTag(Heatable.NBT_Item, save); - + nbt.setBoolean(Heatable.NBT_ShouldDisplay, true); setWorkTemp(out, stats.getWorkableStat(item)); setUnstableTemp(out, stats.getUnstableStat(item)); - + return out; - } - else if(ignoreStats) - { + } else if (ignoreStats) { ItemStack out = new ItemStack(ComponentListMF.hotItem, item.stackSize); NBTTagCompound nbt = getNBT(out); NBTTagCompound save = new NBTTagCompound(); item.writeToNBT(save); nbt.setTag(Heatable.NBT_Item, save); - + nbt.setBoolean(Heatable.NBT_ShouldDisplay, false); setWorkTemp(out, 0); setUnstableTemp(out, 0); - + return out; } return item; } - private static void shareTraits(NBTTagCompound nbt, ItemStack item) - { + private static void shareTraits(NBTTagCompound nbt, ItemStack item) { NBTTagCompound itemtag = getNBT(item); - if(itemtag.hasKey("Unbreakable")) - { + if (itemtag.hasKey("Unbreakable")) { nbt.setBoolean("Unbreakable", itemtag.getBoolean("Unbreakable")); } - if(itemtag.hasKey("MF_Inferior")) - { + if (itemtag.hasKey("MF_Inferior")) { nbt.setBoolean("MF_Inferior", itemtag.getBoolean("MF_Inferior")); } - if(itemtag.hasKey("MFCraftQuality")) - { + if (itemtag.hasKey("MFCraftQuality")) { nbt.setFloat("MFCraftQuality", itemtag.getFloat("MFCraftQuality")); } } @Override - public String getItemStackDisplayName(ItemStack stack) - { + public String getItemStackDisplayName(ItemStack stack) { String name = ""; ItemStack item = getItem(stack); @@ -199,14 +187,13 @@ private String getHeatString(ItemStack item) { return heat + unit; } - private String getWorkString(ItemStack heated, ItemStack item) - { + private String getWorkString(ItemStack heated, ItemStack item) { byte stage = Heatable.getHeatableStage(item); switch (stage) { - case 1: - return EnumChatFormatting.YELLOW + StatCollector.translateToLocal("state.workable"); - case 2: - return EnumChatFormatting.RED + StatCollector.translateToLocal("state.unstable"); + case 1: + return EnumChatFormatting.YELLOW + StatCollector.translateToLocal("state.workable"); + case 2: + return EnumChatFormatting.RED + StatCollector.translateToLocal("state.unstable"); } return ""; } @@ -221,13 +208,11 @@ public IIcon getIcon(ItemStack stack, int renderPass) { } @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { + public void registerIcons(IIconRegister reg) { } - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) - { + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); if (movingobjectposition == null) { @@ -247,8 +232,7 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer play } float water = TongsHelper.getWaterSource(world, i, j, k); - if (water >= 0) - { + if (water >= 0) { player.playSound("random.splash", 1F, 1F); player.playSound("random.fizz", 2F, 0.5F); @@ -257,15 +241,14 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer play } ItemStack drop = getItem(item).copy(); - - if(Heatable.HCCquenchRuin) - { + + if (Heatable.HCCquenchRuin) { float damageDone = 50F + (water > 0F ? water : 0F); - if(damageDone > 99F)damageDone = 99F; - - if(drop.isItemStackDamageable()) - { - drop.setItemDamage((int) (drop.getMaxDamage()*damageDone/100F)); + if (damageDone > 99F) + damageDone = 99F; + + if (drop.isItemStackDamageable()) { + drop.setItemDamage((int) (drop.getMaxDamage() * damageDone / 100F)); } } drop.stackSize = item.stackSize; @@ -284,10 +267,9 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer play } public static boolean renderDynamicHotIngotRendering = true; - public int getColorFromItemStack(ItemStack item, int renderPass) - { - if (renderPass > 1 || !renderDynamicHotIngotRendering) - { + + public int getColorFromItemStack(ItemStack item, int renderPass) { + if (renderPass > 1 || !renderDynamicHotIngotRendering) { return Color.WHITE.getRGB(); } NBTTagCompound nbt = getNBT(item); @@ -298,25 +280,24 @@ public int getColorFromItemStack(ItemStack item, int renderPass) int red = getRedOnHeat(heatPer); int green = getGreenOnHeat(heatPer); int blue = getBlueOnHeat(heatPer); - + float curr_red = 1.0F; float curr_green = 1.0F; float curr_blue = 1.0F; - + ItemStack held = getItem(item); - if(held != null) - { + if (held != null) { int colour = held.getItem().getColorFromItemStack(held, 0); - - curr_red = (float)(colour >> 16 & 255) / 255.0F; - curr_green = (float)(colour >> 8 & 255) / 255.0F; - curr_blue = (float)(colour & 255) / 255.0F; - - red = (int) ((float)red * curr_red); - green = (int) ((float)green * curr_green); - blue = (int) ((float)blue * curr_blue); + + curr_red = (colour >> 16 & 255) / 255.0F; + curr_green = (colour >> 8 & 255) / 255.0F; + curr_blue = (colour & 255) / 255.0F; + + red = (int) (red * curr_red); + green = (int) (green * curr_green); + blue = (int) (blue * curr_blue); } - + return GuiHelper.getColourForRGB(red, green, blue); } @@ -325,15 +306,15 @@ public boolean requiresMultipleRenderPasses() { return true; } - private int getRedOnHeat(double percent) - { - if(percent <= 0)return 255; + private int getRedOnHeat(double percent) { + if (percent <= 0) + return 255; return 255; } - private int getGreenOnHeat(double percent) - { - if(percent <= 0)return 255; + private int getGreenOnHeat(double percent) { + if (percent <= 0) + return 255; if (percent > 100) percent = 100; if (percent < 0) @@ -346,10 +327,10 @@ private int getGreenOnHeat(double percent) } } - private int getBlueOnHeat(double percent) - { - if(percent <= 0)return 255; - + private int getBlueOnHeat(double percent) { + if (percent <= 0) + return 255; + if (percent > 100) percent = 100; if (percent < 0) diff --git a/src/main/java/minefantasy/mf2/item/list/ArmourListMF.java b/src/main/java/minefantasy/mf2/item/list/ArmourListMF.java index 0659241d..afc8642f 100644 --- a/src/main/java/minefantasy/mf2/item/list/ArmourListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ArmourListMF.java @@ -2,7 +2,6 @@ import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.armour.ArmourMaterialMF; -import minefantasy.mf2.api.crafting.exotic.SpecialForging; import minefantasy.mf2.item.armour.ItemApron; import minefantasy.mf2.item.armour.ItemArmourMF; import minefantasy.mf2.material.BaseMaterialMF; @@ -13,68 +12,57 @@ /** * @author Anonymous Productions */ -public class ArmourListMF -{ - public static ArmourMaterialMF LEATHER = new ArmourMaterialMF("Leather", 5, 0.30F, 18, 1.00F); - public static ArmourMaterialMF APRON = new ArmourMaterialMF("Apron", 6, 0.30F, 0, 1.00F); - - public static final String[] leathermats = new String[] - { - "hide", - "roughleather", - "strongleather", - "studleather", - "padded", - }; - - public static ItemArmourMF[] leather = new ItemArmourMF[leathermats.length*4]; +public class ArmourListMF { + public static ArmourMaterialMF LEATHER = new ArmourMaterialMF("Leather", 5, 0.30F, 18, 1.00F); + public static ArmourMaterialMF APRON = new ArmourMaterialMF("Apron", 6, 0.30F, 0, 1.00F); + + public static final String[] leathermats = new String[] { "hide", "roughleather", "strongleather", "studleather", + "padded", }; + + public static ItemArmourMF[] leather = new ItemArmourMF[leathermats.length * 4]; public static ItemArmourMF leatherapron; - - - public static void load() - { + + public static void load() { leatherapron = new ItemApron("leatherapron", BaseMaterialMF.leatherapron, "leatherapron_layer_1", 0); - - for(int a = 0; a < leathermats.length; a ++) - { + + for (int a = 0; a < leathermats.length; a++) { BaseMaterialMF baseMat = BaseMaterialMF.getMaterial(leathermats[a]); String matName = baseMat.name; int rarity = baseMat.rarity; - int id = a*4; + int id = a * 4; float bulk = baseMat.weight; ArmourDesign design = baseMat == BaseMaterialMF.padding ? ArmourDesign.PADDING : ArmourDesign.LEATHER; - - leather[id+0] = new ItemArmourMF(matName.toLowerCase()+"_helmet", baseMat, design, 0, matName.toLowerCase()+"_layer_1", rarity, bulk); - leather[id+1] = new ItemArmourMF(matName.toLowerCase()+"_chest", baseMat, design, 1, matName.toLowerCase()+"_layer_1", rarity, bulk); - leather[id+2] = new ItemArmourMF(matName.toLowerCase()+"_legs", baseMat, design, 2, matName.toLowerCase()+"_layer_2", rarity, bulk); - leather[id+3] = new ItemArmourMF(matName.toLowerCase()+"_boots", baseMat, design, 3, matName.toLowerCase()+"_layer_1", rarity, bulk); + + leather[id + 0] = new ItemArmourMF(matName.toLowerCase() + "_helmet", baseMat, design, 0, + matName.toLowerCase() + "_layer_1", rarity, bulk); + leather[id + 1] = new ItemArmourMF(matName.toLowerCase() + "_chest", baseMat, design, 1, + matName.toLowerCase() + "_layer_1", rarity, bulk); + leather[id + 2] = new ItemArmourMF(matName.toLowerCase() + "_legs", baseMat, design, 2, + matName.toLowerCase() + "_layer_2", rarity, bulk); + leather[id + 3] = new ItemArmourMF(matName.toLowerCase() + "_boots", baseMat, design, 3, + matName.toLowerCase() + "_layer_1", rarity, bulk); } } - - public static ItemStack armour(ItemArmourMF[] pool, int tier, int piece) - { - int slot = tier*4+piece; - if(slot >= pool.length) - { - slot = pool.length-1; + + public static ItemStack armour(ItemArmourMF[] pool, int tier, int piece) { + int slot = tier * 4 + piece; + if (slot >= pool.length) { + slot = pool.length - 1; } return new ItemStack(pool[slot]); } - public static Item armourItem(ItemArmourMF[] pool, int tier, int piece) - { - int slot = tier*4+piece; - if(slot >= pool.length) - { - slot = pool.length-1; + + public static Item armourItem(ItemArmourMF[] pool, int tier, int piece) { + int slot = tier * 4 + piece; + if (slot >= pool.length) { + slot = pool.length - 1; } return pool[slot]; } - - - public static boolean isUnbreakable(BaseMaterialMF material, EntityLivingBase user) - { - if(material == BaseMaterialMF.enderforge || material == BaseMaterialMF.ignotumite || material == BaseMaterialMF.mithium) - { + + public static boolean isUnbreakable(BaseMaterialMF material, EntityLivingBase user) { + if (material == BaseMaterialMF.enderforge || material == BaseMaterialMF.ignotumite + || material == BaseMaterialMF.mithium) { return true; } return false; diff --git a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java index 5ec45504..643fff4b 100644 --- a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java @@ -27,62 +27,43 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; + /** * @author Anonymous Productions */ -public class ComponentListMF -{ - public static final String[] ingotMats = new String[] - { - "copper", - "tin", - "bronze", - "pigiron", - "steel", - "encrusted", - "blacksteelweak", - "blacksteel", - "silver", - "redsteelweak", - "redsteel", - "bluesteelweak", - "bluesteel", - "adamantium", - "mithril", - "ignotumite", - "mithium", - "ender", - "tungsten", - "obsidian", - }; - - - +public class ComponentListMF { + public static final String[] ingotMats = new String[] { "copper", "tin", "bronze", "pigiron", "steel", "encrusted", + "blacksteelweak", "blacksteel", "silver", "redsteelweak", "redsteel", "bluesteelweak", "bluesteel", + "adamantium", "mithril", "ignotumite", "mithium", "ender", "tungsten", "obsidian", }; + public static Item clay_pot = new ItemMFBowl("clay_pot").setStoragePlacement("pot", "pot"); public static Item clay_pot_uncooked = new ItemComponentMF("clay_pot_uncooked", 0); public static Item ingot_mould = new ItemComponentMF("ingot_mould").setStoragePlacement("bar", "mould"); public static Item ingot_mould_uncooked = new ItemComponentMF("ingot_mould_uncooked", 0); public static Item pie_tray_uncooked = new ItemComponentMF("pie_tray_uncooked", 0); - + public static ItemComponentMF[] ingots = new ItemComponentMF[ingotMats.length]; - - - public static ItemComponentMF plank = new ItemComponentMF("plank").setCustom(1, "wood").setStoragePlacement("plank", "plank"); + + public static ItemComponentMF plank = new ItemComponentMF("plank").setCustom(1, "wood").setStoragePlacement("plank", + "plank"); public static Item vine = new ItemComponentMF("vine", -1); public static Item sharp_rock = new ItemComponentMF("sharp_rock", -1); - + public static Item flux = new ItemComponentMF("flux", 0); public static Item flux_strong = new ItemComponentMF("flux_strong", 0); - + public static Item coalDust = new ItemComponentMF("coalDust", 0).setContainerItem(clay_pot); public static Item nitre = new ItemComponentMF("nitre", 0); public static Item sulfur = new ItemComponentMF("sulfur", 0); public static Item iron_prep = new ItemComponentMF("iron_prep", 0); public static Item blackpowder = new ItemBombComponent("blackpowder", 0, "powder", 0).setContainerItem(clay_pot); - public static Item blackpowder_advanced = new ItemBombComponent("blackpowder_advanced", 1, "powder", 1).setContainerItem(clay_pot); + public static Item blackpowder_advanced = new ItemBombComponent("blackpowder_advanced", 1, "powder", 1) + .setContainerItem(clay_pot); public static Item fletching = new ItemComponentMF("fletching", 0); - public static Item shrapnel = new ItemBombComponent("shrapnel", 0, "filling", 1).setContainerItem(ComponentListMF.clay_pot); - public static Item magma_cream_refined = new ItemBombComponent("magma_cream_refined", 1, "filling", 2).setContainerItem(clay_pot); + public static Item shrapnel = new ItemBombComponent("shrapnel", 0, "filling", 1) + .setContainerItem(ComponentListMF.clay_pot); + public static Item magma_cream_refined = new ItemBombComponent("magma_cream_refined", 1, "filling", 2) + .setContainerItem(clay_pot); public static Item bomb_fuse = new ItemBombComponent("bomb_fuse", 0, "fuse", 0); public static Item bomb_fuse_long = new ItemBombComponent("bomb_fuse_long", 0, "fuse", 1); public static Item bomb_casing_uncooked = new ItemComponentMF("bomb_casing_uncooked", 0); @@ -97,46 +78,47 @@ public class ComponentListMF public static Item mine_casing_crystal = new ItemBombComponent("mine_casing_crystal", 1, "minecase", 3); public static Item bomb_casing_arrow = new ItemBombComponent("bomb_casing_arrow", 1, "arrow", 0); public static Item bomb_casing_bolt = new ItemBombComponent("bomb_casing_bolt", 1, "bolt", 0); - + public static Item coke = new ItemComponentMF("coke", 1); public static Item diamond_shards = new ItemComponentMF("diamond_shards", 0); - + public static Item clay_brick = new ItemComponentMF("clay_brick", 0); public static Item kaolinite = new ItemComponentMF("kaolinite", 0); public static Item kaolinite_dust = new ItemComponentMF("kaolinite_dust", 0).setContainerItem(clay_pot); public static Item fireclay = new ItemComponentMF("fireclay", 0); public static Item fireclay_brick = new ItemComponentMF("fireclay_brick", 0); public static Item strong_brick = new ItemComponentMF("strong_brick", 0).setStoragePlacement("bar", "firebrick"); - + public static Item hideSmall = new ItemComponentMF("hideSmall", 0); public static Item hideMedium = new ItemComponentMF("hideMedium", 0); public static Item hideLarge = new ItemComponentMF("hideLarge", 0); public static Item rawhideSmall = new ItemHide("rawhideSmall", hideSmall, 1.0F); public static Item rawhideMedium = new ItemHide("rawhideMedium", hideMedium, 1.5F); public static Item rawhideLarge = new ItemHide("rawhideLarge", hideLarge, 3.0F); - + public static Item dragon_heart = new ItemSpecialDesign("dragon_heart", 1, "dragon"); - + public static Item leather_strip = new ItemComponentMF("leather_strip", 0); public static Item nail = new ItemComponentMF("nail", 0); public static Item rivet = new ItemComponentMF("rivet", 0); public static Item thread = new ItemComponentMF("thread", 0); public static Item obsidian_rock = new ItemComponentMF("obsidian_rock", 0); - + public static Item oreCopper = new ItemRawOreMF("oreCopper", -1); public static Item oreTin = new ItemRawOreMF("oreTin", -1); public static Item oreIron = new ItemRawOreMF("oreIron", 0); public static Item oreSilver = new ItemRawOreMF("oreSilver", 0); public static Item oreGold = new ItemRawOreMF("oreGold", 0); public static Item oreTungsten = new ItemRawOreMF("oreTungsten", 1); - + public static Item hotItem = new ItemHeated(); - - public static Item plant_oil = new ItemComponentMF("plant_oil", 0).setStoragePlacement("jug", "jugoil").setContainerItem(FoodListMF.jug_empty); - - public static Item talisman_lesser= new ItemComponentMF("talisman_lesser", 1); - public static Item talisman_greater= new ItemComponentMF("talisman_greater", 3); - + + public static Item plant_oil = new ItemComponentMF("plant_oil", 0).setStoragePlacement("jug", "jugoil") + .setContainerItem(FoodListMF.jug_empty); + + public static Item talisman_lesser = new ItemComponentMF("talisman_lesser", 1); + public static Item talisman_greater = new ItemComponentMF("talisman_greater", 3); + public static Item bolt = new ItemComponentMF("bolt", 0); public static Item iron_frame = new ItemComponentMF("iron_frame", 0); public static Item iron_strut = new ItemComponentMF("iron_strut", 0); @@ -146,53 +128,70 @@ public class ComponentListMF public static Item cogwork_shaft = new ItemComponentMF("cogwork_shaft", 1); public static Item ingotCompositeAlloy = new ItemComponentMF("ingotCompositeAlloy", 1); public static Item coal_prep = new ItemComponentMF("coal_prep", 0); - + public static Item ingot_mould_filled = new ItemFilledMould(); - - public static Item crossbow_stock_wood = new ItemCrossbowPart("cross_stock_wood", "stock").addSpeed(1.0F).addRecoil(0F); - public static Item crossbow_stock_iron = new ItemCrossbowPart("cross_stock_iron", "stock").addSpeed(1.0F).addRecoil(-2F).addDurability(150); - public static Item crossbow_handle_wood = new ItemCrossbowPart("cross_handle_wood", "stock").addSpeed(0.5F).addRecoil(2F).addSpread(1.0F).setHandCrossbow(true); - - public static Item cross_arms_basic = new ItemCrossbowPart("cross_arms_basic", "mechanism").addPower(1.00F).addSpeed(0.50F).addRecoil(4F).addSpread(1.00F); - public static Item cross_arms_light = new ItemCrossbowPart("cross_arms_light", "mechanism").addPower(0.85F).addSpeed(0.25F).addRecoil(2F).addSpread(0.50F); - public static Item cross_arms_heavy = new ItemCrossbowPart("cross_arms_heavy", "mechanism").addPower(1.15F).addSpeed(1.00F).addRecoil(8F).addSpread(2.00F); - public static Item cross_arms_advanced = new ItemCrossbowPart("cross_arms_advanced", "mechanism").addPower(1.15F).addSpeed(1.00F).addRecoil(6F).addSpread(0.25F).addDurability(150); - - public static Item cross_bayonet = new ItemCrossbowPart("cross_bayonet", "muzzle").addBash(4.0F).addRecoil(-1F).addSpeed(0.5F); + + public static Item crossbow_stock_wood = new ItemCrossbowPart("cross_stock_wood", "stock").addSpeed(1.0F) + .addRecoil(0F); + public static Item crossbow_stock_iron = new ItemCrossbowPart("cross_stock_iron", "stock").addSpeed(1.0F) + .addRecoil(-2F).addDurability(150); + public static Item crossbow_handle_wood = new ItemCrossbowPart("cross_handle_wood", "stock").addSpeed(0.5F) + .addRecoil(2F).addSpread(1.0F).setHandCrossbow(true); + + public static Item cross_arms_basic = new ItemCrossbowPart("cross_arms_basic", "mechanism").addPower(1.00F) + .addSpeed(0.50F).addRecoil(4F).addSpread(1.00F); + public static Item cross_arms_light = new ItemCrossbowPart("cross_arms_light", "mechanism").addPower(0.85F) + .addSpeed(0.25F).addRecoil(2F).addSpread(0.50F); + public static Item cross_arms_heavy = new ItemCrossbowPart("cross_arms_heavy", "mechanism").addPower(1.15F) + .addSpeed(1.00F).addRecoil(8F).addSpread(2.00F); + public static Item cross_arms_advanced = new ItemCrossbowPart("cross_arms_advanced", "mechanism").addPower(1.15F) + .addSpeed(1.00F).addRecoil(6F).addSpread(0.25F).addDurability(150); + + public static Item cross_bayonet = new ItemCrossbowPart("cross_bayonet", "muzzle").addBash(4.0F).addRecoil(-1F) + .addSpeed(0.5F); public static Item cross_ammo = new ItemCrossbowPart("cross_ammo", "mod").addCapacity(5).addSpread(2.00F); public static Item cross_scope = new ItemCrossbowPart("cross_scope", "mod").setScope(0.75F); - - public static ItemCustomComponent chainmesh = new ItemCustomComponent("chainmesh", 1F, "metal").setStoragePlacement("sheet", "mail"); - public static ItemCustomComponent scalemesh = new ItemCustomComponent("scalemesh", 1F, "metal").setStoragePlacement("sheet", "scale"); - public static ItemCustomComponent splintmesh = new ItemCustomComponent("splintmesh", 1F, "metal").setStoragePlacement("sheet", "splint"); - public static ItemCustomComponent plate = new ItemCustomComponent("plate", 2F, "metal").setStoragePlacement("sheet", "plate"); - public static ItemCustomComponent plate_huge = new ItemCustomComponent("plate_huge", 8F, "metal").setStoragePlacement("bigplate", "bigplate"); + + public static ItemCustomComponent chainmesh = new ItemCustomComponent("chainmesh", 1F, "metal") + .setStoragePlacement("sheet", "mail"); + public static ItemCustomComponent scalemesh = new ItemCustomComponent("scalemesh", 1F, "metal") + .setStoragePlacement("sheet", "scale"); + public static ItemCustomComponent splintmesh = new ItemCustomComponent("splintmesh", 1F, "metal") + .setStoragePlacement("sheet", "splint"); + public static ItemCustomComponent plate = new ItemCustomComponent("plate", 2F, "metal").setStoragePlacement("sheet", + "plate"); + public static ItemCustomComponent plate_huge = new ItemCustomComponent("plate_huge", 8F, "metal") + .setStoragePlacement("bigplate", "bigplate"); public static ItemCustomComponent metalHunk = new ItemCustomComponent("hunk", 0.25F, "metal"); - public static ItemCustomComponent arrowhead = new ItemCustomComponent("arrowhead", 1/4F, "metal"); - public static ItemCustomComponent bodkinhead = new ItemCustomComponent("bodkinhead", 1/4F, "metal"); - public static ItemCustomComponent broadhead = new ItemCustomComponent("broadhead", 1/4F, "metal"); - public static ItemCustomComponent cogwork_armour = (ItemCustomComponent) new ItemCustomComponent("cogwork_armour", 30F, "metal").setCanDamage().setCreativeTab(CreativeTabMF.tabGadget).setMaxStackSize(1); - public static ItemCustomComponent bar = (ItemCustomComponent) new ItemCustomComponent("bar", 1F, "metal").setStoragePlacement("bar", "bar").setCreativeTab(CreativeTabMF.tabMaterialsMF); - + public static ItemCustomComponent arrowhead = new ItemCustomComponent("arrowhead", 1 / 4F, "metal"); + public static ItemCustomComponent bodkinhead = new ItemCustomComponent("bodkinhead", 1 / 4F, "metal"); + public static ItemCustomComponent broadhead = new ItemCustomComponent("broadhead", 1 / 4F, "metal"); + public static ItemCustomComponent cogwork_armour = (ItemCustomComponent) new ItemCustomComponent("cogwork_armour", + 30F, "metal").setCanDamage().setCreativeTab(CreativeTabMF.tabGadget).setMaxStackSize(1); + public static ItemCustomComponent bar = (ItemCustomComponent) new ItemCustomComponent("bar", 1F, "metal") + .setStoragePlacement("bar", "bar").setCreativeTab(CreativeTabMF.tabMaterialsMF); + public static Item flux_pot = new ItemComponentMF("flux_pot", 0).setContainerItem(clay_pot); public static Item coal_flux = new ItemComponentMF("coal_flux", 0); - + public static Item copper_coin = new ItemComponentMF("copper_coin", 0); public static Item silver_coin = new ItemComponentMF("silver_coin", 0); public static Item gold_coin = new ItemComponentMF("gold_coin", 0); - + public static Item hinge = new ItemComponentMF("hinge", 0); - public static Item plank_cut = new ItemComponentMF("plank_cut").setCustom(1, "wood").setStoragePlacement("plank", "plankcut"); - public static Item plank_pane = new ItemComponentMF("plank_pane").setCustom(6, "wood").setStoragePlacement("sheet", "woodpane"); - - public static Item cogwork_pulley = new ItemComponentMF("cogwork_pulley", 1).setCreativeTab(CreativeTabMF.tabGadget); - + public static Item plank_cut = new ItemComponentMF("plank_cut").setCustom(1, "wood").setStoragePlacement("plank", + "plankcut"); + public static Item plank_pane = new ItemComponentMF("plank_pane").setCustom(6, "wood").setStoragePlacement("sheet", + "woodpane"); + + public static Item cogwork_pulley = new ItemComponentMF("cogwork_pulley", 1) + .setCreativeTab(CreativeTabMF.tabGadget); + public static Item artefacts = new ItemArtefact("artefact_any"); - + public static Item ornate_items = new ItemSpecialDesign("ornate_items", 1, "ornate"); - - public static void load() - { + + public static void load() { WoodMaterial.init(); Items.potionitem.setContainerItem(Items.glass_bottle); GameRegistry.registerFuelHandler(new FuelHandlerMF()); @@ -200,87 +199,82 @@ public static void load() Items.iron_ingot.setTextureName("minefantasy2:component/ingotWroughtIron"); Blocks.iron_block.setBlockTextureName("minefantasy2:metal/iron_block"); Blocks.iron_bars.setBlockTextureName("minefantasy2:metal/iron_bars"); - for(int a = 0; a < ingotMats.length; a ++) - { + for (int a = 0; a < ingotMats.length; a++) { BaseMaterialMF mat = BaseMaterialMF.getMaterial(ingotMats[a]); String name = mat.name; int rarity = mat.rarity; - - ingots[a] = new ItemComponentMF("ingot"+name, rarity); - OreDictionary.registerOre("ingot"+name, ingots[a]); + + ingots[a] = new ItemComponentMF("ingot" + name, rarity); + OreDictionary.registerOre("ingot" + name, ingots[a]); } - + addRandomDrops(); initFuels(); OreDictionary.registerOre("ingotCompositeAlloy", ingotCompositeAlloy); OreDictionary.registerOre("ingotIron", Items.iron_ingot); OreDictionary.registerOre("ingotGold", Items.gold_ingot); - + AdvancedFuelHandlerMF.registerItems(); } - private static void initFuels() - { - MineFantasyFuels.addForgeFuel(new ItemStack(Items.coal, 1, 0), 900, 1500);// 1500C , 45s - MineFantasyFuels.addForgeFuel(new ItemStack(Items.coal, 1, 1), 1200, 1800);// 1800C , 1m - MineFantasyFuels.addForgeFuel(Items.blaze_powder, 200, 3000, true);// 3000C , 10s - MineFantasyFuels.addForgeFuel(Items.blaze_rod, 300, 3000, true);// 3000C , 15s - MineFantasyFuels.addForgeFuel(Items.fire_charge, 1200, 3500,true);// 3500C , 1m - MineFantasyFuels.addForgeFuel(Items.lava_bucket, 2400, 5000, true);// 5000C , 2m - MineFantasyFuels.addForgeFuel(Items.magma_cream, 2400, 4000, true, true);// 4000C , 2m - - MineFantasyFuels.addForgeFuel(ComponentListMF.coke, 1200, 2500, false, true);// 2500C , 1m - MineFantasyFuels.addForgeFuel(ComponentListMF.magma_cream_refined, 2400, 5000, true, true);// 5000C , 2m - - MineFantasyFuels.addForgeFuel(ComponentListMF.coalDust, 1200, 180);// 180C , 60s + private static void initFuels() { + MineFantasyFuels.addForgeFuel(new ItemStack(Items.coal, 1, 0), 900, 1500);// 1500C , 45s + MineFantasyFuels.addForgeFuel(new ItemStack(Items.coal, 1, 1), 1200, 1800);// 1800C , 1m + MineFantasyFuels.addForgeFuel(Items.blaze_powder, 200, 3000, true);// 3000C , 10s + MineFantasyFuels.addForgeFuel(Items.blaze_rod, 300, 3000, true);// 3000C , 15s + MineFantasyFuels.addForgeFuel(Items.fire_charge, 1200, 3500, true);// 3500C , 1m + MineFantasyFuels.addForgeFuel(Items.lava_bucket, 2400, 5000, true);// 5000C , 2m + MineFantasyFuels.addForgeFuel(Items.magma_cream, 2400, 4000, true, true);// 4000C , 2m + + MineFantasyFuels.addForgeFuel(ComponentListMF.coke, 1200, 2500, false, true);// 2500C , 1m + MineFantasyFuels.addForgeFuel(ComponentListMF.magma_cream_refined, 2400, 5000, true, true);// 5000C , 2m + + MineFantasyFuels.addForgeFuel(ComponentListMF.coalDust, 1200, 180);// 180C , 60s } - private static void addRandomDrops() - { - RandomOre.addOre(new ItemStack(kaolinite), 1.5F, Blocks.stone, -1, 32,128, false); - RandomOre.addOre(new ItemStack(flux), 2F, Blocks.stone, -1, 0, 128, false); - RandomOre.addOre(new ItemStack(flux_strong), 1F, Blocks.stone, 2, 0, 128, false); - RandomOre.addOre(new ItemStack(flux), 20F, BlockListMF.limestone, 0, -1, 0, 256, true); - RandomOre.addOre(new ItemStack(flux_strong), 10F, BlockListMF.limestone, 0, 2, 0, 256, true); - RandomOre.addOre(new ItemStack(Items.coal), 2F, Blocks.stone, -1, 0, 128, false); - RandomOre.addOre(new ItemStack(sulfur), 2F, Blocks.stone, -1, 0, 16, false); - RandomOre.addOre(new ItemStack(nitre), 3F, Blocks.stone, -1, 0, 64, false); - RandomOre.addOre(new ItemStack(Items.redstone), 5F, Blocks.stone, 2, 0, 16, false); - RandomOre.addOre(new ItemStack(Items.flint), 1F, Blocks.stone, -1, 0, 64, false); - RandomOre.addOre(new ItemStack(diamond_shards), 0.2F,Blocks.stone, 2, 0, 16, false); - RandomOre.addOre(new ItemStack(Items.quartz), 0.5F,Blocks.stone, 3, 0, 16, false); - - RandomOre.addOre(new ItemStack(sulfur), 10F,Blocks.netherrack, -1, 0, 512, false); - RandomOre.addOre(new ItemStack(Items.glowstone_dust), 5F,Blocks.netherrack, -1, 0, 512, false); - RandomOre.addOre(new ItemStack(Items.quartz), 5F, Blocks.netherrack, -1, 0, 512, false); - RandomOre.addOre(new ItemStack(Items.blaze_powder), 5F, Blocks.netherrack, -1, 0, 512, false); - RandomOre.addOre(new ItemStack(Items.nether_wart), 1F, Blocks.netherrack, -1, 0, 512, false); - RandomOre.addOre(new ItemStack(Items.nether_star), 0.01F, Blocks.netherrack, -1, 0, 512,false); - - RandomDigs.addOre(new ItemStack(Blocks.skull, 1, 1), 0.1F, Blocks.soul_sand,3, 0, 256, false); - RandomDigs.addOre(new ItemStack(Items.bone), 5F, Blocks.dirt, -1, 0, 256, false); - RandomDigs.addOre(new ItemStack(Items.rotten_flesh), 2F, Blocks.dirt, -1, 0, 256, false); - RandomDigs.addOre(new ItemStack(Items.coal, 1, 1), 1F, Blocks.dirt, -1, 32, 64, false); - - RandomDigs.addOre(new ItemStack(Items.melon_seeds), 5F, Blocks.grass, -1, 0, 256, false); - RandomDigs.addOre(new ItemStack(Items.pumpkin_seeds), 8F, Blocks.grass, -1, 0, 256, false); - - RandomOre.addOre(new ItemStack(oreCopper), 4F, Blocks.stone, 0, 48, 96, false); - RandomOre.addOre(new ItemStack(oreTin), 2F,Blocks.stone, 0, 48, 96, false); - RandomOre.addOre(new ItemStack(oreIron), 5F, Blocks.stone, 0, 0, 64, false); - RandomOre.addOre(new ItemStack(oreSilver), 1.5F, Blocks.stone, 0, 0, 32, false); - RandomOre.addOre(new ItemStack(oreGold), 1F, Blocks.stone, 0, 0, 32, false); - - RandomOre.addOre(new ItemStack(oreTungsten), 2F, Blocks.stone, 3, 0, 16, false, "tungsten"); + private static void addRandomDrops() { + RandomOre.addOre(new ItemStack(kaolinite), 1.5F, Blocks.stone, -1, 32, 128, false); + RandomOre.addOre(new ItemStack(flux), 2F, Blocks.stone, -1, 0, 128, false); + RandomOre.addOre(new ItemStack(flux_strong), 1F, Blocks.stone, 2, 0, 128, false); + RandomOre.addOre(new ItemStack(flux), 20F, BlockListMF.limestone, 0, -1, 0, 256, true); + RandomOre.addOre(new ItemStack(flux_strong), 10F, BlockListMF.limestone, 0, 2, 0, 256, true); + RandomOre.addOre(new ItemStack(Items.coal), 2F, Blocks.stone, -1, 0, 128, false); + RandomOre.addOre(new ItemStack(sulfur), 2F, Blocks.stone, -1, 0, 16, false); + RandomOre.addOre(new ItemStack(nitre), 3F, Blocks.stone, -1, 0, 64, false); + RandomOre.addOre(new ItemStack(Items.redstone), 5F, Blocks.stone, 2, 0, 16, false); + RandomOre.addOre(new ItemStack(Items.flint), 1F, Blocks.stone, -1, 0, 64, false); + RandomOre.addOre(new ItemStack(diamond_shards), 0.2F, Blocks.stone, 2, 0, 16, false); + RandomOre.addOre(new ItemStack(Items.quartz), 0.5F, Blocks.stone, 3, 0, 16, false); + + RandomOre.addOre(new ItemStack(sulfur), 10F, Blocks.netherrack, -1, 0, 512, false); + RandomOre.addOre(new ItemStack(Items.glowstone_dust), 5F, Blocks.netherrack, -1, 0, 512, false); + RandomOre.addOre(new ItemStack(Items.quartz), 5F, Blocks.netherrack, -1, 0, 512, false); + RandomOre.addOre(new ItemStack(Items.blaze_powder), 5F, Blocks.netherrack, -1, 0, 512, false); + RandomOre.addOre(new ItemStack(Items.nether_wart), 1F, Blocks.netherrack, -1, 0, 512, false); + RandomOre.addOre(new ItemStack(Items.nether_star), 0.01F, Blocks.netherrack, -1, 0, 512, false); + + RandomDigs.addOre(new ItemStack(Blocks.skull, 1, 1), 0.1F, Blocks.soul_sand, 3, 0, 256, false); + RandomDigs.addOre(new ItemStack(Items.bone), 5F, Blocks.dirt, -1, 0, 256, false); + RandomDigs.addOre(new ItemStack(Items.rotten_flesh), 2F, Blocks.dirt, -1, 0, 256, false); + RandomDigs.addOre(new ItemStack(Items.coal, 1, 1), 1F, Blocks.dirt, -1, 32, 64, false); + + RandomDigs.addOre(new ItemStack(Items.melon_seeds), 5F, Blocks.grass, -1, 0, 256, false); + RandomDigs.addOre(new ItemStack(Items.pumpkin_seeds), 8F, Blocks.grass, -1, 0, 256, false); + + RandomOre.addOre(new ItemStack(oreCopper), 4F, Blocks.stone, 0, 48, 96, false); + RandomOre.addOre(new ItemStack(oreTin), 2F, Blocks.stone, 0, 48, 96, false); + RandomOre.addOre(new ItemStack(oreIron), 5F, Blocks.stone, 0, 0, 64, false); + RandomOre.addOre(new ItemStack(oreSilver), 1.5F, Blocks.stone, 0, 0, 32, false); + RandomOre.addOre(new ItemStack(oreGold), 1F, Blocks.stone, 0, 0, 32, false); + + RandomOre.addOre(new ItemStack(oreTungsten), 2F, Blocks.stone, 3, 0, 16, false, "tungsten"); } - - public static ItemStack bar(String material) - { + + public static ItemStack bar(String material) { return bar(material, 1); } - public static ItemStack bar(String material, int stackSize) - { + public static ItemStack bar(String material, int stackSize) { return bar.createComm(material, stackSize); } } diff --git a/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java b/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java index 29d123a9..d2eaaea6 100644 --- a/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java @@ -1,23 +1,15 @@ package minefantasy.mf2.item.list; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.item.ItemComponentMF; -import minefantasy.mf2.item.archery.ItemBowMF; -import minefantasy.mf2.item.armour.ItemArmourMF; import minefantasy.mf2.item.food.FoodListMF; -import minefantasy.mf2.item.tool.ItemAxeMF; -import minefantasy.mf2.item.tool.advanced.ItemHandpick; -import minefantasy.mf2.item.tool.crafting.ItemHammer; import minefantasy.mf2.item.weapon.ItemSwordMF; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public final class CreativeTabMF extends CreativeTabs -{ +public final class CreativeTabMF extends CreativeTabs { public static CreativeTabs tabTool = new CreativeTabMF(CreativeTabs.getNextID(), "forgedtool", 1); public static CreativeTabs tabWeapon = new CreativeTabMF(CreativeTabs.getNextID(), "forgedweapon", 2); public static CreativeTabs tabArmour = new CreativeTabMF(CreativeTabs.getNextID(), "forgedarmour", 3); @@ -32,37 +24,50 @@ public final class CreativeTabMF extends CreativeTabs public static CreativeTabs tabDragonforged = new CreativeTabMF(CreativeTabs.getNextID(), "MFdragonforged", 12); public static CreativeTabs tabOrnate = new CreativeTabMF(CreativeTabs.getNextID(), "MFornate", 13); public static CreativeTabs tabOldTools = new CreativeTabMF(CreativeTabs.getNextID(), "MFOld", 14); - - + private int type; - CreativeTabMF(int id, String item, int t) - { - super(id, item); - type = t; - } + + CreativeTabMF(int id, String item, int t) { + super(id, item); + type = t; + } + @Override @SideOnly(Side.CLIENT) - public ItemStack getIconItemStack() - { - switch(type) - { - case 1: return ((ItemAxeMF)CustomToolListMF.standard_axe).construct("Steel","OakWood"); - case 2: return ((ItemSwordMF)CustomToolListMF.standard_sword).construct("Steel","OakWood"); - case 3: return ((ItemArmourMF)CustomArmourListMF.standard_plate_helmet).construct("Steel"); - case 4: return ((ItemBowMF)CustomToolListMF.standard_bow).construct("Steel","OakWood"); - case 5: return new ItemStack(BlockListMF.anvil[1]); - case 6: return new ItemStack(ToolListMF.bomb_custom); - case 7: return ((ItemComponentMF)ComponentListMF.plank).construct("OakWood"); - case 8: return ((ItemHandpick)CustomToolListMF.standard_handpick).construct("Steel","OakWood"); - case 9: return ((ItemHammer)CustomToolListMF.standard_hammer).construct("Steel","OakWood"); - case 10: return new ItemStack(BlockListMF.oreCopper); - case 11: return new ItemStack(FoodListMF.sweetroll); - case 12: return new ItemStack(ComponentListMF.dragon_heart); - case 13: return new ItemStack(ComponentListMF.ornate_items); - case 14: return new ItemStack(ToolListMF.pickStone); + public ItemStack getIconItemStack() { + switch (type) { + case 1: + return CustomToolListMF.standard_axe.construct("Steel", "OakWood"); + case 2: + return ((ItemSwordMF) CustomToolListMF.standard_sword).construct("Steel", "OakWood"); + case 3: + return CustomArmourListMF.standard_plate_helmet.construct("Steel"); + case 4: + return CustomToolListMF.standard_bow.construct("Steel", "OakWood"); + case 5: + return new ItemStack(BlockListMF.anvil[1]); + case 6: + return new ItemStack(ToolListMF.bomb_custom); + case 7: + return ComponentListMF.plank.construct("OakWood"); + case 8: + return CustomToolListMF.standard_handpick.construct("Steel", "OakWood"); + case 9: + return CustomToolListMF.standard_hammer.construct("Steel", "OakWood"); + case 10: + return new ItemStack(BlockListMF.oreCopper); + case 11: + return new ItemStack(FoodListMF.sweetroll); + case 12: + return new ItemStack(ComponentListMF.dragon_heart); + case 13: + return new ItemStack(ComponentListMF.ornate_items); + case 14: + return new ItemStack(ToolListMF.pickStone); } return new ItemStack(ComponentListMF.ingots[3]); } + @Override @SideOnly(Side.CLIENT) public Item getTabIconItem() { diff --git a/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java b/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java index 460d27b5..1026defe 100644 --- a/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java @@ -1,41 +1,55 @@ package minefantasy.mf2.item.list; -import net.minecraft.creativetab.CreativeTabs; import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.item.armour.ItemArmourMF; import minefantasy.mf2.item.armour.ItemCustomArmour; -import minefantasy.mf2.material.BaseMaterialMF; +import net.minecraft.creativetab.CreativeTabs; -public class CustomArmourListMF -{ +public class CustomArmourListMF { public static ItemArmourMF standard_scale_helmet, standard_scale_chest, standard_scale_legs, standard_scale_boots; public static ItemArmourMF standard_chain_helmet, standard_chain_chest, standard_chain_legs, standard_chain_boots; - public static ItemArmourMF standard_splint_helmet, standard_splint_chest, standard_splint_legs, standard_splint_boots; + public static ItemArmourMF standard_splint_helmet, standard_splint_chest, standard_splint_legs, + standard_splint_boots; public static ItemArmourMF standard_plate_helmet, standard_plate_chest, standard_plate_legs, standard_plate_boots; - - public static void load() - { + + public static void load() { String design = "standard"; CreativeTabs tab = CreativeTabMF.tabArmour; - standard_scale_helmet = (ItemArmourMF) new ItemCustomArmour(design, "scale_helmet", ArmourDesign.SCALEMAIL, 0, "scale_layer_1", 0).setCreativeTab(tab); - standard_scale_chest = (ItemArmourMF) new ItemCustomArmour(design, "scale_chest", ArmourDesign.SCALEMAIL, 1, "scale_layer_1", 0).setCreativeTab(tab); - standard_scale_legs = (ItemArmourMF) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, 2, "scale_layer_2", 0).setCreativeTab(tab); - standard_scale_boots = (ItemArmourMF) new ItemCustomArmour(design, "scale_boots", ArmourDesign.SCALEMAIL, 3, "scale_layer_1", 0).setCreativeTab(tab); - - standard_chain_helmet = (ItemArmourMF) new ItemCustomArmour(design, "chain_helmet", ArmourDesign.CHAINMAIL, 0, "chain_layer_1", 0).setCreativeTab(tab); - standard_chain_chest = (ItemArmourMF) new ItemCustomArmour(design, "chain_chest", ArmourDesign.CHAINMAIL, 1, "chain_layer_1", 0).setCreativeTab(tab); - standard_chain_legs = (ItemArmourMF) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, 2, "chain_layer_2", 0).setCreativeTab(tab); - standard_chain_boots = (ItemArmourMF) new ItemCustomArmour(design, "chain_boots", ArmourDesign.CHAINMAIL, 3, "chain_layer_1", 0).setCreativeTab(tab); - - standard_splint_helmet = (ItemArmourMF) new ItemCustomArmour(design, "splint_helmet", ArmourDesign.SPLINTMAIL, 0, "splint_layer_1", 0).setCreativeTab(tab); - standard_splint_chest = (ItemArmourMF) new ItemCustomArmour(design, "splint_chest", ArmourDesign.SPLINTMAIL, 1, "splint_layer_1", 0).setCreativeTab(tab); - standard_splint_legs = (ItemArmourMF) new ItemCustomArmour(design, "splint_legs", ArmourDesign.SPLINTMAIL, 2, "splint_layer_2", 0).setCreativeTab(tab); - standard_splint_boots = (ItemArmourMF) new ItemCustomArmour(design, "splint_boots", ArmourDesign.SPLINTMAIL, 3, "splint_layer_1", 0).setCreativeTab(tab); - - standard_plate_helmet = (ItemArmourMF) new ItemCustomArmour(design, "plate_helmet", ArmourDesign.FIELDPLATE, 0, "plate_layer_1", 0).setCreativeTab(tab); - standard_plate_chest = (ItemArmourMF) new ItemCustomArmour(design, "plate_chest", ArmourDesign.FIELDPLATE, 1, "plate_layer_1", 0).setCreativeTab(tab); - standard_plate_legs = (ItemArmourMF) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, 2, "plate_layer_2", 0).setCreativeTab(tab); - standard_plate_boots = (ItemArmourMF) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, "plate_layer_1", 0).setCreativeTab(tab); - + standard_scale_helmet = (ItemArmourMF) new ItemCustomArmour(design, "scale_helmet", ArmourDesign.SCALEMAIL, 0, + "scale_layer_1", 0).setCreativeTab(tab); + standard_scale_chest = (ItemArmourMF) new ItemCustomArmour(design, "scale_chest", ArmourDesign.SCALEMAIL, 1, + "scale_layer_1", 0).setCreativeTab(tab); + standard_scale_legs = (ItemArmourMF) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, 2, + "scale_layer_2", 0).setCreativeTab(tab); + standard_scale_boots = (ItemArmourMF) new ItemCustomArmour(design, "scale_boots", ArmourDesign.SCALEMAIL, 3, + "scale_layer_1", 0).setCreativeTab(tab); + + standard_chain_helmet = (ItemArmourMF) new ItemCustomArmour(design, "chain_helmet", ArmourDesign.CHAINMAIL, 0, + "chain_layer_1", 0).setCreativeTab(tab); + standard_chain_chest = (ItemArmourMF) new ItemCustomArmour(design, "chain_chest", ArmourDesign.CHAINMAIL, 1, + "chain_layer_1", 0).setCreativeTab(tab); + standard_chain_legs = (ItemArmourMF) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, 2, + "chain_layer_2", 0).setCreativeTab(tab); + standard_chain_boots = (ItemArmourMF) new ItemCustomArmour(design, "chain_boots", ArmourDesign.CHAINMAIL, 3, + "chain_layer_1", 0).setCreativeTab(tab); + + standard_splint_helmet = (ItemArmourMF) new ItemCustomArmour(design, "splint_helmet", ArmourDesign.SPLINTMAIL, + 0, "splint_layer_1", 0).setCreativeTab(tab); + standard_splint_chest = (ItemArmourMF) new ItemCustomArmour(design, "splint_chest", ArmourDesign.SPLINTMAIL, 1, + "splint_layer_1", 0).setCreativeTab(tab); + standard_splint_legs = (ItemArmourMF) new ItemCustomArmour(design, "splint_legs", ArmourDesign.SPLINTMAIL, 2, + "splint_layer_2", 0).setCreativeTab(tab); + standard_splint_boots = (ItemArmourMF) new ItemCustomArmour(design, "splint_boots", ArmourDesign.SPLINTMAIL, 3, + "splint_layer_1", 0).setCreativeTab(tab); + + standard_plate_helmet = (ItemArmourMF) new ItemCustomArmour(design, "plate_helmet", ArmourDesign.FIELDPLATE, 0, + "plate_layer_1", 0).setCreativeTab(tab); + standard_plate_chest = (ItemArmourMF) new ItemCustomArmour(design, "plate_chest", ArmourDesign.FIELDPLATE, 1, + "plate_layer_1", 0).setCreativeTab(tab); + standard_plate_legs = (ItemArmourMF) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, 2, + "plate_layer_2", 0).setCreativeTab(tab); + standard_plate_boots = (ItemArmourMF) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, + "plate_layer_1", 0).setCreativeTab(tab); + } } diff --git a/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java b/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java index d17957b1..07f1a0d6 100644 --- a/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java @@ -1,6 +1,5 @@ package minefantasy.mf2.item.list; -import minefantasy.mf2.api.crafting.exotic.SpecialForging; import minefantasy.mf2.item.archery.ArrowType; import minefantasy.mf2.item.archery.EnumBowType; import minefantasy.mf2.item.archery.ItemArrowMF; @@ -38,15 +37,14 @@ import minefantasy.mf2.item.weapon.ItemWaraxeMF; import minefantasy.mf2.item.weapon.ItemWarhammerMF; import minefantasy.mf2.item.weapon.ItemWeaponMF; -import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item.ToolMaterial; -public class CustomToolListMF -{ - //STANDARD +public class CustomToolListMF { + // STANDARD public static ItemWeaponMF standard_sword, standard_waraxe, standard_mace, standard_dagger, standard_spear; - public static ItemWeaponMF standard_greatsword, standard_battleaxe, standard_warhammer, standard_katana, standard_halbeard, standard_lance; + public static ItemWeaponMF standard_greatsword, standard_battleaxe, standard_warhammer, standard_katana, + standard_halbeard, standard_lance; public static ItemPickMF standard_pick; public static ItemAxeMF standard_axe; public static ItemSpadeMF standard_spade; @@ -54,11 +52,11 @@ public class CustomToolListMF public static ItemHvyPick standard_hvypick; public static ItemHvyShovel standard_hvyshovel; public static ItemHandpick standard_handpick; - public static ItemTrowMF standard_trow; + public static ItemTrowMF standard_trow; public static ItemScythe standard_scythe; public static ItemMattock standard_mattock; public static ItemLumberAxe standard_lumber; - + public static ItemHammer standard_hammer, standard_hvyhammer; public static ItemTongs standard_tongs; public static ItemShearsMF standard_shears; @@ -67,63 +65,92 @@ public class CustomToolListMF public static ItemSaw standard_saw; public static ItemSpanner standard_spanner; public static ItemBasicCraftTool standard_spoon, standard_mallet; - + public static ItemBowMF standard_bow; public static ItemArrowMF standard_arrow, standard_bolt, standard_arrow_bodkin, standard_arrow_broad; - - public static void load() - { + + public static void load() { String design = "standard"; CreativeTabs tab = CreativeTabMF.tabWeapon; - //Standard Weapons - standard_dagger = new ItemDagger(design+"_dagger", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_sword = new ItemSwordMF(design+"_sword", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_waraxe = new ItemWaraxeMF(design+"_waraxe", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_mace = new ItemMaceMF(design+"_mace", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_spear = new ItemSpearMF(design+"_spear", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_katana = new ItemKatanaMF(design+"_katana", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_greatsword = new ItemGreatswordMF(design+"_greatsword", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_battleaxe = new ItemBattleaxeMF(design+"_battleaxe", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_warhammer = new ItemWarhammerMF(design+"_warhammer", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_halbeard = new ItemHalbeardMF(design+"_halbeard", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_lance = new ItemLance(design+"_lance", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - + // Standard Weapons + standard_dagger = new ItemDagger(design + "_dagger", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_sword = new ItemSwordMF(design + "_sword", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_waraxe = new ItemWaraxeMF(design + "_waraxe", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_mace = new ItemMaceMF(design + "_mace", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_spear = new ItemSpearMF(design + "_spear", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_katana = new ItemKatanaMF(design + "_katana", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_greatsword = new ItemGreatswordMF(design + "_greatsword", ToolMaterial.IRON, 0, 1F).setCustom(design) + .setTab(tab); + standard_battleaxe = new ItemBattleaxeMF(design + "_battleaxe", ToolMaterial.IRON, 0, 1F).setCustom(design) + .setTab(tab); + standard_warhammer = new ItemWarhammerMF(design + "_warhammer", ToolMaterial.IRON, 0, 1F).setCustom(design) + .setTab(tab); + standard_halbeard = new ItemHalbeardMF(design + "_halbeard", ToolMaterial.IRON, 0, 1F).setCustom(design) + .setTab(tab); + standard_lance = new ItemLance(design + "_lance", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + tab = CreativeTabMF.tabArcher; - standard_bow = (ItemBowMF) new ItemBowMF(design+"_bow", EnumBowType.SHORTBOW).setCustom(design).setCreativeTab(tab); - standard_bolt = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BOLT, 20).setCustom(design).setAmmoType("bolt").setCreativeTab(tab); - standard_arrow = (ItemArrowMF) new ItemArrowMF(design, ArrowType.NORMAL, 16).setCustom(design).setCreativeTab(tab); - standard_arrow_bodkin = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BODKIN, 16).setCustom(design).setCreativeTab(tab); - standard_arrow_broad = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BROADHEAD, 16).setCustom(design).setCreativeTab(tab); - - tab = CreativeTabMF.tabTool; - //Standard Tools - standard_pick = (ItemPickMF) new ItemPickMF(design+"_pick", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - standard_axe = (ItemAxeMF) new ItemAxeMF(design+"_axe", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - standard_spade = (ItemSpadeMF) new ItemSpadeMF(design+"_spade", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - standard_hoe = (ItemHoeMF) new ItemHoeMF(design+"_hoe", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - + standard_bow = (ItemBowMF) new ItemBowMF(design + "_bow", EnumBowType.SHORTBOW).setCustom(design) + .setCreativeTab(tab); + standard_bolt = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BOLT, 20).setCustom(design).setAmmoType("bolt") + .setCreativeTab(tab); + standard_arrow = (ItemArrowMF) new ItemArrowMF(design, ArrowType.NORMAL, 16).setCustom(design) + .setCreativeTab(tab); + standard_arrow_bodkin = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BODKIN, 16).setCustom(design) + .setCreativeTab(tab); + standard_arrow_broad = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BROADHEAD, 16).setCustom(design) + .setCreativeTab(tab); + + tab = CreativeTabMF.tabTool; + // Standard Tools + standard_pick = (ItemPickMF) new ItemPickMF(design + "_pick", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_axe = (ItemAxeMF) new ItemAxeMF(design + "_axe", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_spade = (ItemSpadeMF) new ItemSpadeMF(design + "_spade", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_hoe = (ItemHoeMF) new ItemHoeMF(design + "_hoe", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + tab = CreativeTabMF.tabToolAdvanced; - standard_handpick = (ItemHandpick) new ItemHandpick(design+"_handpick", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - standard_hvypick = (ItemHvyPick) new ItemHvyPick(design+"_hvypick", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - standard_trow = (ItemTrowMF) new ItemTrowMF(design+"_trow", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - standard_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design+"_hvyshovel", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - standard_scythe = (ItemScythe) new ItemScythe(design+"_scythe", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - standard_mattock = (ItemMattock) new ItemMattock(design+"_mattock", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - standard_lumber = (ItemLumberAxe) new ItemLumberAxe(design+"_lumber", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - //Standard Crafters - tab = CreativeTabMF.tabCraftTool; - standard_hammer = (ItemHammer) new ItemHammer(design+"_hammer", ToolMaterial.IRON, false, 0, 0).setCustom(design).setCreativeTab(tab); - standard_hvyhammer = (ItemHammer) new ItemHammer(design+"_hvyhammer", ToolMaterial.IRON, true, 0, 0).setCustom(design).setCreativeTab(tab); - standard_shears = (ItemShearsMF) new ItemShearsMF(design+"_shears", ToolMaterial.IRON, 0, 0).setCustom(design).setCreativeTab(tab); - standard_knife = (ItemKnifeMF) new ItemKnifeMF(design+"_knife", ToolMaterial.IRON, 0, 1F, 0).setCustom(design).setCreativeTab(tab); - standard_needle = (ItemNeedle) new ItemNeedle(design+"_needle", ToolMaterial.IRON, 0, 0).setCustom(design).setCreativeTab(tab); - standard_saw = (ItemSaw) new ItemSaw(design+"_saw", ToolMaterial.IRON, 0, 0).setCustom(design).setCreativeTab(tab); - standard_tongs = (ItemTongs) new ItemTongs(design+"_tongs", ToolMaterial.IRON, 0).setCustom(design).setCreativeTab(tab); - standard_spanner = (ItemSpanner) new ItemSpanner(design+"_spanner", 0, 0).setCustom(design).setCreativeTab(tab); - - standard_spoon = (ItemBasicCraftTool) new ItemBasicCraftTool(design+"_spoon", "spoon", 0, 64).setCustom(design).setCreativeTab(tab); - standard_mallet = (ItemBasicCraftTool) new ItemBasicCraftTool(design+"_mallet", "mallet", 0, 64).setCustom(design).setCreativeTab(tab); - + standard_handpick = (ItemHandpick) new ItemHandpick(design + "_handpick", ToolMaterial.IRON, 0) + .setCustom(design).setCreativeTab(tab); + standard_hvypick = (ItemHvyPick) new ItemHvyPick(design + "_hvypick", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_trow = (ItemTrowMF) new ItemTrowMF(design + "_trow", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design + "_hvyshovel", ToolMaterial.IRON, 0) + .setCustom(design).setCreativeTab(tab); + standard_scythe = (ItemScythe) new ItemScythe(design + "_scythe", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_mattock = (ItemMattock) new ItemMattock(design + "_mattock", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_lumber = (ItemLumberAxe) new ItemLumberAxe(design + "_lumber", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + // Standard Crafters + tab = CreativeTabMF.tabCraftTool; + standard_hammer = (ItemHammer) new ItemHammer(design + "_hammer", ToolMaterial.IRON, false, 0, 0) + .setCustom(design).setCreativeTab(tab); + standard_hvyhammer = (ItemHammer) new ItemHammer(design + "_hvyhammer", ToolMaterial.IRON, true, 0, 0) + .setCustom(design).setCreativeTab(tab); + standard_shears = (ItemShearsMF) new ItemShearsMF(design + "_shears", ToolMaterial.IRON, 0, 0).setCustom(design) + .setCreativeTab(tab); + standard_knife = (ItemKnifeMF) new ItemKnifeMF(design + "_knife", ToolMaterial.IRON, 0, 1F, 0).setCustom(design) + .setCreativeTab(tab); + standard_needle = (ItemNeedle) new ItemNeedle(design + "_needle", ToolMaterial.IRON, 0, 0).setCustom(design) + .setCreativeTab(tab); + standard_saw = (ItemSaw) new ItemSaw(design + "_saw", ToolMaterial.IRON, 0, 0).setCustom(design) + .setCreativeTab(tab); + standard_tongs = (ItemTongs) new ItemTongs(design + "_tongs", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_spanner = (ItemSpanner) new ItemSpanner(design + "_spanner", 0, 0).setCustom(design) + .setCreativeTab(tab); + + standard_spoon = (ItemBasicCraftTool) new ItemBasicCraftTool(design + "_spoon", "spoon", 0, 64) + .setCustom(design).setCreativeTab(tab); + standard_mallet = (ItemBasicCraftTool) new ItemBasicCraftTool(design + "_mallet", "mallet", 0, 64) + .setCustom(design).setCreativeTab(tab); + DragonforgedStyle.load(); OrnateStyle.load(); } diff --git a/src/main/java/minefantasy/mf2/item/list/ToolListMF.java b/src/main/java/minefantasy/mf2/item/list/ToolListMF.java index 1d9444f4..bc583045 100644 --- a/src/main/java/minefantasy/mf2/item/list/ToolListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ToolListMF.java @@ -52,83 +52,98 @@ /** * @author Anonymous Productions */ -public class ToolListMF -{ +public class ToolListMF { public static EnumRarity poor = EnumHelper.addRarity("Poor", EnumChatFormatting.DARK_GRAY, "poor"); public static EnumRarity unique = EnumHelper.addRarity("Unique", EnumChatFormatting.DARK_GREEN, "unique"); public static EnumRarity rare = EnumHelper.addRarity("Rare", EnumChatFormatting.DARK_BLUE, "rare"); - - public static EnumRarity[] rarity = new EnumRarity[]{ToolListMF.poor, EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, EnumRarity.epic}; + + public static EnumRarity[] rarity = new EnumRarity[] { ToolListMF.poor, EnumRarity.common, EnumRarity.uncommon, + EnumRarity.rare, EnumRarity.epic }; public static Item swordTraining = new ItemSwordMF("training_sword", ToolMaterial.WOOD, -1, 0.8F); public static Item waraxeTraining = new ItemWaraxeMF("training_waraxe", ToolMaterial.WOOD, -1, 0.8F); public static Item maceTraining = new ItemMaceMF("training_mace", ToolMaterial.WOOD, -1, 0.8F); public static Item spearTraining = new ItemSpearMF("training_spear", ToolMaterial.WOOD, -1, 0.8F); - public static Item knifeStone = new ItemKnifeMF("stone_knife", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 3.5F, 0); - public static Item hammerStone = new ItemHammer("stone_hammer", BaseMaterialMF.getMaterial("stone").getToolConversion(),false, -1, 0); - public static Item tongsStone = new ItemTongs("stone_tongs", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); - public static Item needleBone = new ItemNeedle("bone_needle", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 0); - - public static Item pickStone = new ItemPickMF("stone_pick", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); - public static Item axeStone = new ItemAxeMF("stone_axe", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); - public static Item spadeStone = new ItemSpadeMF("stone_spade", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); - public static Item hoeStone = new ItemHoeMF("stone_hoe", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); - - public static Item swordStone = new ItemSwordMF("stone_sword", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); - public static Item maceStone = new ItemMaceMF("stone_mace", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); - public static Item waraxeStone = new ItemWaraxeMF("stone_waraxe", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); - public static Item spearStone = new ItemSpearMF("stone_spear", BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); - + public static Item knifeStone = new ItemKnifeMF("stone_knife", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 3.5F, 0); + public static Item hammerStone = new ItemHammer("stone_hammer", + BaseMaterialMF.getMaterial("stone").getToolConversion(), false, -1, 0); + public static Item tongsStone = new ItemTongs("stone_tongs", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); + public static Item needleBone = new ItemNeedle("bone_needle", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 0); + + public static Item pickStone = new ItemPickMF("stone_pick", BaseMaterialMF.getMaterial("stone").getToolConversion(), + -1); + public static Item axeStone = new ItemAxeMF("stone_axe", BaseMaterialMF.getMaterial("stone").getToolConversion(), + -1); + public static Item spadeStone = new ItemSpadeMF("stone_spade", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); + public static Item hoeStone = new ItemHoeMF("stone_hoe", BaseMaterialMF.getMaterial("stone").getToolConversion(), + -1); + + public static Item swordStone = new ItemSwordMF("stone_sword", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); + public static Item maceStone = new ItemMaceMF("stone_mace", BaseMaterialMF.getMaterial("stone").getToolConversion(), + -1, 2.0F); + public static Item waraxeStone = new ItemWaraxeMF("stone_waraxe", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); + public static Item spearStone = new ItemSpearMF("stone_spear", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); + public static Item bandage_crude = new ItemBandage("bandage_crude", 5F); public static Item bandage_wool = new ItemBandage("bandage_wool", 8F); public static Item bandage_tough = new ItemBandage("bandage_tough", 12F); - + public static ItemCrudeBomb bomb_crude = new ItemCrudeBomb("bomb_crude"); public static ItemBomb bomb_custom = new ItemBomb("bomb_basic"); public static ItemMine mine_custom = new ItemMine("mine_basic"); - + public static ItemResearchBook researchBook = new ItemResearchBook(); - + public static Item dryrocks = new ItemLighterMF("dryrocks", 0.1F, 16); public static Item tinderbox = new ItemLighterMF("tinderbox", 0.5F, 100); - + public static Item skillbook_artisanry = new ItemSkillBook("skillbook_artisanry", SkillList.artisanry); public static Item skillbook_construction = new ItemSkillBook("skillbook_construction", SkillList.construction); public static Item skillbook_provisioning = new ItemSkillBook("skillbook_provisioning", SkillList.provisioning); public static Item skillbook_engineering = new ItemSkillBook("skillbook_engineering", SkillList.engineering); public static Item skillbook_combat = new ItemSkillBook("skillbook_combat", SkillList.combat); - + public static Item skillbook_artisanry2 = new ItemSkillBook("skillbook_artisanry2", SkillList.artisanry).setMax(); - public static Item skillbook_construction2 = new ItemSkillBook("skillbook_construction2", SkillList.construction).setMax(); - public static Item skillbook_provisioning2 = new ItemSkillBook("skillbook_provisioning2", SkillList.provisioning).setMax(); - public static Item skillbook_engineering2 = new ItemSkillBook("skillbook_engineering2", SkillList.engineering).setMax(); + public static Item skillbook_construction2 = new ItemSkillBook("skillbook_construction2", SkillList.construction) + .setMax(); + public static Item skillbook_provisioning2 = new ItemSkillBook("skillbook_provisioning2", SkillList.provisioning) + .setMax(); + public static Item skillbook_engineering2 = new ItemSkillBook("skillbook_engineering2", SkillList.engineering) + .setMax(); public static Item skillbook_combat2 = new ItemSkillBook("skillbook_combat2", SkillList.combat).setMax(); - + public static Item engin_anvil_tools = new ItemEAnvilTools("engin_anvil_tools", 64); - + public static Item exploding_arrow = new ItemExplodingArrow(); public static Item spyglass = new ItemSpyglass(); public static Item climbing_pick_basic; public static Item parachute = new ItemParachute(); - + public static Item syringe = new ItemSyringe(); - public static Item syringe_empty = new ItemComponentMF("syringe_empty").setTextureName("minefantasy2:Other/syringe").setCreativeTab(CreativeTabMF.tabGadget); - + public static Item syringe_empty = new ItemComponentMF("syringe_empty").setTextureName("minefantasy2:Other/syringe") + .setCreativeTab(CreativeTabMF.tabGadget); + public static Item loot_sack = new ItemLootSack("loot_sack", 8, 0); public static Item loot_sack_uc = new ItemLootSack("loot_sack_uc", 8, 1); public static Item loot_sack_rare = new ItemLootSack("loot_sack_rare", 12, 2); public static ItemCrossbow crossbow_custom = new ItemCrossbow(); public static Item exploding_bolt = new ItemExplodingBolt(); public static Item paint_brush = new ItemPaintBrush("paint_brush", 256); - + public static Item bedroll = new ItemBedMF("bedroll"); - + public static Item debug_place = new ItemWorldGenPlacer(); public static Item debug_mob = new MobSpawnerMF(); - public static void load() - { - if(ConfigHardcore.HCCWeakItems) - { + + public static void load() { + if (ConfigHardcore.HCCWeakItems) { weakenItems(); } climbing_pick_basic = new ItemClimbingPick("climbing_pick_basic", ToolMaterial.IRON, 0); @@ -137,97 +152,168 @@ public static void load() FoodListMF.load(); CustomToolListMF.load(); CustomArmourListMF.load(); - - ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 1, 5, 50)); - ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, new WeightedRandomChestContent(new ItemStack(skillbook_construction), 1, 1, 10)); - ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, new WeightedRandomChestContent(new ItemStack(ArmourListMF.leatherapron), 1, 1, 10)); - - ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 2)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); - - ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); - ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); - ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); - - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); - - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); - - ChestGenHooks.addItem(ChestGenHooks.MINESHAFT_CORRIDOR, new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 6, 20)); - ChestGenHooks.addItem(ChestGenHooks.MINESHAFT_CORRIDOR, new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 2)); - - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CORRIDOR, new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 5)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CORRIDOR, new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 3)); - - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 3, 20)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 10)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 2)); - - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 2, 6, 10)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, new WeightedRandomChestContent(new ItemStack(skillbook_construction), 2, 6, 10)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, new WeightedRandomChestContent(new ItemStack(skillbook_provisioning), 2, 6, 10)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 4, 8)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 1 , 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, new WeightedRandomChestContent(new ItemStack(Items.paper), 5, 36, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, new WeightedRandomChestContent(new ItemStack(Items.feather), 1, 4 , 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, new WeightedRandomChestContent(new ItemStack(Items.book), 5, 26, 80)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 1, 1 , 40)); - ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, new WeightedRandomChestContent(new ItemStack(Items.coal), 5, 17, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4 , 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, new WeightedRandomChestContent(new ItemStack(Items.leather), 1, 4 , 80)); - ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, new WeightedRandomChestContent(ComponentListMF.bar("Steel"), 1, 6, 40)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_basic), 1, 1, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_advanced), 1, 1, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, new WeightedRandomChestContent(new ItemStack(ComponentListMF.coke), 1, 10, 60)); - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 1 , 40)); - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, new WeightedRandomChestContent(new ItemStack(ComponentListMF.bronze_gears), 1, 9, 30)); - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, new WeightedRandomChestContent(new ItemStack(ComponentListMF.tungsten_gears), 1, 1, 20)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, new WeightedRandomChestContent(CustomToolListMF.standard_bolt.construct("Iron"), 1, 1, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, new WeightedRandomChestContent(CustomToolListMF.standard_bolt.construct("Encrusted"), 1, 1, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, new WeightedRandomChestContent(bomb_custom.createBomb((byte)1, (byte)1, (byte)0, (byte)0, 1), 1, 1, 25)); - ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, new WeightedRandomChestContent(mine_custom.createMine((byte)1, (byte)1, (byte)0, (byte)0, 1), 1, 1, 25)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 1, 40)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 10)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(new ItemStack(Items.book), 1, 4, 60)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(new ItemStack(Items.bowl), 1, 6, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(new ItemStack(ComponentListMF.clay_pot), 1, 7, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(new ItemStack(Items.bone), 1, 9, 80)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 1, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 1, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 30)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(new ItemStack(Items.bucket), 1, 1, 80)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, new WeightedRandomChestContent(new ItemStack(Items.clock), 1, 1, 20)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 40)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 10)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(new ItemStack(Items.book), 1, 4, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(new ItemStack(Items.bowl), 1, 6, 30)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(new ItemStack(ComponentListMF.clay_pot), 1, 7, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(new ItemStack(Items.bone), 1, 9, 10)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 1, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 1, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 30)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(new ItemStack(Items.bucket), 1, 1, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, new WeightedRandomChestContent(new ItemStack(Items.clock), 1, 1, 40)); + + ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, + new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 1, 5, 50)); + ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, + new WeightedRandomChestContent(new ItemStack(skillbook_construction), 1, 1, 10)); + ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, + new WeightedRandomChestContent(new ItemStack(ArmourListMF.leatherapron), 1, 1, 10)); + + ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 2)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); + + ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); + ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); + ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); + + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); + + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); + + ChestGenHooks.addItem(ChestGenHooks.MINESHAFT_CORRIDOR, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 6, 20)); + ChestGenHooks.addItem(ChestGenHooks.MINESHAFT_CORRIDOR, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 2)); + + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CORRIDOR, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 5)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CORRIDOR, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 3)); + + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 3, 20)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 10)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, + new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 2)); + + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, + new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 2, 6, 10)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, + new WeightedRandomChestContent(new ItemStack(skillbook_construction), 2, 6, 10)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, + new WeightedRandomChestContent(new ItemStack(skillbook_provisioning), 2, 6, 10)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, + new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 4, 8)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, + new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 1, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, + new WeightedRandomChestContent(new ItemStack(Items.paper), 5, 36, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, + new WeightedRandomChestContent(new ItemStack(Items.feather), 1, 4, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, + new WeightedRandomChestContent(new ItemStack(Items.book), 5, 26, 80)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, + new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 1, 1, 40)); + ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, + new WeightedRandomChestContent(new ItemStack(Items.coal), 5, 17, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, + new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, + new WeightedRandomChestContent(new ItemStack(Items.leather), 1, 4, 80)); + ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, + new WeightedRandomChestContent(ComponentListMF.bar("Steel"), 1, 6, 40)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_basic), 1, 1, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_advanced), 1, 1, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.coke), 1, 10, 60)); + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 1, 40)); + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.bronze_gears), 1, 9, 30)); + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.tungsten_gears), 1, 1, 20)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, + new WeightedRandomChestContent(CustomToolListMF.standard_bolt.construct("Iron"), 1, 1, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, + new WeightedRandomChestContent(CustomToolListMF.standard_bolt.construct("Encrusted"), 1, 1, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, new WeightedRandomChestContent( + bomb_custom.createBomb((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1), 1, 1, 25)); + ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, new WeightedRandomChestContent( + mine_custom.createMine((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1), 1, 1, 25)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 1, 40)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 10)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.book), 1, 4, 60)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.bowl), 1, 6, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.clay_pot), 1, 7, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.bone), 1, 9, 80)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 1, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 1, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 30)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.bucket), 1, 1, 80)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.clock), 1, 1, 20)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 40)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 10)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.book), 1, 4, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.bowl), 1, 6, 30)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.clay_pot), 1, 7, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.bone), 1, 9, 10)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 1, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 1, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 30)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.bucket), 1, 1, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.clock), 1, 1, 40)); } - private static void weakenItems() - { + private static void weakenItems() { weakenItem(Items.wooden_pickaxe, 5); weakenItem(Items.wooden_axe, 5); weakenItem(Items.wooden_shovel, 5); @@ -237,13 +323,13 @@ private static void weakenItems() weakenItem(Items.leather_chestplate); weakenItem(Items.leather_leggings); weakenItem(Items.leather_boots); - + weakenItem(Items.stone_pickaxe, 10); weakenItem(Items.stone_axe, 10); weakenItem(Items.stone_shovel, 10); weakenItem(Items.stone_sword, 10); weakenItem(Items.stone_hoe, 10); - + weakenItem(Items.iron_pickaxe, 25); weakenItem(Items.iron_axe, 25); weakenItem(Items.iron_shovel, 25); @@ -253,7 +339,7 @@ private static void weakenItems() weakenItem(Items.iron_chestplate); weakenItem(Items.iron_leggings); weakenItem(Items.iron_boots); - + weakenItem(Items.golden_pickaxe, 1); weakenItem(Items.golden_axe, 1); weakenItem(Items.golden_shovel, 1); @@ -263,7 +349,7 @@ private static void weakenItems() weakenItem(Items.golden_chestplate); weakenItem(Items.golden_leggings); weakenItem(Items.golden_boots); - + weakenItem(Items.diamond_pickaxe, 100); weakenItem(Items.diamond_axe, 100); weakenItem(Items.diamond_shovel, 100); @@ -274,16 +360,15 @@ private static void weakenItems() weakenItem(Items.diamond_leggings); weakenItem(Items.diamond_boots); } - private static void weakenItem(Item item) - { - weakenItem(item, (item.getMaxDamage()/10)+1); + + private static void weakenItem(Item item) { + weakenItem(item, (item.getMaxDamage() / 10) + 1); } - private static void weakenItem(Item item, int hp) - { - if(item.isDamageable()) - { + + private static void weakenItem(Item item, int hp) { + if (item.isDamageable()) { item.setMaxDamage(hp); } } - + } diff --git a/src/main/java/minefantasy/mf2/item/list/styles/DragonforgedStyle.java b/src/main/java/minefantasy/mf2/item/list/styles/DragonforgedStyle.java index 72e91e94..bcd892e8 100644 --- a/src/main/java/minefantasy/mf2/item/list/styles/DragonforgedStyle.java +++ b/src/main/java/minefantasy/mf2/item/list/styles/DragonforgedStyle.java @@ -2,27 +2,53 @@ import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.crafting.exotic.SpecialForging; -import minefantasy.mf2.item.archery.*; -import minefantasy.mf2.item.armour.ItemArmourMF; +import minefantasy.mf2.item.archery.EnumBowType; +import minefantasy.mf2.item.archery.ItemBowMF; import minefantasy.mf2.item.armour.ItemCustomArmour; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.CustomArmourListMF; import minefantasy.mf2.item.list.CustomToolListMF; -import minefantasy.mf2.item.tool.*; -import minefantasy.mf2.item.tool.advanced.*; -import minefantasy.mf2.item.tool.crafting.*; -import minefantasy.mf2.item.weapon.*; -import minefantasy.mf2.material.BaseMaterialMF; +import minefantasy.mf2.item.tool.ItemAxeMF; +import minefantasy.mf2.item.tool.ItemHoeMF; +import minefantasy.mf2.item.tool.ItemPickMF; +import minefantasy.mf2.item.tool.ItemShearsMF; +import minefantasy.mf2.item.tool.ItemSpadeMF; +import minefantasy.mf2.item.tool.advanced.ItemHandpick; +import minefantasy.mf2.item.tool.advanced.ItemHvyPick; +import minefantasy.mf2.item.tool.advanced.ItemHvyShovel; +import minefantasy.mf2.item.tool.advanced.ItemLumberAxe; +import minefantasy.mf2.item.tool.advanced.ItemMattock; +import minefantasy.mf2.item.tool.advanced.ItemScythe; +import minefantasy.mf2.item.tool.advanced.ItemTrowMF; +import minefantasy.mf2.item.tool.crafting.ItemHammer; +import minefantasy.mf2.item.tool.crafting.ItemKnifeMF; +import minefantasy.mf2.item.tool.crafting.ItemNeedle; +import minefantasy.mf2.item.tool.crafting.ItemSaw; +import minefantasy.mf2.item.tool.crafting.ItemSpanner; +import minefantasy.mf2.item.tool.crafting.ItemTongs; +import minefantasy.mf2.item.weapon.ItemBattleaxeMF; +import minefantasy.mf2.item.weapon.ItemDagger; +import minefantasy.mf2.item.weapon.ItemGreatswordMF; +import minefantasy.mf2.item.weapon.ItemHalbeardMF; +import minefantasy.mf2.item.weapon.ItemKatanaMF; +import minefantasy.mf2.item.weapon.ItemLance; +import minefantasy.mf2.item.weapon.ItemMaceMF; +import minefantasy.mf2.item.weapon.ItemSpearMF; +import minefantasy.mf2.item.weapon.ItemSwordMF; +import minefantasy.mf2.item.weapon.ItemWaraxeMF; +import minefantasy.mf2.item.weapon.ItemWarhammerMF; +import minefantasy.mf2.item.weapon.ItemWeaponMF; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item.ToolMaterial; import net.minecraftforge.common.util.EnumHelper; -public class DragonforgedStyle -{ +public class DragonforgedStyle { public static ToolMaterial dragonforged = EnumHelper.addToolMaterial("dragonforged", 2, 250, 6.0F, 2.0F, 15); - - public static ItemWeaponMF dragonforged_sword, dragonforged_waraxe, dragonforged_mace, dragonforged_dagger, dragonforged_spear; - public static ItemWeaponMF dragonforged_greatsword, dragonforged_battleaxe, dragonforged_warhammer, dragonforged_katana, dragonforged_halbeard, dragonforged_lance; + + public static ItemWeaponMF dragonforged_sword, dragonforged_waraxe, dragonforged_mace, dragonforged_dagger, + dragonforged_spear; + public static ItemWeaponMF dragonforged_greatsword, dragonforged_battleaxe, dragonforged_warhammer, + dragonforged_katana, dragonforged_halbeard, dragonforged_lance; public static ItemPickMF dragonforged_pick; public static ItemAxeMF dragonforged_axe; public static ItemSpadeMF dragonforged_spade; @@ -30,11 +56,11 @@ public class DragonforgedStyle public static ItemHvyPick dragonforged_hvypick; public static ItemHvyShovel dragonforged_hvyshovel; public static ItemHandpick dragonforged_handpick; - public static ItemTrowMF dragonforged_trow; + public static ItemTrowMF dragonforged_trow; public static ItemScythe dragonforged_scythe; public static ItemMattock dragonforged_mattock; public static ItemLumberAxe dragonforged_lumber; - + public static ItemHammer dragonforged_hammer, dragonforged_hvyhammer; public static ItemTongs dragonforged_tongs; public static ItemShearsMF dragonforged_shears; @@ -42,83 +68,125 @@ public class DragonforgedStyle public static ItemNeedle dragonforged_needle; public static ItemSaw dragonforged_saw; public static ItemSpanner dragonforged_spanner; - + public static ItemBowMF dragonforged_bow; - - public static ItemCustomArmour dragonforged_scale_helmet, dragonforged_scale_chest, dragonforged_scale_legs, dragonforged_scale_boots; - public static ItemCustomArmour dragonforged_chain_helmet, dragonforged_chain_chest, dragonforged_chain_legs, dragonforged_chain_boots; - public static ItemCustomArmour dragonforged_splint_helmet, dragonforged_splint_chest, dragonforged_splint_legs, dragonforged_splint_boots; - public static ItemCustomArmour dragonforged_plate_helmet, dragonforged_plate_chest, dragonforged_plate_legs, dragonforged_plate_boots; - - public static void load() - { + + public static ItemCustomArmour dragonforged_scale_helmet, dragonforged_scale_chest, dragonforged_scale_legs, + dragonforged_scale_boots; + public static ItemCustomArmour dragonforged_chain_helmet, dragonforged_chain_chest, dragonforged_chain_legs, + dragonforged_chain_boots; + public static ItemCustomArmour dragonforged_splint_helmet, dragonforged_splint_chest, dragonforged_splint_legs, + dragonforged_splint_boots; + public static ItemCustomArmour dragonforged_plate_helmet, dragonforged_plate_chest, dragonforged_plate_legs, + dragonforged_plate_boots; + + public static void load() { String design = "dragonforged"; CreativeTabs tab = CreativeTabMF.tabDragonforged; ToolMaterial mat = dragonforged; float ratingMod = 1.2F; - - dragonforged_dagger = new ItemDagger(design+"_dagger", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - dragonforged_sword = new ItemSwordMF(design+"_sword", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - dragonforged_waraxe = new ItemWaraxeMF(design+"_waraxe", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - dragonforged_mace = new ItemMaceMF(design+"_mace", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - dragonforged_spear = new ItemSpearMF(design+"_spear", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - dragonforged_katana = new ItemKatanaMF(design+"_katana", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - dragonforged_greatsword = new ItemGreatswordMF(design+"_greatsword", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - dragonforged_battleaxe = new ItemBattleaxeMF(design+"_battleaxe", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - dragonforged_warhammer = new ItemWarhammerMF(design+"_warhammer", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - dragonforged_halbeard = new ItemHalbeardMF(design+"_halbeard", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - dragonforged_lance = new ItemLance(design+"_lance", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(1); - - - dragonforged_bow = (ItemBowMF) new ItemBowMF(design+"_bow", mat, EnumBowType.SHORTBOW, 1).setCustom(design).setCreativeTab(tab); - - //Tools - dragonforged_pick = (ItemPickMF) new ItemPickMF(design+"_pick", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_axe = (ItemAxeMF) new ItemAxeMF(design+"_axe", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_spade = (ItemSpadeMF) new ItemSpadeMF(design+"_spade", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_hoe = (ItemHoeMF) new ItemHoeMF(design+"_hoe", mat, 0).setCustom(design).setCreativeTab(tab); - - dragonforged_handpick = (ItemHandpick) new ItemHandpick(design+"_handpick", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_hvypick = (ItemHvyPick) new ItemHvyPick(design+"_hvypick", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_trow = (ItemTrowMF) new ItemTrowMF(design+"_trow", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design+"_hvyshovel", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_scythe = (ItemScythe) new ItemScythe(design+"_scythe", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_mattock = (ItemMattock) new ItemMattock(design+"_mattock", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_lumber = (ItemLumberAxe) new ItemLumberAxe(design+"_lumber", mat, 0).setCustom(design).setCreativeTab(tab); - - //Crafters - dragonforged_hammer = (ItemHammer) new ItemHammer(design+"_hammer", mat, false, 0, 0).setCustom(design).setCreativeTab(tab); - dragonforged_hvyhammer = (ItemHammer) new ItemHammer(design+"_hvyhammer", mat, true, 0, 0).setCustom(design).setCreativeTab(tab); - dragonforged_shears = (ItemShearsMF) new ItemShearsMF(design+"_shears", mat, 0, 0).setCustom(design).setCreativeTab(tab); - dragonforged_knife = (ItemKnifeMF) new ItemKnifeMF(design+"_knife", mat, 0, 1F, 0).setCustom(design).setCreativeTab(tab); - dragonforged_needle = (ItemNeedle) new ItemNeedle(design+"_needle", mat, 0, 0).setCustom(design).setCreativeTab(tab); - dragonforged_saw = (ItemSaw) new ItemSaw(design+"_saw", mat, 0, 0).setCustom(design).setCreativeTab(tab); - dragonforged_tongs = (ItemTongs) new ItemTongs(design+"_tongs", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_spanner = (ItemSpanner) new ItemSpanner(design+"_spanner", 0, 0).setCustom(design).setCreativeTab(tab); - - dragonforged_chain_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "chain_helmet", ArmourDesign.CHAINMAIL, 0, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_chain_chest = (ItemCustomArmour) new ItemCustomArmour(design, "chain_chest", ArmourDesign.CHAINMAIL, 1, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_chain_legs = (ItemCustomArmour) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, 2, "chain_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_chain_boots = (ItemCustomArmour) new ItemCustomArmour(design, "chain_boots", ArmourDesign.CHAINMAIL, 3, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - dragonforged_scale_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "scale_helmet", ArmourDesign.SCALEMAIL, 0, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_scale_chest = (ItemCustomArmour) new ItemCustomArmour(design, "scale_chest", ArmourDesign.SCALEMAIL, 1, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_scale_legs = (ItemCustomArmour) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, 2, "scale_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_scale_boots = (ItemCustomArmour) new ItemCustomArmour(design, "scale_boots", ArmourDesign.SCALEMAIL, 3, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - dragonforged_splint_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "splint_helmet", ArmourDesign.SPLINTMAIL, 0, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_splint_chest = (ItemCustomArmour) new ItemCustomArmour(design, "splint_chest", ArmourDesign.SPLINTMAIL, 1, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_splint_legs = (ItemCustomArmour) new ItemCustomArmour(design, "splint_legs", ArmourDesign.SPLINTMAIL, 2, "splint_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_splint_boots = (ItemCustomArmour) new ItemCustomArmour(design, "splint_boots", ArmourDesign.SPLINTMAIL, 3, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - dragonforged_plate_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "plate_helmet", ArmourDesign.FIELDPLATE, 0, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_plate_chest = (ItemCustomArmour) new ItemCustomArmour(design, "plate_chest", ArmourDesign.FIELDPLATE, 1, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_plate_legs = (ItemCustomArmour) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, 2, "plate_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_plate_boots = (ItemCustomArmour) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + dragonforged_dagger = new ItemDagger(design + "_dagger", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_sword = new ItemSwordMF(design + "_sword", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_waraxe = new ItemWaraxeMF(design + "_waraxe", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_mace = new ItemMaceMF(design + "_mace", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_spear = new ItemSpearMF(design + "_spear", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_katana = new ItemKatanaMF(design + "_katana", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_greatsword = new ItemGreatswordMF(design + "_greatsword", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_battleaxe = new ItemBattleaxeMF(design + "_battleaxe", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_warhammer = new ItemWarhammerMF(design + "_warhammer", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_halbeard = new ItemHalbeardMF(design + "_halbeard", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_lance = new ItemLance(design + "_lance", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + + dragonforged_bow = (ItemBowMF) new ItemBowMF(design + "_bow", mat, EnumBowType.SHORTBOW, 1).setCustom(design) + .setCreativeTab(tab); + + // Tools + dragonforged_pick = (ItemPickMF) new ItemPickMF(design + "_pick", mat, 0).setCustom(design).setCreativeTab(tab); + dragonforged_axe = (ItemAxeMF) new ItemAxeMF(design + "_axe", mat, 0).setCustom(design).setCreativeTab(tab); + dragonforged_spade = (ItemSpadeMF) new ItemSpadeMF(design + "_spade", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_hoe = (ItemHoeMF) new ItemHoeMF(design + "_hoe", mat, 0).setCustom(design).setCreativeTab(tab); + + dragonforged_handpick = (ItemHandpick) new ItemHandpick(design + "_handpick", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_hvypick = (ItemHvyPick) new ItemHvyPick(design + "_hvypick", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_trow = (ItemTrowMF) new ItemTrowMF(design + "_trow", mat, 0).setCustom(design).setCreativeTab(tab); + dragonforged_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design + "_hvyshovel", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_scythe = (ItemScythe) new ItemScythe(design + "_scythe", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_mattock = (ItemMattock) new ItemMattock(design + "_mattock", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_lumber = (ItemLumberAxe) new ItemLumberAxe(design + "_lumber", mat, 0).setCustom(design) + .setCreativeTab(tab); + + // Crafters + dragonforged_hammer = (ItemHammer) new ItemHammer(design + "_hammer", mat, false, 0, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_hvyhammer = (ItemHammer) new ItemHammer(design + "_hvyhammer", mat, true, 0, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_shears = (ItemShearsMF) new ItemShearsMF(design + "_shears", mat, 0, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_knife = (ItemKnifeMF) new ItemKnifeMF(design + "_knife", mat, 0, 1F, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_needle = (ItemNeedle) new ItemNeedle(design + "_needle", mat, 0, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_saw = (ItemSaw) new ItemSaw(design + "_saw", mat, 0, 0).setCustom(design).setCreativeTab(tab); + dragonforged_tongs = (ItemTongs) new ItemTongs(design + "_tongs", mat, 0).setCustom(design).setCreativeTab(tab); + dragonforged_spanner = (ItemSpanner) new ItemSpanner(design + "_spanner", 0, 0).setCustom(design) + .setCreativeTab(tab); + + dragonforged_chain_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "chain_helmet", + ArmourDesign.CHAINMAIL, 0, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_chain_chest = (ItemCustomArmour) new ItemCustomArmour(design, "chain_chest", + ArmourDesign.CHAINMAIL, 1, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_chain_legs = (ItemCustomArmour) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, + 2, "chain_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_chain_boots = (ItemCustomArmour) new ItemCustomArmour(design, "chain_boots", + ArmourDesign.CHAINMAIL, 3, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + dragonforged_scale_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "scale_helmet", + ArmourDesign.SCALEMAIL, 0, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_scale_chest = (ItemCustomArmour) new ItemCustomArmour(design, "scale_chest", + ArmourDesign.SCALEMAIL, 1, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_scale_legs = (ItemCustomArmour) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, + 2, "scale_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_scale_boots = (ItemCustomArmour) new ItemCustomArmour(design, "scale_boots", + ArmourDesign.SCALEMAIL, 3, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + dragonforged_splint_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "splint_helmet", + ArmourDesign.SPLINTMAIL, 0, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_splint_chest = (ItemCustomArmour) new ItemCustomArmour(design, "splint_chest", + ArmourDesign.SPLINTMAIL, 1, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_splint_legs = (ItemCustomArmour) new ItemCustomArmour(design, "splint_legs", + ArmourDesign.SPLINTMAIL, 2, "splint_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_splint_boots = (ItemCustomArmour) new ItemCustomArmour(design, "splint_boots", + ArmourDesign.SPLINTMAIL, 3, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + dragonforged_plate_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "plate_helmet", + ArmourDesign.FIELDPLATE, 0, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_plate_chest = (ItemCustomArmour) new ItemCustomArmour(design, "plate_chest", + ArmourDesign.FIELDPLATE, 1, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_plate_legs = (ItemCustomArmour) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, + 2, "plate_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_plate_boots = (ItemCustomArmour) new ItemCustomArmour(design, "plate_boots", + ArmourDesign.FIELDPLATE, 3, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); } - - public static void loadCrafting() - { + + public static void loadCrafting() { SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_dagger, dragonforged_dagger); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_sword, dragonforged_sword); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_mace, dragonforged_mace); @@ -131,7 +199,7 @@ public static void loadCrafting() SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_halbeard, dragonforged_halbeard); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_lance, dragonforged_lance); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_bow, dragonforged_bow); - + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_pick, dragonforged_pick); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_axe, dragonforged_axe); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_spade, dragonforged_spade); @@ -146,14 +214,14 @@ public static void loadCrafting() SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_scythe, dragonforged_scythe); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_spanner, dragonforged_spanner); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_lumber, dragonforged_lumber); - + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hammer, dragonforged_hammer); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hvyhammer, dragonforged_hvyhammer); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_tongs, dragonforged_tongs); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_saw, dragonforged_saw); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_needle, dragonforged_needle); SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_knife, dragonforged_knife); - + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_boots, dragonforged_chain_boots); SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_legs, dragonforged_chain_legs); SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_chest, dragonforged_chain_chest); @@ -163,12 +231,12 @@ public static void loadCrafting() SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_legs, dragonforged_scale_legs); SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_chest, dragonforged_scale_chest); SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_helmet, dragonforged_scale_helmet); - + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_boots, dragonforged_splint_boots); SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_legs, dragonforged_splint_legs); SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_chest, dragonforged_splint_chest); SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_helmet, dragonforged_splint_helmet); - + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_boots, dragonforged_plate_boots); SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_legs, dragonforged_plate_legs); SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_chest, dragonforged_plate_chest); diff --git a/src/main/java/minefantasy/mf2/item/list/styles/OrnateStyle.java b/src/main/java/minefantasy/mf2/item/list/styles/OrnateStyle.java index 3e4fa6de..6e7397ea 100644 --- a/src/main/java/minefantasy/mf2/item/list/styles/OrnateStyle.java +++ b/src/main/java/minefantasy/mf2/item/list/styles/OrnateStyle.java @@ -2,27 +2,52 @@ import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.crafting.exotic.SpecialForging; -import minefantasy.mf2.item.archery.*; -import minefantasy.mf2.item.armour.ItemArmourMF; +import minefantasy.mf2.item.archery.EnumBowType; +import minefantasy.mf2.item.archery.ItemBowMF; import minefantasy.mf2.item.armour.ItemCustomArmour; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.CustomArmourListMF; import minefantasy.mf2.item.list.CustomToolListMF; -import minefantasy.mf2.item.tool.*; -import minefantasy.mf2.item.tool.advanced.*; -import minefantasy.mf2.item.tool.crafting.*; -import minefantasy.mf2.item.weapon.*; -import minefantasy.mf2.material.BaseMaterialMF; +import minefantasy.mf2.item.tool.ItemAxeMF; +import minefantasy.mf2.item.tool.ItemHoeMF; +import minefantasy.mf2.item.tool.ItemPickMF; +import minefantasy.mf2.item.tool.ItemShearsMF; +import minefantasy.mf2.item.tool.ItemSpadeMF; +import minefantasy.mf2.item.tool.advanced.ItemHandpick; +import minefantasy.mf2.item.tool.advanced.ItemHvyPick; +import minefantasy.mf2.item.tool.advanced.ItemHvyShovel; +import minefantasy.mf2.item.tool.advanced.ItemLumberAxe; +import minefantasy.mf2.item.tool.advanced.ItemMattock; +import minefantasy.mf2.item.tool.advanced.ItemScythe; +import minefantasy.mf2.item.tool.advanced.ItemTrowMF; +import minefantasy.mf2.item.tool.crafting.ItemHammer; +import minefantasy.mf2.item.tool.crafting.ItemKnifeMF; +import minefantasy.mf2.item.tool.crafting.ItemNeedle; +import minefantasy.mf2.item.tool.crafting.ItemSaw; +import minefantasy.mf2.item.tool.crafting.ItemSpanner; +import minefantasy.mf2.item.tool.crafting.ItemTongs; +import minefantasy.mf2.item.weapon.ItemBattleaxeMF; +import minefantasy.mf2.item.weapon.ItemDagger; +import minefantasy.mf2.item.weapon.ItemGreatswordMF; +import minefantasy.mf2.item.weapon.ItemHalbeardMF; +import minefantasy.mf2.item.weapon.ItemKatanaMF; +import minefantasy.mf2.item.weapon.ItemLance; +import minefantasy.mf2.item.weapon.ItemMaceMF; +import minefantasy.mf2.item.weapon.ItemSpearMF; +import minefantasy.mf2.item.weapon.ItemSwordMF; +import minefantasy.mf2.item.weapon.ItemWaraxeMF; +import minefantasy.mf2.item.weapon.ItemWarhammerMF; +import minefantasy.mf2.item.weapon.ItemWeaponMF; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item.ToolMaterial; import net.minecraftforge.common.util.EnumHelper; -public class OrnateStyle -{ +public class OrnateStyle { public static ToolMaterial ornate = EnumHelper.addToolMaterial("ornate", 2, 250, 6.0F, 2.0F, 100); - + public static ItemWeaponMF ornate_sword, ornate_waraxe, ornate_mace, ornate_dagger, ornate_spear; - public static ItemWeaponMF ornate_greatsword, ornate_battleaxe, ornate_warhammer, ornate_katana, ornate_halbeard, ornate_lance; + public static ItemWeaponMF ornate_greatsword, ornate_battleaxe, ornate_warhammer, ornate_katana, ornate_halbeard, + ornate_lance; public static ItemPickMF ornate_pick; public static ItemAxeMF ornate_axe; public static ItemSpadeMF ornate_spade; @@ -30,11 +55,11 @@ public class OrnateStyle public static ItemHvyPick ornate_hvypick; public static ItemHvyShovel ornate_hvyshovel; public static ItemHandpick ornate_handpick; - public static ItemTrowMF ornate_trow; + public static ItemTrowMF ornate_trow; public static ItemScythe ornate_scythe; public static ItemMattock ornate_mattock; public static ItemLumberAxe ornate_lumber; - + public static ItemHammer ornate_hammer, ornate_hvyhammer; public static ItemTongs ornate_tongs; public static ItemShearsMF ornate_shears; @@ -42,85 +67,118 @@ public class OrnateStyle public static ItemNeedle ornate_needle; public static ItemSaw ornate_saw; public static ItemSpanner ornate_spanner; - + public static ItemBowMF ornate_bow; - + public static ItemCustomArmour ornate_scale_helmet, ornate_scale_chest, ornate_scale_legs, ornate_scale_boots; public static ItemCustomArmour ornate_chain_helmet, ornate_chain_chest, ornate_chain_legs, ornate_chain_boots; public static ItemCustomArmour ornate_splint_helmet, ornate_splint_chest, ornate_splint_legs, ornate_splint_boots; public static ItemCustomArmour ornate_plate_helmet, ornate_plate_chest, ornate_plate_legs, ornate_plate_boots; - - public static void load() - { + + public static void load() { String design = "ornate"; CreativeTabs tab = CreativeTabMF.tabOrnate; ToolMaterial mat = ornate; float ratingMod = 0.8F; - - ornate_dagger = new ItemDagger(design+"_dagger", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_sword = new ItemSwordMF(design+"_sword", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_waraxe = new ItemWaraxeMF(design+"_waraxe", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_mace = new ItemMaceMF(design+"_mace", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_spear = new ItemSpearMF(design+"_spear", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_katana = new ItemKatanaMF(design+"_katana", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_greatsword = new ItemGreatswordMF(design+"_greatsword", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_battleaxe = new ItemBattleaxeMF(design+"_battleaxe", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_warhammer = new ItemWarhammerMF(design+"_warhammer", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_halbeard = new ItemHalbeardMF(design+"_halbeard", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_lance = new ItemLance(design+"_lance", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - - - ornate_bow = (ItemBowMF) new ItemBowMF(design+"_bow", mat, EnumBowType.SHORTBOW, 1).setCustom(design).setCreativeTab(tab); - - //Tools - ornate_pick = (ItemPickMF) new ItemPickMF(design+"_pick", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_axe = (ItemAxeMF) new ItemAxeMF(design+"_axe", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_spade = (ItemSpadeMF) new ItemSpadeMF(design+"_spade", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_hoe = (ItemHoeMF) new ItemHoeMF(design+"_hoe", mat, 0).setCustom(design).setCreativeTab(tab); - - ornate_handpick = (ItemHandpick) new ItemHandpick(design+"_handpick", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_hvypick = (ItemHvyPick) new ItemHvyPick(design+"_hvypick", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_trow = (ItemTrowMF) new ItemTrowMF(design+"_trow", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design+"_hvyshovel", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_scythe = (ItemScythe) new ItemScythe(design+"_scythe", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_mattock = (ItemMattock) new ItemMattock(design+"_mattock", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_lumber = (ItemLumberAxe) new ItemLumberAxe(design+"_lumber", mat, 0).setCustom(design).setCreativeTab(tab); - - //Crafters - ornate_hammer = (ItemHammer) new ItemHammer(design+"_hammer", mat, false, 0, 0).setCustom(design).setCreativeTab(tab); - ornate_hvyhammer = (ItemHammer) new ItemHammer(design+"_hvyhammer", mat, true, 0, 0).setCustom(design).setCreativeTab(tab); - ornate_shears = (ItemShearsMF) new ItemShearsMF(design+"_shears", mat, 0, 0).setCustom(design).setCreativeTab(tab); - ornate_knife = (ItemKnifeMF) new ItemKnifeMF(design+"_knife", mat, 0, 1F, 0).setCustom(design).setCreativeTab(tab); - ornate_needle = (ItemNeedle) new ItemNeedle(design+"_needle", mat, 0, 0).setCustom(design).setCreativeTab(tab); - ornate_saw = (ItemSaw) new ItemSaw(design+"_saw", mat, 0, 0).setCustom(design).setCreativeTab(tab); - ornate_tongs = (ItemTongs) new ItemTongs(design+"_tongs", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_spanner = (ItemSpanner) new ItemSpanner(design+"_spanner", 0, 0).setCustom(design).setCreativeTab(tab); - - ornate_chain_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "chain_helmet", ArmourDesign.CHAINMAIL, 0, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_chain_chest = (ItemCustomArmour) new ItemCustomArmour(design, "chain_chest", ArmourDesign.CHAINMAIL, 1, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_chain_legs = (ItemCustomArmour) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, 2, "chain_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_chain_boots = (ItemCustomArmour) new ItemCustomArmour(design, "chain_boots", ArmourDesign.CHAINMAIL, 3, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - ornate_scale_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "scale_helmet", ArmourDesign.SCALEMAIL, 0, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_scale_chest = (ItemCustomArmour) new ItemCustomArmour(design, "scale_chest", ArmourDesign.SCALEMAIL, 1, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_scale_legs = (ItemCustomArmour) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, 2, "scale_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_scale_boots = (ItemCustomArmour) new ItemCustomArmour(design, "scale_boots", ArmourDesign.SCALEMAIL, 3, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - ornate_splint_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "splint_helmet", ArmourDesign.SPLINTMAIL, 0, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_splint_chest = (ItemCustomArmour) new ItemCustomArmour(design, "splint_chest", ArmourDesign.SPLINTMAIL, 1, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_splint_legs = (ItemCustomArmour) new ItemCustomArmour(design, "splint_legs", ArmourDesign.SPLINTMAIL, 2, "splint_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_splint_boots = (ItemCustomArmour) new ItemCustomArmour(design, "splint_boots", ArmourDesign.SPLINTMAIL, 3, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - ornate_plate_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "plate_helmet", ArmourDesign.FIELDPLATE, 0, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_plate_chest = (ItemCustomArmour) new ItemCustomArmour(design, "plate_chest", ArmourDesign.FIELDPLATE, 1, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_plate_legs = (ItemCustomArmour) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, 2, "plate_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_plate_boots = (ItemCustomArmour) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + ornate_dagger = new ItemDagger(design + "_dagger", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_sword = new ItemSwordMF(design + "_sword", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_waraxe = new ItemWaraxeMF(design + "_waraxe", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_mace = new ItemMaceMF(design + "_mace", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); + ornate_spear = new ItemSpearMF(design + "_spear", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_katana = new ItemKatanaMF(design + "_katana", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_greatsword = new ItemGreatswordMF(design + "_greatsword", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_battleaxe = new ItemBattleaxeMF(design + "_battleaxe", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_warhammer = new ItemWarhammerMF(design + "_warhammer", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_halbeard = new ItemHalbeardMF(design + "_halbeard", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_lance = new ItemLance(design + "_lance", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); + + ornate_bow = (ItemBowMF) new ItemBowMF(design + "_bow", mat, EnumBowType.SHORTBOW, 1).setCustom(design) + .setCreativeTab(tab); + + // Tools + ornate_pick = (ItemPickMF) new ItemPickMF(design + "_pick", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_axe = (ItemAxeMF) new ItemAxeMF(design + "_axe", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_spade = (ItemSpadeMF) new ItemSpadeMF(design + "_spade", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_hoe = (ItemHoeMF) new ItemHoeMF(design + "_hoe", mat, 0).setCustom(design).setCreativeTab(tab); + + ornate_handpick = (ItemHandpick) new ItemHandpick(design + "_handpick", mat, 0).setCustom(design) + .setCreativeTab(tab); + ornate_hvypick = (ItemHvyPick) new ItemHvyPick(design + "_hvypick", mat, 0).setCustom(design) + .setCreativeTab(tab); + ornate_trow = (ItemTrowMF) new ItemTrowMF(design + "_trow", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design + "_hvyshovel", mat, 0).setCustom(design) + .setCreativeTab(tab); + ornate_scythe = (ItemScythe) new ItemScythe(design + "_scythe", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_mattock = (ItemMattock) new ItemMattock(design + "_mattock", mat, 0).setCustom(design) + .setCreativeTab(tab); + ornate_lumber = (ItemLumberAxe) new ItemLumberAxe(design + "_lumber", mat, 0).setCustom(design) + .setCreativeTab(tab); + + // Crafters + ornate_hammer = (ItemHammer) new ItemHammer(design + "_hammer", mat, false, 0, 0).setCustom(design) + .setCreativeTab(tab); + ornate_hvyhammer = (ItemHammer) new ItemHammer(design + "_hvyhammer", mat, true, 0, 0).setCustom(design) + .setCreativeTab(tab); + ornate_shears = (ItemShearsMF) new ItemShearsMF(design + "_shears", mat, 0, 0).setCustom(design) + .setCreativeTab(tab); + ornate_knife = (ItemKnifeMF) new ItemKnifeMF(design + "_knife", mat, 0, 1F, 0).setCustom(design) + .setCreativeTab(tab); + ornate_needle = (ItemNeedle) new ItemNeedle(design + "_needle", mat, 0, 0).setCustom(design) + .setCreativeTab(tab); + ornate_saw = (ItemSaw) new ItemSaw(design + "_saw", mat, 0, 0).setCustom(design).setCreativeTab(tab); + ornate_tongs = (ItemTongs) new ItemTongs(design + "_tongs", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_spanner = (ItemSpanner) new ItemSpanner(design + "_spanner", 0, 0).setCustom(design).setCreativeTab(tab); + + ornate_chain_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "chain_helmet", ArmourDesign.CHAINMAIL, 0, + "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_chain_chest = (ItemCustomArmour) new ItemCustomArmour(design, "chain_chest", ArmourDesign.CHAINMAIL, 1, + "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_chain_legs = (ItemCustomArmour) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, 2, + "chain_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_chain_boots = (ItemCustomArmour) new ItemCustomArmour(design, "chain_boots", ArmourDesign.CHAINMAIL, 3, + "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + ornate_scale_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "scale_helmet", ArmourDesign.SCALEMAIL, 0, + "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_scale_chest = (ItemCustomArmour) new ItemCustomArmour(design, "scale_chest", ArmourDesign.SCALEMAIL, 1, + "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_scale_legs = (ItemCustomArmour) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, 2, + "scale_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_scale_boots = (ItemCustomArmour) new ItemCustomArmour(design, "scale_boots", ArmourDesign.SCALEMAIL, 3, + "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + ornate_splint_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "splint_helmet", ArmourDesign.SPLINTMAIL, + 0, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_splint_chest = (ItemCustomArmour) new ItemCustomArmour(design, "splint_chest", ArmourDesign.SPLINTMAIL, + 1, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_splint_legs = (ItemCustomArmour) new ItemCustomArmour(design, "splint_legs", ArmourDesign.SPLINTMAIL, 2, + "splint_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_splint_boots = (ItemCustomArmour) new ItemCustomArmour(design, "splint_boots", ArmourDesign.SPLINTMAIL, + 3, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + ornate_plate_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "plate_helmet", ArmourDesign.FIELDPLATE, + 0, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_plate_chest = (ItemCustomArmour) new ItemCustomArmour(design, "plate_chest", ArmourDesign.FIELDPLATE, 1, + "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_plate_legs = (ItemCustomArmour) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, 2, + "plate_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_plate_boots = (ItemCustomArmour) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, + "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); } - - public static void loadCrafting() - { + + public static void loadCrafting() { String id = "ornate"; - + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_dagger, ornate_dagger); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_sword, ornate_sword); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_mace, ornate_mace); @@ -133,7 +191,7 @@ public static void loadCrafting() SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_halbeard, ornate_halbeard); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_lance, ornate_lance); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_bow, ornate_bow); - + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_pick, ornate_pick); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_axe, ornate_axe); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_spade, ornate_spade); @@ -148,14 +206,14 @@ public static void loadCrafting() SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_scythe, ornate_scythe); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_spanner, ornate_spanner); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_lumber, ornate_lumber); - + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hammer, ornate_hammer); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hvyhammer, ornate_hvyhammer); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_tongs, ornate_tongs); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_saw, ornate_saw); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_needle, ornate_needle); SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_knife, ornate_knife); - + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_boots, ornate_chain_boots); SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_legs, ornate_chain_legs); SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_chest, ornate_chain_chest); @@ -165,12 +223,12 @@ public static void loadCrafting() SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_legs, ornate_scale_legs); SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_chest, ornate_scale_chest); SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_helmet, ornate_scale_helmet); - + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_boots, ornate_splint_boots); SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_legs, ornate_splint_legs); SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_chest, ornate_splint_chest); SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_helmet, ornate_splint_helmet); - + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_boots, ornate_plate_boots); SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_legs, ornate_plate_legs); SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_chest, ornate_plate_chest); diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemAxeMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemAxeMF.java index ebd97076..9d6156e2 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemAxeMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemAxeMF.java @@ -4,14 +4,18 @@ import java.util.Iterator; import java.util.List; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.CustomToolListMF; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.SharedMonsterAttributes; @@ -22,197 +26,181 @@ import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; import net.minecraftforge.common.ForgeHooks; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - /** * @author Anonymous Productions */ -public class ItemAxeMF extends ItemAxe implements IToolMaterial -{ +public class ItemAxeMF extends ItemAxe implements IToolMaterial { private String name; private float baseDamage = 3F; - - public ItemAxeMF(String name, ToolMaterial material, int rarity) - { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name=name; - setTextureName("minefantasy2:Tool/"+name); + + public ItemAxeMF(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } + } + @Override - public ToolMaterial getMaterial() - { + public ToolMaterial getMaterial() { return toolMaterial; } - - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemAxeMF setCustom(String s) - { + + public ItemAxeMF setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; canRepair = false; return this; } - public ItemAxeMF setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - private float efficiencyMod = 1.0F; - public ItemAxeMF setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemAxeMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemAxeMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); - } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); } - public float func_150893_a(ItemStack stack, Block block) - { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemHoeMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemHoeMF.java index 46098f43..8bddc8de 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemHoeMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemHoeMF.java @@ -4,178 +4,161 @@ import java.util.Iterator; import java.util.List; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.CustomToolListMF; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemHoe; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraftforge.common.ForgeHooks; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; /** * @author Anonymous Productions */ -public class ItemHoeMF extends ItemHoe implements IToolMaterial -{ +public class ItemHoeMF extends ItemHoe implements IToolMaterial { private String name; private ToolMaterial toolMaterial; - public ItemHoeMF(String name, ToolMaterial material, int rarity) - { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name=name; - this.toolMaterial = material; - setTextureName("minefantasy2:Tool/"+name); + + public ItemHoeMF(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + this.toolMaterial = material; + setTextureName("minefantasy2:Tool/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } + } + @Override - public ToolMaterial getMaterial() - { + public ToolMaterial getMaterial() { return toolMaterial; } - - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemHoeMF setCustom(String s) - { + + public ItemHoeMF setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - private float efficiencyMod = 1.0F; - public ItemHoeMF setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + private float efficiencyMod = 1.0F; + + public ItemHoeMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); } - public float getEfficiency(ItemStack stack) - { + + public float getEfficiency(ItemStack stack) { return CustomToolHelper.getEfficiency(stack, 1.0F, efficiencyMod); } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemLighterMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemLighterMF.java index 7dd3a8c9..4935b646 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemLighterMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemLighterMF.java @@ -1,5 +1,6 @@ package minefantasy.mf2.item.tool; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.tool.ILighter; import minefantasy.mf2.item.list.CreativeTabMF; @@ -8,16 +9,13 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemFlintAndSteel; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import cpw.mods.fml.common.registry.GameRegistry; -public class ItemLighterMF extends Item implements ILighter -{ +public class ItemLighterMF extends Item implements ILighter { private float chance; - public ItemLighterMF(String name, float chance, int uses) - { - setTextureName("minefantasy2:Tool/"+name); + + public ItemLighterMF(String name, float chance, int uses) { + setTextureName("minefantasy2:Tool/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); setMaxDamage(uses); @@ -25,85 +23,73 @@ public ItemLighterMF(String name, float chance, int uses) this.setMaxStackSize(1); this.setCreativeTab(CreativeTabMF.tabGadget); } + @Override - public boolean canLight() - { + public boolean canLight() { return true; } + @Override - public double getChance() - { + public double getChance() { return chance; } - //0 for N/A -1 for fail, 1 for succeed - public static int tryUse(ItemStack held, EntityPlayer user) - { - if(held == null)return 0; - - if(held.getItem() instanceof ItemFlintAndSteel) - { + + // 0 for N/A -1 for fail, 1 for succeed + public static int tryUse(ItemStack held, EntityPlayer user) { + if (held == null) + return 0; + + if (held.getItem() instanceof ItemFlintAndSteel) { return 1; } - if(held.getItem() instanceof ILighter) - { - ILighter lighter = (ILighter)held.getItem(); + if (held.getItem() instanceof ILighter) { + ILighter lighter = (ILighter) held.getItem(); return (lighter.canLight() && user.getRNG().nextFloat() < lighter.getChance()) ? 1 : -1; } return 0; } - - public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int face, float xo, float yo, float zo) - { - if (face == 0) - { - --y; - } - if (face == 1) - { - ++y; - } + public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int face, float xo, + float yo, float zo) { + if (face == 0) { + --y; + } + + if (face == 1) { + ++y; + } - if (face == 2) - { - --z; - } + if (face == 2) { + --z; + } - if (face == 3) - { - ++z; - } + if (face == 3) { + ++z; + } - if (face == 4) - { - --x; - } + if (face == 4) { + --x; + } - if (face == 5) - { - ++x; - } + if (face == 5) { + ++x; + } - if (!user.canPlayerEdit(x, y, z, face, item)) - { - return false; - } - else - { - boolean success = user.getRNG().nextFloat() < chance; - if (world.isAirBlock(x, y, z)) - { - world.playSoundEffect((double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D, "fire.ignite", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F); - if(success) - { - world.setBlock(x, y, z, Blocks.fire); - } - } - if(success) - { - item.damageItem(1, user); - } - return true; - } - } + if (!user.canPlayerEdit(x, y, z, face, item)) { + return false; + } else { + boolean success = user.getRNG().nextFloat() < chance; + if (world.isAirBlock(x, y, z)) { + world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "fire.ignite", 1.0F, + itemRand.nextFloat() * 0.4F + 0.8F); + if (success) { + world.setBlock(x, y, z, Blocks.fire); + } + } + if (success) { + item.damageItem(1, user); + } + return true; + } + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemPickMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemPickMF.java index 2ebb361c..a1803b15 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemPickMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemPickMF.java @@ -4,12 +4,17 @@ import java.util.Iterator; import java.util.List; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.CustomToolListMF; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -29,57 +34,44 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - /** * @author Anonymous Productions */ -public class ItemPickMF extends ItemPickaxe implements IToolMaterial -{ +public class ItemPickMF extends ItemPickaxe implements IToolMaterial { private String name; private float baseDamage = 2F; - - public ItemPickMF(String name, ToolMaterial material, int rarity) - { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name=name; - - setTextureName("minefantasy2:Tool/"+name); + + public ItemPickMF(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + + setTextureName("minefantasy2:Tool/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } - - @Override - public ToolMaterial getMaterial() - { + } + + @Override + public ToolMaterial getMaterial() { return toolMaterial; } - - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) - { - if(!world.isRemote)return item; - + + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + if (!world.isRemote) + return item; + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - if (movingobjectposition == null) - { + if (movingobjectposition == null) { return item; - } else - { + } else { if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { int i = movingobjectposition.blockX; int j = movingobjectposition.blockY; int k = movingobjectposition.blockZ; - if (!world.canMineBlock(player, i, j, k)) - { + if (!world.canMineBlock(player, i, j, k)) { return item; } @@ -89,16 +81,13 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer play Block block = world.getBlock(i, j, k); int blockTier = block.getHarvestLevel(world.getBlockMetadata(i, j, k)); - + int HL = CustomToolHelper.getHarvestLevel(item, toolMaterial.getHarvestLevel()); - if(blockTier > HL) - { - String msg = StatCollector.translateToLocalFormatted("prospect.cannotmine", HL, blockTier); + if (blockTier > HL) { + String msg = StatCollector.translateToLocalFormatted("prospect.cannotmine", HL, blockTier); player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + msg)); - } - else - { - String msg = StatCollector.translateToLocalFormatted("prospect.canmine", HL, blockTier); + } else { + String msg = StatCollector.translateToLocalFormatted("prospect.canmine", HL, blockTier); player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + msg)); } } @@ -111,164 +100,158 @@ private boolean canMineBlock(World world, int i, int j, int k) { // TODO Auto-generated method stub return false; } - - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemPickMF setCustom(String s) - { + + public ItemPickMF setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemPickMF setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - private float efficiencyMod = 1.0F; - public ItemPickMF setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemPickMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemPickMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); } - public float func_150893_a(ItemStack stack, Block block) - { - return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + + public float func_150893_a(ItemStack stack, Block block) { + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil + && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemShearsMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemShearsMF.java index d9e78454..cf298d17 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemShearsMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemShearsMF.java @@ -4,189 +4,169 @@ import java.util.Iterator; import java.util.List; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; - +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.api.tool.IToolMF; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.CustomToolListMF; -import minefantasy.mf2.item.list.ToolListMF; -import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemShears; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraftforge.common.ForgeHooks; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; /** * @author Anonymous Productions */ -public class ItemShearsMF extends ItemShears implements IToolMaterial, IToolMF -{ +public class ItemShearsMF extends ItemShears implements IToolMaterial, IToolMF { private ToolMaterial toolMaterial; private int tier; private String name; - - public ItemShearsMF(String name, ToolMaterial material, int rarity, int tier) - { - super(); - this.name=name; - this.tier = tier; - itemRarity = rarity; - toolMaterial = material; - setCreativeTab(CreativeTabMF.tabOldTools); - this.setMaxDamage(material.getMaxUses()); - setTextureName("minefantasy2:Tool/"+name); + + public ItemShearsMF(String name, ToolMaterial material, int rarity, int tier) { + super(); + this.name = name; + this.tier = tier; + itemRarity = rarity; + toolMaterial = material; + setCreativeTab(CreativeTabMF.tabOldTools); + this.setMaxDamage(material.getMaxUses()); + setTextureName("minefantasy2:Tool/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } - - //===================================================== CUSTOM START =============================================================\\ + } + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemShearsMF setCustom(String s) - { + + public ItemShearsMF setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - private float efficiencyMod = 1.0F; - public ItemShearsMF setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + private float efficiencyMod = 1.0F; + + public ItemShearsMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } + private IIcon detailTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass > 0 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass > 0 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } @Override - public float getEfficiency(ItemStack item) - { + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + public float getEfficiency(ItemStack item) { return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); } @Override - public int getTier(ItemStack item) - { + public int getTier(ItemStack item) { return CustomToolHelper.getCrafterTier(item, tier); } + @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + // ====================================================== CUSTOM END + // ==============================================================\\ @Override - public String getToolType(ItemStack item) - { + public String getToolType(ItemStack item) { return "shears"; } @Override - public ToolMaterial getMaterial() - { + public ToolMaterial getMaterial() { return toolMaterial; } } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemSpadeMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemSpadeMF.java index 73e11e4e..6709651a 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemSpadeMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemSpadeMF.java @@ -4,14 +4,18 @@ import java.util.Iterator; import java.util.List; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.CustomToolListMF; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.SharedMonsterAttributes; @@ -24,192 +28,178 @@ import net.minecraft.util.IIcon; import net.minecraftforge.common.ForgeHooks; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - /** * @author Anonymous Productions */ -public class ItemSpadeMF extends ItemSpade implements IToolMaterial -{ +public class ItemSpadeMF extends ItemSpade implements IToolMaterial { private String name; private float baseDamage = 1F; - - public ItemSpadeMF(String name, ToolMaterial material, int rarity) - { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name=name; - setTextureName("minefantasy2:Tool/"+name); + + public ItemSpadeMF(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } + } + @Override - public ToolMaterial getMaterial() - { + public ToolMaterial getMaterial() { return toolMaterial; } - - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemSpadeMF setCustom(String s) - { + + public ItemSpadeMF setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemSpadeMF setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - private float efficiencyMod = 1.0F; - public ItemSpadeMF setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemSpadeMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemSpadeMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); - } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); } - public float func_150893_a(ItemStack stack, Block block) - { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java b/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java index daf7d33b..cc794006 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java @@ -2,27 +2,22 @@ import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.item.Item.ToolMaterial; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.EnumHelper; -public class ToolMaterialMF -{ +public class ToolMaterialMF { /* - WOOD(0, 59, 2.0F, 0, 15), - STONE(1, 131, 4.0F, 1, 5), - IRON(2, 250, 6.0F, 2, 14), - EMERALD(3, 1561, 8.0F, 3, 10), - GOLD(0, 32, 12.0F, 0, 22); - */ -//public static EnumToolMaterial STEEL = EnumHelper.addToolMaterial("STEEL", 2, 1000, 7.8F, 2.5F, 22); + * WOOD(0, 59, 2.0F, 0, 15), STONE(1, 131, 4.0F, 1, 5), IRON(2, 250, 6.0F, 2, + * 14), EMERALD(3, 1561, 8.0F, 3, 10), GOLD(0, 32, 12.0F, 0, 22); + */ + // public static EnumToolMaterial STEEL = EnumHelper.addToolMaterial("STEEL", 2, + // 1000, 7.8F, 2.5F, 22); - //Misc - - //Basics stage1 - - public static boolean isUnbreakable(ToolMaterial toolMaterial) - { - return toolMaterial == BaseMaterialMF.enderforge.getToolConversion() || toolMaterial == BaseMaterialMF.ignotumite.getToolConversion() || toolMaterial == BaseMaterialMF.mithium.getToolConversion(); + // Misc + + // Basics stage1 + + public static boolean isUnbreakable(ToolMaterial toolMaterial) { + return toolMaterial == BaseMaterialMF.enderforge.getToolConversion() + || toolMaterial == BaseMaterialMF.ignotumite.getToolConversion() + || toolMaterial == BaseMaterialMF.mithium.getToolConversion(); } } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHandpick.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHandpick.java index d35974a0..5e2cdb0b 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHandpick.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHandpick.java @@ -18,7 +18,6 @@ import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.config.ConfigTools; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -42,261 +41,248 @@ /** * @author Anonymous Productions */ -public class ItemHandpick extends ItemPickaxe implements IToolMaterial -{ +public class ItemHandpick extends ItemPickaxe implements IToolMaterial { private String name; private float baseDamage = 1F; private Random rand = new Random(); - public ItemHandpick(String name, ToolMaterial material, int rarity) - { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name=name; - setTextureName("minefantasy2:Tool/Advanced/"+name); + + public ItemHandpick(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/Advanced/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); setMaxDamage(material.getMaxUses()); - } + } + @Override - public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user) - { + public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, + EntityLivingBase user) { boolean silk = EnchantmentHelper.getSilkTouchModifier(user); int m = world.getBlockMetadata(x, y, z); - ArrayListdrops = block.getDrops(world, x, y, z, 0, m); - - if(!silk && drops != null && !drops.isEmpty()) - { + ArrayList drops = block.getDrops(world, x, y, z, 0, m); + + if (!silk && drops != null && !drops.isEmpty()) { Iterator list = drops.iterator(); - while(list.hasNext()) - { + while (list.hasNext()) { ItemStack drop = list.next(); - if(isOre(block, m) && !drop.isItemEqual(new ItemStack(block, 1, m)) && !(drop.getItem() instanceof ItemBlock) && rand.nextFloat() < getDoubleDropChance()) - { + if (isOre(block, m) && !drop.isItemEqual(new ItemStack(block, 1, m)) + && !(drop.getItem() instanceof ItemBlock) && rand.nextFloat() < getDoubleDropChance()) { dropItem(world, x, y, z, drop.copy()); } } } - - if(!world.isRemote) - { - int meta = world.getBlockMetadata(x, y, z); - int harvestlvl = this.getMaterial().getHarvestLevel(); - int fortune = EnchantmentHelper.getFortuneModifier(user); - - ArrayListspecialdrops = RandomOre.getDroppedItems(user, block, meta, harvestlvl, fortune, silk, y); - - if(specialdrops != null && !specialdrops.isEmpty()) - { - Iterator list = specialdrops.iterator(); - - while(list.hasNext()) - { - ItemStack newdrop = (ItemStack)list.next(); - - if(newdrop != null) - { - if(newdrop.stackSize < 1)newdrop.stackSize = 1; - - dropItem(world, x, y, z, newdrop); - } - } - } + + if (!world.isRemote) { + int meta = world.getBlockMetadata(x, y, z); + int harvestlvl = this.getMaterial().getHarvestLevel(); + int fortune = EnchantmentHelper.getFortuneModifier(user); + + ArrayList specialdrops = RandomOre.getDroppedItems(user, block, meta, harvestlvl, fortune, silk, + y); + + if (specialdrops != null && !specialdrops.isEmpty()) { + Iterator list = specialdrops.iterator(); + + while (list.hasNext()) { + ItemStack newdrop = (ItemStack) list.next(); + + if (newdrop != null) { + if (newdrop.stackSize < 1) + newdrop.stackSize = 1; + + dropItem(world, x, y, z, newdrop); + } + } + } } return super.onBlockDestroyed(item, world, block, x, y, z, user); } - private boolean isOre(Block block, int meta) - { - if(!block.isToolEffective("pickaxe", meta)) - { + + private boolean isOre(Block block, int meta) { + if (!block.isToolEffective("pickaxe", meta)) { return false; } - for(int i: OreDictionary.getOreIDs(new ItemStack(block, 1, meta))) - { + for (int i : OreDictionary.getOreIDs(new ItemStack(block, 1, meta))) { String orename = OreDictionary.getOreName(i); - if(orename != null && orename.startsWith("ore")) - { + if (orename != null && orename.startsWith("ore")) { return true; } } return false; } - private void dropItem(World world, int x, int y, int z, ItemStack drop) - { - if(world.isRemote)return; - - EntityItem dropItem = new EntityItem(world, x+0.5D, y+0.5D, z+0.5D, drop); + + private void dropItem(World world, int x, int y, int z, ItemStack drop) { + if (world.isRemote) + return; + + EntityItem dropItem = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, drop); dropItem.delayBeforeCanPickup = 10; world.spawnEntityInWorld(dropItem); } - private float getDoubleDropChance() - { - return ConfigTools.handpickBonus/100F; + private float getDoubleDropChance() { + return ConfigTools.handpickBonus / 100F; } - - @Override - public ToolMaterial getMaterial() - { + + @Override + public ToolMaterial getMaterial() { return toolMaterial; } - //===================================================== CUSTOM START =============================================================\\ + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemHandpick setCustom(String s) - { + + public ItemHandpick setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemHandpick setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - private float efficiencyMod = 1.0F; - public ItemHandpick setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemHandpick setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemHandpick setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } - private IIcon detailTex = null; + + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) / 2; } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 2); + } + + public float func_150893_a(ItemStack stack, Block block) { + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil + && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod/2); + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); } - public float func_150893_a(ItemStack stack, Block block) - { - return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod/2); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java index 9b1e8347..e6b85071 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java @@ -39,233 +39,224 @@ /** * @author Anonymous Productions */ -public class ItemHvyPick extends ItemPickaxe implements IToolMaterial -{ +public class ItemHvyPick extends ItemPickaxe implements IToolMaterial { private String name; private float baseDamage = 2F; private Random rand = new Random(); - public ItemHvyPick(String name, ToolMaterial material, int rarity) - { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name=name; - setTextureName("minefantasy2:Tool/Advanced/"+name); + + public ItemHvyPick(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/Advanced/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); setMaxDamage(material.getMaxUses()); - } + } + @Override - public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user) - { - if(!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z)) && ItemLumberAxe.canAcceptCost(user)) - { - for(int x1 = -1; x1 <= 1; x1 ++) - { - for(int y1 = -1; y1 <= 1; y1 ++) - { - for(int z1 = -1; z1 <= 1; z1 ++) - { + public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, + EntityLivingBase user) { + if (!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z)) + && ItemLumberAxe.canAcceptCost(user)) { + for (int x1 = -1; x1 <= 1; x1++) { + for (int y1 = -1; y1 <= 1; y1++) { + for (int z1 = -1; z1 <= 1; z1++) { ForgeDirection FD = getFDFor(user); - int blockX = x+x1 + FD.offsetX; - int blockY = y+y1 + FD.offsetY; - int blockZ = z+z1 + FD.offsetZ; - - if(!(x1+FD.offsetX == 0 && y1+FD.offsetY == 0 && z1+FD.offsetZ == 0)) - { + int blockX = x + x1 + FD.offsetX; + int blockY = y + y1 + FD.offsetY; + int blockZ = z + z1 + FD.offsetZ; + + if (!(x1 + FD.offsetX == 0 && y1 + FD.offsetY == 0 && z1 + FD.offsetZ == 0)) { Block newblock = world.getBlock(blockX, blockY, blockZ); int m = world.getBlockMetadata(blockX, blockY, blockZ); - - if(newblock != null && user instanceof EntityPlayer && ForgeHooks.canHarvestBlock(newblock, (EntityPlayer) user, m) && ForgeHooks.isToolEffective(item, newblock, m)) - { - if((MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ)) ) { + + if (newblock != null && user instanceof EntityPlayer + && ForgeHooks.canHarvestBlock(newblock, (EntityPlayer) user, m) + && ForgeHooks.isToolEffective(item, newblock, m)) { + if ((MineFantasyII.isBukkitServer() + && BukkitUtils.cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ))) { continue; } - - if(rand.nextFloat()*100F < (100F - ConfigTools.hvyDropChance)) - { - newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, EnchantmentHelper.getFortuneModifier(user)); + + if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { + newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, + EnchantmentHelper.getFortuneModifier(user)); } world.setBlockToAir(blockX, blockY, blockZ); item.damageItem(1, user); ItemLumberAxe.tirePlayer(user, 1F); } } - } - } + } + } } } return super.onBlockDestroyed(item, world, block, x, y, z, user); } - - private ForgeDirection getFDFor(EntityLivingBase user) - { - return ForgeDirection.UNKNOWN;//TODO: FD + + private ForgeDirection getFDFor(EntityLivingBase user) { + return ForgeDirection.UNKNOWN;// TODO: FD } - - @Override - public ToolMaterial getMaterial() - { + + @Override + public ToolMaterial getMaterial() { return toolMaterial; } - //===================================================== CUSTOM START =============================================================\\ + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemHvyPick setCustom(String s) - { + + public ItemHvyPick setCustom(String s) { setCreativeTab(CreativeTabMF.tabOldTools); canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemHvyPick setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - private float efficiencyMod = 1.0F; - public ItemHvyPick setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemHvyPick setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemHvyPick setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } - private IIcon detailTex = null; + + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) * 2; } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 10); + } + + public float func_150893_a(ItemStack stack, Block block) { + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil + && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod/10); + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); } - public float func_150893_a(ItemStack stack, Block block) - { - return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod/2); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java index 0bc2b407..3d2238c7 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java @@ -40,56 +40,55 @@ /** * @author Anonymous Productions */ -public class ItemHvyShovel extends ItemSpade implements IToolMaterial -{ +public class ItemHvyShovel extends ItemSpade implements IToolMaterial { private String name; private float baseDamage = 2F; private Random rand = new Random(); - public ItemHvyShovel(String name, ToolMaterial material, int rarity) - { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name=name; - setTextureName("minefantasy2:Tool/Advanced/"+name); + + public ItemHvyShovel(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/Advanced/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); setMaxDamage(material.getMaxUses()); - } + } + @Override - public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user) - { - if(!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z)) && ItemLumberAxe.canAcceptCost(user)) - { + public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, + EntityLivingBase user) { + if (!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z)) + && ItemLumberAxe.canAcceptCost(user)) { int range = 2; - for(int x1 = -range; x1 <= range; x1 ++) - { - //for(int y1 = -1; y1 <= 1; y1 ++) + for (int x1 = -range; x1 <= range; x1++) { + // for(int y1 = -1; y1 <= 1; y1 ++) { - for(int z1 = -range; z1 <= range; z1 ++) - { - if(getDistance(x+x1, y, z+z1, x, y, z) <= range*1+0.5D) - { + for (int z1 = -range; z1 <= range; z1++) { + if (getDistance(x + x1, y, z + z1, x, y, z) <= range * 1 + 0.5D) { ForgeDirection FD = getFDFor(user); - int blockX = x+x1 + FD.offsetX; + int blockX = x + x1 + FD.offsetX; int blockY = y + FD.offsetY; - int blockZ = z+z1 + FD.offsetZ; - - if(!(x1+FD.offsetX == 0 && FD.offsetY == 0 && z1+FD.offsetZ == 0)) - { + int blockZ = z + z1 + FD.offsetZ; + + if (!(x1 + FD.offsetX == 0 && FD.offsetY == 0 && z1 + FD.offsetZ == 0)) { Block newblock = world.getBlock(blockX, blockY, blockZ); - Block above = world.getBlock(blockX, blockY+1, blockZ); + Block above = world.getBlock(blockX, blockY + 1, blockZ); int m = world.getBlockMetadata(blockX, blockY, blockZ); - - if((above == null || !above.getMaterial().isSolid()) && newblock != null && user instanceof EntityPlayer && ForgeHooks.canHarvestBlock(newblock, (EntityPlayer) user, m) && ForgeHooks.isToolEffective(item, newblock, m)) - { - if((MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ)) ) { + + if ((above == null || !above.getMaterial().isSolid()) && newblock != null + && user instanceof EntityPlayer + && ForgeHooks.canHarvestBlock(newblock, (EntityPlayer) user, m) + && ForgeHooks.isToolEffective(item, newblock, m)) { + if ((MineFantasyII.isBukkitServer() && BukkitUtils + .cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ))) { continue; } - - if(rand.nextFloat()*100F < (100F - ConfigTools.hvyDropChance)) - { - newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, EnchantmentHelper.getFortuneModifier(user)); + + if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { + newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, + EnchantmentHelper.getFortuneModifier(user)); } world.setBlockToAir(blockX, blockY, blockZ); item.damageItem(1, user); @@ -97,187 +96,180 @@ public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, } } } - } - } + } + } } } return super.onBlockDestroyed(item, world, block, x, y, z, user); } - - public double getDistance(double x, double y, double z, int posX, int posY, int posZ) - { - double var7 = posX - x; - double var9 = posY - y; - double var11 = posZ - z; - return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); - } - - private ForgeDirection getFDFor(EntityLivingBase user) - { - return ForgeDirection.UNKNOWN;//TODO: FD + + public double getDistance(double x, double y, double z, int posX, int posY, int posZ) { + double var7 = posX - x; + double var9 = posY - y; + double var11 = posZ - z; + return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); + } + + private ForgeDirection getFDFor(EntityLivingBase user) { + return ForgeDirection.UNKNOWN;// TODO: FD } - - @Override - public ToolMaterial getMaterial() - { + + @Override + public ToolMaterial getMaterial() { return toolMaterial; } - //===================================================== CUSTOM START =============================================================\\ + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemHvyShovel setCustom(String s) - { + + public ItemHvyShovel setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemHvyShovel setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - private float efficiencyMod = 1.0F; - public ItemHvyShovel setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemHvyShovel setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemHvyShovel setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } - private IIcon detailTex = null; + + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) * 2; } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 10); + } + + public float func_150893_a(ItemStack stack, Block block) { + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil + && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod/10); + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); } - public float func_150893_a(ItemStack stack, Block block) - { - return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod/2); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java index 3f556ed8..dea1d592 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java @@ -19,171 +19,145 @@ import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.util.ForgeDirection; -public class ItemLumberAxe extends ItemAxeMF implements IRackItem -{ +public class ItemLumberAxe extends ItemAxeMF implements IRackItem { private Random rand = new Random(); - public ItemLumberAxe(String name, ToolMaterial material, int rarity) - { + + public ItemLumberAxe(String name, ToolMaterial material, int rarity) { super(name, material, rarity); - this.setMaxDamage(getMaxDamage()*5); + this.setMaxDamage(getMaxDamage() * 5); } @Override - public float getScale(ItemStack itemstack) - { + public float getScale(ItemStack itemstack) { return 2.0F; } @Override - public float getOffsetX(ItemStack itemstack) - { + public float getOffsetX(ItemStack itemstack) { return 0; } @Override - public float getOffsetY(ItemStack itemstack) - { + public float getOffsetY(ItemStack itemstack) { return 0; } @Override - public float getOffsetZ(ItemStack itemstack) - { + public float getOffsetZ(ItemStack itemstack) { return 0; } @Override - public float getRotationOffset(ItemStack itemstack) - { + public float getRotationOffset(ItemStack itemstack) { return 0; } @Override - public boolean canHang(TileEntityRack rack, ItemStack item, int slot) - { + public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { return true; } @Override - public boolean isSpecialRender(ItemStack item) - { + public boolean isSpecialRender(ItemStack item) { return true; } - + @Override - public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user) - { - if(user instanceof EntityPlayer && canAcceptCost(user)) - { + public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, + EntityLivingBase user) { + if (user instanceof EntityPlayer && canAcceptCost(user)) { breakChain(world, x, y, z, item, block, user, 32, block, world.getBlockMetadata(x, y, z)); } return super.onBlockDestroyed(item, world, block, x, y, z, user); } - - private void breakChain(World world, int x, int y, int z, ItemStack item, Block block, EntityLivingBase user, int maxLogs, Block orient, int orientM) - { - if(maxLogs > 0 && isLog(world, x, y, z, orient, orientM)) - { - if(MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock((EntityPlayer)user, x, y, z)) { + + private void breakChain(World world, int x, int y, int z, ItemStack item, Block block, EntityLivingBase user, + int maxLogs, Block orient, int orientM) { + if (maxLogs > 0 && isLog(world, x, y, z, orient, orientM)) { + if (MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock((EntityPlayer) user, x, y, z)) { return; } - + Block newblock = world.getBlock(x, y, z); breakSurrounding(item, world, newblock, x, y, z, user); - if(rand.nextFloat()*100F < (100F - ConfigTools.hvyDropChance)) - { - newblock.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), EnchantmentHelper.getFortuneModifier(user)); + if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { + newblock.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), + EnchantmentHelper.getFortuneModifier(user)); } world.setBlockToAir(x, y, z); item.damageItem(1, user); - - maxLogs --; - for(int x1 = -1; x1 <= 1; x1 ++) - { - for(int y1 = -1; y1 <= 1; y1 ++) - { - for(int z1 = -1; z1 <= 1; z1 ++) - { - breakChain(world, x+x1, y+y1, z+z1, item, newblock, user, maxLogs, orient, orientM); + + maxLogs--; + for (int x1 = -1; x1 <= 1; x1++) { + for (int y1 = -1; y1 <= 1; y1++) { + for (int z1 = -1; z1 <= 1; z1++) { + breakChain(world, x + x1, y + y1, z + z1, item, newblock, user, maxLogs, orient, orientM); } } } - tirePlayer(user, 0.5F); + tirePlayer(user, 0.5F); } } - public static boolean canAcceptCost(EntityLivingBase user) - { + public static boolean canAcceptCost(EntityLivingBase user) { return canAcceptCost(user, 0.1F); } - public static boolean canAcceptCost(EntityLivingBase user, float cost) - { - if(user instanceof EntityPlayer && StaminaBar.isSystemActive) - { + + public static boolean canAcceptCost(EntityLivingBase user, float cost) { + if (user instanceof EntityPlayer && StaminaBar.isSystemActive) { return StaminaBar.isPercentStamAvailable(user, cost, true); } return true; } - - public static void tirePlayer(EntityLivingBase user, float points) - { - if(user instanceof EntityPlayer && StaminaBar.isSystemActive) - { - StaminaBar.modifyStaminaValue(user, -StaminaBar.getBaseDecayModifier(user, true, true)*points); - StaminaBar.ModifyIdleTime(user, 5F*points); + + public static void tirePlayer(EntityLivingBase user, float points) { + if (user instanceof EntityPlayer && StaminaBar.isSystemActive) { + StaminaBar.modifyStaminaValue(user, -StaminaBar.getBaseDecayModifier(user, true, true) * points); + StaminaBar.ModifyIdleTime(user, 5F * points); } } - private boolean isLog(World world, int x, int y, int z, Block orient, int orientM) - { + private boolean isLog(World world, int x, int y, int z, Block orient, int orientM) { Block block = world.getBlock(x, y, z); int meta = world.getBlockMetadata(x, y, z); - if(block != null) - { + if (block != null) { return block == orient && block.getMaterial() == Material.wood; } return false; } - public void breakSurrounding(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user) - { - if(!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z))) - { - for(int x1 = -2; x1 <= 2; x1 ++) - { - for(int y1 = -2; y1 <= 2; y1 ++) - { - for(int z1 = -2; z1 <= 2; z1 ++) - { + public void breakSurrounding(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user) { + if (!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z))) { + for (int x1 = -2; x1 <= 2; x1++) { + for (int y1 = -2; y1 <= 2; y1++) { + for (int z1 = -2; z1 <= 2; z1++) { ForgeDirection FD = getFDFor(user); - int blockX = x+x1 + FD.offsetX; - int blockY = y+y1 + FD.offsetY; - int blockZ = z+z1 + FD.offsetZ; - - if(!(x1+FD.offsetX == 0 && y1+FD.offsetY == 0 && z1+FD.offsetZ == 0)) - { + int blockX = x + x1 + FD.offsetX; + int blockY = y + y1 + FD.offsetY; + int blockZ = z + z1 + FD.offsetZ; + + if (!(x1 + FD.offsetX == 0 && y1 + FD.offsetY == 0 && z1 + FD.offsetZ == 0)) { Block newblock = world.getBlock(blockX, blockY, blockZ); int m = world.getBlockMetadata(blockX, blockY, blockZ); - - if(item.getItemDamage() < item.getMaxDamage() && newblock != null && user instanceof EntityPlayer && newblock.getMaterial() == Material.leaves) - { - if(rand.nextFloat()*100F < (100F - ConfigTools.hvyDropChance)) - { - newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, EnchantmentHelper.getFortuneModifier(user)); + + if (item.getItemDamage() < item.getMaxDamage() && newblock != null + && user instanceof EntityPlayer && newblock.getMaterial() == Material.leaves) { + if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { + newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, + EnchantmentHelper.getFortuneModifier(user)); } world.setBlockToAir(blockX, blockY, blockZ); item.damageItem(1, user); } } - } - } + } + } } } } - private ForgeDirection getFDFor(EntityLivingBase user) - { - return ForgeDirection.UNKNOWN;//TODO: FD + private ForgeDirection getFDFor(EntityLivingBase user) { + return ForgeDirection.UNKNOWN;// TODO: FD } } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemMattock.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemMattock.java index 8f916277..7e7415de 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemMattock.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemMattock.java @@ -36,236 +36,217 @@ /** * @author Anonymous Productions */ -public class ItemMattock extends ItemPickaxe implements IToolMaterial -{ +public class ItemMattock extends ItemPickaxe implements IToolMaterial { private String name; - public ItemMattock(String name, ToolMaterial material, int rarity) - { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - - setTextureName("minefantasy2:Tool/Advanced/"+name); + + public ItemMattock(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + + setTextureName("minefantasy2:Tool/Advanced/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setHarvestLevel("pickaxe", Math.max(0, material.getHarvestLevel()-2)); + this.setHarvestLevel("pickaxe", Math.max(0, material.getHarvestLevel() - 2)); this.setUnlocalizedName(name); this.name = name; - } - @Override - public ToolMaterial getMaterial() - { + } + + @Override + public ToolMaterial getMaterial() { return toolMaterial; } + @Override - public boolean canHarvestBlock(Block block, ItemStack stack) - { - return super.canHarvestBlock(block, stack) || Items.iron_shovel.canHarvestBlock(block, stack); - } + public boolean canHarvestBlock(Block block, ItemStack stack) { + return super.canHarvestBlock(block, stack) || Items.iron_shovel.canHarvestBlock(block, stack); + } + @Override - public boolean onItemUse(ItemStack mattock, EntityPlayer player, World world, int x, int y, int z, int facing, float pitch, float yaw, float pan) - { - if (!player.canPlayerEdit(x, y, z, facing, mattock)) - { - return false; - } - else - { - Block ground = world.getBlock(x, y, z); - int groundmeta = world.getBlockMetadata(x, y, z); - Block above = world.getBlock(x, y + 1, z); - int meta = ground == Blocks.sand ? 1 : 0; - - if (facing == 0 || above != Blocks.air) - { - return false; - } - else if(ground == Blocks.grass || ground == Blocks.dirt || ground == Blocks.sand) - { - Block var13 = BlockListMF.road; - if(ground == Blocks.grass) - { - ground = Blocks.dirt; - } - world.playSoundEffect((double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), "dig."+ground.stepSound.soundName, (var13.stepSound.getVolume() + 1.0F) / 2.0F, var13.stepSound.getPitch() * 0.8F); - - if (world.isRemote) - { - return true; - } - else - { - world.setBlock(x, y, z, var13, meta, 2); - - TileEntityRoad road = new TileEntityRoad(); - road.setWorldObj(world); - world.setTileEntity(x, y, z, road); - road.setSurface(ground, groundmeta); - mattock.damageItem(1, player); - return true; - } - } - else - { - return false; - } - } - } - - - //===================================================== CUSTOM START =============================================================\\ - private float baseDamage = 1.0F; - private boolean isCustom = false; - public ItemMattock setCustom(String s) - { - canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); - isCustom = true; - return this; - } - public ItemMattock setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - private float efficiencyMod = 1.0F; - public ItemMattock setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) - { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + public boolean onItemUse(ItemStack mattock, EntityPlayer player, World world, int x, int y, int z, int facing, + float pitch, float yaw, float pan) { + if (!player.canPlayerEdit(x, y, z, facing, mattock)) { + return false; + } else { + Block ground = world.getBlock(x, y, z); + int groundmeta = world.getBlockMetadata(x, y, z); + Block above = world.getBlock(x, y + 1, z); + int meta = ground == Blocks.sand ? 1 : 0; + + if (facing == 0 || above != Blocks.air) { + return false; + } else if (ground == Blocks.grass || ground == Blocks.dirt || ground == Blocks.sand) { + Block var13 = BlockListMF.road; + if (ground == Blocks.grass) { + ground = Blocks.dirt; + } + world.playSoundEffect(x + 0.5F, y + 0.5F, z + 0.5F, "dig." + ground.stepSound.soundName, + (var13.stepSound.getVolume() + 1.0F) / 2.0F, var13.stepSound.getPitch() * 0.8F); + + if (world.isRemote) { + return true; + } else { + world.setBlock(x, y, z, var13, meta, 2); + + TileEntityRoad road = new TileEntityRoad(); + road.setWorldObj(world); + world.setTileEntity(x, y, z, road); + road.setSurface(ground, groundmeta); + mattock.damageItem(1, player); + return true; + } + } else { + return false; + } } - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + // ===================================================== CUSTOM START + // =============================================================\\ + private float baseDamage = 1.0F; + private boolean isCustom = false; + + public ItemMattock setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemMattock setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemMattock setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + private IIcon detailTex = null; + private IIcon haftTex = null; + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; } - private IIcon detailTex = null; - private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; } - public ItemStack construct(String main, String haft) - { - return CustomToolHelper.construct(this, main, haft); + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + protected int itemRarity; + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); } - protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java index 909184ea..d3c87788 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java @@ -41,76 +41,68 @@ /** * @author Anonymous Productions */ -public class ItemScythe extends Item implements IToolMaterial, IDamageType, IRackItem -{ +public class ItemScythe extends Item implements IToolMaterial, IDamageType, IRackItem { private Random rand = new Random(); private ToolMaterial toolMaterial; private String name; + /** */ - public ItemScythe(String name, ToolMaterial material, int rarity) - { - this.toolMaterial = material; - this.setFull3D(); - itemRarity = rarity; - this.name=name; - setCreativeTab(CreativeTabMF.tabOldTools); - setTextureName("minefantasy2:Tool/Advanced/"+name); + public ItemScythe(String name, ToolMaterial material, int rarity) { + this.toolMaterial = material; + this.setFull3D(); + itemRarity = rarity; + this.name = name; + setCreativeTab(CreativeTabMF.tabOldTools); + setTextureName("minefantasy2:Tool/Advanced/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); this.maxStackSize = 1; - this.setMaxDamage(material.getMaxUses()); - } - + this.setMaxDamage(material.getMaxUses()); + } + private float baseDamage = 3.0F; - - @Override - public ToolMaterial getMaterial() - { + + @Override + public ToolMaterial getMaterial() { return toolMaterial; } - - private boolean cutGrass(World world, int x, int y, int z, int r, EntityPlayer entity, boolean leaf) - { - boolean flag = false; - ItemStack item = entity.getHeldItem(); - if(item == null)return false; - - for(int x2 = -r; x2 <= r; x2 ++) - { - for(int y2 = -r; y2 <= r; y2 ++) - { - for(int z2 = -r; z2 <= r; z2 ++) - { - Block block = world.getBlock(x+x2, y+y2, z+z2); - int meta = world.getBlockMetadata(x+x2, y+y2, z+z2); - if(block != null) - { + + private boolean cutGrass(World world, int x, int y, int z, int r, EntityPlayer entity, boolean leaf) { + boolean flag = false; + ItemStack item = entity.getHeldItem(); + if (item == null) + return false; + + for (int x2 = -r; x2 <= r; x2++) { + for (int y2 = -r; y2 <= r; y2++) { + for (int z2 = -r; z2 <= r; z2++) { + Block block = world.getBlock(x + x2, y + y2, z + z2); + int meta = world.getBlockMetadata(x + x2, y + y2, z + z2); + if (block != null) { Material m = block.getMaterial(); - if(canCutMaterial(m, block.getBlockHardness(world, x+x2, y+y2, z+z2), leaf)) - { - if((MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock(entity, x+x2, y+y2, z+z2)) ) { + if (canCutMaterial(m, block.getBlockHardness(world, x + x2, y + y2, z + z2), leaf)) { + if ((MineFantasyII.isBukkitServer() + && BukkitUtils.cantBreakBlock(entity, x + x2, y + y2, z + z2))) { continue; } - - if(getDistance(x+x2, y+y2, z+z2, x, y, z) < r*1) - { + + if (getDistance(x + x2, y + y2, z + z2, x, y, z) < r * 1) { flag = true; - - ArrayList items = block.getDrops(world, x+x2, y+y2, z+z2, meta, 0); - world.setBlockToAir(x+x2, y+y2, z+z2); - world.playAuxSFXAtEntity(entity, 2001, x+x2, y+y2, z+z2, Block.getIdFromBlock(block) + (world.getBlockMetadata(x+x2, y+y2, z+z2) << 16)); - tryBreakFarmland(world, x+x2, y+y2-1, z+z2); - if(!entity.capabilities.isCreativeMode) - { + + ArrayList items = block.getDrops(world, x + x2, y + y2, z + z2, meta, 0); + world.setBlockToAir(x + x2, y + y2, z + z2); + world.playAuxSFXAtEntity(entity, 2001, x + x2, y + y2, z + z2, + Block.getIdFromBlock(block) + + (world.getBlockMetadata(x + x2, y + y2, z + z2) << 16)); + tryBreakFarmland(world, x + x2, y + y2 - 1, z + z2); + if (!entity.capabilities.isCreativeMode) { ItemLumberAxe.tirePlayer(entity, 1F); - for (ItemStack drop : items) - { - if (world.rand.nextFloat() <= 1.0F) - { - dropBlockAsItem_do(world, x+x2, y+y2, z+z2, drop); - } - } + for (ItemStack drop : items) { + if (world.rand.nextFloat() <= 1.0F) { + dropBlockAsItem_do(world, x + x2, y + y2, z + z2, drop); + } + } } item.damageItem(1, entity); } @@ -121,256 +113,226 @@ private boolean cutGrass(World world, int x, int y, int z, int r, EntityPlayer e } return flag; } - - private void tryBreakFarmland(World world, int x, int y, int z) - { + + private void tryBreakFarmland(World world, int x, int y, int z) { Block base = world.getBlock(x, y, z); - - if(base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(world, true)) - { + + if (base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(world, true)) { world.setBlock(x, y, z, Blocks.dirt); } } - protected void dropBlockAsItem_do(World world, int x, int y, int z, ItemStack drop) - { - if (!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) - { - float var6 = 0.7F; - double var7 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; - double var9 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; - double var11 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; - EntityItem var13 = new EntityItem(world, x + var7, y + var9, z + var11, drop); - var13.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(var13); - } - } - - private boolean canCutMaterial(Material m, float str, boolean leaf) - { - if(!leaf) - { - if(str <= 0.0F) - { - return - m == Material.vine - || m == Material.plants - || m == Material.grass - ;} - else return false; - } - return m == Material.leaves || m == Material.vine; - } - - public double getDistance(double x, double y, double z, int posX, int posY, int posZ) - { - double var7 = posX - x; - double var9 = posY - y; - double var11 = posZ - z; - return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); - } - + protected void dropBlockAsItem_do(World world, int x, int y, int z, ItemStack drop) { + if (!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) { + float var6 = 0.7F; + double var7 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; + double var9 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; + double var11 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; + EntityItem var13 = new EntityItem(world, x + var7, y + var9, z + var11, drop); + var13.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(var13); + } + } + + private boolean canCutMaterial(Material m, float str, boolean leaf) { + if (!leaf) { + if (str <= 0.0F) { + return m == Material.vine || m == Material.plants || m == Material.grass; + } else + return false; + } + return m == Material.leaves || m == Material.vine; + } + + public double getDistance(double x, double y, double z, int posX, int posY, int posZ) { + double var7 = posX - x; + double var9 = posY - y; + double var11 = posZ - z; + return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); + } + @Override - public boolean onItemUse(ItemStack hoe, EntityPlayer player, World world, int x, int y, int z, int facing, float pitch, float yaw, float pan) - { - if (!player.canPlayerEdit(x, y, z, facing, hoe) || !ItemLumberAxe.canAcceptCost(player)) - { - return false; - } - else - { - Block block = world.getBlock(x, y, z); - - if(block != null) - { - Material m = block.getMaterial(); - float hard = block.getBlockHardness(world, x, y, z); - if(this.canCutMaterial(m, hard, false)) - { - if(cutGrass(world, x, y, z, 5, player, false)) - { - player.swingItem(); - } - } - else - if(this.canCutMaterial(m, hard, true)) - { - if(cutGrass(world, x, y, z, 3, player, true)) - { - player.swingItem(); - } - } - } - } - return false; - } + public boolean onItemUse(ItemStack hoe, EntityPlayer player, World world, int x, int y, int z, int facing, + float pitch, float yaw, float pan) { + if (!player.canPlayerEdit(x, y, z, facing, hoe) || !ItemLumberAxe.canAcceptCost(player)) { + return false; + } else { + Block block = world.getBlock(x, y, z); + + if (block != null) { + Material m = block.getMaterial(); + float hard = block.getBlockHardness(world, x, y, z); + if (this.canCutMaterial(m, hard, false)) { + if (cutGrass(world, x, y, z, 5, player, false)) { + player.swingItem(); + } + } else if (this.canCutMaterial(m, hard, true)) { + if (cutGrass(world, x, y, z, 3, player, true)) { + player.swingItem(); + } + } + } + } + return false; + } @Override - public float[] getDamageRatio(Object... implement) - { - return new float[]{1,0, 2}; + public float[] getDamageRatio(Object... implement) { + return new float[] { 1, 0, 2 }; } + @Override - public float getPenetrationLevel(Object implement) - { + public float getPenetrationLevel(Object implement) { return 0F; } - - - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemScythe setCustom(String s) - { + + public ItemScythe setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemScythe setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - private float efficiencyMod = 1.0F; - public ItemScythe setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemScythe setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemScythe setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } - private IIcon detailTex = null; + + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); - } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ @Override public float getScale(ItemStack itemstack) { @@ -384,22 +346,21 @@ public float getOffsetX(ItemStack itemstack) { @Override public float getOffsetY(ItemStack itemstack) { - return 5F/16F; + return 5F / 16F; } @Override public float getOffsetZ(ItemStack itemstack) { return 0; } - + @Override public float getRotationOffset(ItemStack itemstack) { return 0; } @Override - public boolean canHang(TileEntityRack rack, ItemStack item, int slot) - { + public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { return rack.hasRackBelow(slot); } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemTrowMF.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemTrowMF.java index d929bb5a..fa41bb4d 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemTrowMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemTrowMF.java @@ -5,6 +5,12 @@ import java.util.List; import java.util.Random; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; @@ -25,258 +31,240 @@ import net.minecraft.init.Items; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; -import net.minecraft.item.Item.ToolMaterial; import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - /** * @author Anonymous Productions */ -public class ItemTrowMF extends ItemSpade implements IToolMaterial -{ +public class ItemTrowMF extends ItemSpade implements IToolMaterial { private String name; private float baseDamage = 1F; private Random rand = new Random(); - public ItemTrowMF(String name, ToolMaterial material, int rarity) - { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name=name; - setTextureName("minefantasy2:Tool/Advanced/"+name); + + public ItemTrowMF(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/Advanced/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); setMaxDamage(material.getMaxUses()); - } + } + @Override - public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user) - { + public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, + EntityLivingBase user) { int m = world.getBlockMetadata(x, y, z); alwaysDropFlint(block, item, world, user, x, y, z); - - if(!world.isRemote) - { - int meta = world.getBlockMetadata(x, y, z); - int harvestlvl = this.getMaterial().getHarvestLevel(); - int fortune = EnchantmentHelper.getFortuneModifier(user); - boolean silk = EnchantmentHelper.getSilkTouchModifier(user); - - ArrayListspecialdrops = RandomDigs.getDroppedItems(block, meta, harvestlvl, fortune, silk, y); - - if(specialdrops != null && !specialdrops.isEmpty()) - { - Iterator list = specialdrops.iterator(); - - while(list.hasNext()) - { - ItemStack newdrop = (ItemStack)list.next(); - - if(newdrop != null) - { - if(newdrop.stackSize < 1)newdrop.stackSize = 1; - - dropItem(world, x, y, z, newdrop); - } - } - } + + if (!world.isRemote) { + int meta = world.getBlockMetadata(x, y, z); + int harvestlvl = this.getMaterial().getHarvestLevel(); + int fortune = EnchantmentHelper.getFortuneModifier(user); + boolean silk = EnchantmentHelper.getSilkTouchModifier(user); + + ArrayList specialdrops = RandomDigs.getDroppedItems(block, meta, harvestlvl, fortune, silk, y); + + if (specialdrops != null && !specialdrops.isEmpty()) { + Iterator list = specialdrops.iterator(); + + while (list.hasNext()) { + ItemStack newdrop = (ItemStack) list.next(); + + if (newdrop != null) { + if (newdrop.stackSize < 1) + newdrop.stackSize = 1; + + dropItem(world, x, y, z, newdrop); + } + } + } } return super.onBlockDestroyed(item, world, block, x, y, z, user); } - - private void alwaysDropFlint(Block block, ItemStack item, World world, EntityLivingBase user, int x, int y, int z) - { - if(block == Blocks.gravel) - { + + private void alwaysDropFlint(Block block, ItemStack item, World world, EntityLivingBase user, int x, int y, int z) { + if (block == Blocks.gravel) { world.setBlockToAir(x, y, z); int loot = 0; int enc = EnchantmentHelper.getFortuneModifier(user); - if(enc > 0) - { + if (enc > 0) { loot = rand.nextInt(enc); } dropItem(world, x, y, z, new ItemStack(Items.flint, 1 + loot)); } } - private void dropItem(World world, int x, int y, int z, ItemStack drop) - { - if(world.isRemote)return; - - EntityItem dropItem = new EntityItem(world, x+0.5D, y+0.5D, z+0.5D, drop); + + private void dropItem(World world, int x, int y, int z, ItemStack drop) { + if (world.isRemote) + return; + + EntityItem dropItem = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, drop); dropItem.delayBeforeCanPickup = 10; world.spawnEntityInWorld(dropItem); } - - @Override - public ToolMaterial getMaterial() - { + + @Override + public ToolMaterial getMaterial() { return toolMaterial; } - //===================================================== CUSTOM START =============================================================\\ + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemTrowMF setCustom(String s) - { + + public ItemTrowMF setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemTrowMF setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - private float efficiencyMod = 1.0F; - public ItemTrowMF setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemTrowMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemTrowMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } - private IIcon detailTex = null; + + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) / 2; } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 2); } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod/2); + + public float func_150893_a(ItemStack stack, Block block) { + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil + && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); } - public float func_150893_a(ItemStack stack, Block block) - { - return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod/2); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemBasicCraftTool.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemBasicCraftTool.java index 5b3a4098..bf793d26 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemBasicCraftTool.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemBasicCraftTool.java @@ -1,18 +1,18 @@ package minefantasy.mf2.item.tool.crafting; -import java.util.ArrayList; -import java.util.Iterator; import java.util.List; +import com.google.common.collect.Sets; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.ToolHelper; -import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.api.tool.IToolMF; import minefantasy.mf2.api.weapon.IDamageType; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.ToolListMF; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -21,137 +21,119 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; -import com.google.common.collect.Sets; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - /** * @author Anonymous Productions */ -public class ItemBasicCraftTool extends ItemTool implements IToolMaterial, IToolMF, IDamageType -{ +public class ItemBasicCraftTool extends ItemTool implements IToolMaterial, IToolMF, IDamageType { private int tier; private String name; private String toolType; - public ItemBasicCraftTool(String name, String type, int tier, int uses) - { - super(1.0F, ToolMaterial.WOOD, Sets.newHashSet(new Block[] {})); - this.tier = tier; - setCreativeTab(CreativeTabMF.tabCraftTool); - - this.name=name; - toolType = type; - setTextureName("minefantasy2:Tool/Crafting/"+name); + + public ItemBasicCraftTool(String name, String type, int tier, int uses) { + super(1.0F, ToolMaterial.WOOD, Sets.newHashSet(new Block[] {})); + this.tier = tier; + setCreativeTab(CreativeTabMF.tabCraftTool); + + this.name = name; + toolType = type; + setTextureName("minefantasy2:Tool/Crafting/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); setMaxDamage(uses); this.setMaxStackSize(1); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - + } + @Override - public ToolMaterial getMaterial() - { + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public ToolMaterial getMaterial() { return toolMaterial; } - + @Override - public String getToolType(ItemStack item) - { + public String getToolType(ItemStack item) { return toolType; } - @Override - public float[] getDamageRatio(Object... implement) - { - return new float[]{0,1, 0}; - } - - private void addSet(List list, Item[] items) - { - for(Item item:items) - { + public float[] getDamageRatio(Object... implement) { + return new float[] { 0, 1, 0 }; + } + + private void addSet(List list, Item[] items) { + for (Item item : items) { list.add(new ItemStack(item)); } } + @Override - public float getPenetrationLevel(Object implement) - { + public float getPenetrationLevel(Object implement) { return 0F; } - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemBasicCraftTool setCustom(String s) - { + + public ItemBasicCraftTool setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemStack construct(String main) - { + + public ItemStack construct(String main) { return CustomToolHelper.construct(this, main); } - + @Override - public int getMaxDamage(ItemStack stack) - { + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - + @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { list.add(this.construct("OakWood")); list.add(this.construct("IronbarkWood")); list.add(this.construct("EbonyWood")); - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - super.addInformation(item, user, list, extra); - } - - private float efficiencyMod = 1.0F; + } else { + super.getSubItems(item, tab, list); + } + } + @Override - public float getEfficiency(ItemStack item) - { + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + super.addInformation(item, user, list, extra); + } + + private float efficiencyMod = 1.0F; + + @Override + public float getEfficiency(ItemStack item) { return CustomToolHelper.getEfficiencyForHds(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); } @Override - public int getTier(ItemStack item) - { + public int getTier(ItemStack item) { return CustomToolHelper.getCrafterTier(item, tier); } + @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); } } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEAnvilTools.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEAnvilTools.java index 0b88399d..8d7ac2e7 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEAnvilTools.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEAnvilTools.java @@ -1,50 +1,34 @@ package minefantasy.mf2.item.tool.crafting; -import java.util.List; - +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.ToolHelper; -import minefantasy.mf2.api.tier.IToolMaterial; -import minefantasy.mf2.api.tool.IToolMF; -import minefantasy.mf2.api.weapon.IDamageType; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.item.tool.ToolMaterialMF; -import net.minecraft.block.Block; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemTool; - -import com.google.common.collect.Sets; - -import cpw.mods.fml.common.registry.GameRegistry; /** * @author Anonymous Productions */ -public class ItemEAnvilTools extends Item -{ - public ItemEAnvilTools(String name, int uses) - { - setCreativeTab(CreativeTabMF.tabCraftTool); - - setTextureName("minefantasy2:Tool/Crafting/Engineer/"+name); +public class ItemEAnvilTools extends Item { + public ItemEAnvilTools(String name, int uses) { + setCreativeTab(CreativeTabMF.tabCraftTool); + + setTextureName("minefantasy2:Tool/Crafting/Engineer/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); this.setMaxDamage(uses); setMaxStackSize(1); - } - @Override - public ItemStack getContainerItem(ItemStack item) - { - item.setItemDamage(item.getItemDamage()+1); - return item.getItemDamage() >= item.getMaxDamage() ? null : item; - } - @Override - public int getMaxDamage(ItemStack stack) - { + } + + @Override + public ItemStack getContainerItem(ItemStack item) { + item.setItemDamage(item.getItemDamage() + 1); + return item.getItemDamage() >= item.getMaxDamage() ? null : item; + } + + @Override + public int getMaxDamage(ItemStack stack) { return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); } } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEngineerTool.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEngineerTool.java index 9d87bac2..b60bf373 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEngineerTool.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEngineerTool.java @@ -1,7 +1,8 @@ package minefantasy.mf2.item.tool.crafting; -import java.util.List; +import com.google.common.collect.Sets; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.tier.IToolMaterial; @@ -9,100 +10,82 @@ import minefantasy.mf2.api.weapon.IDamageType; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.item.tool.ToolMaterialMF; import net.minecraft.block.Block; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; -import com.google.common.collect.Sets; - -import cpw.mods.fml.common.registry.GameRegistry; - /** * @author Anonymous Productions */ -public class ItemEngineerTool extends ItemTool implements IToolMaterial, IToolMF, IDamageType -{ +public class ItemEngineerTool extends ItemTool implements IToolMaterial, IToolMF, IDamageType { private ToolMaterial material; private int tier; private String toolType; - - public ItemEngineerTool(String name, ToolMaterial material, int tier, String toolType, int rarity) - { - super(1.0F, material, Sets.newHashSet(new Block[] {})); - this.toolType=toolType; - this.material = material; - this.tier = tier; - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabCraftTool); - - setTextureName("minefantasy2:Tool/Crafting/Engineer/"+name); + + public ItemEngineerTool(String name, ToolMaterial material, int tier, String toolType, int rarity) { + super(1.0F, material, Sets.newHashSet(new Block[] {})); + this.toolType = toolType; + this.material = material; + this.tier = tier; + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabCraftTool); + + setTextureName("minefantasy2:Tool/Crafting/Engineer/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } - private int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - int lvl = itemRarity+1; - - if(item.isItemEnchanted()) - { - if(lvl == 0) - { + } + + private int itemRarity; + + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = itemRarity + 1; + + if (item.isItemEnchanted()) { + if (lvl == 0) { lvl++; } - lvl ++; + lvl++; } - if(lvl >= ToolListMF.rarity.length) - { - lvl = ToolListMF.rarity.length-1; + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; } return ToolListMF.rarity[lvl]; } - + @Override - public ToolMaterial getMaterial() - { + public ToolMaterial getMaterial() { return toolMaterial; } - + @Override - public float getEfficiency(ItemStack item) - { + public float getEfficiency(ItemStack item) { return ToolHelper.modifyDigOnQuality(item, material.getEfficiencyOnProperMaterial()); } @Override - public int getTier(ItemStack item) - { + public int getTier(ItemStack item) { return tier; } @Override - public String getToolType(ItemStack item) - { + public String getToolType(ItemStack item) { return toolType; } - + @Override - public int getMaxDamage(ItemStack stack) - { + public int getMaxDamage(ItemStack stack) { return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); } @Override - public float[] getDamageRatio(Object... implement) - { - return new float[]{0,1, 0}; + public float[] getDamageRatio(Object... implement) { + return new float[] { 0, 1, 0 }; } @Override - public float getPenetrationLevel(Object implement) - { + public float getPenetrationLevel(Object implement) { return 0F; } } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemHammer.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemHammer.java index 6a5e9007..dd29d2ee 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemHammer.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemHammer.java @@ -4,17 +4,20 @@ import java.util.Iterator; import java.util.List; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.api.tool.IToolMF; import minefantasy.mf2.api.weapon.IDamageType; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.item.tool.ItemAxeMF; -import minefantasy.mf2.item.tool.ToolMaterialMF; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -28,243 +31,217 @@ import net.minecraft.util.IIcon; import net.minecraftforge.common.ForgeHooks; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - /** * @author Anonymous Productions */ -public class ItemHammer extends ItemTool implements IToolMaterial, IToolMF, IDamageType -{ +public class ItemHammer extends ItemTool implements IToolMaterial, IToolMF, IDamageType { private ToolMaterial material; private int tier; private boolean heavy; private float baseDamage; private String name; - public ItemHammer(String name, ToolMaterial material, boolean heavy, int rarity, int tier) - { - super(heavy ? 3.0F:2.0F, material, Sets.newHashSet(new Block[] {})); - this.heavy = heavy; - this.material = material; - this.name = name; - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.setMaxDamage(material.getMaxUses() *2); - this.tier = tier; - setTextureName("minefantasy2:Tool/Crafting/"+name); + + public ItemHammer(String name, ToolMaterial material, boolean heavy, int rarity, int tier) { + super(heavy ? 3.0F : 2.0F, material, Sets.newHashSet(new Block[] {})); + this.heavy = heavy; + this.material = material; + this.name = name; + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.setMaxDamage(material.getMaxUses() * 2); + this.tier = tier; + setTextureName("minefantasy2:Tool/Crafting/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } + } + @Override - public ToolMaterial getMaterial() - { + public ToolMaterial getMaterial() { return toolMaterial; } - + @Override - public String getToolType(ItemStack item) - { + public String getToolType(ItemStack item) { return heavy ? "hvyHammer" : "hammer"; } - @Override - public float[] getDamageRatio(Object... implement) - { - return new float[]{0,1, 0}; + public float[] getDamageRatio(Object... implement) { + return new float[] { 0, 1, 0 }; } - - private void addSet(List list, Item[] items) - { - for(Item item:items) - { + private void addSet(List list, Item[] items) { + for (Item item : items) { list.add(new ItemStack(item)); } } + @Override - public float getPenetrationLevel(Object implement) - { + public float getPenetrationLevel(Object implement) { return 0F; } - - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemHammer setCustom(String s) - { + + public ItemHammer setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemHammer setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - - - private float efficiencyMod = 1.0F; - public ItemHammer setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemHammer setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemHammer setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } - private IIcon detailTex = null; + + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); } - @Override - public float getEfficiency(ItemStack item) - { + + @Override + public float getEfficiency(ItemStack item) { return CustomToolHelper.getEfficiency(item, material.getEfficiencyOnProperMaterial(), efficiencyMod); } + @Override - public int getTier(ItemStack item) - { + public int getTier(ItemStack item) { return CustomToolHelper.getCrafterTier(item, tier); } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); } - public float func_150893_a(ItemStack stack, Block block) - { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java index 477cf5fe..169f3b9f 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java @@ -5,14 +5,17 @@ import java.util.List; import java.util.Random; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tool.IHuntingItem; import minefantasy.mf2.api.tool.IToolMF; import minefantasy.mf2.api.weapon.WeaponClass; -import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.weapon.ItemWeaponMF; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; @@ -27,245 +30,222 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - /** * @author Anonymous Productions */ -public class ItemKnifeMF extends ItemWeaponMF implements IToolMF, IHuntingItem -{ +public class ItemKnifeMF extends ItemWeaponMF implements IToolMF, IHuntingItem { private Random rand = new Random(); private int tier; private float baseDamage; + /** * Knives are weapons used for hunting, and tools used for processing */ - public ItemKnifeMF(String name, ToolMaterial material, int rarity, float weight, int tier) - { - super(material, name, rarity, weight); - this.tier = tier; - setTextureName("minefantasy2:Tool/Crafting/"+name); - } - + public ItemKnifeMF(String name, ToolMaterial material, int rarity, float weight, int tier) { + super(material, name, rarity, weight); + this.tier = tier; + setTextureName("minefantasy2:Tool/Crafting/" + name); + } + @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) - { + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { return item; } @Override - public boolean canRetrieveDrops(ItemStack item) - { + public boolean canRetrieveDrops(ItemStack item) { return true; } @Override - public String getToolType(ItemStack item) - { + public String getToolType(ItemStack item) { return "knife"; } - + @Override - public boolean canBlock() - { + public boolean canBlock() { return false; } + /** * Determines if the weapon can parry */ @Override - public boolean canWeaponParry() - { + public boolean canWeaponParry() { return false; } - + @Override - protected float getStaminaMod() - { + protected float getStaminaMod() { return 0.5F; } + @Override - public WeaponClass getWeaponClass() - { + public WeaponClass getWeaponClass() { return null; } - //===================================================== CUSTOM START =============================================================\\ + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemKnifeMF setCustom(String s) - { + + public ItemKnifeMF setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemKnifeMF setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } + + public ItemKnifeMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + @Override - public float getEfficiency(ItemStack item) - { + public float getEfficiency(ItemStack item) { return CustomToolHelper.getEfficiency(item, material.getEfficiencyOnProperMaterial(), efficiencyMod); } + @Override - public int getTier(ItemStack item) - { + public int getTier(ItemStack item) { return CustomToolHelper.getCrafterTier(item, tier); } - - private float efficiencyMod = 1.0F; - public ItemKnifeMF setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + private float efficiencyMod = 1.0F; + + public ItemKnifeMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, material.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, material.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } - private IIcon detailTex = null; + + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); } - - public float func_150893_a(ItemStack stack, Block block) - { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base : CustomToolHelper.getEfficiency(stack, material.getEfficiencyOnProperMaterial(), efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, material.getEfficiencyOnProperMaterial(), efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemNeedle.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemNeedle.java index 08fa025f..931cc966 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemNeedle.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemNeedle.java @@ -4,6 +4,13 @@ import java.util.Iterator; import java.util.List; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; @@ -22,178 +29,160 @@ import net.minecraft.item.ItemTool; import net.minecraft.util.IIcon; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - /** * @author Anonymous Productions */ -public class ItemNeedle extends ItemTool implements IToolMaterial, IToolMF -{ +public class ItemNeedle extends ItemTool implements IToolMaterial, IToolMF { private ToolMaterial material; private int tier; private float baseDamage; private String name; - - public ItemNeedle(String name, ToolMaterial material, int rarity, int tier) - { - super(0F, material, Sets.newHashSet(new Block[] {})); - this.material = material; - this.name = name; - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.tier=tier; - setTextureName("minefantasy2:Tool/Crafting/"+name); + + public ItemNeedle(String name, ToolMaterial material, int rarity, int tier) { + super(0F, material, Sets.newHashSet(new Block[] {})); + this.material = material; + this.name = name; + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.tier = tier; + setTextureName("minefantasy2:Tool/Crafting/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } - - @Override - public Multimap getItemAttributeModifiers() - { + } + + @Override + public Multimap getItemAttributeModifiers() { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", 0.5D, 0)); - - return map; - } - - //===================================================== CUSTOM START =============================================================\\ - private boolean isCustom = false; - public ItemNeedle setCustom(String s) - { - canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); - isCustom = true; - return this; - } - private float efficiencyMod = 1.0F; - public ItemNeedle setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - private IIcon detailTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass > 0 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - public ItemStack construct(String main) - { - return CustomToolHelper.construct(this, main, null); - } - protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name)); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - public float getEfficiency(ItemStack item) - { - return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); - } - - @Override - public int getTier(ItemStack item) - { - return CustomToolHelper.getCrafterTier(item, tier); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ - @Override - public String getToolType(ItemStack item) - { - return "needle"; - } - - @Override - public ToolMaterial getMaterial() - { - return toolMaterial; - } + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", 0.5D, 0)); + + return map; + } + + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + + public ItemNeedle setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemNeedle setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + private IIcon detailTex = null; + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass > 0 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main) { + return CustomToolHelper.construct(this, main, null); + } + + protected int itemRarity; + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name)); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + public float getEfficiency(ItemStack item) { + return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); + } + + @Override + public int getTier(ItemStack item) { + return CustomToolHelper.getCrafterTier(item, tier); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + // ====================================================== CUSTOM END + // ==============================================================\\ + @Override + public String getToolType(ItemStack item) { + return "needle"; + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java index ee028183..d11b3514 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java @@ -19,107 +19,104 @@ /** * @author Anonymous Productions */ -public class ItemPaintBrush extends ItemBasicCraftTool implements IRackItem -{ - public ItemPaintBrush(String name, int uses) - { - super(name, "brush", 0, uses); - setCreativeTab(CreativeTabMF.tabCraftTool); - - //setTextureName("minefantasy2:Tool/Crafting/"+name); - //this.setUnlocalizedName(name); - //this.setMaxDamage(uses); - //setMaxStackSize(1); +public class ItemPaintBrush extends ItemBasicCraftTool implements IRackItem { + public ItemPaintBrush(String name, int uses) { + super(name, "brush", 0, uses); + setCreativeTab(CreativeTabMF.tabCraftTool); + + // setTextureName("minefantasy2:Tool/Crafting/"+name); + // this.setUnlocalizedName(name); + // this.setMaxDamage(uses); + // setMaxStackSize(1); this.setFull3D(); - } - @Override - public ItemStack getContainerItem(ItemStack item) - { - item.setItemDamage(item.getItemDamage()+1); - return item.getItemDamage() >= item.getMaxDamage() ? null : item; - } - @Override - public int getMaxDamage(ItemStack stack) - { + } + + @Override + public ItemStack getContainerItem(ItemStack item) { + item.setItemDamage(item.getItemDamage() + 1); + return item.getItemDamage() >= item.getMaxDamage() ? null : item; + } + + @Override + public int getMaxDamage(ItemStack stack) { return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); } - - private boolean onUsedWithBlock(World world, int x, int y, int z, Block block, ItemStack item, EntityPlayer user) - { - Block newBlock = null; - int meta = world.getBlockMetadata(x, y, z); - ItemStack output = PaintOilRecipe.getPaintResult(new ItemStack(block, 1, meta)); - if(output != null && output.getItem() instanceof ItemBlock) - { - newBlock = Block.getBlockFromItem(output.getItem()); - if(output.getItemDamage() != OreDictionary.WILDCARD_VALUE) - { - meta = output.getItemDamage(); - } - } - if(newBlock != null) - { - world.playAuxSFXAtEntity(user, 2001, x, y, z, Block.getIdFromBlock(newBlock) + (meta << 12)); - - user.inventory.consumeInventoryItem(ComponentListMF.plant_oil); - ItemStack jug = new ItemStack(FoodListMF.jug_empty); - - if(!user.inventory.addItemStackToInventory(jug) && !world.isRemote) - { - user.entityDropItem(jug, 0F); - } - if(world.isRemote)return true; - - SkillList.construction.addXP(user, 1); - item.damageItem(1, user); - world.setBlock(x, y, z, newBlock); - world.setBlockMetadataWithNotify(x, y, z, meta, 2); - } + + private boolean onUsedWithBlock(World world, int x, int y, int z, Block block, ItemStack item, EntityPlayer user) { + Block newBlock = null; + int meta = world.getBlockMetadata(x, y, z); + ItemStack output = PaintOilRecipe.getPaintResult(new ItemStack(block, 1, meta)); + if (output != null && output.getItem() instanceof ItemBlock) { + newBlock = Block.getBlockFromItem(output.getItem()); + if (output.getItemDamage() != OreDictionary.WILDCARD_VALUE) { + meta = output.getItemDamage(); + } + } + if (newBlock != null) { + world.playAuxSFXAtEntity(user, 2001, x, y, z, Block.getIdFromBlock(newBlock) + (meta << 12)); + + user.inventory.consumeInventoryItem(ComponentListMF.plant_oil); + ItemStack jug = new ItemStack(FoodListMF.jug_empty); + + if (!user.inventory.addItemStackToInventory(jug) && !world.isRemote) { + user.entityDropItem(jug, 0F); + } + if (world.isRemote) + return true; + + SkillList.construction.addXP(user, 1); + item.damageItem(1, user); + world.setBlock(x, y, z, newBlock); + world.setBlockMetadataWithNotify(x, y, z, meta, 2); + } + return false; + } + + @Override + public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int side, float f, + float f1, float f2) { + if (!ResearchLogic.hasInfoUnlocked(user, "paint_brush")) { + return false; + } + if (!user.canPlayerEdit(x, y, z, side, item)) { + return false; + } else if (!user.isSwingInProgress && user.inventory.hasItem(ComponentListMF.plant_oil)) { + Block block = world.getBlock(x, y, z); + return onUsedWithBlock(world, x, y, z, block, item, user); + } return false; } - - @Override - public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int side, float f, float f1, float f2) - { - if(!ResearchLogic.hasInfoUnlocked(user, "paint_brush")) - { - return false; - } - if (!user.canPlayerEdit(x, y, z, side, item)) - { - return false; - } - else if(!user.isSwingInProgress && user.inventory.hasItem(ComponentListMF.plant_oil)) - { - Block block = world.getBlock(x, y, z); - return onUsedWithBlock(world, x, y, z, block, item, user); - } - return false; - } + @Override public float getScale(ItemStack itemstack) { return 1.0F; } + @Override public float getOffsetX(ItemStack itemstack) { return 0; } + @Override public float getOffsetY(ItemStack itemstack) { - return 9F/16F; + return 9F / 16F; } + @Override public float getOffsetZ(ItemStack itemstack) { - return 1F/8F; + return 1F / 8F; } + @Override public float getRotationOffset(ItemStack itemstack) { return 90; } + @Override public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { return true; } + @Override public boolean isSpecialRender(ItemStack item) { return false; diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSaw.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSaw.java index d8459bc0..339362d2 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSaw.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSaw.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Random; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -14,20 +13,15 @@ import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; -import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.api.tool.IToolMF; import minefantasy.mf2.api.weapon.IDamageType; import minefantasy.mf2.api.weapon.IRackItem; import minefantasy.mf2.block.tileentity.decor.TileEntityRack; -import minefantasy.mf2.config.ConfigTools; import minefantasy.mf2.item.list.CreativeTabMF; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; @@ -36,239 +30,223 @@ import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.common.util.ForgeDirection; /** * @author Anonymous Productions */ -public class ItemSaw extends ItemAxe implements IToolMaterial, IDamageType, IToolMF, IRackItem -{ +public class ItemSaw extends ItemAxe implements IToolMaterial, IDamageType, IToolMF, IRackItem { private float hitDamage; private float baseDamage; private String name; private int tier; + /** */ - public ItemSaw(String name, ToolMaterial material, int rarity, int tier) - { - super(material); - this.tier=tier; - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.hitDamage = (2.0F + material.getDamageVsEntity())/2F; - setTextureName("minefantasy2:Tool/Crafting/"+name); + public ItemSaw(String name, ToolMaterial material, int rarity, int tier) { + super(material); + this.tier = tier; + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.hitDamage = (2.0F + material.getDamageVsEntity()) / 2F; + setTextureName("minefantasy2:Tool/Crafting/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); this.name = name; this.setHarvestLevel("axe", material.getHarvestLevel()); - } - - @Override - public ToolMaterial getMaterial() - { + } + + @Override + public ToolMaterial getMaterial() { return toolMaterial; } @Override - public Multimap getItemAttributeModifiers() - { - Multimap multimap = super.getItemAttributeModifiers(); - multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", this.hitDamage, 0)); - return multimap; - } - + public Multimap getItemAttributeModifiers() { + Multimap multimap = super.getItemAttributeModifiers(); + multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Tool modifier", this.hitDamage, 0)); + return multimap; + } + @Override - public float[] getDamageRatio(Object... implement) - { - return new float[]{1,0, 0}; + public float[] getDamageRatio(Object... implement) { + return new float[] { 1, 0, 0 }; } @Override - public String getToolType(ItemStack item) - { + public String getToolType(ItemStack item) { return "saw"; } + @Override - public float getPenetrationLevel(Object implement) - { + public float getPenetrationLevel(Object implement) { return 0.5F; } - - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemSaw setCustom(String s) - { + + public ItemSaw setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemSaw setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - + + public ItemSaw setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + @Override - public float getEfficiency(ItemStack item) - { + public float getEfficiency(ItemStack item) { return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); } + @Override - public int getTier(ItemStack item) - { + public int getTier(ItemStack item) { return CustomToolHelper.getCrafterTier(item, tier); } - - private float efficiencyMod = 1.0F; - public ItemSaw setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + private float efficiencyMod = 1.0F; + + public ItemSaw setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } - private IIcon detailTex = null; + + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); - } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); } - public float func_150893_a(ItemStack stack, Block block) - { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ @Override public float getScale(ItemStack itemstack) { @@ -282,7 +260,7 @@ public float getOffsetX(ItemStack itemstack) { @Override public float getOffsetY(ItemStack itemstack) { - return 9F/16F; + return 9F / 16F; } @Override diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java index 82082a61..32f97bce 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java @@ -4,17 +4,20 @@ import java.util.Iterator; import java.util.List; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.api.tool.IToolMF; import minefantasy.mf2.api.weapon.IDamageType; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.item.tool.ItemAxeMF; -import minefantasy.mf2.item.tool.ToolMaterialMF; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -28,241 +31,215 @@ import net.minecraft.util.IIcon; import net.minecraftforge.common.ForgeHooks; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - /** * @author Anonymous Productions */ -public class ItemSpanner extends ItemTool implements IToolMaterial, IToolMF, IDamageType -{ +public class ItemSpanner extends ItemTool implements IToolMaterial, IToolMF, IDamageType { private ToolMaterial material; private int tier; private float baseDamage; private String name; - public ItemSpanner(String name, int rarity, int tier) - { - super(2.0F, ToolMaterial.IRON, Sets.newHashSet(new Block[] {})); - this.material = ToolMaterial.IRON; - this.name = name; - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.setMaxDamage(material.getMaxUses() *2); - this.tier = tier; - setTextureName("minefantasy2:Tool/Crafting/"+name); + + public ItemSpanner(String name, int rarity, int tier) { + super(2.0F, ToolMaterial.IRON, Sets.newHashSet(new Block[] {})); + this.material = ToolMaterial.IRON; + this.name = name; + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.setMaxDamage(material.getMaxUses() * 2); + this.tier = tier; + setTextureName("minefantasy2:Tool/Crafting/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } + } + @Override - public ToolMaterial getMaterial() - { + public ToolMaterial getMaterial() { return toolMaterial; } - + @Override - public String getToolType(ItemStack item) - { + public String getToolType(ItemStack item) { return "spanner"; } - @Override - public float[] getDamageRatio(Object... implement) - { - return new float[]{0,1, 0}; + public float[] getDamageRatio(Object... implement) { + return new float[] { 0, 1, 0 }; } - - private void addSet(List list, Item[] items) - { - for(Item item:items) - { + private void addSet(List list, Item[] items) { + for (Item item : items) { list.add(new ItemStack(item)); } } + @Override - public float getPenetrationLevel(Object implement) - { + public float getPenetrationLevel(Object implement) { return 0F; } - - //===================================================== CUSTOM START =============================================================\\ + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemSpanner setCustom(String s) - { + + public ItemSpanner setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemSpanner setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - - - private float efficiencyMod = 1.0F; - public ItemSpanner setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemSpanner setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemSpanner setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } - private IIcon detailTex = null; + + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); } - @Override - public float getEfficiency(ItemStack item) - { + + @Override + public float getEfficiency(ItemStack item) { return CustomToolHelper.getEfficiency(item, material.getEfficiencyOnProperMaterial(), efficiencyMod); } + @Override - public int getTier(ItemStack item) - { + public int getTier(ItemStack item) { return CustomToolHelper.getCrafterTier(item, tier); } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); } - public float func_150893_a(ItemStack stack, Block block) - { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - //====================================================== CUSTOM END ==============================================================\\ + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java index dc40e059..d265bd33 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java @@ -4,20 +4,22 @@ import java.util.Iterator; import java.util.List; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.heating.Heatable; import minefantasy.mf2.api.heating.TongsHelper; import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.GuiHelper; -import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.api.tool.ISmithTongs; import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.item.tool.ToolMaterialMF; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; @@ -25,7 +27,6 @@ import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -35,58 +36,41 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - /** * @author Anonymous Productions */ -public class ItemTongs extends ItemTool implements IToolMaterial, ISmithTongs -{ +public class ItemTongs extends ItemTool implements IToolMaterial, ISmithTongs { private ToolMaterial material; private float baseDamage; private String name; - - public ItemTongs(String name, ToolMaterial material, int rarity) - { - super(0F, material, Sets.newHashSet(new Block[] {})); - this.material = material; - itemRarity = rarity; - this.name = name; - setCreativeTab(CreativeTabMF.tabOldTools); - setTextureName("minefantasy2:Tool/Crafting/"+name); - this.setMaxDamage(getMaxDamage()/5); + + public ItemTongs(String name, ToolMaterial material, int rarity) { + super(0F, material, Sets.newHashSet(new Block[] {})); + this.material = material; + itemRarity = rarity; + this.name = name; + setCreativeTab(CreativeTabMF.tabOldTools); + setTextureName("minefantasy2:Tool/Crafting/" + name); + this.setMaxDamage(getMaxDamage() / 5); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - } - - @Override - public Multimap getItemAttributeModifiers() - { + } + + @Override + public Multimap getItemAttributeModifiers() { Multimap map = HashMultimap.create(); map.clear(); - return map; - } - + return map; + } + @Override - public ToolMaterial getMaterial() - { + public ToolMaterial getMaterial() { return toolMaterial; } - - - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) - { + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); if (movingobjectposition == null) { @@ -106,13 +90,11 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer play } float water = TongsHelper.getWaterSource(world, i, j, k); - - if (TongsHelper.getHeldItem(item) != null && water >= 0) - { + + if (TongsHelper.getHeldItem(item) != null && water >= 0) { ItemStack drop = TongsHelper.getHeldItem(item).copy(), cooled = drop; - - if (TongsHelper.isCoolableItem(drop)) - { + + if (TongsHelper.isCoolableItem(drop)) { cooled = Heatable.getQuenchedItem(drop, water); cooled.stackSize = drop.stackSize; @@ -123,17 +105,13 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer play world.spawnParticle("largesmoke", i + 0.5F, j + 1, k + 0.5F, 0, 0.065F, 0); } } - if (cooled != null && !world.isRemote) - { - if(world.isAirBlock(i, j+1, k)) - { - EntityItem entity = new EntityItem(world, i+0.5, j+1, k+0.5, cooled); + if (cooled != null && !world.isRemote) { + if (world.isAirBlock(i, j + 1, k)) { + EntityItem entity = new EntityItem(world, i + 0.5, j + 1, k + 0.5, cooled); entity.delayBeforeCanPickup = 20; entity.motionX = entity.motionY = entity.motionZ = 0F; world.spawnEntityInWorld(entity); - } - else - { + } else { player.entityDropItem(cooled, 0); } } @@ -148,207 +126,188 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer play @Override @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { + public boolean requiresMultipleRenderPasses() { return true; } - - //===================================================== CUSTOM START =============================================================\\ + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemTongs setCustom(String s) - { + + public ItemTongs setCustom(String s) { canRepair = false; - setTextureName("minefantasy2:custom/tool/"+s+"/"+name); + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); isCustom = true; return this; } - public ItemTongs setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } - - - private float efficiencyMod = 1.0F; - public ItemTongs setEfficiencyMod(float efficiencyMod) - { - this.efficiencyMod = efficiencyMod; - return this; - } - + + public ItemTongs setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + private float efficiencyMod = 1.0F; + + public ItemTongs setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + @Override - public Multimap getAttributeModifiers(ItemStack item) - { + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, 1.0F); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); } + private IIcon detailTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - } - super.registerIcons(reg); - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - ItemStack item = TongsHelper.getHeldItem(stack); - boolean hasHeld = item != null; - int baseLayer = hasHeld ? 1 : 0; - - if (hasHeld && pass == 0) - { - return item.getItem().getIcon(item, pass); - } - if(!isCustom || pass == baseLayer && detailTex != null) - { - return super.getIcon(stack, pass); - } - return detailTex != null ? detailTex : super.getIcon(stack, pass); - } - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - /*@Override + + @Override @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack stack, int renderPass) - { + public void registerIcons(IIconRegister reg) { + if (isCustom) { + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { ItemStack item = TongsHelper.getHeldItem(stack); + boolean hasHeld = item != null; + int baseLayer = hasHeld ? 1 : 0; - if (renderPass == 0 && item != null) { - return item.getItem().getIcon(item, renderPass); + if (hasHeld && pass == 0) { + return item.getItem().getIcon(item, pass); + } + if (!isCustom || pass == baseLayer && detailTex != null) { + return super.getIcon(stack, pass); } - return itemIcon; + return detailTex != null ? detailTex : super.getIcon(stack, pass); + } + + @Override + public int getRenderPasses(int metadata) { + return 3; } - */ - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - ItemStack held = TongsHelper.getHeldItem(item); - boolean hasHeld = held != null; - int baseLayer = hasHeld ? 1 : 0; - if (hasHeld) //Bottom Layer + /* + * @Override + * + * @SideOnly(Side.CLIENT) public IIcon getIcon(ItemStack stack, int renderPass) + * { ItemStack item = TongsHelper.getHeldItem(stack); + * + * if (renderPass == 0 && item != null) { return item.getItem().getIcon(item, + * renderPass); } return itemIcon; } + */ + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + ItemStack held = TongsHelper.getHeldItem(item); + boolean hasHeld = held != null; + int baseLayer = hasHeld ? 1 : 0; + if (hasHeld) // Bottom Layer { - if( layer == 0) - { + if (layer == 0) { return held.getItem().getColorFromItemStack(held, 0); } - return CustomToolHelper.getColourFromItemStack(item, layer-1, super.getColorFromItemStack(item, layer)); + return CustomToolHelper.getColourFromItemStack(item, layer - 1, super.getColorFromItemStack(item, layer)); } return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } + } - @Override - public int getMaxDamage(ItemStack stack) - { + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main) - { + public ItemStack construct(String main) { return CustomToolHelper.construct(this, main, null); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); } - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) - { - if (!ForgeHooks.isToolEffective(stack, block, meta)) - { - return this.func_150893_a(stack, block); - } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); } - public float func_150893_a(ItemStack stack, Block block) - { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name)); - } - } - } - else - { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - if(isCustom) - { - CustomToolHelper.addInformation(item, list); - }else{ - - ItemStack held = TongsHelper.getHeldItem(item); + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name)); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } else { + + ItemStack held = TongsHelper.getHeldItem(item); if (held != null) { list.add(""); list.add(held.getItem().getItemStackDisplayName(held)); held.getItem().addInformation(held, user, list, extra); } - } - - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - - @Override - public boolean hitEntity(ItemStack item, EntityLivingBase target, EntityLivingBase user) - { - return true; - } - //====================================================== CUSTOM END ==============================================================\\ + } + + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + @Override + public boolean hitEntity(ItemStack item, EntityLivingBase target, EntityLivingBase user) { + return true; + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemBattleaxeMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemBattleaxeMF.java index aceea3eb..eb743343 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemBattleaxeMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemBattleaxeMF.java @@ -16,198 +16,178 @@ /** * @author Anonymous Productions */ -public class ItemBattleaxeMF extends ItemHeavyWeaponMF -{ - private float injuryChance = 0.05F; +public class ItemBattleaxeMF extends ItemHeavyWeaponMF { + private float injuryChance = 0.05F; + /** - * A battleaxe is a heavy counterpart to the waraxe, it does more damage and knockback, can also parry easier + * A battleaxe is a heavy counterpart to the waraxe, it does more damage and + * knockback, can also parry easier */ - public ItemBattleaxeMF(String name, ToolMaterial material, int rarity, float weight) - { - super(material, name, rarity, weight); - } - - @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, boolean properHit) - { - float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); - if(!(hit instanceof EntityLivingBase)) - { - return damage; - } - EntityLivingBase target = (EntityLivingBase)hit; - - if(wielder.isSprinting()) - { - if(wielder.fallDistance > 0 && canLunge(wielder) && tryPerformAbility(wielder, lunge_cost, !properHit, true, true, true))//LUNGE: 20 Points + public ItemBattleaxeMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); + if (!(hit instanceof EntityLivingBase)) { + return damage; + } + EntityLivingBase target = (EntityLivingBase) hit; + + if (wielder.isSprinting()) { + if (wielder.fallDistance > 0 && canLunge(wielder) + && tryPerformAbility(wielder, lunge_cost, !properHit, true, true, true))// LUNGE: 20 Points { - return chargeAt(wielder, target, true, damage, properHit); - } - else if(wielder.onGround && getHeightGap(target, wielder) <= 0.5F && tryPerformAbility(wielder, charge_cost))//CHARGE: 10 points + return chargeAt(wielder, target, true, damage, properHit); + } else if (wielder.onGround && getHeightGap(target, wielder) <= 0.5F + && tryPerformAbility(wielder, charge_cost))// CHARGE: 10 points { return chargeAt(wielder, target, false, damage, properHit); } - } - else if(wielder.fallDistance > 0 && !wielder.isOnLadder() && tryPerformAbility(wielder, jump_cost))//JUMP: 2 points - { - if(properHit) - brutalise(wielder, target, 1.0F); - return damage * 1.25F; - } + } else if (wielder.fallDistance > 0 && !wielder.isOnLadder() && tryPerformAbility(wielder, jump_cost))// JUMP: 2 + // points + { + if (properHit) + brutalise(wielder, target, 1.0F); + return damage * 1.25F; + } return damage; } - private float chargeAt(EntityLivingBase entityHitting, EntityLivingBase entityHit, boolean lunge, float dam, boolean properHit) - { - if(properHit) - brutalise(entityHitting, entityHit, 1.0F); - - if(lunge) - { - float fallBonus = (Math.min(entityHitting.fallDistance, getMeleeDamage(entityHitting.getHeldItem())))/2F; - if(entityHit.onGround && !properHit) - { + private float chargeAt(EntityLivingBase entityHitting, EntityLivingBase entityHit, boolean lunge, float dam, + boolean properHit) { + if (properHit) + brutalise(entityHitting, entityHit, 1.0F); + + if (lunge) { + float fallBonus = (Math.min(entityHitting.fallDistance, getMeleeDamage(entityHitting.getHeldItem()))) / 2F; + if (entityHit.onGround && !properHit) { entityHitting.hurtResistantTime = 20; TacticalManager.knockbackEntity(entityHit, entityHitting, 4F, 0.5F); TacticalManager.lungeEntity(entityHitting, entityHit, 2F, 0.1F); } - if(properHit) - { - if(!entityHit.isPotionActive(Potion.moveSlowdown.id)) - { + if (properHit) { + if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 400, 3)); entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 1)); } - + entityHitting.fallDistance -= fallBonus; } - if(fallBonus > 0) - { + if (fallBonus > 0) { dam += fallBonus; } - } - else - { - if(properHit) - { - if(entityHitting.onGround && entityHit.onGround && !properHit) - { + } else { + if (properHit) { + if (entityHitting.onGround && entityHit.onGround && !properHit) { entityHitting.hurtResistantTime = 20; TacticalManager.lungeEntity(entityHitting, entityHit, 1F, 0.0F); } - if(properHit) - { - if(!entityHit.isPotionActive(Potion.moveSlowdown.id)) - { + if (properHit) { + if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 3)); entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 0)); } } } } - return dam *1.25F; - } - @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) - { - if(rand.nextFloat() < injuryChance) - { - hit.getEntityData().setInteger(EventManagerMF.injuredNBT, 300 + rand.nextInt(1000)); - } - super.onProperHit(user, weapon, hit, dam); - } + return dam * 1.25F; + } + + @Override + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (rand.nextFloat() < injuryChance) { + hit.getEntityData().setInteger(EventManagerMF.injuredNBT, 300 + rand.nextInt(1000)); + } + super.onProperHit(user, weapon, hit, dam); + } + /** * Determines if sprint-jump lunges work */ - private boolean canLunge(EntityLivingBase entityHitting) - { + private boolean canLunge(EntityLivingBase entityHitting) { return true; } - private double getHeightGap(EntityLivingBase entityHit, EntityLivingBase entityHitting) - { + private double getHeightGap(EntityLivingBase entityHit, EntityLivingBase entityHitting) { double a = entityHitting.posY - entityHit.posY; return Math.max(a, -a); } + @Override - public float getDigSpeed(ItemStack itemstack, Block block, int metadata) - { - if(Items.iron_axe.getDigSpeed(itemstack, block, metadata) > 2.0F) - { - return material.getEfficiencyOnProperMaterial()*0.75F; + public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { + if (Items.iron_axe.getDigSpeed(itemstack, block, metadata) > 2.0F) { + return material.getEfficiencyOnProperMaterial() * 0.75F; } return super.getDigSpeed(itemstack, block, metadata); } - public static void brutalise(EntityLivingBase entityHitting, EntityLivingBase entityHit, float power) - { - if(!entityHit.worldObj.isRemote) - { - if(entityHitting instanceof EntityPlayer) - { - ((EntityPlayer)entityHitting).onCriticalHit(entityHit); - } + public static void brutalise(EntityLivingBase entityHitting, EntityLivingBase entityHit, float power) { + if (!entityHit.worldObj.isRemote) { + if (entityHitting instanceof EntityPlayer) { + ((EntityPlayer) entityHitting).onCriticalHit(entityHit); + } } } + @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) - { + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.75F); return true; } + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModAxe; } + @Override - public float getDamageModifier() - { + public float getDamageModifier() { return damageModAxe; } + @Override - protected float[] getWeaponRatio(ItemStack implement) - { + protected float[] getWeaponRatio(ItemStack implement) { return hvyHackingDamage; } + @Override - public float getPenetrationLevel(Object implement) - { + public float getPenetrationLevel(Object implement) { return axeAPModifier; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return axeParryTime + heavyParryTime; } - + @Override - protected float getStaminaMod() - { - return heavyStaminaCost*axeStaminaCost; + protected float getStaminaMod() { + return heavyStaminaCost * axeStaminaCost; } - + @Override - public WeaponClass getWeaponClass() - { + public WeaponClass getWeaponClass() { return WeaponClass.AXE; } + @Override - public boolean canCounter() - { + public boolean canCounter() { return true; } + @Override - public float[] getCounterRatio() - { + public float[] getCounterRatio() { return crushingDamage; } + @Override - public float getCounterDamage() - { + public float getCounterDamage() { return 0.5F; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemDagger.java b/src/main/java/minefantasy/mf2/item/weapon/ItemDagger.java index 87fb317b..d639f41d 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemDagger.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemDagger.java @@ -2,139 +2,128 @@ import java.util.Random; -import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.api.weapon.WeaponClass; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; /** * @author Anonymous Productions */ -public class ItemDagger extends ItemWeaponMF -{ +public class ItemDagger extends ItemWeaponMF { private Random rand = new Random(); + /** * Daggers are fast and weak weapons, but are fast and light * * These are for the fast player */ - public ItemDagger(String name, ToolMaterial material, int rarity, float weight) - { - super(material, name, rarity, weight); - } - - @Override - public boolean canBlock() - { + public ItemDagger(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { return true; } - + /** * Determines if the weapon can parry */ @Override - public boolean canWeaponParry() - { + public boolean canWeaponParry() { return true; } - + @Override - protected int getParryDamage(float dam) - { + protected int getParryDamage(float dam) { return 2; } + /** * Gets the angle the weapon can parry */ @Override - public float getParryAngleModifier(EntityLivingBase user) - { + public float getParryAngleModifier(EntityLivingBase user) { return 0.75F; } + /** * Gets the multiplier for the parry threshold + * * @return */ @Override - public float getParryDamageModifier(EntityLivingBase user) - { + public float getParryDamageModifier(EntityLivingBase user) { return 0.5F; } + @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) - { - blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 1.65F + (rand.nextFloat()*0.5F)); + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 1.65F + (rand.nextFloat() * 0.5F)); return true; } - + @Override - public float getDecayModifier(EntityLivingBase user, ItemStack item) - { + public float getDecayModifier(EntityLivingBase user, ItemStack item) { return 0.5F; } @Override - public float getRegenModifier(EntityLivingBase user, ItemStack item) - { + public float getRegenModifier(EntityLivingBase user, ItemStack item) { return user.worldObj.difficultySetting.getDifficultyId() < 3 ? 1.5F : 1.0F; } - + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { - if(!StaminaBar.isSystemActive || StaminaBar.isAnyStamina(user, false)) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + if (!StaminaBar.isSystemActive || StaminaBar.isAnyStamina(user, false)) { return speedModKatana; } return 0; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return daggerParryTime; } + @Override - protected float getStaminaMod() - { + protected float getStaminaMod() { return daggerStaminaCost; } + @Override - public WeaponClass getWeaponClass() - { + public WeaponClass getWeaponClass() { return WeaponClass.BLADE; } - + @Override - public boolean canCounter() - { + public boolean canCounter() { return true; } + @Override - public float[] getCounterRatio() - { + public float[] getCounterRatio() { return piercingDamage; } + @Override - protected float[] getWeaponRatio(ItemStack implement) - { + protected float[] getWeaponRatio(ItemStack implement) { return piercingDamage; } + @Override - public float getCounterDamage() - { + public float getCounterDamage() { return 1.5F; } - + @Override - protected float getMeleeDamage(ItemStack item) - { - return super.getMeleeDamage(item) /2; + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) / 2; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemGreatswordMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemGreatswordMF.java index d68ba2e0..6213e02f 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemGreatswordMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemGreatswordMF.java @@ -12,124 +12,117 @@ /** * @author Anonymous Productions */ -public class ItemGreatswordMF extends ItemHeavyWeaponMF -{ +public class ItemGreatswordMF extends ItemHeavyWeaponMF { private Random rand = new Random(); + /** - * Greatswords are heavy counterparts to swords, with added damage, knockback and parrying arc + * Greatswords are heavy counterparts to swords, with added damage, knockback + * and parrying arc */ - public ItemGreatswordMF(String name, ToolMaterial material, int rarity, float weight) - { - super(material, name, rarity, weight); - } - - @Override - public boolean canBlock() - { + public ItemGreatswordMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { return true; } - + /** * Determines if the weapon can parry */ @Override - public boolean canWeaponParry() - { + public boolean canWeaponParry() { return true; } - + @Override - public boolean canWeaponEvade() - { + public boolean canWeaponEvade() { return true; } - + @Override - protected int getParryDamage(float dam) - { + protected int getParryDamage(float dam) { return 1; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(EntityLivingBase user) - { + public int getParryCooldown(EntityLivingBase user) { return 12; } + /** * Gets the angle the weapon can parry */ @Override - public float getParryAngleModifier(EntityLivingBase user) - { + public float getParryAngleModifier(EntityLivingBase user) { return 1.5F; } + /** * Gets the multiplier for the parry threshold + * * @return */ @Override - public float getParryDamageModifier(EntityLivingBase user) - { + public float getParryDamageModifier(EntityLivingBase user) { return user instanceof EntityPlayer ? 3.0F : 1.5F; } + @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) - { - blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat()*0.5F)); + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat() * 0.5F)); return true; } - + @Override - public float getBalance() - { + public float getBalance() { return 0.5F; } + @Override - protected boolean canAnyMobParry() - { + protected boolean canAnyMobParry() { return true; } + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModSword; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return swordParryTime + heavyParryTime; } - + @Override - protected float getStaminaMod() - { - return heavyStaminaCost*swordStaminaCost; + protected float getStaminaMod() { + return heavyStaminaCost * swordStaminaCost; } - + @Override - public WeaponClass getWeaponClass() - { + public WeaponClass getWeaponClass() { return WeaponClass.BLADE; } - + @Override - public boolean canCounter() - { + public boolean canCounter() { return true; } + @Override - public float[] getCounterRatio() - { + public float[] getCounterRatio() { return crushingDamage; } + @Override - public float getCounterDamage() - { + public float getCounterDamage() { return 0.5F; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemHalbeardMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemHalbeardMF.java index 84e08b1e..a92a79a9 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemHalbeardMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemHalbeardMF.java @@ -8,104 +8,96 @@ /** * @author Anonymous Productions */ -public class ItemHalbeardMF extends ItemSpearMF -{ +public class ItemHalbeardMF extends ItemSpearMF { /** - * The halbeard is the heavy counterpart for the spear: It has increased damage, knockback distance and parry arc + * The halbeard is the heavy counterpart for the spear: It has increased damage, + * knockback distance and parry arc * - * Halbeards use a swinging attack rather than a stab, but will still stab when sprinting + * Halbeards use a swinging attack rather than a stab, but will still stab when + * sprinting */ - public ItemHalbeardMF(String name, ToolMaterial material, int rarity, float weight) - { - super(name, material, rarity, weight); - setMaxDamage(getMaxDamage()*2); - } - - @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) - { + public ItemHalbeardMF(String name, ToolMaterial material, int rarity, float weight) { + super(name, material, rarity, weight); + setMaxDamage(getMaxDamage() * 2); + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { return false; } - + @Override - public float getReachModifierInBlocks(ItemStack stack) - { + public float getReachModifierInBlocks(ItemStack stack) { return 3.0F; } - + @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) - { + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.7F); return true; } - + @Override - protected int getParryDamage(float dam) - { - return (int)dam; + protected int getParryDamage(float dam) { + return (int) dam; } + /** * Gets the angle the weapon can parry */ @Override - public float getParryAngleModifier(EntityLivingBase user) - { - return user.isSneaking() ? 1.5F: 1.0F; + public float getParryAngleModifier(EntityLivingBase user) { + return user.isSneaking() ? 1.5F : 1.0F; } + @Override - public float getBalance() - { + public float getBalance() { return 0.8F; } - + @Override - protected float getKnockbackStrength() - { + protected float getKnockbackStrength() { return 3.5F; } + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModSpear; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return spearParryTime + heavyParryTime; } - + @Override - protected float getStaminaMod() - { - return heavyStaminaCost*spearStaminaCost; + protected float getStaminaMod() { + return heavyStaminaCost * spearStaminaCost; } + @Override - protected float[] getWeaponRatio(ItemStack implement, EntityLivingBase user) - { - if(user.isSprinting()) - { + protected float[] getWeaponRatio(ItemStack implement, EntityLivingBase user) { + if (user.isSprinting()) { return piercingDamage; } return getWeaponRatio(implement); } + @Override - protected float[] getWeaponRatio(ItemStack implement) - { + protected float[] getWeaponRatio(ItemStack implement) { return hvyHackingDamage; } - + @Override - protected float getMeleeDamage(ItemStack item) - { - return super.getMeleeDamage(item)*1.5F; + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 1.5F; } + @Override - public float getScale(ItemStack itemstack) - { + public float getScale(ItemStack itemstack) { return 3.0F; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemHeavyWeaponMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemHeavyWeaponMF.java index 8adf652d..ef6b731d 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemHeavyWeaponMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemHeavyWeaponMF.java @@ -6,130 +6,117 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; -public abstract class ItemHeavyWeaponMF extends ItemWeaponMF implements IExtendedReachWeapon -{ +public abstract class ItemHeavyWeaponMF extends ItemWeaponMF implements IExtendedReachWeapon { /** - * Heavy weapons are larger varients of their own counterparts(sword, waraxe, mace and spear). - * These have 2x the durability, have a wider parry arc, and do 50% more damage. + * Heavy weapons are larger varients of their own counterparts(sword, waraxe, + * mace and spear). These have 2x the durability, have a wider parry arc, and do + * 50% more damage. * * Heavy weapons weigh more and throw you off balance when used. */ - public ItemHeavyWeaponMF(ToolMaterial material, String named, int rarity, float weight) - { + public ItemHeavyWeaponMF(ToolMaterial material, String named, int rarity, float weight) { super(material, named, rarity, weight); - setMaxDamage((int) (getMaxDamage()*1.5F)); + setMaxDamage((int) (getMaxDamage() * 1.5F)); } - + @Override - public boolean sheatheOnBack(ItemStack item) - { + public boolean sheatheOnBack(ItemStack item) { return true; } @Override - public boolean isHeavyWeapon() - { + public boolean isHeavyWeapon() { return true; } + @Override - public boolean isOffhandHandDual(ItemStack off) - { + public boolean isOffhandHandDual(ItemStack off) { return false; } @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) - { + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { return false; } - public int getParryCooldown(EntityLivingBase user) - { + + public int getParryCooldown(EntityLivingBase user) { return 18; } + /** * Gets the angle the weapon can parry */ @Override - public float getParryAngleModifier(EntityLivingBase user) - { + public float getParryAngleModifier(EntityLivingBase user) { return 1.0F; } - + @Override - public float getBalance() - { + public float getBalance() { return 0.75F; } - + @Override - protected float getKnockbackStrength() - { + protected float getKnockbackStrength() { return 1.5F; } - + @Override - public float getDecayModifier(EntityLivingBase user, ItemStack item) - { + public float getDecayModifier(EntityLivingBase user, ItemStack item) { return 1.25F; } - + @Override - protected boolean canAnyMobParry() - { + protected boolean canAnyMobParry() { return false; } - + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModHeavy; } - + @Override - protected float[] getWeaponRatio(ItemStack implement) - { + protected float[] getWeaponRatio(ItemStack implement) { return hvySlashingDamage; } + @Override - public float getParryStaminaDecay(DamageSource source, ItemStack weapon) - { + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { return heavyParryFatigue; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return heavyParryTime; } + @Override - public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) - { + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { return 50; } + @Override - protected float getStaminaMod() - { + protected float getStaminaMod() { return heavyStaminaCost; } - + @Override - public float getReachModifierInBlocks(ItemStack stack) - { + public float getReachModifierInBlocks(ItemStack stack) { return 2.0F; } - + @Override - protected float getMeleeDamage(ItemStack item) - { - return super.getMeleeDamage(item)*1.5F; + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 1.5F; } - + @Override - public float getScale(ItemStack itemstack) - { + public float getScale(ItemStack itemstack) { return 2.0F; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemKatanaMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemKatanaMF.java index 707b96a8..7e7e047b 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemKatanaMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemKatanaMF.java @@ -14,163 +14,153 @@ /** * @author Anonymous Productions */ -public class ItemKatanaMF extends ItemHeavyWeaponMF -{ +public class ItemKatanaMF extends ItemHeavyWeaponMF { private Random rand = new Random(); + /** - * Katanas are heavy counterparts to Tantos, unlike most heavy weapons: these act more like light-weapons + * Katanas are heavy counterparts to Tantos, unlike most heavy weapons: these + * act more like light-weapons */ - public ItemKatanaMF(String name, ToolMaterial material, int rarity, float weight) - { - super(material, name, rarity, weight); - } - - @Override - public boolean canBlock() - { + public ItemKatanaMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { return true; } - + @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) - { + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { return true; } + /** * Determines if the weapon can parry */ @Override - public boolean canWeaponParry() - { + public boolean canWeaponParry() { return true; } - + @Override - protected int getParryDamage(float dam) - { + protected int getParryDamage(float dam) { return 1; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(EntityLivingBase user) - { + public int getParryCooldown(EntityLivingBase user) { return 8; } + /** * Gets the angle the weapon can parry */ @Override - public float getParryAngleModifier(EntityLivingBase user) - { + public float getParryAngleModifier(EntityLivingBase user) { return 1.0F; } + /** * Gets the multiplier for the parry threshold + * * @return */ @Override - public float getParryDamageModifier(EntityLivingBase user) - { + public float getParryDamageModifier(EntityLivingBase user) { return 1.5F; } + @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) - { - blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 1.15F + (rand.nextFloat()*0.5F)); + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 1.15F + (rand.nextFloat() * 0.5F)); return true; } - + @Override - public float getBalance() - { + public float getBalance() { return 0.0F; } + @Override - public float getDecayModifier(EntityLivingBase user, ItemStack item) - { + public float getDecayModifier(EntityLivingBase user, ItemStack item) { return 0.75F; } @Override - public float getRegenModifier(EntityLivingBase user, ItemStack item) - { + public float getRegenModifier(EntityLivingBase user, ItemStack item) { return user.worldObj.difficultySetting.getDifficultyId() < 3 ? 1.25F : 1.0F; } - + @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) - { - if(user.motionY < 0 && !user.onGround && (!(user instanceof EntityPlayer) || user.isSneaking()) && tryPerformAbility(user, cleave_cost)) - { + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (user.motionY < 0 && !user.onGround && (!(user instanceof EntityPlayer) || user.isSneaking()) + && tryPerformAbility(user, cleave_cost)) { hurtInRange(user, 4D); - if(hit instanceof EntityLivingBase) - { - ArmourCalculator.damageArmour((EntityLivingBase)hit, (int)(dam*10)); + if (hit instanceof EntityLivingBase) { + ArmourCalculator.damageArmour((EntityLivingBase) hit, (int) (dam * 10)); } user.setSneaking(false); } super.onProperHit(user, weapon, hit, dam); } - + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { - if(!StaminaBar.isSystemActive || StaminaBar.isAnyStamina(user, false)) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + if (!StaminaBar.isSystemActive || StaminaBar.isAnyStamina(user, false)) { return speedModKatana; } - return speedModHeavy/2; + return speedModHeavy / 2; } + @Override - public float getParryStaminaDecay(DamageSource source, ItemStack weapon) - { + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { return 1.0F; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return swordParryTime; } + @Override - protected float getStaminaMod() - { + protected float getStaminaMod() { return katanaStaminaCost; } + @Override - public WeaponClass getWeaponClass() - { + public WeaponClass getWeaponClass() { return WeaponClass.BLADE; } + @Override - protected float[] getWeaponRatio(ItemStack implement) - { + protected float[] getWeaponRatio(ItemStack implement) { return slashingDamage; } - + @Override - public boolean canCounter() - { + public boolean canCounter() { return true; } + @Override - public float[] getCounterRatio() - { + public float[] getCounterRatio() { return piercingDamage; } + @Override - public float getCounterDamage() - { + public float getCounterDamage() { return 1.5F; } - + @Override - protected float getMeleeDamage(ItemStack item) - { - return super.getMeleeDamage(item)*0.5F; + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 0.5F; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemLance.java b/src/main/java/minefantasy/mf2/item/weapon/ItemLance.java index e6fda7f2..d30c23e7 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemLance.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemLance.java @@ -14,124 +14,112 @@ /** * @author Anonymous Productions */ -public class ItemLance extends ItemSpearMF -{ +public class ItemLance extends ItemSpearMF { /** */ - public ItemLance(String name, ToolMaterial material, int rarity, float weight) - { - super(name, material, rarity, weight); - setMaxDamage(getMaxDamage()*2); - } - - @Override - public void addInformation(ItemStack weapon, EntityPlayer user, List list, boolean extra) - { - super.addInformation(weapon, user, list, extra); - - list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.modifier.plus."+ 0, decimal_format.format(getJoustDamage(weapon)), StatCollector.translateToLocal("attribute.weapon.joustDam"))); - } - - @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) - { - return offhand==null || offhand.getItem() instanceof IShield; + public ItemLance(String name, ToolMaterial material, int rarity, float weight) { + super(name, material, rarity, weight); + setMaxDamage(getMaxDamage() * 2); } - + @Override - public float getReachModifierInBlocks(ItemStack stack) - { + public void addInformation(ItemStack weapon, EntityPlayer user, List list, boolean extra) { + super.addInformation(weapon, user, list, extra); + + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.modifier.plus." + 0, + decimal_format.format(getJoustDamage(weapon)), + StatCollector.translateToLocal("attribute.weapon.joustDam"))); + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return offhand == null || offhand.getItem() instanceof IShield; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { return 3.0F; } + @Override - protected float[] getWeaponRatio(ItemStack implement) - { + protected float[] getWeaponRatio(ItemStack implement) { return hvyPiercingDamage; } - + @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, boolean properHit) - { + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { float dam = super.modifyDamage(item, wielder, hit, initialDam, properHit); - if(hit instanceof EntityLivingBase) - { - return joust((EntityLivingBase)hit, wielder, dam); + if (hit instanceof EntityLivingBase) { + return joust((EntityLivingBase) hit, wielder, dam); } return dam; } - + @Override - public boolean canWeaponParry() - { + public boolean canWeaponParry() { return false; } - //Higher stamina means more precice hits: Full stamina hits are perfect + + // Higher stamina means more precice hits: Full stamina hits are perfect @Override - public float getBalance(EntityLivingBase user) - { - if(StaminaBar.isSystemActive) - { - return 0.0F + (2*(1-StaminaBar.getStaminaDecimal(user))); + public float getBalance(EntityLivingBase user) { + if (StaminaBar.isSystemActive) { + return 0.0F + (2 * (1 - StaminaBar.getStaminaDecimal(user))); } return 0.0F; } - + @Override - protected float getKnockbackStrength() - { + protected float getKnockbackStrength() { return 5.0F; } + @Override - protected float getStaminaMod() - { + protected float getStaminaMod() { return 5.0F; } + @Override - public boolean canBlock() - { + public boolean canBlock() { return false; } - - public float joust(EntityLivingBase target, EntityLivingBase attacker, float dam) - { + + public float joust(EntityLivingBase target, EntityLivingBase attacker, float dam) { float speedMod = 20F; float speedCap = 5F; - - if(attacker.isRiding()) - { - Entity mount = attacker.ridingEntity; - float speed = (float)Math.hypot(mount.motionX, mount.motionZ) * speedMod; - if(speed > speedCap)speed = speedCap; - - dam += getJoustDamage(target.getHeldItem()) / speedCap * speed; - - if(attacker instanceof EntityPlayer) - { - ((EntityPlayer) attacker).onCriticalHit(target); - } - - if(target.isRiding() && speed > (speedCap/2F)) - { - target.dismountEntity(target.ridingEntity); - target.mountEntity(null); - } - } - return dam; + + if (attacker.isRiding()) { + Entity mount = attacker.ridingEntity; + float speed = (float) Math.hypot(mount.motionX, mount.motionZ) * speedMod; + if (speed > speedCap) + speed = speedCap; + + dam += getJoustDamage(target.getHeldItem()) / speedCap * speed; + + if (attacker instanceof EntityPlayer) { + ((EntityPlayer) attacker).onCriticalHit(target); + } + + if (target.isRiding() && speed > (speedCap / 2F)) { + target.dismountEntity(target.ridingEntity); + target.mountEntity(null); + } + } + return dam; } + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { - return super.modifyHitTime(user, item) + speedModSpear*2; + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSpear * 2; } - + @Override - protected float getMeleeDamage(ItemStack item) - { - return 2F; + protected float getMeleeDamage(ItemStack item) { + return 2F; } - - protected float getJoustDamage(ItemStack item) - { - return super.getMeleeDamage(item)*2.5F; + + protected float getJoustDamage(ItemStack item) { + return super.getMeleeDamage(item) * 2.5F; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemMaceMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemMaceMF.java index 2559f8c8..e325bf2f 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemMaceMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemMaceMF.java @@ -12,101 +12,90 @@ /** * @author Anonymous Productions */ -public class ItemMaceMF extends ItemWeaponMF -{ +public class ItemMaceMF extends ItemWeaponMF { private float stunChance = 0.20F; + /** - * The mace does the most damage - * Maces also have more durability + * The mace does the most damage Maces also have more durability * * These are for the player who just wants to hit stuff */ - public ItemMaceMF(String name, ToolMaterial material, int rarity, float weight) - { - super(material, name, rarity, weight); - this.setMaxDamage((int) (getMaxDamage()*2F)); - } + public ItemMaceMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + this.setMaxDamage((int) (getMaxDamage() * 2F)); + } @Override - protected int getParryDamage(float dam) - { - return (int)(dam*2F); + protected int getParryDamage(float dam) { + return (int) (dam * 2F); } - + @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) - { - if(!user.worldObj.isRemote && user.getRNG().nextInt(5) == 0) - { - if(hit instanceof EntityLivingBase) - { - ((EntityLivingBase)hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 1)); + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (!user.worldObj.isRemote && user.getRNG().nextInt(5) == 0) { + if (hit instanceof EntityLivingBase) { + ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 1)); } } super.onProperHit(user, weapon, hit, dam); } - + @Override - public float getDigSpeed(ItemStack itemstack, Block block, int metadata) - { - return super.getDigSpeed(itemstack, block, metadata)*1.5F; + public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { + return super.getDigSpeed(itemstack, block, metadata) * 1.5F; } @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) - { + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 1.0F); return true; } - + @Override - protected float getKnockbackStrength() - { + protected float getKnockbackStrength() { return 1.5F; } @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModMace; } + @Override - public float getDamageModifier() - { + public float getDamageModifier() { return damageModMace; } - + @Override - protected float[] getWeaponRatio(ItemStack implement) - { + protected float[] getWeaponRatio(ItemStack implement) { return crushingDamage; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return maceParryTime; } + @Override - public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) - { + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { return 40; } + @Override - protected float getStaminaMod() - { + protected float getStaminaMod() { return maceStaminaCost; } + @Override - public WeaponClass getWeaponClass() - { + public WeaponClass getWeaponClass() { return WeaponClass.BLUNT; } + @Override - public boolean canCounter() - { + public boolean canCounter() { return false; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemSpearMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemSpearMF.java index 367dbcbf..c05400b0 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemSpearMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemSpearMF.java @@ -5,7 +5,6 @@ import minefantasy.mf2.api.helpers.TacticalManager; import minefantasy.mf2.api.weapon.WeaponClass; import minefantasy.mf2.config.ConfigWeapon; -import minefantasy.mf2.item.tool.ToolMaterialMF; import mods.battlegear2.api.shield.IShield; import mods.battlegear2.api.weapons.IExtendedReachWeapon; import net.minecraft.entity.Entity; @@ -19,184 +18,162 @@ /** * @author Anonymous Productions */ -public class ItemSpearMF extends ItemWeaponMF implements IExtendedReachWeapon -{ +public class ItemSpearMF extends ItemWeaponMF implements IExtendedReachWeapon { /** - * The spear is for the defensive player, it has a long reach, knockback and can be thrown. - * Spears are good for keeping enemies at a distance, Parrying is easier when sneaking + * The spear is for the defensive player, it has a long reach, knockback and can + * be thrown. Spears are good for keeping enemies at a distance, Parrying is + * easier when sneaking * * These are for the defensive player */ - public ItemSpearMF(String name, ToolMaterial material, int rarity, float weight) - { - super(material, name, rarity, weight); - } - - @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) - { - return offhand==null || offhand.getItem() instanceof IShield; - } - - @Override - public boolean isHeavyWeapon() - { + public ItemSpearMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return offhand == null || offhand.getItem() instanceof IShield; + } + + @Override + public boolean isHeavyWeapon() { return true; } - - @Override - public boolean isOffhandHandDual(ItemStack off) - { + + @Override + public boolean isOffhandHandDual(ItemStack off) { return false; } @Override - public boolean sheatheOnBack(ItemStack item) - { + public boolean sheatheOnBack(ItemStack item) { return true; } - + @Override - public float getReachModifierInBlocks(ItemStack stack) - { + public float getReachModifierInBlocks(ItemStack stack) { return 3.0F; } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) - { - super.addInformation(item, user, list, extra); - - if(material != ToolMaterial.WOOD) - { - list.add(EnumChatFormatting.DARK_GREEN+ - StatCollector.translateToLocalFormatted("attribute.modifier.plus."+ 0, - decimal_format.format(getMountedDamage()), StatCollector.translateToLocal("attribute.weapon.mountedBonus"))); - } - } - - @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, boolean properHit) - { - float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); - - if(!(hit instanceof EntityLivingBase) || this instanceof ItemLance) - { - return damage; - } - EntityLivingBase target = (EntityLivingBase)hit; - - if(wielder.isRiding() && tryPerformAbility(wielder, charge_cost)) - { - ItemWaraxeMF.brutalise(wielder, target, 1.0F); - return damage + getMountedDamage(); - } - if(!wielder.isRiding() && wielder.isSprinting()) - { - if(this instanceof ItemHalbeardMF) - { - return Math.max(damage/1.25F, 1.0F); - } - else - { - return damage*1.25F; - } - } - return damage; - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) - { + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + super.addInformation(item, user, list, extra); + + if (material != ToolMaterial.WOOD) { + list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( + "attribute.modifier.plus." + 0, decimal_format.format(getMountedDamage()), + StatCollector.translateToLocal("attribute.weapon.mountedBonus"))); + } + } + + @Override + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); + + if (!(hit instanceof EntityLivingBase) || this instanceof ItemLance) { + return damage; + } + EntityLivingBase target = (EntityLivingBase) hit; + + if (wielder.isRiding() && tryPerformAbility(wielder, charge_cost)) { + ItemWaraxeMF.brutalise(wielder, target, 1.0F); + return damage + getMountedDamage(); + } + if (!wielder.isRiding() && wielder.isSprinting()) { + if (this instanceof ItemHalbeardMF) { + return Math.max(damage / 1.25F, 1.0F); + } else { + return damage * 1.25F; + } + } + return damage; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.8F); return true; } - + @Override - public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam) - { + public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam) { super.onParry(source, user, attacker, dam); - if(ConfigWeapon.useBalance && user instanceof EntityPlayer) - { - TacticalManager.throwPlayerOffBalance((EntityPlayer)user, getBalance(), rand.nextBoolean()); + if (ConfigWeapon.useBalance && user instanceof EntityPlayer) { + TacticalManager.throwPlayerOffBalance((EntityPlayer) user, getBalance(), rand.nextBoolean()); } } - - private float getMountedDamage() - { - if(material == ToolMaterial.WOOD) - { + + private float getMountedDamage() { + if (material == ToolMaterial.WOOD) { return 0; - } + } return 4F; } - + @Override - protected int getParryDamage(float dam) - { - return (int)dam; + protected int getParryDamage(float dam) { + return (int) dam; } + /** * Gets the angle the weapon can parry */ @Override - public float getParryAngleModifier(EntityLivingBase user) - { - return user.isSneaking() ? 1.2F: 0.85F; + public float getParryAngleModifier(EntityLivingBase user) { + return user.isSneaking() ? 1.2F : 0.85F; } + @Override - public float getBalance() - { + public float getBalance() { return 0.5F; } - + @Override - protected float getKnockbackStrength() - { + protected float getKnockbackStrength() { return 2.5F; } - + @Override - protected boolean canAnyMobParry() - { + protected boolean canAnyMobParry() { return false; } + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModSpear; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return spearParryTime; } + @Override - protected float getStaminaMod() - { + protected float getStaminaMod() { return spearStaminaCost; } + @Override - public WeaponClass getWeaponClass() - { + public WeaponClass getWeaponClass() { return WeaponClass.POLEARM; } + @Override - protected float[] getWeaponRatio(ItemStack implement) - { + protected float[] getWeaponRatio(ItemStack implement) { return piercingDamage; } + @Override - public boolean canCounter() - { + public boolean canCounter() { return false; } + @Override - public float getScale(ItemStack itemstack) - { + public float getScale(ItemStack itemstack) { return 3.0F; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java index cc358e06..ff9fe908 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java @@ -3,7 +3,6 @@ import java.util.Random; import minefantasy.mf2.api.weapon.WeaponClass; -import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -12,92 +11,90 @@ /** * @author Anonymous Productions */ -public class ItemSwordMF extends ItemWeaponMF -{ +public class ItemSwordMF extends ItemWeaponMF { private Random rand = new Random(); + /** - * Swords are the average weapon. They do regular damage and are extremely effective at parrying balancing both attack and defense + * Swords are the average weapon. They do regular damage and are extremely + * effective at parrying balancing both attack and defense * * These are for the average player */ - public ItemSwordMF(String name, ToolMaterial material, int rarity, float weight) - { - super(material, name, rarity, weight); - } - + public ItemSwordMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + @Override - public boolean canBlock() - { + public boolean canBlock() { return true; } - + /** * Determines if the weapon can parry */ @Override - public boolean canWeaponParry() - { + public boolean canWeaponParry() { return true; } - + @Override - protected int getParryDamage(float dam) - { + protected int getParryDamage(float dam) { return 1; } + /** * Gets the angle the weapon can parry */ @Override - public float getParryAngleModifier(EntityLivingBase user) - { + public float getParryAngleModifier(EntityLivingBase user) { return 1.0F; } + /** * Gets the multiplier for the parry threshold + * * @return */ @Override - public float getParryDamageModifier(EntityLivingBase user) - { + public float getParryDamageModifier(EntityLivingBase user) { return user instanceof EntityPlayer ? 2.0F : 1.5F; } + /** * Determines if the weapon can do those cool ninja evades + * * @return */ @Override - public boolean canWeaponEvade() - { + public boolean canWeaponEvade() { return true; } - + @Override - protected boolean canAnyMobParry() - { + protected boolean canAnyMobParry() { return true; } + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModSword; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return swordParryTime; } + @Override - protected float getStaminaMod() - { + protected float getStaminaMod() { return swordStaminaCost; } + @Override - public WeaponClass getWeaponClass() - { + public WeaponClass getWeaponClass() { return WeaponClass.BLADE; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemWaraxeMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemWaraxeMF.java index 6f063430..67b679c8 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemWaraxeMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemWaraxeMF.java @@ -16,201 +16,180 @@ /** * @author Anonymous Productions */ -public class ItemWaraxeMF extends ItemWeaponMF -{ - private float injuryChance = 0.05F; +public class ItemWaraxeMF extends ItemWeaponMF { + private float injuryChance = 0.05F; + /** - * The waraxe is for brutal players. It does more damage and a higher bonus when sprinting or - * jumping. Waraxes are pure damage + * The waraxe is for brutal players. It does more damage and a higher bonus when + * sprinting or jumping. Waraxes are pure damage * * These are for the brutal player */ - public ItemWaraxeMF(String name, ToolMaterial material, int rarity, float weight) - { - super(material, name, rarity, weight); - } - - @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, boolean properHit) - { - float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); - if(!(hit instanceof EntityLivingBase)) - { - return damage; - } - EntityLivingBase target = (EntityLivingBase)hit; - - if(wielder.isSprinting()) - { - if(wielder.fallDistance > 0 && canLunge(wielder) && tryPerformAbility(wielder, lunge_cost, !properHit, true, true, true))//LUNGE: 20 Points + public ItemWaraxeMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); + if (!(hit instanceof EntityLivingBase)) { + return damage; + } + EntityLivingBase target = (EntityLivingBase) hit; + + if (wielder.isSprinting()) { + if (wielder.fallDistance > 0 && canLunge(wielder) + && tryPerformAbility(wielder, lunge_cost, !properHit, true, true, true))// LUNGE: 20 Points { - return chargeAt(wielder, target, true, damage, properHit); - } - else if(wielder.onGround && getHeightGap(target, wielder) <= 0.5F && tryPerformAbility(wielder, charge_cost))//CHARGE: 10 points + return chargeAt(wielder, target, true, damage, properHit); + } else if (wielder.onGround && getHeightGap(target, wielder) <= 0.5F + && tryPerformAbility(wielder, charge_cost))// CHARGE: 10 points { return chargeAt(wielder, target, false, damage, properHit); } - } - else if(wielder.fallDistance > 0 && !wielder.isOnLadder() && tryPerformAbility(wielder, jump_cost))//JUMP: 2 points - { - if(properHit) - brutalise(wielder, target, 1.0F); - return damage * 1.25F; - } + } else if (wielder.fallDistance > 0 && !wielder.isOnLadder() && tryPerformAbility(wielder, jump_cost))// JUMP: 2 + // points + { + if (properHit) + brutalise(wielder, target, 1.0F); + return damage * 1.25F; + } return damage; } - private float chargeAt(EntityLivingBase entityHitting, EntityLivingBase entityHit, boolean lunge, float dam, boolean properHit) - { - if(properHit) - brutalise(entityHitting, entityHit, 1.0F); - - if(lunge) - { - float fallBonus = (Math.min(entityHitting.fallDistance, getMeleeDamage(entityHitting.getHeldItem())))/2F; - if(entityHit.onGround && !properHit) - { + private float chargeAt(EntityLivingBase entityHitting, EntityLivingBase entityHit, boolean lunge, float dam, + boolean properHit) { + if (properHit) + brutalise(entityHitting, entityHit, 1.0F); + + if (lunge) { + float fallBonus = (Math.min(entityHitting.fallDistance, getMeleeDamage(entityHitting.getHeldItem()))) / 2F; + if (entityHit.onGround && !properHit) { entityHitting.hurtResistantTime = 20; TacticalManager.knockbackEntity(entityHit, entityHitting, 4F, 0.5F); TacticalManager.lungeEntity(entityHitting, entityHit, 2F, 0.1F); } - if(properHit) - { - if(!entityHit.isPotionActive(Potion.moveSlowdown.id)) - { + if (properHit) { + if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 400, 3)); entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 1)); } - + entityHitting.fallDistance -= fallBonus; } - if(fallBonus > 0) - { + if (fallBonus > 0) { dam += fallBonus; } - } - else - { - if(properHit) - { - if(entityHitting.onGround && entityHit.onGround && !properHit) - { + } else { + if (properHit) { + if (entityHitting.onGround && entityHit.onGround && !properHit) { entityHitting.hurtResistantTime = 20; TacticalManager.lungeEntity(entityHitting, entityHit, 1F, 0.0F); } - if(properHit) - { - if(!entityHit.isPotionActive(Potion.moveSlowdown.id)) - { + if (properHit) { + if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 3)); entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 0)); } } } } - return dam *1.25F; - } - - @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) - { - if(rand.nextFloat() < injuryChance && dam > 0) - { - hit.getEntityData().setInteger(EventManagerMF.injuredNBT, 200 + rand.nextInt(600)); - } - super.onProperHit(user, weapon, hit, dam); - } + return dam * 1.25F; + } + + @Override + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (rand.nextFloat() < injuryChance && dam > 0) { + hit.getEntityData().setInteger(EventManagerMF.injuredNBT, 200 + rand.nextInt(600)); + } + super.onProperHit(user, weapon, hit, dam); + } + /** * Determines if sprint-jump lunges work */ - private boolean canLunge(EntityLivingBase entityHitting) - { + private boolean canLunge(EntityLivingBase entityHitting) { return true; } - private double getHeightGap(EntityLivingBase entityHit, EntityLivingBase entityHitting) - { + private double getHeightGap(EntityLivingBase entityHit, EntityLivingBase entityHitting) { double a = entityHitting.posY - entityHit.posY; return Math.max(a, -a); } + @Override - public float getDigSpeed(ItemStack itemstack, Block block, int metadata) - { - if(Items.iron_axe.getDigSpeed(itemstack, block, metadata) > 2.0F) - { - return material.getEfficiencyOnProperMaterial()*0.75F; + public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { + if (Items.iron_axe.getDigSpeed(itemstack, block, metadata) > 2.0F) { + return material.getEfficiencyOnProperMaterial() * 0.75F; } return super.getDigSpeed(itemstack, block, metadata); } - public static void brutalise(EntityLivingBase entityHitting, EntityLivingBase entityHit, float power) - { - if(!entityHit.worldObj.isRemote) - { - if(entityHitting instanceof EntityPlayer) - { - ((EntityPlayer)entityHitting).onCriticalHit(entityHit); - } + public static void brutalise(EntityLivingBase entityHitting, EntityLivingBase entityHit, float power) { + if (!entityHit.worldObj.isRemote) { + if (entityHitting instanceof EntityPlayer) { + ((EntityPlayer) entityHitting).onCriticalHit(entityHit); + } } } + @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) - { + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 1.0F); return true; } + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModAxe; } + @Override - public float getDamageModifier() - { + public float getDamageModifier() { return damageModAxe; } - + @Override - protected float[] getWeaponRatio(ItemStack implement) - { + protected float[] getWeaponRatio(ItemStack implement) { return hackingDamage; } + @Override - public float getPenetrationLevel(Object implement) - { + public float getPenetrationLevel(Object implement) { return axeAPModifier; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return axeParryTime; } + @Override - protected float getStaminaMod() - { + protected float getStaminaMod() { return axeStaminaCost; } + @Override - public WeaponClass getWeaponClass() - { + public WeaponClass getWeaponClass() { return WeaponClass.AXE; } + @Override - public boolean canCounter() - { + public boolean canCounter() { return true; } + @Override - public float[] getCounterRatio() - { + public float[] getCounterRatio() { return piercingDamage; } + @Override - public float getCounterDamage() - { + public float getCounterDamage() { return 1.0F; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemWarhammerMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemWarhammerMF.java index 92ff32b9..3ce9d070 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemWarhammerMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemWarhammerMF.java @@ -13,104 +13,94 @@ /** * @author Anonymous Productions */ -public class ItemWarhammerMF extends ItemHeavyWeaponMF -{ +public class ItemWarhammerMF extends ItemHeavyWeaponMF { private float stunChance = 0.20F; - + /** - * Warhammers are heavy counterparts to maces: They have more damage and knockback + * Warhammers are heavy counterparts to maces: They have more damage and + * knockback * * They can also strike heavy forces, being rather satisfying */ - public ItemWarhammerMF(String name, ToolMaterial material, int rarity, float weight) - { - super(material, name, rarity, weight); - this.setMaxDamage((int) (getMaxDamage()*2F)); - } + public ItemWarhammerMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + this.setMaxDamage((int) (getMaxDamage() * 2F)); + } @Override - protected int getParryDamage(float dam) - { - return (int)(dam*2F); + protected int getParryDamage(float dam) { + return (int) (dam * 2F); } - + @Override - public float getDigSpeed(ItemStack itemstack, Block block, int metadata) - { - return super.getDigSpeed(itemstack, block, metadata)*1.5F; + public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { + return super.getDigSpeed(itemstack, block, metadata) * 1.5F; } @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) - { - if(!user.worldObj.isRemote && user.getRNG().nextInt(5) == 0) - { + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (!user.worldObj.isRemote && user.getRNG().nextInt(5) == 0) { hit.worldObj.createExplosion(user, hit.posX, hit.posY, hit.posZ, 0.0F, false); TacticalManager.knockbackEntity(hit, user, 2.0F, 1.5F); - if(hit instanceof EntityLivingBase) - { - ((EntityLivingBase)hit).addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 10)); - ((EntityLivingBase)hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 1)); + if (hit instanceof EntityLivingBase) { + ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 10)); + ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 1)); } } super.onProperHit(user, weapon, hit, dam); } + @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) - { + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.75F); return true; } - + @Override - protected float getKnockbackStrength() - { + protected float getKnockbackStrength() { return 2.0F; } + @Override - protected float getStaminaMod() - { - return heavyStaminaCost*maceStaminaCost; + protected float getStaminaMod() { + return heavyStaminaCost * maceStaminaCost; } + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModMace; } - + @Override - public float getDamageModifier() - { + public float getDamageModifier() { return damageModMace; } - + @Override - protected float[] getWeaponRatio(ItemStack implement) - { + protected float[] getWeaponRatio(ItemStack implement) { return crushingDamage; } + /** * gets the time after being hit your guard will be let down */ @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return maceParryTime + heavyParryTime; } + @Override - public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) - { + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { return 80; } @Override - public WeaponClass getWeaponClass() - { + public WeaponClass getWeaponClass() { return WeaponClass.BLUNT; } + @Override - public boolean canCounter() - { + public boolean canCounter() { return false; } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java index 28b12c4e..c8ce84b8 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java @@ -73,837 +73,745 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; //Made this extend the sword class (allows them to be enchanted) -public abstract class ItemWeaponMF extends ItemSword implements ISpecialDesign, IPowerAttack, IDamageType, IKnockbackWeapon, IWeaponSpeed, IHeldStaminaItem, IStaminaWeapon, IBattlegearWeapon, IToolMaterial, IWeightedWeapon, IParryable, ISpecialEffect, IDamageModifier, IWeaponClass, IRackItem -{ - public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); +public abstract class ItemWeaponMF extends ItemSword implements ISpecialDesign, IPowerAttack, IDamageType, + IKnockbackWeapon, IWeaponSpeed, IHeldStaminaItem, IStaminaWeapon, IBattlegearWeapon, IToolMaterial, + IWeightedWeapon, IParryable, ISpecialEffect, IDamageModifier, IWeaponClass, IRackItem { + public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); - protected final ToolMaterial material; + protected final ToolMaterial material; protected String name; /** * The damage of the weapon without material modifiers */ private float baseDamage; protected Random rand = new Random(); - - + protected float lunge_cost = 25; protected float charge_cost = 10; protected float jump_cost = 2; - + protected float cleave_cost = 40; - + /** * The base file for Weapons in MineFantasy * - * Size Varients, (Normal and Heavy) - * Normal weapons are as is, regular damage and weight - * Heavy weapons do more damage, exhaust more and have balance offset (+50% dam) + * Size Varients, (Normal and Heavy) Normal weapons are as is, regular damage + * and weight Heavy weapons do more damage, exhaust more and have balance offset + * (+50% dam) * - * Weapon Types: - * Blade: Parry Defensive, average damage and speed - * Axe: Brutal Offensive, slower than sword, more damage, Good against Armour - * Blunt: Simple Offensive, slower than axe, more damage, Good against Medium Armour - * Polearm: Ranged Defensive, Good against Heavy Armour - * Lightblade: Fast Offensive, Better against Unarmoured + * Weapon Types: Blade: Parry Defensive, average damage and speed Axe: Brutal + * Offensive, slower than sword, more damage, Good against Armour Blunt: Simple + * Offensive, slower than axe, more damage, Good against Medium Armour Polearm: + * Ranged Defensive, Good against Heavy Armour Lightblade: Fast Offensive, + * Better against Unarmoured */ - public ItemWeaponMF(ToolMaterial material, String named, int rarity, float weight) - { + public ItemWeaponMF(ToolMaterial material, String named, int rarity, float weight) { super(material); materialWeight = weight; itemRarity = rarity; - //May be unsafe, but will allow others to add weapons using custom materials (also more efficent) + // May be unsafe, but will allow others to add weapons using custom materials + // (also more efficent) name = named; this.material = material; setCreativeTab(CreativeTabMF.tabOldTools); - setTextureName("minefantasy2:Weapon/"+name); + setTextureName("minefantasy2:Weapon/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); - + this.baseDamage = 4 + getDamageModifier(); - - if(material == ToolMaterial.WOOD) - { + + if (material == ToolMaterial.WOOD) { baseDamage = 0F; } - if(isHeavyWeapon()) - { + if (isHeavyWeapon()) { WeaponRegistry.addTwoHanded(new ItemStack(this)); - } - else - { + } else { WeaponRegistry.addDualWeapon(new ItemStack(this)); } } - + /** * Gets the amount more damaged added to each item */ - public float getDamageModifier() - { + public float getDamageModifier() { return 0; } - + /** * Determines if the item can block/parry */ - public boolean canBlock() - { + public boolean canBlock() { return true; } + /** * Determines if the weapon can parry */ - public boolean canWeaponParry() - { + public boolean canWeaponParry() { return true; } + /** * Gets the angle the weapon can parry */ - public float getParryAngleModifier(EntityLivingBase user) - { + public float getParryAngleModifier(EntityLivingBase user) { return 0.75F; } + /** * Gets the multiplier for the parry threshold + * * @return */ - public float getParryDamageModifier(EntityLivingBase user) - { + public float getParryDamageModifier(EntityLivingBase user) { return 1.0F; } + /** * Determines if the weapon can do those cool ninja evades + * * @return */ - public boolean canWeaponEvade() - { + public boolean canWeaponEvade() { return true; } - - //MECHANICS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - + + // MECHANICS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + @Override - public ToolMaterial getMaterial() - { + public ToolMaterial getMaterial() { return this.material; } - + @SideOnly(Side.CLIENT) @Override - public void addInformation(ItemStack weapon, EntityPlayer user, List list, boolean extra) - { - super.addInformation(weapon, user, list, extra); - - if(material == ToolMaterial.WOOD) - { - return; - } - - if(isCustom) - { - CustomToolHelper.addInformation(weapon, list); - } - - if(this instanceof IExtendedReachWeapon || this instanceof IPenetrateWeapon || this instanceof IHitTimeModifier){ - list.add(""); - - if(this instanceof IPenetrateWeapon) - { - list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted("attribute.modifier.plus."+ 1, decimal_format.format(getAPDamText()), StatCollector.translateToLocal("attribute.weapon.penetrateArmor"))); - } - - if(this instanceof IExtendedReachWeapon){ - float reach = ((IExtendedReachWeapon)this).getReachModifierInBlocks(weapon); - - if(reach > 0){ - list.add(EnumChatFormatting.DARK_GREEN+ - StatCollector.translateToLocalFormatted("attribute.modifier.plus."+ 0, - decimal_format.format(reach), - StatCollector.translateToLocal("attribute.weapon.extendedReach"))); - }else{ - list.add(EnumChatFormatting.RED+ - StatCollector.translateToLocalFormatted("attribute.modifier.take."+ 0, - decimal_format.format(-1 * reach), - StatCollector.translateToLocal("attribute.weapon.extendedReach"))); - } - } - - if(this instanceof IHitTimeModifier){ - int hitMod = ((IHitTimeModifier)this).getHitTime(weapon, null); - if(hitMod > 0){ - list.add(EnumChatFormatting.RED+ - StatCollector.translateToLocalFormatted("attribute.modifier.take."+ 1, - decimal_format.format(hitMod / 10F * 100), - StatCollector.translateToLocal("attribute.weapon.attackSpeed"))); - }else{ - list.add(EnumChatFormatting.DARK_GREEN+ - StatCollector.translateToLocalFormatted("attribute.modifier.plus."+ 1, - decimal_format.format(-(float)hitMod / 10F * 100), - StatCollector.translateToLocal("attribute.weapon.attackSpeed"))); - } - } - - if(this instanceof IBackStabbable){ - list.add(EnumChatFormatting.GOLD+ - StatCollector.translateToLocal("attribute.weapon.backstab")); - - } - } - } - - protected float getAPDamText() - { + public void addInformation(ItemStack weapon, EntityPlayer user, List list, boolean extra) { + super.addInformation(weapon, user, list, extra); + + if (material == ToolMaterial.WOOD) { + return; + } + + if (isCustom) { + CustomToolHelper.addInformation(weapon, list); + } + + if (this instanceof IExtendedReachWeapon || this instanceof IPenetrateWeapon + || this instanceof IHitTimeModifier) { + list.add(""); + + if (this instanceof IPenetrateWeapon) { + list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( + "attribute.modifier.plus." + 1, decimal_format.format(getAPDamText()), + StatCollector.translateToLocal("attribute.weapon.penetrateArmor"))); + } + + if (this instanceof IExtendedReachWeapon) { + float reach = ((IExtendedReachWeapon) this).getReachModifierInBlocks(weapon); + + if (reach > 0) { + list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( + "attribute.modifier.plus." + 0, decimal_format.format(reach), + StatCollector.translateToLocal("attribute.weapon.extendedReach"))); + } else { + list.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted( + "attribute.modifier.take." + 0, decimal_format.format(-1 * reach), + StatCollector.translateToLocal("attribute.weapon.extendedReach"))); + } + } + + if (this instanceof IHitTimeModifier) { + int hitMod = ((IHitTimeModifier) this).getHitTime(weapon, null); + if (hitMod > 0) { + list.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted( + "attribute.modifier.take." + 1, decimal_format.format(hitMod / 10F * 100), + StatCollector.translateToLocal("attribute.weapon.attackSpeed"))); + } else { + list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( + "attribute.modifier.plus." + 1, decimal_format.format(-(float) hitMod / 10F * 100), + StatCollector.translateToLocal("attribute.weapon.attackSpeed"))); + } + } + + if (this instanceof IBackStabbable) { + list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("attribute.weapon.backstab")); + + } + } + } + + protected float getAPDamText() { return 0F; } @Override - public boolean sheatheOnBack(ItemStack item) - { + public boolean sheatheOnBack(ItemStack item) { return isHeavyWeapon(); } - - public boolean isHeavyWeapon() - { + + public boolean isHeavyWeapon() { return false; } - + @Override - public boolean isOffhandHandDual(ItemStack off) - { + public boolean isOffhandHandDual(ItemStack off) { return true; } @Override - public boolean offhandAttackEntity(OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) - { + public boolean offhandAttackEntity(OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) { return true; } @Override - public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) - { + public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { return true; } @Override - public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) - { + public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { return true; } @Override - public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem) - { + public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem) { } @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) - { + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { return offhand != null; } - protected void addXp(EntityLivingBase user, int chance) - { - if(ConfigWeapon.xpTrain && user instanceof EntityPlayer && material == ToolMaterial.WOOD) - { - if(chance == 0 || user.getRNG().nextInt(chance) == 0) - { - ((EntityPlayer)user).addExperience(1); + + protected void addXp(EntityLivingBase user, int chance) { + if (ConfigWeapon.xpTrain && user instanceof EntityPlayer && material == ToolMaterial.WOOD) { + if (chance == 0 || user.getRNG().nextInt(chance) == 0) { + ((EntityPlayer) user).addExperience(1); + } + } + } + + public static int getParry(ItemStack item) { + if (item.hasTagCompound()) { + if (item.getTagCompound().hasKey("ParryAnimation")) { + return item.getTagCompound().getInteger("ParryAnimation"); } } - } - - public static int getParry(ItemStack item) - { - if(item.hasTagCompound()) - { - if(item.getTagCompound().hasKey("ParryAnimation")) - { - return item.getTagCompound().getInteger("ParryAnimation"); - } - } - return -1; - } - - public static void setParry(ItemStack item, int i) - { - NBTTagCompound nbt = getOrCreateNBT(item); - - nbt.setInteger("ParryAnimation", i); - } - - public static NBTTagCompound getOrCreateNBT(ItemStack item) - { - if(!item.hasTagCompound()) - { + return -1; + } + + public static void setParry(ItemStack item, int i) { + NBTTagCompound nbt = getOrCreateNBT(item); + + nbt.setInteger("ParryAnimation", i); + } + + public static NBTTagCompound getOrCreateNBT(ItemStack item) { + if (!item.hasTagCompound()) { item.setTagCompound(new NBTTagCompound()); } return item.getTagCompound(); } + @Override - public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam) - { + public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam) { ItemStack weapon = user.getHeldItem(); int pd = getParryDamage(dam); - if(pd > 0) - { + if (pd > 0) { weapon.damageItem(pd, user); } - + addXp(user, 30); } /** * Gets the amount of durability lost when parrying */ - protected int getParryDamage(float dam) - { - return (int)dam; + protected int getParryDamage(float dam) { + return (int) dam; } @Override - public float getMaxDamageParry(EntityLivingBase user, ItemStack weapon) - { + public float getMaxDamageParry(EntityLivingBase user, ItemStack weapon) { float mod = 1.0F; - return getMeleeDamage(weapon)*getParryDamageModifier(user)*mod; + return getMeleeDamage(weapon) * getParryDamageModifier(user) * mod; } - + @Override - public float getParryAngle(DamageSource source, EntityLivingBase blocker, ItemStack item) - { + public float getParryAngle(DamageSource source, EntityLivingBase blocker, ItemStack item) { float base = 30; - - if(source.isProjectile()) - { - if(!(blocker instanceof EntityPlayer)) - { + + if (source.isProjectile()) { + if (!(blocker instanceof EntityPlayer)) { base = 0F; } base *= 0.25F; } - if(blocker instanceof EntityZombie && !(blocker instanceof EntityPigZombie)) - { + if (blocker instanceof EntityZombie && !(blocker instanceof EntityPigZombie)) { base *= 2; } return base * getParryAngleModifier(blocker); } @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) - { - if(ConfigWeapon.xpTrain && user instanceof EntityLivingBase && material == ToolMaterial.WOOD) - { + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (ConfigWeapon.xpTrain && user instanceof EntityLivingBase && material == ToolMaterial.WOOD) { addXp(user, 50); } } - protected float getKnockbackStrength() - { + protected float getKnockbackStrength() { return 0; } @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) - { - if(material == ToolMaterial.WOOD) - { + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + if (material == ToolMaterial.WOOD) { blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 1.0F); return true; } - if(material == BaseMaterialMF.stone.getToolConversion()) - { + if (material == BaseMaterialMF.stone.getToolConversion()) { blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.5F); return true; } return false; } + @Override - public boolean canParry(DamageSource source, EntityLivingBase blocker, ItemStack item) - { + public boolean canParry(DamageSource source, EntityLivingBase blocker, ItemStack item) { return canWeaponParry(); } + @Override - public float getBalance(EntityLivingBase user) - { + public float getBalance(EntityLivingBase user) { return getBalance(); } - public float getBalance() - { + + public float getBalance() { return 0.0F; } - + @Override - public float getStaminaDrainOnHit(EntityLivingBase user, ItemStack item) - { + public float getStaminaDrainOnHit(EntityLivingBase user, ItemStack item) { return 2F * getStaminaMod() * getWeightModifier(item); } - protected float getStaminaMod() - { + protected float getStaminaMod() { return 1.0F; } - - public static boolean canPerformAbility(EntityLivingBase user, float points) - { + + public static boolean canPerformAbility(EntityLivingBase user, float points) { return tryPerformAbility(user, points, false, true, true, false); } - public static boolean tryPerformAbility(EntityLivingBase user, float points) - { + + public static boolean tryPerformAbility(EntityLivingBase user, float points) { return tryPerformAbility(user, points, true, true); } - - public static boolean tryPerformAbility(EntityLivingBase user, float points, boolean armour, boolean weapon) - { + + public static boolean tryPerformAbility(EntityLivingBase user, float points, boolean armour, boolean weapon) { return tryPerformAbility(user, points, true, armour, weapon, true); } - - public static boolean tryPerformAbility(EntityLivingBase user, float points, boolean flash, boolean armour, boolean weapon, boolean takePoints) - { - if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) - { + + public static boolean tryPerformAbility(EntityLivingBase user, float points, boolean flash, boolean armour, + boolean weapon, boolean takePoints) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { points *= StaminaBar.getBaseDecayModifier(user, armour, weapon); - if(StaminaBar.isStaminaAvailable(user, points, flash)) - { - if(takePoints && !user.worldObj.isRemote) - { + if (StaminaBar.isStaminaAvailable(user, points, flash)) { + if (takePoints && !user.worldObj.isRemote) { applyFatigue(user, points); } return true; - } - else - { + } else { return false; } } return true; } - public static void applyFatigue(EntityLivingBase user, float points) - { + + public static void applyFatigue(EntityLivingBase user, float points) { applyFatigue(user, points, 50F); } - public static void applyFatigue(EntityLivingBase user, float points, float pause) - { - if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) - { + + public static void applyFatigue(EntityLivingBase user, float points, float pause) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { float stam = StaminaBar.getStaminaValue(user); - if(stam > 0) - { + if (stam > 0) { StaminaBar.modifyStaminaValue(user, -points); } StaminaBar.setIdleTime(user, pause * StaminaBar.pauseModifier); - - if(!user.worldObj.isRemote) - { + + if (!user.worldObj.isRemote) { MFLogUtil.logDebug("Spent " + points + " Stamina Pts"); } } } + @Override - public float getDecayMod(EntityLivingBase user, ItemStack item) - { + public float getDecayMod(EntityLivingBase user, ItemStack item) { return getDecayModifier(user, item) * getWeightModifier(item); } - + /** * The Modifier for the weapon */ - public float getDecayModifier(EntityLivingBase user, ItemStack item) - { + public float getDecayModifier(EntityLivingBase user, ItemStack item) { return 1.0F; } - + @Override - public float getRegenModifier(EntityLivingBase user, ItemStack item) - { + public float getRegenModifier(EntityLivingBase user, ItemStack item) { return 1.0F; } @Override - public float getIdleModifier(EntityLivingBase user, ItemStack item) - { + public float getIdleModifier(EntityLivingBase user, ItemStack item) { return 1.0F; } - - protected void hurtInRange(EntityLivingBase user, double range) - { + + protected void hurtInRange(EntityLivingBase user, double range) { AxisAlignedBB bb = user.boundingBox.expand(range, range, range); - Listhurt = user.worldObj.getEntitiesWithinAABBExcludingEntity(user, bb); + List hurt = user.worldObj.getEntitiesWithinAABBExcludingEntity(user, bb); Iterator list = hurt.iterator(); - while(list.hasNext()) - { + while (list.hasNext()) { Entity hit = (Entity) list.next(); - - if(user.canEntityBeSeen(hit)) - { + + if (user.canEntityBeSeen(hit)) { TacticalManager.knockbackEntity(hit, user, 1.5F, 0.2F); - if(StaminaBar.isSystemActive) - { + if (StaminaBar.isSystemActive) { StaminaBar.setIdleTime(user, 60); } - if(hit instanceof EntityLivingBase) - { - for(int a = 0; a < 4; a ++) - { - hit.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(Blocks.redstone_block) + "_0", hit.posX, hit.posY+hit.getEyeHeight(), hit.posZ, rand.nextDouble()/2D, rand.nextDouble()/2D, rand.nextDouble()/2D); + if (hit instanceof EntityLivingBase) { + for (int a = 0; a < 4; a++) { + hit.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(Blocks.redstone_block) + "_0", + hit.posX, hit.posY + hit.getEyeHeight(), hit.posZ, rand.nextDouble() / 2D, + rand.nextDouble() / 2D, rand.nextDouble() / 2D); } ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 0)); } } } } + @Override - public boolean canUserParry(EntityLivingBase user) - { - return user instanceof EntityPlayer || user instanceof ISpecialCombatMob || (canAnyMobParry() || rand.nextFloat() < 0.20F); + public boolean canUserParry(EntityLivingBase user) { + return user instanceof EntityPlayer || user instanceof ISpecialCombatMob + || (canAnyMobParry() || rand.nextFloat() < 0.20F); } - protected boolean canAnyMobParry() - { + protected boolean canAnyMobParry() { return false; } - + @Override - public float getAddedKnockback(EntityLivingBase user, ItemStack item) - { + public float getAddedKnockback(EntityLivingBase user, ItemStack item) { return getKnockbackStrength(); } - + @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) - { + public int modifyHitTime(EntityLivingBase user, ItemStack item) { return 0; } - + @Override - public float[] getDamageRatio(Object... implement) - { - if(implement.length > 1) - { - return getWeaponRatio((ItemStack)implement[0], (EntityLivingBase)implement[1]); + public float[] getDamageRatio(Object... implement) { + if (implement.length > 1) { + return getWeaponRatio((ItemStack) implement[0], (EntityLivingBase) implement[1]); } - return getWeaponRatio((ItemStack)implement[0]); + return getWeaponRatio((ItemStack) implement[0]); } + @Override - public float getPenetrationLevel(Object implement) - { - ItemStack item = (ItemStack)implement; + public float getPenetrationLevel(Object implement) { + ItemStack item = (ItemStack) implement; return 0F; } - - protected float[] getWeaponRatio(ItemStack implement) - { - return new float[]{1F, 0F, 0F}; + + protected float[] getWeaponRatio(ItemStack implement) { + return new float[] { 1F, 0F, 0F }; } - protected float[] getWeaponRatio(ItemStack implement, EntityLivingBase user) - { - if(canCounter(user, implement) == 1) - { + + protected float[] getWeaponRatio(ItemStack implement, EntityLivingBase user) { + if (canCounter(user, implement) == 1) { return getCounterRatio(); } return getWeaponRatio(implement); } - - protected float[] slashingDamage = new float[]{1F, 0F, 0F}; - protected float[] crushingDamage = new float[]{0F, 1F, 0F}; - - protected float[] hackingDamage = new float[]{4F, 1F, 0F}; - protected float[] hvyHackingDamage = new float[]{3F, 1F, 0F}; - - protected float[] piercingDamage = new float[]{0F, 0F, 1F}; - protected float[] hvyPiercingDamage = new float[]{0F, 1F, 9F}; - protected float[] hvySlashingDamage = new float[]{9F, 1F, 0F}; - private float materialWeight = 1.0F; - + + protected float[] slashingDamage = new float[] { 1F, 0F, 0F }; + protected float[] crushingDamage = new float[] { 0F, 1F, 0F }; + + protected float[] hackingDamage = new float[] { 4F, 1F, 0F }; + protected float[] hvyHackingDamage = new float[] { 3F, 1F, 0F }; + + protected float[] piercingDamage = new float[] { 0F, 0F, 1F }; + protected float[] hvyPiercingDamage = new float[] { 0F, 1F, 9F }; + protected float[] hvySlashingDamage = new float[] { 9F, 1F, 0F }; + private float materialWeight = 1.0F; + protected static int speedModHeavy = 5; - + protected static int speedModSword = 0; protected static int speedModAxe = 1; protected static int speedModMace = 2; protected static int speedModKatana = -5; protected static int speedModSpear = 2; - + protected static float damageModSword = 0.0F; protected static float damageModAxe = 0.5F; protected static float damageModMace = 1.0F; - + public static float axeAPModifier = -0.1F; - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) - { - if(isCustom) - { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if(MineFantasyII.isDebug() || customMat.getItem() != null) - { - list.add(this.construct(customMat.name,"OakWood")); - } - } - return; - } - - if(this instanceof ItemKnifeMF) - { + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + return; + } + + if (this instanceof ItemKnifeMF) { super.getSubItems(item, tab, list); return; } - if(this != ToolListMF.swordTraining) - { + if (this != ToolListMF.swordTraining) { return; } list.add(new ItemStack(ToolListMF.swordTraining)); list.add(new ItemStack(ToolListMF.waraxeTraining)); list.add(new ItemStack(ToolListMF.maceTraining)); list.add(new ItemStack(ToolListMF.spearTraining)); - + list.add(new ItemStack(ToolListMF.swordStone)); list.add(new ItemStack(ToolListMF.waraxeStone)); list.add(new ItemStack(ToolListMF.maceStone)); list.add(new ItemStack(ToolListMF.spearStone)); - } - - private void addSet(List list, Item[] items) - { - for(Item item:items) - { + } + + private void addSet(List list, Item[] items) { + for (Item item : items) { list.add(new ItemStack(item)); } } @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, boolean properHit) - { - if(canCounter(wielder, item) == 1) - { + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + if (canCounter(wielder, item) == 1) { initialDam *= getCounterDamage(); - } - if(canCounter(wielder, item) == 0) - { + } + if (canCounter(wielder, item) == 0) { initialDam *= getFailCounterDamage(); - } + } return initialDam; } - - + @Override - public float getParryStaminaDecay(DamageSource source, ItemStack weapon) - { + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { return 1.0F; } + @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) - { + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return 15; } + @Override - public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) - { + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { return 30; } + @Override - public void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit) - { - + public void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit) { + } - - public boolean canCounter() - { + + public boolean canCounter() { return true; } - public float[] getCounterRatio() - { - return new float[]{0, 0, 1}; + + public float[] getCounterRatio() { + return new float[] { 0, 0, 1 }; } - public float getCounterDamage() - { + + public float getCounterDamage() { return 0.75F; } - public float getFailCounterDamage() - { + + public float getFailCounterDamage() { return 0.5F; } + /* - * 0 = Cannot Counter - * 1 = Can Counter - * -1 = Not Possible + * 0 = Cannot Counter 1 = Can Counter -1 = Not Possible */ - private int canCounter(EntityLivingBase user, ItemStack item) - { - if(user != null && user instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer)user; - if(getParry(item) > 0) - { - if(ResearchLogic.hasInfoUnlocked(player, "counteratt")) - { - return 1;//Can + private int canCounter(EntityLivingBase user, ItemStack item) { + if (user != null && user instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) user; + if (getParry(item) > 0) { + if (ResearchLogic.hasInfoUnlocked(player, "counteratt")) { + return 1;// Can } - return 0;//Cannot + return 0;// Cannot } } - return -1;//N/A + return -1;// N/A } + protected int defParryTime = 15; protected int swordParryTime = 10; protected int axeParryTime = 15; protected int maceParryTime = 15; protected int daggerParryTime = 5; protected int spearParryTime = 20; - + protected int heavyParryTime = 10; - + protected float heavyParryFatigue = 2.0F; - + protected float daggerStaminaCost = 0.50F; - protected float swordStaminaCost = 1.00F; + protected float swordStaminaCost = 1.00F; protected float katanaStaminaCost = 0.75F; - protected float axeStaminaCost = 1.20F; - protected float maceStaminaCost = 1.30F; - protected float spearStaminaCost = 1.40F; - - protected float heavyStaminaCost = 1.50F; - - - //===================================================== CUSTOM START =============================================================\\ + protected float axeStaminaCost = 1.20F; + protected float maceStaminaCost = 1.30F; + protected float spearStaminaCost = 1.40F; + + protected float heavyStaminaCost = 1.50F; + + // ===================================================== CUSTOM START + // =============================================================\\ private boolean isCustom = false; - public ItemWeaponMF setCustom(String s) - { - canRepair = false; - setTextureName("minefantasy2:custom/weapon/"+s+"/"+name); - designType = s; - isCustom = true; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) - { + + public ItemWeaponMF setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/weapon/" + s + "/" + name); + designType = s; + isCustom = true; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - - public ItemWeaponMF modifyBaseDamage(float mod) - { - this.baseDamage = Math.max(1.0F, baseDamage + mod); - return this; - } - public ItemWeaponMF setBaseDamage(float baseDamage) - { - this.baseDamage = baseDamage; - return this; - } + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + public ItemWeaponMF modifyBaseDamage(float mod) { + this.baseDamage = Math.max(1.0F, baseDamage + mod); + return this; + } + + public ItemWeaponMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + /** * Gets a stack-sensitive value for the melee dmg */ - protected float getMeleeDamage(ItemStack item) - { - return baseDamage + CustomToolHelper.getMeleeDamage(item, material.getDamageVsEntity()); + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, material.getDamageVsEntity()); } - protected float getWeightModifier(ItemStack stack) - { - return CustomToolHelper.getWeightModifier(stack, materialWeight); + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, materialWeight); } - private IIcon detailTex = null; + + private IIcon detailTex = null; private IIcon haftTex = null; - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) - { - if(isCustom) - { - haftTex = reg.registerIcon(this.getIconString()+"_haft"); - detailTex = reg.registerIcon(this.getIconString()+"_detail"); - - } - super.registerIcons(reg); - } - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return isCustom; - } - //Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) - { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) - { - if(isCustom && pass == 1 && haftTex != null) - { - return haftTex; - } - if(isCustom && pass == 2 && detailTex != null) - { - return detailTex; - } - return super.getIcon(stack, pass); - } - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) - { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - @Override - public int getMaxDamage(ItemStack stack) - { + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } - public ItemStack construct(String main, String haft) - { + + public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } + protected int itemRarity; - @Override - public EnumRarity getRarity(ItemStack item) - { - return CustomToolHelper.getRarity(item, itemRarity); - } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) - { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - - //====================================================== CUSTOM END ==============================================================\\ - - public ItemWeaponMF setTab(CreativeTabs tab) - { + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + // ====================================================== CUSTOM END + // ==============================================================\\ + + public ItemWeaponMF setTab(CreativeTabs tab) { setCreativeTab(tab); return this; } - + @Override - public float getScale(ItemStack itemstack) - { + public float getScale(ItemStack itemstack) { return 1.0F; } @Override - public float getOffsetX(ItemStack itemstack) - { + public float getOffsetX(ItemStack itemstack) { return 0; } @Override - public float getOffsetY(ItemStack itemstack) - { - if(this.getScale(itemstack) > 1.5F) - { + public float getOffsetY(ItemStack itemstack) { + if (this.getScale(itemstack) > 1.5F) { return 0.5F; } return 0; @@ -913,36 +821,33 @@ public float getOffsetY(ItemStack itemstack) public float getOffsetZ(ItemStack itemstack) { return 0; } - + @Override - public float getRotationOffset(ItemStack itemstack) - { + public float getRotationOffset(ItemStack itemstack) { return 0; } @Override - public boolean canHang(TileEntityRack rack, ItemStack item, int slot) - { + public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { float scale = this.getScale(item); - if(scale > 1.5F && !rack.hasRackBelow(slot)) - { + if (scale > 1.5F && !rack.hasRackBelow(slot)) { return false; } - if(scale > 2.5F && !rack.hasRackAbove(slot)) - { + if (scale > 2.5F && !rack.hasRackAbove(slot)) { return false; } return true; } + @Override public boolean isSpecialRender(ItemStack item) { return false; } - + public String designType = "standard"; + @Override - public String getDesign(ItemStack item) - { + public String getDesign(ItemStack item) { return designType; } } diff --git a/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java b/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java index 95dd28c1..0cd924fc 100644 --- a/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java +++ b/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java @@ -13,19 +13,16 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class ArtefactListMF -{ - public static void init() - { - ((ItemArtefact)ComponentListMF.artefacts).registerAll(); +public class ArtefactListMF { + public static void init() { + ((ItemArtefact) ComponentListMF.artefacts).registerAll(); addArtisanry(); addConstruction(); addProvisioning(); addEngineering(); } - private static void addEngineering() - { + private static void addEngineering() { add(KnowledgeListMF.blackpowder, ComponentListMF.nitre, ComponentListMF.sulfur, Items.coal, Items.gunpowder); add(KnowledgeListMF.advblackpowder, Items.glowstone_dust, Items.redstone); add(KnowledgeListMF.tungsten, ComponentListMF.oreTungsten, BlockListMF.oreTungsten); @@ -47,7 +44,7 @@ private static void addEngineering() add(KnowledgeListMF.mineObsidian, Blocks.obsidian); add(KnowledgeListMF.bombCrystal, Items.diamond); add(KnowledgeListMF.mineCrystal, Items.diamond); - + add(KnowledgeListMF.crossbows, Items.string, ComponentListMF.plank, Blocks.lever); add(KnowledgeListMF.crossShaftAdvanced, ComponentListMF.tungsten_gears); add(KnowledgeListMF.crossHeadAdvanced, ComponentListMF.tungsten_gears); @@ -56,32 +53,31 @@ private static void addEngineering() add(KnowledgeListMF.crossBayonet, CustomToolListMF.standard_dagger); } - private static void addProvisioning() - { + private static void addProvisioning() { add(KnowledgeListMF.jerky, FoodListMF.generic_meat_uncooked); add(KnowledgeListMF.saussage, FoodListMF.generic_meat_uncooked, FoodListMF.guts); add(KnowledgeListMF.sandwitch, FoodListMF.generic_meat_uncooked, FoodListMF.cheese_slice, Items.bread); add(KnowledgeListMF.sandwitchBig, FoodListMF.generic_meat_uncooked, FoodListMF.cheese_slice, Items.bread); - + add(KnowledgeListMF.meatpie, FoodListMF.generic_meat_uncooked, FoodListMF.pastry); add(KnowledgeListMF.shepardpie, FoodListMF.generic_meat_uncooked, Items.potato, FoodListMF.pastry); add(KnowledgeListMF.berrypie, FoodListMF.berries, FoodListMF.pastry); add(KnowledgeListMF.applepie, Items.apple, FoodListMF.pastry); - + add(KnowledgeListMF.sweetroll, Items.sugar, FoodListMF.berries, FoodListMF.sugarpot); add(KnowledgeListMF.eclair, Items.egg, new ItemStack(Items.dye, 1, 3), FoodListMF.pastry); add(KnowledgeListMF.cheeseroll, Items.bread, FoodListMF.cheese_slice); - + add(KnowledgeListMF.cake, FoodListMF.flour, Items.egg); add(KnowledgeListMF.carrotcake, FoodListMF.flour, Items.egg, Items.carrot); add(KnowledgeListMF.chococake, FoodListMF.flour, Items.egg, new ItemStack(Items.dye, 1, 3)); - add(KnowledgeListMF.bfcake, FoodListMF.flour, Items.egg, new ItemStack(Items.dye, 1, 3), FoodListMF.berriesJuicy); - + add(KnowledgeListMF.bfcake, FoodListMF.flour, Items.egg, new ItemStack(Items.dye, 1, 3), + FoodListMF.berriesJuicy); + add(KnowledgeListMF.bandageadv, Blocks.wool, Items.leather); } - private static void addConstruction() - { + private static void addConstruction() { add(KnowledgeListMF.refined_planks, ComponentListMF.nail); add(KnowledgeListMF.clay_wall, Items.clay_ball, ComponentListMF.nail); add(KnowledgeListMF.paint_brush, Blocks.wool); @@ -89,57 +85,49 @@ private static void addConstruction() add(KnowledgeListMF.bed_roll, Items.bed); add(KnowledgeListMF.ammo_box, Blocks.chest); add(KnowledgeListMF.big_box, Blocks.chest); - + } - private static void addArtisanry() - { - for(ItemStack copper: OreDictionary.getOres("ingotCopper")) - { - for(ItemStack tin: OreDictionary.getOres("ingotTin")) - { + private static void addArtisanry() { + for (ItemStack copper : OreDictionary.getOres("ingotCopper")) { + for (ItemStack tin : OreDictionary.getOres("ingotTin")) { add(KnowledgeListMF.smeltBronze, copper, tin); } } add(KnowledgeListMF.coalflux, Items.coal, ComponentListMF.flux); add(KnowledgeListMF.smeltIron, Blocks.iron_ore); add(KnowledgeListMF.crucible2, ComponentListMF.fireclay); - add(KnowledgeListMF.blastfurn, Items.iron_ingot, Blocks.iron_ore, Blocks.furnace, BlockListMF.bloomery, BlockListMF.limestone, ComponentListMF.kaolinite); - add(KnowledgeListMF.bigfurn, Items.iron_ingot, Blocks.furnace, BlockListMF.bloomery, ComponentListMF.kaolinite, Items.coal); - for(ItemStack pig: OreDictionary.getOres("ingotPigIron")) - { + add(KnowledgeListMF.blastfurn, Items.iron_ingot, Blocks.iron_ore, Blocks.furnace, BlockListMF.bloomery, + BlockListMF.limestone, ComponentListMF.kaolinite); + add(KnowledgeListMF.bigfurn, Items.iron_ingot, Blocks.furnace, BlockListMF.bloomery, ComponentListMF.kaolinite, + Items.coal); + for (ItemStack pig : OreDictionary.getOres("ingotPigIron")) { add(KnowledgeListMF.smeltSteel, pig); } - for(ItemStack steel: OreDictionary.getOres("ingotSteel")) - { + for (ItemStack steel : OreDictionary.getOres("ingotSteel")) { add(KnowledgeListMF.encrusted, steel, Items.diamond); add(KnowledgeListMF.obsidian, steel, Blocks.obsidian); - for(ItemStack bronze: OreDictionary.getOres("ingotBronze")) - { + for (ItemStack bronze : OreDictionary.getOres("ingotBronze")) { add(KnowledgeListMF.smeltBlackSteel, Blocks.obsidian, bronze, steel); } } - for(ItemStack black: OreDictionary.getOres("ingotBlackSteel")) - { - for(ItemStack silver: OreDictionary.getOres("ingotSilver")) - { - add(KnowledgeListMF.smeltBlueSteel, Items.blaze_powder, silver, black, new ItemStack(Items.dye, 1, 4), ComponentListMF.flux_strong); + for (ItemStack black : OreDictionary.getOres("ingotBlackSteel")) { + for (ItemStack silver : OreDictionary.getOres("ingotSilver")) { + add(KnowledgeListMF.smeltBlueSteel, Items.blaze_powder, silver, black, new ItemStack(Items.dye, 1, 4), + ComponentListMF.flux_strong); } - add(KnowledgeListMF.smeltRedSteel, Items.blaze_powder, Items.gold_ingot, Items.redstone, black, ComponentListMF.flux_strong); + add(KnowledgeListMF.smeltRedSteel, Items.blaze_powder, Items.gold_ingot, Items.redstone, black, + ComponentListMF.flux_strong); } - - - for(ItemStack silver: OreDictionary.getOres("ingotSilver")) - { + + for (ItemStack silver : OreDictionary.getOres("ingotSilver")) { add(KnowledgeListMF.smeltMithril, BlockListMF.oreMythic, silver); } add(KnowledgeListMF.smeltAdamant, BlockListMF.oreMythic, Items.gold_ingot); - - for(ItemStack mithril: OreDictionary.getOres("ingotMithril")) - { + + for (ItemStack mithril : OreDictionary.getOres("ingotMithril")) { add(KnowledgeListMF.smeltMithium, mithril, Items.ghast_tear, Items.diamond); - for(ItemStack adamant: OreDictionary.getOres("ingotAdamantium")) - { + for (ItemStack adamant : OreDictionary.getOres("ingotAdamantium")) { add(KnowledgeListMF.smeltIgnotumite, adamant, Items.emerald, Items.blaze_powder); add(KnowledgeListMF.smeltEnderforge, adamant, mithril, Items.ender_pearl); } @@ -147,22 +135,19 @@ private static void addArtisanry() add(KnowledgeListMF.craftArmourMedium, Items.leather); add(KnowledgeListMF.craftArmourHeavy, Items.leather, Blocks.wool, Items.feather); add(KnowledgeListMF.smeltDragonforge, ComponentListMF.dragon_heart); - + add(KnowledgeListMF.craftOrnate, new ItemStack(Items.dye, 1, 4)); - - + add(KnowledgeListMF.arrowsBodkin, Items.feather); add(KnowledgeListMF.arrowsBroad, Items.feather, Items.flint); - + add(KnowledgeListMF.repair_basic, Items.leather, Items.flint, ComponentListMF.nail); add(KnowledgeListMF.repair_advanced, BlockListMF.repair_basic, Items.slime_ball, Items.string); add(KnowledgeListMF.repair_ornate, Items.diamond, Items.gold_ingot, BlockListMF.repair_advanced); } - - private static void add(InformationBase info, Object... artifacts) - { - for(Object artifact : artifacts) - { + + private static void add(InformationBase info, Object... artifacts) { + for (Object artifact : artifacts) { ResearchArtefacts.addArtefact(artifact, info); } } diff --git a/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java b/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java index b1c278eb..f254eed8 100644 --- a/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java +++ b/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java @@ -2,8 +2,6 @@ import java.util.ArrayList; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; import minefantasy.mf2.api.knowledge.InformationBase; @@ -13,7 +11,6 @@ import minefantasy.mf2.api.refine.Alloy; import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.item.ItemComponentMF; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ArmourListMF; import minefantasy.mf2.item.list.ComponentListMF; @@ -21,313 +18,500 @@ import minefantasy.mf2.item.list.CustomToolListMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.material.MetalMaterial; -import minefantasy.mf2.util.MFLogUtil; -import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; -public class KnowledgeListMF -{ +public class KnowledgeListMF { public static InformationPage artisanry = InformationList.artisanry; public static InformationPage construction = InformationList.construction; public static InformationPage engineering = InformationList.engineering; public static InformationPage provisioning = InformationList.provisioning; public static InformationPage mastery = InformationList.mastery; - - - //BASICS -FREE - public static InformationBase carpenter, gettingStarted, salvage, research, talisman, ores, plants, chimney, tanning, commodities, dust, craftCrafters, stamina, combat, craftArmourBasic, craftHCCTools, firemaker, dragons, minotaurs; - public static InformationBase bloomery, crucible, crucible2, smeltCopper, smeltBronze, smeltIron, coalflux, bigfurn, blastfurn, smeltPig, smeltSteel, encrusted, obsidian, smeltBlackSteel, smeltDragonforge, smeltBlueSteel, smeltRedSteel, smeltMithril, smeltAdamant, smeltMaster, smeltMithium, smeltIgnotumite, smeltEnderforge; - public static InformationBase bellows, trough, forge, anvil, bar, apron, craftTools, craftAdvTools, craftWeapons, craftAdvWeapons, arrows, craftOrnate, craftArmourLight, craftArmourMedium, craftArmourHeavy, arrowsBodkin, arrowsBroad, repair_basic, repair_advanced, repair_ornate; - public static InformationBase coke, etools, ecomponents, tungsten, climber, spyglass, parachute, syringe, engTanner, advforge, advcrucible, blackpowder, advblackpowder, bombs, bpress, bombarrow, bombFuse, shrapnel, firebomb, stickybomb, bombCeramic, bombIron, bombObsidian, bombCrystal, mineCeramic, mineIron, mineObsidian, mineCrystal, crossbows, crossShafts, crossHeads, crossHeadAdvanced, crossShaftAdvanced, crossAmmo, crossScope, crossBayonet, cogArmour, compPlate; - public static InformationBase constructionPts, refined_planks, reinforced_stone, clay_wall, glass, brickworks, decorated_stone, bars, thatch, easyRefine, paint_brush, tool_rack, food_box, ammo_box, big_box, bed_roll; - public static InformationBase toughness, fitness, armourpro, parrypro, counteratt, autoparry, scrapper, firstaid, doctor; - public static InformationBase cookingutensil, firepit, generic_meat, stew, jerky, saussage, sandwitch, sandwitchBig, meatpie, shepardpie, bread, oats, salt, jug, berry, icing, sweetroll, eclair, cake, carrotcake, chococake, bfcake, applepie, berrypie, cheese, cheeseroll, bandage, bandageadv; - - public static void init() - { - carpenter = (new InformationBase("carpenter", 0, -3, 0, BlockListMF.carpenter, (InformationBase)null)).registerStat().setUnlocked(); - salvage = (new InformationBase("salvage", 0, -4, 0, BlockListMF.salvage_basic, (InformationBase)null)).registerStat().setUnlocked(); - gettingStarted = (new InformationBase("gettingStarted", 0, 0, 0, Items.book, (InformationBase)null)).registerStat().setUnlocked(); - research = (new InformationBase("research", 1, 1, 0, ToolListMF.researchBook, (InformationBase)null)).registerStat().setUnlocked(); - talisman = (new InformationBase("talisman", 4, 2, 0, ComponentListMF.talisman_lesser, research)).registerStat().setUnlocked(); - ores = (new InformationBase("ores", 1, -2, 0, BlockListMF.oreCopper, (InformationBase)null)).registerStat().setUnlocked(); - plants = (new InformationBase("plants", 1, -3, 0, BlockListMF.log_ironbark, ores)).registerStat().setUnlocked(); - chimney = (new InformationBase("chimney", 0, 2, 0, BlockListMF.chimney_stone, (InformationBase)null)).registerStat().setUnlocked(); - tanning = (new InformationBase("tanning", 0, -2 ,0, Items.leather, (InformationBase)null)).registerStat().setUnlocked().setSpecial(); - commodities = (new InformationBase("commodities", -1 ,-2 ,0, ComponentListMF.nail, (InformationBase)null)).registerStat().setUnlocked(); - dust = (new InformationBase("dust", -1 ,-3 ,0, ComponentListMF.clay_pot, commodities)).registerStat().setUnlocked(); - craftCrafters = (new InformationBase("craftCrafters", -1, 1, 0, CustomToolListMF.standard_hammer, (InformationBase)null)).registerStat().setUnlocked(); - stamina = (new InformationBase("stamina", -3, 1, 0, Items.feather, craftCrafters)).registerStat().setUnlocked(); - combat = (new InformationBase("combat", -5, 2, 0, Items.iron_sword, stamina)).registerStat().setUnlocked(); - craftArmourBasic = (new InformationBase("craftArmourBasic", -5, 0, 5, ArmourListMF.armour(ArmourListMF.leather, 0, 1), combat)).registerStat().setUnlocked(); - firemaker = (new InformationBase("firemaker", 5, 1, 0, Items.flint_and_steel, (InformationBase)null)).registerStat().setUnlocked(); - - dragons = (new InformationBase("dragons", -1, 3, 0, ComponentListMF.dragon_heart, (InformationBase)null)).registerStat().setUnlocked(); - minotaurs = (new InformationBase("minotaurs", 1, 3, 0, Items.beef, (InformationBase)null)).registerStat().setUnlocked(); - - //ARTISANRY -From Not very to the most Expensive - bloomery = (new InformationBase("bloomery", 4, -2, 0, BlockListMF.bloomery, crucible)).registerStat().setPage(artisanry).setUnlocked().setSpecial(); - crucible = (new InformationBase("crucible", 4, 0, 0, BlockListMF.crucible, (InformationBase)null)).registerStat().setPage(artisanry).setUnlocked().setSpecial(); - crucible2 = (new InformationBase("crucible2", 6, 0, 1, BlockListMF.crucibleadv_active, crucible)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 40); - - smeltCopper = (new InformationBase("smeltCopper", 1, 0, 0, ComponentListMF.ingots[0], (InformationBase)null)).registerStat().setPage(artisanry).setUnlocked().setDescriptValues(getMetalTier("copper")); - smeltBronze = (new InformationBase("smeltBronze", 1, 2, 2, ComponentListMF.ingots[2], crucible)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 5).setDescriptValues(getMetalTier("bronze")); - smeltIron = (new InformationBase("smeltIron", 1, 4, 1, Items.iron_ingot, null)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10).setDescriptValues(getMetalTier("iron")); - coalflux = (new InformationBase("coalflux", 1, 6, 2, ComponentListMF.coal_flux, smeltIron)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 15); - blastfurn = (new InformationBase("blastfurn", 2, 5, 5, BlockListMF.blast_heater_active, smeltIron)).registerStat().setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, 25); - bigfurn = (new InformationBase("bigfurn", 0, 5, 4, BlockListMF.furnace_stone, smeltIron)).registerStat().setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, 10); - smeltPig = (new InformationBase("smeltPig", 3, 3, 0, ComponentListMF.ingots[3], blastfurn)).registerStat().setPage(artisanry).setUnlocked().addSkill(SkillList.artisanry, 25); - smeltSteel = (new InformationBase("smeltSteel", 4, 5, 1, ComponentListMF.ingots[4], smeltPig)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 25).setDescriptValues(getMetalTier("Steel")); - encrusted = (new InformationBase("smeltEncrusted", 6, 5, 2, ComponentListMF.diamond_shards, smeltSteel)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 35).setDescriptValues(getMetalTier("encrusted")); - obsidian = (new InformationBase("smeltObsidian", 6, 3, 2, ComponentListMF.ingots[19], smeltSteel)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 40).setDescriptValues(getMetalTier("obsidian")); - smeltBlackSteel = (new InformationBase("smeltBlackSteel", 4, 7, 3, ComponentListMF.ingots[7], smeltSteel)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50).setDescriptValues(getMetalTier("blacksteel")); - smeltDragonforge = (new InformationBase("smeltDragonforge", -4, -1, 1, ComponentListMF.dragon_heart, null)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50); - smeltRedSteel = (new InformationBase("smeltRedSteel", 3, 9, 5, ComponentListMF.ingots[10], smeltBlackSteel)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 65).setDescriptValues(getMetalTier("redsteel")); - smeltBlueSteel = (new InformationBase("smeltBlueSteel", 5, 9, 5, ComponentListMF.ingots[12], smeltBlackSteel)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 65).setDescriptValues(getMetalTier("bluesteel")); - smeltMithril = (new InformationBase("smeltMithril", 5, 12, 3, ComponentListMF.ingots[14], null)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 75).setDescriptValues(getMetalTier("mithril")); - smeltAdamant = (new InformationBase("smeltAdamantium", 3, 12, 3, ComponentListMF.ingots[13], null)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 75).setDescriptValues(getMetalTier("adamantium")); - - smeltMaster = (new InformationBase("smeltMaster", 4, 13, 3, new ItemStack(ComponentListMF.artefacts, 1, 3), (InformationBase)null)).registerStat().setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, 100); - smeltIgnotumite = (new InformationBase("smeltIgnotumite", 2, 15, 3, ComponentListMF.ingots[15], smeltMaster)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100).setDescriptValues(getMetalTier("ignotumite")); - smeltMithium = (new InformationBase("smeltMithium", 6, 15, 3, ComponentListMF.ingots[16], smeltMaster)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100).setDescriptValues(getMetalTier("mithium")); - smeltEnderforge = (new InformationBase("smeltEnder", 4, 16, 3, ComponentListMF.ingots[17], smeltMaster)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100).setDescriptValues(getMetalTier("ender")); - - craftHCCTools = (new InformationBase("craftHCCTools", -1, -2, 0, ToolListMF.pickStone, (InformationBase)null)).registerStat().setPage(artisanry).setUnlocked(); - bellows = (new InformationBase("bellows", 0, -1,0, BlockListMF.bellows, (InformationBase)null)).registerStat().setPage(artisanry).setUnlocked(); - trough = (new InformationBase("trough", 0, -2,0, BlockListMF.trough_wood, bellows)).registerStat().setPage(artisanry).setUnlocked(); - forge = (new InformationBase("forge", 0, 0, 0, BlockListMF.forge, (InformationBase)null)).registerStat().setPage(artisanry).setUnlocked(); - anvil = (new InformationBase("anvil", -1, 0, 0, BlockListMF.anvil[1], forge)).registerStat().setPage(artisanry).setUnlocked().setSpecial(); - bar = (new InformationBase("bar", -1, 2, 0, ComponentListMF.bar, anvil)).registerStat().setPage(artisanry).setUnlocked(); - apron = (new InformationBase("apron", -1, -1, 0, ArmourListMF.leatherapron, anvil)).registerStat().setPage(artisanry).setUnlocked(); - craftTools = (new InformationBase("craftTools", -3, 2, 0, CustomToolListMF.standard_pick, bar)).registerStat().setPage(artisanry).setUnlocked(); - craftAdvTools = (new InformationBase("craftAdvTools", -5, 2, 0, CustomToolListMF.standard_hvypick, craftTools)).registerStat().setPage(artisanry).setUnlocked(); - craftWeapons = (new InformationBase("craftWeapons", -3, 1, 5, CustomToolListMF.standard_sword, bar)).registerStat().setPage(artisanry).setUnlocked(); - craftAdvWeapons = (new InformationBase("craftAdvWeapons", -5, 1, 0, CustomToolListMF.standard_battleaxe, craftWeapons)).registerStat().setPage(artisanry).setUnlocked(); - arrows = (new InformationBase("arrows", -3, 4, 0, CustomToolListMF.standard_arrow, bar)).registerStat().setPage(artisanry).setUnlocked(); - - craftOrnate = (new InformationBase("craftOrnate", -3, -1, 1, ComponentListMF.ornate_items, null)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 35); - craftArmourLight = (new InformationBase("craftArmourLight", -3, 3, 1, ArmourListMF.armour(ArmourListMF.leather, 3, 1), anvil)).registerStat().setPage(artisanry).setUnlocked(); - craftArmourMedium = (new InformationBase("craftArmourMedium", -4, 3, 1, CustomArmourListMF.standard_chain_chest, craftArmourLight)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 0); - craftArmourHeavy = (new InformationBase("craftArmourHeavy", -5, 3, 3, CustomArmourListMF.standard_plate_chest, craftArmourMedium)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); - arrowsBodkin = (new InformationBase("arrowsBodkin", -4, 5, 1, CustomToolListMF.standard_arrow_bodkin, arrows)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); - arrowsBroad = (new InformationBase("arrowsBroad", -5, 5, 2, CustomToolListMF.standard_arrow_broad, arrows)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 20); - - //ENGINEERING - Highly Expensive - etools = (new InformationBase("etools", 3, 0, 0, CustomToolListMF.standard_spanner, (InformationBase)null)).registerStat().setPage(engineering).setUnlocked(); - ecomponents = (new InformationBase("ecomponents", 5, 0, 0, ComponentListMF.bolt, etools)).registerStat().setPage(engineering).setUnlocked(); - tungsten = (new InformationBase("tungsten", 8, -1, 1, ComponentListMF.ingots[18], ecomponents)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 20).addSkill(SkillList.artisanry, 20); - coke = (new InformationBase("coke", 4, -1, 2, ComponentListMF.coke, ecomponents)).registerStat().setPage(engineering); - climber = (new InformationBase("climber", 7, 0, 1, ToolListMF.climbing_pick_basic, ecomponents)).registerStat().setPage(engineering).setUnlocked(); - spyglass = (new InformationBase("spyglass", 8, 1, 2, new ItemStack(ToolListMF.spyglass, 1, 2), climber)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 5); - parachute = (new InformationBase("parachute", 9, 2, 2, ToolListMF.parachute, climber)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 10); - syringe = (new InformationBase("syringe", 5, -2, 1, ToolListMF.syringe_empty, ecomponents)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 25); - engTanner = (new InformationBase("engTanner", 5, 2, 1, BlockListMF.engTanner, ecomponents)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 40).addSkill(SkillList.artisanry, 25); - advcrucible = (new InformationBase("advcrucible", 7, 3, 1, BlockListMF.crucibleauto, engTanner)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 50).addSkill(SkillList.artisanry, 35); - advforge = (new InformationBase("advforge", 9, 3, 1, BlockListMF.forge_metal, advcrucible)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 75).addSkill(SkillList.artisanry, 50); - - blackpowder = (new InformationBase("blackpowder", 0, 0, 4, ComponentListMF.blackpowder, (InformationBase)null)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 0); - advblackpowder = (new InformationBase("advblackpowder", 2, -2, 2, ComponentListMF.blackpowder_advanced, blackpowder)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 50); - bombs = (new InformationBase("bombs", 0, 2, 3, ToolListMF.bomb_custom, blackpowder)).registerStat().setPage(engineering).setSpecial().addSkill(SkillList.engineering, 10); - bpress = (new InformationBase("bpress", -1, 1, 2, BlockListMF.bombPress, bombs)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 30); - bombarrow = (new InformationBase("bombarrow", 1, 1, 2, ToolListMF.exploding_arrow, bombs)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); - bombFuse = (new InformationBase("bombFuse", 2, 2, 0, ComponentListMF.bomb_fuse, bombs)).registerStat().setUnlocked().setPage(engineering); - shrapnel = (new InformationBase("shrapnel", 0, 4, 1, ComponentListMF.shrapnel, bombs)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 25); - firebomb = (new InformationBase("firebomb", 0, 6, 2, Items.blaze_powder, shrapnel)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 85); - stickybomb = (new InformationBase("stickybomb", -2, 2, 1, Items.slime_ball, bombs)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 50); - bombCeramic = (new InformationBase("bombCeramic", 2, 3, 0, ComponentListMF.bomb_casing, bombs)).registerStat().setUnlocked().setPage(engineering); - bombIron = (new InformationBase("bombIron", 4, 5, 1, ComponentListMF.bomb_casing_iron, bombCeramic)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); - bombObsidian = (new InformationBase("bombObsidian", 4, 7, 2, ComponentListMF.bomb_casing_obsidian, bombIron)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 35); - bombCrystal = (new InformationBase("bombCrystal", 2, 9, 1, ComponentListMF.bomb_casing_crystal, bombObsidian)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); - mineCeramic = (new InformationBase("mineCeramic", -2, 3, 2, ComponentListMF.mine_casing, bombs)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 15); - mineIron = (new InformationBase("mineIron", -4, 5, 1, ComponentListMF.mine_casing_iron, mineCeramic)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); - mineObsidian = (new InformationBase("mineObsidian", -4, 7, 2, ComponentListMF.mine_casing_obsidian, mineIron)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 35); - mineCrystal = (new InformationBase("mineCrystal", -2, 9, 1, ComponentListMF.mine_casing_crystal, mineObsidian)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); - - crossbows = (new InformationBase("crossbows", -4, 0, 3, BlockListMF.crossbowBench, null)).registerStat().setPage(engineering).setSpecial().addSkill(SkillList.engineering, 0); - crossShafts = (new InformationBase("crossShafts", -6, 2, 0, ComponentListMF.crossbow_stock_wood, crossbows)).registerStat().setPage(engineering).setUnlocked(); - crossShaftAdvanced = (new InformationBase("crossShaftAdvanced", -6, 4, 2, ComponentListMF.crossbow_stock_iron, crossShafts)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); - crossHeads = (new InformationBase("crossHeads", -2, -2, 0, ComponentListMF.cross_arms_basic, crossbows)).registerStat().setPage(engineering).setUnlocked(); - crossHeadAdvanced = (new InformationBase("crossHeadAdvanced", -3, -3, 2, ComponentListMF.cross_arms_advanced, crossHeads)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 30); - crossBayonet = (new InformationBase("crossBayonet", -1, -3, 1, ComponentListMF.cross_bayonet, crossHeads)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 10); - crossAmmo = (new InformationBase("crossAmmo", -5, 3, 1, ComponentListMF.cross_ammo, crossShafts)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 30); - crossScope = (new InformationBase("crossScope", -7, 3, 1, ComponentListMF.cross_scope, crossShafts)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); - - cogArmour = (new InformationBase("cogArmour", 8, -3, 2, BlockListMF.cogwork_helm, tungsten)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 60); - compPlate = (new InformationBase("compPlate", 10, -3, 1, ComponentListMF.ingotCompositeAlloy, tungsten)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 50).addSkill(SkillList.artisanry, 40); - - repair_basic = (new InformationBase("repair_basic", 8, 0, 2, BlockListMF.repair_basic, (InformationBase)null)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); - repair_advanced = (new InformationBase("repair_advanced", 10, 0, 3, BlockListMF.repair_advanced, repair_basic)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 25); - repair_ornate = (new InformationBase("repair_ornate", 12, 2, 3, BlockListMF.repair_ornate, repair_advanced)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50); - - constructionPts = (new InformationBase("constructionPts", 0, 0, 0, ComponentListMF.plank_cut, (InformationBase)null)).registerStat().setPage(construction).setUnlocked(); - reinforced_stone = (new InformationBase("reinforced_stone", 1, 0, 0, BlockListMF.reinforced_stone, (InformationBase)null)).registerStat().setPage(construction).setUnlocked(); - glass = (new InformationBase("glass", 0, 1, 0, BlockListMF.framed_glass, (InformationBase)null)).registerStat().setPage(construction).setUnlocked(); - brickworks = (new InformationBase("brickworks", 3, 0, 0, BlockListMF.cobble_brick, reinforced_stone)).registerStat().setPage(construction).setUnlocked(); - bars = (new InformationBase("bars", 0, 3, 0, BlockListMF.bars[2], glass)).registerStat().setPage(construction).setUnlocked(); - thatch = (new InformationBase("thatch", 0, -3, 0, BlockListMF.thatch, clay_wall)).registerStat().setPage(construction).setUnlocked(); - refined_planks = (new InformationBase("refined_planks", -1, 0, 1, BlockListMF.refined_planks, (InformationBase)null)).registerStat().setPage(construction).addSkill(SkillList.construction, 0); - clay_wall = (new InformationBase("clay_wall", 0, -1, 2, BlockListMF.clayWall, (InformationBase)null)).registerStat().setPage(construction).addSkill(SkillList.construction, 5); - paint_brush = (new InformationBase("paint_brush", -3, 0, 1, ToolListMF.paint_brush, refined_planks)).registerStat().setPage(construction).addSkill(SkillList.construction, 10); - decorated_stone = (new InformationBase("decorated_stone", 5, 0, 2, BlockListMF.reinforced_stone_framed, brickworks)).registerStat().setPage(construction).addSkill(SkillList.construction, 15); - - bed_roll = (new InformationBase("bed_roll", 2, 3, 1, ToolListMF.bedroll, (InformationBase)null)).registerStat().setPage(construction).setUnlocked(); - tool_rack = (new InformationBase("tool_rack", 2, 2, 0, BlockListMF.rack_wood, (InformationBase)null)).registerStat().setPage(construction).setUnlocked(); - food_box = (new InformationBase("food_box", 2, 4, 1, BlockListMF.food_box_basic, tool_rack)).registerStat().setPage(construction).setUnlocked(); - ammo_box = (new InformationBase("ammo_box", 4, 4, 1, BlockListMF.ammo_box_basic, food_box)).registerStat().setPage(construction).addSkill(SkillList.construction, 15); - big_box = (new InformationBase("big_box", 6, 4, 1, BlockListMF.crate_basic, ammo_box)).registerStat().setPage(construction).addSkill(SkillList.construction, 25); - - //COOKING -The Cheapest - cookingutensil = (new InformationBase("cookingutensil",-1, 0, 0, FoodListMF.pie_tray, (InformationBase)null)).registerStat().setPage(provisioning).setUnlocked(); - firepit = (new InformationBase("firepit", 0, 0, 0, BlockListMF.firepit, (InformationBase)null)).registerStat().setPage(provisioning).setUnlocked(); - - generic_meat = (new InformationBase("generic_meat", 0, -1, 0, FoodListMF.generic_meat_uncooked, (InformationBase)null)).registerStat().setPage(provisioning).setUnlocked(); - stew = (new InformationBase("stew", 0, -3, 0, FoodListMF.stew, generic_meat)).registerStat().setPage(provisioning).setUnlocked(); - jerky = (new InformationBase("jerky", 0, -5, 1, FoodListMF.jerky, stew)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 10); - saussage = (new InformationBase("saussage", 2, -5, 2, FoodListMF.saussage_cooked, jerky)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 35); - sandwitch = (new InformationBase("sandwitch", 1, -7, 3, FoodListMF.sandwitch_meat, jerky)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 15); - sandwitchBig = (new InformationBase("sandwitchBig", 3, -7, 3, FoodListMF.sandwitch_big, sandwitch)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 25); - meatpie = (new InformationBase("meatpie", -1, -7, 2, BlockListMF.pie_meat, jerky)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 35); - shepardpie = (new InformationBase("shepardpie", -2, -9, 3, BlockListMF.pie_shepards, meatpie)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 80); - bread = (new InformationBase("bread", 1, 0, 0, FoodListMF.breadroll, (InformationBase)null)).registerStat().setPage(provisioning).setUnlocked(); - oats = (new InformationBase("oats", 3, 0, 0, FoodListMF.oats, bread)).registerStat().setPage(provisioning).setUnlocked(); - - salt = (new InformationBase("salt", -2, -2, 0, FoodListMF.salt, (InformationBase)null)).registerStat().setPage(provisioning).setUnlocked(); - jug = (new InformationBase("jug", -1, -2, 0, FoodListMF.jug_water, (InformationBase)null)).registerStat().setPage(provisioning).setUnlocked(); - berry = (new InformationBase("berry", 0, 1, 0, FoodListMF.berries, (InformationBase)null)).registerStat().setPage(provisioning).setUnlocked(); - icing = (new InformationBase("icing", -1, 2, 0, FoodListMF.icing, berry)).registerStat().setPage(provisioning).setUnlocked(); - sweetroll = (new InformationBase("sweetroll", 0, 3, 2, FoodListMF.sweetroll, berry)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 15); - eclair = (new InformationBase("eclair", 2, 3, 3, FoodListMF.eclair, sweetroll)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 75); - cake = (new InformationBase("cake", 0, 5, 2, BlockListMF.cake_vanilla, sweetroll)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 25); - carrotcake = (new InformationBase("carrotcake", -1, 7, 3, BlockListMF.cake_carrot, cake)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 40); - chococake = (new InformationBase("chococake", 1, 7, 3, BlockListMF.cake_chocolate, cake)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 40); - bfcake = (new InformationBase("bfcake", 1, 9, 4, BlockListMF.cake_bf, chococake)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 90); - berrypie = (new InformationBase("berrypie", 2, 1, 2, BlockListMF.pie_berry, berry)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 20); - applepie = (new InformationBase("applepie", 4, 1, 2, BlockListMF.pie_apple, berrypie)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 30); - - cheese = (new InformationBase("cheese", 1, -1, 0, BlockListMF.cheese_wheel, (InformationBase)null)).registerStat().setPage(provisioning).setUnlocked(); - cheeseroll = (new InformationBase("cheeseroll", 3, -1, 2, FoodListMF.cheese_roll, cheese)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 15); - - bandage = (new InformationBase("bandage", -3, 0, 0, ToolListMF.bandage_wool, (InformationBase)null)).registerStat().setPage(provisioning).setUnlocked(); - bandageadv = (new InformationBase("bandageadv", -5, -1, 2, ToolListMF.bandage_tough, bandage)).registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 40); - - //MASTERY - toughness = (new InformationBase("toughness", -1, 0, 0, CustomArmourListMF.standard_plate_helmet, (InformationBase)null)).registerStat().setPage(mastery).addSkill(SkillList.combat, 10).setPerk(); - fitness = (new InformationBase("fitness", 1, 0, 0, ComponentListMF.dragon_heart, (InformationBase)null)).registerStat().setPage(mastery).addSkill(SkillList.combat, 20).setPerk(); - armourpro = (new InformationBase("armourpro", 2, -1, 0, Items.diamond_chestplate, fitness)).registerStat().setPage(mastery).addSkill(SkillList.combat, 60).setPerk(); - parrypro = (new InformationBase("parrypro", -2, -1, 0, Items.iron_sword, toughness)).registerStat().setPage(mastery).addSkill(SkillList.combat, 20).setPerk(); - counteratt = (new InformationBase("counteratt", -1, -2, 0, CustomToolListMF.standard_waraxe, parrypro)).registerStat().setPage(mastery).addSkill(SkillList.combat, 25).setPerk(); - autoparry = (new InformationBase("autoparry", -3, -2, 0, CustomToolListMF.standard_sword, parrypro)).registerStat().setPage(mastery).addSkill(SkillList.combat, 50).setPerk(); - firstaid = (new InformationBase("firstaid", 0, 1, 0, ToolListMF.bandage_wool, (InformationBase)null)).registerStat().setPage(mastery).addSkill(SkillList.provisioning, 25).setPerk(); - doctor = (new InformationBase("doctor", 0, 3, 0, ToolListMF.syringe, firstaid)).registerStat().setPage(mastery).addSkill(SkillList.provisioning, 50).setPerk(); - scrapper = (new InformationBase("scrapper", 0,-1, 0, BlockListMF.salvage_basic, (InformationBase)null)).registerStat().setPage(mastery).addSkill(SkillList.artisanry, 35).setPerk(); - + + // BASICS -FREE + public static InformationBase carpenter, gettingStarted, salvage, research, talisman, ores, plants, chimney, + tanning, commodities, dust, craftCrafters, stamina, combat, craftArmourBasic, craftHCCTools, firemaker, + dragons, minotaurs; + public static InformationBase bloomery, crucible, crucible2, smeltCopper, smeltBronze, smeltIron, coalflux, bigfurn, + blastfurn, smeltPig, smeltSteel, encrusted, obsidian, smeltBlackSteel, smeltDragonforge, smeltBlueSteel, + smeltRedSteel, smeltMithril, smeltAdamant, smeltMaster, smeltMithium, smeltIgnotumite, smeltEnderforge; + public static InformationBase bellows, trough, forge, anvil, bar, apron, craftTools, craftAdvTools, craftWeapons, + craftAdvWeapons, arrows, craftOrnate, craftArmourLight, craftArmourMedium, craftArmourHeavy, arrowsBodkin, + arrowsBroad, repair_basic, repair_advanced, repair_ornate; + public static InformationBase coke, etools, ecomponents, tungsten, climber, spyglass, parachute, syringe, engTanner, + advforge, advcrucible, blackpowder, advblackpowder, bombs, bpress, bombarrow, bombFuse, shrapnel, firebomb, + stickybomb, bombCeramic, bombIron, bombObsidian, bombCrystal, mineCeramic, mineIron, mineObsidian, + mineCrystal, crossbows, crossShafts, crossHeads, crossHeadAdvanced, crossShaftAdvanced, crossAmmo, + crossScope, crossBayonet, cogArmour, compPlate; + public static InformationBase constructionPts, refined_planks, reinforced_stone, clay_wall, glass, brickworks, + decorated_stone, bars, thatch, easyRefine, paint_brush, tool_rack, food_box, ammo_box, big_box, bed_roll; + public static InformationBase toughness, fitness, armourpro, parrypro, counteratt, autoparry, scrapper, firstaid, + doctor; + public static InformationBase cookingutensil, firepit, generic_meat, stew, jerky, saussage, sandwitch, sandwitchBig, + meatpie, shepardpie, bread, oats, salt, jug, berry, icing, sweetroll, eclair, cake, carrotcake, chococake, + bfcake, applepie, berrypie, cheese, cheeseroll, bandage, bandageadv; + + public static void init() { + carpenter = (new InformationBase("carpenter", 0, -3, 0, BlockListMF.carpenter, (InformationBase) null)) + .registerStat().setUnlocked(); + salvage = (new InformationBase("salvage", 0, -4, 0, BlockListMF.salvage_basic, (InformationBase) null)) + .registerStat().setUnlocked(); + gettingStarted = (new InformationBase("gettingStarted", 0, 0, 0, Items.book, (InformationBase) null)) + .registerStat().setUnlocked(); + research = (new InformationBase("research", 1, 1, 0, ToolListMF.researchBook, (InformationBase) null)) + .registerStat().setUnlocked(); + talisman = (new InformationBase("talisman", 4, 2, 0, ComponentListMF.talisman_lesser, research)).registerStat() + .setUnlocked(); + ores = (new InformationBase("ores", 1, -2, 0, BlockListMF.oreCopper, (InformationBase) null)).registerStat() + .setUnlocked(); + plants = (new InformationBase("plants", 1, -3, 0, BlockListMF.log_ironbark, ores)).registerStat().setUnlocked(); + chimney = (new InformationBase("chimney", 0, 2, 0, BlockListMF.chimney_stone, (InformationBase) null)) + .registerStat().setUnlocked(); + tanning = (new InformationBase("tanning", 0, -2, 0, Items.leather, (InformationBase) null)).registerStat() + .setUnlocked().setSpecial(); + commodities = (new InformationBase("commodities", -1, -2, 0, ComponentListMF.nail, (InformationBase) null)) + .registerStat().setUnlocked(); + dust = (new InformationBase("dust", -1, -3, 0, ComponentListMF.clay_pot, commodities)).registerStat() + .setUnlocked(); + craftCrafters = (new InformationBase("craftCrafters", -1, 1, 0, CustomToolListMF.standard_hammer, + (InformationBase) null)).registerStat().setUnlocked(); + stamina = (new InformationBase("stamina", -3, 1, 0, Items.feather, craftCrafters)).registerStat().setUnlocked(); + combat = (new InformationBase("combat", -5, 2, 0, Items.iron_sword, stamina)).registerStat().setUnlocked(); + craftArmourBasic = (new InformationBase("craftArmourBasic", -5, 0, 5, + ArmourListMF.armour(ArmourListMF.leather, 0, 1), combat)).registerStat().setUnlocked(); + firemaker = (new InformationBase("firemaker", 5, 1, 0, Items.flint_and_steel, (InformationBase) null)) + .registerStat().setUnlocked(); + + dragons = (new InformationBase("dragons", -1, 3, 0, ComponentListMF.dragon_heart, (InformationBase) null)) + .registerStat().setUnlocked(); + minotaurs = (new InformationBase("minotaurs", 1, 3, 0, Items.beef, (InformationBase) null)).registerStat() + .setUnlocked(); + + // ARTISANRY -From Not very to the most Expensive + bloomery = (new InformationBase("bloomery", 4, -2, 0, BlockListMF.bloomery, crucible)).registerStat() + .setPage(artisanry).setUnlocked().setSpecial(); + crucible = (new InformationBase("crucible", 4, 0, 0, BlockListMF.crucible, (InformationBase) null)) + .registerStat().setPage(artisanry).setUnlocked().setSpecial(); + crucible2 = (new InformationBase("crucible2", 6, 0, 1, BlockListMF.crucibleadv_active, crucible)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 40); + + smeltCopper = (new InformationBase("smeltCopper", 1, 0, 0, ComponentListMF.ingots[0], (InformationBase) null)) + .registerStat().setPage(artisanry).setUnlocked().setDescriptValues(getMetalTier("copper")); + smeltBronze = (new InformationBase("smeltBronze", 1, 2, 2, ComponentListMF.ingots[2], crucible)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 5).setDescriptValues(getMetalTier("bronze")); + smeltIron = (new InformationBase("smeltIron", 1, 4, 1, Items.iron_ingot, null)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 10).setDescriptValues(getMetalTier("iron")); + coalflux = (new InformationBase("coalflux", 1, 6, 2, ComponentListMF.coal_flux, smeltIron)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 15); + blastfurn = (new InformationBase("blastfurn", 2, 5, 5, BlockListMF.blast_heater_active, smeltIron)) + .registerStat().setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, 25); + bigfurn = (new InformationBase("bigfurn", 0, 5, 4, BlockListMF.furnace_stone, smeltIron)).registerStat() + .setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, 10); + smeltPig = (new InformationBase("smeltPig", 3, 3, 0, ComponentListMF.ingots[3], blastfurn)).registerStat() + .setPage(artisanry).setUnlocked().addSkill(SkillList.artisanry, 25); + smeltSteel = (new InformationBase("smeltSteel", 4, 5, 1, ComponentListMF.ingots[4], smeltPig)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 25).setDescriptValues(getMetalTier("Steel")); + encrusted = (new InformationBase("smeltEncrusted", 6, 5, 2, ComponentListMF.diamond_shards, smeltSteel)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 35) + .setDescriptValues(getMetalTier("encrusted")); + obsidian = (new InformationBase("smeltObsidian", 6, 3, 2, ComponentListMF.ingots[19], smeltSteel)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 40) + .setDescriptValues(getMetalTier("obsidian")); + smeltBlackSteel = (new InformationBase("smeltBlackSteel", 4, 7, 3, ComponentListMF.ingots[7], smeltSteel)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50) + .setDescriptValues(getMetalTier("blacksteel")); + smeltDragonforge = (new InformationBase("smeltDragonforge", -4, -1, 1, ComponentListMF.dragon_heart, null)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50); + smeltRedSteel = (new InformationBase("smeltRedSteel", 3, 9, 5, ComponentListMF.ingots[10], smeltBlackSteel)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 65) + .setDescriptValues(getMetalTier("redsteel")); + smeltBlueSteel = (new InformationBase("smeltBlueSteel", 5, 9, 5, ComponentListMF.ingots[12], smeltBlackSteel)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 65) + .setDescriptValues(getMetalTier("bluesteel")); + smeltMithril = (new InformationBase("smeltMithril", 5, 12, 3, ComponentListMF.ingots[14], null)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 75).setDescriptValues(getMetalTier("mithril")); + smeltAdamant = (new InformationBase("smeltAdamantium", 3, 12, 3, ComponentListMF.ingots[13], null)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 75) + .setDescriptValues(getMetalTier("adamantium")); + + smeltMaster = (new InformationBase("smeltMaster", 4, 13, 3, new ItemStack(ComponentListMF.artefacts, 1, 3), + (InformationBase) null)).registerStat().setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, + 100); + smeltIgnotumite = (new InformationBase("smeltIgnotumite", 2, 15, 3, ComponentListMF.ingots[15], smeltMaster)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100) + .setDescriptValues(getMetalTier("ignotumite")); + smeltMithium = (new InformationBase("smeltMithium", 6, 15, 3, ComponentListMF.ingots[16], smeltMaster)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100) + .setDescriptValues(getMetalTier("mithium")); + smeltEnderforge = (new InformationBase("smeltEnder", 4, 16, 3, ComponentListMF.ingots[17], smeltMaster)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100) + .setDescriptValues(getMetalTier("ender")); + + craftHCCTools = (new InformationBase("craftHCCTools", -1, -2, 0, ToolListMF.pickStone, (InformationBase) null)) + .registerStat().setPage(artisanry).setUnlocked(); + bellows = (new InformationBase("bellows", 0, -1, 0, BlockListMF.bellows, (InformationBase) null)).registerStat() + .setPage(artisanry).setUnlocked(); + trough = (new InformationBase("trough", 0, -2, 0, BlockListMF.trough_wood, bellows)).registerStat() + .setPage(artisanry).setUnlocked(); + forge = (new InformationBase("forge", 0, 0, 0, BlockListMF.forge, (InformationBase) null)).registerStat() + .setPage(artisanry).setUnlocked(); + anvil = (new InformationBase("anvil", -1, 0, 0, BlockListMF.anvil[1], forge)).registerStat().setPage(artisanry) + .setUnlocked().setSpecial(); + bar = (new InformationBase("bar", -1, 2, 0, ComponentListMF.bar, anvil)).registerStat().setPage(artisanry) + .setUnlocked(); + apron = (new InformationBase("apron", -1, -1, 0, ArmourListMF.leatherapron, anvil)).registerStat() + .setPage(artisanry).setUnlocked(); + craftTools = (new InformationBase("craftTools", -3, 2, 0, CustomToolListMF.standard_pick, bar)).registerStat() + .setPage(artisanry).setUnlocked(); + craftAdvTools = (new InformationBase("craftAdvTools", -5, 2, 0, CustomToolListMF.standard_hvypick, craftTools)) + .registerStat().setPage(artisanry).setUnlocked(); + craftWeapons = (new InformationBase("craftWeapons", -3, 1, 5, CustomToolListMF.standard_sword, bar)) + .registerStat().setPage(artisanry).setUnlocked(); + craftAdvWeapons = (new InformationBase("craftAdvWeapons", -5, 1, 0, CustomToolListMF.standard_battleaxe, + craftWeapons)).registerStat().setPage(artisanry).setUnlocked(); + arrows = (new InformationBase("arrows", -3, 4, 0, CustomToolListMF.standard_arrow, bar)).registerStat() + .setPage(artisanry).setUnlocked(); + + craftOrnate = (new InformationBase("craftOrnate", -3, -1, 1, ComponentListMF.ornate_items, null)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 35); + craftArmourLight = (new InformationBase("craftArmourLight", -3, 3, 1, + ArmourListMF.armour(ArmourListMF.leather, 3, 1), anvil)).registerStat().setPage(artisanry) + .setUnlocked(); + craftArmourMedium = (new InformationBase("craftArmourMedium", -4, 3, 1, CustomArmourListMF.standard_chain_chest, + craftArmourLight)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 0); + craftArmourHeavy = (new InformationBase("craftArmourHeavy", -5, 3, 3, CustomArmourListMF.standard_plate_chest, + craftArmourMedium)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); + arrowsBodkin = (new InformationBase("arrowsBodkin", -4, 5, 1, CustomToolListMF.standard_arrow_bodkin, arrows)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); + arrowsBroad = (new InformationBase("arrowsBroad", -5, 5, 2, CustomToolListMF.standard_arrow_broad, arrows)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 20); + + // ENGINEERING - Highly Expensive + etools = (new InformationBase("etools", 3, 0, 0, CustomToolListMF.standard_spanner, (InformationBase) null)) + .registerStat().setPage(engineering).setUnlocked(); + ecomponents = (new InformationBase("ecomponents", 5, 0, 0, ComponentListMF.bolt, etools)).registerStat() + .setPage(engineering).setUnlocked(); + tungsten = (new InformationBase("tungsten", 8, -1, 1, ComponentListMF.ingots[18], ecomponents)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 20).addSkill(SkillList.artisanry, 20); + coke = (new InformationBase("coke", 4, -1, 2, ComponentListMF.coke, ecomponents)).registerStat() + .setPage(engineering); + climber = (new InformationBase("climber", 7, 0, 1, ToolListMF.climbing_pick_basic, ecomponents)).registerStat() + .setPage(engineering).setUnlocked(); + spyglass = (new InformationBase("spyglass", 8, 1, 2, new ItemStack(ToolListMF.spyglass, 1, 2), climber)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 5); + parachute = (new InformationBase("parachute", 9, 2, 2, ToolListMF.parachute, climber)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 10); + syringe = (new InformationBase("syringe", 5, -2, 1, ToolListMF.syringe_empty, ecomponents)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 25); + engTanner = (new InformationBase("engTanner", 5, 2, 1, BlockListMF.engTanner, ecomponents)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 40).addSkill(SkillList.artisanry, 25); + advcrucible = (new InformationBase("advcrucible", 7, 3, 1, BlockListMF.crucibleauto, engTanner)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 50).addSkill(SkillList.artisanry, 35); + advforge = (new InformationBase("advforge", 9, 3, 1, BlockListMF.forge_metal, advcrucible)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 75).addSkill(SkillList.artisanry, 50); + + blackpowder = (new InformationBase("blackpowder", 0, 0, 4, ComponentListMF.blackpowder, (InformationBase) null)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 0); + advblackpowder = (new InformationBase("advblackpowder", 2, -2, 2, ComponentListMF.blackpowder_advanced, + blackpowder)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 50); + bombs = (new InformationBase("bombs", 0, 2, 3, ToolListMF.bomb_custom, blackpowder)).registerStat() + .setPage(engineering).setSpecial().addSkill(SkillList.engineering, 10); + bpress = (new InformationBase("bpress", -1, 1, 2, BlockListMF.bombPress, bombs)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 30); + bombarrow = (new InformationBase("bombarrow", 1, 1, 2, ToolListMF.exploding_arrow, bombs)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 40); + bombFuse = (new InformationBase("bombFuse", 2, 2, 0, ComponentListMF.bomb_fuse, bombs)).registerStat() + .setUnlocked().setPage(engineering); + shrapnel = (new InformationBase("shrapnel", 0, 4, 1, ComponentListMF.shrapnel, bombs)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 25); + firebomb = (new InformationBase("firebomb", 0, 6, 2, Items.blaze_powder, shrapnel)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 85); + stickybomb = (new InformationBase("stickybomb", -2, 2, 1, Items.slime_ball, bombs)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 50); + bombCeramic = (new InformationBase("bombCeramic", 2, 3, 0, ComponentListMF.bomb_casing, bombs)).registerStat() + .setUnlocked().setPage(engineering); + bombIron = (new InformationBase("bombIron", 4, 5, 1, ComponentListMF.bomb_casing_iron, bombCeramic)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); + bombObsidian = (new InformationBase("bombObsidian", 4, 7, 2, ComponentListMF.bomb_casing_obsidian, bombIron)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 35); + bombCrystal = (new InformationBase("bombCrystal", 2, 9, 1, ComponentListMF.bomb_casing_crystal, bombObsidian)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); + mineCeramic = (new InformationBase("mineCeramic", -2, 3, 2, ComponentListMF.mine_casing, bombs)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 15); + mineIron = (new InformationBase("mineIron", -4, 5, 1, ComponentListMF.mine_casing_iron, mineCeramic)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); + mineObsidian = (new InformationBase("mineObsidian", -4, 7, 2, ComponentListMF.mine_casing_obsidian, mineIron)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 35); + mineCrystal = (new InformationBase("mineCrystal", -2, 9, 1, ComponentListMF.mine_casing_crystal, mineObsidian)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); + + crossbows = (new InformationBase("crossbows", -4, 0, 3, BlockListMF.crossbowBench, null)).registerStat() + .setPage(engineering).setSpecial().addSkill(SkillList.engineering, 0); + crossShafts = (new InformationBase("crossShafts", -6, 2, 0, ComponentListMF.crossbow_stock_wood, crossbows)) + .registerStat().setPage(engineering).setUnlocked(); + crossShaftAdvanced = (new InformationBase("crossShaftAdvanced", -6, 4, 2, ComponentListMF.crossbow_stock_iron, + crossShafts)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); + crossHeads = (new InformationBase("crossHeads", -2, -2, 0, ComponentListMF.cross_arms_basic, crossbows)) + .registerStat().setPage(engineering).setUnlocked(); + crossHeadAdvanced = (new InformationBase("crossHeadAdvanced", -3, -3, 2, ComponentListMF.cross_arms_advanced, + crossHeads)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 30); + crossBayonet = (new InformationBase("crossBayonet", -1, -3, 1, ComponentListMF.cross_bayonet, crossHeads)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 10); + crossAmmo = (new InformationBase("crossAmmo", -5, 3, 1, ComponentListMF.cross_ammo, crossShafts)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 30); + crossScope = (new InformationBase("crossScope", -7, 3, 1, ComponentListMF.cross_scope, crossShafts)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); + + cogArmour = (new InformationBase("cogArmour", 8, -3, 2, BlockListMF.cogwork_helm, tungsten)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 60); + compPlate = (new InformationBase("compPlate", 10, -3, 1, ComponentListMF.ingotCompositeAlloy, tungsten)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 50) + .addSkill(SkillList.artisanry, 40); + + repair_basic = (new InformationBase("repair_basic", 8, 0, 2, BlockListMF.repair_basic, (InformationBase) null)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); + repair_advanced = (new InformationBase("repair_advanced", 10, 0, 3, BlockListMF.repair_advanced, repair_basic)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 25); + repair_ornate = (new InformationBase("repair_ornate", 12, 2, 3, BlockListMF.repair_ornate, repair_advanced)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50); + + constructionPts = (new InformationBase("constructionPts", 0, 0, 0, ComponentListMF.plank_cut, + (InformationBase) null)).registerStat().setPage(construction).setUnlocked(); + reinforced_stone = (new InformationBase("reinforced_stone", 1, 0, 0, BlockListMF.reinforced_stone, + (InformationBase) null)).registerStat().setPage(construction).setUnlocked(); + glass = (new InformationBase("glass", 0, 1, 0, BlockListMF.framed_glass, (InformationBase) null)).registerStat() + .setPage(construction).setUnlocked(); + brickworks = (new InformationBase("brickworks", 3, 0, 0, BlockListMF.cobble_brick, reinforced_stone)) + .registerStat().setPage(construction).setUnlocked(); + bars = (new InformationBase("bars", 0, 3, 0, BlockListMF.bars[2], glass)).registerStat().setPage(construction) + .setUnlocked(); + thatch = (new InformationBase("thatch", 0, -3, 0, BlockListMF.thatch, clay_wall)).registerStat() + .setPage(construction).setUnlocked(); + refined_planks = (new InformationBase("refined_planks", -1, 0, 1, BlockListMF.refined_planks, + (InformationBase) null)).registerStat().setPage(construction).addSkill(SkillList.construction, 0); + clay_wall = (new InformationBase("clay_wall", 0, -1, 2, BlockListMF.clayWall, (InformationBase) null)) + .registerStat().setPage(construction).addSkill(SkillList.construction, 5); + paint_brush = (new InformationBase("paint_brush", -3, 0, 1, ToolListMF.paint_brush, refined_planks)) + .registerStat().setPage(construction).addSkill(SkillList.construction, 10); + decorated_stone = (new InformationBase("decorated_stone", 5, 0, 2, BlockListMF.reinforced_stone_framed, + brickworks)).registerStat().setPage(construction).addSkill(SkillList.construction, 15); + + bed_roll = (new InformationBase("bed_roll", 2, 3, 1, ToolListMF.bedroll, (InformationBase) null)).registerStat() + .setPage(construction).setUnlocked(); + tool_rack = (new InformationBase("tool_rack", 2, 2, 0, BlockListMF.rack_wood, (InformationBase) null)) + .registerStat().setPage(construction).setUnlocked(); + food_box = (new InformationBase("food_box", 2, 4, 1, BlockListMF.food_box_basic, tool_rack)).registerStat() + .setPage(construction).setUnlocked(); + ammo_box = (new InformationBase("ammo_box", 4, 4, 1, BlockListMF.ammo_box_basic, food_box)).registerStat() + .setPage(construction).addSkill(SkillList.construction, 15); + big_box = (new InformationBase("big_box", 6, 4, 1, BlockListMF.crate_basic, ammo_box)).registerStat() + .setPage(construction).addSkill(SkillList.construction, 25); + + // COOKING -The Cheapest + cookingutensil = (new InformationBase("cookingutensil", -1, 0, 0, FoodListMF.pie_tray, (InformationBase) null)) + .registerStat().setPage(provisioning).setUnlocked(); + firepit = (new InformationBase("firepit", 0, 0, 0, BlockListMF.firepit, (InformationBase) null)).registerStat() + .setPage(provisioning).setUnlocked(); + + generic_meat = (new InformationBase("generic_meat", 0, -1, 0, FoodListMF.generic_meat_uncooked, + (InformationBase) null)).registerStat().setPage(provisioning).setUnlocked(); + stew = (new InformationBase("stew", 0, -3, 0, FoodListMF.stew, generic_meat)).registerStat() + .setPage(provisioning).setUnlocked(); + jerky = (new InformationBase("jerky", 0, -5, 1, FoodListMF.jerky, stew)).registerStat().setPage(provisioning) + .addSkill(SkillList.provisioning, 10); + saussage = (new InformationBase("saussage", 2, -5, 2, FoodListMF.saussage_cooked, jerky)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 35); + sandwitch = (new InformationBase("sandwitch", 1, -7, 3, FoodListMF.sandwitch_meat, jerky)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 15); + sandwitchBig = (new InformationBase("sandwitchBig", 3, -7, 3, FoodListMF.sandwitch_big, sandwitch)) + .registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 25); + meatpie = (new InformationBase("meatpie", -1, -7, 2, BlockListMF.pie_meat, jerky)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 35); + shepardpie = (new InformationBase("shepardpie", -2, -9, 3, BlockListMF.pie_shepards, meatpie)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 80); + bread = (new InformationBase("bread", 1, 0, 0, FoodListMF.breadroll, (InformationBase) null)).registerStat() + .setPage(provisioning).setUnlocked(); + oats = (new InformationBase("oats", 3, 0, 0, FoodListMF.oats, bread)).registerStat().setPage(provisioning) + .setUnlocked(); + + salt = (new InformationBase("salt", -2, -2, 0, FoodListMF.salt, (InformationBase) null)).registerStat() + .setPage(provisioning).setUnlocked(); + jug = (new InformationBase("jug", -1, -2, 0, FoodListMF.jug_water, (InformationBase) null)).registerStat() + .setPage(provisioning).setUnlocked(); + berry = (new InformationBase("berry", 0, 1, 0, FoodListMF.berries, (InformationBase) null)).registerStat() + .setPage(provisioning).setUnlocked(); + icing = (new InformationBase("icing", -1, 2, 0, FoodListMF.icing, berry)).registerStat().setPage(provisioning) + .setUnlocked(); + sweetroll = (new InformationBase("sweetroll", 0, 3, 2, FoodListMF.sweetroll, berry)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 15); + eclair = (new InformationBase("eclair", 2, 3, 3, FoodListMF.eclair, sweetroll)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 75); + cake = (new InformationBase("cake", 0, 5, 2, BlockListMF.cake_vanilla, sweetroll)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 25); + carrotcake = (new InformationBase("carrotcake", -1, 7, 3, BlockListMF.cake_carrot, cake)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 40); + chococake = (new InformationBase("chococake", 1, 7, 3, BlockListMF.cake_chocolate, cake)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 40); + bfcake = (new InformationBase("bfcake", 1, 9, 4, BlockListMF.cake_bf, chococake)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 90); + berrypie = (new InformationBase("berrypie", 2, 1, 2, BlockListMF.pie_berry, berry)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 20); + applepie = (new InformationBase("applepie", 4, 1, 2, BlockListMF.pie_apple, berrypie)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 30); + + cheese = (new InformationBase("cheese", 1, -1, 0, BlockListMF.cheese_wheel, (InformationBase) null)) + .registerStat().setPage(provisioning).setUnlocked(); + cheeseroll = (new InformationBase("cheeseroll", 3, -1, 2, FoodListMF.cheese_roll, cheese)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 15); + + bandage = (new InformationBase("bandage", -3, 0, 0, ToolListMF.bandage_wool, (InformationBase) null)) + .registerStat().setPage(provisioning).setUnlocked(); + bandageadv = (new InformationBase("bandageadv", -5, -1, 2, ToolListMF.bandage_tough, bandage)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 40); + + // MASTERY + toughness = (new InformationBase("toughness", -1, 0, 0, CustomArmourListMF.standard_plate_helmet, + (InformationBase) null)).registerStat().setPage(mastery).addSkill(SkillList.combat, 10).setPerk(); + fitness = (new InformationBase("fitness", 1, 0, 0, ComponentListMF.dragon_heart, (InformationBase) null)) + .registerStat().setPage(mastery).addSkill(SkillList.combat, 20).setPerk(); + armourpro = (new InformationBase("armourpro", 2, -1, 0, Items.diamond_chestplate, fitness)).registerStat() + .setPage(mastery).addSkill(SkillList.combat, 60).setPerk(); + parrypro = (new InformationBase("parrypro", -2, -1, 0, Items.iron_sword, toughness)).registerStat() + .setPage(mastery).addSkill(SkillList.combat, 20).setPerk(); + counteratt = (new InformationBase("counteratt", -1, -2, 0, CustomToolListMF.standard_waraxe, parrypro)) + .registerStat().setPage(mastery).addSkill(SkillList.combat, 25).setPerk(); + autoparry = (new InformationBase("autoparry", -3, -2, 0, CustomToolListMF.standard_sword, parrypro)) + .registerStat().setPage(mastery).addSkill(SkillList.combat, 50).setPerk(); + firstaid = (new InformationBase("firstaid", 0, 1, 0, ToolListMF.bandage_wool, (InformationBase) null)) + .registerStat().setPage(mastery).addSkill(SkillList.provisioning, 25).setPerk(); + doctor = (new InformationBase("doctor", 0, 3, 0, ToolListMF.syringe, firstaid)).registerStat().setPage(mastery) + .addSkill(SkillList.provisioning, 50).setPerk(); + scrapper = (new InformationBase("scrapper", 0, -1, 0, BlockListMF.salvage_basic, (InformationBase) null)) + .registerStat().setPage(mastery).addSkill(SkillList.artisanry, 35).setPerk(); + } - private static Object getMetalTier(String string) - { - CustomMaterial mat = MetalMaterial.getMaterial(string); - if(mat != null)return mat.crafterTier; - + + private static Object getMetalTier(String string) { + CustomMaterial mat = MetalMaterial.getMaterial(string); + if (mat != null) + return mat.crafterTier; + return "?"; } - public static IRecipe firepitRecipe, cooktopRecipe, carpenterRecipe, waterJugR, milkJugR, plantOilR, sugarRecipe, stickRecipe, dryrocksR, meatpieOut, shepardOut, cheeseOut, berryOut, appleOut, pumpPieOut; - public static final ArrayList plankRecipe = new ArrayList(); - public static final ArrayList stoneBricksR = new ArrayList(); - - public static IAnvilRecipe hunkR, ingotR, bucketR, crestR; - public static final ArrayList barR = new ArrayList(); - public static final ArrayList baringotR = new ArrayList(); - - public static final ArrayList talismanRecipe = new ArrayList(); - public static ICarpenterRecipe artBookR, conBookR, proBookR, engBookR, comBookR, artBook2R, conBook2R, proBook2R, engBook2R, comBook2R; - public static IAnvilRecipe greatTalismanRecipe; - - public static ICarpenterRecipe fireclayR, fireBrickR, fireBricksR, fireBrickStairR, refinedPlankBlockR, clayWallR, bSalvageR, tannerRecipe, stoneAnvilRecipe, forgeRecipe, apronRecipe, woodTroughRecipe; - public static ICarpenterRecipe researchTableRecipe, framedGlassR, windowR, thatchR, thatchStairR; - public static IAnvilRecipe smokePipeR, framedStoneR, iframedStoneR, fluxR, nailR, rivetR; - public static final ArrayList barsR = new ArrayList(); - - public static IAnvilRecipe tinderboxR, flintAndSteelR; - public static ICarpenterRecipe dirtRockR, lStripsR, threadR, stringR, sharpRocksR, stonePickR, stoneAxeR, stoneSpadeR, stoneHoeR, stoneSwordR, stoneWarR, stoneMaceR, stoneSpearR, stoneHammerR, stoneTongsR, boneNeedleR, stoneKnifeR, quernR, stoneovenRecipe; - - public static Alloy[] reStone, bronze, steel, obsidalloy, black, red, blue, mithril, adamantium, ignotumite, mithium, enderforge, wolframiteR; - public static IAnvilRecipe coalfluxR, encrustedR, steelR, obsidianHunkR, diamondR; - public static ICarpenterRecipe nailPlanksR, nailStairR, refinedStairR, strongRackR, bellowsRecipe, bloomeryR, crucibleRecipe, advCrucibleRecipe, trilogyRecipe, chimneyRecipe, wideChimneyRecipe, extractChimneyRecipe; - - public static ICarpenterRecipe hideHelmR, hideChestR, hideLegsR, hideBootsR, roughHelmetR, roughChestR, roughLegsR, roughBootsR, reHelmetR, reChestR, reLegsR, reBootsR; - public static IAnvilRecipe studHelmetR, studChestR, studLegsR, studBootsR; - public static final ArrayList mailRecipes = new ArrayList(); - public static final ArrayList mailHelmetR = new ArrayList(); - public static final ArrayList mailChestR = new ArrayList(); - public static final ArrayList mailLegsR = new ArrayList(); - public static final ArrayList mailBootsR = new ArrayList(); - - public static final ArrayList scaleRecipes = new ArrayList(); - public static final ArrayList scaleHelmetR = new ArrayList(); - public static final ArrayList scaleChestR = new ArrayList(); - public static final ArrayList scaleLegsR = new ArrayList(); - public static final ArrayList scaleBootsR = new ArrayList(); - - public static final ArrayList splintRecipes = new ArrayList(); - public static final ArrayList splintHelmetR = new ArrayList(); - public static final ArrayList splintChestR = new ArrayList(); - public static final ArrayList splintLegsR = new ArrayList(); - public static final ArrayList splintBootsR = new ArrayList(); - - public static final ArrayList plateRecipes = new ArrayList(); - public static final ArrayList plateHelmetR = new ArrayList(); - public static final ArrayList plateChestR = new ArrayList(); - public static final ArrayList plateLegsR = new ArrayList(); - public static final ArrayList plateBootsR = new ArrayList(); - - public static final ArrayList ornateWepsR = new ArrayList(); - public static final ArrayList advOrnateWepsR = new ArrayList(); - - public static IAnvilRecipe pickR, axeR, spadeR, hoeR, shearsR; - public static IAnvilRecipe daggerR, swordR, waraxeR, maceR, spearR, bowR, katanaR, gswordR, whammerR, battleaxeR, halbeardR, lanceR; - public static IAnvilRecipe trowR, hvyPickR, hvyShovelR, handpickR, scytheR, mattockR, lumberR; - public static IAnvilRecipe hammerR, tongsR, hvyHammerR, needleR, sawsR, knifeR, spannerR; - public static IAnvilRecipe arrowheadR, bodkinheadR, broadheadR, crossBoltR; - - public static ICarpenterRecipe fletchingR, fletchingR2, malletR, spoonR; - public static final ArrayList arrowR = new ArrayList(); - - public static IAnvilRecipe ironPrepR, ironPrepR2, coalPrepR; - public static IAnvilRecipe blastChamR, blastHeatR, bigFurnR, bigHeatR; - - public static ICarpenterRecipe padding[] = new ICarpenterRecipe[4]; - public static ICarpenterRecipe repairBasicR, repairAdvancedR, repairOrnateR; - public static ICarpenterRecipe spyglassR, bombBenchCraft, bombPressCraft, advancedForgeR, engTannerR, autoCrucibleR; - public static ICarpenterRecipe crudeBombR, bombFuseR, longFuseR; - public static ICarpenterRecipe crossBenchCraft, crossStockWoodR, crossStockIronR, crossHandleWoodR, crossHeadLightR, crossHeadMediumR, crossHeadHeavyR, crossHeadAdvancedR, crossAmmoR, crossScopeR; - - public static ICarpenterRecipe bombCaseCeramicR, mineCaseCeramicR, bombCaseCrystalR, mineCaseCrystalR; - public static IAnvilRecipe bombCaseIronR, mineCaseIronR, bombCaseObsidianR, mineCaseObsidianR, crossBayonetR; - - public static final ArrayList meatRecipes = new ArrayList(); - public static ICarpenterRecipe meatStripR, meatHunkR, gutsRecipe; - public static IAnvilRecipe caketinRecipe; - public static ICarpenterRecipe breadSliceR, pastryRecipe, doughRecipe, breadRecipe, curdRecipe, oatsRecipe, custardRecipe, icingRecipe, stewRecipe, saussageR, jerkyRecipe, meatPieRecipe, sandwitchRecipe, sandwitchBigRecipe, shepardRecipe, sweetrollRecipe, iceSR, eclairDoughR, eclairIceR, eclairFillR; - public static ICarpenterRecipe pumpPieR, simpCakeR, simpCakeOut, berryR, appleR, cheeserollR, cakeR, carrotCakeR, chocoCakeR, bfCakeR, cakeI, carrotCakeI, chocoCakeI, bfCakeI; - - public static ICarpenterRecipe syringeR, parachuteR, bandageR, badBandageR, goodBandageR, cogShaftR; - - public static IAnvilRecipe hingeRecipe, brushRecipe, climbPickbR, iframeR, boltR, istrutR, bgearR, tgearR, stubeR, eatoolsR, bombarrowR, bombBoltR, compPlateR; - public static ICarpenterRecipe mouldRecipe, jugRecipe, potRecipe, pieTrayRecipe, blackpowderRec, advblackpowderRec, magmaRefinedR, chocoRecipe, bedrollR; - - public static IAnvilRecipe frameBlockR, cogPulleyR, cogLegsR, cogChestR, cogHelmR; - public static ArrayList hugePlateR = new ArrayList(); - public static ArrayList cogPlateR = new ArrayList(); - - public static final ArrayList easyPaintPlank = new ArrayList(); - public static final ArrayList refinedPlankR = new ArrayList(); - - public static ArrayList sawnPlankR = new ArrayList(); - public static ArrayList plankPaneR = new ArrayList(); - public static ArrayList rackRecipe = new ArrayList(); - public static ArrayList foodboxR = new ArrayList(); - public static ArrayList ammoboxR = new ArrayList(); - public static ArrayList bigboxR = new ArrayList(); - public static ArrayList nailTroughR = new ArrayList(); + + public static IRecipe firepitRecipe, cooktopRecipe, carpenterRecipe, waterJugR, milkJugR, plantOilR, sugarRecipe, + stickRecipe, dryrocksR, meatpieOut, shepardOut, cheeseOut, berryOut, appleOut, pumpPieOut; + public static final ArrayList plankRecipe = new ArrayList(); + public static final ArrayList stoneBricksR = new ArrayList(); + + public static IAnvilRecipe hunkR, ingotR, bucketR, crestR; + public static final ArrayList barR = new ArrayList(); + public static final ArrayList baringotR = new ArrayList(); + + public static final ArrayList talismanRecipe = new ArrayList(); + public static ICarpenterRecipe artBookR, conBookR, proBookR, engBookR, comBookR, artBook2R, conBook2R, proBook2R, + engBook2R, comBook2R; + public static IAnvilRecipe greatTalismanRecipe; + + public static ICarpenterRecipe fireclayR, fireBrickR, fireBricksR, fireBrickStairR, refinedPlankBlockR, clayWallR, + bSalvageR, tannerRecipe, stoneAnvilRecipe, forgeRecipe, apronRecipe, woodTroughRecipe; + public static ICarpenterRecipe researchTableRecipe, framedGlassR, windowR, thatchR, thatchStairR; + public static IAnvilRecipe smokePipeR, framedStoneR, iframedStoneR, fluxR, nailR, rivetR; + public static final ArrayList barsR = new ArrayList(); + + public static IAnvilRecipe tinderboxR, flintAndSteelR; + public static ICarpenterRecipe dirtRockR, lStripsR, threadR, stringR, sharpRocksR, stonePickR, stoneAxeR, + stoneSpadeR, stoneHoeR, stoneSwordR, stoneWarR, stoneMaceR, stoneSpearR, stoneHammerR, stoneTongsR, + boneNeedleR, stoneKnifeR, quernR, stoneovenRecipe; + + public static Alloy[] reStone, bronze, steel, obsidalloy, black, red, blue, mithril, adamantium, ignotumite, + mithium, enderforge, wolframiteR; + public static IAnvilRecipe coalfluxR, encrustedR, steelR, obsidianHunkR, diamondR; + public static ICarpenterRecipe nailPlanksR, nailStairR, refinedStairR, strongRackR, bellowsRecipe, bloomeryR, + crucibleRecipe, advCrucibleRecipe, trilogyRecipe, chimneyRecipe, wideChimneyRecipe, extractChimneyRecipe; + + public static ICarpenterRecipe hideHelmR, hideChestR, hideLegsR, hideBootsR, roughHelmetR, roughChestR, roughLegsR, + roughBootsR, reHelmetR, reChestR, reLegsR, reBootsR; + public static IAnvilRecipe studHelmetR, studChestR, studLegsR, studBootsR; + public static final ArrayList mailRecipes = new ArrayList(); + public static final ArrayList mailHelmetR = new ArrayList(); + public static final ArrayList mailChestR = new ArrayList(); + public static final ArrayList mailLegsR = new ArrayList(); + public static final ArrayList mailBootsR = new ArrayList(); + + public static final ArrayList scaleRecipes = new ArrayList(); + public static final ArrayList scaleHelmetR = new ArrayList(); + public static final ArrayList scaleChestR = new ArrayList(); + public static final ArrayList scaleLegsR = new ArrayList(); + public static final ArrayList scaleBootsR = new ArrayList(); + + public static final ArrayList splintRecipes = new ArrayList(); + public static final ArrayList splintHelmetR = new ArrayList(); + public static final ArrayList splintChestR = new ArrayList(); + public static final ArrayList splintLegsR = new ArrayList(); + public static final ArrayList splintBootsR = new ArrayList(); + + public static final ArrayList plateRecipes = new ArrayList(); + public static final ArrayList plateHelmetR = new ArrayList(); + public static final ArrayList plateChestR = new ArrayList(); + public static final ArrayList plateLegsR = new ArrayList(); + public static final ArrayList plateBootsR = new ArrayList(); + + public static final ArrayList ornateWepsR = new ArrayList(); + public static final ArrayList advOrnateWepsR = new ArrayList(); + + public static IAnvilRecipe pickR, axeR, spadeR, hoeR, shearsR; + public static IAnvilRecipe daggerR, swordR, waraxeR, maceR, spearR, bowR, katanaR, gswordR, whammerR, battleaxeR, + halbeardR, lanceR; + public static IAnvilRecipe trowR, hvyPickR, hvyShovelR, handpickR, scytheR, mattockR, lumberR; + public static IAnvilRecipe hammerR, tongsR, hvyHammerR, needleR, sawsR, knifeR, spannerR; + public static IAnvilRecipe arrowheadR, bodkinheadR, broadheadR, crossBoltR; + + public static ICarpenterRecipe fletchingR, fletchingR2, malletR, spoonR; + public static final ArrayList arrowR = new ArrayList(); + + public static IAnvilRecipe ironPrepR, ironPrepR2, coalPrepR; + public static IAnvilRecipe blastChamR, blastHeatR, bigFurnR, bigHeatR; + + public static ICarpenterRecipe padding[] = new ICarpenterRecipe[4]; + public static ICarpenterRecipe repairBasicR, repairAdvancedR, repairOrnateR; + public static ICarpenterRecipe spyglassR, bombBenchCraft, bombPressCraft, advancedForgeR, engTannerR, autoCrucibleR; + public static ICarpenterRecipe crudeBombR, bombFuseR, longFuseR; + public static ICarpenterRecipe crossBenchCraft, crossStockWoodR, crossStockIronR, crossHandleWoodR, crossHeadLightR, + crossHeadMediumR, crossHeadHeavyR, crossHeadAdvancedR, crossAmmoR, crossScopeR; + + public static ICarpenterRecipe bombCaseCeramicR, mineCaseCeramicR, bombCaseCrystalR, mineCaseCrystalR; + public static IAnvilRecipe bombCaseIronR, mineCaseIronR, bombCaseObsidianR, mineCaseObsidianR, crossBayonetR; + + public static final ArrayList meatRecipes = new ArrayList(); + public static ICarpenterRecipe meatStripR, meatHunkR, gutsRecipe; + public static IAnvilRecipe caketinRecipe; + public static ICarpenterRecipe breadSliceR, pastryRecipe, doughRecipe, breadRecipe, curdRecipe, oatsRecipe, + custardRecipe, icingRecipe, stewRecipe, saussageR, jerkyRecipe, meatPieRecipe, sandwitchRecipe, + sandwitchBigRecipe, shepardRecipe, sweetrollRecipe, iceSR, eclairDoughR, eclairIceR, eclairFillR; + public static ICarpenterRecipe pumpPieR, simpCakeR, simpCakeOut, berryR, appleR, cheeserollR, cakeR, carrotCakeR, + chocoCakeR, bfCakeR, cakeI, carrotCakeI, chocoCakeI, bfCakeI; + + public static ICarpenterRecipe syringeR, parachuteR, bandageR, badBandageR, goodBandageR, cogShaftR; + + public static IAnvilRecipe hingeRecipe, brushRecipe, climbPickbR, iframeR, boltR, istrutR, bgearR, tgearR, stubeR, + eatoolsR, bombarrowR, bombBoltR, compPlateR; + public static ICarpenterRecipe mouldRecipe, jugRecipe, potRecipe, pieTrayRecipe, blackpowderRec, advblackpowderRec, + magmaRefinedR, chocoRecipe, bedrollR; + + public static IAnvilRecipe frameBlockR, cogPulleyR, cogLegsR, cogChestR, cogHelmR; + public static ArrayList hugePlateR = new ArrayList(); + public static ArrayList cogPlateR = new ArrayList(); + + public static final ArrayList easyPaintPlank = new ArrayList(); + public static final ArrayList refinedPlankR = new ArrayList(); + + public static ArrayList sawnPlankR = new ArrayList(); + public static ArrayList plankPaneR = new ArrayList(); + public static ArrayList rackRecipe = new ArrayList(); + public static ArrayList foodboxR = new ArrayList(); + public static ArrayList ammoboxR = new ArrayList(); + public static ArrayList bigboxR = new ArrayList(); + public static ArrayList nailTroughR = new ArrayList(); } diff --git a/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java b/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java index 8e9a217d..928d4458 100644 --- a/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java +++ b/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java @@ -2,158 +2,175 @@ import java.util.HashMap; -import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.armour.ArmourMaterialMF; -import minefantasy.mf2.api.helpers.ArmourCalculator; import minefantasy.mf2.util.MFLogUtil; import net.minecraft.item.Item.ToolMaterial; import net.minecraftforge.common.util.EnumHelper; /** - * This is used to create both tool and armour materials. Variables needed: Durability, protection, sharpness, enchantment, weight, harvestLvl + * This is used to create both tool and armour materials. Variables needed: + * Durability, protection, sharpness, enchantment, weight, harvestLvl */ -public class BaseMaterialMF -{ +public class BaseMaterialMF { public static HashMap materialMap = new HashMap(); - public static BaseMaterialMF linen, wool, leatherapron, hide, rough, reinforced, padding, studded, scaled, dragonscale;//Cloth and leather - public static BaseMaterialMF stone, tin, pigiron, silver, gold, ornate, weakblacksteel, weakredsteel, weakbluesteel, tungsten;//Misc Mats - public static BaseMaterialMF copper, bronze, iron, steel, encrusted, obsidian, blacksteel, bluesteel, redsteel,dragonforge, adamantium, mithril, ignotumite, mithium, enderforge;//Tiers - - public static BaseMaterialMF cogworks, compositeAlloy;//Engineer + public static BaseMaterialMF linen, wool, leatherapron, hide, rough, reinforced, padding, studded, scaled, + dragonscale;// Cloth and leather + public static BaseMaterialMF stone, tin, pigiron, silver, gold, ornate, weakblacksteel, weakredsteel, weakbluesteel, + tungsten;// Misc Mats + public static BaseMaterialMF copper, bronze, iron, steel, encrusted, obsidian, blacksteel, bluesteel, redsteel, + dragonforge, adamantium, mithril, ignotumite, mithium, enderforge;// Tiers + + public static BaseMaterialMF cogworks, compositeAlloy;// Engineer /** - * This scales armour so a sword hitting full mail of equal tier has this as a result - * Used so armour can scale up with weapon damage + * This scales armour so a sword hitting full mail of equal tier has this as a + * result Used so armour can scale up with weapon damage */ private static final float armourVsSwordBalance = 2.0F; /** - * The base damage for swords used with players. (Swords are 4+dam, adding 1 dam for player base hit dam) + * The base damage for swords used with players. (Swords are 4+dam, adding 1 dam + * for player base hit dam) */ private static final float swordDam = 5F; - - private static float ACrounding = 10F; //round to nearest 10 + + private static float ACrounding = 10F; // round to nearest 10 /* - * WOOD(0, 59, 2.0F, 0.0F, 15), - STONE(1, 131, 4.0F, 1.0F, 5), - IRON(2, 250, 6.0F, 2.0F, 14), - EMERALD(3, 1561, 8.0F, 3.0F, 10), - GOLD(0, 32, 12.0F, 0.0F, 22); - + * WOOD(0, 59, 2.0F, 0.0F, 15), STONE(1, 131, 4.0F, 1.0F, 5), IRON(2, 250, 6.0F, + * 2.0F, 14), EMERALD(3, 1561, 8.0F, 3.0F, 10), GOLD(0, 32, 12.0F, 0.0F, 22); + * * To get variables: X = sword damage, Y = Armour Ratio(+1 of value), Z = Damage * - * X = Z * Y - * Y = X / Z - * Z = X / Y + * X = Z * Y Y = X / Z Z = X / Y */ - //Rounding off to nearest 0.5 makes about an 0.03 difference, but the AR is cleaner - //Hardness isn't added, it calculats armour itself to match sharpness - // name dura, AC enchant weight - public static void init() - { - //LEATHER AND CLOTH - linen = addArmourSpecificMaterial("Linen", 0, 10 , 0.1F, 0, 1.00F, 0); - wool = addArmourSpecificMaterial("Wool" , 1, 15 , 0.1F, 0, 1.00F, 5); - - leatherapron = addArmourSpecificMaterial("LeatherApron", 0, 10 , 1.5F, 0, 0.50F, 0); - hide = addArmourSpecificMaterial("Hide", 0, 100 , 1.5F, 0, 1.00F, 0); - rough = addArmourSpecificMaterial("RoughLeather", 0, 150 , 1.5F, 1, 1.00F, 0); - reinforced = addArmourSpecificMaterial("StrongLeather", 1, 250, 2.0F, 1, 1.00F, 5); - padding = addArmourSpecificMaterial("Padded", 1, 200 , 2.0F, 0, 1.00F, 5); - studded = addArmourSpecificMaterial("StudLeather", 1, 500, 2.5F, 5, 1.20F, 15); - scaled = addArmourSpecificMaterial("ScaleLeather", 2, 1000, 2.8F, 8, 1.50F, 25); - dragonscale = addArmourSpecificMaterial("Dragonscale", 3, 3000, 5F, 20, 1.20F, 85).setRarity(2); - - // name Tier dura, harvest sharpness enchant weight - //MISC - weakblacksteel = addMaterial("BlackSteelWeak", -1, 250, 4, 2.0F, 0, 1.00F, 40).setForgeStats(4, 4, 4.0F, 150, 500); - weakredsteel = addMaterial("RedSteelWeak", -1, 400, 5, 3.0F, 0, 1.10F, 65).setForgeStats(4, 4, 4.0F, 200, 500); - weakbluesteel = addMaterial("BlueSteelWeak", -1, 300, 5, 2.5F, 0, 0.90F, 65).setForgeStats(4, 4, 4.0F, 175, 500); - stone = addMaterial("Stone", 0, 50 , 0, 0.1F, 0.0F, 0, 2.00F, 0).setForgeStats(0, 0, 0.75F, 0, 0); - tin = addMaterial("Tin", 0, 100, 0, 0.2F, 5 , 0.80F, 0).setForgeStats(0, 0, 0, 85, 100); - pigiron = addMaterial("PigIron", 0, 250, 0, 1.5F, 3 , 1.00F, 0).setForgeStats(2, 2, 2.0F, 100, 400); - silver = addMaterial("Silver", -1, 150, 0, 0.0F, 10, 0.70F, 0).setForgeStats(1, 1, 3F, 90, 120); - gold = addMaterial("Gold", -1, 150, 0, 0.0F, 25, 1.50F, 0).setForgeStats(1, 1, 3F, 90, 120); - //goldPure = addMaterial("PureGold", -1, 50 , 0, 0.0F, 50, 2.00F, 0).setRarity(1); - ornate = addMaterial("Ornate", -1, 300, 0, 0.0F, 30, 1.00F, 30).setRarity(1).setForgeStats(1, 1, 4F, 120, 150); - tungsten = addMaterial("Tungsten", 2, 600, 3, 4F, 5 , 1.50F, 0).setRarity(1).setForgeStats(3, 3, 5.0F, 150, 300); - - //TIERS - //Basic / Common Materials (0-2) Levels 0-50 - copper = addMaterial("Copper", 0, 200, 1, 1.0F, 5, 1.00F, 0).setForgeStats(0, 0, 1.0F, 95, 250); //lvl 0-4 - bronze = addMaterial("Bronze", 1, 300, 2, 1.5F, 5 , 1.00F, 5).setForgeStats(1, 1, 2.5F, 100, 250); //lvl 5-14 - iron = addMaterial("Iron", 2, 500, 2, 2.0F, 5 , 1.00F, 15).setForgeStats(2, 2, 2.0F, 90, 250); //lvl 15-24 - steel = addMaterial("Steel", 3, 750, 2, 2.5F, 10, 1.00F, 25).setForgeStats(3, 3, 2.5F, 120, 250); //lvl 25-39 - encrusted = addMaterial("Encrusted", 3, 2000, 3, 3.5F, 25, 1.00F, 40).setForgeStats(3, 3, 5.0F, 130, 240); //lvl 40-49 - obsidian = addMaterial("Obsidian", 3, 2000, 3, 3.5F, 25, 1.00F, 40).setForgeStats(3, 3, 5.0F, 130, 240); //lvl 40-49 - //Advanced Materials (3 - 4) Levels 50-75 - blacksteel = addMaterial("BlackSteel", 4, 1500, 4, 4.0F, 12, 1.00F, 50).setForgeStats(4, 4, 4.0F, 150, 350);//lvl 50 - dragonforge = addMaterial("Dragonforge", 4, 1500, 4, 5.0F, 14, 1.00F, 60).setForgeStats(4, 4, 8.0F, 250, 350).setRarity(1).setResistances(100F, 0F);//lvl 60 - redsteel = addMaterial("RedSteel", 5, 2000, 5, 6.0F, 1 , 1.15F, 75).setForgeStats(5, 5, 6.5F, 200, 350).setResistances(20F, 0F);//lvl 75 - bluesteel = addMaterial("BlueSteel", 5, 1800, 5, 5.0F, 20, 0.75F, 75).setForgeStats(5, 5, 4.5F, 175, 325).setResistances(0F, 20F);//lvl 75 - //Mythic Materials (5) Levels 75-100 - adamantium = addMaterial("Adamantium", 6, 3000, 6, 8.0F, 10 , 1.25F, 90).setForgeStats(6, 5, 9.0F, 300, 400).setRarity(1).setResistances(35F, 0F);//lvl 90 - mithril = addMaterial("Mithril", 6, 2500, 6, 7.0F, 30, 0.50F, 90).setForgeStats(6, 5, 6.0F, 280, 400).setRarity(1).setResistances(0F, 35F);//lvl 90 - //Masterwork Materials (6) Level 100 - ignotumite = addMaterial("Ignotumite", 7, 1000, 7, 14.0F, 20 , 2.00F, 100).setForgeStats(7, 5, 15.0F, 350, 400).setRarity(2).setResistances(50F, 0F);//High damage, heavy, fire resist lvl 100 - mithium = addMaterial("Mithium", 7, 1000, 7, 10.0F, 40, 0.25F, 100).setForgeStats(7, 5, 15.0F, 330, 400).setRarity(2).setResistances(0F, 50F);//Low damage, light, magic resist lvl 100 - enderforge = addMaterial("Ender", 7, 1000, 7, 12.0F, 20, 1.00F, 100).setForgeStats(7, 5, 15.0F, 400, 450).setRarity(2).setResistances(25F, 25F);//Middle lvl 100 - //Engineer Materials - //steel = addMaterial("Steel", 3, 750, 2, 2.5F, 10, 1.00F, 25).setForgeStats(3, 3, 2.5F, 120, 250); //lvl 25-39 - cogworks = addArmourSpecificMaterial("Cogworks", 4, 500, 1.0F, 10, 1.00F, 85).setForgeStats(3, 3, 2.5F, 120, 250); - compositeAlloy = addArmourSpecificMaterial("CompositeAlloy", 4, 1800, 4.0F, 10, 2.00F, 85).setForgeStats(3, 3, 2.5F, 120, 250).setResistances(95F, 85F); - + // Rounding off to nearest 0.5 makes about an 0.03 difference, but the AR is + // cleaner + // Hardness isn't added, it calculats armour itself to match sharpness + // name dura, AC enchant weight + + public static void init() { + // LEATHER AND CLOTH + linen = addArmourSpecificMaterial("Linen", 0, 10, 0.1F, 0, 1.00F, 0); + wool = addArmourSpecificMaterial("Wool", 1, 15, 0.1F, 0, 1.00F, 5); + + leatherapron = addArmourSpecificMaterial("LeatherApron", 0, 10, 1.5F, 0, 0.50F, 0); + hide = addArmourSpecificMaterial("Hide", 0, 100, 1.5F, 0, 1.00F, 0); + rough = addArmourSpecificMaterial("RoughLeather", 0, 150, 1.5F, 1, 1.00F, 0); + reinforced = addArmourSpecificMaterial("StrongLeather", 1, 250, 2.0F, 1, 1.00F, 5); + padding = addArmourSpecificMaterial("Padded", 1, 200, 2.0F, 0, 1.00F, 5); + studded = addArmourSpecificMaterial("StudLeather", 1, 500, 2.5F, 5, 1.20F, 15); + scaled = addArmourSpecificMaterial("ScaleLeather", 2, 1000, 2.8F, 8, 1.50F, 25); + dragonscale = addArmourSpecificMaterial("Dragonscale", 3, 3000, 5F, 20, 1.20F, 85).setRarity(2); + + // name Tier dura, harvest sharpness enchant weight + // MISC + weakblacksteel = addMaterial("BlackSteelWeak", -1, 250, 4, 2.0F, 0, 1.00F, 40).setForgeStats(4, 4, 4.0F, 150, + 500); + weakredsteel = addMaterial("RedSteelWeak", -1, 400, 5, 3.0F, 0, 1.10F, 65).setForgeStats(4, 4, 4.0F, 200, 500); + weakbluesteel = addMaterial("BlueSteelWeak", -1, 300, 5, 2.5F, 0, 0.90F, 65).setForgeStats(4, 4, 4.0F, 175, + 500); + stone = addMaterial("Stone", 0, 50, 0, 0.1F, 0.0F, 0, 2.00F, 0).setForgeStats(0, 0, 0.75F, 0, 0); + tin = addMaterial("Tin", 0, 100, 0, 0.2F, 5, 0.80F, 0).setForgeStats(0, 0, 0, 85, 100); + pigiron = addMaterial("PigIron", 0, 250, 0, 1.5F, 3, 1.00F, 0).setForgeStats(2, 2, 2.0F, 100, 400); + silver = addMaterial("Silver", -1, 150, 0, 0.0F, 10, 0.70F, 0).setForgeStats(1, 1, 3F, 90, 120); + gold = addMaterial("Gold", -1, 150, 0, 0.0F, 25, 1.50F, 0).setForgeStats(1, 1, 3F, 90, 120); + // goldPure = addMaterial("PureGold", -1, 50 , 0, 0.0F, 50, 2.00F, + // 0).setRarity(1); + ornate = addMaterial("Ornate", -1, 300, 0, 0.0F, 30, 1.00F, 30).setRarity(1).setForgeStats(1, 1, 4F, 120, 150); + tungsten = addMaterial("Tungsten", 2, 600, 3, 4F, 5, 1.50F, 0).setRarity(1).setForgeStats(3, 3, 5.0F, 150, 300); + + // TIERS + // Basic / Common Materials (0-2) Levels 0-50 + copper = addMaterial("Copper", 0, 200, 1, 1.0F, 5, 1.00F, 0).setForgeStats(0, 0, 1.0F, 95, 250); // lvl 0-4 + bronze = addMaterial("Bronze", 1, 300, 2, 1.5F, 5, 1.00F, 5).setForgeStats(1, 1, 2.5F, 100, 250); // lvl 5-14 + iron = addMaterial("Iron", 2, 500, 2, 2.0F, 5, 1.00F, 15).setForgeStats(2, 2, 2.0F, 90, 250); // lvl 15-24 + steel = addMaterial("Steel", 3, 750, 2, 2.5F, 10, 1.00F, 25).setForgeStats(3, 3, 2.5F, 120, 250); // lvl 25-39 + encrusted = addMaterial("Encrusted", 3, 2000, 3, 3.5F, 25, 1.00F, 40).setForgeStats(3, 3, 5.0F, 130, 240); // lvl + // 40-49 + obsidian = addMaterial("Obsidian", 3, 2000, 3, 3.5F, 25, 1.00F, 40).setForgeStats(3, 3, 5.0F, 130, 240); // lvl + // 40-49 + // Advanced Materials (3 - 4) Levels 50-75 + blacksteel = addMaterial("BlackSteel", 4, 1500, 4, 4.0F, 12, 1.00F, 50).setForgeStats(4, 4, 4.0F, 150, 350);// lvl + // 50 + dragonforge = addMaterial("Dragonforge", 4, 1500, 4, 5.0F, 14, 1.00F, 60).setForgeStats(4, 4, 8.0F, 250, 350) + .setRarity(1).setResistances(100F, 0F);// lvl 60 + redsteel = addMaterial("RedSteel", 5, 2000, 5, 6.0F, 1, 1.15F, 75).setForgeStats(5, 5, 6.5F, 200, 350) + .setResistances(20F, 0F);// lvl 75 + bluesteel = addMaterial("BlueSteel", 5, 1800, 5, 5.0F, 20, 0.75F, 75).setForgeStats(5, 5, 4.5F, 175, 325) + .setResistances(0F, 20F);// lvl 75 + // Mythic Materials (5) Levels 75-100 + adamantium = addMaterial("Adamantium", 6, 3000, 6, 8.0F, 10, 1.25F, 90).setForgeStats(6, 5, 9.0F, 300, 400) + .setRarity(1).setResistances(35F, 0F);// lvl 90 + mithril = addMaterial("Mithril", 6, 2500, 6, 7.0F, 30, 0.50F, 90).setForgeStats(6, 5, 6.0F, 280, 400) + .setRarity(1).setResistances(0F, 35F);// lvl 90 + // Masterwork Materials (6) Level 100 + ignotumite = addMaterial("Ignotumite", 7, 1000, 7, 14.0F, 20, 2.00F, 100).setForgeStats(7, 5, 15.0F, 350, 400) + .setRarity(2).setResistances(50F, 0F);// High damage, heavy, fire resist lvl 100 + mithium = addMaterial("Mithium", 7, 1000, 7, 10.0F, 40, 0.25F, 100).setForgeStats(7, 5, 15.0F, 330, 400) + .setRarity(2).setResistances(0F, 50F);// Low damage, light, magic resist lvl 100 + enderforge = addMaterial("Ender", 7, 1000, 7, 12.0F, 20, 1.00F, 100).setForgeStats(7, 5, 15.0F, 400, 450) + .setRarity(2).setResistances(25F, 25F);// Middle lvl 100 + // Engineer Materials + // steel = addMaterial("Steel", 3, 750, 2, 2.5F, 10, 1.00F, 25).setForgeStats(3, + // 3, 2.5F, 120, 250); //lvl 25-39 + cogworks = addArmourSpecificMaterial("Cogworks", 4, 500, 1.0F, 10, 1.00F, 85).setForgeStats(3, 3, 2.5F, 120, + 250); + compositeAlloy = addArmourSpecificMaterial("CompositeAlloy", 4, 1800, 4.0F, 10, 2.00F, 85) + .setForgeStats(3, 3, 2.5F, 120, 250).setResistances(95F, 85F); + } -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CLASS START~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CLASS + // START~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// /** * This method auto-calculates the Armour Rating to scale the damage */ - public static BaseMaterialMF addArmourSpecificMaterial(String name, int tier, int durability, float AC, int enchantment, float weight, int lvl) - { + public static BaseMaterialMF addArmourSpecificMaterial(String name, int tier, int durability, float AC, + int enchantment, float weight, int lvl) { return addMaterial(name, tier, durability, -1, AC, -1, enchantment, weight, lvl); } - - public static BaseMaterialMF addMaterial(String name, int tier, int durability, int harvestLevel, float sharpness, int enchantment, float weight, int lvl) - { + + public static BaseMaterialMF addMaterial(String name, int tier, int durability, int harvestLevel, float sharpness, + int enchantment, float weight, int lvl) { float AC = 0; - AC = ((sharpness+swordDam)/armourVsSwordBalance) - 1.0F; + AC = ((sharpness + swordDam) / armourVsSwordBalance) - 1.0F; MFLogUtil.logDebug("Added Ratio Armour Material " + name + " AR = " + AC); float initAc = AC; - - AC = Math.round(AC*(100F/ACrounding)); - AC = AC/(100F/ACrounding); - - if(initAc != AC) - { + + AC = Math.round(AC * (100F / ACrounding)); + AC = AC / (100F / ACrounding); + + if (initAc != AC) { MFLogUtil.logDebug("Auto-Calculated ArmourRating for tier: " + name + ", modified to " + AC); } return addMaterial(name, tier, durability, harvestLevel, AC, sharpness, enchantment, weight, lvl); } - - public static BaseMaterialMF addMaterial(String name, int tier, int durability, int harvestLevel, float hardness, float sharpness, int enchantment, float weight, int lvl) - { - return register(new BaseMaterialMF(name, tier, durability, harvestLevel, hardness, sharpness, enchantment, weight, lvl)); + + public static BaseMaterialMF addMaterial(String name, int tier, int durability, int harvestLevel, float hardness, + float sharpness, int enchantment, float weight, int lvl) { + return register(new BaseMaterialMF(name, tier, durability, harvestLevel, hardness, sharpness, enchantment, + weight, lvl)); } - - public static BaseMaterialMF register(BaseMaterialMF material) - { + + public static BaseMaterialMF register(BaseMaterialMF material) { materialMap.put(material.name.toLowerCase(), material); return material; } - + public String name; - + /** * This variable determines max uses */ public int durability; /** - * This variable determines the protection - * : Hardness and sharpness are normally relevant to each other (so armour vs weapon equal tier has the same after-calculation damage) + * This variable determines the protection : Hardness and sharpness are normally + * relevant to each other (so armour vs weapon equal tier has the same + * after-calculation damage) */ public float hardness; /** - * This variable determines damage and dig speed - * : Hardness and sharpness are normally relevant to each other (so armour vs weapon equal tier has the same after-calculation damage) + * This variable determines damage and dig speed : Hardness and sharpness are + * normally relevant to each other (so armour vs weapon equal tier has the same + * after-calculation damage) */ public float sharpness; /** @@ -161,38 +178,38 @@ public static BaseMaterialMF register(BaseMaterialMF material) */ public int enchantment; public float weight; - + /** * The required level to craft */ public int requiredLevel; - - //TIERING + + // TIERING /** * The tier the material is on */ public int tier; public int harvestLevel; - - //FORGING + + // FORGING public int hammerTier; public int anvilTier; public float craftTimeModifier = 2.0F; public int workableTemp = 100; public int unstableTemp = 150; - - //RESISTANCES + + // RESISTANCES public float fireResistance; public float arcaneResistance; public boolean isMythic = false; - - //SPECIALS + + // SPECIALS private ArmourMaterialMF armourConversion; private ToolMaterial toolConversion; public int rarity; - - public BaseMaterialMF(String name, int tier, int durability, int harvestLevel, float hardness, float sharpness, int enchantment, float weight, int lvl) - { + + public BaseMaterialMF(String name, int tier, int durability, int harvestLevel, float hardness, float sharpness, + int enchantment, float weight, int lvl) { this.requiredLevel = lvl; this.name = name; this.tier = tier; @@ -203,81 +220,75 @@ public BaseMaterialMF(String name, int tier, int durability, int harvestLevel, f this.weight = weight; this.harvestLevel = harvestLevel; } - - protected BaseMaterialMF setForgeStats(int hammer, int anvil, float timer, int workable, int unstable) - { + + protected BaseMaterialMF setForgeStats(int hammer, int anvil, float timer, int workable, int unstable) { hammerTier = hammer; anvilTier = anvil; - craftTimeModifier = (timer*2F) + 2.0F; + craftTimeModifier = (timer * 2F) + 2.0F; workableTemp = workable; unstableTemp = unstable; return this; } - protected BaseMaterialMF setResistances(float fire, float arcane) - { + + protected BaseMaterialMF setResistances(float fire, float arcane) { fireResistance = fire; arcaneResistance = arcane; return this; } - protected BaseMaterialMF setRarity(int value) - { + + protected BaseMaterialMF setRarity(int value) { rarity = value; return this; } - protected BaseMaterialMF setMythic() - { + + protected BaseMaterialMF setMythic() { isMythic = true; return this; } - private ArmourMaterialMF convertToMFArmour() - { - return new ArmourMaterialMF("MF"+name, durability, hardness, enchantment, weight).setFireResistance(fireResistance).setMagicResistance(arcaneResistance).setMythic(isMythic); + + private ArmourMaterialMF convertToMFArmour() { + return new ArmourMaterialMF("MF" + name, durability, hardness, enchantment, weight) + .setFireResistance(fireResistance).setMagicResistance(arcaneResistance).setMythic(isMythic); } - - private ToolMaterial convertToTool() - { - return EnumHelper.addToolMaterial("MF"+name, harvestLevel, durability, 2.0F+(sharpness*2F), sharpness, enchantment); + + private ToolMaterial convertToTool() { + return EnumHelper.addToolMaterial("MF" + name, harvestLevel, durability, 2.0F + (sharpness * 2F), sharpness, + enchantment); } - - private static ArmourMaterialMF getMFArmourMaterial(String name) - { + + private static ArmourMaterialMF getMFArmourMaterial(String name) { BaseMaterialMF material = materialMap.get(name); return material != null ? getMFArmourMaterial(material) : null; } - public ArmourMaterialMF getArmourConversion() - { - if(armourConversion == null) - { + + public ArmourMaterialMF getArmourConversion() { + if (armourConversion == null) { armourConversion = getMFArmourMaterial(this); } return armourConversion; } - public static ArmourMaterialMF getMFArmourMaterial(BaseMaterialMF material) - { + + public static ArmourMaterialMF getMFArmourMaterial(BaseMaterialMF material) { return material.convertToMFArmour(); } - - public static ToolMaterial getToolMaterial(String name) - { + + public static ToolMaterial getToolMaterial(String name) { BaseMaterialMF material = materialMap.get(name); return material != null ? getToolMaterial(material) : null; } - public ToolMaterial getToolConversion() - { - if(toolConversion == null) - { + + public ToolMaterial getToolConversion() { + if (toolConversion == null) { toolConversion = getToolMaterial(this); } return toolConversion; } - - public static ToolMaterial getToolMaterial(BaseMaterialMF material) - { + + public static ToolMaterial getToolMaterial(BaseMaterialMF material) { return material.convertToTool(); } - - public static BaseMaterialMF getMaterial(String name) - { + + public static BaseMaterialMF getMaterial(String name) { return materialMap.get(name.toLowerCase()); } } diff --git a/src/main/java/minefantasy/mf2/material/LeatherMaterial.java b/src/main/java/minefantasy/mf2/material/LeatherMaterial.java index cdcf38a1..eea4d6e6 100644 --- a/src/main/java/minefantasy/mf2/material/LeatherMaterial.java +++ b/src/main/java/minefantasy/mf2/material/LeatherMaterial.java @@ -2,27 +2,25 @@ import minefantasy.mf2.api.material.CustomMaterial; -public class LeatherMaterial extends CustomMaterial -{ - public LeatherMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, float resistance, float density) - { +public class LeatherMaterial extends CustomMaterial { + public LeatherMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, + float resistance, float density) { super(name, "leather", tier, hardness, durability, flexibility, sharpness, resistance, density); } - - public static CustomMaterial getOrAddWood(String name, int tier, float hardness, float durability, float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) - { - if(getMaterial(name) != null) - { + + public static CustomMaterial getOrAddWood(String name, int tier, float hardness, float durability, + float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) { + if (getMaterial(name) != null) { return CustomMaterial.getMaterial(name); } - return new LeatherMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density).setColour(red, green, blue).register(); + return new LeatherMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density) + .setColour(red, green, blue).register(); } - - public static void init() - { - getOrAddWood("Leather", 0, 1.0F, 0.4F, 1.2F, 0F, 0.5F, 0.1F, 198, 92 , 53 ); - getOrAddWood("HardLeather", 1, 1.5F, 0.8F, 1.0F, 0F, 0.5F, 0.2F, 154, 72 , 41 ); - getOrAddWood("MinotaurSkin", 2, 2.0F, 1.5F, 0.8F, 0F, 1.0F, 0.5F, 118, 69 , 48 ); - getOrAddWood("DragonSkin", 3, 3.0F, 2.0F, 1.0F, 0F, 1.2F, 0.75F, 56 , 43 , 66); + + public static void init() { + getOrAddWood("Leather", 0, 1.0F, 0.4F, 1.2F, 0F, 0.5F, 0.1F, 198, 92, 53); + getOrAddWood("HardLeather", 1, 1.5F, 0.8F, 1.0F, 0F, 0.5F, 0.2F, 154, 72, 41); + getOrAddWood("MinotaurSkin", 2, 2.0F, 1.5F, 0.8F, 0F, 1.0F, 0.5F, 118, 69, 48); + getOrAddWood("DragonSkin", 3, 3.0F, 2.0F, 1.0F, 0F, 1.2F, 0.75F, 56, 43, 66); } } diff --git a/src/main/java/minefantasy/mf2/material/MetalMaterial.java b/src/main/java/minefantasy/mf2/material/MetalMaterial.java index 13c72158..de78ddeb 100644 --- a/src/main/java/minefantasy/mf2/material/MetalMaterial.java +++ b/src/main/java/minefantasy/mf2/material/MetalMaterial.java @@ -3,125 +3,149 @@ import java.util.ArrayList; import java.util.Iterator; -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.util.MFLogUtil; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; -public class MetalMaterial extends CustomMaterial -{ - public MetalMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, float resistance, float density) - { +public class MetalMaterial extends CustomMaterial { + public MetalMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, + float resistance, float density) { super(name, "metal", tier, hardness, durability, flexibility, resistance, sharpness, density); - setArmourStats(1.0F, flexibility, 1F/flexibility);//Harder materials absorb blunt less but resist cutting and piercing more + setArmourStats(1.0F, flexibility, 1F / flexibility);// Harder materials absorb blunt less but resist cutting and + // piercing more } - + /** * Adds a new metal - * @param name The name, and register for the metal - * @param tier What tier the metal is - * @param hardness How hard the material is to break - * @param flexibility How well the metal can bend - * @param sharpness How well the metal can be sharpened - * @param resistance The resistance to elements such as fire and corrosion, right now its just 0-100 for armour resistance against elements - * @param density The overall mass (Kg) for an ingot + * + * @param name + * The name, and register for the metal + * @param tier + * What tier the metal is + * @param hardness + * How hard the material is to break + * @param flexibility + * How well the metal can bend + * @param sharpness + * How well the metal can be sharpened + * @param resistance + * The resistance to elements such as fire and corrosion, right now + * its just 0-100 for armour resistance against elements + * @param density + * The overall mass (Kg) for an ingot */ - public static CustomMaterial getOrAddMetal(String name, int tier, float durability, float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) - { - if(getMaterial(name) != null) - { + public static CustomMaterial getOrAddMetal(String name, int tier, float durability, float flexibility, + float sharpness, float resistance, float density, int red, int green, int blue) { + if (getMaterial(name) != null) { return CustomMaterial.getMaterial(name); } - float hardness = ((sharpness+5F)/2F)-1F; - return new MetalMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density).setColour(red, green, blue).register(); + float hardness = ((sharpness + 5F) / 2F) - 1F; + return new MetalMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density) + .setColour(red, green, blue).register(); } - public static CustomMaterial getOrAddMetal(String name, int tier, float hardness, float durability, float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) - { - if(getMaterial(name) != null) - { + + public static CustomMaterial getOrAddMetal(String name, int tier, float hardness, float durability, + float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) { + if (getMaterial(name) != null) { return CustomMaterial.getMaterial(name); } - return new MetalMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density).setColour(red, green, blue).register(); + return new MetalMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density) + .setColour(red, green, blue).register(); } - - public static void init() - { - /* BaseMaterialMF - * WOOD(0, 59, 2.0F, 0.0F, 15), - STONE(1, 131, 4.0F, 1.0F, 5), - IRON(2, 250, 6.0F, 2.0F, 14), - EMERALD(3, 1561, 8.0F, 3.0F, 10), - GOLD(0, 32, 12.0F, 0.0F, 22); + + public static void init() { + /* + * BaseMaterialMF WOOD(0, 59, 2.0F, 0.0F, 15), STONE(1, 131, 4.0F, 1.0F, 5), + * IRON(2, 250, 6.0F, 2.0F, 14), EMERALD(3, 1561, 8.0F, 3.0F, 10), GOLD(0, 32, + * 12.0F, 0.0F, 22); */ - - //Weak Mats Name T Dur Flx Shp Rst Wg - getOrAddMetal("Tin", 0, 1.0F, 0.5F, 0.0F, 10F, 2.0F, 164, 177, 177).setRarity(-1).setMeltingPoint(900); - getOrAddMetal("Copper", 0, 1.0F, 1.0F, 0.0F, 50F, 3.0F, 255, 132, 66).setMeltingPoint(1000); - - //Standard Mats Name T Dur Flx Shp Rst Wg - getOrAddMetal("Bronze", 1, 1.5F, 1.0F, 1.5F, 20F, 3.0F, 207, 165, 118).setCrafterTiers(1).setMeltingPoint(1200); - getOrAddMetal("Iron", 2, 2.0F, 1.0F, 2.0F, 20F, 2.5F, 140, 120, 100).setCrafterTiers(2).setMeltingPoint(1200).setArmourStats(1.0F, 1.0F, 1.0F);//Standard - getOrAddMetal("PigIron", 2, 2.0F, 0.8F, 2.0F, 20F, 2.5F, 120, 95, 95).setCrafterTiers(2).setMeltingPoint(1200).setArmourStats(1.1F, 0.8F, 1.1F);//Less Blunt for more cutting/piercing - getOrAddMetal("Steel", 3, 3.0F, 1.0F, 2.5F, 30F, 2.5F, 168, 168, 168).setCrafterTiers(3).setMeltingPoint(1500); - getOrAddMetal("Encrusted", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 64, 255, 255).setCrafterTiers(3).setMeltingPoint(1800).setArmourStats(1.0F, 1.0F, 1.2F);//Better Piercing - getOrAddMetal("Obsidian", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 90 , 45 , 90).setCrafterTiers(3).setMeltingPoint(2000).setArmourStats(1.0F, 1.3F, 1.0F);//Better Blunt - getOrAddMetal("Tungsten", 4, 8.0F, 0.8F, 3.0F, 35F, 4.0F, 66 , 86 , 65).setCrafterTiers(3).setMeltingPoint(2000).setArmourStats(1.3F, 1.0F, 1.3F);//Better Cutting/Piercing - getOrAddMetal("BlackSteel", 5, 6.0F, 1.0F, 4.0F, 50F, 3.0F, 80 , 80 , 80).setCrafterTiers(4).setMeltingPoint(2000).setArmourStats(1.0F, 1.0F, 1.0F);//Standard - getOrAddMetal("BlueSteel", 6, 7.0F, 1.2F, 5.0F, 65F, 2.0F, 28, 31, 159).setCrafterTiers(5).setMeltingPoint(2000).setArmourStats(1.0F, 1.2F, 0.8F);//Better Blunt and Resist - getOrAddMetal("RedSteel", 6, 8.0F, 0.8F, 6.0F, 50F, 3.5F, 219, 56, 56).setCrafterTiers(5).setMeltingPoint(2000).setArmourStats(0.9F, 0.9F, 1.2F);//Better AC and Piercing - - //Precious Mats - getOrAddMetal("Silver", 0, 2.5F, 1.0F, 0.0F, 40F, 3.5F, 155, 206, 205).setMeltingPoint(1200); - getOrAddMetal("Gold", 0, 2.0F, 1.0F, 0.0F, 40F, 3.5F, 243, 222, 49).setMeltingPoint(1200); - - //Mythic Mats Name T Dur Flx Shp Rst Wg - getOrAddMetal("Mithril", 7, 10.0F, 0.8F, 7.0F, 90F, 2.0F, 250, 180, 250).setMeltingPoint(2500).setCrafterTiers(6).setRarity(1); - getOrAddMetal("Adamantium", 7, 12.0F, 0.8F, 8.0F, 80F, 3.5F, 100, 200, 100).setMeltingPoint(2500).setCrafterTiers(6).setRarity(1); - getOrAddMetal("Mithium", 8, 15.0F, 0.8F, 10.0F, 95F, 2.0F, 60 , 200, 255).setMeltingPoint(2500).setCrafterTiers(7).setRarity(2).setUnbreakable(); - getOrAddMetal("Ignotumite", 8, 15.0F, 0.8F, 14.0F, 85F, 3.5F, 20 , 255, 100).setMeltingPoint(3000).setCrafterTiers(7).setRarity(2).setUnbreakable(); - getOrAddMetal("Ender", 8, 15.0F, 0.8F, 12.0F, 90F, 3.0F, 255, 63 , 243).setMeltingPoint(3000).setCrafterTiers(7).setRarity(2).setUnbreakable(); - - //Non-MF - getOrAddMetal("StainlessSteel", 3, 5.0F, 1.0F, 2.5F, 40F, 2.5F, 188, 188, 198).setMeltingPoint(1600).setCrafterTiers(3); - getOrAddMetal("Titanium", 6, 10.0F, 1.0F, 4.0F, 50F, 1.0F, 190, 190, 160).setMeltingPoint(2000).setCrafterTiers(3); - - getOrAddMetal("Thaumium", 4, 4.0F, 1.0F, 3.0F, 65F, 2.5F, 115, 65 , 183).setMeltingPoint(1500).setCrafterTiers(3); - getOrAddMetal("Void", 4, 10.0F, 2.0F, 4.0F, 75F, 1.0F, 75 , 45 , 75).setMeltingPoint(1800).setCrafterTiers(3); - getOrAddMetal("Manasteel", 2, 3.0F, 1.0F, 2.0F, 40F, 2.5F, 88 , 195, 231).setMeltingPoint(1500).setArmourStats(1.0F, 1.2F, 1.0F).setCrafterTiers(2);//More Resistant, Stronger than iron - getOrAddMetal("ElvenElementium",3, 4.0F, 1.0F, 2.5F, 40F, 2.5F, 235, 108, 235).setMeltingPoint(1800).setArmourStats(1.1F, 1.0F, 1.1F).setCrafterTiers(2);//Similar to Manasteel, Slightly stronger - getOrAddMetal("Terrasteel", 4, 6.0F, 1.0F, 4.0F, 40F, 2.5F, 88 , 250, 150).setMeltingPoint(1500).setArmourStats(1.0F, 0.9F, 1.0F).setCrafterTiers(3); - - //Alloy - getOrAddMetal("CompositeAlloy", 4, 4.5F, 10.0F, 1.0F, 2.5F, 75F, 4.0F, 65, 75 ,65).setMeltingPoint(2500).setRarity(1).setCrafterTiers(3).modifyCraftTime(5.0F);//Powerful All-Rounder + + // Weak Mats Name T Dur Flx Shp Rst Wg + getOrAddMetal("Tin", 0, 1.0F, 0.5F, 0.0F, 10F, 2.0F, 164, 177, 177).setRarity(-1).setMeltingPoint(900); + getOrAddMetal("Copper", 0, 1.0F, 1.0F, 0.0F, 50F, 3.0F, 255, 132, 66).setMeltingPoint(1000); + + // Standard Mats Name T Dur Flx Shp Rst Wg + getOrAddMetal("Bronze", 1, 1.5F, 1.0F, 1.5F, 20F, 3.0F, 207, 165, 118).setCrafterTiers(1).setMeltingPoint(1200); + getOrAddMetal("Iron", 2, 2.0F, 1.0F, 2.0F, 20F, 2.5F, 140, 120, 100).setCrafterTiers(2).setMeltingPoint(1200) + .setArmourStats(1.0F, 1.0F, 1.0F);// Standard + getOrAddMetal("PigIron", 2, 2.0F, 0.8F, 2.0F, 20F, 2.5F, 120, 95, 95).setCrafterTiers(2).setMeltingPoint(1200) + .setArmourStats(1.1F, 0.8F, 1.1F);// Less Blunt for more cutting/piercing + getOrAddMetal("Steel", 3, 3.0F, 1.0F, 2.5F, 30F, 2.5F, 168, 168, 168).setCrafterTiers(3).setMeltingPoint(1500); + getOrAddMetal("Encrusted", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 64, 255, 255).setCrafterTiers(3) + .setMeltingPoint(1800).setArmourStats(1.0F, 1.0F, 1.2F);// Better Piercing + getOrAddMetal("Obsidian", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 90, 45, 90).setCrafterTiers(3).setMeltingPoint(2000) + .setArmourStats(1.0F, 1.3F, 1.0F);// Better Blunt + getOrAddMetal("Tungsten", 4, 8.0F, 0.8F, 3.0F, 35F, 4.0F, 66, 86, 65).setCrafterTiers(3).setMeltingPoint(2000) + .setArmourStats(1.3F, 1.0F, 1.3F);// Better Cutting/Piercing + getOrAddMetal("BlackSteel", 5, 6.0F, 1.0F, 4.0F, 50F, 3.0F, 80, 80, 80).setCrafterTiers(4).setMeltingPoint(2000) + .setArmourStats(1.0F, 1.0F, 1.0F);// Standard + getOrAddMetal("BlueSteel", 6, 7.0F, 1.2F, 5.0F, 65F, 2.0F, 28, 31, 159).setCrafterTiers(5).setMeltingPoint(2000) + .setArmourStats(1.0F, 1.2F, 0.8F);// Better Blunt and Resist + getOrAddMetal("RedSteel", 6, 8.0F, 0.8F, 6.0F, 50F, 3.5F, 219, 56, 56).setCrafterTiers(5).setMeltingPoint(2000) + .setArmourStats(0.9F, 0.9F, 1.2F);// Better AC and Piercing + + // Precious Mats + getOrAddMetal("Silver", 0, 2.5F, 1.0F, 0.0F, 40F, 3.5F, 155, 206, 205).setMeltingPoint(1200); + getOrAddMetal("Gold", 0, 2.0F, 1.0F, 0.0F, 40F, 3.5F, 243, 222, 49).setMeltingPoint(1200); + + // Mythic Mats Name T Dur Flx Shp Rst Wg + getOrAddMetal("Mithril", 7, 10.0F, 0.8F, 7.0F, 90F, 2.0F, 250, 180, 250).setMeltingPoint(2500) + .setCrafterTiers(6).setRarity(1); + getOrAddMetal("Adamantium", 7, 12.0F, 0.8F, 8.0F, 80F, 3.5F, 100, 200, 100).setMeltingPoint(2500) + .setCrafterTiers(6).setRarity(1); + getOrAddMetal("Mithium", 8, 15.0F, 0.8F, 10.0F, 95F, 2.0F, 60, 200, 255).setMeltingPoint(2500) + .setCrafterTiers(7).setRarity(2).setUnbreakable(); + getOrAddMetal("Ignotumite", 8, 15.0F, 0.8F, 14.0F, 85F, 3.5F, 20, 255, 100).setMeltingPoint(3000) + .setCrafterTiers(7).setRarity(2).setUnbreakable(); + getOrAddMetal("Ender", 8, 15.0F, 0.8F, 12.0F, 90F, 3.0F, 255, 63, 243).setMeltingPoint(3000).setCrafterTiers(7) + .setRarity(2).setUnbreakable(); + + // Non-MF + getOrAddMetal("StainlessSteel", 3, 5.0F, 1.0F, 2.5F, 40F, 2.5F, 188, 188, 198).setMeltingPoint(1600) + .setCrafterTiers(3); + getOrAddMetal("Titanium", 6, 10.0F, 1.0F, 4.0F, 50F, 1.0F, 190, 190, 160).setMeltingPoint(2000) + .setCrafterTiers(3); + + getOrAddMetal("Thaumium", 4, 4.0F, 1.0F, 3.0F, 65F, 2.5F, 115, 65, 183).setMeltingPoint(1500) + .setCrafterTiers(3); + getOrAddMetal("Void", 4, 10.0F, 2.0F, 4.0F, 75F, 1.0F, 75, 45, 75).setMeltingPoint(1800).setCrafterTiers(3); + getOrAddMetal("Manasteel", 2, 3.0F, 1.0F, 2.0F, 40F, 2.5F, 88, 195, 231).setMeltingPoint(1500) + .setArmourStats(1.0F, 1.2F, 1.0F).setCrafterTiers(2);// More Resistant, Stronger than iron + getOrAddMetal("ElvenElementium", 3, 4.0F, 1.0F, 2.5F, 40F, 2.5F, 235, 108, 235).setMeltingPoint(1800) + .setArmourStats(1.1F, 1.0F, 1.1F).setCrafterTiers(2);// Similar to Manasteel, Slightly stronger + getOrAddMetal("Terrasteel", 4, 6.0F, 1.0F, 4.0F, 40F, 2.5F, 88, 250, 150).setMeltingPoint(1500) + .setArmourStats(1.0F, 0.9F, 1.0F).setCrafterTiers(3); + + // Alloy + getOrAddMetal("CompositeAlloy", 4, 4.5F, 10.0F, 1.0F, 2.5F, 75F, 4.0F, 65, 75, 65).setMeltingPoint(2500) + .setRarity(1).setCrafterTiers(3).modifyCraftTime(5.0F);// Powerful All-Rounder } - - public static void addHeatables() - { + + public static void addHeatables() { ArrayList metal = CustomMaterial.getList("metal"); Iterator iteratorMetal = metal.iterator(); - while(iteratorMetal.hasNext()) - { + while (iteratorMetal.hasNext()) { CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); int[] stats = customMat.getHeatableStats(); - MFLogUtil.logDebug("Set Heatable Stats for " + customMat.name + ": " + stats[0] + "," + stats[1] + "," + stats[2]); - - MineFantasyAPI.setHeatableStats("ingot"+customMat.name, stats[0], stats[1], stats[2]); - MineFantasyAPI.setHeatableStats("hunk"+customMat.name, stats[0], stats[1], stats[2]); - } - + MFLogUtil.logDebug( + "Set Heatable Stats for " + customMat.name + ": " + stats[0] + "," + stats[1] + "," + stats[2]); + + MineFantasyAPI.setHeatableStats("ingot" + customMat.name, stats[0], stats[1], stats[2]); + MineFantasyAPI.setHeatableStats("hunk" + customMat.name, stats[0], stats[1], stats[2]); + } + MineFantasyAPI.setHeatableStats(ComponentListMF.rivet, 1000, 2000, 3000); MineFantasyAPI.setHeatableStats(ComponentListMF.metalHunk, -1, -1, -1); MineFantasyAPI.setHeatableStats(ComponentListMF.bar, -1, -1, -1); } - + @Override - public ItemStack getItem() - { - ArrayList list = OreDictionary.getOres("ingot"+name); - if(list != null && !list.isEmpty()) - { + public ItemStack getItem() { + ArrayList list = OreDictionary.getOres("ingot" + name); + if (list != null && !list.isEmpty()) { return list.get(0); } return null; diff --git a/src/main/java/minefantasy/mf2/material/WoodMaterial.java b/src/main/java/minefantasy/mf2/material/WoodMaterial.java index be31a6e9..fe2f1ed0 100644 --- a/src/main/java/minefantasy/mf2/material/WoodMaterial.java +++ b/src/main/java/minefantasy/mf2/material/WoodMaterial.java @@ -2,108 +2,116 @@ import java.util.ArrayList; +import minefantasy.mf2.api.material.CustomMaterial; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; -import minefantasy.mf2.api.material.CustomMaterial; -public class WoodMaterial extends CustomMaterial -{ - public WoodMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, float resistance, float density) - { +public class WoodMaterial extends CustomMaterial { + public WoodMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, + float resistance, float density) { super(name, "wood", tier, hardness, durability, flexibility, resistance, sharpness, density); } - + /** - * @param name The name of the wood - * @param tier Tier of the material - * @param hardness The impact it can take (used for reinforcment in BG shields), usually an armour rating based value - * @param durability how many uses / 250 - * @param flexibility The ability to flex and reshape, used in bow power - * @param resistance Resistance to rot - * @param density How much a unit (timber plank) weighs in Kg + * @param name + * The name of the wood + * @param tier + * Tier of the material + * @param hardness + * The impact it can take (used for reinforcment in BG shields), + * usually an armour rating based value + * @param durability + * how many uses / 250 + * @param flexibility + * The ability to flex and reshape, used in bow power + * @param resistance + * Resistance to rot + * @param density + * How much a unit (timber plank) weighs in Kg */ - public static CustomMaterial getOrAddWood(String name, int tier, float hardness, float durability, float flexibility, float resistance, float density, int red, int green, int blue) - { - if(getMaterial(name) != null) - { + public static CustomMaterial getOrAddWood(String name, int tier, float hardness, float durability, + float flexibility, float resistance, float density, int red, int green, int blue) { + if (getMaterial(name) != null) { return CustomMaterial.getMaterial(name); } - return new WoodMaterial(name, tier, hardness, durability, flexibility, 0F, resistance, density).setColour(red, green, blue).register(); + return new WoodMaterial(name, tier, hardness, durability, flexibility, 0F, resistance, density) + .setColour(red, green, blue).register(); } + @Override - public String getMaterialString() - { - return StatCollector.translateToLocalFormatted("materialtype."+this.type+".name", this.tier); + public String getMaterialString() { + return StatCollector.translateToLocalFormatted("materialtype." + this.type + ".name", this.tier); } - public static void init() - { + + public static void init() { new CustomMaterial("magic", "Magic", -1, 1F, 0F, 1F, 0F, 0F, 0F).setColour(157, 157, 255).register(); - + MetalMaterial.init(); LeatherMaterial.init(); - //Hardness-The Impact it can take. Used for armour rating, in this case nothing. - //Durability- how many uses it has, 1 pt per 250 uses (1/5th this adds to durability to tools if used as a haft). - //Flexibility- how well the wood can bend and reshape, affects bow damage. This is the direct damage modifier of the bow - //Resistance- Score of how well the wood withstands rot and weathering. - //Density- how much weight (Kg) does the timber plank weigh. - - // Name T Hds Dua Flx Rst Wgt R G B - getOrAddWood("ScrapWood", 0, 0.10F, 0.50F, 0.50F, 10F, 0.5F, 100, 95, 80); - - getOrAddWood("OakWood", 1, 0.70F, 1.00F, 1.30F, 40F, 0.8F, 149, 119, 70).setCrafterTiers(1); - getOrAddWood("SpruceWood", 1, 0.20F, 0.90F, 1.00F, 20F, 0.4F, 102, 79, 47).setCrafterTiers(1); - getOrAddWood("BirchWood", 1, 0.50F, 0.90F, 1.30F, 10F, 0.7F, 200, 183, 122).setCrafterTiers(1); - getOrAddWood("JungleWood", 1, 0.40F, 1.00F, 1.20F, 50F, 0.6F, 159, 113, 74).setCrafterTiers(1); - getOrAddWood("AcaciaWood", 1, 0.50F, 1.20F, 1.00F, 20F, 0.6F, 173, 93, 50).setCrafterTiers(1); - getOrAddWood("DarkOakWood", 1, 1.20F, 1.50F, 1.30F, 50F, 1.0F, 62, 41, 18).setCrafterTiers(1); - - getOrAddWood("RefinedWood", 2, 0.80F, 2.00F, 1.30F, 50F, 0.8F, 95, 40, 24).setCrafterTiers(2).setRarity(1); - getOrAddWood("YewWood", 2, 0.70F, 2.00F, 2.00F, 40F, 0.7F, 195, 138, 54).setCrafterTiers(2).setRarity(1); - getOrAddWood("IronbarkWood", 2, 0.90F, 3.50F, 1.10F, 50F, 0.9F, 202, 92, 29).setCrafterTiers(2).setRarity(1); - - getOrAddWood("EbonyWood", 3, 1.30F, 4.00F, 1.60F, 80F, 1.0F, 50, 46, 40).setCrafterTiers(3).setRarity(2); - - getOrAddWood("SilverwoodWood", 2, 1.00F, 3.50F, 2.20F, 75F, 0.8F, 224, 220, 208).setCrafterTiers(2); - getOrAddWood("GreatwoodWood", 2, 1.20F, 1.50F, 1.00F, 50F, 1.5F, 37, 25, 23).setCrafterTiers(2); + // Hardness-The Impact it can take. Used for armour rating, in this case + // nothing. + // Durability- how many uses it has, 1 pt per 250 uses (1/5th this adds to + // durability to tools if used as a haft). + // Flexibility- how well the wood can bend and reshape, affects bow damage. This + // is the direct damage modifier of the bow + // Resistance- Score of how well the wood withstands rot and weathering. + // Density- how much weight (Kg) does the timber plank weigh. + + // Name T Hds Dua Flx Rst Wgt R G B + getOrAddWood("ScrapWood", 0, 0.10F, 0.50F, 0.50F, 10F, 0.5F, 100, 95, 80); + + getOrAddWood("OakWood", 1, 0.70F, 1.00F, 1.30F, 40F, 0.8F, 149, 119, 70).setCrafterTiers(1); + getOrAddWood("SpruceWood", 1, 0.20F, 0.90F, 1.00F, 20F, 0.4F, 102, 79, 47).setCrafterTiers(1); + getOrAddWood("BirchWood", 1, 0.50F, 0.90F, 1.30F, 10F, 0.7F, 200, 183, 122).setCrafterTiers(1); + getOrAddWood("JungleWood", 1, 0.40F, 1.00F, 1.20F, 50F, 0.6F, 159, 113, 74).setCrafterTiers(1); + getOrAddWood("AcaciaWood", 1, 0.50F, 1.20F, 1.00F, 20F, 0.6F, 173, 93, 50).setCrafterTiers(1); + getOrAddWood("DarkOakWood", 1, 1.20F, 1.50F, 1.30F, 50F, 1.0F, 62, 41, 18).setCrafterTiers(1); + + getOrAddWood("RefinedWood", 2, 0.80F, 2.00F, 1.30F, 50F, 0.8F, 95, 40, 24).setCrafterTiers(2).setRarity(1); + getOrAddWood("YewWood", 2, 0.70F, 2.00F, 2.00F, 40F, 0.7F, 195, 138, 54).setCrafterTiers(2).setRarity(1); + getOrAddWood("IronbarkWood", 2, 0.90F, 3.50F, 1.10F, 50F, 0.9F, 202, 92, 29).setCrafterTiers(2).setRarity(1); + + getOrAddWood("EbonyWood", 3, 1.30F, 4.00F, 1.60F, 80F, 1.0F, 50, 46, 40).setCrafterTiers(3).setRarity(2); + + getOrAddWood("SilverwoodWood", 2, 1.00F, 3.50F, 2.20F, 75F, 0.8F, 224, 220, 208).setCrafterTiers(2); + getOrAddWood("GreatwoodWood", 2, 1.20F, 1.50F, 1.00F, 50F, 1.5F, 37, 25, 23).setCrafterTiers(2); /* - //OTHERS. playing around with, mainly forestry - getOrAddWood("PineWood", 0, 1, 1, 1, 1, 1, 1, 189, 147, 63); - getOrAddWood("CherryWood", 0, 1, 1, 1, 1, 1, 1, 162, 116, 47); - getOrAddWood("PapayaWood", 0, 1, 1, 1, 1, 1, 1, 214, 194, 91); - getOrAddWood("CitrusWood", 0, 1, 1, 1, 1, 1, 1, 142, 153, 27); - getOrAddWood("PoplarWood", 0, 1, 1, 1, 1, 1, 1, 198, 198, 107); - getOrAddWood("MapleWood", 0, 1, 1, 1, 1, 1, 1, 158, 99, 39); - getOrAddWood("MahoeWood", 0, 1, 1, 1, 1, 1, 1, 111, 138, 158); - getOrAddWood("GreenheartWood", 0, 1, 1, 1, 1, 1, 1, 65, 103, 77); - getOrAddWood("PalmWood", 0, 1, 1, 1, 1, 1, 1, 195, 114, 56); - getOrAddWood("LimeWood", 0, 1, 1, 1, 1, 1, 1, 190, 147, 96); - getOrAddWood("BalsaWood", 0, 1, 1, 1, 1, 1, 1, 159, 152, 143); - getOrAddWood("WalnutWood", 0, 1, 1, 1, 1, 1, 1, 85, 69, 55); - getOrAddWood("KapokWood", 0, 1, 1, 1, 1, 1, 1, 99, 95, 45); - getOrAddWood("ChestnutWood", 0, 1, 1, 1, 1, 1, 1, 156, 147, 74); - getOrAddWood("BaobabWood", 0, 1, 1, 1, 1, 1, 1, 116, 126, 84); - getOrAddWood("LarchWood", 0, 1, 1, 1, 1, 1, 1, 200, 143, 122); - getOrAddWood("WillowWood", 0, 1, 1, 1, 1, 1, 1, 149, 152, 74); - getOrAddWood("TeakWood", 0, 1, 1, 1, 1, 1, 1, 111, 107, 91); - getOrAddWood("SequoiaWood", 0, 1, 1, 1, 1, 1, 1, 123, 81, 75); - getOrAddWood("MahoganyWood", 0, 1, 1, 1, 1, 1, 1, 95, 56, 49); - getOrAddWood("WengeWood", 0, 1, 1, 1, 1, 1, 1, 76, 72, 62); - getOrAddWood("RedwoodWood", 0, 1, 1, 1, 1, 1, 1, 148, 104, 55); - getOrAddWood("FirWood", 0, 1, 1, 1, 1, 1, 1, 114, 111, 63); - getOrAddWood("PurpleHeartWood", 0, 1, 1, 1, 1, 1, 1, 55, 25, 49); - */ - + * //OTHERS. playing around with, mainly forestry getOrAddWood("PineWood", 0, 1, + * 1, 1, 1, 1, 1, 189, 147, 63); getOrAddWood("CherryWood", 0, 1, 1, 1, 1, 1, 1, + * 162, 116, 47); getOrAddWood("PapayaWood", 0, 1, 1, 1, 1, 1, 1, 214, 194, 91); + * getOrAddWood("CitrusWood", 0, 1, 1, 1, 1, 1, 1, 142, 153, 27); + * getOrAddWood("PoplarWood", 0, 1, 1, 1, 1, 1, 1, 198, 198, 107); + * getOrAddWood("MapleWood", 0, 1, 1, 1, 1, 1, 1, 158, 99, 39); + * getOrAddWood("MahoeWood", 0, 1, 1, 1, 1, 1, 1, 111, 138, 158); + * getOrAddWood("GreenheartWood", 0, 1, 1, 1, 1, 1, 1, 65, 103, 77); + * getOrAddWood("PalmWood", 0, 1, 1, 1, 1, 1, 1, 195, 114, 56); + * getOrAddWood("LimeWood", 0, 1, 1, 1, 1, 1, 1, 190, 147, 96); + * getOrAddWood("BalsaWood", 0, 1, 1, 1, 1, 1, 1, 159, 152, 143); + * getOrAddWood("WalnutWood", 0, 1, 1, 1, 1, 1, 1, 85, 69, 55); + * getOrAddWood("KapokWood", 0, 1, 1, 1, 1, 1, 1, 99, 95, 45); + * getOrAddWood("ChestnutWood", 0, 1, 1, 1, 1, 1, 1, 156, 147, 74); + * getOrAddWood("BaobabWood", 0, 1, 1, 1, 1, 1, 1, 116, 126, 84); + * getOrAddWood("LarchWood", 0, 1, 1, 1, 1, 1, 1, 200, 143, 122); + * getOrAddWood("WillowWood", 0, 1, 1, 1, 1, 1, 1, 149, 152, 74); + * getOrAddWood("TeakWood", 0, 1, 1, 1, 1, 1, 1, 111, 107, 91); + * getOrAddWood("SequoiaWood", 0, 1, 1, 1, 1, 1, 1, 123, 81, 75); + * getOrAddWood("MahoganyWood", 0, 1, 1, 1, 1, 1, 1, 95, 56, 49); + * getOrAddWood("WengeWood", 0, 1, 1, 1, 1, 1, 1, 76, 72, 62); + * getOrAddWood("RedwoodWood", 0, 1, 1, 1, 1, 1, 1, 148, 104, 55); + * getOrAddWood("FirWood", 0, 1, 1, 1, 1, 1, 1, 114, 111, 63); + * getOrAddWood("PurpleHeartWood", 0, 1, 1, 1, 1, 1, 1, 55, 25, 49); + */ + } + @Override - public ItemStack getItem() - { - ArrayList list = OreDictionary.getOres("planks"+name); - if(list != null && !list.isEmpty()) - { + public ItemStack getItem() { + ArrayList list = OreDictionary.getOres("planks" + name); + if (list != null && !list.isEmpty()) { return list.get(0); } return null; } - + } diff --git a/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java b/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java index d4ba400d..7a292fcc 100644 --- a/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java @@ -1,8 +1,8 @@ package minefantasy.mf2.mechanics; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import minefantasy.mf2.api.archery.AmmoMechanicsMF; -import minefantasy.mf2.api.rpg.RPGElements; -import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.config.ConfigStamina; import net.minecraft.enchantment.Enchantment; @@ -14,158 +14,126 @@ import net.minecraft.world.World; import net.minecraftforge.event.entity.player.ArrowLooseEvent; import net.minecraftforge.event.entity.player.ArrowNockEvent; -import cpw.mods.fml.common.eventhandler.Event.Result; -import cpw.mods.fml.common.eventhandler.EventPriority; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.PlayerEvent.ItemPickupEvent; -public class ArrowHandlerMF -{ +public class ArrowHandlerMF { /** * When the arrow is pulled back it initiates */ @SubscribeEvent - public void readyBow(ArrowNockEvent event) - { + public void readyBow(ArrowNockEvent event) { EntityPlayer user = event.entityPlayer; ItemStack bow = event.result; - - if(AmmoMechanicsMF.arrows == null || AmmoMechanicsMF.arrows.size() <= 0) - { - if(getIsInfinite(event.entityPlayer, event.result)) - { - user.setItemInUse(bow, bow.getMaxItemUseDuration());//Starts pullback + + if (AmmoMechanicsMF.arrows == null || AmmoMechanicsMF.arrows.size() <= 0) { + if (getIsInfinite(event.entityPlayer, event.result)) { + user.setItemInUse(bow, bow.getMaxItemUseDuration());// Starts pullback event.setCanceled(true); } return; } - - /*Checks over registered arrows and finds one to load - * The Quiver can be used to determine this - */ + + /* + * Checks over registered arrows and finds one to load The Quiver can be used to + * determine this + */ ItemStack arrowToFire = AmmoMechanicsMF.reloadBow(bow); - if(arrowToFire != null) - { - user.setItemInUse(bow, bow.getMaxItemUseDuration());//Starts pullback - loadArrow(user, bow, arrowToFire);//adds the arrow to NBT for rendering and later use + if (arrowToFire != null) { + user.setItemInUse(bow, bow.getMaxItemUseDuration());// Starts pullback + loadArrow(user, bow, arrowToFire);// adds the arrow to NBT for rendering and later use event.setCanceled(true); return; - } - else - { - if(getIsInfinite(event.entityPlayer, event.result)) - { - user.setItemInUse(bow, bow.getMaxItemUseDuration());//Starts pullback + } else { + if (getIsInfinite(event.entityPlayer, event.result)) { + user.setItemInUse(bow, bow.getMaxItemUseDuration());// Starts pullback event.setCanceled(true); return; } } /* - for(int a = 0; a < AmmoMechanicsMF.arrows.size(); a ++) - { - ItemStack arrow = AmmoMechanicsMF.arrows.get(a); - if(user.inventory.hasItemStack(arrow)) - { - user.setItemInUse(bow, bow.getMaxItemUseDuration());//Starts pullback - loadArrow(user, bow, arrow);//adds the arrow to NBT for rendering and later use - event.setCanceled(true); - return; - } - } - */ + * for(int a = 0; a < AmmoMechanicsMF.arrows.size(); a ++) { ItemStack arrow = + * AmmoMechanicsMF.arrows.get(a); if(user.inventory.hasItemStack(arrow)) { + * user.setItemInUse(bow, bow.getMaxItemUseDuration());//Starts pullback + * loadArrow(user, bow, arrow);//adds the arrow to NBT for rendering and later + * use event.setCanceled(true); return; } } + */ } /** * This method adds arrows to the bow */ - public static void loadArrow(EntityPlayer player, ItemStack bow, ItemStack arrow) - { - if(player.worldObj.isRemote) - { + public static void loadArrow(EntityPlayer player, ItemStack bow, ItemStack arrow) { + if (player.worldObj.isRemote) { return; } NBTTagCompound nbt = getOrApplyNBT(bow); - - if(arrow == null) - { + + if (arrow == null) { nbt.removeTag("loadedArrow"); - } - else - { + } else { NBTTagCompound loaded = new NBTTagCompound(); arrow.writeToNBT(loaded); nbt.setTag("loadedArrow", loaded); } } - + /** * Gets the NBT, if there is none, it creates it */ - private static NBTTagCompound getOrApplyNBT(ItemStack bow) - { - if(!bow.hasTagCompound()) - { + private static NBTTagCompound getOrApplyNBT(ItemStack bow) { + if (!bow.hasTagCompound()) { bow.setTagCompound(new NBTTagCompound()); } return bow.getTagCompound(); } - - @SubscribeEvent (priority=EventPriority.HIGHEST) - public void applyExhaustArrow(ArrowLooseEvent event) - { - if(StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(event.entityPlayer, false)) - { - if(ConfigStamina.weaponDrain < 1.0F) - event.charge *= ConfigStamina.weaponDrain; + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void applyExhaustArrow(ArrowLooseEvent event) { + if (StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(event.entityPlayer, false)) { + if (ConfigStamina.weaponDrain < 1.0F) + event.charge *= ConfigStamina.weaponDrain; } } + /** * This initates when firing a bow + * * @param event */ @SubscribeEvent - public void fireArrow(ArrowLooseEvent event) - { + public void fireArrow(ArrowLooseEvent event) { float power = event.charge; EntityPlayer user = event.entityPlayer; - + ItemStack bow = event.bow; World world = event.entity.worldObj; boolean creative = user.capabilities.isCreativeMode; - + float charge = power / 20.0F; - charge = (charge * charge + charge * 2.0F) / 3.0F; - - if (charge < 0.1D) - { - return; - } - - if (charge > 1.0F) - { - charge = 1.0F; - } - - - //Default is flint arrow + charge = (charge * charge + charge * 2.0F) / 3.0F; + + if (charge < 0.1D) { + return; + } + + if (charge > 1.0F) { + charge = 1.0F; + } + + // Default is flint arrow ItemStack arrow = new ItemStack(Items.arrow); - if(AmmoMechanicsMF.getArrowOnBow(bow) != null) - { - //if an arrow is on the bow, it uses that + if (AmmoMechanicsMF.getArrowOnBow(bow) != null) { + // if an arrow is on the bow, it uses that arrow = AmmoMechanicsMF.getArrowOnBow(bow); } - if(AmmoMechanicsMF.handlers != null && AmmoMechanicsMF.handlers.size() > 0) - { - for(int a = 0; a < AmmoMechanicsMF.handlers.size(); a ++) - { - //If the Arrow handler succeeds at firing an arrow - if(AmmoMechanicsMF.handlers.get(a).onFireArrow(world, arrow, bow, user, charge, creative)) - { - if(!user.capabilities.isCreativeMode) - { - bow.damageItem(1, user); - } - world.playSoundAtEntity(user, "minefantasy2:weapon.bowFire", 0.5F, 1.0F / (world.rand.nextFloat() * 0.4F + 1.2F) + charge * 0.5F); + if (AmmoMechanicsMF.handlers != null && AmmoMechanicsMF.handlers.size() > 0) { + for (int a = 0; a < AmmoMechanicsMF.handlers.size(); a++) { + // If the Arrow handler succeeds at firing an arrow + if (AmmoMechanicsMF.handlers.get(a).onFireArrow(world, arrow, bow, user, charge, creative)) { + if (!user.capabilities.isCreativeMode) { + bow.damageItem(1, user); + } + world.playSoundAtEntity(user, "minefantasy2:weapon.bowFire", 0.5F, + 1.0F / (world.rand.nextFloat() * 0.4F + 1.2F) + charge * 0.5F); loadArrow(user, bow, null); event.setCanceled(true); AmmoMechanicsMF.consumeAmmo(user, bow); @@ -174,24 +142,22 @@ public void fireArrow(ArrowLooseEvent event) } } } - private boolean getIsInfinite(EntityPlayer user, ItemStack bow) - { - return user.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, bow) > 0; + + private boolean getIsInfinite(EntityPlayer user, ItemStack bow) { + return user.capabilities.isCreativeMode + || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, bow) > 0; } - //Used to take an item/subId from the inventory - private boolean consumePlayerItem(EntityPlayer player, ItemStack item) - { - for(int a = 0; a < player.inventory.getSizeInventory(); a ++) - { - ItemStack i = player.inventory.getStackInSlot(a); - if(i != null && i.isItemEqual(item)) - { - player.inventory.decrStackSize(a, 1); - return true; - } - } - return false; + // Used to take an item/subId from the inventory + private boolean consumePlayerItem(EntityPlayer player, ItemStack item) { + for (int a = 0; a < player.inventory.getSizeInventory(); a++) { + ItemStack i = player.inventory.getStackInSlot(a); + if (i != null && i.isItemEqual(item)) { + player.inventory.decrStackSize(a, 1); + return true; + } + } + return false; } - + } diff --git a/src/main/java/minefantasy/mf2/mechanics/ArrowListMF.java b/src/main/java/minefantasy/mf2/mechanics/ArrowListMF.java index 01dc5bc3..51afa5b3 100644 --- a/src/main/java/minefantasy/mf2/mechanics/ArrowListMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/ArrowListMF.java @@ -6,18 +6,16 @@ import net.minecraft.item.ItemStack; @Deprecated -public class ArrowListMF -{ +public class ArrowListMF { public static List useableArrows = new ArrayList(); - private static void addArrow(ItemStack arrow) - { + + private static void addArrow(ItemStack arrow) { useableArrows.add(arrow); } - private static boolean canShootArrow(ItemStack arrow) - { - for(ItemStack Comparearrow: useableArrows) - { - if(Comparearrow.isItemEqual(arrow)) + + private static boolean canShootArrow(ItemStack arrow) { + for (ItemStack Comparearrow : useableArrows) { + if (Comparearrow.isItemEqual(arrow)) return true; } return false; diff --git a/src/main/java/minefantasy/mf2/mechanics/BombDispenser.java b/src/main/java/minefantasy/mf2/mechanics/BombDispenser.java index 7d9380e9..067800be 100644 --- a/src/main/java/minefantasy/mf2/mechanics/BombDispenser.java +++ b/src/main/java/minefantasy/mf2/mechanics/BombDispenser.java @@ -11,72 +11,67 @@ import net.minecraft.util.EnumFacing; import net.minecraft.world.World; -public class BombDispenser implements IBehaviorDispenseItem -{ +public class BombDispenser implements IBehaviorDispenseItem { @Override - public ItemStack dispense(IBlockSource dispenser, ItemStack item) - { + public ItemStack dispense(IBlockSource dispenser, ItemStack item) { EnumFacing direction = BlockDispenser.func_149937_b(dispenser.getBlockMetadata()); - //BlockDispenser - if(item == null)return null; - - if(item.getItem() instanceof ItemBomb) - { - ItemBomb itembomb = (ItemBomb)item.getItem(); + // BlockDispenser + if (item == null) + return null; + + if (item.getItem() instanceof ItemBomb) { + ItemBomb itembomb = (ItemBomb) item.getItem(); World world = dispenser.getWorld(); - - double posX = dispenser.getX() + ((float)direction.getFrontOffsetX()/2F); - double posY = dispenser.getY() + ((float)direction.getFrontOffsetY()/2F); - double posZ = dispenser.getZ() + ((float)direction.getFrontOffsetZ()/2F); - - double xVelocity = + direction.getFrontOffsetX(); - double yVelocity = + direction.getFrontOffsetY(); - double zVelocity = + direction.getFrontOffsetZ(); + + double posX = dispenser.getX() + (direction.getFrontOffsetX() / 2F); + double posY = dispenser.getY() + (direction.getFrontOffsetY() / 2F); + double posZ = dispenser.getZ() + (direction.getFrontOffsetZ() / 2F); + + double xVelocity = +direction.getFrontOffsetX(); + double yVelocity = +direction.getFrontOffsetY(); + double zVelocity = +direction.getFrontOffsetZ(); float velocityModifier = 1.5F; - - if (!world.isRemote) - { - EntityBomb bomb = new EntityBomb(world).setType(ItemBomb.getFilling(item), ItemBomb.getCasing(item), ItemBomb.getFuse(item), ItemBomb.getPowder(item)); - bomb.setPosition(posX, posY, posZ); - bomb.setThrowableHeading(xVelocity, yVelocity, zVelocity, 1.0F, velocityModifier); - world.spawnEntityInWorld(bomb); - if(item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) - { - bomb.getEntityData().setBoolean("stickyBomb", true); - } - } + + if (!world.isRemote) { + EntityBomb bomb = new EntityBomb(world).setType(ItemBomb.getFilling(item), ItemBomb.getCasing(item), + ItemBomb.getFuse(item), ItemBomb.getPowder(item)); + bomb.setPosition(posX, posY, posZ); + bomb.setThrowableHeading(xVelocity, yVelocity, zVelocity, 1.0F, velocityModifier); + world.spawnEntityInWorld(bomb); + if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { + bomb.getEntityData().setBoolean("stickyBomb", true); + } + } item.splitStack(1); } - - if(item.getItem() instanceof ItemMine) - { - ItemMine itembomb = (ItemMine)item.getItem(); + + if (item.getItem() instanceof ItemMine) { + ItemMine itembomb = (ItemMine) item.getItem(); World world = dispenser.getWorld(); - - double posX = dispenser.getX() + ((float)direction.getFrontOffsetX()/2F); - double posY = dispenser.getY() + ((float)direction.getFrontOffsetY()/2F); - double posZ = dispenser.getZ() + ((float)direction.getFrontOffsetZ()/2F); - - double xVelocity = + direction.getFrontOffsetX(); - double yVelocity = + direction.getFrontOffsetY(); - double zVelocity = + direction.getFrontOffsetZ(); + + double posX = dispenser.getX() + (direction.getFrontOffsetX() / 2F); + double posY = dispenser.getY() + (direction.getFrontOffsetY() / 2F); + double posZ = dispenser.getZ() + (direction.getFrontOffsetZ() / 2F); + + double xVelocity = +direction.getFrontOffsetX(); + double yVelocity = +direction.getFrontOffsetY(); + double zVelocity = +direction.getFrontOffsetZ(); float velocityModifier = 0.5F; - - if (!world.isRemote) - { - EntityMine bomb = new EntityMine(world).setType(ItemBomb.getFilling(item), ItemBomb.getCasing(item), ItemBomb.getFuse(item), ItemBomb.getPowder(item)); - bomb.setPosition(posX, posY, posZ); - bomb.setThrowableHeading(xVelocity, yVelocity, zVelocity, 1.0F, velocityModifier); - world.spawnEntityInWorld(bomb); - if(item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) - { - bomb.getEntityData().setBoolean("stickyBomb", true); - } - } + + if (!world.isRemote) { + EntityMine bomb = new EntityMine(world).setType(ItemBomb.getFilling(item), ItemBomb.getCasing(item), + ItemBomb.getFuse(item), ItemBomb.getPowder(item)); + bomb.setPosition(posX, posY, posZ); + bomb.setThrowableHeading(xVelocity, yVelocity, zVelocity, 1.0F, velocityModifier); + world.spawnEntityInWorld(bomb); + if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { + bomb.getEntityData().setBoolean("stickyBomb", true); + } + } item.splitStack(1); } - + return item; } diff --git a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java index eb7d0d7e..1e1905a0 100644 --- a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java +++ b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java @@ -63,33 +63,30 @@ import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; -public class CombatMechanics -{ +public class CombatMechanics { public static final String parryCooldownNBT = "MF_Parry_Cooldown"; public static final String posthitCooldownNBT = "MF_PostHit"; private static Random rand = new Random(); - /** Damage done by silver to undead/witches*/ - public static final float specialUnholyModifier = 2.0F; - /** Damage done by silver to werewolves*/ - public static final float specialWerewolfModifier = 8.0F; - /** Damage done with dragonforged design to dragons*/ - public static final float specialDragonModifier = 1.5F; - /** Damage done with ornate design to undead/witches*/ - public static final float specialOrnateModifier = 1.5F; - public static boolean swordSkeleton = true; - + /** Damage done by silver to undead/witches */ + public static final float specialUnholyModifier = 2.0F; + /** Damage done by silver to werewolves */ + public static final float specialWerewolfModifier = 8.0F; + /** Damage done with dragonforged design to dragons */ + public static final float specialDragonModifier = 1.5F; + /** Damage done with ornate design to undead/witches */ + public static final float specialOrnateModifier = 1.5F; + public static boolean swordSkeleton = true; + protected float jumpEvade_cost = 30; protected float evade_cost = 10; - + @SubscribeEvent - public void initAttack(LivingAttackEvent event) - { + public void initAttack(LivingAttackEvent event) { EntityLivingBase hitter = getHitter(event.source); int spd = EventManagerMF.getHitspeedTime(hitter); - if(hitter != null && !hitter.worldObj.isRemote) - { - if(spd > 0 && !(event.entityLiving instanceof EntityPlayer)) - { event.setCanceled(true); + if (hitter != null && !hitter.worldObj.isRemote) { + if (spd > 0 && !(event.entityLiving instanceof EntityPlayer)) { + event.setCanceled(true); return; } } @@ -98,593 +95,502 @@ public void initAttack(LivingAttackEvent event) World world = hit.worldObj; boolean powerArmour = PowerArmour.isFullyArmoured(hit); float damage = modifyDamage(src, world, hit, event.ammount, false); - - if(event.source.isProjectile() && !event.source.isFireDamage()) - { - if(powerArmour || (damage < event.ammount && hit.getTotalArmorValue() > 0))//only if dam has been reduced - { - if(ConfigArmour.resistArrow && !event.isCanceled() && (damage <= 0.5F))//TacticalManager.resistArrow(event.entityLiving, event.source, damage)) - { - if(event.source.getSourceOfDamage() != null && !event.source.getSourceOfDamage().getEntityData().hasKey("arrowDeflectMF") && !(event.source.getEntity() instanceof EntityEnderPearl)) - { - event.source.getSourceOfDamage().getEntityData().setBoolean("arrowDeflectMF", true); - event.entityLiving.worldObj.playSoundAtEntity(event.entityLiving, "random.break", 1.0F, 0.5F); - event.setCanceled(true); - } - } - } - } - - if(damage <= 0) - { + + if (event.source.isProjectile() && !event.source.isFireDamage()) { + if (powerArmour || (damage < event.ammount && hit.getTotalArmorValue() > 0))// only if dam has been reduced + { + if (ConfigArmour.resistArrow && !event.isCanceled() && (damage <= 0.5F))// TacticalManager.resistArrow(event.entityLiving, + // event.source, damage)) + { + if (event.source.getSourceOfDamage() != null + && !event.source.getSourceOfDamage().getEntityData().hasKey("arrowDeflectMF") + && !(event.source.getEntity() instanceof EntityEnderPearl)) { + event.source.getSourceOfDamage().getEntityData().setBoolean("arrowDeflectMF", true); + event.entityLiving.worldObj.playSoundAtEntity(event.entityLiving, "random.break", 1.0F, 0.5F); + event.setCanceled(true); + } + } + } + } + + if (damage <= 0) { event.setCanceled(true); } - if(hitter != null && hitter instanceof EntityLivingBase) - { + if (hitter != null && hitter instanceof EntityLivingBase) { int hitTime = 5; - if(hitter.getHeldItem() != null) - { + if (hitter.getHeldItem() != null) { ItemStack weapon = hitter.getHeldItem(); - if(weapon.getItem() instanceof IWeaponSpeed) - { - hitTime += ((IWeaponSpeed)weapon.getItem()).modifyHitTime(hitter, weapon); + if (weapon.getItem() instanceof IWeaponSpeed) { + hitTime += ((IWeaponSpeed) weapon.getItem()).modifyHitTime(hitter, weapon); } } - if(hitTime > 0) - EventManagerMF.setHitTime(hitter, hitTime); + if (hitTime > 0) + EventManagerMF.setHitTime(hitter, hitTime); } } /** * gets the melee hitter */ - private EntityLivingBase getHitter(DamageSource source) - { - if(source != null && source.getEntity() != null && source.getEntity() == source.getSourceOfDamage() && source.getEntity() instanceof EntityLivingBase) - { + private EntityLivingBase getHitter(DamageSource source) { + if (source != null && source.getEntity() != null && source.getEntity() == source.getSourceOfDamage() + && source.getEntity() instanceof EntityLivingBase) { return (EntityLivingBase) source.getEntity(); } return null; } @SubscribeEvent - public void onHit(LivingHurtEvent event) - { + public void onHit(LivingHurtEvent event) { DamageSource src = event.source; EntityLivingBase hit = event.entityLiving; - if(src != null && src == DamageSource.fall) - { + if (src != null && src == DamageSource.fall) { onFall(hit, event.ammount); } World world = hit.worldObj; float damage = modifyDamage(src, world, hit, event.ammount, true); - - if(damage > 0 && hit.isSprinting()) - { + + if (damage > 0 && hit.isSprinting()) { hit.setSprinting(false); } - //TODO: Zombie armour - if(event.entityLiving.getEntityData().hasKey(MonsterUpgrader.zombieArmourNBT) && event.entityLiving instanceof EntityZombie) - { - float percent = 1.0F; - ItemStack[] armours = new ItemStack[4]; - for(int a = 1; a < 5; a ++) - { - armours[a-1]=event.entityLiving.getEquipmentInSlot(a); - } - damage = ISpecialArmor.ArmorProperties.ApplyArmor(event.entityLiving, armours, event.source, damage); - } - //TODO: Stick arrows (EXPERIMENTAL) - if(ConfigExperiment.stickArrows && event.source.getSourceOfDamage() != null && event.source.getSourceOfDamage() instanceof EntityArrow) - { - if(!event.entity.worldObj.isRemote) - { - ArrowEffectsMF.stickArrowIn(event.entity, ArrowEffectsMF.getDroppedArrow(event.source.getSourceOfDamage()), event.source.getSourceOfDamage()); - } - } - if(damage > 0) - { - onOfficialHit(src, hit, damage); - - if (event.source instanceof EntityDamageSource && !(event.source instanceof EntityDamageSourceIndirect) && !event.source.damageType.equals("battlegearExtra")) - { + // TODO: Zombie armour + if (event.entityLiving.getEntityData().hasKey(MonsterUpgrader.zombieArmourNBT) + && event.entityLiving instanceof EntityZombie) { + float percent = 1.0F; + ItemStack[] armours = new ItemStack[4]; + for (int a = 1; a < 5; a++) { + armours[a - 1] = event.entityLiving.getEquipmentInSlot(a); + } + damage = ISpecialArmor.ArmorProperties.ApplyArmor(event.entityLiving, armours, event.source, damage); + } + // TODO: Stick arrows (EXPERIMENTAL) + if (ConfigExperiment.stickArrows && event.source.getSourceOfDamage() != null + && event.source.getSourceOfDamage() instanceof EntityArrow) { + if (!event.entity.worldObj.isRemote) { + ArrowEffectsMF.stickArrowIn(event.entity, + ArrowEffectsMF.getDroppedArrow(event.source.getSourceOfDamage()), + event.source.getSourceOfDamage()); + } + } + if (damage > 0) { + onOfficialHit(src, hit, damage); + + if (event.source instanceof EntityDamageSource && !(event.source instanceof EntityDamageSourceIndirect) + && !event.source.damageType.equals("battlegearExtra")) { Entity entityHitter = ((EntityDamageSource) event.source).getEntity(); - - if (entityHitter instanceof EntityLivingBase) - { + + if (entityHitter instanceof EntityLivingBase) { EntityLivingBase attacker = (EntityLivingBase) entityHitter; StaminaMechanics.onAttack(attacker, hit); ItemStack weapon = attacker.getHeldItem(); HitSoundGenerator.makeHitSound(weapon, event.entityLiving); } } - } + } event.ammount = damage; - } - - private void onFall(EntityLivingBase fallen, float height) - { + } + + private void onFall(EntityLivingBase fallen, float height) { float weight = ArmourCalculator.getTotalWeightOfWorn(fallen, false); - if(weight > 100) - { + if (weight > 100) { weight -= 100F; - float power = (height/4F) * (weight/100F); + float power = (height / 4F) * (weight / 100F); newShockwave(fallen, fallen.posX, fallen.posY, fallen.posZ, power, false, true); } } - public Shockwave newShockwave(Entity source, double x, double y, double z, float power, boolean fire, boolean smoke) - { - Shockwave explosion = new Shockwave("humanstomp", source.worldObj, source, x, y, z, power); - explosion.isFlaming = fire; - explosion.isSmoking = smoke; - explosion.initiate(); - explosion.decorateWave(true); - return explosion; - } - - private float modifyDamage(DamageSource src, World world, EntityLivingBase hit, float dam, boolean properHit) - { + + public Shockwave newShockwave(Entity source, double x, double y, double z, float power, boolean fire, + boolean smoke) { + Shockwave explosion = new Shockwave("humanstomp", source.worldObj, source, x, y, z, power); + explosion.isFlaming = fire; + explosion.isSmoking = smoke; + explosion.initiate(); + explosion.decorateWave(true); + return explosion; + } + + private float modifyDamage(DamageSource src, World world, EntityLivingBase hit, float dam, boolean properHit) { Entity source = src.getSourceOfDamage(); Entity hitter = src.getEntity(); - - if(PowerArmour.allowDamageToBlock(src)) - { + + if (PowerArmour.allowDamageToBlock(src)) { dam = PowerArmour.modifyDamage(hit, dam, src); } - - if(properHit && hit instanceof EntityPlayer) - { - dam = modifyPlayerDamage((EntityPlayer)hit, dam); + + if (properHit && hit instanceof EntityPlayer) { + dam = modifyPlayerDamage((EntityPlayer) hit, dam); } - - if(source != null && hitter != null && hitter instanceof EntityLivingBase) - { - dam = modifyUserHitDamage(dam, (EntityLivingBase)hitter, source, hitter == source, hit, properHit); + + if (source != null && hitter != null && hitter instanceof EntityLivingBase) { + dam = modifyUserHitDamage(dam, (EntityLivingBase) hitter, source, hitter == source, hit, properHit); } - if(src.isExplosion() && isSkeleton(hit)) - { + if (src.isExplosion() && isSkeleton(hit)) { dam *= 5F; } - - //TODO: Elemental resistance - dam *= TacticalManager.getResistance(hit, src); - if(src.isFireDamage()) - { - if(dam <= 0.0F) - { - hit.extinguish(); - } - } - dam = onUserHit(hit, hitter, src, dam, properHit); + + // TODO: Elemental resistance + dam *= TacticalManager.getResistance(hit, src); + if (src.isFireDamage()) { + if (dam <= 0.0F) { + hit.extinguish(); + } + } + dam = onUserHit(hit, hitter, src, dam, properHit); return dam; } - private boolean isSkeleton(Entity target) - { + private boolean isSkeleton(Entity target) { return target instanceof EntitySkeleton; } - //TODO: damage modifier - private float modifyUserHitDamage(float dam, EntityLivingBase user, Entity source, boolean melee, Entity target, boolean properHit) - { + // TODO: damage modifier + private float modifyUserHitDamage(float dam, EntityLivingBase user, Entity source, boolean melee, Entity target, + boolean properHit) { dam = modifyMobDamage(user, dam); String special = "standard"; - //Power Attack - if(melee) - { + // Power Attack + if (melee) { int powerAttack = initPowerAttack(user, target, properHit); - if(powerAttack == 1) - { - dam *= (2F/1.5F); + if (powerAttack == 1) { + dam *= (2F / 1.5F); onPowerAttack(dam, user, target, properHit); - - if(isSkeleton(target)) - { + + if (isSkeleton(target)) { dam *= 1.5F; - if(properHit) - { - if(rand.nextInt(2) == 0) - { + if (properHit) { + if (rand.nextInt(2) == 0) { target.entityDropItem(new ItemStack(Items.bone), 0.5F); } } } } - if(powerAttack == -1) - { + if (powerAttack == -1) { dam /= 2F; } - } - else - { + } else { String arrowDesign = source.getEntityData().getString("Design"); - if(arrowDesign != null && arrowDesign.length() > 0) - { + if (arrowDesign != null && arrowDesign.length() > 0) { special = arrowDesign; } } - if(user instanceof EntityLivingBase) - { + if (user instanceof EntityLivingBase) { EntityLivingBase player = user; - - //TODO: Stamina Traits - if(StaminaBar.isSystemActive) - { - if(StaminaBar.getStaminaValue(player) <= 0) - { + + // TODO: Stamina Traits + if (StaminaBar.isSystemActive) { + if (StaminaBar.getStaminaValue(player) <= 0) { dam *= ConfigStamina.weaponDrain; } } } - if(user.hurtResistantTime > 12) - { + if (user.hurtResistantTime > 12) { dam *= 0.5F; } - + ItemStack weapon = user.getHeldItem(); - if(weapon != null) - { - if(weapon.getItem() instanceof IDamageModifier) - { - //TODO: IDamageModifier, this mods the damage for weapons - dam = ((IDamageModifier)weapon.getItem()).modifyDamage(weapon, user, target, dam, properHit); - } - CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(weapon); - String weaponType = CustomToolHelper.getCustomStyle(weapon); - dam *= getSpecialModifier(material, weaponType, target, true); - } + if (weapon != null) { + if (weapon.getItem() instanceof IDamageModifier) { + // TODO: IDamageModifier, this mods the damage for weapons + dam = ((IDamageModifier) weapon.getItem()).modifyDamage(weapon, user, target, dam, properHit); + } + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(weapon); + String weaponType = CustomToolHelper.getCustomStyle(weapon); + dam *= getSpecialModifier(material, weaponType, target, true); + } return dam; } - - private void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit) - { + + private void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit) { ItemStack weapon = user.getHeldItem(); int ticks = 20; - if(weapon != null && weapon.getItem() instanceof IPowerAttack) - { - ((IPowerAttack)weapon.getItem()).onPowerAttack(dam, user, target, properHit); - ticks = ((IPowerAttack)weapon.getItem()).getParryModifier(weapon, user, target); - } - if(target instanceof EntityLivingBase) - { - if(ticks > getParryCooldown((EntityLivingBase)target)) - { - setParryCooldown((EntityLivingBase)target, ticks); - } - } - if(!user.worldObj.isRemote) - { - user.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 20, 5)); - user.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20, 10)); - } - if(user instanceof EntityPlayer) - { - TacticalManager.lungeEntity(user, target, 0.5F, 0F); - TacticalManager.throwPlayerOffBalance((EntityPlayer) user, 0.5F, true); - } - - target.worldObj.playSoundAtEntity(target, "minefantasy2:weapon.critical", 1.0F, 1.0F); + if (weapon != null && weapon.getItem() instanceof IPowerAttack) { + ((IPowerAttack) weapon.getItem()).onPowerAttack(dam, user, target, properHit); + ticks = ((IPowerAttack) weapon.getItem()).getParryModifier(weapon, user, target); + } + if (target instanceof EntityLivingBase) { + if (ticks > getParryCooldown((EntityLivingBase) target)) { + setParryCooldown((EntityLivingBase) target, ticks); + } + } + if (!user.worldObj.isRemote) { + user.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 20, 5)); + user.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20, 10)); + } + if (user instanceof EntityPlayer) { + TacticalManager.lungeEntity(user, target, 0.5F, 0F); + TacticalManager.throwPlayerOffBalance((EntityPlayer) user, 0.5F, true); + } + + target.worldObj.playSoundAtEntity(target, "minefantasy2:weapon.critical", 1.0F, 1.0F); } private static final float power_attack_base = 25F; + /** - * 0 = false - * 1 = true - * -1 = failure + * 0 = false 1 = true -1 = failure */ - private static int initPowerAttack(EntityLivingBase user, Entity target, boolean properHit) - { - if(!canExecutePower(user)) - { + private static int initPowerAttack(EntityLivingBase user, Entity target, boolean properHit) { + if (!canExecutePower(user)) { return 0; } - if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) - { - float points = power_attack_base * (StaminaBar.getBaseDecayModifier(user, true, true)*0.5F + 0.5F); - if(StaminaBar.isStaminaAvailable(user, points, properHit)) - { - if(properHit) - { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { + float points = power_attack_base * (StaminaBar.getBaseDecayModifier(user, true, true) * 0.5F + 0.5F); + if (StaminaBar.isStaminaAvailable(user, points, properHit)) { + if (properHit) { ItemWeaponMF.applyFatigue(user, points); } return getPostHitCooldown(user) > 0 ? -1 : 1; - } - else - { + } else { return 0; } } return 1; } - private static boolean canExecutePower(EntityLivingBase user) - { - if(user.isInWater()) - { + private static boolean canExecutePower(EntityLivingBase user) { + if (user.isInWater()) { return false; } - if(user instanceof EntityPlayer) - { - if(!isFightStance(user))return false; + if (user instanceof EntityPlayer) { + if (!isFightStance(user)) + return false; } return user.fallDistance > 0 && !user.isOnLadder(); } - private static boolean isFightStance(EntityLivingBase user) - { + private static boolean isFightStance(EntityLivingBase user) { return user.isSneaking(); } - private float modifyMobDamage(EntityLivingBase user, float dam) - { - if(user instanceof EntityZombie && user.isChild()) - { + private float modifyMobDamage(EntityLivingBase user, float dam) { + if (user instanceof EntityZombie && user.isChild()) { dam *= 0.65F; } return dam + getStrengthEnhancement(user); } - - public static void applyUndeadBane(EntityLivingBase living) - { + + public static void applyUndeadBane(EntityLivingBase living) { living.playSound("random.fizz", 0.5F, 0.5F); living.addPotionEffect(new PotionEffect(Potion.weakness.id, 1200, 2)); living.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 1200, 2)); - if(rand.nextInt(5) == 0) - { + if (rand.nextInt(5) == 0) { living.setFire(3); } } - private void onOfficialHit(DamageSource src, EntityLivingBase target, float damage) - { + private void onOfficialHit(DamageSource src, EntityLivingBase target, float damage) { Entity source = src.getSourceOfDamage(); Entity hitter = src.getEntity(); - - if(source != null && hitter != null && hitter instanceof EntityLivingBase) - { - if(source == hitter) - { - EntityLivingBase user = (EntityLivingBase)hitter; + + if (source != null && hitter != null && hitter instanceof EntityLivingBase) { + if (source == hitter) { + EntityLivingBase user = (EntityLivingBase) hitter; ItemStack weapon = user.getHeldItem(); - if(weapon != null) - { + if (weapon != null) { onWeaponHit(user, weapon, target, damage); } - if(RPGElements.isSystemActive && user instanceof EntityPlayer && !user.worldObj.isRemote) - { - SkillList.combat.addXP((EntityPlayer)user, (int)(damage/5F)); + if (RPGElements.isSystemActive && user instanceof EntityPlayer && !user.worldObj.isRemote) { + SkillList.combat.addXP((EntityPlayer) user, (int) (damage / 5F)); } - } - else - { - if(source instanceof EntityArrow && src.isProjectile()) - { + } else { + if (source instanceof EntityArrow && src.isProjectile()) { onArrowHit(source, target, hitter, damage); } } } CombatMechanics.setPostHitCooldown(target, 10); } - private void onWeaponHit(EntityLivingBase user, ItemStack weapon, Entity target, float dam) - { - if(target instanceof EntityLivingBase && weapon.getItem() instanceof ISpecialEffect) - { - ((ISpecialEffect)weapon.getItem()).onProperHit(user, weapon, target, dam); - } - - if(weapon.getItem() instanceof IWeaponSpeed) - { - target.hurtResistantTime += ((IWeaponSpeed)weapon.getItem()).modifyHitTime(user, weapon); - } - if(weapon.getItem() instanceof IKnockbackWeapon) - { - float kb = ((IKnockbackWeapon)weapon.getItem()).getAddedKnockback(user, weapon); - - if(kb > 0) - { + + private void onWeaponHit(EntityLivingBase user, ItemStack weapon, Entity target, float dam) { + if (target instanceof EntityLivingBase && weapon.getItem() instanceof ISpecialEffect) { + ((ISpecialEffect) weapon.getItem()).onProperHit(user, weapon, target, dam); + } + + if (weapon.getItem() instanceof IWeaponSpeed) { + target.hurtResistantTime += ((IWeaponSpeed) weapon.getItem()).modifyHitTime(user, weapon); + } + if (weapon.getItem() instanceof IKnockbackWeapon) { + float kb = ((IKnockbackWeapon) weapon.getItem()).getAddedKnockback(user, weapon); + + if (kb > 0) { TacticalManager.knockbackEntity(target, user, kb, 0F); } } - if (ConfigWeapon.useBalance && user instanceof EntityPlayer) - { - applyBalance((EntityPlayer)user); - } + if (ConfigWeapon.useBalance && user instanceof EntityPlayer) { + applyBalance((EntityPlayer) user); + } } - private void onArrowHit(Entity arrow, Entity target, Entity shooter, float damage) - { + + private void onArrowHit(Entity arrow, Entity target, Entity shooter, float damage) { /* - if(RPGElements.isSystemActive && shooter instanceof EntityPlayer) - { - SkillList.archery.addXP((EntityPlayer) shooter, (int)damage); + * if(RPGElements.isSystemActive && shooter instanceof EntityPlayer) { + * SkillList.archery.addXP((EntityPlayer) shooter, (int)damage); } + */ + } + + protected static void performEffects(Map map, EntityLivingBase entityHit) { + double roll = Math.random(); + if (map == null || map.isEmpty()) { + return; + } + + for (PotionEffect effect : map.keySet()) { + // add effects if they aren't already applied, with corresponding chance factor + if (!entityHit.isPotionActive(effect.getPotionID()) && map.get(effect) > roll) { + entityHit.addPotionEffect(new PotionEffect(effect)); + } } - */ } - protected static void performEffects(Map map, EntityLivingBase entityHit) - { - double roll = Math.random(); - if(map == null || map.isEmpty()) - { - return; - } - - for(PotionEffect effect:map.keySet()) - { - //add effects if they aren't already applied, with corresponding chance factor - if(!entityHit.isPotionActive(effect.getPotionID()) && map.get(effect) > roll) - { - entityHit.addPotionEffect(new PotionEffect(effect)); - } - } - } - private static boolean debugParry = true; - private static final float parryFatigue = 5F; - private float onUserHit(EntityLivingBase user, Entity entityHitting, DamageSource source, float dam, boolean properHit) - { - ItemStack weapon = user.getHeldItem(); - if((properHit || source.isProjectile()) && weapon != null && !source.isUnblockable() &&!source.isExplosion()) - { - float threshold = 10;//DEFAULT PARRY THRESHOLD - float weaponFatigue = 2.0F;//DEFAULT FATIGUE - int ticks = 18;//DEFAULT TICKS - IParryable parry = null; - - if(weapon.getItem() instanceof IParryable) - { - parry = (IParryable)weapon.getItem(); - - ticks = parry.getParryCooldown(source, dam, weapon); - threshold = parry.getMaxDamageParry(user, weapon); - weaponFatigue = parry.getParryStaminaDecay(source, weapon); - } - if(StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(user, false)) - { - threshold /= 2; - } - threshold *= TacticalManager.getHighgroundModifier(user, entityHitting, 1.15F); - - if(ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) - { - threshold = ArmourCalculator.adjustACForDamage(source, threshold, 1.0F, 0.75F, 0.5F); - } - - if(debugParry && !user.worldObj.isRemote){MFLogUtil.logDebug("Init Parry: Damage = " + dam + " Threshold = " + threshold);} - - //USED FOR PARRYING its harder to block arrows - if(TacticalManager.canParry(source, user, entityHitting, weapon)) - { - float previousDam = dam; - dam = Math.max(0F, dam - threshold); - - if(properHit || dam <= 0) - { - user.hurtResistantTime = user.maxHurtResistantTime; - user.hurtTime = 0; - - int result = onParry(source, user, entityHitting, dam, previousDam, parry); - - if(result == 1) - { - dam = 0; - } - ticks = ArmourCalculator.modifyParryCooldown(user, ticks); - - if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) && !StaminaBar.isAnyStamina(user, false)) - { - ticks *= 3; - } - if(ticks > getParryCooldown(user)) - { - setParryCooldown(user, ticks); - } - - ItemWeaponMF.applyFatigue(user, TacticalManager.getHighgroundModifier(user, entityHitting, 2.0F)*(dam+1F)*parryFatigue*weaponFatigue); - if(parry == null) - { - user.worldObj.playSoundAtEntity(user, getDefaultParrySound(weapon), 1.0F, 1.25F + (rand.nextFloat()*0.5F)); - } - else if(!parry.playCustomParrySound(user, entityHitting, weapon)) - { - user.worldObj.playSoundAtEntity(user, "mob.zombie.metal", 1.0F, 1.25F + (rand.nextFloat()*0.5F)); - } - if(user instanceof EntityPlayer) - { - ((EntityPlayer)user).stopUsingItem(); - ItemWeaponMF.setParry(weapon, 20); - } - - if(entityHitting != null && entityHitting instanceof EntityLivingBase) - { - EntityLivingBase hitter = (EntityLivingBase)entityHitting; - int hitTime = 5; - if(hitter.getHeldItem() != null) - { - ItemStack attackingWep = hitter.getHeldItem(); - if(attackingWep.getItem() instanceof IWeaponSpeed) - { - hitTime += ((IWeaponSpeed)attackingWep.getItem()).modifyHitTime(hitter, weapon); - } - } - if(hitTime > 0) - { - MFLogUtil.logDebug("Recoil hitter: " + hitter.getCommandSenderName() + " for " + hitTime*3 + " ticks."); - EventManagerMF.setHitTime(hitter, hitTime * 3); - } - } - } - } - } - if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) && !StaminaBar.isAnyStamina(user, false)) - { - dam *= Math.max(1.0F, ConfigStamina.exhaustDamage); - } - - //Fire dura degrade - if(properHit && source.isFireDamage() && dam > 0) - { - for(int a = 0; a < 4; a++) - { - ItemStack armour = user.getEquipmentInSlot(a+1); - if(armour != null) - { - int dura = (int)(dam)+1; - if(!user.worldObj.isRemote && !isArmourFireImmune(armour, source)) - { + private static final float parryFatigue = 5F; + + private float onUserHit(EntityLivingBase user, Entity entityHitting, DamageSource source, float dam, + boolean properHit) { + ItemStack weapon = user.getHeldItem(); + if ((properHit || source.isProjectile()) && weapon != null && !source.isUnblockable() + && !source.isExplosion()) { + float threshold = 10;// DEFAULT PARRY THRESHOLD + float weaponFatigue = 2.0F;// DEFAULT FATIGUE + int ticks = 18;// DEFAULT TICKS + IParryable parry = null; + + if (weapon.getItem() instanceof IParryable) { + parry = (IParryable) weapon.getItem(); + + ticks = parry.getParryCooldown(source, dam, weapon); + threshold = parry.getMaxDamageParry(user, weapon); + weaponFatigue = parry.getParryStaminaDecay(source, weapon); + } + if (StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(user, false)) { + threshold /= 2; + } + threshold *= TacticalManager.getHighgroundModifier(user, entityHitting, 1.15F); + + if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { + threshold = ArmourCalculator.adjustACForDamage(source, threshold, 1.0F, 0.75F, 0.5F); + } + + if (debugParry && !user.worldObj.isRemote) { + MFLogUtil.logDebug("Init Parry: Damage = " + dam + " Threshold = " + threshold); + } + + // USED FOR PARRYING its harder to block arrows + if (TacticalManager.canParry(source, user, entityHitting, weapon)) { + float previousDam = dam; + dam = Math.max(0F, dam - threshold); + + if (properHit || dam <= 0) { + user.hurtResistantTime = user.maxHurtResistantTime; + user.hurtTime = 0; + + int result = onParry(source, user, entityHitting, dam, previousDam, parry); + + if (result == 1) { + dam = 0; + } + ticks = ArmourCalculator.modifyParryCooldown(user, ticks); + + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) + && !StaminaBar.isAnyStamina(user, false)) { + ticks *= 3; + } + if (ticks > getParryCooldown(user)) { + setParryCooldown(user, ticks); + } + + ItemWeaponMF.applyFatigue(user, TacticalManager.getHighgroundModifier(user, entityHitting, 2.0F) + * (dam + 1F) * parryFatigue * weaponFatigue); + if (parry == null) { + user.worldObj.playSoundAtEntity(user, getDefaultParrySound(weapon), 1.0F, + 1.25F + (rand.nextFloat() * 0.5F)); + } else if (!parry.playCustomParrySound(user, entityHitting, weapon)) { + user.worldObj.playSoundAtEntity(user, "mob.zombie.metal", 1.0F, + 1.25F + (rand.nextFloat() * 0.5F)); + } + if (user instanceof EntityPlayer) { + ((EntityPlayer) user).stopUsingItem(); + ItemWeaponMF.setParry(weapon, 20); + } + + if (entityHitting != null && entityHitting instanceof EntityLivingBase) { + EntityLivingBase hitter = (EntityLivingBase) entityHitting; + int hitTime = 5; + if (hitter.getHeldItem() != null) { + ItemStack attackingWep = hitter.getHeldItem(); + if (attackingWep.getItem() instanceof IWeaponSpeed) { + hitTime += ((IWeaponSpeed) attackingWep.getItem()).modifyHitTime(hitter, weapon); + } + } + if (hitTime > 0) { + MFLogUtil.logDebug("Recoil hitter: " + hitter.getCommandSenderName() + " for " + hitTime * 3 + + " ticks."); + EventManagerMF.setHitTime(hitter, hitTime * 3); + } + } + } + } + } + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) && !StaminaBar.isAnyStamina(user, false)) { + dam *= Math.max(1.0F, ConfigStamina.exhaustDamage); + } + + // Fire dura degrade + if (properHit && source.isFireDamage() && dam > 0) { + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null) { + int dura = (int) (dam) + 1; + if (!user.worldObj.isRemote && !isArmourFireImmune(armour, source)) { MFLogUtil.logDebug("Armour Flame Damage: " + dura); - if(armour.getItemDamage() + dura < armour.getMaxDamage()) - { + if (armour.getItemDamage() + dura < armour.getMaxDamage()) { armour.damageItem(dura, user); - } - else - { + } else { armour.setItemDamage(armour.getMaxDamage()); } } - if(armour.getItemDamage() >= armour.getMaxDamage()) - { - user.setCurrentItemOrArmor(a+1, null); - user.worldObj.playSoundEffect(user.posX, user.posY+user.getEyeHeight() - (0.4F*a), user.posZ, "random.break", 1.0F, 1.0F); + if (armour.getItemDamage() >= armour.getMaxDamage()) { + user.setCurrentItemOrArmor(a + 1, null); + user.worldObj.playSoundEffect(user.posX, user.posY + user.getEyeHeight() - (0.4F * a), + user.posZ, "random.break", 1.0F, 1.0F); } } } - } - - if(dam > 0 && user instanceof EntityPlayer || (entityHitting != null && entityHitting instanceof EntityPlayer)) - { - if(!user.worldObj.isRemote) - { - String type = "Mixed"; - float[] f = ArmourCalculator.getRatioForSource(source); - if(f == null) - { - type = "Basic"; - } - else - { - if(f[0] > f[1] && f[0] > f[2])type = "Cutting"; - if(f[2] > f[1] && f[2] > f[0])type = "Piercing"; - if(f[1] > f[0] && f[1] > f[2])type = "Blunt"; - } - - MFLogUtil.logDebug(dam + "x "+ type +" Damage inflicted to: " + user.getCommandSenderName() + " (" + user.getEntityId() + ")"); - } - } + } + + if (dam > 0 && user instanceof EntityPlayer + || (entityHitting != null && entityHitting instanceof EntityPlayer)) { + if (!user.worldObj.isRemote) { + String type = "Mixed"; + float[] f = ArmourCalculator.getRatioForSource(source); + if (f == null) { + type = "Basic"; + } else { + if (f[0] > f[1] && f[0] > f[2]) + type = "Cutting"; + if (f[2] > f[1] && f[2] > f[0]) + type = "Piercing"; + if (f[1] > f[0] && f[1] > f[2]) + type = "Blunt"; + } + + MFLogUtil.logDebug(dam + "x " + type + " Damage inflicted to: " + user.getCommandSenderName() + " (" + + user.getEntityId() + ")"); + } + } return dam; } - private boolean isArmourFireImmune(ItemStack armour, DamageSource src) - { - if(armour != null && armour.getItem() instanceof IElementalResistance) - { - return ((IElementalResistance)armour.getItem()).getFireResistance(armour, src) >= 100F; + + private boolean isArmourFireImmune(ItemStack armour, DamageSource src) { + if (armour != null && armour.getItem() instanceof IElementalResistance) { + return ((IElementalResistance) armour.getItem()).getFireResistance(armour, src) >= 100F; } return false; } - private String getDefaultParrySound(ItemStack weapon) - { - if(weapon.getUnlocalizedName().contains("wood") || weapon.getUnlocalizedName().contains("Wood") || weapon.getUnlocalizedName().contains("stone") || weapon.getUnlocalizedName().contains("Stone")) - { + private String getDefaultParrySound(ItemStack weapon) { + if (weapon.getUnlocalizedName().contains("wood") || weapon.getUnlocalizedName().contains("Wood") + || weapon.getUnlocalizedName().contains("stone") || weapon.getUnlocalizedName().contains("Stone")) { return "minefantasy2:weapon.wood_parry"; } return "mob.zombie.metal"; @@ -693,37 +599,30 @@ private String getDefaultParrySound(ItemStack weapon) /** * @return 0 for normal parry and 1 for evade */ - private int onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam, float prevDam, IParryable parry) - { + private int onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam, float prevDam, + IParryable parry) { /* - if(RPGElements.isSystemActive && user instanceof EntityPlayer) - { - SkillList.block.addXP((EntityPlayer)user, 10 + (int)prevDam*2); - } - */ - if(RPGElements.isSystemActive && user instanceof EntityPlayer ) - { - SkillList.combat.addXP((EntityPlayer)user, (int)(prevDam/3F)); + * if(RPGElements.isSystemActive && user instanceof EntityPlayer) { + * SkillList.block.addXP((EntityPlayer)user, 10 + (int)prevDam*2); } + */ + if (RPGElements.isSystemActive && user instanceof EntityPlayer) { + SkillList.combat.addXP((EntityPlayer) user, (int) (prevDam / 3F)); } - if(parry != null) - { + if (parry != null) { parry.onParry(source, user, attacker, dam); } - if(user instanceof ISpecialCombatMob) - { - ((ISpecialCombatMob)user).onParry(source, attacker, dam); + if (user instanceof ISpecialCombatMob) { + ((ISpecialCombatMob) user).onParry(source, attacker, dam); } - + boolean groundBlock = user.onGround; ItemStack weapon = user.getHeldItem(); - - //Redirect - if(!user.worldObj.isRemote && !TacticalManager.isRanged(source)) - { - if(canEvade(user)) - { + + // Redirect + if (!user.worldObj.isRemote && !TacticalManager.isRanged(source)) { + if (canEvade(user)) { float powerMod = attacker.isSprinting() ? 4.0F : 2.5F; - + attacker.setSprinting(false); TacticalManager.lungeEntity(attacker, user, powerMod, 0.0F); TacticalManager.lungeEntity(user, attacker, 3F, 0.0F); @@ -732,370 +631,318 @@ private int onParry(DamageSource source, EntityLivingBase user, Entity attacker, } return 0; } - + /** * Determines if an evade can be made (jump or normal) */ - private boolean canEvade(EntityLivingBase user) - { + private boolean canEvade(EntityLivingBase user) { float stamModifier = 1.0F; - if(user instanceof EntityPlayer) - { - if(!ResearchLogic.hasInfoUnlocked((EntityPlayer)user, "parrypro")) - { + if (user instanceof EntityPlayer) { + if (!ResearchLogic.hasInfoUnlocked((EntityPlayer) user, "parrypro")) { return false; } - if(!isFightStance(user)) - { + if (!isFightStance(user)) { return false; } - } - else - { - if(rand.nextInt(10) != 0)//Mobs can evade + } else { + if (rand.nextInt(10) != 0)// Mobs can evade { return false; } } - - if(!user.onGround && !tryJumpEvade(user, stamModifier)) - { + + if (!user.onGround && !tryJumpEvade(user, stamModifier)) { return false; } return tryGroundEvade(user, stamModifier); } + /** - * If the player can slip past enemies - * Should be any armour but heavy + * If the player can slip past enemies Should be any armour but heavy */ - private boolean tryGroundEvade(EntityLivingBase user, float cost) - { - return ItemWeaponMF.tryPerformAbility(user, evade_cost*cost, true, false); + private boolean tryGroundEvade(EntityLivingBase user, float cost) { + return ItemWeaponMF.tryPerformAbility(user, evade_cost * cost, true, false); } /** - * If the player can jump over enemies in evading - * Only ment for unarmoured/Lightarmour + * If the player can jump over enemies in evading Only ment for + * unarmoured/Lightarmour */ - private boolean tryJumpEvade(EntityLivingBase user, float cost) - { - return ItemWeaponMF.tryPerformAbility(user, jumpEvade_cost*cost, true, false); + private boolean tryJumpEvade(EntityLivingBase user, float cost) { + return ItemWeaponMF.tryPerformAbility(user, jumpEvade_cost * cost, true, false); } @SubscribeEvent - public void updateLiving(LivingUpdateEvent event) - { + public void updateLiving(LivingUpdateEvent event) { EntityLivingBase living = event.entityLiving; - + tickParryCooldown(living); tickPostHitCooldown(living); - if(living instanceof EntityLiving) - { - EntityLiving mob = (EntityLiving)living; + if (living instanceof EntityLiving) { + EntityLiving mob = (EntityLiving) living; ItemStack held = mob.getHeldItem(); - + { EntityLivingBase tar = mob.getAttackTarget(); - - if(tar != null && tar instanceof EntityPlayer && ((EntityPlayer)tar).isBlocking()) - { + + if (tar != null && tar instanceof EntityPlayer && ((EntityPlayer) tar).isBlocking()) { double dist = mob.getDistanceSqToEntity(tar); - - if(tar instanceof EntityZombie && mob.onGround && mob.getRNG().nextInt(10) == 0 && dist > 1D && dist < 4D) - { + + if (tar instanceof EntityZombie && mob.onGround && mob.getRNG().nextInt(10) == 0 && dist > 1D + && dist < 4D) { mob.motionY = 0.5F; } } } - if(isAxe(held)) - { + if (isAxe(held)) { EntityLivingBase tar = mob.getAttackTarget(); - - if(tar != null) - { + + if (tar != null) { double dist = mob.getDistanceSqToEntity(tar); - - if(mob.onGround && mob.getRNG().nextInt(5) == 0 && dist > 1D && dist < 4.0D) - { + + if (mob.onGround && mob.getRNG().nextInt(5) == 0 && dist > 1D && dist < 4.0D) { mob.motionY = 0.5F; } } - if(mob.getRNG().nextInt(100) == 0 && !mob.isSprinting() && !mob.isChild()) - { + if (mob.getRNG().nextInt(100) == 0 && !mob.isSprinting() && !mob.isChild()) { mob.setSprinting(true); } } - if(isFastblade(held)) - { + if (isFastblade(held)) { EntityLivingBase tar = mob.getAttackTarget(); - - if(tar != null) - { + + if (tar != null) { double dist = mob.getDistanceSqToEntity(tar); - - if(mob.onGround && mob.getRNG().nextInt(20) == 0 && dist > 1D && dist < 4.0D) - { + + if (mob.onGround && mob.getRNG().nextInt(20) == 0 && dist > 1D && dist < 4.0D) { mob.motionY = 0.5F; } } - if(mob.getRNG().nextInt(20) == 0 && !mob.isSprinting() && !mob.isChild()) - { + if (mob.getRNG().nextInt(20) == 0 && !mob.isSprinting() && !mob.isChild()) { mob.setSprinting(true); } } - if(living.isBurning() && !living.isImmuneToFire()) - { + if (living.isBurning() && !living.isImmuneToFire()) { panic(living, 0.25F, 5); } } } - private boolean isAxe(ItemStack held) - { - return held != null && held.getItem() instanceof ItemWaraxeMF || held != null && held.getItem() instanceof ItemBattleaxeMF; + + private boolean isAxe(ItemStack held) { + return held != null && held.getItem() instanceof ItemWaraxeMF + || held != null && held.getItem() instanceof ItemBattleaxeMF; } - private boolean isFastblade(ItemStack held) - { - return held != null && held.getItem() instanceof ItemDagger || held != null && held.getItem() instanceof ItemKatanaMF; + + private boolean isFastblade(ItemStack held) { + return held != null && held.getItem() instanceof ItemDagger + || held != null && held.getItem() instanceof ItemKatanaMF; } - - private void applyBalance(EntityPlayer entityPlayer) - { + + private void applyBalance(EntityPlayer entityPlayer) { MFLogUtil.logDebug("Weapon Balance Init"); ItemStack weapon = entityPlayer.getHeldItem(); - float balance = 0.0F; - - if(weapon != null && weapon.getItem() instanceof IWeightedWeapon) - { - balance = ((IWeightedWeapon)weapon.getItem()).getBalance(entityPlayer); - } - - if (ConfigWeapon.useBalance && balance > 0 && entityPlayer != null) - { - TacticalManager.throwPlayerOffBalance(entityPlayer, balance, true); - } + float balance = 0.0F; + + if (weapon != null && weapon.getItem() instanceof IWeightedWeapon) { + balance = ((IWeightedWeapon) weapon.getItem()).getBalance(entityPlayer); + } + + if (ConfigWeapon.useBalance && balance > 0 && entityPlayer != null) { + TacticalManager.throwPlayerOffBalance(entityPlayer, balance, true); + } } - - public static void setParryCooldown(EntityLivingBase user, int ticks) - { + + public static void setParryCooldown(EntityLivingBase user, int ticks) { user.getEntityData().setInteger(parryCooldownNBT, ticks); - - if(!user.worldObj.isRemote && user instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer)user; - ((WorldServer)player.worldObj).getEntityTracker().func_151248_b(player, new ParryPacket(ticks, player).generatePacket()); + + if (!user.worldObj.isRemote && user instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) user; + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new ParryPacket(ticks, player).generatePacket()); } } - public static int getParryCooldown(EntityLivingBase user) - { - if(user.getEntityData().hasKey(parryCooldownNBT)) - { + + public static int getParryCooldown(EntityLivingBase user) { + if (user.getEntityData().hasKey(parryCooldownNBT)) { return user.getEntityData().getInteger(parryCooldownNBT); } return 0; } - public static void tickParryCooldown(EntityLivingBase user) - { + + public static void tickParryCooldown(EntityLivingBase user) { int ticks = getParryCooldown(user); - if(ticks > 0) - { - setParryCooldown(user, ticks-1); + if (ticks > 0) { + setParryCooldown(user, ticks - 1); } } - public static boolean isParryAvailable(EntityLivingBase user) - { - return getParryCooldown(user)<= 0; + + public static boolean isParryAvailable(EntityLivingBase user) { + return getParryCooldown(user) <= 0; } - - public static void setPostHitCooldown(EntityLivingBase user, int ticks) - { + + public static void setPostHitCooldown(EntityLivingBase user, int ticks) { user.getEntityData().setInteger(posthitCooldownNBT, ticks); } - public static int getPostHitCooldown(EntityLivingBase user) - { - if(user.getEntityData().hasKey(posthitCooldownNBT)) - { + + public static int getPostHitCooldown(EntityLivingBase user) { + if (user.getEntityData().hasKey(posthitCooldownNBT)) { return user.getEntityData().getInteger(posthitCooldownNBT); } return 0; } - public static void tickPostHitCooldown(EntityLivingBase user) - { + + public static void tickPostHitCooldown(EntityLivingBase user) { int ticks = getPostHitCooldown(user); - if(ticks > 0) - { - setPostHitCooldown(user, ticks-1); + if (ticks > 0) { + setPostHitCooldown(user, ticks - 1); } } + @SubscribeEvent - public void jump(LivingJumpEvent event) - { - if(event.entityLiving instanceof EntityPlayer) - { - if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(event.entityLiving)) - { + public void jump(LivingJumpEvent event) { + if (event.entityLiving instanceof EntityPlayer) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(event.entityLiving)) { StaminaMechanics.onJump(event.entityLiving); } } - if(event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityPlayer) - { - tryDodge((EntityPlayer)event.entityLiving); + if (event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityPlayer) { + tryDodge((EntityPlayer) event.entityLiving); } } - - private void tryDodge(EntityPlayer user) - { - if(user.isBlocking()) - { + + private void tryDodge(EntityPlayer user) { + if (user.isBlocking()) { float forward = user.moveForward; float side = user.moveStrafing; - - if(side > 0F)//LEFT + + if (side > 0F)// LEFT { commandDodge(user, 1); - } - else if(side < 0)//RIGHT + } else if (side < 0)// RIGHT { commandDodge(user, -1); - } - else if(forward < 0)//BACK + } else if (forward < 0)// BACK { commandDodge(user, 0); } } } + /** * Client-sided dodge */ - private static void commandDodge(EntityPlayer user, int type) - { + private static void commandDodge(EntityPlayer user, int type) { initDodge(user, type); - ((EntityClientPlayerMP)user).sendQueue.addToSendQueue(new DodgeCommand(user, type).generatePacket()); + ((EntityClientPlayerMP) user).sendQueue.addToSendQueue(new DodgeCommand(user, type).generatePacket()); } - public static void initDodge(EntityPlayer user, int type) - { + + public static void initDodge(EntityPlayer user, int type) { float bulk = ArmourCalculator.getTotalBulk(user); - int cost = (int) ((type == 0 ? 15 : 10) * (bulk+1));//Medium armour cost 2x more - - if(bulk <= 1.0F && ItemWeaponMF.tryPerformAbility(user, cost)) - { - float force = 1.0F - (bulk*0.25F);//Medium armour gives 75% - + int cost = (int) ((type == 0 ? 15 : 10) * (bulk + 1));// Medium armour cost 2x more + + if (bulk <= 1.0F && ItemWeaponMF.tryPerformAbility(user, cost)) { + float force = 1.0F - (bulk * 0.25F);// Medium armour gives 75% + float direction = user.rotationYaw; - if(type == 0) direction += 180;//BACK - if(type == 1) direction -= 90;//LEFT - if(type == -1) direction += 90;//RIGHT + if (type == 0) + direction += 180;// BACK + if (type == 1) + direction -= 90;// LEFT + if (type == -1) + direction += 90;// RIGHT TacticalManager.leap(user, direction, force, 0.0F); } } /* - * Causes the victim to 'Spaz out' which never stops being funny (Apply every tick) + * Causes the victim to 'Spaz out' which never stops being funny (Apply every + * tick) */ - public static void panic(EntityLivingBase victim, float speed, int directionTimer) - { - if(!shouldPanic(victim)) - { + public static void panic(EntityLivingBase victim, float speed, int directionTimer) { + if (!shouldPanic(victim)) { return; } double moveX = victim.getEntityData().getDouble("MF2_PanicX"); double moveZ = victim.getEntityData().getDouble("MF2_PanicZ"); - victim.setJumping(true); - - if((moveX == 0 && moveZ == 0) || rand.nextInt(directionTimer) == 0) - { - moveX = (rand.nextDouble()-0.5D)*0.85D * speed; - moveZ = (rand.nextDouble()-0.5D)*0.85D * speed; - - victim.getEntityData().setDouble("MF2_PanicX", moveX); - victim.getEntityData().setDouble("MF2_PanicZ", moveZ); - if(victim.onGround)victim.motionY = 0.25F; - victim.rotationYaw = (float)(Math.atan2(moveX, moveZ)); - } - victim.swingItem(); - victim.limbSwing = 1.0F; - victim.moveEntity(moveX, 0D, moveZ); + victim.setJumping(true); + + if ((moveX == 0 && moveZ == 0) || rand.nextInt(directionTimer) == 0) { + moveX = (rand.nextDouble() - 0.5D) * 0.85D * speed; + moveZ = (rand.nextDouble() - 0.5D) * 0.85D * speed; + + victim.getEntityData().setDouble("MF2_PanicX", moveX); + victim.getEntityData().setDouble("MF2_PanicZ", moveZ); + if (victim.onGround) + victim.motionY = 0.25F; + victim.rotationYaw = (float) (Math.atan2(moveX, moveZ)); + } + victim.swingItem(); + victim.limbSwing = 1.0F; + victim.moveEntity(moveX, 0D, moveZ); } - - - - private static boolean shouldPanic(EntityLivingBase victim) - { - if(victim instanceof EntityMinotaur) - { - return ((EntityMinotaur)victim).getRageLevel() < 80; + + private static boolean shouldPanic(EntityLivingBase victim) { + if (victim instanceof EntityMinotaur) { + return ((EntityMinotaur) victim).getRageLevel() < 80; } return !(victim instanceof EntityPlayer || victim instanceof EntityCogwork); } - private float modifyPlayerDamage(EntityPlayer hit, float dam) - { - if(ResearchLogic.hasInfoUnlocked(hit, KnowledgeListMF.toughness)) - { - dam *= 0.9F;//10% Resist + private float modifyPlayerDamage(EntityPlayer hit, float dam) { + if (ResearchLogic.hasInfoUnlocked(hit, KnowledgeListMF.toughness)) { + dam *= 0.9F;// 10% Resist } return dam; } - + /** * How much strength is added (directly adds to melee dmg) */ - public static float getStrengthEnhancement(EntityLivingBase user) - { + public static float getStrengthEnhancement(EntityLivingBase user) { float mod = 0F; - if(PowerArmour.isPowered(user)) - { + if (PowerArmour.isPowered(user)) { mod += 3F; } return Math.max(-0.5F, mod); } - - public static float getSpecialModifier(CustomMaterial material, String design, Entity target, boolean addEffect) - { - if(target == null)return 1.0F; - + + public static float getSpecialModifier(CustomMaterial material, String design, Entity target, boolean addEffect) { + if (target == null) + return 1.0F; + float modifier = 1.0F; - - if(design != null) - { - if(design.equalsIgnoreCase("dragonforged")) - { - if(TacticalManager.isDragon(target)) - { + + if (design != null) { + if (design.equalsIgnoreCase("dragonforged")) { + if (TacticalManager.isDragon(target)) { modifier *= specialDragonModifier; } } - - if(design.equalsIgnoreCase("ornate")) - { - if(TacticalManager.isUnholyCreature(target)) - { + + if (design.equalsIgnoreCase("ornate")) { + if (TacticalManager.isUnholyCreature(target)) { modifier *= specialOrnateModifier; } } } - - if(material != null) - { - if(isSilverishMaterial(material.name) && target instanceof EntityLivingBase) - { - if(target.getClass().getName().contains("Werewolf")) - { + + if (material != null) { + if (isSilverishMaterial(material.name) && target instanceof EntityLivingBase) { + if (target.getClass().getName().contains("Werewolf")) { modifier *= specialWerewolfModifier; - applyUndeadBane((EntityLivingBase)target); - } - else if(TacticalManager.isUnholyCreature(target)) - { + applyUndeadBane((EntityLivingBase) target); + } else if (TacticalManager.isUnholyCreature(target)) { modifier *= specialUnholyModifier; - applyUndeadBane((EntityLivingBase)target); + applyUndeadBane((EntityLivingBase) target); } } } - + return modifier; } - public static boolean isSilverishMaterial(String material) - { + + public static boolean isSilverishMaterial(String material) { return material.equalsIgnoreCase("silver"); } } diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index 3b82cc1d..00938706 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -106,254 +106,208 @@ import net.minecraftforge.event.world.ChunkEvent; import net.minecraftforge.oredict.OreDictionary; -public class EventManagerMF -{ +public class EventManagerMF { public static Random rand = new Random(); + @SubscribeEvent - public void tryDropItems(LivingDropsEvent event) - { + public void tryDropItems(LivingDropsEvent event) { EntityLivingBase dropper = event.entityLiving; - - if(dropper instanceof EntityChicken) - { - int dropCount = 1 + rand.nextInt(event.lootingLevel+1*4); - - for(int a = 0; a < dropCount; a++) - { + + if (dropper instanceof EntityChicken) { + int dropCount = 1 + rand.nextInt(event.lootingLevel + 1 * 4); + + for (int a = 0; a < dropCount; a++) { dropper.entityDropItem(new ItemStack(Items.feather), 0.0F); } } - if(dropper.getEntityData().hasKey("MF_LootDrop")) - { + if (dropper.getEntityData().hasKey("MF_LootDrop")) { int id = dropper.getEntityData().getInteger("MF_LootDrop"); Item drop = id == 0 ? ToolListMF.loot_sack : id == 1 ? ToolListMF.loot_sack_uc : ToolListMF.loot_sack_rare; dropper.entityDropItem(new ItemStack(drop), 0.0F); } - if(dropper instanceof EntityAgeable && dropper.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD) - { + if (dropper instanceof EntityAgeable && dropper.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD) { EntityAgeable a; - if(rand.nextFloat() * (1+event.lootingLevel) < 0.05F) - { + if (rand.nextFloat() * (1 + event.lootingLevel) < 0.05F) { dropper.entityDropItem(new ItemStack(FoodListMF.guts), 0.0F); } } - if(dropper instanceof IAnimals && !(dropper instanceof IMob)) - { - if(ConfigHardcore.hunterKnife && !dropper.getEntityData().hasKey("hunterKill")) - { + if (dropper instanceof IAnimals && !(dropper instanceof IMob)) { + if (ConfigHardcore.hunterKnife && !dropper.getEntityData().hasKey("hunterKill")) { event.setCanceled(true); return; } - if(ConfigHardcore.lessHunt) - { + if (ConfigHardcore.lessHunt) { alterDrops(dropper, event); } } - if(getRegisterName(dropper).contains("Horse")) - { + if (getRegisterName(dropper).contains("Horse")) { int dropCount = rand.nextInt(3 + event.lootingLevel); - if(ConfigHardcore.lessHunt) - { - dropCount = 1 + rand.nextInt(event.lootingLevel+1); + if (ConfigHardcore.lessHunt) { + dropCount = 1 + rand.nextInt(event.lootingLevel + 1); } - + Item meat = dropper.isBurning() ? FoodListMF.horse_cooked : FoodListMF.horse_raw; - for(int a = 0; a < dropCount; a++) - { + for (int a = 0; a < dropCount; a++) { dropper.entityDropItem(new ItemStack(meat), 0.0F); } } - if(getRegisterName(dropper).contains("Wolf")) - { + if (getRegisterName(dropper).contains("Wolf")) { int dropCount = rand.nextInt(3 + event.lootingLevel); - if(ConfigHardcore.lessHunt) - { - dropCount = 1 + rand.nextInt(event.lootingLevel+1); + if (ConfigHardcore.lessHunt) { + dropCount = 1 + rand.nextInt(event.lootingLevel + 1); } - + Item meat = dropper.isBurning() ? FoodListMF.wolf_cooked : FoodListMF.wolf_raw; - for(int a = 0; a < dropCount; a++) - { + for (int a = 0; a < dropCount; a++) { dropper.entityDropItem(new ItemStack(meat), 0.0F); } } dropLeather(event.entityLiving, event); - - if(dropper instanceof EntitySkeleton) - { - EntitySkeleton skeleton = (EntitySkeleton)dropper; - - if((skeleton.getHeldItem() == null || !(skeleton.getHeldItem().getItem() instanceof ItemBow)) && event.drops != null && !event.drops.isEmpty()) - { + + if (dropper instanceof EntitySkeleton) { + EntitySkeleton skeleton = (EntitySkeleton) dropper; + + if ((skeleton.getHeldItem() == null || !(skeleton.getHeldItem().getItem() instanceof ItemBow)) + && event.drops != null && !event.drops.isEmpty()) { Iterator list = event.drops.iterator(); - - while(list.hasNext()) - { + + while (list.hasNext()) { EntityItem entItem = list.next(); ItemStack drop = entItem.getEntityItem(); - - if(drop.getItem() == Items.arrow) - { + + if (drop.getItem() == Items.arrow) { entItem.setDead(); } } } } } - - private void dropLeather(EntityLivingBase mob, LivingDropsEvent event) - { + + private void dropLeather(EntityLivingBase mob, LivingDropsEvent event) { boolean dropHide = shouldAnimalDropHide(mob); Item hide = getHideFor(mob); - - if(event.drops != null && !event.drops.isEmpty()) - { + + if (event.drops != null && !event.drops.isEmpty()) { Iterator list = event.drops.iterator(); - - while(list.hasNext()) - { + + while (list.hasNext()) { EntityItem entItem = list.next(); ItemStack drop = entItem.getEntityItem(); - - if(drop.getItem() == Items.leather) - { + + if (drop.getItem() == Items.leather) { entItem.setDead(); dropHide = true; } } } - if(dropHide && hide != null && !(ConfigHardcore.hunterKnife && !mob.getEntityData().hasKey("hunterKill"))) - { + if (dropHide && hide != null && !(ConfigHardcore.hunterKnife && !mob.getEntityData().hasKey("hunterKill"))) { mob.entityDropItem(new ItemStack(hide), 0.0F); } } - private Item getHideFor(EntityLivingBase mob) - { - Item[] hide = new Item[]{ComponentListMF.rawhideSmall, ComponentListMF.rawhideMedium, ComponentListMF.rawhideLarge}; + private Item getHideFor(EntityLivingBase mob) { + Item[] hide = new Item[] { ComponentListMF.rawhideSmall, ComponentListMF.rawhideMedium, + ComponentListMF.rawhideLarge }; int size = getHideSizeFor(mob); - if(mob.isChild()) - { - size --; + if (mob.isChild()) { + size--; } - - if(size <= 0) - { + + if (size <= 0) { return null; } - if(size > hide.length) - { + if (size > hide.length) { size = hide.length; } - - return hide[size-1]; + + return hide[size - 1]; } - private int getHideSizeFor(EntityLivingBase mob) - { - if(mob.getClass().getName().endsWith("EntityCow") || mob.getClass().getName().endsWith("EntityHorse")) - { + + private int getHideSizeFor(EntityLivingBase mob) { + if (mob.getClass().getName().endsWith("EntityCow") || mob.getClass().getName().endsWith("EntityHorse")) { return 3; } - if(mob.getClass().getName().endsWith("EntitySheep")) - { + if (mob.getClass().getName().endsWith("EntitySheep")) { return 2; } - if(mob.getClass().getName().endsWith("EntityPig")) - { + if (mob.getClass().getName().endsWith("EntityPig")) { return 1; } - - int size = mob.myEntitySize.ordinal()+1; - if(size <= 1) - { + + int size = mob.myEntitySize.ordinal() + 1; + if (size <= 1) { return 0; } - if(size == 2) - { + if (size == 2) { return 1; - } - else if(size <= 4) - { + } else if (size <= 4) { return 2; } return 3; } - private boolean shouldAnimalDropHide(EntityLivingBase mob) - { - if(mob.getClass().getName().endsWith("EntityWolf") || mob.getClass().getName().endsWith("EntityPig") || mob.getClass().getName().endsWith("EntitySheep") || mob.getClass().getName().endsWith("EntityCow") || mob.getClass().getName().endsWith("EntityHorse")) - { + private boolean shouldAnimalDropHide(EntityLivingBase mob) { + if (mob.getClass().getName().endsWith("EntityWolf") || mob.getClass().getName().endsWith("EntityPig") + || mob.getClass().getName().endsWith("EntitySheep") || mob.getClass().getName().endsWith("EntityCow") + || mob.getClass().getName().endsWith("EntityHorse")) { return true; } - if(mob instanceof EntityWolf || mob instanceof EntityCow || mob instanceof EntityPig || mob instanceof EntitySheep || mob instanceof EntityHorse) - { + if (mob instanceof EntityWolf || mob instanceof EntityCow || mob instanceof EntityPig + || mob instanceof EntitySheep || mob instanceof EntityHorse) { return true; } return false; } @SubscribeEvent - public void onDeath(LivingDeathEvent event) - { - if(!event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityDragon && event.source != null && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer) - { - PlayerTickHandlerMF.addDragonKill((EntityPlayer)event.source.getEntity()); + public void onDeath(LivingDeathEvent event) { + if (!event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityDragon && event.source != null + && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer) { + PlayerTickHandlerMF.addDragonKill((EntityPlayer) event.source.getEntity()); } - if(!event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityPlayer && event.source != null && event.source.getEntity() != null && event.source.getEntity() instanceof EntityDragon) - { - PlayerTickHandlerMF.addDragonEnemyPts((EntityPlayer)event.entityLiving, -1); + if (!event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityPlayer && event.source != null + && event.source.getEntity() != null && event.source.getEntity() instanceof EntityDragon) { + PlayerTickHandlerMF.addDragonEnemyPts((EntityPlayer) event.entityLiving, -1); } Entity dropper = event.entity; - + boolean useArrows = true; - try - { + try { Class.forName("minefantasy.mf2.api.helpers.ArrowEffectsMF"); - } - catch(Exception e) - { + } catch (Exception e) { useArrows = false; } - if(dropper != null && useArrows && ConfigExperiment.stickArrows && !dropper.worldObj.isRemote) - { + if (dropper != null && useArrows && ConfigExperiment.stickArrows && !dropper.worldObj.isRemote) { ArrayList stuckArrows = (ArrayList) ArrowEffectsMF.getStuckArrows(dropper); - if(stuckArrows != null && !stuckArrows.isEmpty()) - { + if (stuckArrows != null && !stuckArrows.isEmpty()) { Iterator list = stuckArrows.iterator(); - - while(list.hasNext()) - { + + while (list.hasNext()) { ItemStack arrow = (ItemStack) list.next(); - if(arrow != null) - { + if (arrow != null) { dropper.entityDropItem(arrow, 0.0F); } } } } - + } - + @SubscribeEvent - public void spawnEntity(EntityJoinWorldEvent event) - { - if(event.entity.isDead) - { + public void spawnEntity(EntityJoinWorldEvent event) { + if (event.entity.isDead) { return; } - if(event.entity instanceof EntityItem && !(event.entity instanceof EntityItemUnbreakable)) - { - EntityItem eitem = (EntityItem)event.entity; - if(eitem.getEntityItem() != null) - { - if(eitem.getEntityItem().hasTagCompound() && eitem.getEntityItem().getTagCompound().hasKey("Unbreakable")) - { + if (event.entity instanceof EntityItem && !(event.entity instanceof EntityItemUnbreakable)) { + EntityItem eitem = (EntityItem) event.entity; + if (eitem.getEntityItem() != null) { + if (eitem.getEntityItem().hasTagCompound() + && eitem.getEntityItem().getTagCompound().hasKey("Unbreakable")) { EntityItem newEntity = new EntityItemUnbreakable(event.world, eitem); event.world.spawnEntityInWorld(newEntity); eitem.setDead(); } - if(isDragonforge(eitem.getEntityItem())) - { + if (isDragonforge(eitem.getEntityItem())) { MFLogUtil.logDebug("Found dragon heart"); EntityItem newEntity = new EntityItemUnbreakable(event.world, eitem); event.world.spawnEntityInWorld(newEntity); @@ -361,715 +315,597 @@ public void spawnEntity(EntityJoinWorldEvent event) } } } - } - private boolean isDragonforge(ItemStack itemstack) - { + } + + private boolean isDragonforge(ItemStack itemstack) { return itemstack.getItem() == ComponentListMF.dragon_heart; } - public void alterDrops(EntityLivingBase dropper, LivingDropsEvent event) - { + public void alterDrops(EntityLivingBase dropper, LivingDropsEvent event) { ArrayList meats = new ArrayList(); - - if(event.drops != null && !event.drops.isEmpty()) - { + + if (event.drops != null && !event.drops.isEmpty()) { Iterator list = event.drops.iterator(); - - while(list.hasNext()) - { + + while (list.hasNext()) { EntityItem entItem = list.next(); ItemStack drop = entItem.getEntityItem(); boolean dropItem = true; - - if(drop.getItem() instanceof ItemFood) - { + + if (drop.getItem() instanceof ItemFood) { entItem.setDead(); - - if(!meats.isEmpty()) - { - for(int a = 0; a < meats.size(); a ++) - { + + if (!meats.isEmpty()) { + for (int a = 0; a < meats.size(); a++) { ItemStack compare = meats.get(a); - if(drop.isItemEqual(compare)) - { + if (drop.isItemEqual(compare)) { dropItem = false; } } } - if(dropItem) - { + if (dropItem) { drop.stackSize = 1; - if(event.lootingLevel > 0) - { - drop.stackSize += dropper.getRNG().nextInt(event.lootingLevel+1); + if (event.lootingLevel > 0) { + drop.stackSize += dropper.getRNG().nextInt(event.lootingLevel + 1); } meats.add(drop.copy()); } } } - - for(int a = 0; a < meats.size(); a ++) - { + + for (int a = 0; a < meats.size(); a++) { ItemStack meat = meats.get(a); dropper.entityDropItem(meat, 0.0F); } } } - + @SubscribeEvent - public void killEntity(LivingDeathEvent event) - { - //killsCount + public void killEntity(LivingDeathEvent event) { + // killsCount EntityLivingBase dead = event.entityLiving; EntityLivingBase hunter = null; ItemStack weapon = null; DamageSource source = event.source; - - if(dead instanceof EntityWitch) - { + + if (dead instanceof EntityWitch) { dropBook(dead, 0); } - if(dead instanceof EntityVillager) - { + if (dead instanceof EntityVillager) { dropBook(dead, 1); } - if(dead instanceof EntityZombie) - { + if (dead instanceof EntityZombie) { dropBook(dead, 2); } - if(source != null && source.getEntity() != null) - { - if(source.getEntity() instanceof EntityLivingBase) - { - hunter = (EntityLivingBase)source.getEntity(); + if (source != null && source.getEntity() != null) { + if (source.getEntity() instanceof EntityLivingBase) { + hunter = (EntityLivingBase) source.getEntity(); weapon = hunter.getHeldItem(); - if(hunter instanceof EntityPlayer) - { - addKill((EntityPlayer)hunter, dead); + if (hunter instanceof EntityPlayer) { + addKill((EntityPlayer) hunter, dead); } } } - if(weapon != null) - { + if (weapon != null) { String type = ToolHelper.getCrafterTool(weapon); - if(weapon.getItem() instanceof IHuntingItem) - { - if(((IHuntingItem)weapon.getItem()).canRetrieveDrops(weapon)) - { + if (weapon.getItem() instanceof IHuntingItem) { + if (((IHuntingItem) weapon.getItem()).canRetrieveDrops(weapon)) { dead.getEntityData().setBoolean("hunterKill", true); } - } - else if (type != null && type.equalsIgnoreCase("knife")) - { + } else if (type != null && type.equalsIgnoreCase("knife")) { dead.getEntityData().setBoolean("hunterKill", true); } } } - private void dropBook(EntityLivingBase dead, int id) - { - if(dead.worldObj.isRemote)return; + private void dropBook(EntityLivingBase dead, int id) { + if (dead.worldObj.isRemote) + return; Item book = null; - if(id == 0) - { + if (id == 0) { float chance = rand.nextFloat(); - if(chance > 0.75F) - { + if (chance > 0.75F) { book = ToolListMF.skillbook_engineering; - } - else - { + } else { book = ToolListMF.skillbook_provisioning; } - } - else if(id == 1 && rand.nextInt(5) == 0) - { + } else if (id == 1 && rand.nextInt(5) == 0) { float chance = rand.nextFloat(); - if(chance > 0.9F) - { + if (chance > 0.9F) { book = ToolListMF.skillbook_engineering; - } - else if(chance > 0.6F) - { + } else if (chance > 0.6F) { book = ToolListMF.skillbook_artisanry; - } - else if(chance > 0.3F) - { + } else if (chance > 0.3F) { book = ToolListMF.skillbook_construction; - } - else - { + } else { book = ToolListMF.skillbook_provisioning; } - } - else if(id == 2 && rand.nextInt(25) == 0) - { + } else if (id == 2 && rand.nextInt(25) == 0) { float chance = rand.nextFloat(); - if(chance > 0.9F) - { + if (chance > 0.9F) { book = ToolListMF.skillbook_engineering; - } - else if(chance > 0.6F) - { + } else if (chance > 0.6F) { book = ToolListMF.skillbook_artisanry; - } - else if(chance > 0.3F) - { + } else if (chance > 0.3F) { book = ToolListMF.skillbook_construction; - } - else - { + } else { book = ToolListMF.skillbook_provisioning; } } - if(book != null) - { + if (book != null) { dead.entityDropItem(new ItemStack(book), 0F); } } - private void addKill(EntityPlayer hunter, EntityLivingBase dead) - { + private void addKill(EntityPlayer hunter, EntityLivingBase dead) { addKillTo(hunter, "killsCount"); - if(dead instanceof IMob) - { + if (dead instanceof IMob) { addKillTo(hunter, "killsCountMob"); - } - else if(dead instanceof IAnimals) - { + } else if (dead instanceof IAnimals) { addKillTo(hunter, "killsCountAnimal"); } - if(dead instanceof EntityPlayer) - { + if (dead instanceof EntityPlayer) { addKillTo(hunter, "killsCountPlayer"); } } - + @SubscribeEvent - public void useHoe(UseHoeEvent event) - { + public void useHoe(UseHoeEvent event) { Block block = event.world.getBlock(event.x, event.y, event.z); - if(block != Blocks.farmland && FarmingHelper.didHoeFail(event.current, event.world, block == Blocks.grass)) - { + if (block != Blocks.farmland && FarmingHelper.didHoeFail(event.current, event.world, block == Blocks.grass)) { event.entityPlayer.swingItem(); - event.world.playAuxSFXAtEntity(event.entityPlayer, 2001, event.x, event.y, event.z, Block.getIdFromBlock(block) + (event.world.getBlockMetadata(event.x, event.y, event.z) << 12)); + event.world.playAuxSFXAtEntity(event.entityPlayer, 2001, event.x, event.y, event.z, + Block.getIdFromBlock(block) + (event.world.getBlockMetadata(event.x, event.y, event.z) << 12)); event.setCanceled(true); } } - + @SubscribeEvent - public void breakBlock(BreakEvent event) - { + public void breakBlock(BreakEvent event) { Block block = event.block; - Block base = event.world.getBlock(event.x, event.y-1, event.z); + Block base = event.world.getBlock(event.x, event.y - 1, event.z); int meta = event.blockMetadata; - - if(base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(event.world, false)) - { - event.world.setBlock(event.x, event.y-1, event.z, Blocks.dirt); + + if (base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(event.world, false)) { + event.world.setBlock(event.x, event.y - 1, event.z, Blocks.dirt); } - if(event.getPlayer() != null) - { + if (event.getPlayer() != null) { playerMineBlock(event); } } - public void playerMineBlock(BlockEvent.BreakEvent event) - { - if(event.getPlayer() == null)return; - - if(event.getPlayer().capabilities.isCreativeMode)return; - + + public void playerMineBlock(BlockEvent.BreakEvent event) { + if (event.getPlayer() == null) + return; + + if (event.getPlayer().capabilities.isCreativeMode) + return; + ItemStack held = event.getPlayer().getHeldItem(); Block broken = event.block; - - if(broken != null && ConfigHardcore.HCCallowRocks) - { - if(broken == Blocks.stone && held == null) - { - entityDropItem(event.world, event.x, event.y, event.z, new ItemStack(ComponentListMF.sharp_rock, rand.nextInt(3)+1)); - } - if(broken instanceof BlockLeavesBase && held != null && held.getItem() == ComponentListMF.sharp_rock) - { - if(rand.nextInt(5) == 0) - { - entityDropItem(event.world, event.x, event.y, event.z, new ItemStack(Items.stick, rand.nextInt(3)+1)); + + if (broken != null && ConfigHardcore.HCCallowRocks) { + if (broken == Blocks.stone && held == null) { + entityDropItem(event.world, event.x, event.y, event.z, + new ItemStack(ComponentListMF.sharp_rock, rand.nextInt(3) + 1)); + } + if (broken instanceof BlockLeavesBase && held != null && held.getItem() == ComponentListMF.sharp_rock) { + if (rand.nextInt(5) == 0) { + entityDropItem(event.world, event.x, event.y, event.z, + new ItemStack(Items.stick, rand.nextInt(3) + 1)); } - if(rand.nextInt(3) == 0) - { - entityDropItem(event.world, event.x, event.y, event.z, new ItemStack(ComponentListMF.vine, rand.nextInt(3)+1)); + if (rand.nextInt(3) == 0) { + entityDropItem(event.world, event.x, event.y, event.z, + new ItemStack(ComponentListMF.vine, rand.nextInt(3) + 1)); } } } - - if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(event.getPlayer()) && ConfigStamina.affectMining) - { - float points = 2.0F*ConfigStamina.miningSpeed; + + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(event.getPlayer()) && ConfigStamina.affectMining) { + float points = 2.0F * ConfigStamina.miningSpeed; ItemWeaponMF.applyFatigue(event.getPlayer(), points, 20F); - - if(points > 0 && !StaminaBar.isAnyStamina(event.getPlayer(), false)) - { + + if (points > 0 && !StaminaBar.isAnyStamina(event.getPlayer(), false)) { event.getPlayer().addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 100, 1)); } } } - public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) - { - if (item.stackSize != 0 && item.getItem() != null) - { - EntityItem entityitem = new EntityItem(world, x+0.5D, y+0.5D, z+0.5D, item); - entityitem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(entityitem); - return entityitem; - } - else - { - return null; - } - } - - private void addKillTo(EntityPlayer hunter, String type) - { + public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) { + if (item.stackSize != 0 && item.getItem() != null) { + EntityItem entityitem = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, item); + entityitem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(entityitem); + return entityitem; + } else { + return null; + } + } + + private void addKillTo(EntityPlayer hunter, String type) { int kills = hunter.getEntityData().hasKey(type) ? hunter.getEntityData().getInteger(type) : 0; - kills ++; + kills++; hunter.getEntityData().setInteger(type, kills); } + public static boolean displayOreDict = false; - + @SubscribeEvent - public void setTooltip(ItemTooltipEvent event) - { - if(!event.entity.worldObj.isRemote) - { + public void setTooltip(ItemTooltipEvent event) { + if (!event.entity.worldObj.isRemote) { return; } - - if(event.itemStack != null) - { + + if (event.itemStack != null) { boolean saidArtefact = false; int[] ids = OreDictionary.getOreIDs(event.itemStack); boolean hasInfo = false; - if(ids != null) - { - for(int id : ids) - { + if (ids != null) { + for (int id : ids) { String s = OreDictionary.getOreName(id); - if(s != null) - { - if(!hasInfo && s.startsWith("ingot")) - { + if (s != null) { + if (!hasInfo && s.startsWith("ingot")) { String s2 = s.substring(5, s.length()); CustomMaterial material = CustomMaterial.getMaterial(s2); - if(material != null)hasInfo = true; - + if (material != null) + hasInfo = true; + CustomToolHelper.addComponentString(event.itemStack, event.toolTip, material); } - if(s.startsWith("Artefact-")) - { - if(!saidArtefact) - { + if (s.startsWith("Artefact-")) { + if (!saidArtefact) { String knowledge = s.substring(9).toLowerCase(); - - if(!ResearchLogic.hasInfoUnlocked(event.entityPlayer, knowledge)) - { + + if (!ResearchLogic.hasInfoUnlocked(event.entityPlayer, knowledge)) { saidArtefact = true; - event.toolTip.add(EnumChatFormatting.AQUA + StatCollector.translateToLocal("info.hasKnowledge")); + event.toolTip.add(EnumChatFormatting.AQUA + + StatCollector.translateToLocal("info.hasKnowledge")); } } - } - else if(displayOreDict) - { + } else if (displayOreDict) { event.toolTip.add("oreDict: " + s); } } } } - - if(event.itemStack.hasTagCompound() && event.itemStack.getTagCompound().hasKey("MF_Inferior")) - { - if(event.itemStack.getTagCompound().getBoolean("MF_Inferior")) - { - event.toolTip.add(EnumChatFormatting.RED + StatCollector.translateToLocal("attribute.inferior.name")); + + if (event.itemStack.hasTagCompound() && event.itemStack.getTagCompound().hasKey("MF_Inferior")) { + if (event.itemStack.getTagCompound().getBoolean("MF_Inferior")) { + event.toolTip + .add(EnumChatFormatting.RED + StatCollector.translateToLocal("attribute.inferior.name")); } - if(!event.itemStack.getTagCompound().getBoolean("MF_Inferior")) - { - event.toolTip.add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("attribute.superior.name")); + if (!event.itemStack.getTagCompound().getBoolean("MF_Inferior")) { + event.toolTip + .add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("attribute.superior.name")); } } - if(event.itemStack.getItem() instanceof ItemArmor && (!(event.itemStack.getItem() instanceof ItemArmourMFBase) || ClientItemsMF.showSpecials(event.itemStack, event.entityPlayer, event.toolTip, event.showAdvancedItemTooltips))) - { + if (event.itemStack.getItem() instanceof ItemArmor + && (!(event.itemStack.getItem() instanceof ItemArmourMFBase) || ClientItemsMF.showSpecials( + event.itemStack, event.entityPlayer, event.toolTip, event.showAdvancedItemTooltips))) { addArmourDR(event.itemStack, event.entityPlayer, event.toolTip, event.showAdvancedItemTooltips); } - if(ArmourCalculator.advancedDamageTypes && ArmourCalculator.getRatioForWeapon(event.itemStack) != null) - { + if (ArmourCalculator.advancedDamageTypes && ArmourCalculator.getRatioForWeapon(event.itemStack) != null) { displayWeaponTraits(ArmourCalculator.getRatioForWeapon(event.itemStack), event.toolTip); } - if(ToolHelper.shouldShowTooltip(event.itemStack)) - { + if (ToolHelper.shouldShowTooltip(event.itemStack)) { showCrafterTooltip(event.itemStack, event.toolTip); } - if(event.itemStack.hasTagCompound() && event.itemStack.getTagCompound().hasKey("MF_CraftedByName")) - { + if (event.itemStack.hasTagCompound() && event.itemStack.getTagCompound().hasKey("MF_CraftedByName")) { String name = event.itemStack.getTagCompound().getString("MF_CraftedByName"); - boolean special = MineFantasyII.isNameModder(name);//Mod creators have highlights - - event.toolTip.add((special ? EnumChatFormatting.GREEN : "") + StatCollector.translateToLocal("attribute.mfcraftedbyname.name") + ": " + name + EnumChatFormatting.GRAY); + boolean special = MineFantasyII.isNameModder(name);// Mod creators have highlights + + event.toolTip.add((special ? EnumChatFormatting.GREEN : "") + + StatCollector.translateToLocal("attribute.mfcraftedbyname.name") + ": " + name + + EnumChatFormatting.GRAY); } WeaponClass WC = WeaponClass.findClassForAny(event.itemStack); - if(WC != null && RPGElements.isSystemActive && WC.parentSkill != null) - { - event.toolTip.add(StatCollector.translateToLocal("weaponclass."+WC.name.toLowerCase())); + if (WC != null && RPGElements.isSystemActive && WC.parentSkill != null) { + event.toolTip.add(StatCollector.translateToLocal("weaponclass." + WC.name.toLowerCase())); float skillMod = RPGElements.getWeaponModifier(event.entityPlayer, WC.parentSkill) * 100F; - if(skillMod > 100) - event.toolTip.add(StatCollector.translateToLocal("rpg.skillmod") + ItemWeaponMF.decimal_format.format(skillMod-100) + "%"); - + if (skillMod > 100) + event.toolTip.add(StatCollector.translateToLocal("rpg.skillmod") + + ItemWeaponMF.decimal_format.format(skillMod - 100) + "%"); + } } } - - private void displayWeaponTraits(float[] ratio, List list) - { - int cutting = (int) (ratio[0] / (ratio[0]+ratio[1]+ratio[2]) * 100F); - int piercing = (int) (ratio[2] / (ratio[0]+ratio[1]+ratio[2]) * 100F); - int blunt = (int) (ratio[1] / (ratio[0]+ratio[1]+ratio[2]) * 100F); - + + private void displayWeaponTraits(float[] ratio, List list) { + int cutting = (int) (ratio[0] / (ratio[0] + ratio[1] + ratio[2]) * 100F); + int piercing = (int) (ratio[2] / (ratio[0] + ratio[1] + ratio[2]) * 100F); + int blunt = (int) (ratio[1] / (ratio[0] + ratio[1] + ratio[2]) * 100F); + addDamageType(list, cutting, "cutting"); addDamageType(list, piercing, "piercing"); addDamageType(list, blunt, "blunt"); } - private void addDamageType(List list, int value, String name) - { - if(value > 0) - { - String s = StatCollector.translateToLocal("attribute.weapon."+name); - if(value < 100) - { + + private void addDamageType(List list, int value, String name) { + if (value > 0) { + String s = StatCollector.translateToLocal("attribute.weapon." + name); + if (value < 100) { s += " " + value + "%"; } list.add(s); } } - public static void addArmourDT(ItemStack armour, EntityPlayer user, List list, boolean extra) - { + + public static void addArmourDT(ItemStack armour, EntityPlayer user, List list, boolean extra) { list.add(""); String AC = ArmourCalculator.getArmourClass(armour); - if(AC != null) - { + if (AC != null) { list.add(StatCollector.translateToLocal("attribute.armour." + AC)); } - list.add(EnumChatFormatting.BLUE+StatCollector.translateToLocal("attribute.armour.protection")); + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.protection")); addSingleDT(armour, user, 0, list, extra); addSingleDT(armour, user, 2, list, extra); addSingleDT(armour, user, 1, list, extra); - } - public static void addSingleDT(ItemStack armour, EntityPlayer user, int id, List list, boolean extra) - { - int slot = ((ItemArmor)armour.getItem()).armorType; - String attatch = ""; - - int rating = (int)(ArmourCalculator.getDTForDisplayPiece(armour, id)*100F); - int equipped = (int)(ArmourCalculator.getDTForDisplayPiece(user.getCurrentArmor(3-slot), id)*100F); - - if(rating > 0 || equipped > 0) - { - if(equipped > 0 && rating != equipped) - { - float d = rating-equipped; - if(d > 0) - { - attatch += EnumChatFormatting.DARK_GREEN; - } - if(d < 0) - { - attatch += EnumChatFormatting.RED; - } - String d2 = ItemWeaponMF.decimal_format.format(d); - attatch += " (" + (d > 0 ? "+" : "") + d2 + ")"; - } - list.add(EnumChatFormatting.BLUE+StatCollector.translateToLocal("attribute.armour.rating."+id) + " " + rating + attatch); - } - } - public static void addArmourDR(ItemStack armour, EntityPlayer user, List list, boolean extra) - { + } + + public static void addSingleDT(ItemStack armour, EntityPlayer user, int id, List list, boolean extra) { + int slot = ((ItemArmor) armour.getItem()).armorType; + String attatch = ""; + + int rating = (int) (ArmourCalculator.getDTForDisplayPiece(armour, id) * 100F); + int equipped = (int) (ArmourCalculator.getDTForDisplayPiece(user.getCurrentArmor(3 - slot), id) * 100F); + + if (rating > 0 || equipped > 0) { + if (equipped > 0 && rating != equipped) { + float d = rating - equipped; + if (d > 0) { + attatch += EnumChatFormatting.DARK_GREEN; + } + if (d < 0) { + attatch += EnumChatFormatting.RED; + } + String d2 = ItemWeaponMF.decimal_format.format(d); + attatch += " (" + (d > 0 ? "+" : "") + d2 + ")"; + } + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.rating." + id) + " " + + rating + attatch); + } + } + + public static void addArmourDR(ItemStack armour, EntityPlayer user, List list, boolean extra) { list.add(""); String AC = ArmourCalculator.getArmourClass(armour); - if(AC != null) - { + if (AC != null) { list.add(StatCollector.translateToLocal("attribute.armour." + AC)); } - if(armour.getItem() instanceof ISpecialArmourMF) - { - if(ArmourCalculator.advancedDamageTypes) - { - list.add(EnumChatFormatting.BLUE+StatCollector.translateToLocal("attribute.armour.protection")); + if (armour.getItem() instanceof ISpecialArmourMF) { + if (ArmourCalculator.advancedDamageTypes) { + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.protection")); addSingleDR(armour, user, 0, list, extra, true); addSingleDR(armour, user, 2, list, extra, true); addSingleDR(armour, user, 1, list, extra, true); - } - else - { + } else { addSingleDR(armour, user, 0, list, extra, false); } } - } - public static void addSingleDR(ItemStack armour, EntityPlayer user, int id, List list, boolean extra, boolean advanced) - { - int slot = ((ItemArmor)armour.getItem()).armorType; - String attatch = ""; - - int rating = (int)(ArmourCalculator.getDRForDisplayPiece(armour, id)*100F); - int equipped = (int)(ArmourCalculator.getDRForDisplayPiece(user.getCurrentArmor(3-slot), id)*100F); - - if(rating > 0 || equipped > 0) - { - if(equipped > 0 && rating != equipped) - { - float d = rating-equipped; - if(d > 0) - { - attatch += EnumChatFormatting.DARK_GREEN; - } - if(d < 0) - { - attatch += EnumChatFormatting.RED; - } - String d2 = ItemWeaponMF.decimal_format.format(d); - attatch += " (" + (d > 0 ? "+" : "") + d2 + ")"; - } - if(advanced) - { - list.add(EnumChatFormatting.BLUE+StatCollector.translateToLocal("attribute.armour.rating."+id) + " " + rating + attatch); - } - else - { - list.add(EnumChatFormatting.BLUE+StatCollector.translateToLocal("attribute.armour.protection") + ": " + rating + attatch); - } - } - } - - private void showCrafterTooltip(ItemStack tool, List list) - { + } + + public static void addSingleDR(ItemStack armour, EntityPlayer user, int id, List list, boolean extra, + boolean advanced) { + int slot = ((ItemArmor) armour.getItem()).armorType; + String attatch = ""; + + int rating = (int) (ArmourCalculator.getDRForDisplayPiece(armour, id) * 100F); + int equipped = (int) (ArmourCalculator.getDRForDisplayPiece(user.getCurrentArmor(3 - slot), id) * 100F); + + if (rating > 0 || equipped > 0) { + if (equipped > 0 && rating != equipped) { + float d = rating - equipped; + if (d > 0) { + attatch += EnumChatFormatting.DARK_GREEN; + } + if (d < 0) { + attatch += EnumChatFormatting.RED; + } + String d2 = ItemWeaponMF.decimal_format.format(d); + attatch += " (" + (d > 0 ? "+" : "") + d2 + ")"; + } + if (advanced) { + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.rating." + id) + " " + + rating + attatch); + } else { + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.protection") + ": " + + rating + attatch); + } + } + } + + private void showCrafterTooltip(ItemStack tool, List list) { String toolType = ToolHelper.getCrafterTool(tool); int tier = ToolHelper.getCrafterTier(tool); float efficiency = ToolHelper.getCrafterEfficiency(tool); - - list.add(StatCollector.translateToLocal("attribute.mfcrafttool.name") + ": " + StatCollector.translateToLocal("tooltype." + toolType)); + + list.add(StatCollector.translateToLocal("attribute.mfcrafttool.name") + ": " + + StatCollector.translateToLocal("tooltype." + toolType)); list.add(StatCollector.translateToLocal("attribute.mfcrafttier.name") + ": " + tier); list.add(StatCollector.translateToLocal("attribute.mfcrafteff.name") + ": " + efficiency); } - @SubscribeEvent - public void loadChunk(ChunkEvent.Load event) - { + public void loadChunk(ChunkEvent.Load event) { } - - - - - private void dropItem(World world, ItemStack itemstack, double x, double y, double z) - { - if (itemstack != null) - { - float f = EventManagerMF.rand .nextFloat() * 0.8F + 0.1F; - float f1 = EventManagerMF.rand.nextFloat() * 0.8F + 0.1F; - float f2 = EventManagerMF.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = EventManagerMF.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, (float)x + f, (float)y + f1, (float)z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)EventManagerMF.rand.nextGaussian() * f3; - entityitem.motionY = (float)EventManagerMF.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)EventManagerMF.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } + + private void dropItem(World world, ItemStack itemstack, double x, double y, double z) { + if (itemstack != null) { + float f = EventManagerMF.rand.nextFloat() * 0.8F + 0.1F; + float f1 = EventManagerMF.rand.nextFloat() * 0.8F + 0.1F; + float f2 = EventManagerMF.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = EventManagerMF.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, (float) x + f, (float) y + f1, (float) z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) EventManagerMF.rand.nextGaussian() * f3; + entityitem.motionY = (float) EventManagerMF.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) EventManagerMF.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } } - - public static String getRegisterName(Entity entity) - { - String s = EntityList.getEntityString(entity); - - if (s == null) - { - s = "generic"; - } - - return s; - } + + public static String getRegisterName(Entity entity) { + String s = EntityList.getEntityString(entity); + + if (s == null) { + s = "generic"; + } + + return s; + } + @SubscribeEvent - public void updateEntity(LivingUpdateEvent event) - { - if(event.entity instanceof EntityCogwork) - { + public void updateEntity(LivingUpdateEvent event) { + if (event.entity instanceof EntityCogwork) { return; } EntityLivingBase entity = event.entityLiving; - float lowHp = entity.getMaxHealth()/5F; + float lowHp = entity.getMaxHealth() / 5F; int injury = getInjuredTime(entity); - - if(ConfigHardcore.critLimp && (entity instanceof EntityLiving || !(entity instanceof EntityPlayer && ((EntityPlayer)entity).capabilities.isCreativeMode))) - { - if(entity.getHealth() <= lowHp || injury > 0) - { - if(entity.getRNG().nextInt(10) == 0 && entity.onGround && !entity.isRiding()) - { + + if (ConfigHardcore.critLimp && (entity instanceof EntityLiving + || !(entity instanceof EntityPlayer && ((EntityPlayer) entity).capabilities.isCreativeMode))) { + if (entity.getHealth() <= lowHp || injury > 0) { + if (entity.getRNG().nextInt(10) == 0 && entity.onGround && !entity.isRiding()) { entity.motionX = 0F; entity.motionZ = 0F; } - if(entity.ticksExisted % 15 == 0) - { + if (entity.ticksExisted % 15 == 0) { entity.limbSwing = 2.0F; - float x = (float) (entity.posX + (rand.nextFloat()-0.5F)/4F); - float y = (float) (entity.posY + entity.getEyeHeight() + (rand.nextFloat()-0.5F)/4F); - float z = (float) (entity.posZ + (rand.nextFloat()-0.5F)/4F); + float x = (float) (entity.posX + (rand.nextFloat() - 0.5F) / 4F); + float y = (float) (entity.posY + entity.getEyeHeight() + (rand.nextFloat() - 0.5F) / 4F); + float z = (float) (entity.posZ + (rand.nextFloat() - 0.5F) / 4F); entity.worldObj.spawnParticle("reddust", x, y, z, 0F, 0F, 0F); } } - if(!entity.worldObj.isRemote && entity.getHealth() <= (lowHp/2) && entity.getRNG().nextInt(200) == 0) - { + if (!entity.worldObj.isRemote && entity.getHealth() <= (lowHp / 2) && entity.getRNG().nextInt(200) == 0) { entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 50)); } } - if(injury > 0 && !entity.worldObj.isRemote) - { - injury --; + if (injury > 0 && !entity.worldObj.isRemote) { + injury--; entity.getEntityData().setInteger(injuredNBT, injury); } - if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(entity)) - { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(entity)) { StaminaMechanics.tickEntity(event.entityLiving); } tickHitSpeeds(event.entityLiving); - - if(event.entity.ticksExisted == 1 && event.entity instanceof EntityPlayer && !event.entity.worldObj.isRemote) - { + + if (event.entity.ticksExisted == 1 && event.entity instanceof EntityPlayer && !event.entity.worldObj.isRemote) { } - + } - public static void tickHitSpeeds(EntityLivingBase user) - { + + public static void tickHitSpeeds(EntityLivingBase user) { int time = getHitspeedTime(user); - if(time > 0) - { - time --; + if (time > 0) { + time--; user.getEntityData().setInteger(hitspeedNBT, time); } - + } + public static final String hitspeedNBT = "MF_HitCooldown"; - public static void setHitTime(EntityLivingBase user, int time) - { + + public static void setHitTime(EntityLivingBase user, int time) { user.getEntityData().setInteger(hitspeedNBT, time); } - public static int getHitspeedTime(Entity entity) - { - if(entity != null && entity.getEntityData().hasKey(hitspeedNBT)) - { + + public static int getHitspeedTime(Entity entity) { + if (entity != null && entity.getEntityData().hasKey(hitspeedNBT)) { return entity.getEntityData().getInteger(hitspeedNBT); } return 0; } + public static final String injuredNBT = "MF_Injured"; - public static int getInjuredTime(Entity entity) - { - if(entity.getEntityData().hasKey(injuredNBT)) - { + + public static int getInjuredTime(Entity entity) { + if (entity.getEntityData().hasKey(injuredNBT)) { return entity.getEntityData().getInteger(injuredNBT); } return 0; } - private boolean isEntityMoving(EntityLivingBase entity) - { + + private boolean isEntityMoving(EntityLivingBase entity) { return Math.hypot(entity.motionX, entity.motionZ) > 0.05F; } - + @SubscribeEvent - public void clonePlayer(PlayerEvent.Clone event) - { + public void clonePlayer(PlayerEvent.Clone event) { EntityPlayer origin = event.original; EntityPlayer spawn = event.entityPlayer; - if(origin != null && spawn != null) - { + if (origin != null && spawn != null) { EntityHelper.cloneNBT(origin, spawn); } } - - @SubscribeEvent - public void startUseItem(PlayerUseItemEvent.Start event) - { - EntityPlayer player = event.entityPlayer; - if(event.item != null && event.item.getItemUseAction() == EnumAction.block) - { - if((StaminaBar.isSystemActive && TacticalManager.shouldStaminaBlock && !StaminaBar.isAnyStamina(player, false)) || !CombatMechanics.isParryAvailable(player)) - { - event.setCanceled(true); - } - } - } - - private boolean canItemBlock(ItemStack item) - { + + @SubscribeEvent + public void startUseItem(PlayerUseItemEvent.Start event) { + EntityPlayer player = event.entityPlayer; + if (event.item != null && event.item.getItemUseAction() == EnumAction.block) { + if ((StaminaBar.isSystemActive && TacticalManager.shouldStaminaBlock + && !StaminaBar.isAnyStamina(player, false)) || !CombatMechanics.isParryAvailable(player)) { + event.setCanceled(true); + } + } + } + + private boolean canItemBlock(ItemStack item) { // TODO Auto-generated method stub return true; } - + @SubscribeEvent - public void levelup(LevelupEvent event) - { + public void levelup(LevelupEvent event) { EntityPlayer player = event.thePlayer; - if(!player.worldObj.isRemote) - { - ((WorldServer)player.worldObj).getEntityTracker().func_151248_b(player, new LevelupPacket(player, event.theSkill, event.theLevel).generatePacket()); - ((WorldServer)player.worldObj).getEntityTracker().func_151248_b(player, new SkillPacket(player, event.theSkill).generatePacket()); + if (!player.worldObj.isRemote) { + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new LevelupPacket(player, event.theSkill, event.theLevel).generatePacket()); + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new SkillPacket(player, event.theSkill).generatePacket()); } } + @SubscribeEvent - public void syncSkill(SyncSkillEvent event) - { + public void syncSkill(SyncSkillEvent event) { EntityPlayer player = event.thePlayer; - if(!player.worldObj.isRemote) - { - ((WorldServer)player.worldObj).getEntityTracker().func_151248_b(player, new SkillPacket(player, event.theSkill).generatePacket()); + if (!player.worldObj.isRemote) { + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new SkillPacket(player, event.theSkill).generatePacket()); } } - + @SubscribeEvent - public void itemEvent(EntityItemPickupEvent event) - { + public void itemEvent(EntityItemPickupEvent event) { EntityPlayer player = event.entityPlayer; - + EntityItem drop = event.item; ItemStack item = drop.getEntityItem(); ItemStack held = player.getHeldItem(); - - if(held != null && held.getItem() instanceof ISmithTongs) - { - if(!TongsHelper.hasHeldItem(held)) - { - if(isHotItem(item)) - { - if(TongsHelper.trySetHeldItem(held, item)) - { + + if (held != null && held.getItem() instanceof ISmithTongs) { + if (!TongsHelper.hasHeldItem(held)) { + if (isHotItem(item)) { + if (TongsHelper.trySetHeldItem(held, item)) { drop.setDead(); - - if(event.isCancelable()) - { + + if (event.isCancelable()) { event.setCanceled(true); } return; @@ -1078,46 +914,39 @@ public void itemEvent(EntityItemPickupEvent event) } } { - if(ConfigHardcore.HCChotBurn && item != null && isHotItem(item)) - { - if(event.isCancelable()) - { + if (ConfigHardcore.HCChotBurn && item != null && isHotItem(item)) { + if (event.isCancelable()) { event.setCanceled(true); } } } } - + @SubscribeEvent - public void wakeUp(PlayerWakeUpEvent event) - { + public void wakeUp(PlayerWakeUpEvent event) { PlayerTickHandlerMF.wakeUp(event.entityPlayer); } - private boolean isHotItem(ItemStack item) - { + private boolean isHotItem(ItemStack item) { return item != null && (item.getItem() instanceof IHotItem); } - + @SideOnly(Side.CLIENT) @SubscribeEvent - public void renderEntity (RenderPlayerEvent.Specials.Pre event) - { + public void renderEntity(RenderPlayerEvent.Specials.Pre event) { Minecraft mc = Minecraft.getMinecraft(); boolean showHeld = true; - if(PowerArmour.isWearingCogwork(event.entityPlayer) && mc.gameSettings.thirdPersonView != 0) - { - IPowerArmour cogwork = (IPowerArmour)event.entity.ridingEntity; + if (PowerArmour.isWearingCogwork(event.entityPlayer) && mc.gameSettings.thirdPersonView != 0) { + IPowerArmour cogwork = (IPowerArmour) event.entity.ridingEntity; showHeld = !cogwork.isArmoured("right_arm"); } event.renderItem = showHeld; } + @SideOnly(Side.CLIENT) @SubscribeEvent - public void renderEntity (RenderLivingEvent.Pre event) - { - if(!(event.renderer instanceof RenderPowerArmour)) - { + public void renderEntity(RenderLivingEvent.Pre event) { + if (!(event.renderer instanceof RenderPowerArmour)) { boolean renderHead = false; boolean renderBody = false; boolean renderLeftArm = false; @@ -1125,10 +954,11 @@ public void renderEntity (RenderLivingEvent.Pre event) boolean renderLeftLeg = false; boolean renderRightLeg = false; Minecraft mc = Minecraft.getMinecraft(); - - if(event.entity instanceof EntityPlayer && !(event.entity == mc.thePlayer && ( mc.currentScreen instanceof GuiContainerCreative ||mc.currentScreen instanceof GuiInventory) ) && PowerArmour.isWearingCogwork(event.entity) && mc.gameSettings.thirdPersonView != 0) - { - IPowerArmour cogwork = (IPowerArmour)event.entity.ridingEntity; + + if (event.entity instanceof EntityPlayer && !(event.entity == mc.thePlayer + && (mc.currentScreen instanceof GuiContainerCreative || mc.currentScreen instanceof GuiInventory)) + && PowerArmour.isWearingCogwork(event.entity) && mc.gameSettings.thirdPersonView != 0) { + IPowerArmour cogwork = (IPowerArmour) event.entity.ridingEntity; renderHead = cogwork.isArmoured("left_leg"); renderBody = cogwork.isArmoured("right_leg"); renderLeftArm = cogwork.isArmoured("left_arm"); @@ -1136,17 +966,15 @@ public void renderEntity (RenderLivingEvent.Pre event) renderLeftLeg = cogwork.isArmoured("left_leg"); renderRightLeg = cogwork.isArmoured("right_leg"); } - - if(event.renderer instanceof RenderPlayer) - { - RenderPlayer RP = (RenderPlayer)event.renderer; - ModelBiped[] layers = new ModelBiped[]{RP.modelArmor, RP.modelArmorChestplate}; - - for(ModelBiped model : layers) - { + + if (event.renderer instanceof RenderPlayer) { + RenderPlayer RP = (RenderPlayer) event.renderer; + ModelBiped[] layers = new ModelBiped[] { RP.modelArmor, RP.modelArmorChestplate }; + + for (ModelBiped model : layers) { model.bipedHead.isHidden = model.bipedHeadwear.isHidden = model.bipedEars.isHidden = renderHead; model.bipedBody.isHidden = model.bipedCloak.isHidden = renderBody; - + model.bipedLeftArm.isHidden = renderLeftArm; model.bipedRightArm.isHidden = renderRightArm; model.bipedLeftLeg.isHidden = renderLeftLeg; diff --git a/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java b/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java index e72e6902..a5455686 100644 --- a/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java @@ -2,6 +2,9 @@ import java.util.List; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; import mods.battlegear2.api.weapons.IExtendedReachWeapon; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; @@ -11,120 +14,102 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; -import cpw.mods.fml.client.FMLClientHandler; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; /** - * This class exists because minecraft hunger seems to decrease faster than windows stock + * This class exists because minecraft hunger seems to decrease faster than + * windows stock */ -public class ExtendedReachMF -{ - //SPRINT JUMPING - //DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for 4 missing bars) - //SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for 4 missing bars) - //EXHAUSTION SCALE = 3.0F = 1hunger +public class ExtendedReachMF { + // SPRINT JUMPING + // DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for + // 4 missing bars) + // SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for + // 4 missing bars) + // EXHAUSTION SCALE = 3.0F = 1hunger @SubscribeEvent - public void onPlayerTick(TickEvent.PlayerTickEvent event) - { - if(event.phase == TickEvent.Phase.END) - { - tickEnd(event.player); - } - } + public void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + tickEnd(event.player); + } + } - public void tickEnd(EntityPlayer entityPlayer) - { - //If we JUST swung an Item - if (entityPlayer.swingProgressInt == 1) - { - ItemStack mainhand = entityPlayer.getCurrentEquippedItem(); - if (mainhand != null && mainhand.getItem() instanceof IExtendedReachWeapon) - { - float extendedReach = ((IExtendedReachWeapon) mainhand.getItem()).getReachModifierInBlocks(mainhand); - if(extendedReach > 0){ - MovingObjectPosition mouseOver = getMouseOver(0, extendedReach + 4); - if (mouseOver != null && mouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) - { - Entity target = mouseOver.entityHit; - if (target instanceof EntityLiving && target != entityPlayer) - { - if (target.hurtResistantTime != ((EntityLiving) target).maxHurtResistantTime) - { - FMLClientHandler.instance().getClient().playerController.attackEntity(entityPlayer, target); - } - } - } - } - } - } + public void tickEnd(EntityPlayer entityPlayer) { + // If we JUST swung an Item + if (entityPlayer.swingProgressInt == 1) { + ItemStack mainhand = entityPlayer.getCurrentEquippedItem(); + if (mainhand != null && mainhand.getItem() instanceof IExtendedReachWeapon) { + float extendedReach = ((IExtendedReachWeapon) mainhand.getItem()).getReachModifierInBlocks(mainhand); + if (extendedReach > 0) { + MovingObjectPosition mouseOver = getMouseOver(0, extendedReach + 4); + if (mouseOver != null && mouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) { + Entity target = mouseOver.entityHit; + if (target instanceof EntityLiving && target != entityPlayer) { + if (target.hurtResistantTime != ((EntityLiving) target).maxHurtResistantTime) { + FMLClientHandler.instance().getClient().playerController.attackEntity(entityPlayer, + target); + } + } + } + } + } + } } - - public MovingObjectPosition getMouseOver(float tickPart, float maxDist) - { - Minecraft mc = FMLClientHandler.instance().getClient(); - if (mc.renderViewEntity != null) - { - if (mc.theWorld != null) - { - mc.pointedEntity = null; - double d0 = maxDist; - MovingObjectPosition objectMouseOver = mc.renderViewEntity.rayTrace(d0, tickPart); - double d1 = d0; - Vec3 vec3 = mc.renderViewEntity.getPosition(tickPart); - if (objectMouseOver != null) - { - d1 = objectMouseOver.hitVec.distanceTo(vec3); - } + public MovingObjectPosition getMouseOver(float tickPart, float maxDist) { + Minecraft mc = FMLClientHandler.instance().getClient(); + if (mc.renderViewEntity != null) { + if (mc.theWorld != null) { + mc.pointedEntity = null; + double d0 = maxDist; + MovingObjectPosition objectMouseOver = mc.renderViewEntity.rayTrace(d0, tickPart); + double d1 = d0; + Vec3 vec3 = mc.renderViewEntity.getPosition(tickPart); + + if (objectMouseOver != null) { + d1 = objectMouseOver.hitVec.distanceTo(vec3); + } - Vec3 vec31 = mc.renderViewEntity.getLook(tickPart); - Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0); - Entity pointedEntity = null; - float f1 = 1.0F; - List list = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.renderViewEntity, mc.renderViewEntity.boundingBox.addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand(f1, f1, f1)); - double d2 = d1; + Vec3 vec31 = mc.renderViewEntity.getLook(tickPart); + Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0); + Entity pointedEntity = null; + float f1 = 1.0F; + List list = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.renderViewEntity, + mc.renderViewEntity.boundingBox + .addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand(f1, f1, f1)); + double d2 = d1; - for (int i = 0; i < list.size(); ++i) - { - Entity entity = (Entity)list.get(i); + for (int i = 0; i < list.size(); ++i) { + Entity entity = (Entity) list.get(i); - if (entity.canBeCollidedWith()) - { - float f2 = entity.getCollisionBorderSize(); - AxisAlignedBB axisalignedbb = entity.boundingBox.expand(f2, f2, f2); - MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32); + if (entity.canBeCollidedWith()) { + float f2 = entity.getCollisionBorderSize(); + AxisAlignedBB axisalignedbb = entity.boundingBox.expand(f2, f2, f2); + MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32); - if (axisalignedbb.isVecInside(vec3)) - { - if (0.0D < d2 || d2 == 0.0D) - { - pointedEntity = entity; - d2 = 0.0D; - } - } - else if (movingobjectposition != null) - { - double d3 = vec3.distanceTo(movingobjectposition.hitVec); + if (axisalignedbb.isVecInside(vec3)) { + if (0.0D < d2 || d2 == 0.0D) { + pointedEntity = entity; + d2 = 0.0D; + } + } else if (movingobjectposition != null) { + double d3 = vec3.distanceTo(movingobjectposition.hitVec); - if (d3 < d2 || d2 == 0.0D) - { - pointedEntity = entity; - d2 = d3; - } - } - } - } + if (d3 < d2 || d2 == 0.0D) { + pointedEntity = entity; + d2 = d3; + } + } + } + } - if (pointedEntity != null && (d2 < d1 || objectMouseOver == null)) - { - objectMouseOver = new MovingObjectPosition(pointedEntity); - } + if (pointedEntity != null && (d2 < d1 || objectMouseOver == null)) { + objectMouseOver = new MovingObjectPosition(pointedEntity); + } + + return objectMouseOver; + } + } + return null; + } - return objectMouseOver; - } - } - return null; - } - } diff --git a/src/main/java/minefantasy/mf2/mechanics/HitSoundGenerator.java b/src/main/java/minefantasy/mf2/mechanics/HitSoundGenerator.java index 5e2bd0b7..e5d0fb25 100644 --- a/src/main/java/minefantasy/mf2/mechanics/HitSoundGenerator.java +++ b/src/main/java/minefantasy/mf2/mechanics/HitSoundGenerator.java @@ -1,6 +1,5 @@ package minefantasy.mf2.mechanics; -import minefantasy.mf2.api.weapon.IWeaponClass; import minefantasy.mf2.api.weapon.WeaponClass; import minefantasy.mf2.network.packet.HitSoundPacket; import net.minecraft.entity.Entity; @@ -10,59 +9,47 @@ import net.minecraft.item.ItemTool; import net.minecraft.world.WorldServer; -public class HitSoundGenerator -{ - public static void makeHitSound(ItemStack weapon, Entity target) - { +public class HitSoundGenerator { + public static void makeHitSound(ItemStack weapon, Entity target) { WeaponClass WC = WeaponClass.findClassForAny(weapon); String material = "metal"; String type = "blunt"; - + material = getMaterial(material, weapon); - if(WC != null) - { + if (WC != null) { type = WC.getSound(); String sndString = "minefantasy2:weapon.hit." + type + "." + material; - - if(!target.worldObj.isRemote) - { - ((WorldServer)target.worldObj).getEntityTracker().func_151248_b(target, new HitSoundPacket(sndString, target).generatePacket()); + + if (!target.worldObj.isRemote) { + ((WorldServer) target.worldObj).getEntityTracker().func_151248_b(target, + new HitSoundPacket(sndString, target).generatePacket()); } } } - public static String getMaterial(String material, ItemStack itemstack) - { - if(itemstack == null) - { + public static String getMaterial(String material, ItemStack itemstack) { + if (itemstack == null) { return "metal"; } Item item = itemstack.getItem(); - if(item instanceof ItemTool) - { - if(((ItemTool)item).getToolMaterialName().equalsIgnoreCase("WOOD")) - { + if (item instanceof ItemTool) { + if (((ItemTool) item).getToolMaterialName().equalsIgnoreCase("WOOD")) { material = "wood"; } - if(((ItemTool)item).getToolMaterialName().equalsIgnoreCase("STONE")) - { + if (((ItemTool) item).getToolMaterialName().equalsIgnoreCase("STONE")) { material = "stone"; } } - - if(item instanceof ItemSword) - { - if(((ItemSword)item).getToolMaterialName().equalsIgnoreCase("WOOD")) - { + + if (item instanceof ItemSword) { + if (((ItemSword) item).getToolMaterialName().equalsIgnoreCase("WOOD")) { material = "wood"; } - if(((ItemSword)item).getToolMaterialName().equalsIgnoreCase("STONE")) - { + if (((ItemSword) item).getToolMaterialName().equalsIgnoreCase("STONE")) { material = "stone"; } } - + return material; } } - diff --git a/src/main/java/minefantasy/mf2/mechanics/MFArrowDispenser.java b/src/main/java/minefantasy/mf2/mechanics/MFArrowDispenser.java index d055e691..ef97eeee 100644 --- a/src/main/java/minefantasy/mf2/mechanics/MFArrowDispenser.java +++ b/src/main/java/minefantasy/mf2/mechanics/MFArrowDispenser.java @@ -6,53 +6,46 @@ import net.minecraft.dispenser.BehaviorDefaultDispenseItem; import net.minecraft.dispenser.IBlockSource; import net.minecraft.dispenser.IPosition; -import net.minecraft.entity.Entity; -import net.minecraft.entity.IProjectile; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; -public class MFArrowDispenser extends BehaviorDefaultDispenseItem -{ - /** - * Dispense the specified stack, play the dispense sound and spawn particles. - */ - public ItemStack dispenseStack(IBlockSource dispenser, ItemStack item) - { - World world = dispenser.getWorld(); - IPosition iposition = BlockDispenser.func_149939_a(dispenser); - EnumFacing direction = BlockDispenser.func_149937_b(dispenser.getBlockMetadata()); - double posX = dispenser.getX() + ((float)direction.getFrontOffsetX()); - double posY = dispenser.getY() + ((float)direction.getFrontOffsetY()); - double posZ = dispenser.getZ() + ((float)direction.getFrontOffsetZ()); - - if(item.getItem() instanceof ItemArrowMF) - { - ItemArrowMF arrowitem = (ItemArrowMF)item.getItem(); - EntityArrowMF arrow = arrowitem.getFiredArrow(new EntityArrowMF(world, posX, posY, posZ), item); - arrow.setThrowableHeading((double)direction.getFrontOffsetX(), (double)((float)direction.getFrontOffsetY() + 0.1F), (double)direction.getFrontOffsetZ(), this.func_82500_b(), this.func_82498_a()); - world.spawnEntityInWorld((Entity)arrow); - arrow.canBePickedUp = 1; - item.splitStack(1); - } - return item; - } +public class MFArrowDispenser extends BehaviorDefaultDispenseItem { + /** + * Dispense the specified stack, play the dispense sound and spawn particles. + */ + public ItemStack dispenseStack(IBlockSource dispenser, ItemStack item) { + World world = dispenser.getWorld(); + IPosition iposition = BlockDispenser.func_149939_a(dispenser); + EnumFacing direction = BlockDispenser.func_149937_b(dispenser.getBlockMetadata()); + double posX = dispenser.getX() + (direction.getFrontOffsetX()); + double posY = dispenser.getY() + (direction.getFrontOffsetY()); + double posZ = dispenser.getZ() + (direction.getFrontOffsetZ()); - /** - * Play the dispense sound from the specified block. - */ - protected void playDispenseSound(IBlockSource p_82485_1_) - { - p_82485_1_.getWorld().playAuxSFX(1002, p_82485_1_.getXInt(), p_82485_1_.getYInt(), p_82485_1_.getZInt(), 0); - } + if (item.getItem() instanceof ItemArrowMF) { + ItemArrowMF arrowitem = (ItemArrowMF) item.getItem(); + EntityArrowMF arrow = arrowitem.getFiredArrow(new EntityArrowMF(world, posX, posY, posZ), item); + arrow.setThrowableHeading(direction.getFrontOffsetX(), direction.getFrontOffsetY() + 0.1F, + direction.getFrontOffsetZ(), this.func_82500_b(), this.func_82498_a()); + world.spawnEntityInWorld(arrow); + arrow.canBePickedUp = 1; + item.splitStack(1); + } + return item; + } - protected float func_82498_a() - { - return 6.0F; - } + /** + * Play the dispense sound from the specified block. + */ + protected void playDispenseSound(IBlockSource p_82485_1_) { + p_82485_1_.getWorld().playAuxSFX(1002, p_82485_1_.getXInt(), p_82485_1_.getYInt(), p_82485_1_.getZInt(), 0); + } - protected float func_82500_b() - { - return 1.1F; - } + protected float func_82498_a() { + return 6.0F; + } + + protected float func_82500_b() { + return 1.1F; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java b/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java index b8563df5..6d2688c0 100644 --- a/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java +++ b/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java @@ -2,13 +2,11 @@ import java.util.Random; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.config.ConfigHardcore; -import minefantasy.mf2.item.armour.ItemCustomArmour; -import minefantasy.mf2.item.list.ArmourListMF; import minefantasy.mf2.item.list.CustomArmourListMF; import minefantasy.mf2.item.list.CustomToolListMF; -import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.item.weapon.ItemWeaponMF; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; @@ -19,146 +17,107 @@ import net.minecraft.entity.monster.EntityWitch; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -public class MonsterUpgrader -{ +public class MonsterUpgrader { private static final float zombieWepChance = 10F; private static final float zombieKnightChance = 200F; - private static final float zombieBruteChance = 200F; - + private static final float zombieBruteChance = 200F; + private static final float creeperJockeyChance = 60F; private static final float witchRiderChance = 100F; - + private static Random rand = new Random(); public static final String zombieArmourNBT = "MF_ZombieArmour"; - - public void upgradeMob(EntityLivingBase mob) - { + + public void upgradeMob(EntityLivingBase mob) { int diff = mob.worldObj.difficultySetting.getDifficultyId(); - if(ConfigHardcore.upgradeZombieWep) - { - if(mob instanceof EntitySkeleton) - { - if(((EntitySkeleton)mob).getSkeletonType() == 1) - { + if (ConfigHardcore.upgradeZombieWep) { + if (mob instanceof EntitySkeleton) { + if (((EntitySkeleton) mob).getSkeletonType() == 1) { giveEntityWeapon(mob, "Diamond", rand.nextInt(8)); + } else if (CombatMechanics.swordSkeleton && rand.nextInt(3) == 0) { + mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_sword.construct("Bronze", "OakWood")); + ((EntitySkeleton) mob).setCombatTask(); } - else if(CombatMechanics.swordSkeleton && rand.nextInt(3) == 0) - { - mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_sword.construct("Bronze","OakWood")); - ((EntitySkeleton)mob).setCombatTask(); - } - } - else if(mob instanceof EntityZombie) - { + } else if (mob instanceof EntityZombie) { String tier = "Iron"; - if(mob instanceof EntityPigZombie) - { + if (mob instanceof EntityPigZombie) { tier = "Obsidian"; giveEntityWeapon(mob, tier, rand.nextInt(7)); - if(mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) - { + if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); } - } - else - { - if(mob.getHeldItem() != null && mob.getHeldItem().getItem() == Items.iron_sword) - { + } else { + if (mob.getHeldItem() != null && mob.getHeldItem().getItem() == Items.iron_sword) { giveEntityWeapon(mob, tier, 0); - if(mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) - { + if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); } - } - else - { - float mod = diff >= 2 ? ConfigHardcore.zombieWepChance*2 : diff < 1 ? ConfigHardcore.zombieWepChance/2 : ConfigHardcore.zombieWepChance; - float chance = rand.nextFloat()*100F*mod; - if(chance >= (100F-zombieWepChance)) - { + } else { + float mod = diff >= 2 ? ConfigHardcore.zombieWepChance * 2 + : diff < 1 ? ConfigHardcore.zombieWepChance / 2 : ConfigHardcore.zombieWepChance; + float chance = rand.nextFloat() * 100F * mod; + if (chance >= (100F - zombieWepChance)) { giveEntityWeapon(mob, tier, rand.nextInt(5)); - if(mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) - { + if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); } } } } - if(rand.nextFloat()*(zombieKnightChance) < diff) - { - createZombieKnight((EntityZombie)mob); - } - else if(rand.nextFloat()*(zombieBruteChance) < diff) - { - createZombieBrute((EntityZombie)mob); - } - else if(ConfigHardcore.fastZombies) - { + if (rand.nextFloat() * (zombieKnightChance) < diff) { + createZombieKnight((EntityZombie) mob); + } else if (rand.nextFloat() * (zombieBruteChance) < diff) { + createZombieBrute((EntityZombie) mob); + } else if (ConfigHardcore.fastZombies) { mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3F); } } - } - else if(mob instanceof EntitySpider) - { - if(mob.riddenByEntity == null) - { - if(rand.nextFloat()*(witchRiderChance) < diff) - { + } else if (mob instanceof EntitySpider) { + if (mob.riddenByEntity == null) { + if (rand.nextFloat() * (witchRiderChance) < diff) { EntityWitch rider = new EntityWitch(mob.worldObj); rider.setPosition(mob.posX, mob.posY, mob.posZ); mob.worldObj.spawnEntityInWorld(rider); rider.mountEntity(mob); - } - else if(rand.nextFloat()*(creeperJockeyChance) < diff) - { + } else if (rand.nextFloat() * (creeperJockeyChance) < diff) { EntityCreeper rider = new EntityCreeper(mob.worldObj); rider.setPosition(mob.posX, mob.posY, mob.posZ); mob.worldObj.spawnEntityInWorld(rider); rider.mountEntity(mob); } } - } - else - { - if(mob.getHeldItem() != null && mob.getHeldItem().getItem() == Items.iron_sword) - { + } else { + if (mob.getHeldItem() != null && mob.getHeldItem().getItem() == Items.iron_sword) { giveEntityWeapon(mob, "iron", 0); } } - if(mob instanceof EntityPigZombie) - { + if (mob instanceof EntityPigZombie) { mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); } - } - + } - private void createZombieKnight(EntityZombie mob) - { - if(mob.isChild())return; + private void createZombieKnight(EntityZombie mob) { + if (mob.isChild()) + return; String tier = "steel"; int lootId = 0; - if(mob instanceof EntityPigZombie) - { + if (mob instanceof EntityPigZombie) { lootId = 1; tier = "encrusted"; } mob.setVillager(false); mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); - mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_greatsword.construct(tier,"OakWood")); + mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_greatsword.construct(tier, "OakWood")); setArmour(mob, 1, tier); mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.2F); mob.getEntityData().setInteger("MF_LootDrop", lootId); } - private void setArmour(EntityLivingBase mob, int id, String tier) - { - if(id == 1) - { + + private void setArmour(EntityLivingBase mob, int id, String tier) { + if (id == 1) { mob.setCurrentItemOrArmor(1, CustomArmourListMF.standard_plate_boots.construct(tier)); mob.setCurrentItemOrArmor(2, CustomArmourListMF.standard_plate_legs.construct(tier)); mob.setCurrentItemOrArmor(3, CustomArmourListMF.standard_plate_chest.construct(tier)); @@ -171,71 +130,59 @@ private void setArmour(EntityLivingBase mob, int id, String tier) mob.setCurrentItemOrArmor(4, CustomArmourListMF.standard_chain_helmet.construct(tier)); } - - private void createZombieBrute(EntityZombie mob) - { - if(mob.isChild())return; + private void createZombieBrute(EntityZombie mob) { + if (mob.isChild()) + return; String tier = "iron"; int lootId = 0; - if(mob instanceof EntityPigZombie) - { + if (mob instanceof EntityPigZombie) { lootId = 1; tier = "encrusted"; } mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); - mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_waraxe.construct(tier,"OakWood")); + mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_waraxe.construct(tier, "OakWood")); setArmour(mob, 0, tier); mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.35F); mob.getEntityData().setInteger("MF_LootDrop", lootId); } - /** * 1=Axe.....2=Mace.....3=dagger.....4=spear.....else sword */ - private void giveEntityWeapon(EntityLivingBase mob, String tier, int weaponType) - { - if(CustomMaterial.getMaterial(tier) == null)return; - + private void giveEntityWeapon(EntityLivingBase mob, String tier, int weaponType) { + if (CustomMaterial.getMaterial(tier) == null) + return; + ItemWeaponMF weapon = CustomToolListMF.standard_sword; - if(weaponType == 1) - { + if (weaponType == 1) { weapon = CustomToolListMF.standard_waraxe; } - if(weaponType == 2) - { + if (weaponType == 2) { weapon = CustomToolListMF.standard_mace; } - if(weaponType == 3) - { + if (weaponType == 3) { weapon = CustomToolListMF.standard_dagger; } - if(weaponType == 4) - { + if (weaponType == 4) { weapon = CustomToolListMF.standard_spear; } - - if(mob != null && weapon != null) - { - mob.setCurrentItemOrArmor(0, weapon.construct(tier,"OakWood")); + + if (mob != null && weapon != null) { + mob.setCurrentItemOrArmor(0, weapon.construct(tier, "OakWood")); } } - + @SubscribeEvent - public void updateLiving(LivingUpdateEvent event) - { + public void updateLiving(LivingUpdateEvent event) { EntityLivingBase living = event.entityLiving; - - if(isEnabled() && !living.worldObj.isRemote && !living.getEntityData().hasKey("giveMFWeapon")) - { + + if (isEnabled() && !living.worldObj.isRemote && !living.getEntityData().hasKey("giveMFWeapon")) { living.getEntityData().setBoolean("giveMFWeapon", true); upgradeMob(event.entityLiving); } } - - private boolean isEnabled() - { + private boolean isEnabled() { return true; } } diff --git a/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java b/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java index 1c94c67a..6abe659c 100644 --- a/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java @@ -35,227 +35,188 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; import net.minecraft.world.EnumDifficulty; -import net.minecraftforge.event.entity.player.PlayerWakeUpEvent; -public class PlayerTickHandlerMF -{ +public class PlayerTickHandlerMF { private static Random rand = new Random(); private static ItemStack lastStack; - //SPRINT JUMPING - //DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for 4 missing bars) - //SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for 4 missing bars) - //EXHAUSTION SCALE = 3.0F = 1hunger + + // SPRINT JUMPING + // DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for + // 4 missing bars) + // SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for + // 4 missing bars) + // EXHAUSTION SCALE = 3.0F = 1hunger @SubscribeEvent - public void onPlayerTick(TickEvent.PlayerTickEvent event) - { - if(event.phase == TickEvent.Phase.END) - { + public void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { ItemStack held = event.player.getHeldItem(); - if(held != null) - { - int parry = ItemWeaponMF.getParry(held); - if(parry > 0) - { - ItemWeaponMF.setParry(held, parry-1); - } - } - - //COMMON - TacticalManager.applyArmourWeight(event.player); - - if(event.player.worldObj.isRemote) - { - if(isNextStep(event.player)) - { - onStep(event.player, event.player.getEntityData().getInteger(stepNBT) % 2 == 0); - } - } - /* - if(RPGElements.isSystemActive) - { - if(event.player.isSprinting() && event.player.ticksExisted % 10 == 0) - { - SkillList.athletics.addXP(event.player, 1); - } - else if(event.player.isSneaking() && TacticalManager.isEntityMoving(event.player) && event.player.ticksExisted % 10 == 0) - { - SkillList.sneak.addXP(event.player, 1); - } - } - */ - //DRAGON EVENT - if(!event.player.worldObj.isRemote) - { - tickDragonSpawner(event.player); - } - if(!event.player.worldObj.isRemote) - { - tryResetBed(event.player); - } - //updatePitch(event.player); (This keeps track of player camera angles, could make a mechanic based on swinging the camera) - } - - if(event.phase == TickEvent.Phase.START) - { - applyBalance(event.player); - ItemFoodMF.onTick(event.player); - - if(!event.player.worldObj.isRemote && !(!ConfigHardcore.HCChotBurn && ItemApron.isUserProtected(event.player)) && event.player.ticksExisted % 100 == 0) - { - for(int a = 0; a < event.player.inventory.getSizeInventory(); a++) - { - ItemStack item = event.player.inventory.getStackInSlot(a); - if(item != null && item.getItem() instanceof IHotItem) - { - event.player.setFire(5); - event.player.attackEntityFrom(DamageSource.onFire, 1.0F); - } - } - } - if(event.player.worldObj.isRemote) - { - ItemStack item = event.player.getHeldItem(); - if(lastStack == null && item != null) - { - if(item.getItem() instanceof IFirearm) - { - NBTTagCompound nbt = AmmoMechanicsMF.getNBT(item); - if(nbt.hasKey(ItemCrossbow.useTypeNBT) && nbt.getString(ItemCrossbow.useTypeNBT).equalsIgnoreCase("fire")) - { - nbt.setString(ItemCrossbow.useTypeNBT, "null"); - } - } - } - if(lastStack != null && (item == null || item != lastStack)) - { - if(lastStack.getItem() instanceof IFirearm) - { - NBTTagCompound nbt = AmmoMechanicsMF.getNBT(lastStack); - if(nbt.hasKey(ItemCrossbow.useTypeNBT) && nbt.getString(ItemCrossbow.useTypeNBT).equalsIgnoreCase("fire")) - { - nbt.setString(ItemCrossbow.useTypeNBT, "null"); - } - } - } - lastStack = item; - } - - float weight = ArmourCalculator.getTotalWeightOfWorn(event.player, false); - if(weight > 100F) - { - if(event.player.isInWater()) - { - event.player.motionY -= (weight/20000F); - } - } - } - } - - private void onStep(EntityPlayer player, boolean alternateStep) - { - if(ArmourCalculator.getTotalWeightOfWorn(player, false) >= 50) - { + if (held != null) { + int parry = ItemWeaponMF.getParry(held); + if (parry > 0) { + ItemWeaponMF.setParry(held, parry - 1); + } + } + + // COMMON + TacticalManager.applyArmourWeight(event.player); + + if (event.player.worldObj.isRemote) { + if (isNextStep(event.player)) { + onStep(event.player, event.player.getEntityData().getInteger(stepNBT) % 2 == 0); + } + } + /* + * if(RPGElements.isSystemActive) { if(event.player.isSprinting() && + * event.player.ticksExisted % 10 == 0) { + * SkillList.athletics.addXP(event.player, 1); } else + * if(event.player.isSneaking() && TacticalManager.isEntityMoving(event.player) + * && event.player.ticksExisted % 10 == 0) { SkillList.sneak.addXP(event.player, + * 1); } } + */ + // DRAGON EVENT + if (!event.player.worldObj.isRemote) { + tickDragonSpawner(event.player); + } + if (!event.player.worldObj.isRemote) { + tryResetBed(event.player); + } + // updatePitch(event.player); (This keeps track of player camera angles, could + // make a mechanic based on swinging the camera) + } + + if (event.phase == TickEvent.Phase.START) { + applyBalance(event.player); + ItemFoodMF.onTick(event.player); + + if (!event.player.worldObj.isRemote + && !(!ConfigHardcore.HCChotBurn && ItemApron.isUserProtected(event.player)) + && event.player.ticksExisted % 100 == 0) { + for (int a = 0; a < event.player.inventory.getSizeInventory(); a++) { + ItemStack item = event.player.inventory.getStackInSlot(a); + if (item != null && item.getItem() instanceof IHotItem) { + event.player.setFire(5); + event.player.attackEntityFrom(DamageSource.onFire, 1.0F); + } + } + } + if (event.player.worldObj.isRemote) { + ItemStack item = event.player.getHeldItem(); + if (lastStack == null && item != null) { + if (item.getItem() instanceof IFirearm) { + NBTTagCompound nbt = AmmoMechanicsMF.getNBT(item); + if (nbt.hasKey(ItemCrossbow.useTypeNBT) + && nbt.getString(ItemCrossbow.useTypeNBT).equalsIgnoreCase("fire")) { + nbt.setString(ItemCrossbow.useTypeNBT, "null"); + } + } + } + if (lastStack != null && (item == null || item != lastStack)) { + if (lastStack.getItem() instanceof IFirearm) { + NBTTagCompound nbt = AmmoMechanicsMF.getNBT(lastStack); + if (nbt.hasKey(ItemCrossbow.useTypeNBT) + && nbt.getString(ItemCrossbow.useTypeNBT).equalsIgnoreCase("fire")) { + nbt.setString(ItemCrossbow.useTypeNBT, "null"); + } + } + } + lastStack = item; + } + + float weight = ArmourCalculator.getTotalWeightOfWorn(event.player, false); + if (weight > 100F) { + if (event.player.isInWater()) { + event.player.motionY -= (weight / 20000F); + } + } + } + } + + private void onStep(EntityPlayer player, boolean alternateStep) { + if (ArmourCalculator.getTotalWeightOfWorn(player, false) >= 50) { player.playSound("mob.irongolem.throw", 1.0F, 1.0F); - } + } } + private static String stepNBT = "MF_LastStep"; - private boolean isNextStep(EntityPlayer player) - { + + private boolean isNextStep(EntityPlayer player) { int prevStep = player.getEntityData().getInteger(stepNBT); int stepcount = (int) player.distanceWalkedOnStepModified; player.getEntityData().setInteger(stepNBT, stepcount); - + return prevStep != stepcount; } - + /* - private static String lastPitchNBT = "MF_last_AimPitch"; - public static void setLastPitch(EntityPlayer user, float value) - { - user.getEntityData().setFloat(lastPitchNBT, value); - } - public static void updatePitch(EntityPlayer user) - { - user.getEntityData().setFloat(lastPitchNBT, user.rotationPitch); - } - public static float getPitchMovement(EntityPlayer user) - { - float lastPitch = user.getEntityData().getFloat(lastPitchNBT) + 1000F; - float nowPitch = user.rotationPitch + 1000F; - - return nowPitch - lastPitch; - } + * private static String lastPitchNBT = "MF_last_AimPitch"; public static void + * setLastPitch(EntityPlayer user, float value) { + * user.getEntityData().setFloat(lastPitchNBT, value); } public static void + * updatePitch(EntityPlayer user) { user.getEntityData().setFloat(lastPitchNBT, + * user.rotationPitch); } public static float getPitchMovement(EntityPlayer + * user) { float lastPitch = user.getEntityData().getFloat(lastPitchNBT) + + * 1000F; float nowPitch = user.rotationPitch + 1000F; + * + * return nowPitch - lastPitch; } */ - private void tickDragonSpawner(EntityPlayer player) - { - if(player.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && player.dimension == 0) - { - int i = ConfigMobs.dragonInterval; - float chance = ConfigMobs.dragonChance; - - if(this.getDragonEnemyPoints(player) >= 100) - { - i /= 2;//twice as frequent - } - if(this.getDragonEnemyPoints(player) >= 50) - { - chance *= 2;//twice the chance - } - if(!player.worldObj.isRemote && player.worldObj.getTotalWorldTime() % i == 0 && rand.nextFloat()*100F < chance) - { - spawnDragon(player); - } - } + private void tickDragonSpawner(EntityPlayer player) { + if (player.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && player.dimension == 0) { + int i = ConfigMobs.dragonInterval; + float chance = ConfigMobs.dragonChance; + + if (this.getDragonEnemyPoints(player) >= 100) { + i /= 2;// twice as frequent + } + if (this.getDragonEnemyPoints(player) >= 50) { + chance *= 2;// twice the chance + } + if (!player.worldObj.isRemote && player.worldObj.getTotalWorldTime() % i == 0 + && rand.nextFloat() * 100F < chance) { + spawnDragon(player); + } + } } - - public static void spawnDragon(EntityPlayer player) - { + + public static void spawnDragon(EntityPlayer player) { spawnDragon(player, 64); } - public static void spawnDragon(EntityPlayer player, int offset) - { + + public static void spawnDragon(EntityPlayer player, int offset) { int y = (int) (player.posY + offset); boolean canMobSpawn = !player.worldObj.isRemote && canDragonSpawnOnPlayer(player, y); - if(canMobSpawn && !player.worldObj.isRemote) - { - int tier = getDragonTier(player);//Gets tier on kills - EntityDragon dragon = new EntityDragon(player.worldObj); - dragon.setPosition(player.posX, y, player.posZ); - player.worldObj.spawnEntityInWorld(dragon); - dragon.setDragon(tier); - dragon.disengage(100); - player.worldObj.playSoundEffect(dragon.posX, dragon.posY-16D, dragon.posZ, "mob.enderdragon.growl", 3.0F, 1.5F); - dragon.fireBreathCooldown = 200; - - if(ConfigMobs.dragonMSG && !player.worldObj.isRemote) - { - player.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + StatCollector.translateToLocal("event.dragonnear.name"))); - - List list = player.worldObj.playerEntities; - Iterator players = list.iterator(); - while(players.hasNext()) - { - Object instance = players.next(); - if(instance != null && instance instanceof EntityPlayer) - { - if(((EntityPlayer)instance).getDistanceToEntity(player) < 256D && instance != player) - { - ((EntityPlayer)instance).addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + StatCollector.translateToLocal("event.dragonnear.name"))); - } - } - } - } + if (canMobSpawn && !player.worldObj.isRemote) { + int tier = getDragonTier(player);// Gets tier on kills + EntityDragon dragon = new EntityDragon(player.worldObj); + dragon.setPosition(player.posX, y, player.posZ); + player.worldObj.spawnEntityInWorld(dragon); + dragon.setDragon(tier); + dragon.disengage(100); + player.worldObj.playSoundEffect(dragon.posX, dragon.posY - 16D, dragon.posZ, "mob.enderdragon.growl", 3.0F, + 1.5F); + dragon.fireBreathCooldown = 200; + + if (ConfigMobs.dragonMSG && !player.worldObj.isRemote) { + player.addChatMessage(new ChatComponentText( + EnumChatFormatting.GOLD + StatCollector.translateToLocal("event.dragonnear.name"))); + + List list = player.worldObj.playerEntities; + Iterator players = list.iterator(); + while (players.hasNext()) { + Object instance = players.next(); + if (instance != null && instance instanceof EntityPlayer) { + if (((EntityPlayer) instance).getDistanceToEntity(player) < 256D && instance != player) { + ((EntityPlayer) instance).addChatMessage(new ChatComponentText( + EnumChatFormatting.GOLD + StatCollector.translateToLocal("event.dragonnear.name"))); + } + } + } + } } } - private static boolean canDragonSpawnOnPlayer(EntityPlayer player, int y) - { - for(int x = -3; x <= 3; x++) - { - for(int z = -3; z <= 3; z++) - { - if(!player.worldObj.canBlockSeeTheSky((int)player.posX + x, y, (int)player.posZ + z)) - { + private static boolean canDragonSpawnOnPlayer(EntityPlayer player, int y) { + for (int x = -3; x <= 3; x++) { + for (int z = -3; z <= 3; z++) { + if (!player.worldObj.canBlockSeeTheSky((int) player.posX + x, y, (int) player.posZ + z)) { return false; } } @@ -263,192 +224,185 @@ private static boolean canDragonSpawnOnPlayer(EntityPlayer player, int y) return true; } - private void applyBalance(EntityPlayer entityPlayer) - { - float weight = 2.0F; - float pitchBalance = entityPlayer.getEntityData().hasKey("MF_Balance_Pitch") ? entityPlayer.getEntityData().getFloat("MF_Balance_Pitch"): 0F; - float yawBalance = entityPlayer.getEntityData().hasKey("MF_Balance_Yaw") ? entityPlayer.getEntityData().getFloat("MF_Balance_Yaw"): 0F; - - if(pitchBalance > 0) - { - if(pitchBalance < 1.0F && pitchBalance > -1.0F)weight = pitchBalance; - pitchBalance -= weight; - - if(ConfigWeapon.useBalance) - { - entityPlayer.rotationPitch += pitchBalance > 0 ? weight : -weight; - } - - if(pitchBalance < 0)pitchBalance = 0; - } - if(yawBalance > 0) - { - if(yawBalance < 1.0F && yawBalance > -1.0F)weight = yawBalance; - yawBalance -= weight; - - if(ConfigWeapon.useBalance) - { - MFLogUtil.logDebug("Weapon Balance Move"); - entityPlayer.rotationYaw += yawBalance > 0 ? weight : -weight; - } - - if(yawBalance < 0)yawBalance = 0; - } - entityPlayer.getEntityData().setFloat("MF_Balance_Pitch", pitchBalance); - entityPlayer.getEntityData().setFloat("MF_Balance_Yaw", yawBalance); + private void applyBalance(EntityPlayer entityPlayer) { + float weight = 2.0F; + float pitchBalance = entityPlayer.getEntityData().hasKey("MF_Balance_Pitch") + ? entityPlayer.getEntityData().getFloat("MF_Balance_Pitch") + : 0F; + float yawBalance = entityPlayer.getEntityData().hasKey("MF_Balance_Yaw") + ? entityPlayer.getEntityData().getFloat("MF_Balance_Yaw") + : 0F; + + if (pitchBalance > 0) { + if (pitchBalance < 1.0F && pitchBalance > -1.0F) + weight = pitchBalance; + pitchBalance -= weight; + + if (ConfigWeapon.useBalance) { + entityPlayer.rotationPitch += pitchBalance > 0 ? weight : -weight; + } + + if (pitchBalance < 0) + pitchBalance = 0; + } + if (yawBalance > 0) { + if (yawBalance < 1.0F && yawBalance > -1.0F) + weight = yawBalance; + yawBalance -= weight; + + if (ConfigWeapon.useBalance) { + MFLogUtil.logDebug("Weapon Balance Move"); + entityPlayer.rotationYaw += yawBalance > 0 ? weight : -weight; + } + + if (yawBalance < 0) + yawBalance = 0; + } + entityPlayer.getEntityData().setFloat("MF_Balance_Pitch", pitchBalance); + entityPlayer.getEntityData().setFloat("MF_Balance_Yaw", yawBalance); } - + @SubscribeEvent - public void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) - { + public void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { onPlayerEnterWorld(event.player); - } + } + @SubscribeEvent - public void onPlayerTravel(PlayerEvent.PlayerChangedDimensionEvent event) - { + public void onPlayerTravel(PlayerEvent.PlayerChangedDimensionEvent event) { onPlayerEnterWorld(event.player); - } + } + @SubscribeEvent - public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) - { + public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { onPlayerEnterWorld(event.player); - } - public void onPlayerEnterWorld(EntityPlayer player) - { - if(player.worldObj.isRemote)return; - + } + + public void onPlayerEnterWorld(EntityPlayer player) { + if (player.worldObj.isRemote) + return; + NBTTagCompound persist = PlayerTagData.getPersistedData(player); MFLogUtil.logDebug("Sync data"); - ResearchLogic.syncData((EntityPlayer) player); - - if(!persist.hasKey("MF_HasBook")) - { - persist.setBoolean("MF_HasBook", true); - if(player.capabilities.isCreativeMode)return; - - player.inventory.addItemStackToInventory(new ItemStack(ToolListMF.researchBook)); - } - if(RPGElements.isSystemActive) - { - RPGElements.initSkills(player); - } - } - - public static int getDragonTier(EntityPlayer player) - { + ResearchLogic.syncData(player); + + if (!persist.hasKey("MF_HasBook")) { + persist.setBoolean("MF_HasBook", true); + if (player.capabilities.isCreativeMode) + return; + + player.inventory.addItemStackToInventory(new ItemStack(ToolListMF.researchBook)); + } + if (RPGElements.isSystemActive) { + RPGElements.initSkills(player); + } + } + + public static int getDragonTier(EntityPlayer player) { int kills = getDragonEnemyPoints(player); - if(kills < 5) - { - return 0;//Young 100% + if (kills < 5) { + return 0;// Young 100% } - if(kills < 10) - { - if(rand.nextInt(5) == 0)return 0;//20% chance for Young - return 1;//Adult + if (kills < 10) { + if (rand.nextInt(5) == 0) + return 0;// 20% chance for Young + return 1;// Adult } - if(kills < 15) - { - if(rand.nextInt(10) == 0)return 0;//10% chance for Young - return 1;//Adult + if (kills < 15) { + if (rand.nextInt(10) == 0) + return 0;// 10% chance for Young + return 1;// Adult } - if(kills < 25) - { - if(rand.nextInt(20) == 0)return 0;//5% chance for Young - if(rand.nextInt(10) == 0)return 2;//10% chance for Mature - return 1;//Adult + if (kills < 25) { + if (rand.nextInt(20) == 0) + return 0;// 5% chance for Young + if (rand.nextInt(10) == 0) + return 2;// 10% chance for Mature + return 1;// Adult } - if(kills < 35) - { - if(rand.nextInt(4) == 0)return 2;//25% chance for Mature - return 1;//Adult + if (kills < 35) { + if (rand.nextInt(4) == 0) + return 2;// 25% chance for Mature + return 1;// Adult } - if(kills >= 50) - { - if(rand.nextInt(10) == 0)return 1;//10% chance for Adult - if(rand.nextInt(5) == 0)return 3;//20% chance Elder - return 2;//Mature + if (kills >= 50) { + if (rand.nextInt(10) == 0) + return 1;// 10% chance for Adult + if (rand.nextInt(5) == 0) + return 3;// 20% chance Elder + return 2;// Mature } - if(kills > 75) - { - if(rand.nextInt(100) == 0)return 4;//1% chance Ancient - if(rand.nextInt(2) == 0)return 3;//50% chance Elder - return 2;//Mature + if (kills > 75) { + if (rand.nextInt(100) == 0) + return 4;// 1% chance Ancient + if (rand.nextInt(2) == 0) + return 3;// 50% chance Elder + return 2;// Mature } - - return 0;//Young 100% + + return 0;// Young 100% } - - public static void addDragonKill(EntityPlayer player) - { + + public static void addDragonKill(EntityPlayer player) { addDragonEnemyPts(player, 1); } - public static void addDragonEnemyPts(EntityPlayer player, int i) - { - setDragonEnemyPts(player, getDragonEnemyPoints(player)+i); + + public static void addDragonEnemyPts(EntityPlayer player, int i) { + setDragonEnemyPts(player, getDragonEnemyPoints(player) + i); } - public static void setDragonEnemyPts(EntityPlayer player, int i) - { - if(i < 0) - { + + public static void setDragonEnemyPts(EntityPlayer player, int i) { + if (i < 0) { i = 0; } NBTTagCompound nbt = PlayerTagData.getPersistedData(player); nbt.setInteger("MF_DragonKills", i); } - - public static int getDragonEnemyPoints(EntityPlayer player) - { + + public static int getDragonEnemyPoints(EntityPlayer player) { NBTTagCompound nbt = PlayerTagData.getPersistedData(player); return nbt.getInteger("MF_DragonKills"); } - + private static String chunkCoords = "MF_BedPos"; private static String resetBed = "MF_Resetbed"; - - public static void wakeUp(EntityPlayer player) - { - if(StaminaBar.isSystemActive) - { + + public static void wakeUp(EntityPlayer player) { + if (StaminaBar.isSystemActive) { StaminaBar.setStaminaValue(player, StaminaBar.getBaseMaxStamina(player)); } - if(player.getEntityData().hasKey(chunkCoords + "_x")) - { + if (player.getEntityData().hasKey(chunkCoords + "_x")) { player.getEntityData().setBoolean(resetBed, true); } } - - private void tryResetBed(EntityPlayer player) - { - if(player.getEntityData().hasKey(resetBed)) - { + + private void tryResetBed(EntityPlayer player) { + if (player.getEntityData().hasKey(resetBed)) { player.getEntityData().removeTag(resetBed); resetBedPosition(player); } } - public static void readyToResetBedPosition(EntityPlayer player) - { + + public static void readyToResetBedPosition(EntityPlayer player) { ChunkCoordinates coords = player.getBedLocation(player.dimension); - if(coords != null) - { + if (coords != null) { player.getEntityData().setInteger(chunkCoords + "_x", coords.posX); player.getEntityData().setInteger(chunkCoords + "_y", coords.posY); player.getEntityData().setInteger(chunkCoords + "_z", coords.posZ); } } - private void resetBedPosition(EntityPlayer player) - { - if(player.getEntityData().hasKey(chunkCoords + "_x")) - { + + private void resetBedPosition(EntityPlayer player) { + if (player.getEntityData().hasKey(chunkCoords + "_x")) { MFLogUtil.logDebug("Reset bed data for " + player.getCommandSenderName()); int x = player.getEntityData().getInteger(chunkCoords + "_x"); int y = player.getEntityData().getInteger(chunkCoords + "_y"); int z = player.getEntityData().getInteger(chunkCoords + "_z"); ChunkCoordinates coords = new ChunkCoordinates(x, y, z); - + player.getEntityData().removeTag(chunkCoords + "_x"); player.getEntityData().removeTag(chunkCoords + "_y"); player.getEntityData().removeTag(chunkCoords + "_z"); - + player.setSpawnChunk(coords, false); } } diff --git a/src/main/java/minefantasy/mf2/mechanics/StaminaMechanics.java b/src/main/java/minefantasy/mf2/mechanics/StaminaMechanics.java index 4f307afe..ebbb716c 100644 --- a/src/main/java/minefantasy/mf2/mechanics/StaminaMechanics.java +++ b/src/main/java/minefantasy/mf2/mechanics/StaminaMechanics.java @@ -19,259 +19,213 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.world.WorldServer; -public class StaminaMechanics -{ - private static boolean hurtAdreneline = true; - private static int bowSeconds = 30; +public class StaminaMechanics { + private static boolean hurtAdreneline = true; + private static int bowSeconds = 30; - public static void tickEntity(EntityLivingBase entity) - { - if(entity.ticksExisted % 20 == 0) - { + public static void tickEntity(EntityLivingBase entity) { + if (entity.ticksExisted % 20 == 0) { ArmourCalculator.setTotalWeightOfWorn(entity, true); ArmourCalculator.setTotalWeightOfWorn(entity, false); } - - float[] packet = new float[]{StaminaBar.getStaminaValue(entity), StaminaBar.getBaseMaxStamina(entity), StaminaBar.getFlashTime(entity), StaminaBar.getBonusStamina(entity)}; - float[] values = new float[]{StaminaBar.getStaminaValue(entity), StaminaBar.getTotalMaxStamina(entity)}; - if(entity.worldObj.isRemote && ConfigClient.playBreath) - { - if(!StaminaBar.isPercentStamAvailable(entity, 0.2F, false) && !entity.isInsideOfMaterial(Material.water)) - { - if(entity.ticksExisted % 20 == 0) - { + + float[] packet = new float[] { StaminaBar.getStaminaValue(entity), StaminaBar.getBaseMaxStamina(entity), + StaminaBar.getFlashTime(entity), StaminaBar.getBonusStamina(entity) }; + float[] values = new float[] { StaminaBar.getStaminaValue(entity), StaminaBar.getTotalMaxStamina(entity) }; + if (entity.worldObj.isRemote && ConfigClient.playBreath) { + if (!StaminaBar.isPercentStamAvailable(entity, 0.2F, false) && !entity.isInsideOfMaterial(Material.water)) { + if (entity.ticksExisted % 20 == 0) { entity.playSound("mob.blaze.breathe", 0.1F, 1.8F); } - if(entity.ticksExisted+5 % 20 == 0) - { + if (entity.ticksExisted + 5 % 20 == 0) { entity.playSound("mob.blaze.breathe", 0.15F, 1.5F); } } return; } float decay = getConstantDecay(entity); - //Decay - if(decay > 0) - { - if(values[0] > 0) - { + // Decay + if (decay > 0) { + if (values[0] > 0) { StaminaBar.modifyStaminaValue(entity, -decay); } StaminaBar.setIdleTime(entity, 60F * getIdleRate(entity)); } - //Regen - if(decay <= 0 && StaminaBar.getIdleTime(entity) <= 0) - { + // Regen + if (decay <= 0 && StaminaBar.getIdleTime(entity) <= 0) { float regen = getRegenRate(entity); - if(values[0] < values[1]) - { + if (values[0] < values[1]) { StaminaBar.modifyStaminaValue(entity, regen); } } - //Bonus Regen - if(decay <= 0) - { + // Bonus Regen + if (decay <= 0) { float regen = StaminaBar.getRegenBonus(entity); - if(values[0] < values[1]) - { + if (values[0] < values[1]) { StaminaBar.modifyStaminaValue(entity, regen); } } - - //float[] stam = new float[]{StaminaBar.getStaminaValue(player), StaminaBar.getMaxStamina(player)}; - - //out of stamina - if(values[0] <= 0) - { - if(ConfigStamina.affectSpeed) - { + + // float[] stam = new float[]{StaminaBar.getStaminaValue(player), + // StaminaBar.getMaxStamina(player)}; + + // out of stamina + if (values[0] <= 0) { + if (ConfigStamina.affectSpeed) { entity.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 2)); } entity.addPotionEffect(new PotionEffect(Potion.hunger.id, 2)); - //Drain air when exhausted, you will drown faster - if(isInWater(entity) && entity.getAir() > -20 && entity.ticksExisted % 20 == 0) - { - entity.setAir(entity.getAir() -1); + // Drain air when exhausted, you will drown faster + if (isInWater(entity) && entity.getAir() > -20 && entity.ticksExisted % 20 == 0) { + entity.setAir(entity.getAir() - 1); } - if(entity instanceof EntityPlayer && TacticalManager.shouldStaminaBlock) - { - if(((EntityPlayer) entity).isUsingItem() && (entity.getHeldItem() != null && entity.getHeldItem().getItemUseAction() == EnumAction.block)) - { + if (entity instanceof EntityPlayer && TacticalManager.shouldStaminaBlock) { + if (((EntityPlayer) entity).isUsingItem() && (entity.getHeldItem() != null + && entity.getHeldItem().getItemUseAction() == EnumAction.block)) { ((EntityPlayer) entity).stopUsingItem(); } } } - //This phase decreases the cooldown - if(StaminaBar.getIdleTime(entity) > 0) - { + // This phase decreases the cooldown + if (StaminaBar.getIdleTime(entity) > 0) { StaminaBar.ModifyIdleTime(entity, -1); } - if(StaminaBar.getFlashTime(entity) > 0) - { + if (StaminaBar.getFlashTime(entity) > 0) { StaminaBar.ModifyFlashTime(entity, -1); } - - //REFRESH + + // REFRESH StaminaBar.refreshSystem(entity); - + StaminaBar.tickBonus(entity); StaminaBar.tickBonusRegen(entity); - - //if changed, resync - //if((StaminaBar.getStaminaValue(player) != stam[0] || StaminaBar.getMaxStamina(player) != stam[1]) || player.ticksExisted % 20 == 0) - if(entity instanceof EntityPlayer) - { + + // if changed, resync + // if((StaminaBar.getStaminaValue(player) != stam[0] || + // StaminaBar.getMaxStamina(player) != stam[1]) || player.ticksExisted % 20 == + // 0) + if (entity instanceof EntityPlayer) { syncStamina((EntityPlayer) entity, packet); } } - - private static void syncStamina(EntityPlayer player, float[]stam) - { - if(!player.worldObj.isRemote) - { - ((WorldServer)player.worldObj).getEntityTracker().func_151248_b(player, new StaminaPacket(stam, player).generatePacket()); + + private static void syncStamina(EntityPlayer player, float[] stam) { + if (!player.worldObj.isRemote) { + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new StaminaPacket(stam, player).generatePacket()); } } - - public static float getConstantDecay(EntityLivingBase user) - { - if(user instanceof EntityPlayer && ((EntityPlayer)user).capabilities.isCreativeMode) - { + + public static float getConstantDecay(EntityLivingBase user) { + if (user instanceof EntityPlayer && ((EntityPlayer) user).capabilities.isCreativeMode) { return 0F; } float value = 0.0F; boolean countArmour = false; - - if(user.isSprinting() && ConfigStamina.sprintModifier > 0 && user.ridingEntity == null) - { + + if (user.isSprinting() && ConfigStamina.sprintModifier > 0 && user.ridingEntity == null) { float sprintingSeconds = 60F; - countArmour = true;//Armour gets factored in with sprinting - value += value += (5F / sprintingSeconds)*ConfigStamina.sprintModifier; + countArmour = true;// Armour gets factored in with sprinting + value += value += (5F / sprintingSeconds) * ConfigStamina.sprintModifier; } - if(user instanceof EntityPlayer) - { - if(user.getHeldItem() != null && ((EntityPlayer) user).isUsingItem() && ConfigStamina.bowModifier > 0) - { - if(user.getHeldItem().getItemUseAction() == EnumAction.bow) - { - //Item gets factored in with bow + if (user instanceof EntityPlayer) { + if (user.getHeldItem() != null && ((EntityPlayer) user).isUsingItem() && ConfigStamina.bowModifier > 0) { + if (user.getHeldItem().getItemUseAction() == EnumAction.bow) { + // Item gets factored in with bow value += StaminaBar.getDefaultMax(user) / 20F / bowSeconds * ConfigStamina.bowModifier; } } } return value * StaminaBar.getBaseDecayModifier(user, countArmour, true); } - - public static float getRegenRate(EntityLivingBase user) - { - if(user instanceof EntityPlayer && ((EntityPlayer)user).capabilities.isCreativeMode) - { + + public static float getRegenRate(EntityLivingBase user) { + if (user instanceof EntityPlayer && ((EntityPlayer) user).capabilities.isCreativeMode) { return 100F; } - if(StaminaBar.getIdleTime(user) > 0) - { + if (StaminaBar.getIdleTime(user) > 0) { return 0; } - if(isInWater(user) && user.getActivePotionEffect(Potion.waterBreathing) == null) - { - return 0;//can't catch your breath when underwater + if (isInWater(user) && user.getActivePotionEffect(Potion.waterBreathing) == null) { + return 0;// can't catch your breath when underwater } - //The base time it takes to regen + // The base time it takes to regen float value = StaminaBar.getTotalMaxStamina(user) / 20 / ConfigStamina.fullRegenSeconds; - if(hurtAdreneline && user.getHealth() <= 2F) - { + if (hurtAdreneline && user.getHealth() <= 2F) { value *= 1.5F; } return value * StaminaBar.getBaseRegenModifier(user, true, true); } - - private static boolean isInWater(EntityLivingBase user) - { + + private static boolean isInWater(EntityLivingBase user) { return user.isInsideOfMaterial(Material.water); } - public static float getIdleRate(EntityLivingBase user) - { + public static float getIdleRate(EntityLivingBase user) { float value = 1.0F; - - if(hurtAdreneline && user.getHealth() <= 4F) - { + + if (hurtAdreneline && user.getHealth() <= 4F) { value *= 0.2F; } - + return value * StaminaBar.getBaseIdleModifier(user, true, true); } - - public static void onJump(EntityLivingBase user) - { - if(user.worldObj.isRemote) - { + + public static void onJump(EntityLivingBase user) { + if (user.worldObj.isRemote) { return; } float stam = StaminaBar.getStaminaValue(user); - if(stam > 0) - { + if (stam > 0) { StaminaBar.modifyStaminaValue(user, -getJumpDecay(user)); } StaminaBar.setIdleTime(user, 40F * getIdleRate(user)); - //syncStamina(user, new float[]{stam, StaminaBar.getMaxStamina(user)}); + // syncStamina(user, new float[]{stam, StaminaBar.getMaxStamina(user)}); } - - public static float getJumpDecay(EntityLivingBase user) - { + + public static float getJumpDecay(EntityLivingBase user) { float value = 2.0F; - - if(user.isSprinting()) - { + + if (user.isSprinting()) { value = 3.0F; } return value * StaminaBar.getBaseDecayModifier(user, true, false); } - - public static void onAttack(EntityLivingBase user, Entity target) - { + + public static void onAttack(EntityLivingBase user, Entity target) { applyHitFatigue(user, 1.0F * TacticalManager.getHighgroundModifier(target, user, 1.5F)); } - - public static void applyHitFatigue(EntityLivingBase user, float modifier) - { + + public static void applyHitFatigue(EntityLivingBase user, float modifier) { float stam = StaminaBar.getStaminaValue(user); - - if(stam > 0) - { - StaminaBar.modifyStaminaValue(user, -getWeaponModifier(user)*modifier); + + if (stam > 0) { + StaminaBar.modifyStaminaValue(user, -getWeaponModifier(user) * modifier); } StaminaBar.setIdleTime(user, 50F * getIdleRate(user)); - //syncStamina(user, new float[]{stam, StaminaBar.getMaxStamina(user)}); + // syncStamina(user, new float[]{stam, StaminaBar.getMaxStamina(user)}); } - - public static float getWeaponModifier(EntityLivingBase user) - { + + public static float getWeaponModifier(EntityLivingBase user) { ItemStack weapon = user.getHeldItem(); float value = 0.0F; - - if(weapon != null) - { + + if (weapon != null) { value = 2F; - - if(weapon.getItem() instanceof IStaminaWeapon) - { - value = ((IStaminaWeapon)weapon.getItem()).getStaminaDrainOnHit(user, weapon); - } - else - { - if(weapon.getItem() instanceof ItemSword) - { + + if (weapon.getItem() instanceof IStaminaWeapon) { + value = ((IStaminaWeapon) weapon.getItem()).getStaminaDrainOnHit(user, weapon); + } else { + if (weapon.getItem() instanceof ItemSword) { value = 5; } - if(weapon.getItem() instanceof ItemTool) - { + if (weapon.getItem() instanceof ItemTool) { value = 10; } } } - + return value * ConfigStamina.weaponModifier * StaminaBar.getBaseDecayModifier(user, true, true); } } diff --git a/src/main/java/minefantasy/mf2/mechanics/TierHelper.java b/src/main/java/minefantasy/mf2/mechanics/TierHelper.java index b091033f..7f1f22db 100644 --- a/src/main/java/minefantasy/mf2/mechanics/TierHelper.java +++ b/src/main/java/minefantasy/mf2/mechanics/TierHelper.java @@ -1,25 +1,24 @@ package minefantasy.mf2.mechanics; - -public class TierHelper -{ +public class TierHelper { /** - * This gets the "points" on how powerful food is (This is used to help balance cost) + * This gets the "points" on how powerful food is (This is used to help balance + * cost) */ - public static int getPointsWorthForFood(int hunger, float saturation, float staminaMax, float staminaMaxTime, float staminaSpeed, float staminaSpeedTime) - { - float satCost = 5F;//Pts for each hour - float boostCost = 1F;//Pts for each 1 per day - float regenCost = 2F;//Pts for each 1s per minute - - float staminaPoints = (staminaMax) * (staminaMaxTime/1200F); - float staminaRegenPoints = (staminaSpeed) * (staminaSpeedTime/60F); - + public static int getPointsWorthForFood(int hunger, float saturation, float staminaMax, float staminaMaxTime, + float staminaSpeed, float staminaSpeedTime) { + float satCost = 5F;// Pts for each hour + float boostCost = 1F;// Pts for each 1 per day + float regenCost = 2F;// Pts for each 1s per minute + + float staminaPoints = (staminaMax) * (staminaMaxTime / 1200F); + float staminaRegenPoints = (staminaSpeed) * (staminaSpeedTime / 60F); + float pts = 0; - pts += saturation /3600F * satCost; + pts += saturation / 3600F * satCost; pts += staminaPoints * boostCost; pts += staminaRegenPoints * regenCost; - - return (int)pts; + + return (int) pts; } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBiological.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBiological.java index f91dab52..0419be0a 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBiological.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBiological.java @@ -12,121 +12,113 @@ import net.minecraft.world.WorldType; import net.minecraft.world.biome.BiomeGenBase; -public class WorldGenBiological -{ - public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) - { +public class WorldGenBiological { + public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) { boolean debug = world.getWorldInfo().getTerrainType() == WorldType.FLAT && MineFantasyII.isDebug(); - - BiomeGenBase biome = world.getBiomeGenForCoords(chunkX*16, chunkZ*16); - if(debug || isBiomeInConstraint(biome, ConfigWorldGen.berryMinTemp, ConfigWorldGen.berryMaxTemp, ConfigWorldGen.berryMinRain, ConfigWorldGen.berryMaxRain)) - { + + BiomeGenBase biome = world.getBiomeGenForCoords(chunkX * 16, chunkZ * 16); + if (debug || isBiomeInConstraint(biome, ConfigWorldGen.berryMinTemp, ConfigWorldGen.berryMaxTemp, + ConfigWorldGen.berryMinRain, ConfigWorldGen.berryMaxRain)) { generatePlant(seed, chunkX, chunkZ, world, BlockListMF.berryBush, 0, ConfigWorldGen.berryRarity, 6); } - if(debug || isBiomeInConstraint(biome, ConfigWorldGen.yewMinTemp, ConfigWorldGen.yewMaxTemp, ConfigWorldGen.yewMinRain, ConfigWorldGen.yewMaxRain)) - { - generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_yew, BlockListMF.leaves_yew, ConfigWorldGen.yewRarity); + if (debug || isBiomeInConstraint(biome, ConfigWorldGen.yewMinTemp, ConfigWorldGen.yewMaxTemp, + ConfigWorldGen.yewMinRain, ConfigWorldGen.yewMaxRain)) { + generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_yew, BlockListMF.leaves_yew, + ConfigWorldGen.yewRarity); } - if(debug || isBiomeInConstraint(biome, ConfigWorldGen.ironbarkMinTemp, ConfigWorldGen.ironbarkMaxTemp, ConfigWorldGen.ironbarkMinRain, ConfigWorldGen.ironbarkMaxRain)) - { - generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_ironbark, BlockListMF.leaves_ironbark, ConfigWorldGen.ironbarkRarity); + if (debug || isBiomeInConstraint(biome, ConfigWorldGen.ironbarkMinTemp, ConfigWorldGen.ironbarkMaxTemp, + ConfigWorldGen.ironbarkMinRain, ConfigWorldGen.ironbarkMaxRain)) { + generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_ironbark, BlockListMF.leaves_ironbark, + ConfigWorldGen.ironbarkRarity); } - if(debug || isBiomeInConstraint(biome, ConfigWorldGen.ebonyMinTemp, ConfigWorldGen.ebonyMaxTemp, ConfigWorldGen.ebonyMinRain, ConfigWorldGen.ebonyMaxRain)) - { - generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_ebony, BlockListMF.leaves_ebony, ConfigWorldGen.ebonyRarity); + if (debug || isBiomeInConstraint(biome, ConfigWorldGen.ebonyMinTemp, ConfigWorldGen.ebonyMaxTemp, + ConfigWorldGen.ebonyMinRain, ConfigWorldGen.ebonyMaxRain)) { + generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_ebony, BlockListMF.leaves_ebony, + ConfigWorldGen.ebonyRarity); } } - public static boolean isBiomeInConstraint(BiomeGenBase biome, float tempMin, float tempMax, float rainMin, float rainMax) - { - if(biome != null) - { - return biome.temperature >= tempMin && biome.temperature < tempMax && biome.rainfall >= rainMin && biome.rainfall < rainMax; + + public static boolean isBiomeInConstraint(BiomeGenBase biome, float tempMin, float tempMax, float rainMin, + float rainMax) { + if (biome != null) { + return biome.temperature >= tempMin && biome.temperature < tempMax && biome.rainfall >= rainMin + && biome.rainfall < rainMax; } return false; } - - private static void generatePlant(Random seed, int chunkX, int chunkZ, World world, Block plant, int meta, float chance, int count) - { + + private static void generatePlant(Random seed, int chunkX, int chunkZ, World world, Block plant, int meta, + float chance, int count) { boolean doGen = world.getWorldInfo().getTerrainType() != WorldType.FLAT; - if (doGen && seed.nextFloat() < chance) - { - for(int a = 0; a < count; a ++) - { - int j = chunkX*16 + seed.nextInt(16); - int k = chunkZ*16 + seed.nextInt(16); - int l = world.getTopSolidOrLiquidBlock(j, k); - (new WorldGenBush(plant, meta)).generate(world, seed, j, l, k); + if (doGen && seed.nextFloat() < chance) { + for (int a = 0; a < count; a++) { + int j = chunkX * 16 + seed.nextInt(16); + int k = chunkZ * 16 + seed.nextInt(16); + int l = world.getTopSolidOrLiquidBlock(j, k); + (new WorldGenBush(plant, meta)).generate(world, seed, j, l, k); } } } - private static void generateTree(Random seed, int chunkX, int chunkZ, World world, Block log, Block leaves, float chance) - { - boolean doGen = world.getWorldInfo().getTerrainType() != WorldType.FLAT || (doGen = MineFantasyII.isDebug() && world.getWorldInfo().getTerrainType() == WorldType.FLAT); - if (doGen && seed.nextFloat() < chance) - { - int j = chunkX*16 + seed.nextInt(16); - int k = chunkZ*16 + seed.nextInt(16); - int l = world.getTopSolidOrLiquidBlock(j, k); - (new WorldGenMFTree(false, log, leaves)).generate(world, seed, j, l, k); + + private static void generateTree(Random seed, int chunkX, int chunkZ, World world, Block log, Block leaves, + float chance) { + boolean doGen = world.getWorldInfo().getTerrainType() != WorldType.FLAT + || (doGen = MineFantasyII.isDebug() && world.getWorldInfo().getTerrainType() == WorldType.FLAT); + if (doGen && seed.nextFloat() < chance) { + int j = chunkX * 16 + seed.nextInt(16); + int k = chunkZ * 16 + seed.nextInt(16); + int l = world.getTopSolidOrLiquidBlock(j, k); + (new WorldGenMFTree(false, log, leaves)).generate(world, seed, j, l, k); } } - - private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, Material neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) - { + + private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, + Material neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, + int layerMax) { int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if(seed.nextFloat() < rarity) - { - for(int count = 0; count < frequency; count ++) - { - int x = chunkX*16 + seed.nextInt(16); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ*16 + seed.nextInt(16); - - if(isNeibourNear(world, x, y, z, neighbour)) - { - if((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) - { + int z = chunkZ * 16 + seed.nextInt(16); + + if (isNeibourNear(world, x, y, z, neighbour)) { + if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { } } } } } - private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, Block neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) - { + + private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, + Block neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) { int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if(seed.nextFloat() < rarity) - { - for(int count = 0; count < frequency; count ++) - { - int x = chunkX*16 + seed.nextInt(16); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ*16 + seed.nextInt(16); - - if(isNeibourNear(world, x, y, z, neighbour)) - { - if((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) - { + int z = chunkZ * 16 + seed.nextInt(16); + + if (isNeibourNear(world, x, y, z, neighbour)) { + if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { } } } } } - private static boolean isNeibourNear(World world, int x, int y, int z, Block neighbour) - { - return world.getBlock(x-1, y, z) == neighbour - || world.getBlock(+1, y, z) == neighbour - || world.getBlock(x, y-1, z) == neighbour - || world.getBlock(x, y+1, z) == neighbour - || world.getBlock(x, y, z-1) == neighbour - || world.getBlock(x, y, z+1) == neighbour; + + private static boolean isNeibourNear(World world, int x, int y, int z, Block neighbour) { + return world.getBlock(x - 1, y, z) == neighbour || world.getBlock(+1, y, z) == neighbour + || world.getBlock(x, y - 1, z) == neighbour || world.getBlock(x, y + 1, z) == neighbour + || world.getBlock(x, y, z - 1) == neighbour || world.getBlock(x, y, z + 1) == neighbour; } - private static boolean isNeibourNear(World world, int x, int y, int z, Material neighbour) - { - return world.getBlock(x-1, y, z).getMaterial() == neighbour - || world.getBlock(+1, y, z).getMaterial() == neighbour - || world.getBlock(x, y-1, z).getMaterial() == neighbour - || world.getBlock(x, y+1, z).getMaterial() == neighbour - || world.getBlock(x, y, z-1).getMaterial() == neighbour - || world.getBlock(x, y, z+1).getMaterial() == neighbour; + + private static boolean isNeibourNear(World world, int x, int y, int z, Material neighbour) { + return world.getBlock(x - 1, y, z).getMaterial() == neighbour + || world.getBlock(+1, y, z).getMaterial() == neighbour + || world.getBlock(x, y - 1, z).getMaterial() == neighbour + || world.getBlock(x, y + 1, z).getMaterial() == neighbour + || world.getBlock(x, y, z - 1).getMaterial() == neighbour + || world.getBlock(x, y, z + 1).getMaterial() == neighbour; } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBush.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBush.java index ae0a5741..488989e0 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBush.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBush.java @@ -7,32 +7,29 @@ import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; -public class WorldGenBush extends WorldGenerator -{ +public class WorldGenBush extends WorldGenerator { private Block block; private int meta; - - public WorldGenBush(Block block, int meta) - { + + public WorldGenBush(Block block, int meta) { super(); this.block = block; this.meta = meta; } + @Override - public boolean generate(World world, Random rand, int x, int y, int z) - { - for (int l = 0; l < 8; ++l) - { - int i1 = x + rand.nextInt(8) - rand.nextInt(8); - int j1 = y + rand.nextInt(4) - rand.nextInt(4); - int k1 = z + rand.nextInt(8) - rand.nextInt(8); + public boolean generate(World world, Random rand, int x, int y, int z) { + for (int l = 0; l < 8; ++l) { + int i1 = x + rand.nextInt(8) - rand.nextInt(8); + int j1 = y + rand.nextInt(4) - rand.nextInt(4); + int k1 = z + rand.nextInt(8) - rand.nextInt(8); - if (world.isAirBlock(i1, j1, k1) && world.getBlock(i1, j1 - 1, k1) == Blocks.grass && block.canPlaceBlockAt(world, i1, j1, k1)) - { - world.setBlock(i1, j1, k1, block, meta, 2); - } - } + if (world.isAirBlock(i1, j1, k1) && world.getBlock(i1, j1 - 1, k1) == Blocks.grass + && block.canPlaceBlockAt(world, i1, j1, k1)) { + world.setBlock(i1, j1, k1, block, meta, 2); + } + } - return true; - } + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenDuelMinable.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenDuelMinable.java index 2bd55c02..db4523cf 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenDuelMinable.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenDuelMinable.java @@ -1,95 +1,85 @@ package minefantasy.mf2.mechanics.worldGen; import java.util.Random; + import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; -public class WorldGenDuelMinable extends WorldGenerator -{ - private Block ore, specialOre; - /** The number of blocks to generate. */ - private int veinSize; - private Block bed; - private int oreMeta, specialMeta; - private float chanceForSpecial; +public class WorldGenDuelMinable extends WorldGenerator { + private Block ore, specialOre; + /** The number of blocks to generate. */ + private int veinSize; + private Block bed; + private int oreMeta, specialMeta; + private float chanceForSpecial; + + public WorldGenDuelMinable(Block main, int number, Block extra, float chance) { + this(main, 0, number, Blocks.stone, extra, 0, chance); + } - public WorldGenDuelMinable(Block main, int number, Block extra, float chance) - { - this(main, 0, number, Blocks.stone, extra, 0, chance); - } - public WorldGenDuelMinable(Block main, int mainMeta, int number, Block target, Block extra, int extraMeta, float chance) - { - this.ore = main; - this.oreMeta = mainMeta; - this.veinSize = number; - this.bed = target; - this.specialOre = extra; - this.specialMeta = extraMeta; - this.chanceForSpecial = chance; - } + public WorldGenDuelMinable(Block main, int mainMeta, int number, Block target, Block extra, int extraMeta, + float chance) { + this.ore = main; + this.oreMeta = mainMeta; + this.veinSize = number; + this.bed = target; + this.specialOre = extra; + this.specialMeta = extraMeta; + this.chanceForSpecial = chance; + } - public boolean generate(World world, Random seed, int x, int y, int z) - { - float f = seed.nextFloat() * (float)Math.PI; - double d0 = (double)((float)(x + 8) + MathHelper.sin(f) * (float)this.veinSize / 8.0F); - double d1 = (double)((float)(x + 8) - MathHelper.sin(f) * (float)this.veinSize / 8.0F); - double d2 = (double)((float)(z + 8) + MathHelper.cos(f) * (float)this.veinSize / 8.0F); - double d3 = (double)((float)(z + 8) - MathHelper.cos(f) * (float)this.veinSize / 8.0F); - double d4 = (double)(y + seed.nextInt(3) - 2); - double d5 = (double)(y + seed.nextInt(3) - 2); + public boolean generate(World world, Random seed, int x, int y, int z) { + float f = seed.nextFloat() * (float) Math.PI; + double d0 = x + 8 + MathHelper.sin(f) * this.veinSize / 8.0F; + double d1 = x + 8 - MathHelper.sin(f) * this.veinSize / 8.0F; + double d2 = z + 8 + MathHelper.cos(f) * this.veinSize / 8.0F; + double d3 = z + 8 - MathHelper.cos(f) * this.veinSize / 8.0F; + double d4 = y + seed.nextInt(3) - 2; + double d5 = y + seed.nextInt(3) - 2; - for (int l = 0; l <= this.veinSize; ++l) - { - double d6 = d0 + (d1 - d0) * (double)l / (double)this.veinSize; - double d7 = d4 + (d5 - d4) * (double)l / (double)this.veinSize; - double d8 = d2 + (d3 - d2) * (double)l / (double)this.veinSize; - double d9 = seed.nextDouble() * (double)this.veinSize / 16.0D; - double d10 = (double)(MathHelper.sin((float)l * (float)Math.PI / (float)this.veinSize) + 1.0F) * d9 + 1.0D; - double d11 = (double)(MathHelper.sin((float)l * (float)Math.PI / (float)this.veinSize) + 1.0F) * d9 + 1.0D; - int i1 = MathHelper.floor_double(d6 - d10 / 2.0D); - int j1 = MathHelper.floor_double(d7 - d11 / 2.0D); - int k1 = MathHelper.floor_double(d8 - d10 / 2.0D); - int l1 = MathHelper.floor_double(d6 + d10 / 2.0D); - int i2 = MathHelper.floor_double(d7 + d11 / 2.0D); - int j2 = MathHelper.floor_double(d8 + d10 / 2.0D); + for (int l = 0; l <= this.veinSize; ++l) { + double d6 = d0 + (d1 - d0) * l / this.veinSize; + double d7 = d4 + (d5 - d4) * l / this.veinSize; + double d8 = d2 + (d3 - d2) * l / this.veinSize; + double d9 = seed.nextDouble() * this.veinSize / 16.0D; + double d10 = (MathHelper.sin(l * (float) Math.PI / this.veinSize) + 1.0F) * d9 + 1.0D; + double d11 = (MathHelper.sin(l * (float) Math.PI / this.veinSize) + 1.0F) * d9 + 1.0D; + int i1 = MathHelper.floor_double(d6 - d10 / 2.0D); + int j1 = MathHelper.floor_double(d7 - d11 / 2.0D); + int k1 = MathHelper.floor_double(d8 - d10 / 2.0D); + int l1 = MathHelper.floor_double(d6 + d10 / 2.0D); + int i2 = MathHelper.floor_double(d7 + d11 / 2.0D); + int j2 = MathHelper.floor_double(d8 + d10 / 2.0D); - for (int k2 = i1; k2 <= l1; ++k2) - { - double d12 = ((double)k2 + 0.5D - d6) / (d10 / 2.0D); + for (int k2 = i1; k2 <= l1; ++k2) { + double d12 = (k2 + 0.5D - d6) / (d10 / 2.0D); - if (d12 * d12 < 1.0D) - { - for (int l2 = j1; l2 <= i2; ++l2) - { - double d13 = ((double)l2 + 0.5D - d7) / (d11 / 2.0D); + if (d12 * d12 < 1.0D) { + for (int l2 = j1; l2 <= i2; ++l2) { + double d13 = (l2 + 0.5D - d7) / (d11 / 2.0D); - if (d12 * d12 + d13 * d13 < 1.0D) - { - for (int i3 = k1; i3 <= j2; ++i3) - { - double d14 = ((double)i3 + 0.5D - d8) / (d10 / 2.0D); + if (d12 * d12 + d13 * d13 < 1.0D) { + for (int i3 = k1; i3 <= j2; ++i3) { + double d14 = (i3 + 0.5D - d8) / (d10 / 2.0D); - if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0D && world.getBlock(k2, l2, i3).isReplaceableOreGen(world, k2, l2, i3, bed)) - { - if(seed.nextFloat() < chanceForSpecial) - { - world.setBlock(k2, l2, i3, this.specialOre, specialMeta, 2);//Special Block - } - else - { - world.setBlock(k2, l2, i3, this.ore, oreMeta, 2);//Ore - } - } - } - } - } - } - } - } + if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0D + && world.getBlock(k2, l2, i3).isReplaceableOreGen(world, k2, l2, i3, bed)) { + if (seed.nextFloat() < chanceForSpecial) { + world.setBlock(k2, l2, i3, this.specialOre, specialMeta, 2);// Special Block + } else { + world.setBlock(k2, l2, i3, this.ore, oreMeta, 2);// Ore + } + } + } + } + } + } + } + } - return true; - } + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java index 1bda06a2..34de031e 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java @@ -11,135 +11,144 @@ import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenMinable; -public class WorldGenGeological -{ - public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) - { - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreCopper, Blocks.stone, ConfigWorldGen.copperSize, ConfigWorldGen.copperFrequencyMin, ConfigWorldGen.copperFrequencyMax, ConfigWorldGen.copperRarity, ConfigWorldGen.copperLayerMin, ConfigWorldGen.copperLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreTin, Blocks.stone, ConfigWorldGen.tinSize, ConfigWorldGen.tinFrequencyMin, ConfigWorldGen.tinFrequencyMax, ConfigWorldGen.tinRarity, ConfigWorldGen.tinLayerMin, ConfigWorldGen.tinLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreSilver, Blocks.stone, ConfigWorldGen.silverSize, ConfigWorldGen.silverFrequencyMin, ConfigWorldGen.silverFrequencyMax, ConfigWorldGen.silverRarity, ConfigWorldGen.silverLayerMin, ConfigWorldGen.silverLayerMax); - generateOreWithNeighbour(seed, chunkX, chunkZ, world, BlockListMF.oreMythic, Blocks.stone, Blocks.bedrock, ConfigWorldGen.mythicSize, ConfigWorldGen.mythicFrequencyMin, ConfigWorldGen.mythicFrequencyMax, ConfigWorldGen.mythicRarity, ConfigWorldGen.mythicLayerMin, ConfigWorldGen.mythicLayerMax); - - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreKaolinite, Blocks.stone, ConfigWorldGen.kaoliniteSize, ConfigWorldGen.kaoliniteFrequencyMin, ConfigWorldGen.kaoliniteFrequencyMax, ConfigWorldGen.kaoliniteRarity, ConfigWorldGen.kaoliniteLayerMin, ConfigWorldGen.kaoliniteLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreClay, Blocks.dirt, ConfigWorldGen.claySize, ConfigWorldGen.clayFrequencyMin, ConfigWorldGen.clayFrequencyMax, ConfigWorldGen.clayRarity, ConfigWorldGen.clayLayerMin, ConfigWorldGen.clayLayerMax); - generateOreWithNeighbour(seed, chunkX, chunkZ, world, BlockListMF.oreNitre, Blocks.stone, Blocks.air, ConfigWorldGen.nitreSize, ConfigWorldGen.nitreFrequencyMin, ConfigWorldGen.nitreFrequencyMax, ConfigWorldGen.nitreRarity, ConfigWorldGen.nitreLayerMin, ConfigWorldGen.nitreLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreSulfur, Blocks.stone, ConfigWorldGen.sulfurSize, ConfigWorldGen.sulfurFrequencyMin, ConfigWorldGen.sulfurFrequencyMax, ConfigWorldGen.sulfurRarity, ConfigWorldGen.sulfurLayerMin, ConfigWorldGen.sulfurLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreBorax, Blocks.stone, ConfigWorldGen.boraxSize, ConfigWorldGen.boraxFrequencyMin, ConfigWorldGen.boraxFrequencyMax, ConfigWorldGen.boraxRarity, ConfigWorldGen.boraxLayerMin, ConfigWorldGen.boraxLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreTungsten, Blocks.stone, ConfigWorldGen.wolframiteSize, ConfigWorldGen.wolframiteFrequencyMin, ConfigWorldGen.wolframiteFrequencyMax, ConfigWorldGen.wolframiteRarity, ConfigWorldGen.wolframiteLayerMin, ConfigWorldGen.wolframiteLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreCoalRich, Blocks.stone, ConfigWorldGen.coalSize, ConfigWorldGen.coalFrequencyMin, ConfigWorldGen.coalFrequencyMax, ConfigWorldGen.coalRarity, ConfigWorldGen.coalLayerMin, ConfigWorldGen.coalLayerMax); - - generateOre(seed, chunkX, chunkZ, world, BlockListMF.limestone, Blocks.stone, ConfigWorldGen.limestoneSize, ConfigWorldGen.limestoneFrequencyMin, ConfigWorldGen.limestoneFrequencyMax, ConfigWorldGen.limestoneRarity, ConfigWorldGen.limestoneLayerMin, ConfigWorldGen.limestoneLayerMax); +public class WorldGenGeological { + public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) { + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreCopper, Blocks.stone, ConfigWorldGen.copperSize, + ConfigWorldGen.copperFrequencyMin, ConfigWorldGen.copperFrequencyMax, ConfigWorldGen.copperRarity, + ConfigWorldGen.copperLayerMin, ConfigWorldGen.copperLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreTin, Blocks.stone, ConfigWorldGen.tinSize, + ConfigWorldGen.tinFrequencyMin, ConfigWorldGen.tinFrequencyMax, ConfigWorldGen.tinRarity, + ConfigWorldGen.tinLayerMin, ConfigWorldGen.tinLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreSilver, Blocks.stone, ConfigWorldGen.silverSize, + ConfigWorldGen.silverFrequencyMin, ConfigWorldGen.silverFrequencyMax, ConfigWorldGen.silverRarity, + ConfigWorldGen.silverLayerMin, ConfigWorldGen.silverLayerMax); + generateOreWithNeighbour(seed, chunkX, chunkZ, world, BlockListMF.oreMythic, Blocks.stone, Blocks.bedrock, + ConfigWorldGen.mythicSize, ConfigWorldGen.mythicFrequencyMin, ConfigWorldGen.mythicFrequencyMax, + ConfigWorldGen.mythicRarity, ConfigWorldGen.mythicLayerMin, ConfigWorldGen.mythicLayerMax); + + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreKaolinite, Blocks.stone, ConfigWorldGen.kaoliniteSize, + ConfigWorldGen.kaoliniteFrequencyMin, ConfigWorldGen.kaoliniteFrequencyMax, + ConfigWorldGen.kaoliniteRarity, ConfigWorldGen.kaoliniteLayerMin, ConfigWorldGen.kaoliniteLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreClay, Blocks.dirt, ConfigWorldGen.claySize, + ConfigWorldGen.clayFrequencyMin, ConfigWorldGen.clayFrequencyMax, ConfigWorldGen.clayRarity, + ConfigWorldGen.clayLayerMin, ConfigWorldGen.clayLayerMax); + generateOreWithNeighbour(seed, chunkX, chunkZ, world, BlockListMF.oreNitre, Blocks.stone, Blocks.air, + ConfigWorldGen.nitreSize, ConfigWorldGen.nitreFrequencyMin, ConfigWorldGen.nitreFrequencyMax, + ConfigWorldGen.nitreRarity, ConfigWorldGen.nitreLayerMin, ConfigWorldGen.nitreLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreSulfur, Blocks.stone, ConfigWorldGen.sulfurSize, + ConfigWorldGen.sulfurFrequencyMin, ConfigWorldGen.sulfurFrequencyMax, ConfigWorldGen.sulfurRarity, + ConfigWorldGen.sulfurLayerMin, ConfigWorldGen.sulfurLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreBorax, Blocks.stone, ConfigWorldGen.boraxSize, + ConfigWorldGen.boraxFrequencyMin, ConfigWorldGen.boraxFrequencyMax, ConfigWorldGen.boraxRarity, + ConfigWorldGen.boraxLayerMin, ConfigWorldGen.boraxLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreTungsten, Blocks.stone, ConfigWorldGen.wolframiteSize, + ConfigWorldGen.wolframiteFrequencyMin, ConfigWorldGen.wolframiteFrequencyMax, + ConfigWorldGen.wolframiteRarity, ConfigWorldGen.wolframiteLayerMin, ConfigWorldGen.wolframiteLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreCoalRich, Blocks.stone, ConfigWorldGen.coalSize, + ConfigWorldGen.coalFrequencyMin, ConfigWorldGen.coalFrequencyMax, ConfigWorldGen.coalRarity, + ConfigWorldGen.coalLayerMin, ConfigWorldGen.coalLayerMax); + + generateOre(seed, chunkX, chunkZ, world, BlockListMF.limestone, Blocks.stone, ConfigWorldGen.limestoneSize, + ConfigWorldGen.limestoneFrequencyMin, ConfigWorldGen.limestoneFrequencyMax, + ConfigWorldGen.limestoneRarity, ConfigWorldGen.limestoneLayerMin, ConfigWorldGen.limestoneLayerMax); } - + /** * Not used yet, allows a vein consisting of two block types */ - private static void generateDuelOre(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax, Block special, float chance) - { + private static void generateDuelOre(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, + int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax, Block special, + float chance) { int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if(seed.nextFloat() < rarity) - { - for(int count = 0; count < frequency; count ++) - { - int x = chunkX*16 + seed.nextInt(16); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ*16 + seed.nextInt(16); + int z = chunkZ * 16 + seed.nextInt(16); (new WorldGenDuelMinable(ore, size, special, chance)).generate(world, seed, x, y, z); } } } - private static void generateOre(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) - { + + private static void generateOre(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, int size, + int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) { int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if(seed.nextFloat() < rarity) - { - for(int count = 0; count < frequency; count ++) - { - int x = chunkX*16 + seed.nextInt(16); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ*16 + seed.nextInt(16); + int z = chunkZ * 16 + seed.nextInt(16); (new WorldGenMinable(ore, size, bed)).generate(world, seed, x, y, z); } } } - - private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, Material neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) - { + + private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, + Material neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, + int layerMax) { int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if(seed.nextFloat() < rarity) - { - for(int count = 0; count < frequency; count ++) - { - int x = chunkX*16 + seed.nextInt(16); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ*16 + seed.nextInt(16); - - if(isNeibourNear(world, x, y, z, neighbour)) - { - if((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) - { + int z = chunkZ * 16 + seed.nextInt(16); + + if (isNeibourNear(world, x, y, z, neighbour)) { + if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { } } } } } - private static void generateOreWithNeighbour2(Random seed, int chunkX, int chunkZ, World world, Block basic, float chance, Block special, Block bed, Block neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) - { + + private static void generateOreWithNeighbour2(Random seed, int chunkX, int chunkZ, World world, Block basic, + float chance, Block special, Block bed, Block neighbour, int size, int frequencyMin, int frequencyMax, + float rarity, int layerMin, int layerMax) { int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if(seed.nextFloat() < rarity) - { - for(int count = 0; count < frequency; count ++) - { - int x = chunkX*16 + seed.nextInt(16); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ*16 + seed.nextInt(16); - - if(isNeibourNear(world, x, y, z, neighbour)) - { + int z = chunkZ * 16 + seed.nextInt(16); + + if (isNeibourNear(world, x, y, z, neighbour)) { Block ore = (seed.nextFloat() <= chance ? special : basic); - if((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) - { + if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { } } } } } - private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, Block neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) - { + + private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, + Block neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) { int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if(seed.nextFloat() < rarity) - { - for(int count = 0; count < frequency; count ++) - { - int x = chunkX*16 + seed.nextInt(16); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ*16 + seed.nextInt(16); - - if(isNeibourNear(world, x, y, z, neighbour)) - { - if((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) - { + int z = chunkZ * 16 + seed.nextInt(16); + + if (isNeibourNear(world, x, y, z, neighbour)) { + if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { } } } } } - private static boolean isNeibourNear(World world, int x, int y, int z, Block neighbour) - { - return world.getBlock(x-1, y, z) == neighbour - || world.getBlock(+1, y, z) == neighbour - || world.getBlock(x, y-1, z) == neighbour - || world.getBlock(x, y+1, z) == neighbour - || world.getBlock(x, y, z-1) == neighbour - || world.getBlock(x, y, z+1) == neighbour; + + private static boolean isNeibourNear(World world, int x, int y, int z, Block neighbour) { + return world.getBlock(x - 1, y, z) == neighbour || world.getBlock(+1, y, z) == neighbour + || world.getBlock(x, y - 1, z) == neighbour || world.getBlock(x, y + 1, z) == neighbour + || world.getBlock(x, y, z - 1) == neighbour || world.getBlock(x, y, z + 1) == neighbour; } - private static boolean isNeibourNear(World world, int x, int y, int z, Material neighbour) - { - return world.getBlock(x-1, y, z).getMaterial() == neighbour - || world.getBlock(+1, y, z).getMaterial() == neighbour - || world.getBlock(x, y-1, z).getMaterial() == neighbour - || world.getBlock(x, y+1, z).getMaterial() == neighbour - || world.getBlock(x, y, z-1).getMaterial() == neighbour - || world.getBlock(x, y, z+1).getMaterial() == neighbour; + + private static boolean isNeibourNear(World world, int x, int y, int z, Material neighbour) { + return world.getBlock(x - 1, y, z).getMaterial() == neighbour + || world.getBlock(+1, y, z).getMaterial() == neighbour + || world.getBlock(x, y - 1, z).getMaterial() == neighbour + || world.getBlock(x, y + 1, z).getMaterial() == neighbour + || world.getBlock(x, y, z - 1).getMaterial() == neighbour + || world.getBlock(x, y, z + 1).getMaterial() == neighbour; } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFBase.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFBase.java index 7524dff7..c7735ffe 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFBase.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFBase.java @@ -1,24 +1,19 @@ package minefantasy.mf2.mechanics.worldGen; -import java.util.HashMap; import java.util.Random; -import minefantasy.mf2.util.MFLogUtil; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; +import cpw.mods.fml.common.IWorldGenerator; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkProvider; -import cpw.mods.fml.common.IWorldGenerator; -public class WorldGenMFBase implements IWorldGenerator -{ +public class WorldGenMFBase implements IWorldGenerator { @Override - public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) - { + public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, + IChunkProvider chunkProvider) { generate(random, chunkX, chunkZ, world, world.provider.dimensionId); } - public void generate(Random random, int chunkX, int chunkZ, World world, int dimension) - { + + public void generate(Random random, int chunkX, int chunkZ, World world, int dimension) { WorldGenGeological.generate(random, chunkX, chunkZ, world, dimension); WorldGenBiological.generate(random, chunkX, chunkZ, world, dimension); WorldGenStructures.generate(random, chunkX, chunkZ, world, dimension); diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java index 5d49be0e..baf24215 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java @@ -11,517 +11,448 @@ import net.minecraft.world.gen.feature.WorldGenAbstractTree; import net.minecraftforge.common.util.ForgeDirection; -public class WorldGenMFTree extends WorldGenAbstractTree -{ - /** - * Contains three sets of two values that provide complimentary indices for a given 'major' index - 1 and 2 for 0, 0 - * and 2 for 1, and 0 and 1 for 2. - */ - static final byte[] otherCoordPairs = new byte[] {(byte)2, (byte)0, (byte)0, (byte)1, (byte)2, (byte)1}; - /** random seed for GenBigTree */ - Random rand = new Random(); - /** Reference to the World object. */ - World worldObj; - int[] basePos = new int[] {0, 0, 0}; - int heightLimit; - int height; - double heightAttenuation = 0.618D; - double branchDensity = 1.0D; - double branchSlope = 0.381D; - double scaleWidth = 1.0D; - double leafDensity = 1.0D; - /** Currently always 1, can be set to 2 in the class constructor to generate a double-sized tree trunk for big trees. */ - int trunkSize = 1; - /** Sets the limit of the random value used to initialize the height limit. */ - int heightLimitLimit = 12; - /** Sets the distance limit for how far away the generator will populate leaves from the base leaf node. */ - int leafDistanceLimit = 4; - /** Contains a list of a points at which to generate groups of leaves. */ - int[][] leafNodes; - private final Block log, leaves; - private int leafMeta = 0; - - public WorldGenMFTree(boolean update, Block log, Block leaves) - { - super(update); - this.log = log; - this.leaves = leaves; - if(log == BlockListMF.log_ironbark) - { - leafDistanceLimit = 2; - } - heightLimitLimit = log == BlockListMF.log_ebony ? 10 : 8; - } - public WorldGenMFTree setSaplingGrown() - { - leafMeta = 1; - return this; - } - public WorldGenMFTree setLimits(int height, int leaf) - { - heightLimitLimit = height; - leafDistanceLimit = leaf; - return this; - } - - /** - * Generates a list of leaf nodes for the tree, to be populated by generateLeaves. - */ - void generateLeafNodeList() - { - this.height = (int)((double)this.heightLimit * this.heightAttenuation); - - if (this.height >= this.heightLimit) - { - this.height = this.heightLimit - 1; - } - - int i = (int)(1.382D + Math.pow(this.leafDensity * (double)this.heightLimit / 13.0D, 2.0D)); - - if (i < 1) - { - i = 1; - } - - int[][] aint = new int[i * this.heightLimit][4]; - int j = this.basePos[1] + this.heightLimit - this.leafDistanceLimit; - int k = 1; - int l = this.basePos[1] + this.height; - int i1 = j - this.basePos[1]; - aint[0][0] = this.basePos[0]; - aint[0][1] = j; - aint[0][2] = this.basePos[2]; - aint[0][3] = l; - --j; - - while (i1 >= 0) - { - int j1 = 0; - float f = this.layerSize(i1); - - if (f < 0.0F) - { - --j; - --i1; - } - else - { - for (double d0 = 0.5D; j1 < i; ++j1) - { - double d1 = this.scaleWidth * (double)f * ((double)this.rand.nextFloat() + 0.328D); - double d2 = (double)this.rand.nextFloat() * 2.0D * Math.PI; - int k1 = MathHelper.floor_double(d1 * Math.sin(d2) + (double)this.basePos[0] + d0); - int l1 = MathHelper.floor_double(d1 * Math.cos(d2) + (double)this.basePos[2] + d0); - int[] aint1 = new int[] {k1, j, l1}; - int[] aint2 = new int[] {k1, j + this.leafDistanceLimit, l1}; - - if (this.checkBlockLine(aint1, aint2) == -1) - { - int[] aint3 = new int[] {this.basePos[0], this.basePos[1], this.basePos[2]}; - double d3 = Math.sqrt(Math.pow((double)Math.abs(this.basePos[0] - aint1[0]), 2.0D) + Math.pow((double)Math.abs(this.basePos[2] - aint1[2]), 2.0D)); - double d4 = d3 * this.branchSlope; - - if ((double)aint1[1] - d4 > (double)l) - { - aint3[1] = l; - } - else - { - aint3[1] = (int)((double)aint1[1] - d4); - } - - if (this.checkBlockLine(aint3, aint1) == -1) - { - aint[k][0] = k1; - aint[k][1] = j; - aint[k][2] = l1; - aint[k][3] = aint3[1]; - ++k; - } - } - } - - --j; - --i1; - } - } - - this.leafNodes = new int[k][4]; - System.arraycopy(aint, 0, this.leafNodes, 0, k); - } - - void generateLeaf(int x, int y, int z, float f, byte b, Block block) - { - int l = (int)((double)f + 0.618D); - byte b1 = otherCoordPairs[b]; - byte b2 = otherCoordPairs[b + 3]; - int[] aint = new int[] {x, y, z}; - int[] aint1 = new int[] {0, 0, 0}; - int i1 = -l; - int j1 = -l; - - for (aint1[b] = aint[b]; i1 <= l; ++i1) - { - aint1[b1] = aint[b1] + i1; - j1 = -l; - - while (j1 <= l) - { - double d0 = Math.pow((double)Math.abs(i1) + 0.5D, 2.0D) + Math.pow((double)Math.abs(j1) + 0.5D, 2.0D); - - if (d0 > (double)(f * f)) - { - ++j1; - } - else - { - aint1[b2] = aint[b2] + j1; - Block block1 = this.worldObj.getBlock(aint1[0], aint1[1], aint1[2]); - - if (!block1.isAir(worldObj, aint1[0], aint1[1], aint1[2]) && !block1.isLeaves(worldObj, aint1[0], aint1[1], aint1[2])) - { - ++j1; - } - else - { - this.setBlockAndNotifyAdequately(this.worldObj, aint1[0], aint1[1], aint1[2], block, leafMeta); - ++j1; - } - } - } - } - } - - /** - * Gets the rough size of a layer of the tree. - */ - float layerSize(int layer) - { - if ((double)layer < (double)((float)this.heightLimit) * 0.3D) - { - return -1.618F; - } - else - { - float f = (float)this.heightLimit / 2.0F; - float f1 = (float)this.heightLimit / 2.0F - (float)layer; - float f2; - - if (f1 == 0.0F) - { - f2 = f; - } - else if (Math.abs(f1) >= f) - { - f2 = 0.0F; - } - else - { - f2 = (float)Math.sqrt(Math.pow((double)Math.abs(f), 2.0D) - Math.pow((double)Math.abs(f1), 2.0D)); - } - - f2 *= 0.5F; - return f2; - } - } - - float leafSize(int layer) - { - return layer >= 0 && layer < this.leafDistanceLimit ? (layer != 0 && layer != this.leafDistanceLimit - 1 ? 3.0F : 2.0F) : -1.0F; - } - - /** - * Generates the leaves surrounding an individual entry in the leafNodes list. - */ - void generateLeafNode(int x, int y, int z) - { - int l = y; - - for (int i1 = y + this.leafDistanceLimit; l < i1; ++l) - { - float f = this.leafSize(l - y); - this.generateLeaf(x, l, z, f, (byte)1, this.leaves); - } - } - - void func_150530_a(int[] x, int[] y, Block block) - { - int[] aint2 = new int[] {0, 0, 0}; - byte b0 = 0; - byte b1; - - for (b1 = 0; b0 < 3; ++b0) - { - aint2[b0] = y[b0] - x[b0]; - - if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) - { - b1 = b0; - } - } - - if (aint2[b1] != 0) - { - byte b2 = otherCoordPairs[b1]; - byte b3 = otherCoordPairs[b1 + 3]; - byte b4; - - if (aint2[b1] > 0) - { - b4 = 1; - } - else - { - b4 = -1; - } - - double d0 = (double)aint2[b2] / (double)aint2[b1]; - double d1 = (double)aint2[b3] / (double)aint2[b1]; - int[] aint3 = new int[] {0, 0, 0}; - int i = 0; - - for (int j = aint2[b1] + b4; i != j; i += b4) - { - aint3[b1] = MathHelper.floor_double((double)(x[b1] + i) + 0.5D); - aint3[b2] = MathHelper.floor_double((double)x[b2] + (double)i * d0 + 0.5D); - aint3[b3] = MathHelper.floor_double((double)x[b3] + (double)i * d1 + 0.5D); - byte b5 = 0; - int k = Math.abs(aint3[0] - x[0]); - int l = Math.abs(aint3[2] - x[2]); - int i1 = Math.max(k, l); - - if (i1 > 0) - { - if (k == i1) - { - b5 = 4; - } - else if (l == i1) - { - b5 = 8; - } - } - - this.setBlockAndNotifyAdequately(this.worldObj, aint3[0], aint3[1], aint3[2], block, b5); - } - } - } - - /** - * Generates the leaf portion of the tree as specified by the leafNodes list. - */ - void generateLeaves() - { - int i = 0; - - for (int j = this.leafNodes.length; i < j; ++i) - { - int k = this.leafNodes[i][0]; - int l = this.leafNodes[i][1]; - int i1 = this.leafNodes[i][2]; - this.generateLeafNode(k, l, i1); - } - } - - /** - * Indicates whether or not a leaf node requires additional wood to be added to preserve integrity. - */ - boolean leafNodeNeedsBase(int p_76493_1_) - { - return (double)p_76493_1_ >= (double)this.heightLimit * 0.2D; - } - - /** - * Places the trunk for the big tree that is being generated. Able to generate double-sized trunks by changing a - * field that is always 1 to 2. - */ - void generateTrunk() - { - int i = this.basePos[0]; - int j = this.basePos[1]; - int k = this.basePos[1] + this.height; - int l = this.basePos[2]; - int[] aint = new int[] {i, j, l}; - int[] aint1 = new int[] {i, k, l}; - this.func_150530_a(aint, aint1, this.log); - - if (this.trunkSize == 2) - { - ++aint[0]; - ++aint1[0]; - this.func_150530_a(aint, aint1, this.log); - ++aint[2]; - ++aint1[2]; - this.func_150530_a(aint, aint1, this.log); - aint[0] += -1; - aint1[0] += -1; - this.func_150530_a(aint, aint1, this.log); - } - } - - /** - * Generates additional wood blocks to fill out the bases of different leaf nodes that would otherwise degrade. - */ - void generateLeafNodeBases() - { - int i = 0; - int j = this.leafNodes.length; - - for (int[] aint = new int[] {this.basePos[0], this.basePos[1], this.basePos[2]}; i < j; ++i) - { - int[] aint1 = this.leafNodes[i]; - int[] aint2 = new int[] {aint1[0], aint1[1], aint1[2]}; - aint[1] = aint1[3]; - int k = aint[1] - this.basePos[1]; - - if (this.leafNodeNeedsBase(k)) - { - this.func_150530_a(aint, aint2, this.log); - } - } - } - - /** - * Checks a line of blocks in the world from the first coordinate to triplet to the second, returning the distance - * (in blocks) before a non-air, non-leaf block is encountered and/or the end is encountered. - */ - int checkBlockLine(int[] p_76496_1_, int[] p_76496_2_) - { - int[] aint2 = new int[] {0, 0, 0}; - byte b0 = 0; - byte b1; - - for (b1 = 0; b0 < 3; ++b0) - { - aint2[b0] = p_76496_2_[b0] - p_76496_1_[b0]; - - if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) - { - b1 = b0; - } - } - - if (aint2[b1] == 0) - { - return -1; - } - else - { - byte b2 = otherCoordPairs[b1]; - byte b3 = otherCoordPairs[b1 + 3]; - byte b4; - - if (aint2[b1] > 0) - { - b4 = 1; - } - else - { - b4 = -1; - } - - double d0 = (double)aint2[b2] / (double)aint2[b1]; - double d1 = (double)aint2[b3] / (double)aint2[b1]; - int[] aint3 = new int[] {0, 0, 0}; - int i = 0; - int j; - - for (j = aint2[b1] + b4; i != j; i += b4) - { - aint3[b1] = p_76496_1_[b1] + i; - aint3[b2] = MathHelper.floor_double((double)p_76496_1_[b2] + (double)i * d0); - aint3[b3] = MathHelper.floor_double((double)p_76496_1_[b3] + (double)i * d1); - Block block = this.worldObj.getBlock(aint3[0], aint3[1], aint3[2]); - - if (!this.isReplaceable(worldObj, aint3[0], aint3[1], aint3[2])) - { - break; - } - } - - return i == j ? -1 : Math.abs(i); - } - } - - /** - * Returns a boolean indicating whether or not the current location for the tree, spanning basePos to to the height - * limit, is valid. - */ - boolean validTreeLocation() - { - int[] aint = new int[] {this.basePos[0], this.basePos[1], this.basePos[2]}; - int[] aint1 = new int[] {this.basePos[0], this.basePos[1] + this.heightLimit - 1, this.basePos[2]}; - Block block = this.worldObj.getBlock(this.basePos[0], this.basePos[1] - 1, this.basePos[2]); - - boolean isSoil = block.canSustainPlant(worldObj, basePos[0], basePos[1] - 1, basePos[2], ForgeDirection.UP, (BlockSapling)Blocks.sapling); - if (!isSoil) - { - return false; - } - else - { - int i = this.checkBlockLine(aint, aint1); - - if (i == -1) - { - return true; - } - else if (i < 6) - { - return false; - } - else - { - this.heightLimit = i; - return true; - } - } - } - - /** - * Rescales the generator settings, only used in WorldGenBigTree - */ - public void setScale(double p_76487_1_, double p_76487_3_, double p_76487_5_) - { - this.heightLimitLimit = (int)(p_76487_1_ * 12.0D); - - if (p_76487_1_ > 0.5D) - { - this.leafDistanceLimit = 5; - } - - this.scaleWidth = p_76487_3_; - this.leafDensity = p_76487_5_; - } - - public boolean generate(World world, Random rand, int x, int y, int z) - { - this.worldObj = world; - long l = rand.nextLong(); - this.rand.setSeed(l); - this.basePos[0] = x; - this.basePos[1] = y; - this.basePos[2] = z; - - if (this.heightLimit == 0) - { - this.heightLimit = 5 + this.rand.nextInt(this.heightLimitLimit); - } - - if (!this.validTreeLocation()) - { - this.worldObj = null; //Fix vanilla Mem leak, holds latest world - return false; - } - else - { - this.generateLeafNodeList(); - this.generateLeaves(); - this.generateTrunk(); - this.generateLeafNodeBases(); - worldObj.setBlock(x, y, z, log, 15, 2); - this.worldObj = null; //Fix vanilla Mem leak, holds latest world - return true; - } - } +public class WorldGenMFTree extends WorldGenAbstractTree { + /** + * Contains three sets of two values that provide complimentary indices for a + * given 'major' index - 1 and 2 for 0, 0 and 2 for 1, and 0 and 1 for 2. + */ + static final byte[] otherCoordPairs = new byte[] { (byte) 2, (byte) 0, (byte) 0, (byte) 1, (byte) 2, (byte) 1 }; + /** random seed for GenBigTree */ + Random rand = new Random(); + /** Reference to the World object. */ + World worldObj; + int[] basePos = new int[] { 0, 0, 0 }; + int heightLimit; + int height; + double heightAttenuation = 0.618D; + double branchDensity = 1.0D; + double branchSlope = 0.381D; + double scaleWidth = 1.0D; + double leafDensity = 1.0D; + /** + * Currently always 1, can be set to 2 in the class constructor to generate a + * double-sized tree trunk for big trees. + */ + int trunkSize = 1; + /** Sets the limit of the random value used to initialize the height limit. */ + int heightLimitLimit = 12; + /** + * Sets the distance limit for how far away the generator will populate leaves + * from the base leaf node. + */ + int leafDistanceLimit = 4; + /** Contains a list of a points at which to generate groups of leaves. */ + int[][] leafNodes; + private final Block log, leaves; + private int leafMeta = 0; + + public WorldGenMFTree(boolean update, Block log, Block leaves) { + super(update); + this.log = log; + this.leaves = leaves; + if (log == BlockListMF.log_ironbark) { + leafDistanceLimit = 2; + } + heightLimitLimit = log == BlockListMF.log_ebony ? 10 : 8; + } + + public WorldGenMFTree setSaplingGrown() { + leafMeta = 1; + return this; + } + + public WorldGenMFTree setLimits(int height, int leaf) { + heightLimitLimit = height; + leafDistanceLimit = leaf; + return this; + } + + /** + * Generates a list of leaf nodes for the tree, to be populated by + * generateLeaves. + */ + void generateLeafNodeList() { + this.height = (int) (this.heightLimit * this.heightAttenuation); + + if (this.height >= this.heightLimit) { + this.height = this.heightLimit - 1; + } + + int i = (int) (1.382D + Math.pow(this.leafDensity * this.heightLimit / 13.0D, 2.0D)); + + if (i < 1) { + i = 1; + } + + int[][] aint = new int[i * this.heightLimit][4]; + int j = this.basePos[1] + this.heightLimit - this.leafDistanceLimit; + int k = 1; + int l = this.basePos[1] + this.height; + int i1 = j - this.basePos[1]; + aint[0][0] = this.basePos[0]; + aint[0][1] = j; + aint[0][2] = this.basePos[2]; + aint[0][3] = l; + --j; + + while (i1 >= 0) { + int j1 = 0; + float f = this.layerSize(i1); + + if (f < 0.0F) { + --j; + --i1; + } else { + for (double d0 = 0.5D; j1 < i; ++j1) { + double d1 = this.scaleWidth * f * (this.rand.nextFloat() + 0.328D); + double d2 = this.rand.nextFloat() * 2.0D * Math.PI; + int k1 = MathHelper.floor_double(d1 * Math.sin(d2) + this.basePos[0] + d0); + int l1 = MathHelper.floor_double(d1 * Math.cos(d2) + this.basePos[2] + d0); + int[] aint1 = new int[] { k1, j, l1 }; + int[] aint2 = new int[] { k1, j + this.leafDistanceLimit, l1 }; + + if (this.checkBlockLine(aint1, aint2) == -1) { + int[] aint3 = new int[] { this.basePos[0], this.basePos[1], this.basePos[2] }; + double d3 = Math.sqrt(Math.pow(Math.abs(this.basePos[0] - aint1[0]), 2.0D) + + Math.pow(Math.abs(this.basePos[2] - aint1[2]), 2.0D)); + double d4 = d3 * this.branchSlope; + + if (aint1[1] - d4 > l) { + aint3[1] = l; + } else { + aint3[1] = (int) (aint1[1] - d4); + } + + if (this.checkBlockLine(aint3, aint1) == -1) { + aint[k][0] = k1; + aint[k][1] = j; + aint[k][2] = l1; + aint[k][3] = aint3[1]; + ++k; + } + } + } + + --j; + --i1; + } + } + + this.leafNodes = new int[k][4]; + System.arraycopy(aint, 0, this.leafNodes, 0, k); + } + + void generateLeaf(int x, int y, int z, float f, byte b, Block block) { + int l = (int) (f + 0.618D); + byte b1 = otherCoordPairs[b]; + byte b2 = otherCoordPairs[b + 3]; + int[] aint = new int[] { x, y, z }; + int[] aint1 = new int[] { 0, 0, 0 }; + int i1 = -l; + int j1 = -l; + + for (aint1[b] = aint[b]; i1 <= l; ++i1) { + aint1[b1] = aint[b1] + i1; + j1 = -l; + + while (j1 <= l) { + double d0 = Math.pow(Math.abs(i1) + 0.5D, 2.0D) + Math.pow(Math.abs(j1) + 0.5D, 2.0D); + + if (d0 > f * f) { + ++j1; + } else { + aint1[b2] = aint[b2] + j1; + Block block1 = this.worldObj.getBlock(aint1[0], aint1[1], aint1[2]); + + if (!block1.isAir(worldObj, aint1[0], aint1[1], aint1[2]) + && !block1.isLeaves(worldObj, aint1[0], aint1[1], aint1[2])) { + ++j1; + } else { + this.setBlockAndNotifyAdequately(this.worldObj, aint1[0], aint1[1], aint1[2], block, leafMeta); + ++j1; + } + } + } + } + } + + /** + * Gets the rough size of a layer of the tree. + */ + float layerSize(int layer) { + if (layer < (this.heightLimit) * 0.3D) { + return -1.618F; + } else { + float f = this.heightLimit / 2.0F; + float f1 = this.heightLimit / 2.0F - layer; + float f2; + + if (f1 == 0.0F) { + f2 = f; + } else if (Math.abs(f1) >= f) { + f2 = 0.0F; + } else { + f2 = (float) Math.sqrt(Math.pow(Math.abs(f), 2.0D) - Math.pow(Math.abs(f1), 2.0D)); + } + + f2 *= 0.5F; + return f2; + } + } + + float leafSize(int layer) { + return layer >= 0 && layer < this.leafDistanceLimit + ? (layer != 0 && layer != this.leafDistanceLimit - 1 ? 3.0F : 2.0F) + : -1.0F; + } + + /** + * Generates the leaves surrounding an individual entry in the leafNodes list. + */ + void generateLeafNode(int x, int y, int z) { + int l = y; + + for (int i1 = y + this.leafDistanceLimit; l < i1; ++l) { + float f = this.leafSize(l - y); + this.generateLeaf(x, l, z, f, (byte) 1, this.leaves); + } + } + + void func_150530_a(int[] x, int[] y, Block block) { + int[] aint2 = new int[] { 0, 0, 0 }; + byte b0 = 0; + byte b1; + + for (b1 = 0; b0 < 3; ++b0) { + aint2[b0] = y[b0] - x[b0]; + + if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) { + b1 = b0; + } + } + + if (aint2[b1] != 0) { + byte b2 = otherCoordPairs[b1]; + byte b3 = otherCoordPairs[b1 + 3]; + byte b4; + + if (aint2[b1] > 0) { + b4 = 1; + } else { + b4 = -1; + } + + double d0 = (double) aint2[b2] / (double) aint2[b1]; + double d1 = (double) aint2[b3] / (double) aint2[b1]; + int[] aint3 = new int[] { 0, 0, 0 }; + int i = 0; + + for (int j = aint2[b1] + b4; i != j; i += b4) { + aint3[b1] = MathHelper.floor_double(x[b1] + i + 0.5D); + aint3[b2] = MathHelper.floor_double(x[b2] + i * d0 + 0.5D); + aint3[b3] = MathHelper.floor_double(x[b3] + i * d1 + 0.5D); + byte b5 = 0; + int k = Math.abs(aint3[0] - x[0]); + int l = Math.abs(aint3[2] - x[2]); + int i1 = Math.max(k, l); + + if (i1 > 0) { + if (k == i1) { + b5 = 4; + } else if (l == i1) { + b5 = 8; + } + } + + this.setBlockAndNotifyAdequately(this.worldObj, aint3[0], aint3[1], aint3[2], block, b5); + } + } + } + + /** + * Generates the leaf portion of the tree as specified by the leafNodes list. + */ + void generateLeaves() { + int i = 0; + + for (int j = this.leafNodes.length; i < j; ++i) { + int k = this.leafNodes[i][0]; + int l = this.leafNodes[i][1]; + int i1 = this.leafNodes[i][2]; + this.generateLeafNode(k, l, i1); + } + } + + /** + * Indicates whether or not a leaf node requires additional wood to be added to + * preserve integrity. + */ + boolean leafNodeNeedsBase(int p_76493_1_) { + return p_76493_1_ >= this.heightLimit * 0.2D; + } + + /** + * Places the trunk for the big tree that is being generated. Able to generate + * double-sized trunks by changing a field that is always 1 to 2. + */ + void generateTrunk() { + int i = this.basePos[0]; + int j = this.basePos[1]; + int k = this.basePos[1] + this.height; + int l = this.basePos[2]; + int[] aint = new int[] { i, j, l }; + int[] aint1 = new int[] { i, k, l }; + this.func_150530_a(aint, aint1, this.log); + + if (this.trunkSize == 2) { + ++aint[0]; + ++aint1[0]; + this.func_150530_a(aint, aint1, this.log); + ++aint[2]; + ++aint1[2]; + this.func_150530_a(aint, aint1, this.log); + aint[0] += -1; + aint1[0] += -1; + this.func_150530_a(aint, aint1, this.log); + } + } + + /** + * Generates additional wood blocks to fill out the bases of different leaf + * nodes that would otherwise degrade. + */ + void generateLeafNodeBases() { + int i = 0; + int j = this.leafNodes.length; + + for (int[] aint = new int[] { this.basePos[0], this.basePos[1], this.basePos[2] }; i < j; ++i) { + int[] aint1 = this.leafNodes[i]; + int[] aint2 = new int[] { aint1[0], aint1[1], aint1[2] }; + aint[1] = aint1[3]; + int k = aint[1] - this.basePos[1]; + + if (this.leafNodeNeedsBase(k)) { + this.func_150530_a(aint, aint2, this.log); + } + } + } + + /** + * Checks a line of blocks in the world from the first coordinate to triplet to + * the second, returning the distance (in blocks) before a non-air, non-leaf + * block is encountered and/or the end is encountered. + */ + int checkBlockLine(int[] p_76496_1_, int[] p_76496_2_) { + int[] aint2 = new int[] { 0, 0, 0 }; + byte b0 = 0; + byte b1; + + for (b1 = 0; b0 < 3; ++b0) { + aint2[b0] = p_76496_2_[b0] - p_76496_1_[b0]; + + if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) { + b1 = b0; + } + } + + if (aint2[b1] == 0) { + return -1; + } else { + byte b2 = otherCoordPairs[b1]; + byte b3 = otherCoordPairs[b1 + 3]; + byte b4; + + if (aint2[b1] > 0) { + b4 = 1; + } else { + b4 = -1; + } + + double d0 = (double) aint2[b2] / (double) aint2[b1]; + double d1 = (double) aint2[b3] / (double) aint2[b1]; + int[] aint3 = new int[] { 0, 0, 0 }; + int i = 0; + int j; + + for (j = aint2[b1] + b4; i != j; i += b4) { + aint3[b1] = p_76496_1_[b1] + i; + aint3[b2] = MathHelper.floor_double(p_76496_1_[b2] + i * d0); + aint3[b3] = MathHelper.floor_double(p_76496_1_[b3] + i * d1); + Block block = this.worldObj.getBlock(aint3[0], aint3[1], aint3[2]); + + if (!this.isReplaceable(worldObj, aint3[0], aint3[1], aint3[2])) { + break; + } + } + + return i == j ? -1 : Math.abs(i); + } + } + + /** + * Returns a boolean indicating whether or not the current location for the + * tree, spanning basePos to to the height limit, is valid. + */ + boolean validTreeLocation() { + int[] aint = new int[] { this.basePos[0], this.basePos[1], this.basePos[2] }; + int[] aint1 = new int[] { this.basePos[0], this.basePos[1] + this.heightLimit - 1, this.basePos[2] }; + Block block = this.worldObj.getBlock(this.basePos[0], this.basePos[1] - 1, this.basePos[2]); + + boolean isSoil = block.canSustainPlant(worldObj, basePos[0], basePos[1] - 1, basePos[2], ForgeDirection.UP, + (BlockSapling) Blocks.sapling); + if (!isSoil) { + return false; + } else { + int i = this.checkBlockLine(aint, aint1); + + if (i == -1) { + return true; + } else if (i < 6) { + return false; + } else { + this.heightLimit = i; + return true; + } + } + } + + /** + * Rescales the generator settings, only used in WorldGenBigTree + */ + public void setScale(double p_76487_1_, double p_76487_3_, double p_76487_5_) { + this.heightLimitLimit = (int) (p_76487_1_ * 12.0D); + + if (p_76487_1_ > 0.5D) { + this.leafDistanceLimit = 5; + } + + this.scaleWidth = p_76487_3_; + this.leafDensity = p_76487_5_; + } + + public boolean generate(World world, Random rand, int x, int y, int z) { + this.worldObj = world; + long l = rand.nextLong(); + this.rand.setSeed(l); + this.basePos[0] = x; + this.basePos[1] = y; + this.basePos[2] = z; + + if (this.heightLimit == 0) { + this.heightLimit = 5 + this.rand.nextInt(this.heightLimitLimit); + } + + if (!this.validTreeLocation()) { + this.worldObj = null; // Fix vanilla Mem leak, holds latest world + return false; + } else { + this.generateLeafNodeList(); + this.generateLeaves(); + this.generateTrunk(); + this.generateLeafNodeBases(); + worldObj.setBlock(x, y, z, log, 15, 2); + this.worldObj = null; // Fix vanilla Mem leak, holds latest world + return true; + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMinableMF.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMinableMF.java index e9f166ba..bafd69a5 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMinableMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMinableMF.java @@ -8,89 +8,78 @@ import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; -public class WorldGenMinableMF extends WorldGenerator -{ - private Block oreBlock; - /** The number of blocks to generate. */ - private int numberOfBlocks; - private Block beddingBlock; - private static final String __OBFID = "CL_00000426"; - private int mineableBlockMeta; +public class WorldGenMinableMF extends WorldGenerator { + private Block oreBlock; + /** The number of blocks to generate. */ + private int numberOfBlocks; + private Block beddingBlock; + private static final String __OBFID = "CL_00000426"; + private int mineableBlockMeta; - public WorldGenMinableMF(Block ore, int size) - { - this(ore, size, Blocks.stone); - } + public WorldGenMinableMF(Block ore, int size) { + this(ore, size, Blocks.stone); + } - public WorldGenMinableMF(Block ore, int size, Block bed) - { - this.oreBlock = ore; - this.numberOfBlocks = size; - this.beddingBlock = bed; - } + public WorldGenMinableMF(Block ore, int size, Block bed) { + this.oreBlock = ore; + this.numberOfBlocks = size; + this.beddingBlock = bed; + } - public WorldGenMinableMF(Block block, int meta, int number, Block target) - { - this(block, number, target); - this.mineableBlockMeta = meta; - } + public WorldGenMinableMF(Block block, int meta, int number, Block target) { + this(block, number, target); + this.mineableBlockMeta = meta; + } - @Override - public boolean generate(World world, Random seed, int x, int y, int z) - { - boolean success = false; - - float f = seed.nextFloat() * (float)Math.PI; - double d0 = x + 8 + MathHelper.sin(f) * this.numberOfBlocks / 8.0F; - double d1 = x + 8 - MathHelper.sin(f) * this.numberOfBlocks / 8.0F; - double d2 = z + 8 + MathHelper.cos(f) * this.numberOfBlocks / 8.0F; - double d3 = z + 8 - MathHelper.cos(f) * this.numberOfBlocks / 8.0F; - double d4 = y + seed.nextInt(3) - 2; - double d5 = y + seed.nextInt(3) - 2; + @Override + public boolean generate(World world, Random seed, int x, int y, int z) { + boolean success = false; - for (int l = 0; l <= this.numberOfBlocks; ++l) - { - double d6 = d0 + (d1 - d0) * l / this.numberOfBlocks; - double d7 = d4 + (d5 - d4) * l / this.numberOfBlocks; - double d8 = d2 + (d3 - d2) * l / this.numberOfBlocks; - double d9 = seed.nextDouble() * this.numberOfBlocks / 16.0D; - double d10 = (MathHelper.sin(l * (float)Math.PI / this.numberOfBlocks) + 1.0F) * d9 + 1.0D; - double d11 = (MathHelper.sin(l * (float)Math.PI / this.numberOfBlocks) + 1.0F) * d9 + 1.0D; - int i1 = MathHelper.floor_double(d6 - d10 / 2.0D); - int j1 = MathHelper.floor_double(d7 - d11 / 2.0D); - int k1 = MathHelper.floor_double(d8 - d10 / 2.0D); - int l1 = MathHelper.floor_double(d6 + d10 / 2.0D); - int i2 = MathHelper.floor_double(d7 + d11 / 2.0D); - int j2 = MathHelper.floor_double(d8 + d10 / 2.0D); + float f = seed.nextFloat() * (float) Math.PI; + double d0 = x + 8 + MathHelper.sin(f) * this.numberOfBlocks / 8.0F; + double d1 = x + 8 - MathHelper.sin(f) * this.numberOfBlocks / 8.0F; + double d2 = z + 8 + MathHelper.cos(f) * this.numberOfBlocks / 8.0F; + double d3 = z + 8 - MathHelper.cos(f) * this.numberOfBlocks / 8.0F; + double d4 = y + seed.nextInt(3) - 2; + double d5 = y + seed.nextInt(3) - 2; - for (int oreX = i1; oreX <= l1; ++oreX) - { - double d12 = (oreX + 0.5D - d6) / (d10 / 2.0D); + for (int l = 0; l <= this.numberOfBlocks; ++l) { + double d6 = d0 + (d1 - d0) * l / this.numberOfBlocks; + double d7 = d4 + (d5 - d4) * l / this.numberOfBlocks; + double d8 = d2 + (d3 - d2) * l / this.numberOfBlocks; + double d9 = seed.nextDouble() * this.numberOfBlocks / 16.0D; + double d10 = (MathHelper.sin(l * (float) Math.PI / this.numberOfBlocks) + 1.0F) * d9 + 1.0D; + double d11 = (MathHelper.sin(l * (float) Math.PI / this.numberOfBlocks) + 1.0F) * d9 + 1.0D; + int i1 = MathHelper.floor_double(d6 - d10 / 2.0D); + int j1 = MathHelper.floor_double(d7 - d11 / 2.0D); + int k1 = MathHelper.floor_double(d8 - d10 / 2.0D); + int l1 = MathHelper.floor_double(d6 + d10 / 2.0D); + int i2 = MathHelper.floor_double(d7 + d11 / 2.0D); + int j2 = MathHelper.floor_double(d8 + d10 / 2.0D); - if (d12 * d12 < 1.0D) - { - for (int oreY = j1; oreY <= i2; ++oreY) - { - double d13 = (oreY + 0.5D - d7) / (d11 / 2.0D); + for (int oreX = i1; oreX <= l1; ++oreX) { + double d12 = (oreX + 0.5D - d6) / (d10 / 2.0D); - if (d12 * d12 + d13 * d13 < 1.0D) - { - for (int oreZ = k1; oreZ <= j2; ++oreZ) - { - double d14 = (oreZ + 0.5D - d8) / (d10 / 2.0D); + if (d12 * d12 < 1.0D) { + for (int oreY = j1; oreY <= i2; ++oreY) { + double d13 = (oreY + 0.5D - d7) / (d11 / 2.0D); - if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0D && world.getBlock(oreX, oreY, oreZ).isReplaceableOreGen(world, oreX, oreY, oreZ, beddingBlock)) - { - success = true; - world.setBlock(oreX, oreY, oreZ, this.oreBlock, mineableBlockMeta, 2); - } - } - } - } - } - } - } + if (d12 * d12 + d13 * d13 < 1.0D) { + for (int oreZ = k1; oreZ <= j2; ++oreZ) { + double d14 = (oreZ + 0.5D - d8) / (d10 / 2.0D); - return success; - } + if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0D && world.getBlock(oreX, oreY, oreZ) + .isReplaceableOreGen(world, oreX, oreY, oreZ, beddingBlock)) { + success = true; + world.setBlock(oreX, oreY, oreZ, this.oreBlock, mineableBlockMeta, 2); + } + } + } + } + } + } + } + + return success; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenStructures.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenStructures.java index 471a9b9a..f81a778f 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenStructures.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenStructures.java @@ -10,88 +10,73 @@ import net.minecraft.init.Blocks; import net.minecraft.world.World; -public class WorldGenStructures -{ - public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) - { +public class WorldGenStructures { + public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) { ++chunkCount; - if(dimension == 0) - { - if(seed.nextFloat() < ConfigWorldGen.MFChance) - { + if (dimension == 0) { + if (seed.nextFloat() < ConfigWorldGen.MFChance) { generateAncientForge(seed, chunkX, chunkZ, world); } - if(seed.nextFloat() < ConfigWorldGen.MAChance) - { + if (seed.nextFloat() < ConfigWorldGen.MAChance) { generateAncientAlter(seed, chunkX, chunkZ, world); } - if(confineToGrid(chunkX, chunkZ, ConfigWorldGen.DSGrid)) - { - if(seed.nextFloat() < ConfigWorldGen.DSChance) - { + if (confineToGrid(chunkX, chunkZ, ConfigWorldGen.DSGrid)) { + if (seed.nextFloat() < ConfigWorldGen.DSChance) { generateDwarvenStronghold(seed, chunkX, chunkZ, world); - } - else - { - //placeGridBeacon(world, chunkX, chunkZ); + } else { + // placeGridBeacon(world, chunkX, chunkZ); } } } } + /** * Used in testing to determine the potential areas for dwarven entries */ - private static void placeGridBeacon(World world, int chunkX, int chunkZ) - { - int x = (16*chunkX); - int z = (16*chunkZ); - int y = world.getTopSolidOrLiquidBlock(x, z)+1; - for(int x1 = 0; x1 < 3; x1 ++) - { - for(int z1 = 0; z1 < 3; z1 ++) - { - world.setBlock(x+x1, y, z+z1, (x == 0 && z == 0) ? Blocks.gold_block : Blocks.iron_block); + private static void placeGridBeacon(World world, int chunkX, int chunkZ) { + int x = (16 * chunkX); + int z = (16 * chunkZ); + int y = world.getTopSolidOrLiquidBlock(x, z) + 1; + for (int x1 = 0; x1 < 3; x1++) { + for (int z1 = 0; z1 < 3; z1++) { + world.setBlock(x + x1, y, z + z1, (x == 0 && z == 0) ? Blocks.gold_block : Blocks.iron_block); } } - world.setBlock(x+1, y+1, z+1, Blocks.beacon); + world.setBlock(x + 1, y + 1, z + 1, Blocks.beacon); } - private static boolean confineToGrid( int chunkX, int chunkZ, int chunkSize) - { + + private static boolean confineToGrid(int chunkX, int chunkZ, int chunkSize) { return chunkX % chunkSize == 0 && chunkZ % chunkSize == 0; } - private static void generateAncientForge(Random seed, int chunkX, int chunkZ, World world) - { - int x = (16*chunkX); - int z = (16*chunkZ); + + private static void generateAncientForge(Random seed, int chunkX, int chunkZ, World world) { + int x = (16 * chunkX); + int z = (16 * chunkZ); WorldGenAncientForge forge = new WorldGenAncientForge(); - for(int x1 = 0; x1 < 16; x1++) - { - for(int z1 = 0; z1 < 16; z1++) - { - if(forge.generate(world, seed, x+x1, 0, z+z1)) - { - MFLogUtil.logDebug("Placed Ancient Forge at " + x+x1 + " " + z+z1); + for (int x1 = 0; x1 < 16; x1++) { + for (int z1 = 0; z1 < 16; z1++) { + if (forge.generate(world, seed, x + x1, 0, z + z1)) { + MFLogUtil.logDebug("Placed Ancient Forge at " + x + x1 + " " + z + z1); return; } } } forge = null; } + private static int strongholdCount, chunkCount; - private static void generateDwarvenStronghold(Random seed, int chunkX, int chunkZ, World world) - { - int x = (16*chunkX); - int z = (16*chunkZ); + + private static void generateDwarvenStronghold(Random seed, int chunkX, int chunkZ, World world) { + int x = (16 * chunkX); + int z = (16 * chunkZ); WorldGenDwarvenStronghold stronghold = new WorldGenDwarvenStronghold(); - for(int x1 = 0; x1 < 16; x1++) - { - for(int z1 = 0; z1 < 16; z1++) - { - if(stronghold.generate(world, seed, x+x1, 0, z+z1)) - { + for (int x1 = 0; x1 < 16; x1++) { + for (int z1 = 0; z1 < 16; z1++) { + if (stronghold.generate(world, seed, x + x1, 0, z + z1)) { ++strongholdCount; - MFLogUtil.logDebug("Placed Dwarven Stronghold in wall at " + x+x1 + " " + z+z1); - String s = "Gen: " + strongholdCount + " Strongholds in " + chunkCount + " Chunks = " + ((float)strongholdCount/(float)chunkCount*100F)+ "% cases"; + MFLogUtil.logDebug("Placed Dwarven Stronghold in wall at " + x + x1 + " " + z + z1); + String s = "Gen: " + strongholdCount + " Strongholds in " + chunkCount + " Chunks = " + + ((float) strongholdCount / (float) chunkCount * 100F) + "% cases"; System.out.println(s); return; } @@ -100,34 +85,31 @@ private static void generateDwarvenStronghold(Random seed, int chunkX, int chunk stronghold.setSurfaceMode(true); int x1 = seed.nextInt(16); int z1 = seed.nextInt(16); - if(stronghold.generate(world, seed, x+x1, 0, z+z1)) - { + if (stronghold.generate(world, seed, x + x1, 0, z + z1)) { ++strongholdCount; - MFLogUtil.logDebug("Placed Dwarven Stronghold on ground at " + x+x1 + " " + z+z1); - String s = "Gen: " + strongholdCount + " Strongholds in " + chunkCount + " Chunks = " + ((float)strongholdCount/(float)chunkCount*100F)+ "% cases"; + MFLogUtil.logDebug("Placed Dwarven Stronghold on ground at " + x + x1 + " " + z + z1); + String s = "Gen: " + strongholdCount + " Strongholds in " + chunkCount + " Chunks = " + + ((float) strongholdCount / (float) chunkCount * 100F) + "% cases"; System.out.println(s); return; } stronghold = null; } - private static void generateAncientAlter(Random seed, int chunkX, int chunkZ, World world) - { + + private static void generateAncientAlter(Random seed, int chunkX, int chunkZ, World world) { int spawnZ = world.getSpawnPoint().posZ; - int spawnChunkZ = (int)( (float)spawnZ/16F); - - if(chunkZ == spawnChunkZ) - { - int x = (16*chunkX); - int z = (16*chunkZ); - + int spawnChunkZ = (int) (spawnZ / 16F); + + if (chunkZ == spawnChunkZ) { + int x = (16 * chunkX); + int z = (16 * chunkZ); + WorldGenAncientAlter ruin = new WorldGenAncientAlter(); - for(int x1 = 0; x1 < 16; x1++) - { - //for(int z1 = 0; z1 < 16; z1++) + for (int x1 = 0; x1 < 16; x1++) { + // for(int z1 = 0; z1 < 16; z1++) { - if(ruin.generate(world, seed, x+x1, 0, spawnZ)) - { - MFLogUtil.logDebug("Placed Ancient Alter at " + x+x1 + " " + spawnZ); + if (ruin.generate(world, seed, x + x1, 0, spawnZ)) { + MFLogUtil.logDebug("Placed Ancient Alter at " + x + x1 + " " + spawnZ); return; } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java index 7b7c1a41..06704d52 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java @@ -1,28 +1,23 @@ package minefantasy.mf2.mechanics.worldGen.structure; -import net.minecraftforge.common.ChestGenHooks; - import java.util.Random; import minefantasy.mf2.item.list.ComponentListMF; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.tileentity.TileEntityMobSpawner; import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -import net.minecraftforge.common.DungeonHooks; -public class StructureGenAFRoom extends StructureModuleMF -{ +public class StructureGenAFRoom extends StructureModuleMF { private Random rand = new Random(); - public StructureGenAFRoom(World world, int x, int y, int z, int d) - { + + public StructureGenAFRoom(World world, int x, int y, int z, int d) { super(world, x, y, z, d); } - public StructureGenAFRoom(World world, StructureCoordinates position) - { + + public StructureGenAFRoom(World world, StructureCoordinates position) { super(world, position); } @@ -30,94 +25,82 @@ public StructureGenAFRoom(World world, StructureCoordinates position) public void generate() { int width = 7; int depth = 6; - //FLOOR - for(int x = -width/2; x <= width/2; x ++) - { - for(int z = 0; z <= depth; z ++) - { + // FLOOR + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, 0, z); } } - - //CEIL - for(int x = -width/2; x <= width/2; x ++) - { - for(int z = 0; z <= depth; z ++) - { + + // CEIL + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, 5, z); } - } - //INT - for (int x = -width / 2; x <= width / 2; x++) - { - for (int z = 0; z <= depth; z++) - { - for (int y = 1; y <= 4; y++) - { + } + // INT + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { + for (int y = 1; y <= 4; y++) { placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y, z); } } } - //HOLLOW - for (int x = (-width / 2)+1; x <= (width / 2)-1; x++) - { - for (int z = 1; z <= depth-1; z++) - { - for (int y = 1; y <= 4; y++) - { + // HOLLOW + for (int x = (-width / 2) + 1; x <= (width / 2) - 1; x++) { + for (int z = 1; z <= depth - 1; z++) { + for (int y = 1; y <= 4; y++) { placeBlock(Blocks.air, 0, x, y, z); } } } - - //CHEST + + // CHEST { int x = 0; int y = 0; - int z = depth/2; - - placeChest(0, 1, depth-1, lootType); + int z = depth / 2; + + placeChest(0, 1, depth - 1, lootType); placeSpawner(0, 1, z, "Silverfish"); - - for(int x2 = -1; x2 <= 1; x2++) - { + + for (int x2 = -1; x2 <= 1; x2++) { placeBlock(Blocks.air, 0, x2, 1, 0); placeBlock(Blocks.air, 0, x2, 2, 0); } placeBlock(Blocks.air, 0, 0, 3, 0); - + } } - - private void placeChest(int x, int y, int z, String loot) - { + + private void placeChest(int x, int y, int z, String loot) { int[] coords = this.offsetPos(x, y, z, direction); worldObj.setBlock(coords[0], coords[1], coords[2], Blocks.chest, direction, 2); - TileEntityChest tileentitychest = (TileEntityChest)worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if (tileentitychest != null) - { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tileentitychest, ChestGenHooks.getCount(loot, rand)); - if(hasTrinket) - { - //North = -z, South = +z - int sp = worldObj.getSpawnPoint().posZ; - int item = (coords[2] < sp) ? 1 : 0; - int artId = rand.nextInt(tileentitychest.getSizeInventory()); - tileentitychest.setInventorySlotContents(artId, new ItemStack(ComponentListMF.artefacts, 1, item)); - } - } + TileEntityChest tileentitychest = (TileEntityChest) worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (tileentitychest != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tileentitychest, + ChestGenHooks.getCount(loot, rand)); + if (hasTrinket) { + // North = -z, South = +z + int sp = worldObj.getSpawnPoint().posZ; + int item = (coords[2] < sp) ? 1 : 0; + int artId = rand.nextInt(tileentitychest.getSizeInventory()); + tileentitychest.setInventorySlotContents(artId, new ItemStack(ComponentListMF.artefacts, 1, item)); + } + } } - + private String lootType = ChestGenHooks.DUNGEON_CHEST; - public StructureModuleMF setLoot(String loot) - { + + public StructureModuleMF setLoot(String loot) { this.lootType = loot; return this; } + private boolean hasTrinket = false; - public StructureModuleMF giveTrinket() - { + + public StructureModuleMF giveTrinket() { hasTrinket = true; return this; } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientAlter.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientAlter.java index 6201d0ce..0db4f312 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientAlter.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientAlter.java @@ -1,53 +1,40 @@ package minefantasy.mf2.mechanics.worldGen.structure; -import net.minecraftforge.common.ChestGenHooks; - -import java.util.Random; - import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.tileentity.TileEntityMobSpawner; import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -import net.minecraftforge.common.DungeonHooks; -public class StructureGenAncientAlter extends StructureModuleMF -{ - public StructureGenAncientAlter(World world, int x, int y, int z, int d) - { +public class StructureGenAncientAlter extends StructureModuleMF { + public StructureGenAncientAlter(World world, int x, int y, int z, int d) { super(world, x, y, z, d); } - StructureGenAncientAlter(World world, StructureCoordinates position) - { + + StructureGenAncientAlter(World world, StructureCoordinates position) { super(world, position); } + @Override - public void generate() - { + public void generate() { int radius = 2; - //FLOOR - for(int x = -radius; x <= radius; x ++) - { - for(int z = -radius; z <= radius; z ++) - { + // FLOOR + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, 0, z); - + Object[] array = getFoundation(radius, x, z); - if(array != null) - { - int m = (Boolean)array[1] ? -1 : 0; - buildFoundation((Block)array[0], m, x, -1, z, 32, 3, false); + if (array != null) { + int m = (Boolean) array[1] ? -1 : 0; + buildFoundation((Block) array[0], m, x, -1, z, 32, 3, false); } } } - for(int p = -1; p <= 1; p++) - { + for (int p = -1; p <= 1; p++) { placeBlock(Blocks.stone_brick_stairs, 0, -radius, 0, p, 0); placeBlock(Blocks.stone_brick_stairs, 1, radius, 0, p, 0); placeBlock(Blocks.stone_brick_stairs, 2, p, 0, -radius, 0); @@ -57,63 +44,69 @@ public void generate() placeBlock(BlockListMF.mythic_decor, 1, radius, 0, -radius); placeBlock(BlockListMF.mythic_decor, 1, -radius, 0, radius); placeBlock(BlockListMF.mythic_decor, 1, radius, 0, radius); - + placeBlock(BlockListMF.mythic_decor, 0, -radius, 1, -radius); placeBlock(BlockListMF.mythic_decor, 0, radius, 1, -radius); placeBlock(BlockListMF.mythic_decor, 0, -radius, 1, radius); placeBlock(BlockListMF.mythic_decor, 0, radius, 1, radius); - + placeBlock(BlockListMF.mythic_decor, 1, -radius, 2, -radius); placeBlock(BlockListMF.mythic_decor, 1, radius, 2, -radius); placeBlock(BlockListMF.mythic_decor, 1, -radius, 2, radius); placeBlock(BlockListMF.mythic_decor, 1, radius, 2, radius); - - //CHEST + + // CHEST { int x = 0; int y = 0; int z = 0; - - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y+1, z); - placeChest(0, y+2, z, lootType); + + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y + 1, z); + placeChest(0, y + 2, z, lootType); placeSpawner(0, y, z, "Enderman"); } - + } - - private Object[] getFoundation(int radius, int x, int z) - { - if(x == -radius && z == -radius)return null; - if(x == radius && z == -radius)return null; - if(x == -radius && z == radius)return null; - if(x == radius && z == radius)return null; - - if(x == 0 && z == -radius)return new Object[]{Blocks.obsidian, false}; - if(x == 0 && z == radius)return new Object[]{Blocks.obsidian, false}; - if(x == -radius && z == 0)return new Object[]{Blocks.obsidian, false}; - if(x == radius && z == 0)return new Object[]{Blocks.obsidian, false}; - - return new Object[]{Blocks.stonebrick, true}; + + private Object[] getFoundation(int radius, int x, int z) { + if (x == -radius && z == -radius) + return null; + if (x == radius && z == -radius) + return null; + if (x == -radius && z == radius) + return null; + if (x == radius && z == radius) + return null; + + if (x == 0 && z == -radius) + return new Object[] { Blocks.obsidian, false }; + if (x == 0 && z == radius) + return new Object[] { Blocks.obsidian, false }; + if (x == -radius && z == 0) + return new Object[] { Blocks.obsidian, false }; + if (x == radius && z == 0) + return new Object[] { Blocks.obsidian, false }; + + return new Object[] { Blocks.stonebrick, true }; } - private void placeChest(int x, int y, int z, String loot) - { + private void placeChest(int x, int y, int z, String loot) { int[] coords = this.offsetPos(x, y, z, direction); worldObj.setBlock(coords[0], coords[1], coords[2], Blocks.chest, direction, 2); - TileEntityChest tileentitychest = (TileEntityChest)worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if (tileentitychest != null) - { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tileentitychest, ChestGenHooks.getCount(loot, rand)); - - int artId = rand.nextInt(tileentitychest.getSizeInventory()); - tileentitychest.setInventorySlotContents(artId, new ItemStack(ComponentListMF.artefacts, 1, 2)); - } + TileEntityChest tileentitychest = (TileEntityChest) worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (tileentitychest != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tileentitychest, + ChestGenHooks.getCount(loot, rand)); + + int artId = rand.nextInt(tileentitychest.getSizeInventory()); + tileentitychest.setInventorySlotContents(artId, new ItemStack(ComponentListMF.artefacts, 1, 2)); + } } - + private String lootType = ChestGenHooks.DUNGEON_CHEST; - public StructureModuleMF setLoot(String loot) - { + + public StructureModuleMF setLoot(String loot) { this.lootType = loot; return this; } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java index 1e2088c9..1db85551 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java @@ -1,6 +1,5 @@ package minefantasy.mf2.mechanics.worldGen.structure; - import java.util.Random; import minefantasy.mf2.block.list.BlockListMF; @@ -8,176 +7,150 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -public class StructureGenAncientForge extends StructureModuleMF -{ +public class StructureGenAncientForge extends StructureModuleMF { private Random rand = new Random(); + public StructureGenAncientForge(World world, int x, int y, int z, int d) { super(world, x, y, z, d); } - public StructureGenAncientForge(World world, StructureCoordinates position) - { + + public StructureGenAncientForge(World world, StructureCoordinates position) { super(world, position); } + @Override - public void generate() - { + public void generate() { placeBlock(Blocks.stonebrick, getRandomMetadata(rand), 0, 0, -1); - + int width = 14; int depth = 16; - //FLOOR - for(int x = -width/2; x <= width/2; x ++) - { - for(int z = 0; z <= depth; z ++) - { + // FLOOR + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { placeBlock(Blocks.stonebrick, getRandomMetadata(rand), x, 0, z); } } - - //CEIL - for(int x = -width/2; x <= width/2; x ++) - { - for(int z = 0; z <= depth; z ++) - { + + // CEIL + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { placeBlock(Blocks.stonebrick, getRandomMetadata(rand), x, 5, z); } - } - //WALLS + } + // WALLS for (int x = -width / 2; x <= width / 2; x++) { for (int z = 0; z <= depth; z++) { - for (int y = 1; y <= 4; y++) - { + for (int y = 1; y <= 4; y++) { placeBlock(Blocks.stonebrick, getRandomMetadata(rand), x, y, z); } } } - //INTERIOR - for (int x = (-width / 2)+1; x <= (width / 2)-1; x++) - { - for (int z = 1; z <= depth-1; z++) - { - for (int y = 1; y <= 4; y++) - { - if(x % 4 != 0 || z % 4 != 0) - placeBlock(Blocks.air, 0, x, y, z); + // INTERIOR + for (int x = (-width / 2) + 1; x <= (width / 2) - 1; x++) { + for (int z = 1; z <= depth - 1; z++) { + for (int y = 1; y <= 4; y++) { + if (x % 4 != 0 || z % 4 != 0) + placeBlock(Blocks.air, 0, x, y, z); } } } - - //OBSIDIAN + + // OBSIDIAN for (int x = -3; x <= 3; x++) { - for (int z = 5; z <= 11; z++) - { - for (int y = -3; y <= 0; y++) - { + for (int z = 5; z <= 11; z++) { + for (int y = -3; y <= 0; y++) { placeBlock(y == 0 ? BlockListMF.mythic_decor : Blocks.obsidian, 0, x, y, z); } } } - //HOLLOW - for (int x = -2; x <= 2; x++) - { - for (int z = 6; z <= 10; z++) - { - for (int y = -2; y <= 0; y++) - { + // HOLLOW + for (int x = -2; x <= 2; x++) { + for (int z = 6; z <= 10; z++) { + for (int y = -2; y <= 0; y++) { placeBlock(Blocks.air, 0, x, y, z); } } } - //LAVA - for (int x = -2; x <= 2; x++) - { - for (int z = 6; z <= 10; z++) - { + // LAVA + for (int x = -2; x <= 2; x++) { + for (int z = 6; z <= 10; z++) { placeBlock(Blocks.lava, 0, x, -2, z); } } - placeBlock(Blocks.air, 0, 0, 2, depth/2); - placeBlock(Blocks.air, 0, 0, 3, depth/2); - placeBlock(Blocks.air, 0, 0, 4, depth/2); - - placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth/2); - placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth/2); - placeBlock(BlockListMF.mythic_decor, 1, 0, 0, depth/2+3); - placeBlock(BlockListMF.mythic_decor, 1, 0, 0, depth/2-3); - - placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth/2-3); - placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth/2+3); - placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth/2-3); - placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth/2+3); - - placeBlock(Blocks.obsidian, 0, 0, 0, depth/2); + placeBlock(Blocks.air, 0, 0, 2, depth / 2); + placeBlock(Blocks.air, 0, 0, 3, depth / 2); + placeBlock(Blocks.air, 0, 0, 4, depth / 2); + + placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth / 2); + placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth / 2); + placeBlock(BlockListMF.mythic_decor, 1, 0, 0, depth / 2 + 3); + placeBlock(BlockListMF.mythic_decor, 1, 0, 0, depth / 2 - 3); + + placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth / 2 - 3); + placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth / 2 + 3); + placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth / 2 - 3); + placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth / 2 + 3); + + placeBlock(Blocks.obsidian, 0, 0, 0, depth / 2); placeBlock(Blocks.obsidian, 0, 0, 0, depth / 2 - 1); placeBlock(Blocks.obsidian, 0, 0, 0, depth / 2 - 2); - - placeBlock(BlockListMF.cruciblemythic, 0, 0, 1, depth/2); - placeBlock(Blocks.end_portal_frame, 0, 3, 0, depth/2-1); - placeBlock(Blocks.end_portal_frame, 0, -3, 0, depth/2-1); - placeBlock(Blocks.end_portal_frame, 0, -1, 0, depth/2+3); - placeBlock(Blocks.end_portal_frame, 0, -1, 0, depth/2-3); - - placeBlock(Blocks.end_portal_frame, 0, 3, 0, depth/2+1); - placeBlock(Blocks.end_portal_frame, 0, -3, 0, depth/2+1); - placeBlock(Blocks.end_portal_frame, 0, 1, 0, depth/2+3); - placeBlock(Blocks.end_portal_frame, 0, 1, 0, depth/2-3); - - - for(int y = 0; y < 4; y ++) - { - placeBlock(Blocks.air, 0, 0, y+1, depth/2-4); + + placeBlock(BlockListMF.cruciblemythic, 0, 0, 1, depth / 2); + placeBlock(Blocks.end_portal_frame, 0, 3, 0, depth / 2 - 1); + placeBlock(Blocks.end_portal_frame, 0, -3, 0, depth / 2 - 1); + placeBlock(Blocks.end_portal_frame, 0, -1, 0, depth / 2 + 3); + placeBlock(Blocks.end_portal_frame, 0, -1, 0, depth / 2 - 3); + + placeBlock(Blocks.end_portal_frame, 0, 3, 0, depth / 2 + 1); + placeBlock(Blocks.end_portal_frame, 0, -3, 0, depth / 2 + 1); + placeBlock(Blocks.end_portal_frame, 0, 1, 0, depth / 2 + 3); + placeBlock(Blocks.end_portal_frame, 0, 1, 0, depth / 2 - 3); + + for (int y = 0; y < 4; y++) { + placeBlock(Blocks.air, 0, 0, y + 1, depth / 2 - 4); } - placeBlock(Blocks.glowstone, 0, 0, 5, depth/2); + placeBlock(Blocks.glowstone, 0, 0, 5, depth / 2); placeBlock(Blocks.air, 0, 0, 1, 0); placeBlock(Blocks.air, 0, 0, 2, 0); - + getRandomForge(0, 0, depth, direction).generate(); - - getRandomForge(width/2, 0, depth/2, rotateLeft()).generate(); - getRandomForge(-width/2, 0, depth/2, rotateRight()).generate(); - + + getRandomForge(width / 2, 0, depth / 2, rotateLeft()).generate(); + getRandomForge(-width / 2, 0, depth / 2, rotateRight()).generate(); + } - private StructureModuleMF getRandomForge(int x, int y, int z, int newDirection) - { + private StructureModuleMF getRandomForge(int x, int y, int z, int newDirection) { int[] coord = this.offsetPos(x, y, z, direction); StructureGenAFRoom room = new StructureGenAFRoom(worldObj, coord[0], coord[1], coord[2], newDirection); - - if(newDirection == direction) - { + + if (newDirection == direction) { room.giveTrinket(); } room.setLoot(getRandomLoot()); - + return room; } - - private String getRandomLoot() - { + + private String getRandomLoot() { int i = rand.nextInt(3); - if(i == 0) - { - return rand.nextBoolean() ? ChestGenHooks.STRONGHOLD_CORRIDOR : ChestGenHooks.STRONGHOLD_CROSSING; + if (i == 0) { + return rand.nextBoolean() ? ChestGenHooks.STRONGHOLD_CORRIDOR : ChestGenHooks.STRONGHOLD_CROSSING; } - if(i == 1) - { - return rand.nextBoolean() ? ChestGenHooks.PYRAMID_DESERT_CHEST : ChestGenHooks.PYRAMID_JUNGLE_CHEST; + if (i == 1) { + return rand.nextBoolean() ? ChestGenHooks.PYRAMID_DESERT_CHEST : ChestGenHooks.PYRAMID_JUNGLE_CHEST; } return ChestGenHooks.DUNGEON_CHEST; } - public static int getRandomMetadata(Random RNG) - { - float f = RNG.nextFloat(); - - if (f < 0.2F) - { - return 2; - } - else if (f < 0.5F) - { - return 1; - } - return 0; + public static int getRandomMetadata(Random RNG) { + float f = RNG.nextFloat(); + + if (f < 0.2F) { + return 2; + } else if (f < 0.5F) { + return 1; + } + return 0; } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java index 98d77c71..b46e5165 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java @@ -5,57 +5,51 @@ import net.minecraft.init.Blocks; import net.minecraft.world.World; -public class StructureGenAncientForgeEntry extends StructureModuleMF -{ - +public class StructureGenAncientForgeEntry extends StructureModuleMF { + private Random rand = new Random(); - - public StructureGenAncientForgeEntry(World world, int x, int y, int z, int d) - { + + public StructureGenAncientForgeEntry(World world, int x, int y, int z, int d) { super(world, x, y, z, d); } - public StructureGenAncientForgeEntry(World world, StructureCoordinates position) - { + + public StructureGenAncientForgeEntry(World world, StructureCoordinates position) { super(world, position); } @Override - public void generate() - { - //Stairway + public void generate() { + // Stairway int length = 8 + rand.nextInt(8); - if(yCoord > 48) length += (yCoord-48); - for(int d = 1; d <= length; d ++) - { - for(int w = 0; w < 3; w ++) - { - for(int h = 0; h < 6; h ++) - { - if(d != 1 || h != 5) - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), -1+w, -d+h-1, d+1); + if (yCoord > 48) + length += (yCoord - 48); + for (int d = 1; d <= length; d++) { + for (int w = 0; w < 3; w++) { + for (int h = 0; h < 6; h++) { + if (d != 1 || h != 5) + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), -1 + w, + -d + h - 1, d + 1); } } - - for(int h = 0; h < 4; h ++) - placeBlock(Blocks.air, 0, 0, -d+h, d+1); - placeBlock(Blocks.stone_brick_stairs, getStairDirection(reverse()), 0, -d, d+1); + + for (int h = 0; h < 4; h++) + placeBlock(Blocks.air, 0, 0, -d + h, d + 1); + placeBlock(Blocks.stone_brick_stairs, getStairDirection(reverse()), 0, -d, d + 1); } placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), 0, 2, 2); - for(int x = -1; x <= 1; x ++) - { - for(int y = -1; y <= 5; y ++) - { - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y-3, 1); + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 5; y++) { + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y - 3, 1); } } placeBlock(Blocks.air, 0, 0, 0, 1); placeBlock(Blocks.air, 0, 0, 1, 1); - - int[] coord = offsetPos(0, -length+1, length+1, direction); + + int[] coord = offsetPos(0, -length + 1, length + 1, direction); int x = coord[0]; int y = coord[1]; int z = coord[2]; - + StructureModuleMF structure = new StructureGenAncientForge(worldObj, x, y, z, direction); structure.generate(); } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java index 77765e88..72f1d3b1 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java @@ -13,8 +13,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.DungeonHooks; -public abstract class StructureModuleMF -{ +public abstract class StructureModuleMF { public final int xCoord; public final int yCoord; public final int zCoord; @@ -33,35 +32,32 @@ public abstract class StructureModuleMF */ public int deviationCount; protected String subtype = "Normal"; - - public StructureModuleMF(World world, StructureCoordinates position) - { + + public StructureModuleMF(World world, StructureCoordinates position) { worldObj = world; xCoord = position.posX; yCoord = position.posY; zCoord = position.posZ; direction = position.direction; - + } - public StructureModuleMF(World world, int x, int y, int z, int d) - { + + public StructureModuleMF(World world, int x, int y, int z, int d) { this(world, new StructureCoordinates(x, y, z, d)); } - public StructureModuleMF(World world, int x, int y, int z) - { + + public StructureModuleMF(World world, int x, int y, int z) { this(world, x, y, z, 0); } - + public abstract void generate(); - - public boolean canGenerate() - { + + public boolean canGenerate() { return true; } - public int rotateLeft() - { - switch(direction) - { + + public int rotateLeft() { + switch (direction) { case 0: return 3; case 1: @@ -73,11 +69,9 @@ public int rotateLeft() } return 0; } - - public int rotateRight() - { - switch(direction) - { + + public int rotateRight() { + switch (direction) { case 0: return 1; case 1: @@ -89,11 +83,9 @@ public int rotateRight() } return 0; } - - public int reverse() - { - switch(direction) - { + + public int reverse() { + switch (direction) { case 0: return 2; case 1: @@ -105,243 +97,249 @@ public int reverse() } return 0; } + /** - * Places a block and rotates it on it's base direction for pregen - * designed not to override the worldGen marker - * @param id The blockID - * @param meta the block metadata - * @param x The x offset(relation to xCoord) - * @param y The y offset(relation to yCoord) - * @param z The z offset(relation to zCoord) + * Places a block and rotates it on it's base direction for pregen designed not + * to override the worldGen marker + * + * @param id + * The blockID + * @param meta + * the block metadata + * @param x + * The x offset(relation to xCoord) + * @param y + * The y offset(relation to yCoord) + * @param z + * The z offset(relation to zCoord) */ - public void pregenPlaceBlock(Block id, int meta, int x, int y, int z) - { - if(! (x == 0 && y== 0 && z == 0)) - { + public void pregenPlaceBlock(Block id, int meta, int x, int y, int z) { + if (!(x == 0 && y == 0 && z == 0)) { placeBlock(id, meta, x, y, z, direction); } } + /** * Places a block and rotates it on it's base direction - * @param id The blockID - * @param meta the block metadata - * @param x The x offset(relation to xCoord) - * @param y The y offset(relation to yCoord) - * @param z The z offset(relation to zCoord) + * + * @param id + * The blockID + * @param meta + * the block metadata + * @param x + * The x offset(relation to xCoord) + * @param y + * The y offset(relation to yCoord) + * @param z + * The z offset(relation to zCoord) */ - public void placeBlock(Block id, int meta, int x, int y, int z) - { + public void placeBlock(Block id, int meta, int x, int y, int z) { placeBlock(id, meta, x, y, z, direction); } - + /** * Places a block and rotates it on direction - * @param id The blockID - * @param meta the block metadata - * @param xo The x offset(relation to xCoord) - * @param yo The y offset(relation to yCoord) - * @param zo The z offset(relation to zCoord) - * @param dir The direction to face + * + * @param id + * The blockID + * @param meta + * the block metadata + * @param xo + * The x offset(relation to xCoord) + * @param yo + * The y offset(relation to yCoord) + * @param zo + * The z offset(relation to zCoord) + * @param dir + * The direction to face */ - public void placeBlock(Block id, int meta, int xo, int yo, int zo, int dir) - { + public void placeBlock(Block id, int meta, int xo, int yo, int zo, int dir) { int[] offset = offsetPos(xo, yo, zo, dir); worldObj.setBlock(offset[0], offset[1], offset[2], id, meta, 2); } - - public void placeBlockIfAir(Block id, int meta, int xo, int yo, int zo) - { + + public void placeBlockIfAir(Block id, int meta, int xo, int yo, int zo) { int[] offset = offsetPos(xo, yo, zo, direction); - if(worldObj.getBlock(offset[0], offset[1], offset[2]).isReplaceable(worldObj, offset[0], offset[1], offset[2])) - { + if (worldObj.getBlock(offset[0], offset[1], offset[2]).isReplaceable(worldObj, offset[0], offset[1], + offset[2])) { worldObj.setBlock(offset[0], offset[1], offset[2], id, meta, 2); } } - - public void placeEntity(Entity entity, int x, int y, int z) - { + + public void placeEntity(Entity entity, int x, int y, int z) { placeEntity(entity, x, y, z, direction); } - public void placeEntity(Entity entity, int xo, int yo, int zo, int dir) - { + + public void placeEntity(Entity entity, int xo, int yo, int zo, int dir) { int[] offset = offsetPos(xo, yo, zo, dir); - entity.setLocationAndAngles(offset[0]+0.5D, offset[1]+entity.height-1.0F, offset[2]+0.5D, MathHelper.wrapAngleTo180_float(worldObj.rand.nextFloat() * 360.0F), 0.0F); + entity.setLocationAndAngles(offset[0] + 0.5D, offset[1] + entity.height - 1.0F, offset[2] + 0.5D, + MathHelper.wrapAngleTo180_float(worldObj.rand.nextFloat() * 360.0F), 0.0F); worldObj.spawnEntityInWorld(entity); } - - protected void buildFoundation(Block block, int meta, int x, int z) - { + + protected void buildFoundation(Block block, int meta, int x, int z) { buildFoundation(block, meta, x, -1, z, 32, 0, false); } + /** * Builds a foundation column from -1y - * @param block The block used - * @param meta metadata used - * @param x the relative x position - * @param y the relative y position to start - * @param z the relative z position - * @param max the max depth - * @param penetrance how many solid blocks can it pass through - * @param relative whether or not it must be stopped by concecutive blocks. + * + * @param block + * The block used + * @param meta + * metadata used + * @param x + * the relative x position + * @param y + * the relative y position to start + * @param z + * the relative z position + * @param max + * the max depth + * @param penetrance + * how many solid blocks can it pass through + * @param relative + * whether or not it must be stopped by concecutive blocks. */ - protected void buildFoundation(Block block, int meta, int x, int y, int z, int max, int penetrance, boolean relative) - { + protected void buildFoundation(Block block, int meta, int x, int y, int z, int max, int penetrance, + boolean relative) { penetrance -= y; int init_penetrance = penetrance; - while(-y < max) - { + while (-y < max) { Block current = getBlock(x, y, z, direction); boolean empty = current.getMaterial().isReplaceable(); - - if(isUnbreakable(x, y, z, direction)) - { + + if (isUnbreakable(x, y, z, direction)) { return; } - if(!empty) - { - -- penetrance; - } - else if(!relative) - { + if (!empty) { + --penetrance; + } else if (!relative) { penetrance = init_penetrance; } - - if(empty || penetrance >= 0) - { + + if (empty || penetrance >= 0) { placeBlock(block, meta == -1 ? StructureGenAncientForge.getRandomMetadata(rand) : meta, x, y, z); --y; - } - else - { + } else { return; } } } - - public TileEntity getTileEntity(int xo, int yo, int zo, int dir) - { + + public TileEntity getTileEntity(int xo, int yo, int zo, int dir) { int[] offset = offsetPos(xo, yo, zo, dir); return worldObj.getTileEntity(offset[0], offset[1], offset[2]); } - - public Block getBlock(int x, int y, int z) - { + + public Block getBlock(int x, int y, int z) { return getBlock(x, y, z, direction); } - public Block getBlock(int xo, int yo, int zo, int dir) - { + + public Block getBlock(int xo, int yo, int zo, int dir) { int[] offset = offsetPos(xo, yo, zo, dir); return worldObj.getBlock(offset[0], offset[1], offset[2]); } - public boolean isUnbreakable(int xo, int yo, int zo, int dir) - { + + public boolean isUnbreakable(int xo, int yo, int zo, int dir) { return getHardness(xo, yo, zo, dir) < 0; } - public float getHardness(int xo, int yo, int zo, int dir) - { + + public float getHardness(int xo, int yo, int zo, int dir) { int[] offset = offsetPos(xo, yo, zo, dir); - return worldObj.getBlock(offset[0], offset[1], offset[2]).getBlockHardness(worldObj, offset[0], offset[1], offset[2]); + return worldObj.getBlock(offset[0], offset[1], offset[2]).getBlockHardness(worldObj, offset[0], offset[1], + offset[2]); } - - public void notifyBlock(Block id, int xo, int yo, int zo, int dir) - { + + public void notifyBlock(Block id, int xo, int yo, int zo, int dir) { int[] offset = offsetPos(xo, yo, zo, dir); worldObj.notifyBlockChange(offset[0], offset[1], offset[2], id); } - - public int[] offsetPos(int xo, int yo, int zo, int dir) - { + + public int[] offsetPos(int xo, int yo, int zo, int dir) { int u = 2; int x = xCoord; - int y = yCoord+yo; + int y = yCoord + yo; int z = zCoord; - - switch(dir) - { - case 0://NORTH + + switch (dir) { + case 0:// NORTH x += xo; z += zo; break; - - case 1://EAST + + case 1:// EAST x -= zo; z += xo; break; - - case 2://SOUTH + + case 2:// SOUTH x -= xo; z -= zo; break; - - case 3://WEST + + case 3:// WEST x += zo; z -= xo; break; } - - - return new int[]{x, y, z}; + + return new int[] { x, y, z }; } - protected void mapStructure(int x, int y, int z, Class piece) - { + + protected void mapStructure(int x, int y, int z, Class piece) { mapStructure(x, y, z, direction, piece); } - protected void mapStructure(int x, int y, int z, int dir, Class piece) - { + + protected void mapStructure(int x, int y, int z, int dir, Class piece) { mapStructure(x, y, z, dir, piece, 0); } - protected void mapStructure(int x, int y, int z, int dir, Class piece, int delay) - { + + protected void mapStructure(int x, int y, int z, int dir, Class piece, int delay) { int[] offset = offsetPos(x, y, z, this.direction); - + Block block = worldObj.getBlock(offset[0], offset[1], offset[2]); int meta = worldObj.getBlockMetadata(offset[0], offset[1], offset[2]); - + worldObj.setBlock(offset[0], offset[1], offset[2], BlockListMF.WG_Mark, dir, 2); TileEntity tile = worldObj.getTileEntity(offset[0], offset[1], offset[2]); - if(tile != null && tile instanceof TileEntityWorldGenMarker) - { - ((TileEntityWorldGenMarker)tile).className = piece.getName(); - ((TileEntityWorldGenMarker)tile).length = lengthId - 1; - ((TileEntityWorldGenMarker)tile).deviation = deviationCount; - ((TileEntityWorldGenMarker)tile).prevID = Block.getIdFromBlock(block); - ((TileEntityWorldGenMarker)tile).prevMeta = meta; - ((TileEntityWorldGenMarker)tile).ticks -= delay; - ((TileEntityWorldGenMarker)tile).type = this.subtype; + if (tile != null && tile instanceof TileEntityWorldGenMarker) { + ((TileEntityWorldGenMarker) tile).className = piece.getName(); + ((TileEntityWorldGenMarker) tile).length = lengthId - 1; + ((TileEntityWorldGenMarker) tile).deviation = deviationCount; + ((TileEntityWorldGenMarker) tile).prevID = Block.getIdFromBlock(block); + ((TileEntityWorldGenMarker) tile).prevMeta = meta; + ((TileEntityWorldGenMarker) tile).ticks -= delay; + ((TileEntityWorldGenMarker) tile).type = this.subtype; } block = null; } - - - public static void placeStructure(String classname, String subtype, int lengthID, int deviation, World world, int x, int y, int z, int dir) - { - try - { - Class oclass = Class.forName(classname); - - if (oclass != null) - { - StructureModuleMF module = (StructureModuleMF)oclass.getConstructor(new Class[] {World.class, StructureCoordinates.class}).newInstance(world, new StructureCoordinates(x, y, z, dir)); - - if(module != null) - { - module.subtype = subtype; - module.lengthId = lengthID; - module.deviationCount = deviation; - if(module.canGenerate()) - { - module.generate(); - } - } - } - } - catch (Exception exception) - { - exception.printStackTrace(); - } + + public static void placeStructure(String classname, String subtype, int lengthID, int deviation, World world, int x, + int y, int z, int dir) { + try { + Class oclass = Class.forName(classname); + + if (oclass != null) { + StructureModuleMF module = (StructureModuleMF) oclass + .getConstructor(new Class[] { World.class, StructureCoordinates.class }) + .newInstance(world, new StructureCoordinates(x, y, z, dir)); + + if (module != null) { + module.subtype = subtype; + module.lengthId = lengthID; + module.deviationCount = deviation; + if (module.canGenerate()) { + module.generate(); + } + } + } + } catch (Exception exception) { + exception.printStackTrace(); + } } - protected int getStairDirection(int d) - { + + protected int getStairDirection(int d) { switch (d) { case 0: return 2; @@ -358,35 +356,30 @@ protected int getStairDirection(int d) } return 0; } - - public static class StructureCoordinates - { + + public static class StructureCoordinates { public final int posX, posY, posZ, direction; - public StructureCoordinates(int x, int y, int z, int direction) - { + + public StructureCoordinates(int x, int y, int z, int direction) { this.posX = x; this.posY = y; this.posZ = z; this.direction = direction; } } - - public void placeSpawner(int x, int y, int z) - { + + public void placeSpawner(int x, int y, int z) { placeSpawner(x, y, z, DungeonHooks.getRandomDungeonMob(rand)); } - public void placeSpawner(int x, int y, int z, String mob) - { + + public void placeSpawner(int x, int y, int z, String mob) { this.placeBlock(Blocks.mob_spawner, 0, x, y, z); - TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner)getTileEntity(x, y, z, direction); - - if (tileentitymobspawner != null) - { - tileentitymobspawner.func_145881_a().setEntityName(mob); - } - else - { - this.placeBlock(Blocks.air, 0, x, y, z); - } + TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner) getTileEntity(x, y, z, direction); + + if (tileentitymobspawner != null) { + tileentitymobspawner.func_145881_a().setEntityName(mob); + } else { + this.placeBlock(Blocks.air, 0, x, y, z); + } } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientAlter.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientAlter.java index 0dc6a0ce..bb58271f 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientAlter.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientAlter.java @@ -1,40 +1,34 @@ package minefantasy.mf2.mechanics.worldGen.structure; -import java.util.Random; - -import minefantasy.mf2.util.MFLogUtil; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; import net.minecraft.world.World; - -public class WorldGenAncientAlter extends WorldGenStructureBase -{ - public WorldGenAncientAlter() - { +public class WorldGenAncientAlter extends WorldGenStructureBase { + public WorldGenAncientAlter() { } + @Override - protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) - { + protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) { return new StructureGenAncientAlter(world, x, y, z, direction); } + @Override - protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) - { - return world.getBlock(x, y, z).getMaterial().isSolid() && isValidGround(world, x, y, z) && world.canBlockSeeTheSky(x, y+2, z); + protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) { + return world.getBlock(x, y, z).getMaterial().isSolid() && isValidGround(world, x, y, z) + && world.canBlockSeeTheSky(x, y + 2, z); } + @Override - protected boolean canStructureBuild(StructureModuleMF piece) - { + protected boolean canStructureBuild(StructureModuleMF piece) { return true; } + @Override - protected boolean isDirectionRandom() - { + protected boolean isDirectionRandom() { return true; } + @Override protected int[] getYGenBounds(World world) { - return new int[]{64, 255}; + return new int[] { 64, 255 }; } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientForge.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientForge.java index ce3d08f2..84b83861 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientForge.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientForge.java @@ -1,56 +1,42 @@ package minefantasy.mf2.mechanics.worldGen.structure; -import java.util.Random; - -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; import net.minecraft.world.World; - -public class WorldGenAncientForge extends WorldGenStructureBase -{ - public WorldGenAncientForge() - { +public class WorldGenAncientForge extends WorldGenStructureBase { + public WorldGenAncientForge() { } + @Override - protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) - { + protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) { return new StructureGenAncientForgeEntry(world, x, y, z, direction); } + @Override - protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) - { + protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) { return world.getBlock(x, y, z).getMaterial().isSolid() && isValidGround(world, x, y, z); } + @Override - protected boolean canStructureBuild(StructureModuleMF piece) - { - //SEARCH FOR CLIFF - for(int x = -1; x <= 1; x ++) - { - for(int y = 0; y < 3; y ++) - { - for(int z = 1; z <= 2; z ++) - { + protected boolean canStructureBuild(StructureModuleMF piece) { + // SEARCH FOR CLIFF + for (int x = -1; x <= 1; x++) { + for (int y = 0; y < 3; y++) { + for (int z = 1; z <= 2; z++) { int[] pos = piece.offsetPos(x, y, z, piece.direction); Material material = piece.worldObj.getBlock(pos[0], pos[1], pos[2]).getMaterial(); - - if(!material.isOpaque()) - { + + if (!material.isOpaque()) { return false; } - if(!material.isSolid()) - { + if (!material.isSolid()) { return false; } } - for(int z = 0; z > -2; z--) - { + for (int z = 0; z > -2; z--) { Block block = piece.getBlock(x, y, z); - if(block.getMaterial().isSolid()) - { + if (block.getMaterial().isSolid()) { return false; } } @@ -58,13 +44,14 @@ protected boolean canStructureBuild(StructureModuleMF piece) } return true; } + @Override protected boolean isDirectionRandom() { return false; } + @Override - protected int[] getYGenBounds(World world) - { - return new int[]{64, 255}; + protected int[] getYGenBounds(World world) { + return new int[] { 64, 255 }; } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenStructureBase.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenStructureBase.java index 007cb064..fd6b0f15 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenStructureBase.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenStructureBase.java @@ -2,84 +2,75 @@ import java.util.Random; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; - -public abstract class WorldGenStructureBase extends WorldGenerator -{ - public WorldGenStructureBase() - { +public abstract class WorldGenStructureBase extends WorldGenerator { + public WorldGenStructureBase() { } + @Override - public boolean generate(World world, Random random, int i, int j, int k) - { + public boolean generate(World world, Random random, int i, int j, int k) { StructureModuleMF building; int[] bounds = getYGenBounds(world); - for(int y = bounds[1]; y >= bounds[0]; y --) - { - if(isBlockAcceptableOrigin(world, i, y, k)) - { - if(isDirectionRandom()) - { - building = getStartPiece(world, i, y+1, k, random.nextInt(4)); - if(building != null && canStructureBuild(building)) - { - building.generate(); - return true; - } - } - else - { - for(int d = 0; d < 4; d++) - { - building = getStartPiece(world, i, y+1, k, d); - if(building != null && canStructureBuild(building)) - { - building.generate(); - return true; - } - } - } - building = null; - return false; - } + for (int y = bounds[1]; y >= bounds[0]; y--) { + if (isBlockAcceptableOrigin(world, i, y, k)) { + if (isDirectionRandom()) { + building = getStartPiece(world, i, y + 1, k, random.nextInt(4)); + if (building != null && canStructureBuild(building)) { + building.generate(); + return true; + } + } else { + for (int d = 0; d < 4; d++) { + building = getStartPiece(world, i, y + 1, k, d); + if (building != null && canStructureBuild(building)) { + building.generate(); + return true; + } + } + } + building = null; + return false; + } } building = null; - return false; - } - - protected boolean isValidGround(World world, int x, int y, int z) - { + return false; + } + + protected boolean isValidGround(World world, int x, int y, int z) { Block block = world.getBlock(x, y, z); - if(!block.getMaterial().isSolid()) - { + if (!block.getMaterial().isSolid()) { return false; } - - return block.getMaterial() == Material.rock || block.getMaterial() == Material.ground || block.getMaterial() == Material.grass; + + return block.getMaterial() == Material.rock || block.getMaterial() == Material.ground + || block.getMaterial() == Material.grass; } - + /** * The min then max values which y axis allows generation */ protected abstract int[] getYGenBounds(World world); + /** * Whether or not a particular block allows a generation */ protected abstract boolean isBlockAcceptableOrigin(World world, int x, int y, int z); + /** - * Called after IsBlockAcceptableOrigin: If a specific structure can generate here + * Called after IsBlockAcceptableOrigin: If a specific structure can generate + * here */ - protected abstract boolean canStructureBuild(StructureModuleMF ruin) ; + protected abstract boolean canStructureBuild(StructureModuleMF ruin); + /** * True if direction is random, false if it tries one of four */ protected abstract boolean isDirectionRandom(); + /** * The "Entry" instance */ diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureDSSurfaceAppendage.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureDSSurfaceAppendage.java index 451de8b9..e65c9872 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureDSSurfaceAppendage.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureDSSurfaceAppendage.java @@ -2,10 +2,6 @@ import minefantasy.mf2.block.decor.BlockRack; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; -import minefantasy.mf2.entity.EntityCogwork; -import minefantasy.mf2.item.ItemArtefact; -import minefantasy.mf2.material.WoodMaterial; import minefantasy.mf2.mechanics.worldGen.structure.LootTypes; import minefantasy.mf2.mechanics.worldGen.structure.StructureGenAncientForge; import minefantasy.mf2.mechanics.worldGen.structure.StructureModuleMF; @@ -16,261 +12,218 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -public class StructureDSSurfaceAppendage extends StructureModuleMF -{ +public class StructureDSSurfaceAppendage extends StructureModuleMF { private String type; - public StructureDSSurfaceAppendage(World world, StructureCoordinates position) - { + + public StructureDSSurfaceAppendage(World world, StructureCoordinates position) { super(world, position); type = randomiseType(); } - - - private String randomiseType() - { + + private String randomiseType() { return rand.nextInt(3) == 0 ? "Tower" : "Room"; } - - protected int getHeight() - { - return type == "Tower" ? 12 : 5; + protected int getHeight() { + return type == "Tower" ? 12 : 5; } - protected int getDepth() - { - return 6; + + protected int getDepth() { + return 6; } - protected int getWidth() - { + + protected int getWidth() { return 3; } + @Override - public boolean canGenerate() - { + public boolean canGenerate() { int width = getWidth(), depth = getDepth(), height = getHeight(); int filledSpaces = 0, emptySpaces = 0; - - for(int x = -width; x <= width; x ++) - { - for(int y = 0; y <= height; y ++) - { - for(int z = 1; z <= depth; z ++) - { + + for (int x = -width; x <= width; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { Block block = this.getBlock(x, y, z); - if(!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) - { + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { return false; } - if(!block.getMaterial().isSolid()) - { + if (!block.getMaterial().isSolid()) { ++emptySpaces; - } - else - { + } else { ++filledSpaces; } } } } - if(WorldGenDwarvenStronghold.debug_air) - { + if (WorldGenDwarvenStronghold.debug_air) { return true; } - return ((float) emptySpaces / (float)filledSpaces) > 1.0F;//at least 50% empty + return ((float) emptySpaces / (float) filledSpaces) > 1.0F;// at least 50% empty } - private boolean allowBuildOverBlock(Block block) - { - if(block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) - { + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { return false; } return true; } - - + @Override - public void generate() - { + public void generate() { int width = getWidth(), depth = getDepth(), height = getHeight(); - - for(int x = -width; x <= width; x ++) - { - for(int z = 0; z <= depth; z ++) - { + + for (int x = -width; x <= width; x++) { + for (int z = 0; z <= depth; z++) { Object[] blockarray; - - //FLOOR + + // FLOOR blockarray = getFloor(width, depth, x, z); - if(blockarray != null) - { - placeBlock((Block)blockarray[0], 0, x, 0, z); + if (blockarray != null) { + placeBlock((Block) blockarray[0], 0, x, 0, z); } - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, -1, z); - if(z < depth) - { - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, -2, z); + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, -1, + z); + if (z < depth) { + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, + -2, z); } - if(z < depth-1) - { - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, -3, z); + if (z < depth - 1) { + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, + -3, z); } - //WALLS - for(int y = 0; y <= height; y ++) - { + // WALLS + for (int y = 0; y <= height; y++) { blockarray = getWalls(width, depth, height, x, y, z); - if(blockarray != null && this.allowBuildOverBlock(getBlock(x, y, z))) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, y, z); + if (blockarray != null && this.allowBuildOverBlock(getBlock(x, y, z))) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); } } - //CEILING + // CEILING blockarray = getCeiling(width, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height, z); } - //BATTLEMENT - if(type == "Tower") - { + // BATTLEMENT + if (type == "Tower") { blockarray = getRoofDecor(width, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height+1, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1, z); } } } } placeBlock(Blocks.air, 0, 0, 1, 0); placeBlock(Blocks.air, 0, 0, 2, 0); - + placeBlock(BlockListMF.reinforced_stone_framed, 0, -1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); + placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); placeBlock(BlockListMF.reinforced_stone_framediron, 0, -1, 3, -1); - + placeBlock(BlockListMF.reinforced_stone_framed, 0, 1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); placeBlock(BlockListMF.reinforced_stone_framediron, 0, 1, 3, -1); - + placeBlock(BlockListMF.reinforced_stone, 1, 0, 3, -1); placeBlock(Blocks.air, 0, 0, 1, -1); placeBlock(Blocks.air, 0, 0, 2, -1); - - if(type == "Tower") - { + + if (type == "Tower") { decorateTower(width, depth, height); - } - else - { + } else { buildHomeFurnishings(width, depth, height); } } - private Object[] getFloor(int width, int depth, int x, int z) - { - if(x<= -(width-1) || x >= (width-1) || z <= 1 || z >= depth-1) - { - return new Object[]{BlockListMF.reinforced_stone, 0}; + private Object[] getFloor(int width, int depth, int x, int z) { + if (x <= -(width - 1) || x >= (width - 1) || z <= 1 || z >= depth - 1) { + return new Object[] { BlockListMF.reinforced_stone, 0 }; } - return new Object[]{BlockListMF.cobble_pavement, 0}; + return new Object[] { BlockListMF.cobble_pavement, 0 }; } - private Object[] getCeiling(int width, int depth, int x, int z) - { - if(x== -width || x == width || z == 0 || z == depth) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getCeiling(int width, int depth, int x, int z) { + if (x == -width || x == width || z == 0 || z == depth) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - private Object[] getRoofDecor(int width, int depth, int x, int z) - { - if(x== -width || x == width || z == 0 || z == depth) - { - if(x == 0 || x== -width || x == width) - { - if(z == 0 || z == depth/2 || z == depth) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getRoofDecor(int width, int depth, int x, int z) { + if (x == -width || x == width || z == 0 || z == depth) { + if (x == 0 || x == -width || x == width) { + if (z == 0 || z == depth / 2 || z == depth) { + return new Object[] { BlockListMF.reinforced_stone, false }; } } - return new Object[]{BlockListMF.bars[0], false}; + return new Object[] { BlockListMF.bars[0], false }; } return null; } - private Object[] getWalls(int radius, int depth, int height, int x, int y, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { - if((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getWalls(int radius, int depth, int height, int x, int y, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - if(type == "Tower" && y == (height/2)) - { - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + if (type == "Tower" && y == (height / 2)) { + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - if(y <= 0) - { + if (y <= 0) { return null; } - return new Object[]{Blocks.air, false}; + return new Object[] { Blocks.air, false }; } - private void decorateTower(int width, int depth, int height) - { - for(int y = 1; y <= height; y ++) - { - if(y >=2 && y <= (height-2) && (y < (height/2)-1 || y > (height/2)+1) ) - { - this.placeBlock(BlockListMF.bars[0], 0, -width, y, depth/2); - this.placeBlock(BlockListMF.bars[0], 0, width, y, depth/2); + + private void decorateTower(int width, int depth, int height) { + for (int y = 1; y <= height; y++) { + if (y >= 2 && y <= (height - 2) && (y < (height / 2) - 1 || y > (height / 2) + 1)) { + this.placeBlock(BlockListMF.bars[0], 0, -width, y, depth / 2); + this.placeBlock(BlockListMF.bars[0], 0, width, y, depth / 2); this.placeBlock(BlockListMF.bars[0], 0, 0, y, depth); - if(y > (height/2)+1) - { + if (y > (height / 2) + 1) { this.placeBlock(BlockListMF.bars[0], 0, 0, y, 0); } } this.placeBlock(Blocks.ladder, BlockRack.getDirection(direction), -1, y, 1); } - this.placeBlock(Blocks.glowstone, 0, 0, height/2, depth/2); - + this.placeBlock(Blocks.glowstone, 0, 0, height / 2, depth / 2); + } - private void buildHomeFurnishings(int width, int depth, int height) - { - for(int x = width-1; x >= (width-4); x --) - { + + private void buildHomeFurnishings(int width, int depth, int height) { + for (int x = width - 1; x >= (width - 4); x--) { placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 1, 3); placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 2, 3); placeBlock(Blocks.stone_slab, 0, x, 3, 3); } - placeBlock(Blocks.stone_slab, 0, width-1, 1, depth-1); - placeBlock(Blocks.stone_slab, 0, width-2, 1, depth-1); - - placeChest(width-3, 1, depth-1, rotateLeft(), LootTypes.DWARVEN_HOME); - - for(int x = -(width-1); x < width; x ++) - { - for(int z = 1; z < depth; z ++) - { - if(x == width-1 || x == -(width-1) || z == 1 || z == (depth-1)) - { - placeBlock(BlockListMF.reinforced_stone, 0, x, height+1, z); + placeBlock(Blocks.stone_slab, 0, width - 1, 1, depth - 1); + placeBlock(Blocks.stone_slab, 0, width - 2, 1, depth - 1); + + placeChest(width - 3, 1, depth - 1, rotateLeft(), LootTypes.DWARVEN_HOME); + + for (int x = -(width - 1); x < width; x++) { + for (int z = 1; z < depth; z++) { + if (x == width - 1 || x == -(width - 1) || z == 1 || z == (depth - 1)) { + placeBlock(BlockListMF.reinforced_stone, 0, x, height + 1, z); } } } } - private void placeChest(int x, int y, int z, int d, String loot) - { + + private void placeChest(int x, int y, int z, int d, String loot) { placeBlock(Blocks.chest, d, x, y, z); - TileEntityChest tile = (TileEntityChest)getTileEntity(x, y, z, direction); + TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); - if (tile != null) - { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, 2+rand.nextInt(3)); - } + if (tile != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, + 2 + rand.nextInt(3)); + } } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSCrossroads.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSCrossroads.java index cfc90c94..2b8415e2 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSCrossroads.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSCrossroads.java @@ -1,320 +1,260 @@ package minefantasy.mf2.mechanics.worldGen.structure.dwarven; -import minefantasy.mf2.api.material.CustomMaterial; -import minefantasy.mf2.block.decor.BlockRack; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; -import minefantasy.mf2.block.tileentity.decor.TileEntityRack; import minefantasy.mf2.config.ConfigWorldGen; import minefantasy.mf2.entity.mob.EntityMinotaur; import minefantasy.mf2.entity.mob.MinotaurBreed; -import minefantasy.mf2.item.ItemArtefact; -import minefantasy.mf2.item.gadget.ItemBomb; -import minefantasy.mf2.item.gadget.ItemMine; -import minefantasy.mf2.item.list.CustomToolListMF; -import minefantasy.mf2.item.weapon.ItemWeaponMF; -import minefantasy.mf2.material.WoodMaterial; -import minefantasy.mf2.mechanics.worldGen.structure.LootTypes; import minefantasy.mf2.mechanics.worldGen.structure.StructureGenAncientForge; import minefantasy.mf2.mechanics.worldGen.structure.StructureModuleMF; import net.minecraft.block.Block; import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -public class StructureGenDSCrossroads extends StructureModuleMF -{ - public StructureGenDSCrossroads(World world, StructureCoordinates position) - { +public class StructureGenDSCrossroads extends StructureModuleMF { + public StructureGenDSCrossroads(World world, StructureCoordinates position) { super(world, position); } - public StructureGenDSCrossroads(World world, int x, int y, int z, int direction) - { + + public StructureGenDSCrossroads(World world, int x, int y, int z, int direction) { super(world, x, y, z, direction); } + @Override - public boolean canGenerate() - { - if(lengthId == -100) - { + public boolean canGenerate() { + if (lengthId == -100) { return true; } int width_span = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); int filledSpaces = 0, emptySpaces = 0; - for(int x = -width_span; x <= width_span; x ++) - { - for(int y = 0; y <= height; y ++) - { - for(int z = 1; z <= depth; z ++) - { + for (int x = -width_span; x <= width_span; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { Block block = this.getBlock(x, y, z); - if(!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) - { + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { return false; } - if(!block.getMaterial().isSolid()) - { + if (!block.getMaterial().isSolid()) { ++emptySpaces; - } - else - { + } else { ++filledSpaces; } } } } - if(WorldGenDwarvenStronghold.debug_air) - { + if (WorldGenDwarvenStronghold.debug_air) { return true; } - return ((float) emptySpaces / (float)(emptySpaces+filledSpaces) ) < WorldGenDwarvenStronghold.maxAir;//at least 75% full + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full } - - private boolean allowBuildOverBlock(Block block) - { - if(block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) - { + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { return false; } return true; } + @Override - public void generate() - { - if(lengthId == -100) - { + public void generate() { + if (lengthId == -100) { this.lengthId = ConfigWorldGen.DSLength; this.deviationCount = ConfigWorldGen.DSDeviations; } - + int width_span = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); - for(int x = -width_span; x <= width_span; x ++) - { - for(int z = 0; z <= depth; z ++) - { + for (int x = -width_span; x <= width_span; x++) { + for (int z = 0; z <= depth; z++) { Object[] blockarray; - //FLOOR + // FLOOR blockarray = getFloor(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, 0, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, 0, z); } - //WALLS - for(int y = 1; y <= height+1; y ++) - { + // WALLS + for (int y = 1; y <= height + 1; y++) { blockarray = getWalls(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, y, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); } } - //CEILING + // CEILING blockarray = getCeiling(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height+1, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1, z); } - - //TRIM + + // TRIM blockarray = getTrim(width_span, depth, x, z); - if(blockarray != null) - { + if (blockarray != null) { int meta = 0; - if(blockarray[1] instanceof Integer) - { - meta = (Integer)blockarray[1]; + if (blockarray[1] instanceof Integer) { + meta = (Integer) blockarray[1]; } - if(blockarray[1] instanceof Boolean) - { - meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + if (blockarray[1] instanceof Boolean) { + meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; } - placeBlock((Block)blockarray[0], meta, x, height, z); + placeBlock((Block) blockarray[0], meta, x, height, z); placeBlock(BlockListMF.reinforced_stone, meta, x, 4, z); - if((Block)blockarray[0] == BlockListMF.reinforced_stone_framed) - { - for(int h = height-1; h > 1; h --) - { - placeBlock(h == 5 ? Blocks.glowstone : BlockListMF.reinforced_stone, h==2 ? 1 : 0, x, h, z); + if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { + for (int h = height - 1; h > 1; h--) { + placeBlock(h == 5 ? Blocks.glowstone : BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, + z); } placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); } } - + } } - - //DOORWAY + + // DOORWAY buildDoorway(width_span, depth, height); - + generateCrossroad(); } - - protected void buildDoorway(int width_span, int depth, int height) - { - for(int x = -1; x <= 1; x++) - { - for(int y = 1; y <= 3; y ++) - { - for(int z = 0; z >= -1; z --) - { + + protected void buildDoorway(int width_span, int depth, int height) { + for (int x = -1; x <= 1; x++) { + for (int y = 1; y <= 3; y++) { + for (int z = 0; z >= -1; z--) { placeBlock(Blocks.air, 0, x, y, z); } } } } - protected int getHeight() - { + + protected int getHeight() { return 7; } - protected int getDepthSpan() - { + + protected int getDepthSpan() { return 19; } - protected int getWidthSpan() - { + + protected int getWidthSpan() { return 7; } - - private Object[] getTrim(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { + + private Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { return null; } - if(x == -(radius-1) || x == (radius-1)) - { - if(z == (int)Math.ceil( (float)depth / 2) || z == (int)Math.floor( (float)depth / 2)) - { - return new Object[]{BlockListMF.reinforced_stone_framed, false}; + if (x == -(radius - 1) || x == (radius - 1)) { + if (z == (int) Math.ceil((float) depth / 2) || z == (int) Math.floor((float) depth / 2)) { + return new Object[] { BlockListMF.reinforced_stone_framed, false }; } } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - if((x == -(radius-1) && (z == (depth-1) || z == 1)) || (x == (radius-1) && (z == (depth-1) || z == 1))) - { - return new Object[]{BlockListMF.reinforced_stone_framed, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) + || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { + return new Object[] { BlockListMF.reinforced_stone_framed, false }; } int m = 0; - if(x == 0 || z == 5 || z == (depth-5)) - { + if (x == 0 || z == 5 || z == (depth - 5)) { m = 1; } - return new Object[]{BlockListMF.reinforced_stone, m}; + return new Object[] { BlockListMF.reinforced_stone, m }; } return null; } - private Object[] getCeiling(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { + + private Object[] getCeiling(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { return null; } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - - private Object[] getFloor(int radius, int depth, int x, int z) - { - if(z < 2 && x >= -1 && x <= 1) - { - return new Object[]{floor_block, false}; + + private Object[] getFloor(int radius, int depth, int x, int z) { + if (z < 2 && x >= -1 && x <= 1) { + return new Object[] { floor_block, false }; } - if(x == -radius || x == radius || z == depth || z == 0) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{floor_block, false}; + return new Object[] { floor_block, false }; } - - private Object[] getWalls(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { - if((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getWalls(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - return new Object[]{Blocks.air, false}; + return new Object[] { Blocks.air, false }; } protected String lootType = ChestGenHooks.DUNGEON_CHEST; - public StructureModuleMF setLoot(String loot) - { + + public StructureModuleMF setLoot(String loot) { this.lootType = loot; return this; } + protected Block floor_block = BlockListMF.cobble_pavement; - - public void generateCrossroad() - { + + public void generateCrossroad() { int width_span = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); - + int zOffset = 4; - + boolean stairSide = rand.nextBoolean(); - - tryPlaceCrossroadHall(0, 0, depth+1, direction, stairSide, 0); - - tryPlaceCrossroadHall((width_span+1), 0, zOffset, rotateLeft(), stairSide, 20); - tryPlaceCrossroadHall((width_span+1), 0, depth-zOffset, rotateLeft(), !stairSide, 40); - - tryPlaceCrossroadHall(-(width_span+1), 0, zOffset, rotateRight(), stairSide, 60); - tryPlaceCrossroadHall(-(width_span+1), 0, depth-zOffset, rotateRight(), !stairSide, 80); - - this.placeMinotaur(0, 1, depth-2, 1); + + tryPlaceCrossroadHall(0, 0, depth + 1, direction, stairSide, 0); + + tryPlaceCrossroadHall((width_span + 1), 0, zOffset, rotateLeft(), stairSide, 20); + tryPlaceCrossroadHall((width_span + 1), 0, depth - zOffset, rotateLeft(), !stairSide, 40); + + tryPlaceCrossroadHall(-(width_span + 1), 0, zOffset, rotateRight(), stairSide, 60); + tryPlaceCrossroadHall(-(width_span + 1), 0, depth - zOffset, rotateRight(), !stairSide, 80); + + this.placeMinotaur(0, 1, depth - 2, 1); this.placeMinotaur(0, 1, 2, 1); - + int w = 2, d = 3; - for(int x = -w; x <= w; x ++) - { - for(int z = -d; z <= d; z ++) - { + for (int x = -w; x <= w; x++) { + for (int z = -d; z <= d; z++) { Block block = Blocks.water; - if(z == -d || z == d || x == -w || x == w) - { + if (z == -d || z == d || x == -w || x == w) { block = BlockListMF.reinforced_stone; } - this.placeBlock(block, 0, x, 1, depth/2 + z); + this.placeBlock(block, 0, x, 1, depth / 2 + z); } } - + } - - private void placeMinotaur(int x, int y, int z, int tier) - { + + private void placeMinotaur(int x, int y, int z, int tier) { EntityMinotaur mob = new EntityMinotaur(worldObj); this.placeEntity(mob, x, y, z); mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), tier); } - protected void tryPlaceCrossroadHall(int x, int y, int z, int d, boolean stair, int delay) - { + + protected void tryPlaceCrossroadHall(int x, int y, int z, int d, boolean stair, int delay) { Class extension = stair ? StructureGenDSStairs.class : StructureGenDSHall.class; - if(extension != null) - { + if (extension != null) { mapStructure(x, y, z, d, extension, delay); } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSEntry.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSEntry.java index 5bbdb06c..b3c7dbef 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSEntry.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSEntry.java @@ -1,8 +1,6 @@ package minefantasy.mf2.mechanics.worldGen.structure.dwarven; -import minefantasy.mf2.block.decor.BlockRack; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.config.ConfigWorldGen; import minefantasy.mf2.entity.mob.EntityMinotaur; import minefantasy.mf2.entity.mob.MinotaurBreed; import minefantasy.mf2.mechanics.worldGen.structure.StructureGenAncientForge; @@ -12,94 +10,81 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -public class StructureGenDSEntry extends StructureModuleMF -{ +public class StructureGenDSEntry extends StructureModuleMF { public boolean isSurfaceBuild; - public StructureGenDSEntry(World world, StructureCoordinates position) - { + + public StructureGenDSEntry(World world, StructureCoordinates position) { super(world, position); } - public StructureGenDSEntry(World world, int x, int y, int z, int direction, boolean surface) - { + + public StructureGenDSEntry(World world, int x, int y, int z, int direction, boolean surface) { super(world, x, y, z, direction); this.isSurfaceBuild = surface; } + @Override - public void generate() - { + public void generate() { int environment = MinotaurBreed.getEnvironment(worldObj, xCoord, zCoord, 0); subtype = environment == 2 ? "Frost" : "Normal"; - + int width_span = 4; int depth = 10; int height = 5; - for(int x = -width_span; x <= width_span; x ++) - { - for(int z = 0; z <= depth; z ++) - { - //FOUNDATION + for (int x = -width_span; x <= width_span; x++) { + for (int z = 0; z <= depth; z++) { + // FOUNDATION Object[] blockarray = getFoundation(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? -1 : 0; - this.buildFoundation((Block)blockarray[0], meta, x, -1, z, 32, 4, false); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? -1 : 0; + this.buildFoundation((Block) blockarray[0], meta, x, -1, z, 32, 4, false); } - - //FLOOR + + // FLOOR blockarray = getFloor(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, 0, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, 0, z); } - //WALLS - for(int y = 1; y <= height+1; y ++) - { + // WALLS + for (int y = 1; y <= height + 1; y++) { blockarray = getWalls(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, y, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); } } - //CEILING + // CEILING blockarray = getCeiling(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height+1, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1, z); } - - //TRIM + + // TRIM blockarray = getTrim(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height+2, z); - placeBlock((Block)blockarray[0], meta, x, height, z); - if((Block)blockarray[0] == BlockListMF.reinforced_stone_framed) - { - for(int h = height-1; h > 1; h --) - { - placeBlock(BlockListMF.reinforced_stone, h==2 ? 1 : 0, x, h, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 2, z); + placeBlock((Block) blockarray[0], meta, x, height, z); + if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { + for (int h = height - 1; h > 1; h--) { + placeBlock(BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, z); } placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); } } - + } } - - //DOORWAY - for(int x = -1; x <= 1; x++) - { - for(int y = 1; y <= 3; y ++) - { + + // DOORWAY + for (int x = -1; x <= 1; x++) { + for (int y = 1; y <= 3; y++) { placeBlock(Blocks.air, 0, x, y, 0); } placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 0, -1); placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 0, -2); - + placeBlock(BlockListMF.reinforced_stone, 0, x, -1, -1); placeBlock(BlockListMF.reinforced_stone, 0, x, -1, -2); placeBlock(BlockListMF.reinforced_stone, 0, x, 0, -3); @@ -108,137 +93,118 @@ public void generate() placeBlock(BlockListMF.reinforced_stone, 0, -2, 0, -2); placeBlock(BlockListMF.reinforced_stone, 0, 2, 0, -1); placeBlock(BlockListMF.reinforced_stone, 0, 2, 0, -2); - + placeDoorway(-1, width_span, height, depth); placeDoorway(1, width_span, height, depth); - placeBlock(BlockListMF.reinforced_stone, 0, 0, height-1, -3); - placeBlock(BlockListMF.reinforced_stone, 0, 0, height, -1); - + placeBlock(BlockListMF.reinforced_stone, 0, 0, height - 1, -3); + placeBlock(BlockListMF.reinforced_stone, 0, 0, height, -1); + EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 1, depth/2); + this.placeEntity(mob, 0, 1, depth / 2); mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 1); - + this.lengthId = -99; mapStructure(0, 0, depth, StructureGenDSStairs.class); - - if(isSurfaceBuild) - { - mapStructure(-width_span, 0, depth-1, rotateRight(), StructureDSSurfaceAppendage.class); + + if (isSurfaceBuild) { + mapStructure(-width_span, 0, depth - 1, rotateRight(), StructureDSSurfaceAppendage.class); mapStructure(-width_span, 0, 2, rotateRight(), StructureDSSurfaceAppendage.class); - - mapStructure(width_span, 0, depth-1, rotateLeft(), StructureDSSurfaceAppendage.class); + + mapStructure(width_span, 0, depth - 1, rotateLeft(), StructureDSSurfaceAppendage.class); mapStructure(width_span, 0, 2, rotateLeft(), StructureDSSurfaceAppendage.class); } } - - private void placeDoorway(int mod, int width_span, int height, int depth) - { + + private void placeDoorway(int mod, int width_span, int height, int depth) { int h = height; - placeBlock(BlockListMF.reinforced_stone, 0, 3*mod, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 3*mod, 1, -2); - for(int y = 1; y < h; y ++) - { - placeBlock(BlockListMF.reinforced_stone, 0, 2*mod, y, -3); + placeBlock(BlockListMF.reinforced_stone, 0, 3 * mod, 1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 3 * mod, 1, -2); + for (int y = 1; y < h; y++) { + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, y, -3); } - placeBlock(BlockListMF.reinforced_stone, 0, 1*mod, height-1, -3); - - placeBlock(BlockListMF.reinforced_stone, 0, 2*mod, height, -3); - placeBlock(BlockListMF.reinforced_stone, 0, 2*mod, height, -2); - placeBlock(BlockListMF.reinforced_stone, 0, 1*mod, height, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 2*mod, height, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 3*mod, height, -1); - - placeBlock(BlockListMF.reinforced_stone, 0, 2*mod, height+1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 2*mod, height+2, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 2*mod, height+2, 0); + placeBlock(BlockListMF.reinforced_stone, 0, 1 * mod, height - 1, -3); + + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height, -3); + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height, -2); + placeBlock(BlockListMF.reinforced_stone, 0, 1 * mod, height, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 3 * mod, height, -1); + + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height + 1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height + 2, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height + 2, 0); } - private Object[] getTrim(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { + + private Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { return null; } - if(x == -(radius-1) || x == (radius-1)) - { - if(z == (int)Math.ceil( (float)depth / 2)) - { - return new Object[]{BlockListMF.reinforced_stone_framed, false}; + if (x == -(radius - 1) || x == (radius - 1)) { + if (z == (int) Math.ceil((float) depth / 2)) { + return new Object[] { BlockListMF.reinforced_stone_framed, false }; } } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - if((x == -(radius-1) && (z == (depth-1) || z == 1)) || (x == (radius-1) && (z == (depth-1) || z == 1))) - { - return new Object[]{BlockListMF.reinforced_stone_framed, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) + || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { + return new Object[] { BlockListMF.reinforced_stone_framed, false }; } - return new Object[]{BlockListMF.reinforced_stone, false}; + return new Object[] { BlockListMF.reinforced_stone, false }; } return null; } - private Object[] getCeiling(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { + + private Object[] getCeiling(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { return null; } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - - private Object[] getFloor(int radius, int depth, int x, int z) - { - if(z < 2 && x >= -1 && x <= 1) - { - return new Object[]{floor, false}; + + private Object[] getFloor(int radius, int depth, int x, int z) { + if (z < 2 && x >= -1 && x <= 1) { + return new Object[] { floor, false }; } - if(x == -radius || x == radius || z == depth || z == 0) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{floor, false}; + return new Object[] { floor, false }; } - - private Object[] getFoundation(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { - if(x == -radius || x == radius || x == 0) - { - if(z == depth || z == Math.ceil( (float)depth/2) || z == 0) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getFoundation(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if (x == -radius || x == radius || x == 0) { + if (z == depth || z == Math.ceil((float) depth / 2) || z == 0) { + return new Object[] { BlockListMF.reinforced_stone, false }; } } } - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - - private Object[] getWalls(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { - if((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getWalls(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - return new Object[]{Blocks.air, false}; + return new Object[] { Blocks.air, false }; } private String lootType = ChestGenHooks.DUNGEON_CHEST; - public StructureModuleMF setLoot(String loot) - { + + public StructureModuleMF setLoot(String loot) { this.lootType = loot; return this; } + private static Block floor = BlockListMF.cobble_pavement; } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSHall.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSHall.java index a89b6cac..0d9fca26 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSHall.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSHall.java @@ -10,278 +10,237 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -public class StructureGenDSHall extends StructureModuleMF -{ - public StructureGenDSHall(World world, StructureCoordinates position) - { +public class StructureGenDSHall extends StructureModuleMF { + public StructureGenDSHall(World world, StructureCoordinates position) { super(world, position); } - public StructureGenDSHall(World world, int x, int y, int z, int direction) - { + + public StructureGenDSHall(World world, int x, int y, int z, int direction) { super(world, x, y, z, direction); } + @Override - public boolean canGenerate() - { + public boolean canGenerate() { int width_span = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); int empty_spaces = 0; int filledSpaces = 0, emptySpaces = 0; - for(int x = -width_span; x <= width_span; x ++) - { - for(int y = 0; y <= height; y ++) - { - for(int z = 1; z <= depth; z ++) - { + for (int x = -width_span; x <= width_span; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { Block block = this.getBlock(x, y, z); - if(!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) - { + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { return false; } - if(!block.getMaterial().isSolid()) - { + if (!block.getMaterial().isSolid()) { ++emptySpaces; - } - else - { + } else { ++filledSpaces; } } } } - if(WorldGenDwarvenStronghold.debug_air) - { + if (WorldGenDwarvenStronghold.debug_air) { return true; } - return ((float) emptySpaces / (float)(emptySpaces+filledSpaces) ) < WorldGenDwarvenStronghold.maxAir;//at least 75% full + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full } - - private boolean allowBuildOverBlock(Block block) - { - if(block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) - { + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { return false; } return true; } + @Override - public void generate() - { + public void generate() { int width_span = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); - for(int x = -width_span; x <= width_span; x ++) - { - for(int z = 0; z <= depth; z ++) - { + for (int x = -width_span; x <= width_span; x++) { + for (int z = 0; z <= depth; z++) { Object[] blockarray; - - //FLOOR + + // FLOOR blockarray = getFloor(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, 0, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, 0, z); } - //WALLS - for(int y = 1; y <= height+1; y ++) - { + // WALLS + for (int y = 1; y <= height + 1; y++) { blockarray = getWalls(width_span, height, depth, x, y, z); - if(blockarray != null) - { + if (blockarray != null) { int meta = 0; - if(blockarray[1] instanceof Integer) - { - meta = (Integer)blockarray[1]; + if (blockarray[1] instanceof Integer) { + meta = (Integer) blockarray[1]; } - if(blockarray[1] instanceof Boolean) - { - meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + if (blockarray[1] instanceof Boolean) { + meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; } - if(blockarray[1] instanceof String) - { - meta = (String)blockarray[1]=="Hall" ? getRandomEngravedWall(rand) : 0; + if (blockarray[1] instanceof String) { + meta = (String) blockarray[1] == "Hall" ? getRandomEngravedWall(rand) : 0; } - placeBlock((Block)blockarray[0], meta, x, y, z); + placeBlock((Block) blockarray[0], meta, x, y, z); } } - //CEILING + // CEILING blockarray = getCeiling(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height+1, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1, z); } - - //TRIM + + // TRIM blockarray = getTrim(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height, z); - if((Block)blockarray[0] == BlockListMF.reinforced_stone_framed) - { - for(int h = height-1; h > 1; h --) - { - placeBlock(BlockListMF.reinforced_stone, h==2 ? 1 : 0, x, h, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height, z); + if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { + for (int h = height - 1; h > 1; h--) { + placeBlock(BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, z); } placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); } } - + } } - - //DOORWAY + + // DOORWAY buildDoorway(width_span, depth, height); - - if(lengthId > 0) - { + + if (lengthId > 0) { buildNext(width_span, depth, height); - } - else - { + } else { mapStructure(0, 0, depth, StructureGenDSRoom.class); } - if(rand.nextInt(3) != 0) - { - tryPlaceMinorRoom((width_span), 0, (int)Math.floor((float) depth / 2), rotateLeft()); + if (rand.nextInt(3) != 0) { + tryPlaceMinorRoom((width_span), 0, (int) Math.floor((float) depth / 2), rotateLeft()); } - if(rand.nextInt(3) != 0) - { - tryPlaceMinorRoom(-(width_span), 0, (int)Math.floor((float) depth / 2), rotateRight()); + if (rand.nextInt(3) != 0) { + tryPlaceMinorRoom(-(width_span), 0, (int) Math.floor((float) depth / 2), rotateRight()); } - if(this instanceof StructureGenDSIntersection || this.lengthId % 2 == 0) - { - placeBlock(Blocks.glowstone, 0, 0, height+1, depth/2); + if (this instanceof StructureGenDSIntersection || this.lengthId % 2 == 0) { + placeBlock(Blocks.glowstone, 0, 0, height + 1, depth / 2); } } - - protected void buildDoorway(int width_span, int depth, int height) - { - for(int x = -1; x <= 1; x++) - { - for(int y = 1; y <= 3; y ++) - { - for(int z = 0; z >= -1; z --) - { + + protected void buildDoorway(int width_span, int depth, int height) { + for (int x = -1; x <= 1; x++) { + for (int y = 1; y <= 3; y++) { + for (int z = 0; z >= -1; z--) { placeBlock(Blocks.air, 0, x, y, z); } } } } - protected void buildNext(int width_span, int depth, int height) - { + + protected void buildNext(int width_span, int depth, int height) { tryPlaceHall(0, 0, depth, direction); } - protected void tryPlaceHall(int x, int y, int z, int d) - { + + protected void tryPlaceHall(int x, int y, int z, int d) { Class extension = getRandomExtension(); - if(extension != null) - { + if (extension != null) { mapStructure(x, y, z, d, extension); } } - - protected void tryPlaceMinorRoom(int x, int y, int z, int d) - { + + protected void tryPlaceMinorRoom(int x, int y, int z, int d) { Class extension = getRandomMinorRoom(); - if(extension != null) - { + if (extension != null) { mapStructure(x, y, z, d, extension); } } + protected int getHeight() { return 4; } + protected int getDepthSpan() { return 9; } + protected int getWidthSpan() { return 3; } - protected Class getRandomMinorRoom() - { + + protected Class getRandomMinorRoom() { return StructureGenDSRoomSml.class; } - protected Class getRandomExtension() - { - if(lengthId == 1) - { + + protected Class getRandomExtension() { + if (lengthId == 1) { return StructureGenDSRoom.class; } - if(deviationCount > 0 && rand.nextInt(4) == 0) - { + if (deviationCount > 0 && rand.nextInt(4) == 0) { return StructureGenDSIntersection.class; } - if( rand.nextInt(16) == 0 && this.yCoord >= StructureGenDSStairs.minLevel) - { + if (rand.nextInt(16) == 0 && this.yCoord >= StructureGenDSStairs.minLevel) { return StructureGenDSStairs.class; } return StructureGenDSHall.class; } - protected Object[] getTrim(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius) - { + + protected Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius) { return null; } - - if(x == -(radius-1) || x == (radius-1)) - { - if(z == Math.floor( (float)depth/2)) - { - return new Object[]{BlockListMF.reinforced_stone_framed, false}; + + if (x == -(radius - 1) || x == (radius - 1)) { + if (z == Math.floor((float) depth / 2)) { + return new Object[] { BlockListMF.reinforced_stone_framed, false }; } - return new Object[]{BlockListMF.reinforced_stone, false}; + return new Object[] { BlockListMF.reinforced_stone, false }; } return null; } - protected Object[] getCeiling(int radius, int depth, int x, int z) - { - return x == 0 ? new Object[]{BlockListMF.reinforced_stone, false} : new Object[]{BlockListMF.reinforced_stone_bricks, true}; + + protected Object[] getCeiling(int radius, int depth, int x, int z) { + return x == 0 ? new Object[] { BlockListMF.reinforced_stone, false } + : new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - - protected Object[] getFloor(int radius, int depth, int x, int z) - { - if(x >= -1 && x <= 1) - { - return new Object[]{floor, false}; + + protected Object[] getFloor(int radius, int depth, int x, int z) { + if (x >= -1 && x <= 1) { + return new Object[] { floor, false }; } - if(x == -radius || x == radius || z == depth || z == 0) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{floor, false}; + return new Object[] { floor, false }; } - - protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) - { - if(x != -radius && x != radius && z == 0) - { - return new Object[]{Blocks.air, false}; + + protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) { + if (x != -radius && x != radius && z == 0) { + return new Object[] { Blocks.air, false }; } - if(x == -radius || x == radius || z == depth) - { - return y == height/2 ? new Object[]{BlockListMF.reinforced_stone, "Hall"} : new Object[]{BlockListMF.reinforced_stone_bricks, true}; + if (x == -radius || x == radius || z == depth) { + return y == height / 2 ? new Object[] { BlockListMF.reinforced_stone, "Hall" } + : new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - return new Object[]{Blocks.air, false}; + return new Object[] { Blocks.air, false }; } protected String lootType = ChestGenHooks.DUNGEON_CHEST; - public StructureModuleMF setLoot(String loot) - { + + public StructureModuleMF setLoot(String loot) { this.lootType = loot; return this; } + protected static Block floor = BlockListMF.cobble_pavement; - public static int getRandomEngravedWall(Random rand) - { + + public static int getRandomEngravedWall(Random rand) { return 2 + rand.nextInt(3); } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSIntersection.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSIntersection.java index 700abde8..9836aa2f 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSIntersection.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSIntersection.java @@ -7,164 +7,137 @@ import net.minecraft.init.Blocks; import net.minecraft.world.World; -public class StructureGenDSIntersection extends StructureGenDSHall -{ +public class StructureGenDSIntersection extends StructureGenDSHall { - public StructureGenDSIntersection(World world, StructureCoordinates position) - { + public StructureGenDSIntersection(World world, StructureCoordinates position) { super(world, position); } + @Override - protected void buildNext(int width_span, int depth, int height) - { + protected void buildNext(int width_span, int depth, int height) { --deviationCount; int offset = 0; boolean[] intersection = getRandomIntersectionPattern(); - if(intersection[0]) - { - tryPlaceHall(0, 0, depth+offset, direction); + if (intersection[0]) { + tryPlaceHall(0, 0, depth + offset, direction); } - if(intersection[1]) - { - tryPlaceHall(-(width_span+offset), 0, (int)Math.floor((float)depth/2), rotateRight()); + if (intersection[1]) { + tryPlaceHall(-(width_span + offset), 0, (int) Math.floor((float) depth / 2), rotateRight()); } - if(intersection[2]) - { - tryPlaceHall((width_span+offset), 0, (int)Math.floor((float)depth/2), rotateLeft()); + if (intersection[2]) { + tryPlaceHall((width_span + offset), 0, (int) Math.floor((float) depth / 2), rotateLeft()); } } - private boolean[] getRandomIntersectionPattern() - { - boolean [][] groups = new boolean[][] - { - new boolean[]{true, true, true}, - new boolean[]{true, true, false}, - new boolean[]{true, false, true}, - new boolean[]{false, true, true}, - }; - + + private boolean[] getRandomIntersectionPattern() { + boolean[][] groups = new boolean[][] { new boolean[] { true, true, true }, new boolean[] { true, true, false }, + new boolean[] { true, false, true }, new boolean[] { false, true, true }, }; + return groups[rand.nextInt(groups.length)]; } + @Override - protected int getHeight() - { + protected int getHeight() { return 4; } + @Override - protected int getDepthSpan() - { + protected int getDepthSpan() { return 8; } + @Override - protected int getWidthSpan() - { + protected int getWidthSpan() { return 4; } - protected void tryPlaceMinorRoom(int x, int y, int z, int d) - { + protected void tryPlaceMinorRoom(int x, int y, int z, int d) { } + @Override - protected Object[] getTrim(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { + protected Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { return null; } - - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - if((x == -(radius-1) && (z == (depth-1) || z == 1)) || (x == (radius-1) && (z == (depth-1) || z == 1))) - { - return new Object[]{BlockListMF.reinforced_stone_framed, false}; + + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) + || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { + return new Object[] { BlockListMF.reinforced_stone_framed, false }; } - return new Object[]{BlockListMF.reinforced_stone, false}; + return new Object[] { BlockListMF.reinforced_stone, false }; } return null; } + @Override - protected Object[] getCeiling(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { + protected Object[] getCeiling(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { return null; } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } + @Override - protected Object[] getFloor(int radius, int depth, int x, int z) - { - if(z == 0 && x >= -1 && x <= 1) - { - return new Object[]{floor, false}; + protected Object[] getFloor(int radius, int depth, int x, int z) { + if (z == 0 && x >= -1 && x <= 1) { + return new Object[] { floor, false }; } - if(x == -radius || x == radius || z == depth || z == 0) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{floor, false}; + return new Object[] { floor, false }; } - + @Override - protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { - if((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - - return y == height/2 ? new Object[]{BlockListMF.reinforced_stone, "Hall"} : new Object[]{BlockListMF.reinforced_stone_bricks, true}; + + return y == height / 2 ? new Object[] { BlockListMF.reinforced_stone, "Hall" } + : new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - return new Object[]{Blocks.air, false}; + return new Object[] { Blocks.air, false }; } - + @Override - protected void buildDoorway(int width_span, int depth, int height) - { - for(int x = -2; x <= 2; x++) - { - for(int y = 1; y <= 3; y ++) - { - for(int z = 0; z >= -1; z --) - { + protected void buildDoorway(int width_span, int depth, int height) { + for (int x = -2; x <= 2; x++) { + for (int y = 1; y <= 3; y++) { + for (int z = 0; z >= -1; z--) { placeBlock(Blocks.air, 0, x, y, z); } } } - for(int x = -1; x <= 1; x++) - { - for(int z = 0; z >= -1; z --) - { + for (int x = -1; x <= 1; x++) { + for (int z = 0; z >= -1; z--) { placeBlock(Blocks.air, 0, x, 4, z); } } - + placeBlock(BlockListMF.reinforced_stone, 0, -2, 4, 0); - placeBlock(BlockListMF.reinforced_stone, 0, 2, 4, 0); - + placeBlock(BlockListMF.reinforced_stone, 0, 2, 4, 0); + EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 0, depth/2); + this.placeEntity(mob, 0, 0, depth / 2); mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 1); } - + @Override - protected Class getRandomExtension() - { - if(lengthId == 1) - { + protected Class getRandomExtension() { + if (lengthId == 1) { return StructureGenDSRoom.class; } - return (yCoord >= StructureGenDSStairs.minLevel && rand.nextInt(3) == 0) ? StructureGenDSStairs.class : StructureGenDSHall.class; + return (yCoord >= StructureGenDSStairs.minLevel && rand.nextInt(3) == 0) ? StructureGenDSStairs.class + : StructureGenDSHall.class; } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoom.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoom.java index 201dc5f4..b2c6f446 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoom.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoom.java @@ -24,579 +24,505 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -public class StructureGenDSRoom extends StructureModuleMF -{ +public class StructureGenDSRoom extends StructureModuleMF { private String type = "Basic"; - private static final String[] possible_types = new String[]{"Living","Forge","Study","Armoury"}; - public StructureGenDSRoom(World world, StructureCoordinates position) - { + private static final String[] possible_types = new String[] { "Living", "Forge", "Study", "Armoury" }; + + public StructureGenDSRoom(World world, StructureCoordinates position) { super(world, position); randomiseType(); } - public StructureGenDSRoom(World world, int x, int y, int z, int direction) - { + + public StructureGenDSRoom(World world, int x, int y, int z, int direction) { super(world, x, y, z, direction); randomiseType(); } - private void randomiseType() - { + + private void randomiseType() { type = geRandomType(); } + /** - * @return - * 10% for Armoury----20& for Forge----30% for Study----40% for Living + * @return 10% for Armoury----20& for Forge----30% for Study----40% for Living */ - private String geRandomType() - { + private String geRandomType() { int c = rand.nextInt(10); - if(c == 0)return "Armoury";//0 (10%) - else if(c < 3) return "Forge";//1,2 (20%) - else if(c < 6) return "Study";//3,4,5 (30%) - - return "Living";//6,7,8,9 (40%) + if (c == 0) + return "Armoury";// 0 (10%) + else if (c < 3) + return "Forge";// 1,2 (20%) + else if (c < 6) + return "Study";// 3,4,5 (30%) + + return "Living";// 6,7,8,9 (40%) } + @Override - public boolean canGenerate() - { + public boolean canGenerate() { int width_span = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); int filledSpaces = 0, emptySpaces = 0; - for(int x = -width_span; x <= width_span; x ++) - { - for(int y = 0; y <= height; y ++) - { - for(int z = 1; z <= depth; z ++) - { + for (int x = -width_span; x <= width_span; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { Block block = this.getBlock(x, y, z); - if(!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) - { + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { return false; } - if(!block.getMaterial().isSolid()) - { + if (!block.getMaterial().isSolid()) { ++emptySpaces; - } - else - { + } else { ++filledSpaces; } } } } - if(WorldGenDwarvenStronghold.debug_air) - { + if (WorldGenDwarvenStronghold.debug_air) { return true; } - return ((float) emptySpaces / (float)(emptySpaces+filledSpaces) ) < WorldGenDwarvenStronghold.maxAir;//at least 75% full + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full } - - private boolean allowBuildOverBlock(Block block) - { - if(block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) - { + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { return false; } return true; } + @Override - public void generate() - { + public void generate() { int width_span = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); - for(int x = -width_span; x <= width_span; x ++) - { - for(int z = 0; z <= depth; z ++) - { + for (int x = -width_span; x <= width_span; x++) { + for (int z = 0; z <= depth; z++) { Object[] blockarray; - //FLOOR + // FLOOR blockarray = getFloor(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, 0, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, 0, z); } - //WALLS - for(int y = 1; y <= height+1; y ++) - { + // WALLS + for (int y = 1; y <= height + 1; y++) { blockarray = getWalls(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, y, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); } } - //CEILING + // CEILING blockarray = getCeiling(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height+1, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1, z); } - - //TRIM + + // TRIM blockarray = getTrim(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height, z); - if((Block)blockarray[0] == BlockListMF.reinforced_stone_framed) - { - for(int h = height-1; h > 1; h --) - { - placeBlock(h == 4 ? Blocks.glowstone : BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height, z); + if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { + for (int h = height - 1; h > 1; h--) { + placeBlock(h == 4 ? Blocks.glowstone : BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, + z); } placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); } } - + } } - - //DOORWAY + + // DOORWAY buildDoorway(width_span, depth, height); - - if(type.equalsIgnoreCase("Living")) - { + + if (type.equalsIgnoreCase("Living")) { generateLivingHub(); } - if(type.equalsIgnoreCase("Armoury")) - { + if (type.equalsIgnoreCase("Armoury")) { generateArmoury(); } - if(type.equalsIgnoreCase("Forge")) - { + if (type.equalsIgnoreCase("Forge")) { generateForge(); } - if(type.equalsIgnoreCase("Study")) - { + if (type.equalsIgnoreCase("Study")) { generateStudy(); } } - - protected void buildDoorway(int width_span, int depth, int height) - { - for(int x = -1; x <= 1; x++) - { - for(int y = 1; y <= 3; y ++) - { - for(int z = 0; z >= -1; z --) - { + + protected void buildDoorway(int width_span, int depth, int height) { + for (int x = -1; x <= 1; x++) { + for (int y = 1; y <= 3; y++) { + for (int z = 0; z >= -1; z--) { placeBlock(Blocks.air, 0, x, y, z); } } } } - protected void tryPlaceHall(int x, int y, int z, int d) - { + + protected void tryPlaceHall(int x, int y, int z, int d) { Class extension = getRandomExtension(); - if(extension != null) - { + if (extension != null) { mapStructure(x, y, z, d, extension); } } - protected int getHeight() - { - if(type.equalsIgnoreCase("Forge")) - { + + protected int getHeight() { + if (type.equalsIgnoreCase("Forge")) { return 7; } return 5; } - protected int getDepthSpan() - { - if(type.equalsIgnoreCase("Living")) - { + + protected int getDepthSpan() { + if (type.equalsIgnoreCase("Living")) { return 19; } return 13; } - protected int getWidthSpan() - { + + protected int getWidthSpan() { return 5; } - protected Class getRandomExtension() - { - if(rand.nextInt(4) == 0) - { + + protected Class getRandomExtension() { + if (rand.nextInt(4) == 0) { return StructureGenDSIntersection.class; } - if( rand.nextInt(8) == 0 && this.yCoord > 24) - { + if (rand.nextInt(8) == 0 && this.yCoord > 24) { return StructureGenDSStairs.class; } return StructureGenDSRoom.class; } - - - private Object[] getTrim(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { + + private Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { return null; } - if(x == -(radius-1) || x == (radius-1)) - { - if(z == (int)Math.ceil( (float)depth / 2) || z == (int)Math.floor( (float)depth / 2)) - { - return new Object[]{BlockListMF.reinforced_stone_framed, false}; + if (x == -(radius - 1) || x == (radius - 1)) { + if (z == (int) Math.ceil((float) depth / 2) || z == (int) Math.floor((float) depth / 2)) { + return new Object[] { BlockListMF.reinforced_stone_framed, false }; } } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - if((x == -(radius-1) && (z == (depth-1) || z == 1)) || (x == (radius-1) && (z == (depth-1) || z == 1))) - { - return new Object[]{BlockListMF.reinforced_stone_framed, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) + || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { + return new Object[] { BlockListMF.reinforced_stone_framed, false }; } - return new Object[]{BlockListMF.reinforced_stone, false}; + return new Object[] { BlockListMF.reinforced_stone, false }; } return null; } - private Object[] getCeiling(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { + + private Object[] getCeiling(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { return null; } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - - private Object[] getFloor(int radius, int depth, int x, int z) - { - if(type.equalsIgnoreCase("Living") || type.equalsIgnoreCase("Study")) - { + + private Object[] getFloor(int radius, int depth, int x, int z) { + if (type.equalsIgnoreCase("Living") || type.equalsIgnoreCase("Study")) { floor_block = BlockListMF.refined_planks; - if(x > -2 && x < 2 && z > 3 && z < (depth-3)) - { + if (x > -2 && x < 2 && z > 3 && z < (depth - 3)) { floor_block = Blocks.obsidian; } } - if(z < 2 && x >= -1 && x <= 1) - { - return new Object[]{floor_block, false}; + if (z < 2 && x >= -1 && x <= 1) { + return new Object[] { floor_block, false }; } - if(x == -radius || x == radius || z == depth || z == 0) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{floor_block, false}; + return new Object[] { floor_block, false }; } - - private Object[] getWalls(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius || z == depth || z == 0) - { - if((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getWalls(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - return new Object[]{Blocks.air, false}; + return new Object[] { Blocks.air, false }; } protected String lootType = ChestGenHooks.DUNGEON_CHEST; - public StructureModuleMF setLoot(String loot) - { + + public StructureModuleMF setLoot(String loot) { this.lootType = loot; return this; } + protected Block floor_block = BlockListMF.cobble_pavement; - - public void generateLivingHub() - { + + public void generateLivingHub() { int width_span = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); - + int zOffset = 4; - + boolean hall1 = rand.nextInt(3) == 0, hall2 = rand.nextInt(3) == 0, hall3 = rand.nextInt(3) == 0; - int offset1 = hall1 ? width_span+1 : width_span; - int offset2 = hall2 ? -(width_span+1) : -width_span; - int offset3 = hall3 ? depth+1 : depth; - + int offset1 = hall1 ? width_span + 1 : width_span; + int offset2 = hall2 ? -(width_span + 1) : -width_span; + int offset3 = hall3 ? depth + 1 : depth; + tryPlaceMinorRoom(width_span, 0, zOffset, rotateLeft(), false); - tryPlaceMinorRoom(offset1, 0, depth-zOffset, rotateLeft(), hall1); - + tryPlaceMinorRoom(offset1, 0, depth - zOffset, rotateLeft(), hall1); + tryPlaceMinorRoom(-width_span, 0, zOffset, rotateRight(), false); - tryPlaceMinorRoom(offset2, 0, depth-zOffset, rotateRight(), hall2); + tryPlaceMinorRoom(offset2, 0, depth - zOffset, rotateRight(), hall2); tryPlaceMinorRoom(0, 0, offset3, direction, hall3); - //this.placeSpawner(0, 1, depth-5); - + // this.placeSpawner(0, 1, depth-5); + EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 1, depth-5); + this.placeEntity(mob, 0, 1, depth - 5); mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 1); - + } - - public void generateStudy() - { + + public void generateStudy() { int width = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); - - for(int z = 0; z < depth; z ++) - { + + for (int z = 0; z < depth; z++) { int ystart = 1; - if(z == (int)Math.ceil((float)depth/2)+1 || z == (int)Math.floor((float)depth/2)-1) - { + if (z == (int) Math.ceil((float) depth / 2) + 1 || z == (int) Math.floor((float) depth / 2) - 1) { ystart = 3; - placeChest(-(width-1), 1, z, rotateLeft(), LootTypes.DWARVEN_STUDY); - placeChest(width-1, 1, z, rotateRight(), LootTypes.DWARVEN_STUDY); + placeChest(-(width - 1), 1, z, rotateLeft(), LootTypes.DWARVEN_STUDY); + placeChest(width - 1, 1, z, rotateRight(), LootTypes.DWARVEN_STUDY); } - for(int y = ystart; y < height; y ++) - { - if(getBlock(-(width-1), y, z).getMaterial().isReplaceable()) - { - placeBlock(Blocks.bookshelf, 0, -(width-1), y, z); + for (int y = ystart; y < height; y++) { + if (getBlock(-(width - 1), y, z).getMaterial().isReplaceable()) { + placeBlock(Blocks.bookshelf, 0, -(width - 1), y, z); } - if(getBlock(width-1, y, z).getMaterial().isReplaceable()) - { - placeBlock(Blocks.bookshelf, 0, width-1, y, z); + if (getBlock(width - 1, y, z).getMaterial().isReplaceable()) { + placeBlock(Blocks.bookshelf, 0, width - 1, y, z); } } } - for(int x = 0; x < 3; x ++) - { - placeBlock(Blocks.double_stone_slab, 0, -1+x, 1, (int)Math.floor((float)depth/2)-1); - placeBlock(Blocks.double_stone_slab, 0, -1+x, 1, (int)Math.ceil((float)depth/2)+1); + for (int x = 0; x < 3; x++) { + placeBlock(Blocks.double_stone_slab, 0, -1 + x, 1, (int) Math.floor((float) depth / 2) - 1); + placeBlock(Blocks.double_stone_slab, 0, -1 + x, 1, (int) Math.ceil((float) depth / 2) + 1); } - placeBlock(BlockListMF.schematic_general, 0, 0, 2, (int)Math.floor((float)depth/2)-1); - placeBlock(BlockListMF.schematic_general, 1, 0, 2, (int)Math.ceil((float)depth/2)+1); - //this.placeSpawner(0, 1, depth/2, "Silverfish"); + placeBlock(BlockListMF.schematic_general, 0, 0, 2, (int) Math.floor((float) depth / 2) - 1); + placeBlock(BlockListMF.schematic_general, 1, 0, 2, (int) Math.ceil((float) depth / 2) + 1); + // this.placeSpawner(0, 1, depth/2, "Silverfish"); EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 1, depth/2); + this.placeEntity(mob, 0, 1, depth / 2); mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 2); } - - public void generateArmoury() - { + + public void generateArmoury() { int width = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); - - for(int y = 1; y <= 4; y ++) - { - placeBlock(BlockListMF.frame_block, 0, 0, y, depth-1); - - placeBlock(BlockListMF.frame_block, 0, -1, y, depth-2); - placeBlock(BlockListMF.frame_block, 0, 1, y, depth-2); - } - placeBlock(BlockListMF.cogwork_builder, 0, 0, 4, depth-2); - - int z = (int)Math.ceil( (float)depth / 2); - for(int x = -width; x <= width; x ++) - { - placeBlock(x == 0 ? BlockListMF.reinforced_stone_framediron : BlockListMF.reinforced_stone, 0, x, height, z); - if(x <-1 || x > 1) - { - if(getBlock(x, 1, z).getMaterial().isReplaceable()) - { - Block block = (x==-2 || x==2) ? BlockListMF.reinforced_stone_framed : BlockListMF.reinforced_stone; + + for (int y = 1; y <= 4; y++) { + placeBlock(BlockListMF.frame_block, 0, 0, y, depth - 1); + + placeBlock(BlockListMF.frame_block, 0, -1, y, depth - 2); + placeBlock(BlockListMF.frame_block, 0, 1, y, depth - 2); + } + placeBlock(BlockListMF.cogwork_builder, 0, 0, 4, depth - 2); + + int z = (int) Math.ceil((float) depth / 2); + for (int x = -width; x <= width; x++) { + placeBlock(x == 0 ? BlockListMF.reinforced_stone_framediron : BlockListMF.reinforced_stone, 0, x, height, + z); + if (x < -1 || x > 1) { + if (getBlock(x, 1, z).getMaterial().isReplaceable()) { + Block block = (x == -2 || x == 2) ? BlockListMF.reinforced_stone_framed + : BlockListMF.reinforced_stone; placeBlock(block, 0, x, 1, z); } } - for(int y = 2; y < height; y ++) - { - if(x <-1 || x > 1 || y > 3) - { - if(getBlock(x, y, z).getMaterial().isReplaceable()) - { + for (int y = 2; y < height; y++) { + if (x < -1 || x > 1 || y > 3) { + if (getBlock(x, y, z).getMaterial().isReplaceable()) { placeBlock(BlockListMF.bars[0], 0, x, y, z); } } } } - placeChest(-(width-2), 1, z-1, direction, LootTypes.DWARVEN_ARMOURY); - placeChest(-(width-3), 1, z-1, direction, LootTypes.DWARVEN_ARMOURY); - placeChest((width-2), 1, z-1, direction, LootTypes.DWARVEN_ARMOURY); - placeChest((width-3), 1, z-1, direction, LootTypes.DWARVEN_ARMOURY); - - for(int z1 = 1; z1 < z; z1 ++) - { - for(int y = 1; y < height; y ++) - { - if(getBlock(-(width-1), y, z1).getMaterial().isReplaceable()) - { - if(y == 1 || y == 3) - { - placeAmmoBox(-(width-1), y, z1, rotateRight(), LootTypes.DWARVEN_AMMO); - } - else - { - placeBlock(Blocks.stone_slab, 11, -(width-1), y, z1); + placeChest(-(width - 2), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); + placeChest(-(width - 3), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); + placeChest((width - 2), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); + placeChest((width - 3), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); + + for (int z1 = 1; z1 < z; z1++) { + for (int y = 1; y < height; y++) { + if (getBlock(-(width - 1), y, z1).getMaterial().isReplaceable()) { + if (y == 1 || y == 3) { + placeAmmoBox(-(width - 1), y, z1, rotateRight(), LootTypes.DWARVEN_AMMO); + } else { + placeBlock(Blocks.stone_slab, 11, -(width - 1), y, z1); } } - if(getBlock((width-1), y, z1).getMaterial().isReplaceable()) - { - if(y == 1 || y == 3) - { - placeAmmoBox((width-1), y, z1, rotateLeft(), LootTypes.DWARVEN_AMMO); - } - else - { - placeBlock(Blocks.stone_slab, 11, (width-1), y, z1); + if (getBlock((width - 1), y, z1).getMaterial().isReplaceable()) { + if (y == 1 || y == 3) { + placeAmmoBox((width - 1), y, z1, rotateLeft(), LootTypes.DWARVEN_AMMO); + } else { + placeBlock(Blocks.stone_slab, 11, (width - 1), y, z1); } } } } - for(int z1 = 0; z1 < 4; z1 ++) - { - placeRack((width-1), 2, depth-2-z1, rotateRight()); - placeRack(-(width-1), 2, depth-2-z1, rotateLeft()); + for (int z1 = 0; z1 < 4; z1++) { + placeRack((width - 1), 2, depth - 2 - z1, rotateRight()); + placeRack(-(width - 1), 2, depth - 2 - z1, rotateLeft()); } - placeBlock(BlockListMF.schematic_general, 3, -2, 2, depth-1); - placeBlock(BlockListMF.schematic_general, 4, 2, 2, depth-1); - placeBlock(BlockListMF.reinforced_stone, 0, -2, 1, depth-1); - placeBlock(BlockListMF.reinforced_stone, 0, 2, 1, depth-1); + placeBlock(BlockListMF.schematic_general, 3, -2, 2, depth - 1); + placeBlock(BlockListMF.schematic_general, 4, 2, 2, depth - 1); + placeBlock(BlockListMF.reinforced_stone, 0, -2, 1, depth - 1); + placeBlock(BlockListMF.reinforced_stone, 0, 2, 1, depth - 1); EntityMinotaur mob = new EntityMinotaur(worldObj); this.placeEntity(mob, 0, 1, z); mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 3); } - - private void placeRack(int x, int y, int z, int newDirection) - { + + private void placeRack(int x, int y, int z, int newDirection) { placeBlock(BlockListMF.rack_wood, BlockRack.getDirection(newDirection), x, y, z); TileEntity tile = this.getTileEntity(x, y, z, direction); - if(tile != null && tile instanceof TileEntityRack) - { - setupRack((TileEntityRack)tile); + if (tile != null && tile instanceof TileEntityRack) { + setupRack((TileEntityRack) tile); } } - private void setupRack(TileEntityRack rack) - { + + private void setupRack(TileEntityRack rack) { rack.setMaterial(CustomMaterial.getMaterial("ScrapWood")); - ItemWeaponMF[] items = new ItemWeaponMF[]{CustomToolListMF.standard_sword, CustomToolListMF.standard_waraxe, CustomToolListMF.standard_mace, CustomToolListMF.standard_dagger}; - for(int i = 0; i < rack.getSizeInventory(); i ++) - { - if(rand.nextInt(3) != 0) - { + ItemWeaponMF[] items = new ItemWeaponMF[] { CustomToolListMF.standard_sword, CustomToolListMF.standard_waraxe, + CustomToolListMF.standard_mace, CustomToolListMF.standard_dagger }; + for (int i = 0; i < rack.getSizeInventory(); i++) { + if (rand.nextInt(3) != 0) { ItemWeaponMF loot = items[rand.nextInt(items.length)]; rack.setInventorySlotContents(i, loot.construct("Iron", "ScrapWood")); } } } - private void generateForge() - { + + private void generateForge() { boolean reverseForge = rand.nextBoolean(); int width = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); - int z = (int)Math.ceil( (float)depth / 2); - + int z = (int) Math.ceil((float) depth / 2); + int position = reverseForge ? -1 : 1; - - placeBlock(BlockListMF.chimney_stone_extractor, 0, (width*position), 2, z); - placeBlock(BlockListMF.chimney_stone_extractor, 0, (width*position), 2, z-1); - placeBlock(BlockListMF.chimney_pipe, 0, (width*position), 3, z); - placeBlock(BlockListMF.chimney_pipe, 0, (width*position), 3, z-1); - placeBlock(BlockListMF.chimney_pipe, 0, (width*position), 3, z+1); - placeBlock(BlockListMF.chimney_pipe, 0, (width*position), 3, z+2); - placeBlock(BlockListMF.chimney_pipe, 0, ( (width-1)*position), 3, z+2); - placeBlock(BlockListMF.chimney_pipe, 0, ( (width-1)*position), 4, z+2); - placeBlock(BlockListMF.chimney_pipe, 0, ( (width-1)*position), 5, z+2); - + + placeBlock(BlockListMF.chimney_stone_extractor, 0, (width * position), 2, z); + placeBlock(BlockListMF.chimney_stone_extractor, 0, (width * position), 2, z - 1); + placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z); + placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z - 1); + placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z + 1); + placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z + 2); + placeBlock(BlockListMF.chimney_pipe, 0, ((width - 1) * position), 3, z + 2); + placeBlock(BlockListMF.chimney_pipe, 0, ((width - 1) * position), 4, z + 2); + placeBlock(BlockListMF.chimney_pipe, 0, ((width - 1) * position), 5, z + 2); + int chestFacing = position < 0 ? rotateLeft() : rotateRight(); - placeChest((-(width-2)*position), 1, z, chestFacing, LootTypes.DWARVEN_FORGE); - placeChest((-(width-2)*position), 1, z-1, chestFacing, LootTypes.DWARVEN_FORGE); - - placeBlock(BlockListMF.forge, 0, ( (width-1)*position), 1, z); - placeBlock(BlockListMF.forge, 0, ( (width-1)*position), 1, z-1); - placeBlock(Blocks.air, 0, ( (width-1)*position), 2, z); - placeBlock(Blocks.air, 0, ( (width-1)*position), 2, z-1); - - placeBlock(BlockListMF.schematic_general, 2,( (width-1)*position), 2, z+2); - placeBlock(BlockListMF.schematic_general, 5,( (width-1)*position), 2, z-3); - placeBlock(BlockListMF.reinforced_stone, 0, ( (width-1)*position), 1, z+2); - placeBlock(BlockListMF.reinforced_stone, 0, ( (width-1)*position), 1, z-3); - - placeBlock(BlockListMF.reinforced_stone_framed, 0, ( (width-1)*position), 1, z-2); - placeBlock(BlockListMF.reinforced_stone_framed, 0, ( (width-1)*position), 1, z+1); - placeBlock(BlockListMF.reinforced_stone, 0, ( (width-1)*position), 2, z-2); - placeBlock(BlockListMF.reinforced_stone, 0, ( (width-1)*position), 2, z+1); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, ( (width-1)*position), 3, z-2); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, ( (width-1)*position), 3, z+1); - - placeBlock(BlockListMF.anvil[1], rotateLeft(), position*2, 1, z); - placeBlock(Blocks.cauldron, 0, position*2, 1, z-1); - - placeMiscMachine1(-(width-2)*position, 0, depth-3); - placeMiscMachine1(-(width-2)*position, 0, 3); - //this.placeSpawner(0, 1, depth/2); - + placeChest((-(width - 2) * position), 1, z, chestFacing, LootTypes.DWARVEN_FORGE); + placeChest((-(width - 2) * position), 1, z - 1, chestFacing, LootTypes.DWARVEN_FORGE); + + placeBlock(BlockListMF.forge, 0, ((width - 1) * position), 1, z); + placeBlock(BlockListMF.forge, 0, ((width - 1) * position), 1, z - 1); + placeBlock(Blocks.air, 0, ((width - 1) * position), 2, z); + placeBlock(Blocks.air, 0, ((width - 1) * position), 2, z - 1); + + placeBlock(BlockListMF.schematic_general, 2, ((width - 1) * position), 2, z + 2); + placeBlock(BlockListMF.schematic_general, 5, ((width - 1) * position), 2, z - 3); + placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 1, z + 2); + placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 1, z - 3); + + placeBlock(BlockListMF.reinforced_stone_framed, 0, ((width - 1) * position), 1, z - 2); + placeBlock(BlockListMF.reinforced_stone_framed, 0, ((width - 1) * position), 1, z + 1); + placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 2, z - 2); + placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 2, z + 1); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, ((width - 1) * position), 3, z - 2); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, ((width - 1) * position), 3, z + 1); + + placeBlock(BlockListMF.anvil[1], rotateLeft(), position * 2, 1, z); + placeBlock(Blocks.cauldron, 0, position * 2, 1, z - 1); + + placeMiscMachine1(-(width - 2) * position, 0, depth - 3); + placeMiscMachine1(-(width - 2) * position, 0, 3); + // this.placeSpawner(0, 1, depth/2); + EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 1, depth/2); + this.placeEntity(mob, 0, 1, depth / 2); mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 2); - + } - - private void placeMiscMachine1(int x, int y, int z) - { + + private void placeMiscMachine1(int x, int y, int z) { placeBlock(Blocks.lava, 0, x, y, z); - placeBlock(BlockListMF.reinforced_stone_framed, 0, x-1, y+1, z-1); - placeBlock(BlockListMF.reinforced_stone_framed, 0, x-1, y+1, z+1); - placeBlock(BlockListMF.reinforced_stone_framed, 0, x+1, y+1, z-1); - placeBlock(BlockListMF.reinforced_stone_framed, 0, x+1, y+1, z+1); - placeBlock(BlockListMF.reinforced_stone, 0, x-1, y+2, z-1); - placeBlock(BlockListMF.reinforced_stone, 0, x-1, y+2, z+1); - placeBlock(BlockListMF.reinforced_stone, 0, x+1, y+2, z-1); - placeBlock(BlockListMF.reinforced_stone, 0, x+1, y+2, z+1); - placeBlock(BlockListMF.reinforced_stone, 0, x, y+2, z); - placeBlock(BlockListMF.reinforced_stone, 0, x, y+3, z); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, x+1, y+2, z); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, x-1, y+2, z); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, x, y+2, z+1); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, x, y+2, z-1); - + placeBlock(BlockListMF.reinforced_stone_framed, 0, x - 1, y + 1, z - 1); + placeBlock(BlockListMF.reinforced_stone_framed, 0, x - 1, y + 1, z + 1); + placeBlock(BlockListMF.reinforced_stone_framed, 0, x + 1, y + 1, z - 1); + placeBlock(BlockListMF.reinforced_stone_framed, 0, x + 1, y + 1, z + 1); + placeBlock(BlockListMF.reinforced_stone, 0, x - 1, y + 2, z - 1); + placeBlock(BlockListMF.reinforced_stone, 0, x - 1, y + 2, z + 1); + placeBlock(BlockListMF.reinforced_stone, 0, x + 1, y + 2, z - 1); + placeBlock(BlockListMF.reinforced_stone, 0, x + 1, y + 2, z + 1); + placeBlock(BlockListMF.reinforced_stone, 0, x, y + 2, z); + placeBlock(BlockListMF.reinforced_stone, 0, x, y + 3, z); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, x + 1, y + 2, z); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, x - 1, y + 2, z); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, x, y + 2, z + 1); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, x, y + 2, z - 1); + } - private void placeChest(int x, int y, int z, int d, String loot) - { + + private void placeChest(int x, int y, int z, int d, String loot) { placeBlock(Blocks.chest, d, x, y, z); - TileEntityChest tile = (TileEntityChest)getTileEntity(x, y, z, direction); + TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); - if (tile != null) - { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, 5+rand.nextInt(5)); - } + if (tile != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, + 5 + rand.nextInt(5)); + } } - private void placeAmmoBox(int x, int y, int z, int d, String loot) - { + + private void placeAmmoBox(int x, int y, int z, int d, String loot) { placeBlock(BlockListMF.ammo_box_basic, d, x, y, z); - TileEntityAmmoBox tile = (TileEntityAmmoBox)getTileEntity(x, y, z, direction); - - if (tile != null) - { - ItemStack ammo = ChestGenHooks.getOneItem(loot, rand); - tile.setMaterial(WoodMaterial.getMaterial("RefinedWood")); - tile.ammo = ammo; - tile.stock = ammo.getMaxStackSize() * (rand.nextInt(2) + 1) + (ammo.stackSize > 1 ? rand.nextInt(ammo.stackSize) : 0); - if(ammo.getItem() instanceof ItemBomb || ammo.getItem() instanceof ItemMine) - { - tile.stock = Math.max(1, tile.stock / 4); - } - ammo = null; - } + TileEntityAmmoBox tile = (TileEntityAmmoBox) getTileEntity(x, y, z, direction); + + if (tile != null) { + ItemStack ammo = ChestGenHooks.getOneItem(loot, rand); + tile.setMaterial(WoodMaterial.getMaterial("RefinedWood")); + tile.ammo = ammo; + tile.stock = ammo.getMaxStackSize() * (rand.nextInt(2) + 1) + + (ammo.stackSize > 1 ? rand.nextInt(ammo.stackSize) : 0); + if (ammo.getItem() instanceof ItemBomb || ammo.getItem() instanceof ItemMine) { + tile.stock = Math.max(1, tile.stock / 4); + } + ammo = null; + } } - protected void tryPlaceMinorRoom(int x, int y, int z, int d, boolean hall) - { + + protected void tryPlaceMinorRoom(int x, int y, int z, int d, boolean hall) { Class extension = hall ? StructureGenDSHall.class : StructureGenDSRoomSml2.class; - if(extension != null) - { + if (extension != null) { mapStructure(x, y, z, d, extension); } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml.java index f88bfd13..d2de424d 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml.java @@ -1,10 +1,6 @@ package minefantasy.mf2.mechanics.worldGen.structure.dwarven; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; -import minefantasy.mf2.entity.EntityCogwork; -import minefantasy.mf2.item.ItemArtefact; -import minefantasy.mf2.material.WoodMaterial; import minefantasy.mf2.mechanics.worldGen.structure.LootTypes; import minefantasy.mf2.mechanics.worldGen.structure.StructureGenAncientForge; import minefantasy.mf2.mechanics.worldGen.structure.StructureModuleMF; @@ -15,184 +11,159 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -public class StructureGenDSRoomSml extends StructureModuleMF -{ - public StructureGenDSRoomSml(World world, StructureCoordinates position) - { +public class StructureGenDSRoomSml extends StructureModuleMF { + public StructureGenDSRoomSml(World world, StructureCoordinates position) { super(world, position); } - - protected int getHeight() - { + + protected int getHeight() { return 5; } - protected int getDepth() - { + + protected int getDepth() { return 8; } - protected int getWidth() - { + + protected int getWidth() { return 4; } + @Override - public boolean canGenerate() - { + public boolean canGenerate() { int width = getWidth(), depth = getDepth(), height = getHeight(); int filledSpaces = 0, emptySpaces = 0; - - for(int x = -width; x <= width; x ++) - { - for(int y = 0; y <= height; y ++) - { - for(int z = 1; z <= depth; z ++) - { + + for (int x = -width; x <= width; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { Block block = this.getBlock(x, y, z); - if(!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) - { + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { return false; } - if(!block.getMaterial().isSolid()) - { + if (!block.getMaterial().isSolid()) { ++emptySpaces; - } - else - { + } else { ++filledSpaces; } } } } - if(WorldGenDwarvenStronghold.debug_air) - { + if (WorldGenDwarvenStronghold.debug_air) { return true; } - return ((float) emptySpaces / (float)(emptySpaces+filledSpaces) ) < WorldGenDwarvenStronghold.maxAir;//at least 75% full + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full } - private boolean allowBuildOverBlock(Block block) - { - if(block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) - { + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { return false; } return true; } - - + @Override - public void generate() - { + public void generate() { int width = getWidth(), depth = getDepth(), height = getHeight(); - - for(int x = -width; x <= width; x ++) - { - for(int z = 0; z <= depth; z ++) - { + + for (int x = -width; x <= width; x++) { + for (int z = 0; z <= depth; z++) { Object[] blockarray; - //FLOOR + // FLOOR blockarray = getFloor(width, depth, x, z); - if(blockarray != null) - { - placeBlock((Block)blockarray[0], 0, x, 0, z); + if (blockarray != null) { + placeBlock((Block) blockarray[0], 0, x, 0, z); } - //WALLS - for(int y = 1; y <= height; y ++) - { + // WALLS + for (int y = 1; y <= height; y++) { blockarray = getWalls(width, depth, x, z); - if(blockarray != null && this.allowBuildOverBlock(getBlock(x, y, z))) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, y, z); + if (blockarray != null && this.allowBuildOverBlock(getBlock(x, y, z))) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); } } - //CEILING + // CEILING blockarray = getCeiling(width, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height, z); } } } placeBlock(Blocks.air, 0, 0, 1, 0); placeBlock(Blocks.air, 0, 0, 2, 0); - + placeBlock(BlockListMF.reinforced_stone_framed, 0, -1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); + placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); placeBlock(BlockListMF.reinforced_stone_framediron, 0, -1, 3, -1); - + placeBlock(BlockListMF.reinforced_stone_framed, 0, 1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); placeBlock(BlockListMF.reinforced_stone_framediron, 0, 1, 3, -1); - + placeBlock(BlockListMF.reinforced_stone, 1, 0, 3, -1); placeBlock(Blocks.air, 0, 0, 1, -1); placeBlock(Blocks.air, 0, 0, 2, -1); - + buildHomeFurnishings(width, depth, height); } - private Object[] getFloor(int width, int depth, int x, int z) - { - if(x== -(width-1) || x == (width-1) || z == 1 || z == depth-1) - { - return new Object[]{BlockListMF.reinforced_stone, 0}; + private Object[] getFloor(int width, int depth, int x, int z) { + if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { + return new Object[] { BlockListMF.reinforced_stone, 0 }; } - return new Object[]{BlockListMF.cobble_pavement, 0}; + return new Object[] { BlockListMF.cobble_pavement, 0 }; } - private Object[] getCeiling(int width, int depth, int x, int z) - { - if(x== -(width-1) || x == (width-1) || z == 1 || z == depth-1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getCeiling(int width, int depth, int x, int z) { + if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - private Object[] getWalls(int width, int depth, int x, int z) - { - if(x == -width || x == width || z == depth ||z == 0) - { - if((x == -width && (z == depth || z == 0)) || (x == width && (z == depth || z == 0))) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getWalls(int width, int depth, int x, int z) { + if (x == -width || x == width || z == depth || z == 0) { + if ((x == -width && (z == depth || z == 0)) || (x == width && (z == depth || z == 0))) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - return new Object[]{Blocks.air, false}; + return new Object[] { Blocks.air, false }; } - - private void buildHomeFurnishings(int width, int depth, int height) - { + + private void buildHomeFurnishings(int width, int depth, int height) { placeBlock(Blocks.furnace, rotateLeft(), width, 2, 2); - - placeBlock(Blocks.double_stone_slab, 0, width-3, 1, 1); - placeBlock(Blocks.double_stone_slab, 0, width-3, 1, 2); - - for(int x = width-1; x >= (width-4); x --) - { + + placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 1); + placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 2); + + for (int x = width - 1; x >= (width - 4); x--) { placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 1, 4); placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 2, 4); placeBlock(Blocks.stone_slab, 0, x, 3, 4); } - placeBlock(Blocks.stone_slab, 0, width-1, 1, 6); - placeBlock(Blocks.stone_slab, 0, width-2, 1, 6); - placeBlock(Blocks.cauldron, 0, width-2, 1, 1); - - placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(reverse()), -(width-1), 1, 1); - placeBlock(Blocks.stone_slab, 8, -(width-1), 1, 2); - placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(direction), -(width-1), 1, 3); - - - placeChest(width-3, 1, 6, rotateLeft(), LootTypes.DWARVEN_HOME); + placeBlock(Blocks.stone_slab, 0, width - 1, 1, 6); + placeBlock(Blocks.stone_slab, 0, width - 2, 1, 6); + placeBlock(Blocks.cauldron, 0, width - 2, 1, 1); + + placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(reverse()), -(width - 1), 1, 1); + placeBlock(Blocks.stone_slab, 8, -(width - 1), 1, 2); + placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(direction), -(width - 1), 1, 3); + + placeChest(width - 3, 1, 6, rotateLeft(), LootTypes.DWARVEN_HOME); } - private void placeChest(int x, int y, int z, int d, String loot) - { + + private void placeChest(int x, int y, int z, int d, String loot) { placeBlock(Blocks.chest, d, x, y, z); - TileEntityChest tile = (TileEntityChest)getTileEntity(x, y, z, direction); + TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); - if (tile != null) - { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, 2+rand.nextInt(3)); - } + if (tile != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, + 2 + rand.nextInt(3)); + } } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml2.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml2.java index e5ef5dbf..27bf8126 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml2.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml2.java @@ -1,9 +1,6 @@ package minefantasy.mf2.mechanics.worldGen.structure.dwarven; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; -import minefantasy.mf2.item.ItemArtefact; -import minefantasy.mf2.material.WoodMaterial; import minefantasy.mf2.mechanics.worldGen.structure.LootTypes; import minefantasy.mf2.mechanics.worldGen.structure.StructureGenAncientForge; import minefantasy.mf2.mechanics.worldGen.structure.StructureModuleMF; @@ -14,185 +11,160 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -public class StructureGenDSRoomSml2 extends StructureModuleMF -{ - public StructureGenDSRoomSml2(World world, StructureCoordinates position) - { +public class StructureGenDSRoomSml2 extends StructureModuleMF { + public StructureGenDSRoomSml2(World world, StructureCoordinates position) { super(world, position); } - - protected int getHeight() - { + + protected int getHeight() { return 5; } - protected int getDepth() - { + + protected int getDepth() { return 10; } - protected int getWidth() - { + + protected int getWidth() { return 4; } + @Override - public boolean canGenerate() - { + public boolean canGenerate() { int width = getWidth(), depth = getDepth(), height = getHeight(); int filledSpaces = 0, emptySpaces = 0; - - for(int x = -width; x <= width; x ++) - { - for(int y = 0; y <= height; y ++) - { - for(int z = 1; z <= depth; z ++) - { + + for (int x = -width; x <= width; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { Block block = this.getBlock(x, y, z); - if(!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) - { + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { return false; } - if(!block.getMaterial().isSolid()) - { + if (!block.getMaterial().isSolid()) { ++emptySpaces; - } - else - { + } else { ++filledSpaces; } } } } - if(WorldGenDwarvenStronghold.debug_air) - { + if (WorldGenDwarvenStronghold.debug_air) { return true; } - return ((float) emptySpaces / (float)(emptySpaces+filledSpaces) ) < WorldGenDwarvenStronghold.maxAir;//at least 75% full + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full } - private boolean allowBuildOverBlock(Block block) - { - if(block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) - { + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { return false; } return true; } - - + @Override - public void generate() - { + public void generate() { int width = getWidth(), depth = getDepth(), height = getHeight(); - - for(int x = -width; x <= width; x ++) - { - for(int z = 0; z <= depth; z ++) - { + + for (int x = -width; x <= width; x++) { + for (int z = 0; z <= depth; z++) { Object[] blockarray; - //FLOOR + // FLOOR blockarray = getFloor(width, depth, x, z); - if(blockarray != null) - { - placeBlock((Block)blockarray[0], 0, x, 0, z); + if (blockarray != null) { + placeBlock((Block) blockarray[0], 0, x, 0, z); } - //WALLS - for(int y = 1; y <= height; y ++) - { + // WALLS + for (int y = 1; y <= height; y++) { blockarray = getWalls(width, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, y, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); } } - //CEILING + // CEILING blockarray = getCeiling(width, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height, z); } } } placeBlock(Blocks.air, 0, 0, 1, 0); placeBlock(Blocks.air, 0, 0, 2, 0); - + placeBlock(BlockListMF.reinforced_stone_framed, 0, -1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); + placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); placeBlock(BlockListMF.reinforced_stone_framediron, 0, -1, 3, -1); - + placeBlock(BlockListMF.reinforced_stone_framed, 0, 1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); placeBlock(BlockListMF.reinforced_stone_framediron, 0, 1, 3, -1); - + placeBlock(BlockListMF.reinforced_stone, 1, 0, 3, -1); placeBlock(Blocks.air, 0, 0, 1, -1); placeBlock(Blocks.air, 0, 0, 2, -1); - + buildHomeFurnishings(width, depth, height); } - private Object[] getFloor(int width, int depth, int x, int z) - { - if(x== -(width-1) || x == (width-1) || z == 1 || z == depth-1) - { - return new Object[]{BlockListMF.reinforced_stone, 0}; + private Object[] getFloor(int width, int depth, int x, int z) { + if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { + return new Object[] { BlockListMF.reinforced_stone, 0 }; } - return new Object[]{BlockListMF.refined_planks, 0}; + return new Object[] { BlockListMF.refined_planks, 0 }; } - private Object[] getCeiling(int width, int depth, int x, int z) - { - if(x== -(width-1) || x == (width-1) || z == 1 || z == depth-1) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getCeiling(int width, int depth, int x, int z) { + if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - private Object[] getWalls(int width, int depth, int x, int z) - { - if(x == -width || x == width || z == depth ||z == 0) - { - if((x == -width && (z == depth || z == 0)) || (x == width && (z == depth || z == 0))) - { - return new Object[]{BlockListMF.reinforced_stone, false}; + + private Object[] getWalls(int width, int depth, int x, int z) { + if (x == -width || x == width || z == depth || z == 0) { + if ((x == -width && (z == depth || z == 0)) || (x == width && (z == depth || z == 0))) { + return new Object[] { BlockListMF.reinforced_stone, false }; } - - return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + + return new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - return new Object[]{Blocks.air, false}; + return new Object[] { Blocks.air, false }; } - - private void buildHomeFurnishings(int width, int depth, int height) - { + + private void buildHomeFurnishings(int width, int depth, int height) { placeBlock(Blocks.furnace, rotateLeft(), width, 2, 2); - placeBlock(Blocks.double_stone_slab, 0, width-3, 1, 1); - placeBlock(Blocks.double_stone_slab, 0, width-3, 1, 2); - - for(int x = width-1; x >= (width-4); x --) - { + placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 1); + placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 2); + + for (int x = width - 1; x >= (width - 4); x--) { placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 1, 5); placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 2, 5); placeBlock(Blocks.stone_slab, 0, x, 3, 5); } - placeBlock(Blocks.stone_slab, 0, width-1, 1, 7); - placeBlock(Blocks.stone_slab, 0, width-2, 1, 7); - placeBlock(Blocks.stone_slab, 0, width-1, 1, 8); - placeBlock(Blocks.stone_slab, 0, width-2, 1, 8); - placeBlock(Blocks.cauldron, 0, width-2, 1, 1); - - placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(reverse()), -(width-1), 1, 1); - placeBlock(Blocks.stone_slab, 8, -(width-1), 1, 2); - placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(direction), -(width-1), 1, 3); - - - placeChest(width-3, 1, 7, rotateLeft(), LootTypes.DWARVEN_HOME_RICH); + placeBlock(Blocks.stone_slab, 0, width - 1, 1, 7); + placeBlock(Blocks.stone_slab, 0, width - 2, 1, 7); + placeBlock(Blocks.stone_slab, 0, width - 1, 1, 8); + placeBlock(Blocks.stone_slab, 0, width - 2, 1, 8); + placeBlock(Blocks.cauldron, 0, width - 2, 1, 1); + + placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(reverse()), -(width - 1), 1, 1); + placeBlock(Blocks.stone_slab, 8, -(width - 1), 1, 2); + placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(direction), -(width - 1), 1, 3); + + placeChest(width - 3, 1, 7, rotateLeft(), LootTypes.DWARVEN_HOME_RICH); } - private void placeChest(int x, int y, int z, int d, String loot) - { + + private void placeChest(int x, int y, int z, int d, String loot) { placeBlock(Blocks.chest, d, x, y, z); - TileEntityChest tile = (TileEntityChest)getTileEntity(x, y, z, direction); + TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); - if (tile != null) - { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, 2+rand.nextInt(3)); - } + if (tile != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, + 2 + rand.nextInt(3)); + } } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSStairs.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSStairs.java index f1bd729c..40a8e54e 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSStairs.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSStairs.java @@ -8,291 +8,247 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; -public class StructureGenDSStairs extends StructureModuleMF -{ +public class StructureGenDSStairs extends StructureModuleMF { /** * The minimal height for a stairway to be created */ public static final int minLevel = 20; - public StructureGenDSStairs(World world, StructureCoordinates position) - { + + public StructureGenDSStairs(World world, StructureCoordinates position) { super(world, position); } - public StructureGenDSStairs(World world, int x, int y, int z, int direction) - { + + public StructureGenDSStairs(World world, int x, int y, int z, int direction) { super(world, x, y, z, direction); } + @Override - public boolean canGenerate() - { - if(lengthId == -100) - { + public boolean canGenerate() { + if (lengthId == -100) { return true; } - + int width_span = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); int empty_spaces = 0; int filledSpaces = 0, emptySpaces = 0; - for(int x = -width_span; x <= width_span; x ++) - { - for(int y = 0; y <= height; y ++) - { - for(int z = 1; z <= depth; z ++) - { - Block block = this.getBlock(x, y-z, z); - if(!allowBuildOverBlock(block) || this.isUnbreakable(x, y-z, z, direction)) - { + for (int x = -width_span; x <= width_span; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { + Block block = this.getBlock(x, y - z, z); + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y - z, z, direction)) { return false; } - if(!block.getMaterial().isSolid()) - { + if (!block.getMaterial().isSolid()) { ++emptySpaces; - } - else - { + } else { ++filledSpaces; } } } } - if(WorldGenDwarvenStronghold.debug_air) - { + if (WorldGenDwarvenStronghold.debug_air) { return true; } - return ((float) emptySpaces / (float)(emptySpaces+filledSpaces) ) < WorldGenDwarvenStronghold.maxAir;//at least 75% full + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full } - - private boolean allowBuildOverBlock(Block block) - { - if(block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) - { + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { return false; } return true; } + @Override - public void generate() - { + public void generate() { int width_span = getWidthSpan(); int depth = getDepthSpan(); int height = getHeight(); - for(int x = -width_span; x <= width_span; x ++) - { - for(int z = 0; z <= depth; z ++) - { + for (int x = -width_span; x <= width_span; x++) { + for (int z = 0; z <= depth; z++) { Object[] blockarray; - - //FLOOR + + // FLOOR blockarray = getFloor(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Integer)blockarray[1]; - placeBlock((Block)blockarray[0], meta, x, -z-1, z); - - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, -z-2, z); - - if(x == (width_span-1) || x == -(width_span-1)) - { + if (blockarray != null) { + int meta = (Integer) blockarray[1]; + placeBlock((Block) blockarray[0], meta, x, -z - 1, z); + + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, + -z - 2, z); + + if (x == (width_span - 1) || x == -(width_span - 1)) { placeBlock(BlockListMF.reinforced_stone, 0, x, -z, z); - } - else - { + } else { placeBlock(Blocks.air, 0, x, -z, z); } } - //WALLS - for(int y = 0; y <= height+1; y ++) - { + // WALLS + for (int y = 0; y <= height + 1; y++) { blockarray = getWalls(width_span, height, depth, x, y, z); - if(blockarray != null) - { + if (blockarray != null) { int meta = 0; - if(blockarray[1] instanceof Integer) - { - meta = (Integer)blockarray[1]; + if (blockarray[1] instanceof Integer) { + meta = (Integer) blockarray[1]; } - if(blockarray[1] instanceof Boolean) - { - meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + if (blockarray[1] instanceof Boolean) { + meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; } - if(blockarray[1] instanceof String) - { - meta = (String)blockarray[1]=="Hall" ? StructureGenDSHall.getRandomEngravedWall(rand) : 0; + if (blockarray[1] instanceof String) { + meta = (String) blockarray[1] == "Hall" ? StructureGenDSHall.getRandomEngravedWall(rand) + : 0; } - placeBlock((Block)blockarray[0], meta, x, y-z, z); + placeBlock((Block) blockarray[0], meta, x, y - z, z); } } - //CEILING + // CEILING blockarray = getCeiling(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height+1-z, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1 - z, z); } - - //TRIM + + // TRIM blockarray = getTrim(width_span, depth, x, z); - if(blockarray != null) - { - int meta = (Boolean)blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block)blockarray[0], meta, x, height-z, z); - if((Block)blockarray[0] == BlockListMF.reinforced_stone_framed) - { - placeBlock(BlockListMF.reinforced_stone, 0, x, height-z, z); - placeBlock(BlockListMF.reinforced_stone_framed, 0, x, height-z-1, z); - - for(int h = height-1; h > 1; h --) - { - placeBlock(BlockListMF.reinforced_stone, h==2 ? 1 : 0, x, h-z-1, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height - z, z); + if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { + placeBlock(BlockListMF.reinforced_stone, 0, x, height - z, z); + placeBlock(BlockListMF.reinforced_stone_framed, 0, x, height - z - 1, z); + + for (int h = height - 1; h > 1; h--) { + placeBlock(BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h - z - 1, z); } placeBlock(BlockListMF.reinforced_stone_framed, 0, x, -z, z); } } - + } } - - //DOORWAY + + // DOORWAY buildDoorway(width_span, depth, height); - - if(lengthId == -100) - { + + if (lengthId == -100) { this.lengthId = -99; - if( (yCoord > 64 && rand.nextInt(3) != 0) || (yCoord >= 56 && rand.nextInt(3) == 0)) - { + if ((yCoord > 64 && rand.nextInt(3) != 0) || (yCoord >= 56 && rand.nextInt(3) == 0)) { mapStructure(0, -depth, depth, StructureGenDSStairs.class); - } - else - { + } else { mapStructure(0, -depth, depth, StructureGenDSCrossroads.class); } } - ++lengthId;//Stairs don't count toward length - if(lengthId > 0) - { + ++lengthId;// Stairs don't count toward length + if (lengthId > 0) { buildNext(width_span, depth, height); } } - - protected void buildDoorway(int width_span, int depth, int height) - { - for(int x = -1; x <= 1; x++) - { - for(int y = 1; y <= 3; y ++) - { - for(int z = 0; z >= -1; z --) - { + + protected void buildDoorway(int width_span, int depth, int height) { + for (int x = -1; x <= 1; x++) { + for (int y = 1; y <= 3; y++) { + for (int z = 0; z >= -1; z--) { placeBlock(Blocks.air, 0, x, y, z); } } placeBlock(BlockListMF.cobble_pavement_stair, getStairDirection(reverse()), x, 0, -1); } } - protected void buildNext(int width_span, int depth, int height) - { - if(lengthId > 1 && rand.nextInt(3) == 0 && yCoord >= minLevel) - { + + protected void buildNext(int width_span, int depth, int height) { + if (lengthId > 1 && rand.nextInt(3) == 0 && yCoord >= minLevel) { mapStructure(0, -depth, depth, StructureGenDSStairs.class); - } - else - { + } else { tryPlaceHall(0, -depth, depth, direction); } } - protected void tryPlaceHall(int x, int y, int z, int d) - { + + protected void tryPlaceHall(int x, int y, int z, int d) { Class extension = getRandomExtension(); - if(extension != null) - { + if (extension != null) { mapStructure(x, y, z, d, extension); } } + protected int getHeight() { return 4; } + protected int getDepthSpan() { return 9; } + protected int getWidthSpan() { return 3; } - protected Class getRandomExtension() - { - if( rand.nextInt(20) == 0 && this.yCoord > 24) - { + + protected Class getRandomExtension() { + if (rand.nextInt(20) == 0 && this.yCoord > 24) { return StructureGenDSStairs.class; } - if(lengthId == 1) - { + if (lengthId == 1) { return StructureGenDSRoom.class; } - if(deviationCount > 0 && rand.nextInt(4) == 0) - { + if (deviationCount > 0 && rand.nextInt(4) == 0) { return StructureGenDSIntersection.class; } return StructureGenDSHall.class; } - protected Object[] getTrim(int radius, int depth, int x, int z) - { - if(x == -radius || x == radius) - { + + protected Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius) { return null; } - - if(x == -(radius-1) || x == (radius-1)) - { - if(z == Math.floor( (float)depth/2)) - { - return new Object[]{BlockListMF.reinforced_stone_framed, false}; + + if (x == -(radius - 1) || x == (radius - 1)) { + if (z == Math.floor((float) depth / 2)) { + return new Object[] { BlockListMF.reinforced_stone_framed, false }; } - return new Object[]{BlockListMF.reinforced_stone, false}; + return new Object[] { BlockListMF.reinforced_stone, false }; } return null; } - protected Object[] getCeiling(int radius, int depth, int x, int z) - { - return x == 0 ? new Object[]{BlockListMF.reinforced_stone, false} : new Object[]{BlockListMF.reinforced_stone_bricks, true}; + + protected Object[] getCeiling(int radius, int depth, int x, int z) { + return x == 0 ? new Object[] { BlockListMF.reinforced_stone, false } + : new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - - protected Object[] getFloor(int radius, int depth, int x, int z) - { - if(x >= -1 && x <= 1) - { - if(z >= depth-1) - { - return new Object[]{BlockListMF.cobble_pavement, 0}; + + protected Object[] getFloor(int radius, int depth, int x, int z) { + if (x >= -1 && x <= 1) { + if (z >= depth - 1) { + return new Object[] { BlockListMF.cobble_pavement, 0 }; } - return new Object[]{BlockListMF.cobble_pavement_stair, Integer.valueOf(getStairDirection(reverse()))}; + return new Object[] { BlockListMF.cobble_pavement_stair, Integer.valueOf(getStairDirection(reverse())) }; } - if(x == -radius || x == radius || z == depth || z == 0) - { - return new Object[]{BlockListMF.reinforced_stone, Integer.valueOf(0)}; + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[] { BlockListMF.reinforced_stone, Integer.valueOf(0) }; } - if(x == -(radius-1) || x == (radius-1) || z == (depth-1) || z == 1) - { - return new Object[]{BlockListMF.reinforced_stone, Integer.valueOf(0)}; + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[] { BlockListMF.reinforced_stone, Integer.valueOf(0) }; } - return new Object[]{BlockListMF.cobble_pavement, 0}; + return new Object[] { BlockListMF.cobble_pavement, 0 }; } - - protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) - { - if(x != -radius && x != radius && z == 0) - { - return new Object[]{Blocks.air, false}; + + protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) { + if (x != -radius && x != radius && z == 0) { + return new Object[] { Blocks.air, false }; } - if(x == -radius || x == radius || z == depth) - { - return y == height/2 ? new Object[]{BlockListMF.reinforced_stone, "Hall"} : new Object[]{BlockListMF.reinforced_stone_bricks, true}; + if (x == -radius || x == radius || z == depth) { + return y == height / 2 ? new Object[] { BlockListMF.reinforced_stone, "Hall" } + : new Object[] { BlockListMF.reinforced_stone_bricks, true }; } - return new Object[]{Blocks.air, false}; + return new Object[] { Blocks.air, false }; } protected String lootType = ChestGenHooks.DUNGEON_CHEST; - public StructureModuleMF setLoot(String loot) - { + + public StructureModuleMF setLoot(String loot) { this.lootType = loot; return this; } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java index 75e6497b..aa4da9c1 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java @@ -1,76 +1,61 @@ package minefantasy.mf2.mechanics.worldGen.structure.dwarven; -import java.util.Random; - -import minefantasy.mf2.entity.mob.MinotaurBreed; import minefantasy.mf2.mechanics.worldGen.structure.StructureModuleMF; import minefantasy.mf2.mechanics.worldGen.structure.WorldGenStructureBase; -import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; import net.minecraft.world.World; - -public class WorldGenDwarvenStronghold extends WorldGenStructureBase -{ +public class WorldGenDwarvenStronghold extends WorldGenStructureBase { /** * Max percentage of air blocks allowed for structures to build */ public static float maxAir = 0.25F; /** - * A debug method used to allow strongholds to generate in the air, for easy observation of shape and size. + * A debug method used to allow strongholds to generate in the air, for easy + * observation of shape and size. */ public static final boolean debug_air = false; private boolean isSurfaceBuild = false; - public WorldGenDwarvenStronghold() - { + + public WorldGenDwarvenStronghold() { } - public void setSurfaceMode(boolean flag) - { + + public void setSurfaceMode(boolean flag) { isSurfaceBuild = flag; } + @Override - protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) - { - return new StructureGenDSEntry(world, x, y-1, z, direction, isSurfaceBuild); + protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) { + return new StructureGenDSEntry(world, x, y - 1, z, direction, isSurfaceBuild); /* - if(startPiece == null) - { - startPiece = new StructureGenDSEntry(world, x, y-1, z, direction, isSurfaceBuild); - } - startPiece.direction = direction; - return startPiece; + * if(startPiece == null) { startPiece = new StructureGenDSEntry(world, x, y-1, + * z, direction, isSurfaceBuild); } startPiece.direction = direction; return + * startPiece; * */ } + @Override - protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) - { + protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) { return isValidGround(world, x, y, z);// && world.canBlockSeeTheSky(x, y+2, z); } + @Override - protected boolean canStructureBuild(StructureModuleMF piece) - { - if(debug_air || isSurfaceBuild) - { + protected boolean canStructureBuild(StructureModuleMF piece) { + if (debug_air || isSurfaceBuild) { return true; } - //SEARCH FOR CLIFF - for(int x = -3; x <= 3; x ++) - { - for(int y = 0; y < 5; y ++) - { - for(int z = 4; z <= 8; z ++) - { + // SEARCH FOR CLIFF + for (int x = -3; x <= 3; x++) { + for (int y = 0; y < 5; y++) { + for (int z = 4; z <= 8; z++) { int[] pos = piece.offsetPos(x, y, z, piece.direction); Material material = piece.worldObj.getBlock(pos[0], pos[1], pos[2]).getMaterial(); - - if(!material.isOpaque()) - { + + if (!material.isOpaque()) { return false; } - if(!material.isSolid()) - { + if (!material.isSolid()) { return false; } } @@ -78,13 +63,14 @@ protected boolean canStructureBuild(StructureModuleMF piece) } return true; } + @Override - protected boolean isDirectionRandom() - { + protected boolean isDirectionRandom() { return isSurfaceBuild; } + @Override protected int[] getYGenBounds(World world) { - return new int[]{60, 255}; + return new int[] { 60, 255 }; } } diff --git a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java index c07baecf..0ceb16ba 100644 --- a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java @@ -2,12 +2,10 @@ import org.lwjgl.input.Keyboard; -import codechicken.nei.NEIModContainer; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.Loader; import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.knowledge.InformationList; @@ -120,7 +118,6 @@ import minefantasy.mf2.entity.mob.EntityDragon; import minefantasy.mf2.entity.mob.EntityHound; import minefantasy.mf2.entity.mob.EntityMinotaur; -import minefantasy.mf2.integration.nei.NEIConfig; import minefantasy.mf2.item.list.CustomToolListMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.item.list.styles.DragonforgedStyle; @@ -214,7 +211,9 @@ public void registerTickHandlers() { public void registerEntityRenderer() { RenderingRegistry.registerEntityRenderingHandler(EntityArrowMF.class, new RenderArrowMF()); - RenderingRegistry.registerEntityRenderingHandler(EntityBomb.class, new RenderBombIcon());// Switch to RenderBomb when syncing is fixed + RenderingRegistry.registerEntityRenderingHandler(EntityBomb.class, new RenderBombIcon());// Switch to RenderBomb + // when syncing is + // fixed RenderingRegistry.registerEntityRenderingHandler(EntityMine.class, new RenderMine()); RenderingRegistry.registerEntityRenderingHandler(EntityShrapnel.class, new RenderShrapnel("shrapnel")); RenderingRegistry.registerEntityRenderingHandler(EntityFireBlast.class, new RenderFireBlast()); @@ -239,7 +238,7 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int Minecraft mc = Minecraft.getMinecraft(); if (ID == 0) { TileEntity tile = world.getTileEntity(x, y, z); - //int meta = world.getBlockMetadata(x, y, z); + // int meta = world.getBlockMetadata(x, y, z); if (tile == null) { return null; diff --git a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java index fa82d5a5..38b179b6 100644 --- a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java @@ -8,10 +8,43 @@ import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.refine.ISmokeHandler; import minefantasy.mf2.api.refine.SmokeMechanics; -import minefantasy.mf2.block.tileentity.*; -import minefantasy.mf2.block.tileentity.blastfurnace.*; -import minefantasy.mf2.block.tileentity.decor.*; -import minefantasy.mf2.container.*; +import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; +import minefantasy.mf2.block.tileentity.TileEntityBellows; +import minefantasy.mf2.block.tileentity.TileEntityBigFurnace; +import minefantasy.mf2.block.tileentity.TileEntityBloomery; +import minefantasy.mf2.block.tileentity.TileEntityBombBench; +import minefantasy.mf2.block.tileentity.TileEntityBombPress; +import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; +import minefantasy.mf2.block.tileentity.TileEntityChimney; +import minefantasy.mf2.block.tileentity.TileEntityComponent; +import minefantasy.mf2.block.tileentity.TileEntityCrossbowBench; +import minefantasy.mf2.block.tileentity.TileEntityCrucible; +import minefantasy.mf2.block.tileentity.TileEntityFirepit; +import minefantasy.mf2.block.tileentity.TileEntityForge; +import minefantasy.mf2.block.tileentity.TileEntityQuern; +import minefantasy.mf2.block.tileentity.TileEntityResearch; +import minefantasy.mf2.block.tileentity.TileEntityRoad; +import minefantasy.mf2.block.tileentity.TileEntityRoast; +import minefantasy.mf2.block.tileentity.TileEntityTanningRack; +import minefantasy.mf2.block.tileentity.TileEntityWorldGenMarker; +import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; +import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFH; +import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; +import minefantasy.mf2.block.tileentity.decor.TileEntityRack; +import minefantasy.mf2.block.tileentity.decor.TileEntityTrough; +import minefantasy.mf2.container.ContainerAnvilMF; +import minefantasy.mf2.container.ContainerBigFurnace; +import minefantasy.mf2.container.ContainerBlastChamber; +import minefantasy.mf2.container.ContainerBlastHeater; +import minefantasy.mf2.container.ContainerBloomery; +import minefantasy.mf2.container.ContainerBombBench; +import minefantasy.mf2.container.ContainerCarpenterMF; +import minefantasy.mf2.container.ContainerCrossbowBench; +import minefantasy.mf2.container.ContainerCrucible; +import minefantasy.mf2.container.ContainerForge; +import minefantasy.mf2.container.ContainerQuern; +import minefantasy.mf2.container.ContainerReload; +import minefantasy.mf2.container.ContainerResearch; import minefantasy.mf2.entity.EntitySmoke; import minefantasy.mf2.entity.list.EntityListMF; import minefantasy.mf2.hunger.HungerSystemMF; @@ -26,100 +59,79 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; + /** * @author Anonymous Productions */ -public class CommonProxyMF implements IGuiHandler, ISmokeHandler -{ - @Override - public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) - { - return null; - } +public class CommonProxyMF implements IGuiHandler, ISmokeHandler { + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } - @Override - public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) - { - if(ID == 1 && x == 1 && player.getHeldItem() != null) - { - return new ContainerReload(player.inventory, player.getHeldItem()); - } - else if(ID == 0) - { - TileEntity tile = world.getTileEntity(x, y, z); - //int meta = world.getBlockMetadata(x, y, z); - if(tile == null) - { + @Override + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + if (ID == 1 && x == 1 && player.getHeldItem() != null) { + return new ContainerReload(player.inventory, player.getHeldItem()); + } else if (ID == 0) { + TileEntity tile = world.getTileEntity(x, y, z); + // int meta = world.getBlockMetadata(x, y, z); + if (tile == null) { return null; } - - if(tile instanceof TileEntityAnvilMF) - { + + if (tile instanceof TileEntityAnvilMF) { return new ContainerAnvilMF(player.inventory, (TileEntityAnvilMF) tile); } - if(tile instanceof TileEntityCarpenterMF) - { + if (tile instanceof TileEntityCarpenterMF) { return new ContainerCarpenterMF(player.inventory, (TileEntityCarpenterMF) tile); } - if(tile instanceof TileEntityBombBench) - { + if (tile instanceof TileEntityBombBench) { return new ContainerBombBench(player.inventory, (TileEntityBombBench) tile); } - if(tile instanceof TileEntityBlastFH) - { + if (tile instanceof TileEntityBlastFH) { return new ContainerBlastHeater(player.inventory, (TileEntityBlastFH) tile); } - if(tile instanceof TileEntityBlastFC) - { + if (tile instanceof TileEntityBlastFC) { return new ContainerBlastChamber(player.inventory, (TileEntityBlastFC) tile); } - if(tile instanceof TileEntityCrucible) - { + if (tile instanceof TileEntityCrucible) { return new ContainerCrucible(player.inventory, (TileEntityCrucible) tile); } - if(tile instanceof TileEntityForge) - { + if (tile instanceof TileEntityForge) { return new ContainerForge(player.inventory, (TileEntityForge) tile); } - if(tile instanceof TileEntityResearch) - { + if (tile instanceof TileEntityResearch) { return new ContainerResearch(player.inventory, (TileEntityResearch) tile); } - if(tile instanceof TileEntityBloomery) - { + if (tile instanceof TileEntityBloomery) { return new ContainerBloomery(player.inventory, (TileEntityBloomery) tile); } - if(tile instanceof TileEntityCrossbowBench) - { + if (tile instanceof TileEntityCrossbowBench) { return new ContainerCrossbowBench(player.inventory, (TileEntityCrossbowBench) tile); } - if(tile instanceof TileEntityQuern) - { + if (tile instanceof TileEntityQuern) { return new ContainerQuern(player.inventory, (TileEntityQuern) tile); } - if(tile instanceof TileEntityBigFurnace) - { + if (tile instanceof TileEntityBigFurnace) { return new ContainerBigFurnace(player, (TileEntityBigFurnace) tile); } - } - return null; - } + } + return null; + } - public World getClientWorld() - { - return null; - } + public World getClientWorld() { + return null; + } - public void registerMain() - { + public void registerMain() { AmmoMechanicsMF.addHandler(new ArrowFireFlint()); AmmoMechanicsMF.addHandler(new ArrowFirerMF()); registerTileEntities(); SmokeMechanics.handler = this; } - protected void registerTileEntities() - { + protected void registerTileEntities() { GameRegistry.registerTileEntity(TileEntityAnvilMF.class, "MF_Anvil"); GameRegistry.registerTileEntity(TileEntityCarpenterMF.class, "MF_CarpenterBench"); GameRegistry.registerTileEntity(TileEntityBombBench.class, "MF_BombBench"); @@ -146,13 +158,10 @@ protected void registerTileEntities() GameRegistry.registerTileEntity(TileEntityRoad.class, "MF_Road"); } - - public void preInit() - { + public void preInit() { } - public void registerTickHandlers() - { + public void registerTickHandlers() { FMLCommonHandler.instance().bus().register(new PlayerTickHandlerMF()); FMLCommonHandler.instance().bus().register(new HungerSystemMF()); MinecraftForge.EVENT_BUS.register(new EventManagerMF()); @@ -161,32 +170,28 @@ public void registerTickHandlers() MinecraftForge.EVENT_BUS.register(new ArrowHandlerMF()); } - public EntityPlayer getClientPlayer() - { + public EntityPlayer getClientPlayer() { return null; } - + public static int renderID = -1; private static Random rand = new Random(); + @Override - public void spawnSmoke(World world, double x, double y, double z, int value) - { - for(int a = 0; a < value; a++) - { + public void spawnSmoke(World world, double x, double y, double z, int value) { + for (int a = 0; a < value; a++) { float sprayRange = 0.005F; - float sprayX = (rand.nextFloat()*sprayRange) - (sprayRange/2); - float sprayZ = (rand.nextFloat()*sprayRange) - (sprayRange/2); + float sprayX = (rand.nextFloat() * sprayRange) - (sprayRange / 2); + float sprayZ = (rand.nextFloat() * sprayRange) - (sprayRange / 2); float height = 0.001F; - if(rand.nextInt(2) == 0) - { - EntitySmoke smoke = new EntitySmoke(world ,x, y-0.5D, z, sprayX, height, sprayZ); + if (rand.nextInt(2) == 0) { + EntitySmoke smoke = new EntitySmoke(world, x, y - 0.5D, z, sprayX, height, sprayZ); world.spawnEntityInWorld(smoke); } } } - public void postInit() - { + public void postInit() { EntityListMF.register(); } diff --git a/src/main/java/minefantasy/mf2/network/packet/AmmoBoxPacket.java b/src/main/java/minefantasy/mf2/network/packet/AmmoBoxPacket.java index 5815d6c2..38741fb7 100644 --- a/src/main/java/minefantasy/mf2/network/packet/AmmoBoxPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/AmmoBoxPacket.java @@ -7,49 +7,43 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -public class AmmoBoxPacket extends PacketMF -{ +public class AmmoBoxPacket extends PacketMF { public static final String packetName = "MF2_AmmoBoxPkt"; private int[] coords = new int[3]; private int stock; private ItemStack ammo; - public AmmoBoxPacket(TileEntityAmmoBox tile) - { - this.coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public AmmoBoxPacket(TileEntityAmmoBox tile) { + this.coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; this.ammo = tile.ammo; this.stock = tile.stock; } + public AmmoBoxPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - stock = packet.readInt(); - ammo = ByteBufUtils.readItemStack(packet); - - if(entity != null && entity instanceof TileEntityAmmoBox) - { - TileEntityAmmoBox tile = (TileEntityAmmoBox)entity; - tile.ammo = this.ammo; - tile.stock = this.stock; - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + stock = packet.readInt(); + ammo = ByteBufUtils.readItemStack(packet); + + if (entity != null && entity instanceof TileEntityAmmoBox) { + TileEntityAmmoBox tile = (TileEntityAmmoBox) entity; + tile.ammo = this.ammo; + tile.stock = this.stock; + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeInt(stock); diff --git a/src/main/java/minefantasy/mf2/network/packet/AnvilPacket.java b/src/main/java/minefantasy/mf2/network/packet/AnvilPacket.java index 89387f4e..2b49001d 100644 --- a/src/main/java/minefantasy/mf2/network/packet/AnvilPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/AnvilPacket.java @@ -1,13 +1,12 @@ package minefantasy.mf2.network.packet; +import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class AnvilPacket extends PacketMF -{ +public class AnvilPacket extends PacketMF { public static final String packetName = "MF2_AnvilPacket"; private int[] coords = new int[3]; private String resultName; @@ -16,16 +15,15 @@ public class AnvilPacket extends PacketMF private float[] floats = new float[6]; private int[] tiers = new int[2]; - public AnvilPacket(TileEntityAnvilMF tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public AnvilPacket(TileEntityAnvilMF tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; resultName = tile.getResultName(); toolNeeded = tile.getToolNeeded(); research = tile.getResearchNeeded(); - floats = new float[]{tile.progress, tile.progressMax, tile.qualityBalance, tile.thresholdPosition, tile.leftHit, tile.rightHit}; - tiers = new int[]{tile.getToolTierNeeded(), tile.getAnvilTierNeeded()}; - if(floats[1] <= 0) - { + floats = new float[] { tile.progress, tile.progressMax, tile.qualityBalance, tile.thresholdPosition, + tile.leftHit, tile.rightHit }; + tiers = new int[] { tile.getToolTierNeeded(), tile.getAnvilTierNeeded() }; + if (floats[1] <= 0) { floats[1] = 0; } } @@ -34,55 +32,49 @@ public AnvilPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if(entity != null && entity instanceof TileEntityAnvilMF) - { - floats[0] = packet.readFloat(); - floats[1] = packet.readFloat(); - floats[2] = packet.readFloat(); - floats[3] = packet.readFloat(); - floats[4] = packet.readFloat(); - floats[5] = packet.readFloat(); - tiers[0] = packet.readInt(); - tiers[1] = packet.readInt(); - resultName = ByteBufUtils.readUTF8String(packet); - toolNeeded = ByteBufUtils.readUTF8String(packet); - research = ByteBufUtils.readUTF8String(packet); - - TileEntityAnvilMF anvil = (TileEntityAnvilMF)entity; - anvil.resName = resultName; - anvil.setToolType(toolNeeded); - anvil.progress = floats[0]; - anvil.progressMax = floats[1]; - anvil.qualityBalance = floats[2]; - anvil.thresholdPosition = floats[3]; - anvil.leftHit = floats[4]; - anvil.rightHit = floats[5]; - anvil.setHammerUsed(tiers[0]); - anvil.setRequiredAnvil(tiers[1]); - anvil.setResearch(research); - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (entity != null && entity instanceof TileEntityAnvilMF) { + floats[0] = packet.readFloat(); + floats[1] = packet.readFloat(); + floats[2] = packet.readFloat(); + floats[3] = packet.readFloat(); + floats[4] = packet.readFloat(); + floats[5] = packet.readFloat(); + tiers[0] = packet.readInt(); + tiers[1] = packet.readInt(); + resultName = ByteBufUtils.readUTF8String(packet); + toolNeeded = ByteBufUtils.readUTF8String(packet); + research = ByteBufUtils.readUTF8String(packet); + + TileEntityAnvilMF anvil = (TileEntityAnvilMF) entity; + anvil.resName = resultName; + anvil.setToolType(toolNeeded); + anvil.progress = floats[0]; + anvil.progressMax = floats[1]; + anvil.qualityBalance = floats[2]; + anvil.thresholdPosition = floats[3]; + anvil.leftHit = floats[4]; + anvil.rightHit = floats[5]; + anvil.setHammerUsed(tiers[0]); + anvil.setRequiredAnvil(tiers[1]); + anvil.setResearch(research); + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } - for(int a = 0; a < floats.length; a++) - { + for (int a = 0; a < floats.length; a++) { packet.writeFloat(floats[a]); } packet.writeInt(tiers[0]); diff --git a/src/main/java/minefantasy/mf2/network/packet/BigFurnacePacket.java b/src/main/java/minefantasy/mf2/network/packet/BigFurnacePacket.java index 4e4a8948..9a43369a 100644 --- a/src/main/java/minefantasy/mf2/network/packet/BigFurnacePacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/BigFurnacePacket.java @@ -4,22 +4,19 @@ import minefantasy.mf2.block.tileentity.TileEntityBigFurnace; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class BigFurnacePacket extends PacketMF -{ +public class BigFurnacePacket extends PacketMF { public static final String packetName = "MF2_BigfurnPkt"; private int[] coords = new int[3]; private int fuel, progress, burn, doorAngle; - - public BigFurnacePacket(TileEntityBigFurnace tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + + public BigFurnacePacket(TileEntityBigFurnace tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; fuel = tile.fuel; progress = tile.progress; - //heat = (int)tile.heat; + // heat = (int)tile.heat; burn = tile.isBurning() ? 1 : 0; - //justShared = tile.justShared; + // justShared = tile.justShared; doorAngle = tile.doorAngle; } @@ -27,54 +24,48 @@ public BigFurnacePacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - - fuel = packet.readInt(); + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + + fuel = packet.readInt(); progress = packet.readInt(); - //heat = packet.readInt(); + // heat = packet.readInt(); burn = packet.readInt(); - //justShared = packet.readInt(); + // justShared = packet.readInt(); doorAngle = packet.readInt(); - - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if(entity != null && entity instanceof TileEntityBigFurnace) - { - TileEntityBigFurnace tile = (TileEntityBigFurnace)entity; - - tile.fuel = fuel; - tile.progress = progress; - //tile.heat = heat; - //tile.justShared = justShared; + + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (entity != null && entity instanceof TileEntityBigFurnace) { + TileEntityBigFurnace tile = (TileEntityBigFurnace) entity; + + tile.fuel = fuel; + tile.progress = progress; + // tile.heat = heat; + // tile.justShared = justShared; tile.doorAngle = doorAngle; - - if(tile.getWorldObj().isRemote) - { + + if (tile.getWorldObj().isRemote) { tile.isBurningClient = (burn == 1); } - } + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeInt(fuel); packet.writeInt(progress); - //packet.writeInt(heat); + // packet.writeInt(heat); packet.writeInt(burn); - //packet.writeInt(justShared); + // packet.writeInt(justShared); packet.writeInt(doorAngle); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/BloomeryPacket.java b/src/main/java/minefantasy/mf2/network/packet/BloomeryPacket.java index 0a8794d7..cf678685 100644 --- a/src/main/java/minefantasy/mf2/network/packet/BloomeryPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/BloomeryPacket.java @@ -4,17 +4,14 @@ import minefantasy.mf2.block.tileentity.TileEntityBloomery; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class BloomeryPacket extends PacketMF -{ +public class BloomeryPacket extends PacketMF { public static final String packetName = "MF2_BloomeryPacket"; private int[] coords = new int[3]; private boolean renderBloom, isActive; - public BloomeryPacket(TileEntityBloomery tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public BloomeryPacket(TileEntityBloomery tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; renderBloom = tile.hasBloom(); isActive = tile.isActive; } @@ -23,33 +20,28 @@ public BloomeryPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - renderBloom = packet.readBoolean(); - isActive = packet.readBoolean(); - - if(entity != null && entity instanceof TileEntityBloomery) - { - TileEntityBloomery tile = (TileEntityBloomery)entity; - tile.hasBloom = renderBloom; - tile.isActive = isActive; - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + renderBloom = packet.readBoolean(); + isActive = packet.readBoolean(); + + if (entity != null && entity instanceof TileEntityBloomery) { + TileEntityBloomery tile = (TileEntityBloomery) entity; + tile.hasBloom = renderBloom; + tile.isActive = isActive; + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeBoolean(renderBloom); diff --git a/src/main/java/minefantasy/mf2/network/packet/BombBenchPacket.java b/src/main/java/minefantasy/mf2/network/packet/BombBenchPacket.java index bddd3760..ce28840a 100644 --- a/src/main/java/minefantasy/mf2/network/packet/BombBenchPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/BombBenchPacket.java @@ -4,19 +4,16 @@ import minefantasy.mf2.block.tileentity.TileEntityBombBench; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class BombBenchPacket extends PacketMF -{ +public class BombBenchPacket extends PacketMF { public static final String packetName = "MF2_BombBenchPkt"; private int[] coords = new int[3]; private float progress; private float maxProgress; private boolean hasRecipe; - - public BombBenchPacket(TileEntityBombBench tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + + public BombBenchPacket(TileEntityBombBench tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; progress = tile.progress; maxProgress = tile.maxProgress; hasRecipe = tile.hasRecipe; @@ -26,34 +23,29 @@ public BombBenchPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - float newProgress = packet.readFloat(); - float newMaxProgress = packet.readFloat(); - boolean newRecipe = packet.readBoolean(); - - if(entity != null && entity instanceof TileEntityBombBench) - { - TileEntityBombBench tile = (TileEntityBombBench)entity; - tile.progress = newProgress; - tile.maxProgress = newMaxProgress; - tile.hasRecipe = newRecipe; - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + float newProgress = packet.readFloat(); + float newMaxProgress = packet.readFloat(); + boolean newRecipe = packet.readBoolean(); + + if (entity != null && entity instanceof TileEntityBombBench) { + TileEntityBombBench tile = (TileEntityBombBench) entity; + tile.progress = newProgress; + tile.maxProgress = newMaxProgress; + tile.hasRecipe = newRecipe; + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeFloat(progress); diff --git a/src/main/java/minefantasy/mf2/network/packet/CarpenterPacket.java b/src/main/java/minefantasy/mf2/network/packet/CarpenterPacket.java index b0015ddf..d6cb361b 100644 --- a/src/main/java/minefantasy/mf2/network/packet/CarpenterPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/CarpenterPacket.java @@ -1,13 +1,12 @@ package minefantasy.mf2.network.packet; +import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class CarpenterPacket extends PacketMF -{ +public class CarpenterPacket extends PacketMF { public static final String packetName = "MF2_CarpenterPacket"; private int[] coords = new int[3]; private String resultName; @@ -16,15 +15,13 @@ public class CarpenterPacket extends PacketMF private int[] tiers = new int[2]; private String research; - public CarpenterPacket(TileEntityCarpenterMF tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public CarpenterPacket(TileEntityCarpenterMF tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; resultName = tile.getResultName(); toolNeeded = tile.getToolNeeded(); - progress = new float[]{tile.progress, tile.progressMax}; - tiers = new int[]{tile.getToolTierNeeded(), tile.getCarpenterTierNeeded()}; - if(progress[1] <= 0) - { + progress = new float[] { tile.progress, tile.progressMax }; + tiers = new int[] { tile.getToolTierNeeded(), tile.getCarpenterTierNeeded() }; + if (progress[1] <= 0) { progress[1] = 0; } research = tile.getResearchNeeded(); @@ -34,43 +31,38 @@ public CarpenterPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if(entity != null && entity instanceof TileEntityCarpenterMF) - { - progress[0] = packet.readFloat(); - progress[1] = packet.readFloat(); - tiers[0] = packet.readInt(); - tiers[1] = packet.readInt(); - resultName = ByteBufUtils.readUTF8String(packet); - toolNeeded = ByteBufUtils.readUTF8String(packet); - research = ByteBufUtils.readUTF8String(packet); - - TileEntityCarpenterMF carpenter = (TileEntityCarpenterMF)entity; - carpenter.resName = resultName; - carpenter.setToolType(toolNeeded); - carpenter.setResearch(research); - carpenter.progress = progress[0]; - carpenter.progressMax = progress[1]; - carpenter.setToolTier(tiers[0]); - carpenter.setRequiredCarpenter(tiers[1]); - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (entity != null && entity instanceof TileEntityCarpenterMF) { + progress[0] = packet.readFloat(); + progress[1] = packet.readFloat(); + tiers[0] = packet.readInt(); + tiers[1] = packet.readInt(); + resultName = ByteBufUtils.readUTF8String(packet); + toolNeeded = ByteBufUtils.readUTF8String(packet); + research = ByteBufUtils.readUTF8String(packet); + + TileEntityCarpenterMF carpenter = (TileEntityCarpenterMF) entity; + carpenter.resName = resultName; + carpenter.setToolType(toolNeeded); + carpenter.setResearch(research); + carpenter.progress = progress[0]; + carpenter.progressMax = progress[1]; + carpenter.setToolTier(tiers[0]); + carpenter.setRequiredCarpenter(tiers[1]); + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeFloat(progress[0]); diff --git a/src/main/java/minefantasy/mf2/network/packet/ChimneyPacket.java b/src/main/java/minefantasy/mf2/network/packet/ChimneyPacket.java index f25310ce..7612136f 100644 --- a/src/main/java/minefantasy/mf2/network/packet/ChimneyPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/ChimneyPacket.java @@ -1,23 +1,18 @@ package minefantasy.mf2.network.packet; import io.netty.buffer.ByteBuf; -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.block.tileentity.TileEntityChimney; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class ChimneyPacket extends PacketMF -{ +public class ChimneyPacket extends PacketMF { public static final String packetName = "MF2_ChimneyPacket"; private int[] coords = new int[3]; private int block, meta; - public ChimneyPacket(TileEntityChimney tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public ChimneyPacket(TileEntityChimney tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; block = Block.getIdFromBlock(tile.maskBlock); meta = tile.blockMetadata; } @@ -26,32 +21,27 @@ public ChimneyPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if(entity != null && entity instanceof TileEntityChimney) - { - TileEntityChimney tile = (TileEntityChimney)entity; - - int blockID = packet.readInt(); - int blockMetadata = packet.readInt(); - tile.setBlock(blockID, blockMetadata); - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (entity != null && entity instanceof TileEntityChimney) { + TileEntityChimney tile = (TileEntityChimney) entity; + + int blockID = packet.readInt(); + int blockMetadata = packet.readInt(); + tile.setBlock(blockID, blockMetadata); + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeInt(block); diff --git a/src/main/java/minefantasy/mf2/network/packet/CogworkControlPacket.java b/src/main/java/minefantasy/mf2/network/packet/CogworkControlPacket.java index b6925b83..a4adbde3 100644 --- a/src/main/java/minefantasy/mf2/network/packet/CogworkControlPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/CogworkControlPacket.java @@ -1,22 +1,17 @@ package minefantasy.mf2.network.packet; import io.netty.buffer.ByteBuf; -import minefantasy.mf2.api.knowledge.InformationBase; -import minefantasy.mf2.api.knowledge.InformationList; -import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.entity.EntityCogwork; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -public class CogworkControlPacket extends PacketMF -{ +public class CogworkControlPacket extends PacketMF { public static final String packetName = "MF2_CogworkCtrl"; private EntityCogwork suit; private float forward, strafe; private boolean isJumping; - public CogworkControlPacket(EntityCogwork suit) - { + public CogworkControlPacket(EntityCogwork suit) { this.suit = suit; this.forward = suit.getMoveForward(); this.strafe = suit.getMoveStrafe(); @@ -27,32 +22,28 @@ public CogworkControlPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { + public void process(ByteBuf packet, EntityPlayer player) { int id = packet.readInt(); forward = packet.readFloat(); strafe = packet.readFloat(); isJumping = packet.readBoolean(); Entity entity = player.worldObj.getEntityByID(id); - - if (entity != null && entity instanceof EntityCogwork) - { - suit = (EntityCogwork)entity; + + if (entity != null && entity instanceof EntityCogwork) { + suit = (EntityCogwork) entity; suit.setMoveForward(forward); suit.setMoveStrafe(strafe); suit.setJumpControl(isJumping); - } + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { + public void write(ByteBuf packet) { packet.writeInt(suit.getEntityId()); packet.writeFloat(forward); packet.writeFloat(strafe); diff --git a/src/main/java/minefantasy/mf2/network/packet/CrossbowBenchPacket.java b/src/main/java/minefantasy/mf2/network/packet/CrossbowBenchPacket.java index c6880b75..d5346798 100644 --- a/src/main/java/minefantasy/mf2/network/packet/CrossbowBenchPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/CrossbowBenchPacket.java @@ -4,19 +4,16 @@ import minefantasy.mf2.block.tileentity.TileEntityCrossbowBench; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class CrossbowBenchPacket extends PacketMF -{ +public class CrossbowBenchPacket extends PacketMF { public static final String packetName = "MF2_CrossbowBenchPkt"; private int[] coords = new int[3]; private float progress; private float maxProgress; private boolean hasRecipe; - - public CrossbowBenchPacket(TileEntityCrossbowBench tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + + public CrossbowBenchPacket(TileEntityCrossbowBench tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; progress = tile.progress; maxProgress = tile.maxProgress; hasRecipe = tile.hasRecipe; @@ -26,34 +23,29 @@ public CrossbowBenchPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - float newProgress = packet.readFloat(); - float newMaxProgress = packet.readFloat(); - boolean newRecipe = packet.readBoolean(); - - if(entity != null && entity instanceof TileEntityCrossbowBench) - { - TileEntityCrossbowBench tile = (TileEntityCrossbowBench)entity; - tile.progress = newProgress; - tile.maxProgress = newMaxProgress; - tile.hasRecipe = newRecipe; - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + float newProgress = packet.readFloat(); + float newMaxProgress = packet.readFloat(); + boolean newRecipe = packet.readBoolean(); + + if (entity != null && entity instanceof TileEntityCrossbowBench) { + TileEntityCrossbowBench tile = (TileEntityCrossbowBench) entity; + tile.progress = newProgress; + tile.maxProgress = newMaxProgress; + tile.hasRecipe = newRecipe; + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeFloat(progress); diff --git a/src/main/java/minefantasy/mf2/network/packet/DodgeCommand.java b/src/main/java/minefantasy/mf2/network/packet/DodgeCommand.java index a458f2ac..db6e54bc 100644 --- a/src/main/java/minefantasy/mf2/network/packet/DodgeCommand.java +++ b/src/main/java/minefantasy/mf2/network/packet/DodgeCommand.java @@ -1,23 +1,17 @@ package minefantasy.mf2.network.packet; +import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; -import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.api.knowledge.InformationBase; -import minefantasy.mf2.api.knowledge.InformationList; -import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.mechanics.CombatMechanics; import net.minecraft.entity.player.EntityPlayer; -import cpw.mods.fml.common.network.ByteBufUtils; -public class DodgeCommand extends PacketMF -{ +public class DodgeCommand extends PacketMF { public static final String packetName = "MF2_Command_Dodge"; private EntityPlayer user; private int ID; private String username; - public DodgeCommand(EntityPlayer user, int id) - { + public DodgeCommand(EntityPlayer user, int id) { this.ID = id; this.username = user.getCommandSenderName(); this.user = user; @@ -27,27 +21,23 @@ public DodgeCommand() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { + public void process(ByteBuf packet, EntityPlayer player) { ID = packet.readInt(); username = ByteBufUtils.readUTF8String(packet); - - if (username != null && player.getCommandSenderName().equals(username)) - { - CombatMechanics.initDodge(player, ID); - } + + if (username != null && player.getCommandSenderName().equals(username)) { + CombatMechanics.initDodge(player, ID); + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { + public void write(ByteBuf packet) { packet.writeInt(ID); - ByteBufUtils.writeUTF8String(packet, username); + ByteBufUtils.writeUTF8String(packet, username); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/FirepitPacket.java b/src/main/java/minefantasy/mf2/network/packet/FirepitPacket.java index d2bfed25..92a56bcf 100644 --- a/src/main/java/minefantasy/mf2/network/packet/FirepitPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/FirepitPacket.java @@ -4,17 +4,14 @@ import minefantasy.mf2.block.tileentity.TileEntityFirepit; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class FirepitPacket extends PacketMF -{ +public class FirepitPacket extends PacketMF { public static final String packetName = "MF2_FirepitPacket"; private int[] coords = new int[3]; private int fuel = 0; - - public FirepitPacket(TileEntityFirepit tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + + public FirepitPacket(TileEntityFirepit tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; this.fuel = tile.fuel; } @@ -22,31 +19,26 @@ public FirepitPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - fuel = packet.readInt(); - - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if(entity != null && entity instanceof TileEntityFirepit) - { - TileEntityFirepit tile = (TileEntityFirepit)entity; - tile.fuel = fuel; - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + fuel = packet.readInt(); + + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (entity != null && entity instanceof TileEntityFirepit) { + TileEntityFirepit tile = (TileEntityFirepit) entity; + tile.fuel = fuel; + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeInt(fuel); diff --git a/src/main/java/minefantasy/mf2/network/packet/ForgePacket.java b/src/main/java/minefantasy/mf2/network/packet/ForgePacket.java index 58373bb5..105b7748 100644 --- a/src/main/java/minefantasy/mf2/network/packet/ForgePacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/ForgePacket.java @@ -4,25 +4,21 @@ import minefantasy.mf2.block.tileentity.TileEntityForge; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class ForgePacket extends PacketMF -{ +public class ForgePacket extends PacketMF { public static final String packetName = "MF2_ForgePacket"; private int[] coords = new int[3]; private float[] fuels = new float[2]; private float[] temps = new float[3]; private int workableState; - - public ForgePacket(TileEntityForge tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; - fuels = new float[]{tile.fuel, tile.maxFuel}; - if(fuels[0] > fuels[1]) - { + + public ForgePacket(TileEntityForge tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; + fuels = new float[] { tile.fuel, tile.maxFuel }; + if (fuels[0] > fuels[1]) { fuels[0] = fuels[1]; } - temps = new float[]{tile.temperature, tile.fuelTemperature, tile.getHeat()}; + temps = new float[] { tile.temperature, tile.fuelTemperature, tile.getHeat() }; workableState = tile.getWorkableState(); } @@ -30,41 +26,36 @@ public ForgePacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - fuels[0] = packet.readFloat(); - fuels[1] = packet.readFloat(); - temps[0] = packet.readFloat(); - temps[1] = packet.readFloat(); - temps[2] = packet.readFloat(); - workableState = packet.readInt(); - - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if(entity != null && entity instanceof TileEntityForge) - { - TileEntityForge tile = (TileEntityForge)entity; - tile.fuel = fuels[0]; - tile.maxFuel = fuels[1]; - tile.temperature = temps[0]; - tile.fuelTemperature = temps[1]; - tile.exactTemperature = (int)temps[2]; - tile.workableState = workableState; - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + fuels[0] = packet.readFloat(); + fuels[1] = packet.readFloat(); + temps[0] = packet.readFloat(); + temps[1] = packet.readFloat(); + temps[2] = packet.readFloat(); + workableState = packet.readInt(); + + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (entity != null && entity instanceof TileEntityForge) { + TileEntityForge tile = (TileEntityForge) entity; + tile.fuel = fuels[0]; + tile.maxFuel = fuels[1]; + tile.temperature = temps[0]; + tile.fuelTemperature = temps[1]; + tile.exactTemperature = (int) temps[2]; + tile.workableState = workableState; + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeFloat(fuels[0]); diff --git a/src/main/java/minefantasy/mf2/network/packet/HitSoundPacket.java b/src/main/java/minefantasy/mf2/network/packet/HitSoundPacket.java index bee43b92..b895b5b0 100644 --- a/src/main/java/minefantasy/mf2/network/packet/HitSoundPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/HitSoundPacket.java @@ -1,19 +1,17 @@ package minefantasy.mf2.network.packet; +import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; import minefantasy.mf2.config.ConfigClient; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import cpw.mods.fml.common.network.ByteBufUtils; -public class HitSoundPacket extends PacketMF -{ +public class HitSoundPacket extends PacketMF { public static final String packetName = "MF2_Hitsound"; private String sound; private int entId; - public HitSoundPacket(String sound, Entity hit) - { + public HitSoundPacket(String sound, Entity hit) { this.sound = sound; this.entId = hit.getEntityId(); } @@ -22,30 +20,25 @@ public HitSoundPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - entId = packet.readInt(); - sound = ByteBufUtils.readUTF8String(packet); - Entity entity = player.worldObj.getEntityByID(entId); - if (entity != null) - { - if(ConfigClient.playHitsound) - { - entity.worldObj.playSound(entity.posX, entity.posY, entity.posZ, sound, 1.0F, 1.0F, false); - } - } + public void process(ByteBuf packet, EntityPlayer player) { + entId = packet.readInt(); + sound = ByteBufUtils.readUTF8String(packet); + Entity entity = player.worldObj.getEntityByID(entId); + if (entity != null) { + if (ConfigClient.playHitsound) { + entity.worldObj.playSound(entity.posX, entity.posY, entity.posZ, sound, 1.0F, 1.0F, false); + } + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { + public void write(ByteBuf packet) { packet.writeInt(entId); - ByteBufUtils.writeUTF8String(packet, sound); + ByteBufUtils.writeUTF8String(packet, sound); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/KnowledgePacket.java b/src/main/java/minefantasy/mf2/network/packet/KnowledgePacket.java index 86e861d7..9247b57c 100644 --- a/src/main/java/minefantasy/mf2/network/packet/KnowledgePacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/KnowledgePacket.java @@ -1,26 +1,21 @@ package minefantasy.mf2.network.packet; -import io.netty.buffer.ByteBuf; - import java.util.ArrayList; import java.util.Iterator; -import minefantasy.mf2.MineFantasyII; +import cpw.mods.fml.common.network.ByteBufUtils; +import io.netty.buffer.ByteBuf; import minefantasy.mf2.api.knowledge.InformationBase; import minefantasy.mf2.api.knowledge.InformationList; import minefantasy.mf2.api.knowledge.ResearchLogic; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.entity.player.EntityPlayer; -import cpw.mods.fml.common.network.ByteBufUtils; -public class KnowledgePacket extends PacketMF -{ +public class KnowledgePacket extends PacketMF { public static final String packetName = "MF2_KnowledgeSync"; private EntityPlayer user; private String username; - public KnowledgePacket(EntityPlayer user) - { + public KnowledgePacket(EntityPlayer user) { this.username = user.getCommandSenderName(); this.user = user; } @@ -29,57 +24,48 @@ public KnowledgePacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { + public void process(ByteBuf packet, EntityPlayer player) { int size = InformationList.knowledgeList.size(); ArrayList completed = new ArrayList(); - for(int a = 0; a < size; a++) - { + for (int a = 0; a < size; a++) { boolean unlocked = packet.readBoolean(); int artefactCount = packet.readInt(); - + InformationBase base = InformationList.knowledgeList.get(a); - if(base != null) - { - completed.add(new Object[]{base, unlocked, artefactCount}); + if (base != null) { + completed.add(new Object[] { base, unlocked, artefactCount }); } } username = ByteBufUtils.readUTF8String(packet); - if(username != null && player.getCommandSenderName().equals(username)) - { - Iterator researches = completed.iterator(); - while(researches.hasNext()) - { - Object[] entry = (Object[])researches.next(); - InformationBase base = (InformationBase) entry[0]; - ResearchLogic.setArtefactCount(base.getUnlocalisedName(), player, (Integer)entry[2]); - if((Boolean) entry[1]) - { - ResearchLogic.forceUnlock(player, base); - } - } - } - packet.clear(); - completed = null; + if (username != null && player.getCommandSenderName().equals(username)) { + Iterator researches = completed.iterator(); + while (researches.hasNext()) { + Object[] entry = (Object[]) researches.next(); + InformationBase base = (InformationBase) entry[0]; + ResearchLogic.setArtefactCount(base.getUnlocalisedName(), player, (Integer) entry[2]); + if ((Boolean) entry[1]) { + ResearchLogic.forceUnlock(player, base); + } + } + } + packet.clear(); + completed = null; } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { + public void write(ByteBuf packet) { int size = InformationList.knowledgeList.size(); - - for(int a = 0; a < size; a++) - { + + for (int a = 0; a < size; a++) { InformationBase base = InformationList.knowledgeList.get(a); packet.writeBoolean(ResearchLogic.hasInfoUnlocked(user, base)); packet.writeInt(ResearchLogic.getArtefactCount(base.getUnlocalisedName(), user)); } - ByteBufUtils.writeUTF8String(packet, username); + ByteBufUtils.writeUTF8String(packet, username); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/LevelupPacket.java b/src/main/java/minefantasy/mf2/network/packet/LevelupPacket.java index 6726090a..9ec8cd55 100644 --- a/src/main/java/minefantasy/mf2/network/packet/LevelupPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/LevelupPacket.java @@ -1,30 +1,21 @@ package minefantasy.mf2.network.packet; +import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; - -import java.util.ArrayList; -import java.util.Iterator; - -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.Skill; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ChatComponentText; import net.minecraft.util.StatCollector; -import cpw.mods.fml.common.network.ByteBufUtils; -public class LevelupPacket extends PacketMF -{ +public class LevelupPacket extends PacketMF { public static final String packetName = "MF2_levelup"; private EntityPlayer user; private String username; private int level; private String skillName; - public LevelupPacket(EntityPlayer user, Skill skill, int level) - { + public LevelupPacket(EntityPlayer user, Skill skill, int level) { this.username = user.getCommandSenderName(); this.user = user; this.skillName = skill.skillName; @@ -35,35 +26,31 @@ public LevelupPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { + public void process(ByteBuf packet, EntityPlayer player) { String name = ByteBufUtils.readUTF8String(packet); int skillLvl = packet.readInt(); - + username = ByteBufUtils.readUTF8String(packet); - if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) - { - Skill skill = RPGElements.getSkillByName(name); - - if(skill != null) - { - player.playSound("random.levelup", 1.0F, 0.5F); - player.addChatMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("rpg.levelup", skill.getDisplayName().toLowerCase(), skillLvl))); - } - } + if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) { + Skill skill = RPGElements.getSkillByName(name); + + if (skill != null) { + player.playSound("random.levelup", 1.0F, 0.5F); + player.addChatMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("rpg.levelup", + skill.getDisplayName().toLowerCase(), skillLvl))); + } + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { + public void write(ByteBuf packet) { ByteBufUtils.writeUTF8String(packet, skillName); packet.writeInt(level); - ByteBufUtils.writeUTF8String(packet, username); + ByteBufUtils.writeUTF8String(packet, username); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java b/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java index 1e2fe5d1..e790ff9c 100644 --- a/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java +++ b/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java @@ -13,71 +13,65 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.NetHandlerPlayServer; -public class PacketHandlerMF -{ - public Map packetList = new Hashtable(); - public Map channels = new Hashtable(); +public class PacketHandlerMF { + public Map packetList = new Hashtable(); + public Map channels = new Hashtable(); - public PacketHandlerMF() - { - packetList.put(StaminaPacket.packetName, new StaminaPacket()); - packetList.put(ParryPacket.packetName, new ParryPacket()); - packetList.put(HitSoundPacket.packetName, new HitSoundPacket()); - packetList.put(AnvilPacket.packetName, new AnvilPacket()); - packetList.put(CarpenterPacket.packetName, new CarpenterPacket()); - packetList.put(KnowledgePacket.packetName, new KnowledgePacket()); - packetList.put(ResearchRequest.packetName, new ResearchRequest()); - packetList.put(ChimneyPacket.packetName, new ChimneyPacket()); - packetList.put(SkillPacket.packetName, new SkillPacket()); - packetList.put(LevelupPacket.packetName, new LevelupPacket()); - packetList.put(ForgePacket.packetName, new ForgePacket()); - packetList.put(ResearchTablePacket.packetName, new ResearchTablePacket()); - packetList.put(TroughPacket.packetName, new TroughPacket()); - packetList.put(BombBenchPacket.packetName, new BombBenchPacket()); - packetList.put(TannerPacket.packetName, new TannerPacket()); - packetList.put(RoadPacket.packetName, new RoadPacket()); - packetList.put(BloomeryPacket.packetName, new BloomeryPacket()); - packetList.put(CrossbowBenchPacket.packetName, new CrossbowBenchPacket()); - packetList.put(FirepitPacket.packetName, new FirepitPacket()); - packetList.put(TileInventoryPacket.packetName, new TileInventoryPacket()); - packetList.put(BigFurnacePacket.packetName, new BigFurnacePacket()); - packetList.put(DodgeCommand.packetName, new DodgeCommand()); - packetList.put(RackCommand.packetName, new RackCommand()); - packetList.put(AmmoBoxPacket.packetName, new AmmoBoxPacket()); - packetList.put(WoodDecorPacket.packetName, new WoodDecorPacket()); - packetList.put(CogworkControlPacket.packetName, new CogworkControlPacket()); - packetList.put(StorageBlockPacket.packetName, new StorageBlockPacket()); - } + public PacketHandlerMF() { + packetList.put(StaminaPacket.packetName, new StaminaPacket()); + packetList.put(ParryPacket.packetName, new ParryPacket()); + packetList.put(HitSoundPacket.packetName, new HitSoundPacket()); + packetList.put(AnvilPacket.packetName, new AnvilPacket()); + packetList.put(CarpenterPacket.packetName, new CarpenterPacket()); + packetList.put(KnowledgePacket.packetName, new KnowledgePacket()); + packetList.put(ResearchRequest.packetName, new ResearchRequest()); + packetList.put(ChimneyPacket.packetName, new ChimneyPacket()); + packetList.put(SkillPacket.packetName, new SkillPacket()); + packetList.put(LevelupPacket.packetName, new LevelupPacket()); + packetList.put(ForgePacket.packetName, new ForgePacket()); + packetList.put(ResearchTablePacket.packetName, new ResearchTablePacket()); + packetList.put(TroughPacket.packetName, new TroughPacket()); + packetList.put(BombBenchPacket.packetName, new BombBenchPacket()); + packetList.put(TannerPacket.packetName, new TannerPacket()); + packetList.put(RoadPacket.packetName, new RoadPacket()); + packetList.put(BloomeryPacket.packetName, new BloomeryPacket()); + packetList.put(CrossbowBenchPacket.packetName, new CrossbowBenchPacket()); + packetList.put(FirepitPacket.packetName, new FirepitPacket()); + packetList.put(TileInventoryPacket.packetName, new TileInventoryPacket()); + packetList.put(BigFurnacePacket.packetName, new BigFurnacePacket()); + packetList.put(DodgeCommand.packetName, new DodgeCommand()); + packetList.put(RackCommand.packetName, new RackCommand()); + packetList.put(AmmoBoxPacket.packetName, new AmmoBoxPacket()); + packetList.put(WoodDecorPacket.packetName, new WoodDecorPacket()); + packetList.put(CogworkControlPacket.packetName, new CogworkControlPacket()); + packetList.put(StorageBlockPacket.packetName, new StorageBlockPacket()); + } - @SubscribeEvent - public void onServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event) - { - packetList.get(event.packet.channel()).process(event.packet.payload(), ((NetHandlerPlayServer)event.handler).playerEntity); - } + @SubscribeEvent + public void onServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event) { + packetList.get(event.packet.channel()).process(event.packet.payload(), + ((NetHandlerPlayServer) event.handler).playerEntity); + } - @SubscribeEvent - public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) - { - packetList.get(event.packet.channel()).process(event.packet.payload(), MineFantasyII.proxy.getClientPlayer()); - } + @SubscribeEvent + public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) { + packetList.get(event.packet.channel()).process(event.packet.payload(), MineFantasyII.proxy.getClientPlayer()); + } - public void sendPacketToPlayer(FMLProxyPacket packet, EntityPlayerMP player) - { - channels.get(packet.channel()).sendTo(packet, player); - } + public void sendPacketToPlayer(FMLProxyPacket packet, EntityPlayerMP player) { + channels.get(packet.channel()).sendTo(packet, player); + } - public void sendPacketToServer(FMLProxyPacket packet) - { - channels.get(packet.channel()).sendToServer(packet); - } + public void sendPacketToServer(FMLProxyPacket packet) { + channels.get(packet.channel()).sendToServer(packet); + } - public void sendPacketAround(Entity entity, double range, FMLProxyPacket packet) - { - channels.get(packet.channel()).sendToAllAround(packet, new NetworkRegistry.TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, range)); - } + public void sendPacketAround(Entity entity, double range, FMLProxyPacket packet) { + channels.get(packet.channel()).sendToAllAround(packet, + new NetworkRegistry.TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, range)); + } - public void sendPacketToAll(FMLProxyPacket packet) - { - channels.get(packet.channel()).sendToAll(packet); - } + public void sendPacketToAll(FMLProxyPacket packet) { + channels.get(packet.channel()).sendToAll(packet); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/PacketMF.java b/src/main/java/minefantasy/mf2/network/packet/PacketMF.java index cb40075d..3c99dd84 100644 --- a/src/main/java/minefantasy/mf2/network/packet/PacketMF.java +++ b/src/main/java/minefantasy/mf2/network/packet/PacketMF.java @@ -1,21 +1,21 @@ package minefantasy.mf2.network.packet; +import cpw.mods.fml.common.network.internal.FMLProxyPacket; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import net.minecraft.entity.player.EntityPlayer; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; -public abstract class PacketMF -{ +public abstract class PacketMF { + + public final FMLProxyPacket generatePacket() { + ByteBuf buf = Unpooled.buffer(); + write(buf); + return new FMLProxyPacket(buf, getChannel()); + } - public final FMLProxyPacket generatePacket() - { - ByteBuf buf = Unpooled.buffer(); - write(buf); - return new FMLProxyPacket(buf, getChannel()); - } - public abstract String getChannel(); + public abstract void write(ByteBuf out); + public abstract void process(ByteBuf in, EntityPlayer user); } diff --git a/src/main/java/minefantasy/mf2/network/packet/ParryPacket.java b/src/main/java/minefantasy/mf2/network/packet/ParryPacket.java index a3c02c11..33772f05 100644 --- a/src/main/java/minefantasy/mf2/network/packet/ParryPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/ParryPacket.java @@ -1,18 +1,16 @@ package minefantasy.mf2.network.packet; +import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; import minefantasy.mf2.mechanics.CombatMechanics; import net.minecraft.entity.player.EntityPlayer; -import cpw.mods.fml.common.network.ByteBufUtils; -public class ParryPacket extends PacketMF -{ +public class ParryPacket extends PacketMF { public static final String packetName = "MF2_ParryPacket"; private int value; private String username; - public ParryPacket(int value, EntityPlayer user) - { + public ParryPacket(int value, EntityPlayer user) { this.value = value; this.username = user.getCommandSenderName(); } @@ -21,29 +19,25 @@ public ParryPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - value = packet.readInt(); - username = ByteBufUtils.readUTF8String(packet); - - if (username != null) - { - EntityPlayer entity = player.worldObj .getPlayerEntityByName(username); - if(entity != null) - CombatMechanics.setParryCooldown(entity, value); - } + public void process(ByteBuf packet, EntityPlayer player) { + value = packet.readInt(); + username = ByteBufUtils.readUTF8String(packet); + + if (username != null) { + EntityPlayer entity = player.worldObj.getPlayerEntityByName(username); + if (entity != null) + CombatMechanics.setParryCooldown(entity, value); + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { + public void write(ByteBuf packet) { packet.writeInt(value); - ByteBufUtils.writeUTF8String(packet, username); + ByteBufUtils.writeUTF8String(packet, username); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/RackCommand.java b/src/main/java/minefantasy/mf2/network/packet/RackCommand.java index 256250ea..d047eb79 100644 --- a/src/main/java/minefantasy/mf2/network/packet/RackCommand.java +++ b/src/main/java/minefantasy/mf2/network/packet/RackCommand.java @@ -7,16 +7,14 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -public class RackCommand extends PacketMF -{ +public class RackCommand extends PacketMF { public static final String packetName = "MF2_Command_Rack"; private EntityPlayer user; private TileEntityRack rack; private int slot; private String username; - public RackCommand(int slot, EntityPlayer user, TileEntityRack rack) - { + public RackCommand(int slot, EntityPlayer user, TileEntityRack rack) { this.username = user.getCommandSenderName(); this.slot = slot; this.rack = rack; @@ -27,37 +25,33 @@ public RackCommand() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { + public void process(ByteBuf packet, EntityPlayer player) { int x = packet.readInt(); int y = packet.readInt(); int z = packet.readInt(); - + slot = packet.readInt(); username = ByteBufUtils.readUTF8String(packet); EntityPlayer user = player.worldObj.getPlayerEntityByName(username); TileEntity tile = player.worldObj.getTileEntity(x, y, z); - - if (user != null && tile != null && tile instanceof TileEntityRack) - { - rack = (TileEntityRack)tile; + + if (user != null && tile != null && tile instanceof TileEntityRack) { + rack = (TileEntityRack) tile; BlockRack.interact(slot, user.worldObj, rack, user); - } + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { + public void write(ByteBuf packet) { packet.writeInt(rack.xCoord); packet.writeInt(rack.yCoord); packet.writeInt(rack.zCoord); packet.writeInt(slot); - ByteBufUtils.writeUTF8String(packet, username); + ByteBufUtils.writeUTF8String(packet, username); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/ResearchRequest.java b/src/main/java/minefantasy/mf2/network/packet/ResearchRequest.java index e6e90009..f416bdb4 100644 --- a/src/main/java/minefantasy/mf2/network/packet/ResearchRequest.java +++ b/src/main/java/minefantasy/mf2/network/packet/ResearchRequest.java @@ -1,22 +1,19 @@ package minefantasy.mf2.network.packet; +import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.knowledge.InformationBase; import minefantasy.mf2.api.knowledge.InformationList; import minefantasy.mf2.api.knowledge.ResearchLogic; import net.minecraft.entity.player.EntityPlayer; -import cpw.mods.fml.common.network.ByteBufUtils; -public class ResearchRequest extends PacketMF -{ +public class ResearchRequest extends PacketMF { public static final String packetName = "MF2_RequestResearch"; private EntityPlayer user; private int researchID; private String username; - public ResearchRequest(EntityPlayer user, int id) - { + public ResearchRequest(EntityPlayer user, int id) { this.researchID = id; this.username = user.getCommandSenderName(); this.user = user; @@ -26,37 +23,30 @@ public ResearchRequest() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { + public void process(ByteBuf packet, EntityPlayer player) { researchID = packet.readInt(); username = ByteBufUtils.readUTF8String(packet); - - if (username != null && player.getCommandSenderName().equals(username)) - { - InformationBase research = InformationList.knowledgeList.get(researchID); - if(player != null && research != null && research.isEasy()) - { - if(!player.worldObj.isRemote) - { - if(research.onPurchase(player)) - { - ResearchLogic.syncData(player); - } - } - } - } + + if (username != null && player.getCommandSenderName().equals(username)) { + InformationBase research = InformationList.knowledgeList.get(researchID); + if (player != null && research != null && research.isEasy()) { + if (!player.worldObj.isRemote) { + if (research.onPurchase(player)) { + ResearchLogic.syncData(player); + } + } + } + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { + public void write(ByteBuf packet) { packet.writeInt(researchID); - ByteBufUtils.writeUTF8String(packet, username); + ByteBufUtils.writeUTF8String(packet, username); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/ResearchTablePacket.java b/src/main/java/minefantasy/mf2/network/packet/ResearchTablePacket.java index ffb9d50a..8648e08a 100644 --- a/src/main/java/minefantasy/mf2/network/packet/ResearchTablePacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/ResearchTablePacket.java @@ -4,22 +4,18 @@ import minefantasy.mf2.block.tileentity.TileEntityResearch; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class ResearchTablePacket extends PacketMF -{ +public class ResearchTablePacket extends PacketMF { public static final String packetName = "MF2_ResearchTblPkt"; private int[] coords = new int[3]; private int id; private float[] progress = new float[2]; - public ResearchTablePacket(TileEntityResearch tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public ResearchTablePacket(TileEntityResearch tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; id = tile.researchID; - progress = new float[]{tile.progress, tile.maxProgress}; - if(progress[1] <= 0) - { + progress = new float[] { tile.progress, tile.maxProgress }; + if (progress[1] <= 0) { progress[1] = 0; } } @@ -28,38 +24,33 @@ public ResearchTablePacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - float prog1 = packet.readFloat(); - float prog2 = packet.readFloat(); - int ID = packet.readInt(); - - if(entity != null && entity instanceof TileEntityResearch) - { - progress[0] = prog1; - progress[1] = prog2; - id = ID; - - TileEntityResearch carpenter = (TileEntityResearch)entity; - carpenter.researchID = id; - carpenter.progress = progress[0]; - carpenter.maxProgress = (int)progress[1]; - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + float prog1 = packet.readFloat(); + float prog2 = packet.readFloat(); + int ID = packet.readInt(); + + if (entity != null && entity instanceof TileEntityResearch) { + progress[0] = prog1; + progress[1] = prog2; + id = ID; + + TileEntityResearch carpenter = (TileEntityResearch) entity; + carpenter.researchID = id; + carpenter.progress = progress[0]; + carpenter.maxProgress = (int) progress[1]; + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeFloat(progress[0]); diff --git a/src/main/java/minefantasy/mf2/network/packet/RoadPacket.java b/src/main/java/minefantasy/mf2/network/packet/RoadPacket.java index 5cd5039a..3ae0bfc6 100644 --- a/src/main/java/minefantasy/mf2/network/packet/RoadPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/RoadPacket.java @@ -4,24 +4,21 @@ import minefantasy.mf2.block.tileentity.TileEntityRoad; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class RoadPacket extends PacketMF -{ +public class RoadPacket extends PacketMF { public static final String packetName = "MF2_RoadPacket"; private int[] coords = new int[3]; private int[] surface; private boolean isLocked; private boolean isRequest = false; - public RoadPacket(TileEntityRoad tile) - { - this.coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public RoadPacket(TileEntityRoad tile) { + this.coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; this.surface = tile.surface; this.isLocked = tile.isLocked; } - public RoadPacket request() - { + + public RoadPacket request() { isRequest = true; return this; } @@ -30,52 +27,43 @@ public RoadPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - this.coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - isRequest = packet.readBoolean(); - + public void process(ByteBuf packet, EntityPlayer player) { + this.coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + isRequest = packet.readBoolean(); + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if(entity != null && entity instanceof TileEntityRoad) - { - TileEntityRoad tile = (TileEntityRoad)entity; - if(isRequest) - { - tile.sendPacketToClients(); - } - else - { - int s0 = packet.readInt(); - int s1 = packet.readInt(); - this.isLocked = packet.readBoolean(); - - tile.surface = new int[]{s0, s1}; - tile.isLocked = this.isLocked; - - tile.refreshSurface(); - } - } - packet.clear(); + + if (entity != null && entity instanceof TileEntityRoad) { + TileEntityRoad tile = (TileEntityRoad) entity; + if (isRequest) { + tile.sendPacketToClients(); + } else { + int s0 = packet.readInt(); + int s1 = packet.readInt(); + this.isLocked = packet.readBoolean(); + + tile.surface = new int[] { s0, s1 }; + tile.isLocked = this.isLocked; + + tile.refreshSurface(); + } + } + packet.clear(); } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeBoolean(isRequest); - - if(!isRequest) - { + + if (!isRequest) { packet.writeInt(surface[0]); packet.writeInt(surface[1]); packet.writeBoolean(this.isLocked); diff --git a/src/main/java/minefantasy/mf2/network/packet/SkillPacket.java b/src/main/java/minefantasy/mf2/network/packet/SkillPacket.java index 7bd36f07..aede4d30 100644 --- a/src/main/java/minefantasy/mf2/network/packet/SkillPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/SkillPacket.java @@ -1,28 +1,20 @@ package minefantasy.mf2.network.packet; +import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; - -import java.util.ArrayList; -import java.util.Iterator; - -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.Skill; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; -import cpw.mods.fml.common.network.ByteBufUtils; -public class SkillPacket extends PacketMF -{ +public class SkillPacket extends PacketMF { public static final String packetName = "MF2_SkillSync"; private EntityPlayer user; private String username; private int level, xp, xpMax; private String skillName; - public SkillPacket(EntityPlayer user, Skill skill) - { + public SkillPacket(EntityPlayer user, Skill skill) { this.username = user.getCommandSenderName(); this.user = user; NBTTagCompound skilltag = RPGElements.getSkill(user, skill.skillName); @@ -36,36 +28,32 @@ public SkillPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { + public void process(ByteBuf packet, EntityPlayer player) { String name = ByteBufUtils.readUTF8String(packet); int skillLvl = packet.readInt(); int skillXp = packet.readInt(); int skillMaxXp = packet.readInt(); - + username = ByteBufUtils.readUTF8String(packet); - if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) - { - NBTTagCompound tag = RPGElements.getSkill(player, name); - tag.setInteger("level", skillLvl); - tag.setInteger("xp", skillXp); - tag.setInteger("xpMax", skillMaxXp); - } + if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) { + NBTTagCompound tag = RPGElements.getSkill(player, name); + tag.setInteger("level", skillLvl); + tag.setInteger("xp", skillXp); + tag.setInteger("xpMax", skillMaxXp); + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { + public void write(ByteBuf packet) { ByteBufUtils.writeUTF8String(packet, skillName); packet.writeInt(level); packet.writeInt(xp); packet.writeInt(xpMax); - ByteBufUtils.writeUTF8String(packet, username); + ByteBufUtils.writeUTF8String(packet, username); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/StaminaPacket.java b/src/main/java/minefantasy/mf2/network/packet/StaminaPacket.java index 0d4b2588..dbbfb30f 100644 --- a/src/main/java/minefantasy/mf2/network/packet/StaminaPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/StaminaPacket.java @@ -1,18 +1,16 @@ package minefantasy.mf2.network.packet; +import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; import minefantasy.mf2.api.stamina.StaminaBar; import net.minecraft.entity.player.EntityPlayer; -import cpw.mods.fml.common.network.ByteBufUtils; -public class StaminaPacket extends PacketMF -{ +public class StaminaPacket extends PacketMF { public static final String packetName = "MF2_Staminabar"; private float[] value; private String username; - public StaminaPacket(float[]value, EntityPlayer user) - { + public StaminaPacket(float[] value, EntityPlayer user) { this.value = value; this.username = user.getCommandSenderName(); } @@ -21,37 +19,32 @@ public StaminaPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - value = new float[]{StaminaBar.getDefaultMax(player), StaminaBar.getDefaultMax(player), 0, 0F}; - value[0] = packet.readFloat(); - value[1] = packet.readFloat(); - value[2] = packet.readFloat(); - value[3] = packet.readFloat(); - username = ByteBufUtils.readUTF8String(packet); - - if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) - { - StaminaBar.setStaminaValue(player, value[0]); - StaminaBar.setMaxStamina(player, value[1]); - StaminaBar.setFlashTime(player, value[2]); - StaminaBar.setBonusStamina(player, value[3]); - } + public void process(ByteBuf packet, EntityPlayer player) { + value = new float[] { StaminaBar.getDefaultMax(player), StaminaBar.getDefaultMax(player), 0, 0F }; + value[0] = packet.readFloat(); + value[1] = packet.readFloat(); + value[2] = packet.readFloat(); + value[3] = packet.readFloat(); + username = ByteBufUtils.readUTF8String(packet); + + if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) { + StaminaBar.setStaminaValue(player, value[0]); + StaminaBar.setMaxStamina(player, value[1]); + StaminaBar.setFlashTime(player, value[2]); + StaminaBar.setBonusStamina(player, value[3]); + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(float variable : value) - { + public void write(ByteBuf packet) { + for (float variable : value) { packet.writeFloat(variable); } - ByteBufUtils.writeUTF8String(packet, username); + ByteBufUtils.writeUTF8String(packet, username); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/StorageBlockPacket.java b/src/main/java/minefantasy/mf2/network/packet/StorageBlockPacket.java index 5e61d23f..afa5ef39 100644 --- a/src/main/java/minefantasy/mf2/network/packet/StorageBlockPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/StorageBlockPacket.java @@ -8,17 +8,15 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -public class StorageBlockPacket extends PacketMF -{ +public class StorageBlockPacket extends PacketMF { public static final String packetName = "MF2_StoragePkt"; private int[] coords = new int[3]; private ItemStack component; private String type, tex, materialName; private int stackSize, max; - public StorageBlockPacket(TileEntityComponent tile) - { - this.coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public StorageBlockPacket(TileEntityComponent tile) { + this.coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; this.type = tile.type; this.tex = tile.tex; this.materialName = tile.material != null ? tile.material.name : "steel"; @@ -26,44 +24,40 @@ public StorageBlockPacket(TileEntityComponent tile) this.stackSize = tile.stackSize; this.max = tile.max; } + public StorageBlockPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - type = ByteBufUtils.readUTF8String(packet); - tex = ByteBufUtils.readUTF8String(packet); - materialName = ByteBufUtils.readUTF8String(packet); - component = ByteBufUtils.readItemStack(packet); - stackSize = packet.readInt(); - max = packet.readInt(); - - if(entity != null && entity instanceof TileEntityComponent) - { - TileEntityComponent tile = (TileEntityComponent)entity; - tile.type = this.type; - tile.tex = this.tex; - tile.material = CustomMaterial.getMaterial(materialName); - tile.item = this.component; - tile.stackSize = this.stackSize; - tile.max = this.max; - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + type = ByteBufUtils.readUTF8String(packet); + tex = ByteBufUtils.readUTF8String(packet); + materialName = ByteBufUtils.readUTF8String(packet); + component = ByteBufUtils.readItemStack(packet); + stackSize = packet.readInt(); + max = packet.readInt(); + + if (entity != null && entity instanceof TileEntityComponent) { + TileEntityComponent tile = (TileEntityComponent) entity; + tile.type = this.type; + tile.tex = this.tex; + tile.material = CustomMaterial.getMaterial(materialName); + tile.item = this.component; + tile.stackSize = this.stackSize; + tile.max = this.max; + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } ByteBufUtils.writeUTF8String(packet, type); diff --git a/src/main/java/minefantasy/mf2/network/packet/TannerPacket.java b/src/main/java/minefantasy/mf2/network/packet/TannerPacket.java index 3b9da1a4..4bdff027 100644 --- a/src/main/java/minefantasy/mf2/network/packet/TannerPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/TannerPacket.java @@ -4,17 +4,14 @@ import minefantasy.mf2.block.tileentity.TileEntityTanningRack; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class TannerPacket extends PacketMF -{ +public class TannerPacket extends PacketMF { public static final String packetName = "MF2_TannerPacket"; private int[] coords = new int[3]; private float animation; - public TannerPacket(TileEntityTanningRack tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public TannerPacket(TileEntityTanningRack tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; animation = tile.acTime; } @@ -22,30 +19,25 @@ public TannerPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - float newAnim = packet.readFloat(); - - if(entity != null && entity instanceof TileEntityTanningRack) - { - TileEntityTanningRack tile = (TileEntityTanningRack)entity; - tile.acTime = newAnim; - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + float newAnim = packet.readFloat(); + + if (entity != null && entity instanceof TileEntityTanningRack) { + TileEntityTanningRack tile = (TileEntityTanningRack) entity; + tile.acTime = newAnim; + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeFloat(animation); diff --git a/src/main/java/minefantasy/mf2/network/packet/TileInventoryPacket.java b/src/main/java/minefantasy/mf2/network/packet/TileInventoryPacket.java index 7905c549..d4f3b8c2 100644 --- a/src/main/java/minefantasy/mf2/network/packet/TileInventoryPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/TileInventoryPacket.java @@ -2,23 +2,20 @@ import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; -import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.util.MFLogUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -public class TileInventoryPacket extends PacketMF -{ +public class TileInventoryPacket extends PacketMF { public static final String packetName = "MF2_TileInvPacket"; private int[] coords = new int[3]; private int invSize; private IInventory inventory; - public TileInventoryPacket(IInventory inv, TileEntity tile) - { - this.coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public TileInventoryPacket(IInventory inv, TileEntity tile) { + this.coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; this.inventory = inv; this.invSize = inv.getSizeInventory(); } @@ -27,50 +24,41 @@ public TileInventoryPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - int x = packet.readInt(); - int y = packet.readInt(); - int z = packet.readInt(); - int size = packet.readInt(); - - TileEntity entity = player.worldObj.getTileEntity(x, y, z); - - if(entity != null && entity instanceof IInventory) - { - IInventory inv = (IInventory)entity; - for(int s = 0; s < size; s++) - { - ItemStack item = ByteBufUtils.readItemStack(packet); - if(s < inv.getSizeInventory()) - { - inv.setInventorySlotContents(s, item); - } - else - { - item = null; - MFLogUtil.logDebug("Dropped Packet Item " + s); - } - } - } - packet.clear(); + public void process(ByteBuf packet, EntityPlayer player) { + int x = packet.readInt(); + int y = packet.readInt(); + int z = packet.readInt(); + int size = packet.readInt(); + + TileEntity entity = player.worldObj.getTileEntity(x, y, z); + + if (entity != null && entity instanceof IInventory) { + IInventory inv = (IInventory) entity; + for (int s = 0; s < size; s++) { + ItemStack item = ByteBufUtils.readItemStack(packet); + if (s < inv.getSizeInventory()) { + inv.setInventorySlotContents(s, item); + } else { + item = null; + MFLogUtil.logDebug("Dropped Packet Item " + s); + } + } + } + packet.clear(); } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { + public void write(ByteBuf packet) { packet.writeInt(coords[0]); packet.writeInt(coords[1]); packet.writeInt(coords[2]); packet.writeInt(invSize); - for(int s = 0; s < invSize; s++) - { + for (int s = 0; s < invSize; s++) { ByteBufUtils.writeItemStack(packet, inventory.getStackInSlot(s)); } } diff --git a/src/main/java/minefantasy/mf2/network/packet/TroughPacket.java b/src/main/java/minefantasy/mf2/network/packet/TroughPacket.java index 18c56ea2..67f2a2a3 100644 --- a/src/main/java/minefantasy/mf2/network/packet/TroughPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/TroughPacket.java @@ -4,17 +4,14 @@ import minefantasy.mf2.block.tileentity.decor.TileEntityTrough; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import cpw.mods.fml.common.network.ByteBufUtils; -public class TroughPacket extends PacketMF -{ +public class TroughPacket extends PacketMF { public static final String packetName = "MF2_TroughPacket"; private int[] coords = new int[3]; private int fill; - public TroughPacket(TileEntityTrough tile) - { - coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public TroughPacket(TileEntityTrough tile) { + coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; fill = tile.fill; } @@ -22,30 +19,25 @@ public TroughPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - int newFill = packet.readInt(); - - if(entity != null && entity instanceof TileEntityTrough) - { - TileEntityTrough tile = (TileEntityTrough)entity; - tile.fill = newFill; - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + int newFill = packet.readInt(); + + if (entity != null && entity instanceof TileEntityTrough) { + TileEntityTrough tile = (TileEntityTrough) entity; + tile.fill = newFill; + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } packet.writeInt(fill); diff --git a/src/main/java/minefantasy/mf2/network/packet/WoodDecorPacket.java b/src/main/java/minefantasy/mf2/network/packet/WoodDecorPacket.java index f3e195a9..63709079 100644 --- a/src/main/java/minefantasy/mf2/network/packet/WoodDecorPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/WoodDecorPacket.java @@ -6,45 +6,39 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -public class WoodDecorPacket extends PacketMF -{ +public class WoodDecorPacket extends PacketMF { public static final String packetName = "MF2_WdDecorPkt"; private int[] coords = new int[3]; private String materialName; - public WoodDecorPacket(TileEntityWoodDecor tile) - { - this.coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + public WoodDecorPacket(TileEntityWoodDecor tile) { + this.coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; this.materialName = tile.getMaterialName(); } + public WoodDecorPacket() { } @Override - public void process(ByteBuf packet, EntityPlayer player) - { - coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - materialName = ByteBufUtils.readUTF8String(packet); - - if(entity != null && entity instanceof TileEntityWoodDecor) - { - TileEntityWoodDecor tile = (TileEntityWoodDecor)entity; - tile.trySetMaterial(materialName); - } + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + materialName = ByteBufUtils.readUTF8String(packet); + + if (entity != null && entity instanceof TileEntityWoodDecor) { + TileEntityWoodDecor tile = (TileEntityWoodDecor) entity; + tile.trySetMaterial(materialName); + } } @Override - public String getChannel() - { + public String getChannel() { return packetName; } @Override - public void write(ByteBuf packet) - { - for(int a = 0; a < coords.length; a++) - { + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { packet.writeInt(coords[a]); } ByteBufUtils.writeUTF8String(packet, materialName); diff --git a/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java b/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java index 271ca128..f0a308e9 100644 --- a/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java +++ b/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java @@ -10,7 +10,6 @@ import minefantasy.mf2.block.basic.ConstructionBlockMF; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigHardcore; -import minefantasy.mf2.item.ItemComponentMF; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.ToolListMF; @@ -23,12 +22,10 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class BasicRecipesMF -{ - public static void init() - { +public class BasicRecipesMF { + public static void init() { addFoodOutput(); - TempRecipesMF.init();//TODO remove temp recipes + TempRecipesMF.init();// TODO remove temp recipes ForgingRecipes.init(); CarpenterRecipes.init(); SmeltingRecipesMF.init(); @@ -37,412 +34,197 @@ public static void init() DragonforgedStyle.loadCrafting(); OrnateStyle.loadCrafting(); GameRegistry.addRecipe(new RecipeArmourDyeMF()); - + ArrayList wood = CustomMaterial.getList("wood"); Iterator iteratorWood = wood.iterator(); - - KnowledgeListMF.stickRecipe = - GameRegistry.addShapedRecipe(new ItemStack(Items.stick, 2), new Object[] - { - "S", - 'S', ComponentListMF.plank - }); - GameRegistry.addShapedRecipe(new ItemStack(Items.stick, 2), new Object[] - { - "S", - 'S', ComponentListMF.plank_cut - }); - - KnowledgeListMF.firepitRecipe = - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.firepit), new Object[] - { - " P ", - "S S", - 'S', Items.stick, - 'P', ComponentListMF.plank - }); - KnowledgeListMF.cooktopRecipe = - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.roast), new Object[] - { - "PSP", - 'S', Blocks.cobblestone, - 'P', ComponentListMF.plank - }); - - GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.yew_planks, 4), new Object[] - { - BlockListMF.log_yew - }); - GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.ironbark_planks, 4), new Object[] - { - BlockListMF.log_ironbark - }); - GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.ebony_planks, 4), new Object[] - { - BlockListMF.log_ebony - }); - - while(iteratorWood.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - assembleWoodVariations(customMat); - } - - KnowledgeListMF.plantOilR = - GameRegistry.addShapedRecipe(new ItemStack(ComponentListMF.plant_oil, 4), new Object[] - { - " B ", - "BFB", - " B ", - 'F', Items.wheat_seeds, - 'B', FoodListMF.jug_empty - }); - KnowledgeListMF.waterJugR = - GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.jug_water, 4), new Object[] - { - " B ", - "BWB", - " B ", - 'W', Items.water_bucket, - 'B', FoodListMF.jug_empty - }); - KnowledgeListMF.sugarRecipe = - GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.sugarpot), new Object[] - { - "S", - "S", - "B", - 'S', Items.sugar, - 'B', ComponentListMF.clay_pot, - }); - GameRegistry.addShapelessRecipe(new ItemStack(Items.sugar, 2), new Object[] - { - FoodListMF.sugarpot, - }); - KnowledgeListMF.milkJugR = - GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.jug_milk, 4), new Object[] - { - " B ", - "BMB", - " B ", - 'M', Items.milk_bucket, - 'B', FoodListMF.jug_empty - }); - GameRegistry.addShapedRecipe(new ItemStack(Items.milk_bucket), new Object[] - { - " B ", - "BMB", - " B ", - 'M', Items.bucket, - 'B', FoodListMF.jug_milk - }); - GameRegistry.addShapedRecipe(new ItemStack(Items.water_bucket), new Object[] - { - " B ", - "BMB", - " B ", - 'M', Items.bucket, - 'B', FoodListMF.jug_water - }); - - + + KnowledgeListMF.stickRecipe = GameRegistry.addShapedRecipe(new ItemStack(Items.stick, 2), + new Object[] { "S", 'S', ComponentListMF.plank }); + GameRegistry.addShapedRecipe(new ItemStack(Items.stick, 2), + new Object[] { "S", 'S', ComponentListMF.plank_cut }); + + KnowledgeListMF.firepitRecipe = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.firepit), + new Object[] { " P ", "S S", 'S', Items.stick, 'P', ComponentListMF.plank }); + KnowledgeListMF.cooktopRecipe = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.roast), + new Object[] { "PSP", 'S', Blocks.cobblestone, 'P', ComponentListMF.plank }); + + GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.yew_planks, 4), new Object[] { BlockListMF.log_yew }); + GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.ironbark_planks, 4), + new Object[] { BlockListMF.log_ironbark }); + GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.ebony_planks, 4), + new Object[] { BlockListMF.log_ebony }); + + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + assembleWoodVariations(customMat); + } + + KnowledgeListMF.plantOilR = GameRegistry.addShapedRecipe(new ItemStack(ComponentListMF.plant_oil, 4), + new Object[] { " B ", "BFB", " B ", 'F', Items.wheat_seeds, 'B', FoodListMF.jug_empty }); + KnowledgeListMF.waterJugR = GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.jug_water, 4), + new Object[] { " B ", "BWB", " B ", 'W', Items.water_bucket, 'B', FoodListMF.jug_empty }); + KnowledgeListMF.sugarRecipe = GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.sugarpot), + new Object[] { "S", "S", "B", 'S', Items.sugar, 'B', ComponentListMF.clay_pot, }); + GameRegistry.addShapelessRecipe(new ItemStack(Items.sugar, 2), new Object[] { FoodListMF.sugarpot, }); + KnowledgeListMF.milkJugR = GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.jug_milk, 4), + new Object[] { " B ", "BMB", " B ", 'M', Items.milk_bucket, 'B', FoodListMF.jug_empty }); + GameRegistry.addShapedRecipe(new ItemStack(Items.milk_bucket), + new Object[] { " B ", "BMB", " B ", 'M', Items.bucket, 'B', FoodListMF.jug_milk }); + GameRegistry.addShapedRecipe(new ItemStack(Items.water_bucket), + new Object[] { " B ", "BMB", " B ", 'M', Items.bucket, 'B', FoodListMF.jug_water }); + GameRegistry.addRecipe(new RecipeSyringe()); - //Just a way on making the overpowered gunpowder from black powder - GameRegistry.addShapelessRecipe(new ItemStack(Items.gunpowder), new Object[] - { - new ItemStack(ComponentListMF.blackpowder), - new ItemStack(ComponentListMF.blackpowder), - new ItemStack(ComponentListMF.nitre), - }); - - - - for(int id = 0; id < BlockListMF.metalBlocks.length; id ++) - { + // Just a way on making the overpowered gunpowder from black powder + GameRegistry.addShapelessRecipe(new ItemStack(Items.gunpowder), + new Object[] { new ItemStack(ComponentListMF.blackpowder), new ItemStack(ComponentListMF.blackpowder), + new ItemStack(ComponentListMF.nitre), }); + + for (int id = 0; id < BlockListMF.metalBlocks.length; id++) { BaseMaterialMF material = BaseMaterialMF.getMaterial(BlockListMF.metalBlocks[id]); - - for(ItemStack ingot: OreDictionary.getOres("ingot"+material.name)) - { - GameRegistry.addRecipe(new ItemStack(BlockListMF.storage[id]), new Object[] - { - "III", - "III", - "III", - 'I', ingot - }); - GameRegistry.addShapelessRecipe(new ItemStack(ingot.getItem(), 9), new Object[] - { - BlockListMF.storage[id] - }); + + for (ItemStack ingot : OreDictionary.getOres("ingot" + material.name)) { + GameRegistry.addRecipe(new ItemStack(BlockListMF.storage[id]), + new Object[] { "III", "III", "III", 'I', ingot }); + GameRegistry.addShapelessRecipe(new ItemStack(ingot.getItem(), 9), + new Object[] { BlockListMF.storage[id] }); } } - - KnowledgeListMF.fireclayR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ComponentListMF.fireclay, 4), new Object[] - { - " C ", - "CDC", - " C ", - - 'D', ComponentListMF.kaolinite_dust, - 'C', Items.clay_ball - }); - KnowledgeListMF.fireBrickR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ComponentListMF.fireclay_brick) , new Object[] - { - "C", - - 'C', ComponentListMF.fireclay - }); - KnowledgeListMF.fireBricksR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(BlockListMF.firebricks) , new Object[] - { - "BB", - "BB", - - 'B', ComponentListMF.strong_brick - }); - KnowledgeListMF.fireBrickStairR= - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(BlockListMF.firebrick_stair) , new Object[] - { - "B ", - "BB", - - 'B', ComponentListMF.strong_brick - }); + + KnowledgeListMF.fireclayR = MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ComponentListMF.fireclay, 4), + new Object[] { " C ", "CDC", " C ", + + 'D', ComponentListMF.kaolinite_dust, 'C', Items.clay_ball }); + KnowledgeListMF.fireBrickR = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ComponentListMF.fireclay_brick), new Object[] { "C", + + 'C', ComponentListMF.fireclay }); + KnowledgeListMF.fireBricksR = MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(BlockListMF.firebricks), + new Object[] { "BB", "BB", + + 'B', ComponentListMF.strong_brick }); + KnowledgeListMF.fireBrickStairR = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(BlockListMF.firebrick_stair), new Object[] { "B ", "BB", + + 'B', ComponentListMF.strong_brick }); BaseMaterialMF mat = BaseMaterialMF.iron; - - GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideSmall), new Object[]{ - ComponentListMF.rawhideSmall, ComponentListMF.flux - }); - GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideMedium), new Object[]{ - ComponentListMF.rawhideMedium, ComponentListMF.flux - }); - GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideLarge), new Object[]{ - ComponentListMF.rawhideLarge, ComponentListMF.flux - }); - - TanningRecipe.addRecipe(ComponentListMF.hideSmall, mat.craftTimeModifier*2F, -1, new ItemStack(Items.leather)); - TanningRecipe.addRecipe(ComponentListMF.hideMedium, mat.craftTimeModifier*3F, -1, new ItemStack(Items.leather, 3)); - TanningRecipe.addRecipe(ComponentListMF.hideLarge, mat.craftTimeModifier*4F, -1, new ItemStack(Items.leather, 5)); - TanningRecipe.addRecipe(Items.leather, mat.craftTimeModifier*2F, -1, "shears", new ItemStack(ComponentListMF.leather_strip, 4)); - - if(!ConfigHardcore.HCCRemoveBooksCraft) { - KnowledgeListMF.artBookR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_artisanry), new Object[] - { - "T", - "D", - "B", - 'T', ComponentListMF.talisman_lesser, - 'D', new ItemStack(Items.dye, 1, 1), - 'B', Items.book, - }); - KnowledgeListMF.conBookR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_construction), new Object[] - { - "T", - "D", - "B", - 'T', ComponentListMF.talisman_lesser, - 'D', new ItemStack(Items.dye, 1, 14), - 'B', Items.book, - }); - KnowledgeListMF.proBookR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_provisioning), new Object[] - { - "T", - "D", - "B", - 'T', ComponentListMF.talisman_lesser, - 'D', new ItemStack(Items.dye, 1, 2), - 'B', Items.book, - }); - KnowledgeListMF.engBookR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_engineering), new Object[] - { - "T", - "D", - "B", - 'T', ComponentListMF.talisman_lesser, - 'D', new ItemStack(Items.dye, 1, 12), - 'B', Items.book, - }); - KnowledgeListMF.comBookR = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_combat), new Object[] - { - "T", - "D", - "B", - 'T', ComponentListMF.talisman_lesser, - 'D', new ItemStack(Items.dye, 1, 5), - 'B', Items.book, - }); - - - KnowledgeListMF.artBook2R = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_artisanry2), new Object[] - { - "T", - "B", - 'T', ComponentListMF.talisman_greater, - 'B', ToolListMF.skillbook_artisanry, - }); - KnowledgeListMF.conBook2R = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_construction2), new Object[] - { - "T", - "B", - 'T', ComponentListMF.talisman_greater, - 'B', ToolListMF.skillbook_construction, - }); - KnowledgeListMF.proBook2R = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_provisioning2), new Object[] - { - "T", - "B", - 'T', ComponentListMF.talisman_greater, - 'B', ToolListMF.skillbook_provisioning, - }); - KnowledgeListMF.engBook2R = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_engineering2), new Object[] - { - "T", - "B", - 'T', ComponentListMF.talisman_greater, - 'B', ToolListMF.skillbook_engineering, - }); - KnowledgeListMF.comBook2R = - MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_combat2), new Object[] - { - "T", - "B", - 'T', ComponentListMF.talisman_greater, - 'B', ToolListMF.skillbook_combat, - }); + + GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideSmall), + new Object[] { ComponentListMF.rawhideSmall, ComponentListMF.flux }); + GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideMedium), + new Object[] { ComponentListMF.rawhideMedium, ComponentListMF.flux }); + GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideLarge), + new Object[] { ComponentListMF.rawhideLarge, ComponentListMF.flux }); + + TanningRecipe.addRecipe(ComponentListMF.hideSmall, mat.craftTimeModifier * 2F, -1, + new ItemStack(Items.leather)); + TanningRecipe.addRecipe(ComponentListMF.hideMedium, mat.craftTimeModifier * 3F, -1, + new ItemStack(Items.leather, 3)); + TanningRecipe.addRecipe(ComponentListMF.hideLarge, mat.craftTimeModifier * 4F, -1, + new ItemStack(Items.leather, 5)); + TanningRecipe.addRecipe(Items.leather, mat.craftTimeModifier * 2F, -1, "shears", + new ItemStack(ComponentListMF.leather_strip, 4)); + + if (!ConfigHardcore.HCCRemoveBooksCraft) { + KnowledgeListMF.artBookR = MineFantasyAPI.addBasicCarpenterRecipe( + new ItemStack(ToolListMF.skillbook_artisanry), new Object[] { "T", "D", "B", 'T', + ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 1), 'B', Items.book, }); + KnowledgeListMF.conBookR = MineFantasyAPI.addBasicCarpenterRecipe( + new ItemStack(ToolListMF.skillbook_construction), new Object[] { "T", "D", "B", 'T', + ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 14), 'B', Items.book, }); + KnowledgeListMF.proBookR = MineFantasyAPI.addBasicCarpenterRecipe( + new ItemStack(ToolListMF.skillbook_provisioning), new Object[] { "T", "D", "B", 'T', + ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 2), 'B', Items.book, }); + KnowledgeListMF.engBookR = MineFantasyAPI.addBasicCarpenterRecipe( + new ItemStack(ToolListMF.skillbook_engineering), new Object[] { "T", "D", "B", 'T', + ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 12), 'B', Items.book, }); + KnowledgeListMF.comBookR = MineFantasyAPI.addBasicCarpenterRecipe( + new ItemStack(ToolListMF.skillbook_combat), new Object[] { "T", "D", "B", 'T', + ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 5), 'B', Items.book, }); + + KnowledgeListMF.artBook2R = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_artisanry2), new Object[] { "T", "B", + 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_artisanry, }); + KnowledgeListMF.conBook2R = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_construction2), new Object[] { "T", "B", + 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_construction, }); + KnowledgeListMF.proBook2R = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_provisioning2), new Object[] { "T", "B", + 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_provisioning, }); + KnowledgeListMF.engBook2R = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_engineering2), new Object[] { "T", "B", + 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_engineering, }); + KnowledgeListMF.comBook2R = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_combat2), new Object[] { "T", "B", 'T', + ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_combat, }); } - - GameRegistry.addShapedRecipe(((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood"), new Object[] - { - "S", - "S", - 'S', Items.stick, - }); - + + GameRegistry.addShapedRecipe(ComponentListMF.plank.construct("ScrapWood"), + new Object[] { "S", "S", 'S', Items.stick, }); + Object rock = ConfigHardcore.HCCallowRocks ? ComponentListMF.sharp_rock : Blocks.cobblestone; - KnowledgeListMF.dryrocksR = - GameRegistry.addShapedRecipe(new ItemStack(ToolListMF.dryrocks), new Object[]{ - "R ", - " R", - 'R', rock - }); - - ((ConstructionBlockMF.StairsConstBlock)BlockListMF.mud_brick_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock)BlockListMF.mud_pavement_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock)BlockListMF.cobble_brick_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock)BlockListMF.cobble_pavement_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock)BlockListMF.reinforced_stone_brick_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock)BlockListMF.reinforced_stone_stair).addRecipe(); - - ((ConstructionBlockMF.StairsConstBlock)BlockListMF.yew_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock)BlockListMF.ironbark_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock)BlockListMF.ebony_stair).addRecipe(); + KnowledgeListMF.dryrocksR = GameRegistry.addShapedRecipe(new ItemStack(ToolListMF.dryrocks), + new Object[] { "R ", " R", 'R', rock }); + + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.mud_brick_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.mud_pavement_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.cobble_brick_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.cobble_pavement_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.reinforced_stone_brick_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.reinforced_stone_stair).addRecipe(); + + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.yew_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.ironbark_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.ebony_stair).addRecipe(); } - - private static void assembleWoodVariations(CustomMaterial material) - { - // TODO - if(material.name != "RefinedWood") - { - ArrayList list = OreDictionary.getOres("planks"+material.name); - if(list.isEmpty()) - { - for(ItemStack planks: OreDictionary.getOres("plankWood")) - { - if(planks.getItemDamage() == OreDictionary.WILDCARD_VALUE) - { + private static void assembleWoodVariations(CustomMaterial material) { + // TODO + if (material.name != "RefinedWood") { + ArrayList list = OreDictionary.getOres("planks" + material.name); + if (list.isEmpty()) { + for (ItemStack planks : OreDictionary.getOres("plankWood")) { + if (planks.getItemDamage() == OreDictionary.WILDCARD_VALUE) { ItemStack item = planks.copy(); - for(int i = 0; i < 16; i++) - { + for (int i = 0; i < 16; i++) { item.setItemDamage(i); tryAddWoodPlanks(item, material); CarpenterRecipes.tryAddSawPlanks(item, material); } - } - else - { + } else { tryAddWoodPlanks(planks, material); CarpenterRecipes.tryAddSawPlanks(planks, material); } } - } - else - for(ItemStack block : list) - { - KnowledgeListMF.plankRecipe.add( - GameRegistry.addShapedRecipe(((ItemComponentMF)ComponentListMF.plank).construct(material.name, 4), new Object[]{ - "P", - "P", - 'P', block - })); - CarpenterRecipes.addSawPlanks(block, material); - } + } else + for (ItemStack block : list) { + KnowledgeListMF.plankRecipe.add(GameRegistry.addShapedRecipe( + ComponentListMF.plank.construct(material.name, 4), new Object[] { "P", "P", 'P', block })); + CarpenterRecipes.addSawPlanks(block, material); + } } } - - private static void tryAddWoodPlanks(ItemStack planks, CustomMaterial material) - { - String sub = material.name.substring(0, material.name.length()-4).toLowerCase(); - - if(planks.getUnlocalizedName().toLowerCase().contains(sub)) - { - KnowledgeListMF.plankRecipe.add( - GameRegistry.addShapedRecipe(((ItemComponentMF)ComponentListMF.plank).construct(material.name, 4), new Object[]{ - "P", - "P", - 'P', planks.copy() - })); + + private static void tryAddWoodPlanks(ItemStack planks, CustomMaterial material) { + String sub = material.name.substring(0, material.name.length() - 4).toLowerCase(); + + if (planks.getUnlocalizedName().toLowerCase().contains(sub)) { + KnowledgeListMF.plankRecipe.add(GameRegistry.addShapedRecipe( + ComponentListMF.plank.construct(material.name, 4), new Object[] { "P", "P", 'P', planks.copy() })); } } - - private static void addFoodOutput() - { - KnowledgeListMF.cheeseOut = - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cheese_wheel), new Object[] - { - "F", - 'F', FoodListMF.cheese_pot, - }); - KnowledgeListMF.meatpieOut = - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_meat), new Object[] - { - "F", - 'F', FoodListMF.pie_meat_cooked - }); - KnowledgeListMF.shepardOut = - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_shepards), new Object[] - { - "F", - 'F', FoodListMF.pie_shepard_cooked - }); - KnowledgeListMF.appleOut = - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_apple), new Object[] - { - "F", - 'F', FoodListMF.pie_apple_cooked - }); - KnowledgeListMF.berryOut = - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_berry), new Object[] - { - "F", - 'F', FoodListMF.pie_berry_cooked - }); - KnowledgeListMF.pumpPieOut = - GameRegistry.addShapedRecipe(new ItemStack(Items.pumpkin_pie), new Object[] - { - "F", - 'F', FoodListMF.pie_pumpkin_cooked - }); + + private static void addFoodOutput() { + KnowledgeListMF.cheeseOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cheese_wheel), + new Object[] { "F", 'F', FoodListMF.cheese_pot, }); + KnowledgeListMF.meatpieOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_meat), + new Object[] { "F", 'F', FoodListMF.pie_meat_cooked }); + KnowledgeListMF.shepardOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_shepards), + new Object[] { "F", 'F', FoodListMF.pie_shepard_cooked }); + KnowledgeListMF.appleOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_apple), + new Object[] { "F", 'F', FoodListMF.pie_apple_cooked }); + KnowledgeListMF.berryOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_berry), + new Object[] { "F", 'F', FoodListMF.pie_berry_cooked }); + KnowledgeListMF.pumpPieOut = GameRegistry.addShapedRecipe(new ItemStack(Items.pumpkin_pie), + new Object[] { "F", 'F', FoodListMF.pie_pumpkin_cooked }); } } diff --git a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java index b19075fb..ddec42bb 100644 --- a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java @@ -11,7 +11,6 @@ import minefantasy.mf2.block.decor.BlockWoodDecor; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigHardcore; -import minefantasy.mf2.item.ItemComponentMF; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ArmourListMF; import minefantasy.mf2.item.list.ComponentListMF; @@ -25,8 +24,7 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class CarpenterRecipes -{ +public class CarpenterRecipes { public static final String basic = "step.wood"; public static final String chopping = "dig.wood"; public static final String primitive = "minefantasy2:block.craftprimitive"; @@ -39,23 +37,20 @@ public class CarpenterRecipes public static final String woodHammer = "minefantasy2:block.carpentermallet"; public static final String mixing = "step.wood"; public static final String spanner = "minefantasy2:block.twistbolt"; - + private static final Skill artisanry = SkillList.artisanry; private static final Skill engineering = SkillList.engineering; private static final Skill construction = SkillList.construction; private static final Skill provisioning = SkillList.provisioning; - - public static void init() - { + + public static void init() { /* - ArrayList wood = CustomMaterial.getList("wood"); - Iterator iteratorWood = wood.iterator(); - while(iteratorWood.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - - } - */ + * ArrayList wood = CustomMaterial.getList("wood"); Iterator + * iteratorWood = wood.iterator(); while(iteratorWood.hasNext()) { + * CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + * + * } + */ assembleWoodBasic(); CustomWoodRecipes.init(); addDusts(); @@ -64,682 +59,384 @@ public static void init() addCooking(); addMisc(); addEngineering(); - if(ConfigHardcore.HCCallowRocks) - { + if (ConfigHardcore.HCCallowRocks) { addPrimitive(); - } - else - { + } else { addNonPrimitiveStone(); } - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.researchBook), "", sewing, "hands", -1, 1 , new Object[] - { - "B", - 'B', Items.book, - }); - - - if(ConfigHardcore.HCCallowRocks) - { - KnowledgeListMF.sharpRocksR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.sharp_rock, 8), "", stonemason, "hammer", -1, 10 , new Object[] - { - "S", - 'S', Blocks.cobblestone, - }); + MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.researchBook), "", sewing, "hands", -1, 1, + new Object[] { "B", 'B', Items.book, }); - } - else - { + if (ConfigHardcore.HCCallowRocks) { + KnowledgeListMF.sharpRocksR = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.sharp_rock, 8), "", stonemason, "hammer", -1, 10, + new Object[] { "S", 'S', Blocks.cobblestone, }); + + } else { } Salvage.addSalvage(ToolListMF.dryrocks, Blocks.cobblestone); - - - - KnowledgeListMF.threadR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.thread, 4), "commodities", sewing, "hands", -1, 5 , new Object[] - { - "W", - "S", - 'W', Blocks.wool, - 'S', Items.stick, - }); - KnowledgeListMF.stringR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(Items.string), "commodities", sewing, "hands", -1, 10 , new Object[] - { - "T", - "T", - "T", - "T", - 'T', ComponentListMF.thread - }); - - KnowledgeListMF.lStripsR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.leather_strip, 4), "commodities", snipping, "shears", -1, 10 , new Object[] - { - "L", - 'L', Items.leather, - }); - - - - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.swordTraining), nailHammer, "knife", 1, 40 , new Object[] - { - "NI ", - "SIII", - "NI ", - 'N', ComponentListMF.nail, - 'S', ComponentListMF.plank, - 'I', Blocks.planks, - }); - - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.waraxeTraining), nailHammer, "knife", 1, 30 , new Object[] - { - " II ", - "SSIN", - " I ", - 'N', ComponentListMF.nail, - 'S', ComponentListMF.plank, - 'I', Blocks.planks, - }); - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.maceTraining), nailHammer, "knife", 1, 35 , new Object[] - { - " II ", - "SSIIN", - 'N', ComponentListMF.nail, - 'S', ComponentListMF.plank, - 'I', Blocks.planks, - }); - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.spearTraining), nailHammer, "knife", 1, 20 , new Object[] - { - " N ", - "SSSI", - " N ", - 'N', ComponentListMF.nail, - 'S', ComponentListMF.plank, - 'I', Blocks.planks, - }); - ItemStack scrapWood = ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood"); - Salvage.addSalvage(ToolListMF.swordTraining, new ItemStack(Blocks.planks, 5), new ItemStack(ComponentListMF.nail, 2), scrapWood); - Salvage.addSalvage(ToolListMF.waraxeTraining, new ItemStack(Blocks.planks, 4), ComponentListMF.nail, scrapWood, scrapWood); - Salvage.addSalvage(ToolListMF.maceTraining, new ItemStack(Blocks.planks, 4), ComponentListMF.nail, scrapWood, scrapWood); - Salvage.addSalvage(ToolListMF.waraxeTraining, Blocks.planks, new ItemStack(ComponentListMF.nail, 2), scrapWood, scrapWood, scrapWood); - - KnowledgeListMF.badBandageR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_crude, 2), "bandage", sewing, "needle", -1, 10 , new Object[] - { - "LLL", - 'L', ComponentListMF.rawhideSmall, - }); - - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_crude, 4), "bandage", sewing, "needle", -1, 20 , new Object[] - { - "LLL", - 'L', ComponentListMF.rawhideMedium, - }); - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_crude, 6), "bandage", sewing, "needle", -1, 30 , new Object[] - { - "LLL", - 'L', ComponentListMF.rawhideLarge, - }); - KnowledgeListMF.bandageR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_wool, 4), "bandage", sewing, "needle", 1, 10 , new Object[] - { - "CTC", - 'T', ComponentListMF.thread, - 'C', Blocks.wool, - }); - - KnowledgeListMF.goodBandageR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_tough), "bandageadv", sewing, "needle", 2, 20 , new Object[] - { - "T", - "L", - "B", - 'T', ComponentListMF.thread, - 'L', ComponentListMF.leather_strip, - 'B', ToolListMF.bandage_wool - }); - - - - KnowledgeListMF.roughHelmetR = - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 1, 0),"craftArmourBasic", sewing, "needle", -1, 25 , new Object[] - { - "TLT", - "S S", - 'T', ComponentListMF.thread, - 'S', ComponentListMF.leather_strip, - 'L', Items.leather - }); - KnowledgeListMF.roughChestR = - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 1, 1),"craftArmourBasic", sewing, "needle", -1, 40 , new Object[] - { - "S S", - "LLL", - "TLT", - 'T', ComponentListMF.thread, - 'S', ComponentListMF.leather_strip, - 'L', Items.leather - }); - KnowledgeListMF.roughLegsR = - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 1, 2),"craftArmourBasic", sewing, "needle", -1, 35 , new Object[] - { - "TLT", - "L L", - "S S", - 'T', ComponentListMF.thread, - 'S', ComponentListMF.leather_strip, - 'L', Items.leather - }); - KnowledgeListMF.roughBootsR = - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 1, 3),"craftArmourBasic", sewing, "needle", -1, 20 , new Object[] - { - "T T", - "S S", - 'T', ComponentListMF.thread, - 'S', ComponentListMF.leather_strip, - }); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), new ItemStack(ComponentListMF.thread, 2), new ItemStack(ComponentListMF.leather_strip, 2), Items.leather); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2), new ItemStack(Items.leather, 4)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2), new ItemStack(Items.leather, 3)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2)); - - - KnowledgeListMF.reHelmetR = - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 2, 0),"craftArmourLight", sewing, "needle", 1, 50 , new Object[] - { - "TTT", - "UPU", - 'T', ComponentListMF.thread, - 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 0), - 'U', Items.leather - }); - KnowledgeListMF.reChestR = - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 2, 1),"craftArmourLight", sewing, "needle", 1, 80 , new Object[] - { - "TTT", - "UPU", - 'T', ComponentListMF.thread, - 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 1), - 'U', Items.leather - }); - KnowledgeListMF.reLegsR = - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 2, 2),"craftArmourLight", sewing, "needle", 1, 70 , new Object[] - { - "TTT", - "UPU", - 'T', ComponentListMF.thread, - 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 2), - 'U', Items.leather - }); - KnowledgeListMF.reBootsR = - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 2, 3),"craftArmourLight", sewing, "needle", 1, 40 , new Object[] - { - "TTT", - "UPU", - 'T', ComponentListMF.thread, - 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 3), - 'U', Items.leather - }); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 0), ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), new ItemStack(ComponentListMF.thread, 3), new ItemStack(Items.leather, 2)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 1), ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), new ItemStack(ComponentListMF.thread, 3), new ItemStack(Items.leather, 2)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 2), ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), new ItemStack(ComponentListMF.thread, 3), new ItemStack(Items.leather, 2)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 3), ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), new ItemStack(ComponentListMF.thread, 3), new ItemStack(Items.leather, 2)); - - //PADDING - KnowledgeListMF.padding[0]= - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 4, 0),"craftArmourLight", sewing, "needle", 1, 50 , new Object[] - { - " W ", - "SPS", - " S ", - 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 0), - 'W', Blocks.wool, - 'S', ComponentListMF.thread, - }); - KnowledgeListMF.padding[1]= - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 4, 1),"craftArmourLight", sewing, "needle", 1, 80 , new Object[] - { - " W ", - "SPS", - " S ", - 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 1), - 'W', Blocks.wool, - 'S', ComponentListMF.thread, - }); - KnowledgeListMF.padding[2]= - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 4, 2),"craftArmourLight", sewing, "needle", 1, 70 , new Object[] - { - " W ", - "SPS", - " S ", - 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 2), - 'W', Blocks.wool, - 'S', ComponentListMF.thread, - }); - KnowledgeListMF.padding[3]= - MineFantasyAPI.addCarpenterRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 4, 3),"craftArmourLight", sewing, "needle", 1, 40 , new Object[] - { - " W ", - "SPS", - " S ", - 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 3), - 'W', Blocks.wool, - 'S', ComponentListMF.thread, - }); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 0), ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), new ItemStack(ComponentListMF.thread, 3), Blocks.wool); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 1), ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), new ItemStack(ComponentListMF.thread, 3), Blocks.wool); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 2), ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), new ItemStack(ComponentListMF.thread, 3), Blocks.wool); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 3), ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), new ItemStack(ComponentListMF.thread, 3), Blocks.wool); - - KnowledgeListMF.repairBasicR = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.repair_basic), "repair_basic", sewing, "needle", 1, 20 , new Object[] - { - "TTT", - "FNH", - "SLS", - 'T', ComponentListMF.thread, - 'S', ComponentListMF.leather_strip, - 'L', Items.leather, - 'F', Items.flint, - 'H', CustomToolListMF.standard_hammer, - 'N', ComponentListMF.nail, - }); + + KnowledgeListMF.threadR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.thread, 4), + "commodities", sewing, "hands", -1, 5, new Object[] { "W", "S", 'W', Blocks.wool, 'S', Items.stick, }); + KnowledgeListMF.stringR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(Items.string), "commodities", + sewing, "hands", -1, 10, new Object[] { "T", "T", "T", "T", 'T', ComponentListMF.thread }); + + KnowledgeListMF.lStripsR = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.leather_strip, 4), "commodities", snipping, "shears", -1, 10, + new Object[] { "L", 'L', Items.leather, }); + + MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.swordTraining), nailHammer, "knife", 1, + 40, new Object[] { "NI ", "SIII", "NI ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', + Blocks.planks, }); + + MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.waraxeTraining), nailHammer, "knife", 1, + 30, new Object[] { " II ", "SSIN", " I ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', + Blocks.planks, }); + MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.maceTraining), nailHammer, "knife", 1, 35, + new Object[] { " II ", "SSIIN", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', + Blocks.planks, }); + MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.spearTraining), nailHammer, "knife", 1, + 20, new Object[] { " N ", "SSSI", " N ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', + Blocks.planks, }); + ItemStack scrapWood = ComponentListMF.plank.construct("ScrapWood"); + Salvage.addSalvage(ToolListMF.swordTraining, new ItemStack(Blocks.planks, 5), + new ItemStack(ComponentListMF.nail, 2), scrapWood); + Salvage.addSalvage(ToolListMF.waraxeTraining, new ItemStack(Blocks.planks, 4), ComponentListMF.nail, scrapWood, + scrapWood); + Salvage.addSalvage(ToolListMF.maceTraining, new ItemStack(Blocks.planks, 4), ComponentListMF.nail, scrapWood, + scrapWood); + Salvage.addSalvage(ToolListMF.waraxeTraining, Blocks.planks, new ItemStack(ComponentListMF.nail, 2), scrapWood, + scrapWood, scrapWood); + + KnowledgeListMF.badBandageR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(ToolListMF.bandage_crude, 2), "bandage", sewing, "needle", -1, 10, + new Object[] { "LLL", 'L', ComponentListMF.rawhideSmall, }); + + MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_crude, 4), "bandage", sewing, + "needle", -1, 20, new Object[] { "LLL", 'L', ComponentListMF.rawhideMedium, }); + MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_crude, 6), "bandage", sewing, + "needle", -1, 30, new Object[] { "LLL", 'L', ComponentListMF.rawhideLarge, }); + KnowledgeListMF.bandageR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(ToolListMF.bandage_wool, 4), "bandage", sewing, "needle", 1, 10, + new Object[] { "CTC", 'T', ComponentListMF.thread, 'C', Blocks.wool, }); + + KnowledgeListMF.goodBandageR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(ToolListMF.bandage_tough), "bandageadv", sewing, "needle", 2, 20, + new Object[] { "T", "L", "B", 'T', ComponentListMF.thread, 'L', ComponentListMF.leather_strip, 'B', + ToolListMF.bandage_wool }); + + KnowledgeListMF.roughHelmetR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 1, 0), "craftArmourBasic", sewing, "needle", -1, 25, + new Object[] { "TLT", "S S", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, 'L', + Items.leather }); + KnowledgeListMF.roughChestR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 1, 1), "craftArmourBasic", sewing, "needle", -1, 40, + new Object[] { "S S", "LLL", "TLT", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, + 'L', Items.leather }); + KnowledgeListMF.roughLegsR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 1, 2), "craftArmourBasic", sewing, "needle", -1, 35, + new Object[] { "TLT", "L L", "S S", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, + 'L', Items.leather }); + KnowledgeListMF.roughBootsR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 1, 3), "craftArmourBasic", sewing, "needle", -1, 20, + new Object[] { "T T", "S S", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, }); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), + new ItemStack(ComponentListMF.thread, 2), new ItemStack(ComponentListMF.leather_strip, 2), + Items.leather); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), + new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2), + new ItemStack(Items.leather, 4)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), + new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2), + new ItemStack(Items.leather, 3)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), + new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2)); + + KnowledgeListMF.reHelmetR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 2, 0), "craftArmourLight", sewing, "needle", 1, 50, + new Object[] { "TTT", "UPU", 'T', ComponentListMF.thread, 'P', + ArmourListMF.armour(ArmourListMF.leather, 1, 0), 'U', Items.leather }); + KnowledgeListMF.reChestR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 2, 1), "craftArmourLight", sewing, "needle", 1, 80, + new Object[] { "TTT", "UPU", 'T', ComponentListMF.thread, 'P', + ArmourListMF.armour(ArmourListMF.leather, 1, 1), 'U', Items.leather }); + KnowledgeListMF.reLegsR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 2, 2), "craftArmourLight", sewing, "needle", 1, 70, + new Object[] { "TTT", "UPU", 'T', ComponentListMF.thread, 'P', + ArmourListMF.armour(ArmourListMF.leather, 1, 2), 'U', Items.leather }); + KnowledgeListMF.reBootsR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 2, 3), "craftArmourLight", sewing, "needle", 1, 40, + new Object[] { "TTT", "UPU", 'T', ComponentListMF.thread, 'P', + ArmourListMF.armour(ArmourListMF.leather, 1, 3), 'U', Items.leather }); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 0), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), new ItemStack(ComponentListMF.thread, 3), + new ItemStack(Items.leather, 2)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 1), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), new ItemStack(ComponentListMF.thread, 3), + new ItemStack(Items.leather, 2)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 2), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), new ItemStack(ComponentListMF.thread, 3), + new ItemStack(Items.leather, 2)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 3), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), new ItemStack(ComponentListMF.thread, 3), + new ItemStack(Items.leather, 2)); + + // PADDING + KnowledgeListMF.padding[0] = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 4, 0), "craftArmourLight", sewing, "needle", 1, 50, + new Object[] { " W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 0), 'W', + Blocks.wool, 'S', ComponentListMF.thread, }); + KnowledgeListMF.padding[1] = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 4, 1), "craftArmourLight", sewing, "needle", 1, 80, + new Object[] { " W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 1), 'W', + Blocks.wool, 'S', ComponentListMF.thread, }); + KnowledgeListMF.padding[2] = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 4, 2), "craftArmourLight", sewing, "needle", 1, 70, + new Object[] { " W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 2), 'W', + Blocks.wool, 'S', ComponentListMF.thread, }); + KnowledgeListMF.padding[3] = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 4, 3), "craftArmourLight", sewing, "needle", 1, 40, + new Object[] { " W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 3), 'W', + Blocks.wool, 'S', ComponentListMF.thread, }); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 0), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), new ItemStack(ComponentListMF.thread, 3), + Blocks.wool); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 1), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), new ItemStack(ComponentListMF.thread, 3), + Blocks.wool); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 2), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), new ItemStack(ComponentListMF.thread, 3), + Blocks.wool); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 3), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), new ItemStack(ComponentListMF.thread, 3), + Blocks.wool); + + KnowledgeListMF.repairBasicR = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.repair_basic), "repair_basic", sewing, "needle", 1, 20, + new Object[] { "TTT", "FNH", "SLS", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, + 'L', Items.leather, 'F', Items.flint, 'H', CustomToolListMF.standard_hammer, 'N', + ComponentListMF.nail, }); ItemStack bronzePlate = ComponentListMF.plate.createComm("bronze"); - KnowledgeListMF.repairAdvancedR = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.repair_advanced), "repair_advanced", sewing, "needle", 2, 50 , new Object[] - { - "SCS", - "PKH", - "CSC", - 'K', BlockListMF.repair_basic, - 'P', bronzePlate, - 'H', CustomToolListMF.standard_hammer, - 'C', Items.slime_ball, - 'S', Items.string, - }); - KnowledgeListMF.repairOrnateR = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.repair_ornate), "repair_ornate", sewing, "needle", 3, 100 , new Object[] - { - "GDG", - "LKL", - "GLG", - 'K', BlockListMF.repair_advanced, - 'G', Items.gold_ingot, - 'L', new ItemStack(Items.dye, 1, 4), - 'D', Items.diamond, - }); - - Salvage.addSalvage(BlockListMF.repair_basic, new ItemStack(ComponentListMF.thread, 3), ComponentListMF.nail, Items.flint, Items.leather, new ItemStack(ComponentListMF.leather_strip, 2)); - Salvage.addSalvage(BlockListMF.repair_advanced, BlockListMF.repair_basic, bronzePlate, new ItemStack(Items.slime_ball, 3), new ItemStack(Items.string, 3)); - Salvage.addSalvage(BlockListMF.repair_ornate, BlockListMF.repair_advanced, new ItemStack(Items.gold_ingot, 4), Items.diamond, new ItemStack(Items.dye, 3, 4)); - - KnowledgeListMF.trilogyRecipe = - MineFantasyAPI.addShapelessCarpenterRecipe(artisanry, new ItemStack(ComponentListMF.artefacts, 1, 3), "smeltMaster", basic, "hands", -1, 1 , new Object[] - { - new ItemStack(ComponentListMF.artefacts, 1, 0), - new ItemStack(ComponentListMF.artefacts, 1, 1), - new ItemStack(ComponentListMF.artefacts, 1, 2) - }); + KnowledgeListMF.repairAdvancedR = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.repair_advanced), "repair_advanced", sewing, "needle", 2, 50, + new Object[] { "SCS", "PKH", "CSC", 'K', BlockListMF.repair_basic, 'P', bronzePlate, 'H', + CustomToolListMF.standard_hammer, 'C', Items.slime_ball, 'S', Items.string, }); + KnowledgeListMF.repairOrnateR = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.repair_ornate), "repair_ornate", sewing, "needle", 3, 100, + new Object[] { "GDG", "LKL", "GLG", 'K', BlockListMF.repair_advanced, 'G', Items.gold_ingot, 'L', + new ItemStack(Items.dye, 1, 4), 'D', Items.diamond, }); + + Salvage.addSalvage(BlockListMF.repair_basic, new ItemStack(ComponentListMF.thread, 3), ComponentListMF.nail, + Items.flint, Items.leather, new ItemStack(ComponentListMF.leather_strip, 2)); + Salvage.addSalvage(BlockListMF.repair_advanced, BlockListMF.repair_basic, bronzePlate, + new ItemStack(Items.slime_ball, 3), new ItemStack(Items.string, 3)); + Salvage.addSalvage(BlockListMF.repair_ornate, BlockListMF.repair_advanced, new ItemStack(Items.gold_ingot, 4), + Items.diamond, new ItemStack(Items.dye, 3, 4)); + + KnowledgeListMF.trilogyRecipe = MineFantasyAPI.addShapelessCarpenterRecipe(artisanry, + new ItemStack(ComponentListMF.artefacts, 1, 3), "smeltMaster", basic, "hands", -1, 1, + new Object[] { new ItemStack(ComponentListMF.artefacts, 1, 0), + new ItemStack(ComponentListMF.artefacts, 1, 1), + new ItemStack(ComponentListMF.artefacts, 1, 2) }); } - public static void assembleWoodBasic() - { - KnowledgeListMF.carpenterRecipe = - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.carpenter), new Object[]{ - "PBP", - "P P", - 'B', Blocks.crafting_table, - 'P', ComponentListMF.plank - }); - Salvage.addSalvage(BlockListMF.carpenter, ((ItemComponentMF) ComponentListMF.plank).construct("ScrapWood", 4), Blocks.crafting_table); - - KnowledgeListMF.nailPlanksR= - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.nailed_planks), "refined_planks", nailHammer, "hammer", 1, 5 , new Object[] - { - "N ", - "PP", - "PP", - 'N', ComponentListMF.nail, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("OakWood"), - }); - KnowledgeListMF.nailStairR= - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.nailed_planks_stair), "refined_planks", nailHammer, "hammer", 1, 5 , new Object[] - { - "N ", - "P ", - "PP", - 'N', ComponentListMF.nail, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("OakWood"), - }); - KnowledgeListMF.tannerRecipe = - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.tanner), "", nailHammer, "hammer", -1, 10 , new Object[] - { - "PPP", - "P P", - "PPP", - 'P', ComponentListMF.plank, - }); - - KnowledgeListMF.clayWallR = - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.clayWall, 4), "clay_wall", nailHammer, "hammer", 1, 2 , new Object[] - { - "NPN", - "PCP", - "NPN", - 'N', ComponentListMF.nail, - 'P', ComponentListMF.plank, - 'C', Blocks.clay - }); - - KnowledgeListMF.researchTableRecipe = - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.research), "", nailHammer, "hammer", -1, 10 , new Object[] - { - "B", - "C", - 'B', ToolListMF.researchBook, - 'C', BlockListMF.carpenter, - }); - KnowledgeListMF.bSalvageR = - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.salvage_basic), "", nailHammer, "hammer", -1, 10 , new Object[] - { - "SFS", - "PWP", - 'W', Blocks.crafting_table, - 'S', Blocks.stone, - 'F', Items.flint, - 'P', ComponentListMF.plank - }); - - KnowledgeListMF.framedGlassR = - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.framed_glass), "", nailHammer, "hammer", -1, 10 , new Object[] - { - "PGP", - 'P', ComponentListMF.plank, - 'G', Blocks.glass - }); - KnowledgeListMF.windowR = - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.window), "", nailHammer, "hammer", -1, 10 , new Object[] - { - " P ", - "PGP", - " P ", - 'P', ComponentListMF.plank, - 'G', Blocks.glass - }); - - Salvage.addSalvage(BlockListMF.framed_glass, ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood", 2), Blocks.glass); - Salvage.addSalvage(BlockListMF.window, ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood", 4), Blocks.glass); - Salvage.addSalvage(BlockListMF.clayWall, ComponentListMF.nail, ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood"), Items.clay_ball); - Salvage.addSalvage(BlockListMF.tanner, ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood", 8)); + + public static void assembleWoodBasic() { + KnowledgeListMF.carpenterRecipe = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.carpenter), + new Object[] { "PBP", "P P", 'B', Blocks.crafting_table, 'P', ComponentListMF.plank }); + Salvage.addSalvage(BlockListMF.carpenter, ComponentListMF.plank.construct("ScrapWood", 4), + Blocks.crafting_table); + + KnowledgeListMF.nailPlanksR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.nailed_planks), "refined_planks", nailHammer, "hammer", 1, 5, + new Object[] { "N ", "PP", "PP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("OakWood"), }); + KnowledgeListMF.nailStairR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.nailed_planks_stair), "refined_planks", nailHammer, "hammer", 1, 5, + new Object[] { "N ", "P ", "PP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("OakWood"), }); + KnowledgeListMF.tannerRecipe = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.tanner), "", nailHammer, "hammer", -1, 10, + new Object[] { "PPP", "P P", "PPP", 'P', ComponentListMF.plank, }); + + KnowledgeListMF.clayWallR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.clayWall, 4), "clay_wall", nailHammer, "hammer", 1, 2, new Object[] { "NPN", + "PCP", "NPN", 'N', ComponentListMF.nail, 'P', ComponentListMF.plank, 'C', Blocks.clay }); + + KnowledgeListMF.researchTableRecipe = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.research), "", nailHammer, "hammer", -1, 10, + new Object[] { "B", "C", 'B', ToolListMF.researchBook, 'C', BlockListMF.carpenter, }); + KnowledgeListMF.bSalvageR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.salvage_basic), "", nailHammer, "hammer", -1, 10, new Object[] { "SFS", "PWP", + 'W', Blocks.crafting_table, 'S', Blocks.stone, 'F', Items.flint, 'P', ComponentListMF.plank }); + + KnowledgeListMF.framedGlassR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.framed_glass), "", nailHammer, "hammer", -1, 10, + new Object[] { "PGP", 'P', ComponentListMF.plank, 'G', Blocks.glass }); + KnowledgeListMF.windowR = MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.window), "", + nailHammer, "hammer", -1, 10, + new Object[] { " P ", "PGP", " P ", 'P', ComponentListMF.plank, 'G', Blocks.glass }); + + Salvage.addSalvage(BlockListMF.framed_glass, ComponentListMF.plank.construct("ScrapWood", 2), Blocks.glass); + Salvage.addSalvage(BlockListMF.window, ComponentListMF.plank.construct("ScrapWood", 4), Blocks.glass); + Salvage.addSalvage(BlockListMF.clayWall, ComponentListMF.nail, ComponentListMF.plank.construct("ScrapWood"), + Items.clay_ball); + Salvage.addSalvage(BlockListMF.tanner, ComponentListMF.plank.construct("ScrapWood", 8)); Salvage.addSalvage(BlockListMF.research, BlockListMF.carpenter); - Salvage.addSalvage(BlockListMF.salvage_basic, Items.flint, new ItemStack(Blocks.stone, 2), ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood", 2), Blocks.crafting_table); + Salvage.addSalvage(BlockListMF.salvage_basic, Items.flint, new ItemStack(Blocks.stone, 2), + ComponentListMF.plank.construct("ScrapWood", 2), Blocks.crafting_table); } - private static void addDusts() - { - QuernRecipes.addRecipe(new ItemStack(Items.dye, 1, 3), new ItemStack(FoodListMF.coca_powder), 0);//ItemDye + + private static void addDusts() { + QuernRecipes.addRecipe(new ItemStack(Items.dye, 1, 3), new ItemStack(FoodListMF.coca_powder), 0);// ItemDye QuernRecipes.addRecipe(Items.wheat, new ItemStack(FoodListMF.flour), 0); QuernRecipes.addRecipe(Items.reeds, new ItemStack(FoodListMF.sugarpot), 0); QuernRecipes.addRecipe(FoodListMF.breadroll, new ItemStack(FoodListMF.breadcrumbs), 0); - - QuernRecipes.addRecipe(FoodListMF.generic_meat_uncooked, new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); - QuernRecipes.addRecipe(FoodListMF.generic_meat_strip_uncooked, new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); - QuernRecipes.addRecipe(FoodListMF.generic_meat_chunk_uncooked, new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); + + QuernRecipes.addRecipe(FoodListMF.generic_meat_uncooked, new ItemStack(FoodListMF.generic_meat_mince_uncooked), + 0); + QuernRecipes.addRecipe(FoodListMF.generic_meat_strip_uncooked, + new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); + QuernRecipes.addRecipe(FoodListMF.generic_meat_chunk_uncooked, + new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); QuernRecipes.addRecipe(FoodListMF.generic_meat_cooked, new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); - QuernRecipes.addRecipe(FoodListMF.generic_meat_strip_cooked, new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); - QuernRecipes.addRecipe(FoodListMF.generic_meat_chunk_cooked, new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); - + QuernRecipes.addRecipe(FoodListMF.generic_meat_strip_cooked, + new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); + QuernRecipes.addRecipe(FoodListMF.generic_meat_chunk_cooked, + new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); + QuernRecipes.addRecipe(Items.coal, new ItemStack(ComponentListMF.coalDust), 0); QuernRecipes.addRecipe(new ItemStack(Items.coal, 1, 1), new ItemStack(ComponentListMF.coalDust), 0); QuernRecipes.addRecipe(ComponentListMF.kaolinite, new ItemStack(ComponentListMF.kaolinite_dust), 0); QuernRecipes.addRecipe(Items.flint, new ItemStack(ComponentListMF.shrapnel), 0); - + QuernRecipes.addRecipe(ComponentListMF.flux, new ItemStack(ComponentListMF.flux_pot), 0); - - KnowledgeListMF.pieTrayRecipe = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.pie_tray_uncooked), "", basic, "hands", -1, 10 , new Object[] - { - "CC", - 'C', Items.clay_ball, - }); - - KnowledgeListMF.potRecipe = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.clay_pot_uncooked, 8), "", basic, "hands", -1, 5 , new Object[] - { - "C C", - " CC ", - 'C', Items.clay_ball, - }); - KnowledgeListMF.mouldRecipe = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.ingot_mould_uncooked), "crucible", basic, "hands", -1, 10 , new Object[] - { - "CCC", - " C ", - 'C', Items.clay_ball, - }); - KnowledgeListMF.jugRecipe = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(FoodListMF.jug_uncooked, 4), "", basic, "hands", -1, 8 , new Object[] - { - "C ", - "C C", - " C ", - 'C', Items.clay_ball, - }); - KnowledgeListMF.blackpowderRec = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.blackpowder, 2), "blackpowder", basic, "hands", -1, 2 , new Object[] - { - "NS", - "CC", - "PP", - 'C', ComponentListMF.coalDust, - 'N', ComponentListMF.nitre, - 'S', ComponentListMF.sulfur, - 'P', ComponentListMF.clay_pot, - }); - KnowledgeListMF.crudeBombR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ToolListMF.bomb_crude), "blackpowder", primitive, "hands", -1, 5 , new Object[] - { - "T", - "B", - "P", - - 'B', ComponentListMF.blackpowder, - 'T', ComponentListMF.thread, - 'P', Items.paper, - }); - KnowledgeListMF.advblackpowderRec = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.blackpowder_advanced), "advblackpowder", basic, "hands", -1, 10 , new Object[] - { - " B ", - "RGR", - " P ", - 'B', ComponentListMF.blackpowder, - 'G', Items.glowstone_dust, - 'R', Items.redstone, - 'P', ComponentListMF.clay_pot, - }); - KnowledgeListMF.magmaRefinedR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.magma_cream_refined), "firebomb", grinding, "pestle", -1, 10 , new Object[] - { - "B", - "H", - "C", - "P", - 'H', ComponentListMF.dragon_heart, - 'B', Items.blaze_powder, - 'C', Items.magma_cream, - 'P', ComponentListMF.clay_pot, - }); - Salvage.addSalvage(ComponentListMF.magma_cream_refined, ComponentListMF.dragon_heart, Items.blaze_powder, Items.magma_cream, ComponentListMF.clay_pot); + + KnowledgeListMF.pieTrayRecipe = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.pie_tray_uncooked), "", basic, "hands", -1, 10, + new Object[] { "CC", 'C', Items.clay_ball, }); + + KnowledgeListMF.potRecipe = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.clay_pot_uncooked, 8), "", basic, "hands", -1, 5, + new Object[] { "C C", " CC ", 'C', Items.clay_ball, }); + KnowledgeListMF.mouldRecipe = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.ingot_mould_uncooked), "crucible", basic, "hands", -1, 10, + new Object[] { "CCC", " C ", 'C', Items.clay_ball, }); + KnowledgeListMF.jugRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(FoodListMF.jug_uncooked, 4), + "", basic, "hands", -1, 8, new Object[] { "C ", "C C", " C ", 'C', Items.clay_ball, }); + KnowledgeListMF.blackpowderRec = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.blackpowder, 2), "blackpowder", basic, "hands", -1, 2, + new Object[] { "NS", "CC", "PP", 'C', ComponentListMF.coalDust, 'N', ComponentListMF.nitre, 'S', + ComponentListMF.sulfur, 'P', ComponentListMF.clay_pot, }); + KnowledgeListMF.crudeBombR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ToolListMF.bomb_crude), "blackpowder", primitive, "hands", -1, 5, + new Object[] { "T", "B", "P", + + 'B', ComponentListMF.blackpowder, 'T', ComponentListMF.thread, 'P', Items.paper, }); + KnowledgeListMF.advblackpowderRec = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.blackpowder_advanced), "advblackpowder", basic, "hands", -1, 10, + new Object[] { " B ", "RGR", " P ", 'B', ComponentListMF.blackpowder, 'G', Items.glowstone_dust, 'R', + Items.redstone, 'P', ComponentListMF.clay_pot, }); + KnowledgeListMF.magmaRefinedR = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.magma_cream_refined), "firebomb", grinding, "pestle", -1, 10, + new Object[] { "B", "H", "C", "P", 'H', ComponentListMF.dragon_heart, 'B', Items.blaze_powder, 'C', + Items.magma_cream, 'P', ComponentListMF.clay_pot, }); + Salvage.addSalvage(ComponentListMF.magma_cream_refined, ComponentListMF.dragon_heart, Items.blaze_powder, + Items.magma_cream, ComponentListMF.clay_pot); } - private static void addWoodworks() - { - KnowledgeListMF.refinedPlankBlockR= - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.refined_planks), "refined_planks", nailHammer, "hammer", 1, 10 , new Object[] - { - "N ", - "PP", - "PP", - 'N', ComponentListMF.nail, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - }); - - KnowledgeListMF.refinedStairR= - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.refined_planks_stair), "refined_planks", nailHammer, "hammer", 1, 10 , new Object[] - { - "N ", - "P ", - "PP", - 'N', ComponentListMF.nail, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - }); - Salvage.addSalvage(BlockListMF.nailed_planks, ComponentListMF.nail, ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood", 4)); - Salvage.addSalvage(BlockListMF.refined_planks, ComponentListMF.nail, ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 4)); - Salvage.addSalvage(BlockListMF.nailed_planks_stair, ComponentListMF.nail, ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood", 3)); - Salvage.addSalvage(BlockListMF.refined_planks_stair, ComponentListMF.nail, ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 3)); - - KnowledgeListMF.bellowsRecipe = - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.bellows), "", nailHammer, "hammer", 1, 50 , new Object[] - { - "NNN", - "PPP", - "LL ", - "PP ", - 'N', ComponentListMF.nail, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - 'L', Items.leather, - }); - Salvage.addSalvage(BlockListMF.bellows, new ItemStack(ComponentListMF.nail, 3), ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 5), new ItemStack(Items.leather, 2)); - - KnowledgeListMF.woodTroughRecipe = - MineFantasyAPI.addCarpenterRecipe(construction, ((BlockWoodDecor) BlockListMF.trough_wood).construct("ScrapWood"), "", nailHammer, "hammer", -1, 20 , new Object[] - { - "P P", - "PPP", - - 'P', ComponentListMF.plank, - }); - - KnowledgeListMF.strongRackR = - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.advTanner), "", nailHammer, "hammer", 1, 80 , new Object[] - { - "NNN", - "PPP", - "P P", - "PPP", - 'N', ComponentListMF.nail, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - }); - Salvage.addSalvage(BlockListMF.advTanner, ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 8), new ItemStack(ComponentListMF.nail, 3)); - - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.refined_planks), "paint_brush", sewing, "brush", -1, 3 , new Object[] - { - "O", - "P", - 'O', ComponentListMF.plant_oil, - 'P', BlockListMF.nailed_planks, - }); - + private static void addWoodworks() { + KnowledgeListMF.refinedPlankBlockR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.refined_planks), "refined_planks", nailHammer, "hammer", 1, 10, + new Object[] { "N ", "PP", "PP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"), }); + + KnowledgeListMF.refinedStairR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.refined_planks_stair), "refined_planks", nailHammer, "hammer", 1, 10, + new Object[] { "N ", "P ", "PP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"), }); + Salvage.addSalvage(BlockListMF.nailed_planks, ComponentListMF.nail, + ComponentListMF.plank.construct("ScrapWood", 4)); + Salvage.addSalvage(BlockListMF.refined_planks, ComponentListMF.nail, + ComponentListMF.plank.construct("RefinedWood", 4)); + Salvage.addSalvage(BlockListMF.nailed_planks_stair, ComponentListMF.nail, + ComponentListMF.plank.construct("ScrapWood", 3)); + Salvage.addSalvage(BlockListMF.refined_planks_stair, ComponentListMF.nail, + ComponentListMF.plank.construct("RefinedWood", 3)); + + KnowledgeListMF.bellowsRecipe = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.bellows), "", nailHammer, "hammer", 1, 50, + new Object[] { "NNN", "PPP", "LL ", "PP ", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"), 'L', Items.leather, }); + Salvage.addSalvage(BlockListMF.bellows, new ItemStack(ComponentListMF.nail, 3), + ComponentListMF.plank.construct("RefinedWood", 5), new ItemStack(Items.leather, 2)); + + KnowledgeListMF.woodTroughRecipe = MineFantasyAPI.addCarpenterRecipe(construction, + ((BlockWoodDecor) BlockListMF.trough_wood).construct("ScrapWood"), "", nailHammer, "hammer", -1, 20, + new Object[] { "P P", "PPP", + + 'P', ComponentListMF.plank, }); + + KnowledgeListMF.strongRackR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.advTanner), "", nailHammer, "hammer", 1, 80, + new Object[] { "NNN", "PPP", "P P", "PPP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"), }); + Salvage.addSalvage(BlockListMF.advTanner, ComponentListMF.plank.construct("RefinedWood", 8), + new ItemStack(ComponentListMF.nail, 3)); + + MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.refined_planks), "paint_brush", + sewing, "brush", -1, 3, + new Object[] { "O", "P", 'O', ComponentListMF.plant_oil, 'P', BlockListMF.nailed_planks, }); + PaintOilRecipe.addRecipe(BlockListMF.nailed_planks, BlockListMF.refined_planks); PaintOilRecipe.addRecipe(BlockListMF.nailed_planks_stair, BlockListMF.refined_planks_stair); - - + } - - private static void addStonemason() - { - KnowledgeListMF.quernR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.quern), "", stonemason, "hammer", -1, 10, new Object[] - { - "FSF", - "SSS", - 'F', Items.flint, - 'S', Blocks.stone, - }); - KnowledgeListMF.stoneovenRecipe = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.oven_stone), "", stonemason, "hammer", -1, 10, new Object[] - { - "S", - "C", - 'C', BlockListMF.roast, - 'S', Blocks.stone, - }); - - KnowledgeListMF.bloomeryR = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.bloomery), "bloomery", stonemason, "hammer", -1, 10 , new Object[]{ - " S ", - "S S", - "SCS", - 'C', Blocks.coal_block, - 'S', Blocks.stone, - }); - KnowledgeListMF.crucibleRecipe = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.crucible), "crucible", stonemason, "hammer", -1, 20 , new Object[]{ - "SSS", - "S S", - "SSS", - 'S', Blocks.stone, - }); - KnowledgeListMF.advCrucibleRecipe = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.crucibleadv), "crucible2", basic, 40 , new Object[]{ - "SSS", - "SCS", - "SSS", - 'S', ComponentListMF.fireclay, - 'C', BlockListMF.crucible - }); + + private static void addStonemason() { + KnowledgeListMF.quernR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.quern), "", + stonemason, "hammer", -1, 10, new Object[] { "FSF", "SSS", 'F', Items.flint, 'S', Blocks.stone, }); + KnowledgeListMF.stoneovenRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.oven_stone), + "", stonemason, "hammer", -1, 10, + new Object[] { "S", "C", 'C', BlockListMF.roast, 'S', Blocks.stone, }); + + KnowledgeListMF.bloomeryR = MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.bloomery), + "bloomery", stonemason, "hammer", -1, 10, + new Object[] { " S ", "S S", "SCS", 'C', Blocks.coal_block, 'S', Blocks.stone, }); + KnowledgeListMF.crucibleRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.crucible), "crucible", stonemason, "hammer", -1, 20, + new Object[] { "SSS", "S S", "SSS", 'S', Blocks.stone, }); + KnowledgeListMF.advCrucibleRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.crucibleadv), "crucible2", basic, 40, + new Object[] { "SSS", "SCS", "SSS", 'S', ComponentListMF.fireclay, 'C', BlockListMF.crucible }); Salvage.addSalvage(BlockListMF.crucible, new ItemStack(Blocks.stone, 8)); Salvage.addSalvage(BlockListMF.crucibleadv, new ItemStack(ComponentListMF.fireclay, 8), BlockListMF.crucible); - - KnowledgeListMF.chimneyRecipe = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.chimney_stone, 8), "", stonemason, "hammer", -1, 30 , new Object[]{ - "S S", - "S S", - "S S", - 'S', Blocks.stone, - }); - KnowledgeListMF.wideChimneyRecipe = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.chimney_stone_wide), "", stonemason, "hammer", -1, 10 , new Object[]{ - "S", - "C", - 'C', BlockListMF.chimney_stone, - 'S', Blocks.stone, - }); - KnowledgeListMF.extractChimneyRecipe = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.chimney_stone_extractor), "", stonemason, "hammer", -1, 15 , new Object[]{ - "C", - 'C', BlockListMF.chimney_stone_wide, - }); - - KnowledgeListMF.stoneAnvilRecipe = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.anvilStone), "", stonemason, "hammer", -1, 10, new Object[] - { - "SS ", - "SSS", - " S ", - 'S', Blocks.stone - }); - KnowledgeListMF.forgeRecipe = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.forge), "", stonemason, "hammer", -1, 10, new Object[] - { - "S S", - "SCS", - 'C', Items.coal, - 'S', Blocks.stone - }); + + KnowledgeListMF.chimneyRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.chimney_stone, 8), "", stonemason, "hammer", -1, 30, + new Object[] { "S S", "S S", "S S", 'S', Blocks.stone, }); + KnowledgeListMF.wideChimneyRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.chimney_stone_wide), "", stonemason, "hammer", -1, 10, + new Object[] { "S", "C", 'C', BlockListMF.chimney_stone, 'S', Blocks.stone, }); + KnowledgeListMF.extractChimneyRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.chimney_stone_extractor), "", stonemason, "hammer", -1, 15, + new Object[] { "C", 'C', BlockListMF.chimney_stone_wide, }); + + KnowledgeListMF.stoneAnvilRecipe = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(BlockListMF.anvilStone), "", stonemason, "hammer", -1, 10, + new Object[] { "SS ", "SSS", " S ", 'S', Blocks.stone }); + KnowledgeListMF.forgeRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.forge), "", + stonemason, "hammer", -1, 10, new Object[] { "S S", "SCS", 'C', Items.coal, 'S', Blocks.stone }); Salvage.addSalvage(BlockListMF.forge, new ItemStack(Blocks.stone, 4), Items.coal); Salvage.addSalvage(BlockListMF.anvilStone, new ItemStack(Blocks.stone, 6)); - + Salvage.addSalvage(BlockListMF.chimney_stone, Blocks.stone); Salvage.addSalvage(BlockListMF.chimney_stone_wide, BlockListMF.chimney_stone, Blocks.stone); Salvage.addSalvage(BlockListMF.chimney_stone_extractor, BlockListMF.chimney_stone_wide); Salvage.addSalvage(BlockListMF.quern, new ItemStack(Items.flint, 2), new ItemStack(Blocks.stone, 4)); } - - private static void addCooking() - { + + private static void addCooking() { String meatRaw = "rawMeat"; String cookedMeat = "cookedMeat"; OreDictionary.registerOre(cookedMeat, Items.cooked_beef); @@ -754,7 +451,7 @@ private static void addCooking() addOreD("listAllbeefcooked", cookedMeat); addOreD("listAllchickencooked", cookedMeat); addOreD("listAllfishcooked", cookedMeat); - + OreDictionary.registerOre(meatRaw, FoodListMF.guts); OreDictionary.registerOre(meatRaw, Items.beef); OreDictionary.registerOre(meatRaw, Items.chicken); @@ -768,1058 +465,521 @@ private static void addCooking() addOreD("listAllbeefraw", meatRaw); addOreD("listAllchickenraw", meatRaw); addOreD("listAllfishraw", meatRaw); - - KnowledgeListMF.curdRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.curds), "", basic, "hands", -1, 10, new Object[]{ - "T", - "S", - "M", - "P", - 'P', ComponentListMF.clay_pot, - 'T', FoodListMF.salt, - 'S', FoodListMF.sugarpot, - 'M', FoodListMF.jug_milk, - }); - - KnowledgeListMF.oatsRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.oats), "", chopping, "knife", -1, 20, new Object[]{ - "M", - "W", - "S", - "B", - 'S', Items.wheat_seeds, - 'W', Items.wheat, - 'M', FoodListMF.jug_milk, - 'B', Items.bowl - }); - KnowledgeListMF.doughRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.dough), "", basic, "hands", -1, 10, new Object[]{ - "W", - "F", - 'W', FoodListMF.jug_water, - 'F', FoodListMF.flour, - }); - KnowledgeListMF.pastryRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.pastry), "", basic, "hands", -1, 10, new Object[]{ - " S ", - "FEF", - 'F', FoodListMF.flour, - 'E', Items.egg, - 'S', FoodListMF.salt, - }); - KnowledgeListMF.breadRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.raw_bread), "", basic, "hands", -1, 15, new Object[]{ - "DDD", - 'D', FoodListMF.dough, - }); - KnowledgeListMF.sweetrollRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.sweetroll_raw), "sweetroll", basic, 5, new Object[]{ - " M ", - "FES", - "BBB", - 'M', FoodListMF.jug_milk, - 'S', FoodListMF.sugarpot, - 'B', FoodListMF.berries, - 'E', Items.egg, - 'F', FoodListMF.flour, - }); - KnowledgeListMF.icingRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.icing), "", mixing, "spoon", -1, 10, new Object[]{ - "W", - "S", - "B", - 'W', FoodListMF.jug_water, - 'S', FoodListMF.sugarpot, - 'B', ComponentListMF.clay_pot, - }); - KnowledgeListMF.chocoRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.chocolate), "icing", mixing, "spoon", -1, 10, new Object[]{ - " M ", - "SCS", - " B ", - 'C', FoodListMF.coca_powder, - 'M', FoodListMF.jug_milk, - 'S', FoodListMF.sugarpot, - 'B', ComponentListMF.clay_pot, - }); - KnowledgeListMF.custardRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.custard), "icing", mixing, "spoon", -1, 10, new Object[]{ - " M ", - "SES", - " B ", - 'E', Items.egg, - 'M', FoodListMF.jug_milk, - 'S', FoodListMF.sugarpot, - 'B', ComponentListMF.clay_pot, - }); - KnowledgeListMF.iceSR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.sweetroll), "sweetroll", basic, "knife", -1, 15, new Object[]{ - "I", - "R", - 'I', FoodListMF.icing, - 'R', FoodListMF.sweetroll_uniced, - }); - KnowledgeListMF.eclairDoughR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.eclair_raw), "eclair", basic, 8, new Object[]{ - "SSS", - "PPP", - 'P', FoodListMF.pastry, - 'S', FoodListMF.sugarpot, - }); - KnowledgeListMF.eclairIceR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.eclair_empty), "eclair", basic, "knife", 2, 20, new Object[]{ - "C", - "E", - 'C', FoodListMF.chocolate, - 'E', FoodListMF.eclair_uniced, - }); - KnowledgeListMF.eclairFillR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.eclair), "eclair", basic, "knife", 2, 20, new Object[]{ - "C", - "E", - 'C', FoodListMF.custard, - 'E', FoodListMF.eclair_empty, - }); - for(ItemStack food: OreDictionary.getOres(meatRaw)) - { + + KnowledgeListMF.curdRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.curds), + "", basic, "hands", -1, 10, new Object[] { "T", "S", "M", "P", 'P', ComponentListMF.clay_pot, 'T', + FoodListMF.salt, 'S', FoodListMF.sugarpot, 'M', FoodListMF.jug_milk, }); + + KnowledgeListMF.oatsRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.oats), "", + chopping, "knife", -1, 20, new Object[] { "M", "W", "S", "B", 'S', Items.wheat_seeds, 'W', Items.wheat, + 'M', FoodListMF.jug_milk, 'B', Items.bowl }); + KnowledgeListMF.doughRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.dough), + "", basic, "hands", -1, 10, + new Object[] { "W", "F", 'W', FoodListMF.jug_water, 'F', FoodListMF.flour, }); + KnowledgeListMF.pastryRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.pastry), + "", basic, "hands", -1, 10, + new Object[] { " S ", "FEF", 'F', FoodListMF.flour, 'E', Items.egg, 'S', FoodListMF.salt, }); + KnowledgeListMF.breadRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.raw_bread), "", basic, "hands", -1, 15, + new Object[] { "DDD", 'D', FoodListMF.dough, }); + KnowledgeListMF.sweetrollRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.sweetroll_raw), "sweetroll", basic, 5, + new Object[] { " M ", "FES", "BBB", 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'B', + FoodListMF.berries, 'E', Items.egg, 'F', FoodListMF.flour, }); + KnowledgeListMF.icingRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.icing), + "", mixing, "spoon", -1, 10, new Object[] { "W", "S", "B", 'W', FoodListMF.jug_water, 'S', + FoodListMF.sugarpot, 'B', ComponentListMF.clay_pot, }); + KnowledgeListMF.chocoRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.chocolate), "icing", mixing, "spoon", -1, 10, + new Object[] { " M ", "SCS", " B ", 'C', FoodListMF.coca_powder, 'M', FoodListMF.jug_milk, 'S', + FoodListMF.sugarpot, 'B', ComponentListMF.clay_pot, }); + KnowledgeListMF.custardRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.custard), "icing", mixing, "spoon", -1, 10, + new Object[] { " M ", "SES", " B ", 'E', Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, + 'B', ComponentListMF.clay_pot, }); + KnowledgeListMF.iceSR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.sweetroll), + "sweetroll", basic, "knife", -1, 15, + new Object[] { "I", "R", 'I', FoodListMF.icing, 'R', FoodListMF.sweetroll_uniced, }); + KnowledgeListMF.eclairDoughR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.eclair_raw), "eclair", basic, 8, + new Object[] { "SSS", "PPP", 'P', FoodListMF.pastry, 'S', FoodListMF.sugarpot, }); + KnowledgeListMF.eclairIceR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.eclair_empty), "eclair", basic, "knife", 2, 20, + new Object[] { "C", "E", 'C', FoodListMF.chocolate, 'E', FoodListMF.eclair_uniced, }); + KnowledgeListMF.eclairFillR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.eclair), + "eclair", basic, "knife", 2, 20, + new Object[] { "C", "E", 'C', FoodListMF.custard, 'E', FoodListMF.eclair_empty, }); + for (ItemStack food : OreDictionary.getOres(meatRaw)) { int size = getSize(food); - KnowledgeListMF.meatRecipes.add( - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_uncooked, size), "", chopping, "knife", -1, 15, new Object[]{ - "M", - 'M', food, - })); + KnowledgeListMF.meatRecipes.add(MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.generic_meat_uncooked, size), "", chopping, "knife", -1, 15, + new Object[] { "M", 'M', food, })); } - for(ItemStack food: OreDictionary.getOres(cookedMeat)) - { + for (ItemStack food : OreDictionary.getOres(cookedMeat)) { int size = 1; KnowledgeListMF.meatRecipes.add( - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_cooked, size), "", chopping, "knife", -1, 15, new Object[]{ - "M", - 'M', food, - })); + MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_cooked, size), + "", chopping, "knife", -1, 15, new Object[] { "M", 'M', food, })); } - KnowledgeListMF.meatStripR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_strip_uncooked), "", chopping, "knife", -1, 5, new Object[]{ - "M", - 'M', FoodListMF.generic_meat_uncooked, - }); - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_strip_cooked), "", chopping, "knife", -1, 5, new Object[]{ - "M", - 'M', FoodListMF.generic_meat_cooked, - }); - KnowledgeListMF.meatHunkR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_chunk_uncooked), "", chopping, "knife", -1, 5, new Object[]{ - "M", - 'M', FoodListMF.generic_meat_strip_uncooked, - }); - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_chunk_cooked), "", chopping, "knife", -1, 5, new Object[]{ - "M", - 'M', FoodListMF.generic_meat_strip_cooked, - }); - KnowledgeListMF.gutsRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.guts), "", chopping, "knife", 1, 8, new Object[]{ - "MMMM", - 'M', Items.rotten_flesh, - }); - - KnowledgeListMF.stewRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.stew), "", chopping, "knife", -1, 15, new Object[]{ - "M", - "B", - 'M', FoodListMF.generic_meat_chunk_cooked, - 'B', Items.bowl - }); - KnowledgeListMF.jerkyRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.jerky, 1), "jerky", chopping, "knife", 2, 20, new Object[]{ - "S", - "M", - 'S', FoodListMF.salt, - 'M', FoodListMF.generic_meat_strip_cooked, - }); - KnowledgeListMF.saussageR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.saussage_raw, 4), "saussage", chopping, "knife", 2, 30, new Object[]{ - " G ", - "MMM", - "BES", - 'G', FoodListMF.guts, - 'E', Items.egg, - 'S', FoodListMF.salt, - 'B', FoodListMF.breadcrumbs, - 'M', FoodListMF.generic_meat_mince_uncooked, - }); - KnowledgeListMF.meatPieRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.pie_meat_uncooked), "meatpie", chopping, "knife", 2, 150, new Object[]{ - " P ", - "MMM", - " P ", - " T ", - 'P', FoodListMF.pastry, - 'M', FoodListMF.generic_meat_mince_cooked, - 'T', FoodListMF.pie_tray, - }); - KnowledgeListMF.breadSliceR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.breadSlice, 12), "", "step.cloth", "knife", -1, 10, new Object[]{ - "B", - 'B', Items.bread, - }); - KnowledgeListMF.sandwitchRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.sandwitch_meat), "sandwitch", chopping, "hands", -1, 4, new Object[]{ - "B", - "C", - "M", - "B", - 'C', FoodListMF.cheese_slice, - 'M', FoodListMF.generic_meat_cooked, - 'B', FoodListMF.breadSlice - }); - KnowledgeListMF.sandwitchBigRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.sandwitch_big), "sandwitchBig", chopping, "knife", 1, 10, new Object[]{ - "CSC", - "MBM", - 'S', FoodListMF.salt, - 'C', FoodListMF.cheese_slice, - 'M', FoodListMF.generic_meat_cooked, - 'B', Items.bread - }); - KnowledgeListMF.shepardRecipe = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.pie_shepard_uncooked), "shepardpie", chopping, "knife", 3, 200, new Object[]{ - "PFP", - "MMM", - "CFC", - " T ", - 'C', Items.carrot, - 'P', Items.potato, - 'F', FoodListMF.pastry, - 'M', FoodListMF.generic_meat_mince_cooked, - 'T', FoodListMF.pie_tray, - }); - - KnowledgeListMF.appleR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.pie_apple_uncooked), "applepie", chopping, "knife", 2, 120, new Object[]{ - "SPS", - "MMM", - "SPS", - " T ", - 'S', FoodListMF.sugarpot, - 'P', FoodListMF.pastry, - 'M', Items.apple, - 'T', FoodListMF.pie_tray, - }); - KnowledgeListMF.pumpPieR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.pie_pumpkin_uncooked), "bread", chopping, "knife", 1, 50, new Object[]{ - "SMS", - "SPS", - " T ", - 'S', FoodListMF.sugarpot, - 'P', FoodListMF.pastry, - 'M', Blocks.pumpkin, - 'T', FoodListMF.pie_tray, - }); - KnowledgeListMF.berryR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.pie_berry_uncooked), "berrypie", chopping, "knife", 2, 100, new Object[]{ - "SPS", - "MMM", - "SPS", - " T ", - 'S', FoodListMF.sugarpot, - 'P', FoodListMF.pastry, - 'M', FoodListMF.berries, - 'T', FoodListMF.pie_tray, - }); - - KnowledgeListMF.simpCakeR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_simple_raw), "bread", mixing, "spoon", -1, 15, new Object[]{ - "MMM", - "SES", - "FFF", - " T ", - 'F', FoodListMF.flour, - 'E', Items.egg, - 'M', FoodListMF.jug_milk, - 'S', FoodListMF.sugarpot, - 'T', FoodListMF.cake_tin, - }); - - KnowledgeListMF.cakeR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_raw), "cake", mixing, "spoon", -1, 20, new Object[]{ - "SMS", - "SES", - "FFF", - " T ", - 'F', FoodListMF.flour, - 'E', Items.egg, - 'M', FoodListMF.jug_milk, - 'S', FoodListMF.sugarpot, - 'T', FoodListMF.cake_tin, - }); - KnowledgeListMF.carrotCakeR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_carrot_raw), "carrotcake", mixing, "spoon", -1, 25, new Object[]{ - "SMS", - "SES", - "CCC", - "FTF", - 'C', Items.carrot, - 'F', FoodListMF.flour, - 'E', Items.egg, - 'M', FoodListMF.jug_milk, - 'S', FoodListMF.sugarpot, - 'T', FoodListMF.cake_tin, - }); - KnowledgeListMF.chocoCakeR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_choc_raw), "chococake", mixing, "spoon", -1, 25, new Object[]{ - "SMS", - "SES", - "CCC", - "FTF", - 'C', FoodListMF.chocolate, - 'F', FoodListMF.flour, - 'E', Items.egg, - 'M', FoodListMF.jug_milk, - 'S', FoodListMF.sugarpot, - 'T', FoodListMF.cake_tin, - }); - KnowledgeListMF.bfCakeR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_bf_raw), "bfcake", mixing, "spoon", -1, 30, new Object[]{ - "SMMS", - "SEES", - "CBBC", - "FTFF", - 'B', FoodListMF.berriesJuicy, - 'C', FoodListMF.chocolate, - 'F', FoodListMF.flour, - 'E', Items.egg, - 'M', FoodListMF.jug_milk, - 'S', FoodListMF.sugarpot, - 'T', FoodListMF.cake_tin, - }); - KnowledgeListMF.simpCakeOut = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(Items.cake), "bread", basic, "knife", -1, 10, new Object[]{ - "I", - "R", - 'I', FoodListMF.icing, - 'R', FoodListMF.cake_simple_uniced, - }); - - KnowledgeListMF.cakeI = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(BlockListMF.cake_vanilla), "cake", basic, "knife", -1, 60, new Object[]{ - "III", - " R ", - 'I', FoodListMF.icing, - 'R', FoodListMF.cake_uniced, - }); - KnowledgeListMF.carrotCakeI = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(BlockListMF.cake_carrot), "carrotcake", basic, "knife", -1, 60, new Object[]{ - "III", - " R ", - 'I', FoodListMF.icing, - 'R', FoodListMF.cake_carrot_uniced, - }); - KnowledgeListMF.chocoCakeI = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(BlockListMF.cake_chocolate), "chococake", basic, "knife", -1, 60, new Object[]{ - "ICI", - " R ", - 'C', FoodListMF.chocolate, - 'I', FoodListMF.icing, - 'R', FoodListMF.cake_choc_uniced, - }); - KnowledgeListMF.bfCakeI = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(BlockListMF.cake_bf), "bfcake", basic, "knife", -1, 100, new Object[]{ - "BBB", - "III", - "CRC", - 'C', FoodListMF.chocolate, - 'B', FoodListMF.berries, - 'I', FoodListMF.icing, - 'R', FoodListMF.cake_bf_uniced, - }); - - KnowledgeListMF.cheeserollR = - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cheese_roll), "cheeseroll", chopping, "knife", 1, 30, new Object[]{ - "C", - "R", - 'C', FoodListMF.cheese_slice, - 'R', FoodListMF.breadroll, - }); + KnowledgeListMF.meatStripR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.generic_meat_strip_uncooked), "", chopping, "knife", -1, 5, + new Object[] { "M", 'M', FoodListMF.generic_meat_uncooked, }); + MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_strip_cooked), "", + chopping, "knife", -1, 5, new Object[] { "M", 'M', FoodListMF.generic_meat_cooked, }); + KnowledgeListMF.meatHunkR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.generic_meat_chunk_uncooked), "", chopping, "knife", -1, 5, + new Object[] { "M", 'M', FoodListMF.generic_meat_strip_uncooked, }); + MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_chunk_cooked), "", + chopping, "knife", -1, 5, new Object[] { "M", 'M', FoodListMF.generic_meat_strip_cooked, }); + KnowledgeListMF.gutsRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.guts), "", + chopping, "knife", 1, 8, new Object[] { "MMMM", 'M', Items.rotten_flesh, }); + + KnowledgeListMF.stewRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.stew), "", + chopping, "knife", -1, 15, + new Object[] { "M", "B", 'M', FoodListMF.generic_meat_chunk_cooked, 'B', Items.bowl }); + KnowledgeListMF.jerkyRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.jerky, 1), "jerky", chopping, "knife", 2, 20, + new Object[] { "S", "M", 'S', FoodListMF.salt, 'M', FoodListMF.generic_meat_strip_cooked, }); + KnowledgeListMF.saussageR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.saussage_raw, 4), "saussage", chopping, "knife", 2, 30, + new Object[] { " G ", "MMM", "BES", 'G', FoodListMF.guts, 'E', Items.egg, 'S', FoodListMF.salt, 'B', + FoodListMF.breadcrumbs, 'M', FoodListMF.generic_meat_mince_uncooked, }); + KnowledgeListMF.meatPieRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.pie_meat_uncooked), "meatpie", chopping, "knife", 2, 150, + new Object[] { " P ", "MMM", " P ", " T ", 'P', FoodListMF.pastry, 'M', + FoodListMF.generic_meat_mince_cooked, 'T', FoodListMF.pie_tray, }); + KnowledgeListMF.breadSliceR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.breadSlice, 12), "", "step.cloth", "knife", -1, 10, + new Object[] { "B", 'B', Items.bread, }); + KnowledgeListMF.sandwitchRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.sandwitch_meat), "sandwitch", chopping, "hands", -1, 4, + new Object[] { "B", "C", "M", "B", 'C', FoodListMF.cheese_slice, 'M', FoodListMF.generic_meat_cooked, + 'B', FoodListMF.breadSlice }); + KnowledgeListMF.sandwitchBigRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.sandwitch_big), "sandwitchBig", chopping, "knife", 1, 10, + new Object[] { "CSC", "MBM", 'S', FoodListMF.salt, 'C', FoodListMF.cheese_slice, 'M', + FoodListMF.generic_meat_cooked, 'B', Items.bread }); + KnowledgeListMF.shepardRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.pie_shepard_uncooked), "shepardpie", chopping, "knife", 3, 200, + new Object[] { "PFP", "MMM", "CFC", " T ", 'C', Items.carrot, 'P', Items.potato, 'F', FoodListMF.pastry, + 'M', FoodListMF.generic_meat_mince_cooked, 'T', FoodListMF.pie_tray, }); + + KnowledgeListMF.appleR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.pie_apple_uncooked), "applepie", chopping, "knife", 2, 120, + new Object[] { "SPS", "MMM", "SPS", " T ", 'S', FoodListMF.sugarpot, 'P', FoodListMF.pastry, 'M', + Items.apple, 'T', FoodListMF.pie_tray, }); + KnowledgeListMF.pumpPieR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.pie_pumpkin_uncooked), "bread", chopping, "knife", 1, 50, + new Object[] { "SMS", "SPS", " T ", 'S', FoodListMF.sugarpot, 'P', FoodListMF.pastry, 'M', + Blocks.pumpkin, 'T', FoodListMF.pie_tray, }); + KnowledgeListMF.berryR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.pie_berry_uncooked), "berrypie", chopping, "knife", 2, 100, + new Object[] { "SPS", "MMM", "SPS", " T ", 'S', FoodListMF.sugarpot, 'P', FoodListMF.pastry, 'M', + FoodListMF.berries, 'T', FoodListMF.pie_tray, }); + + KnowledgeListMF.simpCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.cake_simple_raw), "bread", mixing, "spoon", -1, 15, + new Object[] { "MMM", "SES", "FFF", " T ", 'F', FoodListMF.flour, 'E', Items.egg, 'M', + FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin, }); + + KnowledgeListMF.cakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_raw), + "cake", mixing, "spoon", -1, 20, new Object[] { "SMS", "SES", "FFF", " T ", 'F', FoodListMF.flour, 'E', + Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin, }); + KnowledgeListMF.carrotCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.cake_carrot_raw), "carrotcake", mixing, "spoon", -1, 25, + new Object[] { "SMS", "SES", "CCC", "FTF", 'C', Items.carrot, 'F', FoodListMF.flour, 'E', Items.egg, + 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin, }); + KnowledgeListMF.chocoCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.cake_choc_raw), "chococake", mixing, "spoon", -1, 25, + new Object[] { "SMS", "SES", "CCC", "FTF", 'C', FoodListMF.chocolate, 'F', FoodListMF.flour, 'E', + Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin, }); + KnowledgeListMF.bfCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_bf_raw), + "bfcake", mixing, "spoon", -1, 30, + new Object[] { "SMMS", "SEES", "CBBC", "FTFF", 'B', FoodListMF.berriesJuicy, 'C', FoodListMF.chocolate, + 'F', FoodListMF.flour, 'E', Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', + FoodListMF.cake_tin, }); + KnowledgeListMF.simpCakeOut = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(Items.cake), + "bread", basic, "knife", -1, 10, + new Object[] { "I", "R", 'I', FoodListMF.icing, 'R', FoodListMF.cake_simple_uniced, }); + + KnowledgeListMF.cakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(BlockListMF.cake_vanilla), + "cake", basic, "knife", -1, 60, + new Object[] { "III", " R ", 'I', FoodListMF.icing, 'R', FoodListMF.cake_uniced, }); + KnowledgeListMF.carrotCakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(BlockListMF.cake_carrot), "carrotcake", basic, "knife", -1, 60, + new Object[] { "III", " R ", 'I', FoodListMF.icing, 'R', FoodListMF.cake_carrot_uniced, }); + KnowledgeListMF.chocoCakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(BlockListMF.cake_chocolate), "chococake", basic, "knife", -1, 60, new Object[] { "ICI", + " R ", 'C', FoodListMF.chocolate, 'I', FoodListMF.icing, 'R', FoodListMF.cake_choc_uniced, }); + KnowledgeListMF.bfCakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(BlockListMF.cake_bf), + "bfcake", basic, "knife", -1, 100, new Object[] { "BBB", "III", "CRC", 'C', FoodListMF.chocolate, 'B', + FoodListMF.berries, 'I', FoodListMF.icing, 'R', FoodListMF.cake_bf_uniced, }); + + KnowledgeListMF.cheeserollR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.cheese_roll), "cheeseroll", chopping, "knife", 1, 30, + new Object[] { "C", "R", 'C', FoodListMF.cheese_slice, 'R', FoodListMF.breadroll, }); } - - private static void addOreD(String list, String mfList) - { - for(ItemStack stack: OreDictionary.getOres(list)) - { + + private static void addOreD(String list, String mfList) { + for (ItemStack stack : OreDictionary.getOres(list)) { OreDictionary.registerOre(mfList, stack); } } - private static int getSize(ItemStack food) - { - if(food != null && food.getItem() instanceof ItemFood) - { - int feed = ((ItemFood)food.getItem()).func_150905_g(food); - return Math.max(1, feed-1); + private static int getSize(ItemStack food) { + if (food != null && food.getItem() instanceof ItemFood) { + int feed = ((ItemFood) food.getItem()).func_150905_g(food); + return Math.max(1, feed - 1); } return 1; } - private static void addMisc() - { - //Fletching - KnowledgeListMF.fletchingR = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ComponentListMF.fletching, 16), "arrows", chopping, 4, new Object[] - { - "T", - "F", - - 'F', Items.feather, - 'T', ComponentListMF.plank, - }); - KnowledgeListMF.fletchingR2 = - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ComponentListMF.fletching, 4), "arrows", chopping, 4, new Object[] - { - " T ", - "PPP", - - 'P', Items.paper, - 'T', ComponentListMF.plank, - }); - - //BOMBS - KnowledgeListMF.bombCaseCeramicR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.bomb_casing_uncooked, 2), "bombCeramic", basic, 2, new Object[] - { - " C ", - "C C", - " C ", - 'C', Items.clay_ball, - }); - KnowledgeListMF.mineCaseCeramicR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.mine_casing_uncooked), "mineCeramic", basic, 2, new Object[] - { - " P ", - "C C", - " C ", - - 'P', Blocks.stone_pressure_plate, - 'C', Items.clay_ball, - }); - KnowledgeListMF.bombCaseCrystalR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.bomb_casing_crystal), "bombCrystal", basic, 10, new Object[] - { - " D ", - "R R", - " B ", - 'B', Items.glass_bottle, - 'D', ComponentListMF.diamond_shards, - 'R', Items.redstone - }); - KnowledgeListMF.mineCaseCrystalR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.mine_casing_crystal), "mineCrystal", basic, 10, new Object[] - { - " P ", - "RDR", - " B ", - 'P', Blocks.heavy_weighted_pressure_plate, - 'B', Items.glass_bottle, - 'D', ComponentListMF.diamond_shards, - 'R', Items.redstone - }); + private static void addMisc() { + // Fletching + KnowledgeListMF.fletchingR = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(ComponentListMF.fletching, 16), "arrows", chopping, 4, new Object[] { "T", "F", + + 'F', Items.feather, 'T', ComponentListMF.plank, }); + KnowledgeListMF.fletchingR2 = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(ComponentListMF.fletching, 4), "arrows", chopping, 4, new Object[] { " T ", "PPP", + + 'P', Items.paper, 'T', ComponentListMF.plank, }); + + // BOMBS + KnowledgeListMF.bombCaseCeramicR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_uncooked, 2), "bombCeramic", basic, 2, + new Object[] { " C ", "C C", " C ", 'C', Items.clay_ball, }); + KnowledgeListMF.mineCaseCeramicR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.mine_casing_uncooked), "mineCeramic", basic, 2, + new Object[] { " P ", "C C", " C ", + + 'P', Blocks.stone_pressure_plate, 'C', Items.clay_ball, }); + KnowledgeListMF.bombCaseCrystalR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_crystal), "bombCrystal", basic, 10, + new Object[] { " D ", "R R", " B ", 'B', Items.glass_bottle, 'D', ComponentListMF.diamond_shards, 'R', + Items.redstone }); + KnowledgeListMF.mineCaseCrystalR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.mine_casing_crystal), "mineCrystal", basic, 10, + new Object[] { " P ", "RDR", " B ", 'P', Blocks.heavy_weighted_pressure_plate, 'B', Items.glass_bottle, + 'D', ComponentListMF.diamond_shards, 'R', Items.redstone }); Salvage.addSalvage(ComponentListMF.bomb_casing_uncooked, new ItemStack(Items.clay_ball, 2)); - Salvage.addSalvage(ComponentListMF.mine_casing_uncooked, new ItemStack(Items.clay_ball, 3), Blocks.stone_pressure_plate); - - Salvage.addSalvage(ComponentListMF.bomb_casing_crystal, Items.glass_bottle, ComponentListMF.diamond_shards, new ItemStack(Items.redstone, 2)); - Salvage.addSalvage(ComponentListMF.mine_casing_crystal, Blocks.heavy_weighted_pressure_plate, Items.glass_bottle, ComponentListMF.diamond_shards, new ItemStack(Items.redstone, 2)); - - KnowledgeListMF.bombFuseR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.bomb_fuse, 8), "bombs", basic, 4, new Object[] - { - "R", - "C", - "S", - 'S', ComponentListMF.thread, - 'C', ComponentListMF.coalDust, - 'R', Items.redstone, - }); - KnowledgeListMF.longFuseR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.bomb_fuse_long), "bombs", basic, 1, new Object[] - { - "F", - "R", - "F", - 'F', ComponentListMF.bomb_fuse, - 'R', Items.redstone, - }); + Salvage.addSalvage(ComponentListMF.mine_casing_uncooked, new ItemStack(Items.clay_ball, 3), + Blocks.stone_pressure_plate); + + Salvage.addSalvage(ComponentListMF.bomb_casing_crystal, Items.glass_bottle, ComponentListMF.diamond_shards, + new ItemStack(Items.redstone, 2)); + Salvage.addSalvage(ComponentListMF.mine_casing_crystal, Blocks.heavy_weighted_pressure_plate, + Items.glass_bottle, ComponentListMF.diamond_shards, new ItemStack(Items.redstone, 2)); + + KnowledgeListMF.bombFuseR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.bomb_fuse, 8), "bombs", basic, 4, new Object[] { "R", "C", "S", 'S', + ComponentListMF.thread, 'C', ComponentListMF.coalDust, 'R', Items.redstone, }); + KnowledgeListMF.longFuseR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.bomb_fuse_long), "bombs", basic, 1, + new Object[] { "F", "R", "F", 'F', ComponentListMF.bomb_fuse, 'R', Items.redstone, }); Salvage.addSalvage(ComponentListMF.bomb_fuse_long, new ItemStack(ComponentListMF.bomb_fuse, 2), Items.redstone); - - KnowledgeListMF.thatchR = - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.thatch), "", "dig.grass", "hands", -1, 1 , new Object[] - { - "HH", - "HH", - 'H', new ItemStack(Blocks.tallgrass, 1, 1) - }); - KnowledgeListMF.thatchStairR = - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.thatch_stair), "", "dig.grass", "hands", -1, 1 , new Object[] - { - "H ", - "HH", - 'H', new ItemStack(Blocks.tallgrass, 1, 1) - }); + + KnowledgeListMF.thatchR = MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.thatch), "", + "dig.grass", "hands", -1, 1, new Object[] { "HH", "HH", 'H', new ItemStack(Blocks.tallgrass, 1, 1) }); + KnowledgeListMF.thatchStairR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.thatch_stair), "", "dig.grass", "hands", -1, 1, + new Object[] { "H ", "HH", 'H', new ItemStack(Blocks.tallgrass, 1, 1) }); Salvage.addSalvage(BlockListMF.thatch_stair, new ItemStack(Blocks.tallgrass, 3, 1)); Salvage.addSalvage(BlockListMF.thatch, new ItemStack(Blocks.tallgrass, 4, 1)); - - KnowledgeListMF.apronRecipe = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ArmourListMF.leatherapron), "", sewing, "hands", -1, 1, new Object[] - { - "LCL", - " L ", - 'L', Items.leather, - 'C', Items.coal, - }); + + KnowledgeListMF.apronRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ArmourListMF.leatherapron), + "", sewing, "hands", -1, 1, new Object[] { "LCL", " L ", 'L', Items.leather, 'C', Items.coal, }); Salvage.addSalvage(ArmourListMF.leatherapron, new ItemStack(Items.leather, 3), Items.coal); - - KnowledgeListMF.hideHelmR = - MineFantasyAPI.addCarpenterRecipe(null, ArmourListMF.armour(ArmourListMF.leather, 0, 0), "", sewing, "hands", -1, 1, new Object[] - { - "H", - "C", - "H", - 'H', ComponentListMF.hideSmall, - 'C', Blocks.wool, - }); - KnowledgeListMF.hideChestR = - MineFantasyAPI.addCarpenterRecipe(null, ArmourListMF.armour(ArmourListMF.leather, 0, 1), "", sewing, "hands", -1, 1, new Object[] - { - "H", - "C", - 'H', ComponentListMF.hideLarge, - 'C', Blocks.wool, - }); - KnowledgeListMF.hideLegsR = - MineFantasyAPI.addCarpenterRecipe(null, ArmourListMF.armour(ArmourListMF.leather, 0, 2), "", sewing, "hands", -1, 1, new Object[] - { - "H", - "C", - 'H', ComponentListMF.hideMedium, - 'C', Blocks.wool, - }); - KnowledgeListMF.hideBootsR = - MineFantasyAPI.addCarpenterRecipe(null, ArmourListMF.armour(ArmourListMF.leather, 0, 3), "", sewing, "hands", -1, 1, new Object[] - { - "H", - "C", - 'H', ComponentListMF.hideSmall, - 'C', Blocks.wool, - }); - - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 0), new ItemStack(ComponentListMF.hideSmall, 2), Blocks.wool); + + KnowledgeListMF.hideHelmR = MineFantasyAPI.addCarpenterRecipe(null, + ArmourListMF.armour(ArmourListMF.leather, 0, 0), "", sewing, "hands", -1, 1, + new Object[] { "H", "C", "H", 'H', ComponentListMF.hideSmall, 'C', Blocks.wool, }); + KnowledgeListMF.hideChestR = MineFantasyAPI.addCarpenterRecipe(null, + ArmourListMF.armour(ArmourListMF.leather, 0, 1), "", sewing, "hands", -1, 1, + new Object[] { "H", "C", 'H', ComponentListMF.hideLarge, 'C', Blocks.wool, }); + KnowledgeListMF.hideLegsR = MineFantasyAPI.addCarpenterRecipe(null, + ArmourListMF.armour(ArmourListMF.leather, 0, 2), "", sewing, "hands", -1, 1, + new Object[] { "H", "C", 'H', ComponentListMF.hideMedium, 'C', Blocks.wool, }); + KnowledgeListMF.hideBootsR = MineFantasyAPI.addCarpenterRecipe(null, + ArmourListMF.armour(ArmourListMF.leather, 0, 3), "", sewing, "hands", -1, 1, + new Object[] { "H", "C", 'H', ComponentListMF.hideSmall, 'C', Blocks.wool, }); + + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 0), + new ItemStack(ComponentListMF.hideSmall, 2), Blocks.wool); Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 1), ComponentListMF.hideLarge, Blocks.wool); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 2), ComponentListMF.hideMedium, Blocks.wool); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 2), ComponentListMF.hideMedium, + Blocks.wool); Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 3), ComponentListMF.hideSmall, Blocks.wool); - - KnowledgeListMF.bedrollR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.bedroll), "", sewing, "needle", -1, 50, new Object[] - { - "TLT", - "CCC", - 'C', Blocks.wool, - 'T', ComponentListMF.thread, - 'L', Items.leather - }); - Salvage.addSalvage(ToolListMF.bedroll, new ItemStack(Blocks.wool, 3), Items.leather, new ItemStack(ComponentListMF.thread, 3)); + + KnowledgeListMF.bedrollR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.bedroll), "", + sewing, "needle", -1, 50, + new Object[] { "TLT", "CCC", 'C', Blocks.wool, 'T', ComponentListMF.thread, 'L', Items.leather }); + Salvage.addSalvage(ToolListMF.bedroll, new ItemStack(Blocks.wool, 3), Items.leather, + new ItemStack(ComponentListMF.thread, 3)); } - public static void addCrossbows() - { - //CROSSBOWS - KnowledgeListMF.crossHandleWoodR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.crossbow_handle_wood), "crossShafts", nailHammer, "hammer", 2, 150, new Object[] - { - "N N", - "PP ", - " P ", - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - 'N', ComponentListMF.nail - }); - KnowledgeListMF.crossStockWoodR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.crossbow_stock_wood), "crossShafts", nailHammer, "hammer", 2, 300, new Object[] - { - "NN N", - "PPPP", - " PPP", - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - 'N', ComponentListMF.nail - }); - KnowledgeListMF.crossStockIronR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.crossbow_stock_iron), "crossShaftAdvanced", spanner, "spanner", 2, 300, new Object[] - { - " BBB", - "BOGG", - "SWSS", - " ", - 'O', Blocks.obsidian, - 'G', ComponentListMF.tungsten_gears, - 'W', ComponentListMF.crossbow_stock_wood, - 'S', ComponentListMF.iron_strut, - 'B', ComponentListMF.bolt, - }); - - KnowledgeListMF.crossHeadLightR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.cross_arms_light), "crossHeads", nailHammer, "hammer", 2, 200, new Object[] - { - "PPP", - "NSN", - " P ", - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - 'N', ComponentListMF.nail, - 'S', Items.string, - }); - KnowledgeListMF.crossHeadMediumR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.cross_arms_basic), "crossHeads", nailHammer, "hammer", 2, 250, new Object[] - { - "NNN", - "PAP", - 'N', ComponentListMF.nail, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - 'A', ComponentListMF.cross_arms_light, - }); - KnowledgeListMF.crossHeadHeavyR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.cross_arms_heavy), "crossHeads", nailHammer, "hammer", 2, 350, new Object[] - { - "NNN", - "PAP", - 'N', ComponentListMF.nail, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - 'A', ComponentListMF.cross_arms_basic, - }); - KnowledgeListMF.crossHeadAdvancedR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.cross_arms_advanced), "crossHeadAdvanced", nailHammer, "hammer", 2, 350, new Object[] - { - "NRN", - "RGR", - " A ", - 'G', ComponentListMF.tungsten_gears, - 'N', ComponentListMF.nail, - 'R', ComponentListMF.steel_tube, - 'A', ComponentListMF.cross_arms_basic, - }); - - KnowledgeListMF.crossAmmoR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.cross_ammo), "crossAmmo", nailHammer, "hammer", 2, 200, new Object[] - { - "NNN", - "P P", - "PGP", - "PPP", - 'G', ComponentListMF.tungsten_gears, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - 'N', ComponentListMF.nail, - }); - KnowledgeListMF.crossScopeR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.cross_scope), "crossScope", spanner, "spanner", 2, 150, new Object[] - { - "BSB", - "GP ", - 'G', ComponentListMF.tungsten_gears, - 'S', ToolListMF.spyglass, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - 'B', ComponentListMF.bolt, - }); - Salvage.addSalvage(ComponentListMF.cross_arms_light, new ItemStack(ComponentListMF.nail, 2), Items.string, ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 4)); - Salvage.addSalvage(ComponentListMF.cross_arms_basic, new ItemStack(ComponentListMF.nail, 3), ComponentListMF.cross_arms_light, ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 2)); - Salvage.addSalvage(ComponentListMF.cross_arms_heavy, new ItemStack(ComponentListMF.nail, 3), ComponentListMF.cross_arms_basic, ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 2)); - Salvage.addSalvage(ComponentListMF.cross_arms_advanced, ComponentListMF.tungsten_gears, new ItemStack(ComponentListMF.nail, 2), ComponentListMF.cross_arms_basic, new ItemStack(ComponentListMF.steel_tube, 3)); - - Salvage.addSalvage(ComponentListMF.cross_scope, ComponentListMF.tungsten_gears, ToolListMF.spyglass, new ItemStack(ComponentListMF.bolt, 2), ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood")); - Salvage.addSalvage(ComponentListMF.cross_ammo, ComponentListMF.tungsten_gears, new ItemStack(ComponentListMF.nail, 3), ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 7)); - Salvage.addSalvage(ComponentListMF.crossbow_handle_wood, new ItemStack(ComponentListMF.nail, 2),((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 3)); - Salvage.addSalvage(ComponentListMF.crossbow_stock_wood, new ItemStack(ComponentListMF.nail, 3), ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 7)); - Salvage.addSalvage(ComponentListMF.crossbow_stock_iron, new ItemStack(ComponentListMF.tungsten_gears, 2), Blocks.obsidian, new ItemStack(ComponentListMF.bolt, 4), new ItemStack(ComponentListMF.iron_strut, 3), ComponentListMF.crossbow_stock_wood); + + public static void addCrossbows() { + // CROSSBOWS + KnowledgeListMF.crossHandleWoodR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.crossbow_handle_wood), "crossShafts", nailHammer, "hammer", 2, 150, + new Object[] { "N N", "PP ", " P ", 'P', ComponentListMF.plank.construct("RefinedWood"), 'N', + ComponentListMF.nail }); + KnowledgeListMF.crossStockWoodR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.crossbow_stock_wood), "crossShafts", nailHammer, "hammer", 2, 300, + new Object[] { "NN N", "PPPP", " PPP", 'P', ComponentListMF.plank.construct("RefinedWood"), 'N', + ComponentListMF.nail }); + KnowledgeListMF.crossStockIronR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.crossbow_stock_iron), "crossShaftAdvanced", spanner, "spanner", 2, 300, + new Object[] { " BBB", "BOGG", "SWSS", " ", 'O', Blocks.obsidian, 'G', + ComponentListMF.tungsten_gears, 'W', ComponentListMF.crossbow_stock_wood, 'S', + ComponentListMF.iron_strut, 'B', ComponentListMF.bolt, }); + + KnowledgeListMF.crossHeadLightR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_arms_light), "crossHeads", nailHammer, "hammer", 2, 200, + new Object[] { "PPP", "NSN", " P ", 'P', ComponentListMF.plank.construct("RefinedWood"), 'N', + ComponentListMF.nail, 'S', Items.string, }); + KnowledgeListMF.crossHeadMediumR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_arms_basic), "crossHeads", nailHammer, "hammer", 2, 250, + new Object[] { "NNN", "PAP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"), 'A', ComponentListMF.cross_arms_light, }); + KnowledgeListMF.crossHeadHeavyR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_arms_heavy), "crossHeads", nailHammer, "hammer", 2, 350, + new Object[] { "NNN", "PAP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"), 'A', ComponentListMF.cross_arms_basic, }); + KnowledgeListMF.crossHeadAdvancedR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_arms_advanced), "crossHeadAdvanced", nailHammer, "hammer", 2, 350, + new Object[] { "NRN", "RGR", " A ", 'G', ComponentListMF.tungsten_gears, 'N', ComponentListMF.nail, 'R', + ComponentListMF.steel_tube, 'A', ComponentListMF.cross_arms_basic, }); + + KnowledgeListMF.crossAmmoR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_ammo), "crossAmmo", nailHammer, "hammer", 2, 200, + new Object[] { "NNN", "P P", "PGP", "PPP", 'G', ComponentListMF.tungsten_gears, 'P', + ComponentListMF.plank.construct("RefinedWood"), 'N', ComponentListMF.nail, }); + KnowledgeListMF.crossScopeR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_scope), "crossScope", spanner, "spanner", 2, 150, + new Object[] { "BSB", "GP ", 'G', ComponentListMF.tungsten_gears, 'S', ToolListMF.spyglass, 'P', + ComponentListMF.plank.construct("RefinedWood"), 'B', ComponentListMF.bolt, }); + Salvage.addSalvage(ComponentListMF.cross_arms_light, new ItemStack(ComponentListMF.nail, 2), Items.string, + ComponentListMF.plank.construct("RefinedWood", 4)); + Salvage.addSalvage(ComponentListMF.cross_arms_basic, new ItemStack(ComponentListMF.nail, 3), + ComponentListMF.cross_arms_light, ComponentListMF.plank.construct("RefinedWood", 2)); + Salvage.addSalvage(ComponentListMF.cross_arms_heavy, new ItemStack(ComponentListMF.nail, 3), + ComponentListMF.cross_arms_basic, ComponentListMF.plank.construct("RefinedWood", 2)); + Salvage.addSalvage(ComponentListMF.cross_arms_advanced, ComponentListMF.tungsten_gears, + new ItemStack(ComponentListMF.nail, 2), ComponentListMF.cross_arms_basic, + new ItemStack(ComponentListMF.steel_tube, 3)); + + Salvage.addSalvage(ComponentListMF.cross_scope, ComponentListMF.tungsten_gears, ToolListMF.spyglass, + new ItemStack(ComponentListMF.bolt, 2), ComponentListMF.plank.construct("RefinedWood")); + Salvage.addSalvage(ComponentListMF.cross_ammo, ComponentListMF.tungsten_gears, + new ItemStack(ComponentListMF.nail, 3), ComponentListMF.plank.construct("RefinedWood", 7)); + Salvage.addSalvage(ComponentListMF.crossbow_handle_wood, new ItemStack(ComponentListMF.nail, 2), + ComponentListMF.plank.construct("RefinedWood", 3)); + Salvage.addSalvage(ComponentListMF.crossbow_stock_wood, new ItemStack(ComponentListMF.nail, 3), + ComponentListMF.plank.construct("RefinedWood", 7)); + Salvage.addSalvage(ComponentListMF.crossbow_stock_iron, new ItemStack(ComponentListMF.tungsten_gears, 2), + Blocks.obsidian, new ItemStack(ComponentListMF.bolt, 4), new ItemStack(ComponentListMF.iron_strut, 3), + ComponentListMF.crossbow_stock_wood); } - - private static void addEngineering() - { + + private static void addEngineering() { addCrossbows(); - KnowledgeListMF.bombBenchCraft = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(BlockListMF.bombBench), "bombs", spanner, "spanner", 0, 150, new Object[] - { - "BFB", - "BCB", - 'B', ComponentListMF.bolt, - 'F', ComponentListMF.iron_frame, - 'C', BlockListMF.carpenter, - }); - KnowledgeListMF.bombPressCraft = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(BlockListMF.bombPress), "bpress", spanner, "spanner", 3, 200, new Object[] - { - "BFB", - "GGL", - "SPS", - 'S', ComponentListMF.iron_strut, - 'B', ComponentListMF.bolt, - 'F', ComponentListMF.iron_frame, - 'L', Blocks.lever, - 'P', new ItemStack(CustomToolListMF.standard_spanner, 1, 0), - 'G', ComponentListMF.bronze_gears, - }); - - KnowledgeListMF.crossBenchCraft = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(BlockListMF.crossbowBench), "crossbows", spanner, "spanner", 0, 200, new Object[] - { - " F ", - "PSP", - "NCN", - 'F', ComponentListMF.iron_frame, - 'P', ComponentListMF.plank, - 'N', ComponentListMF.bolt, - 'S', Items.string, - 'C', BlockListMF.carpenter, - }); - - - KnowledgeListMF.engTannerR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(BlockListMF.engTanner), "engTanner", spanner, "spanner", 3, 300, new Object[] - { - "BLB", - "SPS", - "GGG", - "SFS", - 'S', ComponentListMF.iron_strut, - 'B', ComponentListMF.bolt, - 'F', ComponentListMF.iron_frame, - 'L', Blocks.lever, - 'P', new ItemStack(CustomToolListMF.standard_knife, 1, 0), - 'G', ComponentListMF.bronze_gears, - }); + KnowledgeListMF.bombBenchCraft = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.bombBench), "bombs", spanner, "spanner", 0, 150, new Object[] { "BFB", "BCB", + 'B', ComponentListMF.bolt, 'F', ComponentListMF.iron_frame, 'C', BlockListMF.carpenter, }); + KnowledgeListMF.bombPressCraft = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.bombPress), "bpress", spanner, "spanner", 3, 200, + new Object[] { "BFB", "GGL", "SPS", 'S', ComponentListMF.iron_strut, 'B', ComponentListMF.bolt, 'F', + ComponentListMF.iron_frame, 'L', Blocks.lever, 'P', + new ItemStack(CustomToolListMF.standard_spanner, 1, 0), 'G', ComponentListMF.bronze_gears, }); + + KnowledgeListMF.crossBenchCraft = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.crossbowBench), "crossbows", spanner, "spanner", 0, 200, + new Object[] { " F ", "PSP", "NCN", 'F', ComponentListMF.iron_frame, 'P', ComponentListMF.plank, 'N', + ComponentListMF.bolt, 'S', Items.string, 'C', BlockListMF.carpenter, }); + + KnowledgeListMF.engTannerR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.engTanner), "engTanner", spanner, "spanner", 3, 300, + new Object[] { "BLB", "SPS", "GGG", "SFS", 'S', ComponentListMF.iron_strut, 'B', ComponentListMF.bolt, + 'F', ComponentListMF.iron_frame, 'L', Blocks.lever, 'P', + new ItemStack(CustomToolListMF.standard_knife, 1, 0), 'G', ComponentListMF.bronze_gears, }); ItemStack blackPlate = ComponentListMF.plate.createComm("blackSteel"); - KnowledgeListMF.advancedForgeR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(BlockListMF.forge_metal), "advforge", spanner, "spanner", 4, 400, new Object[] - { - " T ", - "FRRF", - "PPPP", - "BBBB", - 'B', ComponentListMF.bolt, - 'F', ComponentListMF.iron_frame, - 'T', ToolListMF.engin_anvil_tools, - 'P', blackPlate, - 'R', Blocks.redstone_block, - }); + KnowledgeListMF.advancedForgeR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.forge_metal), "advforge", spanner, "spanner", 4, 400, + new Object[] { " T ", "FRRF", "PPPP", "BBBB", 'B', ComponentListMF.bolt, 'F', + ComponentListMF.iron_frame, 'T', ToolListMF.engin_anvil_tools, 'P', blackPlate, 'R', + Blocks.redstone_block, }); ItemStack steelPlate = ComponentListMF.plate.createComm("steel"); - KnowledgeListMF.autoCrucibleR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(BlockListMF.crucibleauto), "advcrucible", spanner, "spanner", 4, 200, new Object[] - { - " T ", - "PCP", - "PGP", - "BBB", - 'B', ComponentListMF.bolt, - 'C', BlockListMF.crucibleadv, - 'G', ComponentListMF.tungsten_gears, - 'T', ToolListMF.engin_anvil_tools, - 'P', steelPlate - }); - KnowledgeListMF.spyglassR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ToolListMF.spyglass), "spyglass", spanner, "spanner", 1, 300, new Object[] - { - " T ", - "BCB", - "GPG", - 'C', ComponentListMF.bronze_gears, - 'G', Blocks.glass, - 'B', ComponentListMF.bolt, - 'T', ToolListMF.engin_anvil_tools, - 'P', ComponentListMF.steel_tube, - }); - - - KnowledgeListMF.syringeR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ToolListMF.syringe_empty), "syringe", spanner, "spanner", 1, 200, new Object[] - { - "E", - "T", - "B", - "N", - 'E', ToolListMF.engin_anvil_tools, - 'T', ComponentListMF.steel_tube, - 'B', Items.glass_bottle, - 'N', new ItemStack(CustomToolListMF.standard_needle), - }); - - KnowledgeListMF.parachuteR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ToolListMF.parachute), "parachute", sewing, "needle", 1, 350, new Object[] - { - "TTT", - "CCC", - "BEB", - "BLB", - 'E', ToolListMF.engin_anvil_tools, - 'T', ComponentListMF.thread, - 'B', ComponentListMF.leather_strip, - 'L', Items.leather, - 'C', Blocks.wool, - }); - KnowledgeListMF.cogShaftR = - MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ComponentListMF.cogwork_shaft), "cogArmour", spanner, "spanner", 4, 150, new Object[] - { - "BPB", - "SGS", - "BFB", - - 'P', Blocks.piston, - 'G', ComponentListMF.tungsten_gears, - 'B', ComponentListMF.bolt, - 'F', ComponentListMF.iron_frame, - 'S', ComponentListMF.iron_strut, - }); - Salvage.addSalvage(ComponentListMF.cogwork_shaft, new ItemStack(ComponentListMF.iron_strut, 2), new ItemStack(ComponentListMF.bolt, 4), ComponentListMF.iron_frame, Blocks.piston, ComponentListMF.tungsten_gears); - - Salvage.addSalvage(BlockListMF.crucibleauto, new ItemStack(ComponentListMF.bolt, 3), ComponentListMF.tungsten_gears, BlockListMF.crucibleadv, steelPlate, steelPlate, steelPlate, steelPlate); - Salvage.addSalvage(BlockListMF.bombBench, new ItemStack(ComponentListMF.bolt, 4), ComponentListMF.iron_frame, BlockListMF.carpenter); - Salvage.addSalvage(BlockListMF.crossbowBench, new ItemStack(ComponentListMF.nail, 2), ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood", 2), Items.string, BlockListMF.carpenter); - Salvage.addSalvage(BlockListMF.bombPress, new ItemStack(ComponentListMF.iron_strut, 2), new ItemStack(ComponentListMF.bolt, 2), new ItemStack(ComponentListMF.bronze_gears, 2), Blocks.lever, ComponentListMF.iron_frame); - Salvage.addSalvage(BlockListMF.engTanner, new ItemStack(ComponentListMF.iron_strut, 4), new ItemStack(ComponentListMF.bolt, 2), new ItemStack(ComponentListMF.bronze_gears, 3), CustomToolListMF.standard_needle, Blocks.lever, ComponentListMF.iron_frame); - Salvage.addSalvage(BlockListMF.forge_metal, new ItemStack(ComponentListMF.bolt, 4), blackPlate, blackPlate, blackPlate, blackPlate, new ItemStack(ComponentListMF.iron_frame, 2), new ItemStack(Blocks.redstone_block, 2)); - Salvage.addSalvage(ToolListMF.spyglass, new ItemStack(ComponentListMF.bolt, 2), new ItemStack(Blocks.glass, 2), ComponentListMF.steel_tube, ComponentListMF.bronze_gears); - Salvage.addSalvage(ToolListMF.syringe_empty, Items.glass_bottle, CustomToolListMF.standard_needle, ComponentListMF.steel_tube); - Salvage.addSalvage(ToolListMF.parachute, new ItemStack(ComponentListMF.thread, 3), new ItemStack(Blocks.wool, 3), new ItemStack(ComponentListMF.leather_strip, 4), Items.leather); + KnowledgeListMF.autoCrucibleR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.crucibleauto), "advcrucible", spanner, "spanner", 4, 200, + new Object[] { " T ", "PCP", "PGP", "BBB", 'B', ComponentListMF.bolt, 'C', BlockListMF.crucibleadv, 'G', + ComponentListMF.tungsten_gears, 'T', ToolListMF.engin_anvil_tools, 'P', steelPlate }); + KnowledgeListMF.spyglassR = MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ToolListMF.spyglass), + "spyglass", spanner, "spanner", 1, 300, + new Object[] { " T ", "BCB", "GPG", 'C', ComponentListMF.bronze_gears, 'G', Blocks.glass, 'B', + ComponentListMF.bolt, 'T', ToolListMF.engin_anvil_tools, 'P', ComponentListMF.steel_tube, }); + + KnowledgeListMF.syringeR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ToolListMF.syringe_empty), "syringe", spanner, "spanner", 1, 200, + new Object[] { "E", "T", "B", "N", 'E', ToolListMF.engin_anvil_tools, 'T', ComponentListMF.steel_tube, + 'B', Items.glass_bottle, 'N', new ItemStack(CustomToolListMF.standard_needle), }); + + KnowledgeListMF.parachuteR = MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ToolListMF.parachute), + "parachute", sewing, "needle", 1, 350, + new Object[] { "TTT", "CCC", "BEB", "BLB", 'E', ToolListMF.engin_anvil_tools, 'T', + ComponentListMF.thread, 'B', ComponentListMF.leather_strip, 'L', Items.leather, 'C', + Blocks.wool, }); + KnowledgeListMF.cogShaftR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cogwork_shaft), "cogArmour", spanner, "spanner", 4, 150, + new Object[] { "BPB", "SGS", "BFB", + + 'P', Blocks.piston, 'G', ComponentListMF.tungsten_gears, 'B', ComponentListMF.bolt, 'F', + ComponentListMF.iron_frame, 'S', ComponentListMF.iron_strut, }); + Salvage.addSalvage(ComponentListMF.cogwork_shaft, new ItemStack(ComponentListMF.iron_strut, 2), + new ItemStack(ComponentListMF.bolt, 4), ComponentListMF.iron_frame, Blocks.piston, + ComponentListMF.tungsten_gears); + + Salvage.addSalvage(BlockListMF.crucibleauto, new ItemStack(ComponentListMF.bolt, 3), + ComponentListMF.tungsten_gears, BlockListMF.crucibleadv, steelPlate, steelPlate, steelPlate, + steelPlate); + Salvage.addSalvage(BlockListMF.bombBench, new ItemStack(ComponentListMF.bolt, 4), ComponentListMF.iron_frame, + BlockListMF.carpenter); + Salvage.addSalvage(BlockListMF.crossbowBench, new ItemStack(ComponentListMF.nail, 2), + ComponentListMF.plank.construct("ScrapWood", 2), Items.string, BlockListMF.carpenter); + Salvage.addSalvage(BlockListMF.bombPress, new ItemStack(ComponentListMF.iron_strut, 2), + new ItemStack(ComponentListMF.bolt, 2), new ItemStack(ComponentListMF.bronze_gears, 2), Blocks.lever, + ComponentListMF.iron_frame); + Salvage.addSalvage(BlockListMF.engTanner, new ItemStack(ComponentListMF.iron_strut, 4), + new ItemStack(ComponentListMF.bolt, 2), new ItemStack(ComponentListMF.bronze_gears, 3), + CustomToolListMF.standard_needle, Blocks.lever, ComponentListMF.iron_frame); + Salvage.addSalvage(BlockListMF.forge_metal, new ItemStack(ComponentListMF.bolt, 4), blackPlate, blackPlate, + blackPlate, blackPlate, new ItemStack(ComponentListMF.iron_frame, 2), + new ItemStack(Blocks.redstone_block, 2)); + Salvage.addSalvage(ToolListMF.spyglass, new ItemStack(ComponentListMF.bolt, 2), new ItemStack(Blocks.glass, 2), + ComponentListMF.steel_tube, ComponentListMF.bronze_gears); + Salvage.addSalvage(ToolListMF.syringe_empty, Items.glass_bottle, CustomToolListMF.standard_needle, + ComponentListMF.steel_tube); + Salvage.addSalvage(ToolListMF.parachute, new ItemStack(ComponentListMF.thread, 3), + new ItemStack(Blocks.wool, 3), new ItemStack(ComponentListMF.leather_strip, 4), Items.leather); } - - private static void addNonPrimitiveStone() - { - KnowledgeListMF.stoneKnifeR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.knifeStone), "", primitive, "hands", -1, 4, new Object[] - { - "R", - "R", - "S", - 'R', Blocks.cobblestone, - 'S', ComponentListMF.plank, - }); - KnowledgeListMF.stoneHammerR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hammerStone), "", primitive, "hands", -1, 4, new Object[] - { - "R", - "S", - 'R', Blocks.cobblestone, - 'S', ComponentListMF.plank, - }); - - KnowledgeListMF.stoneTongsR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.tongsStone), "", primitive, "hands", -1, 4, new Object[] - { - "R ", - "SR", - 'R', Blocks.cobblestone, - 'S', ComponentListMF.plank, - }); - KnowledgeListMF.boneNeedleR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.needleBone), "", primitive, "hands", -1, 4, new Object[] - { - "B", - 'B', Items.bone, - }); - - Salvage.addSalvage(ToolListMF.knifeStone, new ItemStack(Blocks.cobblestone, 2), ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood")); - Salvage.addSalvage(ToolListMF.hammerStone, Blocks.cobblestone, ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood")); - Salvage.addSalvage(ToolListMF.tongsStone, new ItemStack(Blocks.cobblestone, 2), ((ItemComponentMF)ComponentListMF.plank).construct("ScrapWood")); + + private static void addNonPrimitiveStone() { + KnowledgeListMF.stoneKnifeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.knifeStone), "", + primitive, "hands", -1, 4, + new Object[] { "R", "R", "S", 'R', Blocks.cobblestone, 'S', ComponentListMF.plank, }); + KnowledgeListMF.stoneHammerR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hammerStone), + "", primitive, "hands", -1, 4, + new Object[] { "R", "S", 'R', Blocks.cobblestone, 'S', ComponentListMF.plank, }); + + KnowledgeListMF.stoneTongsR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.tongsStone), "", + primitive, "hands", -1, 4, + new Object[] { "R ", "SR", 'R', Blocks.cobblestone, 'S', ComponentListMF.plank, }); + KnowledgeListMF.boneNeedleR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.needleBone), "", + primitive, "hands", -1, 4, new Object[] { "B", 'B', Items.bone, }); + + Salvage.addSalvage(ToolListMF.knifeStone, new ItemStack(Blocks.cobblestone, 2), + ComponentListMF.plank.construct("ScrapWood")); + Salvage.addSalvage(ToolListMF.hammerStone, Blocks.cobblestone, ComponentListMF.plank.construct("ScrapWood")); + Salvage.addSalvage(ToolListMF.tongsStone, new ItemStack(Blocks.cobblestone, 2), + ComponentListMF.plank.construct("ScrapWood")); Salvage.addSalvage(ToolListMF.needleBone, Items.bone); } - private static void addPrimitive() - { - KnowledgeListMF.dirtRockR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.sharp_rock), "", "minecraft:dig.gravel", "hands", -1, 1, new Object[] - { - "D", - 'D', Blocks.dirt, - }); - - KnowledgeListMF.stonePickR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.pickStone), "", primitive, "hands", -1, 5, new Object[] - { - "RVR", - " S ", - " S ", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - KnowledgeListMF.stoneAxeR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.axeStone), "", primitive, "hands", -1, 5, new Object[] - { - "RV", - "RS", - " S", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - KnowledgeListMF.stoneSpadeR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.spadeStone), "", primitive, "hands", -1, 5, new Object[] - { - "VR", - " S", - " S", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - KnowledgeListMF.stoneHoeR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hoeStone), "", primitive, "hands", -1, 5, new Object[] - { - "RV", - " S", - " S", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - KnowledgeListMF.stoneSwordR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.swordStone), "", primitive, "hands", -1, 8, new Object[] - { - "R ", - "R ", - "SV", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - KnowledgeListMF.stoneWarR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.waraxeStone), "", primitive, "hands", -1, 8, new Object[] - { - "VRV", - "RS", - " S", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - KnowledgeListMF.stoneMaceR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.maceStone), "", primitive, "hands", -1, 8, new Object[] - { - " V ", - "RSR", - " S ", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - KnowledgeListMF.stoneSpearR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.spearStone), "", primitive, "hands", -1, 8, new Object[] - { - "R", - "V", - "S", - "S", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - KnowledgeListMF.stoneKnifeR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.knifeStone), "", primitive, "hands", -1, 4, new Object[] - { - "R ", - "SV", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - KnowledgeListMF.stoneHammerR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hammerStone), "", primitive, "hands", -1, 4, new Object[] - { - "R", - "V", - "S", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - - KnowledgeListMF.stoneTongsR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.tongsStone), "", primitive, "hands", -1, 4, new Object[] - { - " R", - "SV", - 'R', ComponentListMF.sharp_rock, - 'V', ComponentListMF.vine, - 'S', Items.stick - }); - KnowledgeListMF.boneNeedleR = - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.needleBone), "", primitive, "hands", -1, 4, new Object[] - { - "B", - 'B', Items.bone, - }); - - Salvage.addSalvage(ToolListMF.pickStone, new ItemStack(ComponentListMF.sharp_rock, 2), new ItemStack(Items.stick, 2), ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.axeStone, new ItemStack(ComponentListMF.sharp_rock, 2), new ItemStack(Items.stick, 2), ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.spadeStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.hoeStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.swordStone, Items.stick, new ItemStack(ComponentListMF.sharp_rock, 2), ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.waraxeStone, new ItemStack(ComponentListMF.sharp_rock, 2), new ItemStack(Items.stick, 2), new ItemStack(ComponentListMF.vine, 2)); - Salvage.addSalvage(ToolListMF.maceStone, new ItemStack(ComponentListMF.sharp_rock, 2), new ItemStack(Items.stick, 2), ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.spearStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), ComponentListMF.vine); + + private static void addPrimitive() { + KnowledgeListMF.dirtRockR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.sharp_rock), + "", "minecraft:dig.gravel", "hands", -1, 1, new Object[] { "D", 'D', Blocks.dirt, }); + + KnowledgeListMF.stonePickR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.pickStone), "", + primitive, "hands", -1, 5, new Object[] { "RVR", " S ", " S ", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + KnowledgeListMF.stoneAxeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.axeStone), "", + primitive, "hands", -1, 5, new Object[] { "RV", "RS", " S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + KnowledgeListMF.stoneSpadeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.spadeStone), "", + primitive, "hands", -1, 5, new Object[] { "VR", " S", " S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + KnowledgeListMF.stoneHoeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hoeStone), "", + primitive, "hands", -1, 5, new Object[] { "RV", " S", " S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + KnowledgeListMF.stoneSwordR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.swordStone), "", + primitive, "hands", -1, 8, new Object[] { "R ", "R ", "SV", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + KnowledgeListMF.stoneWarR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.waraxeStone), "", + primitive, "hands", -1, 8, new Object[] { "VRV", "RS", " S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + KnowledgeListMF.stoneMaceR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.maceStone), "", + primitive, "hands", -1, 8, new Object[] { " V ", "RSR", " S ", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + KnowledgeListMF.stoneSpearR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.spearStone), "", + primitive, "hands", -1, 8, new Object[] { "R", "V", "S", "S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + KnowledgeListMF.stoneKnifeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.knifeStone), "", + primitive, "hands", -1, 4, new Object[] { "R ", "SV", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + KnowledgeListMF.stoneHammerR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hammerStone), + "", primitive, "hands", -1, 4, new Object[] { "R", "V", "S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + + KnowledgeListMF.stoneTongsR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.tongsStone), "", + primitive, "hands", -1, 4, new Object[] { " R", "SV", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick }); + KnowledgeListMF.boneNeedleR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.needleBone), "", + primitive, "hands", -1, 4, new Object[] { "B", 'B', Items.bone, }); + + Salvage.addSalvage(ToolListMF.pickStone, new ItemStack(ComponentListMF.sharp_rock, 2), + new ItemStack(Items.stick, 2), ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.axeStone, new ItemStack(ComponentListMF.sharp_rock, 2), + new ItemStack(Items.stick, 2), ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.spadeStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), + ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.hoeStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), + ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.swordStone, Items.stick, new ItemStack(ComponentListMF.sharp_rock, 2), + ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.waraxeStone, new ItemStack(ComponentListMF.sharp_rock, 2), + new ItemStack(Items.stick, 2), new ItemStack(ComponentListMF.vine, 2)); + Salvage.addSalvage(ToolListMF.maceStone, new ItemStack(ComponentListMF.sharp_rock, 2), + new ItemStack(Items.stick, 2), ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.spearStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), + ComponentListMF.vine); Salvage.addSalvage(ToolListMF.knifeStone, ComponentListMF.sharp_rock, Items.stick, ComponentListMF.vine); Salvage.addSalvage(ToolListMF.hammerStone, ComponentListMF.sharp_rock, Items.stick, ComponentListMF.vine); Salvage.addSalvage(ToolListMF.tongsStone, ComponentListMF.sharp_rock, Items.stick, ComponentListMF.vine); Salvage.addSalvage(ToolListMF.needleBone, Items.bone); } - public static void initTierWood() - { + + public static void initTierWood() { String basic = CarpenterRecipes.basic; - + float time = 4; Item plank = ComponentListMF.plank; - - KnowledgeListMF.spoonR = - MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_spoon, "", basic, "hands", -1, 1+(int)(1*time), new Object[]{ - "W", - "S", - 'W', plank, - 'S', Items.stick - }); + + KnowledgeListMF.spoonR = MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_spoon, "", + basic, "hands", -1, 1 + (int) (1 * time), new Object[] { "W", "S", 'W', plank, 'S', Items.stick }); Salvage.addSalvage(CustomToolListMF.standard_spoon, plank, Items.stick); - KnowledgeListMF.malletR = - MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_mallet, "", basic, "hands", -1, 1+(int)(2*time), new Object[]{ - "WW", - " S", - 'W', plank, - 'S', Items.stick - }); + KnowledgeListMF.malletR = MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_mallet, "", + basic, "hands", -1, 1 + (int) (2 * time), new Object[] { "WW", " S", 'W', plank, 'S', Items.stick }); Salvage.addSalvage(CustomToolListMF.standard_mallet, plank, plank, Items.stick); Salvage.addSalvage(CustomToolListMF.standard_spoon, plank, Items.stick); - - KnowledgeListMF.refinedPlankR.add( - MineFantasyAPI.addCarpenterRecipe(construction, ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), "", basic, "hands", -1, 1 , new Object[] - { - "O", - "P", - 'O', ComponentListMF.plant_oil, - 'P', ((ItemComponentMF)ComponentListMF.plank) - })); - KnowledgeListMF.easyPaintPlank.add( - MineFantasyAPI.addCarpenterRecipe(construction, ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood", 4), "paint_brush", sewing, "brush", -1, 2 , new Object[] - { - " O ", - "PPPP", - 'O', ComponentListMF.plant_oil, - 'P', ((ItemComponentMF)ComponentListMF.plank) - })); + + KnowledgeListMF.refinedPlankR.add(MineFantasyAPI.addCarpenterRecipe(construction, + ComponentListMF.plank.construct("RefinedWood"), "", basic, "hands", -1, 1, + new Object[] { "O", "P", 'O', ComponentListMF.plant_oil, 'P', (ComponentListMF.plank) })); + KnowledgeListMF.easyPaintPlank.add(MineFantasyAPI.addCarpenterRecipe(construction, + ComponentListMF.plank.construct("RefinedWood", 4), "paint_brush", sewing, "brush", -1, 2, + new Object[] { " O ", "PPPP", 'O', ComponentListMF.plant_oil, 'P', (ComponentListMF.plank) })); } - - static void tryAddSawPlanks(ItemStack planks, CustomMaterial material) - { - String sub = material.name.substring(0, material.name.length()-4).toLowerCase(); - - if(planks.getUnlocalizedName().toLowerCase().contains(sub)) - { + + static void tryAddSawPlanks(ItemStack planks, CustomMaterial material) { + String sub = material.name.substring(0, material.name.length() - 4).toLowerCase(); + + if (planks.getUnlocalizedName().toLowerCase().contains(sub)) { addSawPlanks(planks, material); } } - - static void addSawPlanks(ItemStack planks, CustomMaterial material) - { - MineFantasyAPI.addCarpenterRecipe(construction, ((ItemComponentMF)(ComponentListMF.plank)).construct(material.name, 4), "commodities", sawing, "saw", -1, 10 , new Object[] - { - "P", - 'P', planks.copy() - }); - } + + static void addSawPlanks(ItemStack planks, CustomMaterial material) { + MineFantasyAPI.addCarpenterRecipe(construction, (ComponentListMF.plank).construct(material.name, 4), + "commodities", sawing, "saw", -1, 10, new Object[] { "P", 'P', planks.copy() }); + } } diff --git a/src/main/java/minefantasy/mf2/recipe/ComponentAnvilRecipe.java b/src/main/java/minefantasy/mf2/recipe/ComponentAnvilRecipe.java index 04f70c0d..d232b693 100644 --- a/src/main/java/minefantasy/mf2/recipe/ComponentAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/recipe/ComponentAnvilRecipe.java @@ -1,97 +1,78 @@ package minefantasy.mf2.recipe; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; import minefantasy.mf2.api.crafting.anvil.ShapedAnvilRecipes; import minefantasy.mf2.api.crafting.anvil.ShapelessAnvilRecipes; import minefantasy.mf2.api.heating.Heatable; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.rpg.Skill; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; -public class ComponentAnvilRecipe extends ShapedAnvilRecipes -{ - public ComponentAnvilRecipe(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, int hammer, int anvi, float exp, boolean hot, String research, Skill skill) - { +public class ComponentAnvilRecipe extends ShapedAnvilRecipes { + public ComponentAnvilRecipe(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, + int hammer, int anvi, float exp, boolean hot, String research, Skill skill) { super(wdth, heit, inputs, output, toolType, time, hammer, anvi, exp, hot, research, skill); } - - protected boolean checkMatch(InventoryCrafting matrix, int x, int y, boolean b) - { + + protected boolean checkMatch(InventoryCrafting matrix, int x, int y, boolean b) { String baseMaterial = null; - for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) - { - for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) - { - int var7 = var5 - x; - int var8 = var6 - y; - ItemStack recipeItem = null; + for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) { + for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) { + int var7 = var5 - x; + int var8 = var6 - y; + ItemStack recipeItem = null; - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) - { - if (b) - { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; - } - else - { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; - } - } + if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (b) { + recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + } else { + recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + } + } - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); - if (inputItem != null || recipeItem != null) - { - CustomMaterial material = CustomMaterial.getMaterialFor(inputItem, "base"); - if(material != null) - { - if(baseMaterial == null) - { - baseMaterial = material.name; - } - else - { - if(material.name != baseMaterial) - { - return false; - } - } - } - //HEATING - if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) - { + if (inputItem != null || recipeItem != null) { + CustomMaterial material = CustomMaterial.getMaterialFor(inputItem, "base"); + if (material != null) { + if (baseMaterial == null) { + baseMaterial = material.name; + } else { + if (material.name != baseMaterial) { + return false; + } + } + } + // HEATING + if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { + return false; + } + if (!Heatable.isWorkable(inputItem)) { return false; } - if(!Heatable.isWorkable(inputItem)) - { - return false; - } inputItem = getHotItem(inputItem); - - if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) - { - return false; - } - - if(inputItem == null) - { - return false; - } - if (recipeItem.getItem() != inputItem.getItem()) - { - return false; - } + if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { + return false; + } - if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE && recipeItem.getItemDamage() != inputItem.getItemDamage()) - { - return false; - } - } - } - } + if (inputItem == null) { + return false; + } - return true; - } + if (recipeItem.getItem() != inputItem.getItem()) { + return false; + } + + if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE + && recipeItem.getItemDamage() != inputItem.getItemDamage()) { + return false; + } + } + } + } + + return true; + } } diff --git a/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java b/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java index 67cc91e6..529a07a2 100644 --- a/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java @@ -3,7 +3,6 @@ import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.cooking.CookRecipe; -import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ComponentListMF; @@ -11,114 +10,113 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class CookingRecipes -{ - public static void init() - { +public class CookingRecipes { + public static void init() { cookMeat(FoodListMF.horse_raw, FoodListMF.horse_cooked); cookMeat(FoodListMF.wolf_raw, FoodListMF.wolf_cooked); cookMeat(FoodListMF.saussage_raw, FoodListMF.saussage_cooked); cookMeat(FoodListMF.generic_meat_uncooked, FoodListMF.generic_meat_cooked); cookMeat(FoodListMF.generic_meat_strip_uncooked, FoodListMF.generic_meat_strip_cooked); cookMeat(FoodListMF.generic_meat_chunk_uncooked, FoodListMF.generic_meat_chunk_cooked); - - bake(FoodListMF.dough, FoodListMF.breadroll, 150, 300, 10, 20, true); - bake(FoodListMF.raw_bread, Items.bread, 150, 300, 20, 40, true); - bake(FoodListMF.curds, FoodListMF.cheese_pot, 100, 300, 60, 20, false); - bake(FoodListMF.sweetroll_raw, FoodListMF.sweetroll_uniced, 150, 250, 20, 10, true); - - bake(FoodListMF.pie_pumpkin_uncooked, FoodListMF.pie_pumpkin_cooked,150, 300, 20, 20, FoodListMF.burnt_pie); - bake(FoodListMF.pie_apple_uncooked, FoodListMF.pie_apple_cooked, 150, 300, 25, 20, FoodListMF.burnt_pie); - bake(FoodListMF.pie_berry_uncooked, FoodListMF.pie_berry_cooked, 150, 300, 25, 20, FoodListMF.burnt_pie); - bake(FoodListMF.pie_meat_uncooked, FoodListMF.pie_meat_cooked, 150, 300, 30, 20, FoodListMF.burnt_pie); - bake(FoodListMF.pie_shepard_uncooked, FoodListMF.pie_shepard_cooked,150, 300, 30, 20, FoodListMF.burnt_pie); - - bake(FoodListMF.cake_simple_raw, FoodListMF.cake_simple_uniced, 150, 250, 30, 30, FoodListMF.burnt_cake); - bake(FoodListMF.cake_raw, FoodListMF.cake_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); - bake(FoodListMF.cake_choc_raw, FoodListMF.cake_choc_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); - bake(FoodListMF.cake_carrot_raw, FoodListMF.cake_carrot_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); - bake(FoodListMF.cake_bf_raw, FoodListMF.cake_bf_uniced, 150, 250, 50, 10 , FoodListMF.burnt_cake); - bake(FoodListMF.eclair_raw, FoodListMF.eclair_uniced, 150, 250, 60, 5 , true); - + + bake(FoodListMF.dough, FoodListMF.breadroll, 150, 300, 10, 20, true); + bake(FoodListMF.raw_bread, Items.bread, 150, 300, 20, 40, true); + bake(FoodListMF.curds, FoodListMF.cheese_pot, 100, 300, 60, 20, false); + bake(FoodListMF.sweetroll_raw, FoodListMF.sweetroll_uniced, 150, 250, 20, 10, true); + + bake(FoodListMF.pie_pumpkin_uncooked, FoodListMF.pie_pumpkin_cooked, 150, 300, 20, 20, FoodListMF.burnt_pie); + bake(FoodListMF.pie_apple_uncooked, FoodListMF.pie_apple_cooked, 150, 300, 25, 20, FoodListMF.burnt_pie); + bake(FoodListMF.pie_berry_uncooked, FoodListMF.pie_berry_cooked, 150, 300, 25, 20, FoodListMF.burnt_pie); + bake(FoodListMF.pie_meat_uncooked, FoodListMF.pie_meat_cooked, 150, 300, 30, 20, FoodListMF.burnt_pie); + bake(FoodListMF.pie_shepard_uncooked, FoodListMF.pie_shepard_cooked, 150, 300, 30, 20, FoodListMF.burnt_pie); + + bake(FoodListMF.cake_simple_raw, FoodListMF.cake_simple_uniced, 150, 250, 30, 30, FoodListMF.burnt_cake); + bake(FoodListMF.cake_raw, FoodListMF.cake_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); + bake(FoodListMF.cake_choc_raw, FoodListMF.cake_choc_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); + bake(FoodListMF.cake_carrot_raw, FoodListMF.cake_carrot_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); + bake(FoodListMF.cake_bf_raw, FoodListMF.cake_bf_uniced, 150, 250, 50, 10, FoodListMF.burnt_cake); + bake(FoodListMF.eclair_raw, FoodListMF.eclair_uniced, 150, 250, 60, 5, true); + addCeramics(); MineFantasyAPI.addCookingRecipe(new ItemStack(FoodListMF.generic_meat_mince_uncooked), - new ItemStack(FoodListMF.generic_meat_mince_cooked), new ItemStack(FoodListMF.burnt_pot), - 100, 200, 10, false); - - MineFantasyAPI.addCookingRecipe(new ItemStack(FoodListMF.bowl_water_salt), - new ItemStack(FoodListMF.salt), - 100, 200, 2, false, false); - - if(!ConfigHardcore.preventCook) - { + new ItemStack(FoodListMF.generic_meat_mince_cooked), new ItemStack(FoodListMF.burnt_pot), 100, 200, 10, + false); + + MineFantasyAPI.addCookingRecipe(new ItemStack(FoodListMF.bowl_water_salt), new ItemStack(FoodListMF.salt), 100, + 200, 2, false, false); + + if (!ConfigHardcore.preventCook) { smeltFood(); } } + /** * Cook in for out on anything (100C-200C, for ~15s) */ - private static CookRecipe cookMeat(Item in, Item out) - { - return MineFantasyAPI.addCookingRecipe(new ItemStack(in), - new ItemStack(out), - 100, 200, 15, false); + private static CookRecipe cookMeat(Item in, Item out) { + return MineFantasyAPI.addCookingRecipe(new ItemStack(in), new ItemStack(out), 100, 200, 15, false); } + /** * Cook in for out enclosed in ovens - * @param temp how hot the oven is - * @param offset the room for error +/- - * @param time how much time roughly + * + * @param temp + * how hot the oven is + * @param offset + * the room for error +/- + * @param time + * how much time roughly */ - private static CookRecipe bake(Item in, Item out, int mint, int maxt, int time, int burn_time, boolean burn) - { - return MineFantasyAPI.addCookingRecipe(new ItemStack(in), - new ItemStack(out), new ItemStack(FoodListMF.burnt_food), - mint, maxt, time, burn_time, true, burn); + private static CookRecipe bake(Item in, Item out, int mint, int maxt, int time, int burn_time, boolean burn) { + return MineFantasyAPI.addCookingRecipe(new ItemStack(in), new ItemStack(out), + new ItemStack(FoodListMF.burnt_food), mint, maxt, time, burn_time, true, burn); } + /** * Cook in for out enclosed in ovens - * @param temp how hot the oven is - * @param offset the room for error +/- - * @param time how much time roughly + * + * @param temp + * how hot the oven is + * @param offset + * the room for error +/- + * @param time + * how much time roughly */ - private static CookRecipe bake(Item in, Item out, int mint, int maxt, int time, int burn_time, Item burn) - { - return MineFantasyAPI.addCookingRecipe(new ItemStack(in), - new ItemStack(out), new ItemStack(burn), - mint, maxt, time, burn_time, true); + private static CookRecipe bake(Item in, Item out, int mint, int maxt, int time, int burn_time, Item burn) { + return MineFantasyAPI.addCookingRecipe(new ItemStack(in), new ItemStack(out), new ItemStack(burn), mint, maxt, + time, burn_time, true); } - - private static void smeltFood() - { + + private static void smeltFood() { GameRegistry.addSmelting(FoodListMF.horse_raw, new ItemStack(FoodListMF.horse_cooked), 0.2F); GameRegistry.addSmelting(FoodListMF.wolf_raw, new ItemStack(FoodListMF.wolf_cooked), 0.2F); GameRegistry.addSmelting(FoodListMF.generic_meat_uncooked, new ItemStack(FoodListMF.generic_meat_cooked), 0); - GameRegistry.addSmelting(FoodListMF.generic_meat_strip_uncooked, new ItemStack(FoodListMF.generic_meat_strip_cooked), 0); - GameRegistry.addSmelting(FoodListMF.generic_meat_chunk_uncooked, new ItemStack(FoodListMF.generic_meat_chunk_cooked), 0); - GameRegistry.addSmelting(FoodListMF.generic_meat_mince_uncooked, new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); + GameRegistry.addSmelting(FoodListMF.generic_meat_strip_uncooked, + new ItemStack(FoodListMF.generic_meat_strip_cooked), 0); + GameRegistry.addSmelting(FoodListMF.generic_meat_chunk_uncooked, + new ItemStack(FoodListMF.generic_meat_chunk_cooked), 0); + GameRegistry.addSmelting(FoodListMF.generic_meat_mince_uncooked, + new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); GameRegistry.addSmelting(FoodListMF.bowl_water_salt, new ItemStack(FoodListMF.salt), 0); GameRegistry.addSmelting(FoodListMF.saussage_raw, new ItemStack(FoodListMF.saussage_cooked), 0); - + } - - - private static void addCeramics() - { + + private static void addCeramics() { bakeCeramic(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot, 1000, 5); bakeCeramic(FoodListMF.jug_uncooked, FoodListMF.jug_empty, 1000, 5); bakeCeramic(ComponentListMF.pie_tray_uncooked, FoodListMF.pie_tray, 1000, 10); bakeCeramic(ComponentListMF.ingot_mould_uncooked, ComponentListMF.ingot_mould, 1000, 5); bakeCeramic(ComponentListMF.mine_casing_uncooked, ComponentListMF.mine_casing, 1000, 10); bakeCeramic(ComponentListMF.bomb_casing_uncooked, ComponentListMF.bomb_casing, 1000, 10); - + bakeCeramic(ComponentListMF.fireclay_brick, ComponentListMF.strong_brick, 1500, 5); } - private static CookRecipe bakeCeramic(Item clay, Item ceramic, int temp, int time) - { + + private static CookRecipe bakeCeramic(Item clay, Item ceramic, int temp, int time) { GameRegistry.addSmelting(clay, new ItemStack(ceramic), 0F); - return MineFantasyAPI.addCookingRecipe(new ItemStack(clay), - new ItemStack(ceramic), null, - temp, 1000, time, 0, true, false); - + return MineFantasyAPI.addCookingRecipe(new ItemStack(clay), new ItemStack(ceramic), null, temp, 1000, time, 0, + true, false); + } } diff --git a/src/main/java/minefantasy/mf2/recipe/CustomWoodRecipes.java b/src/main/java/minefantasy/mf2/recipe/CustomWoodRecipes.java index 6175d454..8fc5381b 100644 --- a/src/main/java/minefantasy/mf2/recipe/CustomWoodRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CustomWoodRecipes.java @@ -15,129 +15,82 @@ import minefantasy.mf2.knowledge.KnowledgeListMF; import net.minecraft.item.ItemStack; -public class CustomWoodRecipes -{ +public class CustomWoodRecipes { public static final String basic = "step.wood"; public static final String chopping = "dig.wood"; public static final String sawing = "minefantasy2:block.sawcarpenter"; public static final String nailHammer = "minefantasy2:block.hammercarpenter"; public static final String woodHammer = "minefantasy2:block.carpentermallet"; private static final Skill construction = SkillList.construction; - - public static void init() - { + + public static void init() { ArrayList wood = CustomMaterial.getList("wood"); Iterator iterator = wood.iterator(); - while(iterator.hasNext()) - { + while (iterator.hasNext()) { CustomMaterial customMat = (CustomMaterial) iterator.next(); - addRecipes(customMat); - } + addRecipes(customMat); + } } - private static void addRecipes(CustomMaterial material) - { - ItemStack timber = ((ItemComponentMF)ComponentListMF.plank).construct(material.name); - ItemStack cutPlank = ((ItemComponentMF)ComponentListMF.plank_cut).construct(material.name); - ItemStack woodpane = ((ItemComponentMF)ComponentListMF.plank_pane).construct(material.name); - + + private static void addRecipes(CustomMaterial material) { + ItemStack timber = ComponentListMF.plank.construct(material.name); + ItemStack cutPlank = ((ItemComponentMF) ComponentListMF.plank_cut).construct(material.name); + ItemStack woodpane = ((ItemComponentMF) ComponentListMF.plank_pane).construct(material.name); + ItemStack result; int time; - + time = 5; - KnowledgeListMF.sawnPlankR.add( - MineFantasyAPI.addCarpenterRecipe(construction, cutPlank, "", sawing, "saw", material.tier, (int)(material.durability * time) , new Object[] - { - "T", - 'T', timber, - })); - + KnowledgeListMF.sawnPlankR.add(MineFantasyAPI.addCarpenterRecipe(construction, cutPlank, "", sawing, "saw", + material.tier, (int) (material.durability * time), new Object[] { "T", 'T', timber, })); + time = 20; - KnowledgeListMF.plankPaneR.add( - MineFantasyAPI.addCarpenterRecipe(construction, woodpane, "", nailHammer, "hammer", material.tier, (int)(material.durability * time) , new Object[] - { - "NNN", - "CTC", - "CTC", - 'T', timber, - 'C', cutPlank, - 'N', ComponentListMF.nail, - })); - Salvage.addSalvage(woodpane, cutPlank, cutPlank, cutPlank, cutPlank, timber, timber, new ItemStack(ComponentListMF.nail, 3)); - + KnowledgeListMF.plankPaneR.add(MineFantasyAPI.addCarpenterRecipe(construction, woodpane, "", nailHammer, + "hammer", material.tier, (int) (material.durability * time), + new Object[] { "NNN", "CTC", "CTC", 'T', timber, 'C', cutPlank, 'N', ComponentListMF.nail, })); + Salvage.addSalvage(woodpane, cutPlank, cutPlank, cutPlank, cutPlank, timber, timber, + new ItemStack(ComponentListMF.nail, 3)); + time = 10; - result = ((BlockWoodDecor)BlockListMF.rack_wood).construct(material.name); - KnowledgeListMF.rackRecipe.add( - MineFantasyAPI.addCarpenterRecipe(construction, result, "", nailHammer, "hammer", material.tier, (int)(material.durability * time) , new Object[] - { - "N N", - "T T", - "CCC", - "T T", - 'N', ComponentListMF.nail, - 'T', timber, - 'C', cutPlank, - })); - Salvage.addSalvage(result, cutPlank, cutPlank, cutPlank, timber, timber, timber, timber, new ItemStack(ComponentListMF.nail, 2)); - + result = ((BlockWoodDecor) BlockListMF.rack_wood).construct(material.name); + KnowledgeListMF.rackRecipe.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "", nailHammer, "hammer", + material.tier, (int) (material.durability * time), + new Object[] { "N N", "T T", "CCC", "T T", 'N', ComponentListMF.nail, 'T', timber, 'C', cutPlank, })); + Salvage.addSalvage(result, cutPlank, cutPlank, cutPlank, timber, timber, timber, timber, + new ItemStack(ComponentListMF.nail, 2)); + time = 20; - result = ((BlockWoodDecor)BlockListMF.food_box_basic).construct(material.name); - KnowledgeListMF.foodboxR.add( - MineFantasyAPI.addCarpenterRecipe(construction, result, "food_box", nailHammer, "hammer", material.tier, (int)(material.durability * time) , new Object[] - { - "HC ", - "C C", - "NCN", - 'N', ComponentListMF.nail, - 'H', ComponentListMF.hinge, - 'C', cutPlank, - })); - Salvage.addSalvage(result, cutPlank, cutPlank, cutPlank, cutPlank, new ItemStack(ComponentListMF.nail, 2), ComponentListMF.hinge); - + result = ((BlockWoodDecor) BlockListMF.food_box_basic).construct(material.name); + KnowledgeListMF.foodboxR.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "food_box", nailHammer, + "hammer", material.tier, (int) (material.durability * time), new Object[] { "HC ", "C C", "NCN", 'N', + ComponentListMF.nail, 'H', ComponentListMF.hinge, 'C', cutPlank, })); + Salvage.addSalvage(result, cutPlank, cutPlank, cutPlank, cutPlank, new ItemStack(ComponentListMF.nail, 2), + ComponentListMF.hinge); + time = 30; - result = ((BlockWoodDecor)BlockListMF.ammo_box_basic).construct(material.name); - KnowledgeListMF.ammoboxR.add( - MineFantasyAPI.addCarpenterRecipe(construction, result, "ammo_box", nailHammer, "hammer", material.tier, (int)(material.durability * time) , new Object[] - { - "HPH", - "C C", - "NPN", - 'N', ComponentListMF.nail, - 'H', ComponentListMF.hinge, - 'P', woodpane, - 'C', cutPlank, - })); - Salvage.addSalvage(result, cutPlank, cutPlank, woodpane, woodpane, new ItemStack(ComponentListMF.nail, 2), new ItemStack(ComponentListMF.hinge, 2)); - + result = ((BlockWoodDecor) BlockListMF.ammo_box_basic).construct(material.name); + KnowledgeListMF.ammoboxR.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "ammo_box", nailHammer, + "hammer", material.tier, (int) (material.durability * time), new Object[] { "HPH", "C C", "NPN", 'N', + ComponentListMF.nail, 'H', ComponentListMF.hinge, 'P', woodpane, 'C', cutPlank, })); + Salvage.addSalvage(result, cutPlank, cutPlank, woodpane, woodpane, new ItemStack(ComponentListMF.nail, 2), + new ItemStack(ComponentListMF.hinge, 2)); + time = 50; - result = ((BlockWoodDecor)BlockListMF.crate_basic).construct(material.name); - KnowledgeListMF.bigboxR.add( - MineFantasyAPI.addCarpenterRecipe(construction, result, "big_box", nailHammer, "hammer", material.tier, (int)(material.durability * time) , new Object[] - { - "NNNN", - "HPPH", - "P P", - " PP ", - 'N', ComponentListMF.nail, - 'H', ComponentListMF.hinge, - 'P', woodpane, - 'C', cutPlank, - })); - Salvage.addSalvage(result, woodpane, woodpane, woodpane, woodpane, woodpane, woodpane, new ItemStack(ComponentListMF.nail, 4), new ItemStack(ComponentListMF.hinge, 2)); - - + result = ((BlockWoodDecor) BlockListMF.crate_basic).construct(material.name); + KnowledgeListMF.bigboxR.add( + MineFantasyAPI.addCarpenterRecipe(construction, result, "big_box", nailHammer, "hammer", material.tier, + (int) (material.durability * time), new Object[] { "NNNN", "HPPH", "P P", " PP ", 'N', + ComponentListMF.nail, 'H', ComponentListMF.hinge, 'P', woodpane, 'C', cutPlank, })); + Salvage.addSalvage(result, woodpane, woodpane, woodpane, woodpane, woodpane, woodpane, + new ItemStack(ComponentListMF.nail, 4), new ItemStack(ComponentListMF.hinge, 2)); + time = 15; - result = ((BlockWoodDecor)BlockListMF.trough_wood).construct(material.name); - KnowledgeListMF.nailTroughR.add( - MineFantasyAPI.addCarpenterRecipe(construction, result, "", nailHammer, "hammer", material.tier, (int)(material.durability * time) , new Object[] - { - "P P", - "PPP", - "NNN", - 'N', ComponentListMF.nail, - 'P', timber, - })); + result = ((BlockWoodDecor) BlockListMF.trough_wood).construct(material.name); + KnowledgeListMF.nailTroughR.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "", nailHammer, + "hammer", material.tier, (int) (material.durability * time), + new Object[] { "P P", "PPP", "NNN", 'N', ComponentListMF.nail, 'P', timber, })); Salvage.addSalvage(result, timber, timber, timber, timber, timber, new ItemStack(ComponentListMF.nail, 3)); - + } } diff --git a/src/main/java/minefantasy/mf2/recipe/ForgedArmourRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgedArmourRecipes.java index 38164b29..10288241 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgedArmourRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgedArmourRecipes.java @@ -1,31 +1,22 @@ package minefantasy.mf2.recipe; -import java.util.ArrayList; -import java.util.Iterator; - import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.Salvage; -import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.rpg.Skill; import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.item.list.ArmourListMF; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.CustomArmourListMF; import minefantasy.mf2.knowledge.KnowledgeListMF; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -public class ForgedArmourRecipes -{ +public class ForgedArmourRecipes { private static final Skill artisanry = SkillList.artisanry; private static final Skill engineering = SkillList.engineering; private static final Skill construction = SkillList.construction; - public static void init() - { + + public static void init() { addMetalComponents(); assembleChainmail(); assembleScalemail(); @@ -33,377 +24,230 @@ public static void init() assembleFieldplate(); assembleCogPlating(); } - - private static void assembleChainmail() - { + + private static void assembleChainmail() { Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 2, 0); Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 2, 1); Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 2, 2); Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 2, 3); - + Item mail = ComponentListMF.chainmesh; Item rivet = ComponentListMF.rivet; - + int time = 20; KnowledgeListMF.mailHelmetR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_helmet), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "RMR", - "MPM", - "RMR", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(helm, 1, 0) - })); + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_helmet), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMR", "MPM", "RMR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(helm, 1, 0) })); time = 30; KnowledgeListMF.mailChestR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_chest), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "RM MR", - "RMPMR", - "RM MR", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(chest, 1, 0) - })); + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_chest), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RM MR", "RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(chest, 1, 0) })); time = 20; - KnowledgeListMF.mailLegsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_legs), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "RMPMR", - "RM MR", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(legs, 1, 0) - })); + KnowledgeListMF.mailLegsR + .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_legs), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(legs, 1, 0) })); time = 10; KnowledgeListMF.mailBootsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_boots), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "R R", - "MPM", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(boots, 1, 0) - })); - Salvage.addSalvage(CustomArmourListMF.standard_chain_helmet,helm, - mail, mail, mail, mail,//4 Mail - rivet, rivet, rivet, rivet);//4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_chain_chest,chest, - mail, mail, mail, mail, mail, mail,//6 Mail + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_boots), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "R R", "MPM", + + 'R', rivet, 'M', mail, 'P', new ItemStack(boots, 1, 0) })); + Salvage.addSalvage(CustomArmourListMF.standard_chain_helmet, helm, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_chain_chest, chest, mail, mail, mail, mail, mail, mail, // 6 Mail rivet, rivet, rivet, rivet, rivet, rivet);// 6 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_chain_legs,legs, - mail, mail, mail, mail,//4 Mail - rivet, rivet, rivet, rivet);//4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_chain_boots,boots, - mail, mail,//2 Mail - rivet, rivet);//2 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_chain_legs, legs, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_chain_boots, boots, mail, mail, // 2 Mail + rivet, rivet);// 2 Rivet } - - private static void assembleScalemail() - { + + private static void assembleScalemail() { Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 2, 0); Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 2, 1); Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 2, 2); Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 2, 3); - + ItemStack mail = new ItemStack(ComponentListMF.scalemesh); Item rivet = ComponentListMF.rivet; - + int time = 20; KnowledgeListMF.scaleHelmetR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_helmet), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "RMR", - "MPM", - "RMR", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(helm, 1, 0) - })); + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_helmet), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMR", "MPM", "RMR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(helm, 1, 0) })); time = 30; KnowledgeListMF.scaleChestR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_chest), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "RM MR", - "RMPMR", - "RM MR", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(chest, 1, 0) - })); + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_chest), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RM MR", "RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(chest, 1, 0) })); time = 20; - KnowledgeListMF.scaleLegsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_legs), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "RMPMR", - "RM MR", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(legs, 1, 0) - })); + KnowledgeListMF.scaleLegsR + .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_legs), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(legs, 1, 0) })); time = 10; KnowledgeListMF.scaleBootsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_boots), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "R R", - "MPM", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(boots, 1, 0) - })); - Salvage.addSalvage(CustomArmourListMF.standard_scale_helmet,helm, - mail, mail, mail, mail,//4 Mail - rivet, rivet, rivet, rivet);//4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_scale_chest,chest, - mail, mail, mail, mail, mail, mail,//6 Mail + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_boots), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "R R", "MPM", + + 'R', rivet, 'M', mail, 'P', new ItemStack(boots, 1, 0) })); + Salvage.addSalvage(CustomArmourListMF.standard_scale_helmet, helm, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_scale_chest, chest, mail, mail, mail, mail, mail, mail, // 6 Mail rivet, rivet, rivet, rivet, rivet, rivet);// 6 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_scale_legs,legs, - mail, mail, mail, mail,//4 Mail - rivet, rivet, rivet, rivet);//4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_scale_boots,boots, - mail, mail,//2 Mail - rivet, rivet);//2 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_scale_legs, legs, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_scale_boots, boots, mail, mail, // 2 Mail + rivet, rivet);// 2 Rivet } - - private static void assembleSplintmail() - { + + private static void assembleSplintmail() { Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 4, 0); Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 4, 1); Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 4, 2); Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 4, 3); - + ItemStack mail = new ItemStack(ComponentListMF.splintmesh); Item rivet = ComponentListMF.rivet; - + int time = 20; KnowledgeListMF.splintHelmetR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_helmet), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "RMR", - "MPM", - "RMR", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(helm, 1, 0) - })); + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_helmet), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMR", "MPM", "RMR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(helm, 1, 0) })); time = 30; KnowledgeListMF.splintChestR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_chest), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "RM MR", - "RMPMR", - "RM MR", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(chest, 1, 0) - })); + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_chest), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RM MR", "RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(chest, 1, 0) })); time = 20; KnowledgeListMF.splintLegsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_legs), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "RMPMR", - "RM MR", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(legs, 1, 0) - })); + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_legs), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(legs, 1, 0) })); time = 10; KnowledgeListMF.splintBootsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_boots), "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] - { - "R R", - "MPM", - - 'R', rivet, - 'M', mail, - 'P', new ItemStack(boots, 1, 0) - })); - Salvage.addSalvage(CustomArmourListMF.standard_splint_helmet,helm, - mail, mail, mail, mail,//4 Mail - rivet, rivet, rivet, rivet);//4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_splint_chest,chest, - mail, mail, mail, mail, mail, mail,//6 Mail + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_boots), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "R R", "MPM", + + 'R', rivet, 'M', mail, 'P', new ItemStack(boots, 1, 0) })); + Salvage.addSalvage(CustomArmourListMF.standard_splint_helmet, helm, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_splint_chest, chest, mail, mail, mail, mail, mail, mail, // 6 + // Mail rivet, rivet, rivet, rivet, rivet, rivet);// 6 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_splint_legs,legs, - mail, mail, mail, mail,//4 Mail - rivet, rivet, rivet, rivet);//4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_splint_boots,boots, - mail, mail,//2 Mail - rivet, rivet);//2 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_splint_legs, legs, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_splint_boots, boots, mail, mail, // 2 Mail + rivet, rivet);// 2 Rivet } - - private static void assembleFieldplate() - { + + private static void assembleFieldplate() { Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 4, 0); Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 4, 1); Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 4, 2); Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 4, 3); - + ItemStack plate = new ItemStack(ComponentListMF.plate); Item rivet = ComponentListMF.rivet; - + int time = 40; KnowledgeListMF.plateHelmetR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_helmet), "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] - { - " R ", - "PHP", - " R ", - - 'R', rivet, - 'P', plate, - 'H', new ItemStack(helm, 1, 0), - })); + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_helmet), + "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] { " R ", "PHP", " R ", + + 'R', rivet, 'P', plate, 'H', new ItemStack(helm, 1, 0), })); time = 60; KnowledgeListMF.plateChestR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_chest), "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] - { - "RP PR", - "RPCPR", - - 'R', rivet, - 'P', plate, - 'C', new ItemStack(chest, 1, 0), - })); + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_chest), + "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] { "RP PR", "RPCPR", + + 'R', rivet, 'P', plate, 'C', new ItemStack(chest, 1, 0), })); time = 40; - KnowledgeListMF.plateLegsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_legs), "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] - { - "RPLPR", - "RP PR", - - 'R', rivet, - 'P', plate, - 'L', new ItemStack(legs, 1, 0), - })); + KnowledgeListMF.plateLegsR + .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_legs), + "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] { "RPLPR", "RP PR", + + 'R', rivet, 'P', plate, 'L', new ItemStack(legs, 1, 0), })); time = 20; KnowledgeListMF.plateBootsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_boots), "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] - { - "R R", - "PBP", - - 'R', rivet, - 'P', plate, - 'B', new ItemStack(boots, 1, 0), - })); - - - Salvage.addSalvage(CustomArmourListMF.standard_plate_helmet,helm, - plate, plate,//2 Plate + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_boots), + "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] { "R R", "PBP", + + 'R', rivet, 'P', plate, 'B', new ItemStack(boots, 1, 0), })); + + Salvage.addSalvage(CustomArmourListMF.standard_plate_helmet, helm, plate, plate, // 2 Plate rivet, rivet);// Rivet - Salvage.addSalvage(CustomArmourListMF.standard_plate_chest,chest, - plate, plate, plate, plate,//4 Plate + Salvage.addSalvage(CustomArmourListMF.standard_plate_chest, chest, plate, plate, plate, plate, // 4 Plate + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_plate_legs, legs, plate, plate, plate, plate, // 4 Plate rivet, rivet, rivet, rivet);// 4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_plate_legs,legs, - plate, plate, plate, plate,//4 Plate - rivet, rivet, rivet, rivet);//4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_plate_boots ,boots, - plate, plate,//2 Plate - rivet, rivet);//2 Rivet - + Salvage.addSalvage(CustomArmourListMF.standard_plate_boots, boots, plate, plate, // 2 Plate + rivet, rivet);// 2 Rivet + } - - - private static void assembleCogPlating() - { - + + private static void assembleCogPlating() { + ItemStack minorPiece = new ItemStack(ComponentListMF.plate); ItemStack majorPiece = new ItemStack(ComponentListMF.plate_huge); - + int time = 4; - KnowledgeListMF.hugePlateR.add( - MineFantasyAPI.addAnvilToolRecipe(engineering, majorPiece, "cogArmour", true, "hvyhammer", -1, -1, time, new Object[] - { - " RR ", - "RIIR", - 'R', ComponentListMF.rivet, - 'I', minorPiece - })); - - Salvage.addSalvage(majorPiece, - minorPiece, minorPiece, - new ItemStack(ComponentListMF.rivet, 4) - ); - - + KnowledgeListMF.hugePlateR + .add(MineFantasyAPI.addAnvilToolRecipe(engineering, majorPiece, "cogArmour", true, "hvyhammer", -1, -1, + time, new Object[] { " RR ", "RIIR", 'R', ComponentListMF.rivet, 'I', minorPiece })); + + Salvage.addSalvage(majorPiece, minorPiece, minorPiece, new ItemStack(ComponentListMF.rivet, 4)); + time = 25; - KnowledgeListMF.cogPlateR.add( - MineFantasyAPI.addAnvilToolRecipe(engineering, new ItemStack(ComponentListMF.cogwork_armour), "cogArmour", true, "hvyhammer", -1, -1, time, new Object[] - { - " P ", - "pPPPp", - "p P p", - " pPp ", - - 'p', minorPiece, - 'P', majorPiece, - })); - - Salvage.addSalvage(ComponentListMF.cogwork_armour, - minorPiece, minorPiece, minorPiece, minorPiece, minorPiece, minorPiece, - majorPiece, majorPiece, majorPiece, majorPiece, majorPiece, majorPiece - ); + KnowledgeListMF.cogPlateR + .add(MineFantasyAPI.addAnvilToolRecipe(engineering, new ItemStack(ComponentListMF.cogwork_armour), + "cogArmour", true, "hvyhammer", -1, -1, time, new Object[] { " P ", "pPPPp", "p P p", " pPp ", + + 'p', minorPiece, 'P', majorPiece, })); + + Salvage.addSalvage(ComponentListMF.cogwork_armour, minorPiece, minorPiece, minorPiece, minorPiece, minorPiece, + minorPiece, majorPiece, majorPiece, majorPiece, majorPiece, majorPiece, majorPiece); } - - private static void addMetalComponents() - { + + private static void addMetalComponents() { Item hunk = ComponentListMF.metalHunk; Item bar = ComponentListMF.bar; - + int time = 3; - KnowledgeListMF.mailRecipes.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.chainmesh), "", true, "hammer", -1, -1, time, new Object[] - { - " H ", - "H H", - " H ", - - 'H', hunk - })); + KnowledgeListMF.mailRecipes + .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.chainmesh), "", true, + "hammer", -1, -1, time, new Object[] { " H ", "H H", " H ", + + 'H', hunk })); time = 3; - KnowledgeListMF.scaleRecipes.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.scalemesh), "", true, "hammer", -1, -1, time, new Object[] - { - "HHH", - " H ", - - 'H', hunk - })); + KnowledgeListMF.scaleRecipes.add(MineFantasyAPI.addAnvilToolRecipe(artisanry, + new ItemStack(ComponentListMF.scalemesh), "", true, "hammer", -1, -1, time, new Object[] { "HHH", " H ", + + 'H', hunk })); time = 4; - KnowledgeListMF.splintRecipes.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.splintmesh), "", true, "hammer", -1, -1, time, new Object[] - { - "RHR", - " H ", - " H ", - " H ", - - 'H', hunk, - 'R', ComponentListMF.rivet, - })); + KnowledgeListMF.splintRecipes + .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.splintmesh), "", true, + "hammer", -1, -1, time, new Object[] { "RHR", " H ", " H ", " H ", + + 'H', hunk, 'R', ComponentListMF.rivet, })); time = 4; - KnowledgeListMF.plateRecipes.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, ComponentListMF.plate, "", true, "hvyhammer", -1, -1, time, new Object[] - { - "FF", - "II", - 'F', ComponentListMF.flux, - 'I', bar - })); - + KnowledgeListMF.plateRecipes.add(MineFantasyAPI.addAnvilToolRecipe(artisanry, ComponentListMF.plate, "", true, + "hvyhammer", -1, -1, time, new Object[] { "FF", "II", 'F', ComponentListMF.flux, 'I', bar })); + Salvage.addSalvage(ComponentListMF.chainmesh, hunk); Salvage.addSalvage(ComponentListMF.scalemesh, hunk); Salvage.addSalvage(ComponentListMF.splintmesh, hunk, ComponentListMF.rivet, ComponentListMF.rivet); diff --git a/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java index b27c8a65..a64a1d6f 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java @@ -3,9 +3,7 @@ import java.util.ArrayList; import java.util.Iterator; -import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.api.MineFantasyAPI; -import minefantasy.mf2.api.crafting.BasicTierRecipe; import minefantasy.mf2.api.crafting.Salvage; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.rpg.Skill; @@ -20,775 +18,374 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class ForgedToolRecipes -{ +public class ForgedToolRecipes { private static final Skill artisanry = SkillList.artisanry; private static final Skill engineering = SkillList.engineering; private static final Skill construction = SkillList.construction; - public static void init() - { + + public static void init() { CarpenterRecipes.initTierWood(); addStandardTools(); addStandardCrafters(); addStandardWeapons(); addComponentTools(); addMetalComponents(); - + ArrayList metal = CustomMaterial.getList("metal"); ArrayList wood = CustomMaterial.getList("wood"); - + Iterator iteratorMetal = metal.iterator(); - - while(iteratorMetal.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - ItemStack bar = ComponentListMF.bar.createComm(customMat.name); - for(ItemStack ingot: OreDictionary.getOres("ingot"+customMat.name)) - { - KnowledgeListMF.barR.add( - MineFantasyAPI.addAnvilRecipe(artisanry, bar, "", true, "hammer", -1, -1, (int)(customMat.craftTimeModifier/2F), new Object[] - { - "I", - 'I', ingot, - })); - } - - ItemStack defaultIngot = customMat.getItem(); - if(defaultIngot != null) - { - KnowledgeListMF.baringotR.add( - MineFantasyAPI.addAnvilRecipe(artisanry, defaultIngot, "", true, "hammer", -1, -1, (int)(customMat.craftTimeModifier/2F), new Object[] - { - "I", - 'I', bar, - })); - } - } - - KnowledgeListMF.tinderboxR = - MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ToolListMF.tinderbox), "", true, "hammer", 0, 0, 10, new Object[]{ - " F ", - "SWS", - " I ", - 'F', Items.flint, - 'S', Items.stick, - 'W', Blocks.wool, - 'I', ComponentListMF.bar("Iron"), - }); - KnowledgeListMF.flintAndSteelR = - MineFantasyAPI.addAnvilRecipe(null, new ItemStack(Items.flint_and_steel), "", true, "hammer", 0, 0, 10, new Object[]{ - " F", - "IC ", - " I ", - 'F', Items.flint, - 'C', Items.coal, - 'I', ComponentListMF.bar("Steel"), - }); + + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + ItemStack bar = ComponentListMF.bar.createComm(customMat.name); + for (ItemStack ingot : OreDictionary.getOres("ingot" + customMat.name)) { + KnowledgeListMF.barR.add(MineFantasyAPI.addAnvilRecipe(artisanry, bar, "", true, "hammer", -1, -1, + (int) (customMat.craftTimeModifier / 2F), new Object[] { "I", 'I', ingot, })); + } + + ItemStack defaultIngot = customMat.getItem(); + if (defaultIngot != null) { + KnowledgeListMF.baringotR.add(MineFantasyAPI.addAnvilRecipe(artisanry, defaultIngot, "", true, "hammer", + -1, -1, (int) (customMat.craftTimeModifier / 2F), new Object[] { "I", 'I', bar, })); + } + } + + KnowledgeListMF.tinderboxR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ToolListMF.tinderbox), "", true, + "hammer", 0, 0, 10, new Object[] { " F ", "SWS", " I ", 'F', Items.flint, 'S', Items.stick, 'W', + Blocks.wool, 'I', ComponentListMF.bar("Iron"), }); + KnowledgeListMF.flintAndSteelR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(Items.flint_and_steel), "", + true, "hammer", 0, 0, 10, new Object[] { " F", "IC ", " I ", 'F', Items.flint, 'C', Items.coal, 'I', + ComponentListMF.bar("Steel"), }); Salvage.addSalvage(ToolListMF.tinderbox, Items.flint, Items.stick, Blocks.wool, ComponentListMF.bar("Iron")); Salvage.addSalvage(Items.flint_and_steel, Items.flint, ComponentListMF.bar("Steel")); } - - private static void addMetalComponents() - { + + private static void addMetalComponents() { int time = 2; Item bar = ComponentListMF.bar; Item hunk = ComponentListMF.metalHunk; - - KnowledgeListMF.hunkR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(hunk, 4), "", true, "hammer", 0, 0, time, new Object[] - { - "F", - "I", - 'F', ComponentListMF.flux, - 'I', bar, - }); - - KnowledgeListMF.ingotR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, bar, "", true, "hammer", 0, 0, time, new Object[] - { - "II", - "II", - 'I', hunk - }); - + + KnowledgeListMF.hunkR = MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(hunk, 4), "", true, "hammer", + 0, 0, time, new Object[] { "F", "I", 'F', ComponentListMF.flux, 'I', bar, }); + + KnowledgeListMF.ingotR = MineFantasyAPI.addAnvilToolRecipe(artisanry, bar, "", true, "hammer", 0, 0, time, + new Object[] { "II", "II", 'I', hunk }); + time = 8; int count = 1; - KnowledgeListMF.bucketR = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(Items.bucket, count), "", true, "hammer", 0, 0, time, new Object[] - { - "I I", - " I ", - 'I', bar, - }); + KnowledgeListMF.bucketR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(Items.bucket, count), "", true, + "hammer", 0, 0, time, new Object[] { "I I", " I ", 'I', bar, }); } - private static void addComponentTools() - { + private static void addComponentTools() { Item bar = ComponentListMF.bar; Item plank = ComponentListMF.plank; Item strip = ComponentListMF.leather_strip; Item rivet = ComponentListMF.rivet; Item hunk = ComponentListMF.metalHunk; - + int time = 10; - - KnowledgeListMF.nailR = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.nail, 16), "", true, "hammer", -1, -1, time, new Object[] - { - "HH", - " H", - " H", - - 'H', hunk - }); - KnowledgeListMF.rivetR = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.rivet, 8), "", true, "hammer", -1, -1, time, new Object[] - { - "H H", - " H ", - " H ", - - 'H', hunk - }); - - KnowledgeListMF.needleR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_needle, "tier", true, "hammer", -1, -1, time, new Object[] - { - "H", - "H", - "H", - "H", - - 'H', hunk - }); + + KnowledgeListMF.nailR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.nail, 16), "", + true, "hammer", -1, -1, time, new Object[] { "HH", " H", " H", + + 'H', hunk }); + KnowledgeListMF.rivetR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.rivet, 8), "", + true, "hammer", -1, -1, time, new Object[] { "H H", " H ", " H ", + + 'H', hunk }); + + KnowledgeListMF.needleR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_needle, "tier", + true, "hammer", -1, -1, time, new Object[] { "H", "H", "H", "H", + + 'H', hunk }); Salvage.addSalvage(CustomToolListMF.standard_needle, bar); - + time = 3; - KnowledgeListMF.crossBoltR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_bolt, "tier", true, "hammer", -1, -1, time, new Object[] - { - "H", - "F", - - 'F', ComponentListMF.fletching, - 'H', hunk - }); + KnowledgeListMF.crossBoltR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_bolt, + "tier", true, "hammer", -1, -1, time, new Object[] { "H", "F", + + 'F', ComponentListMF.fletching, 'H', hunk }); time = 2; - KnowledgeListMF.arrowheadR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.arrowhead, 4), "tier", true, "hammer", -1, -1, time, new Object[] - { - "H ", - "HH", - "H ", - - 'H', hunk - }); + KnowledgeListMF.arrowheadR = MineFantasyAPI.addAnvilToolRecipe(artisanry, + new ItemStack(ComponentListMF.arrowhead, 4), "tier", true, "hammer", -1, -1, time, + new Object[] { "H ", "HH", "H ", + + 'H', hunk }); time = 5; - KnowledgeListMF.bodkinheadR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.bodkinhead, 4), "tier", true, "hammer", -1, -1, time, new Object[] - { - "H ", - " HH", - "H ", - - 'H', hunk - }); + KnowledgeListMF.bodkinheadR = MineFantasyAPI.addAnvilToolRecipe(artisanry, + new ItemStack(ComponentListMF.bodkinhead, 4), "tier", true, "hammer", -1, -1, time, + new Object[] { "H ", " HH", "H ", + + 'H', hunk }); time = 5; - KnowledgeListMF.broadheadR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.broadhead, 4), "tier", true, "hammer", -1, -1, time, new Object[] - { - "H ", - " H", - " H", - "H ", - - 'H', hunk - }); + KnowledgeListMF.broadheadR = MineFantasyAPI.addAnvilToolRecipe(artisanry, + new ItemStack(ComponentListMF.broadhead, 4), "tier", true, "hammer", -1, -1, time, + new Object[] { "H ", " H", " H", "H ", + + 'H', hunk }); Salvage.addSalvage(CustomToolListMF.standard_bolt, ComponentListMF.fletching, hunk); Salvage.addSalvage(ComponentListMF.arrowhead, hunk); Salvage.addSalvage(ComponentListMF.bodkinhead, hunk); Salvage.addSalvage(ComponentListMF.broadhead, hunk); - - + time = 1; - KnowledgeListMF.arrowR.add( - MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_arrow, "arrows", "dig.wood", 1, new Object[] - { - "H", - "F", - - 'F', ComponentListMF.fletching, - 'H', ComponentListMF.arrowhead - })); - KnowledgeListMF.arrowR.add( - MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_arrow_bodkin, "arrowsBodkin", "dig.wood", 1, new Object[] - { - "H", - "F", - - 'F', ComponentListMF.fletching, - 'H', ComponentListMF.bodkinhead - })); - KnowledgeListMF.arrowR.add( - MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_arrow_broad, "arrowsBroad", "dig.wood", 1, new Object[] - { - "H", - "F", - - 'F', ComponentListMF.fletching, - 'H', ComponentListMF.broadhead - })); + KnowledgeListMF.arrowR.add(MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_arrow, + "arrows", "dig.wood", 1, new Object[] { "H", "F", + + 'F', ComponentListMF.fletching, 'H', ComponentListMF.arrowhead })); + KnowledgeListMF.arrowR.add(MineFantasyAPI.addCarpenterToolRecipe(artisanry, + CustomToolListMF.standard_arrow_bodkin, "arrowsBodkin", "dig.wood", 1, new Object[] { "H", "F", + + 'F', ComponentListMF.fletching, 'H', ComponentListMF.bodkinhead })); + KnowledgeListMF.arrowR.add(MineFantasyAPI.addCarpenterToolRecipe(artisanry, + CustomToolListMF.standard_arrow_broad, "arrowsBroad", "dig.wood", 1, new Object[] { "H", "F", + + 'F', ComponentListMF.fletching, 'H', ComponentListMF.broadhead })); Salvage.addSalvage(CustomToolListMF.standard_arrow, ComponentListMF.arrowhead, ComponentListMF.fletching); - Salvage.addSalvage(CustomToolListMF.standard_arrow_bodkin, ComponentListMF.bodkinhead, ComponentListMF.fletching); + Salvage.addSalvage(CustomToolListMF.standard_arrow_bodkin, ComponentListMF.bodkinhead, + ComponentListMF.fletching); Salvage.addSalvage(CustomToolListMF.standard_arrow_broad, ComponentListMF.broadhead, ComponentListMF.fletching); - + } - private static void addStandardTools() - { + private static void addStandardTools() { Item bar = ComponentListMF.bar; Item plank = ComponentListMF.plank; Item strip = ComponentListMF.leather_strip; Item rivet = ComponentListMF.rivet; - + int time = 15; - KnowledgeListMF.pickR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_pick, "tier", true, "hammer", -1, -1, time, new Object[] - { - "L I", - "PPI", - "L I", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_pick, - bar, bar, bar, - plank, plank, - strip, strip); - + KnowledgeListMF.pickR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_pick, "tier", + true, "hammer", -1, -1, time, new Object[] { "L I", "PPI", "L I", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_pick, bar, bar, bar, plank, plank, strip, strip); + time = 15; - KnowledgeListMF.axeR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_axe, "tier", true, "hammer", -1, -1, time, new Object[] - { - "LII", - "PPI", - "L ", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_axe, - bar, bar, bar, - plank, plank, - strip, strip); - + KnowledgeListMF.axeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_axe, "tier", true, + "hammer", -1, -1, time, new Object[] { "LII", "PPI", "L ", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_axe, bar, bar, bar, plank, plank, strip, strip); + time = 12; - KnowledgeListMF.hoeR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hoe, "tier", true, "hammer", -1, -1, time, new Object[] - { - "L I", - "PPI", - "L ", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_hoe, - bar, bar, - plank, plank, - strip, strip); - + KnowledgeListMF.hoeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hoe, "tier", true, + "hammer", -1, -1, time, new Object[] { "L I", "PPI", "L ", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_hoe, bar, bar, plank, plank, strip, strip); + time = 10; - KnowledgeListMF.spadeR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spade, "tier", true, "hammer", -1, -1, time, new Object[] - { - "L ", - "PPI", - "L ", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_spade, - bar, - plank, plank, - strip, strip); - - //ADVANCED + KnowledgeListMF.spadeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spade, "tier", + true, "hammer", -1, -1, time, new Object[] { "L ", "PPI", "L ", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_spade, bar, plank, plank, strip, strip); + + // ADVANCED time = 25; - KnowledgeListMF.hvyPickR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvypick, "tier", true, "hvyhammer", -1, -1, time, new Object[] - { - "LR I", - "PPII", - "LRII", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_hvypick, - bar, bar, bar, bar, bar, - plank, plank, - strip, strip, + KnowledgeListMF.hvyPickR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvypick, + "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LR I", "PPII", "LRII", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_hvypick, bar, bar, bar, bar, bar, plank, plank, strip, strip, rivet, rivet); - + time = 15; - KnowledgeListMF.handpickR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_handpick, "tier", true, "hammer", -1, -1, time, new Object[] - { - "LI ", - "PIR", - "L ", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_handpick, - bar, bar, - plank, - strip, strip, - rivet); - + KnowledgeListMF.handpickR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_handpick, + "tier", true, "hammer", -1, -1, time, new Object[] { "LI ", "PIR", "L ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_handpick, bar, bar, plank, strip, strip, rivet); + time = 25; - KnowledgeListMF.hvyShovelR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvyshovel, "tier", true, "hvyhammer", -1, -1, time, new Object[] - { - "LRII", - "PPII", - "LRII", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_hvyshovel, - bar, bar, bar, bar, bar, bar, - plank, plank, - strip, strip, - rivet, rivet); - + KnowledgeListMF.hvyShovelR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvyshovel, + "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LRII", "PPII", "LRII", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_hvyshovel, bar, bar, bar, bar, bar, bar, plank, plank, strip, + strip, rivet, rivet); + time = 15; - KnowledgeListMF.trowR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_trow, "tier", true, "hammer", -1, -1, time, new Object[] - { - "L ", - "PIR", - "L ", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_trow, - bar, - plank, - strip, strip, - rivet); - + KnowledgeListMF.trowR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_trow, "tier", + true, "hammer", -1, -1, time, new Object[] { "L ", "PIR", "L ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_trow, bar, plank, strip, strip, rivet); + time = 30; - KnowledgeListMF.scytheR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_scythe, "tier", true, "hvyhammer", -1, -1, time, new Object[] - { - " I ", - "L PIR", - "PPPIR", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_scythe, - bar, bar, bar, - plank, plank, plank, plank, - strip, - rivet, rivet); - + KnowledgeListMF.scytheR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_scythe, "tier", + true, "hvyhammer", -1, -1, time, new Object[] { " I ", "L PIR", "PPPIR", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_scythe, bar, bar, bar, plank, plank, plank, plank, strip, rivet, + rivet); + time = 14; - KnowledgeListMF.mattockR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_mattock, "tier", true, "hammer", -1, -1, time, new Object[] - { - "L I", - "PPI", - "LIR", - - 'I', bar, - 'P', plank, - 'L', strip, - 'R', rivet - }); - Salvage.addSalvage(CustomToolListMF.standard_mattock, - bar, bar, bar, rivet, - plank, plank, - strip, strip); - + KnowledgeListMF.mattockR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_mattock, + "tier", true, "hammer", -1, -1, time, new Object[] { "L I", "PPI", "LIR", + + 'I', bar, 'P', plank, 'L', strip, 'R', rivet }); + Salvage.addSalvage(CustomToolListMF.standard_mattock, bar, bar, bar, rivet, plank, plank, strip, strip); + time = 15; - KnowledgeListMF.lumberR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_lumber, "tier", true, "hvyHammer", -1, -1, time, new Object[] - { - "L IIR", - "PPPIR", - "L R", - - 'I', bar, - 'P', plank, - 'L', strip, - 'R', rivet - }); - Salvage.addSalvage(CustomToolListMF.standard_lumber, - bar, bar, bar, rivet, rivet, rivet, - plank, plank, plank, + KnowledgeListMF.lumberR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_lumber, "tier", + true, "hvyHammer", -1, -1, time, new Object[] { "L IIR", "PPPIR", "L R", + + 'I', bar, 'P', plank, 'L', strip, 'R', rivet }); + Salvage.addSalvage(CustomToolListMF.standard_lumber, bar, bar, bar, rivet, rivet, rivet, plank, plank, plank, strip, strip); } - - - private static void addStandardCrafters() - { + + private static void addStandardCrafters() { Item bar = ComponentListMF.bar; Item plank = ComponentListMF.plank; Item strip = ComponentListMF.leather_strip; Item rivet = ComponentListMF.rivet; - + int time = 10; - KnowledgeListMF.hammerR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hammer, "tier", true, "hammer", 0, 0, time, new Object[] - { - "I", - "L", - "P", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_hammer, - bar, - plank, - strip); - + KnowledgeListMF.hammerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hammer, "tier", + true, "hammer", 0, 0, time, new Object[] { "I", "L", "P", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_hammer, bar, plank, strip); + time = 15; - KnowledgeListMF.hvyHammerR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvyhammer, "tier", true, "hammer", -1, -1, time, new Object[] - { - " II", - "RLI", - " P ", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_hvyhammer, - bar, bar, bar, - plank, - strip, - rivet); - + KnowledgeListMF.hvyHammerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvyhammer, + "tier", true, "hammer", -1, -1, time, new Object[] { " II", "RLI", " P ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_hvyhammer, bar, bar, bar, plank, strip, rivet); + time = 10; - KnowledgeListMF.tongsR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_tongs, "tier", true, "hammer", -1, -1, time, new Object[] - { - "I ", - " I", - - 'I', bar, - }); - Salvage.addSalvage(CustomToolListMF.standard_tongs, - bar, bar); - + KnowledgeListMF.tongsR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_tongs, "tier", + true, "hammer", -1, -1, time, new Object[] { "I ", " I", + + 'I', bar, }); + Salvage.addSalvage(CustomToolListMF.standard_tongs, bar, bar); + time = 10; - KnowledgeListMF.knifeR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_knife, "tier", true, "hammer", -1, -1, time, new Object[] - { - "I ", - "PL", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_knife, - bar, bar, - plank, - strip); - + KnowledgeListMF.knifeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_knife, "tier", + true, "hammer", -1, -1, time, new Object[] { "I ", "PL", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_knife, bar, bar, plank, strip); + time = 12; - KnowledgeListMF.shearsR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_shears, "tier", true, "hammer", -1, -1, time, new Object[] - { - " I ", - "PLI", - " P ", - - 'I', bar, - 'P', plank, - 'L', Items.leather, - }); - Salvage.addSalvage(CustomToolListMF.standard_shears, - bar, bar, - plank, plank, - Items.leather); - + KnowledgeListMF.shearsR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_shears, "tier", + true, "hammer", -1, -1, time, new Object[] { " I ", "PLI", " P ", + + 'I', bar, 'P', plank, 'L', Items.leather, }); + Salvage.addSalvage(CustomToolListMF.standard_shears, bar, bar, plank, plank, Items.leather); + time = 20; - KnowledgeListMF.sawsR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_saw, "tier", true, "hammer", -1, -1, time, new Object[] - { - "PIII", - "LI ", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_saw, - bar, bar, bar, bar, - plank, - strip); - + KnowledgeListMF.sawsR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_saw, "tier", + true, "hammer", -1, -1, time, new Object[] { "PIII", "LI ", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_saw, bar, bar, bar, bar, plank, strip); + time = 15; - KnowledgeListMF.spannerR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spanner, "tier", true, "hammer", -1, -1, time, new Object[] - { - " I ", - " II", - "LP ", - " L ", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_spanner, - bar, bar, bar, - plank, - strip, strip); + KnowledgeListMF.spannerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spanner, + "tier", true, "hammer", -1, -1, time, new Object[] { " I ", " II", "LP ", " L ", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_spanner, bar, bar, bar, plank, strip, strip); } - private static void addStandardWeapons() - { + + private static void addStandardWeapons() { Item bar = ComponentListMF.bar; Item plank = ComponentListMF.plank; Item strip = ComponentListMF.leather_strip; Item rivet = ComponentListMF.rivet; - + int time = 15; - KnowledgeListMF.daggerR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_dagger, "tier", true, "hammer", -1, -1, time, new Object[] - { - "L ", - "PII", - "L ", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_dagger, - bar, bar, - plank, - strip, strip); - + KnowledgeListMF.daggerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_dagger, "tier", + true, "hammer", -1, -1, time, new Object[] { "L ", "PII", "L ", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_dagger, bar, bar, plank, strip, strip); + time = 25; - KnowledgeListMF.swordR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_sword, "tier", true, "hammer", -1, -1, time, new Object[] - { - "LI ", - "PIII", - "LI ", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_sword, - bar, bar, bar, bar, bar, - plank, - strip, strip); - + KnowledgeListMF.swordR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_sword, "tier", + true, "hammer", -1, -1, time, new Object[] { "LI ", "PIII", "LI ", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_sword, bar, bar, bar, bar, bar, plank, strip, strip); + time = 20; - KnowledgeListMF.waraxeR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_waraxe, "tier", true, "hammer", -1, -1, time, new Object[] - { - "LII", - "PPI", - "L I", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_waraxe, - bar, bar, bar, bar, - plank, plank, - strip, strip); - - KnowledgeListMF.maceR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_mace, "tier", true, "hammer", -1, -1, time, new Object[] - { - "L II", - "PPII", - "L ", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_mace, - bar, bar, bar, bar, - plank, plank, + KnowledgeListMF.waraxeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_waraxe, "tier", + true, "hammer", -1, -1, time, new Object[] { "LII", "PPI", "L I", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_waraxe, bar, bar, bar, bar, plank, plank, strip, strip); + + KnowledgeListMF.maceR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_mace, "tier", + true, "hammer", -1, -1, time, new Object[] { "L II", "PPII", "L ", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_mace, bar, bar, bar, bar, plank, plank, strip, strip); + + KnowledgeListMF.spearR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spear, "tier", + true, "hammer", -1, -1, time, new Object[] { " LLI ", "PPPPI", " LLI ", + + 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_spear, bar, bar, bar, plank, plank, plank, plank, strip, strip, strip, strip); - - KnowledgeListMF.spearR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spear, "tier", true, "hammer", -1, -1, time, new Object[] - { - " LLI ", - "PPPPI", - " LLI ", - - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_spear, - bar, bar, bar, - plank, plank, plank, plank, - strip, strip, strip, strip); - - //HEAVY + + // HEAVY time = 30; - KnowledgeListMF.katanaR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_katana, "tier", true, "hvyhammer", -1, -1, time, new Object[] - { - "LR I", - "PIIII ", - "LI ", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_katana, - bar, bar, bar, bar, bar, bar, - plank, - strip, strip, - rivet); - + KnowledgeListMF.katanaR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_katana, "tier", + true, "hvyhammer", -1, -1, time, new Object[] { "LR I", "PIIII ", "LI ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_katana, bar, bar, bar, bar, bar, bar, plank, strip, strip, rivet); + time = 40; - KnowledgeListMF.gswordR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_greatsword, "tier", true, "hvyhammer", -1, -1, time, new Object[] - { - "LIR ", - "PIIIII", - "LIR ", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_greatsword, - bar, bar, bar, bar, bar, bar, bar, - plank, - strip, strip, + KnowledgeListMF.gswordR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_greatsword, + "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LIR ", "PIIIII", "LIR ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_greatsword, bar, bar, bar, bar, bar, bar, bar, plank, strip, strip, rivet, rivet); - + time = 30; - KnowledgeListMF.battleaxeR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_battleaxe, "tier", true, "hvyhammer", -1, -1, time, new Object[] - { - "LLIIR", - "PPPIR", - "LLIIR", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_battleaxe, - bar, bar, bar, bar, bar, - plank, plank, plank, - strip, strip, strip, strip, - rivet, rivet, rivet); - - KnowledgeListMF.whammerR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_warhammer, "tier", true, "hvyhammer", -1, -1, time, new Object[] - { - "LL IIR", - "PPPIIR", - "LL IR", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_warhammer, - bar, bar, bar, bar, bar, - plank, plank, plank, - strip, strip, strip, strip, - rivet, rivet, rivet); - - KnowledgeListMF.halbeardR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_halbeard, "tier", true, "hvyhammer", -1, -1, time, new Object[] - { - "LLRII", - "PPPPI", - "LLRI ", - - 'R', rivet, - 'I', bar, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_halbeard, - bar, bar, bar, bar, - plank, plank, plank, plank, - strip, strip, strip, strip, - rivet, rivet); - + KnowledgeListMF.battleaxeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_battleaxe, + "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LLIIR", "PPPIR", "LLIIR", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_battleaxe, bar, bar, bar, bar, bar, plank, plank, plank, strip, + strip, strip, strip, rivet, rivet, rivet); + + KnowledgeListMF.whammerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_warhammer, + "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LL IIR", "PPPIIR", "LL IR", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_warhammer, bar, bar, bar, bar, bar, plank, plank, plank, strip, + strip, strip, strip, rivet, rivet, rivet); + + KnowledgeListMF.halbeardR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_halbeard, + "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LLRII", "PPPPI", "LLRI ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_halbeard, bar, bar, bar, bar, plank, plank, plank, plank, strip, + strip, strip, strip, rivet, rivet); + time = 25; - KnowledgeListMF.bowR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_bow, "tier", true, "hammer", -1, -1, time, new Object[] - { - "PSSSP", - " PLP ", - - 'I', bar, - 'S', Items.string, - 'P', plank, - 'L', strip, - }); - Salvage.addSalvage(CustomToolListMF.standard_bow, - plank, plank, plank, plank, - strip, - Items.string, Items.string, Items.string); - + KnowledgeListMF.bowR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_bow, "tier", true, + "hammer", -1, -1, time, new Object[] { "PSSSP", " PLP ", + + 'I', bar, 'S', Items.string, 'P', plank, 'L', strip, }); + Salvage.addSalvage(CustomToolListMF.standard_bow, plank, plank, plank, plank, strip, Items.string, Items.string, + Items.string); + time = 60; - KnowledgeListMF.lanceR = - MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_lance, "tier", true, "hvyhammer", -1, -1, time, new Object[] - { - "IR ", - "IIIIII", - "IR ", - - 'R', rivet, - 'I', bar, - }); - Salvage.addSalvage(CustomToolListMF.standard_lance, - bar, bar, bar, bar, bar, bar, bar, bar, - rivet, rivet); + KnowledgeListMF.lanceR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_lance, "tier", + true, "hvyhammer", -1, -1, time, new Object[] { "IR ", "IIIIII", "IR ", + + 'R', rivet, 'I', bar, }); + Salvage.addSalvage(CustomToolListMF.standard_lance, bar, bar, bar, bar, bar, bar, bar, bar, rivet, rivet); } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java index 516654e4..2b4d1ff7 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java @@ -23,796 +23,481 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class ForgingRecipes -{ +public class ForgingRecipes { private static final Skill artisanry = SkillList.artisanry; private static final Skill engineering = SkillList.engineering; private static final Skill construction = SkillList.construction; - public static void init() - { + + public static void init() { ForgedToolRecipes.init(); ForgedArmourRecipes.init(); addCogworkParts(); - + ItemStack ironbar = ComponentListMF.bar("Iron"); ItemStack steelbar = ComponentListMF.bar("Steel"); ItemStack goldbar = ComponentListMF.bar("Gold"); ItemStack silverbar = ComponentListMF.bar("Silver"); - - //MISC + + // MISC BaseMaterialMF material; int time; time = 1; material = BaseMaterialMF.encrusted; - - KnowledgeListMF.obsidianHunkR = - MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ComponentListMF.obsidian_rock, 4), "", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "D", - 'D', Blocks.obsidian, - }); - KnowledgeListMF.diamondR = - MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ComponentListMF.diamond_shards), "", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "D", - 'D', Items.diamond, - }); - + + KnowledgeListMF.obsidianHunkR = MineFantasyAPI.addAnvilRecipe(null, + new ItemStack(ComponentListMF.obsidian_rock, 4), "", false, material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "D", 'D', Blocks.obsidian, }); + KnowledgeListMF.diamondR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ComponentListMF.diamond_shards), + "", false, material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "D", 'D', Items.diamond, }); + time = 3; - KnowledgeListMF.encrustedR = - MineFantasyAPI.addAnvilRecipe(artisanry, ComponentListMF.bar("Encrusted"), "smeltEncrusted", true, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "D", - "I", - 'D', ComponentListMF.diamond_shards, - 'I', ComponentListMF.bar("Steel"), - }); + KnowledgeListMF.encrustedR = MineFantasyAPI.addAnvilRecipe(artisanry, ComponentListMF.bar("Encrusted"), + "smeltEncrusted", true, material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), + new Object[] { "D", "I", 'D', ComponentListMF.diamond_shards, 'I', ComponentListMF.bar("Steel"), }); Salvage.addSalvage(ComponentListMF.ingots[5], ComponentListMF.ingots[4], ComponentListMF.diamond_shards); - Salvage.addSalvage(ComponentListMF.bar("Encrusted"), ComponentListMF.bar("Steel"), ComponentListMF.diamond_shards); - + Salvage.addSalvage(ComponentListMF.bar("Encrusted"), ComponentListMF.bar("Steel"), + ComponentListMF.diamond_shards); + material = BaseMaterialMF.pigiron; - KnowledgeListMF.steelR = - MineFantasyAPI.addAnvilRecipe(artisanry, ComponentListMF.bar("Steel"), "smeltSteel", true, 1, 1, 5, new Object[] - { - "C", - "H", - 'C', ComponentListMF.coalDust, - 'H', ComponentListMF.bar("PigIron") - }); - KnowledgeListMF.fluxR = - MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ComponentListMF.flux, 4), "", false, -1, -1, 2, new Object[] - { - "H", - 'H',BlockListMF.limestone - }); - - //STUDDED + KnowledgeListMF.steelR = MineFantasyAPI.addAnvilRecipe(artisanry, ComponentListMF.bar("Steel"), "smeltSteel", + true, 1, 1, 5, + new Object[] { "C", "H", 'C', ComponentListMF.coalDust, 'H', ComponentListMF.bar("PigIron") }); + KnowledgeListMF.fluxR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ComponentListMF.flux, 4), "", false, + -1, -1, 2, new Object[] { "H", 'H', BlockListMF.limestone }); + + // STUDDED material = BaseMaterialMF.iron; - //HELMET + // HELMET time = 10; - KnowledgeListMF.studHelmetR = - MineFantasyAPI.addAnvilRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 3, 0), "craftArmourLight", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " I ", - "IAI", - " I ", - 'I', ComponentListMF.rivet, - 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 0), - }); - //CHEST + KnowledgeListMF.studHelmetR = MineFantasyAPI.addAnvilRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 3, 0), "craftArmourLight", false, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { " I ", "IAI", " I ", 'I', + ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 0), }); + // CHEST time = 20; - KnowledgeListMF.studChestR = - MineFantasyAPI.addAnvilRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 3, 1), "craftArmourLight", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " I ", - "IAI", - " I ", - 'I', ComponentListMF.rivet, - 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 1), - }); - //LEGS + KnowledgeListMF.studChestR = MineFantasyAPI.addAnvilRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 3, 1), "craftArmourLight", false, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { " I ", "IAI", " I ", 'I', + ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 1), }); + // LEGS time = 15; - KnowledgeListMF.studLegsR = - MineFantasyAPI.addAnvilRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 3, 2), "craftArmourLight", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " I ", - "IAI", - " I ", - 'I', ComponentListMF.rivet, - 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 2), - }); - //BOOTS + KnowledgeListMF.studLegsR = MineFantasyAPI.addAnvilRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 3, 2), "craftArmourLight", false, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { " I ", "IAI", " I ", 'I', + ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 2), }); + // BOOTS time = 6; - KnowledgeListMF.studBootsR = - MineFantasyAPI.addAnvilRecipe(artisanry, ArmourListMF.armour(ArmourListMF.leather, 3, 3), "craftArmourLight", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " I ", - "IAI", - " I ", - 'I', ComponentListMF.rivet, - 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 3), - }); - - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 0), ArmourListMF.armour(ArmourListMF.leather, 2, 0), new ItemStack(ComponentListMF.rivet, 4)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 1), ArmourListMF.armour(ArmourListMF.leather, 2, 1), new ItemStack(ComponentListMF.rivet, 4)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 2), ArmourListMF.armour(ArmourListMF.leather, 2, 2), new ItemStack(ComponentListMF.rivet, 4)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 3), ArmourListMF.armour(ArmourListMF.leather, 2, 3), new ItemStack(ComponentListMF.rivet, 4)); - + KnowledgeListMF.studBootsR = MineFantasyAPI.addAnvilRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 3, 3), "craftArmourLight", false, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { " I ", "IAI", " I ", 'I', + ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 3), }); + + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 0), + ArmourListMF.armour(ArmourListMF.leather, 2, 0), new ItemStack(ComponentListMF.rivet, 4)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 1), + ArmourListMF.armour(ArmourListMF.leather, 2, 1), new ItemStack(ComponentListMF.rivet, 4)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 2), + ArmourListMF.armour(ArmourListMF.leather, 2, 2), new ItemStack(ComponentListMF.rivet, 4)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 3), + ArmourListMF.armour(ArmourListMF.leather, 2, 3), new ItemStack(ComponentListMF.rivet, 4)); + time = 2; material = BaseMaterialMF.iron; - if(ConfigCrafting.allowIronResmelt) - { - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), "blastfurn", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "IFI", - 'I', ComponentListMF.bar("iron"), - 'F', ComponentListMF.flux, - }); - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "IFI", - 'I', ComponentListMF.bar("iron"), - 'F', ComponentListMF.flux_strong, - }); + if (ConfigCrafting.allowIronResmelt) { + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), "blastfurn", false, + material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "IFI", 'I', ComponentListMF.bar("iron"), 'F', ComponentListMF.flux, }); + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, + material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "IFI", 'I', ComponentListMF.bar("iron"), 'F', ComponentListMF.flux_strong, }); } - KnowledgeListMF.coalPrepR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.coal_prep), "coke", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "RCR", - "CFC", - "RCR", - 'R', Items.redstone, - 'C', new ItemStack(Items.coal, 1, 1), - 'F', ComponentListMF.flux_strong, - }); + KnowledgeListMF.coalPrepR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.coal_prep), + "coke", false, material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "RCR", "CFC", "RCR", 'R', Items.redstone, 'C', new ItemStack(Items.coal, 1, 1), 'F', + ComponentListMF.flux_strong, }); GameRegistry.addSmelting(ComponentListMF.coal_prep, new ItemStack(ComponentListMF.coke), 1F); - - KnowledgeListMF.ironPrepR = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), "blastfurn", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "IFI", - 'I', Blocks.iron_ore, - 'F', ComponentListMF.flux, - }); - KnowledgeListMF.ironPrepR2 = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "IFI", - 'I', Blocks.iron_ore, - 'F', ComponentListMF.flux_strong, - }); - - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), "blastfurn", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "IFI", - 'I', ComponentListMF.oreIron, - 'F', ComponentListMF.flux, - }); - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "IFI", - 'I', ComponentListMF.oreIron, - 'F', ComponentListMF.flux_strong, - }); + + KnowledgeListMF.ironPrepR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), + "blastfurn", false, material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "IFI", 'I', Blocks.iron_ore, 'F', ComponentListMF.flux, }); + KnowledgeListMF.ironPrepR2 = MineFantasyAPI.addAnvilRecipe(artisanry, + new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "IFI", 'I', Blocks.iron_ore, 'F', ComponentListMF.flux_strong, }); + + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), "blastfurn", false, + material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "IFI", 'I', ComponentListMF.oreIron, 'F', ComponentListMF.flux, }); + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, + material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "IFI", 'I', ComponentListMF.oreIron, 'F', ComponentListMF.flux_strong, }); ItemStack plate = ComponentListMF.plate.createComm("iron"); - time=10; - KnowledgeListMF.blastChamR = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.blast_chamber), "blastfurn", false, "hvyHammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "RP PR", - "RP PR", - "RP PR", - "RP PR", - 'R', ComponentListMF.rivet, - 'P', plate, - }); - - time=15; - KnowledgeListMF.blastHeatR = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.blast_heater), "blastfurn", false, "hvyHammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "RP PR", - "RP PR", - "RP PR", - "RPFPR", - 'R', ComponentListMF.rivet, - 'P', plate, - 'F', Blocks.furnace, - }); - - Salvage.addSalvage(BlockListMF.blast_heater, new ItemStack(ComponentListMF.rivet, 8), - plate, plate, plate, plate, plate, plate, plate, plate, - Blocks.furnace); - Salvage.addSalvage(BlockListMF.blast_chamber, new ItemStack(ComponentListMF.rivet, 8), - plate, plate, plate, plate, plate, plate, plate, plate); - - - time=10; - KnowledgeListMF.bigFurnR = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.furnace_stone), "bigfurn", false, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "PRP", - "RCR", - "PFP", - 'F', Blocks.furnace, - 'R', ComponentListMF.rivet, - 'P', plate, - 'C', BlockListMF.firebricks - }); - time=10; - KnowledgeListMF.bigHeatR = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.furnace_heater), "bigfurn", false, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[]{ - "RCR", - "PFP", - 'R', ComponentListMF.rivet, - 'P', plate, - 'C', BlockListMF.firebricks, - 'F', BlockListMF.forge, - }); - - Salvage.addSalvage(BlockListMF.furnace_heater, new ItemStack(ComponentListMF.rivet, 2), - plate, plate, - BlockListMF.firebricks, - BlockListMF.forge); - Salvage.addSalvage(BlockListMF.furnace_stone, new ItemStack(ComponentListMF.rivet, 3), - plate, plate, plate, plate, - BlockListMF.firebricks, - Blocks.furnace); - - + time = 10; + KnowledgeListMF.blastChamR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.blast_chamber), + "blastfurn", false, "hvyHammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), + new Object[] { "RP PR", "RP PR", "RP PR", "RP PR", 'R', ComponentListMF.rivet, 'P', plate, }); + + time = 15; + KnowledgeListMF.blastHeatR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.blast_heater), + "blastfurn", false, "hvyHammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "RP PR", "RP PR", "RP PR", "RPFPR", 'R', + ComponentListMF.rivet, 'P', plate, 'F', Blocks.furnace, }); + + Salvage.addSalvage(BlockListMF.blast_heater, new ItemStack(ComponentListMF.rivet, 8), plate, plate, plate, + plate, plate, plate, plate, plate, Blocks.furnace); + Salvage.addSalvage(BlockListMF.blast_chamber, new ItemStack(ComponentListMF.rivet, 8), plate, plate, plate, + plate, plate, plate, plate, plate); + + time = 10; + KnowledgeListMF.bigFurnR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.furnace_stone), + "bigfurn", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "PRP", "RCR", "PFP", 'F', Blocks.furnace, 'R', + ComponentListMF.rivet, 'P', plate, 'C', BlockListMF.firebricks }); + time = 10; + KnowledgeListMF.bigHeatR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.furnace_heater), + "bigfurn", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "RCR", "PFP", 'R', ComponentListMF.rivet, 'P', + plate, 'C', BlockListMF.firebricks, 'F', BlockListMF.forge, }); + + Salvage.addSalvage(BlockListMF.furnace_heater, new ItemStack(ComponentListMF.rivet, 2), plate, plate, + BlockListMF.firebricks, BlockListMF.forge); + Salvage.addSalvage(BlockListMF.furnace_stone, new ItemStack(ComponentListMF.rivet, 3), plate, plate, plate, + plate, BlockListMF.firebricks, Blocks.furnace); + IAnvilRecipe[] anvilRecs = new IAnvilRecipe[BlockListMF.anvils.length]; - for(int id = 0; id < BlockListMF.anvils.length; id ++) - { + for (int id = 0; id < BlockListMF.anvils.length; id++) { time = 8; material = BaseMaterialMF.getMaterial(BlockListMF.anvils[id]); ItemStack bar = ComponentListMF.bar(material.name); - - anvilRecs[id] = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.anvil[id]), "smelt"+material.name, false, "hammer", -1, -1, (int)(time*material.craftTimeModifier), new Object[] - { - " II", - "III", - " I ", - 'I', bar, - }); - + + anvilRecs[id] = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.anvil[id]), + "smelt" + material.name, false, "hammer", -1, -1, (int) (time * material.craftTimeModifier), + new Object[] { " II", "III", " I ", 'I', bar, }); + Salvage.addSalvage(BlockListMF.anvil[id], ComponentListMF.bar(material.name, 6)); } recipeMap.put("anvilCrafting", anvilRecs); - + ItemStack bronzeHunk = ComponentListMF.metalHunk.createComm("bronze"); ItemStack ironHunk = ComponentListMF.metalHunk.createComm("iron"); - + time = 2; material = BaseMaterialMF.bronze; - KnowledgeListMF.framedStoneR = - MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(BlockListMF.reinforced_stone_framed), "decorated_stone", false, "hammer", material.hammerTier-1, material.anvilTier-1, (int)(time*material.craftTimeModifier), new Object[] - { - " N ", - "NSN", - " N ", - 'N', bronzeHunk, - 'S', BlockListMF.reinforced_stone, - }); - Salvage.addSalvage(BlockListMF.reinforced_stone_framed, - bronzeHunk, bronzeHunk, bronzeHunk, bronzeHunk, + KnowledgeListMF.framedStoneR = MineFantasyAPI.addAnvilRecipe(construction, + new ItemStack(BlockListMF.reinforced_stone_framed), "decorated_stone", false, "hammer", + material.hammerTier - 1, material.anvilTier - 1, (int) (time * material.craftTimeModifier), + new Object[] { " N ", "NSN", " N ", 'N', bronzeHunk, 'S', BlockListMF.reinforced_stone, }); + Salvage.addSalvage(BlockListMF.reinforced_stone_framed, bronzeHunk, bronzeHunk, bronzeHunk, bronzeHunk, BlockListMF.reinforced_stone); time = 2; material = BaseMaterialMF.iron; - KnowledgeListMF.iframedStoneR = - MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(BlockListMF.reinforced_stone_framediron), "decorated_stone", false, "hammer", material.hammerTier-1, material.anvilTier-1, (int)(time*material.craftTimeModifier), new Object[] - { - " N ", - "NSN", - " N ", - 'N', ironHunk, - 'S', BlockListMF.reinforced_stone, - }); - Salvage.addSalvage(BlockListMF.reinforced_stone_framediron, - ironHunk, ironHunk,ironHunk, ironHunk - , BlockListMF.reinforced_stone); - + KnowledgeListMF.iframedStoneR = MineFantasyAPI.addAnvilRecipe(construction, + new ItemStack(BlockListMF.reinforced_stone_framediron), "decorated_stone", false, "hammer", + material.hammerTier - 1, material.anvilTier - 1, (int) (time * material.craftTimeModifier), + new Object[] { " N ", "NSN", " N ", 'N', ironHunk, 'S', BlockListMF.reinforced_stone, }); + Salvage.addSalvage(BlockListMF.reinforced_stone_framediron, ironHunk, ironHunk, ironHunk, ironHunk, + BlockListMF.reinforced_stone); + time = 2; material = BaseMaterialMF.bronze; - KnowledgeListMF.smokePipeR = - MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(BlockListMF.chimney_pipe, 4), "", false, "hammer", material.hammerTier-1, material.anvilTier-1, (int)(time*material.craftTimeModifier), new Object[] - { - "N N", - "PPPP", - "N N", - 'N', bronzeHunk, - 'P', BlockListMF.chimney_stone, - }); - Salvage.addSalvage(BlockListMF.chimney_pipe, - BlockListMF.chimney_stone, bronzeHunk); - - for(int id = 0; id < BlockListMF.specialMetalBlocks.length; id ++) - { + KnowledgeListMF.smokePipeR = MineFantasyAPI.addAnvilRecipe(construction, + new ItemStack(BlockListMF.chimney_pipe, 4), "", false, "hammer", material.hammerTier - 1, + material.anvilTier - 1, (int) (time * material.craftTimeModifier), + new Object[] { "N N", "PPPP", "N N", 'N', bronzeHunk, 'P', BlockListMF.chimney_stone, }); + Salvage.addSalvage(BlockListMF.chimney_pipe, BlockListMF.chimney_stone, bronzeHunk); + + for (int id = 0; id < BlockListMF.specialMetalBlocks.length; id++) { time = 2; material = BaseMaterialMF.getMaterial(BlockListMF.specialMetalBlocks[id]); ItemStack hunk = ComponentListMF.metalHunk.createComm(material.name); - if(hunk != null) - { - KnowledgeListMF.barsR.add( - MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(BlockListMF.bars[id]), "smelt"+material.name, false, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "I I", - "I I", - 'I', hunk, - })); - if(hunk.getItem() instanceof ItemComponentMF) - { - Salvage.addSalvage(BlockListMF.bars[id],hunk, hunk, hunk, hunk); + if (hunk != null) { + KnowledgeListMF.barsR + .add(MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(BlockListMF.bars[id]), + "smelt" + material.name, false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "I I", "I I", 'I', hunk, })); + if (hunk.getItem() instanceof ItemComponentMF) { + Salvage.addSalvage(BlockListMF.bars[id], hunk, hunk, hunk, hunk); } } } - if(!ConfigHardcore.HCCRemoveTalismansCraft) { - KnowledgeListMF.talismanRecipe.add( - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[] - { - "LGL", - "GIG", - " G ", - 'L', new ItemStack(Items.dye, 1, 4), - 'I', ironbar, - 'G', goldbar, - })); - KnowledgeListMF.talismanRecipe.add( - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[] - { - "LSL", - "SIS", - " S ", - 'L', new ItemStack(Items.dye, 1, 4), - 'I', ironbar, - 'S', silverbar, - })); - KnowledgeListMF.greatTalismanRecipe = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.talisman_greater), "", true, "hammer", 1, 1, 50, new Object[] - { - "GSG", - "DTD", - "GDG", - 'G', goldbar, - 'D', Items.diamond, - 'T', ComponentListMF.talisman_lesser, - 'S', Items.nether_star, - }); + if (!ConfigHardcore.HCCRemoveTalismansCraft) { + KnowledgeListMF.talismanRecipe.add(MineFantasyAPI.addAnvilRecipe(artisanry, + new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[] { + "LGL", "GIG", " G ", 'L', new ItemStack(Items.dye, 1, 4), 'I', ironbar, 'G', goldbar, })); + KnowledgeListMF.talismanRecipe.add(MineFantasyAPI.addAnvilRecipe(artisanry, + new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[] { + "LSL", "SIS", " S ", 'L', new ItemStack(Items.dye, 1, 4), 'I', ironbar, 'S', silverbar, })); + KnowledgeListMF.greatTalismanRecipe = MineFantasyAPI.addAnvilRecipe(artisanry, + new ItemStack(ComponentListMF.talisman_greater), "", true, "hammer", 1, 1, 50, + new Object[] { "GSG", "DTD", "GDG", 'G', goldbar, 'D', Items.diamond, 'T', + ComponentListMF.talisman_lesser, 'S', Items.nether_star, }); } - + addEngineering(); addConstruction(); - + time = 10; material = BaseMaterialMF.iron; - KnowledgeListMF.caketinRecipe = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(FoodListMF.cake_tin), "", true, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " R ", - "I I", - " I ", - 'I', ironbar, - 'R', ComponentListMF.rivet, - }); - Salvage.addSalvage(FoodListMF.cake_tin, - ComponentListMF.bar("Iron", 3) - , ComponentListMF.rivet); - - KnowledgeListMF.coalfluxR = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.coal_flux, 2), "coalflux", false, material.hammerTier, material.anvilTier, 2, new Object[] - { - "F", - "C", - 'C', Items.coal, - 'F', ComponentListMF.flux_pot, - }); - + KnowledgeListMF.caketinRecipe = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(FoodListMF.cake_tin), "", + true, "hammer", material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { " R ", "I I", " I ", 'I', ironbar, 'R', ComponentListMF.rivet, }); + Salvage.addSalvage(FoodListMF.cake_tin, ComponentListMF.bar("Iron", 3), ComponentListMF.rivet); + + KnowledgeListMF.coalfluxR = MineFantasyAPI.addAnvilRecipe(artisanry, + new ItemStack(ComponentListMF.coal_flux, 2), "coalflux", false, material.hammerTier, material.anvilTier, + 2, new Object[] { "F", "C", 'C', Items.coal, 'F', ComponentListMF.flux_pot, }); + time = 4; material = BaseMaterialMF.iron; - KnowledgeListMF.hingeRecipe = - MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(ComponentListMF.hinge), "", true, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "LR", - 'L', ComponentListMF.leather_strip, - 'R', ComponentListMF.rivet, - }); - Salvage.addSalvage(ComponentListMF.hinge, - ComponentListMF.leather_strip - , ComponentListMF.rivet); - + KnowledgeListMF.hingeRecipe = MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(ComponentListMF.hinge), + "", true, "hammer", material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "LR", 'L', ComponentListMF.leather_strip, 'R', ComponentListMF.rivet, }); + Salvage.addSalvage(ComponentListMF.hinge, ComponentListMF.leather_strip, ComponentListMF.rivet); + time = 10; - KnowledgeListMF.crestR = - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.ornate_items), "craftOrnate", false, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " G ", - "SLS", - " G ", - 'G', goldbar, - 'S', silverbar, - 'L', new ItemStack(Items.dye, 1, 4) - - }); + KnowledgeListMF.crestR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.ornate_items), + "craftOrnate", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), + new Object[] { " G ", "SLS", " G ", 'G', goldbar, 'S', silverbar, 'L', new ItemStack(Items.dye, 1, 4) + + }); } - - private static Item getStrips(BaseMaterialMF material) - { + + private static Item getStrips(BaseMaterialMF material) { return ComponentListMF.leather_strip; } - private static Item getLeather(BaseMaterialMF material) - { + + private static Item getLeather(BaseMaterialMF material) { return Items.leather; } - - private static void addEngineering() - { + + private static void addEngineering() { ItemStack copper = ComponentListMF.bar("Copper"); ItemStack bronze = ComponentListMF.bar("Bronze"); ItemStack iron = ComponentListMF.bar("Iron"); ItemStack steel = ComponentListMF.bar("Steel"); ItemStack tungsten = ComponentListMF.bar("Tungsten"); ItemStack blacksteel = ComponentListMF.bar("BlackSteel"); - - + ItemStack bronzeHunk = ComponentListMF.metalHunk.createComm("bronze"); ItemStack ironHunk = ComponentListMF.metalHunk.createComm("iron"); ItemStack steelHunk = ComponentListMF.metalHunk.createComm("steel"); ItemStack tungstenHunk = ComponentListMF.metalHunk.createComm("tungsten"); ItemStack obsidianHunk = ComponentListMF.metalHunk.createComm("obsidian"); - + BaseMaterialMF material = BaseMaterialMF.steel; int time = 15; - KnowledgeListMF.eatoolsR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ToolListMF.engin_anvil_tools), "etools", true, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "SSLL", - "LLSS", - 'S', steelHunk, - 'L', getStrips(material), - }); + KnowledgeListMF.eatoolsR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ToolListMF.engin_anvil_tools), "etools", true, "hammer", material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "SSLL", "LLSS", 'S', steelHunk, 'L', getStrips(material), }); time = 5; - KnowledgeListMF.iframeR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.iron_frame), "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "RRR", - "ISI", - "STS", - "ISI", - 'T', ToolListMF.engin_anvil_tools, - 'R', ComponentListMF.rivet, - 'I', ironHunk, - 'S', steelHunk, - }); + KnowledgeListMF.iframeR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.iron_frame), + "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "RRR", "ISI", "STS", "ISI", 'T', + ToolListMF.engin_anvil_tools, 'R', ComponentListMF.rivet, 'I', ironHunk, 'S', steelHunk, }); time = 8; - KnowledgeListMF.istrutR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.iron_strut), "ecomponents", true, "hvyhammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "RTR", - "SIS", - "SIS", - 'T', ToolListMF.engin_anvil_tools, - 'R', ComponentListMF.rivet, - 'I', iron, - 'S', steelHunk, - }); + KnowledgeListMF.istrutR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.iron_strut), + "ecomponents", true, "hvyhammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "RTR", "SIS", "SIS", 'T', + ToolListMF.engin_anvil_tools, 'R', ComponentListMF.rivet, 'I', iron, 'S', steelHunk, }); time = 8; - KnowledgeListMF.stubeR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.steel_tube), "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "TR R", - "SSSS", - 'T', ToolListMF.engin_anvil_tools, - 'R', ComponentListMF.rivet, - 'S', steelHunk, - }); + KnowledgeListMF.stubeR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.steel_tube), + "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "TR R", "SSSS", 'T', + ToolListMF.engin_anvil_tools, 'R', ComponentListMF.rivet, 'S', steelHunk, }); time = 2; - KnowledgeListMF.boltR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bolt, 2), "etools", true, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " T ", - "SIS", - " S ", - " S ", - 'T', ToolListMF.engin_anvil_tools, - 'I', iron, - 'S', steelHunk, - }); + KnowledgeListMF.boltR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bolt, 2), + "etools", true, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { " T ", "SIS", " S ", " S ", 'T', + ToolListMF.engin_anvil_tools, 'I', iron, 'S', steelHunk, }); time = 35; - KnowledgeListMF.climbPickbR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ToolListMF.climbing_pick_basic), "climber", true, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "L SR", - "IISR", - "L T ", - 'R', ComponentListMF.rivet, - 'T', ToolListMF.engin_anvil_tools, - 'I', iron, - 'S', steel, - 'L', getStrips(material), - }); + KnowledgeListMF.climbPickbR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ToolListMF.climbing_pick_basic), "climber", true, "hammer", material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { "L SR", "IISR", "L T ", 'R', ComponentListMF.rivet, 'T', ToolListMF.engin_anvil_tools, + 'I', iron, 'S', steel, 'L', getStrips(material), }); time = 5; - KnowledgeListMF.bgearR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bronze_gears), "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " T ", - " B ", - "BIB", - " B ", - 'T', ToolListMF.engin_anvil_tools, - 'I', iron, - 'B', bronzeHunk, - }); + KnowledgeListMF.bgearR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bronze_gears), + "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { " T ", " B ", "BIB", " B ", 'T', + ToolListMF.engin_anvil_tools, 'I', iron, 'B', bronzeHunk, }); time = 8; material = BaseMaterialMF.tungsten; - KnowledgeListMF.tgearR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.tungsten_gears), "tungsten", true, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " T ", - " W ", - "WGW", - " W ", - 'T', ToolListMF.engin_anvil_tools, - 'W', tungstenHunk, - 'G', ComponentListMF.bronze_gears, - }); + KnowledgeListMF.tgearR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.tungsten_gears), "tungsten", true, "hammer", material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { " T ", " W ", "WGW", " W ", 'T', ToolListMF.engin_anvil_tools, 'W', tungstenHunk, 'G', + ComponentListMF.bronze_gears, }); time = 5; material = BaseMaterialMF.compositeAlloy; - KnowledgeListMF.compPlateR = - MineFantasyAPI.addAnvilRecipe(engineering, ComponentListMF.bar("CompositeAlloy"), "cogArmour", true, "hvyhammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " T ", - " S ", - "RWR", - " C ", - - 'R', ComponentListMF.rivet, - 'T', ToolListMF.engin_anvil_tools, - 'C', copper, - 'W', tungstenHunk, - 'S', steel, - }); + KnowledgeListMF.compPlateR = MineFantasyAPI.addAnvilRecipe(engineering, ComponentListMF.bar("CompositeAlloy"), + "cogArmour", true, "hvyhammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { " T ", " S ", "RWR", " C ", + + 'R', ComponentListMF.rivet, 'T', ToolListMF.engin_anvil_tools, 'C', copper, 'W', tungstenHunk, + 'S', steel, }); material = BaseMaterialMF.iron; - + time = 5; - KnowledgeListMF.bombCaseIronR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bomb_casing_iron, 2), "bombIron", true, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " T ", - " I ", - "IRI", - " I ", - 'T', ToolListMF.engin_anvil_tools, - 'I', ironHunk, - 'R', ComponentListMF.rivet, - }); - KnowledgeListMF.mineCaseIronR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.mine_casing_iron, 2), "bombIron", true, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " T ", - " P ", - " IRI ", - "IR RI", - 'T', ToolListMF.engin_anvil_tools, - 'P', Blocks.heavy_weighted_pressure_plate, - 'I', ironHunk, - 'R', ComponentListMF.rivet, - }); - + KnowledgeListMF.bombCaseIronR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_iron, 2), "bombIron", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { " T ", " I ", "IRI", + " I ", 'T', ToolListMF.engin_anvil_tools, 'I', ironHunk, 'R', ComponentListMF.rivet, }); + KnowledgeListMF.mineCaseIronR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.mine_casing_iron, 2), "bombIron", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { " T ", " P ", " IRI ", "IR RI", 'T', ToolListMF.engin_anvil_tools, 'P', + Blocks.heavy_weighted_pressure_plate, 'I', ironHunk, 'R', ComponentListMF.rivet, }); + time = 5; - KnowledgeListMF.bombarrowR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bomb_casing_arrow), "bombarrow", true, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " IR", - "FPITI", - " IR", - 'T', ToolListMF.engin_anvil_tools, - 'I', ironHunk, - 'R', Items.redstone, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - 'F', ComponentListMF.fletching, - }); - KnowledgeListMF.bombBoltR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bomb_casing_bolt), "bombarrow", true, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " IR", - "FITI", - " IR", - 'T', ToolListMF.engin_anvil_tools, - 'I', ironHunk, - 'R', Items.redstone, - 'F', ComponentListMF.fletching, - }); - + KnowledgeListMF.bombarrowR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_arrow), "bombarrow", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { " IR", "FPITI", " IR", 'T', ToolListMF.engin_anvil_tools, 'I', ironHunk, 'R', + Items.redstone, 'P', ComponentListMF.plank.construct("RefinedWood"), 'F', + ComponentListMF.fletching, }); + KnowledgeListMF.bombBoltR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_bolt), "bombarrow", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { " IR", "FITI", " IR", 'T', ToolListMF.engin_anvil_tools, 'I', ironHunk, 'R', + Items.redstone, 'F', ComponentListMF.fletching, }); + material = BaseMaterialMF.blacksteel; - + time = 5; - KnowledgeListMF.bombCaseObsidianR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bomb_casing_obsidian, 2), "bombObsidian", true, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " T ", - "RIR", - "IOI", - "RIR", - 'T', ToolListMF.engin_anvil_tools, - 'O', Blocks.obsidian, - 'I', obsidianHunk, - 'R', ComponentListMF.rivet, - }); - KnowledgeListMF.mineCaseObsidianR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.mine_casing_obsidian, 2), "mineObsidian", true, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " T ", - " P ", - " IRI ", - "IRORI", - 'T', ToolListMF.engin_anvil_tools, - 'O', Blocks.obsidian, - 'P', Blocks.heavy_weighted_pressure_plate, - 'I', obsidianHunk, - 'R', ComponentListMF.rivet, - }); + KnowledgeListMF.bombCaseObsidianR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_obsidian, 2), "bombObsidian", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { " T ", "RIR", "IOI", "RIR", 'T', ToolListMF.engin_anvil_tools, 'O', Blocks.obsidian, 'I', + obsidianHunk, 'R', ComponentListMF.rivet, }); + KnowledgeListMF.mineCaseObsidianR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.mine_casing_obsidian, 2), "mineObsidian", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[] { " T ", " P ", " IRI ", "IRORI", 'T', ToolListMF.engin_anvil_tools, 'O', + Blocks.obsidian, 'P', Blocks.heavy_weighted_pressure_plate, 'I', obsidianHunk, 'R', + ComponentListMF.rivet, }); time = 15; material = BaseMaterialMF.steel; - KnowledgeListMF.crossBayonetR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.cross_bayonet), "crossBayonet", true, material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "R R I", - "PIII ", - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - 'I', ironHunk, - 'R', ComponentListMF.rivet, - }); - - Salvage.addSalvage(ToolListMF.engin_anvil_tools, - steelHunk, steelHunk, steelHunk, steelHunk, + KnowledgeListMF.crossBayonetR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.cross_bayonet), "crossBayonet", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { "R R I", "PIII ", 'P', + ComponentListMF.plank.construct("RefinedWood"), 'I', ironHunk, 'R', ComponentListMF.rivet, }); + + Salvage.addSalvage(ToolListMF.engin_anvil_tools, steelHunk, steelHunk, steelHunk, steelHunk, new ItemStack(ComponentListMF.leather_strip, 4)); - - Salvage.addSalvage(ComponentListMF.iron_frame, - steelHunk, steelHunk, steelHunk, steelHunk, - ironHunk, ironHunk, ironHunk, ironHunk - ,new ItemStack(ComponentListMF.rivet, 3)); - - Salvage.addSalvage(ComponentListMF.iron_strut, - steelHunk, steelHunk, steelHunk, steelHunk, + + Salvage.addSalvage(ComponentListMF.iron_frame, steelHunk, steelHunk, steelHunk, steelHunk, ironHunk, ironHunk, + ironHunk, ironHunk, new ItemStack(ComponentListMF.rivet, 3)); + + Salvage.addSalvage(ComponentListMF.iron_strut, steelHunk, steelHunk, steelHunk, steelHunk, ComponentListMF.bar("Iron", 2), new ItemStack(ComponentListMF.rivet, 2)); - - Salvage.addSalvage(ComponentListMF.steel_tube, - steelHunk, steelHunk, steelHunk, steelHunk, + + Salvage.addSalvage(ComponentListMF.steel_tube, steelHunk, steelHunk, steelHunk, steelHunk, new ItemStack(ComponentListMF.rivet, 2)); - - Salvage.addSalvage(ToolListMF.climbing_pick_basic, ComponentListMF.bar("Iron", 2), ComponentListMF.bar("Steel", 2), new ItemStack(ComponentListMF.rivet, 2), new ItemStack(ComponentListMF.leather_strip, 2)); - - Salvage.addSalvage(ComponentListMF.bronze_gears, - bronzeHunk, bronzeHunk, bronzeHunk, bronzeHunk - ,iron); - - Salvage.addSalvage(ComponentListMF.tungsten_gears, - tungstenHunk, tungstenHunk, tungstenHunk, tungstenHunk, + + Salvage.addSalvage(ToolListMF.climbing_pick_basic, ComponentListMF.bar("Iron", 2), + ComponentListMF.bar("Steel", 2), new ItemStack(ComponentListMF.rivet, 2), + new ItemStack(ComponentListMF.leather_strip, 2)); + + Salvage.addSalvage(ComponentListMF.bronze_gears, bronzeHunk, bronzeHunk, bronzeHunk, bronzeHunk, iron); + + Salvage.addSalvage(ComponentListMF.tungsten_gears, tungstenHunk, tungstenHunk, tungstenHunk, tungstenHunk, ComponentListMF.bronze_gears); - - Salvage.addSalvage(ComponentListMF.bar("CompositeAlloy"), copper, steel, tungstenHunk, new ItemStack(ComponentListMF.rivet, 2)); - Salvage.addSalvage(ComponentListMF.ingotCompositeAlloy, copper, steel, tungstenHunk, new ItemStack(ComponentListMF.rivet, 2)); - + + Salvage.addSalvage(ComponentListMF.bar("CompositeAlloy"), copper, steel, tungstenHunk, + new ItemStack(ComponentListMF.rivet, 2)); + Salvage.addSalvage(ComponentListMF.ingotCompositeAlloy, copper, steel, tungstenHunk, + new ItemStack(ComponentListMF.rivet, 2)); + Salvage.addSalvage(ComponentListMF.bomb_casing_iron, ironHunk, ironHunk); Salvage.addSalvage(ComponentListMF.mine_casing_iron, ironHunk, ironHunk, ComponentListMF.rivet, iron); - Salvage.addSalvage(ComponentListMF.bomb_casing_arrow, - ironHunk, ironHunk, ironHunk, ironHunk, - new ItemStack(Items.redstone, 2), ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), ComponentListMF.fletching); - - Salvage.addSalvage(ComponentListMF.bomb_casing_bolt, - ironHunk, ironHunk, ironHunk, ironHunk, + Salvage.addSalvage(ComponentListMF.bomb_casing_arrow, ironHunk, ironHunk, ironHunk, ironHunk, + new ItemStack(Items.redstone, 2), ComponentListMF.plank.construct("RefinedWood"), + ComponentListMF.fletching); + + Salvage.addSalvage(ComponentListMF.bomb_casing_bolt, ironHunk, ironHunk, ironHunk, ironHunk, new ItemStack(Items.redstone, 2), ComponentListMF.fletching); - - Salvage.addSalvage(ComponentListMF.bomb_casing_obsidian, obsidianHunk, obsidianHunk, new ItemStack(ComponentListMF.rivet, 2)); - Salvage.addSalvage(ComponentListMF.mine_casing_obsidian, obsidianHunk, obsidianHunk, iron, ComponentListMF.rivet); - - Salvage.addSalvage(ComponentListMF.cross_bayonet, - ironHunk, ironHunk, ironHunk, ironHunk, - ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), new ItemStack(ComponentListMF.rivet, 2)); + + Salvage.addSalvage(ComponentListMF.bomb_casing_obsidian, obsidianHunk, obsidianHunk, + new ItemStack(ComponentListMF.rivet, 2)); + Salvage.addSalvage(ComponentListMF.mine_casing_obsidian, obsidianHunk, obsidianHunk, iron, + ComponentListMF.rivet); + + Salvage.addSalvage(ComponentListMF.cross_bayonet, ironHunk, ironHunk, ironHunk, ironHunk, + ComponentListMF.plank.construct("RefinedWood"), new ItemStack(ComponentListMF.rivet, 2)); } - private static void addConstruction() - { + + private static void addConstruction() { BaseMaterialMF material = BaseMaterialMF.tin; ItemStack tin = ComponentListMF.bar("Tin"); int time = 10; - KnowledgeListMF.brushRecipe = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ToolListMF.paint_brush), "paint_brush", true, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "W", - "I", - "P", - - 'W', Blocks.wool, - 'I', tin, - 'P', ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood"), - }); - - Salvage.addSalvage(ToolListMF.paint_brush, Blocks.wool, tin, ((ItemComponentMF)ComponentListMF.plank).construct("RefinedWood")); + KnowledgeListMF.brushRecipe = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ToolListMF.paint_brush), + "paint_brush", true, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "W", "I", "P", + + 'W', Blocks.wool, 'I', tin, 'P', ComponentListMF.plank.construct("RefinedWood"), }); + + Salvage.addSalvage(ToolListMF.paint_brush, Blocks.wool, tin, ComponentListMF.plank.construct("RefinedWood")); } - - private static void addCogworkParts() - { + + private static void addCogworkParts() { BaseMaterialMF material = BaseMaterialMF.steel; int time = 1; - KnowledgeListMF.frameBlockR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.frame_block), "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "R", - "I", - - 'I', ComponentListMF.iron_frame, - 'R', ComponentListMF.rivet, - }); - + KnowledgeListMF.frameBlockR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.frame_block), + "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "R", "I", + + 'I', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, }); + Salvage.addSalvage(BlockListMF.frame_block, ComponentListMF.iron_frame, ComponentListMF.rivet); - + time = 10; - KnowledgeListMF.cogPulleyR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.cogwork_pulley), "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "RFR", - "GBG", - "RFR", - - 'B', Blocks.redstone_block, - 'F', ComponentListMF.iron_frame, - 'R', ComponentListMF.rivet, - 'G', ComponentListMF.tungsten_gears, - }); - Salvage.addSalvage(ComponentListMF.cogwork_pulley, Blocks.redstone_block, - new ItemStack(ComponentListMF.iron_frame, 2), - new ItemStack(ComponentListMF.rivet, 2), - new ItemStack(ComponentListMF.tungsten_gears, 2) - ); + KnowledgeListMF.cogPulleyR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.cogwork_pulley), "cogArmour", false, "hammer", material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { "RFR", "GBG", "RFR", + + 'B', Blocks.redstone_block, 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'G', + ComponentListMF.tungsten_gears, }); + Salvage.addSalvage(ComponentListMF.cogwork_pulley, Blocks.redstone_block, + new ItemStack(ComponentListMF.iron_frame, 2), new ItemStack(ComponentListMF.rivet, 2), + new ItemStack(ComponentListMF.tungsten_gears, 2)); Salvage.addSalvage(BlockListMF.frame_block, ComponentListMF.iron_frame, ComponentListMF.rivet); - + time = 10; - KnowledgeListMF.cogHelmR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_helm), "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "RFFR", - "SEES", - " RR ", - - 'E', Items.ender_eye, - 'F', ComponentListMF.iron_frame, - 'R', ComponentListMF.rivet, - 'S', ComponentListMF.cogwork_shaft, - }); - Salvage.addSalvage(BlockListMF.cogwork_helm, - new ItemStack(Items.ender_eye, 2), - new ItemStack(ComponentListMF.iron_frame, 2), - new ItemStack(ComponentListMF.cogwork_shaft, 2), + KnowledgeListMF.cogHelmR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_helm), + "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "RFFR", "SEES", " RR ", + + 'E', Items.ender_eye, 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'S', + ComponentListMF.cogwork_shaft, }); + Salvage.addSalvage(BlockListMF.cogwork_helm, new ItemStack(Items.ender_eye, 2), + new ItemStack(ComponentListMF.iron_frame, 2), new ItemStack(ComponentListMF.cogwork_shaft, 2), new ItemStack(ComponentListMF.rivet, 4)); time = 15; - KnowledgeListMF.cogChestR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_chest), "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - " RFR ", - "RSFSR", - "RFBFR", - " SFS ", - - 'F', ComponentListMF.iron_frame, - 'R', ComponentListMF.rivet, - 'S', ComponentListMF.cogwork_shaft, - 'B', Blocks.furnace, - }); - Salvage.addSalvage(BlockListMF.cogwork_chest, - Blocks.furnace, - new ItemStack(ComponentListMF.iron_frame, 5), - new ItemStack(ComponentListMF.cogwork_shaft, 4), - new ItemStack(ComponentListMF.rivet, 6)); - + KnowledgeListMF.cogChestR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_chest), + "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { " RFR ", "RSFSR", "RFBFR", " SFS ", + + 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'S', ComponentListMF.cogwork_shaft, + 'B', Blocks.furnace, }); + Salvage.addSalvage(BlockListMF.cogwork_chest, Blocks.furnace, new ItemStack(ComponentListMF.iron_frame, 5), + new ItemStack(ComponentListMF.cogwork_shaft, 4), new ItemStack(ComponentListMF.rivet, 6)); + time = 10; - KnowledgeListMF.cogLegsR = - MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_legs), "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, (int)(time*material.craftTimeModifier), new Object[] - { - "RFFFR", - "RS SR", - " S S ", - " F F ", - - 'F', ComponentListMF.iron_frame, - 'R', ComponentListMF.rivet, - 'S', ComponentListMF.cogwork_shaft, - }); - Salvage.addSalvage(BlockListMF.cogwork_legs, - new ItemStack(ComponentListMF.iron_frame, 5), - new ItemStack(ComponentListMF.cogwork_shaft, 4), - new ItemStack(ComponentListMF.rivet, 4)); - + KnowledgeListMF.cogLegsR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_legs), + "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[] { "RFFFR", "RS SR", " S S ", " F F ", + + 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'S', + ComponentListMF.cogwork_shaft, }); + Salvage.addSalvage(BlockListMF.cogwork_legs, new ItemStack(ComponentListMF.iron_frame, 5), + new ItemStack(ComponentListMF.cogwork_shaft, 4), new ItemStack(ComponentListMF.rivet, 4)); + } - - - public static final HashMaprecipeMap = new HashMap(); + + public static final HashMap recipeMap = new HashMap(); } diff --git a/src/main/java/minefantasy/mf2/recipe/RecipeArmourDyeMF.java b/src/main/java/minefantasy/mf2/recipe/RecipeArmourDyeMF.java index 0a308e3d..aa281e6d 100644 --- a/src/main/java/minefantasy/mf2/recipe/RecipeArmourDyeMF.java +++ b/src/main/java/minefantasy/mf2/recipe/RecipeArmourDyeMF.java @@ -11,150 +11,128 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; -public class RecipeArmourDyeMF implements IRecipe -{ - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(InventoryCrafting matrix, World world) - { - ItemStack itemstack = null; - ArrayList arraylist = new ArrayList(); - - for (int i = 0; i < matrix.getSizeInventory(); ++i) - { - ItemStack itemstack1 = matrix.getStackInSlot(i); - - if (itemstack1 != null) - { - if (itemstack1.getItem() instanceof ItemArmourMF) - { - ItemArmourMF itemarmor = (ItemArmourMF)itemstack1.getItem(); - - if (!itemarmor.canColour() || itemstack != null) - { - return false; - } - - itemstack = itemstack1; - } - else - { - if (itemstack1.getItem() != Items.dye) - { - return false; - } - - arraylist.add(itemstack1); - } - } - } - - return itemstack != null && !arraylist.isEmpty(); - } - - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(InventoryCrafting matrix) - { - ItemStack itemstack = null; - int[] aint = new int[3]; - int i = 0; - int j = 0; - ItemArmourMF itemarmor = null; - int k; - int l; - float f; - float f1; - int l1; - - for (k = 0; k < matrix.getSizeInventory(); ++k) - { - ItemStack itemstack1 = matrix.getStackInSlot(k); - - if (itemstack1 != null) - { - if (itemstack1.getItem() instanceof ItemArmourMF) - { - itemarmor = (ItemArmourMF)itemstack1.getItem(); - - if (!itemarmor.canColour() || itemstack != null) - { - return null; - } - - itemstack = itemstack1.copy(); - itemstack.stackSize = 1; - - if (itemarmor.hasColor(itemstack1)) - { - l = itemarmor.getColor(itemstack); - f = (l >> 16 & 255) / 255.0F; - f1 = (l >> 8 & 255) / 255.0F; - float f2 = (l & 255) / 255.0F; - i = (int)(i + Math.max(f, Math.max(f1, f2)) * 255.0F); - aint[0] = (int)(aint[0] + f * 255.0F); - aint[1] = (int)(aint[1] + f1 * 255.0F); - aint[2] = (int)(aint[2] + f2 * 255.0F); - ++j; - } - } - else - { - if (itemstack1.getItem() != Items.dye) - { - return null; - } - - float[] afloat = EntitySheep.fleeceColorTable[BlockColored.func_150032_b(itemstack1.getItemDamage())]; - int j1 = (int)(afloat[0] * 255.0F); - int k1 = (int)(afloat[1] * 255.0F); - l1 = (int)(afloat[2] * 255.0F); - i += Math.max(j1, Math.max(k1, l1)); - aint[0] += j1; - aint[1] += k1; - aint[2] += l1; - ++j; - } - } - } - - if (itemarmor == null) - { - return null; - } - else - { - k = aint[0] / j; - int i1 = aint[1] / j; - l = aint[2] / j; - f = (float)i / (float)j; - f1 = Math.max(k, Math.max(i1, l)); - k = (int)(k * f / f1); - i1 = (int)(i1 * f / f1); - l = (int)(l * f / f1); - l1 = (k << 8) + i1; - l1 = (l1 << 8) + l; - itemarmor.func_82813_b(itemstack, l1); - return itemstack; - } - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() - { - return 10; - } - - @Override - public ItemStack getRecipeOutput() - { - return null; - } +public class RecipeArmourDyeMF implements IRecipe { + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(InventoryCrafting matrix, World world) { + ItemStack itemstack = null; + ArrayList arraylist = new ArrayList(); + + for (int i = 0; i < matrix.getSizeInventory(); ++i) { + ItemStack itemstack1 = matrix.getStackInSlot(i); + + if (itemstack1 != null) { + if (itemstack1.getItem() instanceof ItemArmourMF) { + ItemArmourMF itemarmor = (ItemArmourMF) itemstack1.getItem(); + + if (!itemarmor.canColour() || itemstack != null) { + return false; + } + + itemstack = itemstack1; + } else { + if (itemstack1.getItem() != Items.dye) { + return false; + } + + arraylist.add(itemstack1); + } + } + } + + return itemstack != null && !arraylist.isEmpty(); + } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(InventoryCrafting matrix) { + ItemStack itemstack = null; + int[] aint = new int[3]; + int i = 0; + int j = 0; + ItemArmourMF itemarmor = null; + int k; + int l; + float f; + float f1; + int l1; + + for (k = 0; k < matrix.getSizeInventory(); ++k) { + ItemStack itemstack1 = matrix.getStackInSlot(k); + + if (itemstack1 != null) { + if (itemstack1.getItem() instanceof ItemArmourMF) { + itemarmor = (ItemArmourMF) itemstack1.getItem(); + + if (!itemarmor.canColour() || itemstack != null) { + return null; + } + + itemstack = itemstack1.copy(); + itemstack.stackSize = 1; + + if (itemarmor.hasColor(itemstack1)) { + l = itemarmor.getColor(itemstack); + f = (l >> 16 & 255) / 255.0F; + f1 = (l >> 8 & 255) / 255.0F; + float f2 = (l & 255) / 255.0F; + i = (int) (i + Math.max(f, Math.max(f1, f2)) * 255.0F); + aint[0] = (int) (aint[0] + f * 255.0F); + aint[1] = (int) (aint[1] + f1 * 255.0F); + aint[2] = (int) (aint[2] + f2 * 255.0F); + ++j; + } + } else { + if (itemstack1.getItem() != Items.dye) { + return null; + } + + float[] afloat = EntitySheep.fleeceColorTable[BlockColored + .func_150032_b(itemstack1.getItemDamage())]; + int j1 = (int) (afloat[0] * 255.0F); + int k1 = (int) (afloat[1] * 255.0F); + l1 = (int) (afloat[2] * 255.0F); + i += Math.max(j1, Math.max(k1, l1)); + aint[0] += j1; + aint[1] += k1; + aint[2] += l1; + ++j; + } + } + } + + if (itemarmor == null) { + return null; + } else { + k = aint[0] / j; + int i1 = aint[1] / j; + l = aint[2] / j; + f = (float) i / (float) j; + f1 = Math.max(k, Math.max(i1, l)); + k = (int) (k * f / f1); + i1 = (int) (i1 * f / f1); + l = (int) (l * f / f1); + l1 = (k << 8) + i1; + l1 = (l1 << 8) + l; + itemarmor.func_82813_b(itemstack, l1); + return itemstack; + } + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return 10; + } + + @Override + public ItemStack getRecipeOutput() { + return null; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/recipe/RecipeRemover.java b/src/main/java/minefantasy/mf2/recipe/RecipeRemover.java index 98c9a63f..dd4d3f51 100644 --- a/src/main/java/minefantasy/mf2/recipe/RecipeRemover.java +++ b/src/main/java/minefantasy/mf2/recipe/RecipeRemover.java @@ -6,35 +6,26 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -public class RecipeRemover -{ - public static void removeRecipes() - { +public class RecipeRemover { + public static void removeRecipes() { MFLogUtil.log("MineFantasy: Removing replaced recipes..."); - for(int a = 0; a < CraftingManager.getInstance().getRecipeList().size(); a ++) - { + for (int a = 0; a < CraftingManager.getInstance().getRecipeList().size(); a++) { IRecipe rec = (IRecipe) CraftingManager.getInstance().getRecipeList().get(a); - if(rec.getRecipeOutput() != null && willRemoveItem(rec.getRecipeOutput(), ConfigHardcore.HCCRemoveCraft)) - { + if (rec.getRecipeOutput() != null && willRemoveItem(rec.getRecipeOutput(), ConfigHardcore.HCCRemoveCraft)) { CraftingManager.getInstance().getRecipeList().remove(a); } } } - - private static boolean willRemoveItem(ItemStack item, boolean HCC) - { - if(item.getItem() == Items.stick)return true; - - if(HCC) - { - return item.getItem() == Items.bread - || item.getItem() == Items.pumpkin_pie - || item.getItem() == Items.cake - || item.getItem() == Items.flint_and_steel - || item.getItem() == Items.bucket - ;} + + private static boolean willRemoveItem(ItemStack item, boolean HCC) { + if (item.getItem() == Items.stick) + return true; + + if (HCC) { + return item.getItem() == Items.bread || item.getItem() == Items.pumpkin_pie || item.getItem() == Items.cake + || item.getItem() == Items.flint_and_steel || item.getItem() == Items.bucket; + } return false; } } diff --git a/src/main/java/minefantasy/mf2/recipe/RecipeSyringe.java b/src/main/java/minefantasy/mf2/recipe/RecipeSyringe.java index 9a99a118..27876018 100644 --- a/src/main/java/minefantasy/mf2/recipe/RecipeSyringe.java +++ b/src/main/java/minefantasy/mf2/recipe/RecipeSyringe.java @@ -1,108 +1,83 @@ package minefantasy.mf2.recipe; -import java.util.ArrayList; - -import minefantasy.mf2.item.armour.ItemArmourMF; -import minefantasy.mf2.item.gadget.ItemSyringe; import minefantasy.mf2.item.list.ToolListMF; -import net.minecraft.block.BlockColored; -import net.minecraft.entity.passive.EntitySheep; -import net.minecraft.init.Items; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemPotion; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; -public class RecipeSyringe implements IRecipe -{ - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(InventoryCrafting matrix, World world) - { - ItemStack syringe = null; - ItemStack filler = null; +public class RecipeSyringe implements IRecipe { + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(InventoryCrafting matrix, World world) { + ItemStack syringe = null; + ItemStack filler = null; - for (int i = 0; i < matrix.getSizeInventory(); ++i) - { - ItemStack itemstack1 = matrix.getStackInSlot(i); + for (int i = 0; i < matrix.getSizeInventory(); ++i) { + ItemStack itemstack1 = matrix.getStackInSlot(i); - if (itemstack1 != null) - { - if (itemstack1.getItem() == ToolListMF.syringe_empty) - { - syringe = itemstack1; - } - else if (itemstack1.getItem() instanceof ItemPotion) - { - ItemPotion potion = (ItemPotion)itemstack1.getItem(); + if (itemstack1 != null) { + if (itemstack1.getItem() == ToolListMF.syringe_empty) { + syringe = itemstack1; + } else if (itemstack1.getItem() instanceof ItemPotion) { + ItemPotion potion = (ItemPotion) itemstack1.getItem(); - if(potion.isSplash(itemstack1.getItemDamage())) - { - return false; - } + if (potion.isSplash(itemstack1.getItemDamage())) { + return false; + } - filler = itemstack1; - } - } - } + filler = itemstack1; + } + } + } - return syringe != null && filler != null; - } + return syringe != null && filler != null; + } - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(InventoryCrafting matrix) - { - ItemStack syringe = null; - ItemStack filler = null; + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(InventoryCrafting matrix) { + ItemStack syringe = null; + ItemStack filler = null; - for (int i = 0; i < matrix.getSizeInventory(); ++i) - { - ItemStack itemstack1 = matrix.getStackInSlot(i); + for (int i = 0; i < matrix.getSizeInventory(); ++i) { + ItemStack itemstack1 = matrix.getStackInSlot(i); - if (itemstack1 != null) - { - if (itemstack1.getItem() == ToolListMF.syringe_empty) - { - syringe = itemstack1; - } - else if (itemstack1.getItem() instanceof ItemPotion) - { - ItemPotion potion = (ItemPotion)itemstack1.getItem(); + if (itemstack1 != null) { + if (itemstack1.getItem() == ToolListMF.syringe_empty) { + syringe = itemstack1; + } else if (itemstack1.getItem() instanceof ItemPotion) { + ItemPotion potion = (ItemPotion) itemstack1.getItem(); - if(potion.isSplash(itemstack1.getItemDamage())) - { - return null; - } + if (potion.isSplash(itemstack1.getItemDamage())) { + return null; + } - filler = itemstack1; - } - } - } - if(syringe != null && filler != null) - { - return new ItemStack(ToolListMF.syringe, 1, filler.getItemDamage()); - } - return null; - } + filler = itemstack1; + } + } + } + if (syringe != null && filler != null) { + return new ItemStack(ToolListMF.syringe, 1, filler.getItemDamage()); + } + return null; + } - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() - { - return 10; - } + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return 10; + } - @Override - public ItemStack getRecipeOutput() - { - return null; - } + @Override + public ItemStack getRecipeOutput() { + return null; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/recipe/SalvageRecipes.java b/src/main/java/minefantasy/mf2/recipe/SalvageRecipes.java index 4b6bf92a..94fb3fe9 100644 --- a/src/main/java/minefantasy/mf2/recipe/SalvageRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/SalvageRecipes.java @@ -1,36 +1,31 @@ package minefantasy.mf2.recipe; -import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.api.crafting.Salvage; -import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.item.list.ComponentListMF; import net.minecraft.init.Blocks; import net.minecraft.init.Items; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class SalvageRecipes -{ - public static void init() - { +public class SalvageRecipes { + public static void init() { ItemStack ironHunk = ComponentListMF.metalHunk.createComm("iron"); Salvage.addSalvage(Items.wooden_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 3)); Salvage.addSalvage(Items.wooden_axe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 3)); Salvage.addSalvage(Items.wooden_shovel, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 1)); Salvage.addSalvage(Items.wooden_hoe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 2)); Salvage.addSalvage(Items.wooden_sword, new ItemStack(Items.stick, 1), new ItemStack(Blocks.planks, 2)); - + Salvage.addSalvage(Items.stone_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 3)); Salvage.addSalvage(Items.stone_axe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 3)); Salvage.addSalvage(Items.stone_shovel, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 1)); Salvage.addSalvage(Items.stone_hoe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 2)); Salvage.addSalvage(Items.stone_sword, new ItemStack(Items.stick, 1), new ItemStack(Blocks.cobblestone, 2)); - + Salvage.addSalvage(Items.leather_helmet, new ItemStack(Items.leather, 5)); Salvage.addSalvage(Items.leather_chestplate, new ItemStack(Items.leather, 8)); Salvage.addSalvage(Items.leather_leggings, new ItemStack(Items.leather, 7)); Salvage.addSalvage(Items.leather_boots, new ItemStack(Items.leather, 4)); - + Salvage.addSalvage(Items.iron_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 3)); Salvage.addSalvage(Items.iron_axe, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 3)); Salvage.addSalvage(Items.iron_shovel, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 1)); @@ -45,7 +40,7 @@ public static void init() Salvage.addSalvage(Items.iron_leggings, new ItemStack(Items.iron_ingot, 7)); Salvage.addSalvage(Items.iron_boots, new ItemStack(Items.iron_ingot, 4)); Salvage.addSalvage(Items.iron_horse_armor, Items.leather, new ItemStack(Items.iron_ingot, 8)); - + Salvage.addSalvage(Items.golden_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 3)); Salvage.addSalvage(Items.golden_axe, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 3)); Salvage.addSalvage(Items.golden_shovel, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 1)); @@ -56,7 +51,7 @@ public static void init() Salvage.addSalvage(Items.golden_leggings, new ItemStack(Items.gold_ingot, 7)); Salvage.addSalvage(Items.golden_boots, new ItemStack(Items.gold_ingot, 4)); Salvage.addSalvage(Items.golden_horse_armor, Items.leather, new ItemStack(Items.gold_ingot, 8)); - + Salvage.addSalvage(Items.diamond_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 3)); Salvage.addSalvage(Items.diamond_axe, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 3)); Salvage.addSalvage(Items.diamond_shovel, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 1)); @@ -67,7 +62,7 @@ public static void init() Salvage.addSalvage(Items.diamond_leggings, new ItemStack(Items.diamond, 7)); Salvage.addSalvage(Items.diamond_boots, new ItemStack(Items.diamond, 4)); Salvage.addSalvage(Items.diamond_horse_armor, Items.leather, new ItemStack(Items.diamond, 8)); - + Salvage.addSalvage(Items.flint_and_steel, Items.flint, Items.iron_ingot); Salvage.addSalvage(Items.compass, Items.redstone, new ItemStack(Items.iron_ingot, 4)); Salvage.addSalvage(Items.clock, Items.redstone, new ItemStack(Items.gold_ingot, 4)); @@ -76,12 +71,13 @@ public static void init() Salvage.addSalvage(Items.shears, new ItemStack(Items.iron_ingot, 2)); Salvage.addSalvage(Items.minecart, new ItemStack(Items.iron_ingot, 5)); Salvage.addSalvage(Items.boat, new ItemStack(Blocks.planks, 5)); - + Salvage.addSalvage(Blocks.furnace, new ItemStack(Blocks.cobblestone, 8)); Salvage.addSalvage(Blocks.dispenser, Items.bow, Items.redstone, new ItemStack(Blocks.cobblestone, 7)); Salvage.addSalvage(Blocks.dropper, Items.redstone, new ItemStack(Blocks.cobblestone, 7)); Salvage.addSalvage(Blocks.chest, new ItemStack(Blocks.planks, 8)); - Salvage.addSalvage(Blocks.piston, Items.redstone, Items.iron_ingot, new ItemStack(Blocks.cobblestone, 4), new ItemStack(Blocks.planks, 3)); + Salvage.addSalvage(Blocks.piston, Items.redstone, Items.iron_ingot, new ItemStack(Blocks.cobblestone, 4), + new ItemStack(Blocks.planks, 3)); Salvage.addSalvage(Blocks.sticky_piston, Items.slime_ball, Blocks.piston); Salvage.addSalvage(Items.wooden_door, new ItemStack(Blocks.planks, 6)); Salvage.addSalvage(Items.iron_door, new ItemStack(Items.iron_ingot, 6)); @@ -92,23 +88,28 @@ public static void init() Salvage.addSalvage(Items.book, new ItemStack(Items.paper, 3), Items.leather); Salvage.addSalvage(Items.brewing_stand, new ItemStack(Blocks.cobblestone, 3), Items.blaze_rod); Salvage.addSalvage(Items.carrot_on_a_stick, Items.carrot, Items.fishing_rod); - Salvage.addSalvage(Items.comparator, new ItemStack(Blocks.redstone_torch, 3), new ItemStack(Blocks.stone, 3), Items.quartz); + Salvage.addSalvage(Items.comparator, new ItemStack(Blocks.redstone_torch, 3), new ItemStack(Blocks.stone, 3), + Items.quartz); Salvage.addSalvage(Items.ender_eye, Items.ender_pearl, Items.blaze_powder); Salvage.addSalvage(Items.magma_cream, Items.blaze_powder, Items.slime_ball); Salvage.addSalvage(Items.painting, new ItemStack(Items.stick, 8), Blocks.wool); - Salvage.addSalvage(Items.repeater, new ItemStack(Blocks.stone, 3), new ItemStack(Blocks.redstone_torch, 2), Items.redstone); + Salvage.addSalvage(Items.repeater, new ItemStack(Blocks.stone, 3), new ItemStack(Blocks.redstone_torch, 2), + Items.redstone); Salvage.addSalvage(Items.saddle, Items.leather, 5); Salvage.addSalvage(Items.sign, new ItemStack(Blocks.planks, 2)); Salvage.addSalvage(Items.speckled_melon, new ItemStack(Items.gold_nugget, 8), Items.melon); Salvage.addSalvage(Blocks.activator_rail, Items.iron_ingot, Items.redstone); Salvage.addSalvage(Blocks.anvil, new ItemStack(Items.iron_ingot, 31)); - Salvage.addSalvage(Blocks.beacon, Items.nether_star, new ItemStack(Blocks.glass, 5), new ItemStack(Blocks.obsidian, 3)); + Salvage.addSalvage(Blocks.beacon, Items.nether_star, new ItemStack(Blocks.glass, 5), + new ItemStack(Blocks.obsidian, 3)); Salvage.addSalvage(Blocks.bookshelf, new ItemStack(Blocks.planks, 6), new ItemStack(Items.book, 3)); Salvage.addSalvage(Blocks.crafting_table, new ItemStack(Blocks.planks, 4)); - Salvage.addSalvage(Blocks.daylight_detector, new ItemStack(Blocks.glass, 3), new ItemStack(Blocks.wooden_slab, 3), new ItemStack(Items.quartz, 3)); + Salvage.addSalvage(Blocks.daylight_detector, new ItemStack(Blocks.glass, 3), + new ItemStack(Blocks.wooden_slab, 3), new ItemStack(Items.quartz, 3)); Salvage.addSalvage(Blocks.deadbush, new ItemStack(Items.stick, 4)); Salvage.addSalvage(Blocks.detector_rail, Blocks.rail, Blocks.stone_pressure_plate); - Salvage.addSalvage(Blocks.enchanting_table, new ItemStack(Blocks.obsidian, 4), new ItemStack(Items.diamond, 2), Items.book); + Salvage.addSalvage(Blocks.enchanting_table, new ItemStack(Blocks.obsidian, 4), new ItemStack(Items.diamond, 2), + Items.book); Salvage.addSalvage(Blocks.ender_chest, new ItemStack(Blocks.obsidian, 8), Items.ender_eye); Salvage.addSalvage(Blocks.fence, new ItemStack(Items.stick, 3)); Salvage.addSalvage(Blocks.fence_gate, new ItemStack(Blocks.planks, 2), new ItemStack(Items.stick, 4)); diff --git a/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java b/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java index cedeb736..fc66c4c4 100644 --- a/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java +++ b/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java @@ -1,11 +1,8 @@ package minefantasy.mf2.recipe; -import java.util.ArrayList; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.refine.BloomRecipe; -import minefantasy.mf2.api.refine.Alloy; import minefantasy.mf2.api.refine.BigFurnaceRecipes; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigHardcore; @@ -17,12 +14,9 @@ import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -public class SmeltingRecipesMF -{ - public static void init() - { +public class SmeltingRecipesMF { + public static void init() { ItemStack copper = ComponentListMF.bar("Copper"); ItemStack tin = ComponentListMF.bar("Tin"); ItemStack bronze = ComponentListMF.bar("Bronze"); @@ -42,148 +36,106 @@ public static void init() ItemStack mithium = ComponentListMF.bar("Mithium"); ItemStack ignotumite = ComponentListMF.bar("Ignotumite"); ItemStack enderforge = ComponentListMF.bar("Ender"); - - KnowledgeListMF.reStone = - MineFantasyAPI.addRatioAlloy(1, new ItemStack(BlockListMF.reinforced_stone, 4), 1, new Object[] - { - Blocks.stone,Blocks.stone,Blocks.stone,Blocks.stone, ComponentListMF.fireclay, iron, ComponentListMF.obsidian_rock - }); - if(ConfigHardcore.HCCreduceIngots) - { - if(MineFantasyAPI.removeSmelting(Blocks.iron_ore) && MineFantasyAPI.removeSmelting(Blocks.gold_ore)) - { + + KnowledgeListMF.reStone = MineFantasyAPI.addRatioAlloy(1, new ItemStack(BlockListMF.reinforced_stone, 4), 1, + new Object[] { Blocks.stone, Blocks.stone, Blocks.stone, Blocks.stone, ComponentListMF.fireclay, iron, + ComponentListMF.obsidian_rock }); + if (ConfigHardcore.HCCreduceIngots) { + if (MineFantasyAPI.removeSmelting(Blocks.iron_ore) && MineFantasyAPI.removeSmelting(Blocks.gold_ore)) { MFLogUtil.logDebug("Removed Ore Smelting (Hardcore Ingots"); - } - else - { + } else { MFLogUtil.logWarn("Failed to remove Ore smelting!"); } BloomRecipe.addRecipe(new ItemStack(Blocks.iron_ore), iron); BloomRecipe.addRecipe(new ItemStack(Blocks.gold_ore), gold); - + MineFantasyAPI.addFurnaceRecipe(new ItemStack(Blocks.iron_ore), iron, 0); MineFantasyAPI.addFurnaceRecipe(new ItemStack(Blocks.gold_ore), gold, 0); } - + refineRawOre(ComponentListMF.oreCopper, copper); refineRawOre(ComponentListMF.oreTin, tin); refineRawOre(ComponentListMF.oreIron, iron); refineRawOre(ComponentListMF.oreSilver, silver); refineRawOre(ComponentListMF.oreGold, gold); - + refineRawOre(BlockListMF.oreCopper, copper, 0.4F); refineRawOre(BlockListMF.oreTin, tin, 0.5F); refineRawOre(BlockListMF.oreSilver, silver, 0.9F); - + GameRegistry.addSmelting(BlockListMF.oreBorax, new ItemStack(ComponentListMF.flux_strong, 4), 0.25F); GameRegistry.addSmelting(BlockListMF.oreTungsten, new ItemStack(ComponentListMF.oreTungsten, 1), 0.25F); GameRegistry.addSmelting(BlockListMF.oreKaolinite, new ItemStack(ComponentListMF.kaolinite), 0.25F); GameRegistry.addSmelting(BlockListMF.oreNitre, new ItemStack(ComponentListMF.nitre, 4), 0.25F); GameRegistry.addSmelting(BlockListMF.oreSulfur, new ItemStack(ComponentListMF.sulfur, 4), 0.25F); GameRegistry.addSmelting(BlockListMF.oreClay, new ItemStack(Items.clay_ball, 4), 0.25F); - - //ALLOY - KnowledgeListMF.bronze = - MineFantasyAPI.addRatioAlloy(3, ComponentListMF.bar("bronze", 3), new Object[]{ - copper, copper, tin - }); - - KnowledgeListMF.obsidalloy = - MineFantasyAPI.addRatioAlloy(1, obsidian, 1, new Object[]{ - steel, - ComponentListMF.obsidian_rock, ComponentListMF.obsidian_rock, ComponentListMF.obsidian_rock, ComponentListMF.obsidian_rock, - ComponentListMF.flux_strong - }); - KnowledgeListMF.black = - MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[6], 2), 1, new Object[] - { - steel, steel, bronze, bronze, ComponentListMF.obsidian_rock - }); - - KnowledgeListMF.wolframiteR = - MineFantasyAPI.addRatioAlloy(1, tungsten, 1, new Object[]{ - Items.coal, Items.coal, Items.coal, Items.coal, ComponentListMF.oreTungsten, ComponentListMF.flux_strong, ComponentListMF.flux_strong, ComponentListMF.flux_strong, ComponentListMF.flux_strong - }); - MineFantasyAPI.addRatioAlloy(1, tungsten, 1, new Object[]{ - Items.coal, Items.coal, Items.coal, Items.coal, BlockListMF.oreTungsten, ComponentListMF.flux_strong, ComponentListMF.flux_strong, ComponentListMF.flux_strong, ComponentListMF.flux_strong - }); - - if(!ConfigHardcore.HCCreduceIngots) - { - KnowledgeListMF.steel = - MineFantasyAPI.addRatioAlloy(9, steel, 1, new Object[] - { - pigiron - }); + + // ALLOY + KnowledgeListMF.bronze = MineFantasyAPI.addRatioAlloy(3, ComponentListMF.bar("bronze", 3), + new Object[] { copper, copper, tin }); + + KnowledgeListMF.obsidalloy = MineFantasyAPI.addRatioAlloy(1, obsidian, 1, + new Object[] { steel, ComponentListMF.obsidian_rock, ComponentListMF.obsidian_rock, + ComponentListMF.obsidian_rock, ComponentListMF.obsidian_rock, ComponentListMF.flux_strong }); + KnowledgeListMF.black = MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[6], 2), 1, + new Object[] { steel, steel, bronze, bronze, ComponentListMF.obsidian_rock }); + + KnowledgeListMF.wolframiteR = MineFantasyAPI.addRatioAlloy(1, tungsten, 1, + new Object[] { Items.coal, Items.coal, Items.coal, Items.coal, ComponentListMF.oreTungsten, + ComponentListMF.flux_strong, ComponentListMF.flux_strong, ComponentListMF.flux_strong, + ComponentListMF.flux_strong }); + MineFantasyAPI.addRatioAlloy(1, tungsten, 1, + new Object[] { Items.coal, Items.coal, Items.coal, Items.coal, BlockListMF.oreTungsten, + ComponentListMF.flux_strong, ComponentListMF.flux_strong, ComponentListMF.flux_strong, + ComponentListMF.flux_strong }); + + if (!ConfigHardcore.HCCreduceIngots) { + KnowledgeListMF.steel = MineFantasyAPI.addRatioAlloy(9, steel, 1, new Object[] { pigiron }); } - KnowledgeListMF.red = - MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[9]), 1, new Object[] - { - steel, gold, Items.redstone, ComponentListMF.flux_strong, Items.blaze_powder - }); - - KnowledgeListMF.blue = - MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[11]), 1, new Object[] - { - steel, silver, new ItemStack(Items.dye, 1, 4), ComponentListMF.flux_strong, Items.blaze_powder - }); - - KnowledgeListMF.adamantium = - MineFantasyAPI.addRatioAlloy(2, ComponentListMF.bar("adamantium", 2), 2, new Object[] - { - BlockListMF.oreMythic, gold, gold - }); - - KnowledgeListMF.mithril = - MineFantasyAPI.addRatioAlloy(2, ComponentListMF.bar("mithril", 2), new Object[] - { - BlockListMF.oreMythic, silver, silver - }); - - KnowledgeListMF.ignotumite = - MineFantasyAPI.addRatioAlloy(2, ignotumite, 3, new Object[] - { - adamant, adamant, Items.emerald, Items.blaze_powder - }); - - KnowledgeListMF.mithium = - MineFantasyAPI.addRatioAlloy(2, mithium, 3, new Object[] - { - mithril, mithril, ComponentListMF.diamond_shards, Items.ghast_tear - }); - - KnowledgeListMF.enderforge = - MineFantasyAPI.addRatioAlloy(2, enderforge, 3, new Object[] - { - adamant, mithril, Items.ender_pearl, Items.ender_pearl - }); - + KnowledgeListMF.red = MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[9]), 1, + new Object[] { steel, gold, Items.redstone, ComponentListMF.flux_strong, Items.blaze_powder }); + + KnowledgeListMF.blue = MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[11]), 1, + new Object[] { steel, silver, new ItemStack(Items.dye, 1, 4), ComponentListMF.flux_strong, + Items.blaze_powder }); + + KnowledgeListMF.adamantium = MineFantasyAPI.addRatioAlloy(2, ComponentListMF.bar("adamantium", 2), 2, + new Object[] { BlockListMF.oreMythic, gold, gold }); + + KnowledgeListMF.mithril = MineFantasyAPI.addRatioAlloy(2, ComponentListMF.bar("mithril", 2), + new Object[] { BlockListMF.oreMythic, silver, silver }); + + KnowledgeListMF.ignotumite = MineFantasyAPI.addRatioAlloy(2, ignotumite, 3, + new Object[] { adamant, adamant, Items.emerald, Items.blaze_powder }); + + KnowledgeListMF.mithium = MineFantasyAPI.addRatioAlloy(2, mithium, 3, + new Object[] { mithril, mithril, ComponentListMF.diamond_shards, Items.ghast_tear }); + + KnowledgeListMF.enderforge = MineFantasyAPI.addRatioAlloy(2, enderforge, 3, + new Object[] { adamant, mithril, Items.ender_pearl, Items.ender_pearl }); + MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.iron_prep, ComponentListMF.bar("PigIron")); MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[6], black); MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[9], red); MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[11], blue); } - private static void refineRawOre(Item ore, ItemStack bar) - { + private static void refineRawOre(Item ore, ItemStack bar) { refineRawOre(ore, bar, 0F); } - private static void refineRawOre(Block ore, ItemStack bar) - { + + private static void refineRawOre(Block ore, ItemStack bar) { refineRawOre(ore, bar, 0F); } - private static void refineRawOre(Block ore, ItemStack bar, float xp) - { + + private static void refineRawOre(Block ore, ItemStack bar, float xp) { refineRawOre(Item.getItemFromBlock(ore), bar, xp); } - private static void refineRawOre(Item ore, ItemStack bar, float xp) - { - if(ConfigHardcore.HCCreduceIngots) - { + + private static void refineRawOre(Item ore, ItemStack bar, float xp) { + if (ConfigHardcore.HCCreduceIngots) { BloomRecipe.addRecipe(ore, bar); - } - else - { + } else { GameRegistry.addSmelting(ore, bar, xp); } BigFurnaceRecipes.addRecipe(new ItemStack(ore), bar, 0); diff --git a/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java b/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java index 245296ae..21d99a0c 100644 --- a/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java +++ b/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java @@ -3,129 +3,61 @@ import java.util.ArrayList; import java.util.Iterator; -import minefantasy.mf2.api.crafting.Salvage; -import minefantasy.mf2.api.crafting.tanning.TanningRecipe; +import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.item.ItemComponentMF; -import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.knowledge.KnowledgeListMF; -import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -import cpw.mods.fml.common.registry.GameRegistry; -public class TempRecipesMF -{ - public static void init() - { +public class TempRecipesMF { + public static void init() { ArrayList wood = CustomMaterial.getList("wood"); Iterator iteratorWood = wood.iterator(); - while(iteratorWood.hasNext()) - { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - assembleWoodVariations(customMat); - } - - //RESOURCES - + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + assembleWoodVariations(customMat); + } + + // RESOURCES + ItemStack steel = ComponentListMF.bar("Steel"); - - GameRegistry.addRecipe(new ItemStack(Blocks.rail, 64), new Object[] - { - "I I", - "ISI", - "I I", - 'I', steel, - 'S', Items.stick, - }); - - GameRegistry.addShapedRecipe(new ItemStack(Blocks.cobblestone), new Object[] - { - "C", - 'C', BlockListMF.cobble_brick - }); - GameRegistry.addShapedRecipe(new ItemStack(Blocks.cobblestone), new Object[] - { - "C", - 'C', BlockListMF.cobble_pavement - }); - KnowledgeListMF.stoneBricksR.add( - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cobble_brick, 4), new Object[] - { - "C C", - " ", - "C C", - 'C', Blocks.cobblestone - })); - KnowledgeListMF.stoneBricksR.add( - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cobble_pavement, 4), new Object[] - { - "CC", - "CC", - 'C', Blocks.cobblestone - })); - - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.reinforced_stone), new Object[] - { - "C", - 'C', BlockListMF.reinforced_stone_bricks - }); - KnowledgeListMF.stoneBricksR.add( - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.reinforced_stone_bricks, 4), new Object[] - { - "CC", - "CC", - 'C', BlockListMF.reinforced_stone - })); - - GameRegistry.addShapedRecipe(new ItemStack(Blocks.dirt), new Object[] - { - "C", - 'C', BlockListMF.mud_brick - }); - GameRegistry.addShapedRecipe(new ItemStack(Blocks.dirt), new Object[] - { - "C", - 'C', BlockListMF.mud_pavement - }); - KnowledgeListMF.stoneBricksR.add( - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.mud_brick, 4), new Object[] - { - "C C", - " ", - "C C", - 'C', Blocks.dirt - })); - KnowledgeListMF.stoneBricksR.add( - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.mud_pavement, 4), new Object[] - { - "CC", - "CC", - 'C', Blocks.dirt - })); - - - - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.framed_pane, 16), new Object[] - { - "GGG", - "GGG", - 'G', BlockListMF.framed_glass - }); - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.window_pane, 16), new Object[] - { - "GGG", - "GGG", - 'G', BlockListMF.window - }); - + + GameRegistry.addRecipe(new ItemStack(Blocks.rail, 64), + new Object[] { "I I", "ISI", "I I", 'I', steel, 'S', Items.stick, }); + + GameRegistry.addShapedRecipe(new ItemStack(Blocks.cobblestone), + new Object[] { "C", 'C', BlockListMF.cobble_brick }); + GameRegistry.addShapedRecipe(new ItemStack(Blocks.cobblestone), + new Object[] { "C", 'C', BlockListMF.cobble_pavement }); + KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cobble_brick, 4), + new Object[] { "C C", " ", "C C", 'C', Blocks.cobblestone })); + KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cobble_pavement, 4), + new Object[] { "CC", "CC", 'C', Blocks.cobblestone })); + + GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.reinforced_stone), + new Object[] { "C", 'C', BlockListMF.reinforced_stone_bricks }); + KnowledgeListMF.stoneBricksR + .add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.reinforced_stone_bricks, 4), + new Object[] { "CC", "CC", 'C', BlockListMF.reinforced_stone })); + + GameRegistry.addShapedRecipe(new ItemStack(Blocks.dirt), new Object[] { "C", 'C', BlockListMF.mud_brick }); + GameRegistry.addShapedRecipe(new ItemStack(Blocks.dirt), new Object[] { "C", 'C', BlockListMF.mud_pavement }); + KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.mud_brick, 4), + new Object[] { "C C", " ", "C C", 'C', Blocks.dirt })); + KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.mud_pavement, 4), + new Object[] { "CC", "CC", 'C', Blocks.dirt })); + + GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.framed_pane, 16), + new Object[] { "GGG", "GGG", 'G', BlockListMF.framed_glass }); + GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.window_pane, 16), + new Object[] { "GGG", "GGG", 'G', BlockListMF.window }); + } + private static void assembleWoodVariations(CustomMaterial material) { - + } } diff --git a/src/main/java/minefantasy/mf2/util/MFLogUtil.java b/src/main/java/minefantasy/mf2/util/MFLogUtil.java index 82b028a3..779ae0bb 100644 --- a/src/main/java/minefantasy/mf2/util/MFLogUtil.java +++ b/src/main/java/minefantasy/mf2/util/MFLogUtil.java @@ -7,29 +7,25 @@ public class MFLogUtil { - public static final Logger MF_LOGGER = FMLLog.getLogger(); - + public static final Logger MF_LOGGER = FMLLog.getLogger(); + public static final String PREFIX = "[MineFantasyII]: "; - - public static void log(String mes) - { + + public static void log(String mes) { FMLLog.info(PREFIX + mes); - // MF_LOGGER.log(Level.INFO, PREFIX + mes); + // MF_LOGGER.log(Level.INFO, PREFIX + mes); } - - public static void logWarn(String mes) - { + + public static void logWarn(String mes) { FMLLog.warning(PREFIX + "(warning) " + mes); - // MF_LOGGER.log(Level.WARN, PREFIX + mes); + // MF_LOGGER.log(Level.WARN, PREFIX + mes); } - - public static void logDebug(String mes) - { - if(MineFantasyII.isDebug()) - { - FMLLog.info(PREFIX + "(debug) " + mes); - // MF_LOGGER.debug(PREFIX + mes); + + public static void logDebug(String mes) { + if (MineFantasyII.isDebug()) { + FMLLog.info(PREFIX + "(debug) " + mes); + // MF_LOGGER.debug(PREFIX + mes); } } - + } diff --git a/src/main/java/mods/battlegear2/api/IAllowItem.java b/src/main/java/mods/battlegear2/api/IAllowItem.java index 78e9ffa1..f83d73d8 100644 --- a/src/main/java/mods/battlegear2/api/IAllowItem.java +++ b/src/main/java/mods/battlegear2/api/IAllowItem.java @@ -5,7 +5,8 @@ public interface IAllowItem { /** - * Returns true if the mainhand {@link ItemStack} allows the offhand {@link ItemStack} to be placed in the partner offhand slot - */ + * Returns true if the mainhand {@link ItemStack} allows the offhand + * {@link ItemStack} to be placed in the partner offhand slot + */ public boolean allowOffhand(ItemStack mainhand, ItemStack offhand); } diff --git a/src/main/java/mods/battlegear2/api/IDefaultRender.java b/src/main/java/mods/battlegear2/api/IDefaultRender.java index ce0d707c..780f94d1 100644 --- a/src/main/java/mods/battlegear2/api/IDefaultRender.java +++ b/src/main/java/mods/battlegear2/api/IDefaultRender.java @@ -3,38 +3,38 @@ import net.minecraftforge.client.IItemRenderer; /** - * Soon: - * Utility to use one of the default Battlegear2 renderer - * Implement in an item to get its renderer automatically registered - * This is obviously client-side only + * Soon: Utility to use one of the default Battlegear2 renderer Implement in an + * item to get its renderer automatically registered This is obviously + * client-side only */ public interface IDefaultRender { - public enum RenderType{ - Bow, - FlagPole, - Quiver, - Shield, - Spear, - HeraldryCrest,//Work in progress, not recommended for use - HeraldryItem//Work in progress, not recommended for use - } + public enum RenderType { + Bow, FlagPole, Quiver, Shield, Spear, HeraldryCrest, // Work in progress, not recommended for use + HeraldryItem// Work in progress, not recommended for use + } - /** - * Called before anything else - * @return false to disable all features of this interface - */ - public boolean useDefaultRenderer(); + /** + * Called before anything else + * + * @return false to disable all features of this interface + */ + public boolean useDefaultRenderer(); - /** - * Called when registering the {@link IItemRenderer} for this item - * @return the type of renderer to use - */ - public RenderType getRenderer(); + /** + * Called when registering the {@link IItemRenderer} for this item + * + * @return the type of renderer to use + */ + public RenderType getRenderer(); - /** - * Called by Battlegear2 configuration GUI when the rendering option is toggled - * Use this to react, using another renderer when this one is disabled for example - * @param isEnabled the new rendering state: on true, the renderer is going to be used, on false, it is disabled - */ - public void setRenderState(boolean isEnabled); + /** + * Called by Battlegear2 configuration GUI when the rendering option is toggled + * Use this to react, using another renderer when this one is disabled for + * example + * + * @param isEnabled + * the new rendering state: on true, the renderer is going to be + * used, on false, it is disabled + */ + public void setRenderState(boolean isEnabled); } diff --git a/src/main/java/mods/battlegear2/api/IDyable.java b/src/main/java/mods/battlegear2/api/IDyable.java index 17b3b466..31fde056 100644 --- a/src/main/java/mods/battlegear2/api/IDyable.java +++ b/src/main/java/mods/battlegear2/api/IDyable.java @@ -1,30 +1,27 @@ package mods.battlegear2.api; - import net.minecraft.item.ItemStack; //This is a tempory fix until we get the heraldry system up and running public interface IDyable { - /** - * Return whether the specified ItemStack has a color. - */ - public boolean hasColor(ItemStack par1ItemStack); - - - /** - * Return the color for the specified ItemStack. - */ - public int getColor(ItemStack par1ItemStack); + /** + * Return whether the specified ItemStack has a color. + */ + public boolean hasColor(ItemStack par1ItemStack); - public void setColor(ItemStack dyable, int rgb); + /** + * Return the color for the specified ItemStack. + */ + public int getColor(ItemStack par1ItemStack); - /** - * Remove the color from the specified ItemStack. - */ - public void removeColor(ItemStack par1ItemStack); + public void setColor(ItemStack dyable, int rgb); - public int getDefaultColor(ItemStack par1ItemStack); + /** + * Remove the color from the specified ItemStack. + */ + public void removeColor(ItemStack par1ItemStack); + public int getDefaultColor(ItemStack par1ItemStack); } diff --git a/src/main/java/mods/battlegear2/api/IEnchantable.java b/src/main/java/mods/battlegear2/api/IEnchantable.java index ea1e3c8a..f3ba33e4 100644 --- a/src/main/java/mods/battlegear2/api/IEnchantable.java +++ b/src/main/java/mods/battlegear2/api/IEnchantable.java @@ -6,8 +6,10 @@ public interface IEnchantable { /** - * If a Battlegear {@link BaseEnchantment} can be applied to this item, given the {@link ItemStack} - * @param baseEnchantment + * If a Battlegear {@link BaseEnchantment} can be applied to this item, given + * the {@link ItemStack} + * + * @param baseEnchantment * @param stack * @return */ diff --git a/src/main/java/mods/battlegear2/api/IOffhandDual.java b/src/main/java/mods/battlegear2/api/IOffhandDual.java index 1b21afd4..51773755 100644 --- a/src/main/java/mods/battlegear2/api/IOffhandDual.java +++ b/src/main/java/mods/battlegear2/api/IOffhandDual.java @@ -1,54 +1,71 @@ package mods.battlegear2.api; +import cpw.mods.fml.relauncher.Side; import net.minecraft.item.ItemStack; import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import cpw.mods.fml.relauncher.Side; public interface IOffhandDual { /** - * Returns true if the item can be dual wielded in the offhand slot - */ - public boolean isOffhandHandDual(ItemStack off); - - /** - * Perform any function when the item is held in the offhand and the user right clicks an entity. - * This is generally used to attack an entity with the offhand item. If this is the case the event should - * be canceled to prevent any default right clicking events (Eg Villager Trading) - * - * @param event the OffhandAttackEvent that was generated - * @param mainhandItem the ItemStack currently being held in the right hand - * @param offhandItem the ItemStack currently being held in the left hand - * @return true if the off hand swing animation should be performed - */ - public boolean offhandAttackEntity(PlayerEventChild.OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem); + * Returns true if the item can be dual wielded in the offhand slot + */ + public boolean isOffhandHandDual(ItemStack off); - /** - * Perform any function when the item is held in the offhand and the user right clicks "Air". - * - * @param event the PlayerInteractEvent that was generated - * @param mainhandItem the ItemStack currently being held in the right hand - * @param offhandItem the ItemStack currently being held in the left hand - * @return true if the off hand swing animation should be performed - */ - public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem); + /** + * Perform any function when the item is held in the offhand and the user right + * clicks an entity. This is generally used to attack an entity with the offhand + * item. If this is the case the event should be canceled to prevent any default + * right clicking events (Eg Villager Trading) + * + * @param event + * the OffhandAttackEvent that was generated + * @param mainhandItem + * the ItemStack currently being held in the right hand + * @param offhandItem + * the ItemStack currently being held in the left hand + * @return true if the off hand swing animation should be performed + */ + public boolean offhandAttackEntity(PlayerEventChild.OffhandAttackEvent event, ItemStack mainhandItem, + ItemStack offhandItem); - /** - * Perform any function when the item is held in the offhand and the user right clicks a block. - * Note that this will happen prior to the activation of any activation functions of blocks - * - * @param event the PlayerInteractEvent that was generated - * @param mainhandItem the ItemStack currently being held in the right hand - * @param offhandItem the ItemStack currently being held in the left hand - * @return true if the off hand swing animation should be performed - */ - public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem); + /** + * Perform any function when the item is held in the offhand and the user right + * clicks "Air". + * + * @param event + * the PlayerInteractEvent that was generated + * @param mainhandItem + * the ItemStack currently being held in the right hand + * @param offhandItem + * the ItemStack currently being held in the left hand + * @return true if the off hand swing animation should be performed + */ + public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem); - /** - * Perform any passive effects on each game tick when the item is held in the offhand - * - * @param effectiveSide the effective side the method was called from - * @param mainhandItem the ItemStack currently being held in the right hand - * @param offhandItem the ItemStack currently being held in the left hand - */ - public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem); + /** + * Perform any function when the item is held in the offhand and the user right + * clicks a block. Note that this will happen prior to the activation of any + * activation functions of blocks + * + * @param event + * the PlayerInteractEvent that was generated + * @param mainhandItem + * the ItemStack currently being held in the right hand + * @param offhandItem + * the ItemStack currently being held in the left hand + * @return true if the off hand swing animation should be performed + */ + public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem); + + /** + * Perform any passive effects on each game tick when the item is held in the + * offhand + * + * @param effectiveSide + * the effective side the method was called from + * @param mainhandItem + * the ItemStack currently being held in the right hand + * @param offhandItem + * the ItemStack currently being held in the left hand + */ + public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem); } diff --git a/src/main/java/mods/battlegear2/api/ISheathed.java b/src/main/java/mods/battlegear2/api/ISheathed.java index 441e7a98..174ee895 100644 --- a/src/main/java/mods/battlegear2/api/ISheathed.java +++ b/src/main/java/mods/battlegear2/api/ISheathed.java @@ -4,9 +4,12 @@ public interface ISheathed { - /** - * Returns true if the item should always be sheathed on the back, false if it should be sheathed on the hip - * @param item the {@link ItemStack} to be sheathed - */ - public boolean sheatheOnBack(ItemStack item); + /** + * Returns true if the item should always be sheathed on the back, false if it + * should be sheathed on the hip + * + * @param item + * the {@link ItemStack} to be sheathed + */ + public boolean sheatheOnBack(ItemStack item); } diff --git a/src/main/java/mods/battlegear2/api/PlayerEventChild.java b/src/main/java/mods/battlegear2/api/PlayerEventChild.java index 4a838f76..fdadf7ea 100644 --- a/src/main/java/mods/battlegear2/api/PlayerEventChild.java +++ b/src/main/java/mods/battlegear2/api/PlayerEventChild.java @@ -1,5 +1,6 @@ package mods.battlegear2.api; +import cpw.mods.fml.common.eventhandler.Cancelable; import mods.battlegear2.api.quiver.IArrowContainer2; import mods.battlegear2.api.shield.IShield; import net.minecraft.entity.Entity; @@ -12,13 +13,12 @@ import net.minecraftforge.event.entity.player.EntityInteractEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import cpw.mods.fml.common.eventhandler.Cancelable; -public abstract class PlayerEventChild extends PlayerEvent{ +public abstract class PlayerEventChild extends PlayerEvent { - /** - * The event that this event is a child of - */ + /** + * The event that this event is a child of + */ public final PlayerEvent parent; public PlayerEventChild(PlayerEvent parent) { @@ -26,210 +26,213 @@ public PlayerEventChild(PlayerEvent parent) { this.parent = parent; } - public void setCancelParentEvent(boolean cancel) { - parent.setCanceled(cancel); - } - - @Override - public void setCanceled(boolean cancel) { - super.setCanceled(cancel); - parent.setCanceled(cancel); - } - - @Override - public void setResult(Result value) { - super.setResult(value); - parent.setResult(value); - } - + public void setCancelParentEvent(boolean cancel) { + parent.setCanceled(cancel); + } + + @Override + public void setCanceled(boolean cancel) { + super.setCanceled(cancel); + parent.setCanceled(cancel); + } + + @Override + public void setResult(Result value) { + super.setResult(value); + parent.setResult(value); + } + /** - * Event fired when a shield successfully blocks an attack (in @link LivingHurtEvent) + * Event fired when a shield successfully blocks an attack (in @link + * LivingHurtEvent) */ - public static class ShieldBlockEvent extends PlayerEventChild { - public final ItemStack shield; - public final DamageSource source; - public final float ammount; // use same name as other Forge events - /** - * If the {@link IShield#blockAnimation(EntityPlayer, float)} should be called - */ - public boolean performAnimation = true; - /** - * If the shield should be damaged based on the ammount and the result of {@link IShield#getDamageReduction(ItemStack, DamageSource)} - */ - public boolean damageShield = true; - public ShieldBlockEvent(PlayerEvent parent, ItemStack shield, DamageSource source, float ammount) { - super(parent); - this.shield = shield; - this.source = source; - this.ammount = ammount; - } - } - - /** - * Called when a player right clicks in battlemode - * The parent event can be either {@link PlayerInteractEvent} or {@link EntityInteractEvent} if the OffhandAttackEvent allowed swinging - * Both ItemStack can be null - * If cancelled, no offhand swinging will be performed - */ - @Cancelable - public static class OffhandSwingEvent extends PlayerEventChild { - public final ItemStack mainHand; - public final ItemStack offHand; - public OffhandSwingEvent(PlayerEvent parent, ItemStack mainHand, ItemStack offHand){ - super(parent); - this.mainHand = mainHand; - this.offHand = offHand; - } - } - - /** - * Called when a player right clicks an entity in battlemode - * Both ItemStack can be null - * Cancelling will prevent any further processing and prevails over the boolean fields - */ - @Cancelable - public static class OffhandAttackEvent extends PlayerEventChild { - - /** - * If we should call the OffhandSwingEvent and perform swinging - */ - public boolean swingOffhand = true; - /** - * If we should perform an attack on the entity with the offhand item - */ - public boolean shouldAttack = true; - /** - * If we should cancel the base entity interaction event - */ - public boolean cancelParent = true; - public final EntityInteractEvent event; - public final ItemStack mainHand; - public final ItemStack offHand; - - public OffhandAttackEvent(EntityInteractEvent parent, ItemStack mainHand, ItemStack offHand) { - super(parent); - this.event = parent; - this.mainHand = mainHand; - this.offHand = offHand; - } - - public Entity getTarget() { - return event.target; - } - } - - public static class QuiverArrowEvent extends PlayerEventChild{ - /** - * The event from which this occurred - */ - protected final ArrowLooseEvent event; - public QuiverArrowEvent(ArrowLooseEvent event){ - super(event); - this.event = event; - } - - /** - * @return the player using the bow - */ - public EntityPlayer getArcher(){ - return event.entityPlayer; - } - - /** - * @return the bow trying to fire - */ - public ItemStack getBow() - { - return event.bow; - } - - /** - * @return the amount of charge in the bow - */ - public float getCharge() - { - return event.charge; - } - - /** - * Event fired after an arrow has been selected and taken from a {@link IArrowContainer2}, before it is actually spawned - */ - @Cancelable - public static class Firing extends QuiverArrowEvent { - /** - * Damage done to the bow after arrow is fired - */ - public int bowDamage = 1; - /** - * The volume of the sound emitted from the bow after arrow is fired - */ - public float bowSoundVolume = 1.0F; - /** - * Decides if standard enchantments can be added to the arrow - */ - public boolean addEnchantments = true; - /** - * Decides if critical state should be forced into the arrow - */ - public boolean isCritical = false; - /** - * The quiver from which the arrow was pulled from - */ - public final ItemStack quiver; - /** - * The arrow to be fired, can't be null - */ - public final EntityArrow arrow; - - public Firing(ArrowLooseEvent parent, ItemStack quiver, EntityArrow arrow) { - super(parent); - this.quiver = quiver; - this.arrow = arrow; - } - - } - - /** - * The DEFAULT result for this event is the vanilla charge calculated value - * Use setNewCharge to override the value with the one provided - * Change the event result to DENY to prevent further processing - */ - @HasResult - public static class ChargeCalculations extends QuiverArrowEvent { - /** - * Returned value if the result is set to allow - */ - protected float charge; - public ChargeCalculations(ArrowLooseEvent event){ - super(event); - } - - @Override - public float getCharge(){ - MinecraftForge.EVENT_BUS.post(this); - switch (this.getResult()){ - case ALLOW: - return charge; - case DENY: - return 0; - } - float f = super.getCharge()/20.0F; - f = (f * f + f * 2.0F) / 3.0F; - if (f < 0.1D) - { - return 0; - } - if (f > 1.0F) - { - f = 1.0F; - } - return f; - } - - public void setNewCharge(float charge){ - this.setResult(Result.ALLOW); - this.charge = charge; - } - } - } + public static class ShieldBlockEvent extends PlayerEventChild { + public final ItemStack shield; + public final DamageSource source; + public final float ammount; // use same name as other Forge events + /** + * If the {@link IShield#blockAnimation(EntityPlayer, float)} should be called + */ + public boolean performAnimation = true; + /** + * If the shield should be damaged based on the ammount and the result of + * {@link IShield#getDamageReduction(ItemStack, DamageSource)} + */ + public boolean damageShield = true; + + public ShieldBlockEvent(PlayerEvent parent, ItemStack shield, DamageSource source, float ammount) { + super(parent); + this.shield = shield; + this.source = source; + this.ammount = ammount; + } + } + + /** + * Called when a player right clicks in battlemode The parent event can be + * either {@link PlayerInteractEvent} or {@link EntityInteractEvent} if the + * OffhandAttackEvent allowed swinging Both ItemStack can be null If cancelled, + * no offhand swinging will be performed + */ + @Cancelable + public static class OffhandSwingEvent extends PlayerEventChild { + public final ItemStack mainHand; + public final ItemStack offHand; + + public OffhandSwingEvent(PlayerEvent parent, ItemStack mainHand, ItemStack offHand) { + super(parent); + this.mainHand = mainHand; + this.offHand = offHand; + } + } + + /** + * Called when a player right clicks an entity in battlemode Both ItemStack can + * be null Cancelling will prevent any further processing and prevails over the + * boolean fields + */ + @Cancelable + public static class OffhandAttackEvent extends PlayerEventChild { + + /** + * If we should call the OffhandSwingEvent and perform swinging + */ + public boolean swingOffhand = true; + /** + * If we should perform an attack on the entity with the offhand item + */ + public boolean shouldAttack = true; + /** + * If we should cancel the base entity interaction event + */ + public boolean cancelParent = true; + public final EntityInteractEvent event; + public final ItemStack mainHand; + public final ItemStack offHand; + + public OffhandAttackEvent(EntityInteractEvent parent, ItemStack mainHand, ItemStack offHand) { + super(parent); + this.event = parent; + this.mainHand = mainHand; + this.offHand = offHand; + } + + public Entity getTarget() { + return event.target; + } + } + + public static class QuiverArrowEvent extends PlayerEventChild { + /** + * The event from which this occurred + */ + protected final ArrowLooseEvent event; + + public QuiverArrowEvent(ArrowLooseEvent event) { + super(event); + this.event = event; + } + + /** + * @return the player using the bow + */ + public EntityPlayer getArcher() { + return event.entityPlayer; + } + + /** + * @return the bow trying to fire + */ + public ItemStack getBow() { + return event.bow; + } + + /** + * @return the amount of charge in the bow + */ + public float getCharge() { + return event.charge; + } + + /** + * Event fired after an arrow has been selected and taken from a + * {@link IArrowContainer2}, before it is actually spawned + */ + @Cancelable + public static class Firing extends QuiverArrowEvent { + /** + * Damage done to the bow after arrow is fired + */ + public int bowDamage = 1; + /** + * The volume of the sound emitted from the bow after arrow is fired + */ + public float bowSoundVolume = 1.0F; + /** + * Decides if standard enchantments can be added to the arrow + */ + public boolean addEnchantments = true; + /** + * Decides if critical state should be forced into the arrow + */ + public boolean isCritical = false; + /** + * The quiver from which the arrow was pulled from + */ + public final ItemStack quiver; + /** + * The arrow to be fired, can't be null + */ + public final EntityArrow arrow; + + public Firing(ArrowLooseEvent parent, ItemStack quiver, EntityArrow arrow) { + super(parent); + this.quiver = quiver; + this.arrow = arrow; + } + + } + + /** + * The DEFAULT result for this event is the vanilla charge calculated value Use + * setNewCharge to override the value with the one provided Change the event + * result to DENY to prevent further processing + */ + @HasResult + public static class ChargeCalculations extends QuiverArrowEvent { + /** + * Returned value if the result is set to allow + */ + protected float charge; + + public ChargeCalculations(ArrowLooseEvent event) { + super(event); + } + + @Override + public float getCharge() { + MinecraftForge.EVENT_BUS.post(this); + switch (this.getResult()) { + case ALLOW: + return charge; + case DENY: + return 0; + } + float f = super.getCharge() / 20.0F; + f = (f * f + f * 2.0F) / 3.0F; + if (f < 0.1D) { + return 0; + } + if (f > 1.0F) { + f = 1.0F; + } + return f; + } + + public void setNewCharge(float charge) { + this.setResult(Result.ALLOW); + this.charge = charge; + } + } + } } diff --git a/src/main/java/mods/battlegear2/api/RenderItemBarEvent.java b/src/main/java/mods/battlegear2/api/RenderItemBarEvent.java index d2632da4..5ca84ac0 100644 --- a/src/main/java/mods/battlegear2/api/RenderItemBarEvent.java +++ b/src/main/java/mods/battlegear2/api/RenderItemBarEvent.java @@ -1,79 +1,86 @@ package mods.battlegear2.api; +import cpw.mods.fml.common.eventhandler.Cancelable; import mods.battlegear2.api.quiver.IArrowContainer2; import mods.battlegear2.api.quiver.QuiverArrowRegistry; import mods.battlegear2.api.shield.IShield; import net.minecraft.item.ItemStack; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.MinecraftForge; -import cpw.mods.fml.common.eventhandler.Cancelable; /** * Events from {@link BattlegearInGameGUI} to {@link MinecraftForge.EVENT_BUS} * helping display HUD elements added to the in-game screen */ -public abstract class RenderItemBarEvent extends RenderGameOverlayEvent{ - /** - * Horizontal offset from the default position - */ - public int xOffset = 0; - /** - * Vertical offset from the default position - */ - public int yOffset = 0; +public abstract class RenderItemBarEvent extends RenderGameOverlayEvent { + /** + * Horizontal offset from the default position + */ + public int xOffset = 0; + /** + * Vertical offset from the default position + */ + public int yOffset = 0; - public RenderItemBarEvent(RenderGameOverlayEvent parent) { - super(parent.partialTicks, parent.resolution, parent.mouseX, parent.mouseY); - } + public RenderItemBarEvent(RenderGameOverlayEvent parent) { + super(parent.partialTicks, parent.resolution, parent.mouseX, parent.mouseY); + } - /** - * Event posted when the player uses the shield in the offhand, display a sort of "stamina bar" - */ + /** + * Event posted when the player uses the shield in the offhand, display a sort + * of "stamina bar" + */ @Cancelable public static class ShieldBar extends RenderItemBarEvent { - /** - * The stack containing the {@link IShield} item held by the player in his offhand - */ - public final ItemStack shield; + /** + * The stack containing the {@link IShield} item held by the player in his + * offhand + */ + public final ItemStack shield; + public ShieldBar(RenderGameOverlayEvent parent, ItemStack item) { super(parent); - this.shield = item; + this.shield = item; } } - /** - * Event posted when the player uses an item compatible with {@link QuiverArrowRegistry} - * that is, a bow and its valid {@link IArrowContainer2}, displaying all slots in it - */ + /** + * Event posted when the player uses an item compatible with + * {@link QuiverArrowRegistry} that is, a bow and its valid + * {@link IArrowContainer2}, displaying all slots in it + */ @Cancelable - public static class QuiverSlots extends RenderItemBarEvent{ - /** - * The stack containing the compatible bow held by the player in his mainhand - */ + public static class QuiverSlots extends RenderItemBarEvent { + /** + * The stack containing the compatible bow held by the player in his mainhand + */ public final ItemStack mainhand; - /** - * The stack containing the valid {@link IArrowContainer2} item - */ - public final ItemStack quiver; + /** + * The stack containing the valid {@link IArrowContainer2} item + */ + public final ItemStack quiver; + public QuiverSlots(RenderGameOverlayEvent parent, ItemStack mainhand, ItemStack item) { super(parent); this.mainhand = mainhand; - this.quiver = item; + this.quiver = item; } } - /** - * Event corresponding to the display of each additional hand slots - */ - @Cancelable - public static class BattleSlots extends RenderItemBarEvent{ - /** - * True if the slots are for the mainhand (on the "right"), false for the offhand (on the "left") - */ - public final boolean isMainHand; - public BattleSlots(RenderGameOverlayEvent parent, boolean isMainHand){ - super(parent); - this.isMainHand = isMainHand; - } - } + /** + * Event corresponding to the display of each additional hand slots + */ + @Cancelable + public static class BattleSlots extends RenderItemBarEvent { + /** + * True if the slots are for the mainhand (on the "right"), false for the + * offhand (on the "left") + */ + public final boolean isMainHand; + + public BattleSlots(RenderGameOverlayEvent parent, boolean isMainHand) { + super(parent); + this.isMainHand = isMainHand; + } + } } diff --git a/src/main/java/mods/battlegear2/api/core/IBattlePlayer.java b/src/main/java/mods/battlegear2/api/core/IBattlePlayer.java index 5521c10d..1e4843a8 100644 --- a/src/main/java/mods/battlegear2/api/core/IBattlePlayer.java +++ b/src/main/java/mods/battlegear2/api/core/IBattlePlayer.java @@ -5,23 +5,24 @@ /** * Interface added to {@link EntityPlayer} to support offhand management + * * @author GotoLink */ -public interface IBattlePlayer{ +public interface IBattlePlayer { - public void swingOffItem(); + public void swingOffItem(); - public float getOffSwingProgress(float frame); + public float getOffSwingProgress(float frame); - public void attackTargetEntityWithCurrentOffItem(Entity target); + public void attackTargetEntityWithCurrentOffItem(Entity target); - public boolean isBattlemode(); + public boolean isBattlemode(); - public boolean isBlockingWithShield(); + public boolean isBlockingWithShield(); - public void setBlockingWithShield(boolean block); + public void setBlockingWithShield(boolean block); - public int getSpecialActionTimer(); + public int getSpecialActionTimer(); - public void setSpecialActionTimer(int time); + public void setSpecialActionTimer(int time); } \ No newline at end of file diff --git a/src/main/java/mods/battlegear2/api/core/IOffhandRender.java b/src/main/java/mods/battlegear2/api/core/IOffhandRender.java index 037724fb..cad2aba7 100644 --- a/src/main/java/mods/battlegear2/api/core/IOffhandRender.java +++ b/src/main/java/mods/battlegear2/api/core/IOffhandRender.java @@ -4,26 +4,28 @@ import net.minecraft.item.ItemStack; /** - * Interface added to {@link ItemRenderer} to support offhand rendering - * Note that, they only provide access to added fields for the offhand, NOT the fields for the mainhand + * Interface added to {@link ItemRenderer} to support offhand rendering Note + * that, they only provide access to added fields for the offhand, NOT the + * fields for the mainhand + * * @author GotoLink */ public interface IOffhandRender { - public ItemStack getItemToRender(); + public ItemStack getItemToRender(); - public void setItemToRender(ItemStack item); + public void setItemToRender(ItemStack item); - public int getEquippedItemSlot(); + public int getEquippedItemSlot(); - public void setEquippedItemSlot(int slot); + public void setEquippedItemSlot(int slot); - public float getEquippedProgress(); + public float getEquippedProgress(); - public void setEquippedProgress(float progress); + public void setEquippedProgress(float progress); - public float getPrevEquippedProgress(); + public float getPrevEquippedProgress(); - public void setPrevEquippedProgress(float progress); + public void setPrevEquippedProgress(float progress); } diff --git a/src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java b/src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java index 9a1a1660..5cb919bd 100644 --- a/src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java +++ b/src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java @@ -1,5 +1,7 @@ package mods.battlegear2.api.core; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; @@ -7,366 +9,362 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; /** - * User: nerd-boy - * Date: 15/07/13 - * Time: 3:08 PM - * Replacement for the player inventory + * User: nerd-boy Date: 15/07/13 Time: 3:08 PM Replacement for the player + * inventory */ public class InventoryPlayerBattle extends InventoryPlayer { - public boolean hasChanged = true; - public static int ARMOR_OFFSET = 100; - public static int OFFSET = 150; - public static int WEAPON_SETS = 3; - - public static int EXTRA_ITEMS = WEAPON_SETS * 2; - public static int EXTRA_INV_SIZE = EXTRA_ITEMS + 6 + 6; - - public ItemStack[] extraItems; - - - public InventoryPlayerBattle(EntityPlayer entityPlayer) { - super(entityPlayer); - extraItems = new ItemStack[EXTRA_INV_SIZE]; - } - - public boolean isBattlemode() { - return this.currentItem >= OFFSET && this.currentItem < OFFSET + EXTRA_ITEMS; - } - - /** - * Returns a new slot index according to the type - * @param type determines which inventory array to expand - * @return the new slot index, or Integer.MIN_VALUE if it is not possible to expand further - */ - public int requestNewSlot(InventorySlotType type){ - ItemStack[] temp; - switch(type){ - case MAIN: - if(mainInventory.length+1= 0 && id < getHotbarSize()) || (id >= OFFSET && id < OFFSET + EXTRA_ITEMS); - } - - /** - * Returns a slot index in main inventory containing a specific itemID - */ - private int getInventorySlotContainItem(Item par1) { - for (int j = 0; j < this.extraItems.length; ++j) { - if (this.extraItems[j] != null && this.extraItems[j].getItem() == par1) { - return j; - } - } - return -1; - } - - @SideOnly(Side.CLIENT) - private int getInventorySlotContainItemAndDamage(Item par1, int par2) { - for (int k = 0; k < this.extraItems.length; ++k) { - if (this.extraItems[k] != null && this.extraItems[k].getItem() == par1 && this.extraItems[k].getItemDamage() == par2) { - return k; - } - } - return -1; - } - - @Override - public ItemStack getCurrentItem() { - return isBattlemode() ? extraItems[currentItem - OFFSET] : super.getCurrentItem(); - } - - @Override - @SideOnly(Side.CLIENT) - public void func_146030_a(Item par1, int par2, boolean par3, boolean par4) { - if (!isBattlemode()) - super.func_146030_a(par1, par2, par3, par4); - } - - @Override - @SideOnly(Side.CLIENT) - public void changeCurrentItem(int direction) { - hasChanged = true; - - if (isBattlemode()) { - - if (direction > 0){ - direction = 1; - }else if (direction != 0){ - direction = -1; - } - - //noinspection StatementWithEmptyBody - for (currentItem -= direction; currentItem < OFFSET; currentItem += WEAPON_SETS) { - } - - while (currentItem >= OFFSET + WEAPON_SETS) { - currentItem -= WEAPON_SETS; - } - - } else { - super.changeCurrentItem(direction); - } - } - - @Override - public int clearInventory(Item targetId, int targetDamage) { - hasChanged = true; - - int stacks = super.clearInventory(targetId, targetDamage); - - for (int i = 0; i < extraItems.length; i++) { - if (extraItems[i] != null && - (targetId == null || extraItems[i].getItem() == targetId) && - (targetDamage <= -1 || extraItems[i].getItemDamage() == targetDamage)) { - - stacks += extraItems[i].stackSize; - extraItems[i] = null; - } - } - - return stacks; - } - - /** - * Decrement the number of animations remaining. Only called on client side. This is used to handle the animation of - * receiving a block. - */ - @Override - public void decrementAnimations() { - super.decrementAnimations(); - for (int i = 0; i < this.extraItems.length; ++i) { - if (this.extraItems[i] != null) { - this.extraItems[i].updateAnimation(this.player.worldObj, this.player, i, this.currentItem + OFFSET == i); - } - } - } - - - /** - * removed one item of specified itemID from inventory (if it is in a stack, the stack size will reduce with 1) - */ - @Override - public boolean consumeInventoryItem(Item par1) { - int j = this.getInventorySlotContainItem(par1); - - if (j < 0) { - return super.consumeInventoryItem(par1); - } else { - hasChanged = true; - if (--this.extraItems[j].stackSize <= 0) { - this.extraItems[j] = null; - } - - return true; - } - } - - - /** - * Get if a specifiied item id is inside the inventory. - */ - @Override - public boolean hasItem(Item par1) { - if (super.hasItem(par1)) { - return true; - } else { - int j = this.getInventorySlotContainItem(par1); - return j >= 0; - } - } - - /** - * Adds the item stack to the inventory, returns false if it is impossible. - */ - @Override - public boolean addItemStackToInventory(ItemStack par1ItemStack) { - return super.addItemStackToInventory(par1ItemStack); - } - - @Override - public ItemStack decrStackSize(int slot, int amount) { - hasChanged = true; - if (slot >= OFFSET) { - ItemStack targetStack = extraItems[slot - OFFSET]; - - if (targetStack != null) { - - if (targetStack.stackSize <= amount) { - - extraItems[slot - OFFSET] = null; - return targetStack; - - } else { - - targetStack = extraItems[slot - OFFSET].splitStack(amount); - - if (extraItems[slot - OFFSET].stackSize == 0) { - extraItems[slot - OFFSET] = null; - } - - return targetStack; - } - } - - return null; - - } else { - return super.decrStackSize(slot, amount); - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - if (slot >= OFFSET) { - return extraItems[slot - OFFSET]; - } else { - return super.getStackInSlotOnClosing(slot); - } - } - - - @Override - public void setInventorySlotContents(int slot, ItemStack itemStack) { - setInventorySlotContents(slot, itemStack, true); - } - - public void setInventorySlotContents(int slot, ItemStack itemStack, boolean changed) { - hasChanged = changed; - if (slot >= OFFSET) { - extraItems[slot - OFFSET] = itemStack; - } else { - super.setInventorySlotContents(slot, itemStack); - } - } - - @Override - public float func_146023_a(Block block) { - if (isBattlemode()) { - ItemStack currentItemStack = getCurrentItem(); - return currentItemStack != null ? currentItemStack.func_150997_a(block) : 1.0F; - - } else { - return super.func_146023_a(block); - } - } - - @Override - public NBTTagList writeToNBT(NBTTagList par1nbtTagList) { - NBTTagList nbtList = super.writeToNBT(par1nbtTagList); - NBTTagCompound nbttagcompound; - - for (int i = 0; i < extraItems.length; ++i) { - if (extraItems[i] != null) { - nbttagcompound = new NBTTagCompound(); - //This will be -ve, but meh still works - nbttagcompound.setByte("Slot", (byte) (i + OFFSET)); - this.extraItems[i].writeToNBT(nbttagcompound); - nbtList.appendTag(nbttagcompound); - } - } - return nbtList; - } - - @Override - public void readFromNBT(NBTTagList nbtTagList) { - this.mainInventory = new ItemStack[mainInventory.length]; - this.armorInventory = new ItemStack[armorInventory.length]; - this.extraItems = new ItemStack[extraItems.length]; - - for (int i = 0; i < nbtTagList.tagCount(); ++i) { - NBTTagCompound nbttagcompound = nbtTagList.getCompoundTagAt(i); - int j = nbttagcompound.getByte("Slot") & 255; - ItemStack itemstack = ItemStack.loadItemStackFromNBT(nbttagcompound); - - if (itemstack != null) { - if (j >= 0 && j < this.mainInventory.length) { - this.mainInventory[j] = itemstack; - } - if (j >= ARMOR_OFFSET && j - ARMOR_OFFSET < this.armorInventory.length) { - this.armorInventory[j - ARMOR_OFFSET] = itemstack; - } - if (j >= OFFSET && j - OFFSET < this.extraItems.length) { - this.extraItems[j - OFFSET] = itemstack; - } - } - } - } - - @Override - public ItemStack getStackInSlot(int slot) { - if (slot >= OFFSET) { - return extraItems[slot - OFFSET]; - } else { - return super.getStackInSlot(slot); - } - } - - @Override - public int getSizeInventory() - { - return this.mainInventory.length + this.armorInventory.length; - } - - @Override - public void dropAllItems() { - super.dropAllItems(); - for (int i = 0; i < this.extraItems.length; ++i) { - if (this.extraItems[i] != null) { - this.player.func_146097_a(this.extraItems[i], true, false); - this.extraItems[i] = null; - } - } - } - - @Override - public void markDirty() { - super.markDirty(); - hasChanged = true; - } - - @Override - public void copyInventory(InventoryPlayer par1InventoryPlayer) { - hasChanged = true; - super.copyInventory(par1InventoryPlayer); - if (par1InventoryPlayer instanceof InventoryPlayerBattle) { - for (int i = 0; i < extraItems.length; i++) { - this.extraItems[i] = par1InventoryPlayer.getStackInSlot(i + OFFSET); - } - } - } - - public ItemStack getCurrentOffhandWeapon(){ - if(isBattlemode()){ - return getStackInSlot(currentItem+WEAPON_SETS); - }else{ - return null; - } - } + public boolean hasChanged = true; + public static int ARMOR_OFFSET = 100; + public static int OFFSET = 150; + public static int WEAPON_SETS = 3; + + public static int EXTRA_ITEMS = WEAPON_SETS * 2; + public static int EXTRA_INV_SIZE = EXTRA_ITEMS + 6 + 6; + + public ItemStack[] extraItems; + + public InventoryPlayerBattle(EntityPlayer entityPlayer) { + super(entityPlayer); + extraItems = new ItemStack[EXTRA_INV_SIZE]; + } + + public boolean isBattlemode() { + return this.currentItem >= OFFSET && this.currentItem < OFFSET + EXTRA_ITEMS; + } + + /** + * Returns a new slot index according to the type + * + * @param type + * determines which inventory array to expand + * @return the new slot index, or Integer.MIN_VALUE if it is not possible to + * expand further + */ + public int requestNewSlot(InventorySlotType type) { + ItemStack[] temp; + switch (type) { + case MAIN: + if (mainInventory.length + 1 < ARMOR_OFFSET) { + temp = new ItemStack[mainInventory.length + 1]; + System.arraycopy(mainInventory, 0, temp, 0, mainInventory.length); + mainInventory = temp; + return mainInventory.length;// Between 36 and 99 + } + break; + case ARMOR: + if (ARMOR_OFFSET + armorInventory.length + 1 < OFFSET) { + temp = new ItemStack[armorInventory.length + 1]; + System.arraycopy(armorInventory, 0, temp, 0, armorInventory.length); + armorInventory = temp; + return armorInventory.length;// Between 4 and 49 + } + break; + case BATTLE: + temp = new ItemStack[extraItems.length + 1]; + System.arraycopy(extraItems, 0, temp, 0, extraItems.length); + extraItems = temp; + return extraItems.length + OFFSET; + } + return Integer.MIN_VALUE;// Impossible because of byte cast in inventory NBT + } + + public static boolean isValidSwitch(int id) { + return (id >= 0 && id < getHotbarSize()) || (id >= OFFSET && id < OFFSET + EXTRA_ITEMS); + } + + /** + * Returns a slot index in main inventory containing a specific itemID + */ + private int getInventorySlotContainItem(Item par1) { + for (int j = 0; j < this.extraItems.length; ++j) { + if (this.extraItems[j] != null && this.extraItems[j].getItem() == par1) { + return j; + } + } + return -1; + } + + @SideOnly(Side.CLIENT) + private int getInventorySlotContainItemAndDamage(Item par1, int par2) { + for (int k = 0; k < this.extraItems.length; ++k) { + if (this.extraItems[k] != null && this.extraItems[k].getItem() == par1 + && this.extraItems[k].getItemDamage() == par2) { + return k; + } + } + return -1; + } + + @Override + public ItemStack getCurrentItem() { + return isBattlemode() ? extraItems[currentItem - OFFSET] : super.getCurrentItem(); + } + + @Override + @SideOnly(Side.CLIENT) + public void func_146030_a(Item par1, int par2, boolean par3, boolean par4) { + if (!isBattlemode()) + super.func_146030_a(par1, par2, par3, par4); + } + + @Override + @SideOnly(Side.CLIENT) + public void changeCurrentItem(int direction) { + hasChanged = true; + + if (isBattlemode()) { + + if (direction > 0) { + direction = 1; + } else if (direction != 0) { + direction = -1; + } + + // noinspection StatementWithEmptyBody + for (currentItem -= direction; currentItem < OFFSET; currentItem += WEAPON_SETS) { + } + + while (currentItem >= OFFSET + WEAPON_SETS) { + currentItem -= WEAPON_SETS; + } + + } else { + super.changeCurrentItem(direction); + } + } + + @Override + public int clearInventory(Item targetId, int targetDamage) { + hasChanged = true; + + int stacks = super.clearInventory(targetId, targetDamage); + + for (int i = 0; i < extraItems.length; i++) { + if (extraItems[i] != null && (targetId == null || extraItems[i].getItem() == targetId) + && (targetDamage <= -1 || extraItems[i].getItemDamage() == targetDamage)) { + + stacks += extraItems[i].stackSize; + extraItems[i] = null; + } + } + + return stacks; + } + + /** + * Decrement the number of animations remaining. Only called on client side. + * This is used to handle the animation of receiving a block. + */ + @Override + public void decrementAnimations() { + super.decrementAnimations(); + for (int i = 0; i < this.extraItems.length; ++i) { + if (this.extraItems[i] != null) { + this.extraItems[i].updateAnimation(this.player.worldObj, this.player, i, + this.currentItem + OFFSET == i); + } + } + } + + /** + * removed one item of specified itemID from inventory (if it is in a stack, the + * stack size will reduce with 1) + */ + @Override + public boolean consumeInventoryItem(Item par1) { + int j = this.getInventorySlotContainItem(par1); + + if (j < 0) { + return super.consumeInventoryItem(par1); + } else { + hasChanged = true; + if (--this.extraItems[j].stackSize <= 0) { + this.extraItems[j] = null; + } + + return true; + } + } + + /** + * Get if a specifiied item id is inside the inventory. + */ + @Override + public boolean hasItem(Item par1) { + if (super.hasItem(par1)) { + return true; + } else { + int j = this.getInventorySlotContainItem(par1); + return j >= 0; + } + } + + /** + * Adds the item stack to the inventory, returns false if it is impossible. + */ + @Override + public boolean addItemStackToInventory(ItemStack par1ItemStack) { + return super.addItemStackToInventory(par1ItemStack); + } + + @Override + public ItemStack decrStackSize(int slot, int amount) { + hasChanged = true; + if (slot >= OFFSET) { + ItemStack targetStack = extraItems[slot - OFFSET]; + + if (targetStack != null) { + + if (targetStack.stackSize <= amount) { + + extraItems[slot - OFFSET] = null; + return targetStack; + + } else { + + targetStack = extraItems[slot - OFFSET].splitStack(amount); + + if (extraItems[slot - OFFSET].stackSize == 0) { + extraItems[slot - OFFSET] = null; + } + + return targetStack; + } + } + + return null; + + } else { + return super.decrStackSize(slot, amount); + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + if (slot >= OFFSET) { + return extraItems[slot - OFFSET]; + } else { + return super.getStackInSlotOnClosing(slot); + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) { + setInventorySlotContents(slot, itemStack, true); + } + + public void setInventorySlotContents(int slot, ItemStack itemStack, boolean changed) { + hasChanged = changed; + if (slot >= OFFSET) { + extraItems[slot - OFFSET] = itemStack; + } else { + super.setInventorySlotContents(slot, itemStack); + } + } + + @Override + public float func_146023_a(Block block) { + if (isBattlemode()) { + ItemStack currentItemStack = getCurrentItem(); + return currentItemStack != null ? currentItemStack.func_150997_a(block) : 1.0F; + + } else { + return super.func_146023_a(block); + } + } + + @Override + public NBTTagList writeToNBT(NBTTagList par1nbtTagList) { + NBTTagList nbtList = super.writeToNBT(par1nbtTagList); + NBTTagCompound nbttagcompound; + + for (int i = 0; i < extraItems.length; ++i) { + if (extraItems[i] != null) { + nbttagcompound = new NBTTagCompound(); + // This will be -ve, but meh still works + nbttagcompound.setByte("Slot", (byte) (i + OFFSET)); + this.extraItems[i].writeToNBT(nbttagcompound); + nbtList.appendTag(nbttagcompound); + } + } + return nbtList; + } + + @Override + public void readFromNBT(NBTTagList nbtTagList) { + this.mainInventory = new ItemStack[mainInventory.length]; + this.armorInventory = new ItemStack[armorInventory.length]; + this.extraItems = new ItemStack[extraItems.length]; + + for (int i = 0; i < nbtTagList.tagCount(); ++i) { + NBTTagCompound nbttagcompound = nbtTagList.getCompoundTagAt(i); + int j = nbttagcompound.getByte("Slot") & 255; + ItemStack itemstack = ItemStack.loadItemStackFromNBT(nbttagcompound); + + if (itemstack != null) { + if (j >= 0 && j < this.mainInventory.length) { + this.mainInventory[j] = itemstack; + } + if (j >= ARMOR_OFFSET && j - ARMOR_OFFSET < this.armorInventory.length) { + this.armorInventory[j - ARMOR_OFFSET] = itemstack; + } + if (j >= OFFSET && j - OFFSET < this.extraItems.length) { + this.extraItems[j - OFFSET] = itemstack; + } + } + } + } + + @Override + public ItemStack getStackInSlot(int slot) { + if (slot >= OFFSET) { + return extraItems[slot - OFFSET]; + } else { + return super.getStackInSlot(slot); + } + } + + @Override + public int getSizeInventory() { + return this.mainInventory.length + this.armorInventory.length; + } + + @Override + public void dropAllItems() { + super.dropAllItems(); + for (int i = 0; i < this.extraItems.length; ++i) { + if (this.extraItems[i] != null) { + this.player.func_146097_a(this.extraItems[i], true, false); + this.extraItems[i] = null; + } + } + } + + @Override + public void markDirty() { + super.markDirty(); + hasChanged = true; + } + + @Override + public void copyInventory(InventoryPlayer par1InventoryPlayer) { + hasChanged = true; + super.copyInventory(par1InventoryPlayer); + if (par1InventoryPlayer instanceof InventoryPlayerBattle) { + for (int i = 0; i < extraItems.length; i++) { + this.extraItems[i] = par1InventoryPlayer.getStackInSlot(i + OFFSET); + } + } + } + + public ItemStack getCurrentOffhandWeapon() { + if (isBattlemode()) { + return getStackInSlot(currentItem + WEAPON_SETS); + } else { + return null; + } + } } diff --git a/src/main/java/mods/battlegear2/api/core/InventorySlotType.java b/src/main/java/mods/battlegear2/api/core/InventorySlotType.java index 1109ed0d..3f977bf8 100644 --- a/src/main/java/mods/battlegear2/api/core/InventorySlotType.java +++ b/src/main/java/mods/battlegear2/api/core/InventorySlotType.java @@ -4,16 +4,16 @@ * Created by GotoLink on 24/04/2014. */ public enum InventorySlotType { - /** - * The main inventory space - */ - MAIN, - /** - * The armor inventory space - */ - ARMOR, - /** - * The inventory space added by battlegear - */ - BATTLE + /** + * The main inventory space + */ + MAIN, + /** + * The armor inventory space + */ + ARMOR, + /** + * The inventory space added by battlegear + */ + BATTLE } diff --git a/src/main/java/mods/battlegear2/api/core/package-info.java b/src/main/java/mods/battlegear2/api/core/package-info.java index e799723c..aaf85e72 100644 --- a/src/main/java/mods/battlegear2/api/core/package-info.java +++ b/src/main/java/mods/battlegear2/api/core/package-info.java @@ -2,4 +2,3 @@ package mods.battlegear2.api.core; import cpw.mods.fml.common.API; - diff --git a/src/main/java/mods/battlegear2/api/heraldry/Crest.java b/src/main/java/mods/battlegear2/api/heraldry/Crest.java index 03f8c8a7..21d62843 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/Crest.java +++ b/src/main/java/mods/battlegear2/api/heraldry/Crest.java @@ -8,83 +8,81 @@ public class Crest { - public static int dataSize = 4 + 4 + 2 + 1 + 1 + 1; - private short imageIndex; - private int[] crestColours; - private byte size; - private byte x; - private byte y; - private byte[] byteArray; - - - public Crest(int[] crestColours, int imageIndex, byte size, byte x, byte y) { - this.crestColours = crestColours; - this.imageIndex = (short) imageIndex; - this.size = size; - this.x = x; - this.y = y; - } - - public Crest(byte[] crestData){ - DataInputStream input = null; - - try{ - input = new DataInputStream(new ByteArrayInputStream(crestData)); - - crestColours = new int[]{input.readInt(), input.readInt()}; - imageIndex = input.readShort(); - size = input.readByte(); - x = input.readByte(); - y = input.readByte(); - - - }catch (Exception e){ - e.printStackTrace(); - }finally { - try{ - if(input != null){ - input.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public byte[] getByteArray(){ - if(byteArray != null){ - return byteArray; - }else{ - DataOutputStream output = null; - - try{ - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - output = new DataOutputStream(bos); - - output.writeInt(crestColours[0]); - output.writeInt(crestColours[1]); - - output.writeShort(imageIndex); - output.writeInt(size); - output.writeByte(x); - output.writeByte(y); - - byteArray = bos.toByteArray(); - - return byteArray; - } catch (Exception e){ - e.printStackTrace(); - } finally { - try{ - if(output != null){ - output.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - return null; - } - } + public static int dataSize = 4 + 4 + 2 + 1 + 1 + 1; + private short imageIndex; + private int[] crestColours; + private byte size; + private byte x; + private byte y; + private byte[] byteArray; + + public Crest(int[] crestColours, int imageIndex, byte size, byte x, byte y) { + this.crestColours = crestColours; + this.imageIndex = (short) imageIndex; + this.size = size; + this.x = x; + this.y = y; + } + + public Crest(byte[] crestData) { + DataInputStream input = null; + + try { + input = new DataInputStream(new ByteArrayInputStream(crestData)); + + crestColours = new int[] { input.readInt(), input.readInt() }; + imageIndex = input.readShort(); + size = input.readByte(); + x = input.readByte(); + y = input.readByte(); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (input != null) { + input.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public byte[] getByteArray() { + if (byteArray != null) { + return byteArray; + } else { + DataOutputStream output = null; + + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + output = new DataOutputStream(bos); + + output.writeInt(crestColours[0]); + output.writeInt(crestColours[1]); + + output.writeShort(imageIndex); + output.writeInt(size); + output.writeByte(x); + output.writeByte(y); + + byteArray = bos.toByteArray(); + + return byteArray; + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (output != null) { + output.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + return null; + } + } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java index de0f8c9f..b22d6d56 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java +++ b/src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java @@ -11,154 +11,154 @@ public class HeraldryData { - public static final int RED = 1; - public static final int GREEN = 2; - public static final int BLUE = 3; - public static final int MAX_CRESTS = 6; - - private int storageIndex; - private byte pattern; - private int[] patternColours; - private byte[] extraData; - - private static final int extraDataSize = 6; - public static final HeraldryData defaultData = - new HeraldryData(0, (byte)0, Color.YELLOW.getRGB(), Color.BLUE.getRGB(), Color.BLACK.getRGB(), new ArrayList(), new byte[extraDataSize]); - - - private byte[] byteArray = null; - private List crests; - - public HeraldryData(int patternStoreIndex, byte pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3, List crests, byte[] extraData) { - this.storageIndex = patternStoreIndex; - this.pattern = pattern; - this.patternColours = new int[]{pattern_col_1, pattern_col_2, pattern_col_3}; - this.crests = crests; - this.extraData = extraData; - } - - public HeraldryData(byte[] crestData){ - DataInputStream input = null; - - try{ - input = new DataInputStream(new ByteArrayInputStream(crestData)); - - storageIndex = input.readInt(); - pattern = input.readByte(); - patternColours = new int[]{input.readInt(), input.readInt(), input.readInt()}; - byte crestCount = input.readByte(); - crests = new ArrayList(crestCount); - for(int i = 0; i < crestCount; i++){ - byte[] bytes = new byte[Crest.dataSize]; - input.read(bytes); - crests.add(new Crest(bytes)); - } - extraData = new byte[extraDataSize]; - for(int i = 0; i < extraDataSize; i++){ - extraData[i] = input.readByte(); - } - }catch (Exception e){ - e.printStackTrace(); - }finally { - try{ - if(input != null){ - input.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static HeraldryData getDefault() { - return defaultData; - } - - - public byte[] getByteArray(){ - if(byteArray != null){ - return byteArray; - }else{ - DataOutputStream output = null; - - try{ - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - output = new DataOutputStream(bos); - - output.writeInt(storageIndex); - output.writeByte(pattern); - output.writeInt(patternColours[0]); - output.writeInt(patternColours[1]); - output.writeInt(patternColours[2]); - output.writeByte(crests.size()); - for(Crest c: crests){ - output.write(c.getByteArray()); - } - output.write(extraData); - - byteArray = bos.toByteArray(); - - return byteArray; - } catch (Exception e){ - e.printStackTrace(); - } finally { - try{ - if(output != null){ - output.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - return null; - } - } - - public List getCrests() { - return crests; - } - - public byte[] getExtraData() { - return extraData; - } - - public int getPatternIndex(){ - return storageIndex; - } - - public byte getPattern() { - return pattern; - } - - public int getColour(int index) { - return patternColours[index]; - } - - public static String byteArrayToHex(byte[] a) { - StringBuilder sb = new StringBuilder(); - for(byte b: a) - sb.append(String.format("%02x", b&0xff)); - return sb.toString(); - } + public static final int RED = 1; + public static final int GREEN = 2; + public static final int BLUE = 3; + public static final int MAX_CRESTS = 6; + + private int storageIndex; + private byte pattern; + private int[] patternColours; + private byte[] extraData; + + private static final int extraDataSize = 6; + public static final HeraldryData defaultData = new HeraldryData(0, (byte) 0, Color.YELLOW.getRGB(), + Color.BLUE.getRGB(), Color.BLACK.getRGB(), new ArrayList(), new byte[extraDataSize]); + + private byte[] byteArray = null; + private List crests; + + public HeraldryData(int patternStoreIndex, byte pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3, + List crests, byte[] extraData) { + this.storageIndex = patternStoreIndex; + this.pattern = pattern; + this.patternColours = new int[] { pattern_col_1, pattern_col_2, pattern_col_3 }; + this.crests = crests; + this.extraData = extraData; + } + + public HeraldryData(byte[] crestData) { + DataInputStream input = null; + + try { + input = new DataInputStream(new ByteArrayInputStream(crestData)); + + storageIndex = input.readInt(); + pattern = input.readByte(); + patternColours = new int[] { input.readInt(), input.readInt(), input.readInt() }; + byte crestCount = input.readByte(); + crests = new ArrayList(crestCount); + for (int i = 0; i < crestCount; i++) { + byte[] bytes = new byte[Crest.dataSize]; + input.read(bytes); + crests.add(new Crest(bytes)); + } + extraData = new byte[extraDataSize]; + for (int i = 0; i < extraDataSize; i++) { + extraData[i] = input.readByte(); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (input != null) { + input.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static HeraldryData getDefault() { + return defaultData; + } + + public byte[] getByteArray() { + if (byteArray != null) { + return byteArray; + } else { + DataOutputStream output = null; + + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + output = new DataOutputStream(bos); + + output.writeInt(storageIndex); + output.writeByte(pattern); + output.writeInt(patternColours[0]); + output.writeInt(patternColours[1]); + output.writeInt(patternColours[2]); + output.writeByte(crests.size()); + for (Crest c : crests) { + output.write(c.getByteArray()); + } + output.write(extraData); + + byteArray = bos.toByteArray(); + + return byteArray; + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (output != null) { + output.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + return null; + } + } + + public List getCrests() { + return crests; + } + + public byte[] getExtraData() { + return extraData; + } + + public int getPatternIndex() { + return storageIndex; + } + + public byte getPattern() { + return pattern; + } + + public int getColour(int index) { + return patternColours[index]; + } + + public static String byteArrayToHex(byte[] a) { + StringBuilder sb = new StringBuilder(); + for (byte b : a) + sb.append(String.format("%02x", b & 0xff)); + return sb.toString(); + } public void setColour(int i, int rgb) { patternColours[i] = rgb; byteArray = null; } - public void setPatternIndex(int index){ - this.storageIndex = index; - byteArray = null; - } + public void setPatternIndex(int index) { + this.storageIndex = index; + byteArray = null; + } public void setPattern(int pattern) { - this.pattern = (byte)pattern; + this.pattern = (byte) pattern; byteArray = null; } @Override - public HeraldryData clone(){ - return new HeraldryData(storageIndex, pattern, patternColours[0], patternColours[1], patternColours[2], crests, extraData); + public HeraldryData clone() { + return new HeraldryData(storageIndex, pattern, patternColours[0], patternColours[1], patternColours[2], crests, + extraData); } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java index 286b13f3..785c29a6 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java +++ b/src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java @@ -10,142 +10,142 @@ @SuppressWarnings("unused") public class HeraldryDataBackup { - - public static final int RED = 1; - public static final int GREEN = 2; - public static final int BLUE = 3; - - private byte pattern; - private short crest; - private byte crestPosition; - private int[] colours = new int[5]; - - private byte helm; - private byte banner; - - private byte[] byteArray = null; - - public HeraldryDataBackup(int pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3, int crest, int crest_col_1, int crest_col_2, int crest_position, int helm, int banner) { - this.pattern = (byte) pattern; - this.crest = (short) crest; - colours = new int[]{pattern_col_1, pattern_col_2, pattern_col_3, crest_col_1, crest_col_2}; - this.crestPosition = (byte) crest_position; - this.helm = (byte) helm; - this.banner = (byte) banner; - } - - public HeraldryDataBackup(byte pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3){ - this(pattern, pattern_col_1, pattern_col_2, pattern_col_3, 0, 0, 0,0, 0, 0); - } - - public HeraldryDataBackup(byte[] data){ - DataInputStream input = null; - - try{ - input = new DataInputStream(new ByteArrayInputStream(data)); - - pattern = input.readByte(); - crest = input.readShort(); - crestPosition = input.readByte(); - colours= new int[5]; - for(int i = 0; i < colours.length; i++){ - colours[i] = input.readInt(); - } - - helm = input.readByte(); - banner = input.readByte(); - - byteArray = Arrays.copyOf(data, data.length); - - }catch (Exception e){ - e.printStackTrace(); - }finally { - try{ - if(input != null){ - input.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static HeraldryDataBackup getDefault() { - return new HeraldryDataBackup(10, 0xFF000000, 0xFFFFFFFF, 0xFFFFFF00, 0, 0xFF000000, 0xFF000000, 0, 0, 0); - } - - public byte[] getByteArray(){ - - if(byteArray != null){ - return byteArray; - } - - DataOutputStream output = null; - - try{ - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - output = new DataOutputStream(bos); - - output.writeByte(pattern); - output.writeShort(crest); - output.writeByte(crestPosition); - for(int i = 0; i < 5; i++){ - output.writeInt(colours[i]); - } - - output.writeByte(helm); - output.writeByte(banner); - - return bos.toByteArray(); - } catch (Exception e){ - e.printStackTrace(); - } finally { - try{ - if(output != null){ - output.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - return null; - } - - public int getColourChanel(int colour, int chanelNo){ - switch (chanelNo){ - case RED: - return (colours[colour] >> 16) & 0xFF; - case GREEN: - return (colours[colour] >> 8) & 0xFF; - case BLUE: - return (colours[colour] >> 0) & 0xFF; - default: - return (colours[colour] >> 16) & 0xFF; - } - } - - public byte getPattern() { - return pattern; - } - - public int getColour(int i) { - return colours[i]; - } - - @Override - public String toString() { - return byteArrayToHex(getByteArray()); - } - - public static String byteArrayToHex(byte[] a) { - StringBuilder sb = new StringBuilder(); - for(byte b: a) - sb.append(String.format("%02x", b&0xff)); - return sb.toString(); - } - - public short getCrest() { - return crest; - } + public static final int RED = 1; + public static final int GREEN = 2; + public static final int BLUE = 3; + + private byte pattern; + private short crest; + private byte crestPosition; + private int[] colours = new int[5]; + + private byte helm; + private byte banner; + + private byte[] byteArray = null; + + public HeraldryDataBackup(int pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3, int crest, + int crest_col_1, int crest_col_2, int crest_position, int helm, int banner) { + this.pattern = (byte) pattern; + this.crest = (short) crest; + colours = new int[] { pattern_col_1, pattern_col_2, pattern_col_3, crest_col_1, crest_col_2 }; + this.crestPosition = (byte) crest_position; + this.helm = (byte) helm; + this.banner = (byte) banner; + } + + public HeraldryDataBackup(byte pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3) { + this(pattern, pattern_col_1, pattern_col_2, pattern_col_3, 0, 0, 0, 0, 0, 0); + } + + public HeraldryDataBackup(byte[] data) { + DataInputStream input = null; + + try { + input = new DataInputStream(new ByteArrayInputStream(data)); + + pattern = input.readByte(); + crest = input.readShort(); + crestPosition = input.readByte(); + colours = new int[5]; + for (int i = 0; i < colours.length; i++) { + colours[i] = input.readInt(); + } + + helm = input.readByte(); + banner = input.readByte(); + + byteArray = Arrays.copyOf(data, data.length); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (input != null) { + input.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static HeraldryDataBackup getDefault() { + return new HeraldryDataBackup(10, 0xFF000000, 0xFFFFFFFF, 0xFFFFFF00, 0, 0xFF000000, 0xFF000000, 0, 0, 0); + } + + public byte[] getByteArray() { + + if (byteArray != null) { + return byteArray; + } + + DataOutputStream output = null; + + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + output = new DataOutputStream(bos); + + output.writeByte(pattern); + output.writeShort(crest); + output.writeByte(crestPosition); + for (int i = 0; i < 5; i++) { + output.writeInt(colours[i]); + } + + output.writeByte(helm); + output.writeByte(banner); + + return bos.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (output != null) { + output.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + return null; + } + + public int getColourChanel(int colour, int chanelNo) { + switch (chanelNo) { + case RED: + return (colours[colour] >> 16) & 0xFF; + case GREEN: + return (colours[colour] >> 8) & 0xFF; + case BLUE: + return (colours[colour] >> 0) & 0xFF; + default: + return (colours[colour] >> 16) & 0xFF; + } + } + + public byte getPattern() { + return pattern; + } + + public int getColour(int i) { + return colours[i]; + } + + @Override + public String toString() { + return byteArrayToHex(getByteArray()); + } + + public static String byteArrayToHex(byte[] a) { + StringBuilder sb = new StringBuilder(); + for (byte b : a) + sb.append(String.format("%02x", b & 0xff)); + return sb.toString(); + } + + public short getCrest() { + return crest; + } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java index 772a9214..9ca3295a 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java +++ b/src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java @@ -9,43 +9,43 @@ @Deprecated public class HeraldryPattern { - public static List patterns = new ArrayList(); - public static final HeraldryPattern VERTICAL_BLOCK = new HeraldryPattern("battlegear2","patterns/pattern-0"); - public static final HeraldryPattern HORIZONTAL_BLOCK= new HeraldryPattern("battlegear2","patterns/pattern-1"); - public static final HeraldryPattern QUARTERD= new HeraldryPattern("battlegear2","patterns/pattern-2"); - public static final HeraldryPattern HORIZONTAL_MID= new HeraldryPattern("battlegear2","patterns/pattern-3"); - public static final HeraldryPattern VERTICAL_MID= new HeraldryPattern("battlegear2","patterns/pattern-4"); - public static final HeraldryPattern HORIZONTAL_BAR= new HeraldryPattern("battlegear2","patterns/pattern-5"); - public static final HeraldryPattern VERTICAL_BAR= new HeraldryPattern("battlegear2","patterns/pattern-6"); - public static final HeraldryPattern SMALL_CHECKERED= new HeraldryPattern("battlegear2","patterns/pattern-7"); - public static final HeraldryPattern DIAG_DOWN= new HeraldryPattern("battlegear2","patterns/pattern-8"); - public static final HeraldryPattern DIAG_UP= new HeraldryPattern("battlegear2","patterns/pattern-9"); - public static final HeraldryPattern LOWER_TRIANGLE= new HeraldryPattern("battlegear2","patterns/pattern-10"); - public static final HeraldryPattern UPPER_TRIANGLE= new HeraldryPattern("battlegear2","patterns/pattern-11"); - public static final HeraldryPattern VERTICAL_TRIANGLES= new HeraldryPattern("battlegear2","patterns/pattern-12"); - public static final HeraldryPattern UP_ARROW= new HeraldryPattern("battlegear2","patterns/pattern-13"); - public static final HeraldryPattern CROSS= new HeraldryPattern("battlegear2","patterns/pattern-14"); - public static final HeraldryPattern DIAG_CROSS= new HeraldryPattern("battlegear2","patterns/pattern-15"); + public static List patterns = new ArrayList(); + public static final HeraldryPattern VERTICAL_BLOCK = new HeraldryPattern("battlegear2", "patterns/pattern-0"); + public static final HeraldryPattern HORIZONTAL_BLOCK = new HeraldryPattern("battlegear2", "patterns/pattern-1"); + public static final HeraldryPattern QUARTERD = new HeraldryPattern("battlegear2", "patterns/pattern-2"); + public static final HeraldryPattern HORIZONTAL_MID = new HeraldryPattern("battlegear2", "patterns/pattern-3"); + public static final HeraldryPattern VERTICAL_MID = new HeraldryPattern("battlegear2", "patterns/pattern-4"); + public static final HeraldryPattern HORIZONTAL_BAR = new HeraldryPattern("battlegear2", "patterns/pattern-5"); + public static final HeraldryPattern VERTICAL_BAR = new HeraldryPattern("battlegear2", "patterns/pattern-6"); + public static final HeraldryPattern SMALL_CHECKERED = new HeraldryPattern("battlegear2", "patterns/pattern-7"); + public static final HeraldryPattern DIAG_DOWN = new HeraldryPattern("battlegear2", "patterns/pattern-8"); + public static final HeraldryPattern DIAG_UP = new HeraldryPattern("battlegear2", "patterns/pattern-9"); + public static final HeraldryPattern LOWER_TRIANGLE = new HeraldryPattern("battlegear2", "patterns/pattern-10"); + public static final HeraldryPattern UPPER_TRIANGLE = new HeraldryPattern("battlegear2", "patterns/pattern-11"); + public static final HeraldryPattern VERTICAL_TRIANGLES = new HeraldryPattern("battlegear2", "patterns/pattern-12"); + public static final HeraldryPattern UP_ARROW = new HeraldryPattern("battlegear2", "patterns/pattern-13"); + public static final HeraldryPattern CROSS = new HeraldryPattern("battlegear2", "patterns/pattern-14"); + public static final HeraldryPattern DIAG_CROSS = new HeraldryPattern("battlegear2", "patterns/pattern-15"); private IIcon icon; public final String name; - public final String mod; - - public HeraldryPattern(String modid, String name){ - this.mod = modid; + public final String mod; + + public HeraldryPattern(String modid, String name) { + this.mod = modid; this.name = name; - patterns.add(this); + patterns.add(this); } - - public String getPath(){ - return "assets/"+mod+"/textures/items/heraldry/"+name+".png"; + + public String getPath() { + return "assets/" + mod + "/textures/items/heraldry/" + name + ".png"; } public IIcon getIcon() { return icon; } - public void registerIcon(TextureMap map){ - this.icon = map.registerIcon(mod+":heraldry/"+name); + public void registerIcon(TextureMap map) { + this.icon = map.registerIcon(mod + ":heraldry/" + name); } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java index d603e749..0be7c481 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java +++ b/src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java @@ -8,24 +8,24 @@ public class HeraldryTextureSmall extends AbstractTexture { - private HeraldryData heraldryData; - - public HeraldryTextureSmall(HeraldryData crest) { - this.heraldryData = crest; - } - - @Override - public void loadTexture(IResourceManager resourcemanager) { - int [][][][] patt = PatternStore.DEFAULT.patterns.get(heraldryData.getPatternIndex()); - BufferedImage image = new BufferedImage(patt[heraldryData.getPattern()][0].length, patt[heraldryData.getPattern()][0][0].length,BufferedImage.TYPE_4BYTE_ABGR); - - for(int x = 0; x < image.getWidth(); x++){ - for(int y = 0; y < image.getHeight(); y++){ - image.setRGB(x, y, PatternStore.getBlendedSmallPixel(patt, heraldryData.getPattern(), x, y, heraldryData.getColour(0), heraldryData.getColour(1), heraldryData.getColour(2))); - } - } - TextureUtil.uploadTextureImage(this.getGlTextureId(), image); - } + private HeraldryData heraldryData; + + public HeraldryTextureSmall(HeraldryData crest) { + this.heraldryData = crest; + } + + @Override + public void loadTexture(IResourceManager resourcemanager) { + int[][][][] patt = PatternStore.DEFAULT.patterns.get(heraldryData.getPatternIndex()); + BufferedImage image = new BufferedImage(patt[heraldryData.getPattern()][0].length, + patt[heraldryData.getPattern()][0][0].length, BufferedImage.TYPE_4BYTE_ABGR); + + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + image.setRGB(x, y, PatternStore.getBlendedSmallPixel(patt, heraldryData.getPattern(), x, y, + heraldryData.getColour(0), heraldryData.getColour(1), heraldryData.getColour(2))); + } + } + TextureUtil.uploadTextureImage(this.getGlTextureId(), image); + } } - - diff --git a/src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java b/src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java index 6f2bc935..1800d3a8 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java +++ b/src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java @@ -9,36 +9,39 @@ */ public interface IFlagHolder { - /** - * Remove all contained flags - */ - public void clearFlags(); - - /** - * Add given flag to the TileEntity - * @param flag The flag to add - * return true if flag could be added - */ - public boolean addFlag(ItemStack flag); - - /** - * - * @return All flags currently contained, empty list if none - */ - public List getFlags(); - - /** - * Called by the default {@link FlagPoleTileRenderer} - * @param metadata - * @param section - * @return the value to interpolate on the flagpole icon, to render the flagpole - */ - public float getTextureDimensions(int metadata, int section); - - /** - * Called by the default {@link FlagPoleTileRenderer} - * @param metadata - * @return the rendered orientation value for the flagpole and thus the flags - */ - public int getOrientation(int metadata); + /** + * Remove all contained flags + */ + public void clearFlags(); + + /** + * Add given flag to the TileEntity + * + * @param flag + * The flag to add return true if flag could be added + */ + public boolean addFlag(ItemStack flag); + + /** + * + * @return All flags currently contained, empty list if none + */ + public List getFlags(); + + /** + * Called by the default {@link FlagPoleTileRenderer} + * + * @param metadata + * @param section + * @return the value to interpolate on the flagpole icon, to render the flagpole + */ + public float getTextureDimensions(int metadata, int section); + + /** + * Called by the default {@link FlagPoleTileRenderer} + * + * @param metadata + * @return the rendered orientation value for the flagpole and thus the flags + */ + public int getOrientation(int metadata); } diff --git a/src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java b/src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java index 353a8d06..8beb7344 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java +++ b/src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java @@ -5,57 +5,60 @@ public interface IHeraldryItem { - public static final String heraldryTag = "hc1"; - - public enum HeraldyRenderPassess{ - Pattern, - SecondaryColourTrim, - PostRenderIcon - } - - /** - * Returns the "base" icon. This icon will be coloured the primary colour - */ - public IIcon getBaseIcon(ItemStack stack); - /** - * Returns the trim icon, This will be coloured the secondary colour - */ - public IIcon getTrimIcon(ItemStack stack); - /** - * Returns the post render icon, this Icon will render after all other rendering passess in it's default colour - */ - public IIcon getPostRenderIcon(ItemStack stack); - - - /** - * Returns true if the given itemstack has heraldy attached - */ - public boolean hasHeraldry(ItemStack stack); - /** - * Returns the current heraldy code, this will only be called on ItemStacks that have been found to have heraldry using the hasHeraldryMethod - */ - public byte[] getHeraldry(ItemStack stack); - - /** - * Saves the given heraldry code in the given stack. It is recommended to save the Byte array representation of the crest in the NBT - */ - public void setHeraldry(ItemStack stack, byte[] data); - - /** - * Removes the heraldry code from the item - */ - public void removeHeraldry(ItemStack item); - - /** - * Returns true if the default renderer should perform the given render pass - */ - public boolean shouldDoPass(HeraldyRenderPassess pass); - - /** - * Returns true if the default renderer should be used. - * If the method returns true, the default renderer will be attached. - * If this method returns false it is the modders responsibility to attach an appropriate renderer - */ - public boolean useDefaultRenderer(); + public static final String heraldryTag = "hc1"; + + public enum HeraldyRenderPassess { + Pattern, SecondaryColourTrim, PostRenderIcon + } + + /** + * Returns the "base" icon. This icon will be coloured the primary colour + */ + public IIcon getBaseIcon(ItemStack stack); + + /** + * Returns the trim icon, This will be coloured the secondary colour + */ + public IIcon getTrimIcon(ItemStack stack); + + /** + * Returns the post render icon, this Icon will render after all other rendering + * passess in it's default colour + */ + public IIcon getPostRenderIcon(ItemStack stack); + + /** + * Returns true if the given itemstack has heraldy attached + */ + public boolean hasHeraldry(ItemStack stack); + + /** + * Returns the current heraldy code, this will only be called on ItemStacks that + * have been found to have heraldry using the hasHeraldryMethod + */ + public byte[] getHeraldry(ItemStack stack); + + /** + * Saves the given heraldry code in the given stack. It is recommended to save + * the Byte array representation of the crest in the NBT + */ + public void setHeraldry(ItemStack stack, byte[] data); + + /** + * Removes the heraldry code from the item + */ + public void removeHeraldry(ItemStack item); + + /** + * Returns true if the default renderer should perform the given render pass + */ + public boolean shouldDoPass(HeraldyRenderPassess pass); + + /** + * Returns true if the default renderer should be used. If the method returns + * true, the default renderer will be attached. If this method returns false it + * is the modders responsibility to attach an appropriate renderer + */ + public boolean useDefaultRenderer(); } diff --git a/src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java b/src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java index 16beb695..d7ca5f8d 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java +++ b/src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java @@ -1,8 +1,8 @@ package mods.battlegear2.api.heraldry; -public interface IHeraldyArmour extends IHeraldryItem{ - +public interface IHeraldyArmour extends IHeraldryItem { + public String getBaseArmourPath(int armourSlot); - public String getPatternArmourPath(PatternStore pattern, int index, int armourSlot); + public String getPatternArmourPath(PatternStore pattern, int index, int armourSlot); } diff --git a/src/main/java/mods/battlegear2/api/heraldry/ITool.java b/src/main/java/mods/battlegear2/api/heraldry/ITool.java index c7a86cdd..c8210448 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/ITool.java +++ b/src/main/java/mods/battlegear2/api/heraldry/ITool.java @@ -8,12 +8,12 @@ */ public interface ITool { - public String getToolName(); + public String getToolName(); - public ResourceLocation getToolImage(); + public ResourceLocation getToolImage(); - public void drawOverlay(int x, int y, int[] pixals, DynamicTexture overlay, int rgb, boolean shift); + public void drawOverlay(int x, int y, int[] pixals, DynamicTexture overlay, int rgb, boolean shift); - public void draw(int x, int y, int[] pixels, int rgb, boolean shift); + public void draw(int x, int y, int[] pixels, int rgb, boolean shift); } diff --git a/src/main/java/mods/battlegear2/api/heraldry/PatternStore.java b/src/main/java/mods/battlegear2/api/heraldry/PatternStore.java index 7c7c1a32..0429c96e 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/PatternStore.java +++ b/src/main/java/mods/battlegear2/api/heraldry/PatternStore.java @@ -14,188 +14,168 @@ public class PatternStore { - public static final IResourceManager rm = Minecraft.getMinecraft().getResourceManager(); - public static final PatternStore DEFAULT = new PatternStore(8,4); - private final int IMAGES_X; - private final int IMAGES_Y; - public List patterns = new ArrayList(); - - public PatternStore(int xSections,int ySections){ - this.IMAGES_X = xSections; - this.IMAGES_Y = ySections; - } - /** - * Deconstruct an image and store its data for later use - * @param image - * @return the index used to get the data back - */ - public int buildPatternAndStore(ResourceLocation image){ - try{ - if(patterns.add(buildPatternFrom(image))){ - return patterns.size()-1; - }else{ - return -1; - } - }catch (IOException io){ - return -1; - } - } - - /** - * See {@link #buildPatternFrom(java.awt.image.BufferedImage)} - * @throws IOException if the image can't be read - */ - public int[][][][] buildPatternFrom(ResourceLocation image) throws IOException { - return buildPatternFrom(rm.getResource(image).getInputStream()); - } - - /** - * See {@link #buildPatternFrom(java.awt.image.BufferedImage)} - * @throws IOException if the image can't be read - */ - public int[][][][] buildPatternFrom(InputStream resourceStream) throws IOException { - return buildPatternFrom(ImageIO.read(resourceStream)); - } - - /** - * Analyse the given image by cutting it into subimages - * @param image - * @return the subimages rgb values into arrays - */ - public int[][][][] buildPatternFrom(BufferedImage image){ - int[][][][] rgbs = new int[IMAGES_X * IMAGES_Y][3][(image.getWidth() / IMAGES_X)][(image.getHeight() / IMAGES_Y)]; - - int imageRes = image.getWidth() / IMAGES_X; - for(int x = 0; x < image.getWidth(); x++){ - for(int y = 0; y < image.getHeight(); y++){ - int imageNo = (x / imageRes) + IMAGES_X * (y / imageRes); - int rgb = image.getRGB(x,y); - int red = (rgb >> 16) & 0x000000FF; - int green = (rgb >> 8) & 0x000000FF; - int blue = (rgb) & 0x000000FF; - - int total = red+green+blue; - - if(total == 0){ - rgbs[imageNo][0][x%imageRes][y%imageRes] = 255; - rgbs[imageNo][1][x%imageRes][y%imageRes] = 0; - rgbs[imageNo][2][x%imageRes][y%imageRes] = 0; - }else{ - rgbs[imageNo][0][x%imageRes][y%imageRes] = (255 * red) / total; - rgbs[imageNo][1][x%imageRes][y%imageRes] = (255 * green) / total; - rgbs[imageNo][2][x%imageRes][y%imageRes] = (255 * blue) / total; - } - } - } - return rgbs; - } - - public int getBlendedSmallPixel(int index, byte imageNo, int x, int y, int col1, int col2, int col3){ - return getBlendedSmallPixel(patterns.get(index)[imageNo][0][x][y], patterns.get(index)[imageNo][1][x][y], patterns.get(index)[imageNo][2][x][y], col1, col2, col3); - } - - public static int getBlendedSmallPixel(int[][][][] rgbs, byte imageNo, int x, int y, int col1, int col2, int col3){ - return getBlendedSmallPixel(rgbs[imageNo][0][x][y], rgbs[imageNo][1][x][y], rgbs[imageNo][2][x][y], col1, col2, col3); - } - - public static int getBlendedSmallPixel(int a, int b, int c, int col1, int col2, int col3){ - int red = ((((col1 >> 16) & 0xFF) * a) / 255) + - ((((col2 >> 16) & 0xFF) * b) / 255) + - ((((col3 >> 16) & 0xFF) * c)/ 255); - - int green = (((col1 >> 8) & 0xFF) * a / 255) + - (((col2 >> 8) & 0xFF) * b / 255) + - (((col3 >> 8) & 0xFF) * c / 255); - - int blue = (((col1) & 0xFF) * a / 255) + - (((col2) & 0xFF) * b / 255) + - (((col3) & 0xFF) * c / 255); - - return 0xFF000000 | - ((red << 16) & 0x00FF0000) | - ((green << 8) & 0x0000FF00) | - ((blue) & 0x000000FF); - } - - - - - - - /* - public static void initialise(ResourceManager rm){ - - try{ - InputStream inputstream = rm.func_110536_a(small_image).func_110527_b(); - BufferedImage image = ImageIO.read(inputstream); - - if(image != null){ - - small_col1 = new byte[IMAGES_X * IMAGES_Y][(image.getWidth() / IMAGES_X)][(image.getHeight() / IMAGES_Y)]; - small_col2 = new byte[IMAGES_X * IMAGES_Y][(image.getWidth() / IMAGES_X)][(image.getHeight() / IMAGES_Y)]; - small_col3 = new byte[IMAGES_X * IMAGES_Y][(image.getWidth() / IMAGES_X)][(image.getHeight() / IMAGES_Y)]; - - for(int x = 0; x < image.getWidth(); x++){ - for(int y = 0; y < image.getHeight() / 2; y++){ - - int imageNo = (x / IMAGES_X) + IMAGES_X * (y / IMAGES_Y); - - int rgb = image.getRGB(x,y); - small_col1[imageNo][x][y] = (byte) ((rgb >> 16) & 0x000000FF); - small_col2[imageNo][x][y] = (byte) ((rgb >>8 ) & 0x000000FF); - small_col3[imageNo][x][y] = (byte) ((rgb) & 0x000000FF); - - if(small_col1[imageNo][x][y] == 0 && - small_col2[imageNo][x][y] == 0 && - small_col3[imageNo][x][y] == 0){ - small_col1[imageNo][x][y] = (byte)255; - - } - } - } - } - }catch (Exception e){ - e.printStackTrace();; - } - /* - try{ - InputStream inputstream = rm.func_110536_a(large_image).func_110527_b(); - BufferedImage image = ImageIO.read(inputstream); - - if(image != null){ - - large_col1 = new float[IMAGES_X * IMAGES_Y][(image.getWidth() / IMAGES_X)][(image.getHeight() / (IMAGES_Y * 2))]; - large_col2 = new float[IMAGES_X * IMAGES_Y][(image.getWidth() / IMAGES_X)][(image.getHeight() / (IMAGES_Y * 2))]; - large_col3 = new float[IMAGES_X * IMAGES_Y][(image.getWidth() / IMAGES_X)][(image.getHeight() / (IMAGES_Y * 2))]; - - - for(int x = 0; x < image.getWidth(); x++){ - for(int y = 0; y < image.getHeight() / 2; y++){ - - int imageNo = (x / IMAGES_X) + IMAGES_X * (y / (2*IMAGES_Y)); - - int rgb = image.getRGB(x,y); - int red = (rgb >> 16) & 0x000000FF; - int green = (rgb >>8 ) & 0x000000FF; - int blue = (rgb) & 0x000000FF; - - if(red == 0 && green == 0 && blue == 0){ - large_col1[imageNo][x][y] = 0F; - }else{ - large_col1[imageNo][x][y] = (float)red / (float)(red + green + blue); - large_col2[imageNo][x][y] = (float)red / (float)(red + green + blue); - large_col3[imageNo][x][y] = (float)red / (float)(red + green + blue); - } - } - } - } - }catch (Exception e){ - e.printStackTrace();; - } - - - } - */ - + public static final IResourceManager rm = Minecraft.getMinecraft().getResourceManager(); + public static final PatternStore DEFAULT = new PatternStore(8, 4); + private final int IMAGES_X; + private final int IMAGES_Y; + public List patterns = new ArrayList(); + + public PatternStore(int xSections, int ySections) { + this.IMAGES_X = xSections; + this.IMAGES_Y = ySections; + } + + /** + * Deconstruct an image and store its data for later use + * + * @param image + * @return the index used to get the data back + */ + public int buildPatternAndStore(ResourceLocation image) { + try { + if (patterns.add(buildPatternFrom(image))) { + return patterns.size() - 1; + } else { + return -1; + } + } catch (IOException io) { + return -1; + } + } + + /** + * See {@link #buildPatternFrom(java.awt.image.BufferedImage)} + * + * @throws IOException + * if the image can't be read + */ + public int[][][][] buildPatternFrom(ResourceLocation image) throws IOException { + return buildPatternFrom(rm.getResource(image).getInputStream()); + } + + /** + * See {@link #buildPatternFrom(java.awt.image.BufferedImage)} + * + * @throws IOException + * if the image can't be read + */ + public int[][][][] buildPatternFrom(InputStream resourceStream) throws IOException { + return buildPatternFrom(ImageIO.read(resourceStream)); + } + + /** + * Analyse the given image by cutting it into subimages + * + * @param image + * @return the subimages rgb values into arrays + */ + public int[][][][] buildPatternFrom(BufferedImage image) { + int[][][][] rgbs = new int[IMAGES_X + * IMAGES_Y][3][(image.getWidth() / IMAGES_X)][(image.getHeight() / IMAGES_Y)]; + + int imageRes = image.getWidth() / IMAGES_X; + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + int imageNo = (x / imageRes) + IMAGES_X * (y / imageRes); + int rgb = image.getRGB(x, y); + int red = (rgb >> 16) & 0x000000FF; + int green = (rgb >> 8) & 0x000000FF; + int blue = (rgb) & 0x000000FF; + + int total = red + green + blue; + + if (total == 0) { + rgbs[imageNo][0][x % imageRes][y % imageRes] = 255; + rgbs[imageNo][1][x % imageRes][y % imageRes] = 0; + rgbs[imageNo][2][x % imageRes][y % imageRes] = 0; + } else { + rgbs[imageNo][0][x % imageRes][y % imageRes] = (255 * red) / total; + rgbs[imageNo][1][x % imageRes][y % imageRes] = (255 * green) / total; + rgbs[imageNo][2][x % imageRes][y % imageRes] = (255 * blue) / total; + } + } + } + return rgbs; + } + + public int getBlendedSmallPixel(int index, byte imageNo, int x, int y, int col1, int col2, int col3) { + return getBlendedSmallPixel(patterns.get(index)[imageNo][0][x][y], patterns.get(index)[imageNo][1][x][y], + patterns.get(index)[imageNo][2][x][y], col1, col2, col3); + } + + public static int getBlendedSmallPixel(int[][][][] rgbs, byte imageNo, int x, int y, int col1, int col2, int col3) { + return getBlendedSmallPixel(rgbs[imageNo][0][x][y], rgbs[imageNo][1][x][y], rgbs[imageNo][2][x][y], col1, col2, + col3); + } + + public static int getBlendedSmallPixel(int a, int b, int c, int col1, int col2, int col3) { + int red = ((((col1 >> 16) & 0xFF) * a) / 255) + ((((col2 >> 16) & 0xFF) * b) / 255) + + ((((col3 >> 16) & 0xFF) * c) / 255); + + int green = (((col1 >> 8) & 0xFF) * a / 255) + (((col2 >> 8) & 0xFF) * b / 255) + + (((col3 >> 8) & 0xFF) * c / 255); + + int blue = (((col1) & 0xFF) * a / 255) + (((col2) & 0xFF) * b / 255) + (((col3) & 0xFF) * c / 255); + + return 0xFF000000 | ((red << 16) & 0x00FF0000) | ((green << 8) & 0x0000FF00) | ((blue) & 0x000000FF); + } + + /* + * public static void initialise(ResourceManager rm){ + * + * try{ InputStream inputstream = rm.func_110536_a(small_image).func_110527_b(); + * BufferedImage image = ImageIO.read(inputstream); + * + * if(image != null){ + * + * small_col1 = new byte[IMAGES_X * IMAGES_Y][(image.getWidth() / + * IMAGES_X)][(image.getHeight() / IMAGES_Y)]; small_col2 = new byte[IMAGES_X * + * IMAGES_Y][(image.getWidth() / IMAGES_X)][(image.getHeight() / IMAGES_Y)]; + * small_col3 = new byte[IMAGES_X * IMAGES_Y][(image.getWidth() / + * IMAGES_X)][(image.getHeight() / IMAGES_Y)]; + * + * for(int x = 0; x < image.getWidth(); x++){ for(int y = 0; y < + * image.getHeight() / 2; y++){ + * + * int imageNo = (x / IMAGES_X) + IMAGES_X * (y / IMAGES_Y); + * + * int rgb = image.getRGB(x,y); small_col1[imageNo][x][y] = (byte) ((rgb >> 16) + * & 0x000000FF); small_col2[imageNo][x][y] = (byte) ((rgb >>8 ) & 0x000000FF); + * small_col3[imageNo][x][y] = (byte) ((rgb) & 0x000000FF); + * + * if(small_col1[imageNo][x][y] == 0 && small_col2[imageNo][x][y] == 0 && + * small_col3[imageNo][x][y] == 0){ small_col1[imageNo][x][y] = (byte)255; + * + * } } } } }catch (Exception e){ e.printStackTrace();; } /* try{ InputStream + * inputstream = rm.func_110536_a(large_image).func_110527_b(); BufferedImage + * image = ImageIO.read(inputstream); + * + * if(image != null){ + * + * large_col1 = new float[IMAGES_X * IMAGES_Y][(image.getWidth() / + * IMAGES_X)][(image.getHeight() / (IMAGES_Y * 2))]; large_col2 = new + * float[IMAGES_X * IMAGES_Y][(image.getWidth() / IMAGES_X)][(image.getHeight() + * / (IMAGES_Y * 2))]; large_col3 = new float[IMAGES_X * + * IMAGES_Y][(image.getWidth() / IMAGES_X)][(image.getHeight() / (IMAGES_Y * + * 2))]; + * + * + * for(int x = 0; x < image.getWidth(); x++){ for(int y = 0; y < + * image.getHeight() / 2; y++){ + * + * int imageNo = (x / IMAGES_X) + IMAGES_X * (y / (2*IMAGES_Y)); + * + * int rgb = image.getRGB(x,y); int red = (rgb >> 16) & 0x000000FF; int green = + * (rgb >>8 ) & 0x000000FF; int blue = (rgb) & 0x000000FF; + * + * if(red == 0 && green == 0 && blue == 0){ large_col1[imageNo][x][y] = 0F; + * }else{ large_col1[imageNo][x][y] = (float)red / (float)(red + green + blue); + * large_col2[imageNo][x][y] = (float)red / (float)(red + green + blue); + * large_col3[imageNo][x][y] = (float)red / (float)(red + green + blue); } } } } + * }catch (Exception e){ e.printStackTrace();; } + * + * + * } + */ } diff --git a/src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java b/src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java index 1726c2b7..8aeb92be 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java +++ b/src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java @@ -5,47 +5,50 @@ import net.minecraft.client.renderer.texture.DynamicTexture; -public class RefreshableTexture extends DynamicTexture{ - - private int width; - private int height; - public RefreshableTexture(BufferedImage par1BufferedImage) { - super(par1BufferedImage); - this.width = par1BufferedImage.getWidth(); - this.height = par1BufferedImage.getHeight(); - } - - public RefreshableTexture(int par1, int par2) { - super(par1, par2); - this.width = par1; - this.height = par2; - } - - public void refreshWith(HeraldryData data, boolean scale){ - refreshWith(data.getPatternIndex(), data, scale); - } - - public void refreshWith(int patternIndex, HeraldryData data, boolean scale){ - if(patternIndex>=0 && patternIndex= 0 && patternIndex < PatternStore.DEFAULT.patterns.size()) { + refreshWith(PatternStore.DEFAULT.patterns.get(patternIndex), data, scale); + } + } + + public void refreshWith(int[][][][] pattern, HeraldryData data, boolean scale) { + BufferedImage image = new BufferedImage(pattern[data.getPattern()][0].length, + pattern[data.getPattern()][0][0].length, BufferedImage.TYPE_4BYTE_ABGR); + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + image.setRGB(x, y, PatternStore.getBlendedSmallPixel(pattern, data.getPattern(), x, y, + data.getColour(0), data.getColour(1), data.getColour(2))); + } + } + if (scale && (image.getHeight() != height || image.getWidth() != width)) { + image = (BufferedImage) image.getScaledInstance(width, height, Image.SCALE_SMOOTH); + } + int[] pixels = getTextureData(); + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + pixels[x + y * image.getWidth()] = image.getRGB(x, y); + } + } + } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/package-info.java b/src/main/java/mods/battlegear2/api/heraldry/package-info.java index 9cc5cec3..e426b5ac 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/package-info.java +++ b/src/main/java/mods/battlegear2/api/heraldry/package-info.java @@ -2,4 +2,3 @@ package mods.battlegear2.api.heraldry; import cpw.mods.fml.common.API; - diff --git a/src/main/java/mods/battlegear2/api/package-info.java b/src/main/java/mods/battlegear2/api/package-info.java index 81dbfe86..210e18ed 100644 --- a/src/main/java/mods/battlegear2/api/package-info.java +++ b/src/main/java/mods/battlegear2/api/package-info.java @@ -2,4 +2,3 @@ package mods.battlegear2.api; import cpw.mods.fml.common.API; - diff --git a/src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java b/src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java index 4e6d86ed..7bf8d1cf 100644 --- a/src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java +++ b/src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java @@ -8,100 +8,136 @@ public interface IArrowContainer2 { - /** - * Returns the maximum amount of slots in the arrow container - * @param container {@link ItemStack} representing this item - * @return the amount of slots - */ - public int getSlotCount(ItemStack container); + /** + * Returns the maximum amount of slots in the arrow container + * + * @param container + * {@link ItemStack} representing this item + * @return the amount of slots + */ + public int getSlotCount(ItemStack container); - /** - * Returns the currently selected slot in the arrow container - * @param container {@link ItemStack} representing this item - * @return the currently selected slot - */ - public int getSelectedSlot(ItemStack container); + /** + * Returns the currently selected slot in the arrow container + * + * @param container + * {@link ItemStack} representing this item + * @return the currently selected slot + */ + public int getSelectedSlot(ItemStack container); - /** - * Sets the currently selected slot to the given value - * @param container {@link ItemStack} representing this item - * @param newSlot the new slot index - */ - public void setSelectedSlot(ItemStack container, int newSlot); + /** + * Sets the currently selected slot to the given value + * + * @param container + * {@link ItemStack} representing this item + * @param newSlot + * the new slot index + */ + public void setSelectedSlot(ItemStack container, int newSlot); - /** - * Returns the itemStack in the currently selected slot - * @param container The {@link ItemStack} representing this item - * @param slot the slot index - * @return The {@link #ItemStack} in the given slot. - */ - public ItemStack getStackInSlot(ItemStack container, int slot); + /** + * Returns the itemStack in the currently selected slot + * + * @param container + * The {@link ItemStack} representing this item + * @param slot + * the slot index + * @return The {@link #ItemStack} in the given slot. + */ + public ItemStack getStackInSlot(ItemStack container, int slot); - /** - * Sets places the given item stack in the given slot - * @param container {@link ItemStack} representing this item - * @param slot the slot index - * @param stack {@link ItemStack} representing the new stack - */ - public void setStackInSlot(ItemStack container, int slot, ItemStack stack); + /** + * Sets places the given item stack in the given slot + * + * @param container + * {@link ItemStack} representing this item + * @param slot + * the slot index + * @param stack + * {@link ItemStack} representing the new stack + */ + public void setStackInSlot(ItemStack container, int slot, ItemStack stack); - /** - * - * @param container The {@link ItemStack} representing this item - * @param bow The bow trying to use this container - * @param player The {@link EntityPlayer} using the bow - * @return true if the item contains at least one arrow in the selected slot - */ - public boolean hasArrowFor(ItemStack container, ItemStack bow, EntityPlayer player, int slot); + /** + * + * @param container + * The {@link ItemStack} representing this item + * @param bow + * The bow trying to use this container + * @param player + * The {@link EntityPlayer} using the bow + * @return true if the item contains at least one arrow in the selected slot + */ + public boolean hasArrowFor(ItemStack container, ItemStack bow, EntityPlayer player, int slot); - /** - * The arrow spawned when bow is used with this non empty container equipped - * @param container The {@link ItemStack} representing this item - * @param charge Amount of charge in the bow, ranging from 0.2F to 2.0F - * @param player The {@link EntityPlayer} using the bow - * @param world - * @return the arrow entity to spawn when bow is used - */ - public EntityArrow getArrowType(ItemStack container, World world, EntityPlayer player, float charge); + /** + * The arrow spawned when bow is used with this non empty container equipped + * + * @param container + * The {@link ItemStack} representing this item + * @param charge + * Amount of charge in the bow, ranging from 0.2F to 2.0F + * @param player + * The {@link EntityPlayer} using the bow + * @param world + * @return the arrow entity to spawn when bow is used + */ + public EntityArrow getArrowType(ItemStack container, World world, EntityPlayer player, float charge); - /** - * Action to take after an arrow has been fired - * Usually equal to removing an arrow from the container - * @param player The {@link EntityPlayer} using the bow - * @param world - * @param container The {@link ItemStack} representing this item - * @param bow The bow which fired - * @param arrow the arrow fired - */ - public void onArrowFired(World world, EntityPlayer player, ItemStack container, ItemStack bow, EntityArrow arrow); + /** + * Action to take after an arrow has been fired Usually equal to removing an + * arrow from the container + * + * @param player + * The {@link EntityPlayer} using the bow + * @param world + * @param container + * The {@link ItemStack} representing this item + * @param bow + * The bow which fired + * @param arrow + * the arrow fired + */ + public void onArrowFired(World world, EntityPlayer player, ItemStack container, ItemStack bow, EntityArrow arrow); - /** - * Called before the arrow is fired from this container - * @param arrowEvent Used to decide bow damage, bow sound and arrow enchantment - */ - public void onPreArrowFired(PlayerEventChild.QuiverArrowEvent.Firing arrowEvent); + /** + * Called before the arrow is fired from this container + * + * @param arrowEvent + * Used to decide bow damage, bow sound and arrow enchantment + */ + public void onPreArrowFired(PlayerEventChild.QuiverArrowEvent.Firing arrowEvent); - /** - * Called when the container is put on a crafting bench with other items - * @param container The {@link ItemStack} representing this item - * @param arrowStack The {@link ItemStack} representing other items - * @return True to receive {@link #addArrows(ItemStack, ItemStack)} - */ - public boolean isCraftableWithArrows(ItemStack container, ItemStack arrowStack); + /** + * Called when the container is put on a crafting bench with other items + * + * @param container + * The {@link ItemStack} representing this item + * @param arrowStack + * The {@link ItemStack} representing other items + * @return True to receive {@link #addArrows(ItemStack, ItemStack)} + */ + public boolean isCraftableWithArrows(ItemStack container, ItemStack arrowStack); - /** - * Crafts the item with the items from {@link #isCraftableWithArrows(ItemStack, ItemStack)} - * @param container The {@link ItemStack} representing this item - * @param newStack Another valid item on the crafting bench - * @return Arrows that couldn't fit in - */ - public ItemStack addArrows(ItemStack container, ItemStack newStack); + /** + * Crafts the item with the items from + * {@link #isCraftableWithArrows(ItemStack, ItemStack)} + * + * @param container + * The {@link ItemStack} representing this item + * @param newStack + * Another valid item on the crafting bench + * @return Arrows that couldn't fit in + */ + public ItemStack addArrows(ItemStack container, ItemStack newStack); - /** - * Called through post rendering event on the player - * @param container - * @return true if the default quiver model can be rendered - */ - public boolean renderDefaultQuiverModel(ItemStack container); + /** + * Called through post rendering event on the player + * + * @param container + * @return true if the default quiver model can be rendered + */ + public boolean renderDefaultQuiverModel(ItemStack container); } diff --git a/src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java b/src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java index 8d413d43..89105d8f 100644 --- a/src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java +++ b/src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java @@ -7,24 +7,33 @@ public interface IArrowFireHandler { - /**Called from QuiverArrowRegistry.getArrowType, - * to decide if it is worth trying to build an EntityArrow - * @param arrow the stack which should define the arrow as item - * @param world - * @param player player using a bow to fire an arrow - * @param charge amount of charge in the bow - * @return true to get called for #getFireArrow - */ - public boolean canFireArrow(ItemStack arrow, World world, EntityPlayer player, float charge); + /** + * Called from QuiverArrowRegistry.getArrowType, to decide if it is worth trying + * to build an EntityArrow + * + * @param arrow + * the stack which should define the arrow as item + * @param world + * @param player + * player using a bow to fire an arrow + * @param charge + * amount of charge in the bow + * @return true to get called for #getFireArrow + */ + public boolean canFireArrow(ItemStack arrow, World world, EntityPlayer player, float charge); - /**Called from QuiverArrowRegistry.getArrowType, - * return null if the EntityArrow couldn't be built, - * let pass to another IArrowFireHandler - * @param arrow the stack which should define the arrow as item - * @param world - * @param player player using a bow to fire an arrow - * @param charge amount of charge in the bow - * @return the arrow to fire, or null if it couldn't be built - */ - public EntityArrow getFiredArrow(ItemStack arrow, World world, EntityPlayer player, float charge); + /** + * Called from QuiverArrowRegistry.getArrowType, return null if the EntityArrow + * couldn't be built, let pass to another IArrowFireHandler + * + * @param arrow + * the stack which should define the arrow as item + * @param world + * @param player + * player using a bow to fire an arrow + * @param charge + * amount of charge in the bow + * @return the arrow to fire, or null if it couldn't be built + */ + public EntityArrow getFiredArrow(ItemStack arrow, World world, EntityPlayer player, float charge); } diff --git a/src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java b/src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java index 5b905af5..e41695f2 100644 --- a/src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java +++ b/src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java @@ -5,11 +5,14 @@ public interface IQuiverSelection { - /** - * Defines a quiver selection algorithm, to be added with {@link QuiverArrowRegistry#addQuiverSelection} - * @param bow - * @param player - * @return a stack holding a {@link IArrowContainer2} item or null if none is found - */ - public ItemStack getQuiverFor(ItemStack bow, EntityPlayer player); + /** + * Defines a quiver selection algorithm, to be added with + * {@link QuiverArrowRegistry#addQuiverSelection} + * + * @param bow + * @param player + * @return a stack holding a {@link IArrowContainer2} item or null if none is + * found + */ + public ItemStack getQuiverFor(ItemStack bow, EntityPlayer player); } diff --git a/src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java b/src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java index ad8d6d39..1c395c10 100644 --- a/src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java +++ b/src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java @@ -17,187 +17,208 @@ public class QuiverArrowRegistry { - private static Map> itemToClasses = new TreeMap>(new StackComparator()); - private static Map, ItemStack> classToItems = new HashMap, ItemStack>(); - private static List quiverSelectors = new ArrayList(); - private static List fireHandlers = new ArrayList(); - static{ - fireHandlers.add(new DefaultArrowFire()); - } - - /** - * Adds an item to the known arrow lists - * @param itemId the item id - * @param itemMetadata the item damage value, as metadata - * @param entityArrow the class from which the arrow entity will be constructed - */ - public static void addArrowToRegistry(Item itemId, int itemMetadata, Class entityArrow){ - ItemStack stack = new ItemStack(itemId, 1, itemMetadata); - addArrowToRegistry(stack, entityArrow); - } - - /** - * NBT sensitive version, can be called through - * FMLInterModComms.sendMessage("battlegear2", "Arrow:"+classPath, itemStack); - * where classPath is the full class path for the arrow class - * @param stack - * @param entityArrow the class from which the arrow entity will be constructed - */ - public static void addArrowToRegistry(ItemStack stack, Class entityArrow){ - ItemStack st = stack.copy(); - st.stackSize = 1; - itemToClasses.put(st, entityArrow); - classToItems.put(entityArrow, st); - } - - /** - * Adds a new quiver selection algorithm to the known list, can be called through - * FMLInterModComms.sendMessage("battlegear2", "QuiverSelection", classpath); - * where classPath is the full class path for the class implementing IQuiverSelection, - * and said class has a default constructor to built from - * @param handler the selection algorithm to add - * @return true if it could be added - */ - public static boolean addQuiverSelection(IQuiverSelection handler){ - return quiverSelectors.add(handler); - } - - /** - * Adds a new arrow firing handler to the known list, can be called through - * FMLInterModComms.sendMessage("battlegear2", "FireHandler", classpath); - * where classPath is the full class path for the class implementing IArrowFireHandler, - * and said class has a default constructor to built from - * @param handler the firing handler to add - * @return true if it could be added - */ - public static boolean addArrowFireHandler(IArrowFireHandler handler){ - return fireHandlers.add(handler); - } - - /** - * Search for an ItemStack whose item is an {@link IArrowContainer2} - * @param bow the bow in use - * @param entityPlayer the player using it - * @return the first non-null itemstack found through the quiver selection algorithms - */ - public static ItemStack getArrowContainer(ItemStack bow, EntityPlayer entityPlayer) { - ItemStack temp; - for(IQuiverSelection handler:quiverSelectors){ - temp = handler.getQuiverFor(bow, entityPlayer); - if(temp!=null){ - return temp; - } - } - return null; - } - - /** - * Search for an EntityArrow to be spawned, used by the default ItemQuiver - * @param arrow the stack which should define the arrow as item - * @param world - * @param player player using a bow to fire an arrow - * @param charge amount of charge in the bow - * @return the first non-null entity arrow built through the firing handlers - */ - public static EntityArrow getArrowType(ItemStack arrow, World world, EntityPlayer player, float charge){ - EntityArrow result; - for(IArrowFireHandler handler:fireHandlers){ - if(handler.canFireArrow(arrow, world, player, charge)){ - result = handler.getFiredArrow(arrow, world, player, charge); - if(result!=null){ - return result; - } - } - } - return null; - } - - /** - * @param stack - * @return the EntityArrow class attached to the given stack - */ - public static Class getArrowClass(ItemStack stack){ - return itemToClasses.get(stack); - } - - /** - * @param clazz - * @return the ItemStack attached to the given EntityArrow class - */ - public static ItemStack getItem(Class clazz){ - ItemStack temp = classToItems.get(clazz); - if(temp == null){ + private static Map> itemToClasses = new TreeMap>( + new StackComparator()); + private static Map, ItemStack> classToItems = new HashMap, ItemStack>(); + private static List quiverSelectors = new ArrayList(); + private static List fireHandlers = new ArrayList(); + static { + fireHandlers.add(new DefaultArrowFire()); + } + + /** + * Adds an item to the known arrow lists + * + * @param itemId + * the item id + * @param itemMetadata + * the item damage value, as metadata + * @param entityArrow + * the class from which the arrow entity will be constructed + */ + public static void addArrowToRegistry(Item itemId, int itemMetadata, Class entityArrow) { + ItemStack stack = new ItemStack(itemId, 1, itemMetadata); + addArrowToRegistry(stack, entityArrow); + } + + /** + * NBT sensitive version, can be called through + * FMLInterModComms.sendMessage("battlegear2", "Arrow:"+classPath, itemStack); + * where classPath is the full class path for the arrow class + * + * @param stack + * @param entityArrow + * the class from which the arrow entity will be constructed + */ + public static void addArrowToRegistry(ItemStack stack, Class entityArrow) { + ItemStack st = stack.copy(); + st.stackSize = 1; + itemToClasses.put(st, entityArrow); + classToItems.put(entityArrow, st); + } + + /** + * Adds a new quiver selection algorithm to the known list, can be called + * through FMLInterModComms.sendMessage("battlegear2", "QuiverSelection", + * classpath); where classPath is the full class path for the class implementing + * IQuiverSelection, and said class has a default constructor to built from + * + * @param handler + * the selection algorithm to add + * @return true if it could be added + */ + public static boolean addQuiverSelection(IQuiverSelection handler) { + return quiverSelectors.add(handler); + } + + /** + * Adds a new arrow firing handler to the known list, can be called through + * FMLInterModComms.sendMessage("battlegear2", "FireHandler", classpath); where + * classPath is the full class path for the class implementing + * IArrowFireHandler, and said class has a default constructor to built from + * + * @param handler + * the firing handler to add + * @return true if it could be added + */ + public static boolean addArrowFireHandler(IArrowFireHandler handler) { + return fireHandlers.add(handler); + } + + /** + * Search for an ItemStack whose item is an {@link IArrowContainer2} + * + * @param bow + * the bow in use + * @param entityPlayer + * the player using it + * @return the first non-null itemstack found through the quiver selection + * algorithms + */ + public static ItemStack getArrowContainer(ItemStack bow, EntityPlayer entityPlayer) { + ItemStack temp; + for (IQuiverSelection handler : quiverSelectors) { + temp = handler.getQuiverFor(bow, entityPlayer); + if (temp != null) { + return temp; + } + } + return null; + } + + /** + * Search for an EntityArrow to be spawned, used by the default ItemQuiver + * + * @param arrow + * the stack which should define the arrow as item + * @param world + * @param player + * player using a bow to fire an arrow + * @param charge + * amount of charge in the bow + * @return the first non-null entity arrow built through the firing handlers + */ + public static EntityArrow getArrowType(ItemStack arrow, World world, EntityPlayer player, float charge) { + EntityArrow result; + for (IArrowFireHandler handler : fireHandlers) { + if (handler.canFireArrow(arrow, world, player, charge)) { + result = handler.getFiredArrow(arrow, world, player, charge); + if (result != null) { + return result; + } + } + } + return null; + } + + /** + * @param stack + * @return the EntityArrow class attached to the given stack + */ + public static Class getArrowClass(ItemStack stack) { + return itemToClasses.get(stack); + } + + /** + * @param clazz + * @return the ItemStack attached to the given EntityArrow class + */ + public static ItemStack getItem(Class clazz) { + ItemStack temp = classToItems.get(clazz); + if (temp == null) { return new ItemStack(Items.arrow); - }else{ + } else { return temp.copy(); } - } - - /** - * - * @param test the ItemStack to check - * @return true if that ItemStack is attached to an EntityArrow class - */ - public static boolean isKnownArrow(ItemStack test){ - return itemToClasses.containsKey(test); - } - - /** - * Tool class to compare ItemStack, since this class is final but doesn't implement the necessary method - */ - static class StackComparator implements Comparator { - @Override - public int compare(ItemStack stack, ItemStack stack2) { - if(stack == stack2){ - return 0; - }else{ - - int idDiff = stack.getItemDamage() - stack2.getItemDamage(); - if(idDiff != 0){ - return idDiff; - }else{ - idDiff = Item.getIdFromItem(stack.getItem())-Item.getIdFromItem(stack2.getItem()); - if(idDiff != 0){ - return idDiff; - }else{ - int tag = 0; - if(stack.hasTagCompound()){ - tag = stack.getTagCompound().hashCode(); - } - int tag2 = 0; - if(stack2.hasTagCompound()){ - tag2 = stack2.getTagCompound().hashCode(); - } - return tag-tag2; - } - } - } - } - } - - /** - * Default implementation of a arrow firing handler, which uses this registry of arrows to build an EntityArrow - * with a constructor - * If the arrow is unknown, or the constructor isn't valid, defers to other firing handlers silently - */ - static class DefaultArrowFire implements IArrowFireHandler{ - - @Override - public boolean canFireArrow(ItemStack arrow, World world, EntityPlayer player, float charge) { - return isKnownArrow(arrow); - } - - @Override - public EntityArrow getFiredArrow(ItemStack arrow, World world, EntityPlayer player, float charge) { - Class clazz = getArrowClass(arrow); - if(clazz != null){ - try { - return (EntityArrow)clazz.getConstructor(World.class, EntityLivingBase.class, Float.TYPE) - .newInstance(player.worldObj, player, charge); - } catch (Exception ignored) { - } - } - return null; - } - } + } + + /** + * + * @param test + * the ItemStack to check + * @return true if that ItemStack is attached to an EntityArrow class + */ + public static boolean isKnownArrow(ItemStack test) { + return itemToClasses.containsKey(test); + } + + /** + * Tool class to compare ItemStack, since this class is final but doesn't + * implement the necessary method + */ + static class StackComparator implements Comparator { + @Override + public int compare(ItemStack stack, ItemStack stack2) { + if (stack == stack2) { + return 0; + } else { + + int idDiff = stack.getItemDamage() - stack2.getItemDamage(); + if (idDiff != 0) { + return idDiff; + } else { + idDiff = Item.getIdFromItem(stack.getItem()) - Item.getIdFromItem(stack2.getItem()); + if (idDiff != 0) { + return idDiff; + } else { + int tag = 0; + if (stack.hasTagCompound()) { + tag = stack.getTagCompound().hashCode(); + } + int tag2 = 0; + if (stack2.hasTagCompound()) { + tag2 = stack2.getTagCompound().hashCode(); + } + return tag - tag2; + } + } + } + } + } + + /** + * Default implementation of a arrow firing handler, which uses this registry of + * arrows to build an EntityArrow with a constructor If the arrow is unknown, or + * the constructor isn't valid, defers to other firing handlers silently + */ + static class DefaultArrowFire implements IArrowFireHandler { + + @Override + public boolean canFireArrow(ItemStack arrow, World world, EntityPlayer player, float charge) { + return isKnownArrow(arrow); + } + + @Override + public EntityArrow getFiredArrow(ItemStack arrow, World world, EntityPlayer player, float charge) { + Class clazz = getArrowClass(arrow); + if (clazz != null) { + try { + return (EntityArrow) clazz.getConstructor(World.class, EntityLivingBase.class, Float.TYPE) + .newInstance(player.worldObj, player, charge); + } catch (Exception ignored) { + } + } + return null; + } + } } diff --git a/src/main/java/mods/battlegear2/api/quiver/package-info.java b/src/main/java/mods/battlegear2/api/quiver/package-info.java index dad64d91..ef2bbb57 100644 --- a/src/main/java/mods/battlegear2/api/quiver/package-info.java +++ b/src/main/java/mods/battlegear2/api/quiver/package-info.java @@ -2,4 +2,3 @@ package mods.battlegear2.api.quiver; import cpw.mods.fml.common.API; - diff --git a/src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java b/src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java index f668c8e1..5d8f2703 100644 --- a/src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java +++ b/src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java @@ -3,19 +3,23 @@ import net.minecraft.entity.IProjectile; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; + /** - * Defines an item that can catch IProjectile - * Used by ItemShield to block arrows + * Defines an item that can catch IProjectile Used by ItemShield to block arrows + * * @author GotoLink * */ public interface IArrowCatcher { - /** - * - * @param shield the {@link ItemStack} corresponding to the shield in use - * @param player the {@link EntityPlayer} holding the shield - * @param projectile heading towards the shield - * @return true if the projectile has been caught - */ + /** + * + * @param shield + * the {@link ItemStack} corresponding to the shield in use + * @param player + * the {@link EntityPlayer} holding the shield + * @param projectile + * heading towards the shield + * @return true if the projectile has been caught + */ public boolean catchArrow(ItemStack shield, EntityPlayer player, IProjectile projectile); } diff --git a/src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java b/src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java index a92d195b..09ee59a1 100644 --- a/src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java +++ b/src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java @@ -3,12 +3,14 @@ import net.minecraft.item.ItemStack; /** - * Defines an item that can hold arrows as an internal variable - * Used by ItemShield to display blocked arrows + * Defines an item that can hold arrows as an internal variable Used by + * ItemShield to display blocked arrows + * * @author GotoLink * */ public interface IArrowDisplay { - public void setArrowCount(ItemStack stack, int count); - public int getArrowCount(ItemStack stack); + public void setArrowCount(ItemStack stack, int count); + + public int getArrowCount(ItemStack stack); } diff --git a/src/main/java/mods/battlegear2/api/shield/IShield.java b/src/main/java/mods/battlegear2/api/shield/IShield.java index 1451f3a2..0a7fee53 100644 --- a/src/main/java/mods/battlegear2/api/shield/IShield.java +++ b/src/main/java/mods/battlegear2/api/shield/IShield.java @@ -6,74 +6,92 @@ public interface IShield { - /** - * Gets the decay rate for the stamina bar when the shield is in use. - * The value should be between 0 and 1. The duration of maximum blocking can be calculated - * by 1/decayRate/20. - * - * @param shield The {@link ItemStack} representing the shield - * @return a value between 0 & 1 representing the decay rate per tick - */ - public float getDecayRate(ItemStack shield); - - /** - * Gets the recovery rate for the stamina bar when the shield is not in use. - * The value should be between 0 and 1. - * - * @param shield The {@link ItemStack} representing the shield - * @return a value between 0 & 1 representing the recovery rate per tick - */ - public float getRecoveryRate(ItemStack shield); + /** + * Gets the decay rate for the stamina bar when the shield is in use. The value + * should be between 0 and 1. The duration of maximum blocking can be calculated + * by 1/decayRate/20. + * + * @param shield + * The {@link ItemStack} representing the shield + * @return a value between 0 & 1 representing the decay rate per tick + */ + public float getDecayRate(ItemStack shield); - /** - * Returns true if the current shield can and should block the given damage source - * - * @param shield The {@link ItemStack} representing the shield - * @param source The {@link DamageSource} representing the current damage - * @return true if the shield can block the given damage type - */ - public boolean canBlock(ItemStack shield, DamageSource source); + /** + * Gets the recovery rate for the stamina bar when the shield is not in use. The + * value should be between 0 and 1. + * + * @param shield + * The {@link ItemStack} representing the shield + * @return a value between 0 & 1 representing the recovery rate per tick + */ + public float getRecoveryRate(ItemStack shield); - /** - * Gets the extra decay rate to the stamina bar when the shield is damaged - * - * @param shield The {@link ItemStack} representing the shield - * @param amount The amount of damage the shield has absorbed - * @return a value between 0 & 1 representing the decay rate - */ - public float getDamageDecayRate(ItemStack shield, float amount); + /** + * Returns true if the current shield can and should block the given damage + * source + * + * @param shield + * The {@link ItemStack} representing the shield + * @param source + * The {@link DamageSource} representing the current damage + * @return true if the shield can block the given damage type + */ + public boolean canBlock(ItemStack shield, DamageSource source); - /** - * Returns the block angle in degrees that the shield can block. - * This angle is taken as 0 degrees being directly in front of the player. The shield - * will block between -blockAngle to blockangle - * @param shield The {@link ItemStack} representing the shield - * @return The maximum angle the shield should be able to block at - */ - public float getBlockAngle(ItemStack shield); + /** + * Gets the extra decay rate to the stamina bar when the shield is damaged + * + * @param shield + * The {@link ItemStack} representing the shield + * @param amount + * The amount of damage the shield has absorbed + * @return a value between 0 & 1 representing the decay rate + */ + public float getDamageDecayRate(ItemStack shield, float amount); - /** - * Returns the time a shield bash should take to be performed. A shield bash will disallow actions - * for the number of ticks given and will knockback an opponent at time/2 - * - * @return The amount of ticks the shield bash animation will play - */ - public int getBashTimer(ItemStack shield); + /** + * Returns the block angle in degrees that the shield can block. This angle is + * taken as 0 degrees being directly in front of the player. The shield will + * block between -blockAngle to blockangle + * + * @param shield + * The {@link ItemStack} representing the shield + * @return The maximum angle the shield should be able to block at + */ + public float getBlockAngle(ItemStack shield); - /** - * Called after a successful block, if {@link PlayerEventShield.ShieldBlockEvent] allowed additional blocking animation - * A common additional animation might include a sound, particle effects, etc. - * @param player - * @param amount - */ - public void blockAnimation(EntityPlayer player, float amount); + /** + * Returns the time a shield bash should take to be performed. A shield bash + * will disallow actions for the number of ticks given and will knockback an + * opponent at time/2 + * + * @return The amount of ticks the shield bash animation will play + */ + public int getBashTimer(ItemStack shield); - /** - * Called after a successful block, if {@link PlayerEventShield.ShieldBlockEvent] allowed damage to be done - * and the player isn't in creative mode - * @param shield The {@link ItemStack} representing the shield - * @param source The {@link DamageSource} representing the current damage - * @return The amount of damage from the source that won't be dealt to the shield - */ - public float getDamageReduction(ItemStack shield, DamageSource source); + /** + * Called after a successful block, if + * {@link PlayerEventShield.ShieldBlockEvent] allowed additional blocking + * animation A common additional animation might include a sound, particle + * effects, etc. + * + * @param player + * @param amount + */ + public void blockAnimation(EntityPlayer player, float amount); + + /** + * Called after a successful block, if + * {@link PlayerEventShield.ShieldBlockEvent] allowed damage to be done and the + * player isn't in creative mode + * + * @param shield + * The {@link ItemStack} representing the shield + * @param source + * The {@link DamageSource} representing the current damage + * @return The amount of damage from the source that won't be dealt to the + * shield + */ + public float getDamageReduction(ItemStack shield, DamageSource source); } diff --git a/src/main/java/mods/battlegear2/api/shield/ShieldType.java b/src/main/java/mods/battlegear2/api/shield/ShieldType.java index 8e723b0a..2485df8f 100644 --- a/src/main/java/mods/battlegear2/api/shield/ShieldType.java +++ b/src/main/java/mods/battlegear2/api/shield/ShieldType.java @@ -2,49 +2,60 @@ public class ShieldType { - public static final ShieldType WOOD = new ShieldType("wood", 1F/1F/20F, 1F/20F, 40, 15, 0xFFbc9862); // 1 second block - public static final ShieldType HIDE = new ShieldType("hide", 1F/1.5F/20F, 1F/20F, 40, 12, 0xFF9b482b); //1.5 second block - public static final ShieldType IRON = new ShieldType("iron", 1F/3F/20F, 1F/20F, 120, 9, 0xFFacacac); //3 second block - public static final ShieldType DIAMOND = new ShieldType("diamond", 1F/5F/20F, 1F/20F, 263, 10, 0xFF23bfbf); //5 second block - public static final ShieldType GOLD = new ShieldType("gold", 1F/2F/20F, 1F/20F, 56, 25, 0xFFa8a400); //2 second block - - private final float decayRate; - private final float damageDecay; - private final String name; - private final int enchantability; - private final int maxDamage; - private final int defaultRGB; - - public ShieldType(String name, float decayRate, float damageDecay, int maxDamage, int enchantability, int defaultColour){ - this.name = name; - this.decayRate = decayRate; - this.damageDecay = damageDecay; - this.enchantability = enchantability; - this.maxDamage = maxDamage; - defaultRGB = defaultColour; - } - - public float getDecayRate() { - return decayRate; - } - - public float getDamageDecay() { - return damageDecay; - } - - public String getName() { - return name; - } - - public int getEnchantability() { - return enchantability; - } - - public int getMaxDamage() { - return maxDamage; - } - - public int getDefaultRGB() { - return defaultRGB; - } + public static final ShieldType WOOD = new ShieldType("wood", 1F / 1F / 20F, 1F / 20F, 40, 15, 0xFFbc9862); // 1 + // second + // block + public static final ShieldType HIDE = new ShieldType("hide", 1F / 1.5F / 20F, 1F / 20F, 40, 12, 0xFF9b482b); // 1.5 + // second + // block + public static final ShieldType IRON = new ShieldType("iron", 1F / 3F / 20F, 1F / 20F, 120, 9, 0xFFacacac); // 3 + // second + // block + public static final ShieldType DIAMOND = new ShieldType("diamond", 1F / 5F / 20F, 1F / 20F, 263, 10, 0xFF23bfbf); // 5 + // second + // block + public static final ShieldType GOLD = new ShieldType("gold", 1F / 2F / 20F, 1F / 20F, 56, 25, 0xFFa8a400); // 2 + // second + // block + + private final float decayRate; + private final float damageDecay; + private final String name; + private final int enchantability; + private final int maxDamage; + private final int defaultRGB; + + public ShieldType(String name, float decayRate, float damageDecay, int maxDamage, int enchantability, + int defaultColour) { + this.name = name; + this.decayRate = decayRate; + this.damageDecay = damageDecay; + this.enchantability = enchantability; + this.maxDamage = maxDamage; + defaultRGB = defaultColour; + } + + public float getDecayRate() { + return decayRate; + } + + public float getDamageDecay() { + return damageDecay; + } + + public String getName() { + return name; + } + + public int getEnchantability() { + return enchantability; + } + + public int getMaxDamage() { + return maxDamage; + } + + public int getDefaultRGB() { + return defaultRGB; + } } diff --git a/src/main/java/mods/battlegear2/api/shield/package-info.java b/src/main/java/mods/battlegear2/api/shield/package-info.java index bb146ecf..b51c8c29 100644 --- a/src/main/java/mods/battlegear2/api/shield/package-info.java +++ b/src/main/java/mods/battlegear2/api/shield/package-info.java @@ -2,4 +2,3 @@ package mods.battlegear2.api.shield; import cpw.mods.fml.common.API; - diff --git a/src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java b/src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java index 36025eca..c2074b53 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java +++ b/src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java @@ -6,9 +6,10 @@ public interface IBackStabbable { /** * Action to perform on back stabbing + * * @param entityHit * @param entityHitting - * @return true if it adds an hitting action + * @return true if it adds an hitting action */ public boolean onBackStab(EntityLivingBase entityHit, EntityLivingBase entityHitting); } diff --git a/src/main/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java b/src/main/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java index 7fca81e5..e1adf622 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java +++ b/src/main/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java @@ -4,6 +4,6 @@ import mods.battlegear2.api.IOffhandDual; import mods.battlegear2.api.ISheathed; -public interface IBattlegearWeapon extends ISheathed,IOffhandDual,IAllowItem{ +public interface IBattlegearWeapon extends ISheathed, IOffhandDual, IAllowItem { } \ No newline at end of file diff --git a/src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java b/src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java index fce70604..799f460d 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java +++ b/src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java @@ -4,7 +4,9 @@ public interface IExtendedReachWeapon { /** - * The distance the weapon will hit (note this will ONLY work for main hand weapons) + * The distance the weapon will hit (note this will ONLY work for main hand + * weapons) + * * @param stack * @return */ diff --git a/src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java b/src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java index c9014e23..0ff308b2 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java +++ b/src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java @@ -6,7 +6,7 @@ public interface IHitTimeModifier { /** * - * @param entityHit + * @param entityHit * @return The amount to modify the hit shield */ public int getHitTime(ItemStack stack, EntityLivingBase entityHit); diff --git a/src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java b/src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java index 9d5c804d..93e40d71 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java +++ b/src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java @@ -5,7 +5,10 @@ public interface IPenetrateWeapon { /** * The amount of damage bypassing armor - * @param stack The {@link net.minecraft.item.ItemStack} representative of the item dealing the hit. + * + * @param stack + * The {@link net.minecraft.item.ItemStack} representative of the + * item dealing the hit. * @return the amount of damage that bypasses armour */ public float getPenetratingPower(ItemStack stack); diff --git a/src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java b/src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java index 4c7eb775..8e4da366 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java +++ b/src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java @@ -7,16 +7,18 @@ public interface IPotionEffect { - - /** - * Returns a map containing the potion effects to apply to an entity hit by the weapon. Each effect - * has a float value associated with the chance of applying the effect. Note that the "dice roll" only - * occurs once so any value under this roll will be applied. - * - * @param entityHit The entity the effect will be applied to. - * @param entityHitting - * @return A Map of {@link PotionEffect} with chance value ranging from 0 to 1, to be dealt to the entityHit - */ - public Map getEffectsOnHit(EntityLivingBase entityHit, EntityLivingBase entityHitting); + /** + * Returns a map containing the potion effects to apply to an entity hit by the + * weapon. Each effect has a float value associated with the chance of applying + * the effect. Note that the "dice roll" only occurs once so any value under + * this roll will be applied. + * + * @param entityHit + * The entity the effect will be applied to. + * @param entityHitting + * @return A Map of {@link PotionEffect} with chance value ranging from 0 to 1, + * to be dealt to the entityHit + */ + public Map getEffectsOnHit(EntityLivingBase entityHit, EntityLivingBase entityHitting); } diff --git a/src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java b/src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java index e32995ce..fa68cf2d 100644 --- a/src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java +++ b/src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java @@ -5,9 +5,10 @@ public interface ISpecialEffect { /** * - * @param entityHit The entity the effect will be applied to. + * @param entityHit + * The entity the effect will be applied to. * @param entityHitting * @return true if it adds an hitting action */ - public boolean performEffects(EntityLivingBase entityHit, EntityLivingBase entityHitting); + public boolean performEffects(EntityLivingBase entityHit, EntityLivingBase entityHitting); } diff --git a/src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java b/src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java index f15eeaf4..88f6d61a 100644 --- a/src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java +++ b/src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java @@ -3,21 +3,20 @@ import java.util.HashSet; import java.util.Set; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - import org.apache.commons.lang3.builder.HashCodeBuilder; import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; /** - * Registry for stacks which will be allowed in battle inventory, - * accessible through {@link FMLInterModComms} messages. - * Use only if your item is not recognized by default. - * Use of {@link IBattlegearWeapon} is preferred over this method. - * {@link NBTTagCompound} are supported. + * Registry for stacks which will be allowed in battle inventory, accessible + * through {@link FMLInterModComms} messages. Use only if your item is not + * recognized by default. Use of {@link IBattlegearWeapon} is preferred over + * this method. {@link NBTTagCompound} are supported. + * * @author GotoLink * */ @@ -25,64 +24,75 @@ public class WeaponRegistry { private static Set weapons = new HashSet(); private static Set mainHand = new HashSet(); private static Set offHand = new HashSet(); + /** - * Called by a {@link IMCMessage} with "Dual" as key, and the {@link ItemStack} as value - * @param stack registered as dual wieldable + * Called by a {@link IMCMessage} with "Dual" as key, and the {@link ItemStack} + * as value + * + * @param stack + * registered as dual wieldable */ public static void addDualWeapon(ItemStack stack) { - weapons.add(new StackHolder(stack)); - mainHand.add(new StackHolder(stack)); - offHand.add(new StackHolder(stack)); + weapons.add(new StackHolder(stack)); + mainHand.add(new StackHolder(stack)); + offHand.add(new StackHolder(stack)); } - + /** - * Called by a {@link IMCMessage} with "MainHand" as key, and the {@link ItemStack} as value - * @param stack registered as wieldable only in main hand + * Called by a {@link IMCMessage} with "MainHand" as key, and the + * {@link ItemStack} as value + * + * @param stack + * registered as wieldable only in main hand */ public static void addTwoHanded(ItemStack stack) { - weapons.add(new StackHolder(stack)); - mainHand.add(new StackHolder(stack)); + weapons.add(new StackHolder(stack)); + mainHand.add(new StackHolder(stack)); } /** - * Called by a {@link IMCMessage} with "OffHand" as key, and the {@link ItemStack} as value - * @param stack registered as wieldable only in offhand + * Called by a {@link IMCMessage} with "OffHand" as key, and the + * {@link ItemStack} as value + * + * @param stack + * registered as wieldable only in offhand */ public static void addOffhandWeapon(ItemStack stack) { - weapons.add(new StackHolder(stack)); - offHand.add(new StackHolder(stack)); + weapons.add(new StackHolder(stack)); + offHand.add(new StackHolder(stack)); } - + public static boolean isWeapon(ItemStack stack) { return weapons.contains(new StackHolder(stack)); } - + public static boolean isMainHand(ItemStack stack) { return mainHand.contains(new StackHolder(stack)); } - + public static boolean isOffHand(ItemStack stack) { return offHand.contains(new StackHolder(stack)); } - - static class StackHolder{ + + static class StackHolder { private final ItemStack stack; - private int hash; + private int hash; - public StackHolder(ItemStack stack){ + public StackHolder(ItemStack stack) { this.stack = stack; } - + @Override public int hashCode() { - int init = 17, mult = 37; - if(hash==0) { - if(stack==null) - hash = new HashCodeBuilder(init, mult).toHashCode(); - else - hash = new HashCodeBuilder(init, mult).append(Item.getIdFromItem(stack.getItem())).append(stack.getItemDamage()).append(stack.getTagCompound()).toHashCode(); - } - return hash; + int init = 17, mult = 37; + if (hash == 0) { + if (stack == null) + hash = new HashCodeBuilder(init, mult).toHashCode(); + else + hash = new HashCodeBuilder(init, mult).append(Item.getIdFromItem(stack.getItem())) + .append(stack.getItemDamage()).append(stack.getTagCompound()).toHashCode(); + } + return hash; } @Override diff --git a/src/main/java/mods/battlegear2/api/weapons/package-info.java b/src/main/java/mods/battlegear2/api/weapons/package-info.java index 152cc472..9e7f1011 100644 --- a/src/main/java/mods/battlegear2/api/weapons/package-info.java +++ b/src/main/java/mods/battlegear2/api/weapons/package-info.java @@ -2,4 +2,3 @@ package mods.battlegear2.api.weapons; import cpw.mods.fml.common.API; - From f532ba38ebe01dc18d522055d4ce272752c3e086 Mon Sep 17 00:00:00 2001 From: Sirse Date: Tue, 18 Jul 2017 00:39:58 +0800 Subject: [PATCH 041/101] Fix blockbreaker sharp rocks spam TODO: Rewrite eventmanager --- .../mf2/mechanics/EventManagerMF.java | 59 +++---------------- 1 file changed, 9 insertions(+), 50 deletions(-) diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index 00938706..5899fb34 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -81,7 +81,6 @@ import net.minecraft.item.ItemBow; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; @@ -91,6 +90,7 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderPlayerEvent; +import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingDropsEvent; @@ -126,7 +126,6 @@ public void tryDropItems(LivingDropsEvent event) { dropper.entityDropItem(new ItemStack(drop), 0.0F); } if (dropper instanceof EntityAgeable && dropper.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD) { - EntityAgeable a; if (rand.nextFloat() * (1 + event.lootingLevel) < 0.05F) { dropper.entityDropItem(new ItemStack(FoodListMF.guts), 0.0F); } @@ -462,9 +461,9 @@ public void useHoe(UseHoeEvent event) { @SubscribeEvent public void breakBlock(BreakEvent event) { - Block block = event.block; + // Block block = event.block; Block base = event.world.getBlock(event.x, event.y - 1, event.z); - int meta = event.blockMetadata; + // int meta = event.blockMetadata; if (base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(event.world, false)) { event.world.setBlock(event.x, event.y - 1, event.z, Blocks.dirt); @@ -475,13 +474,12 @@ public void breakBlock(BreakEvent event) { } public void playerMineBlock(BlockEvent.BreakEvent event) { - if (event.getPlayer() == null) - return; + EntityPlayer player = event.getPlayer(); - if (event.getPlayer().capabilities.isCreativeMode) + if (player == null || player.capabilities.isCreativeMode || player instanceof FakePlayer) //TODO return; - ItemStack held = event.getPlayer().getHeldItem(); + ItemStack held = player.getHeldItem(); Block broken = event.block; if (broken != null && ConfigHardcore.HCCallowRocks) { @@ -501,11 +499,11 @@ public void playerMineBlock(BlockEvent.BreakEvent event) { } } - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(event.getPlayer()) && ConfigStamina.affectMining) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(player) && ConfigStamina.affectMining) { float points = 2.0F * ConfigStamina.miningSpeed; - ItemWeaponMF.applyFatigue(event.getPlayer(), points, 20F); + ItemWeaponMF.applyFatigue(player, points, 20F); - if (points > 0 && !StaminaBar.isAnyStamina(event.getPlayer(), false)) { + if (points > 0 && !StaminaBar.isAnyStamina(player, false)) { event.getPlayer().addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 100, 1)); } } @@ -729,36 +727,6 @@ private void showCrafterTooltip(ItemStack tool, List list) { public void loadChunk(ChunkEvent.Load event) { } - private void dropItem(World world, ItemStack itemstack, double x, double y, double z) { - if (itemstack != null) { - float f = EventManagerMF.rand.nextFloat() * 0.8F + 0.1F; - float f1 = EventManagerMF.rand.nextFloat() * 0.8F + 0.1F; - float f2 = EventManagerMF.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = EventManagerMF.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, (float) x + f, (float) y + f1, (float) z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) EventManagerMF.rand.nextGaussian() * f3; - entityitem.motionY = (float) EventManagerMF.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) EventManagerMF.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - public static String getRegisterName(Entity entity) { String s = EntityList.getEntityString(entity); @@ -842,10 +810,6 @@ public static int getInjuredTime(Entity entity) { return 0; } - private boolean isEntityMoving(EntityLivingBase entity) { - return Math.hypot(entity.motionX, entity.motionZ) > 0.05F; - } - @SubscribeEvent public void clonePlayer(PlayerEvent.Clone event) { EntityPlayer origin = event.original; @@ -866,11 +830,6 @@ public void startUseItem(PlayerUseItemEvent.Start event) { } } - private boolean canItemBlock(ItemStack item) { - // TODO Auto-generated method stub - return true; - } - @SubscribeEvent public void levelup(LevelupEvent event) { EntityPlayer player = event.thePlayer; From d88ff51166ba7bff043d9b57fc2718811fefa0d9 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 21 Jul 2017 23:19:51 +0800 Subject: [PATCH 042/101] Some small refactoring --- .../block/tileentity/TileEntityFirepit.java | 4 +- .../mf2/block/tileentity/TileEntityForge.java | 21 +++++----- .../mf2/item/archery/ItemBowMF.java | 2 - .../mf2/mechanics/EventManagerMF.java | 39 +++++++++---------- .../mf2/mechanics/PlayerTickHandlerMF.java | 8 ++-- 5 files changed, 35 insertions(+), 39 deletions(-) diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java index 647c1b67..7caf6324 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java @@ -189,8 +189,8 @@ public static int getItemBurnTime(ItemStack input) { return 0; } else { Item i = input.getItem(); - int d = input.getItemDamage(); - Item item = input.getItem(); + /*int d = input.getItemDamage(); + Item item = input.getItem();*/ if (i == Items.stick) return 600;// 30Sec diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java index ef6f7331..1a30fdda 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java @@ -494,7 +494,7 @@ private boolean isForge(int x, int y, int z) { return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) instanceof BlockForge; } - public void syncData() { + private void syncData() { if (worldObj.isRemote) return; @@ -539,7 +539,7 @@ private void pumpBellows(int x, int z, float pump) { if (fuel <= 0) return; - int share = 2; + // int share = 2; TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord, zCoord + z); if (tile == null) return; @@ -569,15 +569,14 @@ public boolean hasBlockAbove() { return tile != null && tile instanceof TileEntityFurnace; } - private void averageAllItems() { - /* - * int temp = 0; int items = 0; for(ItemStack item: inv) { if(item != null && - * item.getItem() instanceof IHotItem) { ++items; temp += - * ItemHeated.getTemp(item); } } int average = (int)((float)temp / items); - * for(ItemStack item: inv) { if(item != null && item.getItem() instanceof - * IHotItem) { ItemHeated.setTemp(item, average); } } - */ - } + /* + * private void averageAllItems() { /* int temp = 0; int items = 0; + * for(ItemStack item: inv) { if(item != null && item.getItem() instanceof + * IHotItem) { ++items; temp += ItemHeated.getTemp(item); } } int average = + * (int)((float)temp / items); for(ItemStack item: inv) { if(item != null && + * item.getItem() instanceof IHotItem) { ItemHeated.setTemp(item, average); } } + * } + */ public boolean tryAddHeatable(ItemStack held) { ItemStack contents = inv[0]; diff --git a/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java b/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java index d7b25f71..df5b8322 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java +++ b/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java @@ -45,7 +45,6 @@ public class ItemBowMF extends ItemBow implements ISpecialBow, IDisplayMFAmmo, IBattlegearWeapon, IFirearm { public static final DecimalFormat decimal_format = new DecimalFormat("#.##"); private final EnumBowType model; - private ToolMaterial material = ToolMaterial.WOOD; private int itemRarity; private float baseDamage = 1.0F; private String name; @@ -56,7 +55,6 @@ public ItemBowMF(String name, EnumBowType type) { public ItemBowMF(String name, ToolMaterial mat, EnumBowType type, int rarity) { this(name, (int) (mat.getMaxUses() * type.durabilityModifier), type, mat.getDamageVsEntity(), rarity); - material = mat; this.enchantmentLvl = mat.getEnchantability(); } diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index 5899fb34..53bc1c4c 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -223,13 +223,14 @@ private Item getHideFor(EntityLivingBase mob) { } private int getHideSizeFor(EntityLivingBase mob) { - if (mob.getClass().getName().endsWith("EntityCow") || mob.getClass().getName().endsWith("EntityHorse")) { + String mobName = mob.getClass().getName(); + if (mobName.endsWith("EntityCow") || mobName.endsWith("EntityHorse")) { return 3; } - if (mob.getClass().getName().endsWith("EntitySheep")) { + if (mobName.endsWith("EntitySheep")) { return 2; } - if (mob.getClass().getName().endsWith("EntityPig")) { + if (mobName.endsWith("EntityPig")) { return 1; } @@ -246,9 +247,9 @@ private int getHideSizeFor(EntityLivingBase mob) { } private boolean shouldAnimalDropHide(EntityLivingBase mob) { - if (mob.getClass().getName().endsWith("EntityWolf") || mob.getClass().getName().endsWith("EntityPig") - || mob.getClass().getName().endsWith("EntitySheep") || mob.getClass().getName().endsWith("EntityCow") - || mob.getClass().getName().endsWith("EntityHorse")) { + String mobName = mob.getClass().getName(); + if (mobName.endsWith("EntityWolf") || mobName.endsWith("EntityPig") || mobName.endsWith("EntitySheep") + || mobName.endsWith("EntityCow") || mobName.endsWith("EntityHorse")) { return true; } if (mob instanceof EntityWolf || mob instanceof EntityCow || mob instanceof EntityPig @@ -279,7 +280,7 @@ public void onDeath(LivingDeathEvent event) { if (dropper != null && useArrows && ConfigExperiment.stickArrows && !dropper.worldObj.isRemote) { ArrayList stuckArrows = (ArrayList) ArrowEffectsMF.getStuckArrows(dropper); if (stuckArrows != null && !stuckArrows.isEmpty()) { - Iterator list = stuckArrows.iterator(); + Iterator list = stuckArrows.iterator(); while (list.hasNext()) { ItemStack arrow = (ItemStack) list.next(); @@ -468,17 +469,15 @@ public void breakBlock(BreakEvent event) { if (base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(event.world, false)) { event.world.setBlock(event.x, event.y - 1, event.z, Blocks.dirt); } - if (event.getPlayer() != null) { + + EntityPlayer player = event.getPlayer(); + if (player != null && !player.capabilities.isCreativeMode && !(player instanceof FakePlayer)) { playerMineBlock(event); } } public void playerMineBlock(BlockEvent.BreakEvent event) { EntityPlayer player = event.getPlayer(); - - if (player == null || player.capabilities.isCreativeMode || player instanceof FakePlayer) //TODO - return; - ItemStack held = player.getHeldItem(); Block broken = event.block; @@ -504,7 +503,7 @@ public void playerMineBlock(BlockEvent.BreakEvent event) { ItemWeaponMF.applyFatigue(player, points, 20F); if (points > 0 && !StaminaBar.isAnyStamina(player, false)) { - event.getPlayer().addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 100, 1)); + player.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 100, 1)); } } } @@ -618,7 +617,7 @@ private void displayWeaponTraits(float[] ratio, List list) { addDamageType(list, blunt, "blunt"); } - private void addDamageType(List list, int value, String name) { + private void addDamageType(List list, int value, String name) { if (value > 0) { String s = StatCollector.translateToLocal("attribute.weapon." + name); if (value < 100) { @@ -628,7 +627,7 @@ private void addDamageType(List list, int value, String name) { } } - public static void addArmourDT(ItemStack armour, EntityPlayer user, List list, boolean extra) { + public static void addArmourDT(ItemStack armour, EntityPlayer user, List list, boolean extra) { list.add(""); String AC = ArmourCalculator.getArmourClass(armour); if (AC != null) { @@ -640,7 +639,7 @@ public static void addArmourDT(ItemStack armour, EntityPlayer user, List list, b addSingleDT(armour, user, 1, list, extra); } - public static void addSingleDT(ItemStack armour, EntityPlayer user, int id, List list, boolean extra) { + public static void addSingleDT(ItemStack armour, EntityPlayer user, int id, List list, boolean extra) { int slot = ((ItemArmor) armour.getItem()).armorType; String attatch = ""; @@ -664,7 +663,7 @@ public static void addSingleDT(ItemStack armour, EntityPlayer user, int id, List } } - public static void addArmourDR(ItemStack armour, EntityPlayer user, List list, boolean extra) { + public static void addArmourDR(ItemStack armour, EntityPlayer user, List list, boolean extra) { list.add(""); String AC = ArmourCalculator.getArmourClass(armour); if (AC != null) { @@ -682,7 +681,7 @@ public static void addArmourDR(ItemStack armour, EntityPlayer user, List list, b } } - public static void addSingleDR(ItemStack armour, EntityPlayer user, int id, List list, boolean extra, + public static void addSingleDR(ItemStack armour, EntityPlayer user, int id, List list, boolean extra, boolean advanced) { int slot = ((ItemArmor) armour.getItem()).armorType; String attatch = ""; @@ -723,9 +722,9 @@ private void showCrafterTooltip(ItemStack tool, List list) { list.add(StatCollector.translateToLocal("attribute.mfcrafteff.name") + ": " + efficiency); } - @SubscribeEvent + /*@SubscribeEvent public void loadChunk(ChunkEvent.Load event) { - } + }*/ public static String getRegisterName(Entity entity) { String s = EntityList.getEntityString(entity); diff --git a/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java b/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java index 6abe659c..a29a974e 100644 --- a/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java @@ -163,10 +163,10 @@ private void tickDragonSpawner(EntityPlayer player) { int i = ConfigMobs.dragonInterval; float chance = ConfigMobs.dragonChance; - if (this.getDragonEnemyPoints(player) >= 100) { + if (PlayerTickHandlerMF.getDragonEnemyPoints(player) >= 100) { i /= 2;// twice as frequent } - if (this.getDragonEnemyPoints(player) >= 50) { + if (PlayerTickHandlerMF.getDragonEnemyPoints(player) >= 50) { chance *= 2;// twice the chance } if (!player.worldObj.isRemote && player.worldObj.getTotalWorldTime() % i == 0 @@ -198,8 +198,8 @@ public static void spawnDragon(EntityPlayer player, int offset) { player.addChatMessage(new ChatComponentText( EnumChatFormatting.GOLD + StatCollector.translateToLocal("event.dragonnear.name"))); - List list = player.worldObj.playerEntities; - Iterator players = list.iterator(); + List list = player.worldObj.playerEntities; + Iterator players = list.iterator(); while (players.hasNext()) { Object instance = players.next(); if (instance != null && instance instanceof EntityPlayer) { From f7e94b04dc7a45896fe468a6536cf0969192101a Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 29 Jul 2017 16:09:48 +0800 Subject: [PATCH 043/101] NEI NPE fix --- .../mf2/api/knowledge/InformationList.java | 2 +- .../integration/nei/RecipeHandlerQuern.java | 23 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java b/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java index 249678fa..f892e712 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java @@ -26,7 +26,7 @@ public class InformationList { /** Is the biggest row used to display a achievement on the GUI. */ public static int maxDisplayRow; /** Holds a list of all registered achievements. */ - public static List knowledgeList = new ArrayList(); + public static List knowledgeList = new ArrayList(); public static HashMap nameMap = new HashMap(); /** diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java index a8e1f61c..9952c849 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java @@ -61,18 +61,21 @@ public void loadCraftingRecipes(ItemStack result) { @Override public void loadUsageRecipes(ItemStack ingredient) { - if (ingredient.getItem().equals(ComponentListMF.clay_pot)) { - for (RecipePair recipePair : recipeList) { - CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipePair.inputStack, recipePair.outputStack); - arecipes.add(cachedRecipe); + if (ingredient != null) { + if (ingredient.getItem().equals(ComponentListMF.clay_pot)) { + for (RecipePair recipePair : recipeList) { + CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipePair.inputStack, + recipePair.outputStack); + arecipes.add(cachedRecipe); + } + return; } - return; - } - QuernRecipes output = QuernRecipes.getResult(ingredient); - if (output != null) { - CachedQuernRecipe recipe = new CachedQuernRecipe(ingredient, output.result); - arecipes.add(recipe); + QuernRecipes output = QuernRecipes.getResult(ingredient); + if (output != null) { + CachedQuernRecipe recipe = new CachedQuernRecipe(ingredient, output.result); + arecipes.add(recipe); + } } } From 12637d6fc52f566d268f25402e0995cddaafa999 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 29 Jul 2017 17:04:26 +0800 Subject: [PATCH 044/101] Fixed DragonAPI Enderman hitting IDKW --- .../java/minefantasy/mf2/mechanics/CombatMechanics.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java index 1e1905a0..7d9a6c08 100644 --- a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java +++ b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java @@ -44,6 +44,7 @@ import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityEnderPearl; +import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.monster.EntitySkeleton; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; @@ -85,7 +86,7 @@ public void initAttack(LivingAttackEvent event) { EntityLivingBase hitter = getHitter(event.source); int spd = EventManagerMF.getHitspeedTime(hitter); if (hitter != null && !hitter.worldObj.isRemote) { - if (spd > 0 && !(event.entityLiving instanceof EntityPlayer)) { + if (spd > 0 && !(event.entityLiving instanceof EntityPlayer || event.entityLiving instanceof EntityEnderman)) { event.setCanceled(true); return; } @@ -235,8 +236,8 @@ private float modifyDamage(DamageSource src, World world, EntityLivingBase hit, hit.extinguish(); } } - dam = onUserHit(hit, hitter, src, dam, properHit); - return dam; + + return onUserHit(hit, hitter, src, dam, properHit); } private boolean isSkeleton(Entity target) { From 88085e34f67c6a4c78593001a3c67741615b46c5 Mon Sep 17 00:00:00 2001 From: Sirse Date: Mon, 31 Jul 2017 15:13:14 +0800 Subject: [PATCH 045/101] TODO update --- TODO/Unimplemented/Growthcraftforkdeer.java | 306 +++++++++ TODO/Unimplemented/Hardoth-texture.png | Bin 0 -> 20380 bytes TODO/Unimplemented/Hardoth.java | 273 +++++++++ TODO/Unimplemented/MFIIBasilisk-texture.png | Bin 0 -> 23175 bytes TODO/Unimplemented/MFIIBasilisk.java | 638 +++++++++++++++++++ TODO/Unimplemented/Mesatunneler-texture.png | Bin 0 -> 15396 bytes TODO/Unimplemented/Mesatunneler.java | 647 ++++++++++++++++++++ TODO/Unimplemented/readme.txt | 1 + TODO/Unimplemented/stag.java | 342 +++++++++++ TODO/Unimplemented/stagOrDeer-texture.png | Bin 0 -> 6007 bytes 10 files changed, 2207 insertions(+) create mode 100644 TODO/Unimplemented/Growthcraftforkdeer.java create mode 100644 TODO/Unimplemented/Hardoth-texture.png create mode 100644 TODO/Unimplemented/Hardoth.java create mode 100644 TODO/Unimplemented/MFIIBasilisk-texture.png create mode 100644 TODO/Unimplemented/MFIIBasilisk.java create mode 100644 TODO/Unimplemented/Mesatunneler-texture.png create mode 100644 TODO/Unimplemented/Mesatunneler.java create mode 100644 TODO/Unimplemented/readme.txt create mode 100644 TODO/Unimplemented/stag.java create mode 100644 TODO/Unimplemented/stagOrDeer-texture.png diff --git a/TODO/Unimplemented/Growthcraftforkdeer.java b/TODO/Unimplemented/Growthcraftforkdeer.java new file mode 100644 index 00000000..e2b7738d --- /dev/null +++ b/TODO/Unimplemented/Growthcraftforkdeer.java @@ -0,0 +1,306 @@ +package Mob; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +/** + * MFII/Growthcraft fork deer - Undefined + * Created using Tabula 5.1.0 + */ +public class MFII/Growthcraftforkdeer extends ModelBase { + public ModelRenderer Bodyfront; + public ModelRenderer Bodyback; + public ModelRenderer ShoulderR; + public ModelRenderer ShoulderL; + public ModelRenderer Neck1; + public ModelRenderer ThighR; + public ModelRenderer ThighL; + public ModelRenderer Tail1; + public ModelRenderer ShinR; + public ModelRenderer HeelR; + public ModelRenderer FootR; + public ModelRenderer shape33; + public ModelRenderer shape34; + public ModelRenderer ShinL; + public ModelRenderer HeelL; + public ModelRenderer FootL; + public ModelRenderer shape35; + public ModelRenderer shape36; + public ModelRenderer UpperarmR; + public ModelRenderer UnderarmR; + public ModelRenderer FootfrontR; + public ModelRenderer shape29; + public ModelRenderer shape30; + public ModelRenderer UpperarmL; + public ModelRenderer UnderarmL; + public ModelRenderer FootfrontL; + public ModelRenderer shape31; + public ModelRenderer shape32; + public ModelRenderer Neck2; + public ModelRenderer Neck3; + public ModelRenderer Head1; + public ModelRenderer Head2; + public ModelRenderer Lowerjaw; + public ModelRenderer AntlerbaseR; + public ModelRenderer Antlerbase; + public ModelRenderer shape73; + public ModelRenderer shape74; + public ModelRenderer Headtop; + public ModelRenderer AntlerR; + public ModelRenderer AntlerR2; + public ModelRenderer AntlerR3; + public ModelRenderer AntlerR7; + public ModelRenderer AntlerL; + public ModelRenderer AntlerL3; + public ModelRenderer AntlerL2; + public ModelRenderer AntlerL7; + + public MFII/Growthcraftforkdeer() { + this.textureWidth = 256; + this.textureHeight = 128; + this.shape34 = new ModelRenderer(this, 70, 75); + this.shape34.setRotationPoint(1.3F, 0.0F, -0.1F); + this.shape34.addBox(0.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F); + this.setRotateAngle(shape34, -0.18203784098300857F, -0.40980330836826856F, 0.0F); + this.Neck2 = new ModelRenderer(this, 5, 45); + this.Neck2.setRotationPoint(0.0F, 0.5F, -3.5F); + this.Neck2.addBox(-2.0F, 0.0F, -4.0F, 4, 5, 5, 0.0F); + this.setRotateAngle(Neck2, -0.40980330836826856F, 0.0F, 0.0F); + this.UnderarmL = new ModelRenderer(this, 70, 90); + this.UnderarmL.setRotationPoint(0.0F, 6.0F, -3.0F); + this.UnderarmL.addBox(-2.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(UnderarmL, -0.091106186954104F, 0.0F, 0.0F); + this.shape31 = new ModelRenderer(this, 70, 75); + this.shape31.setRotationPoint(-1.2F, 0.0F, -0.2F); + this.shape31.addBox(-1.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F); + this.setRotateAngle(shape31, -0.18203784098300857F, 0.40980330836826856F, 0.0F); + this.Tail1 = new ModelRenderer(this, 5, 25); + this.Tail1.setRotationPoint(0.0F, 0.3F, 11.0F); + this.Tail1.addBox(-1.5F, 0.0F, -2.0F, 3, 4, 2, 0.0F); + this.setRotateAngle(Tail1, 0.31869712141416456F, 0.0F, 0.0F); + this.AntlerR2 = new ModelRenderer(this, 70, 50); + this.AntlerR2.setRotationPoint(-0.01F, 0.5F, 0.8F); + this.AntlerR2.addBox(0.0F, 0.0F, -2.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(AntlerR2, -0.8196066167365371F, -0.045553093477052F, 0.0F); + this.AntlerL3 = new ModelRenderer(this, 72, 67); + this.AntlerL3.setRotationPoint(0.0F, 0.0F, 3.5F); + this.AntlerL3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(AntlerL3, 0.27314402793711257F, -0.27314402793711257F, 0.0F); + this.shape36 = new ModelRenderer(this, 70, 75); + this.shape36.setRotationPoint(-1.3F, 0.0F, -0.1F); + this.shape36.addBox(-1.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F); + this.setRotateAngle(shape36, -0.18203784098300857F, 0.40980330836826856F, 0.0F); + this.Antlerbase = new ModelRenderer(this, 70, 45); + this.Antlerbase.setRotationPoint(1.5F, 0.0F, -2.1F); + this.Antlerbase.addBox(-1.0F, -1.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Antlerbase, -0.136659280431156F, -0.045553093477052F, 0.136659280431156F); + this.Lowerjaw = new ModelRenderer(this, 40, 30); + this.Lowerjaw.setRotationPoint(0.0F, 4.0F, -4.5F); + this.Lowerjaw.addBox(-1.0F, -1.0F, -5.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(Lowerjaw, -0.091106186954104F, 0.0F, 0.0F); + this.UpperarmR = new ModelRenderer(this, 70, 100); + this.UpperarmR.setRotationPoint(0.2F, 6.0F, 4.5F); + this.UpperarmR.addBox(0.0F, 0.0F, -3.0F, 2, 7, 3, 0.0F); + this.setRotateAngle(UpperarmR, -0.31869712141416456F, -0.091106186954104F, -0.18203784098300857F); + this.FootL = new ModelRenderer(this, 100, 75); + this.FootL.setRotationPoint(0.0F, 8.0F, -2.0F); + this.FootL.addBox(-2.0F, 0.0F, 0.0F, 2, 3, 2, 0.0F); + this.setRotateAngle(FootL, 0.22759093446006054F, 0.0F, 0.0F); + this.shape30 = new ModelRenderer(this, 70, 75); + this.shape30.setRotationPoint(1.2F, 0.0F, -0.2F); + this.shape30.addBox(0.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F); + this.setRotateAngle(shape30, -0.18203784098300857F, -0.40980330836826856F, 0.0F); + this.AntlerL7 = new ModelRenderer(this, 70, 55); + this.AntlerL7.setRotationPoint(-0.4F, 0.0F, 1.5F); + this.AntlerL7.addBox(0.0F, 0.0F, 0.0F, 2, 1, 1, 0.0F); + this.setRotateAngle(AntlerL7, 0.0F, -0.6373942428283291F, -0.27314402793711257F); + this.AntlerbaseR = new ModelRenderer(this, 70, 45); + this.AntlerbaseR.setRotationPoint(-1.5F, 0.0F, -2.1F); + this.AntlerbaseR.addBox(0.0F, -1.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(AntlerbaseR, -0.136659280431156F, 0.045553093477052F, -0.136659280431156F); + this.ThighR = new ModelRenderer(this, 100, 113); + this.ThighR.setRotationPoint(-4.6F, 2.0F, 3.9F); + this.ThighR.addBox(0.0F, 0.0F, 0.0F, 4, 8, 6, 0.0F); + this.setRotateAngle(ThighR, 0.091106186954104F, 0.0F, 0.136659280431156F); + this.FootR = new ModelRenderer(this, 100, 75); + this.FootR.setRotationPoint(0.0F, 8.0F, -2.0F); + this.FootR.addBox(0.0F, 0.0F, 0.0F, 2, 3, 2, 0.0F); + this.setRotateAngle(FootR, 0.22759093446006054F, 0.0F, 0.0F); + this.shape35 = new ModelRenderer(this, 70, 75); + this.shape35.setRotationPoint(-0.8F, 0.0F, -0.2F); + this.shape35.addBox(0.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F); + this.setRotateAngle(shape35, -0.18203784098300857F, -0.36425021489121656F, 0.0F); + this.HeelL = new ModelRenderer(this, 100, 85); + this.HeelL.setRotationPoint(-0.5F, 8.0F, 3.8F); + this.HeelL.addBox(-2.0F, 0.0F, -2.0F, 2, 8, 2, 0.0F); + this.setRotateAngle(HeelL, -1.0471975511965976F, 0.0F, 0.0F); + this.Head2 = new ModelRenderer(this, 40, 40); + this.Head2.setRotationPoint(0.0F, 0.9F, -3.8F); + this.Head2.addBox(-1.0F, 0.0F, -6.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Head2, 0.045553093477052F, 0.0F, 0.0F); + this.shape73 = new ModelRenderer(this, 0, 0); + this.shape73.setRotationPoint(-1.5F, 0.1F, -0.5F); + this.shape73.addBox(0.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(shape73, 0.31869712141416456F, -0.136659280431156F, 0.0F); + this.Neck3 = new ModelRenderer(this, 5, 35); + this.Neck3.setRotationPoint(0.0F, 0.0F, -4.0F); + this.Neck3.addBox(-1.5F, 0.0F, -4.0F, 3, 4, 4, 0.0F); + this.setRotateAngle(Neck3, 0.22759093446006054F, 0.0F, 0.0F); + this.FootfrontR = new ModelRenderer(this, 70, 80); + this.FootfrontR.setRotationPoint(0.0F, 6.0F, 0.0F); + this.FootfrontR.addBox(0.0F, 0.0F, 0.0F, 2, 3, 2, 0.0F); + this.setRotateAngle(FootfrontR, 0.22759093446006054F, 0.0F, 0.0F); + this.shape32 = new ModelRenderer(this, 70, 75); + this.shape32.setRotationPoint(-0.8F, 0.0F, -0.3F); + this.shape32.addBox(0.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F); + this.setRotateAngle(shape32, -0.18203784098300857F, -0.40980330836826856F, 0.0F); + this.AntlerR7 = new ModelRenderer(this, 70, 55); + this.AntlerR7.setRotationPoint(0.4F, 0.0F, 1.5F); + this.AntlerR7.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 1, 0.0F); + this.setRotateAngle(AntlerR7, 0.0F, 0.6373942428283291F, 0.27314402793711257F); + this.AntlerR3 = new ModelRenderer(this, 72, 67); + this.AntlerR3.setRotationPoint(0.0F, 0.0F, 3.5F); + this.AntlerR3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(AntlerR3, 0.27314402793711257F, 0.27314402793711257F, 0.0F); + this.Head1 = new ModelRenderer(this, 40, 60); + this.Head1.setRotationPoint(0.0F, -0.4F, -3.5F); + this.Head1.addBox(-1.5F, 0.0F, -5.0F, 3, 4, 5, 0.0F); + this.setRotateAngle(Head1, 0.6373942428283291F, 0.0F, 0.0F); + this.Bodyfront = new ModelRenderer(this, 5, 100); + this.Bodyfront.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Bodyfront.addBox(-4.5F, 0.0F, 0.0F, 9, 10, 12, 0.0F); + this.setRotateAngle(Bodyfront, 0.091106186954104F, 0.0F, 0.0F); + this.shape74 = new ModelRenderer(this, 0, 0); + this.shape74.setRotationPoint(1.5F, -0.1F, -0.5F); + this.shape74.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(shape74, 0.31869712141416456F, 0.136659280431156F, 0.0F); + this.ShoulderL = new ModelRenderer(this, 70, 115); + this.ShoulderL.setRotationPoint(5.0F, 3.5F, 2.0F); + this.ShoulderL.addBox(-3.0F, 0.0F, 0.0F, 3, 7, 5, 0.0F); + this.setRotateAngle(ShoulderL, 0.091106186954104F, 0.0F, -0.22759093446006054F); + this.ShinR = new ModelRenderer(this, 100, 100); + this.ShinR.setRotationPoint(0.5F, 8.0F, 0.0F); + this.ShinR.addBox(0.0F, 0.0F, 0.0F, 3, 8, 4, 0.0F); + this.setRotateAngle(ShinR, 0.8196066167365371F, 0.0F, -0.136659280431156F); + this.Headtop = new ModelRenderer(this, 40, 50); + this.Headtop.setRotationPoint(0.0F, -0.9F, -1.0F); + this.Headtop.addBox(-1.0F, 0.0F, -5.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(Headtop, 0.18203784098300857F, 0.0F, 0.0F); + this.ThighL = new ModelRenderer(this, 100, 113); + this.ThighL.setRotationPoint(4.6F, 2.0F, 3.9F); + this.ThighL.addBox(-4.0F, 0.0F, 0.0F, 4, 8, 6, 0.0F); + this.setRotateAngle(ThighL, 0.091106186954104F, 0.0F, -0.136659280431156F); + this.FootfrontL = new ModelRenderer(this, 70, 80); + this.FootfrontL.setRotationPoint(0.0F, 6.0F, 0.0F); + this.FootfrontL.addBox(-2.0F, 0.0F, 0.0F, 2, 3, 2, 0.0F); + this.setRotateAngle(FootfrontL, 0.22759093446006054F, 0.0F, 0.0F); + this.ShoulderR = new ModelRenderer(this, 70, 115); + this.ShoulderR.setRotationPoint(-5.0F, 3.5F, 2.0F); + this.ShoulderR.addBox(0.0F, 0.0F, 0.0F, 3, 7, 5, 0.0F); + this.setRotateAngle(ShoulderR, 0.045553093477052F, 0.0F, 0.22759093446006054F); + this.Bodyback = new ModelRenderer(this, 5, 75); + this.Bodyback.setRotationPoint(0.0F, 0.1F, 12.0F); + this.Bodyback.addBox(-4.0F, 0.0F, 0.0F, 8, 10, 11, 0.0F); + this.setRotateAngle(Bodyback, -0.18203784098300857F, 0.0F, 0.0F); + this.UpperarmL = new ModelRenderer(this, 70, 100); + this.UpperarmL.setRotationPoint(-0.2F, 6.0F, 4.5F); + this.UpperarmL.addBox(-2.0F, 0.0F, -3.0F, 2, 7, 3, 0.0F); + this.setRotateAngle(UpperarmL, -0.31869712141416456F, 0.091106186954104F, 0.18203784098300857F); + this.AntlerR = new ModelRenderer(this, 70, 65); + this.AntlerR.setRotationPoint(0.0F, -1.0F, 0.0F); + this.AntlerR.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(AntlerR, 0.4553564018453205F, -0.27314402793711257F, 0.0F); + this.HeelR = new ModelRenderer(this, 100, 85); + this.HeelR.setRotationPoint(0.5F, 8.0F, 3.8F); + this.HeelR.addBox(0.0F, 0.0F, -2.0F, 2, 8, 2, 0.0F); + this.setRotateAngle(HeelR, -1.0471975511965976F, 0.0F, 0.0F); + this.AntlerL2 = new ModelRenderer(this, 70, 50); + this.AntlerL2.setRotationPoint(0.01F, 0.5F, 0.8F); + this.AntlerL2.addBox(-1.0F, 0.0F, -2.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(AntlerL2, -0.8196066167365371F, 0.045553093477052F, 0.0F); + this.UnderarmR = new ModelRenderer(this, 70, 90); + this.UnderarmR.setRotationPoint(0.0F, 6.0F, -3.0F); + this.UnderarmR.addBox(0.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(UnderarmR, -0.091106186954104F, 0.0F, 0.0F); + this.Neck1 = new ModelRenderer(this, 5, 60); + this.Neck1.setRotationPoint(0.0F, 1.0F, 3.0F); + this.Neck1.addBox(-2.5F, 0.0F, -5.0F, 5, 7, 5, 0.0F); + this.setRotateAngle(Neck1, -0.40980330836826856F, 0.0F, 0.0F); + this.shape33 = new ModelRenderer(this, 70, 75); + this.shape33.setRotationPoint(0.8F, 0.0F, -0.2F); + this.shape33.addBox(-1.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F); + this.setRotateAngle(shape33, -0.09599310885968812F, 0.36425021489121656F, 0.0F); + this.ShinL = new ModelRenderer(this, 100, 100); + this.ShinL.setRotationPoint(-0.5F, 8.0F, 0.0F); + this.ShinL.addBox(-3.0F, 0.0F, 0.0F, 3, 8, 4, 0.0F); + this.setRotateAngle(ShinL, 0.8196066167365371F, 0.0F, 0.136659280431156F); + this.shape29 = new ModelRenderer(this, 70, 75); + this.shape29.setRotationPoint(0.8F, 0.0F, -0.3F); + this.shape29.addBox(-1.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F); + this.setRotateAngle(shape29, -0.18203784098300857F, 0.40980330836826856F, 0.0F); + this.AntlerL = new ModelRenderer(this, 70, 65); + this.AntlerL.setRotationPoint(0.0F, -1.0F, 0.0F); + this.AntlerL.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(AntlerL, 0.4553564018453205F, 0.27314402793711257F, 0.0F); + this.FootR.addChild(this.shape34); + this.Neck1.addChild(this.Neck2); + this.UpperarmL.addChild(this.UnderarmL); + this.FootfrontL.addChild(this.shape31); + this.Bodyback.addChild(this.Tail1); + this.AntlerR.addChild(this.AntlerR2); + this.AntlerL.addChild(this.AntlerL3); + this.FootL.addChild(this.shape36); + this.Head1.addChild(this.Antlerbase); + this.Head1.addChild(this.Lowerjaw); + this.ShoulderR.addChild(this.UpperarmR); + this.HeelL.addChild(this.FootL); + this.FootfrontR.addChild(this.shape30); + this.AntlerL.addChild(this.AntlerL7); + this.Head1.addChild(this.AntlerbaseR); + this.Bodyback.addChild(this.ThighR); + this.HeelR.addChild(this.FootR); + this.FootL.addChild(this.shape35); + this.ShinL.addChild(this.HeelL); + this.Head1.addChild(this.Head2); + this.Head1.addChild(this.shape73); + this.Neck2.addChild(this.Neck3); + this.UnderarmR.addChild(this.FootfrontR); + this.FootfrontL.addChild(this.shape32); + this.AntlerR.addChild(this.AntlerR7); + this.AntlerR.addChild(this.AntlerR3); + this.Neck3.addChild(this.Head1); + this.Head1.addChild(this.shape74); + this.Bodyfront.addChild(this.ShoulderL); + this.ThighR.addChild(this.ShinR); + this.Head2.addChild(this.Headtop); + this.Bodyback.addChild(this.ThighL); + this.UnderarmL.addChild(this.FootfrontL); + this.Bodyfront.addChild(this.ShoulderR); + this.Bodyfront.addChild(this.Bodyback); + this.ShoulderL.addChild(this.UpperarmL); + this.AntlerbaseR.addChild(this.AntlerR); + this.ShinR.addChild(this.HeelR); + this.AntlerL.addChild(this.AntlerL2); + this.UpperarmR.addChild(this.UnderarmR); + this.Bodyfront.addChild(this.Neck1); + this.FootR.addChild(this.shape33); + this.ThighL.addChild(this.ShinL); + this.FootfrontR.addChild(this.shape29); + this.Antlerbase.addChild(this.AntlerL); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + this.Bodyfront.render(f5); + } + + /** + * This is a helper function from Tabula to set the rotation of model parts + */ + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } +} diff --git a/TODO/Unimplemented/Hardoth-texture.png b/TODO/Unimplemented/Hardoth-texture.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4c342653267a78fc4ee680139b1f6845063901 GIT binary patch literal 20380 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 Ef~BZWIsgCw literal 0 HcmV?d00001 diff --git a/TODO/Unimplemented/Hardoth.java b/TODO/Unimplemented/Hardoth.java new file mode 100644 index 00000000..e1222226 --- /dev/null +++ b/TODO/Unimplemented/Hardoth.java @@ -0,0 +1,273 @@ +package Mob; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +/** + * Hardoth - Undefined + * Created using Tabula 5.1.0 + */ +public class Hardoth extends ModelBase { + public ModelRenderer Torsoback; + public ModelRenderer Back; + public ModelRenderer Torsobelly; + public ModelRenderer ShoulderR; + public ModelRenderer ShoulderL; + public ModelRenderer Neck1; + public ModelRenderer Bellyback; + public ModelRenderer Tail1; + public ModelRenderer ThighR; + public ModelRenderer ThighL; + public ModelRenderer Tail2; + public ModelRenderer Tail3; + public ModelRenderer Tail4; + public ModelRenderer LegR; + public ModelRenderer FootR; + public ModelRenderer LegL; + public ModelRenderer FootL; + public ModelRenderer ArmR; + public ModelRenderer FrontfootR; + public ModelRenderer ArmL; + public ModelRenderer FrontfootL; + public ModelRenderer Neck2; + public ModelRenderer Neckunder; + public ModelRenderer Neck3; + public ModelRenderer Headneck; + public ModelRenderer Upperjaw; + public ModelRenderer Headtop1; + public ModelRenderer Gums; + public ModelRenderer Upperbeak1; + public ModelRenderer Beaktusk2; + public ModelRenderer Beaktusk1; + public ModelRenderer Upperbeak2; + public ModelRenderer Upperbeak3; + public ModelRenderer Headtop2; + public ModelRenderer shape41; + public ModelRenderer Headtop3; + public ModelRenderer Lowerjaw; + public ModelRenderer Lowerbeak1; + public ModelRenderer Lowerbeak2; + public ModelRenderer Lowerbeak3; + + public Hardoth() { + this.textureWidth = 256; + this.textureHeight = 256; + this.Lowerjaw = new ModelRenderer(this, 29, 40); + this.Lowerjaw.setRotationPoint(0.0F, 3.1F, 0.0F); + this.Lowerjaw.addBox(-2.0F, -2.0F, -7.0F, 4, 2, 7, 0.0F); + this.Upperbeak3 = new ModelRenderer(this, 35, 65); + this.Upperbeak3.setRotationPoint(2.5F, 0.7F, -7.2F); + this.Upperbeak3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 3, 0.0F); + this.setRotateAngle(Upperbeak3, 0.091106186954104F, 0.0F, -0.18203784098300857F); + this.Upperjaw = new ModelRenderer(this, 5, 49); + this.Upperjaw.setRotationPoint(0.0F, 2.7F, -3.65F); + this.Upperjaw.addBox(-2.5F, 0.0F, -8.0F, 5, 2, 8, 0.0F); + this.setRotateAngle(Upperjaw, -0.136659280431156F, 0.0F, 0.0F); + this.Lowerbeak1 = new ModelRenderer(this, 45, 75); + this.Lowerbeak1.setRotationPoint(0.0F, -0.2F, -7.0F); + this.Lowerbeak1.addBox(-1.5F, -2.0F, 0.0F, 3, 2, 1, 0.0F); + this.setRotateAngle(Lowerbeak1, 0.40980330836826856F, 0.0F, 0.0F); + this.Tail3 = new ModelRenderer(this, 5, 100); + this.Tail3.setRotationPoint(0.0F, 1.0F, 6.0F); + this.Tail3.addBox(-3.0F, 0.0F, 0.0F, 6, 8, 9, 0.0F); + this.setRotateAngle(Tail3, 0.091106186954104F, -6.200655107570901E-17F, 0.0F); + this.Neck3 = new ModelRenderer(this, 50, 105); + this.Neck3.setRotationPoint(0.0F, 1.0F, -4.0F); + this.Neck3.addBox(-3.0F, 0.0F, -5.0F, 6, 8, 5, 0.0F); + this.setRotateAngle(Neck3, -0.18203784098300857F, 0.0F, 0.0F); + this.Headneck = new ModelRenderer(this, 5, 60); + this.Headneck.setRotationPoint(-0.02F, 1.0F, -3.0F); + this.Headneck.addBox(-3.0F, 0.0F, -5.0F, 6, 7, 5, 0.0F); + this.setRotateAngle(Headneck, -0.22759093446006054F, 0.0F, 0.0F); + this.Lowerbeak3 = new ModelRenderer(this, 35, 75); + this.Lowerbeak3.setRotationPoint(2.0F, -0.3F, -7.0F); + this.Lowerbeak3.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 3, 0.0F); + this.setRotateAngle(Lowerbeak3, -0.045553093477052F, 0.0F, 0.22759093446006054F); + this.Torsoback = new ModelRenderer(this, 5, 210); + this.Torsoback.setRotationPoint(0.0F, -11.5F, 0.0F); + this.Torsoback.addBox(-8.0F, 0.0F, -21.0F, 16, 20, 21, 0.0F); + this.setRotateAngle(Torsoback, 0.36425021489121656F, 0.0F, 0.0F); + this.FootL = new ModelRenderer(this, 140, 195); + this.FootL.mirror = true; + this.FootL.setRotationPoint(0.0F, 9.0F, 0.0F); + this.FootL.addBox(-5.0F, 0.0F, 0.0F, 5, 6, 7, 0.0F); + this.setRotateAngle(FootL, 0.136659280431156F, 0.0F, 0.136659280431156F); + this.Beaktusk1 = new ModelRenderer(this, 30, 70); + this.Beaktusk1.setRotationPoint(2.4F, 0.3F, -8.0F); + this.Beaktusk1.addBox(-1.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F); + this.setRotateAngle(Beaktusk1, -0.18203784098300857F, 0.0F, -0.22759093446006054F); + this.Back = new ModelRenderer(this, 5, 160); + this.Back.setRotationPoint(0.0F, 1.0F, 0.0F); + this.Back.addBox(-7.5F, 0.0F, 0.0F, 15, 18, 27, 0.0F); + this.setRotateAngle(Back, -0.6373942428283291F, 0.0F, 0.0F); + this.Bellyback = new ModelRenderer(this, 100, 30); + this.Bellyback.setRotationPoint(0.0F, 23.800000000000004F, 8.5F); + this.Bellyback.addBox(-6.5F, -7.0F, 0.0F, 13, 7, 19, 0.0F); + this.setRotateAngle(Bellyback, 0.31869712141416456F, 0.0F, 0.0F); + this.Headtop1 = new ModelRenderer(this, 5, 40); + this.Headtop1.setRotationPoint(0.01F, 0.0F, -5.0F); + this.Headtop1.addBox(-2.5F, 0.0F, -3.0F, 5, 3, 3, 0.0F); + this.Neck1 = new ModelRenderer(this, 50, 140); + this.Neck1.setRotationPoint(0.0F, 0.3F, -20.0F); + this.Neck1.addBox(-4.5F, 0.0F, -6.0F, 9, 13, 6, 0.0F); + this.setRotateAngle(Neck1, 0.3186971214141647F, 0.0F, 0.0F); + this.FrontfootL = new ModelRenderer(this, 100, 195); + this.FrontfootL.mirror = true; + this.FrontfootL.setRotationPoint(-0.1F, 7.0F, 0.0F); + this.FrontfootL.addBox(-6.0F, 0.0F, 0.0F, 6, 7, 7, 0.0F); + this.setRotateAngle(FrontfootL, -0.136659280431156F, 0.0F, 0.18203784098300857F); + this.FrontfootR = new ModelRenderer(this, 100, 195); + this.FrontfootR.setRotationPoint(-0.1F, 7.0F, 0.0F); + this.FrontfootR.addBox(0.0F, 0.0F, 0.0F, 6, 7, 7, 0.0F); + this.setRotateAngle(FrontfootR, -0.136659280431156F, 0.0F, -0.18203784098300857F); + this.ThighL = new ModelRenderer(this, 140, 230); + this.ThighL.mirror = true; + this.ThighL.setRotationPoint(8.3F, 6.0F, 16.0F); + this.ThighL.addBox(-6.0F, 0.0F, 0.0F, 6, 10, 8, 0.0F); + this.setRotateAngle(ThighL, 0.0F, 0.0F, -0.36425021489121656F); + this.Lowerbeak2 = new ModelRenderer(this, 35, 75); + this.Lowerbeak2.setRotationPoint(-2.0F, -0.3F, -7.0F); + this.Lowerbeak2.addBox(0.0F, -2.0F, 0.0F, 1, 2, 3, 0.0F); + this.setRotateAngle(Lowerbeak2, -0.045553093477052F, 0.0F, -0.22759093446006054F); + this.Torsobelly = new ModelRenderer(this, 100, 5); + this.Torsobelly.setRotationPoint(0.0F, 20.0F, -19.0F); + this.Torsobelly.addBox(-7.5F, -8.0F, 0.0F, 15, 8, 13, 0.0F); + this.setRotateAngle(Torsobelly, -0.4098033083682685F, 0.0F, 0.0F); + this.Gums = new ModelRenderer(this, 55, 60); + this.Gums.setRotationPoint(0.0F, 3.5F, -4.0F); + this.Gums.addBox(-1.5F, -2.0F, -5.0F, 3, 4, 5, 0.0F); + this.setRotateAngle(Gums, -0.09110618695410407F, 0.0F, 0.0F); + this.Upperbeak1 = new ModelRenderer(this, 45, 65); + this.Upperbeak1.setRotationPoint(0.0F, 0.0F, -8.0F); + this.Upperbeak1.addBox(-1.5F, 0.0F, 0.0F, 3, 3, 1, 0.0F); + this.setRotateAngle(Upperbeak1, -0.27314402793711257F, 0.0F, 0.0F); + this.ShoulderR = new ModelRenderer(this, 100, 230); + this.ShoulderR.setRotationPoint(-9.0F, 7.1F, -16.0F); + this.ShoulderR.addBox(0.0F, 0.0F, 0.0F, 6, 11, 9, 0.0F); + this.setRotateAngle(ShoulderR, -0.091106186954104F, 0.0F, 0.40980330836826856F); + this.Tail1 = new ModelRenderer(this, 5, 138); + this.Tail1.setRotationPoint(0.0F, 1.0F, 26.3F); + this.Tail1.addBox(-5.0F, 0.0F, 0.0F, 10, 13, 8, 0.0F); + this.setRotateAngle(Tail1, -0.27314402793711257F, 0.0F, 0.0F); + this.ShoulderL = new ModelRenderer(this, 100, 230); + this.ShoulderL.mirror = true; + this.ShoulderL.setRotationPoint(9.0F, 7.1F, -16.0F); + this.ShoulderL.addBox(-6.0F, 0.0F, 0.0F, 6, 11, 9, 0.0F); + this.setRotateAngle(ShoulderL, -0.091106186954104F, 0.0F, -0.40980330836826856F); + this.ArmR = new ModelRenderer(this, 100, 210); + this.ArmR.setRotationPoint(0.4F, 10.0F, 0.5F); + this.ArmR.addBox(0.0F, 0.0F, 0.0F, 6, 8, 7, 0.0F); + this.setRotateAngle(ArmR, -0.136659280431156F, 0.0F, -0.18203784098300857F); + this.LegL = new ModelRenderer(this, 140, 210); + this.LegL.mirror = true; + this.LegL.setRotationPoint(-0.5F, 10.0F, 0.0F); + this.LegL.addBox(-5.0F, 0.0F, 0.0F, 5, 9, 7, 0.0F); + this.setRotateAngle(LegL, 0.136659280431156F, 0.0F, 0.18203784098300857F); + this.LegR = new ModelRenderer(this, 140, 210); + this.LegR.setRotationPoint(0.5F, 10.0F, 0.0F); + this.LegR.addBox(0.0F, 0.0F, 0.0F, 5, 9, 7, 0.0F); + this.setRotateAngle(LegR, 0.136659280431156F, 0.0F, -0.18203784098300857F); + this.Beaktusk2 = new ModelRenderer(this, 30, 70); + this.Beaktusk2.setRotationPoint(-2.4F, 0.3F, -8.0F); + this.Beaktusk2.addBox(0.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F); + this.setRotateAngle(Beaktusk2, -0.18203784098300857F, 0.0F, 0.22759093446006054F); + this.Tail2 = new ModelRenderer(this, 5, 119); + this.Tail2.setRotationPoint(0.0F, 1.0F, 6.0F); + this.Tail2.addBox(-4.0F, 0.0F, 0.0F, 8, 10, 8, 0.0F); + this.setRotateAngle(Tail2, 0.091106186954104F, 0.0F, 0.0F); + this.Headtop3 = new ModelRenderer(this, 30, 50); + this.Headtop3.setRotationPoint(0.0F, 0.0F, -2.0F); + this.Headtop3.addBox(-2.5F, 0.0F, -2.0F, 5, 2, 2, 0.0F); + this.setRotateAngle(Headtop3, 0.3124139361069849F, 0.0F, 0.0F); + this.FootR = new ModelRenderer(this, 140, 195); + this.FootR.setRotationPoint(0.0F, 9.0F, 0.0F); + this.FootR.addBox(0.0F, 0.0F, 0.0F, 5, 6, 7, 0.0F); + this.setRotateAngle(FootR, 0.136659280431156F, 0.0F, -0.136659280431156F); + this.Neck2 = new ModelRenderer(this, 50, 120); + this.Neck2.setRotationPoint(0.0F, 1.5F, -3.7F); + this.Neck2.addBox(-3.5F, 0.0F, -6.0F, 7, 10, 7, 0.0F); + this.setRotateAngle(Neck2, -0.04555309347705199F, 0.0F, 0.0F); + this.ThighR = new ModelRenderer(this, 140, 230); + this.ThighR.setRotationPoint(-8.3F, 6.0F, 16.0F); + this.ThighR.addBox(0.0F, 0.0F, 0.0F, 6, 10, 8, 0.0F); + this.setRotateAngle(ThighR, 0.0F, 0.0F, 0.36425021489121656F); + this.Neckunder = new ModelRenderer(this, 50, 80); + this.Neckunder.setRotationPoint(0.0F, 19.4F, -5.0F); + this.Neckunder.addBox(-2.5F, -5.0F, -17.0F, 5, 5, 16, 0.0F); + this.setRotateAngle(Neckunder, -0.8651597102135891F, 0.0F, 0.0F); + this.Upperbeak2 = new ModelRenderer(this, 35, 65); + this.Upperbeak2.setRotationPoint(-2.5F, 0.7F, -7.2F); + this.Upperbeak2.addBox(0.0F, 0.0F, 0.0F, 1, 2, 3, 0.0F); + this.setRotateAngle(Upperbeak2, 0.091106186954104F, 0.0F, 0.18203784098300857F); + this.Tail4 = new ModelRenderer(this, 5, 85); + this.Tail4.setRotationPoint(0.0F, 0.5F, 8.0F); + this.Tail4.addBox(-2.0F, 0.0F, 0.0F, 4, 6, 8, 0.0F); + this.setRotateAngle(Tail4, 0.091106186954104F, -1.2401310215141802E-16F, 0.0F); + this.ArmL = new ModelRenderer(this, 100, 210); + this.ArmL.mirror = true; + this.ArmL.setRotationPoint(-0.4F, 10.0F, 0.5F); + this.ArmL.addBox(-6.0F, 0.0F, 0.0F, 6, 8, 7, 0.0F); + this.setRotateAngle(ArmL, -0.136659280431156F, 0.0F, 0.18203784098300857F); + this.shape41 = new ModelRenderer(this, 5, 43); + this.shape41.setRotationPoint(-2.52F, 2.0F, -2.0F); + this.shape41.addBox(0.0F, 0.0F, 0.0F, 0, 1, 2, 0.0F); + this.Headtop2 = new ModelRenderer(this, 35, 55); + this.Headtop2.setRotationPoint(-0.02F, 0.0F, -3.0F); + this.Headtop2.addBox(-2.5F, 0.0F, -2.0F, 5, 2, 2, 0.0F); + this.setRotateAngle(Headtop2, 0.27314402793711257F, 0.0F, 0.0F); + this.Gums.addChild(this.Lowerjaw); + this.Upperjaw.addChild(this.Upperbeak3); + this.Headneck.addChild(this.Upperjaw); + this.Lowerjaw.addChild(this.Lowerbeak1); + this.Tail2.addChild(this.Tail3); + this.Neck2.addChild(this.Neck3); + this.Neck3.addChild(this.Headneck); + this.Lowerjaw.addChild(this.Lowerbeak3); + this.LegL.addChild(this.FootL); + this.Upperjaw.addChild(this.Beaktusk1); + this.Torsoback.addChild(this.Back); + this.Back.addChild(this.Bellyback); + this.Headneck.addChild(this.Headtop1); + this.Torsoback.addChild(this.Neck1); + this.ArmL.addChild(this.FrontfootL); + this.ArmR.addChild(this.FrontfootR); + this.Back.addChild(this.ThighL); + this.Lowerjaw.addChild(this.Lowerbeak2); + this.Torsoback.addChild(this.Torsobelly); + this.Headneck.addChild(this.Gums); + this.Upperjaw.addChild(this.Upperbeak1); + this.Torsoback.addChild(this.ShoulderR); + this.Back.addChild(this.Tail1); + this.Torsoback.addChild(this.ShoulderL); + this.ShoulderR.addChild(this.ArmR); + this.ThighL.addChild(this.LegL); + this.ThighR.addChild(this.LegR); + this.Upperjaw.addChild(this.Beaktusk2); + this.Tail1.addChild(this.Tail2); + this.Headtop2.addChild(this.Headtop3); + this.LegR.addChild(this.FootR); + this.Neck1.addChild(this.Neck2); + this.Back.addChild(this.ThighR); + this.Neck1.addChild(this.Neckunder); + this.Upperjaw.addChild(this.Upperbeak2); + this.Tail3.addChild(this.Tail4); + this.ShoulderL.addChild(this.ArmL); + this.Headtop1.addChild(this.shape41); + this.Headtop1.addChild(this.Headtop2); + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + this.Torsoback.render(f5); + } + + /** + * This is a helper function from Tabula to set the rotation of model parts + */ + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } +} diff --git a/TODO/Unimplemented/MFIIBasilisk-texture.png b/TODO/Unimplemented/MFIIBasilisk-texture.png new file mode 100644 index 0000000000000000000000000000000000000000..dd1058170a486a755fde652b406b5f27dd804954 GIT binary patch literal 23175 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 literal 0 HcmV?d00001 From 245c59b2517284cbf5ccc653ab382a7f1983fa80 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 18 Aug 2017 22:50:21 +0700 Subject: [PATCH 046/101] Started network usage overhaul I don't forget about NEI and MT, but network fixes are more prefered --- .../mf2/block/crafting/BlockFirepit.java | 27 ++-- .../block/tileentity/TileEntityFirepit.java | 138 +++++++----------- .../mf2/network/packet/FirepitPacket.java | 46 ------ .../mf2/network/packet/PacketHandlerMF.java | 1 - 4 files changed, 61 insertions(+), 151 deletions(-) delete mode 100644 src/main/java/minefantasy/mf2/network/packet/FirepitPacket.java diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java b/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java index a44082cc..4e4ae68d 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java @@ -11,7 +11,6 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -45,17 +44,6 @@ public int quantityDropped(Random rand) { return 0; } - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) { - if (world.isRemote) { - return; - } - - TileEntityFirepit firepit = (TileEntityFirepit) world.getTileEntity(x, y, z); - if (firepit != null && player.getHeldItem() != null) { - } - } - @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, float f2) { @@ -159,6 +147,16 @@ public boolean renderAsNormalBlock() { return false; } + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random random) { + TileEntityFirepit firepit = (TileEntityFirepit) world.getTileEntity(x, y, z); + if (firepit != null && firepit.isBurning()) { + world.spawnParticle("smoke", x + 0.5D, y + 0.5D, z + 0.5D, 0.0D, 0.0D, 0.0D); + world.spawnParticle("flame", x + 0.5D, y + 0.5D, z + 0.5D, 0.0D, 0.0D, 0.0D); + world.playSound(x, y, z, "fire.fire", 1.0F + random.nextFloat(), random.nextFloat() * 0.7F + 0.3F, false); + } + } + @Override public int getLightValue(IBlockAccess world, int x, int y, int z) { if (world.getBlockMetadata(x, y, z) == 1) { @@ -214,9 +212,4 @@ public void breakBlock(World world, int x, int y, int z, Block block, int meta) } super.breakBlock(world, x, y, z, block, meta); } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java index 7caf6324..af51daab 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java @@ -1,6 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; import java.util.Random; import cpw.mods.fml.relauncher.Side; @@ -12,11 +11,8 @@ import minefantasy.mf2.api.helpers.Functions; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.SkillList; -import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.network.packet.FirepitPacket; -import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; @@ -28,13 +24,15 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; 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.StatCollector; -import net.minecraft.world.WorldServer; public class TileEntityFirepit extends TileEntity implements IBasicMetre, IHeatSource { public int fuel = 0; - private int maxFuel = 12000; // 10 minutes + private final int maxFuel = 12000; // 10 minutes private float charcoal = 0; private int ticksExisted; private Random rand = new Random(); @@ -42,70 +40,37 @@ public class TileEntityFirepit extends TileEntity implements IBasicMetre, IHeatS @Override public void updateEntity() { super.updateEntity(); - ++ticksExisted; - - if (!worldObj.isRemote) { - if (!isLit() && fuel > 0 && ticksExisted % 10 == 0) { - tryLight(); - } - - if (isLit()) { - if (fuel > 0) { - fuel--; - charcoal += (0.25F / 20F / 60F); - } - - if (fuel <= 0) { - setLit(false); - } - - if (isLit() && isWet()) { - extinguish(Blocks.water, 0); - } + if (worldObj.isRemote) { + if (isLit() && fuel > 0) { + fuel--; } - sendPacketToClients(); + return; } - if (worldObj.isRemote) { - if (ticksExisted % 5 == 0 && isLit()) { - worldObj.spawnParticle("smoke", xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 0.0D, 0.0D, 0.0D); - worldObj.spawnParticle("flame", xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 0.0D, 0.0D, 0.0D); - if (rand.nextInt(100) == 0) { - worldObj.playSound(xCoord + 0.5F, yCoord + 0.5F, zCoord + 0.5F, "fire.fire", - 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F, false); - } + ++ticksExisted; + if (isLit()) { + if (isWet()) { + extinguish(Blocks.water, 0); + return; } - if (ticksExisted % 20 == 0) { - if (worldObj.getBlock(xCoord, yCoord, zCoord) != BlockListMF.firepit) { - worldObj.removeTileEntity(xCoord, yCoord, zCoord); - MFLogUtil.logWarn("Firepit missing block"); - } + if (fuel > 0) { + fuel--; + charcoal += (0.25F / 20F / 60F); } - } - } - - public boolean hasBlockAbove() { - if (worldObj == null) - return false; - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); - if (tile != null && tile instanceof IHeatUser) { - return ((IHeatUser) tile).canAccept(this); + if (fuel <= 0) { + setLit(false); + } + } else if (fuel > 0 && ticksExisted % 10 == 0) { + tryLight(); } - - return false; } private boolean isWet() { if (isWater(-1, 0, 0) || isWater(1, 0, 0) || isWater(0, 0, -1) || isWater(0, 0, 1) || isWater(0, 1, 0)) { return true; } - /* - * if(worldObj.getBlock(xCoord, yCoord+1, zCoord) == BlockListMF.roast.blockID) - * { if(worldObj.canLightningStrikeAt(xCoord, yCoord+2, zCoord)) { return true; - * } } - */ return worldObj.canLightningStrikeAt(xCoord, yCoord + 1, zCoord); } @@ -153,32 +118,38 @@ public void setLit(boolean lit) { if (worldObj != null) { worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, lit ? 1 : 0, 2); } + ticksExisted = 0; } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setInteger("fuel", fuel); - nbt.setInteger("maxFuel", maxFuel); nbt.setInteger("ticksExisted", ticksExisted); - nbt.setFloat("charcoal", charcoal); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - setLit(nbt.getBoolean("isLit")); - fuel = nbt.getInteger("fuel"); - maxFuel = nbt.getInteger("maxFuel"); ticksExisted = nbt.getInteger("ticksExisted"); - charcoal = nbt.getFloat("charcoal"); } + @Override + public Packet getDescriptionPacket() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("fuel", fuel); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, tag); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) { + fuel = packet.func_148857_g().getInteger("fuel"); + } + /** * Gets the burn time * @@ -189,9 +160,6 @@ public static int getItemBurnTime(ItemStack input) { return 0; } else { Item i = input.getItem(); - /*int d = input.getItemDamage(); - Item item = input.getItem();*/ - if (i == Items.stick) return 600;// 30Sec if (i == ComponentListMF.plank || i == ComponentListMF.plank_cut) { @@ -212,20 +180,10 @@ public boolean canPlaceAbove() { @Override public int getHeat() { - if (!isBurning()) + if (!isBurning()) { return 0; - return Functions.getIntervalWave1_i(ticksExisted, 30, 100, 200);// 100*-300* - } - - private void sendPacketToClients() { - if (worldObj.isRemote) - return; - - List players = ((WorldServer) worldObj).playerEntities; - for (int i = 0; i < players.size(); i++) { - EntityPlayer player = players.get(i); - ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new FirepitPacket(this).generatePacket()); } + return Functions.getIntervalWave1_i(ticksExisted, 30, 100, 200);// 100*-300* } @Override @@ -255,10 +213,6 @@ public String getLocalisedName() { return "150C " + StatCollector.translateToLocal("forge.fuel.name") + " " + mins + ":" + s + seconds; } - public void extinguish() { - extinguish(Blocks.sand, 0); - } - public void extinguish(Block block, int meta) { worldObj.playSoundEffect(xCoord + 0.5F, yCoord + 0.25F, zCoord + 0.5F, "random.fizz", 0.4F, 2.0F + this.rand.nextFloat() * 0.4F); @@ -270,10 +224,6 @@ public void extinguish(Block block, int meta) { } public boolean tryCook(EntityPlayer player, ItemStack held) { - if (rand.nextInt(10) != 0) - return false; - if (held == null) - return false; if (held.getItem() instanceof ItemFood) { player.swingItem(); if (worldObj.isRemote) { @@ -281,6 +231,9 @@ public boolean tryCook(EntityPlayer player, ItemStack held) { } ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(held); if (result != null) { + if (rand.nextInt(10) != 0) { + return false; + } float chance = 75F; if (RPGElements.isSystemActive) { int skill = RPGElements.getLevel(player, SkillList.provisioning); @@ -290,7 +243,6 @@ public boolean tryCook(EntityPlayer player, ItemStack held) { ItemStack creation = success ? result.copy() : new ItemStack(FoodListMF.burnt_food); dropItem(player, creation); SkillList.provisioning.addXP(player, success ? 2 : 1); - return true; } } @@ -303,4 +255,16 @@ public void dropItem(EntityPlayer player, ItemStack item) { drop.motionX = drop.motionY = drop.motionZ = 0; worldObj.spawnEntityInWorld(drop); } + + public boolean hasBlockAbove() { + if (worldObj == null) + return false; + + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + if (tile != null && tile instanceof IHeatUser) { + return ((IHeatUser) tile).canAccept(this); + } + + return false; + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/FirepitPacket.java b/src/main/java/minefantasy/mf2/network/packet/FirepitPacket.java deleted file mode 100644 index 92a56bcf..00000000 --- a/src/main/java/minefantasy/mf2/network/packet/FirepitPacket.java +++ /dev/null @@ -1,46 +0,0 @@ -package minefantasy.mf2.network.packet; - -import io.netty.buffer.ByteBuf; -import minefantasy.mf2.block.tileentity.TileEntityFirepit; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; - -public class FirepitPacket extends PacketMF { - public static final String packetName = "MF2_FirepitPacket"; - private int[] coords = new int[3]; - private int fuel = 0; - - public FirepitPacket(TileEntityFirepit tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - this.fuel = tile.fuel; - } - - public FirepitPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - fuel = packet.readInt(); - - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if (entity != null && entity instanceof TileEntityFirepit) { - TileEntityFirepit tile = (TileEntityFirepit) entity; - tile.fuel = fuel; - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeInt(fuel); - } -} diff --git a/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java b/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java index e790ff9c..916defa7 100644 --- a/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java +++ b/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java @@ -36,7 +36,6 @@ public PacketHandlerMF() { packetList.put(RoadPacket.packetName, new RoadPacket()); packetList.put(BloomeryPacket.packetName, new BloomeryPacket()); packetList.put(CrossbowBenchPacket.packetName, new CrossbowBenchPacket()); - packetList.put(FirepitPacket.packetName, new FirepitPacket()); packetList.put(TileInventoryPacket.packetName, new TileInventoryPacket()); packetList.put(BigFurnacePacket.packetName, new BigFurnacePacket()); packetList.put(DodgeCommand.packetName, new DodgeCommand()); From 81eb90d3a57e4a0555193f00a316db1c7c59f39d Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 20 Aug 2017 23:44:18 +0700 Subject: [PATCH 047/101] Fixes --- .../mf2/block/tileentity/TileEntityFirepit.java | 3 ++- .../minefantasy/mf2/config/ConfigIntegration.java | 4 ++-- .../minefantasy/mf2/integration/nei/NEIConfig.java | 4 ++-- .../mf2/integration/nei/RecipeHandlerAnvil.java | 5 ++++- .../mf2/integration/nei/RecipeHandlerCarpenter.java | 11 +++++++---- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java index af51daab..e9656a6b 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java @@ -41,7 +41,7 @@ public class TileEntityFirepit extends TileEntity implements IBasicMetre, IHeatS public void updateEntity() { super.updateEntity(); if (worldObj.isRemote) { - if (isLit() && fuel > 0) { + if (isBurning()) { fuel--; } return; @@ -117,6 +117,7 @@ public boolean addFuel(ItemStack input) { public void setLit(boolean lit) { if (worldObj != null) { worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, lit ? 1 : 0, 2); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } ticksExisted = 0; } diff --git a/src/main/java/minefantasy/mf2/config/ConfigIntegration.java b/src/main/java/minefantasy/mf2/config/ConfigIntegration.java index 51948f46..d1938f3e 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigIntegration.java +++ b/src/main/java/minefantasy/mf2/config/ConfigIntegration.java @@ -16,9 +16,9 @@ public class ConfigIntegration extends ConfigurationBaseMF { @Override protected void loadConfig() { - neiIntegration = Boolean.getBoolean( + neiIntegration = Boolean.parseBoolean( config.get(CATEGORY_MODS, "NEI Integration", true, "Enable Not Enough Items integration").getString()); - mtIntegration = Boolean.getBoolean( + mtIntegration = Boolean.parseBoolean( config.get(CATEGORY_MODS, "MT Integration", true, "Enable MineTweaker (CraftTweaker) integration") .getString()); diff --git a/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java b/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java index b7b14a4b..c4af3774 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java +++ b/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java @@ -38,9 +38,9 @@ public void loadConfig() { API.registerRecipeHandler(handlerQuern); API.registerUsageHandler(handlerQuern); - RecipeHandlerTanning handlerTanning = new RecipeHandlerTanning(); + /*RecipeHandlerTanning handlerTanning = new RecipeHandlerTanning(); API.registerRecipeHandler(handlerTanning); - API.registerUsageHandler(handlerTanning); + API.registerUsageHandler(handlerTanning);*/ RecipeHandlerCrucible handlerCrucible = new RecipeHandlerCrucible(); API.registerRecipeHandler(handlerCrucible); diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java index 0cbaf281..2ca63b3e 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java @@ -15,6 +15,7 @@ import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.knowledge.ResearchLogic; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; @@ -32,7 +33,9 @@ public String getGuiTexture() { @Override public void drawBackground(int recipe) { - GL11.glColor4f(1, 1, 1, 1); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GuiDraw.changeTexture(getGuiTexture()); GuiDraw.drawTexturedModalRect(0, 0, 5, 22, 166, 147); } diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java index de26d71a..12b955eb 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java @@ -15,6 +15,7 @@ import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.knowledge.ResearchLogic; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; @@ -81,7 +82,9 @@ public void loadUsageRecipes(ItemStack ingredient) { @Override public void drawBackground(int recipe) { - GL11.glColor3f(255, 255, 255); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GuiDraw.changeTexture(getGuiTexture()); GuiDraw.drawTexturedModalRect(0, 0, 5, 33, 166, 171); } @@ -117,8 +120,8 @@ public CachedCarpenterRecipe(ShapelessCarpenterRecipes recipe) { public void setIngredients(List items) { ingredients.clear(); for (int ingred = 0; ingred < items.size(); ingred++) { - MFPositionedStack stack = new MFPositionedStack(items.get(ingred), 41 + stackorder[ingred][0] * 18, - 47 + stackorder[ingred][1] * 18); + MFPositionedStack stack = new MFPositionedStack(items.get(ingred), 41 + stackorder[ingred][0] * 23, + 47 + stackorder[ingred][1] * 12); stack.setMaxSize(1); ingredients.add(stack); } @@ -130,7 +133,7 @@ public void setIngredients(int width, int height, Object[] items) { if (items[y * width + x] == null) continue; - MFPositionedStack stack = new MFPositionedStack(items[y * width + x], 41 + x * 18, 47 + y * 18, + MFPositionedStack stack = new MFPositionedStack(items[y * width + x], 41 + x * 23, 47 + y * 23, false); stack.setMaxSize(1); ingredients.add(stack); From a53777ba9cad918f604afd6515a257edc8c89704 Mon Sep 17 00:00:00 2001 From: Yesterday17 Date: Thu, 24 Aug 2017 15:41:00 +0800 Subject: [PATCH 048/101] Tried to fix the problem of sending packets to every player. I used part of code in Railcraft(mentioned in code) to make sure the packets are sent to the players in need of it. Howerver, i edited all the TileEntities used the old method(like syncData), so it may cause some problem. The stability needs check. Also, i fixed the problem of missing textures caused by mistaking upper and lower characters. --- build.gradle | 2 +- .../mf2/block/tileentity/TileEntityAnvilMF.java | 11 ++++++++--- .../mf2/block/tileentity/TileEntityBigFurnace.java | 9 ++++++--- .../mf2/block/tileentity/TileEntityBloomery.java | 9 ++++++--- .../mf2/block/tileentity/TileEntityBombBench.java | 10 +++++++--- .../mf2/block/tileentity/TileEntityCarpenterMF.java | 10 +++++++--- .../mf2/block/tileentity/TileEntityComponent.java | 7 +++++-- .../block/tileentity/TileEntityCrossbowBench.java | 10 +++++++--- .../mf2/block/tileentity/TileEntityForge.java | 10 +++++++--- .../mf2/block/tileentity/TileEntityResearch.java | 12 ++++++++---- .../mf2/block/tileentity/TileEntityRoad.java | 10 +++++++--- .../mf2/block/tileentity/TileEntityRoast.java | 10 +++++++--- .../block/tileentity/decor/TileEntityAmmoBox.java | 7 +++++-- .../mf2/block/tileentity/decor/TileEntityRack.java | 10 ++++++++-- .../mf2/block/tileentity/decor/TileEntityTrough.java | 8 ++++++-- .../block/tileentity/decor/TileEntityWoodDecor.java | 10 ++++++++-- .../minefantasy/mf2/item/armour/ItemArmourMF.java | 4 ++-- 17 files changed, 105 insertions(+), 44 deletions(-) diff --git a/build.gradle b/build.gradle index 635b037e..cdadf2a5 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { apply plugin: 'forge' -version = "2.8.13.1u" +version = "2.8.14.1u" group= "minefantasy.mf2.minefantasy2" archivesBaseName = "MineFantasyII" diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java index 279e1900..7f75bc90 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; -import java.util.Random; - import minefantasy.mf2.api.crafting.IQualityBalance; import minefantasy.mf2.api.crafting.anvil.AnvilCraftMatrix; import minefantasy.mf2.api.crafting.anvil.CraftingManagerAnvil; @@ -21,6 +18,7 @@ import minefantasy.mf2.knowledge.KnowledgeListMF; import minefantasy.mf2.mechanics.PlayerTickHandlerMF; import minefantasy.mf2.network.packet.AnvilPacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -33,6 +31,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; +import java.util.Random; + public class TileEntityAnvilMF extends TileEntity implements IInventory, IAnvil, IQualityBalance { public int tier; private ItemStack[] inventory; @@ -564,11 +564,16 @@ public void syncData() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new AnvilPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); + ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new AnvilPacket(this).generatePacket()); } + */ } public String resName = ""; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java index 675de940..3b66a4ea 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.heating.ForgeItemHandler; @@ -14,6 +11,7 @@ import minefantasy.mf2.block.refining.BlockBigFurnace; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.network.packet.BigFurnacePacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -32,6 +30,8 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Random; + public class TileEntityBigFurnace extends TileEntity implements IBellowsUseable, IInventory, ISidedInventory { // UNIVERSAL @@ -617,12 +617,15 @@ public ItemStack getStackInSlotOnClosing(int var1) { private void sendPacketToClients() { if (!worldObj.isRemote) { + NetworkUtils.sendToWatchers(new BigFurnacePacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new BigFurnacePacket(this).generatePacket()); } + */ } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java index c63d385a..52799a65 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.crafting.MineFantasyFuels; @@ -17,6 +14,7 @@ import minefantasy.mf2.knowledge.KnowledgeListMF; import minefantasy.mf2.network.packet.BloomeryPacket; import minefantasy.mf2.util.MFLogUtil; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -28,6 +26,8 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; +import java.util.Random; + public class TileEntityBloomery extends TileEntity implements IInventory { private ItemStack[] inv = new ItemStack[3]; public float progress, progressMax; @@ -90,12 +90,15 @@ public void syncData() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new BloomeryPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new BloomeryPacket(this).generatePacket()); } + */ } private int ticksExisted; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java index cb991ca6..6d040fa5 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; -import java.util.Random; - import minefantasy.mf2.api.crafting.IBasicMetre; import minefantasy.mf2.api.crafting.engineer.IBombComponent; import minefantasy.mf2.api.helpers.ToolHelper; @@ -13,6 +10,7 @@ import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.knowledge.KnowledgeListMF; import minefantasy.mf2.network.packet.BombBenchPacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -26,6 +24,8 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.WorldServer; +import java.util.Random; + public class TileEntityBombBench extends TileEntity implements IInventory, ISidedInventory, IBasicMetre { private ItemStack[] inv = new ItemStack[6]; private Random rand = new Random(); @@ -147,12 +147,16 @@ public void syncData() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new BombBenchPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new BombBenchPacket(this).generatePacket()); } + */ } private boolean areItemsEqual(ItemStack bomb1, ItemStack bomb2) { diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java index cb10bf9d..8c7d30f8 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; -import java.util.Random; - import minefantasy.mf2.api.crafting.carpenter.CarpenterCraftMatrix; import minefantasy.mf2.api.crafting.carpenter.CraftingManagerCarpenter; import minefantasy.mf2.api.crafting.carpenter.ICarpenter; @@ -14,6 +11,7 @@ import minefantasy.mf2.item.armour.ItemArmourMF; import minefantasy.mf2.network.packet.CarpenterPacket; import minefantasy.mf2.util.MFLogUtil; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -24,6 +22,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; +import java.util.Random; + public class TileEntityCarpenterMF extends TileEntity implements IInventory, ICarpenter { private int tier; private ItemStack[] inventory; @@ -351,12 +351,16 @@ public void syncData() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new CarpenterPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new CarpenterPacket(this).generatePacket()); } + */ } public String resName = ""; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java index 522e1a85..7b7389b4 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java @@ -1,11 +1,10 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; - import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockComponent; import minefantasy.mf2.network.packet.StorageBlockPacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -125,12 +124,16 @@ public void syncData() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new StorageBlockPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new StorageBlockPacket(this).generatePacket()); } + */ } public boolean isFull() { diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java index 70ff3ba2..38219565 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java @@ -1,14 +1,12 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; -import java.util.Random; - import minefantasy.mf2.api.crafting.IBasicMetre; import minefantasy.mf2.api.crafting.engineer.ICrossbowPart; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.network.packet.CrossbowBenchPacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; @@ -19,6 +17,8 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.WorldServer; +import java.util.Random; + public class TileEntityCrossbowBench extends TileEntity implements IInventory, ISidedInventory, IBasicMetre { /** * Stock, Head, Mod, Muzzle, Result @@ -92,12 +92,16 @@ public void syncData() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new CrossbowBenchPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new CrossbowBenchPacket(this).generatePacket()); } + */ } public void onInventoryChanged() { diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java index 1a30fdda..44e0f178 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.crafting.IBasicMetre; @@ -17,6 +14,7 @@ import minefantasy.mf2.item.heatable.ItemHeated; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.network.packet.ForgePacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -29,6 +27,8 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.WorldServer; +import java.util.Random; + public class TileEntityForge extends TileEntity implements IInventory, IBasicMetre, IHeatSource, IBellowsUseable { private ItemStack[] inv = new ItemStack[1]; public float fuel; @@ -499,11 +499,15 @@ private void syncData() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new ForgePacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new ForgePacket(this).generatePacket()); } + */ } int justShared; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java index bcc6616d..e0d343a4 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java @@ -1,9 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import minefantasy.mf2.api.crafting.IBasicMetre; import minefantasy.mf2.api.knowledge.IArtefact; import minefantasy.mf2.api.knowledge.InformationBase; @@ -11,6 +7,7 @@ import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.network.packet.ResearchTablePacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; @@ -21,6 +18,9 @@ import net.minecraft.util.ChatComponentTranslation; import net.minecraft.world.WorldServer; +import java.util.ArrayList; +import java.util.Random; + public class TileEntityResearch extends TileEntity implements IInventory, IBasicMetre { private ItemStack[] items = new ItemStack[1]; public float progress; @@ -165,12 +165,16 @@ public void syncData() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new ResearchTablePacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new ResearchTablePacket(this).generatePacket()); } + */ } @Override diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java index 2ef37b29..05ca7208 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java @@ -1,10 +1,8 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; -import java.util.Random; - import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.network.packet.RoadPacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.entity.player.EntityPlayer; @@ -13,6 +11,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; +import java.util.Random; + public class TileEntityRoad extends TileEntity { public int[] surface = new int[] { 0, 0 }; public boolean isLocked = false; @@ -54,11 +54,15 @@ public void sendPacketToClients() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new RoadPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new RoadPacket(this).generatePacket()); } + */ } public void requestPacket() { diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java index 30801603..233d595b 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.cooking.CookRecipe; @@ -11,6 +8,7 @@ import minefantasy.mf2.block.crafting.BlockRoast; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.network.packet.TileInventoryPacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -22,6 +20,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; +import java.util.Random; + public class TileEntityRoast extends TileEntity implements IInventory, IHeatUser { public ItemStack[] items = new ItemStack[1]; public float progress; @@ -310,12 +310,16 @@ private void sendPacketToClients() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new TileInventoryPacket(this, this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new TileInventoryPacket(this, this).generatePacket()); } + */ } public String texname = "basic"; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java index beaa0d97..594fd579 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.tileentity.decor; -import java.util.List; - import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.archery.IAmmo; import minefantasy.mf2.api.archery.IFirearm; @@ -12,6 +10,7 @@ import minefantasy.mf2.item.ItemBandage; import minefantasy.mf2.item.gadget.ItemSyringe; import minefantasy.mf2.network.packet.AmmoBoxPacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemFood; @@ -196,12 +195,16 @@ public void syncData() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new AmmoBoxPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new AmmoBoxPacket(this).generatePacket()); super.sendPacketToClient(player); } + */ } public int getMaxAmmo(ItemStack ammo) { diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java index 39ebf3b6..85fae63f 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java @@ -1,10 +1,9 @@ package minefantasy.mf2.block.tileentity.decor; -import java.util.List; - import minefantasy.mf2.api.helpers.BlockPositionHelper; import minefantasy.mf2.api.weapon.IRackItem; import minefantasy.mf2.network.packet.TileInventoryPacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -17,6 +16,8 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; + public class TileEntityRack extends TileEntityWoodDecor implements IInventory { private ItemStack inv[]; private int ticksExisted; @@ -116,12 +117,17 @@ public void updateEntity() { public void syncItems() { if (!worldObj.isRemote) { List players = ((WorldServer) worldObj).playerEntities; + + NetworkUtils.sendToWatchers(new TileInventoryPacket(this, this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + super.sendPacketToClient(); + /* for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new TileInventoryPacket(this, this).generatePacket()); super.sendPacketToClient(player); } + */ } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java index 752b0fef..adf76bcd 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java @@ -1,10 +1,9 @@ package minefantasy.mf2.block.tileentity.decor; -import java.util.List; - import minefantasy.mf2.api.heating.IQuenchBlock; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.network.packet.TroughPacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -121,12 +120,17 @@ public void syncData() { if (worldObj.isRemote) return; + NetworkUtils.sendToWatchers(new TroughPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + super.sendPacketToClient(); + + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new TroughPacket(this).generatePacket()); super.sendPacketToClient(player); } + */ } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java index 722419e3..7147e25f 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java @@ -3,8 +3,8 @@ import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockWoodDecor; import minefantasy.mf2.network.packet.WoodDecorPacket; +import minefantasy.mf2.util.NetworkUtils; import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; @@ -77,7 +77,13 @@ public String getTexName() { return tex; } - public void sendPacketToClient(EntityPlayer player) { + public void sendPacketToClient() { + NetworkUtils.sendToWatchers(new WoodDecorPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + } + + /* + public void sendPacketToClient(EntityPlayer player){ ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new WoodDecorPacket(this).generatePacket()); } + */ } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java index f2330774..f0486367 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.armour; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -32,6 +30,8 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.IIcon; +import java.util.List; + public class ItemArmourMF extends ItemArmourMFBase implements IElementalResistance { @SideOnly(Side.CLIENT) private static Object fullplate; From 9ef0467b8e70cbca62a4cec5cc1e4993287678e2 Mon Sep 17 00:00:00 2001 From: Yesterday17 Date: Thu, 24 Aug 2017 15:48:54 +0800 Subject: [PATCH 049/101] Add NetworkUtils.java to the repository --- .../minefantasy/mf2/util/NetworkUtils.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/main/java/minefantasy/mf2/util/NetworkUtils.java diff --git a/src/main/java/minefantasy/mf2/util/NetworkUtils.java b/src/main/java/minefantasy/mf2/util/NetworkUtils.java new file mode 100644 index 00000000..d68a86d3 --- /dev/null +++ b/src/main/java/minefantasy/mf2/util/NetworkUtils.java @@ -0,0 +1,42 @@ +package minefantasy.mf2.util; + +import cpw.mods.fml.relauncher.ReflectionHelper; +import net.minecraft.network.Packet; +import net.minecraft.server.management.PlayerManager; +import net.minecraft.world.WorldServer; + +import java.lang.reflect.Method; + +/** + * Here I used code in Railcraft. + * + * https://github.com/Railcraft/Railcraft/blob/mc-1.7.10/src/main/java/mods/railcraft/common/util/network/PacketDispatcher.java + */ + +public class NetworkUtils { + private static final Class playerInstanceClass; + private static final Method getOrCreateChunkWatcher; + private static final Method sendToAllPlayersWatchingChunk; + + static { + try { + playerInstanceClass = PlayerManager.class.getDeclaredClasses()[0]; + getOrCreateChunkWatcher = ReflectionHelper.findMethod(PlayerManager.class, null, new String[]{"func_72690_a", "getOrCreateChunkWatcher"}, int.class, int.class, boolean.class); + sendToAllPlayersWatchingChunk = ReflectionHelper.findMethod(playerInstanceClass, null, new String[]{"func_151251_a", "sendToAllPlayersWatchingChunk"}, Packet.class); + getOrCreateChunkWatcher.setAccessible(true); + sendToAllPlayersWatchingChunk.setAccessible(true); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + public static void sendToWatchers(Packet packet, WorldServer world, int worldX, int worldZ) { + try { + Object playerInstance = getOrCreateChunkWatcher.invoke(world.getPlayerManager(), worldX >> 4, worldZ >> 4, false); + if (playerInstance != null) + sendToAllPlayersWatchingChunk.invoke(playerInstance, packet); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } +} From 6d3cd00e3a4ea5f4060da740873bba8aa9023c11 Mon Sep 17 00:00:00 2001 From: Sirse Date: Thu, 24 Aug 2017 17:43:47 +0700 Subject: [PATCH 050/101] Fixed training mace recipe --- src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java index ddec42bb..78960317 100644 --- a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java @@ -94,7 +94,7 @@ public static void init() { 30, new Object[] { " II ", "SSIN", " I ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', Blocks.planks, }); MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.maceTraining), nailHammer, "knife", 1, 35, - new Object[] { " II ", "SSIIN", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', + new Object[] { " II", "SSII", " N ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', Blocks.planks, }); MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.spearTraining), nailHammer, "knife", 1, 20, new Object[] { " N ", "SSSI", " N ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', From fedc09891ef834a17b94e718aa630fc7d967d465 Mon Sep 17 00:00:00 2001 From: Sirse Date: Thu, 24 Aug 2017 20:14:03 +0700 Subject: [PATCH 051/101] RM files --- .../items/Apparel/Clothing/leatherapron.png | Bin 207 -> 0 bytes .../Apparel/Clothing/leatherapron_overlay.png | Bin 256 -> 0 bytes .../textures/items/Apparel/Leather/hide_boots.png | Bin 168 -> 0 bytes .../items/Apparel/Leather/hide_boots_overlay.png | Bin 228 -> 0 bytes .../textures/items/Apparel/Leather/hide_chest.png | Bin 152 -> 0 bytes .../items/Apparel/Leather/hide_chest_overlay.png | Bin 213 -> 0 bytes .../items/Apparel/Leather/hide_helmet.png | Bin 125 -> 0 bytes .../items/Apparel/Leather/hide_helmet_overlay.png | Bin 241 -> 0 bytes .../textures/items/Apparel/Leather/hide_legs.png | Bin 97 -> 0 bytes .../items/Apparel/Leather/hide_legs_overlay.png | Bin 214 -> 0 bytes .../items/Apparel/Leather/roughleather_boots.png | Bin 121 -> 0 bytes .../Leather/roughleather_boots_overlay.png | Bin 193 -> 0 bytes .../items/Apparel/Leather/roughleather_chest.png | Bin 152 -> 0 bytes .../Leather/roughleather_chest_overlay.png | Bin 297 -> 0 bytes .../items/Apparel/Leather/roughleather_helmet.png | Bin 128 -> 0 bytes .../Leather/roughleather_helmet_overlay.png | Bin 170 -> 0 bytes .../items/Apparel/Leather/roughleather_legs.png | Bin 112 -> 0 bytes .../Apparel/Leather/roughleather_legs_overlay.png | Bin 172 -> 0 bytes .../items/Apparel/Leather/scaleleather_boots.png | Bin 204 -> 0 bytes .../Leather/scaleleather_boots_overlay.png | Bin 225 -> 0 bytes .../items/Apparel/Leather/scaleleather_chest.png | Bin 253 -> 0 bytes .../Leather/scaleleather_chest_overlay.png | Bin 287 -> 0 bytes .../items/Apparel/Leather/scaleleather_helmet.png | Bin 203 -> 0 bytes .../Leather/scaleleather_helmet_overlay.png | Bin 181 -> 0 bytes .../items/Apparel/Leather/scaleleather_legs.png | Bin 224 -> 0 bytes .../Apparel/Leather/scaleleather_legs_overlay.png | Bin 241 -> 0 bytes .../items/Apparel/Leather/strongleather_boots.png | Bin 204 -> 0 bytes .../Leather/strongleather_boots_overlay.png | Bin 233 -> 0 bytes .../items/Apparel/Leather/strongleather_chest.png | Bin 261 -> 0 bytes .../Leather/strongleather_chest_overlay.png | Bin 292 -> 0 bytes .../Apparel/Leather/strongleather_helmet.png | Bin 203 -> 0 bytes .../Leather/strongleather_helmet_overlay.png | Bin 220 -> 0 bytes .../items/Apparel/Leather/strongleather_legs.png | Bin 224 -> 0 bytes .../Leather/strongleather_legs_overlay.png | Bin 265 -> 0 bytes .../items/Apparel/Leather/studleather_boots.png | Bin 204 -> 0 bytes .../Apparel/Leather/studleather_boots_overlay.png | Bin 215 -> 0 bytes .../items/Apparel/Leather/studleather_chest.png | Bin 253 -> 0 bytes .../Apparel/Leather/studleather_chest_overlay.png | Bin 247 -> 0 bytes .../items/Apparel/Leather/studleather_helmet.png | Bin 203 -> 0 bytes .../Leather/studleather_helmet_overlay.png | Bin 168 -> 0 bytes .../items/Apparel/Leather/studleather_legs.png | Bin 224 -> 0 bytes .../Apparel/Leather/studleather_legs_overlay.png | Bin 215 -> 0 bytes .../items/Apparel/Padding/padded_boots.png | Bin 186 -> 0 bytes .../Apparel/Padding/padded_boots_overlay.png | Bin 133 -> 0 bytes .../items/Apparel/Padding/padded_chest.png | Bin 237 -> 0 bytes .../Apparel/Padding/padded_chest_overlay.png | Bin 115 -> 0 bytes .../items/Apparel/Padding/padded_helmet.png | Bin 167 -> 0 bytes .../Apparel/Padding/padded_helmet_overlay.png | Bin 124 -> 0 bytes .../items/Apparel/Padding/padded_legs.png | Bin 170 -> 0 bytes .../items/Apparel/Padding/padded_legs_overlay.png | Bin 123 -> 0 bytes .../Apparel/cogwork/cogwork_armour_boots.png | Bin 217 -> 0 bytes .../cogwork/cogwork_armour_boots_detail.png | Bin 140 -> 0 bytes .../Apparel/cogwork/cogwork_armour_chest.png | Bin 379 -> 0 bytes .../cogwork/cogwork_armour_chest_detail.png | Bin 129 -> 0 bytes .../Apparel/cogwork/cogwork_armour_helmet.png | Bin 293 -> 0 bytes .../cogwork/cogwork_armour_helmet_detail.png | Bin 190 -> 0 bytes .../items/Apparel/cogwork/cogwork_armour_legs.png | Bin 292 -> 0 bytes .../cogwork/cogwork_armour_legs_detail.png | Bin 139 -> 0 bytes .../items/Apparel/cogwork/cogwork_frame_boots.png | Bin 297 -> 0 bytes .../cogwork/cogwork_frame_boots_detail.png | Bin 140 -> 0 bytes .../items/Apparel/cogwork/cogwork_frame_chest.png | Bin 438 -> 0 bytes .../cogwork/cogwork_frame_chest_detail.png | Bin 129 -> 0 bytes .../Apparel/cogwork/cogwork_frame_helmet.png | Bin 334 -> 0 bytes .../cogwork/cogwork_frame_helmet_detail.png | Bin 190 -> 0 bytes .../items/Apparel/cogwork/cogwork_frame_legs.png | Bin 287 -> 0 bytes .../Apparel/cogwork/cogwork_frame_legs_detail.png | Bin 139 -> 0 bytes 66 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Clothing/leatherapron.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Clothing/leatherapron_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_boots.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_boots_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_chest.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_chest_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_helmet.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_helmet_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_legs.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_legs_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_boots.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_boots_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_chest.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_chest_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_helmet.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_helmet_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_legs.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_legs_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_boots.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_boots_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_chest.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_chest_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_helmet.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_helmet_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_legs.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_legs_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_boots.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_boots_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_chest.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_chest_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_helmet.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_helmet_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_legs.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_legs_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_boots.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_boots_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_chest.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_chest_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_helmet.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_helmet_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_legs.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_legs_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_boots.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_boots_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_chest.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_chest_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_helmet.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_helmet_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_legs.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_legs_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_boots.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_boots_detail.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_chest.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_chest_detail.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_helmet.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_helmet_detail.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_legs.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_legs_detail.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_boots.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_boots_detail.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_chest.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_chest_detail.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_helmet.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_helmet_detail.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_legs.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_legs_detail.png diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Clothing/leatherapron.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Clothing/leatherapron.png deleted file mode 100644 index 4ff4b239e41f7b86686b6cc04204da086d3dfed2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmV;=05JcFP)? z0bOV5su03BgvOlnIqg^Osyoi}RB8#Xm@9iIRI002ov JPDHLkV1gL{Q;Prq diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Clothing/leatherapron_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Clothing/leatherapron_overlay.png deleted file mode 100644 index 8059bebd3a828bf85bb8afd9173872813ab43210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmV+b0ssDqP)Bc18liSxriHHi*F_I=?*PbJOIfhxpz}P- zoW90!qfQ}EGDmcgn3=~oLtQ~-XU?+^m_y6-!Gk(0bYnhvBGfHKgA zK$}d>#KRrGDf4*I<)RA^co=fg?#5t;ZC;aa;Y7nZtCG8*(pvu#6s?>skLG_g8?Gx(` RvjDAT@O1TaS?83{1OScMJ=p*N diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_boots_overlay.png deleted file mode 100644 index d23ddc46db508fa9d7cf812845dcb8348a5bd57f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t36#DLn`JZConYq|Nq~3QnRGS zMH>&^ga)SA)Rq4gc!b+OCVr}jWeD0)`T5!ZqDM^{Y&WD=ERg8B$}r>Ev14vL%yWE0 z|If}kxwzx83B!sBj6mc$hw%jyTM|zK!!4F$9&8PVSeDFWJego{>=o05V8?&1-tduAJ}9l)j diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_chest.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_chest.png deleted file mode 100644 index 548631cfc85c0206bf18af09cc210d70cfc75778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar*6y6C}1g`1bbp|HLnyde)HV&zoWj2K*!OfN{PKzA~D My85}Sb4q9e0QMeD*8l(j diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_helmet.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_helmet.png deleted file mode 100644 index 0121264baf104bcaa14ee818a968427b2150b387..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr*6yfBgS%&n#fvWWa36 zuxw@y^8{W=(}XJwt0Wi>vGd9N=y$(czejWW1V#nRMU(789@eMWZ8|7YDSr2;h%^&} YW@5Wm-P88%K=T+pUHx3vIVCg!054`HRsaA1 diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_helmet_overlay.png deleted file mode 100644 index 4ff7ca494f5980352d32a936b2f4689e1c5feb57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J3L(+Ln`JZ|M>sko>{=S$$;6C zVcE>Awt%CeyG{lD-Jy7XAMy#c=6O(lWMV z3eE{^4L6oWeM*S(i}_$5$Lu%HhVz($xK7Lt0iR|ApE(N{1>V(*>~}V8e99rku!+~@ z{?1}{)@GBYCmlu%OBhw=OqjrMOu@{fCxf|9#**pUizopr01Hc7C;$Ke diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_legs.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/hide_legs.png deleted file mode 100644 index 6ab5372c65e323af8e7ba6ce7130614d2abc3e30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8lEnWAr*6y6C_v{CtPU!@8Gae uDu#tZW5$t_KP!T5RRp%WLfq^GmBIh@$z<5VzZrfgKC1)Cp+G&-2SB| zC)6Zh#?jkH&z=5g&C;#8^t+ME1MRr%`AlA#p$3;-CTKIB@mR>9R={ksYu_WL2b1E$ zI;0m&6m7b`jKNfZXcmK~tDnm{r-UW|JIp2) diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_boots_overlay.png deleted file mode 100644 index a90b27ddf3c9de3767e329d2dcbae73d487aa44c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr*6y6C~;!9DDxnU$*8% zy#TLp^T&xt3$pS$HvHBWb`pUF|C5# zc7u~b0!yNRvqSvwzJd6T+?sf_gu!-TgAhBFimxC7>}2RE#fY!h{@G`zB4 q2ZIWOk?8C+3AeCjbF(%v28Lypi{f{j)%pu`6N9I#pUXO@geCx!dO?Z+ diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_chest.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_chest.png deleted file mode 100644 index aed9375f67b0de769af378d26a546c2a0f70042f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar*6y6C|!Y`2YWZkAlw{ z3$`2Ea&Q0No`3(J`pvWnZUTIKeE;&ZvVP51YCdtvquwE;L&%6B`ig)o+X=P?C)p*O zV!{e$J^YgnXG!j2R5#11GI|4)78&qol`;+0NxBW AIsgCw diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_chest_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_chest_overlay.png deleted file mode 100644 index 9e5a1fa81017572646ee1aa295a0ed97652b7210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297 zcmV+^0oMMBP)z!lm9JV1Cylabv?LdvHZtr7wmZ0cQpcn=duW3?)T%?d{I*6W9Gpo5}yww zi9nr6a-WU{E-C^PfW$b|(TsbhAa+QdM5M924b3tI)g1_|aUhXTo|EmMGHWVsDnOw+ zx4uH$cA6J^+ZTpx`Ed{Sk$@yS0EB%W*CrCLz?!d<5s(zPsssxdl1>GBE@t)$((L+y vIu%eP(4|}kE5CCGBB2nX7E5hT@XPlGhzBpy_9?*M00000NkvXXu0mjfefWBn diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_helmet.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_helmet.png deleted file mode 100644 index 50117fadd8ec6ca11723b0304590ad57de3fa255..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?w&4=Ar*6y6C_v{C;VUx4!-=~ zpsb+a!~gC1_y67BmV3KiKzg)mF!l~_)Y@Zej*ww}>|XA@_N^%>R^MNfWD a6a$*G#yaA3#J+f-kqn-$elF{r5}E+-m@I?< diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/roughleather_helmet_overlay.png deleted file mode 100644 index ffaa8cb6ed427d9355a1dca845b3305ff988cab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr*6y6C~z21cyD@-z4$B zzGPO$SmNTK z-#`Cp&vI{X`^(PcCQ$eLn{H)W01MkaR)y$9J%*ia|MV6}GcX(~)N*KHSt$ZEg2B_( K&t;ucLK6UwFVdQ&MBb@ E05i`|=l}o! diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_boots_overlay.png deleted file mode 100644 index 43933ebb2f9b77c8a2a2ab35898fbbf0c7fb3b8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`D?D8sLn`JZCrH>m`2YWZk3!BO zjbHJBQ@-1G98+gIBr(geOU-1;KYyMQ=4=Ns_Rhv96OL}Y#TVT1j%mih6OXnOGwzBn zJlSZ<&CPAhz#16SxK48RoK2gIBJ`O%Hl~~uVoULiSfTuRVlLas#xD&zY|Ie~mQt&l zMa3##BuX#{F<(?L-QdvH&Zsj%=Sr%fiSli(Nz5x7S&i;6%n){LYB|I(Z9xE!#4QE} YwQ|GvY=VrcKsPgZy85}Sb4q9e04VNGS^xk5 diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_chest.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_chest.png deleted file mode 100644 index 3ff215fb1f16fb21a0b755dce58f9f05e512c60c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmV;8>jPR>tXf_C#C4Wtpd0efCllon@9uF5z6ZQ^#l7$Sv@d@r#6|NlQdBrJ?g`ceMU&-br7aQZcyH0v;|RLlUH jsjf1^;-GT6nKddZYgz(N+KH1M6B%UvtHn<$IrZf>3H;Z2E)$u}nSMW>w>idZVbtpe0jA8g z-<1j&Est4rEckve*sHV0Fk5iPXMyf7hYy&ssx$of%McU!V1~l;JJZyb$}ps>?DT3V z7JDEPZq1OXTJTjkU*%5j-RDe^npfNU*4`mw BO6>pu diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_helmet_overlay.png deleted file mode 100644 index 6ba12ac1519c9c83789e864ce4852dbe8ea31318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr*6y6C~z21Wx&GFJLfB zqw61gqJXrD+m>gXyh{^$6|4*|@Sb72$inM*t)-i7<-u%gyR!;X>$NAuG6ZovYR;Ik z-AL&V$L<5ik8!N&nAVC>`>%#ltt&=L_;5$^=Ub5 f6W0{JU}UfrpEPyl&(yO(cQAOm`njxgN@xNA{x3gu diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_legs.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_legs.png deleted file mode 100644 index 5b6bc7b2cefe7c60528d9156eaf3b43e073d298e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%ROBjLn`K+op_MoV#}a!YCoi}V73_JS=-lC`-D(FIk4{(+mTlWC(^K=Bfr-ntS3&&G)aJ;{*42DL zUgoNWZrai8m;S$DNQ$a7ZLYla$$J0HMzgn~>#R5wR~R!q&U@X!^z*;=xyX0ZSnjXk Y@3oM8$(ovx0(3Hir>mdKI;Vst0AjjXng9R* diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_legs_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/scaleleather_legs_overlay.png deleted file mode 100644 index b32aa4daded6df54b07f80a5236cabbf36e0d53f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmV{Qv)dMvx*$L-qfOfo}g>vLgTc*ckoKi17Pwp)LzH0Hg-5 z0Wd>A8ep112EsJsH2~&RWS96EE2D^k)DZMP%q9>UosTyhKng(qM)xbsc90xF7r+7! zSs~0|P?!+q0+1od3PEg;=IlU6;=%wuu+Y;3P6J?pg&tkF#Bmw`3wdO5!R%sQEU00000NkvXXu0mjf_|08q diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_boots.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_boots.png deleted file mode 100644 index 1850bcea33cc108f1df3eb6bf19ece81a63ac233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Ln`Lnow$+rfC3LoBzu+E zf<@^j&lW6AQ%o!P;?d`mbXk3xz@^Wh=Jyu=Ume7?bPC6J&tUFl*QCDQJ6Y`?G`~1# z?Nld@GGUbshR1dY79_7+&62^e*k@D8R0r=(Cw!WouPHKDV+=YbVZO?(f%*JvbBmdm zx5_$9W|Zc%a(c4(Ea%xT3X0G79JxI0r|iAQ`8BKcIvOqsi?_4z1D(g<>FVdQ&MBb@ E05i`|=l}o! diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_boots_overlay.png deleted file mode 100644 index 91fc5883ef5b91919ada5d285fc13b9c03cc590f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmVU3FJw)%4t1xpR&fxY%xWbqyONOdQPoRhW+58aw&tT>Y zw9FGjF~+Zl^*mh}5)T?Cug^Qb9yb-d=kEeAd+$vLhky_QAvvW)&N=0mQZ`8I8$hi@ z0Q4OI@PRAe0FYcOnGOVuc?dx3IcKS4E)l{WVz5?#_VS?7E5Pgb6#%BFfA4xc6Qcm~ jQAWuvq}2)k_ZP++c0m}D&kW~A00000NkvXXu0mjfex_X~ diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_chest.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_chest.png deleted file mode 100644 index 2091aa512d7d7641d6d851bae2148c826971255b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmV+g0s8)lP)1lV}1B#`L#OM{K*2B&F1p>B$p#bqjz9zOL(zV~qXoqk$bqA_)~B z26)ZfJ<1ns00000 LNkvXXu0mjfvMOu4 diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_chest_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_chest_overlay.png deleted file mode 100644 index e123d0e4384ad6a752b7b92cfb07374f31c9a85b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmV+<0o(qGP)xWek&_{prGF|l!z3A4kWx3hoE z{$_;`cEmBy0-^nJ|qB&G)Y7*(JR3JPXJ!Pewrq$swxJ# z*K7j(1nkFgw7&0Svj?DC0sNRc9f1JUnxT6nKddZYgz(N+KH1M6B%UvtHn<$IrZf>3H;Z2E)$u}nSMW>w>idZVbtpe0jA8g z-<1j&Est4rEckve*sHV0Fk5iPXMyf7hYy&ssx$of%McU!V1~l;JJZyb$}ps>?DT3V z7JDEPZq1OXTJTjkU*%5j-RDe^npfNU*4`mw BO6>pu diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_helmet_overlay.png deleted file mode 100644 index 731ab87aac773f9ed8072d660eaa2608b5b66ebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`i#=T&Ln`Lnow$*gNkPE%e8wXd zz69??RqlYBn>$x;VA9o{ZNO$c=ckIjqQ>>e7pnG*egEIFyZl=p@>L*tia^ty_2R7? zj!9NcNR>Nw?UsSP{C34P#pfQ)5f*OH+*_`>bPr>YS5UU-`@eQ}%a|F~GR#n1azji{ zsKKO$*+-S3TKIsw_5407?#VaJ8GH6HJ-hdv;fK<(C-Z|p@8pc&o!=0BApaV-nbxXH U$wo^*0-ej?>FVdQ&MBb@02-oFMF0Q* diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_legs.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_legs.png deleted file mode 100644 index 5b6bc7b2cefe7c60528d9156eaf3b43e073d298e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%ROBjLn`K+op_MoV#}a!YCoi}V73_JS=-lC`-D(FIk4{(+mTlWC(^K=Bfr-ntS3&&G)aJ;{*42DL zUgoNWZrai8m;S$DNQ$a7ZLYla$$J0HMzgn~>#R5wR~R!q&U@X!^z*;=xyX0ZSnjXk Y@3oM8$(ovx0(3Hir>mdKI;Vst0AjjXng9R* diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_legs_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/strongleather_legs_overlay.png deleted file mode 100644 index 3ef1079b421bd8a79649df41f28ed642f1f3b3fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmV+k0rvihP)P`C-B=SikHb6;#{%GiUmdDq*4jnjd7I|<FVdQ&MBb@ E05i`|=l}o! diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_boots_overlay.png deleted file mode 100644 index 53e1b19a8e2bad30fbee08abaa5204ccb775677f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmV;|04V>7P)u>)RjccM&8 RgM9!1002ovPDHLkV1kILSdIVy diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_chest.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_chest.png deleted file mode 100644 index 3ff215fb1f16fb21a0b755dce58f9f05e512c60c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmVkIGkT(PL$pD>zB|7f~M{#vrLK@{2Bn0?up9vAU-3TFQj8Q!f z47IM1gi?y;oEsDDfuXkBz!E67-6-;$Cblhnrl-EfLC4`Cb;Z>0JE~8ziBB;IG@+Q7 zoqo5_a$sMp8)5>?lb_A9hm@oV5prkU^gb<`IJFQ xX(3}}0*@UT2%paX2WEEl*5o&hiTo8`88ebR-P*0p)_?#2002ovPDHLkV1ff_VRHZg diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_helmet.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_helmet.png deleted file mode 100644 index 19a777d847079c1d9e5695c248bc130ae218aa83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRAT6nKddZYgz(N+KH1M6B%UvtHn<$IrZf>3H;Z2E)$u}nSMW>w>idZVbtpe0jA8g z-<1j&Est4rEckve*sHV0Fk5iPXMyf7hYy&ssx$of%McU!V1~l;JJZyb$}ps>?DT3V z7JDEPZq1OXTJTjkU*%5j-RDe^npfNU*4`mw BO6>pu diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_helmet_overlay.png deleted file mode 100644 index 3fa31d71f0bf3da8a77616ec1c73a86f07ba1f22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar*7(`Z;nPP~a){|MbSV z>Mi@8-wgHh1ZOG)U8}morE22q6!h!)l%NU4$NCbB-^;GD3UCR?mVME7;ZBtC*@Xgj z%PZIW&r{rUm#x3EJj&qS0U^UHxeO0xZCzXN>B=6qGqyix9@3D{Do*)x?@o@x1dbO% S4P`*989ZJ6T-G@yGywn+%t9jo diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_legs.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_legs.png deleted file mode 100644 index 5b6bc7b2cefe7c60528d9156eaf3b43e073d298e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%ROBjLn`K+op_MoV#}a!YCoi}V73_JS=-lC`-D(FIk4{(+mTlWC(^K=Bfr-ntS3&&G)aJ;{*42DL zUgoNWZrai8m;S$DNQ$a7ZLYla$$J0HMzgn~>#R5wR~R!q&U@X!^z*;=xyX0ZSnjXk Y@3oM8$(ovx0(3Hir>mdKI;Vst0AjjXng9R* diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_legs_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Leather/studleather_legs_overlay.png deleted file mode 100644 index 043c0f33d7f7ad1d00cfa480c50d68939afaed43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^E_P~Ln`K+op6@7L4l{WkfERN z0MooZI~#&4QW(?|IG?Yzdwls?hh-ySy>@8^!6y6EbUR|>@yFR~Nd~a<|KG&hRf_r`&V6CwYU7K=ba>_Mem+kKEIjFbJp^;6?5Oc zE(clPMXGBnG*$f=7pYeMFgrS#W!-_*EG3;n1!?9b#T)GRswwRAWpWkTQ_fUuS&*^z lsP--w19tN}$F{#>s5$o3JCg126`*4nJYD@<);T3K0RV_TNZtSd diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_boots_overlay.png deleted file mode 100644 index f240ef21d4a32ef1eeeca4fab9b0652b6e269f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`KAtX)Ar*6y6C`#%`2YWZ&kail zJ(1)W2NnAg87j{;N+vDR=(;ObQ*?suK~Tr}1RiD&wj&nvHKsQ-EYi^TWBu`D1$RPX gQ_suf&kYO=F+A2cIi$|Z0L^9aboFyt=akR{0KN1rb^rhX diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_chest.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_chest.png deleted file mode 100644 index cf396f8d86d092cdb0fea9fa77b70a6f819df0da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmVxb%Tx&`1 zeJjQt_!vV{N>Xdxg+N4-MRU%Nh$icNj8THsfet8wsL9O3$u*xRVv$V;T0}db2+5`c zfZWAN(qicB?f}uVO&pzDYqtXwL-iz|BCZ2~P_-QBvAi9;Md;uZId|~9!u=by121l! nt-~2D@;3Lk!;gZf?^f*#;1#_6?|4if00000NkvXXu0mjfG4f&u diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_chest_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_chest_overlay.png deleted file mode 100644 index eedf3dddc166b40ec786702bd5ed01cdfc42f062..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`R-P`7Ar*6y6C~;mxCDN&=MdKJ zyDX4&q~KP=d4?uEMo+D-PygCATM}nTbq-~WXZ|bj zY?`Vf-jGpZIpM6!ZieWN!!eFixHo7j-D3Tb!;q==f@#hqk2ZlI<0A|V>zOuqnRhUW Q18rvTboFyt=akR{08_9#p#T5? diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_helmet_overlay.png deleted file mode 100644 index e64af557a9a4afbfbdb69fd6825be75e3ee3b9db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr*6y6C~;${Qv*IhxsiV z8=J7}#s6K4_WXA=F`Aum_JoO^;VtHX1f}FfribQqo@EG#xNwg(#E>D@_~tqZDF%l8 XJ)vIwmP*+`;}|?${an^LB{Ts5=d~yE diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_legs.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_legs.png deleted file mode 100644 index f3b20adefd6597bd43cea971f91c410d5f0d1a98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr*6y6C_F$EG&NPpFH_; zy+ChIVp4@^v&i1s-(u?bw&mWg*VWa%)7FrqkkYVnrDh)Ugjj~4o*vI4Mjzo5W&&LtmmGPdq~yp6_bo!gR9~$?hT#ErHmeoI{zjfb*z~oR9|+QEfP RaUjbXJYD@<);T3K0RW7WIEerN diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_legs_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/Padding/padded_legs_overlay.png deleted file mode 100644 index 0b139d787c7c025fd57d725cf9183a3252b5160c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`PM$7~Ar*6y6C_w88ao%gsCNy# z_g_J3rtg-tq9<*_4XjcffB*llcN1_ESC>+db`VoI%}}yD=m~2I^9eQ)X$KAlh8dd; VrhaY>{sJ_O!PC{xWt~$(6964%C9wbi diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_boots.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_boots.png deleted file mode 100644 index a1bee0d250b7b19126095f09b09733f6ac619d57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmV;~04D#5P)NklmeNnWWKb>wV>@-EtaLKoU60T5vivp47$eM;|I$O} z^x;~o-?~uNQS@L T^#`=C00000NkvXXu0mjf^)X!G diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_boots_detail.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_boots_detail.png deleted file mode 100644 index 411ba02bf6c69b665a907e2129a5daba56cfee19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr*6y6C_wA4#dR%u;+Lz z#Lna(I!&f@uEK;s!aUHx3vIVCg!0NR2rm;e9( diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_chest.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_chest.png deleted file mode 100644 index a26d400331b85c940bcda0be874b23acaec93a5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmV->0fhdEP)ucGzEimhsB_bc>;KMX|-*@S{?neJ$T5de6~Q=;g(U_-U_@Z9>*_ujuv#sZnal(L^E{gqtEv*;_l1>E!w zCgV8jKVo3cIof>$a2hKh$QVvV49q#EO@iXOt_CWKLYk(LEXyQG5^393>bf>DFksj@9{pa&3%d)(U=@=;hRhH&?p7sOgIF2?M`@H`}0Cyvlrm5WTcL~GLj1x1*H8=sV zZw1a1fT0h4-(U9F$QJ=Nl719Ln#87k_b&p+amX+XIvU=e#JYD@<);T3K0RUq%E=T|X diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_helmet.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_armour_helmet.png deleted file mode 100644 index dba63a9879d4c9623f615dcbc55cbdb1346b5089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmV+=0owkFP)k$Lu%R1+9i-9#1nXf$KnO-Jc5nn4uV*Ci&?*cmnI=k zyZkUP|8u^d88qfC700nWtJ!d#=TerXv~4THFvvKL(lm`f#KG5}ojHAfnXc=k@B6#A z*1itmBZEN@sCOXZ4et$L2t`q(FrFUay#ZBKi392Dy4KL&*dE@3iS2`~HgeI)e z@z}HZBBRISnLmI2fBtO7fAes0wYvfn)Fz}&S|lLZVA5=Ih)3x(>zzAy9=uS#$^HNT o|8$nb32qa#9dahcI_NMk7&8R=EIYBr1Lze+IXmWjIa_y)+dh_ScvX?vP0r||6V~5 z;Hkcn(=$+l^CXC~VrfE=B)w75QWLb8Rwr#_492kZHWm#UO3i!T%1L!o* zGrF!rUDt@?_$o0VRuv$CK-q_3h$KmFa-Qe90Nn@>H?v5lC^4#l%xb&H={Ock6_CJe z7w(w{d*^w&1q8^lT|_|oPO=%C4U}*8BxF@Uf;2&9i0WP7Pm(z!k82CCx9>apzSl1k q8zj2~+P1~AEbrcf3-szS{jxqU)hzM3_HH@=0000K|L4z~&%ey`QcoU-hw%w%l}t9q32GD4 mHs!dNu|{s|ZwhoMXJ8PKH)33+T)zWoI)kUHpUXO@geCxaMJ*8k diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_boots.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_boots.png deleted file mode 100644 index 27a86e72c9a3c65ff328ac6b44a3d5b45d81ebff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297 zcmV+^0oMMBP)YF}!X#gr3;P$9Ej!_f^CW_8r5Clk)1PqGO030IZ`Y1w#?)$zBa^@$% zb=_x(;V6or>eLvrZTmOCvMh+3d8^R#Jb#AhsoQ7(5#pfOh9?X|xj~wyI)E>y-4Jol z#%|HZaodNwL6&9MOk21d#z;aJ%RvJlfc3Zu&+}lKrtAy|pU-9gydO#5a2)5uWS@6y va$we}YW|{Me*^dxgs5Hp->kC#>i=-=90amdkvs#100000NkvXXu0mjf9x#K1 diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_boots_detail.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_boots_detail.png deleted file mode 100644 index 411ba02bf6c69b665a907e2129a5daba56cfee19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr*6y6C_wA4#dR%u;+Lz z#Lna(I!&f@uEK;s!aUHx3vIVCg!0NR2rm;e9( diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_chest.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_chest.png deleted file mode 100644 index e01a91bcef6bc166026c1db13cc63d678a10b12c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcmV;n0ZIOeP)JXCUvd9zF5jHH zD9SZ=3&YONy!ZC)B#!f6OGKVFn~g&Z`NQ~?T-UWENg~VTQl`_XEEWr)PV{{*$Kz3Z zV8Bwh0!`Cs<7>#-Ar~)!OePbls!DTe^dPdsu>zyfNXe!+pU>s}^@rSboqW8d>IyO# zb~sjm8$8dGIF7~leZ9GDTN#hXlIOV!ai#|bEF3GqZDANHm@{^xDAF?`JYD@<);T3K0RUq%E=T|X diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_helmet.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_helmet.png deleted file mode 100644 index 46bead1d4c06cba563cc2104c6a28801260deb87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmV-U0kQsxP)G)e=EL5HX^tK@kkwrLjoibXx2UEDWSvn~)=Tf)GfR!{kmcyn&I~EMt=< z9}M%onfHG4M~Ht@0B$(g*L96FO%ca2*pK6gX_{dAwD&4p6b1D9x~}N^e$#~h_Fn*k zAW(*Rp24u*UzP=3*FoRT3g8J*6v5QPFl->#brFW49l#sVq&3ad+DFYNS^-VdKpQp4 z)a-rVw*#^)+fHLOcL&Ia0H&E9E1;?>6?iON!TI~+1@F&C9J5<=m8aIEly*R#=lFV+ z%E%DIZ>M_&<@h{52_A919{uH*=4>qp?$C?{o(f|Me07*qoM6N<$f^XT8L;wH) diff --git a/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_helmet_detail.png b/src/main/resources/assets/minefantasy2/textures/items/Apparel/cogwork/cogwork_frame_helmet_detail.png deleted file mode 100644 index ea76ff7bf1518fb6fb1a79a59e8670ba4d4abac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar*6y6C_w89BW(7)yoIJ z{J-Nz1*3*dE@3iS2`~HgeI)e z@z}HZBBRISnLmI2fBtO7fAes0wYvfn)Fz}&S|lLZVA5=Ih)3x(>zzAy9=uS#$^HNT o|8$nb32qa#9dahcI_NMk7&8R=EIYBr1Lz=C?xSO&p+Pkc*8gk-Fffn}EYyq(Vm!Ouz4 zG?M4JpsT8qG)=uO%hKyjE@m>p>$(c}EXyPeLs5+lA7B%}%VK|L4z~&%ey`QcoU-hw%w%l}t9q32GD4 mHs!dNu|{s|ZwhoMXJ8PKH)33+T)zWoI)kUHpUXO@geCxaMJ*8k From 3eacf76e9dfc6d7d774807719cab131d72146026 Mon Sep 17 00:00:00 2001 From: Sirse Date: Thu, 24 Aug 2017 20:15:37 +0700 Subject: [PATCH 052/101] Restore files IDKW mv git command doesn't affect --- .../items/apparel/clothing/leatherapron.png | Bin 0 -> 207 bytes .../apparel/clothing/leatherapron_overlay.png | Bin 0 -> 256 bytes .../apparel/cogwork/cogwork_armour_boots.png | Bin 0 -> 217 bytes .../cogwork/cogwork_armour_boots_detail.png | Bin 0 -> 140 bytes .../apparel/cogwork/cogwork_armour_chest.png | Bin 0 -> 379 bytes .../cogwork/cogwork_armour_chest_detail.png | Bin 0 -> 129 bytes .../apparel/cogwork/cogwork_armour_helmet.png | Bin 0 -> 293 bytes .../cogwork/cogwork_armour_helmet_detail.png | Bin 0 -> 190 bytes .../items/apparel/cogwork/cogwork_armour_legs.png | Bin 0 -> 292 bytes .../cogwork/cogwork_armour_legs_detail.png | Bin 0 -> 139 bytes .../items/apparel/cogwork/cogwork_frame_boots.png | Bin 0 -> 297 bytes .../cogwork/cogwork_frame_boots_detail.png | Bin 0 -> 140 bytes .../items/apparel/cogwork/cogwork_frame_chest.png | Bin 0 -> 438 bytes .../cogwork/cogwork_frame_chest_detail.png | Bin 0 -> 129 bytes .../apparel/cogwork/cogwork_frame_helmet.png | Bin 0 -> 334 bytes .../cogwork/cogwork_frame_helmet_detail.png | Bin 0 -> 190 bytes .../items/apparel/cogwork/cogwork_frame_legs.png | Bin 0 -> 287 bytes .../apparel/cogwork/cogwork_frame_legs_detail.png | Bin 0 -> 139 bytes .../textures/items/apparel/leather/hide_boots.png | Bin 0 -> 168 bytes .../items/apparel/leather/hide_boots_overlay.png | Bin 0 -> 228 bytes .../textures/items/apparel/leather/hide_chest.png | Bin 0 -> 152 bytes .../items/apparel/leather/hide_chest_overlay.png | Bin 0 -> 213 bytes .../items/apparel/leather/hide_helmet.png | Bin 0 -> 125 bytes .../items/apparel/leather/hide_helmet_overlay.png | Bin 0 -> 241 bytes .../textures/items/apparel/leather/hide_legs.png | Bin 0 -> 97 bytes .../items/apparel/leather/hide_legs_overlay.png | Bin 0 -> 214 bytes .../items/apparel/leather/roughleather_boots.png | Bin 0 -> 121 bytes .../leather/roughleather_boots_overlay.png | Bin 0 -> 193 bytes .../items/apparel/leather/roughleather_chest.png | Bin 0 -> 152 bytes .../leather/roughleather_chest_overlay.png | Bin 0 -> 297 bytes .../items/apparel/leather/roughleather_helmet.png | Bin 0 -> 128 bytes .../leather/roughleather_helmet_overlay.png | Bin 0 -> 170 bytes .../items/apparel/leather/roughleather_legs.png | Bin 0 -> 112 bytes .../apparel/leather/roughleather_legs_overlay.png | Bin 0 -> 172 bytes .../items/apparel/leather/scaleleather_boots.png | Bin 0 -> 204 bytes .../leather/scaleleather_boots_overlay.png | Bin 0 -> 225 bytes .../items/apparel/leather/scaleleather_chest.png | Bin 0 -> 253 bytes .../leather/scaleleather_chest_overlay.png | Bin 0 -> 287 bytes .../items/apparel/leather/scaleleather_helmet.png | Bin 0 -> 203 bytes .../leather/scaleleather_helmet_overlay.png | Bin 0 -> 181 bytes .../items/apparel/leather/scaleleather_legs.png | Bin 0 -> 224 bytes .../apparel/leather/scaleleather_legs_overlay.png | Bin 0 -> 241 bytes .../items/apparel/leather/strongleather_boots.png | Bin 0 -> 204 bytes .../leather/strongleather_boots_overlay.png | Bin 0 -> 233 bytes .../items/apparel/leather/strongleather_chest.png | Bin 0 -> 261 bytes .../leather/strongleather_chest_overlay.png | Bin 0 -> 292 bytes .../apparel/leather/strongleather_helmet.png | Bin 0 -> 203 bytes .../leather/strongleather_helmet_overlay.png | Bin 0 -> 220 bytes .../items/apparel/leather/strongleather_legs.png | Bin 0 -> 224 bytes .../leather/strongleather_legs_overlay.png | Bin 0 -> 265 bytes .../items/apparel/leather/studleather_boots.png | Bin 0 -> 204 bytes .../apparel/leather/studleather_boots_overlay.png | Bin 0 -> 215 bytes .../items/apparel/leather/studleather_chest.png | Bin 0 -> 253 bytes .../apparel/leather/studleather_chest_overlay.png | Bin 0 -> 247 bytes .../items/apparel/leather/studleather_helmet.png | Bin 0 -> 203 bytes .../leather/studleather_helmet_overlay.png | Bin 0 -> 168 bytes .../items/apparel/leather/studleather_legs.png | Bin 0 -> 224 bytes .../apparel/leather/studleather_legs_overlay.png | Bin 0 -> 215 bytes .../items/apparel/padding/padded_boots.png | Bin 0 -> 186 bytes .../apparel/padding/padded_boots_overlay.png | Bin 0 -> 133 bytes .../items/apparel/padding/padded_chest.png | Bin 0 -> 237 bytes .../apparel/padding/padded_chest_overlay.png | Bin 0 -> 115 bytes .../items/apparel/padding/padded_helmet.png | Bin 0 -> 167 bytes .../apparel/padding/padded_helmet_overlay.png | Bin 0 -> 124 bytes .../items/apparel/padding/padded_legs.png | Bin 0 -> 170 bytes .../items/apparel/padding/padded_legs_overlay.png | Bin 0 -> 123 bytes 66 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/clothing/leatherapron.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/clothing/leatherapron_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_boots.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_boots_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_chest.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_chest_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_helmet.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_helmet_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_legs.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_legs_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_boots.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_boots_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_chest.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_chest_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_helmet.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_helmet_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_legs.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_legs_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_boots.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_boots_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_chest.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_chest_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_helmet.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_helmet_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_legs.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_legs_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_boots.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_boots_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_chest.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_chest_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_helmet.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_helmet_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_legs.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_legs_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_boots.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_boots_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_chest.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_chest_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_helmet.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_helmet_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_legs.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_legs_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_boots.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_boots_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_chest.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_chest_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_helmet.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_helmet_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_legs.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_legs_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_boots.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_boots_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_chest.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_chest_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_helmet.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_helmet_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_legs.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_legs_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_boots.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_boots_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_chest.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_chest_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_helmet.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_helmet_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_legs.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_legs_overlay.png diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/clothing/leatherapron.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/clothing/leatherapron.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff4b239e41f7b86686b6cc04204da086d3dfed2 GIT binary patch literal 207 zcmV;=05JcFP)? z0bOV5su03BgvOlnIqg^Osyoi}RB8#Xm@9iIRI002ov JPDHLkV1gL{Q;Prq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/clothing/leatherapron_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/clothing/leatherapron_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..8059bebd3a828bf85bb8afd9173872813ab43210 GIT binary patch literal 256 zcmV+b0ssDqP)Bc18liSxriHHi*F_I=?*PbJOIfhxpz}P- zoW90!qfQ}EGDmcgn3=~oLtQ~-XU?+^m_y6-!Gk(0bYnhvBGfHKgA zK$NklmeNnWWKb>wV>@-EtaLKoU60T5vivp47$eM;|I$O} z^x;~o-?~uNQS@L T^#`=C00000NkvXXu0mjf^)X!G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_boots_detail.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_boots_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..411ba02bf6c69b665a907e2129a5daba56cfee19 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr*6y6C_wA4#dR%u;+Lz z#Lna(I!&f@uEK;s!aUHx3vIVCg!0NR2rm;e9( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_chest.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..a26d400331b85c940bcda0be874b23acaec93a5c GIT binary patch literal 379 zcmV->0fhdEP)ucGzEimhsB_bc>;KMX|-*@S{?neJ$T5de6~Q=;g(U_-U_@Z9>*_ujuv#sZnal(L^E{gqtEv*;_l1>E!w zCgV8jKVo3cIof>$a2hKh$QVvV49q#EO@iXOt_CWKLYk(LEXyQG5^393>bf>DFksj@9{pa&3%d)(U=@=;hRhH&?p7sOgIF2?M`@H`}0Cyvlrm5WTcL~GLj1x1*H8=sV zZw1a1fT0h4-(U9F$QJ=Nl719Ln#87k_b&p+amX+XIvU=e#JYD@<);T3K0RUq%E=T|X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_helmet.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_armour_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..dba63a9879d4c9623f615dcbc55cbdb1346b5089 GIT binary patch literal 293 zcmV+=0owkFP)k$Lu%R1+9i-9#1nXf$KnO-Jc5nn4uV*Ci&?*cmnI=k zyZkUP|8u^d88qfC700nWtJ!d#=TerXv~4THFvvKL(lm`f#KG5}ojHAfnXc=k@B6#A z*1itmBZEN@sCOXZ4et$L2t`q(FrFUay#ZBKi392Dy4KL&*dE@3iS2`~HgeI)e z@z}HZBBRISnLmI2fBtO7fAes0wYvfn)Fz}&S|lLZVA5=Ih)3x(>zzAy9=uS#$^HNT o|8$nb32qa#9dahcI_NMk7&8R=EIYBr1Lze+IXmWjIa_y)+dh_ScvX?vP0r||6V~5 z;Hkcn(=$+l^CXC~VrfE=B)w75QWLb8Rwr#_492kZHWm#UO3i!T%1L!o* zGrF!rUDt@?_$o0VRuv$CK-q_3h$KmFa-Qe90Nn@>H?v5lC^4#l%xb&H={Ock6_CJe z7w(w{d*^w&1q8^lT|_|oPO=%C4U}*8BxF@Uf;2&9i0WP7Pm(z!k82CCx9>apzSl1k q8zj2~+P1~AEbrcf3-szS{jxqU)hzM3_HH@=0000K|L4z~&%ey`QcoU-hw%w%l}t9q32GD4 mHs!dNu|{s|ZwhoMXJ8PKH)33+T)zWoI)kUHpUXO@geCxaMJ*8k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_boots.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..27a86e72c9a3c65ff328ac6b44a3d5b45d81ebff GIT binary patch literal 297 zcmV+^0oMMBP)YF}!X#gr3;P$9Ej!_f^CW_8r5Clk)1PqGO030IZ`Y1w#?)$zBa^@$% zb=_x(;V6or>eLvrZTmOCvMh+3d8^R#Jb#AhsoQ7(5#pfOh9?X|xj~wyI)E>y-4Jol z#%|HZaodNwL6&9MOk21d#z;aJ%RvJlfc3Zu&+}lKrtAy|pU-9gydO#5a2)5uWS@6y va$we}YW|{Me*^dxgs5Hp->kC#>i=-=90amdkvs#100000NkvXXu0mjf9x#K1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_boots_detail.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_boots_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..411ba02bf6c69b665a907e2129a5daba56cfee19 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr*6y6C_wA4#dR%u;+Lz z#Lna(I!&f@uEK;s!aUHx3vIVCg!0NR2rm;e9( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_chest.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..e01a91bcef6bc166026c1db13cc63d678a10b12c GIT binary patch literal 438 zcmV;n0ZIOeP)JXCUvd9zF5jHH zD9SZ=3&YONy!ZC)B#!f6OGKVFn~g&Z`NQ~?T-UWENg~VTQl`_XEEWr)PV{{*$Kz3Z zV8Bwh0!`Cs<7>#-Ar~)!OePbls!DTe^dPdsu>zyfNXe!+pU>s}^@rSboqW8d>IyO# zb~sjm8$8dGIF7~leZ9GDTN#hXlIOV!ai#|bEF3GqZDANHm@{^xDAF?`JYD@<);T3K0RUq%E=T|X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_helmet.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..46bead1d4c06cba563cc2104c6a28801260deb87 GIT binary patch literal 334 zcmV-U0kQsxP)G)e=EL5HX^tK@kkwrLjoibXx2UEDWSvn~)=Tf)GfR!{kmcyn&I~EMt=< z9}M%onfHG4M~Ht@0B$(g*L96FO%ca2*pK6gX_{dAwD&4p6b1D9x~}N^e$#~h_Fn*k zAW(*Rp24u*UzP=3*FoRT3g8J*6v5QPFl->#brFW49l#sVq&3ad+DFYNS^-VdKpQp4 z)a-rVw*#^)+fHLOcL&Ia0H&E9E1;?>6?iON!TI~+1@F&C9J5<=m8aIEly*R#=lFV+ z%E%DIZ>M_&<@h{52_A919{uH*=4>qp?$C?{o(f|Me07*qoM6N<$f^XT8L;wH) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_helmet_detail.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/cogwork/cogwork_frame_helmet_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..ea76ff7bf1518fb6fb1a79a59e8670ba4d4abac4 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar*6y6C_w89BW(7)yoIJ z{J-Nz1*3*dE@3iS2`~HgeI)e z@z}HZBBRISnLmI2fBtO7fAes0wYvfn)Fz}&S|lLZVA5=Ih)3x(>zzAy9=uS#$^HNT o|8$nb32qa#9dahcI_NMk7&8R=EIYBr1Lz=C?xSO&p+Pkc*8gk-Fffn}EYyq(Vm!Ouz4 zG?M4JpsT8qG)=uO%hKyjE@m>p>$(c}EXyPeLs5+lA7B%}%VK|L4z~&%ey`QcoU-hw%w%l}t9q32GD4 mHs!dNu|{s|ZwhoMXJ8PKH)33+T)zWoI)kUHpUXO@geCxaMJ*8k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_boots.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b3fc274c14b5edd859a0a021644ad86ec415fb GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar*6y6BwHQ|Nn11saaCv zV$XF3wjhR3UIov`56m8%oo)V~U&i8tyxP9X&(HoV7?#*dur-L-)&KkRzm;43-}#xw z>}d>#KRrGDf4*I<)RA^co=fg?#5t;ZC;aa;Y7nZtCG8*(pvu#6s?>skLG_g8?Gx(` RvjDAT@O1TaS?83{1OScMJ=p*N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_boots_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..d23ddc46db508fa9d7cf812845dcb8348a5bd57f GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t36#DLn`JZConYq|Nq~3QnRGS zMH>&^ga)SA)Rq4gc!b+OCVr}jWeD0)`T5!ZqDM^{Y&WD=ERg8B$}r>Ev14vL%yWE0 z|If}kxwzx83B!sBj6mc$hw%jyTM|zK!!4F$9&8PVSeDFWJego{>=o05V8?&1-tduAJ}9l)j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_chest.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..548631cfc85c0206bf18af09cc210d70cfc75778 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar*6y6C}1g`1bbp|HLnyde)HV&zoWj2K*!OfN{PKzA~D My85}Sb4q9e0QMeD*8l(j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_helmet.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..0121264baf104bcaa14ee818a968427b2150b387 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr*6yfBgS%&n#fvWWa36 zuxw@y^8{W=(}XJwt0Wi>vGd9N=y$(czejWW1V#nRMU(789@eMWZ8|7YDSr2;h%^&} YW@5Wm-P88%K=T+pUHx3vIVCg!054`HRsaA1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_helmet_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff7ca494f5980352d32a936b2f4689e1c5feb57 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J3L(+Ln`JZ|M>sko>{=S$$;6C zVcE>Awt%CeyG{lD-Jy7XAMy#c=6O(lWMV z3eE{^4L6oWeM*S(i}_$5$Lu%HhVz($xK7Lt0iR|ApE(N{1>V(*>~}V8e99rku!+~@ z{?1}{)@GBYCmlu%OBhw=OqjrMOu@{fCxf|9#**pUizopr01Hc7C;$Ke literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_legs.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/hide_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..6ab5372c65e323af8e7ba6ce7130614d2abc3e30 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8lEnWAr*6y6C_v{CtPU!@8Gae uDu#tZW5$t_KP!T5RRp%WLfq^GmBIh@$z<5VzZrfgKC1)Cp+G&-2SB| zC)6Zh#?jkH&z=5g&C;#8^t+ME1MRr%`AlA#p$3;-CTKIB@mR>9R={ksYu_WL2b1E$ zI;0m&6m7b`jKNfZXcmK~tDnm{r-UW|JIp2) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_boots_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..a90b27ddf3c9de3767e329d2dcbae73d487aa44c GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr*6y6C~;!9DDxnU$*8% zy#TLp^T&xt3$pS$HvHBWb`pUF|C5# zc7u~b0!yNRvqSvwzJd6T+?sf_gu!-TgAhBFimxC7>}2RE#fY!h{@G`zB4 q2ZIWOk?8C+3AeCjbF(%v28Lypi{f{j)%pu`6N9I#pUXO@geCx!dO?Z+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_chest.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..aed9375f67b0de769af378d26a546c2a0f70042f GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar*6y6C|!Y`2YWZkAlw{ z3$`2Ea&Q0No`3(J`pvWnZUTIKeE;&ZvVP51YCdtvquwE;L&%6B`ig)o+X=P?C)p*O zV!{e$J^YgnXG!j2R5#11GI|4)78&qol`;+0NxBW AIsgCw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_chest_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_chest_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..9e5a1fa81017572646ee1aa295a0ed97652b7210 GIT binary patch literal 297 zcmV+^0oMMBP)z!lm9JV1Cylabv?LdvHZtr7wmZ0cQpcn=duW3?)T%?d{I*6W9Gpo5}yww zi9nr6a-WU{E-C^PfW$b|(TsbhAa+QdM5M924b3tI)g1_|aUhXTo|EmMGHWVsDnOw+ zx4uH$cA6J^+ZTpx`Ed{Sk$@yS0EB%W*CrCLz?!d<5s(zPsssxdl1>GBE@t)$((L+y vIu%eP(4|}kE5CCGBB2nX7E5hT@XPlGhzBpy_9?*M00000NkvXXu0mjfefWBn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_helmet.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..50117fadd8ec6ca11723b0304590ad57de3fa255 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?w&4=Ar*6y6C_v{C;VUx4!-=~ zpsb+a!~gC1_y67BmV3KiKzg)mF!l~_)Y@Zej*ww}>|XA@_N^%>R^MNfWD a6a$*G#yaA3#J+f-kqn-$elF{r5}E+-m@I?< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/roughleather_helmet_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..ffaa8cb6ed427d9355a1dca845b3305ff988cab9 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr*6y6C~z21cyD@-z4$B zzGPO$SmNTK z-#`Cp&vI{X`^(PcCQ$eLn{H)W01MkaR)y$9J%*ia|MV6}GcX(~)N*KHSt$ZEg2B_( K&t;ucLK6UwFVdQ&MBb@ E05i`|=l}o! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_boots_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..43933ebb2f9b77c8a2a2ab35898fbbf0c7fb3b8c GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`D?D8sLn`JZCrH>m`2YWZk3!BO zjbHJBQ@-1G98+gIBr(geOU-1;KYyMQ=4=Ns_Rhv96OL}Y#TVT1j%mih6OXnOGwzBn zJlSZ<&CPAhz#16SxK48RoK2gIBJ`O%Hl~~uVoULiSfTuRVlLas#xD&zY|Ie~mQt&l zMa3##BuX#{F<(?L-QdvH&Zsj%=Sr%fiSli(Nz5x7S&i;6%n){LYB|I(Z9xE!#4QE} YwQ|GvY=VrcKsPgZy85}Sb4q9e04VNGS^xk5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_chest.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff215fb1f16fb21a0b755dce58f9f05e512c60c GIT binary patch literal 253 zcmV;8>jPR>tXf_C#C4Wtpd0efCllon@9uF5z6ZQ^#l7$Sv@d@r#6|NlQdBrJ?g`ceMU&-br7aQZcyH0v;|RLlUH jsjf1^;-GT6nKddZYgz(N+KH1M6B%UvtHn<$IrZf>3H;Z2E)$u}nSMW>w>idZVbtpe0jA8g z-<1j&Est4rEckve*sHV0Fk5iPXMyf7hYy&ssx$of%McU!V1~l;JJZyb$}ps>?DT3V z7JDEPZq1OXTJTjkU*%5j-RDe^npfNU*4`mw BO6>pu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_helmet_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba12ac1519c9c83789e864ce4852dbe8ea31318 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr*6y6C~z21Wx&GFJLfB zqw61gqJXrD+m>gXyh{^$6|4*|@Sb72$inM*t)-i7<-u%gyR!;X>$NAuG6ZovYR;Ik z-AL&V$L<5ik8!N&nAVC>`>%#ltt&=L_;5$^=Ub5 f6W0{JU}UfrpEPyl&(yO(cQAOm`njxgN@xNA{x3gu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_legs.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..5b6bc7b2cefe7c60528d9156eaf3b43e073d298e GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%ROBjLn`K+op_MoV#}a!YCoi}V73_JS=-lC`-D(FIk4{(+mTlWC(^K=Bfr-ntS3&&G)aJ;{*42DL zUgoNWZrai8m;S$DNQ$a7ZLYla$$J0HMzgn~>#R5wR~R!q&U@X!^z*;=xyX0ZSnjXk Y@3oM8$(ovx0(3Hir>mdKI;Vst0AjjXng9R* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_legs_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/scaleleather_legs_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..b32aa4daded6df54b07f80a5236cabbf36e0d53f GIT binary patch literal 241 zcmV{Qv)dMvx*$L-qfOfo}g>vLgTc*ckoKi17Pwp)LzH0Hg-5 z0Wd>A8ep112EsJsH2~&RWS96EE2D^k)DZMP%q9>UosTyhKng(qM)xbsc90xF7r+7! zSs~0|P?!+q0+1od3PEg;=IlU6;=%wuu+Y;3P6J?pg&tkF#Bmw`3wdO5!R%sQEU00000NkvXXu0mjf_|08q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_boots.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..1850bcea33cc108f1df3eb6bf19ece81a63ac233 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Ln`Lnow$+rfC3LoBzu+E zf<@^j&lW6AQ%o!P;?d`mbXk3xz@^Wh=Jyu=Ume7?bPC6J&tUFl*QCDQJ6Y`?G`~1# z?Nld@GGUbshR1dY79_7+&62^e*k@D8R0r=(Cw!WouPHKDV+=YbVZO?(f%*JvbBmdm zx5_$9W|Zc%a(c4(Ea%xT3X0G79JxI0r|iAQ`8BKcIvOqsi?_4z1D(g<>FVdQ&MBb@ E05i`|=l}o! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_boots_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..91fc5883ef5b91919ada5d285fc13b9c03cc590f GIT binary patch literal 233 zcmVU3FJw)%4t1xpR&fxY%xWbqyONOdQPoRhW+58aw&tT>Y zw9FGjF~+Zl^*mh}5)T?Cug^Qb9yb-d=kEeAd+$vLhky_QAvvW)&N=0mQZ`8I8$hi@ z0Q4OI@PRAe0FYcOnGOVuc?dx3IcKS4E)l{WVz5?#_VS?7E5Pgb6#%BFfA4xc6Qcm~ jQAWuvq}2)k_ZP++c0m}D&kW~A00000NkvXXu0mjfex_X~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_chest.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..2091aa512d7d7641d6d851bae2148c826971255b GIT binary patch literal 261 zcmV+g0s8)lP)1lV}1B#`L#OM{K*2B&F1p>B$p#bqjz9zOL(zV~qXoqk$bqA_)~B z26)ZfJ<1ns00000 LNkvXXu0mjfvMOu4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_chest_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_chest_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..e123d0e4384ad6a752b7b92cfb07374f31c9a85b GIT binary patch literal 292 zcmV+<0o(qGP)xWek&_{prGF|l!z3A4kWx3hoE z{$_;`cEmBy0-^nJ|qB&G)Y7*(JR3JPXJ!Pewrq$swxJ# z*K7j(1nkFgw7&0Svj?DC0sNRc9f1JUnxT6nKddZYgz(N+KH1M6B%UvtHn<$IrZf>3H;Z2E)$u}nSMW>w>idZVbtpe0jA8g z-<1j&Est4rEckve*sHV0Fk5iPXMyf7hYy&ssx$of%McU!V1~l;JJZyb$}ps>?DT3V z7JDEPZq1OXTJTjkU*%5j-RDe^npfNU*4`mw BO6>pu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_helmet_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..731ab87aac773f9ed8072d660eaa2608b5b66ebd GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`i#=T&Ln`Lnow$*gNkPE%e8wXd zz69??RqlYBn>$x;VA9o{ZNO$c=ckIjqQ>>e7pnG*egEIFyZl=p@>L*tia^ty_2R7? zj!9NcNR>Nw?UsSP{C34P#pfQ)5f*OH+*_`>bPr>YS5UU-`@eQ}%a|F~GR#n1azji{ zsKKO$*+-S3TKIsw_5407?#VaJ8GH6HJ-hdv;fK<(C-Z|p@8pc&o!=0BApaV-nbxXH U$wo^*0-ej?>FVdQ&MBb@02-oFMF0Q* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_legs.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..5b6bc7b2cefe7c60528d9156eaf3b43e073d298e GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%ROBjLn`K+op_MoV#}a!YCoi}V73_JS=-lC`-D(FIk4{(+mTlWC(^K=Bfr-ntS3&&G)aJ;{*42DL zUgoNWZrai8m;S$DNQ$a7ZLYla$$J0HMzgn~>#R5wR~R!q&U@X!^z*;=xyX0ZSnjXk Y@3oM8$(ovx0(3Hir>mdKI;Vst0AjjXng9R* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_legs_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/strongleather_legs_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef1079b421bd8a79649df41f28ed642f1f3b3fd GIT binary patch literal 265 zcmV+k0rvihP)P`C-B=SikHb6;#{%GiUmdDq*4jnjd7I|<FVdQ&MBb@ E05i`|=l}o! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_boots_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..53e1b19a8e2bad30fbee08abaa5204ccb775677f GIT binary patch literal 215 zcmV;|04V>7P)u>)RjccM&8 RgM9!1002ovPDHLkV1kILSdIVy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_chest.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff215fb1f16fb21a0b755dce58f9f05e512c60c GIT binary patch literal 253 zcmVkIGkT(PL$pD>zB|7f~M{#vrLK@{2Bn0?up9vAU-3TFQj8Q!f z47IM1gi?y;oEsDDfuXkBz!E67-6-;$Cblhnrl-EfLC4`Cb;Z>0JE~8ziBB;IG@+Q7 zoqo5_a$sMp8)5>?lb_A9hm@oV5prkU^gb<`IJFQ xX(3}}0*@UT2%paX2WEEl*5o&hiTo8`88ebR-P*0p)_?#2002ovPDHLkV1ff_VRHZg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_helmet.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..19a777d847079c1d9e5695c248bc130ae218aa83 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRAT6nKddZYgz(N+KH1M6B%UvtHn<$IrZf>3H;Z2E)$u}nSMW>w>idZVbtpe0jA8g z-<1j&Est4rEckve*sHV0Fk5iPXMyf7hYy&ssx$of%McU!V1~l;JJZyb$}ps>?DT3V z7JDEPZq1OXTJTjkU*%5j-RDe^npfNU*4`mw BO6>pu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_helmet_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa31d71f0bf3da8a77616ec1c73a86f07ba1f22 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar*7(`Z;nPP~a){|MbSV z>Mi@8-wgHh1ZOG)U8}morE22q6!h!)l%NU4$NCbB-^;GD3UCR?mVME7;ZBtC*@Xgj z%PZIW&r{rUm#x3EJj&qS0U^UHxeO0xZCzXN>B=6qGqyix9@3D{Do*)x?@o@x1dbO% S4P`*989ZJ6T-G@yGywn+%t9jo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_legs.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..5b6bc7b2cefe7c60528d9156eaf3b43e073d298e GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`%ROBjLn`K+op_MoV#}a!YCoi}V73_JS=-lC`-D(FIk4{(+mTlWC(^K=Bfr-ntS3&&G)aJ;{*42DL zUgoNWZrai8m;S$DNQ$a7ZLYla$$J0HMzgn~>#R5wR~R!q&U@X!^z*;=xyX0ZSnjXk Y@3oM8$(ovx0(3Hir>mdKI;Vst0AjjXng9R* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_legs_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/leather/studleather_legs_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..043c0f33d7f7ad1d00cfa480c50d68939afaed43 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^E_P~Ln`K+op6@7L4l{WkfERN z0MooZI~#&4QW(?|IG?Yzdwls?hh-ySy>@8^!6y6EbUR|>@yFR~Nd~a<|KG&hRf_r`&V6CwYU7K=ba>_Mem+kKEIjFbJp^;6?5Oc zE(clPMXGBnG*$f=7pYeMFgrS#W!-_*EG3;n1!?9b#T)GRswwRAWpWkTQ_fUuS&*^z lsP--w19tN}$F{#>s5$o3JCg126`*4nJYD@<);T3K0RV_TNZtSd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_boots_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_boots_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..f240ef21d4a32ef1eeeca4fab9b0652b6e269f1a GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`KAtX)Ar*6y6C`#%`2YWZ&kail zJ(1)W2NnAg87j{;N+vDR=(;ObQ*?suK~Tr}1RiD&wj&nvHKsQ-EYi^TWBu`D1$RPX gQ_suf&kYO=F+A2cIi$|Z0L^9aboFyt=akR{0KN1rb^rhX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_chest.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..cf396f8d86d092cdb0fea9fa77b70a6f819df0da GIT binary patch literal 237 zcmVxb%Tx&`1 zeJjQt_!vV{N>Xdxg+N4-MRU%Nh$icNj8THsfet8wsL9O3$u*xRVv$V;T0}db2+5`c zfZWAN(qicB?f}uVO&pzDYqtXwL-iz|BCZ2~P_-QBvAi9;Md;uZId|~9!u=by121l! nt-~2D@;3Lk!;gZf?^f*#;1#_6?|4if00000NkvXXu0mjfG4f&u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_chest_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_chest_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..eedf3dddc166b40ec786702bd5ed01cdfc42f062 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`R-P`7Ar*6y6C~;mxCDN&=MdKJ zyDX4&q~KP=d4?uEMo+D-PygCATM}nTbq-~WXZ|bj zY?`Vf-jGpZIpM6!ZieWN!!eFixHo7j-D3Tb!;q==f@#hqk2ZlI<0A|V>zOuqnRhUW Q18rvTboFyt=akR{08_9#p#T5? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_helmet_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_helmet_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..e64af557a9a4afbfbdb69fd6825be75e3ee3b9db GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr*6y6C~;${Qv*IhxsiV z8=J7}#s6K4_WXA=F`Aum_JoO^;VtHX1f}FfribQqo@EG#xNwg(#E>D@_~tqZDF%l8 XJ)vIwmP*+`;}|?${an^LB{Ts5=d~yE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_legs.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b20adefd6597bd43cea971f91c410d5f0d1a98 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr*6y6C_F$EG&NPpFH_; zy+ChIVp4@^v&i1s-(u?bw&mWg*VWa%)7FrqkkYVnrDh)Ugjj~4o*vI4Mjzo5W&&LtmmGPdq~yp6_bo!gR9~$?hT#ErHmeoI{zjfb*z~oR9|+QEfP RaUjbXJYD@<);T3K0RW7WIEerN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_legs_overlay.png b/src/main/resources/assets/minefantasy2/textures/items/apparel/padding/padded_legs_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..0b139d787c7c025fd57d725cf9183a3252b5160c GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`PM$7~Ar*6y6C_w88ao%gsCNy# z_g_J3rtg-tq9<*_4XjcffB*llcN1_ESC>+db`VoI%}}yD=m~2I^9eQ)X$KAlh8dd; VrhaY>{sJ_O!PC{xWt~$(6964%C9wbi literal 0 HcmV?d00001 From 847868d6a2cc1e69c24d1066f35efd63400c1a46 Mon Sep 17 00:00:00 2001 From: Haozhe Jiang Date: Sat, 26 Aug 2017 14:49:30 +0800 Subject: [PATCH 053/101] Lower the minium size of the packet heap. The default size of a packet was 256, which can't be fully used by every packets, which caused the waste of network resource. I limited it to 16(A really small size shorter than almost every packets), and it could be widened automatically when the data to transfer is longer than it. --- src/main/java/minefantasy/mf2/network/packet/PacketMF.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/network/packet/PacketMF.java b/src/main/java/minefantasy/mf2/network/packet/PacketMF.java index 3c99dd84..e34818ac 100644 --- a/src/main/java/minefantasy/mf2/network/packet/PacketMF.java +++ b/src/main/java/minefantasy/mf2/network/packet/PacketMF.java @@ -8,7 +8,7 @@ public abstract class PacketMF { public final FMLProxyPacket generatePacket() { - ByteBuf buf = Unpooled.buffer(); + ByteBuf buf = Unpooled.buffer(16); write(buf); return new FMLProxyPacket(buf, getChannel()); } From a539e1a6b36c2eab1beac9ecae994dbe27953c4e Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 26 Aug 2017 17:23:10 +0700 Subject: [PATCH 054/101] Update gradle version Fixed issue with https connection --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 19b28af0..a787f942 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-2.3-bin.zip +distributionUrl=http\://services.gradle.org/distributions/gradle-2.13-bin.zip From 27fb1b1fae6c5d26fc8ff52450acbef745504e4a Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 26 Aug 2017 18:05:36 +0700 Subject: [PATCH 055/101] Update version --- build.gradle | 2 +- src/main/java/minefantasy/mf2/MineFantasyII.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index cdadf2a5..5c261e2d 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { apply plugin: 'forge' -version = "2.8.14.1u" +version = "2.8.14.2u" group= "minefantasy.mf2.minefantasy2" archivesBaseName = "MineFantasyII" diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 6caf57ca..07afacb6 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -61,7 +61,7 @@ public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; - public static final String VERSION = "Alpha_2.8.13.1u"; + public static final String VERSION = "Alpha_2.8.14.2u"; public static final WorldGenMFBase worldGenManager = new WorldGenMFBase(); @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") From d56f011ddefb62d22f03d3c27b667e11a951caef Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 27 Aug 2017 23:26:40 +0700 Subject: [PATCH 056/101] Gradle&Git config changes - Added IntelliJ IDEA plugin - Fixed gitignore file --- .gitignore | 151 +++++++++++++++++++++++++++------------------------ build.gradle | 3 + 2 files changed, 82 insertions(+), 72 deletions(-) diff --git a/.gitignore b/.gitignore index d8753a9b..b59cc83c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,74 +1,81 @@ -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Windows shortcuts -*.lnk - -# ========================= -# Operating System Files -# ========================= - -# OSX -# ========================= - -.DS_Store -.AppleDouble -.LSOverride - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -# ========================= -# MCP Files -# ========================= -.classpath -*.bin -.gradle/* +### Windows ### + +thumbs.db +*.db + +### Java ### + +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.txt + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Eclipse ### + +*.pydevproject +.metadata +.gradle +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +/eclipse + +# Eclipse Core .project -.settings/* -*.location -eclipse/* -*.prefs + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" *.launch -eclipse/* -/bin/ - -# Minecraft-related -asm/ -saves/ -config/ -options.txt -usercache.json -usernamecache.json -logs/ -crash-reports/ -scripts/ -*.log \ No newline at end of file + +# CDT-specific +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Java annotation processor (APT) +.factorypath + +# PDT-specific +.buildpath + +# sbteclipse plugin +.target + +# TeXlipse plugin +.texlipse + +### Intellij IDEA ### + +*.iml +*.ipr +*.iws + +.idea/ +.idea_modules/ +classes/ + +/out/ +gradle/wrapper/gradle-wrapper.properties +gradlew +gradlew.bat + +# Linux +*~ \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5c261e2d..bce508d5 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,7 @@ buildscript { } apply plugin: 'forge' +apply plugin: 'idea' version = "2.8.14.2u" group= "minefantasy.mf2.minefantasy2" @@ -26,6 +27,8 @@ minecraft { runDir = "eclipse" } +idea { module { inheritOutputDirs = true } } + repositories { maven { name = "chickenbones" From 7ba2de826257623386efe0e537d751f880b968e1 Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 6 Sep 2017 19:58:44 +0700 Subject: [PATCH 057/101] Skillbooks rebalance Now skillbook gives random value from 0 to X (where X - required XP to get next level) --- src/main/java/minefantasy/mf2/item/ItemSkillBook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/item/ItemSkillBook.java b/src/main/java/minefantasy/mf2/item/ItemSkillBook.java index 706e94b6..4cde58bd 100644 --- a/src/main/java/minefantasy/mf2/item/ItemSkillBook.java +++ b/src/main/java/minefantasy/mf2/item/ItemSkillBook.java @@ -52,7 +52,7 @@ public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user if (isMax) { skill.manualLvlUp(user, 100); } else { - skill.addXP(user, skill.getLvlXP(lvl, user)); + skill.addXP(user, world.rand.nextInt(skill.getLvlXP(lvl, user))); } used = true; } From 1f8b70bb1bb05411310096250f92e377acc1ee70 Mon Sep 17 00:00:00 2001 From: Sirse Date: Thu, 7 Sep 2017 23:35:28 +0700 Subject: [PATCH 058/101] Fixed salvage station duplication glitch --- src/main/java/minefantasy/mf2/MineFantasyII.java | 2 +- src/main/java/minefantasy/mf2/api/crafting/Salvage.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 07afacb6..03ed083a 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -57,7 +57,7 @@ /** * @author Anonymous Productions */ -@Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);required-after:FML@[5.0.5,);after:NotEnoughItems", version = MineFantasyII.VERSION) +@Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);required-after:FML@[5.0.5,);after:NotEnoughItems;after:MineTweaker3", version = MineFantasyII.VERSION) public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; diff --git a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java index e87ac557..4882d592 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java +++ b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java @@ -86,7 +86,8 @@ private static List dropItemStack(ItemStack mainItem, EntityPlayer us ItemStack entry, float chanceModifier, float chance) { for (int a = 0; a < entry.stackSize; a++) { if (random.nextFloat() * chanceModifier < chance) { - boolean canSalvage = true; + items.add(entry.copy()); + /*boolean canSalvage = true; if (entry.getItem() instanceof ISalvageDrop) { canSalvage = ((ISalvageDrop) entry.getItem()).canSalvage(user, entry); @@ -96,7 +97,7 @@ private static List dropItemStack(ItemStack mainItem, EntityPlayer us newitem.stackSize = 1; newitem = CustomToolHelper.tryDeconstruct(newitem, mainItem); items.add(newitem); - } + }*/ } } return items; From 3fc28a46bdb68a364f84873c3a9e0fcfc769c8db Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 8 Sep 2017 20:30:19 +0700 Subject: [PATCH 059/101] Refix, sry --- src/main/java/minefantasy/mf2/api/crafting/Salvage.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java index 4882d592..b7546af1 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java +++ b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java @@ -86,8 +86,7 @@ private static List dropItemStack(ItemStack mainItem, EntityPlayer us ItemStack entry, float chanceModifier, float chance) { for (int a = 0; a < entry.stackSize; a++) { if (random.nextFloat() * chanceModifier < chance) { - items.add(entry.copy()); - /*boolean canSalvage = true; + boolean canSalvage = true; if (entry.getItem() instanceof ISalvageDrop) { canSalvage = ((ISalvageDrop) entry.getItem()).canSalvage(user, entry); @@ -95,9 +94,9 @@ private static List dropItemStack(ItemStack mainItem, EntityPlayer us if (canSalvage) { ItemStack newitem = entry.copy(); newitem.stackSize = 1; - newitem = CustomToolHelper.tryDeconstruct(newitem, mainItem); + //newitem = CustomToolHelper.tryDeconstruct(newitem, mainItem); items.add(newitem); - }*/ + } } } return items; From b5649e5d6b21d8a49b5848a2158a186860c44189 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 15 Sep 2017 21:40:33 +0700 Subject: [PATCH 060/101] I didn't see other way to fix it without salvage rewrite --- src/main/java/minefantasy/mf2/api/crafting/Salvage.java | 2 +- src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java index b7546af1..e87ac557 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java +++ b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java @@ -94,7 +94,7 @@ private static List dropItemStack(ItemStack mainItem, EntityPlayer us if (canSalvage) { ItemStack newitem = entry.copy(); newitem.stackSize = 1; - //newitem = CustomToolHelper.tryDeconstruct(newitem, mainItem); + newitem = CustomToolHelper.tryDeconstruct(newitem, mainItem); items.add(newitem); } } diff --git a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java index 2b4d1ff7..beb24735 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java @@ -57,7 +57,7 @@ public static void init() { (int) (time * material.craftTimeModifier), new Object[] { "D", "I", 'D', ComponentListMF.diamond_shards, 'I', ComponentListMF.bar("Steel"), }); Salvage.addSalvage(ComponentListMF.ingots[5], ComponentListMF.ingots[4], ComponentListMF.diamond_shards); - Salvage.addSalvage(ComponentListMF.bar("Encrusted"), ComponentListMF.bar("Steel"), + Salvage.addSalvage(ComponentListMF.bar("Encrusted"), ComponentListMF.ingots[4], ComponentListMF.diamond_shards); material = BaseMaterialMF.pigiron; From 51b2ac966ecef5642138ea2f66f270c37b1ef94e Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 15 Sep 2017 22:16:04 +0700 Subject: [PATCH 061/101] Added Xorshift Thermite random This random implementation really faster that default Java rnd (up to 30%). --- .../java/minefantasy/mf2/MineFantasyII.java | 4 + .../mf2/mechanics/CombatMechanics.java | 44 ++-- .../mf2/mechanics/EventManagerMF.java | 40 ++- .../mf2/mechanics/MonsterUpgrader.java | 20 +- .../mf2/mechanics/PlayerTickHandlerMF.java | 22 +- .../mechanics/worldGen/WorldGenMFTree.java | 15 +- .../structure/StructureGenAFRoom.java | 1 - .../structure/StructureGenAncientForge.java | 2 - .../StructureGenAncientForgeEntry.java | 2 - .../worldGen/structure/StructureModuleMF.java | 5 +- .../mf2/network/CommonProxyMF.java | 10 +- .../java/minefantasy/mf2/util/XSTRandom.java | 236 ++++++++++++++++++ 12 files changed, 309 insertions(+), 92 deletions(-) create mode 100644 src/main/java/minefantasy/mf2/util/XSTRandom.java diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 03ed083a..a9045e6d 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -49,6 +49,7 @@ import minefantasy.mf2.recipe.RecipeRemover; import minefantasy.mf2.util.BukkitUtils; import minefantasy.mf2.util.MFLogUtil; +import minefantasy.mf2.util.XSTRandom; import net.minecraft.init.Items; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.MinecraftForge; @@ -71,6 +72,9 @@ public class MineFantasyII { @Instance(MODID) public static MineFantasyII instance; + //Up to 30% faster random implementation. + public static XSTRandom random = new XSTRandom(); + @EventHandler public void preInit(FMLPreInitializationEvent event) { NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy); diff --git a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java index 7d9a6c08..88730c83 100644 --- a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java +++ b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java @@ -1,28 +1,15 @@ package minefantasy.mf2.mechanics; -import java.util.Map; -import java.util.Random; - import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.armour.IElementalResistance; -import minefantasy.mf2.api.helpers.ArmourCalculator; -import minefantasy.mf2.api.helpers.ArrowEffectsMF; -import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.PowerArmour; -import minefantasy.mf2.api.helpers.TacticalManager; +import minefantasy.mf2.api.helpers.*; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.api.stamina.StaminaBar; -import minefantasy.mf2.api.weapon.IDamageModifier; -import minefantasy.mf2.api.weapon.IKnockbackWeapon; -import minefantasy.mf2.api.weapon.IParryable; -import minefantasy.mf2.api.weapon.IPowerAttack; -import minefantasy.mf2.api.weapon.ISpecialCombatMob; -import minefantasy.mf2.api.weapon.ISpecialEffect; -import minefantasy.mf2.api.weapon.IWeaponSpeed; -import minefantasy.mf2.api.weapon.IWeightedWeapon; +import minefantasy.mf2.api.weapon.*; import minefantasy.mf2.config.ConfigArmour; import minefantasy.mf2.config.ConfigExperiment; import minefantasy.mf2.config.ConfigStamina; @@ -30,11 +17,7 @@ import minefantasy.mf2.entity.EntityCogwork; import minefantasy.mf2.entity.Shockwave; import minefantasy.mf2.entity.mob.EntityMinotaur; -import minefantasy.mf2.item.weapon.ItemBattleaxeMF; -import minefantasy.mf2.item.weapon.ItemDagger; -import minefantasy.mf2.item.weapon.ItemKatanaMF; -import minefantasy.mf2.item.weapon.ItemWaraxeMF; -import minefantasy.mf2.item.weapon.ItemWeaponMF; +import minefantasy.mf2.item.weapon.*; import minefantasy.mf2.knowledge.KnowledgeListMF; import minefantasy.mf2.network.packet.DodgeCommand; import minefantasy.mf2.network.packet.ParryPacket; @@ -64,10 +47,11 @@ import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; +import java.util.Map; + public class CombatMechanics { public static final String parryCooldownNBT = "MF_Parry_Cooldown"; public static final String posthitCooldownNBT = "MF_PostHit"; - private static Random rand = new Random(); /** Damage done by silver to undead/witches */ public static final float specialUnholyModifier = 2.0F; /** Damage done by silver to werewolves */ @@ -259,7 +243,7 @@ private float modifyUserHitDamage(float dam, EntityLivingBase user, Entity sourc if (isSkeleton(target)) { dam *= 1.5F; if (properHit) { - if (rand.nextInt(2) == 0) { + if (MineFantasyII.random.nextInt(2) == 0) { target.entityDropItem(new ItemStack(Items.bone), 0.5F); } } @@ -374,7 +358,7 @@ public static void applyUndeadBane(EntityLivingBase living) { living.playSound("random.fizz", 0.5F, 0.5F); living.addPotionEffect(new PotionEffect(Potion.weakness.id, 1200, 2)); living.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 1200, 2)); - if (rand.nextInt(5) == 0) { + if (MineFantasyII.random.nextInt(5) == 0) { living.setFire(3); } } @@ -504,10 +488,10 @@ private float onUserHit(EntityLivingBase user, Entity entityHitting, DamageSourc * (dam + 1F) * parryFatigue * weaponFatigue); if (parry == null) { user.worldObj.playSoundAtEntity(user, getDefaultParrySound(weapon), 1.0F, - 1.25F + (rand.nextFloat() * 0.5F)); + 1.25F + (MineFantasyII.random.nextFloat() * 0.5F)); } else if (!parry.playCustomParrySound(user, entityHitting, weapon)) { user.worldObj.playSoundAtEntity(user, "mob.zombie.metal", 1.0F, - 1.25F + (rand.nextFloat() * 0.5F)); + 1.25F + (MineFantasyII.random.nextFloat() * 0.5F)); } if (user instanceof EntityPlayer) { ((EntityPlayer) user).stopUsingItem(); @@ -647,7 +631,7 @@ private boolean canEvade(EntityLivingBase user) { return false; } } else { - if (rand.nextInt(10) != 0)// Mobs can evade + if (MineFantasyII.random.nextInt(10) != 0)// Mobs can evade { return false; } @@ -868,9 +852,9 @@ public static void panic(EntityLivingBase victim, float speed, int directionTime double moveZ = victim.getEntityData().getDouble("MF2_PanicZ"); victim.setJumping(true); - if ((moveX == 0 && moveZ == 0) || rand.nextInt(directionTimer) == 0) { - moveX = (rand.nextDouble() - 0.5D) * 0.85D * speed; - moveZ = (rand.nextDouble() - 0.5D) * 0.85D * speed; + if ((moveX == 0 && moveZ == 0) || MineFantasyII.random.nextInt(directionTimer) == 0) { + moveX = (MineFantasyII.random.nextDouble() - 0.5D) * 0.85D * speed; + moveZ = (MineFantasyII.random.nextDouble() - 0.5D) * 0.85D * speed; victim.getEntityData().setDouble("MF2_PanicX", moveX); victim.getEntityData().setDouble("MF2_PanicZ", moveZ); diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index 53bc1c4c..389bf8ac 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Random; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.relauncher.Side; @@ -107,14 +106,13 @@ import net.minecraftforge.oredict.OreDictionary; public class EventManagerMF { - public static Random rand = new Random(); @SubscribeEvent public void tryDropItems(LivingDropsEvent event) { EntityLivingBase dropper = event.entityLiving; if (dropper instanceof EntityChicken) { - int dropCount = 1 + rand.nextInt(event.lootingLevel + 1 * 4); + int dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1 * 4); for (int a = 0; a < dropCount; a++) { dropper.entityDropItem(new ItemStack(Items.feather), 0.0F); @@ -126,7 +124,7 @@ public void tryDropItems(LivingDropsEvent event) { dropper.entityDropItem(new ItemStack(drop), 0.0F); } if (dropper instanceof EntityAgeable && dropper.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD) { - if (rand.nextFloat() * (1 + event.lootingLevel) < 0.05F) { + if (MineFantasyII.random.nextFloat() * (1 + event.lootingLevel) < 0.05F) { dropper.entityDropItem(new ItemStack(FoodListMF.guts), 0.0F); } } @@ -140,9 +138,9 @@ public void tryDropItems(LivingDropsEvent event) { } } if (getRegisterName(dropper).contains("Horse")) { - int dropCount = rand.nextInt(3 + event.lootingLevel); + int dropCount = MineFantasyII.random.nextInt(3 + event.lootingLevel); if (ConfigHardcore.lessHunt) { - dropCount = 1 + rand.nextInt(event.lootingLevel + 1); + dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1); } Item meat = dropper.isBurning() ? FoodListMF.horse_cooked : FoodListMF.horse_raw; @@ -151,9 +149,9 @@ public void tryDropItems(LivingDropsEvent event) { } } if (getRegisterName(dropper).contains("Wolf")) { - int dropCount = rand.nextInt(3 + event.lootingLevel); + int dropCount = MineFantasyII.random.nextInt(3 + event.lootingLevel); if (ConfigHardcore.lessHunt) { - dropCount = 1 + rand.nextInt(event.lootingLevel + 1); + dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1); } Item meat = dropper.isBurning() ? FoodListMF.wolf_cooked : FoodListMF.wolf_raw; @@ -403,14 +401,14 @@ private void dropBook(EntityLivingBase dead, int id) { return; Item book = null; if (id == 0) { - float chance = rand.nextFloat(); + float chance = MineFantasyII.random.nextFloat(); if (chance > 0.75F) { book = ToolListMF.skillbook_engineering; } else { book = ToolListMF.skillbook_provisioning; } - } else if (id == 1 && rand.nextInt(5) == 0) { - float chance = rand.nextFloat(); + } else if (id == 1 && MineFantasyII.random.nextInt(5) == 0) { + float chance = MineFantasyII.random.nextFloat(); if (chance > 0.9F) { book = ToolListMF.skillbook_engineering; } else if (chance > 0.6F) { @@ -420,8 +418,8 @@ private void dropBook(EntityLivingBase dead, int id) { } else { book = ToolListMF.skillbook_provisioning; } - } else if (id == 2 && rand.nextInt(25) == 0) { - float chance = rand.nextFloat(); + } else if (id == 2 && MineFantasyII.random.nextInt(25) == 0) { + float chance = MineFantasyII.random.nextFloat(); if (chance > 0.9F) { book = ToolListMF.skillbook_engineering; } else if (chance > 0.6F) { @@ -484,16 +482,16 @@ public void playerMineBlock(BlockEvent.BreakEvent event) { if (broken != null && ConfigHardcore.HCCallowRocks) { if (broken == Blocks.stone && held == null) { entityDropItem(event.world, event.x, event.y, event.z, - new ItemStack(ComponentListMF.sharp_rock, rand.nextInt(3) + 1)); + new ItemStack(ComponentListMF.sharp_rock, MineFantasyII.random.nextInt(3) + 1)); } if (broken instanceof BlockLeavesBase && held != null && held.getItem() == ComponentListMF.sharp_rock) { - if (rand.nextInt(5) == 0) { + if (MineFantasyII.random.nextInt(5) == 0) { entityDropItem(event.world, event.x, event.y, event.z, - new ItemStack(Items.stick, rand.nextInt(3) + 1)); + new ItemStack(Items.stick, MineFantasyII.random.nextInt(3) + 1)); } - if (rand.nextInt(3) == 0) { + if (MineFantasyII.random.nextInt(3) == 0) { entityDropItem(event.world, event.x, event.y, event.z, - new ItemStack(ComponentListMF.vine, rand.nextInt(3) + 1)); + new ItemStack(ComponentListMF.vine, MineFantasyII.random.nextInt(3) + 1)); } } } @@ -754,9 +752,9 @@ public void updateEntity(LivingUpdateEvent event) { } if (entity.ticksExisted % 15 == 0) { entity.limbSwing = 2.0F; - float x = (float) (entity.posX + (rand.nextFloat() - 0.5F) / 4F); - float y = (float) (entity.posY + entity.getEyeHeight() + (rand.nextFloat() - 0.5F) / 4F); - float z = (float) (entity.posZ + (rand.nextFloat() - 0.5F) / 4F); + float x = (float) (entity.posX + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); + float y = (float) (entity.posY + entity.getEyeHeight() + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); + float z = (float) (entity.posZ + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); entity.worldObj.spawnParticle("reddust", x, y, z, 0F, 0F, 0F); } } diff --git a/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java b/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java index 6d2688c0..13666d3e 100644 --- a/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java +++ b/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java @@ -3,6 +3,7 @@ import java.util.Random; import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.item.list.CustomArmourListMF; @@ -27,7 +28,6 @@ public class MonsterUpgrader { private static final float creeperJockeyChance = 60F; private static final float witchRiderChance = 100F; - private static Random rand = new Random(); public static final String zombieArmourNBT = "MF_ZombieArmour"; public void upgradeMob(EntityLivingBase mob) { @@ -36,8 +36,8 @@ public void upgradeMob(EntityLivingBase mob) { if (ConfigHardcore.upgradeZombieWep) { if (mob instanceof EntitySkeleton) { if (((EntitySkeleton) mob).getSkeletonType() == 1) { - giveEntityWeapon(mob, "Diamond", rand.nextInt(8)); - } else if (CombatMechanics.swordSkeleton && rand.nextInt(3) == 0) { + giveEntityWeapon(mob, "Diamond", MineFantasyII.random.nextInt(8)); + } else if (CombatMechanics.swordSkeleton && MineFantasyII.random.nextInt(3) == 0) { mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_sword.construct("Bronze", "OakWood")); ((EntitySkeleton) mob).setCombatTask(); } @@ -45,7 +45,7 @@ public void upgradeMob(EntityLivingBase mob) { String tier = "Iron"; if (mob instanceof EntityPigZombie) { tier = "Obsidian"; - giveEntityWeapon(mob, tier, rand.nextInt(7)); + giveEntityWeapon(mob, tier, MineFantasyII.random.nextInt(7)); if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); } @@ -58,18 +58,18 @@ public void upgradeMob(EntityLivingBase mob) { } else { float mod = diff >= 2 ? ConfigHardcore.zombieWepChance * 2 : diff < 1 ? ConfigHardcore.zombieWepChance / 2 : ConfigHardcore.zombieWepChance; - float chance = rand.nextFloat() * 100F * mod; + float chance = MineFantasyII.random.nextFloat() * 100F * mod; if (chance >= (100F - zombieWepChance)) { - giveEntityWeapon(mob, tier, rand.nextInt(5)); + giveEntityWeapon(mob, tier, MineFantasyII.random.nextInt(5)); if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); } } } } - if (rand.nextFloat() * (zombieKnightChance) < diff) { + if (MineFantasyII.random.nextFloat() * (zombieKnightChance) < diff) { createZombieKnight((EntityZombie) mob); - } else if (rand.nextFloat() * (zombieBruteChance) < diff) { + } else if (MineFantasyII.random.nextFloat() * (zombieBruteChance) < diff) { createZombieBrute((EntityZombie) mob); } else if (ConfigHardcore.fastZombies) { mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3F); @@ -77,12 +77,12 @@ public void upgradeMob(EntityLivingBase mob) { } } else if (mob instanceof EntitySpider) { if (mob.riddenByEntity == null) { - if (rand.nextFloat() * (witchRiderChance) < diff) { + if (MineFantasyII.random.nextFloat() * (witchRiderChance) < diff) { EntityWitch rider = new EntityWitch(mob.worldObj); rider.setPosition(mob.posX, mob.posY, mob.posZ); mob.worldObj.spawnEntityInWorld(rider); rider.mountEntity(mob); - } else if (rand.nextFloat() * (creeperJockeyChance) < diff) { + } else if (MineFantasyII.random.nextFloat() * (creeperJockeyChance) < diff) { EntityCreeper rider = new EntityCreeper(mob.worldObj); rider.setPosition(mob.posX, mob.posY, mob.posZ); mob.worldObj.spawnEntityInWorld(rider); diff --git a/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java b/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java index a29a974e..72063689 100644 --- a/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java @@ -7,6 +7,7 @@ import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; import cpw.mods.fml.common.gameevent.TickEvent; +import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.archery.IFirearm; import minefantasy.mf2.api.heating.IHotItem; @@ -37,7 +38,6 @@ import net.minecraft.world.EnumDifficulty; public class PlayerTickHandlerMF { - private static Random rand = new Random(); private static ItemStack lastStack; // SPRINT JUMPING @@ -170,7 +170,7 @@ private void tickDragonSpawner(EntityPlayer player) { chance *= 2;// twice the chance } if (!player.worldObj.isRemote && player.worldObj.getTotalWorldTime() % i == 0 - && rand.nextFloat() * 100F < chance) { + && MineFantasyII.random.nextFloat() * 100F < chance) { spawnDragon(player); } } @@ -303,38 +303,38 @@ public static int getDragonTier(EntityPlayer player) { return 0;// Young 100% } if (kills < 10) { - if (rand.nextInt(5) == 0) + if (MineFantasyII.random.nextInt(5) == 0) return 0;// 20% chance for Young return 1;// Adult } if (kills < 15) { - if (rand.nextInt(10) == 0) + if (MineFantasyII.random.nextInt(10) == 0) return 0;// 10% chance for Young return 1;// Adult } if (kills < 25) { - if (rand.nextInt(20) == 0) + if (MineFantasyII.random.nextInt(20) == 0) return 0;// 5% chance for Young - if (rand.nextInt(10) == 0) + if (MineFantasyII.random.nextInt(10) == 0) return 2;// 10% chance for Mature return 1;// Adult } if (kills < 35) { - if (rand.nextInt(4) == 0) + if (MineFantasyII.random.nextInt(4) == 0) return 2;// 25% chance for Mature return 1;// Adult } if (kills >= 50) { - if (rand.nextInt(10) == 0) + if (MineFantasyII.random.nextInt(10) == 0) return 1;// 10% chance for Adult - if (rand.nextInt(5) == 0) + if (MineFantasyII.random.nextInt(5) == 0) return 3;// 20% chance Elder return 2;// Mature } if (kills > 75) { - if (rand.nextInt(100) == 0) + if (MineFantasyII.random.nextInt(100) == 0) return 4;// 1% chance Ancient - if (rand.nextInt(2) == 0) + if (MineFantasyII.random.nextInt(2) == 0) return 3;// 50% chance Elder return 2;// Mature } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java index baf24215..fc437d10 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java @@ -1,7 +1,6 @@ package minefantasy.mf2.mechanics.worldGen; -import java.util.Random; - +import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.block.list.BlockListMF; import net.minecraft.block.Block; import net.minecraft.block.BlockSapling; @@ -11,14 +10,14 @@ import net.minecraft.world.gen.feature.WorldGenAbstractTree; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Random; + public class WorldGenMFTree extends WorldGenAbstractTree { /** * Contains three sets of two values that provide complimentary indices for a * given 'major' index - 1 and 2 for 0, 0 and 2 for 1, and 0 and 1 for 2. */ static final byte[] otherCoordPairs = new byte[] { (byte) 2, (byte) 0, (byte) 0, (byte) 1, (byte) 2, (byte) 1 }; - /** random seed for GenBigTree */ - Random rand = new Random(); /** Reference to the World object. */ World worldObj; int[] basePos = new int[] { 0, 0, 0 }; @@ -104,8 +103,8 @@ void generateLeafNodeList() { --i1; } else { for (double d0 = 0.5D; j1 < i; ++j1) { - double d1 = this.scaleWidth * f * (this.rand.nextFloat() + 0.328D); - double d2 = this.rand.nextFloat() * 2.0D * Math.PI; + double d1 = this.scaleWidth * f * (MineFantasyII.random.nextFloat() + 0.328D); + double d2 = MineFantasyII.random.nextFloat() * 2.0D * Math.PI; int k1 = MathHelper.floor_double(d1 * Math.sin(d2) + this.basePos[0] + d0); int l1 = MathHelper.floor_double(d1 * Math.cos(d2) + this.basePos[2] + d0); int[] aint1 = new int[] { k1, j, l1 }; @@ -433,13 +432,13 @@ public void setScale(double p_76487_1_, double p_76487_3_, double p_76487_5_) { public boolean generate(World world, Random rand, int x, int y, int z) { this.worldObj = world; long l = rand.nextLong(); - this.rand.setSeed(l); + MineFantasyII.random.setSeed(l); this.basePos[0] = x; this.basePos[1] = y; this.basePos[2] = z; if (this.heightLimit == 0) { - this.heightLimit = 5 + this.rand.nextInt(this.heightLimitLimit); + this.heightLimit = 5 + MineFantasyII.random.nextInt(this.heightLimitLimit); } if (!this.validTreeLocation()) { diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java index 06704d52..5fcd2af3 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java @@ -11,7 +11,6 @@ import net.minecraftforge.common.ChestGenHooks; public class StructureGenAFRoom extends StructureModuleMF { - private Random rand = new Random(); public StructureGenAFRoom(World world, int x, int y, int z, int d) { super(world, x, y, z, d); diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java index 1db85551..a0fb82f0 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java @@ -8,8 +8,6 @@ import net.minecraftforge.common.ChestGenHooks; public class StructureGenAncientForge extends StructureModuleMF { - private Random rand = new Random(); - public StructureGenAncientForge(World world, int x, int y, int z, int d) { super(world, x, y, z, d); } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java index b46e5165..96df59aa 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java @@ -7,8 +7,6 @@ public class StructureGenAncientForgeEntry extends StructureModuleMF { - private Random rand = new Random(); - public StructureGenAncientForgeEntry(World world, int x, int y, int z, int d) { super(world, x, y, z, d); } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java index 72f1d3b1..f94457e8 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java @@ -4,6 +4,7 @@ import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.tileentity.TileEntityWorldGenMarker; +import minefantasy.mf2.util.XSTRandom; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.init.Blocks; @@ -13,6 +14,8 @@ import net.minecraft.world.World; import net.minecraftforge.common.DungeonHooks; +import javax.xml.bind.annotation.XmlSchema; + public abstract class StructureModuleMF { public final int xCoord; public final int yCoord; @@ -22,7 +25,7 @@ public abstract class StructureModuleMF { */ public final int direction; public final World worldObj; - protected Random rand = new Random(); + protected XSTRandom rand = new XSTRandom(); /** * How much longer can units be added */ diff --git a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java index 38b179b6..82462a7b 100644 --- a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java @@ -5,6 +5,7 @@ import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.registry.GameRegistry; +import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.refine.ISmokeHandler; import minefantasy.mf2.api.refine.SmokeMechanics; @@ -174,17 +175,14 @@ public EntityPlayer getClientPlayer() { return null; } - public static int renderID = -1; - private static Random rand = new Random(); - @Override public void spawnSmoke(World world, double x, double y, double z, int value) { for (int a = 0; a < value; a++) { float sprayRange = 0.005F; - float sprayX = (rand.nextFloat() * sprayRange) - (sprayRange / 2); - float sprayZ = (rand.nextFloat() * sprayRange) - (sprayRange / 2); + float sprayX = (MineFantasyII.random.nextFloat() * sprayRange) - (sprayRange / 2); + float sprayZ = (MineFantasyII.random.nextFloat() * sprayRange) - (sprayRange / 2); float height = 0.001F; - if (rand.nextInt(2) == 0) { + if (MineFantasyII.random.nextInt(2) == 0) { EntitySmoke smoke = new EntitySmoke(world, x, y - 0.5D, z, sprayX, height, sprayZ); world.spawnEntityInWorld(smoke); } diff --git a/src/main/java/minefantasy/mf2/util/XSTRandom.java b/src/main/java/minefantasy/mf2/util/XSTRandom.java new file mode 100644 index 00000000..1153cb35 --- /dev/null +++ b/src/main/java/minefantasy/mf2/util/XSTRandom.java @@ -0,0 +1,236 @@ +package minefantasy.mf2.util; +/** + * A subclass of java.util.random that implements the Xorshift random number + * generator + * + * - it is 30% faster than the generator from Java's library - it produces + * random sequences of higher quality than java.util.Random - this class also + * provides a clone() function + * + * Usage: XSRandom rand = new XSRandom(); //Instantiation x = rand.nextInt(); + * //pull a random number + * + * To use the class in legacy code, you may also instantiate an XSRandom object + * and assign it to a java.util.Random object: java.util.Random rand = new + * XSRandom(); + * + * for an explanation of the algorithm, see + * http://demesos.blogspot.com/2011/09/pseudo-random-number-generators.html + * + * @author Wilfried Elmenreich University of Klagenfurt/Lakeside Labs + * http://www.elmenreich.tk + * + * This code is released under the GNU Lesser General Public License Version 3 + * http://www.gnu.org/licenses/lgpl-3.0.txt + */ + +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; + +/** + * XSTR - Xorshift ThermiteRandom + * Modified by Bogdan-G + * 03.06.2016 + * version 0.0.4 + */ + +public class XSTRandom extends Random { + + private static final long serialVersionUID = 6208727693524452904L; + private long seed; + private long last; + private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53) + private static final float FLOAT_UNIT = 0x1.0p-24f; // 1.0f / (1 << 24) + + /* + MODIFIED BY: Robotia + Modification: Implemented Random class seed generator + */ + /** + * Creates a new pseudo random number generator. The seed is initialized to + * the current time, as if by + * setSeed(System.currentTimeMillis());. + */ + public XSTRandom() { + this(seedUniquifier() ^ System.nanoTime()); + } + private static final AtomicLong seedUniquifier + = new AtomicLong(8682522807148012L); + + private static long seedUniquifier() { + // L'Ecuyer, "Tables of Linear Congruential Generators of + // Different Sizes and Good Lattice Structure", 1999 + for (;;) { + long current = seedUniquifier.get(); + long next = current * 181783497276652981L; + if (seedUniquifier.compareAndSet(current, next)) { + return next; + } + } + } + + /** + * Creates a new pseudo random number generator, starting with the specified + * seed, using setSeed(seed);. + * + * @param seed the initial seed + */ + public XSTRandom(long seed) { + this.seed = seed; + } + public boolean nextBoolean() { + return next(1) != 0; + } + + public double nextDouble() { + return (((long)(next(26)) << 27) + next(27)) * DOUBLE_UNIT; + } + /** + * Returns the current state of the seed, can be used to clone the object + * + * @return the current seed + */ + public synchronized long getSeed() { + return seed; + } + + /** + * Sets the seed for this pseudo random number generator. As described + * above, two instances of the same random class, starting with the same + * seed, produce the same results, if the same methods are called. + * + * @param seed the new seed + */ + public synchronized void setSeed(long seed) { + this.seed = seed; + } + + /** + * @return Returns an XSRandom object with the same state as the original + */ + @Override + public XSTRandom clone() { + return new XSTRandom(getSeed()); + } + + /** + * Implementation of George Marsaglia's elegant Xorshift random generator + * 30% faster and better quality than the built-in java.util.random see also + * see http://www.javamex.com/tutorials/random_numbers/xorshift.shtml + * + * @param nbits + * @return + */ + public int next(int nbits) { + long x = seed; + x ^= (x << 21); + x ^= (x >>> 35); + x ^= (x << 4); + seed = x; + x &= ((1L << nbits) - 1); + return (int) x; + } + boolean haveNextNextGaussian = false; + double nextNextGaussian = 0; + synchronized public double nextGaussian() { + // See Knuth, ACP, Section 3.4.1 Algorithm C. + if (haveNextNextGaussian) { + haveNextNextGaussian = false; + return nextNextGaussian; + } else { + double v1, v2, s; + do { + v1 = 2 * nextDouble() - 1; // between -1 and 1 + v2 = 2 * nextDouble() - 1; // between -1 and 1 + s = v1 * v1 + v2 * v2; + } while (s >= 1 || s == 0); + double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s)/s); + nextNextGaussian = v2 * multiplier; + haveNextNextGaussian = true; + return v1 * multiplier; + } + } + /** + * Returns a pseudorandom, uniformly distributed {@code int} value between 0 + * (inclusive) and the specified value (exclusive), drawn from this random + * number generator's sequence. The general contract of {@code nextInt} is + * that one {@code int} value in the specified range is pseudorandomly + * generated and returned. All {@code bound} possible {@code int} values are + * produced with (approximately) equal probability. The method + * {@code nextInt(int bound)} is implemented by class {@code Random} as if + * by: + *
 {@code
+     * public int nextInt(int bound) {
+     *   if (bound <= 0)
+     *     throw new IllegalArgumentException("bound must be positive");
+     *
+     *   if ((bound & -bound) == bound)  // i.e., bound is a power of 2
+     *     return (int)((bound * (long)next(31)) >> 31);
+     *
+     *   int bits, val;
+     *   do {
+     *       bits = next(31);
+     *       val = bits % bound;
+     *   } while (bits - val + (bound-1) < 0);
+     *   return val;
+     * }}
+ * + *

The hedge "approx + * imately" is used in the foregoing description only because the next + * method is only approximately an unbiased source of independently chosen + * bits. If it were a perfect source of randomly chosen bits, then the + * algorithm shown would choose {@code int} values from the stated range + * with perfect uniformity. + *

+ * The algorithm is slightly tricky. It rejects values that would result in + * an uneven distribution (due to the fact that 2^31 is not divisible by n). + * The probability of a value being rejected depends on n. The worst case is + * n=2^30+1, for which the probability of a reject is 1/2, and the expected + * number of iterations before the loop terminates is 2. + *

+ * The algorithm treats the case where n is a power of two specially: it + * returns the correct number of high-order bits from the underlying + * pseudo-random number generator. In the absence of special treatment, the + * correct number of low-order bits would be returned. Linear + * congruential pseudo-random number generators such as the one implemented + * by this class are known to have short periods in the sequence of values + * of their low-order bits. Thus, this special case greatly increases the + * length of the sequence of values returned by successive calls to this + * method if n is a small power of two. + * + * @param bound the upper bound (exclusive). Must be positive. + * @return the next pseudorandom, uniformly distributed {@code int} value + * between zero (inclusive) and {@code bound} (exclusive) from this random + * number generator's sequence + * @throws IllegalArgumentException if bound is not positive + * @since 1.2 + */ + public int nextInt(int bound) { + last = seed ^ (seed << 21); + last ^= (last >>> 35); + last ^= (last << 4); + seed = last; + int out = (int) last % bound; + return (out < 0) ? -out : out; + } + public int nextInt() { + return next(32); + } + + public float nextFloat() { + return next(24) * FLOAT_UNIT; + } + + public long nextLong() { + // it's okay that the bottom word remains signed. + return ((long)(next(32)) << 32) + next(32); + } + + public void nextBytes(byte[] bytes_arr) { + for (int iba = 0, lenba = bytes_arr.length; iba < lenba; ) + for (int rndba = nextInt(), + nba = Math.min(lenba - iba, Integer.SIZE/Byte.SIZE); + nba-- > 0; rndba >>= Byte.SIZE) + bytes_arr[iba++] = (byte)rndba; + } +} \ No newline at end of file From cc88013139729513cd7a4934b873f8f241fd0fb6 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 15 Sep 2017 23:42:28 +0700 Subject: [PATCH 062/101] Added ASM patch for horse armor support Based on SanAndreasP code. --- build.gradle | 9 + .../mf2/api/armour/ItemHorseArmorMFBase.java | 71 ++++ .../java/minefantasy/mf2/asm/ASMHelper.java | 200 ++++++++++ .../mf2/asm/InstructionComparator.java | 338 ++++++++++++++++ .../minefantasy/mf2/asm/MFLoadingPlugin.java | 53 +++ .../java/minefantasy/mf2/asm/Mappings.java | 79 ++++ .../transformers/EntityHorseTransformer.java | 361 ++++++++++++++++++ .../mf2/item/armour/ItemHorseArmorMF.java | 8 + 8 files changed, 1119 insertions(+) create mode 100644 src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java create mode 100644 src/main/java/minefantasy/mf2/asm/ASMHelper.java create mode 100644 src/main/java/minefantasy/mf2/asm/InstructionComparator.java create mode 100644 src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java create mode 100644 src/main/java/minefantasy/mf2/asm/Mappings.java create mode 100644 src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java create mode 100644 src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java diff --git a/build.gradle b/build.gradle index bce508d5..81ec5f14 100644 --- a/build.gradle +++ b/build.gradle @@ -56,6 +56,15 @@ dependencies { task deobfJar(type: Jar) { from sourceSets.main.output classifier = 'deobf' + manifest { + attributes "FMLCorePlugin": "minefantasy.mf2.asm.MFLoadingPlugin", "FMLCorePluginContainsFMLMod": "true" + } +} + +jar { + manifest { + attributes "FMLCorePlugin": "minefantasy.mf2.asm.MFLoadingPlugin", "FMLCorePluginContainsFMLMod": "true" + } } tasks.build.dependsOn('deobfJar') diff --git a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java new file mode 100644 index 00000000..e5ccda3e --- /dev/null +++ b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java @@ -0,0 +1,71 @@ +package minefantasy.mf2.api.armour; + +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; + +import net.minecraftforge.client.event.RenderLivingEvent; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public abstract class ItemHorseArmorMFBase extends Item implements ISpecialArmourMF { + + /** + * Used to calculate the amount of protection this item should provide the horse with. + * + * @param horse: An instance of the horse which is currently wearing this piece of armor. + * @param stack: An instance of the ItemStack currently in the horse's armor slot. + * @return int: An integer based representation of the armor points which should be given + * to a horse by this armor item. + */ + public abstract int getArmorValue (EntityHorse horse, ItemStack stack); + + /** + * Called every time an EntityHorse updates while wearing this piece of armor. Allows for + * armor to alter the behavior and abilities of a horse. + * + * @param horse: An instance of the horse which is currently wearing this piece of armor. + * @param stack: An instance of the ItemStack currently in the horse's armor slot. + */ + public abstract void onHorseUpdate (EntityHorse horse, ItemStack stack); + + /** + * Called when a horse wearing this piece of armor has been hurt. + * + * @param horse: An instance of the horse which is currently wearing this piece of armor. + * @param stack: An instance of the ItemStack currently in the horse's armor slot. + * @param source: The DamageSource which caused the horse to be hurt. + * @param damage: The amount of damage that the horse received. + * @return boolean: If true, the horse will not be hurt and the event will be canceled. + */ + public abstract boolean onHorseDamaged (EntityHorse horse, ItemStack stack, DamageSource source, float damage); + + /** + * Used to provide a resource path for the armor's texture. Textures follow the same rules + * and layouts as the vanilla horse armor textures. The domain for the texture can be + * switched from minecraft to one of your chosing by preceding the path with 'domain:' + * + * @param horse: An instance of the horse which is currently wearing this piece of armor. + * @param stack: An instance of the ItemStack currently in the horse's armor slot. + * @return String: A string based representation of the armor texture resource location. + * EG: testmod:textures/entity/horse/armor/horse_armor_test.png + */ + @SideOnly(Side.CLIENT) + public abstract String getArmorTexture (EntityHorse horse, ItemStack stack); + + /** + * Allows for special rendering code to be done, when a horse is rendered with this piece + * of armor on. + * + * @param horse: An instance of the EntityHorse that is wearing the armor. + * @param armorStack: An instance of the ItemStack which is in the armor slot. + * @param event: Access to the RenderLivingEvent being called. + * @param flag: A convenient flag which can be used to easily switch between the different + * render events. 0:pre 1:post 2:special-pre 3:special-post + */ + @SideOnly(Side.CLIENT) + public abstract void onHorseRendered (EntityHorse horse, ItemStack armorStack, RenderLivingEvent event, byte flag); + +} diff --git a/src/main/java/minefantasy/mf2/asm/ASMHelper.java b/src/main/java/minefantasy/mf2/asm/ASMHelper.java new file mode 100644 index 00000000..9ed73ea8 --- /dev/null +++ b/src/main/java/minefantasy/mf2/asm/ASMHelper.java @@ -0,0 +1,200 @@ +package minefantasy.mf2.asm; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.tree.*; + +import java.util.ArrayList; +import java.util.List; + +public final class ASMHelper { + + public static boolean isSrg = true; + public static boolean isASMEnabled = false; + + /** + * Provides an easy way to retrieve an appropriate mapping, based on if the environement is + * using mcp mappings or srg mappings. + * + * @param mcp: The string you want if this environment is using mcp mappings. + * @param srg: The string you want if this environment is using srg mappings. + * @return String: The most appropriate mapping for this environment. + */ + public static String getAppropriateMapping(String mcp, String srg) { + + return (isSrg) ? srg : mcp; + } + + /** + * Converts a ClassNode into a byte array which can then be returned by your transformer. + * + * @param classNode: An instance of the ClassNode you wish to convert into a byte array. + * @param flags: The flags to use when converting the ClassNode. These are generally + * COMPUTE_FRAMES and COMPUTE_MAXS. + * @return byte[]: A byte array representation of the ClassNode. + */ + public static byte[] createByteArrayFromClass(ClassNode classNode, int flags) { + + ClassWriter classWriter = new ClassWriter(flags); + classNode.accept(classWriter); + + return classWriter.toByteArray(); + } + + /** + * Converts a byte array into a ClassNode which can then easily be worked with and + * manipulated. + * + * @param classBytes: The byte array representation of the class. + * @return ClassNode: A ClassNode representation of the class, built from the byte array. + */ + public static ClassNode createClassFromByteArray(byte[] classBytes) { + + ClassNode classNode = new ClassNode(); + ClassReader classReader = new ClassReader(classBytes); + classReader.accept(classNode, ClassReader.EXPAND_FRAMES); + return classNode; + } + + /** + * Checks if a ClassNode has an instance of the target method. This does not take + * descriptors into account. + * + * @param classNode: The instance of ClassNode to look through. + * @param methodName: The name of the method you are looking for. + * @return boolean: True if the method is found, false if it is not. + */ + public static boolean hasClassMethodName(ClassNode classNode, String methodName) { + + for (MethodNode method : classNode.methods) + if (methodName.equals(method.name)) + return true; + + return false; + } + + /** + * Retrieves a MethodNode from a ClassNode, if one can not be found, an exception will be + * thrown, and the game will stop. + * + * @param classNode: An instance of the ClassNode to go looking through. + * @param methodName: The name of the desired method. + * @param descriptor: The descriptor for the method, used to find a specific version of the + * desired method. + * @return MethodNode: A MethodNode which represents the desired method. If this method can + * not be found, a MethodNotFoundException will be thrown and the game will stop. + */ + public static MethodNode getMethodFromClass(ClassNode classNode, String methodName, String descriptor) { + + for (MethodNode mnode : classNode.methods) + if (methodName.equals(mnode.name) && descriptor.equals(mnode.desc)) + return mnode; + + throw new MethodNotFoundException(methodName, descriptor); + } + + /** + * Finds the first instruction node after the the provided instruction list, within a + * larger list of instructions. + * + * @param haystack: A complete list of instructions which is being searched through. + * @param needle: A small list of instructions which represents a very specific part of the + * larger instruction list. + * @return AbstractInsnNode: The first instruction node from the specified list of + * instructions. (the needle) + */ + public static AbstractInsnNode findFirstNodeFromNeedle(InsnList haystack, InsnList needle) { + + List ret = InstructionComparator.insnListFindStart(haystack, needle); + + if (ret.size() != 1) + throw new InvalidNeedleException(ret.size()); + + return ret.get(0); + } + + /** + * Finds the last instruction node after the provided instruction list, within a larger + * list of instructions. + * + * @param haystack: A large list of instructions which is being searched through. + * @param needle: A small list of instructions which represents a very specific part of the + * larger instruction list. + * @return AbstractInsnNode: The last instruction node from the specified list of + * instructions. (the needle) + */ + public static AbstractInsnNode findLastNodeFromNeedle(InsnList haystack, InsnList needle) { + + List ret = InstructionComparator.insnListFindEnd(haystack, needle); + + if (ret.size() != 1) + throw new InvalidNeedleException(ret.size()); + + return ret.get(0); + } + + /** + * Removes a specific set of instructions (the needle) from a much larger set of + * instructions (the hay stack). Be cautious when using this method, as it is almost never + * a good idea to remove instructions. + * + * @param haystack: A large list of instructions which is being searched through. + * @param needle: A specific list of instructions which are to be removed from the larger + * instruction list. + */ + public static void removeNeedleFromHaystack(InsnList haystack, InsnList needle) { + + int firstInd = haystack.indexOf(findFirstNodeFromNeedle(haystack, needle)); + int lastInd = haystack.indexOf(findLastNodeFromNeedle(haystack, needle)); + List realNeedle = new ArrayList(); + + for (int i = firstInd; i <= lastInd; i++) + realNeedle.add(haystack.get(i)); + + for (AbstractInsnNode node : realNeedle) + haystack.remove(node); + } + + /** + * Checks if an instruction can be ignored. While this typically isn't needed, there may be + * some cases where you want to ignore LabelNodes and LineNumberNodes. This method will + * help with that. + * + * @param insn: The AbstractInsnNode to check against. + * @return boolean: True if it okay to ignore this instruction, false if it not okay. + */ + public static boolean canIgnoreInstruction(AbstractInsnNode insn) { + + return (insn instanceof LabelNode || insn instanceof LineNumberNode); + } + + public static class InvalidNeedleException extends RuntimeException { + + /** + * An exception which is thrown when there is an issue working with a needle. This + * could be due to the needle not being found within a hay stack, multiple versions of + * the same needle being found, or another anomaly. + * + * @param count: The amount of the specified needle which was found. + */ + public InvalidNeedleException(int count) { + + super(count > 1 ? "More than one instance of the needle have been found!" : count < 1 ? "The needle was not found" : "There is a glitch in the matrix"); + } + } + + public static class MethodNotFoundException extends RuntimeException { + + /** + * An exception which is thrown when a MethodNode is being looked for, but couldn't be + * found. + * + * @param methodName: The name of the method being looked for. + * @param methodDesc: The descriptor for the method being looked for. + */ + public MethodNotFoundException(String methodName, String methodDesc) { + + super("Attempt to find a method has failed. Method: " + methodName + " Descriptor: " + methodDesc); + } + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/asm/InstructionComparator.java b/src/main/java/minefantasy/mf2/asm/InstructionComparator.java new file mode 100644 index 00000000..1eb44e96 --- /dev/null +++ b/src/main/java/minefantasy/mf2/asm/InstructionComparator.java @@ -0,0 +1,338 @@ +package minefantasy.mf2.asm; + +import org.objectweb.asm.tree.*; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; + +import static org.objectweb.asm.tree.AbstractInsnNode.*; + +public final class InstructionComparator { + + // TODO: Add documentation + public static InsnList getImportantList(InsnList list) { + + if (list.size() == 0) + return list; + + HashMap labels = new HashMap(); + + for (AbstractInsnNode insn = list.getFirst(); insn != null; insn = insn.getNext()) + if (insn instanceof LabelNode) + labels.put((LabelNode) insn, (LabelNode) insn); + + InsnList importantNodeList = new InsnList(); + + for (AbstractInsnNode insn = list.getFirst(); insn != null; insn = insn.getNext()) { + + if (insn instanceof LabelNode || insn instanceof LineNumberNode) + continue; + + importantNodeList.add(insn.clone(labels)); + } + + return importantNodeList; + } + + /** + * Compares whether or not two instructions are equal. + * + * @param node1: The first instruction. + * @param node2: The second instruction. + * @return boolean: True if they are the same, false if they are not. + */ + public static boolean insnEqual(AbstractInsnNode node1, AbstractInsnNode node2) { + + if (node1.getType() != node2.getType()) + return false; + + else if (node1.getOpcode() != node2.getOpcode()) + return false; + + switch (node2.getType()) { + + case VAR_INSN: + return varInsnEqual((VarInsnNode) node1, (VarInsnNode) node2); + + case TYPE_INSN: + return typeInsnEqual((TypeInsnNode) node1, (TypeInsnNode) node2); + + case FIELD_INSN: + return fieldInsnEqual((FieldInsnNode) node1, (FieldInsnNode) node2); + + case METHOD_INSN: + return methodInsnEqual((MethodInsnNode) node1, (MethodInsnNode) node2); + + case LDC_INSN: + return ldcInsnEqual((LdcInsnNode) node1, (LdcInsnNode) node2); + + case IINC_INSN: + return iincInsnEqual((IincInsnNode) node1, (IincInsnNode) node2); + + case INT_INSN: + return intInsnEqual((IntInsnNode) node1, (IntInsnNode) node2); + + default: + return true; + } + } + + // TODO: Add documentation + public static List insnListFindStart(InsnList haystack, InsnList needle) { + + LinkedList callNodes = new LinkedList(); + + for (int callPoint : insnListFind(haystack, needle)) + callNodes.add(haystack.get(callPoint)); + + return callNodes; + } + + // TODO: Add documentation + public static List insnListFind(InsnList haystack, InsnList needle) { + + LinkedList list = new LinkedList(); + + for (int start = 0; start <= haystack.size() - needle.size(); start++) + if (insnListMatches(haystack, needle, start)) + list.add(start); + + return list; + } + + // TODO: Add documentation + public static List insnListFindEnd(InsnList haystack, InsnList needle) { + + LinkedList callNodes = new LinkedList(); + + for (int callPoint : insnListFind(haystack, needle)) + callNodes.add(haystack.get(callPoint + needle.size() - 1)); + + return callNodes; + } + + // TODO: Add documentation + public static List insnListFindL(InsnList haystack, InsnList needle) { + + HashSet controlFlowLabels = new HashSet(); + + for (AbstractInsnNode insn = haystack.getFirst(); insn != null; insn = insn.getNext()) { + + switch (insn.getType()) { + + case 8: + case 15: + break; + + case 7: + JumpInsnNode jinsn = (JumpInsnNode) insn; + controlFlowLabels.add(jinsn.label); + break; + + case 11: + TableSwitchInsnNode tsinsn = (TableSwitchInsnNode) insn; + for (LabelNode label : tsinsn.labels) + controlFlowLabels.add(label); + break; + + case 12: + LookupSwitchInsnNode lsinsn = (LookupSwitchInsnNode) insn; + for (LabelNode label : lsinsn.labels) + controlFlowLabels.add(label); + break; + } + } + + LinkedList list = new LinkedList(); + + nextsection: + for (int start = 0; start <= haystack.size() - needle.size(); start++) { + InsnListSection section = insnListMatchesL(haystack, needle, start, controlFlowLabels); + + if (section != null) { + + for (InsnListSection asection : list) + if (asection.last == section.last) + continue nextsection; + + list.add(section); + } + } + + return list; + } + + // TODO: Add documentation + public static boolean insnListMatches(InsnList haystack, InsnList needle, int start) { + + if (haystack.size() - start < needle.size()) + return false; + + for (int i = 0; i < needle.size(); i++) + if (!insnEqual(haystack.get(i + start), needle.get(i))) + return false; + + return true; + } + + // TODO: Add documentation + private static InsnListSection insnListMatchesL(InsnList haystack, InsnList needle, int start, HashSet controlFlowLabels) { + + int h = start, n = 0; + + for (; h < haystack.size() && n < needle.size(); h++) { + + AbstractInsnNode insn = haystack.get(h); + + if (insn.getType() == 15) + continue; + + if (insn.getType() == 8 && !controlFlowLabels.contains(insn)) + continue; + + if (!insnEqual(haystack.get(h), needle.get(n))) + return null; + + n++; + } + + if (n != needle.size()) + return null; + + return new InsnListSection(haystack, start, h - 1); + } + + /** + * Checks if two IntInsnNodes are the same. For them to be the same, the operand for the + * instructions must be the same. They will also be considered the same, if either operand + * is -1. + * + * @param node1: The first IntInsnNode to compare. + * @param node2: The second IntInsnNode to compare. + * @return boolean: True if the instructions share the same operand, or if either operand + * is -1. + */ + public static boolean intInsnEqual(IntInsnNode node1, IntInsnNode node2) { + + return node1.operand == -1 || node2.operand == -1 || node1.operand == node2.operand; + + } + + /** + * Checks if two LdcInsnNodes are the same. For them to be the same, the constant that is + * to be loaded onto the stack must be the same. They will also be considered the same, if + * either is loading a String object of ~. + * + * @param insn1: The first LdcInsnNode to compare. + * @param insn2: The second LdcInsnNode to compare. + * @return boolean: True if the instructions are loading the same constant, or if either is + * loading "~". + */ + public static boolean ldcInsnEqual(LdcInsnNode insn1, LdcInsnNode insn2) { + + return insn1.cst.equals("~") || insn2.cst.equals("~") || insn1.cst.equals(insn2.cst); + + } + + /** + * Checks if two MethodInsnNodes are the same. For them to be considered the same, both + * instructions must share the same description, owner, and name.. + * + * @param insn1: The first MethodInsNode to compare. + * @param insn2: The second MethodInsnNode to compare. + * @return boolean: True if the instructions share the same owner, the same name, and the + * same description. + */ + public static boolean methodInsnEqual(MethodInsnNode insn1, MethodInsnNode insn2) { + + return insn1.owner.equals(insn2.owner) && insn1.name.equals(insn2.name) && insn1.desc.equals(insn2.desc); + } + + /** + * Checks if two TypeInsnNodes are the same. For them to be considered the same, both + * instructions must share the same description. They will also be considered to be the + * same, if either has a description of ~. + * + * @param insn1: The first TypeInsnNode to compare. + * @param insn2: The second TypeInsnNode to compare. + * @return boolean: True if the instructions share the same description, or if either + * description is ~. + */ + public static boolean typeInsnEqual(TypeInsnNode insn1, TypeInsnNode insn2) { + + return insn1.desc.equals("~") || insn2.desc.equals("~") || insn1.desc.equals(insn2.desc); + + } + + /** + * Checks two VarInsnNodes to see if they are the same. For them to be the same, their + * variable index must be the same. They will also be considered the same if either one has + * an index of -1. + * + * @param insn1: The first VarInsnNode to compare. + * @param insn2: The second VarInsnNode to compare. + * @return boolean: True if the instructions share the same variable index, or if either + * instruction has an index of -1. + */ + public static boolean varInsnEqual(VarInsnNode insn1, VarInsnNode insn2) { + + return insn1.var == -1 || insn2.var == -1 || insn1.var == insn2.var; + + } + + /** + * Checks if two IincInsnNodes are the same. For them to be the same, they must share the + * same local variable index, and increment by the same amount. + * + * @param node1: The first IincInsnNode to compare. + * @param node2: The second IincInsnNode to compare. + * @return boolean: True if the instructions share the same local variable index, and + * increment by the same amount. + */ + public static boolean iincInsnEqual(IincInsnNode node1, IincInsnNode node2) { + + return node1.var == node2.var && node1.incr == node2.incr; + } + + /** + * Checks if two FieldInsnNodes are the same. For them to be the same, the owner, name and + * description must be the same. + * + * @param insn1: The first instruction to compare. + * @param insn2: The second instruction to compare. + * @return boolean: True if the instructions share the same owner, name and description. + */ + public static boolean fieldInsnEqual(FieldInsnNode insn1, FieldInsnNode insn2) { + + return insn1.owner.equals(insn2.owner) && insn1.name.equals(insn2.name) && insn1.desc.equals(insn2.desc); + } + + public static class InsnListSection { + + /** + * The first instruction in a section. + */ + public AbstractInsnNode first; + + /** + * The last instruction in a section. + */ + public AbstractInsnNode last; + + /** + * Creates an object which reflects the first and last instruction within a list of + * instructions. + * + * @param haystack: The list of instructions to reflect. + * @param start: The index of the first instruction. + * @param end: The index of the last instruction. + */ + public InsnListSection(InsnList haystack, int start, int end) { + + this.first = haystack.get(start); + this.last = haystack.get(end); + } + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java b/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java new file mode 100644 index 00000000..927226c8 --- /dev/null +++ b/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java @@ -0,0 +1,53 @@ +package minefantasy.mf2.asm; + +import cpw.mods.fml.relauncher.IFMLLoadingPlugin; +import minefantasy.mf2.asm.transformers.EntityHorseTransformer; +import net.minecraft.launchwrapper.IClassTransformer; + +import java.util.Map; + +@IFMLLoadingPlugin.MCVersion("1.7.10") +public class MFLoadingPlugin implements IFMLLoadingPlugin, IClassTransformer { + + @Override + public String[] getASMTransformerClass() { + ASMHelper.isASMEnabled = true; + /* TODO + Config option for ASM patches + */ + return new String[]{this.getClass().getName()}; + } + + @Override + public String getModContainerClass() { + + return null; + } + + @Override + public String getSetupClass() { + + return null; + } + + @Override + public void injectData(Map data) { + ASMHelper.isSrg = (Boolean) data.get("runtimeDeobfuscationEnabled"); + new Mappings(); + } + + @Override + public String getAccessTransformerClass() { + + return null; + } + + @Override + public byte[] transform(String name, String transformedName, byte[] classBytes) { + if (transformedName.equals("net.minecraft.entity.passive.EntityHorse")) { + return EntityHorseTransformer.transform(name, transformedName, classBytes); + } + + return classBytes; + } +} diff --git a/src/main/java/minefantasy/mf2/asm/Mappings.java b/src/main/java/minefantasy/mf2/asm/Mappings.java new file mode 100644 index 00000000..964a7c6e --- /dev/null +++ b/src/main/java/minefantasy/mf2/asm/Mappings.java @@ -0,0 +1,79 @@ +package minefantasy.mf2.asm; + +public class Mappings { + + // Fields + public static String rand; + public static String enchantLevels; + public static String dataWatcher; + public static String stick; + public static String armorValues; + public static String isHorseSaddled; + public static String horseTextureArray; + public static String texturePrefix; + public static String iron_horse_armor; + public static String diamond_horse_armor; + public static String horseChest; + + // Methods + public static String interact; + public static String isArmorItem; + public static String entityInit; + public static String updateHorseSlots; + public static String onInventoryChanged; + public static String getTotalArmorValue; + public static String setHorseTexturePaths; + public static String getWatchableObjectItemStack; + public static String updateObject; + public static String getHorseArmorIndexSynced; + public static String getItem; + public static String playSound; + public static String isItemEqual; + public static String addObject; + public static String getStackInSlot; + public static String getUnlocalizedName; + public static String getInteger; + public static String hasKey; + public static String getTagCompound; + public static String hasTagCompound; + public static String getColorFromItemStack; + + public Mappings() { + + // Fields + rand = ASMHelper.getAppropriateMapping("rand", "field_75169_l"); + enchantLevels = ASMHelper.getAppropriateMapping("enchantLevels", "field_75167_g"); + dataWatcher = ASMHelper.getAppropriateMapping("dataWatcher", "field_70180_af"); + stick = ASMHelper.getAppropriateMapping("stick", "field_151055_y"); + armorValues = ASMHelper.getAppropriateMapping("armorValues", "field_110272_by"); + isHorseSaddled = ASMHelper.getAppropriateMapping("isHorseSaddled", "func_110257_ck"); + horseTextureArray = ASMHelper.getAppropriateMapping("field_110280_bR", "field_110280_bR"); + texturePrefix = ASMHelper.getAppropriateMapping("field_110286_bQ", "field_110286_bQ"); + iron_horse_armor = ASMHelper.getAppropriateMapping("iron_horse_armor", "field_151138_bX"); + diamond_horse_armor = ASMHelper.getAppropriateMapping("diamond_horse_armor", "field_151125_bZ"); + horseChest = ASMHelper.getAppropriateMapping("horseChest", "field_110296_bG"); + + // Methods + interact = ASMHelper.getAppropriateMapping("interact", "func_70085_c"); + isArmorItem = ASMHelper.getAppropriateMapping("func_146085_a", "func_146085_a"); + entityInit = ASMHelper.getAppropriateMapping("entityInit", "func_70088_a"); + updateHorseSlots = ASMHelper.getAppropriateMapping("func_110232_cE", "func_110232_cE"); + onInventoryChanged = ASMHelper.getAppropriateMapping("onInventoryChanged", "func_76316_a"); + getTotalArmorValue = ASMHelper.getAppropriateMapping("getTotalArmorValue", "func_70658_aO"); + setHorseTexturePaths = ASMHelper.getAppropriateMapping("setHorseTexturePaths", "func_110247_cG"); + getWatchableObjectItemStack = ASMHelper.getAppropriateMapping("getWatchableObjectItemStack", "func_82710_f"); + updateObject = ASMHelper.getAppropriateMapping("updateObject", "func_75692_b"); + getHorseArmorIndexSynced = ASMHelper.getAppropriateMapping("func_110241_cb", "func_110241_cb"); + getItem = ASMHelper.getAppropriateMapping("getItem", "func_77973_b"); + playSound = ASMHelper.getAppropriateMapping("playSound", "func_85030_a"); + isItemEqual = ASMHelper.getAppropriateMapping("isItemEqual", "func_77969_a"); + addObject = ASMHelper.getAppropriateMapping("addObject", "func_75682_a"); + getStackInSlot = ASMHelper.getAppropriateMapping("getStackInSlot", "func_70301_a"); + getUnlocalizedName = ASMHelper.getAppropriateMapping("getUnlocalizedName", "func_77977_a"); + getInteger = ASMHelper.getAppropriateMapping("getInteger", "func_74762_e"); + hasKey = ASMHelper.getAppropriateMapping("hasKey", "func_74764_b"); + getTagCompound = ASMHelper.getAppropriateMapping("getTagCompound", "func_77978_p"); + hasTagCompound = ASMHelper.getAppropriateMapping("hasTagCompound", "func_77942_o"); + getColorFromItemStack = ASMHelper.getAppropriateMapping("getColorFromItemStack", "func_82790_a"); + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java b/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java new file mode 100644 index 00000000..1ca2fa0a --- /dev/null +++ b/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java @@ -0,0 +1,361 @@ +/* Based on @SanAndreasP code */ + +package minefantasy.mf2.asm.transformers; + +import minefantasy.mf2.asm.ASMHelper; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Label; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.*; + +import static minefantasy.mf2.asm.Mappings.*; + +public class EntityHorseTransformer { + + public static byte[] transform(String name, String transformedName, byte[] bytes) { + + ClassNode horseClass = ASMHelper.createClassFromByteArray(bytes); + + injectGetCustomBookshelfArmor(horseClass); + injectSetCustomBoookhelfArmor(horseClass); + transformGetTotalArmorValue(ASMHelper.getMethodFromClass(horseClass, getTotalArmorValue, "()I")); + transformOnInventoryChanged(ASMHelper.getMethodFromClass(horseClass, onInventoryChanged, "(Lnet/minecraft/inventory/InventoryBasic;)V")); + transformUpdateHorseSlots(ASMHelper.getMethodFromClass(horseClass, updateHorseSlots, "()V")); + transformEntityInit(ASMHelper.getMethodFromClass(horseClass, entityInit, "()V")); + transformIsValidArmor(ASMHelper.getMethodFromClass(horseClass, isArmorItem, "(Lnet/minecraft/item/Item;)Z")); + + if (ASMHelper.hasClassMethodName(horseClass, setHorseTexturePaths)) + transformSetHorseTexturePaths(ASMHelper.getMethodFromClass(horseClass, setHorseTexturePaths, "()V")); + + return ASMHelper.createByteArrayFromClass(horseClass, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); + } + + /** + * Injects a new method into the EntityHorse class. This new method allows for the + * retrieval of a custom armor item that is stored on bit 23 of the DataWatcher. + * + * @param horseClass: A ClassNode representation of the EntityHorse class. + */ + private static void injectGetCustomBookshelfArmor(ClassNode horseClass) { + + MethodNode newMethod = new MethodNode(Opcodes.ACC_PRIVATE, "getCustomBookshelfArmor", "()Lnet/minecraft/item/ItemStack;", null, null); + newMethod.visitCode(); + + Label l0 = new Label(); + newMethod.visitLabel(l0); + newMethod.visitVarInsn(Opcodes.ALOAD, 0); + newMethod.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", dataWatcher, "Lnet/minecraft/entity/DataWatcher;"); + newMethod.visitIntInsn(Opcodes.BIPUSH, 23); + newMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/DataWatcher", getWatchableObjectItemStack, "(I)Lnet/minecraft/item/ItemStack;", false); + newMethod.visitInsn(Opcodes.ARETURN); + + Label l1 = new Label(); + newMethod.visitLabel(l1); + newMethod.visitLocalVariable("this", "Lnet/minecraft/entity/passive/EntityHorse;", null, l0, l1, 0); + newMethod.visitMaxs(2, 1); + newMethod.visitEnd(); + + horseClass.methods.add(newMethod); + } + + /** + * Injects a new method into the EntityHorse class. This new method allows for the setting + * of a custom armor item which is stored on bit 23 of the DataWatcher. + * + * @param horseClass: A ClassNode representation of the EntityHorse class. + */ + private static void injectSetCustomBoookhelfArmor(ClassNode horseClass) { + + MethodNode newMethod = new MethodNode(Opcodes.ACC_PRIVATE, "setCustomBookshelfArmor", "(Lnet/minecraft/item/ItemStack;)V", null, null); + newMethod.visitCode(); + + Label l0 = new Label(); + newMethod.visitLabel(l0); + newMethod.visitVarInsn(Opcodes.ALOAD, 1); + + Label l1 = new Label(); + newMethod.visitJumpInsn(Opcodes.IFNONNULL, l1); + newMethod.visitTypeInsn(Opcodes.NEW, "net/minecraft/item/ItemStack"); + newMethod.visitInsn(Opcodes.DUP); + newMethod.visitFieldInsn(Opcodes.GETSTATIC, "net/minecraft/init/Items", stick, "Lnet/minecraft/item/Item;"); + newMethod.visitInsn(Opcodes.ICONST_0); + newMethod.visitMethodInsn(Opcodes.INVOKESPECIAL, "net/minecraft/item/ItemStack", "", "(Lnet/minecraft/item/Item;I)V", false); + newMethod.visitVarInsn(Opcodes.ASTORE, 1); + newMethod.visitLabel(l1); + newMethod.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + newMethod.visitVarInsn(Opcodes.ALOAD, 0); + newMethod.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", dataWatcher, "Lnet/minecraft/entity/DataWatcher;"); + newMethod.visitIntInsn(Opcodes.BIPUSH, 23); + newMethod.visitVarInsn(Opcodes.ALOAD, 1); + newMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/DataWatcher", updateObject, "(ILjava/lang/Object;)V", false); + + Label l3 = new Label(); + newMethod.visitLabel(l3); + newMethod.visitInsn(Opcodes.RETURN); + + Label l4 = new Label(); + newMethod.visitLabel(l4); + newMethod.visitLocalVariable("this", "Lnet/minecraft/entity/passive/EntityHorse;", null, l0, l3, 0); + newMethod.visitLocalVariable("stack", "Lnet/minecraft/item/ItemStack;", null, l0, l3, 1); + newMethod.visitMaxs(5, 2); + newMethod.visitEnd(); + + horseClass.methods.add(newMethod); + } + + /** + * Transforms the getTotalArmorValue method to take custom armor items into consideration. + * This is done by checking if the item stored within he 23rd bit of the data watcher is an + * instance of Bookshelf's implementation of ItemHorseArmor, if it is, the value returned + * by the item's getArmorValue method will be returned by this method. + * + * @param method: Instance of a MethodNode representation of the getTotalArmorValue method. + */ + private static void transformGetTotalArmorValue(MethodNode method) { + + InsnList newInstr = new InsnList(); + + newInstr.add(new LabelNode()); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/passive/EntityHorse", "getCustomBookshelfArmor", "()Lnet/minecraft/item/ItemStack;", false)); + newInstr.add(new VarInsnNode(Opcodes.ASTORE, 1)); + newInstr.add(new LabelNode()); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 1)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getItem, "()Lnet/minecraft/item/Item;", false)); + newInstr.add(new TypeInsnNode(Opcodes.INSTANCEOF, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase")); + + LabelNode l2 = new LabelNode(); + newInstr.add(new JumpInsnNode(Opcodes.IFEQ, l2)); + newInstr.add(new LabelNode()); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 1)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getItem, "()Lnet/minecraft/item/Item;", false)); + newInstr.add(new TypeInsnNode(Opcodes.CHECKCAST, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase")); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 1)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase", "getArmorValue", "(Lnet/minecraft/entity/passive/EntityHorse;Lnet/minecraft/item/ItemStack;)I", false)); + newInstr.add(new InsnNode(Opcodes.IRETURN)); + newInstr.add(l2); + + method.instructions.insertBefore(method.instructions.getFirst(), newInstr); + } + + /** + * Transforms the onInventoryChanged method to take custom armor items into consideration + * when updating the inventory. + * + * @param method: Instance of a MethodNode representation of the onInventoryChanged method. + */ + private static void transformOnInventoryChanged(MethodNode method) { + + InsnList needle = new InsnList(); + needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); + needle.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/passive/EntityHorse", isHorseSaddled, "()Z", false)); + needle.add(new VarInsnNode(Opcodes.ISTORE, 3)); + + AbstractInsnNode pointer = ASMHelper.findLastNodeFromNeedle(method.instructions, needle); + + InsnList newInstr = new InsnList(); + + newInstr.add(new LabelNode()); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/passive/EntityHorse", "getCustomBookshelfArmor", "()Lnet/minecraft/item/ItemStack;", false)); + newInstr.add(new VarInsnNode(Opcodes.ASTORE, 4)); + + method.instructions.insert(pointer, newInstr); + + needle = new InsnList(); + needle.add(new LdcInsnNode("mob.horse.armor")); + needle.add(new LdcInsnNode(new Float("0.5"))); + needle.add(new InsnNode(Opcodes.FCONST_1)); + needle.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/passive/EntityHorse", playSound, "(Ljava/lang/String;FF)V", false)); + needle.add(new LabelNode()); + + pointer = ASMHelper.findLastNodeFromNeedle(method.instructions, needle); + + newInstr = new InsnList(); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getItem, "()Lnet/minecraft/item/Item;", false)); + newInstr.add(new FieldInsnNode(Opcodes.GETSTATIC, "net/minecraft/init/Items", stick, "Lnet/minecraft/item/Item;")); + + LabelNode l9 = new LabelNode(); + newInstr.add(new JumpInsnNode(Opcodes.IF_ACMPNE, l9)); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/passive/EntityHorse", "getCustomBookshelfArmor", "()Lnet/minecraft/item/ItemStack;", false)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", isItemEqual, "(Lnet/minecraft/item/ItemStack;)Z", false)); + newInstr.add(new JumpInsnNode(Opcodes.IFNE, l9)); + + newInstr.add(new LabelNode()); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new LdcInsnNode("mob.horse.armor")); + newInstr.add(new LdcInsnNode(new Float("0.5"))); + newInstr.add(new InsnNode(Opcodes.FCONST_1)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/passive/EntityHorse", playSound, "(Ljava/lang/String;FF)V", false)); + newInstr.add(l9); + + method.instructions.insert(pointer, newInstr); + } + + /** + * Transforms the setHorseTexturePaths method to take our custom armor item into + * consideration. If the horse has a custom armor item in it's inventory and that item is + * an instance of our ItemHorseArmor implementation, the item's getArmorTexture method will + * me used for the armor texture path. + * + * @param method: Instance of a MethodNode representation of the setHorseTexturePaths + * method. + */ + private static void transformSetHorseTexturePaths(MethodNode method) { + + InsnList needle = new InsnList(); + needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); + needle.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/passive/EntityHorse", getHorseArmorIndexSynced, "()I", false)); + needle.add(new VarInsnNode(Opcodes.ISTORE, 3)); + + AbstractInsnNode node = ASMHelper.findLastNodeFromNeedle(method.instructions, needle); + + InsnList newInstr = new InsnList(); + + LabelNode l17 = new LabelNode(); + newInstr.add(l17); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/passive/EntityHorse", "getCustomBookshelfArmor", "()Lnet/minecraft/item/ItemStack;", false)); + newInstr.add(new VarInsnNode(Opcodes.ASTORE, 4)); + + LabelNode l18 = new LabelNode(); + newInstr.add(l18); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getItem, "()Lnet/minecraft/item/Item;", false)); + newInstr.add(new TypeInsnNode(Opcodes.INSTANCEOF, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase")); + + LabelNode l19 = new LabelNode(); + newInstr.add(new JumpInsnNode(Opcodes.IFEQ, l19)); + + LabelNode l20 = new LabelNode(); + newInstr.add(l20); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", horseTextureArray, "[Ljava/lang/String;")); + newInstr.add(new InsnNode(Opcodes.ICONST_2)); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getItem, "()Lnet/minecraft/item/Item;", false)); + newInstr.add(new TypeInsnNode(Opcodes.CHECKCAST, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase")); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase", "getArmorTexture", "(Lnet/minecraft/entity/passive/EntityHorse;Lnet/minecraft/item/ItemStack;)Ljava/lang/String;", false)); + newInstr.add(new InsnNode(Opcodes.AASTORE)); + + LabelNode l21 = new LabelNode(); + newInstr.add(l21); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new TypeInsnNode(Opcodes.NEW, "java/lang/StringBuilder")); + newInstr.add(new InsnNode(Opcodes.DUP)); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", texturePrefix, "Ljava/lang/String;")); + newInstr.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/lang/String", "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;", false)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "", "(Ljava/lang/String;)V", false)); + newInstr.add(new LdcInsnNode("cst-")); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false)); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getUnlocalizedName, "()Ljava/lang/String;", false)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false)); + newInstr.add(new FieldInsnNode(Opcodes.PUTFIELD, "net/minecraft/entity/passive/EntityHorse", texturePrefix, "Ljava/lang/String;")); + newInstr.add(new InsnNode(Opcodes.RETURN)); + newInstr.add(l19); + + method.instructions.insert(node, newInstr); + } + + /** + * Transforms the updateHorseSlots method to take custom armor items into consideration. + * When an item is set to the armor slot, it will also be stored under our data bit in the + * data watcher. + * + * @param method: Instance of a MethodNode representation of the updateHorseSlots method. + */ + private static void transformUpdateHorseSlots(MethodNode method) { + + InsnList needle = new InsnList(); + needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); + needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); + needle.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", horseChest, "Lnet/minecraft/inventory/AnimalChest;")); + needle.add(new InsnNode(Opcodes.ICONST_1)); + + AbstractInsnNode pointer = ASMHelper.findFirstNodeFromNeedle(method.instructions, needle); + + InsnList newInstr = new InsnList(); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", horseChest, "Lnet/minecraft/inventory/AnimalChest;")); + newInstr.add(new InsnNode(Opcodes.ICONST_1)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/inventory/AnimalChest", getStackInSlot, "(I)Lnet/minecraft/item/ItemStack;", false)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/passive/EntityHorse", "setCustomBookshelfArmor", "(Lnet/minecraft/item/ItemStack;)V", false)); + newInstr.add(new LabelNode()); + + method.instructions.insertBefore(pointer, newInstr); + } + + /** + * Transforms the entityInit method to designate the 23rd bit within the DataWatcher to + * store an ItemStack. This storage is used by our custom methods. + * + * @param method: Instance of a MethodNode representation of the entityInit method. + */ + private static void transformEntityInit(MethodNode method) { + + InsnList needle = new InsnList(); + needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); + needle.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", dataWatcher, "Lnet/minecraft/entity/DataWatcher;")); + needle.add(new IntInsnNode(Opcodes.BIPUSH, 22)); + needle.add(new InsnNode(Opcodes.ICONST_0)); + needle.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false)); + needle.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/DataWatcher", addObject, "(ILjava/lang/Object;)V", false)); + + AbstractInsnNode pointer = ASMHelper.findLastNodeFromNeedle(method.instructions, needle); + + InsnList newInstr = new InsnList(); + newInstr.add(new LabelNode()); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", dataWatcher, "Lnet/minecraft/entity/DataWatcher;")); + newInstr.add(new IntInsnNode(Opcodes.BIPUSH, 23)); + newInstr.add(new TypeInsnNode(Opcodes.NEW, "net/minecraft/item/ItemStack")); + newInstr.add(new InsnNode(Opcodes.DUP)); + newInstr.add(new FieldInsnNode(Opcodes.GETSTATIC, "net/minecraft/init/Items", stick, "Lnet/minecraft/item/Item;")); + newInstr.add(new InsnNode(Opcodes.ICONST_0)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/item/ItemStack", "", "(Lnet/minecraft/item/Item;I)V", false)); + newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/DataWatcher", addObject, "(ILjava/lang/Object;)V", false)); + + method.instructions.insert(pointer, newInstr); + } + + /** + * Transforms the isValidArmor method to accept items which use our implementation of + * ItemHorseArmor as a valid horse armor item. + * + * @param method: Instance of a MethodNode representation of the isValidArmor method. + */ + private static void transformIsValidArmor(MethodNode method) { + + InsnList needle = new InsnList(); + needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); + needle.add(new FieldInsnNode(Opcodes.GETSTATIC, "net/minecraft/init/Items", iron_horse_armor, "Lnet/minecraft/item/Item;")); + needle.add(new JumpInsnNode(Opcodes.IF_ACMPEQ, new LabelNode())); + + AbstractInsnNode node = ASMHelper.findFirstNodeFromNeedle(method.instructions, needle); + + InsnList newInstr = new InsnList(); + newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); + newInstr.add(new TypeInsnNode(Opcodes.INSTANCEOF, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase")); + + LabelNode ln = new LabelNode(); + newInstr.add(new JumpInsnNode(Opcodes.IFEQ, ln)); + newInstr.add(new LabelNode()); + newInstr.add(new InsnNode(Opcodes.ICONST_1)); + newInstr.add(new InsnNode(Opcodes.IRETURN)); + newInstr.add(ln); + + newInstr.add(new FrameNode(Opcodes.F_SAME, 0, null, 0, null)); + + method.instructions.insertBefore(node, newInstr); + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java new file mode 100644 index 00000000..1b3cdc71 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java @@ -0,0 +1,8 @@ +package minefantasy.mf2.item.armour; + +import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; + + +public class ItemHorseArmorMF { + +} From 5a49ec25e699965e8f8ed60bb87729961f4774b7 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 16 Sep 2017 00:23:11 +0700 Subject: [PATCH 063/101] More work under horses armor --- .../mf2/api/armour/ItemHorseArmorMFBase.java | 8 ++- .../mf2/item/armour/ItemHorseArmorMF.java | 53 ++++++++++++++++++- .../mf2/mechanics/CombatMechanics.java | 14 +++++ .../mf2/mechanics/EventManagerMF.java | 47 ++++++++++++++-- 4 files changed, 113 insertions(+), 9 deletions(-) diff --git a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java index e5ccda3e..cd1d003d 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java +++ b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java @@ -1,16 +1,14 @@ package minefantasy.mf2.api.armour; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.passive.EntityHorse; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; - import net.minecraftforge.client.event.RenderLivingEvent; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public abstract class ItemHorseArmorMFBase extends Item implements ISpecialArmourMF { +public abstract class ItemHorseArmorMFBase extends Item { /** * Used to calculate the amount of protection this item should provide the horse with. diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java index 1b3cdc71..dca484a5 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java @@ -1,8 +1,59 @@ package minefantasy.mf2.item.armour; +import cpw.mods.fml.common.registry.GameRegistry; +import minefantasy.mf2.MineFantasyII; +import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; +import minefantasy.mf2.item.list.CreativeTabMF; +import minefantasy.mf2.material.BaseMaterialMF; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraftforge.client.event.RenderLivingEvent; -public class ItemHorseArmorMF { +public class ItemHorseArmorMF extends ItemHorseArmorMFBase { + private String name; + protected BaseMaterialMF baseMaterial; + private ArmourDesign armourDesign; + private String itemTexture; + private int itemRarity; + + + public ItemHorseArmorMF(String name, BaseMaterialMF material, ArmourDesign design, String texture, int rarity) { + this.name = name; + baseMaterial = material; + armourDesign = design; + itemTexture = texture; + itemRarity = rarity; + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + setCreativeTab(CreativeTabMF.tabArmour); + } + + @Override + public int getArmorValue(EntityHorse horse, ItemStack stack) { + return 0; + } + + @Override + public void onHorseUpdate(EntityHorse horse, ItemStack stack) { + System.out.println("UPDATE MY HORSE!"); + } + + @Override + public boolean onHorseDamaged(EntityHorse horse, ItemStack stack, DamageSource source, float damage) { + damage = 0F; + return false; + } + + @Override + public String getArmorTexture(EntityHorse horse, ItemStack stack) { + return itemTexture; + } + + @Override + public void onHorseRendered(EntityHorse horse, ItemStack armorStack, RenderLivingEvent event, byte flag) { + + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java index 88730c83..f62760ce 100644 --- a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java +++ b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java @@ -3,6 +3,7 @@ import cpw.mods.fml.common.eventhandler.SubscribeEvent; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.armour.IElementalResistance; +import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; import minefantasy.mf2.api.helpers.*; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.api.material.CustomMaterial; @@ -30,6 +31,7 @@ import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.monster.EntitySkeleton; import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.passive.EntityHorse; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.init.Items; @@ -129,6 +131,7 @@ private EntityLivingBase getHitter(DamageSource source) { public void onHit(LivingHurtEvent event) { DamageSource src = event.source; EntityLivingBase hit = event.entityLiving; + if (src != null && src == DamageSource.fall) { onFall(hit, event.ammount); } @@ -173,6 +176,17 @@ public void onHit(LivingHurtEvent event) { } } event.ammount = damage; + + //Horses has own damage watcher + if (hit instanceof EntityHorse) { + EntityHorse horse = (EntityHorse) event.entity; + ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); + + if (customArmor != null && customArmor.getItem() instanceof ItemHorseArmorMFBase) { + ItemHorseArmorMFBase armor = (ItemHorseArmorMFBase) customArmor.getItem(); + event.setCanceled(armor.onHorseDamaged(horse, customArmor, event.source, event.ammount)); + } + } } private void onFall(EntityLivingBase fallen, float height) { diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index 389bf8ac..a2a4c1e9 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -11,6 +11,7 @@ import minefantasy.mf2.api.armour.IPowerArmour; import minefantasy.mf2.api.armour.ISpecialArmourMF; import minefantasy.mf2.api.armour.ItemArmourMFBase; +import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; import minefantasy.mf2.api.heating.IHotItem; import minefantasy.mf2.api.heating.TongsHelper; import minefantasy.mf2.api.helpers.ArmourCalculator; @@ -29,6 +30,7 @@ import minefantasy.mf2.api.tool.IHuntingItem; import minefantasy.mf2.api.tool.ISmithTongs; import minefantasy.mf2.api.weapon.WeaponClass; +import minefantasy.mf2.asm.ASMHelper; import minefantasy.mf2.client.render.RenderPowerArmour; import minefantasy.mf2.config.ConfigExperiment; import minefantasy.mf2.config.ConfigHardcore; @@ -38,6 +40,7 @@ import minefantasy.mf2.entity.mob.EntityDragon; import minefantasy.mf2.farming.FarmingHelper; import minefantasy.mf2.item.ClientItemsMF; +import minefantasy.mf2.item.armour.ItemHorseArmorMF; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.ToolListMF; @@ -102,7 +105,6 @@ import net.minecraftforge.event.entity.player.UseHoeEvent; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.event.world.BlockEvent.BreakEvent; -import net.minecraftforge.event.world.ChunkEvent; import net.minecraftforge.oredict.OreDictionary; public class EventManagerMF { @@ -740,6 +742,16 @@ public void updateEntity(LivingUpdateEvent event) { return; } EntityLivingBase entity = event.entityLiving; + + if (ASMHelper.isASMEnabled && entity instanceof EntityHorse) { + EntityHorse horse = (EntityHorse) entity; + ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); + if (customArmor != null && customArmor.getItem() instanceof ItemHorseArmorMF) { + ItemHorseArmorMF armor = (ItemHorseArmorMF) customArmor.getItem(); + armor.onHorseUpdate(horse, customArmor); + } + } + float lowHp = entity.getMaxHealth() / 5F; int injury = getInjuredTime(entity); @@ -771,8 +783,8 @@ public void updateEntity(LivingUpdateEvent event) { } tickHitSpeeds(event.entityLiving); - if (event.entity.ticksExisted == 1 && event.entity instanceof EntityPlayer && !event.entity.worldObj.isRemote) { - } + /*if (event.entity.ticksExisted == 1 && event.entity instanceof EntityPlayer && !event.entity.worldObj.isRemote) { + }*/ } @@ -938,5 +950,34 @@ public void renderEntity(RenderLivingEvent.Pre event) { } } } + triggerHorseRenderHook(event, (byte) 0); + } + + @SubscribeEvent + public void renderEntity (RenderLivingEvent.Post event) { + triggerHorseRenderHook(event, (byte) 1); + } + + @SubscribeEvent + public void renderEntity (RenderLivingEvent.Specials.Pre event) { + triggerHorseRenderHook(event, (byte) 2); + } + + @SubscribeEvent + public void renderEntity (RenderLivingEvent.Specials.Post event) { + triggerHorseRenderHook(event, (byte) 3); + } + + public void triggerHorseRenderHook(RenderLivingEvent event, byte flag) { + if(ASMHelper.isASMEnabled && event.entity instanceof EntityHorse) { + EntityHorse horse = (EntityHorse) event.entity; + ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); + + if (customArmor != null && customArmor.getItem() instanceof ItemHorseArmorMFBase) { + + ItemHorseArmorMFBase armor = (ItemHorseArmorMFBase) customArmor.getItem(); + armor.onHorseRendered(horse, customArmor, event, flag); + } + } } } From 37c8189b721cac445c05207cb63e940c5e4c5975 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 16 Sep 2017 00:48:52 +0700 Subject: [PATCH 064/101] Implemented basic horse armor item I'm looking for somebody, how can draw custom MF styled textures and models for horse armor --- .../mf2/api/armour/ItemHorseArmorMFBase.java | 33 ++++++++++++--- .../mf2/item/armour/ItemHorseArmorMF.java | 41 ++----------------- .../mf2/item/list/CustomArmourListMF.java | 5 +++ 3 files changed, 36 insertions(+), 43 deletions(-) diff --git a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java index cd1d003d..2a2131b6 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java +++ b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java @@ -8,7 +8,18 @@ import net.minecraft.util.DamageSource; import net.minecraftforge.client.event.RenderLivingEvent; -public abstract class ItemHorseArmorMFBase extends Item { +public class ItemHorseArmorMFBase extends Item { + + public ArmourMaterialMF armorMaterial; + public ArmourDesign armorDesign; + public String armorTexture; + + public ItemHorseArmorMFBase(String name, ArmourMaterialMF material, ArmourDesign design, String texture) { + this.setUnlocalizedName(name); + armorMaterial = material; + armorDesign = design; + armorTexture = texture; + } /** * Used to calculate the amount of protection this item should provide the horse with. @@ -18,7 +29,9 @@ public abstract class ItemHorseArmorMFBase extends Item { * @return int: An integer based representation of the armor points which should be given * to a horse by this armor item. */ - public abstract int getArmorValue (EntityHorse horse, ItemStack stack); + public int getArmorValue (EntityHorse horse, ItemStack stack) { + return 0; + } /** * Called every time an EntityHorse updates while wearing this piece of armor. Allows for @@ -27,7 +40,9 @@ public abstract class ItemHorseArmorMFBase extends Item { * @param horse: An instance of the horse which is currently wearing this piece of armor. * @param stack: An instance of the ItemStack currently in the horse's armor slot. */ - public abstract void onHorseUpdate (EntityHorse horse, ItemStack stack); + public void onHorseUpdate (EntityHorse horse, ItemStack stack) { + + } /** * Called when a horse wearing this piece of armor has been hurt. @@ -38,7 +53,9 @@ public abstract class ItemHorseArmorMFBase extends Item { * @param damage: The amount of damage that the horse received. * @return boolean: If true, the horse will not be hurt and the event will be canceled. */ - public abstract boolean onHorseDamaged (EntityHorse horse, ItemStack stack, DamageSource source, float damage); + public boolean onHorseDamaged (EntityHorse horse, ItemStack stack, DamageSource source, float damage) { + return true; + } /** * Used to provide a resource path for the armor's texture. Textures follow the same rules @@ -51,7 +68,9 @@ public abstract class ItemHorseArmorMFBase extends Item { * EG: testmod:textures/entity/horse/armor/horse_armor_test.png */ @SideOnly(Side.CLIENT) - public abstract String getArmorTexture (EntityHorse horse, ItemStack stack); + public String getArmorTexture (EntityHorse horse, ItemStack stack) { + return armorTexture; + } /** * Allows for special rendering code to be done, when a horse is rendered with this piece @@ -64,6 +83,8 @@ public abstract class ItemHorseArmorMFBase extends Item { * render events. 0:pre 1:post 2:special-pre 3:special-post */ @SideOnly(Side.CLIENT) - public abstract void onHorseRendered (EntityHorse horse, ItemStack armorStack, RenderLivingEvent event, byte flag); + public void onHorseRendered (EntityHorse horse, ItemStack armorStack, RenderLivingEvent event, byte flag) { + + } } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java index dca484a5..b83f4a0a 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java @@ -6,54 +6,21 @@ import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.material.BaseMaterialMF; -import net.minecraft.entity.passive.EntityHorse; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraftforge.client.event.RenderLivingEvent; - public class ItemHorseArmorMF extends ItemHorseArmorMFBase { private String name; protected BaseMaterialMF baseMaterial; private ArmourDesign armourDesign; - private String itemTexture; private int itemRarity; public ItemHorseArmorMF(String name, BaseMaterialMF material, ArmourDesign design, String texture, int rarity) { - this.name = name; + super(name, material.getArmourConversion(), design, texture); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setCreativeTab(CreativeTabMF.tabArmour); + this.setTextureName("minefantasy2:apparel/horse/" + design.getName().toLowerCase() + "/" + name); baseMaterial = material; - armourDesign = design; - itemTexture = texture; itemRarity = rarity; - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - setCreativeTab(CreativeTabMF.tabArmour); - } - - @Override - public int getArmorValue(EntityHorse horse, ItemStack stack) { - return 0; - } - - @Override - public void onHorseUpdate(EntityHorse horse, ItemStack stack) { - System.out.println("UPDATE MY HORSE!"); - } - - @Override - public boolean onHorseDamaged(EntityHorse horse, ItemStack stack, DamageSource source, float damage) { - damage = 0F; - return false; - } - - @Override - public String getArmorTexture(EntityHorse horse, ItemStack stack) { - return itemTexture; - } - - @Override - public void onHorseRendered(EntityHorse horse, ItemStack armorStack, RenderLivingEvent event, byte flag) { - } } diff --git a/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java b/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java index 1026defe..46b8ba73 100644 --- a/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java @@ -3,6 +3,8 @@ import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.item.armour.ItemArmourMF; import minefantasy.mf2.item.armour.ItemCustomArmour; +import minefantasy.mf2.item.armour.ItemHorseArmorMF; +import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.creativetab.CreativeTabs; public class CustomArmourListMF { @@ -12,6 +14,8 @@ public class CustomArmourListMF { standard_splint_boots; public static ItemArmourMF standard_plate_helmet, standard_plate_chest, standard_plate_legs, standard_plate_boots; + public static ItemHorseArmorMF standart_horse_armor; + public static void load() { String design = "standard"; CreativeTabs tab = CreativeTabMF.tabArmour; @@ -51,5 +55,6 @@ public static void load() { standard_plate_boots = (ItemArmourMF) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, "plate_layer_1", 0).setCreativeTab(tab); + standart_horse_armor = new ItemHorseArmorMF("horse_armor", BaseMaterialMF.getMaterial("steel"), ArmourDesign.FIELDPLATE, "", 0); } } From e2fe98140c1d9d956c01cde027e09c24cf45ec29 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 17 Sep 2017 22:22:38 +0700 Subject: [PATCH 065/101] Move workdir --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 81ec5f14..96b742a4 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ archivesBaseName = "MineFantasyII" minecraft { version = "1.7.10-10.13.4.1614-1.7.10" - runDir = "eclipse" + runDir = "run" } idea { module { inheritOutputDirs = true } } From 00a4f39cc468b39ca59459d06f9a135e3590d98c Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 22 Sep 2017 18:12:03 +0700 Subject: [PATCH 066/101] Travis CI, gitignore fix --- .gitignore | 1 + .travis.yml | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 .travis.yml diff --git a/.gitignore b/.gitignore index b59cc83c..e4d0bcf0 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ local.properties .settings/ .loadpath /eclipse +/run # Eclipse Core .project diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..b3e9ac54 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,24 @@ +sudo: required +dist: trusty + +language: java +jdk: oraclejdk8 + +before_cache: + - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock + - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ + - rm -f $HOME/.gradle/caches/minecraft/deobfedDeps/providedDummy.jar + - rm -f $HOME/.gradle/caches/minecraft/deobfedDeps/compileDummy.jar +cache: + directories: + - $HOME/.gradle/caches/ + - $HOME/.gradle/wrapper/ + +before_install: chmod +x gradlew +install: + - ./gradlew setupCIWorkspace -S +script: + - ./gradlew build + +notifications: + email: false \ No newline at end of file From 2e98ef1f49cfe724a3d04a52a3570bdba91e09a9 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 22 Sep 2017 18:16:29 +0700 Subject: [PATCH 067/101] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b7370e5..c999a9b8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# MineFantasy2 Unofficial +# MineFantasy2 Unofficial ![Travis CI](https://travis-ci.org/Sirse/MineFantasyII-Cont.svg?branch=master) Unofficial MineFantasy 2 fork aimed for cross-mod integration, bug fixes, stability and perfomance tweaks. From 1f962ca829f5bd2be54ed5f2b085c149eb4ad17e Mon Sep 17 00:00:00 2001 From: Sirse Date: Mon, 25 Sep 2017 17:29:53 +0700 Subject: [PATCH 068/101] Unfinished stuff Unfinished horse armor (need to patch horse renderer and add materials support). Small refactoring Fixed anvil logic, ornate design should be avaliable now (crafting requires testing, may contain bugs) --- .../mf2/api/armour/ItemHorseArmorMFBase.java | 27 +- .../java/minefantasy/mf2/asm/ASMHelper.java | 35 - .../mf2/asm/InstructionComparator.java | 25 - .../transformers/EntityHorseTransformer.java | 2 +- .../block/tileentity/TileEntityAnvilMF.java | 1718 ++++++++--------- .../tileentity/TileEntityBigFurnace.java | 2 +- .../block/tileentity/TileEntityBloomery.java | 2 +- .../block/tileentity/TileEntityBombBench.java | 2 +- .../tileentity/TileEntityCarpenterMF.java | 2 +- .../block/tileentity/TileEntityComponent.java | 2 +- .../tileentity/TileEntityCrossbowBench.java | 2 +- .../mf2/block/tileentity/TileEntityForge.java | 2 +- .../block/tileentity/TileEntityResearch.java | 2 +- .../mf2/block/tileentity/TileEntityRoad.java | 2 +- .../mf2/block/tileentity/TileEntityRoast.java | 2 +- .../tileentity/decor/TileEntityAmmoBox.java | 2 +- .../tileentity/decor/TileEntityRack.java | 2 +- .../tileentity/decor/TileEntityTrough.java | 2 +- .../tileentity/decor/TileEntityWoodDecor.java | 2 +- .../client/render/mob/RenderVanillaHorse.java | 16 + .../mf2/item/armour/ItemArmourMF.java | 2 +- .../mf2/item/armour/ItemHorseArmorMF.java | 84 +- .../mf2/item/list/CreativeTabMF.java | 122 +- .../mf2/item/list/CustomArmourListMF.java | 4 +- .../mf2/mechanics/EventManagerMF.java | 1 - .../mf2/{util => network}/NetworkUtils.java | 2 +- .../animal/horse/armor/horse_armor_main.png | Bin 0 -> 15103 bytes .../horse/armor/horse_armor_overlay.png | Bin 0 -> 15028 bytes .../horse/armor/horse_armor_saddlecloth.png | Bin 0 -> 15064 bytes .../horse/armor/standard_plate_layer_1.png | Bin 0 -> 2482 bytes 30 files changed, 1054 insertions(+), 1012 deletions(-) create mode 100644 src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java rename src/main/java/minefantasy/mf2/{util => network}/NetworkUtils.java (98%) create mode 100644 src/main/resources/assets/minefantasy2/textures/items/animal/horse/armor/horse_armor_main.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/animal/horse/armor/horse_armor_overlay.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/animal/horse/armor/horse_armor_saddlecloth.png create mode 100644 src/main/resources/assets/minefantasy2/textures/models/animal/horse/armor/standard_plate_layer_1.png diff --git a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java index 2a2131b6..c61de370 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java +++ b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java @@ -2,11 +2,14 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.api.material.CustomMaterial; import net.minecraft.entity.passive.EntityHorse; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraftforge.client.event.RenderLivingEvent; +import org.lwjgl.opengl.GL11; public class ItemHorseArmorMFBase extends Item { @@ -19,6 +22,9 @@ public ItemHorseArmorMFBase(String name, ArmourMaterialMF material, ArmourDesign armorMaterial = material; armorDesign = design; armorTexture = texture; + + float baseDura = material.durability * design.getDurability() / 2F; + this.setMaxDamage((int) baseDura); } /** @@ -40,9 +46,7 @@ public int getArmorValue (EntityHorse horse, ItemStack stack) { * @param horse: An instance of the horse which is currently wearing this piece of armor. * @param stack: An instance of the ItemStack currently in the horse's armor slot. */ - public void onHorseUpdate (EntityHorse horse, ItemStack stack) { - - } + public void onHorseUpdate (EntityHorse horse, ItemStack stack) {} /** * Called when a horse wearing this piece of armor has been hurt. @@ -54,6 +58,7 @@ public void onHorseUpdate (EntityHorse horse, ItemStack stack) { * @return boolean: If true, the horse will not be hurt and the event will be canceled. */ public boolean onHorseDamaged (EntityHorse horse, ItemStack stack, DamageSource source, float damage) { + stack.damageItem((int)(damage / 5F) + 1, horse); return true; } @@ -82,9 +87,23 @@ public String getArmorTexture (EntityHorse horse, ItemStack stack) { * @param flag: A convenient flag which can be used to easily switch between the different * render events. 0:pre 1:post 2:special-pre 3:special-post */ + + /* + this.bindEntityTexture(p_77036_1_); + this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); + Item customArmor = p_77036_1_.getDataWatcher().getWatchableObjectItemStack(23).getItem(); + if(customArmor != null && customArmor instanceof ItemHorseArmorMFBase) { + CustomMaterial material = CustomMaterial.getMaterial("Ignotumite"); + if (material != null) { + this.bindTexture(TextureHelperMF.getResource("textures/models/animal/horse/armor/standard_plate_layer_1.png")); + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); + } + } + */ + @SideOnly(Side.CLIENT) public void onHorseRendered (EntityHorse horse, ItemStack armorStack, RenderLivingEvent event, byte flag) { - } } diff --git a/src/main/java/minefantasy/mf2/asm/ASMHelper.java b/src/main/java/minefantasy/mf2/asm/ASMHelper.java index 9ed73ea8..7d60bd73 100644 --- a/src/main/java/minefantasy/mf2/asm/ASMHelper.java +++ b/src/main/java/minefantasy/mf2/asm/ASMHelper.java @@ -133,41 +133,6 @@ public static AbstractInsnNode findLastNodeFromNeedle(InsnList haystack, InsnLis return ret.get(0); } - /** - * Removes a specific set of instructions (the needle) from a much larger set of - * instructions (the hay stack). Be cautious when using this method, as it is almost never - * a good idea to remove instructions. - * - * @param haystack: A large list of instructions which is being searched through. - * @param needle: A specific list of instructions which are to be removed from the larger - * instruction list. - */ - public static void removeNeedleFromHaystack(InsnList haystack, InsnList needle) { - - int firstInd = haystack.indexOf(findFirstNodeFromNeedle(haystack, needle)); - int lastInd = haystack.indexOf(findLastNodeFromNeedle(haystack, needle)); - List realNeedle = new ArrayList(); - - for (int i = firstInd; i <= lastInd; i++) - realNeedle.add(haystack.get(i)); - - for (AbstractInsnNode node : realNeedle) - haystack.remove(node); - } - - /** - * Checks if an instruction can be ignored. While this typically isn't needed, there may be - * some cases where you want to ignore LabelNodes and LineNumberNodes. This method will - * help with that. - * - * @param insn: The AbstractInsnNode to check against. - * @return boolean: True if it okay to ignore this instruction, false if it not okay. - */ - public static boolean canIgnoreInstruction(AbstractInsnNode insn) { - - return (insn instanceof LabelNode || insn instanceof LineNumberNode); - } - public static class InvalidNeedleException extends RuntimeException { /** diff --git a/src/main/java/minefantasy/mf2/asm/InstructionComparator.java b/src/main/java/minefantasy/mf2/asm/InstructionComparator.java index 1eb44e96..c78d6868 100644 --- a/src/main/java/minefantasy/mf2/asm/InstructionComparator.java +++ b/src/main/java/minefantasy/mf2/asm/InstructionComparator.java @@ -11,31 +11,6 @@ public final class InstructionComparator { - // TODO: Add documentation - public static InsnList getImportantList(InsnList list) { - - if (list.size() == 0) - return list; - - HashMap labels = new HashMap(); - - for (AbstractInsnNode insn = list.getFirst(); insn != null; insn = insn.getNext()) - if (insn instanceof LabelNode) - labels.put((LabelNode) insn, (LabelNode) insn); - - InsnList importantNodeList = new InsnList(); - - for (AbstractInsnNode insn = list.getFirst(); insn != null; insn = insn.getNext()) { - - if (insn instanceof LabelNode || insn instanceof LineNumberNode) - continue; - - importantNodeList.add(insn.clone(labels)); - } - - return importantNodeList; - } - /** * Compares whether or not two instructions are equal. * diff --git a/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java b/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java index 1ca2fa0a..b917fc52 100644 --- a/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java +++ b/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java @@ -1,4 +1,4 @@ -/* Based on @SanAndreasP code */ +// Based on @SanAndreasP code (from Bookshelf lib) package minefantasy.mf2.asm.transformers; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java index 7f75bc90..a03df671 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java @@ -17,8 +17,8 @@ import minefantasy.mf2.item.heatable.ItemHeated; import minefantasy.mf2.knowledge.KnowledgeListMF; import minefantasy.mf2.mechanics.PlayerTickHandlerMF; +import minefantasy.mf2.network.NetworkUtils; import minefantasy.mf2.network.packet.AnvilPacket; -import minefantasy.mf2.util.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -34,869 +34,855 @@ import java.util.Random; public class TileEntityAnvilMF extends TileEntity implements IInventory, IAnvil, IQualityBalance { - public int tier; - private ItemStack[] inventory; - private Random rand = new Random(); - private int ticksExisted; - private ContainerAnvilMF syncAnvil; - private AnvilCraftMatrix craftMatrix; - private String lastPlayerHit = ""; - private String toolTypeRequired = "hammer"; - private String researchRequired = ""; - private boolean outputHot = false; - private Skill skillUsed; - private boolean resetRecipe = false; - - public TileEntityAnvilMF() { - this(0, "Iron"); - } - - public TileEntityAnvilMF(int tier, String name) { - inventory = new ItemStack[25]; - this.tier = tier; - texName = name; - setContainer(new ContainerAnvilMF(this)); - } - - private boolean isFakeAnvil = false; - - public TileEntityAnvilMF setDisplay() { - isFakeAnvil = true; - return this; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - tier = nbt.getInteger("tier"); - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inventory = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inventory.length) { - this.inventory[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - progress = nbt.getFloat("Progress"); - progressMax = nbt.getFloat("ProgressMax"); - resName = nbt.getString("ResultName"); - toolTypeRequired = nbt.getString("toolTypeRequired"); - researchRequired = nbt.getString("researchRequired"); - texName = nbt.getString("TextureName"); - outputHot = nbt.getBoolean("outputHot"); - qualityBalance = nbt.getFloat("Quality"); - leftHit = nbt.getFloat("leftHit"); - rightHit = nbt.getFloat("rightHit"); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("tier", tier); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inventory.length; ++i) { - if (this.inventory[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.inventory[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - - nbt.setFloat("Progress", progress); - nbt.setFloat("ProgressMax", progressMax); - nbt.setString("ResName", resName); - nbt.setString("toolTypeRequired", toolTypeRequired); - nbt.setString("researchRequired", researchRequired); - nbt.setString("TextureName", texName); - nbt.setBoolean("outputHot", outputHot); - nbt.setFloat("Quality", qualityBalance); - nbt.setFloat("leftHit", leftHit); - nbt.setFloat("rightHit", rightHit); - } - - @Override - public int getSizeInventory() { - return inventory.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return inventory[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - onInventoryChanged(); - if (this.inventory[slot] != null) { - ItemStack itemstack; - - if (this.inventory[slot].stackSize <= num) { - itemstack = this.inventory[slot]; - this.inventory[slot] = null; - return itemstack; - } else { - itemstack = this.inventory[slot].splitStack(num); - - if (this.inventory[slot].stackSize == 0) { - this.inventory[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return inventory[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - onInventoryChanged(); - inventory[slot] = item; - } - - @Override - public String getInventoryName() { - return "gui.carpentermf.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - return true; - } - - @Override - public void updateEntity() { - ++ticksExisted; - if (!worldObj.isRemote && (leftHit == 0 || rightHit == 0)) { - reassignHitValues(); - } - super.updateEntity(); - if (!worldObj.isRemote) { - if (!isFakeAnvil && ticksExisted % 20 == 0) { - updateCraftingData(); - } - if (!canCraft() && ticksExisted > 1) { - progress = progressMax = 0; - this.resName = ""; - this.recipe = null; - } - } - if (!worldObj.isRemote) { - updateThreshold(); - } - resetRecipe = false; - } - - public void onInventoryChanged() { - if (!resetRecipe) { - updateCraftingData(); - resetRecipe = true; - } - } - - public boolean tryCraft(EntityPlayer user, boolean rightClick) { - if (user == null) - return false; - - String toolType = ToolHelper.getCrafterTool(user.getHeldItem()); - int hammerTier = ToolHelper.getCrafterTier(user.getHeldItem()); - if (toolType.equalsIgnoreCase("hammer") || toolType.equalsIgnoreCase("hvyHammer")) { - if (user.getHeldItem() != null) { - user.getHeldItem().damageItem(1, user); - if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { - if (worldObj.isRemote) - user.renderBrokenItemStack(user.getHeldItem()); - - user.destroyCurrentEquippedItem(); - } - } - if (worldObj.isRemote) - return true; - - if (doesPlayerKnowCraft(user) && canCraft() && toolType.equalsIgnoreCase(toolTypeRequired)) { - float mod = 1.0F; - if (hammerTier < hammerTierRequired) { - mod = 2.0F; - if (rand.nextInt(5) == 0) { - reassignHitValues(); - } - } - if (rightClick) { - this.qualityBalance += (rightHit * mod); - } else { - this.qualityBalance -= (leftHit * mod); - } - if (qualityBalance >= 1.0F || qualityBalance <= -1.0F) { - ruinCraft(); - } - - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilsucceed", - 0.25F, rightClick ? 1.2F : 1.0F); - float efficiency = ToolHelper.getCrafterEfficiency(user.getHeldItem()) * (rightClick ? 0.75F : 1.0F); - float toolEfficiency = efficiency; - - if (user.swingProgress > 0 && user.swingProgress <= 1.0) { - efficiency *= (0.5F - user.swingProgress); - } - - progress += Math.max(0.2F, efficiency); - if (progress >= progressMax) { - craftItem(user); - } - } else { - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilfail", - 0.25F, 1.0F); - } - lastPlayerHit = user.getCommandSenderName(); - updateCraftingData(); - - return true; - } - updateCraftingData(); - return false; - } - - private void ruinCraft() { - if (!worldObj.isRemote) { - consumeResources(); - reassignHitValues(); - progress = progressMax = qualityBalance = 0; - } - worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.8, zCoord + 0.5, "random.break", 1.0F, 0.8F); - } - - public boolean doesPlayerKnowCraft(EntityPlayer user) { - return getResearchNeeded().isEmpty() || ResearchLogic.hasInfoUnlocked(user, getResearchNeeded()); - } - - private void craftItem(EntityPlayer lastHit) { - if (this.canCraft()) { - ItemStack result = modifySpecials(recipe); - if (result == null) { - return; - } - if (result != null && result.getItem() instanceof ItemArmourMF) { - result = modifyArmour(result); - } - int output = getSizeInventory() - 1; - - int temp = this.averageTemp(); - boolean hot = outputHot && temp > 0; - - if (hot) { - if (result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) { - getNBT(result).setString("MF_CraftedByName", lastPlayerHit); - } - ItemStack out = ItemHeated.createHotItem(result, temp); - if (inventory[output] == null || (inventory[output].stackSize == 1 - && SpecialForging.getItemDesign(inventory[output]) != null)) { - addXP(lastHit); - this.inventory[output] = out; - consumeResources(); - } else if (inventory[output].isItemEqual(out) - && (inventory[output].stackSize + out.stackSize <= getStackSize(inventory[output]))) { - addXP(lastHit); - inventory[output].stackSize += out.stackSize; - consumeResources(); - } - } else if (!hot) { - if (this.inventory[output] == null) { - if (result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) { - getNBT(result).setString("MF_CraftedByName", lastPlayerHit); - } - this.inventory[output] = result; - } else if (this.inventory[output].getItem() == result.getItem()) { - this.inventory[output].stackSize += result.stackSize; // Forge BugFix: Results may have multiple - // items - } - addXP(lastHit); - consumeResources(); - } - } - onInventoryChanged(); - progress = 0; - reassignHitValues(); - qualityBalance = 0; - } - - private void addXP(EntityPlayer smith) { - if (skillUsed == null) - return; - - float baseXP = this.progressMax / 10F; - baseXP /= (1.0F + getAbsoluteBalance()); - - skillUsed.addXP(smith, (int) baseXP + 1); - } - - private ItemStack modifyArmour(ItemStack result) { - ItemArmourMF item = (ItemArmourMF) result.getItem(); - boolean canColour = item.canColour(); - int colour = -1; - for (int a = 0; a < getSizeInventory() - 1; a++) { - ItemStack slot = getStackInSlot(a); - if (slot != null && slot.getItem() instanceof ItemArmor) { - ItemArmor slotitem = (ItemArmor) slot.getItem(); - if (canColour && slotitem.hasColor(slot)) { - colour = slotitem.getColor(slot); - } - if (result.isItemStackDamageable()) { - result.setItemDamage(slot.getItemDamage()); - } - } - } - if (colour != -1 && canColour) { - item.func_82813_b(result, colour); - } - return result; - } - - private ItemStack modifySpecials(ItemStack result) { - boolean hasHeart = false; - boolean isTool = result.getMaxStackSize() == 1 && result.isItemStackDamageable(); - EntityPlayer player = worldObj.getPlayerEntityByName(lastPlayerHit); - - Item DF = SpecialForging.getDragonCraft(result); - - if (DF != null) { - // DRAGONFORGE - for (int x = -4; x <= 4; x++) { - for (int y = -4; y <= 4; y++) { - for (int z = -4; z <= 4; z++) { - TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord + y, zCoord + z); - if (player != null && ResearchLogic.hasInfoUnlocked(player, KnowledgeListMF.smeltDragonforge) - && tile != null && tile instanceof TileEntityForge) { - if (((TileEntityForge) tile).dragonHeartPower > 0) { - hasHeart = true; - ((TileEntityForge) tile).dragonHeartPower = 0; - worldObj.createExplosion(null, xCoord + x, yCoord + y, zCoord + z, 1F, false); - PlayerTickHandlerMF.spawnDragon(player); - PlayerTickHandlerMF.addDragonEnemyPts(player, 2); - - break; - } - } - } - } - } - } - if (hasHeart) { - NBTBase nbt = !(result.hasTagCompound()) ? null : result.getTagCompound().copy(); - result = new ItemStack(DF, result.stackSize, result.getItemDamage()); - if (nbt != null) { - result.setTagCompound((NBTTagCompound) nbt); - } - } else { - Item special = SpecialForging - .getSpecialCraft(SpecialForging.getItemDesign(inventory[getSizeInventory() - 1]), result); - if (special != null) { - NBTBase nbt = !(result.hasTagCompound()) ? null : result.getTagCompound().copy(); - result = new ItemStack(special, result.stackSize, result.getItemDamage()); - if (nbt != null) { - result.setTagCompound((NBTTagCompound) nbt); - } - } - } - - if (isPerfectItem() && !isMythicRecipe()) { - this.setTrait(result, "MF_Inferior", false); - if (CustomToolHelper.isMythic(result)) { - result.getTagCompound().setBoolean("Unbreakable", true); - } else { - ToolHelper.setQuality(result, 200.0F); - } - return result; - } - if (isTool) { - result = modifyQualityComponents(result); - } - return damageItem(result); - } - - private ItemStack modifyQualityComponents(ItemStack result) { - float totalPts = 0F; - int totalItems = 0; - for (ItemStack item : inventory) { - if (item != null && item.hasTagCompound()) { - if (item.getTagCompound().hasKey("MF_Inferior")) { - ++totalItems; - boolean inf = item.getTagCompound().getBoolean("MF_Inferior"); - totalPts += (inf ? -50F : 100F); - } - } - } - if (totalItems > 0 && totalPts > 0) { - totalPts /= totalItems; - ToolHelper.setQuality(result, ToolHelper.getQualityLevel(result) + totalPts); - if (totalPts <= -85F) { - this.setTrait(result, "MF_Inferior", true); - } - if (totalPts >= 80) { - this.setTrait(result, "MF_Inferior", false); - } - } - return result; - } - - private int averageTemp() { - float totalTemp = 0; - int itemCount = 0; - for (int a = 0; a < getSizeInventory() - 1; a++) { - ItemStack item = getStackInSlot(a); - if (item != null && item.getItem() instanceof IHotItem) { - ++itemCount; - totalTemp += Heatable.getTemp(item); - } - } - if (totalTemp > 0 && itemCount > 0) { - return (int) (totalTemp / itemCount); - } - return 0; - } - - private NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - return item.getTagCompound(); - } - - private void dropItem(ItemStack itemstack) { - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.4F + 0.3F; - float f1 = this.rand.nextFloat() * 0.4F + 0.3F; - float f2 = this.rand.nextFloat() * 0.4F + 0.3F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - boolean delay = true; - double[] positions = new double[] { xCoord + f, yCoord + f1 + 1, zCoord + f2 }; - if (worldObj.getBlock(xCoord, yCoord + 1, zCoord).getMaterial().isSolid() && lastPlayerHit != null) { - EntityPlayer smith = worldObj.getPlayerEntityByName(lastPlayerHit); - if (smith != null) { - delay = false; - positions = new double[] { smith.posX, smith.posY, smith.posZ }; - } - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(worldObj, positions[0], positions[1], positions[2], - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - entityitem.delayBeforeCanPickup = delay ? 20 : 0; - entityitem.motionX = entityitem.motionY = entityitem.motionZ = 0; - - worldObj.spawnEntityInWorld(entityitem); - } - } - } - - public boolean hasItems(EntityPlayer user, ItemStack[] items) { - for (ItemStack check : items) { - if (!hasItems(user, check)) { - return false; - } - } - return true; - } - - public boolean hasItems(EntityPlayer user, ItemStack item) { - return hasItems(user, item, item.stackSize); - } - - public boolean hasItems(EntityPlayer user, ItemStack item, int number) { - int count = 0; - for (int a = 0; a < user.inventory.getSizeInventory(); a++) { - ItemStack slot = user.inventory.getStackInSlot(a); - if (slot != null && slot.isItemEqual(item)) { - count += slot.stackSize; - } - } - return count >= number; - } - - public void syncData() { - - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new AnvilPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); - - /* - List players = ((WorldServer) worldObj).playerEntities; - for (int i = 0; i < players.size(); i++) { - EntityPlayer player = players.get(i); - - ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new AnvilPacket(this).generatePacket()); - } - */ - } - - public String resName = ""; - - public String getResultName() { - if (!worldObj.isRemote && recipe != null && recipe.getDisplayName() != null) { - resName = recipe.getDisplayName(); - } - return resName; - } - - public String getResearchNeeded() { - return researchRequired; - } - - public String getToolNeeded() { - return toolTypeRequired; - } - - public int getToolTierNeeded() { - return this.hammerTierRequired; - } - - public int getAnvilTierNeeded() { - return this.anvilTierRequired; - } - - public void consumeResources() { - resetRecipe = true; - for (int slot = 0; slot < getSizeInventory() - 1; slot++) { - ItemStack item = getStackInSlot(slot); - if (item != null && item.getItem() != null && item.getItem().getContainerItem(item) != null) { - if (item.stackSize == 1) { - setInventorySlotContents(slot, item.getItem().getContainerItem(item)); - } else { - this.dropItem(item.getItem().getContainerItem(item)); - this.decrStackSize(slot, 1); - } - } else { - this.decrStackSize(slot, 1); - } - } - resetRecipe = false; - this.onInventoryChanged(); - } - - private boolean canFitResult(ItemStack result) { - ItemStack resSlot = inventory[getSizeInventory() - 1]; - if (resSlot != null && result != null) { - int maxStack = getStackSize(resSlot); - if (resSlot.stackSize + result.stackSize > maxStack) { - return false; - } - if (resSlot.getItem() instanceof IHotItem) { - ItemStack heated = Heatable.getItem(resSlot); - if (heated != null) { - resSlot = heated; - } - } - if (!resSlot.isItemEqual(result) - && (SpecialForging.getItemDesign(resSlot) == null || resSlot.stackSize > 1)) { - return false; - } - } - return true; - } - - private int getStackSize(ItemStack slot) { - if (slot == null) - return 0; - - if (slot.getItem() instanceof IHotItem) { - ItemStack held = Heatable.getItem(slot); - if (held != null) - return held.getMaxStackSize(); - } - return slot.getMaxStackSize(); - } - - // CRAFTING CODE - public ItemStack getResult() { - if (syncAnvil == null || craftMatrix == null) { - return null; - } - - if (ticksExisted <= 1) - return null; - - for (int a = 0; a < getSizeInventory() - 1; a++) { - craftMatrix.setInventorySlotContents(a, inventory[a]); - } - - return CraftingManagerAnvil.getInstance().findMatchingRecipe(this, craftMatrix); - } - - public void updateCraftingData() { - if (!worldObj.isRemote) { - ItemStack oldRecipe = recipe; - recipe = getResult(); - // syncItems(); - - if (!canCraft() && progress > 0) { - progress = 0; - reassignHitValues(); - qualityBalance = 0; - } - - if (recipe != null && oldRecipe != null && !recipe.isItemEqual(oldRecipe)) { - progress = 0; - reassignHitValues(); - qualityBalance = 0; - } - if (progress > progressMax) - progress = progressMax - 1; - syncData(); - } - } - - public boolean canCraft() { - if (worldObj.isRemote) { - // return canCraft == 1; - } - - if (this.isMythicRecipe() && !this.isMythicReady()) { - return false; - } - - if (progressMax > 0 && recipe != null && recipe instanceof ItemStack) { - return this.canFitResult(recipe); - } - return false; - } - - private ItemStack recipe; - public float progressMax; - public float progress; - private int hammerTierRequired; - private int anvilTierRequired; - - @Override - public void setForgeTime(int i) { - progressMax = i; - } - - @Override - public void setHammerUsed(int i) { - hammerTierRequired = i; - } - - @Override - public void setRequiredAnvil(int i) { - anvilTierRequired = i; - } - - @Override - public void setHotOutput(boolean i) { - outputHot = i; - } - - public void setContainer(ContainerAnvilMF container) { - syncAnvil = container; - craftMatrix = new AnvilCraftMatrix(this, syncAnvil, ShapelessAnvilRecipes.globalWidth, - ShapelessAnvilRecipes.globalHeight); - } - - public boolean shouldRenderCraftMetre() { - return recipe != null; - } - - public int getProgressBar(int i) { - return (int) Math.ceil(i / progressMax * progress); - } - - @Override - public void setToolType(String toolType) { - this.toolTypeRequired = toolType; - } - - @Override - public void setResearch(String research) { - this.researchRequired = research; - } - - private boolean isMythicRecipe() { - return false;// this.hammerTierRequired >= 6; - } - - private boolean isMythicReady() { - return true; - } - - public String texName = ""; - - public String getTextureName() { - return texName; - } - - public float qualityBalance = 0F; - public float thresholdPosition = 0.1F; - - @Override - public float getMarkerPosition() { - return qualityBalance; - } - - @Override - public boolean shouldShowMetre() { - return true; - } - - @Override - public float getThresholdPosition() { - return thresholdPosition; - } - - @Override - public float getSuperThresholdPosition() { - return thresholdPosition / 3.5F; - } - - private float getAbsoluteBalance() { - return qualityBalance < 0 ? -qualityBalance : qualityBalance; - } - - private float getItemDamage() { - int threshold = (int) (100F * thresholdPosition / 2F); - int total = (int) (100F * getAbsoluteBalance() - threshold); - - if (total > threshold) { - float percent = ((float) total - (float) threshold) / (100F - threshold); - return percent; - } - return 0F; - } - - private boolean isPerfectItem() { - int threshold = (int) (100F * getSuperThresholdPosition() / 2F); - int total = (int) (100F * getAbsoluteBalance() - threshold); - - return total <= threshold; - } - - private ItemStack damageItem(ItemStack item) { - float itemdam = getItemDamage(); - if (itemdam > 0.5F) { - setTrait(item, "MF_Inferior"); - float q = 100F * (0.75F - (itemdam - 0.5F)); - ToolHelper.setQuality(item, Math.max(10F, q)); - } - float damage = itemdam * item.getMaxDamage(); - if (item.isItemStackDamageable()) { - if (damage > 0) { - item.setItemDamage((int) (damage)); - if (isMythicRecipe()) { - setTrait(item, "MF_Inferior"); - } - } else if (isMythicRecipe()) { - setTrait(item, "Unbreakable"); - } - } - return item; - } - - private void setTrait(ItemStack item, String trait) { - setTrait(item, trait, true); - } - - private void setTrait(ItemStack item, String trait, boolean flag) { - if (item == null) - return; - if (item.getMaxStackSize() > 1 || !item.isItemStackDamageable()) { - return; - } - - NBTTagCompound nbt = this.getNBT(item); - nbt.setBoolean(trait, flag); - } - - private void updateThreshold() { - float modifier = 1.0F; - if (tier < anvilTierRequired) { - modifier *= 0.25F; - } - - float baseThreshold = worldObj.difficultySetting.getDifficultyId() >= 2 ? 7.5F : 10F; - thresholdPosition = (isMythicRecipe() ? 0.05F : baseThreshold / 100F) * modifier; - } - - public void upset(EntityPlayer user) { - if (this.progress > 0 && this.progressMax > 0) { - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilsucceed", - 0.25F, 0.75F); - if (!worldObj.isRemote) { - progress -= (progressMax / 10F); - if (progress < 0) { - ruinCraft(); - } - } - } - } - - public float leftHit = 0F; - public float rightHit = 0F; - - private void reassignHitValues() { - if (!worldObj.isRemote) { - leftHit = 0.1F + (0.01F * rand.nextInt(11)); - rightHit = 0.1F + (0.01F * rand.nextInt(11)); - } - } - - @Override - public void setSkill(Skill skill) { - skillUsed = skill; - } - - @Override - public int getRecipeHammer() { - return hammerTierRequired; - } - - @Override - public int getRecipeAnvil() { - return anvilTierRequired; - } + public int tier; + private ItemStack[] inventory; + private Random rand = new Random(); + private int ticksExisted; + private ContainerAnvilMF syncAnvil; + private AnvilCraftMatrix craftMatrix; + private String lastPlayerHit = ""; + private String toolTypeRequired = "hammer"; + private String researchRequired = ""; + private boolean outputHot = false; + private Skill skillUsed; + private boolean resetRecipe = false; + + public TileEntityAnvilMF() { + this(0, "Iron"); + } + + public TileEntityAnvilMF(int tier, String name) { + inventory = new ItemStack[25]; + this.tier = tier; + texName = name; + setContainer(new ContainerAnvilMF(this)); + } + + private boolean isFakeAnvil = false; + + public TileEntityAnvilMF setDisplay() { + isFakeAnvil = true; + return this; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + tier = nbt.getInteger("tier"); + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inventory = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inventory.length) { + this.inventory[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + progress = nbt.getFloat("Progress"); + progressMax = nbt.getFloat("ProgressMax"); + resName = nbt.getString("ResultName"); + toolTypeRequired = nbt.getString("toolTypeRequired"); + researchRequired = nbt.getString("researchRequired"); + texName = nbt.getString("TextureName"); + outputHot = nbt.getBoolean("outputHot"); + qualityBalance = nbt.getFloat("Quality"); + leftHit = nbt.getFloat("leftHit"); + rightHit = nbt.getFloat("rightHit"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("tier", tier); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inventory.length; ++i) { + if (this.inventory[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inventory[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + + nbt.setFloat("Progress", progress); + nbt.setFloat("ProgressMax", progressMax); + nbt.setString("ResName", resName); + nbt.setString("toolTypeRequired", toolTypeRequired); + nbt.setString("researchRequired", researchRequired); + nbt.setString("TextureName", texName); + nbt.setBoolean("outputHot", outputHot); + nbt.setFloat("Quality", qualityBalance); + nbt.setFloat("leftHit", leftHit); + nbt.setFloat("rightHit", rightHit); + } + + @Override + public int getSizeInventory() { + return inventory.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inventory[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + onInventoryChanged(); + if (this.inventory[slot] != null) { + ItemStack itemstack; + + if (this.inventory[slot].stackSize <= num) { + itemstack = this.inventory[slot]; + this.inventory[slot] = null; + return itemstack; + } else { + itemstack = this.inventory[slot].splitStack(num); + + if (this.inventory[slot].stackSize == 0) { + this.inventory[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return inventory[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + onInventoryChanged(); + inventory[slot] = item; + } + + @Override + public String getInventoryName() { + return "gui.carpentermf.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + return true; + } + + @Override + public void updateEntity() { + ++ticksExisted; + if (!worldObj.isRemote && (leftHit == 0 || rightHit == 0)) { + reassignHitValues(); + } + super.updateEntity(); + if (!worldObj.isRemote) { + if (!isFakeAnvil && ticksExisted % 20 == 0) { + updateCraftingData(); + } + if (!canCraft() && ticksExisted > 1) { + progress = progressMax = 0; + this.resName = ""; + this.recipe = null; + } + } + if (!worldObj.isRemote) { + updateThreshold(); + } + resetRecipe = false; + } + + public void onInventoryChanged() { + if (!resetRecipe) { + updateCraftingData(); + resetRecipe = true; + } + } + + public boolean tryCraft(EntityPlayer user, boolean rightClick) { + if (user == null) + return false; + + String toolType = ToolHelper.getCrafterTool(user.getHeldItem()); + int hammerTier = ToolHelper.getCrafterTier(user.getHeldItem()); + if (toolType.equalsIgnoreCase("hammer") || toolType.equalsIgnoreCase("hvyHammer")) { + if (user.getHeldItem() != null) { + user.getHeldItem().damageItem(1, user); + if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { + if (worldObj.isRemote) + user.renderBrokenItemStack(user.getHeldItem()); + + user.destroyCurrentEquippedItem(); + } + } + if (worldObj.isRemote) + return true; + + if (doesPlayerKnowCraft(user) && canCraft() && toolType.equalsIgnoreCase(toolTypeRequired)) { + float mod = 1.0F; + if (hammerTier < hammerTierRequired) { + mod = 2.0F; + if (rand.nextInt(5) == 0) { + reassignHitValues(); + } + } + if (rightClick) { + this.qualityBalance += (rightHit * mod); + } else { + this.qualityBalance -= (leftHit * mod); + } + if (qualityBalance >= 1.0F || qualityBalance <= -1.0F) { + ruinCraft(); + } + + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilsucceed", + 0.25F, rightClick ? 1.2F : 1.0F); + float efficiency = ToolHelper.getCrafterEfficiency(user.getHeldItem()) * (rightClick ? 0.75F : 1.0F); + float toolEfficiency = efficiency; + + if (user.swingProgress > 0 && user.swingProgress <= 1.0) { + efficiency *= (0.5F - user.swingProgress); + } + + progress += Math.max(0.2F, efficiency); + if (progress >= progressMax) { + craftItem(user); + } + } else { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilfail", + 0.25F, 1.0F); + } + lastPlayerHit = user.getCommandSenderName(); + updateCraftingData(); + + return true; + } + updateCraftingData(); + return false; + } + + private void ruinCraft() { + if (!worldObj.isRemote) { + consumeResources(); + reassignHitValues(); + progress = progressMax = qualityBalance = 0; + } + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.8, zCoord + 0.5, "random.break", 1.0F, 0.8F); + } + + public boolean doesPlayerKnowCraft(EntityPlayer user) { + return getResearchNeeded().isEmpty() || ResearchLogic.hasInfoUnlocked(user, getResearchNeeded()); + } + + private void craftItem(EntityPlayer lastHit) { + if (this.canCraft()) { + ItemStack result = modifySpecials(recipe); + if (result == null) { + return; + } + + if (result.getItem() instanceof ItemArmourMF) { + result = modifyArmour(result); + } + + if (result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) { + getNBT(result).setString("MF_CraftedByName", lastPlayerHit); + } + + int temp = this.averageTemp(); + if (outputHot && temp > 0) { + result = ItemHeated.createHotItem(result, temp); + } + + int outputSlot = getSizeInventory() - 1; + + if (inventory[outputSlot] == null || SpecialForging.getItemDesign(inventory[outputSlot]) != null) { + inventory[outputSlot] = result; + } else { + if (inventory[outputSlot].isItemEqual(result) && ItemStack.areItemStackTagsEqual(inventory[outputSlot], result)) { + if (inventory[outputSlot].stackSize + result.stackSize <= getStackSize(inventory[outputSlot])) { + inventory[outputSlot].stackSize += result.stackSize; + } else { + dropItem(result); + } + } else { + dropItem(result); + } + } + + addXP(lastHit); + consumeResources(); + } + onInventoryChanged(); + progress = 0; + reassignHitValues(); + qualityBalance = 0; + } + + private void addXP(EntityPlayer smith) { + if (skillUsed == null) + return; + + float baseXP = this.progressMax / 10F; + baseXP /= (1.0F + getAbsoluteBalance()); + + skillUsed.addXP(smith, (int) baseXP + 1); + } + + private ItemStack modifyArmour(ItemStack result) { + ItemArmourMF item = (ItemArmourMF) result.getItem(); + boolean canColour = item.canColour(); + int colour = -1; + for (int a = 0; a < getSizeInventory() - 1; a++) { + ItemStack slot = getStackInSlot(a); + if (slot != null && slot.getItem() instanceof ItemArmor) { + ItemArmor slotitem = (ItemArmor) slot.getItem(); + if (canColour && slotitem.hasColor(slot)) { + colour = slotitem.getColor(slot); + } + if (result.isItemStackDamageable()) { + result.setItemDamage(slot.getItemDamage()); + } + } + } + if (colour != -1 && canColour) { + item.func_82813_b(result, colour); + } + return result; + } + + private ItemStack modifySpecials(ItemStack result) { + boolean hasHeart = false; + boolean isTool = result.getMaxStackSize() == 1 && result.isItemStackDamageable(); + EntityPlayer player = worldObj.getPlayerEntityByName(lastPlayerHit); + + Item DF = SpecialForging.getDragonCraft(result); + + if (DF != null) { + // DRAGONFORGE + for (int x = -4; x <= 4; x++) { + for (int y = -4; y <= 4; y++) { + for (int z = -4; z <= 4; z++) { + TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord + y, zCoord + z); + if (player != null && ResearchLogic.hasInfoUnlocked(player, KnowledgeListMF.smeltDragonforge) + && tile != null && tile instanceof TileEntityForge) { + if (((TileEntityForge) tile).dragonHeartPower > 0) { + hasHeart = true; + ((TileEntityForge) tile).dragonHeartPower = 0; + worldObj.createExplosion(null, xCoord + x, yCoord + y, zCoord + z, 1F, false); + PlayerTickHandlerMF.spawnDragon(player); + PlayerTickHandlerMF.addDragonEnemyPts(player, 2); + + break; + } + } + } + } + } + } + if (hasHeart) { + NBTBase nbt = !(result.hasTagCompound()) ? null : result.getTagCompound().copy(); + result = new ItemStack(DF, result.stackSize, result.getItemDamage()); + if (nbt != null) { + result.setTagCompound((NBTTagCompound) nbt); + } + } else { + Item special = SpecialForging + .getSpecialCraft(SpecialForging.getItemDesign(inventory[getSizeInventory() - 1]), result); + if (special != null) { + NBTBase nbt = !(result.hasTagCompound()) ? null : result.getTagCompound().copy(); + result = new ItemStack(special, result.stackSize, result.getItemDamage()); + if (nbt != null) { + result.setTagCompound((NBTTagCompound) nbt); + } + } + } + + if (isPerfectItem() && !isMythicRecipe()) { + this.setTrait(result, "MF_Inferior", false); + if (CustomToolHelper.isMythic(result)) { + result.getTagCompound().setBoolean("Unbreakable", true); + } else { + ToolHelper.setQuality(result, 200.0F); + } + return result; + } + if (isTool) { + result = modifyQualityComponents(result); + } + return damageItem(result); + } + + private ItemStack modifyQualityComponents(ItemStack result) { + float totalPts = 0F; + int totalItems = 0; + for (ItemStack item : inventory) { + if (item != null && item.hasTagCompound()) { + if (item.getTagCompound().hasKey("MF_Inferior")) { + ++totalItems; + boolean inf = item.getTagCompound().getBoolean("MF_Inferior"); + totalPts += (inf ? -50F : 100F); + } + } + } + if (totalItems > 0 && totalPts > 0) { + totalPts /= totalItems; + ToolHelper.setQuality(result, ToolHelper.getQualityLevel(result) + totalPts); + if (totalPts <= -85F) { + this.setTrait(result, "MF_Inferior", true); + } + if (totalPts >= 80) { + this.setTrait(result, "MF_Inferior", false); + } + } + return result; + } + + private int averageTemp() { + float totalTemp = 0; + int itemCount = 0; + for (int a = 0; a < getSizeInventory() - 1; a++) { + ItemStack item = getStackInSlot(a); + if (item != null && item.getItem() instanceof IHotItem) { + ++itemCount; + totalTemp += Heatable.getTemp(item); + } + } + if (totalTemp > 0 && itemCount > 0) { + return (int) (totalTemp / itemCount); + } + return 0; + } + + private NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + return item.getTagCompound(); + } + + private void dropItem(ItemStack itemstack) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.4F + 0.3F; + float f1 = this.rand.nextFloat() * 0.4F + 0.3F; + float f2 = this.rand.nextFloat() * 0.4F + 0.3F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + boolean delay = true; + double[] positions = new double[]{xCoord + f, yCoord + f1 + 1, zCoord + f2}; + if (worldObj.getBlock(xCoord, yCoord + 1, zCoord).getMaterial().isSolid() && lastPlayerHit != null) { + EntityPlayer smith = worldObj.getPlayerEntityByName(lastPlayerHit); + if (smith != null) { + delay = false; + positions = new double[]{smith.posX, smith.posY, smith.posZ}; + } + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(worldObj, positions[0], positions[1], positions[2], + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + entityitem.delayBeforeCanPickup = delay ? 20 : 0; + entityitem.motionX = entityitem.motionY = entityitem.motionZ = 0; + + worldObj.spawnEntityInWorld(entityitem); + } + } + } + + public boolean hasItems(EntityPlayer user, ItemStack[] items) { + for (ItemStack check : items) { + if (!hasItems(user, check)) { + return false; + } + } + return true; + } + + public boolean hasItems(EntityPlayer user, ItemStack item) { + return hasItems(user, item, item.stackSize); + } + + public boolean hasItems(EntityPlayer user, ItemStack item, int number) { + int count = 0; + for (int a = 0; a < user.inventory.getSizeInventory(); a++) { + ItemStack slot = user.inventory.getStackInSlot(a); + if (slot != null && slot.isItemEqual(item)) { + count += slot.stackSize; + } + } + return count >= number; + } + + public void syncData() { + + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new AnvilPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + } + + public String resName = ""; + + public String getResultName() { + if (!worldObj.isRemote && recipe != null && recipe.getDisplayName() != null) { + resName = recipe.getDisplayName(); + } + return resName; + } + + public String getResearchNeeded() { + return researchRequired; + } + + public String getToolNeeded() { + return toolTypeRequired; + } + + public int getToolTierNeeded() { + return this.hammerTierRequired; + } + + public int getAnvilTierNeeded() { + return this.anvilTierRequired; + } + + public void consumeResources() { + resetRecipe = true; + for (int slot = 0; slot < getSizeInventory() - 1; slot++) { + ItemStack item = getStackInSlot(slot); + if (item != null && item.getItem() != null && item.getItem().getContainerItem(item) != null) { + if (item.stackSize == 1) { + setInventorySlotContents(slot, item.getItem().getContainerItem(item)); + } else { + this.dropItem(item.getItem().getContainerItem(item)); + this.decrStackSize(slot, 1); + } + } else { + this.decrStackSize(slot, 1); + } + } + resetRecipe = false; + this.onInventoryChanged(); + } + + private boolean canFitResult(ItemStack result) { + ItemStack resSlot = inventory[getSizeInventory() - 1]; + if (resSlot != null && result != null) { + int maxStack = getStackSize(resSlot); + if (resSlot.stackSize + result.stackSize > maxStack) { + return false; + } + if (resSlot.getItem() instanceof IHotItem) { + ItemStack heated = Heatable.getItem(resSlot); + if (heated != null) { + resSlot = heated; + } + } + if (!resSlot.isItemEqual(result) + && (SpecialForging.getItemDesign(resSlot) == null || resSlot.stackSize > 1)) { + return false; + } + } + return true; + } + + private int getStackSize(ItemStack slot) { + if (slot == null) + return 0; + + if (slot.getItem() instanceof IHotItem) { + ItemStack held = Heatable.getItem(slot); + if (held != null) + return held.getMaxStackSize(); + } + return slot.getMaxStackSize(); + } + + // CRAFTING CODE + public ItemStack getResult() { + if (syncAnvil == null || craftMatrix == null) { + return null; + } + + if (ticksExisted <= 1) + return null; + + for (int a = 0; a < getSizeInventory() - 1; a++) { + craftMatrix.setInventorySlotContents(a, inventory[a]); + } + + return CraftingManagerAnvil.getInstance().findMatchingRecipe(this, craftMatrix); + } + + public void updateCraftingData() { + if (!worldObj.isRemote) { + ItemStack oldRecipe = recipe; + recipe = getResult(); + // syncItems(); + + if (!canCraft() && progress > 0) { + progress = 0; + reassignHitValues(); + qualityBalance = 0; + } + + if (recipe != null && oldRecipe != null && !recipe.isItemEqual(oldRecipe)) { + progress = 0; + reassignHitValues(); + qualityBalance = 0; + } + if (progress > progressMax) + progress = progressMax - 1; + syncData(); + } + } + + public boolean canCraft() { + if (worldObj.isRemote) { + // return canCraft == 1; + } + + if (this.isMythicRecipe() && !this.isMythicReady()) { + return false; + } + + if (progressMax > 0 && recipe != null && recipe instanceof ItemStack) { + return this.canFitResult(recipe); + } + return false; + } + + private ItemStack recipe; + public float progressMax; + public float progress; + private int hammerTierRequired; + private int anvilTierRequired; + + @Override + public void setForgeTime(int i) { + progressMax = i; + } + + @Override + public void setHammerUsed(int i) { + hammerTierRequired = i; + } + + @Override + public void setRequiredAnvil(int i) { + anvilTierRequired = i; + } + + @Override + public void setHotOutput(boolean i) { + outputHot = i; + } + + public void setContainer(ContainerAnvilMF container) { + syncAnvil = container; + craftMatrix = new AnvilCraftMatrix(this, syncAnvil, ShapelessAnvilRecipes.globalWidth, + ShapelessAnvilRecipes.globalHeight); + } + + public boolean shouldRenderCraftMetre() { + return recipe != null; + } + + public int getProgressBar(int i) { + return (int) Math.ceil(i / progressMax * progress); + } + + @Override + public void setToolType(String toolType) { + this.toolTypeRequired = toolType; + } + + @Override + public void setResearch(String research) { + this.researchRequired = research; + } + + private boolean isMythicRecipe() { + return false;// this.hammerTierRequired >= 6; + } + + private boolean isMythicReady() { + return true; + } + + public String texName = ""; + + public String getTextureName() { + return texName; + } + + public float qualityBalance = 0F; + public float thresholdPosition = 0.1F; + + @Override + public float getMarkerPosition() { + return qualityBalance; + } + + @Override + public boolean shouldShowMetre() { + return true; + } + + @Override + public float getThresholdPosition() { + return thresholdPosition; + } + + @Override + public float getSuperThresholdPosition() { + return thresholdPosition / 3.5F; + } + + private float getAbsoluteBalance() { + return qualityBalance < 0 ? -qualityBalance : qualityBalance; + } + + private float getItemDamage() { + int threshold = (int) (100F * thresholdPosition / 2F); + int total = (int) (100F * getAbsoluteBalance() - threshold); + + if (total > threshold) { + float percent = ((float) total - (float) threshold) / (100F - threshold); + return percent; + } + return 0F; + } + + private boolean isPerfectItem() { + int threshold = (int) (100F * getSuperThresholdPosition() / 2F); + int total = (int) (100F * getAbsoluteBalance() - threshold); + + return total <= threshold; + } + + private ItemStack damageItem(ItemStack item) { + float itemdam = getItemDamage(); + if (itemdam > 0.5F) { + setTrait(item, "MF_Inferior"); + float q = 100F * (0.75F - (itemdam - 0.5F)); + ToolHelper.setQuality(item, Math.max(10F, q)); + } + float damage = itemdam * item.getMaxDamage(); + if (item.isItemStackDamageable()) { + if (damage > 0) { + item.setItemDamage((int) (damage)); + if (isMythicRecipe()) { + setTrait(item, "MF_Inferior"); + } + } else if (isMythicRecipe()) { + setTrait(item, "Unbreakable"); + } + } + return item; + } + + private void setTrait(ItemStack item, String trait) { + setTrait(item, trait, true); + } + + private void setTrait(ItemStack item, String trait, boolean flag) { + if (item == null) + return; + if (item.getMaxStackSize() > 1 || !item.isItemStackDamageable()) { + return; + } + + NBTTagCompound nbt = this.getNBT(item); + nbt.setBoolean(trait, flag); + } + + private void updateThreshold() { + float modifier = 1.0F; + if (tier < anvilTierRequired) { + modifier *= 0.25F; + } + + float baseThreshold = worldObj.difficultySetting.getDifficultyId() >= 2 ? 7.5F : 10F; + thresholdPosition = (isMythicRecipe() ? 0.05F : baseThreshold / 100F) * modifier; + } + + public void upset(EntityPlayer user) { + if (this.progress > 0 && this.progressMax > 0) { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilsucceed", + 0.25F, 0.75F); + if (!worldObj.isRemote) { + progress -= (progressMax / 10F); + if (progress < 0) { + ruinCraft(); + } + } + } + } + + public float leftHit = 0F; + public float rightHit = 0F; + + private void reassignHitValues() { + if (!worldObj.isRemote) { + leftHit = 0.1F + (0.01F * rand.nextInt(11)); + rightHit = 0.1F + (0.01F * rand.nextInt(11)); + } + } + + @Override + public void setSkill(Skill skill) { + skillUsed = skill; + } + + @Override + public int getRecipeHammer() { + return hammerTierRequired; + } + + @Override + public int getRecipeAnvil() { + return anvilTierRequired; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java index 3b66a4ea..6525e6b2 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java @@ -11,7 +11,7 @@ import minefantasy.mf2.block.refining.BlockBigFurnace; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.network.packet.BigFurnacePacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java index 52799a65..43c933d1 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java @@ -14,7 +14,7 @@ import minefantasy.mf2.knowledge.KnowledgeListMF; import minefantasy.mf2.network.packet.BloomeryPacket; import minefantasy.mf2.util.MFLogUtil; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java index 6d040fa5..c6274939 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java @@ -10,7 +10,7 @@ import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.knowledge.KnowledgeListMF; import minefantasy.mf2.network.packet.BombBenchPacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java index 8c7d30f8..714ce416 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java @@ -11,7 +11,7 @@ import minefantasy.mf2.item.armour.ItemArmourMF; import minefantasy.mf2.network.packet.CarpenterPacket; import minefantasy.mf2.util.MFLogUtil; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java index 7b7389b4..6c64f28c 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java @@ -4,7 +4,7 @@ import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockComponent; import minefantasy.mf2.network.packet.StorageBlockPacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java index 38219565..f9828ae0 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java @@ -6,7 +6,7 @@ import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.network.packet.CrossbowBenchPacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java index 44e0f178..5b4c4eaf 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java @@ -14,7 +14,7 @@ import minefantasy.mf2.item.heatable.ItemHeated; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.network.packet.ForgePacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java index e0d343a4..2307fab5 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java @@ -7,7 +7,7 @@ import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.network.packet.ResearchTablePacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java index 05ca7208..4926697b 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java @@ -2,7 +2,7 @@ import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.network.packet.RoadPacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java index 233d595b..a17c3733 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java @@ -8,7 +8,7 @@ import minefantasy.mf2.block.crafting.BlockRoast; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.network.packet.TileInventoryPacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java index 594fd579..eaae1387 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java @@ -10,7 +10,7 @@ import minefantasy.mf2.item.ItemBandage; import minefantasy.mf2.item.gadget.ItemSyringe; import minefantasy.mf2.network.packet.AmmoBoxPacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemFood; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java index 85fae63f..310f2b53 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java @@ -3,7 +3,7 @@ import minefantasy.mf2.api.helpers.BlockPositionHelper; import minefantasy.mf2.api.weapon.IRackItem; import minefantasy.mf2.network.packet.TileInventoryPacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java index adf76bcd..a7314de1 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java @@ -3,7 +3,7 @@ import minefantasy.mf2.api.heating.IQuenchBlock; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.network.packet.TroughPacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java index 7147e25f..c161ee1d 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java @@ -3,7 +3,7 @@ import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockWoodDecor; import minefantasy.mf2.network.packet.WoodDecorPacket; -import minefantasy.mf2.util.NetworkUtils; +import minefantasy.mf2.network.NetworkUtils; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java b/src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java new file mode 100644 index 00000000..3f20be82 --- /dev/null +++ b/src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java @@ -0,0 +1,16 @@ +package minefantasy.mf2.client.render.mob; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderHorse; + +@SideOnly(Side.CLIENT) +public class RenderVanillaHorse extends RenderHorse { + + public RenderVanillaHorse(ModelBase modelBase, float p_i1256_2_) + { + super(modelBase, p_i1256_2_); + } + +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java index f0486367..9418b078 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java @@ -387,7 +387,7 @@ public String getArmorTexture(ItemStack stack, Entity entity, int slot, String t } public String getArmourTextureName(ItemStack stack, Entity entity, int slot, String type) { - String tex = "minefantasy2:textures/models/armour/" + design.getName().toLowerCase() + "/" + texture; + String tex = "minefantasy2:textures/models/armour/custom/" + design.getName().toLowerCase() + "/" + texture; if (type == null && canColour())// bottom layer { return tex + "_cloth"; diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java index b83f4a0a..5414befa 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java @@ -1,26 +1,104 @@ package minefantasy.mf2.item.armour; import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.api.material.CustomMaterial; +import minefantasy.mf2.client.render.mob.RenderVanillaHorse; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.material.BaseMaterialMF; +import net.minecraft.client.model.ModelHorse; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderHorse; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.event.RenderLivingEvent; public class ItemHorseArmorMF extends ItemHorseArmorMFBase { - private String name; protected BaseMaterialMF baseMaterial; + private String specialDesign = "standard"; + private String name; private ArmourDesign armourDesign; private int itemRarity; - + private String armorTexture; + private IIcon saddleClothLayer; + private IIcon overLayer; + private String texturePath = "minefantasy2:animal/horse/armor/horse_armor"; public ItemHorseArmorMF(String name, BaseMaterialMF material, ArmourDesign design, String texture, int rarity) { super(name, material.getArmourConversion(), design, texture); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setCreativeTab(CreativeTabMF.tabArmour); - this.setTextureName("minefantasy2:apparel/horse/" + design.getName().toLowerCase() + "/" + name); + this.setTextureName(texturePath + "_main"); baseMaterial = material; + armourDesign = design; itemRarity = rarity; + armorTexture = texture; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister register) { + overLayer = register.registerIcon(texturePath + "_overlay"); + saddleClothLayer = register.registerIcon(texturePath + "_saddlecloth"); + super.registerIcons(register); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack stack, int pass) { + if (pass == 1 && overLayer != null) { + return overLayer; + } + if (pass == 2 && saddleClothLayer != null) { + return saddleClothLayer; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + if (layer == 0) { + CustomMaterial base = CustomToolHelper.getCustomPrimaryMaterial(item); + base = CustomMaterial.getMaterial("Ignotumite"); + if (base != null) { + return base.getColourInt(); + } + } + return super.getColorFromItemStack(item, layer); + } + + @Override + public String getArmorTexture(EntityHorse horse, ItemStack stack) { + return "minefantasy2:textures/models/animal/horse/armor/standard_plate_layer_1.png"; + } + + private final RenderVanillaHorse renderHorse = new RenderVanillaHorse(new ModelHorse(), 0.75F); + + @Override + public void onHorseRendered (EntityHorse horse, ItemStack armorStack, RenderLivingEvent event, byte flag) { + //If horse wearing our armor we are should use own render implementation due to vanilla restrictions. + //I just hope what you are not used other mods which works with vanilla horse renderer. Yep, this is very invasive way to color textures. + //event.setCanceled(true); } } diff --git a/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java b/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java index d2eaaea6..337252cf 100644 --- a/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java @@ -4,73 +4,77 @@ import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.item.food.FoodListMF; +import minefantasy.mf2.item.gadget.MobSpawnerMF; import minefantasy.mf2.item.weapon.ItemSwordMF; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; public final class CreativeTabMF extends CreativeTabs { - public static CreativeTabs tabTool = new CreativeTabMF(CreativeTabs.getNextID(), "forgedtool", 1); - public static CreativeTabs tabWeapon = new CreativeTabMF(CreativeTabs.getNextID(), "forgedweapon", 2); - public static CreativeTabs tabArmour = new CreativeTabMF(CreativeTabs.getNextID(), "forgedarmour", 3); - public static CreativeTabs tabArcher = new CreativeTabMF(CreativeTabs.getNextID(), "MFBows", 4); - public static CreativeTabs tabUtil = new CreativeTabMF(CreativeTabs.getNextID(), "MFUtil", 5); - public static CreativeTabs tabGadget = new CreativeTabMF(CreativeTabs.getNextID(), "MFGadgets", 6); - public static CreativeTabs tabMaterialsMF = new CreativeTabMF(CreativeTabs.getNextID(), "MFMaterials", 7); - public static CreativeTabs tabToolAdvanced = new CreativeTabMF(CreativeTabs.getNextID(), "MFadvancedtool", 8); - public static CreativeTabs tabCraftTool = new CreativeTabMF(CreativeTabs.getNextID(), "MFcrafttool", 9); - public static CreativeTabs tabOres = new CreativeTabMF(CreativeTabs.getNextID(), "MFore", 10); - public static CreativeTabs tabFood = new CreativeTabMF(CreativeTabs.getNextID(), "MFfood", 11); - public static CreativeTabs tabDragonforged = new CreativeTabMF(CreativeTabs.getNextID(), "MFdragonforged", 12); - public static CreativeTabs tabOrnate = new CreativeTabMF(CreativeTabs.getNextID(), "MFornate", 13); - public static CreativeTabs tabOldTools = new CreativeTabMF(CreativeTabs.getNextID(), "MFOld", 14); + public static CreativeTabs tabTool = new CreativeTabMF(CreativeTabs.getNextID(), "forgedtool", 1); + public static CreativeTabs tabWeapon = new CreativeTabMF(CreativeTabs.getNextID(), "forgedweapon", 2); + public static CreativeTabs tabArmour = new CreativeTabMF(CreativeTabs.getNextID(), "forgedarmour", 3); + public static CreativeTabs tabArcher = new CreativeTabMF(CreativeTabs.getNextID(), "MFBows", 4); + public static CreativeTabs tabUtil = new CreativeTabMF(CreativeTabs.getNextID(), "MFUtil", 5); + public static CreativeTabs tabGadget = new CreativeTabMF(CreativeTabs.getNextID(), "MFGadgets", 6); + public static CreativeTabs tabMaterialsMF = new CreativeTabMF(CreativeTabs.getNextID(), "MFMaterials", 7); + public static CreativeTabs tabToolAdvanced = new CreativeTabMF(CreativeTabs.getNextID(), "MFadvancedtool", 8); + public static CreativeTabs tabCraftTool = new CreativeTabMF(CreativeTabs.getNextID(), "MFcrafttool", 9); + public static CreativeTabs tabOres = new CreativeTabMF(CreativeTabs.getNextID(), "MFore", 10); + public static CreativeTabs tabFood = new CreativeTabMF(CreativeTabs.getNextID(), "MFfood", 11); + public static CreativeTabs tabDragonforged = new CreativeTabMF(CreativeTabs.getNextID(), "MFdragonforged", 12); + public static CreativeTabs tabOrnate = new CreativeTabMF(CreativeTabs.getNextID(), "MFornate", 13); + public static CreativeTabs tabOldTools = new CreativeTabMF(CreativeTabs.getNextID(), "MFOld", 14); + public static CreativeTabs tabPets = new CreativeTabMF(CreativeTabs.getNextID(), "MFpets", 15); - private int type; + private int type; - CreativeTabMF(int id, String item, int t) { - super(id, item); - type = t; - } + CreativeTabMF(int id, String item, int t) { + super(id, item); + type = t; + } - @Override - @SideOnly(Side.CLIENT) - public ItemStack getIconItemStack() { - switch (type) { - case 1: - return CustomToolListMF.standard_axe.construct("Steel", "OakWood"); - case 2: - return ((ItemSwordMF) CustomToolListMF.standard_sword).construct("Steel", "OakWood"); - case 3: - return CustomArmourListMF.standard_plate_helmet.construct("Steel"); - case 4: - return CustomToolListMF.standard_bow.construct("Steel", "OakWood"); - case 5: - return new ItemStack(BlockListMF.anvil[1]); - case 6: - return new ItemStack(ToolListMF.bomb_custom); - case 7: - return ComponentListMF.plank.construct("OakWood"); - case 8: - return CustomToolListMF.standard_handpick.construct("Steel", "OakWood"); - case 9: - return CustomToolListMF.standard_hammer.construct("Steel", "OakWood"); - case 10: - return new ItemStack(BlockListMF.oreCopper); - case 11: - return new ItemStack(FoodListMF.sweetroll); - case 12: - return new ItemStack(ComponentListMF.dragon_heart); - case 13: - return new ItemStack(ComponentListMF.ornate_items); - case 14: - return new ItemStack(ToolListMF.pickStone); - } - return new ItemStack(ComponentListMF.ingots[3]); - } + @Override + @SideOnly(Side.CLIENT) + public ItemStack getIconItemStack() { + switch (type) { + case 1: + return CustomToolListMF.standard_axe.construct("Steel", "OakWood"); + case 2: + return ((ItemSwordMF) CustomToolListMF.standard_sword).construct("Steel", "OakWood"); + case 3: + return CustomArmourListMF.standard_plate_helmet.construct("Steel"); + case 4: + return CustomToolListMF.standard_bow.construct("Steel", "OakWood"); + case 5: + return new ItemStack(BlockListMF.anvil[1]); + case 6: + return new ItemStack(ToolListMF.bomb_custom); + case 7: + return ComponentListMF.plank.construct("OakWood"); + case 8: + return CustomToolListMF.standard_handpick.construct("Steel", "OakWood"); + case 9: + return CustomToolListMF.standard_hammer.construct("Steel", "OakWood"); + case 10: + return new ItemStack(BlockListMF.oreCopper); + case 11: + return new ItemStack(FoodListMF.sweetroll); + case 12: + return new ItemStack(ComponentListMF.dragon_heart); + case 13: + return new ItemStack(ComponentListMF.ornate_items); + case 14: + return new ItemStack(ToolListMF.pickStone); + case 15: + return new ItemStack(ToolListMF.debug_mob); + } + return new ItemStack(ComponentListMF.ingots[3]); + } - @Override - @SideOnly(Side.CLIENT) - public Item getTabIconItem() { - return CustomToolListMF.standard_axe; - } + @Override + @SideOnly(Side.CLIENT) + public Item getTabIconItem() { + return CustomToolListMF.standard_axe; + } } diff --git a/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java b/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java index 46b8ba73..42cb5014 100644 --- a/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java @@ -14,7 +14,7 @@ public class CustomArmourListMF { standard_splint_boots; public static ItemArmourMF standard_plate_helmet, standard_plate_chest, standard_plate_legs, standard_plate_boots; - public static ItemHorseArmorMF standart_horse_armor; + //public static ItemHorseArmorMF standart_plate_horse_armor; public static void load() { String design = "standard"; @@ -55,6 +55,6 @@ public static void load() { standard_plate_boots = (ItemArmourMF) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, "plate_layer_1", 0).setCreativeTab(tab); - standart_horse_armor = new ItemHorseArmorMF("horse_armor", BaseMaterialMF.getMaterial("steel"), ArmourDesign.FIELDPLATE, "", 0); + //standart_plate_horse_armor = new ItemHorseArmorMF("horse_armor", BaseMaterialMF.getMaterial("steel"), ArmourDesign.FIELDPLATE, "plate_layer_1", 0); } } diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index a2a4c1e9..04e4c36e 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -974,7 +974,6 @@ public void triggerHorseRenderHook(RenderLivingEvent event, byte flag) { ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); if (customArmor != null && customArmor.getItem() instanceof ItemHorseArmorMFBase) { - ItemHorseArmorMFBase armor = (ItemHorseArmorMFBase) customArmor.getItem(); armor.onHorseRendered(horse, customArmor, event, flag); } diff --git a/src/main/java/minefantasy/mf2/util/NetworkUtils.java b/src/main/java/minefantasy/mf2/network/NetworkUtils.java similarity index 98% rename from src/main/java/minefantasy/mf2/util/NetworkUtils.java rename to src/main/java/minefantasy/mf2/network/NetworkUtils.java index d68a86d3..242bef62 100644 --- a/src/main/java/minefantasy/mf2/util/NetworkUtils.java +++ b/src/main/java/minefantasy/mf2/network/NetworkUtils.java @@ -1,4 +1,4 @@ -package minefantasy.mf2.util; +package minefantasy.mf2.network; import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.network.Packet; diff --git a/src/main/resources/assets/minefantasy2/textures/items/animal/horse/armor/horse_armor_main.png b/src/main/resources/assets/minefantasy2/textures/items/animal/horse/armor/horse_armor_main.png new file mode 100644 index 0000000000000000000000000000000000000000..c2c1ec91110e1b5af1e785ff1c544a4e133e01f2 GIT binary patch literal 15103 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 Mtu#J8d-=700R{9?A^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/models/animal/horse/armor/standard_plate_layer_1.png b/src/main/resources/assets/minefantasy2/textures/models/animal/horse/armor/standard_plate_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3bcefb884ca37290c9c884d671d10e90b696532b GIT binary patch literal 2482 zcmeHJ`8yQ)7yir`#)KJ!qA-Iric(}7TfNRk`=xZFIsO}bt>eQS=HU*zMK>@92G)u7=#i7RSuu3>1Y0^b z&YE68puZ8Q#9|R%JZ4xJg4c|rmIpR zHNXGNuvP1o3s6xLnpNIe(kd$}uA3dxCy@^Km~$VSRwNw%SYYU))r_k_L&GUi+vl|4 zAF=0i_@WJc4?b+n>PFdA-Tl?HBK5w&w=M7tM+BucIZ0A&cmDg31jxdP@;nhUbL(-f z^Z0bLBpJB$&rn0NS;Lhh#k4xlu(5*J)2BhCm=q_;nqJ{$g=}cufh+uxM*A^aQ6#t2 zqOKe4x$`x*=V?93=+3}smH*~sYv!4F`D{n}lv649ZstH%Q2dK)(0OFm8}|HmmN%3incoaBzH+)2J6b?AEl{6(9`>WMhNIA zl15IK*j3$Mm@T|fbQcYQVSr1m@F$KE+=SbP9{y1Dt4gh3wyYqOn5L>W^$F*@+^Hlg zYrFHS-5~72Qey2;g6y)VI&Ad@!?@UGULhNFomy9^C4wvo;xdb-GoF0-N#7a=BK(lD zMuS(#CDPDtyQo&BY7`nqQH94+A53e}lXfX~e_^ zuF}cz3IXifS0at`$WC1aiw!mF-$0xZ%VnMf1iCx~K5>D~aJ1U6!t@)Pkoe*^t33McYxv+l}KG!Qi@g0qxT#{&VOYG(owbOWAA`=l}hI zxq3MpJntFVD``)lV)R2~D}muSZ$y-^?I^%&A2AywJ!u}elWh8e|5 z-rg}Vg#jHZsvQWqX(i?g_=JZLk+`k46YnF%5~&^MxS_XB*i$#lP<0$SmMQ5<*frGh$AR;JC-P&4A+F;~u^Wq}mR# zbCW63B-2UGC6l#i-OTL!4qN&nphiwgwQt(EXP;vBd{&z9W|g^BY*Cu%Btx&LhLT~T)lM}ElF;K|%OSj}4sq`{ zAS*ID4+UJ*p!C1`Dk&^+l_AzE=`7tfPx|Wqi|j}cP4lO{SA?;;7HwgR?N!Su%63`4 zpjqU6L55}-ZD%LBBd1klRQ@fjq;x-R|8iBwCKA|NMe!$stDL|pWy;<2vBUbyMzeH1 z?Ij<6sy~8Ke6I2FyK+mIrm&xvr787Q!F?Jg#}{-LPOAP%MP)Vc`Tyo*=U3w~s>kOB zKP);$Eqv6C1BK^459|b*U)tOjt^Br+^=DGT(3|CmY0k|$2rX&_^SW2`%j;`FUv0)Ww$5^{ zIo%iZCN-Y=qb0a;3o?&ua0AkbchSQ^Oj6=bPLUdDuK$1eI8c9TAgE&b_Y3rVN|l!g#S2 zmcBSwkFGOdRUaCy;b!$~Xb(~h2Vd+bhM zEwAvl1%KF@YHN-^``X7nt}w^(m)kqu=T(Ty%+>NxEwZ-7ggjEyB68cuN5B(!- Date: Mon, 25 Sep 2017 17:37:58 +0700 Subject: [PATCH 069/101] Whoops Wrong path --- src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java index 9418b078..f0486367 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java @@ -387,7 +387,7 @@ public String getArmorTexture(ItemStack stack, Entity entity, int slot, String t } public String getArmourTextureName(ItemStack stack, Entity entity, int slot, String type) { - String tex = "minefantasy2:textures/models/armour/custom/" + design.getName().toLowerCase() + "/" + texture; + String tex = "minefantasy2:textures/models/armour/" + design.getName().toLowerCase() + "/" + texture; if (type == null && canColour())// bottom layer { return tex + "_cloth"; From 33cc7e5b85df4ad21aa5f76e97c298a883abd6fa Mon Sep 17 00:00:00 2001 From: Sirse Date: Mon, 25 Sep 2017 20:23:35 +0700 Subject: [PATCH 070/101] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c999a9b8..07f4abb4 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,8 @@ Unofficial MineFantasy 2 fork aimed for cross-mod integration, bug fixes, stability and perfomance tweaks. -Downloads are avaliable on Releases page +Downloads are avaliable on [releases page](https://github.com/Sirse/MineFantasyII-Cont/releases) + +Feedback are needed! If you found an issue, please, [report it!](https://github.com/Sirse/MineFantasyII-Cont/issues) + +#### Also, you are can support MineFantasy II Unofficial developing [via donation!](https://www.paypal.me/sirse) From ac47244d53f33223389fbb4af8c27f3895cdf7a4 Mon Sep 17 00:00:00 2001 From: Sirse Date: Tue, 26 Sep 2017 18:05:11 +0700 Subject: [PATCH 071/101] Rewrited NEI helper for anvil recipes Now it supports custom MF materials, dragonforged style (but not ornate), works little bit faster. Also, fixed random NPE. Usage handler still broken. Need to move some logic into separate helper method in next updates for other NEI handlers. --- .../integration/nei/RecipeHandlerAnvil.java | 271 ++++++++++-------- 1 file changed, 157 insertions(+), 114 deletions(-) diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java index 2ca63b3e..1ae7c0f5 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java @@ -1,133 +1,176 @@ package minefantasy.mf2.integration.nei; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.opengl.GL11; - import codechicken.lib.gui.GuiDraw; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; +import minefantasy.mf2.api.crafting.ITieredComponent; import minefantasy.mf2.api.crafting.anvil.CraftingManagerAnvil; import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; import minefantasy.mf2.api.crafting.anvil.ShapedAnvilRecipes; import minefantasy.mf2.api.crafting.anvil.ShapelessAnvilRecipes; +import minefantasy.mf2.api.crafting.exotic.ISpecialCraftItem; +import minefantasy.mf2.api.crafting.exotic.SpecialForging; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.knowledge.ResearchLogic; +import minefantasy.mf2.api.material.CustomMaterial; +import minefantasy.mf2.knowledge.KnowledgeListMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; -public class RecipeHandlerAnvil extends TemplateRecipeHandler { +import java.util.ArrayList; +import java.util.List; +import java.util.Map; - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("method.anvil"); - } - - @Override - public String getGuiTexture() { - return "minefantasy2:textures/gui/knowledge/anvilGrid.png"; - } - - @Override - public void drawBackground(int recipe) { - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(0, 0, 5, 22, 166, 147); - } - - @Override - public int recipiesPerPage() { - return 1; - } - - @SuppressWarnings("unchecked") - @Override - public void loadCraftingRecipes(ItemStack inputStack) { - for (IAnvilRecipe irecipe : (List) CraftingManagerAnvil.getInstance().getRecipeList()) { - if (CustomToolHelper.areEqual(irecipe.getRecipeOutput(), inputStack) - && ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { - CachedAnvilRecipe recipe = handleRecipe(irecipe, inputStack); - - if (recipe == null) { - continue; - } - - arecipes.add(recipe); - } - } - } - - @SuppressWarnings("unchecked") - @Override - public void loadUsageRecipes(ItemStack ingredient) { - for (IAnvilRecipe irecipe : (List) CraftingManagerAnvil.getInstance().getRecipeList()) { - if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { - continue; - } - - CachedAnvilRecipe recipe = handleRecipe(irecipe, null); - if (recipe == null || !recipe.contains(recipe.ingredients, ingredient.getItem())) { - continue; - } - - if (recipe.contains(recipe.ingredients, ingredient)) { - recipe.setIngredientPermutation(recipe.ingredients, ingredient); - arecipes.add(recipe); - } - } - } - - private CachedAnvilRecipe handleRecipe(IAnvilRecipe irecipe, ItemStack inputStack) { - if (irecipe instanceof ShapedAnvilRecipes) { - return new CachedAnvilRecipe((ShapedAnvilRecipes) irecipe); - } else if (irecipe instanceof ShapelessAnvilRecipes) { - return new CachedAnvilRecipe((ShapelessAnvilRecipes) irecipe); - } - - return null; - } - - public class CachedAnvilRecipe extends CachedRecipe { - - public final ArrayList ingredients = new ArrayList(); - public final PositionedStack result; - - public CachedAnvilRecipe(ShapedAnvilRecipes recipe) { - result = new PositionedStack(recipe.getRecipeOutput(), 75, 20); - setShapedRecipeIngredients(recipe.recipeWidth, recipe.recipeHeight, recipe.recipeItems); - } - - public CachedAnvilRecipe(ShapelessAnvilRecipes recipe) { - result = new PositionedStack(recipe.getRecipeOutput(), 75, 20); - } - - public void setShapedRecipeIngredients(int width, int height, Object[] items) { - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - if (items[y * width + x] == null) - continue; - - PositionedStack stack = new PositionedStack(items[y * width + x], 31 + x * 18, 54 + y * 18, false); - stack.setMaxSize(1); - ingredients.add(stack); - } - } - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 20, ingredients); - } - - @Override - public PositionedStack getResult() { - return result; - } - } +public class RecipeHandlerAnvil extends TemplateRecipeHandler { + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.anvil"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/knowledge/anvilGrid.png"; + } + + @Override + public void drawBackground(int recipe) { + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 5, 22, 166, 147); + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @SuppressWarnings("unchecked") + @Override + public void loadCraftingRecipes(ItemStack inputStack) { + ItemStack hiddenStack = null; + + if(ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, KnowledgeListMF.smeltDragonforge)) { + for (Map.Entry entry : SpecialForging.dragonforgeCrafts.entrySet()) { + if (CustomToolHelper.areEqual(new ItemStack(entry.getValue()), inputStack)) { + hiddenStack = CustomToolHelper.tryDeconstruct(new ItemStack(entry.getKey()), inputStack); + } + } + } + + /*if (inputStack.getItem() instanceof ISpecialCraftItem) { + for (Map.Entry entry : SpecialForging.specialCrafts.entrySet()) { + if (CustomToolHelper.areEqual(new ItemStack(entry.getValue()), inputStack)) { + hiddenStack = CustomToolHelper.tryDeconstruct(, inputStack); + } + } + }*/ + + for (IAnvilRecipe irecipe : (List) CraftingManagerAnvil.getInstance().getRecipeList()) { + if ((hiddenStack != null && CustomToolHelper.areEqual(irecipe.getRecipeOutput(), hiddenStack)) || CustomToolHelper.areEqual(irecipe.getRecipeOutput(), inputStack)) { + if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { + CachedAnvilRecipe recipe = handleRecipe(irecipe, inputStack); + + if (recipe == null) { + continue; + } + + arecipes.add(recipe); + } + } + } + } + + @SuppressWarnings("unchecked") + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (IAnvilRecipe irecipe : (List) CraftingManagerAnvil.getInstance().getRecipeList()) { + if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { + continue; + } + + CachedAnvilRecipe recipe = handleRecipe(irecipe, null); + if (recipe == null || !recipe.contains(recipe.ingredients, ingredient)) { + continue; + } + + recipe.setIngredientPermutation(recipe.ingredients, ingredient); + arecipes.add(recipe); + } + } + + private CachedAnvilRecipe handleRecipe(IAnvilRecipe irecipe, ItemStack inputStack) { + if (irecipe instanceof ShapedAnvilRecipes) { + return new CachedAnvilRecipe((ShapedAnvilRecipes) irecipe, inputStack); + } + if (irecipe instanceof ShapelessAnvilRecipes) { + return new CachedAnvilRecipe((ShapelessAnvilRecipes) irecipe); + } + + return null; + } + + //TODO: Implement wood permutations, add additional helper method for custom material support in crafting and usage handlers + private class CachedAnvilRecipe extends CachedRecipe { + + private ItemStack inputStack; + private final ArrayList ingredients = new ArrayList(); + + private CachedAnvilRecipe(ShapedAnvilRecipes recipe, ItemStack inputStack) { + this.inputStack = inputStack; + setShapedRecipeIngredients(recipe.recipeWidth, recipe.recipeHeight, recipe.recipeItems); + } + + private CachedAnvilRecipe(ShapelessAnvilRecipes recipe) { + inputStack = recipe.getRecipeOutput(); + } + + private void setShapedRecipeIngredients(int width, int height, Object[] items) { + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + if (items[y * width + x] == null) { + continue; + } + + ItemStack cachedStack = (ItemStack) items[y * width + x]; + if (cachedStack.getItem() instanceof ITieredComponent) { + String componentType = ((ITieredComponent) cachedStack.getItem()).getMaterialType(cachedStack); + if (componentType != null) { + if (componentType.equalsIgnoreCase("metal")) { + CustomMaterial resultPrimaryMaterial = CustomToolHelper.getCustomPrimaryMaterial(inputStack); + if (resultPrimaryMaterial != null) { + CustomMaterial.addMaterial(cachedStack, CustomToolHelper.slot_main, resultPrimaryMaterial.name); + } + } + if (componentType.equalsIgnoreCase("wood")) { + CustomMaterial resultSecondaryMaterial = CustomToolHelper.getCustomSecondaryMaterial(inputStack); + if (resultSecondaryMaterial != null) { + CustomMaterial.addMaterial(cachedStack, CustomToolHelper.slot_main, resultSecondaryMaterial.name); + } + } + } + } + PositionedStack stack = new PositionedStack(cachedStack, 31 + x * 18, 54 + y * 18, false); + stack.setMaxSize(1); + ingredients.add(stack); + } + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, ingredients); + } + + @Override + public PositionedStack getResult() { + return new PositionedStack(inputStack, 75, 20); + } + } } From c08221f7ef6fd4115b878e8670081531e55986cc Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 30 Sep 2017 00:41:28 +0700 Subject: [PATCH 072/101] Disable ASM patches until horse update --- src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java b/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java index 927226c8..058af04e 100644 --- a/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java +++ b/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java @@ -11,7 +11,7 @@ public class MFLoadingPlugin implements IFMLLoadingPlugin, IClassTransformer { @Override public String[] getASMTransformerClass() { - ASMHelper.isASMEnabled = true; + ASMHelper.isASMEnabled = false; /* TODO Config option for ASM patches */ @@ -44,9 +44,9 @@ public String getAccessTransformerClass() { @Override public byte[] transform(String name, String transformedName, byte[] classBytes) { - if (transformedName.equals("net.minecraft.entity.passive.EntityHorse")) { + /*if (transformedName.equals("net.minecraft.entity.passive.EntityHorse")) { return EntityHorseTransformer.transform(name, transformedName, classBytes); - } + }*/ return classBytes; } From 2bf4afc03e329f00bf3088a395745535811abf13 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 30 Sep 2017 01:05:55 +0700 Subject: [PATCH 073/101] Whooops --- .../minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java index 1ae7c0f5..c59e714d 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java @@ -91,7 +91,7 @@ public void loadCraftingRecipes(ItemStack inputStack) { @Override public void loadUsageRecipes(ItemStack ingredient) { for (IAnvilRecipe irecipe : (List) CraftingManagerAnvil.getInstance().getRecipeList()) { - if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { + if (!ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { continue; } From 3e209786d08d6833457c44578e8dd6ec23c74470 Mon Sep 17 00:00:00 2001 From: Sirse Date: Tue, 3 Oct 2017 00:46:50 +0700 Subject: [PATCH 074/101] NEI AnvelHandler fixes --- .../integration/nei/RecipeHandlerAnvil.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java index c59e714d..af734e3e 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java @@ -10,6 +10,8 @@ import minefantasy.mf2.api.crafting.anvil.ShapelessAnvilRecipes; import minefantasy.mf2.api.crafting.exotic.ISpecialCraftItem; import minefantasy.mf2.api.crafting.exotic.SpecialForging; +import minefantasy.mf2.api.heating.Heatable; +import minefantasy.mf2.api.heating.IHotItem; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.api.material.CustomMaterial; @@ -56,6 +58,10 @@ public int recipiesPerPage() { public void loadCraftingRecipes(ItemStack inputStack) { ItemStack hiddenStack = null; + if(inputStack.getItem() instanceof IHotItem) { + inputStack = Heatable.getItem(inputStack); + } + if(ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, KnowledgeListMF.smeltDragonforge)) { for (Map.Entry entry : SpecialForging.dragonforgeCrafts.entrySet()) { if (CustomToolHelper.areEqual(new ItemStack(entry.getValue()), inputStack)) { @@ -90,6 +96,10 @@ public void loadCraftingRecipes(ItemStack inputStack) { @SuppressWarnings("unchecked") @Override public void loadUsageRecipes(ItemStack ingredient) { + if(ingredient.getItem() instanceof IHotItem) { + ingredient = Heatable.getItem(ingredient); + } + for (IAnvilRecipe irecipe : (List) CraftingManagerAnvil.getInstance().getRecipeList()) { if (!ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { continue; @@ -123,7 +133,11 @@ private class CachedAnvilRecipe extends CachedRecipe { private final ArrayList ingredients = new ArrayList(); private CachedAnvilRecipe(ShapedAnvilRecipes recipe, ItemStack inputStack) { - this.inputStack = inputStack; + if(inputStack != null) { + this.inputStack = inputStack; + } else { + this.inputStack = recipe.getRecipeOutput(); + } setShapedRecipeIngredients(recipe.recipeWidth, recipe.recipeHeight, recipe.recipeItems); } @@ -138,7 +152,7 @@ private void setShapedRecipeIngredients(int width, int height, Object[] items) { continue; } - ItemStack cachedStack = (ItemStack) items[y * width + x]; + ItemStack cachedStack = ((ItemStack) items[y * width + x]).copy(); if (cachedStack.getItem() instanceof ITieredComponent) { String componentType = ((ITieredComponent) cachedStack.getItem()).getMaterialType(cachedStack); if (componentType != null) { From 3085733968b63412e3de5350ef4a6f75e7b406ff Mon Sep 17 00:00:00 2001 From: Sirse Date: Tue, 3 Oct 2017 00:54:04 +0700 Subject: [PATCH 075/101] Russian language fixes and version update --- build.gradle | 2 +- src/main/java/minefantasy/mf2/MineFantasyII.java | 2 +- src/main/resources/assets/minefantasy2/lang/ru_RU.lang | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 96b742a4..e42f2a7d 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'idea' -version = "2.8.14.2u" +version = "2.8.14.3u" group= "minefantasy.mf2.minefantasy2" archivesBaseName = "MineFantasyII" diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index a9045e6d..5ba34f06 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -62,7 +62,7 @@ public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; - public static final String VERSION = "Alpha_2.8.14.2u"; + public static final String VERSION = "Alpha_2.8.14.3u"; public static final WorldGenMFBase worldGenManager = new WorldGenMFBase(); @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") diff --git a/src/main/resources/assets/minefantasy2/lang/ru_RU.lang b/src/main/resources/assets/minefantasy2/lang/ru_RU.lang index ff5f0100..a0c38018 100644 --- a/src/main/resources/assets/minefantasy2/lang/ru_RU.lang +++ b/src/main/resources/assets/minefantasy2/lang/ru_RU.lang @@ -1729,7 +1729,7 @@ knowledge.craftTools.1=Вы всю жизнь будете бегать с па knowledge.craftAdvTools=Продвинутые инструменты knowledge.craftAdvTools.desc=Подходят для своих задач -knowledge.craftAdvTools.1=Помимо стандартных инструментов есть и иные, которые могут быть достаточно полезны. +knowledge.craftAdvTools.1=Помимо стандартных существуют и другие полезные инструменты. Так, например, малая кирка имеет шанс выпадения различных полезных ресурсов при разрушении обычного или адского камня. knowledge.hvypick.info=Тяжёлая кирка - для настоящих мужчин! Она копает область 3x3x3 блока, но с меньшим дропом. Подходит для копания крупных подземных тоннелей. @@ -1897,7 +1897,7 @@ knowledge.crossbows.1=Арбалеты - отличная замена лука knowledge.crossbows.2=Чтобы сделать арбалет, Вам понадобится соответствующий верстак.^На нём Вы должны комбинировать детали, чтобы собрать полноценное оружие. Арбалет состоит из четырёх частей(Ложа, Дуги, Мод и Дуло). knowledge.crossbows.3=Поставьте где-нибудь верстак для изготовления арбалетов. Теперь Вам нужно создать детали для него(смотрим рецепты).Ложа и дуги используются во всех арбалетах. Ложа влияет на отдачу, скорость перезарядки, а короткая рукоять повышает скорость перезарядки и снижает точность. knowledge.crossbows.4=Вы можете улучшить арбалет. Достаточно добавить обвес в слот "Мод" или "Дуло". В "Мод" цепляется прицел, а в "Дуло" штык-нож. Лучше не устанавливать обвес, если в том нет нужды. -knowledge.crossbows.5=Для создания арбалета: Разместите детали в соотв. слоты(похоже на создание бомбы). Теперь используйте киянку, чтобы собрать арбалет. +knowledge.crossbows.5=Для сборки арбалета разместите детали в соответствующие слоты верстака (похоже на создание бомбы) и используйте гаечный ключ. knowledge.crossbows.6=По окончанию: теперь у Вас есть арбалет. Арбалеты работают почти как луки и выпускают болт тогда, когда заряжены. Shift+ПКМ чтобы открыть инвентарь арбалета. Сюда помещаются болты для арбалета, и когда Вы нажмёте ПКМ, арбалет зарядится. knowledge.crossShafts=Ложа арбалета From fa458fea05ea6725edb3b174d81c057e3eb0e73d Mon Sep 17 00:00:00 2001 From: Sirse Date: Tue, 3 Oct 2017 01:08:33 +0700 Subject: [PATCH 076/101] Fix missed SideOnly annotation --- src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index 04e4c36e..8ca17011 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -953,16 +953,19 @@ public void renderEntity(RenderLivingEvent.Pre event) { triggerHorseRenderHook(event, (byte) 0); } + @SideOnly(Side.CLIENT) @SubscribeEvent public void renderEntity (RenderLivingEvent.Post event) { triggerHorseRenderHook(event, (byte) 1); } + @SideOnly(Side.CLIENT) @SubscribeEvent public void renderEntity (RenderLivingEvent.Specials.Pre event) { triggerHorseRenderHook(event, (byte) 2); } + @SideOnly(Side.CLIENT) @SubscribeEvent public void renderEntity (RenderLivingEvent.Specials.Post event) { triggerHorseRenderHook(event, (byte) 3); From f4f213319ac88f54bd6bc70bca19a2bd16af2706 Mon Sep 17 00:00:00 2001 From: Sirse Date: Mon, 30 Oct 2017 17:16:03 +0700 Subject: [PATCH 077/101] Some changes --- .../mf2/api/armour/ItemHorseArmorMFBase.java | 30 ------- .../mf2/asm/MFClassTransformer.java | 17 ++++ .../minefantasy/mf2/asm/MFLoadingPlugin.java | 25 ++---- .../java/minefantasy/mf2/asm/Mappings.java | 6 ++ .../transformers/EntityHorseTransformer.java | 4 +- .../client/render/mob/RenderVanillaHorse.java | 34 +++++++- .../mf2/integration/minetweaker/MTCompat.java | 12 +-- .../helpers/MaterialExpansion.java | 70 ++++++++++++++++ .../tweakers/CustomMaterialHandler.java | 81 +++++++++++++++++++ .../mf2/integration/nei/NEIHelper.java | 36 +++++++++ .../integration/nei/RecipeHandlerAnvil.java | 34 ++++---- .../mf2/item/armour/ItemHorseArmorMF.java | 15 +--- .../mf2/mechanics/CombatMechanics.java | 4 +- .../mf2/mechanics/EventManagerMF.java | 31 ------- .../mf2/network/ClientProxyMF.java | 9 +-- 15 files changed, 277 insertions(+), 131 deletions(-) create mode 100644 src/main/java/minefantasy/mf2/asm/MFClassTransformer.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java create mode 100644 src/main/java/minefantasy/mf2/integration/nei/NEIHelper.java diff --git a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java index c61de370..670a6708 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java +++ b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java @@ -76,34 +76,4 @@ public boolean onHorseDamaged (EntityHorse horse, ItemStack stack, DamageSource public String getArmorTexture (EntityHorse horse, ItemStack stack) { return armorTexture; } - - /** - * Allows for special rendering code to be done, when a horse is rendered with this piece - * of armor on. - * - * @param horse: An instance of the EntityHorse that is wearing the armor. - * @param armorStack: An instance of the ItemStack which is in the armor slot. - * @param event: Access to the RenderLivingEvent being called. - * @param flag: A convenient flag which can be used to easily switch between the different - * render events. 0:pre 1:post 2:special-pre 3:special-post - */ - - /* - this.bindEntityTexture(p_77036_1_); - this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); - Item customArmor = p_77036_1_.getDataWatcher().getWatchableObjectItemStack(23).getItem(); - if(customArmor != null && customArmor instanceof ItemHorseArmorMFBase) { - CustomMaterial material = CustomMaterial.getMaterial("Ignotumite"); - if (material != null) { - this.bindTexture(TextureHelperMF.getResource("textures/models/animal/horse/armor/standard_plate_layer_1.png")); - GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); - this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); - } - } - */ - - @SideOnly(Side.CLIENT) - public void onHorseRendered (EntityHorse horse, ItemStack armorStack, RenderLivingEvent event, byte flag) { - } - } diff --git a/src/main/java/minefantasy/mf2/asm/MFClassTransformer.java b/src/main/java/minefantasy/mf2/asm/MFClassTransformer.java new file mode 100644 index 00000000..4c08851f --- /dev/null +++ b/src/main/java/minefantasy/mf2/asm/MFClassTransformer.java @@ -0,0 +1,17 @@ +package minefantasy.mf2.asm; + +import minefantasy.mf2.asm.transformers.EntityHorseTransformer; +import net.minecraft.launchwrapper.IClassTransformer; + +public class MFClassTransformer implements IClassTransformer { + + @Override + public byte[] transform(String name, String transformedName, byte[] classBytes) { + if (transformedName.equals("net.minecraft.entity.passive.EntityHorse")) { + return EntityHorseTransformer.transform(name, transformedName, classBytes); + } + + return classBytes; + } + +} diff --git a/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java b/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java index 058af04e..2c24f8e6 100644 --- a/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java +++ b/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java @@ -1,32 +1,27 @@ package minefantasy.mf2.asm; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; -import minefantasy.mf2.asm.transformers.EntityHorseTransformer; -import net.minecraft.launchwrapper.IClassTransformer; import java.util.Map; +@IFMLLoadingPlugin.SortingIndex(1001) +@IFMLLoadingPlugin.TransformerExclusions("minefantasy.mf2.asm") @IFMLLoadingPlugin.MCVersion("1.7.10") -public class MFLoadingPlugin implements IFMLLoadingPlugin, IClassTransformer { +public class MFLoadingPlugin implements IFMLLoadingPlugin { @Override public String[] getASMTransformerClass() { - ASMHelper.isASMEnabled = false; - /* TODO - Config option for ASM patches - */ - return new String[]{this.getClass().getName()}; + ASMHelper.isASMEnabled = true; + return new String[]{MFClassTransformer.class.getName()}; } @Override public String getModContainerClass() { - return null; } @Override public String getSetupClass() { - return null; } @@ -38,16 +33,6 @@ public void injectData(Map data) { @Override public String getAccessTransformerClass() { - return null; } - - @Override - public byte[] transform(String name, String transformedName, byte[] classBytes) { - /*if (transformedName.equals("net.minecraft.entity.passive.EntityHorse")) { - return EntityHorseTransformer.transform(name, transformedName, classBytes); - }*/ - - return classBytes; - } } diff --git a/src/main/java/minefantasy/mf2/asm/Mappings.java b/src/main/java/minefantasy/mf2/asm/Mappings.java index 964a7c6e..69646e06 100644 --- a/src/main/java/minefantasy/mf2/asm/Mappings.java +++ b/src/main/java/minefantasy/mf2/asm/Mappings.java @@ -38,6 +38,9 @@ public class Mappings { public static String hasTagCompound; public static String getColorFromItemStack; + public static String renderHorse; + public static String shouldRenderPass; + public Mappings() { // Fields @@ -75,5 +78,8 @@ public Mappings() { getTagCompound = ASMHelper.getAppropriateMapping("getTagCompound", "func_77978_p"); hasTagCompound = ASMHelper.getAppropriateMapping("hasTagCompound", "func_77942_o"); getColorFromItemStack = ASMHelper.getAppropriateMapping("getColorFromItemStack", "func_82790_a"); + + renderHorse = ASMHelper.getAppropriateMapping("RenderHorse", "bnv"); + shouldRenderPass = ASMHelper.getAppropriateMapping("shouldRenderPass", "func_77032_a"); } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java b/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java index b917fc52..fd07f1f1 100644 --- a/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java +++ b/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java @@ -24,8 +24,8 @@ public static byte[] transform(String name, String transformedName, byte[] bytes transformEntityInit(ASMHelper.getMethodFromClass(horseClass, entityInit, "()V")); transformIsValidArmor(ASMHelper.getMethodFromClass(horseClass, isArmorItem, "(Lnet/minecraft/item/Item;)Z")); - if (ASMHelper.hasClassMethodName(horseClass, setHorseTexturePaths)) - transformSetHorseTexturePaths(ASMHelper.getMethodFromClass(horseClass, setHorseTexturePaths, "()V")); + /* if (ASMHelper.hasClassMethodName(horseClass, setHorseTexturePaths)) + transformSetHorseTexturePaths(ASMHelper.getMethodFromClass(horseClass, setHorseTexturePaths, "()V"));*/ return ASMHelper.createByteArrayFromClass(horseClass, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java b/src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java index 3f20be82..37a9955f 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java @@ -2,15 +2,43 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; +import minefantasy.mf2.api.helpers.TextureHelperMF; +import minefantasy.mf2.api.material.CustomMaterial; import net.minecraft.client.model.ModelBase; import net.minecraft.client.renderer.entity.RenderHorse; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.item.Item; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class RenderVanillaHorse extends RenderHorse { - public RenderVanillaHorse(ModelBase modelBase, float p_i1256_2_) - { + public RenderVanillaHorse(ModelBase modelBase, float p_i1256_2_) { super(modelBase, p_i1256_2_); + this.setRenderPassModel(modelBase); } -} \ No newline at end of file + @Override + protected int shouldRenderPass(EntityLivingBase horse, int pass, float f) { + return shouldRenderPass((EntityHorse) horse, pass, f); + } + + private int shouldRenderPass(EntityHorse horse, int pass, float f) { + if (pass == 2) { + Item armor = horse.getDataWatcher().getWatchableObjectItemStack(23).getItem(); + if (armor instanceof ItemHorseArmorMFBase) { + CustomMaterial material = CustomMaterial.getMaterial("Ignotumite"); + if (material != null) { + GL11.glDepthFunc(GL11.GL_EQUAL); + this.bindTexture(TextureHelperMF.getResource("textures/models/animal/horse/armor/standard_plate_layer_1.png")); + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + } + return 1; + } + return -1; + } +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java index adaf0026..c04e644f 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -1,11 +1,7 @@ package minefantasy.mf2.integration.minetweaker; -import minefantasy.mf2.integration.minetweaker.tweakers.Anvil; -import minefantasy.mf2.integration.minetweaker.tweakers.Bloomery; -import minefantasy.mf2.integration.minetweaker.tweakers.CarpentersBench; -import minefantasy.mf2.integration.minetweaker.tweakers.Crucible; -import minefantasy.mf2.integration.minetweaker.tweakers.Forge; -import minefantasy.mf2.integration.minetweaker.tweakers.TanningRack; +import minefantasy.mf2.integration.minetweaker.helpers.MaterialExpansion; +import minefantasy.mf2.integration.minetweaker.tweakers.*; import minetweaker.MineTweakerAPI; /* @@ -15,8 +11,8 @@ public class MTCompat { - private static final Class[] tweakers = { Anvil.class, Bloomery.class, CarpentersBench.class, Crucible.class, - Forge.class, TanningRack.class }; + private static final Class[] tweakers = { Anvil.class, Bloomery.class, CarpentersBench.class, CustomMaterialHandler.class, Crucible.class, + Forge.class, MaterialExpansion.class, TanningRack.class }; public static void loadTweakers() { for (Class tweaker : tweakers) { diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java new file mode 100644 index 00000000..3c32fa47 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java @@ -0,0 +1,70 @@ +package minefantasy.mf2.integration.minetweaker.helpers; + +import minefantasy.mf2.api.MineFantasyAPI; +import minefantasy.mf2.api.material.CustomMaterial; +import stanhebben.zenscript.annotations.ZenExpansion; +import stanhebben.zenscript.annotations.ZenMethod; + + +@ZenExpansion("minefantasy.mf2.api.material.CustomMaterial") +public class MaterialExpansion { + + @ZenMethod("setColor") + public static CustomMaterial setColor(CustomMaterial material, int r, int g, int b) { + if (material != null) { + material.setColour(r, g, b); + } + return material; + } + + @ZenMethod("setMeltingPoint") + public static CustomMaterial setMeltingPoint(CustomMaterial material, float meltingPoint) { + if (material != null) { + material.setMeltingPoint(meltingPoint); + int[] stats = material.getHeatableStats(); + MineFantasyAPI.setHeatableStats("ingot" + material.name, stats[0], stats[1], stats[2]); + MineFantasyAPI.setHeatableStats("hunk" + material.name, stats[0], stats[1], stats[2]); + } + return material; + } + + @ZenMethod("setCrafterTiers") + public static CustomMaterial setCrafterTiers(CustomMaterial material, int craftingTier) { + if (material != null) { + material.setCrafterTiers(craftingTier); + } + return material; + } + + @ZenMethod("setRarity") + public static CustomMaterial setRarity(CustomMaterial material, int rarity) { + if (material != null) { + material.setRarity(rarity); + } + return material; + } + + @ZenMethod("setUnbreakable") + public static CustomMaterial setUnbreakable(CustomMaterial material) { + if (material != null) { + material.setUnbreakable(); + } + return material; + } + + @ZenMethod("setArmourStats") + public static CustomMaterial setArmourStats(CustomMaterial material, float cutting, float blunt, float piercing) { + if (material != null) { + material.setArmourStats(cutting, blunt, piercing); + } + return material; + } + + @ZenMethod("modifyCraftTime") + public static CustomMaterial modifyCraftTime(CustomMaterial material, float time) { + if (material != null) { + material.modifyCraftTime(time); + } + return material; + } +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java new file mode 100644 index 00000000..6d3f35da --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java @@ -0,0 +1,81 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.material.CustomMaterial; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.minefantasy.CustomMaterial") +public class CustomMaterialHandler { + + @ZenMethod + public static CustomMaterial addCustomMaterial(String type, String name, int tier, float hardness, float durability, + float flexibility, float sharpness, float resistance, float density) { + RegisterCustomMaterial reg = new RegisterCustomMaterial(type.toLowerCase(), name, tier, hardness, durability, flexibility, sharpness, resistance, density); + MineTweakerAPI.apply(reg); + return reg.material; + } + + @ZenMethod + public static CustomMaterial getMaterial(String materialName) { + return CustomMaterial.getMaterial(materialName); + } + + private static class RegisterCustomMaterial implements IUndoableAction { + + private final String type; + private final String name; + private final int tier; + private final float hardness; + private final float durability; + private final float flexibility; + private final float sharpness; + private final float resistance; + private final float density; + public CustomMaterial material; + + public RegisterCustomMaterial(String type, String name, int tier, float hardness, float durability, + float flexibility, float sharpness, float resistance, float density) { + this.type = type; + this.name = name; + this.tier = tier; + this.hardness = hardness; + this.durability = durability; + this.flexibility = flexibility; + this.sharpness = sharpness; + this.resistance = resistance; + this.density = density; + } + + @Override + public void apply() { + material = CustomMaterial.getMaterial(name) != null ? CustomMaterial.getMaterial(name) : new CustomMaterial(name, type, tier, hardness, durability, flexibility, resistance, sharpness, density).register(); + } + + @Override + public boolean canUndo() { + return false; + } + + @Override + public void undo() { + + } + + @Override + public String describe() { + return "Registers custom material for MF crafting system"; + } + + @Override + public String describeUndo() { + return "Impossible to remove registered CustomMaterials!"; + } + + @Override + public Object getOverrideKey() { + return null; + } + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/NEIHelper.java b/src/main/java/minefantasy/mf2/integration/nei/NEIHelper.java new file mode 100644 index 00000000..618b5e09 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/nei/NEIHelper.java @@ -0,0 +1,36 @@ +package minefantasy.mf2.integration.nei; + +import minefantasy.mf2.api.crafting.ITieredComponent; +import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.api.material.CustomMaterial; +import net.minecraft.item.ItemStack; + +public class NEIHelper { + + public static ItemStack fillMaterials(IAnvilRecipe recipe, ItemStack componentStack, ItemStack outputStack) { + if (componentStack.getItem() instanceof ITieredComponent) { + String componentType = ((ITieredComponent) componentStack.getItem()).getMaterialType(componentStack); + if (componentType != null) { + if (componentType.equalsIgnoreCase("metal")) { + CustomMaterial resultPrimaryMaterial = CustomToolHelper.getCustomPrimaryMaterial(outputStack); + if (resultPrimaryMaterial != null) { + CustomMaterial.addMaterial(componentStack, CustomToolHelper.slot_main, resultPrimaryMaterial.name); + } + } + if (componentType.equalsIgnoreCase("wood")) { + CustomMaterial resultSecondaryMaterial = CustomToolHelper.getCustomSecondaryMaterial(outputStack); + if (resultSecondaryMaterial != null) { + CustomMaterial.addMaterial(componentStack, CustomToolHelper.slot_main, resultSecondaryMaterial.name); + } + } + } + + /*if (recipe.outputHot() && componentStack.getItem() instanceof IHotItem) { + ItemHeated.setTemp(componentStack, 1400); + }*/ + } + + return componentStack; + } +} diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java index af734e3e..c74f393c 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java @@ -15,6 +15,7 @@ import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.api.material.CustomMaterial; +import minefantasy.mf2.item.ItemSpecialDesign; import minefantasy.mf2.knowledge.KnowledgeListMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.OpenGlHelper; @@ -72,8 +73,15 @@ public void loadCraftingRecipes(ItemStack inputStack) { /*if (inputStack.getItem() instanceof ISpecialCraftItem) { for (Map.Entry entry : SpecialForging.specialCrafts.entrySet()) { - if (CustomToolHelper.areEqual(new ItemStack(entry.getValue()), inputStack)) { - hiddenStack = CustomToolHelper.tryDeconstruct(, inputStack); + ItemStack dragonForgedStack = new ItemStack(entry.getValue()); + if (CustomToolHelper.areEqual(dragonForgedStack, inputStack)) { + String design = ((ISpecialCraftItem)entry.getValue()).getDesign(dragonForgedStack); + for (IAnvilRecipe irecipe : (List) CraftingManagerAnvil.getInstance().getRecipeList()) { + ItemStack ingridient = new ItemStack(SpecialForging.getSpecialCraft(design, irecipe.getRecipeOutput())); + if(ingridient != null) { + hiddenStack = CustomToolHelper.tryDeconstruct(ingridient, inputStack); + } + } } } }*/ @@ -131,10 +139,13 @@ private class CachedAnvilRecipe extends CachedRecipe { private ItemStack inputStack; private final ArrayList ingredients = new ArrayList(); + private IAnvilRecipe iAnvilRecipe; private CachedAnvilRecipe(ShapedAnvilRecipes recipe, ItemStack inputStack) { + iAnvilRecipe = recipe; if(inputStack != null) { this.inputStack = inputStack; + this.inputStack.stackSize = recipe.getRecipeOutput().stackSize; } else { this.inputStack = recipe.getRecipeOutput(); } @@ -142,6 +153,7 @@ private CachedAnvilRecipe(ShapedAnvilRecipes recipe, ItemStack inputStack) { } private CachedAnvilRecipe(ShapelessAnvilRecipes recipe) { + iAnvilRecipe = recipe; inputStack = recipe.getRecipeOutput(); } @@ -153,23 +165,7 @@ private void setShapedRecipeIngredients(int width, int height, Object[] items) { } ItemStack cachedStack = ((ItemStack) items[y * width + x]).copy(); - if (cachedStack.getItem() instanceof ITieredComponent) { - String componentType = ((ITieredComponent) cachedStack.getItem()).getMaterialType(cachedStack); - if (componentType != null) { - if (componentType.equalsIgnoreCase("metal")) { - CustomMaterial resultPrimaryMaterial = CustomToolHelper.getCustomPrimaryMaterial(inputStack); - if (resultPrimaryMaterial != null) { - CustomMaterial.addMaterial(cachedStack, CustomToolHelper.slot_main, resultPrimaryMaterial.name); - } - } - if (componentType.equalsIgnoreCase("wood")) { - CustomMaterial resultSecondaryMaterial = CustomToolHelper.getCustomSecondaryMaterial(inputStack); - if (resultSecondaryMaterial != null) { - CustomMaterial.addMaterial(cachedStack, CustomToolHelper.slot_main, resultSecondaryMaterial.name); - } - } - } - } + NEIHelper.fillMaterials(iAnvilRecipe, cachedStack, inputStack); PositionedStack stack = new PositionedStack(cachedStack, 31 + x * 18, 54 + y * 18, false); stack.setMaxSize(1); ingredients.add(stack); diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java index 5414befa..3bd0a4d5 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java @@ -1,5 +1,6 @@ package minefantasy.mf2.item.armour; +import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -11,14 +12,15 @@ import minefantasy.mf2.client.render.mob.RenderVanillaHorse; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.material.BaseMaterialMF; +import net.minecraft.client.Minecraft; import net.minecraft.client.model.ModelHorse; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderHorse; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.entity.passive.EntityHorse; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraftforge.client.event.RenderLivingEvent; +import sun.java2d.pipe.RenderingEngine; public class ItemHorseArmorMF extends ItemHorseArmorMFBase { @@ -92,13 +94,4 @@ public int getColorFromItemStack(ItemStack item, int layer) { public String getArmorTexture(EntityHorse horse, ItemStack stack) { return "minefantasy2:textures/models/animal/horse/armor/standard_plate_layer_1.png"; } - - private final RenderVanillaHorse renderHorse = new RenderVanillaHorse(new ModelHorse(), 0.75F); - - @Override - public void onHorseRendered (EntityHorse horse, ItemStack armorStack, RenderLivingEvent event, byte flag) { - //If horse wearing our armor we are should use own render implementation due to vanilla restrictions. - //I just hope what you are not used other mods which works with vanilla horse renderer. Yep, this is very invasive way to color textures. - //event.setCanceled(true); - } } diff --git a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java index f62760ce..63d18a52 100644 --- a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java +++ b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java @@ -178,7 +178,7 @@ public void onHit(LivingHurtEvent event) { event.ammount = damage; //Horses has own damage watcher - if (hit instanceof EntityHorse) { + /*if (hit instanceof EntityHorse) { EntityHorse horse = (EntityHorse) event.entity; ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); @@ -186,7 +186,7 @@ public void onHit(LivingHurtEvent event) { ItemHorseArmorMFBase armor = (ItemHorseArmorMFBase) customArmor.getItem(); event.setCanceled(armor.onHorseDamaged(horse, customArmor, event.source, event.ammount)); } - } + }*/ } private void onFall(EntityLivingBase fallen, float height) { diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index 8ca17011..59fea54d 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -950,36 +950,5 @@ public void renderEntity(RenderLivingEvent.Pre event) { } } } - triggerHorseRenderHook(event, (byte) 0); - } - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void renderEntity (RenderLivingEvent.Post event) { - triggerHorseRenderHook(event, (byte) 1); - } - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void renderEntity (RenderLivingEvent.Specials.Pre event) { - triggerHorseRenderHook(event, (byte) 2); - } - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void renderEntity (RenderLivingEvent.Specials.Post event) { - triggerHorseRenderHook(event, (byte) 3); - } - - public void triggerHorseRenderHook(RenderLivingEvent event, byte flag) { - if(ASMHelper.isASMEnabled && event.entity instanceof EntityHorse) { - EntityHorse horse = (EntityHorse) event.entity; - ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); - - if (customArmor != null && customArmor.getItem() instanceof ItemHorseArmorMFBase) { - ItemHorseArmorMFBase armor = (ItemHorseArmorMFBase) customArmor.getItem(); - armor.onHorseRendered(horse, customArmor, event, flag); - } - } } } diff --git a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java index 0ceb16ba..c8c671f3 100644 --- a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java @@ -1,5 +1,8 @@ package minefantasy.mf2.network; +import minefantasy.mf2.client.render.mob.*; +import net.minecraft.client.model.ModelHorse; +import net.minecraft.entity.passive.EntityHorse; import org.lwjgl.input.Keyboard; import cpw.mods.fml.client.FMLClientHandler; @@ -101,11 +104,6 @@ import minefantasy.mf2.client.render.block.TileEntityTanningRackRenderer; import minefantasy.mf2.client.render.block.TileEntityTroughRenderer; import minefantasy.mf2.client.render.block.component.TileEntityComponentRenderer; -import minefantasy.mf2.client.render.mob.ModelHound; -import minefantasy.mf2.client.render.mob.ModelMinotaur; -import minefantasy.mf2.client.render.mob.RenderDragon; -import minefantasy.mf2.client.render.mob.RenderHound; -import minefantasy.mf2.client.render.mob.RenderMinotaur; import minefantasy.mf2.entity.EntityArrowMF; import minefantasy.mf2.entity.EntityBomb; import minefantasy.mf2.entity.EntityCogwork; @@ -226,6 +224,7 @@ public void registerEntityRenderer() { RenderingRegistry.registerEntityRenderingHandler(EntityMinotaur.class, new RenderMinotaur(new ModelMinotaur(), 1.5F)); RenderingRegistry.registerEntityRenderingHandler(EntityHound.class, new RenderHound(new ModelHound())); + RenderingRegistry.registerEntityRenderingHandler(EntityHorse.class, new RenderVanillaHorse(new ModelHorse(), 0.75F)); } @Override From 9054bc668707bba45117b18aa8f1c28e3928669f Mon Sep 17 00:00:00 2001 From: Sirse Date: Mon, 30 Oct 2017 17:26:42 +0700 Subject: [PATCH 078/101] MineTweaker fixes --- .../minefantasy/mf2/api/rpg/RPGElements.java | 2 +- .../transformers/RenderHorseTransformer.java | 33 +++ .../mf2/integration/minetweaker/Skills.java | 39 ---- .../minetweaker/tweakers/Anvil.java | 188 +++++++++--------- .../minetweaker/tweakers/CarpentersBench.java | 6 +- .../tweakers/CustomMaterialHandler.java | 12 +- 6 files changed, 134 insertions(+), 146 deletions(-) create mode 100644 src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java delete mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java diff --git a/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java b/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java index ef41a656..427cf1f3 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java +++ b/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java @@ -63,7 +63,7 @@ public static void initSkills(EntityPlayer player) { } public static Skill getSkillByName(String name) { - return skillsMap.get(name); + return skillsMap.get(name.toLowerCase()); } public static int getLevel(EntityPlayer player, Skill skill) { diff --git a/src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java b/src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java new file mode 100644 index 00000000..63cd51c6 --- /dev/null +++ b/src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java @@ -0,0 +1,33 @@ +package minefantasy.mf2.asm.transformers; + +import minefantasy.mf2.asm.ASMHelper; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.MethodNode; + +import static minefantasy.mf2.asm.Mappings.*; + +public class RenderHorseTransformer { + + public static byte[] transform(String name, String transformedName, byte[] bytes) { + ClassNode horseRenderClass = ASMHelper.createClassFromByteArray(bytes); + + injectShouldRenderPass(horseRenderClass); + //transformRenderVanillaHorse(horseRenderClass); + + return ASMHelper.createByteArrayFromClass(horseRenderClass, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); + } + + private static void transformRenderVanillaHorse(MethodNode node) { + + } + + private static void injectShouldRenderPass(ClassNode node) { + MethodNode newMethod = new MethodNode(Opcodes.ACC_PROTECTED, shouldRenderPass, "(Lnet/minecraft/entity/EntityLivingBase;IF)I", null, null); + newMethod.visitCode(); + + node.methods.add(newMethod); + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java b/src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java deleted file mode 100644 index adf026e2..00000000 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/Skills.java +++ /dev/null @@ -1,39 +0,0 @@ -package minefantasy.mf2.integration.minetweaker; - -import minefantasy.mf2.api.rpg.Skill; -import minefantasy.mf2.api.rpg.SkillList; - -public enum Skills { - - /* TODO: Rewrite */ - - Artisanry(SkillList.artisanry, "artisanry"), Construction(SkillList.construction, "construction"), Combat( - SkillList.combat, "combat"), Engineering(SkillList.engineering, - "engineering"), Provisioning(SkillList.provisioning, "provisioning"); - - private Skill s; - private String name; - - private Skills(Skill s, String name) { - this.s = s; - this.name = name; - } - - public String getName() { - return name; - } - - public Skill getSkill() { - return s; - } - - public static Skills getFromString(String name) { - for (Skills s : Skills.values()) { - if (s.getName().equalsIgnoreCase(name)) { - return s; - } - } - return null; - } - -} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java index 5573b537..2c6b37e9 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java @@ -2,8 +2,8 @@ import minefantasy.mf2.api.crafting.anvil.CraftingManagerAnvil; import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; +import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.Skill; -import minefantasy.mf2.integration.minetweaker.Skills; import minefantasy.mf2.integration.minetweaker.TweakedShapedAnvilRecipe; import minefantasy.mf2.integration.minetweaker.TweakedShapelessAnvilRecipe; import minetweaker.IUndoableAction; @@ -18,98 +18,98 @@ @ZenClass("mods.minefantasy.Anvil") public class Anvil { - @ZenMethod - public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, boolean hot, - double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { - MineTweakerAPI.apply(new AnvilAction(output, Skills.getFromString(skill).getSkill(), research, hot, (float) exp, - tool, hammer, anvil, time, ingreds)); - } - - @ZenMethod - public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, boolean hot, - double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { - MineTweakerAPI.apply(new AnvilAction(output, Skills.getFromString(skill).getSkill(), research, hot, (float) exp, - tool, hammer, anvil, time, ingreds)); - } - - public static class AnvilAction implements IUndoableAction { - - IItemStack out; - Skill s; - String research, tool; - boolean hot; - float exp; - int hammer, anvil, time; - IIngredient[][] ingreds; - IIngredient[] ingreds2; - boolean shaped; - IAnvilRecipe r; - - // private static final char[] chars = - // {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; - - public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, - int anvil, int time, IIngredient[][] ingreds) { - this.out = out; - this.s = s; - this.research = research; - this.tool = tool; - this.hot = hot; - this.exp = exp; - this.hammer = hammer; - this.anvil = anvil; - this.time = time; - this.ingreds = ingreds; - this.shaped = true; - r = new TweakedShapedAnvilRecipe(ingreds, out, tool, time, hammer, anvil, exp, hot, research, s); - } - - public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, - int anvil, int time, IIngredient[] ingreds) { - this.out = out; - this.s = s; - this.research = research; - this.tool = tool; - this.hot = hot; - this.exp = exp; - this.hammer = hammer; - this.anvil = anvil; - this.time = time; - this.ingreds2 = ingreds; - this.shaped = false; - r = new TweakedShapelessAnvilRecipe(ingreds2, out, tool, time, hammer, anvil, exp, hot, research, s); - } - - @Override - public void apply() { - CraftingManagerAnvil.getInstance().recipes.add(r); - } - - @Override - public String describe() { - return "Adding a " + (hot ? "hot" : "") + " Anvil Recipe resulting in " + MineTweakerMC.getItemStack(out); - } - - @Override - public Object getOverrideKey() { - return null; - } - - @Override - public boolean canUndo() { - return true; - } - - @Override - public String describeUndo() { - return "Undoing Anvil Recipe"; - } - - @Override - public void undo() { - CraftingManagerAnvil.getInstance().recipes.remove(r); - } - - } + @ZenMethod + public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, boolean hot, + double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { + MineTweakerAPI.apply(new AnvilAction(output, RPGElements.getSkillByName(skill), research, hot, (float) exp, + tool, hammer, anvil, time, ingreds)); + } + + @ZenMethod + public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, boolean hot, + double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { + MineTweakerAPI.apply(new AnvilAction(output, RPGElements.getSkillByName(skill), research, hot, (float) exp, + tool, hammer, anvil, time, ingreds)); + } + + public static class AnvilAction implements IUndoableAction { + + IItemStack out; + Skill s; + String research, tool; + boolean hot; + float exp; + int hammer, anvil, time; + IIngredient[][] ingreds; + IIngredient[] ingreds2; + boolean shaped; + IAnvilRecipe r; + + // private static final char[] chars = + // {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; + + public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, + int anvil, int time, IIngredient[][] ingreds) { + this.out = out; + this.s = s; + this.research = research; + this.tool = tool; + this.hot = hot; + this.exp = exp; + this.hammer = hammer; + this.anvil = anvil; + this.time = time; + this.ingreds = ingreds; + this.shaped = true; + r = new TweakedShapedAnvilRecipe(ingreds, out, tool, time, hammer, anvil, exp, hot, research, s); + } + + public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, + int anvil, int time, IIngredient[] ingreds) { + this.out = out; + this.s = s; + this.research = research; + this.tool = tool; + this.hot = hot; + this.exp = exp; + this.hammer = hammer; + this.anvil = anvil; + this.time = time; + this.ingreds2 = ingreds; + this.shaped = false; + r = new TweakedShapelessAnvilRecipe(ingreds2, out, tool, time, hammer, anvil, exp, hot, research, s); + } + + @Override + public void apply() { + CraftingManagerAnvil.getInstance().recipes.add(r); + } + + @Override + public String describe() { + return "Adding a " + (hot ? "hot" : "") + " Anvil Recipe resulting in " + MineTweakerMC.getItemStack(out); + } + + @Override + public Object getOverrideKey() { + return null; + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public String describeUndo() { + return "Undoing Anvil Recipe"; + } + + @Override + public void undo() { + CraftingManagerAnvil.getInstance().recipes.remove(r); + } + + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java index 3022e650..d71293ae 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java @@ -2,8 +2,8 @@ import minefantasy.mf2.api.crafting.carpenter.CraftingManagerCarpenter; import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; +import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.Skill; -import minefantasy.mf2.integration.minetweaker.Skills; import minefantasy.mf2.integration.minetweaker.TweakedShapedCBRecipes; import minefantasy.mf2.integration.minetweaker.TweakedShapelessCBRecipes; import minetweaker.IUndoableAction; @@ -20,14 +20,14 @@ public class CarpentersBench { @ZenMethod public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, String sound, double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { - MineTweakerAPI.apply(new CarpentersAction(output, Skills.getFromString(skill).getSkill(), research, sound, + MineTweakerAPI.apply(new CarpentersAction(output, RPGElements.getSkillByName(skill), research, sound, (float) exp, tool, hammer, anvil, time, ingreds)); } @ZenMethod public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, String sound, double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { - MineTweakerAPI.apply(new CarpentersAction(output, Skills.getFromString(skill).getSkill(), research, sound, + MineTweakerAPI.apply(new CarpentersAction(output, RPGElements.getSkillByName(skill), research, sound, (float) exp, tool, hammer, anvil, time, ingreds)); } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java index 6d3f35da..458bdd5c 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java @@ -24,16 +24,10 @@ public static CustomMaterial getMaterial(String materialName) { private static class RegisterCustomMaterial implements IUndoableAction { - private final String type; - private final String name; - private final int tier; - private final float hardness; - private final float durability; - private final float flexibility; - private final float sharpness; - private final float resistance; - private final float density; public CustomMaterial material; + private final String type, name; + private final int tier; + private final float hardness, durability, flexibility, sharpness, resistance, density; public RegisterCustomMaterial(String type, String name, int tier, float hardness, float durability, float flexibility, float sharpness, float resistance, float density) { From 2fd6f78581552b4cb491840bbc6bbca92a51f5c7 Mon Sep 17 00:00:00 2001 From: Sirse Date: Mon, 30 Oct 2017 17:31:48 +0700 Subject: [PATCH 079/101] Automatic code reformat --- .../java/minefantasy/mf2/MineFantasyII.java | 337 ++- .../minefantasy/mf2/api/MineFantasyAPI.java | 1113 ++++----- .../mf2/api/archery/AmmoMechanicsMF.java | 462 ++-- .../minefantasy/mf2/api/archery/IAmmo.java | 8 +- .../mf2/api/archery/IArrowHandler.java | 14 +- .../minefantasy/mf2/api/archery/IArrowMF.java | 28 +- .../mf2/api/archery/IArrowRetrieve.java | 18 +- .../mf2/api/archery/IDisplayMFAmmo.java | 2 +- .../minefantasy/mf2/api/archery/IFirearm.java | 18 +- .../mf2/api/archery/ISpecialBow.java | 27 +- .../mf2/api/armour/ArmourDesign.java | 247 +- .../mf2/api/armour/ArmourMaterialMF.java | 64 +- .../mf2/api/armour/CustomArmourEntry.java | 306 ++- .../api/armour/CustomDamageRatioEntry.java | 112 +- .../minefantasy/mf2/api/armour/IArmourMF.java | 27 +- .../mf2/api/armour/IArmourPenetrationMob.java | 2 +- .../mf2/api/armour/IArmourRating.java | 10 +- .../mf2/api/armour/IArmouredEntity.java | 2 +- .../mf2/api/armour/IElementalResistance.java | 40 +- .../mf2/api/armour/IGasProtector.java | 10 +- .../mf2/api/armour/IPowerArmour.java | 19 +- .../mf2/api/armour/ISpecialArmourMF.java | 24 +- .../mf2/api/armour/ItemArmourMFBase.java | 507 ++-- .../mf2/api/armour/ItemHorseArmorMFBase.java | 23 +- .../mf2/api/cooking/CookRecipe.java | 159 +- .../mf2/api/crafting/BasicTierRecipe.java | 278 +-- .../mf2/api/crafting/CustomCrafterEntry.java | 149 +- .../mf2/api/crafting/IBasicMetre.java | 6 +- .../mf2/api/crafting/IHeatSource.java | 4 +- .../mf2/api/crafting/IHeatUser.java | 2 +- .../mf2/api/crafting/IQualityBalance.java | 8 +- .../mf2/api/crafting/ISalvageDrop.java | 2 +- .../mf2/api/crafting/ISpecialSalvage.java | 10 +- .../mf2/api/crafting/ITieredComponent.java | 8 +- .../mf2/api/crafting/MineFantasyFuels.java | 125 +- .../minefantasy/mf2/api/crafting/Salvage.java | 252 +- .../api/crafting/anvil/AnvilCraftMatrix.java | 48 +- .../crafting/anvil/CraftingManagerAnvil.java | 556 +++-- .../api/crafting/anvil/CustomToolRecipe.java | 276 ++- .../mf2/api/crafting/anvil/IAnvil.java | 22 +- .../mf2/api/crafting/anvil/IAnvilRecipe.java | 46 +- .../api/crafting/anvil/RecipeSorterAnvil.java | 30 +- .../crafting/anvil/ShapedAnvilRecipes.java | 412 ++-- .../crafting/anvil/ShapelessAnvilRecipes.java | 361 +-- .../carpenter/CarpenterCraftMatrix.java | 18 +- .../carpenter/CraftingManagerCarpenter.java | 538 ++-- .../carpenter/CustomToolRecipeCarpenter.java | 204 +- .../api/crafting/carpenter/ICarpenter.java | 20 +- .../crafting/carpenter/ICarpenterRecipe.java | 46 +- .../carpenter/RecipeSorterCarpenter.java | 30 +- .../carpenter/ShapedCarpenterRecipes.java | 352 +-- .../carpenter/ShapelessCarpenterRecipes.java | 333 +-- .../api/crafting/engineer/IBombComponent.java | 12 +- .../api/crafting/engineer/ICrossbowPart.java | 64 +- .../crafting/exotic/ISpecialCraftItem.java | 2 +- .../api/crafting/exotic/ISpecialDesign.java | 2 +- .../api/crafting/exotic/SpecialForging.java | 92 +- .../mf2/api/crafting/refine/BloomRecipe.java | 93 +- .../api/crafting/refine/PaintOilRecipe.java | 92 +- .../mf2/api/crafting/refine/QuernRecipes.java | 71 +- .../api/crafting/tanning/TanningRecipe.java | 101 +- .../mf2/api/farming/CustomHoeEntry.java | 125 +- .../mf2/api/heating/ForgeFuel.java | 42 +- .../mf2/api/heating/ForgeItemHandler.java | 280 ++- .../minefantasy/mf2/api/heating/Heatable.java | 424 ++-- .../minefantasy/mf2/api/heating/IHotItem.java | 16 +- .../mf2/api/heating/IQuenchBlock.java | 12 +- .../mf2/api/heating/TongsHelper.java | 235 +- .../mf2/api/helpers/ArmourCalculator.java | 1125 +++++---- .../mf2/api/helpers/ArrowEffectsMF.java | 189 +- .../mf2/api/helpers/BlockPositionHelper.java | 160 +- .../mf2/api/helpers/ClientTickHandler.java | 42 +- .../mf2/api/helpers/CustomToolHelper.java | 1041 ++++---- .../mf2/api/helpers/EntityHelper.java | 24 +- .../mf2/api/helpers/Functions.java | 60 +- .../mf2/api/helpers/GuiHelper.java | 131 +- .../mf2/api/helpers/PlayerTagData.java | 40 +- .../mf2/api/helpers/PowerArmour.java | 136 +- .../mf2/api/helpers/RenderHelper.java | 255 +- .../mf2/api/helpers/TacticalManager.java | 950 ++++---- .../mf2/api/helpers/TextureHelperMF.java | 96 +- .../mf2/api/helpers/ToolHelper.java | 577 +++-- .../mf2/api/knowledge/IArtefact.java | 2 +- .../mf2/api/knowledge/InformationBase.java | 492 ++-- .../mf2/api/knowledge/InformationList.java | 64 +- .../mf2/api/knowledge/InformationPage.java | 205 +- .../mf2/api/knowledge/KnowledgeType.java | 22 +- .../mf2/api/knowledge/ResearchArtefacts.java | 92 +- .../mf2/api/knowledge/ResearchLogic.java | 294 +-- .../mf2/api/knowledge/client/EntryPage.java | 11 +- .../client/EntryPageBlastFurnace.java | 210 +- .../api/knowledge/client/EntryPageCraft.java | 76 +- .../knowledge/client/EntryPageCrucible.java | 302 ++- .../api/knowledge/client/EntryPageGrind.java | 200 +- .../api/knowledge/client/EntryPageImage.java | 124 +- .../client/EntryPageRecipeAnvil.java | 375 ++- .../knowledge/client/EntryPageRecipeBase.java | 428 ++-- .../client/EntryPageRecipeBloom.java | 202 +- .../client/EntryPageRecipeCarpenter.java | 365 ++- .../knowledge/client/EntryPageSmelting.java | 200 +- .../api/knowledge/client/EntryPageText.java | 112 +- .../api/knowledge/client/IGuiRecipebook.java | 8 +- .../mf2/api/material/CustomMaterial.java | 574 ++--- .../mf2/api/mining/RandomDigs.java | 155 +- .../minefantasy/mf2/api/mining/RandomOre.java | 215 +- .../minefantasy/mf2/api/refine/Alloy.java | 208 +- .../mf2/api/refine/AlloyRecipes.java | 111 +- .../mf2/api/refine/BigFurnaceRecipes.java | 71 +- .../mf2/api/refine/BlastFurnaceRecipes.java | 92 +- .../mf2/api/refine/IBellowsUseable.java | 2 +- .../mf2/api/refine/ISmokeCarrier.java | 8 +- .../mf2/api/refine/ISmokeHandler.java | 2 +- .../mf2/api/refine/SmokeMechanics.java | 257 +- .../minefantasy/mf2/api/rpg/LevelupEvent.java | 18 +- .../minefantasy/mf2/api/rpg/RPGElements.java | 227 +- .../java/minefantasy/mf2/api/rpg/Skill.java | 249 +- .../minefantasy/mf2/api/rpg/SkillList.java | 50 +- .../mf2/api/rpg/SyncSkillEvent.java | 14 +- .../mf2/api/stamina/IHeldStaminaItem.java | 6 +- .../mf2/api/stamina/IStaminaWeapon.java | 2 +- .../mf2/api/stamina/IWornStaminaItem.java | 30 +- .../mf2/api/stamina/StaminaBar.java | 1132 +++++---- .../mf2/api/tier/IToolMaterial.java | 8 +- .../mf2/api/tool/IHuntingItem.java | 8 +- .../minefantasy/mf2/api/tool/ILighter.java | 4 +- .../minefantasy/mf2/api/tool/IToolMF.java | 26 +- .../mf2/api/weapon/DamageSourceAP.java | 12 +- .../mf2/api/weapon/ICustomHitSound.java | 12 +- .../mf2/api/weapon/IDamageModifier.java | 4 +- .../mf2/api/weapon/IDamageType.java | 38 +- .../mf2/api/weapon/IKnockbackWeapon.java | 2 +- .../mf2/api/weapon/IParryable.java | 72 +- .../mf2/api/weapon/IPowerAttack.java | 4 +- .../minefantasy/mf2/api/weapon/IRackItem.java | 14 +- .../mf2/api/weapon/ISharpenable.java | 24 +- .../mf2/api/weapon/ISpecialCombatMob.java | 4 +- .../mf2/api/weapon/ISpecialEffect.java | 2 +- .../mf2/api/weapon/IWeaponClass.java | 2 +- .../mf2/api/weapon/IWeaponSpeed.java | 2 +- .../mf2/api/weapon/IWeightedWeapon.java | 10 +- .../mf2/api/weapon/WeaponClass.java | 100 +- .../java/minefantasy/mf2/asm/ASMHelper.java | 6 +- .../mf2/asm/InstructionComparator.java | 1 - .../transformers/RenderHorseTransformer.java | 2 +- .../mf2/block/basic/BasicBlockMF.java | 90 +- .../mf2/block/basic/BlockMeta.java | 90 +- .../mf2/block/basic/BlockMetalBarsMF.java | 57 +- .../mf2/block/basic/BlockMetalMF.java | 24 +- .../mf2/block/basic/BlockMythicDecor.java | 6 +- .../mf2/block/basic/BlockMythicOre.java | 32 +- .../mf2/block/basic/BlockOreMF.java | 179 +- .../mf2/block/basic/BlockPaneMF.java | 10 +- .../mf2/block/basic/BlockReinforcedStone.java | 58 +- .../mf2/block/basic/BlockWorldGenMarker.java | 18 +- .../mf2/block/basic/ConstructionBlockMF.java | 340 +-- .../mf2/block/basic/ItemMetaBlock.java | 46 +- .../mf2/block/basic/ItemOreblockMF.java | 38 +- .../mf2/block/crafting/BlockAnvilMF.java | 371 ++- .../mf2/block/crafting/BlockBombBench.java | 277 ++- .../mf2/block/crafting/BlockBombPress.java | 159 +- .../mf2/block/crafting/BlockCarpenter.java | 277 ++- .../mf2/block/crafting/BlockCogwork.java | 178 +- .../block/crafting/BlockCrossbowBench.java | 277 ++- .../block/crafting/BlockEngineerTanner.java | 24 +- .../mf2/block/crafting/BlockFirepit.java | 375 ++- .../mf2/block/crafting/BlockFrame.java | 241 +- .../mf2/block/crafting/BlockRepairKit.java | 203 +- .../block/crafting/BlockResearchStation.java | 261 +- .../mf2/block/crafting/BlockRoast.java | 249 +- .../mf2/block/crafting/BlockSalvage.java | 287 ++- .../mf2/block/crafting/BlockTanningRack.java | 247 +- .../mf2/block/crafting/ItemBlockAnvilMF.java | 24 +- .../block/crafting/ItemBlockRepairKit.java | 70 +- .../mf2/block/crafting/ItemBlockSalvage.java | 34 +- .../mf2/block/decor/BlockAmmoBox.java | 305 ++- .../mf2/block/decor/BlockBedMF.java | 614 ++--- .../mf2/block/decor/BlockComponent.java | 521 ++-- .../mf2/block/decor/BlockPowRailMF.java | 42 +- .../mf2/block/decor/BlockRack.java | 663 +++-- .../mf2/block/decor/BlockRailMF.java | 42 +- .../mf2/block/decor/BlockRoad.java | 415 ++-- .../mf2/block/decor/BlockSchematic.java | 218 +- .../mf2/block/decor/BlockTrough.java | 201 +- .../mf2/block/decor/BlockWoodDecor.java | 189 +- .../mf2/block/decor/ItemBedMF.java | 114 +- .../mf2/block/decor/ItemBlockAmmoBox.java | 92 +- .../mf2/block/decor/ItemBlockToolRack.java | 56 +- .../mf2/block/decor/ItemBlockTrough.java | 222 +- .../mf2/block/food/BlockBerryBush.java | 340 +-- .../mf2/block/food/BlockCakeMF.java | 394 +-- .../minefantasy/mf2/block/food/BlockPie.java | 8 +- .../mf2/block/food/ItemBlockBerries.java | 16 +- .../mf2/block/food/ItemBlockCake.java | 42 +- .../mf2/block/list/BlockListMF.java | 614 +++-- .../mf2/block/refining/BlockBFC.java | 216 +- .../mf2/block/refining/BlockBFH.java | 316 +-- .../mf2/block/refining/BlockBellows.java | 107 +- .../mf2/block/refining/BlockBigFurnace.java | 304 ++- .../mf2/block/refining/BlockBloomery.java | 275 ++- .../mf2/block/refining/BlockChimney.java | 238 +- .../mf2/block/refining/BlockCrucible.java | 438 ++-- .../mf2/block/refining/BlockForge.java | 585 +++-- .../mf2/block/refining/BlockQuern.java | 241 +- .../block/tileentity/TileEntityAnvilMF.java | 30 +- .../block/tileentity/TileEntityBellows.java | 202 +- .../block/tileentity/TileEntityBerryBush.java | 64 +- .../tileentity/TileEntityBigFurnace.java | 1737 +++++++------ .../block/tileentity/TileEntityBloomery.java | 620 +++-- .../block/tileentity/TileEntityBombBench.java | 796 +++--- .../block/tileentity/TileEntityBombPress.java | 46 +- .../tileentity/TileEntityCarpenterMF.java | 1075 ++++---- .../block/tileentity/TileEntityChimney.java | 350 ++- .../block/tileentity/TileEntityComponent.java | 364 +-- .../tileentity/TileEntityCrossbowBench.java | 536 ++-- .../block/tileentity/TileEntityCrucible.java | 713 +++--- .../block/tileentity/TileEntityFirepit.java | 478 ++-- .../mf2/block/tileentity/TileEntityForge.java | 1157 +++++---- .../mf2/block/tileentity/TileEntityQuern.java | 480 ++-- .../block/tileentity/TileEntityResearch.java | 592 +++-- .../mf2/block/tileentity/TileEntityRoad.java | 198 +- .../mf2/block/tileentity/TileEntityRoast.java | 636 +++-- .../tileentity/TileEntityTanningRack.java | 665 +++-- .../tileentity/TileEntityWorldGenMarker.java | 86 +- .../blastfurnace/TileEntityBlastFC.java | 571 +++-- .../blastfurnace/TileEntityBlastFH.java | 472 ++-- .../tileentity/decor/TileEntityAmmoBox.java | 405 ++- .../tileentity/decor/TileEntityRack.java | 440 ++-- .../tileentity/decor/TileEntityTrough.java | 226 +- .../tileentity/decor/TileEntityWoodDecor.java | 120 +- .../mf2/block/tree/BlockLeavesMF.java | 159 +- .../mf2/block/tree/BlockLogMF.java | 119 +- .../mf2/block/tree/BlockSaplingMF.java | 194 +- .../minefantasy/mf2/client/FontHelper.java | 52 +- .../mf2/client/KnowledgePageRegistry.java | 1754 +++++++------ .../mf2/client/gui/GuiAnvilMF.java | 181 +- .../mf2/client/gui/GuiBigFurnace.java | 90 +- .../mf2/client/gui/GuiBlastChamber.java | 53 +- .../mf2/client/gui/GuiBlastHeater.java | 71 +- .../mf2/client/gui/GuiBloomery.java | 53 +- .../mf2/client/gui/GuiBombBench.java | 71 +- .../mf2/client/gui/GuiCarpenterMF.java | 169 +- .../mf2/client/gui/GuiCrossbowBench.java | 71 +- .../mf2/client/gui/GuiCrucible.java | 95 +- .../mf2/client/gui/GuiDiscovery.java | 239 +- .../minefantasy/mf2/client/gui/GuiForge.java | 99 +- .../mf2/client/gui/GuiKnowledge.java | 1290 +++++----- .../mf2/client/gui/GuiKnowledgeEntry.java | 318 ++- .../minefantasy/mf2/client/gui/GuiQuern.java | 53 +- .../minefantasy/mf2/client/gui/GuiReload.java | 59 +- .../mf2/client/gui/GuiResearchBlock.java | 71 +- .../mf2/client/render/AnimationHandlerMF.java | 16 +- .../mf2/client/render/HudHandlerMF.java | 56 +- .../mf2/client/render/MineFantasyHUD.java | 1060 ++++---- .../mf2/client/render/ModelCogwork.java | 404 +-- .../mf2/client/render/ModelParachute.java | 166 +- .../mf2/client/render/RenderArrowMF.java | 153 +- .../mf2/client/render/RenderBomb.java | 97 +- .../mf2/client/render/RenderBombIcon.java | 115 +- .../mf2/client/render/RenderBow.java | 365 ++- .../mf2/client/render/RenderCrossbow.java | 549 +++-- .../mf2/client/render/RenderDragonBreath.java | 127 +- .../mf2/client/render/RenderFireBlast.java | 44 +- .../mf2/client/render/RenderHeavyWeapon.java | 329 ++- .../mf2/client/render/RenderLance.java | 204 +- .../mf2/client/render/RenderMine.java | 95 +- .../mf2/client/render/RenderParachute.java | 123 +- .../mf2/client/render/RenderPowerArmour.java | 1081 ++++---- .../mf2/client/render/RenderSaw.java | 115 +- .../mf2/client/render/RenderShrapnel.java | 153 +- .../mf2/client/render/RenderSpear.java | 195 +- .../mf2/client/render/RenderSword.java | 223 +- .../client/render/armour/ModelFullplate.java | 132 +- .../mf2/client/render/block/ModelAmmoBox.java | 159 +- .../mf2/client/render/block/ModelAnvil.java | 163 +- .../mf2/client/render/block/ModelBellows.java | 187 +- .../client/render/block/ModelBigFurnace.java | 206 +- .../client/render/block/ModelBloomery.java | 93 +- .../client/render/block/ModelBombBench.java | 219 +- .../client/render/block/ModelBombPress.java | 189 +- .../client/render/block/ModelCarpenter.java | 149 +- .../render/block/ModelCrossbowBench.java | 203 +- .../render/block/ModelEngTanningRack.java | 167 +- .../mf2/client/render/block/ModelFirepit.java | 139 +- .../mf2/client/render/block/ModelFoodBox.java | 99 +- .../mf2/client/render/block/ModelForge.java | 251 +- .../client/render/block/ModelForgeTop.java | 181 +- .../mf2/client/render/block/ModelOven.java | 149 +- .../mf2/client/render/block/ModelQuern.java | 97 +- .../mf2/client/render/block/ModelRack.java | 130 +- .../client/render/block/ModelResearch.java | 203 +- .../mf2/client/render/block/ModelRoast.java | 129 +- .../client/render/block/ModelSmallCrate.java | 97 +- .../client/render/block/ModelSmokePipe.java | 157 +- .../client/render/block/ModelTanningRack.java | 115 +- .../mf2/client/render/block/ModelTrough.java | 139 +- .../render/block/ModelWoodCarpenter.java | 251 +- .../client/render/block/RenderAmmoBox.java | 63 +- .../client/render/block/RenderAnvilMF.java | 61 +- .../client/render/block/RenderBellows.java | 59 +- .../client/render/block/RenderBigFurnace.java | 61 +- .../client/render/block/RenderBloomery.java | 61 +- .../client/render/block/RenderBombBench.java | 53 +- .../client/render/block/RenderBombPress.java | 53 +- .../client/render/block/RenderCarpenter.java | 53 +- .../render/block/RenderCrossbowBench.java | 53 +- .../client/render/block/RenderFirepit.java | 53 +- .../mf2/client/render/block/RenderForge.java | 61 +- .../mf2/client/render/block/RenderQuern.java | 61 +- .../mf2/client/render/block/RenderRack.java | 61 +- .../client/render/block/RenderResearch.java | 53 +- .../mf2/client/render/block/RenderRoast.java | 63 +- .../client/render/block/RenderSmokePipe.java | 65 +- .../render/block/RenderTanningRack.java | 61 +- .../mf2/client/render/block/RenderTrough.java | 61 +- .../block/TileEntityAmmoBoxRenderer.java | 193 +- .../block/TileEntityAnvilMFRenderer.java | 171 +- .../block/TileEntityBellowsRenderer.java | 181 +- .../block/TileEntityBigFurnaceRenderer.java | 368 ++- .../block/TileEntityBloomeryRenderer.java | 175 +- .../block/TileEntityBombBenchRenderer.java | 178 +- .../block/TileEntityBombPressRenderer.java | 170 +- .../block/TileEntityCarpenterRenderer.java | 167 +- .../TileEntityCrossbowBenchRenderer.java | 178 +- .../block/TileEntityFirepitRenderer.java | 88 +- .../render/block/TileEntityForgeRenderer.java | 219 +- .../render/block/TileEntityQuernRenderer.java | 79 +- .../render/block/TileEntityRackRenderer.java | 466 ++-- .../block/TileEntityResearchRenderer.java | 151 +- .../render/block/TileEntityRoastRenderer.java | 177 +- .../block/TileEntitySmokePipeRenderer.java | 79 +- .../block/TileEntityTanningRackRenderer.java | 243 +- .../block/TileEntityTroughRenderer.java | 217 +- .../render/block/component/ModelBarStack.java | 98 +- .../block/component/ModelBigPlateStack.java | 110 +- .../render/block/component/ModelJugStack.java | 80 +- .../block/component/ModelPlankStack.java | 64 +- .../render/block/component/ModelPotStack.java | 64 +- .../block/component/ModelSheetStack.java | 190 +- .../TileEntityComponentRenderer.java | 159 +- .../mf2/client/render/mob/ModelAshDragon.java | 1764 +++++++------- .../mf2/client/render/mob/ModelDragon.java | 1738 ++++++------- .../client/render/mob/ModelFrostDragon.java | 1966 +++++++-------- .../mf2/client/render/mob/ModelHound.java | 571 ++--- .../mf2/client/render/mob/ModelMinotaur.java | 625 +++-- .../client/render/mob/ModelVenomDragon.java | 2170 ++++++++--------- .../mf2/client/render/mob/RenderDragon.java | 75 +- .../mf2/client/render/mob/RenderHound.java | 119 +- .../mf2/client/render/mob/RenderMinotaur.java | 312 ++- .../minefantasy/mf2/config/ConfigArmour.java | 93 +- .../minefantasy/mf2/config/ConfigClient.java | 270 +- .../mf2/config/ConfigCrafting.java | 28 +- .../mf2/config/ConfigExperiment.java | 70 +- .../minefantasy/mf2/config/ConfigFarming.java | 30 +- .../mf2/config/ConfigHardcore.java | 178 +- .../mf2/config/ConfigIntegration.java | 43 +- .../mf2/config/ConfigItemRegistry.java | 663 +++-- .../minefantasy/mf2/config/ConfigMobs.java | 266 +- .../minefantasy/mf2/config/ConfigStamina.java | 130 +- .../minefantasy/mf2/config/ConfigTools.java | 27 +- .../minefantasy/mf2/config/ConfigWeapon.java | 47 +- .../mf2/config/ConfigWorldGen.java | 826 +++---- .../mf2/config/ConfigurationBaseMF.java | 16 +- .../mf2/container/ContainerAnvilMF.java | 194 +- .../mf2/container/ContainerBigFurnace.java | 363 ++- .../mf2/container/ContainerBlastChamber.java | 202 +- .../mf2/container/ContainerBlastHeater.java | 240 +- .../mf2/container/ContainerBloomery.java | 194 +- .../mf2/container/ContainerBombBench.java | 246 +- .../mf2/container/ContainerCarpenterMF.java | 210 +- .../mf2/container/ContainerCrossbowBench.java | 240 +- .../mf2/container/ContainerCrucible.java | 228 +- .../mf2/container/ContainerForge.java | 340 +-- .../mf2/container/ContainerQuern.java | 136 +- .../mf2/container/ContainerReload.java | 229 +- .../mf2/container/ContainerResearch.java | 200 +- .../mf2/container/ContainerRoast.java | 170 +- .../mf2/container/ContainerTanner.java | 172 +- .../mf2/container/InventoryReload.java | 166 +- .../mf2/container/SlotBombBench.java | 32 +- .../mf2/container/SlotCrucibleOut.java | 44 +- .../minefantasy/mf2/container/SlotReload.java | 22 +- .../mf2/container/SlotRestrictive.java | 22 +- .../minefantasy/mf2/entity/EntityArrowMF.java | 1843 +++++++------- .../minefantasy/mf2/entity/EntityBomb.java | 809 +++--- .../minefantasy/mf2/entity/EntityCogwork.java | 1953 ++++++++------- .../mf2/entity/EntityDamageSourceBomb.java | 10 +- .../mf2/entity/EntityDragonBreath.java | 364 ++- .../mf2/entity/EntityFireBlast.java | 491 ++-- .../mf2/entity/EntityItemUnbreakable.java | 270 +- .../minefantasy/mf2/entity/EntityMine.java | 670 ++--- .../mf2/entity/EntityParachute.java | 952 ++++---- .../mf2/entity/EntityShrapnel.java | 570 ++--- .../minefantasy/mf2/entity/EntitySmoke.java | 594 +++-- .../minefantasy/mf2/entity/Shockwave.java | 444 ++-- .../mf2/entity/list/EntityListMF.java | 62 +- .../mf2/entity/list/MobListMF.java | 98 +- .../minefantasy/mf2/entity/mob/AshBreath.java | 64 +- .../mf2/entity/mob/DamageSourceMobMF.java | 34 +- .../mf2/entity/mob/DragonBreath.java | 86 +- .../mf2/entity/mob/DragonBreed.java | 323 ++- .../mf2/entity/mob/EntityDragon.java | 1735 +++++++------ .../mf2/entity/mob/EntityFlyingMF.java | 152 +- .../mf2/entity/mob/EntityHound.java | 1091 ++++----- .../mf2/entity/mob/EntityMinotaur.java | 1377 ++++++----- .../mf2/entity/mob/EntityMobMF.java | 412 ++-- .../mf2/entity/mob/FireBreath.java | 88 +- .../mf2/entity/mob/FrostBreath.java | 96 +- .../mf2/entity/mob/MinotaurBreed.java | 421 ++-- .../mf2/entity/mob/PoisonBreath.java | 86 +- .../mf2/entity/mob/ai/AI_CommonSprint.java | 52 +- .../entity/mob/ai/AI_MinotaurFindTarget.java | 163 +- .../mf2/entity/mob/ai/hound/AI_HoundBeg.java | 120 +- .../entity/mob/ai/hound/AI_HoundFollow.java | 184 +- .../mf2/farming/FarmingHelper.java | 88 +- .../mf2/hunger/HungerSystemMF.java | 183 +- .../mf2/integration/minetweaker/MTCompat.java | 14 +- .../minetweaker/TweakedAlloyRecipe.java | 96 +- .../minetweaker/TweakedShapedAnvilRecipe.java | 231 +- .../minetweaker/TweakedShapedCBRecipes.java | 227 +- .../TweakedShapelessAnvilRecipe.java | 253 +- .../TweakedShapelessCBRecipes.java | 249 +- .../minetweaker/tweakers/Bloomery.java | 79 +- .../minetweaker/tweakers/CarpentersBench.java | 184 +- .../minetweaker/tweakers/Crucible.java | 86 +- .../tweakers/CustomMaterialHandler.java | 2 +- .../minetweaker/tweakers/Forge.java | 84 +- .../minetweaker/tweakers/TanningRack.java | 90 +- .../integration/nei/MFPositionedStack.java | 102 +- .../mf2/integration/nei/NEIConfig.java | 80 +- .../integration/nei/RecipeHandlerAnvil.java | 14 +- .../nei/RecipeHandlerBigFurnace.java | 191 +- .../nei/RecipeHandlerBlastFurnace.java | 139 +- .../integration/nei/RecipeHandlerBloom.java | 203 +- .../nei/RecipeHandlerCarpenter.java | 281 ++- .../nei/RecipeHandlerCrucible.java | 205 +- .../integration/nei/RecipeHandlerQuern.java | 227 +- .../integration/nei/RecipeHandlerTanning.java | 112 +- .../mf2/item/AdvancedFuelHandlerMF.java | 50 +- .../minefantasy/mf2/item/ClientItemsMF.java | 25 +- .../minefantasy/mf2/item/FuelHandlerMF.java | 32 +- .../minefantasy/mf2/item/ItemArtefact.java | 276 +-- .../minefantasy/mf2/item/ItemBandage.java | 297 ++- .../minefantasy/mf2/item/ItemBurntFood.java | 50 +- .../minefantasy/mf2/item/ItemComponentMF.java | 582 +++-- .../minefantasy/mf2/item/ItemFilledMould.java | 208 +- .../java/minefantasy/mf2/item/ItemHide.java | 129 +- .../java/minefantasy/mf2/item/ItemMFBowl.java | 108 +- .../minefantasy/mf2/item/ItemRawOreMF.java | 14 +- .../mf2/item/ItemResearchBook.java | 66 +- .../minefantasy/mf2/item/ItemSkillBook.java | 104 +- .../mf2/item/ItemSpecialDesign.java | 18 +- .../mf2/item/ItemWorldGenPlacer.java | 204 +- .../mf2/item/archery/ArrowFireFlint.java | 80 +- .../mf2/item/archery/ArrowFirerMF.java | 92 +- .../mf2/item/archery/ArrowType.java | 73 +- .../mf2/item/archery/EnumBowType.java | 56 +- .../mf2/item/archery/ItemArrowMF.java | 438 ++-- .../mf2/item/archery/ItemBowMF.java | 920 ++++--- .../mf2/item/armour/ItemApron.java | 20 +- .../mf2/item/armour/ItemArmourMF.java | 808 +++--- .../mf2/item/armour/ItemClothingMF.java | 75 +- .../mf2/item/armour/ItemCustomArmour.java | 373 ++- .../mf2/item/armour/ItemHorseArmorMF.java | 7 - .../mf2/item/custom/ItemCustomComponent.java | 366 ++- .../minefantasy/mf2/item/food/FoodListMF.java | 343 ++- .../minefantasy/mf2/item/food/ItemFoodMF.java | 614 +++-- .../mf2/item/food/ItemMultiFood.java | 80 +- .../mf2/item/food/ItemUnfinishedFood.java | 58 +- .../mf2/item/gadget/EnumCasingType.java | 54 +- .../mf2/item/gadget/EnumExplosiveType.java | 36 +- .../mf2/item/gadget/EnumFuseType.java | 26 +- .../mf2/item/gadget/EnumPowderType.java | 30 +- .../minefantasy/mf2/item/gadget/IScope.java | 2 +- .../mf2/item/gadget/ItemArtefactLoot.java | 10 +- .../minefantasy/mf2/item/gadget/ItemBomb.java | 583 +++-- .../mf2/item/gadget/ItemBombComponent.java | 94 +- .../mf2/item/gadget/ItemClimbingPick.java | 357 ++- .../mf2/item/gadget/ItemCrossbow.java | 955 ++++---- .../mf2/item/gadget/ItemCrossbowPart.java | 280 ++- .../mf2/item/gadget/ItemCrudeBomb.java | 176 +- .../mf2/item/gadget/ItemExplodingArrow.java | 106 +- .../mf2/item/gadget/ItemExplodingBolt.java | 94 +- .../minefantasy/mf2/item/gadget/ItemJug.java | 257 +- .../mf2/item/gadget/ItemLootSack.java | 430 ++-- .../minefantasy/mf2/item/gadget/ItemMine.java | 457 ++-- .../mf2/item/gadget/ItemParachute.java | 38 +- .../mf2/item/gadget/ItemSpyglass.java | 106 +- .../mf2/item/gadget/ItemSyringe.java | 360 ++- .../mf2/item/gadget/MobSpawnerMF.java | 224 +- .../mf2/item/heatable/ItemHeated.java | 654 ++--- .../mf2/item/list/ArmourListMF.java | 94 +- .../mf2/item/list/ComponentListMF.java | 500 ++-- .../mf2/item/list/CreativeTabMF.java | 1 - .../mf2/item/list/CustomArmourListMF.java | 100 +- .../mf2/item/list/CustomToolListMF.java | 245 +- .../minefantasy/mf2/item/list/ToolListMF.java | 666 +++-- .../item/list/styles/DragonforgedStyle.java | 432 ++-- .../mf2/item/list/styles/OrnateStyle.java | 416 ++-- .../minefantasy/mf2/item/tool/ItemAxeMF.java | 347 ++- .../minefantasy/mf2/item/tool/ItemHoeMF.java | 276 ++- .../mf2/item/tool/ItemLighterMF.java | 136 +- .../minefantasy/mf2/item/tool/ItemPickMF.java | 443 ++-- .../mf2/item/tool/ItemShearsMF.java | 290 ++- .../mf2/item/tool/ItemSpadeMF.java | 345 ++- .../mf2/item/tool/ToolMaterialMF.java | 20 +- .../mf2/item/tool/advanced/ItemHandpick.java | 499 ++-- .../mf2/item/tool/advanced/ItemHvyPick.java | 445 ++-- .../mf2/item/tool/advanced/ItemHvyShovel.java | 469 ++-- .../mf2/item/tool/advanced/ItemLumberAxe.java | 282 +-- .../mf2/item/tool/advanced/ItemMattock.java | 427 ++-- .../mf2/item/tool/advanced/ItemScythe.java | 658 +++-- .../mf2/item/tool/advanced/ItemTrowMF.java | 459 ++-- .../tool/crafting/ItemBasicCraftTool.java | 224 +- .../item/tool/crafting/ItemEAnvilTools.java | 34 +- .../item/tool/crafting/ItemEngineerTool.java | 116 +- .../mf2/item/tool/crafting/ItemHammer.java | 423 ++-- .../mf2/item/tool/crafting/ItemKnifeMF.java | 435 ++-- .../mf2/item/tool/crafting/ItemNeedle.java | 309 ++- .../item/tool/crafting/ItemPaintBrush.java | 202 +- .../mf2/item/tool/crafting/ItemSaw.java | 497 ++-- .../mf2/item/tool/crafting/ItemSpanner.java | 419 ++-- .../mf2/item/tool/crafting/ItemTongs.java | 527 ++-- .../mf2/item/weapon/ItemBattleaxeMF.java | 346 +-- .../mf2/item/weapon/ItemDagger.java | 230 +- .../mf2/item/weapon/ItemGreatswordMF.java | 228 +- .../mf2/item/weapon/ItemHalbeardMF.java | 182 +- .../mf2/item/weapon/ItemHeavyWeaponMF.java | 222 +- .../mf2/item/weapon/ItemKatanaMF.java | 300 +-- .../mf2/item/weapon/ItemLance.java | 218 +- .../mf2/item/weapon/ItemMaceMF.java | 170 +- .../mf2/item/weapon/ItemSpearMF.java | 318 +-- .../mf2/item/weapon/ItemSwordMF.java | 150 +- .../mf2/item/weapon/ItemWaraxeMF.java | 350 +-- .../mf2/item/weapon/ItemWarhammerMF.java | 178 +- .../mf2/item/weapon/ItemWeaponMF.java | 1570 ++++++------ .../mf2/knowledge/ArtefactListMF.java | 274 +-- .../mf2/knowledge/KnowledgeListMF.java | 972 ++++---- .../mf2/material/BaseMaterialMF.java | 540 ++-- .../mf2/material/LeatherMaterial.java | 36 +- .../mf2/material/MetalMaterial.java | 267 +- .../mf2/material/WoodMaterial.java | 137 +- .../mf2/mechanics/ArrowHandlerMF.java | 264 +- .../mf2/mechanics/ArrowListMF.java | 26 +- .../mf2/mechanics/BombDispenser.java | 104 +- .../mf2/mechanics/CombatMechanics.java | 1759 ++++++------- .../mf2/mechanics/EventManagerMF.java | 1713 +++++++------ .../mf2/mechanics/ExtendedReachMF.java | 166 +- .../mf2/mechanics/HitSoundGenerator.java | 74 +- .../mf2/mechanics/MFArrowDispenser.java | 66 +- .../mf2/mechanics/MonsterUpgrader.java | 335 ++- .../mf2/mechanics/PlayerTickHandlerMF.java | 733 +++--- .../mf2/mechanics/StaminaMechanics.java | 416 ++-- .../minefantasy/mf2/mechanics/TierHelper.java | 34 +- .../worldGen/WorldGenBiological.java | 200 +- .../mf2/mechanics/worldGen/WorldGenBush.java | 44 +- .../worldGen/WorldGenDuelMinable.java | 134 +- .../worldGen/WorldGenGeological.java | 258 +- .../mechanics/worldGen/WorldGenMFBase.java | 24 +- .../mechanics/worldGen/WorldGenMFTree.java | 888 +++---- .../mechanics/worldGen/WorldGenMinableMF.java | 130 +- .../worldGen/WorldGenStructures.java | 200 +- .../worldGen/structure/LootTypes.java | 12 +- .../structure/StructureGenAFRoom.java | 183 +- .../structure/StructureGenAncientAlter.java | 198 +- .../structure/StructureGenAncientForge.java | 290 +-- .../StructureGenAncientForgeEntry.java | 90 +- .../worldGen/structure/StructureModuleMF.java | 716 +++--- .../structure/WorldGenAncientAlter.java | 46 +- .../structure/WorldGenAncientForge.java | 98 +- .../structure/WorldGenStructureBase.java | 122 +- .../dwarven/StructureDSSurfaceAppendage.java | 426 ++-- .../dwarven/StructureGenDSCrossroads.java | 491 ++-- .../dwarven/StructureGenDSEntry.java | 390 ++- .../structure/dwarven/StructureGenDSHall.java | 467 ++-- .../dwarven/StructureGenDSIntersection.java | 262 +- .../structure/dwarven/StructureGenDSRoom.java | 1000 ++++---- .../dwarven/StructureGenDSRoomSml.java | 308 +-- .../dwarven/StructureGenDSRoomSml2.java | 310 +-- .../dwarven/StructureGenDSStairs.java | 485 ++-- .../dwarven/WorldGenDwarvenStronghold.java | 108 +- .../mf2/network/ClientProxyMF.java | 556 ++--- .../mf2/network/CommonProxyMF.java | 276 +-- .../minefantasy/mf2/network/NetworkUtils.java | 2 +- .../mf2/network/packet/AmmoBoxPacket.java | 82 +- .../mf2/network/packet/AnvilPacket.java | 138 +- .../mf2/network/packet/BigFurnacePacket.java | 104 +- .../mf2/network/packet/BloomeryPacket.java | 82 +- .../mf2/network/packet/BombBenchPacket.java | 92 +- .../mf2/network/packet/CarpenterPacket.java | 118 +- .../mf2/network/packet/ChimneyPacket.java | 80 +- .../network/packet/CogworkControlPacket.java | 86 +- .../network/packet/CrossbowBenchPacket.java | 92 +- .../mf2/network/packet/DodgeCommand.java | 68 +- .../mf2/network/packet/ForgePacket.java | 104 +- .../mf2/network/packet/HitSoundPacket.java | 58 +- .../mf2/network/packet/KnowledgePacket.java | 106 +- .../mf2/network/packet/LevelupPacket.java | 88 +- .../mf2/network/packet/PacketHandlerMF.java | 110 +- .../mf2/network/packet/PacketMF.java | 16 +- .../mf2/network/packet/ParryPacket.java | 68 +- .../mf2/network/packet/RackCommand.java | 92 +- .../mf2/network/packet/ResearchRequest.java | 82 +- .../network/packet/ResearchTablePacket.java | 102 +- .../mf2/network/packet/RoadPacket.java | 104 +- .../mf2/network/packet/SkillPacket.java | 96 +- .../mf2/network/packet/StaminaPacket.java | 82 +- .../network/packet/StorageBlockPacket.java | 104 +- .../mf2/network/packet/TannerPacket.java | 72 +- .../network/packet/TileInventoryPacket.java | 92 +- .../mf2/network/packet/TroughPacket.java | 72 +- .../mf2/network/packet/WoodDecorPacket.java | 72 +- .../mf2/recipe/BasicRecipesMF.java | 414 ++-- .../mf2/recipe/CarpenterRecipes.java | 1902 +++++++-------- .../mf2/recipe/ComponentAnvilRecipe.java | 112 +- .../mf2/recipe/CookingRecipes.java | 210 +- .../mf2/recipe/CustomWoodRecipes.java | 136 +- .../mf2/recipe/ForgedArmourRecipes.java | 482 ++-- .../mf2/recipe/ForgedToolRecipes.java | 626 ++--- .../mf2/recipe/ForgingRecipes.java | 955 ++++---- .../mf2/recipe/RecipeArmourDyeMF.java | 250 +- .../minefantasy/mf2/recipe/RecipeRemover.java | 36 +- .../minefantasy/mf2/recipe/RecipeSyringe.java | 120 +- .../mf2/recipe/SalvageRecipes.java | 246 +- .../mf2/recipe/SmeltingRecipesMF.java | 248 +- .../minefantasy/mf2/recipe/TempRecipesMF.java | 100 +- .../minefantasy/mf2/util/BukkitUtils.java | 134 +- .../java/minefantasy/mf2/util/MFLogUtil.java | 35 +- .../java/minefantasy/mf2/util/XSTRandom.java | 60 +- .../java/mods/battlegear2/api/IAllowItem.java | 10 +- .../mods/battlegear2/api/IDefaultRender.java | 51 +- .../java/mods/battlegear2/api/IDyable.java | 28 +- .../mods/battlegear2/api/IEnchantable.java | 18 +- .../mods/battlegear2/api/IOffhandDual.java | 106 +- .../java/mods/battlegear2/api/ISheathed.java | 15 +- .../battlegear2/api/PlayerEventChild.java | 438 ++-- .../battlegear2/api/RenderItemBarEvent.java | 126 +- .../battlegear2/api/core/IBattlePlayer.java | 18 +- .../battlegear2/api/core/IOffhandRender.java | 18 +- .../api/core/InventoryPlayerBattle.java | 699 +++--- .../api/core/InventorySlotType.java | 24 +- .../mods/battlegear2/api/heraldry/Crest.java | 136 +- .../api/heraldry/HeraldryData.java | 305 ++- .../api/heraldry/HeraldryDataBackup.java | 282 ++- .../api/heraldry/HeraldryPattern.java | 83 +- .../api/heraldry/HeraldryTextureSmall.java | 38 +- .../battlegear2/api/heraldry/IFlagHolder.java | 72 +- .../api/heraldry/IHeraldryItem.java | 90 +- .../api/heraldry/IHeraldyArmour.java | 4 +- .../mods/battlegear2/api/heraldry/ITool.java | 8 +- .../api/heraldry/PatternStore.java | 221 +- .../api/heraldry/RefreshableTexture.java | 94 +- .../api/quiver/IArrowContainer2.java | 215 +- .../api/quiver/IArrowFireHandler.java | 50 +- .../api/quiver/IQuiverSelection.java | 20 +- .../api/quiver/QuiverArrowRegistry.java | 405 ++- .../battlegear2/api/shield/IArrowCatcher.java | 21 +- .../battlegear2/api/shield/IArrowDisplay.java | 7 +- .../mods/battlegear2/api/shield/IShield.java | 153 +- .../battlegear2/api/shield/ShieldType.java | 112 +- .../api/weapons/IBackStabbable.java | 16 +- .../api/weapons/IExtendedReachWeapon.java | 16 +- .../api/weapons/IHitTimeModifier.java | 11 +- .../api/weapons/IPenetrateWeapon.java | 17 +- .../api/weapons/IPotionEffect.java | 29 +- .../api/weapons/ISpecialEffect.java | 14 +- .../api/weapons/WeaponRegistry.java | 159 +- .../resources/assets/minefantasy2/sounds.json | 373 ++- src/main/resources/mcmod.info | 30 +- 668 files changed, 78759 insertions(+), 80188 deletions(-) diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 5ba34f06..477ec6fb 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -1,7 +1,5 @@ package minefantasy.mf2; -import java.io.File; - import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Mod; @@ -20,19 +18,7 @@ import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.armour.CustomArmourEntry; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.config.ConfigArmour; -import minefantasy.mf2.config.ConfigClient; -import minefantasy.mf2.config.ConfigCrafting; -import minefantasy.mf2.config.ConfigExperiment; -import minefantasy.mf2.config.ConfigFarming; -import minefantasy.mf2.config.ConfigHardcore; -import minefantasy.mf2.config.ConfigIntegration; -import minefantasy.mf2.config.ConfigItemRegistry; -import minefantasy.mf2.config.ConfigMobs; -import minefantasy.mf2.config.ConfigStamina; -import minefantasy.mf2.config.ConfigTools; -import minefantasy.mf2.config.ConfigWeapon; -import minefantasy.mf2.config.ConfigWorldGen; +import minefantasy.mf2.config.*; import minefantasy.mf2.integration.minetweaker.MTCompat; import minefantasy.mf2.item.gadget.ItemLootSack; import minefantasy.mf2.item.list.ComponentListMF; @@ -55,169 +41,170 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; +import java.io.File; + /** * @author Anonymous Productions */ @Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);required-after:FML@[5.0.5,);after:NotEnoughItems;after:MineTweaker3", version = MineFantasyII.VERSION) public class MineFantasyII { - public static final String MODID = "minefantasy2"; - public static final String NAME = "MineFantasyII"; - public static final String VERSION = "Alpha_2.8.14.3u"; - public static final WorldGenMFBase worldGenManager = new WorldGenMFBase(); - - @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") - public static CommonProxyMF proxy; - public static PacketHandlerMF packetHandler; - - @Instance(MODID) - public static MineFantasyII instance; - - //Up to 30% faster random implementation. - public static XSTRandom random = new XSTRandom(); - - @EventHandler - public void preInit(FMLPreInitializationEvent event) { - NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy); - if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { - new ConfigClient().setConfig(getCfg(event, "Client")); - } - new ConfigArmour().setConfig(getCfg(event, "Armours")); - new ConfigExperiment().setConfig(getCfg(event, "Specials")); - new ConfigHardcore().setConfig(getCfg(event, "Hardcore")); - new ConfigIntegration().setConfig(getCfg(event, "Integration")); - new ConfigTools().setConfig(getCfg(event, "Tools")); - new ConfigWeapon().setConfig(getCfg(event, "Weapons")); - new ConfigStamina().setConfig(getCfg(event, "Stamina_System")); - new ConfigItemRegistry().setConfig(getCfg(event, "Item_Registry")); - new ConfigFarming().setConfig(getCfg(event, "Farming")); - new ConfigWorldGen().setConfig(getCfg(event, "WorldGen")); - new ConfigCrafting().setConfig(getCfg(event, "Crafting")); - new ConfigMobs().setConfig(getCfg(event, "Mobs")); - - BaseMaterialMF.init(); - MineFantasyAPI.isInDebugMode = isDebug(); - MFLogUtil.log("API Debug mode updated: " + MineFantasyAPI.isInDebugMode); - - addModFlags(); - proxy.preInit(); - - RecipeRemover.removeRecipes(); - ToolListMF.load(); - ComponentListMF.load(); - } - - @EventHandler - public void load(FMLInitializationEvent evt) { - MinecraftForge.EVENT_BUS.register(this); - proxy.registerMain(); - GameRegistry.registerWorldGenerator(worldGenManager, 0); - - packetHandler = new PacketHandlerMF(); - FMLEventChannel eventChannel; - for (String channel : packetHandler.packetList.keySet()) { - eventChannel = NetworkRegistry.INSTANCE.newEventDrivenChannel(channel); - eventChannel.register(packetHandler); - packetHandler.channels.put(channel, eventChannel); - } - - if (Loader.isModLoaded("MineTweaker3") && ConfigIntegration.mtIntegration) { - MTCompat.loadTweakers(); - } - } - - @EventHandler - public void modsLoaded(FMLPostInitializationEvent evt) { - CustomArmourEntry.registerItem(Items.leather_helmet, ArmourDesign.LEATHER); - CustomArmourEntry.registerItem(Items.leather_chestplate, ArmourDesign.LEATHER); - CustomArmourEntry.registerItem(Items.leather_leggings, ArmourDesign.LEATHER); - CustomArmourEntry.registerItem(Items.leather_boots, ArmourDesign.LEATHER); - - CustomArmourEntry.registerItem(Items.chainmail_helmet, ArmourDesign.MAIL); - CustomArmourEntry.registerItem(Items.chainmail_chestplate, ArmourDesign.MAIL); - CustomArmourEntry.registerItem(Items.chainmail_leggings, ArmourDesign.MAIL); - CustomArmourEntry.registerItem(Items.chainmail_boots, ArmourDesign.MAIL); - - CustomArmourEntry.registerItem(Items.golden_helmet, ArmourDesign.SOLID, 1.5F, "medium"); - CustomArmourEntry.registerItem(Items.golden_chestplate, ArmourDesign.SOLID, 1.5F, "medium"); - CustomArmourEntry.registerItem(Items.golden_leggings, ArmourDesign.SOLID, 1.5F, "medium"); - CustomArmourEntry.registerItem(Items.golden_boots, ArmourDesign.SOLID, 1.5F, "medium"); - - ConfigItemRegistry.readCustoms(); - - for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) { - registerBiomeStuff(biome); - } - KnowledgeListMF.init(); - ArtefactListMF.init(); - BasicRecipesMF.init(); - ItemLootSack.addItems(); - proxy.postInit(); - proxy.registerTickHandlers(); - MetalMaterial.addHeatables(); - } - - @EventHandler - public final void serverStarted(FMLServerStartedEvent event) { - if (event.getSide() != Side.CLIENT && isBukkitServer()) { - MFLogUtil.log("Bukkit has been detected"); - BukkitUtils.onServerStarted(); - } - } - - private void registerBiomeStuff(BiomeGenBase biome) { - if (WorldGenBiological.isBiomeInConstraint(biome, ConfigWorldGen.berryMinTemp, ConfigWorldGen.berryMaxTemp, - ConfigWorldGen.berryMinRain, ConfigWorldGen.berryMaxRain)) { - biome.addFlower(BlockListMF.berryBush, 0, 5); - } - } - - private static Configuration getCfg(FMLPreInitializationEvent event, String name) { - return new Configuration(new File(event.getModConfigurationDirectory(), "MineFantasyII/" + name + ".cfg")); - } - - private void addModFlags() { - isBGLoaded = setIsBGLoaded(); - isBukkitServer = setIsBukkitServer(); - } - - public static boolean isBGLoaded() { - return isBGLoaded; - } - - public static boolean isBukkitServer() { - return isBukkitServer; - } - - public static boolean setIsBGLoaded() { - try { - Class.forName("mods.battlegear2.Battlegear"); - // return Loader.isModLoaded("battlegear2"); - } catch (ClassNotFoundException e) { - return false; - } - return true; - } - - public static boolean setIsBukkitServer() { - try { - Class.forName("org.spigotmc.SpigotConfig"); - } catch (ClassNotFoundException e) { - return false; - } - return true; - } - - public static boolean isDebug() { - return ConfigExperiment.debug.equals("AU32-Db42-Acf6-Ggh9-9E8d"); - } - - private static boolean isBGLoaded; - private static boolean isBukkitServer; - - /** - * Determines if a player name is that of a MF modder - */ - public static boolean isNameModder(String name) { - return name.equals("Galactic_Hiker") || name.equals("tim4200") || name.equals("Sirse"); - } + public static final String MODID = "minefantasy2"; + public static final String NAME = "MineFantasyII"; + public static final String VERSION = "Alpha_2.8.14.3u"; + public static final WorldGenMFBase worldGenManager = new WorldGenMFBase(); + + @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") + public static CommonProxyMF proxy; + public static PacketHandlerMF packetHandler; + + @Instance(MODID) + public static MineFantasyII instance; + + //Up to 30% faster random implementation. + public static XSTRandom random = new XSTRandom(); + private static boolean isBGLoaded; + private static boolean isBukkitServer; + + private static Configuration getCfg(FMLPreInitializationEvent event, String name) { + return new Configuration(new File(event.getModConfigurationDirectory(), "MineFantasyII/" + name + ".cfg")); + } + + public static boolean isBGLoaded() { + return isBGLoaded; + } + + public static boolean isBukkitServer() { + return isBukkitServer; + } + + public static boolean setIsBGLoaded() { + try { + Class.forName("mods.battlegear2.Battlegear"); + // return Loader.isModLoaded("battlegear2"); + } catch (ClassNotFoundException e) { + return false; + } + return true; + } + + public static boolean setIsBukkitServer() { + try { + Class.forName("org.spigotmc.SpigotConfig"); + } catch (ClassNotFoundException e) { + return false; + } + return true; + } + + public static boolean isDebug() { + return ConfigExperiment.debug.equals("AU32-Db42-Acf6-Ggh9-9E8d"); + } + + /** + * Determines if a player name is that of a MF modder + */ + public static boolean isNameModder(String name) { + return name.equals("Galactic_Hiker") || name.equals("tim4200") || name.equals("Sirse"); + } + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy); + if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { + new ConfigClient().setConfig(getCfg(event, "Client")); + } + new ConfigArmour().setConfig(getCfg(event, "Armours")); + new ConfigExperiment().setConfig(getCfg(event, "Specials")); + new ConfigHardcore().setConfig(getCfg(event, "Hardcore")); + new ConfigIntegration().setConfig(getCfg(event, "Integration")); + new ConfigTools().setConfig(getCfg(event, "Tools")); + new ConfigWeapon().setConfig(getCfg(event, "Weapons")); + new ConfigStamina().setConfig(getCfg(event, "Stamina_System")); + new ConfigItemRegistry().setConfig(getCfg(event, "Item_Registry")); + new ConfigFarming().setConfig(getCfg(event, "Farming")); + new ConfigWorldGen().setConfig(getCfg(event, "WorldGen")); + new ConfigCrafting().setConfig(getCfg(event, "Crafting")); + new ConfigMobs().setConfig(getCfg(event, "Mobs")); + + BaseMaterialMF.init(); + MineFantasyAPI.isInDebugMode = isDebug(); + MFLogUtil.log("API Debug mode updated: " + MineFantasyAPI.isInDebugMode); + + addModFlags(); + proxy.preInit(); + + RecipeRemover.removeRecipes(); + ToolListMF.load(); + ComponentListMF.load(); + } + + @EventHandler + public void load(FMLInitializationEvent evt) { + MinecraftForge.EVENT_BUS.register(this); + proxy.registerMain(); + GameRegistry.registerWorldGenerator(worldGenManager, 0); + + packetHandler = new PacketHandlerMF(); + FMLEventChannel eventChannel; + for (String channel : packetHandler.packetList.keySet()) { + eventChannel = NetworkRegistry.INSTANCE.newEventDrivenChannel(channel); + eventChannel.register(packetHandler); + packetHandler.channels.put(channel, eventChannel); + } + + if (Loader.isModLoaded("MineTweaker3") && ConfigIntegration.mtIntegration) { + MTCompat.loadTweakers(); + } + } + + @EventHandler + public void modsLoaded(FMLPostInitializationEvent evt) { + CustomArmourEntry.registerItem(Items.leather_helmet, ArmourDesign.LEATHER); + CustomArmourEntry.registerItem(Items.leather_chestplate, ArmourDesign.LEATHER); + CustomArmourEntry.registerItem(Items.leather_leggings, ArmourDesign.LEATHER); + CustomArmourEntry.registerItem(Items.leather_boots, ArmourDesign.LEATHER); + + CustomArmourEntry.registerItem(Items.chainmail_helmet, ArmourDesign.MAIL); + CustomArmourEntry.registerItem(Items.chainmail_chestplate, ArmourDesign.MAIL); + CustomArmourEntry.registerItem(Items.chainmail_leggings, ArmourDesign.MAIL); + CustomArmourEntry.registerItem(Items.chainmail_boots, ArmourDesign.MAIL); + + CustomArmourEntry.registerItem(Items.golden_helmet, ArmourDesign.SOLID, 1.5F, "medium"); + CustomArmourEntry.registerItem(Items.golden_chestplate, ArmourDesign.SOLID, 1.5F, "medium"); + CustomArmourEntry.registerItem(Items.golden_leggings, ArmourDesign.SOLID, 1.5F, "medium"); + CustomArmourEntry.registerItem(Items.golden_boots, ArmourDesign.SOLID, 1.5F, "medium"); + + ConfigItemRegistry.readCustoms(); + + for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) { + registerBiomeStuff(biome); + } + KnowledgeListMF.init(); + ArtefactListMF.init(); + BasicRecipesMF.init(); + ItemLootSack.addItems(); + proxy.postInit(); + proxy.registerTickHandlers(); + MetalMaterial.addHeatables(); + } + + @EventHandler + public final void serverStarted(FMLServerStartedEvent event) { + if (event.getSide() != Side.CLIENT && isBukkitServer()) { + MFLogUtil.log("Bukkit has been detected"); + BukkitUtils.onServerStarted(); + } + } + + private void registerBiomeStuff(BiomeGenBase biome) { + if (WorldGenBiological.isBiomeInConstraint(biome, ConfigWorldGen.berryMinTemp, ConfigWorldGen.berryMaxTemp, + ConfigWorldGen.berryMinRain, ConfigWorldGen.berryMaxRain)) { + biome.addFlower(BlockListMF.berryBush, 0, 5); + } + } + + private void addModFlags() { + isBGLoaded = setIsBGLoaded(); + isBukkitServer = setIsBukkitServer(); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java b/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java index 11186461..a1d792ea 100644 --- a/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java +++ b/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java @@ -1,12 +1,6 @@ package minefantasy.mf2.api; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; - import com.google.common.collect.Lists; - import cpw.mods.fml.common.IFuelHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -32,598 +26,519 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; + public class MineFantasyAPI { - /** - * This variable saves if MineFantasy is in debug mode - */ - public static boolean isInDebugMode; - - @SideOnly(Side.CLIENT) - public static void init() { - } - - public static void debugMsg(String msg) { - MFLogUtil.logDebug(msg); - } - - public static void removeAllRecipes(Item result) { - List recipeList = CraftingManager.getInstance().getRecipeList(); - for (int i = 0; i < recipeList.size(); i++) { - IRecipe recipe = (IRecipe) recipeList.get(i); - if (recipe != null && recipe.getRecipeOutput() != null && recipe.getRecipeOutput().getItem() == result) { - debugMsg("Removed Recipe for " + recipe.getRecipeOutput().getDisplayName()); - } - } - } - - /** - * Adds a shaped recipe for anvils with all variables - * - * @param result - * The output item - * @param hot - * True if the result is hot(Does not apply to blocks) - * @param experiance - * the experiance gained from crafting - * @param toolType - * the tool type required to hit ("hammer", "hvyHammer", etc) - * @param hammerType - * the hammer tier required for creation: - * @param anvil - * the anvil required bronze 0, iron 1, steel 2 - * @param forgeTime - * The time taken to forge(default is 200. each hit is about 100) - * @param input - * The input for the item (Exactly the same as regular recipes) - */ - public static void addAnvilRecipe(Skill skill, ItemStack result, boolean hot, String toolType, int hammerType, - int anvil, int forgeTime, Object... input) { - CraftingManagerAnvil.getInstance().addRecipe(result, skill, "", hot, 0F, toolType, hammerType, anvil, forgeTime, - input); - } - - /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static void addAnvilRecipe(Skill skill, ItemStack result, boolean hot, int hammerType, int anvil, - int forgeTime, Object... input) { - addAnvilRecipe(skill, result, hot, "hammer", hammerType, anvil, forgeTime, input); - } - - /** - * Adds a shaped recipe for anvils with all variables - * - * @param result - * The output item - * @param research - * The research required - * @param hot - * True if the result is hot(Does not apply to blocks) - * @param experiance - * the experiance gained from crafting - * @param toolType - * the tool type required to hit ("hammer", "hvyHammer", etc) - * @param hammerType - * the hammer tier required for creation: - * @param anvil - * the anvil required bronze 0, iron 1, steel 2 - * @param forgeTime - * The time taken to forge(default is 200. each hit is about 100) - * @param input - * The input for the item (Exactly the same as regular recipes) - */ - public static IAnvilRecipe addAnvilRecipe(Skill skill, ItemStack result, String research, boolean hot, - String toolType, int hammerType, int anvil, int forgeTime, Object... input) { - return CraftingManagerAnvil.getInstance().addRecipe(result, skill, research, hot, 0F, toolType, hammerType, - anvil, forgeTime, input); - } - - /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static IAnvilRecipe addAnvilRecipe(Skill skill, ItemStack result, String research, boolean hot, - int hammerType, int anvil, int forgeTime, Object... input) { - return addAnvilRecipe(skill, result, research, hot, "hammer", hammerType, anvil, forgeTime, input); - } - - /** - * A special tier-sensitive recipe system for tools - * - * @param skill - * the Skill used - * @param result - * what item comes out (basic itemstack) - * @param research - * what research is used - * @param hot - * whether it requires quenching - * @param toolType - * the tool used (hammer or hvyHammer) - * @param hammerType - * the tier of hammer - * @param anvil - * the tier of anvil - * @param forgeTime - * the time it takes to forge - * @param input - * the items input - * @return - */ - public static IAnvilRecipe addAnvilToolRecipe(Skill skill, ItemStack result, String research, boolean hot, - String toolType, int hammerType, int anvil, int forgeTime, Object... input) { - return CraftingManagerAnvil.getInstance().addToolRecipe(result, skill, research, hot, 0F, toolType, hammerType, - anvil, forgeTime, input); - } - - public static IAnvilRecipe addAnvilToolRecipe(Skill skill, Item result, String research, boolean hot, - String toolType, int hammerType, int anvil, int forgeTime, Object... input) { - return addAnvilToolRecipe(skill, new ItemStack(result), research, hot, toolType, hammerType, anvil, forgeTime, - input); - } - - /** - * Adds a shaped recipe for carpenter benches sensetive to tiers - * - * @param result - * The output item (basic itemstack) - * @param sound - * The sound it makes ("minefantasy2:blocks.carpentermallet"), - * "step.wood", etc - * @param experience - * the experience gained from crafting - * @param toolType - * the tool type required to hit - * @param toolTier - * the tools tier required for creation: - * @param craftTime - * The time taken to craft(default is 200. each hit is about 100) - * @param input - * The input for the item (Exactly the same as regular recipes) - */ - public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, ItemStack result, String research, String sound, - String toolType, int toolTier, int craftTime, Object... input) { - return CraftingManagerCarpenter.getInstance().addToolRecipe(result, skill, research, sound, 0F, toolType, - toolTier, -1, craftTime, input); - } - - public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, Item result, String research, String sound, - String toolType, int toolTier, int craftTime, Object... input) { - return CraftingManagerCarpenter.getInstance().addToolRecipe(new ItemStack(result), skill, research, sound, 0F, - toolType, toolTier, -1, craftTime, input); - } - - public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, Item result, String research, String sound, - int craftTime, Object... input) { - return CraftingManagerCarpenter.getInstance().addToolRecipe(new ItemStack(result), skill, research, sound, 0F, - "hands", -1, -1, craftTime, input); - } - - /** - * Adds a shaped recipe for carpenter benches with all variables - * - * @param result - * The output item - * @param sound - * The sound it makes ("minefantasy2:blocks.carpentermallet"), - * "step.wood", etc - * @param experience - * the experience gained from crafting - * @param toolType - * the tool type required to hit - * @param toolTier - * the tools tier required for creation: - * @param craftTime - * The time taken to craft(default is 200. each hit is about 100) - * @param input - * The input for the item (Exactly the same as regular recipes) - */ - public static void addCarpenterRecipe(Skill skill, ItemStack result, String sound, String toolType, int toolTier, - int craftTime, Object... input) { - CraftingManagerCarpenter.getInstance().addRecipe(result, skill, "", sound, 0F, toolType, toolTier, -1, - craftTime, input); - } - - /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static void addCarpenterRecipe(Skill skill, ItemStack result, String sound, int craftTime, Object... input) { - addCarpenterRecipe(skill, result, "", sound, "hands", -1, craftTime, input); - } - - /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static void addShapelessCarpenterRecipe(Skill skill, ItemStack result, String sound, String toolType, - int toolTier, int craftTime, Object... input) { - CraftingManagerCarpenter.getInstance().addShapelessRecipe(result, skill, "", sound, 0F, toolType, toolTier, -1, - craftTime, input); - } - - /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static void addShapelessCarpenterRecipe(Skill skill, ItemStack result, String sound, int craftTime, - Object... input) { - addShapelessCarpenterRecipe(skill, result, sound, "hands", -1, craftTime, input); - } - - /** - * Adds a basic carpenter recipe similar to regular crafting This uses a single - * hit with bare hands - */ - public static ICarpenterRecipe addBasicCarpenterRecipe(ItemStack result, Object... input) { - return CraftingManagerCarpenter.getInstance().addRecipe(result, null, "", "dig.wood", 0F, "hands", -1, -1, 1, - input); - } - - /** - * Adds a shaped recipe for carpenter benches with all variables - * - * @param result - * The output item - * @param research - * The research required - * @param sound - * The sound it makes ("minefantasy2:blocks.carpentermallet"), - * "step.wood", etc - * @param experience - * the experience gained from crafting - * @param toolType - * the tool type required to hit - * @param toolTier - * the tools tier required for creation: - * @param craftTime - * The time taken to craft(default is 200. each hit is about 100) - * @param input - * The input for the item (Exactly the same as regular recipes) - */ - public static ICarpenterRecipe addCarpenterRecipe(Skill skill, ItemStack result, String research, String sound, - String toolType, int toolTier, int craftTime, Object... input) { - return CraftingManagerCarpenter.getInstance().addRecipe(result, skill, research, sound, 0F, toolType, toolTier, - -1, craftTime, input); - } - - /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static ICarpenterRecipe addCarpenterRecipe(Skill skill, ItemStack result, String research, String sound, - int craftTime, Object... input) { - return addCarpenterRecipe(skill, result, research, sound, "hands", -1, craftTime, input); - } - - /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static ICarpenterRecipe addShapelessCarpenterRecipe(Skill skill, ItemStack result, String research, - String sound, String toolType, int toolTier, int craftTime, Object... input) { - return CraftingManagerCarpenter.getInstance().addShapelessRecipe(result, skill, research, sound, 0F, toolType, - toolTier, -1, craftTime, input); - } - - /** {@link MineFantasyAPI#addCarpenterRecipe} */ - public static ICarpenterRecipe addShapelessCarpenterRecipe(Skill skill, ItemStack result, String research, - String sound, int craftTime, Object... input) { - return addShapelessCarpenterRecipe(skill, result, research, sound, "hands", -1, craftTime, input); - } - - public static void addBlastFurnaceRecipe(Block input, ItemStack output) { - BlastFurnaceRecipes.smelting().addRecipe(input, output); - } - - public static void addBlastFurnaceRecipe(Item input, ItemStack output) { - BlastFurnaceRecipes.smelting().addRecipe(input, output); - } - - public static void addBlastFurnaceRecipe(ItemStack input, ItemStack output) { - BlastFurnaceRecipes.smelting().addRecipe(input, output); - } - - /** - * This fuel handler is for MineFantasy equipment, it uses real fuel(like coal) - * not wood - */ - private static List fuelHandlers = Lists.newArrayList(); - - public static void registerFuelHandler(IFuelHandler handler) { - fuelHandlers.add(handler); - } - - public static int getFuelValue(ItemStack itemStack) { - int fuelValue = 0; - for (IFuelHandler handler : fuelHandlers) { - fuelValue = Math.max(fuelValue, handler.getBurnTime(itemStack)); - } - return fuelValue; - } - - /** - * Adds an alloy for any Crucible - * - * @param out - * The result - * @param in - * The list of required items - */ - public static void addAlloy(ItemStack out, Object... in) { - AlloyRecipes.addAlloy(out, convertList(in)); - } - - /** - * Adds an alloy with a minimal furnace level - * - * @param out - * The result - * @param level - * The minimal furnace level - * @param in - * The list of required items - */ - public static void addAlloy(ItemStack out, int level, Object... in) { - AlloyRecipes.addAlloy(out, level, convertList(in)); - } - - /** - * Adds an alloy with a minimal furnace level - * - * @param dupe - * the amount of times the ratio can be added - * @param out - * The result - * @param level - * The minimal furnace level - * @param in - * The list of required items - */ - public static Alloy[] addRatioAlloy(int dupe, ItemStack out, int level, Object... in) { - return AlloyRecipes.addRatioRecipe(out, level, convertList(in), dupe); - } - - /** - * Adds an alloy with any smelter - * - * @param dupe - * the amount of times the ratio can be added - * @param out - * The result - * @param level - * The minimal furnace level - * @param in - * The list of required items - */ - public static Alloy[] addRatioAlloy(int dupe, ItemStack out, Object... in) { - return AlloyRecipes.addRatioRecipe(out, 0, convertList(in), dupe); - } - - /** - * Adds a custom alloy - * - * @param alloy - * the Alloy to add Use this if you want your alloy to have special - * properties - * @see Alloy - */ - public static void addAlloy(Alloy alloy) { - AlloyRecipes.addAlloy(alloy); - } - - private static List convertList(Object[] in) { - ArrayList arraylist = new ArrayList(); - Object[] aobject = in; - int i = in.length; - - for (int j = 0; j < i; ++j) { - Object object1 = aobject[j]; - - if (object1 instanceof ItemStack) { - arraylist.add(((ItemStack) object1).copy()); - } else if (object1 instanceof Item) { - arraylist.add(new ItemStack((Item) object1)); - } else { - if (!(object1 instanceof Block)) { - throw new RuntimeException("MineFantasy: Invalid alloy!"); - } - - arraylist.add(new ItemStack((Block) object1)); - } - } - - return arraylist; - } - - /** - * Allows an item to be heated - * - * @param item - * the item to heat - * @param min - * the minimum heat to forge with(celcius) - * @param max - * the maximum heat until the item is ruined(celcius) - * @param unstable - * when the ingot is unstable(celcius) - */ - public static void setHeatableStats(ItemStack item, int min, int unstable, int max) { - Heatable.addItem(item, min, unstable, max); - } - - /** - * Allows an item to be heated ignoring subId - * - * @param id - * the item to heat - * @param min - * the minimum heat to forge with(celcius) - * @param max - * the maximum heat until the item is ruined(celcius) - * @param unstable - * when the ingot is unstable(celcius) - */ - public static void setHeatableStats(Item id, int min, int unstable, int max) { - Heatable.addItem(new ItemStack(id, 1, OreDictionary.WILDCARD_VALUE), min, unstable, max); - } - - public static void setHeatableStats(String oredict, int min, int unstable, int max) { - for (ItemStack item : OreDictionary.getOres(oredict)) { - setHeatableStats(item, min, unstable, max); - } - } - - private static ItemStack convertItem(Object object) { - if (object instanceof ItemStack) { - return ((ItemStack) object); - } - if (object instanceof Item) { - return new ItemStack((Item) object, 1, OreDictionary.WILDCARD_VALUE); - } - if (object instanceof Block) { - return new ItemStack((Block) object, 1, OreDictionary.WILDCARD_VALUE); - } - return null; - } - - /** - * Adds a crossbow part Make sure to do this when adding the item - */ - public static void registerCrossbowPart(ICrossbowPart part) { - ICrossbowPart.components.put(part.getComponentType() + part.getID(), part); - } - - /** - * For Hardcore Crafting: Can remove smelting recipes - * - * @param input - * can be an "Item", "Block" or "ItemStack" - */ - public static boolean removeSmelting(Object input) { - ItemStack object = null; - if (input instanceof Item) { - object = new ItemStack((Item) input, 1, 32767); - } else if (input instanceof Block) { - object = new ItemStack((Block) input, 1, 32767); - } else if (input instanceof ItemStack) { - object = (ItemStack) input; - } - if (object != null) { - return removeFurnaceInput(object); - } - return false; - } - - private static boolean removeFurnaceInput(ItemStack input) { - Iterator iterator = FurnaceRecipes.smelting().getSmeltingList().entrySet().iterator(); - Entry entry; - - do { - if (!iterator.hasNext()) { - return false; - } - - entry = (Entry) iterator.next(); - } while (!checkMatch(input, (ItemStack) entry.getKey())); - - FurnaceRecipes.smelting().getSmeltingList().remove(entry.getKey()); - return true; - } - - private static boolean checkMatch(ItemStack item1, ItemStack item2) { - return item2.getItem() == item1.getItem() - && (item2.getItemDamage() == 32767 || item2.getItemDamage() == item1.getItemDamage()); - } - - /** - * Add a cooking recipe - * - * @param input - * what goes in - * @param output - * what is made - * @param min_temperature - * minimal temperature to work - * @param max_temperature - * maximum temperature until burn - * @param time - * how many ticks until it finishes - * @param requireBaking - * whether it needs to be in an oven - */ - public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, int min_temperature, - int max_temperature, int time, boolean requireBaking) { - return CookRecipe.addRecipe(input, output, min_temperature, max_temperature, time, requireBaking, true); - } - - /** - * Add a cooking recipe - * - * @param input - * what goes in - * @param output - * what is made - * @param min_temperature - * minimal temperature to work - * @param max_temperature - * maximum temperature until burn - * @param time - * how many ticks until it finishes - * @param requireBaking - * whether it needs to be in an oven - * @param canBurn - * false if it cannot burn by traditional means (such as if its in a - * container) - */ - public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, int min_temperature, - int max_temperature, int time, boolean requireBaking, boolean canBurn) { - return CookRecipe.addRecipe(input, output, min_temperature, max_temperature, time, requireBaking, canBurn); - } - - /** - * Add a cooking recipe - * - * @param input - * what goes in - * @param output - * what is made - * @param min_temperature - * minimal temperature to work - * @param max_temperature - * maximum temperature until burn - * @param time - * how many ticks until it finishes - * @param requireBaking - * whether it needs to be in an oven - * @param canBurn - * false if it cannot burn by traditional means (such as if its in a - * container) - */ - public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, - int min_temperature, int max_temperature, int time, boolean requireBaking) { - return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, requireBaking, - true); - } - - /** - * Add a cooking recipe - * - * @param input - * what goes in - * @param output - * what is made - * @param min_temperature - * minimal temperature to work - * @param max_temperature - * maximum temperature until burn - * @param time - * how many ticks until it finishes - * @param burn_time - * how long until a finished product burns - * @param requireBaking - * whether it needs to be in an oven - * @param canBurn - * false if it cannot burn by traditional means (such as if its in a - * container) - */ - public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, - int min_temperature, int max_temperature, int time, int burn_time, boolean requireBaking) { - return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, burn_time, - requireBaking, true); - } - - public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, - int min_temperature, int max_temperature, int time, int burn_time, boolean requireBaking, boolean canBurn) { - return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, burn_time, - requireBaking, canBurn); - } - - public static QuernRecipes addQuernRecipe(ItemStack input, ItemStack output) { - return QuernRecipes.addRecipe(input, output, 1); - } - - public static BigFurnaceRecipes addFurnaceRecipe(ItemStack input, ItemStack output, int tier) { - return BigFurnaceRecipes.addRecipe(input, output, tier); - } + /** + * This variable saves if MineFantasy is in debug mode + */ + public static boolean isInDebugMode; + /** + * This fuel handler is for MineFantasy equipment, it uses real fuel(like coal) + * not wood + */ + private static List fuelHandlers = Lists.newArrayList(); + + @SideOnly(Side.CLIENT) + public static void init() { + } + + public static void debugMsg(String msg) { + MFLogUtil.logDebug(msg); + } + + public static void removeAllRecipes(Item result) { + List recipeList = CraftingManager.getInstance().getRecipeList(); + for (int i = 0; i < recipeList.size(); i++) { + IRecipe recipe = (IRecipe) recipeList.get(i); + if (recipe != null && recipe.getRecipeOutput() != null && recipe.getRecipeOutput().getItem() == result) { + debugMsg("Removed Recipe for " + recipe.getRecipeOutput().getDisplayName()); + } + } + } + + /** + * Adds a shaped recipe for anvils with all variables + * + * @param result The output item + * @param hot True if the result is hot(Does not apply to blocks) + * @param experiance the experiance gained from crafting + * @param toolType the tool type required to hit ("hammer", "hvyHammer", etc) + * @param hammerType the hammer tier required for creation: + * @param anvil the anvil required bronze 0, iron 1, steel 2 + * @param forgeTime The time taken to forge(default is 200. each hit is about 100) + * @param input The input for the item (Exactly the same as regular recipes) + */ + public static void addAnvilRecipe(Skill skill, ItemStack result, boolean hot, String toolType, int hammerType, + int anvil, int forgeTime, Object... input) { + CraftingManagerAnvil.getInstance().addRecipe(result, skill, "", hot, 0F, toolType, hammerType, anvil, forgeTime, + input); + } + + /** + * {@link MineFantasyAPI#addCarpenterRecipe} + */ + public static void addAnvilRecipe(Skill skill, ItemStack result, boolean hot, int hammerType, int anvil, + int forgeTime, Object... input) { + addAnvilRecipe(skill, result, hot, "hammer", hammerType, anvil, forgeTime, input); + } + + /** + * Adds a shaped recipe for anvils with all variables + * + * @param result The output item + * @param research The research required + * @param hot True if the result is hot(Does not apply to blocks) + * @param experiance the experiance gained from crafting + * @param toolType the tool type required to hit ("hammer", "hvyHammer", etc) + * @param hammerType the hammer tier required for creation: + * @param anvil the anvil required bronze 0, iron 1, steel 2 + * @param forgeTime The time taken to forge(default is 200. each hit is about 100) + * @param input The input for the item (Exactly the same as regular recipes) + */ + public static IAnvilRecipe addAnvilRecipe(Skill skill, ItemStack result, String research, boolean hot, + String toolType, int hammerType, int anvil, int forgeTime, Object... input) { + return CraftingManagerAnvil.getInstance().addRecipe(result, skill, research, hot, 0F, toolType, hammerType, + anvil, forgeTime, input); + } + + /** + * {@link MineFantasyAPI#addCarpenterRecipe} + */ + public static IAnvilRecipe addAnvilRecipe(Skill skill, ItemStack result, String research, boolean hot, + int hammerType, int anvil, int forgeTime, Object... input) { + return addAnvilRecipe(skill, result, research, hot, "hammer", hammerType, anvil, forgeTime, input); + } + + /** + * A special tier-sensitive recipe system for tools + * + * @param skill the Skill used + * @param result what item comes out (basic itemstack) + * @param research what research is used + * @param hot whether it requires quenching + * @param toolType the tool used (hammer or hvyHammer) + * @param hammerType the tier of hammer + * @param anvil the tier of anvil + * @param forgeTime the time it takes to forge + * @param input the items input + * @return + */ + public static IAnvilRecipe addAnvilToolRecipe(Skill skill, ItemStack result, String research, boolean hot, + String toolType, int hammerType, int anvil, int forgeTime, Object... input) { + return CraftingManagerAnvil.getInstance().addToolRecipe(result, skill, research, hot, 0F, toolType, hammerType, + anvil, forgeTime, input); + } + + public static IAnvilRecipe addAnvilToolRecipe(Skill skill, Item result, String research, boolean hot, + String toolType, int hammerType, int anvil, int forgeTime, Object... input) { + return addAnvilToolRecipe(skill, new ItemStack(result), research, hot, toolType, hammerType, anvil, forgeTime, + input); + } + + /** + * Adds a shaped recipe for carpenter benches sensetive to tiers + * + * @param result The output item (basic itemstack) + * @param sound The sound it makes ("minefantasy2:blocks.carpentermallet"), + * "step.wood", etc + * @param experience the experience gained from crafting + * @param toolType the tool type required to hit + * @param toolTier the tools tier required for creation: + * @param craftTime The time taken to craft(default is 200. each hit is about 100) + * @param input The input for the item (Exactly the same as regular recipes) + */ + public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, ItemStack result, String research, String sound, + String toolType, int toolTier, int craftTime, Object... input) { + return CraftingManagerCarpenter.getInstance().addToolRecipe(result, skill, research, sound, 0F, toolType, + toolTier, -1, craftTime, input); + } + + public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, Item result, String research, String sound, + String toolType, int toolTier, int craftTime, Object... input) { + return CraftingManagerCarpenter.getInstance().addToolRecipe(new ItemStack(result), skill, research, sound, 0F, + toolType, toolTier, -1, craftTime, input); + } + + public static ICarpenterRecipe addCarpenterToolRecipe(Skill skill, Item result, String research, String sound, + int craftTime, Object... input) { + return CraftingManagerCarpenter.getInstance().addToolRecipe(new ItemStack(result), skill, research, sound, 0F, + "hands", -1, -1, craftTime, input); + } + + /** + * Adds a shaped recipe for carpenter benches with all variables + * + * @param result The output item + * @param sound The sound it makes ("minefantasy2:blocks.carpentermallet"), + * "step.wood", etc + * @param experience the experience gained from crafting + * @param toolType the tool type required to hit + * @param toolTier the tools tier required for creation: + * @param craftTime The time taken to craft(default is 200. each hit is about 100) + * @param input The input for the item (Exactly the same as regular recipes) + */ + public static void addCarpenterRecipe(Skill skill, ItemStack result, String sound, String toolType, int toolTier, + int craftTime, Object... input) { + CraftingManagerCarpenter.getInstance().addRecipe(result, skill, "", sound, 0F, toolType, toolTier, -1, + craftTime, input); + } + + /** + * {@link MineFantasyAPI#addCarpenterRecipe} + */ + public static void addCarpenterRecipe(Skill skill, ItemStack result, String sound, int craftTime, Object... input) { + addCarpenterRecipe(skill, result, "", sound, "hands", -1, craftTime, input); + } + + /** + * {@link MineFantasyAPI#addCarpenterRecipe} + */ + public static void addShapelessCarpenterRecipe(Skill skill, ItemStack result, String sound, String toolType, + int toolTier, int craftTime, Object... input) { + CraftingManagerCarpenter.getInstance().addShapelessRecipe(result, skill, "", sound, 0F, toolType, toolTier, -1, + craftTime, input); + } + + /** + * {@link MineFantasyAPI#addCarpenterRecipe} + */ + public static void addShapelessCarpenterRecipe(Skill skill, ItemStack result, String sound, int craftTime, + Object... input) { + addShapelessCarpenterRecipe(skill, result, sound, "hands", -1, craftTime, input); + } + + /** + * Adds a basic carpenter recipe similar to regular crafting This uses a single + * hit with bare hands + */ + public static ICarpenterRecipe addBasicCarpenterRecipe(ItemStack result, Object... input) { + return CraftingManagerCarpenter.getInstance().addRecipe(result, null, "", "dig.wood", 0F, "hands", -1, -1, 1, + input); + } + + /** + * Adds a shaped recipe for carpenter benches with all variables + * + * @param result The output item + * @param research The research required + * @param sound The sound it makes ("minefantasy2:blocks.carpentermallet"), + * "step.wood", etc + * @param experience the experience gained from crafting + * @param toolType the tool type required to hit + * @param toolTier the tools tier required for creation: + * @param craftTime The time taken to craft(default is 200. each hit is about 100) + * @param input The input for the item (Exactly the same as regular recipes) + */ + public static ICarpenterRecipe addCarpenterRecipe(Skill skill, ItemStack result, String research, String sound, + String toolType, int toolTier, int craftTime, Object... input) { + return CraftingManagerCarpenter.getInstance().addRecipe(result, skill, research, sound, 0F, toolType, toolTier, + -1, craftTime, input); + } + + /** + * {@link MineFantasyAPI#addCarpenterRecipe} + */ + public static ICarpenterRecipe addCarpenterRecipe(Skill skill, ItemStack result, String research, String sound, + int craftTime, Object... input) { + return addCarpenterRecipe(skill, result, research, sound, "hands", -1, craftTime, input); + } + + /** + * {@link MineFantasyAPI#addCarpenterRecipe} + */ + public static ICarpenterRecipe addShapelessCarpenterRecipe(Skill skill, ItemStack result, String research, + String sound, String toolType, int toolTier, int craftTime, Object... input) { + return CraftingManagerCarpenter.getInstance().addShapelessRecipe(result, skill, research, sound, 0F, toolType, + toolTier, -1, craftTime, input); + } + + /** + * {@link MineFantasyAPI#addCarpenterRecipe} + */ + public static ICarpenterRecipe addShapelessCarpenterRecipe(Skill skill, ItemStack result, String research, + String sound, int craftTime, Object... input) { + return addShapelessCarpenterRecipe(skill, result, research, sound, "hands", -1, craftTime, input); + } + + public static void addBlastFurnaceRecipe(Block input, ItemStack output) { + BlastFurnaceRecipes.smelting().addRecipe(input, output); + } + + public static void addBlastFurnaceRecipe(Item input, ItemStack output) { + BlastFurnaceRecipes.smelting().addRecipe(input, output); + } + + public static void addBlastFurnaceRecipe(ItemStack input, ItemStack output) { + BlastFurnaceRecipes.smelting().addRecipe(input, output); + } + + public static void registerFuelHandler(IFuelHandler handler) { + fuelHandlers.add(handler); + } + + public static int getFuelValue(ItemStack itemStack) { + int fuelValue = 0; + for (IFuelHandler handler : fuelHandlers) { + fuelValue = Math.max(fuelValue, handler.getBurnTime(itemStack)); + } + return fuelValue; + } + + /** + * Adds an alloy for any Crucible + * + * @param out The result + * @param in The list of required items + */ + public static void addAlloy(ItemStack out, Object... in) { + AlloyRecipes.addAlloy(out, convertList(in)); + } + + /** + * Adds an alloy with a minimal furnace level + * + * @param out The result + * @param level The minimal furnace level + * @param in The list of required items + */ + public static void addAlloy(ItemStack out, int level, Object... in) { + AlloyRecipes.addAlloy(out, level, convertList(in)); + } + + /** + * Adds an alloy with a minimal furnace level + * + * @param dupe the amount of times the ratio can be added + * @param out The result + * @param level The minimal furnace level + * @param in The list of required items + */ + public static Alloy[] addRatioAlloy(int dupe, ItemStack out, int level, Object... in) { + return AlloyRecipes.addRatioRecipe(out, level, convertList(in), dupe); + } + + /** + * Adds an alloy with any smelter + * + * @param dupe the amount of times the ratio can be added + * @param out The result + * @param level The minimal furnace level + * @param in The list of required items + */ + public static Alloy[] addRatioAlloy(int dupe, ItemStack out, Object... in) { + return AlloyRecipes.addRatioRecipe(out, 0, convertList(in), dupe); + } + + /** + * Adds a custom alloy + * + * @param alloy the Alloy to add Use this if you want your alloy to have special + * properties + * @see Alloy + */ + public static void addAlloy(Alloy alloy) { + AlloyRecipes.addAlloy(alloy); + } + + private static List convertList(Object[] in) { + ArrayList arraylist = new ArrayList(); + Object[] aobject = in; + int i = in.length; + + for (int j = 0; j < i; ++j) { + Object object1 = aobject[j]; + + if (object1 instanceof ItemStack) { + arraylist.add(((ItemStack) object1).copy()); + } else if (object1 instanceof Item) { + arraylist.add(new ItemStack((Item) object1)); + } else { + if (!(object1 instanceof Block)) { + throw new RuntimeException("MineFantasy: Invalid alloy!"); + } + + arraylist.add(new ItemStack((Block) object1)); + } + } + + return arraylist; + } + + /** + * Allows an item to be heated + * + * @param item the item to heat + * @param min the minimum heat to forge with(celcius) + * @param max the maximum heat until the item is ruined(celcius) + * @param unstable when the ingot is unstable(celcius) + */ + public static void setHeatableStats(ItemStack item, int min, int unstable, int max) { + Heatable.addItem(item, min, unstable, max); + } + + /** + * Allows an item to be heated ignoring subId + * + * @param id the item to heat + * @param min the minimum heat to forge with(celcius) + * @param max the maximum heat until the item is ruined(celcius) + * @param unstable when the ingot is unstable(celcius) + */ + public static void setHeatableStats(Item id, int min, int unstable, int max) { + Heatable.addItem(new ItemStack(id, 1, OreDictionary.WILDCARD_VALUE), min, unstable, max); + } + + public static void setHeatableStats(String oredict, int min, int unstable, int max) { + for (ItemStack item : OreDictionary.getOres(oredict)) { + setHeatableStats(item, min, unstable, max); + } + } + + private static ItemStack convertItem(Object object) { + if (object instanceof ItemStack) { + return ((ItemStack) object); + } + if (object instanceof Item) { + return new ItemStack((Item) object, 1, OreDictionary.WILDCARD_VALUE); + } + if (object instanceof Block) { + return new ItemStack((Block) object, 1, OreDictionary.WILDCARD_VALUE); + } + return null; + } + + /** + * Adds a crossbow part Make sure to do this when adding the item + */ + public static void registerCrossbowPart(ICrossbowPart part) { + ICrossbowPart.components.put(part.getComponentType() + part.getID(), part); + } + + /** + * For Hardcore Crafting: Can remove smelting recipes + * + * @param input can be an "Item", "Block" or "ItemStack" + */ + public static boolean removeSmelting(Object input) { + ItemStack object = null; + if (input instanceof Item) { + object = new ItemStack((Item) input, 1, 32767); + } else if (input instanceof Block) { + object = new ItemStack((Block) input, 1, 32767); + } else if (input instanceof ItemStack) { + object = (ItemStack) input; + } + if (object != null) { + return removeFurnaceInput(object); + } + return false; + } + + private static boolean removeFurnaceInput(ItemStack input) { + Iterator iterator = FurnaceRecipes.smelting().getSmeltingList().entrySet().iterator(); + Entry entry; + + do { + if (!iterator.hasNext()) { + return false; + } + + entry = (Entry) iterator.next(); + } while (!checkMatch(input, (ItemStack) entry.getKey())); + + FurnaceRecipes.smelting().getSmeltingList().remove(entry.getKey()); + return true; + } + + private static boolean checkMatch(ItemStack item1, ItemStack item2) { + return item2.getItem() == item1.getItem() + && (item2.getItemDamage() == 32767 || item2.getItemDamage() == item1.getItemDamage()); + } + + /** + * Add a cooking recipe + * + * @param input what goes in + * @param output what is made + * @param min_temperature minimal temperature to work + * @param max_temperature maximum temperature until burn + * @param time how many ticks until it finishes + * @param requireBaking whether it needs to be in an oven + */ + public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, int min_temperature, + int max_temperature, int time, boolean requireBaking) { + return CookRecipe.addRecipe(input, output, min_temperature, max_temperature, time, requireBaking, true); + } + + /** + * Add a cooking recipe + * + * @param input what goes in + * @param output what is made + * @param min_temperature minimal temperature to work + * @param max_temperature maximum temperature until burn + * @param time how many ticks until it finishes + * @param requireBaking whether it needs to be in an oven + * @param canBurn false if it cannot burn by traditional means (such as if its in a + * container) + */ + public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, int min_temperature, + int max_temperature, int time, boolean requireBaking, boolean canBurn) { + return CookRecipe.addRecipe(input, output, min_temperature, max_temperature, time, requireBaking, canBurn); + } + + /** + * Add a cooking recipe + * + * @param input what goes in + * @param output what is made + * @param min_temperature minimal temperature to work + * @param max_temperature maximum temperature until burn + * @param time how many ticks until it finishes + * @param requireBaking whether it needs to be in an oven + * @param canBurn false if it cannot burn by traditional means (such as if its in a + * container) + */ + public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, + int min_temperature, int max_temperature, int time, boolean requireBaking) { + return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, requireBaking, + true); + } + + /** + * Add a cooking recipe + * + * @param input what goes in + * @param output what is made + * @param min_temperature minimal temperature to work + * @param max_temperature maximum temperature until burn + * @param time how many ticks until it finishes + * @param burn_time how long until a finished product burns + * @param requireBaking whether it needs to be in an oven + * @param canBurn false if it cannot burn by traditional means (such as if its in a + * container) + */ + public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, + int min_temperature, int max_temperature, int time, int burn_time, boolean requireBaking) { + return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, burn_time, + requireBaking, true); + } + + public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, ItemStack burnItem, + int min_temperature, int max_temperature, int time, int burn_time, boolean requireBaking, boolean canBurn) { + return CookRecipe.addRecipe(input, output, burnItem, min_temperature, max_temperature, time, burn_time, + requireBaking, canBurn); + } + + public static QuernRecipes addQuernRecipe(ItemStack input, ItemStack output) { + return QuernRecipes.addRecipe(input, output, 1); + } + + public static BigFurnaceRecipes addFurnaceRecipe(ItemStack input, ItemStack output, int tier) { + return BigFurnaceRecipes.addRecipe(input, output, tier); + } } diff --git a/src/main/java/minefantasy/mf2/api/archery/AmmoMechanicsMF.java b/src/main/java/minefantasy/mf2/api/archery/AmmoMechanicsMF.java index b70c3c87..ae8b0908 100644 --- a/src/main/java/minefantasy/mf2/api/archery/AmmoMechanicsMF.java +++ b/src/main/java/minefantasy/mf2/api/archery/AmmoMechanicsMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.api.archery; -import java.util.ArrayList; -import java.util.List; - import minefantasy.mf2.block.decor.BlockAmmoBox; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; @@ -15,234 +12,235 @@ import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.List; + public class AmmoMechanicsMF { - /** - * List of fireable arrows - */ - public static List arrows = new ArrayList(); - /** - * List of handlers - */ - public static List handlers = new ArrayList(); - - /** - * Adds an arrow that can be fired - */ - public static void addArrow(ItemStack item) { - arrows.add(item); - } - - /** - * Adds an arrow that can be fired not considering sub Ids - */ - public static void addArrow(Item item) { - addArrow(new ItemStack(item, 1, OreDictionary.WILDCARD_VALUE)); - } - - /** - * Adds a handler - */ - public static void addHandler(IArrowHandler handler) { - handlers.add(handler); - } - - public static void putAmmoOnFirearm(ItemStack weapon, ItemStack ammo) { - NBTTagCompound save = new NBTTagCompound(); - if (ammo == null) { - getNBT(weapon).removeTag(arrowOnBowNBT); - return; - } - ammo.writeToNBT(save); - getNBT(weapon).setTag(arrowOnBowNBT, save); - } - - /** - * Gets the arrow loaded on the bow used for rendering and firing - */ - public static ItemStack getArrowOnBow(ItemStack bow) { - if (bow != null && bow.hasTagCompound()) { - if (bow.getTagCompound().hasKey(arrowOnBowNBT)) { - return ItemStack.loadItemStackFromNBT(bow.getTagCompound().getCompoundTag(arrowOnBowNBT)); - } - } - return null; - } - - public static final String arrowOnBowNBT = "loadedArrow"; - public static final String savedAmmoNBT = "MF_PresetArrow"; - - /** - * Gets a loaded arrow from a bow - */ - public static ItemStack reloadBow(ItemStack bow) { - if (!bow.hasTagCompound()) { - return null; - } - if (bow.getTagCompound().hasKey(savedAmmoNBT)) { - ItemStack ammo = ItemStack.loadItemStackFromNBT(bow.getTagCompound().getCompoundTag(savedAmmoNBT)); - - if (ammo != null) { - ItemStack arrow = ammo.copy(); - arrow.stackSize = 1; - return arrow; - } - } - return null; - } - - /** - * Removes 1 from the ammo - */ - public static void consumeAmmo(EntityPlayer user, ItemStack bow) { - ItemStack ammo = getAmmo(bow); - if (user.capabilities.isCreativeMode) { - return; - } - if (ammo != null) { - --ammo.stackSize; - if (ammo.stackSize > 0) { - setAmmo(bow, ammo); - } else { - getNBT(bow).removeTag(savedAmmoNBT); - } - } - } - - /** - * Gets what ammo is loaded - */ - public static ItemStack getAmmo(ItemStack bow) { - if (!bow.hasTagCompound()) { - return null; - } - if (bow.getTagCompound().hasKey(savedAmmoNBT)) { - return ItemStack.loadItemStackFromNBT(bow.getTagCompound().getCompoundTag(savedAmmoNBT)); - } - return null; - } - - /** - * Sets the ammo for the bow - */ - public static void setAmmo(ItemStack bow, ItemStack ammo) { - NBTTagCompound nbt = getNBT(bow); - - if (ammo != null) { - NBTTagCompound save = new NBTTagCompound(); - ammo.writeToNBT(save); - nbt.setTag(savedAmmoNBT, save); - } else { - nbt.removeTag(savedAmmoNBT); - } - } - - public static NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - return item.getTagCompound(); - } - - public static void removeAmmo(ItemStack bow) { - getNBT(bow).removeTag(savedAmmoNBT); - } - - public static boolean isDepleted(ItemStack firearm) { - return getGunAmmoCount(firearm) == 0 && getAmmo(firearm) == null - && EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, firearm) == 0; - } - - public static boolean isFirearmLoaded(ItemStack firearm) { - return getGunAmmoCount(firearm) > 0; - } - - public static void modifyAmmo(ItemStack item, int value) { - int ammo = getGunAmmoCount(item) + value; - setGunAmmoCount(item, ammo); - } - - private static final String ammoNBT = "MFammo"; - - public static void setGunAmmoCount(ItemStack item, int ammo) { - NBTTagCompound nbt = getNBT(item); - nbt.setInteger(ammoNBT, ammo); - } - - public static int getGunAmmoCount(ItemStack item) { - if (getArrowOnBow(item) == null) { - return 0; - } - NBTTagCompound nbt = getNBT(item); - - if (nbt.hasKey(ammoNBT)) { - return nbt.getInteger(ammoNBT); - } - return 1; - } - - public static void dropAmmoCrate(World world, ItemStack crate, double x, double y, double z) { - ItemStack drop = BlockAmmoBox.getHeld(crate, true); - int stock = BlockAmmoBox.getStock(crate, true); - if (drop != null) { - while (stock > 0) { - int stackSize = Math.min(stock, drop.getMaxStackSize()); - stock -= stackSize; - ItemStack newdrop = drop.copy(); - newdrop.stackSize = stackSize; - entityDropItem(world, x, y, z, newdrop); - } - } - } - - /** - * Drops the loaded and storred ammo for an item, from coords - */ - public static void dropAmmo(World world, ItemStack firearm, double x, double y, double z) { - ItemStack ammo = AmmoMechanicsMF.getAmmo(firearm); - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(firearm); - if (ammo != null) { - entityDropItem(world, x, y, z, ammo); - AmmoMechanicsMF.setAmmo(firearm, null); - } - if (loaded != null) { - entityDropItem(world, x, y, z, loaded); - AmmoMechanicsMF.putAmmoOnFirearm(firearm, null); - } - } - - /** - * Drops the loaded and storred ammo for an item from a user - */ - public static void dropContents(World world, ItemStack firearm, EntityLivingBase user) { - dropAmmo(world, firearm, user.posX, user.posY + user.getEyeHeight(), user.posZ); - dropAmmoCrate(world, firearm, user.posX, user.posY + user.getEyeHeight(), user.posZ); - } - - private static EntityItem entityDropItem(World world, double x, double y, double z, ItemStack item) { - if (item.stackSize != 0 && item.getItem() != null) { - EntityItem entityitem = new EntityItem(world, x, y, z, item); - entityitem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(entityitem); - return entityitem; - } else { - return null; - } - } - - public static void damageContainer(ItemStack item, EntityPlayer user) { - damageContainer(item, user, 1); - } - - /** - * Damages a firearm, dropping inventory if broken - */ - public static void damageContainer(ItemStack item, EntityPlayer user, int dam) { - item.damageItem(dam, user); - if (!user.capabilities.isCreativeMode && item.stackSize == 0) { - if (!user.worldObj.isRemote) { - dropContents(user.worldObj, item, user); - } - user.setCurrentItemOrArmor(0, null); - } - } + public static final String arrowOnBowNBT = "loadedArrow"; + public static final String savedAmmoNBT = "MF_PresetArrow"; + private static final String ammoNBT = "MFammo"; + /** + * List of fireable arrows + */ + public static List arrows = new ArrayList(); + /** + * List of handlers + */ + public static List handlers = new ArrayList(); + + /** + * Adds an arrow that can be fired + */ + public static void addArrow(ItemStack item) { + arrows.add(item); + } + + /** + * Adds an arrow that can be fired not considering sub Ids + */ + public static void addArrow(Item item) { + addArrow(new ItemStack(item, 1, OreDictionary.WILDCARD_VALUE)); + } + + /** + * Adds a handler + */ + public static void addHandler(IArrowHandler handler) { + handlers.add(handler); + } + + public static void putAmmoOnFirearm(ItemStack weapon, ItemStack ammo) { + NBTTagCompound save = new NBTTagCompound(); + if (ammo == null) { + getNBT(weapon).removeTag(arrowOnBowNBT); + return; + } + ammo.writeToNBT(save); + getNBT(weapon).setTag(arrowOnBowNBT, save); + } + + /** + * Gets the arrow loaded on the bow used for rendering and firing + */ + public static ItemStack getArrowOnBow(ItemStack bow) { + if (bow != null && bow.hasTagCompound()) { + if (bow.getTagCompound().hasKey(arrowOnBowNBT)) { + return ItemStack.loadItemStackFromNBT(bow.getTagCompound().getCompoundTag(arrowOnBowNBT)); + } + } + return null; + } + + /** + * Gets a loaded arrow from a bow + */ + public static ItemStack reloadBow(ItemStack bow) { + if (!bow.hasTagCompound()) { + return null; + } + if (bow.getTagCompound().hasKey(savedAmmoNBT)) { + ItemStack ammo = ItemStack.loadItemStackFromNBT(bow.getTagCompound().getCompoundTag(savedAmmoNBT)); + + if (ammo != null) { + ItemStack arrow = ammo.copy(); + arrow.stackSize = 1; + return arrow; + } + } + return null; + } + + /** + * Removes 1 from the ammo + */ + public static void consumeAmmo(EntityPlayer user, ItemStack bow) { + ItemStack ammo = getAmmo(bow); + if (user.capabilities.isCreativeMode) { + return; + } + if (ammo != null) { + --ammo.stackSize; + if (ammo.stackSize > 0) { + setAmmo(bow, ammo); + } else { + getNBT(bow).removeTag(savedAmmoNBT); + } + } + } + + /** + * Gets what ammo is loaded + */ + public static ItemStack getAmmo(ItemStack bow) { + if (!bow.hasTagCompound()) { + return null; + } + if (bow.getTagCompound().hasKey(savedAmmoNBT)) { + return ItemStack.loadItemStackFromNBT(bow.getTagCompound().getCompoundTag(savedAmmoNBT)); + } + return null; + } + + /** + * Sets the ammo for the bow + */ + public static void setAmmo(ItemStack bow, ItemStack ammo) { + NBTTagCompound nbt = getNBT(bow); + + if (ammo != null) { + NBTTagCompound save = new NBTTagCompound(); + ammo.writeToNBT(save); + nbt.setTag(savedAmmoNBT, save); + } else { + nbt.removeTag(savedAmmoNBT); + } + } + + public static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + return item.getTagCompound(); + } + + public static void removeAmmo(ItemStack bow) { + getNBT(bow).removeTag(savedAmmoNBT); + } + + public static boolean isDepleted(ItemStack firearm) { + return getGunAmmoCount(firearm) == 0 && getAmmo(firearm) == null + && EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, firearm) == 0; + } + + public static boolean isFirearmLoaded(ItemStack firearm) { + return getGunAmmoCount(firearm) > 0; + } + + public static void modifyAmmo(ItemStack item, int value) { + int ammo = getGunAmmoCount(item) + value; + setGunAmmoCount(item, ammo); + } + + public static void setGunAmmoCount(ItemStack item, int ammo) { + NBTTagCompound nbt = getNBT(item); + nbt.setInteger(ammoNBT, ammo); + } + + public static int getGunAmmoCount(ItemStack item) { + if (getArrowOnBow(item) == null) { + return 0; + } + NBTTagCompound nbt = getNBT(item); + + if (nbt.hasKey(ammoNBT)) { + return nbt.getInteger(ammoNBT); + } + return 1; + } + + public static void dropAmmoCrate(World world, ItemStack crate, double x, double y, double z) { + ItemStack drop = BlockAmmoBox.getHeld(crate, true); + int stock = BlockAmmoBox.getStock(crate, true); + if (drop != null) { + while (stock > 0) { + int stackSize = Math.min(stock, drop.getMaxStackSize()); + stock -= stackSize; + ItemStack newdrop = drop.copy(); + newdrop.stackSize = stackSize; + entityDropItem(world, x, y, z, newdrop); + } + } + } + + /** + * Drops the loaded and storred ammo for an item, from coords + */ + public static void dropAmmo(World world, ItemStack firearm, double x, double y, double z) { + ItemStack ammo = AmmoMechanicsMF.getAmmo(firearm); + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(firearm); + if (ammo != null) { + entityDropItem(world, x, y, z, ammo); + AmmoMechanicsMF.setAmmo(firearm, null); + } + if (loaded != null) { + entityDropItem(world, x, y, z, loaded); + AmmoMechanicsMF.putAmmoOnFirearm(firearm, null); + } + } + + /** + * Drops the loaded and storred ammo for an item from a user + */ + public static void dropContents(World world, ItemStack firearm, EntityLivingBase user) { + dropAmmo(world, firearm, user.posX, user.posY + user.getEyeHeight(), user.posZ); + dropAmmoCrate(world, firearm, user.posX, user.posY + user.getEyeHeight(), user.posZ); + } + + private static EntityItem entityDropItem(World world, double x, double y, double z, ItemStack item) { + if (item.stackSize != 0 && item.getItem() != null) { + EntityItem entityitem = new EntityItem(world, x, y, z, item); + entityitem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(entityitem); + return entityitem; + } else { + return null; + } + } + + public static void damageContainer(ItemStack item, EntityPlayer user) { + damageContainer(item, user, 1); + } + + /** + * Damages a firearm, dropping inventory if broken + */ + public static void damageContainer(ItemStack item, EntityPlayer user, int dam) { + item.damageItem(dam, user); + if (!user.capabilities.isCreativeMode && item.stackSize == 0) { + if (!user.worldObj.isRemote) { + dropContents(user.worldObj, item, user); + } + user.setCurrentItemOrArmor(0, null); + } + } } diff --git a/src/main/java/minefantasy/mf2/api/archery/IAmmo.java b/src/main/java/minefantasy/mf2/api/archery/IAmmo.java index 2183a286..a956ff31 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IAmmo.java +++ b/src/main/java/minefantasy/mf2/api/archery/IAmmo.java @@ -3,8 +3,8 @@ import net.minecraft.item.ItemStack; public interface IAmmo { - /** - * What ammo is it (arrow, bolt, bullet, etc) - */ - public String getAmmoType(ItemStack arrow); + /** + * What ammo is it (arrow, bolt, bullet, etc) + */ + public String getAmmoType(ItemStack arrow); } diff --git a/src/main/java/minefantasy/mf2/api/archery/IArrowHandler.java b/src/main/java/minefantasy/mf2/api/archery/IArrowHandler.java index 6a314483..65bff953 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IArrowHandler.java +++ b/src/main/java/minefantasy/mf2/api/archery/IArrowHandler.java @@ -5,11 +5,11 @@ import net.minecraft.world.World; public interface IArrowHandler { - /** - * Fires an arrow - * - * @return true if the arrow has been fired - */ - public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, - boolean infinite); + /** + * Fires an arrow + * + * @return true if the arrow has been fired + */ + public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, + boolean infinite); } diff --git a/src/main/java/minefantasy/mf2/api/archery/IArrowMF.java b/src/main/java/minefantasy/mf2/api/archery/IArrowMF.java index 2721a47a..33afe3e5 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IArrowMF.java +++ b/src/main/java/minefantasy/mf2/api/archery/IArrowMF.java @@ -4,21 +4,21 @@ import net.minecraft.item.ItemStack; public interface IArrowMF { - /** - * Gets the damage modifier (1.0 = Flint arrow) - */ - public abstract float getDamageModifier(ItemStack arrow); + /** + * Gets the damage modifier (1.0 = Flint arrow) + */ + public abstract float getDamageModifier(ItemStack arrow); - /** - * Gets the weight (1.0 = regular fall speed) - */ - public abstract float getGravityModifier(ItemStack arrow); + /** + * Gets the weight (1.0 = regular fall speed) + */ + public abstract float getGravityModifier(ItemStack arrow); - /** - * Gets the chance the arrow will break on impace (0.0 = no chance, 1.0 = 100% - * chance) - */ - public abstract float getBreakChance(Entity entityArrow, ItemStack arrow); + /** + * Gets the chance the arrow will break on impace (0.0 = no chance, 1.0 = 100% + * chance) + */ + public abstract float getBreakChance(Entity entityArrow, ItemStack arrow); - public abstract void onHitEntity(Entity arrowInstance, Entity shooter, Entity hit, float damage); + public abstract void onHitEntity(Entity arrowInstance, Entity shooter, Entity hit, float damage); } diff --git a/src/main/java/minefantasy/mf2/api/archery/IArrowRetrieve.java b/src/main/java/minefantasy/mf2/api/archery/IArrowRetrieve.java index 8103b8fb..99eaaa28 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IArrowRetrieve.java +++ b/src/main/java/minefantasy/mf2/api/archery/IArrowRetrieve.java @@ -3,14 +3,14 @@ import net.minecraft.item.ItemStack; public interface IArrowRetrieve { - /** - * Gets if the arrow will be dropped by a killed mob (this pretty much connects - * to the canBePickedUp variable) - */ - public boolean canBePickedUp(); + /** + * Gets if the arrow will be dropped by a killed mob (this pretty much connects + * to the canBePickedUp variable) + */ + public boolean canBePickedUp(); - /** - * Gets the item dropped when the enemy is killed (the arrow item used) - */ - public ItemStack getDroppedItem(); + /** + * Gets the item dropped when the enemy is killed (the arrow item used) + */ + public ItemStack getDroppedItem(); } diff --git a/src/main/java/minefantasy/mf2/api/archery/IDisplayMFAmmo.java b/src/main/java/minefantasy/mf2/api/archery/IDisplayMFAmmo.java index e5f113bc..1ebf1dfe 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IDisplayMFAmmo.java +++ b/src/main/java/minefantasy/mf2/api/archery/IDisplayMFAmmo.java @@ -8,5 +8,5 @@ * firer */ public interface IDisplayMFAmmo { - public int getAmmoCapacity(ItemStack item); + public int getAmmoCapacity(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/archery/IFirearm.java b/src/main/java/minefantasy/mf2/api/archery/IFirearm.java index 9093f42e..b5fa2409 100644 --- a/src/main/java/minefantasy/mf2/api/archery/IFirearm.java +++ b/src/main/java/minefantasy/mf2/api/archery/IFirearm.java @@ -3,14 +3,12 @@ import net.minecraft.item.ItemStack; public interface IFirearm { - /** - * Determines the type of firing mechanism used (such as arrow, bolt, bullet, - * etc) - * - * @param weapon - * the item that is being accessed - * @param ammo - * the ammo type that weapon is being loaded with - */ - public boolean canAcceptAmmo(ItemStack weapon, String ammo); + /** + * Determines the type of firing mechanism used (such as arrow, bolt, bullet, + * etc) + * + * @param weapon the item that is being accessed + * @param ammo the ammo type that weapon is being loaded with + */ + public boolean canAcceptAmmo(ItemStack weapon, String ammo); } diff --git a/src/main/java/minefantasy/mf2/api/archery/ISpecialBow.java b/src/main/java/minefantasy/mf2/api/archery/ISpecialBow.java index 2bc90ffa..42cba538 100644 --- a/src/main/java/minefantasy/mf2/api/archery/ISpecialBow.java +++ b/src/main/java/minefantasy/mf2/api/archery/ISpecialBow.java @@ -4,21 +4,20 @@ import net.minecraft.item.ItemStack; public interface ISpecialBow { - /** - * This is called when an arrow is fired from a bow if you have your own arrows - * firing, call this method when spawning it in world - * - * Allows to modify an arrow when fired from this bow - * - * @param arrow - * the arrow fired(use a cast to determine what class it is) - * @return the same arrow, but modified - */ - public Entity modifyArrow(ItemStack bow, Entity arrow); + /** + * This is called when an arrow is fired from a bow if you have your own arrows + * firing, call this method when spawning it in world + *

+ * Allows to modify an arrow when fired from this bow + * + * @param arrow the arrow fired(use a cast to determine what class it is) + * @return the same arrow, but modified + */ + public Entity modifyArrow(ItemStack bow, Entity arrow); - public float getMaxCharge(); + public float getMaxCharge(); - public float getRange(ItemStack bow); + public float getRange(ItemStack bow); - public float getSpread(ItemStack bow); + public float getSpread(ItemStack bow); } diff --git a/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java b/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java index 252d8df0..5bdd9a42 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java +++ b/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java @@ -3,133 +3,122 @@ import java.util.HashMap; public class ArmourDesign { - public static final String light = "light"; - public static final String medium = "medium"; - public static final String heavy = "heavy"; - // Weight: Above 50kg slows down and increases stamina decay, and classes as - // heavy armour - // Bulk: Above 0.0 means it slows stamina regen - public static HashMap designs = new HashMap(); - // Reg Name Prot Dura Weight Bulk Ctg Bnt Png - public static final ArmourDesign CLOTH = new ArmourDesign("clothing", "Clothing", 1.0F, 1.0F, 0F, 0.25F) - .calibrateTraits(0.5F, 1.0F, 0.5F).setWeightGroup(light);// Weak - public static final ArmourDesign SOLID = new ArmourDesign("default", "Basic", 1.0F, 1.0F, 40F, 1.00F) - .setWeightGroup(medium);// Basic Armour - public static final ArmourDesign MAIL = new ArmourDesign("mail", "Mail", 1.0F, 1.0F, 35F, 0.75F) - .calibrateTraits(1.0F, 0.7F, 0.9F).setWeightGroup(medium);// Vulnerable to blunt - public static final ArmourDesign PLATE = new ArmourDesign("plate", "Plate", 1.5F, 1.0F, 60F, 1.00F) - .calibrateTraits(1.0F, 1.0F, 0.6F).setWeightGroup(heavy);// Vulnerable to piercing - - // LIGHT ARMOUR - public static final ArmourDesign LEATHER = new ArmourDesign("leather", "Leather", 1.0F, 1.0F, 10F, 0.25F) - .calibrateTraits(0.7F, 1.0F, 0.5F).setWeightGroup(light);// Slightly better blunt - public static final ArmourDesign PADDING = new ArmourDesign("padding", "Padding", 1.0F, 1.0F, 10F, 1.00F) - .calibrateTraits(0.6F, 1.2F, 0.4F).setWeightGroup(light);// 10kg, Blunt resistent - public static final ArmourDesign STUDDED = new ArmourDesign("studded", "Studded", 0.8F, 1.0F, 10F, 0.25F) - .calibrateTraits(0.85F, 1.0F, 0.9F).setWeightGroup(light);// 10kg, Vulnerable to blunt - // MEDIUM ARMOUR - public static final ArmourDesign SCALEMAIL = new ArmourDesign("scalemail", "Scalemail", 1.0F, 1.0F, 8F, 0.30F) - .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(medium);// 20kg, Average - public static final ArmourDesign CHAINMAIL = new ArmourDesign("chainmail", "Chainmail", 1.0F, 1.0F, 8F, 0.65F) - .calibrateTraits(1.20F, 0.60F, 1.20F).setWeightGroup(medium);// 20kg, Less blunt more piercing - // HEAVY ARMOUR - public static final ArmourDesign SPLINTMAIL = new ArmourDesign("splintmail", "Splintmail", 1.2F, 1.0F, 12F, 0.75F) - .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(heavy);// 30kg, Average - public static final ArmourDesign FIELDPLATE = new ArmourDesign("fieldplate", "Fieldplate", 1.2F, 1.0F, 16F, 1.00F) - .calibrateTraits(1.25F, 1.25F, 1.00F).setWeightGroup(heavy);// 40kg, Vulnerable to piercing - - public static final ArmourDesign COGWORK = new ArmourDesign("cogwork", "Cogwork", 4.0F, 8.0F, 30F, 2.00F) - .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(heavy);// >120kg, Massive Protection - // ArmourCalculator - private String name; - private float durability; - private float armourWeight; - - private float baseProtection; - - private float cuttingModifier = 1.0F; - private float piercingModifier = 1.0F; - private float bluntModifier = 1.0F; - - private float bulk; - - /** - * - * @param register - * The string that it is registered under (For config) - * @param name - * The name of the Design - * @param prot - * The protection against basic damage (1.0F = normal protection for - * tier) - * @param dura - * The durability modifier - * @param weight - * the weight in Kg of the suit - * @param bulk - * the bulk of the suit (1.0 = plate, 0.5 = splint, etc) - */ - public ArmourDesign(String register, String name, float prot, float dura, float weight, float bulk) { - designs.put(register, this); - this.name = name; - baseProtection = prot; - - durability = dura; - armourWeight = weight; - - this.bulk = bulk; - } - - /** - * These traits only apply when armours are coded to take them - */ - public ArmourDesign calibrateTraits(float cutting, float blunt, float pierce) { - cuttingModifier = cutting; - bluntModifier = blunt; - piercingModifier = pierce; - - return this; - } - - public String getName() { - return name; - } - - public float getDurability() { - return durability; - } - - public float getWeight() { - return armourWeight; - } - - public float getRating() { - return baseProtection; - } - - public float[] getProtectiveTraits() { - return new float[] { cuttingModifier, bluntModifier, piercingModifier }; - } - - public float getBulk() { - return bulk; - } - - /** - * @param group - * "light" "medium" or "heavy" - */ - public ArmourDesign setWeightGroup(String group) { - weightGroup = group; - return this; - } - - private String weightGroup = "medium"; - - /** - * @return "light" "medium" or "heavy" - */ - public String getGroup() { - return weightGroup; - } + public static final String light = "light"; + public static final String medium = "medium"; + public static final String heavy = "heavy"; + // Reg Name Prot Dura Weight Bulk Ctg Bnt Png + public static final ArmourDesign CLOTH = new ArmourDesign("clothing", "Clothing", 1.0F, 1.0F, 0F, 0.25F) + .calibrateTraits(0.5F, 1.0F, 0.5F).setWeightGroup(light);// Weak + public static final ArmourDesign SOLID = new ArmourDesign("default", "Basic", 1.0F, 1.0F, 40F, 1.00F) + .setWeightGroup(medium);// Basic Armour + public static final ArmourDesign MAIL = new ArmourDesign("mail", "Mail", 1.0F, 1.0F, 35F, 0.75F) + .calibrateTraits(1.0F, 0.7F, 0.9F).setWeightGroup(medium);// Vulnerable to blunt + public static final ArmourDesign PLATE = new ArmourDesign("plate", "Plate", 1.5F, 1.0F, 60F, 1.00F) + .calibrateTraits(1.0F, 1.0F, 0.6F).setWeightGroup(heavy);// Vulnerable to piercing + // LIGHT ARMOUR + public static final ArmourDesign LEATHER = new ArmourDesign("leather", "Leather", 1.0F, 1.0F, 10F, 0.25F) + .calibrateTraits(0.7F, 1.0F, 0.5F).setWeightGroup(light);// Slightly better blunt + public static final ArmourDesign PADDING = new ArmourDesign("padding", "Padding", 1.0F, 1.0F, 10F, 1.00F) + .calibrateTraits(0.6F, 1.2F, 0.4F).setWeightGroup(light);// 10kg, Blunt resistent + public static final ArmourDesign STUDDED = new ArmourDesign("studded", "Studded", 0.8F, 1.0F, 10F, 0.25F) + .calibrateTraits(0.85F, 1.0F, 0.9F).setWeightGroup(light);// 10kg, Vulnerable to blunt + // MEDIUM ARMOUR + public static final ArmourDesign SCALEMAIL = new ArmourDesign("scalemail", "Scalemail", 1.0F, 1.0F, 8F, 0.30F) + .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(medium);// 20kg, Average + public static final ArmourDesign CHAINMAIL = new ArmourDesign("chainmail", "Chainmail", 1.0F, 1.0F, 8F, 0.65F) + .calibrateTraits(1.20F, 0.60F, 1.20F).setWeightGroup(medium);// 20kg, Less blunt more piercing + // HEAVY ARMOUR + public static final ArmourDesign SPLINTMAIL = new ArmourDesign("splintmail", "Splintmail", 1.2F, 1.0F, 12F, 0.75F) + .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(heavy);// 30kg, Average + public static final ArmourDesign FIELDPLATE = new ArmourDesign("fieldplate", "Fieldplate", 1.2F, 1.0F, 16F, 1.00F) + .calibrateTraits(1.25F, 1.25F, 1.00F).setWeightGroup(heavy);// 40kg, Vulnerable to piercing + public static final ArmourDesign COGWORK = new ArmourDesign("cogwork", "Cogwork", 4.0F, 8.0F, 30F, 2.00F) + .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(heavy);// >120kg, Massive Protection + // Weight: Above 50kg slows down and increases stamina decay, and classes as + // heavy armour + // Bulk: Above 0.0 means it slows stamina regen + public static HashMap designs = new HashMap(); + // ArmourCalculator + private String name; + private float durability; + private float armourWeight; + + private float baseProtection; + + private float cuttingModifier = 1.0F; + private float piercingModifier = 1.0F; + private float bluntModifier = 1.0F; + + private float bulk; + private String weightGroup = "medium"; + + /** + * @param register The string that it is registered under (For config) + * @param name The name of the Design + * @param prot The protection against basic damage (1.0F = normal protection for + * tier) + * @param dura The durability modifier + * @param weight the weight in Kg of the suit + * @param bulk the bulk of the suit (1.0 = plate, 0.5 = splint, etc) + */ + public ArmourDesign(String register, String name, float prot, float dura, float weight, float bulk) { + designs.put(register, this); + this.name = name; + baseProtection = prot; + + durability = dura; + armourWeight = weight; + + this.bulk = bulk; + } + + /** + * These traits only apply when armours are coded to take them + */ + public ArmourDesign calibrateTraits(float cutting, float blunt, float pierce) { + cuttingModifier = cutting; + bluntModifier = blunt; + piercingModifier = pierce; + + return this; + } + + public String getName() { + return name; + } + + public float getDurability() { + return durability; + } + + public float getWeight() { + return armourWeight; + } + + public float getRating() { + return baseProtection; + } + + public float[] getProtectiveTraits() { + return new float[]{cuttingModifier, bluntModifier, piercingModifier}; + } + + public float getBulk() { + return bulk; + } + + /** + * @param group "light" "medium" or "heavy" + */ + public ArmourDesign setWeightGroup(String group) { + weightGroup = group; + return this; + } + + /** + * @return "light" "medium" or "heavy" + */ + public String getGroup() { + return weightGroup; + } } diff --git a/src/main/java/minefantasy/mf2/api/armour/ArmourMaterialMF.java b/src/main/java/minefantasy/mf2/api/armour/ArmourMaterialMF.java index 0447011c..5d324bd9 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ArmourMaterialMF.java +++ b/src/main/java/minefantasy/mf2/api/armour/ArmourMaterialMF.java @@ -1,41 +1,41 @@ package minefantasy.mf2.api.armour; public class ArmourMaterialMF { - /** - * EnumArmorMaterial VANILLA GUIDE: Leather_____28% Ratio: 1.3 Chain_______48% - * Ratio: 1.9 Iron________60% Ratio: 2.5 Gold________44% Ratio: 1.7 - * Diamond_____80% Ratio: 5.0 - */ - public final String name; - public final int durability; - public final float baseAR; - public final int enchantment; - public final float armourWeight; - public boolean isMythic = false; + /** + * EnumArmorMaterial VANILLA GUIDE: Leather_____28% Ratio: 1.3 Chain_______48% + * Ratio: 1.9 Iron________60% Ratio: 2.5 Gold________44% Ratio: 1.7 + * Diamond_____80% Ratio: 5.0 + */ + public final String name; + public final int durability; + public final float baseAR; + public final int enchantment; + public final float armourWeight; + public boolean isMythic = false; - public float magicResistanceModifier = 0F; - public float fireResistanceModifier = 0F; + public float magicResistanceModifier = 0F; + public float fireResistanceModifier = 0F; - public ArmourMaterialMF(String title, int dura, float AC, int enchant, float weight) { - name = title; - durability = dura; - baseAR = AC; - enchantment = enchant; - armourWeight = weight; - } + public ArmourMaterialMF(String title, int dura, float AC, int enchant, float weight) { + name = title; + durability = dura; + baseAR = AC; + enchantment = enchant; + armourWeight = weight; + } - public ArmourMaterialMF setMagicResistance(float magic) { - magicResistanceModifier = magic; - return this; - } + public ArmourMaterialMF setMagicResistance(float magic) { + magicResistanceModifier = magic; + return this; + } - public ArmourMaterialMF setFireResistance(float fire) { - fireResistanceModifier = fire; - return this; - } + public ArmourMaterialMF setFireResistance(float fire) { + fireResistanceModifier = fire; + return this; + } - public ArmourMaterialMF setMythic(boolean flag) { - isMythic = flag; - return this; - } + public ArmourMaterialMF setMythic(boolean flag) { + isMythic = flag; + return this; + } } diff --git a/src/main/java/minefantasy/mf2/api/armour/CustomArmourEntry.java b/src/main/java/minefantasy/mf2/api/armour/CustomArmourEntry.java index cc658268..fe94feb1 100644 --- a/src/main/java/minefantasy/mf2/api/armour/CustomArmourEntry.java +++ b/src/main/java/minefantasy/mf2/api/armour/CustomArmourEntry.java @@ -1,172 +1,154 @@ package minefantasy.mf2.api.armour; -import java.util.HashMap; - import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.helpers.ArmourCalculator; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; -public class CustomArmourEntry { - /** - * Registers an item to a template of an ArmourDesign, while dividing the suit - * into the 4 pieces If it's unable to divide it, it simply quarters it's value - * - * @param piece - * the item to register - * @param template - * the ArmourDesign to work off - */ - public static void registerItem(Item piece, ArmourDesign template) { - registerItem(piece, template, 1.0F, template.getGroup()); - } - - /** - * Registers an item to a template of an ArmourDesign, while dividing the suit - * into the 4 pieces If it's unable to divide it, it simply quarters it's value - * - * @param piece - * the item to register - * @param template - * the ArmourDesign to work off - * @param weightMod - * the multiplier for the tier weight if a tier is heavier or lighter - */ - public static void registerItem(Item piece, ArmourDesign template, float weightMod, String weightType) { - float divider = 0.25F; - if (piece instanceof ItemArmor) { - divider = ArmourCalculator.sizes[((ItemArmor) piece).armorType]; - } - registerItem(piece, template.getWeight() * weightMod, template.getBulk() * divider, weightType); - } - - /** - * Registeres a piece (called by code or config) - * - * @param piece - * the item to list - * @param weight - * the weight of the piece (Kg) - * @param bulk - * the bulk of the piece - */ - public static void registerItem(Item piece, float weight, float bulk, String AC) { - registerItem(piece, weight, bulk, true, AC); - } - - /** - * Registeres a piece (called by code or config) - * - * @param piece - * the item to list - * @param weight - * the weight of the piece (Kg) - * @param bulk - * the bulk of the piece - * @param alterSpeed - * if the armour's weight slows you down - */ - public static void registerItem(Item piece, float weight, float bulk, boolean alterSpeed, String AC) { - int id = Item.getIdFromItem(piece); - - MineFantasyAPI.debugMsg("Added Custom " + AC + " armour: " + piece.getUnlocalizedName() + "(" + id - + ") Traits = " + weight + "," + bulk + " alter speed = " + alterSpeed); - entries.put(id, new CustomArmourEntry(id, weight, bulk, alterSpeed, AC)); - } - - /** - * Returns the "Armour Class" Weight type Light, Medium or Heavy - */ - public static String getArmourClass(ItemStack piece) { - CustomArmourEntry entry = getEntry(piece); - if (entry != null) { - return entry.AC; - } - ArmourDesign deft = ArmourCalculator.getDefaultAD(piece); - return deft.getGroup(); - } - - /** - * Gets the variables for the item if there are any: order is weight, bulk - * - * @param deft - * the default preset if not present - */ - public static float[] getEntryVars(ItemStack piece) { - CustomArmourEntry entry = getEntry(piece); - if (entry != null) { - return new float[] { entry.weight, entry.bulkiness }; - } - ArmourDesign deft = ArmourCalculator.getDefaultAD(piece); - return new float[] { deft.getWeight(), deft.getBulk() }; - } - - /** - * Determines if a piece can slow you down - */ - public static boolean doesPieceSlowDown(ItemStack piece) { - if (piece != null) { - CustomArmourEntry entry = getEntry(piece); - if (entry != null) { - return entry.alterSpeed; - } - } - return false; - } - - /** - * Gets the entry for an item - * - * @param piece - * the armour item - * @return the entry(if there is one), else null - */ - public static CustomArmourEntry getEntry(ItemStack piece) { - return getEntry(piece.getItem()); - } - - /** - * Gets the entry for an item - * - * @param piece - * the armour item - * @return the entry(if there is one), else null - */ - public static CustomArmourEntry getEntry(Item piece) { - if (piece != null) { - int id = Item.getIdFromItem(piece); - if (entries.containsKey(id)) { - return entries.get(id); - } - } - return null; - } - - public boolean alterSpeed; - - public int itemID; - /** - * The Weight of the piece(not suit) - */ - public float weight; - /** - * The Bulk of the piece(not suit) - */ - public float bulkiness; - - /** - * Light Medium or Heavy - */ - public String AC; - - public static HashMap entries = new HashMap(); +import java.util.HashMap; - private CustomArmourEntry(int id, float weight, float bulk, boolean alterSpeed, String AC) { - this.alterSpeed = alterSpeed; - this.itemID = id; - this.weight = weight; - this.bulkiness = bulk; - this.AC = AC; - } +public class CustomArmourEntry { + public static HashMap entries = new HashMap(); + public boolean alterSpeed; + public int itemID; + /** + * The Weight of the piece(not suit) + */ + public float weight; + /** + * The Bulk of the piece(not suit) + */ + public float bulkiness; + /** + * Light Medium or Heavy + */ + public String AC; + + private CustomArmourEntry(int id, float weight, float bulk, boolean alterSpeed, String AC) { + this.alterSpeed = alterSpeed; + this.itemID = id; + this.weight = weight; + this.bulkiness = bulk; + this.AC = AC; + } + + /** + * Registers an item to a template of an ArmourDesign, while dividing the suit + * into the 4 pieces If it's unable to divide it, it simply quarters it's value + * + * @param piece the item to register + * @param template the ArmourDesign to work off + */ + public static void registerItem(Item piece, ArmourDesign template) { + registerItem(piece, template, 1.0F, template.getGroup()); + } + + /** + * Registers an item to a template of an ArmourDesign, while dividing the suit + * into the 4 pieces If it's unable to divide it, it simply quarters it's value + * + * @param piece the item to register + * @param template the ArmourDesign to work off + * @param weightMod the multiplier for the tier weight if a tier is heavier or lighter + */ + public static void registerItem(Item piece, ArmourDesign template, float weightMod, String weightType) { + float divider = 0.25F; + if (piece instanceof ItemArmor) { + divider = ArmourCalculator.sizes[((ItemArmor) piece).armorType]; + } + registerItem(piece, template.getWeight() * weightMod, template.getBulk() * divider, weightType); + } + + /** + * Registeres a piece (called by code or config) + * + * @param piece the item to list + * @param weight the weight of the piece (Kg) + * @param bulk the bulk of the piece + */ + public static void registerItem(Item piece, float weight, float bulk, String AC) { + registerItem(piece, weight, bulk, true, AC); + } + + /** + * Registeres a piece (called by code or config) + * + * @param piece the item to list + * @param weight the weight of the piece (Kg) + * @param bulk the bulk of the piece + * @param alterSpeed if the armour's weight slows you down + */ + public static void registerItem(Item piece, float weight, float bulk, boolean alterSpeed, String AC) { + int id = Item.getIdFromItem(piece); + + MineFantasyAPI.debugMsg("Added Custom " + AC + " armour: " + piece.getUnlocalizedName() + "(" + id + + ") Traits = " + weight + "," + bulk + " alter speed = " + alterSpeed); + entries.put(id, new CustomArmourEntry(id, weight, bulk, alterSpeed, AC)); + } + + /** + * Returns the "Armour Class" Weight type Light, Medium or Heavy + */ + public static String getArmourClass(ItemStack piece) { + CustomArmourEntry entry = getEntry(piece); + if (entry != null) { + return entry.AC; + } + ArmourDesign deft = ArmourCalculator.getDefaultAD(piece); + return deft.getGroup(); + } + + /** + * Gets the variables for the item if there are any: order is weight, bulk + * + * @param deft the default preset if not present + */ + public static float[] getEntryVars(ItemStack piece) { + CustomArmourEntry entry = getEntry(piece); + if (entry != null) { + return new float[]{entry.weight, entry.bulkiness}; + } + ArmourDesign deft = ArmourCalculator.getDefaultAD(piece); + return new float[]{deft.getWeight(), deft.getBulk()}; + } + + /** + * Determines if a piece can slow you down + */ + public static boolean doesPieceSlowDown(ItemStack piece) { + if (piece != null) { + CustomArmourEntry entry = getEntry(piece); + if (entry != null) { + return entry.alterSpeed; + } + } + return false; + } + + /** + * Gets the entry for an item + * + * @param piece the armour item + * @return the entry(if there is one), else null + */ + public static CustomArmourEntry getEntry(ItemStack piece) { + return getEntry(piece.getItem()); + } + + /** + * Gets the entry for an item + * + * @param piece the armour item + * @return the entry(if there is one), else null + */ + public static CustomArmourEntry getEntry(Item piece) { + if (piece != null) { + int id = Item.getIdFromItem(piece); + if (entries.containsKey(id)) { + return entries.get(id); + } + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/api/armour/CustomDamageRatioEntry.java b/src/main/java/minefantasy/mf2/api/armour/CustomDamageRatioEntry.java index 2c91340c..d0d9203a 100644 --- a/src/main/java/minefantasy/mf2/api/armour/CustomDamageRatioEntry.java +++ b/src/main/java/minefantasy/mf2/api/armour/CustomDamageRatioEntry.java @@ -1,73 +1,67 @@ package minefantasy.mf2.api.armour; -import java.util.HashMap; - import net.minecraft.item.Item; +import java.util.HashMap; + public class CustomDamageRatioEntry { - public static HashMap entries = new HashMap(); - public static HashMap entriesProj = new HashMap(); + public static HashMap entries = new HashMap(); + public static HashMap entriesProj = new HashMap(); - public float[] vars; + public float[] vars; - /** - * Register a weapon to give variables - * - * @param item - * the item - * @param vars - * the damage type ratio cutting:blunt - */ - public static void registerItem(Item item, float[] vars) { - registerItem(Item.getIdFromItem(item), vars); - } + private CustomDamageRatioEntry(float[] vars) { + this.vars = vars; + } - /** - * Register a weapon to give variables - * - * @param id - * the item id - * @param vars - * the damage type ratio cutting:blunt - */ - public static void registerItem(int id, float[] vars) { - entries.put(id, new CustomDamageRatioEntry(vars)); - } + /** + * Register a weapon to give variables + * + * @param item the item + * @param vars the damage type ratio cutting:blunt + */ + public static void registerItem(Item item, float[] vars) { + registerItem(Item.getIdFromItem(item), vars); + } - /** - * Register an entity (like arrows) to give variables - * - * @param id - * the entity id - * @param vars - * the damage type ratio cutting:blunt - */ - public static void registerEntity(String id, float[] vars) { - entriesProj.put(id, new CustomDamageRatioEntry(vars)); - } + /** + * Register a weapon to give variables + * + * @param id the item id + * @param vars the damage type ratio cutting:blunt + */ + public static void registerItem(int id, float[] vars) { + entries.put(id, new CustomDamageRatioEntry(vars)); + } - /** - * Gets the ratio for an item, null if it's not found - */ - public static float[] getTraits(Item item) { - return getTraits(Item.getIdFromItem(item)); - } + /** + * Register an entity (like arrows) to give variables + * + * @param id the entity id + * @param vars the damage type ratio cutting:blunt + */ + public static void registerEntity(String id, float[] vars) { + entriesProj.put(id, new CustomDamageRatioEntry(vars)); + } - /** - * Gets the ratio for an item, null if it's not found - */ - public static float[] getTraits(int id) { - return entries.get(id) != null ? entries.get(id).vars : null; - } + /** + * Gets the ratio for an item, null if it's not found + */ + public static float[] getTraits(Item item) { + return getTraits(Item.getIdFromItem(item)); + } - /** - * Gets the ratio for an entity, null if it's not found - */ - public static float[] getTraits(String id) { - return entriesProj.get(id) != null ? entriesProj.get(id).vars : new float[] { 1, 1, 1 }; - } + /** + * Gets the ratio for an item, null if it's not found + */ + public static float[] getTraits(int id) { + return entries.get(id) != null ? entries.get(id).vars : null; + } - private CustomDamageRatioEntry(float[] vars) { - this.vars = vars; - } + /** + * Gets the ratio for an entity, null if it's not found + */ + public static float[] getTraits(String id) { + return entriesProj.get(id) != null ? entriesProj.get(id).vars : new float[]{1, 1, 1}; + } } diff --git a/src/main/java/minefantasy/mf2/api/armour/IArmourMF.java b/src/main/java/minefantasy/mf2/api/armour/IArmourMF.java index 90391558..32f8ae87 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IArmourMF.java +++ b/src/main/java/minefantasy/mf2/api/armour/IArmourMF.java @@ -3,18 +3,19 @@ import net.minecraft.item.ItemStack; public interface IArmourMF { - // NOTE: "Slot" Variable works 0=Helmet, 1=Chest, 2=Legs, 3=Boots - /** - * Gets how heavy the piece is. (mesured in Kg). this is used for slowing - * movement, and stamina decay - */ - public float getPieceWeight(ItemStack item, int slot); + // NOTE: "Slot" Variable works 0=Helmet, 1=Chest, 2=Legs, 3=Boots - /** - * This is if the suit is light or heavy armour (pretty much anything above 50kg - * is heavy) - * - * @return "light" "medium" or "heavy" - */ - public String getSuitWeigthType(ItemStack item); + /** + * Gets how heavy the piece is. (mesured in Kg). this is used for slowing + * movement, and stamina decay + */ + public float getPieceWeight(ItemStack item, int slot); + + /** + * This is if the suit is light or heavy armour (pretty much anything above 50kg + * is heavy) + * + * @return "light" "medium" or "heavy" + */ + public String getSuitWeigthType(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IArmourPenetrationMob.java b/src/main/java/minefantasy/mf2/api/armour/IArmourPenetrationMob.java index 32cff747..46f9c4dc 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IArmourPenetrationMob.java +++ b/src/main/java/minefantasy/mf2/api/armour/IArmourPenetrationMob.java @@ -1,5 +1,5 @@ package minefantasy.mf2.api.armour; public interface IArmourPenetrationMob { - public float[] getHitTraits(); + public float[] getHitTraits(); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IArmourRating.java b/src/main/java/minefantasy/mf2/api/armour/IArmourRating.java index aec9ef39..8e784ae6 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IArmourRating.java +++ b/src/main/java/minefantasy/mf2/api/armour/IArmourRating.java @@ -3,9 +3,9 @@ import net.minecraft.item.ItemStack; public interface IArmourRating { - /** - * Gets the scale in relation for the total suit (0-4 = head, chest, legs, - * boots) - */ - public float scalePiece(ItemStack item); + /** + * Gets the scale in relation for the total suit (0-4 = head, chest, legs, + * boots) + */ + public float scalePiece(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IArmouredEntity.java b/src/main/java/minefantasy/mf2/api/armour/IArmouredEntity.java index 9176f75a..d4f785c3 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IArmouredEntity.java +++ b/src/main/java/minefantasy/mf2/api/armour/IArmouredEntity.java @@ -3,5 +3,5 @@ import net.minecraft.util.DamageSource; public interface IArmouredEntity { - public float getThreshold(DamageSource src); + public float getThreshold(DamageSource src); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IElementalResistance.java b/src/main/java/minefantasy/mf2/api/armour/IElementalResistance.java index cf5f4d86..27d2447d 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IElementalResistance.java +++ b/src/main/java/minefantasy/mf2/api/armour/IElementalResistance.java @@ -4,27 +4,27 @@ import net.minecraft.util.DamageSource; public interface IElementalResistance { - /** - * @return this determines the chance an item is to deflect arrows. more damage - * means less chance - */ - public float getArrowDeflection(ItemStack item, DamageSource source); + /** + * @return this determines the chance an item is to deflect arrows. more damage + * means less chance + */ + public float getArrowDeflection(ItemStack item, DamageSource source); - /** - * @return the Magic resistance percent (0-100) (for the whole suit) -values - * mean weakness - */ - public float getMagicResistance(ItemStack item, DamageSource source); + /** + * @return the Magic resistance percent (0-100) (for the whole suit) -values + * mean weakness + */ + public float getMagicResistance(ItemStack item, DamageSource source); - /** - * @return the Magic resistance percent (0-100) (for the whole suit) -values - * mean weakness - */ - public float getFireResistance(ItemStack item, DamageSource source); + /** + * @return the Magic resistance percent (0-100) (for the whole suit) -values + * mean weakness + */ + public float getFireResistance(ItemStack item, DamageSource source); - /** - * @return the Base resistance percent for non magic/fire(0-100) (for the whole - * suit) -values mean weakness - */ - public float getBaseResistance(ItemStack item, DamageSource source); + /** + * @return the Base resistance percent for non magic/fire(0-100) (for the whole + * suit) -values mean weakness + */ + public float getBaseResistance(ItemStack item, DamageSource source); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IGasProtector.java b/src/main/java/minefantasy/mf2/api/armour/IGasProtector.java index f49d0e4e..156bffaf 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IGasProtector.java +++ b/src/main/java/minefantasy/mf2/api/armour/IGasProtector.java @@ -3,9 +3,9 @@ import net.minecraft.item.ItemStack; public interface IGasProtector { - /** - * Applies ONLY to helmets, gets the percentage (1-100) of gas protection from - * smoke - */ - public float getGasProtection(ItemStack item); + /** + * Applies ONLY to helmets, gets the percentage (1-100) of gas protection from + * smoke + */ + public float getGasProtection(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/armour/IPowerArmour.java b/src/main/java/minefantasy/mf2/api/armour/IPowerArmour.java index 36286707..ea294b59 100644 --- a/src/main/java/minefantasy/mf2/api/armour/IPowerArmour.java +++ b/src/main/java/minefantasy/mf2/api/armour/IPowerArmour.java @@ -5,18 +5,17 @@ public interface IPowerArmour { - boolean isFullyArmoured(); + boolean isFullyArmoured(); - float modifyDamage(EntityLivingBase user, float damage, DamageSource src); + float modifyDamage(EntityLivingBase user, float damage, DamageSource src); - boolean isPowered(); + boolean isPowered(); - /** - * Is armour covering a particular limb - * - * @param limb - * (head, body, left_arm, right_arm, left_leg, right_leg) - */ - boolean isArmoured(String limb); + /** + * Is armour covering a particular limb + * + * @param limb (head, body, left_arm, right_arm, left_leg, right_leg) + */ + boolean isArmoured(String limb); } diff --git a/src/main/java/minefantasy/mf2/api/armour/ISpecialArmourMF.java b/src/main/java/minefantasy/mf2/api/armour/ISpecialArmourMF.java index 397c2d6f..17943475 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ISpecialArmourMF.java +++ b/src/main/java/minefantasy/mf2/api/armour/ISpecialArmourMF.java @@ -7,19 +7,19 @@ import net.minecraft.util.DamageSource; public interface ISpecialArmourMF { - public float getDTValue(EntityLivingBase user, ItemStack armour, DamageSource src); + public float getDTValue(EntityLivingBase user, ItemStack armour, DamageSource src); - @SideOnly(Side.CLIENT) - /** - * DamageType: 0=cutting, 1=blunt, 2=piercing - */ - public float getDTDisplay(ItemStack armour, int damageType); + @SideOnly(Side.CLIENT) + /** + * DamageType: 0=cutting, 1=blunt, 2=piercing + */ + public float getDTDisplay(ItemStack armour, int damageType); - public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src); + public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src); - @SideOnly(Side.CLIENT) - /** - * DamageType: 0=cutting, 1=blunt, 2=piercing - */ - public float getDRDisplay(ItemStack armour, int damageType); + @SideOnly(Side.CLIENT) + /** + * DamageType: 0=cutting, 1=blunt, 2=piercing + */ + public float getDRDisplay(ItemStack armour, int damageType); } diff --git a/src/main/java/minefantasy/mf2/api/armour/ItemArmourMFBase.java b/src/main/java/minefantasy/mf2/api/armour/ItemArmourMFBase.java index 242ecf7b..e2bf1e32 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ItemArmourMFBase.java +++ b/src/main/java/minefantasy/mf2/api/armour/ItemArmourMFBase.java @@ -1,8 +1,5 @@ package minefantasy.mf2.api.armour; -import java.text.DecimalFormat; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.ArmourCalculator; @@ -18,257 +15,257 @@ import net.minecraftforge.common.ISpecialArmor; import net.minecraftforge.common.util.EnumHelper; +import java.text.DecimalFormat; +import java.util.List; + public class ItemArmourMFBase extends ItemArmor implements ISpecialArmor, IArmourMF, IArmourRating, ISpecialArmourMF { - public static ArmorMaterial baseMaterial = EnumHelper.addArmorMaterial("MF Armour Base", 0, - new int[] { 2, 6, 5, 2 }, 0); - private int piece; - private int baseRating; - public float baseAR; - public int enchantment; - public String texture; - public float armourWeight; - public ArmourMaterialMF material; - public ArmourDesign design; - protected float suitBulk; - public float DT; - - public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); - - public ItemArmourMFBase(String name, ArmourMaterialMF material, ArmourDesign AD, int slot, String tex) { - super(baseMaterial, 0, slot); - this.material = material; - baseAR = material.baseAR; - armourWeight = AD.getWeight() * material.armourWeight; - enchantment = material.enchantment; - this.piece = slot; - design = AD; - suitBulk = design.getBulk(); - texture = tex; - float baseDura = material.durability * design.getDurability() / 2F; - float dura = baseDura / 2F + (baseDura / 2F * ArmourCalculator.sizes[slot] / ArmourCalculator.sizes[1]); - this.setMaxDamage((int) dura); - this.setUnlocalizedName(name); - setDT(getBaseAC() * scalePiece()); - - baseRating = ArmourCalculator.translateToVanillaAR(getBaseAC() + 1F, - baseMaterial.getDamageReductionAmount(slot), 15); - } - - public ItemArmourMFBase setDT(float DT) { - this.DT = DT; - return this; - } - - /* - * Piece | Slot 0 | 3 1 | 2 2 | 1 3 | 0 - */ - @Override - public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { - initArmourDamage(entity, stack, damage); - } - - public void initArmourDamage(EntityLivingBase user, ItemStack armour, float damage) { - armour.damageItem((int) (damage / 5F) + 1, user); - } - - @Override - public int getArmorDisplay(EntityPlayer player, ItemStack armour, int slot) { - float max = armour.getMaxDamage(); - float dam = max - armour.getItemDamage(); - - return Math.round(5F / max * dam); - } - - @Override - public ArmorProperties getProperties(EntityLivingBase player, ItemStack armour, DamageSource source, double damage, - int slot) { - float AC = getProtectionRatio(armour); - AC = ArmourCalculator.getArmourValueMod(armour, AC); - - if (ArmourCalculator.advancedDamageTypes && !player.worldObj.isRemote) { - AC = ArmourCalculator.adjustACForDamage(source, AC, getProtectiveTrait(armour, 0), - getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); - } - - AC *= getACModifier(player, armour, source, damage); - - if (source == DamageSource.fall && design == ArmourDesign.PLATE) { - AC = 1F / material.armourWeight; - } else if (source.isMagicDamage()) { - AC = getMagicAC(AC, source, damage, player); - } else if (source == DamageSource.onFire) { - AC *= getACForBurn(); - } else if (source.isUnblockable()) { - AC *= getUnblockableResistance(armour, source); - } - AC *= getSpecialModifier(armour, source); - - if (player.getEntityData().hasKey("MF_ZombieArmour")) { - AC -= 1.5F; - if (AC < 0) - AC = 0; - } - AC++;// because 1.0AC = no armour so it adds ontop of this - - double totalPercent = ArmourCalculator.convertToPercent(AC); - double maxPercent = 0.99D;// max percentage is 99% damage to avoid immunity - - if (totalPercent > maxPercent) { - totalPercent = maxPercent; - } - double percent = totalPercent * scalePiece(); - if (percent < 0) { - percent = 0; - } - - return new ArmorProperties(0, percent, Integer.MAX_VALUE); - } - - protected float getSpecialModifier(ItemStack armour, DamageSource source) { - return 1.0F; - } - - private float getACForBurn() { - return armourWeight >= ArmourCalculator.encumberanceArray[1] ? 0.1F - : armourWeight >= ArmourCalculator.encumberanceArray[0] ? 0.05F : 0F; - } - - public float getUnblockableResistance(ItemStack item, DamageSource source) { - return 0F; - } - - public float getMagicAC(float AC, DamageSource source, double damage, EntityLivingBase player) { - return 0F; - } - - protected float getACModifier(EntityLivingBase player, ItemStack armour, DamageSource source, double damage) { - return 1.0F; - } - - public float scalePiece() { - return ArmourCalculator.sizes[piece]; - } - - protected float getProtectionRatio(ItemStack item) { - return getBaseAC(); - } - - protected float getBaseAC() { - return material.baseAR * design.getRating(); - } - - private void addModifier(List list, ItemStack item, float ratio, String name) { - if (getProtectionRatio(item) != ratio) { - if (getProtectionRatio(item) > ratio) { - float percent = (ratio / getProtectionRatio(item)) - 1F; - list.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted( - "attribute.modifier.take." + 1, decimal_format.format(-percent * 100), - StatCollector.translateToLocal("attribute.armour." + name))); - } else { - float percent = (ratio / getProtectionRatio(item)) - 1F; - list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( - "attribute.modifier.plus." + 1, decimal_format.format(percent * 100), - StatCollector.translateToLocal("attribute.armour." + name))); - } - } - } - - public ArmourMaterialMF getMaterial() { - return this.material; - } - - @Override - public int getMaxDamage(ItemStack stack) { - if (isUnbreakable()) { - setUnbreakable(stack); - } - return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); - } - - protected boolean isUnbreakable() { - return false; - } - - @Override - public float scalePiece(ItemStack item) { - return scalePiece(); - } - - @Override - public int getItemEnchantability() { - return material.enchantment; - } - - @Override - public float getPieceWeight(ItemStack item, int slot) { - return armourWeight * ArmourCalculator.sizes[slot]; - } - - public static void setUnbreakable(ItemStack tool) { - if (!tool.hasTagCompound()) { - tool.setTagCompound(new NBTTagCompound()); - } - tool.getTagCompound().setBoolean("Unbreakable", true); - } - - private static final float[] AC = new float[] { 40F, 60F }; - - @Override - public String getSuitWeigthType(ItemStack item) { - return design.getGroup(); - } - - @Override - public float getDTValue(EntityLivingBase user, ItemStack armour, DamageSource src) { - float DT2 = DT; - - if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { - DT2 = ArmourCalculator.adjustACForDamage(src, DT2, getProtectiveTrait(armour, 0), - getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); - } - return DT2; - } - - @Override - @SideOnly(Side.CLIENT) - public float getDTDisplay(ItemStack armour, int damageType) { - return design.getProtectiveTraits()[damageType] * DT; - } - - @Override - public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src) { - float DR = getProtectionRatio(armour) * scalePiece(); - - if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { - DR = ArmourCalculator.adjustACForDamage(src, DR, getProtectiveTrait(armour, 0), - getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); - } - return DR; - } - - @Override - @SideOnly(Side.CLIENT) - public float getDRDisplay(ItemStack armour, int damageType) { - float DR = getProtectionRatio(armour) * scalePiece(); - - if (ArmourCalculator.advancedDamageTypes) { - DR = ArmourCalculator.modifyACForType(damageType, DR, getProtectiveTrait(armour, 0), - getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); - } - return DR; - } - - public float getProtectiveTrait(ItemStack item, int dtype) { - return design.getProtectiveTraits()[dtype]; - } - - /** - * Gets a modifier, improving resistances against the elements - * - * @param hazard - * is the type of damage, like "fire" - */ - public float getResistanceModifier(ItemStack item, String hazard) { - return 1.0F; - } + public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); + private static final float[] AC = new float[]{40F, 60F}; + public static ArmorMaterial baseMaterial = EnumHelper.addArmorMaterial("MF Armour Base", 0, + new int[]{2, 6, 5, 2}, 0); + public float baseAR; + public int enchantment; + public String texture; + public float armourWeight; + public ArmourMaterialMF material; + public ArmourDesign design; + public float DT; + protected float suitBulk; + private int piece; + private int baseRating; + + public ItemArmourMFBase(String name, ArmourMaterialMF material, ArmourDesign AD, int slot, String tex) { + super(baseMaterial, 0, slot); + this.material = material; + baseAR = material.baseAR; + armourWeight = AD.getWeight() * material.armourWeight; + enchantment = material.enchantment; + this.piece = slot; + design = AD; + suitBulk = design.getBulk(); + texture = tex; + float baseDura = material.durability * design.getDurability() / 2F; + float dura = baseDura / 2F + (baseDura / 2F * ArmourCalculator.sizes[slot] / ArmourCalculator.sizes[1]); + this.setMaxDamage((int) dura); + this.setUnlocalizedName(name); + setDT(getBaseAC() * scalePiece()); + + baseRating = ArmourCalculator.translateToVanillaAR(getBaseAC() + 1F, + baseMaterial.getDamageReductionAmount(slot), 15); + } + + public ItemArmourMFBase setDT(float DT) { + this.DT = DT; + return this; + } + + /* + * Piece | Slot 0 | 3 1 | 2 2 | 1 3 | 0 + */ + @Override + public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { + initArmourDamage(entity, stack, damage); + } + + public void initArmourDamage(EntityLivingBase user, ItemStack armour, float damage) { + armour.damageItem((int) (damage / 5F) + 1, user); + } + + @Override + public int getArmorDisplay(EntityPlayer player, ItemStack armour, int slot) { + float max = armour.getMaxDamage(); + float dam = max - armour.getItemDamage(); + + return Math.round(5F / max * dam); + } + + @Override + public ArmorProperties getProperties(EntityLivingBase player, ItemStack armour, DamageSource source, double damage, + int slot) { + float AC = getProtectionRatio(armour); + AC = ArmourCalculator.getArmourValueMod(armour, AC); + + if (ArmourCalculator.advancedDamageTypes && !player.worldObj.isRemote) { + AC = ArmourCalculator.adjustACForDamage(source, AC, getProtectiveTrait(armour, 0), + getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); + } + + AC *= getACModifier(player, armour, source, damage); + + if (source == DamageSource.fall && design == ArmourDesign.PLATE) { + AC = 1F / material.armourWeight; + } else if (source.isMagicDamage()) { + AC = getMagicAC(AC, source, damage, player); + } else if (source == DamageSource.onFire) { + AC *= getACForBurn(); + } else if (source.isUnblockable()) { + AC *= getUnblockableResistance(armour, source); + } + AC *= getSpecialModifier(armour, source); + + if (player.getEntityData().hasKey("MF_ZombieArmour")) { + AC -= 1.5F; + if (AC < 0) + AC = 0; + } + AC++;// because 1.0AC = no armour so it adds ontop of this + + double totalPercent = ArmourCalculator.convertToPercent(AC); + double maxPercent = 0.99D;// max percentage is 99% damage to avoid immunity + + if (totalPercent > maxPercent) { + totalPercent = maxPercent; + } + double percent = totalPercent * scalePiece(); + if (percent < 0) { + percent = 0; + } + + return new ArmorProperties(0, percent, Integer.MAX_VALUE); + } + + protected float getSpecialModifier(ItemStack armour, DamageSource source) { + return 1.0F; + } + + private float getACForBurn() { + return armourWeight >= ArmourCalculator.encumberanceArray[1] ? 0.1F + : armourWeight >= ArmourCalculator.encumberanceArray[0] ? 0.05F : 0F; + } + + public float getUnblockableResistance(ItemStack item, DamageSource source) { + return 0F; + } + + public float getMagicAC(float AC, DamageSource source, double damage, EntityLivingBase player) { + return 0F; + } + + protected float getACModifier(EntityLivingBase player, ItemStack armour, DamageSource source, double damage) { + return 1.0F; + } + + public float scalePiece() { + return ArmourCalculator.sizes[piece]; + } + + protected float getProtectionRatio(ItemStack item) { + return getBaseAC(); + } + + protected float getBaseAC() { + return material.baseAR * design.getRating(); + } + + private void addModifier(List list, ItemStack item, float ratio, String name) { + if (getProtectionRatio(item) != ratio) { + if (getProtectionRatio(item) > ratio) { + float percent = (ratio / getProtectionRatio(item)) - 1F; + list.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted( + "attribute.modifier.take." + 1, decimal_format.format(-percent * 100), + StatCollector.translateToLocal("attribute.armour." + name))); + } else { + float percent = (ratio / getProtectionRatio(item)) - 1F; + list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( + "attribute.modifier.plus." + 1, decimal_format.format(percent * 100), + StatCollector.translateToLocal("attribute.armour." + name))); + } + } + } + + public ArmourMaterialMF getMaterial() { + return this.material; + } + + @Override + public int getMaxDamage(ItemStack stack) { + if (isUnbreakable()) { + setUnbreakable(stack); + } + return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); + } + + protected boolean isUnbreakable() { + return false; + } + + public static void setUnbreakable(ItemStack tool) { + if (!tool.hasTagCompound()) { + tool.setTagCompound(new NBTTagCompound()); + } + tool.getTagCompound().setBoolean("Unbreakable", true); + } + + @Override + public float scalePiece(ItemStack item) { + return scalePiece(); + } + + @Override + public int getItemEnchantability() { + return material.enchantment; + } + + @Override + public float getPieceWeight(ItemStack item, int slot) { + return armourWeight * ArmourCalculator.sizes[slot]; + } + + @Override + public String getSuitWeigthType(ItemStack item) { + return design.getGroup(); + } + + @Override + public float getDTValue(EntityLivingBase user, ItemStack armour, DamageSource src) { + float DT2 = DT; + + if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { + DT2 = ArmourCalculator.adjustACForDamage(src, DT2, getProtectiveTrait(armour, 0), + getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); + } + return DT2; + } + + @Override + @SideOnly(Side.CLIENT) + public float getDTDisplay(ItemStack armour, int damageType) { + return design.getProtectiveTraits()[damageType] * DT; + } + + @Override + public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src) { + float DR = getProtectionRatio(armour) * scalePiece(); + + if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { + DR = ArmourCalculator.adjustACForDamage(src, DR, getProtectiveTrait(armour, 0), + getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); + } + return DR; + } + + @Override + @SideOnly(Side.CLIENT) + public float getDRDisplay(ItemStack armour, int damageType) { + float DR = getProtectionRatio(armour) * scalePiece(); + + if (ArmourCalculator.advancedDamageTypes) { + DR = ArmourCalculator.modifyACForType(damageType, DR, getProtectiveTrait(armour, 0), + getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); + } + return DR; + } + + public float getProtectiveTrait(ItemStack item, int dtype) { + return design.getProtectiveTraits()[dtype]; + } + + /** + * Gets a modifier, improving resistances against the elements + * + * @param hazard is the type of damage, like "fire" + */ + public float getResistanceModifier(ItemStack item, String hazard) { + return 1.0F; + } } diff --git a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java index 670a6708..cf799074 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java +++ b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java @@ -2,14 +2,10 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.material.CustomMaterial; import net.minecraft.entity.passive.EntityHorse; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; -import net.minecraftforge.client.event.RenderLivingEvent; -import org.lwjgl.opengl.GL11; public class ItemHorseArmorMFBase extends Item { @@ -33,9 +29,9 @@ public ItemHorseArmorMFBase(String name, ArmourMaterialMF material, ArmourDesign * @param horse: An instance of the horse which is currently wearing this piece of armor. * @param stack: An instance of the ItemStack currently in the horse's armor slot. * @return int: An integer based representation of the armor points which should be given - * to a horse by this armor item. + * to a horse by this armor item. */ - public int getArmorValue (EntityHorse horse, ItemStack stack) { + public int getArmorValue(EntityHorse horse, ItemStack stack) { return 0; } @@ -46,19 +42,20 @@ public int getArmorValue (EntityHorse horse, ItemStack stack) { * @param horse: An instance of the horse which is currently wearing this piece of armor. * @param stack: An instance of the ItemStack currently in the horse's armor slot. */ - public void onHorseUpdate (EntityHorse horse, ItemStack stack) {} + public void onHorseUpdate(EntityHorse horse, ItemStack stack) { + } /** * Called when a horse wearing this piece of armor has been hurt. * - * @param horse: An instance of the horse which is currently wearing this piece of armor. - * @param stack: An instance of the ItemStack currently in the horse's armor slot. + * @param horse: An instance of the horse which is currently wearing this piece of armor. + * @param stack: An instance of the ItemStack currently in the horse's armor slot. * @param source: The DamageSource which caused the horse to be hurt. * @param damage: The amount of damage that the horse received. * @return boolean: If true, the horse will not be hurt and the event will be canceled. */ - public boolean onHorseDamaged (EntityHorse horse, ItemStack stack, DamageSource source, float damage) { - stack.damageItem((int)(damage / 5F) + 1, horse); + public boolean onHorseDamaged(EntityHorse horse, ItemStack stack, DamageSource source, float damage) { + stack.damageItem((int) (damage / 5F) + 1, horse); return true; } @@ -70,10 +67,10 @@ public boolean onHorseDamaged (EntityHorse horse, ItemStack stack, DamageSource * @param horse: An instance of the horse which is currently wearing this piece of armor. * @param stack: An instance of the ItemStack currently in the horse's armor slot. * @return String: A string based representation of the armor texture resource location. - * EG: testmod:textures/entity/horse/armor/horse_armor_test.png + * EG: testmod:textures/entity/horse/armor/horse_armor_test.png */ @SideOnly(Side.CLIENT) - public String getArmorTexture (EntityHorse horse, ItemStack stack) { + public String getArmorTexture(EntityHorse horse, ItemStack stack) { return armorTexture; } } diff --git a/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java b/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java index 0da370d4..a9a6bef6 100644 --- a/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java +++ b/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java @@ -1,102 +1,89 @@ package minefantasy.mf2.api.cooking; -import java.util.HashMap; - import minefantasy.mf2.api.helpers.CustomToolHelper; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; -public class CookRecipe { - public static Item burnt_food = null; - private static final HashMap recipeList = new HashMap(); - - public static CookRecipe addRecipe(ItemStack in, ItemStack out, int min, int max, int time, boolean bake, - boolean canBurn) { - return addRecipe(in, out, new ItemStack(burnt_food), min, max, time, bake, canBurn); - } - - /** - * Add a recipe - * - * @param output - * The result item - * @param min - * the limit temperature for cooking - * @param max - * the max temperature before burning - * @param time - * the time in ticks taken - * @param bake - * whether it needs to be enclosed in an oven - */ - public static CookRecipe addRecipe(ItemStack in, ItemStack out, ItemStack burnt, int min, int max, int time, - boolean bake, boolean canBurn) { - return addRecipe(in, out, burnt, min, max, time, time / 2, bake, canBurn); - } +import java.util.HashMap; - /** - * Add a recipe - * - * @param output - * The result item - * @param min - * the limit temperature for cooking - * @param max - * the max temperature before burning - * @param time - * the time in ticks taken - * @param bake - * whether it needs to be enclosed in an oven - */ - public static CookRecipe addRecipe(ItemStack in, ItemStack out, ItemStack burnt, int min, int max, int time, - int burntime, boolean bake, boolean canBurn) { - CookRecipe recipe = new CookRecipe(out, burnt, min, max, time, bake, canBurn); - recipeList.put(CustomToolHelper.getReferenceName(in), recipe); +public class CookRecipe { + private static final HashMap recipeList = new HashMap(); + public static Item burnt_food = null; + public static boolean canCookBasics = true; + public final int maxTemperature, minTemperature, time; + public final boolean isBaking; + public final ItemStack output, burnt; + public final boolean canBurn; + public CookRecipe(ItemStack output, ItemStack burnt, int min, int max, int time, boolean bake, boolean burn) { + this.output = output; + this.burnt = burnt; + this.minTemperature = min; + this.maxTemperature = max; + this.time = time; + this.isBaking = bake; + this.canBurn = burn; + } - if (canBurn) { - addRecipe(out, burnt, null, min, max, burntime, bake, false); - } - return recipe; - } + public static CookRecipe addRecipe(ItemStack in, ItemStack out, int min, int max, int time, boolean bake, + boolean canBurn) { + return addRecipe(in, out, new ItemStack(burnt_food), min, max, time, bake, canBurn); + } - public final int maxTemperature, minTemperature, time; - public final boolean isBaking; - public final ItemStack output, burnt; - public final boolean canBurn; + /** + * Add a recipe + * + * @param output The result item + * @param min the limit temperature for cooking + * @param max the max temperature before burning + * @param time the time in ticks taken + * @param bake whether it needs to be enclosed in an oven + */ + public static CookRecipe addRecipe(ItemStack in, ItemStack out, ItemStack burnt, int min, int max, int time, + boolean bake, boolean canBurn) { + return addRecipe(in, out, burnt, min, max, time, time / 2, bake, canBurn); + } - public CookRecipe(ItemStack output, ItemStack burnt, int min, int max, int time, boolean bake, boolean burn) { - this.output = output; - this.burnt = burnt; - this.minTemperature = min; - this.maxTemperature = max; - this.time = time; - this.isBaking = bake; - this.canBurn = burn; - } + /** + * Add a recipe + * + * @param output The result item + * @param min the limit temperature for cooking + * @param max the max temperature before burning + * @param time the time in ticks taken + * @param bake whether it needs to be enclosed in an oven + */ + public static CookRecipe addRecipe(ItemStack in, ItemStack out, ItemStack burnt, int min, int max, int time, + int burntime, boolean bake, boolean canBurn) { + CookRecipe recipe = new CookRecipe(out, burnt, min, max, time, bake, canBurn); + recipeList.put(CustomToolHelper.getReferenceName(in), recipe); - public static CookRecipe getResult(ItemStack item, boolean oven) { - if (item == null) - return null; + if (canBurn) { + addRecipe(out, burnt, null, min, max, burntime, bake, false); + } + return recipe; + } - CookRecipe result = recipeList.get(CustomToolHelper.getReferenceName(item)); - if (result != null && !result.isBaking || oven) { - return result; - } else { - result = recipeList.get(CustomToolHelper.getReferenceName(item)); - if (result != null && !result.isBaking || oven) { - return result; - } - } - if (canCookBasics) { - ItemStack recipe = FurnaceRecipes.smelting().getSmeltingResult(item); - if (recipe != null && recipe.getItem() instanceof ItemFood) { - return new CookRecipe(recipe, new ItemStack(burnt_food), 100, 300, 20, false, true); - } - } - return null; - } + public static CookRecipe getResult(ItemStack item, boolean oven) { + if (item == null) + return null; - public static boolean canCookBasics = true; + CookRecipe result = recipeList.get(CustomToolHelper.getReferenceName(item)); + if (result != null && !result.isBaking || oven) { + return result; + } else { + result = recipeList.get(CustomToolHelper.getReferenceName(item)); + if (result != null && !result.isBaking || oven) { + return result; + } + } + if (canCookBasics) { + ItemStack recipe = FurnaceRecipes.smelting().getSmeltingResult(item); + if (recipe != null && recipe.getItem() instanceof ItemFood) { + return new CookRecipe(recipe, new ItemStack(burnt_food), 100, 300, 20, false, true); + } + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/BasicTierRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/BasicTierRecipe.java index 6230bb86..6c96880c 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/BasicTierRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/BasicTierRecipe.java @@ -1,7 +1,5 @@ package minefantasy.mf2.api.crafting; -import java.util.HashMap; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.api.helpers.CustomToolHelper; import net.minecraft.block.Block; @@ -11,143 +9,145 @@ import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.world.World; +import java.util.HashMap; + public class BasicTierRecipe extends ShapedRecipes { - public BasicTierRecipe(int width, int height, ItemStack[] input, ItemStack output) { - super(width, height, input, output); - } - - @Override - public boolean matches(InventoryCrafting matrix, World world) { - for (int i = 0; i <= 3 - this.recipeWidth; ++i) { - for (int j = 0; j <= 3 - this.recipeHeight; ++j) { - if (this.checkTierMatch(matrix, i, j, true)) { - return true; - } - - if (this.checkTierMatch(matrix, i, j, false)) { - return true; - } - } - } - - return false; - } - - /** - * Checks if the region of a crafting inventory is match for the recipe. - */ - private boolean checkTierMatch(InventoryCrafting matrix, int x, int y, boolean mirror) { - String wood = null; - String metal = null; - for (int k = 0; k < 3; ++k) { - for (int l = 0; l < 3; ++l) { - int i1 = k - x; - int j1 = l - y; - ItemStack itemstack = null; - - if (i1 >= 0 && j1 >= 0 && i1 < this.recipeWidth && j1 < this.recipeHeight) { - if (mirror) { - itemstack = this.recipeItems[this.recipeWidth - i1 - 1 + j1 * this.recipeWidth]; - } else { - itemstack = this.recipeItems[i1 + j1 * this.recipeWidth]; - } - } - - ItemStack itemstack1 = matrix.getStackInRowAndColumn(k, l); - - if (itemstack1 != null || itemstack != null) { - // String recipe_wood = CustomToolHelper.getComponentMaterial(itemstack, - // "wood"); - String recipe_metal = CustomToolHelper.getComponentMaterial(itemstack, "metal"); - - // String component_wood = CustomToolHelper.getComponentMaterial(itemstack1, - // "wood"); - String component_metal = CustomToolHelper.getComponentMaterial(itemstack1, "metal"); - - if (recipe_metal != null) { - if (component_metal == null) - return false; - if (!component_metal.equalsIgnoreCase(recipe_metal)) - return false; - } - - if (itemstack1 == null && itemstack != null || itemstack1 != null && itemstack == null) { - return false; - } - - if (itemstack.getItem() != itemstack1.getItem()) { - return false; - } - - if (itemstack.getItemDamage() != 32767 && itemstack.getItemDamage() != itemstack1.getItemDamage()) { - return false; - } - } - } - } - - return true; - } - - public static BasicTierRecipe add(ItemStack result, Object... input) { - String var3 = ""; - int var4 = 0; - int var5 = 0; - int var6 = 0; - int var9; - - if (input[var4] instanceof String[]) { - String[] var7 = ((String[]) input[var4++]); - String[] var8 = var7; - var9 = var7.length; - - for (int var10 = 0; var10 < var9; ++var10) { - String var11 = var8[var10]; - ++var6; - var5 = var11.length(); - var3 = var3 + var11; - } - } else { - while (input[var4] instanceof String) { - String var13 = (String) input[var4++]; - ++var6; - var5 = var13.length(); - var3 = var3 + var13; - } - } - - HashMap var14; - - for (var14 = new HashMap(); var4 < input.length; var4 += 2) { - Character var16 = (Character) input[var4]; - ItemStack var17 = null; - - if (input[var4 + 1] instanceof Item) { - var17 = new ItemStack((Item) input[var4 + 1], 1, 32767); - } else if (input[var4 + 1] instanceof Block) { - var17 = new ItemStack((Block) input[var4 + 1], 1, 32767); - } else if (input[var4 + 1] instanceof ItemStack) { - var17 = (ItemStack) input[var4 + 1]; - } - - var14.put(var16, var17); - } - - ItemStack[] var15 = new ItemStack[var5 * var6]; - - for (var9 = 0; var9 < var5 * var6; ++var9) { - char var18 = var3.charAt(var9); - - if (var14.containsKey(Character.valueOf(var18))) { - var15[var9] = ((ItemStack) var14.get(Character.valueOf(var18))).copy(); - } else { - var15[var9] = null; - } - } - - BasicTierRecipe recipe = new BasicTierRecipe(var5, var6, var15, result); - GameRegistry.addRecipe(recipe); - return recipe; - } + public BasicTierRecipe(int width, int height, ItemStack[] input, ItemStack output) { + super(width, height, input, output); + } + + public static BasicTierRecipe add(ItemStack result, Object... input) { + String var3 = ""; + int var4 = 0; + int var5 = 0; + int var6 = 0; + int var9; + + if (input[var4] instanceof String[]) { + String[] var7 = ((String[]) input[var4++]); + String[] var8 = var7; + var9 = var7.length; + + for (int var10 = 0; var10 < var9; ++var10) { + String var11 = var8[var10]; + ++var6; + var5 = var11.length(); + var3 = var3 + var11; + } + } else { + while (input[var4] instanceof String) { + String var13 = (String) input[var4++]; + ++var6; + var5 = var13.length(); + var3 = var3 + var13; + } + } + + HashMap var14; + + for (var14 = new HashMap(); var4 < input.length; var4 += 2) { + Character var16 = (Character) input[var4]; + ItemStack var17 = null; + + if (input[var4 + 1] instanceof Item) { + var17 = new ItemStack((Item) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof Block) { + var17 = new ItemStack((Block) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof ItemStack) { + var17 = (ItemStack) input[var4 + 1]; + } + + var14.put(var16, var17); + } + + ItemStack[] var15 = new ItemStack[var5 * var6]; + + for (var9 = 0; var9 < var5 * var6; ++var9) { + char var18 = var3.charAt(var9); + + if (var14.containsKey(Character.valueOf(var18))) { + var15[var9] = ((ItemStack) var14.get(Character.valueOf(var18))).copy(); + } else { + var15[var9] = null; + } + } + + BasicTierRecipe recipe = new BasicTierRecipe(var5, var6, var15, result); + GameRegistry.addRecipe(recipe); + return recipe; + } + + @Override + public boolean matches(InventoryCrafting matrix, World world) { + for (int i = 0; i <= 3 - this.recipeWidth; ++i) { + for (int j = 0; j <= 3 - this.recipeHeight; ++j) { + if (this.checkTierMatch(matrix, i, j, true)) { + return true; + } + + if (this.checkTierMatch(matrix, i, j, false)) { + return true; + } + } + } + + return false; + } + + /** + * Checks if the region of a crafting inventory is match for the recipe. + */ + private boolean checkTierMatch(InventoryCrafting matrix, int x, int y, boolean mirror) { + String wood = null; + String metal = null; + for (int k = 0; k < 3; ++k) { + for (int l = 0; l < 3; ++l) { + int i1 = k - x; + int j1 = l - y; + ItemStack itemstack = null; + + if (i1 >= 0 && j1 >= 0 && i1 < this.recipeWidth && j1 < this.recipeHeight) { + if (mirror) { + itemstack = this.recipeItems[this.recipeWidth - i1 - 1 + j1 * this.recipeWidth]; + } else { + itemstack = this.recipeItems[i1 + j1 * this.recipeWidth]; + } + } + + ItemStack itemstack1 = matrix.getStackInRowAndColumn(k, l); + + if (itemstack1 != null || itemstack != null) { + // String recipe_wood = CustomToolHelper.getComponentMaterial(itemstack, + // "wood"); + String recipe_metal = CustomToolHelper.getComponentMaterial(itemstack, "metal"); + + // String component_wood = CustomToolHelper.getComponentMaterial(itemstack1, + // "wood"); + String component_metal = CustomToolHelper.getComponentMaterial(itemstack1, "metal"); + + if (recipe_metal != null) { + if (component_metal == null) + return false; + if (!component_metal.equalsIgnoreCase(recipe_metal)) + return false; + } + + if (itemstack1 == null && itemstack != null || itemstack1 != null && itemstack == null) { + return false; + } + + if (itemstack.getItem() != itemstack1.getItem()) { + return false; + } + + if (itemstack.getItemDamage() != 32767 && itemstack.getItemDamage() != itemstack1.getItemDamage()) { + return false; + } + } + } + } + + return true; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/CustomCrafterEntry.java b/src/main/java/minefantasy/mf2/api/crafting/CustomCrafterEntry.java index 22dceabd..61d2fa7f 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/CustomCrafterEntry.java +++ b/src/main/java/minefantasy/mf2/api/crafting/CustomCrafterEntry.java @@ -1,91 +1,86 @@ package minefantasy.mf2.api.crafting; -import java.util.HashMap; - import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class CustomCrafterEntry { - /** - * Registeres a piece (called by code or config) - * - * @param piece - * the item to list - * @param type - * the crafter type - */ - public static void registerItem(Item piece, String type, float efficiency, int tier) { - entries.put(piece, new CustomCrafterEntry(piece, type, efficiency, tier)); - } +import java.util.HashMap; - /** - * Gets the variables for the item if there are any: order is weight, bulk - */ - public static String getEntryType(ItemStack piece) { - CustomCrafterEntry entry = getEntry(piece); - if (entry != null) { - return entry.type; - } - return "nothing"; - } +public class CustomCrafterEntry { + public static HashMap entries = new HashMap(); + public Item itemID; + /** + * The Efficiency(same variable as dig speed) + */ + public String type; + public float efficiency; + public int tier; - public static float getEntryEfficiency(ItemStack piece) { - CustomCrafterEntry entry = getEntry(piece); - if (entry != null) { - return entry.efficiency; - } - return 2.0F; - } + private CustomCrafterEntry(Item id, String type, float efficiency, int tier) { + this.itemID = id; + this.type = type; + this.efficiency = efficiency; + this.tier = tier; + } - public static int getEntryTier(ItemStack piece) { - CustomCrafterEntry entry = getEntry(piece); - if (entry != null) { - return entry.tier; - } - return -1; - } + /** + * Registeres a piece (called by code or config) + * + * @param piece the item to list + * @param type the crafter type + */ + public static void registerItem(Item piece, String type, float efficiency, int tier) { + entries.put(piece, new CustomCrafterEntry(piece, type, efficiency, tier)); + } - /** - * Gets the entry for an item - * - * @param piece - * the armour item - * @return the entry(if there is one), else null - */ - public static CustomCrafterEntry getEntry(ItemStack piece) { - return getEntry(piece.getItem()); - } + /** + * Gets the variables for the item if there are any: order is weight, bulk + */ + public static String getEntryType(ItemStack piece) { + CustomCrafterEntry entry = getEntry(piece); + if (entry != null) { + return entry.type; + } + return "nothing"; + } - /** - * Gets the entry for an item - * - * @param piece - * the armour item - * @return the entry(if there is one), else null - */ - public static CustomCrafterEntry getEntry(Item piece) { - if (piece != null) { - if (entries.containsKey(piece)) { - return entries.get(piece); - } - } - return null; - } + public static float getEntryEfficiency(ItemStack piece) { + CustomCrafterEntry entry = getEntry(piece); + if (entry != null) { + return entry.efficiency; + } + return 2.0F; + } - public Item itemID; - /** - * The Efficiency(same variable as dig speed) - */ - public String type; - public float efficiency; - public int tier; + public static int getEntryTier(ItemStack piece) { + CustomCrafterEntry entry = getEntry(piece); + if (entry != null) { + return entry.tier; + } + return -1; + } - public static HashMap entries = new HashMap(); + /** + * Gets the entry for an item + * + * @param piece the armour item + * @return the entry(if there is one), else null + */ + public static CustomCrafterEntry getEntry(ItemStack piece) { + return getEntry(piece.getItem()); + } - private CustomCrafterEntry(Item id, String type, float efficiency, int tier) { - this.itemID = id; - this.type = type; - this.efficiency = efficiency; - this.tier = tier; - } + /** + * Gets the entry for an item + * + * @param piece the armour item + * @return the entry(if there is one), else null + */ + public static CustomCrafterEntry getEntry(Item piece) { + if (piece != null) { + if (entries.containsKey(piece)) { + return entries.get(piece); + } + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/IBasicMetre.java b/src/main/java/minefantasy/mf2/api/crafting/IBasicMetre.java index a8d7034d..cb6833e8 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/IBasicMetre.java +++ b/src/main/java/minefantasy/mf2/api/crafting/IBasicMetre.java @@ -1,9 +1,9 @@ package minefantasy.mf2.api.crafting; public interface IBasicMetre { - int getMetreScale(int size); + int getMetreScale(int size); - boolean shouldShowMetre(); + boolean shouldShowMetre(); - String getLocalisedName(); + String getLocalisedName(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/IHeatSource.java b/src/main/java/minefantasy/mf2/api/crafting/IHeatSource.java index f464f374..037ec50e 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/IHeatSource.java +++ b/src/main/java/minefantasy/mf2/api/crafting/IHeatSource.java @@ -1,7 +1,7 @@ package minefantasy.mf2.api.crafting; public interface IHeatSource { - public boolean canPlaceAbove(); + public boolean canPlaceAbove(); - public int getHeat(); + public int getHeat(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/IHeatUser.java b/src/main/java/minefantasy/mf2/api/crafting/IHeatUser.java index dd221cf1..9f78dcd0 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/IHeatUser.java +++ b/src/main/java/minefantasy/mf2/api/crafting/IHeatUser.java @@ -3,5 +3,5 @@ import net.minecraft.tileentity.TileEntity; public interface IHeatUser { - public boolean canAccept(TileEntity tile); + public boolean canAccept(TileEntity tile); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/IQualityBalance.java b/src/main/java/minefantasy/mf2/api/crafting/IQualityBalance.java index 4eff5941..fd41f7c0 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/IQualityBalance.java +++ b/src/main/java/minefantasy/mf2/api/crafting/IQualityBalance.java @@ -1,11 +1,11 @@ package minefantasy.mf2.api.crafting; public interface IQualityBalance { - float getMarkerPosition(); + float getMarkerPosition(); - float getThresholdPosition(); + float getThresholdPosition(); - float getSuperThresholdPosition(); + float getSuperThresholdPosition(); - boolean shouldShowMetre(); + boolean shouldShowMetre(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/ISalvageDrop.java b/src/main/java/minefantasy/mf2/api/crafting/ISalvageDrop.java index 9188c123..413d4a58 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/ISalvageDrop.java +++ b/src/main/java/minefantasy/mf2/api/crafting/ISalvageDrop.java @@ -4,6 +4,6 @@ import net.minecraft.item.ItemStack; public interface ISalvageDrop { - public boolean canSalvage(EntityPlayer user, ItemStack item); + public boolean canSalvage(EntityPlayer user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/ISpecialSalvage.java b/src/main/java/minefantasy/mf2/api/crafting/ISpecialSalvage.java index 31c42620..c76230f1 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/ISpecialSalvage.java +++ b/src/main/java/minefantasy/mf2/api/crafting/ISpecialSalvage.java @@ -3,10 +3,10 @@ import net.minecraft.item.ItemStack; public interface ISpecialSalvage { - /** - * Returns a list of Items, Blocks, or ItemStacks dropped by salvage (similar to - * the regular function) - */ - public Object[] getSalvage(ItemStack item); + /** + * Returns a list of Items, Blocks, or ItemStacks dropped by salvage (similar to + * the regular function) + */ + public Object[] getSalvage(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/ITieredComponent.java b/src/main/java/minefantasy/mf2/api/crafting/ITieredComponent.java index ff7985a5..7fcdd02f 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/ITieredComponent.java +++ b/src/main/java/minefantasy/mf2/api/crafting/ITieredComponent.java @@ -3,8 +3,8 @@ import net.minecraft.item.ItemStack; public interface ITieredComponent { - /** - * is it made of "wood", "metal", etc - */ - public String getMaterialType(ItemStack item); + /** + * is it made of "wood", "metal", etc + */ + public String getMaterialType(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/MineFantasyFuels.java b/src/main/java/minefantasy/mf2/api/crafting/MineFantasyFuels.java index 880a6b7a..488d8250 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/MineFantasyFuels.java +++ b/src/main/java/minefantasy/mf2/api/crafting/MineFantasyFuels.java @@ -8,78 +8,77 @@ import net.minecraftforge.oredict.OreDictionary; public class MineFantasyFuels { - public static void addForgeFuel(Object input, float time, int temperature) { - addForgeFuel(input, time, temperature, false, false); - } + public static void addForgeFuel(Object input, float time, int temperature) { + addForgeFuel(input, time, temperature, false, false); + } - public static void addForgeFuel(Object input, float time, int temperature, boolean willLight) { - addForgeFuel(input, time, temperature, willLight, false); - } + public static void addForgeFuel(Object input, float time, int temperature, boolean willLight) { + addForgeFuel(input, time, temperature, willLight, false); + } - public static void addForgeFuel(Object input, float time, int temperature, boolean willLight, boolean refined) { - ItemStack item = convert(input); - if (item != null) { - ForgeItemHandler.forgeFuel.add(new ForgeFuel(item, time, temperature, willLight, refined)); - if ((int) (temperature * 1.25) > ForgeItemHandler.forgeMaxTemp) { - ForgeItemHandler.forgeMaxTemp = (int) (temperature * 1.25); - } - } - } + public static void addForgeFuel(Object input, float time, int temperature, boolean willLight, boolean refined) { + ItemStack item = convert(input); + if (item != null) { + ForgeItemHandler.forgeFuel.add(new ForgeFuel(item, time, temperature, willLight, refined)); + if ((int) (temperature * 1.25) > ForgeItemHandler.forgeMaxTemp) { + ForgeItemHandler.forgeMaxTemp = (int) (temperature * 1.25); + } + } + } - /** - * Adds a carbon item for smelting - * - * @param input - * Item Block or ItemStack - * @param uses - */ - public static void addCarbon(Object input, int uses) { - ItemStack itemstack = convert(input); + /** + * Adds a carbon item for smelting + * + * @param input Item Block or ItemStack + * @param uses + */ + public static void addCarbon(Object input, int uses) { + ItemStack itemstack = convert(input); - if (itemstack != null) { - OreDictionary.registerOre("Carbon-" + uses, itemstack); - } - } + if (itemstack != null) { + OreDictionary.registerOre("Carbon-" + uses, itemstack); + } + } - /** - * How many smelts (blast furn or bloomery) this can give as carbon - */ - public static int getCarbon(ItemStack item) { - if (item == null) - return 0; + /** + * How many smelts (blast furn or bloomery) this can give as carbon + */ + public static int getCarbon(ItemStack item) { + if (item == null) + return 0; - for (int i : OreDictionary.getOreIDs(item)) { - String name = OreDictionary.getOreName(i); - if (name != null && name.startsWith("Carbon-")) { - String s = name.substring(7); - int uses = Integer.parseInt(s); - return uses; - } - } + for (int i : OreDictionary.getOreIDs(item)) { + String name = OreDictionary.getOreName(i); + if (name != null && name.startsWith("Carbon-")) { + String s = name.substring(7); + int uses = Integer.parseInt(s); + return uses; + } + } - return 0; - } + return 0; + } - /** - * Determines if the item can be used for carbon in smelting. - */ - public static boolean isCarbon(ItemStack item) { - return getCarbon(item) > 0; - } + /** + * Determines if the item can be used for carbon in smelting. + */ + public static boolean isCarbon(ItemStack item) { + return getCarbon(item) > 0; + } - public static ItemStack convert(Object input) { - if (input == null) - return null; + public static ItemStack convert(Object input) { + if (input == null) + return null; - ItemStack itemstack = null; - if (input instanceof ItemStack) { - return (ItemStack) input; - } else if (input instanceof Block) { - return new ItemStack((Block) input); - } else if (input instanceof Item) { - return new ItemStack((Item) input); - } + ItemStack itemstack = null; + if (input instanceof ItemStack) { + return (ItemStack) input; + } else if (input instanceof Block) { + return new ItemStack((Block) input); + } else if (input instanceof Item) { + return new ItemStack((Item) input); + } - return null; - } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java index e87ac557..98f43a92 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java +++ b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java @@ -1,10 +1,5 @@ package minefantasy.mf2.api.crafting; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Random; - import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; @@ -13,126 +8,131 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Random; + public class Salvage { - private static Random random = new Random(); - private static HashMap salvageList = new HashMap(); - private static HashMap sharedSalvage = new HashMap(); - - public static void shareSalvage(Item item1, Item item2) { - sharedSalvage.put(CustomToolHelper.getSimpleReferenceName(item1), item2); - } - - public static void addSalvage(Block input, Object... components) { - addSalvage(Item.getItemFromBlock(input), components); - } - - public static void addSalvage(Item input, Object... components) { - salvageList.put(CustomToolHelper.getSimpleReferenceName(input), components); - } - - public static void addSalvage(ItemStack item, Object... components) { - if (item.isItemStackDamageable()) { - item.setItemDamage(OreDictionary.WILDCARD_VALUE); - } - salvageList.put(CustomToolHelper.getReferenceName(item), components); - } - - /** - * Break an item to its parts - * - * @return a list of items - */ - public static List salvage(EntityPlayer user, ItemStack item) { - return salvage(user, item, 1.0F); - } - - public static List salvage(EntityPlayer user, ItemStack item, float dropRate) { - Object[] entryList = getSalvage(item); - if (entryList == null) { - return null; - } - - float durability = 1F; - if (item.isItemDamaged()) { - durability = (float) (item.getMaxDamage() - item.getItemDamage()) / (float) item.getMaxDamage(); - } - - float chanceModifier = 1.25F;// 80% Succcess rate - float chance = dropRate * durability;// Modifier for skill and durability - - return dropItems(item, user, entryList, chanceModifier, chance); - } - - private static List dropItems(ItemStack mainItem, EntityPlayer user, Object[] entryList, - float chanceModifier, float chance) { - List items = new ArrayList(); - for (Object entry : entryList) { - if (entry != null) { - if (entry instanceof Item && random.nextFloat() * chanceModifier < chance) { - items = dropItemStack(mainItem, user, items, new ItemStack((Item) entry), chanceModifier, chance); - } - if (entry instanceof Block && random.nextFloat() * chanceModifier < chance) { - items = dropItemStack(mainItem, user, items, new ItemStack((Block) entry), chanceModifier, chance); - } - if (entry instanceof ItemStack) { - items = dropItemStack(mainItem, user, items, (ItemStack) entry, chanceModifier, chance); - } - } - } - return items; - } - - private static List dropItemStack(ItemStack mainItem, EntityPlayer user, List items, - ItemStack entry, float chanceModifier, float chance) { - for (int a = 0; a < entry.stackSize; a++) { - if (random.nextFloat() * chanceModifier < chance) { - boolean canSalvage = true; - - if (entry.getItem() instanceof ISalvageDrop) { - canSalvage = ((ISalvageDrop) entry.getItem()).canSalvage(user, entry); - } - if (canSalvage) { - ItemStack newitem = entry.copy(); - newitem.stackSize = 1; - newitem = CustomToolHelper.tryDeconstruct(newitem, mainItem); - items.add(newitem); - } - } - } - return items; - } - - public static Object[] getSalvage(ItemStack item) { - // SHARED - Item shared = sharedSalvage.get(CustomToolHelper.getReferenceName(item, "any", false)); - if (shared != null) { - MFLogUtil.logDebug("Found shared: " + shared.getUnlocalizedName()); - return getSalvage(new ItemStack(shared)); - } - - if (item != null && item.getItem() instanceof ISpecialSalvage) { - Object[] special = ((ISpecialSalvage) item.getItem()).getSalvage(item); - if (special != null) { - return special; - } - } - Object[] specific = salvageList.get(CustomToolHelper.getReferenceName(item)); - if (specific != null) { - return specific; - } - Object[] specific2 = salvageList.get(CustomToolHelper.getReferenceName(item, "any")); - if (specific2 != null) { - return specific2; - } - - return salvageList.get(CustomToolHelper.getReferenceName(item, "any", false)); - } - - private static boolean doesMatch(ItemStack item1, ItemStack item2) { - if (!CustomToolHelper.doesMatchForRecipe(item1, item2)) { - return false; - } - return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE - || item2.getItemDamage() == item1.getItemDamage()); - } + private static Random random = new Random(); + private static HashMap salvageList = new HashMap(); + private static HashMap sharedSalvage = new HashMap(); + + public static void shareSalvage(Item item1, Item item2) { + sharedSalvage.put(CustomToolHelper.getSimpleReferenceName(item1), item2); + } + + public static void addSalvage(Block input, Object... components) { + addSalvage(Item.getItemFromBlock(input), components); + } + + public static void addSalvage(Item input, Object... components) { + salvageList.put(CustomToolHelper.getSimpleReferenceName(input), components); + } + + public static void addSalvage(ItemStack item, Object... components) { + if (item.isItemStackDamageable()) { + item.setItemDamage(OreDictionary.WILDCARD_VALUE); + } + salvageList.put(CustomToolHelper.getReferenceName(item), components); + } + + /** + * Break an item to its parts + * + * @return a list of items + */ + public static List salvage(EntityPlayer user, ItemStack item) { + return salvage(user, item, 1.0F); + } + + public static List salvage(EntityPlayer user, ItemStack item, float dropRate) { + Object[] entryList = getSalvage(item); + if (entryList == null) { + return null; + } + + float durability = 1F; + if (item.isItemDamaged()) { + durability = (float) (item.getMaxDamage() - item.getItemDamage()) / (float) item.getMaxDamage(); + } + + float chanceModifier = 1.25F;// 80% Succcess rate + float chance = dropRate * durability;// Modifier for skill and durability + + return dropItems(item, user, entryList, chanceModifier, chance); + } + + private static List dropItems(ItemStack mainItem, EntityPlayer user, Object[] entryList, + float chanceModifier, float chance) { + List items = new ArrayList(); + for (Object entry : entryList) { + if (entry != null) { + if (entry instanceof Item && random.nextFloat() * chanceModifier < chance) { + items = dropItemStack(mainItem, user, items, new ItemStack((Item) entry), chanceModifier, chance); + } + if (entry instanceof Block && random.nextFloat() * chanceModifier < chance) { + items = dropItemStack(mainItem, user, items, new ItemStack((Block) entry), chanceModifier, chance); + } + if (entry instanceof ItemStack) { + items = dropItemStack(mainItem, user, items, (ItemStack) entry, chanceModifier, chance); + } + } + } + return items; + } + + private static List dropItemStack(ItemStack mainItem, EntityPlayer user, List items, + ItemStack entry, float chanceModifier, float chance) { + for (int a = 0; a < entry.stackSize; a++) { + if (random.nextFloat() * chanceModifier < chance) { + boolean canSalvage = true; + + if (entry.getItem() instanceof ISalvageDrop) { + canSalvage = ((ISalvageDrop) entry.getItem()).canSalvage(user, entry); + } + if (canSalvage) { + ItemStack newitem = entry.copy(); + newitem.stackSize = 1; + newitem = CustomToolHelper.tryDeconstruct(newitem, mainItem); + items.add(newitem); + } + } + } + return items; + } + + public static Object[] getSalvage(ItemStack item) { + // SHARED + Item shared = sharedSalvage.get(CustomToolHelper.getReferenceName(item, "any", false)); + if (shared != null) { + MFLogUtil.logDebug("Found shared: " + shared.getUnlocalizedName()); + return getSalvage(new ItemStack(shared)); + } + + if (item != null && item.getItem() instanceof ISpecialSalvage) { + Object[] special = ((ISpecialSalvage) item.getItem()).getSalvage(item); + if (special != null) { + return special; + } + } + Object[] specific = salvageList.get(CustomToolHelper.getReferenceName(item)); + if (specific != null) { + return specific; + } + Object[] specific2 = salvageList.get(CustomToolHelper.getReferenceName(item, "any")); + if (specific2 != null) { + return specific2; + } + + return salvageList.get(CustomToolHelper.getReferenceName(item, "any", false)); + } + + private static boolean doesMatch(ItemStack item1, ItemStack item2) { + if (!CustomToolHelper.doesMatchForRecipe(item1, item2)) { + return false; + } + return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE + || item2.getItemDamage() == item1.getItemDamage()); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/AnvilCraftMatrix.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/AnvilCraftMatrix.java index fb725464..9799ca04 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/AnvilCraftMatrix.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/AnvilCraftMatrix.java @@ -4,29 +4,29 @@ import net.minecraft.inventory.InventoryCrafting; public class AnvilCraftMatrix extends InventoryCrafting { - private IAnvil anvil; - - public AnvilCraftMatrix(IAnvil anvil, Container instance, int xSize, int ySize) { - super(instance, xSize, ySize); - this.anvil = anvil; - } - - public void modifyTier(int hammerTier, int anvilTier, int craftTime) { - anvil.setHammerUsed(hammerTier); - anvil.setRequiredAnvil(anvilTier); - anvil.setForgeTime(craftTime); - } - - public void modifyResearch(String name) { - anvil.setResearch(name); - } - - public int getTier() { - return anvil.getRecipeHammer(); - } - - public int getAnvilTier() { - return anvil.getRecipeAnvil(); - } + private IAnvil anvil; + + public AnvilCraftMatrix(IAnvil anvil, Container instance, int xSize, int ySize) { + super(instance, xSize, ySize); + this.anvil = anvil; + } + + public void modifyTier(int hammerTier, int anvilTier, int craftTime) { + anvil.setHammerUsed(hammerTier); + anvil.setRequiredAnvil(anvilTier); + anvil.setForgeTime(craftTime); + } + + public void modifyResearch(String name) { + anvil.setResearch(name); + } + + public int getTier() { + return anvil.getRecipeHammer(); + } + + public int getAnvilTier() { + return anvil.getRecipeAnvil(); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/CraftingManagerAnvil.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/CraftingManagerAnvil.java index 2f9385f5..28f7289c 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/CraftingManagerAnvil.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/CraftingManagerAnvil.java @@ -1,292 +1,290 @@ package minefantasy.mf2.api.crafting.anvil; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; - import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.rpg.Skill; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import java.util.*; + /** - * * @author AnonymousProductions - * */ public class CraftingManagerAnvil { - /** The static instance of this class */ - private static final CraftingManagerAnvil instance = new CraftingManagerAnvil(); - - /** A list of all the recipes added */ - public List recipes = new ArrayList(); - - /** - * Returns the static instance of this class - */ - public static CraftingManagerAnvil getInstance() { - return instance; - } - - private CraftingManagerAnvil() { - Collections.sort(this.recipes, new RecipeSorterAnvil(this)); - System.out.println("MineFantasy: Anvil recipes initiating"); - } - - public IAnvilRecipe addRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, String tool, - int hammer, int anvil, int time, Object... input) { - return addRecipe(result, skill, research, hot, exp, tool, hammer, anvil, time, (byte) 0, input); - } - - public IAnvilRecipe addToolRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, - String tool, int hammer, int anvil, int time, Object... input) { - return addRecipe(result, skill, research, hot, exp, tool, hammer, anvil, time, (byte) 1, input); - } - - /** - * Adds a recipe. See spreadsheet on first page for details. - */ - private IAnvilRecipe addRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, String tool, - int hammer, int anvil, int time, byte recipeType, Object... input) { - String var3 = ""; - int var4 = 0; - int var5 = 0; - int var6 = 0; - int var9; - - if (input[var4] instanceof String[]) { - String[] var7 = ((String[]) input[var4++]); - String[] var8 = var7; - var9 = var7.length; - - for (int var10 = 0; var10 < var9; ++var10) { - String var11 = var8[var10]; - ++var6; - var5 = var11.length(); - var3 = var3 + var11; - } - } else { - while (input[var4] instanceof String) { - String var13 = (String) input[var4++]; - ++var6; - var5 = var13.length(); - var3 = var3 + var13; - } - } - - HashMap var14; - - for (var14 = new HashMap(); var4 < input.length; var4 += 2) { - Character var16 = (Character) input[var4]; - ItemStack var17 = null; - - if (input[var4 + 1] instanceof Item) { - var17 = new ItemStack((Item) input[var4 + 1], 1, 32767); - } else if (input[var4 + 1] instanceof Block) { - var17 = new ItemStack((Block) input[var4 + 1], 1, 32767); - } else if (input[var4 + 1] instanceof ItemStack) { - var17 = (ItemStack) input[var4 + 1]; - } - - var14.put(var16, var17); - } - - ItemStack[] var15 = new ItemStack[var5 * var6]; - - for (var9 = 0; var9 < var5 * var6; ++var9) { - char var18 = var3.charAt(var9); - - if (var14.containsKey(Character.valueOf(var18))) { - var15[var9] = ((ItemStack) var14.get(Character.valueOf(var18))).copy(); - } else { - var15[var9] = null; - } - } - - IAnvilRecipe recipe; - if (recipeType == (byte) 1) { - recipe = new CustomToolRecipe(var5, var6, var15, result, tool, time, hammer, anvil, exp, hot, research, - skill); - } else { - recipe = new ShapedAnvilRecipes(var5, var6, var15, result, tool, time, hammer, anvil, exp, hot, research, - skill); - } - this.recipes.add(recipe); - return recipe; - } - - public IAnvilRecipe addShapelessRecipe(ItemStack output, Skill skill, String research, boolean hot, - float experience, String tool, int hammer, int anvil, int time, Object... input) { - ArrayList var3 = new ArrayList(); - Object[] var4 = input; - int var5 = input.length; - - for (int var6 = 0; var6 < var5; ++var6) { - Object var7 = var4[var6]; - - if (var7 instanceof ItemStack) { - var3.add(((ItemStack) var7).copy()); - } else if (var7 instanceof Item) { - var3.add(new ItemStack((Item) var7)); - } else { - if (!(var7 instanceof Block)) { - throw new RuntimeException("MineFantasy: Invalid shapeless anvil recipe!"); - } - - var3.add(new ItemStack((Block) var7)); - } - } - - IAnvilRecipe recipe = new ShapelessAnvilRecipes(output, tool, experience, hammer, anvil, time, var3, hot, - research, skill); - this.recipes.add(recipe); - return recipe; - } - - public ItemStack findMatchingRecipe(AnvilCraftMatrix matrix) { - int var2 = 0; - ItemStack var3 = null; - ItemStack var4 = null; - - for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { - ItemStack var6 = matrix.getStackInSlot(var5); - - if (var6 != null) { - if (var2 == 0) { - var3 = var6; - } - - if (var2 == 1) { - var4 = var6; - } - - ++var2; - } - } - - if (var2 == 2 && canRepair(var3, var4)) { - Item var10 = var3.getItem(); - int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); - int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); - int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; - int var9 = var10.getMaxDamage() - (var8) * 2; - - if (var9 < 0) { - var9 = 0; - } - - return new ItemStack(var3.getItem(), 1, var9); - } else { - Iterator var11 = this.recipes.iterator(); - IAnvilRecipe var13; - - do { - if (!var11.hasNext()) { - return null; - } - - var13 = (IAnvilRecipe) var11.next(); - } while (!var13.matches(matrix)); - - return var13.getCraftingResult(matrix); - } - } - - private boolean canRepair(ItemStack item1, ItemStack item2) { - if (item1.getItem() == item2.getItem() && item1.stackSize == 1 && item2.stackSize == 1 - && item1.getItem().isRepairable()) { - return true; - } - if (item1.getItem() == item2.getItem() && item1.stackSize == 1 && item2.stackSize == 1 && item1.isItemDamaged() - && CustomToolHelper.areToolsSame(item1, item2)) { - return true; - } - return false; - } - - public ItemStack findMatchingRecipe(IAnvil anvil, AnvilCraftMatrix matrix) { - int time = 200; - int anvi = 1; - boolean hot = false; - int hammer = 0; - int var2 = 0; - String toolType = "hammer"; - ItemStack var3 = null; - ItemStack var4 = null; - - for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { - ItemStack var6 = matrix.getStackInSlot(var5); - - if (var6 != null) { - if (var2 == 0) { - var3 = var6; - } - - if (var2 == 1) { - var4 = var6; - } - - ++var2; - } - } - - if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 - && var3.getItem().isRepairable()) { - Item var10 = var3.getItem(); - int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); - int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); - int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; - int var9 = var10.getMaxDamage() - var8; - - if (var9 < 0) { - var9 = 0; - } - - return new ItemStack(var3.getItem(), 1, var9); - } else { - Iterator var11 = this.recipes.iterator(); - IAnvilRecipe var13 = null; - - while (var11.hasNext()) { - IAnvilRecipe rec = (IAnvilRecipe) var11.next(); - - if (rec.matches(matrix)) { - var13 = rec; - } - } - - if (var13 != null) { - time = var13.getCraftTime(); - hammer = var13.getRecipeHammer(); - anvi = var13.getAnvil(); - hot = var13.outputHot(); - toolType = var13.getToolType(); - - if (!var13.useCustomTiers()) { - anvil.setForgeTime(time); - anvil.setHammerUsed(hammer); - anvil.setRequiredAnvil(anvi); - } - anvil.setHotOutput(hot); - anvil.setToolType(toolType); - if (!var13.getResearch().equalsIgnoreCase("tier")) { - anvil.setResearch(var13.getResearch()); - } - anvil.setSkill(var13.getSkill()); - - return var13.getCraftingResult(matrix); - } - return null; - } - } - - /** - * returns the List<> of all recipes - */ - public List getRecipeList() { - return this.recipes; - } + /** + * The static instance of this class + */ + private static final CraftingManagerAnvil instance = new CraftingManagerAnvil(); + + /** + * A list of all the recipes added + */ + public List recipes = new ArrayList(); + + private CraftingManagerAnvil() { + Collections.sort(this.recipes, new RecipeSorterAnvil(this)); + System.out.println("MineFantasy: Anvil recipes initiating"); + } + + /** + * Returns the static instance of this class + */ + public static CraftingManagerAnvil getInstance() { + return instance; + } + + public IAnvilRecipe addRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, String tool, + int hammer, int anvil, int time, Object... input) { + return addRecipe(result, skill, research, hot, exp, tool, hammer, anvil, time, (byte) 0, input); + } + + public IAnvilRecipe addToolRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, + String tool, int hammer, int anvil, int time, Object... input) { + return addRecipe(result, skill, research, hot, exp, tool, hammer, anvil, time, (byte) 1, input); + } + + /** + * Adds a recipe. See spreadsheet on first page for details. + */ + private IAnvilRecipe addRecipe(ItemStack result, Skill skill, String research, boolean hot, float exp, String tool, + int hammer, int anvil, int time, byte recipeType, Object... input) { + String var3 = ""; + int var4 = 0; + int var5 = 0; + int var6 = 0; + int var9; + + if (input[var4] instanceof String[]) { + String[] var7 = ((String[]) input[var4++]); + String[] var8 = var7; + var9 = var7.length; + + for (int var10 = 0; var10 < var9; ++var10) { + String var11 = var8[var10]; + ++var6; + var5 = var11.length(); + var3 = var3 + var11; + } + } else { + while (input[var4] instanceof String) { + String var13 = (String) input[var4++]; + ++var6; + var5 = var13.length(); + var3 = var3 + var13; + } + } + + HashMap var14; + + for (var14 = new HashMap(); var4 < input.length; var4 += 2) { + Character var16 = (Character) input[var4]; + ItemStack var17 = null; + + if (input[var4 + 1] instanceof Item) { + var17 = new ItemStack((Item) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof Block) { + var17 = new ItemStack((Block) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof ItemStack) { + var17 = (ItemStack) input[var4 + 1]; + } + + var14.put(var16, var17); + } + + ItemStack[] var15 = new ItemStack[var5 * var6]; + + for (var9 = 0; var9 < var5 * var6; ++var9) { + char var18 = var3.charAt(var9); + + if (var14.containsKey(Character.valueOf(var18))) { + var15[var9] = ((ItemStack) var14.get(Character.valueOf(var18))).copy(); + } else { + var15[var9] = null; + } + } + + IAnvilRecipe recipe; + if (recipeType == (byte) 1) { + recipe = new CustomToolRecipe(var5, var6, var15, result, tool, time, hammer, anvil, exp, hot, research, + skill); + } else { + recipe = new ShapedAnvilRecipes(var5, var6, var15, result, tool, time, hammer, anvil, exp, hot, research, + skill); + } + this.recipes.add(recipe); + return recipe; + } + + public IAnvilRecipe addShapelessRecipe(ItemStack output, Skill skill, String research, boolean hot, + float experience, String tool, int hammer, int anvil, int time, Object... input) { + ArrayList var3 = new ArrayList(); + Object[] var4 = input; + int var5 = input.length; + + for (int var6 = 0; var6 < var5; ++var6) { + Object var7 = var4[var6]; + + if (var7 instanceof ItemStack) { + var3.add(((ItemStack) var7).copy()); + } else if (var7 instanceof Item) { + var3.add(new ItemStack((Item) var7)); + } else { + if (!(var7 instanceof Block)) { + throw new RuntimeException("MineFantasy: Invalid shapeless anvil recipe!"); + } + + var3.add(new ItemStack((Block) var7)); + } + } + + IAnvilRecipe recipe = new ShapelessAnvilRecipes(output, tool, experience, hammer, anvil, time, var3, hot, + research, skill); + this.recipes.add(recipe); + return recipe; + } + + public ItemStack findMatchingRecipe(AnvilCraftMatrix matrix) { + int var2 = 0; + ItemStack var3 = null; + ItemStack var4 = null; + + for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { + ItemStack var6 = matrix.getStackInSlot(var5); + + if (var6 != null) { + if (var2 == 0) { + var3 = var6; + } + + if (var2 == 1) { + var4 = var6; + } + + ++var2; + } + } + + if (var2 == 2 && canRepair(var3, var4)) { + Item var10 = var3.getItem(); + int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); + int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); + int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; + int var9 = var10.getMaxDamage() - (var8) * 2; + + if (var9 < 0) { + var9 = 0; + } + + return new ItemStack(var3.getItem(), 1, var9); + } else { + Iterator var11 = this.recipes.iterator(); + IAnvilRecipe var13; + + do { + if (!var11.hasNext()) { + return null; + } + + var13 = (IAnvilRecipe) var11.next(); + } while (!var13.matches(matrix)); + + return var13.getCraftingResult(matrix); + } + } + + private boolean canRepair(ItemStack item1, ItemStack item2) { + if (item1.getItem() == item2.getItem() && item1.stackSize == 1 && item2.stackSize == 1 + && item1.getItem().isRepairable()) { + return true; + } + if (item1.getItem() == item2.getItem() && item1.stackSize == 1 && item2.stackSize == 1 && item1.isItemDamaged() + && CustomToolHelper.areToolsSame(item1, item2)) { + return true; + } + return false; + } + + public ItemStack findMatchingRecipe(IAnvil anvil, AnvilCraftMatrix matrix) { + int time = 200; + int anvi = 1; + boolean hot = false; + int hammer = 0; + int var2 = 0; + String toolType = "hammer"; + ItemStack var3 = null; + ItemStack var4 = null; + + for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { + ItemStack var6 = matrix.getStackInSlot(var5); + + if (var6 != null) { + if (var2 == 0) { + var3 = var6; + } + + if (var2 == 1) { + var4 = var6; + } + + ++var2; + } + } + + if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 + && var3.getItem().isRepairable()) { + Item var10 = var3.getItem(); + int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); + int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); + int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; + int var9 = var10.getMaxDamage() - var8; + + if (var9 < 0) { + var9 = 0; + } + + return new ItemStack(var3.getItem(), 1, var9); + } else { + Iterator var11 = this.recipes.iterator(); + IAnvilRecipe var13 = null; + + while (var11.hasNext()) { + IAnvilRecipe rec = (IAnvilRecipe) var11.next(); + + if (rec.matches(matrix)) { + var13 = rec; + } + } + + if (var13 != null) { + time = var13.getCraftTime(); + hammer = var13.getRecipeHammer(); + anvi = var13.getAnvil(); + hot = var13.outputHot(); + toolType = var13.getToolType(); + + if (!var13.useCustomTiers()) { + anvil.setForgeTime(time); + anvil.setHammerUsed(hammer); + anvil.setRequiredAnvil(anvi); + } + anvil.setHotOutput(hot); + anvil.setToolType(toolType); + if (!var13.getResearch().equalsIgnoreCase("tier")) { + anvil.setResearch(var13.getResearch()); + } + anvil.setSkill(var13.getSkill()); + + return var13.getCraftingResult(matrix); + } + return null; + } + } + + /** + * returns the List<> of all recipes + */ + public List getRecipeList() { + return this.recipes; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/CustomToolRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/CustomToolRecipe.java index 7aeb7409..95990197 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/CustomToolRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/CustomToolRecipe.java @@ -8,146 +8,144 @@ import net.minecraftforge.oredict.OreDictionary; /** - * * @author AnonymousProductions - * */ public class CustomToolRecipe extends ShapedAnvilRecipes { - public CustomToolRecipe(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, - int hammer, int anvi, float exp, boolean hot, String research, Skill skill) { - super(wdth, heit, inputs, output, toolType, time, hammer, anvi, exp, hot, research, skill); - } - - /** - * Checks if the region of a crafting inventory is match for the recipe. - */ - @Override - protected boolean checkMatch(AnvilCraftMatrix matrix, int x, int y, boolean b) { - String wood = null; - String metal = null; - for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) { - for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) { - int var7 = var5 - x; - int var8 = var6 - y; - ItemStack recipeItem = null; - - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { - if (b) { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; - } else { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; - } - } - - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); - - if (inputItem != null || recipeItem != null) { - String component_wood = CustomToolHelper.getComponentMaterial(inputItem, "wood"); - String component_metal = CustomToolHelper.getComponentMaterial(inputItem, "metal"); - - if (component_metal != null)// CHECK CUSTOM METAL - { - if (metal == null) { - metal = component_metal; - } else { - if (!metal.equalsIgnoreCase(component_metal)) { - return false; - } - } - } - - if (component_wood != null)// CHECK CUSTOM WOOD - { - if (wood == null) { - wood = component_wood; - } else { - if (!wood.equalsIgnoreCase(component_wood)) { - return false; - } - } - } - // HEATING - if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { - return false; - } - if (!Heatable.isWorkable(inputItem)) { - return false; - } - inputItem = getHotItem(inputItem); - - if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { - return false; - } - - if (inputItem == null) { - return false; - } - - if (recipeItem.getItem() != inputItem.getItem()) { - return false; - } - - if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE - && recipeItem.getItemDamage() != inputItem.getItemDamage()) { - return false; - } - if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { - return false; - } - } - } - } - if (!modifyTiers(matrix, metal, true)) { - modifyTiers(matrix, wood, false); - } - return true; - } - - private boolean modifyTiers(AnvilCraftMatrix matrix, String tier, boolean isMain) { - CustomMaterial material = CustomMaterial.getMaterial(tier); - if (material != null) { - int newTier = recipeHammer < 0 ? material.crafterTier : recipeHammer; - int newAnvil = anvil < 0 ? material.crafterAnvilTier : anvil; - matrix.modifyTier(newTier, newAnvil, (int) (recipeTime * material.craftTimeModifier)); - if (isMain) { - matrix.modifyResearch("smelt" + material.name); - } - return true; - } - return false; - } - - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(AnvilCraftMatrix matrix) { - ItemStack result = super.getCraftingResult(matrix); - - String wood = null; - String metal = null; - for (int i = 0; i < matrix.getSizeInventory(); i++) { - ItemStack item = matrix.getStackInSlot(i); - String component_wood = CustomToolHelper.getComponentMaterial(item, "wood"); - String component_metal = CustomToolHelper.getComponentMaterial(item, "metal"); - if (wood == null && component_wood != null) { - wood = component_wood; - } - if (metal == null && component_metal != null) { - metal = component_metal; - } - } - if (metal != null) { - CustomMaterial.addMaterial(result, CustomToolHelper.slot_main, metal); - } - if (wood != null) { - CustomMaterial.addMaterial(result, CustomToolHelper.slot_haft, wood); - } - return result; - } - - @Override - public boolean useCustomTiers() { - return true; - } + public CustomToolRecipe(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, + int hammer, int anvi, float exp, boolean hot, String research, Skill skill) { + super(wdth, heit, inputs, output, toolType, time, hammer, anvi, exp, hot, research, skill); + } + + /** + * Checks if the region of a crafting inventory is match for the recipe. + */ + @Override + protected boolean checkMatch(AnvilCraftMatrix matrix, int x, int y, boolean b) { + String wood = null; + String metal = null; + for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) { + for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) { + int var7 = var5 - x; + int var8 = var6 - y; + ItemStack recipeItem = null; + + if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (b) { + recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + } else { + recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + } + } + + ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + + if (inputItem != null || recipeItem != null) { + String component_wood = CustomToolHelper.getComponentMaterial(inputItem, "wood"); + String component_metal = CustomToolHelper.getComponentMaterial(inputItem, "metal"); + + if (component_metal != null)// CHECK CUSTOM METAL + { + if (metal == null) { + metal = component_metal; + } else { + if (!metal.equalsIgnoreCase(component_metal)) { + return false; + } + } + } + + if (component_wood != null)// CHECK CUSTOM WOOD + { + if (wood == null) { + wood = component_wood; + } else { + if (!wood.equalsIgnoreCase(component_wood)) { + return false; + } + } + } + // HEATING + if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { + return false; + } + if (!Heatable.isWorkable(inputItem)) { + return false; + } + inputItem = getHotItem(inputItem); + + if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { + return false; + } + + if (inputItem == null) { + return false; + } + + if (recipeItem.getItem() != inputItem.getItem()) { + return false; + } + + if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE + && recipeItem.getItemDamage() != inputItem.getItemDamage()) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + } + } + } + if (!modifyTiers(matrix, metal, true)) { + modifyTiers(matrix, wood, false); + } + return true; + } + + private boolean modifyTiers(AnvilCraftMatrix matrix, String tier, boolean isMain) { + CustomMaterial material = CustomMaterial.getMaterial(tier); + if (material != null) { + int newTier = recipeHammer < 0 ? material.crafterTier : recipeHammer; + int newAnvil = anvil < 0 ? material.crafterAnvilTier : anvil; + matrix.modifyTier(newTier, newAnvil, (int) (recipeTime * material.craftTimeModifier)); + if (isMain) { + matrix.modifyResearch("smelt" + material.name); + } + return true; + } + return false; + } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(AnvilCraftMatrix matrix) { + ItemStack result = super.getCraftingResult(matrix); + + String wood = null; + String metal = null; + for (int i = 0; i < matrix.getSizeInventory(); i++) { + ItemStack item = matrix.getStackInSlot(i); + String component_wood = CustomToolHelper.getComponentMaterial(item, "wood"); + String component_metal = CustomToolHelper.getComponentMaterial(item, "metal"); + if (wood == null && component_wood != null) { + wood = component_wood; + } + if (metal == null && component_metal != null) { + metal = component_metal; + } + } + if (metal != null) { + CustomMaterial.addMaterial(result, CustomToolHelper.slot_main, metal); + } + if (wood != null) { + CustomMaterial.addMaterial(result, CustomToolHelper.slot_haft, wood); + } + return result; + } + + @Override + public boolean useCustomTiers() { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvil.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvil.java index 74196d19..9375f55c 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvil.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvil.java @@ -3,27 +3,25 @@ import minefantasy.mf2.api.rpg.Skill; /** - * * @author AnonymousProductions This interface is used by the anvil in - * MineFantasy so it can be referred to without importing the mod - * + * MineFantasy so it can be referred to without importing the mod */ public interface IAnvil { - void setForgeTime(int i); + void setForgeTime(int i); - void setHammerUsed(int i); + void setHammerUsed(int i); - void setRequiredAnvil(int i); + void setRequiredAnvil(int i); - void setHotOutput(boolean i); + void setHotOutput(boolean i); - void setToolType(String toolType); + void setToolType(String toolType); - void setSkill(Skill skill); + void setSkill(Skill skill); - public void setResearch(String research); + public void setResearch(String research); - int getRecipeHammer(); + int getRecipeHammer(); - int getRecipeAnvil(); + int getRecipeAnvil(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvilRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvilRecipe.java index 52d362a1..47b8676b 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/IAnvilRecipe.java @@ -4,43 +4,41 @@ import net.minecraft.item.ItemStack; /** - * * @author AnonymousProductions - * */ public interface IAnvilRecipe { - /** - * Used to check if a recipe matches current crafting inventory - */ - boolean matches(AnvilCraftMatrix var1); + /** + * Used to check if a recipe matches current crafting inventory + */ + boolean matches(AnvilCraftMatrix var1); - /** - * Returns an Item that is the result of this recipe - */ - ItemStack getCraftingResult(AnvilCraftMatrix var1); + /** + * Returns an Item that is the result of this recipe + */ + ItemStack getCraftingResult(AnvilCraftMatrix var1); - int getCraftTime(); + int getCraftTime(); - /** - * Returns the size of the recipe area - */ - int getRecipeSize(); + /** + * Returns the size of the recipe area + */ + int getRecipeSize(); - int getRecipeHammer(); + int getRecipeHammer(); - float getExperiance(); + float getExperiance(); - int getAnvil(); + int getAnvil(); - boolean outputHot(); + boolean outputHot(); - String getToolType(); + String getToolType(); - String getResearch(); + String getResearch(); - ItemStack getRecipeOutput(); + ItemStack getRecipeOutput(); - Skill getSkill(); + Skill getSkill(); - boolean useCustomTiers(); + boolean useCustomTiers(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/RecipeSorterAnvil.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/RecipeSorterAnvil.java index 669a3395..89feef90 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/RecipeSorterAnvil.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/RecipeSorterAnvil.java @@ -3,26 +3,24 @@ import java.util.Comparator; /** - * * @author AnonymousProductions - * */ class RecipeSorterAnvil implements Comparator { - final CraftingManagerAnvil craftingManager; + final CraftingManagerAnvil craftingManager; - RecipeSorterAnvil(CraftingManagerAnvil manager) { - this.craftingManager = manager; - } + RecipeSorterAnvil(CraftingManagerAnvil manager) { + this.craftingManager = manager; + } - public int compareRecipes(IAnvilRecipe recipe1, IAnvilRecipe recipe2) { - return recipe1 instanceof ShapelessAnvilRecipes && recipe2 instanceof ShapedAnvilRecipes ? 1 - : (recipe2 instanceof ShapelessAnvilRecipes && recipe1 instanceof ShapedAnvilRecipes ? -1 - : (recipe2.getRecipeSize() < recipe1.getRecipeSize() ? -1 - : (recipe2.getRecipeSize() > recipe1.getRecipeSize() ? 1 : 0))); - } + public int compareRecipes(IAnvilRecipe recipe1, IAnvilRecipe recipe2) { + return recipe1 instanceof ShapelessAnvilRecipes && recipe2 instanceof ShapedAnvilRecipes ? 1 + : (recipe2 instanceof ShapelessAnvilRecipes && recipe1 instanceof ShapedAnvilRecipes ? -1 + : (recipe2.getRecipeSize() < recipe1.getRecipeSize() ? -1 + : (recipe2.getRecipeSize() > recipe1.getRecipeSize() ? 1 : 0))); + } - @Override - public int compare(Object input1, Object input2) { - return this.compareRecipes((IAnvilRecipe) input1, (IAnvilRecipe) input2); - } + @Override + public int compare(Object input1, Object input2) { + return this.compareRecipes((IAnvilRecipe) input1, (IAnvilRecipe) input2); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java index 52e562d9..0b1b67e1 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java @@ -9,212 +9,214 @@ import net.minecraftforge.oredict.OreDictionary; /** - * * @author AnonymousProductions - * */ public class ShapedAnvilRecipes implements IAnvilRecipe { - /** How many horizontal slots this recipe is wide. */ - public int recipeWidth; - - public final int recipeHammer; - - public final boolean outputHot; - /** How many vertical slots this recipe uses. */ - public int recipeHeight; - - /** The Anvil needed to craft */ - public final int anvil; - - /** Is a array of ItemStack that composes the recipe. */ - public ItemStack[] recipeItems; - - /** Is the ItemStack that you get when craft the recipe. */ - public ItemStack recipeOutput; - - public final int recipeTime; - public final float recipeExperiance; - public final String toolType; - public final String research; - public final Skill skillUsed; - - public ShapedAnvilRecipes(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, - int hammer, int anvi, float exp, boolean hot, String research, Skill skill) { - this.outputHot = hot; - this.recipeWidth = wdth; - this.anvil = anvi; - this.recipeHeight = heit; - this.recipeItems = inputs; - this.recipeOutput = output; - this.recipeTime = time; - this.recipeHammer = hammer; - this.recipeExperiance = exp; - this.toolType = toolType; - this.research = research; - this.skillUsed = skill; - } - - @Override - public ItemStack getRecipeOutput() { - return this.recipeOutput; - } - - @Override - public int getCraftTime() { - return recipeTime; - } - - @Override - public float getExperiance() { - return this.recipeExperiance; - } - - @Override - public int getRecipeHammer() { - return recipeHammer; - } - - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(AnvilCraftMatrix matrix) { - for (int var2 = 0; var2 <= ShapelessAnvilRecipes.globalWidth - this.recipeWidth; ++var2) { - for (int var3 = 0; var3 <= ShapelessAnvilRecipes.globalHeight - this.recipeHeight; ++var3) { - if (this.checkMatch(matrix, var2, var3, true)) { - return true; - } - - if (this.checkMatch(matrix, var2, var3, false)) { - return true; - } - } - } - - return false; - } - - /** - * Checks if the region of a crafting inventory is match for the recipe. - */ - protected boolean checkMatch(AnvilCraftMatrix matrix, int x, int y, boolean b) { - for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) { - for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) { - int var7 = var5 - x; - int var8 = var6 - y; - ItemStack recipeItem = null; - - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { - if (b) { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; - } else { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; - } - } - - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); - - if (inputItem != null || recipeItem != null) { - // HEATING - if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { - return false; - } - if (!Heatable.isWorkable(inputItem)) { - return false; - } - inputItem = getHotItem(inputItem); - - if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { - return false; - } - - if (inputItem == null) { - return false; - } - - if (recipeItem.getItem() != inputItem.getItem()) { - return false; - } - - if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE - && recipeItem.getItemDamage() != inputItem.getItemDamage()) { - return false; - } - if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { - return false; - } - } - } - } - - return true; - } - - protected ItemStack getHotItem(ItemStack item) { - if (item == null) - return null; - if (!(item.getItem() instanceof IHotItem)) { - return item; - } - - ItemStack hotItem = Heatable.getItem(item); - - if (hotItem != null) { - return hotItem; - } - - return item; - } - - private static NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) - item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(AnvilCraftMatrix matrix) { - return recipeOutput.copy(); - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() { - return this.recipeWidth * this.recipeHeight; - } - - @Override - public int getAnvil() { - return anvil; - } - - @Override - public boolean outputHot() { - return this.outputHot; - } - - @Override - public String getToolType() { - return toolType; - } - - @Override - public String getResearch() { - return research; - } - - @Override - public Skill getSkill() { - return skillUsed; - } - - @Override - public boolean useCustomTiers() { - return false; - } + public final int recipeHammer; + public final boolean outputHot; + /** + * The Anvil needed to craft + */ + public final int anvil; + public final int recipeTime; + public final float recipeExperiance; + public final String toolType; + public final String research; + public final Skill skillUsed; + /** + * How many horizontal slots this recipe is wide. + */ + public int recipeWidth; + /** + * How many vertical slots this recipe uses. + */ + public int recipeHeight; + /** + * Is a array of ItemStack that composes the recipe. + */ + public ItemStack[] recipeItems; + /** + * Is the ItemStack that you get when craft the recipe. + */ + public ItemStack recipeOutput; + + public ShapedAnvilRecipes(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, + int hammer, int anvi, float exp, boolean hot, String research, Skill skill) { + this.outputHot = hot; + this.recipeWidth = wdth; + this.anvil = anvi; + this.recipeHeight = heit; + this.recipeItems = inputs; + this.recipeOutput = output; + this.recipeTime = time; + this.recipeHammer = hammer; + this.recipeExperiance = exp; + this.toolType = toolType; + this.research = research; + this.skillUsed = skill; + } + + private static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + @Override + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + @Override + public int getCraftTime() { + return recipeTime; + } + + @Override + public float getExperiance() { + return this.recipeExperiance; + } + + @Override + public int getRecipeHammer() { + return recipeHammer; + } + + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(AnvilCraftMatrix matrix) { + for (int var2 = 0; var2 <= ShapelessAnvilRecipes.globalWidth - this.recipeWidth; ++var2) { + for (int var3 = 0; var3 <= ShapelessAnvilRecipes.globalHeight - this.recipeHeight; ++var3) { + if (this.checkMatch(matrix, var2, var3, true)) { + return true; + } + + if (this.checkMatch(matrix, var2, var3, false)) { + return true; + } + } + } + + return false; + } + + /** + * Checks if the region of a crafting inventory is match for the recipe. + */ + protected boolean checkMatch(AnvilCraftMatrix matrix, int x, int y, boolean b) { + for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) { + for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) { + int var7 = var5 - x; + int var8 = var6 - y; + ItemStack recipeItem = null; + + if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (b) { + recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + } else { + recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + } + } + + ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + + if (inputItem != null || recipeItem != null) { + // HEATING + if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { + return false; + } + if (!Heatable.isWorkable(inputItem)) { + return false; + } + inputItem = getHotItem(inputItem); + + if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { + return false; + } + + if (inputItem == null) { + return false; + } + + if (recipeItem.getItem() != inputItem.getItem()) { + return false; + } + + if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE + && recipeItem.getItemDamage() != inputItem.getItemDamage()) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + } + } + } + + return true; + } + + protected ItemStack getHotItem(ItemStack item) { + if (item == null) + return null; + if (!(item.getItem() instanceof IHotItem)) { + return item; + } + + ItemStack hotItem = Heatable.getItem(item); + + if (hotItem != null) { + return hotItem; + } + + return item; + } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(AnvilCraftMatrix matrix) { + return recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return this.recipeWidth * this.recipeHeight; + } + + @Override + public int getAnvil() { + return anvil; + } + + @Override + public boolean outputHot() { + return this.outputHot; + } + + @Override + public String getToolType() { + return toolType; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return skillUsed; + } + + @Override + public boolean useCustomTiers() { + return false; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapelessAnvilRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapelessAnvilRecipes.java index b74b478c..8cf8ef3d 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapelessAnvilRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapelessAnvilRecipes.java @@ -1,9 +1,5 @@ package minefantasy.mf2.api.crafting.anvil; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import minefantasy.mf2.api.heating.Heatable; import minefantasy.mf2.api.heating.IHotItem; import minefantasy.mf2.api.helpers.CustomToolHelper; @@ -12,184 +8,189 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** - * * @author AnonymousProductions - * */ public class ShapelessAnvilRecipes implements IAnvilRecipe { - public static final int globalWidth = 6; - public static final int globalHeight = 4; - - /** Is the ItemStack that you get when craft the recipe. */ - public final ItemStack recipeOutput; - - public final boolean outputHot; - /** Is a List of ItemStack that composes the recipe. */ - public final List recipeItems; - - private final int recipeHammer; - - /** The anvil Required */ - public final int anvil; - - public final int recipeTime; - public final float recipeExperiance; - public final String toolType; - public final String research; - public final Skill skillUsed; - - public ShapelessAnvilRecipes(ItemStack output, String toolType, float exp, int hammer, int anvi, int time, - List components, boolean hot, String research, Skill skill) { - this.outputHot = hot; - this.recipeOutput = output; - this.anvil = anvi; - this.recipeItems = components; - this.recipeHammer = hammer; - this.recipeTime = time; - this.recipeExperiance = exp; - this.toolType = toolType; - this.research = research; - this.skillUsed = skill; - } - - @Override - public ItemStack getRecipeOutput() { - return this.recipeOutput; - } - - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(AnvilCraftMatrix matrix) { - ArrayList var2 = new ArrayList(this.recipeItems); - - for (int var3 = 0; var3 <= globalWidth; ++var3) { - for (int var4 = 0; var4 <= globalHeight; ++var4) { - ItemStack inputItem = matrix.getStackInRowAndColumn(var4, var3); - - if (inputItem != null) { - boolean var6 = false; - Iterator var7 = var2.iterator(); - - while (var7.hasNext()) { - ItemStack recipeItem = (ItemStack) var7.next(); - - // HEATING - if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { - return false; - } - if (!Heatable.isWorkable(inputItem)) { - return false; - } - inputItem = getHotItem(inputItem); - - if (inputItem == null) { - return false; - } - if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { - return false; - } - if (inputItem.getItem() == recipeItem.getItem() - && (recipeItem.getItemDamage() == OreDictionary.WILDCARD_VALUE - || inputItem.getItemDamage() == recipeItem.getItemDamage())) { - var6 = true; - var2.remove(recipeItem); - break; - } - } - - if (!var6) { - return false; - } - } - } - } - - return var2.isEmpty(); - } - - protected ItemStack getHotItem(ItemStack item) { - if (item == null) - return null; - if (!(item.getItem() instanceof IHotItem)) { - return item; - } - - ItemStack hotItem = Heatable.getItem(item); - - if (hotItem != null) { - return hotItem; - } - - return item; - } - - private static NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) - item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(AnvilCraftMatrix par1AnvilCraftMatrix) { - return this.recipeOutput.copy(); - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() { - return this.recipeItems.size(); - } - - @Override - public int getCraftTime() { - return this.recipeTime; - } - - @Override - public int getRecipeHammer() { - return this.recipeHammer; - } - - @Override - public float getExperiance() { - return this.recipeExperiance; - } - - @Override - public int getAnvil() { - return this.anvil; - } - - @Override - public boolean outputHot() { - return outputHot; - } - - @Override - public String getToolType() { - return toolType; - } - - @Override - public String getResearch() { - return research; - } - - @Override - public Skill getSkill() { - return skillUsed; - } - - @Override - public boolean useCustomTiers() { - return false; - } + public static final int globalWidth = 6; + public static final int globalHeight = 4; + + /** + * Is the ItemStack that you get when craft the recipe. + */ + public final ItemStack recipeOutput; + + public final boolean outputHot; + /** + * Is a List of ItemStack that composes the recipe. + */ + public final List recipeItems; + /** + * The anvil Required + */ + public final int anvil; + public final int recipeTime; + public final float recipeExperiance; + public final String toolType; + public final String research; + public final Skill skillUsed; + private final int recipeHammer; + + public ShapelessAnvilRecipes(ItemStack output, String toolType, float exp, int hammer, int anvi, int time, + List components, boolean hot, String research, Skill skill) { + this.outputHot = hot; + this.recipeOutput = output; + this.anvil = anvi; + this.recipeItems = components; + this.recipeHammer = hammer; + this.recipeTime = time; + this.recipeExperiance = exp; + this.toolType = toolType; + this.research = research; + this.skillUsed = skill; + } + + private static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + @Override + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(AnvilCraftMatrix matrix) { + ArrayList var2 = new ArrayList(this.recipeItems); + + for (int var3 = 0; var3 <= globalWidth; ++var3) { + for (int var4 = 0; var4 <= globalHeight; ++var4) { + ItemStack inputItem = matrix.getStackInRowAndColumn(var4, var3); + + if (inputItem != null) { + boolean var6 = false; + Iterator var7 = var2.iterator(); + + while (var7.hasNext()) { + ItemStack recipeItem = (ItemStack) var7.next(); + + // HEATING + if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { + return false; + } + if (!Heatable.isWorkable(inputItem)) { + return false; + } + inputItem = getHotItem(inputItem); + + if (inputItem == null) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + if (inputItem.getItem() == recipeItem.getItem() + && (recipeItem.getItemDamage() == OreDictionary.WILDCARD_VALUE + || inputItem.getItemDamage() == recipeItem.getItemDamage())) { + var6 = true; + var2.remove(recipeItem); + break; + } + } + + if (!var6) { + return false; + } + } + } + } + + return var2.isEmpty(); + } + + protected ItemStack getHotItem(ItemStack item) { + if (item == null) + return null; + if (!(item.getItem() instanceof IHotItem)) { + return item; + } + + ItemStack hotItem = Heatable.getItem(item); + + if (hotItem != null) { + return hotItem; + } + + return item; + } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(AnvilCraftMatrix par1AnvilCraftMatrix) { + return this.recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return this.recipeItems.size(); + } + + @Override + public int getCraftTime() { + return this.recipeTime; + } + + @Override + public int getRecipeHammer() { + return this.recipeHammer; + } + + @Override + public float getExperiance() { + return this.recipeExperiance; + } + + @Override + public int getAnvil() { + return this.anvil; + } + + @Override + public boolean outputHot() { + return outputHot; + } + + @Override + public String getToolType() { + return toolType; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return skillUsed; + } + + @Override + public boolean useCustomTiers() { + return false; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CarpenterCraftMatrix.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CarpenterCraftMatrix.java index f4800a08..b3ae7f03 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CarpenterCraftMatrix.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CarpenterCraftMatrix.java @@ -4,16 +4,16 @@ import net.minecraft.inventory.InventoryCrafting; public class CarpenterCraftMatrix extends InventoryCrafting { - private ICarpenter crafter; + private ICarpenter crafter; - public CarpenterCraftMatrix(ICarpenter crafter, Container instance, int xSize, int ySize) { - super(instance, xSize, ySize); - this.crafter = crafter; - } + public CarpenterCraftMatrix(ICarpenter crafter, Container instance, int xSize, int ySize) { + super(instance, xSize, ySize); + this.crafter = crafter; + } - public void modifyTier(int hammerTier, int craftTime) { - crafter.setToolTier(hammerTier); - crafter.setForgeTime(craftTime); - } + public void modifyTier(int hammerTier, int craftTime) { + crafter.setToolTier(hammerTier); + crafter.setForgeTime(craftTime); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CraftingManagerCarpenter.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CraftingManagerCarpenter.java index 72ae67ed..8365d1a3 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CraftingManagerCarpenter.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CraftingManagerCarpenter.java @@ -1,282 +1,280 @@ package minefantasy.mf2.api.crafting.carpenter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; - import minefantasy.mf2.api.rpg.Skill; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import java.util.*; + /** - * * @author AnonymousProductions - * */ public class CraftingManagerCarpenter { - /** The static instance of this class */ - private static final CraftingManagerCarpenter instance = new CraftingManagerCarpenter(); - - /** A list of all the recipes added */ - public List recipes = new ArrayList(); - - /** - * Returns the static instance of this class - */ - public static CraftingManagerCarpenter getInstance() { - return instance; - } - - private CraftingManagerCarpenter() { - Collections.sort(this.recipes, new RecipeSorterCarpenter(this)); - System.out.println("MineFantasy: Anvil recipes initiating"); - } - - /** - * Adds a recipe. See spreadsheet on first page for details. - */ - public ICarpenterRecipe addRecipe(ItemStack result, Skill skill, String research, String sound, float exp, - String tool, int hammer, int anvil, int time, Object... input) { - return addRecipe(result, skill, research, sound, exp, tool, hammer, anvil, time, (byte) 0, input); - } - - public ICarpenterRecipe addToolRecipe(ItemStack result, Skill skill, String research, String sound, float exp, - String tool, int hammer, int anvil, int time, Object... input) { - return addRecipe(result, skill, research, sound, exp, tool, hammer, anvil, time, (byte) 1, input); - } - - /** - * Adds a recipe. See spreadsheet on first page for details. - */ - public ICarpenterRecipe addRecipe(ItemStack result, Skill skill, String research, String sound, float exp, - String tool, int hammer, int anvil, int time, byte id, Object... input) { - String var3 = ""; - int var4 = 0; - int var5 = 0; - int var6 = 0; - int var9; - - if (input[var4] instanceof String[]) { - String[] var7 = ((String[]) input[var4++]); - String[] var8 = var7; - var9 = var7.length; - - for (int var10 = 0; var10 < var9; ++var10) { - String var11 = var8[var10]; - ++var6; - var5 = var11.length(); - var3 = var3 + var11; - } - } else { - while (input[var4] instanceof String) { - String var13 = (String) input[var4++]; - ++var6; - var5 = var13.length(); - var3 = var3 + var13; - } - } - - HashMap var14; - - for (var14 = new HashMap(); var4 < input.length; var4 += 2) { - Character var16 = (Character) input[var4]; - ItemStack var17 = null; - - if (input[var4 + 1] instanceof Item) { - var17 = new ItemStack((Item) input[var4 + 1], 1, 32767); - } else if (input[var4 + 1] instanceof Block) { - var17 = new ItemStack((Block) input[var4 + 1], 1, 32767); - } else if (input[var4 + 1] instanceof ItemStack) { - var17 = (ItemStack) input[var4 + 1]; - } - - var14.put(var16, var17); - } - - ItemStack[] var15 = new ItemStack[var5 * var6]; - - for (var9 = 0; var9 < var5 * var6; ++var9) { - char var18 = var3.charAt(var9); - - if (var14.containsKey(Character.valueOf(var18))) { - var15[var9] = ((ItemStack) var14.get(Character.valueOf(var18))).copy(); - } else { - var15[var9] = null; - } - } - ICarpenterRecipe recipe; - - if (id == (byte) 1) { - recipe = new CustomToolRecipeCarpenter(var5, var6, var15, result, tool, time, hammer, anvil, exp, false, - sound, research, skill); - } else { - recipe = new ShapedCarpenterRecipes(var5, var6, var15, result, tool, time, hammer, anvil, exp, false, sound, - research, skill); - } - this.recipes.add(recipe); - return recipe; - } - - public ICarpenterRecipe addShapelessRecipe(ItemStack output, Skill skill, String research, String sound, - float experience, String tool, int hammer, int anvil, int time, Object... input) { - ArrayList var3 = new ArrayList(); - Object[] var4 = input; - int var5 = input.length; - - for (int var6 = 0; var6 < var5; ++var6) { - Object var7 = var4[var6]; - - if (var7 instanceof ItemStack) { - var3.add(((ItemStack) var7).copy()); - } else if (var7 instanceof Item) { - var3.add(new ItemStack((Item) var7)); - } else { - if (!(var7 instanceof Block)) { - throw new RuntimeException("MineFantasy: Invalid shapeless anvil recipe!"); - } - - var3.add(new ItemStack((Block) var7)); - } - } - - ICarpenterRecipe recipe = new ShapelessCarpenterRecipes(output, tool, experience, hammer, anvil, time, var3, - false, sound, research, skill); - this.recipes.add(recipe); - return recipe; - } - - public ItemStack findMatchingRecipe(CarpenterCraftMatrix matrix) { - int var2 = 0; - ItemStack var3 = null; - ItemStack var4 = null; - - for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { - ItemStack var6 = matrix.getStackInSlot(var5); - - if (var6 != null) { - if (var2 == 0) { - var3 = var6; - } - - if (var2 == 1) { - var4 = var6; - } - - ++var2; - } - } - - if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 - && var3.getItem().isRepairable()) { - Item var10 = var3.getItem(); - int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); - int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); - int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; - int var9 = var10.getMaxDamage() - (var8) * 2; - - if (var9 < 0) { - var9 = 0; - } - - return new ItemStack(var3.getItem(), 1, var9); - } else { - Iterator var11 = this.recipes.iterator(); - ICarpenterRecipe var13; - - do { - if (!var11.hasNext()) { - return null; - } - - var13 = (ICarpenterRecipe) var11.next(); - } while (!var13.matches(matrix)); - - return var13.getCraftingResult(matrix); - } - } - - public ItemStack findMatchingRecipe(ICarpenter bench, CarpenterCraftMatrix matrix) { - int time = 200; - int anvi = 1; - boolean hot = false; - int hammer = 0; - int var2 = 0; - String toolType = "hands"; - String sound = "basic"; - ItemStack var3 = null; - ItemStack var4 = null; - - for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { - ItemStack var6 = matrix.getStackInSlot(var5); - - if (var6 != null) { - if (var2 == 0) { - var3 = var6; - } - - if (var2 == 1) { - var4 = var6; - } - - ++var2; - } - } - - if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 - && var3.getItem().isRepairable()) { - Item var10 = var3.getItem(); - int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); - int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); - int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; - int var9 = var10.getMaxDamage() - var8; - - if (var9 < 0) { - var9 = 0; - } - - return new ItemStack(var3.getItem(), 1, var9); - } else { - Iterator var11 = this.recipes.iterator(); - ICarpenterRecipe var13 = null; - - while (var11.hasNext()) { - ICarpenterRecipe rec = (ICarpenterRecipe) var11.next(); - - if (rec.matches(matrix)) { - var13 = rec; - } - } - - if (var13 != null) { - time = var13.getCraftTime(); - hammer = var13.getRecipeHammer(); - anvi = var13.getAnvil(); - hot = var13.outputHot(); - toolType = var13.getToolType(); - sound = var13.getSound(); - - bench.setForgeTime(time); - bench.setToolTier(hammer); - bench.setRequiredCarpenter(anvi); - bench.setHotOutput(hot); - bench.setToolType(toolType); - bench.setCraftingSound(sound); - bench.setResearch(var13.getResearch()); - bench.setSkill(var13.getSkill()); - - return var13.getCraftingResult(matrix); - } - return null; - } - } - - /** - * returns the List<> of all recipes - */ - public List getRecipeList() { - return this.recipes; - } + /** + * The static instance of this class + */ + private static final CraftingManagerCarpenter instance = new CraftingManagerCarpenter(); + + /** + * A list of all the recipes added + */ + public List recipes = new ArrayList(); + + private CraftingManagerCarpenter() { + Collections.sort(this.recipes, new RecipeSorterCarpenter(this)); + System.out.println("MineFantasy: Anvil recipes initiating"); + } + + /** + * Returns the static instance of this class + */ + public static CraftingManagerCarpenter getInstance() { + return instance; + } + + /** + * Adds a recipe. See spreadsheet on first page for details. + */ + public ICarpenterRecipe addRecipe(ItemStack result, Skill skill, String research, String sound, float exp, + String tool, int hammer, int anvil, int time, Object... input) { + return addRecipe(result, skill, research, sound, exp, tool, hammer, anvil, time, (byte) 0, input); + } + + public ICarpenterRecipe addToolRecipe(ItemStack result, Skill skill, String research, String sound, float exp, + String tool, int hammer, int anvil, int time, Object... input) { + return addRecipe(result, skill, research, sound, exp, tool, hammer, anvil, time, (byte) 1, input); + } + + /** + * Adds a recipe. See spreadsheet on first page for details. + */ + public ICarpenterRecipe addRecipe(ItemStack result, Skill skill, String research, String sound, float exp, + String tool, int hammer, int anvil, int time, byte id, Object... input) { + String var3 = ""; + int var4 = 0; + int var5 = 0; + int var6 = 0; + int var9; + + if (input[var4] instanceof String[]) { + String[] var7 = ((String[]) input[var4++]); + String[] var8 = var7; + var9 = var7.length; + + for (int var10 = 0; var10 < var9; ++var10) { + String var11 = var8[var10]; + ++var6; + var5 = var11.length(); + var3 = var3 + var11; + } + } else { + while (input[var4] instanceof String) { + String var13 = (String) input[var4++]; + ++var6; + var5 = var13.length(); + var3 = var3 + var13; + } + } + + HashMap var14; + + for (var14 = new HashMap(); var4 < input.length; var4 += 2) { + Character var16 = (Character) input[var4]; + ItemStack var17 = null; + + if (input[var4 + 1] instanceof Item) { + var17 = new ItemStack((Item) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof Block) { + var17 = new ItemStack((Block) input[var4 + 1], 1, 32767); + } else if (input[var4 + 1] instanceof ItemStack) { + var17 = (ItemStack) input[var4 + 1]; + } + + var14.put(var16, var17); + } + + ItemStack[] var15 = new ItemStack[var5 * var6]; + + for (var9 = 0; var9 < var5 * var6; ++var9) { + char var18 = var3.charAt(var9); + + if (var14.containsKey(Character.valueOf(var18))) { + var15[var9] = ((ItemStack) var14.get(Character.valueOf(var18))).copy(); + } else { + var15[var9] = null; + } + } + ICarpenterRecipe recipe; + + if (id == (byte) 1) { + recipe = new CustomToolRecipeCarpenter(var5, var6, var15, result, tool, time, hammer, anvil, exp, false, + sound, research, skill); + } else { + recipe = new ShapedCarpenterRecipes(var5, var6, var15, result, tool, time, hammer, anvil, exp, false, sound, + research, skill); + } + this.recipes.add(recipe); + return recipe; + } + + public ICarpenterRecipe addShapelessRecipe(ItemStack output, Skill skill, String research, String sound, + float experience, String tool, int hammer, int anvil, int time, Object... input) { + ArrayList var3 = new ArrayList(); + Object[] var4 = input; + int var5 = input.length; + + for (int var6 = 0; var6 < var5; ++var6) { + Object var7 = var4[var6]; + + if (var7 instanceof ItemStack) { + var3.add(((ItemStack) var7).copy()); + } else if (var7 instanceof Item) { + var3.add(new ItemStack((Item) var7)); + } else { + if (!(var7 instanceof Block)) { + throw new RuntimeException("MineFantasy: Invalid shapeless anvil recipe!"); + } + + var3.add(new ItemStack((Block) var7)); + } + } + + ICarpenterRecipe recipe = new ShapelessCarpenterRecipes(output, tool, experience, hammer, anvil, time, var3, + false, sound, research, skill); + this.recipes.add(recipe); + return recipe; + } + + public ItemStack findMatchingRecipe(CarpenterCraftMatrix matrix) { + int var2 = 0; + ItemStack var3 = null; + ItemStack var4 = null; + + for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { + ItemStack var6 = matrix.getStackInSlot(var5); + + if (var6 != null) { + if (var2 == 0) { + var3 = var6; + } + + if (var2 == 1) { + var4 = var6; + } + + ++var2; + } + } + + if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 + && var3.getItem().isRepairable()) { + Item var10 = var3.getItem(); + int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); + int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); + int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; + int var9 = var10.getMaxDamage() - (var8) * 2; + + if (var9 < 0) { + var9 = 0; + } + + return new ItemStack(var3.getItem(), 1, var9); + } else { + Iterator var11 = this.recipes.iterator(); + ICarpenterRecipe var13; + + do { + if (!var11.hasNext()) { + return null; + } + + var13 = (ICarpenterRecipe) var11.next(); + } while (!var13.matches(matrix)); + + return var13.getCraftingResult(matrix); + } + } + + public ItemStack findMatchingRecipe(ICarpenter bench, CarpenterCraftMatrix matrix) { + int time = 200; + int anvi = 1; + boolean hot = false; + int hammer = 0; + int var2 = 0; + String toolType = "hands"; + String sound = "basic"; + ItemStack var3 = null; + ItemStack var4 = null; + + for (int var5 = 0; var5 < matrix.getSizeInventory(); ++var5) { + ItemStack var6 = matrix.getStackInSlot(var5); + + if (var6 != null) { + if (var2 == 0) { + var3 = var6; + } + + if (var2 == 1) { + var4 = var6; + } + + ++var2; + } + } + + if (var2 == 2 && var3.getItem() == var4.getItem() && var3.stackSize == 1 && var4.stackSize == 1 + && var3.getItem().isRepairable()) { + Item var10 = var3.getItem(); + int var12 = var10.getMaxDamage() - var3.getItemDamageForDisplay(); + int var7 = var10.getMaxDamage() - var4.getItemDamageForDisplay(); + int var8 = var12 + var7 + var10.getMaxDamage() * 10 / 100; + int var9 = var10.getMaxDamage() - var8; + + if (var9 < 0) { + var9 = 0; + } + + return new ItemStack(var3.getItem(), 1, var9); + } else { + Iterator var11 = this.recipes.iterator(); + ICarpenterRecipe var13 = null; + + while (var11.hasNext()) { + ICarpenterRecipe rec = (ICarpenterRecipe) var11.next(); + + if (rec.matches(matrix)) { + var13 = rec; + } + } + + if (var13 != null) { + time = var13.getCraftTime(); + hammer = var13.getRecipeHammer(); + anvi = var13.getAnvil(); + hot = var13.outputHot(); + toolType = var13.getToolType(); + sound = var13.getSound(); + + bench.setForgeTime(time); + bench.setToolTier(hammer); + bench.setRequiredCarpenter(anvi); + bench.setHotOutput(hot); + bench.setToolType(toolType); + bench.setCraftingSound(sound); + bench.setResearch(var13.getResearch()); + bench.setSkill(var13.getSkill()); + + return var13.getCraftingResult(matrix); + } + return null; + } + } + + /** + * returns the List<> of all recipes + */ + public List getRecipeList() { + return this.recipes; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CustomToolRecipeCarpenter.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CustomToolRecipeCarpenter.java index b05392e2..a537a53a 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/CustomToolRecipeCarpenter.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/CustomToolRecipeCarpenter.java @@ -7,123 +7,121 @@ import net.minecraftforge.oredict.OreDictionary; /** - * * @author AnonymousProductions - * */ public class CustomToolRecipeCarpenter extends ShapedCarpenterRecipes { - public CustomToolRecipeCarpenter(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, - int time, int toolTier, int blockTier, float exp, boolean hot, String sound, String research, Skill skill) { - super(wdth, heit, inputs, output, toolType, time, toolTier, blockTier, exp, hot, sound, research, skill); - } + public CustomToolRecipeCarpenter(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, + int time, int toolTier, int blockTier, float exp, boolean hot, String sound, String research, Skill skill) { + super(wdth, heit, inputs, output, toolType, time, toolTier, blockTier, exp, hot, sound, research, skill); + } - private boolean checkMatch(CarpenterCraftMatrix matrix, int x, int y, boolean b) { - String wood = null; - String metal = null; - for (int var5 = 0; var5 < ShapelessCarpenterRecipes.globalWidth; ++var5) { - for (int var6 = 0; var6 < ShapelessCarpenterRecipes.globalHeight; ++var6) { - int var7 = var5 - x; - int var8 = var6 - y; - ItemStack recipeItem = null; + private boolean checkMatch(CarpenterCraftMatrix matrix, int x, int y, boolean b) { + String wood = null; + String metal = null; + for (int var5 = 0; var5 < ShapelessCarpenterRecipes.globalWidth; ++var5) { + for (int var6 = 0; var6 < ShapelessCarpenterRecipes.globalHeight; ++var6) { + int var7 = var5 - x; + int var8 = var6 - y; + ItemStack recipeItem = null; - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { - if (b) { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; - } else { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; - } - } + if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (b) { + recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + } else { + recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + } + } - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); - if (inputItem != null || recipeItem != null) { - String component_wood = CustomToolHelper.getComponentMaterial(inputItem, "wood"); - String component_metal = CustomToolHelper.getComponentMaterial(inputItem, "metal"); + if (inputItem != null || recipeItem != null) { + String component_wood = CustomToolHelper.getComponentMaterial(inputItem, "wood"); + String component_metal = CustomToolHelper.getComponentMaterial(inputItem, "metal"); - if (component_metal != null)// CHECK CUSTOM METAL - { - if (metal == null) { - metal = component_metal; - } else { - if (!metal.equalsIgnoreCase(component_metal)) { - return false; - } - } - } + if (component_metal != null)// CHECK CUSTOM METAL + { + if (metal == null) { + metal = component_metal; + } else { + if (!metal.equalsIgnoreCase(component_metal)) { + return false; + } + } + } - if (component_wood != null)// CHECK CUSTOM WOOD - { - if (wood == null) { - wood = component_wood; - } else { - if (!wood.equalsIgnoreCase(component_wood)) { - return false; - } - } - } + if (component_wood != null)// CHECK CUSTOM WOOD + { + if (wood == null) { + wood = component_wood; + } else { + if (!wood.equalsIgnoreCase(component_wood)) { + return false; + } + } + } - if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { - return false; - } + if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { + return false; + } - if (inputItem == null) { - return false; - } + if (inputItem == null) { + return false; + } - if (recipeItem.getItem() != inputItem.getItem()) { - return false; - } - if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { - return false; - } - if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE - && recipeItem.getItemDamage() != inputItem.getItemDamage()) { - return false; - } - } - } - } - if (!modifyTiers(matrix, metal)) { - modifyTiers(matrix, wood); - } + if (recipeItem.getItem() != inputItem.getItem()) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE + && recipeItem.getItemDamage() != inputItem.getItemDamage()) { + return false; + } + } + } + } + if (!modifyTiers(matrix, metal)) { + modifyTiers(matrix, wood); + } - return true; - } + return true; + } - private boolean modifyTiers(CarpenterCraftMatrix matrix, String tier) { - CustomMaterial material = CustomMaterial.getMaterial(tier); - if (material != null) { - int newTier = recipeHammer < 0 ? material.crafterTier : recipeHammer; - matrix.modifyTier(newTier, (int) (recipeTime * material.craftTimeModifier)); - return true; - } - return false; - } + private boolean modifyTiers(CarpenterCraftMatrix matrix, String tier) { + CustomMaterial material = CustomMaterial.getMaterial(tier); + if (material != null) { + int newTier = recipeHammer < 0 ? material.crafterTier : recipeHammer; + matrix.modifyTier(newTier, (int) (recipeTime * material.craftTimeModifier)); + return true; + } + return false; + } - @Override - public ItemStack getCraftingResult(CarpenterCraftMatrix matrix) { - ItemStack result = super.getCraftingResult(matrix); + @Override + public ItemStack getCraftingResult(CarpenterCraftMatrix matrix) { + ItemStack result = super.getCraftingResult(matrix); - String wood = null; - String metal = null; - for (int i = 0; i < matrix.getSizeInventory(); i++) { - ItemStack item = matrix.getStackInSlot(i); - String component_wood = CustomToolHelper.getComponentMaterial(item, "wood"); - String component_metal = CustomToolHelper.getComponentMaterial(item, "metal"); - if (wood == null && component_wood != null) { - wood = component_wood; - } - if (metal == null && component_metal != null) { - metal = component_metal; - } - } - if (metal != null) { - CustomMaterial.addMaterial(result, CustomToolHelper.slot_main, metal); - } - if (wood != null) { - CustomMaterial.addMaterial(result, metal == null ? CustomToolHelper.slot_main : CustomToolHelper.slot_haft, - wood); - } - return result; - } + String wood = null; + String metal = null; + for (int i = 0; i < matrix.getSizeInventory(); i++) { + ItemStack item = matrix.getStackInSlot(i); + String component_wood = CustomToolHelper.getComponentMaterial(item, "wood"); + String component_metal = CustomToolHelper.getComponentMaterial(item, "metal"); + if (wood == null && component_wood != null) { + wood = component_wood; + } + if (metal == null && component_metal != null) { + metal = component_metal; + } + } + if (metal != null) { + CustomMaterial.addMaterial(result, CustomToolHelper.slot_main, metal); + } + if (wood != null) { + CustomMaterial.addMaterial(result, metal == null ? CustomToolHelper.slot_main : CustomToolHelper.slot_haft, + wood); + } + return result; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenter.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenter.java index fef58812..c8bf7e00 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenter.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenter.java @@ -3,25 +3,23 @@ import minefantasy.mf2.api.rpg.Skill; /** - * * @author AnonymousProductions This interface is used by the anvil in - * MineFantasy so it can be referred to without importing the mod - * + * MineFantasy so it can be referred to without importing the mod */ public interface ICarpenter { - void setForgeTime(int i); + void setForgeTime(int i); - void setToolTier(int i); + void setToolTier(int i); - void setRequiredCarpenter(int i); + void setRequiredCarpenter(int i); - void setHotOutput(boolean i); + void setHotOutput(boolean i); - void setToolType(String toolType); + void setToolType(String toolType); - void setCraftingSound(String trade); + void setCraftingSound(String trade); - void setResearch(String research); + void setResearch(String research); - void setSkill(Skill skill); + void setSkill(Skill skill); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenterRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenterRecipe.java index 2ad2ac73..72532103 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenterRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ICarpenterRecipe.java @@ -4,43 +4,41 @@ import net.minecraft.item.ItemStack; /** - * * @author AnonymousProductions - * */ public interface ICarpenterRecipe { - /** - * Used to check if a recipe matches current crafting inventory - */ - boolean matches(CarpenterCraftMatrix var1); + /** + * Used to check if a recipe matches current crafting inventory + */ + boolean matches(CarpenterCraftMatrix var1); - /** - * Returns an Item that is the result of this recipe - */ - ItemStack getCraftingResult(CarpenterCraftMatrix var1); + /** + * Returns an Item that is the result of this recipe + */ + ItemStack getCraftingResult(CarpenterCraftMatrix var1); - int getCraftTime(); + int getCraftTime(); - /** - * Returns the size of the recipe area - */ - int getRecipeSize(); + /** + * Returns the size of the recipe area + */ + int getRecipeSize(); - int getRecipeHammer(); + int getRecipeHammer(); - float getExperiance(); + float getExperiance(); - int getAnvil(); + int getAnvil(); - boolean outputHot(); + boolean outputHot(); - String getToolType(); + String getToolType(); - String getSound(); + String getSound(); - ItemStack getRecipeOutput(); + ItemStack getRecipeOutput(); - String getResearch(); + String getResearch(); - Skill getSkill(); + Skill getSkill(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/RecipeSorterCarpenter.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/RecipeSorterCarpenter.java index 524a657a..d7a0400a 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/RecipeSorterCarpenter.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/RecipeSorterCarpenter.java @@ -3,26 +3,24 @@ import java.util.Comparator; /** - * * @author AnonymousProductions - * */ class RecipeSorterCarpenter implements Comparator { - final CraftingManagerCarpenter craftingManager; + final CraftingManagerCarpenter craftingManager; - RecipeSorterCarpenter(CraftingManagerCarpenter manager) { - this.craftingManager = manager; - } + RecipeSorterCarpenter(CraftingManagerCarpenter manager) { + this.craftingManager = manager; + } - public int compareRecipes(ICarpenterRecipe recipe1, ICarpenterRecipe recipe2) { - return recipe1 instanceof ShapelessCarpenterRecipes && recipe2 instanceof ShapedCarpenterRecipes ? 1 - : (recipe2 instanceof ShapelessCarpenterRecipes && recipe1 instanceof ShapedCarpenterRecipes ? -1 - : (recipe2.getRecipeSize() < recipe1.getRecipeSize() ? -1 - : (recipe2.getRecipeSize() > recipe1.getRecipeSize() ? 1 : 0))); - } + public int compareRecipes(ICarpenterRecipe recipe1, ICarpenterRecipe recipe2) { + return recipe1 instanceof ShapelessCarpenterRecipes && recipe2 instanceof ShapedCarpenterRecipes ? 1 + : (recipe2 instanceof ShapelessCarpenterRecipes && recipe1 instanceof ShapedCarpenterRecipes ? -1 + : (recipe2.getRecipeSize() < recipe1.getRecipeSize() ? -1 + : (recipe2.getRecipeSize() > recipe1.getRecipeSize() ? 1 : 0))); + } - @Override - public int compare(Object input1, Object input2) { - return this.compareRecipes((ICarpenterRecipe) input1, (ICarpenterRecipe) input2); - } + @Override + public int compare(Object input1, Object input2) { + return this.compareRecipes((ICarpenterRecipe) input1, (ICarpenterRecipe) input2); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java index 7f324fc3..c9a872aa 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java @@ -7,182 +7,184 @@ import net.minecraftforge.oredict.OreDictionary; /** - * * @author AnonymousProductions - * */ public class ShapedCarpenterRecipes implements ICarpenterRecipe { - /** How many horizontal slots this recipe is wide. */ - public int recipeWidth; - - public final int recipeHammer; - - public final boolean outputHot; - /** How many vertical slots this recipe uses. */ - public int recipeHeight; - - /** The Block Tier needed to craft */ - public final int blockTier; - - /** Is a array of ItemStack that composes the recipe. */ - public ItemStack[] recipeItems; - - /** Is the ItemStack that you get when craft the recipe. */ - public ItemStack recipeOutput; - - public final int recipeTime; - public final float recipeExperiance; - public final String toolType; - public final String soundOfCraft; - public final String research; - public final Skill skillUsed; - - public ShapedCarpenterRecipes(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, - int hammer, int anvi, float exp, boolean hot, String sound, String research, Skill skill) { - this.research = research; - this.outputHot = hot; - this.recipeWidth = wdth; - this.blockTier = anvi; - this.recipeHeight = heit; - this.recipeItems = inputs; - this.recipeOutput = output; - this.recipeTime = time; - this.recipeHammer = hammer; - this.recipeExperiance = exp; - this.toolType = toolType; - this.soundOfCraft = sound; - this.skillUsed = skill; - } - - @Override - public ItemStack getRecipeOutput() { - return this.recipeOutput; - } - - @Override - public int getCraftTime() { - return recipeTime; - } - - @Override - public float getExperiance() { - return this.recipeExperiance; - } - - @Override - public int getRecipeHammer() { - return recipeHammer; - } - - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(CarpenterCraftMatrix matrix) { - for (int var2 = 0; var2 <= ShapelessCarpenterRecipes.globalWidth - this.recipeWidth; ++var2) { - for (int var3 = 0; var3 <= ShapelessCarpenterRecipes.globalHeight - this.recipeHeight; ++var3) { - if (this.checkMatch(matrix, var2, var3, true)) { - return true; - } - - if (this.checkMatch(matrix, var2, var3, false)) { - return true; - } - } - } - - return false; - } - - /** - * Checks if the region of a crafting inventory is match for the recipe. - */ - private boolean checkMatch(InventoryCrafting matrix, int x, int y, boolean b) { - for (int var5 = 0; var5 < ShapelessCarpenterRecipes.globalWidth; ++var5) { - for (int var6 = 0; var6 < ShapelessCarpenterRecipes.globalHeight; ++var6) { - int var7 = var5 - x; - int var8 = var6 - y; - ItemStack recipeItem = null; - - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { - if (b) { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; - } else { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; - } - } - - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); - - if (inputItem != null || recipeItem != null) { - if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { - return false; - } - - if (inputItem == null) { - return false; - } - - if (recipeItem.getItem() != inputItem.getItem()) { - return false; - } - if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { - return false; - } - if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE - && recipeItem.getItemDamage() != inputItem.getItemDamage()) { - return false; - } - } - } - } - - return true; - } - - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(CarpenterCraftMatrix matrix) { - return recipeOutput.copy(); - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() { - return this.recipeWidth * this.recipeHeight; - } - - @Override - public int getAnvil() { - return blockTier; - } - - @Override - public boolean outputHot() { - return this.outputHot; - } - - @Override - public String getToolType() { - return toolType; - } - - @Override - public String getSound() { - return soundOfCraft; - } - - @Override - public String getResearch() { - return research; - } - - @Override - public Skill getSkill() { - return skillUsed; - } + public final int recipeHammer; + public final boolean outputHot; + /** + * The Block Tier needed to craft + */ + public final int blockTier; + public final int recipeTime; + public final float recipeExperiance; + public final String toolType; + public final String soundOfCraft; + public final String research; + public final Skill skillUsed; + /** + * How many horizontal slots this recipe is wide. + */ + public int recipeWidth; + /** + * How many vertical slots this recipe uses. + */ + public int recipeHeight; + /** + * Is a array of ItemStack that composes the recipe. + */ + public ItemStack[] recipeItems; + /** + * Is the ItemStack that you get when craft the recipe. + */ + public ItemStack recipeOutput; + + public ShapedCarpenterRecipes(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, + int hammer, int anvi, float exp, boolean hot, String sound, String research, Skill skill) { + this.research = research; + this.outputHot = hot; + this.recipeWidth = wdth; + this.blockTier = anvi; + this.recipeHeight = heit; + this.recipeItems = inputs; + this.recipeOutput = output; + this.recipeTime = time; + this.recipeHammer = hammer; + this.recipeExperiance = exp; + this.toolType = toolType; + this.soundOfCraft = sound; + this.skillUsed = skill; + } + + @Override + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + @Override + public int getCraftTime() { + return recipeTime; + } + + @Override + public float getExperiance() { + return this.recipeExperiance; + } + + @Override + public int getRecipeHammer() { + return recipeHammer; + } + + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(CarpenterCraftMatrix matrix) { + for (int var2 = 0; var2 <= ShapelessCarpenterRecipes.globalWidth - this.recipeWidth; ++var2) { + for (int var3 = 0; var3 <= ShapelessCarpenterRecipes.globalHeight - this.recipeHeight; ++var3) { + if (this.checkMatch(matrix, var2, var3, true)) { + return true; + } + + if (this.checkMatch(matrix, var2, var3, false)) { + return true; + } + } + } + + return false; + } + + /** + * Checks if the region of a crafting inventory is match for the recipe. + */ + private boolean checkMatch(InventoryCrafting matrix, int x, int y, boolean b) { + for (int var5 = 0; var5 < ShapelessCarpenterRecipes.globalWidth; ++var5) { + for (int var6 = 0; var6 < ShapelessCarpenterRecipes.globalHeight; ++var6) { + int var7 = var5 - x; + int var8 = var6 - y; + ItemStack recipeItem = null; + + if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (b) { + recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + } else { + recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + } + } + + ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + + if (inputItem != null || recipeItem != null) { + if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { + return false; + } + + if (inputItem == null) { + return false; + } + + if (recipeItem.getItem() != inputItem.getItem()) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE + && recipeItem.getItemDamage() != inputItem.getItemDamage()) { + return false; + } + } + } + } + + return true; + } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(CarpenterCraftMatrix matrix) { + return recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return this.recipeWidth * this.recipeHeight; + } + + @Override + public int getAnvil() { + return blockTier; + } + + @Override + public boolean outputHot() { + return this.outputHot; + } + + @Override + public String getToolType() { + return toolType; + } + + @Override + public String getSound() { + return soundOfCraft; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return skillUsed; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapelessCarpenterRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapelessCarpenterRecipes.java index 9cd08e90..0e618fd5 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapelessCarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapelessCarpenterRecipes.java @@ -1,179 +1,180 @@ package minefantasy.mf2.api.crafting.carpenter; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.rpg.Skill; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** - * * @author AnonymousProductions - * */ public class ShapelessCarpenterRecipes implements ICarpenterRecipe { - public static final int globalWidth = 4; - public static final int globalHeight = 4; - - /** Is the ItemStack that you get when craft the recipe. */ - private final ItemStack recipeOutput; - - private final boolean outputHot; - /** Is a List of ItemStack that composes the recipe. */ - public final List recipeItems; - - private final int recipeHammer; - - /** The Block Tier Required */ - private final int blockTier; - - private final int recipeTime; - private final float recipeExperiance; - private final String toolType; - private final String soundOfCraft; - private final String research; - private final Skill skillUsed; - - public ShapelessCarpenterRecipes(ItemStack output, String toolType, float exp, int hammer, int anvi, int time, - List components, boolean hot, String sound, String research, Skill skill) { - this.research = research; - this.outputHot = hot; - this.recipeOutput = output; - this.blockTier = anvi; - this.recipeItems = components; - this.recipeHammer = hammer; - this.recipeTime = time; - this.recipeExperiance = exp; - this.toolType = toolType; - this.soundOfCraft = sound; - this.skillUsed = skill; - } - - @Override - public ItemStack getRecipeOutput() { - return this.recipeOutput; - } - - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(CarpenterCraftMatrix par1InventoryCrafting) { - ArrayList var2 = new ArrayList(this.recipeItems); - - for (int var3 = 0; var3 <= globalWidth; ++var3) { - for (int var4 = 0; var4 <= globalHeight; ++var4) { - ItemStack inputItem = par1InventoryCrafting.getStackInRowAndColumn(var4, var3); - - if (inputItem != null) { - boolean var6 = false; - Iterator var7 = var2.iterator(); - - while (var7.hasNext()) { - ItemStack recipeItem = (ItemStack) var7.next(); - - if (inputItem == null) { - return false; - } - if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { - return false; - } - if (inputItem.getItem() == recipeItem.getItem() - && (recipeItem.getItemDamage() == OreDictionary.WILDCARD_VALUE - || inputItem.getItemDamage() == recipeItem.getItemDamage())) { - var6 = true; - var2.remove(recipeItem); - break; - } - } - - if (!var6) { - return false; - } - } - } - } - - return var2.isEmpty(); - } - - public static int getTemp(ItemStack item) { - NBTTagCompound tag = getNBT(item); - - if (tag.hasKey("MFtemp")) - return tag.getInteger("MFtemp"); - - return 0; - } - - private static NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) - item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(CarpenterCraftMatrix par1InventoryCrafting) { - return this.recipeOutput.copy(); - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() { - return this.recipeItems.size(); - } - - @Override - public int getCraftTime() { - return this.recipeTime; - } - - @Override - public int getRecipeHammer() { - return this.recipeHammer; - } - - @Override - public float getExperiance() { - return this.recipeExperiance; - } - - @Override - public int getAnvil() { - return this.blockTier; - } - - @Override - public boolean outputHot() { - return outputHot; - } - - @Override - public String getToolType() { - return toolType; - } - - @Override - public String getSound() { - return soundOfCraft; - } - - @Override - public String getResearch() { - return research; - } - - @Override - public Skill getSkill() { - return skillUsed; - } + public static final int globalWidth = 4; + public static final int globalHeight = 4; + /** + * Is a List of ItemStack that composes the recipe. + */ + public final List recipeItems; + /** + * Is the ItemStack that you get when craft the recipe. + */ + private final ItemStack recipeOutput; + private final boolean outputHot; + private final int recipeHammer; + + /** + * The Block Tier Required + */ + private final int blockTier; + + private final int recipeTime; + private final float recipeExperiance; + private final String toolType; + private final String soundOfCraft; + private final String research; + private final Skill skillUsed; + + public ShapelessCarpenterRecipes(ItemStack output, String toolType, float exp, int hammer, int anvi, int time, + List components, boolean hot, String sound, String research, Skill skill) { + this.research = research; + this.outputHot = hot; + this.recipeOutput = output; + this.blockTier = anvi; + this.recipeItems = components; + this.recipeHammer = hammer; + this.recipeTime = time; + this.recipeExperiance = exp; + this.toolType = toolType; + this.soundOfCraft = sound; + this.skillUsed = skill; + } + + public static int getTemp(ItemStack item) { + NBTTagCompound tag = getNBT(item); + + if (tag.hasKey("MFtemp")) + return tag.getInteger("MFtemp"); + + return 0; + } + + private static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + @Override + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(CarpenterCraftMatrix par1InventoryCrafting) { + ArrayList var2 = new ArrayList(this.recipeItems); + + for (int var3 = 0; var3 <= globalWidth; ++var3) { + for (int var4 = 0; var4 <= globalHeight; ++var4) { + ItemStack inputItem = par1InventoryCrafting.getStackInRowAndColumn(var4, var3); + + if (inputItem != null) { + boolean var6 = false; + Iterator var7 = var2.iterator(); + + while (var7.hasNext()) { + ItemStack recipeItem = (ItemStack) var7.next(); + + if (inputItem == null) { + return false; + } + if (!CustomToolHelper.doesMatchForRecipe(recipeItem, inputItem)) { + return false; + } + if (inputItem.getItem() == recipeItem.getItem() + && (recipeItem.getItemDamage() == OreDictionary.WILDCARD_VALUE + || inputItem.getItemDamage() == recipeItem.getItemDamage())) { + var6 = true; + var2.remove(recipeItem); + break; + } + } + + if (!var6) { + return false; + } + } + } + } + + return var2.isEmpty(); + } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(CarpenterCraftMatrix par1InventoryCrafting) { + return this.recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return this.recipeItems.size(); + } + + @Override + public int getCraftTime() { + return this.recipeTime; + } + + @Override + public int getRecipeHammer() { + return this.recipeHammer; + } + + @Override + public float getExperiance() { + return this.recipeExperiance; + } + + @Override + public int getAnvil() { + return this.blockTier; + } + + @Override + public boolean outputHot() { + return outputHot; + } + + @Override + public String getToolType() { + return toolType; + } + + @Override + public String getSound() { + return soundOfCraft; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return skillUsed; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/engineer/IBombComponent.java b/src/main/java/minefantasy/mf2/api/crafting/engineer/IBombComponent.java index cfb5807a..6144f577 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/engineer/IBombComponent.java +++ b/src/main/java/minefantasy/mf2/api/crafting/engineer/IBombComponent.java @@ -2,9 +2,13 @@ public interface IBombComponent { - /** The type of component only supported types (minecase, bombcase, filling) */ - public String getComponentType(); + /** + * The type of component only supported types (minecase, bombcase, filling) + */ + public String getComponentType(); - /** The tier, this depends on the component type */ - public byte getTier(); + /** + * The tier, this depends on the component type + */ + public byte getTier(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/engineer/ICrossbowPart.java b/src/main/java/minefantasy/mf2/api/crafting/engineer/ICrossbowPart.java index 731be172..9529603b 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/engineer/ICrossbowPart.java +++ b/src/main/java/minefantasy/mf2/api/crafting/engineer/ICrossbowPart.java @@ -1,37 +1,43 @@ package minefantasy.mf2.api.crafting.engineer; -import java.util.HashMap; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.util.IIcon; -public interface ICrossbowPart { - public static final HashMap components = new HashMap(); - - /** The type of component only supported types (minecase, bombcase, filling) */ - public String getComponentType(); - - /** The id, this depends on the component type */ - public int getID(); - - /** The Icon for the finished Model */ - @SideOnly(Side.CLIENT) - public IIcon getIcon(); - - /** - * Gets the name for the part (mostly an adjective like "Heavy" or "Repeating") - */ - public String getUnlocalisedName(); - - /** - * Modifies a value by name (such as "power" or "spread"), "capacity" is treated - * as an int - */ - public float getModifier(String type); +import java.util.HashMap; - /** - * Only for stocks, whether it's defined as a hand crossbow - */ - public boolean makesSmallWeapon(); +public interface ICrossbowPart { + public static final HashMap components = new HashMap(); + + /** + * The type of component only supported types (minecase, bombcase, filling) + */ + public String getComponentType(); + + /** + * The id, this depends on the component type + */ + public int getID(); + + /** + * The Icon for the finished Model + */ + @SideOnly(Side.CLIENT) + public IIcon getIcon(); + + /** + * Gets the name for the part (mostly an adjective like "Heavy" or "Repeating") + */ + public String getUnlocalisedName(); + + /** + * Modifies a value by name (such as "power" or "spread"), "capacity" is treated + * as an int + */ + public float getModifier(String type); + + /** + * Only for stocks, whether it's defined as a hand crossbow + */ + public boolean makesSmallWeapon(); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialCraftItem.java b/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialCraftItem.java index 5d605eda..28b5d8cf 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialCraftItem.java +++ b/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialCraftItem.java @@ -3,5 +3,5 @@ import net.minecraft.item.ItemStack; public interface ISpecialCraftItem { - public String getDesign(ItemStack item); + public String getDesign(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialDesign.java b/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialDesign.java index 686aeb67..1d6df496 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialDesign.java +++ b/src/main/java/minefantasy/mf2/api/crafting/exotic/ISpecialDesign.java @@ -3,5 +3,5 @@ import net.minecraft.item.ItemStack; public interface ISpecialDesign { - String getDesign(ItemStack item); + String getDesign(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/crafting/exotic/SpecialForging.java b/src/main/java/minefantasy/mf2/api/crafting/exotic/SpecialForging.java index ee5ba375..ecb472e4 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/exotic/SpecialForging.java +++ b/src/main/java/minefantasy/mf2/api/crafting/exotic/SpecialForging.java @@ -1,56 +1,56 @@ package minefantasy.mf2.api.crafting.exotic; -import java.util.HashMap; - import minefantasy.mf2.api.crafting.Salvage; import minefantasy.mf2.api.helpers.CustomToolHelper; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import java.util.HashMap; + public class SpecialForging { - public static HashMap dragonforgeCrafts = new HashMap(); - public static HashMap specialCrafts = new HashMap(); - - public static void addDragonforgeCraft(Block blackSteel, Block dragon) { - addDragonforgeCraft(Item.getItemFromBlock(blackSteel), Item.getItemFromBlock(dragon)); - } - - public static void addDragonforgeCraft(Item base, Item dragon) { - dragonforgeCrafts.put(base, dragon); - Salvage.shareSalvage(dragon, base); - } - - public static Item getDragonCraft(ItemStack blacksteel) { - if (dragonforgeCrafts.containsKey(blacksteel.getItem())) { - return dragonforgeCrafts.get(blacksteel.getItem()); - } - return null; - } - - public static void addSpecialCraft(String special, Item base, Item output) { - specialCrafts.put(getIdentifier(base, special), output); - Salvage.shareSalvage(output, base); - } - - public static Item getSpecialCraft(String special, ItemStack input) { - if (input != null) { - String id = getIdentifier(input.getItem(), special); - if (specialCrafts.containsKey(id)) { - return specialCrafts.get(id); - } - } - return null; - } - - private static String getIdentifier(Item item, String special) { - return "[" + special + "]" + CustomToolHelper.getSimpleReferenceName(item); - } - - public static String getItemDesign(ItemStack item) { - if (item != null && item.getItem() instanceof ISpecialCraftItem) { - return ((ISpecialCraftItem) item.getItem()).getDesign(item); - } - return null; - } + public static HashMap dragonforgeCrafts = new HashMap(); + public static HashMap specialCrafts = new HashMap(); + + public static void addDragonforgeCraft(Block blackSteel, Block dragon) { + addDragonforgeCraft(Item.getItemFromBlock(blackSteel), Item.getItemFromBlock(dragon)); + } + + public static void addDragonforgeCraft(Item base, Item dragon) { + dragonforgeCrafts.put(base, dragon); + Salvage.shareSalvage(dragon, base); + } + + public static Item getDragonCraft(ItemStack blacksteel) { + if (dragonforgeCrafts.containsKey(blacksteel.getItem())) { + return dragonforgeCrafts.get(blacksteel.getItem()); + } + return null; + } + + public static void addSpecialCraft(String special, Item base, Item output) { + specialCrafts.put(getIdentifier(base, special), output); + Salvage.shareSalvage(output, base); + } + + public static Item getSpecialCraft(String special, ItemStack input) { + if (input != null) { + String id = getIdentifier(input.getItem(), special); + if (specialCrafts.containsKey(id)) { + return specialCrafts.get(id); + } + } + return null; + } + + private static String getIdentifier(Item item, String special) { + return "[" + special + "]" + CustomToolHelper.getSimpleReferenceName(item); + } + + public static String getItemDesign(ItemStack item) { + if (item != null && item.getItem() instanceof ISpecialCraftItem) { + return ((ISpecialCraftItem) item.getItem()).getDesign(item); + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/refine/BloomRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/refine/BloomRecipe.java index 074d3474..99a20d72 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/refine/BloomRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/refine/BloomRecipe.java @@ -1,56 +1,55 @@ package minefantasy.mf2.api.crafting.refine; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map.Entry; - import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class BloomRecipe {// FurnaceRecipes - public static HashMap recipeList = new HashMap(); - - public static void addRecipe(ItemStack input, ItemStack output) { - recipeList.put(input, output); - } - - public static void addRecipe(Block input, ItemStack output) { - addRecipe(Item.getItemFromBlock(input), output); - } - - public static void addRecipe(Item input, ItemStack output) { - addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output); - } - - public ItemStack result; - public int time; - public String research; - - public BloomRecipe(ItemStack result, int time, String research) { - this.result = result; - this.time = time; - this.research = research; - } - - public static ItemStack getSmeltingResult(ItemStack item) { - Iterator iterator = recipeList.entrySet().iterator(); - Entry entry; - - do { - if (!iterator.hasNext()) { - return null; - } - - entry = (Entry) iterator.next(); - } while (!doesMatch(item, (ItemStack) entry.getKey())); - - return (ItemStack) entry.getValue(); - } +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map.Entry; - private static boolean doesMatch(ItemStack item1, ItemStack item2) { - return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE - || item2.getItemDamage() == item1.getItemDamage()); - } +public class BloomRecipe {// FurnaceRecipes + public static HashMap recipeList = new HashMap(); + public ItemStack result; + public int time; + public String research; + + public BloomRecipe(ItemStack result, int time, String research) { + this.result = result; + this.time = time; + this.research = research; + } + + public static void addRecipe(ItemStack input, ItemStack output) { + recipeList.put(input, output); + } + + public static void addRecipe(Block input, ItemStack output) { + addRecipe(Item.getItemFromBlock(input), output); + } + + public static void addRecipe(Item input, ItemStack output) { + addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output); + } + + public static ItemStack getSmeltingResult(ItemStack item) { + Iterator iterator = recipeList.entrySet().iterator(); + Entry entry; + + do { + if (!iterator.hasNext()) { + return null; + } + + entry = (Entry) iterator.next(); + } while (!doesMatch(item, (ItemStack) entry.getKey())); + + return (ItemStack) entry.getValue(); + } + + private static boolean doesMatch(ItemStack item1, ItemStack item2) { + return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE + || item2.getItemDamage() == item1.getItemDamage()); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/refine/PaintOilRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/refine/PaintOilRecipe.java index 88b32f62..ae470d8b 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/refine/PaintOilRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/refine/PaintOilRecipe.java @@ -1,54 +1,54 @@ package minefantasy.mf2.api.crafting.refine; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map.Entry; - import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map.Entry; + public class PaintOilRecipe {// FurnaceRecipes - public static HashMap recipeList = new HashMap(); - - /** - * Turn one specific meta block to another - */ - public static void addRecipe(Block input, int inMeta, Block output, int outMeta) { - recipeList.put(new ItemStack(input, 1, inMeta), new ItemStack(output, 1, outMeta)); - } - - /** - * Turn a block to a specific meta - */ - public static void addRecipe(Block input, Block output, int meta) { - addRecipe(input, OreDictionary.WILDCARD_VALUE, output, meta); - } - - /** - * Turn a block to a block without a meta change - */ - public static void addRecipe(Block input, Block output) { - addRecipe(input, OreDictionary.WILDCARD_VALUE, output, OreDictionary.WILDCARD_VALUE); - } - - public static ItemStack getPaintResult(ItemStack item) { - Iterator iterator = recipeList.entrySet().iterator(); - Entry entry; - - do { - if (!iterator.hasNext()) { - return null; - } - - entry = (Entry) iterator.next(); - } while (!doesMatch(item, (ItemStack) entry.getKey())); - - return (ItemStack) entry.getValue(); - } - - private static boolean doesMatch(ItemStack item1, ItemStack item2) { - return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE - || item2.getItemDamage() == item1.getItemDamage()); - } + public static HashMap recipeList = new HashMap(); + + /** + * Turn one specific meta block to another + */ + public static void addRecipe(Block input, int inMeta, Block output, int outMeta) { + recipeList.put(new ItemStack(input, 1, inMeta), new ItemStack(output, 1, outMeta)); + } + + /** + * Turn a block to a specific meta + */ + public static void addRecipe(Block input, Block output, int meta) { + addRecipe(input, OreDictionary.WILDCARD_VALUE, output, meta); + } + + /** + * Turn a block to a block without a meta change + */ + public static void addRecipe(Block input, Block output) { + addRecipe(input, OreDictionary.WILDCARD_VALUE, output, OreDictionary.WILDCARD_VALUE); + } + + public static ItemStack getPaintResult(ItemStack item) { + Iterator iterator = recipeList.entrySet().iterator(); + Entry entry; + + do { + if (!iterator.hasNext()) { + return null; + } + + entry = (Entry) iterator.next(); + } while (!doesMatch(item, (ItemStack) entry.getKey())); + + return (ItemStack) entry.getValue(); + } + + private static boolean doesMatch(ItemStack item1, ItemStack item2) { + return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE + || item2.getItemDamage() == item1.getItemDamage()); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java index 329cba81..fb959956 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java @@ -1,46 +1,45 @@ package minefantasy.mf2.api.crafting.refine; -import java.util.HashMap; - import minefantasy.mf2.api.helpers.CustomToolHelper; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class QuernRecipes { - public static HashMap recipeList = new HashMap(); - - public static QuernRecipes addRecipe(Block input, ItemStack output, int tier) { - return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); - } - - public static QuernRecipes addRecipe(Item input, ItemStack output, int tier) { - return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); - } - - public static QuernRecipes addRecipe(ItemStack input, ItemStack output, int tier) { - QuernRecipes recipe = new QuernRecipes(input, output, tier); - recipeList.put(CustomToolHelper.getReferenceName(input), recipe); - return recipe; - } - - public static QuernRecipes getResult(ItemStack input) { - if (input == null) - return null; - - QuernRecipes specific = recipeList.get(CustomToolHelper.getReferenceName(input)); - if (specific != null) - return specific; - - return recipeList.get(CustomToolHelper.getReferenceName(input, "any")); - } - - public final ItemStack result; - public final int tier; +import java.util.HashMap; - public QuernRecipes(ItemStack input, ItemStack output, int tier) { - this.result = output; - this.tier = tier; - } +public class QuernRecipes { + public static HashMap recipeList = new HashMap(); + public final ItemStack result; + public final int tier; + + public QuernRecipes(ItemStack input, ItemStack output, int tier) { + this.result = output; + this.tier = tier; + } + + public static QuernRecipes addRecipe(Block input, ItemStack output, int tier) { + return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); + } + + public static QuernRecipes addRecipe(Item input, ItemStack output, int tier) { + return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); + } + + public static QuernRecipes addRecipe(ItemStack input, ItemStack output, int tier) { + QuernRecipes recipe = new QuernRecipes(input, output, tier); + recipeList.put(CustomToolHelper.getReferenceName(input), recipe); + return recipe; + } + + public static QuernRecipes getResult(ItemStack input) { + if (input == null) + return null; + + QuernRecipes specific = recipeList.get(CustomToolHelper.getReferenceName(input)); + if (specific != null) + return specific; + + return recipeList.get(CustomToolHelper.getReferenceName(input, "any")); + } } diff --git a/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java index 63cda0b3..82296d81 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java @@ -1,68 +1,67 @@ package minefantasy.mf2.api.crafting.tanning; -import java.util.ArrayList; - import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class TanningRecipe { - public static final ArrayList recipeList = new ArrayList(); +import java.util.ArrayList; - public static void addRecipe(Object input, float time, ItemStack output) { - addRecipe(input, time, -1, output); - } +public class TanningRecipe { + public static final ArrayList recipeList = new ArrayList(); + public int tier; + public float time; + public ItemStack input, output; + public String toolType; - public static void addRecipe(Object input, float time, int tier, ItemStack output) { - addRecipe(input, time, tier, "knife", output); - } + public TanningRecipe(ItemStack input, float time, int tier, String toolType, ItemStack output) { + this.time = time; + this.tier = tier; + this.input = input; + this.output = output; + this.toolType = toolType; + } - public static void addRecipe(Object input, float time, int tier, String toolType, ItemStack output) { - recipeList.add(new TanningRecipe(convertItem(input), time, tier, toolType, output)); - } + public static void addRecipe(Object input, float time, ItemStack output) { + addRecipe(input, time, -1, output); + } - public static ItemStack convertItem(Object input) { - if (input instanceof ItemStack) { - return (ItemStack) input; - } - if (input instanceof Item) { - return new ItemStack((Item) input, 1, OreDictionary.WILDCARD_VALUE); - } - if (input instanceof Block) { - return new ItemStack((Block) input, 1, OreDictionary.WILDCARD_VALUE); - } - MFLogUtil.logWarn("Tanning Recipe found invalid item!"); - return null; - } + public static void addRecipe(Object input, float time, int tier, ItemStack output) { + addRecipe(input, time, tier, "knife", output); + } - public static TanningRecipe getRecipe(ItemStack item) { - if (item == null) - return null; + public static void addRecipe(Object input, float time, int tier, String toolType, ItemStack output) { + recipeList.add(new TanningRecipe(convertItem(input), time, tier, toolType, output)); + } - for (int a = 0; a < recipeList.size(); a++) { - TanningRecipe recipe = recipeList.get(a); - if (recipe.input.getItem() == item.getItem()) { - if (recipe.input.getItemDamage() == OreDictionary.WILDCARD_VALUE - || recipe.input.getItemDamage() == item.getItemDamage()) { - return recipe; - } - } - } - return null; - } + public static ItemStack convertItem(Object input) { + if (input instanceof ItemStack) { + return (ItemStack) input; + } + if (input instanceof Item) { + return new ItemStack((Item) input, 1, OreDictionary.WILDCARD_VALUE); + } + if (input instanceof Block) { + return new ItemStack((Block) input, 1, OreDictionary.WILDCARD_VALUE); + } + MFLogUtil.logWarn("Tanning Recipe found invalid item!"); + return null; + } - public int tier; - public float time; - public ItemStack input, output; - public String toolType; + public static TanningRecipe getRecipe(ItemStack item) { + if (item == null) + return null; - public TanningRecipe(ItemStack input, float time, int tier, String toolType, ItemStack output) { - this.time = time; - this.tier = tier; - this.input = input; - this.output = output; - this.toolType = toolType; - } + for (int a = 0; a < recipeList.size(); a++) { + TanningRecipe recipe = recipeList.get(a); + if (recipe.input.getItem() == item.getItem()) { + if (recipe.input.getItemDamage() == OreDictionary.WILDCARD_VALUE + || recipe.input.getItemDamage() == item.getItemDamage()) { + return recipe; + } + } + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/api/farming/CustomHoeEntry.java b/src/main/java/minefantasy/mf2/api/farming/CustomHoeEntry.java index deddd364..9cef9ffe 100644 --- a/src/main/java/minefantasy/mf2/api/farming/CustomHoeEntry.java +++ b/src/main/java/minefantasy/mf2/api/farming/CustomHoeEntry.java @@ -1,80 +1,73 @@ package minefantasy.mf2.api.farming; -import java.util.HashMap; - import minefantasy.mf2.api.MineFantasyAPI; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class CustomHoeEntry { - /** - * Registeres a piece (called by code or config) - * - * @param piece - * the item to list - * @param weight - * the weight of the piece (Kg) - * @param bulk - * the bulk of the piece - * @param alterSpeed - * if the armour's weight slows you down - */ - public static void registerItem(Item piece, float efficiency) { - int id = Item.getIdFromItem(piece); +import java.util.HashMap; - MineFantasyAPI.debugMsg("Added Custom hoe: " + piece.getUnlocalizedName() + " Efficiency = " + efficiency); - entries.put(id, new CustomHoeEntry(id, efficiency)); - } +public class CustomHoeEntry { + public static HashMap entries = new HashMap(); + public int itemID; + /** + * The Efficiency(same variable as dig speed) + */ + public float efficiency; - /** - * Gets the variables for the item if there are any: order is weight, bulk - */ - public static float getEntryEfficiency(ItemStack piece, float Default) { - CustomHoeEntry entry = getEntry(piece); - if (entry != null) { - return entry.efficiency; - } - return Default; - } + private CustomHoeEntry(int id, float efficiency) { + this.itemID = id; + this.efficiency = efficiency; + } - /** - * Gets the entry for an item - * - * @param piece - * the armour item - * @return the entry(if there is one), else null - */ - public static CustomHoeEntry getEntry(ItemStack piece) { - return getEntry(piece.getItem()); - } + /** + * Registeres a piece (called by code or config) + * + * @param piece the item to list + * @param weight the weight of the piece (Kg) + * @param bulk the bulk of the piece + * @param alterSpeed if the armour's weight slows you down + */ + public static void registerItem(Item piece, float efficiency) { + int id = Item.getIdFromItem(piece); - /** - * Gets the entry for an item - * - * @param piece - * the armour item - * @return the entry(if there is one), else null - */ - public static CustomHoeEntry getEntry(Item piece) { - if (piece != null) { - int id = Item.getIdFromItem(piece); - if (entries.containsKey(id)) { - return entries.get(id); - } - } - return null; - } + MineFantasyAPI.debugMsg("Added Custom hoe: " + piece.getUnlocalizedName() + " Efficiency = " + efficiency); + entries.put(id, new CustomHoeEntry(id, efficiency)); + } - public int itemID; - /** - * The Efficiency(same variable as dig speed) - */ - public float efficiency; + /** + * Gets the variables for the item if there are any: order is weight, bulk + */ + public static float getEntryEfficiency(ItemStack piece, float Default) { + CustomHoeEntry entry = getEntry(piece); + if (entry != null) { + return entry.efficiency; + } + return Default; + } - public static HashMap entries = new HashMap(); + /** + * Gets the entry for an item + * + * @param piece the armour item + * @return the entry(if there is one), else null + */ + public static CustomHoeEntry getEntry(ItemStack piece) { + return getEntry(piece.getItem()); + } - private CustomHoeEntry(int id, float efficiency) { - this.itemID = id; - this.efficiency = efficiency; - } + /** + * Gets the entry for an item + * + * @param piece the armour item + * @return the entry(if there is one), else null + */ + public static CustomHoeEntry getEntry(Item piece) { + if (piece != null) { + int id = Item.getIdFromItem(piece); + if (entries.containsKey(id)) { + return entries.get(id); + } + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/api/heating/ForgeFuel.java b/src/main/java/minefantasy/mf2/api/heating/ForgeFuel.java index a066fa9d..44a787ab 100644 --- a/src/main/java/minefantasy/mf2/api/heating/ForgeFuel.java +++ b/src/main/java/minefantasy/mf2/api/heating/ForgeFuel.java @@ -3,27 +3,27 @@ import net.minecraft.item.ItemStack; public class ForgeFuel { - public ItemStack fuel; - public float duration; - public int baseHeat; - /** - * Some sources only accept refined fuel - */ - public boolean isRefined; - /** - * Applied to lava, auto-lights the forge when placed - */ - public boolean doesLight; + public ItemStack fuel; + public float duration; + public int baseHeat; + /** + * Some sources only accept refined fuel + */ + public boolean isRefined; + /** + * Applied to lava, auto-lights the forge when placed + */ + public boolean doesLight; - public ForgeFuel(ItemStack item, float dura, int heat, boolean light) { - this(item, dura, heat, light, false); - } + public ForgeFuel(ItemStack item, float dura, int heat, boolean light) { + this(item, dura, heat, light, false); + } - public ForgeFuel(ItemStack item, float dura, int heat, boolean light, boolean refined) { - this.fuel = item; - this.duration = dura; - this.baseHeat = heat; - this.doesLight = light; - this.isRefined = refined; - } + public ForgeFuel(ItemStack item, float dura, int heat, boolean light, boolean refined) { + this.fuel = item; + this.duration = dura; + this.baseHeat = heat; + this.doesLight = light; + this.isRefined = refined; + } } diff --git a/src/main/java/minefantasy/mf2/api/heating/ForgeItemHandler.java b/src/main/java/minefantasy/mf2/api/heating/ForgeItemHandler.java index 249a4a01..e6b5e705 100644 --- a/src/main/java/minefantasy/mf2/api/heating/ForgeItemHandler.java +++ b/src/main/java/minefantasy/mf2/api/heating/ForgeItemHandler.java @@ -1,150 +1,146 @@ package minefantasy.mf2.api.heating; -import java.util.ArrayList; -import java.util.List; - import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.List; + public class ForgeItemHandler { - public static List forgeFuel = new ArrayList(); - public static int forgeMaxTemp = 0; - - public static void addFuel(ItemStack item, int fuel, int heat, boolean willLight) { - forgeFuel.add(new ForgeFuel(item, fuel, heat, willLight)); - } - - public static ForgeFuel getStats(ItemStack item) { - if (item == null) - return null; - - for (ForgeFuel fuel : forgeFuel) { - if (fuel != null) { - if (fuel.fuel.getItem() == item.getItem()) { - if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE - || fuel.fuel.getItemDamage() == item.getItemDamage()) { - return fuel; - } - } - } - } - return null; - } - - /** - * Gets the amount of smelts for an item - * - * @param item - * The item in the fuel slot - * @return The amount of smelts it has(will not consume if its 0) - */ - public static float getForgeFuel(ItemStack item) { - if (item == null) - return 0; - - for (ForgeFuel fuel : forgeFuel) { - if (fuel != null) { - if (fuel.fuel.getItem() == item.getItem()) { - if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE - || fuel.fuel.getItemDamage() == item.getItemDamage()) { - return fuel.duration; - } - } - } - } - return 0; - } - - public static boolean willLight(ItemStack item) { - if (item == null) { - return false; - } - - for (ForgeFuel fuel : forgeFuel) { - if (fuel != null) { - if (fuel.fuel.getItem() == item.getItem()) { - if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE - || fuel.fuel.getItemDamage() == item.getItemDamage()) { - return fuel.doesLight; - } - } - } - } - return false; - } - - /** - * Gets the amount of smelts for an item - * - * @param item - * The item id in the fuel slot - * @return The amount of smelts it has(will not consume if its 0) - */ - public static float getForgeFuelWithoutSubid(Item id) { - for (ForgeFuel fuel : forgeFuel) { - if (fuel != null) { - if (fuel.fuel.getItem() == id) { - return fuel.baseHeat; - } - } - } - return 0; - } - - /** - * Gets the base temperature for an item - * - * @param item - * The item in the fuel slot - * @return The amount of smelts it has(will not consume if its 0) - */ - public static int getForgeHeat(ItemStack item) { - if (item == null) - return 0; - - for (ForgeFuel fuel : forgeFuel) { - if (fuel != null) { - if (fuel.fuel.getItem() == item.getItem()) { - if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE - || fuel.fuel.getItemDamage() == item.getItemDamage()) { - return fuel.baseHeat; - } - } - } - } - return 0; - } - - /** - * Gets the base temperature for an item - * - * @param item - * The item id in the fuel slot - * @return The amount of smelts it has(will not consume if its 0) - */ - public static int getForgeHeat(Item item) { - for (ForgeFuel fuel : forgeFuel) { - if (fuel != null && fuel.fuel.getItem() == item) { - return fuel.baseHeat; - } - } - return 0; - } - - private static boolean matches(ItemStack item, ItemStack compare) { - if (item == null || compare == null) { - return false; - } - - if (item.getItem() != compare.getItem()) { - return false; - } - - if (item.getItemDamage() != compare.getItemDamage() && compare.getItemDamage() != OreDictionary.WILDCARD_VALUE - && item.getItemDamage() != OreDictionary.WILDCARD_VALUE) { - return false; - } - return true; - } + public static List forgeFuel = new ArrayList(); + public static int forgeMaxTemp = 0; + + public static void addFuel(ItemStack item, int fuel, int heat, boolean willLight) { + forgeFuel.add(new ForgeFuel(item, fuel, heat, willLight)); + } + + public static ForgeFuel getStats(ItemStack item) { + if (item == null) + return null; + + for (ForgeFuel fuel : forgeFuel) { + if (fuel != null) { + if (fuel.fuel.getItem() == item.getItem()) { + if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE + || fuel.fuel.getItemDamage() == item.getItemDamage()) { + return fuel; + } + } + } + } + return null; + } + + /** + * Gets the amount of smelts for an item + * + * @param item The item in the fuel slot + * @return The amount of smelts it has(will not consume if its 0) + */ + public static float getForgeFuel(ItemStack item) { + if (item == null) + return 0; + + for (ForgeFuel fuel : forgeFuel) { + if (fuel != null) { + if (fuel.fuel.getItem() == item.getItem()) { + if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE + || fuel.fuel.getItemDamage() == item.getItemDamage()) { + return fuel.duration; + } + } + } + } + return 0; + } + + public static boolean willLight(ItemStack item) { + if (item == null) { + return false; + } + + for (ForgeFuel fuel : forgeFuel) { + if (fuel != null) { + if (fuel.fuel.getItem() == item.getItem()) { + if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE + || fuel.fuel.getItemDamage() == item.getItemDamage()) { + return fuel.doesLight; + } + } + } + } + return false; + } + + /** + * Gets the amount of smelts for an item + * + * @param item The item id in the fuel slot + * @return The amount of smelts it has(will not consume if its 0) + */ + public static float getForgeFuelWithoutSubid(Item id) { + for (ForgeFuel fuel : forgeFuel) { + if (fuel != null) { + if (fuel.fuel.getItem() == id) { + return fuel.baseHeat; + } + } + } + return 0; + } + + /** + * Gets the base temperature for an item + * + * @param item The item in the fuel slot + * @return The amount of smelts it has(will not consume if its 0) + */ + public static int getForgeHeat(ItemStack item) { + if (item == null) + return 0; + + for (ForgeFuel fuel : forgeFuel) { + if (fuel != null) { + if (fuel.fuel.getItem() == item.getItem()) { + if (fuel.fuel.getItemDamage() == OreDictionary.WILDCARD_VALUE + || fuel.fuel.getItemDamage() == item.getItemDamage()) { + return fuel.baseHeat; + } + } + } + } + return 0; + } + + /** + * Gets the base temperature for an item + * + * @param item The item id in the fuel slot + * @return The amount of smelts it has(will not consume if its 0) + */ + public static int getForgeHeat(Item item) { + for (ForgeFuel fuel : forgeFuel) { + if (fuel != null && fuel.fuel.getItem() == item) { + return fuel.baseHeat; + } + } + return 0; + } + + private static boolean matches(ItemStack item, ItemStack compare) { + if (item == null || compare == null) { + return false; + } + + if (item.getItem() != compare.getItem()) { + return false; + } + + if (item.getItemDamage() != compare.getItemDamage() && compare.getItemDamage() != OreDictionary.WILDCARD_VALUE + && item.getItemDamage() != OreDictionary.WILDCARD_VALUE) { + return false; + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/api/heating/Heatable.java b/src/main/java/minefantasy/mf2/api/heating/Heatable.java index 07aad33f..175d05fa 100644 --- a/src/main/java/minefantasy/mf2/api/heating/Heatable.java +++ b/src/main/java/minefantasy/mf2/api/heating/Heatable.java @@ -1,226 +1,218 @@ package minefantasy.mf2.api.heating; -import java.util.HashMap; - import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.oredict.OreDictionary; +import java.util.HashMap; + public class Heatable { - public static final int forgeMaximumMetalHeat = 5000; - public static boolean requiresHeating = true; - public static HashMap registerList = new HashMap(); - /** - * The min heat the ingot must be to forge with mesured in celcius - */ - private final int minTemperature; - - /** - * The heat when it becomes unstable mesured in celcius - */ - private final int unstableTemperature; - - /** - * The max heat until the ingot is destroyed mesured in celcius - */ - private final int maxTemperature; - - /** - * The item that's used - */ - protected ItemStack object; - - public Heatable(ItemStack item, int min, int unstable, int max) { - this.object = item; - this.minTemperature = min; - this.unstableTemperature = unstable; - this.maxTemperature = max; - } - - public static void addItem(ItemStack item, int min, int unstable, int max) { - registerList.put(getRegistrationForItem(item), new Heatable(item, min, unstable, max)); - } - - public static boolean canHeatItem(ItemStack item) { - return loadStats(item) != null; - } - - public static Heatable loadStats(ItemStack item) { - if (item == null) - return null; - - if (registerList.isEmpty()) - return null; - - Heatable stats = findRegister(item); - if (stats != null) { - if (stats.object.getItemDamage() == OreDictionary.WILDCARD_VALUE) { - if (stats.object.getItem() == item.getItem()) { - return stats; - } - } else if (stats.object.isItemEqual(item)) { - return stats; - } - } - - return null; - } - - public static final String NBT_Item = "MFHeatable_ItemSave"; - // public static final String NBT_ItemID = "MFHeatable_ItemID"; - // public static final String NBT_SubID = "MFHeatable_SubID"; - public static final String NBT_ShouldDisplay = "MFHeatable_DisplayTemperature"; - - public static final String NBT_CurrentTemp = "MFHeatable_Temperature"; - public static final String NBT_WorkableTemp = "MFHeatable_WorkTemp"; - public static final String NBT_UnstableTemp = "MFHeatable_UnstableTemp"; - - /** - * 0 = nothing, 1 = soft, 2 = unstable - */ - public static byte getHeatableStage(ItemStack item) { - if (item == null || !(item.getItem() instanceof IHotItem)) { - return 0; - } - if (item != null && item.hasTagCompound()) { - int temp = getTemp(item); - int work = item.getTagCompound().getInteger(NBT_WorkableTemp); - int unstable = item.getTagCompound().getInteger(NBT_UnstableTemp); - if (temp > unstable) - return (byte) 2; - if (temp > work) - return (byte) 1; - } - return (byte) 0; - } - - public static int getWorkTemp(ItemStack item) { - if (item == null || !(item.getItem() instanceof IHotItem)) { - return 0; - } - NBTTagCompound tag = getNBT(item); - - if (tag.hasKey(NBT_WorkableTemp)) - return tag.getInteger(NBT_WorkableTemp); - - return 0; - } - - public static int getUnstableTemp(ItemStack item) { - if (item == null || !(item.getItem() instanceof IHotItem)) { - return 0; - } - NBTTagCompound tag = getNBT(item); - - if (tag.hasKey(NBT_UnstableTemp)) - return tag.getInteger(NBT_UnstableTemp); - - return 0; - } - - public static int getTemp(ItemStack item) { - if (item == null || !(item.getItem() instanceof IHotItem)) { - return 0; - } - NBTTagCompound tag = getNBT(item); - - if (tag.hasKey(NBT_CurrentTemp)) - return tag.getInteger(NBT_CurrentTemp); - - return 0; - } - - /** - * Hardcore Crafting: Should quencing in inproper sources damage items - */ - public static boolean HCCquenchRuin = true; - - /** - * Gets a hot item - * - * @param item - * the hot item - * @param hazard - * the amount the source is hazardous (damaging the item): usually a - * percent dura loss - * @return what item is heated - */ - public static ItemStack getQuenchedItem(ItemStack item, float hazard) { - ItemStack cold = Heatable.getItem(item); - - if (HCCquenchRuin && cold.isItemStackDamageable() && hazard > 0) { - cold.setItemDamage((int) (cold.getMaxDamage() * hazard / 100F)); - } - - return cold; - } - - public static ItemStack getItem(ItemStack item) { - if (item == null || !(item.getItem() instanceof IHotItem)) { - return null; - } - NBTTagCompound tag = getNBT(item); - - if (tag.hasKey(NBT_Item)) { - return ItemStack.loadItemStackFromNBT(tag.getCompoundTag(NBT_Item)); - } - - return null; - } - - private static NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) - item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - public static boolean isWorkable(ItemStack inputItem) { - if (inputItem == null || !(inputItem.getItem() instanceof IHotItem)) { - return true; - } - if (inputItem != null && inputItem.getItem() instanceof IHotItem) { - return getHeatableStage(inputItem) == 1; - } - return true; - } - - private static Heatable findRegister(ItemStack item) { - Heatable specific = registerList.get(item.getItem().getUnlocalizedName() + "_" + item.getItemDamage());// Try - // Specific - // first - if (specific != null) { - return specific; - } - return registerList.get(item.getUnlocalizedName() + "_any");// Try Any; - } - - public static String getRegistrationForItem(ItemStack item) { - String s; - if (item.getItemDamage() == OreDictionary.WILDCARD_VALUE) { - s = item.getItem().getUnlocalizedName() + "_any"; - } else { - s = item.getItem().getUnlocalizedName() + "_" + item.getItemDamage(); - } - return s; - } - - public int getWorkableStat(ItemStack item) { - if (this.minTemperature == -1) { - CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if (material != null) - return material.getHeatableStats()[0]; - } - return this.minTemperature; - } - - public int getUnstableStat(ItemStack item) { - if (this.unstableTemperature == -1) { - CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if (material != null) - return material.getHeatableStats()[1]; - } - return this.unstableTemperature; - } + public static final int forgeMaximumMetalHeat = 5000; + public static final String NBT_Item = "MFHeatable_ItemSave"; + // public static final String NBT_ItemID = "MFHeatable_ItemID"; + // public static final String NBT_SubID = "MFHeatable_SubID"; + public static final String NBT_ShouldDisplay = "MFHeatable_DisplayTemperature"; + public static final String NBT_CurrentTemp = "MFHeatable_Temperature"; + public static final String NBT_WorkableTemp = "MFHeatable_WorkTemp"; + public static final String NBT_UnstableTemp = "MFHeatable_UnstableTemp"; + public static boolean requiresHeating = true; + public static HashMap registerList = new HashMap(); + /** + * Hardcore Crafting: Should quencing in inproper sources damage items + */ + public static boolean HCCquenchRuin = true; + /** + * The min heat the ingot must be to forge with mesured in celcius + */ + private final int minTemperature; + /** + * The heat when it becomes unstable mesured in celcius + */ + private final int unstableTemperature; + /** + * The max heat until the ingot is destroyed mesured in celcius + */ + private final int maxTemperature; + /** + * The item that's used + */ + protected ItemStack object; + + public Heatable(ItemStack item, int min, int unstable, int max) { + this.object = item; + this.minTemperature = min; + this.unstableTemperature = unstable; + this.maxTemperature = max; + } + + public static void addItem(ItemStack item, int min, int unstable, int max) { + registerList.put(getRegistrationForItem(item), new Heatable(item, min, unstable, max)); + } + + public static boolean canHeatItem(ItemStack item) { + return loadStats(item) != null; + } + + public static Heatable loadStats(ItemStack item) { + if (item == null) + return null; + + if (registerList.isEmpty()) + return null; + + Heatable stats = findRegister(item); + if (stats != null) { + if (stats.object.getItemDamage() == OreDictionary.WILDCARD_VALUE) { + if (stats.object.getItem() == item.getItem()) { + return stats; + } + } else if (stats.object.isItemEqual(item)) { + return stats; + } + } + + return null; + } + + /** + * 0 = nothing, 1 = soft, 2 = unstable + */ + public static byte getHeatableStage(ItemStack item) { + if (item == null || !(item.getItem() instanceof IHotItem)) { + return 0; + } + if (item != null && item.hasTagCompound()) { + int temp = getTemp(item); + int work = item.getTagCompound().getInteger(NBT_WorkableTemp); + int unstable = item.getTagCompound().getInteger(NBT_UnstableTemp); + if (temp > unstable) + return (byte) 2; + if (temp > work) + return (byte) 1; + } + return (byte) 0; + } + + public static int getWorkTemp(ItemStack item) { + if (item == null || !(item.getItem() instanceof IHotItem)) { + return 0; + } + NBTTagCompound tag = getNBT(item); + + if (tag.hasKey(NBT_WorkableTemp)) + return tag.getInteger(NBT_WorkableTemp); + + return 0; + } + + public static int getUnstableTemp(ItemStack item) { + if (item == null || !(item.getItem() instanceof IHotItem)) { + return 0; + } + NBTTagCompound tag = getNBT(item); + + if (tag.hasKey(NBT_UnstableTemp)) + return tag.getInteger(NBT_UnstableTemp); + + return 0; + } + + public static int getTemp(ItemStack item) { + if (item == null || !(item.getItem() instanceof IHotItem)) { + return 0; + } + NBTTagCompound tag = getNBT(item); + + if (tag.hasKey(NBT_CurrentTemp)) + return tag.getInteger(NBT_CurrentTemp); + + return 0; + } + + /** + * Gets a hot item + * + * @param item the hot item + * @param hazard the amount the source is hazardous (damaging the item): usually a + * percent dura loss + * @return what item is heated + */ + public static ItemStack getQuenchedItem(ItemStack item, float hazard) { + ItemStack cold = Heatable.getItem(item); + + if (HCCquenchRuin && cold.isItemStackDamageable() && hazard > 0) { + cold.setItemDamage((int) (cold.getMaxDamage() * hazard / 100F)); + } + + return cold; + } + + public static ItemStack getItem(ItemStack item) { + if (item == null || !(item.getItem() instanceof IHotItem)) { + return null; + } + NBTTagCompound tag = getNBT(item); + + if (tag.hasKey(NBT_Item)) { + return ItemStack.loadItemStackFromNBT(tag.getCompoundTag(NBT_Item)); + } + + return null; + } + + private static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + public static boolean isWorkable(ItemStack inputItem) { + if (inputItem == null || !(inputItem.getItem() instanceof IHotItem)) { + return true; + } + if (inputItem != null && inputItem.getItem() instanceof IHotItem) { + return getHeatableStage(inputItem) == 1; + } + return true; + } + + private static Heatable findRegister(ItemStack item) { + Heatable specific = registerList.get(item.getItem().getUnlocalizedName() + "_" + item.getItemDamage());// Try + // Specific + // first + if (specific != null) { + return specific; + } + return registerList.get(item.getUnlocalizedName() + "_any");// Try Any; + } + + public static String getRegistrationForItem(ItemStack item) { + String s; + if (item.getItemDamage() == OreDictionary.WILDCARD_VALUE) { + s = item.getItem().getUnlocalizedName() + "_any"; + } else { + s = item.getItem().getUnlocalizedName() + "_" + item.getItemDamage(); + } + return s; + } + + public int getWorkableStat(ItemStack item) { + if (this.minTemperature == -1) { + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); + if (material != null) + return material.getHeatableStats()[0]; + } + return this.minTemperature; + } + + public int getUnstableStat(ItemStack item) { + if (this.unstableTemperature == -1) { + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); + if (material != null) + return material.getHeatableStats()[1]; + } + return this.unstableTemperature; + } } diff --git a/src/main/java/minefantasy/mf2/api/heating/IHotItem.java b/src/main/java/minefantasy/mf2/api/heating/IHotItem.java index 6315c492..59622ba7 100644 --- a/src/main/java/minefantasy/mf2/api/heating/IHotItem.java +++ b/src/main/java/minefantasy/mf2/api/heating/IHotItem.java @@ -3,13 +3,13 @@ import net.minecraft.item.ItemStack; public interface IHotItem { - /** - * Determines if an item is hot(requiring tongs to pick up) - */ - boolean isHot(ItemStack item); + /** + * Determines if an item is hot(requiring tongs to pick up) + */ + boolean isHot(ItemStack item); - /** - * Determines if an item can be cooled - */ - boolean isCoolable(ItemStack item); + /** + * Determines if an item can be cooled + */ + boolean isCoolable(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/heating/IQuenchBlock.java b/src/main/java/minefantasy/mf2/api/heating/IQuenchBlock.java index 4f91c238..6026e0e8 100644 --- a/src/main/java/minefantasy/mf2/api/heating/IQuenchBlock.java +++ b/src/main/java/minefantasy/mf2/api/heating/IQuenchBlock.java @@ -1,10 +1,10 @@ package minefantasy.mf2.api.heating; public interface IQuenchBlock { - /** - * Quench an item - * - * @return 0 means success, 1-100 means item is damaged, <0 means fail. - */ - public float quench(); + /** + * Quench an item + * + * @return 0 means success, 1-100 means item is damaged, <0 means fail. + */ + public float quench(); } diff --git a/src/main/java/minefantasy/mf2/api/heating/TongsHelper.java b/src/main/java/minefantasy/mf2/api/heating/TongsHelper.java index dd6930d8..6b5b4842 100644 --- a/src/main/java/minefantasy/mf2/api/heating/TongsHelper.java +++ b/src/main/java/minefantasy/mf2/api/heating/TongsHelper.java @@ -10,135 +10,134 @@ import net.minecraft.world.World; public class TongsHelper { - /** - * Determines if an item is held - */ - public static boolean hasHeldItem(ItemStack tongs) { - NBTTagCompound nbt = getNBT(tongs); + /** + * Determines if an item is held + */ + public static boolean hasHeldItem(ItemStack tongs) { + NBTTagCompound nbt = getNBT(tongs); - return nbt.hasKey("Held") && nbt.getBoolean("Held"); - } + return nbt.hasKey("Held") && nbt.getBoolean("Held"); + } - /** - * Empties the item - * - * @return - */ - public static ItemStack clearHeldItem(ItemStack tongs, EntityLivingBase user) { - if (!user.worldObj.isRemote) { - NBTTagCompound nbt = getNBT(tongs); - nbt.setBoolean("Held", false); - } - tongs.damageItem(1, user); + /** + * Empties the item + * + * @return + */ + public static ItemStack clearHeldItem(ItemStack tongs, EntityLivingBase user) { + if (!user.worldObj.isRemote) { + NBTTagCompound nbt = getNBT(tongs); + nbt.setBoolean("Held", false); + } + tongs.damageItem(1, user); - return tongs; - } + return tongs; + } - /** - * Picks up an item - */ - public static boolean trySetHeldItem(ItemStack tongs, ItemStack item) { - if (item == null || item.getItem() == null || !isHotItem(item) || item.getItem() instanceof ItemBlock) { - return false; - } - NBTTagCompound nbt = getNBT(tongs); - nbt.setBoolean("Held", true); - NBTTagCompound save = new NBTTagCompound(); - item.writeToNBT(save); - nbt.setTag("Saved", save); + /** + * Picks up an item + */ + public static boolean trySetHeldItem(ItemStack tongs, ItemStack item) { + if (item == null || item.getItem() == null || !isHotItem(item) || item.getItem() instanceof ItemBlock) { + return false; + } + NBTTagCompound nbt = getNBT(tongs); + nbt.setBoolean("Held", true); + NBTTagCompound save = new NBTTagCompound(); + item.writeToNBT(save); + nbt.setTag("Saved", save); - return true; - } + return true; + } - /** - * Used to determine if an item burns you when held, and if tongs can pick it up - */ - public static boolean isHotItem(ItemStack item) { - if (item.getItem() instanceof IHotItem) { - return ((IHotItem) item.getItem()).isHot(item); - } - return false; - } + /** + * Used to determine if an item burns you when held, and if tongs can pick it up + */ + public static boolean isHotItem(ItemStack item) { + if (item.getItem() instanceof IHotItem) { + return ((IHotItem) item.getItem()).isHot(item); + } + return false; + } - /** - * Determines if it can be cooled in a water source - */ - public static boolean isCoolableItem(ItemStack item) { - if (item.getItem() instanceof IHotItem) { - return ((IHotItem) item.getItem()).isCoolable(item); - } - return false; - } + /** + * Determines if it can be cooled in a water source + */ + public static boolean isCoolableItem(ItemStack item) { + if (item.getItem() instanceof IHotItem) { + return ((IHotItem) item.getItem()).isCoolable(item); + } + return false; + } - /** - * Gets the item picked up - */ - public static ItemStack getHeldItem(ItemStack tongs) { - NBTTagCompound nbt = getNBT(tongs); - if (nbt.hasKey("Held")) { - if (nbt.getBoolean("Held")) { - if (nbt.hasKey("Saved")) { - NBTTagCompound save = nbt.getCompoundTag("Saved"); - return ItemStack.loadItemStackFromNBT(save); - } - } - } - return null; - } + /** + * Gets the item picked up + */ + public static ItemStack getHeldItem(ItemStack tongs) { + NBTTagCompound nbt = getNBT(tongs); + if (nbt.hasKey("Held")) { + if (nbt.getBoolean("Held")) { + if (nbt.hasKey("Saved")) { + NBTTagCompound save = nbt.getCompoundTag("Saved"); + return ItemStack.loadItemStackFromNBT(save); + } + } + } + return null; + } - /** - * Gets the item held from tongs - * - * @param tongs - * the itemstack used - */ - public static ItemStack getHeldItemTongs(ItemStack tongs) { - NBTTagCompound nbt = getNBT(tongs); - if (nbt.hasKey("Held")) { - if (nbt.getBoolean("Held")) { - if (nbt.hasKey("Saved")) { - NBTTagCompound save = nbt.getCompoundTag("Saved"); - return ItemStack.loadItemStackFromNBT(save); - } - } - } - return null; - } + /** + * Gets the item held from tongs + * + * @param tongs the itemstack used + */ + public static ItemStack getHeldItemTongs(ItemStack tongs) { + NBTTagCompound nbt = getNBT(tongs); + if (nbt.hasKey("Held")) { + if (nbt.getBoolean("Held")) { + if (nbt.hasKey("Saved")) { + NBTTagCompound save = nbt.getCompoundTag("Saved"); + return ItemStack.loadItemStackFromNBT(save); + } + } + } + return null; + } - /** - * Used for getting the NBT for itemstacks, if none exists; it creates one - */ - public static NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - return item.getTagCompound(); - } + /** + * Used for getting the NBT for itemstacks, if none exists; it creates one + */ + public static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + return item.getTagCompound(); + } - public static float getWaterSource(World world, int i, int j, int k) { - float special = TongsHelper.getQuenced(world, i, j, k); - if (special >= 0) { - return special; - } - if (world.getBlock(i, j, k).getMaterial() == Material.water) { - world.setBlockToAir(i, j, k); - return 25F; - } - if (isCauldron(world, i, j, k)) { - return 10F; - } - return -1F; - } + public static float getWaterSource(World world, int i, int j, int k) { + float special = TongsHelper.getQuenced(world, i, j, k); + if (special >= 0) { + return special; + } + if (world.getBlock(i, j, k).getMaterial() == Material.water) { + world.setBlockToAir(i, j, k); + return 25F; + } + if (isCauldron(world, i, j, k)) { + return 10F; + } + return -1F; + } - public static boolean isCauldron(World world, int x, int y, int z) { - return world.getBlock(x, y, z) == Blocks.cauldron && world.getBlockMetadata(x, y, z) > 0; - } + public static boolean isCauldron(World world, int x, int y, int z) { + return world.getBlock(x, y, z) == Blocks.cauldron && world.getBlockMetadata(x, y, z) > 0; + } - public static float getQuenced(World world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof IQuenchBlock) { - return ((IQuenchBlock) tile).quench(); - } - return -1F; - } + public static float getQuenced(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof IQuenchBlock) { + return ((IQuenchBlock) tile).quench(); + } + return -1F; + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/ArmourCalculator.java b/src/main/java/minefantasy/mf2/api/helpers/ArmourCalculator.java index ea59012f..d6753a55 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/ArmourCalculator.java +++ b/src/main/java/minefantasy/mf2/api/helpers/ArmourCalculator.java @@ -2,13 +2,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.armour.ArmourDesign; -import minefantasy.mf2.api.armour.CustomArmourEntry; -import minefantasy.mf2.api.armour.CustomDamageRatioEntry; -import minefantasy.mf2.api.armour.IArmourMF; -import minefantasy.mf2.api.armour.IArmourPenetrationMob; -import minefantasy.mf2.api.armour.IArmouredEntity; -import minefantasy.mf2.api.armour.ISpecialArmourMF; +import minefantasy.mf2.api.armour.*; import minefantasy.mf2.api.weapon.IDamageType; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; @@ -16,578 +10,561 @@ import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.entity.monster.EntitySpider; import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; +import net.minecraft.item.*; import net.minecraft.item.ItemArmor.ArmorMaterial; -import net.minecraft.item.ItemAxe; -import net.minecraft.item.ItemHoe; -import net.minecraft.item.ItemPickaxe; -import net.minecraft.item.ItemSpade; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; import net.minecraft.util.DamageSource; /** * This class is used to calculate armour values like classes and weight */ public class ArmourCalculator { - public static boolean advancedDamageTypes = true; - /** - * This is the scale for helmet, chest, legs and boots. Use this with 'slot' to - * scale things like weight and DT distribution - */ - public static final float[] sizes = new float[] { 0.2F, 0.3F, 0.3F, 0.2F }; - - /** - * For the percentage based armour, how much is ratio 2(50%) viewed as - */ - public static final float armourRatingScale = 100; - /** - * What affects stamina regen, and what affects stamina cost - */ - public static final float[] encumberanceArray = new float[] { 10F, 40F }; - /** - * When your movement starts and peaks at slowing down - */ - public static final float slowAmount = 10F; - public static final float[] moveSpeedThreshold = new float[] { 30F, 40F }; - - /** - * Gets the default using the items ArmourClass - */ - private static float getDefaultSuitWeight(ItemStack armour) { - return CustomArmourEntry.getEntryVars(armour)[0]; - } - - private static float getDefaultBulk(ItemStack armour) { - return CustomArmourEntry.getEntryVars(armour)[1]; - } - - public static ArmourDesign getDefaultAD(ItemStack armour) { - return ArmourDesign.SOLID; - } - - public static float slowRate = 1.0F; - - /** - * Converts a hit:damage ratio into vanilla AR(rounding off as it is an int) - */ - public static int translateToVanillaAR(float ratio) { - return (int) Math.min(24, 25F * convertToPercent(ratio)); - } - - /** - * Converting a single piece to vanilla AR (rounding off as it is an int) Then - * it divides on the slot. Used for armour bar - */ - public static int translateToVanillaAR(float ratio, int piece, int max) { - float scale = (float) piece / (float) max; - - return (int) Math.min(24, 25F * convertToPercent(ratio) * scale); - } - - /** - * Converts a hit:damage ratio into a decimal percentage - */ - public static float convertToPercent(float ratio) { - return (1F - (1F / ratio)); - } - - /** - * Estimates the distribution of stats over a piece - */ - private static float estimateScale(ItemStack item, int slot) { - if (item == null) { - return 0; - } - - if (item.getItem() instanceof ItemArmor) { - ItemArmor armour = (ItemArmor) item.getItem(); - ArmorMaterial material = armour.getArmorMaterial(); - - // gets the total added for all 4 pieces - int totalProtection = material.getDamageReductionAmount(0) + material.getDamageReductionAmount(1) - + material.getDamageReductionAmount(2) + material.getDamageReductionAmount(3); - - if (totalProtection > 0) { - float singlePointWorth = 1F / totalProtection; - return material.getDamageReductionAmount(slot) * singlePointWorth; - } - } - return sizes[slot]; - } - - public static float getSpeedModForWeight(EntityLivingBase user) { - float mod = 0.0F; - float min = moveSpeedThreshold[0]; - float max = moveSpeedThreshold[1] - min; - float mass = getTotalWeightOfWorn(user, true) - min; - if (mass > 0 && max > 0) { - mod -= (mass / max) * slowAmount * slowRate; - } - return mod; - } - - private static final String weightNBT = "MF_Worn_Weight"; - private static final String weightNBTNS = "MF_Worn_Weight_NS"; - - /** - * Gets the total worn weight of a user: this updates every 20 ticks - */ - public static float getTotalWeightOfWorn(EntityLivingBase user, boolean considerSpeed) { - String tag = considerSpeed ? weightNBTNS : weightNBT; - if (!user.getEntityData().hasKey(tag)) { - return setTotalWeightOfWorn(user, considerSpeed); - } else { - return user.getEntityData().getFloat(tag); - } - } - - public static void updateWeights(EntityLivingBase user) { - setTotalWeightOfWorn(user, true); - setTotalWeightOfWorn(user, false); - } - - /** - * @param considerSpeed - * if true: some pieces will be ignored, ment for speed calculations - */ - public static float setTotalWeightOfWorn(EntityLivingBase user, boolean considerSpeed) { - String tag = considerSpeed ? weightNBTNS : weightNBT; - float weight = 0.0F; - - for (int a = 0; a < 4; a++) { - ItemStack armour = user.getEquipmentInSlot(4 - a); - - if (!considerSpeed || shouldArmourAlterSpeed(armour)) { - weight += getPieceWeight(armour, a); - } - } - user.getEntityData().setFloat(tag, weight); - return weight; - } - - public static float getPieceWeight(ItemStack item, int slot) { - if (item == null) { - return 0.0F; - } - if (item.getItem() instanceof IArmourMF) { - return ((IArmourMF) item.getItem()).getPieceWeight(item, slot); - } - if (slot >= sizes.length) { - return 0F; - } - return getDefaultSuitWeight(item) * sizes[slot]; - } - - private static boolean shouldArmourAlterSpeed(ItemStack armour) { - if (armour == null) { - return false; - } - - return armour.getItem() instanceof IArmourMF || CustomArmourEntry.doesPieceSlowDown(armour); - } - - public static float convertKgToIbs(float kg) { - return kg * 2.5F; - } - - public static float convertIbsToKg(float pounds) { - return pounds / 2.5F; - } - - /** - * Modifes a value for resistence - * - * @param src - * the source (breaks down to ratio) - * @param value - * the variable to modify - * @param cuttingProt - * the cutting resistence - * @param bluntProt - * the blunt resistence - * @param pierceProt - * the piercing resistence - * @return - */ - public static float adjustACForDamage(DamageSource src, float value, float cuttingProt, float bluntProt, - float pierceProt) { - float[] ratio = getRatioForSource(src); - if (ratio == null) { - return value;// Null means undefined - } - - return modifyACForType(value, ratio[0], ratio[1], ratio[2], cuttingProt, bluntProt, pierceProt, - getArmourPenetration(src)); - } - - public static float modifyACForType(int type, float value, float cuttingProt, float bluntProt, float pierceProt) { - float[] f = new float[] { 0F, 0F, 0F }; - f[type] = 1.0F; - return modifyACForType(value, f[0], f[1], f[2], cuttingProt, bluntProt, pierceProt, 0F); - } - - public static float modifyACForType(float value, float cutting, float blunt, float pierce, float cuttingProt, - float bluntProt, float pierceProt, float specialAP) { - if (advancedDamageTypes) { - // Averages the ratio between cutting and blunt, while modifying it by the - // armour traits - value *= (((cutting * cuttingProt) + (blunt * bluntProt) + (pierce * pierceProt)) - / (cutting + blunt + pierce)); - } - float ACModifier = 1.0F + specialAP; - value *= ACModifier; - return value > 0F ? value : 0F; - } - - public static float getArmourPenetration(DamageSource source) { - if (source != null && source.getEntity() != null) { - Entity user = source.getEntity();// The attacker - Entity damager = source.getSourceOfDamage();// The thing causing damage(like arrows) - - if (user == damager && user instanceof EntityLivingBase - && ((EntityLivingBase) user).getHeldItem() != null) { - if (((EntityLivingBase) user).getHeldItem().getItem() instanceof IDamageType) { - return ((IDamageType) ((EntityLivingBase) user).getHeldItem().getItem()) - .getPenetrationLevel(((EntityLivingBase) user).getHeldItem()); - } - } - if (user != damager) { - if (damager instanceof IDamageType) { - return ((IDamageType) damager).getPenetrationLevel(damager); - } - } - } - return 0F; - } - - public static float[] getRatioForSource(DamageSource source) { - if (source.isMagicDamage() || source.isFireDamage() || source == DamageSource.starve) { - return null; - } - - if (source.isExplosion() || source == DamageSource.anvil || source == DamageSource.fallingBlock) { - return new float[] { 0, 1, 0 };// blunt - } - if (source == DamageSource.cactus) { - return new float[] { 0, 0, 1 };// pierce - } - if (source != null && source.getSourceOfDamage() != null && source.getEntity() != null) { - Entity user = source.getEntity();// The attacker - Entity damager = source.getSourceOfDamage();// The thing causing damage(like arrows) - - if (user == damager && user instanceof EntityLivingBase) { - return getRatioForMelee((EntityLivingBase) user, ((EntityLivingBase) user).getHeldItem()); - } - return getRatioForIndirect(damager); - } - - return new float[] { 0, 1, 0 }; - } - - private static float[] getRatioForIndirect(Entity damager) { - if (damager == null) { - return new float[] { 1, 1, 1 };// No damage type. - } - if (damager instanceof IDamageType) { - return ((IDamageType) damager).getDamageRatio(damager); - } - if (damager instanceof EntityArrow) { - return new float[] { 0, 0, 1 }; - } - - if (useConfigIndirectDmg) { - return CustomDamageRatioEntry.getTraits(getEntityRegisterName(damager)); - } - return new float[] { 1, 1, 1 }; - } - - public static boolean useConfigIndirectDmg = true; - - public static float[] getRatioForMelee(EntityLivingBase user, ItemStack weapon) { - if (weapon == null) { - return getMobDefault(user); - } - return getRatioForWeapon(user, weapon); - } - - public static float[] getRatioForWeapon(ItemStack weapon) { - return getRatioForWeapon(null, weapon); - } - - public static float[] getRatioForWeapon(EntityLivingBase user, ItemStack weapon) { - Item item = weapon.getItem(); - - if (item instanceof IDamageType) { - return user != null ? ((IDamageType) item).getDamageRatio(weapon, user) - : ((IDamageType) item).getDamageRatio(weapon); - } - if (item instanceof ItemSword) { - return new float[] { 1, 0, 0 };// sword is cutting by default - } - if (item instanceof ItemAxe) { - return new float[] { 3, 1, 0 };// Axe Ratio is about 3:1 (25%blunt) - } - if (item instanceof ItemPickaxe) { - return new float[] { 0, 0, 1 };// Picks are pierce - } - if (item instanceof ItemHoe || item instanceof ItemSpade) { - return new float[] { 0, 1, 0 };// Tools are blunt - } - - return CustomDamageRatioEntry.getTraits(item); - } - - private static float[] getMobDefault(EntityLivingBase user) { - if (user instanceof EntitySpider) { - return new float[] { 20F, 10F, 80F };// 10% blunt, 20% slash, 80% pierce - } - if (user instanceof IArmourPenetrationMob) { - return ((IArmourPenetrationMob) user).getHitTraits(); - } - return new float[] { 0, 1, 0 }; - } - - public static String getEntityRegisterName(Entity entity) { - if (entity == null) { - return "genetic"; - } - String s = EntityList.getEntityString(entity); - - if (s == null) { - s = "generic"; - } - - return s; - } - - public static float getTotalBulk(EntityLivingBase user) { - if (PowerArmour.isWearingCogwork(user)) { - return 5F; - } - return getEquipmentBulk(user); - } - - /** - * Defined by Light/Medium/Heavy armour average 0 for light, 1 for full medium, - * 2 for full heavy - */ - public static float getEquipmentBulk(EntityLivingBase user) { - float bulk = 0.0F; - for (int a = 0; a < 4; a++) { - String s = getArmourClass(user.getEquipmentInSlot(4 - a)); - if (s != null) { - if (s.equalsIgnoreCase("Medium")) { - bulk += 1; - } - if (s.equalsIgnoreCase("Heavy")) { - bulk += 2; - } - } - - } - return bulk / 4; - } - - public static String getArmourClass(ItemStack armour) { - if (armour == null) { - return null; - } - if (armour.getItem() instanceof IArmourMF) { - return ((IArmourMF) armour.getItem()).getSuitWeigthType(armour); - } - return CustomArmourEntry.getArmourClass(armour); - } - - // THRESHOLD - @SideOnly(Side.CLIENT) - /** - * CLIENT WHOLE ENTITY: Gets the total DT of an entity by damage type: Used by - * the Screen renderer - */ - public static float getDTDisplay(EntityLivingBase user, int id) { - float armourDT = 0; - for (int a = 0; a < 4; a++) { - ItemStack armour = user.getEquipmentInSlot(a + 1); - if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { - float threshold = getArmourValueMod(armour, - ((ISpecialArmourMF) armour.getItem()).getDTDisplay(armour, id)); - armourDT += threshold; - } - } - return armourDT; - } - - @SideOnly(Side.CLIENT) - /** - * CLIENT SINGLE PIECE: Gets a stat for a single piece: Used by Tooltips - */ - public static float getDTForDisplayPiece(ItemStack armour, int id) { - if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { - return getArmourValueMod(armour, ((ISpecialArmourMF) armour.getItem()).getDTDisplay(armour, id)); - } - return 0F; - } - - @SideOnly(Side.CLIENT) - /** - * CLIENT SINGLE PIECE: Gets a stat for a single piece: Used by Tooltips - */ - public static float getDRForDisplayPiece(ItemStack armour, int id) { - if (armour == null) { - return 0F; - } - if (armour.getItem() instanceof ISpecialArmourMF) { - return getArmourValueMod(armour, ((ISpecialArmourMF) armour.getItem()).getDRDisplay(armour, id)); - } - return 0F; - } - - @SideOnly(Side.CLIENT) - /** - * CLIENT WHOLE ENTITY: Gets the total DT of an entity by damage type: Used by - * the Screen renderer - */ - public static float getDRDisplay(EntityLivingBase user, int id) { - float armourDT = 0; - for (int a = 0; a < 4; a++) { - ItemStack armour = user.getEquipmentInSlot(a + 1); - if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { - float threshold = getArmourValueMod(armour, - ((ISpecialArmourMF) armour.getItem()).getDRDisplay(armour, id)); - armourDT += threshold; - } - } - return armourDT; - } - - /** - * MECHANIC WHOLE ENTITY: Gets the threshold of a whole entity - */ - public static float getACThreshold(EntityLivingBase user, DamageSource src) { - float naturalAC = getACForMob(user); - - if (user instanceof IArmouredEntity) { - naturalAC = ((IArmouredEntity) user).getThreshold(src); - } - - float armourDT = 0; - for (int a = 0; a < 4; a++) { - ItemStack armour = user.getEquipmentInSlot(a + 1); - if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { - float threshold = getArmourValueMod(armour, - ((ISpecialArmourMF) armour.getItem()).getDTValue(user, armour, src)); - armourDT += threshold; - } - } - return naturalAC + armourDT; - } - - /** - * MECHANIC DT MODIFIER: Gets the DT Modifier for durability loss - */ - private static float modifyDTOnDura(ItemStack armour) { - float percentQuality = getPercentQuality(armour); - - float reduction = 0.8F; - - if (percentQuality < reduction) { - float mod = Math.max(0.1F, percentQuality / reduction); - - return mod; - } - return 1.0F; - } - - /** - * MECHANIC DAMAGE FINDER: Gets the percent durability of an item - */ - private static float getPercentQuality(ItemStack armour) { - return 1F - ((float) armour.getItemDamage() / (float) armour.getMaxDamage()); - } - - /** - * MECHANIC DT CALCULATOR: Gets the natural DT of an entity - */ - private static float getACForMob(EntityLivingBase user) { - if (user.getCreatureAttribute() == EnumCreatureAttribute.ARTHROPOD) { - return user.getMaxHealth() / 10F;// 1.6AC for spiders - } - return 0F; - } - - /** - * MECHANIC DT CALCULATOR: Gets the modifiers based on the itemstack (such as - * damage and NBT) DT OR DR - */ - public static float getArmourValueMod(ItemStack armour, float DT) { - float initDT = DT; - if (armour.hasTagCompound() && armour.getTagCompound().hasKey("MF_Inferior")) { - DT *= (armour.getTagCompound().getBoolean("MF_Inferior") ? 0.8F : 1.2F); - } - DT *= modifyDTOnDura(armour); - return DT; - } - - /** - * MECHANIC DT CALCULATOR: How much is armour damaged by a hit - */ - public static int getDamageToDura(EntityLivingBase user, DamageSource source, ItemStack armour, float dam) { - if (source.isUnblockable()) { - return 0; - } - if (source.getSourceOfDamage() != null && source.getSourceOfDamage() == source.getEntity()) { - dam *= getMobArmourDamage(source.getSourceOfDamage()); - } - if (getPercentQuality(armour) > 0.1F) { - dam = Math.max(1.0F, dam / 4F); - } - return (int) dam; - } - - /** - * MECHANIC DT CALCULATOR: How much armour damage the entity does - */ - private static float getMobArmourDamage(Entity src) { - if (src instanceof EntitySpider) { - return 3.0F; - } - return 0.5F; - } - - public static void damageArmour(EntityLivingBase user, int dura) { - for (int a = 0; a < 4; a++) { - ItemStack armour = user.getEquipmentInSlot(a + 1); - if (armour != null) { - if (!user.worldObj.isRemote) { - if (armour.getItemDamage() + dura < armour.getMaxDamage()) { - armour.damageItem(dura, user); - } else { - armour.setItemDamage(armour.getMaxDamage()); - } - } - if (armour.getItemDamage() >= armour.getMaxDamage()) { - user.setCurrentItemOrArmor(a + 1, null); - user.worldObj.playSoundEffect(user.posX, user.posY + user.getEyeHeight() - (0.4F * a), user.posZ, - "random.break", 1.0F, 1.0F); - } - } - } - } - - /** - * Determines how much armour reduces parrying ability - */ - public static float getParryModifier(EntityLivingBase user) { - float bulk = getTotalBulk(user); - - return 1.0F / ((bulk * 0.5F) + 1);// 50% in heavy - } - - public static int modifyParryCooldown(EntityLivingBase user, int ticks) { - float bulk = getTotalBulk(user); - - return (int) Math.max(5, ticks + (bulk * 5));// plate adds 5t - } + /** + * This is the scale for helmet, chest, legs and boots. Use this with 'slot' to + * scale things like weight and DT distribution + */ + public static final float[] sizes = new float[]{0.2F, 0.3F, 0.3F, 0.2F}; + /** + * For the percentage based armour, how much is ratio 2(50%) viewed as + */ + public static final float armourRatingScale = 100; + /** + * What affects stamina regen, and what affects stamina cost + */ + public static final float[] encumberanceArray = new float[]{10F, 40F}; + /** + * When your movement starts and peaks at slowing down + */ + public static final float slowAmount = 10F; + public static final float[] moveSpeedThreshold = new float[]{30F, 40F}; + private static final String weightNBT = "MF_Worn_Weight"; + private static final String weightNBTNS = "MF_Worn_Weight_NS"; + public static boolean advancedDamageTypes = true; + public static float slowRate = 1.0F; + public static boolean useConfigIndirectDmg = true; + + /** + * Gets the default using the items ArmourClass + */ + private static float getDefaultSuitWeight(ItemStack armour) { + return CustomArmourEntry.getEntryVars(armour)[0]; + } + + private static float getDefaultBulk(ItemStack armour) { + return CustomArmourEntry.getEntryVars(armour)[1]; + } + + public static ArmourDesign getDefaultAD(ItemStack armour) { + return ArmourDesign.SOLID; + } + + /** + * Converts a hit:damage ratio into vanilla AR(rounding off as it is an int) + */ + public static int translateToVanillaAR(float ratio) { + return (int) Math.min(24, 25F * convertToPercent(ratio)); + } + + /** + * Converting a single piece to vanilla AR (rounding off as it is an int) Then + * it divides on the slot. Used for armour bar + */ + public static int translateToVanillaAR(float ratio, int piece, int max) { + float scale = (float) piece / (float) max; + + return (int) Math.min(24, 25F * convertToPercent(ratio) * scale); + } + + /** + * Converts a hit:damage ratio into a decimal percentage + */ + public static float convertToPercent(float ratio) { + return (1F - (1F / ratio)); + } + + /** + * Estimates the distribution of stats over a piece + */ + private static float estimateScale(ItemStack item, int slot) { + if (item == null) { + return 0; + } + + if (item.getItem() instanceof ItemArmor) { + ItemArmor armour = (ItemArmor) item.getItem(); + ArmorMaterial material = armour.getArmorMaterial(); + + // gets the total added for all 4 pieces + int totalProtection = material.getDamageReductionAmount(0) + material.getDamageReductionAmount(1) + + material.getDamageReductionAmount(2) + material.getDamageReductionAmount(3); + + if (totalProtection > 0) { + float singlePointWorth = 1F / totalProtection; + return material.getDamageReductionAmount(slot) * singlePointWorth; + } + } + return sizes[slot]; + } + + public static float getSpeedModForWeight(EntityLivingBase user) { + float mod = 0.0F; + float min = moveSpeedThreshold[0]; + float max = moveSpeedThreshold[1] - min; + float mass = getTotalWeightOfWorn(user, true) - min; + if (mass > 0 && max > 0) { + mod -= (mass / max) * slowAmount * slowRate; + } + return mod; + } + + /** + * Gets the total worn weight of a user: this updates every 20 ticks + */ + public static float getTotalWeightOfWorn(EntityLivingBase user, boolean considerSpeed) { + String tag = considerSpeed ? weightNBTNS : weightNBT; + if (!user.getEntityData().hasKey(tag)) { + return setTotalWeightOfWorn(user, considerSpeed); + } else { + return user.getEntityData().getFloat(tag); + } + } + + public static void updateWeights(EntityLivingBase user) { + setTotalWeightOfWorn(user, true); + setTotalWeightOfWorn(user, false); + } + + /** + * @param considerSpeed if true: some pieces will be ignored, ment for speed calculations + */ + public static float setTotalWeightOfWorn(EntityLivingBase user, boolean considerSpeed) { + String tag = considerSpeed ? weightNBTNS : weightNBT; + float weight = 0.0F; + + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(4 - a); + + if (!considerSpeed || shouldArmourAlterSpeed(armour)) { + weight += getPieceWeight(armour, a); + } + } + user.getEntityData().setFloat(tag, weight); + return weight; + } + + public static float getPieceWeight(ItemStack item, int slot) { + if (item == null) { + return 0.0F; + } + if (item.getItem() instanceof IArmourMF) { + return ((IArmourMF) item.getItem()).getPieceWeight(item, slot); + } + if (slot >= sizes.length) { + return 0F; + } + return getDefaultSuitWeight(item) * sizes[slot]; + } + + private static boolean shouldArmourAlterSpeed(ItemStack armour) { + if (armour == null) { + return false; + } + + return armour.getItem() instanceof IArmourMF || CustomArmourEntry.doesPieceSlowDown(armour); + } + + public static float convertKgToIbs(float kg) { + return kg * 2.5F; + } + + public static float convertIbsToKg(float pounds) { + return pounds / 2.5F; + } + + /** + * Modifes a value for resistence + * + * @param src the source (breaks down to ratio) + * @param value the variable to modify + * @param cuttingProt the cutting resistence + * @param bluntProt the blunt resistence + * @param pierceProt the piercing resistence + * @return + */ + public static float adjustACForDamage(DamageSource src, float value, float cuttingProt, float bluntProt, + float pierceProt) { + float[] ratio = getRatioForSource(src); + if (ratio == null) { + return value;// Null means undefined + } + + return modifyACForType(value, ratio[0], ratio[1], ratio[2], cuttingProt, bluntProt, pierceProt, + getArmourPenetration(src)); + } + + public static float modifyACForType(int type, float value, float cuttingProt, float bluntProt, float pierceProt) { + float[] f = new float[]{0F, 0F, 0F}; + f[type] = 1.0F; + return modifyACForType(value, f[0], f[1], f[2], cuttingProt, bluntProt, pierceProt, 0F); + } + + public static float modifyACForType(float value, float cutting, float blunt, float pierce, float cuttingProt, + float bluntProt, float pierceProt, float specialAP) { + if (advancedDamageTypes) { + // Averages the ratio between cutting and blunt, while modifying it by the + // armour traits + value *= (((cutting * cuttingProt) + (blunt * bluntProt) + (pierce * pierceProt)) + / (cutting + blunt + pierce)); + } + float ACModifier = 1.0F + specialAP; + value *= ACModifier; + return value > 0F ? value : 0F; + } + + public static float getArmourPenetration(DamageSource source) { + if (source != null && source.getEntity() != null) { + Entity user = source.getEntity();// The attacker + Entity damager = source.getSourceOfDamage();// The thing causing damage(like arrows) + + if (user == damager && user instanceof EntityLivingBase + && ((EntityLivingBase) user).getHeldItem() != null) { + if (((EntityLivingBase) user).getHeldItem().getItem() instanceof IDamageType) { + return ((IDamageType) ((EntityLivingBase) user).getHeldItem().getItem()) + .getPenetrationLevel(((EntityLivingBase) user).getHeldItem()); + } + } + if (user != damager) { + if (damager instanceof IDamageType) { + return ((IDamageType) damager).getPenetrationLevel(damager); + } + } + } + return 0F; + } + + public static float[] getRatioForSource(DamageSource source) { + if (source.isMagicDamage() || source.isFireDamage() || source == DamageSource.starve) { + return null; + } + + if (source.isExplosion() || source == DamageSource.anvil || source == DamageSource.fallingBlock) { + return new float[]{0, 1, 0};// blunt + } + if (source == DamageSource.cactus) { + return new float[]{0, 0, 1};// pierce + } + if (source != null && source.getSourceOfDamage() != null && source.getEntity() != null) { + Entity user = source.getEntity();// The attacker + Entity damager = source.getSourceOfDamage();// The thing causing damage(like arrows) + + if (user == damager && user instanceof EntityLivingBase) { + return getRatioForMelee((EntityLivingBase) user, ((EntityLivingBase) user).getHeldItem()); + } + return getRatioForIndirect(damager); + } + + return new float[]{0, 1, 0}; + } + + private static float[] getRatioForIndirect(Entity damager) { + if (damager == null) { + return new float[]{1, 1, 1};// No damage type. + } + if (damager instanceof IDamageType) { + return ((IDamageType) damager).getDamageRatio(damager); + } + if (damager instanceof EntityArrow) { + return new float[]{0, 0, 1}; + } + + if (useConfigIndirectDmg) { + return CustomDamageRatioEntry.getTraits(getEntityRegisterName(damager)); + } + return new float[]{1, 1, 1}; + } + + public static float[] getRatioForMelee(EntityLivingBase user, ItemStack weapon) { + if (weapon == null) { + return getMobDefault(user); + } + return getRatioForWeapon(user, weapon); + } + + public static float[] getRatioForWeapon(ItemStack weapon) { + return getRatioForWeapon(null, weapon); + } + + public static float[] getRatioForWeapon(EntityLivingBase user, ItemStack weapon) { + Item item = weapon.getItem(); + + if (item instanceof IDamageType) { + return user != null ? ((IDamageType) item).getDamageRatio(weapon, user) + : ((IDamageType) item).getDamageRatio(weapon); + } + if (item instanceof ItemSword) { + return new float[]{1, 0, 0};// sword is cutting by default + } + if (item instanceof ItemAxe) { + return new float[]{3, 1, 0};// Axe Ratio is about 3:1 (25%blunt) + } + if (item instanceof ItemPickaxe) { + return new float[]{0, 0, 1};// Picks are pierce + } + if (item instanceof ItemHoe || item instanceof ItemSpade) { + return new float[]{0, 1, 0};// Tools are blunt + } + + return CustomDamageRatioEntry.getTraits(item); + } + + private static float[] getMobDefault(EntityLivingBase user) { + if (user instanceof EntitySpider) { + return new float[]{20F, 10F, 80F};// 10% blunt, 20% slash, 80% pierce + } + if (user instanceof IArmourPenetrationMob) { + return ((IArmourPenetrationMob) user).getHitTraits(); + } + return new float[]{0, 1, 0}; + } + + public static String getEntityRegisterName(Entity entity) { + if (entity == null) { + return "genetic"; + } + String s = EntityList.getEntityString(entity); + + if (s == null) { + s = "generic"; + } + + return s; + } + + public static float getTotalBulk(EntityLivingBase user) { + if (PowerArmour.isWearingCogwork(user)) { + return 5F; + } + return getEquipmentBulk(user); + } + + /** + * Defined by Light/Medium/Heavy armour average 0 for light, 1 for full medium, + * 2 for full heavy + */ + public static float getEquipmentBulk(EntityLivingBase user) { + float bulk = 0.0F; + for (int a = 0; a < 4; a++) { + String s = getArmourClass(user.getEquipmentInSlot(4 - a)); + if (s != null) { + if (s.equalsIgnoreCase("Medium")) { + bulk += 1; + } + if (s.equalsIgnoreCase("Heavy")) { + bulk += 2; + } + } + + } + return bulk / 4; + } + + public static String getArmourClass(ItemStack armour) { + if (armour == null) { + return null; + } + if (armour.getItem() instanceof IArmourMF) { + return ((IArmourMF) armour.getItem()).getSuitWeigthType(armour); + } + return CustomArmourEntry.getArmourClass(armour); + } + + // THRESHOLD + @SideOnly(Side.CLIENT) + /** + * CLIENT WHOLE ENTITY: Gets the total DT of an entity by damage type: Used by + * the Screen renderer + */ + public static float getDTDisplay(EntityLivingBase user, int id) { + float armourDT = 0; + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { + float threshold = getArmourValueMod(armour, + ((ISpecialArmourMF) armour.getItem()).getDTDisplay(armour, id)); + armourDT += threshold; + } + } + return armourDT; + } + + @SideOnly(Side.CLIENT) + /** + * CLIENT SINGLE PIECE: Gets a stat for a single piece: Used by Tooltips + */ + public static float getDTForDisplayPiece(ItemStack armour, int id) { + if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { + return getArmourValueMod(armour, ((ISpecialArmourMF) armour.getItem()).getDTDisplay(armour, id)); + } + return 0F; + } + + @SideOnly(Side.CLIENT) + /** + * CLIENT SINGLE PIECE: Gets a stat for a single piece: Used by Tooltips + */ + public static float getDRForDisplayPiece(ItemStack armour, int id) { + if (armour == null) { + return 0F; + } + if (armour.getItem() instanceof ISpecialArmourMF) { + return getArmourValueMod(armour, ((ISpecialArmourMF) armour.getItem()).getDRDisplay(armour, id)); + } + return 0F; + } + + @SideOnly(Side.CLIENT) + /** + * CLIENT WHOLE ENTITY: Gets the total DT of an entity by damage type: Used by + * the Screen renderer + */ + public static float getDRDisplay(EntityLivingBase user, int id) { + float armourDT = 0; + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { + float threshold = getArmourValueMod(armour, + ((ISpecialArmourMF) armour.getItem()).getDRDisplay(armour, id)); + armourDT += threshold; + } + } + return armourDT; + } + + /** + * MECHANIC WHOLE ENTITY: Gets the threshold of a whole entity + */ + public static float getACThreshold(EntityLivingBase user, DamageSource src) { + float naturalAC = getACForMob(user); + + if (user instanceof IArmouredEntity) { + naturalAC = ((IArmouredEntity) user).getThreshold(src); + } + + float armourDT = 0; + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof ISpecialArmourMF) { + float threshold = getArmourValueMod(armour, + ((ISpecialArmourMF) armour.getItem()).getDTValue(user, armour, src)); + armourDT += threshold; + } + } + return naturalAC + armourDT; + } + + /** + * MECHANIC DT MODIFIER: Gets the DT Modifier for durability loss + */ + private static float modifyDTOnDura(ItemStack armour) { + float percentQuality = getPercentQuality(armour); + + float reduction = 0.8F; + + if (percentQuality < reduction) { + float mod = Math.max(0.1F, percentQuality / reduction); + + return mod; + } + return 1.0F; + } + + /** + * MECHANIC DAMAGE FINDER: Gets the percent durability of an item + */ + private static float getPercentQuality(ItemStack armour) { + return 1F - ((float) armour.getItemDamage() / (float) armour.getMaxDamage()); + } + + /** + * MECHANIC DT CALCULATOR: Gets the natural DT of an entity + */ + private static float getACForMob(EntityLivingBase user) { + if (user.getCreatureAttribute() == EnumCreatureAttribute.ARTHROPOD) { + return user.getMaxHealth() / 10F;// 1.6AC for spiders + } + return 0F; + } + + /** + * MECHANIC DT CALCULATOR: Gets the modifiers based on the itemstack (such as + * damage and NBT) DT OR DR + */ + public static float getArmourValueMod(ItemStack armour, float DT) { + float initDT = DT; + if (armour.hasTagCompound() && armour.getTagCompound().hasKey("MF_Inferior")) { + DT *= (armour.getTagCompound().getBoolean("MF_Inferior") ? 0.8F : 1.2F); + } + DT *= modifyDTOnDura(armour); + return DT; + } + + /** + * MECHANIC DT CALCULATOR: How much is armour damaged by a hit + */ + public static int getDamageToDura(EntityLivingBase user, DamageSource source, ItemStack armour, float dam) { + if (source.isUnblockable()) { + return 0; + } + if (source.getSourceOfDamage() != null && source.getSourceOfDamage() == source.getEntity()) { + dam *= getMobArmourDamage(source.getSourceOfDamage()); + } + if (getPercentQuality(armour) > 0.1F) { + dam = Math.max(1.0F, dam / 4F); + } + return (int) dam; + } + + /** + * MECHANIC DT CALCULATOR: How much armour damage the entity does + */ + private static float getMobArmourDamage(Entity src) { + if (src instanceof EntitySpider) { + return 3.0F; + } + return 0.5F; + } + + public static void damageArmour(EntityLivingBase user, int dura) { + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null) { + if (!user.worldObj.isRemote) { + if (armour.getItemDamage() + dura < armour.getMaxDamage()) { + armour.damageItem(dura, user); + } else { + armour.setItemDamage(armour.getMaxDamage()); + } + } + if (armour.getItemDamage() >= armour.getMaxDamage()) { + user.setCurrentItemOrArmor(a + 1, null); + user.worldObj.playSoundEffect(user.posX, user.posY + user.getEyeHeight() - (0.4F * a), user.posZ, + "random.break", 1.0F, 1.0F); + } + } + } + } + + /** + * Determines how much armour reduces parrying ability + */ + public static float getParryModifier(EntityLivingBase user) { + float bulk = getTotalBulk(user); + + return 1.0F / ((bulk * 0.5F) + 1);// 50% in heavy + } + + public static int modifyParryCooldown(EntityLivingBase user, int ticks) { + float bulk = getTotalBulk(user); + + return (int) Math.max(5, ticks + (bulk * 5));// plate adds 5t + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/ArrowEffectsMF.java b/src/main/java/minefantasy/mf2/api/helpers/ArrowEffectsMF.java index d8dfe4b8..4eb05ca0 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/ArrowEffectsMF.java +++ b/src/main/java/minefantasy/mf2/api/helpers/ArrowEffectsMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.api.helpers; -import java.util.ArrayList; -import java.util.List; - import minefantasy.mf2.api.archery.IArrowRetrieve; import net.minecraft.entity.Entity; import net.minecraft.entity.projectile.EntityArrow; @@ -10,109 +7,105 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import java.util.ArrayList; +import java.util.List; + public class ArrowEffectsMF { - // THE ARROW STICKING CODE IS EXPERIMENTAL AND NOT ACTIVE BY DEFAULT - /** - * Sticks an arrow into an entity THIS WILL ONLY BE DROPPED ON LIVING ENTITIES. - * (This does not render arrows, simply drops them when an enemy is killed) - * - * @param hit - * the entity the arrow hit - * @param projectile - * the arrow entity, it will get the item to drop - */ - public static void stickArrowIn(Entity hit, Entity projectile) { - stickArrowIn(hit, getDroppedArrow(projectile), projectile); - } + // THE ARROW STICKING CODE IS EXPERIMENTAL AND NOT ACTIVE BY DEFAULT + + /** + * Sticks an arrow into an entity THIS WILL ONLY BE DROPPED ON LIVING ENTITIES. + * (This does not render arrows, simply drops them when an enemy is killed) + * + * @param hit the entity the arrow hit + * @param projectile the arrow entity, it will get the item to drop + */ + public static void stickArrowIn(Entity hit, Entity projectile) { + stickArrowIn(hit, getDroppedArrow(projectile), projectile); + } - /** - * Sticks an arrow into an entity THIS WILL ONLY BE DROPPED ON LIVING ENTITIES. - * (This does not render arrows, simply drops them when an enemy is killed) - * - * @param hit - * the entity the arrow hit - * @param arrow - * the item that gets dropped when "hit" is killed - * @param projectile - * the arrow entity - */ - public static void stickArrowIn(Entity hit, ItemStack arrow, Entity projectile) { - if (!shouldArrowStick(projectile)) { - return; - } - NBTTagCompound nbt = hit.getEntityData(); + /** + * Sticks an arrow into an entity THIS WILL ONLY BE DROPPED ON LIVING ENTITIES. + * (This does not render arrows, simply drops them when an enemy is killed) + * + * @param hit the entity the arrow hit + * @param arrow the item that gets dropped when "hit" is killed + * @param projectile the arrow entity + */ + public static void stickArrowIn(Entity hit, ItemStack arrow, Entity projectile) { + if (!shouldArrowStick(projectile)) { + return; + } + NBTTagCompound nbt = hit.getEntityData(); - int slot = 0; - if (nbt.hasKey("stuckArrowCountMF")) { - slot = hit.getEntityData().getInteger("stuckArrowCountMF"); - } + int slot = 0; + if (nbt.hasKey("stuckArrowCountMF")) { + slot = hit.getEntityData().getInteger("stuckArrowCountMF"); + } - NBTTagCompound stuckArrow = new NBTTagCompound();// makes the arrow instance - arrow.writeToNBT(stuckArrow);// put arrow in instance + NBTTagCompound stuckArrow = new NBTTagCompound();// makes the arrow instance + arrow.writeToNBT(stuckArrow);// put arrow in instance - nbt.setTag("StuckArrowMF" + slot, stuckArrow);// save arrow list - nbt.setInteger("stuckArrowCountMF", slot + 1);// Slot increases - } + nbt.setTag("StuckArrowMF" + slot, stuckArrow);// save arrow list + nbt.setInteger("stuckArrowCountMF", slot + 1);// Slot increases + } - /** - * Gets the arrow dropped when an enemy is killed. MODS NEED TO ADD THEIR OWN - * SUPPORT - * - * @param arrow - * the arrow fired - */ - public static ItemStack getDroppedArrow(Entity arrow) { - if (arrow instanceof IArrowRetrieve)// implement this method in your entity arrow classes - { - return ((IArrowRetrieve) arrow).getDroppedItem(); - } - if (arrow.getEntityData().hasKey("MF_ArrowItem")) { - NBTTagCompound heldArrow = arrow.getEntityData().getCompoundTag("MF_ArrowItem"); - return ItemStack.loadItemStackFromNBT(heldArrow); - } - return new ItemStack(Items.arrow); - } + /** + * Gets the arrow dropped when an enemy is killed. MODS NEED TO ADD THEIR OWN + * SUPPORT + * + * @param arrow the arrow fired + */ + public static ItemStack getDroppedArrow(Entity arrow) { + if (arrow instanceof IArrowRetrieve)// implement this method in your entity arrow classes + { + return ((IArrowRetrieve) arrow).getDroppedItem(); + } + if (arrow.getEntityData().hasKey("MF_ArrowItem")) { + NBTTagCompound heldArrow = arrow.getEntityData().getCompoundTag("MF_ArrowItem"); + return ItemStack.loadItemStackFromNBT(heldArrow); + } + return new ItemStack(Items.arrow); + } - /** - * Gets if an arrow entity will drop items when the enemy is killed. - * - * @param projectile - * the arrow entity fired - */ - public static boolean shouldArrowStick(Entity projectile) { - if (projectile instanceof IArrowRetrieve) { - return ((IArrowRetrieve) projectile).canBePickedUp(); - } - if (projectile instanceof EntityArrow) { - return ((EntityArrow) projectile).canBePickedUp == 1; - } - return true; - } + /** + * Gets if an arrow entity will drop items when the enemy is killed. + * + * @param projectile the arrow entity fired + */ + public static boolean shouldArrowStick(Entity projectile) { + if (projectile instanceof IArrowRetrieve) { + return ((IArrowRetrieve) projectile).canBePickedUp(); + } + if (projectile instanceof EntityArrow) { + return ((EntityArrow) projectile).canBePickedUp == 1; + } + return true; + } - /** - * Gets the list of items that arrows have stuck in from the "stickArrowIn" - * method; THIS IS ONLY CALLED BY LIVING ENTITIES - * - * @param entity - * the entity killed - */ - public static List getStuckArrows(Entity entity) { - List arrows = new ArrayList(); - NBTTagCompound nbt = entity.getEntityData(); + /** + * Gets the list of items that arrows have stuck in from the "stickArrowIn" + * method; THIS IS ONLY CALLED BY LIVING ENTITIES + * + * @param entity the entity killed + */ + public static List getStuckArrows(Entity entity) { + List arrows = new ArrayList(); + NBTTagCompound nbt = entity.getEntityData(); - int arrowCount = 0; - if (nbt.hasKey("stuckArrowCountMF")) { - arrowCount = entity.getEntityData().getInteger("stuckArrowCountMF"); - } + int arrowCount = 0; + if (nbt.hasKey("stuckArrowCountMF")) { + arrowCount = entity.getEntityData().getInteger("stuckArrowCountMF"); + } - if (arrowCount > 0) { - for (int a = 0; a < arrowCount; a++) { - NBTTagCompound stuckArrow = (NBTTagCompound) nbt.getTag("StuckArrowMF" + a); - if (stuckArrow != null) { - arrows.add(ItemStack.loadItemStackFromNBT(stuckArrow)); - } - } - } - return arrows; - } + if (arrowCount > 0) { + for (int a = 0; a < arrowCount; a++) { + NBTTagCompound stuckArrow = (NBTTagCompound) nbt.getTag("StuckArrowMF" + a); + if (stuckArrow != null) { + arrows.add(ItemStack.loadItemStackFromNBT(stuckArrow)); + } + } + } + return arrows; + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/BlockPositionHelper.java b/src/main/java/minefantasy/mf2/api/helpers/BlockPositionHelper.java index 81a385cc..568ab60a 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/BlockPositionHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/BlockPositionHelper.java @@ -3,101 +3,87 @@ import net.minecraftforge.common.util.ForgeDirection; public class BlockPositionHelper { - // private static ForgeDirection[] FD = new - // ForgeDirection[]{ForgeDirection.SOUTH, ForgeDirection.WEST, - // ForgeDirection.NORTH, ForgeDirection.EAST}; + // private static ForgeDirection[] FD = new + // ForgeDirection[]{ForgeDirection.SOUTH, ForgeDirection.WEST, + // ForgeDirection.NORTH, ForgeDirection.EAST}; - /** - * Gets the Grid slot in relation to mouse click - * - * @param clickX - * the area clicked on X (called in blockActivated) - * @param clickY - * the area clicked on Y (called in blockActivated) - * @param xBound - * the x boundry of the block - * @param xBound2 - * the x max boundry of the block - * @param yBound - * the y boundry of the block - * @param yBound2 - * the y max boundry of the block - * @param xSlots - * the slot count x - * @param ySlots - * the slot count y - * @param direction - * the direction the block is facing - */ - public static int[] getCoordsFor(float clickX, float clickY, float xBound, float xBound2, float yBound, - float yBound2, int xSlots, int ySlots, int direction) { - if (clickX < xBound || clickX > xBound2 || clickY < yBound || clickY > yBound2) { - return null; - } + /** + * Gets the Grid slot in relation to mouse click + * + * @param clickX the area clicked on X (called in blockActivated) + * @param clickY the area clicked on Y (called in blockActivated) + * @param xBound the x boundry of the block + * @param xBound2 the x max boundry of the block + * @param yBound the y boundry of the block + * @param yBound2 the y max boundry of the block + * @param xSlots the slot count x + * @param ySlots the slot count y + * @param direction the direction the block is facing + */ + public static int[] getCoordsFor(float clickX, float clickY, float xBound, float xBound2, float yBound, + float yBound2, int xSlots, int ySlots, int direction) { + if (clickX < xBound || clickX > xBound2 || clickY < yBound || clickY > yBound2) { + return null; + } - clickX -= xBound; - clickY -= yBound; + clickX -= xBound; + clickY -= yBound; - float xMax = xBound2 - xBound; - float yMax = yBound2 - yBound; + float xMax = xBound2 - xBound; + float yMax = yBound2 - yBound; - int xSlot = 0; - int ySlot = 0; + int xSlot = 0; + int ySlot = 0; - float xSpace = xMax / xSlots; - float ySpace = yMax / ySlots; + float xSpace = xMax / xSlots; + float ySpace = yMax / ySlots; - for (int xT = 0; xT < xSlots; xT++) { - float MinSpace = xSpace * xT; - float MaxSpace = xSpace * (xT + 1); - if (clickX < MaxSpace && clickX > MinSpace) { - xSlot = xT; - } - } + for (int xT = 0; xT < xSlots; xT++) { + float MinSpace = xSpace * xT; + float MaxSpace = xSpace * (xT + 1); + if (clickX < MaxSpace && clickX > MinSpace) { + xSlot = xT; + } + } - for (int yT = 0; yT < ySlots; yT++) { - float MinSpace = ySpace * yT; - float MaxSpace = ySpace * (yT + 1); - if (clickY < MaxSpace && clickY > MinSpace) { - ySlot = yT; - } - } - return translateCoords(xSlot, ySlot, xSlots, ySlots, direction); - } + for (int yT = 0; yT < ySlots; yT++) { + float MinSpace = ySpace * yT; + float MaxSpace = ySpace * (yT + 1); + if (clickY < MaxSpace && clickY > MinSpace) { + ySlot = yT; + } + } + return translateCoords(xSlot, ySlot, xSlots, ySlots, direction); + } - /** - * Translates the coords on angles (NORTH is default) - * - * @param x - * the slot x - * @param y - * the slot y - * @param maxX - * the slot count x - * @param maxY - * the slot count y - * @param dir - * the facing direction - */ - public static int[] translateCoords(int x, int y, int maxX, int maxY, int direction) { - ForgeDirection dir = ForgeDirection.getOrientation(direction); - if (dir == ForgeDirection.NORTH) { - int newX = (maxX - x - 1); - int newY = (maxY - y - 1); - return new int[] { newX, newY }; - } + /** + * Translates the coords on angles (NORTH is default) + * + * @param x the slot x + * @param y the slot y + * @param maxX the slot count x + * @param maxY the slot count y + * @param dir the facing direction + */ + public static int[] translateCoords(int x, int y, int maxX, int maxY, int direction) { + ForgeDirection dir = ForgeDirection.getOrientation(direction); + if (dir == ForgeDirection.NORTH) { + int newX = (maxX - x - 1); + int newY = (maxY - y - 1); + return new int[]{newX, newY}; + } - if (dir == ForgeDirection.WEST) { - int newX = (y); - int newY = (maxX - x - 1); - return new int[] { newX, newY }; - } - if (dir == ForgeDirection.EAST) { - int newY = (x); - int newX = (maxY - y - 1); - return new int[] { newX, newY }; - } + if (dir == ForgeDirection.WEST) { + int newX = (y); + int newY = (maxX - x - 1); + return new int[]{newX, newY}; + } + if (dir == ForgeDirection.EAST) { + int newY = (x); + int newX = (maxY - y - 1); + return new int[]{newX, newY}; + } - return new int[] { x, y }; - } + return new int[]{x, y}; + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/ClientTickHandler.java b/src/main/java/minefantasy/mf2/api/helpers/ClientTickHandler.java index 1cbdc825..8874327f 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/ClientTickHandler.java +++ b/src/main/java/minefantasy/mf2/api/helpers/ClientTickHandler.java @@ -9,29 +9,29 @@ public class ClientTickHandler { - public static int pageFlipTicks = 0; - public static int ticksInGame = 0; - public static float partialTicks = 0; + public static int pageFlipTicks = 0; + public static int ticksInGame = 0; + public static float partialTicks = 0; - @SubscribeEvent - public void renderTickStart(RenderTickEvent event) { - if (event.phase == Phase.START) - partialTicks = event.renderTickTime; - } + public static void notifyPageChange() { + if (pageFlipTicks == 0) + pageFlipTicks = 5; + } - @SubscribeEvent - public void clientTickEnd(ClientTickEvent event) { - if (event.phase == Phase.END) { - GuiScreen gui = Minecraft.getMinecraft().currentScreen; - if (gui == null || !gui.doesGuiPauseGame()) { - ticksInGame++; - } - } - } + @SubscribeEvent + public void renderTickStart(RenderTickEvent event) { + if (event.phase == Phase.START) + partialTicks = event.renderTickTime; + } - public static void notifyPageChange() { - if (pageFlipTicks == 0) - pageFlipTicks = 5; - } + @SubscribeEvent + public void clientTickEnd(ClientTickEvent event) { + if (event.phase == Phase.END) { + GuiScreen gui = Minecraft.getMinecraft().currentScreen; + if (gui == null || !gui.doesGuiPauseGame()) { + ticksInGame++; + } + } + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/CustomToolHelper.java b/src/main/java/minefantasy/mf2/api/helpers/CustomToolHelper.java index e2cfee9b..c8f230e4 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/CustomToolHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/CustomToolHelper.java @@ -1,7 +1,5 @@ package minefantasy.mf2.api.helpers; -import java.util.List; - import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -18,527 +16,524 @@ import net.minecraftforge.common.util.EnumHelper; import net.minecraftforge.oredict.OreDictionary; +import java.util.List; + public class CustomToolHelper { - public static final String slot_main = "main_metal"; - public static final String slot_haft = "haft_wood"; - - /** - * A bit of the new system, gets custom materials for the head - */ - public static CustomMaterial getCustomPrimaryMaterial(ItemStack item) { - if (item == null) - return null; - - CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); - if (material != null) { - return material; - } - return null; - } - - public static CustomMaterial getCustomSecondaryMaterial(ItemStack item) { - if (item == null) - return null; - - CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_haft); - if (material != null) { - return material; - } - return null; - } - - public static ItemStack construct(Item base, String main) { - return construct(base, main, "OakWood"); - } - - public static ItemStack construct(Item base, String main, String haft) { - ItemStack item = new ItemStack(base); - CustomMaterial.addMaterial(item, slot_main, main.toLowerCase()); - if (haft != null) { - CustomMaterial.addMaterial(item, slot_haft, haft.toLowerCase()); - } - return item; - } - - public static ItemStack constructSingleColoredLayer(Item base, String main) { - return constructSingleColoredLayer(base, main, 1); - } - - public static ItemStack constructSingleColoredLayer(Item base, String main, int stacksize) { - ItemStack item = new ItemStack(base, stacksize); - CustomMaterial.addMaterial(item, slot_main, main.toLowerCase()); - return item; - } - - /** - * Gets the rarity for a custom item - * - * @param itemRarity - * is the default id - */ - public static EnumRarity getRarity(ItemStack item, int itemRarity) { - int lvl = itemRarity + 1; - CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); - if (material != null) { - lvl = material.rarityID + 1; - } - - if (item.isItemEnchanted()) { - if (lvl == 0) { - lvl++; - } - lvl++; - } - if (lvl >= rarity.length) { - lvl = rarity.length - 1; - } - return rarity[lvl]; - } - - public static EnumRarity poor = EnumHelper.addRarity("Poor", EnumChatFormatting.DARK_GRAY, "poor"); - public static EnumRarity[] rarity = new EnumRarity[] { poor, EnumRarity.common, EnumRarity.uncommon, - EnumRarity.rare, EnumRarity.epic }; - - /** - * Gets the max durability - * - * @param dura - * is the default dura - */ - public static int getMaxDamage(ItemStack stack, int dura) { - CustomMaterial head = getCustomPrimaryMaterial(stack); - CustomMaterial haft = getCustomSecondaryMaterial(stack); - if (head != null) { - dura = (int) (head.durability * 100); - } - if (haft != null) { - dura += (int) (haft.durability * 100);// Hafts add 50% to the durability - } - return ToolHelper.setDuraOnQuality(stack, dura); - } - - /** - * Gets the colour for a layer - * - * @param base - * is default colour 0 is base 1 is haft 2 is detail - */ - public static int getColourFromItemStack(ItemStack item, int layer, int base) { - if (layer == 0) { - CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); - if (material != null) { - return material.getColourInt(); - } - } - if (layer == 1) { - CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_haft); - if (material != null) { - return material.getColourInt(); - } - } - return base; - } - - public static float getWeightModifier(ItemStack item, float base) { - CustomMaterial metal = getCustomPrimaryMaterial(item); - CustomMaterial wood = getCustomSecondaryMaterial(item); - - if (metal != null) { - base = (metal.density / 2.5F) * base; - } - if (wood != null) { - base += (wood.density / 2.5F); - } - return base; - } - - /** - * Gets the material modifier if it exists - * - * @param defaultModifier - * default if no material exists - */ - public static float getMeleeDamage(ItemStack item, float defaultModifier) { - CustomMaterial custom = getCustomPrimaryMaterial(item); - if (custom != null) { - return custom.sharpness; - } - return defaultModifier; - } - - public static float getBowDamage(ItemStack item, float defaultModifier) { - CustomMaterial base = getCustomSecondaryMaterial(item); - CustomMaterial joints = getCustomPrimaryMaterial(item); - - if (base != null) { - defaultModifier = base.flexibility; - } - if (joints != null) { - defaultModifier *= joints.flexibility; - } - return defaultModifier; - } - - /** - * The total damage of a bow and arrow - */ - public static float getBaseDamages(ItemStack item, float defaultModifier) { - CustomMaterial custom = getCustomPrimaryMaterial(item); - if (custom != null) { - return getBaseDamage(custom.sharpness * custom.flexibility); - } - return getBaseDamage(defaultModifier); - } - - /** - * The damage a bow and arrow should do (same as a sword) - */ - public static float getBaseDamage(float modifier) { - return 4F + modifier; - } - - public static float getEfficiencyForHds(ItemStack item, float value, float mod) { - CustomMaterial custom = getCustomPrimaryMaterial(item); - if (custom != null) { - value = 2.0F + (custom.hardness * 4F);// Efficiency starts at 2 and each point of sharpness adds 2 - } - return ToolHelper.modifyDigOnQuality(item, value) * mod; - } - - public static float getEfficiency(ItemStack item, float value, float mod) { - CustomMaterial custom = getCustomPrimaryMaterial(item); - if (custom != null) { - value = 2.0F + (custom.sharpness * 2F);// Efficiency starts at 2 and each point of sharpness adds 2 - } - return ToolHelper.modifyDigOnQuality(item, value) * mod; - } - - public static int getCrafterTier(ItemStack item, int value) { - CustomMaterial custom = getCustomPrimaryMaterial(item); - if (custom != null) { - return custom.crafterTier; - } - return value; - } - - public static int getHarvestLevel(ItemStack item, int value) { - if (value <= 0) { - return value;// If its not effective - } - - CustomMaterial custom = getCustomPrimaryMaterial(item); - if (custom != null) { - if (custom.tier == 0) - return 1; - if (custom.tier <= 2) - return 2; - return Math.max(custom.tier, 2); - } - return value; - } - - @SideOnly(Side.CLIENT) - public static void addInformation(ItemStack item, List list) { - CustomMaterial haft = getCustomSecondaryMaterial(item); - - if (materialOnTooltip()) { - CustomMaterial main = getCustomPrimaryMaterial(item); - if (main != null) { - String matName = StatCollector.translateToLocal( - StatCollector.translateToLocal("material." + main.name.toLowerCase() + ".name")); - list.add(EnumChatFormatting.GOLD + matName); - } - } - - if (haft != null) { - String matName = StatCollector.translateToLocalFormatted("item.mod_haft.name", - StatCollector.translateToLocal("material." + haft.name.toLowerCase() + ".name")); - list.add(EnumChatFormatting.GOLD + matName); - } - - } - - /** - * Gets if the language puts tiers in the tooltip, leaving the name blank - * - * @return - */ - public static boolean materialOnTooltip() { - String cfg = StatCollector.translateToLocal("languagecfg.tooltiptier"); - return cfg.equalsIgnoreCase("true"); - } - - @SideOnly(Side.CLIENT) - public static void addBowInformation(ItemStack item, List list) { - - CustomMaterial metals = getCustomPrimaryMaterial(item); - if (metals != null) { - String matName = StatCollector.translateToLocalFormatted("item.mod_joint.name", - StatCollector.translateToLocal("material." + metals.name.toLowerCase() + ".name")); - list.add(EnumChatFormatting.GOLD + matName); - } - - } - - public static String getWoodenLocalisedName(ItemStack item, String unlocalName) { - if (materialOnTooltip()) { - StatCollector.translateToLocal(unlocalName); - } - - CustomMaterial base = getCustomSecondaryMaterial(item); - String name = "any"; - if (base != null) { - name = base.name.toLowerCase(); - } - return StatCollector.translateToLocalFormatted(unlocalName, - StatCollector.translateToLocal("material." + name + ".name")); - } - - public static String getLocalisedName(ItemStack item, String unlocalName) { - if (materialOnTooltip()) { - StatCollector.translateToLocal(unlocalName); - } - - CustomMaterial base = getCustomPrimaryMaterial(item); - String name = "any"; - if (base != null) { - name = base.name.toLowerCase(); - } - return StatCollector.translateToLocalFormatted(unlocalName, - StatCollector.translateToLocal("material." + name + ".name")); - } - - public static boolean areEqual(ItemStack recipeItem, ItemStack inputItem) { - if (recipeItem == null) { - return inputItem == null; - } - if (inputItem == null) - return false; - - return recipeItem.isItemEqual(inputItem) && doesMainMatchForRecipe(recipeItem, inputItem) - && doesHaftMatchForRecipe(recipeItem, inputItem); - } - - /** - * Checks if two items' materials match - */ - public static boolean doesMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) { - return doesMainMatchForRecipe(recipeItem, inputItem) && doesHaftMatchForRecipe(recipeItem, inputItem); - } - - public static boolean doesMainMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) { - CustomMaterial recipeMat = CustomToolHelper.getCustomPrimaryMaterial(recipeItem); - CustomMaterial inputMat = CustomToolHelper.getCustomPrimaryMaterial(inputItem); - - if (recipeMat == null) { - return true; - } - - if (inputMat == null && recipeMat != null) { - return false; - } - if (recipeMat != inputMat) { - return false; - } - return true; - } - - public static boolean doesHaftMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) { - CustomMaterial recipeMat = CustomToolHelper.getCustomSecondaryMaterial(recipeItem); - CustomMaterial inputMat = CustomToolHelper.getCustomSecondaryMaterial(inputItem); - - if (recipeMat == null) { - return true; - } - - if (inputMat == null && recipeMat != null) { - return false; - } - if (recipeMat != inputMat) { - return false; - } - return true; - } - - public static void addComponentString(ItemStack tool, List list, CustomMaterial base) { - addComponentString(tool, list, base, 1); - } - - public static void addComponentString(ItemStack tool, List list, CustomMaterial base, float units) { - if (base != null) { - float mass = base.density * units; - list.add(EnumChatFormatting.GOLD + base.getMaterialString()); - if (mass > 0) - list.add(CustomMaterial.getWeightString(mass)); - - if (base.isHeatable()) { - int maxTemp = base.getHeatableStats()[0]; - int beyondMax = base.getHeatableStats()[1]; - list.add(StatCollector.translateToLocalFormatted("materialtype.workable.name", maxTemp, beyondMax)); - } - } - } - - public static float getBurnModifier(ItemStack fuel) { - CustomMaterial mat = CustomMaterial.getMaterialFor(fuel, slot_main); - if (mat != null && mat.type.equalsIgnoreCase("wood")) { - return (2 * mat.density) + 0.5F; - } - return 1.0F; - } - - public static String getReferenceName(ItemStack item) { - String dam = "any"; - int d = item.getItemDamage(); - if (d != OreDictionary.WILDCARD_VALUE) { - dam = "" + d; - } - - return getReferenceName(item, dam); - } - - public static String getReferenceName(ItemStack item, String dam) { - return getReferenceName(item, dam, true); - } - - public static String getReferenceName(ItemStack item, String dam, boolean tiered) { - String reference = getSimpleReferenceName(item.getItem(), dam); - - if (tiered) { - CustomMaterial base = getCustomPrimaryMaterial(item); - CustomMaterial haft = getCustomSecondaryMaterial(item); - - if (base != null) { - reference += "_" + base.name.toLowerCase(); - } - if (haft != null) { - reference += "_" + haft.name.toLowerCase(); - } - } - - return reference; - } - - public static String getSimpleReferenceName(Item item, String dam) { - String reference = Item.itemRegistry.getNameForObject(item).toLowerCase() + "_@" + dam; - return reference; - } - - public static String getSimpleReferenceName(Item item) { - return getSimpleReferenceName(item, "any"); - } - - public static boolean areToolsSame(ItemStack item1, ItemStack item2) { - CustomMaterial main1 = getCustomPrimaryMaterial(item1); - CustomMaterial main2 = getCustomSecondaryMaterial(item2); - CustomMaterial haft1 = getCustomPrimaryMaterial(item1); - CustomMaterial haft2 = getCustomSecondaryMaterial(item2); - if ((main1 == null && main2 != null) || (main2 == null && main1 != null)) - return false; - if ((haft1 == null && haft2 != null) || (haft2 == null && haft1 != null)) - return false; - - if (main1 != null && main2 != null && main1 != main2) - return false; - if (haft1 != null && haft2 != null && haft1 != haft2) - return false; - - return true; - } - - public static boolean isMythic(ItemStack result) { - CustomMaterial main1 = getCustomPrimaryMaterial(result); - CustomMaterial haft1 = getCustomPrimaryMaterial(result); - if (main1 != null && main1.isUnbrekable()) { - return true; - } - if (haft1 != null && haft1.isUnbrekable()) { - return true; - } - return false; - } - - public static void writeToPacket(ByteBuf packet, ItemStack stack) { - packet.writeInt(stack != null ? Item.getIdFromItem(stack.getItem()) : 0); - packet.writeInt(stack != null ? stack.stackSize : 0); - packet.writeInt(stack != null ? stack.getItemDamage() : 0); - packet.writeInt((stack != null && stack.isItemEnchanted()) ? 1 : 0); - - CustomMaterial main1 = getCustomPrimaryMaterial(stack); - CustomMaterial haft1 = getCustomSecondaryMaterial(stack); - - ByteBufUtils.writeUTF8String(packet, main1 != null ? main1.name : "null"); - ByteBufUtils.writeUTF8String(packet, haft1 != null ? haft1.name : "null"); - } - - public static ItemStack readFromPacket(ByteBuf packet) { - int id = packet.readInt(); - int ss = packet.readInt(); - int md = packet.readInt(); - boolean ec = packet.readInt() == 1; - String main1 = ByteBufUtils.readUTF8String(packet); - String haft1 = ByteBufUtils.readUTF8String(packet); - Item item = Item.getItemById(id); - - if (item != null && ss > 0) { - ItemStack stack = new ItemStack(item, ss, md); - if (!main1.equalsIgnoreCase("null")) { - CustomMaterial.addMaterial(stack, slot_main, main1); - } - if (!haft1.equalsIgnoreCase("null")) { - CustomMaterial.addMaterial(stack, slot_haft, haft1); - } - return stack; - } - - return null; - } - - public static String getComponentMaterial(ItemStack item, String type) { - if (item == null || type == null) - return null; - - if (item.getItem() instanceof ItemHeated) { - return getComponentMaterial(ItemHeated.getItem(item), type); - } - - CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if (material != null) { - return material.type.equalsIgnoreCase(type) ? material.name : null; - } - return null; - } - - public static boolean hasAnyMaterial(ItemStack item) { - return getCustomPrimaryMaterial(item) != null || getCustomSecondaryMaterial(item) != null; - } - - public static ItemStack tryDeconstruct(ItemStack newitem, ItemStack mainItem) { - String type = null; - if (newitem != null && newitem.getItem() instanceof ITieredComponent) { - type = ((ITieredComponent) newitem.getItem()).getMaterialType(newitem); - } - - if (type != null) { - CustomMaterial primary = CustomToolHelper.getCustomPrimaryMaterial(mainItem); - CustomMaterial secondary = CustomToolHelper.getCustomSecondaryMaterial(mainItem); - - if (primary != null && primary.type.equalsIgnoreCase(type)) { - CustomMaterial.addMaterial(newitem, slot_main, primary.name); - } else { - if (secondary != null && secondary.type.equalsIgnoreCase(type)) { - CustomMaterial.addMaterial(newitem, slot_main, secondary.name); - } - } - } - return newitem; - } - - public static String getCustomStyle(ItemStack weapon) { - if (weapon != null && weapon.getItem() instanceof ISpecialDesign) { - return ((ISpecialDesign) weapon.getItem()).getDesign(weapon); - } - return null; - } + public static final String slot_main = "main_metal"; + public static final String slot_haft = "haft_wood"; + public static EnumRarity poor = EnumHelper.addRarity("Poor", EnumChatFormatting.DARK_GRAY, "poor"); + public static EnumRarity[] rarity = new EnumRarity[]{poor, EnumRarity.common, EnumRarity.uncommon, + EnumRarity.rare, EnumRarity.epic}; + + /** + * A bit of the new system, gets custom materials for the head + */ + public static CustomMaterial getCustomPrimaryMaterial(ItemStack item) { + if (item == null) + return null; + + CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); + if (material != null) { + return material; + } + return null; + } + + public static CustomMaterial getCustomSecondaryMaterial(ItemStack item) { + if (item == null) + return null; + + CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_haft); + if (material != null) { + return material; + } + return null; + } + + public static ItemStack construct(Item base, String main) { + return construct(base, main, "OakWood"); + } + + public static ItemStack construct(Item base, String main, String haft) { + ItemStack item = new ItemStack(base); + CustomMaterial.addMaterial(item, slot_main, main.toLowerCase()); + if (haft != null) { + CustomMaterial.addMaterial(item, slot_haft, haft.toLowerCase()); + } + return item; + } + + public static ItemStack constructSingleColoredLayer(Item base, String main) { + return constructSingleColoredLayer(base, main, 1); + } + + public static ItemStack constructSingleColoredLayer(Item base, String main, int stacksize) { + ItemStack item = new ItemStack(base, stacksize); + CustomMaterial.addMaterial(item, slot_main, main.toLowerCase()); + return item; + } + + /** + * Gets the rarity for a custom item + * + * @param itemRarity is the default id + */ + public static EnumRarity getRarity(ItemStack item, int itemRarity) { + int lvl = itemRarity + 1; + CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); + if (material != null) { + lvl = material.rarityID + 1; + } + + if (item.isItemEnchanted()) { + if (lvl == 0) { + lvl++; + } + lvl++; + } + if (lvl >= rarity.length) { + lvl = rarity.length - 1; + } + return rarity[lvl]; + } + + /** + * Gets the max durability + * + * @param dura is the default dura + */ + public static int getMaxDamage(ItemStack stack, int dura) { + CustomMaterial head = getCustomPrimaryMaterial(stack); + CustomMaterial haft = getCustomSecondaryMaterial(stack); + if (head != null) { + dura = (int) (head.durability * 100); + } + if (haft != null) { + dura += (int) (haft.durability * 100);// Hafts add 50% to the durability + } + return ToolHelper.setDuraOnQuality(stack, dura); + } + + /** + * Gets the colour for a layer + * + * @param base is default colour 0 is base 1 is haft 2 is detail + */ + public static int getColourFromItemStack(ItemStack item, int layer, int base) { + if (layer == 0) { + CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_main); + if (material != null) { + return material.getColourInt(); + } + } + if (layer == 1) { + CustomMaterial material = CustomMaterial.getMaterialFor(item, slot_haft); + if (material != null) { + return material.getColourInt(); + } + } + return base; + } + + public static float getWeightModifier(ItemStack item, float base) { + CustomMaterial metal = getCustomPrimaryMaterial(item); + CustomMaterial wood = getCustomSecondaryMaterial(item); + + if (metal != null) { + base = (metal.density / 2.5F) * base; + } + if (wood != null) { + base += (wood.density / 2.5F); + } + return base; + } + + /** + * Gets the material modifier if it exists + * + * @param defaultModifier default if no material exists + */ + public static float getMeleeDamage(ItemStack item, float defaultModifier) { + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + return custom.sharpness; + } + return defaultModifier; + } + + public static float getBowDamage(ItemStack item, float defaultModifier) { + CustomMaterial base = getCustomSecondaryMaterial(item); + CustomMaterial joints = getCustomPrimaryMaterial(item); + + if (base != null) { + defaultModifier = base.flexibility; + } + if (joints != null) { + defaultModifier *= joints.flexibility; + } + return defaultModifier; + } + + /** + * The total damage of a bow and arrow + */ + public static float getBaseDamages(ItemStack item, float defaultModifier) { + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + return getBaseDamage(custom.sharpness * custom.flexibility); + } + return getBaseDamage(defaultModifier); + } + + /** + * The damage a bow and arrow should do (same as a sword) + */ + public static float getBaseDamage(float modifier) { + return 4F + modifier; + } + + public static float getEfficiencyForHds(ItemStack item, float value, float mod) { + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + value = 2.0F + (custom.hardness * 4F);// Efficiency starts at 2 and each point of sharpness adds 2 + } + return ToolHelper.modifyDigOnQuality(item, value) * mod; + } + + public static float getEfficiency(ItemStack item, float value, float mod) { + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + value = 2.0F + (custom.sharpness * 2F);// Efficiency starts at 2 and each point of sharpness adds 2 + } + return ToolHelper.modifyDigOnQuality(item, value) * mod; + } + + public static int getCrafterTier(ItemStack item, int value) { + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + return custom.crafterTier; + } + return value; + } + + public static int getHarvestLevel(ItemStack item, int value) { + if (value <= 0) { + return value;// If its not effective + } + + CustomMaterial custom = getCustomPrimaryMaterial(item); + if (custom != null) { + if (custom.tier == 0) + return 1; + if (custom.tier <= 2) + return 2; + return Math.max(custom.tier, 2); + } + return value; + } + + @SideOnly(Side.CLIENT) + public static void addInformation(ItemStack item, List list) { + CustomMaterial haft = getCustomSecondaryMaterial(item); + + if (materialOnTooltip()) { + CustomMaterial main = getCustomPrimaryMaterial(item); + if (main != null) { + String matName = StatCollector.translateToLocal( + StatCollector.translateToLocal("material." + main.name.toLowerCase() + ".name")); + list.add(EnumChatFormatting.GOLD + matName); + } + } + + if (haft != null) { + String matName = StatCollector.translateToLocalFormatted("item.mod_haft.name", + StatCollector.translateToLocal("material." + haft.name.toLowerCase() + ".name")); + list.add(EnumChatFormatting.GOLD + matName); + } + + } + + /** + * Gets if the language puts tiers in the tooltip, leaving the name blank + * + * @return + */ + public static boolean materialOnTooltip() { + String cfg = StatCollector.translateToLocal("languagecfg.tooltiptier"); + return cfg.equalsIgnoreCase("true"); + } + + @SideOnly(Side.CLIENT) + public static void addBowInformation(ItemStack item, List list) { + + CustomMaterial metals = getCustomPrimaryMaterial(item); + if (metals != null) { + String matName = StatCollector.translateToLocalFormatted("item.mod_joint.name", + StatCollector.translateToLocal("material." + metals.name.toLowerCase() + ".name")); + list.add(EnumChatFormatting.GOLD + matName); + } + + } + + public static String getWoodenLocalisedName(ItemStack item, String unlocalName) { + if (materialOnTooltip()) { + StatCollector.translateToLocal(unlocalName); + } + + CustomMaterial base = getCustomSecondaryMaterial(item); + String name = "any"; + if (base != null) { + name = base.name.toLowerCase(); + } + return StatCollector.translateToLocalFormatted(unlocalName, + StatCollector.translateToLocal("material." + name + ".name")); + } + + public static String getLocalisedName(ItemStack item, String unlocalName) { + if (materialOnTooltip()) { + StatCollector.translateToLocal(unlocalName); + } + + CustomMaterial base = getCustomPrimaryMaterial(item); + String name = "any"; + if (base != null) { + name = base.name.toLowerCase(); + } + return StatCollector.translateToLocalFormatted(unlocalName, + StatCollector.translateToLocal("material." + name + ".name")); + } + + public static boolean areEqual(ItemStack recipeItem, ItemStack inputItem) { + if (recipeItem == null) { + return inputItem == null; + } + if (inputItem == null) + return false; + + return recipeItem.isItemEqual(inputItem) && doesMainMatchForRecipe(recipeItem, inputItem) + && doesHaftMatchForRecipe(recipeItem, inputItem); + } + + /** + * Checks if two items' materials match + */ + public static boolean doesMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) { + return doesMainMatchForRecipe(recipeItem, inputItem) && doesHaftMatchForRecipe(recipeItem, inputItem); + } + + public static boolean doesMainMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) { + CustomMaterial recipeMat = CustomToolHelper.getCustomPrimaryMaterial(recipeItem); + CustomMaterial inputMat = CustomToolHelper.getCustomPrimaryMaterial(inputItem); + + if (recipeMat == null) { + return true; + } + + if (inputMat == null && recipeMat != null) { + return false; + } + if (recipeMat != inputMat) { + return false; + } + return true; + } + + public static boolean doesHaftMatchForRecipe(ItemStack recipeItem, ItemStack inputItem) { + CustomMaterial recipeMat = CustomToolHelper.getCustomSecondaryMaterial(recipeItem); + CustomMaterial inputMat = CustomToolHelper.getCustomSecondaryMaterial(inputItem); + + if (recipeMat == null) { + return true; + } + + if (inputMat == null && recipeMat != null) { + return false; + } + if (recipeMat != inputMat) { + return false; + } + return true; + } + + public static void addComponentString(ItemStack tool, List list, CustomMaterial base) { + addComponentString(tool, list, base, 1); + } + + public static void addComponentString(ItemStack tool, List list, CustomMaterial base, float units) { + if (base != null) { + float mass = base.density * units; + list.add(EnumChatFormatting.GOLD + base.getMaterialString()); + if (mass > 0) + list.add(CustomMaterial.getWeightString(mass)); + + if (base.isHeatable()) { + int maxTemp = base.getHeatableStats()[0]; + int beyondMax = base.getHeatableStats()[1]; + list.add(StatCollector.translateToLocalFormatted("materialtype.workable.name", maxTemp, beyondMax)); + } + } + } + + public static float getBurnModifier(ItemStack fuel) { + CustomMaterial mat = CustomMaterial.getMaterialFor(fuel, slot_main); + if (mat != null && mat.type.equalsIgnoreCase("wood")) { + return (2 * mat.density) + 0.5F; + } + return 1.0F; + } + + public static String getReferenceName(ItemStack item) { + String dam = "any"; + int d = item.getItemDamage(); + if (d != OreDictionary.WILDCARD_VALUE) { + dam = "" + d; + } + + return getReferenceName(item, dam); + } + + public static String getReferenceName(ItemStack item, String dam) { + return getReferenceName(item, dam, true); + } + + public static String getReferenceName(ItemStack item, String dam, boolean tiered) { + String reference = getSimpleReferenceName(item.getItem(), dam); + + if (tiered) { + CustomMaterial base = getCustomPrimaryMaterial(item); + CustomMaterial haft = getCustomSecondaryMaterial(item); + + if (base != null) { + reference += "_" + base.name.toLowerCase(); + } + if (haft != null) { + reference += "_" + haft.name.toLowerCase(); + } + } + + return reference; + } + + public static String getSimpleReferenceName(Item item, String dam) { + String reference = Item.itemRegistry.getNameForObject(item).toLowerCase() + "_@" + dam; + return reference; + } + + public static String getSimpleReferenceName(Item item) { + return getSimpleReferenceName(item, "any"); + } + + public static boolean areToolsSame(ItemStack item1, ItemStack item2) { + CustomMaterial main1 = getCustomPrimaryMaterial(item1); + CustomMaterial main2 = getCustomSecondaryMaterial(item2); + CustomMaterial haft1 = getCustomPrimaryMaterial(item1); + CustomMaterial haft2 = getCustomSecondaryMaterial(item2); + if ((main1 == null && main2 != null) || (main2 == null && main1 != null)) + return false; + if ((haft1 == null && haft2 != null) || (haft2 == null && haft1 != null)) + return false; + + if (main1 != null && main2 != null && main1 != main2) + return false; + if (haft1 != null && haft2 != null && haft1 != haft2) + return false; + + return true; + } + + public static boolean isMythic(ItemStack result) { + CustomMaterial main1 = getCustomPrimaryMaterial(result); + CustomMaterial haft1 = getCustomPrimaryMaterial(result); + if (main1 != null && main1.isUnbrekable()) { + return true; + } + if (haft1 != null && haft1.isUnbrekable()) { + return true; + } + return false; + } + + public static void writeToPacket(ByteBuf packet, ItemStack stack) { + packet.writeInt(stack != null ? Item.getIdFromItem(stack.getItem()) : 0); + packet.writeInt(stack != null ? stack.stackSize : 0); + packet.writeInt(stack != null ? stack.getItemDamage() : 0); + packet.writeInt((stack != null && stack.isItemEnchanted()) ? 1 : 0); + + CustomMaterial main1 = getCustomPrimaryMaterial(stack); + CustomMaterial haft1 = getCustomSecondaryMaterial(stack); + + ByteBufUtils.writeUTF8String(packet, main1 != null ? main1.name : "null"); + ByteBufUtils.writeUTF8String(packet, haft1 != null ? haft1.name : "null"); + } + + public static ItemStack readFromPacket(ByteBuf packet) { + int id = packet.readInt(); + int ss = packet.readInt(); + int md = packet.readInt(); + boolean ec = packet.readInt() == 1; + String main1 = ByteBufUtils.readUTF8String(packet); + String haft1 = ByteBufUtils.readUTF8String(packet); + Item item = Item.getItemById(id); + + if (item != null && ss > 0) { + ItemStack stack = new ItemStack(item, ss, md); + if (!main1.equalsIgnoreCase("null")) { + CustomMaterial.addMaterial(stack, slot_main, main1); + } + if (!haft1.equalsIgnoreCase("null")) { + CustomMaterial.addMaterial(stack, slot_haft, haft1); + } + return stack; + } + + return null; + } + + public static String getComponentMaterial(ItemStack item, String type) { + if (item == null || type == null) + return null; + + if (item.getItem() instanceof ItemHeated) { + return getComponentMaterial(ItemHeated.getItem(item), type); + } + + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); + if (material != null) { + return material.type.equalsIgnoreCase(type) ? material.name : null; + } + return null; + } + + public static boolean hasAnyMaterial(ItemStack item) { + return getCustomPrimaryMaterial(item) != null || getCustomSecondaryMaterial(item) != null; + } + + public static ItemStack tryDeconstruct(ItemStack newitem, ItemStack mainItem) { + String type = null; + if (newitem != null && newitem.getItem() instanceof ITieredComponent) { + type = ((ITieredComponent) newitem.getItem()).getMaterialType(newitem); + } + + if (type != null) { + CustomMaterial primary = CustomToolHelper.getCustomPrimaryMaterial(mainItem); + CustomMaterial secondary = CustomToolHelper.getCustomSecondaryMaterial(mainItem); + + if (primary != null && primary.type.equalsIgnoreCase(type)) { + CustomMaterial.addMaterial(newitem, slot_main, primary.name); + } else { + if (secondary != null && secondary.type.equalsIgnoreCase(type)) { + CustomMaterial.addMaterial(newitem, slot_main, secondary.name); + } + } + } + return newitem; + } + + public static String getCustomStyle(ItemStack weapon) { + if (weapon != null && weapon.getItem() instanceof ISpecialDesign) { + return ((ISpecialDesign) weapon.getItem()).getDesign(weapon); + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/EntityHelper.java b/src/main/java/minefantasy/mf2/api/helpers/EntityHelper.java index f7ac6632..14b944de 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/EntityHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/EntityHelper.java @@ -4,18 +4,18 @@ import net.minecraft.nbt.NBTTagCompound; public class EntityHelper { - public static final String MFNBT = "MineFantasy_KeptNBT"; + public static final String MFNBT = "MineFantasy_KeptNBT"; - public static NBTTagCompound getMFNBT(EntityPlayer player) { - if (!player.getEntityData().hasKey(MFNBT)) { - player.getEntityData().setTag(MFNBT, new NBTTagCompound()); - } - return player.getEntityData().getCompoundTag(MFNBT); - } + public static NBTTagCompound getMFNBT(EntityPlayer player) { + if (!player.getEntityData().hasKey(MFNBT)) { + player.getEntityData().setTag(MFNBT, new NBTTagCompound()); + } + return player.getEntityData().getCompoundTag(MFNBT); + } - public static void cloneNBT(EntityPlayer origin, EntityPlayer spawn) { - if (origin.getEntityData().hasKey(MFNBT)) { - spawn.getEntityData().setTag(MFNBT, origin.getEntityData().getTag(MFNBT).copy()); - } - } + public static void cloneNBT(EntityPlayer origin, EntityPlayer spawn) { + if (origin.getEntityData().hasKey(MFNBT)) { + spawn.getEntityData().setTag(MFNBT, origin.getEntityData().getTag(MFNBT).copy()); + } + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/Functions.java b/src/main/java/minefantasy/mf2/api/helpers/Functions.java index 5b09ce05..eba06339 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/Functions.java +++ b/src/main/java/minefantasy/mf2/api/helpers/Functions.java @@ -1,39 +1,31 @@ package minefantasy.mf2.api.helpers; public class Functions { - /** - * f(x) = cos(xPi/(f/2))*(m/2) + (m/2) + c Create a wave output from c to m and - * back between x=f - * - * @param x - * the running variable - * @param p - * period: time between waves (in 20ths of seconds) - * @param a - * amplitude: the max point at f/2 - * @param c - * constant: the min point at f==0 - */ - public static int getIntervalWave1_i(int x, int p, int a, int c) { - double fx = Math.cos(x * Math.PI / (p / 2)) * ((a - c) / 2) + ((a - c) / 2) + c; - return (int) fx; - } + /** + * f(x) = cos(xPi/(f/2))*(m/2) + (m/2) + c Create a wave output from c to m and + * back between x=f + * + * @param x the running variable + * @param p period: time between waves (in 20ths of seconds) + * @param a amplitude: the max point at f/2 + * @param c constant: the min point at f==0 + */ + public static int getIntervalWave1_i(int x, int p, int a, int c) { + double fx = Math.cos(x * Math.PI / (p / 2)) * ((a - c) / 2) + ((a - c) / 2) + c; + return (int) fx; + } - /** - * f(x) = cos(xPi/(f/2))*(m/2) + (m/2) + c Create a wave output from c to m and - * back between x=f - * - * @param x - * the running variable - * @param p - * period: time between waves (in 20ths of seconds) - * @param a - * amplitude: the max point at f/2 - * @param c - * constant: the min point at f==0 - */ - public static double getIntervalWave1_d(double x, double p, double a, double c) { - double fx = Math.cos(x * Math.PI / (p / 2)) * ((a - c) / 2) + ((a - c) / 2) + c; - return fx; - } + /** + * f(x) = cos(xPi/(f/2))*(m/2) + (m/2) + c Create a wave output from c to m and + * back between x=f + * + * @param x the running variable + * @param p period: time between waves (in 20ths of seconds) + * @param a amplitude: the max point at f/2 + * @param c constant: the min point at f==0 + */ + public static double getIntervalWave1_d(double x, double p, double a, double c) { + double fx = Math.cos(x * Math.PI / (p / 2)) * ((a - c) / 2) + ((a - c) / 2) + c; + return fx; + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/GuiHelper.java b/src/main/java/minefantasy/mf2/api/helpers/GuiHelper.java index 534e2f09..5379a10b 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/GuiHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/GuiHelper.java @@ -1,78 +1,77 @@ package minefantasy.mf2.api.helpers; -import org.lwjgl.opengl.GL11; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; +import org.lwjgl.opengl.GL11; public class GuiHelper { - private static final Minecraft mc = Minecraft.getMinecraft(); + private static final Minecraft mc = Minecraft.getMinecraft(); - public static void renderToolIcon(Gui screen, String toolType, int tier, int x, int y, boolean available) { - renderToolIcon(screen, toolType, tier, x, y, false, available); - } + public static void renderToolIcon(Gui screen, String toolType, int tier, int x, int y, boolean available) { + renderToolIcon(screen, toolType, tier, x, y, false, available); + } - public static void renderToolIcon(Gui screen, String toolType, int tier, int x, int y, boolean outline, - boolean available) { - if (!available) { - GL11.glColor3f(1.0F, 0.3F, 0.3F); - } - mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/icons.png")); - int[] icon = getToolTypeIcon(toolType); - screen.drawTexturedModalRect(x, y, outline ? 20 : 0, 0, 20, 20); - screen.drawTexturedModalRect(x, y, icon[0], icon[1] + 20, 20, 20); - if (tier > -1) - mc.fontRenderer.drawStringWithShadow("" + tier, x + 4, y + 10, 16777215); - GL11.glColor3f(1F, 1F, 1F); - } + public static void renderToolIcon(Gui screen, String toolType, int tier, int x, int y, boolean outline, + boolean available) { + if (!available) { + GL11.glColor3f(1.0F, 0.3F, 0.3F); + } + mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/icons.png")); + int[] icon = getToolTypeIcon(toolType); + screen.drawTexturedModalRect(x, y, outline ? 20 : 0, 0, 20, 20); + screen.drawTexturedModalRect(x, y, icon[0], icon[1] + 20, 20, 20); + if (tier > -1) + mc.fontRenderer.drawStringWithShadow("" + tier, x + 4, y + 10, 16777215); + GL11.glColor3f(1F, 1F, 1F); + } - public static int[] getToolTypeIcon(String s) { - int width = 20; - int height = 20; - if (s.equalsIgnoreCase("hands")) { - return new int[] { 0, 0 }; - } - if (s.equalsIgnoreCase("knife")) { - return new int[] { width * 1, height * 0 }; - } - if (s.equalsIgnoreCase("saw")) { - return new int[] { width * 2, height * 0 }; - } - if (s.equalsIgnoreCase("mallet")) { - return new int[] { width * 3, height * 0 }; - } - if (s.equalsIgnoreCase("needle")) { - return new int[] { width * 4, height * 0 }; - } - if (s.equalsIgnoreCase("hammer")) { - return new int[] { width * 5, height * 0 }; - } - if (s.equalsIgnoreCase("hvyHammer")) { - return new int[] { width * 6, height * 0 }; - } - if (s.equalsIgnoreCase("spoon")) { - return new int[] { width * 7, height * 0 }; - } - if (s.equalsIgnoreCase("shears")) { - return new int[] { width * 8, height * 0 }; - } - if (s.equalsIgnoreCase("spanner")) { - return new int[] { width * 9, height * 0 }; - } - if (s.equalsIgnoreCase("brush")) { - return new int[] { width * 11, height * 0 }; - } + public static int[] getToolTypeIcon(String s) { + int width = 20; + int height = 20; + if (s.equalsIgnoreCase("hands")) { + return new int[]{0, 0}; + } + if (s.equalsIgnoreCase("knife")) { + return new int[]{width * 1, height * 0}; + } + if (s.equalsIgnoreCase("saw")) { + return new int[]{width * 2, height * 0}; + } + if (s.equalsIgnoreCase("mallet")) { + return new int[]{width * 3, height * 0}; + } + if (s.equalsIgnoreCase("needle")) { + return new int[]{width * 4, height * 0}; + } + if (s.equalsIgnoreCase("hammer")) { + return new int[]{width * 5, height * 0}; + } + if (s.equalsIgnoreCase("hvyHammer")) { + return new int[]{width * 6, height * 0}; + } + if (s.equalsIgnoreCase("spoon")) { + return new int[]{width * 7, height * 0}; + } + if (s.equalsIgnoreCase("shears")) { + return new int[]{width * 8, height * 0}; + } + if (s.equalsIgnoreCase("spanner")) { + return new int[]{width * 9, height * 0}; + } + if (s.equalsIgnoreCase("brush")) { + return new int[]{width * 11, height * 0}; + } - if (s.equalsIgnoreCase("anvil")) { - return new int[] { 0, height * 2 }; - } - if (s.equalsIgnoreCase("carpenter")) { - return new int[] { width * 1, height * 2 }; - } - return new int[] { 0, 0 }; - } + if (s.equalsIgnoreCase("anvil")) { + return new int[]{0, height * 2}; + } + if (s.equalsIgnoreCase("carpenter")) { + return new int[]{width * 1, height * 2}; + } + return new int[]{0, 0}; + } - public static int getColourForRGB(int red, int green, int blue) { - return (red << 16) + (green << 8) + blue; - } + public static int getColourForRGB(int red, int green, int blue) { + return (red << 16) + (green << 8) + blue; + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/PlayerTagData.java b/src/main/java/minefantasy/mf2/api/helpers/PlayerTagData.java index 70f7bc5b..820b32bc 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/PlayerTagData.java +++ b/src/main/java/minefantasy/mf2/api/helpers/PlayerTagData.java @@ -4,26 +4,26 @@ import net.minecraft.nbt.NBTTagCompound; public class PlayerTagData { - /** - * Saves a custom integer - */ - public static void setPersistedVariable(EntityPlayer user, String name, int lvl) { - NBTTagCompound nbt = getPersistedData(user); - nbt.setInteger(name, lvl); - } + /** + * Saves a custom integer + */ + public static void setPersistedVariable(EntityPlayer user, String name, int lvl) { + NBTTagCompound nbt = getPersistedData(user); + nbt.setInteger(name, lvl); + } - /** - * Gets a custom integer saved - */ - public static int getPersistedVariable(EntityPlayer user, String name) { - NBTTagCompound nbt = getPersistedData(user); - return nbt.hasKey(name) ? nbt.getInteger(name) : 0; - } + /** + * Gets a custom integer saved + */ + public static int getPersistedVariable(EntityPlayer user, String name) { + NBTTagCompound nbt = getPersistedData(user); + return nbt.hasKey(name) ? nbt.getInteger(name) : 0; + } - public static NBTTagCompound getPersistedData(EntityPlayer user) { - if (!user.getEntityData().hasKey(EntityPlayer.PERSISTED_NBT_TAG)) { - user.getEntityData().setTag(EntityPlayer.PERSISTED_NBT_TAG, new NBTTagCompound()); - } - return (NBTTagCompound) (user.getEntityData().getTag(EntityPlayer.PERSISTED_NBT_TAG)); - } + public static NBTTagCompound getPersistedData(EntityPlayer user) { + if (!user.getEntityData().hasKey(EntityPlayer.PERSISTED_NBT_TAG)) { + user.getEntityData().setTag(EntityPlayer.PERSISTED_NBT_TAG, new NBTTagCompound()); + } + return (NBTTagCompound) (user.getEntityData().getTag(EntityPlayer.PERSISTED_NBT_TAG)); + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/PowerArmour.java b/src/main/java/minefantasy/mf2/api/helpers/PowerArmour.java index 7478fb67..79fd77f3 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/PowerArmour.java +++ b/src/main/java/minefantasy/mf2/api/helpers/PowerArmour.java @@ -11,82 +11,82 @@ import net.minecraft.world.World; public class PowerArmour { - public static boolean isWearingCogwork(EntityLivingBase user) { - return user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour; - } + public static boolean isWearingCogwork(EntityLivingBase user) { + return user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour; + } - public static boolean isPowered(EntityLivingBase user) { - if (user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour) { - return ((IPowerArmour) user.ridingEntity).isPowered(); - } - return false; - } + public static boolean isPowered(EntityLivingBase user) { + if (user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour) { + return ((IPowerArmour) user.ridingEntity).isPowered(); + } + return false; + } - public static boolean isFullyArmoured(EntityLivingBase user) { - if (user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour) { - return ((IPowerArmour) user.ridingEntity).isFullyArmoured(); - } - return false; - } + public static boolean isFullyArmoured(EntityLivingBase user) { + if (user.ridingEntity != null && user.ridingEntity instanceof IPowerArmour) { + return ((IPowerArmour) user.ridingEntity).isFullyArmoured(); + } + return false; + } - public static float modifyDamage(EntityLivingBase user, float dam, DamageSource src) { - if (user.ridingEntity != null) { - if (user.ridingEntity instanceof IPowerArmour) { - return ((IPowerArmour) user.ridingEntity).modifyDamage(user, dam, src); - } - } - return dam; - } + public static float modifyDamage(EntityLivingBase user, float dam, DamageSource src) { + if (user.ridingEntity != null) { + if (user.ridingEntity instanceof IPowerArmour) { + return ((IPowerArmour) user.ridingEntity).modifyDamage(user, dam, src); + } + } + return dam; + } - public static boolean allowDamageToBlock(DamageSource src) { - if (src == DamageSource.starve || src == DamageSource.outOfWorld || src == DamageSource.drown) { - return false; - } - return true; - } + public static boolean allowDamageToBlock(DamageSource src) { + if (src == DamageSource.starve || src == DamageSource.outOfWorld || src == DamageSource.drown) { + return false; + } + return true; + } - public static float getFuelValue(ItemStack item) { - ForgeFuel stats = ForgeItemHandler.getStats(item); - if (stats != null && stats.isRefined) { - return stats.duration; - } - return 0; - } + public static float getFuelValue(ItemStack item) { + ForgeFuel stats = ForgeItemHandler.getStats(item); + if (stats != null && stats.isRefined) { + return stats.duration; + } + return 0; + } - public static boolean isStationBlock(World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - return isBasicStationFrame(world, x, y, z) && block instanceof BlockFrame - && ((BlockFrame) block).isCogworkHolder; - } + public static boolean isStationBlock(World world, int x, int y, int z) { + Block block = world.getBlock(x, y, z); + return isBasicStationFrame(world, x, y, z) && block instanceof BlockFrame + && ((BlockFrame) block).isCogworkHolder; + } - public static boolean isBasicStationFrame(World world, int x, int y, int z) { - if (!(world.getBlock(x, y, z) instanceof BlockFrame)) { - return false; - } - int shafts = 0; + public static boolean isBasicStationFrame(World world, int x, int y, int z) { + if (!(world.getBlock(x, y, z) instanceof BlockFrame)) { + return false; + } + int shafts = 0; - if (isShaft(world, x + 1, y, z)) { - ++shafts; - } - if (isShaft(world, x - 1, y, z)) { - ++shafts; - } - if (isShaft(world, x, y, z + 1)) { - ++shafts; - } - if (isShaft(world, x, y, z - 1)) { - ++shafts; - } + if (isShaft(world, x + 1, y, z)) { + ++shafts; + } + if (isShaft(world, x - 1, y, z)) { + ++shafts; + } + if (isShaft(world, x, y, z + 1)) { + ++shafts; + } + if (isShaft(world, x, y, z - 1)) { + ++shafts; + } - return shafts == 3; - } + return shafts == 3; + } - public static boolean isShaft(World world, int x, int y, int z) { - for (int y2 = 0; y2 < 4; y2++) { - if (!(world.getBlock(x, y, z) instanceof BlockFrame)) { - return false; - } - } - return true; - } + public static boolean isShaft(World world, int x, int y, int z) { + for (int y2 = 0; y2 < 4; y2++) { + if (!(world.getBlock(x, y, z) instanceof BlockFrame)) { + return false; + } + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/RenderHelper.java b/src/main/java/minefantasy/mf2/api/helpers/RenderHelper.java index c620d54a..f14ac38a 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/RenderHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/RenderHelper.java @@ -1,138 +1,137 @@ package minefantasy.mf2.api.helpers; -import java.util.List; - -import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.GL11; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.settings.KeyBinding; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import java.util.List; public final class RenderHelper { - public static void renderTooltip(int x, int y, List tooltipData) { - int color = 0x505000ff; - int color2 = 0xf0100010; - - renderTooltip(x, y, tooltipData, color, color2); - } - - public static void renderTooltipOrange(int x, int y, List tooltipData) { - int color = 0x50a06600; - int color2 = 0xf01e1200; - - renderTooltip(x, y, tooltipData, color, color2); - } - - public static void renderTooltipGreen(int x, int y, List tooltipData) { - int color = 0x5000a000; - int color2 = 0xf0001e00; - - renderTooltip(x, y, tooltipData, color, color2); - } - - public static void renderTooltip(int x, int y, List tooltipData, int colour, int color2) { - boolean lighting = GL11.glGetBoolean(GL11.GL_LIGHTING); - if (lighting) - net.minecraft.client.renderer.RenderHelper.disableStandardItemLighting(); - - if (!tooltipData.isEmpty()) { - int var5 = 0; - int var6; - int var7; - FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; - for (var6 = 0; var6 < tooltipData.size(); ++var6) { - var7 = fontRenderer.getStringWidth(tooltipData.get(var6)); - if (var7 > var5) - var5 = var7; - } - var6 = x + 12; - var7 = y - 12; - int var9 = 8; - if (tooltipData.size() > 1) - var9 += 2 + (tooltipData.size() - 1) * 10; - float z = 300F; - drawGradientRect(var6 - 3, var7 - 4, z, var6 + var5 + 3, var7 - 3, color2, color2); - drawGradientRect(var6 - 3, var7 + var9 + 3, z, var6 + var5 + 3, var7 + var9 + 4, color2, color2); - drawGradientRect(var6 - 3, var7 - 3, z, var6 + var5 + 3, var7 + var9 + 3, color2, color2); - drawGradientRect(var6 - 4, var7 - 3, z, var6 - 3, var7 + var9 + 3, color2, color2); - drawGradientRect(var6 + var5 + 3, var7 - 3, z, var6 + var5 + 4, var7 + var9 + 3, color2, color2); - int var12 = (colour & 0xFFFFFF) >> 1 | colour & -16777216; - drawGradientRect(var6 - 3, var7 - 3 + 1, z, var6 - 3 + 1, var7 + var9 + 3 - 1, colour, var12); - drawGradientRect(var6 + var5 + 2, var7 - 3 + 1, z, var6 + var5 + 3, var7 + var9 + 3 - 1, colour, var12); - drawGradientRect(var6 - 3, var7 - 3, z, var6 + var5 + 3, var7 - 3 + 1, colour, colour); - drawGradientRect(var6 - 3, var7 + var9 + 2, z, var6 + var5 + 3, var7 + var9 + 3, var12, var12); - - GL11.glDisable(GL11.GL_DEPTH_TEST); - for (int var13 = 0; var13 < tooltipData.size(); ++var13) { - String var14 = tooltipData.get(var13); - fontRenderer.drawStringWithShadow(var14, var6, var7, -1); - if (var13 == 0) - var7 += 2; - var7 += 10; - } - GL11.glEnable(GL11.GL_DEPTH_TEST); - } - if (!lighting) - net.minecraft.client.renderer.RenderHelper.disableStandardItemLighting(); - GL11.glColor4f(1F, 1F, 1F, 1F); - } - - public static void drawGradientRect(int par1, int par2, float z, int par3, int par4, int par5, int par6) { - float var7 = (par5 >> 24 & 255) / 255F; - float var8 = (par5 >> 16 & 255) / 255F; - float var9 = (par5 >> 8 & 255) / 255F; - float var10 = (par5 & 255) / 255F; - float var11 = (par6 >> 24 & 255) / 255F; - float var12 = (par6 >> 16 & 255) / 255F; - float var13 = (par6 >> 8 & 255) / 255F; - float var14 = (par6 & 255) / 255F; - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glEnable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glShadeModel(GL11.GL_SMOOTH); - Tessellator var15 = Tessellator.instance; - var15.startDrawingQuads(); - var15.setColorRGBA_F(var8, var9, var10, var7); - var15.addVertex(par3, par2, z); - var15.addVertex(par1, par2, z); - var15.setColorRGBA_F(var12, var13, var14, var11); - var15.addVertex(par1, par4, z); - var15.addVertex(par3, par4, z); - var15.draw(); - GL11.glShadeModel(GL11.GL_FLAT); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_TEXTURE_2D); - } - - public static void drawTexturedModalRect(int par1, int par2, float z, int par3, int par4, int par5, int par6) { - drawTexturedModalRect(par1, par2, z, par3, par4, par5, par6, 0.00390625F, 0.00390625F); - } - - public static void drawTexturedModalRect(int par1, int par2, float z, int par3, int par4, int par5, int par6, - float f, float f1) { - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV(par1 + 0, par2 + par6, z, (par3 + 0) * f, (par4 + par6) * f1); - tessellator.addVertexWithUV(par1 + par5, par2 + par6, z, (par3 + par5) * f, (par4 + par6) * f1); - tessellator.addVertexWithUV(par1 + par5, par2 + 0, z, (par3 + par5) * f, (par4 + 0) * f1); - tessellator.addVertexWithUV(par1 + 0, par2 + 0, z, (par3 + 0) * f, (par4 + 0) * f1); - tessellator.draw(); - } - - public static String getKeyDisplayString(String keyName) { - String key = null; - KeyBinding[] keys = Minecraft.getMinecraft().gameSettings.keyBindings; - for (KeyBinding otherKey : keys) - if (otherKey.getKeyDescription().equals(keyName)) { - key = Keyboard.getKeyName(otherKey.getKeyCode()); - break; - } - - return key; - } + public static void renderTooltip(int x, int y, List tooltipData) { + int color = 0x505000ff; + int color2 = 0xf0100010; + + renderTooltip(x, y, tooltipData, color, color2); + } + + public static void renderTooltipOrange(int x, int y, List tooltipData) { + int color = 0x50a06600; + int color2 = 0xf01e1200; + + renderTooltip(x, y, tooltipData, color, color2); + } + + public static void renderTooltipGreen(int x, int y, List tooltipData) { + int color = 0x5000a000; + int color2 = 0xf0001e00; + + renderTooltip(x, y, tooltipData, color, color2); + } + + public static void renderTooltip(int x, int y, List tooltipData, int colour, int color2) { + boolean lighting = GL11.glGetBoolean(GL11.GL_LIGHTING); + if (lighting) + net.minecraft.client.renderer.RenderHelper.disableStandardItemLighting(); + + if (!tooltipData.isEmpty()) { + int var5 = 0; + int var6; + int var7; + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + for (var6 = 0; var6 < tooltipData.size(); ++var6) { + var7 = fontRenderer.getStringWidth(tooltipData.get(var6)); + if (var7 > var5) + var5 = var7; + } + var6 = x + 12; + var7 = y - 12; + int var9 = 8; + if (tooltipData.size() > 1) + var9 += 2 + (tooltipData.size() - 1) * 10; + float z = 300F; + drawGradientRect(var6 - 3, var7 - 4, z, var6 + var5 + 3, var7 - 3, color2, color2); + drawGradientRect(var6 - 3, var7 + var9 + 3, z, var6 + var5 + 3, var7 + var9 + 4, color2, color2); + drawGradientRect(var6 - 3, var7 - 3, z, var6 + var5 + 3, var7 + var9 + 3, color2, color2); + drawGradientRect(var6 - 4, var7 - 3, z, var6 - 3, var7 + var9 + 3, color2, color2); + drawGradientRect(var6 + var5 + 3, var7 - 3, z, var6 + var5 + 4, var7 + var9 + 3, color2, color2); + int var12 = (colour & 0xFFFFFF) >> 1 | colour & -16777216; + drawGradientRect(var6 - 3, var7 - 3 + 1, z, var6 - 3 + 1, var7 + var9 + 3 - 1, colour, var12); + drawGradientRect(var6 + var5 + 2, var7 - 3 + 1, z, var6 + var5 + 3, var7 + var9 + 3 - 1, colour, var12); + drawGradientRect(var6 - 3, var7 - 3, z, var6 + var5 + 3, var7 - 3 + 1, colour, colour); + drawGradientRect(var6 - 3, var7 + var9 + 2, z, var6 + var5 + 3, var7 + var9 + 3, var12, var12); + + GL11.glDisable(GL11.GL_DEPTH_TEST); + for (int var13 = 0; var13 < tooltipData.size(); ++var13) { + String var14 = tooltipData.get(var13); + fontRenderer.drawStringWithShadow(var14, var6, var7, -1); + if (var13 == 0) + var7 += 2; + var7 += 10; + } + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + if (!lighting) + net.minecraft.client.renderer.RenderHelper.disableStandardItemLighting(); + GL11.glColor4f(1F, 1F, 1F, 1F); + } + + public static void drawGradientRect(int par1, int par2, float z, int par3, int par4, int par5, int par6) { + float var7 = (par5 >> 24 & 255) / 255F; + float var8 = (par5 >> 16 & 255) / 255F; + float var9 = (par5 >> 8 & 255) / 255F; + float var10 = (par5 & 255) / 255F; + float var11 = (par6 >> 24 & 255) / 255F; + float var12 = (par6 >> 16 & 255) / 255F; + float var13 = (par6 >> 8 & 255) / 255F; + float var14 = (par6 & 255) / 255F; + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glShadeModel(GL11.GL_SMOOTH); + Tessellator var15 = Tessellator.instance; + var15.startDrawingQuads(); + var15.setColorRGBA_F(var8, var9, var10, var7); + var15.addVertex(par3, par2, z); + var15.addVertex(par1, par2, z); + var15.setColorRGBA_F(var12, var13, var14, var11); + var15.addVertex(par1, par4, z); + var15.addVertex(par3, par4, z); + var15.draw(); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + public static void drawTexturedModalRect(int par1, int par2, float z, int par3, int par4, int par5, int par6) { + drawTexturedModalRect(par1, par2, z, par3, par4, par5, par6, 0.00390625F, 0.00390625F); + } + + public static void drawTexturedModalRect(int par1, int par2, float z, int par3, int par4, int par5, int par6, + float f, float f1) { + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(par1 + 0, par2 + par6, z, (par3 + 0) * f, (par4 + par6) * f1); + tessellator.addVertexWithUV(par1 + par5, par2 + par6, z, (par3 + par5) * f, (par4 + par6) * f1); + tessellator.addVertexWithUV(par1 + par5, par2 + 0, z, (par3 + par5) * f, (par4 + 0) * f1); + tessellator.addVertexWithUV(par1 + 0, par2 + 0, z, (par3 + 0) * f, (par4 + 0) * f1); + tessellator.draw(); + } + + public static String getKeyDisplayString(String keyName) { + String key = null; + KeyBinding[] keys = Minecraft.getMinecraft().gameSettings.keyBindings; + for (KeyBinding otherKey : keys) + if (otherKey.getKeyDescription().equals(keyName)) { + key = Keyboard.getKeyName(otherKey.getKeyCode()); + break; + } + + return key; + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/TacticalManager.java b/src/main/java/minefantasy/mf2/api/helpers/TacticalManager.java index 8f276a22..d79002c7 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/TacticalManager.java +++ b/src/main/java/minefantasy/mf2/api/helpers/TacticalManager.java @@ -1,7 +1,5 @@ package minefantasy.mf2.api.helpers; -import java.util.Random; - import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.armour.IElementalResistance; import minefantasy.mf2.api.knowledge.ResearchLogic; @@ -23,496 +21,472 @@ import net.minecraft.util.EntityDamageSourceIndirect; import net.minecraft.util.MathHelper; +import java.util.Random; + /** * This calculates different tactical contexts for combat like flanking and * blocking */ public class TacticalManager { - private static Random rand = new Random(); - public static boolean shouldSlow = true; - public static float minWeightSpeed = 10F; - public static float arrowDeflectChance = 1.0F; - - /** - * Determines if you cant block with no stamina - */ - public static boolean shouldStaminaBlock = false; - - /** - * Determines if the defender is hit in the front (180degree arc) - * - * @param attacker - * the attacker - * @param defender - * the defender - * @return true if the hit is on the front - */ - public static boolean canBlock(Entity attacker, EntityLivingBase defender) { - return canBlock(attacker, defender, 180); - } - - /** - * Determines if the defender is hit in the front with a custom arc - * - * @param attacker - * the attacker - * @param defender - * the defender - * @param arc - * the arc that can be blocked - * @return true if the hit is on the front - */ - public static boolean canBlock(Entity attacker, EntityLivingBase defender, float blockAngle) { - if (attacker == null || defender == null) - return false; - - float yaw = calculateHitAngle(attacker, defender); - - return yaw < blockAngle && yaw > -blockAngle; - } - - /** - * Determines if an entity is flanking another - * - * @param source - * the source of the attack - * @param attacker - * the attacking entity - * @param defender - * the entity on view is questioned - * @param angle - * the angle the defender is flanked by - * @return true if the attacker hit within the back of defender between the - * angle - */ - public static boolean isFlankedBy(Entity attacker, EntityLivingBase defender, float angle) { - float yaw = calculateHitAngle(attacker, defender); - float blockAngle = (360 - angle) / 2; - - return !(yaw < blockAngle && yaw > -blockAngle);// Flanking is like reverse block - } - - public static boolean canParry(DamageSource source, EntityLivingBase user, Entity entityHitting, ItemStack weapon) { - boolean autoParry = false; - if (shouldStaminaBlock && StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) - && !StaminaBar.isAnyStamina(user, false)) { - return false; - } - if (user.getHeldItem() != null && !canWeaponBlock(user.getHeldItem())) { - return false; - } - if (user instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) user; - autoParry = ResearchLogic.hasInfoUnlocked(player, "autoparry") && !player.isBlocking(); - - if (!player.isBlocking() && !autoParry) { - return false; - } - } else { - if (!isMobBlocking(user) && didParrySucceed(user, source)) { - return false; - } - } - - if (!CombatMechanics.isParryAvailable(user)) { - return false; - } - int confusion = 0; - if (user.getActivePotionEffect(Potion.confusion) != null) { - confusion = user.getActivePotionEffect(Potion.confusion).getAmplifier() + 1; - } - float arc = 20;// DEFAULT - - if (weapon != null && weapon.getItem() instanceof IParryable) { - IParryable parry = (IParryable) weapon.getItem(); - if (!parry.canUserParry(user)) { - return false; - } - arc = parry.getParryAngle(source, user, weapon); - - if (!parry.canParry(source, user, weapon)) { - return false; - } - } - if (source.isProjectile()) { - arc *= 0.75F; - } - - arc *= getHighgroundModifier(user, entityHitting, 1.5F); - arc = ArmourCalculator.adjustACForDamage(source, arc, 1.0F, 1.0F, 0.5F);// Harder to block piercing - if (autoParry) { - arc *= 0.5F; - } - arc *= ArmourCalculator.getParryModifier(user); - if (confusion > 0 && rand.nextInt(confusion + 1) != 0) { - return false; - } - return arc > 0 && canBlock(entityHitting, user, arc); - } - - private static boolean canWeaponBlock(ItemStack item) { - return item.getItem() instanceof ItemSword || item.getItem() instanceof IParryable; - } - - private static boolean isMobBlocking(EntityLivingBase user) { - if (!user.isImmuneToFire() && user.isBurning()) { - return false;// If burning and can't take the heat.. can't block! - } - if (user.getHeldItem() != null) { - return user.getHeldItem().getItem().getItemUseAction(user.getHeldItem()) == EnumAction.block; - } - return false; - } - - private static boolean didParrySucceed(EntityLivingBase user, DamageSource source) { - if (user instanceof ISpecialCombatMob) { - return ((ISpecialCombatMob) user).canParry(source); - } - return rand.nextInt(5) != 0; - } - - public static float getHighgroundModifier(Entity target, Entity hitter, float value) { - if (target == null || hitter == null) { - return 1.0F; - } - float gap = 0.5F; - if (target.posY > hitter.posY + gap)// Blocker on high ground - { - return 1.0F * value; - } - if (target.posY < hitter.posY - gap)// Attacker on high ground - { - return 1.0F / value; - } - return 1.0F; - } - - /** - * Knocks the target back from the source - * - * @param target - * the enemy to be knocked back - * @param source - * the source of the knockback - * @param power - * the power a - pulls - * @param height - * the height they jump - */ - public static void knockbackEntity(Entity target, Entity source, float power, float height) { - target.addVelocity(-MathHelper.sin(source.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F, height, - MathHelper.cos(source.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F); - } - - /** - * Causes the attacker to fly towards the target - * - * @param attacker - * the entity that moves - * @param target - * the target attacker aims for - * @param power - * the forward momentum - * @param height - * the height of the jump - */ - public static void lungeEntity(Entity attacker, Entity target, float power, float height) { - attacker.addVelocity(-MathHelper.sin(attacker.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F, height, - MathHelper.cos(attacker.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F); - } - - public static boolean isRanged(DamageSource source) { - if (source == null) { - return false; - } - if (source.isProjectile() || source instanceof EntityDamageSourceIndirect) { - return true; - } - if (source.getEntity() != null && source.getSourceOfDamage() != null) { - return source.getEntity() != source.getSourceOfDamage(); - } - return false; - } - - /** - * This gets the angle that "attacker" hit "defender" relating 0 to front - * - * @param attacker - * the entity that hit defender - * @param defender - * the hit entity in question - * @return the angle defender was hit (0 = front) - */ - private static float calculateHitAngle(Entity attacker, EntityLivingBase defender) { - if (attacker == null) { - return 0F; - } - double xGap = attacker.posX - defender.posX; - double zGap; - - for (zGap = attacker.posZ - defender.posZ; xGap * xGap - + zGap * zGap < 1.0E-4D; zGap = (Math.random() - Math.random()) * 0.01D) { - xGap = (Math.random() - Math.random()) * 0.01D; // makes the zgap - } - - float yaw = (float) (Math.atan2(zGap, xGap) * 180.0D / Math.PI) - defender.rotationYaw; - yaw = yaw - 90; - - // CONVERTS THE ANGLES - while (yaw < -180) { - yaw += 360; - } - while (yaw >= 180) { - yaw -= 360; - } - - return yaw; - } - - /** - * Modifies the movement of an entity based on armour - */ - public static void applyArmourWeight(EntityLivingBase entityLiving) { - if (entityLiving instanceof EntityPlayer && ((EntityPlayer) entityLiving).capabilities.isCreativeMode) { - return; - } - // Default speed is 100% - float totalSpeed = 100F; - - if (shouldSlow && !isImmuneToWeight(entityLiving)) { - - totalSpeed += ArmourCalculator.getSpeedModForWeight(entityLiving); - // Limit the slowest speed to 1% - if (totalSpeed <= minWeightSpeed) { - totalSpeed = minWeightSpeed; - } - } - // apply speed mod - if (totalSpeed != 100F && entityLiving.onGround) { - entityLiving.motionX *= (totalSpeed / 100F); - entityLiving.motionZ *= (totalSpeed / 100F); - } - } - - /** - * Gets the modifer for magic resistance 1.0=no effect - */ - public static float resistMagic(EntityLivingBase user, DamageSource source) { - float resistance = 100F; - - for (int a = 0; a < 4; a++) { - ItemStack armour = user.getEquipmentInSlot(a + 1); - if (armour != null && armour.getItem() instanceof IElementalResistance) { - float modifier = ((IElementalResistance) armour.getItem()).getMagicResistance(armour, source); - modifier *= ArmourCalculator.sizes[3 - a]; - resistance -= modifier; - } - } - - return resistance / 100F; - } - - /** - * Gets the modifer for fire resistance 1.0=no effect - */ - public static float resistFire(EntityLivingBase user, DamageSource source) { - float resistance = 100F; - - for (int a = 0; a < 4; a++) { - ItemStack armour = user.getEquipmentInSlot(a + 1); - if (armour != null && armour.getItem() instanceof IElementalResistance) { - float modifier = ((IElementalResistance) armour.getItem()).getFireResistance(armour, source); - modifier *= ArmourCalculator.sizes[3 - a]; - - resistance -= modifier; - } - } - - return resistance / 100F; - } - - public static boolean resistArrow(EntityLivingBase user, DamageSource source, float dam) { - Entity hitter = source.getSourceOfDamage(); - if (hitter == null || !isArrow(hitter)) { - return false; - } - - float threshold = 0.25F; - float resistance = 1.0F; - - for (int a = 0; a < 4; a++) { - ItemStack armour = user.getEquipmentInSlot(4 - a); - if (armour != null && armour.getItem() instanceof IElementalResistance) { - float modifier = ((IElementalResistance) armour.getItem()).getArrowDeflection(armour, source); - modifier *= ArmourCalculator.sizes[a]; - - resistance += modifier; - } - } - threshold *= resistance; - - if (!user.worldObj.isRemote) - MineFantasyAPI.debugMsg("Arrow Damage: " + dam + " Projectile Threshold: " + threshold); - - return dam <= threshold && dam > 0; - } - - /** - * This tries to see if the projectile is an arrow, just so certain projectiles - * dont do the armour bouncy thing - */ - public static boolean isArrow(Entity hitter) { - return hitter instanceof EntityArrow || hitter instanceof EntityArrowMF; - } - - /** - * Gets the modifer for base resistance(non magic/fire) - */ - public static float resistBase(EntityLivingBase user, DamageSource source) { - float resistance = 100F; - - for (int a = 0; a < 4; a++) { - ItemStack armour = user.getEquipmentInSlot(a + 1); - if (armour != null && armour.getItem() instanceof IElementalResistance) { - float modifier = ((IElementalResistance) armour.getItem()).getBaseResistance(armour, source); - modifier *= ArmourCalculator.sizes[3 - a]; - resistance -= modifier; - } - } - return resistance / 100F; - } - - public static float getResistance(EntityLivingBase user, DamageSource source) { - if (source.isFireDamage()) { - return resistFire(user, source); - } - if (source.isMagicDamage() || source == DamageSource.wither) { - return resistMagic(user, source); - } - return resistBase(user, source); - } - - /** - * Returns if a target should not be set - * - * @param entity - * the attacker - * @param target - * the target chosen - */ - public static boolean shouldNotAttack(Entity attacker, EntityLivingBase target) { - // TODO aggro - return false; - } - - public static void throwPlayerOffBalance(EntityPlayer entityPlayer, float balance, boolean throwDown) { - float amplify = 30.0F; - - float offsetX = -balance / 2; - float offsetY = balance; - - float yawBalance = offsetX * amplify; - float pitchBalance = offsetY * amplify; - entityPlayer.moveStrafing += offsetX; - if (offsetY > 0) { - entityPlayer.moveForward += offsetY; - } - if (newBalanceSystem) { - entityPlayer.getEntityData().setFloat("MF_Balance_Pitch", pitchBalance); - entityPlayer.getEntityData().setFloat("MF_Balance_Yaw", yawBalance); - } else { - entityPlayer.rotationPitch += pitchBalance; - entityPlayer.rotationYaw += yawBalance; - } - } - - public static boolean newBalanceSystem = false; - - public static boolean isEntityMoving(EntityLivingBase player) { - return player.moveForward != 0 || player.moveStrafing != 0; - } - - public static boolean isMelee(DamageSource source) { - if (source.getEntity() != null && source.getSourceOfDamage() != null) { - return source.getEntity() == source.getSourceOfDamage() && !source.isProjectile(); - } - return false; - } - - public static boolean isUnholyCreature(Entity entityHit) { - if (entityHit == null || !(entityHit instanceof EntityLivingBase)) { - return false; - } - - if (((EntityLivingBase) entityHit).isEntityUndead()) { - return true; - } - if (entityHit instanceof EntityWitch) { - return true; - } - if (entityHit.getClass().getName().contains("Wraith")) { - return true; - } - if (entityHit.getClass().getName().contains("Werewolf")) { - return true; - } - return false; - } - - public static boolean isDragon(Entity entityHit) { - if (entityHit == null || !(entityHit instanceof EntityLivingBase)) { - return false; - } - if (entityHit instanceof net.minecraft.entity.boss.EntityDragon) { - return true; - } - if (entityHit instanceof minefantasy.mf2.entity.mob.EntityDragon) { - return true; - } - return false; - } - - /** - * Simply drops an item - */ - public static boolean tryDisarm(EntityLivingBase target) { - return tryDisarm(null, target, false); - } - - /** - * Try to disarm the target - * - * @param attacker - * Who is attacking (can be null) - * @param target - * Who is wielding - * @param steal - * If the attacker should wield the target's weapon - */ - public static boolean tryDisarm(EntityLivingBase attacker, EntityLivingBase target, boolean steal) { - if (target.getHeldItem() == null) { - return false; - } - - if (attacker != null && steal && attacker.getHeldItem() == null) { - attacker.setCurrentItemOrArmor(0, target.getHeldItem().copy()); - } else { - target.entityDropItem(target.getHeldItem(), 1.0F); - } - target.setCurrentItemOrArmor(0, null); - return true; - } - - /** - * Checks if Armour Debuffs are Ignored - */ - public static boolean isImmuneToWeight(EntityLivingBase entityLiving) { - return PowerArmour.isPowered(entityLiving); - } - - public static void leap(Entity target, float angle, float power, float height) { - target.addVelocity(-MathHelper.sin(angle * (float) Math.PI / 180.0F) * power, height, - MathHelper.cos(angle * (float) Math.PI / 180.0F) * power); - } + public static boolean shouldSlow = true; + public static float minWeightSpeed = 10F; + public static float arrowDeflectChance = 1.0F; + /** + * Determines if you cant block with no stamina + */ + public static boolean shouldStaminaBlock = false; + public static boolean newBalanceSystem = false; + private static Random rand = new Random(); + + /** + * Determines if the defender is hit in the front (180degree arc) + * + * @param attacker the attacker + * @param defender the defender + * @return true if the hit is on the front + */ + public static boolean canBlock(Entity attacker, EntityLivingBase defender) { + return canBlock(attacker, defender, 180); + } + + /** + * Determines if the defender is hit in the front with a custom arc + * + * @param attacker the attacker + * @param defender the defender + * @param arc the arc that can be blocked + * @return true if the hit is on the front + */ + public static boolean canBlock(Entity attacker, EntityLivingBase defender, float blockAngle) { + if (attacker == null || defender == null) + return false; + + float yaw = calculateHitAngle(attacker, defender); + + return yaw < blockAngle && yaw > -blockAngle; + } + + /** + * Determines if an entity is flanking another + * + * @param source the source of the attack + * @param attacker the attacking entity + * @param defender the entity on view is questioned + * @param angle the angle the defender is flanked by + * @return true if the attacker hit within the back of defender between the + * angle + */ + public static boolean isFlankedBy(Entity attacker, EntityLivingBase defender, float angle) { + float yaw = calculateHitAngle(attacker, defender); + float blockAngle = (360 - angle) / 2; + + return !(yaw < blockAngle && yaw > -blockAngle);// Flanking is like reverse block + } + + public static boolean canParry(DamageSource source, EntityLivingBase user, Entity entityHitting, ItemStack weapon) { + boolean autoParry = false; + if (shouldStaminaBlock && StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) + && !StaminaBar.isAnyStamina(user, false)) { + return false; + } + if (user.getHeldItem() != null && !canWeaponBlock(user.getHeldItem())) { + return false; + } + if (user instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) user; + autoParry = ResearchLogic.hasInfoUnlocked(player, "autoparry") && !player.isBlocking(); + + if (!player.isBlocking() && !autoParry) { + return false; + } + } else { + if (!isMobBlocking(user) && didParrySucceed(user, source)) { + return false; + } + } + + if (!CombatMechanics.isParryAvailable(user)) { + return false; + } + int confusion = 0; + if (user.getActivePotionEffect(Potion.confusion) != null) { + confusion = user.getActivePotionEffect(Potion.confusion).getAmplifier() + 1; + } + float arc = 20;// DEFAULT + + if (weapon != null && weapon.getItem() instanceof IParryable) { + IParryable parry = (IParryable) weapon.getItem(); + if (!parry.canUserParry(user)) { + return false; + } + arc = parry.getParryAngle(source, user, weapon); + + if (!parry.canParry(source, user, weapon)) { + return false; + } + } + if (source.isProjectile()) { + arc *= 0.75F; + } + + arc *= getHighgroundModifier(user, entityHitting, 1.5F); + arc = ArmourCalculator.adjustACForDamage(source, arc, 1.0F, 1.0F, 0.5F);// Harder to block piercing + if (autoParry) { + arc *= 0.5F; + } + arc *= ArmourCalculator.getParryModifier(user); + if (confusion > 0 && rand.nextInt(confusion + 1) != 0) { + return false; + } + return arc > 0 && canBlock(entityHitting, user, arc); + } + + private static boolean canWeaponBlock(ItemStack item) { + return item.getItem() instanceof ItemSword || item.getItem() instanceof IParryable; + } + + private static boolean isMobBlocking(EntityLivingBase user) { + if (!user.isImmuneToFire() && user.isBurning()) { + return false;// If burning and can't take the heat.. can't block! + } + if (user.getHeldItem() != null) { + return user.getHeldItem().getItem().getItemUseAction(user.getHeldItem()) == EnumAction.block; + } + return false; + } + + private static boolean didParrySucceed(EntityLivingBase user, DamageSource source) { + if (user instanceof ISpecialCombatMob) { + return ((ISpecialCombatMob) user).canParry(source); + } + return rand.nextInt(5) != 0; + } + + public static float getHighgroundModifier(Entity target, Entity hitter, float value) { + if (target == null || hitter == null) { + return 1.0F; + } + float gap = 0.5F; + if (target.posY > hitter.posY + gap)// Blocker on high ground + { + return 1.0F * value; + } + if (target.posY < hitter.posY - gap)// Attacker on high ground + { + return 1.0F / value; + } + return 1.0F; + } + + /** + * Knocks the target back from the source + * + * @param target the enemy to be knocked back + * @param source the source of the knockback + * @param power the power a - pulls + * @param height the height they jump + */ + public static void knockbackEntity(Entity target, Entity source, float power, float height) { + target.addVelocity(-MathHelper.sin(source.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F, height, + MathHelper.cos(source.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F); + } + + /** + * Causes the attacker to fly towards the target + * + * @param attacker the entity that moves + * @param target the target attacker aims for + * @param power the forward momentum + * @param height the height of the jump + */ + public static void lungeEntity(Entity attacker, Entity target, float power, float height) { + attacker.addVelocity(-MathHelper.sin(attacker.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F, height, + MathHelper.cos(attacker.rotationYaw * (float) Math.PI / 180.0F) * power * 0.5F); + } + + public static boolean isRanged(DamageSource source) { + if (source == null) { + return false; + } + if (source.isProjectile() || source instanceof EntityDamageSourceIndirect) { + return true; + } + if (source.getEntity() != null && source.getSourceOfDamage() != null) { + return source.getEntity() != source.getSourceOfDamage(); + } + return false; + } + + /** + * This gets the angle that "attacker" hit "defender" relating 0 to front + * + * @param attacker the entity that hit defender + * @param defender the hit entity in question + * @return the angle defender was hit (0 = front) + */ + private static float calculateHitAngle(Entity attacker, EntityLivingBase defender) { + if (attacker == null) { + return 0F; + } + double xGap = attacker.posX - defender.posX; + double zGap; + + for (zGap = attacker.posZ - defender.posZ; xGap * xGap + + zGap * zGap < 1.0E-4D; zGap = (Math.random() - Math.random()) * 0.01D) { + xGap = (Math.random() - Math.random()) * 0.01D; // makes the zgap + } + + float yaw = (float) (Math.atan2(zGap, xGap) * 180.0D / Math.PI) - defender.rotationYaw; + yaw = yaw - 90; + + // CONVERTS THE ANGLES + while (yaw < -180) { + yaw += 360; + } + while (yaw >= 180) { + yaw -= 360; + } + + return yaw; + } + + /** + * Modifies the movement of an entity based on armour + */ + public static void applyArmourWeight(EntityLivingBase entityLiving) { + if (entityLiving instanceof EntityPlayer && ((EntityPlayer) entityLiving).capabilities.isCreativeMode) { + return; + } + // Default speed is 100% + float totalSpeed = 100F; + + if (shouldSlow && !isImmuneToWeight(entityLiving)) { + + totalSpeed += ArmourCalculator.getSpeedModForWeight(entityLiving); + // Limit the slowest speed to 1% + if (totalSpeed <= minWeightSpeed) { + totalSpeed = minWeightSpeed; + } + } + // apply speed mod + if (totalSpeed != 100F && entityLiving.onGround) { + entityLiving.motionX *= (totalSpeed / 100F); + entityLiving.motionZ *= (totalSpeed / 100F); + } + } + + /** + * Gets the modifer for magic resistance 1.0=no effect + */ + public static float resistMagic(EntityLivingBase user, DamageSource source) { + float resistance = 100F; + + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof IElementalResistance) { + float modifier = ((IElementalResistance) armour.getItem()).getMagicResistance(armour, source); + modifier *= ArmourCalculator.sizes[3 - a]; + resistance -= modifier; + } + } + + return resistance / 100F; + } + + /** + * Gets the modifer for fire resistance 1.0=no effect + */ + public static float resistFire(EntityLivingBase user, DamageSource source) { + float resistance = 100F; + + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof IElementalResistance) { + float modifier = ((IElementalResistance) armour.getItem()).getFireResistance(armour, source); + modifier *= ArmourCalculator.sizes[3 - a]; + + resistance -= modifier; + } + } + + return resistance / 100F; + } + + public static boolean resistArrow(EntityLivingBase user, DamageSource source, float dam) { + Entity hitter = source.getSourceOfDamage(); + if (hitter == null || !isArrow(hitter)) { + return false; + } + + float threshold = 0.25F; + float resistance = 1.0F; + + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(4 - a); + if (armour != null && armour.getItem() instanceof IElementalResistance) { + float modifier = ((IElementalResistance) armour.getItem()).getArrowDeflection(armour, source); + modifier *= ArmourCalculator.sizes[a]; + + resistance += modifier; + } + } + threshold *= resistance; + + if (!user.worldObj.isRemote) + MineFantasyAPI.debugMsg("Arrow Damage: " + dam + " Projectile Threshold: " + threshold); + + return dam <= threshold && dam > 0; + } + + /** + * This tries to see if the projectile is an arrow, just so certain projectiles + * dont do the armour bouncy thing + */ + public static boolean isArrow(Entity hitter) { + return hitter instanceof EntityArrow || hitter instanceof EntityArrowMF; + } + + /** + * Gets the modifer for base resistance(non magic/fire) + */ + public static float resistBase(EntityLivingBase user, DamageSource source) { + float resistance = 100F; + + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null && armour.getItem() instanceof IElementalResistance) { + float modifier = ((IElementalResistance) armour.getItem()).getBaseResistance(armour, source); + modifier *= ArmourCalculator.sizes[3 - a]; + resistance -= modifier; + } + } + return resistance / 100F; + } + + public static float getResistance(EntityLivingBase user, DamageSource source) { + if (source.isFireDamage()) { + return resistFire(user, source); + } + if (source.isMagicDamage() || source == DamageSource.wither) { + return resistMagic(user, source); + } + return resistBase(user, source); + } + + /** + * Returns if a target should not be set + * + * @param entity the attacker + * @param target the target chosen + */ + public static boolean shouldNotAttack(Entity attacker, EntityLivingBase target) { + // TODO aggro + return false; + } + + public static void throwPlayerOffBalance(EntityPlayer entityPlayer, float balance, boolean throwDown) { + float amplify = 30.0F; + + float offsetX = -balance / 2; + float offsetY = balance; + + float yawBalance = offsetX * amplify; + float pitchBalance = offsetY * amplify; + entityPlayer.moveStrafing += offsetX; + if (offsetY > 0) { + entityPlayer.moveForward += offsetY; + } + if (newBalanceSystem) { + entityPlayer.getEntityData().setFloat("MF_Balance_Pitch", pitchBalance); + entityPlayer.getEntityData().setFloat("MF_Balance_Yaw", yawBalance); + } else { + entityPlayer.rotationPitch += pitchBalance; + entityPlayer.rotationYaw += yawBalance; + } + } + + public static boolean isEntityMoving(EntityLivingBase player) { + return player.moveForward != 0 || player.moveStrafing != 0; + } + + public static boolean isMelee(DamageSource source) { + if (source.getEntity() != null && source.getSourceOfDamage() != null) { + return source.getEntity() == source.getSourceOfDamage() && !source.isProjectile(); + } + return false; + } + + public static boolean isUnholyCreature(Entity entityHit) { + if (entityHit == null || !(entityHit instanceof EntityLivingBase)) { + return false; + } + + if (((EntityLivingBase) entityHit).isEntityUndead()) { + return true; + } + if (entityHit instanceof EntityWitch) { + return true; + } + if (entityHit.getClass().getName().contains("Wraith")) { + return true; + } + if (entityHit.getClass().getName().contains("Werewolf")) { + return true; + } + return false; + } + + public static boolean isDragon(Entity entityHit) { + if (entityHit == null || !(entityHit instanceof EntityLivingBase)) { + return false; + } + if (entityHit instanceof net.minecraft.entity.boss.EntityDragon) { + return true; + } + if (entityHit instanceof minefantasy.mf2.entity.mob.EntityDragon) { + return true; + } + return false; + } + + /** + * Simply drops an item + */ + public static boolean tryDisarm(EntityLivingBase target) { + return tryDisarm(null, target, false); + } + + /** + * Try to disarm the target + * + * @param attacker Who is attacking (can be null) + * @param target Who is wielding + * @param steal If the attacker should wield the target's weapon + */ + public static boolean tryDisarm(EntityLivingBase attacker, EntityLivingBase target, boolean steal) { + if (target.getHeldItem() == null) { + return false; + } + + if (attacker != null && steal && attacker.getHeldItem() == null) { + attacker.setCurrentItemOrArmor(0, target.getHeldItem().copy()); + } else { + target.entityDropItem(target.getHeldItem(), 1.0F); + } + target.setCurrentItemOrArmor(0, null); + return true; + } + + /** + * Checks if Armour Debuffs are Ignored + */ + public static boolean isImmuneToWeight(EntityLivingBase entityLiving) { + return PowerArmour.isPowered(entityLiving); + } + + public static void leap(Entity target, float angle, float power, float height) { + target.addVelocity(-MathHelper.sin(angle * (float) Math.PI / 180.0F) * power, height, + MathHelper.cos(angle * (float) Math.PI / 180.0F) * power); + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java b/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java index a6e16348..16c1cb56 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java +++ b/src/main/java/minefantasy/mf2/api/helpers/TextureHelperMF.java @@ -1,66 +1,64 @@ package minefantasy.mf2.api.helpers; -import java.util.Map; - -import org.lwjgl.opengl.GL11; - import com.google.common.collect.Maps; - import cpw.mods.fml.client.FMLClientHandler; import minefantasy.mf2.util.MFLogUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +import java.util.Map; public class TextureHelperMF { - private static final Map resourceList = Maps.newHashMap(); - public static final ResourceLocation ITEM_GLINT = new ResourceLocation("textures/misc/enchanted_item_glint.png"); + public static final ResourceLocation ITEM_GLINT = new ResourceLocation("textures/misc/enchanted_item_glint.png"); + private static final Map resourceList = Maps.newHashMap(); - /** - * This gets the resource location from just a simple directory(Beats the shit - * you have to do nower days!) - */ - public static ResourceLocation getResource(String directory) { - ResourceLocation resourcelocation = (ResourceLocation) resourceList.get(directory); + /** + * This gets the resource location from just a simple directory(Beats the shit + * you have to do nower days!) + */ + public static ResourceLocation getResource(String directory) { + ResourceLocation resourcelocation = (ResourceLocation) resourceList.get(directory); - if (resourcelocation == null) { - MFLogUtil.logDebug("MineFantasy: Added Resource: " + directory); + if (resourcelocation == null) { + MFLogUtil.logDebug("MineFantasy: Added Resource: " + directory); - resourcelocation = new ResourceLocation("minefantasy2", directory); - resourceList.put(directory, resourcelocation); - } + resourcelocation = new ResourceLocation("minefantasy2", directory); + resourceList.put(directory, resourcelocation); + } - return resourcelocation; - } + return resourcelocation; + } - public static void renderEnchantmentEffects(Tessellator tessellator) { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - FMLClientHandler.instance().getClient().renderEngine.bindTexture(ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - float f7 = 0.76F; - GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float f8 = 0.125F; - GL11.glScalef(f8, f8, f8); - float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; - GL11.glTranslatef(f9, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(f8, f8, f8); - f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; - GL11.glTranslatef(-f9, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } + public static void renderEnchantmentEffects(Tessellator tessellator) { + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + float f7 = 0.76F; + GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glPushMatrix(); + float f8 = 0.125F; + GL11.glScalef(f8, f8, f8); + float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; + GL11.glTranslatef(f9, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(f8, f8, f8); + f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; + GL11.glTranslatef(-f9, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } } diff --git a/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java b/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java index 62744e1f..b58a9e7b 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java @@ -1,7 +1,5 @@ package minefantasy.mf2.api.helpers; -import java.util.ArrayList; - import minefantasy.mf2.api.crafting.CustomCrafterEntry; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.api.tool.IToolMF; @@ -10,292 +8,293 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import java.util.ArrayList; + public class ToolHelper { - // CRAFTER TOOLS// - - public static boolean shouldShowTooltip(ItemStack tool) { - String type = getCrafterTool(tool); - - return type != null && !type.equalsIgnoreCase("nothing") && !type.equalsIgnoreCase("hands"); - } - - public static float getCrafterEfficiency(ItemStack tool) { - if (tool == null) { - return 1F; - } - if (tool.getItem() instanceof IToolMF) { - return ((IToolMF) tool.getItem()).getEfficiency(tool); - } - return CustomCrafterEntry.getEntryEfficiency(tool); - } - - public static int getCrafterTier(ItemStack tool) { - if (tool == null) { - return 0; - } - if (tool.getItem() instanceof IToolMF) { - return ((IToolMF) tool.getItem()).getTier(tool); - } - return CustomCrafterEntry.getEntryTier(tool); - } - - public static String getCrafterTool(ItemStack tool) { - if (tool == null) { - return "hands"; - } - if (tool.getItem() instanceof IToolMF) { - return ((IToolMF) tool.getItem()).getToolType(tool); - } - return CustomCrafterEntry.getEntryType(tool); - } - - // MATERIALS// - - /** - * Compares an itemstack to see if the item is made from the said material ONLY - * APPLIES TO IToolMaterial in api. - */ - public static boolean isItemMaterial(ItemStack stack, ToolMaterial material) { - if (stack != null) { - // You need the item to implement this so it can see - if (stack.getItem() instanceof IToolMaterial) { - IToolMaterial mat = (IToolMaterial) stack.getItem(); - - return mat.getMaterial() != null && mat.getMaterial() == material; - } - } - return false; - } - - // QUALITY// - - public static ItemStack setQuality(ItemStack item, float qualityLvl) { - if (item.getMaxStackSize() > 0) - return item; - - NBTTagCompound nbt = getOrCreateNBT(item); - nbt.setFloat("MFCraftQuality", qualityLvl); - - return item; - } - - /** - * Gets how well an item has been crafted: 100 is default ranging from 0-200 - */ - public static float getQualityLevel(ItemStack stack) { - if (stack.getMaxStackSize() == 1) { - if (stack.hasTagCompound() && stack.getTagCompound().hasKey("MFCraftQuality")) { - return stack.getTagCompound().getFloat("MFCraftQuality"); - } - } - return 100.0F; - } - - public static int setDuraOnQuality(ItemStack item, int dura) { - float quality = getQualityLevel(item); - if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { - if (item.getTagCompound().getBoolean("MF_Inferior")) { - dura /= 2; - } else { - dura *= 2; - } - } - - if (quality > 100) { - dura += ((dura) / 100F * (quality - 100));// This means 100+ adds to 2x durability at level 200 - } - if (quality < 100) { - dura -= ((dura * 0.75) / 100 * (100F - quality));// This means 100- takes upto 75% from it's max durability - // lvl0 is 25%dura - } - return dura; - } - - public static float modifyDigOnQuality(ItemStack item, float digspeed) { - if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { - if (item.getTagCompound().getBoolean("MF_Inferior")) { - digspeed /= 1.25F; - } else { - digspeed *= 1.25F; - } - } - float quality = getQualityLevel(item); - - if (quality > 100) { - digspeed += ((digspeed * 0.5F) / 100F * (quality - 100));// This means 100+ adds 50% speed at level 200 - } - if (quality < 100) { - digspeed -= ((digspeed * 0.5) / 100 * (100F - quality));// This means 100- takes upto 50% from it's max - // speed lvl0 is 50% speed - } - return digspeed; - } - - public static float modifyDamOnQuality(ItemStack item, float damage) { - float quality = getQualityLevel(item); - if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { - if (item.getTagCompound().getBoolean("MF_Inferior")) { - damage /= 1.25F; - } else { - damage *= 1.25F; - } - } - if (quality > 100) { - damage += ((damage * 0.25F) / 100F * (quality - 100));// This means 100+ adds 25% damage at level 200 - } - if (quality < 100) { - damage -= ((damage * 0.25) / 100 * (100F - quality));// This means 100- takes upto 25% from it's max damage - // lvl0 is 75% damage - } - return damage; - } - - public static float modifyArmourRating(ItemStack item, float rating) { - float quality = getQualityLevel(item); - if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { - if (item.getTagCompound().getBoolean("MF_Inferior")) { - rating /= 1.25F; - } else { - rating *= 1.25F; - } - } - - if (quality > 100) { - rating += ((rating * 0.5F) / 100F * (quality - 100));// This means 100+ adds 50% armour at level 200 - } - if (quality < 100) { - rating -= ((rating * 0.5) / 100 * (100F - quality));// This means 100- takes upto 50% from it's max armour - // lvl0 is 50% armour - } - return rating; - } - - // NBT// - - private static NBTTagCompound getOrCreateNBT(ItemStack item) { - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - - return item.getTagCompound(); - } - - public static boolean hasCustomQualityTag(ItemStack item) { - return item.hasTagCompound() && item.getTagCompound().hasKey("MFCraftQuality"); - } - - private static String specialItem = "MF_SpecialItemType"; - - public static void setSpecial(ItemStack item, String type) { - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - item.getTagCompound().setString(specialItem, type); - } - - public static boolean isSpecial(ItemStack item, String type) { - return getSpecial(item) != null && getSpecial(item).equals(type); - } - - public static String getSpecial(ItemStack item) { - if (item.hasTagCompound() && item.getTagCompound().hasKey(specialItem)) { - return item.getTagCompound().getString(specialItem); - } - return null; - } - - public static void setToolSharpness(ItemStack item, float level) { - NBTTagCompound nbt = getOrCreateNBT(item); - float currentLevel = getSharpnessLevel(item); - float maxLevel = getMaxSharpness(item); - nbt.setFloat(sharpnessLevelNBT, Math.min(maxLevel, currentLevel + level)); - } - - public static float getSharpnessLevel(ItemStack item) { - NBTTagCompound nbt = item.getTagCompound(); - if (nbt != null && nbt.hasKey(sharpnessLevelNBT)) { - return nbt.getFloat(sharpnessLevelNBT); - } - return 0F; - } - - public static final String sharpnessLevelNBT = "MF_Sharpness_Level"; - - public static boolean canBeSharpened(ItemStack itemstack, float level) { - if (itemstack == null) - return false; - return false; - } - - /** - * The max amount of uses of sharpness - */ - public static float getMaxSharpness(ItemStack item) { - return getSharpnessTraits(item)[0]; - } - - /** - * The max percent that it can increase damage - */ - public static float getMaxSharpnessPercent(ItemStack item) { - return getSharpnessTraits(item)[1]; - } - - /** - * The modifier for how much percent is added each use - */ - public static float getSharpUsesModifier(ItemStack item) { - return getSharpnessTraits(item)[2]; - } - - // maxSharpness, maxBuff, sharpnessModifier - public static float[] getSharpnessTraits(ItemStack item) { - float[] list = new float[] { 100, 20F, 3F }; - - if (item != null && item.getItem() instanceof ISharpenable) { - ISharpenable instance = (ISharpenable) item.getItem(); - list[0] = instance.getMaxSharpness(item); - list[1] = instance.getDamagePercentMax(item); - list[2] = instance.getSharpUsesModifier(item); - } - return list; - } - - public static String[] breakdownLineForResearchArray(String string) { - String temp = ""; - ArrayList entries = new ArrayList(); - - for (int a = 0; a < string.length(); a++) { - if (a == string.length() - 1) { - temp = temp + string.charAt(a); - } - if (string.charAt(a) == " ".charAt(0) || a == string.length() - 1) { - entries.add(temp); - } else { - if (string.charAt(a) != " ".charAt(0)) { - temp = temp + string.charAt(a); - } - } - } - int size = entries.size(); - String[] stringList = new String[size]; - for (int i = 0; i < size; i++) { - stringList[i] = entries.get(i); - } - return stringList; - } - - public static boolean isToolSufficient(ItemStack heldItem, String toolNeeded, int toolTierNeeded) { - String toolType = getCrafterTool(heldItem); - int tier = getCrafterTier(heldItem); - - return toolType.equalsIgnoreCase(toolNeeded) && tier >= toolTierNeeded; - } - - public static void setUnbreakable(ItemStack tool) { - if (!tool.hasTagCompound()) { - tool.setTagCompound(new NBTTagCompound()); - } - tool.getTagCompound().setBoolean("Unbreakable", true); - } + // CRAFTER TOOLS// + + public static final String sharpnessLevelNBT = "MF_Sharpness_Level"; + private static String specialItem = "MF_SpecialItemType"; + + public static boolean shouldShowTooltip(ItemStack tool) { + String type = getCrafterTool(tool); + + return type != null && !type.equalsIgnoreCase("nothing") && !type.equalsIgnoreCase("hands"); + } + + public static float getCrafterEfficiency(ItemStack tool) { + if (tool == null) { + return 1F; + } + if (tool.getItem() instanceof IToolMF) { + return ((IToolMF) tool.getItem()).getEfficiency(tool); + } + return CustomCrafterEntry.getEntryEfficiency(tool); + } + + // MATERIALS// + + public static int getCrafterTier(ItemStack tool) { + if (tool == null) { + return 0; + } + if (tool.getItem() instanceof IToolMF) { + return ((IToolMF) tool.getItem()).getTier(tool); + } + return CustomCrafterEntry.getEntryTier(tool); + } + + // QUALITY// + + public static String getCrafterTool(ItemStack tool) { + if (tool == null) { + return "hands"; + } + if (tool.getItem() instanceof IToolMF) { + return ((IToolMF) tool.getItem()).getToolType(tool); + } + return CustomCrafterEntry.getEntryType(tool); + } + + /** + * Compares an itemstack to see if the item is made from the said material ONLY + * APPLIES TO IToolMaterial in api. + */ + public static boolean isItemMaterial(ItemStack stack, ToolMaterial material) { + if (stack != null) { + // You need the item to implement this so it can see + if (stack.getItem() instanceof IToolMaterial) { + IToolMaterial mat = (IToolMaterial) stack.getItem(); + + return mat.getMaterial() != null && mat.getMaterial() == material; + } + } + return false; + } + + public static ItemStack setQuality(ItemStack item, float qualityLvl) { + if (item.getMaxStackSize() > 0) + return item; + + NBTTagCompound nbt = getOrCreateNBT(item); + nbt.setFloat("MFCraftQuality", qualityLvl); + + return item; + } + + /** + * Gets how well an item has been crafted: 100 is default ranging from 0-200 + */ + public static float getQualityLevel(ItemStack stack) { + if (stack.getMaxStackSize() == 1) { + if (stack.hasTagCompound() && stack.getTagCompound().hasKey("MFCraftQuality")) { + return stack.getTagCompound().getFloat("MFCraftQuality"); + } + } + return 100.0F; + } + + public static int setDuraOnQuality(ItemStack item, int dura) { + float quality = getQualityLevel(item); + if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { + if (item.getTagCompound().getBoolean("MF_Inferior")) { + dura /= 2; + } else { + dura *= 2; + } + } + + if (quality > 100) { + dura += ((dura) / 100F * (quality - 100));// This means 100+ adds to 2x durability at level 200 + } + if (quality < 100) { + dura -= ((dura * 0.75) / 100 * (100F - quality));// This means 100- takes upto 75% from it's max durability + // lvl0 is 25%dura + } + return dura; + } + + public static float modifyDigOnQuality(ItemStack item, float digspeed) { + if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { + if (item.getTagCompound().getBoolean("MF_Inferior")) { + digspeed /= 1.25F; + } else { + digspeed *= 1.25F; + } + } + float quality = getQualityLevel(item); + + if (quality > 100) { + digspeed += ((digspeed * 0.5F) / 100F * (quality - 100));// This means 100+ adds 50% speed at level 200 + } + if (quality < 100) { + digspeed -= ((digspeed * 0.5) / 100 * (100F - quality));// This means 100- takes upto 50% from it's max + // speed lvl0 is 50% speed + } + return digspeed; + } + + // NBT// + + public static float modifyDamOnQuality(ItemStack item, float damage) { + float quality = getQualityLevel(item); + if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { + if (item.getTagCompound().getBoolean("MF_Inferior")) { + damage /= 1.25F; + } else { + damage *= 1.25F; + } + } + if (quality > 100) { + damage += ((damage * 0.25F) / 100F * (quality - 100));// This means 100+ adds 25% damage at level 200 + } + if (quality < 100) { + damage -= ((damage * 0.25) / 100 * (100F - quality));// This means 100- takes upto 25% from it's max damage + // lvl0 is 75% damage + } + return damage; + } + + public static float modifyArmourRating(ItemStack item, float rating) { + float quality = getQualityLevel(item); + if (item.hasTagCompound() && item.getTagCompound().hasKey("MF_Inferior")) { + if (item.getTagCompound().getBoolean("MF_Inferior")) { + rating /= 1.25F; + } else { + rating *= 1.25F; + } + } + + if (quality > 100) { + rating += ((rating * 0.5F) / 100F * (quality - 100));// This means 100+ adds 50% armour at level 200 + } + if (quality < 100) { + rating -= ((rating * 0.5) / 100 * (100F - quality));// This means 100- takes upto 50% from it's max armour + // lvl0 is 50% armour + } + return rating; + } + + private static NBTTagCompound getOrCreateNBT(ItemStack item) { + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + + return item.getTagCompound(); + } + + public static boolean hasCustomQualityTag(ItemStack item) { + return item.hasTagCompound() && item.getTagCompound().hasKey("MFCraftQuality"); + } + + public static void setSpecial(ItemStack item, String type) { + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + item.getTagCompound().setString(specialItem, type); + } + + public static boolean isSpecial(ItemStack item, String type) { + return getSpecial(item) != null && getSpecial(item).equals(type); + } + + public static String getSpecial(ItemStack item) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(specialItem)) { + return item.getTagCompound().getString(specialItem); + } + return null; + } + + public static void setToolSharpness(ItemStack item, float level) { + NBTTagCompound nbt = getOrCreateNBT(item); + float currentLevel = getSharpnessLevel(item); + float maxLevel = getMaxSharpness(item); + nbt.setFloat(sharpnessLevelNBT, Math.min(maxLevel, currentLevel + level)); + } + + public static float getSharpnessLevel(ItemStack item) { + NBTTagCompound nbt = item.getTagCompound(); + if (nbt != null && nbt.hasKey(sharpnessLevelNBT)) { + return nbt.getFloat(sharpnessLevelNBT); + } + return 0F; + } + + public static boolean canBeSharpened(ItemStack itemstack, float level) { + if (itemstack == null) + return false; + return false; + } + + /** + * The max amount of uses of sharpness + */ + public static float getMaxSharpness(ItemStack item) { + return getSharpnessTraits(item)[0]; + } + + /** + * The max percent that it can increase damage + */ + public static float getMaxSharpnessPercent(ItemStack item) { + return getSharpnessTraits(item)[1]; + } + + /** + * The modifier for how much percent is added each use + */ + public static float getSharpUsesModifier(ItemStack item) { + return getSharpnessTraits(item)[2]; + } + + // maxSharpness, maxBuff, sharpnessModifier + public static float[] getSharpnessTraits(ItemStack item) { + float[] list = new float[]{100, 20F, 3F}; + + if (item != null && item.getItem() instanceof ISharpenable) { + ISharpenable instance = (ISharpenable) item.getItem(); + list[0] = instance.getMaxSharpness(item); + list[1] = instance.getDamagePercentMax(item); + list[2] = instance.getSharpUsesModifier(item); + } + return list; + } + + public static String[] breakdownLineForResearchArray(String string) { + String temp = ""; + ArrayList entries = new ArrayList(); + + for (int a = 0; a < string.length(); a++) { + if (a == string.length() - 1) { + temp = temp + string.charAt(a); + } + if (string.charAt(a) == " ".charAt(0) || a == string.length() - 1) { + entries.add(temp); + } else { + if (string.charAt(a) != " ".charAt(0)) { + temp = temp + string.charAt(a); + } + } + } + int size = entries.size(); + String[] stringList = new String[size]; + for (int i = 0; i < size; i++) { + stringList[i] = entries.get(i); + } + return stringList; + } + + public static boolean isToolSufficient(ItemStack heldItem, String toolNeeded, int toolTierNeeded) { + String toolType = getCrafterTool(heldItem); + int tier = getCrafterTier(heldItem); + + return toolType.equalsIgnoreCase(toolNeeded) && tier >= toolTierNeeded; + } + + public static void setUnbreakable(ItemStack tool) { + if (!tool.hasTagCompound()) { + tool.setTagCompound(new NBTTagCompound()); + } + tool.getTagCompound().setBoolean("Unbreakable", true); + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/IArtefact.java b/src/main/java/minefantasy/mf2/api/knowledge/IArtefact.java index c8b88191..680cc897 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/IArtefact.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/IArtefact.java @@ -3,5 +3,5 @@ import net.minecraft.item.ItemStack; public interface IArtefact { - public int getStudyTime(ItemStack item); + public int getStudyTime(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java b/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java index b350daec..1cfaeb17 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java @@ -1,7 +1,5 @@ package minefantasy.mf2.api.knowledge; -import java.util.ArrayList; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.knowledge.client.EntryPage; @@ -15,104 +13,88 @@ import net.minecraft.stats.IStatStringFormat; import net.minecraft.util.StatCollector; +import java.util.ArrayList; + public class InformationBase { - public static boolean easyResearch = false; - public static boolean unlockAll = false; - public int ID = 0; - private static int nextID = 0; - private boolean startedUnlocked = false; - public final int displayColumn; - public final int displayRow; - public final InformationBase parentInfo; - private final String description; - @SideOnly(Side.CLIENT) - private IStatStringFormat statStringFormatter; - public final ItemStack theItemStack; - private boolean isSpecial; - private boolean isPerk; - private final String idName; - private ArrayList skills = new ArrayList(); - public String[] requirements = null; - private int artefactCount = 0; - - public InformationBase(String name, int x, int y, int artefacts, Item icon, InformationBase parent) { - this(name, x, y, artefacts, new ItemStack(icon), parent); - } - - public InformationBase(String name, int x, int y, int artefacts, Block icon, InformationBase parent) { - this(name, x, y, artefacts, new ItemStack(icon), parent); - } - - public InformationBase(String name, int x, int y, int artefacts, ItemStack icon, InformationBase parent) { - this.idName = name; - this.theItemStack = icon; - this.description = "knowledge." + idName + ".desc"; - this.displayColumn = x; - this.displayRow = y; - - if (x < InformationList.minDisplayColumn) { - InformationList.minDisplayColumn = x; - } - - if (y < InformationList.minDisplayRow) { - InformationList.minDisplayRow = y; - } - - if (x > InformationList.maxDisplayColumn) { - InformationList.maxDisplayColumn = x; - } - - if (y > InformationList.maxDisplayRow) { - InformationList.maxDisplayRow = y; - } - this.parentInfo = parent; - this.artefactCount = Math.max(0, artefacts); - } - - public InformationBase addSkill(Skill skill, int level) { - if (RPGElements.isSystemActive) { - skills.add(new SkillRequirement(skill, level)); - } - return this; - } - - public InformationBase setUnlocked() { - startedUnlocked = true; - return this; - } - - public InformationBase setPage(InformationPage page) { - page.addInfo(this); - return this; - } - - /** - * Special achievements have a 'spiked' (on normal texture pack) frame, special - * achievements are the hardest ones to achieve. - */ - public InformationBase setSpecial() { - this.isSpecial = true; - return this; - } - - public InformationBase setPerk() { - this.isPerk = true; - return this; - } - - /** - * Register the stat into StatList. - */ - public InformationBase registerStat() { - ID = nextID; - nextID++; - InformationList.knowledgeList.add(this); - InformationList.nameMap.put(idName.toLowerCase(), this); - return this; - } + public static boolean easyResearch = false; + public static boolean unlockAll = false; + public static Item scroll; + private static int nextID = 0; + public final int displayColumn; + public final int displayRow; + public final InformationBase parentInfo; + public final ItemStack theItemStack; + private final String description; + private final String idName; + public int ID = 0; + public String[] requirements = null; + /** + * Returns the fully description of the achievement - ready to be displayed on + * screen. + */ + public Object[] descriptValues; + private boolean startedUnlocked = false; + @SideOnly(Side.CLIENT) + private IStatStringFormat statStringFormatter; + private boolean isSpecial; + private boolean isPerk; + private ArrayList skills = new ArrayList(); + private int artefactCount = 0; + private ArrayList pages = new ArrayList(); + + public InformationBase(String name, int x, int y, int artefacts, Item icon, InformationBase parent) { + this(name, x, y, artefacts, new ItemStack(icon), parent); + } + + public InformationBase(String name, int x, int y, int artefacts, Block icon, InformationBase parent) { + this(name, x, y, artefacts, new ItemStack(icon), parent); + } + + public InformationBase(String name, int x, int y, int artefacts, ItemStack icon, InformationBase parent) { + this.idName = name; + this.theItemStack = icon; + this.description = "knowledge." + idName + ".desc"; + this.displayColumn = x; + this.displayRow = y; + + if (x < InformationList.minDisplayColumn) { + InformationList.minDisplayColumn = x; + } + + if (y < InformationList.minDisplayRow) { + InformationList.minDisplayRow = y; + } + + if (x > InformationList.maxDisplayColumn) { + InformationList.maxDisplayColumn = x; + } + + if (y > InformationList.maxDisplayRow) { + InformationList.maxDisplayRow = y; + } + this.parentInfo = parent; + this.artefactCount = Math.max(0, artefacts); + } + + public InformationBase addSkill(Skill skill, int level) { + if (RPGElements.isSystemActive) { + skills.add(new SkillRequirement(skill, level)); + } + return this; + } + + public InformationBase setUnlocked() { + startedUnlocked = true; + return this; + } + + public InformationBase setPage(InformationPage page) { + page.addInfo(this); + return this; + } /* - * public IChatComponent func_150951_e() { IChatComponent ichatcomponent = + * public IChatComponent func_150951_e() { IChatComponent ichatcomponent = * super.func_150951_e(); * ichatcomponent.getChatStyle().setColor(this.getSpecial() ? * EnumChatFormatting.DARK_PURPLE : EnumChatFormatting.GREEN); return @@ -121,159 +103,175 @@ public InformationBase registerStat() { * public InformationBase func_150953_b(Class p_150953_1_) { return * (InformationBase)super.func_150953_b(p_150953_1_); } */ - /** - * Returns the fully description of the achievement - ready to be displayed on - * screen. - */ - public Object[] descriptValues; - - public InformationBase setDescriptValues(Object... values) { - descriptValues = values; - return this; - } - - @SideOnly(Side.CLIENT) - public String getDescription() { - String localised = StatCollector.translateToLocal(this.description); - if (descriptValues != null && descriptValues.length > 0) { - localised = StatCollector.translateToLocalFormatted(description, descriptValues); - } - String text = this.statStringFormatter != null ? this.statStringFormatter.formatString(localised) : localised; - - if (RPGElements.isSystemActive) { - String[] requirements = getRequiredSkills(); - if (requirements != null && requirements.length > 0) { - text += "\n\n"; - for (String s : requirements) { - text += s + "\n"; - } - } - } - return text; - } - - @SideOnly(Side.CLIENT) - public String getDisplayName() { - String name = this.statStringFormatter != null - ? this.statStringFormatter.formatString(StatCollector.translateToLocal("knowledge." + this.idName)) - : StatCollector.translateToLocal("knowledge." + this.idName); - - if (!easyResearch) { - EntityPlayer player = Minecraft.getMinecraft().thePlayer; - if (player != null && !ResearchLogic.hasInfoUnlocked(player, this)) { - int artefacts = ResearchLogic.getArtefactCount(this.idName, player); - int max = this.getArtefactCount(); - name += StatCollector.translateToLocalFormatted("research.cluecount", artefacts, max); - } - } - - return name; - } - - /** - * Special achievements have a 'spiked' (on normal texture pack) frame, special - * achievements are the hardest ones to achieve. - */ - public boolean getSpecial() { - return this.isSpecial; - } - - public boolean getPerk() { - return this.isPerk; - } - - public boolean onPurchase(EntityPlayer user) { - if (!hasSkillsUnlocked(user)) { - return false; - } - - boolean success = ResearchLogic.canPurchase(user, this); - if (success && !user.worldObj.isRemote) { - user.worldObj.playSoundAtEntity(user, "minefantasy2:updateResearch", 1.0F, 1.0F); - if (getPerk()) { - user.worldObj.playSoundAtEntity(user, "random.levelup", 1.0F, 1.0F); - } - } - - if (isEasy()) { - ResearchLogic.tryUnlock(user, this); - } else { - } - return true; - } - - public static Item scroll; - - public boolean hasSkillsUnlocked(EntityPlayer player) { - if (skills == null) - return true; - for (int id = 0; id < skills.size(); id++) { - SkillRequirement requirement = skills.get(id); - if (!requirement.isAvailable(player)) { - return false; - } - } - return true; - } - - public String getUnlocalisedName() { - return idName; - } - - private ArrayList pages = new ArrayList(); - - public void addPages(EntryPage... info) { - for (EntryPage page : info) { - pages.add(page); - } - } - - public ArrayList getPages() { - return pages; - } - - public boolean isUnlocked(int id, EntityPlayer player) { - if (this.skills != null) { - return skills.get(id) != null && skills.get(id).isAvailable(player); - } - return true; - } - - public String[] getRequiredSkills() { - if (this.requirements == null) { - requirements = new String[skills.size()]; - for (int id = 0; id < skills.size(); id++) { - SkillRequirement requirement = skills.get(id); - requirements[id] = StatCollector.translateToLocalFormatted("rpg.required", requirement.level, - requirement.skill.getDisplayName()); - } - } - return requirements; - } - - public boolean isPreUnlocked() { - return !getPerk() && (unlockAll || startedUnlocked); - } - - public int getArtefactCount() { - return artefactCount; - } - - public boolean isEasy() { - return getPerk() || this.getArtefactCount() == 0 || easyResearch; - } + + /** + * Special achievements have a 'spiked' (on normal texture pack) frame, special + * achievements are the hardest ones to achieve. + */ + public InformationBase setSpecial() { + this.isSpecial = true; + return this; + } + + public InformationBase setPerk() { + this.isPerk = true; + return this; + } + + /** + * Register the stat into StatList. + */ + public InformationBase registerStat() { + ID = nextID; + nextID++; + InformationList.knowledgeList.add(this); + InformationList.nameMap.put(idName.toLowerCase(), this); + return this; + } + + public InformationBase setDescriptValues(Object... values) { + descriptValues = values; + return this; + } + + @SideOnly(Side.CLIENT) + public String getDescription() { + String localised = StatCollector.translateToLocal(this.description); + if (descriptValues != null && descriptValues.length > 0) { + localised = StatCollector.translateToLocalFormatted(description, descriptValues); + } + String text = this.statStringFormatter != null ? this.statStringFormatter.formatString(localised) : localised; + + if (RPGElements.isSystemActive) { + String[] requirements = getRequiredSkills(); + if (requirements != null && requirements.length > 0) { + text += "\n\n"; + for (String s : requirements) { + text += s + "\n"; + } + } + } + return text; + } + + @SideOnly(Side.CLIENT) + public String getDisplayName() { + String name = this.statStringFormatter != null + ? this.statStringFormatter.formatString(StatCollector.translateToLocal("knowledge." + this.idName)) + : StatCollector.translateToLocal("knowledge." + this.idName); + + if (!easyResearch) { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if (player != null && !ResearchLogic.hasInfoUnlocked(player, this)) { + int artefacts = ResearchLogic.getArtefactCount(this.idName, player); + int max = this.getArtefactCount(); + name += StatCollector.translateToLocalFormatted("research.cluecount", artefacts, max); + } + } + + return name; + } + + /** + * Special achievements have a 'spiked' (on normal texture pack) frame, special + * achievements are the hardest ones to achieve. + */ + public boolean getSpecial() { + return this.isSpecial; + } + + public boolean getPerk() { + return this.isPerk; + } + + public boolean onPurchase(EntityPlayer user) { + if (!hasSkillsUnlocked(user)) { + return false; + } + + boolean success = ResearchLogic.canPurchase(user, this); + if (success && !user.worldObj.isRemote) { + user.worldObj.playSoundAtEntity(user, "minefantasy2:updateResearch", 1.0F, 1.0F); + if (getPerk()) { + user.worldObj.playSoundAtEntity(user, "random.levelup", 1.0F, 1.0F); + } + } + + if (isEasy()) { + ResearchLogic.tryUnlock(user, this); + } else { + } + return true; + } + + public boolean hasSkillsUnlocked(EntityPlayer player) { + if (skills == null) + return true; + for (int id = 0; id < skills.size(); id++) { + SkillRequirement requirement = skills.get(id); + if (!requirement.isAvailable(player)) { + return false; + } + } + return true; + } + + public String getUnlocalisedName() { + return idName; + } + + public void addPages(EntryPage... info) { + for (EntryPage page : info) { + pages.add(page); + } + } + + public ArrayList getPages() { + return pages; + } + + public boolean isUnlocked(int id, EntityPlayer player) { + if (this.skills != null) { + return skills.get(id) != null && skills.get(id).isAvailable(player); + } + return true; + } + + public String[] getRequiredSkills() { + if (this.requirements == null) { + requirements = new String[skills.size()]; + for (int id = 0; id < skills.size(); id++) { + SkillRequirement requirement = skills.get(id); + requirements[id] = StatCollector.translateToLocalFormatted("rpg.required", requirement.level, + requirement.skill.getDisplayName()); + } + } + return requirements; + } + + public boolean isPreUnlocked() { + return !getPerk() && (unlockAll || startedUnlocked); + } + + public int getArtefactCount() { + return artefactCount; + } + + public boolean isEasy() { + return getPerk() || this.getArtefactCount() == 0 || easyResearch; + } } class SkillRequirement { - protected Skill skill; - protected int level; + protected Skill skill; + protected int level; - SkillRequirement(Skill skill, int level) { - this.skill = skill; - this.level = level; - } + SkillRequirement(Skill skill, int level) { + this.skill = skill; + this.level = level; + } - public boolean isAvailable(EntityPlayer player) { - return RPGElements.hasLevel(player, skill, level); - } + public boolean isAvailable(EntityPlayer player) { + return RPGElements.hasLevel(player, skill, level); + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java b/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java index f892e712..7007acfe 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/InformationList.java @@ -1,37 +1,47 @@ package minefantasy.mf2.api.knowledge; +import minefantasy.mf2.api.rpg.SkillList; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import minefantasy.mf2.api.rpg.SkillList; - public class InformationList { - public static InformationPage artisanry = new InformationPage("infoPage.artisanry", SkillList.artisanry) - .registerInfoPage(); - public static InformationPage construction = new InformationPage("infoPage.construction", SkillList.construction) - .registerInfoPage(); - public static InformationPage provisioning = new InformationPage("infoPage.provisioning", SkillList.provisioning) - .registerInfoPage(); - public static InformationPage engineering = new InformationPage("infoPage.engineering", SkillList.engineering) - .registerInfoPage(); - public static InformationPage mastery = new InformationPage("infoPage.mastery", null).registerInfoPage(); + public static InformationPage artisanry = new InformationPage("infoPage.artisanry", SkillList.artisanry) + .registerInfoPage(); + public static InformationPage construction = new InformationPage("infoPage.construction", SkillList.construction) + .registerInfoPage(); + public static InformationPage provisioning = new InformationPage("infoPage.provisioning", SkillList.provisioning) + .registerInfoPage(); + public static InformationPage engineering = new InformationPage("infoPage.engineering", SkillList.engineering) + .registerInfoPage(); + public static InformationPage mastery = new InformationPage("infoPage.mastery", null).registerInfoPage(); - /** Is the smallest column used to display a achievement on the GUI. */ - public static int minDisplayColumn; - /** Is the smallest row used to display a achievement on the GUI. */ - public static int minDisplayRow; - /** Is the biggest column used to display a achievement on the GUI. */ - public static int maxDisplayColumn; - /** Is the biggest row used to display a achievement on the GUI. */ - public static int maxDisplayRow; - /** Holds a list of all registered achievements. */ - public static List knowledgeList = new ArrayList(); - public static HashMap nameMap = new HashMap(); + /** + * Is the smallest column used to display a achievement on the GUI. + */ + public static int minDisplayColumn; + /** + * Is the smallest row used to display a achievement on the GUI. + */ + public static int minDisplayRow; + /** + * Is the biggest column used to display a achievement on the GUI. + */ + public static int maxDisplayColumn; + /** + * Is the biggest row used to display a achievement on the GUI. + */ + public static int maxDisplayRow; + /** + * Holds a list of all registered achievements. + */ + public static List knowledgeList = new ArrayList(); + public static HashMap nameMap = new HashMap(); - /** - * A stub functions called to make the static initializer for this class run. - */ - public static void init() { - } + /** + * A stub functions called to make the static initializer for this class run. + */ + public static void init() { + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java b/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java index 9cdb81b1..75e064a2 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/InformationPage.java @@ -1,115 +1,106 @@ package minefantasy.mf2.api.knowledge; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; - import minefantasy.mf2.api.rpg.Skill; import net.minecraft.util.StatCollector; +import java.util.*; + public class InformationPage { - private String name; - private LinkedList entries; - public final Skill baseSkill; - - public InformationPage(String name, Skill skill, InformationBase... achievements) { - this.name = name; - this.baseSkill = skill; - this.entries = new LinkedList(Arrays.asList(achievements)); - } - - public String getName() { - return name; - } - - public List getInfoList() { - return entries; - } - - private static LinkedList infoPages = new LinkedList(); - - /** - * Registers an achievement page. - * - * @param page - * The page. - */ - public static void registerInfoPage(InformationPage page) { - if (getInfoPage(page.getName()) != null) { - throw new RuntimeException("Duplicate achievement page name \"" + page.getName() + "\"!"); - } - infoPages.add(page); - } - - /** - * Will return an achievement page by its index on the list. - * - * @param index - * The page's index. - * @return the achievement page corresponding to the index or null if invalid - * index - */ - public static InformationPage getInfoPage(int index) { - return infoPages.get(index); - } - - /** - * Will return an achievement page by its name. - * - * @param name - * The page's name. - * @return the achievement page with the given name or null if no such page - */ - public static InformationPage getInfoPage(String name) { - for (InformationPage page : infoPages) { - if (page.getName().equals(name)) { - return page; - } - } - return null; - } - - /** - * Will return the list of achievement pages. - * - * @return the list's size - */ - public static Set getInfoPages() { - return new HashSet(infoPages); - } - - /** - * Will return whether an achievement is in any page or not. - * - * @param achievement - * The achievement. - */ - public static boolean isInfoInPages(InformationBase achievement) { - for (InformationPage page : infoPages) { - if (page.getInfoList().contains(achievement)) { - return true; - } - } - return false; - } - - public static String getTitle(int index) { - return StatCollector.translateToLocal(index == -1 ? "infoPage.basic" : getInfoPage(index).getName()); - } - - public static Skill getSkill(int index) { - return index == -1 ? null : getInfoPage(index).baseSkill; - } - - public void addInfo(InformationBase entry) { - entries.add(entry); - } - - public InformationPage registerInfoPage() { - registerInfoPage(this); - return this; - } + private static LinkedList infoPages = new LinkedList(); + public final Skill baseSkill; + private String name; + private LinkedList entries; + + public InformationPage(String name, Skill skill, InformationBase... achievements) { + this.name = name; + this.baseSkill = skill; + this.entries = new LinkedList(Arrays.asList(achievements)); + } + + /** + * Registers an achievement page. + * + * @param page The page. + */ + public static void registerInfoPage(InformationPage page) { + if (getInfoPage(page.getName()) != null) { + throw new RuntimeException("Duplicate achievement page name \"" + page.getName() + "\"!"); + } + infoPages.add(page); + } + + /** + * Will return an achievement page by its index on the list. + * + * @param index The page's index. + * @return the achievement page corresponding to the index or null if invalid + * index + */ + public static InformationPage getInfoPage(int index) { + return infoPages.get(index); + } + + /** + * Will return an achievement page by its name. + * + * @param name The page's name. + * @return the achievement page with the given name or null if no such page + */ + public static InformationPage getInfoPage(String name) { + for (InformationPage page : infoPages) { + if (page.getName().equals(name)) { + return page; + } + } + return null; + } + + /** + * Will return the list of achievement pages. + * + * @return the list's size + */ + public static Set getInfoPages() { + return new HashSet(infoPages); + } + + /** + * Will return whether an achievement is in any page or not. + * + * @param achievement The achievement. + */ + public static boolean isInfoInPages(InformationBase achievement) { + for (InformationPage page : infoPages) { + if (page.getInfoList().contains(achievement)) { + return true; + } + } + return false; + } + + public static String getTitle(int index) { + return StatCollector.translateToLocal(index == -1 ? "infoPage.basic" : getInfoPage(index).getName()); + } + + public static Skill getSkill(int index) { + return index == -1 ? null : getInfoPage(index).baseSkill; + } + + public String getName() { + return name; + } + + public List getInfoList() { + return entries; + } + + public void addInfo(InformationBase entry) { + entries.add(entry); + } + + public InformationPage registerInfoPage() { + registerInfoPage(this); + return this; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/api/knowledge/KnowledgeType.java b/src/main/java/minefantasy/mf2/api/knowledge/KnowledgeType.java index b35e392b..f48b36bd 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/KnowledgeType.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/KnowledgeType.java @@ -4,17 +4,17 @@ public class KnowledgeType { - public final String id; - public final EnumChatFormatting color; - public final boolean autoUnlock; + public final String id; + public final EnumChatFormatting color; + public final boolean autoUnlock; - public KnowledgeType(String id, EnumChatFormatting color, boolean autoUnlock) { - this.id = id; - this.color = color; - this.autoUnlock = autoUnlock; - } + public KnowledgeType(String id, EnumChatFormatting color, boolean autoUnlock) { + this.id = id; + this.color = color; + this.autoUnlock = autoUnlock; + } - public String getUnlocalizedName() { - return "botania.knowledge." + id; - } + public String getUnlocalizedName() { + return "botania.knowledge." + id; + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/ResearchArtefacts.java b/src/main/java/minefantasy/mf2/api/knowledge/ResearchArtefacts.java index afb78cd2..2f6467e6 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/ResearchArtefacts.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/ResearchArtefacts.java @@ -1,64 +1,64 @@ package minefantasy.mf2.api.knowledge; -import java.util.ArrayList; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; + public class ResearchArtefacts { - public static void addArtefact(Object input, InformationBase research) { - addArtefact(input, research.getUnlocalisedName()); - } + public static void addArtefact(Object input, InformationBase research) { + addArtefact(input, research.getUnlocalisedName()); + } - public static void addArtefact(Object input, String research) { - ItemStack itemstack = convert(input); + public static void addArtefact(Object input, String research) { + ItemStack itemstack = convert(input); - if (itemstack != null) { - OreDictionary.registerOre("Artefact-" + research, itemstack); - } - } + if (itemstack != null) { + OreDictionary.registerOre("Artefact-" + research, itemstack); + } + } - public static ArrayList getResearchNames(ItemStack item) { - ArrayList names = new ArrayList(); - if (item == null) - return names; + public static ArrayList getResearchNames(ItemStack item) { + ArrayList names = new ArrayList(); + if (item == null) + return names; - for (int i : OreDictionary.getOreIDs(item)) { - String name = OreDictionary.getOreName(i); - if (name != null && name.startsWith("Artefact-")) { - String str = name.substring(9); - names.add(str); - } - } - return names; - } + for (int i : OreDictionary.getOreIDs(item)) { + String name = OreDictionary.getOreName(i); + if (name != null && name.startsWith("Artefact-")) { + String str = name.substring(9); + names.add(str); + } + } + return names; + } - public static ItemStack convert(Object input) { - if (input == null) - return null; + public static ItemStack convert(Object input) { + if (input == null) + return null; - ItemStack itemstack = null; - if (input instanceof ItemStack) { - return (ItemStack) input; - } else if (input instanceof Block) { - return new ItemStack((Block) input, 1, OreDictionary.WILDCARD_VALUE); - } else if (input instanceof Item) { - return new ItemStack((Item) input, 1, OreDictionary.WILDCARD_VALUE); - } + ItemStack itemstack = null; + if (input instanceof ItemStack) { + return (ItemStack) input; + } else if (input instanceof Block) { + return new ItemStack((Block) input, 1, OreDictionary.WILDCARD_VALUE); + } else if (input instanceof Item) { + return new ItemStack((Item) input, 1, OreDictionary.WILDCARD_VALUE); + } - return null; - } + return null; + } - public static int useArtefact(ItemStack itemStack, InformationBase base, EntityPlayer user) { - int artefacts = ResearchLogic.addArtefact(base.getUnlocalisedName().toLowerCase(), user); - ResearchLogic.addArtefactUsed(user, base, itemStack); - if (artefacts >= base.getArtefactCount()) { - ResearchLogic.tryUnlock(user, base); - return -1; - } - return artefacts; - } + public static int useArtefact(ItemStack itemStack, InformationBase base, EntityPlayer user) { + int artefacts = ResearchLogic.addArtefact(base.getUnlocalisedName().toLowerCase(), user); + ResearchLogic.addArtefactUsed(user, base, itemStack); + if (artefacts >= base.getArtefactCount()) { + ResearchLogic.tryUnlock(user, base); + return -1; + } + return artefacts; + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/ResearchLogic.java b/src/main/java/minefantasy/mf2/api/knowledge/ResearchLogic.java index a460cee6..be3765b0 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/ResearchLogic.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/ResearchLogic.java @@ -10,151 +10,151 @@ import net.minecraft.world.WorldServer; public class ResearchLogic { - public static boolean canPurchase(EntityPlayer player, InformationBase base) { - if (base.isPreUnlocked() || !canUnlockInfo(player, base)) { - return false; - } - NBTTagCompound nbt = getNBT(player); - if (!nbt.hasKey("Research_" + base.getUnlocalisedName())) { - return true; - } - return false; - } - - public static void forceUnlock(EntityPlayer player, InformationBase base) { - NBTTagCompound nbt = getNBT(player); - nbt.setBoolean("Research_" + base.getUnlocalisedName(), true); - } - - public static boolean tryUnlock(EntityPlayer player, InformationBase base) { - if (base.isPreUnlocked() || !canUnlockInfo(player, base)) { - return false; - } - NBTTagCompound nbt = getNBT(player); - if (!nbt.hasKey("Research_" + base.getUnlocalisedName())) { - nbt.setBoolean("Research_" + base.getUnlocalisedName(), true); - return true; - } - return false; - } - - public static boolean hasInfoUnlocked(EntityPlayer player, InformationBase base) { - if (base.isPreUnlocked()) - return base.parentInfo == null || hasInfoUnlocked(player, base.parentInfo); - - NBTTagCompound nbt = getNBT(player); - String basename = base.getUnlocalisedName(); - if (nbt.hasKey("Research_" + basename)) { - return nbt.getBoolean("Research_" + basename); - } - return false; - } - - public static boolean hasInfoUnlocked(EntityPlayer player, String basename) { - InformationBase base = getResearch(basename); - if (base != null) { - return hasInfoUnlocked(player, base); - } - return true; - } - - public static boolean hasInfoUnlocked(EntityPlayer player, String[] basenames) { - for (String basename : basenames) { - InformationBase base = InformationList.nameMap.get(basename); - if (base != null) { - if (!hasInfoUnlocked(player, base)) { - return false; - } - } - } - return true; - } - - private static NBTTagCompound getNBT(EntityPlayer player) { - NBTTagCompound persistant = PlayerTagData.getPersistedData(player); - if (!persistant.hasKey(KnowledgeNBT)) { - NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger("Layer", knowledgelyr); - persistant.setTag(KnowledgeNBT, tag); - } - NBTTagCompound load = persistant.getCompoundTag(KnowledgeNBT); - if (load.getInteger("Layer") != knowledgelyr) { - persistant.removeTag(KnowledgeNBT); - - NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger("Layer", knowledgelyr); - persistant.setTag(KnowledgeNBT, tag); - } - return load; - } - - /** - * Returns true if the parent has been unlocked, or there is no parent - */ - public static boolean canUnlockInfo(EntityPlayer player, InformationBase base) { - return base.parentInfo == null || hasInfoUnlocked(player, base.parentInfo); - } - - @SideOnly(Side.CLIENT) - public static int func_150874_c(EntityPlayer player, InformationBase base) { - if (hasInfoUnlocked(player, base)) { - return 0; - } else { - int i = 0; - - for (InformationBase knowledge1 = base.parentInfo; knowledge1 != null - && !hasInfoUnlocked(player, knowledge1); ++i) { - knowledge1 = knowledge1.parentInfo; - } - return i; - } - } - - public static final String KnowledgeNBT = "Knowledge"; - public static int knowledgelyr = 0; - - public static void syncData(EntityPlayer player) { - if (!player.worldObj.isRemote) { - ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, - new KnowledgePacket(player).generatePacket()); - } - } - - public static InformationBase getResearch(String researchName) { - return InformationList.nameMap.get(researchName.toLowerCase()); - } - - public static int getArtefactCount(String research, EntityPlayer user) { - NBTTagCompound nbt = getNBT(user); - return nbt.getInteger("ArtefactCount-" + research); - } - - public static void setArtefactCount(String research, EntityPlayer user, int count) { - NBTTagCompound nbt = getNBT(user); - nbt.setInteger("ArtefactCount-" + research, count); - } - - public static int addArtefact(String research, EntityPlayer user) { - int count = getArtefactCount(research, user); - ++count; - setArtefactCount(research, user, count); - return count; - } - - public static void addArtefactUsed(EntityPlayer user, InformationBase base, ItemStack item) { - NBTTagCompound nbt = getNBT(user); - nbt.setBoolean(getKeyName(item, base), true); - } - - public static boolean alreadyUsedArtefact(EntityPlayer user, InformationBase base, ItemStack item) { - NBTTagCompound nbt = getNBT(user); - if (nbt.hasKey(getKeyName(item, base))) { - return true; - } - return false; - } - - private static String getKeyName(ItemStack item, InformationBase base) { - return "research_" + base.getUnlocalisedName() + "_" + item.getUnlocalizedName() + "_" + item.getItemDamage(); - } + public static final String KnowledgeNBT = "Knowledge"; + public static int knowledgelyr = 0; + + public static boolean canPurchase(EntityPlayer player, InformationBase base) { + if (base.isPreUnlocked() || !canUnlockInfo(player, base)) { + return false; + } + NBTTagCompound nbt = getNBT(player); + if (!nbt.hasKey("Research_" + base.getUnlocalisedName())) { + return true; + } + return false; + } + + public static void forceUnlock(EntityPlayer player, InformationBase base) { + NBTTagCompound nbt = getNBT(player); + nbt.setBoolean("Research_" + base.getUnlocalisedName(), true); + } + + public static boolean tryUnlock(EntityPlayer player, InformationBase base) { + if (base.isPreUnlocked() || !canUnlockInfo(player, base)) { + return false; + } + NBTTagCompound nbt = getNBT(player); + if (!nbt.hasKey("Research_" + base.getUnlocalisedName())) { + nbt.setBoolean("Research_" + base.getUnlocalisedName(), true); + return true; + } + return false; + } + + public static boolean hasInfoUnlocked(EntityPlayer player, InformationBase base) { + if (base.isPreUnlocked()) + return base.parentInfo == null || hasInfoUnlocked(player, base.parentInfo); + + NBTTagCompound nbt = getNBT(player); + String basename = base.getUnlocalisedName(); + if (nbt.hasKey("Research_" + basename)) { + return nbt.getBoolean("Research_" + basename); + } + return false; + } + + public static boolean hasInfoUnlocked(EntityPlayer player, String basename) { + InformationBase base = getResearch(basename); + if (base != null) { + return hasInfoUnlocked(player, base); + } + return true; + } + + public static boolean hasInfoUnlocked(EntityPlayer player, String[] basenames) { + for (String basename : basenames) { + InformationBase base = InformationList.nameMap.get(basename); + if (base != null) { + if (!hasInfoUnlocked(player, base)) { + return false; + } + } + } + return true; + } + + private static NBTTagCompound getNBT(EntityPlayer player) { + NBTTagCompound persistant = PlayerTagData.getPersistedData(player); + if (!persistant.hasKey(KnowledgeNBT)) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("Layer", knowledgelyr); + persistant.setTag(KnowledgeNBT, tag); + } + NBTTagCompound load = persistant.getCompoundTag(KnowledgeNBT); + if (load.getInteger("Layer") != knowledgelyr) { + persistant.removeTag(KnowledgeNBT); + + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("Layer", knowledgelyr); + persistant.setTag(KnowledgeNBT, tag); + } + return load; + } + + /** + * Returns true if the parent has been unlocked, or there is no parent + */ + public static boolean canUnlockInfo(EntityPlayer player, InformationBase base) { + return base.parentInfo == null || hasInfoUnlocked(player, base.parentInfo); + } + + @SideOnly(Side.CLIENT) + public static int func_150874_c(EntityPlayer player, InformationBase base) { + if (hasInfoUnlocked(player, base)) { + return 0; + } else { + int i = 0; + + for (InformationBase knowledge1 = base.parentInfo; knowledge1 != null + && !hasInfoUnlocked(player, knowledge1); ++i) { + knowledge1 = knowledge1.parentInfo; + } + return i; + } + } + + public static void syncData(EntityPlayer player) { + if (!player.worldObj.isRemote) { + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new KnowledgePacket(player).generatePacket()); + } + } + + public static InformationBase getResearch(String researchName) { + return InformationList.nameMap.get(researchName.toLowerCase()); + } + + public static int getArtefactCount(String research, EntityPlayer user) { + NBTTagCompound nbt = getNBT(user); + return nbt.getInteger("ArtefactCount-" + research); + } + + public static void setArtefactCount(String research, EntityPlayer user, int count) { + NBTTagCompound nbt = getNBT(user); + nbt.setInteger("ArtefactCount-" + research, count); + } + + public static int addArtefact(String research, EntityPlayer user) { + int count = getArtefactCount(research, user); + ++count; + setArtefactCount(research, user, count); + return count; + } + + public static void addArtefactUsed(EntityPlayer user, InformationBase base, ItemStack item) { + NBTTagCompound nbt = getNBT(user); + nbt.setBoolean(getKeyName(item, base), true); + } + + public static boolean alreadyUsedArtefact(EntityPlayer user, InformationBase base, ItemStack item) { + NBTTagCompound nbt = getNBT(user); + if (nbt.hasKey(getKeyName(item, base))) { + return true; + } + return false; + } + + private static String getKeyName(ItemStack item, InformationBase base) { + return "research_" + base.getUnlocalisedName() + "_" + item.getUnlocalizedName() + "_" + item.getItemDamage(); + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPage.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPage.java index a03c0004..d8179ca9 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPage.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPage.java @@ -6,12 +6,11 @@ @SideOnly(Side.CLIENT) public abstract class EntryPage { - public static final int universalBookImageWidth = 178; - public static final int universalBookImageHeight = 227; + public static final int universalBookImageWidth = 178; + public static final int universalBookImageHeight = 227; + public static int[] recipeOffsets = new int[]{15, 22}; - public abstract void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick); + public abstract void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick); - public abstract void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick); - - public static int[] recipeOffsets = new int[] { 15, 22 }; + public abstract void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick); } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageBlastFurnace.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageBlastFurnace.java index c9a829c0..7aa364a4 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageBlastFurnace.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageBlastFurnace.java @@ -1,12 +1,5 @@ package minefantasy.mf2.api.knowledge.client; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -16,105 +9,110 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.util.ArrayList; +import java.util.List; public class EntryPageBlastFurnace extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private ItemStack input, output; - - public EntryPageBlastFurnace(ItemStack in, ItemStack out) { - this.input = in; - this.output = out; - } - - public EntryPageBlastFurnace(Item i1, ItemStack i2) { - this(new ItemStack(i1), i2); - } - - public EntryPageBlastFurnace(Item i1, Item i2) { - this(new ItemStack(i1), new ItemStack(i2)); - } - - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - tooltipStack = null; - - this.mc.getTextureManager() - .bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/blastfurnaceGrid.png")); - parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - String cft = "<" + StatCollector.translateToLocal("method.blastfurnace") + ">"; - mc.fontRenderer.drawSplitString(cft, - posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); - - renderRecipe(parent, x, y, f, posX, posY); - if (tooltipStack != null) { - List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); - List parsedTooltip = new ArrayList(); - boolean first = true; - - for (String s : tooltipData) { - String s_ = s; - if (!first) - s_ = EnumChatFormatting.GRAY + s; - parsedTooltip.add(s_); - first = false; - } - - minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); - } - - } - - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { - renderResult(parent, output, false, posX, posY + 74, mx, my); - renderResult(parent, input, false, posX, posY, mx, my); - } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, - int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - - int xPos = xOrigin + 80; - int yPos = yOrigin + 41; - ItemStack stack1 = stack.copy(); - if (stack1.getItemDamage() == -1) - stack1.setItemDamage(0); - - renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); - } - - private ItemStack tooltipStack; - - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, - int my) { - RenderItem render = new RenderItem(); - if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { - tooltipStack = stack; - } - boolean mouseDown = Mouse.isButtonDown(0); - - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.enableGUIStandardItemLighting(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - RenderHelper.disableStandardItemLighting(); - GL11.glPopMatrix(); - - GL11.glDisable(GL11.GL_LIGHTING); - } - - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - } + private Minecraft mc = Minecraft.getMinecraft(); + private ItemStack input, output; + private ItemStack tooltipStack; + + public EntryPageBlastFurnace(ItemStack in, ItemStack out) { + this.input = in; + this.output = out; + } + + public EntryPageBlastFurnace(Item i1, ItemStack i2) { + this(new ItemStack(i1), i2); + } + + public EntryPageBlastFurnace(Item i1, Item i2) { + this(new ItemStack(i1), new ItemStack(i2)); + } + + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + tooltipStack = null; + + this.mc.getTextureManager() + .bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/blastfurnaceGrid.png")); + parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); + + String cft = "<" + StatCollector.translateToLocal("method.blastfurnace") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); + + renderRecipe(parent, x, y, f, posX, posY); + if (tooltipStack != null) { + List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + List parsedTooltip = new ArrayList(); + boolean first = true; + + for (String s : tooltipData) { + String s_ = s; + if (!first) + s_ = EnumChatFormatting.GRAY + s; + parsedTooltip.add(s_); + first = false; + } + + minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); + } + + } + + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { + renderResult(parent, output, false, posX, posY + 74, mx, my); + renderResult(parent, input, false, posX, posY, mx, my); + } + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + + int xPos = xOrigin + 80; + int yPos = yOrigin + 41; + ItemStack stack1 = stack.copy(); + if (stack1.getItemDamage() == -1) + stack1.setItemDamage(0); + + renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); + } + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { + RenderItem render = new RenderItem(); + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { + tooltipStack = stack; + } + boolean mouseDown = Mouse.isButtonDown(0); + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + RenderHelper.disableStandardItemLighting(); + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + } + + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCraft.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCraft.java index 95429770..cb5b36f7 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCraft.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCraft.java @@ -6,42 +6,42 @@ import net.minecraft.item.crafting.IRecipe; public class EntryPageCraft extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private IRecipe[] recipes = new IRecipe[] {}; - public static int switchRate = 15; - private int recipeID; - - public EntryPageCraft(IRecipe... recipes) { - this.recipes = recipes; - } - - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - if (onTick) { - tickRecipes(); - } - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/craftGrid.png")); - parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - IRecipe recipe = recipes[recipeID]; - renderRecipe(parent, x, y, f, posX, posY, recipe); - - } - - private void renderRecipe(GuiScreen parent, int x, int y, float f, int posX, int posY, IRecipe recipe) { - // TODO: Render Grid - } - - private void tickRecipes() { - if (recipeID < recipes.length - 1) { - ++recipeID; - } else { - recipeID = 0; - } - } - - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - } + public static int switchRate = 15; + private Minecraft mc = Minecraft.getMinecraft(); + private IRecipe[] recipes = new IRecipe[]{}; + private int recipeID; + + public EntryPageCraft(IRecipe... recipes) { + this.recipes = recipes; + } + + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + if (onTick) { + tickRecipes(); + } + + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/craftGrid.png")); + parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); + + IRecipe recipe = recipes[recipeID]; + renderRecipe(parent, x, y, f, posX, posY, recipe); + + } + + private void renderRecipe(GuiScreen parent, int x, int y, float f, int posX, int posY, IRecipe recipe) { + // TODO: Render Grid + } + + private void tickRecipes() { + if (recipeID < recipes.length - 1) { + ++recipeID; + } else { + recipeID = 0; + } + } + + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCrucible.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCrucible.java index c6add8da..19d737e2 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCrucible.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageCrucible.java @@ -1,12 +1,5 @@ package minefantasy.mf2.api.knowledge.client; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.refine.Alloy; import net.minecraft.client.Minecraft; @@ -16,151 +9,156 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.util.ArrayList; +import java.util.List; public class EntryPageCrucible extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private Alloy[] recipes = new Alloy[] {}; - public static int switchRate = 15; - private int recipeID; - private boolean shapelessRecipe = false; - private boolean oreDictRecipe = false; - - public EntryPageCrucible(Alloy... recipes) { - this.recipes = recipes; - } - - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - if (onTick) { - tickRecipes(); - } - tooltipStack = null; - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/crucible.png")); - parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - Alloy recipe = recipes[recipeID]; - String cft = "<" + StatCollector.translateToLocal("method." + getName() + "") + ">"; - mc.fontRenderer.drawSplitString(cft, - posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 175, 117, 0); - if (recipe != null) { - currTier = recipe.getLevel(); - } - renderRecipe(parent, x, y, f, posX, posY, recipe); - - if (tooltipStack != null) { - List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); - List parsedTooltip = new ArrayList(); - boolean first = true; - - for (String s : tooltipData) { - String s_ = s; - if (!first) - s_ = EnumChatFormatting.GRAY + s; - parsedTooltip.add(s_); - first = false; - } - - minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); - } - } - - private int currTier; - - protected String getName() { - return currTier == 3 ? "crucibleT4" : currTier == 2 ? "crucibleT3" : currTier == 1 ? "crucibleT2" : "crucible"; - } - - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, Alloy recipe) { - drawGrid: { - for (int y = 0; y < 3; y++) { - for (int x = 0; x < 3; x++) { - int index = y * 3 + x; - - if (index >= recipe.recipeItems.size()) { - break drawGrid; - } - - renderItemAtGridPos(parent, 1 + x, (3 - y), (ItemStack) recipe.recipeItems.get(index), true, posX, - posY, mx, my); - } - } - } - - renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my); - } - - private void tickRecipes() { - if (recipeID < recipes.length - 1) { - ++recipeID; - } else { - recipeID = 0; - } - } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, - int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - - int xPos = xOrigin + 80; - int yPos = yOrigin + 144; - ItemStack stack1 = stack.copy(); - if (stack1.getItemDamage() == -1) - stack1.setItemDamage(0); - - renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); - } - - public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, - int xOrigin, int yOrigin, int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - - int xPos = xOrigin + x * 29 + 7 + (y == 0 && x == 3 ? 10 : 0); - int yPos = yOrigin + y * 29 - 9 - (y == 0 ? 7 : 0); - ItemStack stack1 = stack.copy(); - if (stack1.getItemDamage() == -1) - stack1.setItemDamage(0); - - renderItem(gui, xPos + 15, yPos + 22, stack1, accountForContainer, mx, my); - } - - private ItemStack tooltipStack; - - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, - int my) { - RenderItem render = new RenderItem(); - if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { - tooltipStack = stack; - } - boolean mouseDown = Mouse.isButtonDown(0); - - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.enableGUIStandardItemLighting(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - RenderHelper.disableStandardItemLighting(); - GL11.glPopMatrix(); - - GL11.glDisable(GL11.GL_LIGHTING); - } - - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - } + public static int switchRate = 15; + private Minecraft mc = Minecraft.getMinecraft(); + private Alloy[] recipes = new Alloy[]{}; + private int recipeID; + private boolean shapelessRecipe = false; + private boolean oreDictRecipe = false; + private int currTier; + private ItemStack tooltipStack; + + public EntryPageCrucible(Alloy... recipes) { + this.recipes = recipes; + } + + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + if (onTick) { + tickRecipes(); + } + tooltipStack = null; + + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/crucible.png")); + parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); + + Alloy recipe = recipes[recipeID]; + String cft = "<" + StatCollector.translateToLocal("method." + getName() + "") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 175, 117, 0); + if (recipe != null) { + currTier = recipe.getLevel(); + } + renderRecipe(parent, x, y, f, posX, posY, recipe); + + if (tooltipStack != null) { + List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + List parsedTooltip = new ArrayList(); + boolean first = true; + + for (String s : tooltipData) { + String s_ = s; + if (!first) + s_ = EnumChatFormatting.GRAY + s; + parsedTooltip.add(s_); + first = false; + } + + minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); + } + } + + protected String getName() { + return currTier == 3 ? "crucibleT4" : currTier == 2 ? "crucibleT3" : currTier == 1 ? "crucibleT2" : "crucible"; + } + + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, Alloy recipe) { + drawGrid: + { + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + int index = y * 3 + x; + + if (index >= recipe.recipeItems.size()) { + break drawGrid; + } + + renderItemAtGridPos(parent, 1 + x, (3 - y), (ItemStack) recipe.recipeItems.get(index), true, posX, + posY, mx, my); + } + } + } + + renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my); + } + + private void tickRecipes() { + if (recipeID < recipes.length - 1) { + ++recipeID; + } else { + recipeID = 0; + } + } + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + + int xPos = xOrigin + 80; + int yPos = yOrigin + 144; + ItemStack stack1 = stack.copy(); + if (stack1.getItemDamage() == -1) + stack1.setItemDamage(0); + + renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); + } + + public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, + int xOrigin, int yOrigin, int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + + int xPos = xOrigin + x * 29 + 7 + (y == 0 && x == 3 ? 10 : 0); + int yPos = yOrigin + y * 29 - 9 - (y == 0 ? 7 : 0); + ItemStack stack1 = stack.copy(); + if (stack1.getItemDamage() == -1) + stack1.setItemDamage(0); + + renderItem(gui, xPos + 15, yPos + 22, stack1, accountForContainer, mx, my); + } + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { + RenderItem render = new RenderItem(); + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { + tooltipStack = stack; + } + boolean mouseDown = Mouse.isButtonDown(0); + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + RenderHelper.disableStandardItemLighting(); + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + } + + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageGrind.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageGrind.java index 19f6e73d..a3618780 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageGrind.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageGrind.java @@ -1,12 +1,5 @@ package minefantasy.mf2.api.knowledge.client; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -16,100 +9,105 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.util.ArrayList; +import java.util.List; public class EntryPageGrind extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private ItemStack input, output; - - public EntryPageGrind(ItemStack in, ItemStack out) { - this.input = in; - this.output = out; - } - - public EntryPageGrind(Item in, Item out) { - this(new ItemStack(in), new ItemStack(out)); - } - - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - tooltipStack = null; - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/grindGrid.png")); - parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - String cft = "<" + StatCollector.translateToLocal("method.quern") + ">"; - mc.fontRenderer.drawSplitString(cft, - posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); - - renderRecipe(parent, x, y, f, posX, posY); - if (tooltipStack != null) { - List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); - List parsedTooltip = new ArrayList(); - boolean first = true; - - for (String s : tooltipData) { - String s_ = s; - if (!first) - s_ = EnumChatFormatting.GRAY + s; - parsedTooltip.add(s_); - first = false; - } - - minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); - } - - } - - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { - renderResult(parent, output, false, posX, posY + 74, mx, my); - renderResult(parent, input, false, posX, posY, mx, my); - } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, - int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - - int xPos = xOrigin + 80; - int yPos = yOrigin + 41; - ItemStack stack1 = stack.copy(); - if (stack1.getItemDamage() == -1) - stack1.setItemDamage(0); - - renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); - } - - private ItemStack tooltipStack; - - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, - int my) { - RenderItem render = new RenderItem(); - if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { - tooltipStack = stack; - } - boolean mouseDown = Mouse.isButtonDown(0); - - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.enableGUIStandardItemLighting(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - RenderHelper.disableStandardItemLighting(); - GL11.glPopMatrix(); - - GL11.glDisable(GL11.GL_LIGHTING); - } - - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - } + private Minecraft mc = Minecraft.getMinecraft(); + private ItemStack input, output; + private ItemStack tooltipStack; + + public EntryPageGrind(ItemStack in, ItemStack out) { + this.input = in; + this.output = out; + } + + public EntryPageGrind(Item in, Item out) { + this(new ItemStack(in), new ItemStack(out)); + } + + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + tooltipStack = null; + + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/grindGrid.png")); + parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); + + String cft = "<" + StatCollector.translateToLocal("method.quern") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); + + renderRecipe(parent, x, y, f, posX, posY); + if (tooltipStack != null) { + List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + List parsedTooltip = new ArrayList(); + boolean first = true; + + for (String s : tooltipData) { + String s_ = s; + if (!first) + s_ = EnumChatFormatting.GRAY + s; + parsedTooltip.add(s_); + first = false; + } + + minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); + } + + } + + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { + renderResult(parent, output, false, posX, posY + 74, mx, my); + renderResult(parent, input, false, posX, posY, mx, my); + } + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + + int xPos = xOrigin + 80; + int yPos = yOrigin + 41; + ItemStack stack1 = stack.copy(); + if (stack1.getItemDamage() == -1) + stack1.setItemDamage(0); + + renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); + } + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { + RenderItem render = new RenderItem(); + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { + tooltipStack = stack; + } + boolean mouseDown = Mouse.isButtonDown(0); + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + RenderHelper.disableStandardItemLighting(); + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + } + + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageImage.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageImage.java index b1bd3df1..89119b73 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageImage.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageImage.java @@ -8,72 +8,72 @@ import net.minecraft.util.StatCollector; public class EntryPageImage extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private String paragraph; - /** - * Recommend size: 48x48 - */ - private String image; - private int[] sizes; + private Minecraft mc = Minecraft.getMinecraft(); + private String paragraph; + /** + * Recommend size: 48x48 + */ + private String image; + private int[] sizes; - public EntryPageImage(String tex, String paragraphs) { - this(tex, 128, 128, paragraphs); - } + public EntryPageImage(String tex, String paragraphs) { + this(tex, 128, 128, paragraphs); + } - public EntryPageImage(String tex, int width, int height, String paragraphs) { - this.paragraph = paragraphs; - this.image = tex; - this.sizes = new int[] { width, height }; - } + public EntryPageImage(String tex, int width, int height, String paragraphs) { + this.paragraph = paragraphs; + this.image = tex; + this.sizes = new int[]{width, height}; + } - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - String local = StatCollector.translateToLocal(paragraph); - String text = ""; - String temp = ""; - boolean prefix = false; - for (int a = 0; a < local.length(); a++) { - char c = local.charAt(a); - if (a == local.length() - 1) { - text = text + temp + c; - temp = ""; - } else if (prefix) { - if (c == "h".charAt(0)) { - text = text + temp + EnumChatFormatting.DARK_BLUE + EnumChatFormatting.BOLD; - temp = ""; - } else if (c == "d".charAt(0)) { - text = text + temp + EnumChatFormatting.DARK_RED; - temp = ""; - } else if (c == "y".charAt(0)) { - text = text + temp + EnumChatFormatting.GOLD; - temp = ""; - } else if (c == "u".charAt(0)) { - text = text + temp + EnumChatFormatting.UNDERLINE; - temp = ""; - } else if (c == "r".charAt(0)) { - text = text + temp + EnumChatFormatting.RESET + EnumChatFormatting.BLACK; - temp = ""; - } - prefix = false; - } else if (c == "^".charAt(0)) { - text = text + temp + "\n\n"; - temp = ""; - } else if (c == "$".charAt(0)) { - prefix = true; - } else { - temp = temp + c; - } - } + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + String local = StatCollector.translateToLocal(paragraph); + String text = ""; + String temp = ""; + boolean prefix = false; + for (int a = 0; a < local.length(); a++) { + char c = local.charAt(a); + if (a == local.length() - 1) { + text = text + temp + c; + temp = ""; + } else if (prefix) { + if (c == "h".charAt(0)) { + text = text + temp + EnumChatFormatting.DARK_BLUE + EnumChatFormatting.BOLD; + temp = ""; + } else if (c == "d".charAt(0)) { + text = text + temp + EnumChatFormatting.DARK_RED; + temp = ""; + } else if (c == "y".charAt(0)) { + text = text + temp + EnumChatFormatting.GOLD; + temp = ""; + } else if (c == "u".charAt(0)) { + text = text + temp + EnumChatFormatting.UNDERLINE; + temp = ""; + } else if (c == "r".charAt(0)) { + text = text + temp + EnumChatFormatting.RESET + EnumChatFormatting.BLACK; + temp = ""; + } + prefix = false; + } else if (c == "^".charAt(0)) { + text = text + temp + "\n\n"; + temp = ""; + } else if (c == "$".charAt(0)) { + prefix = true; + } else { + temp = temp + c; + } + } - mc.fontRenderer.drawSplitString(text, posX + 14, posY + 117, 155, 0); - } + mc.fontRenderer.drawSplitString(text, posX + 14, posY + 117, 155, 0); + } - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - mc.renderEngine.bindTexture(TextureHelperMF.getResource(image)); - int xOffset = (universalBookImageWidth - sizes[0]) / 2; - RenderHelper.drawTexturedModalRect(posX + xOffset, posY + 15, 2, 0, 0, sizes[0], sizes[1], 1F / sizes[0], - 1F / sizes[1]); - } + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + mc.renderEngine.bindTexture(TextureHelperMF.getResource(image)); + int xOffset = (universalBookImageWidth - sizes[0]) / 2; + RenderHelper.drawTexturedModalRect(posX + xOffset, posY + 15, 2, 0, 0, sizes[0], sizes[1], 1F / sizes[0], + 1F / sizes[1]); + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeAnvil.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeAnvil.java index 837b60af..8f2593f6 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeAnvil.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeAnvil.java @@ -1,11 +1,5 @@ package minefantasy.mf2.api.knowledge.client; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; import minefantasy.mf2.api.crafting.anvil.ShapedAnvilRecipes; import minefantasy.mf2.api.crafting.anvil.ShapelessAnvilRecipes; @@ -19,188 +13,193 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.util.ArrayList; +import java.util.List; public class EntryPageRecipeAnvil extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private IAnvilRecipe[] recipes = new IAnvilRecipe[] {}; - public static int switchRate = 15; - private int recipeID; - private boolean shapelessRecipe = false; - private boolean oreDictRecipe = false; - - public EntryPageRecipeAnvil(List recipes) { - IAnvilRecipe[] array = new IAnvilRecipe[recipes.size()]; - for (int a = 0; a < recipes.size(); a++) { - array[a] = recipes.get(a); - } - this.recipes = array; - - } - - public EntryPageRecipeAnvil(IAnvilRecipe... recipes) { - this.recipes = recipes; - } - - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - tooltipStack = null; - if (onTick) { - tickRecipes(); - } - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/anvilGrid.png")); - parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - IAnvilRecipe recipe = recipes[recipeID]; - String cft = "<" + StatCollector.translateToLocal("method.anvil") + ">"; - mc.fontRenderer.drawSplitString(cft, - posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); - renderRecipe(parent, x, y, f, posX, posY, recipe); - - if (tooltipStack != null) { - List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); - List parsedTooltip = new ArrayList(); - boolean first = true; - - for (String s : tooltipData) { - String s_ = s; - if (!first) - s_ = EnumChatFormatting.GRAY + s; - parsedTooltip.add(s_); - first = false; - } - - minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); - } - - } - - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, IAnvilRecipe recipe) { - if (recipe == null) - return; - shapelessRecipe = false; - oreDictRecipe = false; - - GL11.glColor3f(255, 255, 255); - GuiHelper.renderToolIcon(parent, recipe.getToolType(), recipe.getRecipeHammer(), posX + 34, posY + 51, true, - true); - GuiHelper.renderToolIcon(parent, "anvil", recipe.getAnvil(), posX + 124, posY + 51, true, true); - - if (recipe instanceof ShapedAnvilRecipes) { - ShapedAnvilRecipes shaped = (ShapedAnvilRecipes) recipe; - - for (int y = 0; y < shaped.recipeHeight; y++) { - for (int x = 0; x < shaped.recipeWidth; x++) { - renderItemAtGridPos(parent, 1 + x, 1 + y, shaped.recipeItems[y * shaped.recipeWidth + x], true, - posX, posY, mx, my); - } - } - } else if (recipe instanceof ShapelessAnvilRecipes) { - ShapelessAnvilRecipes shapeless = (ShapelessAnvilRecipes) recipe; - - drawGrid: { - for (int y = 0; y < 6; y++) { - for (int x = 0; x < 4; x++) { - int index = y * 6 + x; - - if (index >= shapeless.recipeItems.size()) - break drawGrid; - - renderItemAtGridPos(parent, 1 + x, 1 + y, (ItemStack) shapeless.recipeItems.get(index), true, - posX, posY, mx, my); - } - } - } - - shapelessRecipe = true; - } - renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my, recipe.outputHot()); - } - - private void tickRecipes() { - if (recipeID < recipes.length - 1) { - ++recipeID; - } else { - recipeID = 0; - } - } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, - int mx, int my, boolean hot) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - if (stack.getItemDamage() == -1) - stack.setItemDamage(0); - - int xPos = xOrigin + 80; - int yPos = yOrigin + 42; - - renderItem(gui, xPos, yPos, stack, accountForContainer, mx, my, hot); - } - - public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, - int xOrigin, int yOrigin, int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - - boolean heatable = Heatable.canHeatItem(stack); - - stack = stack.copy(); - - int gridSize = 18; - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - if (stack.getItemDamage() == -1) - stack.setItemDamage(0); - - x -= 1; - y -= 1; - int xPos = xOrigin + (x * gridSize) + 36; - int yPos = yOrigin + (y * gridSize) + 76; - - renderItem(gui, xPos, yPos, stack, accountForContainer, mx, my, heatable); - } - - private ItemStack tooltipStack; - - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, - int my, boolean heatable) { - if (heatable) { - GL11.glPushMatrix(); - GL11.glColor3f(255, 255, 255); - this.mc.getTextureManager() - .bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/anvilGrid.png")); - gui.drawTexturedModalRect(xPos, yPos, 248, 0, 8, 8); - GL11.glPopMatrix(); - } - - RenderItem render = new RenderItem(); - if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { - tooltipStack = stack; - } - - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.enableGUIStandardItemLighting(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - RenderHelper.disableStandardItemLighting(); - GL11.glPopMatrix(); - - GL11.glDisable(GL11.GL_LIGHTING); - } - - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - } + public static int switchRate = 15; + private Minecraft mc = Minecraft.getMinecraft(); + private IAnvilRecipe[] recipes = new IAnvilRecipe[]{}; + private int recipeID; + private boolean shapelessRecipe = false; + private boolean oreDictRecipe = false; + private ItemStack tooltipStack; + + public EntryPageRecipeAnvil(List recipes) { + IAnvilRecipe[] array = new IAnvilRecipe[recipes.size()]; + for (int a = 0; a < recipes.size(); a++) { + array[a] = recipes.get(a); + } + this.recipes = array; + + } + + public EntryPageRecipeAnvil(IAnvilRecipe... recipes) { + this.recipes = recipes; + } + + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + tooltipStack = null; + if (onTick) { + tickRecipes(); + } + + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/anvilGrid.png")); + parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); + + IAnvilRecipe recipe = recipes[recipeID]; + String cft = "<" + StatCollector.translateToLocal("method.anvil") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); + renderRecipe(parent, x, y, f, posX, posY, recipe); + + if (tooltipStack != null) { + List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + List parsedTooltip = new ArrayList(); + boolean first = true; + + for (String s : tooltipData) { + String s_ = s; + if (!first) + s_ = EnumChatFormatting.GRAY + s; + parsedTooltip.add(s_); + first = false; + } + + minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); + } + + } + + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, IAnvilRecipe recipe) { + if (recipe == null) + return; + shapelessRecipe = false; + oreDictRecipe = false; + + GL11.glColor3f(255, 255, 255); + GuiHelper.renderToolIcon(parent, recipe.getToolType(), recipe.getRecipeHammer(), posX + 34, posY + 51, true, + true); + GuiHelper.renderToolIcon(parent, "anvil", recipe.getAnvil(), posX + 124, posY + 51, true, true); + + if (recipe instanceof ShapedAnvilRecipes) { + ShapedAnvilRecipes shaped = (ShapedAnvilRecipes) recipe; + + for (int y = 0; y < shaped.recipeHeight; y++) { + for (int x = 0; x < shaped.recipeWidth; x++) { + renderItemAtGridPos(parent, 1 + x, 1 + y, shaped.recipeItems[y * shaped.recipeWidth + x], true, + posX, posY, mx, my); + } + } + } else if (recipe instanceof ShapelessAnvilRecipes) { + ShapelessAnvilRecipes shapeless = (ShapelessAnvilRecipes) recipe; + + drawGrid: + { + for (int y = 0; y < 6; y++) { + for (int x = 0; x < 4; x++) { + int index = y * 6 + x; + + if (index >= shapeless.recipeItems.size()) + break drawGrid; + + renderItemAtGridPos(parent, 1 + x, 1 + y, (ItemStack) shapeless.recipeItems.get(index), true, + posX, posY, mx, my); + } + } + } + + shapelessRecipe = true; + } + renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my, recipe.outputHot()); + } + + private void tickRecipes() { + if (recipeID < recipes.length - 1) { + ++recipeID; + } else { + recipeID = 0; + } + } + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my, boolean hot) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + if (stack.getItemDamage() == -1) + stack.setItemDamage(0); + + int xPos = xOrigin + 80; + int yPos = yOrigin + 42; + + renderItem(gui, xPos, yPos, stack, accountForContainer, mx, my, hot); + } + + public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, + int xOrigin, int yOrigin, int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + + boolean heatable = Heatable.canHeatItem(stack); + + stack = stack.copy(); + + int gridSize = 18; + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + if (stack.getItemDamage() == -1) + stack.setItemDamage(0); + + x -= 1; + y -= 1; + int xPos = xOrigin + (x * gridSize) + 36; + int yPos = yOrigin + (y * gridSize) + 76; + + renderItem(gui, xPos, yPos, stack, accountForContainer, mx, my, heatable); + } + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my, boolean heatable) { + if (heatable) { + GL11.glPushMatrix(); + GL11.glColor3f(255, 255, 255); + this.mc.getTextureManager() + .bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/anvilGrid.png")); + gui.drawTexturedModalRect(xPos, yPos, 248, 0, 8, 8); + GL11.glPopMatrix(); + } + + RenderItem render = new RenderItem(); + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { + tooltipStack = stack; + } + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + RenderHelper.disableStandardItemLighting(); + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + } + + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBase.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBase.java index 909516b5..bc1c14a9 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBase.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBase.java @@ -1,12 +1,5 @@ package minefantasy.mf2.api.knowledge.client; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import cpw.mods.fml.relauncher.ReflectionHelper; import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; @@ -21,213 +14,220 @@ import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.util.ArrayList; +import java.util.List; public class EntryPageRecipeBase extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private IRecipe[] recipes = new IRecipe[] {}; - public static int switchRate = 15; - private int recipeID; - private boolean shapelessRecipe = false; - private boolean oreDictRecipe = false; - - public EntryPageRecipeBase(List recipes) { - IRecipe[] array = new IRecipe[recipes.size()]; - for (int a = 0; a < recipes.size(); a++) { - array[a] = recipes.get(a); - } - this.recipes = array; - - } - - public EntryPageRecipeBase(IRecipe... recipes) { - this.recipes = recipes; - } - - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - if (onTick) { - tickRecipes(); - } - tooltipStack = null; - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/craftGrid.png")); - parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - IRecipe recipe = recipes[recipeID]; - String cft = "<" + StatCollector.translateToLocal("method.workbench") + ">"; - mc.fontRenderer.drawSplitString(cft, - posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 175, 117, 0); - renderRecipe(parent, x, y, f, posX, posY, recipe); - - if (tooltipStack != null) { - List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); - List parsedTooltip = new ArrayList(); - boolean first = true; - - for (String s : tooltipData) { - String s_ = s; - if (!first) - s_ = EnumChatFormatting.GRAY + s; - parsedTooltip.add(s_); - first = false; - } - - minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); - } - } - - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, IRecipe recipe) { - shapelessRecipe = false; - oreDictRecipe = false; - - if (recipe instanceof ShapedRecipes) { - ShapedRecipes shaped = (ShapedRecipes) recipe; - - for (int y = 0; y < shaped.recipeHeight; y++) { - for (int x = 0; x < shaped.recipeWidth; x++) { - renderItemAtGridPos(parent, x, y, shaped.recipeItems[y * shaped.recipeWidth + x], true, posX, posY, - mx, my); - } - } - } else if (recipe instanceof ShapedOreRecipe) { - ShapedOreRecipe shaped = (ShapedOreRecipe) recipe; - int width = (Integer) ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, shaped, 4); - int height = (Integer) ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, shaped, 5); - - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - Object input = shaped.getInput()[y * width + x]; - if (input != null) - renderItemAtGridPos(parent, x, y, - input instanceof ItemStack ? (ItemStack) input : ((ArrayList) input).get(0), - true, posX, posY, mx, my); - } - } - - oreDictRecipe = true; - } else if (recipe instanceof ShapelessRecipes) { - ShapelessRecipes shapeless = (ShapelessRecipes) recipe; - - drawGrid: { - for (int y = 0; y < 3; y++) { - for (int x = 0; x < 3; x++) { - int index = y * 3 + x; - - if (index >= shapeless.recipeItems.size()) - break drawGrid; - - renderItemAtGridPos(parent, x, y, (ItemStack) shapeless.recipeItems.get(index), true, posX, - posY, mx, my); - } - } - } - - shapelessRecipe = true; - } else if (recipe instanceof ShapelessOreRecipe) { - ShapelessOreRecipe shapeless = (ShapelessOreRecipe) recipe; - - drawGrid: { - for (int y = 0; y < 3; y++) { - for (int x = 0; x < 3; x++) { - int index = y * 3 + x; - - if (index >= shapeless.getRecipeSize()) - break drawGrid; - - Object input = shapeless.getInput().get(index); - if (input != null) - renderItemAtGridPos(parent, x, y, input instanceof ItemStack ? (ItemStack) input - : ((ArrayList) input).get(0), true, posX, posY, mx, my); - } - } - } - - shapelessRecipe = true; - oreDictRecipe = true; - } - - renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my); - } - - private void tickRecipes() { - if (recipeID < recipes.length - 1) { - ++recipeID; - } else { - recipeID = 0; - } - } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, - int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - - int xPos = xOrigin + 80; - int yPos = yOrigin + 42; - ItemStack stack1 = stack.copy(); - if (stack1.getItemDamage() == -1) - stack1.setItemDamage(0); - - renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); - } - - public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, - int xOrigin, int yOrigin, int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - - int xPos = xOrigin + (x * 29) + 51; - int yPos = yOrigin + (y * 29) + 86; - ItemStack stack1 = stack.copy(); - if (stack1.getItemDamage() == -1) - stack1.setItemDamage(0); - - renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); - } - - public int getGridX() { - return 7; - } - - public int getGridY() { - return 36; - } - - private ItemStack tooltipStack; - - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, - int my) { - RenderItem render = new RenderItem(); - if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { - tooltipStack = stack; - } - boolean mouseDown = Mouse.isButtonDown(0); - - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.enableGUIStandardItemLighting(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - RenderHelper.disableStandardItemLighting(); - GL11.glPopMatrix(); - - GL11.glDisable(GL11.GL_LIGHTING); - } - - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - } + public static int switchRate = 15; + private Minecraft mc = Minecraft.getMinecraft(); + private IRecipe[] recipes = new IRecipe[]{}; + private int recipeID; + private boolean shapelessRecipe = false; + private boolean oreDictRecipe = false; + private ItemStack tooltipStack; + + public EntryPageRecipeBase(List recipes) { + IRecipe[] array = new IRecipe[recipes.size()]; + for (int a = 0; a < recipes.size(); a++) { + array[a] = recipes.get(a); + } + this.recipes = array; + + } + + public EntryPageRecipeBase(IRecipe... recipes) { + this.recipes = recipes; + } + + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + if (onTick) { + tickRecipes(); + } + tooltipStack = null; + + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/craftGrid.png")); + parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); + + IRecipe recipe = recipes[recipeID]; + String cft = "<" + StatCollector.translateToLocal("method.workbench") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 175, 117, 0); + renderRecipe(parent, x, y, f, posX, posY, recipe); + + if (tooltipStack != null) { + List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + List parsedTooltip = new ArrayList(); + boolean first = true; + + for (String s : tooltipData) { + String s_ = s; + if (!first) + s_ = EnumChatFormatting.GRAY + s; + parsedTooltip.add(s_); + first = false; + } + + minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); + } + } + + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, IRecipe recipe) { + shapelessRecipe = false; + oreDictRecipe = false; + + if (recipe instanceof ShapedRecipes) { + ShapedRecipes shaped = (ShapedRecipes) recipe; + + for (int y = 0; y < shaped.recipeHeight; y++) { + for (int x = 0; x < shaped.recipeWidth; x++) { + renderItemAtGridPos(parent, x, y, shaped.recipeItems[y * shaped.recipeWidth + x], true, posX, posY, + mx, my); + } + } + } else if (recipe instanceof ShapedOreRecipe) { + ShapedOreRecipe shaped = (ShapedOreRecipe) recipe; + int width = (Integer) ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, shaped, 4); + int height = (Integer) ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, shaped, 5); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + Object input = shaped.getInput()[y * width + x]; + if (input != null) + renderItemAtGridPos(parent, x, y, + input instanceof ItemStack ? (ItemStack) input : ((ArrayList) input).get(0), + true, posX, posY, mx, my); + } + } + + oreDictRecipe = true; + } else if (recipe instanceof ShapelessRecipes) { + ShapelessRecipes shapeless = (ShapelessRecipes) recipe; + + drawGrid: + { + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + int index = y * 3 + x; + + if (index >= shapeless.recipeItems.size()) + break drawGrid; + + renderItemAtGridPos(parent, x, y, (ItemStack) shapeless.recipeItems.get(index), true, posX, + posY, mx, my); + } + } + } + + shapelessRecipe = true; + } else if (recipe instanceof ShapelessOreRecipe) { + ShapelessOreRecipe shapeless = (ShapelessOreRecipe) recipe; + + drawGrid: + { + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + int index = y * 3 + x; + + if (index >= shapeless.getRecipeSize()) + break drawGrid; + + Object input = shapeless.getInput().get(index); + if (input != null) + renderItemAtGridPos(parent, x, y, input instanceof ItemStack ? (ItemStack) input + : ((ArrayList) input).get(0), true, posX, posY, mx, my); + } + } + } + + shapelessRecipe = true; + oreDictRecipe = true; + } + + renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my); + } + + private void tickRecipes() { + if (recipeID < recipes.length - 1) { + ++recipeID; + } else { + recipeID = 0; + } + } + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + + int xPos = xOrigin + 80; + int yPos = yOrigin + 42; + ItemStack stack1 = stack.copy(); + if (stack1.getItemDamage() == -1) + stack1.setItemDamage(0); + + renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); + } + + public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, + int xOrigin, int yOrigin, int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + + int xPos = xOrigin + (x * 29) + 51; + int yPos = yOrigin + (y * 29) + 86; + ItemStack stack1 = stack.copy(); + if (stack1.getItemDamage() == -1) + stack1.setItemDamage(0); + + renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); + } + + public int getGridX() { + return 7; + } + + public int getGridY() { + return 36; + } + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { + RenderItem render = new RenderItem(); + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { + tooltipStack = stack; + } + boolean mouseDown = Mouse.isButtonDown(0); + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + RenderHelper.disableStandardItemLighting(); + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + } + + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBloom.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBloom.java index d72e0487..5404724f 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBloom.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeBloom.java @@ -1,12 +1,5 @@ package minefantasy.mf2.api.knowledge.client; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -16,101 +9,106 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.util.ArrayList; +import java.util.List; public class EntryPageRecipeBloom extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private ItemStack input, output; - - public EntryPageRecipeBloom(ItemStack in, ItemStack out) { - this.input = in; - this.output = out; - } - - public EntryPageRecipeBloom(Item in, Item out) { - this(new ItemStack(in), new ItemStack(out)); - } - - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - tooltipStack = null; - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/bloomeryGrid.png")); - parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - String cft = "<" + StatCollector.translateToLocal("method.bloomery") + ">"; - mc.fontRenderer.drawSplitString(cft, - posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); - - renderRecipe(parent, x, y, f, posX, posY); - if (tooltipStack != null) { - List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); - List parsedTooltip = new ArrayList(); - boolean first = true; - - for (String s : tooltipData) { - String s_ = s; - if (!first) - s_ = EnumChatFormatting.GRAY + s; - parsedTooltip.add(s_); - first = false; - } - - minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); - - } - - } - - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { - renderResult(parent, output, false, posX, posY + 74, mx, my); - renderResult(parent, input, false, posX, posY, mx, my); - } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, - int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - - int xPos = xOrigin + 80; - int yPos = yOrigin + 41; - ItemStack stack1 = stack.copy(); - if (stack1.getItemDamage() == -1) - stack1.setItemDamage(0); - - renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); - } - - private ItemStack tooltipStack; - - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, - int my) { - RenderItem render = new RenderItem(); - if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { - tooltipStack = stack; - } - boolean mouseDown = Mouse.isButtonDown(0); - - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.enableGUIStandardItemLighting(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - RenderHelper.disableStandardItemLighting(); - GL11.glPopMatrix(); - - GL11.glDisable(GL11.GL_LIGHTING); - } - - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - } + private Minecraft mc = Minecraft.getMinecraft(); + private ItemStack input, output; + private ItemStack tooltipStack; + + public EntryPageRecipeBloom(ItemStack in, ItemStack out) { + this.input = in; + this.output = out; + } + + public EntryPageRecipeBloom(Item in, Item out) { + this(new ItemStack(in), new ItemStack(out)); + } + + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + tooltipStack = null; + + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/bloomeryGrid.png")); + parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); + + String cft = "<" + StatCollector.translateToLocal("method.bloomery") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); + + renderRecipe(parent, x, y, f, posX, posY); + if (tooltipStack != null) { + List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + List parsedTooltip = new ArrayList(); + boolean first = true; + + for (String s : tooltipData) { + String s_ = s; + if (!first) + s_ = EnumChatFormatting.GRAY + s; + parsedTooltip.add(s_); + first = false; + } + + minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); + + } + + } + + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { + renderResult(parent, output, false, posX, posY + 74, mx, my); + renderResult(parent, input, false, posX, posY, mx, my); + } + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + + int xPos = xOrigin + 80; + int yPos = yOrigin + 41; + ItemStack stack1 = stack.copy(); + if (stack1.getItemDamage() == -1) + stack1.setItemDamage(0); + + renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); + } + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { + RenderItem render = new RenderItem(); + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { + tooltipStack = stack; + } + boolean mouseDown = Mouse.isButtonDown(0); + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + RenderHelper.disableStandardItemLighting(); + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + } + + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeCarpenter.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeCarpenter.java index fa305691..23832137 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeCarpenter.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageRecipeCarpenter.java @@ -1,12 +1,5 @@ package minefantasy.mf2.api.knowledge.client; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; import minefantasy.mf2.api.crafting.carpenter.ShapedCarpenterRecipes; import minefantasy.mf2.api.crafting.carpenter.ShapelessCarpenterRecipes; @@ -19,182 +12,188 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.util.ArrayList; +import java.util.List; public class EntryPageRecipeCarpenter extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private ICarpenterRecipe[] recipes = new ICarpenterRecipe[] {}; - public static int switchRate = 15; - private int recipeID; - private boolean shapelessRecipe = false; - private boolean oreDictRecipe = false; - - public EntryPageRecipeCarpenter(List recipes) { - ICarpenterRecipe[] array = new ICarpenterRecipe[recipes.size()]; - for (int a = 0; a < recipes.size(); a++) { - array[a] = recipes.get(a); - } - this.recipes = array; - - } - - public EntryPageRecipeCarpenter(ICarpenterRecipe... recipes) { - this.recipes = recipes; - } - - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - if (onTick) { - tickRecipes(); - } - tooltipStack = null; - - this.mc.getTextureManager() - .bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/carpenterGrid.png")); - parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - ICarpenterRecipe recipe = recipes[recipeID]; - String cft = "<" + StatCollector.translateToLocal("method.carpenter") + ">"; - mc.fontRenderer.drawSplitString(cft, - posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 175, 117, 0); - renderRecipe(parent, x, y, f, posX, posY, recipe); - - if (tooltipStack != null) { - List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); - List parsedTooltip = new ArrayList(); - boolean first = true; - - for (String s : tooltipData) { - String s_ = s; - if (!first) - s_ = EnumChatFormatting.GRAY + s; - parsedTooltip.add(s_); - first = false; - } - - minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); - } - - } - - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, ICarpenterRecipe recipe) { - if (parent == null) - return; - if (recipe == null) - return; - shapelessRecipe = false; - oreDictRecipe = false; - - GL11.glColor3f(255, 255, 255); - GuiHelper.renderToolIcon(parent, recipe.getToolType(), recipe.getRecipeHammer(), posX + 34, posY + 51, true, - true); - GuiHelper.renderToolIcon(parent, "carpenter", recipe.getAnvil(), posX + 124, posY + 51, true, true); - - if (recipe instanceof ShapedCarpenterRecipes) { - ShapedCarpenterRecipes shaped = (ShapedCarpenterRecipes) recipe; - - for (int y = 0; y < shaped.recipeHeight; y++) { - for (int x = 0; x < shaped.recipeWidth; x++) { - renderItemAtGridPos(parent, 1 + x, 1 + y, shaped.recipeItems[y * shaped.recipeWidth + x], true, - posX, posY, mx, my); - } - } - } else if (recipe instanceof ShapelessCarpenterRecipes) { - ShapelessCarpenterRecipes shapeless = (ShapelessCarpenterRecipes) recipe; - - drawGrid: { - for (int y = 0; y < 4; y++) { - for (int x = 0; x < 4; x++) { - int index = y * 4 + x; - - if (index >= shapeless.recipeItems.size()) - break drawGrid; - - renderItemAtGridPos(parent, 1 + x, 1 + y, (ItemStack) shapeless.recipeItems.get(index), true, - posX, posY, mx, my); - } - } - } - - shapelessRecipe = true; - } - renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my); - } - - private void tickRecipes() { - if (recipeID < recipes.length - 1) { - ++recipeID; - } else { - recipeID = 0; - } - } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, - int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - - int xPos = xOrigin + 80; - int yPos = yOrigin + 42; - ItemStack stack1 = stack.copy(); - if (stack1.getItemDamage() == -1) - stack1.setItemDamage(0); - - renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); - } - - public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, - int xOrigin, int yOrigin, int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - int gridSize = 23; - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - - x -= 1; - y -= 1; - int xPos = xOrigin + (x * gridSize) + 46; - int yPos = yOrigin + (y * gridSize) + 80; - ItemStack stack1 = stack.copy(); - if (stack1.getItemDamage() == -1) - stack1.setItemDamage(0); - - renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); - } - - private ItemStack tooltipStack; - - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, - int my) { - RenderItem render = new RenderItem(); - if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { - tooltipStack = stack; - } - boolean mouseDown = Mouse.isButtonDown(0); - - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.enableGUIStandardItemLighting(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - RenderHelper.disableStandardItemLighting(); - GL11.glPopMatrix(); - - GL11.glDisable(GL11.GL_LIGHTING); - } - - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - } + public static int switchRate = 15; + private Minecraft mc = Minecraft.getMinecraft(); + private ICarpenterRecipe[] recipes = new ICarpenterRecipe[]{}; + private int recipeID; + private boolean shapelessRecipe = false; + private boolean oreDictRecipe = false; + private ItemStack tooltipStack; + + public EntryPageRecipeCarpenter(List recipes) { + ICarpenterRecipe[] array = new ICarpenterRecipe[recipes.size()]; + for (int a = 0; a < recipes.size(); a++) { + array[a] = recipes.get(a); + } + this.recipes = array; + + } + + public EntryPageRecipeCarpenter(ICarpenterRecipe... recipes) { + this.recipes = recipes; + } + + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + if (onTick) { + tickRecipes(); + } + tooltipStack = null; + + this.mc.getTextureManager() + .bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/carpenterGrid.png")); + parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); + + ICarpenterRecipe recipe = recipes[recipeID]; + String cft = "<" + StatCollector.translateToLocal("method.carpenter") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 175, 117, 0); + renderRecipe(parent, x, y, f, posX, posY, recipe); + + if (tooltipStack != null) { + List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + List parsedTooltip = new ArrayList(); + boolean first = true; + + for (String s : tooltipData) { + String s_ = s; + if (!first) + s_ = EnumChatFormatting.GRAY + s; + parsedTooltip.add(s_); + first = false; + } + + minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); + } + + } + + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY, ICarpenterRecipe recipe) { + if (parent == null) + return; + if (recipe == null) + return; + shapelessRecipe = false; + oreDictRecipe = false; + + GL11.glColor3f(255, 255, 255); + GuiHelper.renderToolIcon(parent, recipe.getToolType(), recipe.getRecipeHammer(), posX + 34, posY + 51, true, + true); + GuiHelper.renderToolIcon(parent, "carpenter", recipe.getAnvil(), posX + 124, posY + 51, true, true); + + if (recipe instanceof ShapedCarpenterRecipes) { + ShapedCarpenterRecipes shaped = (ShapedCarpenterRecipes) recipe; + + for (int y = 0; y < shaped.recipeHeight; y++) { + for (int x = 0; x < shaped.recipeWidth; x++) { + renderItemAtGridPos(parent, 1 + x, 1 + y, shaped.recipeItems[y * shaped.recipeWidth + x], true, + posX, posY, mx, my); + } + } + } else if (recipe instanceof ShapelessCarpenterRecipes) { + ShapelessCarpenterRecipes shapeless = (ShapelessCarpenterRecipes) recipe; + + drawGrid: + { + for (int y = 0; y < 4; y++) { + for (int x = 0; x < 4; x++) { + int index = y * 4 + x; + + if (index >= shapeless.recipeItems.size()) + break drawGrid; + + renderItemAtGridPos(parent, 1 + x, 1 + y, (ItemStack) shapeless.recipeItems.get(index), true, + posX, posY, mx, my); + } + } + } + + shapelessRecipe = true; + } + renderResult(parent, recipe.getRecipeOutput(), false, posX, posY, mx, my); + } + + private void tickRecipes() { + if (recipeID < recipes.length - 1) { + ++recipeID; + } else { + recipeID = 0; + } + } + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + + int xPos = xOrigin + 80; + int yPos = yOrigin + 42; + ItemStack stack1 = stack.copy(); + if (stack1.getItemDamage() == -1) + stack1.setItemDamage(0); + + renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); + } + + public void renderItemAtGridPos(GuiScreen gui, int x, int y, ItemStack stack, boolean accountForContainer, + int xOrigin, int yOrigin, int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + int gridSize = 23; + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + + x -= 1; + y -= 1; + int xPos = xOrigin + (x * gridSize) + 46; + int yPos = yOrigin + (y * gridSize) + 80; + ItemStack stack1 = stack.copy(); + if (stack1.getItemDamage() == -1) + stack1.setItemDamage(0); + + renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); + } + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { + RenderItem render = new RenderItem(); + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { + tooltipStack = stack; + } + boolean mouseDown = Mouse.isButtonDown(0); + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + RenderHelper.disableStandardItemLighting(); + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + } + + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageSmelting.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageSmelting.java index 46647317..7b94a685 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageSmelting.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageSmelting.java @@ -1,12 +1,5 @@ package minefantasy.mf2.api.knowledge.client; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -16,100 +9,105 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.util.ArrayList; +import java.util.List; public class EntryPageSmelting extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private ItemStack input, output; - - public EntryPageSmelting(ItemStack in, ItemStack out) { - this.input = in; - this.output = out; - } - - public EntryPageSmelting(Item in, Item out) { - this(new ItemStack(in), new ItemStack(out)); - } - - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - tooltipStack = null; - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/furnaceGrid.png")); - parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); - - String cft = "<" + StatCollector.translateToLocal("method.furnace") + ">"; - mc.fontRenderer.drawSplitString(cft, - posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); - - renderRecipe(parent, x, y, f, posX, posY); - if (tooltipStack != null) { - List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); - List parsedTooltip = new ArrayList(); - boolean first = true; - - for (String s : tooltipData) { - String s_ = s; - if (!first) - s_ = EnumChatFormatting.GRAY + s; - parsedTooltip.add(s_); - first = false; - } - - minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); - } - - } - - private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { - renderResult(parent, output, false, posX, posY + 74, mx, my); - renderResult(parent, input, false, posX, posY, mx, my); - } - - public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, - int mx, int my) { - if (stack == null || stack.getItem() == null) - return; - stack = stack.copy(); - - if (stack.getItemDamage() == Short.MAX_VALUE) - stack.setItemDamage(0); - - int xPos = xOrigin + 80; - int yPos = yOrigin + 41; - ItemStack stack1 = stack.copy(); - if (stack1.getItemDamage() == -1) - stack1.setItemDamage(0); - - renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); - } - - private ItemStack tooltipStack; - - public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, - int my) { - RenderItem render = new RenderItem(); - if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { - tooltipStack = stack; - } - boolean mouseDown = Mouse.isButtonDown(0); - - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.enableGUIStandardItemLighting(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_DEPTH_TEST); - render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, - Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); - RenderHelper.disableStandardItemLighting(); - GL11.glPopMatrix(); - - GL11.glDisable(GL11.GL_LIGHTING); - } - - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - } + private Minecraft mc = Minecraft.getMinecraft(); + private ItemStack input, output; + private ItemStack tooltipStack; + + public EntryPageSmelting(ItemStack in, ItemStack out) { + this.input = in; + this.output = out; + } + + public EntryPageSmelting(Item in, Item out) { + this(new ItemStack(in), new ItemStack(out)); + } + + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + tooltipStack = null; + + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/furnaceGrid.png")); + parent.drawTexturedModalRect(posX, posY, 0, 0, this.universalBookImageWidth, this.universalBookImageHeight); + + String cft = "<" + StatCollector.translateToLocal("method.furnace") + ">"; + mc.fontRenderer.drawSplitString(cft, + posX + (universalBookImageWidth / 2) - (mc.fontRenderer.getStringWidth(cft) / 2), posY + 150, 117, 0); + + renderRecipe(parent, x, y, f, posX, posY); + if (tooltipStack != null) { + List tooltipData = tooltipStack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + List parsedTooltip = new ArrayList(); + boolean first = true; + + for (String s : tooltipData) { + String s_ = s; + if (!first) + s_ = EnumChatFormatting.GRAY + s; + parsedTooltip.add(s_); + first = false; + } + + minefantasy.mf2.api.helpers.RenderHelper.renderTooltip(x, y, parsedTooltip); + } + + } + + private void renderRecipe(GuiScreen parent, int mx, int my, float f, int posX, int posY) { + renderResult(parent, output, false, posX, posY + 74, mx, my); + renderResult(parent, input, false, posX, posY, mx, my); + } + + public void renderResult(GuiScreen gui, ItemStack stack, boolean accountForContainer, int xOrigin, int yOrigin, + int mx, int my) { + if (stack == null || stack.getItem() == null) + return; + stack = stack.copy(); + + if (stack.getItemDamage() == Short.MAX_VALUE) + stack.setItemDamage(0); + + int xPos = xOrigin + 80; + int yPos = yOrigin + 41; + ItemStack stack1 = stack.copy(); + if (stack1.getItemDamage() == -1) + stack1.setItemDamage(0); + + renderItem(gui, xPos, yPos, stack1, accountForContainer, mx, my); + } + + public void renderItem(GuiScreen gui, int xPos, int yPos, ItemStack stack, boolean accountForContainer, int mx, + int my) { + RenderItem render = new RenderItem(); + if (mx > xPos && mx < (xPos + 16) && my > yPos && my < (yPos + 16)) { + tooltipStack = stack; + } + boolean mouseDown = Mouse.isButtonDown(0); + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + render.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, + Minecraft.getMinecraft().getTextureManager(), stack, xPos, yPos); + RenderHelper.disableStandardItemLighting(); + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + } + + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageText.java b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageText.java index 0688b7d6..776e2dda 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageText.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/EntryPageText.java @@ -6,64 +6,64 @@ import net.minecraft.util.StatCollector; public class EntryPageText extends EntryPage { - private Minecraft mc = Minecraft.getMinecraft(); - private String paragraph; - private Object[] additional; + private Minecraft mc = Minecraft.getMinecraft(); + private String paragraph; + private Object[] additional; - public EntryPageText(String paragraph, Object... additional) { - this(paragraph); - this.additional = additional; - } + public EntryPageText(String paragraph, Object... additional) { + this(paragraph); + this.additional = additional; + } - public EntryPageText(String paragraph) { - this.paragraph = paragraph; - } + public EntryPageText(String paragraph) { + this.paragraph = paragraph; + } - @Override - public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - String local = StatCollector.translateToLocal(paragraph); - if (additional != null && additional.length > 0) { - local = StatCollector.translateToLocalFormatted(paragraph, additional); - } - String text = ""; - String temp = ""; - boolean prefix = false; - for (int a = 0; a < local.length(); a++) { - char c = local.charAt(a); - if (a == local.length() - 1) { - text = text + temp + c; - temp = ""; - } else if (prefix) { - if (c == "h".charAt(0)) { - text = text + temp + EnumChatFormatting.DARK_BLUE + EnumChatFormatting.BOLD; - temp = ""; - } else if (c == "d".charAt(0)) { - text = text + temp + EnumChatFormatting.DARK_RED; - temp = ""; - } else if (c == "y".charAt(0)) { - text = text + temp + EnumChatFormatting.GOLD; - temp = ""; - } else if (c == "u".charAt(0)) { - text = text + temp + EnumChatFormatting.UNDERLINE; - temp = ""; - } else if (c == "r".charAt(0)) { - text = text + temp + EnumChatFormatting.RESET + EnumChatFormatting.BLACK; - temp = ""; - } - prefix = false; - } else if (c == "^".charAt(0)) { - text = text + temp + "\n\n"; - temp = ""; - } else if (c == "$".charAt(0)) { - prefix = true; - } else { - temp = temp + c; - } - } - mc.fontRenderer.drawSplitString(text, posX + 14, posY + 15, 155, 0); - } + @Override + public void render(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + String local = StatCollector.translateToLocal(paragraph); + if (additional != null && additional.length > 0) { + local = StatCollector.translateToLocalFormatted(paragraph, additional); + } + String text = ""; + String temp = ""; + boolean prefix = false; + for (int a = 0; a < local.length(); a++) { + char c = local.charAt(a); + if (a == local.length() - 1) { + text = text + temp + c; + temp = ""; + } else if (prefix) { + if (c == "h".charAt(0)) { + text = text + temp + EnumChatFormatting.DARK_BLUE + EnumChatFormatting.BOLD; + temp = ""; + } else if (c == "d".charAt(0)) { + text = text + temp + EnumChatFormatting.DARK_RED; + temp = ""; + } else if (c == "y".charAt(0)) { + text = text + temp + EnumChatFormatting.GOLD; + temp = ""; + } else if (c == "u".charAt(0)) { + text = text + temp + EnumChatFormatting.UNDERLINE; + temp = ""; + } else if (c == "r".charAt(0)) { + text = text + temp + EnumChatFormatting.RESET + EnumChatFormatting.BLACK; + temp = ""; + } + prefix = false; + } else if (c == "^".charAt(0)) { + text = text + temp + "\n\n"; + temp = ""; + } else if (c == "$".charAt(0)) { + prefix = true; + } else { + temp = temp + c; + } + } + mc.fontRenderer.drawSplitString(text, posX + 14, posY + 15, 155, 0); + } - @Override - public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { - } + @Override + public void preRender(GuiScreen parent, int x, int y, float f, int posX, int posY, boolean onTick) { + } } diff --git a/src/main/java/minefantasy/mf2/api/knowledge/client/IGuiRecipebook.java b/src/main/java/minefantasy/mf2/api/knowledge/client/IGuiRecipebook.java index 4cf30c2c..92772dbc 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/client/IGuiRecipebook.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/client/IGuiRecipebook.java @@ -2,12 +2,12 @@ public interface IGuiRecipebook { - int getWidth(); + int getWidth(); - int getHeight(); + int getHeight(); - int getLeft(); + int getLeft(); - int getTop(); + int getTop(); } diff --git a/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java b/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java index ba249a67..b45cb95c 100644 --- a/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java +++ b/src/main/java/minefantasy/mf2/api/material/CustomMaterial.java @@ -1,9 +1,5 @@ package minefantasy.mf2.api.material; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.HashMap; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.item.ItemStack; @@ -11,288 +7,292 @@ import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; + public class CustomMaterial { - public static final String NBTBase = "MF_CustomMaterials"; - public static HashMap materialList = new HashMap(); - public static HashMap> typeList = new HashMap>(); - - public ArrayList items = new ArrayList(); - /** The material colour */ - public int[] colourRGB = new int[] { 255, 255, 255 }; - /** Base threshold for armour rating */ - public float hardness; - /** The Modifier for durability (1pt per 250 uses) */ - public float durability; - /** used for bow power.. >1 weakens blunt prot, <1 weakens piercing prot */ - public float flexibility; - /** The Efficiency modifier (Like ToolMaterial) Also does damage */ - public float sharpness; - /** The modifier to resist elements like fire and corrosion) */ - public float resistance; - /** The weight Kg/U (Kilogram per unit) */ - public float density; - public int tier; - public final String type, name; - private float[] armourProtection = new float[] { 1.0F, 1.0F, 1.0F }; - public int rarityID = 0; - - public int crafterTier = 0; - public int crafterAnvilTier = 0; - public float craftTimeModifier = 1.0F; - - public CustomMaterial(String name, String type, int tier, float hardness, float durability, float flexibility, - float resistance, float sharpness, float density) { - this.name = name; - this.type = type; - this.tier = tier; - this.hardness = hardness; - this.durability = durability; - this.flexibility = flexibility; - this.sharpness = sharpness; - this.density = density; - this.resistance = resistance; - this.craftTimeModifier = 2F + (sharpness * 2F); - } - - public CustomMaterial setCrafterTiers(int tier) { - this.crafterTier = tier; - this.crafterAnvilTier = Math.min(tier, 4); - return this; - } - - public CustomMaterial modifyCraftTime(float time) { - this.craftTimeModifier *= time; - return this; - } - - public CustomMaterial setArmourStats(float cutting, float blunt, float piercing) { - armourProtection = new float[] { cutting, blunt, piercing }; - return this; - } - - public CustomMaterial setRarity(int id) { - rarityID = id; - return this; - } - - public CustomMaterial setColour(int red, int green, int blue) { - colourRGB = new int[] { red, green, blue }; - return this; - } - - public CustomMaterial register() { - materialList.put(name.toLowerCase(), this); - getList(type).add(this); - return this; - } - - public int getColourInt() { - return (colourRGB[0] << 16) + (colourRGB[1] << 8) + colourRGB[2]; - } - - /** - * Gets a material by name - */ - public static CustomMaterial getMaterial(String name) { - if (name == null) - return null; - - return materialList.get(name.toLowerCase()); - } - - /** - * Adds a new material - * - * @param name - * The name of the material (and registration) - * @param type - * What it is (Metal, Wood, etc) - * @param tier - * The tier of the material - * @param hardness - * How hard the material is to break - * @param flexibility - * How well the material can bend and retract - * @param sharpness - * How well it can be sharpened - * @param resistance - * How well it can handle destructive elements like fire and - * corrosion, and increased heating temperature - * @param density - * how dense the element is, increasing mass per unit. (KG/Units) - */ - public static CustomMaterial getOrAddMaterial(String name, String type, int tier, float hardness, float durability, - float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) { - if (getMaterial(name) != null) { - return getMaterial(name); - } - return new CustomMaterial(name, type, tier, hardness, durability, flexibility, sharpness, resistance, density) - .setColour(red, green, blue).register(); - } - - public static void addMaterial(ItemStack item, String slot, String material) { - if (material == null || material.isEmpty()) { - return; - } - NBTTagCompound nbt = getNBT(item, true); - nbt.setString(slot, material); - } - - public static CustomMaterial getMaterialFor(ItemStack item, String slot) { - NBTTagCompound nbt = getNBT(item, false); - if (nbt != null) { - if (nbt.hasKey(slot)) { - if (nbt.getString(slot).equalsIgnoreCase("refinediron")) { // fix old namings, it can be removed later - nbt.setString(slot, "pigiron"); - } - return getMaterial(nbt.getString(slot)); - } - } - return null; - } - - public static NBTTagCompound getNBT(ItemStack item, boolean createNew) { - if (item != null && item.hasTagCompound() && item.getTagCompound().hasKey(NBTBase)) { - return (NBTTagCompound) item.getTagCompound().getTag(NBTBase); - } - if (createNew) { - NBTTagCompound nbt = new NBTTagCompound(); - NBTTagCompound nbt2 = new NBTTagCompound(); - item.setTagCompound(nbt); - nbt.setTag(NBTBase, nbt2); - return nbt2; - } - return null; - } - - public static ArrayList getList(String type) { - if (typeList.get(type) == null) { - typeList.put(type, new ArrayList()); - } - return typeList.get(type); - } - - public static void addOreDict(String material, String name) { - if (getMaterial(name) != null) { - getMaterial(name).addOreDict(material); - } - } - - public void addOreDict(String name) { - for (ItemStack item : OreDictionary.getOres(name)) { - items.add(item); - } - } - - public boolean isItemApplicable(ItemStack item) { - return this.items.contains(item); - } - - @SideOnly(Side.CLIENT) - public static String getWeightString(float mass) { - DecimalFormat df = decimal_format; - String s = "attribute.weightKg.name"; - if (mass > 0 && mass < 1.0F) { - s = "attribute.weightg.name"; - df = decimal_format_grams; - mass = (int) (mass * 1000F); - } else if (mass > 1000) { - s = "attribute.weightt.name"; - mass = (int) (mass / 1000F); - } - return StatCollector.translateToLocalFormatted(s, decimal_format.format(mass)); - } - - public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); - public static final DecimalFormat decimal_format_grams = new DecimalFormat("#"); - - @SideOnly(Side.CLIENT) - public String getMaterialString() { - return StatCollector.translateToLocalFormatted("materialtype." + this.type + ".name", this.crafterTier); - } - - public float getArmourProtection(int id) { - return armourProtection[id]; - } - - public ItemStack getItem() { - return null; - } - - public CustomMaterial setMeltingPoint(float heat) { - meltingPoint = heat; - return this; - } - - public float getFireResistance() { - if (meltingPoint > flameResistArray[0]) { - float max = flameResistArray[1] - flameResistArray[0]; - float heat = meltingPoint - flameResistArray[0]; - - int res = (int) (heat / max * 100F); - return Math.min(100, res); - } - return 0F; - } - - public float meltingPoint; - - public int[] getHeatableStats() { - int workableTemp = (int) meltingPoint; - int unstableTemp = (int) (workableTemp * 1.5F); - int maxTemp = (int) (workableTemp * 2F); - return new int[] { workableTemp, unstableTemp, maxTemp }; - } - - /** - * Min and Max workable temps - */ - public static final int[] flameResistArray = new int[] { 100, 300 }; - - // -----------------------------------BOW - // FUNCTIONS----------------------------------------\\ - - // Returns if the material is a hard wood - // false is a non-unique value, this should not be used when youre not sure if - // the material is a wood - public boolean isHardwood() { - if (this.name.toLowerCase().contains("wood")) { - if (this.name.toLowerCase().contains("yew")) {// Yew is a softwood but has a higher hardness value - return false; - } - return this.hardness > 3.3; - } - return false; - } - - // Returns a rating for how well a would would serve as a bow. - // Answers are in irrelevant physical units, so this is scaled in a later - // function which is meant to be used. - // Bow rating is proportional to power of the bow - // With regular woods, this value is from 6.4 to 11.5 - // A rating BELOW 8.0 means that the wood is not suitable for a bow and this - // funtion will return zero - private float getBowRating() { - if (this.name.toLowerCase().contains("wood")) { - float mid = (0.83F * (this.durability / this.flexibility)); - float result = (10F * this.flexibility * mid * mid) / this.density; - return result > 8.0F ? result : 0; - } - return 0; - } - - public boolean isHeatable() { - return type.equalsIgnoreCase("metal"); - } - - public CustomMaterial setUnbreakable() { - unbreakable = true; - return this; - } - - private boolean unbreakable = false; - - public boolean isUnbrekable() { - return unbreakable; - } + public static final String NBTBase = "MF_CustomMaterials"; + public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); + public static final DecimalFormat decimal_format_grams = new DecimalFormat("#"); + /** + * Min and Max workable temps + */ + public static final int[] flameResistArray = new int[]{100, 300}; + public static HashMap materialList = new HashMap(); + public static HashMap> typeList = new HashMap>(); + public final String type, name; + public ArrayList items = new ArrayList(); + /** + * The material colour + */ + public int[] colourRGB = new int[]{255, 255, 255}; + /** + * Base threshold for armour rating + */ + public float hardness; + /** + * The Modifier for durability (1pt per 250 uses) + */ + public float durability; + /** + * used for bow power.. >1 weakens blunt prot, <1 weakens piercing prot + */ + public float flexibility; + /** + * The Efficiency modifier (Like ToolMaterial) Also does damage + */ + public float sharpness; + /** + * The modifier to resist elements like fire and corrosion) + */ + public float resistance; + /** + * The weight Kg/U (Kilogram per unit) + */ + public float density; + public int tier; + public int rarityID = 0; + public int crafterTier = 0; + public int crafterAnvilTier = 0; + public float craftTimeModifier = 1.0F; + public float meltingPoint; + private float[] armourProtection = new float[]{1.0F, 1.0F, 1.0F}; + private boolean unbreakable = false; + + public CustomMaterial(String name, String type, int tier, float hardness, float durability, float flexibility, + float resistance, float sharpness, float density) { + this.name = name; + this.type = type; + this.tier = tier; + this.hardness = hardness; + this.durability = durability; + this.flexibility = flexibility; + this.sharpness = sharpness; + this.density = density; + this.resistance = resistance; + this.craftTimeModifier = 2F + (sharpness * 2F); + } + + /** + * Gets a material by name + */ + public static CustomMaterial getMaterial(String name) { + if (name == null) + return null; + + return materialList.get(name.toLowerCase()); + } + + /** + * Adds a new material + * + * @param name The name of the material (and registration) + * @param type What it is (Metal, Wood, etc) + * @param tier The tier of the material + * @param hardness How hard the material is to break + * @param flexibility How well the material can bend and retract + * @param sharpness How well it can be sharpened + * @param resistance How well it can handle destructive elements like fire and + * corrosion, and increased heating temperature + * @param density how dense the element is, increasing mass per unit. (KG/Units) + */ + public static CustomMaterial getOrAddMaterial(String name, String type, int tier, float hardness, float durability, + float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) { + if (getMaterial(name) != null) { + return getMaterial(name); + } + return new CustomMaterial(name, type, tier, hardness, durability, flexibility, sharpness, resistance, density) + .setColour(red, green, blue).register(); + } + + public static void addMaterial(ItemStack item, String slot, String material) { + if (material == null || material.isEmpty()) { + return; + } + NBTTagCompound nbt = getNBT(item, true); + nbt.setString(slot, material); + } + + public static CustomMaterial getMaterialFor(ItemStack item, String slot) { + NBTTagCompound nbt = getNBT(item, false); + if (nbt != null) { + if (nbt.hasKey(slot)) { + if (nbt.getString(slot).equalsIgnoreCase("refinediron")) { // fix old namings, it can be removed later + nbt.setString(slot, "pigiron"); + } + return getMaterial(nbt.getString(slot)); + } + } + return null; + } + + public static NBTTagCompound getNBT(ItemStack item, boolean createNew) { + if (item != null && item.hasTagCompound() && item.getTagCompound().hasKey(NBTBase)) { + return (NBTTagCompound) item.getTagCompound().getTag(NBTBase); + } + if (createNew) { + NBTTagCompound nbt = new NBTTagCompound(); + NBTTagCompound nbt2 = new NBTTagCompound(); + item.setTagCompound(nbt); + nbt.setTag(NBTBase, nbt2); + return nbt2; + } + return null; + } + + public static ArrayList getList(String type) { + if (typeList.get(type) == null) { + typeList.put(type, new ArrayList()); + } + return typeList.get(type); + } + + public static void addOreDict(String material, String name) { + if (getMaterial(name) != null) { + getMaterial(name).addOreDict(material); + } + } + + @SideOnly(Side.CLIENT) + public static String getWeightString(float mass) { + DecimalFormat df = decimal_format; + String s = "attribute.weightKg.name"; + if (mass > 0 && mass < 1.0F) { + s = "attribute.weightg.name"; + df = decimal_format_grams; + mass = (int) (mass * 1000F); + } else if (mass > 1000) { + s = "attribute.weightt.name"; + mass = (int) (mass / 1000F); + } + return StatCollector.translateToLocalFormatted(s, decimal_format.format(mass)); + } + + public CustomMaterial setCrafterTiers(int tier) { + this.crafterTier = tier; + this.crafterAnvilTier = Math.min(tier, 4); + return this; + } + + public CustomMaterial modifyCraftTime(float time) { + this.craftTimeModifier *= time; + return this; + } + + public CustomMaterial setArmourStats(float cutting, float blunt, float piercing) { + armourProtection = new float[]{cutting, blunt, piercing}; + return this; + } + + public CustomMaterial setRarity(int id) { + rarityID = id; + return this; + } + + public CustomMaterial setColour(int red, int green, int blue) { + colourRGB = new int[]{red, green, blue}; + return this; + } + + public CustomMaterial register() { + materialList.put(name.toLowerCase(), this); + getList(type).add(this); + return this; + } + + public int getColourInt() { + return (colourRGB[0] << 16) + (colourRGB[1] << 8) + colourRGB[2]; + } + + public void addOreDict(String name) { + for (ItemStack item : OreDictionary.getOres(name)) { + items.add(item); + } + } + + public boolean isItemApplicable(ItemStack item) { + return this.items.contains(item); + } + + @SideOnly(Side.CLIENT) + public String getMaterialString() { + return StatCollector.translateToLocalFormatted("materialtype." + this.type + ".name", this.crafterTier); + } + + public float getArmourProtection(int id) { + return armourProtection[id]; + } + + public ItemStack getItem() { + return null; + } + + public CustomMaterial setMeltingPoint(float heat) { + meltingPoint = heat; + return this; + } + + public float getFireResistance() { + if (meltingPoint > flameResistArray[0]) { + float max = flameResistArray[1] - flameResistArray[0]; + float heat = meltingPoint - flameResistArray[0]; + + int res = (int) (heat / max * 100F); + return Math.min(100, res); + } + return 0F; + } + + // -----------------------------------BOW + // FUNCTIONS----------------------------------------\\ + + public int[] getHeatableStats() { + int workableTemp = (int) meltingPoint; + int unstableTemp = (int) (workableTemp * 1.5F); + int maxTemp = (int) (workableTemp * 2F); + return new int[]{workableTemp, unstableTemp, maxTemp}; + } + + // Returns if the material is a hard wood + // false is a non-unique value, this should not be used when youre not sure if + // the material is a wood + public boolean isHardwood() { + if (this.name.toLowerCase().contains("wood")) { + if (this.name.toLowerCase().contains("yew")) {// Yew is a softwood but has a higher hardness value + return false; + } + return this.hardness > 3.3; + } + return false; + } + + // Returns a rating for how well a would would serve as a bow. + // Answers are in irrelevant physical units, so this is scaled in a later + // function which is meant to be used. + // Bow rating is proportional to power of the bow + // With regular woods, this value is from 6.4 to 11.5 + // A rating BELOW 8.0 means that the wood is not suitable for a bow and this + // funtion will return zero + private float getBowRating() { + if (this.name.toLowerCase().contains("wood")) { + float mid = (0.83F * (this.durability / this.flexibility)); + float result = (10F * this.flexibility * mid * mid) / this.density; + return result > 8.0F ? result : 0; + } + return 0; + } + + public boolean isHeatable() { + return type.equalsIgnoreCase("metal"); + } + + public CustomMaterial setUnbreakable() { + unbreakable = true; + return this; + } + + public boolean isUnbrekable() { + return unbreakable; + } } diff --git a/src/main/java/minefantasy/mf2/api/mining/RandomDigs.java b/src/main/java/minefantasy/mf2/api/mining/RandomDigs.java index 6b7a0c09..776964a0 100644 --- a/src/main/java/minefantasy/mf2/api/mining/RandomDigs.java +++ b/src/main/java/minefantasy/mf2/api/mining/RandomDigs.java @@ -1,99 +1,96 @@ package minefantasy.mf2.api.mining; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Random; + public class RandomDigs { - public static ArrayList drops = new ArrayList(); + public static ArrayList drops = new ArrayList(); - private final ItemStack loot; - private final float chanceToDrop; - private final Block block; - private final int blockSub; - private final int harvestLvl; - private final int minHeight; - private final int maxHeight; - private final boolean doesSilktouchDisable; + private final ItemStack loot; + private final float chanceToDrop; + private final Block block; + private final int blockSub; + private final int harvestLvl; + private final int minHeight; + private final int maxHeight; + private final boolean doesSilktouchDisable; - /** - * Adds an ore to drop - * - * @param drop - * the item dropped - * @param chance - * the chance as a percentage to drop - * @param block - * the block it drops from (ID, Block, or stack) - */ - public static void addOre(ItemStack drop, float chance, Block block, int meta, int harvestLevel, int min, int max, - boolean silkDisable) { - drops.add(new RandomDigs(drop, chance / 100F, block, meta, harvestLevel, min, max, silkDisable)); - } + public RandomDigs(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, + boolean silkDisable) { + doesSilktouchDisable = silkDisable; + minHeight = min; + maxHeight = max; + loot = drop; + chanceToDrop = chance; + harvestLvl = harvestLevel; - public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, - boolean silkDisable) { - drops.add(new RandomDigs(drop, chance / 100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, - silkDisable)); - } + block = base; + blockSub = meta; + } - public static ArrayList getDroppedItems(Block base, int meta, int harvest, int fortune, - boolean silktouch, int y) { - ArrayList loot = new ArrayList(); + /** + * Adds an ore to drop + * + * @param drop the item dropped + * @param chance the chance as a percentage to drop + * @param block the block it drops from (ID, Block, or stack) + */ + public static void addOre(ItemStack drop, float chance, Block block, int meta, int harvestLevel, int min, int max, + boolean silkDisable) { + drops.add(new RandomDigs(drop, chance / 100F, block, meta, harvestLevel, min, max, silkDisable)); + } - if (!drops.isEmpty()) { - Iterator list = drops.iterator(); + public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, + boolean silkDisable) { + drops.add(new RandomDigs(drop, chance / 100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, + silkDisable)); + } - while (list.hasNext()) { - RandomDigs ore = (RandomDigs) list.next(); - if (matchesOre(ore, base, meta, harvest, fortune / 2F + 1F, silktouch, y)) { - loot.add(ore.loot); - } - } - } + public static ArrayList getDroppedItems(Block base, int meta, int harvest, int fortune, + boolean silktouch, int y) { + ArrayList loot = new ArrayList(); - return loot; - } + if (!drops.isEmpty()) { + Iterator list = drops.iterator(); - private static boolean matchesOre(RandomDigs ore, Block base, int meta, int harvest, float multiplier, - boolean silktouch, int y) { - Random random = new Random(); + while (list.hasNext()) { + RandomDigs ore = (RandomDigs) list.next(); + if (matchesOre(ore, base, meta, harvest, fortune / 2F + 1F, silktouch, y)) { + loot.add(ore.loot); + } + } + } - if (ore.doesSilktouchDisable && silktouch) { - return false; - } + return loot; + } - if (!(ore.minHeight == -1 && ore.maxHeight == -1)) { - if (y < ore.minHeight || y > ore.maxHeight) { - return false; - } - } - if (ore.block != base) { - return false; - } - if (ore.blockSub != meta && ore.blockSub != OreDictionary.WILDCARD_VALUE) { - return false; - } - if (ore.harvestLvl > harvest) { - return false; - } - return random.nextFloat() < (ore.chanceToDrop * multiplier); - } + private static boolean matchesOre(RandomDigs ore, Block base, int meta, int harvest, float multiplier, + boolean silktouch, int y) { + Random random = new Random(); - public RandomDigs(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, - boolean silkDisable) { - doesSilktouchDisable = silkDisable; - minHeight = min; - maxHeight = max; - loot = drop; - chanceToDrop = chance; - harvestLvl = harvestLevel; + if (ore.doesSilktouchDisable && silktouch) { + return false; + } - block = base; - blockSub = meta; - } + if (!(ore.minHeight == -1 && ore.maxHeight == -1)) { + if (y < ore.minHeight || y > ore.maxHeight) { + return false; + } + } + if (ore.block != base) { + return false; + } + if (ore.blockSub != meta && ore.blockSub != OreDictionary.WILDCARD_VALUE) { + return false; + } + if (ore.harvestLvl > harvest) { + return false; + } + return random.nextFloat() < (ore.chanceToDrop * multiplier); + } } diff --git a/src/main/java/minefantasy/mf2/api/mining/RandomOre.java b/src/main/java/minefantasy/mf2/api/mining/RandomOre.java index 2267944a..5810205e 100644 --- a/src/main/java/minefantasy/mf2/api/mining/RandomOre.java +++ b/src/main/java/minefantasy/mf2/api/mining/RandomOre.java @@ -1,9 +1,5 @@ package minefantasy.mf2.api.mining; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Random; - import minefantasy.mf2.api.knowledge.ResearchLogic; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; @@ -11,110 +7,111 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Random; + public class RandomOre { - public static ArrayList drops = new ArrayList(); - - private final ItemStack loot; - private final float chanceToDrop; - private final Block block; - private final int blockSub; - private final int harvestLvl; - private final int minHeight; - private final int maxHeight; - private final boolean doesSilktouchDisable; - private final String research; - - /** - * Adds an ore to drop - * - * @param drop - * the item dropped - * @param chance - * the chance as a percentage to drop - * @param block - * the block it drops from (ID, Block, or stack) - */ - public static void addOre(ItemStack drop, float chance, Block block, int meta, int harvestLevel, int min, int max, - boolean silkDisable) { - drops.add(new RandomOre(drop, chance / 100F, block, meta, harvestLevel, min, max, silkDisable)); - } - - public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, - boolean silkDisable) { - drops.add(new RandomOre(drop, chance / 100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, - silkDisable)); - } - - public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, - boolean silkDisable, String research) { - drops.add(new RandomOre(drop, chance / 100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, - silkDisable, research)); - } - - public static ArrayList getDroppedItems(EntityLivingBase user, Block base, int meta, int harvest, - int fortune, boolean silktouch, int y) { - ArrayList loot = new ArrayList(); - - if (!drops.isEmpty()) { - Iterator list = drops.iterator(); - - while (list.hasNext()) { - RandomOre ore = (RandomOre) list.next(); - if (matchesOre(user, ore, base, meta, harvest, fortune / 2F + 1F, silktouch, y)) { - loot.add(ore.loot); - } - } - } - - return loot; - } - - private static boolean matchesOre(EntityLivingBase user, RandomOre ore, Block base, int meta, int harvest, - float multiplier, boolean silktouch, int y) { - Random random = new Random(); - - if (ore.doesSilktouchDisable && silktouch) { - return false; - } - if (user instanceof EntityPlayer && ore.research != null) { - if (!ResearchLogic.hasInfoUnlocked((EntityPlayer) user, ore.research)) { - return false; - } - } - - if (!(ore.minHeight == -1 && ore.maxHeight == -1)) { - if (y < ore.minHeight || y > ore.maxHeight) { - return false; - } - } - if (ore.block != base) { - return false; - } - if (ore.blockSub != meta && ore.blockSub != OreDictionary.WILDCARD_VALUE) { - return false; - } - if (ore.harvestLvl > harvest) { - return false; - } - return random.nextFloat() < (ore.chanceToDrop * multiplier); - } - - public RandomOre(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, - boolean silkDisable) { - this(drop, chance, base, meta, harvestLevel, min, max, silkDisable, null); - } - - public RandomOre(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, - boolean silkDisable, String research) { - doesSilktouchDisable = silkDisable; - minHeight = min; - maxHeight = max; - loot = drop; - chanceToDrop = chance; - harvestLvl = harvestLevel; - - block = base; - blockSub = meta; - this.research = research; - } + public static ArrayList drops = new ArrayList(); + + private final ItemStack loot; + private final float chanceToDrop; + private final Block block; + private final int blockSub; + private final int harvestLvl; + private final int minHeight; + private final int maxHeight; + private final boolean doesSilktouchDisable; + private final String research; + + public RandomOre(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, + boolean silkDisable) { + this(drop, chance, base, meta, harvestLevel, min, max, silkDisable, null); + } + + public RandomOre(ItemStack drop, float chance, Block base, int meta, int harvestLevel, int min, int max, + boolean silkDisable, String research) { + doesSilktouchDisable = silkDisable; + minHeight = min; + maxHeight = max; + loot = drop; + chanceToDrop = chance; + harvestLvl = harvestLevel; + + block = base; + blockSub = meta; + this.research = research; + } + + /** + * Adds an ore to drop + * + * @param drop the item dropped + * @param chance the chance as a percentage to drop + * @param block the block it drops from (ID, Block, or stack) + */ + public static void addOre(ItemStack drop, float chance, Block block, int meta, int harvestLevel, int min, int max, + boolean silkDisable) { + drops.add(new RandomOre(drop, chance / 100F, block, meta, harvestLevel, min, max, silkDisable)); + } + + public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, + boolean silkDisable) { + drops.add(new RandomOre(drop, chance / 100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, + silkDisable)); + } + + public static void addOre(ItemStack drop, float chance, Block block, int harvestLevel, int min, int max, + boolean silkDisable, String research) { + drops.add(new RandomOre(drop, chance / 100F, block, OreDictionary.WILDCARD_VALUE, harvestLevel, min, max, + silkDisable, research)); + } + + public static ArrayList getDroppedItems(EntityLivingBase user, Block base, int meta, int harvest, + int fortune, boolean silktouch, int y) { + ArrayList loot = new ArrayList(); + + if (!drops.isEmpty()) { + Iterator list = drops.iterator(); + + while (list.hasNext()) { + RandomOre ore = (RandomOre) list.next(); + if (matchesOre(user, ore, base, meta, harvest, fortune / 2F + 1F, silktouch, y)) { + loot.add(ore.loot); + } + } + } + + return loot; + } + + private static boolean matchesOre(EntityLivingBase user, RandomOre ore, Block base, int meta, int harvest, + float multiplier, boolean silktouch, int y) { + Random random = new Random(); + + if (ore.doesSilktouchDisable && silktouch) { + return false; + } + if (user instanceof EntityPlayer && ore.research != null) { + if (!ResearchLogic.hasInfoUnlocked((EntityPlayer) user, ore.research)) { + return false; + } + } + + if (!(ore.minHeight == -1 && ore.maxHeight == -1)) { + if (y < ore.minHeight || y > ore.maxHeight) { + return false; + } + } + if (ore.block != base) { + return false; + } + if (ore.blockSub != meta && ore.blockSub != OreDictionary.WILDCARD_VALUE) { + return false; + } + if (ore.harvestLvl > harvest) { + return false; + } + return random.nextFloat() < (ore.chanceToDrop * multiplier); + } } diff --git a/src/main/java/minefantasy/mf2/api/refine/Alloy.java b/src/main/java/minefantasy/mf2/api/refine/Alloy.java index 89a0a1dc..2e503ee6 100644 --- a/src/main/java/minefantasy/mf2/api/refine/Alloy.java +++ b/src/main/java/minefantasy/mf2/api/refine/Alloy.java @@ -1,11 +1,5 @@ package minefantasy.mf2.api.refine; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - import minefantasy.mf2.api.crafting.MineFantasyFuels; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; @@ -13,106 +7,108 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.*; + public class Alloy { - public final List recipeItems; - public final ItemStack recipeOutput; - public final int level; - private Map props = new HashMap(); - - public Alloy(ItemStack output, int requiredLevel, List items) { - recipeItems = items; - recipeOutput = output; - level = requiredLevel; - } - - public ItemStack getRecipeOutput() { - return this.recipeOutput; - } - - public Alloy addProperty(String id, Object prop) { - props.put(id, prop); - return this; - } - - public Object getProperty(String id) { - return props.get(id); - } - - /** - * Used to check if a recipe matches current crafting inventory - */ - public boolean matches(ItemStack[] inventory) { - ArrayList checkRecipe = new ArrayList(this.recipeItems); - - for (ItemStack itemstack : inventory) { - if (itemstack != null) { - boolean matches = false; - Iterator iterator = checkRecipe.iterator(); - - while (iterator.hasNext()) { - ItemStack checkItem = (ItemStack) iterator.next(); - - if (itemstack.isItemEqual(checkItem) && areMaterialsEqual(itemstack, checkItem) - && (checkItem.getItemDamage() == OreDictionary.WILDCARD_VALUE - || itemstack.getItemDamage() == checkItem.getItemDamage())) { - matches = true; - checkRecipe.remove(checkItem); - break; - } - if (areBothCarbon(itemstack, checkItem)) { - matches = true; - checkRecipe.remove(checkItem); - break; - } - } - - if (!matches) { - return false; - } - } - } - - return checkRecipe.isEmpty(); - } - - private boolean areMaterialsEqual(ItemStack itemstack, ItemStack checkItem) { - CustomMaterial material1 = CustomToolHelper.getCustomPrimaryMaterial(itemstack); - CustomMaterial material2 = CustomToolHelper.getCustomPrimaryMaterial(checkItem); - if (material1 == null && material2 == null) { - return true; - } - if (material1 != null && material2 != null) { - return material1 == material2; - } - return false; - } - - private boolean areBothCarbon(ItemStack item1, ItemStack item2) { - return MineFantasyFuels.isCarbon(item1) && MineFantasyFuels.isCarbon(item2); - } - - /** - * Returns an Item that is the result of this recipe - */ - public ItemStack getCraftingResult(InventoryCrafting inv) { - return this.recipeOutput.copy(); - } - - /** - * Returns the size of the recipe area - */ - public int getRecipeSize() { - return this.recipeItems.size(); - } - - /** - * Gets the level of the Alloy, requiring a more powerful smelter - * - * @return the minimal level required to make (crucible is 0, alloy forge = 1, - * etc) - */ - public int getLevel() { - return level; - } + public final List recipeItems; + public final ItemStack recipeOutput; + public final int level; + private Map props = new HashMap(); + + public Alloy(ItemStack output, int requiredLevel, List items) { + recipeItems = items; + recipeOutput = output; + level = requiredLevel; + } + + public ItemStack getRecipeOutput() { + return this.recipeOutput; + } + + public Alloy addProperty(String id, Object prop) { + props.put(id, prop); + return this; + } + + public Object getProperty(String id) { + return props.get(id); + } + + /** + * Used to check if a recipe matches current crafting inventory + */ + public boolean matches(ItemStack[] inventory) { + ArrayList checkRecipe = new ArrayList(this.recipeItems); + + for (ItemStack itemstack : inventory) { + if (itemstack != null) { + boolean matches = false; + Iterator iterator = checkRecipe.iterator(); + + while (iterator.hasNext()) { + ItemStack checkItem = (ItemStack) iterator.next(); + + if (itemstack.isItemEqual(checkItem) && areMaterialsEqual(itemstack, checkItem) + && (checkItem.getItemDamage() == OreDictionary.WILDCARD_VALUE + || itemstack.getItemDamage() == checkItem.getItemDamage())) { + matches = true; + checkRecipe.remove(checkItem); + break; + } + if (areBothCarbon(itemstack, checkItem)) { + matches = true; + checkRecipe.remove(checkItem); + break; + } + } + + if (!matches) { + return false; + } + } + } + + return checkRecipe.isEmpty(); + } + + private boolean areMaterialsEqual(ItemStack itemstack, ItemStack checkItem) { + CustomMaterial material1 = CustomToolHelper.getCustomPrimaryMaterial(itemstack); + CustomMaterial material2 = CustomToolHelper.getCustomPrimaryMaterial(checkItem); + if (material1 == null && material2 == null) { + return true; + } + if (material1 != null && material2 != null) { + return material1 == material2; + } + return false; + } + + private boolean areBothCarbon(ItemStack item1, ItemStack item2) { + return MineFantasyFuels.isCarbon(item1) && MineFantasyFuels.isCarbon(item2); + } + + /** + * Returns an Item that is the result of this recipe + */ + public ItemStack getCraftingResult(InventoryCrafting inv) { + return this.recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + public int getRecipeSize() { + return this.recipeItems.size(); + } + + /** + * Gets the level of the Alloy, requiring a more powerful smelter + * + * @return the minimal level required to make (crucible is 0, alloy forge = 1, + * etc) + */ + public int getLevel() { + return level; + } } diff --git a/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java b/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java index a59675e0..5ff72e13 100644 --- a/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java +++ b/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java @@ -1,70 +1,69 @@ package minefantasy.mf2.api.refine; +import net.minecraft.item.ItemStack; + import java.util.ArrayList; import java.util.List; -import net.minecraft.item.ItemStack; - public class AlloyRecipes { - public static List alloys = new ArrayList(); + public static List alloys = new ArrayList(); - public static Alloy addAlloy(ItemStack out, int level, List in) { - Alloy alloy = new Alloy(out, level, in); - alloys.add(alloy); - return alloy; - } + public static Alloy addAlloy(ItemStack out, int level, List in) { + Alloy alloy = new Alloy(out, level, in); + alloys.add(alloy); + return alloy; + } - public static void addAlloy(ItemStack out, List in) { - addAlloy(out, 0, in); - } + public static void addAlloy(ItemStack out, List in) { + addAlloy(out, 0, in); + } - public static void addAlloy(Alloy alloy) { - alloys.add(alloy); - } + public static void addAlloy(Alloy alloy) { + alloys.add(alloy); + } - public static Alloy getResult(ItemStack[] inv) { - for (Alloy alloy : alloys) { - if (alloy.matches(inv)) { - return alloy; - } - } - return null; - } + public static Alloy getResult(ItemStack[] inv) { + for (Alloy alloy : alloys) { + if (alloy.matches(inv)) { + return alloy; + } + } + return null; + } - /** - * Adds an alloy, and duplicates it so the ratio can be copied eg a recipe with - * 2 'x' ore and 1 'y' ore can be made with 4 'x' ore and 2 'y' ore... - * - * @param the - * amount of times the ratio can be added - */ - public static Alloy[] addRatioRecipe(ItemStack out, int level, List in, int levels) { - levels = (int) (9F / in.size()); - Alloy[] alloys = new Alloy[levels]; - for (int a = 1; a <= levels; a++) { - List list2 = createDupeList(in, a); - ItemStack out2 = out.copy(); - int ss = Math.min(out2.getMaxStackSize(), out2.stackSize * a); - out2.stackSize = ss; - alloys[a - 1] = addAlloy(out2, level, list2); - } - return alloys; - } + /** + * Adds an alloy, and duplicates it so the ratio can be copied eg a recipe with + * 2 'x' ore and 1 'y' ore can be made with 4 'x' ore and 2 'y' ore... + * + * @param the amount of times the ratio can be added + */ + public static Alloy[] addRatioRecipe(ItemStack out, int level, List in, int levels) { + levels = (int) (9F / in.size()); + Alloy[] alloys = new Alloy[levels]; + for (int a = 1; a <= levels; a++) { + List list2 = createDupeList(in, a); + ItemStack out2 = out.copy(); + int ss = Math.min(out2.getMaxStackSize(), out2.stackSize * a); + out2.stackSize = ss; + alloys[a - 1] = addAlloy(out2, level, list2); + } + return alloys; + } - public static List createDupeList(List list) { - return createDupeList(list, 2); - } + public static List createDupeList(List list) { + return createDupeList(list, 2); + } - public static List createDupeList(List list, int dupe) { - if (dupe == 0) { - dupe = 1; - } - List list2 = new ArrayList(); - for (int a = 0; a < dupe; a++) { - for (int b = 0; b < list.size(); b++) { - list2.add(list.get(b)); - } - } - return list2; - } + public static List createDupeList(List list, int dupe) { + if (dupe == 0) { + dupe = 1; + } + List list2 = new ArrayList(); + for (int a = 0; a < dupe; a++) { + for (int b = 0; b < list.size(); b++) { + list2.add(list.get(b)); + } + } + return list2; + } } diff --git a/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java b/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java index 4c19acc0..e87a9b4e 100644 --- a/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java +++ b/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java @@ -1,46 +1,45 @@ package minefantasy.mf2.api.refine; -import java.util.HashMap; - import minefantasy.mf2.api.helpers.CustomToolHelper; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class BigFurnaceRecipes { - public static HashMap recipeList = new HashMap(); - - public static BigFurnaceRecipes addRecipe(Block input, ItemStack output, int tier) { - return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); - } - - public static BigFurnaceRecipes addRecipe(Item input, ItemStack output, int tier) { - return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); - } - - public static BigFurnaceRecipes addRecipe(ItemStack input, ItemStack output, int tier) { - BigFurnaceRecipes recipe = new BigFurnaceRecipes(input, output, tier); - recipeList.put(CustomToolHelper.getReferenceName(input), recipe); - return recipe; - } - - public static BigFurnaceRecipes getResult(ItemStack input) { - if (input == null) - return null; - - BigFurnaceRecipes specific = recipeList.get(CustomToolHelper.getReferenceName(input)); - if (specific != null) - return specific; - - return recipeList.get(CustomToolHelper.getReferenceName(input, "any")); - } - - public final ItemStack result; - public final int tier; +import java.util.HashMap; - public BigFurnaceRecipes(ItemStack input, ItemStack output, int tier) { - this.result = output; - this.tier = tier; - } +public class BigFurnaceRecipes { + public static HashMap recipeList = new HashMap(); + public final ItemStack result; + public final int tier; + + public BigFurnaceRecipes(ItemStack input, ItemStack output, int tier) { + this.result = output; + this.tier = tier; + } + + public static BigFurnaceRecipes addRecipe(Block input, ItemStack output, int tier) { + return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); + } + + public static BigFurnaceRecipes addRecipe(Item input, ItemStack output, int tier) { + return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); + } + + public static BigFurnaceRecipes addRecipe(ItemStack input, ItemStack output, int tier) { + BigFurnaceRecipes recipe = new BigFurnaceRecipes(input, output, tier); + recipeList.put(CustomToolHelper.getReferenceName(input), recipe); + return recipe; + } + + public static BigFurnaceRecipes getResult(ItemStack input) { + if (input == null) + return null; + + BigFurnaceRecipes specific = recipeList.get(CustomToolHelper.getReferenceName(input)); + if (specific != null) + return specific; + + return recipeList.get(CustomToolHelper.getReferenceName(input, "any")); + } } diff --git a/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java b/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java index 0a3af663..58872d8a 100644 --- a/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java +++ b/src/main/java/minefantasy/mf2/api/refine/BlastFurnaceRecipes.java @@ -1,65 +1,67 @@ package minefantasy.mf2.api.refine; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - public class BlastFurnaceRecipes { - private static final BlastFurnaceRecipes smeltingBase = new BlastFurnaceRecipes(); - /** The list of smelting results. */ - private Map smeltingList = new HashMap(); + private static final BlastFurnaceRecipes smeltingBase = new BlastFurnaceRecipes(); + /** + * The list of smelting results. + */ + private Map smeltingList = new HashMap(); - /** - * Used to call methods addSmelting and getSmeltingResult. - */ - public static BlastFurnaceRecipes smelting() { - return smeltingBase; - } + private BlastFurnaceRecipes() { + } - private BlastFurnaceRecipes() { - } + /** + * Used to call methods addSmelting and getSmeltingResult. + */ + public static BlastFurnaceRecipes smelting() { + return smeltingBase; + } - public void addRecipe(Block input, ItemStack output) { - this.addRecipe(Item.getItemFromBlock(input), output); - } + public void addRecipe(Block input, ItemStack output) { + this.addRecipe(Item.getItemFromBlock(input), output); + } - public void addRecipe(Item input, ItemStack output) { - this.addRecipe(new ItemStack(input, 1, 32767), output); - } + public void addRecipe(Item input, ItemStack output) { + this.addRecipe(new ItemStack(input, 1, 32767), output); + } - public void addRecipe(ItemStack input, ItemStack output) { - this.smeltingList.put(input, output); - } + public void addRecipe(ItemStack input, ItemStack output) { + this.smeltingList.put(input, output); + } - /** - * Returns the smelting result of an item. - */ - public ItemStack getSmeltingResult(ItemStack input) { - Iterator iterator = this.smeltingList.entrySet().iterator(); - Entry entry; + /** + * Returns the smelting result of an item. + */ + public ItemStack getSmeltingResult(ItemStack input) { + Iterator iterator = this.smeltingList.entrySet().iterator(); + Entry entry; - do { - if (!iterator.hasNext()) { - return null; - } + do { + if (!iterator.hasNext()) { + return null; + } - entry = (Entry) iterator.next(); - } while (!this.func_151397_a(input, (ItemStack) entry.getKey())); + entry = (Entry) iterator.next(); + } while (!this.func_151397_a(input, (ItemStack) entry.getKey())); - return (ItemStack) entry.getValue(); - } + return (ItemStack) entry.getValue(); + } - private boolean func_151397_a(ItemStack p_151397_1_, ItemStack p_151397_2_) { - return p_151397_2_.getItem() == p_151397_1_.getItem() - && (p_151397_2_.getItemDamage() == 32767 || p_151397_2_.getItemDamage() == p_151397_1_.getItemDamage()); - } + private boolean func_151397_a(ItemStack p_151397_1_, ItemStack p_151397_2_) { + return p_151397_2_.getItem() == p_151397_1_.getItem() + && (p_151397_2_.getItemDamage() == 32767 || p_151397_2_.getItemDamage() == p_151397_1_.getItemDamage()); + } - public Map getSmeltingList() { - return this.smeltingList; - } + public Map getSmeltingList() { + return this.smeltingList; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/api/refine/IBellowsUseable.java b/src/main/java/minefantasy/mf2/api/refine/IBellowsUseable.java index 73ef4755..042ebe0b 100644 --- a/src/main/java/minefantasy/mf2/api/refine/IBellowsUseable.java +++ b/src/main/java/minefantasy/mf2/api/refine/IBellowsUseable.java @@ -2,6 +2,6 @@ public interface IBellowsUseable { - void onUsedWithBellows(float powerLevel); + void onUsedWithBellows(float powerLevel); } diff --git a/src/main/java/minefantasy/mf2/api/refine/ISmokeCarrier.java b/src/main/java/minefantasy/mf2/api/refine/ISmokeCarrier.java index a887a6b6..0262f7f8 100644 --- a/src/main/java/minefantasy/mf2/api/refine/ISmokeCarrier.java +++ b/src/main/java/minefantasy/mf2/api/refine/ISmokeCarrier.java @@ -1,11 +1,11 @@ package minefantasy.mf2.api.refine; public interface ISmokeCarrier { - public int getSmokeValue(); + public int getSmokeValue(); - public void setSmokeValue(int smoke); + public void setSmokeValue(int smoke); - public int getMaxSmokeStorage(); + public int getMaxSmokeStorage(); - public boolean canAbsorbIndirect(); + public boolean canAbsorbIndirect(); } diff --git a/src/main/java/minefantasy/mf2/api/refine/ISmokeHandler.java b/src/main/java/minefantasy/mf2/api/refine/ISmokeHandler.java index 7670516f..1b7a3172 100644 --- a/src/main/java/minefantasy/mf2/api/refine/ISmokeHandler.java +++ b/src/main/java/minefantasy/mf2/api/refine/ISmokeHandler.java @@ -7,5 +7,5 @@ * to be used */ public interface ISmokeHandler { - void spawnSmoke(World world, double x, double y, double z, int value); + void spawnSmoke(World world, double x, double y, double z, int value); } diff --git a/src/main/java/minefantasy/mf2/api/refine/SmokeMechanics.java b/src/main/java/minefantasy/mf2/api/refine/SmokeMechanics.java index 19facf7a..02e5bdb9 100644 --- a/src/main/java/minefantasy/mf2/api/refine/SmokeMechanics.java +++ b/src/main/java/minefantasy/mf2/api/refine/SmokeMechanics.java @@ -1,149 +1,148 @@ package minefantasy.mf2.api.refine; -import java.util.Random; - import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Random; + public class SmokeMechanics { - /** - * Emits smoke from a carrying block - * - * @param max - * the maximum smoke emitted each tick (-1 for infinite) - * @return true if it's successful - */ - public static boolean emitSmokeFromCarrier(World world, int x, int y, int z, ISmokeCarrier tile, int max) { - int value = tile.getSmokeValue(); + public static ISmokeHandler handler; + /** + * Do not use this from blocks, use emitSmoke instead Spawns smoke + */ + private static Random rand = new Random(); - if (max >= 0 && value > max) { - value = max; - } - if (value <= 0) { - return true;// yes it succeeded because it doesn't need to... it just really means nothing - // went wrong - } - boolean success = emitSmoke(world, x, y, z, value) != -1; + /** + * Emits smoke from a carrying block + * + * @param max the maximum smoke emitted each tick (-1 for infinite) + * @return true if it's successful + */ + public static boolean emitSmokeFromCarrier(World world, int x, int y, int z, ISmokeCarrier tile, int max) { + int value = tile.getSmokeValue(); - if (success) { - modifySmoke(tile, -value); - } - return success; - } + if (max >= 0 && value > max) { + value = max; + } + if (value <= 0) { + return true;// yes it succeeded because it doesn't need to... it just really means nothing + // went wrong + } + boolean success = emitSmoke(world, x, y, z, value) != -1; - /** - * Tries to emit smoke, sends it to chimneys if possible Returns -1 for fail, 0 - * for shared, 1 for success - */ - public static int emitSmoke(World world, int x, int y, int z, int value) { - TileEntity tile = world.getTileEntity(x, y + 1, z);// The above block - if (tile == null) // No TileEntity above - { - if (world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))// if solid above - { - return -1; - } - // if(world.canBlockSeeTheSky(x, y+1, z)) - { - spawnSmoke(world, x, y + 1, z, value); - return 1; - } - } else { - if (tile instanceof ISmokeCarrier) { - if (((ISmokeCarrier) tile).getSmokeValue() < ((ISmokeCarrier) tile).getMaxSmokeStorage()) { - modifySmoke((ISmokeCarrier) tile, value); - return 0; - } - } else { - if (world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))// if solid above - { - return -1; - } - } - } - return -1; - } + if (success) { + modifySmoke(tile, -value); + } + return success; + } - public static void modifySmoke(ISmokeCarrier tile, int value) { - tile.setSmokeValue(tile.getSmokeValue() + value); - if (tile.getSmokeValue() <= 0) { - tile.setSmokeValue(0); - } - } + /** + * Tries to emit smoke, sends it to chimneys if possible Returns -1 for fail, 0 + * for shared, 1 for success + */ + public static int emitSmoke(World world, int x, int y, int z, int value) { + TileEntity tile = world.getTileEntity(x, y + 1, z);// The above block + if (tile == null) // No TileEntity above + { + if (world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))// if solid above + { + return -1; + } + // if(world.canBlockSeeTheSky(x, y+1, z)) + { + spawnSmoke(world, x, y + 1, z, value); + return 1; + } + } else { + if (tile instanceof ISmokeCarrier) { + if (((ISmokeCarrier) tile).getSmokeValue() < ((ISmokeCarrier) tile).getMaxSmokeStorage()) { + modifySmoke((ISmokeCarrier) tile, value); + return 0; + } + } else { + if (world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))// if solid above + { + return -1; + } + } + } + return -1; + } - /** - * Do not use this from blocks, use emitSmoke instead Spawns smoke - */ - private static Random rand = new Random(); - public static ISmokeHandler handler; + public static void modifySmoke(ISmokeCarrier tile, int value) { + tile.setSmokeValue(tile.getSmokeValue() + value); + if (tile.getSmokeValue() <= 0) { + tile.setSmokeValue(0); + } + } - /** - * Emits smoke to a coord, ignoring chimneys - */ - public static void spawnSmoke(World world, int x, int y, int z, int value) { - spawnSmokeD(world, x + 0.5D, y + 0.5D, z + 0.5D, value); - } + /** + * Emits smoke to a coord, ignoring chimneys + */ + public static void spawnSmoke(World world, int x, int y, int z, int value) { + spawnSmokeD(world, x + 0.5D, y + 0.5D, z + 0.5D, value); + } - /** - * Emits smoke, ignoring chimneys - */ - public static void spawnSmokeD(World world, double x, double y, double z, int value) { - if (!world.isRemote && handler != null) { - handler.spawnSmoke(world, x, y, z, value); - } + /** + * Emits smoke, ignoring chimneys + */ + public static void spawnSmokeD(World world, double x, double y, double z, int value) { + if (!world.isRemote && handler != null) { + handler.spawnSmoke(world, x, y, z, value); + } - for (int a = 0; a < value; a++) { - float sprayRange = 0.2F; - float sprayX = (rand.nextFloat() * sprayRange) - (sprayRange / 2); - float sprayZ = (rand.nextFloat() * sprayRange) - (sprayRange / 2); - float height = 0.2F; - world.spawnParticle("smoke", x, y, z, sprayX, height, sprayZ); - } - } + for (int a = 0; a < value; a++) { + float sprayRange = 0.2F; + float sprayX = (rand.nextFloat() * sprayRange) - (sprayRange / 2); + float sprayZ = (rand.nextFloat() * sprayRange) - (sprayRange / 2); + float height = 0.2F; + world.spawnParticle("smoke", x, y, z, sprayX, height, sprayZ); + } + } - /** - * Checks if smoke can go through a chimney - */ - public static boolean tryUseChimney(World world, int x, int y, int z, int value) { - return tryUseChimney(world, x, y, z, value, true); - } + /** + * Checks if smoke can go through a chimney + */ + public static boolean tryUseChimney(World world, int x, int y, int z, int value) { + return tryUseChimney(world, x, y, z, value, true); + } - /** - * Checks if smoke can go through a chimney - */ - public static boolean tryUseChimney(World world, int x, int y, int z, int value, boolean indirect) { - TileEntity tile = world.getTileEntity(x, y, z);// The block - if (tile != null) { - if (tile instanceof ISmokeCarrier) { - ISmokeCarrier chimney = (ISmokeCarrier) tile; - if ((!indirect || chimney.canAbsorbIndirect()) - && chimney.getSmokeValue() < chimney.getMaxSmokeStorage()) { - modifySmoke(chimney, value); - return true; - } - } - } - return false; - } + /** + * Checks if smoke can go through a chimney + */ + public static boolean tryUseChimney(World world, int x, int y, int z, int value, boolean indirect) { + TileEntity tile = world.getTileEntity(x, y, z);// The block + if (tile != null) { + if (tile instanceof ISmokeCarrier) { + ISmokeCarrier chimney = (ISmokeCarrier) tile; + if ((!indirect || chimney.canAbsorbIndirect()) + && chimney.getSmokeValue() < chimney.getMaxSmokeStorage()) { + modifySmoke(chimney, value); + return true; + } + } + } + return false; + } - /** - * Emits smoke from a source, or goes through a chimney - */ - public static void emitSmokeIndirect(World world, int xCoord, int yCoord, int zCoord, int value) { - if (tryUseChimney(world, xCoord, yCoord, zCoord, value)) { - return; - } + /** + * Emits smoke from a source, or goes through a chimney + */ + public static void emitSmokeIndirect(World world, int xCoord, int yCoord, int zCoord, int value) { + if (tryUseChimney(world, xCoord, yCoord, zCoord, value)) { + return; + } - for (int x = -1; x <= 1; x++) { - for (int y = 0; y <= 1; y++) { - for (int z = -1; z <= 1; z++) { - if (tryUseChimney(world, xCoord + x, yCoord + y, zCoord + z, value)) { - return; - } - } - } - } - spawnSmoke(world, xCoord, yCoord, zCoord, value); - } + for (int x = -1; x <= 1; x++) { + for (int y = 0; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + if (tryUseChimney(world, xCoord + x, yCoord + y, zCoord + z, value)) { + return; + } + } + } + } + spawnSmoke(world, xCoord, yCoord, zCoord, value); + } } diff --git a/src/main/java/minefantasy/mf2/api/rpg/LevelupEvent.java b/src/main/java/minefantasy/mf2/api/rpg/LevelupEvent.java index 3dc47206..b86645bc 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/LevelupEvent.java +++ b/src/main/java/minefantasy/mf2/api/rpg/LevelupEvent.java @@ -4,15 +4,15 @@ import net.minecraftforge.event.entity.living.LivingEvent; public class LevelupEvent extends LivingEvent { - public final EntityPlayer thePlayer; - public final Skill theSkill; - public final int theLevel; + public final EntityPlayer thePlayer; + public final Skill theSkill; + public final int theLevel; - public LevelupEvent(EntityPlayer player, Skill skill, int newlvl) { - super(player); - this.thePlayer = player; - this.theSkill = skill; - this.theLevel = newlvl; - } + public LevelupEvent(EntityPlayer player, Skill skill, int newlvl) { + super(player); + this.thePlayer = player; + this.theSkill = skill; + this.theLevel = newlvl; + } } diff --git a/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java b/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java index 427cf1f3..a0e724b5 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java +++ b/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java @@ -1,123 +1,120 @@ package minefantasy.mf2.api.rpg; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; - import minefantasy.mf2.api.helpers.PlayerTagData; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Random; + public class RPGElements { - public static boolean isSystemActive = true; - public static float levelSpeedModifier = 1.0F; - public static float levelUpModifier = 1.5F; - - private static HashMap skillsMap = new HashMap(); - private static ArrayList skillsList = new ArrayList(); - - public static void addSkill(String name) { - addSkill(new Skill(name)); - } - - public static void addSkill(Skill skill) { - skillsMap.put(skill.skillName, skill); - skillsList.add(skill); - } - - private static final String statsName = "RPGStats_MF"; - - public static NBTTagCompound getTagData(EntityPlayer player) { - NBTTagCompound nbt = PlayerTagData.getPersistedData(player); - if (!nbt.hasKey(statsName)) { - nbt.setTag(statsName, new NBTTagCompound()); - } - return nbt.getCompoundTag(statsName); - } - - public static NBTTagCompound getSkill(EntityPlayer player, String skillname) { - NBTTagCompound nbt = getTagData(player); - if (!nbt.hasKey(skillname)) { - NBTTagCompound tag = new NBTTagCompound(); - - Skill skill = skillsMap.get(skillname); - if (skill != null) { - skill.init(tag, player); - } - nbt.setTag(skillname, tag); - } - return nbt.getCompoundTag(skillname); - } - - public static void initSkills(EntityPlayer player) { - for (int id = 0; id < skillsList.size(); id++) { - Skill skill = skillsList.get(id); - skill.sync(player); - } - } - - static { - if (isSystemActive) { - SkillList.init(); - } - } - - public static Skill getSkillByName(String name) { - return skillsMap.get(name.toLowerCase()); - } - - public static int getLevel(EntityPlayer player, Skill skill) { - return RPGElements.getSkill(player, skill.skillName).getInteger("level"); - } - - /** - * Modifies the stamina cost for an ability (-1 means impossible) - */ - public static float getStaminaCostModifier(EntityPlayer player, Skill skill, int minLevel) { - NBTTagCompound stat = getSkill(player, skill.skillName); - int level = stat.getInteger("level"); - - if (level < minLevel) { - return -1; - } else { - if (skill.getMaxLevel() - minLevel <= 0) { - return 1.0F; - } - float progress = (level - minLevel) / (skill.getMaxLevel() - minLevel); - return 1.5F - progress; - } - } - - public static float getWeaponModifier(EntityPlayer player, Skill skill) { - int minSkill = 25;// No bonus damage until level 25+ - int level = getLevel(player, skill); - if (level <= minSkill) { - return 1.0F; - } - - float progress = ((float) level - minSkill) / ((float) skill.getMaxLevel() - minSkill); - return 1.0F + (progress); - } - - public static boolean hasLevel(EntityPlayer player, Skill skill, int requirement) { - return getSkill(player, skill.skillName).getInteger("level") >= requirement; - } - - private static Random rand = new Random(); - - public static Skill getRandomSkill() { - int id = rand.nextInt(skillsList.size()); - return skillsList.get(id); - } - - public static void syncAll(EntityPlayer user) { - if (!user.worldObj.isRemote) { - for (int a = 0; a < skillsList.size(); a++) { - Skill skill = skillsList.get(a); - if (skill != null) { - skill.sync(user); - } - } - } - } + private static final String statsName = "RPGStats_MF"; + public static boolean isSystemActive = true; + public static float levelSpeedModifier = 1.0F; + public static float levelUpModifier = 1.5F; + private static HashMap skillsMap = new HashMap(); + private static ArrayList skillsList = new ArrayList(); + private static Random rand = new Random(); + + static { + if (isSystemActive) { + SkillList.init(); + } + } + + public static void addSkill(String name) { + addSkill(new Skill(name)); + } + + public static void addSkill(Skill skill) { + skillsMap.put(skill.skillName, skill); + skillsList.add(skill); + } + + public static NBTTagCompound getTagData(EntityPlayer player) { + NBTTagCompound nbt = PlayerTagData.getPersistedData(player); + if (!nbt.hasKey(statsName)) { + nbt.setTag(statsName, new NBTTagCompound()); + } + return nbt.getCompoundTag(statsName); + } + + public static NBTTagCompound getSkill(EntityPlayer player, String skillname) { + NBTTagCompound nbt = getTagData(player); + if (!nbt.hasKey(skillname)) { + NBTTagCompound tag = new NBTTagCompound(); + + Skill skill = skillsMap.get(skillname); + if (skill != null) { + skill.init(tag, player); + } + nbt.setTag(skillname, tag); + } + return nbt.getCompoundTag(skillname); + } + + public static void initSkills(EntityPlayer player) { + for (int id = 0; id < skillsList.size(); id++) { + Skill skill = skillsList.get(id); + skill.sync(player); + } + } + + public static Skill getSkillByName(String name) { + return skillsMap.get(name.toLowerCase()); + } + + public static int getLevel(EntityPlayer player, Skill skill) { + return RPGElements.getSkill(player, skill.skillName).getInteger("level"); + } + + /** + * Modifies the stamina cost for an ability (-1 means impossible) + */ + public static float getStaminaCostModifier(EntityPlayer player, Skill skill, int minLevel) { + NBTTagCompound stat = getSkill(player, skill.skillName); + int level = stat.getInteger("level"); + + if (level < minLevel) { + return -1; + } else { + if (skill.getMaxLevel() - minLevel <= 0) { + return 1.0F; + } + float progress = (level - minLevel) / (skill.getMaxLevel() - minLevel); + return 1.5F - progress; + } + } + + public static float getWeaponModifier(EntityPlayer player, Skill skill) { + int minSkill = 25;// No bonus damage until level 25+ + int level = getLevel(player, skill); + if (level <= minSkill) { + return 1.0F; + } + + float progress = ((float) level - minSkill) / ((float) skill.getMaxLevel() - minSkill); + return 1.0F + (progress); + } + + public static boolean hasLevel(EntityPlayer player, Skill skill, int requirement) { + return getSkill(player, skill.skillName).getInteger("level") >= requirement; + } + + public static Skill getRandomSkill() { + int id = rand.nextInt(skillsList.size()); + return skillsList.get(id); + } + + public static void syncAll(EntityPlayer user) { + if (!user.worldObj.isRemote) { + for (int a = 0; a < skillsList.size(); a++) { + Skill skill = skillsList.get(a); + if (skill != null) { + skill.sync(user); + } + } + } + } } diff --git a/src/main/java/minefantasy/mf2/api/rpg/Skill.java b/src/main/java/minefantasy/mf2/api/rpg/Skill.java index 6329bb16..0ef66ed4 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/Skill.java +++ b/src/main/java/minefantasy/mf2/api/rpg/Skill.java @@ -7,129 +7,128 @@ import net.minecraftforge.common.MinecraftForge; public class Skill { - public final String skillName; - - public Skill(String name) { - this.skillName = name; - } - - public int getMaxLevel() { - return 100; - } - - public int getStartLevel() { - return 1; - } - - public Skill register() { - RPGElements.addSkill(this); - return this; - } - - /** - * Gets how much xp needed to level up - */ - public int getLvlXP(int level, EntityPlayer user) { - float rise = 0.2F * RPGElements.levelUpModifier;// 20% rize each level - return (int) Math.floor(10F * (1.0F + (rise * (level - 1)))); - } - - public int[] getXP(EntityPlayer player) { - NBTTagCompound skill = RPGElements.getSkill(player, skillName); - - if (skill != null) { - int value = skill.getInteger("xp"); - int max = skill.getInteger("xpMax"); - return new int[] { value, max }; - } - return new int[] { 0, 0 }; - } - - public void manualLvlUp(EntityPlayer player, int newLevel) { - NBTTagCompound skill = RPGElements.getSkill(player, skillName); - if (skill == null) - return; - - skill.setInteger("xp", 0); - - skill.setInteger("level", newLevel); - skill.setInteger("xp", 0); - skill.setInteger("xpMax", getLvlXP(newLevel, player)); - levelUp(player, newLevel); - } - - /** - * Adds xp to the skill, negative values take xp away - */ - public void addXP(EntityPlayer player, int xp) { - xp = (int) (RPGElements.levelSpeedModifier * xp); - NBTTagCompound skill = RPGElements.getSkill(player, skillName); - if (skill == null) - return; - - int value = skill.getInteger("xp"); - int max = skill.getInteger("xpMax"); - int curLvl = RPGElements.getLevel(player, this); - - if (max <= 0 || curLvl >= getMaxLevel()) { - return; - } - value += xp; - skill.setInteger("xp", value); - - if (value >= max) { - value -= max; - int level = skill.getInteger("level") + 1; - skill.setInteger("level", level); - skill.setInteger("xp", value); - skill.setInteger("xpMax", getLvlXP(level, player)); - levelUp(player, level); - } else { - if (value < 0) { - int level = skill.getInteger("level") - 1; - if (level < 1) - return; - - skill.setInteger("level", level); - - int newMax = getLvlXP(level, player); - skill.setInteger("xp", value + newMax); - skill.setInteger("xpMax", newMax); - } - } - } - - private void levelUp(EntityPlayer player, int newlvl) { - if (!player.worldObj.isRemote) { - MineFantasyAPI.debugMsg("Level up detected for " + skillName); - MinecraftForge.EVENT_BUS.post(new LevelupEvent(player, this, newlvl)); - } - } - - /** - * This is a universal way to tell a skill to do something - * - * @param functionID - * a string representing what to do, depends on the skill - */ - public void callFunction(EntityPlayer user, String functionID) { - } - - public void init(NBTTagCompound tag, EntityPlayer player) { - int start = getStartLevel(); - tag.setInteger("level", start); - tag.setInteger("xp", 0); - tag.setInteger("xpMax", getLvlXP(start, player)); - } - - public void sync(EntityPlayer player) { - if (!player.worldObj.isRemote) { - MineFantasyAPI.debugMsg("Sync skill: " + skillName); - MinecraftForge.EVENT_BUS.post(new SyncSkillEvent(player, this)); - } - } - - public String getDisplayName() { - return StatCollector.translateToLocal("skill." + skillName + ".name"); - } + public final String skillName; + + public Skill(String name) { + this.skillName = name; + } + + public int getMaxLevel() { + return 100; + } + + public int getStartLevel() { + return 1; + } + + public Skill register() { + RPGElements.addSkill(this); + return this; + } + + /** + * Gets how much xp needed to level up + */ + public int getLvlXP(int level, EntityPlayer user) { + float rise = 0.2F * RPGElements.levelUpModifier;// 20% rize each level + return (int) Math.floor(10F * (1.0F + (rise * (level - 1)))); + } + + public int[] getXP(EntityPlayer player) { + NBTTagCompound skill = RPGElements.getSkill(player, skillName); + + if (skill != null) { + int value = skill.getInteger("xp"); + int max = skill.getInteger("xpMax"); + return new int[]{value, max}; + } + return new int[]{0, 0}; + } + + public void manualLvlUp(EntityPlayer player, int newLevel) { + NBTTagCompound skill = RPGElements.getSkill(player, skillName); + if (skill == null) + return; + + skill.setInteger("xp", 0); + + skill.setInteger("level", newLevel); + skill.setInteger("xp", 0); + skill.setInteger("xpMax", getLvlXP(newLevel, player)); + levelUp(player, newLevel); + } + + /** + * Adds xp to the skill, negative values take xp away + */ + public void addXP(EntityPlayer player, int xp) { + xp = (int) (RPGElements.levelSpeedModifier * xp); + NBTTagCompound skill = RPGElements.getSkill(player, skillName); + if (skill == null) + return; + + int value = skill.getInteger("xp"); + int max = skill.getInteger("xpMax"); + int curLvl = RPGElements.getLevel(player, this); + + if (max <= 0 || curLvl >= getMaxLevel()) { + return; + } + value += xp; + skill.setInteger("xp", value); + + if (value >= max) { + value -= max; + int level = skill.getInteger("level") + 1; + skill.setInteger("level", level); + skill.setInteger("xp", value); + skill.setInteger("xpMax", getLvlXP(level, player)); + levelUp(player, level); + } else { + if (value < 0) { + int level = skill.getInteger("level") - 1; + if (level < 1) + return; + + skill.setInteger("level", level); + + int newMax = getLvlXP(level, player); + skill.setInteger("xp", value + newMax); + skill.setInteger("xpMax", newMax); + } + } + } + + private void levelUp(EntityPlayer player, int newlvl) { + if (!player.worldObj.isRemote) { + MineFantasyAPI.debugMsg("Level up detected for " + skillName); + MinecraftForge.EVENT_BUS.post(new LevelupEvent(player, this, newlvl)); + } + } + + /** + * This is a universal way to tell a skill to do something + * + * @param functionID a string representing what to do, depends on the skill + */ + public void callFunction(EntityPlayer user, String functionID) { + } + + public void init(NBTTagCompound tag, EntityPlayer player) { + int start = getStartLevel(); + tag.setInteger("level", start); + tag.setInteger("xp", 0); + tag.setInteger("xpMax", getLvlXP(start, player)); + } + + public void sync(EntityPlayer player) { + if (!player.worldObj.isRemote) { + MineFantasyAPI.debugMsg("Sync skill: " + skillName); + MinecraftForge.EVENT_BUS.post(new SyncSkillEvent(player, this)); + } + } + + public String getDisplayName() { + return StatCollector.translateToLocal("skill." + skillName + ".name"); + } } diff --git a/src/main/java/minefantasy/mf2/api/rpg/SkillList.java b/src/main/java/minefantasy/mf2/api/rpg/SkillList.java index f88971ba..7c8bb1f1 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/SkillList.java +++ b/src/main/java/minefantasy/mf2/api/rpg/SkillList.java @@ -1,33 +1,33 @@ package minefantasy.mf2.api.rpg; public class SkillList { - // MOVEMENT - // public static Skill athletics = new Skill("athletics").register(); - // public static Skill acrobatics = new Skill("acrobatics").register(); - // public static Skill sneak = new Skill("sneak").register(); + // MOVEMENT + // public static Skill athletics = new Skill("athletics").register(); + // public static Skill acrobatics = new Skill("acrobatics").register(); + // public static Skill sneak = new Skill("sneak").register(); - // CRAFTING - public static Skill artisanry = new Skill("artisanry").register(); - public static Skill engineering = new Skill("engineering").register(); - public static Skill construction = new Skill("construction").register(); - public static Skill provisioning = new Skill("provisioning").register(); - public static Skill combat = new Skill("combat").register(); + // CRAFTING + public static Skill artisanry = new Skill("artisanry").register(); + public static Skill engineering = new Skill("engineering").register(); + public static Skill construction = new Skill("construction").register(); + public static Skill provisioning = new Skill("provisioning").register(); + public static Skill combat = new Skill("combat").register(); - // OFFENSE - // public static Skill unarmed = new Skill("unarmed").register(); - // public static Skill blade = new Skill("blade").register(); - // public static Skill blunt = new Skill("blunt").register(); - // public static Skill axe = new Skill("axe").register(); - // public static Skill polearm = new Skill("polearm").register(); - // public static Skill exotic = new Skill("exotic").register(); - // public static Skill archery = new Skill("archery").register(); + // OFFENSE + // public static Skill unarmed = new Skill("unarmed").register(); + // public static Skill blade = new Skill("blade").register(); + // public static Skill blunt = new Skill("blunt").register(); + // public static Skill axe = new Skill("axe").register(); + // public static Skill polearm = new Skill("polearm").register(); + // public static Skill exotic = new Skill("exotic").register(); + // public static Skill archery = new Skill("archery").register(); - // DEFENCE - // public static Skill lightarmour = new Skill("lightarmour").register(); - // public static Skill mediumarmour = new Skill("mediumarmour").register(); - // public static Skill heavyarmour = new Skill("heavyarmour").register(); - // public static Skill block = new Skill("block").register(); + // DEFENCE + // public static Skill lightarmour = new Skill("lightarmour").register(); + // public static Skill mediumarmour = new Skill("mediumarmour").register(); + // public static Skill heavyarmour = new Skill("heavyarmour").register(); + // public static Skill block = new Skill("block").register(); - public static void init() { - } + public static void init() { + } } diff --git a/src/main/java/minefantasy/mf2/api/rpg/SyncSkillEvent.java b/src/main/java/minefantasy/mf2/api/rpg/SyncSkillEvent.java index ac2556d1..91be9e51 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/SyncSkillEvent.java +++ b/src/main/java/minefantasy/mf2/api/rpg/SyncSkillEvent.java @@ -4,13 +4,13 @@ import net.minecraftforge.event.entity.living.LivingEvent; public class SyncSkillEvent extends LivingEvent { - public final EntityPlayer thePlayer; - public final Skill theSkill; + public final EntityPlayer thePlayer; + public final Skill theSkill; - public SyncSkillEvent(EntityPlayer player, Skill skill) { - super(player); - this.thePlayer = player; - this.theSkill = skill; - } + public SyncSkillEvent(EntityPlayer player, Skill skill) { + super(player); + this.thePlayer = player; + this.theSkill = skill; + } } diff --git a/src/main/java/minefantasy/mf2/api/stamina/IHeldStaminaItem.java b/src/main/java/minefantasy/mf2/api/stamina/IHeldStaminaItem.java index 8b9dbc41..1f6af2c9 100644 --- a/src/main/java/minefantasy/mf2/api/stamina/IHeldStaminaItem.java +++ b/src/main/java/minefantasy/mf2/api/stamina/IHeldStaminaItem.java @@ -4,9 +4,9 @@ import net.minecraft.item.ItemStack; public interface IHeldStaminaItem { - float getDecayMod(EntityLivingBase user, ItemStack item); + float getDecayMod(EntityLivingBase user, ItemStack item); - float getRegenModifier(EntityLivingBase user, ItemStack item); + float getRegenModifier(EntityLivingBase user, ItemStack item); - float getIdleModifier(EntityLivingBase user, ItemStack item); + float getIdleModifier(EntityLivingBase user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/stamina/IStaminaWeapon.java b/src/main/java/minefantasy/mf2/api/stamina/IStaminaWeapon.java index d260a5ec..b6d5899f 100644 --- a/src/main/java/minefantasy/mf2/api/stamina/IStaminaWeapon.java +++ b/src/main/java/minefantasy/mf2/api/stamina/IStaminaWeapon.java @@ -4,5 +4,5 @@ import net.minecraft.item.ItemStack; public interface IStaminaWeapon { - public float getStaminaDrainOnHit(EntityLivingBase user, ItemStack item); + public float getStaminaDrainOnHit(EntityLivingBase user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/stamina/IWornStaminaItem.java b/src/main/java/minefantasy/mf2/api/stamina/IWornStaminaItem.java index d162f4d6..5466117d 100644 --- a/src/main/java/minefantasy/mf2/api/stamina/IWornStaminaItem.java +++ b/src/main/java/minefantasy/mf2/api/stamina/IWornStaminaItem.java @@ -4,21 +4,21 @@ import net.minecraft.item.ItemStack; public interface IWornStaminaItem { - /** - * This adds up between armour pieces: a - value takes off points while a + adds - * to them - */ - float getDecayModifier(EntityLivingBase user, ItemStack item); + /** + * This adds up between armour pieces: a - value takes off points while a + adds + * to them + */ + float getDecayModifier(EntityLivingBase user, ItemStack item); - /** - * This adds up between armour pieces: a - value takes off points while a + adds - * to them - */ - float getRegenModifier(EntityLivingBase user, ItemStack item); + /** + * This adds up between armour pieces: a - value takes off points while a + adds + * to them + */ + float getRegenModifier(EntityLivingBase user, ItemStack item); - /** - * This adds up between armour pieces: a - value takes off points while a + adds - * to them - */ - float getIdleModifier(EntityLivingBase user, ItemStack item); + /** + * This adds up between armour pieces: a - value takes off points while a + adds + * to them + */ + float getIdleModifier(EntityLivingBase user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/stamina/StaminaBar.java b/src/main/java/minefantasy/mf2/api/stamina/StaminaBar.java index d7b53864..f021ee89 100644 --- a/src/main/java/minefantasy/mf2/api/stamina/StaminaBar.java +++ b/src/main/java/minefantasy/mf2/api/stamina/StaminaBar.java @@ -13,576 +13,564 @@ import net.minecraft.world.World; public class StaminaBar { - /** - * This is the main variable for the entire stamina feature - */ - public static boolean isSystemActive = true; - - public static float defaultMax = 100F; - - public static final String staminaRegenName = "MineFantasy_staminaRegen"; - public static final String staminaRegenTicksName = "MineFantasy_staminaRegenTicks"; - - public static final String staminaBonusName = "MineFantasy_staminaMaxAddon"; - public static final String staminaBonusTicksName = "MineFantasy_staminaMaxAddonTicks"; - public static final String staminaMaxName = "MineFantasy_staminaMax"; - public static final String staminaValueName = "MineFantasy_staminaValue"; - public static final String staminaIdleName = "MineFantasy_staminaIdle"; - public static final String staminaFlashName = "MineFantasy_staminaFlashing"; - - /** - * Modifies the decay speed for armour, this scales to what a full suit of plate - * does - */ - private static final float armourWeightModifier = 1.0F; - private static final float armourWeightModifierClimbing = 5.0F; - /** - * Modifies the regen rate slowdown for armour - */ - private static float bulkModifier = 1.0F; - public static float regenModifier = 1.5F; - - // CONFIG VARS - /** - * The decay modifier before being scaled by difficulty - */ - public static float decayModifierCfg = 1.0F; - public static float decayModifierBase = 0.5F; - public static float configRegenModifier = 1.0F; - public static float pauseModifier = 1.0F; - public static float configArmourWeightModifier = 1.0F; - public static float configBulk = 1.0F; - public static boolean scaleDifficulty = true; - - public static boolean levelUp = false; - - public static float levelAmount = 5F; - - // MAX STAMINA// - public static float getTotalMaxStamina(EntityLivingBase user) { - return getBaseMaxStamina(user) + getBonusStamina(user); - } - - public static float getBaseMaxStamina(EntityLivingBase user) { - float bonus = getStaminaLevelBoost(user); - if (user.getEntityData() != null) { - if (!user.getEntityData().hasKey(staminaMaxName)) { - setMaxStamina(user, getDefaultMax(user) + bonus); - } - return user.getEntityData().getFloat(staminaMaxName) + bonus; - } - return getDefaultMax(user) + bonus; - } - - public static float getDefaultMax(EntityLivingBase user) { - return defaultMax; - } - - public static void setMaxStamina(EntityLivingBase user, float value) { - if (user.getEntityData() != null) { - user.getEntityData().setFloat(staminaMaxName, value); - } - } - - public static void modifyMaxStamina(EntityLivingBase user, float mod) { - setMaxStamina(user, getBaseMaxStamina(user) + mod); - - if (getStaminaValue(user) < 0) { - setStaminaValue(user, 0); - } - } - - // REGEN BUFF STAMINA// - public static float getBonusStaminaRegen(EntityLivingBase user) { - float level = 0F; - if (user.getEntityData() != null) { - if (!user.getEntityData().hasKey(staminaRegenName)) { - setBonusStaminaRegen(user, 0F); - } - level += user.getEntityData().getFloat(staminaRegenName); - } - if (user.getActivePotionEffect(Potion.regeneration) != null) { - level += (user.getActivePotionEffect(Potion.regeneration).getAmplifier() + 1) * 2.5F; - } - return level; - } - - public static void setBonusStaminaRegen(EntityLivingBase user, float value) { - if (user.getEntityData() != null) { - user.getEntityData().setFloat(staminaRegenName, value); - } - } - - public static int getBonusStaminaRegenTicks(EntityLivingBase user) { - if (user.getEntityData() != null) { - if (!user.getEntityData().hasKey(staminaRegenTicksName)) { - setBonusStaminaRegenTicks(user, 0); - } - return user.getEntityData().getInteger(staminaRegenTicksName); - } - return 0; - } - - public static void setBonusStaminaRegenTicks(EntityLivingBase user, int value) { - if (user.getEntityData() != null) { - user.getEntityData().setInteger(staminaRegenTicksName, value); - } - } - - public static float getRegenBonus(EntityLivingBase user) { - return getBonusStaminaRegen(user) / 20F; - } - - // TEMP STAMINA// - public static float getBonusStamina(EntityLivingBase user) { - if (user.getEntityData() != null) { - if (!user.getEntityData().hasKey(staminaBonusName)) { - setBonusStamina(user, 0F); - } - return user.getEntityData().getFloat(staminaBonusName); - } - return 0F; - } - - private static float getStaminaLevelBoost(EntityLivingBase user) { - if (user.worldObj.isRemote) - return 0; - - float amount = 0F; - if (user instanceof EntityPlayer && levelUp && levelAmount > 0) { - EntityPlayer player = (EntityPlayer) user; - if (player.experienceLevel > 0) { - amount += (player.experienceLevel * levelAmount); - } - } - return amount; - } - - public static void setBonusStamina(EntityLivingBase user, float value) { - if (user.getEntityData() != null) { - user.getEntityData().setFloat(staminaBonusName, value); - } - } - - public static int getBonusStaminaTicks(EntityLivingBase user) { - if (user.getEntityData() != null) { - if (!user.getEntityData().hasKey(staminaBonusTicksName)) { - setBonusStaminaTicks(user, 0); - } - return user.getEntityData().getInteger(staminaBonusTicksName); - } - return 0; - } - - public static void setBonusStaminaTicks(EntityLivingBase user, int value) { - if (user.getEntityData() != null) { - user.getEntityData().setInteger(staminaBonusTicksName, value); - } - } - - public static void tickBonus(EntityLivingBase user) { - if (user.worldObj.isRemote) - return; - - int currentTicks = getBonusStaminaTicks(user); - currentTicks--; - if (currentTicks <= 0) { - setBonusStaminaTicks(user, 0); - setBonusStamina(user, 0); - - if (getStaminaValue(user) > getTotalMaxStamina(user)) { - setStaminaValue(user, getTotalMaxStamina(user)); - } - return; - } - setBonusStaminaTicks(user, currentTicks); - } - - public static void tickBonusRegen(EntityLivingBase user) { - if (user.worldObj.isRemote) - return; - - int currentTicks = getBonusStaminaRegenTicks(user); - currentTicks--; - if (currentTicks <= 0) { - setBonusStaminaRegenTicks(user, 0); - setBonusStaminaRegen(user, 0); - return; - } - setBonusStaminaRegenTicks(user, currentTicks); - } - - /** - * Call this to buff stamina temporarily, it will not override more potent - * effects - * - * @param user - * the entity to buff - * @param mod - * the amount of stamina added - * @param seconds - * the time it takes to wear off - * @return true if either time or modification is applied. - */ - public static boolean buffStamina(EntityLivingBase user, float mod, int seconds) { - if (!isSystemActive) { - return false; - } - boolean success = false; - int ticks = seconds * 20; - - float current = getBonusStamina(user); - int currentTicks = getBonusStaminaTicks(user); - if (mod >= current) { - success = true; - setBonusStaminaTicks(user, ticks); - setBonusStamina(user, mod); - } - return false; - } - - public static boolean buffStaminaRegen(EntityLivingBase user, float mod, int seconds) { - if (!isSystemActive) { - return false; - } - boolean success = false; - int ticks = seconds * 20; - - float current = getBonusStaminaRegen(user); - int currentTicks = getBonusStaminaRegenTicks(user); - if (mod >= current && ticks >= currentTicks) { - success = true; - setBonusStaminaRegenTicks(user, ticks); - setBonusStaminaRegen(user, mod); - } - return false; - } - - /** - * This increases the users max stamina - * - * @param user - * the user - * @param value - * the amount to add to max stamina - * @param maxBonus - * the maximum this can achieve (not counting base stamina), <0 means - * no limit - */ - public static boolean incrStaminaMax(EntityLivingBase user, float value, float maxBonus) { - float current = getBaseMaxStamina(user); - if (maxBonus > 0 && current >= maxBonus) { - return false; - } - setMaxStamina(user, Math.min(maxBonus, current + value)); - MineFantasyAPI.debugMsg("Increased Max Stamina by " + value); - return true; - } - - // STAMINA VALUE// - public static float getStaminaValue(EntityLivingBase user) { - if (user.getEntityData() != null) { - if (!user.getEntityData().hasKey(staminaValueName)) { - setStaminaValue(user, getDefaultMax(user)); - } - return user.getEntityData().getFloat(staminaValueName); - } - return getDefaultMax(user); - } - - public static void setStaminaValue(EntityLivingBase user, float value) { - if (user.getEntityData() != null) { - user.getEntityData().setFloat(staminaValueName, value); - } - } - - public static void modifyStaminaValue(EntityLivingBase user, float mod) { - if (mod < 0 && PowerArmour.isPowered(user)) { - return; - } - setStaminaValue(user, getStaminaValue(user) + mod); - - if (mod < 0 && getStaminaValue(user) < 0) { - setStaminaValue(user, 0); - } - float max = getTotalMaxStamina(user); - if (getStaminaValue(user) > max) { - setStaminaValue(user, max); - } - } - - // DECIMAL PERCENT VALUE// - public static float getStaminaDecimal(EntityLivingBase user) { - return getStaminaValue(user) / getTotalMaxStamina(user); - } - - // INIT// - public static void refreshSystem(EntityLivingBase user) { - if (user.getEntityData() != null) { - NBTTagCompound nbt = user.getEntityData(); - - if (!nbt.hasKey(staminaMaxName)) { - nbt.setFloat(staminaMaxName, getDefaultMax(user)); - } - if (!nbt.hasKey(staminaValueName)) { - nbt.setFloat(staminaValueName, getDefaultMax(user)); - } - if (!nbt.hasKey(staminaFlashName)) { - nbt.setFloat(staminaFlashName, 0); - } - } - } - - // STAMINA IDLE// - public static float getIdleTime(EntityLivingBase user) { - if (user.getEntityData() != null) { - if (!user.getEntityData().hasKey(staminaIdleName)) { - setIdleTime(user, 0); - } - return user.getEntityData().getFloat(staminaIdleName); - } - return 0; - } - - public static void setIdleTime(EntityLivingBase user, float value) { - if (user.getEntityData() != null) { - user.getEntityData().setFloat(staminaIdleName, value); - } - } - - public static void ModifyIdleTime(EntityLivingBase user, float mod) { - setIdleTime(user, getIdleTime(user) + mod); - } - - // STAMINA FLASH// - public static float getFlashTime(EntityLivingBase user) { - if (user.getEntityData() != null) { - if (!user.getEntityData().hasKey(staminaFlashName)) { - setFlashTime(user, 0); - } - return user.getEntityData().getFloat(staminaFlashName); - } - return 0; - } - - public static void setFlashTime(EntityLivingBase user, float value) { - if (!(user instanceof EntityPlayer)) { - return; - } - if (user.getEntityData() != null) { - user.getEntityData().setFloat(staminaFlashName, value); - } - } - - public static void ModifyFlashTime(EntityLivingBase user, float mod) { - setFlashTime(user, getFlashTime(user) + mod); - } - - /** - * determines if the stamina can take a specific value - */ - /** - * Checks if stamina is available - * - * @param onUse - * whether or not stamina is trying to be used - * @return - */ - public static boolean isStaminaAvailable(EntityLivingBase user, float level, boolean onUse) { - if (getStaminaValue(user) >= level) { - return true; - } - if (onUse) { - setFlashTime(user, 40); - } - return false; - } - - public static boolean isAnyStamina(EntityLivingBase user, boolean flash) { - return isStaminaAvailable(user, 1, flash); - } - - public static boolean isPercentStamAvailable(EntityLivingBase user, float decimal, boolean flash) { - if (PowerArmour.isPowered(user)) { - return true;// Cogwork infinite power - } - - return isStaminaAvailable(user, getTotalMaxStamina(user) * decimal, flash); - } - - public static float getBaseDecayModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) { - if (PowerArmour.isPowered(user)) { - return 0F; - } - float value = getDecayModifier(user.worldObj); - float AM = 1.0F; - if (user instanceof EntityPlayer) { - value *= getBasePerkStaminaModifier(value, (EntityPlayer) user); - AM = getPerkArmModifier(value, (EntityPlayer) user); - } - if (TacticalManager.isImmuneToWeight(user)) { - return value * 0.5F; - } - - if (countHeld) { - if (user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) { - value *= (((IHeldStaminaItem) user.getHeldItem().getItem()).getDecayMod(user, user.getHeldItem())); - } - } - if (countArmour) { - float armourMod = 1.0F; - for (int slot = 1; slot <= 4; slot++) { - ItemStack armour = user.getEquipmentInSlot(slot); - if (armour != null && armour.getItem() instanceof IWornStaminaItem) { - armourMod += (((IWornStaminaItem) armour.getItem()).getDecayModifier(user, armour)); - } - } - float min = ArmourCalculator.encumberanceArray[0]; - float max = ArmourCalculator.encumberanceArray[1]; - float mass = ArmourCalculator.getTotalWeightOfWorn(user, false) - min; - - if (mass > 0F) { - float modifiers = AM * configArmourWeightModifier * armourWeightModifier; - armourMod += ((mass + min) / max); - } - value *= armourMod; - } - return value; - } - - public static float getClimbinbDecayModifier(EntityLivingBase user, boolean countArmour) { - float value = getDecayModifier(user.worldObj); - - if (!TacticalManager.isImmuneToWeight(user) && countArmour) { - float armourMod = 1.0F; - for (int slot = 1; slot <= 4; slot++) { - ItemStack armour = user.getEquipmentInSlot(slot); - if (armour != null && armour.getItem() instanceof IWornStaminaItem) { - armourMod += ((IWornStaminaItem) armour.getItem()).getDecayModifier(user, armour); - } - } - float min = ArmourCalculator.encumberanceArray[0]; - float max = ArmourCalculator.encumberanceArray[1]; - float mass = ArmourCalculator.getTotalWeightOfWorn(user, false) - min; - if (mass > 0) { - value *= (1 + ((min + mass) / max * configArmourWeightModifier * (armourWeightModifierClimbing - 1))); - } - value *= armourMod; - } - return value; - } - - public static float getBaseRegenModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) { - float value = configRegenModifier * regenModifier * (5F / 3F); - - if (!TacticalManager.isImmuneToWeight(user)) { - if (countHeld) { - if (user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) { - value *= ((IHeldStaminaItem) user.getHeldItem().getItem()).getRegenModifier(user, - user.getHeldItem()); - } - } - if (countArmour) { - float AM = 1.0F; - if (user instanceof EntityPlayer) { - AM = getPerkArmModifier(value, (EntityPlayer) user); - } - - float armourMod = 1.0F; - for (int slot = 1; slot <= 4; slot++) { - ItemStack armour = user.getEquipmentInSlot(slot); - if (armour != null && armour.getItem() instanceof IWornStaminaItem) { - armourMod += ((IWornStaminaItem) armour.getItem()).getRegenModifier(user, armour); - } - } - float weightMod = ArmourCalculator.getTotalWeightOfWorn(user, false) * bulkModifier * configBulk; - if (weightMod > 0) { - float min = ArmourCalculator.encumberanceArray[0]; - float max = ArmourCalculator.encumberanceArray[1]; - value /= (1.0F + ((min + weightMod) / (max / 2) * AM * 0.5F)); - } - value *= armourMod; - } - } - if (user.isSneaking()) { - value *= 1.5F; - } - - return value; - } - - public static float getBaseIdleModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) { - float value = pauseModifier; - - if (!TacticalManager.isImmuneToWeight(user)) { - if (countHeld) { - if (user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) { - value *= ((IHeldStaminaItem) user.getHeldItem().getItem()).getIdleModifier(user, - user.getHeldItem()); - } - } - if (countArmour) { - float armourMod = 1.0F; - for (int slot = 1; slot <= 4; slot++) { - ItemStack armour = user.getEquipmentInSlot(slot); - if (armour != null && armour.getItem() instanceof IWornStaminaItem) { - armourMod += ((IWornStaminaItem) armour.getItem()).getIdleModifier(user, armour); - } - } - } - } - - return value; - } - - /** - * This scales the decay modifier across all fields on difficulty It's base - * level is on normal with easy,peaceful being 25% - 50% slower. Hard is 25% - * faster - */ - public static float getDecayModifier(World world) { - if (!scaleDifficulty) { - return decayModifierCfg * decayModifierBase; - } - int difficultyMod = world.difficultySetting.getDifficultyId() - 2; - return (decayModifierCfg * decayModifierBase) + (0.25F * difficultyMod); - } - - private static final String noStaminaNBT = "MF_NoStamina"; - - public static boolean restrictSystem = true; - - /** - * This toggles the stamina use for entities - */ - public static void setStaminaFlag(EntityLivingBase entity, boolean flag) { - entity.getEntityData().setBoolean(noStaminaNBT, flag); - } - - public static boolean doesAffectEntity(EntityLivingBase entity) { - if (entity.getEntityData().hasKey(noStaminaNBT)) { - return entity.getEntityData().getBoolean(noStaminaNBT); - } - if (entity instanceof EntityPlayer) { - EntityPlayer p = (EntityPlayer) entity; - return !p.capabilities.isCreativeMode; - } else if (restrictSystem) { - return false; - } - return MineFantasyAPI.isInDebugMode || !entity.isEntityUndead(); - } - - private static float getPerkArmModifier(float value, EntityPlayer user) { - if (ResearchLogic.hasInfoUnlocked(user, "armourpro")) { - value *= 0.5F; - } - return value; - } - - private static float getBasePerkStaminaModifier(float value, EntityPlayer user) { - if (ResearchLogic.hasInfoUnlocked(user, "fitness")) { - value *= 0.75F; - } - return value; - } + public static final String staminaRegenName = "MineFantasy_staminaRegen"; + public static final String staminaRegenTicksName = "MineFantasy_staminaRegenTicks"; + public static final String staminaBonusName = "MineFantasy_staminaMaxAddon"; + public static final String staminaBonusTicksName = "MineFantasy_staminaMaxAddonTicks"; + public static final String staminaMaxName = "MineFantasy_staminaMax"; + public static final String staminaValueName = "MineFantasy_staminaValue"; + public static final String staminaIdleName = "MineFantasy_staminaIdle"; + public static final String staminaFlashName = "MineFantasy_staminaFlashing"; + /** + * Modifies the decay speed for armour, this scales to what a full suit of plate + * does + */ + private static final float armourWeightModifier = 1.0F; + private static final float armourWeightModifierClimbing = 5.0F; + private static final String noStaminaNBT = "MF_NoStamina"; + /** + * This is the main variable for the entire stamina feature + */ + public static boolean isSystemActive = true; + public static float defaultMax = 100F; + public static float regenModifier = 1.5F; + + // CONFIG VARS + /** + * The decay modifier before being scaled by difficulty + */ + public static float decayModifierCfg = 1.0F; + public static float decayModifierBase = 0.5F; + public static float configRegenModifier = 1.0F; + public static float pauseModifier = 1.0F; + public static float configArmourWeightModifier = 1.0F; + public static float configBulk = 1.0F; + public static boolean scaleDifficulty = true; + + public static boolean levelUp = false; + + public static float levelAmount = 5F; + public static boolean restrictSystem = true; + /** + * Modifies the regen rate slowdown for armour + */ + private static float bulkModifier = 1.0F; + + // MAX STAMINA// + public static float getTotalMaxStamina(EntityLivingBase user) { + return getBaseMaxStamina(user) + getBonusStamina(user); + } + + public static float getBaseMaxStamina(EntityLivingBase user) { + float bonus = getStaminaLevelBoost(user); + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaMaxName)) { + setMaxStamina(user, getDefaultMax(user) + bonus); + } + return user.getEntityData().getFloat(staminaMaxName) + bonus; + } + return getDefaultMax(user) + bonus; + } + + public static float getDefaultMax(EntityLivingBase user) { + return defaultMax; + } + + public static void setMaxStamina(EntityLivingBase user, float value) { + if (user.getEntityData() != null) { + user.getEntityData().setFloat(staminaMaxName, value); + } + } + + public static void modifyMaxStamina(EntityLivingBase user, float mod) { + setMaxStamina(user, getBaseMaxStamina(user) + mod); + + if (getStaminaValue(user) < 0) { + setStaminaValue(user, 0); + } + } + + // REGEN BUFF STAMINA// + public static float getBonusStaminaRegen(EntityLivingBase user) { + float level = 0F; + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaRegenName)) { + setBonusStaminaRegen(user, 0F); + } + level += user.getEntityData().getFloat(staminaRegenName); + } + if (user.getActivePotionEffect(Potion.regeneration) != null) { + level += (user.getActivePotionEffect(Potion.regeneration).getAmplifier() + 1) * 2.5F; + } + return level; + } + + public static void setBonusStaminaRegen(EntityLivingBase user, float value) { + if (user.getEntityData() != null) { + user.getEntityData().setFloat(staminaRegenName, value); + } + } + + public static int getBonusStaminaRegenTicks(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaRegenTicksName)) { + setBonusStaminaRegenTicks(user, 0); + } + return user.getEntityData().getInteger(staminaRegenTicksName); + } + return 0; + } + + public static void setBonusStaminaRegenTicks(EntityLivingBase user, int value) { + if (user.getEntityData() != null) { + user.getEntityData().setInteger(staminaRegenTicksName, value); + } + } + + public static float getRegenBonus(EntityLivingBase user) { + return getBonusStaminaRegen(user) / 20F; + } + + // TEMP STAMINA// + public static float getBonusStamina(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaBonusName)) { + setBonusStamina(user, 0F); + } + return user.getEntityData().getFloat(staminaBonusName); + } + return 0F; + } + + private static float getStaminaLevelBoost(EntityLivingBase user) { + if (user.worldObj.isRemote) + return 0; + + float amount = 0F; + if (user instanceof EntityPlayer && levelUp && levelAmount > 0) { + EntityPlayer player = (EntityPlayer) user; + if (player.experienceLevel > 0) { + amount += (player.experienceLevel * levelAmount); + } + } + return amount; + } + + public static void setBonusStamina(EntityLivingBase user, float value) { + if (user.getEntityData() != null) { + user.getEntityData().setFloat(staminaBonusName, value); + } + } + + public static int getBonusStaminaTicks(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaBonusTicksName)) { + setBonusStaminaTicks(user, 0); + } + return user.getEntityData().getInteger(staminaBonusTicksName); + } + return 0; + } + + public static void setBonusStaminaTicks(EntityLivingBase user, int value) { + if (user.getEntityData() != null) { + user.getEntityData().setInteger(staminaBonusTicksName, value); + } + } + + public static void tickBonus(EntityLivingBase user) { + if (user.worldObj.isRemote) + return; + + int currentTicks = getBonusStaminaTicks(user); + currentTicks--; + if (currentTicks <= 0) { + setBonusStaminaTicks(user, 0); + setBonusStamina(user, 0); + + if (getStaminaValue(user) > getTotalMaxStamina(user)) { + setStaminaValue(user, getTotalMaxStamina(user)); + } + return; + } + setBonusStaminaTicks(user, currentTicks); + } + + public static void tickBonusRegen(EntityLivingBase user) { + if (user.worldObj.isRemote) + return; + + int currentTicks = getBonusStaminaRegenTicks(user); + currentTicks--; + if (currentTicks <= 0) { + setBonusStaminaRegenTicks(user, 0); + setBonusStaminaRegen(user, 0); + return; + } + setBonusStaminaRegenTicks(user, currentTicks); + } + + /** + * Call this to buff stamina temporarily, it will not override more potent + * effects + * + * @param user the entity to buff + * @param mod the amount of stamina added + * @param seconds the time it takes to wear off + * @return true if either time or modification is applied. + */ + public static boolean buffStamina(EntityLivingBase user, float mod, int seconds) { + if (!isSystemActive) { + return false; + } + boolean success = false; + int ticks = seconds * 20; + + float current = getBonusStamina(user); + int currentTicks = getBonusStaminaTicks(user); + if (mod >= current) { + success = true; + setBonusStaminaTicks(user, ticks); + setBonusStamina(user, mod); + } + return false; + } + + public static boolean buffStaminaRegen(EntityLivingBase user, float mod, int seconds) { + if (!isSystemActive) { + return false; + } + boolean success = false; + int ticks = seconds * 20; + + float current = getBonusStaminaRegen(user); + int currentTicks = getBonusStaminaRegenTicks(user); + if (mod >= current && ticks >= currentTicks) { + success = true; + setBonusStaminaRegenTicks(user, ticks); + setBonusStaminaRegen(user, mod); + } + return false; + } + + /** + * This increases the users max stamina + * + * @param user the user + * @param value the amount to add to max stamina + * @param maxBonus the maximum this can achieve (not counting base stamina), <0 means + * no limit + */ + public static boolean incrStaminaMax(EntityLivingBase user, float value, float maxBonus) { + float current = getBaseMaxStamina(user); + if (maxBonus > 0 && current >= maxBonus) { + return false; + } + setMaxStamina(user, Math.min(maxBonus, current + value)); + MineFantasyAPI.debugMsg("Increased Max Stamina by " + value); + return true; + } + + // STAMINA VALUE// + public static float getStaminaValue(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaValueName)) { + setStaminaValue(user, getDefaultMax(user)); + } + return user.getEntityData().getFloat(staminaValueName); + } + return getDefaultMax(user); + } + + public static void setStaminaValue(EntityLivingBase user, float value) { + if (user.getEntityData() != null) { + user.getEntityData().setFloat(staminaValueName, value); + } + } + + public static void modifyStaminaValue(EntityLivingBase user, float mod) { + if (mod < 0 && PowerArmour.isPowered(user)) { + return; + } + setStaminaValue(user, getStaminaValue(user) + mod); + + if (mod < 0 && getStaminaValue(user) < 0) { + setStaminaValue(user, 0); + } + float max = getTotalMaxStamina(user); + if (getStaminaValue(user) > max) { + setStaminaValue(user, max); + } + } + + // DECIMAL PERCENT VALUE// + public static float getStaminaDecimal(EntityLivingBase user) { + return getStaminaValue(user) / getTotalMaxStamina(user); + } + + // INIT// + public static void refreshSystem(EntityLivingBase user) { + if (user.getEntityData() != null) { + NBTTagCompound nbt = user.getEntityData(); + + if (!nbt.hasKey(staminaMaxName)) { + nbt.setFloat(staminaMaxName, getDefaultMax(user)); + } + if (!nbt.hasKey(staminaValueName)) { + nbt.setFloat(staminaValueName, getDefaultMax(user)); + } + if (!nbt.hasKey(staminaFlashName)) { + nbt.setFloat(staminaFlashName, 0); + } + } + } + + // STAMINA IDLE// + public static float getIdleTime(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaIdleName)) { + setIdleTime(user, 0); + } + return user.getEntityData().getFloat(staminaIdleName); + } + return 0; + } + + public static void setIdleTime(EntityLivingBase user, float value) { + if (user.getEntityData() != null) { + user.getEntityData().setFloat(staminaIdleName, value); + } + } + + public static void ModifyIdleTime(EntityLivingBase user, float mod) { + setIdleTime(user, getIdleTime(user) + mod); + } + + // STAMINA FLASH// + public static float getFlashTime(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (!user.getEntityData().hasKey(staminaFlashName)) { + setFlashTime(user, 0); + } + return user.getEntityData().getFloat(staminaFlashName); + } + return 0; + } + + /** + * determines if the stamina can take a specific value + */ + + public static void setFlashTime(EntityLivingBase user, float value) { + if (!(user instanceof EntityPlayer)) { + return; + } + if (user.getEntityData() != null) { + user.getEntityData().setFloat(staminaFlashName, value); + } + } + + public static void ModifyFlashTime(EntityLivingBase user, float mod) { + setFlashTime(user, getFlashTime(user) + mod); + } + + /** + * Checks if stamina is available + * + * @param onUse whether or not stamina is trying to be used + * @return + */ + public static boolean isStaminaAvailable(EntityLivingBase user, float level, boolean onUse) { + if (getStaminaValue(user) >= level) { + return true; + } + if (onUse) { + setFlashTime(user, 40); + } + return false; + } + + public static boolean isAnyStamina(EntityLivingBase user, boolean flash) { + return isStaminaAvailable(user, 1, flash); + } + + public static boolean isPercentStamAvailable(EntityLivingBase user, float decimal, boolean flash) { + if (PowerArmour.isPowered(user)) { + return true;// Cogwork infinite power + } + + return isStaminaAvailable(user, getTotalMaxStamina(user) * decimal, flash); + } + + public static float getBaseDecayModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) { + if (PowerArmour.isPowered(user)) { + return 0F; + } + float value = getDecayModifier(user.worldObj); + float AM = 1.0F; + if (user instanceof EntityPlayer) { + value *= getBasePerkStaminaModifier(value, (EntityPlayer) user); + AM = getPerkArmModifier(value, (EntityPlayer) user); + } + if (TacticalManager.isImmuneToWeight(user)) { + return value * 0.5F; + } + + if (countHeld) { + if (user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) { + value *= (((IHeldStaminaItem) user.getHeldItem().getItem()).getDecayMod(user, user.getHeldItem())); + } + } + if (countArmour) { + float armourMod = 1.0F; + for (int slot = 1; slot <= 4; slot++) { + ItemStack armour = user.getEquipmentInSlot(slot); + if (armour != null && armour.getItem() instanceof IWornStaminaItem) { + armourMod += (((IWornStaminaItem) armour.getItem()).getDecayModifier(user, armour)); + } + } + float min = ArmourCalculator.encumberanceArray[0]; + float max = ArmourCalculator.encumberanceArray[1]; + float mass = ArmourCalculator.getTotalWeightOfWorn(user, false) - min; + + if (mass > 0F) { + float modifiers = AM * configArmourWeightModifier * armourWeightModifier; + armourMod += ((mass + min) / max); + } + value *= armourMod; + } + return value; + } + + public static float getClimbinbDecayModifier(EntityLivingBase user, boolean countArmour) { + float value = getDecayModifier(user.worldObj); + + if (!TacticalManager.isImmuneToWeight(user) && countArmour) { + float armourMod = 1.0F; + for (int slot = 1; slot <= 4; slot++) { + ItemStack armour = user.getEquipmentInSlot(slot); + if (armour != null && armour.getItem() instanceof IWornStaminaItem) { + armourMod += ((IWornStaminaItem) armour.getItem()).getDecayModifier(user, armour); + } + } + float min = ArmourCalculator.encumberanceArray[0]; + float max = ArmourCalculator.encumberanceArray[1]; + float mass = ArmourCalculator.getTotalWeightOfWorn(user, false) - min; + if (mass > 0) { + value *= (1 + ((min + mass) / max * configArmourWeightModifier * (armourWeightModifierClimbing - 1))); + } + value *= armourMod; + } + return value; + } + + public static float getBaseRegenModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) { + float value = configRegenModifier * regenModifier * (5F / 3F); + + if (!TacticalManager.isImmuneToWeight(user)) { + if (countHeld) { + if (user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) { + value *= ((IHeldStaminaItem) user.getHeldItem().getItem()).getRegenModifier(user, + user.getHeldItem()); + } + } + if (countArmour) { + float AM = 1.0F; + if (user instanceof EntityPlayer) { + AM = getPerkArmModifier(value, (EntityPlayer) user); + } + + float armourMod = 1.0F; + for (int slot = 1; slot <= 4; slot++) { + ItemStack armour = user.getEquipmentInSlot(slot); + if (armour != null && armour.getItem() instanceof IWornStaminaItem) { + armourMod += ((IWornStaminaItem) armour.getItem()).getRegenModifier(user, armour); + } + } + float weightMod = ArmourCalculator.getTotalWeightOfWorn(user, false) * bulkModifier * configBulk; + if (weightMod > 0) { + float min = ArmourCalculator.encumberanceArray[0]; + float max = ArmourCalculator.encumberanceArray[1]; + value /= (1.0F + ((min + weightMod) / (max / 2) * AM * 0.5F)); + } + value *= armourMod; + } + } + if (user.isSneaking()) { + value *= 1.5F; + } + + return value; + } + + public static float getBaseIdleModifier(EntityLivingBase user, boolean countArmour, boolean countHeld) { + float value = pauseModifier; + + if (!TacticalManager.isImmuneToWeight(user)) { + if (countHeld) { + if (user.getHeldItem() != null && user.getHeldItem().getItem() instanceof IHeldStaminaItem) { + value *= ((IHeldStaminaItem) user.getHeldItem().getItem()).getIdleModifier(user, + user.getHeldItem()); + } + } + if (countArmour) { + float armourMod = 1.0F; + for (int slot = 1; slot <= 4; slot++) { + ItemStack armour = user.getEquipmentInSlot(slot); + if (armour != null && armour.getItem() instanceof IWornStaminaItem) { + armourMod += ((IWornStaminaItem) armour.getItem()).getIdleModifier(user, armour); + } + } + } + } + + return value; + } + + /** + * This scales the decay modifier across all fields on difficulty It's base + * level is on normal with easy,peaceful being 25% - 50% slower. Hard is 25% + * faster + */ + public static float getDecayModifier(World world) { + if (!scaleDifficulty) { + return decayModifierCfg * decayModifierBase; + } + int difficultyMod = world.difficultySetting.getDifficultyId() - 2; + return (decayModifierCfg * decayModifierBase) + (0.25F * difficultyMod); + } + + /** + * This toggles the stamina use for entities + */ + public static void setStaminaFlag(EntityLivingBase entity, boolean flag) { + entity.getEntityData().setBoolean(noStaminaNBT, flag); + } + + public static boolean doesAffectEntity(EntityLivingBase entity) { + if (entity.getEntityData().hasKey(noStaminaNBT)) { + return entity.getEntityData().getBoolean(noStaminaNBT); + } + if (entity instanceof EntityPlayer) { + EntityPlayer p = (EntityPlayer) entity; + return !p.capabilities.isCreativeMode; + } else if (restrictSystem) { + return false; + } + return MineFantasyAPI.isInDebugMode || !entity.isEntityUndead(); + } + + private static float getPerkArmModifier(float value, EntityPlayer user) { + if (ResearchLogic.hasInfoUnlocked(user, "armourpro")) { + value *= 0.5F; + } + return value; + } + + private static float getBasePerkStaminaModifier(float value, EntityPlayer user) { + if (ResearchLogic.hasInfoUnlocked(user, "fitness")) { + value *= 0.75F; + } + return value; + } } diff --git a/src/main/java/minefantasy/mf2/api/tier/IToolMaterial.java b/src/main/java/minefantasy/mf2/api/tier/IToolMaterial.java index f7a1f77c..38656c2f 100644 --- a/src/main/java/minefantasy/mf2/api/tier/IToolMaterial.java +++ b/src/main/java/minefantasy/mf2/api/tier/IToolMaterial.java @@ -3,8 +3,8 @@ import net.minecraft.item.Item.ToolMaterial; public interface IToolMaterial { - /** - * Gets the material for outside reference - */ - public ToolMaterial getMaterial(); + /** + * Gets the material for outside reference + */ + public ToolMaterial getMaterial(); } diff --git a/src/main/java/minefantasy/mf2/api/tool/IHuntingItem.java b/src/main/java/minefantasy/mf2/api/tool/IHuntingItem.java index 113f9d43..9879dd7d 100644 --- a/src/main/java/minefantasy/mf2/api/tool/IHuntingItem.java +++ b/src/main/java/minefantasy/mf2/api/tool/IHuntingItem.java @@ -3,8 +3,8 @@ import net.minecraft.item.ItemStack; public interface IHuntingItem { - /** - * Determines if item can retrive drops from animals - */ - boolean canRetrieveDrops(ItemStack item); + /** + * Determines if item can retrive drops from animals + */ + boolean canRetrieveDrops(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/tool/ILighter.java b/src/main/java/minefantasy/mf2/api/tool/ILighter.java index c8b2873f..20a80bd2 100644 --- a/src/main/java/minefantasy/mf2/api/tool/ILighter.java +++ b/src/main/java/minefantasy/mf2/api/tool/ILighter.java @@ -2,8 +2,8 @@ public interface ILighter { - boolean canLight(); + boolean canLight(); - double getChance(); + double getChance(); } diff --git a/src/main/java/minefantasy/mf2/api/tool/IToolMF.java b/src/main/java/minefantasy/mf2/api/tool/IToolMF.java index 35c9e0cd..d671e6b4 100644 --- a/src/main/java/minefantasy/mf2/api/tool/IToolMF.java +++ b/src/main/java/minefantasy/mf2/api/tool/IToolMF.java @@ -3,19 +3,19 @@ import net.minecraft.item.ItemStack; public interface IToolMF { - /** - * Gets the efficienty of this tool for processing (recommended to use - * ToolMaterial.getEfficiencyOnProperMaterial()) - */ - public float getEfficiency(ItemStack item); + /** + * Gets the efficienty of this tool for processing (recommended to use + * ToolMaterial.getEfficiencyOnProperMaterial()) + */ + public float getEfficiency(ItemStack item); - /** - * Gets the tier of the material, some recipes may need certain tiers - */ - public int getTier(ItemStack item); + /** + * Gets the tier of the material, some recipes may need certain tiers + */ + public int getTier(ItemStack item); - /** - * Gets the type of tool for crafting (eg, hammer, knife, needle) - */ - public String getToolType(ItemStack item); + /** + * Gets the type of tool for crafting (eg, hammer, knife, needle) + */ + public String getToolType(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/DamageSourceAP.java b/src/main/java/minefantasy/mf2/api/weapon/DamageSourceAP.java index 20e6573c..39a3902b 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/DamageSourceAP.java +++ b/src/main/java/minefantasy/mf2/api/weapon/DamageSourceAP.java @@ -3,12 +3,12 @@ import net.minecraft.util.DamageSource; public class DamageSourceAP extends DamageSource { - public static DamageSource blunt = new DamageSourceAP(); + public static DamageSource blunt = new DamageSourceAP(); - public DamageSourceAP() { - super("battlegearExtra"); - this.setDamageBypassesArmor(); - this.setDamageIsAbsolute(); - } + public DamageSourceAP() { + super("battlegearExtra"); + this.setDamageBypassesArmor(); + this.setDamageIsAbsolute(); + } } diff --git a/src/main/java/minefantasy/mf2/api/weapon/ICustomHitSound.java b/src/main/java/minefantasy/mf2/api/weapon/ICustomHitSound.java index 2e4036ea..4cad3e9d 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/ICustomHitSound.java +++ b/src/main/java/minefantasy/mf2/api/weapon/ICustomHitSound.java @@ -5,10 +5,10 @@ import net.minecraft.item.ItemStack; public interface ICustomHitSound { - /** - * Plays the hit sound - * - * @return true if it makes it's own sound - */ - public boolean playHitSound(ItemStack item, EntityLivingBase attacker, Entity target); + /** + * Plays the hit sound + * + * @return true if it makes it's own sound + */ + public boolean playHitSound(ItemStack item, EntityLivingBase attacker, Entity target); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IDamageModifier.java b/src/main/java/minefantasy/mf2/api/weapon/IDamageModifier.java index ac61e136..b3e74297 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IDamageModifier.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IDamageModifier.java @@ -5,6 +5,6 @@ import net.minecraft.item.ItemStack; public interface IDamageModifier { - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, - boolean properHit); + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IDamageType.java b/src/main/java/minefantasy/mf2/api/weapon/IDamageType.java index 763abc34..e17e29d0 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IDamageType.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IDamageType.java @@ -1,25 +1,23 @@ package minefantasy.mf2.api.weapon; public interface IDamageType { - /** - * Gets the cutting:blunt ratio. use any 3 numbers, the relevant values is what - * matters - * - * @param implement - * the object causing the damage, this is "ItemStack" for items and - * "Entity" for projectiles This can therefore be implemented by - * projectile entities and items - */ - public float[] getDamageRatio(Object... implement); + /** + * Gets the cutting:blunt ratio. use any 3 numbers, the relevant values is what + * matters + * + * @param implement the object causing the damage, this is "ItemStack" for items and + * "Entity" for projectiles This can therefore be implemented by + * projectile entities and items + */ + public float[] getDamageRatio(Object... implement); - /** - * Gets the "Penetration" level: this modifies the armour rating of supported - * armours, 0 means no effect - * - * @param implement - * the object causing the damage, this is "ItemStack" for items and - * "Entity" for projectiles This can therefore be implemented by - * projectile entities and items - */ - public float getPenetrationLevel(Object implement); + /** + * Gets the "Penetration" level: this modifies the armour rating of supported + * armours, 0 means no effect + * + * @param implement the object causing the damage, this is "ItemStack" for items and + * "Entity" for projectiles This can therefore be implemented by + * projectile entities and items + */ + public float getPenetrationLevel(Object implement); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IKnockbackWeapon.java b/src/main/java/minefantasy/mf2/api/weapon/IKnockbackWeapon.java index b15b71b4..5c98514c 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IKnockbackWeapon.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IKnockbackWeapon.java @@ -4,5 +4,5 @@ import net.minecraft.item.ItemStack; public interface IKnockbackWeapon { - public float getAddedKnockback(EntityLivingBase user, ItemStack item); + public float getAddedKnockback(EntityLivingBase user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IParryable.java b/src/main/java/minefantasy/mf2/api/weapon/IParryable.java index a52e984b..41959e87 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IParryable.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IParryable.java @@ -6,40 +6,40 @@ import net.minecraft.util.DamageSource; public interface IParryable { - /** - * Determines if the weapon can parry in the first place - */ - public boolean canParry(DamageSource source, EntityLivingBase blocker, ItemStack item); - - /** - * This gets how accurate you need to be facing to parry - */ - public float getParryAngle(DamageSource source, EntityLivingBase blocker, ItemStack item); - - /** - * Calls a method when the defender parrys the attacker - */ - public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam); - - /** - * use this method to play custom sounds, return false if there is none - */ - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon); - - /** - * Gets the maximum amount of damage parry can reduce - */ - public float getMaxDamageParry(EntityLivingBase user, ItemStack weapon); - - public boolean canUserParry(EntityLivingBase user); - - /** - * Modifies the amount stamina decays when parrying, 1.0 = default - */ - public float getParryStaminaDecay(DamageSource source, ItemStack weapon); - - /** - * Gets how many ticks it takes to recover from a parry - */ - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon); + /** + * Determines if the weapon can parry in the first place + */ + public boolean canParry(DamageSource source, EntityLivingBase blocker, ItemStack item); + + /** + * This gets how accurate you need to be facing to parry + */ + public float getParryAngle(DamageSource source, EntityLivingBase blocker, ItemStack item); + + /** + * Calls a method when the defender parrys the attacker + */ + public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam); + + /** + * use this method to play custom sounds, return false if there is none + */ + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon); + + /** + * Gets the maximum amount of damage parry can reduce + */ + public float getMaxDamageParry(EntityLivingBase user, ItemStack weapon); + + public boolean canUserParry(EntityLivingBase user); + + /** + * Modifies the amount stamina decays when parrying, 1.0 = default + */ + public float getParryStaminaDecay(DamageSource source, ItemStack weapon); + + /** + * Gets how many ticks it takes to recover from a parry + */ + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IPowerAttack.java b/src/main/java/minefantasy/mf2/api/weapon/IPowerAttack.java index 83aee223..7fac75dd 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IPowerAttack.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IPowerAttack.java @@ -5,7 +5,7 @@ import net.minecraft.item.ItemStack; public interface IPowerAttack { - public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target); + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target); - public void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit); + public void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IRackItem.java b/src/main/java/minefantasy/mf2/api/weapon/IRackItem.java index 1f52a894..a05c9297 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IRackItem.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IRackItem.java @@ -5,18 +5,18 @@ public interface IRackItem { - float getScale(ItemStack itemstack); + float getScale(ItemStack itemstack); - float getOffsetX(ItemStack itemstack); + float getOffsetX(ItemStack itemstack); - float getOffsetY(ItemStack itemstack); + float getOffsetY(ItemStack itemstack); - float getOffsetZ(ItemStack itemstack); + float getOffsetZ(ItemStack itemstack); - float getRotationOffset(ItemStack itemstack); + float getRotationOffset(ItemStack itemstack); - boolean canHang(TileEntityRack rack, ItemStack item, int slot); + boolean canHang(TileEntityRack rack, ItemStack item, int slot); - boolean isSpecialRender(ItemStack item); + boolean isSpecialRender(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/ISharpenable.java b/src/main/java/minefantasy/mf2/api/weapon/ISharpenable.java index de2f895b..842b1bdc 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/ISharpenable.java +++ b/src/main/java/minefantasy/mf2/api/weapon/ISharpenable.java @@ -3,18 +3,18 @@ import net.minecraft.item.ItemStack; public interface ISharpenable { - /** - * The max amount of uses of sharpness -1 means can't be sharpened - */ - public float getMaxSharpness(ItemStack item); + /** + * The max amount of uses of sharpness -1 means can't be sharpened + */ + public float getMaxSharpness(ItemStack item); - /** - * The max percent that it can increase damage - */ - public float getDamagePercentMax(ItemStack item); + /** + * The max percent that it can increase damage + */ + public float getDamagePercentMax(ItemStack item); - /** - * The modifier for how much percent is added each use - */ - public float getSharpUsesModifier(ItemStack item); + /** + * The modifier for how much percent is added each use + */ + public float getSharpUsesModifier(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/ISpecialCombatMob.java b/src/main/java/minefantasy/mf2/api/weapon/ISpecialCombatMob.java index 126b839f..31a63eff 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/ISpecialCombatMob.java +++ b/src/main/java/minefantasy/mf2/api/weapon/ISpecialCombatMob.java @@ -4,7 +4,7 @@ import net.minecraft.util.DamageSource; public interface ISpecialCombatMob { - boolean canParry(DamageSource source); + boolean canParry(DamageSource source); - void onParry(DamageSource source, Entity attacker, float dam); + void onParry(DamageSource source, Entity attacker, float dam); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/ISpecialEffect.java b/src/main/java/minefantasy/mf2/api/weapon/ISpecialEffect.java index 46c71c79..e9c09bba 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/ISpecialEffect.java +++ b/src/main/java/minefantasy/mf2/api/weapon/ISpecialEffect.java @@ -5,5 +5,5 @@ import net.minecraft.item.ItemStack; public interface ISpecialEffect { - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam); + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IWeaponClass.java b/src/main/java/minefantasy/mf2/api/weapon/IWeaponClass.java index 22443bfa..4f48bab8 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IWeaponClass.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IWeaponClass.java @@ -1,5 +1,5 @@ package minefantasy.mf2.api.weapon; public interface IWeaponClass { - public WeaponClass getWeaponClass(); + public WeaponClass getWeaponClass(); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IWeaponSpeed.java b/src/main/java/minefantasy/mf2/api/weapon/IWeaponSpeed.java index dbd2106b..5669eaa6 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IWeaponSpeed.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IWeaponSpeed.java @@ -4,5 +4,5 @@ import net.minecraft.item.ItemStack; public interface IWeaponSpeed { - public int modifyHitTime(EntityLivingBase user, ItemStack item); + public int modifyHitTime(EntityLivingBase user, ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/IWeightedWeapon.java b/src/main/java/minefantasy/mf2/api/weapon/IWeightedWeapon.java index b9567d05..1f83aa24 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/IWeightedWeapon.java +++ b/src/main/java/minefantasy/mf2/api/weapon/IWeightedWeapon.java @@ -3,9 +3,9 @@ import net.minecraft.entity.EntityLivingBase; public interface IWeightedWeapon { - /** - * Gets the amount that you are thrown off balance, <= 0 means no effect Spears - * use 0.5 - */ - public float getBalance(EntityLivingBase user); + /** + * Gets the amount that you are thrown off balance, <= 0 means no effect Spears + * use 0.5 + */ + public float getBalance(EntityLivingBase user); } diff --git a/src/main/java/minefantasy/mf2/api/weapon/WeaponClass.java b/src/main/java/minefantasy/mf2/api/weapon/WeaponClass.java index b81a12f3..a2c05201 100644 --- a/src/main/java/minefantasy/mf2/api/weapon/WeaponClass.java +++ b/src/main/java/minefantasy/mf2/api/weapon/WeaponClass.java @@ -1,58 +1,58 @@ package minefantasy.mf2.api.weapon; -import java.util.HashMap; - import minefantasy.mf2.api.rpg.Skill; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; +import java.util.HashMap; + public class WeaponClass { - public static HashMap classes = new HashMap(); - - public static WeaponClass FIST = new WeaponClass("fist", null, "blunt"); - - public static WeaponClass BLADE = new WeaponClass("blade", null, "blunt"); - public static WeaponClass BLUNT = new WeaponClass("blunt", null, "blade"); - public static WeaponClass AXE = new WeaponClass("axe", null, "blade"); - public static WeaponClass POLEARM = new WeaponClass("polearm", null, "blade"); - public static WeaponClass MISC = new WeaponClass("misc", null, "blunt"); - - public Skill parentSkill; - public String name; - public String sound; - - public WeaponClass(String name, Skill parent, String sound) { - this.name = name; - this.parentSkill = parent; - this.sound = sound; - classes.put(name, this); - } - - public String getSound() { - return sound; - } - - public static WeaponClass getWeaponClass(String name) { - WeaponClass WC = classes.get(name); - return WC != null ? WC : WeaponClass.MISC; - } - - public static WeaponClass getWeaponClass(ItemStack weapon) { - if (weapon == null) { - return WeaponClass.FIST; - } - if (weapon.getItem() instanceof IWeaponClass) { - return ((IWeaponClass) weapon.getItem()).getWeaponClass(); - } - return WeaponClass.BLADE; - } - - public static WeaponClass findClassForAny(ItemStack weapon) { - if (weapon == null) - return FIST; - if (weapon.getItem() instanceof IWeaponClass || weapon.getItem() instanceof ItemSword) { - return getWeaponClass(weapon); - } - return WeaponClass.MISC; - } + public static HashMap classes = new HashMap(); + + public static WeaponClass FIST = new WeaponClass("fist", null, "blunt"); + + public static WeaponClass BLADE = new WeaponClass("blade", null, "blunt"); + public static WeaponClass BLUNT = new WeaponClass("blunt", null, "blade"); + public static WeaponClass AXE = new WeaponClass("axe", null, "blade"); + public static WeaponClass POLEARM = new WeaponClass("polearm", null, "blade"); + public static WeaponClass MISC = new WeaponClass("misc", null, "blunt"); + + public Skill parentSkill; + public String name; + public String sound; + + public WeaponClass(String name, Skill parent, String sound) { + this.name = name; + this.parentSkill = parent; + this.sound = sound; + classes.put(name, this); + } + + public static WeaponClass getWeaponClass(String name) { + WeaponClass WC = classes.get(name); + return WC != null ? WC : WeaponClass.MISC; + } + + public static WeaponClass getWeaponClass(ItemStack weapon) { + if (weapon == null) { + return WeaponClass.FIST; + } + if (weapon.getItem() instanceof IWeaponClass) { + return ((IWeaponClass) weapon.getItem()).getWeaponClass(); + } + return WeaponClass.BLADE; + } + + public static WeaponClass findClassForAny(ItemStack weapon) { + if (weapon == null) + return FIST; + if (weapon.getItem() instanceof IWeaponClass || weapon.getItem() instanceof ItemSword) { + return getWeaponClass(weapon); + } + return WeaponClass.MISC; + } + + public String getSound() { + return sound; + } } diff --git a/src/main/java/minefantasy/mf2/asm/ASMHelper.java b/src/main/java/minefantasy/mf2/asm/ASMHelper.java index 7d60bd73..080712fb 100644 --- a/src/main/java/minefantasy/mf2/asm/ASMHelper.java +++ b/src/main/java/minefantasy/mf2/asm/ASMHelper.java @@ -2,9 +2,11 @@ import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.*; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.InsnList; +import org.objectweb.asm.tree.MethodNode; -import java.util.ArrayList; import java.util.List; public final class ASMHelper { diff --git a/src/main/java/minefantasy/mf2/asm/InstructionComparator.java b/src/main/java/minefantasy/mf2/asm/InstructionComparator.java index c78d6868..c287846b 100644 --- a/src/main/java/minefantasy/mf2/asm/InstructionComparator.java +++ b/src/main/java/minefantasy/mf2/asm/InstructionComparator.java @@ -2,7 +2,6 @@ import org.objectweb.asm.tree.*; -import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; diff --git a/src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java b/src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java index 63cd51c6..7d08aed1 100644 --- a/src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java +++ b/src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java @@ -6,7 +6,7 @@ import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.MethodNode; -import static minefantasy.mf2.asm.Mappings.*; +import static minefantasy.mf2.asm.Mappings.shouldRenderPass; public class RenderHorseTransformer { diff --git a/src/main/java/minefantasy/mf2/block/basic/BasicBlockMF.java b/src/main/java/minefantasy/mf2/block/basic/BasicBlockMF.java index bba5b6bf..3233657b 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BasicBlockMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/BasicBlockMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.basic; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -12,48 +10,50 @@ import net.minecraft.item.Item; import net.minecraft.world.World; +import java.util.Random; + public class BasicBlockMF extends Block { - private Object drop; - - public BasicBlockMF(String name, Material material) { - this(name, material, null); - } - - public BasicBlockMF(String name, Material material, Object drop) { - super(material); - - GameRegistry.registerBlock(this, name); - setBlockName(name); - setBlockTextureName("minefantasy2:basic/" + name); - - if (material == Material.rock) { - this.setHarvestLevel("pickaxe", 0); - } - this.drop = drop; - this.setCreativeTab(CreativeTabs.tabBlock); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean isOpaqueCube() { - return this.blockMaterial != Material.glass; - } - - @Override - public Item getItemDropped(int meta, Random rand, int i) { - if (drop != null) { - if (drop instanceof Item) { - return (Item) drop; - } - if (drop instanceof Block) { - return Item.getItemFromBlock((Block) drop); - } - } - return Item.getItemFromBlock(this); - } - - @Override - public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) { - return false; - } + private Object drop; + + public BasicBlockMF(String name, Material material) { + this(name, material, null); + } + + public BasicBlockMF(String name, Material material, Object drop) { + super(material); + + GameRegistry.registerBlock(this, name); + setBlockName(name); + setBlockTextureName("minefantasy2:basic/" + name); + + if (material == Material.rock) { + this.setHarvestLevel("pickaxe", 0); + } + this.drop = drop; + this.setCreativeTab(CreativeTabs.tabBlock); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isOpaqueCube() { + return this.blockMaterial != Material.glass; + } + + @Override + public Item getItemDropped(int meta, Random rand, int i) { + if (drop != null) { + if (drop instanceof Item) { + return (Item) drop; + } + if (drop instanceof Block) { + return Item.getItemFromBlock((Block) drop); + } + } + return Item.getItemFromBlock(this); + } + + @Override + public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) { + return false; + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockMeta.java b/src/main/java/minefantasy/mf2/block/basic/BlockMeta.java index 5801a47d..60af66bb 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockMeta.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockMeta.java @@ -10,49 +10,49 @@ import net.minecraft.util.IIcon; public abstract class BlockMeta extends Block { - protected final String[] names; - @SideOnly(Side.CLIENT) - protected IIcon[] icons; - - public BlockMeta(String name, Material material, String... names) { - super(material); - this.names = names; - - GameRegistry.registerBlock(this, ItemMetaBlock.class, name); - - if (material == Material.rock) { - this.setHarvestLevel("pickaxe", 0); - } - this.setHardness(2.0F); - this.setResistance(2.0F); - this.setCreativeTab(CreativeTabs.tabBlock); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return icons[Math.min(meta, icons.length - 1)]; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - icons = new IIcon[names.length]; - for (int i = 0; i < names.length; i++) { - icons[i] = reg.registerIcon("minefantasy2:meta/" + names[i]); - } - } - - public String getUnlocalisedName(int meta) { - return "tile." + names[Math.min(meta, names.length - 1)]; - } - - public int getCount() { - return names.length; - } - - @Override - public int damageDropped(int meta) { - return meta; - } + protected final String[] names; + @SideOnly(Side.CLIENT) + protected IIcon[] icons; + + public BlockMeta(String name, Material material, String... names) { + super(material); + this.names = names; + + GameRegistry.registerBlock(this, ItemMetaBlock.class, name); + + if (material == Material.rock) { + this.setHarvestLevel("pickaxe", 0); + } + this.setHardness(2.0F); + this.setResistance(2.0F); + this.setCreativeTab(CreativeTabs.tabBlock); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return icons[Math.min(meta, icons.length - 1)]; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[names.length]; + for (int i = 0; i < names.length; i++) { + icons[i] = reg.registerIcon("minefantasy2:meta/" + names[i]); + } + } + + public String getUnlocalisedName(int meta) { + return "tile." + names[Math.min(meta, names.length - 1)]; + } + + public int getCount() { + return names.length; + } + + @Override + public int damageDropped(int meta) { + return meta; + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockMetalBarsMF.java b/src/main/java/minefantasy/mf2/block/basic/BlockMetalBarsMF.java index 44a46602..153cf7c4 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockMetalBarsMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockMetalBarsMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.basic; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.block.Block; @@ -12,35 +10,36 @@ import net.minecraft.util.DamageSource; import net.minecraft.world.World; -public class BlockMetalBarsMF extends BlockPane { - private BaseMaterialMF baseMat; +import java.util.Random; - public BlockMetalBarsMF(BaseMaterialMF material) { - super("minefantasy2:metal/" + material.name.toLowerCase() + "_bars", - "minefantasy2:metal/" + material.name.toLowerCase() + "_bars", Material.iron, true); - String name = material.name.toLowerCase() + "_bars"; - GameRegistry.registerBlock(this, name); - setBlockName(name); +public class BlockMetalBarsMF extends BlockPane { + private BaseMaterialMF baseMat; + private Random rand = new Random(); - this.setHarvestLevel("pickaxe", material.harvestLevel); - this.setStepSound(Block.soundTypeMetal); - this.setHardness(material.hardness + 1 / 2F); - this.setResistance(material.hardness + 1); - this.baseMat = material; - } + public BlockMetalBarsMF(BaseMaterialMF material) { + super("minefantasy2:metal/" + material.name.toLowerCase() + "_bars", + "minefantasy2:metal/" + material.name.toLowerCase() + "_bars", Material.iron, true); + String name = material.name.toLowerCase() + "_bars"; + GameRegistry.registerBlock(this, name); + setBlockName(name); - private Random rand = new Random(); + this.setHarvestLevel("pickaxe", material.harvestLevel); + this.setStepSound(Block.soundTypeMetal); + this.setHardness(material.hardness + 1 / 2F); + this.setResistance(material.hardness + 1); + this.baseMat = material; + } - @Override - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity hitter) { - if (baseMat.name.equalsIgnoreCase("dragonforge") && !hitter.isImmuneToFire() - && hitter instanceof EntityLivingBase) { - hitter.setFire(10); - hitter.attackEntityFrom(DamageSource.inFire, 1); - world.spawnParticle("flame", x + rand.nextDouble(), y + rand.nextDouble(), z + rand.nextDouble(), 0D, 0D, - 0D); - world.spawnParticle("smoke", x + rand.nextDouble(), y + rand.nextDouble(), z + rand.nextDouble(), 0D, 0D, - 0D); - } - } + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity hitter) { + if (baseMat.name.equalsIgnoreCase("dragonforge") && !hitter.isImmuneToFire() + && hitter instanceof EntityLivingBase) { + hitter.setFire(10); + hitter.attackEntityFrom(DamageSource.inFire, 1); + world.spawnParticle("flame", x + rand.nextDouble(), y + rand.nextDouble(), z + rand.nextDouble(), 0D, 0D, + 0D); + world.spawnParticle("smoke", x + rand.nextDouble(), y + rand.nextDouble(), z + rand.nextDouble(), 0D, 0D, + 0D); + } + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockMetalMF.java b/src/main/java/minefantasy/mf2/block/basic/BlockMetalMF.java index e2684b9f..106a3447 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockMetalMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockMetalMF.java @@ -7,18 +7,18 @@ import net.minecraft.creativetab.CreativeTabs; public class BlockMetalMF extends Block { - public BlockMetalMF(BaseMaterialMF material) { - super(Material.iron); + public BlockMetalMF(BaseMaterialMF material) { + super(Material.iron); - String name = material.name.toLowerCase() + "_block"; - GameRegistry.registerBlock(this, name); - setBlockName(name); + String name = material.name.toLowerCase() + "_block"; + GameRegistry.registerBlock(this, name); + setBlockName(name); - this.setBlockTextureName("minefantasy2:metal/" + name); - this.setHarvestLevel("pickaxe", material.harvestLevel); - this.setStepSound(Block.soundTypeMetal); - this.setHardness(material.hardness + 1 / 2F); - this.setResistance(material.hardness + 1); - this.setCreativeTab(CreativeTabs.tabBlock); - } + this.setBlockTextureName("minefantasy2:metal/" + name); + this.setHarvestLevel("pickaxe", material.harvestLevel); + this.setStepSound(Block.soundTypeMetal); + this.setHardness(material.hardness + 1 / 2F); + this.setResistance(material.hardness + 1); + this.setCreativeTab(CreativeTabs.tabBlock); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockMythicDecor.java b/src/main/java/minefantasy/mf2/block/basic/BlockMythicDecor.java index 8e1d9106..a70e8500 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockMythicDecor.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockMythicDecor.java @@ -4,8 +4,8 @@ public class BlockMythicDecor extends BlockMeta { - public BlockMythicDecor() { - super("mythic_decor", Material.rock, "framed_end", "decorated_end"); - } + public BlockMythicDecor() { + super("mythic_decor", Material.rock, "framed_end", "decorated_end"); + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockMythicOre.java b/src/main/java/minefantasy/mf2/block/basic/BlockMythicOre.java index 34ff16ec..5a9fd45e 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockMythicOre.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockMythicOre.java @@ -1,26 +1,26 @@ package minefantasy.mf2.block.basic; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.world.World; +import java.util.Random; + public class BlockMythicOre extends BlockOreMF { - private boolean isPure; + private boolean isPure; - public BlockMythicOre(String name, boolean pure) { - super(name, 4, pure ? 3 : 2); - isPure = pure; - } + public BlockMythicOre(String name, boolean pure) { + super(name, 4, pure ? 3 : 2); + isPure = pure; + } - @SideOnly(Side.CLIENT) - @Override - public void randomDisplayTick(World world, int x, int y, int z, Random rand) { - if (rand.nextInt(20) == 0 && world.isRemote) { - // "minefantasy2:block.mythicore" - world.playSound(x + 0.5D, y + 0.5D, z + 0.5D, (isPure ? "minefantasy2:block.mythicore" : "random.levelup"), - 1.0F, rand.nextFloat() * 0.4F + 1.1F, true); - } - } + @SideOnly(Side.CLIENT) + @Override + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + if (rand.nextInt(20) == 0 && world.isRemote) { + // "minefantasy2:block.mythicore" + world.playSound(x + 0.5D, y + 0.5D, z + 0.5D, (isPure ? "minefantasy2:block.mythicore" : "random.levelup"), + 1.0F, rand.nextFloat() * 0.4F + 1.1F, true); + } + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockOreMF.java b/src/main/java/minefantasy/mf2/block/basic/BlockOreMF.java index 3888430a..c624bce5 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockOreMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockOreMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.basic; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.item.list.CreativeTabMF; import net.minecraft.block.Block; @@ -12,93 +10,94 @@ import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; +import java.util.Random; + public class BlockOreMF extends Block { - public int rarity; - private int xp; - private Item drop; - private int dropMin; - private int dropMax; - - public BlockOreMF(String name, int harvestLevel) { - this(name, harvestLevel, 0); - } - - public BlockOreMF(String name, int harvestLevel, int rarity) { - this(name, harvestLevel, rarity, null, 1, 1, 0); - } - - public BlockOreMF(String name, int harvestLevel, int rarity, Item drop, int min, int max, int xp) { - this(name, harvestLevel, rarity, drop, min, max, xp, Material.rock); - } - - public BlockOreMF(String name, int harvestLevel, int rarity, Item drop, int min, int max, int xp, - Material material) { - super(material); - this.xp = xp; - this.drop = drop; - this.rarity = rarity; - this.dropMin = min; - this.dropMax = max; - - this.setStepSound(Block.soundTypePiston); - GameRegistry.registerBlock(this, ItemOreblockMF.class, name); - setBlockName(name); - setBlockTextureName("minefantasy2:ores/" + name); - - if (material == Material.rock) { - this.setHarvestLevel("pickaxe", harvestLevel); - } - this.setCreativeTab(CreativeTabMF.tabOres); - OreDictionary.registerOre(name, this); - } - - @Override - public Item getItemDropped(int meta, Random rand, int i) { - return drop != null ? drop : Item.getItemFromBlock(this); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random rand) { - return MathHelper.getRandomIntegerInRange(rand, dropMin, dropMax); - } - - /** - * Returns the usual quantity dropped by the block plus a bonus of 1 to 'i' - * (inclusive). - */ - @Override - public int quantityDroppedWithBonus(int fortune, Random rand) { - if (fortune > 0 && Item.getItemFromBlock(this) != this.getItemDropped(0, rand, fortune)) { - int j = rand.nextInt(fortune + 2) - 1; - - if (j < 0) { - j = 0; - } - - return this.quantityDropped(rand) * (j + 1); - } else { - return this.quantityDropped(rand); - } - } - - /** - * Drops the block items with a specified chance of dropping the specified items - */ - @Override - public void dropBlockAsItemWithChance(World world, int x, int y, int z, int m, float f, int i) { - super.dropBlockAsItemWithChance(world, x, y, z, m, f, i); - } - - private Random rand = new Random(); - - @Override - public int getExpDrop(IBlockAccess world, int meta, int fortune) { - if (xp > 0 && this.getItemDropped(meta, rand, fortune) != Item.getItemFromBlock(this)) { - return MathHelper.getRandomIntegerInRange(rand, xp, xp * 2); - } - return 0; - } + public int rarity; + private int xp; + private Item drop; + private int dropMin; + private int dropMax; + private Random rand = new Random(); + + public BlockOreMF(String name, int harvestLevel) { + this(name, harvestLevel, 0); + } + + public BlockOreMF(String name, int harvestLevel, int rarity) { + this(name, harvestLevel, rarity, null, 1, 1, 0); + } + + public BlockOreMF(String name, int harvestLevel, int rarity, Item drop, int min, int max, int xp) { + this(name, harvestLevel, rarity, drop, min, max, xp, Material.rock); + } + + public BlockOreMF(String name, int harvestLevel, int rarity, Item drop, int min, int max, int xp, + Material material) { + super(material); + this.xp = xp; + this.drop = drop; + this.rarity = rarity; + this.dropMin = min; + this.dropMax = max; + + this.setStepSound(Block.soundTypePiston); + GameRegistry.registerBlock(this, ItemOreblockMF.class, name); + setBlockName(name); + setBlockTextureName("minefantasy2:ores/" + name); + + if (material == Material.rock) { + this.setHarvestLevel("pickaxe", harvestLevel); + } + this.setCreativeTab(CreativeTabMF.tabOres); + OreDictionary.registerOre(name, this); + } + + @Override + public Item getItemDropped(int meta, Random rand, int i) { + return drop != null ? drop : Item.getItemFromBlock(this); + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random rand) { + return MathHelper.getRandomIntegerInRange(rand, dropMin, dropMax); + } + + /** + * Returns the usual quantity dropped by the block plus a bonus of 1 to 'i' + * (inclusive). + */ + @Override + public int quantityDroppedWithBonus(int fortune, Random rand) { + if (fortune > 0 && Item.getItemFromBlock(this) != this.getItemDropped(0, rand, fortune)) { + int j = rand.nextInt(fortune + 2) - 1; + + if (j < 0) { + j = 0; + } + + return this.quantityDropped(rand) * (j + 1); + } else { + return this.quantityDropped(rand); + } + } + + /** + * Drops the block items with a specified chance of dropping the specified items + */ + @Override + public void dropBlockAsItemWithChance(World world, int x, int y, int z, int m, float f, int i) { + super.dropBlockAsItemWithChance(world, x, y, z, m, f, i); + } + + @Override + public int getExpDrop(IBlockAccess world, int meta, int fortune) { + if (xp > 0 && this.getItemDropped(meta, rand, fortune) != Item.getItemFromBlock(this)) { + return MathHelper.getRandomIntegerInRange(rand, xp, xp * 2); + } + return 0; + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockPaneMF.java b/src/main/java/minefantasy/mf2/block/basic/BlockPaneMF.java index a3afd9fb..210cc34e 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockPaneMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockPaneMF.java @@ -6,11 +6,11 @@ public class BlockPaneMF extends BlockPane { - public BlockPaneMF(String name, String frontTex, String sideTex, Material material, boolean recoverable) { - super("minefantasy2:basic/" + frontTex, "minefantasy2:basic/" + sideTex, material, recoverable); + public BlockPaneMF(String name, String frontTex, String sideTex, Material material, boolean recoverable) { + super("minefantasy2:basic/" + frontTex, "minefantasy2:basic/" + sideTex, material, recoverable); - GameRegistry.registerBlock(this, name); - setBlockName(name); - } + GameRegistry.registerBlock(this, name); + setBlockName(name); + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockReinforcedStone.java b/src/main/java/minefantasy/mf2/block/basic/BlockReinforcedStone.java index d72c107b..64dd6d09 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockReinforcedStone.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockReinforcedStone.java @@ -7,37 +7,37 @@ import net.minecraft.util.IIcon; public class BlockReinforcedStone extends BlockMeta { - private String currentName; + private String currentName; - public BlockReinforcedStone(String name, String... alternates) { - super(name, Material.rock, alternates); - this.currentName = name; - } + public BlockReinforcedStone(String name, String... alternates) { + super(name, Material.rock, alternates); + this.currentName = name; + } - @Override - public IIcon getIcon(int side, int meta) { - if (side < 2 && meta < names.length - && (this.names[meta].startsWith("dshall") || this.names[meta].equalsIgnoreCase("engraved"))) { - return icons[0]; - } - return super.getIcon(side, meta); - } + @Override + public IIcon getIcon(int side, int meta) { + if (side < 2 && meta < names.length + && (this.names[meta].startsWith("dshall") || this.names[meta].equalsIgnoreCase("engraved"))) { + return icons[0]; + } + return super.getIcon(side, meta); + } - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - icons = new IIcon[names.length]; - for (int i = 0; i < names.length; i++) { - icons[i] = reg.registerIcon("minefantasy2:meta/" + currentName + "_" + names[i]); - } - } + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[names.length]; + for (int i = 0; i < names.length; i++) { + icons[i] = reg.registerIcon("minefantasy2:meta/" + currentName + "_" + names[i]); + } + } - @Override - public String getUnlocalisedName(int meta) { - if (meta < names.length - && (this.names[meta].startsWith("dshall") || this.names[meta].equalsIgnoreCase("engraved"))) { - return "tile." + currentName + "_" + names[1]; - } - return "tile." + currentName + "_" + names[Math.min(meta, names.length - 1)]; - } + @Override + public String getUnlocalisedName(int meta) { + if (meta < names.length + && (this.names[meta].startsWith("dshall") || this.names[meta].equalsIgnoreCase("engraved"))) { + return "tile." + currentName + "_" + names[1]; + } + return "tile." + currentName + "_" + names[Math.min(meta, names.length - 1)]; + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/BlockWorldGenMarker.java b/src/main/java/minefantasy/mf2/block/basic/BlockWorldGenMarker.java index 4e16e5f2..ff3fa931 100644 --- a/src/main/java/minefantasy/mf2/block/basic/BlockWorldGenMarker.java +++ b/src/main/java/minefantasy/mf2/block/basic/BlockWorldGenMarker.java @@ -9,15 +9,15 @@ public class BlockWorldGenMarker extends BlockContainer { - public BlockWorldGenMarker() { - super(Material.air); - this.setBlockUnbreakable(); - GameRegistry.registerBlock(this, "WorldGenFlag"); - } + public BlockWorldGenMarker() { + super(Material.air); + this.setBlockUnbreakable(); + GameRegistry.registerBlock(this, "WorldGenFlag"); + } - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityWorldGenMarker(); - } + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityWorldGenMarker(); + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/ConstructionBlockMF.java b/src/main/java/minefantasy/mf2/block/basic/ConstructionBlockMF.java index 4439d5b4..9c5dcc47 100644 --- a/src/main/java/minefantasy/mf2/block/basic/ConstructionBlockMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/ConstructionBlockMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.basic; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import net.minecraft.block.Block; @@ -14,175 +12,177 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import java.util.List; + public class ConstructionBlockMF extends Block { - public IIcon[] m_icons = new IIcon[4]; - public static final String[] m_names = new String[] { "", "_cobblestone", "_brick", "_pavement" }; - public Block[] stairblocks = new Block[4]; - - public ConstructionBlockMF(String unlocName) { - this(unlocName, new String[] { "", "_cobblestone", "_brick", "_pavement" }); - } - - public ConstructionBlockMF(String unlocName, String... types) { - this(unlocName, Material.rock, types); - } - - public ConstructionBlockMF(String unlocName, Material material, String... types) { - super(material); - - this.setBlockName(unlocName); - - this.setCreativeTab(CreativeTabs.tabBlock); - GameRegistry.registerBlock(this, ItemConstBlock.class, unlocName); - for (int i = 0; i < m_names.length; i++) { - GameRegistry.registerBlock(stairblocks[i] = new StairsConstBlock(unlocName + m_names[i] + "_stair", this, i) - .setHardness(1.5F).setResistance(10F), unlocName + m_names[i] + "_stair"); - } - - setHardness(1.5F); - setResistance(10F); - if (material == Material.rock) { - setHarvestLevel("pickaxe", 0); - } - - addConstructRecipes(); - - } - - @Override - public Block setHardness(float level) { - if (stairblocks != null) { - for (Block stairblock : stairblocks) - stairblock.setHardness(level); - } - return super.setHardness(level); - } - - @Override - public Block setResistance(float level) { - if (stairblocks != null) { - for (Block stairblock : stairblocks) - stairblock.setResistance(level); - } - return super.setResistance(level); - } - - // public Item getItemDropped(int meta, Random rand, int i) { return null; }; - - public void addConstructRecipes() { - GameRegistry.addSmelting(new ItemStack(this, 1, 1), new ItemStack(this, 1, 0), 0); - - GameRegistry.addRecipe(new ItemStack(this, 4, 3), new Object[] { "XX", "XX", 'X', new ItemStack(this, 1, 1) }); - GameRegistry.addRecipe(new ItemStack(this, 4, 2), - new Object[] { "X X", " ", "X X", 'X', new ItemStack(this, 1, 1) }); - GameRegistry.addRecipe(new ItemStack(this, 1, 1), new Object[] { "X", 'X', new ItemStack(this, 1, 2) }); - GameRegistry.addRecipe(new ItemStack(this, 1, 1), new Object[] { "X", 'X', new ItemStack(this, 1, 3) }); - for (int i = 0; i < 4; i++) - GameRegistry.addRecipe(new ItemStack(stairblocks[i], 4), - new Object[] { " X", " XX", "XXX", 'X', new ItemStack(this, 1, i) }); - } - - @Override - public int damageDropped(int meta) { - if (meta == 0) - return 1; - - return meta; - } - - @Override - public void registerBlockIcons(IIconRegister register) { - m_icons[0] = register.registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5)); - m_icons[1] = register.registerIcon( - MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_cobblestone"); - m_icons[2] = register - .registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_brick"); - m_icons[3] = register - .registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_pavement"); - } - - public String getUnlocalizedName(ItemStack itemstack) { - return getUnlocalizedName() + "." + m_names[itemstack.getItemDamage()]; - } - - @Override - public void getSubBlocks(Item item, CreativeTabs tab, List list) { - - for (int i = 0; i < 4; i++) { - list.add(new ItemStack(item, 1, i)); - } - } - - @Override - public IIcon getIcon(int side, int meta) { - switch (meta) { - case 0: - return m_icons[0]; - - case 1: - return m_icons[1]; - - case 2: - return m_icons[2]; - - case 3: - return m_icons[3]; - - default: - return blockIcon; - } - } - - public static class StairsConstBlock extends BlockStairs { - private final Block base; - - public StairsConstBlock(String unlocalizedName, Block baseBlock, int metaOfBaseBlock) { - super(baseBlock, metaOfBaseBlock); - this.setBlockName(unlocalizedName); - this.setCreativeTab(CreativeTabs.tabBlock); - this.setLightOpacity(0);// They seem to render shadows funny - this.base = baseBlock; - } - - public void addRecipe() { - GameRegistry.addRecipe(new ItemStack(this, 4), new Object[] { "B ", "BB ", "BBB", 'B', this.base }); - } - - public StairsConstBlock(String unlocalizedName, Block baseBlock) { - this(unlocalizedName, baseBlock, 0); - } - - public Block register(String name) { - GameRegistry.registerBlock(this, name); - return this; - } - } - - public static class ItemConstBlock extends ItemBlockWithMetadata { - - public ItemConstBlock(Block block) { - super(block, block); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - switch (stack.getItemDamage()) { - case 1: - return this.getUnlocalizedName() + "_cobblestone"; - case 2: - return this.getUnlocalizedName() + "_brick"; - case 3: - return this.getUnlocalizedName() + "_pavement"; - default: - return this.getUnlocalizedName(); - } - } - - @Override - public int getMetadata(int d) { - return d; - } - } + public static final String[] m_names = new String[]{"", "_cobblestone", "_brick", "_pavement"}; + public IIcon[] m_icons = new IIcon[4]; + public Block[] stairblocks = new Block[4]; + + public ConstructionBlockMF(String unlocName) { + this(unlocName, new String[]{"", "_cobblestone", "_brick", "_pavement"}); + } + + public ConstructionBlockMF(String unlocName, String... types) { + this(unlocName, Material.rock, types); + } + + public ConstructionBlockMF(String unlocName, Material material, String... types) { + super(material); + + this.setBlockName(unlocName); + + this.setCreativeTab(CreativeTabs.tabBlock); + GameRegistry.registerBlock(this, ItemConstBlock.class, unlocName); + for (int i = 0; i < m_names.length; i++) { + GameRegistry.registerBlock(stairblocks[i] = new StairsConstBlock(unlocName + m_names[i] + "_stair", this, i) + .setHardness(1.5F).setResistance(10F), unlocName + m_names[i] + "_stair"); + } + + setHardness(1.5F); + setResistance(10F); + if (material == Material.rock) { + setHarvestLevel("pickaxe", 0); + } + + addConstructRecipes(); + + } + + @Override + public Block setHardness(float level) { + if (stairblocks != null) { + for (Block stairblock : stairblocks) + stairblock.setHardness(level); + } + return super.setHardness(level); + } + + @Override + public Block setResistance(float level) { + if (stairblocks != null) { + for (Block stairblock : stairblocks) + stairblock.setResistance(level); + } + return super.setResistance(level); + } + + // public Item getItemDropped(int meta, Random rand, int i) { return null; }; + + public void addConstructRecipes() { + GameRegistry.addSmelting(new ItemStack(this, 1, 1), new ItemStack(this, 1, 0), 0); + + GameRegistry.addRecipe(new ItemStack(this, 4, 3), new Object[]{"XX", "XX", 'X', new ItemStack(this, 1, 1)}); + GameRegistry.addRecipe(new ItemStack(this, 4, 2), + new Object[]{"X X", " ", "X X", 'X', new ItemStack(this, 1, 1)}); + GameRegistry.addRecipe(new ItemStack(this, 1, 1), new Object[]{"X", 'X', new ItemStack(this, 1, 2)}); + GameRegistry.addRecipe(new ItemStack(this, 1, 1), new Object[]{"X", 'X', new ItemStack(this, 1, 3)}); + for (int i = 0; i < 4; i++) + GameRegistry.addRecipe(new ItemStack(stairblocks[i], 4), + new Object[]{" X", " XX", "XXX", 'X', new ItemStack(this, 1, i)}); + } + + @Override + public int damageDropped(int meta) { + if (meta == 0) + return 1; + + return meta; + } + + @Override + public void registerBlockIcons(IIconRegister register) { + m_icons[0] = register.registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5)); + m_icons[1] = register.registerIcon( + MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_cobblestone"); + m_icons[2] = register + .registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_brick"); + m_icons[3] = register + .registerIcon(MineFantasyII.MODID + ":" + "basic/" + getUnlocalizedName().substring(5) + "_pavement"); + } + + public String getUnlocalizedName(ItemStack itemstack) { + return getUnlocalizedName() + "." + m_names[itemstack.getItemDamage()]; + } + + @Override + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + + for (int i = 0; i < 4; i++) { + list.add(new ItemStack(item, 1, i)); + } + } + + @Override + public IIcon getIcon(int side, int meta) { + switch (meta) { + case 0: + return m_icons[0]; + + case 1: + return m_icons[1]; + + case 2: + return m_icons[2]; + + case 3: + return m_icons[3]; + + default: + return blockIcon; + } + } + + public static class StairsConstBlock extends BlockStairs { + private final Block base; + + public StairsConstBlock(String unlocalizedName, Block baseBlock, int metaOfBaseBlock) { + super(baseBlock, metaOfBaseBlock); + this.setBlockName(unlocalizedName); + this.setCreativeTab(CreativeTabs.tabBlock); + this.setLightOpacity(0);// They seem to render shadows funny + this.base = baseBlock; + } + + public StairsConstBlock(String unlocalizedName, Block baseBlock) { + this(unlocalizedName, baseBlock, 0); + } + + public void addRecipe() { + GameRegistry.addRecipe(new ItemStack(this, 4), new Object[]{"B ", "BB ", "BBB", 'B', this.base}); + } + + public Block register(String name) { + GameRegistry.registerBlock(this, name); + return this; + } + } + + public static class ItemConstBlock extends ItemBlockWithMetadata { + + public ItemConstBlock(Block block) { + super(block, block); + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + switch (stack.getItemDamage()) { + case 1: + return this.getUnlocalizedName() + "_cobblestone"; + case 2: + return this.getUnlocalizedName() + "_brick"; + case 3: + return this.getUnlocalizedName() + "_pavement"; + default: + return this.getUnlocalizedName(); + } + } + + @Override + public int getMetadata(int d) { + return d; + } + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/ItemMetaBlock.java b/src/main/java/minefantasy/mf2/block/basic/ItemMetaBlock.java index bdfb53c7..936f7316 100644 --- a/src/main/java/minefantasy/mf2/block/basic/ItemMetaBlock.java +++ b/src/main/java/minefantasy/mf2/block/basic/ItemMetaBlock.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.basic; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -10,30 +8,32 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import java.util.List; + public class ItemMetaBlock extends ItemBlock { - private BlockMeta instance; + private BlockMeta instance; - public ItemMetaBlock(Block block) { - super(block); - this.instance = (BlockMeta) block; - setHasSubtypes(true); - } + public ItemMetaBlock(Block block) { + super(block); + this.instance = (BlockMeta) block; + setHasSubtypes(true); + } - @Override - public String getUnlocalizedName(ItemStack item) { - return instance.getUnlocalisedName(item.getItemDamage()); - } + @Override + public String getUnlocalizedName(ItemStack item) { + return instance.getUnlocalisedName(item.getItemDamage()); + } - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs tab, List list) { - for (int i = 0; i < instance.getCount(); i++) { - list.add(new ItemStack(this, 1, i)); - } - } + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i < instance.getCount(); i++) { + list.add(new ItemStack(this, 1, i)); + } + } - @Override - public int getMetadata(int subid) { - return subid; - } + @Override + public int getMetadata(int subid) { + return subid; + } } diff --git a/src/main/java/minefantasy/mf2/block/basic/ItemOreblockMF.java b/src/main/java/minefantasy/mf2/block/basic/ItemOreblockMF.java index d73091b1..59641767 100644 --- a/src/main/java/minefantasy/mf2/block/basic/ItemOreblockMF.java +++ b/src/main/java/minefantasy/mf2/block/basic/ItemOreblockMF.java @@ -7,26 +7,26 @@ import net.minecraft.item.ItemStack; public class ItemOreblockMF extends ItemBlock { - private BlockOreMF ore; + private BlockOreMF ore; - public ItemOreblockMF(Block block) { - super(block); - ore = (BlockOreMF) block; - } + public ItemOreblockMF(Block block) { + super(block); + ore = (BlockOreMF) block; + } - @Override - public EnumRarity getRarity(ItemStack item) { - int lvl = ore.rarity + 1; + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = ore.rarity + 1; - if (item.isItemEnchanted()) { - if (lvl == 0) { - lvl++; - } - lvl++; - } - if (lvl >= ToolListMF.rarity.length) { - lvl = ToolListMF.rarity.length - 1; - } - return ToolListMF.rarity[lvl]; - } + if (item.isItemEnchanted()) { + if (lvl == 0) { + lvl++; + } + lvl++; + } + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; + } + return ToolListMF.rarity[lvl]; + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockAnvilMF.java b/src/main/java/minefantasy/mf2/block/crafting/BlockAnvilMF.java index 2c9c1ded..190ddcf8 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockAnvilMF.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockAnvilMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -27,189 +25,190 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.Random; + public class BlockAnvilMF extends BlockContainer { - public static int anvil_RI = 100; - - @SideOnly(Side.CLIENT) - public int anvilRenderSide; - public BaseMaterialMF material; - private int tier; - - public BlockAnvilMF(BaseMaterialMF material) { - super(Material.anvil); - String name = material.name; - this.material = material; - float height = 1.0F / 16F * 13F; - setBlockBounds(0F, 0F, 0F, 1F, height, 1F); - - this.setBlockTextureName("minefantasy2:metal/" + name.toLowerCase() + "_block"); - name = "anvil" + name; - this.tier = material.tier; - GameRegistry.registerBlock(this, ItemBlockAnvilMF.class, name); - setBlockName(name); - this.setStepSound(Block.soundTypeMetal); - this.setHardness(material.hardness + 1 / 2F); - this.setResistance(material.hardness + 1); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, dir, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - ItemStack held = user.getHeldItem(); - TileEntityAnvilMF tile = getTile(world, x, y, z); - if (tile != null) { - if (side == 1 && held != null && held.getItem() instanceof ItemTongs - && onUsedTongs(world, user, held, tile)) { - return true; - } - if (side != 1 || !tile.tryCraft(user, true) && !world.isRemote) { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - private boolean onUsedTongs(World world, EntityPlayer user, ItemStack held, TileEntityAnvilMF tile) { - ItemStack result = tile.getStackInSlot(tile.getSizeInventory() - 1); - ItemStack grabbed = TongsHelper.getHeldItem(held); - - // GRAB - if (grabbed == null) { - if (result != null && result.getItem() == ComponentListMF.hotItem) { - if (TongsHelper.trySetHeldItem(held, result)) { - tile.setInventorySlotContents(tile.getSizeInventory() - 1, null); - return true; - } - } - } else { - for (int s = 0; s < (tile.getSizeInventory() - 1); s++) { - ItemStack slot = tile.getStackInSlot(s); - if (slot == null) { - tile.setInventorySlotContents(s, grabbed); - TongsHelper.clearHeldItem(held, user); - return false; - } - } - } - return false; - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { - { - TileEntityAnvilMF tile = getTile(world, x, y, z); - if (tile != null) { - if (user.isSneaking()) { - tile.upset(user); - } else { - tile.tryCraft(user, false); - } - } - } - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityAnvilMF(tier, material.name); - } - - private TileEntityAnvilMF getTile(World world, int x, int y, int z) { - return (TileEntityAnvilMF) world.getTileEntity(x, y, z); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityAnvilMF tile = getTile(world, x, y, z); - - if (tile != null) { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - public int getTier() { - return tier; - } - - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) { - if (tier == 0) { - return side == 1 ? Blocks.stone.getIcon(side, meta) : Blocks.cobblestone.getIcon(side, meta); - } - return super.getIcon(side, meta); - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - if (tier != 0) - super.registerBlockIcons(reg); - } - - @Override - public int getRenderType() { - return anvil_RI; - } - - private Random rand = new Random(); + public static int anvil_RI = 100; + + @SideOnly(Side.CLIENT) + public int anvilRenderSide; + public BaseMaterialMF material; + private int tier; + private Random rand = new Random(); + + public BlockAnvilMF(BaseMaterialMF material) { + super(Material.anvil); + String name = material.name; + this.material = material; + float height = 1.0F / 16F * 13F; + setBlockBounds(0F, 0F, 0F, 1F, height, 1F); + + this.setBlockTextureName("minefantasy2:metal/" + name.toLowerCase() + "_block"); + name = "anvil" + name; + this.tier = material.tier; + GameRegistry.registerBlock(this, ItemBlockAnvilMF.class, name); + setBlockName(name); + this.setStepSound(Block.soundTypeMetal); + this.setHardness(material.hardness + 1 / 2F); + this.setResistance(material.hardness + 1); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, dir, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + ItemStack held = user.getHeldItem(); + TileEntityAnvilMF tile = getTile(world, x, y, z); + if (tile != null) { + if (side == 1 && held != null && held.getItem() instanceof ItemTongs + && onUsedTongs(world, user, held, tile)) { + return true; + } + if (side != 1 || !tile.tryCraft(user, true) && !world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + private boolean onUsedTongs(World world, EntityPlayer user, ItemStack held, TileEntityAnvilMF tile) { + ItemStack result = tile.getStackInSlot(tile.getSizeInventory() - 1); + ItemStack grabbed = TongsHelper.getHeldItem(held); + + // GRAB + if (grabbed == null) { + if (result != null && result.getItem() == ComponentListMF.hotItem) { + if (TongsHelper.trySetHeldItem(held, result)) { + tile.setInventorySlotContents(tile.getSizeInventory() - 1, null); + return true; + } + } + } else { + for (int s = 0; s < (tile.getSizeInventory() - 1); s++) { + ItemStack slot = tile.getStackInSlot(s); + if (slot == null) { + tile.setInventorySlotContents(s, grabbed); + TongsHelper.clearHeldItem(held, user); + return false; + } + } + } + return false; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + { + TileEntityAnvilMF tile = getTile(world, x, y, z); + if (tile != null) { + if (user.isSneaking()) { + tile.upset(user); + } else { + tile.tryCraft(user, false); + } + } + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityAnvilMF(tier, material.name); + } + + private TileEntityAnvilMF getTile(World world, int x, int y, int z) { + return (TileEntityAnvilMF) world.getTileEntity(x, y, z); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityAnvilMF tile = getTile(world, x, y, z); + + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + public int getTier() { + return tier; + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + if (tier == 0) { + return side == 1 ? Blocks.stone.getIcon(side, meta) : Blocks.cobblestone.getIcon(side, meta); + } + return super.getIcon(side, meta); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + if (tier != 0) + super.registerBlockIcons(reg); + } + + @Override + public int getRenderType() { + return anvil_RI; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockBombBench.java b/src/main/java/minefantasy/mf2/block/crafting/BlockBombBench.java index d01111e2..65c63f18 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockBombBench.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockBombBench.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,142 +26,143 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Random; + public class BlockBombBench extends BlockContainer { - public static int bomb_RI = 102; - - public BlockBombBench() { - super(Material.wood); - GameRegistry.registerBlock(this, "MF_BombCrafter"); - setBlockName("bombBench"); - this.setStepSound(Block.soundTypeStone); - this.setHardness(5F); - this.setResistance(2F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { - if (world.isRemote) - user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); - return false; - } - TileEntityBombBench tile = getTile(world, x, y, z); - if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { - if (side != 1 || !tile.tryCraft(user, false) && !world.isRemote) { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { - if (ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { - TileEntityBombBench tile = getTile(world, x, y, z); - if (tile != null) { - tile.tryCraft(user, false); - } - } - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityBombBench(); - } - - private TileEntityBombBench getTile(World world, int x, int y, int z) { - return (TileEntityBombBench) world.getTileEntity(x, y, z); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityBombBench tile = getTile(world, x, y, z); - - if (tile != null) { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - if (side == 1) { - return Blocks.crafting_table.getIcon(1, meta); - } - return Blocks.anvil.getIcon(0, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - - } - - @Override - public int getRenderType() { - return bomb_RI; - } - - private Random rand = new Random(); + public static int bomb_RI = 102; + private Random rand = new Random(); + + public BlockBombBench() { + super(Material.wood); + GameRegistry.registerBlock(this, "MF_BombCrafter"); + setBlockName("bombBench"); + this.setStepSound(Block.soundTypeStone); + this.setHardness(5F); + this.setResistance(2F); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { + if (world.isRemote) + user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); + return false; + } + TileEntityBombBench tile = getTile(world, x, y, z); + if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { + if (side != 1 || !tile.tryCraft(user, false) && !world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + if (ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { + TileEntityBombBench tile = getTile(world, x, y, z); + if (tile != null) { + tile.tryCraft(user, false); + } + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityBombBench(); + } + + private TileEntityBombBench getTile(World world, int x, int y, int z) { + return (TileEntityBombBench) world.getTileEntity(x, y, z); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityBombBench tile = getTile(world, x, y, z); + + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (side == 1) { + return Blocks.crafting_table.getIcon(1, meta); + } + return Blocks.anvil.getIcon(0, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + + @Override + public int getRenderType() { + return bomb_RI; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockBombPress.java b/src/main/java/minefantasy/mf2/block/crafting/BlockBombPress.java index 0149c0f2..28441060 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockBombPress.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockBombPress.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,83 +22,84 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class BlockBombPress extends BlockContainer { - public static int bpress_RI = 108; - - public BlockBombPress() { - super(Material.iron); - GameRegistry.registerBlock(this, "MF_BombPress"); - setBlockName("bombPress"); - this.setStepSound(Block.soundTypeMetal); - this.setHardness(5F); - this.setResistance(2F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { - if (world.isRemote) - user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); - return false; - } - TileEntityBombPress tile = getTile(world, x, y, z); - if (tile != null) { - tile.use(user); - } - return true; - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityBombPress(); - } - - private TileEntityBombPress getTile(World world, int x, int y, int z) { - return (TileEntityBombPress) world.getTileEntity(x, y, z); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return Blocks.anvil.getIcon(0, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - - } - - @Override - public int getRenderType() { - return bpress_RI; - } +import java.util.Random; - private Random rand = new Random(); +public class BlockBombPress extends BlockContainer { + public static int bpress_RI = 108; + private Random rand = new Random(); + + public BlockBombPress() { + super(Material.iron); + GameRegistry.registerBlock(this, "MF_BombPress"); + setBlockName("bombPress"); + this.setStepSound(Block.soundTypeMetal); + this.setHardness(5F); + this.setResistance(2F); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { + if (world.isRemote) + user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); + return false; + } + TileEntityBombPress tile = getTile(world, x, y, z); + if (tile != null) { + tile.use(user); + } + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityBombPress(); + } + + private TileEntityBombPress getTile(World world, int x, int y, int z) { + return (TileEntityBombPress) world.getTileEntity(x, y, z); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return Blocks.anvil.getIcon(0, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + + @Override + public int getRenderType() { + return bpress_RI; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockCarpenter.java b/src/main/java/minefantasy/mf2/block/crafting/BlockCarpenter.java index ed17ed84..36408b1c 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockCarpenter.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockCarpenter.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,142 +22,143 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Random; + public class BlockCarpenter extends BlockContainer { - public static int carpenter_RI = 101; - - @SideOnly(Side.CLIENT) - public int CarpenterRenderSide; - private int tier = 0; - - public BlockCarpenter() { - super(Material.wood); - - GameRegistry.registerBlock(this, "MF_CarpenterBench"); - setBlockName("carpenterBench"); - this.setStepSound(Block.soundTypeWood); - this.setHardness(5F); - this.setResistance(2F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - { - TileEntityCarpenterMF tile = getTile(world, x, y, z); - if (tile != null - && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { - if (side != 1 || !tile.tryCraft(user) && !world.isRemote) { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { - { - TileEntityCarpenterMF tile = getTile(world, x, y, z); - if (tile != null) { - tile.tryCraft(user); - } - } - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityCarpenterMF(tier); - } - - private TileEntityCarpenterMF getTile(World world, int x, int y, int z) { - return (TileEntityCarpenterMF) world.getTileEntity(x, y, z); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityCarpenterMF tile = getTile(world, x, y, z); - - if (tile != null) { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return Blocks.crafting_table.getIcon(side, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - - } - - @Override - public int getRenderType() { - return carpenter_RI; - } - - private Random rand = new Random(); + public static int carpenter_RI = 101; + + @SideOnly(Side.CLIENT) + public int CarpenterRenderSide; + private int tier = 0; + private Random rand = new Random(); + + public BlockCarpenter() { + super(Material.wood); + + GameRegistry.registerBlock(this, "MF_CarpenterBench"); + setBlockName("carpenterBench"); + this.setStepSound(Block.soundTypeWood); + this.setHardness(5F); + this.setResistance(2F); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + { + TileEntityCarpenterMF tile = getTile(world, x, y, z); + if (tile != null + && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { + if (side != 1 || !tile.tryCraft(user) && !world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + { + TileEntityCarpenterMF tile = getTile(world, x, y, z); + if (tile != null) { + tile.tryCraft(user); + } + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityCarpenterMF(tier); + } + + private TileEntityCarpenterMF getTile(World world, int x, int y, int z) { + return (TileEntityCarpenterMF) world.getTileEntity(x, y, z); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityCarpenterMF tile = getTile(world, x, y, z); + + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return Blocks.crafting_table.getIcon(side, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + + @Override + public int getRenderType() { + return carpenter_RI; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockCogwork.java b/src/main/java/minefantasy/mf2/block/crafting/BlockCogwork.java index 3b7ec4e8..49907d23 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockCogwork.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockCogwork.java @@ -19,105 +19,105 @@ import net.minecraft.world.World; public class BlockCogwork extends BlockDirectional { - @SideOnly(Side.CLIENT) - private IIcon toptex; - @SideOnly(Side.CLIENT) - private IIcon facetex; - private String name; - private boolean isMain = false; + @SideOnly(Side.CLIENT) + private IIcon toptex; + @SideOnly(Side.CLIENT) + private IIcon facetex; + private String name; + private boolean isMain = false; - public BlockCogwork(String name, boolean helmet) { - super(Material.circuits); - this.isMain = helmet; - GameRegistry.registerBlock(this, "block" + name); - this.name = name; - this.setTickRandomly(true); - this.name = name; - this.setCreativeTab(CreativeTabMF.tabGadget); - this.setBlockTextureName("minefantasy2:metal/" + name.toLowerCase()); - setBlockName(name); - this.setHardness(1F); - this.setResistance(5F); - this.setLightOpacity(0); - } + public BlockCogwork(String name, boolean helmet) { + super(Material.circuits); + this.isMain = helmet; + GameRegistry.registerBlock(this, "block" + name); + this.name = name; + this.setTickRandomly(true); + this.name = name; + this.setCreativeTab(CreativeTabMF.tabGadget); + this.setBlockTextureName("minefantasy2:metal/" + name.toLowerCase()); + setBlockName(name); + this.setHardness(1F); + this.setResistance(5F); + this.setLightOpacity(0); + } - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) { - return side == 1 ? this.toptex - : (side == 0 ? this.toptex - : (meta == 2 && side == 2 ? this.facetex - : (meta == 3 && side == 5 ? this.facetex - : (meta == 0 && side == 3 ? this.facetex - : (meta == 1 && side == 4 ? this.facetex : this.blockIcon))))); - } + /** + * Gets the block's texture. Args: side, meta + */ + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + return side == 1 ? this.toptex + : (side == 0 ? this.toptex + : (meta == 2 && side == 2 ? this.facetex + : (meta == 3 && side == 5 ? this.facetex + : (meta == 0 && side == 3 ? this.facetex + : (meta == 1 && side == 4 ? this.facetex : this.blockIcon))))); + } - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, - float f2) { - if (!world.isRemote && ToolHelper.getCrafterTool(player.getHeldItem()).equalsIgnoreCase("spanner")) { - return tryBuild(player, world, x, y, z); - } - return false; - } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + if (!world.isRemote && ToolHelper.getCrafterTool(player.getHeldItem()).equalsIgnoreCase("spanner")) { + return tryBuild(player, world, x, y, z); + } + return false; + } - public boolean tryBuild(EntityPlayer builder, World world, int x, int y, int z) { - if (isMain && PowerArmour.isStationBlock(world, x, y + 2, z) - && world.getBlock(x, y - 1, z) == BlockListMF.cogwork_legs - && world.getBlock(x, y + 1, z) == BlockListMF.cogwork_helm) { - if (!world.isRemote) { - world.setBlock(x, y, z, getBlockById(0), 0, 2); - world.setBlock(x, y - 1, z, getBlockById(0), 0, 2); - world.setBlock(x, y + 1, z, getBlockById(0), 0, 2); + public boolean tryBuild(EntityPlayer builder, World world, int x, int y, int z) { + if (isMain && PowerArmour.isStationBlock(world, x, y + 2, z) + && world.getBlock(x, y - 1, z) == BlockListMF.cogwork_legs + && world.getBlock(x, y + 1, z) == BlockListMF.cogwork_helm) { + if (!world.isRemote) { + world.setBlock(x, y, z, getBlockById(0), 0, 2); + world.setBlock(x, y - 1, z, getBlockById(0), 0, 2); + world.setBlock(x, y + 1, z, getBlockById(0), 0, 2); - EntityCogwork suit = new EntityCogwork(world); - int m = world.getBlockMetadata(x, y, z); - int angle = getAngleFor(builder); - suit.setLocationAndAngles(x + 0.5D, y - 0.95D, z + 0.5D, angle, 0.0F); - suit.rotationYaw = suit.rotationYawHead = suit.prevRotationYaw = suit.prevRotationYawHead = angle; - world.spawnEntityInWorld(suit); + EntityCogwork suit = new EntityCogwork(world); + int m = world.getBlockMetadata(x, y, z); + int angle = getAngleFor(builder); + suit.setLocationAndAngles(x + 0.5D, y - 0.95D, z + 0.5D, angle, 0.0F); + suit.rotationYaw = suit.rotationYawHead = suit.prevRotationYaw = suit.prevRotationYawHead = angle; + world.spawnEntityInWorld(suit); - world.notifyBlockChange(x, y, z, getBlockById(0)); - world.notifyBlockChange(x, y - 1, z, getBlockById(0)); - world.notifyBlockChange(x, y + 1, z, getBlockById(0)); - } + world.notifyBlockChange(x, y, z, getBlockById(0)); + world.notifyBlockChange(x, y - 1, z, getBlockById(0)); + world.notifyBlockChange(x, y + 1, z, getBlockById(0)); + } - } - return false; - } + } + return false; + } - private int getAngleFor(EntityPlayer user) { - int l = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 2.5D) & 3; - return l * 90; - } + private int getAngleFor(EntityPlayer user) { + int l = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 2.5D) & 3; + return l * 90; + } - @Override - public boolean renderAsNormalBlock() { - return false; - } + @Override + public boolean renderAsNormalBlock() { + return false; + } - @Override - public boolean isOpaqueCube() { - return false; - } + @Override + public boolean isOpaqueCube() { + return false; + } - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack placed) { - int l = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 2.5D) & 3; - world.setBlockMetadataWithNotify(x, y, z, l, 2); - } + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack placed) { + int l = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 2.5D) & 3; + world.setBlockMetadataWithNotify(x, y, z, l, 2); + } - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister p_149651_1_) { - this.facetex = p_149651_1_.registerIcon(this.getTextureName() + "_face"); - this.toptex = p_149651_1_.registerIcon(this.getTextureName() + "_top"); - this.blockIcon = p_149651_1_.registerIcon(this.getTextureName() + "_side"); - } + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister p_149651_1_) { + this.facetex = p_149651_1_.registerIcon(this.getTextureName() + "_face"); + this.toptex = p_149651_1_.registerIcon(this.getTextureName() + "_top"); + this.blockIcon = p_149651_1_.registerIcon(this.getTextureName() + "_side"); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockCrossbowBench.java b/src/main/java/minefantasy/mf2/block/crafting/BlockCrossbowBench.java index 288530d0..2dcaaa3e 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockCrossbowBench.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,142 +26,143 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Random; + public class BlockCrossbowBench extends BlockContainer { - public static int crossBench_RI = 110; - - public BlockCrossbowBench() { - super(Material.wood); - GameRegistry.registerBlock(this, "MF_CrossbowCrafter"); - setBlockName("crossbowBench"); - this.setStepSound(Block.soundTypeStone); - this.setHardness(5F); - this.setResistance(2F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.crossbows)) { - if (world.isRemote) - user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); - return false; - } - TileEntityCrossbowBench tile = getTile(world, x, y, z); - if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { - if (side != 1 || !tile.tryCraft(user) && !world.isRemote) { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { - if (ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { - TileEntityCrossbowBench tile = getTile(world, x, y, z); - if (tile != null) { - tile.tryCraft(user); - } - } - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityCrossbowBench(); - } - - private TileEntityCrossbowBench getTile(World world, int x, int y, int z) { - return (TileEntityCrossbowBench) world.getTileEntity(x, y, z); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityCrossbowBench tile = getTile(world, x, y, z); - - if (tile != null) { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - if (side == 1) { - return Blocks.crafting_table.getIcon(1, meta); - } - return Blocks.anvil.getIcon(0, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - - } - - @Override - public int getRenderType() { - return crossBench_RI; - } - - private Random rand = new Random(); + public static int crossBench_RI = 110; + private Random rand = new Random(); + + public BlockCrossbowBench() { + super(Material.wood); + GameRegistry.registerBlock(this, "MF_CrossbowCrafter"); + setBlockName("crossbowBench"); + this.setStepSound(Block.soundTypeStone); + this.setHardness(5F); + this.setResistance(2F); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.crossbows)) { + if (world.isRemote) + user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); + return false; + } + TileEntityCrossbowBench tile = getTile(world, x, y, z); + if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { + if (side != 1 || !tile.tryCraft(user) && !world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + if (ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.bombs)) { + TileEntityCrossbowBench tile = getTile(world, x, y, z); + if (tile != null) { + tile.tryCraft(user); + } + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityCrossbowBench(); + } + + private TileEntityCrossbowBench getTile(World world, int x, int y, int z) { + return (TileEntityCrossbowBench) world.getTileEntity(x, y, z); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityCrossbowBench tile = getTile(world, x, y, z); + + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (side == 1) { + return Blocks.crafting_table.getIcon(1, meta); + } + return Blocks.anvil.getIcon(0, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + + @Override + public int getRenderType() { + return crossBench_RI; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockEngineerTanner.java b/src/main/java/minefantasy/mf2/block/crafting/BlockEngineerTanner.java index 72e83311..36ae4b39 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockEngineerTanner.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockEngineerTanner.java @@ -6,17 +6,17 @@ public class BlockEngineerTanner extends BlockTanningRack { - public BlockEngineerTanner(int tier, String tex) { - super(tier, tex); - } + public BlockEngineerTanner(int tier, String tex) { + super(tier, tex); + } - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - TileEntityTanningRack tile = getTile(world, x, y, z); - if (tile != null) { - return tile.interact(user, false, side == 1); - } - return true; - } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + TileEntityTanningRack tile = getTile(world, x, y, z); + if (tile != null) { + return tile.interact(user, false, side == 1); + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java b/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java index 4e4ae68d..ed0cfc53 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockFirepit.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,192 +22,193 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.Random; + public class BlockFirepit extends BlockContainer { - private Random rand = new Random(); - - public BlockFirepit() { - super(Material.wood); - setBlockBounds(0.2F, 0F, 0.2F, 0.8F, 0.5F, 0.8F); - String name = "firepit"; - this.setBlockName(name); - GameRegistry.registerBlock(this, name); - this.setLightOpacity(0); - setHardness(2F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public int quantityDropped(Random rand) { - return 0; - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, - float f2) { - TileEntityFirepit firepit = (TileEntityFirepit) world.getTileEntity(x, y, z); - - if (firepit != null) { - ItemStack held = player.getHeldItem(); - boolean burning = firepit.isBurning(); - - if (held != null) { - if (firepit.addFuel(held) && !player.capabilities.isCreativeMode) { - if (!world.isRemote) { - if (held.stackSize == 1) { - if (held.getItem().getContainerItem(held) != null) { - player.setCurrentItemOrArmor(0, held.getItem().getContainerItem(held)); - } else { - player.setCurrentItemOrArmor(0, null); - } - } else { - held.stackSize--; - if (held.getItem().getContainerItem(held) != null) { - if (!player.inventory.addItemStackToInventory(held.getItem().getContainerItem(held))) { - player.entityDropItem(held.getItem().getContainerItem(held), 0F); - } - } - } - } - return true; - } - - if (burning) { - if (firepit.tryCook(player, held) && !player.capabilities.isCreativeMode) { - ItemStack contain = held.getItem().getContainerItem(held); - --held.stackSize; - if (held.stackSize <= 0) { - if (contain != null) { - player.setCurrentItemOrArmor(0, contain); - } else - player.setCurrentItemOrArmor(0, null); - } else if (contain != null) { - firepit.dropItem(player, contain); - } - } - return true; - } else if (firepit.fuel > 0) { - if (held.getItem() instanceof ILighter) { - world.playSoundEffect(x + 0.5D, y - 0.5D, z + 0.5D, "fire.ignite", 1.0F, - rand.nextFloat() * 0.4F + 0.8F); - world.spawnParticle("flame", x + 0.5D, y - 0.5D, z + 0.5D, 0F, 0F, 0F); - - ILighter lighter = (ILighter) held.getItem(); - if (lighter.canLight()) { - if (rand.nextDouble() < lighter.getChance()) { - if (!world.isRemote) { - firepit.setLit(true); - held.damageItem(1, player); - } - } - return true; - } - } - if (held.getItem() instanceof ItemFlintAndSteel) { - world.playSoundEffect(x + 0.5D, y - 0.5D, z + 0.5D, "fire.ignite", 1.0F, - rand.nextFloat() * 0.4F + 0.8F); - world.spawnParticle("flame", x + 0.5D, y - 0.5D, z + 0.5D, 0F, 0F, 0F); - - if (!world.isRemote) { - firepit.setLit(true); - held.damageItem(1, player); - } - return true; - } - } - } - } - return super.onBlockActivated(world, x, y, z, player, i, f, f1, f2); - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityFirepit(); - } - - @Override - public IIcon getIcon(int side, int meta) { - return Blocks.planks.getIcon(side, 0); - } - - public boolean isOpaqueCube() { - return false; - } - - public static int firepit_RI = 112; - - @SideOnly(Side.CLIENT) - public int getRenderType() { - return firepit_RI; - } - - public boolean renderAsNormalBlock() { - return false; - } - - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World world, int x, int y, int z, Random random) { - TileEntityFirepit firepit = (TileEntityFirepit) world.getTileEntity(x, y, z); - if (firepit != null && firepit.isBurning()) { - world.spawnParticle("smoke", x + 0.5D, y + 0.5D, z + 0.5D, 0.0D, 0.0D, 0.0D); - world.spawnParticle("flame", x + 0.5D, y + 0.5D, z + 0.5D, 0.0D, 0.0D, 0.0D); - world.playSound(x, y, z, "fire.fire", 1.0F + random.nextFloat(), random.nextFloat() * 0.7F + 0.3F, false); - } - } - - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) { - if (world.getBlockMetadata(x, y, z) == 1) { - return 15; - } - return super.getLightValue(world, x, y, z); - } - - @Override - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { - if (world.isRemote) { - return; - } - TileEntityFirepit tile = (TileEntityFirepit) world.getTileEntity(x, y, z); - if (entity == null || tile == null || tile.hasBlockAbove()) { - return; - } - if (entity instanceof EntityItem) { - entity.motionX = entity.motionY = entity.motionZ = 0; - entity.posX = x + 0.5D; - entity.posY = y + 0.75D; - entity.posZ = z + 0.5D; - } else { - if (tile.isBurning()) { - entity.attackEntityFrom(DamageSource.inFire, 1.0F); - entity.setFire(2); - } - } - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityFirepit tile = (TileEntityFirepit) world.getTileEntity(x, y, z); - if (tile != null) { - int charcoal = tile.getCharcoalDrop(); - - if (charcoal > 0) { - float xDrop = this.rand.nextFloat() * 0.8F + 0.1F; - float yDrop = this.rand.nextFloat() * 0.8F + 0.1F; - float zDrop = this.rand.nextFloat() * 0.8F + 0.1F; - - for (int c = 0; c < charcoal; c++) { - EntityItem drop = new EntityItem(world, x + xDrop, y + yDrop, z + zDrop, - new ItemStack(Items.coal, 1, 1)); - - float jumpFactor = 0.05F; - drop.motionX = (float) this.rand.nextGaussian() * jumpFactor; - drop.motionY = (float) this.rand.nextGaussian() * jumpFactor + 0.2F; - drop.motionZ = (float) this.rand.nextGaussian() * jumpFactor; - world.spawnEntityInWorld(drop); - } - } - } - super.breakBlock(world, x, y, z, block, meta); - } + public static int firepit_RI = 112; + private Random rand = new Random(); + + public BlockFirepit() { + super(Material.wood); + setBlockBounds(0.2F, 0F, 0.2F, 0.8F, 0.5F, 0.8F); + String name = "firepit"; + this.setBlockName(name); + GameRegistry.registerBlock(this, name); + this.setLightOpacity(0); + setHardness(2F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public int quantityDropped(Random rand) { + return 0; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + TileEntityFirepit firepit = (TileEntityFirepit) world.getTileEntity(x, y, z); + + if (firepit != null) { + ItemStack held = player.getHeldItem(); + boolean burning = firepit.isBurning(); + + if (held != null) { + if (firepit.addFuel(held) && !player.capabilities.isCreativeMode) { + if (!world.isRemote) { + if (held.stackSize == 1) { + if (held.getItem().getContainerItem(held) != null) { + player.setCurrentItemOrArmor(0, held.getItem().getContainerItem(held)); + } else { + player.setCurrentItemOrArmor(0, null); + } + } else { + held.stackSize--; + if (held.getItem().getContainerItem(held) != null) { + if (!player.inventory.addItemStackToInventory(held.getItem().getContainerItem(held))) { + player.entityDropItem(held.getItem().getContainerItem(held), 0F); + } + } + } + } + return true; + } + + if (burning) { + if (firepit.tryCook(player, held) && !player.capabilities.isCreativeMode) { + ItemStack contain = held.getItem().getContainerItem(held); + --held.stackSize; + if (held.stackSize <= 0) { + if (contain != null) { + player.setCurrentItemOrArmor(0, contain); + } else + player.setCurrentItemOrArmor(0, null); + } else if (contain != null) { + firepit.dropItem(player, contain); + } + } + return true; + } else if (firepit.fuel > 0) { + if (held.getItem() instanceof ILighter) { + world.playSoundEffect(x + 0.5D, y - 0.5D, z + 0.5D, "fire.ignite", 1.0F, + rand.nextFloat() * 0.4F + 0.8F); + world.spawnParticle("flame", x + 0.5D, y - 0.5D, z + 0.5D, 0F, 0F, 0F); + + ILighter lighter = (ILighter) held.getItem(); + if (lighter.canLight()) { + if (rand.nextDouble() < lighter.getChance()) { + if (!world.isRemote) { + firepit.setLit(true); + held.damageItem(1, player); + } + } + return true; + } + } + if (held.getItem() instanceof ItemFlintAndSteel) { + world.playSoundEffect(x + 0.5D, y - 0.5D, z + 0.5D, "fire.ignite", 1.0F, + rand.nextFloat() * 0.4F + 0.8F); + world.spawnParticle("flame", x + 0.5D, y - 0.5D, z + 0.5D, 0F, 0F, 0F); + + if (!world.isRemote) { + firepit.setLit(true); + held.damageItem(1, player); + } + return true; + } + } + } + } + return super.onBlockActivated(world, x, y, z, player, i, f, f1, f2); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFirepit(); + } + + @Override + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); + } + + public boolean isOpaqueCube() { + return false; + } + + @SideOnly(Side.CLIENT) + public int getRenderType() { + return firepit_RI; + } + + public boolean renderAsNormalBlock() { + return false; + } + + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random random) { + TileEntityFirepit firepit = (TileEntityFirepit) world.getTileEntity(x, y, z); + if (firepit != null && firepit.isBurning()) { + world.spawnParticle("smoke", x + 0.5D, y + 0.5D, z + 0.5D, 0.0D, 0.0D, 0.0D); + world.spawnParticle("flame", x + 0.5D, y + 0.5D, z + 0.5D, 0.0D, 0.0D, 0.0D); + world.playSound(x, y, z, "fire.fire", 1.0F + random.nextFloat(), random.nextFloat() * 0.7F + 0.3F, false); + } + } + + @Override + public int getLightValue(IBlockAccess world, int x, int y, int z) { + if (world.getBlockMetadata(x, y, z) == 1) { + return 15; + } + return super.getLightValue(world, x, y, z); + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + if (world.isRemote) { + return; + } + TileEntityFirepit tile = (TileEntityFirepit) world.getTileEntity(x, y, z); + if (entity == null || tile == null || tile.hasBlockAbove()) { + return; + } + if (entity instanceof EntityItem) { + entity.motionX = entity.motionY = entity.motionZ = 0; + entity.posX = x + 0.5D; + entity.posY = y + 0.75D; + entity.posZ = z + 0.5D; + } else { + if (tile.isBurning()) { + entity.attackEntityFrom(DamageSource.inFire, 1.0F); + entity.setFire(2); + } + } + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityFirepit tile = (TileEntityFirepit) world.getTileEntity(x, y, z); + if (tile != null) { + int charcoal = tile.getCharcoalDrop(); + + if (charcoal > 0) { + float xDrop = this.rand.nextFloat() * 0.8F + 0.1F; + float yDrop = this.rand.nextFloat() * 0.8F + 0.1F; + float zDrop = this.rand.nextFloat() * 0.8F + 0.1F; + + for (int c = 0; c < charcoal; c++) { + EntityItem drop = new EntityItem(world, x + xDrop, y + yDrop, z + zDrop, + new ItemStack(Items.coal, 1, 1)); + + float jumpFactor = 0.05F; + drop.motionX = (float) this.rand.nextGaussian() * jumpFactor; + drop.motionY = (float) this.rand.nextGaussian() * jumpFactor + 0.2F; + drop.motionZ = (float) this.rand.nextGaussian() * jumpFactor; + world.spawnEntityInWorld(drop); + } + } + } + super.breakBlock(world, x, y, z, block, meta); + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockFrame.java b/src/main/java/minefantasy/mf2/block/crafting/BlockFrame.java index 200e4125..aec9ffb9 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockFrame.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockFrame.java @@ -13,125 +13,124 @@ import net.minecraftforge.common.util.ForgeDirection; public class BlockFrame extends BasicBlockMF { - public boolean isCogworkHolder = false; - - public BlockFrame(String name) { - this(name, null); - } - - public BlockFrame(String name, Object drop) { - super(name, Material.iron, drop); - setBlockTextureName("minefantasy2:metal/" + name); - this.setCreativeTab(CreativeTabMF.tabGadget); - this.setHardness(1.0F); - this.setResistance(3.0F); - } - - public BlockFrame setCogworkHolder() { - isCogworkHolder = true; - this.setCreativeTab(null); - return this; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public void setBlockBoundsForItemRender() { - if (isCogworkHolder) { - this.setBlockBounds(0F, 0F, 0F, 1F, 1F - offset, 1F); - return; - } - this.setBlockBounds(offset, offset, offset, 1 - offset, 1 - offset, 1 - offset); - } - - public static final float offset = 0.28125F; - - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - if (isCogworkHolder) { - this.setBlockBounds(0F, 0F, 0F, 1F, 1F - offset, 1F); - return; - } - boolean mz = this.canInteract(world, x, y, z - 1); - boolean pz = this.canInteract(world, x, y, z + 1); - boolean mx = this.canInteract(world, x - 1, y, z); - boolean px = this.canInteract(world, x + 1, y, z); - boolean my = this.canInteract(world, x, y - 1, z, true); - boolean py = this.canInteract(world, x, y + 1, z); - - float xstart = offset; - float xend = 1 - offset; - float zstart = offset; - float zend = 1 - offset; - float ystart = offset; - float yend = 1 - offset; - - if (mz) { - zstart = 0.0F; - } - - if (pz) { - zend = 1.0F; - } - - if (mx) { - xstart = 0.0F; - } - - if (px) { - xend = 1.0F; - } - - if (my) { - ystart = 0.0F; - } - - if (py) { - yend = 1.0F; - } - - this.setBlockBounds(xstart, ystart, zstart, xend, yend, zend); - } - - public boolean canInteract(IBlockAccess world, int x, int y, int z) { - return canInteract(world, x, y, z, false); - } - - public boolean canInteract(IBlockAccess world, int x, int y, int z, boolean floor) { - if (floor && world.getBlock(x, y, z).isSideSolid(world, x, y, z, ForgeDirection.UP)) { - return true; - } - return world.getBlock(x, y, z) instanceof BlockFrame; - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, - float f2) { - if (ToolHelper.getCrafterTool(player.getHeldItem()).equalsIgnoreCase("spanner")) { - return tryBuild(player, world, x, y, z); - } - return false; - } - - private boolean tryBuild(EntityPlayer player, World world, int x, int y, int z) { - if (PowerArmour.isBasicStationFrame(world, x, y, z) - && (player.capabilities.isCreativeMode || player.inventory.hasItem(ComponentListMF.cogwork_pulley))) { - if (!player.capabilities.isCreativeMode) { - player.inventory.consumeInventoryItem(ComponentListMF.cogwork_pulley); - } - if (!world.isRemote) { - world.setBlock(x, y, z, BlockListMF.cogwork_builder, 0, 2); - } - return true; - } - return false; - } + public static final float offset = 0.28125F; + public boolean isCogworkHolder = false; + + public BlockFrame(String name) { + this(name, null); + } + + public BlockFrame(String name, Object drop) { + super(name, Material.iron, drop); + setBlockTextureName("minefantasy2:metal/" + name); + this.setCreativeTab(CreativeTabMF.tabGadget); + this.setHardness(1.0F); + this.setResistance(3.0F); + } + + public BlockFrame setCogworkHolder() { + isCogworkHolder = true; + this.setCreativeTab(null); + return this; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public void setBlockBoundsForItemRender() { + if (isCogworkHolder) { + this.setBlockBounds(0F, 0F, 0F, 1F, 1F - offset, 1F); + return; + } + this.setBlockBounds(offset, offset, offset, 1 - offset, 1 - offset, 1 - offset); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + if (isCogworkHolder) { + this.setBlockBounds(0F, 0F, 0F, 1F, 1F - offset, 1F); + return; + } + boolean mz = this.canInteract(world, x, y, z - 1); + boolean pz = this.canInteract(world, x, y, z + 1); + boolean mx = this.canInteract(world, x - 1, y, z); + boolean px = this.canInteract(world, x + 1, y, z); + boolean my = this.canInteract(world, x, y - 1, z, true); + boolean py = this.canInteract(world, x, y + 1, z); + + float xstart = offset; + float xend = 1 - offset; + float zstart = offset; + float zend = 1 - offset; + float ystart = offset; + float yend = 1 - offset; + + if (mz) { + zstart = 0.0F; + } + + if (pz) { + zend = 1.0F; + } + + if (mx) { + xstart = 0.0F; + } + + if (px) { + xend = 1.0F; + } + + if (my) { + ystart = 0.0F; + } + + if (py) { + yend = 1.0F; + } + + this.setBlockBounds(xstart, ystart, zstart, xend, yend, zend); + } + + public boolean canInteract(IBlockAccess world, int x, int y, int z) { + return canInteract(world, x, y, z, false); + } + + public boolean canInteract(IBlockAccess world, int x, int y, int z, boolean floor) { + if (floor && world.getBlock(x, y, z).isSideSolid(world, x, y, z, ForgeDirection.UP)) { + return true; + } + return world.getBlock(x, y, z) instanceof BlockFrame; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + if (ToolHelper.getCrafterTool(player.getHeldItem()).equalsIgnoreCase("spanner")) { + return tryBuild(player, world, x, y, z); + } + return false; + } + + private boolean tryBuild(EntityPlayer player, World world, int x, int y, int z) { + if (PowerArmour.isBasicStationFrame(world, x, y, z) + && (player.capabilities.isCreativeMode || player.inventory.hasItem(ComponentListMF.cogwork_pulley))) { + if (!player.capabilities.isCreativeMode) { + player.inventory.consumeInventoryItem(ComponentListMF.cogwork_pulley); + } + if (!world.isRemote) { + world.setBlock(x, y, z, BlockListMF.cogwork_builder, 0, 2); + } + return true; + } + return false; + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockRepairKit.java b/src/main/java/minefantasy/mf2/block/crafting/BlockRepairKit.java index 5a7867fa..83a17171 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockRepairKit.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockRepairKit.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -15,105 +13,106 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class BlockRepairKit extends Block { - protected float repairLevel; - protected float successRate; - protected float breakChance; - protected IIcon top, side, bottom; - private String type; - protected boolean isOrnate = false; - protected float repairLevelEnchant = 0.0F; - - public BlockRepairKit(String name, float repairLevel, float rate, float breakChance) { - super(Material.cloth); - - this.repairLevel = repairLevel; - this.successRate = rate; - this.breakChance = breakChance; - this.type = name; - setBlockBounds(1F / 16F, 0F, 1F / 16F, 15F / 16F, 6F / 16F, 15F / 16F); - - this.setBlockTextureName("minefantasy2:processor/" + "repair_" + name + "+top"); - name = "repair_" + name; - GameRegistry.registerBlock(this, ItemBlockRepairKit.class, name); - setBlockName(name); - this.setStepSound(Block.soundTypeCloth); - this.setHardness(1F); - this.setResistance(0F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabGadget); - } - - public BlockRepairKit setOrnate(float enc) { - repairLevelEnchant = enc; - isOrnate = true; - return this; - } - - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) { - return side == 1 ? this.top : (side == 0 ? this.bottom : this.side); - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - this.side = reg.registerIcon("minefantasy2:processor/repair_" + type + "_side"); - this.top = reg.registerIcon("minefantasy2:processor/repair_" + type + "_top"); - this.bottom = reg.registerIcon("minefantasy2:processor/repair_" + type + "_base"); - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - private Random rand = new Random(); - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - if (world.isRemote) { - return true; - } - ItemStack held = user.getHeldItem(); - // held.getItem().isRepairable() Was used but new MF tools disable this to avoid - // vanilla repairs - if (held != null && canRepair(held) && (!held.isItemEnchanted() || isOrnate)) { - if (rand.nextFloat() < successRate) { - boolean broken = rand.nextFloat() < breakChance; - - float lvl = held.isItemEnchanted() ? repairLevelEnchant : repairLevel; - int repairAmount = (int) (held.getMaxDamage() * lvl); - held.setItemDamage(Math.max(0, held.getItemDamage() - repairAmount)); - world.playAuxSFX(broken ? 1020 : 1021, x, y, z, 0); - - if (broken) { - world.playSoundEffect(x + 0.5D, y + 0.3D, z + 0.5D, "random.break", 1.0F, 1.0F); - world.setBlockToAir(x, y, z); - } - return true; - } else { - world.playSoundEffect(x + 0.5D, y + 0.3D, z + 0.5D, "step.cloth", 0.5F, 0.5F); - } - return true; - } - return false; - } +import java.util.Random; - private boolean canRepair(ItemStack held) { - if (held == null) - return false; - if (held.getItem().isDamageable() && CustomToolHelper.getCustomPrimaryMaterial(held) != null)// Custom Tool - { - return held.isItemDamaged(); - } - return held.getItem().isRepairable(); - } +public class BlockRepairKit extends Block { + protected float repairLevel; + protected float successRate; + protected float breakChance; + protected IIcon top, side, bottom; + protected boolean isOrnate = false; + protected float repairLevelEnchant = 0.0F; + private String type; + private Random rand = new Random(); + + public BlockRepairKit(String name, float repairLevel, float rate, float breakChance) { + super(Material.cloth); + + this.repairLevel = repairLevel; + this.successRate = rate; + this.breakChance = breakChance; + this.type = name; + setBlockBounds(1F / 16F, 0F, 1F / 16F, 15F / 16F, 6F / 16F, 15F / 16F); + + this.setBlockTextureName("minefantasy2:processor/" + "repair_" + name + "+top"); + name = "repair_" + name; + GameRegistry.registerBlock(this, ItemBlockRepairKit.class, name); + setBlockName(name); + this.setStepSound(Block.soundTypeCloth); + this.setHardness(1F); + this.setResistance(0F); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabGadget); + } + + public BlockRepairKit setOrnate(float enc) { + repairLevelEnchant = enc; + isOrnate = true; + return this; + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + return side == 1 ? this.top : (side == 0 ? this.bottom : this.side); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + this.side = reg.registerIcon("minefantasy2:processor/repair_" + type + "_side"); + this.top = reg.registerIcon("minefantasy2:processor/repair_" + type + "_top"); + this.bottom = reg.registerIcon("minefantasy2:processor/repair_" + type + "_base"); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (world.isRemote) { + return true; + } + ItemStack held = user.getHeldItem(); + // held.getItem().isRepairable() Was used but new MF tools disable this to avoid + // vanilla repairs + if (held != null && canRepair(held) && (!held.isItemEnchanted() || isOrnate)) { + if (rand.nextFloat() < successRate) { + boolean broken = rand.nextFloat() < breakChance; + + float lvl = held.isItemEnchanted() ? repairLevelEnchant : repairLevel; + int repairAmount = (int) (held.getMaxDamage() * lvl); + held.setItemDamage(Math.max(0, held.getItemDamage() - repairAmount)); + world.playAuxSFX(broken ? 1020 : 1021, x, y, z, 0); + + if (broken) { + world.playSoundEffect(x + 0.5D, y + 0.3D, z + 0.5D, "random.break", 1.0F, 1.0F); + world.setBlockToAir(x, y, z); + } + return true; + } else { + world.playSoundEffect(x + 0.5D, y + 0.3D, z + 0.5D, "step.cloth", 0.5F, 0.5F); + } + return true; + } + return false; + } + + private boolean canRepair(ItemStack held) { + if (held == null) + return false; + if (held.getItem().isDamageable() && CustomToolHelper.getCustomPrimaryMaterial(held) != null)// Custom Tool + { + return held.isItemDamaged(); + } + return held.getItem().isRepairable(); + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockResearchStation.java b/src/main/java/minefantasy/mf2/block/crafting/BlockResearchStation.java index ee20cf4b..12d84373 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockResearchStation.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockResearchStation.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,134 +22,135 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Random; + public class BlockResearchStation extends BlockContainer { - public static int research_RI = 106; - private int tier = 0; - - public BlockResearchStation() { - super(Material.wood); - - GameRegistry.registerBlock(this, "MF_Research"); - setBlockName("researchStation"); - this.setStepSound(Block.soundTypeWood); - this.setHardness(5F); - this.setResistance(2F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - TileEntityResearch tile = getTile(world, x, y, z); - if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { - if (!(side == 1 && tile.interact(user))) { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { - TileEntityResearch tile = getTile(world, x, y, z); - if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { - tile.interact(user); - } - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityResearch(); - } - - private TileEntityResearch getTile(World world, int x, int y, int z) { - return (TileEntityResearch) world.getTileEntity(x, y, z); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return Blocks.crafting_table.getIcon(side, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - - } - - @Override - public int getRenderType() { - return research_RI; - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityResearch tile = getTile(world, x, y, z); - - if (tile != null) { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - private Random rand = new Random(); + public static int research_RI = 106; + private int tier = 0; + private Random rand = new Random(); + + public BlockResearchStation() { + super(Material.wood); + + GameRegistry.registerBlock(this, "MF_Research"); + setBlockName("researchStation"); + this.setStepSound(Block.soundTypeWood); + this.setHardness(5F); + this.setResistance(2F); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + TileEntityResearch tile = getTile(world, x, y, z); + if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { + if (!(side == 1 && tile.interact(user))) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + TileEntityResearch tile = getTile(world, x, y, z); + if (tile != null && (world.isAirBlock(x, y + 1, z) || !world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN))) { + tile.interact(user); + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityResearch(); + } + + private TileEntityResearch getTile(World world, int x, int y, int z) { + return (TileEntityResearch) world.getTileEntity(x, y, z); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return Blocks.crafting_table.getIcon(side, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + + @Override + public int getRenderType() { + return research_RI; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityResearch tile = getTile(world, x, y, z); + + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockRoast.java b/src/main/java/minefantasy/mf2/block/crafting/BlockRoast.java index ce5f117a..bfa9c49d 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockRoast.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockRoast.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -22,128 +20,129 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.Random; + public class BlockRoast extends BlockContainer { - public static int roast_RI = 113; - private boolean isOven; - private int tier; - public String tex; - - public BlockRoast(int tier, String tex, boolean isOven) { - super(Material.rock); - this.isOven = isOven; - this.tex = tex; - this.tier = tier; - String name = "food_" + (isOven ? "oven" : "roast") + "_" + tex; - this.setBlockName(name); - GameRegistry.registerBlock(this, name); - this.setHardness(1.5F); - this.setResistance(1F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - if (isOven) { - setBlockBounds(3F / 16F, 0F, 3F / 16F, 13F / 16F, 1F / 1.6F, 13F / 16F); - } else { - setBlockBounds(3F / 16F, 0F, 3F / 16F, 13F / 16F, 0.125F, 13F / 16F); - } - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityRoast(); - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, dir, 2); - } - - public TileEntityRoast getTile(World world, int x, int y, int z) { - return (TileEntityRoast) world.getTileEntity(x, y, z); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - TileEntityRoast tile = getTile(world, x, y, z); - if (tile != null) { - return tile.interact(user); - } - return true; - } - - public Random rand = new Random(); - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityRoast tile = getTile(world, x, y, z); - - if (tile != null) { - ItemStack itemstack = tile.items[0]; - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return Blocks.anvil.getIcon(side, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - public boolean isOven() { - return isOven; - } - - @Override - public int getRenderType() { - return isOven ? roast_RI : super.getRenderType(); - } + public static int roast_RI = 113; + public String tex; + public Random rand = new Random(); + private boolean isOven; + private int tier; + + public BlockRoast(int tier, String tex, boolean isOven) { + super(Material.rock); + this.isOven = isOven; + this.tex = tex; + this.tier = tier; + String name = "food_" + (isOven ? "oven" : "roast") + "_" + tex; + this.setBlockName(name); + GameRegistry.registerBlock(this, name); + this.setHardness(1.5F); + this.setResistance(1F); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + if (isOven) { + setBlockBounds(3F / 16F, 0F, 3F / 16F, 13F / 16F, 1F / 1.6F, 13F / 16F); + } else { + setBlockBounds(3F / 16F, 0F, 3F / 16F, 13F / 16F, 0.125F, 13F / 16F); + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityRoast(); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, dir, 2); + } + + public TileEntityRoast getTile(World world, int x, int y, int z) { + return (TileEntityRoast) world.getTileEntity(x, y, z); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + TileEntityRoast tile = getTile(world, x, y, z); + if (tile != null) { + return tile.interact(user); + } + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityRoast tile = getTile(world, x, y, z); + + if (tile != null) { + ItemStack itemstack = tile.items[0]; + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return Blocks.anvil.getIcon(side, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + public boolean isOven() { + return isOven; + } + + @Override + public int getRenderType() { + return isOven ? roast_RI : super.getRenderType(); + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java b/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java index 537db70b..cdd0ffbf 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java @@ -1,9 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,107 +20,100 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + public class BlockSalvage extends Block { - protected float dropLevel; - protected IIcon top, side, bottom; - private String type; - - public BlockSalvage(String name, float dropLevel) { - super(Material.wood); - - this.dropLevel = dropLevel; - this.type = name; - - this.setBlockTextureName("minefantasy2:processor/" + "salvage_" + name + "+top"); - name = "salvage_" + name; - GameRegistry.registerBlock(this, ItemBlockSalvage.class, name); - setBlockName(name); - this.setStepSound(Block.soundTypeAnvil); - this.setHardness(2F); - this.setResistance(1F); - this.setCreativeTab(CreativeTabMF.tabGadget); - } - - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) { - return side == 1 ? this.top : (side == 0 ? this.bottom : this.side); - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - this.side = reg.registerIcon("minefantasy2:processor/salvage_" + type + "_side"); - this.top = reg.registerIcon("minefantasy2:processor/salvage_" + type + "_top"); - this.bottom = reg.registerIcon("minefantasy2:processor/salvage_" + type + "_base"); - } - - private Random rand = new Random(); - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - if (world.isRemote) { - return true; - } - ItemStack held = user.getHeldItem(); - String toolType = ToolHelper.getCrafterTool(held); + protected float dropLevel; + protected IIcon top, side, bottom; + private String type; + private Random rand = new Random(); + + public BlockSalvage(String name, float dropLevel) { + super(Material.wood); + + this.dropLevel = dropLevel; + this.type = name; + + this.setBlockTextureName("minefantasy2:processor/" + "salvage_" + name + "+top"); + name = "salvage_" + name; + GameRegistry.registerBlock(this, ItemBlockSalvage.class, name); + setBlockName(name); + this.setStepSound(Block.soundTypeAnvil); + this.setHardness(2F); + this.setResistance(1F); + this.setCreativeTab(CreativeTabMF.tabGadget); + } + + public static float getPlayerDropLevel(EntityPlayer user) { + float rate = 1.0F; + + if (RPGElements.isSystemActive) { + int lvl = RPGElements.getLevel(user, SkillList.artisanry); + if (lvl > 10) { + rate += ((lvl - 10) * 0.01F); + } + } + if (ResearchLogic.hasInfoUnlocked(user, "scrapper")) { + rate += 0.5F; + } + + return rate; + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + return side == 1 ? this.top : (side == 0 ? this.bottom : this.side); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + this.side = reg.registerIcon("minefantasy2:processor/salvage_" + type + "_side"); + this.top = reg.registerIcon("minefantasy2:processor/salvage_" + type + "_top"); + this.bottom = reg.registerIcon("minefantasy2:processor/salvage_" + type + "_base"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (world.isRemote) { + return true; + } + ItemStack held = user.getHeldItem(); + String toolType = ToolHelper.getCrafterTool(held); /* - * Block above = world.getBlock(x, y+1, z); if(above != null) { + * Block above = world.getBlock(x, y+1, z); if(above != null) { * if(salvageBlock(world, user, above, x, y, z)) { world.setBlockToAir(x, y+1, * z); return true; } } */ - EntityItem drop = getDrop(world, x, y, z); - if (drop != null && !user.isSwingInProgress) { - ItemStack junk = drop.getEntityItem(); - int amount = Math.min(junk.stackSize, 4); - - for (int a = 0; a < amount; a++) { - if (salvageItem(world, user, junk, x, y, z)) { - if (junk.stackSize == 1) { - AmmoMechanicsMF.dropAmmo(world, junk, x + 0.5D, y + 1.25D, z + 0.5D); - AmmoMechanicsMF.dropAmmoCrate(world, junk, x + 0.5D, y + 1.25D, z + 0.5D); - } - - --drop.getEntityItem().stackSize; - if (drop.getEntityItem().stackSize <= 0) { - drop.setDead(); - return true; - } - } - } - return true; - } - return false; - } - - private boolean salvageItem(World world, EntityPlayer user, ItemStack junk, int x, int y, int z) { - float modifier = 0.5F; - ItemStack held = user.getHeldItem(); - String type = ToolHelper.getCrafterTool(held); - float efficiency = ToolHelper.getCrafterEfficiency(held); - if (type.equalsIgnoreCase("saw")) { - modifier += (efficiency * 0.1F); - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "minefantasy2:block.sawcarpenter", 2F, 1F); - } - if (type.equalsIgnoreCase("hammer") || type.equalsIgnoreCase("hvyhammer")) { - modifier += (efficiency * 0.05F); - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "minefantasy2:block.anvilsucceed", 1F, 1F); - } - - List salvage = Salvage.salvage(user, junk, dropLevel * getPlayerDropLevel(user) * modifier); - - if (salvage != null) { - dropSalvage(world, x, y, z, salvage, junk); - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "random.break", 1F, 1F); - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "mob.zombie.woodbreak", 0.5F, 1.5F); - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "dig.glass", 1.0F, 0.5F); - return true; - } - return false; - } + EntityItem drop = getDrop(world, x, y, z); + if (drop != null && !user.isSwingInProgress) { + ItemStack junk = drop.getEntityItem(); + int amount = Math.min(junk.stackSize, 4); + + for (int a = 0; a < amount; a++) { + if (salvageItem(world, user, junk, x, y, z)) { + if (junk.stackSize == 1) { + AmmoMechanicsMF.dropAmmo(world, junk, x + 0.5D, y + 1.25D, z + 0.5D); + AmmoMechanicsMF.dropAmmoCrate(world, junk, x + 0.5D, y + 1.25D, z + 0.5D); + } + + --drop.getEntityItem().stackSize; + if (drop.getEntityItem().stackSize <= 0) { + drop.setDead(); + return true; + } + } + } + return true; + } + return false; + } /* * private boolean salvageBlock(World world, EntityPlayer user, Block junk, int * x, int y, int z) { List salvage = Salvage.salvageBlock(junk, @@ -134,50 +123,60 @@ private boolean salvageItem(World world, EntityPlayer user, ItemStack junk, int * world.playAuxSFX(1021, x, y, z, 0); return true; } return false; } */ - public static float getPlayerDropLevel(EntityPlayer user) { - float rate = 1.0F; - - if (RPGElements.isSystemActive) { - int lvl = RPGElements.getLevel(user, SkillList.artisanry); - if (lvl > 10) { - rate += ((lvl - 10) * 0.01F); - } - } - if (ResearchLogic.hasInfoUnlocked(user, "scrapper")) { - rate += 0.5F; - } - - return rate; - } - - private void dropSalvage(World world, int x, int y, int z, List salvage, ItemStack junk) { - Iterator iterator = salvage.iterator(); - while (iterator.hasNext()) { - ItemStack drop = (ItemStack) iterator.next(); - if (drop != null)// && !user.inventory.addItemStackToInventory(drop)) - { - entityDropItem(world, x, y, z, drop); - } - } - } - - public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) { - if (item.stackSize != 0 && item.getItem() != null) { - EntityItem entityitem = new EntityItem(world, x + 0.5D, y + 1.25D, z + 0.5D, item); - entityitem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(entityitem); - return entityitem; - } else { - return null; - } - } - - private EntityItem getDrop(World world, int x, int y, int z) { - AxisAlignedBB box = AxisAlignedBB.getBoundingBox(x + 0.1D, y + 1D, z + 0.1D, x + 0.9D, y + 1.5D, z + 0.9D); - List drops = world.getEntitiesWithinAABB(EntityItem.class, box); - if (drops != null && !drops.isEmpty()) { - return (drops.get(0)); - } - return null; - } + private boolean salvageItem(World world, EntityPlayer user, ItemStack junk, int x, int y, int z) { + float modifier = 0.5F; + ItemStack held = user.getHeldItem(); + String type = ToolHelper.getCrafterTool(held); + float efficiency = ToolHelper.getCrafterEfficiency(held); + if (type.equalsIgnoreCase("saw")) { + modifier += (efficiency * 0.1F); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "minefantasy2:block.sawcarpenter", 2F, 1F); + } + if (type.equalsIgnoreCase("hammer") || type.equalsIgnoreCase("hvyhammer")) { + modifier += (efficiency * 0.05F); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "minefantasy2:block.anvilsucceed", 1F, 1F); + } + + List salvage = Salvage.salvage(user, junk, dropLevel * getPlayerDropLevel(user) * modifier); + + if (salvage != null) { + dropSalvage(world, x, y, z, salvage, junk); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "random.break", 1F, 1F); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "mob.zombie.woodbreak", 0.5F, 1.5F); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "dig.glass", 1.0F, 0.5F); + return true; + } + return false; + } + + private void dropSalvage(World world, int x, int y, int z, List salvage, ItemStack junk) { + Iterator iterator = salvage.iterator(); + while (iterator.hasNext()) { + ItemStack drop = (ItemStack) iterator.next(); + if (drop != null)// && !user.inventory.addItemStackToInventory(drop)) + { + entityDropItem(world, x, y, z, drop); + } + } + } + + public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) { + if (item.stackSize != 0 && item.getItem() != null) { + EntityItem entityitem = new EntityItem(world, x + 0.5D, y + 1.25D, z + 0.5D, item); + entityitem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(entityitem); + return entityitem; + } else { + return null; + } + } + + private EntityItem getDrop(World world, int x, int y, int z) { + AxisAlignedBB box = AxisAlignedBB.getBoundingBox(x + 0.1D, y + 1D, z + 0.1D, x + 0.9D, y + 1.5D, z + 0.9D); + List drops = world.getEntitiesWithinAABB(EntityItem.class, box); + if (drops != null && !drops.isEmpty()) { + return (drops.get(0)); + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockTanningRack.java b/src/main/java/minefantasy/mf2/block/crafting/BlockTanningRack.java index cb943042..9b899629 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockTanningRack.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockTanningRack.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -22,127 +20,128 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.Random; + public class BlockTanningRack extends BlockContainer { - public static int tanner_RI = 103; - - public int tier; - public String tex; - - public BlockTanningRack(int tier, String tex) { - super(Material.wood); - - this.tier = tier; - this.tex = tex; - String name = "tanner" + tex; - this.setBlockName(name); - GameRegistry.registerBlock(this, name); - this.setHardness(1F + 0.5F * tier); - this.setResistance(1F); - this.setLightOpacity(0); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityTanningRack(tier, tex); - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, dir, 2); - } - - public TileEntityTanningRack getTile(World world, int x, int y, int z) { - return (TileEntityTanningRack) world.getTileEntity(x, y, z); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - TileEntityTanningRack tile = getTile(world, x, y, z); - if (tile != null) { - return tile.interact(user, false, false); - } - return true; - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { - TileEntityTanningRack tile = getTile(world, x, y, z); - if (tile != null) { - tile.interact(user, true, false); - } - } - - public Random rand = new Random(); - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityTanningRack tile = getTile(world, x, y, z); - - if (tile != null) { - ItemStack itemstack = tile.items[0]; - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return Blocks.planks.getIcon(side, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public int getRenderType() { - return tanner_RI; - } + public static int tanner_RI = 103; + + public int tier; + public String tex; + public Random rand = new Random(); + + public BlockTanningRack(int tier, String tex) { + super(Material.wood); + + this.tier = tier; + this.tex = tex; + String name = "tanner" + tex; + this.setBlockName(name); + GameRegistry.registerBlock(this, name); + this.setHardness(1F + 0.5F * tier); + this.setResistance(1F); + this.setLightOpacity(0); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityTanningRack(tier, tex); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int dir = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, dir, 2); + } + + public TileEntityTanningRack getTile(World world, int x, int y, int z) { + return (TileEntityTanningRack) world.getTileEntity(x, y, z); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + TileEntityTanningRack tile = getTile(world, x, y, z); + if (tile != null) { + return tile.interact(user, false, false); + } + return true; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + TileEntityTanningRack tile = getTile(world, x, y, z); + if (tile != null) { + tile.interact(user, true, false); + } + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityTanningRack tile = getTile(world, x, y, z); + + if (tile != null) { + ItemStack itemstack = tile.items[0]; + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public int getRenderType() { + return tanner_RI; + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockAnvilMF.java b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockAnvilMF.java index 33ab4f80..43433a68 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockAnvilMF.java +++ b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockAnvilMF.java @@ -1,24 +1,24 @@ package minefantasy.mf2.block.crafting; -import java.util.List; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import java.util.List; + public class ItemBlockAnvilMF extends ItemBlock { - private BlockAnvilMF anvil; + private BlockAnvilMF anvil; - public ItemBlockAnvilMF(Block block) { - super(block); - this.anvil = (BlockAnvilMF) block; - } + public ItemBlockAnvilMF(Block block) { + super(block); + this.anvil = (BlockAnvilMF) block; + } - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - list.add(StatCollector.translateToLocal("attribute.mfcrafttier.name") + ": " + anvil.getTier()); - super.addInformation(item, user, list, extra); - } + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + list.add(StatCollector.translateToLocal("attribute.mfcrafttier.name") + ": " + anvil.getTier()); + super.addInformation(item, user, list, extra); + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockRepairKit.java b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockRepairKit.java index 4a22eb83..e172aad6 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockRepairKit.java +++ b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockRepairKit.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.List; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; @@ -9,41 +7,43 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import java.util.List; + public class ItemBlockRepairKit extends ItemBlock { - private BlockRepairKit kit; + private BlockRepairKit kit; - public ItemBlockRepairKit(Block base) { - super(base); - this.setMaxStackSize(8); - this.kit = (BlockRepairKit) base; - } + public ItemBlockRepairKit(Block base) { + super(base); + this.setMaxStackSize(8); + this.kit = (BlockRepairKit) base; + } - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (kit.isOrnate) { - list.add(StatCollector.translateToLocal("attribute.kit.repairRate_normal.name") + ": " - + kit.repairLevel * 100F + "%"); - list.add(StatCollector.translateToLocal("attribute.kit.repairRate_enchant.name") + ": " - + kit.repairLevelEnchant * 100F + "%"); - } else { - list.add(StatCollector.translateToLocal("attribute.kit.repairRate.name") + ": " + kit.repairLevel * 100F - + "%"); - } - list.add(StatCollector.translateToLocal("attribute.kit.repairChance.name") + ": " + kit.successRate * 100F - + "%"); - list.add( - StatCollector.translateToLocal("attribute.kit.breakChance.name") + ": " + kit.breakChance * 100F + "%"); - super.addInformation(item, user, list, extra); - } + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (kit.isOrnate) { + list.add(StatCollector.translateToLocal("attribute.kit.repairRate_normal.name") + ": " + + kit.repairLevel * 100F + "%"); + list.add(StatCollector.translateToLocal("attribute.kit.repairRate_enchant.name") + ": " + + kit.repairLevelEnchant * 100F + "%"); + } else { + list.add(StatCollector.translateToLocal("attribute.kit.repairRate.name") + ": " + kit.repairLevel * 100F + + "%"); + } + list.add(StatCollector.translateToLocal("attribute.kit.repairChance.name") + ": " + kit.successRate * 100F + + "%"); + list.add( + StatCollector.translateToLocal("attribute.kit.breakChance.name") + ": " + kit.breakChance * 100F + "%"); + super.addInformation(item, user, list, extra); + } - @Override - public EnumRarity getRarity(ItemStack item) { - if (kit.isOrnate) { - return EnumRarity.rare; - } - if (kit.repairLevel >= 1.0F) { - return EnumRarity.uncommon; - } - return super.getRarity(item); - } + @Override + public EnumRarity getRarity(ItemStack item) { + if (kit.isOrnate) { + return EnumRarity.rare; + } + if (kit.repairLevel >= 1.0F) { + return EnumRarity.uncommon; + } + return super.getRarity(item); + } } diff --git a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockSalvage.java b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockSalvage.java index f7fd545b..9753af5a 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/ItemBlockSalvage.java +++ b/src/main/java/minefantasy/mf2/block/crafting/ItemBlockSalvage.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.crafting; -import java.util.List; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; @@ -9,23 +7,25 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import java.util.List; + public class ItemBlockSalvage extends ItemBlock { - private BlockSalvage kit; + private BlockSalvage kit; - public ItemBlockSalvage(Block base) { - super(base); - this.setMaxStackSize(8); - this.kit = (BlockSalvage) base; - } + public ItemBlockSalvage(Block base) { + super(base); + this.setMaxStackSize(8); + this.kit = (BlockSalvage) base; + } - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - list.add(StatCollector.translateToLocal("attribute.kit.salvage.name") + ": " + kit.dropLevel); - super.addInformation(item, user, list, extra); - } + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + list.add(StatCollector.translateToLocal("attribute.kit.salvage.name") + ": " + kit.dropLevel); + super.addInformation(item, user, list, extra); + } - @Override - public EnumRarity getRarity(ItemStack item) { - return super.getRarity(item); - } + @Override + public EnumRarity getRarity(ItemStack item) { + return super.getRarity(item); + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockAmmoBox.java b/src/main/java/minefantasy/mf2/block/decor/BlockAmmoBox.java index 16dd4525..46abeca9 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockAmmoBox.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockAmmoBox.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.decor; -import java.util.ArrayList; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -21,156 +18,156 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.Random; + public class BlockAmmoBox extends BlockWoodDecor { - public static int ammo_RI = 116; - /** - * Food-Ammo-All - */ - public final byte storageType; - public String name; - - public BlockAmmoBox(String name, byte storageType) { - this(name, name, storageType); - } - - /** - * @param storageType - * (Food, Ammo, All) - */ - public BlockAmmoBox(String name, String texName, byte storageType) { - super(texName); - this.storageType = storageType; - float width = (storageType == 0 ? 8F : storageType == 1 ? 14F : 16F) / 16F; - float height = (storageType == 0 ? 4F : storageType == 1 ? 8F : 9F) / 16F; - - float border = (1F - width) / 2; - this.setBlockBounds(border, 0F, border, 1 - border, height, 1 - border); - - this.name = name; - GameRegistry.registerBlock(this, ItemBlockAmmoBox.class, name); - setBlockName(name); - this.setHardness(0.5F); - this.setResistance(2F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public IIcon getIcon(int side, int meta) { - return Blocks.planks.getIcon(side, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - - } - - @SideOnly(Side.CLIENT) - public int getRenderType() { - return ammo_RI; - } - - public static final String NBT_Ammo = "Ammo", NBT_Stock = "Stock"; - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - - TileEntityAmmoBox tile = getTile(world, x, y, z); - if (tile != null) { - if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Ammo) - && item.getTagCompound().hasKey(NBT_Stock)) { - tile.ammo = ItemStack.loadItemStackFromNBT(item.getTagCompound().getCompoundTag(NBT_Ammo)); - tile.stock = item.getTagCompound().getInteger(NBT_Stock); - } - } - super.onBlockPlacedBy(world, x, y, z, user, item); - } - - public static ItemStack getHeld(ItemStack item, boolean removeTag) { - if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Ammo)) { - ItemStack i = ItemStack.loadItemStackFromNBT(item.getTagCompound().getCompoundTag(NBT_Ammo)); - if (removeTag) { - item.getTagCompound().removeTag(NBT_Ammo); - } - return i; - } - return null; - } - - public static int getStock(ItemStack item, boolean removeTag) { - if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Stock)) { - int i = item.getTagCompound().getInteger(NBT_Stock); - if (removeTag) { - item.getTagCompound().removeTag(NBT_Stock); - } - return i; - } - return 0; - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityAmmoBox(); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - ItemStack held = user.getHeldItem(); - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityAmmoBox) { - return ((TileEntityAmmoBox) tile).interact(user, held); - } - return false; - } - - private Random rand = new Random(); - - @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { - ArrayList ret = new ArrayList(); - return ret; - } - - @Override - protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { - return modifyAmmo((TileEntityAmmoBox) tile, super.modifyDrop(tile, item)); - } - - private ItemStack modifyAmmo(TileEntityAmmoBox tile, ItemStack item) { - if (tile != null && item != null) { - if (tile.ammo != null) { - NBTTagCompound nbt = new NBTTagCompound(); - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - tile.ammo.writeToNBT(nbt); - - MFLogUtil.logDebug("Added Drop: " + tile.ammo.getDisplayName() + " x" + tile.stock); - item.getTagCompound().setTag(NBT_Ammo, nbt); - item.getTagCompound().setInteger(NBT_Stock, tile.stock); - } - } - return item; - } - - private TileEntityAmmoBox getTile(World world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityAmmoBox) { - return (TileEntityAmmoBox) tile; - } - return null; - } + public static final String NBT_Ammo = "Ammo", NBT_Stock = "Stock"; + public static int ammo_RI = 116; + /** + * Food-Ammo-All + */ + public final byte storageType; + public String name; + private Random rand = new Random(); + + public BlockAmmoBox(String name, byte storageType) { + this(name, name, storageType); + } + + /** + * @param storageType (Food, Ammo, All) + */ + public BlockAmmoBox(String name, String texName, byte storageType) { + super(texName); + this.storageType = storageType; + float width = (storageType == 0 ? 8F : storageType == 1 ? 14F : 16F) / 16F; + float height = (storageType == 0 ? 4F : storageType == 1 ? 8F : 9F) / 16F; + + float border = (1F - width) / 2; + this.setBlockBounds(border, 0F, border, 1 - border, height, 1 - border); + + this.name = name; + GameRegistry.registerBlock(this, ItemBlockAmmoBox.class, name); + setBlockName(name); + this.setHardness(0.5F); + this.setResistance(2F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + public static ItemStack getHeld(ItemStack item, boolean removeTag) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Ammo)) { + ItemStack i = ItemStack.loadItemStackFromNBT(item.getTagCompound().getCompoundTag(NBT_Ammo)); + if (removeTag) { + item.getTagCompound().removeTag(NBT_Ammo); + } + return i; + } + return null; + } + + public static int getStock(ItemStack item, boolean removeTag) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Stock)) { + int i = item.getTagCompound().getInteger(NBT_Stock); + if (removeTag) { + item.getTagCompound().removeTag(NBT_Stock); + } + return i; + } + return 0; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + + @SideOnly(Side.CLIENT) + public int getRenderType() { + return ammo_RI; + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + + TileEntityAmmoBox tile = getTile(world, x, y, z); + if (tile != null) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_Ammo) + && item.getTagCompound().hasKey(NBT_Stock)) { + tile.ammo = ItemStack.loadItemStackFromNBT(item.getTagCompound().getCompoundTag(NBT_Ammo)); + tile.stock = item.getTagCompound().getInteger(NBT_Stock); + } + } + super.onBlockPlacedBy(world, x, y, z, user, item); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityAmmoBox(); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + ItemStack held = user.getHeldItem(); + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityAmmoBox) { + return ((TileEntityAmmoBox) tile).interact(user, held); + } + return false; + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList ret = new ArrayList(); + return ret; + } + + @Override + protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { + return modifyAmmo((TileEntityAmmoBox) tile, super.modifyDrop(tile, item)); + } + + private ItemStack modifyAmmo(TileEntityAmmoBox tile, ItemStack item) { + if (tile != null && item != null) { + if (tile.ammo != null) { + NBTTagCompound nbt = new NBTTagCompound(); + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + tile.ammo.writeToNBT(nbt); + + MFLogUtil.logDebug("Added Drop: " + tile.ammo.getDisplayName() + " x" + tile.stock); + item.getTagCompound().setTag(NBT_Ammo, nbt); + item.getTagCompound().setInteger(NBT_Stock, tile.stock); + } + } + return item; + } + + private TileEntityAmmoBox getTile(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityAmmoBox) { + return (TileEntityAmmoBox) tile; + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockBedMF.java b/src/main/java/minefantasy/mf2/block/decor/BlockBedMF.java index a1aeef23..2577c1ed 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockBedMF.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockBedMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.decor; -import java.util.Iterator; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,310 +21,313 @@ import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; +import java.util.Iterator; +import java.util.Random; + public class BlockBedMF extends BlockDirectional { - public static final int[][] field_149981_a = new int[][] { { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 } }; - @SideOnly(Side.CLIENT) - private IIcon[] endTex; - @SideOnly(Side.CLIENT) - private IIcon[] sideTex; - @SideOnly(Side.CLIENT) - private IIcon[] topTex; - @SideOnly(Side.CLIENT) - private IIcon baseTex; - - private float height = 0.25F; - - public BlockBedMF(String name) { - super(Material.cloth); - this.setBlockName(name); - GameRegistry.registerBlock(this, name + "_block"); - setBlockTextureName("minefantasy2:furnishings/" + name); - this.resetBounds(); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int meta, float fx, float fy, - float fz) { - if (world.isRemote) { - return true; - } else { - int i1 = world.getBlockMetadata(x, y, z); - - if (!isBlockHeadOfBed(i1)) { - int j1 = getDirection(i1); - x += field_149981_a[j1][0]; - z += field_149981_a[j1][1]; - - if (world.getBlock(x, y, z) != this) { - return true; - } - - i1 = world.getBlockMetadata(x, y, z); - } - - if (world.provider.canRespawnHere() && world.getBiomeGenForCoords(x, z) != BiomeGenBase.hell) { - if (func_149976_c(i1)) { - EntityPlayer entityplayer1 = null; - Iterator iterator = world.playerEntities.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer2 = (EntityPlayer) iterator.next(); - - if (entityplayer2.isPlayerSleeping()) { - ChunkCoordinates chunkcoordinates = entityplayer2.playerLocation; - - if (chunkcoordinates.posX == x && chunkcoordinates.posY == y - && chunkcoordinates.posZ == z) { - entityplayer1 = entityplayer2; - } - } - } - - if (entityplayer1 != null) { - user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.occupied", new Object[0])); - return true; - } - - setState(world, x, y, z, false); - } - - EntityPlayer.EnumStatus enumstatus = user.sleepInBedAt(x, y, z); - - if (enumstatus == EntityPlayer.EnumStatus.OK) { - setState(world, x, y, z, true); - PlayerTickHandlerMF.readyToResetBedPosition(user); - return true; - } else { - if (enumstatus == EntityPlayer.EnumStatus.NOT_POSSIBLE_NOW) { - user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.noSleep", new Object[0])); - } else if (enumstatus == EntityPlayer.EnumStatus.NOT_SAFE) { - user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.notSafe", new Object[0])); - } - - return true; - } - } else { - double d2 = x + 0.5D; - double d0 = y + 0.5D; - double d1 = z + 0.5D; - world.setBlockToAir(x, y, z); - int k1 = getDirection(i1); - x += field_149981_a[k1][0]; - z += field_149981_a[k1][1]; - - if (world.getBlock(x, y, z) == this) { - world.setBlockToAir(x, y, z); - d2 = (d2 + x + 0.5D) / 2.0D; - d0 = (d0 + y + 0.5D) / 2.0D; - d1 = (d1 + z + 0.5D) / 2.0D; - } - - world.newExplosion((Entity) null, x + 0.5F, y + 0.5F, z + 0.5F, 5.0F, true, true); - return true; - } - } - } - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) { - if (side == 0) { - return baseTex; - } else { - int k = getDirection(meta); - int l = Direction.bedDirection[k][side]; - int i1 = isBlockHeadOfBed(meta) ? 1 : 0; - return (i1 != 1 || l != 2) && (i1 != 0 || l != 3) ? (l != 5 && l != 4 ? this.topTex[i1] : this.sideTex[i1]) - : this.endTex[i1]; - } - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister register) { - this.topTex = new IIcon[] { register.registerIcon(this.getTextureName() + "_feet_top"), - register.registerIcon(this.getTextureName() + "_head_top") }; - this.endTex = new IIcon[] { register.registerIcon(this.getTextureName() + "_feet_end"), - register.registerIcon(this.getTextureName() + "_head_end") }; - this.sideTex = new IIcon[] { register.registerIcon(this.getTextureName() + "_feet_side"), - register.registerIcon(this.getTextureName() + "_head_side") }; - this.baseTex = register.registerIcon(this.getTextureName() + "_base"); - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() { - return 14; - } - - /** - * If this block doesn't render as an ordinary block it will return False - * (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() { - return false; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or - * not to render the shared face of two adjacent blocks and also whether the - * player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() { - return false; - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - this.resetBounds(); - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which - * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor - * Block - */ - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) { - int l = world.getBlockMetadata(x, y, z); - int i1 = getDirection(l); - - if (isBlockHeadOfBed(l)) { - if (world.getBlock(x - field_149981_a[i1][0], y, z - field_149981_a[i1][1]) != this) { - world.setBlockToAir(x, y, z); - } - } else if (world.getBlock(x + field_149981_a[i1][0], y, z + field_149981_a[i1][1]) != this) { - world.setBlockToAir(x, y, z); - - if (!world.isRemote) { - this.dropBlockAsItem(world, x, y, z, l, 0); - } - } - } - - @Override - public Item getItemDropped(int meta, Random rand, int fortune) { - /** - * Returns whether or not this bed block is the head of the bed. - */ - return isBlockHeadOfBed(meta) ? Item.getItemById(0) : ToolListMF.bedroll; - } - - private void resetBounds() { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, height, 1.0F); - } - - /** - * Returns whether or not this bed block is the head of the bed. - */ - public static boolean isBlockHeadOfBed(int meta) { - return (meta & 8) != 0; - } - - public static boolean func_149976_c(int meta) { - return (meta & 4) != 0; - } - - public static void setState(World world, int x, int y, int z, boolean flag) { - int l = world.getBlockMetadata(x, y, z); - - if (flag) { - l |= 4; - } else { - l &= -5; - } - - world.setBlockMetadataWithNotify(x, y, z, l, 4); - } - - public static ChunkCoordinates findBedside(World world, int x, int y, int z, int counter) { - int i1 = world.getBlockMetadata(x, y, z); - int j1 = BlockDirectional.getDirection(i1); - - for (int k1 = 0; k1 <= 1; ++k1) { - int l1 = x - field_149981_a[j1][0] * k1 - 1; - int i2 = z - field_149981_a[j1][1] * k1 - 1; - int j2 = l1 + 2; - int k2 = i2 + 2; - - for (int l2 = l1; l2 <= j2; ++l2) { - for (int i3 = i2; i3 <= k2; ++i3) { - if (World.doesBlockHaveSolidTopSurface(world, l2, y - 1, i3) - && !world.getBlock(l2, y, i3).getMaterial().isOpaque() - && !world.getBlock(l2, y + 1, i3).getMaterial().isOpaque()) { - if (counter <= 0) { - return new ChunkCoordinates(l2, y, i3); - } - - --counter; - } - } - } - } - - return null; - } - - /** - * Drops the block items with a specified chance of dropping the specified items - */ - @Override - public void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float f, int i) { - if (!isBlockHeadOfBed(meta)) { - super.dropBlockAsItemWithChance(world, x, y, z, meta, f, 0); - } - } - - /** - * Returns the mobility information of the block, 0 = free, 1 = can't push but - * can move over, 2 = total immobility and stop pistons - */ - @Override - public int getMobilityFlag() { - return 1; - } - - /** - * Gets an item for the block being called on. Args: world, x, y, z - */ - @SideOnly(Side.CLIENT) - @Override - public Item getItem(World world, int x, int y, int z) { - return ToolListMF.bedroll; - } - - /** - * Called when the block is attempted to be harvested - */ - @Override - public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer user) { - if (user.capabilities.isCreativeMode && isBlockHeadOfBed(meta)) { - int i1 = getDirection(meta); - x -= field_149981_a[i1][0]; - z -= field_149981_a[i1][1]; - - if (world.getBlock(x, y, z) == this) { - world.setBlockToAir(x, y, z); - } - } - } - - @Override - public boolean isBed(IBlockAccess world, int x, int y, int z, EntityLivingBase player) { - return true; - } + public static final int[][] field_149981_a = new int[][]{{0, 1}, {-1, 0}, {0, -1}, {1, 0}}; + @SideOnly(Side.CLIENT) + private IIcon[] endTex; + @SideOnly(Side.CLIENT) + private IIcon[] sideTex; + @SideOnly(Side.CLIENT) + private IIcon[] topTex; + @SideOnly(Side.CLIENT) + private IIcon baseTex; + + private float height = 0.25F; + + public BlockBedMF(String name) { + super(Material.cloth); + this.setBlockName(name); + GameRegistry.registerBlock(this, name + "_block"); + setBlockTextureName("minefantasy2:furnishings/" + name); + this.resetBounds(); + } + + /** + * Returns whether or not this bed block is the head of the bed. + */ + public static boolean isBlockHeadOfBed(int meta) { + return (meta & 8) != 0; + } + + public static boolean func_149976_c(int meta) { + return (meta & 4) != 0; + } + + public static void setState(World world, int x, int y, int z, boolean flag) { + int l = world.getBlockMetadata(x, y, z); + + if (flag) { + l |= 4; + } else { + l &= -5; + } + + world.setBlockMetadataWithNotify(x, y, z, l, 4); + } + + public static ChunkCoordinates findBedside(World world, int x, int y, int z, int counter) { + int i1 = world.getBlockMetadata(x, y, z); + int j1 = BlockDirectional.getDirection(i1); + + for (int k1 = 0; k1 <= 1; ++k1) { + int l1 = x - field_149981_a[j1][0] * k1 - 1; + int i2 = z - field_149981_a[j1][1] * k1 - 1; + int j2 = l1 + 2; + int k2 = i2 + 2; + + for (int l2 = l1; l2 <= j2; ++l2) { + for (int i3 = i2; i3 <= k2; ++i3) { + if (World.doesBlockHaveSolidTopSurface(world, l2, y - 1, i3) + && !world.getBlock(l2, y, i3).getMaterial().isOpaque() + && !world.getBlock(l2, y + 1, i3).getMaterial().isOpaque()) { + if (counter <= 0) { + return new ChunkCoordinates(l2, y, i3); + } + + --counter; + } + } + } + } + + return null; + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int meta, float fx, float fy, + float fz) { + if (world.isRemote) { + return true; + } else { + int i1 = world.getBlockMetadata(x, y, z); + + if (!isBlockHeadOfBed(i1)) { + int j1 = getDirection(i1); + x += field_149981_a[j1][0]; + z += field_149981_a[j1][1]; + + if (world.getBlock(x, y, z) != this) { + return true; + } + + i1 = world.getBlockMetadata(x, y, z); + } + + if (world.provider.canRespawnHere() && world.getBiomeGenForCoords(x, z) != BiomeGenBase.hell) { + if (func_149976_c(i1)) { + EntityPlayer entityplayer1 = null; + Iterator iterator = world.playerEntities.iterator(); + + while (iterator.hasNext()) { + EntityPlayer entityplayer2 = (EntityPlayer) iterator.next(); + + if (entityplayer2.isPlayerSleeping()) { + ChunkCoordinates chunkcoordinates = entityplayer2.playerLocation; + + if (chunkcoordinates.posX == x && chunkcoordinates.posY == y + && chunkcoordinates.posZ == z) { + entityplayer1 = entityplayer2; + } + } + } + + if (entityplayer1 != null) { + user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.occupied", new Object[0])); + return true; + } + + setState(world, x, y, z, false); + } + + EntityPlayer.EnumStatus enumstatus = user.sleepInBedAt(x, y, z); + + if (enumstatus == EntityPlayer.EnumStatus.OK) { + setState(world, x, y, z, true); + PlayerTickHandlerMF.readyToResetBedPosition(user); + return true; + } else { + if (enumstatus == EntityPlayer.EnumStatus.NOT_POSSIBLE_NOW) { + user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.noSleep", new Object[0])); + } else if (enumstatus == EntityPlayer.EnumStatus.NOT_SAFE) { + user.addChatComponentMessage(new ChatComponentTranslation("tile.bed.notSafe", new Object[0])); + } + + return true; + } + } else { + double d2 = x + 0.5D; + double d0 = y + 0.5D; + double d1 = z + 0.5D; + world.setBlockToAir(x, y, z); + int k1 = getDirection(i1); + x += field_149981_a[k1][0]; + z += field_149981_a[k1][1]; + + if (world.getBlock(x, y, z) == this) { + world.setBlockToAir(x, y, z); + d2 = (d2 + x + 0.5D) / 2.0D; + d0 = (d0 + y + 0.5D) / 2.0D; + d1 = (d1 + z + 0.5D) / 2.0D; + } + + world.newExplosion((Entity) null, x + 0.5F, y + 0.5F, z + 0.5F, 5.0F, true, true); + return true; + } + } + } + + /** + * Gets the block's texture. Args: side, meta + */ + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + if (side == 0) { + return baseTex; + } else { + int k = getDirection(meta); + int l = Direction.bedDirection[k][side]; + int i1 = isBlockHeadOfBed(meta) ? 1 : 0; + return (i1 != 1 || l != 2) && (i1 != 0 || l != 3) ? (l != 5 && l != 4 ? this.topTex[i1] : this.sideTex[i1]) + : this.endTex[i1]; + } + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister register) { + this.topTex = new IIcon[]{register.registerIcon(this.getTextureName() + "_feet_top"), + register.registerIcon(this.getTextureName() + "_head_top")}; + this.endTex = new IIcon[]{register.registerIcon(this.getTextureName() + "_feet_end"), + register.registerIcon(this.getTextureName() + "_head_end")}; + this.sideTex = new IIcon[]{register.registerIcon(this.getTextureName() + "_feet_side"), + register.registerIcon(this.getTextureName() + "_head_side")}; + this.baseTex = register.registerIcon(this.getTextureName() + "_base"); + } + + /** + * The type of render function that is called for this block + */ + @Override + public int getRenderType() { + return 14; + } + + /** + * If this block doesn't render as an ordinary block it will return False + * (examples: signs, buttons, stairs, etc) + */ + @Override + public boolean renderAsNormalBlock() { + return false; + } + + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or + * not to render the shared face of two adjacent blocks and also whether the + * player can attach torches, redstone wire, etc to this block. + */ + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Updates the blocks bounds based on its current state. Args: world, x, y, z + */ + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.resetBounds(); + } + + /** + * Lets the block know when one of its neighbor changes. Doesn't know which + * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor + * Block + */ + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) { + int l = world.getBlockMetadata(x, y, z); + int i1 = getDirection(l); + + if (isBlockHeadOfBed(l)) { + if (world.getBlock(x - field_149981_a[i1][0], y, z - field_149981_a[i1][1]) != this) { + world.setBlockToAir(x, y, z); + } + } else if (world.getBlock(x + field_149981_a[i1][0], y, z + field_149981_a[i1][1]) != this) { + world.setBlockToAir(x, y, z); + + if (!world.isRemote) { + this.dropBlockAsItem(world, x, y, z, l, 0); + } + } + } + + @Override + public Item getItemDropped(int meta, Random rand, int fortune) { + /** + * Returns whether or not this bed block is the head of the bed. + */ + return isBlockHeadOfBed(meta) ? Item.getItemById(0) : ToolListMF.bedroll; + } + + private void resetBounds() { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, height, 1.0F); + } + + /** + * Drops the block items with a specified chance of dropping the specified items + */ + @Override + public void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float f, int i) { + if (!isBlockHeadOfBed(meta)) { + super.dropBlockAsItemWithChance(world, x, y, z, meta, f, 0); + } + } + + /** + * Returns the mobility information of the block, 0 = free, 1 = can't push but + * can move over, 2 = total immobility and stop pistons + */ + @Override + public int getMobilityFlag() { + return 1; + } + + /** + * Gets an item for the block being called on. Args: world, x, y, z + */ + @SideOnly(Side.CLIENT) + @Override + public Item getItem(World world, int x, int y, int z) { + return ToolListMF.bedroll; + } + + /** + * Called when the block is attempted to be harvested + */ + @Override + public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer user) { + if (user.capabilities.isCreativeMode && isBlockHeadOfBed(meta)) { + int i1 = getDirection(meta); + x -= field_149981_a[i1][0]; + z -= field_149981_a[i1][1]; + + if (world.getBlock(x, y, z) == this) { + world.setBlockToAir(x, y, z); + } + } + } + + @Override + public boolean isBed(IBlockAccess world, int x, int y, int z, EntityLivingBase player) { + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockComponent.java b/src/main/java/minefantasy/mf2/block/decor/BlockComponent.java index a30c4e54..66298eb5 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockComponent.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockComponent.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.decor; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,264 +24,265 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Random; + public class BlockComponent extends BlockContainer { - public static int component_RI = 118; - - public BlockComponent() { - super(Material.circuits); - GameRegistry.registerBlock(this, ItemBlockAmmoBox.class, "MF_ComponentStorage"); - setBlockName(""); - this.setHardness(1F); - this.setResistance(1F); - this.setBlockBounds(1 / 16F, 0F, 1 / 16F, 15 / 16F, 12 / 16F, 15 / 16F); - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public IIcon getIcon(int side, int meta) { - return Blocks.iron_block.getIcon(side, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - - } - - @SideOnly(Side.CLIENT) - public int getRenderType() { - return component_RI; - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityComponent(); - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { - useBlock(world, x, y, z, user, true); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - useBlock(world, x, y, z, user, false); - return true; - } - - private void useBlock(World world, int x, int y, int z, EntityPlayer user, boolean leftClick) { - ItemStack held = user.getHeldItem(); - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityComponent) { - ((TileEntityComponent) tile).interact(user, held, leftClick); - } - } - - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityComponent) { - ((TileEntityComponent) tile).checkStack(); - } - } - - private Random rand = new Random(); - - private static TileEntityComponent getTile(World world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityComponent) { - return (TileEntityComponent) tile; - } - return null; - } - - public static int placeComponent(EntityPlayer user, ItemStack item, World world, int x, int y, int z, String type, - String tex, int dir) { - if (world.isAirBlock(x, y, z) && canBuildOn(world, x, y - 1, z)) { - world.setBlock(x, y, z, BlockListMF.components, dir, 2); - - int max = getStorageSize(type); - int size = user.isSneaking() ? Math.min(item.stackSize, max) : 1; - - TileEntityComponent tile = new TileEntityComponent(); - ItemStack newitem = item.copy(); - newitem.stackSize = 1; - tile.setItem(newitem, type, tex, max, size); - world.setTileEntity(x, y, z, tile); - return size; - } - return 0; - } - - public static boolean canBuildOn(World world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityComponent) { - return ((TileEntityComponent) tile).isFull(); - } - return world.isSideSolid(x, y, z, ForgeDirection.UP); - } - - public static int useComponent(ItemStack item, String type, String tex, World world, EntityPlayer user, - MovingObjectPosition movingobjectposition) { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (movingobjectposition.sideHit == 0) { - --j; - } - - if (movingobjectposition.sideHit == 1) { - ++j; - } - - if (movingobjectposition.sideHit == 2) { - --k; - } - - if (movingobjectposition.sideHit == 3) { - ++k; - } - - if (movingobjectposition.sideHit == 4) { - --i; - } - - if (movingobjectposition.sideHit == 5) { - ++i; - } - - if (user.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { - int l = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - return placeComponent(user, item, user.worldObj, i, j, k, type, tex, l); - } - } - return 0; - } - - public static int getStorageSize(String id) { - if (id == null) - return 0; - - if (id.equalsIgnoreCase("bar")) - return 64; - if (id.equalsIgnoreCase("plank")) - return 64; - if (id.equalsIgnoreCase("pot")) - return 64; - if (id.equalsIgnoreCase("jug")) - return 32; - if (id.equalsIgnoreCase("sheet")) - return 16; - if (id.equalsIgnoreCase("bigplate")) - return 8; - - return 0; - } - - @Override - public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityComponent) { - if (((TileEntityComponent) tile).item != null) { - ItemStack item = ((TileEntityComponent) tile).item.copy(); - item.stackSize = 1; - return item; - } - } - return null; - } - - @Override - public Item getItemDropped(int meta, Random rand, int fortune) { - return null; - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityComponent) { - TileEntityComponent component = (TileEntityComponent) tile; - - if (component.item != null) { - while (component.stackSize > 0) { - ItemStack drop = component.item.copy(); - int count = Math.min(component.stackSize, drop.getMaxStackSize()); - drop.stackSize = count; - component.stackSize -= count; - dropItem(world, x, y, z, drop); - } - } - } - } - - private void dropItem(World world, int x, int y, int z, ItemStack itemstack) { - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - private AxisAlignedBB getBoundingBox(World world, int x, int y, int z) { - float height = 1.0F; - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityComponent) { - height = ((TileEntityComponent) tile).getBlockHeight(); - } - return AxisAlignedBB.getBoundingBox(x + 0.0625D, y + 0D, z + 0.0625D, x + 0.9375D, y + height, z + 0.9375D); - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - return getBoundingBox(world, x, y, z); - } - - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - @SideOnly(Side.CLIENT) - @Override - public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { - return getBoundingBox(world, x, y, z); - } + public static int component_RI = 118; + private Random rand = new Random(); + + public BlockComponent() { + super(Material.circuits); + GameRegistry.registerBlock(this, ItemBlockAmmoBox.class, "MF_ComponentStorage"); + setBlockName(""); + this.setHardness(1F); + this.setResistance(1F); + this.setBlockBounds(1 / 16F, 0F, 1 / 16F, 15 / 16F, 12 / 16F, 15 / 16F); + } + + private static TileEntityComponent getTile(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityComponent) { + return (TileEntityComponent) tile; + } + return null; + } + + public static int placeComponent(EntityPlayer user, ItemStack item, World world, int x, int y, int z, String type, + String tex, int dir) { + if (world.isAirBlock(x, y, z) && canBuildOn(world, x, y - 1, z)) { + world.setBlock(x, y, z, BlockListMF.components, dir, 2); + + int max = getStorageSize(type); + int size = user.isSneaking() ? Math.min(item.stackSize, max) : 1; + + TileEntityComponent tile = new TileEntityComponent(); + ItemStack newitem = item.copy(); + newitem.stackSize = 1; + tile.setItem(newitem, type, tex, max, size); + world.setTileEntity(x, y, z, tile); + return size; + } + return 0; + } + + public static boolean canBuildOn(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityComponent) { + return ((TileEntityComponent) tile).isFull(); + } + return world.isSideSolid(x, y, z, ForgeDirection.UP); + } + + public static int useComponent(ItemStack item, String type, String tex, World world, EntityPlayer user, + MovingObjectPosition movingobjectposition) { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (movingobjectposition.sideHit == 0) { + --j; + } + + if (movingobjectposition.sideHit == 1) { + ++j; + } + + if (movingobjectposition.sideHit == 2) { + --k; + } + + if (movingobjectposition.sideHit == 3) { + ++k; + } + + if (movingobjectposition.sideHit == 4) { + --i; + } + + if (movingobjectposition.sideHit == 5) { + ++i; + } + + if (user.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + int l = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + return placeComponent(user, item, user.worldObj, i, j, k, type, tex, l); + } + } + return 0; + } + + public static int getStorageSize(String id) { + if (id == null) + return 0; + + if (id.equalsIgnoreCase("bar")) + return 64; + if (id.equalsIgnoreCase("plank")) + return 64; + if (id.equalsIgnoreCase("pot")) + return 64; + if (id.equalsIgnoreCase("jug")) + return 32; + if (id.equalsIgnoreCase("sheet")) + return 16; + if (id.equalsIgnoreCase("bigplate")) + return 8; + + return 0; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public IIcon getIcon(int side, int meta) { + return Blocks.iron_block.getIcon(side, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + + @SideOnly(Side.CLIENT) + public int getRenderType() { + return component_RI; + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityComponent(); + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + useBlock(world, x, y, z, user, true); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + useBlock(world, x, y, z, user, false); + return true; + } + + private void useBlock(World world, int x, int y, int z, EntityPlayer user, boolean leftClick) { + ItemStack held = user.getHeldItem(); + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityComponent) { + ((TileEntityComponent) tile).interact(user, held, leftClick); + } + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityComponent) { + ((TileEntityComponent) tile).checkStack(); + } + } + + @Override + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityComponent) { + if (((TileEntityComponent) tile).item != null) { + ItemStack item = ((TileEntityComponent) tile).item.copy(); + item.stackSize = 1; + return item; + } + } + return null; + } + + @Override + public Item getItemDropped(int meta, Random rand, int fortune) { + return null; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityComponent) { + TileEntityComponent component = (TileEntityComponent) tile; + + if (component.item != null) { + while (component.stackSize > 0) { + ItemStack drop = component.item.copy(); + int count = Math.min(component.stackSize, drop.getMaxStackSize()); + drop.stackSize = count; + component.stackSize -= count; + dropItem(world, x, y, z, drop); + } + } + } + } + + private void dropItem(World world, int x, int y, int z, ItemStack itemstack) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + private AxisAlignedBB getBoundingBox(World world, int x, int y, int z) { + float height = 1.0F; + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityComponent) { + height = ((TileEntityComponent) tile).getBlockHeight(); + } + return AxisAlignedBB.getBoundingBox(x + 0.0625D, y + 0D, z + 0.0625D, x + 0.9375D, y + height, z + 0.9375D); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return getBoundingBox(world, x, y, z); + } + + /** + * Returns the bounding box of the wired rectangular prism to render. + */ + @SideOnly(Side.CLIENT) + @Override + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + return getBoundingBox(world, x, y, z); + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockPowRailMF.java b/src/main/java/minefantasy/mf2/block/decor/BlockPowRailMF.java index 6447f0e5..2a5acdb8 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockPowRailMF.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockPowRailMF.java @@ -8,29 +8,29 @@ import net.minecraft.world.World; public class BlockPowRailMF extends BlockRailPowered { - private BaseMaterialMF baseMat; - private boolean isPowered = true; + private BaseMaterialMF baseMat; + private boolean isPowered = true; - public BlockPowRailMF(BaseMaterialMF material) { - this(material, material.name.toLowerCase()); - } + public BlockPowRailMF(BaseMaterialMF material) { + this(material, material.name.toLowerCase()); + } - public BlockPowRailMF(BaseMaterialMF material, String type) { - super(); - String name = type + "_rail"; - GameRegistry.registerBlock(this, name); - setBlockName(name); - this.setBlockTextureName("minefantasy2:mechanical/" + name); + public BlockPowRailMF(BaseMaterialMF material, String type) { + super(); + String name = type + "_rail"; + GameRegistry.registerBlock(this, name); + setBlockName(name); + this.setBlockTextureName("minefantasy2:mechanical/" + name); - this.setHarvestLevel("pickaxe", material.harvestLevel); - this.setStepSound(Block.soundTypeMetal); - this.setHardness(material.hardness + 1 / 2F); - this.setResistance(material.hardness + 1); - this.baseMat = material; - } + this.setHarvestLevel("pickaxe", material.harvestLevel); + this.setStepSound(Block.soundTypeMetal); + this.setHardness(material.hardness + 1 / 2F); + this.setResistance(material.hardness + 1); + this.baseMat = material; + } - @Override - public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) { - return 0.8F; - } + @Override + public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) { + return 0.8F; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockRack.java b/src/main/java/minefantasy/mf2/block/decor/BlockRack.java index ee252144..fa8e2c27 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockRack.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockRack.java @@ -1,12 +1,5 @@ package minefantasy.mf2.block.decor; -import static net.minecraftforge.common.util.ForgeDirection.EAST; -import static net.minecraftforge.common.util.ForgeDirection.NORTH; -import static net.minecraftforge.common.util.ForgeDirection.SOUTH; -import static net.minecraftforge.common.util.ForgeDirection.WEST; - -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,336 +21,338 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.Random; + +import static net.minecraftforge.common.util.ForgeDirection.*; + /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class BlockRack extends BlockWoodDecor { - private Random rand = new Random(); - - private static final float thickness = 5F / 16F; - - public BlockRack(String name) { - super(name); - - setHardness(1.0F); - setResistance(1.0F); - GameRegistry.registerBlock(this, ItemBlockToolRack.class, name); - setBlockName(name); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box - * can change after the pool has been cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, - int p_149668_4_) { - this.setBlockBoundsBasedOnState(p_149668_1_, p_149668_2_, p_149668_3_, p_149668_4_); - return super.getCollisionBoundingBoxFromPool(p_149668_1_, p_149668_2_, p_149668_3_, p_149668_4_); - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_, - int p_149719_4_) { - this.modifyBoundingbox(p_149719_1_.getBlockMetadata(p_149719_2_, p_149719_3_, p_149719_4_)); - } - - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - @SideOnly(Side.CLIENT) - @Override - public AxisAlignedBB getSelectedBoundingBoxFromPool(World p_149633_1_, int p_149633_2_, int p_149633_3_, - int p_149633_4_) { - this.setBlockBoundsBasedOnState(p_149633_1_, p_149633_2_, p_149633_3_, p_149633_4_); - return super.getSelectedBoundingBoxFromPool(p_149633_1_, p_149633_2_, p_149633_3_, p_149633_4_); - } - - public void modifyBoundingbox(int meta) { - float f = 0.25F; - - if (meta == 2) { - this.setBlockBounds(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - } - - if (meta == 3) { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - } - - if (meta == 4) { - this.setBlockBounds(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - if (meta == 5) { - this.setBlockBounds(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - } - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or - * not to render the shared face of two adjacent blocks and also whether the - * player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() { - return false; - } - - /** - * If this block doesn't render as an ordinary block it will return False - * (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() { - return false; - } - - public static int rack_RI = 115; - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() { - return rack_RI; - } - - /** - * Checks to see if its valid to put this block at the specified coordinates. - * Args: world, x, y, z - */ - @Override - public boolean canPlaceBlockAt(World p_149742_1_, int p_149742_2_, int p_149742_3_, int p_149742_4_) { - return p_149742_1_.isSideSolid(p_149742_2_ - 1, p_149742_3_, p_149742_4_, EAST) - || p_149742_1_.isSideSolid(p_149742_2_ + 1, p_149742_3_, p_149742_4_, WEST) - || p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_, p_149742_4_ - 1, SOUTH) - || p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_, p_149742_4_ + 1, NORTH); - } - - /** - * Called when a block is placed using its ItemBlock. Args: World, X, Y, Z, - * side, hitX, hitY, hitZ, block metadata - */ - /** - * Convert standard South, West, North, East to rack's (North, South, East, - * West) - */ - public static int getDirection(int dir) { - int[] directions = new int[] { 3, 4, 2, 5 }; - return directions[Math.min(3, dir)]; - } - - @Override - public int onBlockPlaced(World p_149660_1_, int p_149660_2_, int p_149660_3_, int p_149660_4_, int p_149660_5_, - float p_149660_6_, float p_149660_7_, float p_149660_8_, int p_149660_9_) { - int j1 = p_149660_9_; - - if ((p_149660_9_ == 0 || p_149660_5_ == 2) - && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_, p_149660_4_ + 1, NORTH)) { - j1 = 2; - } - - if ((j1 == 0 || p_149660_5_ == 3) - && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_, p_149660_4_ - 1, SOUTH)) { - j1 = 3; - } - - if ((j1 == 0 || p_149660_5_ == 4) && p_149660_1_.isSideSolid(p_149660_2_ + 1, p_149660_3_, p_149660_4_, WEST)) { - j1 = 4; - } - - if ((j1 == 0 || p_149660_5_ == 5) && p_149660_1_.isSideSolid(p_149660_2_ - 1, p_149660_3_, p_149660_4_, EAST)) { - j1 = 5; - } - - return j1; - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which - * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor - * Block - */ - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityRack) { - ((TileEntityRack) tile).updateInventory(); - } - int l = world.getBlockMetadata(x, y, z); - boolean flag = false; - - if (l == 2 && world.isSideSolid(x, y, z + 1, NORTH)) { - flag = true; - } - - if (l == 3 && world.isSideSolid(x, y, z - 1, SOUTH)) { - flag = true; - } - - if (l == 4 && world.isSideSolid(x + 1, y, z, WEST)) { - flag = true; - } - - if (l == 5 && world.isSideSolid(x - 1, y, z, EAST)) { - flag = true; - } - - if (!flag) { - this.dropBlockAsItem(world, x, y, z, l, 0); - world.setBlockToAir(x, y, z); - } - - super.onNeighborBlockChange(world, x, y, z, block); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random rand) { - return 1; - } - - @Override - public IIcon getIcon(int side, int meta) { - return Blocks.planks.getIcon(side, 0); - } - - @Override - public TileEntity createNewTileEntity(World world, int m) { - return new TileEntityRack(); - } - - /** - * Called whenever the block is removed. - */ - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityRack tile = (TileEntityRack) world.getTileEntity(x, y, z); - - if (tile != null) { - for (int var6 = 0; var6 < tile.getSizeInventory(); ++var6) { - ItemStack var7 = tile.getStackInSlot(var6); - - if (var7 != null) { - float var8 = this.rand.nextFloat() * 0.8F + 0.1F; - float var9 = this.rand.nextFloat() * 0.8F + 0.1F; - float var10 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (var7.stackSize > 0) { - int var11 = this.rand.nextInt(21) + 10; - - if (var11 > var7.stackSize) { - var11 = var7.stackSize; - } - - var7.stackSize -= var11; - EntityItem var12 = new EntityItem(world, x + var8, y + var9, z + var10, - new ItemStack(var7.getItem(), var11, var7.getItemDamage())); - - if (var7.hasTagCompound()) { - var12.getEntityItem().setTagCompound((NBTTagCompound) var7.getTagCompound().copy()); - } - - float var13 = 0.05F; - var12.motionX = (float) this.rand.nextGaussian() * var13; - var12.motionY = (float) this.rand.nextGaussian() * var13 + 0.2F; - var12.motionZ = (float) this.rand.nextGaussian() * var13; - world.spawnEntityInWorld(var12); - } - } - } - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int i, float f, float f1, - float f2) { - TileEntityRack tile = (TileEntityRack) world.getTileEntity(x, y, z); - if (world.isRemote) { - int slot = tile.getSlotFor(f, f2); - if (slot >= 0 && slot < 4) { - ((EntityClientPlayerMP) user).sendQueue - .addToSendQueue(new RackCommand(slot, user, tile).generatePacket()); - } - } - - return true; - } - - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - } - - public static boolean interact(int slot, World world, TileEntityRack tile, EntityPlayer player) { - if (player.isSneaking()) { - player.openGui(MineFantasyII.instance, 0, world, tile.xCoord, tile.yCoord, tile.zCoord); - return false; - } - - ItemStack held = player.getHeldItem(); - if (held == null) { - ItemStack hung = tile.getStackInSlot(slot); - if (hung != null) { - if (!world.isRemote) { - player.setCurrentItemOrArmor(0, hung); - tile.setInventorySlotContents(slot, null); - tile.syncItems(); - } - player.swingItem(); - return true; - } - } else { - ItemStack hung = tile.getStackInSlot(slot); - - if (hung == null && tile.canHang(player.getHeldItem(), slot)) { - if (!world.isRemote) { - tile.setInventorySlotContents(slot, player.getHeldItem().copy()); - player.setCurrentItemOrArmor(0, null); - tile.syncItems(); - } - player.swingItem(); - return true; - } else if (held != null && hung != null) { - if (hung.isItemEqual(held)) { - int space = hung.getMaxStackSize() - hung.stackSize; - - if (held.stackSize > space) { - if (!world.isRemote) { - held.stackSize -= space; - hung.stackSize += space; - } - player.swingItem(); - return true; - } else { - if (!world.isRemote) { - hung.stackSize += held.stackSize; - player.setCurrentItemOrArmor(0, null); - } - player.swingItem(); - return true; - } - } - } - } - player.openGui(MineFantasyII.instance, 0, world, tile.xCoord, tile.yCoord, tile.zCoord); - return false; - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - } + private static final float thickness = 5F / 16F; + public static int rack_RI = 115; + private Random rand = new Random(); + + public BlockRack(String name) { + super(name); + + setHardness(1.0F); + setResistance(1.0F); + GameRegistry.registerBlock(this, ItemBlockToolRack.class, name); + setBlockName(name); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + /** + * Convert standard South, West, North, East to rack's (North, South, East, + * West) + */ + public static int getDirection(int dir) { + int[] directions = new int[]{3, 4, 2, 5}; + return directions[Math.min(3, dir)]; + } + + public static boolean interact(int slot, World world, TileEntityRack tile, EntityPlayer player) { + if (player.isSneaking()) { + player.openGui(MineFantasyII.instance, 0, world, tile.xCoord, tile.yCoord, tile.zCoord); + return false; + } + + ItemStack held = player.getHeldItem(); + if (held == null) { + ItemStack hung = tile.getStackInSlot(slot); + if (hung != null) { + if (!world.isRemote) { + player.setCurrentItemOrArmor(0, hung); + tile.setInventorySlotContents(slot, null); + tile.syncItems(); + } + player.swingItem(); + return true; + } + } else { + ItemStack hung = tile.getStackInSlot(slot); + + if (hung == null && tile.canHang(player.getHeldItem(), slot)) { + if (!world.isRemote) { + tile.setInventorySlotContents(slot, player.getHeldItem().copy()); + player.setCurrentItemOrArmor(0, null); + tile.syncItems(); + } + player.swingItem(); + return true; + } else if (held != null && hung != null) { + if (hung.isItemEqual(held)) { + int space = hung.getMaxStackSize() - hung.stackSize; + + if (held.stackSize > space) { + if (!world.isRemote) { + held.stackSize -= space; + hung.stackSize += space; + } + player.swingItem(); + return true; + } else { + if (!world.isRemote) { + hung.stackSize += held.stackSize; + player.setCurrentItemOrArmor(0, null); + } + player.swingItem(); + return true; + } + } + } + } + player.openGui(MineFantasyII.instance, 0, world, tile.xCoord, tile.yCoord, tile.zCoord); + return false; + } + + /** + * Returns a bounding box from the pool of bounding boxes (this means this box + * can change after the pool has been cleared to be reused) + */ + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, + int p_149668_4_) { + this.setBlockBoundsBasedOnState(p_149668_1_, p_149668_2_, p_149668_3_, p_149668_4_); + return super.getCollisionBoundingBoxFromPool(p_149668_1_, p_149668_2_, p_149668_3_, p_149668_4_); + } + + /** + * Updates the blocks bounds based on its current state. Args: world, x, y, z + */ + @Override + public void setBlockBoundsBasedOnState(IBlockAccess p_149719_1_, int p_149719_2_, int p_149719_3_, + int p_149719_4_) { + this.modifyBoundingbox(p_149719_1_.getBlockMetadata(p_149719_2_, p_149719_3_, p_149719_4_)); + } + + /** + * Returns the bounding box of the wired rectangular prism to render. + */ + @SideOnly(Side.CLIENT) + @Override + public AxisAlignedBB getSelectedBoundingBoxFromPool(World p_149633_1_, int p_149633_2_, int p_149633_3_, + int p_149633_4_) { + this.setBlockBoundsBasedOnState(p_149633_1_, p_149633_2_, p_149633_3_, p_149633_4_); + return super.getSelectedBoundingBoxFromPool(p_149633_1_, p_149633_2_, p_149633_3_, p_149633_4_); + } + + public void modifyBoundingbox(int meta) { + float f = 0.25F; + + if (meta == 2) { + this.setBlockBounds(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); + } + + if (meta == 3) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); + } + + if (meta == 4) { + this.setBlockBounds(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + if (meta == 5) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); + } + } + + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or + * not to render the shared face of two adjacent blocks and also whether the + * player can attach torches, redstone wire, etc to this block. + */ + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * If this block doesn't render as an ordinary block it will return False + * (examples: signs, buttons, stairs, etc) + */ + @Override + public boolean renderAsNormalBlock() { + return false; + } + + /** + * Called when a block is placed using its ItemBlock. Args: World, X, Y, Z, + * side, hitX, hitY, hitZ, block metadata + */ + + /** + * The type of render function that is called for this block + */ + @Override + public int getRenderType() { + return rack_RI; + } + + /** + * Checks to see if its valid to put this block at the specified coordinates. + * Args: world, x, y, z + */ + @Override + public boolean canPlaceBlockAt(World p_149742_1_, int p_149742_2_, int p_149742_3_, int p_149742_4_) { + return p_149742_1_.isSideSolid(p_149742_2_ - 1, p_149742_3_, p_149742_4_, EAST) + || p_149742_1_.isSideSolid(p_149742_2_ + 1, p_149742_3_, p_149742_4_, WEST) + || p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_, p_149742_4_ - 1, SOUTH) + || p_149742_1_.isSideSolid(p_149742_2_, p_149742_3_, p_149742_4_ + 1, NORTH); + } + + @Override + public int onBlockPlaced(World p_149660_1_, int p_149660_2_, int p_149660_3_, int p_149660_4_, int p_149660_5_, + float p_149660_6_, float p_149660_7_, float p_149660_8_, int p_149660_9_) { + int j1 = p_149660_9_; + + if ((p_149660_9_ == 0 || p_149660_5_ == 2) + && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_, p_149660_4_ + 1, NORTH)) { + j1 = 2; + } + + if ((j1 == 0 || p_149660_5_ == 3) + && p_149660_1_.isSideSolid(p_149660_2_, p_149660_3_, p_149660_4_ - 1, SOUTH)) { + j1 = 3; + } + + if ((j1 == 0 || p_149660_5_ == 4) && p_149660_1_.isSideSolid(p_149660_2_ + 1, p_149660_3_, p_149660_4_, WEST)) { + j1 = 4; + } + + if ((j1 == 0 || p_149660_5_ == 5) && p_149660_1_.isSideSolid(p_149660_2_ - 1, p_149660_3_, p_149660_4_, EAST)) { + j1 = 5; + } + + return j1; + } + + /** + * Lets the block know when one of its neighbor changes. Doesn't know which + * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor + * Block + */ + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityRack) { + ((TileEntityRack) tile).updateInventory(); + } + int l = world.getBlockMetadata(x, y, z); + boolean flag = false; + + if (l == 2 && world.isSideSolid(x, y, z + 1, NORTH)) { + flag = true; + } + + if (l == 3 && world.isSideSolid(x, y, z - 1, SOUTH)) { + flag = true; + } + + if (l == 4 && world.isSideSolid(x + 1, y, z, WEST)) { + flag = true; + } + + if (l == 5 && world.isSideSolid(x - 1, y, z, EAST)) { + flag = true; + } + + if (!flag) { + this.dropBlockAsItem(world, x, y, z, l, 0); + world.setBlockToAir(x, y, z); + } + + super.onNeighborBlockChange(world, x, y, z, block); + } + + /** + * Returns the quantity of items to drop on block destruction. + */ + @Override + public int quantityDropped(Random rand) { + return 1; + } + + @Override + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); + } + + @Override + public TileEntity createNewTileEntity(World world, int m) { + return new TileEntityRack(); + } + + /** + * Called whenever the block is removed. + */ + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityRack tile = (TileEntityRack) world.getTileEntity(x, y, z); + + if (tile != null) { + for (int var6 = 0; var6 < tile.getSizeInventory(); ++var6) { + ItemStack var7 = tile.getStackInSlot(var6); + + if (var7 != null) { + float var8 = this.rand.nextFloat() * 0.8F + 0.1F; + float var9 = this.rand.nextFloat() * 0.8F + 0.1F; + float var10 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (var7.stackSize > 0) { + int var11 = this.rand.nextInt(21) + 10; + + if (var11 > var7.stackSize) { + var11 = var7.stackSize; + } + + var7.stackSize -= var11; + EntityItem var12 = new EntityItem(world, x + var8, y + var9, z + var10, + new ItemStack(var7.getItem(), var11, var7.getItemDamage())); + + if (var7.hasTagCompound()) { + var12.getEntityItem().setTagCompound((NBTTagCompound) var7.getTagCompound().copy()); + } + + float var13 = 0.05F; + var12.motionX = (float) this.rand.nextGaussian() * var13; + var12.motionY = (float) this.rand.nextGaussian() * var13 + 0.2F; + var12.motionZ = (float) this.rand.nextGaussian() * var13; + world.spawnEntityInWorld(var12); + } + } + } + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int i, float f, float f1, + float f2) { + TileEntityRack tile = (TileEntityRack) world.getTileEntity(x, y, z); + if (world.isRemote) { + int slot = tile.getSlotFor(f, f2); + if (slot >= 0 && slot < 4) { + ((EntityClientPlayerMP) user).sendQueue + .addToSendQueue(new RackCommand(slot, user, tile).generatePacket()); + } + } + + return true; + } + + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockRailMF.java b/src/main/java/minefantasy/mf2/block/decor/BlockRailMF.java index 337e5ae1..3d8cf831 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockRailMF.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockRailMF.java @@ -8,29 +8,29 @@ import net.minecraft.world.World; public class BlockRailMF extends BlockRail { - private BaseMaterialMF baseMat; - private boolean isPowered = true; + private BaseMaterialMF baseMat; + private boolean isPowered = true; - public BlockRailMF(BaseMaterialMF material) { - this(material, material.name.toLowerCase()); - } + public BlockRailMF(BaseMaterialMF material) { + this(material, material.name.toLowerCase()); + } - public BlockRailMF(BaseMaterialMF material, String type) { - super(); - String name = type + "_rail"; - GameRegistry.registerBlock(this, name); - setBlockName(name); - this.setBlockTextureName("minefantasy2:mechanical/" + name); + public BlockRailMF(BaseMaterialMF material, String type) { + super(); + String name = type + "_rail"; + GameRegistry.registerBlock(this, name); + setBlockName(name); + this.setBlockTextureName("minefantasy2:mechanical/" + name); - this.setHarvestLevel("pickaxe", material.harvestLevel); - this.setStepSound(Block.soundTypeMetal); - this.setHardness(material.hardness + 1 / 2F); - this.setResistance(material.hardness + 1); - this.baseMat = material; - } + this.setHarvestLevel("pickaxe", material.harvestLevel); + this.setStepSound(Block.soundTypeMetal); + this.setHardness(material.hardness + 1 / 2F); + this.setResistance(material.hardness + 1); + this.baseMat = material; + } - @Override - public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) { - return 0.8F; - } + @Override + public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) { + return 0.8F; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockRoad.java b/src/main/java/minefantasy/mf2/block/decor/BlockRoad.java index 40eaf90e..91ebda4f 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockRoad.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockRoad.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.decor; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,211 +23,212 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.Random; + public class BlockRoad extends BlockContainer { - public BlockRoad(String name, float f) { - super(Material.ground); - this.setStepSound(Block.soundTypeGravel); - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, f / 16F, 1.0F); - this.setLightOpacity(0); - GameRegistry.registerBlock(this, name); - setBlockName(name); - setHardness(0.5F); - } - - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - if (this == BlockListMF.lowroad) - return AxisAlignedBB.getBoundingBox(x + 0, y + 0, z + 0, x + 1, y + 0.5, z + 1); - - return AxisAlignedBB.getBoundingBox(x + 0, y + 0, z + 0, x + 1, y + 1, z + 1); - } - - @Override - public IIcon getIcon(int side, int meta) { - return meta == 1 ? Blocks.sand.getIcon(side, 0) : Blocks.dirt.getIcon(side, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityRoad) { - if (((TileEntityRoad) tile).surface[0] > 0) { - Block surface = ((TileEntityRoad) tile).getBaseBlock(); - int surface_m = ((TileEntityRoad) tile).surface[1]; - return surface.getIcon(side, surface_m); - } - } - return this.getIcon(side, world.getBlockMetadata(x, y, z)); - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or - * not to render the shared face of two adjacent blocks and also whether the - * player can attach torches, redstone wire, etc to this block. - */ - public boolean isOpaqueCube() { - return false; - } - - /** - * If this block doesn't render as an ordinary block it will return False - * (examples: signs, buttons, stairs, etc) - */ - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public void onBlockAdded(World world, int x, int y, int z) { - this.updateTick(world, x, y, z, new Random()); - super.onBlockAdded(world, x, y, z); - } - - @Override - public void updateTick(World world, int x, int y, int z, Random random) { - if (world.getBlock(x, y - 1, z) == Blocks.grass) { - world.setBlock(x, y - 1, z, Blocks.dirt, 0, 2); - } - super.updateTick(world, x, y, z, random); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, - float f2) { - TileEntityRoad tile = getTile(world, x, y, z); - if (tile == null) - return false; - - boolean isLocked = tile.isLocked; - ItemStack itemstack = player.getHeldItem(); - if (itemstack != null) { - if (!player.canPlayerEdit(x, y, z, i, itemstack)) { - return false; - } - if (!isLocked) { - Block block = Block.getBlockFromItem(itemstack.getItem()); - if (itemstack.getItem() instanceof ItemBlock && block != null) { - if (upgradeRoad(world, x, y, z, 4, itemstack, block)) { - if (!player.capabilities.isCreativeMode && !world.isRemote) { - itemstack.stackSize--; - if (itemstack.stackSize <= 0) { - player.setCurrentItemOrArmor(0, null); - } - } - return true; - } - } - - if (itemstack.getItem() instanceof ItemSpade) { - if (this == BlockListMF.road) { - if (!world.isRemote) { - int m = world.getBlockMetadata(x, y, z); - world.setBlock(x, y, z, BlockListMF.lowroad, m, 2); - } - return true; - } - } - } - if (!world.isRemote && itemstack.getItem() instanceof ItemMattock) { - toggleLocks(world, x, y, z, 4); - } - } - return !tile.isLocked; - } - - private TileEntityRoad getTile(World world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityRoad) { - return (TileEntityRoad) tile; - } - return null; - } - - @Override - public Item getItemDropped(int meta, Random rand, int fortune) { - Block drop = meta == 1 ? Blocks.sand : Blocks.dirt; - return Item.getItemFromBlock(drop); - } - - /** - * Resets the Texture - * - * @param ID - * the block right clicked with - * @return - */ - private boolean upgradeRoad(World world, int x, int y, int z, int r, ItemStack held, Block block) { - if (!block.isNormalCube()) { - return false; - } - if (held == null) { - return false; - } - boolean flag = false; - - for (int x2 = -r; x2 <= r; x2++) { - for (int y2 = -r; y2 <= r; y2++) { - for (int z2 = -r; z2 <= r; z2++) { - Block id = world.getBlock(x + x2, y + y2, z + z2); - int m = world.getBlockMetadata(x + x2, y + y2, z + z2); - if ((id == BlockListMF.road || id == BlockListMF.lowroad)) { - if (getDistance(x + x2, y + y2, z + z2, x, y, z) < r) { - { - TileEntity tile = world.getTileEntity(x + x2, y + y2, z + z2); - if (tile != null && tile instanceof TileEntityRoad - && !((TileEntityRoad) tile).isLocked) { - flag = true; - ((TileEntityRoad) tile).setSurface(block, held.getItemDamage()); - } - } - } - } - } - } - } - return flag; - } - - private boolean toggleLocks(World world, int x, int y, int z, int r) { - boolean flag = false; - TileEntityRoad tile = getTile(world, x, y, z); - if (tile == null) { - return false; - } - flag = !tile.isLocked; - tile.isLocked = flag; - tile.sendPacketToClients(); - - for (int x2 = -r; x2 <= r; x2++) { - for (int y2 = -r; y2 <= r; y2++) { - for (int z2 = -r; z2 <= r; z2++) { - if (getDistance(x + x2, y + y2, z + z2, x, y, z) < r) { - TileEntityRoad tile2 = getTile(world, x + x2, y + y2, z + z2); - if (tile2 != null) { - tile2.isLocked = flag; - tile2.sendPacketToClients(); - } - } - } - } - } - return true; - } - - public double getDistance(double x, double y, double z, int posX, int posY, int posZ) { - double var7 = posX - x; - double var9 = posY - y; - double var11 = posZ - z; - return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityRoad(); - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - } + public BlockRoad(String name, float f) { + super(Material.ground); + this.setStepSound(Block.soundTypeGravel); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, f / 16F, 1.0F); + this.setLightOpacity(0); + GameRegistry.registerBlock(this, name); + setBlockName(name); + setHardness(0.5F); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + if (this == BlockListMF.lowroad) + return AxisAlignedBB.getBoundingBox(x + 0, y + 0, z + 0, x + 1, y + 0.5, z + 1); + + return AxisAlignedBB.getBoundingBox(x + 0, y + 0, z + 0, x + 1, y + 1, z + 1); + } + + @Override + public IIcon getIcon(int side, int meta) { + return meta == 1 ? Blocks.sand.getIcon(side, 0) : Blocks.dirt.getIcon(side, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityRoad) { + if (((TileEntityRoad) tile).surface[0] > 0) { + Block surface = ((TileEntityRoad) tile).getBaseBlock(); + int surface_m = ((TileEntityRoad) tile).surface[1]; + return surface.getIcon(side, surface_m); + } + } + return this.getIcon(side, world.getBlockMetadata(x, y, z)); + } + + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or + * not to render the shared face of two adjacent blocks and also whether the + * player can attach torches, redstone wire, etc to this block. + */ + public boolean isOpaqueCube() { + return false; + } + + /** + * If this block doesn't render as an ordinary block it will return False + * (examples: signs, buttons, stairs, etc) + */ + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) { + this.updateTick(world, x, y, z, new Random()); + super.onBlockAdded(world, x, y, z); + } + + @Override + public void updateTick(World world, int x, int y, int z, Random random) { + if (world.getBlock(x, y - 1, z) == Blocks.grass) { + world.setBlock(x, y - 1, z, Blocks.dirt, 0, 2); + } + super.updateTick(world, x, y, z, random); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + TileEntityRoad tile = getTile(world, x, y, z); + if (tile == null) + return false; + + boolean isLocked = tile.isLocked; + ItemStack itemstack = player.getHeldItem(); + if (itemstack != null) { + if (!player.canPlayerEdit(x, y, z, i, itemstack)) { + return false; + } + if (!isLocked) { + Block block = Block.getBlockFromItem(itemstack.getItem()); + if (itemstack.getItem() instanceof ItemBlock && block != null) { + if (upgradeRoad(world, x, y, z, 4, itemstack, block)) { + if (!player.capabilities.isCreativeMode && !world.isRemote) { + itemstack.stackSize--; + if (itemstack.stackSize <= 0) { + player.setCurrentItemOrArmor(0, null); + } + } + return true; + } + } + + if (itemstack.getItem() instanceof ItemSpade) { + if (this == BlockListMF.road) { + if (!world.isRemote) { + int m = world.getBlockMetadata(x, y, z); + world.setBlock(x, y, z, BlockListMF.lowroad, m, 2); + } + return true; + } + } + } + if (!world.isRemote && itemstack.getItem() instanceof ItemMattock) { + toggleLocks(world, x, y, z, 4); + } + } + return !tile.isLocked; + } + + private TileEntityRoad getTile(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityRoad) { + return (TileEntityRoad) tile; + } + return null; + } + + @Override + public Item getItemDropped(int meta, Random rand, int fortune) { + Block drop = meta == 1 ? Blocks.sand : Blocks.dirt; + return Item.getItemFromBlock(drop); + } + + /** + * Resets the Texture + * + * @param ID the block right clicked with + * @return + */ + private boolean upgradeRoad(World world, int x, int y, int z, int r, ItemStack held, Block block) { + if (!block.isNormalCube()) { + return false; + } + if (held == null) { + return false; + } + boolean flag = false; + + for (int x2 = -r; x2 <= r; x2++) { + for (int y2 = -r; y2 <= r; y2++) { + for (int z2 = -r; z2 <= r; z2++) { + Block id = world.getBlock(x + x2, y + y2, z + z2); + int m = world.getBlockMetadata(x + x2, y + y2, z + z2); + if ((id == BlockListMF.road || id == BlockListMF.lowroad)) { + if (getDistance(x + x2, y + y2, z + z2, x, y, z) < r) { + { + TileEntity tile = world.getTileEntity(x + x2, y + y2, z + z2); + if (tile != null && tile instanceof TileEntityRoad + && !((TileEntityRoad) tile).isLocked) { + flag = true; + ((TileEntityRoad) tile).setSurface(block, held.getItemDamage()); + } + } + } + } + } + } + } + return flag; + } + + private boolean toggleLocks(World world, int x, int y, int z, int r) { + boolean flag = false; + TileEntityRoad tile = getTile(world, x, y, z); + if (tile == null) { + return false; + } + flag = !tile.isLocked; + tile.isLocked = flag; + tile.sendPacketToClients(); + + for (int x2 = -r; x2 <= r; x2++) { + for (int y2 = -r; y2 <= r; y2++) { + for (int z2 = -r; z2 <= r; z2++) { + if (getDistance(x + x2, y + y2, z + z2, x, y, z) < r) { + TileEntityRoad tile2 = getTile(world, x + x2, y + y2, z + z2); + if (tile2 != null) { + tile2.isLocked = flag; + tile2.sendPacketToClients(); + } + } + } + } + } + return true; + } + + public double getDistance(double x, double y, double z, int posX, int posY, int posZ) { + double var7 = posX - x; + double var9 = posY - y; + double var11 = posZ - z; + return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityRoad(); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockSchematic.java b/src/main/java/minefantasy/mf2/block/decor/BlockSchematic.java index 2a4ce7a7..a8ca0ac7 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockSchematic.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockSchematic.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.decor; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -20,111 +17,114 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.List; +import java.util.Random; + public class BlockSchematic extends Block { - public IIcon[] icons = new IIcon[6]; - - public BlockSchematic(String name) { - super(Material.cloth); - - GameRegistry.registerBlock(this, name); - setBlockName(name); - setBlockTextureName("minefantasy2:meta/" + name); - setBlockBounds(0F, 0F, 0F, 1F, 0F, 1F); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item item, CreativeTabs tab, List list) { - } - - @Override - @SideOnly(Side.CLIENT) - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public Item getItemDropped(int meta, Random rand, int i) { - return ComponentListMF.artefacts; - } - - @Override - public int damageDropped(int meta) { - return meta + 4; - } - - @Override - public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return icons[Math.min(meta, icons.length - 1)]; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - for (int i = 0; i < icons.length; i++) { - this.icons[i] = reg.registerIcon("minefantasy2:meta/schematic_" + (i + 1)); - } - } - - public static boolean useSchematic(ItemStack item, World world, EntityPlayer user, - MovingObjectPosition movingobjectposition) { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (movingobjectposition.sideHit == 0) { - --j; - } - - if (movingobjectposition.sideHit == 1) { - ++j; - } - - if (movingobjectposition.sideHit == 2) { - --k; - } - - if (movingobjectposition.sideHit == 3) { - ++k; - } - - if (movingobjectposition.sideHit == 4) { - --i; - } - - if (movingobjectposition.sideHit == 5) { - ++i; - } - - if (user.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { - return placeSchematic(item.getItemDamage(), user, item, user.worldObj, i, j, k); - } - } - return false; - } - - public static boolean placeSchematic(int meta, EntityPlayer user, ItemStack item, World world, int x, int y, - int z) { - if (world.isAirBlock(x, y, z) && canBuildOn(world, x, y - 1, z)) { - world.setBlock(x, y, z, BlockListMF.schematic_general, Math.max(0, meta - 4), 2); - return true; - } - return false; - } - - public static boolean canBuildOn(World world, int x, int y, int z) { - return world.isSideSolid(x, y, z, ForgeDirection.UP); - } + public IIcon[] icons = new IIcon[6]; + + public BlockSchematic(String name) { + super(Material.cloth); + + GameRegistry.registerBlock(this, name); + setBlockName(name); + setBlockTextureName("minefantasy2:meta/" + name); + setBlockBounds(0F, 0F, 0F, 1F, 0F, 1F); + } + + public static boolean useSchematic(ItemStack item, World world, EntityPlayer user, + MovingObjectPosition movingobjectposition) { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (movingobjectposition.sideHit == 0) { + --j; + } + + if (movingobjectposition.sideHit == 1) { + ++j; + } + + if (movingobjectposition.sideHit == 2) { + --k; + } + + if (movingobjectposition.sideHit == 3) { + ++k; + } + + if (movingobjectposition.sideHit == 4) { + --i; + } + + if (movingobjectposition.sideHit == 5) { + ++i; + } + + if (user.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return placeSchematic(item.getItemDamage(), user, item, user.worldObj, i, j, k); + } + } + return false; + } + + public static boolean placeSchematic(int meta, EntityPlayer user, ItemStack item, World world, int x, int y, + int z) { + if (world.isAirBlock(x, y, z) && canBuildOn(world, x, y - 1, z)) { + world.setBlock(x, y, z, BlockListMF.schematic_general, Math.max(0, meta - 4), 2); + return true; + } + return false; + } + + public static boolean canBuildOn(World world, int x, int y, int z) { + return world.isSideSolid(x, y, z, ForgeDirection.UP); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public Item getItemDropped(int meta, Random rand, int i) { + return ComponentListMF.artefacts; + } + + @Override + public int damageDropped(int meta) { + return meta + 4; + } + + @Override + public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return icons[Math.min(meta, icons.length - 1)]; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + for (int i = 0; i < icons.length; i++) { + this.icons[i] = reg.registerIcon("minefantasy2:meta/schematic_" + (i + 1)); + } + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java b/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java index 18ddca18..bf3aabd3 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java @@ -17,105 +17,104 @@ import net.minecraft.world.World; public class BlockTrough extends BlockWoodDecor { - public static int trough_RI = 107; - - public BlockTrough(String name) { - super(name); - this.setBlockBounds(0F, 0F, 0F, 1.0F, (7F / 16F), 1.0F); - - GameRegistry.registerBlock(this, ItemBlockTrough.class, name); - setBlockName(name); - this.setHardness(1F); - this.setResistance(0.5F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderBlockPass() { - return 1; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public IIcon getIcon(int side, int meta) { - return Blocks.planks.getIcon(side, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - - } - - @SideOnly(Side.CLIENT) - public int getRenderType() { - return trough_RI; - } - - public static final String NBT_fill = "Fill_Level"; - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - - TileEntityTrough tile = getTile(world, x, y, z); - if (tile != null) { - if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_fill)) { - tile.fill = item.getTagCompound().getInteger(NBT_fill); - } - } - super.onBlockPlacedBy(world, x, y, z, user, item); - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityTrough(); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - ItemStack held = user.getHeldItem(); - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityTrough) { - if (((TileEntityTrough) tile).interact(user, held)) { - world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.splash", - 0.125F + user.getRNG().nextFloat() / 4F, 0.5F + user.getRNG().nextFloat()); - ((TileEntityTrough) tile).syncData(); - return true; - } - } - return false; - } - - private TileEntityTrough getTile(World world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityTrough) { - return (TileEntityTrough) tile; - } - return null; - } - - @Override - protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { - return modifyFill((TileEntityTrough) tile, super.modifyDrop(tile, item)); - } - - private ItemStack modifyFill(TileEntityTrough tile, ItemStack item) { - if (tile != null && item != null) { - item.getTagCompound().setInteger(NBT_fill, tile.fill); - } - return item; - } + public static final String NBT_fill = "Fill_Level"; + public static int trough_RI = 107; + + public BlockTrough(String name) { + super(name); + this.setBlockBounds(0F, 0F, 0F, 1.0F, (7F / 16F), 1.0F); + + GameRegistry.registerBlock(this, ItemBlockTrough.class, name); + setBlockName(name); + this.setHardness(1F); + this.setResistance(0.5F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + } + + @SideOnly(Side.CLIENT) + public int getRenderType() { + return trough_RI; + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + + TileEntityTrough tile = getTile(world, x, y, z); + if (tile != null) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(NBT_fill)) { + tile.fill = item.getTagCompound().getInteger(NBT_fill); + } + } + super.onBlockPlacedBy(world, x, y, z, user, item); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityTrough(); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + ItemStack held = user.getHeldItem(); + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityTrough) { + if (((TileEntityTrough) tile).interact(user, held)) { + world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.splash", + 0.125F + user.getRNG().nextFloat() / 4F, 0.5F + user.getRNG().nextFloat()); + ((TileEntityTrough) tile).syncData(); + return true; + } + } + return false; + } + + private TileEntityTrough getTile(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityTrough) { + return (TileEntityTrough) tile; + } + return null; + } + + @Override + protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { + return modifyFill((TileEntityTrough) tile, super.modifyDrop(tile, item)); + } + + private ItemStack modifyFill(TileEntityTrough tile, ItemStack item) { + if (tile != null && item != null) { + item.getTagCompound().setInteger(NBT_fill, tile.fill); + } + return item; + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java b/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java index 8c35facc..b3a68d01 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.decor; -import java.util.ArrayList; -import java.util.Random; - import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.tileentity.decor.TileEntityWoodDecor; @@ -15,97 +12,99 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.Random; + public abstract class BlockWoodDecor extends BlockContainer { - private String texname; - - public BlockWoodDecor(String tex) { - super(Material.wood); - this.texname = tex; - } - - @Override - public abstract TileEntity createNewTileEntity(World world, int meta); - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - TileEntityWoodDecor tile = getTile(world, x, y, z); - if (tile != null) { - onPlaceTile(tile, world, x, y, z, user, item); - } - } - - protected void onPlaceTile(TileEntityWoodDecor tile, World world, int x, int y, int z, EntityLivingBase user, - ItemStack item) { - CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if (material != null) { - tile.setMaterial(material); - } - } - - private TileEntityWoodDecor getTile(World world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityWoodDecor) { - return (TileEntityWoodDecor) tile; - } - return null; - } - - @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { - ArrayList ret = new ArrayList(); - return ret; - } - - protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { - if (tile != null && item != null) { - CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, tile.getMaterialName()); - } - return item; - } - - private Random rand = new Random(); - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityWoodDecor tile = getTile(world, x, y, z); - - ItemStack itemstack = new ItemStack(getItemDropped(meta, world.rand, 0), 1, damageDropped(meta)); - - itemstack = modifyDrop(tile, itemstack); - - if (tile != null) { - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, itemstack); - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - public String getFullTexName() { - return this.texname; - } - - public ItemStack construct(String name) { - return construct(name, 1); - } - - public ItemStack construct(String name, int stacksize) { - ItemStack item = new ItemStack(this, stacksize); - CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, name.toLowerCase()); - - return item; - } + private String texname; + private Random rand = new Random(); + + public BlockWoodDecor(String tex) { + super(Material.wood); + this.texname = tex; + } + + @Override + public abstract TileEntity createNewTileEntity(World world, int meta); + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + TileEntityWoodDecor tile = getTile(world, x, y, z); + if (tile != null) { + onPlaceTile(tile, world, x, y, z, user, item); + } + } + + protected void onPlaceTile(TileEntityWoodDecor tile, World world, int x, int y, int z, EntityLivingBase user, + ItemStack item) { + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); + if (material != null) { + tile.setMaterial(material); + } + } + + private TileEntityWoodDecor getTile(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityWoodDecor) { + return (TileEntityWoodDecor) tile; + } + return null; + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList ret = new ArrayList(); + return ret; + } + + protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { + if (tile != null && item != null) { + CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, tile.getMaterialName()); + } + return item; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityWoodDecor tile = getTile(world, x, y, z); + + ItemStack itemstack = new ItemStack(getItemDropped(meta, world.rand, 0), 1, damageDropped(meta)); + + itemstack = modifyDrop(tile, itemstack); + + if (tile != null) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, itemstack); + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + public String getFullTexName() { + return this.texname; + } + + public ItemStack construct(String name) { + return construct(name, 1); + } + + public ItemStack construct(String name, int stacksize) { + ItemStack item = new ItemStack(this, stacksize); + CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, name.toLowerCase()); + + return item; + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/ItemBedMF.java b/src/main/java/minefantasy/mf2/block/decor/ItemBedMF.java index ee35a19a..298c41fc 100644 --- a/src/main/java/minefantasy/mf2/block/decor/ItemBedMF.java +++ b/src/main/java/minefantasy/mf2/block/decor/ItemBedMF.java @@ -11,69 +11,69 @@ import net.minecraft.world.World; public class ItemBedMF extends Item { - public ItemBedMF(String name) {// ItemBed - this.setUnlocalizedName(name); - setMaxStackSize(4); - setTextureName("minefantasy2:Other/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setCreativeTab(CreativeTabMF.tabGadget); - } + public ItemBedMF(String name) {// ItemBed + this.setUnlocalizedName(name); + setMaxStackSize(4); + setTextureName("minefantasy2:Other/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setCreativeTab(CreativeTabMF.tabGadget); + } - /** - * Callback for item usage. If the item does something special on right - * clicking, he will have one of those. Return True if something happen and - * false if it don't. This is for ITEMS, not BLOCKS - */ - 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_3_.isRemote) { - return true; - } else if (p_77648_7_ != 1) { - return false; - } else { - ++p_77648_5_; - BlockBedMF blockbed = (BlockBedMF) BlockListMF.bedroll; - int i1 = MathHelper.floor_double(p_77648_2_.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - byte b0 = 0; - byte b1 = 0; + /** + * Callback for item usage. If the item does something special on right + * clicking, he will have one of those. Return True if something happen and + * false if it don't. This is for ITEMS, not BLOCKS + */ + 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_3_.isRemote) { + return true; + } else if (p_77648_7_ != 1) { + return false; + } else { + ++p_77648_5_; + BlockBedMF blockbed = (BlockBedMF) BlockListMF.bedroll; + int i1 = MathHelper.floor_double(p_77648_2_.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + byte b0 = 0; + byte b1 = 0; - if (i1 == 0) { - b1 = 1; - } + if (i1 == 0) { + b1 = 1; + } - if (i1 == 1) { - b0 = -1; - } + if (i1 == 1) { + b0 = -1; + } - if (i1 == 2) { - b1 = -1; - } + if (i1 == 2) { + b1 = -1; + } - if (i1 == 3) { - b0 = 1; - } + if (i1 == 3) { + b0 = 1; + } - if (p_77648_2_.canPlayerEdit(p_77648_4_, p_77648_5_, p_77648_6_, p_77648_7_, p_77648_1_) - && p_77648_2_.canPlayerEdit(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1, p_77648_7_, p_77648_1_)) { - if (p_77648_3_.isAirBlock(p_77648_4_, p_77648_5_, p_77648_6_) - && p_77648_3_.isAirBlock(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1) - && World.doesBlockHaveSolidTopSurface(p_77648_3_, p_77648_4_, p_77648_5_ - 1, p_77648_6_) - && World.doesBlockHaveSolidTopSurface(p_77648_3_, p_77648_4_ + b0, p_77648_5_ - 1, - p_77648_6_ + b1)) { - p_77648_3_.setBlock(p_77648_4_, p_77648_5_, p_77648_6_, blockbed, i1, 3); + if (p_77648_2_.canPlayerEdit(p_77648_4_, p_77648_5_, p_77648_6_, p_77648_7_, p_77648_1_) + && p_77648_2_.canPlayerEdit(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1, p_77648_7_, p_77648_1_)) { + if (p_77648_3_.isAirBlock(p_77648_4_, p_77648_5_, p_77648_6_) + && p_77648_3_.isAirBlock(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1) + && World.doesBlockHaveSolidTopSurface(p_77648_3_, p_77648_4_, p_77648_5_ - 1, p_77648_6_) + && World.doesBlockHaveSolidTopSurface(p_77648_3_, p_77648_4_ + b0, p_77648_5_ - 1, + p_77648_6_ + b1)) { + p_77648_3_.setBlock(p_77648_4_, p_77648_5_, p_77648_6_, blockbed, i1, 3); - if (p_77648_3_.getBlock(p_77648_4_, p_77648_5_, p_77648_6_) == blockbed) { - p_77648_3_.setBlock(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1, blockbed, i1 + 8, 3); - } + if (p_77648_3_.getBlock(p_77648_4_, p_77648_5_, p_77648_6_) == blockbed) { + p_77648_3_.setBlock(p_77648_4_ + b0, p_77648_5_, p_77648_6_ + b1, blockbed, i1 + 8, 3); + } - --p_77648_1_.stackSize; - return true; - } else { - return false; - } - } else { - return false; - } - } - } + --p_77648_1_.stackSize; + return true; + } else { + return false; + } + } else { + return false; + } + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/decor/ItemBlockAmmoBox.java b/src/main/java/minefantasy/mf2/block/decor/ItemBlockAmmoBox.java index 86696d12..9779566f 100644 --- a/src/main/java/minefantasy/mf2/block/decor/ItemBlockAmmoBox.java +++ b/src/main/java/minefantasy/mf2/block/decor/ItemBlockAmmoBox.java @@ -1,9 +1,5 @@ package minefantasy.mf2.block.decor; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -19,51 +15,55 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + public class ItemBlockAmmoBox extends ItemBlock implements IStorageBlock { - public ItemBlockAmmoBox(Block base) { - super(base); - } + public ItemBlockAmmoBox(Block base) { + super(base); + } - @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean info) { - if (item.hasTagCompound() && item.getTagCompound().hasKey(BlockAmmoBox.NBT_Ammo) - && item.getTagCompound().hasKey(BlockAmmoBox.NBT_Stock)) { - ItemStack ammo = ItemStack - .loadItemStackFromNBT(item.getTagCompound().getCompoundTag(BlockAmmoBox.NBT_Ammo)); - int stock = item.getTagCompound().getInteger(BlockAmmoBox.NBT_Stock); - if (ammo != null) { - list.add(ammo.getDisplayName() + " x" + stock); - } - } - CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); - if (material != null) { - list.add(StatCollector.translateToLocalFormatted("attribute.box.capacity.name", - TileEntityAmmoBox.getCapacity(material.tier))); - } - } + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean info) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(BlockAmmoBox.NBT_Ammo) + && item.getTagCompound().hasKey(BlockAmmoBox.NBT_Stock)) { + ItemStack ammo = ItemStack + .loadItemStackFromNBT(item.getTagCompound().getCompoundTag(BlockAmmoBox.NBT_Ammo)); + int stock = item.getTagCompound().getInteger(BlockAmmoBox.NBT_Stock); + if (ammo != null) { + list.add(ammo.getDisplayName() + " x" + stock); + } + } + CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); + if (material != null) { + list.add(StatCollector.translateToLocalFormatted("attribute.box.capacity.name", + TileEntityAmmoBox.getCapacity(material.tier))); + } + } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (MineFantasyII.isDebug()) { - ArrayList wood = CustomMaterial.getList("wood"); - Iterator iteratorWood = wood.iterator(); - while (iteratorWood.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - list.add(this.construct(customMat.name)); - } - } else { - list.add(this.construct("RefinedWood")); - } - } + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (MineFantasyII.isDebug()) { + ArrayList wood = CustomMaterial.getList("wood"); + Iterator iteratorWood = wood.iterator(); + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + list.add(this.construct(customMat.name)); + } + } else { + list.add(this.construct("RefinedWood")); + } + } - private ItemStack construct(String name) { - return CustomToolHelper.constructSingleColoredLayer(this, name, 1); - } + private ItemStack construct(String name) { + return CustomToolHelper.constructSingleColoredLayer(this, name, 1); + } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - return CustomToolHelper.getLocalisedName(item, this.getUnlocalizedNameInefficiently(item) + ".name"); - } + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + return CustomToolHelper.getLocalisedName(item, this.getUnlocalizedNameInefficiently(item) + ".name"); + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/ItemBlockToolRack.java b/src/main/java/minefantasy/mf2/block/decor/ItemBlockToolRack.java index e3562f8f..0f82da66 100644 --- a/src/main/java/minefantasy/mf2/block/decor/ItemBlockToolRack.java +++ b/src/main/java/minefantasy/mf2/block/decor/ItemBlockToolRack.java @@ -1,9 +1,5 @@ package minefantasy.mf2.block.decor; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -15,32 +11,36 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + public class ItemBlockToolRack extends ItemBlock { - public ItemBlockToolRack(Block base) { - super(base); - } + public ItemBlockToolRack(Block base) { + super(base); + } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (MineFantasyII.isDebug()) { - ArrayList wood = CustomMaterial.getList("wood"); - Iterator iteratorWood = wood.iterator(); - while (iteratorWood.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - list.add(this.construct(customMat.name)); - } - } else { - list.add(this.construct("RefinedWood")); - } - } + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (MineFantasyII.isDebug()) { + ArrayList wood = CustomMaterial.getList("wood"); + Iterator iteratorWood = wood.iterator(); + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + list.add(this.construct(customMat.name)); + } + } else { + list.add(this.construct("RefinedWood")); + } + } - private ItemStack construct(String name) { - return CustomToolHelper.constructSingleColoredLayer(this, name, 1); - } + private ItemStack construct(String name) { + return CustomToolHelper.constructSingleColoredLayer(this, name, 1); + } - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - return CustomToolHelper.getLocalisedName(item, this.getUnlocalizedNameInefficiently(item) + ".name"); - } + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + return CustomToolHelper.getLocalisedName(item, this.getUnlocalizedNameInefficiently(item) + ".name"); + } } diff --git a/src/main/java/minefantasy/mf2/block/decor/ItemBlockTrough.java b/src/main/java/minefantasy/mf2/block/decor/ItemBlockTrough.java index f12cd938..11f05d62 100644 --- a/src/main/java/minefantasy/mf2/block/decor/ItemBlockTrough.java +++ b/src/main/java/minefantasy/mf2/block/decor/ItemBlockTrough.java @@ -1,10 +1,5 @@ package minefantasy.mf2.block.decor; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -24,111 +19,116 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + public class ItemBlockTrough extends ItemBlock implements IStorageBlock { - public ItemBlockTrough(Block base) { - super(base); - } - - @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean info) { - if (item.hasTagCompound() && item.getTagCompound().hasKey(BlockTrough.NBT_fill)) { - int stock = item.getTagCompound().getInteger(BlockTrough.NBT_fill); - if (stock > 0) { - list.add(StatCollector.translateToLocalFormatted("attribute.fill", stock)); - } - } - CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); - if (material != null) { - list.add(StatCollector.translateToLocalFormatted("attribute.fill.capacity.name", - TileEntityTrough.getCapacity(material.tier) * TileEntityTrough.capacityScale)); - } - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (MineFantasyII.isDebug()) { - ArrayList wood = CustomMaterial.getList("wood"); - Iterator iteratorWood = wood.iterator(); - while (iteratorWood.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - list.add(this.construct(customMat.name)); - } - } else { - list.add(this.construct("RefinedWood")); - } - } - - private ItemStack construct(String name) { - return CustomToolHelper.constructSingleColoredLayer(this, name, 1); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - return CustomToolHelper.getLocalisedName(item, this.getUnlocalizedNameInefficiently(item) + ".name"); - } - - @Override - public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int x, int y, int z, int side, float f, - float f1, float f2) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - - if (movingobjectposition == null) { - return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (!world.canMineBlock(player, i, j, k)) { - return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); - } - - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { - return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); - } - - if (isWaterSource(world, i, j, k)) { - gather(player); - world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, - 0.5F + rand.nextFloat()); - return false; - } - } - return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); - } - } - - private Random rand = new Random(); - - private void gather(EntityPlayer player) { - ItemStack item = player.getHeldItem(); - if (item != null) { - int tier = 0; - CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); - if (material != null) { - tier = material.tier; - } - NBTTagCompound nbt = getNBT(item); - nbt.setInteger(BlockTrough.NBT_fill, TileEntityTrough.getCapacity(tier) * TileEntityTrough.capacityScale); - } - player.swingItem(); - - } - - private NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - return item.getTagCompound(); - } - - private boolean isWaterSource(World world, int i, int j, int k) { - if (world.getBlock(i, j, k).getMaterial() == Material.water) { - return true; - } - return false; - } + private Random rand = new Random(); + + public ItemBlockTrough(Block base) { + super(base); + } + + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean info) { + if (item.hasTagCompound() && item.getTagCompound().hasKey(BlockTrough.NBT_fill)) { + int stock = item.getTagCompound().getInteger(BlockTrough.NBT_fill); + if (stock > 0) { + list.add(StatCollector.translateToLocalFormatted("attribute.fill", stock)); + } + } + CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); + if (material != null) { + list.add(StatCollector.translateToLocalFormatted("attribute.fill.capacity.name", + TileEntityTrough.getCapacity(material.tier) * TileEntityTrough.capacityScale)); + } + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (MineFantasyII.isDebug()) { + ArrayList wood = CustomMaterial.getList("wood"); + Iterator iteratorWood = wood.iterator(); + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + list.add(this.construct(customMat.name)); + } + } else { + list.add(this.construct("RefinedWood")); + } + } + + private ItemStack construct(String name) { + return CustomToolHelper.constructSingleColoredLayer(this, name, 1); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + return CustomToolHelper.getLocalisedName(item, this.getUnlocalizedNameInefficiently(item) + ".name"); + } + + @Override + public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int x, int y, int z, int side, float f, + float f1, float f2) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + + if (movingobjectposition == null) { + return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) { + return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); + } + + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); + } + + if (isWaterSource(world, i, j, k)) { + gather(player); + world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, + 0.5F + rand.nextFloat()); + return false; + } + } + return super.onItemUse(item, player, world, x, y, z, side, f, f1, f2); + } + } + + private void gather(EntityPlayer player) { + ItemStack item = player.getHeldItem(); + if (item != null) { + int tier = 0; + CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); + if (material != null) { + tier = material.tier; + } + NBTTagCompound nbt = getNBT(item); + nbt.setInteger(BlockTrough.NBT_fill, TileEntityTrough.getCapacity(tier) * TileEntityTrough.capacityScale); + } + player.swingItem(); + + } + + private NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + return item.getTagCompound(); + } + + private boolean isWaterSource(World world, int i, int j, int k) { + if (world.getBlock(i, j, k).getMaterial() == Material.water) { + return true; + } + return false; + } } diff --git a/src/main/java/minefantasy/mf2/block/food/BlockBerryBush.java b/src/main/java/minefantasy/mf2/block/food/BlockBerryBush.java index fa34dcb1..048c5462 100644 --- a/src/main/java/minefantasy/mf2/block/food/BlockBerryBush.java +++ b/src/main/java/minefantasy/mf2/block/food/BlockBerryBush.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.food; -import java.util.ArrayList; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -22,172 +19,175 @@ import net.minecraft.world.World; import net.minecraftforge.common.IShearable; +import java.util.ArrayList; +import java.util.Random; + public class BlockBerryBush extends BlockBush implements IShearable { - private Random rand = new Random(); - int[] field_150128_a; - @SideOnly(Side.CLIENT) - protected int field_150127_b; - private IIcon[] berriedBush = new IIcon[2]; - private IIcon[] emptyBush = new IIcon[2]; - - public BlockBerryBush(String name) { - super(Material.leaves); - GameRegistry.registerBlock(this, ItemBlockBerries.class, name); - setBlockName(name); - - this.setTickRandomly(true); - this.setCreativeTab(CreativeTabs.tabDecorations); - this.setHardness(0.3F); - float offset = 1 / 16F; - this.setBlockBounds(offset, 0F, offset, 1.0F - offset, 1.0F - (offset * 2), 1.0F - offset); - this.setLightOpacity(1); - this.setStepSound(soundTypeGrass); - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random rand) { - int meta = world.getBlockMetadata(x, y, z); - if (meta >= 1 && rand.nextInt(120) == 0) { - world.setBlockMetadataWithNotify(x, y, z, 0, 2); - } - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - berriedBush[0] = reg.registerIcon("minefantasy2:food/berrybushfull"); - berriedBush[1] = reg.registerIcon("minefantasy2:food/berrybushfull_opaque"); - emptyBush[0] = reg.registerIcon("minefantasy2:food/berrybush"); - emptyBush[1] = reg.registerIcon("minefantasy2:food/berrybush_opaque"); - } - - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) { - int flag = Minecraft.getMinecraft().gameSettings.fancyGraphics ? 0 : 1; - if (meta == 0) { - return berriedBush[flag]; - } - return emptyBush[flag]; - } - - @Override - public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z) { - return true; - } - - @Override - public ArrayList onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune) { - ArrayList ret = new ArrayList(); - ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z) & 3)); - return ret; - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - int meta = world.getBlockMetadata(x, y, z); - if (meta == 0) { - if (world.isRemote) - return true; - - world.setBlockMetadataWithNotify(x, y, z, 1, 2); - - ItemStack itemstack = rand.nextInt(10) == 0 ? new ItemStack(FoodListMF.berriesJuicy) - : new ItemStack(FoodListMF.berries, 1); - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - - return true; - } - return false; - } - - @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { - return new ArrayList() { - }; - } - - @Override - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { - return true; - } - - @Override - public int getRenderType() { - return 0; - } - - @SideOnly(Side.CLIENT) - @Override - public int getRenderColor(int i) { - return ColorizerFoliage.getFoliageColorBasic(); - } - - @SideOnly(Side.CLIENT) - @Override - public int getBlockColor() { - double d0 = 0.5D; - double d1 = 1.0D; - return ColorizerFoliage.getFoliageColor(d0, d1); - } - - @SideOnly(Side.CLIENT) - @Override - public int colorMultiplier(IBlockAccess world, int x, int y, int z) { - int l = 0; - int i1 = 0; - int j1 = 0; - - for (int k1 = -1; k1 <= 1; ++k1) { - for (int l1 = -1; l1 <= 1; ++l1) { - int i2 = world.getBiomeGenForCoords(x + l1, z + k1).getBiomeFoliageColor(x + l1, y, z + k1); - l += (i2 & 16711680) >> 16; - i1 += (i2 & 65280) >> 8; - j1 += i2 & 255; - } - } - - return (l / 9 & 255) << 16 | (i1 / 9 & 255) << 8 | j1 / 9 & 255; - } + @SideOnly(Side.CLIENT) + protected int field_150127_b; + int[] field_150128_a; + private Random rand = new Random(); + private IIcon[] berriedBush = new IIcon[2]; + private IIcon[] emptyBush = new IIcon[2]; + + public BlockBerryBush(String name) { + super(Material.leaves); + GameRegistry.registerBlock(this, ItemBlockBerries.class, name); + setBlockName(name); + + this.setTickRandomly(true); + this.setCreativeTab(CreativeTabs.tabDecorations); + this.setHardness(0.3F); + float offset = 1 / 16F; + this.setBlockBounds(offset, 0F, offset, 1.0F - offset, 1.0F - (offset * 2), 1.0F - offset); + this.setLightOpacity(1); + this.setStepSound(soundTypeGrass); + } + + /** + * Ticks the block if it's been scheduled + */ + @Override + public void updateTick(World world, int x, int y, int z, Random rand) { + int meta = world.getBlockMetadata(x, y, z); + if (meta >= 1 && rand.nextInt(120) == 0) { + world.setBlockMetadataWithNotify(x, y, z, 0, 2); + } + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + berriedBush[0] = reg.registerIcon("minefantasy2:food/berrybushfull"); + berriedBush[1] = reg.registerIcon("minefantasy2:food/berrybushfull_opaque"); + emptyBush[0] = reg.registerIcon("minefantasy2:food/berrybush"); + emptyBush[1] = reg.registerIcon("minefantasy2:food/berrybush_opaque"); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + int flag = Minecraft.getMinecraft().gameSettings.fancyGraphics ? 0 : 1; + if (meta == 0) { + return berriedBush[flag]; + } + return emptyBush[flag]; + } + + @Override + public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z) { + return true; + } + + @Override + public ArrayList onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune) { + ArrayList ret = new ArrayList(); + ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z) & 3)); + return ret; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + int meta = world.getBlockMetadata(x, y, z); + if (meta == 0) { + if (world.isRemote) + return true; + + world.setBlockMetadataWithNotify(x, y, z, 1, 2); + + ItemStack itemstack = rand.nextInt(10) == 0 ? new ItemStack(FoodListMF.berriesJuicy) + : new ItemStack(FoodListMF.berries, 1); + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + + return true; + } + return false; + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return new ArrayList() { + }; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public int getRenderType() { + return 0; + } + + @SideOnly(Side.CLIENT) + @Override + public int getRenderColor(int i) { + return ColorizerFoliage.getFoliageColorBasic(); + } + + @SideOnly(Side.CLIENT) + @Override + public int getBlockColor() { + double d0 = 0.5D; + double d1 = 1.0D; + return ColorizerFoliage.getFoliageColor(d0, d1); + } + + @SideOnly(Side.CLIENT) + @Override + public int colorMultiplier(IBlockAccess world, int x, int y, int z) { + int l = 0; + int i1 = 0; + int j1 = 0; + + for (int k1 = -1; k1 <= 1; ++k1) { + for (int l1 = -1; l1 <= 1; ++l1) { + int i2 = world.getBiomeGenForCoords(x + l1, z + k1).getBiomeFoliageColor(x + l1, y, z + k1); + l += (i2 & 16711680) >> 16; + i1 += (i2 & 65280) >> 8; + j1 += i2 & 255; + } + } + + return (l / 9 & 255) << 16 | (i1 / 9 & 255) << 8 | j1 / 9 & 255; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/food/BlockCakeMF.java b/src/main/java/minefantasy/mf2/block/food/BlockCakeMF.java index e4f63b00..841124e5 100644 --- a/src/main/java/minefantasy/mf2/block/food/BlockCakeMF.java +++ b/src/main/java/minefantasy/mf2/block/food/BlockCakeMF.java @@ -19,201 +19,201 @@ import net.minecraft.world.World; public class BlockCakeMF extends Block { - @SideOnly(Side.CLIENT) - private IIcon topTex; - @SideOnly(Side.CLIENT) - private IIcon bottomTex; - @SideOnly(Side.CLIENT) - private IIcon insideTex; - private Item cakeSlice; - protected int maxSlices = 8; - protected float height = 0.5F; - protected float width = 14F / 16F; - - public BlockCakeMF(String name, Item slice) { - super(Material.cake); - GameRegistry.registerBlock(this, ItemBlockCake.class, name); - setBlockName(name); - setBlockTextureName("minefantasy2:food/" + name); - cakeSlice = slice; - this.setTickRandomly(true); - setCreativeTab(CreativeTabMF.tabFood); - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - int slices = world.getBlockMetadata(x, y, z); - float border = (1F - width) / 2; - float size = (slices / (float) maxSlices) * (1.0F - (border * 2)); - this.setBlockBounds(border + size, 0.0F, border, 1.0F - border, height, 1.0F - border); - } - - /** - * Sets the block's bounds for rendering it as an item - */ - @Override - public void setBlockBoundsForItemRender() { - float f = (1F - width) / 2; - float f1 = height; - this.setBlockBounds(f, 0.0F, f, 1.0F - f, f1, 1.0F - f); - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box - * can change after the pool has been cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - int slices = world.getBlockMetadata(x, y, z); - float border = (1F - width) / 2; - float size = border + (slices / (float) maxSlices) * (1.0F - (border * 2)); - return AxisAlignedBB.getBoundingBox(x + size, y, z + border, x + 1 - border, y + height - border, - z + 1 - border); - } - - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - @SideOnly(Side.CLIENT) - @Override - public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { - int slices = world.getBlockMetadata(x, y, z); - float border = (1F - width) / 2; - float size = border + (slices / (float) maxSlices) * (1.0F - (border * 2)); - return AxisAlignedBB.getBoundingBox(x + size, y, z + border, x + 1 - border, y + height, z + 1 - border); - } - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) { - return side == 1 ? this.topTex - : (side == 0 ? this.bottomTex : (meta > 0 && side == 4 ? this.insideTex : this.blockIcon)); - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - this.blockIcon = reg.registerIcon(this.getTextureName() + "_side"); - this.insideTex = reg.registerIcon(this.getTextureName() + "_inner"); - this.topTex = reg.registerIcon(this.getTextureName() + "_top"); - this.bottomTex = reg.registerIcon(this.getTextureName() + "_bottom"); - } - - /** - * If this block doesn't render as an ordinary block it will return False - * (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() { - return false; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or - * not to render the shared face of two adjacent blocks and also whether the - * player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() { - return false; - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xoffset, - float yoffset, float zoffset) { - if (ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("knife")) { - this.cutSlice(world, x, y, z, user); - return true; - } - return false; - } - - /** - * Called when a player hits the block. Args: world, x, y, z, player - */ - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { - if (ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("knife")) { - this.cutSlice(world, x, y, z, user); - } - } - - private void cutSlice(World world, int x, int y, int z, EntityPlayer user) { - if (cakeSlice != null) { - ItemStack slice = new ItemStack(cakeSlice); - if (!user.inventory.addItemStackToInventory(slice)) { - user.entityDropItem(slice, 1.0F); - } - } - int l = world.getBlockMetadata(x, y, z) + 1; - - if (l >= maxSlices) { - world.setBlockToAir(x, y, z); - } else { - world.setBlockMetadataWithNotify(x, y, z, l, 2); - } - if (user.getHeldItem() != null) { - user.getHeldItem().damageItem(1, user); - } - } - - /** - * Checks to see if its valid to put this block at the specified coordinates. - * Args: world, x, y, z - */ - @Override - public boolean canPlaceBlockAt(World world, int x, int y, int z) { - return !super.canPlaceBlockAt(world, x, y, z) ? false : this.canBlockStay(world, x, y, z); - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which - * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor - * Block - */ - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - if (!this.canBlockStay(world, x, y, z)) { - ItemStack item = new ItemStack(this, 1, damageDropped(world.getBlockMetadata(x, y, z))); - EntityItem drop = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, item); - world.spawnEntityInWorld(drop); - world.setBlockToAir(x, y, z); - } - } - - /** - * Can this block stay at this position. Similar to canPlaceBlockAt except gets - * checked often with plants. - */ - @Override - public boolean canBlockStay(World world, int x, int y, int z) { - return world.getBlock(x, y - 1, z).getMaterial().isSolid(); - } - - @Override - public int damageDropped(int meta) { - return meta; - } - - public int getRarity() { - if (cakeSlice instanceof ItemFoodMF) { - return ((ItemFoodMF) cakeSlice).itemRarity; - } - return 0; - } - - public Block setCheese() { - width = 0.5F; - height = 5F / 16F; - return this; - } + protected int maxSlices = 8; + protected float height = 0.5F; + protected float width = 14F / 16F; + @SideOnly(Side.CLIENT) + private IIcon topTex; + @SideOnly(Side.CLIENT) + private IIcon bottomTex; + @SideOnly(Side.CLIENT) + private IIcon insideTex; + private Item cakeSlice; + + public BlockCakeMF(String name, Item slice) { + super(Material.cake); + GameRegistry.registerBlock(this, ItemBlockCake.class, name); + setBlockName(name); + setBlockTextureName("minefantasy2:food/" + name); + cakeSlice = slice; + this.setTickRandomly(true); + setCreativeTab(CreativeTabMF.tabFood); + } + + /** + * Updates the blocks bounds based on its current state. Args: world, x, y, z + */ + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + int slices = world.getBlockMetadata(x, y, z); + float border = (1F - width) / 2; + float size = (slices / (float) maxSlices) * (1.0F - (border * 2)); + this.setBlockBounds(border + size, 0.0F, border, 1.0F - border, height, 1.0F - border); + } + + /** + * Sets the block's bounds for rendering it as an item + */ + @Override + public void setBlockBoundsForItemRender() { + float f = (1F - width) / 2; + float f1 = height; + this.setBlockBounds(f, 0.0F, f, 1.0F - f, f1, 1.0F - f); + } + + /** + * Returns a bounding box from the pool of bounding boxes (this means this box + * can change after the pool has been cleared to be reused) + */ + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + int slices = world.getBlockMetadata(x, y, z); + float border = (1F - width) / 2; + float size = border + (slices / (float) maxSlices) * (1.0F - (border * 2)); + return AxisAlignedBB.getBoundingBox(x + size, y, z + border, x + 1 - border, y + height - border, + z + 1 - border); + } + + /** + * Returns the bounding box of the wired rectangular prism to render. + */ + @SideOnly(Side.CLIENT) + @Override + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + int slices = world.getBlockMetadata(x, y, z); + float border = (1F - width) / 2; + float size = border + (slices / (float) maxSlices) * (1.0F - (border * 2)); + return AxisAlignedBB.getBoundingBox(x + size, y, z + border, x + 1 - border, y + height, z + 1 - border); + } + + /** + * Gets the block's texture. Args: side, meta + */ + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + return side == 1 ? this.topTex + : (side == 0 ? this.bottomTex : (meta > 0 && side == 4 ? this.insideTex : this.blockIcon)); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(this.getTextureName() + "_side"); + this.insideTex = reg.registerIcon(this.getTextureName() + "_inner"); + this.topTex = reg.registerIcon(this.getTextureName() + "_top"); + this.bottomTex = reg.registerIcon(this.getTextureName() + "_bottom"); + } + + /** + * If this block doesn't render as an ordinary block it will return False + * (examples: signs, buttons, stairs, etc) + */ + @Override + public boolean renderAsNormalBlock() { + return false; + } + + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or + * not to render the shared face of two adjacent blocks and also whether the + * player can attach torches, redstone wire, etc to this block. + */ + @Override + public boolean isOpaqueCube() { + return false; + } + + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xoffset, + float yoffset, float zoffset) { + if (ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("knife")) { + this.cutSlice(world, x, y, z, user); + return true; + } + return false; + } + + /** + * Called when a player hits the block. Args: world, x, y, z, player + */ + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + if (ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("knife")) { + this.cutSlice(world, x, y, z, user); + } + } + + private void cutSlice(World world, int x, int y, int z, EntityPlayer user) { + if (cakeSlice != null) { + ItemStack slice = new ItemStack(cakeSlice); + if (!user.inventory.addItemStackToInventory(slice)) { + user.entityDropItem(slice, 1.0F); + } + } + int l = world.getBlockMetadata(x, y, z) + 1; + + if (l >= maxSlices) { + world.setBlockToAir(x, y, z); + } else { + world.setBlockMetadataWithNotify(x, y, z, l, 2); + } + if (user.getHeldItem() != null) { + user.getHeldItem().damageItem(1, user); + } + } + + /** + * Checks to see if its valid to put this block at the specified coordinates. + * Args: world, x, y, z + */ + @Override + public boolean canPlaceBlockAt(World world, int x, int y, int z) { + return !super.canPlaceBlockAt(world, x, y, z) ? false : this.canBlockStay(world, x, y, z); + } + + /** + * Lets the block know when one of its neighbor changes. Doesn't know which + * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor + * Block + */ + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + if (!this.canBlockStay(world, x, y, z)) { + ItemStack item = new ItemStack(this, 1, damageDropped(world.getBlockMetadata(x, y, z))); + EntityItem drop = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, item); + world.spawnEntityInWorld(drop); + world.setBlockToAir(x, y, z); + } + } + + /** + * Can this block stay at this position. Similar to canPlaceBlockAt except gets + * checked often with plants. + */ + @Override + public boolean canBlockStay(World world, int x, int y, int z) { + return world.getBlock(x, y - 1, z).getMaterial().isSolid(); + } + + @Override + public int damageDropped(int meta) { + return meta; + } + + public int getRarity() { + if (cakeSlice instanceof ItemFoodMF) { + return ((ItemFoodMF) cakeSlice).itemRarity; + } + return 0; + } + + public Block setCheese() { + width = 0.5F; + height = 5F / 16F; + return this; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/food/BlockPie.java b/src/main/java/minefantasy/mf2/block/food/BlockPie.java index 368b8e16..cdae4e93 100644 --- a/src/main/java/minefantasy/mf2/block/food/BlockPie.java +++ b/src/main/java/minefantasy/mf2/block/food/BlockPie.java @@ -4,9 +4,9 @@ public class BlockPie extends BlockCakeMF { - public BlockPie(String name, Item slice) { - super(name, slice); - this.height = 1F / 16F * 6F; - } + public BlockPie(String name, Item slice) { + super(name, slice); + this.height = 1F / 16F * 6F; + } } diff --git a/src/main/java/minefantasy/mf2/block/food/ItemBlockBerries.java b/src/main/java/minefantasy/mf2/block/food/ItemBlockBerries.java index 9a68f9db..eb6ee023 100644 --- a/src/main/java/minefantasy/mf2/block/food/ItemBlockBerries.java +++ b/src/main/java/minefantasy/mf2/block/food/ItemBlockBerries.java @@ -4,13 +4,13 @@ import net.minecraft.item.ItemBlock; public class ItemBlockBerries extends ItemBlock { - public ItemBlockBerries(Block block) { - super(block); - setHasSubtypes(true); - } + public ItemBlockBerries(Block block) { + super(block); + setHasSubtypes(true); + } - @Override - public int getMetadata(int id) { - return id; - } + @Override + public int getMetadata(int id) { + return id; + } } diff --git a/src/main/java/minefantasy/mf2/block/food/ItemBlockCake.java b/src/main/java/minefantasy/mf2/block/food/ItemBlockCake.java index c2cf8977..a32ce665 100644 --- a/src/main/java/minefantasy/mf2/block/food/ItemBlockCake.java +++ b/src/main/java/minefantasy/mf2/block/food/ItemBlockCake.java @@ -8,28 +8,28 @@ import net.minecraft.item.ItemStack; public class ItemBlockCake extends ItemBlock { - private BlockCakeMF cake; + private BlockCakeMF cake; - public ItemBlockCake(Block block) { - super(block); - cake = (BlockCakeMF) block; - setMaxStackSize(1); - this.setMaxDamage(0); - this.setHasSubtypes(true); - setCreativeTab(CreativeTabs.tabDecorations); - } + public ItemBlockCake(Block block) { + super(block); + cake = (BlockCakeMF) block; + setMaxStackSize(1); + this.setMaxDamage(0); + this.setHasSubtypes(true); + setCreativeTab(CreativeTabs.tabDecorations); + } - @Override - public int getMetadata(int damage) { - return damage; - } + @Override + public int getMetadata(int damage) { + return damage; + } - @Override - public EnumRarity getRarity(ItemStack item) { - int lvl = cake.getRarity() + 1; - if (lvl >= ToolListMF.rarity.length) { - lvl = ToolListMF.rarity.length - 1; - } - return ToolListMF.rarity[lvl]; - } + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = cake.getRarity() + 1; + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; + } + return ToolListMF.rarity[lvl]; + } } diff --git a/src/main/java/minefantasy/mf2/block/list/BlockListMF.java b/src/main/java/minefantasy/mf2/block/list/BlockListMF.java index c38a2b5a..d54ed0f0 100644 --- a/src/main/java/minefantasy/mf2/block/list/BlockListMF.java +++ b/src/main/java/minefantasy/mf2/block/list/BlockListMF.java @@ -1,48 +1,12 @@ package minefantasy.mf2.block.list; -import minefantasy.mf2.block.basic.BasicBlockMF; -import minefantasy.mf2.block.basic.BlockMetalBarsMF; -import minefantasy.mf2.block.basic.BlockMetalMF; -import minefantasy.mf2.block.basic.BlockMythicDecor; -import minefantasy.mf2.block.basic.BlockMythicOre; -import minefantasy.mf2.block.basic.BlockOreMF; -import minefantasy.mf2.block.basic.BlockPaneMF; -import minefantasy.mf2.block.basic.BlockReinforcedStone; -import minefantasy.mf2.block.basic.BlockWorldGenMarker; -import minefantasy.mf2.block.basic.ConstructionBlockMF; -import minefantasy.mf2.block.crafting.BlockAnvilMF; -import minefantasy.mf2.block.crafting.BlockBombBench; -import minefantasy.mf2.block.crafting.BlockBombPress; -import minefantasy.mf2.block.crafting.BlockCarpenter; -import minefantasy.mf2.block.crafting.BlockCogwork; -import minefantasy.mf2.block.crafting.BlockCrossbowBench; -import minefantasy.mf2.block.crafting.BlockEngineerTanner; -import minefantasy.mf2.block.crafting.BlockFirepit; -import minefantasy.mf2.block.crafting.BlockFrame; -import minefantasy.mf2.block.crafting.BlockRepairKit; -import minefantasy.mf2.block.crafting.BlockResearchStation; -import minefantasy.mf2.block.crafting.BlockRoast; -import minefantasy.mf2.block.crafting.BlockSalvage; -import minefantasy.mf2.block.crafting.BlockTanningRack; -import minefantasy.mf2.block.decor.BlockAmmoBox; -import minefantasy.mf2.block.decor.BlockBedMF; -import minefantasy.mf2.block.decor.BlockComponent; -import minefantasy.mf2.block.decor.BlockRack; -import minefantasy.mf2.block.decor.BlockRoad; -import minefantasy.mf2.block.decor.BlockSchematic; -import minefantasy.mf2.block.decor.BlockTrough; +import minefantasy.mf2.block.basic.*; +import minefantasy.mf2.block.crafting.*; +import minefantasy.mf2.block.decor.*; import minefantasy.mf2.block.food.BlockBerryBush; import minefantasy.mf2.block.food.BlockCakeMF; import minefantasy.mf2.block.food.BlockPie; -import minefantasy.mf2.block.refining.BlockBFC; -import minefantasy.mf2.block.refining.BlockBFH; -import minefantasy.mf2.block.refining.BlockBellows; -import minefantasy.mf2.block.refining.BlockBigFurnace; -import minefantasy.mf2.block.refining.BlockBloomery; -import minefantasy.mf2.block.refining.BlockChimney; -import minefantasy.mf2.block.refining.BlockCrucible; -import minefantasy.mf2.block.refining.BlockForge; -import minefantasy.mf2.block.refining.BlockQuern; +import minefantasy.mf2.block.refining.*; import minefantasy.mf2.block.tree.BlockLeavesMF; import minefantasy.mf2.block.tree.BlockLogMF; import minefantasy.mf2.block.tree.BlockSaplingMF; @@ -57,289 +21,289 @@ import net.minecraftforge.oredict.OreDictionary; public class BlockListMF { - public static final String[] metalBlocks = new String[] { "copper", "tin", "silver", "bronze", "pigiron", "steel", - "blacksteel", "redsteel", "bluesteel", "adamantium", "mithril", "ignotumite", "mithium", "ender" }; - public static final String[] specialMetalBlocks = new String[] { "bronze", "iron", "steel", "blacksteel", - "redsteel", "bluesteel" }; - public static final String[] anvils = new String[] { "bronze", "iron", "steel", "blacksteel", "bluesteel", - "redsteel" }; - - public static Block oreCopper = new BlockOreMF("oreCopper", 0, -1).setHardness(2.0F).setResistance(3.0F); - public static Block oreTin = new BlockOreMF("oreTin", 0).setHardness(2.5F).setResistance(4.0F); - public static Block oreSilver = new BlockOreMF("oreSilver", 2).setHardness(3.0F).setResistance(5.0F); - public static Block oreMythic = new BlockMythicOre("oreMythic", false).setHardness(10.0F).setResistance(100.0F); - - public static Block oreKaolinite = new BlockOreMF("oreKaolinite", 1, 0, ComponentListMF.kaolinite, 1, 1, 1) - .setHardness(3.0F).setResistance(5.0F); - public static Block oreNitre = new BlockOreMF("oreNitre", 2, 0, ComponentListMF.nitre, 1, 2, 1).setHardness(3.0F) - .setResistance(5.0F); - public static Block oreSulfur = new BlockOreMF("oreSulfur", 2, 0, ComponentListMF.sulfur, 1, 4, 2).setHardness(3.0F) - .setResistance(2.0F); - public static Block oreBorax = new BlockOreMF("oreBorax", 2, 1, ComponentListMF.flux_strong, 1, 8, 4) - .setHardness(3.0F).setResistance(2.0F); - public static Block oreTungsten = new BlockOreMF("oreTungsten", 3, 1, ComponentListMF.oreTungsten, 1, 1, 4) - .setHardness(4.0F).setResistance(2.5F); - public static Block oreClay = new BlockOreMF("oreClay", 0, 0, Items.clay_ball, 1, 4, 1, Material.ground) - .setHardness(0.5F).setStepSound(Block.soundTypeGravel); - public static Block oreCoalRich = new BlockOreMF("oreCoalRich", 2, 1, Items.coal, 2, 6, 2).setHardness(5.0F) - .setResistance(10.0F); - - public static Block mud_brick = new BasicBlockMF("mud_brick", Material.ground).setHardness(1.0F) - .setResistance(0.5F); - public static Block mud_pavement = new BasicBlockMF("mud_pavement", Material.ground).setHardness(0.5F); - - public static Block cobble_brick = new BasicBlockMF("cobble_brick", Material.rock).setHardness(2.5F) - .setResistance(12.0F).setStepSound(Block.soundTypePiston); - public static Block cobble_pavement = new BasicBlockMF("cobble_pavement", Material.rock).setHardness(2.0F) - .setResistance(10.0F).setStepSound(Block.soundTypePiston); - - public static Block window = new BasicBlockMF("window", Material.glass).setHardness(0.9F).setResistance(0.1F) - .setStepSound(Block.soundTypeGlass); - public static Block framed_glass = new BasicBlockMF("framed_glass", Material.glass).setHardness(0.6F) - .setResistance(0.2F).setStepSound(Block.soundTypeGlass); - public static Block framed_pane = new BlockPaneMF("framed_pane", "framed_glass", "framed_glass_pane", - Material.glass, true).setHardness(0.6F).setResistance(0.1F).setStepSound(Block.soundTypeGlass); - public static Block window_pane = new BlockPaneMF("window_pane", "window", "framed_glass_pane", Material.glass, - true).setHardness(0.9F).setResistance(0.2F).setStepSound(Block.soundTypeGlass); - - public static Block thatch = new BasicBlockMF("thatch", Material.leaves).setHardness(1.0F) - .setStepSound(Block.soundTypeGrass); - public static Block thatch_stair = new ConstructionBlockMF.StairsConstBlock("thatch_stair", thatch) - .register("thatch_stair"); - - // public static Block limestone_cobblestone = new - // BasicBlockMF("limestone_cobblestone", - // Material.rock).setHardness(0.8F).setResistance(4.0F).setStepSound(Block.soundTypePiston); - // public static Block limestone = new BasicBlockMF("limestone", Material.rock, - // limestone_cobblestone).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundTypeStone); - - public static Block limestone = new ConstructionBlockMF("limestone").setHardness(1.2F).setResistance(8F); - - public static Block firebricks = new BasicBlockMF("firebricks", Material.rock).setHardness(5.0F) - .setResistance(15.0F).setStepSound(Block.soundTypePiston); - public static Block clayWall = new BasicBlockMF("clayWall", Material.wood).setHardness(1.0F).setResistance(1.0F) - .setStepSound(Block.soundTypeWood); - - public static BlockMetalBarsMF[] bars = new BlockMetalBarsMF[specialMetalBlocks.length]; - public static BlockMetalMF[] storage = new BlockMetalMF[metalBlocks.length]; - public static BlockAnvilMF anvilStone; - public static BlockAnvilMF[] anvil = new BlockAnvilMF[anvils.length]; - public static BlockCarpenter carpenter = new BlockCarpenter(); - public static BlockBombBench bombBench = new BlockBombBench(); - public static BlockCrossbowBench crossbowBench = new BlockCrossbowBench(); - - public static Block cheese_wheel = new BlockCakeMF("cheese", FoodListMF.cheese_slice).setCheese(); - - public static Block cake_vanilla = new BlockCakeMF("cake_vanilla", FoodListMF.cake_slice); - public static Block cake_carrot = new BlockCakeMF("cake_carrot", FoodListMF.carrotcake_slice); - public static Block cake_chocolate = new BlockCakeMF("cake_chocolate", FoodListMF.choccake_slice); - public static Block cake_bf = new BlockCakeMF("cake_bf", FoodListMF.bfcake_slice); - - public static Block pie_meat = new BlockPie("pie_meat", FoodListMF.meatpie_slice); - - public static Block pie_apple = new BlockPie("pie_apple", FoodListMF.pieslice_apple); - public static Block pie_berry = new BlockPie("pie_berry", FoodListMF.pieslice_berry); - - public static Block pie_shepards = new BlockPie("pie_shepards", FoodListMF.pieslice_shepards); - - public static Block berryBush = new BlockBerryBush("berries"); - public static Block blast_chamber = new BlockBFC(); - public static Block blast_heater = new BlockBFH(false); - public static Block blast_heater_active = new BlockBFH(true).setLightLevel(10F); - - public static Block crucible = new BlockCrucible("stone", 0, false); - public static Block crucible_active = new BlockCrucible("stone", 0, true).setLightLevel(12F); - public static Block crucibleadv = new BlockCrucible("fireclay", 1, false); - public static Block crucibleadv_active = new BlockCrucible("fireclay", 1, true).setLightLevel(12F); - public static Block crucibleauto = new BlockCrucible("auto", 1, false).setAuto().setHardness(12F); - public static Block crucibleauto_active = new BlockCrucible("auto", 1, true).setAuto().setHardness(12F) - .setLightLevel(12F); - - public static Block chimney_stone = new BlockChimney("stone", false, false, 5); - public static Block chimney_stone_wide = new BlockChimney("stone", true, false, 10); - public static Block chimney_stone_extractor = new BlockChimney("stone_extractor", true, true, 15); - public static Block chimney_pipe = new BlockChimney("pipe", false, false, 10).setPipe(); - - public static Block tanner = new BlockTanningRack(0, ""); - - public static Block forge = new BlockForge("stone", 0, false); - public static Block forge_active = new BlockForge("stone", 0, true); - public static Block forge_metal = new BlockForge("metal", 1, false); - public static Block forge_metal_active = new BlockForge("metal", 1, true); - - public static Block repair_basic = new BlockRepairKit("basic", 0.25F, 0.05F, 0.2F); - public static Block repair_advanced = new BlockRepairKit("advanced", 1.0F, 0.2F, 0.05F); - public static Block repair_ornate = new BlockRepairKit("ornate", 1.0F, 0.25F, 0.03F).setOrnate(0.5F); - - public static Block bellows = new BlockBellows(); - - public static Block refined_planks = new BasicBlockMF("refined_planks", Material.wood).setHardness(2.5F) - .setResistance(10F).setStepSound(Block.soundTypeWood); - public static Block nailed_planks = new BasicBlockMF("nailed_planks", Material.wood).setHardness(1.5F) - .setResistance(7F).setStepSound(Block.soundTypeWood); - public static Block refined_planks_stair = new ConstructionBlockMF.StairsConstBlock("refined_planks_stair", - refined_planks).register("refined_planks_stair"); - public static Block nailed_planks_stair = new ConstructionBlockMF.StairsConstBlock("nailed_planks_stair", - nailed_planks).register("nailed_planks_stair"); - - public static Block reinforced_stone = new BlockReinforcedStone("reinforced_stone", "base", "engraved", "dshall_0", - "dshall_1", "dshall_2").setHardness(2.0F).setResistance(15F).setStepSound(Block.soundTypeStone); - public static Block reinforced_stone_bricks = new BlockReinforcedStone("reinforced_stone_bricks", "base", "mossy", - "cracked").setHardness(2.0F).setResistance(15F).setStepSound(Block.soundTypeStone); - public static Block reinforced_stone_framed = new BasicBlockMF("reinforced_stone_framed", Material.rock) - .setHardness(2.5F).setResistance(20F).setStepSound(Block.soundTypeStone); - public static Block reinforced_stone_framediron = new BasicBlockMF("reinforced_stone_framediron", Material.rock) - .setHardness(2.5F).setResistance(20F).setStepSound(Block.soundTypeStone) - .setBlockName("reinforced_stone_framed"); - - public static Block advTanner = new BlockTanningRack(1, "Strong"); - public static Block research = new BlockResearchStation(); - public static Block trough_wood = new BlockTrough("trough_wood"); - public static Block engTanner = new BlockEngineerTanner(2, "Metal"); - - public static Block bombPress = new BlockBombPress(); - - public static Block road = new BlockRoad("road_mf", 14F); - public static Block lowroad = new BlockRoad("road_mf_short", 7F); - - public static Block salvage_basic = new BlockSalvage("basic", 1.0F); - public static Block bloomery = new BlockBloomery(); - public static Block log_yew = new BlockLogMF("yew").setHardness(2F).setResistance(6F); - public static Block log_ironbark = new BlockLogMF("ironbark").setHardness(3F).setResistance(8F); - public static Block log_ebony = new BlockLogMF("ebony").setHardness(5F).setResistance(10F); - - public static Block leaves_yew = new BlockLeavesMF("yew", 100); - public static Block leaves_ironbark = new BlockLeavesMF("ironbark", 40).setHardness(0.3F); - public static Block leaves_ebony = new BlockLeavesMF("ebony", 1000).setHardness(0.5F); - - public static Block sapling_yew = new BlockSaplingMF("yew", log_yew, leaves_yew, 4F); - public static Block sapling_ironbark = new BlockSaplingMF("ironbark", log_ironbark, leaves_ironbark, 8F); - public static Block sapling_ebony = new BlockSaplingMF("ebony", log_ebony, leaves_ebony, 10F); - - public static Block yew_planks = new BasicBlockMF("yew_planks", Material.wood).setHardness(3F).setResistance(6F) - .setStepSound(Block.soundTypeWood); - public static Block ironbark_planks = new BasicBlockMF("ironbark_planks", Material.wood).setHardness(4F) - .setResistance(10F).setStepSound(Block.soundTypeWood); - public static Block ebony_planks = new BasicBlockMF("ebony_planks", Material.wood).setHardness(6F) - .setResistance(12F).setStepSound(Block.soundTypeWood); - - public static Block quern = new BlockQuern("quern"); - - public static Block mud_brick_stair = new ConstructionBlockMF.StairsConstBlock("mud_brick_stair", mud_brick) - .register("mud_brick_stair"); - public static Block mud_pavement_stair = new ConstructionBlockMF.StairsConstBlock("mud_pavement_stair", - mud_pavement).register("mud_pavement_stair"); - public static Block cobble_brick_stair = new ConstructionBlockMF.StairsConstBlock("cobble_brick_stair", - cobble_brick).register("cobble_brick_stair"); - public static Block cobble_pavement_stair = new ConstructionBlockMF.StairsConstBlock("cobble_pavement_stair", - cobble_pavement).register("cobble_pavement_stair"); - public static Block firebrick_stair = new ConstructionBlockMF.StairsConstBlock("firebrick_stair", firebricks) - .register("firebrick_stair"); - public static Block reinforced_stone_stair = new ConstructionBlockMF.StairsConstBlock("reinforced_stone_stair", - reinforced_stone).register("reinforced_stone_stair"); - public static Block reinforced_stone_brick_stair = new ConstructionBlockMF.StairsConstBlock( - "reinforced_stone_brick_stair", reinforced_stone_bricks).register("reinforced_stone_brick_stair"); - - public static Block yew_stair = new ConstructionBlockMF.StairsConstBlock("yew_stair", yew_planks) - .register("yew_stair"); - public static Block ironbark_stair = new ConstructionBlockMF.StairsConstBlock("ironbark_stair", ironbark_planks) - .register("ironbark_stair"); - public static Block ebony_stair = new ConstructionBlockMF.StairsConstBlock("ebony_stair", ebony_planks) - .register("ebony_stair"); - - public static Block firepit = new BlockFirepit(); - public static Block roast = new BlockRoast(0, "basic", false); - public static Block oven_stone = new BlockRoast(0, "basic", true); - - public static Block furnace_heater = new BlockBigFurnace("furnace_heater", true, -1); - public static Block furnace_stone = new BlockBigFurnace("furnace_stone", false, 0); - - public static Block rack_wood = new BlockRack("rack_wood"); - public static Block food_box_basic = new BlockAmmoBox("food_box_basic", (byte) 0); - public static Block ammo_box_basic = new BlockAmmoBox("ammo_box_basic", (byte) 1); - public static Block crate_basic = new BlockAmmoBox("crate_basic", (byte) 2); - - public static Block bedroll = new BlockBedMF("bedroll"); - public static Block cogwork_helm = new BlockCogwork("cogwork_helm", false); - public static Block cogwork_legs = new BlockCogwork("cogwork_legs", false); - public static Block cogwork_chest = new BlockCogwork("cogwork_chest", true); - public static Block frame_block = new BlockFrame("frame_block"); - public static Block cogwork_builder = new BlockFrame("cogwork_builder", frame_block).setCogworkHolder(); - - public static Block cruciblemythic = new BlockCrucible("mythic", 2, false).setAuto().setBlockUnbreakable(); - public static Block cruciblemythic_active = new BlockCrucible("mythic", 2, true).setAuto().setBlockUnbreakable() - .setLightLevel(12F); - public static Block cruciblemaster = new BlockCrucible("master", 3, false).setAuto().setBlockUnbreakable(); - public static Block cruciblemaster_active = new BlockCrucible("master", 3, true).setAuto().setBlockUnbreakable() - .setLightLevel(12F); - - public static Block mythic_decor = new BlockMythicDecor(); - public static Block WG_Mark = new BlockWorldGenMarker(); - public static Block components = new BlockComponent(); - public static Block schematic_general = new BlockSchematic("schematic_general"); - - public static void load() { - anvilStone = new BlockAnvilMF(BaseMaterialMF.getMaterial("stone")); - // 5:20 default planks - Blocks.fire.setFireInfo(refined_planks, 3, 10); - Blocks.fire.setFireInfo(log_ironbark, 2, 8);// IRONBARK: Logs are resistant to fire but raw planks are not - Blocks.fire.setFireInfo(ironbark_planks, 5, 30); - Blocks.fire.setFireInfo(log_ebony, 3, 10);// EBONY: Resistant - Blocks.fire.setFireInfo(ebony_planks, 3, 10); - - for (int a = 0; a < specialMetalBlocks.length; a++) { - BaseMaterialMF material = BaseMaterialMF.getMaterial(specialMetalBlocks[a]); - if (material != null) { - bars[a] = new BlockMetalBarsMF(material); - } - } - for (int a = 0; a < metalBlocks.length; a++) { - BaseMaterialMF material = BaseMaterialMF.getMaterial(metalBlocks[a]); - if (material != null) { - storage[a] = new BlockMetalMF(material); - } - } - for (int a = 0; a < anvils.length; a++) { - BaseMaterialMF material = BaseMaterialMF.getMaterial(anvils[a]); - if (material != null) { - anvil[a] = new BlockAnvilMF(material); - } - } - - OreDictionary.registerOre("cobblestone", new ItemStack(limestone, 1, 1)); - OreDictionary.registerOre("stone", new ItemStack(limestone, 1, 0)); - OreDictionary.registerOre("limestone", new ItemStack(limestone, 1, OreDictionary.WILDCARD_VALUE)); - OreDictionary.registerOre("cobblestone", new ItemStack(cobble_brick, 1, OreDictionary.WILDCARD_VALUE)); - OreDictionary.registerOre("cobblestone", new ItemStack(cobble_pavement, 1, OreDictionary.WILDCARD_VALUE)); - - OreDictionary.registerOre("blockGlass", new ItemStack(window, 1, OreDictionary.WILDCARD_VALUE)); - OreDictionary.registerOre("blockGlass", new ItemStack(framed_glass, 1, OreDictionary.WILDCARD_VALUE)); - OreDictionary.registerOre("paneGlass", new ItemStack(window_pane, 1, OreDictionary.WILDCARD_VALUE)); - OreDictionary.registerOre("paneGlass", new ItemStack(framed_pane, 1, OreDictionary.WILDCARD_VALUE)); - - OreDictionary.registerOre("planksOakWood", new ItemStack(Blocks.planks, 1, 0)); - OreDictionary.registerOre("planksSpruceWood", new ItemStack(Blocks.planks, 1, 1)); - OreDictionary.registerOre("planksBirchWood", new ItemStack(Blocks.planks, 1, 2)); - OreDictionary.registerOre("planksJungleWood", new ItemStack(Blocks.planks, 1, 3)); - OreDictionary.registerOre("planksAcaciaWood", new ItemStack(Blocks.planks, 1, 4)); - OreDictionary.registerOre("planksDarkOakWood", new ItemStack(Blocks.planks, 1, 5)); - - OreDictionary.registerOre("planksIronbarkWood", ironbark_planks); - OreDictionary.registerOre("planksEbonyWood", ebony_planks); - OreDictionary.registerOre("planksYewWood", yew_planks); - OreDictionary.registerOre("planksIronbarkWood", ironbark_planks); - OreDictionary.registerOre("planksEbonyWood", ebony_planks); - OreDictionary.registerOre("planksYewWood", yew_planks); - - for (ItemStack plank : OreDictionary.getOres("plankWood")) { - if (plank.getItem().getClass().getName().contains("BlockWoodenDevice")) { - if (plank.getUnlocalizedName().equalsIgnoreCase("tile.blockWoodenDevice.6")) { - OreDictionary.registerOre("planksGreatwoodWood", plank); - } - if (plank.getUnlocalizedName().equalsIgnoreCase("tile.blockWoodenDevice.7")) { - OreDictionary.registerOre("planksSilverwoodWood", plank); - } - } - } - } + public static final String[] metalBlocks = new String[]{"copper", "tin", "silver", "bronze", "pigiron", "steel", + "blacksteel", "redsteel", "bluesteel", "adamantium", "mithril", "ignotumite", "mithium", "ender"}; + public static final String[] specialMetalBlocks = new String[]{"bronze", "iron", "steel", "blacksteel", + "redsteel", "bluesteel"}; + public static final String[] anvils = new String[]{"bronze", "iron", "steel", "blacksteel", "bluesteel", + "redsteel"}; + + public static Block oreCopper = new BlockOreMF("oreCopper", 0, -1).setHardness(2.0F).setResistance(3.0F); + public static Block oreTin = new BlockOreMF("oreTin", 0).setHardness(2.5F).setResistance(4.0F); + public static Block oreSilver = new BlockOreMF("oreSilver", 2).setHardness(3.0F).setResistance(5.0F); + public static Block oreMythic = new BlockMythicOre("oreMythic", false).setHardness(10.0F).setResistance(100.0F); + + public static Block oreKaolinite = new BlockOreMF("oreKaolinite", 1, 0, ComponentListMF.kaolinite, 1, 1, 1) + .setHardness(3.0F).setResistance(5.0F); + public static Block oreNitre = new BlockOreMF("oreNitre", 2, 0, ComponentListMF.nitre, 1, 2, 1).setHardness(3.0F) + .setResistance(5.0F); + public static Block oreSulfur = new BlockOreMF("oreSulfur", 2, 0, ComponentListMF.sulfur, 1, 4, 2).setHardness(3.0F) + .setResistance(2.0F); + public static Block oreBorax = new BlockOreMF("oreBorax", 2, 1, ComponentListMF.flux_strong, 1, 8, 4) + .setHardness(3.0F).setResistance(2.0F); + public static Block oreTungsten = new BlockOreMF("oreTungsten", 3, 1, ComponentListMF.oreTungsten, 1, 1, 4) + .setHardness(4.0F).setResistance(2.5F); + public static Block oreClay = new BlockOreMF("oreClay", 0, 0, Items.clay_ball, 1, 4, 1, Material.ground) + .setHardness(0.5F).setStepSound(Block.soundTypeGravel); + public static Block oreCoalRich = new BlockOreMF("oreCoalRich", 2, 1, Items.coal, 2, 6, 2).setHardness(5.0F) + .setResistance(10.0F); + + public static Block mud_brick = new BasicBlockMF("mud_brick", Material.ground).setHardness(1.0F) + .setResistance(0.5F); + public static Block mud_pavement = new BasicBlockMF("mud_pavement", Material.ground).setHardness(0.5F); + + public static Block cobble_brick = new BasicBlockMF("cobble_brick", Material.rock).setHardness(2.5F) + .setResistance(12.0F).setStepSound(Block.soundTypePiston); + public static Block cobble_pavement = new BasicBlockMF("cobble_pavement", Material.rock).setHardness(2.0F) + .setResistance(10.0F).setStepSound(Block.soundTypePiston); + + public static Block window = new BasicBlockMF("window", Material.glass).setHardness(0.9F).setResistance(0.1F) + .setStepSound(Block.soundTypeGlass); + public static Block framed_glass = new BasicBlockMF("framed_glass", Material.glass).setHardness(0.6F) + .setResistance(0.2F).setStepSound(Block.soundTypeGlass); + public static Block framed_pane = new BlockPaneMF("framed_pane", "framed_glass", "framed_glass_pane", + Material.glass, true).setHardness(0.6F).setResistance(0.1F).setStepSound(Block.soundTypeGlass); + public static Block window_pane = new BlockPaneMF("window_pane", "window", "framed_glass_pane", Material.glass, + true).setHardness(0.9F).setResistance(0.2F).setStepSound(Block.soundTypeGlass); + + public static Block thatch = new BasicBlockMF("thatch", Material.leaves).setHardness(1.0F) + .setStepSound(Block.soundTypeGrass); + public static Block thatch_stair = new ConstructionBlockMF.StairsConstBlock("thatch_stair", thatch) + .register("thatch_stair"); + + // public static Block limestone_cobblestone = new + // BasicBlockMF("limestone_cobblestone", + // Material.rock).setHardness(0.8F).setResistance(4.0F).setStepSound(Block.soundTypePiston); + // public static Block limestone = new BasicBlockMF("limestone", Material.rock, + // limestone_cobblestone).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundTypeStone); + + public static Block limestone = new ConstructionBlockMF("limestone").setHardness(1.2F).setResistance(8F); + + public static Block firebricks = new BasicBlockMF("firebricks", Material.rock).setHardness(5.0F) + .setResistance(15.0F).setStepSound(Block.soundTypePiston); + public static Block clayWall = new BasicBlockMF("clayWall", Material.wood).setHardness(1.0F).setResistance(1.0F) + .setStepSound(Block.soundTypeWood); + + public static BlockMetalBarsMF[] bars = new BlockMetalBarsMF[specialMetalBlocks.length]; + public static BlockMetalMF[] storage = new BlockMetalMF[metalBlocks.length]; + public static BlockAnvilMF anvilStone; + public static BlockAnvilMF[] anvil = new BlockAnvilMF[anvils.length]; + public static BlockCarpenter carpenter = new BlockCarpenter(); + public static BlockBombBench bombBench = new BlockBombBench(); + public static BlockCrossbowBench crossbowBench = new BlockCrossbowBench(); + + public static Block cheese_wheel = new BlockCakeMF("cheese", FoodListMF.cheese_slice).setCheese(); + + public static Block cake_vanilla = new BlockCakeMF("cake_vanilla", FoodListMF.cake_slice); + public static Block cake_carrot = new BlockCakeMF("cake_carrot", FoodListMF.carrotcake_slice); + public static Block cake_chocolate = new BlockCakeMF("cake_chocolate", FoodListMF.choccake_slice); + public static Block cake_bf = new BlockCakeMF("cake_bf", FoodListMF.bfcake_slice); + + public static Block pie_meat = new BlockPie("pie_meat", FoodListMF.meatpie_slice); + + public static Block pie_apple = new BlockPie("pie_apple", FoodListMF.pieslice_apple); + public static Block pie_berry = new BlockPie("pie_berry", FoodListMF.pieslice_berry); + + public static Block pie_shepards = new BlockPie("pie_shepards", FoodListMF.pieslice_shepards); + + public static Block berryBush = new BlockBerryBush("berries"); + public static Block blast_chamber = new BlockBFC(); + public static Block blast_heater = new BlockBFH(false); + public static Block blast_heater_active = new BlockBFH(true).setLightLevel(10F); + + public static Block crucible = new BlockCrucible("stone", 0, false); + public static Block crucible_active = new BlockCrucible("stone", 0, true).setLightLevel(12F); + public static Block crucibleadv = new BlockCrucible("fireclay", 1, false); + public static Block crucibleadv_active = new BlockCrucible("fireclay", 1, true).setLightLevel(12F); + public static Block crucibleauto = new BlockCrucible("auto", 1, false).setAuto().setHardness(12F); + public static Block crucibleauto_active = new BlockCrucible("auto", 1, true).setAuto().setHardness(12F) + .setLightLevel(12F); + + public static Block chimney_stone = new BlockChimney("stone", false, false, 5); + public static Block chimney_stone_wide = new BlockChimney("stone", true, false, 10); + public static Block chimney_stone_extractor = new BlockChimney("stone_extractor", true, true, 15); + public static Block chimney_pipe = new BlockChimney("pipe", false, false, 10).setPipe(); + + public static Block tanner = new BlockTanningRack(0, ""); + + public static Block forge = new BlockForge("stone", 0, false); + public static Block forge_active = new BlockForge("stone", 0, true); + public static Block forge_metal = new BlockForge("metal", 1, false); + public static Block forge_metal_active = new BlockForge("metal", 1, true); + + public static Block repair_basic = new BlockRepairKit("basic", 0.25F, 0.05F, 0.2F); + public static Block repair_advanced = new BlockRepairKit("advanced", 1.0F, 0.2F, 0.05F); + public static Block repair_ornate = new BlockRepairKit("ornate", 1.0F, 0.25F, 0.03F).setOrnate(0.5F); + + public static Block bellows = new BlockBellows(); + + public static Block refined_planks = new BasicBlockMF("refined_planks", Material.wood).setHardness(2.5F) + .setResistance(10F).setStepSound(Block.soundTypeWood); + public static Block nailed_planks = new BasicBlockMF("nailed_planks", Material.wood).setHardness(1.5F) + .setResistance(7F).setStepSound(Block.soundTypeWood); + public static Block refined_planks_stair = new ConstructionBlockMF.StairsConstBlock("refined_planks_stair", + refined_planks).register("refined_planks_stair"); + public static Block nailed_planks_stair = new ConstructionBlockMF.StairsConstBlock("nailed_planks_stair", + nailed_planks).register("nailed_planks_stair"); + + public static Block reinforced_stone = new BlockReinforcedStone("reinforced_stone", "base", "engraved", "dshall_0", + "dshall_1", "dshall_2").setHardness(2.0F).setResistance(15F).setStepSound(Block.soundTypeStone); + public static Block reinforced_stone_bricks = new BlockReinforcedStone("reinforced_stone_bricks", "base", "mossy", + "cracked").setHardness(2.0F).setResistance(15F).setStepSound(Block.soundTypeStone); + public static Block reinforced_stone_framed = new BasicBlockMF("reinforced_stone_framed", Material.rock) + .setHardness(2.5F).setResistance(20F).setStepSound(Block.soundTypeStone); + public static Block reinforced_stone_framediron = new BasicBlockMF("reinforced_stone_framediron", Material.rock) + .setHardness(2.5F).setResistance(20F).setStepSound(Block.soundTypeStone) + .setBlockName("reinforced_stone_framed"); + + public static Block advTanner = new BlockTanningRack(1, "Strong"); + public static Block research = new BlockResearchStation(); + public static Block trough_wood = new BlockTrough("trough_wood"); + public static Block engTanner = new BlockEngineerTanner(2, "Metal"); + + public static Block bombPress = new BlockBombPress(); + + public static Block road = new BlockRoad("road_mf", 14F); + public static Block lowroad = new BlockRoad("road_mf_short", 7F); + + public static Block salvage_basic = new BlockSalvage("basic", 1.0F); + public static Block bloomery = new BlockBloomery(); + public static Block log_yew = new BlockLogMF("yew").setHardness(2F).setResistance(6F); + public static Block log_ironbark = new BlockLogMF("ironbark").setHardness(3F).setResistance(8F); + public static Block log_ebony = new BlockLogMF("ebony").setHardness(5F).setResistance(10F); + + public static Block leaves_yew = new BlockLeavesMF("yew", 100); + public static Block leaves_ironbark = new BlockLeavesMF("ironbark", 40).setHardness(0.3F); + public static Block leaves_ebony = new BlockLeavesMF("ebony", 1000).setHardness(0.5F); + + public static Block sapling_yew = new BlockSaplingMF("yew", log_yew, leaves_yew, 4F); + public static Block sapling_ironbark = new BlockSaplingMF("ironbark", log_ironbark, leaves_ironbark, 8F); + public static Block sapling_ebony = new BlockSaplingMF("ebony", log_ebony, leaves_ebony, 10F); + + public static Block yew_planks = new BasicBlockMF("yew_planks", Material.wood).setHardness(3F).setResistance(6F) + .setStepSound(Block.soundTypeWood); + public static Block ironbark_planks = new BasicBlockMF("ironbark_planks", Material.wood).setHardness(4F) + .setResistance(10F).setStepSound(Block.soundTypeWood); + public static Block ebony_planks = new BasicBlockMF("ebony_planks", Material.wood).setHardness(6F) + .setResistance(12F).setStepSound(Block.soundTypeWood); + + public static Block quern = new BlockQuern("quern"); + + public static Block mud_brick_stair = new ConstructionBlockMF.StairsConstBlock("mud_brick_stair", mud_brick) + .register("mud_brick_stair"); + public static Block mud_pavement_stair = new ConstructionBlockMF.StairsConstBlock("mud_pavement_stair", + mud_pavement).register("mud_pavement_stair"); + public static Block cobble_brick_stair = new ConstructionBlockMF.StairsConstBlock("cobble_brick_stair", + cobble_brick).register("cobble_brick_stair"); + public static Block cobble_pavement_stair = new ConstructionBlockMF.StairsConstBlock("cobble_pavement_stair", + cobble_pavement).register("cobble_pavement_stair"); + public static Block firebrick_stair = new ConstructionBlockMF.StairsConstBlock("firebrick_stair", firebricks) + .register("firebrick_stair"); + public static Block reinforced_stone_stair = new ConstructionBlockMF.StairsConstBlock("reinforced_stone_stair", + reinforced_stone).register("reinforced_stone_stair"); + public static Block reinforced_stone_brick_stair = new ConstructionBlockMF.StairsConstBlock( + "reinforced_stone_brick_stair", reinforced_stone_bricks).register("reinforced_stone_brick_stair"); + + public static Block yew_stair = new ConstructionBlockMF.StairsConstBlock("yew_stair", yew_planks) + .register("yew_stair"); + public static Block ironbark_stair = new ConstructionBlockMF.StairsConstBlock("ironbark_stair", ironbark_planks) + .register("ironbark_stair"); + public static Block ebony_stair = new ConstructionBlockMF.StairsConstBlock("ebony_stair", ebony_planks) + .register("ebony_stair"); + + public static Block firepit = new BlockFirepit(); + public static Block roast = new BlockRoast(0, "basic", false); + public static Block oven_stone = new BlockRoast(0, "basic", true); + + public static Block furnace_heater = new BlockBigFurnace("furnace_heater", true, -1); + public static Block furnace_stone = new BlockBigFurnace("furnace_stone", false, 0); + + public static Block rack_wood = new BlockRack("rack_wood"); + public static Block food_box_basic = new BlockAmmoBox("food_box_basic", (byte) 0); + public static Block ammo_box_basic = new BlockAmmoBox("ammo_box_basic", (byte) 1); + public static Block crate_basic = new BlockAmmoBox("crate_basic", (byte) 2); + + public static Block bedroll = new BlockBedMF("bedroll"); + public static Block cogwork_helm = new BlockCogwork("cogwork_helm", false); + public static Block cogwork_legs = new BlockCogwork("cogwork_legs", false); + public static Block cogwork_chest = new BlockCogwork("cogwork_chest", true); + public static Block frame_block = new BlockFrame("frame_block"); + public static Block cogwork_builder = new BlockFrame("cogwork_builder", frame_block).setCogworkHolder(); + + public static Block cruciblemythic = new BlockCrucible("mythic", 2, false).setAuto().setBlockUnbreakable(); + public static Block cruciblemythic_active = new BlockCrucible("mythic", 2, true).setAuto().setBlockUnbreakable() + .setLightLevel(12F); + public static Block cruciblemaster = new BlockCrucible("master", 3, false).setAuto().setBlockUnbreakable(); + public static Block cruciblemaster_active = new BlockCrucible("master", 3, true).setAuto().setBlockUnbreakable() + .setLightLevel(12F); + + public static Block mythic_decor = new BlockMythicDecor(); + public static Block WG_Mark = new BlockWorldGenMarker(); + public static Block components = new BlockComponent(); + public static Block schematic_general = new BlockSchematic("schematic_general"); + + public static void load() { + anvilStone = new BlockAnvilMF(BaseMaterialMF.getMaterial("stone")); + // 5:20 default planks + Blocks.fire.setFireInfo(refined_planks, 3, 10); + Blocks.fire.setFireInfo(log_ironbark, 2, 8);// IRONBARK: Logs are resistant to fire but raw planks are not + Blocks.fire.setFireInfo(ironbark_planks, 5, 30); + Blocks.fire.setFireInfo(log_ebony, 3, 10);// EBONY: Resistant + Blocks.fire.setFireInfo(ebony_planks, 3, 10); + + for (int a = 0; a < specialMetalBlocks.length; a++) { + BaseMaterialMF material = BaseMaterialMF.getMaterial(specialMetalBlocks[a]); + if (material != null) { + bars[a] = new BlockMetalBarsMF(material); + } + } + for (int a = 0; a < metalBlocks.length; a++) { + BaseMaterialMF material = BaseMaterialMF.getMaterial(metalBlocks[a]); + if (material != null) { + storage[a] = new BlockMetalMF(material); + } + } + for (int a = 0; a < anvils.length; a++) { + BaseMaterialMF material = BaseMaterialMF.getMaterial(anvils[a]); + if (material != null) { + anvil[a] = new BlockAnvilMF(material); + } + } + + OreDictionary.registerOre("cobblestone", new ItemStack(limestone, 1, 1)); + OreDictionary.registerOre("stone", new ItemStack(limestone, 1, 0)); + OreDictionary.registerOre("limestone", new ItemStack(limestone, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("cobblestone", new ItemStack(cobble_brick, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("cobblestone", new ItemStack(cobble_pavement, 1, OreDictionary.WILDCARD_VALUE)); + + OreDictionary.registerOre("blockGlass", new ItemStack(window, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("blockGlass", new ItemStack(framed_glass, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("paneGlass", new ItemStack(window_pane, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("paneGlass", new ItemStack(framed_pane, 1, OreDictionary.WILDCARD_VALUE)); + + OreDictionary.registerOre("planksOakWood", new ItemStack(Blocks.planks, 1, 0)); + OreDictionary.registerOre("planksSpruceWood", new ItemStack(Blocks.planks, 1, 1)); + OreDictionary.registerOre("planksBirchWood", new ItemStack(Blocks.planks, 1, 2)); + OreDictionary.registerOre("planksJungleWood", new ItemStack(Blocks.planks, 1, 3)); + OreDictionary.registerOre("planksAcaciaWood", new ItemStack(Blocks.planks, 1, 4)); + OreDictionary.registerOre("planksDarkOakWood", new ItemStack(Blocks.planks, 1, 5)); + + OreDictionary.registerOre("planksIronbarkWood", ironbark_planks); + OreDictionary.registerOre("planksEbonyWood", ebony_planks); + OreDictionary.registerOre("planksYewWood", yew_planks); + OreDictionary.registerOre("planksIronbarkWood", ironbark_planks); + OreDictionary.registerOre("planksEbonyWood", ebony_planks); + OreDictionary.registerOre("planksYewWood", yew_planks); + + for (ItemStack plank : OreDictionary.getOres("plankWood")) { + if (plank.getItem().getClass().getName().contains("BlockWoodenDevice")) { + if (plank.getUnlocalizedName().equalsIgnoreCase("tile.blockWoodenDevice.6")) { + OreDictionary.registerOre("planksGreatwoodWood", plank); + } + if (plank.getUnlocalizedName().equalsIgnoreCase("tile.blockWoodenDevice.7")) { + OreDictionary.registerOre("planksSilverwoodWood", plank); + } + } + } + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockBFC.java b/src/main/java/minefantasy/mf2/block/refining/BlockBFC.java index e88fb7c7..c71c6a88 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockBFC.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockBFC.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.refining; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,112 +23,114 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.Random; + public class BlockBFC extends BlockContainer { - private Random rand = new Random(); - public IIcon bottomTex; - public IIcon sideTex; - - public BlockBFC() { - super(Material.anvil); - GameRegistry.registerBlock(this, "MF_BlastChamber"); - setBlockName("blastfurnchamber"); - this.setStepSound(Block.soundTypeMetal); - this.setHardness(8F); - this.setResistance(10F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityBlastFC(); - } - - private TileEntityBlastFC getTile(IBlockAccess world, int x, int y, int z) { - return (TileEntityBlastFC) world.getTileEntity(x, y, z); - } - - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) { - TileEntityBlastFC tile = getTile(world, x, y, z); - if (tile != null) - tile.updateBuild(); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityBlastFC tile = getTile(world, x, y, z); - - if (tile != null) { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - if (side == 1 || side == 0) { - return bottomTex; - } - return sideTex; - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.blastfurn)) { - if (world.isRemote) - user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); - return false; - } - TileEntityBlastFC tile = getTile(world, x, y, z); - if (tile != null) { - if (!world.isRemote) { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - sideTex = reg.registerIcon("minefantasy2:processor/blast_chamber_side"); - bottomTex = reg.registerIcon("minefantasy2:processor/blast_chamber_top"); - } + public IIcon bottomTex; + public IIcon sideTex; + private Random rand = new Random(); + + public BlockBFC() { + super(Material.anvil); + GameRegistry.registerBlock(this, "MF_BlastChamber"); + setBlockName("blastfurnchamber"); + this.setStepSound(Block.soundTypeMetal); + this.setHardness(8F); + this.setResistance(10F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityBlastFC(); + } + + private TileEntityBlastFC getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityBlastFC) world.getTileEntity(x, y, z); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) { + TileEntityBlastFC tile = getTile(world, x, y, z); + if (tile != null) + tile.updateBuild(); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityBlastFC tile = getTile(world, x, y, z); + + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (side == 1 || side == 0) { + return bottomTex; + } + return sideTex; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.blastfurn)) { + if (world.isRemote) + user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); + return false; + } + TileEntityBlastFC tile = getTile(world, x, y, z); + if (tile != null) { + if (!world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + sideTex = reg.registerIcon("minefantasy2:processor/blast_chamber_side"); + bottomTex = reg.registerIcon("minefantasy2:processor/blast_chamber_top"); + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockBFH.java b/src/main/java/minefantasy/mf2/block/refining/BlockBFH.java index 96f39694..a088651b 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockBFH.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockBFH.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.refining; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -29,161 +26,164 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.List; +import java.util.Random; + public class BlockBFH extends BlockContainer { - private static boolean keepInventory; - private Random rand = new Random(); - public IIcon bottomTex; - public IIcon sideTex; - public boolean isActive; - - public BlockBFH(boolean isActive) { - super(Material.anvil); - this.isActive = isActive; - GameRegistry.registerBlock(this, isActive ? "MF_BlastHeaterActive" : "MF_BlastHeater"); - setBlockName("blastfurnheater"); - this.setStepSound(Block.soundTypeMetal); - this.setHardness(10F); - this.setResistance(10F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World world, int x, int y, int z, Random rand) { - if (isActive && rand.nextInt(20) == 0) { - world.playSound(x + 0.5F, y + 0.5F, z + 0.5F, "fire.fire", 1.0F + rand.nextFloat(), - rand.nextFloat() * 0.7F + 0.3F, false); - } - } - - @Override - public void getSubBlocks(Item item, CreativeTabs tab, List list) { - if (!isActive) { - super.getSubBlocks(item, tab, list); - } - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityBlastFH(); - } - - private TileEntityBlastFH getTile(IBlockAccess world, int x, int y, int z) { - return (TileEntityBlastFH) world.getTileEntity(x, y, z); - } - - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) { - TileEntityBlastFH tile = getTile(world, x, y, z); - if (tile != null) - tile.updateBuild(); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - if (keepInventory) - return; - - TileEntityBlastFH tile = getTile(world, x, y, z); - - if (tile != null) { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - if (side == 1 || side == 0) { - return bottomTex; - } - return sideTex; - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.blastfurn)) { - if (world.isRemote) - user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); - return false; - } - TileEntityBlastFH tile = getTile(world, x, y, z); - if (tile != null) { - if (!world.isRemote) { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) { - int l = world.getBlockMetadata(x, y, z); - TileEntity tileentity = world.getTileEntity(x, y, z); - keepInventory = true; - - if (state) { - world.setBlock(x, y, z, BlockListMF.blast_heater_active); - } else { - world.setBlock(x, y, z, BlockListMF.blast_heater); - } - - keepInventory = false; - world.setBlockMetadataWithNotify(x, y, z, l, 2); - - if (tileentity != null) { - tileentity.validate(); - world.setTileEntity(x, y, z, tileentity); - } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - sideTex = isActive ? reg.registerIcon("minefantasy2:processor/blast_heater_active") - : reg.registerIcon("minefantasy2:processor/blast_heater"); - bottomTex = reg.registerIcon("minefantasy2:processor/blast_chamber_top"); - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) { - return Item.getItemFromBlock(BlockListMF.blast_heater); - } + private static boolean keepInventory; + public IIcon bottomTex; + public IIcon sideTex; + public boolean isActive; + private Random rand = new Random(); + + public BlockBFH(boolean isActive) { + super(Material.anvil); + this.isActive = isActive; + GameRegistry.registerBlock(this, isActive ? "MF_BlastHeaterActive" : "MF_BlastHeater"); + setBlockName("blastfurnheater"); + this.setStepSound(Block.soundTypeMetal); + this.setHardness(10F); + this.setResistance(10F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) { + int l = world.getBlockMetadata(x, y, z); + TileEntity tileentity = world.getTileEntity(x, y, z); + keepInventory = true; + + if (state) { + world.setBlock(x, y, z, BlockListMF.blast_heater_active); + } else { + world.setBlock(x, y, z, BlockListMF.blast_heater); + } + + keepInventory = false; + world.setBlockMetadataWithNotify(x, y, z, l, 2); + + if (tileentity != null) { + tileentity.validate(); + world.setTileEntity(x, y, z, tileentity); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + if (isActive && rand.nextInt(20) == 0) { + world.playSound(x + 0.5F, y + 0.5F, z + 0.5F, "fire.fire", 1.0F + rand.nextFloat(), + rand.nextFloat() * 0.7F + 0.3F, false); + } + } + + @Override + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + if (!isActive) { + super.getSubBlocks(item, tab, list); + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityBlastFH(); + } + + private TileEntityBlastFH getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityBlastFH) world.getTileEntity(x, y, z); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbour) { + TileEntityBlastFH tile = getTile(world, x, y, z); + if (tile != null) + tile.updateBuild(); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + if (keepInventory) + return; + + TileEntityBlastFH tile = getTile(world, x, y, z); + + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (side == 1 || side == 0) { + return bottomTex; + } + return sideTex; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + if (!ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.blastfurn)) { + if (world.isRemote) + user.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("knowledge.unknownUse"))); + return false; + } + TileEntityBlastFH tile = getTile(world, x, y, z); + if (tile != null) { + if (!world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + sideTex = isActive ? reg.registerIcon("minefantasy2:processor/blast_heater_active") + : reg.registerIcon("minefantasy2:processor/blast_heater"); + bottomTex = reg.registerIcon("minefantasy2:processor/blast_chamber_top"); + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, int x, int y, int z) { + return Item.getItemFromBlock(BlockListMF.blast_heater); + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockBellows.java b/src/main/java/minefantasy/mf2/block/refining/BlockBellows.java index 4c423f90..5d4b0f41 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockBellows.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockBellows.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.refining; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -19,71 +17,72 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.Random; + /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class BlockBellows extends BlockContainer { - public static int bellows_RI = 105; + public static int bellows_RI = 105; - private Random rand = new Random(); + private Random rand = new Random(); - public BlockBellows() { - super(Material.wood); - GameRegistry.registerBlock(this, "MF_Bellows"); - setBlockName("bellows"); - this.setHardness(1F); - this.setResistance(0.5F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } + public BlockBellows() { + super(Material.wood); + GameRegistry.registerBlock(this, "MF_Bellows"); + setBlockName("bellows"); + this.setHardness(1F); + this.setResistance(0.5F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } - @Override - public boolean isOpaqueCube() { - return false; - } + @Override + public boolean isOpaqueCube() { + return false; + } - @Override - public boolean renderAsNormalBlock() { - return false; - } + @Override + public boolean renderAsNormalBlock() { + return false; + } - @Override - public IIcon getIcon(int side, int meta) { - return Blocks.planks.getIcon(side, 0); - } + @Override + public IIcon getIcon(int side, int meta) { + return Blocks.planks.getIcon(side, 0); + } - @SideOnly(Side.CLIENT) - public int getRenderType() { - return bellows_RI; - } + @SideOnly(Side.CLIENT) + public int getRenderType() { + return bellows_RI; + } - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { - int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { + int direction = MathHelper.floor_double(user.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - world.setBlockMetadataWithNotify(x, y, z, direction, 2); - } + world.setBlockMetadataWithNotify(x, y, z, direction, 2); + } - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, - float f2) { - TileEntityBellows bellows = (TileEntityBellows) world.getTileEntity(x, y, z); - if (bellows != null) { - bellows.interact(player, 2F); - } - return true; - } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + TileEntityBellows bellows = (TileEntityBellows) world.getTileEntity(x, y, z); + if (bellows != null) { + bellows.interact(player, 2F); + } + return true; + } - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityBellows(); - } + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityBellows(); + } - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - } + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockBigFurnace.java b/src/main/java/minefantasy/mf2/block/refining/BlockBigFurnace.java index fdc99ff2..b13323bb 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockBigFurnace.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockBigFurnace.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.refining; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,156 +22,156 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.Random; + public class BlockBigFurnace extends BlockContainer { - /** - * Is the random generator used by furnace to drop the inventory contents in - * random directions. - */ - private Random rand = new Random(); - public final boolean isHeater; - public final int tier; - - /** - * This flag is used to prevent the furnace inventory to be dropped upon block - * removal, is used internally when the furnace block changes from idle to - * active and vice-versa. - */ - private static boolean keepFurnaceInventory = false; - public static int furn_RI = 114; - - public BlockBigFurnace(String name, boolean isHeater, int tier) { - super(Material.rock); - this.isHeater = isHeater; - this.tier = tier; - this.setCreativeTab(CreativeTabMF.tabUtil); - GameRegistry.registerBlock(this, name); - setBlockName(name); - this.setStepSound(Block.soundTypeStone); - this.setHardness(3.5F); - this.setResistance(2F); - } - - @Override - public IIcon getIcon(int side, int meta) { - return BlockListMF.firebricks.getIcon(side, meta); - } - - public boolean isOpaqueCube() { - return false; - } - - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityBigFurnace) { - if (((TileEntityBigFurnace) tile).isBurning()) { - return 10; - } - } - return super.getLightValue(world, x, y, z); - } - - /** - * Called whenever the block is added into the world. Args: world, x, y, z - */ - public void onBlockAdded(World world, int x, int y, int z) { - super.onBlockAdded(world, x, y, z); - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderType() { - return furn_RI; - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, - float f2) { - if (world.isRemote) { - return true; - } else { - TileEntityBigFurnace tile = (TileEntityBigFurnace) world.getTileEntity(x, y, z); - - ItemStack item = player.getHeldItem(); - - if (tile != null) { - player.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - - return true; - } - } - - /** - * - * /** Returns the TileEntity used by this block. - */ - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityBigFurnace(); - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item) { - int dir = MathHelper.floor_double(entity.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - world.setBlockMetadataWithNotify(x, y, z, dir, 2); - } - - /** - * Called whenever the block is removed. - */ - @Override - public void breakBlock(World world, int x, int y, int z, Block i1, int i2) { - if (!keepFurnaceInventory) { - TileEntityBigFurnace tile = (TileEntityBigFurnace) world.getTileEntity(x, y, z); - - if (tile != null) { - for (int var6 = 0; var6 < tile.getSizeInventory(); ++var6) { - ItemStack var7 = tile.getStackInSlot(var6); - - if (var7 != null) { - float var8 = this.rand.nextFloat() * 0.8F + 0.1F; - float var9 = this.rand.nextFloat() * 0.8F + 0.1F; - float var10 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (var7.stackSize > 0) { - int var11 = this.rand.nextInt(21) + 10; - - if (var11 > var7.stackSize) { - var11 = var7.stackSize; - } - - var7.stackSize -= var11; - EntityItem var12 = new EntityItem(world, x + var8, y + var9, z + var10, - new ItemStack(var7.getItem(), var11, var7.getItemDamage())); - - if (var7.hasTagCompound()) { - var12.getEntityItem().setTagCompound((NBTTagCompound) var7.getTagCompound().copy()); - } - - float var13 = 0.05F; - var12.motionX = (float) this.rand.nextGaussian() * var13; - var12.motionY = (float) this.rand.nextGaussian() * var13 + 0.2F; - var12.motionZ = (float) this.rand.nextGaussian() * var13; - world.spawnEntityInWorld(var12); - } - } - } - } - } - - super.breakBlock(world, x, y, z, i1, i2); - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - } + public static int furn_RI = 114; + /** + * This flag is used to prevent the furnace inventory to be dropped upon block + * removal, is used internally when the furnace block changes from idle to + * active and vice-versa. + */ + private static boolean keepFurnaceInventory = false; + public final boolean isHeater; + public final int tier; + /** + * Is the random generator used by furnace to drop the inventory contents in + * random directions. + */ + private Random rand = new Random(); + + public BlockBigFurnace(String name, boolean isHeater, int tier) { + super(Material.rock); + this.isHeater = isHeater; + this.tier = tier; + this.setCreativeTab(CreativeTabMF.tabUtil); + GameRegistry.registerBlock(this, name); + setBlockName(name); + this.setStepSound(Block.soundTypeStone); + this.setHardness(3.5F); + this.setResistance(2F); + } + + @Override + public IIcon getIcon(int side, int meta) { + return BlockListMF.firebricks.getIcon(side, meta); + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getLightValue(IBlockAccess world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityBigFurnace) { + if (((TileEntityBigFurnace) tile).isBurning()) { + return 10; + } + } + return super.getLightValue(world, x, y, z); + } + + /** + * Called whenever the block is added into the world. Args: world, x, y, z + */ + public void onBlockAdded(World world, int x, int y, int z) { + super.onBlockAdded(world, x, y, z); + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderType() { + return furn_RI; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float f, float f1, + float f2) { + if (world.isRemote) { + return true; + } else { + TileEntityBigFurnace tile = (TileEntityBigFurnace) world.getTileEntity(x, y, z); + + ItemStack item = player.getHeldItem(); + + if (tile != null) { + player.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + + return true; + } + } + + /** + * /** Returns the TileEntity used by this block. + */ + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityBigFurnace(); + } + + /** + * Called when the block is placed in the world. + */ + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item) { + int dir = MathHelper.floor_double(entity.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + world.setBlockMetadataWithNotify(x, y, z, dir, 2); + } + + /** + * Called whenever the block is removed. + */ + @Override + public void breakBlock(World world, int x, int y, int z, Block i1, int i2) { + if (!keepFurnaceInventory) { + TileEntityBigFurnace tile = (TileEntityBigFurnace) world.getTileEntity(x, y, z); + + if (tile != null) { + for (int var6 = 0; var6 < tile.getSizeInventory(); ++var6) { + ItemStack var7 = tile.getStackInSlot(var6); + + if (var7 != null) { + float var8 = this.rand.nextFloat() * 0.8F + 0.1F; + float var9 = this.rand.nextFloat() * 0.8F + 0.1F; + float var10 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (var7.stackSize > 0) { + int var11 = this.rand.nextInt(21) + 10; + + if (var11 > var7.stackSize) { + var11 = var7.stackSize; + } + + var7.stackSize -= var11; + EntityItem var12 = new EntityItem(world, x + var8, y + var9, z + var10, + new ItemStack(var7.getItem(), var11, var7.getItemDamage())); + + if (var7.hasTagCompound()) { + var12.getEntityItem().setTagCompound((NBTTagCompound) var7.getTagCompound().copy()); + } + + float var13 = 0.05F; + var12.motionX = (float) this.rand.nextGaussian() * var13; + var12.motionY = (float) this.rand.nextGaussian() * var13 + 0.2F; + var12.motionZ = (float) this.rand.nextGaussian() * var13; + world.spawnEntityInWorld(var12); + } + } + } + } + } + + super.breakBlock(world, x, y, z, i1, i2); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockBloomery.java b/src/main/java/minefantasy/mf2/block/refining/BlockBloomery.java index 16ec8c5a..eb545dbd 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockBloomery.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockBloomery.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.refining; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -23,142 +21,143 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.Random; + public class BlockBloomery extends BlockContainer { - public static int bloomery_RI = 109; - - private Random rand = new Random(); - public IIcon bottomTex; - public IIcon sideTex; - - public BlockBloomery() { - super(Material.rock); - GameRegistry.registerBlock(this, "MF_Bloomery"); - setBlockName("bloomery"); - this.setStepSound(Block.soundTypeStone); - this.setHardness(8F); - this.setResistance(10F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityBloomery(); - } - - private TileEntityBloomery getTile(IBlockAccess world, int x, int y, int z) { - return (TileEntityBloomery) world.getTileEntity(x, y, z); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityBloomery tile = getTile(world, x, y, z); - - if (tile != null) { - for (int i1 = 0; i1 < (tile.getSizeInventory() - 1); ++i1)// breaking does not retrieve the result - { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - TileEntityBloomery tile = getTile(world, x, y, z); - if (tile != null) { - ItemStack held = user.getHeldItem(); - - // Hammer - if (!user.isSwingInProgress && tile.tryHammer(user)) { - return true; - } - // Light - int l = ItemLighterMF.tryUse(held, user); - if (!tile.isActive && !tile.hasBloom()) { - if (held != null && l != 0) { - user.playSound("fire.ignite", 1.0F, 1.0F); - if (world.isRemote) - return true; - if (l == 1 && tile.light(user)) { - held.damageItem(1, user); - } - return true; - } - } - // GUI - if (!world.isRemote && !tile.isActive && !tile.hasBloom()) { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { - TileEntityBloomery tile = getTile(world, x, y, z); - if (tile != null) { - if (user.swingProgress <= 0.1F) { - tile.tryHammer(user); - } - } - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - } - - @Override - public IIcon getIcon(int side, int meta) { - return BlockListMF.crucible.getIcon(side, 0); - } - - @SideOnly(Side.CLIENT) - public int getRenderType() { - return bloomery_RI; - } + public static int bloomery_RI = 109; + public IIcon bottomTex; + public IIcon sideTex; + private Random rand = new Random(); + + public BlockBloomery() { + super(Material.rock); + GameRegistry.registerBlock(this, "MF_Bloomery"); + setBlockName("bloomery"); + this.setStepSound(Block.soundTypeStone); + this.setHardness(8F); + this.setResistance(10F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityBloomery(); + } + + private TileEntityBloomery getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityBloomery) world.getTileEntity(x, y, z); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityBloomery tile = getTile(world, x, y, z); + + if (tile != null) { + for (int i1 = 0; i1 < (tile.getSizeInventory() - 1); ++i1)// breaking does not retrieve the result + { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + TileEntityBloomery tile = getTile(world, x, y, z); + if (tile != null) { + ItemStack held = user.getHeldItem(); + + // Hammer + if (!user.isSwingInProgress && tile.tryHammer(user)) { + return true; + } + // Light + int l = ItemLighterMF.tryUse(held, user); + if (!tile.isActive && !tile.hasBloom()) { + if (held != null && l != 0) { + user.playSound("fire.ignite", 1.0F, 1.0F); + if (world.isRemote) + return true; + if (l == 1 && tile.light(user)) { + held.damageItem(1, user); + } + return true; + } + } + // GUI + if (!world.isRemote && !tile.isActive && !tile.hasBloom()) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + TileEntityBloomery tile = getTile(world, x, y, z); + if (tile != null) { + if (user.swingProgress <= 0.1F) { + tile.tryHammer(user); + } + } + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + } + + @Override + public IIcon getIcon(int side, int meta) { + return BlockListMF.crucible.getIcon(side, 0); + } + + @SideOnly(Side.CLIENT) + public int getRenderType() { + return bloomery_RI; + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockChimney.java b/src/main/java/minefantasy/mf2/block/refining/BlockChimney.java index 3c4ce2bf..f4e96de1 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockChimney.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockChimney.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.refining; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -17,124 +15,124 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.Random; + public class BlockChimney extends BlockContainer { - private Random rand = new Random(); - public IIcon bottomTex; - public IIcon sideTex; - public int size; - private boolean isWide; - /** - * Weather it can absorb smoke indirectly (not directly above a source) - */ - public boolean isIndirect; - private String chimneyType; - - public BlockChimney(String type, boolean wide, boolean indirect, int size) { - super(Material.rock); - this.isIndirect = indirect; - isWide = wide; - this.chimneyType = type; - this.size = size; - if (wide) { - this.setLightOpacity(255); - } else { - this.setBlockBounds(1F / 4F, 0, 1F / 4F, 3F / 4F, 1F, 3F / 4F); - } - GameRegistry.registerBlock(this, "MF_Chimney_" + type + (isWide ? "_Wide" : "_Thin")); - setBlockName("chimney." + type + (isWide ? ".wide" : "")); - this.setStepSound(Block.soundTypeMetal); - this.setHardness(5F); - this.setResistance(10F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityChimney(); - } - - private TileEntityChimney getTile(IBlockAccess world, int x, int y, int z) { - return (TileEntityChimney) world.getTileEntity(x, y, z); - } - - public boolean isWideChimney() { - return isWide; - } - - @Override - public boolean isOpaqueCube() { - return isWide; - } - - @Override - public boolean renderAsNormalBlock() { - return isWide; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - if (isPipe) { - return BlockListMF.reinforced_stone.getIcon(side, meta); - } - if (side == 1 || side == 0) { - return bottomTex; - } - return sideTex; - } - - /* - * - * @SideOnly(Side.CLIENT) public IIcon getIcon(IBlockAccess world, int x, int y, - * int z, int side) { TileEntityChimney chimney = - * (TileEntityChimney)world.getTileEntity(x, y, z); if(chimney != null && - * chimney.maskBlock != null && chimney.maskBlock != Blocks.air) { return - * chimney.maskBlock.getIcon(side, chimney.maskMeta); } return getIcon(side, - * world.getBlockMetadata(x, y, z)); } - * - * @Override public boolean onBlockActivated(World world, int x, int y, int z, - * EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) { - * int m = world.getBlockMetadata(x, y, z); TileEntityChimney chimney = - * getTile(world, x, y, z); - * - * if(chimney != null) { ItemStack held = user.getHeldItem(); if(!world.isRemote - * && held != null && held.getItem() instanceof ItemBlock) { ItemBlock item = - * (ItemBlock)held.getItem(); if(item.field_150939_a.isNormalCube()) { - * chimney.maskBlock = item.field_150939_a; chimney.maskMeta = - * item.getMetadata(held.getItemDamage()); chimney.sync(); world.setBlock(x, y, - * z, BlockListMF.chimney_wide, m, 2); return true; } } } return false; } - * - * @Override public void getSubBlocks(Item item, CreativeTabs tab, List list) { - * if(!isWide) { super.getSubBlocks(item, tab, list); } } - */ - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - if (isPipe) - return; - - sideTex = reg.registerIcon("minefantasy2:chimney/chimney_" + chimneyType + "_side" + (isWide ? "Wide" : "")); - bottomTex = reg.registerIcon("minefantasy2:chimney/chimney_" + chimneyType + "_top" + (isWide ? "Wide" : "")); - } - - private boolean isPipe; - - public Block setPipe() { - this.setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F); - isPipe = true; - isWide = false; - return this; - } - - public boolean isPipe() { - return isPipe; - } - - @Override - public int getRenderType() { - return isPipe() ? pipe_RI : super.getRenderType(); - } - - public static int pipe_RI = 117; + public static int pipe_RI = 117; + public IIcon bottomTex; + public IIcon sideTex; + public int size; + /** + * Weather it can absorb smoke indirectly (not directly above a source) + */ + public boolean isIndirect; + private Random rand = new Random(); + private boolean isWide; + private String chimneyType; + private boolean isPipe; + + public BlockChimney(String type, boolean wide, boolean indirect, int size) { + super(Material.rock); + this.isIndirect = indirect; + isWide = wide; + this.chimneyType = type; + this.size = size; + if (wide) { + this.setLightOpacity(255); + } else { + this.setBlockBounds(1F / 4F, 0, 1F / 4F, 3F / 4F, 1F, 3F / 4F); + } + GameRegistry.registerBlock(this, "MF_Chimney_" + type + (isWide ? "_Wide" : "_Thin")); + setBlockName("chimney." + type + (isWide ? ".wide" : "")); + this.setStepSound(Block.soundTypeMetal); + this.setHardness(5F); + this.setResistance(10F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityChimney(); + } + + private TileEntityChimney getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityChimney) world.getTileEntity(x, y, z); + } + + public boolean isWideChimney() { + return isWide; + } + + @Override + public boolean isOpaqueCube() { + return isWide; + } + + @Override + public boolean renderAsNormalBlock() { + return isWide; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (isPipe) { + return BlockListMF.reinforced_stone.getIcon(side, meta); + } + if (side == 1 || side == 0) { + return bottomTex; + } + return sideTex; + } + + /* + * + * @SideOnly(Side.CLIENT) public IIcon getIcon(IBlockAccess world, int x, int y, + * int z, int side) { TileEntityChimney chimney = + * (TileEntityChimney)world.getTileEntity(x, y, z); if(chimney != null && + * chimney.maskBlock != null && chimney.maskBlock != Blocks.air) { return + * chimney.maskBlock.getIcon(side, chimney.maskMeta); } return getIcon(side, + * world.getBlockMetadata(x, y, z)); } + * + * @Override public boolean onBlockActivated(World world, int x, int y, int z, + * EntityPlayer user, int side, float xOffset, float yOffset, float zOffset) { + * int m = world.getBlockMetadata(x, y, z); TileEntityChimney chimney = + * getTile(world, x, y, z); + * + * if(chimney != null) { ItemStack held = user.getHeldItem(); if(!world.isRemote + * && held != null && held.getItem() instanceof ItemBlock) { ItemBlock item = + * (ItemBlock)held.getItem(); if(item.field_150939_a.isNormalCube()) { + * chimney.maskBlock = item.field_150939_a; chimney.maskMeta = + * item.getMetadata(held.getItemDamage()); chimney.sync(); world.setBlock(x, y, + * z, BlockListMF.chimney_wide, m, 2); return true; } } } return false; } + * + * @Override public void getSubBlocks(Item item, CreativeTabs tab, List list) { + * if(!isWide) { super.getSubBlocks(item, tab, list); } } + */ + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + if (isPipe) + return; + + sideTex = reg.registerIcon("minefantasy2:chimney/chimney_" + chimneyType + "_side" + (isWide ? "Wide" : "")); + bottomTex = reg.registerIcon("minefantasy2:chimney/chimney_" + chimneyType + "_top" + (isWide ? "Wide" : "")); + } + + public Block setPipe() { + this.setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F); + isPipe = true; + isWide = false; + return this; + } + + public boolean isPipe() { + return isPipe; + } + + @Override + public int getRenderType() { + return isPipe() ? pipe_RI : super.getRenderType(); + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockCrucible.java b/src/main/java/minefantasy/mf2/block/refining/BlockCrucible.java index 64c6ea1e..ed916c8b 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockCrucible.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockCrucible.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.refining; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -30,222 +27,223 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.List; +import java.util.Random; + public class BlockCrucible extends BlockContainer { - private Random rand = new Random(); - public final boolean isActive; - private static boolean keepInventory; - public int tier; - public String type; - - public BlockCrucible(String tex, int tier, boolean isActive) { - super(Material.rock); - this.tier = tier; - this.type = tex; - this.isActive = isActive; - GameRegistry.registerBlock(this, "MF_Crucible" + tex + (isActive ? "Active" : "")); - setBlockName("crucible." + tex); - this.setStepSound(Block.soundTypeStone); - this.setHardness(8F); - this.setResistance(8F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - public boolean isAuto; - - public BlockCrucible setAuto() { - isAuto = true; - return this; - } - - @Override - public void getSubBlocks(Item item, CreativeTabs tab, List list) { - if (!isActive) { - super.getSubBlocks(item, tab, list); - } - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityCrucible(); - } - - private static TileEntityCrucible getTile(IBlockAccess world, int x, int y, int z) { - return (TileEntityCrucible) world.getTileEntity(x, y, z); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - if (keepInventory) - return; - - TileEntityCrucible tile = getTile(world, x, y, z); - - if (tile != null) { - int size = (!isAuto && ConfigHardcore.HCCreduceIngots) ? tile.getSizeInventory() - 1 - : tile.getSizeInventory(); - for (int i1 = 0; i1 < size; ++i1) { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) { - int l = world.getBlockMetadata(x, y, z); - TileEntityCrucible tileentity = getTile(world, x, y, z); - keepInventory = true; - Block block = world.getBlock(x, y, z); - - if (block != null && block instanceof BlockCrucible) { - int blocktier = ((BlockCrucible) block).tier; - boolean auto = ((BlockCrucible) block).isAuto; - if (state) { - world.setBlock(x, y, z, getActiveBlock(blocktier, auto)); - } else { - world.setBlock(x, y, z, getInactiveBlock(blocktier, auto)); - } - } - - keepInventory = false; - world.setBlockMetadataWithNotify(x, y, z, l, 2); - - if (tileentity != null) { - tileentity.validate(); - world.setTileEntity(x, y, z, tileentity); - } - } - - private static Block getActiveBlock(int tier, boolean auto) { - if (tier == 1) { - return auto ? BlockListMF.crucibleauto_active : BlockListMF.crucibleadv_active; - } - if (tier == 2) { - return BlockListMF.cruciblemythic_active; - } - if (tier == 3) { - return BlockListMF.cruciblemaster_active; - } - return BlockListMF.crucible_active; - } - - private static Block getInactiveBlock(int tier, boolean auto) { - if (tier == 1) { - return auto ? BlockListMF.crucibleauto : BlockListMF.crucibleadv; - } - if (tier == 2) { - return BlockListMF.cruciblemythic; - } - if (tier == 3) { - return BlockListMF.cruciblemaster; - } - return BlockListMF.crucible; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return side == 1 ? topTex : sideTex; - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - TileEntityCrucible tile = getTile(world, x, y, z); - if (tile != null) { - ItemStack held = user.getHeldItem(); - if (held != null && held.getItem() == ComponentListMF.artefacts && held.getItemDamage() == 3) { - if (tier == 2 && isActive) { - --held.stackSize; - if (held.stackSize <= 0) { - user.setCurrentItemOrArmor(0, null); - } - if (!world.isRemote) { - world.spawnEntityInWorld(new EntityLightningBolt(world, x + 0.5, y + 1.5, z + 0.5)); - world.setBlock(x, y, z, BlockListMF.cruciblemaster_active, 0, 2); - } - } - return true; - } - if (tier >= 2) { - BlockCrucible.updateFurnaceBlockState(tile.isCoated(), world, x, y, z); - } - ItemStack out = tile.getStackInSlot(tile.getSizeInventory() - 1); - if (held != null && held.getItem() == ComponentListMF.ingot_mould && out != null - && !(out.getItem() instanceof ItemBlock)) { - ItemStack result = out.copy(); - result.stackSize = 1; - tile.decrStackSize(tile.getSizeInventory() - 1, 1); - - ItemStack mould = ItemFilledMould.createMould(result); - if (held.stackSize == 1) { - user.setCurrentItemOrArmor(0, mould); - } else { - --held.stackSize; - if (!world.isRemote) { - EntityItem drop = new EntityItem(world, user.posX, user.posY, user.posZ, mould); - drop.delayBeforeCanPickup = 0; - world.spawnEntityInWorld(drop); - } - } - return true; - } - if (!world.isRemote) { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - private IIcon sideTex, topTex; - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - topTex = isActive ? reg.registerIcon("minefantasy2:processor/crucible_top_active_" + type) - : reg.registerIcon("minefantasy2:processor/crucible_top_" + type); - sideTex = reg.registerIcon("minefantasy2:processor/crucible_side_" + type); - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) { - return Item.getItemFromBlock(getInactiveBlock(tier, isAuto)); - } - - @Override - public Item getItemDropped(int meta, Random rand, int fort) { - return Item.getItemFromBlock(getInactiveBlock(tier, isAuto)); - } + private static boolean keepInventory; + public final boolean isActive; + public int tier; + public String type; + public boolean isAuto; + private Random rand = new Random(); + private IIcon sideTex, topTex; + + public BlockCrucible(String tex, int tier, boolean isActive) { + super(Material.rock); + this.tier = tier; + this.type = tex; + this.isActive = isActive; + GameRegistry.registerBlock(this, "MF_Crucible" + tex + (isActive ? "Active" : "")); + setBlockName("crucible." + tex); + this.setStepSound(Block.soundTypeStone); + this.setHardness(8F); + this.setResistance(8F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + private static TileEntityCrucible getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityCrucible) world.getTileEntity(x, y, z); + } + + public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) { + int l = world.getBlockMetadata(x, y, z); + TileEntityCrucible tileentity = getTile(world, x, y, z); + keepInventory = true; + Block block = world.getBlock(x, y, z); + + if (block != null && block instanceof BlockCrucible) { + int blocktier = ((BlockCrucible) block).tier; + boolean auto = ((BlockCrucible) block).isAuto; + if (state) { + world.setBlock(x, y, z, getActiveBlock(blocktier, auto)); + } else { + world.setBlock(x, y, z, getInactiveBlock(blocktier, auto)); + } + } + + keepInventory = false; + world.setBlockMetadataWithNotify(x, y, z, l, 2); + + if (tileentity != null) { + tileentity.validate(); + world.setTileEntity(x, y, z, tileentity); + } + } + + private static Block getActiveBlock(int tier, boolean auto) { + if (tier == 1) { + return auto ? BlockListMF.crucibleauto_active : BlockListMF.crucibleadv_active; + } + if (tier == 2) { + return BlockListMF.cruciblemythic_active; + } + if (tier == 3) { + return BlockListMF.cruciblemaster_active; + } + return BlockListMF.crucible_active; + } + + private static Block getInactiveBlock(int tier, boolean auto) { + if (tier == 1) { + return auto ? BlockListMF.crucibleauto : BlockListMF.crucibleadv; + } + if (tier == 2) { + return BlockListMF.cruciblemythic; + } + if (tier == 3) { + return BlockListMF.cruciblemaster; + } + return BlockListMF.crucible; + } + + public BlockCrucible setAuto() { + isAuto = true; + return this; + } + + @Override + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + if (!isActive) { + super.getSubBlocks(item, tab, list); + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityCrucible(); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + if (keepInventory) + return; + + TileEntityCrucible tile = getTile(world, x, y, z); + + if (tile != null) { + int size = (!isAuto && ConfigHardcore.HCCreduceIngots) ? tile.getSizeInventory() - 1 + : tile.getSizeInventory(); + for (int i1 = 0; i1 < size; ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return side == 1 ? topTex : sideTex; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + TileEntityCrucible tile = getTile(world, x, y, z); + if (tile != null) { + ItemStack held = user.getHeldItem(); + if (held != null && held.getItem() == ComponentListMF.artefacts && held.getItemDamage() == 3) { + if (tier == 2 && isActive) { + --held.stackSize; + if (held.stackSize <= 0) { + user.setCurrentItemOrArmor(0, null); + } + if (!world.isRemote) { + world.spawnEntityInWorld(new EntityLightningBolt(world, x + 0.5, y + 1.5, z + 0.5)); + world.setBlock(x, y, z, BlockListMF.cruciblemaster_active, 0, 2); + } + } + return true; + } + if (tier >= 2) { + BlockCrucible.updateFurnaceBlockState(tile.isCoated(), world, x, y, z); + } + ItemStack out = tile.getStackInSlot(tile.getSizeInventory() - 1); + if (held != null && held.getItem() == ComponentListMF.ingot_mould && out != null + && !(out.getItem() instanceof ItemBlock)) { + ItemStack result = out.copy(); + result.stackSize = 1; + tile.decrStackSize(tile.getSizeInventory() - 1, 1); + + ItemStack mould = ItemFilledMould.createMould(result); + if (held.stackSize == 1) { + user.setCurrentItemOrArmor(0, mould); + } else { + --held.stackSize; + if (!world.isRemote) { + EntityItem drop = new EntityItem(world, user.posX, user.posY, user.posZ, mould); + drop.delayBeforeCanPickup = 0; + world.spawnEntityInWorld(drop); + } + } + return true; + } + if (!world.isRemote) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + topTex = isActive ? reg.registerIcon("minefantasy2:processor/crucible_top_active_" + type) + : reg.registerIcon("minefantasy2:processor/crucible_top_" + type); + sideTex = reg.registerIcon("minefantasy2:processor/crucible_side_" + type); + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, int x, int y, int z) { + return Item.getItemFromBlock(getInactiveBlock(tier, isAuto)); + } + + @Override + public Item getItemDropped(int meta, Random rand, int fort) { + return Item.getItemFromBlock(getInactiveBlock(tier, isAuto)); + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockForge.java b/src/main/java/minefantasy/mf2/block/refining/BlockForge.java index 2eddf602..1877cc99 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockForge.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockForge.java @@ -1,8 +1,5 @@ package minefantasy.mf2.block.refining; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -36,296 +33,298 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.List; +import java.util.Random; + public class BlockForge extends BlockContainer { - public static int forge_RI = 104; - - private Random rand = new Random(); - public final boolean isActive; - private static boolean keepInventory; - public int tier; - public String type; - - public BlockForge(String tex, int tier, boolean isActive) { - super(tier == 1 ? Material.iron : Material.rock); - this.tier = tier; - this.type = tex; - this.isActive = isActive; - // setBlockBounds(0F, 0F, 0F, 1F, 12F/16F, 1F); - GameRegistry.registerBlock(this, "MF_Forge" + tex + (isActive ? "Active" : "")); - setBlockName("forge." + tex); - this.setStepSound(Block.soundTypeStone); - this.setHardness(5F); - this.setResistance(8F); - this.setCreativeTab(CreativeTabMF.tabUtil); - setBlockBounds(0F, 0F, 0F, 1F, 0.5F, 1F); - this.setLightOpacity(0); - } - - @Override - public void getSubBlocks(Item item, CreativeTabs tab, List list) { - if (!isActive) { - super.getSubBlocks(item, tab, list); - } - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityForge(); - } - - private static TileEntityForge getTile(IBlockAccess world, int x, int y, int z) { - return (TileEntityForge) world.getTileEntity(x, y, z); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - if (keepInventory) - return; - - TileEntityForge tile = getTile(world, x, y, z); - - if (tile != null) { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) { - int l = world.getBlockMetadata(x, y, z); - TileEntityForge tileentity = getTile(world, x, y, z); - keepInventory = true; - Block block = world.getBlock(x, y, z); - - if (block != null && block instanceof BlockForge) { - int blocktier = ((BlockForge) block).tier; - if (state) { - world.setBlock(x, y, z, getActiveBlock(blocktier)); - } else { - world.setBlock(x, y, z, getInactiveBlock(blocktier)); - } - } - - keepInventory = false; - world.setBlockMetadataWithNotify(x, y, z, l, 2); - - if (tileentity != null) { - tileentity.validate(); - world.setTileEntity(x, y, z, tileentity); - } - } - - private static Block getActiveBlock(int tier) { - return tier == 1 ? BlockListMF.forge_metal_active : BlockListMF.forge_active; - } - - private static Block getInactiveBlock(int tier) { - return tier == 1 ? BlockListMF.forge_metal : BlockListMF.forge; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return BlockListMF.crucible.getIcon(side, meta); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - ItemStack held = user.getHeldItem(); - TileEntityForge tile = getTile(world, x, y, z); - if (tile != null) { - if (tile.isLit() && !ItemApron.isUserProtected(user)) { - user.setFire(5); - user.attackEntityFrom(DamageSource.onFire, 1.0F); - } - if (held != null) { - if (side == 1 && held != null && held.getItem() instanceof ItemTongs - && onUsedTongs(world, user, held, tile)) { - return true; - } - int l = ItemLighterMF.tryUse(held, user); - if (!isActive && l != 0) { - user.playSound("fire.ignite", 1.0F, 1.0F); - if (l == 1) { - tile.fireUpForge(); - held.damageItem(1, user); - } - return true; - } - if (Heatable.canHeatItem(held) && tile.tryAddHeatable(held)) { - --held.stackSize; - if (held.stackSize <= 0) { - user.setCurrentItemOrArmor(0, null); - } - return true; - } - - ForgeFuel stats = ForgeItemHandler.getStats(held); - if (stats != null && tile.addFuel(stats, true, tier)) { - if (user.capabilities.isCreativeMode) { - return true; - } - if (user.getHeldItem().getItem().getContainerItem() != null) { - ItemStack cont = new ItemStack(user.getHeldItem().getItem().getContainerItem()); - if (user.getHeldItem().stackSize == 1) { - user.setCurrentItemOrArmor(0, cont); - return true; - } else { - if (!user.inventory.addItemStackToInventory(cont)) { - user.entityDropItem(cont, 0.0F); - } - } - } - if (user.getHeldItem().stackSize == 1) { - user.setCurrentItemOrArmor(0, null); - } else { - user.getHeldItem().stackSize--; - } - return true; - } - if (!world.isRemote && ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.smeltDragonforge) - && held.getItem() == ComponentListMF.dragon_heart) { - if (user.getHeldItem().stackSize == 1) { - user.setCurrentItemOrArmor(0, null); - } else { - user.getHeldItem().stackSize--; - } - tile.dragonHeartPower = 1.0F; - return true; - } - } - if (!world.isRemote && !tile.hasBlockAbove()) { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - private boolean onUsedTongs(World world, EntityPlayer user, ItemStack held, TileEntityForge tile) { - ItemStack contents = tile.getStackInSlot(0); - ItemStack grabbed = TongsHelper.getHeldItem(held); - - // GRAB - if (grabbed == null) { - if (contents != null && contents.getItem() == ComponentListMF.hotItem) { - if (TongsHelper.trySetHeldItem(held, contents)) { - tile.setInventorySlotContents(0, null); - return true; - } - } - } else { - if (contents == null) { - tile.setInventorySlotContents(0, grabbed); - TongsHelper.clearHeldItem(held, user); - return true; - } - } - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) { - return Item.getItemFromBlock(getInactiveBlock(tier)); - } - - @Override - public Item getItemDropped(int meta, Random rand, int fort) { - return Item.getItemFromBlock(getInactiveBlock(tier)); - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public int getRenderType() { - return forge_RI; - } - - /** - * Called whenever the block is added into the world. Args: world, x, y, z - */ - @Override - public void onBlockAdded(World world, int x, int y, int z) { - if (tier == 1 && !world.isRemote) { - if (this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) { - world.scheduleBlockUpdate(x, y, z, this, 4); - } else if (!this.isActive && world.isBlockIndirectlyGettingPowered(x, y, z)) { - updateFurnaceBlockState(true, world, x, y, z); - } - } - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which - * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor - * Block - */ - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - if (tier == 1 && !world.isRemote) { - if (this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) { - world.scheduleBlockUpdate(x, y, z, this, 4); - } else if (!this.isActive && world.isBlockIndirectlyGettingPowered(x, y, z)) { - updateFurnaceBlockState(true, world, x, y, z); - } - } - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random rand) { - if (tier == 1 && !world.isRemote && this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) { - updateFurnaceBlockState(false, world, x, y, z); - } - } + public static int forge_RI = 104; + private static boolean keepInventory; + public final boolean isActive; + public int tier; + public String type; + private Random rand = new Random(); + + public BlockForge(String tex, int tier, boolean isActive) { + super(tier == 1 ? Material.iron : Material.rock); + this.tier = tier; + this.type = tex; + this.isActive = isActive; + // setBlockBounds(0F, 0F, 0F, 1F, 12F/16F, 1F); + GameRegistry.registerBlock(this, "MF_Forge" + tex + (isActive ? "Active" : "")); + setBlockName("forge." + tex); + this.setStepSound(Block.soundTypeStone); + this.setHardness(5F); + this.setResistance(8F); + this.setCreativeTab(CreativeTabMF.tabUtil); + setBlockBounds(0F, 0F, 0F, 1F, 0.5F, 1F); + this.setLightOpacity(0); + } + + private static TileEntityForge getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityForge) world.getTileEntity(x, y, z); + } + + public static void updateFurnaceBlockState(boolean state, World world, int x, int y, int z) { + int l = world.getBlockMetadata(x, y, z); + TileEntityForge tileentity = getTile(world, x, y, z); + keepInventory = true; + Block block = world.getBlock(x, y, z); + + if (block != null && block instanceof BlockForge) { + int blocktier = ((BlockForge) block).tier; + if (state) { + world.setBlock(x, y, z, getActiveBlock(blocktier)); + } else { + world.setBlock(x, y, z, getInactiveBlock(blocktier)); + } + } + + keepInventory = false; + world.setBlockMetadataWithNotify(x, y, z, l, 2); + + if (tileentity != null) { + tileentity.validate(); + world.setTileEntity(x, y, z, tileentity); + } + } + + private static Block getActiveBlock(int tier) { + return tier == 1 ? BlockListMF.forge_metal_active : BlockListMF.forge_active; + } + + private static Block getInactiveBlock(int tier) { + return tier == 1 ? BlockListMF.forge_metal : BlockListMF.forge; + } + + @Override + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + if (!isActive) { + super.getSubBlocks(item, tab, list); + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityForge(); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + if (keepInventory) + return; + + TileEntityForge tile = getTile(world, x, y, z); + + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return BlockListMF.crucible.getIcon(side, meta); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + ItemStack held = user.getHeldItem(); + TileEntityForge tile = getTile(world, x, y, z); + if (tile != null) { + if (tile.isLit() && !ItemApron.isUserProtected(user)) { + user.setFire(5); + user.attackEntityFrom(DamageSource.onFire, 1.0F); + } + if (held != null) { + if (side == 1 && held != null && held.getItem() instanceof ItemTongs + && onUsedTongs(world, user, held, tile)) { + return true; + } + int l = ItemLighterMF.tryUse(held, user); + if (!isActive && l != 0) { + user.playSound("fire.ignite", 1.0F, 1.0F); + if (l == 1) { + tile.fireUpForge(); + held.damageItem(1, user); + } + return true; + } + if (Heatable.canHeatItem(held) && tile.tryAddHeatable(held)) { + --held.stackSize; + if (held.stackSize <= 0) { + user.setCurrentItemOrArmor(0, null); + } + return true; + } + + ForgeFuel stats = ForgeItemHandler.getStats(held); + if (stats != null && tile.addFuel(stats, true, tier)) { + if (user.capabilities.isCreativeMode) { + return true; + } + if (user.getHeldItem().getItem().getContainerItem() != null) { + ItemStack cont = new ItemStack(user.getHeldItem().getItem().getContainerItem()); + if (user.getHeldItem().stackSize == 1) { + user.setCurrentItemOrArmor(0, cont); + return true; + } else { + if (!user.inventory.addItemStackToInventory(cont)) { + user.entityDropItem(cont, 0.0F); + } + } + } + if (user.getHeldItem().stackSize == 1) { + user.setCurrentItemOrArmor(0, null); + } else { + user.getHeldItem().stackSize--; + } + return true; + } + if (!world.isRemote && ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.smeltDragonforge) + && held.getItem() == ComponentListMF.dragon_heart) { + if (user.getHeldItem().stackSize == 1) { + user.setCurrentItemOrArmor(0, null); + } else { + user.getHeldItem().stackSize--; + } + tile.dragonHeartPower = 1.0F; + return true; + } + } + if (!world.isRemote && !tile.hasBlockAbove()) { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + private boolean onUsedTongs(World world, EntityPlayer user, ItemStack held, TileEntityForge tile) { + ItemStack contents = tile.getStackInSlot(0); + ItemStack grabbed = TongsHelper.getHeldItem(held); + + // GRAB + if (grabbed == null) { + if (contents != null && contents.getItem() == ComponentListMF.hotItem) { + if (TongsHelper.trySetHeldItem(held, contents)) { + tile.setInventorySlotContents(0, null); + return true; + } + } + } else { + if (contents == null) { + tile.setInventorySlotContents(0, grabbed); + TongsHelper.clearHeldItem(held, user); + return true; + } + } + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, int x, int y, int z) { + return Item.getItemFromBlock(getInactiveBlock(tier)); + } + + @Override + public Item getItemDropped(int meta, Random rand, int fort) { + return Item.getItemFromBlock(getInactiveBlock(tier)); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public int getRenderType() { + return forge_RI; + } + + /** + * Called whenever the block is added into the world. Args: world, x, y, z + */ + @Override + public void onBlockAdded(World world, int x, int y, int z) { + if (tier == 1 && !world.isRemote) { + if (this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) { + world.scheduleBlockUpdate(x, y, z, this, 4); + } else if (!this.isActive && world.isBlockIndirectlyGettingPowered(x, y, z)) { + updateFurnaceBlockState(true, world, x, y, z); + } + } + } + + /** + * Lets the block know when one of its neighbor changes. Doesn't know which + * neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor + * Block + */ + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + if (tier == 1 && !world.isRemote) { + if (this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) { + world.scheduleBlockUpdate(x, y, z, this, 4); + } else if (!this.isActive && world.isBlockIndirectlyGettingPowered(x, y, z)) { + updateFurnaceBlockState(true, world, x, y, z); + } + } + } + + /** + * Ticks the block if it's been scheduled + */ + @Override + public void updateTick(World world, int x, int y, int z, Random rand) { + if (tier == 1 && !world.isRemote && this.isActive && !world.isBlockIndirectlyGettingPowered(x, y, z)) { + updateFurnaceBlockState(false, world, x, y, z); + } + } } diff --git a/src/main/java/minefantasy/mf2/block/refining/BlockQuern.java b/src/main/java/minefantasy/mf2/block/refining/BlockQuern.java index 8b2840ba..3a33926a 100644 --- a/src/main/java/minefantasy/mf2/block/refining/BlockQuern.java +++ b/src/main/java/minefantasy/mf2/block/refining/BlockQuern.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.refining; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -21,124 +19,125 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.Random; + public class BlockQuern extends BlockContainer { - private Random rand = new Random(); - public IIcon bottomTex, sideTex, topTex; - private String type; - - public BlockQuern(String type) { - super(Material.rock); - this.type = type; - GameRegistry.registerBlock(this, "MF_Grind_" + type); - setBlockName(type); - this.setStepSound(Block.soundTypeStone); - this.setHardness(5F); - this.setResistance(5F); - this.setCreativeTab(CreativeTabMF.tabUtil); - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityQuern(); - } - - private TileEntityQuern getTile(IBlockAccess world, int x, int y, int z) { - return (TileEntityQuern) world.getTileEntity(x, y, z); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntityQuern tile = getTile(world, x, y, z); - - if (tile != null) { - for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { - ItemStack itemstack = tile.getStackInSlot(i1); - - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem() - .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - - super.breakBlock(world, x, y, z, block, meta); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, - float yOffset, float zOffset) { - TileEntityQuern tile = getTile(world, x, y, z); - if (tile != null) { - if (side == 1) { - tile.onUse(user); - } else { - user.openGui(MineFantasyII.instance, 0, world, x, y, z); - } - } - return true; - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { - TileEntityQuern tile = getTile(world, x, y, z); - if (tile != null) { - tile.onUse(user); - } - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - this.topTex = reg.registerIcon("minefantasy2:processor/" + type + "_top"); - this.sideTex = reg.registerIcon("minefantasy2:processor/" + type + "_side"); - this.bottomTex = reg.registerIcon("minefantasy2:processor/" + type + "_base"); - } - - @Override - public IIcon getIcon(int side, int meta) { - return side == 0 ? bottomTex : side == 1 ? topTex : sideTex; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @SideOnly(Side.CLIENT) - public int getRenderType() { - return quern_RI; - } - - public static int quern_RI = 111; + public static int quern_RI = 111; + public IIcon bottomTex, sideTex, topTex; + private Random rand = new Random(); + private String type; + + public BlockQuern(String type) { + super(Material.rock); + this.type = type; + GameRegistry.registerBlock(this, "MF_Grind_" + type); + setBlockName(type); + this.setStepSound(Block.soundTypeStone); + this.setHardness(5F); + this.setResistance(5F); + this.setCreativeTab(CreativeTabMF.tabUtil); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityQuern(); + } + + private TileEntityQuern getTile(IBlockAccess world, int x, int y, int z) { + return (TileEntityQuern) world.getTileEntity(x, y, z); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + TileEntityQuern tile = getTile(world, x, y, z); + + if (tile != null) { + for (int i1 = 0; i1 < tile.getSizeInventory(); ++i1) { + ItemStack itemstack = tile.getStackInSlot(i1); + + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + + world.func_147453_f(x, y, z, block); + } + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer user, int side, float xOffset, + float yOffset, float zOffset) { + TileEntityQuern tile = getTile(world, x, y, z); + if (tile != null) { + if (side == 1) { + tile.onUse(user); + } else { + user.openGui(MineFantasyII.instance, 0, world, x, y, z); + } + } + return true; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer user) { + TileEntityQuern tile = getTile(world, x, y, z); + if (tile != null) { + tile.onUse(user); + } + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + this.topTex = reg.registerIcon("minefantasy2:processor/" + type + "_top"); + this.sideTex = reg.registerIcon("minefantasy2:processor/" + type + "_side"); + this.bottomTex = reg.registerIcon("minefantasy2:processor/" + type + "_base"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return side == 0 ? bottomTex : side == 1 ? topTex : sideTex; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @SideOnly(Side.CLIENT) + public int getRenderType() { + return quern_RI; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java index a03df671..7f42f298 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityAnvilMF.java @@ -35,6 +35,14 @@ public class TileEntityAnvilMF extends TileEntity implements IInventory, IAnvil, IQualityBalance { public int tier; + public String resName = ""; + public float progressMax; + public float progress; + public String texName = ""; + public float qualityBalance = 0F; + public float thresholdPosition = 0.1F; + public float leftHit = 0F; + public float rightHit = 0F; private ItemStack[] inventory; private Random rand = new Random(); private int ticksExisted; @@ -46,6 +54,10 @@ public class TileEntityAnvilMF extends TileEntity implements IInventory, IAnvil, private boolean outputHot = false; private Skill skillUsed; private boolean resetRecipe = false; + private boolean isFakeAnvil = false; + private ItemStack recipe; + private int hammerTierRequired; + private int anvilTierRequired; public TileEntityAnvilMF() { this(0, "Iron"); @@ -58,8 +70,6 @@ public TileEntityAnvilMF(int tier, String name) { setContainer(new ContainerAnvilMF(this)); } - private boolean isFakeAnvil = false; - public TileEntityAnvilMF setDisplay() { isFakeAnvil = true; return this; @@ -562,8 +572,6 @@ public void syncData() { NetworkUtils.sendToWatchers(new AnvilPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); } - public String resName = ""; - public String getResultName() { if (!worldObj.isRemote && recipe != null && recipe.getDisplayName() != null) { resName = recipe.getDisplayName(); @@ -693,12 +701,6 @@ public boolean canCraft() { return false; } - private ItemStack recipe; - public float progressMax; - public float progress; - private int hammerTierRequired; - private int anvilTierRequired; - @Override public void setForgeTime(int i) { progressMax = i; @@ -751,15 +753,10 @@ private boolean isMythicReady() { return true; } - public String texName = ""; - public String getTextureName() { return texName; } - public float qualityBalance = 0F; - public float thresholdPosition = 0.1F; - @Override public float getMarkerPosition() { return qualityBalance; @@ -861,9 +858,6 @@ public void upset(EntityPlayer user) { } } - public float leftHit = 0F; - public float rightHit = 0F; - private void reassignHitValues() { if (!worldObj.isRemote) { leftHit = 0.1F + (0.01F * rand.nextInt(11)); diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBellows.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBellows.java index 2d85f349..2cef86eb 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBellows.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBellows.java @@ -7,105 +7,105 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityBellows extends TileEntity { - public int direction; - public int press = 0; - - public TileEntityBellows() { - - } - - public void interact(EntityPlayer player, float powerLevel) { - int x = xCoord; - int y = yCoord; - int z = zCoord; - IBellowsUseable forge = getFacingForge(); - if (press < 10) { - if (player != null) { - player.playSound("minefantasy2:block.bellows", 1, 1); - } else { - worldObj.playSound(xCoord, yCoord, zCoord, "minefantasy2:block.bellows", 1.0F, 1.0F, false); - } - press = 50; - if (forge != null) { - forge.onUsedWithBellows(powerLevel); - } - sendPacketToClients(); - } - } - - @Override - public void updateEntity() { - super.updateEntity(); - if (press > 0) - press -= 2; - if (press < 0) - press = 0; - sendPacketToClients(); - } - - private void sendPacketToClients() { - // TODO Auto-generated method stub - - } - - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - direction = nbt.getInteger("direction"); - press = nbt.getInteger("press"); - } - - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("direction", direction); - nbt.setInteger("press", press); - } - - public ForgeDirection getFacing() { - int dir = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - switch (dir)// clockwise - { - case 0: // SOUTH - return ForgeDirection.SOUTH; - case 1: // WEST - return ForgeDirection.WEST; - case 2: // NORTH - return ForgeDirection.NORTH; - case 3: // EAST - return ForgeDirection.EAST; - } - return ForgeDirection.SOUTH; - } - - public IBellowsUseable getFacingForge() { - ForgeDirection dir = getFacing(); - int x2 = xCoord + dir.offsetX; - int y2 = yCoord + dir.offsetY; - int z2 = zCoord + dir.offsetZ; - - TileEntity tile = worldObj.getTileEntity(x2, y2, z2); - - if (tile != null && tile instanceof IBellowsUseable) - return (IBellowsUseable) tile; - - if (worldObj.getBlock(x2, y2, z2).getMaterial() != null - && worldObj.getBlock(x2, y2, z2).getMaterial().isSolid()) { - return getFacingForgeThroughWall(); - } - return null; - } - - public IBellowsUseable getFacingForgeThroughWall() { - ForgeDirection dir = getFacing(); - int x2 = xCoord + (dir.offsetX * 2); - int y2 = yCoord + (dir.offsetY * 2); - int z2 = zCoord + (dir.offsetZ * 2); - - TileEntity tile = worldObj.getTileEntity(x2, y2, z2); - if (tile == null) - return null; - if (tile instanceof IBellowsUseable) { - return (IBellowsUseable) tile; - } - return null; - } + public int direction; + public int press = 0; + + public TileEntityBellows() { + + } + + public void interact(EntityPlayer player, float powerLevel) { + int x = xCoord; + int y = yCoord; + int z = zCoord; + IBellowsUseable forge = getFacingForge(); + if (press < 10) { + if (player != null) { + player.playSound("minefantasy2:block.bellows", 1, 1); + } else { + worldObj.playSound(xCoord, yCoord, zCoord, "minefantasy2:block.bellows", 1.0F, 1.0F, false); + } + press = 50; + if (forge != null) { + forge.onUsedWithBellows(powerLevel); + } + sendPacketToClients(); + } + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (press > 0) + press -= 2; + if (press < 0) + press = 0; + sendPacketToClients(); + } + + private void sendPacketToClients() { + // TODO Auto-generated method stub + + } + + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + direction = nbt.getInteger("direction"); + press = nbt.getInteger("press"); + } + + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("direction", direction); + nbt.setInteger("press", press); + } + + public ForgeDirection getFacing() { + int dir = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + switch (dir)// clockwise + { + case 0: // SOUTH + return ForgeDirection.SOUTH; + case 1: // WEST + return ForgeDirection.WEST; + case 2: // NORTH + return ForgeDirection.NORTH; + case 3: // EAST + return ForgeDirection.EAST; + } + return ForgeDirection.SOUTH; + } + + public IBellowsUseable getFacingForge() { + ForgeDirection dir = getFacing(); + int x2 = xCoord + dir.offsetX; + int y2 = yCoord + dir.offsetY; + int z2 = zCoord + dir.offsetZ; + + TileEntity tile = worldObj.getTileEntity(x2, y2, z2); + + if (tile != null && tile instanceof IBellowsUseable) + return (IBellowsUseable) tile; + + if (worldObj.getBlock(x2, y2, z2).getMaterial() != null + && worldObj.getBlock(x2, y2, z2).getMaterial().isSolid()) { + return getFacingForgeThroughWall(); + } + return null; + } + + public IBellowsUseable getFacingForgeThroughWall() { + ForgeDirection dir = getFacing(); + int x2 = xCoord + (dir.offsetX * 2); + int y2 = yCoord + (dir.offsetY * 2); + int z2 = zCoord + (dir.offsetZ * 2); + + TileEntity tile = worldObj.getTileEntity(x2, y2, z2); + if (tile == null) + return null; + if (tile instanceof IBellowsUseable) { + return (IBellowsUseable) tile; + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBerryBush.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBerryBush.java index 51d7b879..5c39d28e 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBerryBush.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBerryBush.java @@ -1,40 +1,40 @@ package minefantasy.mf2.block.tileentity; -import java.util.Random; - import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; +import java.util.Random; + public class TileEntityBerryBush extends TileEntity { - private long nextGrowbackTime; - private Random rand = new Random(); - - @Override - public void updateEntity() { - super.updateEntity(); - - if (!worldObj.isRemote && worldObj.getTotalWorldTime() >= nextGrowbackTime) {// Regrow - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); - } - } - - public void harvestBerries() { - double[] days = new double[] { 2D, 7D }; - double modifier = MathHelper.getRandomDoubleInRange(rand, days[0], days[1]); - nextGrowbackTime = worldObj.getTotalWorldTime() + (int) (24000 * modifier); - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setLong("nextGrowbackTime", nextGrowbackTime); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - nextGrowbackTime = nbt.getLong("nextGrowbackTime"); - } + private long nextGrowbackTime; + private Random rand = new Random(); + + @Override + public void updateEntity() { + super.updateEntity(); + + if (!worldObj.isRemote && worldObj.getTotalWorldTime() >= nextGrowbackTime) {// Regrow + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); + } + } + + public void harvestBerries() { + double[] days = new double[]{2D, 7D}; + double modifier = MathHelper.getRandomDoubleInRange(rand, days[0], days[1]); + nextGrowbackTime = worldObj.getTotalWorldTime() + (int) (24000 * modifier); + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setLong("nextGrowbackTime", nextGrowbackTime); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + nextGrowbackTime = nbt.getLong("nextGrowbackTime"); + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java index 6525e6b2..22eaf576 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java @@ -10,8 +10,8 @@ import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.refining.BlockBigFurnace; import minefantasy.mf2.item.food.FoodListMF; -import minefantasy.mf2.network.packet.BigFurnacePacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.BigFurnacePacket; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -34,590 +34,585 @@ public class TileEntityBigFurnace extends TileEntity implements IBellowsUseable, IInventory, ISidedInventory { - // UNIVERSAL - public int fuel; - public int maxFuel; - public ItemStack[] inv; - public int itemMeta; - public boolean built = false; - private Random rand = new Random(); - - // ANIMATE - public int numUsers; - public int doorAngle; - - // HEATER - public float heat; - public float maxHeat; - private int aboveType; - public int justShared; - - // FURNACE - public int progress; - private int ticksExisted; - private int ticksSinceSync; - - /** - * CLIENT VAR This is used to determine if the block is able to emit smoke - */ - public boolean isBurningClient; - - public TileEntityBigFurnace setBlockType(Block block) { - blockType = block; - return this; - } - - public TileEntityBigFurnace() { - super(); - inv = new ItemStack[8]; - fuel = maxFuel = progress = 0; - } - - public TileEntityBigFurnace(int meta) { - this(); - itemMeta = meta; - } - - @Override - public void onUsedWithBellows(float powerLevel) { - if (isHeater()) { - if (justShared > 0) { - return; - } - justShared = 5; - - if (fuel > 0) { - int max = (int) (maxHeat * 1.5F); - if (heat < max) { - heat += 50 * powerLevel; - } - - for (int a = 0; a < 10; a++) { - worldObj.spawnParticle("flame", xCoord + (rand.nextDouble() * 0.8D) + 0.1D, yCoord + 0.4D, - zCoord + (rand.nextDouble() * 0.8D) + 0.1D, 0, 0.01, 0); - } - } - pumpBellows(-1, 0, powerLevel * 0.9F); - pumpBellows(0, -1, powerLevel * 0.9F); - pumpBellows(0, 1, powerLevel * 0.9F); - pumpBellows(1, 0, powerLevel * 0.9F); - } - } - - private void pumpBellows(int x, int z, float pump) { - int share = 2; - TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord, zCoord + z); - if (tile == null) - return; - - if (tile instanceof TileEntityBigFurnace) { - TileEntityBigFurnace furn = (TileEntityBigFurnace) tile; - if (furn.isHeater()) - furn.onUsedWithBellows(pump); - } - } - - private boolean wasBurning; - - @Override - public void updateEntity() { - super.updateEntity(); - - if (!worldObj.isRemote) { - if (numUsers > 0 && doorAngle < 20) { - doorAngle++; - } - - if (numUsers <= 0 && doorAngle > 0) { - doorAngle--; - } - if (doorAngle < 0) - doorAngle = 0; - if (doorAngle > 20) - doorAngle = 20; - } - - ++ticksExisted; - if (justShared > 0) - justShared--; - if (ticksExisted % 10 == 0) { - built = structureExists(); - } - if (isHeater()) { - updateHeater(); - } else { - updateFurnace(); - } - // UNIVERSAL - if (isBurning() != wasBurning || ticksExisted == 20) { - worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord); - } - if (!worldObj.isRemote) { - sendPacketToClients(); - } - wasBurning = isBurning(); - } - - private void updateFurnace() { - if (isBurning()) { - if (worldObj.isRemote && rand.nextInt(10) == 0) { - worldObj.spawnParticle("flame", xCoord + (rand.nextDouble() * 0.8D) + 0.1D, yCoord + 0.4D, - zCoord + (rand.nextDouble() * 0.8D) + 0.1D, 0, 0.01, 0); - } - } - if (worldObj.isRemote) { - return; - } - if (isBurning()) { - puffSmoke(new Random(), worldObj, xCoord, yCoord, zCoord); - } - TileEntityBigFurnace heater = getHeater(); - - if (heater != null) { - heat = heater.heat; - } else { - heat -= 4; - } - boolean canSmelt = false; - boolean smelted = false; - - if (getSpecialResult() != null) { - if (!canFitSpecialResult()) { - canSmelt = false; - } else { - canSmelt = true; - - if (progress >= getMaxTime()) { - smeltSpecial(); - smelted = true; - } - } - } else - for (int a = 0; a < 4; a++) { - if (canSmelt(inv[a], inv[a + 4])) { - canSmelt = true; - - if (progress >= getMaxTime()) { - smeltItem(a, a + 4); - smelted = true; - } - } - } - - if (canSmelt) { - progress += heat; - } - if (!canSmelt || smelted) { - progress = 0; - } - } - - private boolean canFitSpecialResult() { - ItemStack spec = getSpecialResult(); - - if (spec != null) { - int spaceNeeded = spec.stackSize; - int spaceLeft = 0; - - for (int a = 4; a < 8; a++) { - ItemStack item = inv[a]; - if (inv[a] == null) { - spaceLeft += 64; - } else { - if (CustomToolHelper.areEqual(inv[a], spec)) { - if (inv[a].stackSize < inv[a].getMaxStackSize()) { - spaceLeft += inv[a].getMaxStackSize() - inv[a].stackSize; - } - } - } - } - return spec.stackSize <= spaceLeft; - } - return false; - } - - private void smeltSpecial() { - ItemStack res = getSpecialResult().copy(); - - for (int output = 4; output < 8; output++) { - if (res.stackSize <= 0) - break; - - if (inv[output] == null) { - setInventorySlotContents(output, res); - break; - } else { - if (CustomToolHelper.areEqual(inv[output], res)) { - int spaceLeft = inv[output].getMaxStackSize() - inv[output].stackSize; - - if (res.stackSize <= spaceLeft) { - inv[output].stackSize += res.stackSize; - break; - } else { - inv[output].stackSize += spaceLeft; - res.stackSize -= spaceLeft; - } - } - } - } - for (int input = 0; input < 4; input++) - decrStackSize(input, 1); - } - - public void puffSmoke(Random rand, World world, int x, int y, int z) { - if (rand.nextInt(5) != 0) { - return; - } - ForgeDirection dir = getBack(); - SmokeMechanics.emitSmokeIndirect(world, x + dir.offsetX, y + (isHeater() ? 2 : 1), z + dir.offsetZ, 1); - } - - private int getMaxTime() { - return (int) 1.0E+5; - } - - private void smeltItem(int input, int output) { - ItemStack res = getResult(inv[input]).copy(); - - if (inv[output] == null) { - setInventorySlotContents(output, res); - } else { - if (CustomToolHelper.areEqual(inv[output], res)) { - inv[output].stackSize += res.stackSize; - } - } - - decrStackSize(input, 1); - } - - private boolean canSmelt(ItemStack in, ItemStack out) { - if (isHeater()) - return false; - - if (!built) - return false; - - ItemStack res = getResult(in); - if (res == null) { - return false; - } - if (out == null) { - return true; - } - if (CustomToolHelper.areEqual(out, res)) { - int max = res.getMaxStackSize(); - if ((out.stackSize + res.stackSize) > max) { - return false; - } - } else { - return false; - } - - return true; - } - - private TileEntityBigFurnace getHeater() { - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - if (tile != null && tile instanceof TileEntityBigFurnace) { - if (((TileEntityBigFurnace) tile).isHeater()) - return (TileEntityBigFurnace) tile; - } - return null; - } - - private TileEntityBigFurnace getFurnace() { - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); - if (tile != null && tile instanceof TileEntityBigFurnace) { - if (!((TileEntityBigFurnace) tile).isHeater()) - return (TileEntityBigFurnace) tile; - } - return null; - } - - private void updateHeater() { - if (worldObj.isRemote) - return; - - TileEntityBigFurnace furn = getFurnace(); - if (furn != null) { - aboveType = furn.getType(); - } - if (!built) { - heat = maxHeat = fuel = maxFuel = 0; - return; - } - if (heat < maxHeat) { - heat++; - } - if (heat > maxHeat) { - heat--; - } - if (fuel > 0) { - fuel--; - } else { - if (inv[0] != null && isItemFuel(inv[0])) { - fuel = maxFuel = getItemBurnTime(inv[0]); - maxHeat = getItemHeat(inv[0]); - ItemStack cont = inv[0].getItem().getContainerItem(inv[0]); - - if (cont != null) { - inv[0] = cont; - } else { - decrStackSize(0, 1); - } - } - if (fuel <= 0) { - if (heat > 0) - heat--; - maxHeat = 0; - } - } - - } - - private float getItemHeat(ItemStack itemStack) { - return ForgeItemHandler.getForgeHeat(itemStack); - } - - public ItemStack getResult(ItemStack item) { - if (item == null) - return null; - - // SPECIAL SMELTING - BigFurnaceRecipes recipe = BigFurnaceRecipes.getResult(item); - if (recipe != null && recipe.tier <= this.getTier()) { - return recipe.result; - } - - ItemStack res = FurnaceRecipes.smelting().getSmeltingResult(item);// If no special: try vanilla - if (res != null) { - if (res.getItem() instanceof ItemFood || item.getItem() instanceof ItemFood) { - return new ItemStack(FoodListMF.burnt_food, 1, 1); - } - return res; - } - - return null; - } - - public ItemStack getSpecialResult() { - return null; - /* + // UNIVERSAL + public int fuel; + public int maxFuel; + public ItemStack[] inv; + public int itemMeta; + public boolean built = false; + // ANIMATE + public int numUsers; + public int doorAngle; + // HEATER + public float heat; + public float maxHeat; + public int justShared; + // FURNACE + public int progress; + /** + * CLIENT VAR This is used to determine if the block is able to emit smoke + */ + public boolean isBurningClient; + private Random rand = new Random(); + private int aboveType; + private int ticksExisted; + private int ticksSinceSync; + private boolean wasBurning; + + public TileEntityBigFurnace() { + super(); + inv = new ItemStack[8]; + fuel = maxFuel = progress = 0; + } + + public TileEntityBigFurnace(int meta) { + this(); + itemMeta = meta; + } + + public TileEntityBigFurnace setBlockType(Block block) { + blockType = block; + return this; + } + + @Override + public void onUsedWithBellows(float powerLevel) { + if (isHeater()) { + if (justShared > 0) { + return; + } + justShared = 5; + + if (fuel > 0) { + int max = (int) (maxHeat * 1.5F); + if (heat < max) { + heat += 50 * powerLevel; + } + + for (int a = 0; a < 10; a++) { + worldObj.spawnParticle("flame", xCoord + (rand.nextDouble() * 0.8D) + 0.1D, yCoord + 0.4D, + zCoord + (rand.nextDouble() * 0.8D) + 0.1D, 0, 0.01, 0); + } + } + pumpBellows(-1, 0, powerLevel * 0.9F); + pumpBellows(0, -1, powerLevel * 0.9F); + pumpBellows(0, 1, powerLevel * 0.9F); + pumpBellows(1, 0, powerLevel * 0.9F); + } + } + + private void pumpBellows(int x, int z, float pump) { + int share = 2; + TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord, zCoord + z); + if (tile == null) + return; + + if (tile instanceof TileEntityBigFurnace) { + TileEntityBigFurnace furn = (TileEntityBigFurnace) tile; + if (furn.isHeater()) + furn.onUsedWithBellows(pump); + } + } + + @Override + public void updateEntity() { + super.updateEntity(); + + if (!worldObj.isRemote) { + if (numUsers > 0 && doorAngle < 20) { + doorAngle++; + } + + if (numUsers <= 0 && doorAngle > 0) { + doorAngle--; + } + if (doorAngle < 0) + doorAngle = 0; + if (doorAngle > 20) + doorAngle = 20; + } + + ++ticksExisted; + if (justShared > 0) + justShared--; + if (ticksExisted % 10 == 0) { + built = structureExists(); + } + if (isHeater()) { + updateHeater(); + } else { + updateFurnace(); + } + // UNIVERSAL + if (isBurning() != wasBurning || ticksExisted == 20) { + worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord); + } + if (!worldObj.isRemote) { + sendPacketToClients(); + } + wasBurning = isBurning(); + } + + private void updateFurnace() { + if (isBurning()) { + if (worldObj.isRemote && rand.nextInt(10) == 0) { + worldObj.spawnParticle("flame", xCoord + (rand.nextDouble() * 0.8D) + 0.1D, yCoord + 0.4D, + zCoord + (rand.nextDouble() * 0.8D) + 0.1D, 0, 0.01, 0); + } + } + if (worldObj.isRemote) { + return; + } + if (isBurning()) { + puffSmoke(new Random(), worldObj, xCoord, yCoord, zCoord); + } + TileEntityBigFurnace heater = getHeater(); + + if (heater != null) { + heat = heater.heat; + } else { + heat -= 4; + } + boolean canSmelt = false; + boolean smelted = false; + + if (getSpecialResult() != null) { + if (!canFitSpecialResult()) { + canSmelt = false; + } else { + canSmelt = true; + + if (progress >= getMaxTime()) { + smeltSpecial(); + smelted = true; + } + } + } else + for (int a = 0; a < 4; a++) { + if (canSmelt(inv[a], inv[a + 4])) { + canSmelt = true; + + if (progress >= getMaxTime()) { + smeltItem(a, a + 4); + smelted = true; + } + } + } + + if (canSmelt) { + progress += heat; + } + if (!canSmelt || smelted) { + progress = 0; + } + } + + private boolean canFitSpecialResult() { + ItemStack spec = getSpecialResult(); + + if (spec != null) { + int spaceNeeded = spec.stackSize; + int spaceLeft = 0; + + for (int a = 4; a < 8; a++) { + ItemStack item = inv[a]; + if (inv[a] == null) { + spaceLeft += 64; + } else { + if (CustomToolHelper.areEqual(inv[a], spec)) { + if (inv[a].stackSize < inv[a].getMaxStackSize()) { + spaceLeft += inv[a].getMaxStackSize() - inv[a].stackSize; + } + } + } + } + return spec.stackSize <= spaceLeft; + } + return false; + } + + private void smeltSpecial() { + ItemStack res = getSpecialResult().copy(); + + for (int output = 4; output < 8; output++) { + if (res.stackSize <= 0) + break; + + if (inv[output] == null) { + setInventorySlotContents(output, res); + break; + } else { + if (CustomToolHelper.areEqual(inv[output], res)) { + int spaceLeft = inv[output].getMaxStackSize() - inv[output].stackSize; + + if (res.stackSize <= spaceLeft) { + inv[output].stackSize += res.stackSize; + break; + } else { + inv[output].stackSize += spaceLeft; + res.stackSize -= spaceLeft; + } + } + } + } + for (int input = 0; input < 4; input++) + decrStackSize(input, 1); + } + + public void puffSmoke(Random rand, World world, int x, int y, int z) { + if (rand.nextInt(5) != 0) { + return; + } + ForgeDirection dir = getBack(); + SmokeMechanics.emitSmokeIndirect(world, x + dir.offsetX, y + (isHeater() ? 2 : 1), z + dir.offsetZ, 1); + } + + private int getMaxTime() { + return (int) 1.0E+5; + } + + private void smeltItem(int input, int output) { + ItemStack res = getResult(inv[input]).copy(); + + if (inv[output] == null) { + setInventorySlotContents(output, res); + } else { + if (CustomToolHelper.areEqual(inv[output], res)) { + inv[output].stackSize += res.stackSize; + } + } + + decrStackSize(input, 1); + } + + private boolean canSmelt(ItemStack in, ItemStack out) { + if (isHeater()) + return false; + + if (!built) + return false; + + ItemStack res = getResult(in); + if (res == null) { + return false; + } + if (out == null) { + return true; + } + if (CustomToolHelper.areEqual(out, res)) { + int max = res.getMaxStackSize(); + if ((out.stackSize + res.stackSize) > max) { + return false; + } + } else { + return false; + } + + return true; + } + + private TileEntityBigFurnace getHeater() { + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (tile != null && tile instanceof TileEntityBigFurnace) { + if (((TileEntityBigFurnace) tile).isHeater()) + return (TileEntityBigFurnace) tile; + } + return null; + } + + private TileEntityBigFurnace getFurnace() { + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + if (tile != null && tile instanceof TileEntityBigFurnace) { + if (!((TileEntityBigFurnace) tile).isHeater()) + return (TileEntityBigFurnace) tile; + } + return null; + } + + private void updateHeater() { + if (worldObj.isRemote) + return; + + TileEntityBigFurnace furn = getFurnace(); + if (furn != null) { + aboveType = furn.getType(); + } + if (!built) { + heat = maxHeat = fuel = maxFuel = 0; + return; + } + if (heat < maxHeat) { + heat++; + } + if (heat > maxHeat) { + heat--; + } + if (fuel > 0) { + fuel--; + } else { + if (inv[0] != null && isItemFuel(inv[0])) { + fuel = maxFuel = getItemBurnTime(inv[0]); + maxHeat = getItemHeat(inv[0]); + ItemStack cont = inv[0].getItem().getContainerItem(inv[0]); + + if (cont != null) { + inv[0] = cont; + } else { + decrStackSize(0, 1); + } + } + if (fuel <= 0) { + if (heat > 0) + heat--; + maxHeat = 0; + } + } + + } + + private float getItemHeat(ItemStack itemStack) { + return ForgeItemHandler.getForgeHeat(itemStack); + } + + public ItemStack getResult(ItemStack item) { + if (item == null) + return null; + + // SPECIAL SMELTING + BigFurnaceRecipes recipe = BigFurnaceRecipes.getResult(item); + if (recipe != null && recipe.tier <= this.getTier()) { + return recipe.result; + } + + ItemStack res = FurnaceRecipes.smelting().getSmeltingResult(item);// If no special: try vanilla + if (res != null) { + if (res.getItem() instanceof ItemFood || item.getItem() instanceof ItemFood) { + return new ItemStack(FoodListMF.burnt_food, 1, 1); + } + return res; + } + + return null; + } + + public ItemStack getSpecialResult() { + return null; + /* * ItemStack[] input = new ItemStack[4]; for(int a = 0; a < 4; a ++) { input[a] * = inv[a]; } Alloy alloy = SpecialFurnaceRecipes.getResult(input); if(alloy != * null) { if(alloy.getLevel() <= getSmeltLevel()) { return * SpecialFurnaceRecipes.getResult(input).getRecipeOutput(); } } return null; */ - } - - public int getSizeInventory() { - return inv.length; - } - - public ItemStack getStackInSlot(int i) { - return inv[i]; - } - - public ItemStack decrStackSize(int i, int j) { - if (inv[i] != null) { - if (inv[i].stackSize <= j) { - ItemStack itemstack = inv[i]; - inv[i] = null; - return itemstack; - } - ItemStack itemstack1 = inv[i].splitStack(j); - if (inv[i].stackSize == 0) { - inv[i] = null; - } - return itemstack1; - } else { - return null; - } - } - - @SideOnly(Side.CLIENT) - public int getBurnTimeRemainingScaled(int height) { - if (this.maxFuel == 0) { - this.maxFuel = 200; - } - - return this.fuel * height / this.maxFuel; - } - - @SideOnly(Side.CLIENT) - public int getHeatScaled(int height) { - if (heat <= 0) - return 0; - int size = (int) (height / TileEntityForge.maxTemperature * this.heat); - - return Math.min(size, height); - } - - @SideOnly(Side.CLIENT) - public int getItemHeatScaled(int height) { - if (maxHeat <= 0) - return 0; - int size = (int) (height / TileEntityForge.maxTemperature * this.maxHeat); - - return Math.min(size, height); - } - - public void setInventorySlotContents(int i, ItemStack itemstack) { - inv[i] = itemstack; - if (itemstack != null && itemstack.stackSize > getInventoryStackLimit()) { - itemstack.stackSize = getInventoryStackLimit(); - } - } - - public String getInvName() { - int t = getType(); - String tier = ""; - - if (isHeater()) { - return StatCollector.translateToLocal("tile.furnace.name") + " " - + StatCollector.translateToLocal("block.furnace.heater"); - } - - return tier + " " + StatCollector.translateToLocal("tile.furnace.name"); - } - - public int getSmeltLevel() { - if (isHeater()) { - return -1; - } - return getType() - 1; - } - - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - - justShared = nbt.getInteger("Shared"); - built = nbt.getBoolean("Built"); - - fuel = nbt.getInteger("fuel"); - maxFuel = nbt.getInteger("MaxFuel"); - - heat = nbt.getFloat("heat"); - maxHeat = nbt.getFloat("maxHeat"); - - progress = nbt.getInteger("progress"); - aboveType = nbt.getInteger("Level"); - } - - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setInteger("Shared", justShared); - nbt.setInteger("Level", aboveType); - nbt.setBoolean("Built", built); - - nbt.setInteger("fuel", fuel); - nbt.setInteger("maxFuel", maxFuel); - - nbt.setFloat("heat", heat); - nbt.setFloat("maxHeat", maxHeat); - - nbt.setInteger("progress", progress); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inv.length; ++i) { - if (this.inv[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - } - - public int getInventoryStackLimit() { - return 64; - } - - public boolean isBurning() { - if (worldObj == null) { - return false; - } - if (worldObj.isRemote) { - return isBurningClient; - } - if (isHeater()) { - return heat > 0; - } - return progress > 0 && heat > 0; - } - - public boolean isHeater() { - Block block = worldObj != null ? getBlockType() : blockType; - - if (block != null && block instanceof BlockBigFurnace) { - return ((BlockBigFurnace) block).isHeater; - } - return false; - } - - public int getTier() { - Block block = worldObj != null ? getBlockType() : blockType; - - if (block != null && block instanceof BlockBigFurnace) { - return ((BlockBigFurnace) block).tier; - } - return 0; - } - - public int getItemBurnTime(ItemStack itemstack) { - if (itemstack == null) { - return 0; - } - return (int) Math.ceil(ForgeItemHandler.getForgeFuel(itemstack) / 8); - } - - public boolean isUseableByPlayer(EntityPlayer entityplayer) { - if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { - return false; - } - return entityplayer.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64D; - } - - public void openChest() { - if (numUsers == 0) { - this.worldObj.playSoundEffect(xCoord + 0.5D, this.yCoord + 0.5D, zCoord + 0.5D, - "minefantasy2:block.furnace_open", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); - } - ++numUsers; - } - - public void closeChest() { - --numUsers; - if (numUsers == 0 && doorAngle >= 15) { - this.worldObj.playSoundEffect(xCoord + 0.5D, this.yCoord + 0.5D, zCoord + 0.5D, - "minefantasy2:block.furnace_close", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int var1) { - return null; - } - - private void sendPacketToClients() { - if (!worldObj.isRemote) { - NetworkUtils.sendToWatchers(new BigFurnacePacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + } + + public int getSizeInventory() { + return inv.length; + } + + public ItemStack getStackInSlot(int i) { + return inv[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (inv[i] != null) { + if (inv[i].stackSize <= j) { + ItemStack itemstack = inv[i]; + inv[i] = null; + return itemstack; + } + ItemStack itemstack1 = inv[i].splitStack(j); + if (inv[i].stackSize == 0) { + inv[i] = null; + } + return itemstack1; + } else { + return null; + } + } + + @SideOnly(Side.CLIENT) + public int getBurnTimeRemainingScaled(int height) { + if (this.maxFuel == 0) { + this.maxFuel = 200; + } + + return this.fuel * height / this.maxFuel; + } + + @SideOnly(Side.CLIENT) + public int getHeatScaled(int height) { + if (heat <= 0) + return 0; + int size = (int) (height / TileEntityForge.maxTemperature * this.heat); + + return Math.min(size, height); + } + + @SideOnly(Side.CLIENT) + public int getItemHeatScaled(int height) { + if (maxHeat <= 0) + return 0; + int size = (int) (height / TileEntityForge.maxTemperature * this.maxHeat); + + return Math.min(size, height); + } + + public void setInventorySlotContents(int i, ItemStack itemstack) { + inv[i] = itemstack; + if (itemstack != null && itemstack.stackSize > getInventoryStackLimit()) { + itemstack.stackSize = getInventoryStackLimit(); + } + } + + public String getInvName() { + int t = getType(); + String tier = ""; + + if (isHeater()) { + return StatCollector.translateToLocal("tile.furnace.name") + " " + + StatCollector.translateToLocal("block.furnace.heater"); + } + + return tier + " " + StatCollector.translateToLocal("tile.furnace.name"); + } + + public int getSmeltLevel() { + if (isHeater()) { + return -1; + } + return getType() - 1; + } + + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + + justShared = nbt.getInteger("Shared"); + built = nbt.getBoolean("Built"); + + fuel = nbt.getInteger("fuel"); + maxFuel = nbt.getInteger("MaxFuel"); + + heat = nbt.getFloat("heat"); + maxHeat = nbt.getFloat("maxHeat"); + + progress = nbt.getInteger("progress"); + aboveType = nbt.getInteger("Level"); + } + + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setInteger("Shared", justShared); + nbt.setInteger("Level", aboveType); + nbt.setBoolean("Built", built); + + nbt.setInteger("fuel", fuel); + nbt.setInteger("maxFuel", maxFuel); + + nbt.setFloat("heat", heat); + nbt.setFloat("maxHeat", maxHeat); + + nbt.setInteger("progress", progress); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isBurning() { + if (worldObj == null) { + return false; + } + if (worldObj.isRemote) { + return isBurningClient; + } + if (isHeater()) { + return heat > 0; + } + return progress > 0 && heat > 0; + } + + public boolean isHeater() { + Block block = worldObj != null ? getBlockType() : blockType; + + if (block != null && block instanceof BlockBigFurnace) { + return ((BlockBigFurnace) block).isHeater; + } + return false; + } + + public int getTier() { + Block block = worldObj != null ? getBlockType() : blockType; + + if (block != null && block instanceof BlockBigFurnace) { + return ((BlockBigFurnace) block).tier; + } + return 0; + } + + public int getItemBurnTime(ItemStack itemstack) { + if (itemstack == null) { + return 0; + } + return (int) Math.ceil(ForgeItemHandler.getForgeFuel(itemstack) / 8); + } + + public boolean isUseableByPlayer(EntityPlayer entityplayer) { + if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { + return false; + } + return entityplayer.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64D; + } + + public void openChest() { + if (numUsers == 0) { + this.worldObj.playSoundEffect(xCoord + 0.5D, this.yCoord + 0.5D, zCoord + 0.5D, + "minefantasy2:block.furnace_open", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + } + ++numUsers; + } + + public void closeChest() { + --numUsers; + if (numUsers == 0 && doorAngle >= 15) { + this.worldObj.playSoundEffect(xCoord + 0.5D, this.yCoord + 0.5D, zCoord + 0.5D, + "minefantasy2:block.furnace_close", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int var1) { + return null; + } + + private void sendPacketToClients() { + if (!worldObj.isRemote) { + NetworkUtils.sendToWatchers(new BigFurnacePacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { @@ -626,8 +621,8 @@ private void sendPacketToClients() { new BigFurnacePacket(this).generatePacket()); } */ - } - } + } + } /* * @Override public void recievePacket(ByteArrayDataInput data) { fuel = @@ -636,293 +631,293 @@ private void sendPacketToClients() { * justShared = data.readInt(); doorAngle = data.readInt(); } */ - public int getBlockMetadata() { - if (worldObj == null) - return itemMeta * 2; - - if (this.blockMetadata == -1) { - this.blockMetadata = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); - } - - return this.blockMetadata; - } - - /** - * Heater:0||Stone :1; - */ - public int getType() { - return isHeater() ? 0 : 1; - } - - private int getOnMetadata() { - return getType() * 2 + 1; - } - - private int getOffMetadata() { - return getType() * 2; - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) { - if (isHeater()) { - return new int[] { 0 }; - } - return new int[] { 0, 1, 2, 3, 4, 5, 6, 7 }; - } - - @Override - public boolean canInsertItem(int slot, ItemStack item, int side) { - if (isHeater()) { - return slot == 0 && isItemFuel(item); - } - return slot < 4 && getResult(item) != null; - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - return canInsertItem(slot, item, 0); - } - - public boolean isItemFuel(ItemStack item) { - return this.getItemBurnTime(item) > 0; - } - - @Override - public boolean canExtractItem(int slot, ItemStack item, int side) { - if (!isHeater()) { - return slot >= 4; - } - return item.getItem() == Items.bucket; - } - - public int getCookProgressScaled(int i) { - return (progress * i) / getMaxTime(); - } - - public boolean isBlockValidForSide(int x, int y, int z) { - if (worldObj == null) { - return false; - } - - Block block = worldObj.getBlock(x, y, z); - - if (block == null) { - return false; - } - - if (block == worldObj.getBlock(xCoord, yCoord, zCoord)) { - return true; - } - return block == BlockListMF.firebricks; - } - - /** - * Checks a valid block for sides. It must be the required block. - * - * HEATER: Requires any stone block for bronze, stone above hardness 2.0(like - * slate)for iron, and stone above hardness above 5.0(like granite) for steel - * - * FURNACES require metal blocks of their material - */ - public boolean isBlockValidForTop(int x, int y, int z) { - if (worldObj == null) { - return false; - } - Block block = worldObj.getBlock(x, y, z); - - if (block == null) { - return false; - } - return block == BlockListMF.firebricks; - } - - public boolean isBlockValidForSide(ForgeDirection side) { - if (worldObj == null) { - return false; - } - - int x = xCoord + side.offsetX; - int y = yCoord + side.offsetY; - int z = zCoord + side.offsetZ; - - return isBlockValidForSide(x, y, z); - } - - public boolean isSolid(ForgeDirection side) { - if (worldObj == null) { - return false; - } - - int x = xCoord + side.offsetX; - int y = yCoord + side.offsetY; - int z = zCoord + side.offsetZ; - - Material mat = worldObj.getBlock(x, y, z).getMaterial(); - - return mat.isSolid(); - } - - /** - * Determines if the furnace is built properly HEATER must have sides blocked by - * stone FURNACES must have walls built to specifications - */ - private boolean structureExists() { - if (worldObj == null) { - return false; - } - - if (isSolid(getFront())) { - return false; - } - - if (!isHeater() && !isBlockValidForTop(xCoord, yCoord + 1, zCoord)) { - return false; - } - - if (!isBlockValidForSide(getLeft())) { - return false; - } - if (!isBlockValidForSide(getRight())) { - return false; - } - if (!isBlockValidForSide(getBack())) { - return false; - } - - return true; - } - - /** - * Gets the direction the face is at(Opposite to the placer) - */ - public ForgeDirection getFront() { - int direction = getDirection(); - if (direction == 0)// SOUTH PLACE - { - return ForgeDirection.NORTH; - } - if (direction == 1)// WEST PLACE - { - return ForgeDirection.EAST; - } - if (direction == 2)// NORTH PLACE - { - return ForgeDirection.SOUTH; - } - if (direction == 3)// EAST PLACE - { - return ForgeDirection.WEST; - } - return ForgeDirection.UNKNOWN; - } - - /** - * Gets the direction the back is facing (Same dir as placer) - */ - public ForgeDirection getBack() { - int direction = getDirection(); - if (direction == 0)// SOUTH PLACE - { - return ForgeDirection.SOUTH; - } - if (direction == 1)// WEST PLACE - { - return ForgeDirection.WEST; - } - if (direction == 2)// NORTH PLACE - { - return ForgeDirection.NORTH; - } - if (direction == 3)// EAST PLACE - { - return ForgeDirection.EAST; - } - return ForgeDirection.UNKNOWN; - } - - /** - * Gets the direction the left is facing - */ - public ForgeDirection getLeft() { - int direction = getDirection(); - if (direction == 0)// SOUTH PLACE - { - return ForgeDirection.WEST; - } - if (direction == 1)// WEST PLACE - { - return ForgeDirection.NORTH; - } - if (direction == 2)// NORTH PLACE - { - return ForgeDirection.EAST; - } - if (direction == 3)// EAST PLACE - { - return ForgeDirection.SOUTH; - } - return ForgeDirection.UNKNOWN; - } - - /** - * Gets the direction the right is facing - */ - public ForgeDirection getRight() { - int direction = getDirection(); - if (direction == 0)// SOUTH PLACE - { - return ForgeDirection.EAST; - } - if (direction == 1)// WEST PLACE - { - return ForgeDirection.SOUTH; - } - if (direction == 2)// NORTH PLACE - { - return ForgeDirection.WEST; - } - if (direction == 3)// EAST PLACE - { - return ForgeDirection.NORTH; - } - return ForgeDirection.UNKNOWN; - } - - private int getDirection() { - if (worldObj != null) { - return worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - } - return 0; - } - - public String getTexture() { - if (isHeater()) { - return "furnace_heater"; - } - return "furnace_rock"; - } - - @Override - public String getInventoryName() { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean hasCustomInventoryName() { - // TODO Auto-generated method stub - return false; - } - - @Override - public void openInventory() { - // TODO Auto-generated method stub - - } - - @Override - public void closeInventory() { - // TODO Auto-generated method stub - - } + public int getBlockMetadata() { + if (worldObj == null) + return itemMeta * 2; + + if (this.blockMetadata == -1) { + this.blockMetadata = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); + } + + return this.blockMetadata; + } + + /** + * Heater:0||Stone :1; + */ + public int getType() { + return isHeater() ? 0 : 1; + } + + private int getOnMetadata() { + return getType() * 2 + 1; + } + + private int getOffMetadata() { + return getType() * 2; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + if (isHeater()) { + return new int[]{0}; + } + return new int[]{0, 1, 2, 3, 4, 5, 6, 7}; + } + + @Override + public boolean canInsertItem(int slot, ItemStack item, int side) { + if (isHeater()) { + return slot == 0 && isItemFuel(item); + } + return slot < 4 && getResult(item) != null; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + return canInsertItem(slot, item, 0); + } + + public boolean isItemFuel(ItemStack item) { + return this.getItemBurnTime(item) > 0; + } + + @Override + public boolean canExtractItem(int slot, ItemStack item, int side) { + if (!isHeater()) { + return slot >= 4; + } + return item.getItem() == Items.bucket; + } + + public int getCookProgressScaled(int i) { + return (progress * i) / getMaxTime(); + } + + public boolean isBlockValidForSide(int x, int y, int z) { + if (worldObj == null) { + return false; + } + + Block block = worldObj.getBlock(x, y, z); + + if (block == null) { + return false; + } + + if (block == worldObj.getBlock(xCoord, yCoord, zCoord)) { + return true; + } + return block == BlockListMF.firebricks; + } + + /** + * Checks a valid block for sides. It must be the required block. + *

+ * HEATER: Requires any stone block for bronze, stone above hardness 2.0(like + * slate)for iron, and stone above hardness above 5.0(like granite) for steel + *

+ * FURNACES require metal blocks of their material + */ + public boolean isBlockValidForTop(int x, int y, int z) { + if (worldObj == null) { + return false; + } + Block block = worldObj.getBlock(x, y, z); + + if (block == null) { + return false; + } + return block == BlockListMF.firebricks; + } + + public boolean isBlockValidForSide(ForgeDirection side) { + if (worldObj == null) { + return false; + } + + int x = xCoord + side.offsetX; + int y = yCoord + side.offsetY; + int z = zCoord + side.offsetZ; + + return isBlockValidForSide(x, y, z); + } + + public boolean isSolid(ForgeDirection side) { + if (worldObj == null) { + return false; + } + + int x = xCoord + side.offsetX; + int y = yCoord + side.offsetY; + int z = zCoord + side.offsetZ; + + Material mat = worldObj.getBlock(x, y, z).getMaterial(); + + return mat.isSolid(); + } + + /** + * Determines if the furnace is built properly HEATER must have sides blocked by + * stone FURNACES must have walls built to specifications + */ + private boolean structureExists() { + if (worldObj == null) { + return false; + } + + if (isSolid(getFront())) { + return false; + } + + if (!isHeater() && !isBlockValidForTop(xCoord, yCoord + 1, zCoord)) { + return false; + } + + if (!isBlockValidForSide(getLeft())) { + return false; + } + if (!isBlockValidForSide(getRight())) { + return false; + } + if (!isBlockValidForSide(getBack())) { + return false; + } + + return true; + } + + /** + * Gets the direction the face is at(Opposite to the placer) + */ + public ForgeDirection getFront() { + int direction = getDirection(); + if (direction == 0)// SOUTH PLACE + { + return ForgeDirection.NORTH; + } + if (direction == 1)// WEST PLACE + { + return ForgeDirection.EAST; + } + if (direction == 2)// NORTH PLACE + { + return ForgeDirection.SOUTH; + } + if (direction == 3)// EAST PLACE + { + return ForgeDirection.WEST; + } + return ForgeDirection.UNKNOWN; + } + + /** + * Gets the direction the back is facing (Same dir as placer) + */ + public ForgeDirection getBack() { + int direction = getDirection(); + if (direction == 0)// SOUTH PLACE + { + return ForgeDirection.SOUTH; + } + if (direction == 1)// WEST PLACE + { + return ForgeDirection.WEST; + } + if (direction == 2)// NORTH PLACE + { + return ForgeDirection.NORTH; + } + if (direction == 3)// EAST PLACE + { + return ForgeDirection.EAST; + } + return ForgeDirection.UNKNOWN; + } + + /** + * Gets the direction the left is facing + */ + public ForgeDirection getLeft() { + int direction = getDirection(); + if (direction == 0)// SOUTH PLACE + { + return ForgeDirection.WEST; + } + if (direction == 1)// WEST PLACE + { + return ForgeDirection.NORTH; + } + if (direction == 2)// NORTH PLACE + { + return ForgeDirection.EAST; + } + if (direction == 3)// EAST PLACE + { + return ForgeDirection.SOUTH; + } + return ForgeDirection.UNKNOWN; + } + + /** + * Gets the direction the right is facing + */ + public ForgeDirection getRight() { + int direction = getDirection(); + if (direction == 0)// SOUTH PLACE + { + return ForgeDirection.EAST; + } + if (direction == 1)// WEST PLACE + { + return ForgeDirection.SOUTH; + } + if (direction == 2)// NORTH PLACE + { + return ForgeDirection.WEST; + } + if (direction == 3)// EAST PLACE + { + return ForgeDirection.NORTH; + } + return ForgeDirection.UNKNOWN; + } + + private int getDirection() { + if (worldObj != null) { + return worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + } + return 0; + } + + public String getTexture() { + if (isHeater()) { + return "furnace_heater"; + } + return "furnace_rock"; + } + + @Override + public String getInventoryName() { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean hasCustomInventoryName() { + // TODO Auto-generated method stub + return false; + } + + @Override + public void openInventory() { + // TODO Auto-generated method stub + + } + + @Override + public void closeInventory() { + // TODO Auto-generated method stub + + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java index 43c933d1..fbc83d53 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java @@ -12,9 +12,9 @@ import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; import minefantasy.mf2.item.heatable.ItemHeated; import minefantasy.mf2.knowledge.KnowledgeListMF; +import minefantasy.mf2.network.NetworkUtils; import minefantasy.mf2.network.packet.BloomeryPacket; import minefantasy.mf2.util.MFLogUtil; -import minefantasy.mf2.network.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -29,69 +29,77 @@ import java.util.Random; public class TileEntityBloomery extends TileEntity implements IInventory { - private ItemStack[] inv = new ItemStack[3]; - public float progress, progressMax; - public boolean hasBloom, isActive; - - public ItemStack getResult() { - ItemStack input = inv[0]; - ItemStack coal = inv[1]; - - if (hasBloom()) - return null;// Cannot smelt if a bloom exists - if (input == null || coal == null) - return null;// Needs input - - if (!hasEnoughCarbon(input, coal)) { - return null; - } - - return getResult(input); - } - - private boolean hasEnoughCarbon(ItemStack input, ItemStack coal) { - int amount = input.stackSize; - int uses = MineFantasyFuels.getCarbon(coal); - if (uses > 0) { - int coalNeeded = (int) Math.ceil((float) amount / (float) uses); - MFLogUtil.logDebug("Required Coal: " + coalNeeded); - return coal.stackSize == coalNeeded; - } - return false; - } - - private Random rand = new Random(); - - @Override - public void updateEntity() { - ++ticksExisted; - if (isActive && progressMax > 0) { - if (!worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord)) { - progressMax = progress = 0; - isActive = false; - return; - } - if (!worldObj.isRemote) { - ++progress; - if (progress >= progressMax) { - smeltItem(); - } - if (rand.nextInt(4) == 0) { - SmokeMechanics.spawnSmoke(worldObj, xCoord, yCoord, zCoord, 1); - } - } - } - if (!worldObj.isRemote && ticksExisted % 20 == 0) { - syncData(); - } - } - - public void syncData() { - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new BloomeryPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); - /* + public float progress, progressMax; + public boolean hasBloom, isActive; + private ItemStack[] inv = new ItemStack[3]; + private Random rand = new Random(); + private int ticksExisted; + + public static boolean isInput(ItemStack input) { + return getResult(input) != null; + } + + private static ItemStack getResult(ItemStack input) { + return BloomRecipe.getSmeltingResult(input); + } + + public ItemStack getResult() { + ItemStack input = inv[0]; + ItemStack coal = inv[1]; + + if (hasBloom()) + return null;// Cannot smelt if a bloom exists + if (input == null || coal == null) + return null;// Needs input + + if (!hasEnoughCarbon(input, coal)) { + return null; + } + + return getResult(input); + } + + private boolean hasEnoughCarbon(ItemStack input, ItemStack coal) { + int amount = input.stackSize; + int uses = MineFantasyFuels.getCarbon(coal); + if (uses > 0) { + int coalNeeded = (int) Math.ceil((float) amount / (float) uses); + MFLogUtil.logDebug("Required Coal: " + coalNeeded); + return coal.stackSize == coalNeeded; + } + return false; + } + + @Override + public void updateEntity() { + ++ticksExisted; + if (isActive && progressMax > 0) { + if (!worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord)) { + progressMax = progress = 0; + isActive = false; + return; + } + if (!worldObj.isRemote) { + ++progress; + if (progress >= progressMax) { + smeltItem(); + } + if (rand.nextInt(4) == 0) { + SmokeMechanics.spawnSmoke(worldObj, xCoord, yCoord, zCoord, 1); + } + } + } + if (!worldObj.isRemote && ticksExisted % 20 == 0) { + syncData(); + } + } + + public void syncData() { + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new BloomeryPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + /* List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); @@ -99,251 +107,241 @@ public void syncData() { new BloomeryPacket(this).generatePacket()); } */ - } - - private int ticksExisted; - - /** - * Light the bloomery, starting the process. - * - * @return true if it can smelt - */ - public boolean light(EntityPlayer user) { - ItemStack res = getResult(); - if (worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord) && res != null && !isActive) { - if (!worldObj.isRemote) { - if (res.getItem() == Items.iron_ingot - && !ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.smeltIron)) { - return false; - } - isActive = true; - progressMax = inv[0].stackSize * getTime(inv[0]);// 15s per item - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "fire.ignite", 1.0F, 1.0F); - } - - return true; - } - return false; - } - - private int getTime(ItemStack itemStack) { - return 300; - } - - /** - * Consumes ALL input and sets output - */ - public void smeltItem() { - ItemStack result = getResult(); - if (result != null) { - ItemStack res2 = result.copy(); - res2.stackSize = inv[0].stackSize; - inv[0] = inv[1] = null; - inv[2] = res2; - } - isActive = false; - progress = progressMax = 0; - } - - public boolean tryHammer(EntityPlayer user) { - if (worldObj.getBlock(xCoord, yCoord + 1, zCoord).getMaterial().isSolid()) { - return false; - } - ItemStack held = user.getHeldItem(); - if (!hasBloom() || isActive) { - return false; - } - String toolType = ToolHelper.getCrafterTool(held); - float pwr = ToolHelper.getCrafterEfficiency(held); - if (toolType.equalsIgnoreCase("hammer") || toolType.equalsIgnoreCase("hvyHammer")) { - if (user.worldObj.isRemote) - return true; - - held.damageItem(1, user); - if (held.getItemDamage() >= held.getMaxDamage()) { - user.destroyCurrentEquippedItem(); - user.setCurrentItemOrArmor(0, null); - } - - if (rand.nextFloat() * 10F < pwr) { - ItemStack drop = inv[2].copy(); - --inv[2].stackSize; - if (inv[2].stackSize <= 0) { - inv[2] = null; - } - if (RPGElements.isSystemActive && RPGElements.getLevel(user, SkillList.artisanry) <= 20)// Only gain xp - // up to level - // 20 - { - SkillList.artisanry.addXP(user, 1); - } - drop.stackSize = 1; - drop = ItemHeated.createHotItem(drop, 1200); - entityDropItem(worldObj, xCoord, yCoord, zCoord, drop); - syncData(); - } - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilsucceed", - 0.25F, 1.0F); - - return true; - } - return false; - } - - public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) { - if (item.stackSize != 0 && item.getItem() != null) { - EntityItem entityitem = new EntityItem(world, x + 0.5D, y + 1.25F, z + 0.5D, item); - entityitem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(entityitem); - entityitem.motionX = entityitem.motionY = entityitem.motionZ = 0; - return entityitem; - } else { - return null; - } - } - - public boolean hasBloom() { - if (worldObj.isRemote) { - return hasBloom; - } - return inv[2] != null; - } - - @Override - public int getSizeInventory() { - return inv.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return inv[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - if (this.inv[slot] != null) { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } else { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) { - this.inv[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return inv[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - inv[slot] = item; - } - - @Override - public String getInventoryName() { - return "gui.carpentermf.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - if (item != null && TileEntityBlastFC.isCarbon(item)) { - return slot == 1; - } - if (item != null && getResult(item) != null) { - return slot == 0; - } - return false; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - progress = nbt.getFloat("Progress"); - progressMax = nbt.getFloat("ProgressMax"); - hasBloom = nbt.getBoolean("hasBloom"); - isActive = nbt.getBoolean("isActive"); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inv.length; ++i) { - if (this.inv[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - - nbt.setFloat("Progress", progress); - nbt.setFloat("ProgressMax", progressMax); - nbt.setBoolean("hasBloom", hasBloom); - nbt.setBoolean("isActive", isActive); - } - - public static boolean isInput(ItemStack input) { - return getResult(input) != null; - } - - private static ItemStack getResult(ItemStack input) { - return BloomRecipe.getSmeltingResult(input); - } - - @SideOnly(Side.CLIENT) - public String getTextureName() { - return "bloomery_basic"; - } + } + + /** + * Light the bloomery, starting the process. + * + * @return true if it can smelt + */ + public boolean light(EntityPlayer user) { + ItemStack res = getResult(); + if (worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord) && res != null && !isActive) { + if (!worldObj.isRemote) { + if (res.getItem() == Items.iron_ingot + && !ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.smeltIron)) { + return false; + } + isActive = true; + progressMax = inv[0].stackSize * getTime(inv[0]);// 15s per item + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "fire.ignite", 1.0F, 1.0F); + } + + return true; + } + return false; + } + + private int getTime(ItemStack itemStack) { + return 300; + } + + /** + * Consumes ALL input and sets output + */ + public void smeltItem() { + ItemStack result = getResult(); + if (result != null) { + ItemStack res2 = result.copy(); + res2.stackSize = inv[0].stackSize; + inv[0] = inv[1] = null; + inv[2] = res2; + } + isActive = false; + progress = progressMax = 0; + } + + public boolean tryHammer(EntityPlayer user) { + if (worldObj.getBlock(xCoord, yCoord + 1, zCoord).getMaterial().isSolid()) { + return false; + } + ItemStack held = user.getHeldItem(); + if (!hasBloom() || isActive) { + return false; + } + String toolType = ToolHelper.getCrafterTool(held); + float pwr = ToolHelper.getCrafterEfficiency(held); + if (toolType.equalsIgnoreCase("hammer") || toolType.equalsIgnoreCase("hvyHammer")) { + if (user.worldObj.isRemote) + return true; + + held.damageItem(1, user); + if (held.getItemDamage() >= held.getMaxDamage()) { + user.destroyCurrentEquippedItem(); + user.setCurrentItemOrArmor(0, null); + } + + if (rand.nextFloat() * 10F < pwr) { + ItemStack drop = inv[2].copy(); + --inv[2].stackSize; + if (inv[2].stackSize <= 0) { + inv[2] = null; + } + if (RPGElements.isSystemActive && RPGElements.getLevel(user, SkillList.artisanry) <= 20)// Only gain xp + // up to level + // 20 + { + SkillList.artisanry.addXP(user, 1); + } + drop.stackSize = 1; + drop = ItemHeated.createHotItem(drop, 1200); + entityDropItem(worldObj, xCoord, yCoord, zCoord, drop); + syncData(); + } + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "minefantasy2:block.anvilsucceed", + 0.25F, 1.0F); + + return true; + } + return false; + } + + public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) { + if (item.stackSize != 0 && item.getItem() != null) { + EntityItem entityitem = new EntityItem(world, x + 0.5D, y + 1.25F, z + 0.5D, item); + entityitem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(entityitem); + entityitem.motionX = entityitem.motionY = entityitem.motionZ = 0; + return entityitem; + } else { + return null; + } + } + + public boolean hasBloom() { + if (worldObj.isRemote) { + return hasBloom; + } + return inv[2] != null; + } + + @Override + public int getSizeInventory() { + return inv.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return inv[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + inv[slot] = item; + } + + @Override + public String getInventoryName() { + return "gui.carpentermf.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (item != null && TileEntityBlastFC.isCarbon(item)) { + return slot == 1; + } + if (item != null && getResult(item) != null) { + return slot == 0; + } + return false; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + progress = nbt.getFloat("Progress"); + progressMax = nbt.getFloat("ProgressMax"); + hasBloom = nbt.getBoolean("hasBloom"); + isActive = nbt.getBoolean("isActive"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + + nbt.setFloat("Progress", progress); + nbt.setFloat("ProgressMax", progressMax); + nbt.setBoolean("hasBloom", hasBloom); + nbt.setBoolean("isActive", isActive); + } + + @SideOnly(Side.CLIENT) + public String getTextureName() { + return "bloomery_basic"; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java index c6274939..0bbf4f9d 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombBench.java @@ -9,8 +9,8 @@ import minefantasy.mf2.item.gadget.ItemExplodingArrow; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.knowledge.KnowledgeListMF; -import minefantasy.mf2.network.packet.BombBenchPacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.BombBenchPacket; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -27,410 +27,408 @@ import java.util.Random; public class TileEntityBombBench extends TileEntity implements IInventory, ISidedInventory, IBasicMetre { - private ItemStack[] inv = new ItemStack[6]; - private Random rand = new Random(); - public float progress; - public float maxProgress = 25F; - - public boolean hasRecipe; - - private int ticksExisted; - - @Override - public void updateEntity() { - ++ticksExisted; - if (!worldObj.isRemote && (hasRecipe || ticksExisted % 100 == 0)) { - syncData(); - } - } - - public boolean tryCraft(EntityPlayer user, boolean pressUsed) { - boolean sticky = !pressUsed && ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.stickybomb) - && user.getHeldItem() != null && user.getHeldItem().getItem() == Items.slime_ball; - if (!worldObj.isRemote && sticky && applySlime()) { - user.inventory.consumeInventoryItem(Items.slime_ball); - return true; - } - ItemStack result = findResult(); - hasRecipe = result != null; - - if (result == null) { - progress = 0F; - } else if ((pressUsed || ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("spanner"))) { - if (!pressUsed && user.getHeldItem() != null) { - worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "minefantasy2:block.twistbolt", 0.25F, - 1.0F); - user.getHeldItem().damageItem(1, user); - if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { - user.destroyCurrentEquippedItem(); - } - } - float efficiency = pressUsed ? maxProgress : ToolHelper.getCrafterEfficiency(user.getHeldItem()); - - if (!pressUsed && user.swingProgress > 0 && user.swingProgress <= 1.0) { - efficiency *= (0.5F - user.swingProgress); - } - - if (!worldObj.isRemote) { - progress += efficiency; - } - if ((progress >= maxProgress && craftItem(result))) { - worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "random.door_open", 0.35F, 0.5F); - progress = 0; - if (user != null) { - SkillList.engineering.addXP(user, 2); - } - boolean isArrow = isMatch(0, "arrow") || isMatch(0, "bolt"); - for (int a = 0; a < 4; a++) { - if (!(isArrow && a == 3)) { - ItemStack item = getStackInSlot(a); - if (item != null && item.getItem().getContainerItem(item) != null) { - // START CONTAINER CODE - ItemStack cont = item.getItem().getContainerItem(item); - ItemStack spare = getStackInSlot(5); - if (spare == null) { - setInventorySlotContents(5, cont); - cont = null; - } else if (spare.isItemEqual(cont)) { - if (spare.stackSize + cont.stackSize <= spare.getMaxStackSize()) { - spare.stackSize += cont.stackSize; - cont = null; - } else { - int room_left = spare.getMaxStackSize() - spare.stackSize; - spare.stackSize += room_left; - cont.stackSize -= room_left; - } - } - if (cont != null && !worldObj.isRemote) { - EntityItem ei = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, - cont); - worldObj.spawnEntityInWorld(ei); - } - } - // END CONTAINER CODE - decrStackSize(a, 1); - } - } - } - return true; - } - return false; - } - - private boolean applySlime() { - ItemStack res = getStackInSlot(4); - - if (res != null && res.getItem() instanceof ItemBomb) { - if (res.hasTagCompound() && !res.getTagCompound().hasKey("stickyBomb")) { - res.getTagCompound().setBoolean("stickyBomb", true); - return true; - } - } - return false; - } - - private boolean craftItem(ItemStack result) { - if (inv[4] == null) { - this.setInventorySlotContents(4, result); - return true; - } else { - if (areItemsEqual(result, inv[4]) && (inv[4].stackSize + result.stackSize) <= inv[4].getMaxStackSize()) { - inv[4].stackSize++; - return true; - } else { - return false; - } - } - } - - public void syncData() { - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new BombBenchPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + public float progress; + public float maxProgress = 25F; + public boolean hasRecipe; + private ItemStack[] inv = new ItemStack[6]; + private Random rand = new Random(); + private int ticksExisted; + + public static boolean isMatch(ItemStack item, String type) { + String component = getComponentType(item); + return component != null && component.equalsIgnoreCase(type); + } + + public static String getComponentType(ItemStack item) { + if (item != null && item.getItem() != null && item.getItem() instanceof IBombComponent) { + return ((IBombComponent) item.getItem()).getComponentType(); + } + return null; + } + + public static byte getComponentTier(ItemStack item) { + if (item != null && item.getItem() != null && item.getItem() instanceof IBombComponent) { + return ((IBombComponent) item.getItem()).getTier(); + } + return (byte) 0; + } + + @Override + public void updateEntity() { + ++ticksExisted; + if (!worldObj.isRemote && (hasRecipe || ticksExisted % 100 == 0)) { + syncData(); + } + } + + public boolean tryCraft(EntityPlayer user, boolean pressUsed) { + boolean sticky = !pressUsed && ResearchLogic.hasInfoUnlocked(user, KnowledgeListMF.stickybomb) + && user.getHeldItem() != null && user.getHeldItem().getItem() == Items.slime_ball; + if (!worldObj.isRemote && sticky && applySlime()) { + user.inventory.consumeInventoryItem(Items.slime_ball); + return true; + } + ItemStack result = findResult(); + hasRecipe = result != null; + + if (result == null) { + progress = 0F; + } else if ((pressUsed || ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("spanner"))) { + if (!pressUsed && user.getHeldItem() != null) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "minefantasy2:block.twistbolt", 0.25F, + 1.0F); + user.getHeldItem().damageItem(1, user); + if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { + user.destroyCurrentEquippedItem(); + } + } + float efficiency = pressUsed ? maxProgress : ToolHelper.getCrafterEfficiency(user.getHeldItem()); + + if (!pressUsed && user.swingProgress > 0 && user.swingProgress <= 1.0) { + efficiency *= (0.5F - user.swingProgress); + } + + if (!worldObj.isRemote) { + progress += efficiency; + } + if ((progress >= maxProgress && craftItem(result))) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "random.door_open", 0.35F, 0.5F); + progress = 0; + if (user != null) { + SkillList.engineering.addXP(user, 2); + } + boolean isArrow = isMatch(0, "arrow") || isMatch(0, "bolt"); + for (int a = 0; a < 4; a++) { + if (!(isArrow && a == 3)) { + ItemStack item = getStackInSlot(a); + if (item != null && item.getItem().getContainerItem(item) != null) { + // START CONTAINER CODE + ItemStack cont = item.getItem().getContainerItem(item); + ItemStack spare = getStackInSlot(5); + if (spare == null) { + setInventorySlotContents(5, cont); + cont = null; + } else if (spare.isItemEqual(cont)) { + if (spare.stackSize + cont.stackSize <= spare.getMaxStackSize()) { + spare.stackSize += cont.stackSize; + cont = null; + } else { + int room_left = spare.getMaxStackSize() - spare.stackSize; + spare.stackSize += room_left; + cont.stackSize -= room_left; + } + } + if (cont != null && !worldObj.isRemote) { + EntityItem ei = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, + cont); + worldObj.spawnEntityInWorld(ei); + } + } + // END CONTAINER CODE + decrStackSize(a, 1); + } + } + } + return true; + } + return false; + } + + private boolean applySlime() { + ItemStack res = getStackInSlot(4); + + if (res != null && res.getItem() instanceof ItemBomb) { + if (res.hasTagCompound() && !res.getTagCompound().hasKey("stickyBomb")) { + res.getTagCompound().setBoolean("stickyBomb", true); + return true; + } + } + return false; + } + + private boolean craftItem(ItemStack result) { + if (inv[4] == null) { + this.setInventorySlotContents(4, result); + return true; + } else { + if (areItemsEqual(result, inv[4]) && (inv[4].stackSize + result.stackSize) <= inv[4].getMaxStackSize()) { + inv[4].stackSize++; + return true; + } else { + return false; + } + } + } + + public void syncData() { + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new BombBenchPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); /* - List players = ((WorldServer) worldObj).playerEntities; + List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new BombBenchPacket(this).generatePacket()); } */ - } - - private boolean areItemsEqual(ItemStack bomb1, ItemStack bomb2) { - if (ItemBomb.getCasing(bomb1) != ItemBomb.getCasing(bomb2)) { - return false; - } - if (ItemBomb.getPowder(bomb1) != ItemBomb.getPowder(bomb2)) { - return false; - } - if (ItemBomb.getFilling(bomb1) != ItemBomb.getFilling(bomb2)) { - return false; - } - if (ItemBomb.getFuse(bomb1) != ItemBomb.getFuse(bomb2)) { - return false; - } - return bomb1.isItemEqual(bomb2); - } - - public void onInventoryChanged() { - } - - private ItemStack findResult() { - boolean isArrow = isMatch(0, "arrow") || isMatch(0, "bolt"); - if (!isMatch(1, "powder") || (!isArrow && !isMatch(3, "fuse"))) { - return null; - } - byte caseTier = -1; - byte filling = 0; - byte fuse = -1; - byte powder = -1; - Item design = null; - String com0 = getComponentType(inv[0]); - String com1 = getComponentType(inv[1]); - String com2 = getComponentType(inv[2]); - String com3 = getComponentType(inv[3]); - if (com0 != null) { - caseTier = getComponentTier(inv[0]); - String type = com0; - design = getDesignCrafted(type); - } - if (com1 != null) { - if (com1.equalsIgnoreCase("powder")) { - powder = getComponentTier(inv[1]); - } else { - return null; - } - } else - return null; - if (com2 != null) { - if (com2.equalsIgnoreCase("filling")) { - filling = getComponentTier(inv[2]); - } else { - return null; - } - } - if (isArrow || com3 != null) { - if (!isArrow) { - if (com3.equalsIgnoreCase("fuse")) { - fuse = getComponentTier(inv[3]); - } else { - return null; - } - } - } else - return null; - - if (design != null && isArrow && powder > -1) { - return ItemExplodingArrow.createBombArrow(design, powder, filling); - } else if (design != null && fuse > -1 && powder > -1) { - return ItemBomb.createExplosive(design, caseTier, filling, fuse, powder, 1, false); - } - return null; - } - - private Item getDesignCrafted(String type) { - if (type.equalsIgnoreCase("bombcase")) { - return ToolListMF.bomb_custom; - } - if (type.equalsIgnoreCase("minecase")) { - return ToolListMF.mine_custom; - } - if (type.equalsIgnoreCase("arrow")) { - return ToolListMF.exploding_arrow; - } - if (type.equalsIgnoreCase("bolt")) { - return ToolListMF.exploding_bolt; - } - return null; - } - - private boolean isMatch(int slot, String type) { - return isMatch(inv[slot], type); - } - - public static boolean isMatch(ItemStack item, String type) { - String component = getComponentType(item); - return component != null && component.equalsIgnoreCase(type); - } - - public static String getComponentType(ItemStack item) { - if (item != null && item.getItem() != null && item.getItem() instanceof IBombComponent) { - return ((IBombComponent) item.getItem()).getComponentType(); - } - return null; - } - - public static byte getComponentTier(ItemStack item) { - if (item != null && item.getItem() != null && item.getItem() instanceof IBombComponent) { - return ((IBombComponent) item.getItem()).getTier(); - } - return (byte) 0; - } - - // INVENORY - - @Override - public int getSizeInventory() { - return inv.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return inv[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - onInventoryChanged(); - if (this.inv[slot] != null) { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } else { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) { - this.inv[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return inv[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - onInventoryChanged(); - inv[slot] = item; - } - - @Override - public String getInventoryName() { - return "gui.bombcraftmf.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - if (this.isMatch(item, "bolt") || this.isMatch(item, "arrow") || this.isMatch(item, "bombcase") - || this.isMatch(item, "minecase")) { - return slot == 0; - } - if (this.isMatch(item, "powder")) { - return slot == 1; - } - if (this.isMatch(item, "filling")) { - return slot == 2; - } - if (this.isMatch(item, "fuse")) { - return slot == 3; - } - return false; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - progress = nbt.getFloat("progress"); - maxProgress = nbt.getFloat("maxProgress"); - hasRecipe = nbt.getBoolean("hasRecipe"); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inv.length; ++i) { - if (this.inv[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - nbt.setFloat("progress", progress); - nbt.setFloat("maxProgress", maxProgress); - nbt.setBoolean("hasRecipe", hasRecipe); - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) { - return new int[] { 0, 1, 2, 3, 4 }; - } - - @Override - public boolean canInsertItem(int slot, ItemStack item, int side) { - return this.isItemValidForSlot(slot, item); - } - - @Override - public boolean canExtractItem(int slot, ItemStack item, int side) { - return slot == 4; - } - - @Override - public int getMetreScale(int size) { - return (int) Math.min(size, size / maxProgress * progress); - } - - @Override - public boolean shouldShowMetre() { - return true; - } - - @Override - public String getLocalisedName() { - return StatCollector.translateToLocal("tile.bombBench.name"); - } + } + + private boolean areItemsEqual(ItemStack bomb1, ItemStack bomb2) { + if (ItemBomb.getCasing(bomb1) != ItemBomb.getCasing(bomb2)) { + return false; + } + if (ItemBomb.getPowder(bomb1) != ItemBomb.getPowder(bomb2)) { + return false; + } + if (ItemBomb.getFilling(bomb1) != ItemBomb.getFilling(bomb2)) { + return false; + } + if (ItemBomb.getFuse(bomb1) != ItemBomb.getFuse(bomb2)) { + return false; + } + return bomb1.isItemEqual(bomb2); + } + + public void onInventoryChanged() { + } + + private ItemStack findResult() { + boolean isArrow = isMatch(0, "arrow") || isMatch(0, "bolt"); + if (!isMatch(1, "powder") || (!isArrow && !isMatch(3, "fuse"))) { + return null; + } + byte caseTier = -1; + byte filling = 0; + byte fuse = -1; + byte powder = -1; + Item design = null; + String com0 = getComponentType(inv[0]); + String com1 = getComponentType(inv[1]); + String com2 = getComponentType(inv[2]); + String com3 = getComponentType(inv[3]); + if (com0 != null) { + caseTier = getComponentTier(inv[0]); + String type = com0; + design = getDesignCrafted(type); + } + if (com1 != null) { + if (com1.equalsIgnoreCase("powder")) { + powder = getComponentTier(inv[1]); + } else { + return null; + } + } else + return null; + if (com2 != null) { + if (com2.equalsIgnoreCase("filling")) { + filling = getComponentTier(inv[2]); + } else { + return null; + } + } + if (isArrow || com3 != null) { + if (!isArrow) { + if (com3.equalsIgnoreCase("fuse")) { + fuse = getComponentTier(inv[3]); + } else { + return null; + } + } + } else + return null; + + if (design != null && isArrow && powder > -1) { + return ItemExplodingArrow.createBombArrow(design, powder, filling); + } else if (design != null && fuse > -1 && powder > -1) { + return ItemBomb.createExplosive(design, caseTier, filling, fuse, powder, 1, false); + } + return null; + } + + private Item getDesignCrafted(String type) { + if (type.equalsIgnoreCase("bombcase")) { + return ToolListMF.bomb_custom; + } + if (type.equalsIgnoreCase("minecase")) { + return ToolListMF.mine_custom; + } + if (type.equalsIgnoreCase("arrow")) { + return ToolListMF.exploding_arrow; + } + if (type.equalsIgnoreCase("bolt")) { + return ToolListMF.exploding_bolt; + } + return null; + } + + private boolean isMatch(int slot, String type) { + return isMatch(inv[slot], type); + } + + // INVENORY + + @Override + public int getSizeInventory() { + return inv.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + onInventoryChanged(); + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return inv[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + onInventoryChanged(); + inv[slot] = item; + } + + @Override + public String getInventoryName() { + return "gui.bombcraftmf.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (this.isMatch(item, "bolt") || this.isMatch(item, "arrow") || this.isMatch(item, "bombcase") + || this.isMatch(item, "minecase")) { + return slot == 0; + } + if (this.isMatch(item, "powder")) { + return slot == 1; + } + if (this.isMatch(item, "filling")) { + return slot == 2; + } + if (this.isMatch(item, "fuse")) { + return slot == 3; + } + return false; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + progress = nbt.getFloat("progress"); + maxProgress = nbt.getFloat("maxProgress"); + hasRecipe = nbt.getBoolean("hasRecipe"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + nbt.setFloat("progress", progress); + nbt.setFloat("maxProgress", maxProgress); + nbt.setBoolean("hasRecipe", hasRecipe); + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[]{0, 1, 2, 3, 4}; + } + + @Override + public boolean canInsertItem(int slot, ItemStack item, int side) { + return this.isItemValidForSlot(slot, item); + } + + @Override + public boolean canExtractItem(int slot, ItemStack item, int side) { + return slot == 4; + } + + @Override + public int getMetreScale(int size) { + return (int) Math.min(size, size / maxProgress * progress); + } + + @Override + public boolean shouldShowMetre() { + return true; + } + + @Override + public String getLocalisedName() { + return StatCollector.translateToLocal("tile.bombBench.name"); + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombPress.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombPress.java index f8089550..e5242164 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombPress.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBombPress.java @@ -4,29 +4,29 @@ import net.minecraft.tileentity.TileEntity; public class TileEntityBombPress extends TileEntity { - public float animation = 0F; + public float animation = 0F; - @Override - public void updateEntity() { - super.updateEntity(); - if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) { - if (animation <= 0) { - use(null); - } - animation = 1.0F; - } else { - if (animation > 0) { - animation -= 0.05F; - } - } - } + @Override + public void updateEntity() { + super.updateEntity(); + if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) { + if (animation <= 0) { + use(null); + } + animation = 1.0F; + } else { + if (animation > 0) { + animation -= 0.05F; + } + } + } - public void use(EntityPlayer user) { - TileEntity under = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - if (animation <= 0 && under != null && under instanceof TileEntityBombBench) { - ((TileEntityBombBench) under).tryCraft(user, true); - animation = 1.0F; - worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "tile.piston.out", 1.0F, 0.75F); - } - } + public void use(EntityPlayer user) { + TileEntity under = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (animation <= 0 && under != null && under instanceof TileEntityBombBench) { + ((TileEntityBombBench) under).tryCraft(user, true); + animation = 1.0F; + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "tile.piston.out", 1.0F, 0.75F); + } + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java index 714ce416..dabf1ea5 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCarpenterMF.java @@ -9,9 +9,9 @@ import minefantasy.mf2.api.rpg.Skill; import minefantasy.mf2.container.ContainerCarpenterMF; import minefantasy.mf2.item.armour.ItemArmourMF; +import minefantasy.mf2.network.NetworkUtils; import minefantasy.mf2.network.packet.CarpenterPacket; import minefantasy.mf2.util.MFLogUtil; -import minefantasy.mf2.network.NetworkUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -25,550 +25,547 @@ import java.util.Random; public class TileEntityCarpenterMF extends TileEntity implements IInventory, ICarpenter { - private int tier; - private ItemStack[] inventory; - private Random rand = new Random(); - private int ticksExisted; - private ContainerCarpenterMF syncCarpenter; - private CarpenterCraftMatrix craftMatrix; - private String lastPlayerHit = ""; - private String toolTypeRequired = "hands"; - private String craftSound = "step.wood"; - private String researchRequired = ""; - private Skill skillUsed; - private boolean resetRecipe = false; - - public final int width = 4; - public final int height = 4; - - public TileEntityCarpenterMF() { - this(0); - } - - public TileEntityCarpenterMF(int tier) { - inventory = new ItemStack[width * height + 5]; - this.tier = tier; - setContainer(new ContainerCarpenterMF(this)); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - tier = nbt.getInteger("tier"); - - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inventory = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inventory.length) { - this.inventory[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - progress = nbt.getFloat("Progress"); - progressMax = nbt.getFloat("ProgressMax"); - resName = nbt.getString("ResultName"); - toolTypeRequired = nbt.getString("toolTypeRequired"); - craftSound = nbt.getString("craftSound"); - researchRequired = nbt.getString("researchRequired"); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("tier", tier); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inventory.length; ++i) { - if (this.inventory[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.inventory[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - - nbt.setFloat("Progress", progress); - nbt.setFloat("ProgressMax", progressMax); - nbt.setString("ResName", resName); - nbt.setString("toolTypeRequired", toolTypeRequired); - nbt.setString("craftSound", craftSound); - nbt.setString("researchRequired", researchRequired); - } - - @Override - public int getSizeInventory() { - return inventory.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return inventory[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - onInventoryChanged(); - if (this.inventory[slot] != null) { - ItemStack itemstack; - - if (this.inventory[slot].stackSize <= num) { - itemstack = this.inventory[slot]; - this.inventory[slot] = null; - return itemstack; - } else { - itemstack = this.inventory[slot].splitStack(num); - - if (this.inventory[slot].stackSize == 0) { - this.inventory[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return inventory[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - onInventoryChanged(); - inventory[slot] = item; - } - - @Override - public String getInventoryName() { - return "gui.carpentermf.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - return true; - } - - @Override - public void updateEntity() { - ++ticksExisted; - super.updateEntity(); - if (!worldObj.isRemote) { - if (ticksExisted % 20 == 0) { - updateCraftingData(); - } - if (!canCraft() && ticksExisted > 1) { - progress = progressMax = 0; - this.resName = ""; - this.recipe = null; - } - } - resetRecipe = false; - } - - public void onInventoryChanged() { - if (!resetRecipe) { - updateCraftingData(); - MFLogUtil.logDebug("Carpenter: Optimised Inv Tick"); - resetRecipe = true; - } - } - - public boolean tryCraft(EntityPlayer user) { - if (user == null) - return false; - - String toolType = ToolHelper.getCrafterTool(user.getHeldItem()); - int hammerTier = ToolHelper.getCrafterTier(user.getHeldItem()); - if (!toolType.equalsIgnoreCase("nothing")) { - if (user.getHeldItem() != null) { - user.getHeldItem().damageItem(1, user); - if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { - if (worldObj.isRemote) - user.renderBrokenItemStack(user.getHeldItem()); - - user.destroyCurrentEquippedItem(); - } - } - if (worldObj.isRemote) - return true; - - if (doesPlayerKnowCraft(user) && canCraft() && toolType.equalsIgnoreCase(toolTypeRequired) - && tier >= CarpenterTierRequired && hammerTier >= hammerTierRequired) { - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, getUseSound(), 1.0F, 1.0F); - float efficiency = ToolHelper.getCrafterEfficiency(user.getHeldItem()); - - if (user.swingProgress > 0 && user.swingProgress <= 1.0) { - efficiency *= (0.5F - user.swingProgress); - } - - progress += Math.max(0.2F, efficiency); - if (progress >= progressMax) { - craftItem(user); - } - } else { - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "step.stone", 1.25F, 1.5F); - } - lastPlayerHit = user.getCommandSenderName(); - updateCraftingData(); - return true; - } - updateCraftingData(); - return false; - } - - private String getUseSound() { - if (craftSound.equalsIgnoreCase("engineering")) { - if (rand.nextInt(5) == 0) { - return "random.click"; - } - if (rand.nextInt(20) == 0) { - return "random.door_open"; - } - return "step.wood"; - } - return craftSound; - } - - private void craftItem(EntityPlayer user) { - if (this.canCraft()) { - addXP(user); - ItemStack result = recipe.copy(); - if (result != null && result.getItem() instanceof ItemArmourMF) { - result = modifyArmour(result); - } - int output = getOutputSlotNum(); - - if (this.inventory[output] == null) { - if (result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) { - getNBT(result).setString("MF_CraftedByName", lastPlayerHit); - } - this.inventory[output] = result; - } else if (this.inventory[output].getItem() == result.getItem()) { - this.inventory[output].stackSize += result.stackSize; // Forge BugFix: Results may have multiple items - } - consumeResources(); - } - onInventoryChanged(); - progress = 0; - } - - private int getOutputSlotNum() { - return getSizeInventory() - 5; - } - - private ItemStack modifyArmour(ItemStack result) { - ItemArmourMF item = (ItemArmourMF) result.getItem(); - boolean canColour = item.canColour(); - int colour = -1; - for (int a = 0; a < getOutputSlotNum(); a++) { - ItemStack slot = getStackInSlot(a); - if (slot != null && slot.getItem() instanceof ItemArmor) { - ItemArmor slotitem = (ItemArmor) slot.getItem(); - if (canColour && slotitem.hasColor(slot)) { - colour = slotitem.getColor(slot); - } - if (result.isItemStackDamageable()) { - result.setItemDamage(slot.getItemDamage()); - } - } - } - if (colour != -1 && canColour) { - item.func_82813_b(result, colour); - } - return result; - } - - private NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - return item.getTagCompound(); - } - - private void dropItem(ItemStack itemstack) { - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - worldObj.spawnEntityInWorld(entityitem); - } - } - } - - public void syncData() { - - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new CarpenterPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + public final int width = 4; + public final int height = 4; + public String resName = ""; + public float progressMax; + public float progress; + private int tier; + private ItemStack[] inventory; + private Random rand = new Random(); + private int ticksExisted; + private ContainerCarpenterMF syncCarpenter; + private CarpenterCraftMatrix craftMatrix; + private String lastPlayerHit = ""; + private String toolTypeRequired = "hands"; + private String craftSound = "step.wood"; + private String researchRequired = ""; + private Skill skillUsed; + private boolean resetRecipe = false; + private ItemStack recipe; + private int hammerTierRequired; + private int CarpenterTierRequired; + + public TileEntityCarpenterMF() { + this(0); + } + + public TileEntityCarpenterMF(int tier) { + inventory = new ItemStack[width * height + 5]; + this.tier = tier; + setContainer(new ContainerCarpenterMF(this)); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + tier = nbt.getInteger("tier"); + + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inventory = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inventory.length) { + this.inventory[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + progress = nbt.getFloat("Progress"); + progressMax = nbt.getFloat("ProgressMax"); + resName = nbt.getString("ResultName"); + toolTypeRequired = nbt.getString("toolTypeRequired"); + craftSound = nbt.getString("craftSound"); + researchRequired = nbt.getString("researchRequired"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("tier", tier); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inventory.length; ++i) { + if (this.inventory[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inventory[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + + nbt.setFloat("Progress", progress); + nbt.setFloat("ProgressMax", progressMax); + nbt.setString("ResName", resName); + nbt.setString("toolTypeRequired", toolTypeRequired); + nbt.setString("craftSound", craftSound); + nbt.setString("researchRequired", researchRequired); + } + + @Override + public int getSizeInventory() { + return inventory.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inventory[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + onInventoryChanged(); + if (this.inventory[slot] != null) { + ItemStack itemstack; + + if (this.inventory[slot].stackSize <= num) { + itemstack = this.inventory[slot]; + this.inventory[slot] = null; + return itemstack; + } else { + itemstack = this.inventory[slot].splitStack(num); + + if (this.inventory[slot].stackSize == 0) { + this.inventory[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return inventory[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + onInventoryChanged(); + inventory[slot] = item; + } + + @Override + public String getInventoryName() { + return "gui.carpentermf.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + return true; + } + + @Override + public void updateEntity() { + ++ticksExisted; + super.updateEntity(); + if (!worldObj.isRemote) { + if (ticksExisted % 20 == 0) { + updateCraftingData(); + } + if (!canCraft() && ticksExisted > 1) { + progress = progressMax = 0; + this.resName = ""; + this.recipe = null; + } + } + resetRecipe = false; + } + + public void onInventoryChanged() { + if (!resetRecipe) { + updateCraftingData(); + MFLogUtil.logDebug("Carpenter: Optimised Inv Tick"); + resetRecipe = true; + } + } + + public boolean tryCraft(EntityPlayer user) { + if (user == null) + return false; + + String toolType = ToolHelper.getCrafterTool(user.getHeldItem()); + int hammerTier = ToolHelper.getCrafterTier(user.getHeldItem()); + if (!toolType.equalsIgnoreCase("nothing")) { + if (user.getHeldItem() != null) { + user.getHeldItem().damageItem(1, user); + if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { + if (worldObj.isRemote) + user.renderBrokenItemStack(user.getHeldItem()); + + user.destroyCurrentEquippedItem(); + } + } + if (worldObj.isRemote) + return true; + + if (doesPlayerKnowCraft(user) && canCraft() && toolType.equalsIgnoreCase(toolTypeRequired) + && tier >= CarpenterTierRequired && hammerTier >= hammerTierRequired) { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, getUseSound(), 1.0F, 1.0F); + float efficiency = ToolHelper.getCrafterEfficiency(user.getHeldItem()); + + if (user.swingProgress > 0 && user.swingProgress <= 1.0) { + efficiency *= (0.5F - user.swingProgress); + } + + progress += Math.max(0.2F, efficiency); + if (progress >= progressMax) { + craftItem(user); + } + } else { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "step.stone", 1.25F, 1.5F); + } + lastPlayerHit = user.getCommandSenderName(); + updateCraftingData(); + return true; + } + updateCraftingData(); + return false; + } + + private String getUseSound() { + if (craftSound.equalsIgnoreCase("engineering")) { + if (rand.nextInt(5) == 0) { + return "random.click"; + } + if (rand.nextInt(20) == 0) { + return "random.door_open"; + } + return "step.wood"; + } + return craftSound; + } + + private void craftItem(EntityPlayer user) { + if (this.canCraft()) { + addXP(user); + ItemStack result = recipe.copy(); + if (result != null && result.getItem() instanceof ItemArmourMF) { + result = modifyArmour(result); + } + int output = getOutputSlotNum(); + + if (this.inventory[output] == null) { + if (result.getMaxStackSize() == 1 && lastPlayerHit.length() > 0) { + getNBT(result).setString("MF_CraftedByName", lastPlayerHit); + } + this.inventory[output] = result; + } else if (this.inventory[output].getItem() == result.getItem()) { + this.inventory[output].stackSize += result.stackSize; // Forge BugFix: Results may have multiple items + } + consumeResources(); + } + onInventoryChanged(); + progress = 0; + } + + private int getOutputSlotNum() { + return getSizeInventory() - 5; + } + + private ItemStack modifyArmour(ItemStack result) { + ItemArmourMF item = (ItemArmourMF) result.getItem(); + boolean canColour = item.canColour(); + int colour = -1; + for (int a = 0; a < getOutputSlotNum(); a++) { + ItemStack slot = getStackInSlot(a); + if (slot != null && slot.getItem() instanceof ItemArmor) { + ItemArmor slotitem = (ItemArmor) slot.getItem(); + if (canColour && slotitem.hasColor(slot)) { + colour = slotitem.getColor(slot); + } + if (result.isItemStackDamageable()) { + result.setItemDamage(slot.getItemDamage()); + } + } + } + if (colour != -1 && canColour) { + item.func_82813_b(result, colour); + } + return result; + } + + private NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + return item.getTagCompound(); + } + + private void dropItem(ItemStack itemstack) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + worldObj.spawnEntityInWorld(entityitem); + } + } + } + + public void syncData() { + + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new CarpenterPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); /* - List players = ((WorldServer) worldObj).playerEntities; + List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new CarpenterPacket(this).generatePacket()); } */ - } - - public String resName = ""; - - public String getResultName() { - if (!worldObj.isRemote && recipe != null && recipe.getItem() != null && recipe.getDisplayName() != null) { - resName = recipe.getDisplayName(); - } - return resName; - } - - public String getToolNeeded() { - return toolTypeRequired; - } - - public String getCraftingSound() { - return craftSound; - } - - public int getToolTierNeeded() { - return this.hammerTierRequired; - } - - public int getCarpenterTierNeeded() { - return this.CarpenterTierRequired; - } - - public void consumeResources() { - resetRecipe = true; - for (int slot = 0; slot < getOutputSlotNum(); slot++) { - ItemStack item = getStackInSlot(slot); - if (item != null && item.getItem() != null && item.getItem().getContainerItem(item) != null) { - if (item.stackSize == 1) { - setInventorySlotContents(slot, item.getItem().getContainerItem(item)); - } else { - ItemStack drop = processSurplus(item.getItem().getContainerItem(item)); - if (drop != null) { - this.dropItem(drop); - } - this.decrStackSize(slot, 1); - } - } else { - this.decrStackSize(slot, 1); - } - } - resetRecipe = false; - this.onInventoryChanged(); - } - - private ItemStack processSurplus(ItemStack item) { - for (int a = 0; a < 4; a++) { - if (item == null) { - return null;// If item was sorted - } - - int s = getSizeInventory() - 4 + a; - ItemStack slot = inventory[s]; - if (slot == null) { - setInventorySlotContents(s, item); - return null;// All Placed - } else { - if (slot.isItemEqual(item) && slot.stackSize < slot.getMaxStackSize()) { - if (slot.stackSize + item.stackSize <= slot.getMaxStackSize()) { - slot.stackSize += item.stackSize; - return null;// All Shared - } else { - int room_left = slot.getMaxStackSize() - slot.stackSize; - slot.stackSize += room_left; - item.stackSize -= room_left;// Share - } - } - } - } - return item; - } - - private boolean canFitResult(ItemStack result) { - ItemStack resSlot = inventory[getOutputSlotNum()]; - if (resSlot != null && result != null) { - if (!resSlot.isItemEqual(result)) { - return false; - } - if (resSlot.stackSize + result.stackSize > resSlot.getMaxStackSize()) { - return false; - } - } - return true; - } - - // CRAFTING CODE - public ItemStack getResult() { - if (syncCarpenter == null || craftMatrix == null) { - return null; - } - - if (ticksExisted <= 1) - return null; - - for (int a = 0; a < getOutputSlotNum(); a++) { - craftMatrix.setInventorySlotContents(a, inventory[a]); - } - - return CraftingManagerCarpenter.getInstance().findMatchingRecipe(this, craftMatrix); - } - - public void updateCraftingData() { - if (!worldObj.isRemote) { - ItemStack oldRecipe = recipe; - recipe = getResult(); - // syncItems(); - - if (!canCraft() && progress > 0) { - progress = 0; - // quality = 100; - } - if (recipe != null && oldRecipe != null && !recipe.isItemEqual(oldRecipe)) { - progress = 0; - } - if (progress > progressMax) - progress = progressMax - 1; - syncData(); - } - } - - public boolean canCraft() { - if (worldObj.isRemote) { - // return canCraft == 1; - } - if (progressMax > 0 && recipe != null && recipe instanceof ItemStack) { - return this.canFitResult(recipe); - } - return false; - } - - private ItemStack recipe; - public float progressMax; - public float progress; - private int hammerTierRequired; - private int CarpenterTierRequired; - - @Override - public void setForgeTime(int i) { - progressMax = i; - } - - @Override - public void setToolTier(int i) { - hammerTierRequired = i; - } - - @Override - public void setRequiredCarpenter(int i) { - CarpenterTierRequired = i; - } - - @Override - public void setHotOutput(boolean i) { - } - - public void setContainer(ContainerCarpenterMF container) { - syncCarpenter = container; - craftMatrix = new CarpenterCraftMatrix(this, syncCarpenter, ShapelessCarpenterRecipes.globalWidth, - ShapelessCarpenterRecipes.globalHeight); - } - - public boolean shouldRenderCraftMetre() { - return recipe != null; - } - - public int getProgressBar(int i) { - return (int) Math.ceil(i / progressMax * progress); - } - - @Override - public void setToolType(String toolType) { - this.toolTypeRequired = toolType; - } - - @Override - public void setCraftingSound(String sound) { - this.craftSound = sound; - } - - @Override - public void setResearch(String research) { - this.researchRequired = research; - } - - public String getResearchNeeded() { - return researchRequired; - } - - public boolean doesPlayerKnowCraft(EntityPlayer user) { - if (getResearchNeeded().isEmpty()) { - return true; - } - return ResearchLogic.hasInfoUnlocked(user, getResearchNeeded()); - } - - private void addXP(EntityPlayer smith) { - if (skillUsed != null) { - float baseXP = this.progressMax / 10F; - skillUsed.addXP(smith, (int) baseXP + 1); - } - } - - @Override - public void setSkill(Skill skill) { - skillUsed = skill; - } + } + + public String getResultName() { + if (!worldObj.isRemote && recipe != null && recipe.getItem() != null && recipe.getDisplayName() != null) { + resName = recipe.getDisplayName(); + } + return resName; + } + + public String getToolNeeded() { + return toolTypeRequired; + } + + public String getCraftingSound() { + return craftSound; + } + + @Override + public void setCraftingSound(String sound) { + this.craftSound = sound; + } + + public int getToolTierNeeded() { + return this.hammerTierRequired; + } + + public int getCarpenterTierNeeded() { + return this.CarpenterTierRequired; + } + + public void consumeResources() { + resetRecipe = true; + for (int slot = 0; slot < getOutputSlotNum(); slot++) { + ItemStack item = getStackInSlot(slot); + if (item != null && item.getItem() != null && item.getItem().getContainerItem(item) != null) { + if (item.stackSize == 1) { + setInventorySlotContents(slot, item.getItem().getContainerItem(item)); + } else { + ItemStack drop = processSurplus(item.getItem().getContainerItem(item)); + if (drop != null) { + this.dropItem(drop); + } + this.decrStackSize(slot, 1); + } + } else { + this.decrStackSize(slot, 1); + } + } + resetRecipe = false; + this.onInventoryChanged(); + } + + private ItemStack processSurplus(ItemStack item) { + for (int a = 0; a < 4; a++) { + if (item == null) { + return null;// If item was sorted + } + + int s = getSizeInventory() - 4 + a; + ItemStack slot = inventory[s]; + if (slot == null) { + setInventorySlotContents(s, item); + return null;// All Placed + } else { + if (slot.isItemEqual(item) && slot.stackSize < slot.getMaxStackSize()) { + if (slot.stackSize + item.stackSize <= slot.getMaxStackSize()) { + slot.stackSize += item.stackSize; + return null;// All Shared + } else { + int room_left = slot.getMaxStackSize() - slot.stackSize; + slot.stackSize += room_left; + item.stackSize -= room_left;// Share + } + } + } + } + return item; + } + + private boolean canFitResult(ItemStack result) { + ItemStack resSlot = inventory[getOutputSlotNum()]; + if (resSlot != null && result != null) { + if (!resSlot.isItemEqual(result)) { + return false; + } + if (resSlot.stackSize + result.stackSize > resSlot.getMaxStackSize()) { + return false; + } + } + return true; + } + + // CRAFTING CODE + public ItemStack getResult() { + if (syncCarpenter == null || craftMatrix == null) { + return null; + } + + if (ticksExisted <= 1) + return null; + + for (int a = 0; a < getOutputSlotNum(); a++) { + craftMatrix.setInventorySlotContents(a, inventory[a]); + } + + return CraftingManagerCarpenter.getInstance().findMatchingRecipe(this, craftMatrix); + } + + public void updateCraftingData() { + if (!worldObj.isRemote) { + ItemStack oldRecipe = recipe; + recipe = getResult(); + // syncItems(); + + if (!canCraft() && progress > 0) { + progress = 0; + // quality = 100; + } + if (recipe != null && oldRecipe != null && !recipe.isItemEqual(oldRecipe)) { + progress = 0; + } + if (progress > progressMax) + progress = progressMax - 1; + syncData(); + } + } + + public boolean canCraft() { + if (worldObj.isRemote) { + // return canCraft == 1; + } + if (progressMax > 0 && recipe != null && recipe instanceof ItemStack) { + return this.canFitResult(recipe); + } + return false; + } + + @Override + public void setForgeTime(int i) { + progressMax = i; + } + + @Override + public void setToolTier(int i) { + hammerTierRequired = i; + } + + @Override + public void setRequiredCarpenter(int i) { + CarpenterTierRequired = i; + } + + @Override + public void setHotOutput(boolean i) { + } + + public void setContainer(ContainerCarpenterMF container) { + syncCarpenter = container; + craftMatrix = new CarpenterCraftMatrix(this, syncCarpenter, ShapelessCarpenterRecipes.globalWidth, + ShapelessCarpenterRecipes.globalHeight); + } + + public boolean shouldRenderCraftMetre() { + return recipe != null; + } + + public int getProgressBar(int i) { + return (int) Math.ceil(i / progressMax * progress); + } + + @Override + public void setToolType(String toolType) { + this.toolTypeRequired = toolType; + } + + @Override + public void setResearch(String research) { + this.researchRequired = research; + } + + public String getResearchNeeded() { + return researchRequired; + } + + public boolean doesPlayerKnowCraft(EntityPlayer user) { + if (getResearchNeeded().isEmpty()) { + return true; + } + return ResearchLogic.hasInfoUnlocked(user, getResearchNeeded()); + } + + private void addXP(EntityPlayer smith) { + if (skillUsed != null) { + float baseXP = this.progressMax / 10F; + skillUsed.addXP(smith, (int) baseXP + 1); + } + } + + @Override + public void setSkill(Skill skill) { + skillUsed = skill; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java index 68b95515..b90837f4 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.Random; - import minefantasy.mf2.api.refine.ISmokeCarrier; import minefantasy.mf2.api.refine.SmokeMechanics; import minefantasy.mf2.block.refining.BlockChimney; @@ -12,148 +10,148 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityChimney extends TileEntity implements ISmokeCarrier { - public Block maskBlock = Blocks.air; - public int maskMeta = 0; - private int isIndirect = -1; - - protected int smokeStorage; - public int ticksExisted; - public int ticksExistedTemp; - private Random rand = new Random(); - - public int lastSharedInt = 0; +import java.util.Random; - @Override - public void updateEntity() { - super.updateEntity(); - ++ticksExisted; - ++ticksExistedTemp; - if (lastSharedInt > 0) - --lastSharedInt; +public class TileEntityChimney extends TileEntity implements ISmokeCarrier { + public Block maskBlock = Blocks.air; + public int maskMeta = 0; + public int ticksExisted; + public int ticksExistedTemp; + public int lastSharedInt = 0; + protected int smokeStorage; + private int isIndirect = -1; + private Random rand = new Random(); + + @Override + public void updateEntity() { + super.updateEntity(); + ++ticksExisted; + ++ticksExistedTemp; + if (lastSharedInt > 0) + --lastSharedInt; /* - * TODO Custom Tex if(ticksExistedTemp == 20) { + * TODO Custom Tex if(ticksExistedTemp == 20) { * MineFantasyII.debugMsg("Chimney Loaded R = " + worldObj.isRemote); sync(); } */ - if (smokeStorage > 0) { - if (!isPipeChimney()) { - SmokeMechanics.emitSmokeFromCarrier(worldObj, xCoord, yCoord, zCoord, this, 5); - } else if (tryShareSmoke()) { - lastSharedInt = 5; - } - } - if (!worldObj.isRemote && smokeStorage > getMaxSmokeStorage() && rand.nextInt(500) == 0) { - worldObj.newExplosion(null, xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 2F, false, true); - } - } - - public boolean isPipeChimney() { - if (worldObj != null) { - Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - return block instanceof BlockChimney && ((BlockChimney) block).isPipe(); - } - return false; - } - - private boolean tryShareSmoke() { - if (!isPipeChimney()) - return false; - if (tryPassTo(0, 1, 0, true, false)) { - return true;// Up First - } - if (tryPassTo(-1, 0, 0, false, true) || tryPassTo(1, 0, 0, false, true) || tryPassTo(0, 0, -1, false, true) - || tryPassTo(0, 0, 1, false, true)) { - return true;// Sides - } - if (this.getMaxSmokeStorage() - this.getSmokeValue() <= 5) { - return tryPassTo(0, -1, 0, false, false);// Down last only when nearly full - } - return false; - } - - private boolean tryPassTo(int x, int y, int z, boolean priority, boolean sideways) { - TileEntity tile = worldObj.getTileEntity(x + xCoord, y + yCoord, z + zCoord); - if (tile != null && tile instanceof TileEntityChimney) { - TileEntityChimney carrier = (TileEntityChimney) tile; - boolean canPass = !sideways || carrier.canAcceptSideways(); - - int smoke = carrier.getSmokeValue(); - int max = carrier.getMaxSmokeStorage(); - int room_left = max - smoke; - int limit = priority ? max : this.getSmokeValue();// When going up, it fills all, sideways follows - // concentration gradient - if (canPass && carrier.lastSharedInt <= 0 && room_left > 0 && smoke < limit) { - int pass = Math.min(room_left, 5); - carrier.setSmokeValue(smoke + pass); - this.smokeStorage -= pass; - return true; - } - } - - return false; - } - - private boolean canAcceptSideways() { - BlockChimney block = this.getActiveBlock(); - if (block != null) { - return block.isWideChimney() || block.isPipe(); - } - return false; - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setInteger("ticksExisted", ticksExisted); - nbt.setInteger("StoredSmoke", smokeStorage); - NBTTagList savedItems = new NBTTagList(); - - nbt.setInteger("BlockID", Block.getIdFromBlock(maskBlock)); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - ticksExisted = nbt.getInteger("ticksExisted"); - smokeStorage = nbt.getInteger("StoredSmoke"); - setBlock(nbt.getInteger("BlockID")); - } - - public void setBlock(int id) { - setBlock(id, 0); - } - - public void setBlock(int id, int subId) { + if (smokeStorage > 0) { + if (!isPipeChimney()) { + SmokeMechanics.emitSmokeFromCarrier(worldObj, xCoord, yCoord, zCoord, this, 5); + } else if (tryShareSmoke()) { + lastSharedInt = 5; + } + } + if (!worldObj.isRemote && smokeStorage > getMaxSmokeStorage() && rand.nextInt(500) == 0) { + worldObj.newExplosion(null, xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 2F, false, true); + } + } + + public boolean isPipeChimney() { + if (worldObj != null) { + Block block = worldObj.getBlock(xCoord, yCoord, zCoord); + return block instanceof BlockChimney && ((BlockChimney) block).isPipe(); + } + return false; + } + + private boolean tryShareSmoke() { + if (!isPipeChimney()) + return false; + if (tryPassTo(0, 1, 0, true, false)) { + return true;// Up First + } + if (tryPassTo(-1, 0, 0, false, true) || tryPassTo(1, 0, 0, false, true) || tryPassTo(0, 0, -1, false, true) + || tryPassTo(0, 0, 1, false, true)) { + return true;// Sides + } + if (this.getMaxSmokeStorage() - this.getSmokeValue() <= 5) { + return tryPassTo(0, -1, 0, false, false);// Down last only when nearly full + } + return false; + } + + private boolean tryPassTo(int x, int y, int z, boolean priority, boolean sideways) { + TileEntity tile = worldObj.getTileEntity(x + xCoord, y + yCoord, z + zCoord); + if (tile != null && tile instanceof TileEntityChimney) { + TileEntityChimney carrier = (TileEntityChimney) tile; + boolean canPass = !sideways || carrier.canAcceptSideways(); + + int smoke = carrier.getSmokeValue(); + int max = carrier.getMaxSmokeStorage(); + int room_left = max - smoke; + int limit = priority ? max : this.getSmokeValue();// When going up, it fills all, sideways follows + // concentration gradient + if (canPass && carrier.lastSharedInt <= 0 && room_left > 0 && smoke < limit) { + int pass = Math.min(room_left, 5); + carrier.setSmokeValue(smoke + pass); + this.smokeStorage -= pass; + return true; + } + } + + return false; + } + + private boolean canAcceptSideways() { + BlockChimney block = this.getActiveBlock(); + if (block != null) { + return block.isWideChimney() || block.isPipe(); + } + return false; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setInteger("ticksExisted", ticksExisted); + nbt.setInteger("StoredSmoke", smokeStorage); + NBTTagList savedItems = new NBTTagList(); + + nbt.setInteger("BlockID", Block.getIdFromBlock(maskBlock)); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + ticksExisted = nbt.getInteger("ticksExisted"); + smokeStorage = nbt.getInteger("StoredSmoke"); + setBlock(nbt.getInteger("BlockID")); + } + + public void setBlock(int id) { + setBlock(id, 0); + } + + public void setBlock(int id, int subId) { /* * TODO Custom Tex maskMeta = subId; Block newblock = Block.getBlockById(id); * if(newblock != null) { maskBlock = newblock; } if(worldObj != null && * worldObj.isRemote) { worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, * zCoord, xCoord, yCoord, zCoord); } */ - } - - @Override - public int getSmokeValue() { - return smokeStorage; - } - - @Override - public void setSmokeValue(int smoke) { - smokeStorage = smoke; - } - - @Override - public int getMaxSmokeStorage() { - if (this.blockType != null && blockType instanceof BlockChimney) { - return ((BlockChimney) blockType).size; - } - return 5; - } - - public void sync() { + } + + @Override + public int getSmokeValue() { + return smokeStorage; + } + + @Override + public void setSmokeValue(int smoke) { + smokeStorage = smoke; + } + + @Override + public int getMaxSmokeStorage() { + if (this.blockType != null && blockType instanceof BlockChimney) { + return ((BlockChimney) blockType).size; + } + return 5; + } + + public void sync() { /* * TODO Custom Tex MineFantasyII.debugMsg("Block For Chimney = " + * maskBlock.getUnlocalizedName() + " R = " + worldObj.isRemote); @@ -167,47 +165,47 @@ public void sync() { * zCoord); worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, * xCoord, yCoord, zCoord); */ - } - - public BlockChimney getActiveBlock() { - if (worldObj == null) - return null; - - Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - - if (block != null && block instanceof BlockChimney) { - return (BlockChimney) block; - } - return null; - } - - public boolean isIndirect() { - BlockChimney block = getActiveBlock(); - return block != null && block.isIndirect; - } - - @Override - public boolean canAbsorbIndirect() { - if (isIndirect == -1) { - isIndirect = isIndirect() ? 1 : 0; - } - return isIndirect == 1; - } - - public boolean canAccept(int x, int y, int z) { - Block block = worldObj.getBlock(x + xCoord, y + yCoord, z + zCoord); - if (block instanceof BlockChimney) { - if (x == 0 && z == 0)// Not sideways - { - return true; - } else { - return ((BlockChimney) block).isPipe() || ((BlockChimney) block).isWideChimney(); - } - } - return false; - } - - public boolean canAccept(ForgeDirection fd) { - return canAccept(fd.offsetX, fd.offsetY, fd.offsetZ); - } + } + + public BlockChimney getActiveBlock() { + if (worldObj == null) + return null; + + Block block = worldObj.getBlock(xCoord, yCoord, zCoord); + + if (block != null && block instanceof BlockChimney) { + return (BlockChimney) block; + } + return null; + } + + public boolean isIndirect() { + BlockChimney block = getActiveBlock(); + return block != null && block.isIndirect; + } + + @Override + public boolean canAbsorbIndirect() { + if (isIndirect == -1) { + isIndirect = isIndirect() ? 1 : 0; + } + return isIndirect == 1; + } + + public boolean canAccept(int x, int y, int z) { + Block block = worldObj.getBlock(x + xCoord, y + yCoord, z + zCoord); + if (block instanceof BlockChimney) { + if (x == 0 && z == 0)// Not sideways + { + return true; + } else { + return ((BlockChimney) block).isPipe() || ((BlockChimney) block).isWideChimney(); + } + } + return false; + } + + public boolean canAccept(ForgeDirection fd) { + return canAccept(fd.offsetX, fd.offsetY, fd.offsetZ); + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java index 6c64f28c..596afb29 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityComponent.java @@ -3,8 +3,8 @@ import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockComponent; -import minefantasy.mf2.network.packet.StorageBlockPacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.StorageBlockPacket; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -12,193 +12,193 @@ import net.minecraft.world.WorldServer; public class TileEntityComponent extends TileEntity { - public ItemStack item; - public int stackSize, max; - public String type = "bar"; - public String tex = "bar"; - public CustomMaterial material; - private int ticksExisted; - - public void setItem(ItemStack item, String type, String tex, int max, int stackSize) { - this.item = item; - this.item.stackSize = 1; - this.stackSize = stackSize; - this.max = max; - this.type = type; - this.tex = tex; - this.material = CustomToolHelper.getCustomPrimaryMaterial(item); - this.ticksExisted = 19; - } - - public void interact(EntityPlayer user, ItemStack held, boolean leftClick) { - if (item != null && stackSize > 0) { - if (leftClick)// Take - { - if (held == null) { - held = item.copy(); - held.stackSize = 1; - user.setCurrentItemOrArmor(0, held); - --stackSize; - } else { - ItemStack newitem = item.copy(); - newitem.stackSize = 1; - if (user.inventory.addItemStackToInventory(newitem)) { - --stackSize; - } - } - if (item == null || stackSize <= 0) { - worldObj.setBlockToAir(xCoord, yCoord, zCoord); - worldObj.removeTileEntity(xCoord, yCoord, zCoord); - } - } else if (held != null)// PLACE - { - if (stackSize < max && item.isItemEqual(held) && ItemStack.areItemStackTagsEqual(item, held)) { - ++stackSize; - --held.stackSize; - } - - if (held.stackSize <= 0) { - user.setCurrentItemOrArmor(0, null); - } - } - } - checkStack(); - syncData(); - } - - public void checkStack() { - if (!BlockComponent.canBuildOn(worldObj, xCoord, yCoord - 1, zCoord)) { - worldObj.setBlockToAir(xCoord, yCoord, zCoord); - } - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); - if (tile != null && tile instanceof TileEntityComponent) { - ((TileEntityComponent) tile).checkStack(); - } - } - - @Override - public void updateEntity() { - ++ticksExisted; - - if (ticksExisted == 20 || ticksExisted % 120 == 0) { - syncData(); - } - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - max = nbt.getInteger("MaxStack"); - type = nbt.getString("type"); - tex = nbt.getString("tex"); - stackSize = nbt.getInteger("StackSize"); - - NBTTagCompound itemsave = nbt.getCompoundTag("ItemSave"); - item = ItemStack.loadItemStackFromNBT(itemsave); - if (nbt.hasKey("MaterialName")) { - this.material = CustomMaterial.getMaterial(nbt.getString("MaterialName")); - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setInteger("MaxStack", max); - nbt.setString("type", type); - nbt.setString("tex", tex); - nbt.setInteger("StackSize", stackSize); - - if (item != null) { - NBTTagCompound itemsave = new NBTTagCompound(); - item.writeToNBT(itemsave); - nbt.setTag("ItemSave", itemsave); - } - if (material != null) { - nbt.setString("MaterialName", material.name); - } - } - - public void syncData() { - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new StorageBlockPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + public ItemStack item; + public int stackSize, max; + public String type = "bar"; + public String tex = "bar"; + public CustomMaterial material; + private int ticksExisted; + + public void setItem(ItemStack item, String type, String tex, int max, int stackSize) { + this.item = item; + this.item.stackSize = 1; + this.stackSize = stackSize; + this.max = max; + this.type = type; + this.tex = tex; + this.material = CustomToolHelper.getCustomPrimaryMaterial(item); + this.ticksExisted = 19; + } + + public void interact(EntityPlayer user, ItemStack held, boolean leftClick) { + if (item != null && stackSize > 0) { + if (leftClick)// Take + { + if (held == null) { + held = item.copy(); + held.stackSize = 1; + user.setCurrentItemOrArmor(0, held); + --stackSize; + } else { + ItemStack newitem = item.copy(); + newitem.stackSize = 1; + if (user.inventory.addItemStackToInventory(newitem)) { + --stackSize; + } + } + if (item == null || stackSize <= 0) { + worldObj.setBlockToAir(xCoord, yCoord, zCoord); + worldObj.removeTileEntity(xCoord, yCoord, zCoord); + } + } else if (held != null)// PLACE + { + if (stackSize < max && item.isItemEqual(held) && ItemStack.areItemStackTagsEqual(item, held)) { + ++stackSize; + --held.stackSize; + } + + if (held.stackSize <= 0) { + user.setCurrentItemOrArmor(0, null); + } + } + } + checkStack(); + syncData(); + } + + public void checkStack() { + if (!BlockComponent.canBuildOn(worldObj, xCoord, yCoord - 1, zCoord)) { + worldObj.setBlockToAir(xCoord, yCoord, zCoord); + } + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + if (tile != null && tile instanceof TileEntityComponent) { + ((TileEntityComponent) tile).checkStack(); + } + } + + @Override + public void updateEntity() { + ++ticksExisted; + + if (ticksExisted == 20 || ticksExisted % 120 == 0) { + syncData(); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + max = nbt.getInteger("MaxStack"); + type = nbt.getString("type"); + tex = nbt.getString("tex"); + stackSize = nbt.getInteger("StackSize"); + + NBTTagCompound itemsave = nbt.getCompoundTag("ItemSave"); + item = ItemStack.loadItemStackFromNBT(itemsave); + if (nbt.hasKey("MaterialName")) { + this.material = CustomMaterial.getMaterial(nbt.getString("MaterialName")); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setInteger("MaxStack", max); + nbt.setString("type", type); + nbt.setString("tex", tex); + nbt.setInteger("StackSize", stackSize); + + if (item != null) { + NBTTagCompound itemsave = new NBTTagCompound(); + item.writeToNBT(itemsave); + nbt.setTag("ItemSave", itemsave); + } + if (material != null) { + nbt.setString("MaterialName", material.name); + } + } + + public void syncData() { + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new StorageBlockPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); /* - List players = ((WorldServer) worldObj).playerEntities; + List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new StorageBlockPacket(this).generatePacket()); } */ - } - - public boolean isFull() { - return stackSize >= max; - } - - public float getBlockHeight() { - if (type.equalsIgnoreCase("sheet")) { - return stackSize * 0.0625F; - } - if (type.equalsIgnoreCase("plank")) { - float f = 0.125F; - if (stackSize > 42) - return 8F * f; - if (stackSize > 36) - return 7F * f; - if (stackSize > 30) - return 6F * f; - if (stackSize > 24) - return 5F * f; - if (stackSize > 18) - return 4F * f; - if (stackSize > 12) - return 3F * f; - if (stackSize > 6) - return 2F * f; - - return f; - } - if (type.equalsIgnoreCase("bar")) { - float f = 0.125F; - if (stackSize > 50) - return 8F * f; - if (stackSize > 48) - return 7F * f; - if (stackSize > 34) - return 6F * f; - if (stackSize > 32) - return 5F * f; - if (stackSize > 18) - return 4F * f; - if (stackSize > 16) - return 3F * f; - if (stackSize > 2) - return 2F * f; - - return f; - } - if (type.equalsIgnoreCase("pot")) { - float f = 0.25F; - if (stackSize > 48) - return 4F * f; - if (stackSize > 32) - return 3F * f; - if (stackSize > 16) - return 2F * f; - - return f; - } - if (type.equalsIgnoreCase("bigplate")) { - return Math.max(0.125F, stackSize * 0.125F); - } - if (type.equalsIgnoreCase("jug")) { - return stackSize > 16 ? 1.0F : 0.5F; - } - return 1.0F; - } + } + + public boolean isFull() { + return stackSize >= max; + } + + public float getBlockHeight() { + if (type.equalsIgnoreCase("sheet")) { + return stackSize * 0.0625F; + } + if (type.equalsIgnoreCase("plank")) { + float f = 0.125F; + if (stackSize > 42) + return 8F * f; + if (stackSize > 36) + return 7F * f; + if (stackSize > 30) + return 6F * f; + if (stackSize > 24) + return 5F * f; + if (stackSize > 18) + return 4F * f; + if (stackSize > 12) + return 3F * f; + if (stackSize > 6) + return 2F * f; + + return f; + } + if (type.equalsIgnoreCase("bar")) { + float f = 0.125F; + if (stackSize > 50) + return 8F * f; + if (stackSize > 48) + return 7F * f; + if (stackSize > 34) + return 6F * f; + if (stackSize > 32) + return 5F * f; + if (stackSize > 18) + return 4F * f; + if (stackSize > 16) + return 3F * f; + if (stackSize > 2) + return 2F * f; + + return f; + } + if (type.equalsIgnoreCase("pot")) { + float f = 0.25F; + if (stackSize > 48) + return 4F * f; + if (stackSize > 32) + return 3F * f; + if (stackSize > 16) + return 2F * f; + + return f; + } + if (type.equalsIgnoreCase("bigplate")) { + return Math.max(0.125F, stackSize * 0.125F); + } + if (type.equalsIgnoreCase("jug")) { + return stackSize > 16 ? 1.0F : 0.5F; + } + return 1.0F; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java index f9828ae0..5fb3cf0b 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrossbowBench.java @@ -5,8 +5,8 @@ import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.item.list.ToolListMF; -import minefantasy.mf2.network.packet.CrossbowBenchPacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.CrossbowBenchPacket; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; @@ -20,280 +20,278 @@ import java.util.Random; public class TileEntityCrossbowBench extends TileEntity implements IInventory, ISidedInventory, IBasicMetre { - /** - * Stock, Head, Mod, Muzzle, Result - */ - private ItemStack[] inv = new ItemStack[5]; - private Random rand = new Random(); - public float progress; - public float maxProgress = 25F; - - public boolean hasRecipe; - - private int ticksExisted; - - @Override - public void updateEntity() { - ++ticksExisted; - if (!worldObj.isRemote && (hasRecipe || ticksExisted % 100 == 0)) { - syncData(); - } - } - - public boolean tryCraft(EntityPlayer user) { - ItemStack result = findResult(); - hasRecipe = result != null; - - if (result == null) { - progress = 0F; - } else if (ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("spanner")) { - if (user.getHeldItem() != null) { - worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "minefantasy2:block.twistbolt", 0.25F, - 1.0F); - user.getHeldItem().damageItem(1, user); - if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { - user.destroyCurrentEquippedItem(); - } - } - float efficiency = ToolHelper.getCrafterEfficiency(user.getHeldItem()); - - if (user.swingProgress > 0 && user.swingProgress <= 1.0) { - efficiency *= (0.5F - user.swingProgress); - } - - if (!worldObj.isRemote) { - progress += efficiency; - } - if ((progress >= maxProgress && craftItem(result))) { - worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "random.door_open", 0.35F, 0.5F); - progress = 0; - if (user != null) { - SkillList.engineering.addXP(user, 10); - } - for (int a = 0; a < 4; a++) { - decrStackSize(a, 1); - } - } - return true; - } - return false; - } - - private boolean craftItem(ItemStack result) { - if (inv[4] == null) { - this.setInventorySlotContents(4, result); - return true; - } else { - return false; - } - } - - public void syncData() { - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new CrossbowBenchPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + public float progress; + public float maxProgress = 25F; + public boolean hasRecipe; + /** + * Stock, Head, Mod, Muzzle, Result + */ + private ItemStack[] inv = new ItemStack[5]; + private Random rand = new Random(); + private int ticksExisted; + + private static ICrossbowPart getCrossbowPart(ItemStack item) { + if (item != null && item.getItem() instanceof ICrossbowPart) { + return (ICrossbowPart) item.getItem(); + } + return null; + } + + public static boolean isMatch(ItemStack item, String var) { + ICrossbowPart part = getCrossbowPart(item); + if (part != null) { + return part.getComponentType().equalsIgnoreCase(var); + } + return false; + } + + @Override + public void updateEntity() { + ++ticksExisted; + if (!worldObj.isRemote && (hasRecipe || ticksExisted % 100 == 0)) { + syncData(); + } + } + + public boolean tryCraft(EntityPlayer user) { + ItemStack result = findResult(); + hasRecipe = result != null; + + if (result == null) { + progress = 0F; + } else if (ToolHelper.getCrafterTool(user.getHeldItem()).equalsIgnoreCase("spanner")) { + if (user.getHeldItem() != null) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "minefantasy2:block.twistbolt", 0.25F, + 1.0F); + user.getHeldItem().damageItem(1, user); + if (user.getHeldItem().getItemDamage() >= user.getHeldItem().getMaxDamage()) { + user.destroyCurrentEquippedItem(); + } + } + float efficiency = ToolHelper.getCrafterEfficiency(user.getHeldItem()); + + if (user.swingProgress > 0 && user.swingProgress <= 1.0) { + efficiency *= (0.5F - user.swingProgress); + } + + if (!worldObj.isRemote) { + progress += efficiency; + } + if ((progress >= maxProgress && craftItem(result))) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "random.door_open", 0.35F, 0.5F); + progress = 0; + if (user != null) { + SkillList.engineering.addXP(user, 10); + } + for (int a = 0; a < 4; a++) { + decrStackSize(a, 1); + } + } + return true; + } + return false; + } + + private boolean craftItem(ItemStack result) { + if (inv[4] == null) { + this.setInventorySlotContents(4, result); + return true; + } else { + return false; + } + } + + public void syncData() { + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new CrossbowBenchPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); /* - List players = ((WorldServer) worldObj).playerEntities; + List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new CrossbowBenchPacket(this).generatePacket()); } */ - } - - public void onInventoryChanged() { - } - - private ItemStack findResult() { - ICrossbowPart stock = getCrossbowPart(inv[0]); - ICrossbowPart head = getCrossbowPart(inv[1]); - ICrossbowPart mod = getCrossbowPart(inv[2]); - ICrossbowPart muzzle = getCrossbowPart(inv[3]); - - if (stock == null || head == null) - return null; - - return ToolListMF.crossbow_custom.constructCrossbow(stock, head, mod, muzzle); - } - - // INVENORY - - private static ICrossbowPart getCrossbowPart(ItemStack item) { - if (item != null && item.getItem() instanceof ICrossbowPart) { - return (ICrossbowPart) item.getItem(); - } - return null; - } - - @Override - public int getSizeInventory() { - return inv.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return inv[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - onInventoryChanged(); - if (this.inv[slot] != null) { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } else { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) { - this.inv[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return inv[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - onInventoryChanged(); - inv[slot] = item; - } - - @Override - public String getInventoryName() { - return "gui.crossbowcraftmf.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - if (this.isMatch(item, "stock")) { - return slot == 0; - } - if (this.isMatch(item, "mechanism")) { - return slot == 1; - } - if (this.isMatch(item, "mod")) { - return slot == 2; - } - if (this.isMatch(item, "muzzle")) { - return slot == 3; - } - return false; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - progress = nbt.getFloat("progress"); - maxProgress = nbt.getFloat("maxProgress"); - hasRecipe = nbt.getBoolean("hasRecipe"); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inv.length; ++i) { - if (this.inv[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - nbt.setFloat("progress", progress); - nbt.setFloat("maxProgress", maxProgress); - nbt.setBoolean("hasRecipe", hasRecipe); - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) { - return new int[] { 0, 1, 2, 3, 4 }; - } - - @Override - public boolean canInsertItem(int slot, ItemStack item, int side) { - return this.isItemValidForSlot(slot, item); - } - - @Override - public boolean canExtractItem(int slot, ItemStack item, int side) { - return slot == 4; - } - - @Override - public int getMetreScale(int size) { - return (int) Math.min(size, size / maxProgress * progress); - } - - @Override - public boolean shouldShowMetre() { - return true; - } - - @Override - public String getLocalisedName() { - return StatCollector.translateToLocal("tile.crossbowBench.name"); - } - - public static boolean isMatch(ItemStack item, String var) { - ICrossbowPart part = getCrossbowPart(item); - if (part != null) { - return part.getComponentType().equalsIgnoreCase(var); - } - return false; - } + } + + // INVENORY + + public void onInventoryChanged() { + } + + private ItemStack findResult() { + ICrossbowPart stock = getCrossbowPart(inv[0]); + ICrossbowPart head = getCrossbowPart(inv[1]); + ICrossbowPart mod = getCrossbowPart(inv[2]); + ICrossbowPart muzzle = getCrossbowPart(inv[3]); + + if (stock == null || head == null) + return null; + + return ToolListMF.crossbow_custom.constructCrossbow(stock, head, mod, muzzle); + } + + @Override + public int getSizeInventory() { + return inv.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + onInventoryChanged(); + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return inv[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + onInventoryChanged(); + inv[slot] = item; + } + + @Override + public String getInventoryName() { + return "gui.crossbowcraftmf.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (this.isMatch(item, "stock")) { + return slot == 0; + } + if (this.isMatch(item, "mechanism")) { + return slot == 1; + } + if (this.isMatch(item, "mod")) { + return slot == 2; + } + if (this.isMatch(item, "muzzle")) { + return slot == 3; + } + return false; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + progress = nbt.getFloat("progress"); + maxProgress = nbt.getFloat("maxProgress"); + hasRecipe = nbt.getBoolean("hasRecipe"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + nbt.setFloat("progress", progress); + nbt.setFloat("maxProgress", maxProgress); + nbt.setBoolean("hasRecipe", hasRecipe); + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[]{0, 1, 2, 3, 4}; + } + + @Override + public boolean canInsertItem(int slot, ItemStack item, int side) { + return this.isItemValidForSlot(slot, item); + } + + @Override + public boolean canExtractItem(int slot, ItemStack item, int side) { + return slot == 4; + } + + @Override + public int getMetreScale(int size) { + return (int) Math.min(size, size / maxProgress * progress); + } + + @Override + public boolean shouldShowMetre() { + return true; + } + + @Override + public String getLocalisedName() { + return StatCollector.translateToLocal("tile.crossbowBench.name"); + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java index 4cd1e826..1db47927 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.Random; - import minefantasy.mf2.api.crafting.IHeatUser; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.refine.Alloy; @@ -22,366 +20,365 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; +import java.util.Random; + public class TileEntityCrucible extends TileEntity implements IInventory, ISidedInventory, IHeatUser { - private ItemStack[] inv = new ItemStack[10]; - public float progress = 0, progressMax = 400; - public float temperature; - private Random rand = new Random(); - - @Override - public void updateEntity() { - super.updateEntity(); - boolean isHot = getIsHot(); - temperature = getTemperature(); - if (getTier() >= 2) { - progressMax = 2000; - } + private final int[] grid = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8}; + private final int[] output = new int[]{9}; + private final int[] whole = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + public float progress = 0, progressMax = 400; + public float temperature; + private ItemStack[] inv = new ItemStack[10]; + private Random rand = new Random(); + + @Override + public void updateEntity() { + super.updateEntity(); + boolean isHot = getIsHot(); + temperature = getTemperature(); + if (getTier() >= 2) { + progressMax = 2000; + } /* - * int time = 400; for(int a = 1; a < getSizeInventory()-1; a ++) { if(inv[a] != + * int time = 400; for(int a = 1; a < getSizeInventory()-1; a ++) { if(inv[a] != * null) { time += 50; } } if(!worldObj.isRemote) { progressMax = time; } */ - if (isHot && canSmelt()) { - progress += (temperature / 600F); - if (progress >= progressMax) { - progress = 0; - smeltItem(); - if (isAuto()) { - onAutoSmelt(); - } - } - } else { - progress = 0; - } - if (progress > 0 && rand.nextInt(4) == 0 && !isOutside() && this.getTier() < 2) { - SmokeMechanics.emitSmokeIndirect(worldObj, xCoord, yCoord, zCoord, 1); - } - - if (isHot != getIsHot()) { - BlockCrucible.updateFurnaceBlockState(getTemperature() > 0, worldObj, xCoord, yCoord, zCoord); - } - } - - private boolean getIsHot() { - if (this.getTier() >= 2) { - return this.isCoated(); - } - return getTemperature() > 0; - } - - private void onAutoSmelt() { - worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 1.0F, 1.0F); - worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.piston.out", 1.0F, 1.0F); - } - - private boolean isOutside() { - for (int x = -1; x <= 1; x++) { - for (int y = -1; y <= 1; y++) { - if (!worldObj.canBlockSeeTheSky(xCoord + x, yCoord + 1, zCoord + y)) { - return false; - } - } - } - return true; - } - - public void smeltItem() { - if (!canSmelt()) { - return; - } - - ItemStack itemstack = getRecipe(); - - if (inv[getOutSlot()] == null) { - inv[getOutSlot()] = itemstack.copy(); - } - - else if (CustomToolHelper.areEqual(inv[getOutSlot()], itemstack)) { - inv[getOutSlot()].stackSize += itemstack.stackSize; - } - - for (int a = 0; a < (getSizeInventory() - 1); a++) { - if (inv[a] != null) { - inv[a].stackSize--; - if (inv[a].stackSize <= 0) { - inv[a] = null; - } - } - } - if (worldObj.isRemote && getTier() >= 2) { - spawnParticle(-3, 0, 0); - spawnParticle(3, 0, 0); - spawnParticle(0, 0, -3); - spawnParticle(0, 0, 3); - } - } - - private void spawnParticle(int x, int y, int z) { - this.worldObj.playAuxSFX(2003, xCoord + x, yCoord + y, zCoord + z, 0); - } - - private boolean canSmelt() { - if (temperature <= 0) { - return false; - } - - ItemStack result = getRecipe(); - - if (result == null) { - return false; - } - - if (inv[getOutSlot()] == null) - return true; - if (inv[getOutSlot()] != null && CustomToolHelper.areEqual(inv[getOutSlot()], result) - && inv[getOutSlot()].stackSize < (inv[getOutSlot()].getMaxStackSize() - (result.stackSize - 1))) - return true; - return false; - } - - private int getOutSlot() { - return 9; - } - - private ItemStack getRecipe() { - ItemStack[] input = new ItemStack[getSizeInventory() - 1]; - for (int a = 0; a < 9; a++) { - input[a] = inv[a]; - } - Alloy alloy = AlloyRecipes.getResult(input); - if (alloy != null) { - if (alloy.getLevel() <= getTier()) { - return AlloyRecipes.getResult(input).getRecipeOutput(); - } - } - return null; - } - - @Override - public Block getBlockType() { - if (worldObj == null) - return Blocks.air; - - return super.getBlockType(); - } - - public int getTier() { - if (this.getBlockType() != null && this.getBlockType() instanceof BlockCrucible) { - return ((BlockCrucible) this.getBlockType()).tier; - } - return 0; - } - - public boolean isAuto() { - if (this.getBlockType() != null && this.getBlockType() instanceof BlockCrucible) { - return ((BlockCrucible) this.getBlockType()).isAuto; - } - return false; - } - - public float getTemperature() { - if (this.getTier() >= 1 && !isCoated()) { - return 0F; - } - if (getTier() >= 2) { - return 500; - } - Block under = worldObj.getBlock(xCoord, yCoord - 1, zCoord); - - if (under.getMaterial() == Material.fire) { - return 10F; - } - if (under.getMaterial() == Material.lava) { - return 50F; - } - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - if (tile != null && tile instanceof TileEntityForge) { - return ((TileEntityForge) tile).getBlockTemperature(); - } - return 0F; - } - - public boolean isCoated() { - if (this.getTier() >= 2) { - return isEnderAlter(-1, -1, -3) && isEnderAlter(-1, -1, 3) && isEnderAlter(-3, -1, -1) - && isEnderAlter(3, -1, -1) && isEnderAlter(1, -1, -3) && isEnderAlter(1, -1, 3) - && isEnderAlter(-3, -1, 1) && isEnderAlter(3, -1, 1); - } - return isFirebrick(0, 0, -1) && isFirebrick(0, 0, 1) && isFirebrick(-1, 0, 0) && isFirebrick(1, 0, 0); - } - - private boolean isFirebrick(int x, int y, int z) { - return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) == BlockListMF.firebricks; - } - - private boolean isEnderAlter(int x, int y, int z) { - Block block = worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z); - int meta = worldObj.getBlockMetadata(xCoord + x, yCoord + y, zCoord + z); - - if (block == Blocks.end_portal_frame && BlockEndPortalFrame.isEnderEyeInserted(meta)) { - return true; - } else { - // worldObj.setBlock(xCoord+x, yCoord+y, zCoord+z, Blocks.end_portal_frame, 0, - // 2); - return false; - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setFloat("progress", progress); - nbt.setFloat("progressMax", progressMax); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inv.length; ++i) { - if (this.inv[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - progress = nbt.getFloat("progress"); - progressMax = nbt.getFloat("progressMax"); - - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - } - // INVENTORY - - @Override - public int getSizeInventory() { - return inv.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return inv[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - onInventoryChanged(); - if (this.inv[slot] != null) { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } else { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) { - this.inv[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return inv[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - onInventoryChanged(); - inv[slot] = item; - } - - public void onInventoryChanged() { - } - - @Override - public String getInventoryName() { - return "gui.crucible.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - return true; - } - - private boolean isBlastOutput() { - if (worldObj == null) - return false; - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); - return tile != null && tile instanceof TileEntityBlastFH; - } - - private final int[] grid = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; - private final int[] output = new int[] { 9 }; - private final int[] whole = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - - @Override - public int[] getAccessibleSlotsFromSide(int side) { - if (isBlastOutput()) { - return whole; - } - return side == 0 ? output : grid; - } - - @Override - public boolean canInsertItem(int slot, ItemStack item, int side) { - return !isBlastOutput() && slot < getOutSlot(); - } - - @Override - public boolean canExtractItem(int slot, ItemStack item, int side) { - return isAuto() && slot == getOutSlot(); - } - - @Override - public boolean canAccept(TileEntity tile) { - return tile instanceof TileEntityForge; - } + if (isHot && canSmelt()) { + progress += (temperature / 600F); + if (progress >= progressMax) { + progress = 0; + smeltItem(); + if (isAuto()) { + onAutoSmelt(); + } + } + } else { + progress = 0; + } + if (progress > 0 && rand.nextInt(4) == 0 && !isOutside() && this.getTier() < 2) { + SmokeMechanics.emitSmokeIndirect(worldObj, xCoord, yCoord, zCoord, 1); + } + + if (isHot != getIsHot()) { + BlockCrucible.updateFurnaceBlockState(getTemperature() > 0, worldObj, xCoord, yCoord, zCoord); + } + } + + private boolean getIsHot() { + if (this.getTier() >= 2) { + return this.isCoated(); + } + return getTemperature() > 0; + } + + private void onAutoSmelt() { + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 1.0F, 1.0F); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.piston.out", 1.0F, 1.0F); + } + + private boolean isOutside() { + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + if (!worldObj.canBlockSeeTheSky(xCoord + x, yCoord + 1, zCoord + y)) { + return false; + } + } + } + return true; + } + + public void smeltItem() { + if (!canSmelt()) { + return; + } + + ItemStack itemstack = getRecipe(); + + if (inv[getOutSlot()] == null) { + inv[getOutSlot()] = itemstack.copy(); + } else if (CustomToolHelper.areEqual(inv[getOutSlot()], itemstack)) { + inv[getOutSlot()].stackSize += itemstack.stackSize; + } + + for (int a = 0; a < (getSizeInventory() - 1); a++) { + if (inv[a] != null) { + inv[a].stackSize--; + if (inv[a].stackSize <= 0) { + inv[a] = null; + } + } + } + if (worldObj.isRemote && getTier() >= 2) { + spawnParticle(-3, 0, 0); + spawnParticle(3, 0, 0); + spawnParticle(0, 0, -3); + spawnParticle(0, 0, 3); + } + } + + private void spawnParticle(int x, int y, int z) { + this.worldObj.playAuxSFX(2003, xCoord + x, yCoord + y, zCoord + z, 0); + } + + private boolean canSmelt() { + if (temperature <= 0) { + return false; + } + + ItemStack result = getRecipe(); + + if (result == null) { + return false; + } + + if (inv[getOutSlot()] == null) + return true; + if (inv[getOutSlot()] != null && CustomToolHelper.areEqual(inv[getOutSlot()], result) + && inv[getOutSlot()].stackSize < (inv[getOutSlot()].getMaxStackSize() - (result.stackSize - 1))) + return true; + return false; + } + + private int getOutSlot() { + return 9; + } + + private ItemStack getRecipe() { + ItemStack[] input = new ItemStack[getSizeInventory() - 1]; + for (int a = 0; a < 9; a++) { + input[a] = inv[a]; + } + Alloy alloy = AlloyRecipes.getResult(input); + if (alloy != null) { + if (alloy.getLevel() <= getTier()) { + return AlloyRecipes.getResult(input).getRecipeOutput(); + } + } + return null; + } + + @Override + public Block getBlockType() { + if (worldObj == null) + return Blocks.air; + + return super.getBlockType(); + } + + public int getTier() { + if (this.getBlockType() != null && this.getBlockType() instanceof BlockCrucible) { + return ((BlockCrucible) this.getBlockType()).tier; + } + return 0; + } + + public boolean isAuto() { + if (this.getBlockType() != null && this.getBlockType() instanceof BlockCrucible) { + return ((BlockCrucible) this.getBlockType()).isAuto; + } + return false; + } + + public float getTemperature() { + if (this.getTier() >= 1 && !isCoated()) { + return 0F; + } + if (getTier() >= 2) { + return 500; + } + Block under = worldObj.getBlock(xCoord, yCoord - 1, zCoord); + + if (under.getMaterial() == Material.fire) { + return 10F; + } + if (under.getMaterial() == Material.lava) { + return 50F; + } + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (tile != null && tile instanceof TileEntityForge) { + return ((TileEntityForge) tile).getBlockTemperature(); + } + return 0F; + } + + public boolean isCoated() { + if (this.getTier() >= 2) { + return isEnderAlter(-1, -1, -3) && isEnderAlter(-1, -1, 3) && isEnderAlter(-3, -1, -1) + && isEnderAlter(3, -1, -1) && isEnderAlter(1, -1, -3) && isEnderAlter(1, -1, 3) + && isEnderAlter(-3, -1, 1) && isEnderAlter(3, -1, 1); + } + return isFirebrick(0, 0, -1) && isFirebrick(0, 0, 1) && isFirebrick(-1, 0, 0) && isFirebrick(1, 0, 0); + } + + private boolean isFirebrick(int x, int y, int z) { + return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) == BlockListMF.firebricks; + } + // INVENTORY + + private boolean isEnderAlter(int x, int y, int z) { + Block block = worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z); + int meta = worldObj.getBlockMetadata(xCoord + x, yCoord + y, zCoord + z); + + if (block == Blocks.end_portal_frame && BlockEndPortalFrame.isEnderEyeInserted(meta)) { + return true; + } else { + // worldObj.setBlock(xCoord+x, yCoord+y, zCoord+z, Blocks.end_portal_frame, 0, + // 2); + return false; + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setFloat("progress", progress); + nbt.setFloat("progressMax", progressMax); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + progress = nbt.getFloat("progress"); + progressMax = nbt.getFloat("progressMax"); + + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + } + + @Override + public int getSizeInventory() { + return inv.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + onInventoryChanged(); + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return inv[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + onInventoryChanged(); + inv[slot] = item; + } + + public void onInventoryChanged() { + } + + @Override + public String getInventoryName() { + return "gui.crucible.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + return true; + } + + private boolean isBlastOutput() { + if (worldObj == null) + return false; + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + return tile != null && tile instanceof TileEntityBlastFH; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + if (isBlastOutput()) { + return whole; + } + return side == 0 ? output : grid; + } + + @Override + public boolean canInsertItem(int slot, ItemStack item, int side) { + return !isBlastOutput() && slot < getOutSlot(); + } + + @Override + public boolean canExtractItem(int slot, ItemStack item, int side) { + return isAuto() && slot == getOutSlot(); + } + + @Override + public boolean canAccept(TileEntity tile) { + return tile instanceof TileEntityForge; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java index e9656a6b..5c0bc7f3 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityFirepit.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.crafting.IBasicMetre; @@ -30,242 +28,244 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; +import java.util.Random; + public class TileEntityFirepit extends TileEntity implements IBasicMetre, IHeatSource { - public int fuel = 0; - private final int maxFuel = 12000; // 10 minutes - private float charcoal = 0; - private int ticksExisted; - private Random rand = new Random(); - - @Override - public void updateEntity() { - super.updateEntity(); - if (worldObj.isRemote) { - if (isBurning()) { - fuel--; - } - return; - } - - ++ticksExisted; - if (isLit()) { - if (isWet()) { - extinguish(Blocks.water, 0); - return; - } - - if (fuel > 0) { - fuel--; - charcoal += (0.25F / 20F / 60F); - } - - if (fuel <= 0) { - setLit(false); - } - } else if (fuel > 0 && ticksExisted % 10 == 0) { - tryLight(); - } - } - - private boolean isWet() { - if (isWater(-1, 0, 0) || isWater(1, 0, 0) || isWater(0, 0, -1) || isWater(0, 0, 1) || isWater(0, 1, 0)) { - return true; - } - - return worldObj.canLightningStrikeAt(xCoord, yCoord + 1, zCoord); - } - - public int getCharcoalDrop() { - return (int) (Math.floor(charcoal)); - } - - public boolean isBurning() { - return isLit() && fuel > 0; - } - - public boolean isLit() { - return worldObj.getBlockMetadata(xCoord, yCoord, zCoord) == 1; - } - - private void tryLight() { - if (isFire(-1, 0, 0) || isFire(1, 0, 0) || isFire(0, 0, -1) || isFire(0, 0, 1) || isFire(0, -1, 0) - || isFire(0, 1, 0)) { - setLit(true); - } - } - - private boolean isFire(int x, int y, int z) { - return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z).getMaterial() == Material.fire; - } - - private boolean isWater(int x, int y, int z) { - return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z).getMaterial() == Material.water; - } - - public boolean addFuel(ItemStack input) { - int amount = getItemBurnTime(input); - if (amount > 0 && fuel < maxFuel) { - fuel += amount; - if (fuel > maxFuel) { - fuel = maxFuel; - } - return true; - } - return false; - } - - public void setLit(boolean lit) { - if (worldObj != null) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, lit ? 1 : 0, 2); - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - ticksExisted = 0; - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("fuel", fuel); - nbt.setInteger("ticksExisted", ticksExisted); - nbt.setFloat("charcoal", charcoal); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - setLit(nbt.getBoolean("isLit")); - fuel = nbt.getInteger("fuel"); - ticksExisted = nbt.getInteger("ticksExisted"); - charcoal = nbt.getFloat("charcoal"); - } - - @Override - public Packet getDescriptionPacket() { - NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger("fuel", fuel); - return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, tag); - } - - @Override - public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) { - fuel = packet.func_148857_g().getInteger("fuel"); - } - - /** - * Gets the burn time - * - * Wood tools and plank item are 1 minute sticks and saplings are 30seconds - */ - public static int getItemBurnTime(ItemStack input) { - if (input == null) { - return 0; - } else { - Item i = input.getItem(); - if (i == Items.stick) - return 600;// 30Sec - if (i == ComponentListMF.plank || i == ComponentListMF.plank_cut) { - return (int) (200 * CustomToolHelper.getBurnModifier(input)); - } - if (i == ComponentListMF.plank_pane) { - return (int) (600 * CustomToolHelper.getBurnModifier(input)); - } - - return 0; - } - } - - @Override - public boolean canPlaceAbove() { - return true; - } - - @Override - public int getHeat() { - if (!isBurning()) { - return 0; - } - return Functions.getIntervalWave1_i(ticksExisted, 30, 100, 200);// 100*-300* - } - - @Override - @SideOnly(Side.CLIENT) - public boolean shouldShowMetre() { - return fuel > 0; - } - - @Override - @SideOnly(Side.CLIENT) - public int getMetreScale(int width) { - return this.fuel * width / (maxFuel); - } - - @Override - @SideOnly(Side.CLIENT) - public String getLocalisedName() { - int seconds = (int) Math.floor(fuel / 20); - int mins = (int) Math.floor(seconds / 60); - seconds -= mins * 60; - - String s = ""; - if (seconds < 10) { - s += "0"; - } - - return "150C " + StatCollector.translateToLocal("forge.fuel.name") + " " + mins + ":" + s + seconds; - } - - public void extinguish(Block block, int meta) { - worldObj.playSoundEffect(xCoord + 0.5F, yCoord + 0.25F, zCoord + 0.5F, "random.fizz", 0.4F, - 2.0F + this.rand.nextFloat() * 0.4F); - worldObj.spawnParticle("largesmoke", xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 0.0D, 0.0D, 0.0D); - worldObj.spawnParticle("tilecrack_" + block + "_" + meta, xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 0.0D, - 0.0D, 0.0D); - - setLit(false); - } - - public boolean tryCook(EntityPlayer player, ItemStack held) { - if (held.getItem() instanceof ItemFood) { - player.swingItem(); - if (worldObj.isRemote) { - return false; - } - ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(held); - if (result != null) { - if (rand.nextInt(10) != 0) { - return false; - } - float chance = 75F; - if (RPGElements.isSystemActive) { - int skill = RPGElements.getLevel(player, SkillList.provisioning); - chance += (int) ((float) skill / 4); - } - boolean success = (rand.nextFloat() * 100) < chance; - ItemStack creation = success ? result.copy() : new ItemStack(FoodListMF.burnt_food); - dropItem(player, creation); - SkillList.provisioning.addXP(player, success ? 2 : 1); - return true; - } - } - return false; - } - - public void dropItem(EntityPlayer player, ItemStack item) { - EntityItem drop = new EntityItem(worldObj, player.posX, player.posY, player.posZ, item); - drop.delayBeforeCanPickup = 0; - drop.motionX = drop.motionY = drop.motionZ = 0; - worldObj.spawnEntityInWorld(drop); - } - - public boolean hasBlockAbove() { - if (worldObj == null) - return false; - - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); - if (tile != null && tile instanceof IHeatUser) { - return ((IHeatUser) tile).canAccept(this); - } - - return false; - } + private final int maxFuel = 12000; // 10 minutes + public int fuel = 0; + private float charcoal = 0; + private int ticksExisted; + private Random rand = new Random(); + + /** + * Gets the burn time + *

+ * Wood tools and plank item are 1 minute sticks and saplings are 30seconds + */ + public static int getItemBurnTime(ItemStack input) { + if (input == null) { + return 0; + } else { + Item i = input.getItem(); + if (i == Items.stick) + return 600;// 30Sec + if (i == ComponentListMF.plank || i == ComponentListMF.plank_cut) { + return (int) (200 * CustomToolHelper.getBurnModifier(input)); + } + if (i == ComponentListMF.plank_pane) { + return (int) (600 * CustomToolHelper.getBurnModifier(input)); + } + + return 0; + } + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (worldObj.isRemote) { + if (isBurning()) { + fuel--; + } + return; + } + + ++ticksExisted; + if (isLit()) { + if (isWet()) { + extinguish(Blocks.water, 0); + return; + } + + if (fuel > 0) { + fuel--; + charcoal += (0.25F / 20F / 60F); + } + + if (fuel <= 0) { + setLit(false); + } + } else if (fuel > 0 && ticksExisted % 10 == 0) { + tryLight(); + } + } + + private boolean isWet() { + if (isWater(-1, 0, 0) || isWater(1, 0, 0) || isWater(0, 0, -1) || isWater(0, 0, 1) || isWater(0, 1, 0)) { + return true; + } + + return worldObj.canLightningStrikeAt(xCoord, yCoord + 1, zCoord); + } + + public int getCharcoalDrop() { + return (int) (Math.floor(charcoal)); + } + + public boolean isBurning() { + return isLit() && fuel > 0; + } + + public boolean isLit() { + return worldObj.getBlockMetadata(xCoord, yCoord, zCoord) == 1; + } + + public void setLit(boolean lit) { + if (worldObj != null) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, lit ? 1 : 0, 2); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + ticksExisted = 0; + } + + private void tryLight() { + if (isFire(-1, 0, 0) || isFire(1, 0, 0) || isFire(0, 0, -1) || isFire(0, 0, 1) || isFire(0, -1, 0) + || isFire(0, 1, 0)) { + setLit(true); + } + } + + private boolean isFire(int x, int y, int z) { + return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z).getMaterial() == Material.fire; + } + + private boolean isWater(int x, int y, int z) { + return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z).getMaterial() == Material.water; + } + + public boolean addFuel(ItemStack input) { + int amount = getItemBurnTime(input); + if (amount > 0 && fuel < maxFuel) { + fuel += amount; + if (fuel > maxFuel) { + fuel = maxFuel; + } + return true; + } + return false; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("fuel", fuel); + nbt.setInteger("ticksExisted", ticksExisted); + nbt.setFloat("charcoal", charcoal); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + setLit(nbt.getBoolean("isLit")); + fuel = nbt.getInteger("fuel"); + ticksExisted = nbt.getInteger("ticksExisted"); + charcoal = nbt.getFloat("charcoal"); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("fuel", fuel); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, tag); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) { + fuel = packet.func_148857_g().getInteger("fuel"); + } + + @Override + public boolean canPlaceAbove() { + return true; + } + + @Override + public int getHeat() { + if (!isBurning()) { + return 0; + } + return Functions.getIntervalWave1_i(ticksExisted, 30, 100, 200);// 100*-300* + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldShowMetre() { + return fuel > 0; + } + + @Override + @SideOnly(Side.CLIENT) + public int getMetreScale(int width) { + return this.fuel * width / (maxFuel); + } + + @Override + @SideOnly(Side.CLIENT) + public String getLocalisedName() { + int seconds = (int) Math.floor(fuel / 20); + int mins = (int) Math.floor(seconds / 60); + seconds -= mins * 60; + + String s = ""; + if (seconds < 10) { + s += "0"; + } + + return "150C " + StatCollector.translateToLocal("forge.fuel.name") + " " + mins + ":" + s + seconds; + } + + public void extinguish(Block block, int meta) { + worldObj.playSoundEffect(xCoord + 0.5F, yCoord + 0.25F, zCoord + 0.5F, "random.fizz", 0.4F, + 2.0F + this.rand.nextFloat() * 0.4F); + worldObj.spawnParticle("largesmoke", xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 0.0D, 0.0D, 0.0D); + worldObj.spawnParticle("tilecrack_" + block + "_" + meta, xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 0.0D, + 0.0D, 0.0D); + + setLit(false); + } + + public boolean tryCook(EntityPlayer player, ItemStack held) { + if (held.getItem() instanceof ItemFood) { + player.swingItem(); + if (worldObj.isRemote) { + return false; + } + ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(held); + if (result != null) { + if (rand.nextInt(10) != 0) { + return false; + } + float chance = 75F; + if (RPGElements.isSystemActive) { + int skill = RPGElements.getLevel(player, SkillList.provisioning); + chance += (int) ((float) skill / 4); + } + boolean success = (rand.nextFloat() * 100) < chance; + ItemStack creation = success ? result.copy() : new ItemStack(FoodListMF.burnt_food); + dropItem(player, creation); + SkillList.provisioning.addXP(player, success ? 2 : 1); + return true; + } + } + return false; + } + + public void dropItem(EntityPlayer player, ItemStack item) { + EntityItem drop = new EntityItem(worldObj, player.posX, player.posY, player.posZ, item); + drop.delayBeforeCanPickup = 0; + drop.motionX = drop.motionY = drop.motionZ = 0; + worldObj.spawnEntityInWorld(drop); + } + + public boolean hasBlockAbove() { + if (worldObj == null) + return false; + + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + if (tile != null && tile instanceof IHeatUser) { + return ((IHeatUser) tile).canAccept(this); + } + + return false; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java index 5b4c4eaf..7af3b312 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java @@ -13,8 +13,8 @@ import minefantasy.mf2.block.refining.BlockForge; import minefantasy.mf2.item.heatable.ItemHeated; import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.network.packet.ForgePacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.ForgePacket; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -30,548 +30,535 @@ import java.util.Random; public class TileEntityForge extends TileEntity implements IInventory, IBasicMetre, IHeatSource, IBellowsUseable { - private ItemStack[] inv = new ItemStack[1]; - public float fuel; - public float maxFuel = 6000;// 5m - public float temperature, fuelTemperature; - public static final float maxTemperature = 5000; - private Random rand = new Random(); - private int ticksExisted; - public float dragonHeartPower = 0F; - public String texTypeForRender = "stone"; - private boolean isBurning = false; - public int workableState = 0; - - public TileEntityForge(Block block, String type) { - texTypeForRender = type; - blockType = block; - blockMetadata = 0; - } - - public TileEntityForge() { - } - - @Override - public void updateEntity() { - ++ticksExisted; - - if (worldObj.isRemote) - return; - - if (justShared > 0) - --justShared; - super.updateEntity(); - - if (ticksExisted % 20 == 0) { - ItemStack item = getStackInSlot(0); - if (item != null && !worldObj.isRemote) { - modifyItem(item, 0); - } - syncData(); - } - if (ticksExisted % 10 == 0) { - shareTemp(); - } - - if (!isLit() && !worldObj.isRemote) { - if (temperature > 0 && ticksExisted % 5 == 0) { - temperature = 0; - } - return; - } - tickFuel(); - if (fuel <= 0) { - this.extinguish(); - return; - } - isBurning = isBurning();// Check if it's burning - float maxTemp = isLit() ? (fuelTemperature + getUnderTemperature()) : 0; - - if (temperature < maxTemp) { - float amount = 2.0F; - temperature += amount; - if (temperature > maxTemp) { - temperature = maxTemp; - } - } else if (temperature > maxTemp && rand.nextInt(20) == 0) { - temperature -= 10; - } - - if (isBurning && temperature > 250 && rand.nextInt(20) == 0 && !isOutside()) { - int val = this.getTier() == 1 ? 3 : 1; - if (this.hasBlockAbove()) { - SmokeMechanics.emitSmokeIndirect(worldObj, xCoord, yCoord + 1, zCoord, val); - } else { - SmokeMechanics.emitSmokeIndirect(worldObj, xCoord, yCoord, zCoord, val); - } - } - maxFuel = getTier() == 1 ? 12000 : 6000; - } - - private boolean isOutside() { - for (int x = -1; x <= 1; x++) { - for (int y = -1; y <= 1; y++) { - if (!worldObj.canBlockSeeTheSky(xCoord + x, yCoord + 1, zCoord + y)) { - return false; - } - } - } - return true; - } - - public boolean isLit; - - private void shareTemp() { - isLit = isLit(); - shareTo(-1, 0); - shareTo(1, 0); - shareTo(0, -1); - shareTo(0, 1); - } - - private void shareTo(int x, int z) { - if (fuel <= 0) - return; - - int share = 2; - TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord, zCoord + z); - if (tile == null) - return; - - if (tile instanceof TileEntityForge) { - TileEntityForge forge = (TileEntityForge) tile; - - if (isLit && !forge.isLit && forge.fuel > 0) { - forge.fireUpForge(); - } - if (!forge.isBurning() && temperature > 1) { - forge.temperature = 1; - } - if (forge.temperature < (temperature - share)) { - forge.temperature += share; - temperature -= share; - } - share = 1200; - if (forge.fuel < (fuel - share)) { - forge.fuel += share; - fuel -= share; - } - } - } - - private void tickFuel() { - if (fuel > 0) { - fuel -= 0.2F; - } - - if (fuel < 0) - fuel = 0; - } - - private boolean isBurning() { - return fuel > 0 && temperature > 0; - } - - @SideOnly(Side.CLIENT) - private boolean shouldRenderFlame() { - return fuel > 0 && temperature > 1; - } - - private void modifyItem(ItemStack item, int slot) { - if (item.getItem() == ComponentListMF.hotItem) { - int temp = ItemHeated.getTemp(item); - if (temp > temperature) { - int i = (int) (temperature / 5F); - temp -= i; - } else { - int increase = (int) (temperature / (20F * getStackModifier(item.stackSize))); - if (temp >= (temperature - increase)) { - temp = (int) temperature; - } else { - temp += increase; - } - } - if (temp <= 0) { - // this.setInventorySlotContents(slot, ItemHeated.getItem(item)); - } else { - ItemHeated.setTemp(item, Math.max(0, temp)); - } - } else if (temperature > 0) { - this.setInventorySlotContents(slot, ItemHeated.createHotItem(item)); - - } - } - - private float getStackModifier(int stackSize) { - float mod = 1F + stackSize / 16F;// 1x to 5x - return mod; - } - - public int getTier() { - Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - if (block != null && block instanceof BlockForge) { - return ((BlockForge) block).tier; - } - return 0; - } - - public float getUnderTemperature() { - Block under = worldObj.getBlock(xCoord, yCoord - 1, zCoord); - - if (under.getMaterial() == Material.fire) { - return 50F; - } - if (under.getMaterial() == Material.lava) { - return 100F; - } - return 0F; - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setFloat("temperature", temperature); - nbt.setFloat("fuelTemperature", fuelTemperature); - nbt.setFloat("dragonHeartPower", dragonHeartPower); - nbt.setFloat("fuel", fuel); - nbt.setFloat("maxFuel", maxFuel); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inv.length; ++i) { - if (this.inv[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - temperature = nbt.getFloat("temperature"); - fuelTemperature = nbt.getFloat("fuelTemperature"); - dragonHeartPower = nbt.getFloat("dragonHeartPower"); - fuel = nbt.getFloat("fuel"); - maxFuel = nbt.getFloat("maxFuel"); - - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - } - // INVENTORY - - @Override - public int getSizeInventory() { - return inv.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return inv[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - onInventoryChanged(); - if (this.inv[slot] != null) { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } else { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) { - this.inv[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return inv[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - onInventoryChanged(); - inv[slot] = item; - } - - public void onInventoryChanged() { - } - - @Override - public String getInventoryName() { - return "gui.crucible.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - return true; - } - - public BlockForge getActiveBlock() { - if (worldObj == null) - return null; - - Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - - if (block != null && block instanceof BlockForge) { - return (BlockForge) block; - } - return null; - } - - @SideOnly(Side.CLIENT) - public String getTextureName() { - BlockForge forge = getActiveBlock(); - if (forge == null) - return "forge_" + texTypeForRender; - - return "forge_" + forge.type + (shouldRenderFlame() ? "_active" : ""); - } - - public boolean hasFuel() { - return worldObj != null && fuel > 0; - } - - public boolean isLit() { - BlockForge forge = getActiveBlock(); - return forge != null && forge.isActive; - } - - /** - * Puts the fire out - */ - public void extinguish() { - if (getTier() == 1) { - return; - } - BlockForge.updateFurnaceBlockState(false, worldObj, xCoord, yCoord, zCoord); - } - - /** - * Fires the forge up - */ - public void fireUpForge() { - if (getTier() == 1) { - return; - } - BlockForge.updateFurnaceBlockState(true, worldObj, xCoord, yCoord, zCoord); - } - - public float getBellowsEffect() { - return getTier() == 1 ? 2.0F : 1.5F; - } - - private float getBellowsMax() { - return Math.min(fuelTemperature * getBellowsEffect(), getMaxTemp()); - } - - public int getMaxTemp() { - return (int) maxTemperature; - } - - public boolean addFuel(ForgeFuel stats, boolean hand, int tier) { - maxFuel = tier == 1 ? 12000 : 6000; - - boolean hasUsed = false; - - if (stats.baseHeat > this.fuelTemperature) // uses if hotter - { - hasUsed = true; - } - int room_left = (int) (maxFuel - fuel); - if (hand && room_left > 0) { - hasUsed = true; - fuel = Math.min(fuel + stats.duration, maxFuel);// Fill as much as can fit - } else if (!hand && (fuel == 0 || room_left >= stats.duration))// For hoppers: only fill when there's full room - { - hasUsed = true; - fuel = Math.min(fuel + stats.duration, maxFuel);// Fill as much as can fit - } - if (stats.doesLight && !isLit()) { - fireUpForge(); - hasUsed = true; - } - if (hasUsed) { - fuelTemperature = stats.baseHeat; - } - return hasUsed; - } - - @Override - public int getMetreScale(int size) { - if (shouldShowMetre()) { - return (int) (size / maxFuel * fuel); - } - return 0; - } - - public int[] getTempsScaled(int size) { - int[] temps = new int[2]; - if (shouldShowMetre()) { - temps[0] = (int) (size / this.maxTemperature * this.temperature); - temps[1] = (int) (size / this.maxTemperature * this.fuelTemperature); - } - if (temps[0] > size) - temps[0] = size; - if (temps[1] > size) - temps[1] = size; - return temps; - } - - @Override - public boolean shouldShowMetre() { - return true; - } - - @Override - public String getLocalisedName() { - return (int) this.temperature + "C " + StatCollector.translateToLocal( - workableState >= 2 ? "state.unstable" : workableState == 1 ? "state.workable" : "forge.fuel.name"); - } - - public boolean[] showSides() { - if (worldObj == null) { - return new boolean[] { true, true, true, true }; - } - boolean front = !isForge(0, 0, 1); - boolean left = !isForge(-1, 0, 0); - boolean right = !isForge(1, 0, 0); - boolean back = !isForge(0, 0, -1); - - return new boolean[] { front, left, right, back }; - } - - private boolean isForge(int x, int y, int z) { - return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) instanceof BlockForge; - } - - private void syncData() { - - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new ForgePacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + public static final float maxTemperature = 5000; + public float fuel; + public float maxFuel = 6000;// 5m + public float temperature, fuelTemperature; + public float dragonHeartPower = 0F; + public String texTypeForRender = "stone"; + public int workableState = 0; + public boolean isLit; + public int exactTemperature; + int justShared; + private ItemStack[] inv = new ItemStack[1]; + private Random rand = new Random(); + private int ticksExisted; + private boolean isBurning = false; + + public TileEntityForge(Block block, String type) { + texTypeForRender = type; + blockType = block; + blockMetadata = 0; + } + + public TileEntityForge() { + } + + @Override + public void updateEntity() { + ++ticksExisted; + + if (worldObj.isRemote) + return; + + if (justShared > 0) + --justShared; + super.updateEntity(); + + if (ticksExisted % 20 == 0) { + ItemStack item = getStackInSlot(0); + if (item != null && !worldObj.isRemote) { + modifyItem(item, 0); + } + syncData(); + } + if (ticksExisted % 10 == 0) { + shareTemp(); + } + + if (!isLit() && !worldObj.isRemote) { + if (temperature > 0 && ticksExisted % 5 == 0) { + temperature = 0; + } + return; + } + tickFuel(); + if (fuel <= 0) { + this.extinguish(); + return; + } + isBurning = isBurning();// Check if it's burning + float maxTemp = isLit() ? (fuelTemperature + getUnderTemperature()) : 0; + + if (temperature < maxTemp) { + float amount = 2.0F; + temperature += amount; + if (temperature > maxTemp) { + temperature = maxTemp; + } + } else if (temperature > maxTemp && rand.nextInt(20) == 0) { + temperature -= 10; + } + + if (isBurning && temperature > 250 && rand.nextInt(20) == 0 && !isOutside()) { + int val = this.getTier() == 1 ? 3 : 1; + if (this.hasBlockAbove()) { + SmokeMechanics.emitSmokeIndirect(worldObj, xCoord, yCoord + 1, zCoord, val); + } else { + SmokeMechanics.emitSmokeIndirect(worldObj, xCoord, yCoord, zCoord, val); + } + } + maxFuel = getTier() == 1 ? 12000 : 6000; + } + + private boolean isOutside() { + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + if (!worldObj.canBlockSeeTheSky(xCoord + x, yCoord + 1, zCoord + y)) { + return false; + } + } + } + return true; + } + + private void shareTemp() { + isLit = isLit(); + shareTo(-1, 0); + shareTo(1, 0); + shareTo(0, -1); + shareTo(0, 1); + } + + private void shareTo(int x, int z) { + if (fuel <= 0) + return; + + int share = 2; + TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord, zCoord + z); + if (tile == null) + return; + + if (tile instanceof TileEntityForge) { + TileEntityForge forge = (TileEntityForge) tile; + + if (isLit && !forge.isLit && forge.fuel > 0) { + forge.fireUpForge(); + } + if (!forge.isBurning() && temperature > 1) { + forge.temperature = 1; + } + if (forge.temperature < (temperature - share)) { + forge.temperature += share; + temperature -= share; + } + share = 1200; + if (forge.fuel < (fuel - share)) { + forge.fuel += share; + fuel -= share; + } + } + } + + private void tickFuel() { + if (fuel > 0) { + fuel -= 0.2F; + } + + if (fuel < 0) + fuel = 0; + } + + private boolean isBurning() { + return fuel > 0 && temperature > 0; + } + + @SideOnly(Side.CLIENT) + private boolean shouldRenderFlame() { + return fuel > 0 && temperature > 1; + } + + private void modifyItem(ItemStack item, int slot) { + if (item.getItem() == ComponentListMF.hotItem) { + int temp = ItemHeated.getTemp(item); + if (temp > temperature) { + int i = (int) (temperature / 5F); + temp -= i; + } else { + int increase = (int) (temperature / (20F * getStackModifier(item.stackSize))); + if (temp >= (temperature - increase)) { + temp = (int) temperature; + } else { + temp += increase; + } + } + if (temp <= 0) { + // this.setInventorySlotContents(slot, ItemHeated.getItem(item)); + } else { + ItemHeated.setTemp(item, Math.max(0, temp)); + } + } else if (temperature > 0) { + this.setInventorySlotContents(slot, ItemHeated.createHotItem(item)); + + } + } + + private float getStackModifier(int stackSize) { + float mod = 1F + stackSize / 16F;// 1x to 5x + return mod; + } + + public int getTier() { + Block block = worldObj.getBlock(xCoord, yCoord, zCoord); + if (block != null && block instanceof BlockForge) { + return ((BlockForge) block).tier; + } + return 0; + } + + public float getUnderTemperature() { + Block under = worldObj.getBlock(xCoord, yCoord - 1, zCoord); + + if (under.getMaterial() == Material.fire) { + return 50F; + } + if (under.getMaterial() == Material.lava) { + return 100F; + } + return 0F; + } + // INVENTORY + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setFloat("temperature", temperature); + nbt.setFloat("fuelTemperature", fuelTemperature); + nbt.setFloat("dragonHeartPower", dragonHeartPower); + nbt.setFloat("fuel", fuel); + nbt.setFloat("maxFuel", maxFuel); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + temperature = nbt.getFloat("temperature"); + fuelTemperature = nbt.getFloat("fuelTemperature"); + dragonHeartPower = nbt.getFloat("dragonHeartPower"); + fuel = nbt.getFloat("fuel"); + maxFuel = nbt.getFloat("maxFuel"); + + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + } + + @Override + public int getSizeInventory() { + return inv.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + onInventoryChanged(); + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return inv[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + onInventoryChanged(); + inv[slot] = item; + } + + public void onInventoryChanged() { + } + + @Override + public String getInventoryName() { + return "gui.crucible.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + return true; + } + + public BlockForge getActiveBlock() { + if (worldObj == null) + return null; + + Block block = worldObj.getBlock(xCoord, yCoord, zCoord); + + if (block != null && block instanceof BlockForge) { + return (BlockForge) block; + } + return null; + } + + @SideOnly(Side.CLIENT) + public String getTextureName() { + BlockForge forge = getActiveBlock(); + if (forge == null) + return "forge_" + texTypeForRender; + + return "forge_" + forge.type + (shouldRenderFlame() ? "_active" : ""); + } + + public boolean hasFuel() { + return worldObj != null && fuel > 0; + } + + public boolean isLit() { + BlockForge forge = getActiveBlock(); + return forge != null && forge.isActive; + } + + /** + * Puts the fire out + */ + public void extinguish() { + if (getTier() == 1) { + return; + } + BlockForge.updateFurnaceBlockState(false, worldObj, xCoord, yCoord, zCoord); + } + + /** + * Fires the forge up + */ + public void fireUpForge() { + if (getTier() == 1) { + return; + } + BlockForge.updateFurnaceBlockState(true, worldObj, xCoord, yCoord, zCoord); + } + + public float getBellowsEffect() { + return getTier() == 1 ? 2.0F : 1.5F; + } + + private float getBellowsMax() { + return Math.min(fuelTemperature * getBellowsEffect(), getMaxTemp()); + } + + public int getMaxTemp() { + return (int) maxTemperature; + } + + public boolean addFuel(ForgeFuel stats, boolean hand, int tier) { + maxFuel = tier == 1 ? 12000 : 6000; + + boolean hasUsed = false; + + if (stats.baseHeat > this.fuelTemperature) // uses if hotter + { + hasUsed = true; + } + int room_left = (int) (maxFuel - fuel); + if (hand && room_left > 0) { + hasUsed = true; + fuel = Math.min(fuel + stats.duration, maxFuel);// Fill as much as can fit + } else if (!hand && (fuel == 0 || room_left >= stats.duration))// For hoppers: only fill when there's full room + { + hasUsed = true; + fuel = Math.min(fuel + stats.duration, maxFuel);// Fill as much as can fit + } + if (stats.doesLight && !isLit()) { + fireUpForge(); + hasUsed = true; + } + if (hasUsed) { + fuelTemperature = stats.baseHeat; + } + return hasUsed; + } + + @Override + public int getMetreScale(int size) { + if (shouldShowMetre()) { + return (int) (size / maxFuel * fuel); + } + return 0; + } + + public int[] getTempsScaled(int size) { + int[] temps = new int[2]; + if (shouldShowMetre()) { + temps[0] = (int) (size / this.maxTemperature * this.temperature); + temps[1] = (int) (size / this.maxTemperature * this.fuelTemperature); + } + if (temps[0] > size) + temps[0] = size; + if (temps[1] > size) + temps[1] = size; + return temps; + } + + @Override + public boolean shouldShowMetre() { + return true; + } + + @Override + public String getLocalisedName() { + return (int) this.temperature + "C " + StatCollector.translateToLocal( + workableState >= 2 ? "state.unstable" : workableState == 1 ? "state.workable" : "forge.fuel.name"); + } + + public boolean[] showSides() { + if (worldObj == null) { + return new boolean[]{true, true, true, true}; + } + boolean front = !isForge(0, 0, 1); + boolean left = !isForge(-1, 0, 0); + boolean right = !isForge(1, 0, 0); + boolean back = !isForge(0, 0, -1); + + return new boolean[]{front, left, right, back}; + } + + private boolean isForge(int x, int y, int z) { + return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) instanceof BlockForge; + } + + private void syncData() { + + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new ForgePacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); /* - List players = ((WorldServer) worldObj).playerEntities; + List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new ForgePacket(this).generatePacket()); } */ - } - - int justShared; - - public void onUsedWithBellows(float powerLevel) { - if (!isBurning()) - return; - if (justShared > 0) { - return; - } - if (fuel <= 0) { - return; - } - float max = getBellowsMax(); - justShared = 5; - if (temperature < max) { - temperature = Math.min(max, temperature + (500F * powerLevel)); - } - - for (int a = 0; a < 10; a++) { - worldObj.spawnParticle("flame", xCoord + (rand.nextDouble() * 0.8D) + 0.1D, yCoord + 0.4D, - zCoord + (rand.nextDouble() * 0.8D) + 0.1D, 0, 0.01, 0); - } - - pumpBellows(-1, 0, powerLevel * 0.9F); - pumpBellows(0, -1, powerLevel * 0.9F); - pumpBellows(0, 1, powerLevel * 0.9F); - pumpBellows(1, 0, powerLevel * 0.9F); - - } - - private void pumpBellows(int x, int z, float pump) { - if (fuel <= 0) - return; - - // int share = 2; - TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord, zCoord + z); - if (tile == null) - return; - - if (tile instanceof TileEntityForge) { - TileEntityForge forge = (TileEntityForge) tile; - forge.onUsedWithBellows(pump); - } - } - - public float getBlockTemperature() { - if (this.isLit) { - return temperature; - } - return 0; - } - - public boolean hasBlockAbove() { - if (worldObj == null) - return false; - - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); - if (tile != null && tile instanceof IHeatUser) { - return ((IHeatUser) tile).canAccept(this); - } - - return tile != null && tile instanceof TileEntityFurnace; - } + } + + public void onUsedWithBellows(float powerLevel) { + if (!isBurning()) + return; + if (justShared > 0) { + return; + } + if (fuel <= 0) { + return; + } + float max = getBellowsMax(); + justShared = 5; + if (temperature < max) { + temperature = Math.min(max, temperature + (500F * powerLevel)); + } + + for (int a = 0; a < 10; a++) { + worldObj.spawnParticle("flame", xCoord + (rand.nextDouble() * 0.8D) + 0.1D, yCoord + 0.4D, + zCoord + (rand.nextDouble() * 0.8D) + 0.1D, 0, 0.01, 0); + } + + pumpBellows(-1, 0, powerLevel * 0.9F); + pumpBellows(0, -1, powerLevel * 0.9F); + pumpBellows(0, 1, powerLevel * 0.9F); + pumpBellows(1, 0, powerLevel * 0.9F); + + } + + private void pumpBellows(int x, int z, float pump) { + if (fuel <= 0) + return; + + // int share = 2; + TileEntity tile = worldObj.getTileEntity(xCoord + x, yCoord, zCoord + z); + if (tile == null) + return; + + if (tile instanceof TileEntityForge) { + TileEntityForge forge = (TileEntityForge) tile; + forge.onUsedWithBellows(pump); + } + } + + public float getBlockTemperature() { + if (this.isLit) { + return temperature; + } + return 0; + } /* * private void averageAllItems() { /* int temp = 0; int items = 0; @@ -582,48 +569,58 @@ public boolean hasBlockAbove() { * } */ - public boolean tryAddHeatable(ItemStack held) { - ItemStack contents = inv[0]; - if (contents == null) { - ItemStack placed = held.copy(); - placed.stackSize = 1; - setInventorySlotContents(0, placed); - return true; - } else if (contents.getItem() instanceof ItemHeated) { - ItemStack hot = Heatable.getItem(contents); - if (hot != null && hot.isItemEqual(held) && ItemStack.areItemStackTagsEqual(held, hot) - && contents.stackSize < contents.getMaxStackSize()) { - contents.stackSize++; - return true; - } - } - return false; - } - - public int getWorkableState() { - if (worldObj == null || worldObj.isRemote) { - return workableState; - } - if (this.inv[0] != null) { - return Heatable.getHeatableStage(inv[0]); - } - return 0; - } - - @Override - public boolean canPlaceAbove() { - return true; - } - - public int exactTemperature; - - @Override - public int getHeat() { - if (worldObj.isRemote) { - return exactTemperature; - } - int mx = (int) (temperature * 1.2F); - int mn = (int) (temperature * 0.8F); - return Functions.getIntervalWave1_i(ticksExisted, 400, mx, mn); - } + public boolean hasBlockAbove() { + if (worldObj == null) + return false; + + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + if (tile != null && tile instanceof IHeatUser) { + return ((IHeatUser) tile).canAccept(this); + } + + return tile != null && tile instanceof TileEntityFurnace; + } + + public boolean tryAddHeatable(ItemStack held) { + ItemStack contents = inv[0]; + if (contents == null) { + ItemStack placed = held.copy(); + placed.stackSize = 1; + setInventorySlotContents(0, placed); + return true; + } else if (contents.getItem() instanceof ItemHeated) { + ItemStack hot = Heatable.getItem(contents); + if (hot != null && hot.isItemEqual(held) && ItemStack.areItemStackTagsEqual(held, hot) + && contents.stackSize < contents.getMaxStackSize()) { + contents.stackSize++; + return true; + } + } + return false; + } + + public int getWorkableState() { + if (worldObj == null || worldObj.isRemote) { + return workableState; + } + if (this.inv[0] != null) { + return Heatable.getHeatableStage(inv[0]); + } + return 0; + } + + @Override + public boolean canPlaceAbove() { + return true; + } + + @Override + public int getHeat() { + if (worldObj.isRemote) { + return exactTemperature; + } + int mx = (int) (temperature * 1.2F); + int mn = (int) (temperature * 0.8F); + return Functions.getIntervalWave1_i(ticksExisted, 400, mx, mn); + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java index 343889d4..a95b896c 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.crafting.refine.QuernRecipes; @@ -14,248 +12,248 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; +import java.util.Random; + public class TileEntityQuern extends TileEntity implements IInventory, ISidedInventory { - private ItemStack[] inv = new ItemStack[3]; - - private Random rand = new Random(); - - @Override - public void updateEntity() { - int max = getMaxRevs(); - int levels = max / 4; - - if (postUseTicks > 0) { - --postUseTicks; - } - if (postUseTicks > 0 - || !((turnAngle == levels || turnAngle == levels * 2 || turnAngle == levels * 3 || turnAngle == 0))) { - this.turnAngle++; - if (!worldObj.isRemote && (turnAngle == levels || turnAngle == levels * 2 || turnAngle == levels * 3 - || turnAngle == max)) { - worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.quern", 1.0F, 1.0F); - onRevolutionComplete(); - } - if (turnAngle >= max) { - turnAngle = 0; - } - } - } - - public static final int getMaxRevs() { - return 100; - } - - public boolean onUse(EntityPlayer user) { - if (!worldObj.isRemote && turnAngle == 0 && postUseTicks == 0) { - worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.quern", 1.0F, 1.0F); - } - this.postUseTicks = 10; - return true; - } - - public boolean onRevolutionComplete() { - QuernRecipes result = this.getResult(inv[0]); - if (result != null && inv[1] != null && result.tier <= getTier()) { - ItemStack craft = result.result; - if (canFitResult(craft)) { - if (!worldObj.isRemote) { - return tryCraft(craft); - } else { - worldObj.spawnParticle("smoke", xCoord + 0.5F, yCoord + 1F, zCoord + 0.5F, 0F, 0.2F, 0F); - return true; - } - } - } - - return false; - } - - private int getTier() { - return 0; - } - - private boolean canFitResult(ItemStack result) { - ItemStack out = inv[2]; - if (out == null) - return true; - - if (!out.isItemEqual(result)) - return false; - if (out.stackSize + result.stackSize > result.getMaxStackSize()) - return false; - - return true; - } - - private boolean tryCraft(ItemStack result) { - worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.craftprimitive", 0.5F, 1.2F); - /* + public int turnAngle; + private ItemStack[] inv = new ItemStack[3]; + private Random rand = new Random(); + private int postUseTicks; + + public static final int getMaxRevs() { + return 100; + } + + public static boolean isInput(ItemStack input) { + return getResult(input) != null; + } + + private static QuernRecipes getResult(ItemStack input) { + return QuernRecipes.getResult(input); + } + + public static boolean isPot(ItemStack item) { + return item != null && item.getItem() == ComponentListMF.clay_pot; + } + + @Override + public void updateEntity() { + int max = getMaxRevs(); + int levels = max / 4; + + if (postUseTicks > 0) { + --postUseTicks; + } + if (postUseTicks > 0 + || !((turnAngle == levels || turnAngle == levels * 2 || turnAngle == levels * 3 || turnAngle == 0))) { + this.turnAngle++; + if (!worldObj.isRemote && (turnAngle == levels || turnAngle == levels * 2 || turnAngle == levels * 3 + || turnAngle == max)) { + worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.quern", 1.0F, 1.0F); + onRevolutionComplete(); + } + if (turnAngle >= max) { + turnAngle = 0; + } + } + } + + public boolean onUse(EntityPlayer user) { + if (!worldObj.isRemote && turnAngle == 0 && postUseTicks == 0) { + worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.quern", 1.0F, 1.0F); + } + this.postUseTicks = 10; + return true; + } + + public boolean onRevolutionComplete() { + QuernRecipes result = this.getResult(inv[0]); + if (result != null && inv[1] != null && result.tier <= getTier()) { + ItemStack craft = result.result; + if (canFitResult(craft)) { + if (!worldObj.isRemote) { + return tryCraft(craft); + } else { + worldObj.spawnParticle("smoke", xCoord + 0.5F, yCoord + 1F, zCoord + 0.5F, 0F, 0.2F, 0F); + return true; + } + } + } + + return false; + } + + private int getTier() { + return 0; + } + + private boolean canFitResult(ItemStack result) { + ItemStack out = inv[2]; + if (out == null) + return true; + + if (!out.isItemEqual(result)) + return false; + if (out.stackSize + result.stackSize > result.getMaxStackSize()) + return false; + + return true; + } + + private boolean tryCraft(ItemStack result) { + worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.craftprimitive", 0.5F, 1.2F); + /* * if(rand.nextFloat() > 0.20F)//20% success rate { * worldObj.playSoundEffect(xCoord, yCoord, zCoord, "dig.gravel", 1.0F, 0.5F); * return false; } else */ - { - this.decrStackSize(0, 1); - this.decrStackSize(1, 1); - - ItemStack out = inv[2]; - if (out == null) { - this.setInventorySlotContents(2, result.copy()); - } else { - out.stackSize += result.stackSize; - } - return true; - } - } - - @Override - public int getSizeInventory() { - return inv.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return inv[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - if (this.inv[slot] != null) { - ItemStack itemstack; - - if (this.inv[slot].stackSize <= num) { - itemstack = this.inv[slot]; - this.inv[slot] = null; - return itemstack; - } else { - itemstack = this.inv[slot].splitStack(num); - - if (this.inv[slot].stackSize == 0) { - this.inv[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return inv[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - inv[slot] = item; - } - - @Override - public String getInventoryName() { - return "gui.quern.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - if (item != null && getResult(item) != null) { - return slot == 0; - } - if (item != null && item.getItem() == ComponentListMF.clay_pot) { - return slot == 1; - } - return false; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inv.length; ++i) { - if (this.inv[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - } - - public static boolean isInput(ItemStack input) { - return getResult(input) != null; - } - - private static QuernRecipes getResult(ItemStack input) { - return QuernRecipes.getResult(input); - } - - @SideOnly(Side.CLIENT) - public String getTextureName() { - return "quern_basic"; - } - - public static boolean isPot(ItemStack item) { - return item != null && item.getItem() == ComponentListMF.clay_pot; - } - - private int postUseTicks; - public int turnAngle; - - @Override - public int[] getAccessibleSlotsFromSide(int side) { - return new int[] { 0, 1, 2 }; - } - - @Override - public boolean canInsertItem(int slot, ItemStack item, int side) { - return isItemValidForSlot(slot, item); - } - - @Override - public boolean canExtractItem(int slot, ItemStack item, int side) { - return slot == 2; - } + { + this.decrStackSize(0, 1); + this.decrStackSize(1, 1); + + ItemStack out = inv[2]; + if (out == null) { + this.setInventorySlotContents(2, result.copy()); + } else { + out.stackSize += result.stackSize; + } + return true; + } + } + + @Override + public int getSizeInventory() { + return inv.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + if (this.inv[slot] != null) { + ItemStack itemstack; + + if (this.inv[slot].stackSize <= num) { + itemstack = this.inv[slot]; + this.inv[slot] = null; + return itemstack; + } else { + itemstack = this.inv[slot].splitStack(num); + + if (this.inv[slot].stackSize == 0) { + this.inv[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return inv[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + inv[slot] = item; + } + + @Override + public String getInventoryName() { + return "gui.quern.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (item != null && getResult(item) != null) { + return slot == 0; + } + if (item != null && item.getItem() == ComponentListMF.clay_pot) { + return slot == 1; + } + return false; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + } + + @SideOnly(Side.CLIENT) + public String getTextureName() { + return "quern_basic"; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[]{0, 1, 2}; + } + + @Override + public boolean canInsertItem(int slot, ItemStack item, int side) { + return isItemValidForSlot(slot, item); + } + + @Override + public boolean canExtractItem(int slot, ItemStack item, int side) { + return slot == 2; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java index 2307fab5..320a6c68 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityResearch.java @@ -6,8 +6,8 @@ import minefantasy.mf2.api.knowledge.ResearchArtefacts; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.network.packet.ResearchTablePacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.ResearchTablePacket; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; @@ -22,308 +22,306 @@ import java.util.Random; public class TileEntityResearch extends TileEntity implements IInventory, IBasicMetre { - private ItemStack[] items = new ItemStack[1]; - public float progress; - public float maxProgress; - public int researchID = -1; - - public boolean interact(EntityPlayer user) { - if (worldObj.isRemote) { - return true; - } - ArrayList research = this.getInfo(items[0]); - int result = canResearch(user, research); - - if (research != null && research.size() > 0 && result != 0) { - if (result == -1) { - if (!user.worldObj.isRemote) - user.addChatComponentMessage(new ChatComponentTranslation("research.noskill", new Object[0])); - return true; - } - maxProgress = getMaxTime(); - if (maxProgress > 0) { - addProgress(user); - - if (progress >= maxProgress) { - addResearch(research, user); - progress = 0; - } - - return true; - } - } else { - if (result == 0) { - if (!user.worldObj.isRemote) - user.addChatComponentMessage(new ChatComponentTranslation("research.null", new Object[0])); - } - progress = 0; - } - - return items[0] != null; - } - - private void addResearch(ArrayList research, EntityPlayer user) { - for (int id = 0; id < research.size(); id++) { - InformationBase base = ResearchLogic.getResearch(research.get(id)); - if (base != null && !ResearchLogic.alreadyUsedArtefact(user, base, items[0]) - && ResearchLogic.canPurchase(user, base) && base.hasSkillsUnlocked(user)) { - int artefacts = ResearchArtefacts.useArtefact(items[0], base, user); - worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "minefantasy2:updateResearch", 1.0F, - 1.0F); - if (!user.worldObj.isRemote) { - Object name = new ChatComponentTranslation("knowledge." + base.getUnlocalisedName()); - if (artefacts == -1) { - user.addChatComponentMessage(new ChatComponentTranslation("research.finishResearch", name)); - } else { - user.addChatComponentMessage(new ChatComponentTranslation("research.addArtefact", name, - artefacts, base.getArtefactCount())); - } - } - return; - } - - } - } - - // 0 nothing, -1 for no skill, 1 for yes - private int canResearch(EntityPlayer user, ArrayList research) { - if (research == null) { - return 0; - } - int result = 0; - - for (int id = 0; id < research.size(); id++) { - InformationBase base = ResearchLogic.getResearch(research.get(id)); - if (base != null && !ResearchLogic.alreadyUsedArtefact(user, base, items[0])) { - if (ResearchLogic.canPurchase(user, base) && base.hasSkillsUnlocked(user)) { - return 1; - } else if (!ResearchLogic.hasInfoUnlocked(user, base)) { - result = -1; - } - } - } - return result; - } - - private float getMaxTime() { - int t = 10; - if (items[0] != null && items[0].getItem() instanceof IArtefact) { - return ((IArtefact) items[0].getItem()).getStudyTime(items[0]); - } - return this.getInfo(items[0]) != null ? t : 0; - } - - private void addProgress(EntityPlayer user) { - ItemStack held = user.getHeldItem(); - if (held != null && (held.getItem() == ComponentListMF.talisman_lesser - || held.getItem() == ComponentListMF.talisman_greater)) { - progress = maxProgress; - if (!user.capabilities.isCreativeMode && held.getItem() == ComponentListMF.talisman_lesser) { - --held.stackSize; - if (held.stackSize <= 0) { - user.setCurrentItemOrArmor(0, null); - } - } - return; - } - float efficiency = 1.0F; - if (user.swingProgress > 0) { - efficiency *= Math.max(0F, 1.0F - user.swingProgress); - } - worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "minefantasy2:block.flipPage", 1.0F, - rand.nextFloat() * 0.4F + 0.8F); - efficiency *= getEnvironmentBoost(); - progress += efficiency; - } - - private float getEnvironmentBoost() { - int books = 0; - for (int x = -8; x <= 8; x++) { - for (int y = -8; y <= 8; y++) { - for (int z = -8; z <= 8; z++) { - if (worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) == Blocks.bookshelf) { - ++books; - } - } - } - } - return 1.0F + (0.1F * books); - } - - private Random rand = new Random(); - - private int ticksExisted; - - @Override - public void updateEntity() { - super.updateEntity(); - - syncData(); - } - - public void syncData() { - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new ResearchTablePacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + public float progress; + public float maxProgress; + public int researchID = -1; + private ItemStack[] items = new ItemStack[1]; + private Random rand = new Random(); + private int ticksExisted; + + public static ArrayList getInfo(ItemStack item) { + if (item == null) { + return null; + } + + return ResearchArtefacts.getResearchNames(item); + } + + public static boolean canAccept(ItemStack item) { + ArrayList info = getInfo(item); + return info != null && info.size() > 0; + } + + public boolean interact(EntityPlayer user) { + if (worldObj.isRemote) { + return true; + } + ArrayList research = this.getInfo(items[0]); + int result = canResearch(user, research); + + if (research != null && research.size() > 0 && result != 0) { + if (result == -1) { + if (!user.worldObj.isRemote) + user.addChatComponentMessage(new ChatComponentTranslation("research.noskill", new Object[0])); + return true; + } + maxProgress = getMaxTime(); + if (maxProgress > 0) { + addProgress(user); + + if (progress >= maxProgress) { + addResearch(research, user); + progress = 0; + } + + return true; + } + } else { + if (result == 0) { + if (!user.worldObj.isRemote) + user.addChatComponentMessage(new ChatComponentTranslation("research.null", new Object[0])); + } + progress = 0; + } + + return items[0] != null; + } + + private void addResearch(ArrayList research, EntityPlayer user) { + for (int id = 0; id < research.size(); id++) { + InformationBase base = ResearchLogic.getResearch(research.get(id)); + if (base != null && !ResearchLogic.alreadyUsedArtefact(user, base, items[0]) + && ResearchLogic.canPurchase(user, base) && base.hasSkillsUnlocked(user)) { + int artefacts = ResearchArtefacts.useArtefact(items[0], base, user); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "minefantasy2:updateResearch", 1.0F, + 1.0F); + if (!user.worldObj.isRemote) { + Object name = new ChatComponentTranslation("knowledge." + base.getUnlocalisedName()); + if (artefacts == -1) { + user.addChatComponentMessage(new ChatComponentTranslation("research.finishResearch", name)); + } else { + user.addChatComponentMessage(new ChatComponentTranslation("research.addArtefact", name, + artefacts, base.getArtefactCount())); + } + } + return; + } + + } + } + + // 0 nothing, -1 for no skill, 1 for yes + private int canResearch(EntityPlayer user, ArrayList research) { + if (research == null) { + return 0; + } + int result = 0; + + for (int id = 0; id < research.size(); id++) { + InformationBase base = ResearchLogic.getResearch(research.get(id)); + if (base != null && !ResearchLogic.alreadyUsedArtefact(user, base, items[0])) { + if (ResearchLogic.canPurchase(user, base) && base.hasSkillsUnlocked(user)) { + return 1; + } else if (!ResearchLogic.hasInfoUnlocked(user, base)) { + result = -1; + } + } + } + return result; + } + + private float getMaxTime() { + int t = 10; + if (items[0] != null && items[0].getItem() instanceof IArtefact) { + return ((IArtefact) items[0].getItem()).getStudyTime(items[0]); + } + return this.getInfo(items[0]) != null ? t : 0; + } + + private void addProgress(EntityPlayer user) { + ItemStack held = user.getHeldItem(); + if (held != null && (held.getItem() == ComponentListMF.talisman_lesser + || held.getItem() == ComponentListMF.talisman_greater)) { + progress = maxProgress; + if (!user.capabilities.isCreativeMode && held.getItem() == ComponentListMF.talisman_lesser) { + --held.stackSize; + if (held.stackSize <= 0) { + user.setCurrentItemOrArmor(0, null); + } + } + return; + } + float efficiency = 1.0F; + if (user.swingProgress > 0) { + efficiency *= Math.max(0F, 1.0F - user.swingProgress); + } + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "minefantasy2:block.flipPage", 1.0F, + rand.nextFloat() * 0.4F + 0.8F); + efficiency *= getEnvironmentBoost(); + progress += efficiency; + } + + private float getEnvironmentBoost() { + int books = 0; + for (int x = -8; x <= 8; x++) { + for (int y = -8; y <= 8; y++) { + for (int z = -8; z <= 8; z++) { + if (worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z) == Blocks.bookshelf) { + ++books; + } + } + } + } + return 1.0F + (0.1F * books); + } + + @Override + public void updateEntity() { + super.updateEntity(); + + syncData(); + } + + public void syncData() { + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new ResearchTablePacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); /* - List players = ((WorldServer) worldObj).playerEntities; + List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new ResearchTablePacket(this).generatePacket()); } */ - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setInteger("researchID", researchID); - nbt.setInteger("ticksExisted", ticksExisted); - nbt.setFloat("progress", progress); - nbt.setFloat("maxProgress", maxProgress); - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.items[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - ticksExisted = nbt.getInteger("ticksExisted"); - researchID = nbt.getInteger("researchID"); - progress = nbt.getFloat("progress"); - maxProgress = nbt.getFloat("maxProgress"); - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.items = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.items.length) { - this.items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - } - - @Override - public int getSizeInventory() { - return items.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return items[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - if (this.items[slot] != null) { - ItemStack itemstack; - - if (this.items[slot].stackSize <= num) { - itemstack = this.items[slot]; - this.items[slot] = null; - return itemstack; - } else { - itemstack = this.items[slot].splitStack(num); - - if (this.items[slot].stackSize == 0) { - this.items[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return items[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - items[slot] = item; - } - - @Override - public String getInventoryName() { - return "gui.bombcraftmf.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - return canAccept(item); - } - - public static ArrayList getInfo(ItemStack item) { - if (item == null) { - return null; - } - - return ResearchArtefacts.getResearchNames(item); - } - - public static boolean canAccept(ItemStack item) { - ArrayList info = getInfo(item); - return info != null && info.size() > 0; - } - - @Override - public int getMetreScale(int size) { - if (maxProgress <= 0) { - return 0; - } - return (int) Math.min(size, Math.ceil(size / maxProgress * progress)); - } - - @Override - public boolean shouldShowMetre() { - return maxProgress > 0; - } - - @Override - public String getLocalisedName() { - return ""; - } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setInteger("researchID", researchID); + nbt.setInteger("ticksExisted", ticksExisted); + nbt.setFloat("progress", progress); + nbt.setFloat("maxProgress", maxProgress); + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.items.length; ++i) { + if (this.items[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.items[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + ticksExisted = nbt.getInteger("ticksExisted"); + researchID = nbt.getInteger("researchID"); + progress = nbt.getFloat("progress"); + maxProgress = nbt.getFloat("maxProgress"); + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.items = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.items.length) { + this.items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + } + + @Override + public int getSizeInventory() { + return items.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return items[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + if (this.items[slot] != null) { + ItemStack itemstack; + + if (this.items[slot].stackSize <= num) { + itemstack = this.items[slot]; + this.items[slot] = null; + return itemstack; + } else { + itemstack = this.items[slot].splitStack(num); + + if (this.items[slot].stackSize == 0) { + this.items[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return items[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + items[slot] = item; + } + + @Override + public String getInventoryName() { + return "gui.bombcraftmf.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + return canAccept(item); + } + + @Override + public int getMetreScale(int size) { + if (maxProgress <= 0) { + return 0; + } + return (int) Math.min(size, Math.ceil(size / maxProgress * progress)); + } + + @Override + public boolean shouldShowMetre() { + return maxProgress > 0; + } + + @Override + public String getLocalisedName() { + return ""; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java index 4926697b..47591d7e 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoad.java @@ -1,8 +1,8 @@ package minefantasy.mf2.block.tileentity; import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.network.packet.RoadPacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.RoadPacket; import net.minecraft.block.Block; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.entity.player.EntityPlayer; @@ -14,109 +14,109 @@ import java.util.Random; public class TileEntityRoad extends TileEntity { - public int[] surface = new int[] { 0, 0 }; - public boolean isLocked = false; - private int ticksExisted; - private Random rand = new Random(); - - public TileEntityRoad() { - } - - @Override - public void updateEntity() { - super.updateEntity(); - - ++ticksExisted; - if (!worldObj.isRemote) { - if (ticksExisted % 1200 == 0) { - sendPacketToClients(); - } - } else if (ticksExisted == 20) { - requestPacket(); - } - } - - public void setSurface(Block id, int meta) { - if (worldObj == null) { - return; - } - if (id == Blocks.grass) { - id = Blocks.dirt; - } - worldObj.playSoundEffect(xCoord, yCoord, zCoord, "dig.grass", 0.5F, 1.0F); - surface[0] = Block.getIdFromBlock(id); - surface[1] = meta; - sendPacketToClients(); - refreshSurface(); - } - - public void sendPacketToClients() { - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new RoadPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + public int[] surface = new int[]{0, 0}; + public boolean isLocked = false; + private int ticksExisted; + private Random rand = new Random(); + + public TileEntityRoad() { + } + + @Override + public void updateEntity() { + super.updateEntity(); + + ++ticksExisted; + if (!worldObj.isRemote) { + if (ticksExisted % 1200 == 0) { + sendPacketToClients(); + } + } else if (ticksExisted == 20) { + requestPacket(); + } + } + + public void setSurface(Block id, int meta) { + if (worldObj == null) { + return; + } + if (id == Blocks.grass) { + id = Blocks.dirt; + } + worldObj.playSoundEffect(xCoord, yCoord, zCoord, "dig.grass", 0.5F, 1.0F); + surface[0] = Block.getIdFromBlock(id); + surface[1] = meta; + sendPacketToClients(); + refreshSurface(); + } + + public void sendPacketToClients() { + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new RoadPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); /* - List players = ((WorldServer) worldObj).playerEntities; + List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new RoadPacket(this).generatePacket()); } */ - } - - public void requestPacket() { - if (!worldObj.isRemote) - return; - EntityPlayer player = MineFantasyII.proxy.getClientPlayer(); - if (player != null) { - ((EntityClientPlayerMP) player).sendQueue.addToSendQueue(new RoadPacket(this).request().generatePacket()); - } - } - - private boolean blockChange(int id, int meta) { - if (id != surface[0]) - return true; - if (meta != surface[1]) - return true; - - return false; - } - - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setIntArray("surface", surface); - nbt.setBoolean("isLocked", isLocked); - } - - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - surface = nbt.getIntArray("surface"); - isLocked = nbt.getBoolean("isLocked"); - } - - public int[] getSurface() { - return surface; - } - - public boolean canBuild() { - if (worldObj == null) { - return false; - } - return true; - } - - public void refreshSurface() { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - - public Block getBaseBlock() { - if (surface[0] <= 0) { - return Blocks.dirt; - } - Block block = Block.getBlockById(surface[0]); - return block != null ? block : Blocks.dirt; - } + } + + public void requestPacket() { + if (!worldObj.isRemote) + return; + EntityPlayer player = MineFantasyII.proxy.getClientPlayer(); + if (player != null) { + ((EntityClientPlayerMP) player).sendQueue.addToSendQueue(new RoadPacket(this).request().generatePacket()); + } + } + + private boolean blockChange(int id, int meta) { + if (id != surface[0]) + return true; + if (meta != surface[1]) + return true; + + return false; + } + + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setIntArray("surface", surface); + nbt.setBoolean("isLocked", isLocked); + } + + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + surface = nbt.getIntArray("surface"); + isLocked = nbt.getBoolean("isLocked"); + } + + public int[] getSurface() { + return surface; + } + + public boolean canBuild() { + if (worldObj == null) { + return false; + } + return true; + } + + public void refreshSurface() { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public Block getBaseBlock() { + if (surface[0] <= 0) { + return Blocks.dirt; + } + Block block = Block.getBlockById(surface[0]); + return block != null ? block : Blocks.dirt; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java index a17c3733..4b1f7ee5 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityRoast.java @@ -7,8 +7,8 @@ import minefantasy.mf2.api.crafting.IHeatUser; import minefantasy.mf2.block.crafting.BlockRoast; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.network.packet.TileInventoryPacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.TileInventoryPacket; import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -23,331 +23,327 @@ import java.util.Random; public class TileEntityRoast extends TileEntity implements IInventory, IHeatUser { - public ItemStack[] items = new ItemStack[1]; - public float progress; - public float maxProgress; - private int tempTicksExisted = 0; - private Random rand = new Random(); - private int ticksExisted; - - public TileEntityRoast() { - } - - private CookRecipe recipe; - - @Override - public void updateEntity() { - super.updateEntity(); - ++tempTicksExisted; - if (tempTicksExisted == 10) { - blockMetadata = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - updateRecipe(); - } - int temp = getTemp(); - ++ticksExisted; - if (ticksExisted % 20 == 0 && !worldObj.isRemote) { - if (recipe != null && temp > 0 && maxProgress > 0 && temp > recipe.minTemperature) { - if (enableOverheat && recipe.canBurn && temp > recipe.maxTemperature) { - setInventorySlotContents(0, recipe.burnt.copy()); - updateRecipe(); - } - progress += (temp / 100F); - if (progress >= maxProgress) { - setInventorySlotContents(0, recipe.output.copy()); - updateRecipe(); - } - } - } - if (temp > 0 && worldObj.isRemote && rand.nextInt(20) == 0) { - worldObj.spawnParticle("flame", xCoord + 0.2F + (rand.nextFloat() * 0.6F), yCoord + 0.2F, - zCoord + 0.2F + (rand.nextFloat() * 0.6F), 0F, 0F, 0F); - } - } - - /** - * Enable high temperatures ruin cooking - */ - public static boolean enableOverheat = true; - - private int getTemp() { - TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - if (tile != null && tile instanceof IHeatSource) { - return ((IHeatSource) tile).getHeat(); - } - return 0; - } - - public TileEntityRoast setInventoryModel(String tex, boolean isOven) { - this.isOvenTemp = isOven; - this.texname = tex; - return this; - } - - private boolean isOvenTemp; - - public boolean isOven() { - if (worldObj == null) - return isOvenTemp; - Block base = worldObj.getBlock(xCoord, yCoord, zCoord); - if (base instanceof BlockRoast) { - return ((BlockRoast) base).isOven(); - } - return false; - } - - public boolean interact(EntityPlayer player) { - ItemStack held = player.getHeldItem(); - ItemStack item = items[0]; - if (item == null) { - if (held != null && !(held.getItem() instanceof ItemBlock) - && CookRecipe.getResult(held, isOven()) != null) { - ItemStack item2 = held.copy(); - item2.stackSize = 1; - setInventorySlotContents(0, item2); - tryDecrMainItem(player); - updateRecipe(); - if (!isOven() && this.getTemp() > 0) { - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "random.fizz", 1.0F, 1.0F); - } - return true; - } - } else { - if (!player.inventory.addItemStackToInventory(item)) { - player.entityDropItem(item, 0.0F); - } - setInventorySlotContents(0, null); - updateRecipe(); - return true; - } - return false; - } - - private void tryDecrMainItem(EntityPlayer player) { - int held = player.inventory.currentItem; - if (held >= 0 && held < 9) { - player.inventory.decrStackSize(held, 1); - } - } - - public void updateRecipe() { - recipe = CookRecipe.getResult(getStackInSlot(0), isOven()); - if (recipe != null) { - maxProgress = recipe.time; - } - progress = 0; - sendPacketToClients(); - } - - public int getProgressBar(int i) { - if (maxProgress <= 0) - return 0; - return (int) (i / maxProgress * progress); - } - - public String getResultName() { - if (recipe != null) { - return recipe.output.getDisplayName(); - } - return ""; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - progress = nbt.getFloat("Progress"); - maxProgress = nbt.getFloat("maxProgress"); - - NBTTagList savedItems = nbt.getTagList("Items", 10); - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < items.length) { - items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setFloat("Progress", progress); - nbt.setFloat("maxProgress", maxProgress); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < items.length; ++i) { - if (items[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - items[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - } - - // INVENTORY - public void onInventoryChanged() { - } - - @Override - public int getSizeInventory() { - return items.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return items[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - onInventoryChanged(); - if (this.items[slot] != null) { - ItemStack itemstack; - - if (this.items[slot].stackSize <= num) { - itemstack = this.items[slot]; - this.items[slot] = null; - return itemstack; - } else { - itemstack = this.items[slot].splitStack(num); - - if (this.items[slot].stackSize == 0) { - this.items[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return items[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - onInventoryChanged(); - items[slot] = item; - } - - @Override - public String getInventoryName() { - return "tile.roast.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 1; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - return false; - } - - private void dropItem(ItemStack itemstack) { - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - worldObj.spawnEntityInWorld(entityitem); - } - } - } - - @Override - public boolean canAccept(TileEntity tile) { - return true; - } - - private void sendPacketToClients() { - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new TileInventoryPacket(this, this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + /** + * Enable high temperatures ruin cooking + */ + public static boolean enableOverheat = true; + public ItemStack[] items = new ItemStack[1]; + public float progress; + public float maxProgress; + public String texname = "basic"; + private int tempTicksExisted = 0; + private Random rand = new Random(); + private int ticksExisted; + private CookRecipe recipe; + private boolean isOvenTemp; + + public TileEntityRoast() { + } + + @Override + public void updateEntity() { + super.updateEntity(); + ++tempTicksExisted; + if (tempTicksExisted == 10) { + blockMetadata = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + updateRecipe(); + } + int temp = getTemp(); + ++ticksExisted; + if (ticksExisted % 20 == 0 && !worldObj.isRemote) { + if (recipe != null && temp > 0 && maxProgress > 0 && temp > recipe.minTemperature) { + if (enableOverheat && recipe.canBurn && temp > recipe.maxTemperature) { + setInventorySlotContents(0, recipe.burnt.copy()); + updateRecipe(); + } + progress += (temp / 100F); + if (progress >= maxProgress) { + setInventorySlotContents(0, recipe.output.copy()); + updateRecipe(); + } + } + } + if (temp > 0 && worldObj.isRemote && rand.nextInt(20) == 0) { + worldObj.spawnParticle("flame", xCoord + 0.2F + (rand.nextFloat() * 0.6F), yCoord + 0.2F, + zCoord + 0.2F + (rand.nextFloat() * 0.6F), 0F, 0F, 0F); + } + } + + private int getTemp() { + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (tile != null && tile instanceof IHeatSource) { + return ((IHeatSource) tile).getHeat(); + } + return 0; + } + + public TileEntityRoast setInventoryModel(String tex, boolean isOven) { + this.isOvenTemp = isOven; + this.texname = tex; + return this; + } + + public boolean isOven() { + if (worldObj == null) + return isOvenTemp; + Block base = worldObj.getBlock(xCoord, yCoord, zCoord); + if (base instanceof BlockRoast) { + return ((BlockRoast) base).isOven(); + } + return false; + } + + public boolean interact(EntityPlayer player) { + ItemStack held = player.getHeldItem(); + ItemStack item = items[0]; + if (item == null) { + if (held != null && !(held.getItem() instanceof ItemBlock) + && CookRecipe.getResult(held, isOven()) != null) { + ItemStack item2 = held.copy(); + item2.stackSize = 1; + setInventorySlotContents(0, item2); + tryDecrMainItem(player); + updateRecipe(); + if (!isOven() && this.getTemp() > 0) { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "random.fizz", 1.0F, 1.0F); + } + return true; + } + } else { + if (!player.inventory.addItemStackToInventory(item)) { + player.entityDropItem(item, 0.0F); + } + setInventorySlotContents(0, null); + updateRecipe(); + return true; + } + return false; + } + + private void tryDecrMainItem(EntityPlayer player) { + int held = player.inventory.currentItem; + if (held >= 0 && held < 9) { + player.inventory.decrStackSize(held, 1); + } + } + + public void updateRecipe() { + recipe = CookRecipe.getResult(getStackInSlot(0), isOven()); + if (recipe != null) { + maxProgress = recipe.time; + } + progress = 0; + sendPacketToClients(); + } + + public int getProgressBar(int i) { + if (maxProgress <= 0) + return 0; + return (int) (i / maxProgress * progress); + } + + public String getResultName() { + if (recipe != null) { + return recipe.output.getDisplayName(); + } + return ""; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + progress = nbt.getFloat("Progress"); + maxProgress = nbt.getFloat("maxProgress"); + + NBTTagList savedItems = nbt.getTagList("Items", 10); + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < items.length) { + items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setFloat("Progress", progress); + nbt.setFloat("maxProgress", maxProgress); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < items.length; ++i) { + if (items[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + items[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + } + + // INVENTORY + public void onInventoryChanged() { + } + + @Override + public int getSizeInventory() { + return items.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return items[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + onInventoryChanged(); + if (this.items[slot] != null) { + ItemStack itemstack; + + if (this.items[slot].stackSize <= num) { + itemstack = this.items[slot]; + this.items[slot] = null; + return itemstack; + } else { + itemstack = this.items[slot].splitStack(num); + + if (this.items[slot].stackSize == 0) { + this.items[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return items[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + onInventoryChanged(); + items[slot] = item; + } + + @Override + public String getInventoryName() { + return "tile.roast.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + return false; + } + + private void dropItem(ItemStack itemstack) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + worldObj.spawnEntityInWorld(entityitem); + } + } + } + + @Override + public boolean canAccept(TileEntity tile) { + return true; + } + + private void sendPacketToClients() { + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new TileInventoryPacket(this, this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); /* - List players = ((WorldServer) worldObj).playerEntities; + List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new TileInventoryPacket(this, this).generatePacket()); } */ - } - - public String texname = "basic"; - - @SideOnly(Side.CLIENT) - public String getTexName() { - if (worldObj == null) - return texname; - - Block base = worldObj.getBlock(xCoord, yCoord, zCoord); - if (base instanceof BlockRoast) { - return ((BlockRoast) base).tex; - } - return "basic"; - } - - @Override - public Block getBlockType() { - if (worldObj == null) - return BlockListMF.oven_stone; - - return super.getBlockType(); - } - - @Override - public int getBlockMetadata() { - if (worldObj == null) - return 0; - return super.getBlockMetadata(); - } + } + + @SideOnly(Side.CLIENT) + public String getTexName() { + if (worldObj == null) + return texname; + + Block base = worldObj.getBlock(xCoord, yCoord, zCoord); + if (base instanceof BlockRoast) { + return ((BlockRoast) base).tex; + } + return "basic"; + } + + @Override + public Block getBlockType() { + if (worldObj == null) + return BlockListMF.oven_stone; + + return super.getBlockType(); + } + + @Override + public int getBlockMetadata() { + if (worldObj == null) + return 0; + return super.getBlockMetadata(); + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityTanningRack.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityTanningRack.java index 25efbd08..acbb980b 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityTanningRack.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityTanningRack.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.tileentity; -import java.util.Random; - import minefantasy.mf2.api.crafting.tanning.TanningRecipe; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.rpg.RPGElements; @@ -19,336 +17,337 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; +import java.util.Random; + public class TileEntityTanningRack extends TileEntity implements IInventory { - public ItemStack[] items = new ItemStack[2]; - public float progress; - public float maxProgress; - public String tex = ""; - public int tier = 0; - public String toolType = "knife"; - public final ContainerTanner container; - private int tempTicksExisted = 0; - private Random rand = new Random(); - - public float acTime; - - public TileEntityTanningRack() { - this(0, "Basic"); - } - - public TileEntityTanningRack(int tier, String tex) { - container = new ContainerTanner(this); - this.tier = tier; - this.tex = tex; - } - - @Override - public void updateEntity() { - super.updateEntity(); - ++tempTicksExisted; - if (tempTicksExisted == 10) { - blockMetadata = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - } - if (isAutomated()) { - if (acTime > 0) { - acTime -= (1F / 20); - } - // syncAnimations(); - } - } - - public boolean interact(EntityPlayer player, boolean leftClick, boolean leverPull) { - if (leverPull && acTime > 0) { - return true; - } - container.detectAndSendChanges(); - - ItemStack held = player.getHeldItem(); - - // Interaction - if (items[1] != null && (leverPull || ToolHelper.getCrafterTool(held).equalsIgnoreCase(toolType))) { - if (leverPull || ToolHelper.getCrafterTier(held) >= tier) { - if (!leverPull) { - held.damageItem(1, player); - if (held.getItemDamage() >= held.getMaxDamage()) { - player.destroyCurrentEquippedItem(); - } - } else { - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "tile.piston.out", 0.75F, - 0.85F); - acTime = 1.0F; - } - - float efficiency = leverPull ? 100F : ToolHelper.getCrafterEfficiency(held); - if (!leverPull && player.swingProgress > 0 && player.swingProgress <= 1.0) { - efficiency *= (0.5F - player.swingProgress); - } - - if (efficiency > 0) { - progress += efficiency; - } - if (toolType.equalsIgnoreCase("shears")) { - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "mob.sheep.shear", 1.0F, - 1.0F); - } else { - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "dig.cloth", 1.0F, 1.0F); - } - if (progress >= maxProgress) { - if (RPGElements.isSystemActive) { - SkillList.artisanry.addXP(player, 1); - } - progress = 0; - int ss = items[0] != null ? items[0].stackSize : 1; - ItemStack out = items[1].copy(); - out.stackSize *= ss; - setInventorySlotContents(0, out); - updateRecipe(); - if (isShabbyRack() && rand.nextInt(10) == 0 && !worldObj.isRemote) { - for (int a = 0; a < rand.nextInt(10); a++) { - ItemStack plank = ComponentListMF.plank.construct("ScrapWood"); - worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "mob.zombie.woodbreak", - 1.0F, 1.5F); - dropItem(plank); - } - worldObj.setBlockToAir(xCoord, yCoord, zCoord); - return true; - } - } - } - return true; - } - if (!leftClick && (ToolHelper.getCrafterTool(held).equalsIgnoreCase("nothing") - || ToolHelper.getCrafterTool(held).equalsIgnoreCase("hands"))) { - // Item placement - ItemStack item = items[0]; - if (item == null) { - if (held != null && !(held.getItem() instanceof ItemBlock) && TanningRecipe.getRecipe(held) != null) { - ItemStack item2 = held.copy(); - item2.stackSize = 1; - setInventorySlotContents(0, item2); - tryDecrMainItem(player); - updateRecipe(); - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "mob.horse.leather", 1.0F, - 1.0F); - return true; - } - } else { - if (!player.inventory.addItemStackToInventory(item)) { - player.entityDropItem(item, 0.0F); - } - setInventorySlotContents(0, null); - updateRecipe(); - worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "mob.horse.leather", 1.0F, 1.0F); - return true; - } - } - return false; - } - - public boolean isAutomated() { - if (worldObj == null) { - return tex.equalsIgnoreCase("metal"); - } - return worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockEngineerTanner; - } - - private void tryDecrMainItem(EntityPlayer player) { - int held = player.inventory.currentItem; - if (held >= 0 && held < 9) { - player.inventory.decrStackSize(held, 1); - } - } - - public void updateRecipe() { - TanningRecipe recipe = TanningRecipe.getRecipe(items[0]); - if (recipe == null) { - setInventorySlotContents(1, null); - progress = maxProgress = tier = 0; - } else { - setInventorySlotContents(1, recipe.output); - tier = recipe.tier; - maxProgress = recipe.time; - toolType = recipe.toolType; - } - progress = 0; - } - - public boolean doesPlayerKnowCraft(EntityPlayer thePlayer) { - return true; - } - - public int getProgressBar(int i) { - if (maxProgress <= 0) - return 0; - return (int) (i / maxProgress * progress); - } - - public String getResultName() { - if (items[1] != null) { - return items[1].getDisplayName(); - } - return ""; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - acTime = nbt.getFloat("acTime"); - tex = nbt.getString("tex"); - tier = nbt.getInteger("tier"); - progress = nbt.getFloat("Progress"); - maxProgress = nbt.getFloat("maxProgress"); - toolType = nbt.getString("toolType"); - - NBTTagList savedItems = nbt.getTagList("Items", 10); - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < items.length) { - items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setFloat("acTime", acTime); - nbt.setString("tex", tex); - nbt.setInteger("tier", tier); - nbt.setFloat("Progress", progress); - nbt.setFloat("maxProgress", maxProgress); - nbt.setString("toolType", toolType); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < items.length; ++i) { - if (items[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - items[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - } - - // INVENTORY - public void onInventoryChanged() { - } - - @Override - public int getSizeInventory() { - return items.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return items[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - onInventoryChanged(); - if (this.items[slot] != null) { - ItemStack itemstack; - - if (this.items[slot].stackSize <= num) { - itemstack = this.items[slot]; - this.items[slot] = null; - return itemstack; - } else { - itemstack = this.items[slot].splitStack(num); - - if (this.items[slot].stackSize == 0) { - this.items[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return items[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - onInventoryChanged(); - items[slot] = item; - } - - @Override - public String getInventoryName() { - return "tile.tanner.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 1; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - return false; - } - - private boolean isShabbyRack() { - return worldObj.getBlock(xCoord, yCoord, zCoord) == BlockListMF.tanner; - } - - private void dropItem(ItemStack itemstack) { - if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) { - int j1 = this.rand.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, - new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - worldObj.spawnEntityInWorld(entityitem); - } - } - } + public final ContainerTanner container; + public ItemStack[] items = new ItemStack[2]; + public float progress; + public float maxProgress; + public String tex = ""; + public int tier = 0; + public String toolType = "knife"; + public float acTime; + private int tempTicksExisted = 0; + private Random rand = new Random(); + + public TileEntityTanningRack() { + this(0, "Basic"); + } + + public TileEntityTanningRack(int tier, String tex) { + container = new ContainerTanner(this); + this.tier = tier; + this.tex = tex; + } + + @Override + public void updateEntity() { + super.updateEntity(); + ++tempTicksExisted; + if (tempTicksExisted == 10) { + blockMetadata = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + } + if (isAutomated()) { + if (acTime > 0) { + acTime -= (1F / 20); + } + // syncAnimations(); + } + } + + public boolean interact(EntityPlayer player, boolean leftClick, boolean leverPull) { + if (leverPull && acTime > 0) { + return true; + } + container.detectAndSendChanges(); + + ItemStack held = player.getHeldItem(); + + // Interaction + if (items[1] != null && (leverPull || ToolHelper.getCrafterTool(held).equalsIgnoreCase(toolType))) { + if (leverPull || ToolHelper.getCrafterTier(held) >= tier) { + if (!leverPull) { + held.damageItem(1, player); + if (held.getItemDamage() >= held.getMaxDamage()) { + player.destroyCurrentEquippedItem(); + } + } else { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "tile.piston.out", 0.75F, + 0.85F); + acTime = 1.0F; + } + + float efficiency = leverPull ? 100F : ToolHelper.getCrafterEfficiency(held); + if (!leverPull && player.swingProgress > 0 && player.swingProgress <= 1.0) { + efficiency *= (0.5F - player.swingProgress); + } + + if (efficiency > 0) { + progress += efficiency; + } + if (toolType.equalsIgnoreCase("shears")) { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "mob.sheep.shear", 1.0F, + 1.0F); + } else { + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "dig.cloth", 1.0F, 1.0F); + } + if (progress >= maxProgress) { + if (RPGElements.isSystemActive) { + SkillList.artisanry.addXP(player, 1); + } + progress = 0; + int ss = items[0] != null ? items[0].stackSize : 1; + ItemStack out = items[1].copy(); + out.stackSize *= ss; + setInventorySlotContents(0, out); + updateRecipe(); + if (isShabbyRack() && rand.nextInt(10) == 0 && !worldObj.isRemote) { + for (int a = 0; a < rand.nextInt(10); a++) { + ItemStack plank = ComponentListMF.plank.construct("ScrapWood"); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "mob.zombie.woodbreak", + 1.0F, 1.5F); + dropItem(plank); + } + worldObj.setBlockToAir(xCoord, yCoord, zCoord); + return true; + } + } + } + return true; + } + if (!leftClick && (ToolHelper.getCrafterTool(held).equalsIgnoreCase("nothing") + || ToolHelper.getCrafterTool(held).equalsIgnoreCase("hands"))) { + // Item placement + ItemStack item = items[0]; + if (item == null) { + if (held != null && !(held.getItem() instanceof ItemBlock) && TanningRecipe.getRecipe(held) != null) { + ItemStack item2 = held.copy(); + item2.stackSize = 1; + setInventorySlotContents(0, item2); + tryDecrMainItem(player); + updateRecipe(); + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "mob.horse.leather", 1.0F, + 1.0F); + return true; + } + } else { + if (!player.inventory.addItemStackToInventory(item)) { + player.entityDropItem(item, 0.0F); + } + setInventorySlotContents(0, null); + updateRecipe(); + worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "mob.horse.leather", 1.0F, 1.0F); + return true; + } + } + return false; + } + + public boolean isAutomated() { + if (worldObj == null) { + return tex.equalsIgnoreCase("metal"); + } + return worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockEngineerTanner; + } + + private void tryDecrMainItem(EntityPlayer player) { + int held = player.inventory.currentItem; + if (held >= 0 && held < 9) { + player.inventory.decrStackSize(held, 1); + } + } + + public void updateRecipe() { + TanningRecipe recipe = TanningRecipe.getRecipe(items[0]); + if (recipe == null) { + setInventorySlotContents(1, null); + progress = maxProgress = tier = 0; + } else { + setInventorySlotContents(1, recipe.output); + tier = recipe.tier; + maxProgress = recipe.time; + toolType = recipe.toolType; + } + progress = 0; + } + + public boolean doesPlayerKnowCraft(EntityPlayer thePlayer) { + return true; + } + + public int getProgressBar(int i) { + if (maxProgress <= 0) + return 0; + return (int) (i / maxProgress * progress); + } + + public String getResultName() { + if (items[1] != null) { + return items[1].getDisplayName(); + } + return ""; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + acTime = nbt.getFloat("acTime"); + tex = nbt.getString("tex"); + tier = nbt.getInteger("tier"); + progress = nbt.getFloat("Progress"); + maxProgress = nbt.getFloat("maxProgress"); + toolType = nbt.getString("toolType"); + + NBTTagList savedItems = nbt.getTagList("Items", 10); + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < items.length) { + items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setFloat("acTime", acTime); + nbt.setString("tex", tex); + nbt.setInteger("tier", tier); + nbt.setFloat("Progress", progress); + nbt.setFloat("maxProgress", maxProgress); + nbt.setString("toolType", toolType); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < items.length; ++i) { + if (items[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + items[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + } + + // INVENTORY + public void onInventoryChanged() { + } + + @Override + public int getSizeInventory() { + return items.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return items[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + onInventoryChanged(); + if (this.items[slot] != null) { + ItemStack itemstack; + + if (this.items[slot].stackSize <= num) { + itemstack = this.items[slot]; + this.items[slot] = null; + return itemstack; + } else { + itemstack = this.items[slot].splitStack(num); + + if (this.items[slot].stackSize == 0) { + this.items[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return items[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + onInventoryChanged(); + items[slot] = item; + } + + @Override + public String getInventoryName() { + return "tile.tanner.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + return false; + } + + private boolean isShabbyRack() { + return worldObj.getBlock(xCoord, yCoord, zCoord) == BlockListMF.tanner; + } + + private void dropItem(ItemStack itemstack) { + if (itemstack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while (itemstack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if (j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1, zCoord + f2, + new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if (itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + worldObj.spawnEntityInWorld(entityitem); + } + } + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityWorldGenMarker.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityWorldGenMarker.java index 56541060..f67f2c5b 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityWorldGenMarker.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityWorldGenMarker.java @@ -9,56 +9,56 @@ import net.minecraft.world.chunk.Chunk; public class TileEntityWorldGenMarker extends TileEntity { - public String className, type; - public int ticks = 0, length = 0, deviation = 0, prevID, prevMeta; + public String className, type; + public int ticks = 0, length = 0, deviation = 0, prevID, prevMeta; - @Override - public void updateEntity() { - if (!worldObj.isRemote && areChunksLoaded() && ticks >= getSpawnTime()) { - Block block = Block.getBlockById(prevID); - worldObj.setBlock(xCoord, yCoord, zCoord, block != null ? block : Blocks.air, prevMeta, 2); - StructureModuleMF.placeStructure(className, type, length, deviation, worldObj, xCoord, yCoord, zCoord, - this.getBlockMetadata()); - } + @Override + public void updateEntity() { + if (!worldObj.isRemote && areChunksLoaded() && ticks >= getSpawnTime()) { + Block block = Block.getBlockById(prevID); + worldObj.setBlock(xCoord, yCoord, zCoord, block != null ? block : Blocks.air, prevMeta, 2); + StructureModuleMF.placeStructure(className, type, length, deviation, worldObj, xCoord, yCoord, zCoord, + this.getBlockMetadata()); + } - ++ticks; - } + ++ticks; + } - private boolean areChunksLoaded() { - return chunkLoaded(0, 0) && chunkLoaded(-16, 0) && chunkLoaded(16, 0) && chunkLoaded(0, -16) - && chunkLoaded(0, 16); - } + private boolean areChunksLoaded() { + return chunkLoaded(0, 0) && chunkLoaded(-16, 0) && chunkLoaded(16, 0) && chunkLoaded(0, -16) + && chunkLoaded(0, 16); + } - private boolean chunkLoaded(int x, int z) { - Chunk chunk = worldObj.getChunkFromBlockCoords(x, z); - return chunk != null && chunk.isChunkLoaded; - } + private boolean chunkLoaded(int x, int z) { + Chunk chunk = worldObj.getChunkFromBlockCoords(x, z); + return chunk != null && chunk.isChunkLoaded; + } - private int getSpawnTime() { - return ConfigWorldGen.structureTickRate; - } + private int getSpawnTime() { + return ConfigWorldGen.structureTickRate; + } - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); - className = nbt.getString("ClassDirectory"); - type = nbt.getString("SubType"); - length = nbt.getInteger("LengthPosition"); - deviation = nbt.getInteger("Deviation"); - prevID = nbt.getInteger("prevID"); - prevMeta = nbt.getInteger("prevMeta"); - } + className = nbt.getString("ClassDirectory"); + type = nbt.getString("SubType"); + length = nbt.getInteger("LengthPosition"); + deviation = nbt.getInteger("Deviation"); + prevID = nbt.getInteger("prevID"); + prevMeta = nbt.getInteger("prevMeta"); + } - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); - nbt.setString("ClassDirectory", className); - nbt.setString("SubType", type); - nbt.setInteger("LengthPosition", length); - nbt.setInteger("prevID", prevID); - nbt.setInteger("prevMeta", prevMeta); - nbt.setInteger("Deviation", deviation); - } + nbt.setString("ClassDirectory", className); + nbt.setString("SubType", type); + nbt.setInteger("LengthPosition", length); + nbt.setInteger("prevID", prevID); + nbt.setInteger("prevMeta", prevMeta); + nbt.setInteger("Deviation", deviation); + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFC.java b/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFC.java index def3c170..dd11219b 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFC.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFC.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.tileentity.blastfurnace; -import java.util.Random; - import minefantasy.mf2.api.crafting.MineFantasyFuels; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.refine.BlastFurnaceRecipes; @@ -18,289 +16,290 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; +import java.util.Random; + public class TileEntityBlastFC extends TileEntity implements IInventory, ISidedInventory, ISmokeCarrier { - protected ItemStack[] items = new ItemStack[2]; - protected int smokeStorage; - public int ticksExisted; - public boolean isBuilt = false; - public int fireTime; - protected Random rand = new Random(); - - @Override - public void updateEntity() { - super.updateEntity(); - ++ticksExisted; - int dropFrequency = 5; - - if (!worldObj.isRemote && ticksExisted % dropFrequency == 0) { - TileEntity neighbour = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - if (neighbour != null && neighbour instanceof TileEntityBlastFC - && !(neighbour instanceof TileEntityBlastFH)) { - interact((TileEntityBlastFC) neighbour); - } - } - if (ticksExisted % 200 == 0) { - updateBuild(); - } - if (smokeStorage > 0) { - SmokeMechanics.emitSmokeFromCarrier(worldObj, xCoord, yCoord, zCoord, this, 5); - } - if (!worldObj.isRemote && smokeStorage > getMaxSmokeStorage() && rand.nextInt(1000) == 0) { - worldObj.newExplosion(null, xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 5F, true, true); - } - } - - protected void interact(TileEntityBlastFC tile) { - if (!tile.isBuilt) - return; - - for (int a = 0; a < getSizeInventory(); a++) { - ItemStack mySlot = getStackInSlot(a); - - if (mySlot != null && canShare(mySlot, a)) { - ItemStack theirSlot = tile.getStackInSlot(a); - if (theirSlot == null) { - ItemStack copy = mySlot.copy(); - copy.stackSize = 1; - tile.setInventorySlotContents(a, copy); - this.decrStackSize(a, 1); - } else if (CustomToolHelper.areEqual(theirSlot, mySlot)) { - if ((theirSlot.stackSize) < getMaxStackSizeForDistribute()) { - theirSlot.stackSize++; - this.decrStackSize(a, 1); - tile.setInventorySlotContents(a, theirSlot); - } - } - } - } - } - - private boolean canShare(ItemStack mySlot, int a) { - if (a == 1) - return isInput(mySlot); - return isCarbon(mySlot); - } - - public void updateBuild() { - isBuilt = getIsBuilt(); - } - - protected boolean getIsBuilt() { - return (isFirebrick(-1, 0, 0) && isFirebrick(1, 0, 0) && isFirebrick(0, 0, -1) && isFirebrick(0, 0, 1)); - } - - protected boolean isFirebrick(int x, int y, int z) { - Block block = worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z); - if (block != null) { - return block == BlockListMF.firebricks; - } - return false; - } - - protected boolean isAir(int x, int y, int z) { - return !worldObj.isBlockNormalCubeDefault(xCoord + x, yCoord + y, zCoord + z, false); - } - - private int getMaxStackSizeForDistribute() { - return 1; - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setInteger("fireTime", fireTime); - nbt.setBoolean("isBuilt", isBuilt); - nbt.setInteger("ticksExisted", ticksExisted); - nbt.setInteger("StoredSmoke", smokeStorage); - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.items[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - fireTime = nbt.getInteger("fireTime"); - isBuilt = nbt.getBoolean("isBuilt"); - ticksExisted = nbt.getInteger("ticksExisted"); - smokeStorage = nbt.getInteger("StoredSmoke"); - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.items = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.items.length) { - this.items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - } - - // INVENTORY - public void onInventoryChanged() { - } - - @Override - public int getSizeInventory() { - return items.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return items[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - onInventoryChanged(); - if (this.items[slot] != null) { - ItemStack itemstack; - - if (this.items[slot].stackSize <= num) { - itemstack = this.items[slot]; - this.items[slot] = null; - return itemstack; - } else { - itemstack = this.items[slot].splitStack(num); - - if (this.items[slot].stackSize == 0) { - this.items[slot] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return items[slot]; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - onInventoryChanged(); - items[slot] = item; - } - - @Override - public String getInventoryName() { - return "gui.bombcraftmf.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - if (slot == 0) { - return isCarbon(item); - } - return isInput(item); - } - - public static boolean isCarbon(ItemStack item) { - return MineFantasyFuels.isCarbon(item); - } - - public static boolean isFlux(ItemStack item) { - return true; - } - - public static boolean isInput(ItemStack item) { - return getResult(item) != null; - } - - protected static ItemStack getResult(ItemStack input) { - if (BlastFurnaceRecipes.smelting().getSmeltingResult(input) != null) { - return BlastFurnaceRecipes.smelting().getSmeltingResult(input).copy(); - } - return null; - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) { - return side == 1 ? new int[] { 0, 1 } : new int[] {}; - } - - @Override - public boolean canInsertItem(int slot, ItemStack item, int side) { - return isItemValidForSlot(slot, item); - } - - @Override - public boolean canExtractItem(int slot, ItemStack item, int side) { - return false; - } - - @Override - public int getSmokeValue() { - return smokeStorage; - } - - @Override - public void setSmokeValue(int smoke) { - smokeStorage = smoke; - } - - @Override - public int getMaxSmokeStorage() { - return 10; - } - - @Override - public boolean canAbsorbIndirect() { - return false; - } - - public int tempUses; - - public boolean shouldRemoveCarbon() { - if (tempUses > 0) { - --tempUses; - MFLogUtil.logDebug("Decr Carbon Uses: " + tempUses); - return false; - } else { - int carb = MineFantasyFuels.getCarbon(getStackInSlot(0)) - 1; - if (carb > 0) { - tempUses = carb; - MFLogUtil.logDebug("Set Carbon Uses: " + tempUses); - } - return true; - } - } + public int ticksExisted; + public boolean isBuilt = false; + public int fireTime; + public int tempUses; + protected ItemStack[] items = new ItemStack[2]; + protected int smokeStorage; + protected Random rand = new Random(); + + public static boolean isCarbon(ItemStack item) { + return MineFantasyFuels.isCarbon(item); + } + + public static boolean isFlux(ItemStack item) { + return true; + } + + public static boolean isInput(ItemStack item) { + return getResult(item) != null; + } + + protected static ItemStack getResult(ItemStack input) { + if (BlastFurnaceRecipes.smelting().getSmeltingResult(input) != null) { + return BlastFurnaceRecipes.smelting().getSmeltingResult(input).copy(); + } + return null; + } + + @Override + public void updateEntity() { + super.updateEntity(); + ++ticksExisted; + int dropFrequency = 5; + + if (!worldObj.isRemote && ticksExisted % dropFrequency == 0) { + TileEntity neighbour = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (neighbour != null && neighbour instanceof TileEntityBlastFC + && !(neighbour instanceof TileEntityBlastFH)) { + interact((TileEntityBlastFC) neighbour); + } + } + if (ticksExisted % 200 == 0) { + updateBuild(); + } + if (smokeStorage > 0) { + SmokeMechanics.emitSmokeFromCarrier(worldObj, xCoord, yCoord, zCoord, this, 5); + } + if (!worldObj.isRemote && smokeStorage > getMaxSmokeStorage() && rand.nextInt(1000) == 0) { + worldObj.newExplosion(null, xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 5F, true, true); + } + } + + protected void interact(TileEntityBlastFC tile) { + if (!tile.isBuilt) + return; + + for (int a = 0; a < getSizeInventory(); a++) { + ItemStack mySlot = getStackInSlot(a); + + if (mySlot != null && canShare(mySlot, a)) { + ItemStack theirSlot = tile.getStackInSlot(a); + if (theirSlot == null) { + ItemStack copy = mySlot.copy(); + copy.stackSize = 1; + tile.setInventorySlotContents(a, copy); + this.decrStackSize(a, 1); + } else if (CustomToolHelper.areEqual(theirSlot, mySlot)) { + if ((theirSlot.stackSize) < getMaxStackSizeForDistribute()) { + theirSlot.stackSize++; + this.decrStackSize(a, 1); + tile.setInventorySlotContents(a, theirSlot); + } + } + } + } + } + + private boolean canShare(ItemStack mySlot, int a) { + if (a == 1) + return isInput(mySlot); + return isCarbon(mySlot); + } + + public void updateBuild() { + isBuilt = getIsBuilt(); + } + + protected boolean getIsBuilt() { + return (isFirebrick(-1, 0, 0) && isFirebrick(1, 0, 0) && isFirebrick(0, 0, -1) && isFirebrick(0, 0, 1)); + } + + protected boolean isFirebrick(int x, int y, int z) { + Block block = worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z); + if (block != null) { + return block == BlockListMF.firebricks; + } + return false; + } + + protected boolean isAir(int x, int y, int z) { + return !worldObj.isBlockNormalCubeDefault(xCoord + x, yCoord + y, zCoord + z, false); + } + + private int getMaxStackSizeForDistribute() { + return 1; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setInteger("fireTime", fireTime); + nbt.setBoolean("isBuilt", isBuilt); + nbt.setInteger("ticksExisted", ticksExisted); + nbt.setInteger("StoredSmoke", smokeStorage); + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.items.length; ++i) { + if (this.items[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.items[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + fireTime = nbt.getInteger("fireTime"); + isBuilt = nbt.getBoolean("isBuilt"); + ticksExisted = nbt.getInteger("ticksExisted"); + smokeStorage = nbt.getInteger("StoredSmoke"); + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.items = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.items.length) { + this.items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + } + + // INVENTORY + public void onInventoryChanged() { + } + + @Override + public int getSizeInventory() { + return items.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return items[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + onInventoryChanged(); + if (this.items[slot] != null) { + ItemStack itemstack; + + if (this.items[slot].stackSize <= num) { + itemstack = this.items[slot]; + this.items[slot] = null; + return itemstack; + } else { + itemstack = this.items[slot].splitStack(num); + + if (this.items[slot].stackSize == 0) { + this.items[slot] = null; + } + + return itemstack; + } + } else { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return items[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + onInventoryChanged(); + items[slot] = item; + } + + @Override + public String getInventoryName() { + return "gui.bombcraftmf.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return user.getDistance(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) < 8D; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (slot == 0) { + return isCarbon(item); + } + return isInput(item); + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return side == 1 ? new int[]{0, 1} : new int[]{}; + } + + @Override + public boolean canInsertItem(int slot, ItemStack item, int side) { + return isItemValidForSlot(slot, item); + } + + @Override + public boolean canExtractItem(int slot, ItemStack item, int side) { + return false; + } + + @Override + public int getSmokeValue() { + return smokeStorage; + } + + @Override + public void setSmokeValue(int smoke) { + smokeStorage = smoke; + } + + @Override + public int getMaxSmokeStorage() { + return 10; + } + + @Override + public boolean canAbsorbIndirect() { + return false; + } + + public boolean shouldRemoveCarbon() { + if (tempUses > 0) { + --tempUses; + MFLogUtil.logDebug("Decr Carbon Uses: " + tempUses); + return false; + } else { + int carb = MineFantasyFuels.getCarbon(getStackInSlot(0)) - 1; + if (carb > 0) { + tempUses = carb; + MFLogUtil.logDebug("Set Carbon Uses: " + tempUses); + } + return true; + } + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFH.java b/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFH.java index a8cf4bc7..6a6b56a8 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFH.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/blastfurnace/TileEntityBlastFH.java @@ -13,241 +13,239 @@ import net.minecraft.tileentity.TileEntity; public class TileEntityBlastFH extends TileEntityBlastFC { - public int fuel; - public int maxFuel; - public float heat; - public float progress; - - @Override - public void updateEntity() { - super.updateEntity(); - - boolean wasBurning = isBurning(); - if (fuel > 0) { - --fuel; - } - if (isBuilt && smokeStorage < getMaxSmokeStorage()) { - if (fuel > 0) { - ++progress; - float maxProgress = getMaxProgress(); - if (progress >= maxProgress) { - progress -= maxProgress; - smeltItem(); - } - if (ticksExisted % 10 == 0) { - smokeStorage += 2; - } - } else if (!worldObj.isRemote) { - if (isFuel(items[0])) { - fuel = maxFuel = getItemBurnTime(items[0]); - decrStackSize(0, 1); - } - } - } - if (fireTime > 0) { - if (fuel > 0) - --fuel; - smokeStorage++; - fireTime--; - if (ticksExisted % 2 == 0) - shootFire(); - - } - if (!worldObj.isRemote && wasBurning != isBurning()) { - BlockBFH.updateFurnaceBlockState(isBurning(), this.worldObj, this.xCoord, this.yCoord, this.zCoord); - } - } - - public static float maxProgress = 1200; - - private float getMaxProgress() { - return maxProgress; - } - - public static int maxFurnaceHeight = 8; - - private void smeltItem() { - for (int y = 0; y < maxFurnaceHeight; y++) { - TileEntity tileEntity = worldObj.getTileEntity(xCoord, yCoord + y + 1, zCoord); - if (tileEntity != null && tileEntity instanceof TileEntityBlastFC - && !(tileEntity instanceof TileEntityBlastFH)) { - ItemStack result = getSmeltedResult((TileEntityBlastFC) tileEntity, y + 1); - if (result != null) { - dropItem(result); - } - } else { - break; - } - } - fireTime = 20; - worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 2.0F, 0.5F); - worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "fire.fire", 1.0F, 0.75F); - startFire(1, 0, 0); - startFire(-1, 0, 0); - startFire(0, 0, 1); - startFire(0, 0, -1); - } - - private void dropItem(ItemStack result) { - TileEntity under = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - if (under != null && under instanceof TileEntityCrucible) { - TileEntityCrucible crucible = (TileEntityCrucible) under; - int slot = crucible.getSizeInventory() - 1; - { - if (crucible.getStackInSlot(slot) == null) { - crucible.setInventorySlotContents(slot, result); - return; - } else if (CustomToolHelper.areEqual(crucible.getStackInSlot(slot), result)) { - int freeSpace = crucible.getStackInSlot(slot).getMaxStackSize() - - crucible.getStackInSlot(slot).stackSize; - if (freeSpace >= result.stackSize) { - crucible.getStackInSlot(slot).stackSize += result.stackSize; - return; - } else { - crucible.getStackInSlot(slot).stackSize += freeSpace; - result.stackSize -= freeSpace; - } - } - } - } - if (result.stackSize <= 0) - return; - - if (ConfigHardcore.HCCreduceIngots && rand.nextInt(3) == 0) { - EntityItem entity = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, result); - worldObj.spawnEntityInWorld(entity); - } - } - - private void startFire(int x, int y, int z) { - if (!worldObj.isRemote && worldObj.isAirBlock(x, y, z)) { - worldObj.setBlock(xCoord + x, yCoord + y, zCoord + z, Blocks.fire); - } - } - - private void shootFire() { - if (!worldObj.isRemote) { - shootFire(-1, 0, 0); - shootFire(1, 0, 0); - shootFire(0, 0, -1); - shootFire(0, 0, 1); - } - } - - private void shootFire(int x, int y, int z) { - double v = 0.125D; - EntityFireBlast fireball = new EntityFireBlast(worldObj, xCoord + 0.5 + x, yCoord, zCoord + 0.5 + z, x * v, - y * v, z * v); - fireball.getEntityData().setString("Preset", "BlastFurnace"); - fireball.modifySpeed(0.5F); - worldObj.spawnEntityInWorld(fireball); - } - - private ItemStack getSmeltedResult(TileEntityBlastFC shaft, int y) { - if (shaft.getIsBuilt()) { - ItemStack input = shaft.getStackInSlot(1); - if (shaft.tempUses <= 0 && shaft.getStackInSlot(0) == null || !isCarbon(shaft.getStackInSlot(0))) { - return null; - } - if (input != null) { - ItemStack result = getResult(input); - if (result != null) { - for (int a = 0; a < shaft.getSizeInventory(); a++) { - if (a > 0 || shaft.shouldRemoveCarbon()) { - shaft.decrStackSize(a, 1); - } - } - return result; - } - } - } - return null; - } - - @Override - protected void interact(TileEntityBlastFC tile) { - - } - - @Override - public void updateBuild() { - isBuilt = getIsBuilt(); - } - - @Override - protected boolean getIsBuilt() { - return (isFirebrick(-1, 0, -1) && isFirebrick(1, 0, -1) && isFirebrick(-1, 0, 1) && isFirebrick(1, 0, -1)) - && (isAir(-1, 0, 0) && isAir(1, 0, 0) && isAir(0, 0, -1) && isAir(0, 0, 1)); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - nbt.setFloat("progress", progress); - nbt.setInteger("fuel", fuel); - nbt.setInteger("maxFuel", maxFuel); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - progress = nbt.getFloat("progress"); - fuel = nbt.getInteger("fuel"); - maxFuel = nbt.getInteger("maxFuel"); - } - - public static boolean isFuel(ItemStack item) { - return getItemBurnTime(item) > 0; - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) { - return side > 0 ? new int[] { 0 } : new int[] {}; - } - - @Override - public boolean canInsertItem(int slot, ItemStack item, int side) { - return side != 0 && isItemValidForSlot(slot, item); - } - - @Override - public boolean canExtractItem(int slot, ItemStack item, int side) { - return false; - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - if (slot == 0) { - return isFuel(item); - } - return false; - } - - public static int getItemBurnTime(ItemStack fuel) { - return MineFantasyAPI.getFuelValue(fuel) / 4; - } - - public boolean isBurning() { - return fuel > 0; - } - - public int getBurnTimeRemainingScaled(int i) { - if (this.maxFuel <= 0) { - return 0; - } - - return fuel * i / maxFuel; - } - - @Override - public int getSizeInventory() { - return 1; - } - - @Override - public int getMaxSmokeStorage() { - return 10; - } + public static float maxProgress = 1200; + public static int maxFurnaceHeight = 8; + public int fuel; + public int maxFuel; + public float heat; + public float progress; + + public static boolean isFuel(ItemStack item) { + return getItemBurnTime(item) > 0; + } + + public static int getItemBurnTime(ItemStack fuel) { + return MineFantasyAPI.getFuelValue(fuel) / 4; + } + + @Override + public void updateEntity() { + super.updateEntity(); + + boolean wasBurning = isBurning(); + if (fuel > 0) { + --fuel; + } + if (isBuilt && smokeStorage < getMaxSmokeStorage()) { + if (fuel > 0) { + ++progress; + float maxProgress = getMaxProgress(); + if (progress >= maxProgress) { + progress -= maxProgress; + smeltItem(); + } + if (ticksExisted % 10 == 0) { + smokeStorage += 2; + } + } else if (!worldObj.isRemote) { + if (isFuel(items[0])) { + fuel = maxFuel = getItemBurnTime(items[0]); + decrStackSize(0, 1); + } + } + } + if (fireTime > 0) { + if (fuel > 0) + --fuel; + smokeStorage++; + fireTime--; + if (ticksExisted % 2 == 0) + shootFire(); + + } + if (!worldObj.isRemote && wasBurning != isBurning()) { + BlockBFH.updateFurnaceBlockState(isBurning(), this.worldObj, this.xCoord, this.yCoord, this.zCoord); + } + } + + private float getMaxProgress() { + return maxProgress; + } + + private void smeltItem() { + for (int y = 0; y < maxFurnaceHeight; y++) { + TileEntity tileEntity = worldObj.getTileEntity(xCoord, yCoord + y + 1, zCoord); + if (tileEntity != null && tileEntity instanceof TileEntityBlastFC + && !(tileEntity instanceof TileEntityBlastFH)) { + ItemStack result = getSmeltedResult((TileEntityBlastFC) tileEntity, y + 1); + if (result != null) { + dropItem(result); + } + } else { + break; + } + } + fireTime = 20; + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 2.0F, 0.5F); + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "fire.fire", 1.0F, 0.75F); + startFire(1, 0, 0); + startFire(-1, 0, 0); + startFire(0, 0, 1); + startFire(0, 0, -1); + } + + private void dropItem(ItemStack result) { + TileEntity under = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (under != null && under instanceof TileEntityCrucible) { + TileEntityCrucible crucible = (TileEntityCrucible) under; + int slot = crucible.getSizeInventory() - 1; + { + if (crucible.getStackInSlot(slot) == null) { + crucible.setInventorySlotContents(slot, result); + return; + } else if (CustomToolHelper.areEqual(crucible.getStackInSlot(slot), result)) { + int freeSpace = crucible.getStackInSlot(slot).getMaxStackSize() + - crucible.getStackInSlot(slot).stackSize; + if (freeSpace >= result.stackSize) { + crucible.getStackInSlot(slot).stackSize += result.stackSize; + return; + } else { + crucible.getStackInSlot(slot).stackSize += freeSpace; + result.stackSize -= freeSpace; + } + } + } + } + if (result.stackSize <= 0) + return; + + if (ConfigHardcore.HCCreduceIngots && rand.nextInt(3) == 0) { + EntityItem entity = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, result); + worldObj.spawnEntityInWorld(entity); + } + } + + private void startFire(int x, int y, int z) { + if (!worldObj.isRemote && worldObj.isAirBlock(x, y, z)) { + worldObj.setBlock(xCoord + x, yCoord + y, zCoord + z, Blocks.fire); + } + } + + private void shootFire() { + if (!worldObj.isRemote) { + shootFire(-1, 0, 0); + shootFire(1, 0, 0); + shootFire(0, 0, -1); + shootFire(0, 0, 1); + } + } + + private void shootFire(int x, int y, int z) { + double v = 0.125D; + EntityFireBlast fireball = new EntityFireBlast(worldObj, xCoord + 0.5 + x, yCoord, zCoord + 0.5 + z, x * v, + y * v, z * v); + fireball.getEntityData().setString("Preset", "BlastFurnace"); + fireball.modifySpeed(0.5F); + worldObj.spawnEntityInWorld(fireball); + } + + private ItemStack getSmeltedResult(TileEntityBlastFC shaft, int y) { + if (shaft.getIsBuilt()) { + ItemStack input = shaft.getStackInSlot(1); + if (shaft.tempUses <= 0 && shaft.getStackInSlot(0) == null || !isCarbon(shaft.getStackInSlot(0))) { + return null; + } + if (input != null) { + ItemStack result = getResult(input); + if (result != null) { + for (int a = 0; a < shaft.getSizeInventory(); a++) { + if (a > 0 || shaft.shouldRemoveCarbon()) { + shaft.decrStackSize(a, 1); + } + } + return result; + } + } + } + return null; + } + + @Override + protected void interact(TileEntityBlastFC tile) { + + } + + @Override + public void updateBuild() { + isBuilt = getIsBuilt(); + } + + @Override + protected boolean getIsBuilt() { + return (isFirebrick(-1, 0, -1) && isFirebrick(1, 0, -1) && isFirebrick(-1, 0, 1) && isFirebrick(1, 0, -1)) + && (isAir(-1, 0, 0) && isAir(1, 0, 0) && isAir(0, 0, -1) && isAir(0, 0, 1)); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setFloat("progress", progress); + nbt.setInteger("fuel", fuel); + nbt.setInteger("maxFuel", maxFuel); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + progress = nbt.getFloat("progress"); + fuel = nbt.getInteger("fuel"); + maxFuel = nbt.getInteger("maxFuel"); + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return side > 0 ? new int[]{0} : new int[]{}; + } + + @Override + public boolean canInsertItem(int slot, ItemStack item, int side) { + return side != 0 && isItemValidForSlot(slot, item); + } + + @Override + public boolean canExtractItem(int slot, ItemStack item, int side) { + return false; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + if (slot == 0) { + return isFuel(item); + } + return false; + } + + public boolean isBurning() { + return fuel > 0; + } + + public int getBurnTimeRemainingScaled(int i) { + if (this.maxFuel <= 0) { + return 0; + } + + return fuel * i / maxFuel; + } + + @Override + public int getSizeInventory() { + return 1; + } + + @Override + public int getMaxSmokeStorage() { + return 10; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java index eaae1387..f41b40a8 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityAmmoBox.java @@ -9,8 +9,8 @@ import minefantasy.mf2.block.decor.BlockAmmoBox; import minefantasy.mf2.item.ItemBandage; import minefantasy.mf2.item.gadget.ItemSyringe; -import minefantasy.mf2.network.packet.AmmoBoxPacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.AmmoBoxPacket; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemFood; @@ -19,240 +19,239 @@ import net.minecraft.world.WorldServer; public class TileEntityAmmoBox extends TileEntityWoodDecor implements IBasicMetre { - public int angle, stock; - public ItemStack ammo; - private byte storageSize = -1; + public int angle, stock; + public ItemStack ammo; + private byte storageSize = -1; + private int ticksExisted; - public TileEntityAmmoBox() { - super("ammo_box_basic", CustomMaterial.getMaterial("RefinedWood")); - } + public TileEntityAmmoBox() { + super("ammo_box_basic", CustomMaterial.getMaterial("RefinedWood")); + } - public TileEntityAmmoBox(String tex, CustomMaterial material, byte size) { - super(tex, material); - this.storageSize = size; - } + public TileEntityAmmoBox(String tex, CustomMaterial material, byte size) { + super(tex, material); + this.storageSize = size; + } - public boolean interact(EntityPlayer user, ItemStack held) { - if (held != null) { - if (this.getStorageType() == 1 && ammo != null && held.getItem() instanceof IFirearm && loadGun(held)) { - open(); - syncData(); - return true; - } - if (canAcceptItem(held)) { - int max = this.getMaxAmmo(ammo != null ? ammo : held); - if (ammo == null) { - open(); - placeInEmpty(user, held, max); - } else if (areItemStacksEqual(held, ammo) && stock < max) { - open(); - addToBox(user, held, max); - } + public boolean interact(EntityPlayer user, ItemStack held) { + if (held != null) { + if (this.getStorageType() == 1 && ammo != null && held.getItem() instanceof IFirearm && loadGun(held)) { + open(); + syncData(); + return true; + } + if (canAcceptItem(held)) { + int max = this.getMaxAmmo(ammo != null ? ammo : held); + if (ammo == null) { + open(); + placeInEmpty(user, held, max); + } else if (areItemStacksEqual(held, ammo) && stock < max) { + open(); + addToBox(user, held, max); + } - syncData(); - return true; - } - return false; - } else if (ammo != null) { - open(); - takeStack(user, held); - syncData(); - return true; - } - syncData(); - return false; - } + syncData(); + return true; + } + return false; + } else if (ammo != null) { + open(); + takeStack(user, held); + syncData(); + return true; + } + syncData(); + return false; + } - private boolean canAcceptItem(ItemStack held) { - if (held.getItem() instanceof IStorageBlock) { - return false; - } - byte type = this.getStorageType(); + private boolean canAcceptItem(ItemStack held) { + if (held.getItem() instanceof IStorageBlock) { + return false; + } + byte type = this.getStorageType(); - return type == 0 ? isFood(held) : type == 1 ? held.getItem() instanceof IAmmo : type == 2; - } + return type == 0 ? isFood(held) : type == 1 ? held.getItem() instanceof IAmmo : type == 2; + } - private boolean isFood(ItemStack held) { - return held.getItem() instanceof ItemFood || held.getItem() instanceof ItemBandage - || held.getItem() instanceof ItemSyringe; - } + private boolean isFood(ItemStack held) { + return held.getItem() instanceof ItemFood || held.getItem() instanceof ItemBandage + || held.getItem() instanceof ItemSyringe; + } - private boolean loadGun(ItemStack held) { - IFirearm gun = (IFirearm) held.getItem(); - if (gun.canAcceptAmmo(held, getAmmoClass())) { - ItemStack loaded = AmmoMechanicsMF.getAmmo(held); - if (loaded == null) { - int ss = Math.min(ammo.getMaxStackSize(), stock); - ItemStack newloaded = ammo.copy(); - newloaded.stackSize = ss; - AmmoMechanicsMF.setAmmo(held, newloaded); - stock -= ss; - if (stock <= 0) { - ammo = null; - } - return true; - } else if (areItemStacksEqual(loaded, ammo)) { - int room_left = loaded.getMaxStackSize() - loaded.stackSize; - if (stock > room_left) { - stock -= room_left; - loaded.stackSize += room_left; - AmmoMechanicsMF.setAmmo(held, loaded); - } else { - loaded.stackSize += stock; - AmmoMechanicsMF.setAmmo(held, loaded); - stock = 0; - ammo = null; - } + private boolean loadGun(ItemStack held) { + IFirearm gun = (IFirearm) held.getItem(); + if (gun.canAcceptAmmo(held, getAmmoClass())) { + ItemStack loaded = AmmoMechanicsMF.getAmmo(held); + if (loaded == null) { + int ss = Math.min(ammo.getMaxStackSize(), stock); + ItemStack newloaded = ammo.copy(); + newloaded.stackSize = ss; + AmmoMechanicsMF.setAmmo(held, newloaded); + stock -= ss; + if (stock <= 0) { + ammo = null; + } + return true; + } else if (areItemStacksEqual(loaded, ammo)) { + int room_left = loaded.getMaxStackSize() - loaded.stackSize; + if (stock > room_left) { + stock -= room_left; + loaded.stackSize += room_left; + AmmoMechanicsMF.setAmmo(held, loaded); + } else { + loaded.stackSize += stock; + AmmoMechanicsMF.setAmmo(held, loaded); + stock = 0; + ammo = null; + } - return true; - } - } - return false; - } + return true; + } + } + return false; + } - private void addToBox(EntityPlayer user, ItemStack held, int max) { - int room_left = max - stock; - if (held.stackSize <= room_left) { - stock += held.stackSize; - user.setCurrentItemOrArmor(0, null); - } else { - held.stackSize -= room_left; - stock += room_left; - } - } + private void addToBox(EntityPlayer user, ItemStack held, int max) { + int room_left = max - stock; + if (held.stackSize <= room_left) { + stock += held.stackSize; + user.setCurrentItemOrArmor(0, null); + } else { + held.stackSize -= room_left; + stock += room_left; + } + } - private void takeStack(EntityPlayer user, ItemStack held) { - int ss = stock; - ItemStack taken = ammo.copy(); - if (ss > taken.getMaxStackSize()) { - ss = taken.getMaxStackSize(); - } - taken.stackSize = ss; - stock -= ss; - user.setCurrentItemOrArmor(0, taken); - if (stock <= 0) { - ammo = null; - } - } + private void takeStack(EntityPlayer user, ItemStack held) { + int ss = stock; + ItemStack taken = ammo.copy(); + if (ss > taken.getMaxStackSize()) { + ss = taken.getMaxStackSize(); + } + taken.stackSize = ss; + stock -= ss; + user.setCurrentItemOrArmor(0, taken); + if (stock <= 0) { + ammo = null; + } + } - /** - * Place ammo in empty box - */ - private void placeInEmpty(EntityPlayer user, ItemStack held, int max) { - ammo = held.copy(); - int ss = held.stackSize; - if (held.stackSize <= max)// Place all - { - user.setCurrentItemOrArmor(0, null); - } else // Fill as much - { - stock = max; - held.stackSize -= max; - } - stock = ss; - } + /** + * Place ammo in empty box + */ + private void placeInEmpty(EntityPlayer user, ItemStack held, int max) { + ammo = held.copy(); + int ss = held.stackSize; + if (held.stackSize <= max)// Place all + { + user.setCurrentItemOrArmor(0, null); + } else // Fill as much + { + stock = max; + held.stackSize -= max; + } + stock = ss; + } - private void open() { - angle = 16; - this.worldObj.playSoundEffect(this.xCoord + 0.5D, this.yCoord + 0.25D, this.zCoord + 0.5D, "random.chestclosed", - 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 1.4F); - } + private void open() { + angle = 16; + this.worldObj.playSoundEffect(this.xCoord + 0.5D, this.yCoord + 0.25D, this.zCoord + 0.5D, "random.chestclosed", + 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 1.4F); + } - private int ticksExisted; + @Override + public void updateEntity() { + ++ticksExisted; + if (ticksExisted == 20 || ticksExisted % 100 == 0) { + syncData(); + } + if (angle > 0) + --angle; + } - @Override - public void updateEntity() { - ++ticksExisted; - if (ticksExisted == 20 || ticksExisted % 100 == 0) { - syncData(); - } - if (angle > 0) - --angle; - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("stock", stock); - if (ammo != null) { - NBTTagCompound itemsave = new NBTTagCompound(); - ammo.writeToNBT(itemsave); - nbt.setTag("storage", itemsave); - } - } + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("stock", stock); + if (ammo != null) { + NBTTagCompound itemsave = new NBTTagCompound(); + ammo.writeToNBT(itemsave); + nbt.setTag("storage", itemsave); + } + } - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - stock = nbt.getInteger("stock"); - if (nbt.hasKey("storage")) { - NBTTagCompound itemsave = nbt.getCompoundTag("storage"); - ammo = ItemStack.loadItemStackFromNBT(itemsave); - } - } + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + stock = nbt.getInteger("stock"); + if (nbt.hasKey("storage")) { + NBTTagCompound itemsave = nbt.getCompoundTag("storage"); + ammo = ItemStack.loadItemStackFromNBT(itemsave); + } + } - public void syncData() { - if (worldObj.isRemote) - return; + public void syncData() { + if (worldObj.isRemote) + return; - NetworkUtils.sendToWatchers(new AmmoBoxPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + NetworkUtils.sendToWatchers(new AmmoBoxPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); /* - List players = ((WorldServer) worldObj).playerEntities; + List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new AmmoBoxPacket(this).generatePacket()); super.sendPacketToClient(player); } */ - } + } - public int getMaxAmmo(ItemStack ammo) { - return ammo.getMaxStackSize() * getCapacity(getMaterial().tier); - } + public int getMaxAmmo(ItemStack ammo) { + return ammo.getMaxStackSize() * getCapacity(getMaterial().tier); + } - @Override - public int getMetreScale(int size) { - if (ammo != null) { - return (int) Math.min(size, (float) size / (float) getMaxAmmo(ammo) * stock); - } - return 0; - } + @Override + public int getMetreScale(int size) { + if (ammo != null) { + return (int) Math.min(size, (float) size / (float) getMaxAmmo(ammo) * stock); + } + return 0; + } - @Override - public boolean shouldShowMetre() { - return ammo != null; - } + @Override + public boolean shouldShowMetre() { + return ammo != null; + } - @Override - public String getLocalisedName() { - if (ammo != null) { - return ammo.getDisplayName() + " x" + stock; - } - return ""; - } + @Override + public String getLocalisedName() { + if (ammo != null) { + return ammo.getDisplayName() + " x" + stock; + } + return ""; + } - private boolean areItemStacksEqual(ItemStack i1, ItemStack i2) { - if (i1 == null || i2 == null) - return false; + private boolean areItemStacksEqual(ItemStack i1, ItemStack i2) { + if (i1 == null || i2 == null) + return false; - return i1.isItemEqual(i2) && ItemStack.areItemStackTagsEqual(i1, i2); - } + return i1.isItemEqual(i2) && ItemStack.areItemStackTagsEqual(i1, i2); + } - private String getAmmoClass() { - if (ammo != null && ammo.getItem() instanceof IAmmo) { - return ((IAmmo) ammo.getItem()).getAmmoType(ammo); - } - return "null"; - } + private String getAmmoClass() { + if (ammo != null && ammo.getItem() instanceof IAmmo) { + return ((IAmmo) ammo.getItem()).getAmmoType(ammo); + } + return "null"; + } - public byte getStorageType() { - if (worldObj != null) { - Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - if (block instanceof BlockAmmoBox) { - return ((BlockAmmoBox) block).storageType; - } - } - return storageSize; - } + public byte getStorageType() { + if (worldObj != null) { + Block block = worldObj.getBlock(xCoord, yCoord, zCoord); + if (block instanceof BlockAmmoBox) { + return ((BlockAmmoBox) block).storageType; + } + } + return storageSize; + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java index 310f2b53..98019c57 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityRack.java @@ -2,8 +2,8 @@ import minefantasy.mf2.api.helpers.BlockPositionHelper; import minefantasy.mf2.api.weapon.IRackItem; -import minefantasy.mf2.network.packet.TileInventoryPacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.TileInventoryPacket; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -19,108 +19,108 @@ import java.util.List; public class TileEntityRack extends TileEntityWoodDecor implements IInventory { - private ItemStack inv[]; - private int ticksExisted; - - public TileEntityRack() { - super("rack_wood"); - inv = new ItemStack[4]; - } - - @Override - public int getSizeInventory() { - return inv.length; - } - - @Override - public ItemStack getStackInSlot(int i) { - return inv[i]; - } - - @Override - public ItemStack decrStackSize(int i, int j) { - if (inv[i] != null) { - if (inv[i].stackSize <= j) { - ItemStack itemstack = inv[i]; - inv[i] = null; - syncItems(); - return itemstack; - } - ItemStack itemstack1 = inv[i].splitStack(j); - if (inv[i].stackSize == 0) { - inv[i] = null; - } - syncItems(); - return itemstack1; - } else { - syncItems(); - updateInventory(); - return null; - } - } - - @Override - public void setInventorySlotContents(int i, ItemStack itemstack) { - inv[i] = itemstack; - updateInventory(); - syncItems(); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - - NBTTagList savedItems = nbt.getTagList("Items", 10); - this.inv = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < savedItems.tagCount(); ++i) { - NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); - byte slotNum = savedSlot.getByte("Slot"); - - if (slotNum >= 0 && slotNum < this.inv.length) { - this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - - NBTTagList savedItems = new NBTTagList(); - - for (int i = 0; i < this.inv.length; ++i) { - if (this.inv[i] != null) { - NBTTagCompound savedSlot = new NBTTagCompound(); - savedSlot.setByte("Slot", (byte) i); - this.inv[i].writeToNBT(savedSlot); - savedItems.appendTag(savedSlot); - } - } - - nbt.setTag("Items", savedItems); - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public void updateEntity() { - ++ticksExisted; - if (ticksExisted == 10 || ticksExisted % 50 == 0) { - syncItems(); - } - } - - public void syncItems() { - if (!worldObj.isRemote) { - List players = ((WorldServer) worldObj).playerEntities; - - NetworkUtils.sendToWatchers(new TileInventoryPacket(this, this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); - super.sendPacketToClient(); - /* + private ItemStack inv[]; + private int ticksExisted; + + public TileEntityRack() { + super("rack_wood"); + inv = new ItemStack[4]; + } + + @Override + public int getSizeInventory() { + return inv.length; + } + + @Override + public ItemStack getStackInSlot(int i) { + return inv[i]; + } + + @Override + public ItemStack decrStackSize(int i, int j) { + if (inv[i] != null) { + if (inv[i].stackSize <= j) { + ItemStack itemstack = inv[i]; + inv[i] = null; + syncItems(); + return itemstack; + } + ItemStack itemstack1 = inv[i].splitStack(j); + if (inv[i].stackSize == 0) { + inv[i] = null; + } + syncItems(); + return itemstack1; + } else { + syncItems(); + updateInventory(); + return null; + } + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemstack) { + inv[i] = itemstack; + updateInventory(); + syncItems(); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + NBTTagList savedItems = nbt.getTagList("Items", 10); + this.inv = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < savedItems.tagCount(); ++i) { + NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i); + byte slotNum = savedSlot.getByte("Slot"); + + if (slotNum >= 0 && slotNum < this.inv.length) { + this.inv[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + NBTTagList savedItems = new NBTTagList(); + + for (int i = 0; i < this.inv.length; ++i) { + if (this.inv[i] != null) { + NBTTagCompound savedSlot = new NBTTagCompound(); + savedSlot.setByte("Slot", (byte) i); + this.inv[i].writeToNBT(savedSlot); + savedItems.appendTag(savedSlot); + } + } + + nbt.setTag("Items", savedItems); + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public void updateEntity() { + ++ticksExisted; + if (ticksExisted == 10 || ticksExisted % 50 == 0) { + syncItems(); + } + } + + public void syncItems() { + if (!worldObj.isRemote) { + List players = ((WorldServer) worldObj).playerEntities; + + NetworkUtils.sendToWatchers(new TileInventoryPacket(this, this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + super.sendPacketToClient(); + /* for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, @@ -128,121 +128,121 @@ public void syncItems() { super.sendPacketToClient(player); } */ - } - } - - @Override - public boolean isUseableByPlayer(EntityPlayer entityplayer) { - if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { - return false; - } - return entityplayer.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64D; - } - - @Override - public ItemStack getStackInSlotOnClosing(int var1) { - return null; - } - - private int getEnchantment(int i) { - ItemStack is = this.getStackInSlot(i); - if (is == null) - return 0; - - if (is.isItemEnchanted()) - return 1; - - return 0; - } - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemstack) { - return false; - } - - /* - * North: WEST: 0=2 South: SOUTH: 1=1 West: EAST: 2=3 East: NORTH: 3=0 - */ - public int getSlotFor(float x, float y) { - int direction = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - ForgeDirection FD = ForgeDirection.getOrientation(direction); - float offset = 1F / 16F; - - float x1 = 0.0F + offset; - float x2 = 1.0F - offset; - float y1 = 0.0F; - float y2 = 1.0F; - if (FD == ForgeDirection.EAST || FD == ForgeDirection.WEST) { - x1 = 0.0F; - x2 = 1.0F; - y1 = 0.0F + offset; - y2 = 1.0F - offset; - } - int[] coord = BlockPositionHelper.getCoordsFor(x, y, x1, x2, y1, y2, 4, 4, direction); - - if (coord == null) { - return -1; - } - return coord[0]; - - } - - public boolean canHang(ItemStack item, int slot) { - if (item == null || item.getItem() == null) { - return false; - } - if (item.getItem() instanceof ItemBlock) { - return false; - } - if (item.getItem() instanceof IRackItem) { - return ((IRackItem) item.getItem()).canHang(this, item, slot); - } - if (item.getItem() instanceof ItemArmor) - return false; - // if(item.getItem() instanceof ItemCrossbow || item.getItem() instanceof - // ItemBomb || item.getItem() instanceof ItemMine)return false; - return item.getItem().isItemTool(item); - } - - @Override - public String getInventoryName() { - return null; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public void openInventory() { - - } - - @Override - public void closeInventory() { - } - - public boolean hasRackAbove(int slot) { - TileEntity side = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); - return side != null && side instanceof TileEntityRack;// && ((TileEntityRack)side).getStackInSlot(slot) == null; - } - - public boolean hasRackBelow(int slot) { - TileEntity side = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); - return side != null && side instanceof TileEntityRack;// && ((TileEntityRack)side).getStackInSlot(slot) == null; - } - - public void updateInventory() { - if (!worldObj.isRemote) { - for (int x = 0; x < getSizeInventory(); x++) { - ItemStack item = this.getStackInSlot(x); - if (item != null && !canHang(item, x)) { - EntityItem drop = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, item); - worldObj.spawnEntityInWorld(drop); - setInventorySlotContents(x, null); - } - } - } - } + } + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) { + if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { + return false; + } + return entityplayer.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64D; + } + + @Override + public ItemStack getStackInSlotOnClosing(int var1) { + return null; + } + + private int getEnchantment(int i) { + ItemStack is = this.getStackInSlot(i); + if (is == null) + return 0; + + if (is.isItemEnchanted()) + return 1; + + return 0; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) { + return false; + } + + /* + * North: WEST: 0=2 South: SOUTH: 1=1 West: EAST: 2=3 East: NORTH: 3=0 + */ + public int getSlotFor(float x, float y) { + int direction = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + ForgeDirection FD = ForgeDirection.getOrientation(direction); + float offset = 1F / 16F; + + float x1 = 0.0F + offset; + float x2 = 1.0F - offset; + float y1 = 0.0F; + float y2 = 1.0F; + if (FD == ForgeDirection.EAST || FD == ForgeDirection.WEST) { + x1 = 0.0F; + x2 = 1.0F; + y1 = 0.0F + offset; + y2 = 1.0F - offset; + } + int[] coord = BlockPositionHelper.getCoordsFor(x, y, x1, x2, y1, y2, 4, 4, direction); + + if (coord == null) { + return -1; + } + return coord[0]; + + } + + public boolean canHang(ItemStack item, int slot) { + if (item == null || item.getItem() == null) { + return false; + } + if (item.getItem() instanceof ItemBlock) { + return false; + } + if (item.getItem() instanceof IRackItem) { + return ((IRackItem) item.getItem()).canHang(this, item, slot); + } + if (item.getItem() instanceof ItemArmor) + return false; + // if(item.getItem() instanceof ItemCrossbow || item.getItem() instanceof + // ItemBomb || item.getItem() instanceof ItemMine)return false; + return item.getItem().isItemTool(item); + } + + @Override + public String getInventoryName() { + return null; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public void openInventory() { + + } + + @Override + public void closeInventory() { + } + + public boolean hasRackAbove(int slot) { + TileEntity side = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + return side != null && side instanceof TileEntityRack;// && ((TileEntityRack)side).getStackInSlot(slot) == null; + } + + public boolean hasRackBelow(int slot) { + TileEntity side = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + return side != null && side instanceof TileEntityRack;// && ((TileEntityRack)side).getStackInSlot(slot) == null; + } + + public void updateInventory() { + if (!worldObj.isRemote) { + for (int x = 0; x < getSizeInventory(); x++) { + ItemStack item = this.getStackInSlot(x); + if (item != null && !canHang(item, x)) { + EntityItem drop = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, item); + worldObj.spawnEntityInWorld(drop); + setInventorySlotContents(x, null); + } + } + } + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java index a7314de1..b2dd5a51 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java @@ -2,8 +2,8 @@ import minefantasy.mf2.api.heating.IQuenchBlock; import minefantasy.mf2.item.food.FoodListMF; -import minefantasy.mf2.network.packet.TroughPacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.TroughPacket; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -11,126 +11,124 @@ import net.minecraft.world.WorldServer; public class TileEntityTrough extends TileEntityWoodDecor implements IQuenchBlock { - public int fill; - - public TileEntityTrough() { - super("trough_wood"); - } - - @Override - public float quench() { - if (fill > 0) { - --fill; - return 0F; - } - return -1F; - } - - public boolean interact(EntityPlayer user, ItemStack held) { - if (held != null) { - int glass_bottle = 1, jug = 1, bucket = 16; - if (fill < getCapacity())// Give - { - if (held.getItem() == Items.water_bucket) { - user.setCurrentItemOrArmor(0, new ItemStack(Items.bucket)); - addCapacity(bucket); - return true; - } - if (held.getItem() == FoodListMF.jug_water) { - givePlayerItem(user, held, new ItemStack(FoodListMF.jug_empty)); - addCapacity(jug); - return true; - } - if (held.getItem() == Items.potionitem && held.getItemDamage() == 0) { - givePlayerItem(user, held, new ItemStack(Items.glass_bottle)); - addCapacity(glass_bottle); - return true; - } - } - - // Take - if (fill >= 1 && held.getItem() == Items.glass_bottle && held.getItemDamage() == 0) { - givePlayerItem(user, held, new ItemStack(Items.potionitem)); - addCapacity(-glass_bottle); - return true; - } - if (fill >= 16 && held.getItem() == Items.bucket) { - givePlayerItem(user, held, new ItemStack(Items.water_bucket)); - addCapacity(-bucket); - return true; - } - - } - return false; - } - - private void givePlayerItem(EntityPlayer user, ItemStack held, ItemStack jug) { - if (held.stackSize == 1) { - user.setCurrentItemOrArmor(0, jug); - return; - } - - --held.stackSize; - if (!user.inventory.addItemStackToInventory(jug)) { - if (!user.worldObj.isRemote) { - user.entityDropItem(jug, 0F); - } - } - } - - private int ticksExisted; - - @Override - public void updateEntity() { - ++ticksExisted; - if (ticksExisted == 20 || ticksExisted % 100 == 0) { - syncData(); - } - if (ticksExisted % 100 == 0 && worldObj.canLightningStrikeAt(xCoord, yCoord + 1, zCoord)) { - addCapacity(1); - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("fill", fill); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - fill = nbt.getInteger("fill"); - } - - private void addCapacity(int i) { - int cap = getCapacity(); - fill = Math.min(cap, fill + i); - syncData(); - } - - public static int capacityScale = 8; - - @Override - public int getCapacity() { - return super.getCapacity() * capacityScale; - } - - public void syncData() { - if (worldObj.isRemote) - return; - - NetworkUtils.sendToWatchers(new TroughPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); - super.sendPacketToClient(); + public static int capacityScale = 8; + public int fill; + private int ticksExisted; + + public TileEntityTrough() { + super("trough_wood"); + } + + @Override + public float quench() { + if (fill > 0) { + --fill; + return 0F; + } + return -1F; + } + + public boolean interact(EntityPlayer user, ItemStack held) { + if (held != null) { + int glass_bottle = 1, jug = 1, bucket = 16; + if (fill < getCapacity())// Give + { + if (held.getItem() == Items.water_bucket) { + user.setCurrentItemOrArmor(0, new ItemStack(Items.bucket)); + addCapacity(bucket); + return true; + } + if (held.getItem() == FoodListMF.jug_water) { + givePlayerItem(user, held, new ItemStack(FoodListMF.jug_empty)); + addCapacity(jug); + return true; + } + if (held.getItem() == Items.potionitem && held.getItemDamage() == 0) { + givePlayerItem(user, held, new ItemStack(Items.glass_bottle)); + addCapacity(glass_bottle); + return true; + } + } + + // Take + if (fill >= 1 && held.getItem() == Items.glass_bottle && held.getItemDamage() == 0) { + givePlayerItem(user, held, new ItemStack(Items.potionitem)); + addCapacity(-glass_bottle); + return true; + } + if (fill >= 16 && held.getItem() == Items.bucket) { + givePlayerItem(user, held, new ItemStack(Items.water_bucket)); + addCapacity(-bucket); + return true; + } + + } + return false; + } + + private void givePlayerItem(EntityPlayer user, ItemStack held, ItemStack jug) { + if (held.stackSize == 1) { + user.setCurrentItemOrArmor(0, jug); + return; + } + + --held.stackSize; + if (!user.inventory.addItemStackToInventory(jug)) { + if (!user.worldObj.isRemote) { + user.entityDropItem(jug, 0F); + } + } + } + + @Override + public void updateEntity() { + ++ticksExisted; + if (ticksExisted == 20 || ticksExisted % 100 == 0) { + syncData(); + } + if (ticksExisted % 100 == 0 && worldObj.canLightningStrikeAt(xCoord, yCoord + 1, zCoord)) { + addCapacity(1); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("fill", fill); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + fill = nbt.getInteger("fill"); + } + + private void addCapacity(int i) { + int cap = getCapacity(); + fill = Math.min(cap, fill + i); + syncData(); + } + + @Override + public int getCapacity() { + return super.getCapacity() * capacityScale; + } + + public void syncData() { + if (worldObj.isRemote) + return; + + NetworkUtils.sendToWatchers(new TroughPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + super.sendPacketToClient(); /* - List players = ((WorldServer) worldObj).playerEntities; + List players = ((WorldServer) worldObj).playerEntities; for (int i = 0; i < players.size(); i++) { EntityPlayer player = players.get(i); ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new TroughPacket(this).generatePacket()); super.sendPacketToClient(player); } */ - } + } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java index c161ee1d..60d040af 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java @@ -2,87 +2,87 @@ import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockWoodDecor; -import minefantasy.mf2.network.packet.WoodDecorPacket; import minefantasy.mf2.network.NetworkUtils; +import minefantasy.mf2.network.packet.WoodDecorPacket; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldServer; public abstract class TileEntityWoodDecor extends TileEntity { - private String tex; - private CustomMaterial material; + private String tex; + private CustomMaterial material; - public TileEntityWoodDecor(String tex) { - this.tex = tex; - this.material = CustomMaterial.getMaterial("RefinedWood"); - } + public TileEntityWoodDecor(String tex) { + this.tex = tex; + this.material = CustomMaterial.getMaterial("RefinedWood"); + } - public TileEntityWoodDecor(String tex, CustomMaterial material) { - this.tex = tex; - this.material = material; - } + public TileEntityWoodDecor(String tex, CustomMaterial material) { + this.tex = tex; + this.material = material; + } - public CustomMaterial getMaterial() { - return this.material != null ? this.material : trySetMaterial("RefinedWood"); - } + public static int getCapacity(int tier) { + return (tier) * 4 + 4; + } - public String getMaterialName() { - return this.material != null ? material.name : "RefinedWood"; - } + public CustomMaterial getMaterial() { + return this.material != null ? this.material : trySetMaterial("RefinedWood"); + } - public void setMaterial(CustomMaterial material) { - this.material = material; - } + public void setMaterial(CustomMaterial material) { + this.material = material; + } - public CustomMaterial trySetMaterial(String materialName) { - CustomMaterial material = CustomMaterial.getMaterial(materialName); - if (material != null) { - this.material = material; - } - return this.material; - } + public String getMaterialName() { + return this.material != null ? material.name : "RefinedWood"; + } - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setString("Material", this.getMaterialName()); - } + public CustomMaterial trySetMaterial(String materialName) { + CustomMaterial material = CustomMaterial.getMaterial(materialName); + if (material != null) { + this.material = material; + } + return this.material; + } - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - this.trySetMaterial(nbt.getString("Material")); - } + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setString("Material", this.getMaterialName()); + } - public int getCapacity() { - CustomMaterial material = getMaterial(); - if (material != null) { - return getCapacity(material.tier); - } - return getCapacity(0); - } + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.trySetMaterial(nbt.getString("Material")); + } - public static int getCapacity(int tier) { - return (tier) * 4 + 4; - } + public int getCapacity() { + CustomMaterial material = getMaterial(); + if (material != null) { + return getCapacity(material.tier); + } + return getCapacity(0); + } - public String getTexName() { - if (worldObj != null) { - Block block = worldObj.getBlock(xCoord, yCoord, zCoord); - if (block instanceof BlockWoodDecor) { - this.tex = ((BlockWoodDecor) block).getFullTexName(); - } - } - return tex; - } + public String getTexName() { + if (worldObj != null) { + Block block = worldObj.getBlock(xCoord, yCoord, zCoord); + if (block instanceof BlockWoodDecor) { + this.tex = ((BlockWoodDecor) block).getFullTexName(); + } + } + return tex; + } - public void sendPacketToClient() { - NetworkUtils.sendToWatchers(new WoodDecorPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); - } + public void sendPacketToClient() { + NetworkUtils.sendToWatchers(new WoodDecorPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); + } /* - public void sendPacketToClient(EntityPlayer player){ + public void sendPacketToClient(EntityPlayer player){ ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new WoodDecorPacket(this).generatePacket()); } */ diff --git a/src/main/java/minefantasy/mf2/block/tree/BlockLeavesMF.java b/src/main/java/minefantasy/mf2/block/tree/BlockLeavesMF.java index 3d80657b..81626994 100644 --- a/src/main/java/minefantasy/mf2/block/tree/BlockLeavesMF.java +++ b/src/main/java/minefantasy/mf2/block/tree/BlockLeavesMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.tree; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -16,83 +14,84 @@ import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.IShearable; +import java.util.Random; + public class BlockLeavesMF extends BlockLeaves implements IShearable { - private String name; - private Block sapling; - private int dropRate; - - public BlockLeavesMF(String baseWood) { - this(baseWood, 20); - } - - public BlockLeavesMF(String baseWood, int droprate) { - this.name = baseWood.toLowerCase() + "_leaves"; - GameRegistry.registerBlock(this, name); - this.dropRate = droprate; - this.setTickRandomly(true); - this.setBlockName(name); - this.setBlockTextureName("minefantasy2:tree/" + name); - } - - @SideOnly(Side.CLIENT) - @Override - public int getRenderColor(int id) { - return ColorizerFoliage.getFoliageColorBasic(); - } - - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { - return Blocks.leaves.shouldSideBeRendered(world, x, y, z, side); - } - - @Override - public boolean isOpaqueCube() { - return Blocks.leaves.isOpaqueCube(); - } - - @Override - public int quantityDropped(Random rand) { - return 1; - } - - @Override - public Item getItemDropped(int meta, Random rand, int fort) { - return Item.getItemFromBlock(getBlockDrop()); - } - - @Override - protected int func_150123_b(int meta) { - return meta == 15 ? dropRate * 2 : dropRate; - } - - private Block getBlockDrop() { - return this == BlockListMF.leaves_ebony ? BlockListMF.sapling_ebony - : this == BlockListMF.leaves_ironbark ? BlockListMF.sapling_ironbark : BlockListMF.sapling_yew; - } - - @Override - public int damageDropped(int meta) { - return 0; - } - - @SideOnly(Side.CLIENT) - private IIcon opaque_icon; - - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) { - return Blocks.leaves.isOpaqueCube() ? opaque_icon : blockIcon; - } - - @Override - public String[] func_150125_e() { - return new String[] { "" }; - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - super.registerBlockIcons(reg); - this.opaque_icon = reg.registerIcon(this.getTextureName() + "_opaque"); - } + private String name; + private Block sapling; + private int dropRate; + @SideOnly(Side.CLIENT) + private IIcon opaque_icon; + + public BlockLeavesMF(String baseWood) { + this(baseWood, 20); + } + + public BlockLeavesMF(String baseWood, int droprate) { + this.name = baseWood.toLowerCase() + "_leaves"; + GameRegistry.registerBlock(this, name); + this.dropRate = droprate; + this.setTickRandomly(true); + this.setBlockName(name); + this.setBlockTextureName("minefantasy2:tree/" + name); + } + + @SideOnly(Side.CLIENT) + @Override + public int getRenderColor(int id) { + return ColorizerFoliage.getFoliageColorBasic(); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return Blocks.leaves.shouldSideBeRendered(world, x, y, z, side); + } + + @Override + public boolean isOpaqueCube() { + return Blocks.leaves.isOpaqueCube(); + } + + @Override + public int quantityDropped(Random rand) { + return 1; + } + + @Override + public Item getItemDropped(int meta, Random rand, int fort) { + return Item.getItemFromBlock(getBlockDrop()); + } + + @Override + protected int func_150123_b(int meta) { + return meta == 15 ? dropRate * 2 : dropRate; + } + + private Block getBlockDrop() { + return this == BlockListMF.leaves_ebony ? BlockListMF.sapling_ebony + : this == BlockListMF.leaves_ironbark ? BlockListMF.sapling_ironbark : BlockListMF.sapling_yew; + } + + @Override + public int damageDropped(int meta) { + return 0; + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + return Blocks.leaves.isOpaqueCube() ? opaque_icon : blockIcon; + } + + @Override + public String[] func_150125_e() { + return new String[]{""}; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + this.opaque_icon = reg.registerIcon(this.getTextureName() + "_opaque"); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/tree/BlockLogMF.java b/src/main/java/minefantasy/mf2/block/tree/BlockLogMF.java index 60ce2fb1..4d06525e 100644 --- a/src/main/java/minefantasy/mf2/block/tree/BlockLogMF.java +++ b/src/main/java/minefantasy/mf2/block/tree/BlockLogMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.tree; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -15,73 +13,74 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class BlockLogMF extends BlockLog { - private IIcon sideTex, topTex; - private String name; +import java.util.Random; - public BlockLogMF(String baseWood) { - name = baseWood.toLowerCase() + "_log"; - GameRegistry.registerBlock(this, name); - setBlockName(name); - this.setHarvestLevel("axe", 0); - this.setCreativeTab(CreativeTabs.tabBlock); - } +public class BlockLogMF extends BlockLog { + private IIcon sideTex, topTex; + private String name; + private Random rand = new Random(); - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) { - if (meta == 15) { - return side <= 1 ? topTex : sideTex; - } - return super.getIcon(side, meta); - } + public BlockLogMF(String baseWood) { + name = baseWood.toLowerCase() + "_log"; + GameRegistry.registerBlock(this, name); + setBlockName(name); + this.setHarvestLevel("axe", 0); + this.setCreativeTab(CreativeTabs.tabBlock); + } - @SideOnly(Side.CLIENT) - @Override - protected IIcon getSideIcon(int meta) { - return sideTex; - } + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int side, int meta) { + if (meta == 15) { + return side <= 1 ? topTex : sideTex; + } + return super.getIcon(side, meta); + } - @SideOnly(Side.CLIENT) - @Override - protected IIcon getTopIcon(int meta) { - return topTex; - } + @SideOnly(Side.CLIENT) + @Override + protected IIcon getSideIcon(int meta) { + return sideTex; + } - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister reg) { - sideTex = reg.registerIcon("minefantasy2:tree/" + name + "_side"); - topTex = reg.registerIcon("minefantasy2:tree/" + name + "_top"); - } + @SideOnly(Side.CLIENT) + @Override + protected IIcon getTopIcon(int meta) { + return topTex; + } - private Block getSaplingDrop() { - return this == BlockListMF.log_ebony ? BlockListMF.sapling_ebony - : this == BlockListMF.log_ironbark ? BlockListMF.sapling_ironbark : BlockListMF.sapling_yew; - } + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + sideTex = reg.registerIcon("minefantasy2:tree/" + name + "_side"); + topTex = reg.registerIcon("minefantasy2:tree/" + name + "_top"); + } - private Random rand = new Random(); + private Block getSaplingDrop() { + return this == BlockListMF.log_ebony ? BlockListMF.sapling_ebony + : this == BlockListMF.log_ironbark ? BlockListMF.sapling_ironbark : BlockListMF.sapling_yew; + } - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - super.breakBlock(world, x, y, z, block, meta); - if (meta == 15) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + super.breakBlock(world, x, y, z, block, meta); + if (meta == 15) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; - EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(getSaplingDrop(), 1)); + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(getSaplingDrop(), 1)); - float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; - world.spawnEntityInWorld(entityitem); - } - } + float f3 = 0.05F; + entityitem.motionX = (float) this.rand.nextGaussian() * f3; + entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } - @Override - public int damageDropped(int meta) { - return 0; - } + @Override + public int damageDropped(int meta) { + return 0; + } } diff --git a/src/main/java/minefantasy/mf2/block/tree/BlockSaplingMF.java b/src/main/java/minefantasy/mf2/block/tree/BlockSaplingMF.java index bda393ab..92a16576 100644 --- a/src/main/java/minefantasy/mf2/block/tree/BlockSaplingMF.java +++ b/src/main/java/minefantasy/mf2/block/tree/BlockSaplingMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.block.tree; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.mechanics.worldGen.WorldGenMFTree; import net.minecraft.block.Block; @@ -14,100 +12,102 @@ import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; +import java.util.Random; + public class BlockSaplingMF extends BlockBush implements IGrowable { - private final Block log, leaves; - private float growthModifier; - private String name; - - public BlockSaplingMF(String baseWood, Block log, Block leaves, float growthModifier) { - super(Material.plants); - setStepSound(Block.soundTypeGrass); - float f = 0.4F; - this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f); - this.setCreativeTab(CreativeTabs.tabDecorations); - this.growthModifier = growthModifier; - name = baseWood.toLowerCase() + "_sapling"; - this.log = log; - this.leaves = leaves; - - setBlockTextureName("minefantasy2:tree/" + name); - GameRegistry.registerBlock(this, name); - setBlockName(name); - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random rand) { - if (!world.isRemote) { - super.updateTick(world, x, y, z, rand); - - if (world.getBlockLightValue(x, y + 1, z) >= 9 && rand.nextFloat() * 100F < (14.30F) / growthModifier) { - this.initGrow(world, x, y, z, rand); - } - } - } - - public void initGrow(World world, int x, int y, int z, Random rand) { - int l = world.getBlockMetadata(x, y, z); - - if ((l & 8) == 0) { - world.setBlockMetadataWithNotify(x, y, z, l | 8, 4); - } else { - this.tryGrow(world, x, y, z, rand); - } - } - - public void tryGrow(World world, int x, int y, int z, Random rand) { - if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, rand, x, y, z)) - return; - int l = world.getBlockMetadata(x, y, z) & 7; - Object treegen = new WorldGenMFTree(true, log, leaves); - int i1 = 0; - int j1 = 0; - boolean flag = false; - - Block block = Blocks.air; - world.setBlock(x, y, z, block, 0, 4); - - if (!((WorldGenerator) treegen).generate(world, rand, x + i1, y, z + j1)) { - if (flag) { - world.setBlock(x + i1, y, z + j1, this, l, 4); - world.setBlock(x + i1 + 1, y, z + j1, this, l, 4); - world.setBlock(x + i1, y, z + j1 + 1, this, l, 4); - world.setBlock(x + i1 + 1, y, z + j1 + 1, this, l, 4); - } else { - world.setBlock(x, y, z, this, l, 4); - } - } - } - - public boolean func_149880_a(World p_149880_1_, int p_149880_2_, int p_149880_3_, int p_149880_4_, - int p_149880_5_) { - return p_149880_1_.getBlock(p_149880_2_, p_149880_3_, p_149880_4_) == this - && (p_149880_1_.getBlockMetadata(p_149880_2_, p_149880_3_, p_149880_4_) & 7) == p_149880_5_; - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - public int damageDropped(int p_149692_1_) { - return MathHelper.clamp_int(p_149692_1_ & 7, 0, 5); - } - - public boolean func_149851_a(World p_149851_1_, int p_149851_2_, int p_149851_3_, int p_149851_4_, - boolean p_149851_5_) { - return true; - } - - public boolean func_149852_a(World p_149852_1_, Random p_149852_2_, int p_149852_3_, int p_149852_4_, - int p_149852_5_) { - return p_149852_1_.rand.nextFloat() < (0.45D) / growthModifier; - } - - public void func_149853_b(World p_149853_1_, Random p_149853_2_, int p_149853_3_, int p_149853_4_, - int p_149853_5_) { - this.initGrow(p_149853_1_, p_149853_3_, p_149853_4_, p_149853_5_, p_149853_2_); - } + private final Block log, leaves; + private float growthModifier; + private String name; + + public BlockSaplingMF(String baseWood, Block log, Block leaves, float growthModifier) { + super(Material.plants); + setStepSound(Block.soundTypeGrass); + float f = 0.4F; + this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f); + this.setCreativeTab(CreativeTabs.tabDecorations); + this.growthModifier = growthModifier; + name = baseWood.toLowerCase() + "_sapling"; + this.log = log; + this.leaves = leaves; + + setBlockTextureName("minefantasy2:tree/" + name); + GameRegistry.registerBlock(this, name); + setBlockName(name); + } + + /** + * Ticks the block if it's been scheduled + */ + @Override + public void updateTick(World world, int x, int y, int z, Random rand) { + if (!world.isRemote) { + super.updateTick(world, x, y, z, rand); + + if (world.getBlockLightValue(x, y + 1, z) >= 9 && rand.nextFloat() * 100F < (14.30F) / growthModifier) { + this.initGrow(world, x, y, z, rand); + } + } + } + + public void initGrow(World world, int x, int y, int z, Random rand) { + int l = world.getBlockMetadata(x, y, z); + + if ((l & 8) == 0) { + world.setBlockMetadataWithNotify(x, y, z, l | 8, 4); + } else { + this.tryGrow(world, x, y, z, rand); + } + } + + public void tryGrow(World world, int x, int y, int z, Random rand) { + if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(world, rand, x, y, z)) + return; + int l = world.getBlockMetadata(x, y, z) & 7; + Object treegen = new WorldGenMFTree(true, log, leaves); + int i1 = 0; + int j1 = 0; + boolean flag = false; + + Block block = Blocks.air; + world.setBlock(x, y, z, block, 0, 4); + + if (!((WorldGenerator) treegen).generate(world, rand, x + i1, y, z + j1)) { + if (flag) { + world.setBlock(x + i1, y, z + j1, this, l, 4); + world.setBlock(x + i1 + 1, y, z + j1, this, l, 4); + world.setBlock(x + i1, y, z + j1 + 1, this, l, 4); + world.setBlock(x + i1 + 1, y, z + j1 + 1, this, l, 4); + } else { + world.setBlock(x, y, z, this, l, 4); + } + } + } + + public boolean func_149880_a(World p_149880_1_, int p_149880_2_, int p_149880_3_, int p_149880_4_, + int p_149880_5_) { + return p_149880_1_.getBlock(p_149880_2_, p_149880_3_, p_149880_4_) == this + && (p_149880_1_.getBlockMetadata(p_149880_2_, p_149880_3_, p_149880_4_) & 7) == p_149880_5_; + } + + /** + * Determines the damage on the item the block drops. Used in cloth and wood. + */ + public int damageDropped(int p_149692_1_) { + return MathHelper.clamp_int(p_149692_1_ & 7, 0, 5); + } + + public boolean func_149851_a(World p_149851_1_, int p_149851_2_, int p_149851_3_, int p_149851_4_, + boolean p_149851_5_) { + return true; + } + + public boolean func_149852_a(World p_149852_1_, Random p_149852_2_, int p_149852_3_, int p_149852_4_, + int p_149852_5_) { + return p_149852_1_.rand.nextFloat() < (0.45D) / growthModifier; + } + + public void func_149853_b(World p_149853_1_, Random p_149853_2_, int p_149853_3_, int p_149853_4_, + int p_149853_5_) { + this.initGrow(p_149853_1_, p_149853_3_, p_149853_4_, p_149853_5_, p_149853_2_); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/FontHelper.java b/src/main/java/minefantasy/mf2/client/FontHelper.java index 46cc4937..201f8742 100644 --- a/src/main/java/minefantasy/mf2/client/FontHelper.java +++ b/src/main/java/minefantasy/mf2/client/FontHelper.java @@ -2,31 +2,31 @@ public final class FontHelper { - public static boolean isFormatColour(char colour) { - return colour >= 48 && colour <= 57 || colour >= 97 && colour <= 102 || colour >= 65 && colour <= 70; - } - - public static boolean isFormatSpecial(char chars) { - return chars >= 107 && chars <= 111 || chars >= 75 && chars <= 79 || chars == 114 || chars == 82; - } - - public static String getFormatFromString(String string) { - String s1 = ""; - int i = -1; - int j = string.length(); - - while ((i = string.indexOf(167, i + 1)) != -1) { - if (i < j - 1) { - char c0 = string.charAt(i + 1); - - if (isFormatColour(c0)) - s1 = "\u00a7" + c0; - else if (isFormatSpecial(c0)) - s1 = s1 + "\u00a7" + c0; - } - } - - return s1; - } + public static boolean isFormatColour(char colour) { + return colour >= 48 && colour <= 57 || colour >= 97 && colour <= 102 || colour >= 65 && colour <= 70; + } + + public static boolean isFormatSpecial(char chars) { + return chars >= 107 && chars <= 111 || chars >= 75 && chars <= 79 || chars == 114 || chars == 82; + } + + public static String getFormatFromString(String string) { + String s1 = ""; + int i = -1; + int j = string.length(); + + while ((i = string.indexOf(167, i + 1)) != -1) { + if (i < j - 1) { + char c0 = string.charAt(i + 1); + + if (isFormatColour(c0)) + s1 = "\u00a7" + c0; + else if (isFormatSpecial(c0)) + s1 = s1 + "\u00a7" + c0; + } + } + + return s1; + } } diff --git a/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java b/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java index 09618a1d..77245417 100644 --- a/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java +++ b/src/main/java/minefantasy/mf2/client/KnowledgePageRegistry.java @@ -2,17 +2,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.knowledge.client.EntryPage; -import minefantasy.mf2.api.knowledge.client.EntryPageBlastFurnace; -import minefantasy.mf2.api.knowledge.client.EntryPageCrucible; -import minefantasy.mf2.api.knowledge.client.EntryPageGrind; -import minefantasy.mf2.api.knowledge.client.EntryPageImage; -import minefantasy.mf2.api.knowledge.client.EntryPageRecipeAnvil; -import minefantasy.mf2.api.knowledge.client.EntryPageRecipeBase; -import minefantasy.mf2.api.knowledge.client.EntryPageRecipeBloom; -import minefantasy.mf2.api.knowledge.client.EntryPageRecipeCarpenter; -import minefantasy.mf2.api.knowledge.client.EntryPageSmelting; -import minefantasy.mf2.api.knowledge.client.EntryPageText; +import minefantasy.mf2.api.knowledge.client.*; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.item.food.FoodListMF; @@ -27,875 +17,875 @@ @SideOnly(Side.CLIENT) public class KnowledgePageRegistry { - public static void registerPages() { - ItemStack pigiron = ComponentListMF.bar("PigIron"); - ItemStack black = ComponentListMF.bar("BlackSteel"); - ItemStack red = ComponentListMF.bar("RedSteel"); - ItemStack blue = ComponentListMF.bar("BlueSteel"); - if (ConfigHardcore.HCCallowRocks) { - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.hcc"), - new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.dirtRockR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stonePickR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), - new EntryPageRecipeCarpenter(KnowledgeListMF.sharpRocksR)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpearR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAxeR)); - } - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.1"), - new EntryPageText("knowledge.gettingStarted.2")); - - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.carpenter"), - new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.fire"), - new EntryPageRecipeBase(KnowledgeListMF.firepitRecipe), - new EntryPageRecipeBase(KnowledgeListMF.dryrocksR)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.food"), - new EntryPageRecipeBase(KnowledgeListMF.cooktopRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneovenRecipe)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.tanning"), - new EntryPageRecipeCarpenter(KnowledgeListMF.tannerRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.forging"), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAnvilRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.forgeRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), - new EntryPageRecipeBase(KnowledgeListMF.dryrocksR), - new EntryPageRecipeCarpenter(KnowledgeListMF.apronRecipe)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.forgingbars"), - new EntryPageRecipeAnvil(KnowledgeListMF.barR)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.flux"), - new EntryPageRecipeAnvil(KnowledgeListMF.fluxR)); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.3"), - new EntryPageRecipeAnvil(KnowledgeListMF.shearsR), new EntryPageText("knowledge.gettingStarted.4"), - new EntryPageText("knowledge.gettingStarted.5"), new EntryPageRecipeAnvil(KnowledgeListMF.hammerR), - new EntryPageRecipeAnvil(KnowledgeListMF.tongsR), new EntryPageText("knowledge.gettingStarted.6")); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.upgrade"), - new EntryPageRecipeCarpenter(KnowledgeListMF.researchTableRecipe), - new EntryPageText("knowledge.gettingStarted.7")); - KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.10"), - new EntryPageRecipeCarpenter(KnowledgeListMF.potRecipe), - new EntryPageSmelting(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot), - new EntryPageRecipeCarpenter(KnowledgeListMF.quernR), new EntryPageText("knowledge.gettingStarted.11"), - new EntryPageText("knowledge.gettingStarted.12")); - KnowledgeListMF.gettingStarted.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.bSalvageR), - new EntryPageText("knowledge.gettingStarted.13")); - - KnowledgeListMF.research.addPages(new EntryPageText("knowledge.research.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.researchTableRecipe), - new EntryPageText("knowledge.research.2")); - KnowledgeListMF.talisman.addPages(new EntryPageText("knowledge.talisman.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.talismanRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.artBookR), - new EntryPageRecipeCarpenter(KnowledgeListMF.conBookR), - new EntryPageRecipeCarpenter(KnowledgeListMF.proBookR), - new EntryPageRecipeCarpenter(KnowledgeListMF.engBookR), - new EntryPageRecipeCarpenter(KnowledgeListMF.comBookR), new EntryPageText("knowledge.talisman.2"), - new EntryPageRecipeAnvil(KnowledgeListMF.greatTalismanRecipe)); - KnowledgeListMF.talisman.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.artBook2R), - new EntryPageRecipeCarpenter(KnowledgeListMF.conBook2R), - new EntryPageRecipeCarpenter(KnowledgeListMF.proBook2R), - new EntryPageRecipeCarpenter(KnowledgeListMF.engBook2R), - new EntryPageRecipeCarpenter(KnowledgeListMF.comBook2R)); - KnowledgeListMF.stamina.addPages(new EntryPageText("knowledge.stamina.1")); - KnowledgeListMF.combat.addPages(new EntryPageText("knowledge.combat.1"), - new EntryPageText("knowledge.parry.info"), new EntryPageText("knowledge.advparry.info"), - new EntryPageText("knowledge.poweratt.info"), new EntryPageText("knowledge.dodge.info"), - new EntryPageText("knowledge.armour.info")); - KnowledgeListMF.craftArmourBasic.addPages(new EntryPageText("knowledge.craftArmourBasic.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.hideHelmR), - new EntryPageRecipeCarpenter(KnowledgeListMF.hideChestR), - new EntryPageRecipeCarpenter(KnowledgeListMF.hideLegsR), - new EntryPageRecipeCarpenter(KnowledgeListMF.hideBootsR)); - KnowledgeListMF.craftArmourBasic.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.roughHelmetR), - new EntryPageRecipeCarpenter(KnowledgeListMF.roughChestR), - new EntryPageRecipeCarpenter(KnowledgeListMF.roughLegsR), - new EntryPageRecipeCarpenter(KnowledgeListMF.roughBootsR)); - - KnowledgeListMF.carpenter.addPages(new EntryPageText("knowledge.carpenter.1"), - new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe)); - KnowledgeListMF.salvage.addPages(new EntryPageText("knowledge.salvage.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.bSalvageR), new EntryPageText("knowledge.salvage.2")); - - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.1")); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.plank"), - new EntryPageRecipeBase(KnowledgeListMF.plankRecipe), - new EntryPageRecipeBase(KnowledgeListMF.stickRecipe)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.refinedplank"), - new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), - new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), - new EntryPageRecipeBase(KnowledgeListMF.plantOilR), - new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.flux"), - new EntryPageRecipeAnvil(KnowledgeListMF.fluxR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.bar.1")); - KnowledgeListMF.commodities.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.barR), - new EntryPageRecipeAnvil(KnowledgeListMF.baringotR)); - - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.hunks"), - new EntryPageRecipeAnvil(KnowledgeListMF.hunkR), new EntryPageRecipeAnvil(KnowledgeListMF.ingotR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.nail"), - new EntryPageRecipeAnvil(KnowledgeListMF.nailR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.rivet"), - new EntryPageRecipeAnvil(KnowledgeListMF.rivetR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.leatherstrip"), - new EntryPageRecipeCarpenter(KnowledgeListMF.lStripsR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.thread"), - new EntryPageRecipeCarpenter(KnowledgeListMF.threadR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stringR)); - KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.bucket"), - new EntryPageRecipeAnvil(KnowledgeListMF.bucketR)); - - KnowledgeListMF.dust.addPages(new EntryPageText("knowledge.dust.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.potRecipe), - new EntryPageSmelting(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot), - new EntryPageRecipeCarpenter(KnowledgeListMF.quernR), new EntryPageText("knowledge.dust.quern")); - KnowledgeListMF.dust.addPages( - new EntryPageGrind(new ItemStack(Items.coal), new ItemStack(ComponentListMF.coalDust)), - new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), - new ItemStack(ComponentListMF.kaolinite_dust)), - new EntryPageGrind(new ItemStack(Items.wheat), new ItemStack(FoodListMF.flour)), - new EntryPageGrind(new ItemStack(Items.dye, 1, 3), new ItemStack(FoodListMF.coca_powder))); - KnowledgeListMF.dust.addPages(new EntryPageText("knowledge.dust.icing"), - new EntryPageRecipeCarpenter(KnowledgeListMF.spoonR), - new EntryPageRecipeCarpenter(KnowledgeListMF.icingRecipe)); - - KnowledgeListMF.ores.addPages(new EntryPageText("knowledge.ores.1"), new EntryPageText("")); - KnowledgeListMF.ores.addPages(assembleOreDescHC("copper", BlockListMF.oreCopper, ComponentListMF.ingots[0])); - KnowledgeListMF.ores.addPages(assembleOreDescHC("tin", BlockListMF.oreTin, ComponentListMF.ingots[1])); - KnowledgeListMF.ores.addPages(assembleOreDescHC("silver", BlockListMF.oreSilver, ComponentListMF.ingots[8])); - KnowledgeListMF.ores.addPages(assembleOreDesc("wolframite", BlockListMF.oreTungsten)); - KnowledgeListMF.ores.addPages(new EntryPageCrucible(KnowledgeListMF.wolframiteR)); - KnowledgeListMF.ores.addPages(assembleOreDesc("mythic", BlockListMF.oreMythic)); - KnowledgeListMF.ores.addPages(new EntryPageText("knowledge.ores.2")); - KnowledgeListMF.ores.addPages(assembleMineralDesc("clay", BlockListMF.oreClay)); - KnowledgeListMF.ores.addPages(assembleMineralDesc("kaolinite", BlockListMF.oreKaolinite)); - KnowledgeListMF.ores.addPages(assembleMineralDesc("limestone", BlockListMF.limestone)); - KnowledgeListMF.ores.addPages(assembleMineralDesc("borax", BlockListMF.oreBorax)); - KnowledgeListMF.ores.addPages(assembleMineralDesc("nitre", BlockListMF.oreNitre)); - KnowledgeListMF.ores.addPages(assembleMineralDesc("sulfur", BlockListMF.oreSulfur)); - - KnowledgeListMF.plants.addPages(new EntryPageText("knowledge.plants.1")); - KnowledgeListMF.plants.addPages(assembleImgPage("berry", BlockListMF.berryBush)); - KnowledgeListMF.plants.addPages(new EntryPageText("knowledge.plants.2")); - KnowledgeListMF.plants.addPages(assembleImgPage("yew", BlockListMF.log_yew)); - KnowledgeListMF.plants.addPages(assembleImgPage("ironbark", BlockListMF.log_ironbark)); - KnowledgeListMF.plants.addPages(assembleImgPage("ebony", BlockListMF.log_ebony)); - - KnowledgeListMF.minotaurs.addPages(new EntryPageText("knowledge.minotaurs.1"), - new EntryPageText("knowledge.minotaurs.2"), new EntryPageText("knowledge.minotaurs.3"), - new EntryPageText("knowledge.minotaurs.4")); - KnowledgeListMF.minotaurs.addPages(assembleMobDesc("minotaur")); - KnowledgeListMF.minotaurs.addPages(assembleMobDesc("minotaur_frost")); - KnowledgeListMF.minotaurs.addPages(assembleMobDesc("minotaur_dread")); - KnowledgeListMF.minotaurs.addPages(new EntryPageText("knowledge.minotaurs.combat")); - - KnowledgeListMF.dragons.addPages(new EntryPageText("knowledge.dragons.1"), - new EntryPageText("knowledge.dragons.2")); - KnowledgeListMF.dragons.addPages(assembleMobDesc("red_dragon")); - KnowledgeListMF.dragons.addPages(assembleMobDesc("blue_dragon")); - KnowledgeListMF.dragons.addPages(assembleMobDesc("green_dragon")); - KnowledgeListMF.dragons.addPages(assembleMobDesc("ash_dragon")); - KnowledgeListMF.dragons.addPages(new EntryPageText("knowledge.dragons.combat")); - - KnowledgeListMF.chimney.addPages(new EntryPageText("knowledge.chimney.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.chimneyRecipe), new EntryPageText("knowledge.chimney.2"), - new EntryPageRecipeCarpenter(KnowledgeListMF.wideChimneyRecipe), - new EntryPageText("knowledge.chimney.3"), - new EntryPageRecipeCarpenter(KnowledgeListMF.extractChimneyRecipe)); - KnowledgeListMF.chimney.addPages(new EntryPageText("knowledge.chimney.pipe"), - new EntryPageRecipeAnvil(KnowledgeListMF.smokePipeR)); - KnowledgeListMF.chimney.addPages(assembleSimpleImgPage("smoke_pipe_example", "knowledge.chimney.pipe.2")); - - KnowledgeListMF.tanning.addPages(new EntryPageText("knowledge.tanning.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.tannerRecipe), new EntryPageText("knowledge.tanning.2"), - new EntryPageRecipeCarpenter(KnowledgeListMF.strongRackR)); - - KnowledgeListMF.bloomery.addPages(new EntryPageText("knowledge.bloomery.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.bloomeryR), new EntryPageText("knowledge.bloomery.2"), - new EntryPageText("knowledge.bloomery.3")); - KnowledgeListMF.crucible.addPages(assembleSimpleImgPage("crucible_example", "knowledge.crucible.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crucibleRecipe), - new EntryPageText("knowledge.crucible.2")); - if (ConfigHardcore.HCCreduceIngots) { - KnowledgeListMF.crucible.addPages(new EntryPageText("knowledge.crucible.hcc"), - new EntryPageRecipeCarpenter(KnowledgeListMF.mouldRecipe), - new EntryPageSmelting(ComponentListMF.ingot_mould_uncooked, ComponentListMF.ingot_mould)); - } - KnowledgeListMF.crucible2.addPages(assembleSimpleImgPage("fire_crucible_example", "knowledge.crucible2.1"), - new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), - new ItemStack(ComponentListMF.kaolinite_dust)), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), - new EntryPageRecipeCarpenter(KnowledgeListMF.advCrucibleRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), - assembleSimpleImgPage("fire_crucible", "knowledge.crucible2.blocks")); - - KnowledgeListMF.bar.addPages(new EntryPageText("knowledge.bar.1")); - KnowledgeListMF.bar.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.barR), - new EntryPageRecipeAnvil(KnowledgeListMF.baringotR)); - KnowledgeListMF.smeltCopper.addPages(new EntryPageText("knowledge.smeltCopper.1")); - KnowledgeListMF.smeltBronze.addPages(new EntryPageText("knowledge.smeltBronze.1")); - if (ConfigHardcore.HCCreduceIngots) { - KnowledgeListMF.smeltIron.addPages(new EntryPageText("knowledge.smeltIron.1")); - KnowledgeListMF.smeltCopper.addPages(new EntryPageRecipeBloom(new ItemStack(BlockListMF.oreCopper), - new ItemStack(ComponentListMF.ingots[0]))); - KnowledgeListMF.smeltBronze.addPages(new EntryPageRecipeBloom(new ItemStack(BlockListMF.oreTin), - new ItemStack(ComponentListMF.ingots[1]))); - } else { - KnowledgeListMF.smeltCopper.addPages(new EntryPageSmelting(new ItemStack(BlockListMF.oreCopper), - new ItemStack(ComponentListMF.ingots[0]))); - KnowledgeListMF.smeltBronze.addPages( - new EntryPageSmelting(new ItemStack(BlockListMF.oreTin), new ItemStack(ComponentListMF.ingots[1]))); - } - KnowledgeListMF.smeltBronze.addPages(new EntryPageCrucible(KnowledgeListMF.bronze)); - KnowledgeListMF.smeltIron.addPages(new EntryPageText("knowledge.smeltIron.2")); - KnowledgeListMF.smeltPig.addPages(new EntryPageText("knowledge.smeltPig.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.ironPrepR), - new EntryPageRecipeAnvil(KnowledgeListMF.ironPrepR2), - new EntryPageBlastFurnace(ComponentListMF.iron_prep, pigiron), - new EntryPageText("knowledge.blastfurn.9")); - KnowledgeListMF.smeltSteel.addPages(new EntryPageText("knowledge.smeltSteel.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.steelR)); - if (!ConfigHardcore.HCCreduceIngots) { - KnowledgeListMF.smeltSteel.addPages(new EntryPageCrucible(KnowledgeListMF.steel)); - } - KnowledgeListMF.encrusted.addPages(new EntryPageText("knowledge.smeltEncrusted.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.diamondR), - new EntryPageRecipeAnvil(KnowledgeListMF.encrustedR)); - KnowledgeListMF.obsidian.addPages(new EntryPageText("knowledge.smeltObsidian.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), - new EntryPageCrucible(KnowledgeListMF.obsidalloy)); - - if (ConfigHardcore.HCCreduceIngots) { - KnowledgeListMF.smeltIron.addPages( - new EntryPageRecipeBloom(new ItemStack(Blocks.iron_ore), new ItemStack(Items.iron_ingot))); - } else { - KnowledgeListMF.smeltIron - .addPages(new EntryPageSmelting(new ItemStack(Blocks.iron_ore), new ItemStack(Items.iron_ingot))); - } - - KnowledgeListMF.apron.addPages(new EntryPageText("knowledge.apron.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.apronRecipe)); - KnowledgeListMF.bellows.addPages(new EntryPageText("knowledge.bellows.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.bellowsRecipe)); - KnowledgeListMF.trough.addPages(new EntryPageText("knowledge.trough.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.woodTroughRecipe), new EntryPageText("knowledge.trough.2"), - new EntryPageRecipeCarpenter(KnowledgeListMF.nailTroughR)); - KnowledgeListMF.forge.addPages(assembleSimpleImgPage("forge_example", "knowledge.forge.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.forgeRecipe), new EntryPageText("knowledge.forge.2"), - new EntryPageText("knowledge.forge.3")); - KnowledgeListMF.anvil.addPages(assembleSimpleImgPage("smithy_example", "knowledge.anvil.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAnvilRecipe), - new EntryPageRecipeAnvil(ForgingRecipes.recipeMap.get("anvilCrafting")), - new EntryPageText("knowledge.anvil.2"), - new EntryPageImage("textures/gui/knowledge/anvilGuiExample.png", 128, 128, ""), - new EntryPageText("knowledge.anvil.3"), new EntryPageText("knowledge.anvil.4"), - new EntryPageText("knowledge.anvil.5")); - KnowledgeListMF.anvil.addPages(new EntryPageText("knowledge.anvil.6"), - new EntryPageImage("textures/gui/knowledge/qualityExample.png", 128, 128, "knowledge.anvil.7")); - - KnowledgeListMF.smeltDragonforge.addPages(new EntryPageText("knowledge.smeltDragonforge.1"), - new EntryPageText("knowledge.smeltDragonforge.2")); - KnowledgeListMF.craftOrnate.addPages(new EntryPageText("knowledge.craftOrnate.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.crestR)); - - KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.1"), - new EntryPageText("knowledge.craftArmourLight.2"), - new EntryPageRecipeCarpenter(KnowledgeListMF.roughHelmetR), - new EntryPageRecipeCarpenter(KnowledgeListMF.roughChestR), - new EntryPageRecipeCarpenter(KnowledgeListMF.roughLegsR), - new EntryPageRecipeCarpenter(KnowledgeListMF.roughBootsR)); - KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.3")); - KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.padding[0]), - new EntryPageRecipeCarpenter(KnowledgeListMF.padding[1]), - new EntryPageRecipeCarpenter(KnowledgeListMF.padding[2]), - new EntryPageRecipeCarpenter(KnowledgeListMF.padding[3])); - KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.4")); - KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.reHelmetR), - new EntryPageRecipeCarpenter(KnowledgeListMF.reChestR), - new EntryPageRecipeCarpenter(KnowledgeListMF.reLegsR), - new EntryPageRecipeCarpenter(KnowledgeListMF.reBootsR)); - KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.studHelmetR), - new EntryPageRecipeAnvil(KnowledgeListMF.studChestR), - new EntryPageRecipeAnvil(KnowledgeListMF.studLegsR), - new EntryPageRecipeAnvil(KnowledgeListMF.studBootsR)); - KnowledgeListMF.craftArmourMedium.addPages(new EntryPageText("knowledge.craftArmourMedium.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.mailRecipes), - new EntryPageRecipeAnvil(KnowledgeListMF.mailHelmetR), - new EntryPageRecipeAnvil(KnowledgeListMF.mailChestR), - new EntryPageRecipeAnvil(KnowledgeListMF.mailLegsR), - new EntryPageRecipeAnvil(KnowledgeListMF.mailBootsR)); - KnowledgeListMF.craftArmourMedium.addPages(new EntryPageText("knowledge.craftArmourMedium.scale"), - new EntryPageRecipeAnvil(KnowledgeListMF.scaleRecipes), - new EntryPageRecipeAnvil(KnowledgeListMF.scaleHelmetR), - new EntryPageRecipeAnvil(KnowledgeListMF.scaleChestR), - new EntryPageRecipeAnvil(KnowledgeListMF.scaleLegsR), - new EntryPageRecipeAnvil(KnowledgeListMF.scaleBootsR)); - KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.1"), - new EntryPageText("knowledge.craftArmourHeavy.2"), - new EntryPageRecipeCarpenter(KnowledgeListMF.padding)); - KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.splint"), - new EntryPageRecipeAnvil(KnowledgeListMF.splintRecipes), - new EntryPageRecipeAnvil(KnowledgeListMF.splintHelmetR), - new EntryPageRecipeAnvil(KnowledgeListMF.splintChestR), - new EntryPageRecipeAnvil(KnowledgeListMF.splintLegsR), - new EntryPageRecipeAnvil(KnowledgeListMF.splintBootsR)); - KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.plate"), - new EntryPageRecipeAnvil(KnowledgeListMF.plateRecipes), - new EntryPageRecipeAnvil(KnowledgeListMF.plateHelmetR), - new EntryPageRecipeAnvil(KnowledgeListMF.plateChestR), - new EntryPageRecipeAnvil(KnowledgeListMF.plateLegsR), - new EntryPageRecipeAnvil(KnowledgeListMF.plateBootsR)); - - KnowledgeListMF.coalflux.addPages(new EntryPageText("knowledge.coalflux.1"), - new EntryPageGrind(new ItemStack(ComponentListMF.flux), new ItemStack(ComponentListMF.flux_pot)), - new EntryPageRecipeAnvil(KnowledgeListMF.coalfluxR)); - - KnowledgeListMF.bigfurn.addPages(assembleSimpleImgPage("furnace_example", "knowledge.bigfurn.1"), - new EntryPageText("knowledge.bigfurn.2")); - KnowledgeListMF.bigfurn.addPages( - new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), - new ItemStack(ComponentListMF.kaolinite_dust)), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickR), - new EntryPageSmelting(new ItemStack(ComponentListMF.fireclay_brick), - new ItemStack(ComponentListMF.strong_brick)), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR)); - KnowledgeListMF.bigfurn.addPages(new EntryPageText("knowledge.bigfurn.heater"), - new EntryPageRecipeAnvil(KnowledgeListMF.bigHeatR), - assembleSimpleImgPage("furnace_heater", BlockListMF.furnace_heater.getUnlocalizedName() + ".name")); - KnowledgeListMF.bigfurn.addPages(new EntryPageText("knowledge.bigfurn.top"), - new EntryPageRecipeAnvil(KnowledgeListMF.bigFurnR), - assembleSimpleImgPage("furnace_full", "knowledge.bigfurn.structure")); - - KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.1"), - new EntryPageText("knowledge.blastfurn.2")); - KnowledgeListMF.blastfurn.addPages( - new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), - new ItemStack(ComponentListMF.kaolinite_dust)), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickR), - new EntryPageSmelting(new ItemStack(ComponentListMF.fireclay_brick), - new ItemStack(ComponentListMF.strong_brick)), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR)); - KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.3"), - new EntryPageRecipeAnvil(KnowledgeListMF.blastChamR), - new EntryPageRecipeAnvil(KnowledgeListMF.blastHeatR), new EntryPageText("knowledge.blastfurn.4"), - new EntryPageText("knowledge.blastfurn.5")); - KnowledgeListMF.blastfurn.addPages( - new EntryPageImage("textures/gui/knowledge/blast_example.png", 96, 96, "knowledge.blastfurn.6")); - KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.7")); - if (ConfigHardcore.HCCreduceIngots) { - KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.hcc")); - } - - KnowledgeListMF.etools.addPages(new EntryPageText("knowledge.etools.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.spannerR), new EntryPageRecipeAnvil(KnowledgeListMF.eatoolsR)); - KnowledgeListMF.ecomponents.addPages(new EntryPageText("knowledge.ecomponents.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.boltR), new EntryPageText("knowledge.ecomponents.2"), - new EntryPageRecipeAnvil(KnowledgeListMF.iframeR), new EntryPageRecipeAnvil(KnowledgeListMF.bgearR), - new EntryPageRecipeAnvil(KnowledgeListMF.tgearR), new EntryPageRecipeAnvil(KnowledgeListMF.istrutR), - new EntryPageRecipeAnvil(KnowledgeListMF.stubeR)); - KnowledgeListMF.tungsten.addPages(new EntryPageText("knowledge.tungsten.1"), - new EntryPageText("knowledge.tungsten.2"), new EntryPageText("knowledge.tungsten.3"), - new EntryPageCrucible(KnowledgeListMF.wolframiteR)); - KnowledgeListMF.climber.addPages(new EntryPageText("knowledge.climber.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.climbPickbR), new EntryPageText("knowledge.climber.2")); - KnowledgeListMF.spyglass.addPages(new EntryPageText("knowledge.spyglass.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.spyglassR)); - KnowledgeListMF.parachute.addPages(new EntryPageText("knowledge.parachute.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.parachuteR)); - KnowledgeListMF.syringe.addPages(new EntryPageText("knowledge.syringe.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.syringeR)); - KnowledgeListMF.engTanner.addPages(new EntryPageText("knowledge.engTanner.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.engTannerR)); - KnowledgeListMF.advcrucible.addPages( - assembleSimpleImgPage("auto_crucible_example", BlockListMF.crucibleauto.getUnlocalizedName() + ".name"), - new EntryPageText("knowledge.advcrucible.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.autoCrucibleR), - new EntryPageText("knowledge.crucible2.blocks"), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), - assembleSimpleImgPage("auto_crucible", "knowledge.basicstructure")); - KnowledgeListMF.advforge.addPages(new EntryPageText("knowledge.advforge.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.advancedForgeR)); - KnowledgeListMF.coke.addPages(new EntryPageText("knowledge.coke.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.coalPrepR), - new EntryPageSmelting(ComponentListMF.coal_prep, ComponentListMF.coke)); - - KnowledgeListMF.blackpowder.addPages(new EntryPageText("knowledge.blackpowder.1"), - new EntryPageGrind(new ItemStack(Items.coal), new ItemStack(ComponentListMF.coalDust)), - new EntryPageRecipeCarpenter(KnowledgeListMF.blackpowderRec), - new EntryPageRecipeCarpenter(KnowledgeListMF.crudeBombR)); - KnowledgeListMF.advblackpowder.addPages(new EntryPageText("knowledge.advblackpowder.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.advblackpowderRec)); - KnowledgeListMF.bombs.addPages(new EntryPageText("knowledge.bombs.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.bombBenchCraft), new EntryPageText("knowledge.bombs.2"), - new EntryPageImage("textures/gui/knowledge/bombGuiExample.png", 128, 128, "knowledge.guiSubtitle"), - new EntryPageText("knowledge.bombs.3"), new EntryPageText("knowledge.bombs.4")); - KnowledgeListMF.bpress.addPages(new EntryPageText("knowledge.bpress.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.bombPressCraft)); - KnowledgeListMF.bombarrow.addPages(new EntryPageText("knowledge.bombarrow.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.bombarrowR), - new EntryPageRecipeAnvil(KnowledgeListMF.bombBoltR)); - KnowledgeListMF.shrapnel.addPages(new EntryPageText("knowledge.shrapnel.1"), - new EntryPageGrind(new ItemStack(Items.flint), new ItemStack(ComponentListMF.shrapnel))); - KnowledgeListMF.firebomb.addPages(new EntryPageText("knowledge.firebomb.1"), - new EntryPageText("knowledge.firebomb.2"), new EntryPageText("knowledge.firebomb.3"), - new EntryPageRecipeCarpenter(KnowledgeListMF.magmaRefinedR)); - KnowledgeListMF.bombCeramic.addPages(new EntryPageText("knowledge.bombCeramic.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.bombCaseCeramicR), - new EntryPageSmelting(ComponentListMF.bomb_casing_uncooked, ComponentListMF.bomb_casing)); - KnowledgeListMF.bombIron.addPages(new EntryPageText("knowledge.bombIron.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.bombCaseIronR)); - KnowledgeListMF.bombObsidian.addPages(new EntryPageText("knowledge.bombObsidian.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.bombCaseObsidianR)); - KnowledgeListMF.bombCrystal.addPages(new EntryPageText("knowledge.bombCrystal.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.bombCaseCrystalR)); - - KnowledgeListMF.mineCeramic.addPages(new EntryPageText("knowledge.mineCeramic.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.mineCaseCeramicR), - new EntryPageSmelting(ComponentListMF.mine_casing_uncooked, ComponentListMF.mine_casing)); - KnowledgeListMF.mineIron.addPages(new EntryPageText("knowledge.mineIron.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.mineCaseIronR)); - KnowledgeListMF.mineObsidian.addPages(new EntryPageText("knowledge.mineObsidian.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.mineCaseObsidianR)); - KnowledgeListMF.mineCrystal.addPages(new EntryPageText("knowledge.mineCrystal.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.mineCaseCrystalR)); - KnowledgeListMF.bombFuse.addPages(new EntryPageText("knowledge.bombFuse.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.bombFuseR), new EntryPageText("knowledge.bombFuse.2"), - new EntryPageRecipeCarpenter(KnowledgeListMF.longFuseR)); - KnowledgeListMF.stickybomb.addPages(new EntryPageText("knowledge.stickybomb.1"), - new EntryPageText("knowledge.stickybomb.2")); - - KnowledgeListMF.crossbows.addPages(new EntryPageText("knowledge.crossbows.1"), - new EntryPageText("knowledge.crossbows.2"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crossBenchCraft), - new EntryPageText("knowledge.crossbows.3"), new EntryPageText("knowledge.crossbows.4"), - new EntryPageText("knowledge.crossbows.5"), new EntryPageText("knowledge.crossbows.6"), - new EntryPageRecipeAnvil(KnowledgeListMF.crossBoltR)); - KnowledgeListMF.crossShafts.addPages(new EntryPageText("knowledge.crossShafts.handle"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crossHandleWoodR), - new EntryPageText("knowledge.crossShafts.stock"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crossStockWoodR)); - KnowledgeListMF.crossHeads.addPages(new EntryPageText("knowledge.crossHeads.light"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadLightR), - new EntryPageText("knowledge.crossHeads.medium"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadMediumR), - new EntryPageText("knowledge.crossHeads.heavy"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadHeavyR)); - KnowledgeListMF.crossHeadAdvanced.addPages(new EntryPageText("knowledge.crossHeads.advanced"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadAdvancedR)); - KnowledgeListMF.crossShaftAdvanced.addPages(new EntryPageText("knowledge.crossShafts.advanced"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crossStockIronR)); - KnowledgeListMF.crossScope.addPages(new EntryPageText("knowledge.crossScope.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crossScopeR)); - KnowledgeListMF.crossAmmo.addPages(new EntryPageText("knowledge.crossAmmo.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.crossAmmoR)); - KnowledgeListMF.crossBayonet.addPages(new EntryPageText("knowledge.crossBayonet.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.crossBayonetR)); - - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.1"), - new EntryPageText("knowledge.cogArmour.2")); - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.station"), - new EntryPageRecipeAnvil(KnowledgeListMF.frameBlockR), - assembleSimpleImgPage("cogwork_station", "knowledge.cogwork_station")); - // EXAMPLE - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.station.2"), - new EntryPageRecipeAnvil(KnowledgeListMF.cogPulleyR), - assembleSimpleImgPage("cogwork_station_2", "knowledge.rightclickspanner")); - - // RECIPE - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.crafting"), - new EntryPageRecipeCarpenter(KnowledgeListMF.cogShaftR), - new EntryPageRecipeAnvil(KnowledgeListMF.cogHelmR), new EntryPageRecipeAnvil(KnowledgeListMF.cogChestR), - new EntryPageRecipeAnvil(KnowledgeListMF.cogLegsR), - assembleSimpleImgPage("cogwork_suit_craft", "knowledge.rightclickspanner")); - - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.armour")); - KnowledgeListMF.cogArmour.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hugePlateR), - new EntryPageRecipeAnvil(KnowledgeListMF.cogPlateR)); - - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.advantage"), - new EntryPageText("knowledge.cogArmour.advantage.2"), - new EntryPageText("knowledge.cogArmour.advantage.3")); - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.disadvantage"), - new EntryPageText("knowledge.cogArmour.disadvantage.2")); - KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.removal")); - - KnowledgeListMF.compPlate.addPages(new EntryPageText("knowledge.compPlate.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.compPlateR)); - // KnowledgeListMF.craftOrnateWeapons.addPages(new - // EntryPageText("knowledge.craftOrnateWeapons.1")); - - KnowledgeListMF.repair_basic.addPages(new EntryPageText("knowledge.repair_basic.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.repairBasicR)); - KnowledgeListMF.repair_advanced.addPages(new EntryPageText("knowledge.repair_advanced.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.repairAdvancedR)); - KnowledgeListMF.repair_ornate.addPages(new EntryPageText("knowledge.repair_ornate.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.repairOrnateR)); - - KnowledgeListMF.refined_planks.addPages(new EntryPageText("knowledge.refined_planks.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.nailPlanksR), - new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankBlockR), - new EntryPageRecipeCarpenter(KnowledgeListMF.nailStairR), - new EntryPageRecipeCarpenter(KnowledgeListMF.refinedStairR)); - KnowledgeListMF.reinforced_stone.addPages(new EntryPageText("knowledge.reinforced_stone.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), - new EntryPageCrucible(KnowledgeListMF.reStone)); - KnowledgeListMF.brickworks.addPages(new EntryPageText("knowledge.brickworks.1"), - new EntryPageRecipeBase(KnowledgeListMF.stoneBricksR), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), - new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickStairR)); - KnowledgeListMF.clay_wall.addPages(new EntryPageText("knowledge.clay_wall.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.clayWallR)); - KnowledgeListMF.glass.addPages(new EntryPageText("knowledge.glass.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.framedGlassR), - new EntryPageRecipeCarpenter(KnowledgeListMF.windowR)); - KnowledgeListMF.thatch.addPages(new EntryPageText("knowledge.thatch.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.thatchR), - new EntryPageRecipeCarpenter(KnowledgeListMF.thatchStairR)); - KnowledgeListMF.bars.addPages(new EntryPageText("knowledge.bars.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.barsR)); - KnowledgeListMF.paint_brush.addPages(new EntryPageText("knowledge.paint_brush.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.brushRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.easyPaintPlank)); - KnowledgeListMF.decorated_stone.addPages(new EntryPageText("knowledge.decorated_stone.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.framedStoneR), - new EntryPageRecipeAnvil(KnowledgeListMF.iframedStoneR)); - - KnowledgeListMF.bed_roll.addPages(new EntryPageText("knowledge.bed_roll.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.bedrollR)); - KnowledgeListMF.tool_rack.addPages(new EntryPageText("knowledge.tool_rack.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.rackRecipe), - new EntryPageText("knowledge.tool_rack.rules")); - KnowledgeListMF.food_box.addPages(new EntryPageText("knowledge.food_box.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.foodboxR), new EntryPageText("knowledge.ammo_box.2")); - KnowledgeListMF.ammo_box.addPages(new EntryPageText("knowledge.ammo_box.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.ammoboxR), new EntryPageText("knowledge.ammo_box.2")); - KnowledgeListMF.big_box.addPages(new EntryPageText("knowledge.big_box.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.bigboxR), new EntryPageText("knowledge.ammo_box.2")); - - KnowledgeListMF.constructionPts.addPages(new EntryPageText("knowledge.constructionPts.1")); - KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.sawnPlankR)); - KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.plankPaneR)); - KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hingeRecipe)); - KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), - new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), - new EntryPageRecipeBase(KnowledgeListMF.plantOilR), - new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankR)); - - if (ConfigHardcore.HCCallowRocks) { - KnowledgeListMF.craftHCCTools.addPages(new EntryPageText("knowledge.craftHCCTools.1"), - new EntryPageText("knowledge.craftHCCTools.2")); - KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.sharpRocksR), - new EntryPageText("knowledge.craftHCCTools.3")); - KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stonePickR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpadeR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAxeR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHoeR)); - KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), - new EntryPageRecipeCarpenter(KnowledgeListMF.boneNeedleR)); - KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSwordR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneMaceR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneWarR), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpearR)); - } - KnowledgeListMF.craftTools.addPages(new EntryPageText("knowledge.craftTools.1")); - KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.pickR)); - KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.axeR)); - KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.spadeR)); - KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hoeR)); - KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.shearsR)); - - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.craftAdvTools.1")); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.handpickR)); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.hvypick.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.hvyPickR)); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.trow.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.trowR)); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.hvyshovel.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.hvyShovelR)); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.scythe.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.scytheR)); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.mattock.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.mattockR), new EntryPageText("knowledge.mattock.use")); - KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.lumber.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.lumberR)); - - KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.dryrocks.info"), - new EntryPageRecipeBase(KnowledgeListMF.dryrocksR)); - KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.tinderbox.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.tinderboxR)); - KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.flintsteel.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.flintAndSteelR)); - - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.craftCrafters.1")); - KnowledgeListMF.craftCrafters.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), - new EntryPageRecipeAnvil(KnowledgeListMF.hammerR), new EntryPageText("")); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.hvyhammer.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.hvyHammerR)); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.tongs.info"), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), - new EntryPageRecipeAnvil(KnowledgeListMF.tongsR), new EntryPageText("")); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.knife.info"), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR), - new EntryPageRecipeAnvil(KnowledgeListMF.knifeR), new EntryPageText("")); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.saw.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.sawsR)); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.needle.info"), - new EntryPageRecipeCarpenter(KnowledgeListMF.boneNeedleR), - new EntryPageRecipeAnvil(KnowledgeListMF.needleR), new EntryPageText("")); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.mallet.info"), - new EntryPageRecipeCarpenter(KnowledgeListMF.malletR)); - KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.spoon.info"), - new EntryPageRecipeCarpenter(KnowledgeListMF.spoonR)); - - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.craftWeapons.1")); - KnowledgeListMF.craftWeapons.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.daggerR)); - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.sword.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.swordR)); - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.waraxe.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.waraxeR)); - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.mace.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.maceR)); - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.spear.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.spearR)); - KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.bow.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.bowR)); - - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.craftAdvWeapons.1")); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.katanaR)); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.greatsword.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.gswordR)); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.battleaxe.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.battleaxeR)); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.warhammer.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.whammerR)); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.halbeard.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.halbeardR)); - KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.lance.info"), - new EntryPageRecipeAnvil(KnowledgeListMF.lanceR)); - - KnowledgeListMF.arrows.addPages(new EntryPageText("knowledge.arrows.1")); - KnowledgeListMF.arrows.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.fletchingR), - new EntryPageRecipeCarpenter(KnowledgeListMF.fletchingR2)); - KnowledgeListMF.arrows.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.arrowheadR)); - KnowledgeListMF.arrows.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.arrowR)); - KnowledgeListMF.arrowsBodkin.addPages(new EntryPageText("knowledge.arrowsBodkin.1")); - KnowledgeListMF.arrowsBodkin.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.bodkinheadR)); - KnowledgeListMF.arrowsBroad.addPages(new EntryPageText("knowledge.arrowsBroad.1")); - KnowledgeListMF.arrowsBroad.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.broadheadR)); - - KnowledgeListMF.smeltBlackSteel.addPages(new EntryPageText("knowledge.smeltBlackSteel.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), new EntryPageCrucible(KnowledgeListMF.black), - new EntryPageBlastFurnace(ComponentListMF.ingots[6], black)); - KnowledgeListMF.smeltRedSteel.addPages(new EntryPageText("knowledge.smeltRedSteel.1"), - new EntryPageCrucible(KnowledgeListMF.red), new EntryPageBlastFurnace(ComponentListMF.ingots[9], red)); - KnowledgeListMF.smeltBlueSteel.addPages(new EntryPageText("knowledge.smeltBlueSteel.1"), - new EntryPageCrucible(KnowledgeListMF.blue), - new EntryPageBlastFurnace(ComponentListMF.ingots[11], blue)); - KnowledgeListMF.smeltAdamant.addPages(new EntryPageText("knowledge.smeltAdamantium.1"), - new EntryPageText("knowledge.smeltAdamantium.2"), new EntryPageCrucible(KnowledgeListMF.adamantium)); - KnowledgeListMF.smeltMithril.addPages(new EntryPageText("knowledge.smeltMithril.1"), - new EntryPageText("knowledge.smeltMithril.2"), new EntryPageCrucible(KnowledgeListMF.mithril)); - - KnowledgeListMF.smeltMaster.addPages(new EntryPageText("knowledge.smeltMaster.1"), - new EntryPageText("knowledge.smeltMaster.2"), new EntryPageText("knowledge.smeltMaster.3")); - KnowledgeListMF.smeltMaster.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.trilogyRecipe)); - KnowledgeListMF.smeltIgnotumite.addPages(new EntryPageText("knowledge.smeltIgnotumite.1"), - new EntryPageCrucible(KnowledgeListMF.ignotumite)); - KnowledgeListMF.smeltMithium.addPages(new EntryPageText("knowledge.smeltMithium.1"), - new EntryPageCrucible(KnowledgeListMF.mithium)); - KnowledgeListMF.smeltEnderforge.addPages(new EntryPageText("knowledge.smeltEnderforge.1"), - new EntryPageCrucible(KnowledgeListMF.enderforge)); - - KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.1"), - new EntryPageRecipeBase(KnowledgeListMF.firepitRecipe)); - KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.2"), - new EntryPageRecipeBase(KnowledgeListMF.cooktopRecipe)); - KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.3"), - new EntryPageRecipeCarpenter(KnowledgeListMF.stoneovenRecipe)); - KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.4")); - - KnowledgeListMF.cookingutensil.addPages(new EntryPageText("knowledge.cookingutensil.1"), - new EntryPageRecipeAnvil(KnowledgeListMF.caketinRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.pieTrayRecipe), - new EntryPageSmelting(ComponentListMF.pie_tray_uncooked, FoodListMF.pie_tray)); - KnowledgeListMF.salt.addPages(new EntryPageText("knowledge.salt.1"), - new EntryPageSmelting(new ItemStack(FoodListMF.bowl_water_salt), new ItemStack(FoodListMF.salt))); - KnowledgeListMF.jug.addPages(new EntryPageText("knowledge.jug.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), - new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), - new EntryPageText("knowledge.jug.2"), new EntryPageRecipeBase(KnowledgeListMF.waterJugR), - new EntryPageRecipeBase(KnowledgeListMF.milkJugR)); - - KnowledgeListMF.generic_meat.addPages(new EntryPageText("knowledge.generic_meat.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.meatRecipes), - new EntryPageRecipeCarpenter(KnowledgeListMF.meatStripR), - new EntryPageRecipeCarpenter(KnowledgeListMF.meatHunkR), - new EntryPageGrind(new ItemStack(FoodListMF.generic_meat_uncooked), - new ItemStack(FoodListMF.generic_meat_mince_uncooked))); - KnowledgeListMF.stew.addPages(new EntryPageText("knowledge.stew.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.stewRecipe)); - KnowledgeListMF.jerky.addPages(new EntryPageText("knowledge.jerky.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.jerkyRecipe)); - KnowledgeListMF.saussage.addPages(new EntryPageText("knowledge.saussage.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.gutsRecipe), - new EntryPageGrind(new ItemStack(FoodListMF.breadroll), new ItemStack(FoodListMF.breadcrumbs)), - new EntryPageRecipeCarpenter(KnowledgeListMF.saussageR), new EntryPageSmelting( - new ItemStack(FoodListMF.saussage_raw), new ItemStack(FoodListMF.saussage_cooked))); - KnowledgeListMF.sandwitch.addPages(new EntryPageText("knowledge.sandwitch.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.breadSliceR), - new EntryPageRecipeCarpenter(KnowledgeListMF.sandwitchRecipe)); - KnowledgeListMF.sandwitchBig.addPages(new EntryPageText("knowledge.sandwitchBig.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.sandwitchBigRecipe)); - KnowledgeListMF.meatpie.addPages(new EntryPageText("knowledge.meatpie.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.meatPieRecipe), - new EntryPageSmelting(new ItemStack(FoodListMF.pie_meat_uncooked), - new ItemStack(FoodListMF.pie_meat_cooked)), - new EntryPageRecipeBase(KnowledgeListMF.meatpieOut)); - KnowledgeListMF.shepardpie.addPages(new EntryPageText("knowledge.shepardpie.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.shepardRecipe), - new EntryPageSmelting(new ItemStack(FoodListMF.pie_shepard_uncooked), - new ItemStack(FoodListMF.pie_shepard_cooked)), - new EntryPageRecipeBase(KnowledgeListMF.shepardOut)); - - KnowledgeListMF.bread.addPages(new EntryPageText("knowledge.bread.1"), - new EntryPageGrind(new ItemStack(Items.wheat), new ItemStack(FoodListMF.flour)), - new EntryPageRecipeCarpenter(KnowledgeListMF.doughRecipe), - new EntryPageSmelting(new ItemStack(FoodListMF.dough), new ItemStack(FoodListMF.breadroll)), - new EntryPageRecipeCarpenter(KnowledgeListMF.breadRecipe), - new EntryPageSmelting(new ItemStack(FoodListMF.raw_bread), new ItemStack(Items.bread)), - new EntryPageRecipeCarpenter(KnowledgeListMF.pastryRecipe), - new EntryPageGrind(new ItemStack(FoodListMF.breadroll), new ItemStack(FoodListMF.breadcrumbs))); - KnowledgeListMF.bread.addPages(new EntryPageText("knowledge.bread.other"), - new EntryPageRecipeCarpenter(KnowledgeListMF.pumpPieR), - new EntryPageSmelting(new ItemStack(FoodListMF.pie_pumpkin_uncooked), - new ItemStack(FoodListMF.pie_pumpkin_cooked)), - new EntryPageRecipeBase(KnowledgeListMF.pumpPieOut)); - KnowledgeListMF.bread.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.simpCakeR), - new EntryPageSmelting(new ItemStack(FoodListMF.cake_simple_raw), - new ItemStack(FoodListMF.cake_simple_uniced)), - new EntryPageRecipeCarpenter(KnowledgeListMF.simpCakeOut)); - - KnowledgeListMF.oats.addPages(new EntryPageText("knowledge.oats.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.oatsRecipe)); - - KnowledgeListMF.berry.addPages(assembleImgPage("berry", BlockListMF.berryBush)); - KnowledgeListMF.icing.addPages(new EntryPageText("knowledge.icing.1"), - new EntryPageGrind(new ItemStack(Items.reeds), new ItemStack(FoodListMF.sugarpot)), - new EntryPageRecipeBase(KnowledgeListMF.sugarRecipe), new EntryPageText("knowledge.icing.2"), - new EntryPageRecipeCarpenter(KnowledgeListMF.icingRecipe)); - KnowledgeListMF.sweetroll.addPages(new EntryPageText("knowledge.sweetroll.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.sweetrollRecipe), - new EntryPageSmelting(new ItemStack(FoodListMF.sweetroll_raw), - new ItemStack(FoodListMF.sweetroll_uniced)), - new EntryPageRecipeCarpenter(KnowledgeListMF.iceSR)); - KnowledgeListMF.cake.addPages(new EntryPageText("knowledge.cake.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.cakeR), - new EntryPageSmelting(new ItemStack(FoodListMF.cake_raw), new ItemStack(FoodListMF.cake_uniced)), - new EntryPageRecipeCarpenter(KnowledgeListMF.cakeI)); - KnowledgeListMF.carrotcake.addPages(new EntryPageText("knowledge.carrotcake.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.carrotCakeR), - new EntryPageSmelting(new ItemStack(FoodListMF.cake_carrot_raw), - new ItemStack(FoodListMF.cake_carrot_uniced)), - new EntryPageRecipeCarpenter(KnowledgeListMF.carrotCakeI)); - KnowledgeListMF.chococake.addPages(new EntryPageText("knowledge.chococake.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.chocoCakeR), - new EntryPageSmelting(new ItemStack(FoodListMF.cake_choc_raw), - new ItemStack(FoodListMF.cake_choc_uniced)), - new EntryPageRecipeCarpenter(KnowledgeListMF.chocoCakeI)); - KnowledgeListMF.bfcake.addPages(new EntryPageText("knowledge.bfcake.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.bfCakeR), - new EntryPageSmelting(new ItemStack(FoodListMF.cake_bf_raw), new ItemStack(FoodListMF.cake_bf_uniced)), - new EntryPageRecipeCarpenter(KnowledgeListMF.bfCakeI)); - KnowledgeListMF.berrypie - .addPages(new EntryPageText("knowledge.berrypie.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.berryR), - new EntryPageSmelting(new ItemStack(FoodListMF.pie_berry_uncooked), - new ItemStack(FoodListMF.pie_berry_cooked)), - new EntryPageRecipeBase(KnowledgeListMF.berryOut)); - KnowledgeListMF.applepie - .addPages(new EntryPageText("knowledge.applepie.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.appleR), - new EntryPageSmelting(new ItemStack(FoodListMF.pie_apple_uncooked), - new ItemStack(FoodListMF.pie_apple_cooked)), - new EntryPageRecipeBase(KnowledgeListMF.appleOut)); - KnowledgeListMF.eclair.addPages(new EntryPageText("knowledge.eclair.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.eclairDoughR), - new EntryPageSmelting(new ItemStack(FoodListMF.eclair_raw), new ItemStack(FoodListMF.eclair_uniced)), - new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.eclairIceR), - new EntryPageRecipeCarpenter(KnowledgeListMF.custardRecipe), - new EntryPageRecipeCarpenter(KnowledgeListMF.eclairFillR)); - - KnowledgeListMF.cheese.addPages(new EntryPageText("knowledge.cheese.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.curdRecipe), - new EntryPageSmelting(new ItemStack(FoodListMF.curds), new ItemStack(FoodListMF.cheese_pot)), - new EntryPageRecipeBase(KnowledgeListMF.cheeseOut)); - KnowledgeListMF.cheeseroll.addPages(new EntryPageText("knowledge.cheeseroll.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.cheeserollR)); - - KnowledgeListMF.bandage.addPages(new EntryPageText("knowledge.bandage.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.badBandageR), - new EntryPageRecipeCarpenter(KnowledgeListMF.bandageR)); - KnowledgeListMF.bandageadv.addPages(new EntryPageText("knowledge.bandageadv.1"), - new EntryPageRecipeCarpenter(KnowledgeListMF.goodBandageR)); - - // MASTERY - KnowledgeListMF.toughness.addPages(new EntryPageText("knowledge.toughness.1")); - KnowledgeListMF.fitness.addPages(new EntryPageText("knowledge.fitness.1")); - KnowledgeListMF.armourpro.addPages(new EntryPageText("knowledge.armourpro.1")); - KnowledgeListMF.parrypro.addPages(new EntryPageText("knowledge.parrypro.1")); - KnowledgeListMF.counteratt.addPages(new EntryPageText("knowledge.counteratt.1"), - new EntryPageText("knowledge.counteratt.2")); - KnowledgeListMF.autoparry.addPages(new EntryPageText("knowledge.autoparry.1")); - KnowledgeListMF.firstaid.addPages(new EntryPageText("knowledge.firstaid.1")); - KnowledgeListMF.doctor.addPages(new EntryPageText("knowledge.doctor.1")); - KnowledgeListMF.scrapper.addPages(new EntryPageText("knowledge.scrapper.1")); - } - - private static EntryPage[] assembleOreDesc(String orename, Block ore, Item ingot) { - return new EntryPage[] { new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, - "knowledge.ores." + orename), new EntryPageSmelting(new ItemStack(ore), new ItemStack(ingot)) }; - } - - private static EntryPage[] assembleOreDescHC(String orename, Block ore, Item ingot) { - if (ConfigHardcore.HCCreduceIngots) { - return new EntryPage[] { - new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, - "knowledge.ores." + orename), - new EntryPageRecipeBloom(new ItemStack(ore), new ItemStack(ingot)) }; - } - return assembleOreDesc(orename, ore, ingot); - } - - private static EntryPage[] assembleOreDesc(String orename, Block ore) { - return new EntryPage[] { new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, - "knowledge.ores." + orename) }; - } - - private static EntryPage[] assembleMineralDesc(String orename, Block ore) { - return new EntryPage[] { new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, - "knowledge.minerals." + orename) }; - } - - private static EntryPage[] assembleImgPage(String name, Block blockname) { - return new EntryPage[] { new EntryPageImage("textures/gui/knowledge/image/" + name + ".png", 96, 96, - "knowledge." + name + ".1") }; - } - - private static EntryPage[] assembleMobDesc(String name) { - return new EntryPage[] { new EntryPageImage("textures/gui/knowledge/image/mob/" + name + ".png", 96, 96, - "knowledge." + name + ".1") }; - } - - private static EntryPage assembleSimpleImgPage(String name, String text) { - return new EntryPageImage("textures/gui/knowledge/image/" + name + ".png", 96, 96, text); - } + public static void registerPages() { + ItemStack pigiron = ComponentListMF.bar("PigIron"); + ItemStack black = ComponentListMF.bar("BlackSteel"); + ItemStack red = ComponentListMF.bar("RedSteel"); + ItemStack blue = ComponentListMF.bar("BlueSteel"); + if (ConfigHardcore.HCCallowRocks) { + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.hcc"), + new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.dirtRockR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stonePickR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), + new EntryPageRecipeCarpenter(KnowledgeListMF.sharpRocksR)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpearR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAxeR)); + } + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.1"), + new EntryPageText("knowledge.gettingStarted.2")); + + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.carpenter"), + new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.fire"), + new EntryPageRecipeBase(KnowledgeListMF.firepitRecipe), + new EntryPageRecipeBase(KnowledgeListMF.dryrocksR)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.food"), + new EntryPageRecipeBase(KnowledgeListMF.cooktopRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneovenRecipe)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.tanning"), + new EntryPageRecipeCarpenter(KnowledgeListMF.tannerRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.forging"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAnvilRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.forgeRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), + new EntryPageRecipeBase(KnowledgeListMF.dryrocksR), + new EntryPageRecipeCarpenter(KnowledgeListMF.apronRecipe)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.forgingbars"), + new EntryPageRecipeAnvil(KnowledgeListMF.barR)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.flux"), + new EntryPageRecipeAnvil(KnowledgeListMF.fluxR)); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.3"), + new EntryPageRecipeAnvil(KnowledgeListMF.shearsR), new EntryPageText("knowledge.gettingStarted.4"), + new EntryPageText("knowledge.gettingStarted.5"), new EntryPageRecipeAnvil(KnowledgeListMF.hammerR), + new EntryPageRecipeAnvil(KnowledgeListMF.tongsR), new EntryPageText("knowledge.gettingStarted.6")); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.upgrade"), + new EntryPageRecipeCarpenter(KnowledgeListMF.researchTableRecipe), + new EntryPageText("knowledge.gettingStarted.7")); + KnowledgeListMF.gettingStarted.addPages(new EntryPageText("knowledge.gettingStarted.10"), + new EntryPageRecipeCarpenter(KnowledgeListMF.potRecipe), + new EntryPageSmelting(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot), + new EntryPageRecipeCarpenter(KnowledgeListMF.quernR), new EntryPageText("knowledge.gettingStarted.11"), + new EntryPageText("knowledge.gettingStarted.12")); + KnowledgeListMF.gettingStarted.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.bSalvageR), + new EntryPageText("knowledge.gettingStarted.13")); + + KnowledgeListMF.research.addPages(new EntryPageText("knowledge.research.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.researchTableRecipe), + new EntryPageText("knowledge.research.2")); + KnowledgeListMF.talisman.addPages(new EntryPageText("knowledge.talisman.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.talismanRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.artBookR), + new EntryPageRecipeCarpenter(KnowledgeListMF.conBookR), + new EntryPageRecipeCarpenter(KnowledgeListMF.proBookR), + new EntryPageRecipeCarpenter(KnowledgeListMF.engBookR), + new EntryPageRecipeCarpenter(KnowledgeListMF.comBookR), new EntryPageText("knowledge.talisman.2"), + new EntryPageRecipeAnvil(KnowledgeListMF.greatTalismanRecipe)); + KnowledgeListMF.talisman.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.artBook2R), + new EntryPageRecipeCarpenter(KnowledgeListMF.conBook2R), + new EntryPageRecipeCarpenter(KnowledgeListMF.proBook2R), + new EntryPageRecipeCarpenter(KnowledgeListMF.engBook2R), + new EntryPageRecipeCarpenter(KnowledgeListMF.comBook2R)); + KnowledgeListMF.stamina.addPages(new EntryPageText("knowledge.stamina.1")); + KnowledgeListMF.combat.addPages(new EntryPageText("knowledge.combat.1"), + new EntryPageText("knowledge.parry.info"), new EntryPageText("knowledge.advparry.info"), + new EntryPageText("knowledge.poweratt.info"), new EntryPageText("knowledge.dodge.info"), + new EntryPageText("knowledge.armour.info")); + KnowledgeListMF.craftArmourBasic.addPages(new EntryPageText("knowledge.craftArmourBasic.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.hideHelmR), + new EntryPageRecipeCarpenter(KnowledgeListMF.hideChestR), + new EntryPageRecipeCarpenter(KnowledgeListMF.hideLegsR), + new EntryPageRecipeCarpenter(KnowledgeListMF.hideBootsR)); + KnowledgeListMF.craftArmourBasic.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.roughHelmetR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughChestR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughLegsR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughBootsR)); + + KnowledgeListMF.carpenter.addPages(new EntryPageText("knowledge.carpenter.1"), + new EntryPageRecipeBase(KnowledgeListMF.carpenterRecipe)); + KnowledgeListMF.salvage.addPages(new EntryPageText("knowledge.salvage.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bSalvageR), new EntryPageText("knowledge.salvage.2")); + + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.1")); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.plank"), + new EntryPageRecipeBase(KnowledgeListMF.plankRecipe), + new EntryPageRecipeBase(KnowledgeListMF.stickRecipe)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.refinedplank"), + new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), + new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), + new EntryPageRecipeBase(KnowledgeListMF.plantOilR), + new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.flux"), + new EntryPageRecipeAnvil(KnowledgeListMF.fluxR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.bar.1")); + KnowledgeListMF.commodities.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.barR), + new EntryPageRecipeAnvil(KnowledgeListMF.baringotR)); + + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.hunks"), + new EntryPageRecipeAnvil(KnowledgeListMF.hunkR), new EntryPageRecipeAnvil(KnowledgeListMF.ingotR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.nail"), + new EntryPageRecipeAnvil(KnowledgeListMF.nailR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.rivet"), + new EntryPageRecipeAnvil(KnowledgeListMF.rivetR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.leatherstrip"), + new EntryPageRecipeCarpenter(KnowledgeListMF.lStripsR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.thread"), + new EntryPageRecipeCarpenter(KnowledgeListMF.threadR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stringR)); + KnowledgeListMF.commodities.addPages(new EntryPageText("knowledge.commodities.bucket"), + new EntryPageRecipeAnvil(KnowledgeListMF.bucketR)); + + KnowledgeListMF.dust.addPages(new EntryPageText("knowledge.dust.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.potRecipe), + new EntryPageSmelting(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot), + new EntryPageRecipeCarpenter(KnowledgeListMF.quernR), new EntryPageText("knowledge.dust.quern")); + KnowledgeListMF.dust.addPages( + new EntryPageGrind(new ItemStack(Items.coal), new ItemStack(ComponentListMF.coalDust)), + new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), + new ItemStack(ComponentListMF.kaolinite_dust)), + new EntryPageGrind(new ItemStack(Items.wheat), new ItemStack(FoodListMF.flour)), + new EntryPageGrind(new ItemStack(Items.dye, 1, 3), new ItemStack(FoodListMF.coca_powder))); + KnowledgeListMF.dust.addPages(new EntryPageText("knowledge.dust.icing"), + new EntryPageRecipeCarpenter(KnowledgeListMF.spoonR), + new EntryPageRecipeCarpenter(KnowledgeListMF.icingRecipe)); + + KnowledgeListMF.ores.addPages(new EntryPageText("knowledge.ores.1"), new EntryPageText("")); + KnowledgeListMF.ores.addPages(assembleOreDescHC("copper", BlockListMF.oreCopper, ComponentListMF.ingots[0])); + KnowledgeListMF.ores.addPages(assembleOreDescHC("tin", BlockListMF.oreTin, ComponentListMF.ingots[1])); + KnowledgeListMF.ores.addPages(assembleOreDescHC("silver", BlockListMF.oreSilver, ComponentListMF.ingots[8])); + KnowledgeListMF.ores.addPages(assembleOreDesc("wolframite", BlockListMF.oreTungsten)); + KnowledgeListMF.ores.addPages(new EntryPageCrucible(KnowledgeListMF.wolframiteR)); + KnowledgeListMF.ores.addPages(assembleOreDesc("mythic", BlockListMF.oreMythic)); + KnowledgeListMF.ores.addPages(new EntryPageText("knowledge.ores.2")); + KnowledgeListMF.ores.addPages(assembleMineralDesc("clay", BlockListMF.oreClay)); + KnowledgeListMF.ores.addPages(assembleMineralDesc("kaolinite", BlockListMF.oreKaolinite)); + KnowledgeListMF.ores.addPages(assembleMineralDesc("limestone", BlockListMF.limestone)); + KnowledgeListMF.ores.addPages(assembleMineralDesc("borax", BlockListMF.oreBorax)); + KnowledgeListMF.ores.addPages(assembleMineralDesc("nitre", BlockListMF.oreNitre)); + KnowledgeListMF.ores.addPages(assembleMineralDesc("sulfur", BlockListMF.oreSulfur)); + + KnowledgeListMF.plants.addPages(new EntryPageText("knowledge.plants.1")); + KnowledgeListMF.plants.addPages(assembleImgPage("berry", BlockListMF.berryBush)); + KnowledgeListMF.plants.addPages(new EntryPageText("knowledge.plants.2")); + KnowledgeListMF.plants.addPages(assembleImgPage("yew", BlockListMF.log_yew)); + KnowledgeListMF.plants.addPages(assembleImgPage("ironbark", BlockListMF.log_ironbark)); + KnowledgeListMF.plants.addPages(assembleImgPage("ebony", BlockListMF.log_ebony)); + + KnowledgeListMF.minotaurs.addPages(new EntryPageText("knowledge.minotaurs.1"), + new EntryPageText("knowledge.minotaurs.2"), new EntryPageText("knowledge.minotaurs.3"), + new EntryPageText("knowledge.minotaurs.4")); + KnowledgeListMF.minotaurs.addPages(assembleMobDesc("minotaur")); + KnowledgeListMF.minotaurs.addPages(assembleMobDesc("minotaur_frost")); + KnowledgeListMF.minotaurs.addPages(assembleMobDesc("minotaur_dread")); + KnowledgeListMF.minotaurs.addPages(new EntryPageText("knowledge.minotaurs.combat")); + + KnowledgeListMF.dragons.addPages(new EntryPageText("knowledge.dragons.1"), + new EntryPageText("knowledge.dragons.2")); + KnowledgeListMF.dragons.addPages(assembleMobDesc("red_dragon")); + KnowledgeListMF.dragons.addPages(assembleMobDesc("blue_dragon")); + KnowledgeListMF.dragons.addPages(assembleMobDesc("green_dragon")); + KnowledgeListMF.dragons.addPages(assembleMobDesc("ash_dragon")); + KnowledgeListMF.dragons.addPages(new EntryPageText("knowledge.dragons.combat")); + + KnowledgeListMF.chimney.addPages(new EntryPageText("knowledge.chimney.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.chimneyRecipe), new EntryPageText("knowledge.chimney.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.wideChimneyRecipe), + new EntryPageText("knowledge.chimney.3"), + new EntryPageRecipeCarpenter(KnowledgeListMF.extractChimneyRecipe)); + KnowledgeListMF.chimney.addPages(new EntryPageText("knowledge.chimney.pipe"), + new EntryPageRecipeAnvil(KnowledgeListMF.smokePipeR)); + KnowledgeListMF.chimney.addPages(assembleSimpleImgPage("smoke_pipe_example", "knowledge.chimney.pipe.2")); + + KnowledgeListMF.tanning.addPages(new EntryPageText("knowledge.tanning.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.tannerRecipe), new EntryPageText("knowledge.tanning.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.strongRackR)); + + KnowledgeListMF.bloomery.addPages(new EntryPageText("knowledge.bloomery.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bloomeryR), new EntryPageText("knowledge.bloomery.2"), + new EntryPageText("knowledge.bloomery.3")); + KnowledgeListMF.crucible.addPages(assembleSimpleImgPage("crucible_example", "knowledge.crucible.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crucibleRecipe), + new EntryPageText("knowledge.crucible.2")); + if (ConfigHardcore.HCCreduceIngots) { + KnowledgeListMF.crucible.addPages(new EntryPageText("knowledge.crucible.hcc"), + new EntryPageRecipeCarpenter(KnowledgeListMF.mouldRecipe), + new EntryPageSmelting(ComponentListMF.ingot_mould_uncooked, ComponentListMF.ingot_mould)); + } + KnowledgeListMF.crucible2.addPages(assembleSimpleImgPage("fire_crucible_example", "knowledge.crucible2.1"), + new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), + new ItemStack(ComponentListMF.kaolinite_dust)), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), + new EntryPageRecipeCarpenter(KnowledgeListMF.advCrucibleRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), + assembleSimpleImgPage("fire_crucible", "knowledge.crucible2.blocks")); + + KnowledgeListMF.bar.addPages(new EntryPageText("knowledge.bar.1")); + KnowledgeListMF.bar.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.barR), + new EntryPageRecipeAnvil(KnowledgeListMF.baringotR)); + KnowledgeListMF.smeltCopper.addPages(new EntryPageText("knowledge.smeltCopper.1")); + KnowledgeListMF.smeltBronze.addPages(new EntryPageText("knowledge.smeltBronze.1")); + if (ConfigHardcore.HCCreduceIngots) { + KnowledgeListMF.smeltIron.addPages(new EntryPageText("knowledge.smeltIron.1")); + KnowledgeListMF.smeltCopper.addPages(new EntryPageRecipeBloom(new ItemStack(BlockListMF.oreCopper), + new ItemStack(ComponentListMF.ingots[0]))); + KnowledgeListMF.smeltBronze.addPages(new EntryPageRecipeBloom(new ItemStack(BlockListMF.oreTin), + new ItemStack(ComponentListMF.ingots[1]))); + } else { + KnowledgeListMF.smeltCopper.addPages(new EntryPageSmelting(new ItemStack(BlockListMF.oreCopper), + new ItemStack(ComponentListMF.ingots[0]))); + KnowledgeListMF.smeltBronze.addPages( + new EntryPageSmelting(new ItemStack(BlockListMF.oreTin), new ItemStack(ComponentListMF.ingots[1]))); + } + KnowledgeListMF.smeltBronze.addPages(new EntryPageCrucible(KnowledgeListMF.bronze)); + KnowledgeListMF.smeltIron.addPages(new EntryPageText("knowledge.smeltIron.2")); + KnowledgeListMF.smeltPig.addPages(new EntryPageText("knowledge.smeltPig.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.ironPrepR), + new EntryPageRecipeAnvil(KnowledgeListMF.ironPrepR2), + new EntryPageBlastFurnace(ComponentListMF.iron_prep, pigiron), + new EntryPageText("knowledge.blastfurn.9")); + KnowledgeListMF.smeltSteel.addPages(new EntryPageText("knowledge.smeltSteel.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.steelR)); + if (!ConfigHardcore.HCCreduceIngots) { + KnowledgeListMF.smeltSteel.addPages(new EntryPageCrucible(KnowledgeListMF.steel)); + } + KnowledgeListMF.encrusted.addPages(new EntryPageText("knowledge.smeltEncrusted.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.diamondR), + new EntryPageRecipeAnvil(KnowledgeListMF.encrustedR)); + KnowledgeListMF.obsidian.addPages(new EntryPageText("knowledge.smeltObsidian.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), + new EntryPageCrucible(KnowledgeListMF.obsidalloy)); + + if (ConfigHardcore.HCCreduceIngots) { + KnowledgeListMF.smeltIron.addPages( + new EntryPageRecipeBloom(new ItemStack(Blocks.iron_ore), new ItemStack(Items.iron_ingot))); + } else { + KnowledgeListMF.smeltIron + .addPages(new EntryPageSmelting(new ItemStack(Blocks.iron_ore), new ItemStack(Items.iron_ingot))); + } + + KnowledgeListMF.apron.addPages(new EntryPageText("knowledge.apron.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.apronRecipe)); + KnowledgeListMF.bellows.addPages(new EntryPageText("knowledge.bellows.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bellowsRecipe)); + KnowledgeListMF.trough.addPages(new EntryPageText("knowledge.trough.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.woodTroughRecipe), new EntryPageText("knowledge.trough.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.nailTroughR)); + KnowledgeListMF.forge.addPages(assembleSimpleImgPage("forge_example", "knowledge.forge.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.forgeRecipe), new EntryPageText("knowledge.forge.2"), + new EntryPageText("knowledge.forge.3")); + KnowledgeListMF.anvil.addPages(assembleSimpleImgPage("smithy_example", "knowledge.anvil.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAnvilRecipe), + new EntryPageRecipeAnvil(ForgingRecipes.recipeMap.get("anvilCrafting")), + new EntryPageText("knowledge.anvil.2"), + new EntryPageImage("textures/gui/knowledge/anvilGuiExample.png", 128, 128, ""), + new EntryPageText("knowledge.anvil.3"), new EntryPageText("knowledge.anvil.4"), + new EntryPageText("knowledge.anvil.5")); + KnowledgeListMF.anvil.addPages(new EntryPageText("knowledge.anvil.6"), + new EntryPageImage("textures/gui/knowledge/qualityExample.png", 128, 128, "knowledge.anvil.7")); + + KnowledgeListMF.smeltDragonforge.addPages(new EntryPageText("knowledge.smeltDragonforge.1"), + new EntryPageText("knowledge.smeltDragonforge.2")); + KnowledgeListMF.craftOrnate.addPages(new EntryPageText("knowledge.craftOrnate.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.crestR)); + + KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.1"), + new EntryPageText("knowledge.craftArmourLight.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughHelmetR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughChestR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughLegsR), + new EntryPageRecipeCarpenter(KnowledgeListMF.roughBootsR)); + KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.3")); + KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.padding[0]), + new EntryPageRecipeCarpenter(KnowledgeListMF.padding[1]), + new EntryPageRecipeCarpenter(KnowledgeListMF.padding[2]), + new EntryPageRecipeCarpenter(KnowledgeListMF.padding[3])); + KnowledgeListMF.craftArmourLight.addPages(new EntryPageText("knowledge.craftArmourLight.4")); + KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.reHelmetR), + new EntryPageRecipeCarpenter(KnowledgeListMF.reChestR), + new EntryPageRecipeCarpenter(KnowledgeListMF.reLegsR), + new EntryPageRecipeCarpenter(KnowledgeListMF.reBootsR)); + KnowledgeListMF.craftArmourLight.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.studHelmetR), + new EntryPageRecipeAnvil(KnowledgeListMF.studChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.studLegsR), + new EntryPageRecipeAnvil(KnowledgeListMF.studBootsR)); + KnowledgeListMF.craftArmourMedium.addPages(new EntryPageText("knowledge.craftArmourMedium.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.mailRecipes), + new EntryPageRecipeAnvil(KnowledgeListMF.mailHelmetR), + new EntryPageRecipeAnvil(KnowledgeListMF.mailChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.mailLegsR), + new EntryPageRecipeAnvil(KnowledgeListMF.mailBootsR)); + KnowledgeListMF.craftArmourMedium.addPages(new EntryPageText("knowledge.craftArmourMedium.scale"), + new EntryPageRecipeAnvil(KnowledgeListMF.scaleRecipes), + new EntryPageRecipeAnvil(KnowledgeListMF.scaleHelmetR), + new EntryPageRecipeAnvil(KnowledgeListMF.scaleChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.scaleLegsR), + new EntryPageRecipeAnvil(KnowledgeListMF.scaleBootsR)); + KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.1"), + new EntryPageText("knowledge.craftArmourHeavy.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.padding)); + KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.splint"), + new EntryPageRecipeAnvil(KnowledgeListMF.splintRecipes), + new EntryPageRecipeAnvil(KnowledgeListMF.splintHelmetR), + new EntryPageRecipeAnvil(KnowledgeListMF.splintChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.splintLegsR), + new EntryPageRecipeAnvil(KnowledgeListMF.splintBootsR)); + KnowledgeListMF.craftArmourHeavy.addPages(new EntryPageText("knowledge.craftArmourHeavy.plate"), + new EntryPageRecipeAnvil(KnowledgeListMF.plateRecipes), + new EntryPageRecipeAnvil(KnowledgeListMF.plateHelmetR), + new EntryPageRecipeAnvil(KnowledgeListMF.plateChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.plateLegsR), + new EntryPageRecipeAnvil(KnowledgeListMF.plateBootsR)); + + KnowledgeListMF.coalflux.addPages(new EntryPageText("knowledge.coalflux.1"), + new EntryPageGrind(new ItemStack(ComponentListMF.flux), new ItemStack(ComponentListMF.flux_pot)), + new EntryPageRecipeAnvil(KnowledgeListMF.coalfluxR)); + + KnowledgeListMF.bigfurn.addPages(assembleSimpleImgPage("furnace_example", "knowledge.bigfurn.1"), + new EntryPageText("knowledge.bigfurn.2")); + KnowledgeListMF.bigfurn.addPages( + new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), + new ItemStack(ComponentListMF.kaolinite_dust)), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickR), + new EntryPageSmelting(new ItemStack(ComponentListMF.fireclay_brick), + new ItemStack(ComponentListMF.strong_brick)), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR)); + KnowledgeListMF.bigfurn.addPages(new EntryPageText("knowledge.bigfurn.heater"), + new EntryPageRecipeAnvil(KnowledgeListMF.bigHeatR), + assembleSimpleImgPage("furnace_heater", BlockListMF.furnace_heater.getUnlocalizedName() + ".name")); + KnowledgeListMF.bigfurn.addPages(new EntryPageText("knowledge.bigfurn.top"), + new EntryPageRecipeAnvil(KnowledgeListMF.bigFurnR), + assembleSimpleImgPage("furnace_full", "knowledge.bigfurn.structure")); + + KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.1"), + new EntryPageText("knowledge.blastfurn.2")); + KnowledgeListMF.blastfurn.addPages( + new EntryPageGrind(new ItemStack(ComponentListMF.kaolinite), + new ItemStack(ComponentListMF.kaolinite_dust)), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireclayR), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickR), + new EntryPageSmelting(new ItemStack(ComponentListMF.fireclay_brick), + new ItemStack(ComponentListMF.strong_brick)), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR)); + KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.3"), + new EntryPageRecipeAnvil(KnowledgeListMF.blastChamR), + new EntryPageRecipeAnvil(KnowledgeListMF.blastHeatR), new EntryPageText("knowledge.blastfurn.4"), + new EntryPageText("knowledge.blastfurn.5")); + KnowledgeListMF.blastfurn.addPages( + new EntryPageImage("textures/gui/knowledge/blast_example.png", 96, 96, "knowledge.blastfurn.6")); + KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.7")); + if (ConfigHardcore.HCCreduceIngots) { + KnowledgeListMF.blastfurn.addPages(new EntryPageText("knowledge.blastfurn.hcc")); + } + + KnowledgeListMF.etools.addPages(new EntryPageText("knowledge.etools.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.spannerR), new EntryPageRecipeAnvil(KnowledgeListMF.eatoolsR)); + KnowledgeListMF.ecomponents.addPages(new EntryPageText("knowledge.ecomponents.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.boltR), new EntryPageText("knowledge.ecomponents.2"), + new EntryPageRecipeAnvil(KnowledgeListMF.iframeR), new EntryPageRecipeAnvil(KnowledgeListMF.bgearR), + new EntryPageRecipeAnvil(KnowledgeListMF.tgearR), new EntryPageRecipeAnvil(KnowledgeListMF.istrutR), + new EntryPageRecipeAnvil(KnowledgeListMF.stubeR)); + KnowledgeListMF.tungsten.addPages(new EntryPageText("knowledge.tungsten.1"), + new EntryPageText("knowledge.tungsten.2"), new EntryPageText("knowledge.tungsten.3"), + new EntryPageCrucible(KnowledgeListMF.wolframiteR)); + KnowledgeListMF.climber.addPages(new EntryPageText("knowledge.climber.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.climbPickbR), new EntryPageText("knowledge.climber.2")); + KnowledgeListMF.spyglass.addPages(new EntryPageText("knowledge.spyglass.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.spyglassR)); + KnowledgeListMF.parachute.addPages(new EntryPageText("knowledge.parachute.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.parachuteR)); + KnowledgeListMF.syringe.addPages(new EntryPageText("knowledge.syringe.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.syringeR)); + KnowledgeListMF.engTanner.addPages(new EntryPageText("knowledge.engTanner.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.engTannerR)); + KnowledgeListMF.advcrucible.addPages( + assembleSimpleImgPage("auto_crucible_example", BlockListMF.crucibleauto.getUnlocalizedName() + ".name"), + new EntryPageText("knowledge.advcrucible.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.autoCrucibleR), + new EntryPageText("knowledge.crucible2.blocks"), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), + assembleSimpleImgPage("auto_crucible", "knowledge.basicstructure")); + KnowledgeListMF.advforge.addPages(new EntryPageText("knowledge.advforge.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.advancedForgeR)); + KnowledgeListMF.coke.addPages(new EntryPageText("knowledge.coke.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.coalPrepR), + new EntryPageSmelting(ComponentListMF.coal_prep, ComponentListMF.coke)); + + KnowledgeListMF.blackpowder.addPages(new EntryPageText("knowledge.blackpowder.1"), + new EntryPageGrind(new ItemStack(Items.coal), new ItemStack(ComponentListMF.coalDust)), + new EntryPageRecipeCarpenter(KnowledgeListMF.blackpowderRec), + new EntryPageRecipeCarpenter(KnowledgeListMF.crudeBombR)); + KnowledgeListMF.advblackpowder.addPages(new EntryPageText("knowledge.advblackpowder.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.advblackpowderRec)); + KnowledgeListMF.bombs.addPages(new EntryPageText("knowledge.bombs.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bombBenchCraft), new EntryPageText("knowledge.bombs.2"), + new EntryPageImage("textures/gui/knowledge/bombGuiExample.png", 128, 128, "knowledge.guiSubtitle"), + new EntryPageText("knowledge.bombs.3"), new EntryPageText("knowledge.bombs.4")); + KnowledgeListMF.bpress.addPages(new EntryPageText("knowledge.bpress.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bombPressCraft)); + KnowledgeListMF.bombarrow.addPages(new EntryPageText("knowledge.bombarrow.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.bombarrowR), + new EntryPageRecipeAnvil(KnowledgeListMF.bombBoltR)); + KnowledgeListMF.shrapnel.addPages(new EntryPageText("knowledge.shrapnel.1"), + new EntryPageGrind(new ItemStack(Items.flint), new ItemStack(ComponentListMF.shrapnel))); + KnowledgeListMF.firebomb.addPages(new EntryPageText("knowledge.firebomb.1"), + new EntryPageText("knowledge.firebomb.2"), new EntryPageText("knowledge.firebomb.3"), + new EntryPageRecipeCarpenter(KnowledgeListMF.magmaRefinedR)); + KnowledgeListMF.bombCeramic.addPages(new EntryPageText("knowledge.bombCeramic.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bombCaseCeramicR), + new EntryPageSmelting(ComponentListMF.bomb_casing_uncooked, ComponentListMF.bomb_casing)); + KnowledgeListMF.bombIron.addPages(new EntryPageText("knowledge.bombIron.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.bombCaseIronR)); + KnowledgeListMF.bombObsidian.addPages(new EntryPageText("knowledge.bombObsidian.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.bombCaseObsidianR)); + KnowledgeListMF.bombCrystal.addPages(new EntryPageText("knowledge.bombCrystal.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bombCaseCrystalR)); + + KnowledgeListMF.mineCeramic.addPages(new EntryPageText("knowledge.mineCeramic.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.mineCaseCeramicR), + new EntryPageSmelting(ComponentListMF.mine_casing_uncooked, ComponentListMF.mine_casing)); + KnowledgeListMF.mineIron.addPages(new EntryPageText("knowledge.mineIron.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.mineCaseIronR)); + KnowledgeListMF.mineObsidian.addPages(new EntryPageText("knowledge.mineObsidian.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.mineCaseObsidianR)); + KnowledgeListMF.mineCrystal.addPages(new EntryPageText("knowledge.mineCrystal.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.mineCaseCrystalR)); + KnowledgeListMF.bombFuse.addPages(new EntryPageText("knowledge.bombFuse.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bombFuseR), new EntryPageText("knowledge.bombFuse.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.longFuseR)); + KnowledgeListMF.stickybomb.addPages(new EntryPageText("knowledge.stickybomb.1"), + new EntryPageText("knowledge.stickybomb.2")); + + KnowledgeListMF.crossbows.addPages(new EntryPageText("knowledge.crossbows.1"), + new EntryPageText("knowledge.crossbows.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossBenchCraft), + new EntryPageText("knowledge.crossbows.3"), new EntryPageText("knowledge.crossbows.4"), + new EntryPageText("knowledge.crossbows.5"), new EntryPageText("knowledge.crossbows.6"), + new EntryPageRecipeAnvil(KnowledgeListMF.crossBoltR)); + KnowledgeListMF.crossShafts.addPages(new EntryPageText("knowledge.crossShafts.handle"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossHandleWoodR), + new EntryPageText("knowledge.crossShafts.stock"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossStockWoodR)); + KnowledgeListMF.crossHeads.addPages(new EntryPageText("knowledge.crossHeads.light"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadLightR), + new EntryPageText("knowledge.crossHeads.medium"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadMediumR), + new EntryPageText("knowledge.crossHeads.heavy"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadHeavyR)); + KnowledgeListMF.crossHeadAdvanced.addPages(new EntryPageText("knowledge.crossHeads.advanced"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossHeadAdvancedR)); + KnowledgeListMF.crossShaftAdvanced.addPages(new EntryPageText("knowledge.crossShafts.advanced"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossStockIronR)); + KnowledgeListMF.crossScope.addPages(new EntryPageText("knowledge.crossScope.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossScopeR)); + KnowledgeListMF.crossAmmo.addPages(new EntryPageText("knowledge.crossAmmo.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.crossAmmoR)); + KnowledgeListMF.crossBayonet.addPages(new EntryPageText("knowledge.crossBayonet.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.crossBayonetR)); + + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.1"), + new EntryPageText("knowledge.cogArmour.2")); + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.station"), + new EntryPageRecipeAnvil(KnowledgeListMF.frameBlockR), + assembleSimpleImgPage("cogwork_station", "knowledge.cogwork_station")); + // EXAMPLE + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.station.2"), + new EntryPageRecipeAnvil(KnowledgeListMF.cogPulleyR), + assembleSimpleImgPage("cogwork_station_2", "knowledge.rightclickspanner")); + + // RECIPE + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.crafting"), + new EntryPageRecipeCarpenter(KnowledgeListMF.cogShaftR), + new EntryPageRecipeAnvil(KnowledgeListMF.cogHelmR), new EntryPageRecipeAnvil(KnowledgeListMF.cogChestR), + new EntryPageRecipeAnvil(KnowledgeListMF.cogLegsR), + assembleSimpleImgPage("cogwork_suit_craft", "knowledge.rightclickspanner")); + + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.armour")); + KnowledgeListMF.cogArmour.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hugePlateR), + new EntryPageRecipeAnvil(KnowledgeListMF.cogPlateR)); + + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.advantage"), + new EntryPageText("knowledge.cogArmour.advantage.2"), + new EntryPageText("knowledge.cogArmour.advantage.3")); + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.disadvantage"), + new EntryPageText("knowledge.cogArmour.disadvantage.2")); + KnowledgeListMF.cogArmour.addPages(new EntryPageText("knowledge.cogArmour.removal")); + + KnowledgeListMF.compPlate.addPages(new EntryPageText("knowledge.compPlate.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.compPlateR)); + // KnowledgeListMF.craftOrnateWeapons.addPages(new + // EntryPageText("knowledge.craftOrnateWeapons.1")); + + KnowledgeListMF.repair_basic.addPages(new EntryPageText("knowledge.repair_basic.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.repairBasicR)); + KnowledgeListMF.repair_advanced.addPages(new EntryPageText("knowledge.repair_advanced.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.repairAdvancedR)); + KnowledgeListMF.repair_ornate.addPages(new EntryPageText("knowledge.repair_ornate.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.repairOrnateR)); + + KnowledgeListMF.refined_planks.addPages(new EntryPageText("knowledge.refined_planks.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.nailPlanksR), + new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankBlockR), + new EntryPageRecipeCarpenter(KnowledgeListMF.nailStairR), + new EntryPageRecipeCarpenter(KnowledgeListMF.refinedStairR)); + KnowledgeListMF.reinforced_stone.addPages(new EntryPageText("knowledge.reinforced_stone.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), + new EntryPageCrucible(KnowledgeListMF.reStone)); + KnowledgeListMF.brickworks.addPages(new EntryPageText("knowledge.brickworks.1"), + new EntryPageRecipeBase(KnowledgeListMF.stoneBricksR), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBricksR), + new EntryPageRecipeCarpenter(KnowledgeListMF.fireBrickStairR)); + KnowledgeListMF.clay_wall.addPages(new EntryPageText("knowledge.clay_wall.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.clayWallR)); + KnowledgeListMF.glass.addPages(new EntryPageText("knowledge.glass.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.framedGlassR), + new EntryPageRecipeCarpenter(KnowledgeListMF.windowR)); + KnowledgeListMF.thatch.addPages(new EntryPageText("knowledge.thatch.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.thatchR), + new EntryPageRecipeCarpenter(KnowledgeListMF.thatchStairR)); + KnowledgeListMF.bars.addPages(new EntryPageText("knowledge.bars.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.barsR)); + KnowledgeListMF.paint_brush.addPages(new EntryPageText("knowledge.paint_brush.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.brushRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.easyPaintPlank)); + KnowledgeListMF.decorated_stone.addPages(new EntryPageText("knowledge.decorated_stone.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.framedStoneR), + new EntryPageRecipeAnvil(KnowledgeListMF.iframedStoneR)); + + KnowledgeListMF.bed_roll.addPages(new EntryPageText("knowledge.bed_roll.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bedrollR)); + KnowledgeListMF.tool_rack.addPages(new EntryPageText("knowledge.tool_rack.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.rackRecipe), + new EntryPageText("knowledge.tool_rack.rules")); + KnowledgeListMF.food_box.addPages(new EntryPageText("knowledge.food_box.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.foodboxR), new EntryPageText("knowledge.ammo_box.2")); + KnowledgeListMF.ammo_box.addPages(new EntryPageText("knowledge.ammo_box.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.ammoboxR), new EntryPageText("knowledge.ammo_box.2")); + KnowledgeListMF.big_box.addPages(new EntryPageText("knowledge.big_box.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.bigboxR), new EntryPageText("knowledge.ammo_box.2")); + + KnowledgeListMF.constructionPts.addPages(new EntryPageText("knowledge.constructionPts.1")); + KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.sawnPlankR)); + KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.plankPaneR)); + KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hingeRecipe)); + KnowledgeListMF.constructionPts.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), + new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), + new EntryPageRecipeBase(KnowledgeListMF.plantOilR), + new EntryPageRecipeCarpenter(KnowledgeListMF.refinedPlankR)); + + if (ConfigHardcore.HCCallowRocks) { + KnowledgeListMF.craftHCCTools.addPages(new EntryPageText("knowledge.craftHCCTools.1"), + new EntryPageText("knowledge.craftHCCTools.2")); + KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.sharpRocksR), + new EntryPageText("knowledge.craftHCCTools.3")); + KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stonePickR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpadeR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneAxeR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHoeR)); + KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), + new EntryPageRecipeCarpenter(KnowledgeListMF.boneNeedleR)); + KnowledgeListMF.craftHCCTools.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSwordR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneMaceR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneWarR), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneSpearR)); + } + KnowledgeListMF.craftTools.addPages(new EntryPageText("knowledge.craftTools.1")); + KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.pickR)); + KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.axeR)); + KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.spadeR)); + KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.hoeR)); + KnowledgeListMF.craftTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.shearsR)); + + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.craftAdvTools.1")); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.handpickR)); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.hvypick.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.hvyPickR)); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.trow.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.trowR)); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.hvyshovel.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.hvyShovelR)); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.scythe.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.scytheR)); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.mattock.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.mattockR), new EntryPageText("knowledge.mattock.use")); + KnowledgeListMF.craftAdvTools.addPages(new EntryPageText("knowledge.lumber.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.lumberR)); + + KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.dryrocks.info"), + new EntryPageRecipeBase(KnowledgeListMF.dryrocksR)); + KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.tinderbox.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.tinderboxR)); + KnowledgeListMF.firemaker.addPages(new EntryPageText("knowledge.flintsteel.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.flintAndSteelR)); + + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.craftCrafters.1")); + KnowledgeListMF.craftCrafters.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.stoneHammerR), + new EntryPageRecipeAnvil(KnowledgeListMF.hammerR), new EntryPageText("")); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.hvyhammer.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.hvyHammerR)); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.tongs.info"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneTongsR), + new EntryPageRecipeAnvil(KnowledgeListMF.tongsR), new EntryPageText("")); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.knife.info"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneKnifeR), + new EntryPageRecipeAnvil(KnowledgeListMF.knifeR), new EntryPageText("")); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.saw.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.sawsR)); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.needle.info"), + new EntryPageRecipeCarpenter(KnowledgeListMF.boneNeedleR), + new EntryPageRecipeAnvil(KnowledgeListMF.needleR), new EntryPageText("")); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.mallet.info"), + new EntryPageRecipeCarpenter(KnowledgeListMF.malletR)); + KnowledgeListMF.craftCrafters.addPages(new EntryPageText("knowledge.spoon.info"), + new EntryPageRecipeCarpenter(KnowledgeListMF.spoonR)); + + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.craftWeapons.1")); + KnowledgeListMF.craftWeapons.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.daggerR)); + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.sword.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.swordR)); + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.waraxe.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.waraxeR)); + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.mace.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.maceR)); + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.spear.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.spearR)); + KnowledgeListMF.craftWeapons.addPages(new EntryPageText("knowledge.bow.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.bowR)); + + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.craftAdvWeapons.1")); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.katanaR)); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.greatsword.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.gswordR)); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.battleaxe.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.battleaxeR)); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.warhammer.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.whammerR)); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.halbeard.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.halbeardR)); + KnowledgeListMF.craftAdvWeapons.addPages(new EntryPageText("knowledge.lance.info"), + new EntryPageRecipeAnvil(KnowledgeListMF.lanceR)); + + KnowledgeListMF.arrows.addPages(new EntryPageText("knowledge.arrows.1")); + KnowledgeListMF.arrows.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.fletchingR), + new EntryPageRecipeCarpenter(KnowledgeListMF.fletchingR2)); + KnowledgeListMF.arrows.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.arrowheadR)); + KnowledgeListMF.arrows.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.arrowR)); + KnowledgeListMF.arrowsBodkin.addPages(new EntryPageText("knowledge.arrowsBodkin.1")); + KnowledgeListMF.arrowsBodkin.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.bodkinheadR)); + KnowledgeListMF.arrowsBroad.addPages(new EntryPageText("knowledge.arrowsBroad.1")); + KnowledgeListMF.arrowsBroad.addPages(new EntryPageRecipeAnvil(KnowledgeListMF.broadheadR)); + + KnowledgeListMF.smeltBlackSteel.addPages(new EntryPageText("knowledge.smeltBlackSteel.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.obsidianHunkR), new EntryPageCrucible(KnowledgeListMF.black), + new EntryPageBlastFurnace(ComponentListMF.ingots[6], black)); + KnowledgeListMF.smeltRedSteel.addPages(new EntryPageText("knowledge.smeltRedSteel.1"), + new EntryPageCrucible(KnowledgeListMF.red), new EntryPageBlastFurnace(ComponentListMF.ingots[9], red)); + KnowledgeListMF.smeltBlueSteel.addPages(new EntryPageText("knowledge.smeltBlueSteel.1"), + new EntryPageCrucible(KnowledgeListMF.blue), + new EntryPageBlastFurnace(ComponentListMF.ingots[11], blue)); + KnowledgeListMF.smeltAdamant.addPages(new EntryPageText("knowledge.smeltAdamantium.1"), + new EntryPageText("knowledge.smeltAdamantium.2"), new EntryPageCrucible(KnowledgeListMF.adamantium)); + KnowledgeListMF.smeltMithril.addPages(new EntryPageText("knowledge.smeltMithril.1"), + new EntryPageText("knowledge.smeltMithril.2"), new EntryPageCrucible(KnowledgeListMF.mithril)); + + KnowledgeListMF.smeltMaster.addPages(new EntryPageText("knowledge.smeltMaster.1"), + new EntryPageText("knowledge.smeltMaster.2"), new EntryPageText("knowledge.smeltMaster.3")); + KnowledgeListMF.smeltMaster.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.trilogyRecipe)); + KnowledgeListMF.smeltIgnotumite.addPages(new EntryPageText("knowledge.smeltIgnotumite.1"), + new EntryPageCrucible(KnowledgeListMF.ignotumite)); + KnowledgeListMF.smeltMithium.addPages(new EntryPageText("knowledge.smeltMithium.1"), + new EntryPageCrucible(KnowledgeListMF.mithium)); + KnowledgeListMF.smeltEnderforge.addPages(new EntryPageText("knowledge.smeltEnderforge.1"), + new EntryPageCrucible(KnowledgeListMF.enderforge)); + + KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.1"), + new EntryPageRecipeBase(KnowledgeListMF.firepitRecipe)); + KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.2"), + new EntryPageRecipeBase(KnowledgeListMF.cooktopRecipe)); + KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.3"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stoneovenRecipe)); + KnowledgeListMF.firepit.addPages(new EntryPageText("knowledge.firepit.4")); + + KnowledgeListMF.cookingutensil.addPages(new EntryPageText("knowledge.cookingutensil.1"), + new EntryPageRecipeAnvil(KnowledgeListMF.caketinRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.pieTrayRecipe), + new EntryPageSmelting(ComponentListMF.pie_tray_uncooked, FoodListMF.pie_tray)); + KnowledgeListMF.salt.addPages(new EntryPageText("knowledge.salt.1"), + new EntryPageSmelting(new ItemStack(FoodListMF.bowl_water_salt), new ItemStack(FoodListMF.salt))); + KnowledgeListMF.jug.addPages(new EntryPageText("knowledge.jug.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.jugRecipe), + new EntryPageSmelting(FoodListMF.jug_uncooked, FoodListMF.jug_empty), + new EntryPageText("knowledge.jug.2"), new EntryPageRecipeBase(KnowledgeListMF.waterJugR), + new EntryPageRecipeBase(KnowledgeListMF.milkJugR)); + + KnowledgeListMF.generic_meat.addPages(new EntryPageText("knowledge.generic_meat.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.meatRecipes), + new EntryPageRecipeCarpenter(KnowledgeListMF.meatStripR), + new EntryPageRecipeCarpenter(KnowledgeListMF.meatHunkR), + new EntryPageGrind(new ItemStack(FoodListMF.generic_meat_uncooked), + new ItemStack(FoodListMF.generic_meat_mince_uncooked))); + KnowledgeListMF.stew.addPages(new EntryPageText("knowledge.stew.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.stewRecipe)); + KnowledgeListMF.jerky.addPages(new EntryPageText("knowledge.jerky.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.jerkyRecipe)); + KnowledgeListMF.saussage.addPages(new EntryPageText("knowledge.saussage.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.gutsRecipe), + new EntryPageGrind(new ItemStack(FoodListMF.breadroll), new ItemStack(FoodListMF.breadcrumbs)), + new EntryPageRecipeCarpenter(KnowledgeListMF.saussageR), new EntryPageSmelting( + new ItemStack(FoodListMF.saussage_raw), new ItemStack(FoodListMF.saussage_cooked))); + KnowledgeListMF.sandwitch.addPages(new EntryPageText("knowledge.sandwitch.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.breadSliceR), + new EntryPageRecipeCarpenter(KnowledgeListMF.sandwitchRecipe)); + KnowledgeListMF.sandwitchBig.addPages(new EntryPageText("knowledge.sandwitchBig.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.sandwitchBigRecipe)); + KnowledgeListMF.meatpie.addPages(new EntryPageText("knowledge.meatpie.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.meatPieRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.pie_meat_uncooked), + new ItemStack(FoodListMF.pie_meat_cooked)), + new EntryPageRecipeBase(KnowledgeListMF.meatpieOut)); + KnowledgeListMF.shepardpie.addPages(new EntryPageText("knowledge.shepardpie.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.shepardRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.pie_shepard_uncooked), + new ItemStack(FoodListMF.pie_shepard_cooked)), + new EntryPageRecipeBase(KnowledgeListMF.shepardOut)); + + KnowledgeListMF.bread.addPages(new EntryPageText("knowledge.bread.1"), + new EntryPageGrind(new ItemStack(Items.wheat), new ItemStack(FoodListMF.flour)), + new EntryPageRecipeCarpenter(KnowledgeListMF.doughRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.dough), new ItemStack(FoodListMF.breadroll)), + new EntryPageRecipeCarpenter(KnowledgeListMF.breadRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.raw_bread), new ItemStack(Items.bread)), + new EntryPageRecipeCarpenter(KnowledgeListMF.pastryRecipe), + new EntryPageGrind(new ItemStack(FoodListMF.breadroll), new ItemStack(FoodListMF.breadcrumbs))); + KnowledgeListMF.bread.addPages(new EntryPageText("knowledge.bread.other"), + new EntryPageRecipeCarpenter(KnowledgeListMF.pumpPieR), + new EntryPageSmelting(new ItemStack(FoodListMF.pie_pumpkin_uncooked), + new ItemStack(FoodListMF.pie_pumpkin_cooked)), + new EntryPageRecipeBase(KnowledgeListMF.pumpPieOut)); + KnowledgeListMF.bread.addPages(new EntryPageRecipeCarpenter(KnowledgeListMF.simpCakeR), + new EntryPageSmelting(new ItemStack(FoodListMF.cake_simple_raw), + new ItemStack(FoodListMF.cake_simple_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.simpCakeOut)); + + KnowledgeListMF.oats.addPages(new EntryPageText("knowledge.oats.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.oatsRecipe)); + + KnowledgeListMF.berry.addPages(assembleImgPage("berry", BlockListMF.berryBush)); + KnowledgeListMF.icing.addPages(new EntryPageText("knowledge.icing.1"), + new EntryPageGrind(new ItemStack(Items.reeds), new ItemStack(FoodListMF.sugarpot)), + new EntryPageRecipeBase(KnowledgeListMF.sugarRecipe), new EntryPageText("knowledge.icing.2"), + new EntryPageRecipeCarpenter(KnowledgeListMF.icingRecipe)); + KnowledgeListMF.sweetroll.addPages(new EntryPageText("knowledge.sweetroll.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.sweetrollRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.sweetroll_raw), + new ItemStack(FoodListMF.sweetroll_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.iceSR)); + KnowledgeListMF.cake.addPages(new EntryPageText("knowledge.cake.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.cakeR), + new EntryPageSmelting(new ItemStack(FoodListMF.cake_raw), new ItemStack(FoodListMF.cake_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.cakeI)); + KnowledgeListMF.carrotcake.addPages(new EntryPageText("knowledge.carrotcake.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.carrotCakeR), + new EntryPageSmelting(new ItemStack(FoodListMF.cake_carrot_raw), + new ItemStack(FoodListMF.cake_carrot_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.carrotCakeI)); + KnowledgeListMF.chococake.addPages(new EntryPageText("knowledge.chococake.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.chocoCakeR), + new EntryPageSmelting(new ItemStack(FoodListMF.cake_choc_raw), + new ItemStack(FoodListMF.cake_choc_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.chocoCakeI)); + KnowledgeListMF.bfcake.addPages(new EntryPageText("knowledge.bfcake.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.bfCakeR), + new EntryPageSmelting(new ItemStack(FoodListMF.cake_bf_raw), new ItemStack(FoodListMF.cake_bf_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.bfCakeI)); + KnowledgeListMF.berrypie + .addPages(new EntryPageText("knowledge.berrypie.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.berryR), + new EntryPageSmelting(new ItemStack(FoodListMF.pie_berry_uncooked), + new ItemStack(FoodListMF.pie_berry_cooked)), + new EntryPageRecipeBase(KnowledgeListMF.berryOut)); + KnowledgeListMF.applepie + .addPages(new EntryPageText("knowledge.applepie.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.appleR), + new EntryPageSmelting(new ItemStack(FoodListMF.pie_apple_uncooked), + new ItemStack(FoodListMF.pie_apple_cooked)), + new EntryPageRecipeBase(KnowledgeListMF.appleOut)); + KnowledgeListMF.eclair.addPages(new EntryPageText("knowledge.eclair.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.eclairDoughR), + new EntryPageSmelting(new ItemStack(FoodListMF.eclair_raw), new ItemStack(FoodListMF.eclair_uniced)), + new EntryPageRecipeCarpenter(KnowledgeListMF.chocoRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.eclairIceR), + new EntryPageRecipeCarpenter(KnowledgeListMF.custardRecipe), + new EntryPageRecipeCarpenter(KnowledgeListMF.eclairFillR)); + + KnowledgeListMF.cheese.addPages(new EntryPageText("knowledge.cheese.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.curdRecipe), + new EntryPageSmelting(new ItemStack(FoodListMF.curds), new ItemStack(FoodListMF.cheese_pot)), + new EntryPageRecipeBase(KnowledgeListMF.cheeseOut)); + KnowledgeListMF.cheeseroll.addPages(new EntryPageText("knowledge.cheeseroll.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.cheeserollR)); + + KnowledgeListMF.bandage.addPages(new EntryPageText("knowledge.bandage.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.badBandageR), + new EntryPageRecipeCarpenter(KnowledgeListMF.bandageR)); + KnowledgeListMF.bandageadv.addPages(new EntryPageText("knowledge.bandageadv.1"), + new EntryPageRecipeCarpenter(KnowledgeListMF.goodBandageR)); + + // MASTERY + KnowledgeListMF.toughness.addPages(new EntryPageText("knowledge.toughness.1")); + KnowledgeListMF.fitness.addPages(new EntryPageText("knowledge.fitness.1")); + KnowledgeListMF.armourpro.addPages(new EntryPageText("knowledge.armourpro.1")); + KnowledgeListMF.parrypro.addPages(new EntryPageText("knowledge.parrypro.1")); + KnowledgeListMF.counteratt.addPages(new EntryPageText("knowledge.counteratt.1"), + new EntryPageText("knowledge.counteratt.2")); + KnowledgeListMF.autoparry.addPages(new EntryPageText("knowledge.autoparry.1")); + KnowledgeListMF.firstaid.addPages(new EntryPageText("knowledge.firstaid.1")); + KnowledgeListMF.doctor.addPages(new EntryPageText("knowledge.doctor.1")); + KnowledgeListMF.scrapper.addPages(new EntryPageText("knowledge.scrapper.1")); + } + + private static EntryPage[] assembleOreDesc(String orename, Block ore, Item ingot) { + return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, + "knowledge.ores." + orename), new EntryPageSmelting(new ItemStack(ore), new ItemStack(ingot))}; + } + + private static EntryPage[] assembleOreDescHC(String orename, Block ore, Item ingot) { + if (ConfigHardcore.HCCreduceIngots) { + return new EntryPage[]{ + new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, + "knowledge.ores." + orename), + new EntryPageRecipeBloom(new ItemStack(ore), new ItemStack(ingot))}; + } + return assembleOreDesc(orename, ore, ingot); + } + + private static EntryPage[] assembleOreDesc(String orename, Block ore) { + return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, + "knowledge.ores." + orename)}; + } + + private static EntryPage[] assembleMineralDesc(String orename, Block ore) { + return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/" + orename + ".png", 96, 96, + "knowledge.minerals." + orename)}; + } + + private static EntryPage[] assembleImgPage(String name, Block blockname) { + return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/" + name + ".png", 96, 96, + "knowledge." + name + ".1")}; + } + + private static EntryPage[] assembleMobDesc(String name) { + return new EntryPage[]{new EntryPageImage("textures/gui/knowledge/image/mob/" + name + ".png", 96, 96, + "knowledge." + name + ".1")}; + } + + private static EntryPage assembleSimpleImgPage(String name, String text) { + return new EntryPageImage("textures/gui/knowledge/image/" + name + ".png", 96, 96, text); + } } diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiAnvilMF.java b/src/main/java/minefantasy/mf2/client/gui/GuiAnvilMF.java index 86f8a1c3..d2a60843 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiAnvilMF.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiAnvilMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -14,108 +12,109 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiAnvilMF extends GuiContainer { - private TileEntityAnvilMF tile; - private int regularXSize = 176; - private int xInvOffset = 28; + private TileEntityAnvilMF tile; + private int regularXSize = 176; + private int xInvOffset = 28; - public GuiAnvilMF(InventoryPlayer user, TileEntityAnvilMF tile) { - super(new ContainerAnvilMF(user, tile)); - this.xSize = 235; - this.ySize = 210; - this.tile = tile; - } + public GuiAnvilMF(InventoryPlayer user, TileEntityAnvilMF tile) { + super(new ContainerAnvilMF(user, tile)); + this.xSize = 235; + this.ySize = 210; + this.tile = tile; + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - boolean knowsCraft = tile.doesPlayerKnowCraft(mc.thePlayer); - String s = MineFantasyII.isDebug() ? "Anvil Crafting" - : knowsCraft ? StatCollector.translateToLocal(tile.getResultName()) : "????"; - this.fontRendererObj.drawString(s, 10 + xInvOffset, 8, 0); + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + boolean knowsCraft = tile.doesPlayerKnowCraft(mc.thePlayer); + String s = MineFantasyII.isDebug() ? "Anvil Crafting" + : knowsCraft ? StatCollector.translateToLocal(tile.getResultName()) : "????"; + this.fontRendererObj.drawString(s, 10 + xInvOffset, 8, 0); - int xPoint = (this.width - this.xSize) / 2 + 30; - int yPoint = (this.height - this.ySize) / 2; + int xPoint = (this.width - this.xSize) / 2 + 30; + int yPoint = (this.height - this.ySize) / 2; - if (knowsCraft && !tile.resName.equalsIgnoreCase("")) { - if (tile.getToolNeeded() != null) { - if (x < xPoint && x > xPoint - 20 && y < yPoint + 20 && y > yPoint) { - String s2 = StatCollector.translateToLocal("tooltype." + tile.getToolNeeded()) + ", " - + (tile.getToolTierNeeded() > -1 - ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " - + tile.getToolTierNeeded() - : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); - this.fontRendererObj.drawStringWithShadow(s2, -18 + xInvOffset, -12, - isToolSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); - } - } - if (x < xPoint + regularXSize + 20 && x > xPoint + regularXSize && y < yPoint + 20 && y > yPoint) { - String s2 = StatCollector.translateToLocal("tooltype.anvil") + ", " - + (tile.getAnvilTierNeeded() > -1 - ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " - + tile.getAnvilTierNeeded() - : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); - this.fontRendererObj.drawStringWithShadow(s2, - regularXSize - fontRendererObj.getStringWidth(s2) + 18 + xInvOffset, -12, - isBlockSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); - } - } - } + if (knowsCraft && !tile.resName.equalsIgnoreCase("")) { + if (tile.getToolNeeded() != null) { + if (x < xPoint && x > xPoint - 20 && y < yPoint + 20 && y > yPoint) { + String s2 = StatCollector.translateToLocal("tooltype." + tile.getToolNeeded()) + ", " + + (tile.getToolTierNeeded() > -1 + ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + + tile.getToolTierNeeded() + : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); + this.fontRendererObj.drawStringWithShadow(s2, -18 + xInvOffset, -12, + isToolSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); + } + } + if (x < xPoint + regularXSize + 20 && x > xPoint + regularXSize && y < yPoint + 20 && y > yPoint) { + String s2 = StatCollector.translateToLocal("tooltype.anvil") + ", " + + (tile.getAnvilTierNeeded() > -1 + ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + + tile.getAnvilTierNeeded() + : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); + this.fontRendererObj.drawStringWithShadow(s2, + regularXSize - fontRendererObj.getStringWidth(s2) + 18 + xInvOffset, -12, + isBlockSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); + } + } + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager() - .bindTexture(TextureHelperMF.getResource("textures/gui/anvil" + tile.getTextureName() + ".png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager() + .bindTexture(TextureHelperMF.getResource("textures/gui/anvil" + tile.getTextureName() + ".png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - if (tile.progressMax > 0 && tile.progress > 0) { - int progressWidth = (int) (160F / tile.progressMax * tile.progress); - this.drawTexturedModalRect(xPoint + 8 + xInvOffset, yPoint + 21, 0, 210, progressWidth, 3); - } - if (tile.doesPlayerKnowCraft(mc.thePlayer) && !tile.resName.equalsIgnoreCase("")) { - GuiHelper.renderToolIcon(this, "anvil", tile.getAnvilTierNeeded(), xPoint + regularXSize + xInvOffset, - yPoint, isBlockSufficient()); + if (tile.progressMax > 0 && tile.progress > 0) { + int progressWidth = (int) (160F / tile.progressMax * tile.progress); + this.drawTexturedModalRect(xPoint + 8 + xInvOffset, yPoint + 21, 0, 210, progressWidth, 3); + } + if (tile.doesPlayerKnowCraft(mc.thePlayer) && !tile.resName.equalsIgnoreCase("")) { + GuiHelper.renderToolIcon(this, "anvil", tile.getAnvilTierNeeded(), xPoint + regularXSize + xInvOffset, + yPoint, isBlockSufficient()); - if (tile.getToolNeeded() != null) { - GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPoint - 20 + xInvOffset, - yPoint, isToolSufficient()); - } - } - } + if (tile.getToolNeeded() != null) { + GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPoint - 20 + xInvOffset, + yPoint, isToolSufficient()); + } + } + } - private boolean isBlockSufficient() { - return tile.tier >= tile.getAnvilTierNeeded(); - } + private boolean isBlockSufficient() { + return tile.tier >= tile.getAnvilTierNeeded(); + } - private boolean isToolSufficient() { - if (mc.thePlayer != null) { - return ToolHelper.isToolSufficient(mc.thePlayer.getHeldItem(), tile.getToolNeeded(), - tile.getToolTierNeeded()); - } - return false; - } + private boolean isToolSufficient() { + if (mc.thePlayer != null) { + return ToolHelper.isToolSufficient(mc.thePlayer.getHeldItem(), tile.getToolNeeded(), + tile.getToolTierNeeded()); + } + return false; + } - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } - private void renderItem(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { - itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); - itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); - } + private void renderItem(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); + } - private void renderItemName(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { - if (this.func_146978_c(x - guiLeft, y - guiTop, 16, 16, mouseX, mouseY)) { - this.renderToolTip(itemstack, mouseX, mouseY); - } - } + private void renderItemName(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { + if (this.func_146978_c(x - guiLeft, y - guiTop, 16, 16, mouseX, mouseY)) { + this.renderToolTip(itemstack, mouseX, mouseY); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiBigFurnace.java b/src/main/java/minefantasy/mf2/client/gui/GuiBigFurnace.java index 423b10db..9be317e9 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiBigFurnace.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiBigFurnace.java @@ -1,67 +1,65 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityBigFurnace; import minefantasy.mf2.container.ContainerBigFurnace; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.EntityPlayer; +import org.lwjgl.opengl.GL11; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class GuiBigFurnace extends GuiContainer { - private TileEntityBigFurnace smelter; + private TileEntityBigFurnace smelter; - public GuiBigFurnace(EntityPlayer play, TileEntityBigFurnace tile) { - super(new ContainerBigFurnace(play, tile)); - smelter = tile; - } + public GuiBigFurnace(EntityPlayer play, TileEntityBigFurnace tile) { + super(new ContainerBigFurnace(play, tile)); + smelter = tile; + } - protected void drawGuiContainerForegroundLayer(int x, int y) { - } + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - if (smelter.isHeater()) { - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/furnace_heater.png")); - } else { - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/furnace_top.png")); - } - int posX = (width - xSize) / 2; - int posY = (height - ySize) / 2; + protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + if (smelter.isHeater()) { + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/furnace_heater.png")); + } else { + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/furnace_top.png")); + } + int posX = (width - xSize) / 2; + int posY = (height - ySize) / 2; - drawTexturedModalRect(posX, posY, 0, 0, xSize, ySize); + drawTexturedModalRect(posX, posY, 0, 0, xSize, ySize); - if (this.smelter.isBurning()) { - if (smelter.isHeater()) { - // FUEL - int fuelSc = this.smelter.getBurnTimeRemainingScaled(12); - if (smelter.fuel > 0) - this.drawTexturedModalRect(posX + 59, posY + 27 + 12 - fuelSc, 176, 12 - fuelSc, 14, fuelSc + 2); + if (this.smelter.isBurning()) { + if (smelter.isHeater()) { + // FUEL + int fuelSc = this.smelter.getBurnTimeRemainingScaled(12); + if (smelter.fuel > 0) + this.drawTexturedModalRect(posX + 59, posY + 27 + 12 - fuelSc, 176, 12 - fuelSc, 14, fuelSc + 2); - // HEATMAX - int heatScM = this.smelter.getItemHeatScaled(68); - this.drawTexturedModalRect(posX + 104, posY + 76 - heatScM, 176, 14, 16, 3); + // HEATMAX + int heatScM = this.smelter.getItemHeatScaled(68); + this.drawTexturedModalRect(posX + 104, posY + 76 - heatScM, 176, 14, 16, 3); - // HEAT - int heatSc = this.smelter.getHeatScaled(68); - this.drawTexturedModalRect(posX + 107, posY + 76 - heatSc, 176, 17, 10, 5); - } else { - if (smelter.progress > 0) { - int prog = smelter.getCookProgressScaled(24); - drawTexturedModalRect(posX + 76, posY + 34, 176, 0, prog + 1, 16); - } - } - } - } + // HEAT + int heatSc = this.smelter.getHeatScaled(68); + this.drawTexturedModalRect(posX + 107, posY + 76 - heatSc, 176, 17, 10, 5); + } else { + if (smelter.progress > 0) { + int prog = smelter.getCookProgressScaled(24); + drawTexturedModalRect(posX + 76, posY + 34, 176, 0, prog + 1, 16); + } + } + } + } - private void bindTexture(String image) { - this.mc.renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } + private void bindTexture(String image) { + this.mc.renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiBlastChamber.java b/src/main/java/minefantasy/mf2/client/gui/GuiBlastChamber.java index 4a74c0a2..dd061c21 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiBlastChamber.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiBlastChamber.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -9,36 +7,37 @@ import minefantasy.mf2.container.ContainerBlastChamber; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiBlastChamber extends GuiContainer { - private TileEntityBlastFC tile; + private TileEntityBlastFC tile; - public GuiBlastChamber(InventoryPlayer user, TileEntityBlastFC tile) { - super(new ContainerBlastChamber(user, tile)); - this.ySize = 208; - this.tile = tile; - } + public GuiBlastChamber(InventoryPlayer user, TileEntityBlastFC tile) { + super(new ContainerBlastChamber(user, tile)); + this.ySize = 208; + this.tile = tile; + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/blast_chamber.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/blast_chamber.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiBlastHeater.java b/src/main/java/minefantasy/mf2/client/gui/GuiBlastHeater.java index b5a48d60..2073534f 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiBlastHeater.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiBlastHeater.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -9,41 +7,42 @@ import minefantasy.mf2.container.ContainerBlastHeater; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiBlastHeater extends GuiContainer { - private TileEntityBlastFH tile; - - public GuiBlastHeater(InventoryPlayer user, TileEntityBlastFH tile) { - super(new ContainerBlastHeater(user, tile)); - this.ySize = 208; - this.tile = tile; - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/blast_heater.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - - if (this.tile.isBurning()) { - int i1 = this.tile.getBurnTimeRemainingScaled(13); - this.drawTexturedModalRect(xPoint + 82, yPoint + 42 + 12 - i1, 243, 12 - i1, 14, i1 + 1); - } - } - - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + private TileEntityBlastFH tile; + + public GuiBlastHeater(InventoryPlayer user, TileEntityBlastFH tile) { + super(new ContainerBlastHeater(user, tile)); + this.ySize = 208; + this.tile = tile; + } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/blast_heater.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + + if (this.tile.isBurning()) { + int i1 = this.tile.getBurnTimeRemainingScaled(13); + this.drawTexturedModalRect(xPoint + 82, yPoint + 42 + 12 - i1, 243, 12 - i1, 14, i1 + 1); + } + } + + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiBloomery.java b/src/main/java/minefantasy/mf2/client/gui/GuiBloomery.java index 3ead4fcd..0b847742 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiBloomery.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiBloomery.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -9,36 +7,37 @@ import minefantasy.mf2.container.ContainerBloomery; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiBloomery extends GuiContainer { - private TileEntityBloomery tile; + private TileEntityBloomery tile; - public GuiBloomery(InventoryPlayer user, TileEntityBloomery tile) { - super(new ContainerBloomery(user, tile)); - this.ySize = 208; - this.tile = tile; - } + public GuiBloomery(InventoryPlayer user, TileEntityBloomery tile) { + super(new ContainerBloomery(user, tile)); + this.ySize = 208; + this.tile = tile; + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/bloomery.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/bloomery.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiBombBench.java b/src/main/java/minefantasy/mf2/client/gui/GuiBombBench.java index 49effec6..8ce5cde2 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiBombBench.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiBombBench.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -10,41 +8,42 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiBombBench extends GuiContainer { - private TileEntityBombBench tile; - - public GuiBombBench(InventoryPlayer user, TileEntityBombBench tile) { - super(new ContainerBombBench(user, tile)); - this.ySize = 208; - this.tile = tile; - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - String s = StatCollector.translateToLocal("tile.bombBench.name"); - // this.fontRendererObj.drawString(s, 10, 6, 0); - - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/bombCraft.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } - - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + private TileEntityBombBench tile; + + public GuiBombBench(InventoryPlayer user, TileEntityBombBench tile) { + super(new ContainerBombBench(user, tile)); + this.ySize = 208; + this.tile = tile; + } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + String s = StatCollector.translateToLocal("tile.bombBench.name"); + // this.fontRendererObj.drawString(s, 10, 6, 0); + + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/bombCraft.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } + + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiCarpenterMF.java b/src/main/java/minefantasy/mf2/client/gui/GuiCarpenterMF.java index be80e609..03482f65 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiCarpenterMF.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiCarpenterMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -14,101 +12,102 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiCarpenterMF extends GuiContainer { - private TileEntityCarpenterMF tile; - private int regularXSize = 176; + private TileEntityCarpenterMF tile; + private int regularXSize = 176; - public GuiCarpenterMF(InventoryPlayer user, TileEntityCarpenterMF tile) { - super(new ContainerCarpenterMF(user, tile)); - this.xSize = 195; - this.ySize = 240; - this.tile = tile; - } + public GuiCarpenterMF(InventoryPlayer user, TileEntityCarpenterMF tile) { + super(new ContainerCarpenterMF(user, tile)); + this.xSize = 195; + this.ySize = 240; + this.tile = tile; + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - boolean knowsCraft = tile.doesPlayerKnowCraft(mc.thePlayer); - String s = MineFantasyII.isDebug() ? "Carpenter Bench Crafting" - : knowsCraft ? StatCollector.translateToLocal(tile.getResultName()) : "????"; - this.fontRendererObj.drawString(s, 10, 8, 0); + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + boolean knowsCraft = tile.doesPlayerKnowCraft(mc.thePlayer); + String s = MineFantasyII.isDebug() ? "Carpenter Bench Crafting" + : knowsCraft ? StatCollector.translateToLocal(tile.getResultName()) : "????"; + this.fontRendererObj.drawString(s, 10, 8, 0); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; - if (knowsCraft && !tile.resName.equalsIgnoreCase("")) { - if (tile.getToolNeeded() != null) { - if (x < xPoint && x > xPoint - 20 && y < yPoint + 20 && y > yPoint) { - String s2 = StatCollector.translateToLocal("tooltype." + tile.getToolNeeded()) + ", " - + (tile.getToolTierNeeded() > -1 - ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " - + tile.getToolTierNeeded() - : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); - this.fontRendererObj.drawStringWithShadow(s2, -18, -12, - isToolSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); - } - } - if (x < xPoint + regularXSize + 20 && x > xPoint + regularXSize && y < yPoint + 20 && y > yPoint) { - String s2 = StatCollector.translateToLocal("tooltype.carpenter") + ", " - + (tile.getCarpenterTierNeeded() > -1 - ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " - + tile.getCarpenterTierNeeded() - : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); - this.fontRendererObj.drawStringWithShadow(s2, regularXSize - fontRendererObj.getStringWidth(s2) + 18, - -12, 16777215); - } - } - } + if (knowsCraft && !tile.resName.equalsIgnoreCase("")) { + if (tile.getToolNeeded() != null) { + if (x < xPoint && x > xPoint - 20 && y < yPoint + 20 && y > yPoint) { + String s2 = StatCollector.translateToLocal("tooltype." + tile.getToolNeeded()) + ", " + + (tile.getToolTierNeeded() > -1 + ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + + tile.getToolTierNeeded() + : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); + this.fontRendererObj.drawStringWithShadow(s2, -18, -12, + isToolSufficient() ? 16777215 : GuiHelper.getColourForRGB(150, 0, 0)); + } + } + if (x < xPoint + regularXSize + 20 && x > xPoint + regularXSize && y < yPoint + 20 && y > yPoint) { + String s2 = StatCollector.translateToLocal("tooltype.carpenter") + ", " + + (tile.getCarpenterTierNeeded() > -1 + ? StatCollector.translateToLocal("attribute.mfcrafttier.name") + " " + + tile.getCarpenterTierNeeded() + : StatCollector.translateToLocal("attribute.nomfcrafttier.name")); + this.fontRendererObj.drawStringWithShadow(s2, regularXSize - fontRendererObj.getStringWidth(s2) + 18, + -12, 16777215); + } + } + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/carpenter.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/carpenter.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - if (tile.progressMax > 0 && tile.progress > 0) { - int progressWidth = (int) (160F / tile.progressMax * tile.progress); - this.drawTexturedModalRect(xPoint + 8, yPoint + 21, 0, 240, progressWidth, 3); - } - if (tile.doesPlayerKnowCraft(mc.thePlayer) && !tile.resName.equalsIgnoreCase("")) { - GuiHelper.renderToolIcon(this, "carpenter", tile.getCarpenterTierNeeded(), xPoint + regularXSize, yPoint, - true); + if (tile.progressMax > 0 && tile.progress > 0) { + int progressWidth = (int) (160F / tile.progressMax * tile.progress); + this.drawTexturedModalRect(xPoint + 8, yPoint + 21, 0, 240, progressWidth, 3); + } + if (tile.doesPlayerKnowCraft(mc.thePlayer) && !tile.resName.equalsIgnoreCase("")) { + GuiHelper.renderToolIcon(this, "carpenter", tile.getCarpenterTierNeeded(), xPoint + regularXSize, yPoint, + true); - if (tile.getToolNeeded() != null) { - GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPoint - 20, yPoint, - isToolSufficient()); - } - } - } + if (tile.getToolNeeded() != null) { + GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPoint - 20, yPoint, + isToolSufficient()); + } + } + } - private boolean isToolSufficient() { - if (mc.thePlayer != null) { - return ToolHelper.isToolSufficient(mc.thePlayer.getHeldItem(), tile.getToolNeeded(), - tile.getToolTierNeeded()); - } - return false; - } + private boolean isToolSufficient() { + if (mc.thePlayer != null) { + return ToolHelper.isToolSufficient(mc.thePlayer.getHeldItem(), tile.getToolNeeded(), + tile.getToolTierNeeded()); + } + return false; + } - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } - private void renderItem(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { - itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); - itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); - } + private void renderItem(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, x, y); + } - private void renderItemName(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { - if (this.func_146978_c(x - guiLeft, y - guiTop, 16, 16, mouseX, mouseY)) { - this.renderToolTip(itemstack, mouseX, mouseY); - } - } + private void renderItemName(ItemStack itemstack, int x, int y, int mouseX, int mouseY) { + if (this.func_146978_c(x - guiLeft, y - guiTop, 16, 16, mouseX, mouseY)) { + this.renderToolTip(itemstack, mouseX, mouseY); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiCrossbowBench.java b/src/main/java/minefantasy/mf2/client/gui/GuiCrossbowBench.java index 2d11e1a3..c030e581 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiCrossbowBench.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -10,41 +8,42 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiCrossbowBench extends GuiContainer { - private TileEntityCrossbowBench tile; - - public GuiCrossbowBench(InventoryPlayer user, TileEntityCrossbowBench tile) { - super(new ContainerCrossbowBench(user, tile)); - this.ySize = 208; - this.tile = tile; - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - String s = StatCollector.translateToLocal("tile.crossbowBench.name"); - // this.fontRendererObj.drawString(s, 10, 6, 0); - - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/crossbowCraft.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } - - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + private TileEntityCrossbowBench tile; + + public GuiCrossbowBench(InventoryPlayer user, TileEntityCrossbowBench tile) { + super(new ContainerCrossbowBench(user, tile)); + this.ySize = 208; + this.tile = tile; + } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + String s = StatCollector.translateToLocal("tile.crossbowBench.name"); + // this.fontRendererObj.drawString(s, 10, 6, 0); + + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/crossbowCraft.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } + + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiCrucible.java b/src/main/java/minefantasy/mf2/client/gui/GuiCrucible.java index 59ea314f..7254f971 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiCrucible.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiCrucible.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -11,60 +9,61 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemBlock; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiCrucible extends GuiContainer { - private TileEntityCrucible tile; + private TileEntityCrucible tile; - public GuiCrucible(InventoryPlayer user, TileEntityCrucible tile) { - super(new ContainerCrucible(user, tile)); - this.ySize = 186; - this.tile = tile; - } + public GuiCrucible(InventoryPlayer user, TileEntityCrucible tile) { + super(new ContainerCrucible(user, tile)); + this.ySize = 186; + this.tile = tile; + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource(getTex())); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource(getTex())); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - if (tile.getStackInSlot(tile.getSizeInventory() - 1) != null - && !(tile.getStackInSlot(tile.getSizeInventory() - 1).getItem() instanceof ItemBlock) - && ConfigHardcore.HCCreduceIngots && !tile.isAuto()) { - this.drawTexturedModalRect(xPoint + 128, yPoint + 31, 225, 2, 18, 18); - } + if (tile.getStackInSlot(tile.getSizeInventory() - 1) != null + && !(tile.getStackInSlot(tile.getSizeInventory() - 1).getItem() instanceof ItemBlock) + && ConfigHardcore.HCCreduceIngots && !tile.isAuto()) { + this.drawTexturedModalRect(xPoint + 128, yPoint + 31, 225, 2, 18, 18); + } - if (this.tile.temperature > 0) { - this.drawTexturedModalRect(xPoint + 81, yPoint + 75, 243, 0, 14, 12); - } - if (this.tile.progress > 0 && tile.progressMax > 0) { - int value = (int) (54F / tile.progressMax * tile.progress); - this.drawTexturedModalRect(xPoint + 61, yPoint + 70, 189, 0, value, 2); - } - } + if (this.tile.temperature > 0) { + this.drawTexturedModalRect(xPoint + 81, yPoint + 75, 243, 0, 14, 12); + } + if (this.tile.progress > 0 && tile.progressMax > 0) { + int value = (int) (54F / tile.progressMax * tile.progress); + this.drawTexturedModalRect(xPoint + 61, yPoint + 70, 189, 0, value, 2); + } + } - private String getTex() { - if (tile.getTier() == 1) { - return "textures/gui/crucible_advanced.png"; - } - if (tile.getTier() >= 2) { - return "textures/gui/crucible_mythic.png"; - } - return "textures/gui/crucible.png"; - } + private String getTex() { + if (tile.getTier() == 1) { + return "textures/gui/crucible_advanced.png"; + } + if (tile.getTier() >= 2) { + return "textures/gui/crucible_mythic.png"; + } + return "textures/gui/crucible.png"; + } - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiDiscovery.java b/src/main/java/minefantasy/mf2/client/gui/GuiDiscovery.java index aff0a469..12adbef9 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiDiscovery.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiDiscovery.java @@ -1,8 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.knowledge.InformationBase; @@ -13,124 +10,126 @@ import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.resources.I18n; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; @SideOnly(Side.CLIENT) public class GuiDiscovery extends Gui { - private static final ResourceLocation field_146261_a = new ResourceLocation( - "textures/gui/achievement/achievement_background.png"); - private Minecraft field_146259_f; - private int field_146260_g; - private int field_146267_h; - private String field_146268_i; - private String field_146265_j; - private InformationBase field_146266_k; - private long field_146263_l; - private RenderItem field_146264_m; - private boolean field_146262_n; - - public GuiDiscovery(Minecraft p_i1063_1_) { - this.field_146259_f = p_i1063_1_; - this.field_146264_m = new RenderItem(); - } - - public void func_146256_a(InformationBase p_146256_1_) { - this.field_146268_i = I18n.format("knowledge.discover", new Object[0]); - this.field_146265_j = p_146256_1_.getDisplayName(); - this.field_146263_l = Minecraft.getSystemTime(); - this.field_146266_k = p_146256_1_; - this.field_146262_n = false; - } - - public void func_146255_b(InformationBase p_146255_1_) { - this.field_146268_i = p_146255_1_.getDisplayName(); - this.field_146265_j = p_146255_1_.getDescription(); - this.field_146263_l = Minecraft.getSystemTime() + 2500L; - this.field_146266_k = p_146255_1_; - this.field_146262_n = true; - } - - private void func_146258_c() { - GL11.glViewport(0, 0, this.field_146259_f.displayWidth, this.field_146259_f.displayHeight); - GL11.glMatrixMode(GL11.GL_PROJECTION); - GL11.glLoadIdentity(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glLoadIdentity(); - this.field_146260_g = this.field_146259_f.displayWidth; - this.field_146267_h = this.field_146259_f.displayHeight; - ScaledResolution scaledresolution = new ScaledResolution(this.field_146259_f, this.field_146259_f.displayWidth, - this.field_146259_f.displayHeight); - this.field_146260_g = scaledresolution.getScaledWidth(); - this.field_146267_h = scaledresolution.getScaledHeight(); - GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); - GL11.glMatrixMode(GL11.GL_PROJECTION); - GL11.glLoadIdentity(); - GL11.glOrtho(0.0D, this.field_146260_g, this.field_146267_h, 0.0D, 1000.0D, 3000.0D); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glLoadIdentity(); - GL11.glTranslatef(0.0F, 0.0F, -2000.0F); - } - - public void func_146254_a() { - if (this.field_146266_k != null && this.field_146263_l != 0L && Minecraft.getMinecraft().thePlayer != null) { - double d0 = (Minecraft.getSystemTime() - this.field_146263_l) / 3000.0D; - - if (!this.field_146262_n) { - if (d0 < 0.0D || d0 > 1.0D) { - this.field_146263_l = 0L; - return; - } - } else if (d0 > 0.5D) { - d0 = 0.5D; - } - - this.func_146258_c(); - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glDepthMask(false); - double d1 = d0 * 2.0D; - - if (d1 > 1.0D) { - d1 = 2.0D - d1; - } - - d1 *= 4.0D; - d1 = 1.0D - d1; - - if (d1 < 0.0D) { - d1 = 0.0D; - } - - d1 *= d1; - d1 *= d1; - int i = this.field_146260_g - 160; - int j = 0 - (int) (d1 * 36.0D); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glEnable(GL11.GL_TEXTURE_2D); - this.field_146259_f.getTextureManager().bindTexture(field_146261_a); - GL11.glDisable(GL11.GL_LIGHTING); - this.drawTexturedModalRect(i, j, 96, 202, 160, 32); - - if (this.field_146262_n) { - this.field_146259_f.fontRenderer.drawSplitString(this.field_146265_j, i + 30, j + 7, 120, -1); - } else { - this.field_146259_f.fontRenderer.drawString(this.field_146268_i, i + 30, j + 7, -256); - this.field_146259_f.fontRenderer.drawString(this.field_146265_j, i + 30, j + 18, -1); - } - - RenderHelper.enableGUIStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_COLOR_MATERIAL); - GL11.glEnable(GL11.GL_LIGHTING); - this.field_146264_m.renderItemAndEffectIntoGUI(this.field_146259_f.fontRenderer, - this.field_146259_f.getTextureManager(), this.field_146266_k.theItemStack, i + 8, j + 8); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDepthMask(true); - GL11.glEnable(GL11.GL_DEPTH_TEST); - } - } - - public void func_146257_b() { - this.field_146266_k = null; - this.field_146263_l = 0L; - } + private static final ResourceLocation field_146261_a = new ResourceLocation( + "textures/gui/achievement/achievement_background.png"); + private Minecraft field_146259_f; + private int field_146260_g; + private int field_146267_h; + private String field_146268_i; + private String field_146265_j; + private InformationBase field_146266_k; + private long field_146263_l; + private RenderItem field_146264_m; + private boolean field_146262_n; + + public GuiDiscovery(Minecraft p_i1063_1_) { + this.field_146259_f = p_i1063_1_; + this.field_146264_m = new RenderItem(); + } + + public void func_146256_a(InformationBase p_146256_1_) { + this.field_146268_i = I18n.format("knowledge.discover", new Object[0]); + this.field_146265_j = p_146256_1_.getDisplayName(); + this.field_146263_l = Minecraft.getSystemTime(); + this.field_146266_k = p_146256_1_; + this.field_146262_n = false; + } + + public void func_146255_b(InformationBase p_146255_1_) { + this.field_146268_i = p_146255_1_.getDisplayName(); + this.field_146265_j = p_146255_1_.getDescription(); + this.field_146263_l = Minecraft.getSystemTime() + 2500L; + this.field_146266_k = p_146255_1_; + this.field_146262_n = true; + } + + private void func_146258_c() { + GL11.glViewport(0, 0, this.field_146259_f.displayWidth, this.field_146259_f.displayHeight); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + this.field_146260_g = this.field_146259_f.displayWidth; + this.field_146267_h = this.field_146259_f.displayHeight; + ScaledResolution scaledresolution = new ScaledResolution(this.field_146259_f, this.field_146259_f.displayWidth, + this.field_146259_f.displayHeight); + this.field_146260_g = scaledresolution.getScaledWidth(); + this.field_146267_h = scaledresolution.getScaledHeight(); + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, this.field_146260_g, this.field_146267_h, 0.0D, 1000.0D, 3000.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -2000.0F); + } + + public void func_146254_a() { + if (this.field_146266_k != null && this.field_146263_l != 0L && Minecraft.getMinecraft().thePlayer != null) { + double d0 = (Minecraft.getSystemTime() - this.field_146263_l) / 3000.0D; + + if (!this.field_146262_n) { + if (d0 < 0.0D || d0 > 1.0D) { + this.field_146263_l = 0L; + return; + } + } else if (d0 > 0.5D) { + d0 = 0.5D; + } + + this.func_146258_c(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDepthMask(false); + double d1 = d0 * 2.0D; + + if (d1 > 1.0D) { + d1 = 2.0D - d1; + } + + d1 *= 4.0D; + d1 = 1.0D - d1; + + if (d1 < 0.0D) { + d1 = 0.0D; + } + + d1 *= d1; + d1 *= d1; + int i = this.field_146260_g - 160; + int j = 0 - (int) (d1 * 36.0D); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glEnable(GL11.GL_TEXTURE_2D); + this.field_146259_f.getTextureManager().bindTexture(field_146261_a); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawTexturedModalRect(i, j, 96, 202, 160, 32); + + if (this.field_146262_n) { + this.field_146259_f.fontRenderer.drawSplitString(this.field_146265_j, i + 30, j + 7, 120, -1); + } else { + this.field_146259_f.fontRenderer.drawString(this.field_146268_i, i + 30, j + 7, -256); + this.field_146259_f.fontRenderer.drawString(this.field_146265_j, i + 30, j + 18, -1); + } + + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glEnable(GL11.GL_LIGHTING); + this.field_146264_m.renderItemAndEffectIntoGUI(this.field_146259_f.fontRenderer, + this.field_146259_f.getTextureManager(), this.field_146266_k.theItemStack, i + 8, j + 8); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + } + + public void func_146257_b() { + this.field_146266_k = null; + this.field_146263_l = 0L; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiForge.java b/src/main/java/minefantasy/mf2/client/gui/GuiForge.java index a4343afe..c3af1b69 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiForge.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiForge.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -9,55 +7,56 @@ import minefantasy.mf2.container.ContainerForge; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiForge extends GuiContainer { - private TileEntityForge tile; - - public GuiForge(InventoryPlayer user, TileEntityForge tile) { - super(new ContainerForge(user, tile)); - this.ySize = 175; - this.tile = tile; - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource(getTex())); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - - if (this.tile.fuel > 0 && tile.maxFuel > 0) { - int scale = tile.getMetreScale(12); - this.drawTexturedModalRect(xPoint + 33, yPoint + 63 + 11 - scale, 176, 11 - scale + 8, 14, scale + 1); - } - int[] scale = tile.getTempsScaled(53); - - if (this.tile.temperature > 0) { - if (this.tile.isLit) { - int heatScM = scale[1]; - this.drawTexturedModalRect(xPoint + 32, yPoint + 58 - heatScM, 176, 0, 16, 3); - } - int heatSc = scale[0]; - this.drawTexturedModalRect(xPoint + 35, yPoint + 58 - heatSc, 176, 3, 10, 5); - } - } - - private String getTex() { - return "textures/gui/" + tile.getTextureName() + ".png"; - } - - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + private TileEntityForge tile; + + public GuiForge(InventoryPlayer user, TileEntityForge tile) { + super(new ContainerForge(user, tile)); + this.ySize = 175; + this.tile = tile; + } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource(getTex())); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + + if (this.tile.fuel > 0 && tile.maxFuel > 0) { + int scale = tile.getMetreScale(12); + this.drawTexturedModalRect(xPoint + 33, yPoint + 63 + 11 - scale, 176, 11 - scale + 8, 14, scale + 1); + } + int[] scale = tile.getTempsScaled(53); + + if (this.tile.temperature > 0) { + if (this.tile.isLit) { + int heatScM = scale[1]; + this.drawTexturedModalRect(xPoint + 32, yPoint + 58 - heatScM, 176, 0, 16, 3); + } + int heatSc = scale[0]; + this.drawTexturedModalRect(xPoint + 35, yPoint + 58 - heatSc, 176, 3, 10, 5); + } + } + + private String getTex() { + return "textures/gui/" + tile.getTextureName() + ".png"; + } + + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiKnowledge.java b/src/main/java/minefantasy/mf2/client/gui/GuiKnowledge.java index a7bf5a7f..fe805419 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiKnowledge.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiKnowledge.java @@ -1,13 +1,5 @@ package minefantasy.mf2.client.gui; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; - -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -31,647 +23,649 @@ import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StatCollector; +import net.minecraft.util.*; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.util.LinkedList; +import java.util.List; +import java.util.Random; @SideOnly(Side.CLIENT) public class GuiKnowledge extends GuiScreen { - int offsetByX = 70; - int offsetByY = 0; - public int buyWidth = 225; - public int buyHeight = 72; - private RenderItem itemrender = new RenderItem(); - private InformationBase selected = null; - private InformationBase highlighted = null; - private static final int field_146572_y = InformationList.minDisplayColumn * 24 - 112; - private static final int field_146571_z = InformationList.minDisplayRow * 24 - 112; - private static final int field_146559_A = InformationList.maxDisplayColumn * 24 - 77; - private static final int field_146560_B = InformationList.maxDisplayRow * 24 - 77; - private static final ResourceLocation screenTex = new ResourceLocation( - "minefantasy2:textures/gui/knowledge/knowledge.png"); - private static final ResourceLocation buyTex = new ResourceLocation( - "minefantasy2:textures/gui/knowledge/purchase.png"); - private static final ResourceLocation skillTex = new ResourceLocation( - "minefantasy2:textures/gui/knowledge/skilllist.png"); - protected static int field_146555_f = 256; - protected static int field_146557_g = 202; - protected static int field_146563_h; - protected static int field_146564_i; - protected static float field_146570_r = 1.0F; - protected static double field_146569_s; - protected static double field_146568_t; - protected static double field_146567_u; - protected static double field_146566_v; - protected static double field_146565_w; - protected static double field_146573_x; - private static int field_146554_D; - private static boolean allDiscovered = true; - - private static int currentPage = -1; - private GuiButton button; - private LinkedList informationList = new LinkedList(); - private EntityPlayer player; - private boolean hasScroll = false; - private boolean canPurchase = false; - - public GuiKnowledge(EntityPlayer user) { - this.player = user; - short short1 = 141; - short short2 = 141; - GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u = GuiKnowledge.field_146565_w = KnowledgeListMF.gettingStarted.displayColumn - * 24 - short1 / 2 - 12; - GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v = GuiKnowledge.field_146573_x = KnowledgeListMF.gettingStarted.displayRow - * 24 - short2 / 2; - informationList.clear(); - for (Object achievement : InformationList.knowledgeList) { - if (!InformationPage.isInfoInPages((InformationBase) achievement)) { - informationList.add((InformationBase) achievement); - } - } - for (Object base : InformationList.knowledgeList.toArray()) { - if (!ResearchLogic.hasInfoUnlocked(user, (InformationBase) base)) { - allDiscovered = false; - break; - } - } - } - - /** - * Adds the buttons (and other controls) to the screen in question. - */ - @Override - public void initGui() { - int i1 = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; - int j1 = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; - - this.buttonList.clear(); - this.buttonList.add(new GuiOptionButton(1, this.width / 2 + 24, this.height / 2 + 101, 80, 20, - I18n.format("gui.done", new Object[0]))); - this.buttonList.add(button = new GuiButton(2, (width - field_146555_f) / 2 + 24, height / 2 + 101, 125, 20, - InformationPage.getTitle(currentPage))); - - int purchasex = i1 + (field_146555_f - buyWidth) / 2; - int purchasey = j1 + (field_146557_g - buyHeight) / 2; - // PURCHASE SCREEN - this.buttonList.add(new GuiOptionButton(3, purchasex + 19, purchasey + 47, 80, 20, - I18n.format("gui.purchase", new Object[0]))); - this.buttonList.add(new GuiOptionButton(4, purchasex + 125, purchasey + 47, 80, 20, - I18n.format("gui.cancel", new Object[0]))); - } - - @Override - protected void mouseClicked(int x, int y, int button) { - if (selected == null && button == 0 && highlighted != null) { - if (ResearchLogic.hasInfoUnlocked(player, highlighted) && !highlighted.getPages().isEmpty()) { - player.openGui(MineFantasyII.instance, 1, player.worldObj, 0, highlighted.ID, 0); - } else if (highlighted.isEasy() && ResearchLogic.canPurchase(player, highlighted)) { - selected = highlighted; - setPurchaseAvailable(player); - } - } - super.mouseClicked(x, y, button); - } - - @Override - protected void actionPerformed(GuiButton p_146284_1_) { - if (p_146284_1_.id == 1) { - this.mc.displayGuiScreen((GuiScreen) null); - } - - if (selected == null && p_146284_1_.id == 2) { - currentPage++; - - if (currentPage >= InformationPage.getInfoPages().size()) { - currentPage = -1; - } - button.displayString = InformationPage.getTitle(currentPage); - } - - if (p_146284_1_.id == 3 && selected != null) { - ((EntityClientPlayerMP) player).sendQueue - .addToSendQueue(new ResearchRequest(player, selected.ID).generatePacket()); - selected = null; - } - if (p_146284_1_.id == 4 && selected != null) { - selected = null; - } - } - - /** - * Fired when a key is typed. This is the equivalent of - * KeyListener.keyTyped(KeyEvent e). - */ - @Override - protected void keyTyped(char p_73869_1_, int p_73869_2_) { - if (p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) { - this.mc.displayGuiScreen((GuiScreen) null); - this.mc.setIngameFocus(); - } else { - super.keyTyped(p_73869_1_, p_73869_2_); - } - } - - /** - * Draws the screen and all the components in it. - */ - @Override - public void drawScreen(int mx, int my, float f) { - { - int k; - - if (selected == null && Mouse.isButtonDown(0)) { - k = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; - int l = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; - int i1 = k + 8; - int j1 = l + 17; - - if ((GuiKnowledge.field_146554_D == 0 || GuiKnowledge.field_146554_D == 1) && mx >= i1 && mx < i1 + 224 - && my >= j1 && my < j1 + 155) { - if (GuiKnowledge.field_146554_D == 0) { - GuiKnowledge.field_146554_D = 1; - } else { - GuiKnowledge.field_146567_u -= (mx - GuiKnowledge.field_146563_h) * GuiKnowledge.field_146570_r; - GuiKnowledge.field_146566_v -= (my - GuiKnowledge.field_146564_i) * GuiKnowledge.field_146570_r; - GuiKnowledge.field_146565_w = GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; - GuiKnowledge.field_146573_x = GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; - } - - GuiKnowledge.field_146563_h = mx; - GuiKnowledge.field_146564_i = my; - } - } else { - GuiKnowledge.field_146554_D = 0; - } - - k = Mouse.getDWheel(); - float f4 = GuiKnowledge.field_146570_r; - - if (k < 0) { - GuiKnowledge.field_146570_r += 0.25F; - } else if (k > 0) { - GuiKnowledge.field_146570_r -= 0.25F; - } - - GuiKnowledge.field_146570_r = MathHelper.clamp_float(GuiKnowledge.field_146570_r, 1.0F, 3.0F); - - if (GuiKnowledge.field_146570_r != f4) { - float f6 = f4 - GuiKnowledge.field_146570_r; - float f5 = f4 * GuiKnowledge.field_146555_f; - float f1 = f4 * GuiKnowledge.field_146557_g; - float f2 = GuiKnowledge.field_146570_r * GuiKnowledge.field_146555_f; - float f3 = GuiKnowledge.field_146570_r * GuiKnowledge.field_146557_g; - GuiKnowledge.field_146567_u -= (f2 - f5) * 0.5F; - GuiKnowledge.field_146566_v -= (f3 - f1) * 0.5F; - GuiKnowledge.field_146565_w = GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; - GuiKnowledge.field_146573_x = GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; - } - - if (GuiKnowledge.field_146565_w < field_146572_y) { - GuiKnowledge.field_146565_w = field_146572_y; - } - - if (GuiKnowledge.field_146573_x < field_146571_z) { - GuiKnowledge.field_146573_x = field_146571_z; - } - - if (GuiKnowledge.field_146565_w >= field_146559_A) { - GuiKnowledge.field_146565_w = field_146559_A - 1; - } - - if (GuiKnowledge.field_146573_x >= field_146560_B) { - GuiKnowledge.field_146573_x = field_146560_B - 1; - } - - this.drawDefaultBackground(); - this.renderMainPage(mx, my, f); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_DEPTH_TEST); - this.drawOverlay(); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_DEPTH_TEST); - } - if (buttonList.get(2) != null) { - ((GuiButton) buttonList.get(2)).visible = selected != null; - ((GuiButton) buttonList.get(2)).enabled = selected != null && canPurchase; - ((GuiButton) buttonList.get(3)).visible = selected != null; - } - } - - /** - * Called from the main game loop to update the screen. - */ - @Override - public void updateScreen() { - { - GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; - GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; - double d0 = GuiKnowledge.field_146565_w - GuiKnowledge.field_146567_u; - double d1 = GuiKnowledge.field_146573_x - GuiKnowledge.field_146566_v; - - if (d0 * d0 + d1 * d1 < 4.0D) { - GuiKnowledge.field_146567_u += d0; - GuiKnowledge.field_146566_v += d1; - } else { - GuiKnowledge.field_146567_u += d0 * 0.85D; - GuiKnowledge.field_146566_v += d1 * 0.85D; - } - } - } - - protected void drawOverlay() { - int i = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; - int j = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; - - this.fontRendererObj.drawString(I18n.format("gui.information", new Object[0]), i + 15, j + 5, 4210752); - } - - protected void renderMainPage(int mx, int my, float f) { - int k = MathHelper.floor_double( - GuiKnowledge.field_146569_s + (GuiKnowledge.field_146567_u - GuiKnowledge.field_146569_s) * f); - int l = MathHelper.floor_double( - GuiKnowledge.field_146568_t + (GuiKnowledge.field_146566_v - GuiKnowledge.field_146568_t) * f); - - if (k < field_146572_y) { - k = field_146572_y; - } - - if (l < field_146571_z) { - l = field_146571_z; - } - - if (k >= field_146559_A) { - k = field_146559_A - 1; - } - - if (l >= field_146560_B) { - l = field_146560_B - 1; - } - - int i1 = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; - int j1 = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; - int k1 = i1 + 16; - int l1 = j1 + 17; - this.zLevel = 0.0F; - GL11.glDepthFunc(GL11.GL_GEQUAL); - GL11.glPushMatrix(); - GL11.glTranslatef(k1, l1, -200.0F); - GL11.glScalef(1.0F / GuiKnowledge.field_146570_r, 1.0F / GuiKnowledge.field_146570_r, 0.0F); - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_COLOR_MATERIAL); - - int i2 = k + 288 >> 4; - int j2 = l + 288 >> 4; - int k2 = (k + 288) % 16; - int l2 = (l + 288) % 16; - boolean flag = true; - boolean flag1 = true; - boolean flag2 = true; - boolean flag3 = true; - boolean flag4 = true; - Random random = new Random(); - float f1 = 16.0F / GuiKnowledge.field_146570_r; - float f2 = 16.0F / GuiKnowledge.field_146570_r; - int i3; - int j3; - int k3; - - for (i3 = 0; i3 * f1 - l2 < 155.0F; ++i3) { - float f3 = 0.6F - (j2 + i3) / 25.0F * 0.3F; - GL11.glColor4f(f3, f3, f3, 1.0F); - - for (j3 = 0; j3 * f2 - k2 < 224.0F; ++j3) { - IIcon iicon = Blocks.planks.getIcon(0, 0); - - this.mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture); - this.drawTexturedModelRectFromIcon(j3 * 16 - k2, i3 * 16 - l2, iicon, 16, 16); - } - } - - GL11.glEnable(GL11.GL_DEPTH_TEST); - GL11.glDepthFunc(GL11.GL_LEQUAL); - this.mc.getTextureManager().bindTexture(screenTex); - int researchVisibility; - int j4; - int l4; - - List achievementList = (currentPage == -1 ? informationList - : InformationPage.getInfoPage(currentPage).getInfoList()); - for (i3 = 0; i3 < achievementList.size(); ++i3) { - InformationBase achievement1 = achievementList.get(i3); - - if (achievement1.parentInfo != null && achievementList.contains(achievement1.parentInfo)) { - j3 = achievement1.displayColumn * 24 - k + 11; - k3 = achievement1.displayRow * 24 - l + 11; - l4 = achievement1.parentInfo.displayColumn * 24 - k + 11; - int l3 = achievement1.parentInfo.displayRow * 24 - l + 11; - boolean flag5 = ResearchLogic.hasInfoUnlocked(player, achievement1); - boolean flag6 = ResearchLogic.canUnlockInfo(player, achievement1); - researchVisibility = ResearchLogic.func_150874_c(player, achievement1); - - if (researchVisibility <= getVisibleRange()[0]) { - j4 = -16777216; - - if (flag5) { - j4 = -6250336; - } else if (flag6) { - j4 = -16711936; - } - - this.drawHorizontalLine(j3, l4, k3, j4); - this.drawVerticalLine(l4, k3, l3, j4); - - if (j3 > l4) { - this.drawTexturedModalRect(j3 - 11 - 7, k3 - 5, 114, 234, 7, 11); - } else if (j3 < l4) { - this.drawTexturedModalRect(j3 + 11, k3 - 5, 107, 234, 7, 11); - } else if (k3 > l3) { - this.drawTexturedModalRect(j3 - 5, k3 - 11 - 7, 96, 234, 11, 7); - } else if (k3 < l3) { - this.drawTexturedModalRect(j3 - 5, k3 + 11, 96, 241, 11, 7); - } - } - } - } - - InformationBase achievement = null; - RenderItem renderitem = new RenderItem(); - float f4 = (mx - k1) * GuiKnowledge.field_146570_r; - float f5 = (my - l1) * GuiKnowledge.field_146570_r; - RenderHelper.enableGUIStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_COLOR_MATERIAL); - int i5; - int j5; - - for (l4 = 0; l4 < achievementList.size(); ++l4) { - InformationBase achievement2 = achievementList.get(l4); - i5 = achievement2.displayColumn * 24 - k; - j5 = achievement2.displayRow * 24 - l; - - if (i5 >= -24 && j5 >= -24 && i5 <= 224.0F * GuiKnowledge.field_146570_r - && j5 <= 155.0F * GuiKnowledge.field_146570_r) { - researchVisibility = ResearchLogic.func_150874_c(player, achievement2); - float f6; - - if (ResearchLogic.hasInfoUnlocked(player, achievement2)) { - f6 = 0.75F; - GL11.glColor4f(f6, f6, f6, 1.0F); - } else if (ResearchLogic.canUnlockInfo(player, achievement2)) { - f6 = 1.0F; - GL11.glColor4f(0.5F, 1.0F, 0.5F, 1.0F); - } else if (researchVisibility < getVisibleRange()[1]) { - f6 = 0.3F; - GL11.glColor4f(f6, f6, f6, 1.0F); - } else if (researchVisibility == getVisibleRange()[1]) { - f6 = 0.2F; - GL11.glColor4f(f6, f6, f6, 1.0F); - } else { - if (researchVisibility != getVisibleRange()[2]) { - continue; - } - - f6 = 0.1F; - GL11.glColor4f(f6, f6, f6, 1.0F); - } - - this.mc.getTextureManager().bindTexture(screenTex); - - GL11.glEnable(GL11.GL_BLEND);// Forge: Specifically enable blend because it is needed here. And we fix - // Generic RenderItem's leakage of it. - if (achievement2.getSpecial()) { - this.drawTexturedModalRect(i5 - 2, j5 - 2, 26, 202, 26, 26); - } else if (achievement2.getPerk()) { - this.drawTexturedModalRect(i5 - 2, j5 - 2, 52, 202, 26, 26); - } else { - this.drawTexturedModalRect(i5 - 2, j5 - 2, 0, 202, 26, 26); - } - GL11.glDisable(GL11.GL_BLEND); // Forge: Cleanup states we set. - - if (!ResearchLogic.canUnlockInfo(player, achievement2)) { - f6 = 0.1F; - GL11.glColor4f(f6, f6, f6, 1.0F); - renderitem.renderWithColor = false; - } - - GL11.glDisable(GL11.GL_LIGHTING); // Forge: Make sure Lighting is disabled. Fixes MC-33065 - GL11.glEnable(GL11.GL_CULL_FACE); - renderitem.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), - achievement2.theItemStack, i5 + 3, j5 + 3); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glDisable(GL11.GL_LIGHTING); - - if (!ResearchLogic.canUnlockInfo(player, achievement2)) { - renderitem.renderWithColor = true; - } - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - if (f4 >= i5 && f4 <= i5 + 22 && f5 >= j5 && f5 <= j5 + 22) { - achievement = achievement2; - } - } - } - - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glEnable(GL11.GL_BLEND); - GL11.glPopMatrix(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(screenTex); - this.drawTexturedModalRect(i1, j1, 0, 0, GuiKnowledge.field_146555_f, GuiKnowledge.field_146557_g); - - this.zLevel = 0.0F; - GL11.glDepthFunc(GL11.GL_LEQUAL); - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glEnable(GL11.GL_TEXTURE_2D); - - if (selected != null) { - int purchasex = i1 + (field_146555_f - buyWidth) / 2; - int purchasey = j1 + (field_146557_g - buyHeight) / 2; - renderPurchaseScreen(purchasex, purchasey, mx, my); - } - drawSkillList(); - super.drawScreen(mx, my, f); - - highlighted = achievement; - if (selected == null && achievement != null) { - String s1 = achievement.getDisplayName(); - String s2 = achievement.getDescription(); - i5 = mx + 12; - j5 = my - 4; - researchVisibility = ResearchLogic.func_150874_c(player, achievement); - - if (!ResearchLogic.canUnlockInfo(player, achievement)) { - String s; - int k4; - - if (researchVisibility == 3) { - s1 = I18n.format("achievement.unknown", new Object[0]); - j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); - s = (new ChatComponentTranslation("achievement.requires", - new Object[] { achievement.parentInfo.getDisplayName() })).getUnformattedText(); - k4 = this.fontRendererObj.splitStringWidth(s, j4); - this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k4 + 12 + 3, -1073741824, -1073741824); - this.fontRendererObj.drawSplitString(s, i5, j5 + 12, j4, -9416624); - } else if (researchVisibility < 3) { - j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); - s = (new ChatComponentTranslation("achievement.requires", - new Object[] { achievement.parentInfo.getDisplayName() })).getUnformattedText(); - k4 = this.fontRendererObj.splitStringWidth(s, j4); - this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k4 + 12 + 3, -1073741824, -1073741824); - this.fontRendererObj.drawSplitString(s, i5, j5 + 12, j4, -9416624); - } else { - s1 = null; - } - } else { - j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); - int k5 = this.fontRendererObj.splitStringWidth(s2, j4); - - if (ResearchLogic.hasInfoUnlocked(player, achievement) - || ResearchLogic.canUnlockInfo(player, achievement)) { - k5 += 12; - } - - this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k5 + 3 + 12, -1073741824, -1073741824); - this.fontRendererObj.drawSplitString(s2, i5, j5 + 12, j4, -6250336); - - if (ResearchLogic.hasInfoUnlocked(player, achievement)) { - this.fontRendererObj.drawStringWithShadow(I18n.format("information.discovered", new Object[0]), i5, - j5 + k5 + 4, -7302913); - } else if (InformationBase.easyResearch && ResearchLogic.canUnlockInfo(player, achievement)) { - this.fontRendererObj.drawStringWithShadow(StatCollector.translateToLocal("information.buy"), i5, - j5 + k5 + 4, -7302913); - } - } - - if (s1 != null) { - this.fontRendererObj.drawStringWithShadow(s1, i5, j5, - ResearchLogic.canUnlockInfo(player, achievement) ? (achievement.getSpecial() ? -128 : -1) - : (achievement.getSpecial() ? -8355776 : -8355712)); - } - } - - GL11.glEnable(GL11.GL_DEPTH_TEST); - GL11.glEnable(GL11.GL_LIGHTING); - RenderHelper.disableStandardItemLighting(); - } - - /** - * Returns true if this GUI should pause the game when it is displayed in - * single-player - */ - @Override - public boolean doesGuiPauseGame() { - return false; - } - - private int[] getVisibleRange() { - return new int[] { 1, 2, 3 }; - } - - private void renderPurchaseScreen(int x, int y, int mx, int my) { - if (selected != null) { - String[] requirements = selected.getRequiredSkills(); - int size = 0; - if (requirements != null) { - size = requirements.length; - } - this.mc.getTextureManager().bindTexture(buyTex); - this.drawTexturedModalRect(x, y, 0, 0, buyWidth, 27);// Top - for (int a = 0; a < size; a++) { - this.drawTexturedModalRect(x, y + 27 + (a * 19), 0, 27, buyWidth, 19);// Middle - } - this.drawTexturedModalRect(x, y + 27 + (size * 19), 0, 46, buyWidth, 26);// Bottom - - if (buttonList.get(2) != null && buttonList.get(3) != null) { - int j1 = (this.height - GuiKnowledge.field_146557_g) / 2; - int purchasey = j1 + (field_146557_g - buyHeight) / 2; - - int offset = -19; - if (requirements != null) { - offset += (19 * requirements.length); - } - ((GuiButton) buttonList.get(2)).yPosition = purchasey + 47 + offset; - ((GuiButton) buttonList.get(3)).yPosition = purchasey + 47 + offset; - } - int red = GuiHelper.getColourForRGB(220, 0, 0); - int white = 16777215; - mc.fontRenderer.drawString(selected.getDisplayName(), x + 22, y + 12, white, false); - - if (hasScroll) { - mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("knowledge.hasScroll"), x + 20, - y + 32, red); - } else { - for (int a = 0; a < requirements.length; a++) { - boolean isUnlocked = selected.isUnlocked(a, mc.thePlayer); - String text = requirements[a]; - mc.fontRenderer.drawStringWithShadow(text, x + 20, y + 32 + (a * 19), isUnlocked ? white : red); - } - } - } - GL11.glColor3f(255, 255, 255); - } - - private void setPurchaseAvailable(EntityPlayer user) { - if (selected != null) { - canPurchase = selected.hasSkillsUnlocked(user); - } else { - canPurchase = false; - } - } - - protected void drawSkillList() { - GL11.glPushMatrix(); - - int skillWidth = 143; - int skillHeight = 156; - int x = (this.width - GuiKnowledge.field_146555_f) / 2 - skillWidth + offsetByX; - int y = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; - this.mc.getTextureManager().bindTexture(skillTex); - - this.drawTexturedModalRect(x, y, 0, 0, skillWidth, skillHeight); - - drawSkill(x + 20, y + 20, SkillList.artisanry); - drawSkill(x + 20, y + 44, SkillList.construction); - drawSkill(x + 20, y + 68, SkillList.provisioning); - drawSkill(x + 20, y + 92, SkillList.engineering); - drawSkill(x + 20, y + 116, SkillList.combat); - - drawSkillName(x + 20, y + 20, SkillList.artisanry); - drawSkillName(x + 20, y + 44, SkillList.construction); - drawSkillName(x + 20, y + 68, SkillList.provisioning); - drawSkillName(x + 20, y + 92, SkillList.engineering); - drawSkillName(x + 20, y + 116, SkillList.combat); - - GL11.glPopMatrix(); - } - - protected void drawSkill(int x, int y, Skill skill) { - if (skill != null) { - int level = RPGElements.getLevel(mc.thePlayer, skill); - int xp = skill.getXP(player)[0]; - int max = skill.getXP(player)[1]; - if (xp > max) - xp = max; - - float scale = (float) xp / (float) max; - this.drawTexturedModalRect(x + 22, y + 13, 0, 156, (int) (78F * scale), 5); - - // mc.fontRenderer.drawString(skill.getDisplayName(), x+2, y+1, 0); - // mc.fontRenderer.drawString(""+level, x+1, y+10, 0); - } - } - - protected void drawSkillName(int x, int y, Skill skill) { - if (skill != null) { - int level = RPGElements.getLevel(mc.thePlayer, skill); - mc.fontRenderer.drawString(skill.getDisplayName(), x + 2, y + 1, 0); - mc.fontRenderer.drawString("" + level, x + 1, y + 10, 0); - } - } + private static final int field_146572_y = InformationList.minDisplayColumn * 24 - 112; + private static final int field_146571_z = InformationList.minDisplayRow * 24 - 112; + private static final int field_146559_A = InformationList.maxDisplayColumn * 24 - 77; + private static final int field_146560_B = InformationList.maxDisplayRow * 24 - 77; + private static final ResourceLocation screenTex = new ResourceLocation( + "minefantasy2:textures/gui/knowledge/knowledge.png"); + private static final ResourceLocation buyTex = new ResourceLocation( + "minefantasy2:textures/gui/knowledge/purchase.png"); + private static final ResourceLocation skillTex = new ResourceLocation( + "minefantasy2:textures/gui/knowledge/skilllist.png"); + protected static int field_146555_f = 256; + protected static int field_146557_g = 202; + protected static int field_146563_h; + protected static int field_146564_i; + protected static float field_146570_r = 1.0F; + protected static double field_146569_s; + protected static double field_146568_t; + protected static double field_146567_u; + protected static double field_146566_v; + protected static double field_146565_w; + protected static double field_146573_x; + private static int field_146554_D; + private static boolean allDiscovered = true; + private static int currentPage = -1; + public int buyWidth = 225; + public int buyHeight = 72; + int offsetByX = 70; + int offsetByY = 0; + private RenderItem itemrender = new RenderItem(); + private InformationBase selected = null; + private InformationBase highlighted = null; + private GuiButton button; + private LinkedList informationList = new LinkedList(); + private EntityPlayer player; + private boolean hasScroll = false; + private boolean canPurchase = false; + + public GuiKnowledge(EntityPlayer user) { + this.player = user; + short short1 = 141; + short short2 = 141; + GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u = GuiKnowledge.field_146565_w = KnowledgeListMF.gettingStarted.displayColumn + * 24 - short1 / 2 - 12; + GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v = GuiKnowledge.field_146573_x = KnowledgeListMF.gettingStarted.displayRow + * 24 - short2 / 2; + informationList.clear(); + for (Object achievement : InformationList.knowledgeList) { + if (!InformationPage.isInfoInPages((InformationBase) achievement)) { + informationList.add((InformationBase) achievement); + } + } + for (Object base : InformationList.knowledgeList.toArray()) { + if (!ResearchLogic.hasInfoUnlocked(user, (InformationBase) base)) { + allDiscovered = false; + break; + } + } + } + + /** + * Adds the buttons (and other controls) to the screen in question. + */ + @Override + public void initGui() { + int i1 = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; + int j1 = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; + + this.buttonList.clear(); + this.buttonList.add(new GuiOptionButton(1, this.width / 2 + 24, this.height / 2 + 101, 80, 20, + I18n.format("gui.done", new Object[0]))); + this.buttonList.add(button = new GuiButton(2, (width - field_146555_f) / 2 + 24, height / 2 + 101, 125, 20, + InformationPage.getTitle(currentPage))); + + int purchasex = i1 + (field_146555_f - buyWidth) / 2; + int purchasey = j1 + (field_146557_g - buyHeight) / 2; + // PURCHASE SCREEN + this.buttonList.add(new GuiOptionButton(3, purchasex + 19, purchasey + 47, 80, 20, + I18n.format("gui.purchase", new Object[0]))); + this.buttonList.add(new GuiOptionButton(4, purchasex + 125, purchasey + 47, 80, 20, + I18n.format("gui.cancel", new Object[0]))); + } + + @Override + protected void mouseClicked(int x, int y, int button) { + if (selected == null && button == 0 && highlighted != null) { + if (ResearchLogic.hasInfoUnlocked(player, highlighted) && !highlighted.getPages().isEmpty()) { + player.openGui(MineFantasyII.instance, 1, player.worldObj, 0, highlighted.ID, 0); + } else if (highlighted.isEasy() && ResearchLogic.canPurchase(player, highlighted)) { + selected = highlighted; + setPurchaseAvailable(player); + } + } + super.mouseClicked(x, y, button); + } + + @Override + protected void actionPerformed(GuiButton p_146284_1_) { + if (p_146284_1_.id == 1) { + this.mc.displayGuiScreen((GuiScreen) null); + } + + if (selected == null && p_146284_1_.id == 2) { + currentPage++; + + if (currentPage >= InformationPage.getInfoPages().size()) { + currentPage = -1; + } + button.displayString = InformationPage.getTitle(currentPage); + } + + if (p_146284_1_.id == 3 && selected != null) { + ((EntityClientPlayerMP) player).sendQueue + .addToSendQueue(new ResearchRequest(player, selected.ID).generatePacket()); + selected = null; + } + if (p_146284_1_.id == 4 && selected != null) { + selected = null; + } + } + + /** + * Fired when a key is typed. This is the equivalent of + * KeyListener.keyTyped(KeyEvent e). + */ + @Override + protected void keyTyped(char p_73869_1_, int p_73869_2_) { + if (p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + this.mc.displayGuiScreen((GuiScreen) null); + this.mc.setIngameFocus(); + } else { + super.keyTyped(p_73869_1_, p_73869_2_); + } + } + + /** + * Draws the screen and all the components in it. + */ + @Override + public void drawScreen(int mx, int my, float f) { + { + int k; + + if (selected == null && Mouse.isButtonDown(0)) { + k = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; + int l = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; + int i1 = k + 8; + int j1 = l + 17; + + if ((GuiKnowledge.field_146554_D == 0 || GuiKnowledge.field_146554_D == 1) && mx >= i1 && mx < i1 + 224 + && my >= j1 && my < j1 + 155) { + if (GuiKnowledge.field_146554_D == 0) { + GuiKnowledge.field_146554_D = 1; + } else { + GuiKnowledge.field_146567_u -= (mx - GuiKnowledge.field_146563_h) * GuiKnowledge.field_146570_r; + GuiKnowledge.field_146566_v -= (my - GuiKnowledge.field_146564_i) * GuiKnowledge.field_146570_r; + GuiKnowledge.field_146565_w = GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; + GuiKnowledge.field_146573_x = GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; + } + + GuiKnowledge.field_146563_h = mx; + GuiKnowledge.field_146564_i = my; + } + } else { + GuiKnowledge.field_146554_D = 0; + } + + k = Mouse.getDWheel(); + float f4 = GuiKnowledge.field_146570_r; + + if (k < 0) { + GuiKnowledge.field_146570_r += 0.25F; + } else if (k > 0) { + GuiKnowledge.field_146570_r -= 0.25F; + } + + GuiKnowledge.field_146570_r = MathHelper.clamp_float(GuiKnowledge.field_146570_r, 1.0F, 3.0F); + + if (GuiKnowledge.field_146570_r != f4) { + float f6 = f4 - GuiKnowledge.field_146570_r; + float f5 = f4 * GuiKnowledge.field_146555_f; + float f1 = f4 * GuiKnowledge.field_146557_g; + float f2 = GuiKnowledge.field_146570_r * GuiKnowledge.field_146555_f; + float f3 = GuiKnowledge.field_146570_r * GuiKnowledge.field_146557_g; + GuiKnowledge.field_146567_u -= (f2 - f5) * 0.5F; + GuiKnowledge.field_146566_v -= (f3 - f1) * 0.5F; + GuiKnowledge.field_146565_w = GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; + GuiKnowledge.field_146573_x = GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; + } + + if (GuiKnowledge.field_146565_w < field_146572_y) { + GuiKnowledge.field_146565_w = field_146572_y; + } + + if (GuiKnowledge.field_146573_x < field_146571_z) { + GuiKnowledge.field_146573_x = field_146571_z; + } + + if (GuiKnowledge.field_146565_w >= field_146559_A) { + GuiKnowledge.field_146565_w = field_146559_A - 1; + } + + if (GuiKnowledge.field_146573_x >= field_146560_B) { + GuiKnowledge.field_146573_x = field_146560_B - 1; + } + + this.drawDefaultBackground(); + this.renderMainPage(mx, my, f); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + this.drawOverlay(); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + if (buttonList.get(2) != null) { + ((GuiButton) buttonList.get(2)).visible = selected != null; + ((GuiButton) buttonList.get(2)).enabled = selected != null && canPurchase; + ((GuiButton) buttonList.get(3)).visible = selected != null; + } + } + + /** + * Called from the main game loop to update the screen. + */ + @Override + public void updateScreen() { + { + GuiKnowledge.field_146569_s = GuiKnowledge.field_146567_u; + GuiKnowledge.field_146568_t = GuiKnowledge.field_146566_v; + double d0 = GuiKnowledge.field_146565_w - GuiKnowledge.field_146567_u; + double d1 = GuiKnowledge.field_146573_x - GuiKnowledge.field_146566_v; + + if (d0 * d0 + d1 * d1 < 4.0D) { + GuiKnowledge.field_146567_u += d0; + GuiKnowledge.field_146566_v += d1; + } else { + GuiKnowledge.field_146567_u += d0 * 0.85D; + GuiKnowledge.field_146566_v += d1 * 0.85D; + } + } + } + + protected void drawOverlay() { + int i = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; + int j = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; + + this.fontRendererObj.drawString(I18n.format("gui.information", new Object[0]), i + 15, j + 5, 4210752); + } + + protected void renderMainPage(int mx, int my, float f) { + int k = MathHelper.floor_double( + GuiKnowledge.field_146569_s + (GuiKnowledge.field_146567_u - GuiKnowledge.field_146569_s) * f); + int l = MathHelper.floor_double( + GuiKnowledge.field_146568_t + (GuiKnowledge.field_146566_v - GuiKnowledge.field_146568_t) * f); + + if (k < field_146572_y) { + k = field_146572_y; + } + + if (l < field_146571_z) { + l = field_146571_z; + } + + if (k >= field_146559_A) { + k = field_146559_A - 1; + } + + if (l >= field_146560_B) { + l = field_146560_B - 1; + } + + int i1 = (this.width - GuiKnowledge.field_146555_f) / 2 + offsetByX; + int j1 = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; + int k1 = i1 + 16; + int l1 = j1 + 17; + this.zLevel = 0.0F; + GL11.glDepthFunc(GL11.GL_GEQUAL); + GL11.glPushMatrix(); + GL11.glTranslatef(k1, l1, -200.0F); + GL11.glScalef(1.0F / GuiKnowledge.field_146570_r, 1.0F / GuiKnowledge.field_146570_r, 0.0F); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + + int i2 = k + 288 >> 4; + int j2 = l + 288 >> 4; + int k2 = (k + 288) % 16; + int l2 = (l + 288) % 16; + boolean flag = true; + boolean flag1 = true; + boolean flag2 = true; + boolean flag3 = true; + boolean flag4 = true; + Random random = new Random(); + float f1 = 16.0F / GuiKnowledge.field_146570_r; + float f2 = 16.0F / GuiKnowledge.field_146570_r; + int i3; + int j3; + int k3; + + for (i3 = 0; i3 * f1 - l2 < 155.0F; ++i3) { + float f3 = 0.6F - (j2 + i3) / 25.0F * 0.3F; + GL11.glColor4f(f3, f3, f3, 1.0F); + + for (j3 = 0; j3 * f2 - k2 < 224.0F; ++j3) { + IIcon iicon = Blocks.planks.getIcon(0, 0); + + this.mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + this.drawTexturedModelRectFromIcon(j3 * 16 - k2, i3 * 16 - l2, iicon, 16, 16); + } + } + + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glDepthFunc(GL11.GL_LEQUAL); + this.mc.getTextureManager().bindTexture(screenTex); + int researchVisibility; + int j4; + int l4; + + List achievementList = (currentPage == -1 ? informationList + : InformationPage.getInfoPage(currentPage).getInfoList()); + for (i3 = 0; i3 < achievementList.size(); ++i3) { + InformationBase achievement1 = achievementList.get(i3); + + if (achievement1.parentInfo != null && achievementList.contains(achievement1.parentInfo)) { + j3 = achievement1.displayColumn * 24 - k + 11; + k3 = achievement1.displayRow * 24 - l + 11; + l4 = achievement1.parentInfo.displayColumn * 24 - k + 11; + int l3 = achievement1.parentInfo.displayRow * 24 - l + 11; + boolean flag5 = ResearchLogic.hasInfoUnlocked(player, achievement1); + boolean flag6 = ResearchLogic.canUnlockInfo(player, achievement1); + researchVisibility = ResearchLogic.func_150874_c(player, achievement1); + + if (researchVisibility <= getVisibleRange()[0]) { + j4 = -16777216; + + if (flag5) { + j4 = -6250336; + } else if (flag6) { + j4 = -16711936; + } + + this.drawHorizontalLine(j3, l4, k3, j4); + this.drawVerticalLine(l4, k3, l3, j4); + + if (j3 > l4) { + this.drawTexturedModalRect(j3 - 11 - 7, k3 - 5, 114, 234, 7, 11); + } else if (j3 < l4) { + this.drawTexturedModalRect(j3 + 11, k3 - 5, 107, 234, 7, 11); + } else if (k3 > l3) { + this.drawTexturedModalRect(j3 - 5, k3 - 11 - 7, 96, 234, 11, 7); + } else if (k3 < l3) { + this.drawTexturedModalRect(j3 - 5, k3 + 11, 96, 241, 11, 7); + } + } + } + } + + InformationBase achievement = null; + RenderItem renderitem = new RenderItem(); + float f4 = (mx - k1) * GuiKnowledge.field_146570_r; + float f5 = (my - l1) * GuiKnowledge.field_146570_r; + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + int i5; + int j5; + + for (l4 = 0; l4 < achievementList.size(); ++l4) { + InformationBase achievement2 = achievementList.get(l4); + i5 = achievement2.displayColumn * 24 - k; + j5 = achievement2.displayRow * 24 - l; + + if (i5 >= -24 && j5 >= -24 && i5 <= 224.0F * GuiKnowledge.field_146570_r + && j5 <= 155.0F * GuiKnowledge.field_146570_r) { + researchVisibility = ResearchLogic.func_150874_c(player, achievement2); + float f6; + + if (ResearchLogic.hasInfoUnlocked(player, achievement2)) { + f6 = 0.75F; + GL11.glColor4f(f6, f6, f6, 1.0F); + } else if (ResearchLogic.canUnlockInfo(player, achievement2)) { + f6 = 1.0F; + GL11.glColor4f(0.5F, 1.0F, 0.5F, 1.0F); + } else if (researchVisibility < getVisibleRange()[1]) { + f6 = 0.3F; + GL11.glColor4f(f6, f6, f6, 1.0F); + } else if (researchVisibility == getVisibleRange()[1]) { + f6 = 0.2F; + GL11.glColor4f(f6, f6, f6, 1.0F); + } else { + if (researchVisibility != getVisibleRange()[2]) { + continue; + } + + f6 = 0.1F; + GL11.glColor4f(f6, f6, f6, 1.0F); + } + + this.mc.getTextureManager().bindTexture(screenTex); + + GL11.glEnable(GL11.GL_BLEND);// Forge: Specifically enable blend because it is needed here. And we fix + // Generic RenderItem's leakage of it. + if (achievement2.getSpecial()) { + this.drawTexturedModalRect(i5 - 2, j5 - 2, 26, 202, 26, 26); + } else if (achievement2.getPerk()) { + this.drawTexturedModalRect(i5 - 2, j5 - 2, 52, 202, 26, 26); + } else { + this.drawTexturedModalRect(i5 - 2, j5 - 2, 0, 202, 26, 26); + } + GL11.glDisable(GL11.GL_BLEND); // Forge: Cleanup states we set. + + if (!ResearchLogic.canUnlockInfo(player, achievement2)) { + f6 = 0.1F; + GL11.glColor4f(f6, f6, f6, 1.0F); + renderitem.renderWithColor = false; + } + + GL11.glDisable(GL11.GL_LIGHTING); // Forge: Make sure Lighting is disabled. Fixes MC-33065 + GL11.glEnable(GL11.GL_CULL_FACE); + renderitem.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), + achievement2.theItemStack, i5 + 3, j5 + 3); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDisable(GL11.GL_LIGHTING); + + if (!ResearchLogic.canUnlockInfo(player, achievement2)) { + renderitem.renderWithColor = true; + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + if (f4 >= i5 && f4 <= i5 + 22 && f5 >= j5 && f5 <= j5 + 22) { + achievement = achievement2; + } + } + } + + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glPopMatrix(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(screenTex); + this.drawTexturedModalRect(i1, j1, 0, 0, GuiKnowledge.field_146555_f, GuiKnowledge.field_146557_g); + + this.zLevel = 0.0F; + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + + if (selected != null) { + int purchasex = i1 + (field_146555_f - buyWidth) / 2; + int purchasey = j1 + (field_146557_g - buyHeight) / 2; + renderPurchaseScreen(purchasex, purchasey, mx, my); + } + drawSkillList(); + super.drawScreen(mx, my, f); + + highlighted = achievement; + if (selected == null && achievement != null) { + String s1 = achievement.getDisplayName(); + String s2 = achievement.getDescription(); + i5 = mx + 12; + j5 = my - 4; + researchVisibility = ResearchLogic.func_150874_c(player, achievement); + + if (!ResearchLogic.canUnlockInfo(player, achievement)) { + String s; + int k4; + + if (researchVisibility == 3) { + s1 = I18n.format("achievement.unknown", new Object[0]); + j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); + s = (new ChatComponentTranslation("achievement.requires", + new Object[]{achievement.parentInfo.getDisplayName()})).getUnformattedText(); + k4 = this.fontRendererObj.splitStringWidth(s, j4); + this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k4 + 12 + 3, -1073741824, -1073741824); + this.fontRendererObj.drawSplitString(s, i5, j5 + 12, j4, -9416624); + } else if (researchVisibility < 3) { + j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); + s = (new ChatComponentTranslation("achievement.requires", + new Object[]{achievement.parentInfo.getDisplayName()})).getUnformattedText(); + k4 = this.fontRendererObj.splitStringWidth(s, j4); + this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k4 + 12 + 3, -1073741824, -1073741824); + this.fontRendererObj.drawSplitString(s, i5, j5 + 12, j4, -9416624); + } else { + s1 = null; + } + } else { + j4 = Math.max(this.fontRendererObj.getStringWidth(s1), 120); + int k5 = this.fontRendererObj.splitStringWidth(s2, j4); + + if (ResearchLogic.hasInfoUnlocked(player, achievement) + || ResearchLogic.canUnlockInfo(player, achievement)) { + k5 += 12; + } + + this.drawGradientRect(i5 - 3, j5 - 3, i5 + j4 + 3, j5 + k5 + 3 + 12, -1073741824, -1073741824); + this.fontRendererObj.drawSplitString(s2, i5, j5 + 12, j4, -6250336); + + if (ResearchLogic.hasInfoUnlocked(player, achievement)) { + this.fontRendererObj.drawStringWithShadow(I18n.format("information.discovered", new Object[0]), i5, + j5 + k5 + 4, -7302913); + } else if (InformationBase.easyResearch && ResearchLogic.canUnlockInfo(player, achievement)) { + this.fontRendererObj.drawStringWithShadow(StatCollector.translateToLocal("information.buy"), i5, + j5 + k5 + 4, -7302913); + } + } + + if (s1 != null) { + this.fontRendererObj.drawStringWithShadow(s1, i5, j5, + ResearchLogic.canUnlockInfo(player, achievement) ? (achievement.getSpecial() ? -128 : -1) + : (achievement.getSpecial() ? -8355776 : -8355712)); + } + } + + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_LIGHTING); + RenderHelper.disableStandardItemLighting(); + } + + /** + * Returns true if this GUI should pause the game when it is displayed in + * single-player + */ + @Override + public boolean doesGuiPauseGame() { + return false; + } + + private int[] getVisibleRange() { + return new int[]{1, 2, 3}; + } + + private void renderPurchaseScreen(int x, int y, int mx, int my) { + if (selected != null) { + String[] requirements = selected.getRequiredSkills(); + int size = 0; + if (requirements != null) { + size = requirements.length; + } + this.mc.getTextureManager().bindTexture(buyTex); + this.drawTexturedModalRect(x, y, 0, 0, buyWidth, 27);// Top + for (int a = 0; a < size; a++) { + this.drawTexturedModalRect(x, y + 27 + (a * 19), 0, 27, buyWidth, 19);// Middle + } + this.drawTexturedModalRect(x, y + 27 + (size * 19), 0, 46, buyWidth, 26);// Bottom + + if (buttonList.get(2) != null && buttonList.get(3) != null) { + int j1 = (this.height - GuiKnowledge.field_146557_g) / 2; + int purchasey = j1 + (field_146557_g - buyHeight) / 2; + + int offset = -19; + if (requirements != null) { + offset += (19 * requirements.length); + } + ((GuiButton) buttonList.get(2)).yPosition = purchasey + 47 + offset; + ((GuiButton) buttonList.get(3)).yPosition = purchasey + 47 + offset; + } + int red = GuiHelper.getColourForRGB(220, 0, 0); + int white = 16777215; + mc.fontRenderer.drawString(selected.getDisplayName(), x + 22, y + 12, white, false); + + if (hasScroll) { + mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("knowledge.hasScroll"), x + 20, + y + 32, red); + } else { + for (int a = 0; a < requirements.length; a++) { + boolean isUnlocked = selected.isUnlocked(a, mc.thePlayer); + String text = requirements[a]; + mc.fontRenderer.drawStringWithShadow(text, x + 20, y + 32 + (a * 19), isUnlocked ? white : red); + } + } + } + GL11.glColor3f(255, 255, 255); + } + + private void setPurchaseAvailable(EntityPlayer user) { + if (selected != null) { + canPurchase = selected.hasSkillsUnlocked(user); + } else { + canPurchase = false; + } + } + + protected void drawSkillList() { + GL11.glPushMatrix(); + + int skillWidth = 143; + int skillHeight = 156; + int x = (this.width - GuiKnowledge.field_146555_f) / 2 - skillWidth + offsetByX; + int y = (this.height - GuiKnowledge.field_146557_g) / 2 + offsetByY; + this.mc.getTextureManager().bindTexture(skillTex); + + this.drawTexturedModalRect(x, y, 0, 0, skillWidth, skillHeight); + + drawSkill(x + 20, y + 20, SkillList.artisanry); + drawSkill(x + 20, y + 44, SkillList.construction); + drawSkill(x + 20, y + 68, SkillList.provisioning); + drawSkill(x + 20, y + 92, SkillList.engineering); + drawSkill(x + 20, y + 116, SkillList.combat); + + drawSkillName(x + 20, y + 20, SkillList.artisanry); + drawSkillName(x + 20, y + 44, SkillList.construction); + drawSkillName(x + 20, y + 68, SkillList.provisioning); + drawSkillName(x + 20, y + 92, SkillList.engineering); + drawSkillName(x + 20, y + 116, SkillList.combat); + + GL11.glPopMatrix(); + } + + protected void drawSkill(int x, int y, Skill skill) { + if (skill != null) { + int level = RPGElements.getLevel(mc.thePlayer, skill); + int xp = skill.getXP(player)[0]; + int max = skill.getXP(player)[1]; + if (xp > max) + xp = max; + + float scale = (float) xp / (float) max; + this.drawTexturedModalRect(x + 22, y + 13, 0, 156, (int) (78F * scale), 5); + + // mc.fontRenderer.drawString(skill.getDisplayName(), x+2, y+1, 0); + // mc.fontRenderer.drawString(""+level, x+1, y+10, 0); + } + } + + protected void drawSkillName(int x, int y, Skill skill) { + if (skill != null) { + int level = RPGElements.getLevel(mc.thePlayer, skill); + mc.fontRenderer.drawString(skill.getDisplayName(), x + 2, y + 1, 0); + mc.fontRenderer.drawString("" + level, x + 1, y + 10, 0); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiKnowledgeEntry.java b/src/main/java/minefantasy/mf2/client/gui/GuiKnowledgeEntry.java index 776bb78b..63f975b9 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiKnowledgeEntry.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiKnowledgeEntry.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -17,165 +15,165 @@ import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.resources.I18n; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiKnowledgeEntry extends GuiScreen { - // GuiScreenBook - private final GuiScreen parentGui; - private final InformationBase infoBase; - private Minecraft mc = Minecraft.getMinecraft(); - private int pages = 1; - private int currentPage = 0; - public int bookImageWidth = EntryPageCraft.universalBookImageWidth; - public int bookImageHeight = EntryPageCraft.universalBookImageHeight; - private GuiKnowledgeEntry.NextPageButton buttonNextPage; - private GuiKnowledgeEntry.NextPageButton buttonPreviousPage; - private GuiButton buttonDone; - - public GuiKnowledgeEntry(GuiScreen parent, InformationBase info) { - this.parentGui = parent; - this.infoBase = info; - pages = info.getPages().size(); - } - - @Override - public void initGui() { - int xPoint = this.width / 2; - int yPoint = (this.height - this.bookImageHeight) / 2; - - this.buttonList.clear(); - this.buttonList.add(this.buttonDone = new GuiButton(0, this.width / 2 - 100, - 4 + yPoint + this.bookImageHeight - 16, 200, 20, I18n.format("gui.done", new Object[0]))); - this.buttonList.add(this.buttonNextPage = new GuiKnowledgeEntry.NextPageButton(1, xPoint + bookImageWidth - 22, - yPoint + 209, true)); - this.buttonList.add(this.buttonPreviousPage = new GuiKnowledgeEntry.NextPageButton(2, - xPoint - bookImageWidth + 4, yPoint + 209, false)); - this.updateButtons(); - } - - private void updateButtons() { - this.buttonNextPage.visible = (this.currentPage < this.pages - 2); - this.buttonPreviousPage.visible = this.currentPage > 1; - } - - private static boolean lastTick = true; - private static boolean canTick = true; - - @Override - public void drawScreen(int x, int y, float f) { - boolean onTick = false; - - boolean currTick = mc.theWorld.getTotalWorldTime() % 10 == 0;// has a second passed - - if (currTick != lastTick) { - canTick = !canTick; - if (canTick) { - onTick = true; - } - } - lastTick = currTick; - - drawPage(x, y, f, currentPage, -(bookImageWidth / 2), "left_page", onTick); - drawPage(x, y, f, currentPage + 1, (bookImageWidth / 2), "right_page", onTick); - - super.drawScreen(x, y, f); - } - - public void drawPage(int x, int y, float f, int num, int offset, String tex, boolean onTick) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - int xPoint = (this.width - this.bookImageWidth) / 2 + offset; - int yPoint = (this.height - this.bookImageHeight) / 2; - - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/" + tex + ".png")); - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.bookImageWidth, this.bookImageHeight); - - if (num < infoBase.getPages().size()) { - EntryPage page = infoBase.getPages().get(num); - if (page != null) { - page.preRender(this, x, y, f, xPoint, yPoint, onTick); - page.render(this, x, y, f, xPoint, yPoint, onTick); - } - } - - String s = I18n.format("book.pageIndicator", - new Object[] { Integer.valueOf(num + 1), Integer.valueOf(this.pages) }); - int l = mc.fontRenderer.getStringWidth(s) / 2; - this.fontRendererObj.drawString(s, xPoint + (bookImageWidth / 2) - l, yPoint + bookImageHeight - 16, 0); - } - - @Override - protected void actionPerformed(GuiButton button) { - if (button.id == 0) { - this.mc.displayGuiScreen(parentGui); - } - if (button.id == 1) { - if (currentPage < pages - 2) { - currentPage += 2; - } - } - if (button.id == 2) { - if (currentPage > 1) { - currentPage -= 2; - } - } - updateButtons(); - } - - @Override - protected void keyTyped(char p_73869_1_, int p_73869_2_) { - if (p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) { - mc.thePlayer.openGui(MineFantasyII.instance, 1, mc.thePlayer.worldObj, 0, -1, 0); - } else { - super.keyTyped(p_73869_1_, p_73869_2_); - } - } - - @Override - public boolean doesGuiPauseGame() { - return false; - } - - @SideOnly(Side.CLIENT) - static class NextPageButton extends GuiButton { - private final boolean isNextPage; - - public NextPageButton(int p_i1079_1_, int p_i1079_2_, int p_i1079_3_, boolean p_i1079_4_) { - super(p_i1079_1_, p_i1079_2_, p_i1079_3_, 23, 13, ""); - this.isNextPage = p_i1079_4_; - } - - /** - * Draws this button to the screen. - */ - public void drawButton(Minecraft mc, int x, int y) { - if (this.visible) { - boolean flag = x >= this.xPosition && y >= this.yPosition && x < this.xPosition + this.width - && y < this.yPosition + this.height; - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/book.png")); - int k = 0; - int l = 228; - - if (flag) { - k += 18; - } - - if (!this.isNextPage) { - l += 10; - } - - this.drawTexturedModalRect(this.xPosition, this.yPosition, k, l, 18, 10); - } - } - - @Override - public void func_146113_a(SoundHandler snd) { - snd.playSound( - PositionedSoundRecord.func_147674_a(new ResourceLocation("minefantasy2:block.flipPage"), 1.0F)); - } - } + private static boolean lastTick = true; + private static boolean canTick = true; + // GuiScreenBook + private final GuiScreen parentGui; + private final InformationBase infoBase; + public int bookImageWidth = EntryPageCraft.universalBookImageWidth; + public int bookImageHeight = EntryPageCraft.universalBookImageHeight; + private Minecraft mc = Minecraft.getMinecraft(); + private int pages = 1; + private int currentPage = 0; + private GuiKnowledgeEntry.NextPageButton buttonNextPage; + private GuiKnowledgeEntry.NextPageButton buttonPreviousPage; + private GuiButton buttonDone; + + public GuiKnowledgeEntry(GuiScreen parent, InformationBase info) { + this.parentGui = parent; + this.infoBase = info; + pages = info.getPages().size(); + } + + @Override + public void initGui() { + int xPoint = this.width / 2; + int yPoint = (this.height - this.bookImageHeight) / 2; + + this.buttonList.clear(); + this.buttonList.add(this.buttonDone = new GuiButton(0, this.width / 2 - 100, + 4 + yPoint + this.bookImageHeight - 16, 200, 20, I18n.format("gui.done", new Object[0]))); + this.buttonList.add(this.buttonNextPage = new GuiKnowledgeEntry.NextPageButton(1, xPoint + bookImageWidth - 22, + yPoint + 209, true)); + this.buttonList.add(this.buttonPreviousPage = new GuiKnowledgeEntry.NextPageButton(2, + xPoint - bookImageWidth + 4, yPoint + 209, false)); + this.updateButtons(); + } + + private void updateButtons() { + this.buttonNextPage.visible = (this.currentPage < this.pages - 2); + this.buttonPreviousPage.visible = this.currentPage > 1; + } + + @Override + public void drawScreen(int x, int y, float f) { + boolean onTick = false; + + boolean currTick = mc.theWorld.getTotalWorldTime() % 10 == 0;// has a second passed + + if (currTick != lastTick) { + canTick = !canTick; + if (canTick) { + onTick = true; + } + } + lastTick = currTick; + + drawPage(x, y, f, currentPage, -(bookImageWidth / 2), "left_page", onTick); + drawPage(x, y, f, currentPage + 1, (bookImageWidth / 2), "right_page", onTick); + + super.drawScreen(x, y, f); + } + + public void drawPage(int x, int y, float f, int num, int offset, String tex, boolean onTick) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + int xPoint = (this.width - this.bookImageWidth) / 2 + offset; + int yPoint = (this.height - this.bookImageHeight) / 2; + + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/" + tex + ".png")); + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.bookImageWidth, this.bookImageHeight); + + if (num < infoBase.getPages().size()) { + EntryPage page = infoBase.getPages().get(num); + if (page != null) { + page.preRender(this, x, y, f, xPoint, yPoint, onTick); + page.render(this, x, y, f, xPoint, yPoint, onTick); + } + } + + String s = I18n.format("book.pageIndicator", + new Object[]{Integer.valueOf(num + 1), Integer.valueOf(this.pages)}); + int l = mc.fontRenderer.getStringWidth(s) / 2; + this.fontRendererObj.drawString(s, xPoint + (bookImageWidth / 2) - l, yPoint + bookImageHeight - 16, 0); + } + + @Override + protected void actionPerformed(GuiButton button) { + if (button.id == 0) { + this.mc.displayGuiScreen(parentGui); + } + if (button.id == 1) { + if (currentPage < pages - 2) { + currentPage += 2; + } + } + if (button.id == 2) { + if (currentPage > 1) { + currentPage -= 2; + } + } + updateButtons(); + } + + @Override + protected void keyTyped(char p_73869_1_, int p_73869_2_) { + if (p_73869_2_ == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + mc.thePlayer.openGui(MineFantasyII.instance, 1, mc.thePlayer.worldObj, 0, -1, 0); + } else { + super.keyTyped(p_73869_1_, p_73869_2_); + } + } + + @Override + public boolean doesGuiPauseGame() { + return false; + } + + @SideOnly(Side.CLIENT) + static class NextPageButton extends GuiButton { + private final boolean isNextPage; + + public NextPageButton(int p_i1079_1_, int p_i1079_2_, int p_i1079_3_, boolean p_i1079_4_) { + super(p_i1079_1_, p_i1079_2_, p_i1079_3_, 23, 13, ""); + this.isNextPage = p_i1079_4_; + } + + /** + * Draws this button to the screen. + */ + public void drawButton(Minecraft mc, int x, int y) { + if (this.visible) { + boolean flag = x >= this.xPosition && y >= this.yPosition && x < this.xPosition + this.width + && y < this.yPosition + this.height; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/book.png")); + int k = 0; + int l = 228; + + if (flag) { + k += 18; + } + + if (!this.isNextPage) { + l += 10; + } + + this.drawTexturedModalRect(this.xPosition, this.yPosition, k, l, 18, 10); + } + } + + @Override + public void func_146113_a(SoundHandler snd) { + snd.playSound( + PositionedSoundRecord.func_147674_a(new ResourceLocation("minefantasy2:block.flipPage"), 1.0F)); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiQuern.java b/src/main/java/minefantasy/mf2/client/gui/GuiQuern.java index e6ab320b..68221b56 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiQuern.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiQuern.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -9,36 +7,37 @@ import minefantasy.mf2.container.ContainerQuern; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiQuern extends GuiContainer { - private TileEntityQuern tile; + private TileEntityQuern tile; - public GuiQuern(InventoryPlayer user, TileEntityQuern tile) { - super(new ContainerQuern(user, tile)); - this.ySize = 175; - this.tile = tile; - } + public GuiQuern(InventoryPlayer user, TileEntityQuern tile) { + super(new ContainerQuern(user, tile)); + this.ySize = 175; + this.tile = tile; + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/quern.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/quern.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiReload.java b/src/main/java/minefantasy/mf2/client/gui/GuiReload.java index 9c57d33a..d8fc9ca8 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiReload.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiReload.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -9,39 +7,40 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiReload extends GuiContainer { - public GuiReload(InventoryPlayer user, ItemStack weapon) { - super(new ContainerReload(user, weapon)); - this.ySize = 148; - this.xSize = 176; - } + public GuiReload(InventoryPlayer user, ItemStack weapon) { + super(new ContainerReload(user, weapon)); + this.ySize = 148; + this.xSize = 176; + } - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - } + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } - @Override - protected boolean checkHotbarKeys(int id) { - return false; - } + @Override + protected boolean checkHotbarKeys(int id) { + return false; + } - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/reload.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - } + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/reload.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + } - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/gui/GuiResearchBlock.java b/src/main/java/minefantasy/mf2/client/gui/GuiResearchBlock.java index ce07eeba..8dd3ec29 100644 --- a/src/main/java/minefantasy/mf2/client/gui/GuiResearchBlock.java +++ b/src/main/java/minefantasy/mf2/client/gui/GuiResearchBlock.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.gui; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -9,41 +7,42 @@ import minefantasy.mf2.container.ContainerResearch; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiResearchBlock extends GuiContainer { - private TileEntityResearch tile; - - public GuiResearchBlock(InventoryPlayer user, TileEntityResearch tile) { - super(new ContainerResearch(user, tile)); - this.ySize = 158; - this.xSize = 178; - this.tile = tile; - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the - * items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int x, int y) { - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/research.png")); - int xPoint = (this.width - this.xSize) / 2; - int yPoint = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); - - int scale = tile.getMetreScale(161); - this.drawTexturedModalRect(xPoint + 10, yPoint + 33, 0, 158, scale, 3); - fontRendererObj.drawString(tile.getLocalisedName(), xPoint + 9, yPoint + 11, 0); - } - - @Override - public void drawScreen(int x, int y, float f) { - super.drawScreen(x, y, f); - } + private TileEntityResearch tile; + + public GuiResearchBlock(InventoryPlayer user, TileEntityResearch tile) { + super(new ContainerResearch(user, tile)); + this.ySize = 158; + this.xSize = 178; + this.tile = tile; + } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the + * items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int x, int y) { + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(TextureHelperMF.getResource("textures/gui/knowledge/research.png")); + int xPoint = (this.width - this.xSize) / 2; + int yPoint = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(xPoint, yPoint, 0, 0, this.xSize, this.ySize); + + int scale = tile.getMetreScale(161); + this.drawTexturedModalRect(xPoint + 10, yPoint + 33, 0, 158, scale, 3); + fontRendererObj.drawString(tile.getLocalisedName(), xPoint + 9, yPoint + 11, 0); + } + + @Override + public void drawScreen(int x, int y, float f) { + super.drawScreen(x, y, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/AnimationHandlerMF.java b/src/main/java/minefantasy/mf2/client/render/AnimationHandlerMF.java index e0bce709..131b610a 100644 --- a/src/main/java/minefantasy/mf2/client/render/AnimationHandlerMF.java +++ b/src/main/java/minefantasy/mf2/client/render/AnimationHandlerMF.java @@ -5,13 +5,13 @@ import net.minecraft.entity.player.EntityPlayer; public class AnimationHandlerMF { - @SubscribeEvent - public void onPlayerTick(TickEvent.PlayerTickEvent event) { - if (event.phase == TickEvent.Phase.START) { - tickStart(event.player); - } - } + @SubscribeEvent + public void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + tickStart(event.player); + } + } - public void tickStart(EntityPlayer entityPlayer) { - } + public void tickStart(EntityPlayer entityPlayer) { + } } diff --git a/src/main/java/minefantasy/mf2/client/render/HudHandlerMF.java b/src/main/java/minefantasy/mf2/client/render/HudHandlerMF.java index 380599cf..8c3e9e25 100644 --- a/src/main/java/minefantasy/mf2/client/render/HudHandlerMF.java +++ b/src/main/java/minefantasy/mf2/client/render/HudHandlerMF.java @@ -11,34 +11,34 @@ @SideOnly(Side.CLIENT) public class HudHandlerMF { - private MineFantasyHUD inGameGUI = new MineFantasyHUD(); + private MineFantasyHUD inGameGUI = new MineFantasyHUD(); - @SubscribeEvent - public void postRenderOverlay(RenderGameOverlayEvent.Post event) { - if (event.type == RenderGameOverlayEvent.ElementType.HOTBAR) { - inGameGUI.renderGameOverlay(event.partialTicks, event.mouseX, event.mouseY); - } - if (event.type == RenderGameOverlayEvent.ElementType.HELMET) { - inGameGUI.renderViewport(); - } - } + @SubscribeEvent + public void postRenderOverlay(RenderGameOverlayEvent.Post event) { + if (event.type == RenderGameOverlayEvent.ElementType.HOTBAR) { + inGameGUI.renderGameOverlay(event.partialTicks, event.mouseX, event.mouseY); + } + if (event.type == RenderGameOverlayEvent.ElementType.HELMET) { + inGameGUI.renderViewport(); + } + } - @SubscribeEvent - public void onBowFOV(FOVUpdateEvent event) { - ItemStack stack = event.entity.getItemInUse(); - if (stack != null && stack.getItem() instanceof ItemBowMF) { - int i = event.entity.getItemInUseDuration(); - float f1 = i / 20.0F; - if (f1 > 1.0F) { - f1 = 1.0F; - } else { - f1 *= f1; - } - event.newfov *= 1.0F - f1 * 0.15F; - } - if (stack != null && stack.getItem() instanceof IScope) { - IScope spyglass = (IScope) stack.getItem(); - event.newfov *= 1.0F - spyglass.getZoom(stack); - } - } + @SubscribeEvent + public void onBowFOV(FOVUpdateEvent event) { + ItemStack stack = event.entity.getItemInUse(); + if (stack != null && stack.getItem() instanceof ItemBowMF) { + int i = event.entity.getItemInUseDuration(); + float f1 = i / 20.0F; + if (f1 > 1.0F) { + f1 = 1.0F; + } else { + f1 *= f1; + } + event.newfov *= 1.0F - f1 * 0.15F; + } + if (stack != null && stack.getItem() instanceof IScope) { + IScope spyglass = (IScope) stack.getItem(); + event.newfov *= 1.0F - spyglass.getZoom(stack); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java b/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java index e963ae88..4a85425c 100644 --- a/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java +++ b/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java @@ -1,19 +1,11 @@ package minefantasy.mf2.client.render; -import java.awt.Color; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.archery.IDisplayMFAmmo; import minefantasy.mf2.api.archery.IFirearm; import minefantasy.mf2.api.crafting.IBasicMetre; import minefantasy.mf2.api.crafting.IQualityBalance; -import minefantasy.mf2.api.helpers.ArmourCalculator; -import minefantasy.mf2.api.helpers.GuiHelper; -import minefantasy.mf2.api.helpers.PowerArmour; -import minefantasy.mf2.api.helpers.TextureHelperMF; -import minefantasy.mf2.api.helpers.ToolHelper; +import minefantasy.mf2.api.helpers.*; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; @@ -40,535 +32,537 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; + +import java.awt.*; public class MineFantasyHUD extends Gui { - private static Minecraft mc = Minecraft.getMinecraft(); - - public void renderViewport() { - if (mc.thePlayer != null) { - EntityPlayer player = mc.thePlayer; - - if (this.mc.gameSettings.thirdPersonView == 0) { - if (player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IScope) { - renderScope(player.getHeldItem(), player); - } - if (player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) { - renderPowerHelmet(player, (EntityCogwork) player.ridingEntity); - } - } - } - } - - public void renderGameOverlay(float partialTicks, int mouseX, int mouseY) { - if (mc.thePlayer != null) { - EntityPlayer player = mc.thePlayer; - - if (mc.currentScreen != null - && (mc.currentScreen instanceof GuiInventory || mc.currentScreen instanceof GuiContainerCreative)) { - renderArmourRating(player); - } else { - renderAmmo(player); - } - if (StaminaBar.isSystemActive && !player.capabilities.isCreativeMode - && !PowerArmour.isWearingCogwork(player)) { - renderStaminaBar(player); - } - Entity highlight = getClickedEntity(partialTicks, mouseX, mouseY); - if (highlight != null && highlight instanceof EntityCogwork) { - lookAtCogwork((EntityCogwork) highlight); - } - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - int[] coords = getClickedBlock(partialTicks, mouseX, mouseY); - if (coords == null) - return; - - int x = coords[0]; - int y = coords[1]; - int z = coords[2]; - World world = player.worldObj; - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null) { - if (tile instanceof TileEntityAnvilMF) { - this.renderCraftMetre(world, player, (TileEntityAnvilMF) tile); - } - if (tile instanceof TileEntityCarpenterMF) { - this.renderCraftMetre(world, player, (TileEntityCarpenterMF) tile); - } - if (tile instanceof TileEntityTanningRack) { - this.renderCraftMetre(world, player, (TileEntityTanningRack) tile); - } - if (tile instanceof IBasicMetre) { - this.renderCraftMetre(world, player, (IBasicMetre) tile); - } - if (tile instanceof IQualityBalance) { - this.renderQualityBalance(world, player, (IQualityBalance) tile); - } - if (tile instanceof TileEntityRoad) { - renderRoad(world, player, ((TileEntityRoad) tile)); - } - } - } - } - - protected static final ResourceLocation pumpkinBlurTexPath = new ResourceLocation("textures/misc/pumpkinblur.png"); - - protected void renderPowerHelmet() { - GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/scopes/cogwork_helm.png"); - int x = (width / 2 - 256); - int y = height - 256; - - this.drawTexturedModalRect(x, y, 0, 64, 128, 64); - - GL11.glPopMatrix(); - } - - private void renderScope(ItemStack item, EntityPlayer user) { - if (item.getItem() instanceof IFirearm) { - float factor = ((IScope) item.getItem()).getZoom(item); - if (factor > 0.1F) { - GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, - MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/scopes/scope_basic.png"); - int xPos = width / 2 - 128; - int yPos = height / 2 - 128; - this.drawTexturedModalRect(xPos, yPos, 0, 0, 256, 256); - - GL11.glPopMatrix(); - } - } - } - - private void lookAtCogwork(EntityCogwork suit) { - GL11.glPushMatrix(); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - renderCogworkFuel(width, height, suit); - - GL11.glPopMatrix(); - } - - private void renderPowerHelmet(EntityPlayer user, EntityCogwork suit) { - GL11.glPushMatrix(); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - renderHelmetBlur(width, height); - renderCogworkFuel(width, height, suit); - - GL11.glPopMatrix(); - } - - private void renderCogworkFuel(int width, int height, EntityCogwork suit) { - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - - bindTexture("textures/gui/hud_overlay.png"); - int[] orientationAR = getOrientsFor(width, height, ConfigClient.CF_xOrient, ConfigClient.CF_yOrient); - int xPos = orientationAR[0] + ConfigClient.CF_xPos; - int yPos = orientationAR[1] + ConfigClient.CF_yPos; - - this.drawTexturedModalRect(xPos, yPos, 84, 38, 172, 20); - int i = suit.getMetreScaled(160); - this.drawTexturedModalRect(xPos + 6 + (160 - i), yPos + 11, 90, 20, i, 3); - } - - private void renderHelmetBlur(int width, int height) { - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glDepthMask(false); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_ALPHA_TEST); - bindTexture("textures/gui/scopes/cogwork_helm.png"); - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV(0.0D, height, -90.0D, 0.0D, 1.0D); - tessellator.addVertexWithUV(width, height, -90.0D, 1.0D, 1.0D); - tessellator.addVertexWithUV(width, 0.0D, -90.0D, 1.0D, 0.0D); - tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D); - tessellator.draw(); - GL11.glDepthMask(true); - GL11.glEnable(GL11.GL_DEPTH_TEST); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - } - - public int[] getClickedBlock(float ticks, int mouseX, int mouseY) { - if (mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int j = mc.objectMouseOver.blockX; - int k = mc.objectMouseOver.blockY; - int l = mc.objectMouseOver.blockZ; - - return new int[] { j, k, l }; - } - return null; - } - - public Entity getClickedEntity(float ticks, int mouseX, int mouseY) { - if (mc.objectMouseOver != null - && mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) { - return mc.objectMouseOver.entityHit; - } - return null; - } - - private void renderArmourRating(EntityPlayer player) { - int base = getBaseRating(player); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - int[] orientationAR = getOrientsFor(width, height, ConfigClient.AR_xOrient, ConfigClient.AR_yOrient); - int xPosAR = orientationAR[0] + ConfigClient.AR_xPos; - int yPosAR = orientationAR[1] + ConfigClient.AR_yPos; - int y = 8; - if (ArmourCalculator.advancedDamageTypes) { - mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.protection"), xPosAR, - yPosAR, Color.WHITE.getRGB()); - displayTraitValue(xPosAR, yPosAR + 8, orientationAR, 0, player, base); - displayTraitValue(xPosAR, yPosAR + 16, orientationAR, 2, player, base); - displayTraitValue(xPosAR, yPosAR + 24, orientationAR, 1, player, base); - y = 32; - } else { - displayGeneralAR(xPosAR, yPosAR, orientationAR, player, base); - } - - float weight = getBaseWeight(player); - - for (int a = 0; a < 4; a++) { - ItemStack armour = mc.thePlayer.getEquipmentInSlot(4 - a); - weight += ArmourCalculator.getPieceWeight(armour, a); - } - - String massString = CustomMaterial.getWeightString(weight); - mc.fontRenderer.drawStringWithShadow(massString, xPosAR, yPosAR + y, Color.WHITE.getRGB()); - } - - private int getBaseRating(EntityPlayer player) { - if (player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) { - return ((EntityCogwork) player.ridingEntity).getArmourRating(); - } - return 0; - } - - private float getBaseWeight(EntityPlayer player) { - if (player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) { - return ((EntityCogwork) player.ridingEntity).getWeight(); - } - return 0; - } - - private void renderAmmo(EntityPlayer player) { - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - int[] orientationAR = getOrientsFor(width, height, ConfigClient.AR_xOrient, ConfigClient.AR_yOrient); - int xPosAR = orientationAR[0] + ConfigClient.AR_xPos; - int yPosAR = orientationAR[1] + ConfigClient.AR_yPos; - - ItemStack held = player.getHeldItem(); - if (held != null && (held.getItem() instanceof IDisplayMFAmmo)) { - ItemStack arrow = AmmoMechanicsMF.getAmmo(held); - - String text = StatCollector.translateToLocal("info.bow.reload"); - if (arrow != null) { - text = arrow.getDisplayName() + " x" + arrow.stackSize; - } - int[] orientationAC = getOrientsFor(width, height, ConfigClient.AC_xOrient, ConfigClient.AC_yOrient); - int xPosAC = orientationAR[0] + ConfigClient.AC_xPos; - int yPosAC = orientationAR[1] + ConfigClient.AC_yPos; - - mc.fontRenderer.drawStringWithShadow(text, xPosAC, yPosAC, Color.WHITE.getRGB()); - - int cap = ((IDisplayMFAmmo) held.getItem()).getAmmoCapacity(held); - - ItemStack ammo = AmmoMechanicsMF.getArrowOnBow(held); - int ammocount = ammo == null ? 0 : ammo.stackSize; - if (cap > 1) { - String ammostring = StatCollector.translateToLocalFormatted("info.firearm.ammo", ammocount, cap); - mc.fontRenderer.drawStringWithShadow(ammostring, xPosAC, yPosAC + 10, Color.WHITE.getRGB()); - } - } - } - - private void displayTraitValue(int xPosAR, int yPosAR, int[] orientationAR, int id, EntityPlayer player, int base) { - float AR = (int) (ArmourCalculator.getDRDisplay(player, id) * 100F) + base; - mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.rating." + id) + " " - + ItemWeaponMF.decimal_format.format(AR), xPosAR, yPosAR, Color.WHITE.getRGB()); - } - - private void displayGeneralAR(int xPosAR, int yPosAR, int[] orientationAR, EntityPlayer player, int base) { - float AR = ((int) (ArmourCalculator.getDRDisplay(player, 0) * 100F) + base); - - mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.protection") + ": " - + ItemWeaponMF.decimal_format.format(AR), xPosAR, yPosAR, Color.WHITE.getRGB()); - } - - private void renderStaminaBar(EntityPlayer player) { - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - float staminaMax = StaminaBar.getTotalMaxStamina(player); - float staminaAt = StaminaBar.getStaminaValue(player); - - float staminaPercentage = staminaMax > 0 ? Math.min(1.0F, staminaAt / staminaMax) : 0F; - - float flash = StaminaBar.getFlashTime(player); - int stam = (int) Math.min(81F, (81F * staminaPercentage)); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - bindTexture("textures/gui/hud_overlay.png"); - - int[] orientation = getOrientsFor(width, height, ConfigClient.stam_xOrient, ConfigClient.stam_yOrient); - int xPos = orientation[0] + ConfigClient.stam_xPos; - int yPos = orientation[1] + ConfigClient.stam_yPos; - this.drawTexturedModalRect(xPos, yPos, 0, 0, 81, 5); - - int modifier = modifyMetre(stam, 81, ConfigClient.stam_direction); - this.drawTexturedModalRect(xPos + modifier, yPos, 0, 5, stam, 5); - - if (flash > 0 && player.ticksExisted % 10 < 5) { - this.drawTexturedModalRect(xPos, yPos, 0, 10, 81, 5); - } - /* + protected static final ResourceLocation pumpkinBlurTexPath = new ResourceLocation("textures/misc/pumpkinblur.png"); + private static Minecraft mc = Minecraft.getMinecraft(); + + /** + * Gets the 2 config values to get the X,Y orient + */ + public static int[] getOrientsFor(int screenX, int screenY, int cfgX, int cfgY) { + int xOrient = cfgX == -1 ? 0 : cfgX == 1 ? screenX : screenX / 2; + int yOrient = cfgY == -1 ? 0 : cfgY == 1 ? screenY : screenY / 2; + + return new int[]{xOrient, yOrient}; + } + + public void renderViewport() { + if (mc.thePlayer != null) { + EntityPlayer player = mc.thePlayer; + + if (this.mc.gameSettings.thirdPersonView == 0) { + if (player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IScope) { + renderScope(player.getHeldItem(), player); + } + if (player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) { + renderPowerHelmet(player, (EntityCogwork) player.ridingEntity); + } + } + } + } + + public void renderGameOverlay(float partialTicks, int mouseX, int mouseY) { + if (mc.thePlayer != null) { + EntityPlayer player = mc.thePlayer; + + if (mc.currentScreen != null + && (mc.currentScreen instanceof GuiInventory || mc.currentScreen instanceof GuiContainerCreative)) { + renderArmourRating(player); + } else { + renderAmmo(player); + } + if (StaminaBar.isSystemActive && !player.capabilities.isCreativeMode + && !PowerArmour.isWearingCogwork(player)) { + renderStaminaBar(player); + } + Entity highlight = getClickedEntity(partialTicks, mouseX, mouseY); + if (highlight != null && highlight instanceof EntityCogwork) { + lookAtCogwork((EntityCogwork) highlight); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + int[] coords = getClickedBlock(partialTicks, mouseX, mouseY); + if (coords == null) + return; + + int x = coords[0]; + int y = coords[1]; + int z = coords[2]; + World world = player.worldObj; + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null) { + if (tile instanceof TileEntityAnvilMF) { + this.renderCraftMetre(world, player, (TileEntityAnvilMF) tile); + } + if (tile instanceof TileEntityCarpenterMF) { + this.renderCraftMetre(world, player, (TileEntityCarpenterMF) tile); + } + if (tile instanceof TileEntityTanningRack) { + this.renderCraftMetre(world, player, (TileEntityTanningRack) tile); + } + if (tile instanceof IBasicMetre) { + this.renderCraftMetre(world, player, (IBasicMetre) tile); + } + if (tile instanceof IQualityBalance) { + this.renderQualityBalance(world, player, (IQualityBalance) tile); + } + if (tile instanceof TileEntityRoad) { + renderRoad(world, player, ((TileEntityRoad) tile)); + } + } + } + } + + protected void renderPowerHelmet() { + GL11.glPushMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/scopes/cogwork_helm.png"); + int x = (width / 2 - 256); + int y = height - 256; + + this.drawTexturedModalRect(x, y, 0, 64, 128, 64); + + GL11.glPopMatrix(); + } + + private void renderScope(ItemStack item, EntityPlayer user) { + if (item.getItem() instanceof IFirearm) { + float factor = ((IScope) item.getItem()).getZoom(item); + if (factor > 0.1F) { + GL11.glPushMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, + MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/scopes/scope_basic.png"); + int xPos = width / 2 - 128; + int yPos = height / 2 - 128; + this.drawTexturedModalRect(xPos, yPos, 0, 0, 256, 256); + + GL11.glPopMatrix(); + } + } + } + + private void lookAtCogwork(EntityCogwork suit) { + GL11.glPushMatrix(); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + renderCogworkFuel(width, height, suit); + + GL11.glPopMatrix(); + } + + private void renderPowerHelmet(EntityPlayer user, EntityCogwork suit) { + GL11.glPushMatrix(); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + renderHelmetBlur(width, height); + renderCogworkFuel(width, height, suit); + + GL11.glPopMatrix(); + } + + private void renderCogworkFuel(int width, int height, EntityCogwork suit) { + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + + bindTexture("textures/gui/hud_overlay.png"); + int[] orientationAR = getOrientsFor(width, height, ConfigClient.CF_xOrient, ConfigClient.CF_yOrient); + int xPos = orientationAR[0] + ConfigClient.CF_xPos; + int yPos = orientationAR[1] + ConfigClient.CF_yPos; + + this.drawTexturedModalRect(xPos, yPos, 84, 38, 172, 20); + int i = suit.getMetreScaled(160); + this.drawTexturedModalRect(xPos + 6 + (160 - i), yPos + 11, 90, 20, i, 3); + } + + private void renderHelmetBlur(int width, int height) { + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDepthMask(false); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_ALPHA_TEST); + bindTexture("textures/gui/scopes/cogwork_helm.png"); + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(0.0D, height, -90.0D, 0.0D, 1.0D); + tessellator.addVertexWithUV(width, height, -90.0D, 1.0D, 1.0D); + tessellator.addVertexWithUV(width, 0.0D, -90.0D, 1.0D, 0.0D); + tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D); + tessellator.draw(); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + + public int[] getClickedBlock(float ticks, int mouseX, int mouseY) { + if (mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int j = mc.objectMouseOver.blockX; + int k = mc.objectMouseOver.blockY; + int l = mc.objectMouseOver.blockZ; + + return new int[]{j, k, l}; + } + return null; + } + + public Entity getClickedEntity(float ticks, int mouseX, int mouseY) { + if (mc.objectMouseOver != null + && mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) { + return mc.objectMouseOver.entityHit; + } + return null; + } + + private void renderArmourRating(EntityPlayer player) { + int base = getBaseRating(player); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + int[] orientationAR = getOrientsFor(width, height, ConfigClient.AR_xOrient, ConfigClient.AR_yOrient); + int xPosAR = orientationAR[0] + ConfigClient.AR_xPos; + int yPosAR = orientationAR[1] + ConfigClient.AR_yPos; + int y = 8; + if (ArmourCalculator.advancedDamageTypes) { + mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.protection"), xPosAR, + yPosAR, Color.WHITE.getRGB()); + displayTraitValue(xPosAR, yPosAR + 8, orientationAR, 0, player, base); + displayTraitValue(xPosAR, yPosAR + 16, orientationAR, 2, player, base); + displayTraitValue(xPosAR, yPosAR + 24, orientationAR, 1, player, base); + y = 32; + } else { + displayGeneralAR(xPosAR, yPosAR, orientationAR, player, base); + } + + float weight = getBaseWeight(player); + + for (int a = 0; a < 4; a++) { + ItemStack armour = mc.thePlayer.getEquipmentInSlot(4 - a); + weight += ArmourCalculator.getPieceWeight(armour, a); + } + + String massString = CustomMaterial.getWeightString(weight); + mc.fontRenderer.drawStringWithShadow(massString, xPosAR, yPosAR + y, Color.WHITE.getRGB()); + } + + private int getBaseRating(EntityPlayer player) { + if (player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) { + return ((EntityCogwork) player.ridingEntity).getArmourRating(); + } + return 0; + } + + private float getBaseWeight(EntityPlayer player) { + if (player.ridingEntity != null && player.ridingEntity instanceof EntityCogwork) { + return ((EntityCogwork) player.ridingEntity).getWeight(); + } + return 0; + } + + private void renderAmmo(EntityPlayer player) { + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + int[] orientationAR = getOrientsFor(width, height, ConfigClient.AR_xOrient, ConfigClient.AR_yOrient); + int xPosAR = orientationAR[0] + ConfigClient.AR_xPos; + int yPosAR = orientationAR[1] + ConfigClient.AR_yPos; + + ItemStack held = player.getHeldItem(); + if (held != null && (held.getItem() instanceof IDisplayMFAmmo)) { + ItemStack arrow = AmmoMechanicsMF.getAmmo(held); + + String text = StatCollector.translateToLocal("info.bow.reload"); + if (arrow != null) { + text = arrow.getDisplayName() + " x" + arrow.stackSize; + } + int[] orientationAC = getOrientsFor(width, height, ConfigClient.AC_xOrient, ConfigClient.AC_yOrient); + int xPosAC = orientationAR[0] + ConfigClient.AC_xPos; + int yPosAC = orientationAR[1] + ConfigClient.AC_yPos; + + mc.fontRenderer.drawStringWithShadow(text, xPosAC, yPosAC, Color.WHITE.getRGB()); + + int cap = ((IDisplayMFAmmo) held.getItem()).getAmmoCapacity(held); + + ItemStack ammo = AmmoMechanicsMF.getArrowOnBow(held); + int ammocount = ammo == null ? 0 : ammo.stackSize; + if (cap > 1) { + String ammostring = StatCollector.translateToLocalFormatted("info.firearm.ammo", ammocount, cap); + mc.fontRenderer.drawStringWithShadow(ammostring, xPosAC, yPosAC + 10, Color.WHITE.getRGB()); + } + } + } + + private void displayTraitValue(int xPosAR, int yPosAR, int[] orientationAR, int id, EntityPlayer player, int base) { + float AR = (int) (ArmourCalculator.getDRDisplay(player, id) * 100F) + base; + mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.rating." + id) + " " + + ItemWeaponMF.decimal_format.format(AR), xPosAR, yPosAR, Color.WHITE.getRGB()); + } + + private void displayGeneralAR(int xPosAR, int yPosAR, int[] orientationAR, EntityPlayer player, int base) { + float AR = ((int) (ArmourCalculator.getDRDisplay(player, 0) * 100F) + base); + + mc.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("attribute.armour.protection") + ": " + + ItemWeaponMF.decimal_format.format(AR), xPosAR, yPosAR, Color.WHITE.getRGB()); + } + + private void renderStaminaBar(EntityPlayer player) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + float staminaMax = StaminaBar.getTotalMaxStamina(player); + float staminaAt = StaminaBar.getStaminaValue(player); + + float staminaPercentage = staminaMax > 0 ? Math.min(1.0F, staminaAt / staminaMax) : 0F; + + float flash = StaminaBar.getFlashTime(player); + int stam = (int) Math.min(81F, (81F * staminaPercentage)); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + bindTexture("textures/gui/hud_overlay.png"); + + int[] orientation = getOrientsFor(width, height, ConfigClient.stam_xOrient, ConfigClient.stam_yOrient); + int xPos = orientation[0] + ConfigClient.stam_xPos; + int yPos = orientation[1] + ConfigClient.stam_yPos; + this.drawTexturedModalRect(xPos, yPos, 0, 0, 81, 5); + + int modifier = modifyMetre(stam, 81, ConfigClient.stam_direction); + this.drawTexturedModalRect(xPos + modifier, yPos, 0, 5, stam, 5); + + if (flash > 0 && player.ticksExisted % 10 < 5) { + this.drawTexturedModalRect(xPos, yPos, 0, 10, 81, 5); + } + /* * else if(StaminaBar.getBonusStaminaRegenTicks(player) > 0 && * player.ticksExisted % 10 < 5) { this.drawTexturedModalRect(xPos, yPos, 0, 15, * 81, 5); } */ - String stamTxt = (int) staminaAt + " / " + (int) staminaMax; - boolean bonus = StaminaBar.getBonusStamina(player) > 0; - - if (mc.currentScreen != null && mc.currentScreen instanceof GuiInventory) { - mc.fontRenderer.drawStringWithShadow(stamTxt, xPos + 41 - (mc.fontRenderer.getStringWidth(stamTxt) / 2), - yPos - 2, bonus ? Color.CYAN.getRGB() : Color.WHITE.getRGB()); - } - GL11.glDisable(GL11.GL_BLEND); - } - - private int modifyMetre(int i, int max, int cfg) { - if (cfg == 0) { - if (max == i) { - return (max - i) / 2; - } else { - return (max - i - 1) / 2; - } - } - if (cfg == 1) { - if (max == i) { - return max - i; - } else { - return max - i - 1; - } - } - return 0; - } - - public void bindTexture(String image) { - mc.renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - /** - * Gets the 2 config values to get the X,Y orient - */ - public static int[] getOrientsFor(int screenX, int screenY, int cfgX, int cfgY) { - int xOrient = cfgX == -1 ? 0 : cfgX == 1 ? screenX : screenX / 2; - int yOrient = cfgY == -1 ? 0 : cfgY == 1 ? screenY : screenY / 2; - - return new int[] { xOrient, yOrient }; - } - - private void renderCraftMetre(World world, EntityPlayer player, TileEntityAnvilMF tile) { - boolean knowsCraft = tile.doesPlayerKnowCraft(player); - GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width / 2 + -86; - int yPos = height - 69; - - this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); - this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getProgressBar(160), 3); - - String s = knowsCraft ? tile.getResultName() : "????"; - mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - - if (knowsCraft && !tile.resName.equalsIgnoreCase("") && tile.getToolNeeded() != null) { - boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.getToolNeeded(), - tile.getToolTierNeeded()); - GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPos - 20, yPos, available); - if (tile.getAnvilTierNeeded() > -1) { - GuiHelper.renderToolIcon(this, "anvil", tile.getAnvilTierNeeded(), xPos + 172, yPos, - tile.tier >= tile.getAnvilTierNeeded()); - } - } - - GL11.glPopMatrix(); - } - - private void renderCraftMetre(World world, EntityPlayer player, TileEntityCarpenterMF tile) { - boolean knowsCraft = tile.doesPlayerKnowCraft(player); - GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width / 2 + -86; - int yPos = height - 69; - - this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); - this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getProgressBar(160), 3); - - String s = knowsCraft ? tile.getResultName() : "????"; - mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - - if (knowsCraft && !tile.resName.equalsIgnoreCase("") && tile.getToolNeeded() != null) { - boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.getToolNeeded(), - tile.getToolTierNeeded()); - GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPos - 20, yPos, available); - } - - GL11.glPopMatrix(); - } - - private void renderCraftMetre(World world, EntityPlayer player, TileEntityTanningRack tile) { - boolean knowsCraft = tile.doesPlayerKnowCraft(player); - GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width / 2 + -86; - int yPos = height - 69; - - this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); - this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getProgressBar(160), 3); - - String s = knowsCraft ? tile.getResultName() : "????"; - ItemStack result = tile.items[1]; - if (result != null && result.stackSize > 1) { - s += " x" + result.stackSize; - } - mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - - String resName = tile.getResultName(); - - if (knowsCraft && !resName.equalsIgnoreCase("") && tile.toolType != null) { - boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.toolType, -1); - GuiHelper.renderToolIcon(this, tile.toolType, tile.tier, xPos - 20, yPos, available); - } - - GL11.glPopMatrix(); - } - - private void renderCraftMetre(World world, EntityPlayer player, IBasicMetre tile) { - if (!tile.shouldShowMetre()) { - return; - } - GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width / 2 + -86; - int yPos = height - 69; - - this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); - this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getMetreScale(160), 3); - - String s = tile.getLocalisedName(); - mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - GL11.glPopMatrix(); - } - - private void renderQualityBalance(World world, EntityPlayer player, IQualityBalance tile) { - if (!tile.shouldShowMetre()) { - return; - } - GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, - MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width / 2 + -86; - int yPos = height - 69 + 17; - int barwidth = 160; - int centre = xPos + 5 + (barwidth / 2); - - this.drawTexturedModalRect(xPos, yPos, 84, 23, 172, 10); - int markerPos = (int) (centre + (tile.getMarkerPosition() * barwidth / 2F)); - this.drawTexturedModalRect(markerPos, yPos + 1, 84, 33, 3, 5); - - int offset = (int) (tile.getThresholdPosition() / 2F * barwidth); - this.drawTexturedModalRect(centre - offset - 1, yPos + 1, 87, 33, 2, 4); - this.drawTexturedModalRect(centre + offset, yPos + 1, 89, 33, 2, 4); - - int offset2 = (int) (tile.getSuperThresholdPosition() / 2F * barwidth); - this.drawTexturedModalRect(centre - offset2, yPos + 1, 91, 33, 1, 4); - this.drawTexturedModalRect(centre + offset2, yPos + 1, 91, 33, 1, 4); - - GL11.glColor3f(1.0F, 1.0F, 1.0F); - GL11.glPopMatrix(); - } - - private void renderRoad(World world, EntityPlayer player, TileEntityRoad tile) { - if (mc.thePlayer.getHeldItem() != null) { - if (mc.thePlayer.getHeldItem().getItem() instanceof ItemMattock) { - GL11.glPushMatrix(); - ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, - MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - bindTexture("textures/gui/hud_overlay.png"); - int xPos = width / 2 + 12; - int yPos = height / 2 - 6; - ; - - this.drawTexturedModalRect(xPos, yPos, tile.isLocked ? 0 : 8, 20, 8, 12); - GL11.glPopMatrix(); - } - } - } + String stamTxt = (int) staminaAt + " / " + (int) staminaMax; + boolean bonus = StaminaBar.getBonusStamina(player) > 0; + + if (mc.currentScreen != null && mc.currentScreen instanceof GuiInventory) { + mc.fontRenderer.drawStringWithShadow(stamTxt, xPos + 41 - (mc.fontRenderer.getStringWidth(stamTxt) / 2), + yPos - 2, bonus ? Color.CYAN.getRGB() : Color.WHITE.getRGB()); + } + GL11.glDisable(GL11.GL_BLEND); + } + + private int modifyMetre(int i, int max, int cfg) { + if (cfg == 0) { + if (max == i) { + return (max - i) / 2; + } else { + return (max - i - 1) / 2; + } + } + if (cfg == 1) { + if (max == i) { + return max - i; + } else { + return max - i - 1; + } + } + return 0; + } + + public void bindTexture(String image) { + mc.renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + private void renderCraftMetre(World world, EntityPlayer player, TileEntityAnvilMF tile) { + boolean knowsCraft = tile.doesPlayerKnowCraft(player); + GL11.glPushMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + -86; + int yPos = height - 69; + + this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); + this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getProgressBar(160), 3); + + String s = knowsCraft ? tile.getResultName() : "????"; + mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + + if (knowsCraft && !tile.resName.equalsIgnoreCase("") && tile.getToolNeeded() != null) { + boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.getToolNeeded(), + tile.getToolTierNeeded()); + GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPos - 20, yPos, available); + if (tile.getAnvilTierNeeded() > -1) { + GuiHelper.renderToolIcon(this, "anvil", tile.getAnvilTierNeeded(), xPos + 172, yPos, + tile.tier >= tile.getAnvilTierNeeded()); + } + } + + GL11.glPopMatrix(); + } + + private void renderCraftMetre(World world, EntityPlayer player, TileEntityCarpenterMF tile) { + boolean knowsCraft = tile.doesPlayerKnowCraft(player); + GL11.glPushMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + -86; + int yPos = height - 69; + + this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); + this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getProgressBar(160), 3); + + String s = knowsCraft ? tile.getResultName() : "????"; + mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + + if (knowsCraft && !tile.resName.equalsIgnoreCase("") && tile.getToolNeeded() != null) { + boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.getToolNeeded(), + tile.getToolTierNeeded()); + GuiHelper.renderToolIcon(this, tile.getToolNeeded(), tile.getToolTierNeeded(), xPos - 20, yPos, available); + } + + GL11.glPopMatrix(); + } + + private void renderCraftMetre(World world, EntityPlayer player, TileEntityTanningRack tile) { + boolean knowsCraft = tile.doesPlayerKnowCraft(player); + GL11.glPushMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + -86; + int yPos = height - 69; + + this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); + this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getProgressBar(160), 3); + + String s = knowsCraft ? tile.getResultName() : "????"; + ItemStack result = tile.items[1]; + if (result != null && result.stackSize > 1) { + s += " x" + result.stackSize; + } + mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + + String resName = tile.getResultName(); + + if (knowsCraft && !resName.equalsIgnoreCase("") && tile.toolType != null) { + boolean available = ToolHelper.isToolSufficient(player.getHeldItem(), tile.toolType, -1); + GuiHelper.renderToolIcon(this, tile.toolType, tile.tier, xPos - 20, yPos, available); + } + + GL11.glPopMatrix(); + } + + private void renderCraftMetre(World world, EntityPlayer player, IBasicMetre tile) { + if (!tile.shouldShowMetre()) { + return; + } + GL11.glPushMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + -86; + int yPos = height - 69; + + this.drawTexturedModalRect(xPos, yPos, 84, 0, 172, 20); + this.drawTexturedModalRect(xPos + 6, yPos + 12, 90, 20, tile.getMetreScale(160), 3); + + String s = tile.getLocalisedName(); + mc.fontRenderer.drawString(s, xPos + 86 - (mc.fontRenderer.getStringWidth(s) / 2), yPos + 3, 0); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + GL11.glPopMatrix(); + } + + private void renderQualityBalance(World world, EntityPlayer player, IQualityBalance tile) { + if (!tile.shouldShowMetre()) { + return; + } + GL11.glPushMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, MineFantasyHUD.mc.displayWidth, + MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + -86; + int yPos = height - 69 + 17; + int barwidth = 160; + int centre = xPos + 5 + (barwidth / 2); + + this.drawTexturedModalRect(xPos, yPos, 84, 23, 172, 10); + int markerPos = (int) (centre + (tile.getMarkerPosition() * barwidth / 2F)); + this.drawTexturedModalRect(markerPos, yPos + 1, 84, 33, 3, 5); + + int offset = (int) (tile.getThresholdPosition() / 2F * barwidth); + this.drawTexturedModalRect(centre - offset - 1, yPos + 1, 87, 33, 2, 4); + this.drawTexturedModalRect(centre + offset, yPos + 1, 89, 33, 2, 4); + + int offset2 = (int) (tile.getSuperThresholdPosition() / 2F * barwidth); + this.drawTexturedModalRect(centre - offset2, yPos + 1, 91, 33, 1, 4); + this.drawTexturedModalRect(centre + offset2, yPos + 1, 91, 33, 1, 4); + + GL11.glColor3f(1.0F, 1.0F, 1.0F); + GL11.glPopMatrix(); + } + + private void renderRoad(World world, EntityPlayer player, TileEntityRoad tile) { + if (mc.thePlayer.getHeldItem() != null) { + if (mc.thePlayer.getHeldItem().getItem() instanceof ItemMattock) { + GL11.glPushMatrix(); + ScaledResolution scaledresolution = new ScaledResolution(MineFantasyHUD.mc, + MineFantasyHUD.mc.displayWidth, MineFantasyHUD.mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + bindTexture("textures/gui/hud_overlay.png"); + int xPos = width / 2 + 12; + int yPos = height / 2 - 6; + ; + + this.drawTexturedModalRect(xPos, yPos, tile.isLocked ? 0 : 8, 20, 8, 12); + GL11.glPopMatrix(); + } + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/ModelCogwork.java b/src/main/java/minefantasy/mf2/client/render/ModelCogwork.java index 3a91ddcc..12eaffab 100644 --- a/src/main/java/minefantasy/mf2/client/render/ModelCogwork.java +++ b/src/main/java/minefantasy/mf2/client/render/ModelCogwork.java @@ -9,206 +9,206 @@ import net.minecraft.item.ItemStack; public class ModelCogwork extends ModelBiped { - ModelRenderer rightfoot; - ModelRenderer leftfoot; - - ModelRenderer headMask; - ModelRenderer bodyBack; - ModelRenderer rightarmPauldron; - ModelRenderer rightlegArmour; - ModelRenderer leftlegArmour; - ModelRenderer leftarmPauldron; - ModelRenderer rightarmArmour; - ModelRenderer leftarmArmour; - ModelRenderer headArmour; - ModelRenderer bodyArmour; - - // RenderCogwork - public ModelCogwork() { - this(1F); - } - - public ModelCogwork(float scale) { - this(scale, -2F * scale, 128, 64); - } - - public ModelCogwork(float scale, float offset, int texWidth, int texHeight) { - this.textureWidth = texWidth; - this.textureHeight = texHeight; - // FRAME - this.bipedHead = new ModelRenderer(this, 0, 0); - this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, scale); - this.bipedHead.setRotationPoint(0.0F, 0F + offset, 0.0F); - - this.bipedHeadwear = new ModelRenderer(this, 32, 0); - this.bipedHeadwear.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, scale + 0.5F); - this.bipedHeadwear.setRotationPoint(0.0F, 0F + offset, 0.0F); - - this.bipedBody = new ModelRenderer(this, 16, 16); - this.bipedBody.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, scale); - this.bipedBody.setRotationPoint(0.0F, 0.0F + offset, 0.0F); - - this.bipedRightArm = new ModelRenderer(this, 40, 16); - this.bipedRightArm.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, scale); - this.bipedRightArm.setRotationPoint(-5.0F, 2.0F + offset, 0.0F); - - this.bipedLeftArm = new ModelRenderer(this, 40, 16); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, scale); - this.bipedLeftArm.setRotationPoint(5.0F, 2.0F + offset, 0.0F); - - this.bipedRightLeg = new ModelRenderer(this, 0, 16); - this.bipedRightLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 8, 4, scale); - this.bipedRightLeg.setRotationPoint(-1.9F, 12.0F + offset, 0.0F); - - this.bipedLeftLeg = new ModelRenderer(this, 0, 16); - this.bipedLeftLeg.mirror = true; - this.bipedLeftLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 8, 4, scale); - this.bipedLeftLeg.setRotationPoint(1.9F, 12.0F + offset, 0.0F); - - rightfoot = new ModelRenderer(this, 0, 53); - rightfoot.addBox(-2F, 0F, -3F, 4, 3, 5, scale); - rightfoot.setRotationPoint(0F, 10F, 0F); - rightfoot.setTextureSize(128, 64); - setRotation(rightfoot, 0F, 0F, 0F); - - leftfoot = new ModelRenderer(this, 0, 53); - leftfoot.mirror = true; - leftfoot.addBox(-2F, 0F, -3F, 4, 3, 5, scale); - leftfoot.setRotationPoint(0F, 10F, 0F); - leftfoot.setTextureSize(128, 64); - - // HEAD ARMOUR - headMask = new ModelRenderer(this, 76, 18); - headMask.addBox(-2F, -3.5F, -6.5F, 4, 5, 3, scale); - headMask.setRotationPoint(0F, 0F, 0F); - headMask.setTextureSize(128, 64); - - headArmour = new ModelRenderer(this, 78, 0); - headArmour.addBox(-4.5F, -8.5F, -4.5F, 9, 9, 9, scale); - headArmour.setRotationPoint(0F, 0F, 0F); - headArmour.setTextureSize(128, 64); - setRotation(headArmour, 0F, 0F, 0F); - - // BODY ARMOUR - bodyBack = new ModelRenderer(this, 34, 32); - bodyBack.addBox(-3.5F, -0.5F, 4F, 7, 9, 3, scale); - bodyBack.setRotationPoint(0F, 0F, 0F); - bodyBack.setTextureSize(128, 64); - setRotation(bodyBack, 0F, 0F, 0F); - - bodyArmour = new ModelRenderer(this, 0, 32); - bodyArmour.addBox(-4.5F, -0.5F, -4F, 9, 13, 8, scale); - bodyArmour.setRotationPoint(0F, 0F, 0F); - bodyArmour.setTextureSize(128, 64); - setRotation(bodyArmour, 0F, 0F, 0F); - - // ARMS ARMOUR - leftarmPauldron = new ModelRenderer(this, 76, 27); - leftarmPauldron.mirror = true; - leftarmPauldron.addBox(0F, -4F, -3F, 5, 5, 6, scale); - leftarmPauldron.setRotationPoint(0F, 0F, 0F); - leftarmPauldron.setTextureSize(128, 64); - setRotation(leftarmPauldron, 0F, 0F, 0.2792527F); - - rightarmPauldron = new ModelRenderer(this, 76, 27); - rightarmPauldron.addBox(-5F, -4F, -3F, 5, 5, 6, scale); - rightarmPauldron.setRotationPoint(0F, 0F, 0F); - rightarmPauldron.setTextureSize(128, 64); - setRotation(rightarmPauldron, 0F, 0F, -0.2792527F); - - leftarmArmour = new ModelRenderer(this, 76, 38); - leftarmArmour.mirror = true; - leftarmArmour.addBox(-1.0F, -2.5F, -2.5F, 5, 9, 5, scale); - leftarmArmour.setRotationPoint(0F, 0F, 0F); - leftarmArmour.setTextureSize(128, 64); - setRotation(leftarmArmour, 0F, -0F, 0F); - - rightarmArmour = new ModelRenderer(this, 76, 38); - rightarmArmour.addBox(-4F, -2.5F, -2.5F, 5, 9, 5, scale); - rightarmArmour.setRotationPoint(0F, 0F, 0F); - rightarmArmour.setTextureSize(128, 64); - setRotation(rightarmArmour, 0F, 0F, 0F); - - // LEGS ARMOUR - rightlegArmour = new ModelRenderer(this, 56, 16); - rightlegArmour.addBox(-2.5F, -0.5F, -2.5F, 5, 9, 5, scale); - rightlegArmour.setRotationPoint(0F, 0F, 0F); - rightlegArmour.setTextureSize(128, 64); - setRotation(rightlegArmour, 0F, 0F, 0F); - - leftlegArmour = new ModelRenderer(this, 56, 16); - leftlegArmour.mirror = true; - leftlegArmour.addBox(-2.5F, -0.5F, -2.5F, 5, 9, 5, scale); - leftlegArmour.setRotationPoint(0F, 0F, 0F); - leftlegArmour.setTextureSize(128, 64); - setRotation(leftlegArmour, 0F, -0F, 0F); - - // GROUPING - this.bipedBody.addChild(bodyArmour); - this.bipedBody.addChild(bodyBack); - - this.bipedLeftArm.addChild(leftarmPauldron); - this.bipedLeftArm.addChild(leftarmArmour); - - this.bipedRightArm.addChild(rightarmPauldron); - this.bipedRightArm.addChild(rightarmArmour); - - this.bipedLeftLeg.addChild(leftlegArmour); - this.bipedRightLeg.addChild(rightlegArmour); - this.bipedLeftLeg.addChild(leftfoot); - this.bipedRightLeg.addChild(rightfoot); - - this.bipedHead.addChild(headArmour); - this.bipedHeadwear.addChild(headMask); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - @Override - public void render(Entity entity, float f1, float f2, float f3, float f4, float f5, float scale) { - heldItemRight = 0; - aimedBow = false; - boolean isEmpty = true; - boolean isWornByPlayer = false; - if (entity instanceof EntityPlayer) { - isEmpty = false; - boolean CP = Minecraft.getMinecraft().thePlayer == entity; - isWornByPlayer = Minecraft.getMinecraft().gameSettings.thirdPersonView == 0 && CP; - - EntityPlayer player = (EntityPlayer) entity; - - ItemStack itemstack = player.getHeldItem(); - heldItemRight = itemstack == null ? 0 : 1; - if (itemstack != null && player.getItemInUseCount() > 0) { - EnumAction enumaction = itemstack.getItemUseAction(); - - if (enumaction == EnumAction.block) { - heldItemRight = 3; - } else if (enumaction == EnumAction.bow) { - aimedBow = true; - } - } - } - this.setRotationAngles(f1, f2, isEmpty ? 0F : f3, f4, f5, scale, entity); - bipedHead.rotationPointY = bipedHeadwear.rotationPointY = -2F; - this.bipedBody.rotationPointZ = this.bipedLeftLeg.rotationPointZ = this.bipedRightLeg.rotationPointZ = isWornByPlayer - ? 6F - : 0F; - this.bipedLeftArm.isHidden = this.bipedRightArm.isHidden = this.leftarmArmour.isHidden = this.rightarmArmour.isHidden = isWornByPlayer; - - if (!isWornByPlayer) { - this.bipedHead.render(scale); - this.bipedHeadwear.render(scale); - } - this.bipedRightArm.render(scale); - this.bipedLeftArm.render(scale); - this.bipedBody.render(scale); - this.bipedRightLeg.render(scale); - this.bipedLeftLeg.render(scale); - } + ModelRenderer rightfoot; + ModelRenderer leftfoot; + + ModelRenderer headMask; + ModelRenderer bodyBack; + ModelRenderer rightarmPauldron; + ModelRenderer rightlegArmour; + ModelRenderer leftlegArmour; + ModelRenderer leftarmPauldron; + ModelRenderer rightarmArmour; + ModelRenderer leftarmArmour; + ModelRenderer headArmour; + ModelRenderer bodyArmour; + + // RenderCogwork + public ModelCogwork() { + this(1F); + } + + public ModelCogwork(float scale) { + this(scale, -2F * scale, 128, 64); + } + + public ModelCogwork(float scale, float offset, int texWidth, int texHeight) { + this.textureWidth = texWidth; + this.textureHeight = texHeight; + // FRAME + this.bipedHead = new ModelRenderer(this, 0, 0); + this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, scale); + this.bipedHead.setRotationPoint(0.0F, 0F + offset, 0.0F); + + this.bipedHeadwear = new ModelRenderer(this, 32, 0); + this.bipedHeadwear.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, scale + 0.5F); + this.bipedHeadwear.setRotationPoint(0.0F, 0F + offset, 0.0F); + + this.bipedBody = new ModelRenderer(this, 16, 16); + this.bipedBody.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, scale); + this.bipedBody.setRotationPoint(0.0F, 0.0F + offset, 0.0F); + + this.bipedRightArm = new ModelRenderer(this, 40, 16); + this.bipedRightArm.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, scale); + this.bipedRightArm.setRotationPoint(-5.0F, 2.0F + offset, 0.0F); + + this.bipedLeftArm = new ModelRenderer(this, 40, 16); + this.bipedLeftArm.mirror = true; + this.bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, scale); + this.bipedLeftArm.setRotationPoint(5.0F, 2.0F + offset, 0.0F); + + this.bipedRightLeg = new ModelRenderer(this, 0, 16); + this.bipedRightLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 8, 4, scale); + this.bipedRightLeg.setRotationPoint(-1.9F, 12.0F + offset, 0.0F); + + this.bipedLeftLeg = new ModelRenderer(this, 0, 16); + this.bipedLeftLeg.mirror = true; + this.bipedLeftLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 8, 4, scale); + this.bipedLeftLeg.setRotationPoint(1.9F, 12.0F + offset, 0.0F); + + rightfoot = new ModelRenderer(this, 0, 53); + rightfoot.addBox(-2F, 0F, -3F, 4, 3, 5, scale); + rightfoot.setRotationPoint(0F, 10F, 0F); + rightfoot.setTextureSize(128, 64); + setRotation(rightfoot, 0F, 0F, 0F); + + leftfoot = new ModelRenderer(this, 0, 53); + leftfoot.mirror = true; + leftfoot.addBox(-2F, 0F, -3F, 4, 3, 5, scale); + leftfoot.setRotationPoint(0F, 10F, 0F); + leftfoot.setTextureSize(128, 64); + + // HEAD ARMOUR + headMask = new ModelRenderer(this, 76, 18); + headMask.addBox(-2F, -3.5F, -6.5F, 4, 5, 3, scale); + headMask.setRotationPoint(0F, 0F, 0F); + headMask.setTextureSize(128, 64); + + headArmour = new ModelRenderer(this, 78, 0); + headArmour.addBox(-4.5F, -8.5F, -4.5F, 9, 9, 9, scale); + headArmour.setRotationPoint(0F, 0F, 0F); + headArmour.setTextureSize(128, 64); + setRotation(headArmour, 0F, 0F, 0F); + + // BODY ARMOUR + bodyBack = new ModelRenderer(this, 34, 32); + bodyBack.addBox(-3.5F, -0.5F, 4F, 7, 9, 3, scale); + bodyBack.setRotationPoint(0F, 0F, 0F); + bodyBack.setTextureSize(128, 64); + setRotation(bodyBack, 0F, 0F, 0F); + + bodyArmour = new ModelRenderer(this, 0, 32); + bodyArmour.addBox(-4.5F, -0.5F, -4F, 9, 13, 8, scale); + bodyArmour.setRotationPoint(0F, 0F, 0F); + bodyArmour.setTextureSize(128, 64); + setRotation(bodyArmour, 0F, 0F, 0F); + + // ARMS ARMOUR + leftarmPauldron = new ModelRenderer(this, 76, 27); + leftarmPauldron.mirror = true; + leftarmPauldron.addBox(0F, -4F, -3F, 5, 5, 6, scale); + leftarmPauldron.setRotationPoint(0F, 0F, 0F); + leftarmPauldron.setTextureSize(128, 64); + setRotation(leftarmPauldron, 0F, 0F, 0.2792527F); + + rightarmPauldron = new ModelRenderer(this, 76, 27); + rightarmPauldron.addBox(-5F, -4F, -3F, 5, 5, 6, scale); + rightarmPauldron.setRotationPoint(0F, 0F, 0F); + rightarmPauldron.setTextureSize(128, 64); + setRotation(rightarmPauldron, 0F, 0F, -0.2792527F); + + leftarmArmour = new ModelRenderer(this, 76, 38); + leftarmArmour.mirror = true; + leftarmArmour.addBox(-1.0F, -2.5F, -2.5F, 5, 9, 5, scale); + leftarmArmour.setRotationPoint(0F, 0F, 0F); + leftarmArmour.setTextureSize(128, 64); + setRotation(leftarmArmour, 0F, -0F, 0F); + + rightarmArmour = new ModelRenderer(this, 76, 38); + rightarmArmour.addBox(-4F, -2.5F, -2.5F, 5, 9, 5, scale); + rightarmArmour.setRotationPoint(0F, 0F, 0F); + rightarmArmour.setTextureSize(128, 64); + setRotation(rightarmArmour, 0F, 0F, 0F); + + // LEGS ARMOUR + rightlegArmour = new ModelRenderer(this, 56, 16); + rightlegArmour.addBox(-2.5F, -0.5F, -2.5F, 5, 9, 5, scale); + rightlegArmour.setRotationPoint(0F, 0F, 0F); + rightlegArmour.setTextureSize(128, 64); + setRotation(rightlegArmour, 0F, 0F, 0F); + + leftlegArmour = new ModelRenderer(this, 56, 16); + leftlegArmour.mirror = true; + leftlegArmour.addBox(-2.5F, -0.5F, -2.5F, 5, 9, 5, scale); + leftlegArmour.setRotationPoint(0F, 0F, 0F); + leftlegArmour.setTextureSize(128, 64); + setRotation(leftlegArmour, 0F, -0F, 0F); + + // GROUPING + this.bipedBody.addChild(bodyArmour); + this.bipedBody.addChild(bodyBack); + + this.bipedLeftArm.addChild(leftarmPauldron); + this.bipedLeftArm.addChild(leftarmArmour); + + this.bipedRightArm.addChild(rightarmPauldron); + this.bipedRightArm.addChild(rightarmArmour); + + this.bipedLeftLeg.addChild(leftlegArmour); + this.bipedRightLeg.addChild(rightlegArmour); + this.bipedLeftLeg.addChild(leftfoot); + this.bipedRightLeg.addChild(rightfoot); + + this.bipedHead.addChild(headArmour); + this.bipedHeadwear.addChild(headMask); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + @Override + public void render(Entity entity, float f1, float f2, float f3, float f4, float f5, float scale) { + heldItemRight = 0; + aimedBow = false; + boolean isEmpty = true; + boolean isWornByPlayer = false; + if (entity instanceof EntityPlayer) { + isEmpty = false; + boolean CP = Minecraft.getMinecraft().thePlayer == entity; + isWornByPlayer = Minecraft.getMinecraft().gameSettings.thirdPersonView == 0 && CP; + + EntityPlayer player = (EntityPlayer) entity; + + ItemStack itemstack = player.getHeldItem(); + heldItemRight = itemstack == null ? 0 : 1; + if (itemstack != null && player.getItemInUseCount() > 0) { + EnumAction enumaction = itemstack.getItemUseAction(); + + if (enumaction == EnumAction.block) { + heldItemRight = 3; + } else if (enumaction == EnumAction.bow) { + aimedBow = true; + } + } + } + this.setRotationAngles(f1, f2, isEmpty ? 0F : f3, f4, f5, scale, entity); + bipedHead.rotationPointY = bipedHeadwear.rotationPointY = -2F; + this.bipedBody.rotationPointZ = this.bipedLeftLeg.rotationPointZ = this.bipedRightLeg.rotationPointZ = isWornByPlayer + ? 6F + : 0F; + this.bipedLeftArm.isHidden = this.bipedRightArm.isHidden = this.leftarmArmour.isHidden = this.rightarmArmour.isHidden = isWornByPlayer; + + if (!isWornByPlayer) { + this.bipedHead.render(scale); + this.bipedHeadwear.render(scale); + } + this.bipedRightArm.render(scale); + this.bipedLeftArm.render(scale); + this.bipedBody.render(scale); + this.bipedRightLeg.render(scale); + this.bipedLeftLeg.render(scale); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/ModelParachute.java b/src/main/java/minefantasy/mf2/client/render/ModelParachute.java index db6655bb..b5a6adbd 100644 --- a/src/main/java/minefantasy/mf2/client/render/ModelParachute.java +++ b/src/main/java/minefantasy/mf2/client/render/ModelParachute.java @@ -5,91 +5,91 @@ import net.minecraft.entity.Entity; public class ModelParachute extends ModelBase { - // fields - ModelRenderer chuteSegment5; - ModelRenderer harness; - ModelRenderer chuteSegment1; - ModelRenderer chuteSegment2; - ModelRenderer chuteSegment3; - ModelRenderer chuteSegment4; - ModelRenderer cable4; - ModelRenderer cable1; - ModelRenderer cable2; - ModelRenderer cable3; + // fields + ModelRenderer chuteSegment5; + ModelRenderer harness; + ModelRenderer chuteSegment1; + ModelRenderer chuteSegment2; + ModelRenderer chuteSegment3; + ModelRenderer chuteSegment4; + ModelRenderer cable4; + ModelRenderer cable1; + ModelRenderer cable2; + ModelRenderer cable3; - public ModelParachute() { - textureWidth = 64; - textureHeight = 32; + public ModelParachute() { + textureWidth = 64; + textureHeight = 32; - chuteSegment5 = new ModelRenderer(this, 28, 14); - chuteSegment5.addBox(-4.5F, -32F, -13.5F, 9, 9, 9); - chuteSegment5.setRotationPoint(0F, 0F, 0F); - chuteSegment5.setTextureSize(64, 32); - setRotation(chuteSegment5, 0F, 0F, 0F); - harness = new ModelRenderer(this, 28, -9); - harness.addBox(-4.5F, -4.5F, -4.5F, 9, 9, 9); - harness.setRotationPoint(0F, 0F, 0F); - harness.setTextureSize(64, 32); - setRotation(harness, 0F, 0F, 0F); - chuteSegment1 = new ModelRenderer(this, 28, 14); - chuteSegment1.addBox(-4.5F, -41F, -4.5F, 9, 9, 9); - chuteSegment1.setRotationPoint(0F, 0F, 0F); - chuteSegment1.setTextureSize(64, 32); - setRotation(chuteSegment1, 0F, 0F, 0F); - chuteSegment2 = new ModelRenderer(this, 28, 14); - chuteSegment2.addBox(-13.5F, -32F, -4.5F, 9, 9, 9); - chuteSegment2.setRotationPoint(0F, 0F, 0F); - chuteSegment2.setTextureSize(64, 32); - setRotation(chuteSegment2, 0F, 0F, 0F); - chuteSegment3 = new ModelRenderer(this, 28, 14); - chuteSegment3.addBox(4.5F, -32F, -4.5F, 9, 9, 9); - chuteSegment3.setRotationPoint(0F, 0F, 0F); - chuteSegment3.setTextureSize(64, 32); - setRotation(chuteSegment3, 0F, 0F, 0F); - chuteSegment4 = new ModelRenderer(this, 28, 14); - chuteSegment4.addBox(-4.5F, -32F, 4.5F, 9, 9, 9); - chuteSegment4.setRotationPoint(0F, 0F, 0F); - chuteSegment4.setTextureSize(64, 32); - setRotation(chuteSegment4, 0F, 0F, 0F); - cable4 = new ModelRenderer(this, 0, 0); - cable4.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); - cable4.setRotationPoint(0F, -4F, 0F); - cable4.setTextureSize(64, 32); - setRotation(cable4, 0F, 0F, -0.5235988F); - cable1 = new ModelRenderer(this, 0, 0); - cable1.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); - cable1.setRotationPoint(0F, -4F, 0F); - cable1.setTextureSize(64, 32); - setRotation(cable1, 0.5235988F, 0F, 0F); - cable2 = new ModelRenderer(this, 0, 0); - cable2.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); - cable2.setRotationPoint(0F, -4F, 0F); - cable2.setTextureSize(64, 32); - setRotation(cable2, -0.5235988F, 0F, 0F); - cable3 = new ModelRenderer(this, 0, 0); - cable3.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); - cable3.setRotationPoint(0F, -4F, 0F); - cable3.setTextureSize(64, 32); - setRotation(cable3, 0F, 0F, 0.5235988F); - } + chuteSegment5 = new ModelRenderer(this, 28, 14); + chuteSegment5.addBox(-4.5F, -32F, -13.5F, 9, 9, 9); + chuteSegment5.setRotationPoint(0F, 0F, 0F); + chuteSegment5.setTextureSize(64, 32); + setRotation(chuteSegment5, 0F, 0F, 0F); + harness = new ModelRenderer(this, 28, -9); + harness.addBox(-4.5F, -4.5F, -4.5F, 9, 9, 9); + harness.setRotationPoint(0F, 0F, 0F); + harness.setTextureSize(64, 32); + setRotation(harness, 0F, 0F, 0F); + chuteSegment1 = new ModelRenderer(this, 28, 14); + chuteSegment1.addBox(-4.5F, -41F, -4.5F, 9, 9, 9); + chuteSegment1.setRotationPoint(0F, 0F, 0F); + chuteSegment1.setTextureSize(64, 32); + setRotation(chuteSegment1, 0F, 0F, 0F); + chuteSegment2 = new ModelRenderer(this, 28, 14); + chuteSegment2.addBox(-13.5F, -32F, -4.5F, 9, 9, 9); + chuteSegment2.setRotationPoint(0F, 0F, 0F); + chuteSegment2.setTextureSize(64, 32); + setRotation(chuteSegment2, 0F, 0F, 0F); + chuteSegment3 = new ModelRenderer(this, 28, 14); + chuteSegment3.addBox(4.5F, -32F, -4.5F, 9, 9, 9); + chuteSegment3.setRotationPoint(0F, 0F, 0F); + chuteSegment3.setTextureSize(64, 32); + setRotation(chuteSegment3, 0F, 0F, 0F); + chuteSegment4 = new ModelRenderer(this, 28, 14); + chuteSegment4.addBox(-4.5F, -32F, 4.5F, 9, 9, 9); + chuteSegment4.setRotationPoint(0F, 0F, 0F); + chuteSegment4.setTextureSize(64, 32); + setRotation(chuteSegment4, 0F, 0F, 0F); + cable4 = new ModelRenderer(this, 0, 0); + cable4.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); + cable4.setRotationPoint(0F, -4F, 0F); + cable4.setTextureSize(64, 32); + setRotation(cable4, 0F, 0F, -0.5235988F); + cable1 = new ModelRenderer(this, 0, 0); + cable1.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); + cable1.setRotationPoint(0F, -4F, 0F); + cable1.setTextureSize(64, 32); + setRotation(cable1, 0.5235988F, 0F, 0F); + cable2 = new ModelRenderer(this, 0, 0); + cable2.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); + cable2.setRotationPoint(0F, -4F, 0F); + cable2.setTextureSize(64, 32); + setRotation(cable2, -0.5235988F, 0F, 0F); + cable3 = new ModelRenderer(this, 0, 0); + cable3.addBox(-0.5F, -23F, -0.5F, 1, 24, 1); + cable3.setRotationPoint(0F, -4F, 0F); + cable3.setTextureSize(64, 32); + setRotation(cable3, 0F, 0F, 0.5235988F); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - chuteSegment5.render(f5); - harness.render(f5); - chuteSegment1.render(f5); - chuteSegment2.render(f5); - chuteSegment3.render(f5); - chuteSegment4.render(f5); - cable4.render(f5); - cable1.render(f5); - cable2.render(f5); - cable3.render(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + chuteSegment5.render(f5); + harness.render(f5); + chuteSegment1.render(f5); + chuteSegment2.render(f5); + chuteSegment3.render(f5); + chuteSegment4.render(f5); + cable4.render(f5); + cable1.render(f5); + cable2.render(f5); + cable3.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/RenderArrowMF.java b/src/main/java/minefantasy/mf2/client/render/RenderArrowMF.java index ba7c61be..30996773 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderArrowMF.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderArrowMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.client.render; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -12,88 +9,90 @@ import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; @SideOnly(Side.CLIENT) public class RenderArrowMF extends Render { - public void renderArrow(EntityArrowMF arrow, double x, double y, double z, float xr, float yr) { - this.loadTexture(arrow.getTexture() + ".png"); - GL11.glPushMatrix(); - GL11.glTranslatef((float) x, (float) y, (float) z); - GL11.glRotatef(arrow.prevRotationYaw + (arrow.rotationYaw - arrow.prevRotationYaw) * yr - 90.0F, 0.0F, 1.0F, - 0.0F); - GL11.glRotatef(arrow.prevRotationPitch + (arrow.rotationPitch - arrow.prevRotationPitch) * yr, 0.0F, 0.0F, - 1.0F); - Tessellator var10 = Tessellator.instance; - byte var11 = 0; - float var12 = 0.0F; - float var13 = 0.5F; - float var14 = (0 + var11 * 10) / 32.0F; - float var15 = (5 + var11 * 10) / 32.0F; - float var16 = 0.0F; - float var17 = 0.15625F; - float var18 = (5 + var11 * 10) / 32.0F; - float var19 = (10 + var11 * 10) / 32.0F; - float var20 = 0.05625F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - float var21 = arrow.arrowShake - yr; + public void renderArrow(EntityArrowMF arrow, double x, double y, double z, float xr, float yr) { + this.loadTexture(arrow.getTexture() + ".png"); + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y, (float) z); + GL11.glRotatef(arrow.prevRotationYaw + (arrow.rotationYaw - arrow.prevRotationYaw) * yr - 90.0F, 0.0F, 1.0F, + 0.0F); + GL11.glRotatef(arrow.prevRotationPitch + (arrow.rotationPitch - arrow.prevRotationPitch) * yr, 0.0F, 0.0F, + 1.0F); + Tessellator var10 = Tessellator.instance; + byte var11 = 0; + float var12 = 0.0F; + float var13 = 0.5F; + float var14 = (0 + var11 * 10) / 32.0F; + float var15 = (5 + var11 * 10) / 32.0F; + float var16 = 0.0F; + float var17 = 0.15625F; + float var18 = (5 + var11 * 10) / 32.0F; + float var19 = (10 + var11 * 10) / 32.0F; + float var20 = 0.05625F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + float var21 = arrow.arrowShake - yr; - if (var21 > 0.0F) { - float var22 = -MathHelper.sin(var21 * 3.0F) * var21; - GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F); - } + if (var21 > 0.0F) { + float var22 = -MathHelper.sin(var21 * 3.0F) * var21; + GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F); + } - GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); - GL11.glScalef(var20, var20, var20); - GL11.glTranslatef(-4.0F, 0.0F, 0.0F); - GL11.glNormal3f(var20, 0.0F, 0.0F); - var10.startDrawingQuads(); - var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var18); - var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var18); - var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var19); - var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var19); - var10.draw(); - GL11.glNormal3f(-var20, 0.0F, 0.0F); - var10.startDrawingQuads(); - var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var18); - var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var18); - var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var19); - var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var19); - var10.draw(); + GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); + GL11.glScalef(var20, var20, var20); + GL11.glTranslatef(-4.0F, 0.0F, 0.0F); + GL11.glNormal3f(var20, 0.0F, 0.0F); + var10.startDrawingQuads(); + var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var18); + var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var18); + var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var19); + var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var19); + var10.draw(); + GL11.glNormal3f(-var20, 0.0F, 0.0F); + var10.startDrawingQuads(); + var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var18); + var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var18); + var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var19); + var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var19); + var10.draw(); - for (int var23 = 0; var23 < 4; ++var23) { - GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); - GL11.glNormal3f(0.0F, 0.0F, var20); - var10.startDrawingQuads(); - var10.addVertexWithUV(-8.0D, -2.0D, 0.0D, var12, var14); - var10.addVertexWithUV(8.0D, -2.0D, 0.0D, var13, var14); - var10.addVertexWithUV(8.0D, 2.0D, 0.0D, var13, var15); - var10.addVertexWithUV(-8.0D, 2.0D, 0.0D, var12, var15); - var10.draw(); - } + for (int var23 = 0; var23 < 4; ++var23) { + GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); + GL11.glNormal3f(0.0F, 0.0F, var20); + var10.startDrawingQuads(); + var10.addVertexWithUV(-8.0D, -2.0D, 0.0D, var12, var14); + var10.addVertexWithUV(8.0D, -2.0D, 0.0D, var13, var14); + var10.addVertexWithUV(8.0D, 2.0D, 0.0D, var13, var15); + var10.addVertexWithUV(-8.0D, 2.0D, 0.0D, var12, var15); + var10.draw(); + } - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - GL11.glPopMatrix(); - } + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } - /** - * Actually renders the given argument. This is a synthetic bridge method, - * always casting down its argument and then handing it off to a worker function - * which does the actual work. In all probabilty, the class Render is generic - * (Render= 18) - drawAmount = 2; - else if (timer > 13) - drawAmount = 1; - else if (timer > 0) - drawAmount = 0; - - } - - ItemStack quiver = QuiverArrowRegistry.getArrowContainer(item, (EntityPlayer) entityLivingBase); - if (quiver != null) { - arrowStack = ((IArrowContainer2) quiver.getItem()).getStackInSlot(quiver, - ((IArrowContainer2) quiver.getItem()).getSelectedSlot(quiver)); - } - - if (timer == 0) { - arrowStack = null; - } - } else { - drawAmount = 2; - } - - Tessellator tessellator = Tessellator.instance; - - GL11.glPushMatrix(); - if (isLongbow) { - GL11.glTranslatef(-1 / 3F, -1 / 3F, 0F); - GL11.glScalef(1.5F, 1.5F, 1.0F); - if (entityLivingBase == null) { - GL11.glTranslatef((0F / 16F), -(4F / 16F), 0F); - } - } - for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { - IIcon icon = item.getItem().getIcon(item, layer); - - if (bow != null) { - icon = bow.getIcon(item, layer, drawAmount); - } - - GL11.glPushMatrix(); - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), - icon.getIconWidth(), icon.getIconHeight(), 0.0625F); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); - } - GL11.glPopMatrix(); - - if (arrowStack == null && drawAmount > -2) { - arrowStack = new ItemStack(Items.arrow); - } - if (arrowStack != null && entityLivingBase != null) { - int x = -3; - int y = -20; - - if (isLongbow) { - x += 1; - y += 1; - } - for (int layer = 0; layer < arrowStack.getItem().getRenderPasses(arrowStack.getItemDamage()); layer++) { - IIcon icon = arrowStack.getItem().getIcon(arrowStack, layer); - GL11.glPushMatrix(); - - int colour = arrowStack.getItem().getColorFromItemStack(arrowStack, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - GL11.glTranslatef(-(x + drawAmount) / 16F, -(y + drawAmount) / 16F, - firstPerson ? -0.5F / 16F : 0.5F / 16F); - GL11.glRotatef(-90, 0, 0, 1); - ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), - icon.getIconWidth(), icon.getIconHeight(), 0.0625F); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); - } - } - - if (item.isItemEnchanted()) { - renderEnchantmentEffects(tessellator); - } - GL11.glPopMatrix(); - } - - public static void renderEnchantmentEffects(Tessellator tessellator) { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - FMLClientHandler.instance().getClient().renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - float f7 = 0.76F; - GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float f8 = 0.125F; - GL11.glScalef(f8, f8, f8); - float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; - GL11.glTranslatef(f9, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(f8, f8, f8); - f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; - GL11.glTranslatef(-f9, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } + private boolean isLongbow; + + public RenderBow(boolean big) { + isLongbow = big; + } + + public static void renderEnchantmentEffects(Tessellator tessellator) { + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + float f7 = 0.76F; + GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glPushMatrix(); + float f8 = 0.125F; + GL11.glScalef(f8, f8, f8); + float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; + GL11.glTranslatef(f9, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(f8, f8, f8); + f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; + GL11.glTranslatef(-f9, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + if (data.length < 2 || !(data[1] instanceof EntityLivingBase)) { + renderEquippedBow(item, (EntityLivingBase) null, false); + } else { + switch (type) { + case EQUIPPED_FIRST_PERSON: + renderEquippedBow(item, (EntityLivingBase) data[1], true); + break; + case EQUIPPED: + renderEquippedBow(item, (EntityLivingBase) data[1], false); + break; + default: + break; + } + } + } + + private void renderEquippedBow(ItemStack item, EntityLivingBase entityLivingBase, boolean firstPerson) { + GL11.glPushMatrix(); + if (firstPerson) { + GL11.glTranslatef(0.1F, -0.1F, 0F); + } else { + GL11.glTranslatef(0.2F, -0.25F, 0F); + } + + ItemBowMF bow = null; + if (item != null && item.getItem() instanceof ItemBowMF) { + bow = (ItemBowMF) item.getItem(); + } + + ItemStack arrowStack = AmmoMechanicsMF.getArrowOnBow(item); + + int drawAmount = -2; + + if (entityLivingBase != null && entityLivingBase instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) entityLivingBase; + + int timer = player.getItemInUseDuration(); + + if (bow != null) { + drawAmount = bow.getDrawAmount(timer); + // arrowStack = bow.getArrow(item); + } else { + if (timer >= 18) + drawAmount = 2; + else if (timer > 13) + drawAmount = 1; + else if (timer > 0) + drawAmount = 0; + + } + + ItemStack quiver = QuiverArrowRegistry.getArrowContainer(item, (EntityPlayer) entityLivingBase); + if (quiver != null) { + arrowStack = ((IArrowContainer2) quiver.getItem()).getStackInSlot(quiver, + ((IArrowContainer2) quiver.getItem()).getSelectedSlot(quiver)); + } + + if (timer == 0) { + arrowStack = null; + } + } else { + drawAmount = 2; + } + + Tessellator tessellator = Tessellator.instance; + + GL11.glPushMatrix(); + if (isLongbow) { + GL11.glTranslatef(-1 / 3F, -1 / 3F, 0F); + GL11.glScalef(1.5F, 1.5F, 1.0F); + if (entityLivingBase == null) { + GL11.glTranslatef((0F / 16F), -(4F / 16F), 0F); + } + } + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + IIcon icon = item.getItem().getIcon(item, layer); + + if (bow != null) { + icon = bow.getIcon(item, layer, drawAmount); + } + + GL11.glPushMatrix(); + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 0.0625F); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + + if (arrowStack == null && drawAmount > -2) { + arrowStack = new ItemStack(Items.arrow); + } + if (arrowStack != null && entityLivingBase != null) { + int x = -3; + int y = -20; + + if (isLongbow) { + x += 1; + y += 1; + } + for (int layer = 0; layer < arrowStack.getItem().getRenderPasses(arrowStack.getItemDamage()); layer++) { + IIcon icon = arrowStack.getItem().getIcon(arrowStack, layer); + GL11.glPushMatrix(); + + int colour = arrowStack.getItem().getColorFromItemStack(arrowStack, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + GL11.glTranslatef(-(x + drawAmount) / 16F, -(y + drawAmount) / 16F, + firstPerson ? -0.5F / 16F : 0.5F / 16F); + GL11.glRotatef(-90, 0, 0, 1); + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 0.0625F); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); + } + } + + if (item.isItemEnchanted()) { + renderEnchantmentEffects(tessellator); + } + GL11.glPopMatrix(); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java b/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java index f92da2af..a3ab3eac 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java @@ -1,16 +1,6 @@ package minefantasy.mf2.client.render; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import cpw.mods.fml.client.FMLClientHandler; -/** - * - * @author Anonymous Productions - * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. - */ import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.item.gadget.ItemCrossbow; @@ -23,278 +13,287 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +/** + * @author Anonymous Productions + *

+ * Sources are provided for educational reasons. + * though small bits of code, or methods can be used in your own creations. + */ public class RenderCrossbow implements IItemRenderer { - private float scale; - RenderItem renderItem = new RenderItem(); - - public RenderCrossbow(float sc) { - scale = sc; - } - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return false; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - Minecraft mc = FMLClientHandler.instance().getClient(); - EntityLivingBase player = null; - ItemCrossbow crossbow = (ItemCrossbow) item.getItem(); - - if (type.equals(ItemRenderType.EQUIPPED)) { - // GL11.glRotatef(45, 0F, 1F, -1F); - renderPart(item, player, "stock"); - renderPart(item, player, "mechanism"); - renderPart(item, player, "string"); - renderPart(item, player, "muzzle"); - renderPart(item, player, "mod"); - } - if (type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON) && crossbow.getZoom(item) < 0.1F) { - renderPart(item, player, "stock"); - renderPart(item, player, "mechanism"); - renderPart(item, player, "string"); - renderPart(item, player, "muzzle"); - renderPart(item, player, "mod"); - } - } - - private void renderPart(ItemStack item, EntityLivingBase player, String iconName) { - - GL11.glPushMatrix(); - - GL11.glTranslatef(0.75F, -0.25F, 0F); - GL11.glTranslatef(0f, 0f, 0); - doRenderPart(item, iconName); - - GL11.glPopMatrix(); - - } - - private void doRenderPart(ItemStack item, String iconName) { - boolean flip = iconName.equalsIgnoreCase("mechanism") || iconName.equalsIgnoreCase("string"); - boolean isHead = iconName.equalsIgnoreCase("mechanism"); - - GL11.glPushMatrix(); - float x = -0.35F; - float y = 0.5F; - - ItemCrossbow bow = (ItemCrossbow) item.getItem(); - if (scale == 2.0F) { - x -= 0.625F; - y -= 0.425F; - } - if (flip) { - y += 0F;// bow.headYoffset(); - x += 0F;// bow.headXoffset(); - } - GL11.glTranslatef(x, y, 0); - if (flip) { - GL11.glTranslatef(0, -0.1F, 0); - GL11.glScalef(scale, scale, scale); - } else { - GL11.glScalef(scale, scale, 1.0F); - GL11.glTranslatef(0F, 0F, 0.0625F / 2F); - } - Minecraft mc = FMLClientHandler.instance().getClient(); - if (item != null) - mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - - if (flip) { - GL11.glRotatef(90, 1, 1, 0); - } - if (iconName.equalsIgnoreCase("string")) { - GL11.glTranslatef(0F, 0F, -(4 / 64F)); - GL11.glScaled(1F, 1F, 0.25F); - } - - Tessellator tessellator = Tessellator.instance; - ItemCrossbow crossbow = (ItemCrossbow) item.getItem(); - IIcon icon = crossbow.getPartIcon(item, iconName); - renderIcon(mc, item, tessellator, icon, true); - - if (isHead) { - int slot = 1; - GL11.glPushMatrix(); - float m = 0.01F; - if (slot % 2 == 0) { - m = 0; - } - - GL11.glTranslatef(0.1F - m + (7F / 32F), 0.35F - m + (7F / 32F), -(slot + 1) / 64F - (1F / 32F)); - - float ammoSize = 0.5F; - - GL11.glScalef(0.5F, 0.5F, 0.5F); - GL11.glRotatef(90F, 0F, 0F, -1F); - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); - - if (loaded != null) { - mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - for (int layer = 0; layer < loaded.getItem().getRenderPasses(loaded.getItemDamage()); layer++) { - GL11.glPushMatrix(); - IIcon bolt = loaded.getItem().getIcon(loaded, layer); - - int colour = loaded.getItem().getColorFromItemStack(loaded, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - renderIcon(mc, item, tessellator, bolt, ammoSize, false); - GL11.glPopMatrix(); - } - } - GL11.glPopMatrix(); - } - GL11.glPopMatrix(); - - } - - private void renderIcon(Minecraft mc, ItemStack item, Tessellator tessellator, IIcon icon, boolean enchant) { - renderIcon(mc, item, tessellator, icon, 1.0F, enchant); - } - - private void renderIcon(Minecraft mc, ItemStack item, Tessellator tessellator, IIcon icon, float scale, - boolean enchant) { - if (icon == null) - return; - - float x1 = icon.getMinU(); - float x2 = icon.getMaxU(); - float y1 = icon.getMinV(); - float y2 = icon.getMaxV(); - float var10 = 0.0F; - float var11 = 0.3F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - /* + RenderItem renderItem = new RenderItem(); + private float scale; + + public RenderCrossbow(float sc) { + scale = sc; + } + + public static void draw2dItem(Tessellator tessellator, float f, float f1, float f2, float f3, float thickness, + float res, float resSq) { + float f4 = 1.0F; + float f5 = 0.0625F * thickness; + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, f, f3); + tessellator.addVertexWithUV(f4, 0.0D, 0.0D, f2, f3); + tessellator.addVertexWithUV(f4, 1.0D, 0.0D, f2, f1); + tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, f, f1); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, -1F); + tessellator.addVertexWithUV(0.0D, 1.0D, 0.0F - f5, f, f1); + tessellator.addVertexWithUV(f4, 1.0D, 0.0F - f5, f2, f1); + tessellator.addVertexWithUV(f4, 0.0D, 0.0F - f5, f2, f3); + tessellator.addVertexWithUV(0.0D, 0.0D, 0.0F - f5, f, f3); + tessellator.draw(); + + tessellator.startDrawingQuads(); + tessellator.setNormal(-1F, 0.0F, 0.0F); + for (int i = 0; i < res; i++) { + float f6 = i / res; + float f10 = (f + (f2 - f) * f6) - (1 / (2 * resSq)); + float f14 = f4 * f6; + tessellator.addVertexWithUV(f14, 0.0D, 0.0F - f5, f10, f3); + tessellator.addVertexWithUV(f14, 0.0D, 0.0D, f10, f3); + tessellator.addVertexWithUV(f14, 1.0D, 0.0D, f10, f1); + tessellator.addVertexWithUV(f14, 1.0D, 0.0F - f5, f10, f1); + } + + tessellator.draw(); + + tessellator.startDrawingQuads(); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + for (int j = 0; j < res; j++) { + float f7 = j / res; + float f11 = (f + (f2 - f) * f7) - (1 / (2 * resSq)); + float f15 = f4 * f7 + 1 / (res - .01F); + tessellator.addVertexWithUV(f15, 1.0D, 0.0F - f5, f11, f1); + tessellator.addVertexWithUV(f15, 1.0D, 0.0D, f11, f1); + tessellator.addVertexWithUV(f15, 0.0D, 0.0D, f11, f3); + tessellator.addVertexWithUV(f15, 0.0D, 0.0F - f5, f11, f3); + } + + tessellator.draw(); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + for (int k = 0; k < res; k++) { + float f8 = k / res; + float f12 = (f3 + (f1 - f3) * f8) - (1 / (2 * resSq)); + float f16 = f4 * f8 + 1 / (res - .01F); + tessellator.addVertexWithUV(0.0D, f16, 0.0D, f, f12); + tessellator.addVertexWithUV(f4, f16, 0.0D, f2, f12); + tessellator.addVertexWithUV(f4, f16, 0.0F - f5, f2, f12); + tessellator.addVertexWithUV(0.0D, f16, 0.0F - f5, f, f12); + } + + tessellator.draw(); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, -1F, 0.0F); + for (int l = 0; l < res; l++) { + float f9 = l / res; + float f13 = (f3 + (f1 - f3) * f9) - (1 / (2 * resSq)); + float f17 = f4 * f9; + tessellator.addVertexWithUV(f4, f17, 0.0D, f2, f13); + tessellator.addVertexWithUV(0.0D, f17, 0.0D, f, f13); + tessellator.addVertexWithUV(0.0D, f17, 0.0F - f5, f, f13); + tessellator.addVertexWithUV(f4, f17, 0.0F - f5, f2, f13); + } + + tessellator.draw(); + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + Minecraft mc = FMLClientHandler.instance().getClient(); + EntityLivingBase player = null; + ItemCrossbow crossbow = (ItemCrossbow) item.getItem(); + + if (type.equals(ItemRenderType.EQUIPPED)) { + // GL11.glRotatef(45, 0F, 1F, -1F); + renderPart(item, player, "stock"); + renderPart(item, player, "mechanism"); + renderPart(item, player, "string"); + renderPart(item, player, "muzzle"); + renderPart(item, player, "mod"); + } + if (type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON) && crossbow.getZoom(item) < 0.1F) { + renderPart(item, player, "stock"); + renderPart(item, player, "mechanism"); + renderPart(item, player, "string"); + renderPart(item, player, "muzzle"); + renderPart(item, player, "mod"); + } + } + + private void renderPart(ItemStack item, EntityLivingBase player, String iconName) { + + GL11.glPushMatrix(); + + GL11.glTranslatef(0.75F, -0.25F, 0F); + GL11.glTranslatef(0f, 0f, 0); + doRenderPart(item, iconName); + + GL11.glPopMatrix(); + + } + + private void doRenderPart(ItemStack item, String iconName) { + boolean flip = iconName.equalsIgnoreCase("mechanism") || iconName.equalsIgnoreCase("string"); + boolean isHead = iconName.equalsIgnoreCase("mechanism"); + + GL11.glPushMatrix(); + float x = -0.35F; + float y = 0.5F; + + ItemCrossbow bow = (ItemCrossbow) item.getItem(); + if (scale == 2.0F) { + x -= 0.625F; + y -= 0.425F; + } + if (flip) { + y += 0F;// bow.headYoffset(); + x += 0F;// bow.headXoffset(); + } + GL11.glTranslatef(x, y, 0); + if (flip) { + GL11.glTranslatef(0, -0.1F, 0); + GL11.glScalef(scale, scale, scale); + } else { + GL11.glScalef(scale, scale, 1.0F); + GL11.glTranslatef(0F, 0F, 0.0625F / 2F); + } + Minecraft mc = FMLClientHandler.instance().getClient(); + if (item != null) + mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + + if (flip) { + GL11.glRotatef(90, 1, 1, 0); + } + if (iconName.equalsIgnoreCase("string")) { + GL11.glTranslatef(0F, 0F, -(4 / 64F)); + GL11.glScaled(1F, 1F, 0.25F); + } + + Tessellator tessellator = Tessellator.instance; + ItemCrossbow crossbow = (ItemCrossbow) item.getItem(); + IIcon icon = crossbow.getPartIcon(item, iconName); + renderIcon(mc, item, tessellator, icon, true); + + if (isHead) { + int slot = 1; + GL11.glPushMatrix(); + float m = 0.01F; + if (slot % 2 == 0) { + m = 0; + } + + GL11.glTranslatef(0.1F - m + (7F / 32F), 0.35F - m + (7F / 32F), -(slot + 1) / 64F - (1F / 32F)); + + float ammoSize = 0.5F; + + GL11.glScalef(0.5F, 0.5F, 0.5F); + GL11.glRotatef(90F, 0F, 0F, -1F); + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); + + if (loaded != null) { + mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + for (int layer = 0; layer < loaded.getItem().getRenderPasses(loaded.getItemDamage()); layer++) { + GL11.glPushMatrix(); + IIcon bolt = loaded.getItem().getIcon(loaded, layer); + + int colour = loaded.getItem().getColorFromItemStack(loaded, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + renderIcon(mc, item, tessellator, bolt, ammoSize, false); + GL11.glPopMatrix(); + } + } + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + + } + + private void renderIcon(Minecraft mc, ItemStack item, Tessellator tessellator, IIcon icon, boolean enchant) { + renderIcon(mc, item, tessellator, icon, 1.0F, enchant); + } + + private void renderIcon(Minecraft mc, ItemStack item, Tessellator tessellator, IIcon icon, float scale, + boolean enchant) { + if (icon == null) + return; + + float x1 = icon.getMinU(); + float x2 = icon.getMaxU(); + float y1 = icon.getMinV(); + float y2 = icon.getMaxV(); + float var10 = 0.0F; + float var11 = 0.3F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + /* * GL11.glTranslatef(-var10, -var11, 0.0F); float var12 = 1.5F; * GL11.glScalef(var12, var12, var12); GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); * GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(-0.9375F, * -0.0625F, 0.0F); */ - GL11.glScalef(scale, scale, scale); - ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (icon.getIconWidth()), (icon.getIconHeight()), - 0.0625F); - - if (enchant && item != null && item.isItemEnchanted()) { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - mc.renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - float var13 = 0.76F; - GL11.glColor4f(0.5F * var13, 0.25F * var13, 0.8F * var13, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float var14 = 0.125F; - GL11.glScalef(var14, var14, var14); - float var15 = System.currentTimeMillis() % 3000L / 3000.0F * 8.0F; - GL11.glTranslatef(var15, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (int) (icon.getIconWidth() * scale), - (int) (icon.getIconHeight() * scale), 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(var14, var14, var14); - var15 = System.currentTimeMillis() % 4873L / 4873.0F * 8.0F; - GL11.glTranslatef(-var15, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (int) (icon.getIconWidth() * scale), - (int) (icon.getIconHeight() * scale), 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - - } - - public static void draw2dItem(Tessellator tessellator, float f, float f1, float f2, float f3, float thickness, - float res, float resSq) { - float f4 = 1.0F; - float f5 = 0.0625F * thickness; - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, f, f3); - tessellator.addVertexWithUV(f4, 0.0D, 0.0D, f2, f3); - tessellator.addVertexWithUV(f4, 1.0D, 0.0D, f2, f1); - tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, f, f1); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, -1F); - tessellator.addVertexWithUV(0.0D, 1.0D, 0.0F - f5, f, f1); - tessellator.addVertexWithUV(f4, 1.0D, 0.0F - f5, f2, f1); - tessellator.addVertexWithUV(f4, 0.0D, 0.0F - f5, f2, f3); - tessellator.addVertexWithUV(0.0D, 0.0D, 0.0F - f5, f, f3); - tessellator.draw(); - - tessellator.startDrawingQuads(); - tessellator.setNormal(-1F, 0.0F, 0.0F); - for (int i = 0; i < res; i++) { - float f6 = i / res; - float f10 = (f + (f2 - f) * f6) - (1 / (2 * resSq)); - float f14 = f4 * f6; - tessellator.addVertexWithUV(f14, 0.0D, 0.0F - f5, f10, f3); - tessellator.addVertexWithUV(f14, 0.0D, 0.0D, f10, f3); - tessellator.addVertexWithUV(f14, 1.0D, 0.0D, f10, f1); - tessellator.addVertexWithUV(f14, 1.0D, 0.0F - f5, f10, f1); - } - - tessellator.draw(); - - tessellator.startDrawingQuads(); - tessellator.setNormal(1.0F, 0.0F, 0.0F); - for (int j = 0; j < res; j++) { - float f7 = j / res; - float f11 = (f + (f2 - f) * f7) - (1 / (2 * resSq)); - float f15 = f4 * f7 + 1 / (res - .01F); - tessellator.addVertexWithUV(f15, 1.0D, 0.0F - f5, f11, f1); - tessellator.addVertexWithUV(f15, 1.0D, 0.0D, f11, f1); - tessellator.addVertexWithUV(f15, 0.0D, 0.0D, f11, f3); - tessellator.addVertexWithUV(f15, 0.0D, 0.0F - f5, f11, f3); - } - - tessellator.draw(); - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - for (int k = 0; k < res; k++) { - float f8 = k / res; - float f12 = (f3 + (f1 - f3) * f8) - (1 / (2 * resSq)); - float f16 = f4 * f8 + 1 / (res - .01F); - tessellator.addVertexWithUV(0.0D, f16, 0.0D, f, f12); - tessellator.addVertexWithUV(f4, f16, 0.0D, f2, f12); - tessellator.addVertexWithUV(f4, f16, 0.0F - f5, f2, f12); - tessellator.addVertexWithUV(0.0D, f16, 0.0F - f5, f, f12); - } - - tessellator.draw(); - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1F, 0.0F); - for (int l = 0; l < res; l++) { - float f9 = l / res; - float f13 = (f3 + (f1 - f3) * f9) - (1 / (2 * resSq)); - float f17 = f4 * f9; - tessellator.addVertexWithUV(f4, f17, 0.0D, f2, f13); - tessellator.addVertexWithUV(0.0D, f17, 0.0D, f, f13); - tessellator.addVertexWithUV(0.0D, f17, 0.0F - f5, f, f13); - tessellator.addVertexWithUV(f4, f17, 0.0F - f5, f2, f13); - } - - tessellator.draw(); - } + GL11.glScalef(scale, scale, scale); + ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (icon.getIconWidth()), (icon.getIconHeight()), + 0.0625F); + + if (enchant && item != null && item.isItemEnchanted()) { + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + mc.renderEngine.bindTexture(TextureHelperMF.ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + float var13 = 0.76F; + GL11.glColor4f(0.5F * var13, 0.25F * var13, 0.8F * var13, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glPushMatrix(); + float var14 = 0.125F; + GL11.glScalef(var14, var14, var14); + float var15 = System.currentTimeMillis() % 3000L / 3000.0F * 8.0F; + GL11.glTranslatef(var15, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (int) (icon.getIconWidth() * scale), + (int) (icon.getIconHeight() * scale), 0.0625F); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(var14, var14, var14); + var15 = System.currentTimeMillis() % 4873L / 4873.0F * 8.0F; + GL11.glTranslatef(-var15, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (int) (icon.getIconWidth() * scale), + (int) (icon.getIconHeight() * scale), 0.0625F); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderDragonBreath.java b/src/main/java/minefantasy/mf2/client/render/RenderDragonBreath.java index cd5d7ed8..ed02e06a 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderDragonBreath.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderDragonBreath.java @@ -1,8 +1,5 @@ package minefantasy.mf2.client.render; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -13,72 +10,74 @@ import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; @SideOnly(Side.CLIENT) public class RenderDragonBreath extends Render { - public RenderDragonBreath() { - } + public RenderDragonBreath() { + } - /** - * Actually renders the given argument. This is a synthetic bridge method, - * always casting down its argument and then handing it off to a worker function - * which does the actual work. In all probabilty, the class Render is generic - * (Render 0 - && ResearchLogic.hasInfoUnlocked((EntityPlayer) user, "counteratt"); - } else if (!(user instanceof EntityPlayer) && item != null && item.getItem() instanceof IParryable) { - hasParried = user.hurtResistantTime > 0; - } - } - - this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator tessellator = Tessellator.instance; - - if (type == ItemRenderType.EQUIPPED) { - if (user != null && hasParried) { - if (user instanceof EntityPlayer) { - if (willStab) { - GL11.glRotatef(-90, 0, 0, 1); - GL11.glTranslatef(-1.5F, 0.5F, 0); - } else { - GL11.glRotatef(90, 0, 0, 1); - GL11.glTranslatef(0F, -1.0F, 0); - } - } else { - GL11.glRotatef(-90, -1, 0, 0); - GL11.glTranslatef(0F, 0F, -0.25F); - } - } - GL11.glTranslatef(0.25F * offset, -0.25F * offset, 0); - GL11.glTranslatef(-1.0F, 0F, 0); - GL11.glScalef(scale, scale, 1); - - for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), - icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); - } - - if (item != null && item.hasEffect(0)) { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - - } else if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { - if (hasParried) { - if (willStab) { - GL11.glRotatef(-90, 0, 0, 1); - GL11.glTranslatef(-1.5F, 0.5F, 0); - } else { - GL11.glRotatef(90, 0, 0, 1); - GL11.glTranslatef(0F, -1.0F, 0); - } - } - GL11.glTranslatef(0.05F * offset, -0.05F * offset, 0); - GL11.glTranslatef(-0.75F, -0.25F, 0); - GL11.glScalef(scale, scale, 1); - - for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), - icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); - } - - if (item != null && item.hasEffect(0)) { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - } - - GL11.glPopMatrix(); - } + private Minecraft mc; + private RenderItem itemRenderer; + private boolean rotate; + private float scale; + private float offset; + private boolean doesRenderParry = false; + private boolean willStab = false; + + public RenderHeavyWeapon() { + this(true); + } + + public RenderHeavyWeapon(boolean rot) { + this(rot, 2.0F); + } + + public RenderHeavyWeapon(boolean rot, float sc) { + rotate = rot; + scale = sc; + } + + public RenderHeavyWeapon setParryable() { + doesRenderParry = true; + return this; + } + + public RenderHeavyWeapon setKatana() { + offset = 1.0F; + willStab = true; + return this; + } + + public RenderHeavyWeapon setGreatsword() { + offset = 1.0F; + return this; + } + + public RenderHeavyWeapon setAxe() { + offset = 1.0F; + return this; + } + + public RenderHeavyWeapon setBlunt() { + offset = 1.2F; + return this; + } + + public RenderHeavyWeapon setScythe() { + offset = 1.8F; + return this; + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + + GL11.glPushMatrix(); + + boolean hasParried = false; + if (mc == null) { + mc = FMLClientHandler.instance().getClient(); + itemRenderer = new RenderItem(); + } + EntityLivingBase user = null; + if (doesRenderParry) { + user = ((EntityLivingBase) data[1]); + + if (user instanceof EntityPlayer && item != null) { + hasParried = ItemWeaponMF.getParry(item) > 0 + && ResearchLogic.hasInfoUnlocked((EntityPlayer) user, "counteratt"); + } else if (!(user instanceof EntityPlayer) && item != null && item.getItem() instanceof IParryable) { + hasParried = user.hurtResistantTime > 0; + } + } + + this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + Tessellator tessellator = Tessellator.instance; + + if (type == ItemRenderType.EQUIPPED) { + if (user != null && hasParried) { + if (user instanceof EntityPlayer) { + if (willStab) { + GL11.glRotatef(-90, 0, 0, 1); + GL11.glTranslatef(-1.5F, 0.5F, 0); + } else { + GL11.glRotatef(90, 0, 0, 1); + GL11.glTranslatef(0F, -1.0F, 0); + } + } else { + GL11.glRotatef(-90, -1, 0, 0); + GL11.glTranslatef(0F, 0F, -0.25F); + } + } + GL11.glTranslatef(0.25F * offset, -0.25F * offset, 0); + GL11.glTranslatef(-1.0F, 0F, 0); + GL11.glScalef(scale, scale, 1); + + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + + } else if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + if (hasParried) { + if (willStab) { + GL11.glRotatef(-90, 0, 0, 1); + GL11.glTranslatef(-1.5F, 0.5F, 0); + } else { + GL11.glRotatef(90, 0, 0, 1); + GL11.glTranslatef(0F, -1.0F, 0); + } + } + GL11.glTranslatef(0.05F * offset, -0.05F * offset, 0); + GL11.glTranslatef(-0.75F, -0.25F, 0); + GL11.glScalef(scale, scale, 1); + + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + } + + GL11.glPopMatrix(); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderLance.java b/src/main/java/minefantasy/mf2/client/render/RenderLance.java index 3ab4e4d9..27543230 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderLance.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderLance.java @@ -1,14 +1,7 @@ package minefantasy.mf2.client.render; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.FMLClientHandler; import minefantasy.mf2.api.helpers.TextureHelperMF; -/** - * - * @author Anonymous Productions - * - */ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; @@ -20,102 +13,107 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; + +/** + * @author Anonymous Productions + */ public class RenderLance implements IItemRenderer { - private Minecraft mc; - private RenderItem itemRenderer; - - public RenderLance() { - } - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return false; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - GL11.glPushMatrix(); - - if (mc == null) { - mc = FMLClientHandler.instance().getClient(); - itemRenderer = new RenderItem(); - } - this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator tessellator = Tessellator.instance; - - if (type == ItemRenderType.EQUIPPED_FIRST_PERSON || type == ItemRenderType.EQUIPPED) { - GL11.glTranslatef(0.8F, 0.2F, 0); - - GL11.glPushMatrix(); - float r = 0F; - if (getRotationFor(data)) { - if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { - r = 90F; - } else { - r = 45F; - } - } - GL11.glRotatef(r, 0, 0, -1); - GL11.glScalef(3F, 3F, 1F); - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.8F, -0.2F, 0F); - - for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), - icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); - } - - if (item != null && item.hasEffect(0)) { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - GL11.glPopMatrix(); - GL11.glPopMatrix(); - } - GL11.glPopMatrix(); - } - - private boolean getRotationFor(Object... data) { - for (int a = 0; a < data.length; a++) { - if (data[a] instanceof EntityLivingBase) { - EntityLivingBase living = (EntityLivingBase) data[a]; - if (living.isSwingInProgress) { - return true; - } - - if (living.isRiding()) { - Entity mount = living.ridingEntity; - float speed = (float) Math.hypot(mount.motionX, mount.motionZ) * 20F; - - if (speed > 4.0F) { - return true; - } - } - - } - - if (data[a] instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) data[a]; - if (player.isUsingItem()) { - return true; - } - } - } - return false; - } + private Minecraft mc; + private RenderItem itemRenderer; + + public RenderLance() { + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + GL11.glPushMatrix(); + + if (mc == null) { + mc = FMLClientHandler.instance().getClient(); + itemRenderer = new RenderItem(); + } + this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + Tessellator tessellator = Tessellator.instance; + + if (type == ItemRenderType.EQUIPPED_FIRST_PERSON || type == ItemRenderType.EQUIPPED) { + GL11.glTranslatef(0.8F, 0.2F, 0); + + GL11.glPushMatrix(); + float r = 0F; + if (getRotationFor(data)) { + if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + r = 90F; + } else { + r = 45F; + } + } + GL11.glRotatef(r, 0, 0, -1); + GL11.glScalef(3F, 3F, 1F); + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.8F, -0.2F, 0F); + + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + GL11.glPopMatrix(); + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + + private boolean getRotationFor(Object... data) { + for (int a = 0; a < data.length; a++) { + if (data[a] instanceof EntityLivingBase) { + EntityLivingBase living = (EntityLivingBase) data[a]; + if (living.isSwingInProgress) { + return true; + } + + if (living.isRiding()) { + Entity mount = living.ridingEntity; + float speed = (float) Math.hypot(mount.motionX, mount.motionZ) * 20F; + + if (speed > 4.0F) { + return true; + } + } + + } + + if (data[a] instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) data[a]; + if (player.isUsingItem()) { + return true; + } + } + } + return false; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderMine.java b/src/main/java/minefantasy/mf2/client/render/RenderMine.java index 049e2d4a..c72f68de 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderMine.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderMine.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.render; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.entity.EntityMine; @@ -12,61 +10,62 @@ import net.minecraft.entity.Entity; import net.minecraft.init.Blocks; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class RenderMine extends Render { - private RenderBlocks blockRenderer = new RenderBlocks(); + private RenderBlocks blockRenderer = new RenderBlocks(); - public RenderMine() { - this.shadowSize = 0.25F; - } + public RenderMine() { + this.shadowSize = 0.25F; + } - public void doRender(EntityMine mine, double x, double y, double z, float f, float f1) { - Block block = mine.getCasing() == 3 ? Blocks.glass - : mine.getCasing() == 2 ? Blocks.obsidian - : mine.getCasing() == 1 ? Blocks.iron_block : Blocks.hardened_clay; - GL11.glPushMatrix(); - GL11.glTranslatef((float) x, (float) y - 0.3F, (float) z); + public void doRender(EntityMine mine, double x, double y, double z, float f, float f1) { + Block block = mine.getCasing() == 3 ? Blocks.glass + : mine.getCasing() == 2 ? Blocks.obsidian + : mine.getCasing() == 1 ? Blocks.iron_block : Blocks.hardened_clay; + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y - 0.3F, (float) z); - this.bindEntityTexture(mine); - GL11.glScalef(0.5F, 0.25F, 0.5F); - this.blockRenderer.renderBlockAsItem(block, 0, mine.getBrightness(f1)); + this.bindEntityTexture(mine); + GL11.glScalef(0.5F, 0.25F, 0.5F); + this.blockRenderer.renderBlockAsItem(block, 0, mine.getBrightness(f1)); - GL11.glTranslatef(0F, 0.3F, 0F); - GL11.glScalef(0.5F, 1.0F, 0.5F); - this.blockRenderer.renderBlockAsItem(block, 0, mine.getBrightness(f1)); + GL11.glTranslatef(0F, 0.3F, 0F); + GL11.glScalef(0.5F, 1.0F, 0.5F); + this.blockRenderer.renderBlockAsItem(block, 0, mine.getBrightness(f1)); - GL11.glPopMatrix(); - } + GL11.glPopMatrix(); + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless - * you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntityMine p_110775_1_) { - return TextureMap.locationBlocksTexture; - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(EntityMine p_110775_1_) { + return TextureMap.locationBlocksTexture; + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless - * you call Render.bindEntityTexture. - */ - @Override - protected ResourceLocation getEntityTexture(Entity p_110775_1_) { - return this.getEntityTexture((EntityMine) p_110775_1_); - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture((EntityMine) p_110775_1_); + } - /** - * Actually renders the given argument. This is a synthetic bridge method, - * always casting down its argument and then handing it off to a worker function - * which does the actual work. In all probabilty, the class Render is generic - * (Render 0.0F) { - GL11.glRotatef(MathHelper.sin(f2) * f2 * f3 / 10.0F * entity.getForwardDirection(), 1.0F, 0.0F, 0.0F); - } + if (f2 > 0.0F) { + GL11.glRotatef(MathHelper.sin(f2) * f2 * f3 / 10.0F * entity.getForwardDirection(), 1.0F, 0.0F, 0.0F); + } - float f4 = 1F; - GL11.glTranslatef(-0.5F, 0F, 0F); - GL11.glScalef(f4, f4, f4); - GL11.glScalef(1.0F / f4, 1.0F / f4, 1.0F / f4); - this.bindEntityTexture(entity); - GL11.glScalef(-1.0F, -1.0F, 1.0F); - this.modelParachute.render(entity, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); - GL11.glPopMatrix(); - } + float f4 = 1F; + GL11.glTranslatef(-0.5F, 0F, 0F); + GL11.glScalef(f4, f4, f4); + GL11.glScalef(1.0F / f4, 1.0F / f4, 1.0F / f4); + this.bindEntityTexture(entity); + GL11.glScalef(-1.0F, -1.0F, 1.0F); + this.modelParachute.render(entity, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); + GL11.glPopMatrix(); + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless - * you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntityParachute p_110775_1_) { - return TextureHelperMF.getResource("textures/models/object/parachute.png"); - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(EntityParachute p_110775_1_) { + return TextureHelperMF.getResource("textures/models/object/parachute.png"); + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless - * you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(Entity p_110775_1_) { - return this.getEntityTexture((EntityParachute) p_110775_1_); - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture((EntityParachute) p_110775_1_); + } - /** - * Actually renders the given argument. This is a synthetic bridge method, - * always casting down its argument and then handing it off to a worker function - * which does the actual work. In all probabilty, the class Render is generic - * (Render= 85.0F) { - f4 = 85.0F; - } - - f2 = f3 - f4; - - if (f4 * f4 > 2500.0F) { - f2 += f4 * 0.2F; - } - } - - float f13 = entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * f1; - this.renderLivingAt(entity, x, y, z); - f4 = this.handleRotationFloat(entity, f1); - this.rotateCorpse(entity, f4, f2, f1); - float f5 = 0.0625F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glScalef(-1.0F, -1.0F, 1.0F); - this.preRenderCallback(entity, f1); - GL11.glTranslatef(0.0F, -24.0F * f5 - 0.0078125F, 0.0F); - float f6 = entity.prevLimbSwingAmount + (entity.limbSwingAmount - entity.prevLimbSwingAmount) * f1; - float f7 = entity.limbSwing - entity.limbSwingAmount * (1.0F - f1); - - if (entity.isChild()) { - f7 *= 3.0F; - } - - if (f6 > 1.0F) { - f6 = 1.0F; - } - if (entity instanceof EntityCogwork && entity.riddenByEntity == null - && ((EntityCogwork) entity).isUnderRepairFrame()) { - GL11.glTranslatef(0F, -0.5F, 0F); - } - if (suit != null) { - GL11.glTranslatef(0F, -0.15625F, 0F); - } - - GL11.glEnable(GL11.GL_ALPHA_TEST); - this.mainModel.setLivingAnimations(entity, f7, f6, f1); - GL11.glColor3f(1.0F, 1.0F, 1.0F); - this.renderModel(0, entity, f7, f6, f4, f3 - f2, f13, f5); - - CustomMaterial plating = getPlating(entity); - if (plating != null) { - colourPlating(plating); - this.renderModel(1, entity, f7, f6, f4, f3 - f2, f13, f5); - } - GL11.glColor3f(1.0F, 1.0F, 1.0F); - int j; - float f8; - float f9; - float f10; - - for (int i = 0; i < 4; ++i) { - j = this.shouldRenderPass(entity, i, f1); - - if (j > 0) { - this.renderPassModel.setLivingAnimations(entity, f7, f6, f1); - this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - - if ((j & 240) == 16) { - this.func_82408_c(entity, i, f1); - this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - } - - if ((j & 15) == 15) { - f8 = entity.ticksExisted + f1; - this.bindTexture(RES_ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - f9 = 0.5F; - GL11.glColor4f(f9, f9, f9, 1.0F); - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDepthMask(false); - - for (int k = 0; k < 2; ++k) { - GL11.glDisable(GL11.GL_LIGHTING); - f10 = 0.76F; - GL11.glColor4f(0.5F * f10, 0.25F * f10, 0.8F * f10, 1.0F); - GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glLoadIdentity(); - float f11 = f8 * (0.001F + k * 0.003F) * 20.0F; - float f12 = 0.33333334F; - GL11.glScalef(f12, f12, f12); - GL11.glRotatef(30.0F - k * 60.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.0F, f11, 0.0F); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - } - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glDepthMask(true); - GL11.glLoadIdentity(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_BLEND); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_ALPHA_TEST); - } - } - - GL11.glDepthMask(true); - if (!isFrame && !isFirstPersonRender(entity)) { - this.renderEquippedItems(entity, f1); - } - float f14 = entity.getBrightness(f1); - j = this.getColorMultiplier(entity, f14, f1); - OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); - GL11.glDisable(GL11.GL_TEXTURE_2D); - OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); - - if ((j >> 24 & 255) > 0 || entity.hurtTime > 0 || entity.deathTime > 0) { - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glDepthFunc(GL11.GL_EQUAL); - - if (entity.hurtTime > 0 || entity.deathTime > 0) { - GL11.glColor4f(f14, 0.0F, 0.0F, 0.4F); - this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - - for (int l = 0; l < 4; ++l) { - if (this.inheritRenderPass(entity, l, f1) >= 0) { - GL11.glColor4f(f14, 0.0F, 0.0F, 0.4F); - this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - } - } - } - - if ((j >> 24 & 255) > 0) { - f8 = (j >> 16 & 255) / 255.0F; - f9 = (j >> 8 & 255) / 255.0F; - float f15 = (j & 255) / 255.0F; - f10 = (j >> 24 & 255) / 255.0F; - GL11.glColor4f(f8, f9, f15, f10); - this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - - for (int i1 = 0; i1 < 4; ++i1) { - if (this.inheritRenderPass(entity, i1, f1) >= 0) { - GL11.glColor4f(f8, f9, f15, f10); - this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); - } - } - } - - GL11.glDepthFunc(GL11.GL_LEQUAL); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_TEXTURE_2D); - } - - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - } catch (Exception exception) { - } - - OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); - GL11.glEnable(GL11.GL_TEXTURE_2D); - OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glPopMatrix(); - this.passSpecialRender(entity, x, y, z); - MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Post(entity, this, x, y, z)); - } - - public static boolean isFirstPersonRender(EntityLivingBase entity) { - Minecraft mc = Minecraft.getMinecraft(); - return mc.gameSettings.thirdPersonView == 0 && entity == mc.thePlayer; - } - - private CustomMaterial getPlating(EntityLivingBase base) { - EntityCogwork suit = getCogwork(base); - if (suit != null) { - return suit.getPlating(); - } - return null; - } - - private EntityCogwork getCogwork(EntityLivingBase base) { - if (base instanceof EntityCogwork) { - return (EntityCogwork) base; - } - if (base.ridingEntity != null && base.ridingEntity instanceof EntityCogwork) { - return (EntityCogwork) base.ridingEntity; - } - return null; - } - - private void colourPlating(CustomMaterial material) { - GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); - } - - @Override - protected void renderModel(EntityLivingBase p_77036_1_, float p_77036_2_, float p_77036_3_, float p_77036_4_, - float p_77036_5_, float p_77036_6_, float p_77036_7_) { - this.renderModel(0, p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); - } - - protected void renderModel(int layer, EntityLivingBase p_77036_1_, float p_77036_2_, float p_77036_3_, - float p_77036_4_, float p_77036_5_, float p_77036_6_, float p_77036_7_) { - this.bindEntityTexture(layer); - - if (!p_77036_1_.isInvisible()) { - this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); - } else if (!p_77036_1_.isInvisibleToPlayer(Minecraft.getMinecraft().thePlayer)) { - GL11.glPushMatrix(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.15F); - GL11.glDepthMask(false); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.003921569F); - this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); - GL11.glDisable(GL11.GL_BLEND); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); - GL11.glPopMatrix(); - GL11.glDepthMask(true); - } else { - this.mainModel.setRotationAngles(p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_, - p_77036_1_); - } - } - - private float interpolateRotation(float p_77034_1_, float p_77034_2_, float p_77034_3_) { - float f3; - - for (f3 = p_77034_2_ - p_77034_1_; f3 < -180.0F; f3 += 360.0F) { - ; - } - - while (f3 >= 180.0F) { - f3 -= 360.0F; - } - - return p_77034_1_ + p_77034_3_ * f3; - } - - @Override - protected void renderEquippedItems(EntityLivingBase entity, float offset) { - if (entity instanceof AbstractClientPlayer) { - renderPlayerItems((AbstractClientPlayer) entity, offset); - return; - } - renderCogworkItems(entity, offset); - } - - protected void renderCogworkItems(EntityLivingBase entity, float offset) { - GL11.glColor3f(1.0F, 1.0F, 1.0F); - // RenderBiped - ItemStack itemstack = entity.getHeldItem(); - Item item; - float f1; - - if (itemstack != null && itemstack.getItem() != null) { - item = itemstack.getItem(); - GL11.glPushMatrix(); - - if (this.mainModel.isChild) { - f1 = 0.5F; - GL11.glTranslatef(0.0F, 0.625F, 0.0F); - GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F); - GL11.glScalef(f1, f1, f1); - } - - this.cogworkSuit.bipedRightArm.postRender(0.0625F); - GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); - - net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient - .getItemRenderer(itemstack, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); - boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( - net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack, - net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); - - if (item instanceof ItemBlock - && (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType()))) { - f1 = 0.5F; - GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); - f1 *= 0.75F; - GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(-f1, -f1, f1); - } else if (item == Items.bow) { - f1 = 0.625F; - GL11.glTranslatef(0.0F, 0.125F, 0.3125F); - GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(f1, -f1, f1); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } else if (item.isFull3D()) { - f1 = 0.625F; - - if (item.shouldRotateAroundWhenRendering()) { - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.0F, -0.125F, 0.0F); - } - - this.offsetHeldItem(); - GL11.glScalef(f1, -f1, f1); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } else { - f1 = 0.375F; - GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); - GL11.glScalef(f1, f1, f1); - GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); - } - - float f2; - int i; - float f5; - - if (itemstack.getItem().requiresMultipleRenderPasses()) { - for (i = 0; i < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++i) { - int j = itemstack.getItem().getColorFromItemStack(itemstack, i); - f5 = (j >> 16 & 255) / 255.0F; - f2 = (j >> 8 & 255) / 255.0F; - float f3 = (j & 255) / 255.0F; - GL11.glColor4f(f5, f2, f3, 1.0F); - this.renderManager.itemRenderer.renderItem(entity, itemstack, i); - } - } else { - i = itemstack.getItem().getColorFromItemStack(itemstack, 0); - float f4 = (i >> 16 & 255) / 255.0F; - f5 = (i >> 8 & 255) / 255.0F; - f2 = (i & 255) / 255.0F; - GL11.glColor4f(f4, f5, f2, 1.0F); - this.renderManager.itemRenderer.renderItem(entity, itemstack, 0); - } - - GL11.glPopMatrix(); - } - } - - protected void renderPlayerItems(AbstractClientPlayer player, float offset) { - GL11.glColor3f(1.0F, 1.0F, 1.0F); - super.renderArrowsStuckInEntity(player, offset); - float f2; - float f4; - - ItemStack held = player.inventory.getCurrentItem(); - if (held != null) { - GL11.glPushMatrix(); - this.cogworkSuit.bipedRightArm.postRender(0.0625F); - GL11.glTranslatef(-0.0625F, 0.5F, -0.0625F); - - if (player.fishEntity != null) { - held = new ItemStack(Items.stick); - } - - EnumAction enumaction = null; - - if (player.getItemInUseCount() > 0) { - enumaction = held.getItemUseAction(); - } - - net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient - .getItemRenderer(held, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); - boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( - net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, held, - net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); - - if (is3D || held.getItem() instanceof ItemBlock - && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(held.getItem()).getRenderType())) { - f2 = 0.5F; - GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); - f2 *= 0.75F; - GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(-f2, -f2, f2); - } else if (held.getItem() == Items.bow) { - f2 = 0.625F; - GL11.glTranslatef(0.0F, 0.125F, 0.3125F); - GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(f2, -f2, f2); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } else if (held.getItem().isFull3D()) { - f2 = 0.625F; - - if (held.getItem().shouldRotateAroundWhenRendering()) { - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.0F, -0.125F, 0.0F); - } - - if (player.getItemInUseCount() > 0 && enumaction == EnumAction.block) { - GL11.glTranslatef(0.05F, 0.0F, -0.1F); - GL11.glRotatef(-50.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(-10.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(-60.0F, 0.0F, 0.0F, 1.0F); - } - - GL11.glTranslatef(0.0F, 0.1875F, 0.0F); - GL11.glScalef(f2, -f2, f2); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } else { - f2 = 0.375F; - GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); - GL11.glScalef(f2, f2, f2); - GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); - } - - float f3; - int k; - float f12; - - if (held.getItem().requiresMultipleRenderPasses()) { - for (k = 0; k < held.getItem().getRenderPasses(held.getItemDamage()); ++k) { - int i = held.getItem().getColorFromItemStack(held, k); - f12 = (i >> 16 & 255) / 255.0F; - f3 = (i >> 8 & 255) / 255.0F; - f4 = (i & 255) / 255.0F; - GL11.glColor4f(f12, f3, f4, 1.0F); - this.renderManager.itemRenderer.renderItem(player, held, k); - } - } else { - k = held.getItem().getColorFromItemStack(held, 0); - float f11 = (k >> 16 & 255) / 255.0F; - f12 = (k >> 8 & 255) / 255.0F; - f3 = (k & 255) / 255.0F; - GL11.glColor4f(f11, f12, f3, 1.0F); - this.renderManager.itemRenderer.renderItem(player, held, 0); - } - - GL11.glPopMatrix(); - } - } + private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation( + "textures/misc/enchanted_item_glint.png"); + protected ModelBiped cogworkSuit; + + public RenderPowerArmour() { + super(new ModelCogwork(1F), 1.5F); + this.cogworkSuit = (ModelBiped) this.mainModel; + } + + public static boolean isFirstPersonRender(EntityLivingBase entity) { + Minecraft mc = Minecraft.getMinecraft(); + return mc.gameSettings.thirdPersonView == 0 && entity == mc.thePlayer; + } + + @Override + protected boolean func_110813_b(EntityLivingBase entity) { + return false; + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(int layer) { + String tex = layer == 0 ? "base" : "plating"; + return TextureHelperMF.getResource("textures/models/armour/cogwork/cogwork_suit_" + tex + ".png"); + } + + protected void bindEntityTexture(int layer) { + this.bindTexture(this.getEntityTexture(layer)); + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture(0); + } + + protected void offsetHeldItem() { + GL11.glTranslatef(0.0F, 0.1875F, 0.0F); + } + + /** + * Actually renders the given argument. This is a synthetic bridge method, + * always casting down its argument and then handing it off to a worker function + * which does the actual work. In all probabilty, the class Render is generic + * (Render= 85.0F) { + f4 = 85.0F; + } + + f2 = f3 - f4; + + if (f4 * f4 > 2500.0F) { + f2 += f4 * 0.2F; + } + } + + float f13 = entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * f1; + this.renderLivingAt(entity, x, y, z); + f4 = this.handleRotationFloat(entity, f1); + this.rotateCorpse(entity, f4, f2, f1); + float f5 = 0.0625F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glScalef(-1.0F, -1.0F, 1.0F); + this.preRenderCallback(entity, f1); + GL11.glTranslatef(0.0F, -24.0F * f5 - 0.0078125F, 0.0F); + float f6 = entity.prevLimbSwingAmount + (entity.limbSwingAmount - entity.prevLimbSwingAmount) * f1; + float f7 = entity.limbSwing - entity.limbSwingAmount * (1.0F - f1); + + if (entity.isChild()) { + f7 *= 3.0F; + } + + if (f6 > 1.0F) { + f6 = 1.0F; + } + if (entity instanceof EntityCogwork && entity.riddenByEntity == null + && ((EntityCogwork) entity).isUnderRepairFrame()) { + GL11.glTranslatef(0F, -0.5F, 0F); + } + if (suit != null) { + GL11.glTranslatef(0F, -0.15625F, 0F); + } + + GL11.glEnable(GL11.GL_ALPHA_TEST); + this.mainModel.setLivingAnimations(entity, f7, f6, f1); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + this.renderModel(0, entity, f7, f6, f4, f3 - f2, f13, f5); + + CustomMaterial plating = getPlating(entity); + if (plating != null) { + colourPlating(plating); + this.renderModel(1, entity, f7, f6, f4, f3 - f2, f13, f5); + } + GL11.glColor3f(1.0F, 1.0F, 1.0F); + int j; + float f8; + float f9; + float f10; + + for (int i = 0; i < 4; ++i) { + j = this.shouldRenderPass(entity, i, f1); + + if (j > 0) { + this.renderPassModel.setLivingAnimations(entity, f7, f6, f1); + this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + + if ((j & 240) == 16) { + this.func_82408_c(entity, i, f1); + this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + } + + if ((j & 15) == 15) { + f8 = entity.ticksExisted + f1; + this.bindTexture(RES_ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + f9 = 0.5F; + GL11.glColor4f(f9, f9, f9, 1.0F); + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDepthMask(false); + + for (int k = 0; k < 2; ++k) { + GL11.glDisable(GL11.GL_LIGHTING); + f10 = 0.76F; + GL11.glColor4f(0.5F * f10, 0.25F * f10, 0.8F * f10, 1.0F); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glLoadIdentity(); + float f11 = f8 * (0.001F + k * 0.003F) * 20.0F; + float f12 = 0.33333334F; + GL11.glScalef(f12, f12, f12); + GL11.glRotatef(30.0F - k * 60.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0F, f11, 0.0F); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glDepthMask(true); + GL11.glLoadIdentity(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + } + + GL11.glDepthMask(true); + if (!isFrame && !isFirstPersonRender(entity)) { + this.renderEquippedItems(entity, f1); + } + float f14 = entity.getBrightness(f1); + j = this.getColorMultiplier(entity, f14, f1); + OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GL11.glDisable(GL11.GL_TEXTURE_2D); + OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); + + if ((j >> 24 & 255) > 0 || entity.hurtTime > 0 || entity.deathTime > 0) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDepthFunc(GL11.GL_EQUAL); + + if (entity.hurtTime > 0 || entity.deathTime > 0) { + GL11.glColor4f(f14, 0.0F, 0.0F, 0.4F); + this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + + for (int l = 0; l < 4; ++l) { + if (this.inheritRenderPass(entity, l, f1) >= 0) { + GL11.glColor4f(f14, 0.0F, 0.0F, 0.4F); + this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + } + } + } + + if ((j >> 24 & 255) > 0) { + f8 = (j >> 16 & 255) / 255.0F; + f9 = (j >> 8 & 255) / 255.0F; + float f15 = (j & 255) / 255.0F; + f10 = (j >> 24 & 255) / 255.0F; + GL11.glColor4f(f8, f9, f15, f10); + this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + + for (int i1 = 0; i1 < 4; ++i1) { + if (this.inheritRenderPass(entity, i1, f1) >= 0) { + GL11.glColor4f(f8, f9, f15, f10); + this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); + } + } + } + + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + } catch (Exception exception) { + } + + OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GL11.glEnable(GL11.GL_TEXTURE_2D); + OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glPopMatrix(); + this.passSpecialRender(entity, x, y, z); + MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Post(entity, this, x, y, z)); + } + + private CustomMaterial getPlating(EntityLivingBase base) { + EntityCogwork suit = getCogwork(base); + if (suit != null) { + return suit.getPlating(); + } + return null; + } + + private EntityCogwork getCogwork(EntityLivingBase base) { + if (base instanceof EntityCogwork) { + return (EntityCogwork) base; + } + if (base.ridingEntity != null && base.ridingEntity instanceof EntityCogwork) { + return (EntityCogwork) base.ridingEntity; + } + return null; + } + + private void colourPlating(CustomMaterial material) { + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + } + + @Override + protected void renderModel(EntityLivingBase p_77036_1_, float p_77036_2_, float p_77036_3_, float p_77036_4_, + float p_77036_5_, float p_77036_6_, float p_77036_7_) { + this.renderModel(0, p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); + } + + protected void renderModel(int layer, EntityLivingBase p_77036_1_, float p_77036_2_, float p_77036_3_, + float p_77036_4_, float p_77036_5_, float p_77036_6_, float p_77036_7_) { + this.bindEntityTexture(layer); + + if (!p_77036_1_.isInvisible()) { + this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); + } else if (!p_77036_1_.isInvisibleToPlayer(Minecraft.getMinecraft().thePlayer)) { + GL11.glPushMatrix(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.15F); + GL11.glDepthMask(false); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.003921569F); + this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_); + GL11.glDisable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glPopMatrix(); + GL11.glDepthMask(true); + } else { + this.mainModel.setRotationAngles(p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_, + p_77036_1_); + } + } + + private float interpolateRotation(float p_77034_1_, float p_77034_2_, float p_77034_3_) { + float f3; + + for (f3 = p_77034_2_ - p_77034_1_; f3 < -180.0F; f3 += 360.0F) { + ; + } + + while (f3 >= 180.0F) { + f3 -= 360.0F; + } + + return p_77034_1_ + p_77034_3_ * f3; + } + + @Override + protected void renderEquippedItems(EntityLivingBase entity, float offset) { + if (entity instanceof AbstractClientPlayer) { + renderPlayerItems((AbstractClientPlayer) entity, offset); + return; + } + renderCogworkItems(entity, offset); + } + + protected void renderCogworkItems(EntityLivingBase entity, float offset) { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + // RenderBiped + ItemStack itemstack = entity.getHeldItem(); + Item item; + float f1; + + if (itemstack != null && itemstack.getItem() != null) { + item = itemstack.getItem(); + GL11.glPushMatrix(); + + if (this.mainModel.isChild) { + f1 = 0.5F; + GL11.glTranslatef(0.0F, 0.625F, 0.0F); + GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F); + GL11.glScalef(f1, f1, f1); + } + + this.cogworkSuit.bipedRightArm.postRender(0.0625F); + GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); + + net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient + .getItemRenderer(itemstack, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); + boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( + net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack, + net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); + + if (item instanceof ItemBlock + && (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType()))) { + f1 = 0.5F; + GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); + f1 *= 0.75F; + GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(-f1, -f1, f1); + } else if (item == Items.bow) { + f1 = 0.625F; + GL11.glTranslatef(0.0F, 0.125F, 0.3125F); + GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(f1, -f1, f1); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else if (item.isFull3D()) { + f1 = 0.625F; + + if (item.shouldRotateAroundWhenRendering()) { + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0F, -0.125F, 0.0F); + } + + this.offsetHeldItem(); + GL11.glScalef(f1, -f1, f1); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else { + f1 = 0.375F; + GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); + GL11.glScalef(f1, f1, f1); + GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); + } + + float f2; + int i; + float f5; + + if (itemstack.getItem().requiresMultipleRenderPasses()) { + for (i = 0; i < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++i) { + int j = itemstack.getItem().getColorFromItemStack(itemstack, i); + f5 = (j >> 16 & 255) / 255.0F; + f2 = (j >> 8 & 255) / 255.0F; + float f3 = (j & 255) / 255.0F; + GL11.glColor4f(f5, f2, f3, 1.0F); + this.renderManager.itemRenderer.renderItem(entity, itemstack, i); + } + } else { + i = itemstack.getItem().getColorFromItemStack(itemstack, 0); + float f4 = (i >> 16 & 255) / 255.0F; + f5 = (i >> 8 & 255) / 255.0F; + f2 = (i & 255) / 255.0F; + GL11.glColor4f(f4, f5, f2, 1.0F); + this.renderManager.itemRenderer.renderItem(entity, itemstack, 0); + } + + GL11.glPopMatrix(); + } + } + + protected void renderPlayerItems(AbstractClientPlayer player, float offset) { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + super.renderArrowsStuckInEntity(player, offset); + float f2; + float f4; + + ItemStack held = player.inventory.getCurrentItem(); + if (held != null) { + GL11.glPushMatrix(); + this.cogworkSuit.bipedRightArm.postRender(0.0625F); + GL11.glTranslatef(-0.0625F, 0.5F, -0.0625F); + + if (player.fishEntity != null) { + held = new ItemStack(Items.stick); + } + + EnumAction enumaction = null; + + if (player.getItemInUseCount() > 0) { + enumaction = held.getItemUseAction(); + } + + net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient + .getItemRenderer(held, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); + boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( + net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, held, + net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); + + if (is3D || held.getItem() instanceof ItemBlock + && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(held.getItem()).getRenderType())) { + f2 = 0.5F; + GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); + f2 *= 0.75F; + GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(-f2, -f2, f2); + } else if (held.getItem() == Items.bow) { + f2 = 0.625F; + GL11.glTranslatef(0.0F, 0.125F, 0.3125F); + GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(f2, -f2, f2); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else if (held.getItem().isFull3D()) { + f2 = 0.625F; + + if (held.getItem().shouldRotateAroundWhenRendering()) { + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0F, -0.125F, 0.0F); + } + + if (player.getItemInUseCount() > 0 && enumaction == EnumAction.block) { + GL11.glTranslatef(0.05F, 0.0F, -0.1F); + GL11.glRotatef(-50.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-10.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(-60.0F, 0.0F, 0.0F, 1.0F); + } + + GL11.glTranslatef(0.0F, 0.1875F, 0.0F); + GL11.glScalef(f2, -f2, f2); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else { + f2 = 0.375F; + GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); + GL11.glScalef(f2, f2, f2); + GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); + } + + float f3; + int k; + float f12; + + if (held.getItem().requiresMultipleRenderPasses()) { + for (k = 0; k < held.getItem().getRenderPasses(held.getItemDamage()); ++k) { + int i = held.getItem().getColorFromItemStack(held, k); + f12 = (i >> 16 & 255) / 255.0F; + f3 = (i >> 8 & 255) / 255.0F; + f4 = (i & 255) / 255.0F; + GL11.glColor4f(f12, f3, f4, 1.0F); + this.renderManager.itemRenderer.renderItem(player, held, k); + } + } else { + k = held.getItem().getColorFromItemStack(held, 0); + float f11 = (k >> 16 & 255) / 255.0F; + f12 = (k >> 8 & 255) / 255.0F; + f3 = (k & 255) / 255.0F; + GL11.glColor4f(f11, f12, f3, 1.0F); + this.renderManager.itemRenderer.renderItem(player, held, 0); + } + + GL11.glPopMatrix(); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderSaw.java b/src/main/java/minefantasy/mf2/client/render/RenderSaw.java index bb1fcd05..5c5d4f9b 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderSaw.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderSaw.java @@ -1,14 +1,7 @@ package minefantasy.mf2.client.render; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import cpw.mods.fml.client.FMLClientHandler; import minefantasy.mf2.api.helpers.TextureHelperMF; -/** - * - * @author Anonymous Productions - */ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; @@ -17,73 +10,79 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +/** + * @author Anonymous Productions + */ public class RenderSaw implements IItemRenderer { - RenderItem renderItem = new RenderItem(); - private float scale; + RenderItem renderItem = new RenderItem(); + private float scale; - public RenderSaw() { - this(1.0F); - } + public RenderSaw() { + this(1.0F); + } - public RenderSaw(float Sc) { - scale = Sc; - } + public RenderSaw(float Sc) { + scale = Sc; + } - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type.equals(ItemRenderType.EQUIPPED); - } + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED); + } - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return false; - } + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - Minecraft mc = FMLClientHandler.instance().getClient(); - if (type.equals(ItemRenderType.EQUIPPED)) { - renderItem(item); - } + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + Minecraft mc = FMLClientHandler.instance().getClient(); + if (type.equals(ItemRenderType.EQUIPPED)) { + renderItem(item); + } - } + } - private void renderItem(ItemStack item) { - GL11.glPushMatrix(); + private void renderItem(ItemStack item) { + GL11.glPushMatrix(); - Minecraft mc = FMLClientHandler.instance().getClient(); - mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator tessellator = Tessellator.instance; + Minecraft mc = FMLClientHandler.instance().getClient(); + mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + Tessellator tessellator = Tessellator.instance; - float xOffset = 0.05F + (0.5F * (scale - 1)); - float yOffset = 0.35F - (0.5F * (scale - 1)); - float xPos = 0.0F + xOffset - yOffset; - float yPos = 0.3F - xOffset - yOffset; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-xPos, -yPos, 0.0F); - GL11.glScalef(scale, scale, 1); + float xOffset = 0.05F + (0.5F * (scale - 1)); + float yOffset = 0.35F - (0.5F * (scale - 1)); + float xPos = 0.0F + xOffset - yOffset; + float yPos = 0.3F - xOffset - yOffset; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-xPos, -yPos, 0.0F); + GL11.glScalef(scale, scale, 1); - for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; - GL11.glColor4f(red, green, blue, 1.0F); + GL11.glColor4f(red, green, blue, 1.0F); - IIcon icon = item.getItem().getIcon(item, layer); + IIcon icon = item.getItem().getIcon(item, layer); - ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), - icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); - } - if (item != null && item.hasEffect(0)) { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } - GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); - GL11.glPopMatrix(); + GL11.glPopMatrix(); - } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderShrapnel.java b/src/main/java/minefantasy/mf2/client/render/RenderShrapnel.java index e2e53099..3a24f22b 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderShrapnel.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderShrapnel.java @@ -1,8 +1,5 @@ package minefantasy.mf2.client.render; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -12,90 +9,92 @@ import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; @SideOnly(Side.CLIENT) public class RenderShrapnel extends Render { - private String tex; + private String tex; - public RenderShrapnel(String tex) { - this.tex = tex; - } + public RenderShrapnel(String tex) { + this.tex = tex; + } - @Override - public void doRender(Entity entity, double x, double y, double z, float xr, float yr) { - if (entity instanceof EntityShrapnel) { - render(entity, ((EntityShrapnel) entity).getTexture(), x, y, z, xr, yr); - } else { - render(entity, this.tex, x, y, z, xr, yr); - } - } + @Override + public void doRender(Entity entity, double x, double y, double z, float xr, float yr) { + if (entity instanceof EntityShrapnel) { + render(entity, ((EntityShrapnel) entity).getTexture(), x, y, z, xr, yr); + } else { + render(entity, this.tex, x, y, z, xr, yr); + } + } - public void render(Entity entity, String tex, double x, double y, double z, float xr, float yr) { - this.loadTexture("textures/projectile/" + tex + ".png"); - GL11.glPushMatrix(); - GL11.glTranslatef((float) x, (float) y, (float) z); - GL11.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * yr - 90.0F, 0.0F, 1.0F, - 0.0F); - GL11.glRotatef(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * yr, 0.0F, 0.0F, - 1.0F); - Tessellator var10 = Tessellator.instance; - byte var11 = 0; - float var12 = 0.0F; - float var13 = 0.5F; - float var14 = (0 + var11 * 10) / 32.0F; - float var15 = (5 + var11 * 10) / 32.0F; - float var16 = 0.0F; - float var17 = 0.15625F; - float var18 = (5 + var11 * 10) / 32.0F; - float var19 = (10 + var11 * 10) / 32.0F; - float var20 = 0.05625F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - float var21 = -yr; + public void render(Entity entity, String tex, double x, double y, double z, float xr, float yr) { + this.loadTexture("textures/projectile/" + tex + ".png"); + GL11.glPushMatrix(); + GL11.glTranslatef((float) x, (float) y, (float) z); + GL11.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * yr - 90.0F, 0.0F, 1.0F, + 0.0F); + GL11.glRotatef(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * yr, 0.0F, 0.0F, + 1.0F); + Tessellator var10 = Tessellator.instance; + byte var11 = 0; + float var12 = 0.0F; + float var13 = 0.5F; + float var14 = (0 + var11 * 10) / 32.0F; + float var15 = (5 + var11 * 10) / 32.0F; + float var16 = 0.0F; + float var17 = 0.15625F; + float var18 = (5 + var11 * 10) / 32.0F; + float var19 = (10 + var11 * 10) / 32.0F; + float var20 = 0.05625F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + float var21 = -yr; - if (var21 > 0.0F) { - float var22 = -MathHelper.sin(var21 * 3.0F) * var21; - GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F); - } + if (var21 > 0.0F) { + float var22 = -MathHelper.sin(var21 * 3.0F) * var21; + GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F); + } - GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); - GL11.glScalef(var20, var20, var20); - GL11.glTranslatef(-4.0F, 0.0F, 0.0F); - GL11.glNormal3f(var20, 0.0F, 0.0F); - var10.startDrawingQuads(); - var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var18); - var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var18); - var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var19); - var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var19); - var10.draw(); - GL11.glNormal3f(-var20, 0.0F, 0.0F); - var10.startDrawingQuads(); - var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var18); - var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var18); - var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var19); - var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var19); - var10.draw(); + GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); + GL11.glScalef(var20, var20, var20); + GL11.glTranslatef(-4.0F, 0.0F, 0.0F); + GL11.glNormal3f(var20, 0.0F, 0.0F); + var10.startDrawingQuads(); + var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var18); + var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var18); + var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var19); + var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var19); + var10.draw(); + GL11.glNormal3f(-var20, 0.0F, 0.0F); + var10.startDrawingQuads(); + var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, var16, var18); + var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, var17, var18); + var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, var17, var19); + var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, var16, var19); + var10.draw(); - for (int var23 = 0; var23 < 4; ++var23) { - GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); - GL11.glNormal3f(0.0F, 0.0F, var20); - var10.startDrawingQuads(); - var10.addVertexWithUV(-8.0D, -2.0D, 0.0D, var12, var14); - var10.addVertexWithUV(8.0D, -2.0D, 0.0D, var13, var14); - var10.addVertexWithUV(8.0D, 2.0D, 0.0D, var13, var15); - var10.addVertexWithUV(-8.0D, 2.0D, 0.0D, var12, var15); - var10.draw(); - } + for (int var23 = 0; var23 < 4; ++var23) { + GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); + GL11.glNormal3f(0.0F, 0.0F, var20); + var10.startDrawingQuads(); + var10.addVertexWithUV(-8.0D, -2.0D, 0.0D, var12, var14); + var10.addVertexWithUV(8.0D, -2.0D, 0.0D, var13, var14); + var10.addVertexWithUV(8.0D, 2.0D, 0.0D, var13, var15); + var10.addVertexWithUV(-8.0D, 2.0D, 0.0D, var12, var15); + var10.draw(); + } - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - GL11.glPopMatrix(); - } + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return null; - } + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return null; + } - private void loadTexture(String image) { - bindTexture(TextureHelperMF.getResource(image)); - } + private void loadTexture(String image) { + bindTexture(TextureHelperMF.getResource(image)); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/RenderSpear.java b/src/main/java/minefantasy/mf2/client/render/RenderSpear.java index 42121aa9..17c94564 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderSpear.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderSpear.java @@ -1,17 +1,6 @@ package minefantasy.mf2.client.render; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.FMLClientHandler; -/** - * - * @author Anonymous Productions - * - * Sources are provided for educational reasons. - * though small bits of code, or methods can be used in your own creations. - * - * Code based off Battlegear Spears by Nerd Boy. - */ import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemRenderer; @@ -23,93 +12,103 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; + +/** + * @author Anonymous Productions + *

+ * Sources are provided for educational reasons. + * though small bits of code, or methods can be used in your own creations. + *

+ * Code based off Battlegear Spears by Nerd Boy. + */ public class RenderSpear implements IItemRenderer { - private Minecraft mc; - private RenderItem itemRenderer; - private boolean isHalbeard; - - public RenderSpear() { - this(false); - } - - public RenderSpear(boolean halbeard) { - isHalbeard = halbeard; - } - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return false; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - GL11.glPushMatrix(); - - if (mc == null) { - mc = FMLClientHandler.instance().getClient(); - itemRenderer = new RenderItem(); - } - this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator tessellator = Tessellator.instance; - - boolean rotate = getRotationFor(type == ItemRenderType.EQUIPPED_FIRST_PERSON, data); - GL11.glTranslatef(-1.0F, -1.0F, 0); - GL11.glScalef(3, 3, 1); - - GL11.glPushMatrix(); - - for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - float x = icon.getMaxU(); - float x2 = icon.getMinU(); - - if (rotate) { - x2 = icon.getMaxU(); - x = icon.getMinU(); - } - - ItemRenderer.renderItemIn2D(tessellator, x, icon.getMinV(), x2, icon.getMaxV(), icon.getIconWidth(), - icon.getIconHeight(), 1F / 16F); - } - if (item != null && item.hasEffect(0)) { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - - GL11.glPopMatrix(); - GL11.glPopMatrix(); - } - - private boolean getRotationFor(boolean FP, Object... data) { - boolean charge = false; - for (int a = 0; a < data.length; a++) { - if (data[a] instanceof EntityLivingBase) { - if (((EntityLivingBase) data[a]).isSwingInProgress && !isHalbeard) { - return true; - } - if (((EntityLivingBase) data[a]).isSprinting() && FP) { - charge = true; - } - } - if (data[a] instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) data[a]; - if (player.isUsingItem()) { - charge = false; - } - } - } - return charge; - } + private Minecraft mc; + private RenderItem itemRenderer; + private boolean isHalbeard; + + public RenderSpear() { + this(false); + } + + public RenderSpear(boolean halbeard) { + isHalbeard = halbeard; + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + GL11.glPushMatrix(); + + if (mc == null) { + mc = FMLClientHandler.instance().getClient(); + itemRenderer = new RenderItem(); + } + this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + Tessellator tessellator = Tessellator.instance; + + boolean rotate = getRotationFor(type == ItemRenderType.EQUIPPED_FIRST_PERSON, data); + GL11.glTranslatef(-1.0F, -1.0F, 0); + GL11.glScalef(3, 3, 1); + + GL11.glPushMatrix(); + + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + float x = icon.getMaxU(); + float x2 = icon.getMinU(); + + if (rotate) { + x2 = icon.getMaxU(); + x = icon.getMinU(); + } + + ItemRenderer.renderItemIn2D(tessellator, x, icon.getMinV(), x2, icon.getMaxV(), icon.getIconWidth(), + icon.getIconHeight(), 1F / 16F); + } + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + + GL11.glPopMatrix(); + GL11.glPopMatrix(); + } + + private boolean getRotationFor(boolean FP, Object... data) { + boolean charge = false; + for (int a = 0; a < data.length; a++) { + if (data[a] instanceof EntityLivingBase) { + if (((EntityLivingBase) data[a]).isSwingInProgress && !isHalbeard) { + return true; + } + if (((EntityLivingBase) data[a]).isSprinting() && FP) { + charge = true; + } + } + if (data[a] instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) data[a]; + if (player.isUsingItem()) { + charge = false; + } + } + } + return charge; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/RenderSword.java b/src/main/java/minefantasy/mf2/client/render/RenderSword.java index 673fc184..a3238581 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderSword.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderSword.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.render; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.FMLClientHandler; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.knowledge.ResearchLogic; @@ -17,116 +15,117 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; public class RenderSword implements IItemRenderer { - private Minecraft mc; - private RenderItem itemRenderer; - private boolean isAxe = false; - - public RenderSword setAxe() { - isAxe = true; - return this; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - boolean hasParried = false; - EntityLivingBase user = null; - if (data.length > 0 && data[1] instanceof EntityLivingBase) { - user = ((EntityLivingBase) data[1]); - } - - ItemStack weapon = user.getHeldItem(); - - if (user instanceof EntityPlayer && weapon != null) { - hasParried = ItemWeaponMF.getParry(weapon) > 0 - && ResearchLogic.hasInfoUnlocked((EntityPlayer) user, "counteratt"); - } else if (!(user instanceof EntityPlayer) && weapon != null && weapon.getItem() instanceof IParryable) { - hasParried = user.hurtResistantTime > 0; - } - - GL11.glPushMatrix(); - - if (mc == null) { - mc = FMLClientHandler.instance().getClient(); - itemRenderer = new RenderItem(); - } - this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator tessellator = Tessellator.instance; - - if (type == ItemRenderType.EQUIPPED) { - if (hasParried) { - if (user instanceof EntityPlayer) { - if (isAxe) { - GL11.glRotatef(180, 1, 0, 0); - GL11.glRotatef(90, 0, 0, 1); - GL11.glTranslatef(-1F, -1F, 0); - } else { - GL11.glRotatef(-90, 0, 0, 1); - GL11.glTranslatef(-1F, 0.5F, 0); - } - } else { - GL11.glRotatef(-90, -1, 0, 0); - GL11.glTranslatef(0F, 0F, -0.25F); - } - } - for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), - icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); - } - if (item != null && item.hasEffect(0)) { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - - } else if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { - if (hasParried) { - if (isAxe) { - GL11.glRotatef(180, 1, 0, 0); - GL11.glRotatef(90, 0, 0, 1); - GL11.glTranslatef(-1F, -1F, 0); - } else { - GL11.glRotatef(-90, 0, 0, 1); - GL11.glTranslatef(-1F, 0.5F, 0); - } - } - for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { - int colour = item.getItem().getColorFromItemStack(item, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - IIcon icon = item.getItem().getIcon(item, layer); - - ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), - icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); - } - - if (item != null && item.hasEffect(0)) { - TextureHelperMF.renderEnchantmentEffects(tessellator); - } - } - - GL11.glPopMatrix(); - } - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return false; - } + private Minecraft mc; + private RenderItem itemRenderer; + private boolean isAxe = false; + + public RenderSword setAxe() { + isAxe = true; + return this; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + boolean hasParried = false; + EntityLivingBase user = null; + if (data.length > 0 && data[1] instanceof EntityLivingBase) { + user = ((EntityLivingBase) data[1]); + } + + ItemStack weapon = user.getHeldItem(); + + if (user instanceof EntityPlayer && weapon != null) { + hasParried = ItemWeaponMF.getParry(weapon) > 0 + && ResearchLogic.hasInfoUnlocked((EntityPlayer) user, "counteratt"); + } else if (!(user instanceof EntityPlayer) && weapon != null && weapon.getItem() instanceof IParryable) { + hasParried = user.hurtResistantTime > 0; + } + + GL11.glPushMatrix(); + + if (mc == null) { + mc = FMLClientHandler.instance().getClient(); + itemRenderer = new RenderItem(); + } + this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + Tessellator tessellator = Tessellator.instance; + + if (type == ItemRenderType.EQUIPPED) { + if (hasParried) { + if (user instanceof EntityPlayer) { + if (isAxe) { + GL11.glRotatef(180, 1, 0, 0); + GL11.glRotatef(90, 0, 0, 1); + GL11.glTranslatef(-1F, -1F, 0); + } else { + GL11.glRotatef(-90, 0, 0, 1); + GL11.glTranslatef(-1F, 0.5F, 0); + } + } else { + GL11.glRotatef(-90, -1, 0, 0); + GL11.glTranslatef(0F, 0F, -0.25F); + } + } + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + + } else if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + if (hasParried) { + if (isAxe) { + GL11.glRotatef(180, 1, 0, 0); + GL11.glRotatef(90, 0, 0, 1); + GL11.glTranslatef(-1F, -1F, 0); + } else { + GL11.glRotatef(-90, 0, 0, 1); + GL11.glTranslatef(-1F, 0.5F, 0); + } + } + for (int layer = 0; layer < item.getItem().getRenderPasses(item.getItemDamage()); layer++) { + int colour = item.getItem().getColorFromItemStack(item, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + IIcon icon = item.getItem().getIcon(item, layer); + + ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), + icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + } + + if (item != null && item.hasEffect(0)) { + TextureHelperMF.renderEnchantmentEffects(tessellator); + } + } + + GL11.glPopMatrix(); + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type.equals(ItemRenderType.EQUIPPED) || type.equals(ItemRenderType.EQUIPPED_FIRST_PERSON); + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return false; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java b/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java index 9d09a32c..7f47290a 100644 --- a/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java +++ b/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java @@ -4,86 +4,86 @@ import net.minecraft.client.model.ModelRenderer; public class ModelFullplate extends ModelBiped { - ModelRenderer rightPauldron; - ModelRenderer leftPauldron; + ModelRenderer rightPauldron; + ModelRenderer leftPauldron; - ModelRenderer armetridge; - ModelRenderer armetjaw; - ModelRenderer armetface; + ModelRenderer armetridge; + ModelRenderer armetjaw; + ModelRenderer armetface; - ModelRenderer bascinetRhorn; - ModelRenderer bascinetLhorn; - ModelRenderer bascinetface; + ModelRenderer bascinetRhorn; + ModelRenderer bascinetLhorn; + ModelRenderer bascinetface; - public ModelFullplate(float f) { - super(f, 0F, 64, 64); + public ModelFullplate(float f) { + super(f, 0F, 64, 64); - rightPauldron = new ModelRenderer(this, 40, 32); - rightPauldron.addBox(-3.5F, -3.5F, -2.5F, 5, 5, 5, f); + rightPauldron = new ModelRenderer(this, 40, 32); + rightPauldron.addBox(-3.5F, -3.5F, -2.5F, 5, 5, 5, f); - rightPauldron.setTextureSize(64, 64); - setRotation(rightPauldron, 0F, 0F, -0.418879F); + rightPauldron.setTextureSize(64, 64); + setRotation(rightPauldron, 0F, 0F, -0.418879F); - leftPauldron = new ModelRenderer(this, 40, 32); - leftPauldron.mirror = true; - leftPauldron.addBox(-1.5F, -3.5F, -2.5F, 5, 5, 5, f); + leftPauldron = new ModelRenderer(this, 40, 32); + leftPauldron.mirror = true; + leftPauldron.addBox(-1.5F, -3.5F, -2.5F, 5, 5, 5, f); - leftPauldron.setTextureSize(64, 64); - setRotation(leftPauldron, 0F, 0F, 0.418879F); + leftPauldron.setTextureSize(64, 64); + setRotation(leftPauldron, 0F, 0F, 0.418879F); - armetridge = new ModelRenderer(this, 0, 38); - armetridge.addBox(-1F, -8.5F, -3.5F, 2, 8, 8); - armetridge.setRotationPoint(0F, 0F, 0F); + armetridge = new ModelRenderer(this, 0, 38); + armetridge.addBox(-1F, -8.5F, -3.5F, 2, 8, 8); + armetridge.setRotationPoint(0F, 0F, 0F); - armetjaw = new ModelRenderer(this, 0, 32); - armetjaw.addBox(-3.5F, -5F, -4F, 7, 4, 2); - armetjaw.setRotationPoint(0F, 0F, 0F); - setRotation(armetjaw, 0.3316126F, 0F, 0F); + armetjaw = new ModelRenderer(this, 0, 32); + armetjaw.addBox(-3.5F, -5F, -4F, 7, 4, 2); + armetjaw.setRotationPoint(0F, 0F, 0F); + setRotation(armetjaw, 0.3316126F, 0F, 0F); - armetface = new ModelRenderer(this, 20, 32); - armetface.addBox(-2.5F, -2.5F, -2.6F, 5, 4, 5); - armetface.setRotationPoint(0F, -1F, -5F); - setRotation(armetface, 0F, 0.7853982F, 0F); + armetface = new ModelRenderer(this, 20, 32); + armetface.addBox(-2.5F, -2.5F, -2.6F, 5, 4, 5); + armetface.setRotationPoint(0F, -1F, -5F); + setRotation(armetface, 0F, 0.7853982F, 0F); /* - * armetface = new ModelRenderer(this, 20, 32); armetface.addBox(-2.5F, -2.5F, + * armetface = new ModelRenderer(this, 20, 32); armetface.addBox(-2.5F, -2.5F, * -2.6F, 5, 4, 5); armetface.setRotationPoint(0F, -0.5F, -4F); * setRotation(armetface, 0.2617994F, 0.7853982F, 0.2617994F); */ - bascinetface = new ModelRenderer(this, 0, 54); - bascinetface.addBox(-2.5F, -5F, -7F, 5, 4, 3); - bascinetface.setRotationPoint(0F, 0F, 0F); - setRotation(bascinetface, 0.3316126F, 0F, 0F); - - bascinetLhorn = new ModelRenderer(this, 0, 0); - bascinetLhorn.mirror = true; - bascinetLhorn.addBox(0F, -14F, -3F, 2, 6, 2); - bascinetLhorn.setRotationPoint(0F, 0F, 0F); - setRotation(bascinetLhorn, -0.7853982F, 0.4363323F, 0F); - - bascinetRhorn = new ModelRenderer(this, 0, 0); - bascinetRhorn.addBox(-2F, -14F, -3F, 2, 6, 2); - bascinetRhorn.setRotationPoint(0F, 0F, 0F); - setRotation(bascinetRhorn, -0.7853982F, -0.4363323F, 0F); - - this.bipedRightArm.addChild(rightPauldron); - this.bipedLeftArm.addChild(leftPauldron); - - this.bipedHead.addChild(armetridge); - this.bipedHead.addChild(armetjaw); - this.bipedHead.addChild(armetface); - - this.bipedHead.addChild(bascinetface); - this.bipedHead.addChild(bascinetLhorn); - this.bipedHead.addChild(bascinetRhorn); - - this.bipedLeftLeg.showModel = this.bipedRightLeg.showModel = this.bipedEars.showModel = false; - } - - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + bascinetface = new ModelRenderer(this, 0, 54); + bascinetface.addBox(-2.5F, -5F, -7F, 5, 4, 3); + bascinetface.setRotationPoint(0F, 0F, 0F); + setRotation(bascinetface, 0.3316126F, 0F, 0F); + + bascinetLhorn = new ModelRenderer(this, 0, 0); + bascinetLhorn.mirror = true; + bascinetLhorn.addBox(0F, -14F, -3F, 2, 6, 2); + bascinetLhorn.setRotationPoint(0F, 0F, 0F); + setRotation(bascinetLhorn, -0.7853982F, 0.4363323F, 0F); + + bascinetRhorn = new ModelRenderer(this, 0, 0); + bascinetRhorn.addBox(-2F, -14F, -3F, 2, 6, 2); + bascinetRhorn.setRotationPoint(0F, 0F, 0F); + setRotation(bascinetRhorn, -0.7853982F, -0.4363323F, 0F); + + this.bipedRightArm.addChild(rightPauldron); + this.bipedLeftArm.addChild(leftPauldron); + + this.bipedHead.addChild(armetridge); + this.bipedHead.addChild(armetjaw); + this.bipedHead.addChild(armetface); + + this.bipedHead.addChild(bascinetface); + this.bipedHead.addChild(bascinetLhorn); + this.bipedHead.addChild(bascinetRhorn); + + this.bipedLeftLeg.showModel = this.bipedRightLeg.showModel = this.bipedEars.showModel = false; + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelAmmoBox.java b/src/main/java/minefantasy/mf2/client/render/block/ModelAmmoBox.java index 4c511cfc..7a99b513 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelAmmoBox.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelAmmoBox.java @@ -5,95 +5,94 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelAmmoBox extends ModelBase { - protected ModelRenderer LeftWall; - protected ModelRenderer FrontWall; - protected ModelRenderer BackWall; - protected ModelRenderer RightWall; - protected ModelRenderer lid; - protected ModelRenderer Base; - protected ModelRenderer lock2; - protected ModelRenderer lock1; + protected ModelRenderer LeftWall; + protected ModelRenderer FrontWall; + protected ModelRenderer BackWall; + protected ModelRenderer RightWall; + protected ModelRenderer lid; + protected ModelRenderer Base; + protected ModelRenderer lock2; + protected ModelRenderer lock1; - public ModelAmmoBox() { - textureWidth = 64; - textureHeight = 32; + public ModelAmmoBox() { + textureWidth = 64; + textureHeight = 32; - LeftWall = new ModelRenderer(this, 34, 0); - LeftWall.addBox(-6F, -4F, -3F, 1, 5, 6); - LeftWall.setRotationPoint(0F, 0F, 0F); - LeftWall.setTextureSize(64, 32); - setRotation(LeftWall, 0F, 0F, 0F); - FrontWall = new ModelRenderer(this, 0, 7); - FrontWall.addBox(-6F, -4F, -4F, 12, 5, 1); - FrontWall.setRotationPoint(0F, 0F, 0F); - FrontWall.setTextureSize(64, 32); - setRotation(FrontWall, 0F, 0F, 0F); - BackWall = new ModelRenderer(this, 0, 7); - BackWall.addBox(-6F, -4F, 3F, 12, 5, 1); - BackWall.setRotationPoint(0F, 0F, 0F); - BackWall.setTextureSize(64, 32); - setRotation(BackWall, 0F, 0F, 0F); - RightWall = new ModelRenderer(this, 34, 0); - RightWall.addBox(5F, -4F, -3F, 1, 5, 6); - RightWall.setRotationPoint(0F, 0F, 0F); - RightWall.setTextureSize(64, 32); + LeftWall = new ModelRenderer(this, 34, 0); + LeftWall.addBox(-6F, -4F, -3F, 1, 5, 6); + LeftWall.setRotationPoint(0F, 0F, 0F); + LeftWall.setTextureSize(64, 32); + setRotation(LeftWall, 0F, 0F, 0F); + FrontWall = new ModelRenderer(this, 0, 7); + FrontWall.addBox(-6F, -4F, -4F, 12, 5, 1); + FrontWall.setRotationPoint(0F, 0F, 0F); + FrontWall.setTextureSize(64, 32); + setRotation(FrontWall, 0F, 0F, 0F); + BackWall = new ModelRenderer(this, 0, 7); + BackWall.addBox(-6F, -4F, 3F, 12, 5, 1); + BackWall.setRotationPoint(0F, 0F, 0F); + BackWall.setTextureSize(64, 32); + setRotation(BackWall, 0F, 0F, 0F); + RightWall = new ModelRenderer(this, 34, 0); + RightWall.addBox(5F, -4F, -3F, 1, 5, 6); + RightWall.setRotationPoint(0F, 0F, 0F); + RightWall.setTextureSize(64, 32); - setRotation(RightWall, 0F, 0F, 0F); - lid = new ModelRenderer(this, 0, 13); - lid.addBox(-6F, -1F, -8F, 12, 1, 8); - lid.setRotationPoint(0F, -4F, 4F); - lid.setTextureSize(64, 32); - setRotation(lid, 0F, 0F, 0F); - Base = new ModelRenderer(this, 2, 0); - Base.addBox(-5F, 0F, -3F, 10, 1, 6); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - setRotation(Base, 0F, 0F, 0F); - lock2 = new ModelRenderer(this, 0, 0); - lock2.addBox(2F, -1.5F, -9.5F, 2, 3, 2); - lock2.setRotationPoint(0F, -4F, 5F); - lock2.setTextureSize(64, 32); - setRotation(lock2, 0F, 0F, 0F); - lock1 = new ModelRenderer(this, 0, 0); - lock1.addBox(-4F, -1.5F, -9.5F, 2, 3, 2); - lock1.setRotationPoint(0F, -4F, 5F); - lock1.setTextureSize(64, 32); - setRotation(lock1, 0F, 0F, 0F); + setRotation(RightWall, 0F, 0F, 0F); + lid = new ModelRenderer(this, 0, 13); + lid.addBox(-6F, -1F, -8F, 12, 1, 8); + lid.setRotationPoint(0F, -4F, 4F); + lid.setTextureSize(64, 32); + setRotation(lid, 0F, 0F, 0F); + Base = new ModelRenderer(this, 2, 0); + Base.addBox(-5F, 0F, -3F, 10, 1, 6); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + setRotation(Base, 0F, 0F, 0F); + lock2 = new ModelRenderer(this, 0, 0); + lock2.addBox(2F, -1.5F, -9.5F, 2, 3, 2); + lock2.setRotationPoint(0F, -4F, 5F); + lock2.setTextureSize(64, 32); + setRotation(lock2, 0F, 0F, 0F); + lock1 = new ModelRenderer(this, 0, 0); + lock1.addBox(-4F, -1.5F, -9.5F, 2, 3, 2); + lock1.setRotationPoint(0F, -4F, 5F); + lock1.setTextureSize(64, 32); + setRotation(lock1, 0F, 0F, 0F); - RightWall.mirror = true; - } + RightWall.mirror = true; + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } - protected void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + protected void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void renderModel(float f) { - LeftWall.render(f); - RightWall.render(f); - FrontWall.render(f); - BackWall.render(f); - Base.render(f); - } + public void renderModel(float f) { + LeftWall.render(f); + RightWall.render(f); + FrontWall.render(f); + BackWall.render(f); + Base.render(f); + } - public void renderLid(float f, float angle) { - lock1.rotateAngleX = lock2.rotateAngleX = lid.rotateAngleX = -(float) Math.toRadians(angle); - lid.render(f); - lock1.render(f); - lock2.render(f); - } + public void renderLid(float f, float angle) { + lock1.rotateAngleX = lock2.rotateAngleX = lid.rotateAngleX = -(float) Math.toRadians(angle); + lid.render(f); + lock1.render(f); + lock2.render(f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelAnvil.java b/src/main/java/minefantasy/mf2/client/render/block/ModelAnvil.java index e106e32f..9496b216 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelAnvil.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelAnvil.java @@ -5,94 +5,93 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelAnvil extends ModelBase { - // fields - ModelRenderer End; - ModelRenderer Post; - ModelRenderer Body; - ModelRenderer Tip; - ModelRenderer Back; - ModelRenderer floor; - ModelRenderer Base; + // fields + ModelRenderer End; + ModelRenderer Post; + ModelRenderer Body; + ModelRenderer Tip; + ModelRenderer Back; + ModelRenderer floor; + ModelRenderer Base; - public ModelAnvil() { - textureWidth = 64; - textureHeight = 32; + public ModelAnvil() { + textureWidth = 64; + textureHeight = 32; - End = new ModelRenderer(this, 0, 24); - End.addBox(-10F, -3F, -2F, 3, 4, 4); - End.setRotationPoint(0F, -5F, 0F); - End.setTextureSize(64, 32); - End.mirror = true; - setRotation(End, 0F, 0F, 0F); - Post = new ModelRenderer(this, 48, 24); - Post.addBox(-2F, 0F, -2F, 4, 4, 4); - Post.setRotationPoint(0F, -4F, 0F); - Post.setTextureSize(64, 32); - Post.mirror = true; - setRotation(Post, 0F, 0F, 0F); - Body = new ModelRenderer(this, 32, 0); - Body.addBox(-5F, -3F, -3F, 10, 4, 6); - Body.setRotationPoint(0F, -5F, 0F); - Body.setTextureSize(64, 32); - Body.mirror = true; - setRotation(Body, 0F, 0F, 0F); - Tip = new ModelRenderer(this, 0, 10); - Tip.addBox(5F, -2F, -1F, 3, 2, 2); - Tip.setRotationPoint(0F, -5F, 0F); - Tip.setTextureSize(64, 32); - Tip.mirror = true; - setRotation(Tip, 0F, 0F, 0F); - Back = new ModelRenderer(this, 0, 19); - Back.addBox(-7F, -2F, -1F, 2, 3, 2); - Back.setRotationPoint(0F, -5F, 0F); - Back.setTextureSize(64, 32); - Back.mirror = true; - setRotation(Back, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-3F, 0F, -3F, 6, 2, 6); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - floor = new ModelRenderer(this, 14, 21); - floor.addBox(-4F, 2F, -4F, 8, 3, 8); - floor.setRotationPoint(0F, 0F, 0F); - floor.setTextureSize(64, 32); - floor.mirror = true; - } + End = new ModelRenderer(this, 0, 24); + End.addBox(-10F, -3F, -2F, 3, 4, 4); + End.setRotationPoint(0F, -5F, 0F); + End.setTextureSize(64, 32); + End.mirror = true; + setRotation(End, 0F, 0F, 0F); + Post = new ModelRenderer(this, 48, 24); + Post.addBox(-2F, 0F, -2F, 4, 4, 4); + Post.setRotationPoint(0F, -4F, 0F); + Post.setTextureSize(64, 32); + Post.mirror = true; + setRotation(Post, 0F, 0F, 0F); + Body = new ModelRenderer(this, 32, 0); + Body.addBox(-5F, -3F, -3F, 10, 4, 6); + Body.setRotationPoint(0F, -5F, 0F); + Body.setTextureSize(64, 32); + Body.mirror = true; + setRotation(Body, 0F, 0F, 0F); + Tip = new ModelRenderer(this, 0, 10); + Tip.addBox(5F, -2F, -1F, 3, 2, 2); + Tip.setRotationPoint(0F, -5F, 0F); + Tip.setTextureSize(64, 32); + Tip.mirror = true; + setRotation(Tip, 0F, 0F, 0F); + Back = new ModelRenderer(this, 0, 19); + Back.addBox(-7F, -2F, -1F, 2, 3, 2); + Back.setRotationPoint(0F, -5F, 0F); + Back.setTextureSize(64, 32); + Back.mirror = true; + setRotation(Back, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-3F, 0F, -3F, 6, 2, 6); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + floor = new ModelRenderer(this, 14, 21); + floor.addBox(-4F, 2F, -4F, 8, 3, 8); + floor.setRotationPoint(0F, 0F, 0F); + floor.setTextureSize(64, 32); + floor.mirror = true; + } - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - End.render(f5); - Base.render(f5); - Post.render(f5); - Body.render(f5); - Tip.render(f5); - Back.render(f5); - } + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + End.render(f5); + Base.render(f5); + Post.render(f5); + Body.render(f5); + Tip.render(f5); + Back.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void renderModel(float f) { - End.render(f); - Base.render(f); - Post.render(f); - Body.render(f); - Tip.render(f); - Back.render(f); - floor.render(f); - } + public void renderModel(float f) { + End.render(f); + Base.render(f); + Post.render(f); + Body.render(f); + Tip.render(f); + Back.render(f); + floor.render(f); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelBellows.java b/src/main/java/minefantasy/mf2/client/render/block/ModelBellows.java index e6e2ea1d..3b12ec4d 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelBellows.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelBellows.java @@ -5,108 +5,107 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelBellows extends ModelBase { - // fields - ModelRenderer Flap4; - ModelRenderer Handle; - ModelRenderer Flap1; - ModelRenderer Flap2; - ModelRenderer Flap3; - ModelRenderer Base; - ModelRenderer Top; + // fields + ModelRenderer Flap4; + ModelRenderer Handle; + ModelRenderer Flap1; + ModelRenderer Flap2; + ModelRenderer Flap3; + ModelRenderer Base; + ModelRenderer Top; - public ModelBellows() { - textureWidth = 64; - textureHeight = 32; + public ModelBellows() { + textureWidth = 64; + textureHeight = 32; - Flap4 = new ModelRenderer(this, 0, 23); - Flap4.addBox(0F, 0F, -4F, 10, 1, 8); - Flap4.setRotationPoint(-8F, 23F, 0F); - Flap4.setTextureSize(64, 32); - Flap4.mirror = true; - setRotation(Flap4, 0F, 0F, -0.418879F); - Handle = new ModelRenderer(this, 40, 0); - Handle.addBox(7F, -1F, -1F, 10, 2, 2); - Handle.setRotationPoint(-8F, 23F, 0F); - Handle.setTextureSize(64, 32); - Handle.mirror = true; - setRotation(Handle, 0F, 0F, -0.5235988F); - Flap1 = new ModelRenderer(this, 34, 23); - Flap1.addBox(0F, 0F, -3F, 9, 1, 6); - Flap1.setRotationPoint(-8F, 23F, 0F); - Flap1.setTextureSize(64, 32); - Flap1.mirror = true; - setRotation(Flap1, 0F, 0F, -0.1047198F); - Flap2 = new ModelRenderer(this, 0, 23); - Flap2.addBox(0F, 0F, -4F, 10, 1, 8); - Flap2.setRotationPoint(-8F, 23F, 0F); - Flap2.setTextureSize(64, 32); - Flap2.mirror = true; - setRotation(Flap2, 0F, 0F, -0.2094395F); - Flap3 = new ModelRenderer(this, 34, 23); - Flap3.addBox(0F, 0F, -3F, 9, 1, 6); - Flap3.setRotationPoint(-8F, 23F, 0F); - Flap3.setTextureSize(64, 32); - Flap3.mirror = true; - setRotation(Flap3, 0F, 0F, -0.3141593F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(0F, 0F, -5F, 11, 1, 10); - Base.setRotationPoint(-8F, 23F, 0F); - Base.setTextureSize(64, 32); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - Top = new ModelRenderer(this, 0, 14); - Top.addBox(0F, 0F, -4F, 11, 1, 8); - Top.setRotationPoint(-8F, 23F, 0F); - Top.setTextureSize(64, 32); - Top.mirror = true; - setRotation(Top, 0F, 0F, -0.5235988F); - } + Flap4 = new ModelRenderer(this, 0, 23); + Flap4.addBox(0F, 0F, -4F, 10, 1, 8); + Flap4.setRotationPoint(-8F, 23F, 0F); + Flap4.setTextureSize(64, 32); + Flap4.mirror = true; + setRotation(Flap4, 0F, 0F, -0.418879F); + Handle = new ModelRenderer(this, 40, 0); + Handle.addBox(7F, -1F, -1F, 10, 2, 2); + Handle.setRotationPoint(-8F, 23F, 0F); + Handle.setTextureSize(64, 32); + Handle.mirror = true; + setRotation(Handle, 0F, 0F, -0.5235988F); + Flap1 = new ModelRenderer(this, 34, 23); + Flap1.addBox(0F, 0F, -3F, 9, 1, 6); + Flap1.setRotationPoint(-8F, 23F, 0F); + Flap1.setTextureSize(64, 32); + Flap1.mirror = true; + setRotation(Flap1, 0F, 0F, -0.1047198F); + Flap2 = new ModelRenderer(this, 0, 23); + Flap2.addBox(0F, 0F, -4F, 10, 1, 8); + Flap2.setRotationPoint(-8F, 23F, 0F); + Flap2.setTextureSize(64, 32); + Flap2.mirror = true; + setRotation(Flap2, 0F, 0F, -0.2094395F); + Flap3 = new ModelRenderer(this, 34, 23); + Flap3.addBox(0F, 0F, -3F, 9, 1, 6); + Flap3.setRotationPoint(-8F, 23F, 0F); + Flap3.setTextureSize(64, 32); + Flap3.mirror = true; + setRotation(Flap3, 0F, 0F, -0.3141593F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(0F, 0F, -5F, 11, 1, 10); + Base.setRotationPoint(-8F, 23F, 0F); + Base.setTextureSize(64, 32); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + Top = new ModelRenderer(this, 0, 14); + Top.addBox(0F, 0F, -4F, 11, 1, 8); + Top.setRotationPoint(-8F, 23F, 0F); + Top.setTextureSize(64, 32); + Top.mirror = true; + setRotation(Top, 0F, 0F, -0.5235988F); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - Flap4.render(f5); - Handle.render(f5); - Flap1.render(f5); - Flap2.render(f5); - Flap3.render(f5); - Base.render(f5); - Top.render(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + Flap4.render(f5); + Handle.render(f5); + Flap1.render(f5); + Flap2.render(f5); + Flap3.render(f5); + Base.render(f5); + Top.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void renderModel(int press, float f) { - Flap4.render(f); - Handle.render(f); - Flap1.render(f); - Flap2.render(f); - Flap3.render(f); - Base.render(f); - Top.render(f); - } + public void renderModel(int press, float f) { + Flap4.render(f); + Handle.render(f); + Flap1.render(f); + Flap2.render(f); + Flap3.render(f); + Base.render(f); + Top.render(f); + } - public void rotate(int p) { - Top.rotateAngleZ = Handle.rotateAngleZ = -getRotationForPart(p, 5); - Flap4.rotateAngleZ = -getRotationForPart(p, 4); - Flap3.rotateAngleZ = -getRotationForPart(p, 3); - Flap2.rotateAngleZ = -getRotationForPart(p, 2); - Flap1.rotateAngleZ = -getRotationForPart(p, 1); - } + public void rotate(int p) { + Top.rotateAngleZ = Handle.rotateAngleZ = -getRotationForPart(p, 5); + Flap4.rotateAngleZ = -getRotationForPart(p, 4); + Flap3.rotateAngleZ = -getRotationForPart(p, 3); + Flap2.rotateAngleZ = -getRotationForPart(p, 2); + Flap1.rotateAngleZ = -getRotationForPart(p, 1); + } - public float getRotationForPart(int press, int part) { - float angle = (float) Math.toRadians(50 - press); - return (angle / 5) * part; - } + public float getRotationForPart(int press, int part) { + float angle = (float) Math.toRadians(50 - press); + return (angle / 5) * part; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelBigFurnace.java b/src/main/java/minefantasy/mf2/client/render/block/ModelBigFurnace.java index 6150edef..27abe5e7 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelBigFurnace.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelBigFurnace.java @@ -5,107 +5,107 @@ import net.minecraft.entity.Entity; public class ModelBigFurnace extends ModelBase { - ModelRenderer Wall4t; - ModelRenderer Wall1; - ModelRenderer Wall2; - ModelRenderer Top; - ModelRenderer Wall3; - ModelRenderer Wall4; - ModelRenderer lava; - ModelRenderer Base; - ModelRenderer contents; - - public ModelBigFurnace() { - textureWidth = 128; - textureHeight = 64; - - Wall4t = new ModelRenderer(this, 76, 50); - Wall1 = new ModelRenderer(this, 0, 27); - Wall2 = new ModelRenderer(this, 0, 27); - Top = new ModelRenderer(this, 0, 0); - Wall3 = new ModelRenderer(this, 48, 50); - Wall4 = new ModelRenderer(this, 76, 60); - lava = new ModelRenderer(this, 26, 27); - Base = new ModelRenderer(this, 0, 0); - contents = new ModelRenderer(this, 0, 41); - - Wall4t.addBox(-6F, -12F, -8F, 12, 3, 2); - Wall4t.setRotationPoint(0F, 0F, 0F); - Wall4t.setTextureSize(128, 64); - Wall4t.mirror = true; - setRotation(Wall4t, 0F, 1.570796F, 0F); - - Wall1.addBox(-8F, -12F, 6F, 16, 12, 2); - Wall1.setRotationPoint(0F, 0F, 0F); - Wall1.setTextureSize(128, 64); - Wall1.mirror = true; - setRotation(Wall1, 0F, 3.141593F, 0F); - - Wall2.addBox(-8F, -12F, 6F, 16, 12, 2); - Wall2.setRotationPoint(0F, 0F, 0F); - Wall2.setTextureSize(128, 64); - Wall2.mirror = true; - setRotation(Wall2, 0F, 0F, 0F); - - Top.addBox(-8F, -14F, -8F, 16, 2, 16); - Top.setRotationPoint(0F, 0F, 0F); - Top.setTextureSize(128, 64); - Top.mirror = true; - setRotation(Top, 0F, 0F, 0F); - - Wall3.addBox(-6F, -12F, 6F, 12, 12, 2); - Wall3.setRotationPoint(0F, 0F, 0F); - Wall3.setTextureSize(128, 64); - Wall3.mirror = true; - setRotation(Wall3, 0F, 1.570796F, 0F); - - Wall4.addBox(-6F, -2F, -8F, 12, 2, 2); - Wall4.setRotationPoint(0F, 0F, 0F); - Wall4.setTextureSize(128, 64); - Wall4.mirror = true; - setRotation(Wall4, 0F, 1.570796F, 0F); - - lava.addBox(-5F, -2F, -5F, 10, 0, 10); - lava.setRotationPoint(0F, 0F, 0F); - lava.setTextureSize(128, 64); - lava.mirror = true; - setRotation(lava, 0F, 0F, 0F); - - Base.addBox(-8F, -2F, -8F, 16, 2, 16); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(128, 64); - Base.mirror = true; - setRotation(Base, 3.141593F, 0F, 0F); - - contents.addBox(-6F, -1F, -6F, 12, 1, 12); - contents.setRotationPoint(0F, 0F, 0F); - contents.setTextureSize(128, 64); - contents.mirror = true; - setRotation(contents, 0F, 0F, 0F); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - renderModel(false, f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - public void renderModel(boolean lit, float f) { - if (lit) { - lava.render(f); - } - Top.render(f); - contents.render(f); - Base.render(f); - Wall4t.render(f); - Wall1.render(f); - Wall2.render(f); - Wall3.render(f); - Wall4.render(f); - } + ModelRenderer Wall4t; + ModelRenderer Wall1; + ModelRenderer Wall2; + ModelRenderer Top; + ModelRenderer Wall3; + ModelRenderer Wall4; + ModelRenderer lava; + ModelRenderer Base; + ModelRenderer contents; + + public ModelBigFurnace() { + textureWidth = 128; + textureHeight = 64; + + Wall4t = new ModelRenderer(this, 76, 50); + Wall1 = new ModelRenderer(this, 0, 27); + Wall2 = new ModelRenderer(this, 0, 27); + Top = new ModelRenderer(this, 0, 0); + Wall3 = new ModelRenderer(this, 48, 50); + Wall4 = new ModelRenderer(this, 76, 60); + lava = new ModelRenderer(this, 26, 27); + Base = new ModelRenderer(this, 0, 0); + contents = new ModelRenderer(this, 0, 41); + + Wall4t.addBox(-6F, -12F, -8F, 12, 3, 2); + Wall4t.setRotationPoint(0F, 0F, 0F); + Wall4t.setTextureSize(128, 64); + Wall4t.mirror = true; + setRotation(Wall4t, 0F, 1.570796F, 0F); + + Wall1.addBox(-8F, -12F, 6F, 16, 12, 2); + Wall1.setRotationPoint(0F, 0F, 0F); + Wall1.setTextureSize(128, 64); + Wall1.mirror = true; + setRotation(Wall1, 0F, 3.141593F, 0F); + + Wall2.addBox(-8F, -12F, 6F, 16, 12, 2); + Wall2.setRotationPoint(0F, 0F, 0F); + Wall2.setTextureSize(128, 64); + Wall2.mirror = true; + setRotation(Wall2, 0F, 0F, 0F); + + Top.addBox(-8F, -14F, -8F, 16, 2, 16); + Top.setRotationPoint(0F, 0F, 0F); + Top.setTextureSize(128, 64); + Top.mirror = true; + setRotation(Top, 0F, 0F, 0F); + + Wall3.addBox(-6F, -12F, 6F, 12, 12, 2); + Wall3.setRotationPoint(0F, 0F, 0F); + Wall3.setTextureSize(128, 64); + Wall3.mirror = true; + setRotation(Wall3, 0F, 1.570796F, 0F); + + Wall4.addBox(-6F, -2F, -8F, 12, 2, 2); + Wall4.setRotationPoint(0F, 0F, 0F); + Wall4.setTextureSize(128, 64); + Wall4.mirror = true; + setRotation(Wall4, 0F, 1.570796F, 0F); + + lava.addBox(-5F, -2F, -5F, 10, 0, 10); + lava.setRotationPoint(0F, 0F, 0F); + lava.setTextureSize(128, 64); + lava.mirror = true; + setRotation(lava, 0F, 0F, 0F); + + Base.addBox(-8F, -2F, -8F, 16, 2, 16); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(128, 64); + Base.mirror = true; + setRotation(Base, 3.141593F, 0F, 0F); + + contents.addBox(-6F, -1F, -6F, 12, 1, 12); + contents.setRotationPoint(0F, 0F, 0F); + contents.setTextureSize(128, 64); + contents.mirror = true; + setRotation(contents, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + renderModel(false, f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void renderModel(boolean lit, float f) { + if (lit) { + lava.render(f); + } + Top.render(f); + contents.render(f); + Base.render(f); + Wall4t.render(f); + Wall1.render(f); + Wall2.render(f); + Wall3.render(f); + Wall4.render(f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelBloomery.java b/src/main/java/minefantasy/mf2/client/render/block/ModelBloomery.java index b39d5f15..2d3cf0b9 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelBloomery.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelBloomery.java @@ -6,63 +6,62 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelBloomery extends ModelBase { - // fields - ModelRenderer top; - ModelRenderer base; - ModelRenderer neck; - ModelRenderer body; - ModelRenderer bloom; + // fields + ModelRenderer top; + ModelRenderer base; + ModelRenderer neck; + ModelRenderer body; + ModelRenderer bloom; - public ModelBloomery() { - textureWidth = 128; - textureHeight = 64; + public ModelBloomery() { + textureWidth = 128; + textureHeight = 64; - top = new ModelRenderer(this, 84, 43); - top.addBox(-5.5F, 0F, -5.5F, 11, 2, 11); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(128, 64); + top = new ModelRenderer(this, 84, 43); + top.addBox(-5.5F, 0F, -5.5F, 11, 2, 11); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(128, 64); - base = new ModelRenderer(this, 0, 0); - base.addBox(-9F, 14F, -9F, 18, 2, 18); - base.setRotationPoint(0F, 0F, 0F); - base.setTextureSize(128, 64); + base = new ModelRenderer(this, 0, 0); + base.addBox(-9F, 14F, -9F, 18, 2, 18); + base.setRotationPoint(0F, 0F, 0F); + base.setTextureSize(128, 64); - neck = new ModelRenderer(this, 0, 46); - neck.addBox(-7F, 2F, -7F, 14, 3, 14); - neck.setRotationPoint(0F, 0F, 0F); - neck.setTextureSize(128, 64); + neck = new ModelRenderer(this, 0, 46); + neck.addBox(-7F, 2F, -7F, 14, 3, 14); + neck.setRotationPoint(0F, 0F, 0F); + neck.setTextureSize(128, 64); - body = new ModelRenderer(this, 64, 11); - body.addBox(-8F, 5F, -8F, 16, 9, 16); - body.setRotationPoint(0F, 0F, 0F); - body.setTextureSize(128, 64); + body = new ModelRenderer(this, 64, 11); + body.addBox(-8F, 5F, -8F, 16, 9, 16); + body.setRotationPoint(0F, 0F, 0F); + body.setTextureSize(128, 64); - bloom = new ModelRenderer(this, 0, 20); - bloom.addBox(-4F, -4F, -4F, 8, 8, 8); - bloom.setRotationPoint(0F, 6F, 0F); - bloom.setTextureSize(128, 64); - } + bloom = new ModelRenderer(this, 0, 20); + bloom.addBox(-4F, -4F, -4F, 8, 8, 8); + bloom.setRotationPoint(0F, 6F, 0F); + bloom.setTextureSize(128, 64); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + } - public void renderModel(TileEntityBloomery bloomery, float f) { - base.render(f); - body.render(f); + public void renderModel(TileEntityBloomery bloomery, float f) { + base.render(f); + body.render(f); - if (bloomery != null && bloomery.hasBloom) { - bloom.render(f); - } else { - neck.render(f); - top.render(f); - } - } + if (bloomery != null && bloomery.hasBloom) { + bloom.render(f); + } else { + neck.render(f); + top.render(f); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelBombBench.java b/src/main/java/minefantasy/mf2/client/render/block/ModelBombBench.java index b90e0458..3a9fabef 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelBombBench.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelBombBench.java @@ -5,122 +5,121 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelBombBench extends ModelBase { - // fields - ModelRenderer top; - ModelRenderer FRleg; - ModelRenderer bottom; - ModelRenderer BRleg; - ModelRenderer BLleg; - ModelRenderer FLleg; - ModelRenderer box; - ModelRenderer casing; - ModelRenderer powder; - ModelRenderer bomb; - ModelRenderer fuse; + // fields + ModelRenderer top; + ModelRenderer FRleg; + ModelRenderer bottom; + ModelRenderer BRleg; + ModelRenderer BLleg; + ModelRenderer FLleg; + ModelRenderer box; + ModelRenderer casing; + ModelRenderer powder; + ModelRenderer bomb; + ModelRenderer fuse; - public ModelBombBench() { - textureWidth = 64; - textureHeight = 64; + public ModelBombBench() { + textureWidth = 64; + textureHeight = 64; - top = new ModelRenderer(this, 0, 0); - top.addBox(-8F, 4F, -8F, 16, 4, 16); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 64); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - FRleg = new ModelRenderer(this, 0, 35); - FRleg.addBox(3F, 8F, -7F, 4, 12, 4); - FRleg.setRotationPoint(0F, 0F, 0F); - FRleg.setTextureSize(64, 64); - FRleg.mirror = true; - setRotation(FRleg, 0F, 0F, 0F); - bottom = new ModelRenderer(this, 0, 20); - bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); - bottom.setRotationPoint(0F, 0F, 0F); - bottom.setTextureSize(64, 64); - bottom.mirror = true; - setRotation(bottom, 0F, 0F, 0F); - BRleg = new ModelRenderer(this, 0, 35); - BRleg.addBox(3F, 8F, 3F, 4, 12, 4); - BRleg.setRotationPoint(0F, 0F, 0F); - BRleg.setTextureSize(64, 64); - BRleg.mirror = true; - setRotation(BRleg, 0F, 0F, 0F); - BLleg = new ModelRenderer(this, 0, 35); - BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); - BLleg.setRotationPoint(0F, 0F, 0F); - BLleg.setTextureSize(64, 64); - BLleg.mirror = true; - setRotation(BLleg, 0F, 0F, 0F); - FLleg = new ModelRenderer(this, 0, 35); - FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); - FLleg.setRotationPoint(0F, 0F, 0F); - FLleg.setTextureSize(64, 64); - FLleg.mirror = true; - setRotation(FLleg, 0F, 0F, 0F); - box = new ModelRenderer(this, 0, 51); - box.addBox(-3F, -1F, -2F, 6, 3, 4); - box.setRotationPoint(0F, 12F, 0F); - box.setTextureSize(64, 64); - box.mirror = true; - setRotation(box, 0F, 0.1396263F, 0F); - casing = new ModelRenderer(this, 0, 20); - casing.addBox(-1F, -1F, -1F, 3, 2, 3); - casing.setRotationPoint(-2F, 3F, -5F); - casing.setTextureSize(64, 64); - casing.mirror = true; - setRotation(casing, 0F, -0.418879F, 0F); - powder = new ModelRenderer(this, 0, 0); - powder.addBox(-2F, -2F, -2F, 4, 4, 4); - powder.setRotationPoint(-2F, 4.5F, 0F); - powder.setTextureSize(64, 64); - powder.mirror = true; - setRotation(powder, 0.7853982F, 0.7853982F, 0.6632251F); - bomb = new ModelRenderer(this, 0, 8); - bomb.addBox(-1F, -1F, -1F, 3, 3, 3); - bomb.setRotationPoint(2F, 2F, -1F); - bomb.setTextureSize(64, 64); - bomb.mirror = true; - setRotation(bomb, 0F, 0.1396263F, 0F); - fuse = new ModelRenderer(this, 6, 2); - fuse.addBox(1F, -2F, 0F, 2, 3, 1); - fuse.setRotationPoint(2F, 2F, -1F); - fuse.setTextureSize(64, 64); - fuse.mirror = true; - setRotation(fuse, 0F, 0.1396263F, 0F); - } + top = new ModelRenderer(this, 0, 0); + top.addBox(-8F, 4F, -8F, 16, 4, 16); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 64); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + FRleg = new ModelRenderer(this, 0, 35); + FRleg.addBox(3F, 8F, -7F, 4, 12, 4); + FRleg.setRotationPoint(0F, 0F, 0F); + FRleg.setTextureSize(64, 64); + FRleg.mirror = true; + setRotation(FRleg, 0F, 0F, 0F); + bottom = new ModelRenderer(this, 0, 20); + bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); + bottom.setRotationPoint(0F, 0F, 0F); + bottom.setTextureSize(64, 64); + bottom.mirror = true; + setRotation(bottom, 0F, 0F, 0F); + BRleg = new ModelRenderer(this, 0, 35); + BRleg.addBox(3F, 8F, 3F, 4, 12, 4); + BRleg.setRotationPoint(0F, 0F, 0F); + BRleg.setTextureSize(64, 64); + BRleg.mirror = true; + setRotation(BRleg, 0F, 0F, 0F); + BLleg = new ModelRenderer(this, 0, 35); + BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); + BLleg.setRotationPoint(0F, 0F, 0F); + BLleg.setTextureSize(64, 64); + BLleg.mirror = true; + setRotation(BLleg, 0F, 0F, 0F); + FLleg = new ModelRenderer(this, 0, 35); + FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); + FLleg.setRotationPoint(0F, 0F, 0F); + FLleg.setTextureSize(64, 64); + FLleg.mirror = true; + setRotation(FLleg, 0F, 0F, 0F); + box = new ModelRenderer(this, 0, 51); + box.addBox(-3F, -1F, -2F, 6, 3, 4); + box.setRotationPoint(0F, 12F, 0F); + box.setTextureSize(64, 64); + box.mirror = true; + setRotation(box, 0F, 0.1396263F, 0F); + casing = new ModelRenderer(this, 0, 20); + casing.addBox(-1F, -1F, -1F, 3, 2, 3); + casing.setRotationPoint(-2F, 3F, -5F); + casing.setTextureSize(64, 64); + casing.mirror = true; + setRotation(casing, 0F, -0.418879F, 0F); + powder = new ModelRenderer(this, 0, 0); + powder.addBox(-2F, -2F, -2F, 4, 4, 4); + powder.setRotationPoint(-2F, 4.5F, 0F); + powder.setTextureSize(64, 64); + powder.mirror = true; + setRotation(powder, 0.7853982F, 0.7853982F, 0.6632251F); + bomb = new ModelRenderer(this, 0, 8); + bomb.addBox(-1F, -1F, -1F, 3, 3, 3); + bomb.setRotationPoint(2F, 2F, -1F); + bomb.setTextureSize(64, 64); + bomb.mirror = true; + setRotation(bomb, 0F, 0.1396263F, 0F); + fuse = new ModelRenderer(this, 6, 2); + fuse.addBox(1F, -2F, 0F, 2, 3, 1); + fuse.setRotationPoint(2F, 2F, -1F); + fuse.setTextureSize(64, 64); + fuse.mirror = true; + setRotation(fuse, 0F, 0.1396263F, 0F); + } - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void renderModel(float f) { - top.render(f); - FRleg.render(f); - bottom.render(f); - BRleg.render(f); - BLleg.render(f); - FLleg.render(f); - box.render(f); - casing.render(f); - powder.render(f); - bomb.render(f); - fuse.render(f); - } + public void renderModel(float f) { + top.render(f); + FRleg.render(f); + bottom.render(f); + BRleg.render(f); + BLleg.render(f); + FLleg.render(f); + box.render(f); + casing.render(f); + powder.render(f); + bomb.render(f); + fuse.render(f); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelBombPress.java b/src/main/java/minefantasy/mf2/client/render/block/ModelBombPress.java index 25969840..02917532 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelBombPress.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelBombPress.java @@ -5,107 +5,106 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelBombPress extends ModelBase { - ModelRenderer frame3; - ModelRenderer socket; - ModelRenderer frame2; - ModelRenderer Leg2; - ModelRenderer frame4; - ModelRenderer handle; - ModelRenderer frame1; - ModelRenderer body; - ModelRenderer Leg1; - ModelRenderer Lever; + ModelRenderer frame3; + ModelRenderer socket; + ModelRenderer frame2; + ModelRenderer Leg2; + ModelRenderer frame4; + ModelRenderer handle; + ModelRenderer frame1; + ModelRenderer body; + ModelRenderer Leg1; + ModelRenderer Lever; - public ModelBombPress() { - textureWidth = 64; - textureHeight = 32; + public ModelBombPress() { + textureWidth = 64; + textureHeight = 32; - frame4 = new ModelRenderer(this, 0, 0); - frame4.addBox(-8F, 2F, 7F, 16, 2, 1); - frame4.setRotationPoint(0F, 0F, 0F); - frame4.setTextureSize(64, 32); - setRotation(frame4, 0F, 1.570796F, 0F); - socket = new ModelRenderer(this, 0, 21); - socket.addBox(-1F, 5F, -1F, 2, 3, 2); - socket.setRotationPoint(0F, 0F, 0F); - socket.setTextureSize(64, 32); - setRotation(socket, 0F, 0F, 0F); - frame2 = new ModelRenderer(this, 0, 0); - frame2.addBox(-8F, 0F, -6F, 16, 2, 1); - frame2.setRotationPoint(0F, 0F, 0F); - frame2.setTextureSize(64, 32); - setRotation(frame2, 0F, 0F, 0F); - Leg2 = new ModelRenderer(this, 0, 3); - Leg2.addBox(-7F, 2F, 3F, 3, 14, 4); - Leg2.setRotationPoint(0F, 0F, 0F); - Leg2.setTextureSize(64, 32); - setRotation(Leg2, 0F, 0F, 0F); - frame3 = new ModelRenderer(this, 0, 0); - frame3.addBox(-8F, 2F, -8F, 16, 2, 1); - frame3.setRotationPoint(0F, 0F, 0F); - frame3.setTextureSize(64, 32); - setRotation(frame3, 0F, 1.570796F, 0F); - handle = new ModelRenderer(this, 32, 16); - handle.addBox(-0.5F, 9.5F, -1.5F, 2, 3, 2); - handle.setRotationPoint(7F, 3F, 6F); - handle.setTextureSize(64, 32); - setRotation(handle, -1.308997F, 0F, 0F); - frame1 = new ModelRenderer(this, 0, 0); - frame1.addBox(-8F, 0F, 5F, 16, 2, 1); - frame1.setRotationPoint(0F, 0F, 0F); - frame1.setTextureSize(64, 32); - setRotation(frame1, 0F, 0F, 0F); - body = new ModelRenderer(this, 14, 3); - body.addBox(-2F, -5F, -5F, 4, 10, 5); - body.setRotationPoint(0F, 0F, 0F); - body.setTextureSize(64, 32); - setRotation(body, 1.570796F, 0F, 0F); - Leg1 = new ModelRenderer(this, 0, 3); - Leg1.addBox(4F, 2F, 3F, 3, 14, 4); - Leg1.setRotationPoint(0F, 0F, 0F); - Leg1.setTextureSize(64, 32); - setRotation(Leg1, 0F, 0F, 0F); - Leg1.mirror = false; - Lever = new ModelRenderer(this, 32, 3); - Lever.addBox(0F, 0F, -1F, 1, 12, 1); - Lever.setRotationPoint(7F, 3F, 6F); - Lever.setTextureSize(64, 32); - setRotation(Lever, -1.308997F, 0F, 0F); - } + frame4 = new ModelRenderer(this, 0, 0); + frame4.addBox(-8F, 2F, 7F, 16, 2, 1); + frame4.setRotationPoint(0F, 0F, 0F); + frame4.setTextureSize(64, 32); + setRotation(frame4, 0F, 1.570796F, 0F); + socket = new ModelRenderer(this, 0, 21); + socket.addBox(-1F, 5F, -1F, 2, 3, 2); + socket.setRotationPoint(0F, 0F, 0F); + socket.setTextureSize(64, 32); + setRotation(socket, 0F, 0F, 0F); + frame2 = new ModelRenderer(this, 0, 0); + frame2.addBox(-8F, 0F, -6F, 16, 2, 1); + frame2.setRotationPoint(0F, 0F, 0F); + frame2.setTextureSize(64, 32); + setRotation(frame2, 0F, 0F, 0F); + Leg2 = new ModelRenderer(this, 0, 3); + Leg2.addBox(-7F, 2F, 3F, 3, 14, 4); + Leg2.setRotationPoint(0F, 0F, 0F); + Leg2.setTextureSize(64, 32); + setRotation(Leg2, 0F, 0F, 0F); + frame3 = new ModelRenderer(this, 0, 0); + frame3.addBox(-8F, 2F, -8F, 16, 2, 1); + frame3.setRotationPoint(0F, 0F, 0F); + frame3.setTextureSize(64, 32); + setRotation(frame3, 0F, 1.570796F, 0F); + handle = new ModelRenderer(this, 32, 16); + handle.addBox(-0.5F, 9.5F, -1.5F, 2, 3, 2); + handle.setRotationPoint(7F, 3F, 6F); + handle.setTextureSize(64, 32); + setRotation(handle, -1.308997F, 0F, 0F); + frame1 = new ModelRenderer(this, 0, 0); + frame1.addBox(-8F, 0F, 5F, 16, 2, 1); + frame1.setRotationPoint(0F, 0F, 0F); + frame1.setTextureSize(64, 32); + setRotation(frame1, 0F, 0F, 0F); + body = new ModelRenderer(this, 14, 3); + body.addBox(-2F, -5F, -5F, 4, 10, 5); + body.setRotationPoint(0F, 0F, 0F); + body.setTextureSize(64, 32); + setRotation(body, 1.570796F, 0F, 0F); + Leg1 = new ModelRenderer(this, 0, 3); + Leg1.addBox(4F, 2F, 3F, 3, 14, 4); + Leg1.setRotationPoint(0F, 0F, 0F); + Leg1.setTextureSize(64, 32); + setRotation(Leg1, 0F, 0F, 0F); + Leg1.mirror = false; + Lever = new ModelRenderer(this, 32, 3); + Lever.addBox(0F, 0F, -1F, 1, 12, 1); + Lever.setRotationPoint(7F, 3F, 6F); + Lever.setTextureSize(64, 32); + setRotation(Lever, -1.308997F, 0F, 0F); + } - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5, 0F); - } + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5, 0F); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void renderModel(float f, float f2) { - Lever.rotateAngleX = handle.rotateAngleX = -0.75F + (0.55F * f2); - frame1.rotationPointY = frame2.rotationPointY = frame3.rotationPointY = frame4.rotationPointY = socket.rotationPointY = body.rotationPointY = (12F - * f2); - frame3.render(f); - socket.render(f); - frame2.render(f); - Leg2.render(f); - frame4.render(f); - handle.render(f); - frame1.render(f); - body.render(f); - Leg1.render(f); - Lever.render(f); - } + public void renderModel(float f, float f2) { + Lever.rotateAngleX = handle.rotateAngleX = -0.75F + (0.55F * f2); + frame1.rotationPointY = frame2.rotationPointY = frame3.rotationPointY = frame4.rotationPointY = socket.rotationPointY = body.rotationPointY = (12F + * f2); + frame3.render(f); + socket.render(f); + frame2.render(f); + Leg2.render(f); + frame4.render(f); + handle.render(f); + frame1.render(f); + body.render(f); + Leg1.render(f); + Lever.render(f); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelCarpenter.java b/src/main/java/minefantasy/mf2/client/render/block/ModelCarpenter.java index 563fafe7..eac60753 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelCarpenter.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelCarpenter.java @@ -5,87 +5,86 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelCarpenter extends ModelBase { - // fields - ModelRenderer leg4; - ModelRenderer top; - ModelRenderer bottom; - ModelRenderer leg3; - ModelRenderer leg1; - ModelRenderer leg2; + // fields + ModelRenderer leg4; + ModelRenderer top; + ModelRenderer bottom; + ModelRenderer leg3; + ModelRenderer leg1; + ModelRenderer leg2; - public ModelCarpenter() { - textureWidth = 64; - textureHeight = 64; + public ModelCarpenter() { + textureWidth = 64; + textureHeight = 64; - leg4 = new ModelRenderer(this, 0, 35); - leg4.addBox(3F, 4F, 3F, 4, 12, 4); - leg4.setRotationPoint(0F, 0F, 0F); - leg4.setTextureSize(64, 64); - leg4.mirror = true; - setRotation(leg4, 0F, 0F, 0F); - top = new ModelRenderer(this, 0, 0); - top.addBox(-8F, 0F, -8F, 16, 4, 16); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 64); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - bottom = new ModelRenderer(this, 0, 20); - bottom.addBox(-6.5F, 11F, -6.5F, 13, 2, 13); - bottom.setRotationPoint(0F, 0F, 0F); - bottom.setTextureSize(64, 64); - bottom.mirror = true; - setRotation(bottom, 0F, 0F, 0F); - leg3 = new ModelRenderer(this, 0, 35); - leg3.addBox(-7F, 4F, 3F, 4, 12, 4); - leg3.setRotationPoint(0F, 0F, 0F); - leg3.setTextureSize(64, 64); - leg3.mirror = true; - setRotation(leg3, 0F, 0F, 0F); - leg1 = new ModelRenderer(this, 0, 35); - leg1.addBox(-7F, 4F, -7F, 4, 12, 4); - leg1.setRotationPoint(0F, 0F, 0F); - leg1.setTextureSize(64, 64); - leg1.mirror = true; - setRotation(leg1, 0F, 0F, 0F); - leg2 = new ModelRenderer(this, 0, 35); - leg2.addBox(3F, 4F, -7F, 4, 12, 4); - leg2.setRotationPoint(0F, 0F, 0F); - leg2.setTextureSize(64, 64); - leg2.mirror = true; - setRotation(leg2, 0F, 0F, 0F); - } + leg4 = new ModelRenderer(this, 0, 35); + leg4.addBox(3F, 4F, 3F, 4, 12, 4); + leg4.setRotationPoint(0F, 0F, 0F); + leg4.setTextureSize(64, 64); + leg4.mirror = true; + setRotation(leg4, 0F, 0F, 0F); + top = new ModelRenderer(this, 0, 0); + top.addBox(-8F, 0F, -8F, 16, 4, 16); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 64); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + bottom = new ModelRenderer(this, 0, 20); + bottom.addBox(-6.5F, 11F, -6.5F, 13, 2, 13); + bottom.setRotationPoint(0F, 0F, 0F); + bottom.setTextureSize(64, 64); + bottom.mirror = true; + setRotation(bottom, 0F, 0F, 0F); + leg3 = new ModelRenderer(this, 0, 35); + leg3.addBox(-7F, 4F, 3F, 4, 12, 4); + leg3.setRotationPoint(0F, 0F, 0F); + leg3.setTextureSize(64, 64); + leg3.mirror = true; + setRotation(leg3, 0F, 0F, 0F); + leg1 = new ModelRenderer(this, 0, 35); + leg1.addBox(-7F, 4F, -7F, 4, 12, 4); + leg1.setRotationPoint(0F, 0F, 0F); + leg1.setTextureSize(64, 64); + leg1.mirror = true; + setRotation(leg1, 0F, 0F, 0F); + leg2 = new ModelRenderer(this, 0, 35); + leg2.addBox(3F, 4F, -7F, 4, 12, 4); + leg2.setRotationPoint(0F, 0F, 0F); + leg2.setTextureSize(64, 64); + leg2.mirror = true; + setRotation(leg2, 0F, 0F, 0F); + } - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - top.render(f5); - bottom.render(f5); - leg1.render(f5); - leg2.render(f5); - leg3.render(f5); - leg4.render(f5); - } + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + top.render(f5); + bottom.render(f5); + leg1.render(f5); + leg2.render(f5); + leg3.render(f5); + leg4.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void renderModel(float f) { - top.render(f); - bottom.render(f); - leg1.render(f); - leg2.render(f); - leg3.render(f); - leg4.render(f); - } + public void renderModel(float f) { + top.render(f); + bottom.render(f); + leg1.render(f); + leg2.render(f); + leg3.render(f); + leg4.render(f); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelCrossbowBench.java b/src/main/java/minefantasy/mf2/client/render/block/ModelCrossbowBench.java index c85705fb..73b41263 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelCrossbowBench.java @@ -5,119 +5,118 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelCrossbowBench extends ModelBase { - // fields - ModelRenderer top; - ModelRenderer FRleg; - ModelRenderer bottom; - ModelRenderer BRleg; - ModelRenderer BLleg; - ModelRenderer FLleg; - ModelRenderer shaft; - ModelRenderer stock; - ModelRenderer arms; - ModelRenderer chest; + // fields + ModelRenderer top; + ModelRenderer FRleg; + ModelRenderer bottom; + ModelRenderer BRleg; + ModelRenderer BLleg; + ModelRenderer FLleg; + ModelRenderer shaft; + ModelRenderer stock; + ModelRenderer arms; + ModelRenderer chest; - public ModelCrossbowBench() { - textureWidth = 64; - textureHeight = 64; + public ModelCrossbowBench() { + textureWidth = 64; + textureHeight = 64; - top = new ModelRenderer(this, 0, 0); - top.addBox(-8F, 4F, -8F, 16, 4, 16); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 64); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - FRleg = new ModelRenderer(this, 0, 35); - FRleg.addBox(3F, 8F, -7F, 4, 12, 4); - FRleg.setRotationPoint(0F, 0F, 0F); - FRleg.setTextureSize(64, 64); - FRleg.mirror = true; - setRotation(FRleg, 0F, 0F, 0F); - bottom = new ModelRenderer(this, 0, 20); - bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); - bottom.setRotationPoint(0F, 0F, 0F); - bottom.setTextureSize(64, 64); - bottom.mirror = true; - setRotation(bottom, 0F, 0F, 0F); - BRleg = new ModelRenderer(this, 0, 35); - BRleg.addBox(3F, 8F, 3F, 4, 12, 4); - BRleg.setRotationPoint(0F, 0F, 0F); - BRleg.setTextureSize(64, 64); - BRleg.mirror = true; - setRotation(BRleg, 0F, 0F, 0F); - BLleg = new ModelRenderer(this, 0, 35); - BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); - BLleg.setRotationPoint(0F, 0F, 0F); - BLleg.setTextureSize(64, 64); - BLleg.mirror = true; - setRotation(BLleg, 0F, 0F, 0F); - FLleg = new ModelRenderer(this, 0, 35); - FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); - FLleg.setRotationPoint(0F, 0F, 0F); - FLleg.setTextureSize(64, 64); - FLleg.mirror = true; - setRotation(FLleg, 0F, 0F, 0F); + top = new ModelRenderer(this, 0, 0); + top.addBox(-8F, 4F, -8F, 16, 4, 16); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 64); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + FRleg = new ModelRenderer(this, 0, 35); + FRleg.addBox(3F, 8F, -7F, 4, 12, 4); + FRleg.setRotationPoint(0F, 0F, 0F); + FRleg.setTextureSize(64, 64); + FRleg.mirror = true; + setRotation(FRleg, 0F, 0F, 0F); + bottom = new ModelRenderer(this, 0, 20); + bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); + bottom.setRotationPoint(0F, 0F, 0F); + bottom.setTextureSize(64, 64); + bottom.mirror = true; + setRotation(bottom, 0F, 0F, 0F); + BRleg = new ModelRenderer(this, 0, 35); + BRleg.addBox(3F, 8F, 3F, 4, 12, 4); + BRleg.setRotationPoint(0F, 0F, 0F); + BRleg.setTextureSize(64, 64); + BRleg.mirror = true; + setRotation(BRleg, 0F, 0F, 0F); + BLleg = new ModelRenderer(this, 0, 35); + BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); + BLleg.setRotationPoint(0F, 0F, 0F); + BLleg.setTextureSize(64, 64); + BLleg.mirror = true; + setRotation(BLleg, 0F, 0F, 0F); + FLleg = new ModelRenderer(this, 0, 35); + FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); + FLleg.setRotationPoint(0F, 0F, 0F); + FLleg.setTextureSize(64, 64); + FLleg.mirror = true; + setRotation(FLleg, 0F, 0F, 0F); - shaft = new ModelRenderer(this, 0, 56); - shaft.addBox(-3F, -1F, -0.9666666F, 6, 1, 2); - shaft.setRotationPoint(-2F, 3F, -2F); - shaft.setTextureSize(64, 64); - shaft.mirror = true; - setRotation(shaft, 0F, 0F, 0F); + shaft = new ModelRenderer(this, 0, 56); + shaft.addBox(-3F, -1F, -0.9666666F, 6, 1, 2); + shaft.setRotationPoint(-2F, 3F, -2F); + shaft.setTextureSize(64, 64); + shaft.mirror = true; + setRotation(shaft, 0F, 0F, 0F); - stock = new ModelRenderer(this, 0, 59); - stock.addBox(-3F, -2F, -1F, 6, 3, 2); - stock.setRotationPoint(4F, 3F, -2F); - stock.setTextureSize(64, 64); - stock.mirror = true; - setRotation(stock, 0F, 0F, 0F); + stock = new ModelRenderer(this, 0, 59); + stock.addBox(-3F, -2F, -1F, 6, 3, 2); + stock.setRotationPoint(4F, 3F, -2F); + stock.setTextureSize(64, 64); + stock.mirror = true; + setRotation(stock, 0F, 0F, 0F); - arms = new ModelRenderer(this, 0, 54); - arms.addBox(-5F, 0F, 0F, 10, 1, 1); - arms.setRotationPoint(-5F, 1F, -2F); - arms.setTextureSize(64, 64); - arms.mirror = true; - setRotation(arms, 0F, 1.570796F, 0F); + arms = new ModelRenderer(this, 0, 54); + arms.addBox(-5F, 0F, 0F, 10, 1, 1); + arms.setRotationPoint(-5F, 1F, -2F); + arms.setTextureSize(64, 64); + arms.mirror = true; + setRotation(arms, 0F, 1.570796F, 0F); - chest = new ModelRenderer(this, 16, 35); - chest.addBox(-3F, 0F, -2F, 6, 3, 4); - chest.setRotationPoint(4F, 1F, 5F); - chest.setTextureSize(64, 64); - chest.mirror = true; - setRotation(chest, 0F, 0.3316126F, 0F); - } + chest = new ModelRenderer(this, 16, 35); + chest.addBox(-3F, 0F, -2F, 6, 3, 4); + chest.setRotationPoint(4F, 1F, 5F); + chest.setTextureSize(64, 64); + chest.mirror = true; + setRotation(chest, 0F, 0.3316126F, 0F); + } - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } - public void renderModel(float f) { - top.render(f); - bottom.render(f); - FLleg.render(f); - BLleg.render(f); - FRleg.render(f); - BRleg.render(f); - shaft.render(f); - stock.render(f); - arms.render(f); - chest.render(f); + public void renderModel(float f) { + top.render(f); + bottom.render(f); + FLleg.render(f); + BLleg.render(f); + FRleg.render(f); + BRleg.render(f); + shaft.render(f); + stock.render(f); + arms.render(f); + chest.render(f); - } + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelEngTanningRack.java b/src/main/java/minefantasy/mf2/client/render/block/ModelEngTanningRack.java index 908dfcb3..10f7f49f 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelEngTanningRack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelEngTanningRack.java @@ -5,99 +5,98 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelEngTanningRack extends ModelBase { - // fields - ModelRenderer side2; - ModelRenderer side1; - ModelRenderer Blade2; - ModelRenderer Top; - ModelRenderer Base; - ModelRenderer Blade; - ModelRenderer Lever; - ModelRenderer pivot; + // fields + ModelRenderer side2; + ModelRenderer side1; + ModelRenderer Blade2; + ModelRenderer Top; + ModelRenderer Base; + ModelRenderer Blade; + ModelRenderer Lever; + ModelRenderer pivot; - public ModelEngTanningRack() { - textureWidth = 64; - textureHeight = 32; + public ModelEngTanningRack() { + textureWidth = 64; + textureHeight = 32; - side2 = new ModelRenderer(this, 50, 0); - side2.addBox(6F, 5F, -2.5F, 2, 17, 5); - side2.setRotationPoint(0F, 0F, 0F); - side2.setTextureSize(64, 32); - setRotation(side2, 0F, 0F, 0F); - side1 = new ModelRenderer(this, 50, 0); - side1.addBox(-8F, 5F, -2.5F, 2, 17, 5); - side1.setRotationPoint(0F, 0F, 0F); - side1.setTextureSize(64, 32); - setRotation(side1, 0F, 0F, 0F); - Blade2 = new ModelRenderer(this, 26, 28); - Blade2.addBox(-6F, 1F, -0.5F, 12, 3, 1); - Blade2.setRotationPoint(0F, 4F, 1F); - Blade2.setTextureSize(64, 32); - setRotation(Blade2, -0.2443461F, 0F, 0F); - Top = new ModelRenderer(this, 0, 28); - Top.addBox(-6F, 5F, -0.5F, 12, 3, 1); - Top.setRotationPoint(0F, 0F, 0F); - Top.setTextureSize(64, 32); - setRotation(Top, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-8F, 22F, -3.5F, 16, 2, 6); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - setRotation(Base, 0F, 0F, 0F); - Blade = new ModelRenderer(this, 26, 28); - Blade.addBox(-6F, 1F, -0.5F, 12, 3, 1); - Blade.setRotationPoint(0F, 4F, -1F); - Blade.setTextureSize(64, 32); - setRotation(Blade, 0.2443461F, 0F, 0F); - Lever = new ModelRenderer(this, 0, 8); - Lever.addBox(-1F, 1F, -0.5F, 1, 10, 1); - Lever.setRotationPoint(5F, 5F, 0F); - Lever.setTextureSize(64, 32); - setRotation(Lever, 0F, 0F, 1.570796F); - pivot = new ModelRenderer(this, 4, 8); - pivot.addBox(-1.5F, -1F, -1F, 2, 2, 2); - pivot.setRotationPoint(5F, 5F, 0F); - pivot.setTextureSize(64, 32); - setRotation(pivot, 0F, 0F, 1.570796F); - } + side2 = new ModelRenderer(this, 50, 0); + side2.addBox(6F, 5F, -2.5F, 2, 17, 5); + side2.setRotationPoint(0F, 0F, 0F); + side2.setTextureSize(64, 32); + setRotation(side2, 0F, 0F, 0F); + side1 = new ModelRenderer(this, 50, 0); + side1.addBox(-8F, 5F, -2.5F, 2, 17, 5); + side1.setRotationPoint(0F, 0F, 0F); + side1.setTextureSize(64, 32); + setRotation(side1, 0F, 0F, 0F); + Blade2 = new ModelRenderer(this, 26, 28); + Blade2.addBox(-6F, 1F, -0.5F, 12, 3, 1); + Blade2.setRotationPoint(0F, 4F, 1F); + Blade2.setTextureSize(64, 32); + setRotation(Blade2, -0.2443461F, 0F, 0F); + Top = new ModelRenderer(this, 0, 28); + Top.addBox(-6F, 5F, -0.5F, 12, 3, 1); + Top.setRotationPoint(0F, 0F, 0F); + Top.setTextureSize(64, 32); + setRotation(Top, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-8F, 22F, -3.5F, 16, 2, 6); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + setRotation(Base, 0F, 0F, 0F); + Blade = new ModelRenderer(this, 26, 28); + Blade.addBox(-6F, 1F, -0.5F, 12, 3, 1); + Blade.setRotationPoint(0F, 4F, -1F); + Blade.setTextureSize(64, 32); + setRotation(Blade, 0.2443461F, 0F, 0F); + Lever = new ModelRenderer(this, 0, 8); + Lever.addBox(-1F, 1F, -0.5F, 1, 10, 1); + Lever.setRotationPoint(5F, 5F, 0F); + Lever.setTextureSize(64, 32); + setRotation(Lever, 0F, 0F, 1.570796F); + pivot = new ModelRenderer(this, 4, 8); + pivot.addBox(-1.5F, -1F, -1F, 2, 2, 2); + pivot.setRotationPoint(5F, 5F, 0F); + pivot.setTextureSize(64, 32); + setRotation(pivot, 0F, 0F, 1.570796F); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } - public void renderModel(float f5) { - Base.render(f5); - Top.render(f5); - side1.render(f5); - side2.render(f5); - } + public void renderModel(float f5) { + Base.render(f5); + Top.render(f5); + side1.render(f5); + side2.render(f5); + } - public void renderBlade(float f5) { - Blade.render(f5); - Blade2.render(f5); - } + public void renderBlade(float f5) { + Blade.render(f5); + Blade2.render(f5); + } - public void rotateLever(float animation) { - pivot.rotateAngleX = Lever.rotateAngleX = (float) Math.toRadians(animation * 45F); - } + public void rotateLever(float animation) { + pivot.rotateAngleX = Lever.rotateAngleX = (float) Math.toRadians(animation * 45F); + } - public void renderLever(float f5) { - pivot.render(f5); - Lever.render(f5); - } + public void renderLever(float f5) { + pivot.render(f5); + Lever.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelFirepit.java b/src/main/java/minefantasy/mf2/client/render/block/ModelFirepit.java index 9ba76fdb..255e0b6e 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelFirepit.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelFirepit.java @@ -6,87 +6,86 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelFirepit extends ModelBase { - // fields - ModelRenderer Base; - ModelRenderer Plank1; - ModelRenderer Plank2; - ModelRenderer Plank3; - ModelRenderer Plank4; - ModelRenderer Pile; + // fields + ModelRenderer Base; + ModelRenderer Plank1; + ModelRenderer Plank2; + ModelRenderer Plank3; + ModelRenderer Plank4; + ModelRenderer Pile; - public ModelFirepit() { - textureWidth = 64; - textureHeight = 32; + public ModelFirepit() { + textureWidth = 64; + textureHeight = 32; - Base = new ModelRenderer(this, 0, 15); - Pile = new ModelRenderer(this, 0, 6); + Base = new ModelRenderer(this, 0, 15); + Pile = new ModelRenderer(this, 0, 6); - Plank1 = new ModelRenderer(this, 24, 0); - Plank2 = new ModelRenderer(this, 24, 0); - Plank3 = new ModelRenderer(this, 0, 0); - Plank4 = new ModelRenderer(this, 0, 0); + Plank1 = new ModelRenderer(this, 24, 0); + Plank2 = new ModelRenderer(this, 24, 0); + Plank3 = new ModelRenderer(this, 0, 0); + Plank4 = new ModelRenderer(this, 0, 0); - Base.addBox(-5F, 3F, -5F, 10, 3, 10); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - Plank2.addBox(-1.5F, -1.5F, -4.5F, 3, 3, 9); - Plank2.setRotationPoint(0F, 3F, 5F); - Plank2.setTextureSize(64, 32); - Plank2.mirror = true; - Plank1.addBox(-1.5F, -1.5F, -4.5F, 3, 3, 9); - Plank1.setRotationPoint(0F, 3F, -5F); - Plank1.setTextureSize(64, 32); - Plank1.mirror = true; - Plank3.addBox(-4.5F, -1.5F, -1.5F, 9, 3, 3); - Plank3.setRotationPoint(-5F, 3F, 0F); - Plank3.setTextureSize(64, 32); - Plank3.mirror = true; - Plank4.addBox(-4.5F, -1.5F, -1.5F, 9, 3, 3); - Plank4.setRotationPoint(5F, 3F, 0F); - Plank4.setTextureSize(64, 32); - Plank4.mirror = true; - Pile.addBox(-3F, 0F, -3F, 6, 3, 6); - Pile.setRotationPoint(0F, 0F, 0F); - Pile.setTextureSize(64, 32); - Pile.mirror = true; - setRotation(Pile, 0F, 0F, 0F); + Base.addBox(-5F, 3F, -5F, 10, 3, 10); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + Plank2.addBox(-1.5F, -1.5F, -4.5F, 3, 3, 9); + Plank2.setRotationPoint(0F, 3F, 5F); + Plank2.setTextureSize(64, 32); + Plank2.mirror = true; + Plank1.addBox(-1.5F, -1.5F, -4.5F, 3, 3, 9); + Plank1.setRotationPoint(0F, 3F, -5F); + Plank1.setTextureSize(64, 32); + Plank1.mirror = true; + Plank3.addBox(-4.5F, -1.5F, -1.5F, 9, 3, 3); + Plank3.setRotationPoint(-5F, 3F, 0F); + Plank3.setTextureSize(64, 32); + Plank3.mirror = true; + Plank4.addBox(-4.5F, -1.5F, -1.5F, 9, 3, 3); + Plank4.setRotationPoint(5F, 3F, 0F); + Plank4.setTextureSize(64, 32); + Plank4.mirror = true; + Pile.addBox(-3F, 0F, -3F, 6, 3, 6); + Pile.setRotationPoint(0F, 0F, 0F); + Pile.setTextureSize(64, 32); + Pile.mirror = true; + setRotation(Pile, 0F, 0F, 0F); - float angle = 0.7853982F; + float angle = 0.7853982F; - setRotation(Plank1, angle, 0F, 0F); - setRotation(Plank2, -angle, 0F, 0F); - setRotation(Plank3, 0F, 0F, -angle); - setRotation(Plank4, 0F, 0F, angle); - } + setRotation(Plank1, angle, 0F, 0F); + setRotation(Plank2, -angle, 0F, 0F); + setRotation(Plank3, 0F, 0F, -angle); + setRotation(Plank4, 0F, 0F, angle); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + } - public void renderModel(TileEntityFirepit pit, float f) { - Base.render(f); + public void renderModel(TileEntityFirepit pit, float f) { + Base.render(f); - if (pit == null || pit.fuel > 0) { - Plank1.render(f); - Plank2.render(f); - Plank3.render(f); - Plank4.render(f); - Pile.render(f); - } - } + if (pit == null || pit.fuel > 0) { + Plank1.render(f); + Plank2.render(f); + Plank3.render(f); + Plank4.render(f); + Pile.render(f); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelFoodBox.java b/src/main/java/minefantasy/mf2/client/render/block/ModelFoodBox.java index 0fdb4d80..7bd4afe5 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelFoodBox.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelFoodBox.java @@ -3,60 +3,59 @@ import net.minecraft.client.model.ModelRenderer; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelFoodBox extends ModelAmmoBox { - public ModelFoodBox() { - textureWidth = 64; - textureHeight = 32; + public ModelFoodBox() { + textureWidth = 64; + textureHeight = 32; - LeftWall = new ModelRenderer(this, 20, 0); - LeftWall.addBox(-4F, -2F, -2F, 1, 3, 4); - LeftWall.setRotationPoint(0F, 0F, 0F); - LeftWall.setTextureSize(64, 32); - setRotation(LeftWall, 0F, 0F, 0F); - FrontWall = new ModelRenderer(this, 0, 5); - FrontWall.addBox(-4F, -2F, -3F, 8, 3, 1); - FrontWall.setRotationPoint(0F, 0F, 0F); - FrontWall.setTextureSize(64, 32); - setRotation(FrontWall, 0F, 0F, 0F); - BackWall = new ModelRenderer(this, 0, 5); - BackWall.addBox(-4F, -2F, 2F, 8, 3, 1); - BackWall.setRotationPoint(0F, 0F, 0F); - BackWall.setTextureSize(64, 32); - setRotation(BackWall, 0F, 0F, 0F); - RightWall = new ModelRenderer(this, 20, 0); - RightWall.addBox(3F, -2F, -2F, 1, 3, 4); - RightWall.setRotationPoint(0F, 0F, 0F); - RightWall.setTextureSize(64, 32); - setRotation(RightWall, 0F, 0F, 0F); - lid = new ModelRenderer(this, 0, 11); - lid.addBox(-4F, -1F, -6F, 8, 1, 6); - lid.setRotationPoint(0F, -2F, 3F); - lid.setTextureSize(64, 32); - setRotation(lid, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-3F, 0F, -2F, 6, 1, 4); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - setRotation(Base, 0F, 0F, 0F); - lock1 = new ModelRenderer(this, 0, 0); - lock1.addBox(-0.5F, -1.5F, -6.5F, 1, 2, 1); - lock1.setRotationPoint(0F, -2F, 3F); - lock1.setTextureSize(64, 32); - setRotation(lock1, 0F, 0F, 0F); + LeftWall = new ModelRenderer(this, 20, 0); + LeftWall.addBox(-4F, -2F, -2F, 1, 3, 4); + LeftWall.setRotationPoint(0F, 0F, 0F); + LeftWall.setTextureSize(64, 32); + setRotation(LeftWall, 0F, 0F, 0F); + FrontWall = new ModelRenderer(this, 0, 5); + FrontWall.addBox(-4F, -2F, -3F, 8, 3, 1); + FrontWall.setRotationPoint(0F, 0F, 0F); + FrontWall.setTextureSize(64, 32); + setRotation(FrontWall, 0F, 0F, 0F); + BackWall = new ModelRenderer(this, 0, 5); + BackWall.addBox(-4F, -2F, 2F, 8, 3, 1); + BackWall.setRotationPoint(0F, 0F, 0F); + BackWall.setTextureSize(64, 32); + setRotation(BackWall, 0F, 0F, 0F); + RightWall = new ModelRenderer(this, 20, 0); + RightWall.addBox(3F, -2F, -2F, 1, 3, 4); + RightWall.setRotationPoint(0F, 0F, 0F); + RightWall.setTextureSize(64, 32); + setRotation(RightWall, 0F, 0F, 0F); + lid = new ModelRenderer(this, 0, 11); + lid.addBox(-4F, -1F, -6F, 8, 1, 6); + lid.setRotationPoint(0F, -2F, 3F); + lid.setTextureSize(64, 32); + setRotation(lid, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-3F, 0F, -2F, 6, 1, 4); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + setRotation(Base, 0F, 0F, 0F); + lock1 = new ModelRenderer(this, 0, 0); + lock1.addBox(-0.5F, -1.5F, -6.5F, 1, 2, 1); + lock1.setRotationPoint(0F, -2F, 3F); + lock1.setTextureSize(64, 32); + setRotation(lock1, 0F, 0F, 0F); - RightWall.mirror = true; - } + RightWall.mirror = true; + } - @Override - public void renderLid(float f, float angle) { - lock1.rotateAngleX = lid.rotateAngleX = -(float) Math.toRadians(angle); - lid.render(f); - lock1.render(f); - } + @Override + public void renderLid(float f, float angle) { + lock1.rotateAngleX = lid.rotateAngleX = -(float) Math.toRadians(angle); + lid.render(f); + lock1.render(f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelForge.java b/src/main/java/minefantasy/mf2/client/render/block/ModelForge.java index f99b970e..b1e444ab 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelForge.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelForge.java @@ -6,146 +6,145 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelForge extends ModelBase { - // fields - ModelRenderer Back; - ModelRenderer Right; - ModelRenderer cornerBR; - ModelRenderer Left; - ModelRenderer Base; - ModelRenderer front; - ModelRenderer cornerBL; - ModelRenderer cornerFR; - ModelRenderer cornerFL; - ModelRenderer fuel; + // fields + ModelRenderer Back; + ModelRenderer Right; + ModelRenderer cornerBR; + ModelRenderer Left; + ModelRenderer Base; + ModelRenderer front; + ModelRenderer cornerBL; + ModelRenderer cornerFR; + ModelRenderer cornerFL; + ModelRenderer fuel; - public ModelForge() { - textureWidth = 64; - textureHeight = 64; + public ModelForge() { + textureWidth = 64; + textureHeight = 64; - Back = new ModelRenderer(this, 0, 0); - Back.addBox(-6F, -6F, -8F, 12, 7, 2); - Back.setRotationPoint(0F, 22F, 0F); - Back.setTextureSize(64, 64); - Back.mirror = true; - setRotation(Back, 0F, 1.570796F, 0F); - Right = new ModelRenderer(this, 0, 0); - Right.addBox(-6F, -8F, -8F, 12, 7, 2); - Right.setRotationPoint(0F, 24F, 0F); - Right.setTextureSize(64, 64); - Right.mirror = true; - setRotation(Right, 0F, 3.154392F, 0F); - cornerBR = new ModelRenderer(this, 0, 9); - cornerBR.addBox(-8F, -7F, -8F, 2, 6, 2); - cornerBR.setRotationPoint(0F, 24F, 0F); - cornerBR.setTextureSize(64, 64); - cornerBR.mirror = true; - setRotation(cornerBR, 0F, 1.570796F, 0F); - Left = new ModelRenderer(this, 0, 0); - Left.addBox(-6F, -6F, -8F, 12, 7, 2); - Left.setRotationPoint(0F, 22F, 0F); - Left.setTextureSize(64, 64); - Left.mirror = true; - setRotation(Left, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 15); - Base.addBox(-8F, 1F, -8F, 16, 1, 16); - Base.setRotationPoint(0F, 22F, 0F); - Base.setTextureSize(64, 64); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - front = new ModelRenderer(this, 0, 0); - front.addBox(-6F, -8F, -8F, 12, 7, 2); - front.setRotationPoint(0F, 24F, 0F); - front.setTextureSize(64, 64); - front.mirror = true; - setRotation(front, 0F, -1.570796F, 0F); - cornerBL = new ModelRenderer(this, 0, 9); - cornerBL.addBox(6F, -5F, -8F, 2, 6, 2); - cornerBL.setRotationPoint(0F, 22F, 0F); - cornerBL.setTextureSize(64, 64); - cornerBL.mirror = true; - setRotation(cornerBL, 0F, 1.570796F, 0F); - cornerFR = new ModelRenderer(this, 0, 9); - cornerFR.addBox(-8F, -7F, 6F, 2, 6, 2); - cornerFR.setRotationPoint(0F, 24F, 0F); - cornerFR.setTextureSize(64, 64); - cornerFR.mirror = true; - setRotation(cornerFR, 0F, 1.570796F, 0F); - cornerFL = new ModelRenderer(this, 0, 9); - cornerFL.addBox(6F, -7F, 6F, 2, 6, 2); - cornerFL.setRotationPoint(0F, 24F, 0F); - cornerFL.setTextureSize(64, 64); - cornerFL.mirror = true; - setRotation(cornerFL, 0F, 1.570796F, 0F); - fuel = new ModelRenderer(this, 32, 0); - fuel.addBox(-8F, -1F, -8F, 16, 0, 16); - fuel.addBox(-8F, -0.5F, -8F, 16, 0, 16); - fuel.addBox(-8F, -0F, -8F, 16, 0, 16); - fuel.setRotationPoint(0F, 18.5F, 0F); - fuel.setTextureSize(64, 64); - fuel.mirror = true; - setRotation(fuel, 0F, 0F, 0F); - } + Back = new ModelRenderer(this, 0, 0); + Back.addBox(-6F, -6F, -8F, 12, 7, 2); + Back.setRotationPoint(0F, 22F, 0F); + Back.setTextureSize(64, 64); + Back.mirror = true; + setRotation(Back, 0F, 1.570796F, 0F); + Right = new ModelRenderer(this, 0, 0); + Right.addBox(-6F, -8F, -8F, 12, 7, 2); + Right.setRotationPoint(0F, 24F, 0F); + Right.setTextureSize(64, 64); + Right.mirror = true; + setRotation(Right, 0F, 3.154392F, 0F); + cornerBR = new ModelRenderer(this, 0, 9); + cornerBR.addBox(-8F, -7F, -8F, 2, 6, 2); + cornerBR.setRotationPoint(0F, 24F, 0F); + cornerBR.setTextureSize(64, 64); + cornerBR.mirror = true; + setRotation(cornerBR, 0F, 1.570796F, 0F); + Left = new ModelRenderer(this, 0, 0); + Left.addBox(-6F, -6F, -8F, 12, 7, 2); + Left.setRotationPoint(0F, 22F, 0F); + Left.setTextureSize(64, 64); + Left.mirror = true; + setRotation(Left, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 15); + Base.addBox(-8F, 1F, -8F, 16, 1, 16); + Base.setRotationPoint(0F, 22F, 0F); + Base.setTextureSize(64, 64); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + front = new ModelRenderer(this, 0, 0); + front.addBox(-6F, -8F, -8F, 12, 7, 2); + front.setRotationPoint(0F, 24F, 0F); + front.setTextureSize(64, 64); + front.mirror = true; + setRotation(front, 0F, -1.570796F, 0F); + cornerBL = new ModelRenderer(this, 0, 9); + cornerBL.addBox(6F, -5F, -8F, 2, 6, 2); + cornerBL.setRotationPoint(0F, 22F, 0F); + cornerBL.setTextureSize(64, 64); + cornerBL.mirror = true; + setRotation(cornerBL, 0F, 1.570796F, 0F); + cornerFR = new ModelRenderer(this, 0, 9); + cornerFR.addBox(-8F, -7F, 6F, 2, 6, 2); + cornerFR.setRotationPoint(0F, 24F, 0F); + cornerFR.setTextureSize(64, 64); + cornerFR.mirror = true; + setRotation(cornerFR, 0F, 1.570796F, 0F); + cornerFL = new ModelRenderer(this, 0, 9); + cornerFL.addBox(6F, -7F, 6F, 2, 6, 2); + cornerFL.setRotationPoint(0F, 24F, 0F); + cornerFL.setTextureSize(64, 64); + cornerFL.mirror = true; + setRotation(cornerFL, 0F, 1.570796F, 0F); + fuel = new ModelRenderer(this, 32, 0); + fuel.addBox(-8F, -1F, -8F, 16, 0, 16); + fuel.addBox(-8F, -0.5F, -8F, 16, 0, 16); + fuel.addBox(-8F, -0F, -8F, 16, 0, 16); + fuel.setRotationPoint(0F, 18.5F, 0F); + fuel.setTextureSize(64, 64); + fuel.mirror = true; + setRotation(fuel, 0F, 0F, 0F); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - Back.render(f5); - Right.render(f5); - cornerBR.render(f5); - Left.render(f5); - Base.render(f5); - front.render(f5); - cornerBL.render(f5); - cornerFR.render(f5); - cornerFL.render(f5); - fuel.render(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + Back.render(f5); + Right.render(f5); + cornerBR.render(f5); + Left.render(f5); + Base.render(f5); + front.render(f5); + cornerBL.render(f5); + cornerFR.render(f5); + cornerFL.render(f5); + fuel.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void renderModel(TileEntityForge forge, float f, boolean hasFuel, float height) { - boolean[] sides = new boolean[] { true, true, true, true }; - if (forge != null) { - sides = forge.showSides(); - } + public void renderModel(TileEntityForge forge, float f, boolean hasFuel, float height) { + boolean[] sides = new boolean[]{true, true, true, true}; + if (forge != null) { + sides = forge.showSides(); + } - if (sides[0]) - front.render(f); + if (sides[0]) + front.render(f); - if (sides[1]) - Left.render(f); + if (sides[1]) + Left.render(f); - if (sides[2]) - Right.render(f); + if (sides[2]) + Right.render(f); - if (sides[3]) - Back.render(f); + if (sides[3]) + Back.render(f); - if (sides[3] || sides[2]) - cornerBR.render(f); + if (sides[3] || sides[2]) + cornerBR.render(f); - if (sides[3] || sides[1]) - cornerBL.render(f); + if (sides[3] || sides[1]) + cornerBL.render(f); - if (sides[0] || sides[2]) - cornerFR.render(f); + if (sides[0] || sides[2]) + cornerFR.render(f); - if (sides[0] || sides[1]) - cornerFL.render(f); - Base.render(f); - if (hasFuel) { - fuel.offsetY = -height * 0.3F + 0.3F; - fuel.render(f); - } - } + if (sides[0] || sides[1]) + cornerFL.render(f); + Base.render(f); + if (hasFuel) { + fuel.offsetY = -height * 0.3F + 0.3F; + fuel.render(f); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelForgeTop.java b/src/main/java/minefantasy/mf2/client/render/block/ModelForgeTop.java index 1a4c99cc..48377958 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelForgeTop.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelForgeTop.java @@ -5,103 +5,102 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelForgeTop extends ModelBase { - // fields - ModelRenderer Back; - ModelRenderer Right; - ModelRenderer cornerBR; - ModelRenderer Left; - ModelRenderer front; - ModelRenderer cornerBL; - ModelRenderer cornerFR; - ModelRenderer cornerFL; - ModelRenderer Top; + // fields + ModelRenderer Back; + ModelRenderer Right; + ModelRenderer cornerBR; + ModelRenderer Left; + ModelRenderer front; + ModelRenderer cornerBL; + ModelRenderer cornerFR; + ModelRenderer cornerFL; + ModelRenderer Top; - public ModelForgeTop() { - textureWidth = 64; - textureHeight = 32; + public ModelForgeTop() { + textureWidth = 64; + textureHeight = 32; - Back = new ModelRenderer(this, 0, 0); - Back.addBox(-4F, -5F, -6F, 8, 6, 2); - Back.setRotationPoint(0F, 22F, 0F); - Back.setTextureSize(64, 32); - Back.mirror = true; - setRotation(Back, 0F, 1.570796F, 0F); - Right = new ModelRenderer(this, 0, 0); - Right.addBox(-4F, -7F, -6F, 8, 6, 2); - Right.setRotationPoint(0F, 24F, 0F); - Right.setTextureSize(64, 32); - Right.mirror = true; - setRotation(Right, 0F, 3.154392F, 0F); - cornerBR = new ModelRenderer(this, 0, 8); - cornerBR.addBox(-6F, -13F, -6F, 2, 12, 2); - cornerBR.setRotationPoint(0F, 24F, 0F); - cornerBR.setTextureSize(64, 32); - cornerBR.mirror = true; - setRotation(cornerBR, 0F, 1.570796F, 0F); - Left = new ModelRenderer(this, 0, 0); - Left.addBox(-4F, -5F, -6F, 8, 6, 2); - Left.setRotationPoint(0F, 22F, 0F); - Left.setTextureSize(64, 32); - Left.mirror = true; - setRotation(Left, 0F, 0F, 0F); - front = new ModelRenderer(this, 0, 0); - front.addBox(-4F, -7F, -6F, 8, 6, 2); - front.setRotationPoint(0F, 24F, 0F); - front.setTextureSize(64, 32); - front.mirror = true; - setRotation(front, 0F, -1.570796F, 0F); - cornerBL = new ModelRenderer(this, 0, 8); - cornerBL.addBox(4F, -11F, -6F, 2, 12, 2); - cornerBL.setRotationPoint(0F, 22F, 0F); - cornerBL.setTextureSize(64, 32); - cornerBL.mirror = true; - setRotation(cornerBL, 0F, 1.570796F, 0F); - cornerFR = new ModelRenderer(this, 0, 8); - cornerFR.addBox(-6F, -13F, 4F, 2, 12, 2); - cornerFR.setRotationPoint(0F, 24F, 0F); - cornerFR.setTextureSize(64, 32); - cornerFR.mirror = true; - setRotation(cornerFR, 0F, 1.570796F, 0F); - cornerFL = new ModelRenderer(this, 0, 8); - cornerFL.addBox(4F, -13F, 4F, 2, 12, 2); - cornerFL.setRotationPoint(0F, 24F, 0F); - cornerFL.setTextureSize(64, 32); - cornerFL.mirror = true; - setRotation(cornerFL, 0F, 1.570796F, 0F); - Top = new ModelRenderer(this, 20, 0); - Top.addBox(-6F, -14F, -6F, 12, 3, 12); - Top.setRotationPoint(0F, 22F, 0F); - Top.setTextureSize(64, 32); - Top.mirror = true; - setRotation(Top, 0F, 0F, 0F); - } + Back = new ModelRenderer(this, 0, 0); + Back.addBox(-4F, -5F, -6F, 8, 6, 2); + Back.setRotationPoint(0F, 22F, 0F); + Back.setTextureSize(64, 32); + Back.mirror = true; + setRotation(Back, 0F, 1.570796F, 0F); + Right = new ModelRenderer(this, 0, 0); + Right.addBox(-4F, -7F, -6F, 8, 6, 2); + Right.setRotationPoint(0F, 24F, 0F); + Right.setTextureSize(64, 32); + Right.mirror = true; + setRotation(Right, 0F, 3.154392F, 0F); + cornerBR = new ModelRenderer(this, 0, 8); + cornerBR.addBox(-6F, -13F, -6F, 2, 12, 2); + cornerBR.setRotationPoint(0F, 24F, 0F); + cornerBR.setTextureSize(64, 32); + cornerBR.mirror = true; + setRotation(cornerBR, 0F, 1.570796F, 0F); + Left = new ModelRenderer(this, 0, 0); + Left.addBox(-4F, -5F, -6F, 8, 6, 2); + Left.setRotationPoint(0F, 22F, 0F); + Left.setTextureSize(64, 32); + Left.mirror = true; + setRotation(Left, 0F, 0F, 0F); + front = new ModelRenderer(this, 0, 0); + front.addBox(-4F, -7F, -6F, 8, 6, 2); + front.setRotationPoint(0F, 24F, 0F); + front.setTextureSize(64, 32); + front.mirror = true; + setRotation(front, 0F, -1.570796F, 0F); + cornerBL = new ModelRenderer(this, 0, 8); + cornerBL.addBox(4F, -11F, -6F, 2, 12, 2); + cornerBL.setRotationPoint(0F, 22F, 0F); + cornerBL.setTextureSize(64, 32); + cornerBL.mirror = true; + setRotation(cornerBL, 0F, 1.570796F, 0F); + cornerFR = new ModelRenderer(this, 0, 8); + cornerFR.addBox(-6F, -13F, 4F, 2, 12, 2); + cornerFR.setRotationPoint(0F, 24F, 0F); + cornerFR.setTextureSize(64, 32); + cornerFR.mirror = true; + setRotation(cornerFR, 0F, 1.570796F, 0F); + cornerFL = new ModelRenderer(this, 0, 8); + cornerFL.addBox(4F, -13F, 4F, 2, 12, 2); + cornerFL.setRotationPoint(0F, 24F, 0F); + cornerFL.setTextureSize(64, 32); + cornerFL.mirror = true; + setRotation(cornerFL, 0F, 1.570796F, 0F); + Top = new ModelRenderer(this, 20, 0); + Top.addBox(-6F, -14F, -6F, 12, 3, 12); + Top.setRotationPoint(0F, 22F, 0F); + Top.setTextureSize(64, 32); + Top.mirror = true; + setRotation(Top, 0F, 0F, 0F); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + } - public void render(float f) { - Back.render(f); - Right.render(f); - cornerBR.render(f); - Left.render(f); - front.render(f); - cornerBL.render(f); - cornerFR.render(f); - cornerFL.render(f); - Top.render(f); - } + public void render(float f) { + Back.render(f); + Right.render(f); + cornerBR.render(f); + Left.render(f); + front.render(f); + cornerBL.render(f); + cornerFR.render(f); + cornerFL.render(f); + Top.render(f); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelOven.java b/src/main/java/minefantasy/mf2/client/render/block/ModelOven.java index 3305a375..a73d884d 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelOven.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelOven.java @@ -5,93 +5,92 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelOven extends ModelBase { - ModelRenderer top; - ModelRenderer base; - ModelRenderer right; - ModelRenderer topfront; - ModelRenderer left; - ModelRenderer back; - ModelRenderer front; + ModelRenderer top; + ModelRenderer base; + ModelRenderer right; + ModelRenderer topfront; + ModelRenderer left; + ModelRenderer back; + ModelRenderer front; - public ModelOven() { - float offsetY = 1F; - textureWidth = 64; - textureHeight = 32; + public ModelOven() { + float offsetY = 1F; + textureWidth = 64; + textureHeight = 32; - top = new ModelRenderer(this, 24, 0); - top.addBox(-5F, -11F + offsetY, -5F, 10, 1, 10); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 32); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); + top = new ModelRenderer(this, 24, 0); + top.addBox(-5F, -11F + offsetY, -5F, 10, 1, 10); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 32); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); - base = new ModelRenderer(this, 24, 21); - base.addBox(-5F, offsetY, -5F, 10, 1, 10); - base.setRotationPoint(0F, 0F, 0F); - base.setTextureSize(64, 32); - base.mirror = true; - setRotation(base, 0F, 0F, 0F); + base = new ModelRenderer(this, 24, 21); + base.addBox(-5F, offsetY, -5F, 10, 1, 10); + base.setRotationPoint(0F, 0F, 0F); + base.setTextureSize(64, 32); + base.mirror = true; + setRotation(base, 0F, 0F, 0F); - right = new ModelRenderer(this, 0, 11); - right.addBox(-5F, -10F + offsetY, 5F, 10, 10, 1); - right.setRotationPoint(0F, 0F, 0F); - right.setTextureSize(64, 32); - right.mirror = true; - setRotation(right, 0F, 1.570796F, 0F); + right = new ModelRenderer(this, 0, 11); + right.addBox(-5F, -10F + offsetY, 5F, 10, 10, 1); + right.setRotationPoint(0F, 0F, 0F); + right.setTextureSize(64, 32); + right.mirror = true; + setRotation(right, 0F, 1.570796F, 0F); - topfront = new ModelRenderer(this, 22, 11); - topfront.addBox(-5F, -10F + offsetY, -6F, 10, 2, 1); - topfront.setRotationPoint(0F, 0F, 0F); - topfront.setTextureSize(64, 32); - topfront.mirror = true; - setRotation(topfront, 0F, 0F, 0F); + topfront = new ModelRenderer(this, 22, 11); + topfront.addBox(-5F, -10F + offsetY, -6F, 10, 2, 1); + topfront.setRotationPoint(0F, 0F, 0F); + topfront.setTextureSize(64, 32); + topfront.mirror = true; + setRotation(topfront, 0F, 0F, 0F); - left = new ModelRenderer(this, 0, 11); - left.addBox(-5F, -10F + offsetY, 5F, 10, 10, 1); - left.setRotationPoint(0F, 0F, 0F); - left.setTextureSize(64, 32); - left.mirror = true; - setRotation(left, 0F, -1.570796F, 0F); + left = new ModelRenderer(this, 0, 11); + left.addBox(-5F, -10F + offsetY, 5F, 10, 10, 1); + left.setRotationPoint(0F, 0F, 0F); + left.setTextureSize(64, 32); + left.mirror = true; + setRotation(left, 0F, -1.570796F, 0F); - back = new ModelRenderer(this, 0, 11); - back.addBox(-5F, -10F + offsetY, 5F, 10, 10, 1); - back.setRotationPoint(0F, 0F, 0F); - back.setTextureSize(64, 32); - back.mirror = true; - setRotation(back, 0F, 0F, 0F); + back = new ModelRenderer(this, 0, 11); + back.addBox(-5F, -10F + offsetY, 5F, 10, 10, 1); + back.setRotationPoint(0F, 0F, 0F); + back.setTextureSize(64, 32); + back.mirror = true; + setRotation(back, 0F, 0F, 0F); - front = new ModelRenderer(this, 22, 18); - front.addBox(-5F, -2F + offsetY, -6F, 10, 2, 1); - front.setRotationPoint(0F, 0F, 0F); - front.setTextureSize(64, 32); - front.mirror = true; - setRotation(front, 0F, 0F, 0F); - } + front = new ModelRenderer(this, 22, 18); + front.addBox(-5F, -2F + offsetY, -6F, 10, 2, 1); + front.setRotationPoint(0F, 0F, 0F); + front.setTextureSize(64, 32); + front.mirror = true; + setRotation(front, 0F, 0F, 0F); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + } - public void render(float f) { - top.render(f); - base.render(f); - right.render(f); - topfront.render(f); - left.render(f); - back.render(f); - front.render(f); - } + public void render(float f) { + top.render(f); + base.render(f); + right.render(f); + topfront.render(f); + left.render(f); + back.render(f); + front.render(f); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelQuern.java b/src/main/java/minefantasy/mf2/client/render/block/ModelQuern.java index 4f29c12f..334dfa63 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelQuern.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelQuern.java @@ -6,57 +6,56 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelQuern extends ModelBase { - ModelRenderer base; - ModelRenderer top; - ModelRenderer handle; - ModelRenderer core; - - public ModelQuern() { - textureWidth = 64; - textureHeight = 64; - - base = new ModelRenderer(this, 0, 0); - base.addBox(-8F, 3F, -8F, 16, 13, 16); - base.setRotationPoint(0F, 0F, 0F); - base.setTextureSize(64, 32); - - top = new ModelRenderer(this, 0, 29); - top.addBox(-6F, 2F, -6F, 12, 1, 12); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 32); - - handle = new ModelRenderer(this, 48, 29); - handle.addBox(3F, 0F, -5F, 2, 2, 2); - handle.setRotationPoint(0F, 0F, 0F); - handle.setTextureSize(64, 32); - - core = new ModelRenderer(this, 48, 29); - core.addBox(-1, 0F, -1F, 2, 2, 2); - core.setRotationPoint(0F, 0F, 0F); - core.setTextureSize(64, 32); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - } - - public void renderModel(TileEntityQuern quern, float f) { - if (quern != null) { - top.rotateAngleY = handle.rotateAngleY = (float) (Math.PI * quern.turnAngle) / TileEntityQuern.getMaxRevs() - * 2; - } - - base.render(f); - top.render(f); - core.render(f); - handle.render(f); - } + ModelRenderer base; + ModelRenderer top; + ModelRenderer handle; + ModelRenderer core; + + public ModelQuern() { + textureWidth = 64; + textureHeight = 64; + + base = new ModelRenderer(this, 0, 0); + base.addBox(-8F, 3F, -8F, 16, 13, 16); + base.setRotationPoint(0F, 0F, 0F); + base.setTextureSize(64, 32); + + top = new ModelRenderer(this, 0, 29); + top.addBox(-6F, 2F, -6F, 12, 1, 12); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 32); + + handle = new ModelRenderer(this, 48, 29); + handle.addBox(3F, 0F, -5F, 2, 2, 2); + handle.setRotationPoint(0F, 0F, 0F); + handle.setTextureSize(64, 32); + + core = new ModelRenderer(this, 48, 29); + core.addBox(-1, 0F, -1F, 2, 2, 2); + core.setRotationPoint(0F, 0F, 0F); + core.setTextureSize(64, 32); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + } + + public void renderModel(TileEntityQuern quern, float f) { + if (quern != null) { + top.rotateAngleY = handle.rotateAngleY = (float) (Math.PI * quern.turnAngle) / TileEntityQuern.getMaxRevs() + * 2; + } + + base.render(f); + top.render(f); + core.render(f); + handle.render(f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelRack.java b/src/main/java/minefantasy/mf2/client/render/block/ModelRack.java index cebf6258..1b8d07ca 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelRack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelRack.java @@ -5,82 +5,82 @@ import net.minecraft.entity.Entity; public class ModelRack extends ModelBase { - // fields - ModelRenderer rStrut; - ModelRenderer beam; - ModelRenderer rack1; - ModelRenderer lStrut; - ModelRenderer divider3; - ModelRenderer divider1; - ModelRenderer dividerR; - ModelRenderer divider2; - ModelRenderer dividerL; + // fields + ModelRenderer rStrut; + ModelRenderer beam; + ModelRenderer rack1; + ModelRenderer lStrut; + ModelRenderer divider3; + ModelRenderer divider1; + ModelRenderer dividerR; + ModelRenderer divider2; + ModelRenderer dividerL; - public ModelRack() { - textureWidth = 64; - textureHeight = 32; + public ModelRack() { + textureWidth = 64; + textureHeight = 32; - rStrut = new ModelRenderer(this, 0, 0); - rStrut.addBox(7F, 0F, 6F, 1, 16, 2); - rStrut.setRotationPoint(0F, 0F, 0F); + rStrut = new ModelRenderer(this, 0, 0); + rStrut.addBox(7F, 0F, 6F, 1, 16, 2); + rStrut.setRotationPoint(0F, 0F, 0F); - beam = new ModelRenderer(this, 0, 29); - beam.addBox(-8F, 13F, 5F, 16, 1, 1); - beam.setRotationPoint(0F, 0F, 0F); + beam = new ModelRenderer(this, 0, 29); + beam.addBox(-8F, 13F, 5F, 16, 1, 1); + beam.setRotationPoint(0F, 0F, 0F); - rack1 = new ModelRenderer(this, 0, 29); - rack1.addBox(-8F, 3F, 5F, 16, 2, 1); - rack1.setRotationPoint(0F, 0F, 0F); + rack1 = new ModelRenderer(this, 0, 29); + rack1.addBox(-8F, 3F, 5F, 16, 2, 1); + rack1.setRotationPoint(0F, 0F, 0F); - lStrut = new ModelRenderer(this, 0, 0); - lStrut.addBox(-8F, 0F, 6F, 1, 16, 2); - lStrut.setRotationPoint(0F, 0F, 0F); + lStrut = new ModelRenderer(this, 0, 0); + lStrut.addBox(-8F, 0F, 6F, 1, 16, 2); + lStrut.setRotationPoint(0F, 0F, 0F); - divider3 = new ModelRenderer(this, 0, 29); - divider3.addBox(3F, 4F, 3F, 2, 1, 2); - divider3.setRotationPoint(0F, 0F, 0F); + divider3 = new ModelRenderer(this, 0, 29); + divider3.addBox(3F, 4F, 3F, 2, 1, 2); + divider3.setRotationPoint(0F, 0F, 0F); - divider1 = new ModelRenderer(this, 0, 29); - divider1.addBox(-1F, 4F, 3F, 2, 1, 2); - divider1.setRotationPoint(0F, 0F, 0F); + divider1 = new ModelRenderer(this, 0, 29); + divider1.addBox(-1F, 4F, 3F, 2, 1, 2); + divider1.setRotationPoint(0F, 0F, 0F); - dividerR = new ModelRenderer(this, 1, 29); - dividerR.addBox(7F, 4F, 3F, 1, 1, 2); - dividerR.setRotationPoint(0F, 0F, 0F); + dividerR = new ModelRenderer(this, 1, 29); + dividerR.addBox(7F, 4F, 3F, 1, 1, 2); + dividerR.setRotationPoint(0F, 0F, 0F); - divider2 = new ModelRenderer(this, 0, 29); - divider2.addBox(-5F, 4F, 3F, 2, 1, 2); - divider2.setRotationPoint(0F, 0F, 0F); + divider2 = new ModelRenderer(this, 0, 29); + divider2.addBox(-5F, 4F, 3F, 2, 1, 2); + divider2.setRotationPoint(0F, 0F, 0F); - dividerL = new ModelRenderer(this, 0, 29); - dividerL.addBox(-8F, 4F, 3F, 1, 1, 2); - dividerL.setRotationPoint(0F, 0F, 0F); - } + dividerL = new ModelRenderer(this, 0, 29); + dividerL.addBox(-8F, 4F, 3F, 1, 1, 2); + dividerL.setRotationPoint(0F, 0F, 0F); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - rStrut.render(f5); - beam.render(f5); - rack1.render(f5); - lStrut.render(f5); - divider3.render(f5); - divider1.render(f5); - dividerR.render(f5); - divider2.render(f5); - dividerL.render(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + rStrut.render(f5); + beam.render(f5); + rack1.render(f5); + lStrut.render(f5); + divider3.render(f5); + divider1.render(f5); + dividerR.render(f5); + divider2.render(f5); + dividerL.render(f5); + } - public void renderModel(float scale) { - rStrut.render(scale); - beam.render(scale); - rack1.render(scale); - lStrut.render(scale); - divider3.render(scale); - divider1.render(scale); - dividerR.render(scale); - divider2.render(scale); - dividerL.render(scale); - } + public void renderModel(float scale) { + rStrut.render(scale); + beam.render(scale); + rack1.render(scale); + lStrut.render(scale); + divider3.render(scale); + divider1.render(scale); + dividerR.render(scale); + divider2.render(scale); + dividerL.render(scale); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelResearch.java b/src/main/java/minefantasy/mf2/client/render/block/ModelResearch.java index f250ab74..a4d7a12a 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelResearch.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelResearch.java @@ -5,115 +5,114 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelResearch extends ModelBase { - // fields - ModelRenderer top; - ModelRenderer FRleg; - ModelRenderer bottom; - ModelRenderer BRleg; - ModelRenderer BLleg; - ModelRenderer FLleg; - ModelRenderer papers2; - ModelRenderer ink; - ModelRenderer book; - ModelRenderer papers; + // fields + ModelRenderer top; + ModelRenderer FRleg; + ModelRenderer bottom; + ModelRenderer BRleg; + ModelRenderer BLleg; + ModelRenderer FLleg; + ModelRenderer papers2; + ModelRenderer ink; + ModelRenderer book; + ModelRenderer papers; - public ModelResearch() { - textureWidth = 64; - textureHeight = 64; + public ModelResearch() { + textureWidth = 64; + textureHeight = 64; - top = new ModelRenderer(this, 0, 0); - top.addBox(-8F, 4F, -8F, 16, 4, 16); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 64); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - FRleg = new ModelRenderer(this, 0, 35); - FRleg.addBox(3F, 8F, -7F, 4, 12, 4); - FRleg.setRotationPoint(0F, 0F, 0F); - FRleg.setTextureSize(64, 64); - FRleg.mirror = true; - setRotation(FRleg, 0F, 0F, 0F); - bottom = new ModelRenderer(this, 0, 20); - bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); - bottom.setRotationPoint(0F, 0F, 0F); - bottom.setTextureSize(64, 64); - bottom.mirror = true; - setRotation(bottom, 0F, 0F, 0F); - BRleg = new ModelRenderer(this, 0, 35); - BRleg.addBox(3F, 8F, 3F, 4, 12, 4); - BRleg.setRotationPoint(0F, 0F, 0F); - BRleg.setTextureSize(64, 64); - BRleg.mirror = true; - setRotation(BRleg, 0F, 0F, 0F); - BLleg = new ModelRenderer(this, 0, 35); - BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); - BLleg.setRotationPoint(0F, 0F, 0F); - BLleg.setTextureSize(64, 64); - BLleg.mirror = true; - setRotation(BLleg, 0F, 0F, 0F); - FLleg = new ModelRenderer(this, 0, 35); - FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); - FLleg.setRotationPoint(0F, 0F, 0F); - FLleg.setTextureSize(64, 64); - FLleg.mirror = true; - setRotation(FLleg, 0F, 0F, 0F); - papers = new ModelRenderer(this, 0, 51); - papers.addBox(-3F, -1F, -4F, 6, 0, 8); - papers.setRotationPoint(0F, 4.5F, -2F); - papers.setTextureSize(64, 64); - papers.mirror = true; - setRotation(papers, 0F, 0.296706F, 0F); - ink = new ModelRenderer(this, 0, 0); - ink.addBox(-1F, -1F, -1F, 2, 2, 2); - ink.setRotationPoint(5F, 3F, 4F); - ink.setTextureSize(64, 64); - ink.mirror = true; - setRotation(ink, 0F, 0F, 0F); - book = new ModelRenderer(this, 16, 35); - book.addBox(-3F, -1F, -4F, 6, 3, 8); - book.setRotationPoint(-4F, 2F, 4F); - book.setTextureSize(64, 64); - book.mirror = true; - setRotation(book, 0F, -0.1396263F, 0F); - papers2 = new ModelRenderer(this, 0, 51); - papers2.addBox(-3F, -1F, -4F, 6, 1, 8); - papers2.setRotationPoint(0F, 14F, 0F); - papers2.setTextureSize(64, 64); - papers2.mirror = true; - setRotation(papers2, 0F, 0.6283185F, 0F); - } + top = new ModelRenderer(this, 0, 0); + top.addBox(-8F, 4F, -8F, 16, 4, 16); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 64); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + FRleg = new ModelRenderer(this, 0, 35); + FRleg.addBox(3F, 8F, -7F, 4, 12, 4); + FRleg.setRotationPoint(0F, 0F, 0F); + FRleg.setTextureSize(64, 64); + FRleg.mirror = true; + setRotation(FRleg, 0F, 0F, 0F); + bottom = new ModelRenderer(this, 0, 20); + bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); + bottom.setRotationPoint(0F, 0F, 0F); + bottom.setTextureSize(64, 64); + bottom.mirror = true; + setRotation(bottom, 0F, 0F, 0F); + BRleg = new ModelRenderer(this, 0, 35); + BRleg.addBox(3F, 8F, 3F, 4, 12, 4); + BRleg.setRotationPoint(0F, 0F, 0F); + BRleg.setTextureSize(64, 64); + BRleg.mirror = true; + setRotation(BRleg, 0F, 0F, 0F); + BLleg = new ModelRenderer(this, 0, 35); + BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); + BLleg.setRotationPoint(0F, 0F, 0F); + BLleg.setTextureSize(64, 64); + BLleg.mirror = true; + setRotation(BLleg, 0F, 0F, 0F); + FLleg = new ModelRenderer(this, 0, 35); + FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); + FLleg.setRotationPoint(0F, 0F, 0F); + FLleg.setTextureSize(64, 64); + FLleg.mirror = true; + setRotation(FLleg, 0F, 0F, 0F); + papers = new ModelRenderer(this, 0, 51); + papers.addBox(-3F, -1F, -4F, 6, 0, 8); + papers.setRotationPoint(0F, 4.5F, -2F); + papers.setTextureSize(64, 64); + papers.mirror = true; + setRotation(papers, 0F, 0.296706F, 0F); + ink = new ModelRenderer(this, 0, 0); + ink.addBox(-1F, -1F, -1F, 2, 2, 2); + ink.setRotationPoint(5F, 3F, 4F); + ink.setTextureSize(64, 64); + ink.mirror = true; + setRotation(ink, 0F, 0F, 0F); + book = new ModelRenderer(this, 16, 35); + book.addBox(-3F, -1F, -4F, 6, 3, 8); + book.setRotationPoint(-4F, 2F, 4F); + book.setTextureSize(64, 64); + book.mirror = true; + setRotation(book, 0F, -0.1396263F, 0F); + papers2 = new ModelRenderer(this, 0, 51); + papers2.addBox(-3F, -1F, -4F, 6, 1, 8); + papers2.setRotationPoint(0F, 14F, 0F); + papers2.setTextureSize(64, 64); + papers2.mirror = true; + setRotation(papers2, 0F, 0.6283185F, 0F); + } - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } - public void renderModel(float f) { - top.render(f); - bottom.render(f); - FLleg.render(f); - BLleg.render(f); - FRleg.render(f); - BRleg.render(f); - papers.render(f); - papers2.render(f); - ink.render(f); - book.render(f); + public void renderModel(float f) { + top.render(f); + bottom.render(f); + FLleg.render(f); + BLleg.render(f); + FRleg.render(f); + BRleg.render(f); + papers.render(f); + papers2.render(f); + ink.render(f); + book.render(f); - } + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelRoast.java b/src/main/java/minefantasy/mf2/client/render/block/ModelRoast.java index 278b7695..bd7f7cd9 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelRoast.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelRoast.java @@ -5,78 +5,77 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelRoast extends ModelBase { - ModelRenderer side2B; - ModelRenderer side1B; - ModelRenderer Top; - ModelRenderer side2; - ModelRenderer side1; + ModelRenderer side2B; + ModelRenderer side1B; + ModelRenderer Top; + ModelRenderer side2; + ModelRenderer side1; - public ModelRoast() { - textureWidth = 64; - textureHeight = 32; + public ModelRoast() { + textureWidth = 64; + textureHeight = 32; - side2B = new ModelRenderer(this, 10, 4); - side1B = new ModelRenderer(this, 10, 4); - Top = new ModelRenderer(this, 0, 0); - side2 = new ModelRenderer(this, 0, 4); - side1 = new ModelRenderer(this, 0, 4); + side2B = new ModelRenderer(this, 10, 4); + side1B = new ModelRenderer(this, 10, 4); + Top = new ModelRenderer(this, 0, 0); + side2 = new ModelRenderer(this, 0, 4); + side1 = new ModelRenderer(this, 0, 4); - side2B.addBox(7F, 22F, -1.5F, 2, 17, 3); - side2B.setRotationPoint(0F, 2F, 0F); - side2B.setTextureSize(64, 32); - side2B.mirror = true; - side1B.mirror = true; - side1B.addBox(-9F, 22F, -1.5F, 2, 17, 3); - side1B.setRotationPoint(0F, 2F, 0F); - side1B.setTextureSize(64, 32); - side1B.mirror = true; - side1B.mirror = false; - Top.addBox(-8F, 12F, -1F, 16, 2, 2); - Top.setRotationPoint(0F, 2F, 0F); - Top.setTextureSize(64, 32); - Top.mirror = true; - side2.addBox(7F, 5F, -1.5F, 2, 17, 3); - side2.setRotationPoint(0F, 2F, 0F); - side2.setTextureSize(64, 32); - side2.mirror = true; - side1.addBox(-9F, 5F, -1.5F, 2, 17, 3); - side1.setRotationPoint(0F, 2F, 0F); - side1.setTextureSize(64, 32); - side1.mirror = true; - } + side2B.addBox(7F, 22F, -1.5F, 2, 17, 3); + side2B.setRotationPoint(0F, 2F, 0F); + side2B.setTextureSize(64, 32); + side2B.mirror = true; + side1B.mirror = true; + side1B.addBox(-9F, 22F, -1.5F, 2, 17, 3); + side1B.setRotationPoint(0F, 2F, 0F); + side1B.setTextureSize(64, 32); + side1B.mirror = true; + side1B.mirror = false; + Top.addBox(-8F, 12F, -1F, 16, 2, 2); + Top.setRotationPoint(0F, 2F, 0F); + Top.setTextureSize(64, 32); + Top.mirror = true; + side2.addBox(7F, 5F, -1.5F, 2, 17, 3); + side2.setRotationPoint(0F, 2F, 0F); + side2.setTextureSize(64, 32); + side2.mirror = true; + side1.addBox(-9F, 5F, -1.5F, 2, 17, 3); + side1.setRotationPoint(0F, 2F, 0F); + side1.setTextureSize(64, 32); + side1.mirror = true; + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - Top.render(f5); - side1.render(f5); - side2.render(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + Top.render(f5); + side1.render(f5); + side2.render(f5); + } - public void renderModel(float f5) { - Top.render(f5); - side1.render(f5); - side2.render(f5); - } + public void renderModel(float f5) { + Top.render(f5); + side1.render(f5); + side2.render(f5); + } - public void renderModel(boolean L, boolean R, float scale, boolean base) { - Top.render(scale); - if (L) - side1.render(scale); - if (R) - side2.render(scale); - if (base) { - if (L) - side1B.render(scale); - if (R) - side2B.render(scale); - } - } + public void renderModel(boolean L, boolean R, float scale, boolean base) { + Top.render(scale); + if (L) + side1.render(scale); + if (R) + side2.render(scale); + if (base) { + if (L) + side1B.render(scale); + if (R) + side2B.render(scale); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelSmallCrate.java b/src/main/java/minefantasy/mf2/client/render/block/ModelSmallCrate.java index f03404eb..f9424585 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelSmallCrate.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelSmallCrate.java @@ -3,58 +3,57 @@ import net.minecraft.client.model.ModelRenderer; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelSmallCrate extends ModelAmmoBox { - public ModelSmallCrate() { - textureWidth = 64; - textureHeight = 32; + public ModelSmallCrate() { + textureWidth = 64; + textureHeight = 32; - LeftWall = new ModelRenderer(this, 40, 1); - LeftWall.addBox(-8F, -7F, -5F, 1, 7, 10); - LeftWall.setRotationPoint(0F, 0F, 0F); - LeftWall.setTextureSize(64, 32); - setRotation(LeftWall, 0F, 0F, 0F); - FrontWall = new ModelRenderer(this, 0, 10); - FrontWall.addBox(-7F, -7F, -6F, 14, 8, 1); - FrontWall.setRotationPoint(0F, 0F, 0F); - FrontWall.setTextureSize(64, 32); - setRotation(FrontWall, 0F, 0F, 0F); - BackWall = new ModelRenderer(this, 0, 10); - BackWall.addBox(-7F, -7F, 5F, 14, 8, 1); - BackWall.setRotationPoint(0F, 0F, 0F); - BackWall.setTextureSize(64, 32); - setRotation(BackWall, 0F, 0F, 0F); - RightWall = new ModelRenderer(this, 40, 1); - RightWall.addBox(7F, -7F, -5F, 1, 7, 10); - RightWall.setRotationPoint(0F, 0F, 0F); - RightWall.setTextureSize(64, 32); - setRotation(RightWall, 0F, 0F, 0F); - lid = new ModelRenderer(this, 0, 19); - lid.addBox(-7F, -1F, -12F, 14, 1, 12); - lid.setRotationPoint(0F, -7F, 6F); - lid.setTextureSize(64, 32); - setRotation(lid, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-7F, 0F, -5F, 14, 1, 10); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - setRotation(Base, 0F, 0F, 0F); - lock2 = new ModelRenderer(this, 0, 0); - lock2.addBox(2F, -1.5F, -12.5F, 2, 3, 2); - lock2.setRotationPoint(0F, -7F, 6F); - lock2.setTextureSize(64, 32); - setRotation(lock2, 0F, 0F, 0F); - lock1 = new ModelRenderer(this, 0, 0); - lock1.addBox(-4F, -1.5F, -12.5F, 2, 3, 2); - lock1.setRotationPoint(0F, -7F, 6F); - lock1.setTextureSize(64, 32); - setRotation(lock1, 0F, 0F, 0F); + LeftWall = new ModelRenderer(this, 40, 1); + LeftWall.addBox(-8F, -7F, -5F, 1, 7, 10); + LeftWall.setRotationPoint(0F, 0F, 0F); + LeftWall.setTextureSize(64, 32); + setRotation(LeftWall, 0F, 0F, 0F); + FrontWall = new ModelRenderer(this, 0, 10); + FrontWall.addBox(-7F, -7F, -6F, 14, 8, 1); + FrontWall.setRotationPoint(0F, 0F, 0F); + FrontWall.setTextureSize(64, 32); + setRotation(FrontWall, 0F, 0F, 0F); + BackWall = new ModelRenderer(this, 0, 10); + BackWall.addBox(-7F, -7F, 5F, 14, 8, 1); + BackWall.setRotationPoint(0F, 0F, 0F); + BackWall.setTextureSize(64, 32); + setRotation(BackWall, 0F, 0F, 0F); + RightWall = new ModelRenderer(this, 40, 1); + RightWall.addBox(7F, -7F, -5F, 1, 7, 10); + RightWall.setRotationPoint(0F, 0F, 0F); + RightWall.setTextureSize(64, 32); + setRotation(RightWall, 0F, 0F, 0F); + lid = new ModelRenderer(this, 0, 19); + lid.addBox(-7F, -1F, -12F, 14, 1, 12); + lid.setRotationPoint(0F, -7F, 6F); + lid.setTextureSize(64, 32); + setRotation(lid, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-7F, 0F, -5F, 14, 1, 10); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + setRotation(Base, 0F, 0F, 0F); + lock2 = new ModelRenderer(this, 0, 0); + lock2.addBox(2F, -1.5F, -12.5F, 2, 3, 2); + lock2.setRotationPoint(0F, -7F, 6F); + lock2.setTextureSize(64, 32); + setRotation(lock2, 0F, 0F, 0F); + lock1 = new ModelRenderer(this, 0, 0); + lock1.addBox(-4F, -1.5F, -12.5F, 2, 3, 2); + lock1.setRotationPoint(0F, -7F, 6F); + lock1.setTextureSize(64, 32); + setRotation(lock1, 0F, 0F, 0F); - RightWall.mirror = true; - } + RightWall.mirror = true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelSmokePipe.java b/src/main/java/minefantasy/mf2/client/render/block/ModelSmokePipe.java index d89be8ce..2d32b1dc 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelSmokePipe.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelSmokePipe.java @@ -7,98 +7,97 @@ import net.minecraftforge.common.util.ForgeDirection; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelSmokePipe extends ModelBase { - ModelRenderer centre; - ModelRenderer north; - ModelRenderer south; - ModelRenderer up; - ModelRenderer down; - ModelRenderer east; - ModelRenderer west; + ModelRenderer centre; + ModelRenderer north; + ModelRenderer south; + ModelRenderer up; + ModelRenderer down; + ModelRenderer east; + ModelRenderer west; - public ModelSmokePipe() { - textureWidth = 64; - textureHeight = 64; + public ModelSmokePipe() { + textureWidth = 64; + textureHeight = 64; - centre = new ModelRenderer(this, 16, 12); - centre.addBox(-6F, -6F, -6F, 12, 12, 12); - centre.setRotationPoint(0F, 0F, 0F); - centre.setTextureSize(64, 64); + centre = new ModelRenderer(this, 16, 12); + centre.addBox(-6F, -6F, -6F, 12, 12, 12); + centre.setRotationPoint(0F, 0F, 0F); + centre.setTextureSize(64, 64); - setRotation(centre, 0F, 0F, 0F); - north = new ModelRenderer(this, 0, 0); - north.addBox(6F, -6F, -6F, 2, 12, 12); - north.setRotationPoint(0F, 0F, 0F); - north.setTextureSize(64, 64); + setRotation(centre, 0F, 0F, 0F); + north = new ModelRenderer(this, 0, 0); + north.addBox(6F, -6F, -6F, 2, 12, 12); + north.setRotationPoint(0F, 0F, 0F); + north.setTextureSize(64, 64); - setRotation(north, 0F, 1.570796F, 0F); - south = new ModelRenderer(this, 0, 0); - south.addBox(-8F, -6F, -6F, 2, 12, 12); - south.setRotationPoint(0F, 0F, 0F); - south.setTextureSize(64, 64); + setRotation(north, 0F, 1.570796F, 0F); + south = new ModelRenderer(this, 0, 0); + south.addBox(-8F, -6F, -6F, 2, 12, 12); + south.setRotationPoint(0F, 0F, 0F); + south.setTextureSize(64, 64); - setRotation(south, 0F, 1.570796F, 0F); - up = new ModelRenderer(this, 0, 0); - up.addBox(-8F, -6F, -6F, 2, 12, 12); - up.setRotationPoint(0F, 0F, 0F); - up.setTextureSize(64, 64); + setRotation(south, 0F, 1.570796F, 0F); + up = new ModelRenderer(this, 0, 0); + up.addBox(-8F, -6F, -6F, 2, 12, 12); + up.setRotationPoint(0F, 0F, 0F); + up.setTextureSize(64, 64); - setRotation(up, 0F, 0F, 1.570796F); - down = new ModelRenderer(this, 0, 0); - down.addBox(6F, -6F, -6F, 2, 12, 12); - down.setRotationPoint(0F, 0F, 0F); - down.setTextureSize(64, 64); + setRotation(up, 0F, 0F, 1.570796F); + down = new ModelRenderer(this, 0, 0); + down.addBox(6F, -6F, -6F, 2, 12, 12); + down.setRotationPoint(0F, 0F, 0F); + down.setTextureSize(64, 64); - setRotation(down, 0F, 0F, 1.570796F); - east = new ModelRenderer(this, 0, 0); - east.addBox(-8F, -6F, -6F, 2, 12, 12); - east.setRotationPoint(0F, 0F, 0F); - east.setTextureSize(64, 64); + setRotation(down, 0F, 0F, 1.570796F); + east = new ModelRenderer(this, 0, 0); + east.addBox(-8F, -6F, -6F, 2, 12, 12); + east.setRotationPoint(0F, 0F, 0F); + east.setTextureSize(64, 64); - setRotation(east, 0F, 0F, 0F); - west = new ModelRenderer(this, 0, 0); - west.addBox(6F, -6F, -6F, 2, 12, 12); - west.setRotationPoint(0F, 0F, 0F); - west.setTextureSize(64, 64); + setRotation(east, 0F, 0F, 0F); + west = new ModelRenderer(this, 0, 0); + west.addBox(6F, -6F, -6F, 2, 12, 12); + west.setRotationPoint(0F, 0F, 0F); + west.setTextureSize(64, 64); - setRotation(west, 0F, 0F, 0F); - } + setRotation(west, 0F, 0F, 0F); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } - protected void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + protected void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void renderModel(TileEntityChimney tile, float f) { - centre.render(f); - if (tile == null) { - east.render(f); - west.render(f); - } else { - if (tile.canAccept(ForgeDirection.UP)) - up.render(f); - if (tile.canAccept(ForgeDirection.DOWN)) - down.render(f); - if (tile.canAccept(ForgeDirection.NORTH)) - north.render(f); - if (tile.canAccept(ForgeDirection.SOUTH)) - south.render(f); - if (tile.canAccept(ForgeDirection.EAST)) - east.render(f); - if (tile.canAccept(ForgeDirection.WEST)) - west.render(f); - } - } + public void renderModel(TileEntityChimney tile, float f) { + centre.render(f); + if (tile == null) { + east.render(f); + west.render(f); + } else { + if (tile.canAccept(ForgeDirection.UP)) + up.render(f); + if (tile.canAccept(ForgeDirection.DOWN)) + down.render(f); + if (tile.canAccept(ForgeDirection.NORTH)) + north.render(f); + if (tile.canAccept(ForgeDirection.SOUTH)) + south.render(f); + if (tile.canAccept(ForgeDirection.EAST)) + east.render(f); + if (tile.canAccept(ForgeDirection.WEST)) + west.render(f); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelTanningRack.java b/src/main/java/minefantasy/mf2/client/render/block/ModelTanningRack.java index 8305af5a..d367fc55 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelTanningRack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelTanningRack.java @@ -5,70 +5,69 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelTanningRack extends ModelBase { - // fields - ModelRenderer Base; - ModelRenderer side2; - ModelRenderer side1; - ModelRenderer Top; + // fields + ModelRenderer Base; + ModelRenderer side2; + ModelRenderer side1; + ModelRenderer Top; - public ModelTanningRack() { - textureWidth = 64; - textureHeight = 32; + public ModelTanningRack() { + textureWidth = 64; + textureHeight = 32; - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-8F, 22F, -2.5F, 16, 2, 5); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - side2 = new ModelRenderer(this, 54, 0); - side2.addBox(6F, 5F, -1.5F, 2, 17, 3); - side2.setRotationPoint(0F, 0F, 0F); - side2.setTextureSize(64, 32); - side2.mirror = true; - setRotation(side2, 0F, 0F, 0F); - side1 = new ModelRenderer(this, 54, 0); - side1.mirror = true; - side1.addBox(-8F, 5F, -1.5F, 2, 17, 3); - side1.setRotationPoint(0F, 0F, 0F); - side1.setTextureSize(64, 32); - side1.mirror = true; - setRotation(side1, 0F, 0F, 0F); - side1.mirror = false; - Top = new ModelRenderer(this, 0, 27); - Top.addBox(-6F, 6F, -0.5F, 12, 3, 2); - Top.setRotationPoint(0F, 0F, 0F); - Top.setTextureSize(64, 32); - Top.mirror = true; - setRotation(Top, 0F, 0F, 0F); - } + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-8F, 22F, -2.5F, 16, 2, 5); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + side2 = new ModelRenderer(this, 54, 0); + side2.addBox(6F, 5F, -1.5F, 2, 17, 3); + side2.setRotationPoint(0F, 0F, 0F); + side2.setTextureSize(64, 32); + side2.mirror = true; + setRotation(side2, 0F, 0F, 0F); + side1 = new ModelRenderer(this, 54, 0); + side1.mirror = true; + side1.addBox(-8F, 5F, -1.5F, 2, 17, 3); + side1.setRotationPoint(0F, 0F, 0F); + side1.setTextureSize(64, 32); + side1.mirror = true; + setRotation(side1, 0F, 0F, 0F); + side1.mirror = false; + Top = new ModelRenderer(this, 0, 27); + Top.addBox(-6F, 6F, -0.5F, 12, 3, 2); + Top.setRotationPoint(0F, 0F, 0F); + Top.setTextureSize(64, 32); + Top.mirror = true; + setRotation(Top, 0F, 0F, 0F); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - Base.render(f5); - Top.render(f5); - side1.render(f5); - side2.render(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + Base.render(f5); + Top.render(f5); + side1.render(f5); + side2.render(f5); + } - public void renderModel(float f5) { - Base.render(f5); - Top.render(f5); - side1.render(f5); - side2.render(f5); - } + public void renderModel(float f5) { + Base.render(f5); + Top.render(f5); + side1.render(f5); + side2.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelTrough.java b/src/main/java/minefantasy/mf2/client/render/block/ModelTrough.java index 49744d45..969d42cf 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelTrough.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelTrough.java @@ -5,83 +5,82 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelTrough extends ModelBase { - ModelRenderer LeftWall; - ModelRenderer Fill; - ModelRenderer FrontWall; - ModelRenderer BackWall; - ModelRenderer RightWall; - ModelRenderer Base; + ModelRenderer LeftWall; + ModelRenderer Fill; + ModelRenderer FrontWall; + ModelRenderer BackWall; + ModelRenderer RightWall; + ModelRenderer Base; - public ModelTrough() { - textureWidth = 64; - textureHeight = 32; + public ModelTrough() { + textureWidth = 64; + textureHeight = 32; - LeftWall = new ModelRenderer(this, 42, 15); - LeftWall.addBox(-8F, -6F, -5F, 1, 7, 10); - LeftWall.setRotationPoint(0F, 0F, 0F); - LeftWall.setTextureSize(64, 32); - LeftWall.mirror = true; - setRotation(LeftWall, 0F, 0F, 0F); - Fill = new ModelRenderer(this, 40, 0); - Fill.addBox(-7F, 0F, -5F, 14, 0, 10); - Fill.setRotationPoint(0F, 0F, 0F); - Fill.setTextureSize(64, 32); - Fill.mirror = true; - setRotation(Fill, 0F, 0F, 0F); - FrontWall = new ModelRenderer(this, 0, 11); - FrontWall.addBox(-8F, -6F, -6F, 16, 7, 1); - FrontWall.setRotationPoint(0F, 0F, 0F); - FrontWall.setTextureSize(64, 32); - FrontWall.mirror = true; - setRotation(FrontWall, 0F, 0F, 0F); - BackWall = new ModelRenderer(this, 0, 11); - BackWall.addBox(-8F, -6F, 5F, 16, 7, 1); - BackWall.setRotationPoint(0F, 0F, 0F); - BackWall.setTextureSize(64, 32); - BackWall.mirror = true; - setRotation(BackWall, 0F, 0F, 0F); - RightWall = new ModelRenderer(this, 42, 15); - RightWall.addBox(7F, -6F, -5F, 1, 7, 10); - RightWall.setRotationPoint(0F, 0F, 0F); - RightWall.setTextureSize(64, 32); - RightWall.mirror = true; - setRotation(RightWall, 0F, 0F, 0F); - Base = new ModelRenderer(this, 0, 0); - Base.addBox(-7F, 0F, -5F, 14, 1, 10); - Base.setRotationPoint(0F, 0F, 0F); - Base.setTextureSize(64, 32); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - } + LeftWall = new ModelRenderer(this, 42, 15); + LeftWall.addBox(-8F, -6F, -5F, 1, 7, 10); + LeftWall.setRotationPoint(0F, 0F, 0F); + LeftWall.setTextureSize(64, 32); + LeftWall.mirror = true; + setRotation(LeftWall, 0F, 0F, 0F); + Fill = new ModelRenderer(this, 40, 0); + Fill.addBox(-7F, 0F, -5F, 14, 0, 10); + Fill.setRotationPoint(0F, 0F, 0F); + Fill.setTextureSize(64, 32); + Fill.mirror = true; + setRotation(Fill, 0F, 0F, 0F); + FrontWall = new ModelRenderer(this, 0, 11); + FrontWall.addBox(-8F, -6F, -6F, 16, 7, 1); + FrontWall.setRotationPoint(0F, 0F, 0F); + FrontWall.setTextureSize(64, 32); + FrontWall.mirror = true; + setRotation(FrontWall, 0F, 0F, 0F); + BackWall = new ModelRenderer(this, 0, 11); + BackWall.addBox(-8F, -6F, 5F, 16, 7, 1); + BackWall.setRotationPoint(0F, 0F, 0F); + BackWall.setTextureSize(64, 32); + BackWall.mirror = true; + setRotation(BackWall, 0F, 0F, 0F); + RightWall = new ModelRenderer(this, 42, 15); + RightWall.addBox(7F, -6F, -5F, 1, 7, 10); + RightWall.setRotationPoint(0F, 0F, 0F); + RightWall.setTextureSize(64, 32); + RightWall.mirror = true; + setRotation(RightWall, 0F, 0F, 0F); + Base = new ModelRenderer(this, 0, 0); + Base.addBox(-7F, 0F, -5F, 14, 1, 10); + Base.setRotationPoint(0F, 0F, 0F); + Base.setTextureSize(64, 32); + Base.mirror = true; + setRotation(Base, 0F, 0F, 0F); + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void renderModel(float f) { - LeftWall.render(f); - RightWall.render(f); - FrontWall.render(f); - BackWall.render(f); - Base.render(f); - } + public void renderModel(float f) { + LeftWall.render(f); + RightWall.render(f); + FrontWall.render(f); + BackWall.render(f); + Base.render(f); + } - public void renderWater(float f) { - Fill.render(f); - } + public void renderWater(float f) { + Fill.render(f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/ModelWoodCarpenter.java b/src/main/java/minefantasy/mf2/client/render/block/ModelWoodCarpenter.java index 8c4c76ba..ae514647 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/ModelWoodCarpenter.java +++ b/src/main/java/minefantasy/mf2/client/render/block/ModelWoodCarpenter.java @@ -5,138 +5,137 @@ import net.minecraft.entity.Entity; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ModelWoodCarpenter extends ModelBase { - // fields - ModelRenderer top; - ModelRenderer FRleg; - ModelRenderer bottom; - ModelRenderer BRleg; - ModelRenderer BLleg; - ModelRenderer FLleg; - ModelRenderer plank2; - ModelRenderer hammerhandle; - ModelRenderer block; - ModelRenderer nail; - ModelRenderer vice; - ModelRenderer hammerhead; - ModelRenderer plank; + // fields + ModelRenderer top; + ModelRenderer FRleg; + ModelRenderer bottom; + ModelRenderer BRleg; + ModelRenderer BLleg; + ModelRenderer FLleg; + ModelRenderer plank2; + ModelRenderer hammerhandle; + ModelRenderer block; + ModelRenderer nail; + ModelRenderer vice; + ModelRenderer hammerhead; + ModelRenderer plank; - public ModelWoodCarpenter() { - textureWidth = 64; - textureHeight = 64; + public ModelWoodCarpenter() { + textureWidth = 64; + textureHeight = 64; - top = new ModelRenderer(this, 0, 0); - top.addBox(-8F, 4F, -8F, 16, 4, 16); - top.setRotationPoint(0F, 0F, 0F); - top.setTextureSize(64, 64); - top.mirror = true; - setRotation(top, 0F, 0F, 0F); - FRleg = new ModelRenderer(this, 0, 35); - FRleg.addBox(3F, 8F, -7F, 4, 12, 4); - FRleg.setRotationPoint(0F, 0F, 0F); - FRleg.setTextureSize(64, 64); - FRleg.mirror = true; - setRotation(FRleg, 0F, 0F, 0F); - bottom = new ModelRenderer(this, 0, 20); - bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); - bottom.setRotationPoint(0F, 0F, 0F); - bottom.setTextureSize(64, 64); - bottom.mirror = true; - setRotation(bottom, 0F, 0F, 0F); - BRleg = new ModelRenderer(this, 0, 35); - BRleg.addBox(3F, 8F, 3F, 4, 12, 4); - BRleg.setRotationPoint(0F, 0F, 0F); - BRleg.setTextureSize(64, 64); - BRleg.mirror = true; - setRotation(BRleg, 0F, 0F, 0F); - BLleg = new ModelRenderer(this, 0, 35); - BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); - BLleg.setRotationPoint(0F, 0F, 0F); - BLleg.setTextureSize(64, 64); - BLleg.mirror = true; - setRotation(BLleg, 0F, 0F, 0F); - FLleg = new ModelRenderer(this, 0, 35); - FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); - FLleg.setRotationPoint(0F, 0F, 0F); - FLleg.setTextureSize(64, 64); - FLleg.mirror = true; - setRotation(FLleg, 0F, 0F, 0F); - plank2 = new ModelRenderer(this, 0, 51); - plank2.addBox(-5F, -1F, -1F, 10, 1, 2); - plank2.setRotationPoint(2F, 4F, 6F); - plank2.setTextureSize(64, 64); - plank2.mirror = true; - setRotation(plank2, 0F, -0.0698132F, 0F); - hammerhandle = new ModelRenderer(this, 5, 51); - hammerhandle.addBox(-3F, 0F, 0F, 6, 1, 1); - hammerhandle.setRotationPoint(-2F, 13F, -2F); - hammerhandle.setTextureSize(64, 64); - hammerhandle.mirror = true; - setRotation(hammerhandle, 0F, 1.570796F, 0F); - block = new ModelRenderer(this, 0, 0); - block.addBox(-2F, -2F, -2F, 4, 4, 4); - block.setRotationPoint(0F, 2F, 0F); - block.setTextureSize(64, 64); - block.mirror = true; - setRotation(block, 0F, -0.0523599F, 0F); - nail = new ModelRenderer(this, 0, 8); - nail.addBox(0F, -2F, 0F, 1, 3, 1); - nail.setRotationPoint(0F, 0F, 0F); - nail.setTextureSize(64, 64); - nail.mirror = true; - setRotation(nail, 0F, 0F, 0F); - vice = new ModelRenderer(this, 4, 11); - vice.addBox(-2F, -1F, -1F, 4, 3, 2); - vice.setRotationPoint(5F, 4F, -8F); - vice.setTextureSize(64, 64); - vice.mirror = true; - setRotation(vice, 0F, 0F, 0F); - hammerhead = new ModelRenderer(this, 4, 12); - hammerhead.addBox(-1F, -1F, -1F, 3, 2, 2); - hammerhead.setRotationPoint(-2F, 13F, 2F); - hammerhead.setTextureSize(64, 64); - hammerhead.mirror = true; - setRotation(hammerhead, 0F, 0F, 0F); - plank = new ModelRenderer(this, 0, 51); - plank.addBox(-5F, -1F, -1F, 10, 1, 2); - plank.setRotationPoint(-4F, 4F, -3F); - plank.setTextureSize(64, 64); - plank.mirror = true; - setRotation(plank, 0F, 0.7679449F, 0F); - } + top = new ModelRenderer(this, 0, 0); + top.addBox(-8F, 4F, -8F, 16, 4, 16); + top.setRotationPoint(0F, 0F, 0F); + top.setTextureSize(64, 64); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + FRleg = new ModelRenderer(this, 0, 35); + FRleg.addBox(3F, 8F, -7F, 4, 12, 4); + FRleg.setRotationPoint(0F, 0F, 0F); + FRleg.setTextureSize(64, 64); + FRleg.mirror = true; + setRotation(FRleg, 0F, 0F, 0F); + bottom = new ModelRenderer(this, 0, 20); + bottom.addBox(-6.5F, 14F, -6.5F, 13, 2, 13); + bottom.setRotationPoint(0F, 0F, 0F); + bottom.setTextureSize(64, 64); + bottom.mirror = true; + setRotation(bottom, 0F, 0F, 0F); + BRleg = new ModelRenderer(this, 0, 35); + BRleg.addBox(3F, 8F, 3F, 4, 12, 4); + BRleg.setRotationPoint(0F, 0F, 0F); + BRleg.setTextureSize(64, 64); + BRleg.mirror = true; + setRotation(BRleg, 0F, 0F, 0F); + BLleg = new ModelRenderer(this, 0, 35); + BLleg.addBox(-7F, 8F, 3F, 4, 12, 4); + BLleg.setRotationPoint(0F, 0F, 0F); + BLleg.setTextureSize(64, 64); + BLleg.mirror = true; + setRotation(BLleg, 0F, 0F, 0F); + FLleg = new ModelRenderer(this, 0, 35); + FLleg.addBox(-7F, 8F, -7F, 4, 12, 4); + FLleg.setRotationPoint(0F, 0F, 0F); + FLleg.setTextureSize(64, 64); + FLleg.mirror = true; + setRotation(FLleg, 0F, 0F, 0F); + plank2 = new ModelRenderer(this, 0, 51); + plank2.addBox(-5F, -1F, -1F, 10, 1, 2); + plank2.setRotationPoint(2F, 4F, 6F); + plank2.setTextureSize(64, 64); + plank2.mirror = true; + setRotation(plank2, 0F, -0.0698132F, 0F); + hammerhandle = new ModelRenderer(this, 5, 51); + hammerhandle.addBox(-3F, 0F, 0F, 6, 1, 1); + hammerhandle.setRotationPoint(-2F, 13F, -2F); + hammerhandle.setTextureSize(64, 64); + hammerhandle.mirror = true; + setRotation(hammerhandle, 0F, 1.570796F, 0F); + block = new ModelRenderer(this, 0, 0); + block.addBox(-2F, -2F, -2F, 4, 4, 4); + block.setRotationPoint(0F, 2F, 0F); + block.setTextureSize(64, 64); + block.mirror = true; + setRotation(block, 0F, -0.0523599F, 0F); + nail = new ModelRenderer(this, 0, 8); + nail.addBox(0F, -2F, 0F, 1, 3, 1); + nail.setRotationPoint(0F, 0F, 0F); + nail.setTextureSize(64, 64); + nail.mirror = true; + setRotation(nail, 0F, 0F, 0F); + vice = new ModelRenderer(this, 4, 11); + vice.addBox(-2F, -1F, -1F, 4, 3, 2); + vice.setRotationPoint(5F, 4F, -8F); + vice.setTextureSize(64, 64); + vice.mirror = true; + setRotation(vice, 0F, 0F, 0F); + hammerhead = new ModelRenderer(this, 4, 12); + hammerhead.addBox(-1F, -1F, -1F, 3, 2, 2); + hammerhead.setRotationPoint(-2F, 13F, 2F); + hammerhead.setTextureSize(64, 64); + hammerhead.mirror = true; + setRotation(hammerhead, 0F, 0F, 0F); + plank = new ModelRenderer(this, 0, 51); + plank.addBox(-5F, -1F, -1F, 10, 1, 2); + plank.setRotationPoint(-4F, 4F, -3F); + plank.setTextureSize(64, 64); + plank.mirror = true; + setRotation(plank, 0F, 0.7679449F, 0F); + } - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - renderModel(f5); - } + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + renderModel(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void renderModel(float f) { - top.render(f); - FRleg.render(f); - bottom.render(f); - BRleg.render(f); - BLleg.render(f); - FLleg.render(f); - plank2.render(f); - hammerhandle.render(f); - block.render(f); - nail.render(f); - vice.render(f); - hammerhead.render(f); - plank.render(f); - } + public void renderModel(float f) { + top.render(f); + FRleg.render(f); + bottom.render(f); + BRleg.render(f); + BLleg.render(f); + FLleg.render(f); + plank2.render(f); + hammerhandle.render(f); + block.render(f); + nail.render(f); + vice.render(f); + hammerhead.render(f); + plank.render(f); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderAmmoBox.java b/src/main/java/minefantasy/mf2/client/render/block/RenderAmmoBox.java index 738c9aa0..c5154f3b 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderAmmoBox.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderAmmoBox.java @@ -1,44 +1,43 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockAmmoBox; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderAmmoBox implements ISimpleBlockRenderingHandler { - private static final TileEntityAmmoBoxRenderer invModel = new TileEntityAmmoBoxRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockAmmoBox)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockAmmoBox box = (BlockAmmoBox) block; - invModel.renderInvModel(box.getFullTexName(), box.storageType, CustomMaterial.getMaterial("refinedWood"), 0F, - 0F, 0F, 0F); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockAmmoBox.ammo_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityAmmoBoxRenderer invModel = new TileEntityAmmoBoxRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (block == null || !(block instanceof BlockAmmoBox)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + BlockAmmoBox box = (BlockAmmoBox) block; + invModel.renderInvModel(box.getFullTexName(), box.storageType, CustomMaterial.getMaterial("refinedWood"), 0F, + 0F, 0F, 0F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockAmmoBox.ammo_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderAnvilMF.java b/src/main/java/minefantasy/mf2/client/render/block/RenderAnvilMF.java index 912af664..cad17085 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderAnvilMF.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderAnvilMF.java @@ -1,42 +1,41 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockAnvilMF; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderAnvilMF implements ISimpleBlockRenderingHandler { - private static final TileEntityAnvilMFRenderer renderAnvil = new TileEntityAnvilMFRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (!(block instanceof BlockAnvilMF)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockAnvilMF anvil = (BlockAnvilMF) block; - renderAnvil.renderModelAt(anvil.material.name, 0, 0.0F, 0.0F, 0.0F, 0.0F, 0); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockAnvilMF.anvil_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityAnvilMFRenderer renderAnvil = new TileEntityAnvilMFRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (!(block instanceof BlockAnvilMF)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + BlockAnvilMF anvil = (BlockAnvilMF) block; + renderAnvil.renderModelAt(anvil.material.name, 0, 0.0F, 0.0F, 0.0F, 0.0F, 0); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockAnvilMF.anvil_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java index 9fefe631..4ad24809 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java @@ -1,41 +1,40 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.refining.BlockBellows; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderBellows implements ISimpleBlockRenderingHandler { - private static final TileEntityBellowsRenderer invModel = new TileEntityBellowsRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockBellows)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - invModel.renderInvModel(0F, 0F, 0F, 0F); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockBellows.bellows_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityBellowsRenderer invModel = new TileEntityBellowsRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (block == null || !(block instanceof BlockBellows)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + invModel.renderInvModel(0F, 0F, 0F, 0F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockBellows.bellows_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java index 56c8e206..6ee605a1 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java @@ -1,42 +1,41 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.refining.BlockBigFurnace; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderBigFurnace implements ISimpleBlockRenderingHandler { - private static final TileEntityBigFurnaceRenderer invModel = new TileEntityBigFurnaceRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockBigFurnace)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockBigFurnace furnace = (BlockBigFurnace) block; - invModel.renderInvModel(furnace.isHeater, furnace.isHeater ? "furnace_heater" : "furnace_rock", 0F, 0F, 0F, 0F); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockBigFurnace.furn_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityBigFurnaceRenderer invModel = new TileEntityBigFurnaceRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (block == null || !(block instanceof BlockBigFurnace)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + BlockBigFurnace furnace = (BlockBigFurnace) block; + invModel.renderInvModel(furnace.isHeater, furnace.isHeater ? "furnace_heater" : "furnace_rock", 0F, 0F, 0F, 0F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockBigFurnace.furn_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java index 34977ede..b248d952 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java @@ -1,42 +1,41 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.refining.BlockBloomery; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderBloomery implements ISimpleBlockRenderingHandler { - private static final TileEntityBloomeryRenderer invModel = new TileEntityBloomeryRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockBloomery)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockBloomery bloomery = (BlockBloomery) block; - invModel.renderInvModel("bloomery_basic", 0F, 0F, 0F, 0F); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockBloomery.bloomery_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityBloomeryRenderer invModel = new TileEntityBloomeryRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (block == null || !(block instanceof BlockBloomery)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + BlockBloomery bloomery = (BlockBloomery) block; + invModel.renderInvModel("bloomery_basic", 0F, 0F, 0F, 0F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockBloomery.bloomery_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBombBench.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBombBench.java index f8d2ab38..9fb04a5f 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBombBench.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBombBench.java @@ -1,38 +1,37 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockBombBench; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderBombBench implements ISimpleBlockRenderingHandler { - private static final TileEntityBombBenchRenderer invModel = new TileEntityBombBenchRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - invModel.renderModelAt("carpenter_bomb", 0, 0F, 0F, 0F, 0F, 0); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockBombBench.bomb_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityBombBenchRenderer invModel = new TileEntityBombBenchRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + invModel.renderModelAt("carpenter_bomb", 0, 0F, 0F, 0F, 0F, 0); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockBombBench.bomb_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBombPress.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBombPress.java index 29f08546..5e87030e 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBombPress.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBombPress.java @@ -1,38 +1,37 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockBombPress; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderBombPress implements ISimpleBlockRenderingHandler { - private static final TileEntityBombPressRenderer invModel = new TileEntityBombPressRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - invModel.renderModelAt("bombPress", 0, 0F, 0F, 0F, 0F, 0, 0); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockBombPress.bpress_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityBombPressRenderer invModel = new TileEntityBombPressRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + invModel.renderModelAt("bombPress", 0, 0F, 0F, 0F, 0F, 0, 0); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockBombPress.bpress_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderCarpenter.java b/src/main/java/minefantasy/mf2/client/render/block/RenderCarpenter.java index 531f0259..4792f00a 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderCarpenter.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderCarpenter.java @@ -1,38 +1,37 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockCarpenter; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderCarpenter implements ISimpleBlockRenderingHandler { - private static final TileEntityCarpenterRenderer invModel = new TileEntityCarpenterRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - invModel.renderModelAt("carpenter", 0, 0F, 0F, 0F, 0F, 0); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockCarpenter.carpenter_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityCarpenterRenderer invModel = new TileEntityCarpenterRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + invModel.renderModelAt("carpenter", 0, 0F, 0F, 0F, 0F, 0); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockCarpenter.carpenter_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderCrossbowBench.java b/src/main/java/minefantasy/mf2/client/render/block/RenderCrossbowBench.java index f843d539..90bec3af 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderCrossbowBench.java @@ -1,38 +1,37 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockCrossbowBench; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderCrossbowBench implements ISimpleBlockRenderingHandler { - private static final TileEntityCrossbowBenchRenderer invModel = new TileEntityCrossbowBenchRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - invModel.renderModelAt("carpenter_crossbow", 0, 0F, 0F, 0F, 0F, 0); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockCrossbowBench.crossBench_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityCrossbowBenchRenderer invModel = new TileEntityCrossbowBenchRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + invModel.renderModelAt("carpenter_crossbow", 0, 0F, 0F, 0F, 0F, 0); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockCrossbowBench.crossBench_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderFirepit.java b/src/main/java/minefantasy/mf2/client/render/block/RenderFirepit.java index e1a55d1a..00ef8a20 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderFirepit.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderFirepit.java @@ -1,38 +1,37 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockFirepit; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderFirepit implements ISimpleBlockRenderingHandler { - private static final TileEntityFirepitRenderer invModel = new TileEntityFirepitRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - invModel.renderInvModel(0F, 0F, 0F, 0F); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockFirepit.firepit_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityFirepitRenderer invModel = new TileEntityFirepitRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + invModel.renderInvModel(0F, 0F, 0F, 0F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockFirepit.firepit_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderForge.java b/src/main/java/minefantasy/mf2/client/render/block/RenderForge.java index 5ef9e85f..00060920 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderForge.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderForge.java @@ -1,42 +1,41 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.refining.BlockForge; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderForge implements ISimpleBlockRenderingHandler { - private static final TileEntityForgeRenderer invModel = new TileEntityForgeRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockForge)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockForge forge = (BlockForge) block; - invModel.renderInvModel("forge_" + forge.type, 0F, 0F, 0F, 0F); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockForge.forge_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityForgeRenderer invModel = new TileEntityForgeRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (block == null || !(block instanceof BlockForge)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + BlockForge forge = (BlockForge) block; + invModel.renderInvModel("forge_" + forge.type, 0F, 0F, 0F, 0F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockForge.forge_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderQuern.java b/src/main/java/minefantasy/mf2/client/render/block/RenderQuern.java index 2aac04de..a1afa7e3 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderQuern.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderQuern.java @@ -1,42 +1,41 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.refining.BlockQuern; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderQuern implements ISimpleBlockRenderingHandler { - private static final TileEntityQuernRenderer invModel = new TileEntityQuernRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockQuern)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockQuern quern = (BlockQuern) block; - invModel.renderModelAt(null, "quern_basic", 0F, 0F, 0F, 0F, true); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockQuern.quern_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityQuernRenderer invModel = new TileEntityQuernRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (block == null || !(block instanceof BlockQuern)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + BlockQuern quern = (BlockQuern) block; + invModel.renderModelAt(null, "quern_basic", 0F, 0F, 0F, 0F, true); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockQuern.quern_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderRack.java b/src/main/java/minefantasy/mf2/client/render/block/RenderRack.java index b8620cdc..4701f7ca 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderRack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderRack.java @@ -1,43 +1,42 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockRack; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderRack implements ISimpleBlockRenderingHandler { - private static final TileEntityRackRenderer invModel = new TileEntityRackRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockRack)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockRack rack = (BlockRack) block; - invModel.renderInvModel(CustomMaterial.getMaterial("refinedWood"), rack.getFullTexName(), 0F, 0F, 0F, 0F); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockRack.rack_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityRackRenderer invModel = new TileEntityRackRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (block == null || !(block instanceof BlockRack)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + BlockRack rack = (BlockRack) block; + invModel.renderInvModel(CustomMaterial.getMaterial("refinedWood"), rack.getFullTexName(), 0F, 0F, 0F, 0F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockRack.rack_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderResearch.java b/src/main/java/minefantasy/mf2/client/render/block/RenderResearch.java index e1a16885..c45467c2 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderResearch.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderResearch.java @@ -1,38 +1,37 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockResearchStation; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderResearch implements ISimpleBlockRenderingHandler { - private static final TileEntityResearchRenderer invModel = new TileEntityResearchRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - invModel.renderModelAt("researchTable", 0, 0F, 0F, 0F, 0F); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockResearchStation.research_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityResearchRenderer invModel = new TileEntityResearchRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + invModel.renderModelAt("researchTable", 0, 0F, 0F, 0F, 0F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockResearchStation.research_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderRoast.java b/src/main/java/minefantasy/mf2/client/render/block/RenderRoast.java index d82d14d8..167306f8 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderRoast.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderRoast.java @@ -1,43 +1,42 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockRoast; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderRoast implements ISimpleBlockRenderingHandler { - private static final TileEntityRoastRenderer invModel = new TileEntityRoastRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (!(block instanceof BlockRoast)) - return; - BlockRoast roast = (BlockRoast) block; - if (roast.isOven()) { - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - invModel.renderInvModel(roast.tex, true, 0F, 0F, 0F, 0F); - GL11.glPopMatrix(); - } - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockRoast.roast_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityRoastRenderer invModel = new TileEntityRoastRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (!(block instanceof BlockRoast)) + return; + BlockRoast roast = (BlockRoast) block; + if (roast.isOven()) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + invModel.renderInvModel(roast.tex, true, 0F, 0F, 0F, 0F); + GL11.glPopMatrix(); + } + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockRoast.roast_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderSmokePipe.java b/src/main/java/minefantasy/mf2/client/render/block/RenderSmokePipe.java index 5e599c12..a8b560fb 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderSmokePipe.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderSmokePipe.java @@ -1,44 +1,43 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.refining.BlockChimney; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderSmokePipe implements ISimpleBlockRenderingHandler { - private static final TileEntitySmokePipeRenderer tileRender = new TileEntitySmokePipeRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (!(block instanceof BlockChimney)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - - if (((BlockChimney) block).isPipe()) { - tileRender.renderAModelAt(null, 0D, 0D, 0D, 0F); - } - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockChimney.pipe_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntitySmokePipeRenderer tileRender = new TileEntitySmokePipeRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (!(block instanceof BlockChimney)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + if (((BlockChimney) block).isPipe()) { + tileRender.renderAModelAt(null, 0D, 0D, 0D, 0F); + } + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockChimney.pipe_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderTanningRack.java b/src/main/java/minefantasy/mf2/client/render/block/RenderTanningRack.java index 77b08d87..2a599c35 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderTanningRack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderTanningRack.java @@ -1,42 +1,41 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.block.crafting.BlockTanningRack; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderTanningRack implements ISimpleBlockRenderingHandler { - private static final TileEntityTanningRackRenderer invModel = new TileEntityTanningRackRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (!(block instanceof BlockTanningRack)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockTanningRack rack = (BlockTanningRack) block; - invModel.renderInvModel(rack.tex, rack.tex.equalsIgnoreCase("metal"), 0F, 0F, 0F, 0F); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockTanningRack.tanner_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityTanningRackRenderer invModel = new TileEntityTanningRackRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (!(block instanceof BlockTanningRack)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + BlockTanningRack rack = (BlockTanningRack) block; + invModel.renderInvModel(rack.tex, rack.tex.equalsIgnoreCase("metal"), 0F, 0F, 0F, 0F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockTanningRack.tanner_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java b/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java index 84f5142d..a6120dfc 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java @@ -1,43 +1,42 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.decor.BlockTrough; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; public class RenderTrough implements ISimpleBlockRenderingHandler { - private static final TileEntityTroughRenderer invModel = new TileEntityTroughRenderer(); - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockTrough)) - return; - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - BlockTrough trough = (BlockTrough) block; - invModel.renderInvModel(trough.getFullTexName(), CustomMaterial.getMaterial("refinedWood"), 0F, 0F, 0F, 0F); - GL11.glPopMatrix(); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - return false; - } - - @Override - public int getRenderId() { - return BlockTrough.trough_RI; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } + private static final TileEntityTroughRenderer invModel = new TileEntityTroughRenderer(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (block == null || !(block instanceof BlockTrough)) + return; + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + BlockTrough trough = (BlockTrough) block; + invModel.renderInvModel(trough.getFullTexName(), CustomMaterial.getMaterial("refinedWood"), 0F, 0F, 0F, 0F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public int getRenderId() { + return BlockTrough.trough_RI; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityAmmoBoxRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityAmmoBoxRenderer.java index 1954c8b3..27aeb5ad 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityAmmoBoxRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityAmmoBoxRenderer.java @@ -1,108 +1,107 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; public class TileEntityAmmoBoxRenderer extends TileEntitySpecialRenderer { - public TileEntityAmmoBoxRenderer() { - model = new ModelAmmoBox(); - modelbig = new ModelSmallCrate(); - modelsml = new ModelFoodBox(); - } - - public void renderAModelAt(TileEntityAmmoBox tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - this.renderModelAt(tile, i, d, d1, d2, f); - } - - public void renderInvModel(String tex, byte type, CustomMaterial material, double d, double d1, double d2, - float f) { - ModelAmmoBox baseMdl = type == 0 ? modelsml : type == 1 ? model : modelbig; - int i = 2; - int j = 450 - (90 * i); - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1 / 16F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j + 90, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - - GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); - - bindTextureByName("textures/models/tileentity/" + tex + "_base.png"); // texture - baseMdl.renderModel(0.0625F); - baseMdl.renderLid(0.0625F, 0F); - - GL11.glColor3f(1F, 1F, 1F); - - bindTextureByName("textures/models/tileentity/" + tex + "_detail.png"); // texture - baseMdl.renderModel(0.0625F); - baseMdl.renderLid(0.0625F, 0F); - GL11.glPopMatrix(); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); // end - - } - - public void renderModelAt(TileEntityAmmoBox tile, int meta, double d, double d1, double d2, float f) { - ModelAmmoBox baseMdl = tile.getStorageType() == 0 ? modelsml : tile.getStorageType() == 1 ? model : modelbig; - int i = meta; - if (!tile.hasWorldObj()) { - i = 2; - } - - int j = 450 - (90 * i); - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1 / 16F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j + 90, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - - CustomMaterial material = tile.getMaterial(); - GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); - - bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_base.png"); // texture - baseMdl.renderModel(0.0625F); - baseMdl.renderLid(0.0625F, tile.angle); - - GL11.glColor3f(1F, 1F, 1F); - - bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_detail.png"); // texture - baseMdl.renderModel(0.0625F); - baseMdl.renderLid(0.0625F, tile.angle); - GL11.glPopMatrix(); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityAmmoBox) tileentity, d, d1, d2, f); // where to render - } - - private ModelAmmoBox modelbig, model, modelsml; - private Random random = new Random(); + private ModelAmmoBox modelbig, model, modelsml; + private Random random = new Random(); + + public TileEntityAmmoBoxRenderer() { + model = new ModelAmmoBox(); + modelbig = new ModelSmallCrate(); + modelsml = new ModelFoodBox(); + } + + public void renderAModelAt(TileEntityAmmoBox tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + this.renderModelAt(tile, i, d, d1, d2, f); + } + + public void renderInvModel(String tex, byte type, CustomMaterial material, double d, double d1, double d2, + float f) { + ModelAmmoBox baseMdl = type == 0 ? modelsml : type == 1 ? model : modelbig; + int i = 2; + int j = 450 - (90 * i); + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1 / 16F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 90, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tex + "_base.png"); // texture + baseMdl.renderModel(0.0625F); + baseMdl.renderLid(0.0625F, 0F); + + GL11.glColor3f(1F, 1F, 1F); + + bindTextureByName("textures/models/tileentity/" + tex + "_detail.png"); // texture + baseMdl.renderModel(0.0625F); + baseMdl.renderLid(0.0625F, 0F); + GL11.glPopMatrix(); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); // end + + } + + public void renderModelAt(TileEntityAmmoBox tile, int meta, double d, double d1, double d2, float f) { + ModelAmmoBox baseMdl = tile.getStorageType() == 0 ? modelsml : tile.getStorageType() == 1 ? model : modelbig; + int i = meta; + if (!tile.hasWorldObj()) { + i = 2; + } + + int j = 450 - (90 * i); + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1 / 16F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 90, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + + CustomMaterial material = tile.getMaterial(); + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_base.png"); // texture + baseMdl.renderModel(0.0625F); + baseMdl.renderLid(0.0625F, tile.angle); + + GL11.glColor3f(1F, 1F, 1F); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_detail.png"); // texture + baseMdl.renderModel(0.0625F); + baseMdl.renderLid(0.0625F, tile.angle); + GL11.glPopMatrix(); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityAmmoBox) tileentity, d, d1, d2, f); // where to render + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityAnvilMFRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityAnvilMFRenderer.java index a4119e78..19e403aa 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityAnvilMFRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityAnvilMFRenderer.java @@ -1,98 +1,97 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; public class TileEntityAnvilMFRenderer extends TileEntitySpecialRenderer { - public TileEntityAnvilMFRenderer() { - model = new ModelAnvil(); - } - - public void renderAModelAt(TileEntityAnvilMF tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - for (int a = 0; a < 2; a++) { - if (shouldRender(tile, a)) { - this.renderModelAt(tile.getTextureName(), i, d, d1, d2, f, a); - } - } - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { - int i = meta; - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - if (renderPass == 1) { - bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture - } else { - bindTextureByName("textures/models/tileentity/anvil" + tex + ".png"); // texture - } - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 0F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + (0.3F * scale) + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityAnvilMF) tileentity, d, d1, d2, f); // where to render - } - - private ModelAnvil model; - private Random random = new Random(); - - private boolean shouldRender(TileEntityAnvilMF tile, int p) { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if (p == 1)// GRID - { - return false; - } - return true; - } + private ModelAnvil model; + private Random random = new Random(); + + public TileEntityAnvilMFRenderer() { + model = new ModelAnvil(); + } + + public void renderAModelAt(TileEntityAnvilMF tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + for (int a = 0; a < 2; a++) { + if (shouldRender(tile, a)) { + this.renderModelAt(tile.getTextureName(), i, d, d1, d2, f, a); + } + } + } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + if (renderPass == 1) { + bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture + } else { + bindTextureByName("textures/models/tileentity/anvil" + tex + ".png"); // texture + } + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 0F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + (0.3F * scale) + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityAnvilMF) tileentity, d, d1, d2, f); // where to render + } + + private boolean shouldRender(TileEntityAnvilMF tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBellowsRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBellowsRenderer.java index 3f87ef03..f2600f8c 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBellowsRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBellowsRenderer.java @@ -1,101 +1,100 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityBellows; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; public class TileEntityBellowsRenderer extends TileEntitySpecialRenderer { - public TileEntityBellowsRenderer() { - model = new ModelBellows(); - } - - public void renderAModelAt(TileEntityBellows tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - this.renderModelAt(tile, i, d, d1, d2, f); - } - - public void renderInvModel(double d, double d1, double d2, float f) { - int j = 90; - - model.rotate(0); - bindTextureByName("textures/models/tileentity/bellows.png"); // texture - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1.525F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - model.renderModel(0, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - public void renderModelAt(TileEntityBellows tile, int meta, double d, double d1, double d2, float f) { - int i = meta; - - int j = 90 * i; - - if (i == 1) { - j = 0; - } - - if (i == 2) { - j = 270; - } - - if (i == 3) { - j = 180; - } - - if (i == 0) { - j = 90; - } - if (i == 0) { - j = 90; - } - model.rotate(tile.press); - bindTextureByName("textures/models/tileentity/bellows.png"); // texture - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1.525F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - model.renderModel(tile.press, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityBellows) tileentity, d, d1, d2, f); // where to render - } - - private ModelBellows model; - private Random random = new Random(); + private ModelBellows model; + private Random random = new Random(); + + public TileEntityBellowsRenderer() { + model = new ModelBellows(); + } + + public void renderAModelAt(TileEntityBellows tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + this.renderModelAt(tile, i, d, d1, d2, f); + } + + public void renderInvModel(double d, double d1, double d2, float f) { + int j = 90; + + model.rotate(0); + bindTextureByName("textures/models/tileentity/bellows.png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.525F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + model.renderModel(0, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + public void renderModelAt(TileEntityBellows tile, int meta, double d, double d1, double d2, float f) { + int i = meta; + + int j = 90 * i; + + if (i == 1) { + j = 0; + } + + if (i == 2) { + j = 270; + } + + if (i == 3) { + j = 180; + } + + if (i == 0) { + j = 90; + } + if (i == 0) { + j = 90; + } + model.rotate(tile.press); + bindTextureByName("textures/models/tileentity/bellows.png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.525F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + model.renderModel(tile.press, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityBellows) tileentity, d, d1, d2, f); // where to render + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBigFurnaceRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBigFurnaceRenderer.java index f51498ae..cc0eb4a6 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBigFurnaceRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBigFurnaceRenderer.java @@ -1,8 +1,5 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityBigFurnace; import net.minecraft.client.Minecraft; @@ -13,191 +10,192 @@ import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class TileEntityBigFurnaceRenderer extends TileEntitySpecialRenderer { - public TileEntityBigFurnaceRenderer() { - model = new ModelBigFurnace(); - } - - public void renderAModelAt(TileEntityBigFurnace tile, double d, double d1, double d2, float f) { - int i = 1; - if (tile.hasWorldObj()) { - i = tile.getBlockMetadata(); - } - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - String type = tile.getTexture(); - - bindTextureByName("textures/models/tileentity/" + type + ".png"); // texture - - boolean display = tile.isBurning(); - - GL11.glPushMatrix(); // start - float scale = 1.0F; - - float offset = (1.0F - 0.0625F); - GL11.glTranslatef((float) d + 0.5F, (float) d1 + (0.0635F * 2F), (float) d2 + 0.5F); // size - GL11.glRotatef(j - 90, 0.0F, 1.0F, 0.0F); - GL11.glScalef(scale, -scale, -scale); - model.renderModel(display, 0.0625F); - - float sc = 0.75F; - float angle = 90F / 20F * tile.doorAngle; - GL11.glPushMatrix(); - GL11.glTranslatef(-pixel(8), -pixel(12), 0); - if (tile.isHeater()) { - GL11.glTranslatef(0, pixel(12), 0); - } - GL11.glPushMatrix(); - GL11.glScalef(sc, sc, sc); - GL11.glRotatef(90, 0, 1, 0); - if (tile.isHeater()) { - GL11.glRotatef(angle, 1F, 0, 0); - renderDoorHeater(0, 54, 12, 8, 128, 64); - } else { - GL11.glRotatef(-angle, 1F, 0, 0); - renderDoor(0, 54, 12, 8, 128, 64); - } - GL11.glPopMatrix(); - GL11.glPopMatrix(); - - GL11.glPopMatrix(); // end - - } - - public void renderInvModel(boolean heater, String type, double d, double d1, double d2, float f) { - int j = 90; - - bindTextureByName("textures/models/tileentity/" + type + ".png"); // texture - - GL11.glPushMatrix(); // start - float scale = 1.0F; - - float offset = (1.0F - 0.0625F); - GL11.glTranslatef((float) d + 0.5F, (float) d1 + (0.0635F * 2F), (float) d2 + 0.5F); // size - GL11.glRotatef(j - 90, 0.0F, 1.0F, 0.0F); - GL11.glScalef(scale, -scale, -scale); - model.renderModel(false, 0.0625F); - - float sc = 0.75F; - float angle = 0F; - GL11.glPushMatrix(); - GL11.glTranslatef(-pixel(8), -pixel(12), 0); - if (heater) { - GL11.glTranslatef(0, pixel(12), 0); - } - GL11.glPushMatrix(); - GL11.glScalef(sc, sc, sc); - GL11.glRotatef(90, 0, 1, 0); - if (heater) { - GL11.glRotatef(angle, 1F, 0, 0); - renderDoorHeater(0, 54, 12, 8, 128, 64); - } else { - GL11.glRotatef(-angle, 1F, 0, 0); - renderDoor(0, 54, 12, 8, 128, 64); - } - GL11.glPopMatrix(); - GL11.glPopMatrix(); - - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - bindTexture(TextureHelperMF.getResource(image)); - } - - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityBigFurnace) tileentity, d, d1, d2, f); // where to render - } - - private void renderDoor(int x, int y, int w, int h, int tw, int th) { - Minecraft mc = Minecraft.getMinecraft(); - - float f = 0.01F / tw; - float f1 = 0.01F / th; - - float x1 = (float) x / (float) tw + f; - float x2 = (float) (x + w) / tw - f; - float y1 = (float) y / th + f1; - float y2 = (float) (y + h) / th - f1; - - Tessellator image = Tessellator.instance; - float xPos = 0.5F; - float yPos = 0.0F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-xPos, -yPos, pixel(0.5F)); - float var13 = 1F; - GL11.glScalef(var13, var13, var13); - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(-1F, -1F, 0.0F); - ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, tw, th, 0.0625F); - - } - - @Override - protected void bindTexture(ResourceLocation p_147499_1_) { - TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; - - if (texturemanager != null) { - texturemanager.bindTexture(p_147499_1_); - } - } - - private void renderDoorHeater(int x, int y, int w, int h, int tw, int th) { - Minecraft mc = Minecraft.getMinecraft(); - - float f = 0.01F / tw; - float f1 = 0.01F / th; - - float x1 = (float) x / (float) tw + f; - float x2 = (float) (x + w) / tw - f; - float y1 = (float) y / th + f1; - float y2 = (float) (y + h) / th - f1; - - Tessellator image = Tessellator.instance; - float xPos = 0.5F; - float yPos = 1.0F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-xPos, -yPos, pixel(0.5F)); - float var13 = 1F; - GL11.glScalef(var13, var13, var13); - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(-1F, -1F, 0.0F); - ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, tw, th, 0.0625F); - - } - - public float pixel(float count) { - return count * 0.0625F; - } - - private ModelBigFurnace model; + private ModelBigFurnace model; + + public TileEntityBigFurnaceRenderer() { + model = new ModelBigFurnace(); + } + + public void renderAModelAt(TileEntityBigFurnace tile, double d, double d1, double d2, float f) { + int i = 1; + if (tile.hasWorldObj()) { + i = tile.getBlockMetadata(); + } + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + String type = tile.getTexture(); + + bindTextureByName("textures/models/tileentity/" + type + ".png"); // texture + + boolean display = tile.isBurning(); + + GL11.glPushMatrix(); // start + float scale = 1.0F; + + float offset = (1.0F - 0.0625F); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + (0.0635F * 2F), (float) d2 + 0.5F); // size + GL11.glRotatef(j - 90, 0.0F, 1.0F, 0.0F); + GL11.glScalef(scale, -scale, -scale); + model.renderModel(display, 0.0625F); + + float sc = 0.75F; + float angle = 90F / 20F * tile.doorAngle; + GL11.glPushMatrix(); + GL11.glTranslatef(-pixel(8), -pixel(12), 0); + if (tile.isHeater()) { + GL11.glTranslatef(0, pixel(12), 0); + } + GL11.glPushMatrix(); + GL11.glScalef(sc, sc, sc); + GL11.glRotatef(90, 0, 1, 0); + if (tile.isHeater()) { + GL11.glRotatef(angle, 1F, 0, 0); + renderDoorHeater(0, 54, 12, 8, 128, 64); + } else { + GL11.glRotatef(-angle, 1F, 0, 0); + renderDoor(0, 54, 12, 8, 128, 64); + } + GL11.glPopMatrix(); + GL11.glPopMatrix(); + + GL11.glPopMatrix(); // end + + } + + public void renderInvModel(boolean heater, String type, double d, double d1, double d2, float f) { + int j = 90; + + bindTextureByName("textures/models/tileentity/" + type + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + + float offset = (1.0F - 0.0625F); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + (0.0635F * 2F), (float) d2 + 0.5F); // size + GL11.glRotatef(j - 90, 0.0F, 1.0F, 0.0F); + GL11.glScalef(scale, -scale, -scale); + model.renderModel(false, 0.0625F); + + float sc = 0.75F; + float angle = 0F; + GL11.glPushMatrix(); + GL11.glTranslatef(-pixel(8), -pixel(12), 0); + if (heater) { + GL11.glTranslatef(0, pixel(12), 0); + } + GL11.glPushMatrix(); + GL11.glScalef(sc, sc, sc); + GL11.glRotatef(90, 0, 1, 0); + if (heater) { + GL11.glRotatef(angle, 1F, 0, 0); + renderDoorHeater(0, 54, 12, 8, 128, 64); + } else { + GL11.glRotatef(-angle, 1F, 0, 0); + renderDoor(0, 54, 12, 8, 128, 64); + } + GL11.glPopMatrix(); + GL11.glPopMatrix(); + + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + bindTexture(TextureHelperMF.getResource(image)); + } + + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityBigFurnace) tileentity, d, d1, d2, f); // where to render + } + + private void renderDoor(int x, int y, int w, int h, int tw, int th) { + Minecraft mc = Minecraft.getMinecraft(); + + float f = 0.01F / tw; + float f1 = 0.01F / th; + + float x1 = (float) x / (float) tw + f; + float x2 = (float) (x + w) / tw - f; + float y1 = (float) y / th + f1; + float y2 = (float) (y + h) / th - f1; + + Tessellator image = Tessellator.instance; + float xPos = 0.5F; + float yPos = 0.0F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-xPos, -yPos, pixel(0.5F)); + float var13 = 1F; + GL11.glScalef(var13, var13, var13); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-1F, -1F, 0.0F); + ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, tw, th, 0.0625F); + + } + + @Override + protected void bindTexture(ResourceLocation p_147499_1_) { + TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + + if (texturemanager != null) { + texturemanager.bindTexture(p_147499_1_); + } + } + + private void renderDoorHeater(int x, int y, int w, int h, int tw, int th) { + Minecraft mc = Minecraft.getMinecraft(); + + float f = 0.01F / tw; + float f1 = 0.01F / th; + + float x1 = (float) x / (float) tw + f; + float x2 = (float) (x + w) / tw - f; + float y1 = (float) y / th + f1; + float y2 = (float) (y + h) / th - f1; + + Tessellator image = Tessellator.instance; + float xPos = 0.5F; + float yPos = 1.0F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-xPos, -yPos, pixel(0.5F)); + float var13 = 1F; + GL11.glScalef(var13, var13, var13); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-1F, -1F, 0.0F); + ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, tw, th, 0.0625F); + + } + + public float pixel(float count) { + return count * 0.0625F; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBloomeryRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBloomeryRenderer.java index bde9cf42..00e12321 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBloomeryRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBloomeryRenderer.java @@ -1,99 +1,98 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityBloomery; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; public class TileEntityBloomeryRenderer extends TileEntitySpecialRenderer { - public TileEntityBloomeryRenderer() { - model = new ModelBloomery(); - } - - public void renderAModelAt(TileEntityBloomery tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - this.renderModelAt(tile, tile.getTextureName(), i, d, d1, d2, f, tile.getWorldObj() == null); - } - - public void renderModelAt(TileEntityBloomery tile, String tex, int meta, double d, double d1, double d2, float f, - boolean inv) { - int i = meta; - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1.0F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(tile, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - public void renderInvModel(String tex, double d, double d1, double d2, float f) { - int j = 90; - bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1.0F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(null, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityBloomery) tileentity, d, d1, d2, f); // where to render - } - - private ModelBloomery model; - private Random random = new Random(); + private ModelBloomery model; + private Random random = new Random(); + + public TileEntityBloomeryRenderer() { + model = new ModelBloomery(); + } + + public void renderAModelAt(TileEntityBloomery tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + this.renderModelAt(tile, tile.getTextureName(), i, d, d1, d2, f, tile.getWorldObj() == null); + } + + public void renderModelAt(TileEntityBloomery tile, String tex, int meta, double d, double d1, double d2, float f, + boolean inv) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.0F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(tile, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + public void renderInvModel(String tex, double d, double d1, double d2, float f) { + int j = 90; + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.0F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(null, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityBloomery) tileentity, d, d1, d2, f); // where to render + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombBenchRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombBenchRenderer.java index 3fe03f50..22dc7f88 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombBenchRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombBenchRenderer.java @@ -1,103 +1,101 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. - * - * Custom renderers based off render tutorial by MC_DucksAreBest + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. + *

+ * Custom renderers based off render tutorial by MC_DucksAreBest */ public class TileEntityBombBenchRenderer extends TileEntitySpecialRenderer { - public TileEntityBombBenchRenderer() { - model = new ModelBombBench(); - } - - public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - for (int a = 0; a < 2; a++) { - if (shouldRender(tile, a)) { - this.renderModelAt("carpenter_bomb", i, d, d1, d2, f, a); - } - } - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { - int i = meta; - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - if (renderPass == 1) { - bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture - } else { - bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture - } - - GL11.glPushMatrix(); // start - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size - GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt(tileentity, d, d1, d2, f); // where to render - } - - private ModelBombBench model; - private Random random = new Random(); - - private boolean shouldRender(TileEntity tile, int p) { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if (p == 1)// GRID - { - return false; - } - return true; - } + private ModelBombBench model; + private Random random = new Random(); + + public TileEntityBombBenchRenderer() { + model = new ModelBombBench(); + } + + public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + for (int a = 0; a < 2; a++) { + if (shouldRender(tile, a)) { + this.renderModelAt("carpenter_bomb", i, d, d1, d2, f, a); + } + } + } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + if (renderPass == 1) { + bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture + } else { + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + } + + GL11.glPushMatrix(); // start + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt(tileentity, d, d1, d2, f); // where to render + } + + private boolean shouldRender(TileEntity tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombPressRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombPressRenderer.java index 528561fc..d5b82e86 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombPressRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityBombPressRenderer.java @@ -1,100 +1,98 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityBombPress; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. - * - * Custom renderers based off render tutorial by MC_DucksAreBest + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. + *

+ * Custom renderers based off render tutorial by MC_DucksAreBest */ public class TileEntityBombPressRenderer extends TileEntitySpecialRenderer { - public TileEntityBombPressRenderer() { - model = new ModelBombPress(); - } - - public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - for (int a = 0; a < 2; a++) { - if (shouldRender(tile, a)) { - this.renderModelAt("bombPress", i, d, d1, d2, f, a, ((TileEntityBombPress) tile).animation); - } - } - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass, - float animation) { - int i = meta; - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture - - GL11.glPushMatrix(); // start - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1, (float) d2 + 0.5F); // size - GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F, animation); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt(tileentity, d, d1, d2, f); // where to render - } - - private ModelBombPress model; - private Random random = new Random(); - - private boolean shouldRender(TileEntity tile, int p) { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if (p == 1)// GRID - { - return false; - } - return true; - } + private ModelBombPress model; + private Random random = new Random(); + + public TileEntityBombPressRenderer() { + model = new ModelBombPress(); + } + + public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + for (int a = 0; a < 2; a++) { + if (shouldRender(tile, a)) { + this.renderModelAt("bombPress", i, d, d1, d2, f, a, ((TileEntityBombPress) tile).animation); + } + } + } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass, + float animation) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F, animation); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt(tileentity, d, d1, d2, f); // where to render + } + + private boolean shouldRender(TileEntity tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityCarpenterRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityCarpenterRenderer.java index 2a75ca83..076c2dd6 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityCarpenterRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityCarpenterRenderer.java @@ -1,94 +1,93 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; public class TileEntityCarpenterRenderer extends TileEntitySpecialRenderer { - public TileEntityCarpenterRenderer() { - model = new ModelWoodCarpenter(); - } - - public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - for (int a = 0; a < 2; a++) { - if (shouldRender(tile, a)) { - this.renderModelAt("carpenter", i, d, d1, d2, f, a); - } - } - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { - int i = meta; - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - if (renderPass == 1) { - bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture - } else { - bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture - } - - GL11.glPushMatrix(); // start - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size - GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt(tileentity, d, d1, d2, f); // where to render - } - - private ModelWoodCarpenter model; - private Random random = new Random(); - - private boolean shouldRender(TileEntity tile, int p) { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if (p == 1)// GRID - { - return false; - } - return true; - } + private ModelWoodCarpenter model; + private Random random = new Random(); + + public TileEntityCarpenterRenderer() { + model = new ModelWoodCarpenter(); + } + + public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + for (int a = 0; a < 2; a++) { + if (shouldRender(tile, a)) { + this.renderModelAt("carpenter", i, d, d1, d2, f, a); + } + } + } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + if (renderPass == 1) { + bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture + } else { + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + } + + GL11.glPushMatrix(); // start + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt(tileentity, d, d1, d2, f); // where to render + } + + private boolean shouldRender(TileEntity tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityCrossbowBenchRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityCrossbowBenchRenderer.java index 0765260b..65f3cb71 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityCrossbowBenchRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityCrossbowBenchRenderer.java @@ -1,103 +1,101 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. - * - * Custom renderers based off render tutorial by MC_DucksAreBest + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. + *

+ * Custom renderers based off render tutorial by MC_DucksAreBest */ public class TileEntityCrossbowBenchRenderer extends TileEntitySpecialRenderer { - public TileEntityCrossbowBenchRenderer() { - model = new ModelCrossbowBench(); - } - - public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - for (int a = 0; a < 2; a++) { - if (shouldRender(tile, a)) { - this.renderModelAt("carpenter_crossbow", i, d, d1, d2, f, a); - } - } - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { - int i = meta; - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - if (renderPass == 1) { - bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture - } else { - bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture - } - - GL11.glPushMatrix(); // start - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size - GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt(tileentity, d, d1, d2, f); // where to render - } - - private ModelCrossbowBench model; - private Random random = new Random(); - - private boolean shouldRender(TileEntity tile, int p) { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if (p == 1)// GRID - { - return false; - } - return true; - } + private ModelCrossbowBench model; + private Random random = new Random(); + + public TileEntityCrossbowBenchRenderer() { + model = new ModelCrossbowBench(); + } + + public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + for (int a = 0; a < 2; a++) { + if (shouldRender(tile, a)) { + this.renderModelAt("carpenter_crossbow", i, d, d1, d2, f, a); + } + } + } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f, int renderPass) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + if (renderPass == 1) { + bindTextureByName("textures/models/tileentity/anvilGrid.png"); // texture + } else { + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + } + + GL11.glPushMatrix(); // start + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt(tileentity, d, d1, d2, f); // where to render + } + + private boolean shouldRender(TileEntity tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityFirepitRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityFirepitRenderer.java index fb2a4752..a8668ac6 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityFirepitRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityFirepitRenderer.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityFirepit; import net.minecraft.client.renderer.texture.TextureManager; @@ -9,64 +7,64 @@ import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; public class TileEntityFirepitRenderer extends TileEntitySpecialRenderer { - private ModelForgeTop topModel; - - public TileEntityFirepitRenderer() { - model = new ModelFirepit(); - topModel = new ModelForgeTop(); - } + private ModelForgeTop topModel; + private ModelFirepit model; - public void renderAModelAt(TileEntityFirepit tile, double d, double d1, double d2, float f) { - bindTextureByName("textures/models/tileentity/firepit.png"); - GL11.glPushMatrix(); - float yOffset = 0.0625F * 5F; + public TileEntityFirepitRenderer() { + model = new ModelFirepit(); + topModel = new ModelForgeTop(); + } - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); - GL11.glScalef(1.0F, -1F, -1F); + public void renderAModelAt(TileEntityFirepit tile, double d, double d1, double d2, float f) { + bindTextureByName("textures/models/tileentity/firepit.png"); + GL11.glPushMatrix(); + float yOffset = 0.0625F * 5F; - model.renderModel(tile, 0.0625F); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); + GL11.glScalef(1.0F, -1F, -1F); - if (tile.hasBlockAbove()) { - GL11.glTranslatef(0F, -(1.5F - yOffset), 0F); - bindTextureByName("textures/models/tileentity/forge_top.png"); // texture - topModel.render(0.0625F); - } - GL11.glPopMatrix(); + model.renderModel(tile, 0.0625F); - } + if (tile.hasBlockAbove()) { + GL11.glTranslatef(0F, -(1.5F - yOffset), 0F); + bindTextureByName("textures/models/tileentity/forge_top.png"); // texture + topModel.render(0.0625F); + } + GL11.glPopMatrix(); - public void renderInvModel(double d, double d1, double d2, float f) { - bindTextureByName("textures/models/tileentity/firepit.png"); - GL11.glPushMatrix(); - float yOffset = 0.0625F * 5F; + } - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); - GL11.glScalef(1.0F, -1F, -1F); + public void renderInvModel(double d, double d1, double d2, float f) { + bindTextureByName("textures/models/tileentity/firepit.png"); + GL11.glPushMatrix(); + float yOffset = 0.0625F * 5F; - model.renderModel(null, 0.0625F); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); + GL11.glScalef(1.0F, -1F, -1F); - GL11.glPopMatrix(); + model.renderModel(null, 0.0625F); - } + GL11.glPopMatrix(); - @Override - protected void bindTexture(ResourceLocation p_147499_1_) { - TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + } - if (texturemanager != null) { - texturemanager.bindTexture(p_147499_1_); - } - } + @Override + protected void bindTexture(ResourceLocation p_147499_1_) { + TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; - private void bindTextureByName(String image) { - bindTexture(TextureHelperMF.getResource(image)); - } + if (texturemanager != null) { + texturemanager.bindTexture(p_147499_1_); + } + } - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityFirepit) tileentity, d, d1, d2, f); - } + private void bindTextureByName(String image) { + bindTexture(TextureHelperMF.getResource(image)); + } - private ModelFirepit model; + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityFirepit) tileentity, d, d1, d2, f); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityForgeRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityForgeRenderer.java index 4ba5fc88..b21b88e6 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityForgeRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityForgeRenderer.java @@ -1,121 +1,120 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityForge; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; public class TileEntityForgeRenderer extends TileEntitySpecialRenderer { - public TileEntityForgeRenderer() { - model = new ModelForge(); - topModel = new ModelForgeTop(); - } - - public void renderAModelAt(TileEntityForge tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - this.renderModelAt(tile, tile.getTextureName(), i, d, d1, d2, f, tile.getWorldObj() == null, tile.hasFuel()); - } - - public void renderModelAt(TileEntityForge tile, String tex, int meta, double d, double d1, double d2, float f, - boolean inv, boolean hasFuel) { - int i = meta; - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = inv ? 1.75F : 1.5F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - if (tile != null && tile.fuel > 0 && tile.maxFuel > 0) { - level = tile.fuel / tile.maxFuel; - } - model.renderModel(tile, 0.0625F, hasFuel, level); - - if (tile != null && tile.hasBlockAbove()) { - bindTextureByName("textures/models/tileentity/forge_top.png"); // texture - topModel.render(0.0625F); - } - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - public void renderInvModel(String tex, double d, double d1, double d2, float f) { - int j = 90; - - bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1.75F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - model.renderModel(null, 0.0625F, false, level); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityForge) tileentity, d, d1, d2, f); // where to render - } - - private ModelForge model; - private ModelForgeTop topModel; - private Random random = new Random(); - - private boolean shouldRender(TileEntityForge tile, int p) { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if (p == 1)// GRID - { - return false; - } - return true; - } + private ModelForge model; + private ModelForgeTop topModel; + private Random random = new Random(); + + public TileEntityForgeRenderer() { + model = new ModelForge(); + topModel = new ModelForgeTop(); + } + + public void renderAModelAt(TileEntityForge tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + this.renderModelAt(tile, tile.getTextureName(), i, d, d1, d2, f, tile.getWorldObj() == null, tile.hasFuel()); + } + + public void renderModelAt(TileEntityForge tile, String tex, int meta, double d, double d1, double d2, float f, + boolean inv, boolean hasFuel) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = inv ? 1.75F : 1.5F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + if (tile != null && tile.fuel > 0 && tile.maxFuel > 0) { + level = tile.fuel / tile.maxFuel; + } + model.renderModel(tile, 0.0625F, hasFuel, level); + + if (tile != null && tile.hasBlockAbove()) { + bindTextureByName("textures/models/tileentity/forge_top.png"); // texture + topModel.render(0.0625F); + } + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + public void renderInvModel(String tex, double d, double d1, double d2, float f) { + int j = 90; + + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.75F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j - 90F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + model.renderModel(null, 0.0625F, false, level); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityForge) tileentity, d, d1, d2, f); // where to render + } + + private boolean shouldRender(TileEntityForge tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityQuernRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityQuernRenderer.java index 48d68ba4..55b41e03 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityQuernRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityQuernRenderer.java @@ -1,51 +1,50 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityQuern; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; public class TileEntityQuernRenderer extends TileEntitySpecialRenderer { - public TileEntityQuernRenderer() { - model = new ModelQuern(); - } - - public void renderAModelAt(TileEntityQuern tile, double d, double d1, double d2, float f) { - this.renderModelAt(tile, tile.getTextureName(), d, d1, d2, f, tile.getWorldObj() == null); - } - - public void renderModelAt(TileEntityQuern tile, String tex, double d, double d1, double d2, float f, boolean inv) { - bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1.0F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(tile, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityQuern) tileentity, d, d1, d2, f); // where to render - } - - private ModelQuern model; - private Random random = new Random(); + private ModelQuern model; + private Random random = new Random(); + + public TileEntityQuernRenderer() { + model = new ModelQuern(); + } + + public void renderAModelAt(TileEntityQuern tile, double d, double d1, double d2, float f) { + this.renderModelAt(tile, tile.getTextureName(), d, d1, d2, f, tile.getWorldObj() == null); + } + + public void renderModelAt(TileEntityQuern tile, String tex, double d, double d1, double d2, float f, boolean inv) { + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.0F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(tile, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityQuern) tileentity, d, d1, d2, f); // where to render + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityRackRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityRackRenderer.java index b7bc09d1..82442958 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityRackRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityRackRenderer.java @@ -1,8 +1,5 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.weapon.IRackItem; @@ -23,237 +20,238 @@ import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.client.IItemRenderer.ItemRendererHelper; import net.minecraftforge.client.MinecraftForgeClient; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; public class TileEntityRackRenderer extends TileEntitySpecialRenderer { - private static Minecraft mc = Minecraft.getMinecraft(); - - public TileEntityRackRenderer() { - model = new ModelRack(); - } - - public void renderAModelAt(TileEntityRack tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata() - 2; - } - int j = i * 90; - if (i == 1) - j = 180; - if (i == 2) - j = 90; - - GL11.glPushMatrix();// Start all - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1F, (float) d2 + 0.5F); - GL11.glRotatef(j + 180, 0.0F, 1.0F, 0.0F); - GL11.glScalef(1.0F, -1F, -1F); - float itemsStart = -(3F / 16F); - float itemsGap = 4F / 16F; - - CustomMaterial material = tile.getMaterial(); - GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); - - bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_base.png"); // texture - model.renderModel(0.0625F); - - GL11.glColor3f(1F, 1F, 1F); - - bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_detail.png"); // texture - model.renderModel(0.0625F); - - for (int a = 0; a < 4; a++) { - GL11.glPushMatrix();// Start Individual Items - ItemStack itemstack = tile.getStackInSlot(a); - if (itemstack != null) { - float o = tile.yCoord % 2 == 0 ? 2F : 3F; - float x = itemsStart + (a * itemsGap) - (o / 16F); - float y = 0.3F; - float z = a % 2 == 0 ? 0.4F : 0.45F; - z -= 6F / 16F; - float r = getRotationForItem(itemstack.getItem()); - float scale = 1.0F; - if (itemstack.getItem() instanceof IRackItem) { - IRackItem rackitem = (IRackItem) itemstack.getItem(); - scale = rackitem.getScale(itemstack); - x += rackitem.getOffsetX(itemstack); - y += rackitem.getOffsetY(itemstack); - z -= rackitem.getOffsetZ(itemstack); - r += rackitem.getRotationOffset(itemstack); - z -= (scale - 1) / 2 * 5.5F / 16F; - y -= (scale - 1) / 2F; - } - - GL11.glTranslatef(x, y, z); - - GL11.glPushMatrix(); - GL11.glRotatef(90F, 0, 1F, 0); - GL11.glRotatef(r, 0, 0, 1F); - GL11.glScalef(scale, scale, 1); - - IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(itemstack, ItemRenderType.EQUIPPED); - if (isCustom(itemstack) && customRenderer != null) { - this.mc.getTextureManager().bindTexture( - this.mc.getTextureManager().getResourceLocation(itemstack.getItemSpriteNumber())); - renderEquippedItem(ItemRenderType.EQUIPPED, customRenderer, new RenderBlocks(), itemstack); - } else { - for (int layer = 0; layer < itemstack.getItem() - .getRenderPasses(itemstack.getItemDamage()); layer++) { - IIcon icon = itemstack.getItem().getIcon(itemstack, layer); - if (icon != null) { - GL11.glPushMatrix(); - int colour = itemstack.getItem().getColorFromItemStack(itemstack, layer); - float red = (colour >> 16 & 255) / 255.0F; - float green = (colour >> 8 & 255) / 255.0F; - float blue = (colour & 255) / 255.0F; - - GL11.glColor4f(red, green, blue, 1.0F); - - renderItem(tile, itemstack, icon, a, layer); - GL11.glPopMatrix(); - } - } - } - GL11.glPopMatrix(); - } - - GL11.glPopMatrix();// END individual item placement - } - GL11.glPopMatrix(); // end all - - } - - public void renderInvModel(CustomMaterial material, String tex, double d, double d1, double d2, float f) { - int j = 0; - - GL11.glPushMatrix();// Start all - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1F, (float) d2 + 0.5F); - GL11.glRotatef(j + 180, 0.0F, 1.0F, 0.0F); - GL11.glScalef(1.0F, -1F, -1F); - float itemsStart = -(3F / 16F); - float itemsGap = 4F / 16F; - - GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); - - bindTextureByName("textures/models/tileentity/" + tex + "_base.png"); // texture - model.renderModel(0.0625F); - - GL11.glColor3f(1F, 1F, 1F); - - bindTextureByName("textures/models/tileentity/" + tex + "_detail.png"); // texture - model.renderModel(0.0625F); - - GL11.glPopMatrix(); // end all - - } - - private float getRotationForItem(Item item) { - String classname = item.getClass().getName(); - if (classname.endsWith("ItemCrossbow") || classname.endsWith("ItemBlunderbuss") - || classname.endsWith("ItemBlowgun") || classname.endsWith("ItemMusket")) { - return 45F; - } - return -45F; - } - - @Override - protected void bindTexture(ResourceLocation p_147499_1_) { - TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; - - if (texturemanager != null) { - texturemanager.bindTexture(p_147499_1_); - } - } - - private void bindTextureByName(String image) { - bindTexture(TextureHelperMF.getResource(image)); - } - - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityRack) tileentity, d, d1, d2, f); // where to render - } - - private void renderItem(TileEntityRack tile, ItemStack itemstack, IIcon icon, int slot, int layer) { - GL11.glPushMatrix(); - TextureManager texturemanager = this.mc.getTextureManager(); - GL11.glScalef(0.85F, 0.85F, 0.85F); - - if (icon == null) { - GL11.glPopMatrix(); - return; - } - - texturemanager.bindTexture(texturemanager.getResourceLocation(itemstack.getItemSpriteNumber())); - Tessellator tessellator = Tessellator.instance; - float f = icon.getMinU(); - float f1 = icon.getMaxU(); - float f2 = icon.getMinV(); - float f3 = icon.getMaxV(); - float f4 = 0.0F; - float f5 = 0.3F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-f4, -f5, 0.0F); - GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); - ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), 0.0625F); - - if (itemstack.hasEffect(layer)) { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - texturemanager.bindTexture(TextureHelperMF.ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - float f7 = 0.76F; - GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float f8 = 0.125F; - GL11.glScalef(f8, f8, f8); - float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; - GL11.glTranslatef(f9, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(f8, f8, f8); - f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; - GL11.glTranslatef(-f9, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - - GL11.glPopMatrix(); - } - - private boolean isCustom(ItemStack itemstack) { - if (itemstack != null && itemstack.getItem() instanceof IRackItem) { - return ((IRackItem) itemstack.getItem()).isSpecialRender(itemstack); - } - return false; - } - - public static void renderEquippedItem(ItemRenderType type, IItemRenderer customRenderer, RenderBlocks renderBlocks, - ItemStack item) { - if (customRenderer.shouldUseRenderHelper(type, item, ItemRendererHelper.EQUIPPED_BLOCK)) { - GL11.glPushMatrix(); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - customRenderer.renderItem(type, item, renderBlocks); - GL11.glPopMatrix(); - } else { - GL11.glPushMatrix(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(0.0F, -0.3F, 0.0F); - - GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); - customRenderer.renderItem(type, item, renderBlocks); - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - GL11.glPopMatrix(); - } - } - - private ModelRack model; + private static Minecraft mc = Minecraft.getMinecraft(); + private ModelRack model; + + public TileEntityRackRenderer() { + model = new ModelRack(); + } + + public static void renderEquippedItem(ItemRenderType type, IItemRenderer customRenderer, RenderBlocks renderBlocks, + ItemStack item) { + if (customRenderer.shouldUseRenderHelper(type, item, ItemRendererHelper.EQUIPPED_BLOCK)) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + customRenderer.renderItem(type, item, renderBlocks); + GL11.glPopMatrix(); + } else { + GL11.glPushMatrix(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(0.0F, -0.3F, 0.0F); + + GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); + customRenderer.renderItem(type, item, renderBlocks); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + } + + public void renderAModelAt(TileEntityRack tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata() - 2; + } + int j = i * 90; + if (i == 1) + j = 180; + if (i == 2) + j = 90; + + GL11.glPushMatrix();// Start all + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1F, (float) d2 + 0.5F); + GL11.glRotatef(j + 180, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, -1F, -1F); + float itemsStart = -(3F / 16F); + float itemsGap = 4F / 16F; + + CustomMaterial material = tile.getMaterial(); + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_base.png"); // texture + model.renderModel(0.0625F); + + GL11.glColor3f(1F, 1F, 1F); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_detail.png"); // texture + model.renderModel(0.0625F); + + for (int a = 0; a < 4; a++) { + GL11.glPushMatrix();// Start Individual Items + ItemStack itemstack = tile.getStackInSlot(a); + if (itemstack != null) { + float o = tile.yCoord % 2 == 0 ? 2F : 3F; + float x = itemsStart + (a * itemsGap) - (o / 16F); + float y = 0.3F; + float z = a % 2 == 0 ? 0.4F : 0.45F; + z -= 6F / 16F; + float r = getRotationForItem(itemstack.getItem()); + float scale = 1.0F; + if (itemstack.getItem() instanceof IRackItem) { + IRackItem rackitem = (IRackItem) itemstack.getItem(); + scale = rackitem.getScale(itemstack); + x += rackitem.getOffsetX(itemstack); + y += rackitem.getOffsetY(itemstack); + z -= rackitem.getOffsetZ(itemstack); + r += rackitem.getRotationOffset(itemstack); + z -= (scale - 1) / 2 * 5.5F / 16F; + y -= (scale - 1) / 2F; + } + + GL11.glTranslatef(x, y, z); + + GL11.glPushMatrix(); + GL11.glRotatef(90F, 0, 1F, 0); + GL11.glRotatef(r, 0, 0, 1F); + GL11.glScalef(scale, scale, 1); + + IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(itemstack, ItemRenderType.EQUIPPED); + if (isCustom(itemstack) && customRenderer != null) { + this.mc.getTextureManager().bindTexture( + this.mc.getTextureManager().getResourceLocation(itemstack.getItemSpriteNumber())); + renderEquippedItem(ItemRenderType.EQUIPPED, customRenderer, new RenderBlocks(), itemstack); + } else { + for (int layer = 0; layer < itemstack.getItem() + .getRenderPasses(itemstack.getItemDamage()); layer++) { + IIcon icon = itemstack.getItem().getIcon(itemstack, layer); + if (icon != null) { + GL11.glPushMatrix(); + int colour = itemstack.getItem().getColorFromItemStack(itemstack, layer); + float red = (colour >> 16 & 255) / 255.0F; + float green = (colour >> 8 & 255) / 255.0F; + float blue = (colour & 255) / 255.0F; + + GL11.glColor4f(red, green, blue, 1.0F); + + renderItem(tile, itemstack, icon, a, layer); + GL11.glPopMatrix(); + } + } + } + GL11.glPopMatrix(); + } + + GL11.glPopMatrix();// END individual item placement + } + GL11.glPopMatrix(); // end all + + } + + public void renderInvModel(CustomMaterial material, String tex, double d, double d1, double d2, float f) { + int j = 0; + + GL11.glPushMatrix();// Start all + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1F, (float) d2 + 0.5F); + GL11.glRotatef(j + 180, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, -1F, -1F); + float itemsStart = -(3F / 16F); + float itemsGap = 4F / 16F; + + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tex + "_base.png"); // texture + model.renderModel(0.0625F); + + GL11.glColor3f(1F, 1F, 1F); + + bindTextureByName("textures/models/tileentity/" + tex + "_detail.png"); // texture + model.renderModel(0.0625F); + + GL11.glPopMatrix(); // end all + + } + + private float getRotationForItem(Item item) { + String classname = item.getClass().getName(); + if (classname.endsWith("ItemCrossbow") || classname.endsWith("ItemBlunderbuss") + || classname.endsWith("ItemBlowgun") || classname.endsWith("ItemMusket")) { + return 45F; + } + return -45F; + } + + @Override + protected void bindTexture(ResourceLocation p_147499_1_) { + TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + + if (texturemanager != null) { + texturemanager.bindTexture(p_147499_1_); + } + } + + private void bindTextureByName(String image) { + bindTexture(TextureHelperMF.getResource(image)); + } + + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityRack) tileentity, d, d1, d2, f); // where to render + } + + private void renderItem(TileEntityRack tile, ItemStack itemstack, IIcon icon, int slot, int layer) { + GL11.glPushMatrix(); + TextureManager texturemanager = this.mc.getTextureManager(); + GL11.glScalef(0.85F, 0.85F, 0.85F); + + if (icon == null) { + GL11.glPopMatrix(); + return; + } + + texturemanager.bindTexture(texturemanager.getResourceLocation(itemstack.getItemSpriteNumber())); + Tessellator tessellator = Tessellator.instance; + float f = icon.getMinU(); + float f1 = icon.getMaxU(); + float f2 = icon.getMinV(); + float f3 = icon.getMaxV(); + float f4 = 0.0F; + float f5 = 0.3F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-f4, -f5, 0.0F); + GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); + ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), 0.0625F); + + if (itemstack.hasEffect(layer)) { + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + texturemanager.bindTexture(TextureHelperMF.ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + float f7 = 0.76F; + GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glPushMatrix(); + float f8 = 0.125F; + GL11.glScalef(f8, f8, f8); + float f9 = Minecraft.getSystemTime() % 3000L / 3000.0F * 8.0F; + GL11.glTranslatef(f9, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(f8, f8, f8); + f9 = Minecraft.getSystemTime() % 4873L / 4873.0F * 8.0F; + GL11.glTranslatef(-f9, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + + GL11.glPopMatrix(); + } + + private boolean isCustom(ItemStack itemstack) { + if (itemstack != null && itemstack.getItem() instanceof IRackItem) { + return ((IRackItem) itemstack.getItem()).isSpecialRender(itemstack); + } + return false; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityResearchRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityResearchRenderer.java index 2f9b204c..c403cac0 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityResearchRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityResearchRenderer.java @@ -1,86 +1,85 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; public class TileEntityResearchRenderer extends TileEntitySpecialRenderer { - public TileEntityResearchRenderer() { - model = new ModelResearch(); - } - - public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - this.renderModelAt("researchTable", i, d, d1, d2, f); - } - - public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f) { - int i = meta; - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - - bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture - - GL11.glPushMatrix(); // start - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size - GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - model.renderModel(0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt(tileentity, d, d1, d2, f); // where to render - } - - private ModelResearch model; - private Random random = new Random(); - - private boolean shouldRender(TileEntity tile, int p) { - Minecraft mc = Minecraft.getMinecraft(); - EntityPlayer sp = mc.thePlayer; - if (p == 1)// GRID - { - return false; - } - return true; - } + private ModelResearch model; + private Random random = new Random(); + + public TileEntityResearchRenderer() { + model = new ModelResearch(); + } + + public void renderAModelAt(TileEntity tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + this.renderModelAt("researchTable", i, d, d1, d2, f); + } + + public void renderModelAt(String tex, int meta, double d, double d1, double d2, float f) { + int i = meta; + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + + bindTextureByName("textures/models/tileentity/" + tex + ".png"); // texture + + GL11.glPushMatrix(); // start + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.25F, (float) d2 + 0.5F); // size + GL11.glRotatef(j + 180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(1F, -1F, -1F); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + model.renderModel(0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt(tileentity, d, d1, d2, f); // where to render + } + + private boolean shouldRender(TileEntity tile, int p) { + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer sp = mc.thePlayer; + if (p == 1)// GRID + { + return false; + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityRoastRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityRoastRenderer.java index 0a7d6900..735b791d 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityRoastRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityRoastRenderer.java @@ -1,8 +1,5 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityRoast; import net.minecraft.block.Block; @@ -20,104 +17,106 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; public class TileEntityRoastRenderer extends TileEntitySpecialRenderer { - private final RenderBlocks blockrender = new RenderBlocks(); - private ModelOven ovenModel; + private final RenderBlocks blockrender = new RenderBlocks(); + private ModelOven ovenModel; - public TileEntityRoastRenderer() { - ovenModel = new ModelOven(); - } + public TileEntityRoastRenderer() { + ovenModel = new ModelOven(); + } - public void renderAModelAt(TileEntityRoast tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.blockMetadata; - } - int j = 360 - (90 * i); - float pixelHeight = tile.isOven() ? 3F : 5F; - GL11.glPushMatrix(); - GL11.glTranslatef((float) d + 0.5F, (float) d1 + (pixelHeight / 32), (float) d2 + 0.5F); - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); - GL11.glScalef(1.0F, -1F, -1F); - if (tile.isOven()) { - GL11.glPushMatrix(); - GL11.glRotatef(180, 0, 1, 0); - bindTextureByName("textures/models/tileentity/oven_" + tile.getTexName() + ".png"); - ovenModel.render(0.0625F); - GL11.glPopMatrix(); - } + public void renderAModelAt(TileEntityRoast tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.blockMetadata; + } + int j = 360 - (90 * i); + float pixelHeight = tile.isOven() ? 3F : 5F; + GL11.glPushMatrix(); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + (pixelHeight / 32), (float) d2 + 0.5F); + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, -1F, -1F); + if (tile.isOven()) { + GL11.glPushMatrix(); + GL11.glRotatef(180, 0, 1, 0); + bindTextureByName("textures/models/tileentity/oven_" + tile.getTexName() + ".png"); + ovenModel.render(0.0625F); + GL11.glPopMatrix(); + } - GL11.glRotatef(90, 1.0F, 0F, 0F); - renderHungItem(tile, d, d1, d2, f); - GL11.glPopMatrix(); - } + GL11.glRotatef(90, 1.0F, 0F, 0F); + renderHungItem(tile, d, d1, d2, f); + GL11.glPopMatrix(); + } - public void renderInvModel(String tex, boolean oven, double d, double d1, double d2, float f) { + public void renderInvModel(String tex, boolean oven, double d, double d1, double d2, float f) { - float pixelHeight = oven ? 3F : 5F; - GL11.glPushMatrix(); - GL11.glTranslatef((float) d + 0.5F, (float) d1 + (pixelHeight / 32), (float) d2 + 0.5F); - GL11.glScalef(1.0F, -1F, -1F); - if (oven) { - GL11.glPushMatrix(); - GL11.glRotatef(180, 0, 1, 0); - bindTextureByName("textures/models/tileentity/oven_" + tex + ".png"); - ovenModel.render(0.0625F); - GL11.glPopMatrix(); - } + float pixelHeight = oven ? 3F : 5F; + GL11.glPushMatrix(); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + (pixelHeight / 32), (float) d2 + 0.5F); + GL11.glScalef(1.0F, -1F, -1F); + if (oven) { + GL11.glPushMatrix(); + GL11.glRotatef(180, 0, 1, 0); + bindTextureByName("textures/models/tileentity/oven_" + tex + ".png"); + ovenModel.render(0.0625F); + GL11.glPopMatrix(); + } - GL11.glPopMatrix(); - } + GL11.glPopMatrix(); + } - @Override - protected void bindTexture(ResourceLocation p_147499_1_) { - TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + @Override + protected void bindTexture(ResourceLocation p_147499_1_) { + TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; - if (texturemanager != null) { - texturemanager.bindTexture(p_147499_1_); - } - } + if (texturemanager != null) { + texturemanager.bindTexture(p_147499_1_); + } + } - private void bindTextureByName(String image) { - bindTexture(TextureHelperMF.getResource(image)); - } + private void bindTextureByName(String image) { + bindTexture(TextureHelperMF.getResource(image)); + } - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityRoast) tileentity, d, d1, d2, f); - } + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityRoast) tileentity, d, d1, d2, f); + } - private void renderHungItem(TileEntityRoast tile, double d, double d1, double d2, float f) { - Minecraft mc = Minecraft.getMinecraft(); - ItemStack itemstack = tile.getStackInSlot(0); - if (itemstack == null) - return; - // Block - if (itemstack.getItemSpriteNumber() == 0 && itemstack.getItem() instanceof ItemBlock - && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(itemstack.getItem()).getRenderType())) { - Block block = Block.getBlockFromItem(itemstack.getItem()); - if (block != null) { - // this.blockrender.renderBlockAsItem(block, itemstack.getItemDamage(), 1.0F); - } - } - // Item - else if (itemstack.getItem().getIconFromDamage(itemstack.getItemDamage()) != null) { - Item item = itemstack.getItem(); - mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + private void renderHungItem(TileEntityRoast tile, double d, double d1, double d2, float f) { + Minecraft mc = Minecraft.getMinecraft(); + ItemStack itemstack = tile.getStackInSlot(0); + if (itemstack == null) + return; + // Block + if (itemstack.getItemSpriteNumber() == 0 && itemstack.getItem() instanceof ItemBlock + && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(itemstack.getItem()).getRenderType())) { + Block block = Block.getBlockFromItem(itemstack.getItem()); + if (block != null) { + // this.blockrender.renderBlockAsItem(block, itemstack.getItemDamage(), 1.0F); + } + } + // Item + else if (itemstack.getItem().getIconFromDamage(itemstack.getItemDamage()) != null) { + Item item = itemstack.getItem(); + mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - Tessellator image = Tessellator.instance; - IIcon index = item.getIconFromDamage(itemstack.getItemDamage()); - float x1 = index.getMaxU(); - float x2 = index.getMinU(); - float y1 = index.getMinV(); - float y2 = index.getMaxV(); - float scale = 0.5F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-scale / 2, -scale / 2, 0.0F); - GL11.glScalef(scale, scale, scale); - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(-1F, -1F, 0.0F); - ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, index.getIconWidth(), index.getIconHeight(), 0.0625F); - } - } + Tessellator image = Tessellator.instance; + IIcon index = item.getIconFromDamage(itemstack.getItemDamage()); + float x1 = index.getMaxU(); + float x2 = index.getMinU(); + float y1 = index.getMinV(); + float y2 = index.getMaxV(); + float scale = 0.5F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-scale / 2, -scale / 2, 0.0F); + GL11.glScalef(scale, scale, scale); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-1F, -1F, 0.0F); + ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, index.getIconWidth(), index.getIconHeight(), 0.0625F); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntitySmokePipeRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntitySmokePipeRenderer.java index 12ba9213..78f5d732 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntitySmokePipeRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntitySmokePipeRenderer.java @@ -1,50 +1,49 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityChimney; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; public class TileEntitySmokePipeRenderer extends TileEntitySpecialRenderer { - public TileEntitySmokePipeRenderer() { - } - - public void renderAModelAt(TileEntityChimney tile, double d, double d1, double d2, float f) { - if (tile != null && !tile.isPipeChimney()) { - return; - } - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 0.5F; - - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - - bindTextureByName("textures/models/tileentity/smoke_pipe.png"); // texture - model.renderModel(tile, 0.0625F); - - GL11.glPopMatrix(); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityChimney) tileentity, d, d1, d2, f); // where to render - } - - private static ModelSmokePipe model = new ModelSmokePipe(); - private Random random = new Random(); + private static ModelSmokePipe model = new ModelSmokePipe(); + private Random random = new Random(); + + public TileEntitySmokePipeRenderer() { + } + + public void renderAModelAt(TileEntityChimney tile, double d, double d1, double d2, float f) { + if (tile != null && !tile.isPipeChimney()) { + return; + } + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 0.5F; + + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + + bindTextureByName("textures/models/tileentity/smoke_pipe.png"); // texture + model.renderModel(tile, 0.0625F); + + GL11.glPopMatrix(); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityChimney) tileentity, d, d1, d2, f); // where to render + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityTanningRackRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityTanningRackRenderer.java index 92e02c2b..8216043b 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityTanningRackRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityTanningRackRenderer.java @@ -1,8 +1,5 @@ package minefantasy.mf2.client.render.block; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.block.tileentity.TileEntityTanningRack; import net.minecraft.client.Minecraft; @@ -17,126 +14,128 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; public class TileEntityTanningRackRenderer extends TileEntitySpecialRenderer { - public TileEntityTanningRackRenderer() { - engmodel = new ModelEngTanningRack(); - model = new ModelTanningRack(); - } - - public void renderAModelAt(TileEntityTanningRack tile, double d, double d1, double d2, float f) { - if (tile != null) - ; - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.blockMetadata; - } - - int j = 90 * i; - - if (i == 0) { - j = 0; - } - - if (i == 1) { - j = 270; - } - - if (i == 2) { - j = 180; - } - - if (i == 3) { - j = 90; - } - if (i == 4) { - j = 90; - } - bindTextureByName("textures/models/tileentity/tanner" + tile.tex + ".png"); - GL11.glPushMatrix(); - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.45F, (float) d2 + 0.5F); - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); - GL11.glScalef(1.0F, -1F, -1F); - if (tile.isAutomated()) { - engmodel.renderModel(0.0625F); - GL11.glPushMatrix(); - GL11.glTranslatef(0F, tile.acTime, 0F); - engmodel.renderBlade(0.0625F); - GL11.glPopMatrix(); - engmodel.rotateLever(tile.acTime); - engmodel.renderLever(0.0625F); - } else { - model.renderModel(0.0625F); - } - renderHungItem(tile, d, d1, d2, f); - GL11.glPopMatrix(); - - } - - public void renderInvModel(String tex, boolean isAuto, double d, double d1, double d2, float f) { - int j = 90; - bindTextureByName("textures/models/tileentity/tanner" + tex + ".png"); - GL11.glPushMatrix(); - GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.45F, (float) d2 + 0.5F); - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); - GL11.glScalef(1.0F, -1F, -1F); - if (isAuto) { - engmodel.renderModel(0.0625F); - GL11.glPushMatrix(); - engmodel.renderBlade(0.0625F); - GL11.glPopMatrix(); - engmodel.renderLever(0.0625F); - } else { - model.renderModel(0.0625F); - } - GL11.glPopMatrix(); - - } - - @Override - protected void bindTexture(ResourceLocation p_147499_1_) { - TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; - - if (texturemanager != null) { - texturemanager.bindTexture(p_147499_1_); - } - } - - private void bindTextureByName(String image) { - bindTexture(TextureHelperMF.getResource(image)); - } - - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityTanningRack) tileentity, d, d1, d2, f); - } - - private void renderHungItem(TileEntityTanningRack tile, double d, double d1, double d2, float f) { - Minecraft mc = Minecraft.getMinecraft(); - ItemStack itemstack = tile.getStackInSlot(0); - if (itemstack != null && itemstack.getItem().getIconFromDamage(itemstack.getItemDamage()) != null) { - Item item = itemstack.getItem(); - mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - - Tessellator image = Tessellator.instance; - IIcon index = item.getIconFromDamage(itemstack.getItemDamage()); - float x1 = index.getMinU(); - float x2 = index.getMaxU(); - float y1 = index.getMinV(); - float y2 = index.getMaxV(); - float xPos = 0.5F; - float yPos = -0.5F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glTranslatef(-xPos, -yPos, 0.0F); - float var13 = 1F; - GL11.glScalef(var13, var13, var13); - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(-1F, -1F, 0.0F); - ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, index.getIconWidth(), index.getIconHeight(), 0.0625F); - } - - } - - private ModelTanningRack model; - private ModelEngTanningRack engmodel; + private ModelTanningRack model; + private ModelEngTanningRack engmodel; + + public TileEntityTanningRackRenderer() { + engmodel = new ModelEngTanningRack(); + model = new ModelTanningRack(); + } + + public void renderAModelAt(TileEntityTanningRack tile, double d, double d1, double d2, float f) { + if (tile != null) + ; + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.blockMetadata; + } + + int j = 90 * i; + + if (i == 0) { + j = 0; + } + + if (i == 1) { + j = 270; + } + + if (i == 2) { + j = 180; + } + + if (i == 3) { + j = 90; + } + if (i == 4) { + j = 90; + } + bindTextureByName("textures/models/tileentity/tanner" + tile.tex + ".png"); + GL11.glPushMatrix(); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.45F, (float) d2 + 0.5F); + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, -1F, -1F); + if (tile.isAutomated()) { + engmodel.renderModel(0.0625F); + GL11.glPushMatrix(); + GL11.glTranslatef(0F, tile.acTime, 0F); + engmodel.renderBlade(0.0625F); + GL11.glPopMatrix(); + engmodel.rotateLever(tile.acTime); + engmodel.renderLever(0.0625F); + } else { + model.renderModel(0.0625F); + } + renderHungItem(tile, d, d1, d2, f); + GL11.glPopMatrix(); + + } + + public void renderInvModel(String tex, boolean isAuto, double d, double d1, double d2, float f) { + int j = 90; + bindTextureByName("textures/models/tileentity/tanner" + tex + ".png"); + GL11.glPushMatrix(); + GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.45F, (float) d2 + 0.5F); + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); + GL11.glScalef(1.0F, -1F, -1F); + if (isAuto) { + engmodel.renderModel(0.0625F); + GL11.glPushMatrix(); + engmodel.renderBlade(0.0625F); + GL11.glPopMatrix(); + engmodel.renderLever(0.0625F); + } else { + model.renderModel(0.0625F); + } + GL11.glPopMatrix(); + + } + + @Override + protected void bindTexture(ResourceLocation p_147499_1_) { + TextureManager texturemanager = TileEntityRendererDispatcher.instance.field_147553_e; + + if (texturemanager != null) { + texturemanager.bindTexture(p_147499_1_); + } + } + + private void bindTextureByName(String image) { + bindTexture(TextureHelperMF.getResource(image)); + } + + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityTanningRack) tileentity, d, d1, d2, f); + } + + private void renderHungItem(TileEntityTanningRack tile, double d, double d1, double d2, float f) { + Minecraft mc = Minecraft.getMinecraft(); + ItemStack itemstack = tile.getStackInSlot(0); + if (itemstack != null && itemstack.getItem().getIconFromDamage(itemstack.getItemDamage()) != null) { + Item item = itemstack.getItem(); + mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + + Tessellator image = Tessellator.instance; + IIcon index = item.getIconFromDamage(itemstack.getItemDamage()); + float x1 = index.getMinU(); + float x2 = index.getMaxU(); + float y1 = index.getMinV(); + float y2 = index.getMaxV(); + float xPos = 0.5F; + float yPos = -0.5F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-xPos, -yPos, 0.0F); + float var13 = 1F; + GL11.glScalef(var13, var13, var13); + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-1F, -1F, 0.0F); + ItemRenderer.renderItemIn2D(image, x2, y1, x1, y2, index.getIconWidth(), index.getIconHeight(), 0.0625F); + } + + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java index ebfdc0d8..68c779d2 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java @@ -1,120 +1,119 @@ package minefantasy.mf2.client.render.block; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.tileentity.decor.TileEntityTrough; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; + +import java.util.Random; public class TileEntityTroughRenderer extends TileEntitySpecialRenderer { - public TileEntityTroughRenderer() { - model = new ModelTrough(); - } - - public void renderAModelAt(TileEntityTrough tile, double d, double d1, double d2, float f) { - int i = 0; - if (tile.getWorldObj() != null) { - i = tile.getBlockMetadata(); - } - this.renderModelAt(tile, i, d, d1, d2, f); - } - - public void renderModelAt(TileEntityTrough tile, int meta, double d, double d1, double d2, float f) { - int i = meta; - - int j = 90 * i; - - if (i == 1) { - j = 0; - } - - if (i == 2) { - j = 270; - } - - if (i == 3) { - j = 180; - } - - if (i == 0) { - j = 90; - } - if (i == 0) { - j = 90; - } - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1 / 16F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - - CustomMaterial material = tile.getMaterial(); - GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); - - bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_base.png"); // texture - model.renderModel(0.0625F); - - GL11.glColor3f(1F, 1F, 1F); - - float height = (float) tile.fill / (float) tile.getCapacity(); - if (tile.fill > 0) { - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_water.png"); // texture - GL11.glColor4f(1F, 1F, 1F, 0.5F); - GL11.glTranslatef(0F, -height * 0.35F, 0F); - model.renderWater(0.0625F); - } - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - public void renderInvModel(String tex, CustomMaterial material, double d, double d1, double d2, float f) { - int j = 90; - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1 / 16F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - - GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); - - bindTextureByName("textures/models/tileentity/" + tex + "_base.png"); // texture - model.renderModel(0.0625F); - - GL11.glColor3f(1F, 1F, 1F); - - GL11.glPopMatrix(); - GL11.glColor3f(255, 255, 255); - GL11.glPopMatrix(); // end - - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderAModelAt((TileEntityTrough) tileentity, d, d1, d2, f); // where to render - } - - private ModelTrough model; - private Random random = new Random(); + private ModelTrough model; + private Random random = new Random(); + + public TileEntityTroughRenderer() { + model = new ModelTrough(); + } + + public void renderAModelAt(TileEntityTrough tile, double d, double d1, double d2, float f) { + int i = 0; + if (tile.getWorldObj() != null) { + i = tile.getBlockMetadata(); + } + this.renderModelAt(tile, i, d, d1, d2, f); + } + + public void renderModelAt(TileEntityTrough tile, int meta, double d, double d1, double d2, float f) { + int i = meta; + + int j = 90 * i; + + if (i == 1) { + j = 0; + } + + if (i == 2) { + j = 270; + } + + if (i == 3) { + j = 180; + } + + if (i == 0) { + j = 90; + } + if (i == 0) { + j = 90; + } + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1 / 16F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + + CustomMaterial material = tile.getMaterial(); + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_base.png"); // texture + model.renderModel(0.0625F); + + GL11.glColor3f(1F, 1F, 1F); + + float height = (float) tile.fill / (float) tile.getCapacity(); + if (tile.fill > 0) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + bindTextureByName("textures/models/tileentity/" + tile.getTexName() + "_water.png"); // texture + GL11.glColor4f(1F, 1F, 1F, 0.5F); + GL11.glTranslatef(0F, -height * 0.35F, 0F); + model.renderWater(0.0625F); + } + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + public void renderInvModel(String tex, CustomMaterial material, double d, double d1, double d2, float f) { + int j = 90; + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1 / 16F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); + + bindTextureByName("textures/models/tileentity/" + tex + "_base.png"); // texture + model.renderModel(0.0625F); + + GL11.glColor3f(1F, 1F, 1F); + + GL11.glPopMatrix(); + GL11.glColor3f(255, 255, 255); + GL11.glPopMatrix(); // end + + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderAModelAt((TileEntityTrough) tileentity, d, d1, d2, f); // where to render + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelBarStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelBarStack.java index bad87c6c..ee3ef5c2 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelBarStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelBarStack.java @@ -4,61 +4,61 @@ import net.minecraft.client.model.ModelRenderer; public class ModelBarStack extends ModelBase { - private ModelRenderer[] bar = new ModelRenderer[64]; + private ModelRenderer[] bar = new ModelRenderer[64]; - public ModelBarStack() { - textureWidth = 32; - textureHeight = 16; - int i = 0; - for (int y = 0; y < 4; y++) { - for (int z = 0; z < 2; z++) { - for (int x = 0; x < 2; x++) { - float xCoord = -7.5F + (x * 8F); - float yCoord = 12F - (y * 4F); - float zCoord = 7.5F - (z * 8F); + public ModelBarStack() { + textureWidth = 32; + textureHeight = 16; + int i = 0; + for (int y = 0; y < 4; y++) { + for (int z = 0; z < 2; z++) { + for (int x = 0; x < 2; x++) { + float xCoord = -7.5F + (x * 8F); + float yCoord = 12F - (y * 4F); + float zCoord = 7.5F - (z * 8F); - bar[i] = new ModelRenderer(this, 0, 0); - bar[i].addBox(0F, 2F, -7F, 3, 2, 7); - bar[i].setRotationPoint(xCoord, yCoord, zCoord); - bar[i].setTextureSize(64, 32); - setRotation(bar[i], 0F, 0F, 0F); - ++i; + bar[i] = new ModelRenderer(this, 0, 0); + bar[i].addBox(0F, 2F, -7F, 3, 2, 7); + bar[i].setRotationPoint(xCoord, yCoord, zCoord); + bar[i].setTextureSize(64, 32); + setRotation(bar[i], 0F, 0F, 0F); + ++i; - bar[i] = new ModelRenderer(this, 0, 0); - bar[i].addBox(4F, 2F, -7F, 3, 2, 7); - bar[i].setRotationPoint(xCoord, yCoord, zCoord); - bar[i].setTextureSize(64, 32); - setRotation(bar[i], 0F, 0F, 0F); - ++i; + bar[i] = new ModelRenderer(this, 0, 0); + bar[i].addBox(4F, 2F, -7F, 3, 2, 7); + bar[i].setRotationPoint(xCoord, yCoord, zCoord); + bar[i].setTextureSize(64, 32); + setRotation(bar[i], 0F, 0F, 0F); + ++i; - bar[i] = new ModelRenderer(this, 0, 0); - bar[i].addBox(-3F, 0F, -7F, 3, 2, 7); - bar[i].setRotationPoint(xCoord, yCoord, zCoord); - bar[i].setTextureSize(64, 32); - setRotation(bar[i], 0F, -1.570796F, 0F); - ++i; + bar[i] = new ModelRenderer(this, 0, 0); + bar[i].addBox(-3F, 0F, -7F, 3, 2, 7); + bar[i].setRotationPoint(xCoord, yCoord, zCoord); + bar[i].setTextureSize(64, 32); + setRotation(bar[i], 0F, -1.570796F, 0F); + ++i; - bar[i] = new ModelRenderer(this, 0, 0); - bar[i].addBox(-7F, 0F, -7F, 3, 2, 7); - bar[i].setRotationPoint(xCoord, yCoord, zCoord); - bar[i].setTextureSize(64, 32); - setRotation(bar[i], 0F, -1.570796F, 0F); - ++i; - } - } - } + bar[i] = new ModelRenderer(this, 0, 0); + bar[i].addBox(-7F, 0F, -7F, 3, 2, 7); + bar[i].setRotationPoint(xCoord, yCoord, zCoord); + bar[i].setTextureSize(64, 32); + setRotation(bar[i], 0F, -1.570796F, 0F); + ++i; + } + } + } - } + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void render(int stackSize, float f) { - for (int i = 0; i < stackSize; i++) { - bar[i].render(f); - } - } + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { + bar[i].render(f); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelBigPlateStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelBigPlateStack.java index 5d24b929..fdf05c69 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelBigPlateStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelBigPlateStack.java @@ -4,70 +4,70 @@ import net.minecraft.client.model.ModelRenderer; public class ModelBigPlateStack extends ModelBase { - private ModelRenderer[] sheet = new ModelRenderer[8]; + private ModelRenderer[] sheet = new ModelRenderer[8]; - public ModelBigPlateStack() { - textureWidth = 64; - textureHeight = 16; + public ModelBigPlateStack() { + textureWidth = 64; + textureHeight = 16; - sheet[0] = new ModelRenderer(this, 0, 0); - sheet[0].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); - sheet[0].setRotationPoint(0F, 14F, 0F); - sheet[0].setTextureSize(64, 16); - setRotation(sheet[0], 0F, 0F, 0F); + sheet[0] = new ModelRenderer(this, 0, 0); + sheet[0].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); + sheet[0].setRotationPoint(0F, 14F, 0F); + sheet[0].setTextureSize(64, 16); + setRotation(sheet[0], 0F, 0F, 0F); - sheet[1] = new ModelRenderer(this, 0, 0); - sheet[1].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); - sheet[1].setRotationPoint(0F, 12F, 0F); - sheet[1].setTextureSize(64, 16); - setRotation(sheet[1], 0F, 0.0349066F, 0F); + sheet[1] = new ModelRenderer(this, 0, 0); + sheet[1].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); + sheet[1].setRotationPoint(0F, 12F, 0F); + sheet[1].setTextureSize(64, 16); + setRotation(sheet[1], 0F, 0.0349066F, 0F); - sheet[2] = new ModelRenderer(this, 0, 0); - sheet[2].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); - sheet[2].setRotationPoint(0F, 10F, 0F); - sheet[2].setTextureSize(64, 16); - setRotation(sheet[2], 0F, -0.0349066F, 0F); + sheet[2] = new ModelRenderer(this, 0, 0); + sheet[2].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); + sheet[2].setRotationPoint(0F, 10F, 0F); + sheet[2].setTextureSize(64, 16); + setRotation(sheet[2], 0F, -0.0349066F, 0F); - sheet[3] = new ModelRenderer(this, 0, 0); - sheet[3].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); - sheet[3].setRotationPoint(0F, 8F, 0F); - sheet[3].setTextureSize(64, 16); - setRotation(sheet[3], 0F, 0.1047198F, 0F); + sheet[3] = new ModelRenderer(this, 0, 0); + sheet[3].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); + sheet[3].setRotationPoint(0F, 8F, 0F); + sheet[3].setTextureSize(64, 16); + setRotation(sheet[3], 0F, 0.1047198F, 0F); - sheet[4] = new ModelRenderer(this, 0, 0); - sheet[4].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); - sheet[4].setRotationPoint(0F, 6F, 0F); - sheet[4].setTextureSize(64, 16); - setRotation(sheet[4], 0F, 0F, 0F); + sheet[4] = new ModelRenderer(this, 0, 0); + sheet[4].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); + sheet[4].setRotationPoint(0F, 6F, 0F); + sheet[4].setTextureSize(64, 16); + setRotation(sheet[4], 0F, 0F, 0F); - sheet[5] = new ModelRenderer(this, 0, 0); - sheet[5].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); - sheet[5].setRotationPoint(0F, 4F, 0F); - sheet[5].setTextureSize(64, 16); - setRotation(sheet[5], 0F, -0.0872665F, 0F); + sheet[5] = new ModelRenderer(this, 0, 0); + sheet[5].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); + sheet[5].setRotationPoint(0F, 4F, 0F); + sheet[5].setTextureSize(64, 16); + setRotation(sheet[5], 0F, -0.0872665F, 0F); - sheet[6] = new ModelRenderer(this, 0, 0); - sheet[6].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); - sheet[6].setRotationPoint(0F, 2F, 0F); - sheet[6].setTextureSize(64, 16); - setRotation(sheet[6], 0F, 0.0174533F, 0F); + sheet[6] = new ModelRenderer(this, 0, 0); + sheet[6].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); + sheet[6].setRotationPoint(0F, 2F, 0F); + sheet[6].setTextureSize(64, 16); + setRotation(sheet[6], 0F, 0.0174533F, 0F); - sheet[7] = new ModelRenderer(this, 0, 0); - sheet[7].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); - sheet[7].setRotationPoint(0F, 0F, 0F); - sheet[7].setTextureSize(64, 16); - setRotation(sheet[7], 0F, 0.0698132F, 0F); - } + sheet[7] = new ModelRenderer(this, 0, 0); + sheet[7].addBox(-6.5F, 0F, -6.5F, 13, 2, 13); + sheet[7].setRotationPoint(0F, 0F, 0F); + sheet[7].setTextureSize(64, 16); + setRotation(sheet[7], 0F, 0.0698132F, 0F); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void render(int stackSize, float f) { - for (int i = 0; i < stackSize; i++) { - sheet[i].render(f); - } - } + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { + sheet[i].render(f); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelJugStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelJugStack.java index a4daf497..a84448e6 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelJugStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelJugStack.java @@ -4,44 +4,44 @@ import net.minecraft.client.model.ModelRenderer; public class ModelJugStack extends ModelBase { - private ModelRenderer[] jug = new ModelRenderer[32]; - - public ModelJugStack() { - textureWidth = 32; - textureHeight = 16; - int i = 0; - for (int y = 0; y < 2; y++) { - for (int z = 0; z < 4; z++) { - for (int x = 0; x < 4; x++) { - float xCoord = -8F + (x * 4F); - float yCoord = 8F - (y * 8F); - float zCoord = 8F - (z * 4F); - - jug[i] = new ModelRenderer(this, 0, 4); - jug[i].addBox(0F, 2F, -3F, 3, 6, 3); - jug[i].setTextureOffset(12, 0); - jug[i].addBox(1F, 1F, -2F, 3, 6, 1); - jug[i].setTextureOffset(0, 0); - jug[i].addBox(0.5F, 0F, -2.5F, 2, 2, 2); - - jug[i].setRotationPoint(xCoord, yCoord, zCoord); - jug[i].setTextureSize(31, 16); - ++i; - } - } - } - - } - - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - public void render(int stackSize, float f) { - for (int i = 0; i < stackSize; i++) { - jug[i].render(f); - } - } + private ModelRenderer[] jug = new ModelRenderer[32]; + + public ModelJugStack() { + textureWidth = 32; + textureHeight = 16; + int i = 0; + for (int y = 0; y < 2; y++) { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 4; x++) { + float xCoord = -8F + (x * 4F); + float yCoord = 8F - (y * 8F); + float zCoord = 8F - (z * 4F); + + jug[i] = new ModelRenderer(this, 0, 4); + jug[i].addBox(0F, 2F, -3F, 3, 6, 3); + jug[i].setTextureOffset(12, 0); + jug[i].addBox(1F, 1F, -2F, 3, 6, 1); + jug[i].setTextureOffset(0, 0); + jug[i].addBox(0.5F, 0F, -2.5F, 2, 2, 2); + + jug[i].setRotationPoint(xCoord, yCoord, zCoord); + jug[i].setTextureSize(31, 16); + ++i; + } + } + } + + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { + jug[i].render(f); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelPlankStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelPlankStack.java index 99e1a641..f8353e11 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelPlankStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelPlankStack.java @@ -4,41 +4,41 @@ import net.minecraft.client.model.ModelRenderer; public class ModelPlankStack extends ModelBase { - private ModelRenderer[] plank = new ModelRenderer[64]; + private ModelRenderer[] plank = new ModelRenderer[64]; - public ModelPlankStack() { - textureWidth = 32; - textureHeight = 32; - int i = 0; - for (int y = 0; y < 16; y++) { - for (int x = 0; x < 4; x++) { - float xCoord = -8F + x * 4F; - float yCoord = 15F - y; - float zCoord = 8F; - if (y % 2 == 0) { - xCoord += 1F; - } + public ModelPlankStack() { + textureWidth = 32; + textureHeight = 32; + int i = 0; + for (int y = 0; y < 16; y++) { + for (int x = 0; x < 4; x++) { + float xCoord = -8F + x * 4F; + float yCoord = 15F - y; + float zCoord = 8F; + if (y % 2 == 0) { + xCoord += 1F; + } - plank[i] = new ModelRenderer(this, 0, 0); - plank[i].addBox(0F, 0F, 0F, 3, 16, 1); - plank[i].setRotationPoint(xCoord, yCoord, zCoord); - plank[i].setTextureSize(32, 32); - setRotation(plank[i], -1.570796F, 0F, 0F); - ++i; - } - } + plank[i] = new ModelRenderer(this, 0, 0); + plank[i].addBox(0F, 0F, 0F, 3, 16, 1); + plank[i].setRotationPoint(xCoord, yCoord, zCoord); + plank[i].setTextureSize(32, 32); + setRotation(plank[i], -1.570796F, 0F, 0F); + ++i; + } + } - } + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void render(int stackSize, float f) { - for (int i = 0; i < stackSize; i++) { - plank[i].render(f); - } - } + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { + plank[i].render(f); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelPotStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelPotStack.java index 752905d9..530ab8e3 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelPotStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelPotStack.java @@ -4,41 +4,41 @@ import net.minecraft.client.model.ModelRenderer; public class ModelPotStack extends ModelBase { - private ModelRenderer[] pot = new ModelRenderer[64]; + private ModelRenderer[] pot = new ModelRenderer[64]; - public ModelPotStack() { - textureWidth = 16; - textureHeight = 8; - int i = 0; - for (int y = 0; y < 4; y++) { - for (int z = 0; z < 4; z++) { - for (int x = 0; x < 4; x++) { - float xCoord = -8F + (x * 4F); - float yCoord = 12F - (y * 4F); - float zCoord = 8F - (z * 4F); + public ModelPotStack() { + textureWidth = 16; + textureHeight = 8; + int i = 0; + for (int y = 0; y < 4; y++) { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 4; x++) { + float xCoord = -8F + (x * 4F); + float yCoord = 12F - (y * 4F); + float zCoord = 8F - (z * 4F); - pot[i] = new ModelRenderer(this, 0, 0); - pot[i].addBox(0F, 0F, -4F, 4, 4, 4); - pot[i].setRotationPoint(xCoord, yCoord, zCoord); - pot[i].setTextureSize(64, 32); - pot[i].mirror = true; - setRotation(pot[i], 0F, 0F, 0F); - ++i; - } - } - } + pot[i] = new ModelRenderer(this, 0, 0); + pot[i].addBox(0F, 0F, -4F, 4, 4, 4); + pot[i].setRotationPoint(xCoord, yCoord, zCoord); + pot[i].setTextureSize(64, 32); + pot[i].mirror = true; + setRotation(pot[i], 0F, 0F, 0F); + ++i; + } + } + } - } + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void render(int stackSize, float f) { - for (int i = 0; i < stackSize; i++) { - pot[i].render(f); - } - } + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { + pot[i].render(f); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/ModelSheetStack.java b/src/main/java/minefantasy/mf2/client/render/block/component/ModelSheetStack.java index 9b210f42..75d6f294 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/ModelSheetStack.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/ModelSheetStack.java @@ -4,105 +4,105 @@ import net.minecraft.client.model.ModelRenderer; public class ModelSheetStack extends ModelBase { - private ModelRenderer[] sheet = new ModelRenderer[16]; + private ModelRenderer[] sheet = new ModelRenderer[16]; - public ModelSheetStack() { - textureWidth = 64; - textureHeight = 16; + public ModelSheetStack() { + textureWidth = 64; + textureHeight = 16; - sheet[0] = new ModelRenderer(this, 0, 0); - sheet[0].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[0].setRotationPoint(0F, 15F, 0F); - sheet[0].setTextureSize(64, 16); + sheet[0] = new ModelRenderer(this, 0, 0); + sheet[0].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[0].setRotationPoint(0F, 15F, 0F); + sheet[0].setTextureSize(64, 16); - setRotation(sheet[0], 0F, 0F, 0F); - sheet[1] = new ModelRenderer(this, 0, 0); - sheet[1].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[1].setRotationPoint(0F, 14F, 0F); - sheet[1].setTextureSize(64, 16); + setRotation(sheet[0], 0F, 0F, 0F); + sheet[1] = new ModelRenderer(this, 0, 0); + sheet[1].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[1].setRotationPoint(0F, 14F, 0F); + sheet[1].setTextureSize(64, 16); - setRotation(sheet[1], 0F, -0.122173F, 0F); - sheet[2] = new ModelRenderer(this, 0, 0); - sheet[2].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[2].setRotationPoint(0F, 13F, 0F); - sheet[2].setTextureSize(64, 16); - setRotation(sheet[2], 0F, 0F, 0F); - sheet[3] = new ModelRenderer(this, 0, 0); - sheet[3].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[3].setRotationPoint(0F, 12F, 0F); - sheet[3].setTextureSize(64, 16); - setRotation(sheet[3], 0F, 0.1047198F, 0F); - sheet[4] = new ModelRenderer(this, 0, 0); - sheet[4].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[4].setRotationPoint(0F, 11F, 0F); - sheet[4].setTextureSize(64, 16); - setRotation(sheet[4], 0F, 0F, 0F); - sheet[5] = new ModelRenderer(this, 0, 0); - sheet[5].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[5].setRotationPoint(0F, 10F, 0F); - sheet[5].setTextureSize(64, 16); - setRotation(sheet[5], 0F, -0.0698132F, 0F); - sheet[6] = new ModelRenderer(this, 0, 0); - sheet[6].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[6].setRotationPoint(0F, 9F, 0F); - sheet[6].setTextureSize(64, 16); - setRotation(sheet[6], 0F, 0.0174533F, 0F); - sheet[7] = new ModelRenderer(this, 0, 0); - sheet[7].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[7].setRotationPoint(0F, 8F, 0F); - sheet[7].setTextureSize(64, 16); - setRotation(sheet[7], 0F, 0.122173F, 0F); - sheet[8] = new ModelRenderer(this, 0, 0); - sheet[8].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[8].setRotationPoint(0F, 7F, 0F); - sheet[8].setTextureSize(64, 16); - setRotation(sheet[8], 0F, 0.0349066F, 0F); - sheet[9] = new ModelRenderer(this, 0, 0); - sheet[9].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[9].setRotationPoint(0F, 6F, 0F); - sheet[9].setTextureSize(64, 16); - setRotation(sheet[9], 0F, -0.0523599F, 0F); - sheet[10] = new ModelRenderer(this, 0, 0); - sheet[10].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[10].setRotationPoint(0F, 5F, 0F); - sheet[10].setTextureSize(64, 16); - setRotation(sheet[10], 0F, 0F, 0F); - sheet[11] = new ModelRenderer(this, 0, 0); - sheet[11].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[11].setRotationPoint(0F, 4F, 0F); - sheet[11].setTextureSize(64, 16); - setRotation(sheet[11], 0F, -0.0523599F, 0F); - sheet[12] = new ModelRenderer(this, 0, 0); - sheet[12].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[12].setRotationPoint(0F, 3F, 0F); - sheet[12].setTextureSize(64, 16); - setRotation(sheet[12], 0F, 0.0349066F, 0F); - sheet[13] = new ModelRenderer(this, 0, 0); - sheet[13].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[13].setRotationPoint(0F, 2F, 0F); - sheet[13].setTextureSize(64, 16); - setRotation(sheet[13], 0F, -0.0349066F, 0F); - sheet[14] = new ModelRenderer(this, 0, 0); - sheet[14].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[14].setRotationPoint(0F, 1F, 0F); - sheet[14].setTextureSize(64, 16); - setRotation(sheet[14], 0F, -0.122173F, 0F); - sheet[15] = new ModelRenderer(this, 0, 0); - sheet[15].addBox(-7F, 0F, -7F, 14, 1, 14); - sheet[15].setRotationPoint(0F, 0F, 0F); - sheet[15].setTextureSize(64, 16); - setRotation(sheet[15], 0F, 0F, 0F); - } + setRotation(sheet[1], 0F, -0.122173F, 0F); + sheet[2] = new ModelRenderer(this, 0, 0); + sheet[2].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[2].setRotationPoint(0F, 13F, 0F); + sheet[2].setTextureSize(64, 16); + setRotation(sheet[2], 0F, 0F, 0F); + sheet[3] = new ModelRenderer(this, 0, 0); + sheet[3].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[3].setRotationPoint(0F, 12F, 0F); + sheet[3].setTextureSize(64, 16); + setRotation(sheet[3], 0F, 0.1047198F, 0F); + sheet[4] = new ModelRenderer(this, 0, 0); + sheet[4].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[4].setRotationPoint(0F, 11F, 0F); + sheet[4].setTextureSize(64, 16); + setRotation(sheet[4], 0F, 0F, 0F); + sheet[5] = new ModelRenderer(this, 0, 0); + sheet[5].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[5].setRotationPoint(0F, 10F, 0F); + sheet[5].setTextureSize(64, 16); + setRotation(sheet[5], 0F, -0.0698132F, 0F); + sheet[6] = new ModelRenderer(this, 0, 0); + sheet[6].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[6].setRotationPoint(0F, 9F, 0F); + sheet[6].setTextureSize(64, 16); + setRotation(sheet[6], 0F, 0.0174533F, 0F); + sheet[7] = new ModelRenderer(this, 0, 0); + sheet[7].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[7].setRotationPoint(0F, 8F, 0F); + sheet[7].setTextureSize(64, 16); + setRotation(sheet[7], 0F, 0.122173F, 0F); + sheet[8] = new ModelRenderer(this, 0, 0); + sheet[8].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[8].setRotationPoint(0F, 7F, 0F); + sheet[8].setTextureSize(64, 16); + setRotation(sheet[8], 0F, 0.0349066F, 0F); + sheet[9] = new ModelRenderer(this, 0, 0); + sheet[9].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[9].setRotationPoint(0F, 6F, 0F); + sheet[9].setTextureSize(64, 16); + setRotation(sheet[9], 0F, -0.0523599F, 0F); + sheet[10] = new ModelRenderer(this, 0, 0); + sheet[10].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[10].setRotationPoint(0F, 5F, 0F); + sheet[10].setTextureSize(64, 16); + setRotation(sheet[10], 0F, 0F, 0F); + sheet[11] = new ModelRenderer(this, 0, 0); + sheet[11].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[11].setRotationPoint(0F, 4F, 0F); + sheet[11].setTextureSize(64, 16); + setRotation(sheet[11], 0F, -0.0523599F, 0F); + sheet[12] = new ModelRenderer(this, 0, 0); + sheet[12].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[12].setRotationPoint(0F, 3F, 0F); + sheet[12].setTextureSize(64, 16); + setRotation(sheet[12], 0F, 0.0349066F, 0F); + sheet[13] = new ModelRenderer(this, 0, 0); + sheet[13].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[13].setRotationPoint(0F, 2F, 0F); + sheet[13].setTextureSize(64, 16); + setRotation(sheet[13], 0F, -0.0349066F, 0F); + sheet[14] = new ModelRenderer(this, 0, 0); + sheet[14].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[14].setRotationPoint(0F, 1F, 0F); + sheet[14].setTextureSize(64, 16); + setRotation(sheet[14], 0F, -0.122173F, 0F); + sheet[15] = new ModelRenderer(this, 0, 0); + sheet[15].addBox(-7F, 0F, -7F, 14, 1, 14); + sheet[15].setRotationPoint(0F, 0F, 0F); + sheet[15].setTextureSize(64, 16); + setRotation(sheet[15], 0F, 0F, 0F); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void render(int stackSize, float f) { - for (int i = 0; i < stackSize; i++) { - sheet[i].render(f); - } - } + public void render(int stackSize, float f) { + for (int i = 0; i < stackSize; i++) { + sheet[i].render(f); + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/block/component/TileEntityComponentRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/component/TileEntityComponentRenderer.java index ac0a60ea..a85ff90a 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/component/TileEntityComponentRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/component/TileEntityComponentRenderer.java @@ -1,92 +1,91 @@ package minefantasy.mf2.client.render.block.component; -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.tileentity.TileEntityComponent; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; public class TileEntityComponentRenderer extends TileEntitySpecialRenderer { - private ModelBarStack bars; - private ModelSheetStack sheets; - private ModelPlankStack planks; - private ModelPotStack pots; - private ModelBigPlateStack bigplates; - private ModelJugStack jugs; - - public TileEntityComponentRenderer() { - this.bars = new ModelBarStack(); - this.sheets = new ModelSheetStack(); - this.planks = new ModelPlankStack(); - this.pots = new ModelPotStack(); - this.bigplates = new ModelBigPlateStack(); - this.jugs = new ModelJugStack(); - } - - public void renderModelAt(TileEntityComponent tile, double d, double d1, double d2, float f) { - if (tile.item != null) { - int i = tile.getBlockMetadata(); - - int j = 180 + (-90 * i); - - GL11.glPushMatrix(); // start - float scale = 1.0F; - float yOffset = 1.0F; - GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size - GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata - GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens - GL11.glPushMatrix(); - float level = 0F; - - CustomMaterial material = tile.material; - if (material != null) { - GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, - material.colourRGB[2] / 255F); - } - - bindTextureByName("textures/models/object/component/placed_" + tile.tex + ".png"); // texture - render(tile.type, tile.stackSize, 0.0625F); - - GL11.glColor3f(1F, 1F, 1F); - - GL11.glPopMatrix(); - GL11.glColor3f(1F, 1F, 1F); - GL11.glPopMatrix(); // end - } - - } - - private void render(String type, int stackSize, float f) { - if (type.equalsIgnoreCase("bar")) { - bars.render(stackSize, f); - } - if (type.equalsIgnoreCase("sheet")) { - sheets.render(stackSize, f); - } - if (type.equalsIgnoreCase("plank")) { - planks.render(stackSize, f); - } - if (type.equalsIgnoreCase("pot")) { - pots.render(stackSize, f); - } - if (type.equalsIgnoreCase("bigplate")) { - bigplates.render(stackSize, f); - } - if (type.equalsIgnoreCase("jug")) { - jugs.render(stackSize, f); - } - } - - private void bindTextureByName(String image) { - Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); - } - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderModelAt((TileEntityComponent) tileentity, d, d1, d2, f); // where to render - } + private ModelBarStack bars; + private ModelSheetStack sheets; + private ModelPlankStack planks; + private ModelPotStack pots; + private ModelBigPlateStack bigplates; + private ModelJugStack jugs; + + public TileEntityComponentRenderer() { + this.bars = new ModelBarStack(); + this.sheets = new ModelSheetStack(); + this.planks = new ModelPlankStack(); + this.pots = new ModelPotStack(); + this.bigplates = new ModelBigPlateStack(); + this.jugs = new ModelJugStack(); + } + + public void renderModelAt(TileEntityComponent tile, double d, double d1, double d2, float f) { + if (tile.item != null) { + int i = tile.getBlockMetadata(); + + int j = 180 + (-90 * i); + + GL11.glPushMatrix(); // start + float scale = 1.0F; + float yOffset = 1.0F; + GL11.glTranslatef((float) d + 0.5F, (float) d1 + yOffset, (float) d2 + 0.5F); // size + GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata + GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens + GL11.glPushMatrix(); + float level = 0F; + + CustomMaterial material = tile.material; + if (material != null) { + GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, + material.colourRGB[2] / 255F); + } + + bindTextureByName("textures/models/object/component/placed_" + tile.tex + ".png"); // texture + render(tile.type, tile.stackSize, 0.0625F); + + GL11.glColor3f(1F, 1F, 1F); + + GL11.glPopMatrix(); + GL11.glColor3f(1F, 1F, 1F); + GL11.glPopMatrix(); // end + } + + } + + private void render(String type, int stackSize, float f) { + if (type.equalsIgnoreCase("bar")) { + bars.render(stackSize, f); + } + if (type.equalsIgnoreCase("sheet")) { + sheets.render(stackSize, f); + } + if (type.equalsIgnoreCase("plank")) { + planks.render(stackSize, f); + } + if (type.equalsIgnoreCase("pot")) { + pots.render(stackSize, f); + } + if (type.equalsIgnoreCase("bigplate")) { + bigplates.render(stackSize, f); + } + if (type.equalsIgnoreCase("jug")) { + jugs.render(stackSize, f); + } + } + + private void bindTextureByName(String image) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureHelperMF.getResource(image)); + } + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { + renderModelAt((TileEntityComponent) tileentity, d, d1, d2, f); // where to render + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelAshDragon.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelAshDragon.java index 8bfec043..85047faa 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelAshDragon.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelAshDragon.java @@ -7,897 +7,897 @@ import net.minecraft.util.MathHelper; public class ModelAshDragon extends ModelBase { - public ModelRenderer Bodyfront; - public ModelRenderer Tail1; - public ModelRenderer Neck1; - public ModelRenderer Wingshoulderright; - public ModelRenderer Wingshoulderleft; - public ModelRenderer shape122; - public ModelRenderer shape124; - public ModelRenderer shape127; - public ModelRenderer shape144; - public ModelRenderer shape153; - public ModelRenderer shape145; - public ModelRenderer shape146; - public ModelRenderer shape147; - public ModelRenderer shape148; - public ModelRenderer shape149; - public ModelRenderer Tail2; - public ModelRenderer ThighR; - public ModelRenderer ThighL; - public ModelRenderer shape134; - public ModelRenderer shape136; - public ModelRenderer shape138; - public ModelRenderer shape150; - public ModelRenderer shape151; - public ModelRenderer shape152; - public ModelRenderer shape154; - public ModelRenderer shape155; - public ModelRenderer Tail3; - public ModelRenderer shape140; - public ModelRenderer shape142; - public ModelRenderer Tail4; - public ModelRenderer shape143; - public ModelRenderer Tail5; - public ModelRenderer Tail7; - public ModelRenderer Tail8; - public ModelRenderer RTailSpike; - public ModelRenderer LTailSpike; - public ModelRenderer RTailMembrane; - public ModelRenderer LTailMembrane; - public ModelRenderer shape141; - public ModelRenderer ShinR; - public ModelRenderer FootR; - public ModelRenderer MidtoeR1; - public ModelRenderer RighttoeR1; - public ModelRenderer LefttoeR1; - public ModelRenderer MidtoeR2; - public ModelRenderer RighttoeR2; - public ModelRenderer LefttoeR2; - public ModelRenderer ShinL; - public ModelRenderer FootL; - public ModelRenderer MidtoeL1; - public ModelRenderer LefttoeL1; - public ModelRenderer RighttoeL1; - public ModelRenderer MidtoeL2; - public ModelRenderer LefttoeL2; - public ModelRenderer RighttoeL2; - public ModelRenderer shape135; - public ModelRenderer shape137; - public ModelRenderer shape139; - public ModelRenderer Neck2; - public ModelRenderer Neck3; - public ModelRenderer Head1; - public ModelRenderer Headtop; - public ModelRenderer Mouthback_MOVE_TO_OPEN; - public ModelRenderer HornbaseR; - public ModelRenderer HornbaseL; - public ModelRenderer Headmidhornlowerright; - public ModelRenderer Headmidhornlowerleft; - public ModelRenderer BrowfrontR; - public ModelRenderer BrowfrontL; - public ModelRenderer Upperjaw; - public ModelRenderer shape113; - public ModelRenderer ToothR4; - public ModelRenderer ToothL4; - public ModelRenderer ToothR3; - public ModelRenderer ToothL3; - public ModelRenderer ToothR2; - public ModelRenderer ToothL2; - public ModelRenderer ToothR1; - public ModelRenderer ToothL1; - public ModelRenderer shape114; - public ModelRenderer shape115; - public ModelRenderer Lowerjawback; - public ModelRenderer Lowerjaw; - public ModelRenderer Underlowerjaw2; - public ModelRenderer Underlowerjaw; - public ModelRenderer ToothlowerR3; - public ModelRenderer ToothlowerR3_1; - public ModelRenderer ToothlowerR2; - public ModelRenderer ToothlowerL2; - public ModelRenderer ToothlowerR1; - public ModelRenderer ToothlowerL1; - public ModelRenderer Underlowerjaw3; - public ModelRenderer shape108; - public ModelRenderer HornmidR; - public ModelRenderer HornendR; - public ModelRenderer HornmidL; - public ModelRenderer HornendL; - public ModelRenderer Headmidhornupperright; - public ModelRenderer Headmidhornupperleft; - public ModelRenderer RBrowback; - public ModelRenderer BrowbackL; - public ModelRenderer Wingupperarmright; - public ModelRenderer Winglowerarmright; - public ModelRenderer Wingmembramesmallright; - public ModelRenderer Wingfinger1right; - public ModelRenderer Wingmembramemidright; - public ModelRenderer Rfinger1; - public ModelRenderer Wingfinger2right; - public ModelRenderer Wingfinger3right; - public ModelRenderer Wingfingerlower1right; - public ModelRenderer Wingmembramelargeright1; - public ModelRenderer Wingfingerlower2right; - public ModelRenderer Wingfingerlower3right; - public ModelRenderer Wingmembramelargeright2; - public ModelRenderer Rfinger2; - public ModelRenderer Wingupperarmleft; - public ModelRenderer Winglowerarmleft; - public ModelRenderer Wingmembramesmallleft; - public ModelRenderer Wingfinger1left; - public ModelRenderer Wingmembramemidleft; - public ModelRenderer Lfinger1; - public ModelRenderer Wingfingerlower1left; - public ModelRenderer Wingfinger2left; - public ModelRenderer Wingfinger3left; - public ModelRenderer Wingmembramelargeleft1; - public ModelRenderer Wingmembramelargeleft2; - public ModelRenderer Wingfingerlower2left; - public ModelRenderer Wingfingerlower3left; - public ModelRenderer Lfinger2; - public ModelRenderer shape123; - public ModelRenderer shape125; - public ModelRenderer shape126; - public ModelRenderer shape128; - public ModelRenderer shape129; + public ModelRenderer Bodyfront; + public ModelRenderer Tail1; + public ModelRenderer Neck1; + public ModelRenderer Wingshoulderright; + public ModelRenderer Wingshoulderleft; + public ModelRenderer shape122; + public ModelRenderer shape124; + public ModelRenderer shape127; + public ModelRenderer shape144; + public ModelRenderer shape153; + public ModelRenderer shape145; + public ModelRenderer shape146; + public ModelRenderer shape147; + public ModelRenderer shape148; + public ModelRenderer shape149; + public ModelRenderer Tail2; + public ModelRenderer ThighR; + public ModelRenderer ThighL; + public ModelRenderer shape134; + public ModelRenderer shape136; + public ModelRenderer shape138; + public ModelRenderer shape150; + public ModelRenderer shape151; + public ModelRenderer shape152; + public ModelRenderer shape154; + public ModelRenderer shape155; + public ModelRenderer Tail3; + public ModelRenderer shape140; + public ModelRenderer shape142; + public ModelRenderer Tail4; + public ModelRenderer shape143; + public ModelRenderer Tail5; + public ModelRenderer Tail7; + public ModelRenderer Tail8; + public ModelRenderer RTailSpike; + public ModelRenderer LTailSpike; + public ModelRenderer RTailMembrane; + public ModelRenderer LTailMembrane; + public ModelRenderer shape141; + public ModelRenderer ShinR; + public ModelRenderer FootR; + public ModelRenderer MidtoeR1; + public ModelRenderer RighttoeR1; + public ModelRenderer LefttoeR1; + public ModelRenderer MidtoeR2; + public ModelRenderer RighttoeR2; + public ModelRenderer LefttoeR2; + public ModelRenderer ShinL; + public ModelRenderer FootL; + public ModelRenderer MidtoeL1; + public ModelRenderer LefttoeL1; + public ModelRenderer RighttoeL1; + public ModelRenderer MidtoeL2; + public ModelRenderer LefttoeL2; + public ModelRenderer RighttoeL2; + public ModelRenderer shape135; + public ModelRenderer shape137; + public ModelRenderer shape139; + public ModelRenderer Neck2; + public ModelRenderer Neck3; + public ModelRenderer Head1; + public ModelRenderer Headtop; + public ModelRenderer Mouthback_MOVE_TO_OPEN; + public ModelRenderer HornbaseR; + public ModelRenderer HornbaseL; + public ModelRenderer Headmidhornlowerright; + public ModelRenderer Headmidhornlowerleft; + public ModelRenderer BrowfrontR; + public ModelRenderer BrowfrontL; + public ModelRenderer Upperjaw; + public ModelRenderer shape113; + public ModelRenderer ToothR4; + public ModelRenderer ToothL4; + public ModelRenderer ToothR3; + public ModelRenderer ToothL3; + public ModelRenderer ToothR2; + public ModelRenderer ToothL2; + public ModelRenderer ToothR1; + public ModelRenderer ToothL1; + public ModelRenderer shape114; + public ModelRenderer shape115; + public ModelRenderer Lowerjawback; + public ModelRenderer Lowerjaw; + public ModelRenderer Underlowerjaw2; + public ModelRenderer Underlowerjaw; + public ModelRenderer ToothlowerR3; + public ModelRenderer ToothlowerR3_1; + public ModelRenderer ToothlowerR2; + public ModelRenderer ToothlowerL2; + public ModelRenderer ToothlowerR1; + public ModelRenderer ToothlowerL1; + public ModelRenderer Underlowerjaw3; + public ModelRenderer shape108; + public ModelRenderer HornmidR; + public ModelRenderer HornendR; + public ModelRenderer HornmidL; + public ModelRenderer HornendL; + public ModelRenderer Headmidhornupperright; + public ModelRenderer Headmidhornupperleft; + public ModelRenderer RBrowback; + public ModelRenderer BrowbackL; + public ModelRenderer Wingupperarmright; + public ModelRenderer Winglowerarmright; + public ModelRenderer Wingmembramesmallright; + public ModelRenderer Wingfinger1right; + public ModelRenderer Wingmembramemidright; + public ModelRenderer Rfinger1; + public ModelRenderer Wingfinger2right; + public ModelRenderer Wingfinger3right; + public ModelRenderer Wingfingerlower1right; + public ModelRenderer Wingmembramelargeright1; + public ModelRenderer Wingfingerlower2right; + public ModelRenderer Wingfingerlower3right; + public ModelRenderer Wingmembramelargeright2; + public ModelRenderer Rfinger2; + public ModelRenderer Wingupperarmleft; + public ModelRenderer Winglowerarmleft; + public ModelRenderer Wingmembramesmallleft; + public ModelRenderer Wingfinger1left; + public ModelRenderer Wingmembramemidleft; + public ModelRenderer Lfinger1; + public ModelRenderer Wingfingerlower1left; + public ModelRenderer Wingfinger2left; + public ModelRenderer Wingfinger3left; + public ModelRenderer Wingmembramelargeleft1; + public ModelRenderer Wingmembramelargeleft2; + public ModelRenderer Wingfingerlower2left; + public ModelRenderer Wingfingerlower3left; + public ModelRenderer Lfinger2; + public ModelRenderer shape123; + public ModelRenderer shape125; + public ModelRenderer shape126; + public ModelRenderer shape128; + public ModelRenderer shape129; - public ModelAshDragon() { - this.textureWidth = 512; - this.textureHeight = 512; - this.Wingshoulderleft = new ModelRenderer(this, 470, 230); - this.Wingshoulderleft.setRotationPoint(3.0F, 4.0F, 4.0F); - this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderleft, 0.5009094953223726F, 0.27314402793711257F, 0.6829473363053812F); - this.ToothlowerR3_1 = new ModelRenderer(this, 50, 420); - this.ToothlowerR3_1.setRotationPoint(2.5F, 0.0F, -6.9F); - this.ToothlowerR3_1.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerR3_1, 0.18203784098300857F, 0.0F, 0.31869712141416456F); - this.FootL = new ModelRenderer(this, 180, 190); - this.FootL.mirror = true; - this.FootL.setRotationPoint(-0.01F, 12.0F, 6.0F); - this.FootL.addBox(-4.0F, 0.0F, -5.0F, 4, 9, 5, 0.0F); - this.setRotateAngle(FootL, -0.7838273670706533F, 0.0F, 0.0F); - this.Neck3 = new ModelRenderer(this, 5, 320); - this.Neck3.setRotationPoint(0.0F, 0.5F, -6.0F); - this.Neck3.addBox(-2.5F, 0.0F, -5.0F, 5, 9, 9, 0.0F); - this.setRotateAngle(Neck3, 0.136659280431156F, 0.0F, 0.0F); - this.shape108 = new ModelRenderer(this, 125, 165); - this.shape108.setRotationPoint(0.0F, 0.8F, -5.8F); - this.shape108.addBox(-2.0F, -1.0F, -2.0F, 4, 1, 2, 0.0F); - this.setRotateAngle(shape108, -0.16179202165987433F, 0.0F, 0.0F); - this.RighttoeL2 = new ModelRenderer(this, 180, 170); - this.RighttoeL2.mirror = true; - this.RighttoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); - this.RighttoeL2.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(RighttoeL2, -0.36425021489121656F, 0.0F, 0.0F); - this.LTailMembrane = new ModelRenderer(this, 380, 250); - this.LTailMembrane.setRotationPoint(0.0F, 0.21F, 1.0F); - this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 7, 1, 15, 0.0F); - this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); - this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); - this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); - this.Wingmembramesmallright.addBox(-24.0F, 0.0F, 0.0F, 24, 0, 18, 0.0F); - this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); - this.shape144 = new ModelRenderer(this, 125, 175); - this.shape144.setRotationPoint(4.0F, 0.0F, 0.0F); - this.shape144.addBox(0.0F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape144, -0.36425021489121656F, 0.0F, 0.22759093446006054F); - this.shape152 = new ModelRenderer(this, 125, 175); - this.shape152.setRotationPoint(3.0F, 0.0F, 5.0F); - this.shape152.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(shape152, -0.136659280431156F, 0.136659280431156F, 0.18203784098300857F); - this.Headmidhornupperright = new ModelRenderer(this, 190, 430); - this.Headmidhornupperright.setRotationPoint(-1.0F, 0.1F, 4.9F); - this.Headmidhornupperright.addBox(0.0F, 0.0F, 0.0F, 2, 1, 6, 0.0F); - this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.22759093446006054F, 0.0F); - this.Lfinger1 = new ModelRenderer(this, 350, 140); - this.Lfinger1.setRotationPoint(24.0F, 2.0F, 3.0F); - this.Lfinger1.addBox(-2.0F, 0.0F, -5.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Lfinger1, 0.0F, -1.0016444577195458F, 0.0F); - this.shape150 = new ModelRenderer(this, 0, 0); - this.shape150.setRotationPoint(2.4F, 0.0F, 0.0F); - this.shape150.addBox(0.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); - this.setRotateAngle(shape150, -0.27314402793711257F, -0.136659280431156F, 0.18203784098300857F); - this.ToothR1 = new ModelRenderer(this, 50, 420); - this.ToothR1.setRotationPoint(-2.7F, 3.5F, -1.0F); - this.ToothR1.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothR1, 0.0F, 0.0F, 0.31869712141416456F); - this.ShinR = new ModelRenderer(this, 180, 210); - this.ShinR.setRotationPoint(0.7F, 13.0F, 0.0F); - this.ShinR.addBox(0.0F, 0.0F, 0.0F, 4, 12, 6, 0.0F); - this.setRotateAngle(ShinR, 1.0471975511965976F, 0.0F, -0.136659280431156F); - this.Lfinger2 = new ModelRenderer(this, 330, 140); - this.Lfinger2.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Lfinger2.addBox(-2.0F, 0.0F, -4.0F, 2, 2, 4, 0.0F); - this.setRotateAngle(Lfinger2, 0.40980330836826856F, 0.0F, 0.0F); - this.shape142 = new ModelRenderer(this, 125, 175); - this.shape142.setRotationPoint(0.0F, 0.0F, 12.0F); - this.shape142.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); - this.setRotateAngle(shape142, -0.5009094953223726F, 0.0F, 0.0F); - this.Wingmembramesmallleft = new ModelRenderer(this, 420, 280); - this.Wingmembramesmallleft.mirror = true; - this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); - this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 24, 0, 18, 0.0F); - this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); - this.Wingmembramelargeleft2 = new ModelRenderer(this, 355, 430); - this.Wingmembramelargeleft2.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeleft2.addBox(0.0F, 0.0F, 0.0F, 41, 0, 57, 0.0F); - this.ToothL3 = new ModelRenderer(this, 50, 420); - this.ToothL3.setRotationPoint(2.7F, 3.5F, -6.0F); - this.ToothL3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothL3, 0.0F, 0.0F, -0.31869712141416456F); - this.HornendL = new ModelRenderer(this, 50, 430); - this.HornendL.setRotationPoint(0.0F, 0.0F, 5.0F); - this.HornendL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 4, 0.0F); - this.setRotateAngle(HornendL, 0.0F, -0.27314402793711257F, 0.0F); - this.ThighL = new ModelRenderer(this, 180, 230); - this.ThighL.mirror = true; - this.ThighL.setRotationPoint(9.0F, 5.0F, 15.0F); - this.ThighL.addBox(-5.0F, 0.0F, 0.0F, 5, 13, 8, 0.0F); - this.setRotateAngle(ThighL, -0.4553564018453205F, 0.0F, -0.136659280431156F); - this.RighttoeR1 = new ModelRenderer(this, 180, 180); - this.RighttoeR1.setRotationPoint(1.8F, 6.0F, -4.0F); - this.RighttoeR1.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(RighttoeR1, -0.5462880558742251F, 0.40980330836826856F, 0.18203784098300857F); - this.Wingfinger1right = new ModelRenderer(this, 350, 200); - this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); - this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1right, 0.0F, 1.593485607070823F, 0.0F); - this.BrowfrontL = new ModelRenderer(this, 190, 390); - this.BrowfrontL.setRotationPoint(3.0F, 0.8F, -9.0F); - this.BrowfrontL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(BrowfrontL, 0.091106186954104F, 0.27314402793711257F, 0.0F); - this.Tail2 = new ModelRenderer(this, 5, 85); - this.Tail2.setRotationPoint(0.0F, 0.5F, 20.0F); - this.Tail2.addBox(-5.5F, 0.0F, 0.0F, 11, 12, 19, 0.0F); - this.setRotateAngle(Tail2, -0.091106186954104F, 0.0F, 0.0F); - this.shape143 = new ModelRenderer(this, 125, 175); - this.shape143.setRotationPoint(0.0F, 0.0F, 0.0F); - this.shape143.addBox(-0.5F, -3.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(shape143, -0.6373942428283291F, 0.0F, 0.0F); - this.ToothL4 = new ModelRenderer(this, 50, 420); - this.ToothL4.setRotationPoint(2.7F, 3.6F, -8.0F); - this.ToothL4.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothL4, -0.18203784098300857F, 0.0F, -0.31869712141416456F); - this.shape146 = new ModelRenderer(this, 125, 175); - this.shape146.setRotationPoint(3.0F, 0.0F, 7.0F); - this.shape146.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(shape146, -0.27314402793711257F, 0.0F, 0.045553093477052F); - this.shape123 = new ModelRenderer(this, 125, 175); - this.shape123.setRotationPoint(0.0F, -5.0F, 0.0F); - this.shape123.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); - this.setRotateAngle(shape123, -0.18203784098300857F, 0.0F, 0.091106186954104F); - this.RighttoeL1 = new ModelRenderer(this, 180, 180); - this.RighttoeL1.mirror = true; - this.RighttoeL1.setRotationPoint(-2.4F, 6.0F, -4.0F); - this.RighttoeL1.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(RighttoeL1, -0.5462880558742251F, 0.40980330836826856F, 0.18203784098300857F); - this.Underlowerjaw2 = new ModelRenderer(this, 5, 430); - this.Underlowerjaw2.setRotationPoint(0.0F, 0.0F, -7.0F); - this.Underlowerjaw2.addBox(-2.5F, -1.0F, 0.0F, 5, 1, 4, 0.0F); - this.setRotateAngle(Underlowerjaw2, -0.18203784098300857F, 0.0F, 0.0F); - this.RTailSpike = new ModelRenderer(this, 350, 300); - this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.RTailSpike.addBox(-8.0F, 0.0F, 0.0F, 8, 1, 3, 0.0F); - this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, 0.0F); - this.Wingupperarmleft = new ModelRenderer(this, 390, 230); - this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); - this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); - this.Wingmembramelargeleft1 = new ModelRenderer(this, 270, 430); - this.Wingmembramelargeleft1.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeleft1.addBox(0.0F, 0.0F, 0.0F, 37, 0, 61, 0.0F); - this.LTailSpike = new ModelRenderer(this, 350, 300); - this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 8, 1, 3, 0.0F); - this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.0F); - this.shape153 = new ModelRenderer(this, 125, 175); - this.shape153.setRotationPoint(-3.0F, 0.0F, 2.0F); - this.shape153.addBox(-1.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(shape153, -0.5009094953223726F, -0.36425021489121656F, 0.22759093446006054F); - this.shape154 = new ModelRenderer(this, 125, 175); - this.shape154.setRotationPoint(4.0F, 0.0F, 9.0F); - this.shape154.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); - this.setRotateAngle(shape154, -0.36425021489121656F, 0.0F, -0.136659280431156F); - this.Wingmembramemidright = new ModelRenderer(this, 350, 340); - this.Wingmembramemidright.mirror = true; - this.Wingmembramemidright.setRotationPoint(-20.5F, 2.9F, 5.1F); - this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); - this.BrowbackL = new ModelRenderer(this, 190, 380); - this.BrowbackL.setRotationPoint(0.0F, 0.0F, 5.0F); - this.BrowbackL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(BrowbackL, 0.0F, -0.4553564018453205F, 0.0F); - this.shape149 = new ModelRenderer(this, 125, 175); - this.shape149.setRotationPoint(-4.0F, 0.0F, 15.0F); - this.shape149.addBox(-1.0F, -6.0F, 0.0F, 1, 6, 2, 0.0F); - this.setRotateAngle(shape149, -0.36425021489121656F, 0.18203784098300857F, 0.045553093477052F); - this.LefttoeR1 = new ModelRenderer(this, 180, 180); - this.LefttoeR1.setRotationPoint(2.4F, 6.0F, -4.0F); - this.LefttoeR1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(LefttoeR1, -0.5462880558742251F, -0.40980330836826856F, -0.18203784098300857F); - this.Lowerjaw = new ModelRenderer(this, 5, 410); - this.Lowerjaw.setRotationPoint(0.0F, -1.0F, -7.0F); - this.Lowerjaw.addBox(-2.5F, -1.0F, -8.0F, 5, 1, 8, 0.0F); - this.shape147 = new ModelRenderer(this, 125, 175); - this.shape147.setRotationPoint(2.0F, 0.0F, 12.0F); - this.shape147.addBox(0.0F, -6.0F, 0.0F, 1, 6, 2, 0.0F); - this.setRotateAngle(shape147, -0.40980330836826856F, 0.22759093446006054F, 0.27314402793711257F); - this.shape141 = new ModelRenderer(this, 125, 175); - this.shape141.setRotationPoint(0.0F, -4.0F, 0.0F); - this.shape141.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape141, -0.18203784098300857F, 0.0F, 0.27314402793711257F); - this.shape151 = new ModelRenderer(this, 125, 175); - this.shape151.setRotationPoint(-2.8F, 0.0F, 3.0F); - this.shape151.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); - this.setRotateAngle(shape151, -0.18203784098300857F, 0.0F, -0.136659280431156F); - this.ToothlowerL2 = new ModelRenderer(this, 50, 420); - this.ToothlowerL2.setRotationPoint(2.5F, 0.0F, -4.7F); - this.ToothlowerL2.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerL2, 0.0F, 0.0F, 0.31869712141416456F); - this.Tail4 = new ModelRenderer(this, 5, 150); - this.Tail4.setRotationPoint(0.0F, 0.5F, 17.0F); - this.Tail4.addBox(-3.5F, 0.0F, 0.0F, 7, 8, 19, 0.0F); - this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); - this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); - this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); - this.shape125 = new ModelRenderer(this, 125, 175); - this.shape125.setRotationPoint(0.0F, -5.0F, 0.0F); - this.shape125.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape125, -0.18203784098300857F, 0.0F, 0.091106186954104F); - this.Tail1 = new ModelRenderer(this, 5, 45); - this.Tail1.setRotationPoint(0.0F, 0.5F, 18.0F); - this.Tail1.addBox(-6.0F, 0.0F, 0.0F, 12, 15, 21, 0.0F); - this.setRotateAngle(Tail1, -0.5009094953223726F, 0.0F, 0.0F); - this.RTailMembrane = new ModelRenderer(this, 381, 270); - this.RTailMembrane.mirror = true; - this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 1.0F); - this.RTailMembrane.addBox(-6.0F, 0.0F, 0.0F, 6, 1, 15, 0.0F); - this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); - this.Wingupperarmright = new ModelRenderer(this, 390, 230); - this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); - this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); - this.Lowerjawback = new ModelRenderer(this, 5, 400); - this.Lowerjawback.setRotationPoint(0.0F, 4.5F, 1.1F); - this.Lowerjawback.addBox(-3.0F, -2.0F, -7.0F, 6, 2, 7, 0.0F); - this.setRotateAngle(Lowerjawback, 0.136659280431156F, 0.0F, 0.0F); - this.shape126 = new ModelRenderer(this, 125, 175); - this.shape126.setRotationPoint(0.0F, -5.0F, 2.0F); - this.shape126.addBox(-0.5F, -4.0F, -2.0F, 1, 4, 2, 0.0F); - this.setRotateAngle(shape126, 0.27314402793711257F, 0.0F, -0.27314402793711257F); - this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); - this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); - this.shape138 = new ModelRenderer(this, 125, 190); - this.shape138.setRotationPoint(0.0F, 0.0F, 18.0F); - this.shape138.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(shape138, -0.31869712141416456F, 0.0F, 0.0F); - this.ThighR = new ModelRenderer(this, 180, 230); - this.ThighR.setRotationPoint(-9.0F, 5.0F, 15.0F); - this.ThighR.addBox(0.0F, 0.0F, 0.0F, 5, 13, 8, 0.0F); - this.setRotateAngle(ThighR, -0.4553564018453205F, 0.0F, 0.136659280431156F); - this.Head1 = new ModelRenderer(this, 5, 340); - this.Head1.setRotationPoint(0.0F, -0.2F, -5.5F); - this.Head1.addBox(-3.5F, 0.0F, -7.0F, 7, 6, 7, 0.0F); - this.setRotateAngle(Head1, 0.136659280431156F, 0.0F, 0.0F); - this.Tail3 = new ModelRenderer(this, 5, 120); - this.Tail3.setRotationPoint(0.0F, 0.5F, 18.0F); - this.Tail3.addBox(-4.5F, 0.0F, 0.0F, 9, 10, 18, 0.0F); - this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); - this.shape127 = new ModelRenderer(this, 125, 210); - this.shape127.setRotationPoint(0.0F, 0.0F, 15.0F); - this.shape127.addBox(-1.0F, -6.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(shape127, -0.6373942428283291F, 0.0F, 0.0F); - this.shape155 = new ModelRenderer(this, 125, 175); - this.shape155.setRotationPoint(-3.5F, 0.0F, 9.0F); - this.shape155.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(shape155, -0.40980330836826856F, -0.045553093477052F, 0.136659280431156F); - this.shape137 = new ModelRenderer(this, 125, 175); - this.shape137.setRotationPoint(0.0F, -5.0F, 0.0F); - this.shape137.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(shape137, -0.136659280431156F, 0.136659280431156F, 0.18203784098300857F); - this.Wingmembramelargeright1 = new ModelRenderer(this, 270, 430); - this.Wingmembramelargeright1.mirror = true; - this.Wingmembramelargeright1.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeright1.addBox(-37.0F, 0.0F, 0.0F, 37, 0, 61, 0.0F); - this.Neck1 = new ModelRenderer(this, 5, 270); - this.Neck1.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Neck1.addBox(-4.5F, 0.0F, -6.0F, 9, 13, 10, 0.0F); - this.setRotateAngle(Neck1, -0.091106186954104F, 0.0F, 0.0F); - this.shape115 = new ModelRenderer(this, 125, 255); - this.shape115.setRotationPoint(0.0F, 0.7F, 6.8F); - this.shape115.addBox(-1.5F, 0.0F, 0.0F, 3, 1, 6, 0.0F); - this.setRotateAngle(shape115, -0.17575465567582899F, 0.0F, 0.0F); - this.shape140 = new ModelRenderer(this, 125, 190); - this.shape140.setRotationPoint(0.0F, 0.0F, 5.0F); - this.shape140.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(shape140, -0.40980330836826856F, 0.0F, -0.136659280431156F); - this.MidtoeL1 = new ModelRenderer(this, 180, 180); - this.MidtoeL1.mirror = true; - this.MidtoeL1.setRotationPoint(-2.0F, 6.1F, -4.0F); - this.MidtoeL1.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(MidtoeL1, -0.5462880558742251F, 0.0F, 0.0F); - this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerright.setRotationPoint(-2.5F, 2.7F, -3.9F); - this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Headmidhornlowerright, 0.31869712141416456F, -0.31869712141416456F, -0.9560913642424937F); - this.shape114 = new ModelRenderer(this, 125, 240); - this.shape114.setRotationPoint(0.0F, -4.0F, 3.0F); - this.shape114.addBox(-2.0F, 0.0F, 0.0F, 4, 3, 7, 0.0F); - this.setRotateAngle(shape114, -0.6373942428283291F, 0.0F, 0.0F); - this.RBrowback = new ModelRenderer(this, 190, 380); - this.RBrowback.setRotationPoint(0.0F, 0.0F, 5.0F); - this.RBrowback.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(RBrowback, 0.0F, 0.4553564018453205F, 0.0F); - this.shape128 = new ModelRenderer(this, 125, 175); - this.shape128.setRotationPoint(0.0F, -6.0F, 0.0F); - this.shape128.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape128, -0.18203784098300857F, 0.0F, 0.0F); - this.LefttoeR2 = new ModelRenderer(this, 180, 170); - this.LefttoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); - this.LefttoeR2.addBox(0.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(LefttoeR2, -0.36425021489121656F, 0.0F, 0.0F); - this.shape129 = new ModelRenderer(this, 125, 175); - this.shape129.setRotationPoint(0.0F, -5.0F, 2.0F); - this.shape129.addBox(-0.5F, -5.0F, -2.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape129, 0.31869712141416456F, 0.0F, 0.18203784098300857F); - this.Bodyfront = new ModelRenderer(this, 5, 5); - this.Bodyfront.setRotationPoint(0.0F, -4.0F, -14.0F); - this.Bodyfront.addBox(-6.5F, 0.0F, 0.0F, 13, 16, 18, 0.0F); - this.setRotateAngle(Bodyfront, 0.40980330836826856F, 0.0F, 0.0F); - this.Rfinger2 = new ModelRenderer(this, 330, 140); - this.Rfinger2.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Rfinger2.addBox(0.0F, 0.0F, -4.0F, 2, 2, 4, 0.0F); - this.setRotateAngle(Rfinger2, 0.40980330836826856F, 0.0F, 0.0F); - this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); - this.Wingmembramemidleft.setRotationPoint(20.5F, 2.9F, 5.1F); - this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); - this.shape139 = new ModelRenderer(this, 125, 175); - this.shape139.setRotationPoint(0.0F, -4.0F, 0.0F); - this.shape139.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); - this.setRotateAngle(shape139, -0.27314402793711257F, 0.0F, 0.0F); - this.ToothlowerR2 = new ModelRenderer(this, 50, 420); - this.ToothlowerR2.setRotationPoint(-2.5F, 0.0F, -4.7F); - this.ToothlowerR2.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerR2, 0.0F, 0.0F, -0.31869712141416456F); - this.HornmidR = new ModelRenderer(this, 50, 410); - this.HornmidR.setRotationPoint(-2.0F, 0.0F, 4.0F); - this.HornmidR.addBox(0.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(HornmidR, 0.0F, 0.045553093477052F, 0.0F); - this.HornbaseL = new ModelRenderer(this, 50, 400); - this.HornbaseL.setRotationPoint(1.5F, 0.3F, -3.8F); - this.HornbaseL.addBox(-1.0F, 0.0F, 0.0F, 3, 2, 4, 0.0F); - this.setRotateAngle(HornbaseL, 0.36425021489121656F, -0.091106186954104F, 0.9560913642424937F); - this.RighttoeR2 = new ModelRenderer(this, 180, 170); - this.RighttoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); - this.RighttoeR2.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(RighttoeR2, -0.40980330836826856F, 0.0F, 0.0F); - this.Wingfinger3left = new ModelRenderer(this, 390, 170); - this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); - this.ShinL = new ModelRenderer(this, 180, 210); - this.ShinL.mirror = true; - this.ShinL.setRotationPoint(-0.7F, 13.0F, 0.0F); - this.ShinL.addBox(-4.0F, 0.0F, 0.0F, 4, 12, 6, 0.0F); - this.setRotateAngle(ShinL, 1.0471975511965976F, 0.0F, 0.136659280431156F); - this.Underlowerjaw3 = new ModelRenderer(this, 5, 420); - this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 4.0F); - this.Underlowerjaw3.addBox(-2.5F, -1.0F, 0.0F, 5, 1, 5, 0.0F); - this.setRotateAngle(Underlowerjaw3, 0.136659280431156F, 0.0F, 0.0F); - this.Wingshoulderright = new ModelRenderer(this, 470, 230); - this.Wingshoulderright.setRotationPoint(-3.0F, 4.0F, 4.0F); - this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderright, 0.5009094953223726F, -0.27314402793711257F, -0.6829473363053812F); - this.shape122 = new ModelRenderer(this, 125, 200); - this.shape122.setRotationPoint(0.0F, 0.0F, 1.0F); - this.shape122.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(shape122, -0.5009094953223726F, 0.0F, 0.136659280431156F); - this.Winglowerarmleft = new ModelRenderer(this, 400, 215); - this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); - this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); - this.Wingmembramelargeright2 = new ModelRenderer(this, 355, 430); - this.Wingmembramelargeright2.mirror = true; - this.Wingmembramelargeright2.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeright2.addBox(-41.0F, 0.0F, 0.0F, 41, 0, 57, 0.0F); - this.Wingfinger3right = new ModelRenderer(this, 390, 170); - this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); - this.Wingfinger1left = new ModelRenderer(this, 350, 200); - this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); - this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1left, 0.0F, -1.593485607070823F, 0.0F); - this.shape134 = new ModelRenderer(this, 125, 200); - this.shape134.setRotationPoint(0.0F, 0.0F, 4.3F); - this.shape134.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(shape134, -0.22759093446006054F, 0.0F, -0.091106186954104F); - this.ToothlowerR1 = new ModelRenderer(this, 50, 420); - this.ToothlowerR1.setRotationPoint(-2.5F, 0.0F, -2.4F); - this.ToothlowerR1.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerR1, 0.0F, 0.0F, -0.31869712141416456F); - this.Tail5 = new ModelRenderer(this, 5, 180); - this.Tail5.setRotationPoint(0.0F, 0.5F, 18.0F); - this.Tail5.addBox(-2.5F, 0.0F, 0.0F, 5, 6, 20, 0.0F); - this.setRotateAngle(Tail5, 0.091106186954104F, 0.0F, 0.0F); - this.shape113 = new ModelRenderer(this, 125, 225); - this.shape113.setRotationPoint(0.0F, 3.4F, -5.6F); - this.shape113.addBox(-2.5F, -4.0F, 0.0F, 5, 4, 4, 0.0F); - this.setRotateAngle(shape113, 0.6609561877302526F, 0.0F, 0.0F); - this.HornbaseR = new ModelRenderer(this, 50, 400); - this.HornbaseR.setRotationPoint(-1.5F, 0.3F, -3.8F); - this.HornbaseR.addBox(-2.0F, 0.0F, 0.0F, 3, 2, 4, 0.0F); - this.setRotateAngle(HornbaseR, 0.36425021489121656F, 0.091106186954104F, -0.9560913642424937F); - this.shape145 = new ModelRenderer(this, 125, 175); - this.shape145.setRotationPoint(-4.0F, 0.0F, 6.0F); - this.shape145.addBox(0.0F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.setRotateAngle(shape145, -0.36425021489121656F, 0.0F, -0.36425021489121656F); - this.LefttoeL1 = new ModelRenderer(this, 180, 180); - this.LefttoeL1.mirror = true; - this.LefttoeL1.setRotationPoint(-1.8F, 6.0F, -4.0F); - this.LefttoeL1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(LefttoeL1, -0.5462880558742251F, -0.40980330836826856F, -0.18203784098300857F); - this.shape135 = new ModelRenderer(this, 125, 175); - this.shape135.setRotationPoint(0.0F, -5.0F, 2.0F); - this.shape135.addBox(-0.5F, -8.0F, -2.0F, 1, 8, 2, 0.0F); - this.setRotateAngle(shape135, 0.27314402793711257F, 0.0F, -0.136659280431156F); - this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); - this.Headmidhornupperleft.setRotationPoint(1.0F, 0.1F, 4.9F); - this.Headmidhornupperleft.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 6, 0.0F); - this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.22759093446006054F, 0.0F); - this.Winglowerarmright = new ModelRenderer(this, 400, 215); - this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); - this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); - this.ToothL1 = new ModelRenderer(this, 50, 420); - this.ToothL1.setRotationPoint(2.7F, 3.5F, -1.0F); - this.ToothL1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothL1, 0.0F, 0.0F, -0.31869712141416456F); - this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); - this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); - this.ToothL2 = new ModelRenderer(this, 50, 420); - this.ToothL2.setRotationPoint(2.7F, 3.5F, -3.5F); - this.ToothL2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothL2, 0.0F, 0.0F, -0.31869712141416456F); - this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); - this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); - this.shape124 = new ModelRenderer(this, 125, 200); - this.shape124.setRotationPoint(0.0F, 0.0F, 8.0F); - this.shape124.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(shape124, -0.5462880558742251F, 0.0F, 0.0F); - this.shape136 = new ModelRenderer(this, 125, 200); - this.shape136.setRotationPoint(0.0F, 0.0F, 11.0F); - this.shape136.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(shape136, -0.27314402793711257F, 0.0F, 0.0F); - this.Tail8 = new ModelRenderer(this, 5, 220); - this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); - this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); - this.FootR = new ModelRenderer(this, 180, 190); - this.FootR.setRotationPoint(0.01F, 12.0F, 6.0F); - this.FootR.addBox(0.0F, 0.0F, -5.0F, 4, 9, 5, 0.0F); - this.setRotateAngle(FootR, -0.7740535232594852F, 0.0F, 0.0F); - this.BrowfrontR = new ModelRenderer(this, 190, 390); - this.BrowfrontR.setRotationPoint(-3.0F, 0.8F, -9.0F); - this.BrowfrontR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(BrowfrontR, 0.091106186954104F, -0.27314402793711257F, 0.0F); - this.HornendR = new ModelRenderer(this, 50, 430); - this.HornendR.setRotationPoint(0.0F, 0.0F, 5.0F); - this.HornendR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 4, 0.0F); - this.setRotateAngle(HornendR, 0.0F, 0.27314402793711257F, 0.0F); - this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); - this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); - this.Mouthback_MOVE_TO_OPEN = new ModelRenderer(this, 5, 390); - this.Mouthback_MOVE_TO_OPEN.setRotationPoint(0.01F, 3.5F, -0.3F); - this.Mouthback_MOVE_TO_OPEN.addBox(-2.5F, 0.0F, -5.0F, 5, 4, 5, 0.0F); - this.setRotateAngle(Mouthback_MOVE_TO_OPEN, -0.18203784098300857F, 0.0F, 0.0F); - this.Tail7 = new ModelRenderer(this, 5, 240); - this.Tail7.setRotationPoint(0.0F, 0.3F, 19.0F); - this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); - this.setRotateAngle(Tail7, 0.18203784098300857F, 0.0F, 0.0F); - this.ToothR2 = new ModelRenderer(this, 50, 420); - this.ToothR2.setRotationPoint(-2.7F, 3.5F, -3.5F); - this.ToothR2.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothR2, 0.0F, 0.0F, 0.31869712141416456F); - this.Upperjaw = new ModelRenderer(this, 5, 370); - this.Upperjaw.setRotationPoint(-0.01F, 0.7F, -0.1F); - this.Upperjaw.addBox(-3.0F, 0.0F, -8.0F, 6, 5, 10, 0.0F); - this.setRotateAngle(Upperjaw, -0.091106186954104F, 0.0F, 0.0F); - this.Underlowerjaw = new ModelRenderer(this, 5, 440); - this.Underlowerjaw.setRotationPoint(0.0F, 1.0F, 0.0F); - this.Underlowerjaw.addBox(-2.0F, -1.0F, -6.0F, 4, 1, 6, 0.0F); - this.setRotateAngle(Underlowerjaw, -0.045553093477052F, 0.0F, 0.0F); - this.ToothlowerR3 = new ModelRenderer(this, 50, 420); - this.ToothlowerR3.setRotationPoint(-2.5F, 0.0F, -6.9F); - this.ToothlowerR3.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerR3, 0.18203784098300857F, 0.0F, -0.31869712141416456F); - this.Wingfinger2right = new ModelRenderer(this, 330, 150); - this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); - this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); - this.ToothR4 = new ModelRenderer(this, 50, 420); - this.ToothR4.setRotationPoint(-2.7F, 3.6F, -8.0F); - this.ToothR4.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothR4, -0.18203784098300857F, 0.0F, 0.31869712141416456F); - this.MidtoeL2 = new ModelRenderer(this, 180, 170); - this.MidtoeL2.mirror = true; - this.MidtoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); - this.MidtoeL2.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(MidtoeL2, -0.4553564018453205F, 0.0F, 0.0F); - this.ToothR3 = new ModelRenderer(this, 50, 420); - this.ToothR3.setRotationPoint(-2.7F, 3.5F, -6.0F); - this.ToothR3.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothR3, 0.0F, 0.0F, 0.31869712141416456F); - this.Neck2 = new ModelRenderer(this, 5, 299); - this.Neck2.setRotationPoint(0.0F, 0.7F, -6.0F); - this.Neck2.addBox(-3.5F, 0.0F, -6.0F, 7, 11, 9, 0.0F); - this.setRotateAngle(Neck2, 0.045553093477052F, 0.0F, 0.0F); - this.Headtop = new ModelRenderer(this, 5, 355); - this.Headtop.setRotationPoint(0.01F, 0.2F, -7.0F); - this.Headtop.addBox(-3.0F, 0.0F, -8.0F, 6, 4, 8, 0.0F); - this.setRotateAngle(Headtop, 0.045553093477052F, 0.0F, 0.0F); - this.ToothlowerL1 = new ModelRenderer(this, 50, 420); - this.ToothlowerL1.setRotationPoint(2.5F, 0.0F, -2.4F); - this.ToothlowerL1.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(ToothlowerL1, 0.0F, 0.0F, 0.31869712141416456F); - this.Rfinger1 = new ModelRenderer(this, 350, 140); - this.Rfinger1.setRotationPoint(-24.0F, 2.0F, 3.0F); - this.Rfinger1.addBox(0.0F, 0.0F, -5.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Rfinger1, 0.31869712141416456F, 1.0016444577195458F, 0.0F); - this.HornmidL = new ModelRenderer(this, 50, 410); - this.HornmidL.setRotationPoint(2.0F, 0.0F, 4.0F); - this.HornmidL.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(HornmidL, 0.0F, -0.045553093477052F, 0.0F); - this.MidtoeR1 = new ModelRenderer(this, 180, 180); - this.MidtoeR1.setRotationPoint(2.0F, 6.1F, -4.0F); - this.MidtoeR1.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(MidtoeR1, -0.6373942428283291F, 0.0F, 0.0F); - this.Wingfinger2left = new ModelRenderer(this, 330, 150); - this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); - this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); - this.MidtoeR2 = new ModelRenderer(this, 180, 170); - this.MidtoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); - this.MidtoeR2.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(MidtoeR2, -0.4553564018453205F, 0.0F, 0.0F); - this.LefttoeL2 = new ModelRenderer(this, 180, 170); - this.LefttoeL2.mirror = true; - this.LefttoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); - this.LefttoeL2.addBox(0.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(LefttoeL2, -0.40980330836826856F, 0.0F, 0.0F); - this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerleft.setRotationPoint(2.5F, 2.7F, -3.9F); - this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Headmidhornlowerleft, 0.31869712141416456F, 0.31869712141416456F, 0.9560913642424937F); - this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); - this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); - this.shape148 = new ModelRenderer(this, 125, 175); - this.shape148.setRotationPoint(-2.0F, 0.2F, 11.3F); - this.shape148.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); - this.setRotateAngle(shape148, 0.0F, 0.0F, 0.091106186954104F); - this.Bodyfront.addChild(this.Wingshoulderleft); - this.Lowerjaw.addChild(this.ToothlowerR3_1); - this.ShinL.addChild(this.FootL); - this.Neck2.addChild(this.Neck3); - this.Underlowerjaw2.addChild(this.shape108); - this.RighttoeL1.addChild(this.RighttoeL2); - this.LTailSpike.addChild(this.LTailMembrane); - this.Wingupperarmright.addChild(this.Wingmembramesmallright); - this.Bodyfront.addChild(this.shape144); - this.Tail1.addChild(this.shape152); - this.Headmidhornlowerright.addChild(this.Headmidhornupperright); - this.Winglowerarmleft.addChild(this.Lfinger1); - this.Tail1.addChild(this.shape150); - this.Upperjaw.addChild(this.ToothR1); - this.ThighR.addChild(this.ShinR); - this.Lfinger1.addChild(this.Lfinger2); - this.Tail2.addChild(this.shape142); - this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); - this.Wingfingerlower1left.addChild(this.Wingmembramelargeleft2); - this.Upperjaw.addChild(this.ToothL3); - this.HornmidL.addChild(this.HornendL); - this.Tail1.addChild(this.ThighL); - this.FootR.addChild(this.RighttoeR1); - this.Winglowerarmright.addChild(this.Wingfinger1right); - this.Head1.addChild(this.BrowfrontL); - this.Tail1.addChild(this.Tail2); - this.Tail3.addChild(this.shape143); - this.Upperjaw.addChild(this.ToothL4); - this.Bodyfront.addChild(this.shape146); - this.shape122.addChild(this.shape123); - this.FootL.addChild(this.RighttoeL1); - this.Lowerjawback.addChild(this.Underlowerjaw2); - this.Tail8.addChild(this.RTailSpike); - this.Wingshoulderleft.addChild(this.Wingupperarmleft); - this.Wingfinger1left.addChild(this.Wingmembramelargeleft1); - this.Tail8.addChild(this.LTailSpike); - this.Bodyfront.addChild(this.shape153); - this.Tail1.addChild(this.shape154); - this.Winglowerarmright.addChild(this.Wingmembramemidright); - this.BrowfrontL.addChild(this.BrowbackL); - this.Bodyfront.addChild(this.shape149); - this.FootR.addChild(this.LefttoeR1); - this.Lowerjawback.addChild(this.Lowerjaw); - this.Bodyfront.addChild(this.shape147); - this.shape140.addChild(this.shape141); - this.Tail1.addChild(this.shape151); - this.Lowerjaw.addChild(this.ToothlowerL2); - this.Tail3.addChild(this.Tail4); - this.Wingfinger1right.addChild(this.Wingfingerlower1right); - this.shape124.addChild(this.shape125); - this.Bodyfront.addChild(this.Tail1); - this.RTailSpike.addChild(this.RTailMembrane); - this.Wingshoulderright.addChild(this.Wingupperarmright); - this.Mouthback_MOVE_TO_OPEN.addChild(this.Lowerjawback); - this.shape125.addChild(this.shape126); - this.Wingfinger2right.addChild(this.Wingfingerlower2right); - this.Tail1.addChild(this.shape138); - this.Tail1.addChild(this.ThighR); - this.Neck3.addChild(this.Head1); - this.Tail2.addChild(this.Tail3); - this.Bodyfront.addChild(this.shape127); - this.Tail1.addChild(this.shape155); - this.shape136.addChild(this.shape137); - this.Wingfinger1right.addChild(this.Wingmembramelargeright1); - this.Bodyfront.addChild(this.Neck1); - this.shape114.addChild(this.shape115); - this.Tail2.addChild(this.shape140); - this.FootL.addChild(this.MidtoeL1); - this.Head1.addChild(this.Headmidhornlowerright); - this.shape113.addChild(this.shape114); - this.BrowfrontR.addChild(this.RBrowback); - this.shape127.addChild(this.shape128); - this.LefttoeR1.addChild(this.LefttoeR2); - this.shape128.addChild(this.shape129); - this.Rfinger1.addChild(this.Rfinger2); - this.Winglowerarmleft.addChild(this.Wingmembramemidleft); - this.shape138.addChild(this.shape139); - this.Lowerjaw.addChild(this.ToothlowerR2); - this.HornbaseR.addChild(this.HornmidR); - this.Head1.addChild(this.HornbaseL); - this.RighttoeR1.addChild(this.RighttoeR2); - this.Wingfinger1left.addChild(this.Wingfinger3left); - this.ThighL.addChild(this.ShinL); - this.Underlowerjaw2.addChild(this.Underlowerjaw3); - this.Bodyfront.addChild(this.Wingshoulderright); - this.Bodyfront.addChild(this.shape122); - this.Wingupperarmleft.addChild(this.Winglowerarmleft); - this.Wingfingerlower1right.addChild(this.Wingmembramelargeright2); - this.Wingfinger1right.addChild(this.Wingfinger3right); - this.Winglowerarmleft.addChild(this.Wingfinger1left); - this.Tail1.addChild(this.shape134); - this.Lowerjaw.addChild(this.ToothlowerR1); - this.Tail4.addChild(this.Tail5); - this.Headtop.addChild(this.shape113); - this.Head1.addChild(this.HornbaseR); - this.Bodyfront.addChild(this.shape145); - this.FootL.addChild(this.LefttoeL1); - this.shape134.addChild(this.shape135); - this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); - this.Wingupperarmright.addChild(this.Winglowerarmright); - this.Upperjaw.addChild(this.ToothL1); - this.Wingfinger3left.addChild(this.Wingfingerlower3left); - this.Upperjaw.addChild(this.ToothL2); - this.Wingfinger2left.addChild(this.Wingfingerlower2left); - this.Bodyfront.addChild(this.shape124); - this.Tail1.addChild(this.shape136); - this.Tail7.addChild(this.Tail8); - this.ShinR.addChild(this.FootR); - this.Head1.addChild(this.BrowfrontR); - this.HornmidR.addChild(this.HornendR); - this.Wingfinger3right.addChild(this.Wingfingerlower3right); - this.Head1.addChild(this.Mouthback_MOVE_TO_OPEN); - this.Tail5.addChild(this.Tail7); - this.Upperjaw.addChild(this.ToothR2); - this.Headtop.addChild(this.Upperjaw); - this.Lowerjaw.addChild(this.Underlowerjaw); - this.Lowerjaw.addChild(this.ToothlowerR3); - this.Wingfinger1right.addChild(this.Wingfinger2right); - this.Upperjaw.addChild(this.ToothR4); - this.MidtoeL1.addChild(this.MidtoeL2); - this.Upperjaw.addChild(this.ToothR3); - this.Neck1.addChild(this.Neck2); - this.Head1.addChild(this.Headtop); - this.Lowerjaw.addChild(this.ToothlowerL1); - this.Winglowerarmright.addChild(this.Rfinger1); - this.HornbaseL.addChild(this.HornmidL); - this.FootR.addChild(this.MidtoeR1); - this.Wingfinger1left.addChild(this.Wingfinger2left); - this.MidtoeR1.addChild(this.MidtoeR2); - this.LefttoeL1.addChild(this.LefttoeL2); - this.Head1.addChild(this.Headmidhornlowerleft); - this.Wingfinger1left.addChild(this.Wingfingerlower1left); - this.Bodyfront.addChild(this.shape148); - } + public ModelAshDragon() { + this.textureWidth = 512; + this.textureHeight = 512; + this.Wingshoulderleft = new ModelRenderer(this, 470, 230); + this.Wingshoulderleft.setRotationPoint(3.0F, 4.0F, 4.0F); + this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderleft, 0.5009094953223726F, 0.27314402793711257F, 0.6829473363053812F); + this.ToothlowerR3_1 = new ModelRenderer(this, 50, 420); + this.ToothlowerR3_1.setRotationPoint(2.5F, 0.0F, -6.9F); + this.ToothlowerR3_1.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerR3_1, 0.18203784098300857F, 0.0F, 0.31869712141416456F); + this.FootL = new ModelRenderer(this, 180, 190); + this.FootL.mirror = true; + this.FootL.setRotationPoint(-0.01F, 12.0F, 6.0F); + this.FootL.addBox(-4.0F, 0.0F, -5.0F, 4, 9, 5, 0.0F); + this.setRotateAngle(FootL, -0.7838273670706533F, 0.0F, 0.0F); + this.Neck3 = new ModelRenderer(this, 5, 320); + this.Neck3.setRotationPoint(0.0F, 0.5F, -6.0F); + this.Neck3.addBox(-2.5F, 0.0F, -5.0F, 5, 9, 9, 0.0F); + this.setRotateAngle(Neck3, 0.136659280431156F, 0.0F, 0.0F); + this.shape108 = new ModelRenderer(this, 125, 165); + this.shape108.setRotationPoint(0.0F, 0.8F, -5.8F); + this.shape108.addBox(-2.0F, -1.0F, -2.0F, 4, 1, 2, 0.0F); + this.setRotateAngle(shape108, -0.16179202165987433F, 0.0F, 0.0F); + this.RighttoeL2 = new ModelRenderer(this, 180, 170); + this.RighttoeL2.mirror = true; + this.RighttoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); + this.RighttoeL2.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(RighttoeL2, -0.36425021489121656F, 0.0F, 0.0F); + this.LTailMembrane = new ModelRenderer(this, 380, 250); + this.LTailMembrane.setRotationPoint(0.0F, 0.21F, 1.0F); + this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 7, 1, 15, 0.0F); + this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); + this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); + this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); + this.Wingmembramesmallright.addBox(-24.0F, 0.0F, 0.0F, 24, 0, 18, 0.0F); + this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); + this.shape144 = new ModelRenderer(this, 125, 175); + this.shape144.setRotationPoint(4.0F, 0.0F, 0.0F); + this.shape144.addBox(0.0F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape144, -0.36425021489121656F, 0.0F, 0.22759093446006054F); + this.shape152 = new ModelRenderer(this, 125, 175); + this.shape152.setRotationPoint(3.0F, 0.0F, 5.0F); + this.shape152.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(shape152, -0.136659280431156F, 0.136659280431156F, 0.18203784098300857F); + this.Headmidhornupperright = new ModelRenderer(this, 190, 430); + this.Headmidhornupperright.setRotationPoint(-1.0F, 0.1F, 4.9F); + this.Headmidhornupperright.addBox(0.0F, 0.0F, 0.0F, 2, 1, 6, 0.0F); + this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.22759093446006054F, 0.0F); + this.Lfinger1 = new ModelRenderer(this, 350, 140); + this.Lfinger1.setRotationPoint(24.0F, 2.0F, 3.0F); + this.Lfinger1.addBox(-2.0F, 0.0F, -5.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Lfinger1, 0.0F, -1.0016444577195458F, 0.0F); + this.shape150 = new ModelRenderer(this, 0, 0); + this.shape150.setRotationPoint(2.4F, 0.0F, 0.0F); + this.shape150.addBox(0.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); + this.setRotateAngle(shape150, -0.27314402793711257F, -0.136659280431156F, 0.18203784098300857F); + this.ToothR1 = new ModelRenderer(this, 50, 420); + this.ToothR1.setRotationPoint(-2.7F, 3.5F, -1.0F); + this.ToothR1.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothR1, 0.0F, 0.0F, 0.31869712141416456F); + this.ShinR = new ModelRenderer(this, 180, 210); + this.ShinR.setRotationPoint(0.7F, 13.0F, 0.0F); + this.ShinR.addBox(0.0F, 0.0F, 0.0F, 4, 12, 6, 0.0F); + this.setRotateAngle(ShinR, 1.0471975511965976F, 0.0F, -0.136659280431156F); + this.Lfinger2 = new ModelRenderer(this, 330, 140); + this.Lfinger2.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Lfinger2.addBox(-2.0F, 0.0F, -4.0F, 2, 2, 4, 0.0F); + this.setRotateAngle(Lfinger2, 0.40980330836826856F, 0.0F, 0.0F); + this.shape142 = new ModelRenderer(this, 125, 175); + this.shape142.setRotationPoint(0.0F, 0.0F, 12.0F); + this.shape142.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); + this.setRotateAngle(shape142, -0.5009094953223726F, 0.0F, 0.0F); + this.Wingmembramesmallleft = new ModelRenderer(this, 420, 280); + this.Wingmembramesmallleft.mirror = true; + this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); + this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 24, 0, 18, 0.0F); + this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); + this.Wingmembramelargeleft2 = new ModelRenderer(this, 355, 430); + this.Wingmembramelargeleft2.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeleft2.addBox(0.0F, 0.0F, 0.0F, 41, 0, 57, 0.0F); + this.ToothL3 = new ModelRenderer(this, 50, 420); + this.ToothL3.setRotationPoint(2.7F, 3.5F, -6.0F); + this.ToothL3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothL3, 0.0F, 0.0F, -0.31869712141416456F); + this.HornendL = new ModelRenderer(this, 50, 430); + this.HornendL.setRotationPoint(0.0F, 0.0F, 5.0F); + this.HornendL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 4, 0.0F); + this.setRotateAngle(HornendL, 0.0F, -0.27314402793711257F, 0.0F); + this.ThighL = new ModelRenderer(this, 180, 230); + this.ThighL.mirror = true; + this.ThighL.setRotationPoint(9.0F, 5.0F, 15.0F); + this.ThighL.addBox(-5.0F, 0.0F, 0.0F, 5, 13, 8, 0.0F); + this.setRotateAngle(ThighL, -0.4553564018453205F, 0.0F, -0.136659280431156F); + this.RighttoeR1 = new ModelRenderer(this, 180, 180); + this.RighttoeR1.setRotationPoint(1.8F, 6.0F, -4.0F); + this.RighttoeR1.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(RighttoeR1, -0.5462880558742251F, 0.40980330836826856F, 0.18203784098300857F); + this.Wingfinger1right = new ModelRenderer(this, 350, 200); + this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); + this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1right, 0.0F, 1.593485607070823F, 0.0F); + this.BrowfrontL = new ModelRenderer(this, 190, 390); + this.BrowfrontL.setRotationPoint(3.0F, 0.8F, -9.0F); + this.BrowfrontL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(BrowfrontL, 0.091106186954104F, 0.27314402793711257F, 0.0F); + this.Tail2 = new ModelRenderer(this, 5, 85); + this.Tail2.setRotationPoint(0.0F, 0.5F, 20.0F); + this.Tail2.addBox(-5.5F, 0.0F, 0.0F, 11, 12, 19, 0.0F); + this.setRotateAngle(Tail2, -0.091106186954104F, 0.0F, 0.0F); + this.shape143 = new ModelRenderer(this, 125, 175); + this.shape143.setRotationPoint(0.0F, 0.0F, 0.0F); + this.shape143.addBox(-0.5F, -3.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(shape143, -0.6373942428283291F, 0.0F, 0.0F); + this.ToothL4 = new ModelRenderer(this, 50, 420); + this.ToothL4.setRotationPoint(2.7F, 3.6F, -8.0F); + this.ToothL4.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothL4, -0.18203784098300857F, 0.0F, -0.31869712141416456F); + this.shape146 = new ModelRenderer(this, 125, 175); + this.shape146.setRotationPoint(3.0F, 0.0F, 7.0F); + this.shape146.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(shape146, -0.27314402793711257F, 0.0F, 0.045553093477052F); + this.shape123 = new ModelRenderer(this, 125, 175); + this.shape123.setRotationPoint(0.0F, -5.0F, 0.0F); + this.shape123.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); + this.setRotateAngle(shape123, -0.18203784098300857F, 0.0F, 0.091106186954104F); + this.RighttoeL1 = new ModelRenderer(this, 180, 180); + this.RighttoeL1.mirror = true; + this.RighttoeL1.setRotationPoint(-2.4F, 6.0F, -4.0F); + this.RighttoeL1.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(RighttoeL1, -0.5462880558742251F, 0.40980330836826856F, 0.18203784098300857F); + this.Underlowerjaw2 = new ModelRenderer(this, 5, 430); + this.Underlowerjaw2.setRotationPoint(0.0F, 0.0F, -7.0F); + this.Underlowerjaw2.addBox(-2.5F, -1.0F, 0.0F, 5, 1, 4, 0.0F); + this.setRotateAngle(Underlowerjaw2, -0.18203784098300857F, 0.0F, 0.0F); + this.RTailSpike = new ModelRenderer(this, 350, 300); + this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.RTailSpike.addBox(-8.0F, 0.0F, 0.0F, 8, 1, 3, 0.0F); + this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, 0.0F); + this.Wingupperarmleft = new ModelRenderer(this, 390, 230); + this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); + this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); + this.Wingmembramelargeleft1 = new ModelRenderer(this, 270, 430); + this.Wingmembramelargeleft1.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeleft1.addBox(0.0F, 0.0F, 0.0F, 37, 0, 61, 0.0F); + this.LTailSpike = new ModelRenderer(this, 350, 300); + this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 8, 1, 3, 0.0F); + this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.0F); + this.shape153 = new ModelRenderer(this, 125, 175); + this.shape153.setRotationPoint(-3.0F, 0.0F, 2.0F); + this.shape153.addBox(-1.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(shape153, -0.5009094953223726F, -0.36425021489121656F, 0.22759093446006054F); + this.shape154 = new ModelRenderer(this, 125, 175); + this.shape154.setRotationPoint(4.0F, 0.0F, 9.0F); + this.shape154.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); + this.setRotateAngle(shape154, -0.36425021489121656F, 0.0F, -0.136659280431156F); + this.Wingmembramemidright = new ModelRenderer(this, 350, 340); + this.Wingmembramemidright.mirror = true; + this.Wingmembramemidright.setRotationPoint(-20.5F, 2.9F, 5.1F); + this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); + this.BrowbackL = new ModelRenderer(this, 190, 380); + this.BrowbackL.setRotationPoint(0.0F, 0.0F, 5.0F); + this.BrowbackL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(BrowbackL, 0.0F, -0.4553564018453205F, 0.0F); + this.shape149 = new ModelRenderer(this, 125, 175); + this.shape149.setRotationPoint(-4.0F, 0.0F, 15.0F); + this.shape149.addBox(-1.0F, -6.0F, 0.0F, 1, 6, 2, 0.0F); + this.setRotateAngle(shape149, -0.36425021489121656F, 0.18203784098300857F, 0.045553093477052F); + this.LefttoeR1 = new ModelRenderer(this, 180, 180); + this.LefttoeR1.setRotationPoint(2.4F, 6.0F, -4.0F); + this.LefttoeR1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(LefttoeR1, -0.5462880558742251F, -0.40980330836826856F, -0.18203784098300857F); + this.Lowerjaw = new ModelRenderer(this, 5, 410); + this.Lowerjaw.setRotationPoint(0.0F, -1.0F, -7.0F); + this.Lowerjaw.addBox(-2.5F, -1.0F, -8.0F, 5, 1, 8, 0.0F); + this.shape147 = new ModelRenderer(this, 125, 175); + this.shape147.setRotationPoint(2.0F, 0.0F, 12.0F); + this.shape147.addBox(0.0F, -6.0F, 0.0F, 1, 6, 2, 0.0F); + this.setRotateAngle(shape147, -0.40980330836826856F, 0.22759093446006054F, 0.27314402793711257F); + this.shape141 = new ModelRenderer(this, 125, 175); + this.shape141.setRotationPoint(0.0F, -4.0F, 0.0F); + this.shape141.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape141, -0.18203784098300857F, 0.0F, 0.27314402793711257F); + this.shape151 = new ModelRenderer(this, 125, 175); + this.shape151.setRotationPoint(-2.8F, 0.0F, 3.0F); + this.shape151.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); + this.setRotateAngle(shape151, -0.18203784098300857F, 0.0F, -0.136659280431156F); + this.ToothlowerL2 = new ModelRenderer(this, 50, 420); + this.ToothlowerL2.setRotationPoint(2.5F, 0.0F, -4.7F); + this.ToothlowerL2.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerL2, 0.0F, 0.0F, 0.31869712141416456F); + this.Tail4 = new ModelRenderer(this, 5, 150); + this.Tail4.setRotationPoint(0.0F, 0.5F, 17.0F); + this.Tail4.addBox(-3.5F, 0.0F, 0.0F, 7, 8, 19, 0.0F); + this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); + this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); + this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); + this.shape125 = new ModelRenderer(this, 125, 175); + this.shape125.setRotationPoint(0.0F, -5.0F, 0.0F); + this.shape125.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape125, -0.18203784098300857F, 0.0F, 0.091106186954104F); + this.Tail1 = new ModelRenderer(this, 5, 45); + this.Tail1.setRotationPoint(0.0F, 0.5F, 18.0F); + this.Tail1.addBox(-6.0F, 0.0F, 0.0F, 12, 15, 21, 0.0F); + this.setRotateAngle(Tail1, -0.5009094953223726F, 0.0F, 0.0F); + this.RTailMembrane = new ModelRenderer(this, 381, 270); + this.RTailMembrane.mirror = true; + this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 1.0F); + this.RTailMembrane.addBox(-6.0F, 0.0F, 0.0F, 6, 1, 15, 0.0F); + this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); + this.Wingupperarmright = new ModelRenderer(this, 390, 230); + this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); + this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); + this.Lowerjawback = new ModelRenderer(this, 5, 400); + this.Lowerjawback.setRotationPoint(0.0F, 4.5F, 1.1F); + this.Lowerjawback.addBox(-3.0F, -2.0F, -7.0F, 6, 2, 7, 0.0F); + this.setRotateAngle(Lowerjawback, 0.136659280431156F, 0.0F, 0.0F); + this.shape126 = new ModelRenderer(this, 125, 175); + this.shape126.setRotationPoint(0.0F, -5.0F, 2.0F); + this.shape126.addBox(-0.5F, -4.0F, -2.0F, 1, 4, 2, 0.0F); + this.setRotateAngle(shape126, 0.27314402793711257F, 0.0F, -0.27314402793711257F); + this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); + this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); + this.shape138 = new ModelRenderer(this, 125, 190); + this.shape138.setRotationPoint(0.0F, 0.0F, 18.0F); + this.shape138.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(shape138, -0.31869712141416456F, 0.0F, 0.0F); + this.ThighR = new ModelRenderer(this, 180, 230); + this.ThighR.setRotationPoint(-9.0F, 5.0F, 15.0F); + this.ThighR.addBox(0.0F, 0.0F, 0.0F, 5, 13, 8, 0.0F); + this.setRotateAngle(ThighR, -0.4553564018453205F, 0.0F, 0.136659280431156F); + this.Head1 = new ModelRenderer(this, 5, 340); + this.Head1.setRotationPoint(0.0F, -0.2F, -5.5F); + this.Head1.addBox(-3.5F, 0.0F, -7.0F, 7, 6, 7, 0.0F); + this.setRotateAngle(Head1, 0.136659280431156F, 0.0F, 0.0F); + this.Tail3 = new ModelRenderer(this, 5, 120); + this.Tail3.setRotationPoint(0.0F, 0.5F, 18.0F); + this.Tail3.addBox(-4.5F, 0.0F, 0.0F, 9, 10, 18, 0.0F); + this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); + this.shape127 = new ModelRenderer(this, 125, 210); + this.shape127.setRotationPoint(0.0F, 0.0F, 15.0F); + this.shape127.addBox(-1.0F, -6.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(shape127, -0.6373942428283291F, 0.0F, 0.0F); + this.shape155 = new ModelRenderer(this, 125, 175); + this.shape155.setRotationPoint(-3.5F, 0.0F, 9.0F); + this.shape155.addBox(0.0F, -3.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(shape155, -0.40980330836826856F, -0.045553093477052F, 0.136659280431156F); + this.shape137 = new ModelRenderer(this, 125, 175); + this.shape137.setRotationPoint(0.0F, -5.0F, 0.0F); + this.shape137.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(shape137, -0.136659280431156F, 0.136659280431156F, 0.18203784098300857F); + this.Wingmembramelargeright1 = new ModelRenderer(this, 270, 430); + this.Wingmembramelargeright1.mirror = true; + this.Wingmembramelargeright1.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeright1.addBox(-37.0F, 0.0F, 0.0F, 37, 0, 61, 0.0F); + this.Neck1 = new ModelRenderer(this, 5, 270); + this.Neck1.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Neck1.addBox(-4.5F, 0.0F, -6.0F, 9, 13, 10, 0.0F); + this.setRotateAngle(Neck1, -0.091106186954104F, 0.0F, 0.0F); + this.shape115 = new ModelRenderer(this, 125, 255); + this.shape115.setRotationPoint(0.0F, 0.7F, 6.8F); + this.shape115.addBox(-1.5F, 0.0F, 0.0F, 3, 1, 6, 0.0F); + this.setRotateAngle(shape115, -0.17575465567582899F, 0.0F, 0.0F); + this.shape140 = new ModelRenderer(this, 125, 190); + this.shape140.setRotationPoint(0.0F, 0.0F, 5.0F); + this.shape140.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(shape140, -0.40980330836826856F, 0.0F, -0.136659280431156F); + this.MidtoeL1 = new ModelRenderer(this, 180, 180); + this.MidtoeL1.mirror = true; + this.MidtoeL1.setRotationPoint(-2.0F, 6.1F, -4.0F); + this.MidtoeL1.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(MidtoeL1, -0.5462880558742251F, 0.0F, 0.0F); + this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerright.setRotationPoint(-2.5F, 2.7F, -3.9F); + this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Headmidhornlowerright, 0.31869712141416456F, -0.31869712141416456F, -0.9560913642424937F); + this.shape114 = new ModelRenderer(this, 125, 240); + this.shape114.setRotationPoint(0.0F, -4.0F, 3.0F); + this.shape114.addBox(-2.0F, 0.0F, 0.0F, 4, 3, 7, 0.0F); + this.setRotateAngle(shape114, -0.6373942428283291F, 0.0F, 0.0F); + this.RBrowback = new ModelRenderer(this, 190, 380); + this.RBrowback.setRotationPoint(0.0F, 0.0F, 5.0F); + this.RBrowback.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(RBrowback, 0.0F, 0.4553564018453205F, 0.0F); + this.shape128 = new ModelRenderer(this, 125, 175); + this.shape128.setRotationPoint(0.0F, -6.0F, 0.0F); + this.shape128.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape128, -0.18203784098300857F, 0.0F, 0.0F); + this.LefttoeR2 = new ModelRenderer(this, 180, 170); + this.LefttoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); + this.LefttoeR2.addBox(0.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(LefttoeR2, -0.36425021489121656F, 0.0F, 0.0F); + this.shape129 = new ModelRenderer(this, 125, 175); + this.shape129.setRotationPoint(0.0F, -5.0F, 2.0F); + this.shape129.addBox(-0.5F, -5.0F, -2.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape129, 0.31869712141416456F, 0.0F, 0.18203784098300857F); + this.Bodyfront = new ModelRenderer(this, 5, 5); + this.Bodyfront.setRotationPoint(0.0F, -4.0F, -14.0F); + this.Bodyfront.addBox(-6.5F, 0.0F, 0.0F, 13, 16, 18, 0.0F); + this.setRotateAngle(Bodyfront, 0.40980330836826856F, 0.0F, 0.0F); + this.Rfinger2 = new ModelRenderer(this, 330, 140); + this.Rfinger2.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Rfinger2.addBox(0.0F, 0.0F, -4.0F, 2, 2, 4, 0.0F); + this.setRotateAngle(Rfinger2, 0.40980330836826856F, 0.0F, 0.0F); + this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); + this.Wingmembramemidleft.setRotationPoint(20.5F, 2.9F, 5.1F); + this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); + this.shape139 = new ModelRenderer(this, 125, 175); + this.shape139.setRotationPoint(0.0F, -4.0F, 0.0F); + this.shape139.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); + this.setRotateAngle(shape139, -0.27314402793711257F, 0.0F, 0.0F); + this.ToothlowerR2 = new ModelRenderer(this, 50, 420); + this.ToothlowerR2.setRotationPoint(-2.5F, 0.0F, -4.7F); + this.ToothlowerR2.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerR2, 0.0F, 0.0F, -0.31869712141416456F); + this.HornmidR = new ModelRenderer(this, 50, 410); + this.HornmidR.setRotationPoint(-2.0F, 0.0F, 4.0F); + this.HornmidR.addBox(0.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(HornmidR, 0.0F, 0.045553093477052F, 0.0F); + this.HornbaseL = new ModelRenderer(this, 50, 400); + this.HornbaseL.setRotationPoint(1.5F, 0.3F, -3.8F); + this.HornbaseL.addBox(-1.0F, 0.0F, 0.0F, 3, 2, 4, 0.0F); + this.setRotateAngle(HornbaseL, 0.36425021489121656F, -0.091106186954104F, 0.9560913642424937F); + this.RighttoeR2 = new ModelRenderer(this, 180, 170); + this.RighttoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); + this.RighttoeR2.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(RighttoeR2, -0.40980330836826856F, 0.0F, 0.0F); + this.Wingfinger3left = new ModelRenderer(this, 390, 170); + this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); + this.ShinL = new ModelRenderer(this, 180, 210); + this.ShinL.mirror = true; + this.ShinL.setRotationPoint(-0.7F, 13.0F, 0.0F); + this.ShinL.addBox(-4.0F, 0.0F, 0.0F, 4, 12, 6, 0.0F); + this.setRotateAngle(ShinL, 1.0471975511965976F, 0.0F, 0.136659280431156F); + this.Underlowerjaw3 = new ModelRenderer(this, 5, 420); + this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 4.0F); + this.Underlowerjaw3.addBox(-2.5F, -1.0F, 0.0F, 5, 1, 5, 0.0F); + this.setRotateAngle(Underlowerjaw3, 0.136659280431156F, 0.0F, 0.0F); + this.Wingshoulderright = new ModelRenderer(this, 470, 230); + this.Wingshoulderright.setRotationPoint(-3.0F, 4.0F, 4.0F); + this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderright, 0.5009094953223726F, -0.27314402793711257F, -0.6829473363053812F); + this.shape122 = new ModelRenderer(this, 125, 200); + this.shape122.setRotationPoint(0.0F, 0.0F, 1.0F); + this.shape122.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(shape122, -0.5009094953223726F, 0.0F, 0.136659280431156F); + this.Winglowerarmleft = new ModelRenderer(this, 400, 215); + this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); + this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); + this.Wingmembramelargeright2 = new ModelRenderer(this, 355, 430); + this.Wingmembramelargeright2.mirror = true; + this.Wingmembramelargeright2.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeright2.addBox(-41.0F, 0.0F, 0.0F, 41, 0, 57, 0.0F); + this.Wingfinger3right = new ModelRenderer(this, 390, 170); + this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); + this.Wingfinger1left = new ModelRenderer(this, 350, 200); + this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); + this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1left, 0.0F, -1.593485607070823F, 0.0F); + this.shape134 = new ModelRenderer(this, 125, 200); + this.shape134.setRotationPoint(0.0F, 0.0F, 4.3F); + this.shape134.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(shape134, -0.22759093446006054F, 0.0F, -0.091106186954104F); + this.ToothlowerR1 = new ModelRenderer(this, 50, 420); + this.ToothlowerR1.setRotationPoint(-2.5F, 0.0F, -2.4F); + this.ToothlowerR1.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerR1, 0.0F, 0.0F, -0.31869712141416456F); + this.Tail5 = new ModelRenderer(this, 5, 180); + this.Tail5.setRotationPoint(0.0F, 0.5F, 18.0F); + this.Tail5.addBox(-2.5F, 0.0F, 0.0F, 5, 6, 20, 0.0F); + this.setRotateAngle(Tail5, 0.091106186954104F, 0.0F, 0.0F); + this.shape113 = new ModelRenderer(this, 125, 225); + this.shape113.setRotationPoint(0.0F, 3.4F, -5.6F); + this.shape113.addBox(-2.5F, -4.0F, 0.0F, 5, 4, 4, 0.0F); + this.setRotateAngle(shape113, 0.6609561877302526F, 0.0F, 0.0F); + this.HornbaseR = new ModelRenderer(this, 50, 400); + this.HornbaseR.setRotationPoint(-1.5F, 0.3F, -3.8F); + this.HornbaseR.addBox(-2.0F, 0.0F, 0.0F, 3, 2, 4, 0.0F); + this.setRotateAngle(HornbaseR, 0.36425021489121656F, 0.091106186954104F, -0.9560913642424937F); + this.shape145 = new ModelRenderer(this, 125, 175); + this.shape145.setRotationPoint(-4.0F, 0.0F, 6.0F); + this.shape145.addBox(0.0F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(shape145, -0.36425021489121656F, 0.0F, -0.36425021489121656F); + this.LefttoeL1 = new ModelRenderer(this, 180, 180); + this.LefttoeL1.mirror = true; + this.LefttoeL1.setRotationPoint(-1.8F, 6.0F, -4.0F); + this.LefttoeL1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(LefttoeL1, -0.5462880558742251F, -0.40980330836826856F, -0.18203784098300857F); + this.shape135 = new ModelRenderer(this, 125, 175); + this.shape135.setRotationPoint(0.0F, -5.0F, 2.0F); + this.shape135.addBox(-0.5F, -8.0F, -2.0F, 1, 8, 2, 0.0F); + this.setRotateAngle(shape135, 0.27314402793711257F, 0.0F, -0.136659280431156F); + this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); + this.Headmidhornupperleft.setRotationPoint(1.0F, 0.1F, 4.9F); + this.Headmidhornupperleft.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 6, 0.0F); + this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.22759093446006054F, 0.0F); + this.Winglowerarmright = new ModelRenderer(this, 400, 215); + this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); + this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); + this.ToothL1 = new ModelRenderer(this, 50, 420); + this.ToothL1.setRotationPoint(2.7F, 3.5F, -1.0F); + this.ToothL1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothL1, 0.0F, 0.0F, -0.31869712141416456F); + this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); + this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); + this.ToothL2 = new ModelRenderer(this, 50, 420); + this.ToothL2.setRotationPoint(2.7F, 3.5F, -3.5F); + this.ToothL2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothL2, 0.0F, 0.0F, -0.31869712141416456F); + this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); + this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); + this.shape124 = new ModelRenderer(this, 125, 200); + this.shape124.setRotationPoint(0.0F, 0.0F, 8.0F); + this.shape124.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(shape124, -0.5462880558742251F, 0.0F, 0.0F); + this.shape136 = new ModelRenderer(this, 125, 200); + this.shape136.setRotationPoint(0.0F, 0.0F, 11.0F); + this.shape136.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(shape136, -0.27314402793711257F, 0.0F, 0.0F); + this.Tail8 = new ModelRenderer(this, 5, 220); + this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); + this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); + this.FootR = new ModelRenderer(this, 180, 190); + this.FootR.setRotationPoint(0.01F, 12.0F, 6.0F); + this.FootR.addBox(0.0F, 0.0F, -5.0F, 4, 9, 5, 0.0F); + this.setRotateAngle(FootR, -0.7740535232594852F, 0.0F, 0.0F); + this.BrowfrontR = new ModelRenderer(this, 190, 390); + this.BrowfrontR.setRotationPoint(-3.0F, 0.8F, -9.0F); + this.BrowfrontR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(BrowfrontR, 0.091106186954104F, -0.27314402793711257F, 0.0F); + this.HornendR = new ModelRenderer(this, 50, 430); + this.HornendR.setRotationPoint(0.0F, 0.0F, 5.0F); + this.HornendR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 4, 0.0F); + this.setRotateAngle(HornendR, 0.0F, 0.27314402793711257F, 0.0F); + this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); + this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); + this.Mouthback_MOVE_TO_OPEN = new ModelRenderer(this, 5, 390); + this.Mouthback_MOVE_TO_OPEN.setRotationPoint(0.01F, 3.5F, -0.3F); + this.Mouthback_MOVE_TO_OPEN.addBox(-2.5F, 0.0F, -5.0F, 5, 4, 5, 0.0F); + this.setRotateAngle(Mouthback_MOVE_TO_OPEN, -0.18203784098300857F, 0.0F, 0.0F); + this.Tail7 = new ModelRenderer(this, 5, 240); + this.Tail7.setRotationPoint(0.0F, 0.3F, 19.0F); + this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); + this.setRotateAngle(Tail7, 0.18203784098300857F, 0.0F, 0.0F); + this.ToothR2 = new ModelRenderer(this, 50, 420); + this.ToothR2.setRotationPoint(-2.7F, 3.5F, -3.5F); + this.ToothR2.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothR2, 0.0F, 0.0F, 0.31869712141416456F); + this.Upperjaw = new ModelRenderer(this, 5, 370); + this.Upperjaw.setRotationPoint(-0.01F, 0.7F, -0.1F); + this.Upperjaw.addBox(-3.0F, 0.0F, -8.0F, 6, 5, 10, 0.0F); + this.setRotateAngle(Upperjaw, -0.091106186954104F, 0.0F, 0.0F); + this.Underlowerjaw = new ModelRenderer(this, 5, 440); + this.Underlowerjaw.setRotationPoint(0.0F, 1.0F, 0.0F); + this.Underlowerjaw.addBox(-2.0F, -1.0F, -6.0F, 4, 1, 6, 0.0F); + this.setRotateAngle(Underlowerjaw, -0.045553093477052F, 0.0F, 0.0F); + this.ToothlowerR3 = new ModelRenderer(this, 50, 420); + this.ToothlowerR3.setRotationPoint(-2.5F, 0.0F, -6.9F); + this.ToothlowerR3.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerR3, 0.18203784098300857F, 0.0F, -0.31869712141416456F); + this.Wingfinger2right = new ModelRenderer(this, 330, 150); + this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); + this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); + this.ToothR4 = new ModelRenderer(this, 50, 420); + this.ToothR4.setRotationPoint(-2.7F, 3.6F, -8.0F); + this.ToothR4.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothR4, -0.18203784098300857F, 0.0F, 0.31869712141416456F); + this.MidtoeL2 = new ModelRenderer(this, 180, 170); + this.MidtoeL2.mirror = true; + this.MidtoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); + this.MidtoeL2.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(MidtoeL2, -0.4553564018453205F, 0.0F, 0.0F); + this.ToothR3 = new ModelRenderer(this, 50, 420); + this.ToothR3.setRotationPoint(-2.7F, 3.5F, -6.0F); + this.ToothR3.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothR3, 0.0F, 0.0F, 0.31869712141416456F); + this.Neck2 = new ModelRenderer(this, 5, 299); + this.Neck2.setRotationPoint(0.0F, 0.7F, -6.0F); + this.Neck2.addBox(-3.5F, 0.0F, -6.0F, 7, 11, 9, 0.0F); + this.setRotateAngle(Neck2, 0.045553093477052F, 0.0F, 0.0F); + this.Headtop = new ModelRenderer(this, 5, 355); + this.Headtop.setRotationPoint(0.01F, 0.2F, -7.0F); + this.Headtop.addBox(-3.0F, 0.0F, -8.0F, 6, 4, 8, 0.0F); + this.setRotateAngle(Headtop, 0.045553093477052F, 0.0F, 0.0F); + this.ToothlowerL1 = new ModelRenderer(this, 50, 420); + this.ToothlowerL1.setRotationPoint(2.5F, 0.0F, -2.4F); + this.ToothlowerL1.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(ToothlowerL1, 0.0F, 0.0F, 0.31869712141416456F); + this.Rfinger1 = new ModelRenderer(this, 350, 140); + this.Rfinger1.setRotationPoint(-24.0F, 2.0F, 3.0F); + this.Rfinger1.addBox(0.0F, 0.0F, -5.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Rfinger1, 0.31869712141416456F, 1.0016444577195458F, 0.0F); + this.HornmidL = new ModelRenderer(this, 50, 410); + this.HornmidL.setRotationPoint(2.0F, 0.0F, 4.0F); + this.HornmidL.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(HornmidL, 0.0F, -0.045553093477052F, 0.0F); + this.MidtoeR1 = new ModelRenderer(this, 180, 180); + this.MidtoeR1.setRotationPoint(2.0F, 6.1F, -4.0F); + this.MidtoeR1.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(MidtoeR1, -0.6373942428283291F, 0.0F, 0.0F); + this.Wingfinger2left = new ModelRenderer(this, 330, 150); + this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); + this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); + this.MidtoeR2 = new ModelRenderer(this, 180, 170); + this.MidtoeR2.setRotationPoint(-0.01F, 3.6F, 0.3F); + this.MidtoeR2.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(MidtoeR2, -0.4553564018453205F, 0.0F, 0.0F); + this.LefttoeL2 = new ModelRenderer(this, 180, 170); + this.LefttoeL2.mirror = true; + this.LefttoeL2.setRotationPoint(0.01F, 3.6F, 0.3F); + this.LefttoeL2.addBox(0.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(LefttoeL2, -0.40980330836826856F, 0.0F, 0.0F); + this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerleft.setRotationPoint(2.5F, 2.7F, -3.9F); + this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Headmidhornlowerleft, 0.31869712141416456F, 0.31869712141416456F, 0.9560913642424937F); + this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); + this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); + this.shape148 = new ModelRenderer(this, 125, 175); + this.shape148.setRotationPoint(-2.0F, 0.2F, 11.3F); + this.shape148.addBox(-1.0F, -4.0F, 0.0F, 1, 4, 2, 0.0F); + this.setRotateAngle(shape148, 0.0F, 0.0F, 0.091106186954104F); + this.Bodyfront.addChild(this.Wingshoulderleft); + this.Lowerjaw.addChild(this.ToothlowerR3_1); + this.ShinL.addChild(this.FootL); + this.Neck2.addChild(this.Neck3); + this.Underlowerjaw2.addChild(this.shape108); + this.RighttoeL1.addChild(this.RighttoeL2); + this.LTailSpike.addChild(this.LTailMembrane); + this.Wingupperarmright.addChild(this.Wingmembramesmallright); + this.Bodyfront.addChild(this.shape144); + this.Tail1.addChild(this.shape152); + this.Headmidhornlowerright.addChild(this.Headmidhornupperright); + this.Winglowerarmleft.addChild(this.Lfinger1); + this.Tail1.addChild(this.shape150); + this.Upperjaw.addChild(this.ToothR1); + this.ThighR.addChild(this.ShinR); + this.Lfinger1.addChild(this.Lfinger2); + this.Tail2.addChild(this.shape142); + this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); + this.Wingfingerlower1left.addChild(this.Wingmembramelargeleft2); + this.Upperjaw.addChild(this.ToothL3); + this.HornmidL.addChild(this.HornendL); + this.Tail1.addChild(this.ThighL); + this.FootR.addChild(this.RighttoeR1); + this.Winglowerarmright.addChild(this.Wingfinger1right); + this.Head1.addChild(this.BrowfrontL); + this.Tail1.addChild(this.Tail2); + this.Tail3.addChild(this.shape143); + this.Upperjaw.addChild(this.ToothL4); + this.Bodyfront.addChild(this.shape146); + this.shape122.addChild(this.shape123); + this.FootL.addChild(this.RighttoeL1); + this.Lowerjawback.addChild(this.Underlowerjaw2); + this.Tail8.addChild(this.RTailSpike); + this.Wingshoulderleft.addChild(this.Wingupperarmleft); + this.Wingfinger1left.addChild(this.Wingmembramelargeleft1); + this.Tail8.addChild(this.LTailSpike); + this.Bodyfront.addChild(this.shape153); + this.Tail1.addChild(this.shape154); + this.Winglowerarmright.addChild(this.Wingmembramemidright); + this.BrowfrontL.addChild(this.BrowbackL); + this.Bodyfront.addChild(this.shape149); + this.FootR.addChild(this.LefttoeR1); + this.Lowerjawback.addChild(this.Lowerjaw); + this.Bodyfront.addChild(this.shape147); + this.shape140.addChild(this.shape141); + this.Tail1.addChild(this.shape151); + this.Lowerjaw.addChild(this.ToothlowerL2); + this.Tail3.addChild(this.Tail4); + this.Wingfinger1right.addChild(this.Wingfingerlower1right); + this.shape124.addChild(this.shape125); + this.Bodyfront.addChild(this.Tail1); + this.RTailSpike.addChild(this.RTailMembrane); + this.Wingshoulderright.addChild(this.Wingupperarmright); + this.Mouthback_MOVE_TO_OPEN.addChild(this.Lowerjawback); + this.shape125.addChild(this.shape126); + this.Wingfinger2right.addChild(this.Wingfingerlower2right); + this.Tail1.addChild(this.shape138); + this.Tail1.addChild(this.ThighR); + this.Neck3.addChild(this.Head1); + this.Tail2.addChild(this.Tail3); + this.Bodyfront.addChild(this.shape127); + this.Tail1.addChild(this.shape155); + this.shape136.addChild(this.shape137); + this.Wingfinger1right.addChild(this.Wingmembramelargeright1); + this.Bodyfront.addChild(this.Neck1); + this.shape114.addChild(this.shape115); + this.Tail2.addChild(this.shape140); + this.FootL.addChild(this.MidtoeL1); + this.Head1.addChild(this.Headmidhornlowerright); + this.shape113.addChild(this.shape114); + this.BrowfrontR.addChild(this.RBrowback); + this.shape127.addChild(this.shape128); + this.LefttoeR1.addChild(this.LefttoeR2); + this.shape128.addChild(this.shape129); + this.Rfinger1.addChild(this.Rfinger2); + this.Winglowerarmleft.addChild(this.Wingmembramemidleft); + this.shape138.addChild(this.shape139); + this.Lowerjaw.addChild(this.ToothlowerR2); + this.HornbaseR.addChild(this.HornmidR); + this.Head1.addChild(this.HornbaseL); + this.RighttoeR1.addChild(this.RighttoeR2); + this.Wingfinger1left.addChild(this.Wingfinger3left); + this.ThighL.addChild(this.ShinL); + this.Underlowerjaw2.addChild(this.Underlowerjaw3); + this.Bodyfront.addChild(this.Wingshoulderright); + this.Bodyfront.addChild(this.shape122); + this.Wingupperarmleft.addChild(this.Winglowerarmleft); + this.Wingfingerlower1right.addChild(this.Wingmembramelargeright2); + this.Wingfinger1right.addChild(this.Wingfinger3right); + this.Winglowerarmleft.addChild(this.Wingfinger1left); + this.Tail1.addChild(this.shape134); + this.Lowerjaw.addChild(this.ToothlowerR1); + this.Tail4.addChild(this.Tail5); + this.Headtop.addChild(this.shape113); + this.Head1.addChild(this.HornbaseR); + this.Bodyfront.addChild(this.shape145); + this.FootL.addChild(this.LefttoeL1); + this.shape134.addChild(this.shape135); + this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); + this.Wingupperarmright.addChild(this.Winglowerarmright); + this.Upperjaw.addChild(this.ToothL1); + this.Wingfinger3left.addChild(this.Wingfingerlower3left); + this.Upperjaw.addChild(this.ToothL2); + this.Wingfinger2left.addChild(this.Wingfingerlower2left); + this.Bodyfront.addChild(this.shape124); + this.Tail1.addChild(this.shape136); + this.Tail7.addChild(this.Tail8); + this.ShinR.addChild(this.FootR); + this.Head1.addChild(this.BrowfrontR); + this.HornmidR.addChild(this.HornendR); + this.Wingfinger3right.addChild(this.Wingfingerlower3right); + this.Head1.addChild(this.Mouthback_MOVE_TO_OPEN); + this.Tail5.addChild(this.Tail7); + this.Upperjaw.addChild(this.ToothR2); + this.Headtop.addChild(this.Upperjaw); + this.Lowerjaw.addChild(this.Underlowerjaw); + this.Lowerjaw.addChild(this.ToothlowerR3); + this.Wingfinger1right.addChild(this.Wingfinger2right); + this.Upperjaw.addChild(this.ToothR4); + this.MidtoeL1.addChild(this.MidtoeL2); + this.Upperjaw.addChild(this.ToothR3); + this.Neck1.addChild(this.Neck2); + this.Head1.addChild(this.Headtop); + this.Lowerjaw.addChild(this.ToothlowerL1); + this.Winglowerarmright.addChild(this.Rfinger1); + this.HornbaseL.addChild(this.HornmidL); + this.FootR.addChild(this.MidtoeR1); + this.Wingfinger1left.addChild(this.Wingfinger2left); + this.MidtoeR1.addChild(this.MidtoeR2); + this.LefttoeL1.addChild(this.LefttoeL2); + this.Head1.addChild(this.Headmidhornlowerleft); + this.Wingfinger1left.addChild(this.Wingfingerlower1left); + this.Bodyfront.addChild(this.shape148); + } - public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { - modelRenderer.rotateAngleX = x; - modelRenderer.rotateAngleY = y; - modelRenderer.rotateAngleZ = z; - } + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); - this.Bodyfront.render(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); + this.Bodyfront.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, - float head4) { - super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); - float wingFlap = (float) Math.toRadians(dragon.wingFlap()); - float jawAngle = (float) Math.toRadians(dragon.getJawMove()); - float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); + public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, + float head4) { + super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); + float wingFlap = (float) Math.toRadians(dragon.wingFlap()); + float jawAngle = (float) Math.toRadians(dragon.getJawMove()); + float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); - this.Head1.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; - this.Head1.rotateAngleY = neckY / (180F / (float) Math.PI); + this.Head1.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; + this.Head1.rotateAngleY = neckY / (180F / (float) Math.PI); - this.Mouthback_MOVE_TO_OPEN.rotateAngleX = jawAngle - (3.141F / 9F); - // this.Tail1.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - // this.Tail3.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - // this.Tail4.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + this.Mouthback_MOVE_TO_OPEN.rotateAngleX = jawAngle - (3.141F / 9F); + // this.Tail1.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail3.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail4.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - if (!dragon.isTerrestrial()) // Fly - { - if (!dragon.onGround) { - float angle = (float) Math.toRadians(dragon.getVertTailAngle()); - this.Bodyfront.rotateAngleX = 0.546F - angle; - } else { - this.Bodyfront.rotateAngleX = 0.5462880558742251F; - } + if (!dragon.isTerrestrial()) // Fly + { + if (!dragon.onGround) { + float angle = (float) Math.toRadians(dragon.getVertTailAngle()); + this.Bodyfront.rotateAngleX = 0.546F - angle; + } else { + this.Bodyfront.rotateAngleX = 0.5462880558742251F; + } - if (dragon.motionY < -0.01F)// Glide - { - wingFlap = 0; - } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover - { - wingFlap = (float) Math.toRadians(dragon.wingFlap()); - } else { - wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move - } - this.Wingshoulderleft.rotateAngleZ = wingFlap * 0.25F; - this.Wingshoulderright.rotateAngleZ = -(wingFlap * 0.25F); - this.Wingshoulderleft.rotateAngleX = 0.5F; - this.Wingshoulderright.rotateAngleX = 0.5F; - } else // Walk - { - this.Bodyfront.rotateAngleX = 0.5462880558742251F; - // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); - // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); + if (dragon.motionY < -0.01F)// Glide + { + wingFlap = 0; + } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover + { + wingFlap = (float) Math.toRadians(dragon.wingFlap()); + } else { + wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move + } + this.Wingshoulderleft.rotateAngleZ = wingFlap * 0.25F; + this.Wingshoulderright.rotateAngleZ = -(wingFlap * 0.25F); + this.Wingshoulderleft.rotateAngleX = 0.5F; + this.Wingshoulderright.rotateAngleX = 0.5F; + } else // Walk + { + this.Bodyfront.rotateAngleX = 0.5462880558742251F; + // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); + // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); - this.ThighR.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - this.ThighL.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.ThighR.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + this.ThighL.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - if (dragon.onGround) { - this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); - this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); - this.Wingshoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Wingshoulderright.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - } - } - } + if (dragon.onGround) { + this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); + this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); + this.Wingshoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Wingshoulderright.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + } + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelDragon.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelDragon.java index 948afe2b..78a4244b 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelDragon.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelDragon.java @@ -7,884 +7,884 @@ import net.minecraft.util.MathHelper; public class ModelDragon extends ModelBase { - public ModelRenderer Body; - public ModelRenderer Tail1; - public ModelRenderer Neckbase; - public ModelRenderer shape16; - public ModelRenderer Wingshoulderleft; - public ModelRenderer Shoulderleft; - public ModelRenderer Shoulderleft_1; - public ModelRenderer Spikebase1; - public ModelRenderer Spikebase2; - public ModelRenderer Spkebase3; - public ModelRenderer Spikebase4; - public ModelRenderer Wingshoulderright; - public ModelRenderer Tail3; - public ModelRenderer Righthip; - public ModelRenderer Lefthip; - public ModelRenderer Spikebase5; - public ModelRenderer Spikebase6; - public ModelRenderer Spikebase7; - public ModelRenderer Spiketop10; - public ModelRenderer Tail4; - public ModelRenderer Spiketop11; - public ModelRenderer Spiketop12; - public ModelRenderer Spiketop13; - public ModelRenderer Tail6; - public ModelRenderer Spiketop14; - public ModelRenderer Spiketop15; - public ModelRenderer Spiketop16; - public ModelRenderer Tail7; - public ModelRenderer Spiketop17; - public ModelRenderer Spiketop18; - public ModelRenderer Spiketop19; - public ModelRenderer Tail8; - public ModelRenderer LTailSpike; - public ModelRenderer RTailSpike; - public ModelRenderer LTailMembrane; - public ModelRenderer RTailMembrane; - public ModelRenderer RightLeg; - public ModelRenderer RightFoot; - public ModelRenderer Righttoemid; - public ModelRenderer Righttoeleft; - public ModelRenderer Righttoeright; - public ModelRenderer Outertoelowerright; - public ModelRenderer Righttoelowermid; - public ModelRenderer Righttoelowerleft; - public ModelRenderer Righttoelowerright; - public ModelRenderer Outertoelowerright_1; - public ModelRenderer Rightleg; - public ModelRenderer Rightfoot; - public ModelRenderer Lefttoemid; - public ModelRenderer Lefttoeright; - public ModelRenderer Lefttoeleft; - public ModelRenderer Outertoeleft; - public ModelRenderer Lefttoelowermid; - public ModelRenderer Lefttoelowerright; - public ModelRenderer Lefttoelowerleft; - public ModelRenderer Outertoelowerleft; - public ModelRenderer Spiketop7; - public ModelRenderer Spiketop8; - public ModelRenderer Spiketop9; - public ModelRenderer Neckmid; - public ModelRenderer Spiketop2; - public ModelRenderer Neckend; - public ModelRenderer Spiketop1; - public ModelRenderer Headback; - public ModelRenderer Snout; - public ModelRenderer Lowerjaw; - public ModelRenderer Headlargehornlowerleft; - public ModelRenderer Headlargehornlowerright; - public ModelRenderer Smallheadhornleft2; - public ModelRenderer Smallheadhornright2; - public ModelRenderer Smallheadhornleft1; - public ModelRenderer Smallheadhornright1; - public ModelRenderer Headmidhornlowerleft; - public ModelRenderer Headmidhornlowerright; - public ModelRenderer Tooth5; - public ModelRenderer Tooth4; - public ModelRenderer Tooth3; - public ModelRenderer Tooth2; - public ModelRenderer Tooth1; - public ModelRenderer Tooth6; - public ModelRenderer Tooth7; - public ModelRenderer Tooth8; - public ModelRenderer Tooth9; - public ModelRenderer Tooth10; - public ModelRenderer Headlargehornupperleft; - public ModelRenderer Headlargehornupperright; - public ModelRenderer Smallheadhornleft3; - public ModelRenderer Smallheadhornright3; - public ModelRenderer Headmidhornupperleft; - public ModelRenderer Headmidhornupperright; - public ModelRenderer Wingupperarmleft; - public ModelRenderer Winglowerarmleft; - public ModelRenderer Wingmembramesmallleft; - public ModelRenderer Wingfinger1left; - public ModelRenderer Wingmembramemidleft; - public ModelRenderer Wingfingerlower1left; - public ModelRenderer Wingfinger2left; - public ModelRenderer Wingfinger3left; - public ModelRenderer Wingmembramelargeleft; - public ModelRenderer Wingfingerlower2left; - public ModelRenderer Wingfingerlower3left; - public ModelRenderer Lowerarmleft; - public ModelRenderer Lefthandrightfinger; - public ModelRenderer Lefthandmidfinger; - public ModelRenderer Lefthandrightfinger_1; - public ModelRenderer Thumbtoeupperleft; - public ModelRenderer Clawlefthandright; - public ModelRenderer Clawlefthandmid; - public ModelRenderer Clawlefthandleft; - public ModelRenderer Thumbtoelowerleft; - public ModelRenderer Lowerarmleft_1; - public ModelRenderer Righthandleftfinger; - public ModelRenderer Righthandmidfinger; - public ModelRenderer Righthandrightfinger; - public ModelRenderer Thumbtoeupperright; - public ModelRenderer Clawrighthandleft; - public ModelRenderer Clawrighthandmid; - public ModelRenderer Clawrighthandright; - public ModelRenderer Thumbtoelowerright; - public ModelRenderer Spiketop3; - public ModelRenderer Spiketop4; - public ModelRenderer Spiketop5; - public ModelRenderer Spiketop6; - public ModelRenderer Wingupperarmright; - public ModelRenderer Winglowerarmright; - public ModelRenderer Wingmembramesmallright; - public ModelRenderer Wingfinger1right; - public ModelRenderer Wingmembramemidright; - public ModelRenderer Wingfinger2right; - public ModelRenderer Wingfinger3right; - public ModelRenderer Wingfingerlower1right; - public ModelRenderer Wingmembramelargeright; - public ModelRenderer Wingfingerlower2right; - public ModelRenderer Wingfingerlower3right; + public ModelRenderer Body; + public ModelRenderer Tail1; + public ModelRenderer Neckbase; + public ModelRenderer shape16; + public ModelRenderer Wingshoulderleft; + public ModelRenderer Shoulderleft; + public ModelRenderer Shoulderleft_1; + public ModelRenderer Spikebase1; + public ModelRenderer Spikebase2; + public ModelRenderer Spkebase3; + public ModelRenderer Spikebase4; + public ModelRenderer Wingshoulderright; + public ModelRenderer Tail3; + public ModelRenderer Righthip; + public ModelRenderer Lefthip; + public ModelRenderer Spikebase5; + public ModelRenderer Spikebase6; + public ModelRenderer Spikebase7; + public ModelRenderer Spiketop10; + public ModelRenderer Tail4; + public ModelRenderer Spiketop11; + public ModelRenderer Spiketop12; + public ModelRenderer Spiketop13; + public ModelRenderer Tail6; + public ModelRenderer Spiketop14; + public ModelRenderer Spiketop15; + public ModelRenderer Spiketop16; + public ModelRenderer Tail7; + public ModelRenderer Spiketop17; + public ModelRenderer Spiketop18; + public ModelRenderer Spiketop19; + public ModelRenderer Tail8; + public ModelRenderer LTailSpike; + public ModelRenderer RTailSpike; + public ModelRenderer LTailMembrane; + public ModelRenderer RTailMembrane; + public ModelRenderer RightLeg; + public ModelRenderer RightFoot; + public ModelRenderer Righttoemid; + public ModelRenderer Righttoeleft; + public ModelRenderer Righttoeright; + public ModelRenderer Outertoelowerright; + public ModelRenderer Righttoelowermid; + public ModelRenderer Righttoelowerleft; + public ModelRenderer Righttoelowerright; + public ModelRenderer Outertoelowerright_1; + public ModelRenderer Rightleg; + public ModelRenderer Rightfoot; + public ModelRenderer Lefttoemid; + public ModelRenderer Lefttoeright; + public ModelRenderer Lefttoeleft; + public ModelRenderer Outertoeleft; + public ModelRenderer Lefttoelowermid; + public ModelRenderer Lefttoelowerright; + public ModelRenderer Lefttoelowerleft; + public ModelRenderer Outertoelowerleft; + public ModelRenderer Spiketop7; + public ModelRenderer Spiketop8; + public ModelRenderer Spiketop9; + public ModelRenderer Neckmid; + public ModelRenderer Spiketop2; + public ModelRenderer Neckend; + public ModelRenderer Spiketop1; + public ModelRenderer Headback; + public ModelRenderer Snout; + public ModelRenderer Lowerjaw; + public ModelRenderer Headlargehornlowerleft; + public ModelRenderer Headlargehornlowerright; + public ModelRenderer Smallheadhornleft2; + public ModelRenderer Smallheadhornright2; + public ModelRenderer Smallheadhornleft1; + public ModelRenderer Smallheadhornright1; + public ModelRenderer Headmidhornlowerleft; + public ModelRenderer Headmidhornlowerright; + public ModelRenderer Tooth5; + public ModelRenderer Tooth4; + public ModelRenderer Tooth3; + public ModelRenderer Tooth2; + public ModelRenderer Tooth1; + public ModelRenderer Tooth6; + public ModelRenderer Tooth7; + public ModelRenderer Tooth8; + public ModelRenderer Tooth9; + public ModelRenderer Tooth10; + public ModelRenderer Headlargehornupperleft; + public ModelRenderer Headlargehornupperright; + public ModelRenderer Smallheadhornleft3; + public ModelRenderer Smallheadhornright3; + public ModelRenderer Headmidhornupperleft; + public ModelRenderer Headmidhornupperright; + public ModelRenderer Wingupperarmleft; + public ModelRenderer Winglowerarmleft; + public ModelRenderer Wingmembramesmallleft; + public ModelRenderer Wingfinger1left; + public ModelRenderer Wingmembramemidleft; + public ModelRenderer Wingfingerlower1left; + public ModelRenderer Wingfinger2left; + public ModelRenderer Wingfinger3left; + public ModelRenderer Wingmembramelargeleft; + public ModelRenderer Wingfingerlower2left; + public ModelRenderer Wingfingerlower3left; + public ModelRenderer Lowerarmleft; + public ModelRenderer Lefthandrightfinger; + public ModelRenderer Lefthandmidfinger; + public ModelRenderer Lefthandrightfinger_1; + public ModelRenderer Thumbtoeupperleft; + public ModelRenderer Clawlefthandright; + public ModelRenderer Clawlefthandmid; + public ModelRenderer Clawlefthandleft; + public ModelRenderer Thumbtoelowerleft; + public ModelRenderer Lowerarmleft_1; + public ModelRenderer Righthandleftfinger; + public ModelRenderer Righthandmidfinger; + public ModelRenderer Righthandrightfinger; + public ModelRenderer Thumbtoeupperright; + public ModelRenderer Clawrighthandleft; + public ModelRenderer Clawrighthandmid; + public ModelRenderer Clawrighthandright; + public ModelRenderer Thumbtoelowerright; + public ModelRenderer Spiketop3; + public ModelRenderer Spiketop4; + public ModelRenderer Spiketop5; + public ModelRenderer Spiketop6; + public ModelRenderer Wingupperarmright; + public ModelRenderer Winglowerarmright; + public ModelRenderer Wingmembramesmallright; + public ModelRenderer Wingfinger1right; + public ModelRenderer Wingmembramemidright; + public ModelRenderer Wingfinger2right; + public ModelRenderer Wingfinger3right; + public ModelRenderer Wingfingerlower1right; + public ModelRenderer Wingmembramelargeright; + public ModelRenderer Wingfingerlower2right; + public ModelRenderer Wingfingerlower3right; - public ModelDragon() { - this.textureWidth = 512; - this.textureHeight = 512; - this.Righttoeleft = new ModelRenderer(this, 290, 280); - this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); - this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); - this.Spiketop6 = new ModelRenderer(this, 300, 460); - this.Spiketop6.setRotationPoint(0.0F, 0.0F, 0.1F); - this.Spiketop6.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop6, -0.136659280431156F, 0.0F, 0.0F); - this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); - this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); - this.Spiketop4 = new ModelRenderer(this, 300, 460); - this.Spiketop4.setRotationPoint(0.0F, -3.0F, 0.1F); - this.Spiketop4.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop4, -0.27314402793711257F, 0.0F, 0.0F); - this.Wingmembramesmallleft = new ModelRenderer(this, 420, 255); - this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.6F, -1.0F); - this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); - this.Spiketop1 = new ModelRenderer(this, 300, 460); - this.Spiketop1.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Spiketop1.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop1, -0.091106186954104F, 0.0F, 0.0F); - this.Snout = new ModelRenderer(this, 120, 365); - this.Snout.setRotationPoint(0.0F, 0.01F, -8.0F); - this.Snout.addBox(-3.0F, 0.0F, -12.0F, 6, 6, 12, 0.0F); - this.setRotateAngle(Snout, 0.045553093477052F, 0.0F, 0.015485315777647711F); - this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); - this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); - this.Rightfoot = new ModelRenderer(this, 260, 255); - this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); - this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Smallheadhornleft1 = new ModelRenderer(this, 190, 420); - this.Smallheadhornleft1.setRotationPoint(0.4F, 0.0F, -1.0F); - this.Smallheadhornleft1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornleft1, 0.18203784098300857F, 0.22759093446006054F, 0.18203784098300857F); - this.Wingfinger3left = new ModelRenderer(this, 390, 170); - this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); - this.Tooth10 = new ModelRenderer(this, 180, 500); - this.Tooth10.setRotationPoint(-2.7F, 4.8F, -10.7F); - this.Tooth10.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth10, 0.6829473363053812F, -1.9123572614101867F, -0.31869712141416456F); - this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); - this.Headmidhornupperleft.setRotationPoint(0.0F, 0.1F, 3.9F); - this.Headmidhornupperleft.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); - this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.136659280431156F, 0.0F); - this.Righttoeright = new ModelRenderer(this, 290, 280); - this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); - this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); - this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerright.setRotationPoint(-3.0F, 2.0F, -4.0F); - this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Headmidhornlowerright, -0.136659280431156F, -0.5462880558742251F, 0.0F); - this.Spikebase6 = new ModelRenderer(this, 300, 440); - this.Spikebase6.setRotationPoint(0.0F, 1.0F, 12.0F); - this.Spikebase6.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Spikebase6, -0.27314402793711257F, 0.0F, 0.0F); - this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); - this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); - this.Spiketop14 = new ModelRenderer(this, 300, 460); - this.Spiketop14.setRotationPoint(0.0F, 0.0F, 4.5F); - this.Spiketop14.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); - this.setRotateAngle(Spiketop14, -0.40980330836826856F, 0.0F, 0.0F); - this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); - this.Headlargehornupperleft.setRotationPoint(1.1F, 0.1F, 6.7F); - this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 7, 0.0F); - this.setRotateAngle(Headlargehornupperleft, 0.0F, -0.5918411493512771F, 0.0F); - this.Spiketop3 = new ModelRenderer(this, 300, 460); - this.Spiketop3.setRotationPoint(0.0F, -1.0F, 0.1F); - this.Spiketop3.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop3, -0.22759093446006054F, 0.0F, 0.0F); - this.Wingfinger3right = new ModelRenderer(this, 390, 170); - this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); - this.Tooth1 = new ModelRenderer(this, 180, 500); - this.Tooth1.setRotationPoint(2.8F, 5.0F, -5.2F); - this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); - this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); - this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); - this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornright3.setRotationPoint(1.0F, 1.0F, 0.0F); - this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Smallheadhornright3, -0.27314402793711257F, 0.0F, 0.0F); - this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); - this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); - this.Righthip = new ModelRenderer(this, 260, 300); - this.Righthip.setRotationPoint(-6.0F, 3.0F, 15.0F); - this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Righthip, -0.27314402793711257F, -0.27314402793711257F, 0.18203784098300857F); - this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornleft3.setRotationPoint(-1.0F, 1.0F, 0.0F); - this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Smallheadhornleft3, -0.27314402793711257F, 0.0F, 0.0F); - this.Spiketop12 = new ModelRenderer(this, 300, 460); - this.Spiketop12.setRotationPoint(0.0F, 1.5F, 12.0F); - this.Spiketop12.addBox(-0.5F, -10.0F, 0.0F, 1, 10, 2, 0.0F); - this.setRotateAngle(Spiketop12, -0.36425021489121656F, 0.0F, 0.0F); - this.Headmidhornupperright = new ModelRenderer(this, 190, 430); - this.Headmidhornupperright.setRotationPoint(0.0F, 0.1F, 3.9F); - this.Headmidhornupperright.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); - this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.136659280431156F, 0.0F); - this.Tooth6 = new ModelRenderer(this, 180, 500); - this.Tooth6.setRotationPoint(-0.5F, 5.0F, -11.0F); - this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); - this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); - this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); - this.Body = new ModelRenderer(this, 5, 460); - this.Body.setRotationPoint(0.0F, -4.0F, -20.0F); - this.Body.addBox(-9.0F, 0.0F, 0.0F, 18, 18, 23, 0.0F); - this.setRotateAngle(Body, 0.5462880558742251F, 0.0F, 0.0F); - this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); - this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); - this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); - this.Spiketop15 = new ModelRenderer(this, 300, 460); - this.Spiketop15.setRotationPoint(0.0F, 3.6F, 9.0F); - this.Spiketop15.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); - this.setRotateAngle(Spiketop15, -0.18203784098300857F, 0.0F, 0.0F); - this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); - this.Lowerarmleft_1.setRotationPoint(-3.01F, 8.0F, -2.0F); - this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, 0.0F, 0.0F); - this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerright.setRotationPoint(-1.6F, 0.0F, -2.0F); - this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 8, 0.0F); - this.setRotateAngle(Headlargehornlowerright, 0.18203784098300857F, -0.22759093446006054F, - -0.36425021489121656F); - this.Wingshoulderright = new ModelRenderer(this, 470, 230); - this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 12.0F); - this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); - this.Spiketop11 = new ModelRenderer(this, 300, 460); - this.Spiketop11.setRotationPoint(0.0F, 1.5F, 8.0F); - this.Spiketop11.addBox(-0.5F, -11.0F, -1.0F, 1, 11, 2, 0.0F); - this.setRotateAngle(Spiketop11, -0.36425021489121656F, 0.0F, 0.0F); - this.Clawrighthandright = new ModelRenderer(this, 200, 260); - this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); - this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); - this.Lefttoelowermid = new ModelRenderer(this, 290, 270); - this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); - this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornleft2.setRotationPoint(4.0F, 5.0F, -3.0F); - this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); - this.Clawlefthandright = new ModelRenderer(this, 200, 260); - this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); - this.Spiketop8 = new ModelRenderer(this, 300, 460); - this.Spiketop8.setRotationPoint(0.0F, -3.0F, 0.1F); - this.Spiketop8.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop8, -0.045553093477052F, 0.0F, 0.0F); - this.RTailMembrane = new ModelRenderer(this, 381, 270); - this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); - this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); - this.Righthandrightfinger = new ModelRenderer(this, 220, 260); - this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); - this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); - this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); - this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); - this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); - this.Tail1 = new ModelRenderer(this, 5, 370); - this.Tail1.setRotationPoint(0.0F, 1.0F, 23.0F); - this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); - this.setRotateAngle(Tail1, -0.8196066167365371F, 0.0F, 0.0F); - this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornright2.setRotationPoint(-4.0F, 5.0F, -3.0F); - this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); - this.Spiketop5 = new ModelRenderer(this, 300, 460); - this.Spiketop5.setRotationPoint(0.0F, -7.0F, 2.1F); - this.Spiketop5.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); - this.setRotateAngle(Spiketop5, -0.136659280431156F, 0.0F, 0.0F); - this.Lefttoelowerright = new ModelRenderer(this, 290, 270); - this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); - this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Wingmembramelargeright = new ModelRenderer(this, 270, 430); - this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Spiketop9 = new ModelRenderer(this, 300, 460); - this.Spiketop9.setRotationPoint(0.0F, -0.5F, 0.1F); - this.Spiketop9.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); - this.setRotateAngle(Spiketop9, -0.045553093477052F, 0.0F, 0.0F); - this.Winglowerarmleft = new ModelRenderer(this, 400, 215); - this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); - this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); - this.Tail8 = new ModelRenderer(this, 5, 220); - this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); - this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); - this.Tooth4 = new ModelRenderer(this, 180, 500); - this.Tooth4.setRotationPoint(2.6F, 4.8F, -10.7F); - this.Tooth4.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth4, 0.6829473363053812F, 1.8668041679331349F, 0.31869712141416456F); - this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); - this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); - this.RTailSpike = new ModelRenderer(this, 350, 300); - this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); - this.Outertoelowerright = new ModelRenderer(this, 320, 280); - this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); - this.Wingfinger1left = new ModelRenderer(this, 350, 200); - this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); - this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); - this.Clawlefthandmid = new ModelRenderer(this, 200, 260); - this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Righttoelowerleft = new ModelRenderer(this, 290, 270); - this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); - this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.Shoulderleft = new ModelRenderer(this, 220, 300); - this.Shoulderleft.setRotationPoint(8.0F, 8.0F, 6.0F); - this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); - this.Wingupperarmleft = new ModelRenderer(this, 390, 230); - this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); - this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); - this.LTailMembrane = new ModelRenderer(this, 380, 250); - this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); - this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); - this.Tooth3 = new ModelRenderer(this, 180, 500); - this.Tooth3.setRotationPoint(2.7F, 5.0F, -9.1F); - this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); - this.Tooth2 = new ModelRenderer(this, 180, 500); - this.Tooth2.setRotationPoint(2.8F, 5.0F, -7.0F); - this.Tooth2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth2, -0.045553093477052F, 0.045553093477052F, -0.31869712141416456F); - this.Neckend = new ModelRenderer(this, 120, 420); - this.Neckend.setRotationPoint(0.0F, 0.0F, -11.0F); - this.Neckend.addBox(-3.5F, 1.0F, -7.0F, 7, 9, 10, 0.0F); - this.setRotateAngle(Neckend, 0.27314402793711257F, 0.0F, 0.0F); - this.Spiketop16 = new ModelRenderer(this, 300, 460); - this.Spiketop16.setRotationPoint(0.0F, 3.5F, 14.0F); - this.Spiketop16.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop16, -0.091106186954104F, 0.0F, 0.0F); - this.Headlargehornupperright = new ModelRenderer(this, 190, 470); - this.Headlargehornupperright.setRotationPoint(-1.1F, 0.1F, 6.7F); - this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 7, 0.0F); - this.setRotateAngle(Headlargehornupperright, 0.0F, 0.5918411493512771F, 0.0F); - this.Righttoelowermid = new ModelRenderer(this, 290, 270); - this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); - this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Neckmid = new ModelRenderer(this, 120, 445); - this.Neckmid.setRotationPoint(0.0F, 1.0F, -12.0F); - this.Neckmid.addBox(-4.5F, 0.0F, -9.0F, 9, 11, 12, 0.0F); - this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); - this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); - this.Tail7 = new ModelRenderer(this, 5, 240); - this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); - this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); - this.setRotateAngle(Tail7, 0.22759093446006054F, 0.0F, 0.0F); - this.Spikebase1 = new ModelRenderer(this, 300, 440); - this.Spikebase1.setRotationPoint(0.0F, 0.0F, 1.0F); - this.Spikebase1.addBox(-1.0F, -3.0F, 0.0F, 2, 3, 3, 0.0F); - this.setRotateAngle(Spikebase1, -0.36425021489121656F, 0.0F, 0.0F); - this.Righttoemid = new ModelRenderer(this, 290, 280); - this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); - this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.Lefttoeleft = new ModelRenderer(this, 290, 280); - this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); - this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); - this.Clawrighthandleft = new ModelRenderer(this, 200, 260); - this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); - this.Spiketop7 = new ModelRenderer(this, 300, 460); - this.Spiketop7.setRotationPoint(0.0F, -6.0F, 0.1F); - this.Spiketop7.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop7, -0.136659280431156F, 0.0F, 0.0F); - this.Headback = new ModelRenderer(this, 120, 390); - this.Headback.setRotationPoint(-0.01F, 0.0F, -5.0F); - this.Headback.addBox(-4.0F, 0.0F, -9.0F, 8, 9, 9, 0.0F); - this.setRotateAngle(Headback, 0.36425021489121656F, 0.0F, 0.0F); - this.Lowerjaw = new ModelRenderer(this, 120, 345); - this.Lowerjaw.setRotationPoint(0.0F, 6.15F, -8.0F); - this.Lowerjaw.addBox(-2.5F, 0.0F, -11.0F, 5, 2, 11, 0.0F); - this.setRotateAngle(Lowerjaw, -0.045553093477052F, 0.0F, 0.0F); - this.Lowerarmleft = new ModelRenderer(this, 220, 275); - this.Lowerarmleft.setRotationPoint(1.01F, 8.0F, -2.0F); - this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.0F, 0.0F); - this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); - this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); - this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); - this.Shoulderleft_1.setRotationPoint(-6.0F, 8.0F, 6.0F); - this.Shoulderleft_1.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); - this.Wingfinger1right = new ModelRenderer(this, 350, 200); - this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); - this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); - this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); - this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); - this.RightFoot = new ModelRenderer(this, 260, 255); - this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); - this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); - this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); - this.Winglowerarmright = new ModelRenderer(this, 400, 215); - this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); - this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); - this.Righttoelowerright = new ModelRenderer(this, 290, 270); - this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); - this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Rightleg = new ModelRenderer(this, 260, 275); - this.Rightleg.setRotationPoint(1.0F, 14.6F, 0.0F); - this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.22759093446006054F, 0.136659280431156F); - this.Tooth5 = new ModelRenderer(this, 180, 500); - this.Tooth5.setRotationPoint(0.5F, 5.0F, -11.0F); - this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); - this.Spiketop17 = new ModelRenderer(this, 300, 460); - this.Spiketop17.setRotationPoint(0.0F, 3.5F, 2.0F); - this.Spiketop17.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop17, -0.18203784098300857F, 0.0F, 0.0F); - this.Spiketop18 = new ModelRenderer(this, 300, 460); - this.Spiketop18.setRotationPoint(0.0F, 2.5F, 7.0F); - this.Spiketop18.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.Outertoeleft = new ModelRenderer(this, 305, 280); - this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.22759093446006054F, 0.40980330836826856F); - this.Wingfinger2right = new ModelRenderer(this, 330, 150); - this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); - this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); - this.Tooth8 = new ModelRenderer(this, 180, 500); - this.Tooth8.setRotationPoint(-2.8F, 5.0F, -7.0F); - this.Tooth8.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth8, 0.045553093477052F, -0.045553093477052F, 0.31869712141416456F); - this.Spikebase4 = new ModelRenderer(this, 280, 440); - this.Spikebase4.setRotationPoint(0.0F, -2.0F, 25.0F); - this.Spikebase4.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 4, 0.0F); - this.setRotateAngle(Spikebase4, -0.8651597102135892F, 0.0F, 0.0F); - this.Spikebase5 = new ModelRenderer(this, 280, 440); - this.Spikebase5.setRotationPoint(0.0F, 3.0F, 4.5F); - this.Spikebase5.addBox(-1.0F, -7.0F, 0.0F, 2, 7, 4, 0.0F); - this.setRotateAngle(Spikebase5, -0.18203784098300857F, 0.0F, 0.0F); - this.LTailSpike = new ModelRenderer(this, 350, 300); - this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); - this.Clawrighthandmid = new ModelRenderer(this, 200, 260); - this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Tooth9 = new ModelRenderer(this, 180, 500); - this.Tooth9.setRotationPoint(-2.7F, 5.0F, -9.1F); - this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); - this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); - this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); - this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); - this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); - this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); - this.Spiketop2 = new ModelRenderer(this, 300, 460); - this.Spiketop2.setRotationPoint(0.0F, 1.0F, -12.5F); - this.Spiketop2.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(Spiketop2, -0.22759093446006054F, 0.0F, 0.0F); - this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerleft.setRotationPoint(1.6F, 0.0F, -2.0F); - this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 8, 0.0F); - this.setRotateAngle(Headlargehornlowerleft, 0.18203784098300857F, 0.22759093446006054F, 0.36425021489121656F); - this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); - this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); - this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); - this.Tail4 = new ModelRenderer(this, 5, 300); - this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); - this.setRotateAngle(Tail4, 0.22759093446006054F, 0.0F, 0.0F); - this.Tail3 = new ModelRenderer(this, 5, 335); - this.Tail3.setRotationPoint(0.0F, 1.0F, 24.0F); - this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); - this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); - this.Wingupperarmright = new ModelRenderer(this, 390, 230); - this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); - this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); - this.Outertoelowerleft = new ModelRenderer(this, 305, 270); - this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); - this.Spkebase3 = new ModelRenderer(this, 280, 440); - this.Spkebase3.setRotationPoint(0.0F, 0.0F, 11.5F); - this.Spkebase3.addBox(-1.0F, -7.0F, 2.0F, 2, 7, 4, 0.0F); - this.setRotateAngle(Spkebase3, -0.7285004297824331F, 0.0F, 0.0F); - this.Wingshoulderleft = new ModelRenderer(this, 470, 230); - this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 12.0F); - this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); - this.Wingfinger2left = new ModelRenderer(this, 330, 150); - this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); - this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); - this.Lefthip = new ModelRenderer(this, 260, 300); - this.Lefthip.setRotationPoint(6.0F, 3.0F, 15.0F); - this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Lefthip, -0.27314402793711257F, 0.27314402793711257F, -0.18203784098300857F); - this.Righthandmidfinger = new ModelRenderer(this, 220, 260); - this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); - this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); - this.Righthandleftfinger = new ModelRenderer(this, 220, 260); - this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); - this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); - this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerleft.setRotationPoint(3.0F, 2.0F, -4.0F); - this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(Headmidhornlowerleft, -0.136659280431156F, 0.5462880558742251F, 0.0F); - this.Tail6 = new ModelRenderer(this, 5, 275); - this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); - this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); - this.setRotateAngle(Tail6, 0.27314402793711257F, 0.0F, 0.0F); - this.Lefttoeright = new ModelRenderer(this, 290, 280); - this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); - this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); - this.Spiketop13 = new ModelRenderer(this, 300, 460); - this.Spiketop13.setRotationPoint(0.0F, 1.9F, 17.0F); - this.Spiketop13.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(Spiketop13, -0.27314402793711257F, 0.0F, 0.0F); - this.Tooth7 = new ModelRenderer(this, 180, 500); - this.Tooth7.setRotationPoint(-2.8F, 5.0F, -5.2F); - this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); - this.Spikebase2 = new ModelRenderer(this, 280, 440); - this.Spikebase2.setRotationPoint(0.0F, 0.0F, 7.0F); - this.Spikebase2.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 4, 0.0F); - this.setRotateAngle(Spikebase2, -0.4553564018453205F, 0.0F, 0.0F); - this.Smallheadhornright1 = new ModelRenderer(this, 190, 420); - this.Smallheadhornright1.setRotationPoint(-0.4F, 0.0F, -1.0F); - this.Smallheadhornright1.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornright1, 0.18203784098300857F, -0.22759093446006054F, -0.18203784098300857F); - this.Wingmembramemidright = new ModelRenderer(this, 350, 320); - this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); - this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); - this.shape16 = new ModelRenderer(this, 5, 415); - this.shape16.setRotationPoint(0.0F, 18.0F, 2.0F); - this.shape16.addBox(-6.5F, -10.0F, 0.0F, 13, 10, 30, 0.0F); - this.setRotateAngle(shape16, -0.31869712141416456F, 0.0F, 0.0F); - this.Neckbase = new ModelRenderer(this, 120, 470); - this.Neckbase.setRotationPoint(0.0F, 4.0F, 8.0F); - this.Neckbase.addBox(-6.0F, 0.0F, -14.0F, 12, 14, 14, 0.0F); - this.setRotateAngle(Neckbase, -0.4553564018453205F, 0.0F, 0.0F); - this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); - this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); - this.Spiketop10 = new ModelRenderer(this, 300, 460); - this.Spiketop10.setRotationPoint(0.0F, 1.0F, 25.0F); - this.Spiketop10.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop10, -0.31869712141416456F, 0.0F, 0.0F); - this.RightLeg = new ModelRenderer(this, 260, 275); - this.RightLeg.setRotationPoint(-1.0F, 14.6F, 0.0F); - this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.23911010752322312F, -0.091106186954104F); - this.Lefttoemid = new ModelRenderer(this, 290, 280); - this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); - this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.Spikebase7 = new ModelRenderer(this, 300, 440); - this.Spikebase7.setRotationPoint(0.0F, 1.0F, 18.5F); - this.Spikebase7.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Spikebase7, -0.27314402793711257F, 0.0F, 0.0F); - this.Clawlefthandleft = new ModelRenderer(this, 200, 260); - this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); - this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); - this.Spiketop19 = new ModelRenderer(this, 300, 460); - this.Spiketop19.setRotationPoint(0.0F, 5.0F, 11.0F); - this.Spiketop19.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - // Grouping - this.RightFoot.addChild(this.Righttoeleft); - this.Spikebase4.addChild(this.Spiketop6); - this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); - this.Spikebase2.addChild(this.Spiketop4); - this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); - this.Neckmid.addChild(this.Spiketop1); - this.Headback.addChild(this.Snout); - this.Lowerarmleft.addChild(this.Thumbtoeupperleft); - this.Rightleg.addChild(this.Rightfoot); - this.Headback.addChild(this.Smallheadhornleft1); - this.Wingfinger1left.addChild(this.Wingfinger3left); - this.Snout.addChild(this.Tooth10); - this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); - this.RightFoot.addChild(this.Righttoeright); - this.Headback.addChild(this.Headmidhornlowerright); - this.Tail1.addChild(this.Spikebase6); - this.Outertoelowerright.addChild(this.Outertoelowerright_1); - this.Tail4.addChild(this.Spiketop14); - this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); - this.Spikebase1.addChild(this.Spiketop3); - this.Wingfinger1right.addChild(this.Wingfinger3right); - this.Snout.addChild(this.Tooth1); - this.Lefttoeleft.addChild(this.Lefttoelowerleft); - this.Smallheadhornright2.addChild(this.Smallheadhornright3); - this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); - this.Tail1.addChild(this.Righthip); - this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); - this.Tail3.addChild(this.Spiketop12); - this.Headmidhornlowerright.addChild(this.Headmidhornupperright); - this.Snout.addChild(this.Tooth6); - this.Wingfinger3left.addChild(this.Wingfingerlower3left); - this.Lowerarmleft.addChild(this.Lefthandmidfinger); - this.Tail4.addChild(this.Spiketop15); - this.Shoulderleft_1.addChild(this.Lowerarmleft_1); - this.Headback.addChild(this.Headlargehornlowerright); - this.Body.addChild(this.Wingshoulderright); - this.Tail3.addChild(this.Spiketop11); - this.Righthandrightfinger.addChild(this.Clawrighthandright); - this.Lefttoemid.addChild(this.Lefttoelowermid); - this.Headback.addChild(this.Smallheadhornleft2); - this.Lefthandrightfinger.addChild(this.Clawlefthandright); - this.Spikebase6.addChild(this.Spiketop8); - this.RTailSpike.addChild(this.RTailMembrane); - this.Lowerarmleft_1.addChild(this.Righthandrightfinger); - this.Winglowerarmleft.addChild(this.Wingmembramemidleft); - this.Body.addChild(this.Tail1); - this.Headback.addChild(this.Smallheadhornright2); - this.Spkebase3.addChild(this.Spiketop5); - this.Lefttoeright.addChild(this.Lefttoelowerright); - this.Wingfinger1right.addChild(this.Wingmembramelargeright); - this.Spikebase7.addChild(this.Spiketop9); - this.Wingupperarmleft.addChild(this.Winglowerarmleft); - this.Tail7.addChild(this.Tail8); - this.Snout.addChild(this.Tooth4); - this.Wingfinger1left.addChild(this.Wingfingerlower1left); - this.Tail8.addChild(this.RTailSpike); - this.RightFoot.addChild(this.Outertoelowerright); - this.Winglowerarmleft.addChild(this.Wingfinger1left); - this.Lefthandmidfinger.addChild(this.Clawlefthandmid); - this.Righttoeleft.addChild(this.Righttoelowerleft); - this.Body.addChild(this.Shoulderleft); - this.Wingshoulderleft.addChild(this.Wingupperarmleft); - this.LTailSpike.addChild(this.LTailMembrane); - this.Snout.addChild(this.Tooth3); - this.Snout.addChild(this.Tooth2); - this.Neckmid.addChild(this.Neckend); - this.Tail4.addChild(this.Spiketop16); - this.Headlargehornlowerright.addChild(this.Headlargehornupperright); - this.Righttoemid.addChild(this.Righttoelowermid); - this.Neckbase.addChild(this.Neckmid); - this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); - this.Tail6.addChild(this.Tail7); - this.Body.addChild(this.Spikebase1); - this.RightFoot.addChild(this.Righttoemid); - this.Rightfoot.addChild(this.Lefttoeleft); - this.Righthandleftfinger.addChild(this.Clawrighthandleft); - this.Spikebase5.addChild(this.Spiketop7); - this.Neckend.addChild(this.Headback); - this.Headback.addChild(this.Lowerjaw); - this.Shoulderleft.addChild(this.Lowerarmleft); - this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); - this.Body.addChild(this.Shoulderleft_1); - this.Winglowerarmright.addChild(this.Wingfinger1right); - this.Wingfinger2right.addChild(this.Wingfingerlower2right); - this.RightLeg.addChild(this.RightFoot); - this.Wingfinger2left.addChild(this.Wingfingerlower2left); - this.Wingupperarmright.addChild(this.Winglowerarmright); - this.Righttoeright.addChild(this.Righttoelowerright); - this.Lefthip.addChild(this.Rightleg); - this.Snout.addChild(this.Tooth5); - this.Tail6.addChild(this.Spiketop17); - this.Tail6.addChild(this.Spiketop18); - this.Rightfoot.addChild(this.Outertoeleft); - this.Wingfinger1right.addChild(this.Wingfinger2right); - this.Snout.addChild(this.Tooth8); - this.Body.addChild(this.Spikebase4); - this.Tail1.addChild(this.Spikebase5); - this.Tail8.addChild(this.LTailSpike); - this.Righthandmidfinger.addChild(this.Clawrighthandmid); - this.Snout.addChild(this.Tooth9); - this.Wingfinger1right.addChild(this.Wingfingerlower1right); - this.Wingupperarmright.addChild(this.Wingmembramesmallright); - this.Neckbase.addChild(this.Spiketop2); - this.Headback.addChild(this.Headlargehornlowerleft); - this.Wingfinger1left.addChild(this.Wingmembramelargeleft); - this.Wingfinger3right.addChild(this.Wingfingerlower3right); - this.Tail3.addChild(this.Tail4); - this.Tail1.addChild(this.Tail3); - this.Wingshoulderright.addChild(this.Wingupperarmright); - this.Outertoeleft.addChild(this.Outertoelowerleft); - this.Body.addChild(this.Spkebase3); - this.Body.addChild(this.Wingshoulderleft); - this.Wingfinger1left.addChild(this.Wingfinger2left); - this.Tail1.addChild(this.Lefthip); - this.Lowerarmleft_1.addChild(this.Righthandmidfinger); - this.Lowerarmleft_1.addChild(this.Righthandleftfinger); - this.Headback.addChild(this.Headmidhornlowerleft); - this.Tail4.addChild(this.Tail6); - this.Rightfoot.addChild(this.Lefttoeright); - this.Tail3.addChild(this.Spiketop13); - this.Snout.addChild(this.Tooth7); - this.Body.addChild(this.Spikebase2); - this.Headback.addChild(this.Smallheadhornright1); - this.Winglowerarmright.addChild(this.Wingmembramemidright); - this.Body.addChild(this.shape16); - this.Body.addChild(this.Neckbase); - this.Lowerarmleft.addChild(this.Lefthandrightfinger); - this.Tail1.addChild(this.Spiketop10); - this.Righthip.addChild(this.RightLeg); - this.Rightfoot.addChild(this.Lefttoemid); - this.Tail1.addChild(this.Spikebase7); - this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); - this.Tail6.addChild(this.Spiketop19); - } + public ModelDragon() { + this.textureWidth = 512; + this.textureHeight = 512; + this.Righttoeleft = new ModelRenderer(this, 290, 280); + this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); + this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); + this.Spiketop6 = new ModelRenderer(this, 300, 460); + this.Spiketop6.setRotationPoint(0.0F, 0.0F, 0.1F); + this.Spiketop6.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop6, -0.136659280431156F, 0.0F, 0.0F); + this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); + this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); + this.Spiketop4 = new ModelRenderer(this, 300, 460); + this.Spiketop4.setRotationPoint(0.0F, -3.0F, 0.1F); + this.Spiketop4.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop4, -0.27314402793711257F, 0.0F, 0.0F); + this.Wingmembramesmallleft = new ModelRenderer(this, 420, 255); + this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.6F, -1.0F); + this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); + this.Spiketop1 = new ModelRenderer(this, 300, 460); + this.Spiketop1.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Spiketop1.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop1, -0.091106186954104F, 0.0F, 0.0F); + this.Snout = new ModelRenderer(this, 120, 365); + this.Snout.setRotationPoint(0.0F, 0.01F, -8.0F); + this.Snout.addBox(-3.0F, 0.0F, -12.0F, 6, 6, 12, 0.0F); + this.setRotateAngle(Snout, 0.045553093477052F, 0.0F, 0.015485315777647711F); + this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); + this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); + this.Rightfoot = new ModelRenderer(this, 260, 255); + this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); + this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Smallheadhornleft1 = new ModelRenderer(this, 190, 420); + this.Smallheadhornleft1.setRotationPoint(0.4F, 0.0F, -1.0F); + this.Smallheadhornleft1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornleft1, 0.18203784098300857F, 0.22759093446006054F, 0.18203784098300857F); + this.Wingfinger3left = new ModelRenderer(this, 390, 170); + this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); + this.Tooth10 = new ModelRenderer(this, 180, 500); + this.Tooth10.setRotationPoint(-2.7F, 4.8F, -10.7F); + this.Tooth10.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth10, 0.6829473363053812F, -1.9123572614101867F, -0.31869712141416456F); + this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); + this.Headmidhornupperleft.setRotationPoint(0.0F, 0.1F, 3.9F); + this.Headmidhornupperleft.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); + this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.136659280431156F, 0.0F); + this.Righttoeright = new ModelRenderer(this, 290, 280); + this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); + this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); + this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerright.setRotationPoint(-3.0F, 2.0F, -4.0F); + this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Headmidhornlowerright, -0.136659280431156F, -0.5462880558742251F, 0.0F); + this.Spikebase6 = new ModelRenderer(this, 300, 440); + this.Spikebase6.setRotationPoint(0.0F, 1.0F, 12.0F); + this.Spikebase6.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Spikebase6, -0.27314402793711257F, 0.0F, 0.0F); + this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); + this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); + this.Spiketop14 = new ModelRenderer(this, 300, 460); + this.Spiketop14.setRotationPoint(0.0F, 0.0F, 4.5F); + this.Spiketop14.addBox(-0.5F, -6.0F, 0.0F, 1, 6, 2, 0.0F); + this.setRotateAngle(Spiketop14, -0.40980330836826856F, 0.0F, 0.0F); + this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); + this.Headlargehornupperleft.setRotationPoint(1.1F, 0.1F, 6.7F); + this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 7, 0.0F); + this.setRotateAngle(Headlargehornupperleft, 0.0F, -0.5918411493512771F, 0.0F); + this.Spiketop3 = new ModelRenderer(this, 300, 460); + this.Spiketop3.setRotationPoint(0.0F, -1.0F, 0.1F); + this.Spiketop3.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop3, -0.22759093446006054F, 0.0F, 0.0F); + this.Wingfinger3right = new ModelRenderer(this, 390, 170); + this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); + this.Tooth1 = new ModelRenderer(this, 180, 500); + this.Tooth1.setRotationPoint(2.8F, 5.0F, -5.2F); + this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); + this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); + this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); + this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornright3.setRotationPoint(1.0F, 1.0F, 0.0F); + this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Smallheadhornright3, -0.27314402793711257F, 0.0F, 0.0F); + this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); + this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); + this.Righthip = new ModelRenderer(this, 260, 300); + this.Righthip.setRotationPoint(-6.0F, 3.0F, 15.0F); + this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Righthip, -0.27314402793711257F, -0.27314402793711257F, 0.18203784098300857F); + this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornleft3.setRotationPoint(-1.0F, 1.0F, 0.0F); + this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Smallheadhornleft3, -0.27314402793711257F, 0.0F, 0.0F); + this.Spiketop12 = new ModelRenderer(this, 300, 460); + this.Spiketop12.setRotationPoint(0.0F, 1.5F, 12.0F); + this.Spiketop12.addBox(-0.5F, -10.0F, 0.0F, 1, 10, 2, 0.0F); + this.setRotateAngle(Spiketop12, -0.36425021489121656F, 0.0F, 0.0F); + this.Headmidhornupperright = new ModelRenderer(this, 190, 430); + this.Headmidhornupperright.setRotationPoint(0.0F, 0.1F, 3.9F); + this.Headmidhornupperright.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); + this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.136659280431156F, 0.0F); + this.Tooth6 = new ModelRenderer(this, 180, 500); + this.Tooth6.setRotationPoint(-0.5F, 5.0F, -11.0F); + this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); + this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); + this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); + this.Body = new ModelRenderer(this, 5, 460); + this.Body.setRotationPoint(0.0F, -4.0F, -20.0F); + this.Body.addBox(-9.0F, 0.0F, 0.0F, 18, 18, 23, 0.0F); + this.setRotateAngle(Body, 0.5462880558742251F, 0.0F, 0.0F); + this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); + this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); + this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); + this.Spiketop15 = new ModelRenderer(this, 300, 460); + this.Spiketop15.setRotationPoint(0.0F, 3.6F, 9.0F); + this.Spiketop15.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); + this.setRotateAngle(Spiketop15, -0.18203784098300857F, 0.0F, 0.0F); + this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); + this.Lowerarmleft_1.setRotationPoint(-3.01F, 8.0F, -2.0F); + this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, 0.0F, 0.0F); + this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerright.setRotationPoint(-1.6F, 0.0F, -2.0F); + this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 8, 0.0F); + this.setRotateAngle(Headlargehornlowerright, 0.18203784098300857F, -0.22759093446006054F, + -0.36425021489121656F); + this.Wingshoulderright = new ModelRenderer(this, 470, 230); + this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 12.0F); + this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); + this.Spiketop11 = new ModelRenderer(this, 300, 460); + this.Spiketop11.setRotationPoint(0.0F, 1.5F, 8.0F); + this.Spiketop11.addBox(-0.5F, -11.0F, -1.0F, 1, 11, 2, 0.0F); + this.setRotateAngle(Spiketop11, -0.36425021489121656F, 0.0F, 0.0F); + this.Clawrighthandright = new ModelRenderer(this, 200, 260); + this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); + this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); + this.Lefttoelowermid = new ModelRenderer(this, 290, 270); + this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); + this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornleft2.setRotationPoint(4.0F, 5.0F, -3.0F); + this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); + this.Clawlefthandright = new ModelRenderer(this, 200, 260); + this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); + this.Spiketop8 = new ModelRenderer(this, 300, 460); + this.Spiketop8.setRotationPoint(0.0F, -3.0F, 0.1F); + this.Spiketop8.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop8, -0.045553093477052F, 0.0F, 0.0F); + this.RTailMembrane = new ModelRenderer(this, 381, 270); + this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); + this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); + this.Righthandrightfinger = new ModelRenderer(this, 220, 260); + this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); + this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); + this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); + this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); + this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); + this.Tail1 = new ModelRenderer(this, 5, 370); + this.Tail1.setRotationPoint(0.0F, 1.0F, 23.0F); + this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); + this.setRotateAngle(Tail1, -0.8196066167365371F, 0.0F, 0.0F); + this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornright2.setRotationPoint(-4.0F, 5.0F, -3.0F); + this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); + this.Spiketop5 = new ModelRenderer(this, 300, 460); + this.Spiketop5.setRotationPoint(0.0F, -7.0F, 2.1F); + this.Spiketop5.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); + this.setRotateAngle(Spiketop5, -0.136659280431156F, 0.0F, 0.0F); + this.Lefttoelowerright = new ModelRenderer(this, 290, 270); + this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); + this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Wingmembramelargeright = new ModelRenderer(this, 270, 430); + this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Spiketop9 = new ModelRenderer(this, 300, 460); + this.Spiketop9.setRotationPoint(0.0F, -0.5F, 0.1F); + this.Spiketop9.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); + this.setRotateAngle(Spiketop9, -0.045553093477052F, 0.0F, 0.0F); + this.Winglowerarmleft = new ModelRenderer(this, 400, 215); + this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); + this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); + this.Tail8 = new ModelRenderer(this, 5, 220); + this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); + this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); + this.Tooth4 = new ModelRenderer(this, 180, 500); + this.Tooth4.setRotationPoint(2.6F, 4.8F, -10.7F); + this.Tooth4.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth4, 0.6829473363053812F, 1.8668041679331349F, 0.31869712141416456F); + this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); + this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); + this.RTailSpike = new ModelRenderer(this, 350, 300); + this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); + this.Outertoelowerright = new ModelRenderer(this, 320, 280); + this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); + this.Wingfinger1left = new ModelRenderer(this, 350, 200); + this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); + this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); + this.Clawlefthandmid = new ModelRenderer(this, 200, 260); + this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Righttoelowerleft = new ModelRenderer(this, 290, 270); + this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); + this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.Shoulderleft = new ModelRenderer(this, 220, 300); + this.Shoulderleft.setRotationPoint(8.0F, 8.0F, 6.0F); + this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); + this.Wingupperarmleft = new ModelRenderer(this, 390, 230); + this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); + this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); + this.LTailMembrane = new ModelRenderer(this, 380, 250); + this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); + this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); + this.Tooth3 = new ModelRenderer(this, 180, 500); + this.Tooth3.setRotationPoint(2.7F, 5.0F, -9.1F); + this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); + this.Tooth2 = new ModelRenderer(this, 180, 500); + this.Tooth2.setRotationPoint(2.8F, 5.0F, -7.0F); + this.Tooth2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth2, -0.045553093477052F, 0.045553093477052F, -0.31869712141416456F); + this.Neckend = new ModelRenderer(this, 120, 420); + this.Neckend.setRotationPoint(0.0F, 0.0F, -11.0F); + this.Neckend.addBox(-3.5F, 1.0F, -7.0F, 7, 9, 10, 0.0F); + this.setRotateAngle(Neckend, 0.27314402793711257F, 0.0F, 0.0F); + this.Spiketop16 = new ModelRenderer(this, 300, 460); + this.Spiketop16.setRotationPoint(0.0F, 3.5F, 14.0F); + this.Spiketop16.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop16, -0.091106186954104F, 0.0F, 0.0F); + this.Headlargehornupperright = new ModelRenderer(this, 190, 470); + this.Headlargehornupperright.setRotationPoint(-1.1F, 0.1F, 6.7F); + this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 7, 0.0F); + this.setRotateAngle(Headlargehornupperright, 0.0F, 0.5918411493512771F, 0.0F); + this.Righttoelowermid = new ModelRenderer(this, 290, 270); + this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); + this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Neckmid = new ModelRenderer(this, 120, 445); + this.Neckmid.setRotationPoint(0.0F, 1.0F, -12.0F); + this.Neckmid.addBox(-4.5F, 0.0F, -9.0F, 9, 11, 12, 0.0F); + this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); + this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); + this.Tail7 = new ModelRenderer(this, 5, 240); + this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); + this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); + this.setRotateAngle(Tail7, 0.22759093446006054F, 0.0F, 0.0F); + this.Spikebase1 = new ModelRenderer(this, 300, 440); + this.Spikebase1.setRotationPoint(0.0F, 0.0F, 1.0F); + this.Spikebase1.addBox(-1.0F, -3.0F, 0.0F, 2, 3, 3, 0.0F); + this.setRotateAngle(Spikebase1, -0.36425021489121656F, 0.0F, 0.0F); + this.Righttoemid = new ModelRenderer(this, 290, 280); + this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); + this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.Lefttoeleft = new ModelRenderer(this, 290, 280); + this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); + this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); + this.Clawrighthandleft = new ModelRenderer(this, 200, 260); + this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); + this.Spiketop7 = new ModelRenderer(this, 300, 460); + this.Spiketop7.setRotationPoint(0.0F, -6.0F, 0.1F); + this.Spiketop7.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop7, -0.136659280431156F, 0.0F, 0.0F); + this.Headback = new ModelRenderer(this, 120, 390); + this.Headback.setRotationPoint(-0.01F, 0.0F, -5.0F); + this.Headback.addBox(-4.0F, 0.0F, -9.0F, 8, 9, 9, 0.0F); + this.setRotateAngle(Headback, 0.36425021489121656F, 0.0F, 0.0F); + this.Lowerjaw = new ModelRenderer(this, 120, 345); + this.Lowerjaw.setRotationPoint(0.0F, 6.15F, -8.0F); + this.Lowerjaw.addBox(-2.5F, 0.0F, -11.0F, 5, 2, 11, 0.0F); + this.setRotateAngle(Lowerjaw, -0.045553093477052F, 0.0F, 0.0F); + this.Lowerarmleft = new ModelRenderer(this, 220, 275); + this.Lowerarmleft.setRotationPoint(1.01F, 8.0F, -2.0F); + this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.0F, 0.0F); + this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); + this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); + this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); + this.Shoulderleft_1.setRotationPoint(-6.0F, 8.0F, 6.0F); + this.Shoulderleft_1.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); + this.Wingfinger1right = new ModelRenderer(this, 350, 200); + this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); + this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); + this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); + this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); + this.RightFoot = new ModelRenderer(this, 260, 255); + this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); + this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); + this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); + this.Winglowerarmright = new ModelRenderer(this, 400, 215); + this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); + this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); + this.Righttoelowerright = new ModelRenderer(this, 290, 270); + this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); + this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Rightleg = new ModelRenderer(this, 260, 275); + this.Rightleg.setRotationPoint(1.0F, 14.6F, 0.0F); + this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.22759093446006054F, 0.136659280431156F); + this.Tooth5 = new ModelRenderer(this, 180, 500); + this.Tooth5.setRotationPoint(0.5F, 5.0F, -11.0F); + this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); + this.Spiketop17 = new ModelRenderer(this, 300, 460); + this.Spiketop17.setRotationPoint(0.0F, 3.5F, 2.0F); + this.Spiketop17.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop17, -0.18203784098300857F, 0.0F, 0.0F); + this.Spiketop18 = new ModelRenderer(this, 300, 460); + this.Spiketop18.setRotationPoint(0.0F, 2.5F, 7.0F); + this.Spiketop18.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.Outertoeleft = new ModelRenderer(this, 305, 280); + this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.22759093446006054F, 0.40980330836826856F); + this.Wingfinger2right = new ModelRenderer(this, 330, 150); + this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); + this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); + this.Tooth8 = new ModelRenderer(this, 180, 500); + this.Tooth8.setRotationPoint(-2.8F, 5.0F, -7.0F); + this.Tooth8.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth8, 0.045553093477052F, -0.045553093477052F, 0.31869712141416456F); + this.Spikebase4 = new ModelRenderer(this, 280, 440); + this.Spikebase4.setRotationPoint(0.0F, -2.0F, 25.0F); + this.Spikebase4.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 4, 0.0F); + this.setRotateAngle(Spikebase4, -0.8651597102135892F, 0.0F, 0.0F); + this.Spikebase5 = new ModelRenderer(this, 280, 440); + this.Spikebase5.setRotationPoint(0.0F, 3.0F, 4.5F); + this.Spikebase5.addBox(-1.0F, -7.0F, 0.0F, 2, 7, 4, 0.0F); + this.setRotateAngle(Spikebase5, -0.18203784098300857F, 0.0F, 0.0F); + this.LTailSpike = new ModelRenderer(this, 350, 300); + this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); + this.Clawrighthandmid = new ModelRenderer(this, 200, 260); + this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Tooth9 = new ModelRenderer(this, 180, 500); + this.Tooth9.setRotationPoint(-2.7F, 5.0F, -9.1F); + this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); + this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); + this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); + this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); + this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); + this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); + this.Spiketop2 = new ModelRenderer(this, 300, 460); + this.Spiketop2.setRotationPoint(0.0F, 1.0F, -12.5F); + this.Spiketop2.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(Spiketop2, -0.22759093446006054F, 0.0F, 0.0F); + this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerleft.setRotationPoint(1.6F, 0.0F, -2.0F); + this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 8, 0.0F); + this.setRotateAngle(Headlargehornlowerleft, 0.18203784098300857F, 0.22759093446006054F, 0.36425021489121656F); + this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); + this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); + this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); + this.Tail4 = new ModelRenderer(this, 5, 300); + this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); + this.setRotateAngle(Tail4, 0.22759093446006054F, 0.0F, 0.0F); + this.Tail3 = new ModelRenderer(this, 5, 335); + this.Tail3.setRotationPoint(0.0F, 1.0F, 24.0F); + this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); + this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); + this.Wingupperarmright = new ModelRenderer(this, 390, 230); + this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); + this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); + this.Outertoelowerleft = new ModelRenderer(this, 305, 270); + this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); + this.Spkebase3 = new ModelRenderer(this, 280, 440); + this.Spkebase3.setRotationPoint(0.0F, 0.0F, 11.5F); + this.Spkebase3.addBox(-1.0F, -7.0F, 2.0F, 2, 7, 4, 0.0F); + this.setRotateAngle(Spkebase3, -0.7285004297824331F, 0.0F, 0.0F); + this.Wingshoulderleft = new ModelRenderer(this, 470, 230); + this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 12.0F); + this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); + this.Wingfinger2left = new ModelRenderer(this, 330, 150); + this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); + this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); + this.Lefthip = new ModelRenderer(this, 260, 300); + this.Lefthip.setRotationPoint(6.0F, 3.0F, 15.0F); + this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Lefthip, -0.27314402793711257F, 0.27314402793711257F, -0.18203784098300857F); + this.Righthandmidfinger = new ModelRenderer(this, 220, 260); + this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); + this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); + this.Righthandleftfinger = new ModelRenderer(this, 220, 260); + this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); + this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); + this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerleft.setRotationPoint(3.0F, 2.0F, -4.0F); + this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(Headmidhornlowerleft, -0.136659280431156F, 0.5462880558742251F, 0.0F); + this.Tail6 = new ModelRenderer(this, 5, 275); + this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); + this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); + this.setRotateAngle(Tail6, 0.27314402793711257F, 0.0F, 0.0F); + this.Lefttoeright = new ModelRenderer(this, 290, 280); + this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); + this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); + this.Spiketop13 = new ModelRenderer(this, 300, 460); + this.Spiketop13.setRotationPoint(0.0F, 1.9F, 17.0F); + this.Spiketop13.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(Spiketop13, -0.27314402793711257F, 0.0F, 0.0F); + this.Tooth7 = new ModelRenderer(this, 180, 500); + this.Tooth7.setRotationPoint(-2.8F, 5.0F, -5.2F); + this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); + this.Spikebase2 = new ModelRenderer(this, 280, 440); + this.Spikebase2.setRotationPoint(0.0F, 0.0F, 7.0F); + this.Spikebase2.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 4, 0.0F); + this.setRotateAngle(Spikebase2, -0.4553564018453205F, 0.0F, 0.0F); + this.Smallheadhornright1 = new ModelRenderer(this, 190, 420); + this.Smallheadhornright1.setRotationPoint(-0.4F, 0.0F, -1.0F); + this.Smallheadhornright1.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornright1, 0.18203784098300857F, -0.22759093446006054F, -0.18203784098300857F); + this.Wingmembramemidright = new ModelRenderer(this, 350, 320); + this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); + this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); + this.shape16 = new ModelRenderer(this, 5, 415); + this.shape16.setRotationPoint(0.0F, 18.0F, 2.0F); + this.shape16.addBox(-6.5F, -10.0F, 0.0F, 13, 10, 30, 0.0F); + this.setRotateAngle(shape16, -0.31869712141416456F, 0.0F, 0.0F); + this.Neckbase = new ModelRenderer(this, 120, 470); + this.Neckbase.setRotationPoint(0.0F, 4.0F, 8.0F); + this.Neckbase.addBox(-6.0F, 0.0F, -14.0F, 12, 14, 14, 0.0F); + this.setRotateAngle(Neckbase, -0.4553564018453205F, 0.0F, 0.0F); + this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); + this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); + this.Spiketop10 = new ModelRenderer(this, 300, 460); + this.Spiketop10.setRotationPoint(0.0F, 1.0F, 25.0F); + this.Spiketop10.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop10, -0.31869712141416456F, 0.0F, 0.0F); + this.RightLeg = new ModelRenderer(this, 260, 275); + this.RightLeg.setRotationPoint(-1.0F, 14.6F, 0.0F); + this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.23911010752322312F, -0.091106186954104F); + this.Lefttoemid = new ModelRenderer(this, 290, 280); + this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); + this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.Spikebase7 = new ModelRenderer(this, 300, 440); + this.Spikebase7.setRotationPoint(0.0F, 1.0F, 18.5F); + this.Spikebase7.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Spikebase7, -0.27314402793711257F, 0.0F, 0.0F); + this.Clawlefthandleft = new ModelRenderer(this, 200, 260); + this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); + this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); + this.Spiketop19 = new ModelRenderer(this, 300, 460); + this.Spiketop19.setRotationPoint(0.0F, 5.0F, 11.0F); + this.Spiketop19.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + // Grouping + this.RightFoot.addChild(this.Righttoeleft); + this.Spikebase4.addChild(this.Spiketop6); + this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); + this.Spikebase2.addChild(this.Spiketop4); + this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); + this.Neckmid.addChild(this.Spiketop1); + this.Headback.addChild(this.Snout); + this.Lowerarmleft.addChild(this.Thumbtoeupperleft); + this.Rightleg.addChild(this.Rightfoot); + this.Headback.addChild(this.Smallheadhornleft1); + this.Wingfinger1left.addChild(this.Wingfinger3left); + this.Snout.addChild(this.Tooth10); + this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); + this.RightFoot.addChild(this.Righttoeright); + this.Headback.addChild(this.Headmidhornlowerright); + this.Tail1.addChild(this.Spikebase6); + this.Outertoelowerright.addChild(this.Outertoelowerright_1); + this.Tail4.addChild(this.Spiketop14); + this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); + this.Spikebase1.addChild(this.Spiketop3); + this.Wingfinger1right.addChild(this.Wingfinger3right); + this.Snout.addChild(this.Tooth1); + this.Lefttoeleft.addChild(this.Lefttoelowerleft); + this.Smallheadhornright2.addChild(this.Smallheadhornright3); + this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); + this.Tail1.addChild(this.Righthip); + this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); + this.Tail3.addChild(this.Spiketop12); + this.Headmidhornlowerright.addChild(this.Headmidhornupperright); + this.Snout.addChild(this.Tooth6); + this.Wingfinger3left.addChild(this.Wingfingerlower3left); + this.Lowerarmleft.addChild(this.Lefthandmidfinger); + this.Tail4.addChild(this.Spiketop15); + this.Shoulderleft_1.addChild(this.Lowerarmleft_1); + this.Headback.addChild(this.Headlargehornlowerright); + this.Body.addChild(this.Wingshoulderright); + this.Tail3.addChild(this.Spiketop11); + this.Righthandrightfinger.addChild(this.Clawrighthandright); + this.Lefttoemid.addChild(this.Lefttoelowermid); + this.Headback.addChild(this.Smallheadhornleft2); + this.Lefthandrightfinger.addChild(this.Clawlefthandright); + this.Spikebase6.addChild(this.Spiketop8); + this.RTailSpike.addChild(this.RTailMembrane); + this.Lowerarmleft_1.addChild(this.Righthandrightfinger); + this.Winglowerarmleft.addChild(this.Wingmembramemidleft); + this.Body.addChild(this.Tail1); + this.Headback.addChild(this.Smallheadhornright2); + this.Spkebase3.addChild(this.Spiketop5); + this.Lefttoeright.addChild(this.Lefttoelowerright); + this.Wingfinger1right.addChild(this.Wingmembramelargeright); + this.Spikebase7.addChild(this.Spiketop9); + this.Wingupperarmleft.addChild(this.Winglowerarmleft); + this.Tail7.addChild(this.Tail8); + this.Snout.addChild(this.Tooth4); + this.Wingfinger1left.addChild(this.Wingfingerlower1left); + this.Tail8.addChild(this.RTailSpike); + this.RightFoot.addChild(this.Outertoelowerright); + this.Winglowerarmleft.addChild(this.Wingfinger1left); + this.Lefthandmidfinger.addChild(this.Clawlefthandmid); + this.Righttoeleft.addChild(this.Righttoelowerleft); + this.Body.addChild(this.Shoulderleft); + this.Wingshoulderleft.addChild(this.Wingupperarmleft); + this.LTailSpike.addChild(this.LTailMembrane); + this.Snout.addChild(this.Tooth3); + this.Snout.addChild(this.Tooth2); + this.Neckmid.addChild(this.Neckend); + this.Tail4.addChild(this.Spiketop16); + this.Headlargehornlowerright.addChild(this.Headlargehornupperright); + this.Righttoemid.addChild(this.Righttoelowermid); + this.Neckbase.addChild(this.Neckmid); + this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); + this.Tail6.addChild(this.Tail7); + this.Body.addChild(this.Spikebase1); + this.RightFoot.addChild(this.Righttoemid); + this.Rightfoot.addChild(this.Lefttoeleft); + this.Righthandleftfinger.addChild(this.Clawrighthandleft); + this.Spikebase5.addChild(this.Spiketop7); + this.Neckend.addChild(this.Headback); + this.Headback.addChild(this.Lowerjaw); + this.Shoulderleft.addChild(this.Lowerarmleft); + this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); + this.Body.addChild(this.Shoulderleft_1); + this.Winglowerarmright.addChild(this.Wingfinger1right); + this.Wingfinger2right.addChild(this.Wingfingerlower2right); + this.RightLeg.addChild(this.RightFoot); + this.Wingfinger2left.addChild(this.Wingfingerlower2left); + this.Wingupperarmright.addChild(this.Winglowerarmright); + this.Righttoeright.addChild(this.Righttoelowerright); + this.Lefthip.addChild(this.Rightleg); + this.Snout.addChild(this.Tooth5); + this.Tail6.addChild(this.Spiketop17); + this.Tail6.addChild(this.Spiketop18); + this.Rightfoot.addChild(this.Outertoeleft); + this.Wingfinger1right.addChild(this.Wingfinger2right); + this.Snout.addChild(this.Tooth8); + this.Body.addChild(this.Spikebase4); + this.Tail1.addChild(this.Spikebase5); + this.Tail8.addChild(this.LTailSpike); + this.Righthandmidfinger.addChild(this.Clawrighthandmid); + this.Snout.addChild(this.Tooth9); + this.Wingfinger1right.addChild(this.Wingfingerlower1right); + this.Wingupperarmright.addChild(this.Wingmembramesmallright); + this.Neckbase.addChild(this.Spiketop2); + this.Headback.addChild(this.Headlargehornlowerleft); + this.Wingfinger1left.addChild(this.Wingmembramelargeleft); + this.Wingfinger3right.addChild(this.Wingfingerlower3right); + this.Tail3.addChild(this.Tail4); + this.Tail1.addChild(this.Tail3); + this.Wingshoulderright.addChild(this.Wingupperarmright); + this.Outertoeleft.addChild(this.Outertoelowerleft); + this.Body.addChild(this.Spkebase3); + this.Body.addChild(this.Wingshoulderleft); + this.Wingfinger1left.addChild(this.Wingfinger2left); + this.Tail1.addChild(this.Lefthip); + this.Lowerarmleft_1.addChild(this.Righthandmidfinger); + this.Lowerarmleft_1.addChild(this.Righthandleftfinger); + this.Headback.addChild(this.Headmidhornlowerleft); + this.Tail4.addChild(this.Tail6); + this.Rightfoot.addChild(this.Lefttoeright); + this.Tail3.addChild(this.Spiketop13); + this.Snout.addChild(this.Tooth7); + this.Body.addChild(this.Spikebase2); + this.Headback.addChild(this.Smallheadhornright1); + this.Winglowerarmright.addChild(this.Wingmembramemidright); + this.Body.addChild(this.shape16); + this.Body.addChild(this.Neckbase); + this.Lowerarmleft.addChild(this.Lefthandrightfinger); + this.Tail1.addChild(this.Spiketop10); + this.Righthip.addChild(this.RightLeg); + this.Rightfoot.addChild(this.Lefttoemid); + this.Tail1.addChild(this.Spikebase7); + this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); + this.Tail6.addChild(this.Spiketop19); + } - public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { - modelRenderer.rotateAngleX = x; - modelRenderer.rotateAngleY = y; - modelRenderer.rotateAngleZ = z; - } + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); - this.Body.render(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); + this.Body.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, - float head4) { - super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); - float wingFlap = (float) Math.toRadians(dragon.wingFlap()); - float jawAngle = (float) Math.toRadians(dragon.getJawMove()); - float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); + public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, + float head4) { + super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); + float wingFlap = (float) Math.toRadians(dragon.wingFlap()); + float jawAngle = (float) Math.toRadians(dragon.getJawMove()); + float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); - this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; - this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); + this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; + this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); - this.Lowerjaw.rotateAngleX = -0.045553093477052F - jawAngle; - // this.Tail1.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - // this.Tail3.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - // this.Tail4.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + this.Lowerjaw.rotateAngleX = -0.045553093477052F - jawAngle; + // this.Tail1.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail3.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail4.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - if (!dragon.isTerrestrial()) // Fly - { - if (!dragon.onGround) { - float angle = (float) Math.toRadians(dragon.getVertTailAngle()); - this.Body.rotateAngleX = 0.546F - angle; - } else { - this.Body.rotateAngleX = 0.5462880558742251F; - } + if (!dragon.isTerrestrial()) // Fly + { + if (!dragon.onGround) { + float angle = (float) Math.toRadians(dragon.getVertTailAngle()); + this.Body.rotateAngleX = 0.546F - angle; + } else { + this.Body.rotateAngleX = 0.5462880558742251F; + } - if (dragon.motionY < -0.01F)// Glide - { - wingFlap = 0; - } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover - { - wingFlap = (float) Math.toRadians(dragon.wingFlap()); - } else { - wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move - } - this.Wingshoulderright.rotateAngleZ = wingFlap * 0.75F; - this.Wingshoulderleft.rotateAngleZ = -(wingFlap * 0.75F); - this.Wingupperarmright.rotateAngleZ = wingFlap * 0.25F; - this.Wingupperarmleft.rotateAngleZ = -(wingFlap * 0.25F); + if (dragon.motionY < -0.01F)// Glide + { + wingFlap = 0; + } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover + { + wingFlap = (float) Math.toRadians(dragon.wingFlap()); + } else { + wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move + } + this.Wingshoulderright.rotateAngleZ = wingFlap * 0.75F; + this.Wingshoulderleft.rotateAngleZ = -(wingFlap * 0.75F); + this.Wingupperarmright.rotateAngleZ = wingFlap * 0.25F; + this.Wingupperarmleft.rotateAngleZ = -(wingFlap * 0.25F); - } else // Walk - { - this.Body.rotateAngleX = 0.5462880558742251F; - this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); - this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); - // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); - // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); + } else // Walk + { + this.Body.rotateAngleX = 0.5462880558742251F; + this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); + this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); + // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); + // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); - this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - } - } + this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelFrostDragon.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelFrostDragon.java index 6551c188..2df12704 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelFrostDragon.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelFrostDragon.java @@ -7,998 +7,998 @@ import net.minecraft.util.MathHelper; public class ModelFrostDragon extends ModelBase { - public ModelRenderer Body; - public ModelRenderer Tail1; - public ModelRenderer Neckbase; - public ModelRenderer Belly1; - public ModelRenderer Wingshoulderleft; - public ModelRenderer Shoulderleft; - public ModelRenderer Shoulderleft_1; - public ModelRenderer Spikebase1; - public ModelRenderer Spikebase2; - public ModelRenderer Spkebase3; - public ModelRenderer Spikebase4; - public ModelRenderer Wingshoulderright; - public ModelRenderer Tail3; - public ModelRenderer Righthip; - public ModelRenderer Lefthip; - public ModelRenderer Spikebase5; - public ModelRenderer Spikebase6; - public ModelRenderer Spikebase7; - public ModelRenderer Spiketop10; - public ModelRenderer Tail4; - public ModelRenderer Spiketop11; - public ModelRenderer Spiketop12; - public ModelRenderer Spiketop13; - public ModelRenderer Tail6; - public ModelRenderer Spiketop14; - public ModelRenderer Spiketop15; - public ModelRenderer Spiketop16; - public ModelRenderer Tail7; - public ModelRenderer Spiketop17; - public ModelRenderer Spiketop18; - public ModelRenderer Spiketop19; - public ModelRenderer Tail8; - public ModelRenderer LTailSpike; - public ModelRenderer RTailSpike; - public ModelRenderer LTailMembrane; - public ModelRenderer RTailMembrane; - public ModelRenderer RightLeg; - public ModelRenderer RightFoot; - public ModelRenderer Righttoemid; - public ModelRenderer Righttoeleft; - public ModelRenderer Righttoeright; - public ModelRenderer Outertoelowerright; - public ModelRenderer Righttoelowermid; - public ModelRenderer Righttoelowerleft; - public ModelRenderer Righttoelowerright; - public ModelRenderer Outertoelowerright_1; - public ModelRenderer Rightleg; - public ModelRenderer Rightfoot; - public ModelRenderer Lefttoemid; - public ModelRenderer Lefttoeright; - public ModelRenderer Lefttoeleft; - public ModelRenderer Outertoeleft; - public ModelRenderer Lefttoelowermid; - public ModelRenderer Lefttoelowerright; - public ModelRenderer Lefttoelowerleft; - public ModelRenderer Outertoelowerleft; - public ModelRenderer Spiketop7; - public ModelRenderer Spiketop8; - public ModelRenderer Spiketop9; - public ModelRenderer Neckmid; - public ModelRenderer Spiketop2; - public ModelRenderer Neckend; - public ModelRenderer Spiketop1; - public ModelRenderer Headback; - public ModelRenderer Snout; - public ModelRenderer Headlargehornlowerleft; - public ModelRenderer Headlargehornlowerright; - public ModelRenderer Smallheadhornleft2; - public ModelRenderer Smallheadhornright2; - public ModelRenderer Headmidhornlowerleft; - public ModelRenderer Headmidhornlowerright; - public ModelRenderer Mouthback_MOVE_THIS_TO_OPEN_MOUTH; - public ModelRenderer Tooth5; - public ModelRenderer Tooth4; - public ModelRenderer Tooth3; - public ModelRenderer Tooth2; - public ModelRenderer Tooth1; - public ModelRenderer Tooth6; - public ModelRenderer Tooth7; - public ModelRenderer Tooth8; - public ModelRenderer Tooth9; - public ModelRenderer Tooth10; - public ModelRenderer shape159; - public ModelRenderer Headlargehornupperleft; - public ModelRenderer Smallheadhornleft1; - public ModelRenderer Headlargehornupperright; - public ModelRenderer Smallheadhornright1; - public ModelRenderer Smallheadhornleft3; - public ModelRenderer Smallheadhornright3; - public ModelRenderer Headmidhornupperleft; - public ModelRenderer Headmidhornupperright; - public ModelRenderer Lowerjawback; - public ModelRenderer Lowerjaw; - public ModelRenderer Smallheadhornright3_1; - public ModelRenderer Smallheadhornleft3_1; - public ModelRenderer Underlowerjaw2; - public ModelRenderer Underlowerjaw; - public ModelRenderer Tooth17; - public ModelRenderer Tooth13; - public ModelRenderer Tooth16; - public ModelRenderer Tooth12; - public ModelRenderer Tooth18; - public ModelRenderer Tooth14; - public ModelRenderer Tooth15; - public ModelRenderer Tooth11; - public ModelRenderer Underlowerjaw3; - public ModelRenderer Wingupperarmleft; - public ModelRenderer Winglowerarmleft; - public ModelRenderer Wingmembramesmallleft; - public ModelRenderer Wingfinger1left; - public ModelRenderer Wingmembramemidleft; - public ModelRenderer Wingfingerlower1left; - public ModelRenderer Wingfinger2left; - public ModelRenderer Wingfinger3left; - public ModelRenderer Wingmembramelargeleft; - public ModelRenderer Wingfingerlower2left; - public ModelRenderer Wingfingerlower3left; - public ModelRenderer Lowerarmleft; - public ModelRenderer Lefthandrightfinger; - public ModelRenderer Lefthandmidfinger; - public ModelRenderer Lefthandrightfinger_1; - public ModelRenderer Thumbtoeupperleft; - public ModelRenderer Clawlefthandright; - public ModelRenderer Clawlefthandmid; - public ModelRenderer Clawlefthandleft; - public ModelRenderer Thumbtoelowerleft; - public ModelRenderer Lowerarmleft_1; - public ModelRenderer Righthandleftfinger; - public ModelRenderer Righthandmidfinger; - public ModelRenderer Righthandrightfinger; - public ModelRenderer Thumbtoeupperright; - public ModelRenderer Clawrighthandleft; - public ModelRenderer Clawrighthandmid; - public ModelRenderer Clawrighthandright; - public ModelRenderer Thumbtoelowerright; - public ModelRenderer Spiketop3; - public ModelRenderer Spiketop4; - public ModelRenderer Spiketop5; - public ModelRenderer Spiketop6; - public ModelRenderer Wingupperarmright; - public ModelRenderer Winglowerarmright; - public ModelRenderer Wingmembramesmallright; - public ModelRenderer Wingfinger1right; - public ModelRenderer Wingmembramemidright; - public ModelRenderer Wingfinger2right; - public ModelRenderer Wingfinger3right; - public ModelRenderer Wingfingerlower1right; - public ModelRenderer Wingmembramelargeright; - public ModelRenderer Wingfingerlower2right; - public ModelRenderer Wingfingerlower3right; + public ModelRenderer Body; + public ModelRenderer Tail1; + public ModelRenderer Neckbase; + public ModelRenderer Belly1; + public ModelRenderer Wingshoulderleft; + public ModelRenderer Shoulderleft; + public ModelRenderer Shoulderleft_1; + public ModelRenderer Spikebase1; + public ModelRenderer Spikebase2; + public ModelRenderer Spkebase3; + public ModelRenderer Spikebase4; + public ModelRenderer Wingshoulderright; + public ModelRenderer Tail3; + public ModelRenderer Righthip; + public ModelRenderer Lefthip; + public ModelRenderer Spikebase5; + public ModelRenderer Spikebase6; + public ModelRenderer Spikebase7; + public ModelRenderer Spiketop10; + public ModelRenderer Tail4; + public ModelRenderer Spiketop11; + public ModelRenderer Spiketop12; + public ModelRenderer Spiketop13; + public ModelRenderer Tail6; + public ModelRenderer Spiketop14; + public ModelRenderer Spiketop15; + public ModelRenderer Spiketop16; + public ModelRenderer Tail7; + public ModelRenderer Spiketop17; + public ModelRenderer Spiketop18; + public ModelRenderer Spiketop19; + public ModelRenderer Tail8; + public ModelRenderer LTailSpike; + public ModelRenderer RTailSpike; + public ModelRenderer LTailMembrane; + public ModelRenderer RTailMembrane; + public ModelRenderer RightLeg; + public ModelRenderer RightFoot; + public ModelRenderer Righttoemid; + public ModelRenderer Righttoeleft; + public ModelRenderer Righttoeright; + public ModelRenderer Outertoelowerright; + public ModelRenderer Righttoelowermid; + public ModelRenderer Righttoelowerleft; + public ModelRenderer Righttoelowerright; + public ModelRenderer Outertoelowerright_1; + public ModelRenderer Rightleg; + public ModelRenderer Rightfoot; + public ModelRenderer Lefttoemid; + public ModelRenderer Lefttoeright; + public ModelRenderer Lefttoeleft; + public ModelRenderer Outertoeleft; + public ModelRenderer Lefttoelowermid; + public ModelRenderer Lefttoelowerright; + public ModelRenderer Lefttoelowerleft; + public ModelRenderer Outertoelowerleft; + public ModelRenderer Spiketop7; + public ModelRenderer Spiketop8; + public ModelRenderer Spiketop9; + public ModelRenderer Neckmid; + public ModelRenderer Spiketop2; + public ModelRenderer Neckend; + public ModelRenderer Spiketop1; + public ModelRenderer Headback; + public ModelRenderer Snout; + public ModelRenderer Headlargehornlowerleft; + public ModelRenderer Headlargehornlowerright; + public ModelRenderer Smallheadhornleft2; + public ModelRenderer Smallheadhornright2; + public ModelRenderer Headmidhornlowerleft; + public ModelRenderer Headmidhornlowerright; + public ModelRenderer Mouthback_MOVE_THIS_TO_OPEN_MOUTH; + public ModelRenderer Tooth5; + public ModelRenderer Tooth4; + public ModelRenderer Tooth3; + public ModelRenderer Tooth2; + public ModelRenderer Tooth1; + public ModelRenderer Tooth6; + public ModelRenderer Tooth7; + public ModelRenderer Tooth8; + public ModelRenderer Tooth9; + public ModelRenderer Tooth10; + public ModelRenderer shape159; + public ModelRenderer Headlargehornupperleft; + public ModelRenderer Smallheadhornleft1; + public ModelRenderer Headlargehornupperright; + public ModelRenderer Smallheadhornright1; + public ModelRenderer Smallheadhornleft3; + public ModelRenderer Smallheadhornright3; + public ModelRenderer Headmidhornupperleft; + public ModelRenderer Headmidhornupperright; + public ModelRenderer Lowerjawback; + public ModelRenderer Lowerjaw; + public ModelRenderer Smallheadhornright3_1; + public ModelRenderer Smallheadhornleft3_1; + public ModelRenderer Underlowerjaw2; + public ModelRenderer Underlowerjaw; + public ModelRenderer Tooth17; + public ModelRenderer Tooth13; + public ModelRenderer Tooth16; + public ModelRenderer Tooth12; + public ModelRenderer Tooth18; + public ModelRenderer Tooth14; + public ModelRenderer Tooth15; + public ModelRenderer Tooth11; + public ModelRenderer Underlowerjaw3; + public ModelRenderer Wingupperarmleft; + public ModelRenderer Winglowerarmleft; + public ModelRenderer Wingmembramesmallleft; + public ModelRenderer Wingfinger1left; + public ModelRenderer Wingmembramemidleft; + public ModelRenderer Wingfingerlower1left; + public ModelRenderer Wingfinger2left; + public ModelRenderer Wingfinger3left; + public ModelRenderer Wingmembramelargeleft; + public ModelRenderer Wingfingerlower2left; + public ModelRenderer Wingfingerlower3left; + public ModelRenderer Lowerarmleft; + public ModelRenderer Lefthandrightfinger; + public ModelRenderer Lefthandmidfinger; + public ModelRenderer Lefthandrightfinger_1; + public ModelRenderer Thumbtoeupperleft; + public ModelRenderer Clawlefthandright; + public ModelRenderer Clawlefthandmid; + public ModelRenderer Clawlefthandleft; + public ModelRenderer Thumbtoelowerleft; + public ModelRenderer Lowerarmleft_1; + public ModelRenderer Righthandleftfinger; + public ModelRenderer Righthandmidfinger; + public ModelRenderer Righthandrightfinger; + public ModelRenderer Thumbtoeupperright; + public ModelRenderer Clawrighthandleft; + public ModelRenderer Clawrighthandmid; + public ModelRenderer Clawrighthandright; + public ModelRenderer Thumbtoelowerright; + public ModelRenderer Spiketop3; + public ModelRenderer Spiketop4; + public ModelRenderer Spiketop5; + public ModelRenderer Spiketop6; + public ModelRenderer Wingupperarmright; + public ModelRenderer Winglowerarmright; + public ModelRenderer Wingmembramesmallright; + public ModelRenderer Wingfinger1right; + public ModelRenderer Wingmembramemidright; + public ModelRenderer Wingfinger2right; + public ModelRenderer Wingfinger3right; + public ModelRenderer Wingfingerlower1right; + public ModelRenderer Wingmembramelargeright; + public ModelRenderer Wingfingerlower2right; + public ModelRenderer Wingfingerlower3right; - public ModelFrostDragon() { - this.textureWidth = 512; - this.textureHeight = 512; - this.Tooth13 = new ModelRenderer(this, 180, 500); - this.Tooth13.setRotationPoint(2.5F, 0.6F, -7.5F); - this.Tooth13.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth13, 0.0F, 0.0F, 0.22759093446006054F); - this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornright3.setRotationPoint(1.0F, 1.0F, 0.0F); - this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Smallheadhornright3, -0.27314402793711257F, 0.0F, 0.0F); - this.Headmidhornupperright = new ModelRenderer(this, 190, 430); - this.Headmidhornupperright.setRotationPoint(-1.0F, 0.1F, 5.9F); - this.Headmidhornupperright.addBox(0.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); - this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.31869712141416456F, 0.0F); - this.Spikebase4 = new ModelRenderer(this, 280, 440); - this.Spikebase4.setRotationPoint(0.0F, -2.0F, 25.0F); - this.Spikebase4.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 4, 0.0F); - this.setRotateAngle(Spikebase4, -0.8651597102135892F, 0.0F, 0.0F); - this.Spiketop16 = new ModelRenderer(this, 300, 460); - this.Spiketop16.setRotationPoint(0.0F, 1.5F, 14.0F); - this.Spiketop16.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop16, -0.091106186954104F, 0.0F, 0.0F); - this.Righttoelowerleft = new ModelRenderer(this, 290, 270); - this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); - this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.Underlowerjaw2 = new ModelRenderer(this, 160, 340); - this.Underlowerjaw2.setRotationPoint(0.0F, 4.0F, -3.0F); - this.Underlowerjaw2.addBox(-2.0F, -1.0F, -4.0F, 4, 1, 4, 0.0F); - this.setRotateAngle(Underlowerjaw2, -0.22759093446006054F, 0.0F, 0.0F); - this.Spiketop10 = new ModelRenderer(this, 300, 460); - this.Spiketop10.setRotationPoint(0.0F, 0.0F, 25.0F); - this.Spiketop10.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); - this.setRotateAngle(Spiketop10, -0.31869712141416456F, 0.0F, 0.0F); - this.Clawrighthandright = new ModelRenderer(this, 200, 260); - this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); - this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); - this.Rightleg = new ModelRenderer(this, 260, 275); - this.Rightleg.mirror = true; - this.Rightleg.setRotationPoint(1.0F, 14.6F, 0.0F); - this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.22759093446006054F, 0.136659280431156F); - this.Righthip = new ModelRenderer(this, 260, 300); - this.Righthip.setRotationPoint(-5.5F, 3.0F, 15.0F); - this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Righthip, -0.27314402793711257F, -0.27314402793711257F, 0.18203784098300857F); - this.Tooth10 = new ModelRenderer(this, 180, 500); - this.Tooth10.setRotationPoint(-2.7F, 4.8F, -9.7F); - this.Tooth10.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth10, 0.6829473363053812F, -1.9123572614101867F, -0.31869712141416456F); - this.Tooth3 = new ModelRenderer(this, 180, 500); - this.Tooth3.setRotationPoint(2.7F, 5.0F, -8.1F); - this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); - this.Shoulderleft = new ModelRenderer(this, 220, 300); - this.Shoulderleft.mirror = true; - this.Shoulderleft.setRotationPoint(8.0F, 8.0F, 6.0F); - this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); - this.Outertoeleft = new ModelRenderer(this, 305, 280); - this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.22759093446006054F, 0.40980330836826856F); - this.Spikebase1 = new ModelRenderer(this, 300, 440); - this.Spikebase1.setRotationPoint(0.0F, 0.0F, 1.0F); - this.Spikebase1.addBox(-1.0F, -3.0F, 0.0F, 2, 3, 3, 0.0F); - this.setRotateAngle(Spikebase1, -0.4553564018453205F, 0.0F, 0.0F); - this.Tooth12 = new ModelRenderer(this, 180, 500); - this.Tooth12.setRotationPoint(2.5F, 0.4F, -4.5F); - this.Tooth12.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth12, 0.0F, 0.0F, 0.22759093446006054F); - this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); - this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); - this.Tooth8 = new ModelRenderer(this, 180, 500); - this.Tooth8.setRotationPoint(-2.8F, 5.0F, -5.5F); - this.Tooth8.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth8, 0.045553093477052F, -0.045553093477052F, 0.31869712141416456F); - this.Tooth18 = new ModelRenderer(this, 180, 500); - this.Tooth18.setRotationPoint(-2.5F, 0.6F, -10.0F); - this.Tooth18.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth18, 0.22759093446006054F, 0.0F, -0.22759093446006054F); - this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); - this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); - this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerright.setRotationPoint(-1.6F, 0.0F, -3.0F); - this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornlowerright, 0.18203784098300857F, -0.27314402793711257F, - -0.36425021489121656F); - this.Tooth16 = new ModelRenderer(this, 180, 500); - this.Tooth16.setRotationPoint(-2.5F, 0.4F, -4.5F); - this.Tooth16.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth16, 0.0F, 0.0F, -0.22759093446006054F); - this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); - this.Headlargehornupperleft.setRotationPoint(1.1F, 0.1F, 4.7F); - this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornupperleft, 0.0F, -0.7285004297824331F, 0.0F); - this.Spiketop7 = new ModelRenderer(this, 300, 460); - this.Spiketop7.setRotationPoint(0.0F, -5.0F, 0.1F); - this.Spiketop7.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop7, -0.136659280431156F, 0.0F, 0.0F); - this.Snout = new ModelRenderer(this, 120, 365); - this.Snout.setRotationPoint(0.0F, 0.61F, -10.0F); - this.Snout.addBox(-3.0F, 0.0F, -10.0F, 6, 6, 10, 0.0F); - this.setRotateAngle(Snout, -0.091106186954104F, 0.0F, 0.015533430342749534F); - this.Lefttoeleft = new ModelRenderer(this, 290, 280); - this.Lefttoeleft.mirror = true; - this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); - this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); - this.Lefttoeright = new ModelRenderer(this, 290, 280); - this.Lefttoeright.mirror = true; - this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); - this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); - this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); - this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); - this.Smallheadhornright1 = new ModelRenderer(this, 190, 420); - this.Smallheadhornright1.setRotationPoint(0.0F, 0.1F, 6.0F); - this.Smallheadhornright1.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornright1, 0.0F, -0.5009094953223726F, 0.0F); - this.Wingmembramesmallleft = new ModelRenderer(this, 420, 280); - this.Wingmembramesmallleft.mirror = true; - this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); - this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); - this.Smallheadhornright3_1 = new ModelRenderer(this, 190, 410); - this.Smallheadhornright3_1.setRotationPoint(-2.0F, -2.4F, -1.5F); - this.Smallheadhornright3_1.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); - this.setRotateAngle(Smallheadhornright3_1, -0.6373942428283291F, -0.4553564018453205F, 0.0F); - this.Winglowerarmright = new ModelRenderer(this, 400, 215); - this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); - this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); - this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger_1.mirror = true; - this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); - this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); - this.Tail3 = new ModelRenderer(this, 5, 335); - this.Tail3.setRotationPoint(0.0F, 1.0F, 24.0F); - this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); - this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); - this.Smallheadhornleft3_1 = new ModelRenderer(this, 190, 410); - this.Smallheadhornleft3_1.setRotationPoint(2.0F, -2.4F, -2.5F); - this.Smallheadhornleft3_1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); - this.setRotateAngle(Smallheadhornleft3_1, -0.6373942428283291F, 0.4553564018453205F, 0.0F); - this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); - this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); - this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); - this.RTailMembrane = new ModelRenderer(this, 381, 270); - this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); - this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); - this.Wingshoulderleft = new ModelRenderer(this, 470, 230); - this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 4.0F); - this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); - this.Neckbase = new ModelRenderer(this, 120, 470); - this.Neckbase.setRotationPoint(0.0F, 4.0F, 8.0F); - this.Neckbase.addBox(-6.0F, 0.0F, -14.0F, 12, 14, 14, 0.0F); - this.setRotateAngle(Neckbase, -0.4553564018453205F, 0.0F, 0.0F); - this.Spiketop4 = new ModelRenderer(this, 300, 460); - this.Spiketop4.setRotationPoint(0.0F, -2.0F, 0.1F); - this.Spiketop4.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop4, -0.27314402793711257F, 0.0F, 0.0F); - this.Clawlefthandmid = new ModelRenderer(this, 200, 260); - this.Clawlefthandmid.mirror = true; - this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Body = new ModelRenderer(this, 6, 460); - this.Body.setRotationPoint(0.0F, -3.0F, -16.0F); - this.Body.addBox(-8.0F, 0.0F, 0.0F, 16, 18, 23, 0.0F); - this.setRotateAngle(Body, 0.5462880558742251F, 0.0F, 0.0F); - this.Tooth9 = new ModelRenderer(this, 180, 500); - this.Tooth9.setRotationPoint(-2.7F, 5.0F, -8.1F); - this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); - this.Wingfinger3right = new ModelRenderer(this, 390, 170); - this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); - this.Wingfinger1left = new ModelRenderer(this, 350, 200); - this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); - this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); - this.Tooth15 = new ModelRenderer(this, 180, 500); - this.Tooth15.setRotationPoint(-2.5F, 0.6F, -1.3F); - this.Tooth15.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth15, 0.0F, 0.0F, -0.22759093446006054F); - this.Neckmid = new ModelRenderer(this, 120, 445); - this.Neckmid.setRotationPoint(0.0F, 1.0F, -12.0F); - this.Neckmid.addBox(-4.5F, 0.0F, -9.0F, 9, 11, 12, 0.0F); - this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Tooth17 = new ModelRenderer(this, 180, 500); - this.Tooth17.setRotationPoint(-2.5F, 0.6F, -7.5F); - this.Tooth17.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth17, 0.0F, 0.0F, -0.22759093446006054F); - this.RightFoot = new ModelRenderer(this, 260, 255); - this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); - this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Spiketop13 = new ModelRenderer(this, 300, 460); - this.Spiketop13.setRotationPoint(0.0F, 1.9F, 17.0F); - this.Spiketop13.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(Spiketop13, -0.27314402793711257F, 0.0F, 0.0F); - this.Tooth2 = new ModelRenderer(this, 180, 500); - this.Tooth2.setRotationPoint(2.8F, 5.0F, -5.5F); - this.Tooth2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth2, -0.045553093477052F, 0.045553093477052F, -0.31869712141416456F); - this.Tail8 = new ModelRenderer(this, 5, 220); - this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); - this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); - this.LTailMembrane = new ModelRenderer(this, 380, 250); - this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); - this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); - this.Righttoemid = new ModelRenderer(this, 290, 280); - this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); - this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.Righthandrightfinger = new ModelRenderer(this, 220, 260); - this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); - this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); - this.Tail1 = new ModelRenderer(this, 5, 370); - this.Tail1.setRotationPoint(0.0F, 1.0F, 23.0F); - this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); - this.setRotateAngle(Tail1, -0.6829473363053812F, 0.0F, 0.0F); - this.Tooth11 = new ModelRenderer(this, 180, 500); - this.Tooth11.setRotationPoint(2.5F, 0.6F, -1.3F); - this.Tooth11.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth11, 0.0F, 0.0F, 0.22759093446006054F); - this.Tail4 = new ModelRenderer(this, 5, 300); - this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); - this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); - this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerright.setRotationPoint(-3.0F, 2.0F, -3.8F); - this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headmidhornlowerright, -0.136659280431156F, -0.5462880558742251F, 0.0F); - this.Spiketop1 = new ModelRenderer(this, 300, 460); - this.Spiketop1.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Spiketop1.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop1, -0.091106186954104F, 0.0F, 0.0F); - this.Headlargehornupperright = new ModelRenderer(this, 190, 470); - this.Headlargehornupperright.setRotationPoint(-1.1F, 0.1F, 4.7F); - this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornupperright, 0.0F, 0.7285004297824331F, 0.0F); - this.Wingupperarmright = new ModelRenderer(this, 390, 230); - this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); - this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); - this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); - this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); - this.Clawrighthandleft = new ModelRenderer(this, 200, 260); - this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); - this.Rightfoot = new ModelRenderer(this, 260, 255); - this.Rightfoot.mirror = true; - this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); - this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); - this.Lowerarmleft_1.setRotationPoint(-3.01F, 8.5F, 0.0F); - this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, 0.0F, 0.0F); - this.Tooth1 = new ModelRenderer(this, 180, 500); - this.Tooth1.setRotationPoint(2.8F, 5.0F, -3.2F); - this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); - this.LTailSpike = new ModelRenderer(this, 350, 300); - this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); - this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); - this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Wingfinger2right = new ModelRenderer(this, 330, 150); - this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); - this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); - this.Righttoelowerright = new ModelRenderer(this, 290, 270); - this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); - this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Outertoelowerleft = new ModelRenderer(this, 305, 270); - this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); - this.Spikebase5 = new ModelRenderer(this, 280, 440); - this.Spikebase5.setRotationPoint(0.0F, 2.5F, 5.3F); - this.Spikebase5.addBox(-1.0F, -7.0F, 0.0F, 2, 7, 4, 0.0F); - this.setRotateAngle(Spikebase5, -0.18203784098300857F, 0.0F, 0.0F); - this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); - this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); - this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); - this.Neckend = new ModelRenderer(this, 120, 420); - this.Neckend.setRotationPoint(0.0F, -0.9F, -8.5F); - this.Neckend.addBox(-3.5F, 1.0F, -10.0F, 7, 9, 10, 0.0F); - this.setRotateAngle(Neckend, 0.27314402793711257F, 0.0F, 0.0F); - this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerleft.setRotationPoint(3.0F, 2.0F, -3.8F); - this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headmidhornlowerleft, -0.136659280431156F, 0.5462880558742251F, 0.0F); - this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornleft3.setRotationPoint(-1.0F, 1.0F, 0.0F); - this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Smallheadhornleft3, -0.27314402793711257F, 0.0F, 0.0F); - this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornright2.setRotationPoint(-4.0F, 5.0F, -3.0F); - this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); - this.Wingfinger1right = new ModelRenderer(this, 350, 200); - this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); - this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); - this.Spiketop17 = new ModelRenderer(this, 300, 460); - this.Spiketop17.setRotationPoint(0.0F, 1.5F, 2.0F); - this.Spiketop17.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.setRotateAngle(Spiketop17, -0.18203784098300857F, 0.0F, 0.0F); - this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); - this.Headmidhornupperleft.setRotationPoint(1.0F, 0.1F, 5.9F); - this.Headmidhornupperleft.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); - this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.31869712141416456F, 0.0F); - this.Spiketop15 = new ModelRenderer(this, 300, 460); - this.Spiketop15.setRotationPoint(0.0F, 2.6F, 9.0F); - this.Spiketop15.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); - this.setRotateAngle(Spiketop15, -0.18203784098300857F, 0.0F, 0.0F); - this.Outertoelowerright = new ModelRenderer(this, 320, 280); - this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); - this.Headback = new ModelRenderer(this, 120, 390); - this.Headback.setRotationPoint(-0.01F, 0.6F, -9.0F); - this.Headback.addBox(-4.0F, 0.0F, -11.0F, 8, 7, 11, 0.0F); - this.setRotateAngle(Headback, 0.27314402793711257F, 0.0F, 0.0F); - this.Lowerarmleft = new ModelRenderer(this, 220, 275); - this.Lowerarmleft.mirror = true; - this.Lowerarmleft.setRotationPoint(1.01F, 8.5F, 0.0F); - this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.0F, 0.0F); - this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); - this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); - this.Wingshoulderright = new ModelRenderer(this, 470, 230); - this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 4.0F); - this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); - this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); - this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); - this.Spiketop12 = new ModelRenderer(this, 300, 460); - this.Spiketop12.setRotationPoint(0.0F, 0.5F, 12.0F); - this.Spiketop12.addBox(-0.5F, -11.0F, 0.0F, 1, 11, 2, 0.0F); - this.setRotateAngle(Spiketop12, -0.36425021489121656F, 0.0F, 0.0F); - this.Righthandmidfinger = new ModelRenderer(this, 220, 260); - this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); - this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); - this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); - this.Shoulderleft_1.setRotationPoint(-6.0F, 8.0F, 6.0F); - this.Shoulderleft_1.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); - this.Lefttoemid = new ModelRenderer(this, 290, 280); - this.Lefttoemid.mirror = true; - this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); - this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.RightLeg = new ModelRenderer(this, 260, 275); - this.RightLeg.setRotationPoint(-1.0F, 14.6F, 0.0F); - this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.23911010752322312F, -0.091106186954104F); - this.Spiketop9 = new ModelRenderer(this, 300, 460); - this.Spiketop9.setRotationPoint(0.0F, -1.5F, 0.1F); - this.Spiketop9.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); - this.setRotateAngle(Spiketop9, -0.045553093477052F, 0.0F, 0.0F); - this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); - this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); - this.Spiketop11 = new ModelRenderer(this, 300, 460); - this.Spiketop11.setRotationPoint(0.0F, 0.5F, 8.0F); - this.Spiketop11.addBox(-0.5F, -12.0F, -1.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop11, -0.36425021489121656F, 0.0F, 0.0F); - this.Tooth6 = new ModelRenderer(this, 180, 500); - this.Tooth6.setRotationPoint(-0.5F, 5.0F, -9.0F); - this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); - this.Righttoeright = new ModelRenderer(this, 290, 280); - this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); - this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); - this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); - this.Lefttoelowerleft.mirror = true; - this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); - this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); - this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); - this.Lowerjaw = new ModelRenderer(this, 120, 345); - this.Lowerjaw.setRotationPoint(0.0F, -0.05F, -6.7F); - this.Lowerjaw.addBox(-2.5F, 0.0F, -10.0F, 5, 2, 10, 0.0F); - this.setRotateAngle(Lowerjaw, 0.045553093477052F, 0.0F, 0.0F); - this.Spiketop18 = new ModelRenderer(this, 300, 460); - this.Spiketop18.setRotationPoint(0.0F, 1.5F, 7.0F); - this.Spiketop18.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); - this.Belly1 = new ModelRenderer(this, 5, 415); - this.Belly1.setRotationPoint(0.0F, 18.0F, 2.0F); - this.Belly1.addBox(-6.5F, -10.0F, 0.0F, 13, 10, 30, 0.0F); - this.setRotateAngle(Belly1, -0.22759093446006054F, 0.0F, 0.0F); - this.Tooth5 = new ModelRenderer(this, 180, 500); - this.Tooth5.setRotationPoint(0.5F, 5.0F, -9.0F); - this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); - this.Spikebase6 = new ModelRenderer(this, 300, 440); - this.Spikebase6.setRotationPoint(0.0F, 0.5F, 12.0F); - this.Spikebase6.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Spikebase6, -0.27314402793711257F, 0.0F, 0.0F); - this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); - this.Lefthandmidfinger.mirror = true; - this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); - this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); - this.Lefttoelowermid = new ModelRenderer(this, 290, 270); - this.Lefttoelowermid.mirror = true; - this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); - this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Underlowerjaw3 = new ModelRenderer(this, 160, 325); - this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Underlowerjaw3.addBox(-2.0F, -3.0F, 0.0F, 4, 3, 6, 0.0F); - this.setRotateAngle(Underlowerjaw3, 0.4553564018453205F, 0.0F, 0.0F); - this.Tooth4 = new ModelRenderer(this, 180, 500); - this.Tooth4.setRotationPoint(2.6F, 4.8F, -9.7F); - this.Tooth4.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth4, 0.6829473363053812F, 1.8668041679331349F, 0.31869712141416456F); - this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH = new ModelRenderer(this, 120, 320); - this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.setRotationPoint(0.0F, 6.0F, -4.0F); - this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.addBox(-2.5F, 0.0F, -5.0F, 5, 3, 6, 0.0F); - this.setRotateAngle(Mouthback_MOVE_THIS_TO_OPEN_MOUTH, 0F, 0.0F, 0.0F); - this.Spikebase2 = new ModelRenderer(this, 280, 440); - this.Spikebase2.setRotationPoint(0.0F, 0.0F, 7.0F); - this.Spikebase2.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 4, 0.0F); - this.setRotateAngle(Spikebase2, -0.4553564018453205F, 0.0F, 0.0F); - this.Spiketop14 = new ModelRenderer(this, 300, 460); - this.Spiketop14.setRotationPoint(0.0F, 1.0F, 4.5F); - this.Spiketop14.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(Spiketop14, -0.27314402793711257F, 0.0F, 0.0F); - this.shape159 = new ModelRenderer(this, 0, 0); - this.shape159.setRotationPoint(0.0F, 0.0F, 0.0F); - this.shape159.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F); - this.Wingmembramemidright = new ModelRenderer(this, 350, 340); - this.Wingmembramemidright.mirror = true; - this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); - this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); - this.Lefttoelowerright = new ModelRenderer(this, 290, 270); - this.Lefttoelowerright.mirror = true; - this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); - this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Clawlefthandleft = new ModelRenderer(this, 200, 260); - this.Clawlefthandleft.mirror = true; - this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); - this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); - this.Spiketop2 = new ModelRenderer(this, 300, 460); - this.Spiketop2.setRotationPoint(0.0F, 1.0F, -12.5F); - this.Spiketop2.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); - this.setRotateAngle(Spiketop2, -0.22759093446006054F, 0.0F, 0.0F); - this.Wingmembramelargeright = new ModelRenderer(this, 270, 365); - this.Wingmembramelargeright.mirror = true; - this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Spiketop5 = new ModelRenderer(this, 300, 460); - this.Spiketop5.setRotationPoint(0.0F, -7.0F, 2.1F); - this.Spiketop5.addBox(-0.5F, -15.0F, 0.0F, 1, 15, 2, 0.0F); - this.setRotateAngle(Spiketop5, -0.136659280431156F, 0.0F, 0.0F); - this.Winglowerarmleft = new ModelRenderer(this, 400, 215); - this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); - this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); - this.Clawrighthandmid = new ModelRenderer(this, 200, 260); - this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Spiketop19 = new ModelRenderer(this, 300, 460); - this.Spiketop19.setRotationPoint(0.0F, 3.0F, 11.0F); - this.Spiketop19.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); - this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); - this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); - this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); - this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); - this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerleft.setRotationPoint(1.6F, 0.0F, -3.0F); - this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornlowerleft, 0.18203784098300857F, 0.27314402793711257F, 0.36425021489121656F); - this.Wingfinger3left = new ModelRenderer(this, 390, 170); - this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); - this.RTailSpike = new ModelRenderer(this, 350, 300); - this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); - this.Tail7 = new ModelRenderer(this, 5, 240); - this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); - this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); - this.setRotateAngle(Tail7, 0.136659280431156F, 0.0F, 0.0F); - this.Lowerjawback = new ModelRenderer(this, 120, 330); - this.Lowerjawback.setRotationPoint(0.0F, 0.5F, 1.0F); - this.Lowerjawback.addBox(-3.0F, 0.0F, -7.0F, 6, 3, 7, 0.0F); - this.setRotateAngle(Lowerjawback, 0.31869712141416456F, 0.0F, 0.0F); - this.Tooth14 = new ModelRenderer(this, 180, 500); - this.Tooth14.setRotationPoint(2.5F, 0.5F, -10.0F); - this.Tooth14.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth14, 0.22759093446006054F, 0.0F, 0.22759093446006054F); - this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger.mirror = true; - this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); - this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); - this.Clawlefthandright = new ModelRenderer(this, 200, 260); - this.Clawlefthandright.mirror = true; - this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); - this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); - this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); - this.Spikebase7 = new ModelRenderer(this, 300, 440); - this.Spikebase7.setRotationPoint(0.0F, 0.0F, 18.5F); - this.Spikebase7.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Spikebase7, -0.27314402793711257F, 0.0F, 0.0F); - this.Lefthip = new ModelRenderer(this, 260, 300); - this.Lefthip.mirror = true; - this.Lefthip.setRotationPoint(5.5F, 3.0F, 15.0F); - this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Lefthip, -0.27314402793711257F, 0.27314402793711257F, -0.18203784098300857F); - this.Righttoeleft = new ModelRenderer(this, 290, 280); - this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); - this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); - this.Wingfinger2left = new ModelRenderer(this, 330, 150); - this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); - this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); - this.Spiketop3 = new ModelRenderer(this, 300, 460); - this.Spiketop3.setRotationPoint(0.0F, -3.0F, 0.1F); - this.Spiketop3.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop3, -0.22759093446006054F, 0.0F, 0.0F); - this.Underlowerjaw = new ModelRenderer(this, 160, 350); - this.Underlowerjaw.setRotationPoint(0.0F, 3.0F, -7.0F); - this.Underlowerjaw.addBox(-1.5F, -1.0F, -8.0F, 3, 1, 8, 0.0F); - this.setRotateAngle(Underlowerjaw, -0.091106186954104F, 0.0F, 0.0F); - this.Tooth7 = new ModelRenderer(this, 180, 500); - this.Tooth7.setRotationPoint(-2.8F, 5.0F, -3.2F); - this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); - this.Spkebase3 = new ModelRenderer(this, 280, 440); - this.Spkebase3.setRotationPoint(0.0F, 0.0F, 11.5F); - this.Spkebase3.addBox(-1.0F, -7.0F, 2.0F, 2, 7, 4, 0.0F); - this.setRotateAngle(Spkebase3, -0.7285004297824331F, 0.0F, 0.0F); - this.Tail6 = new ModelRenderer(this, 5, 275); - this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); - this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); - this.setRotateAngle(Tail6, 0.091106186954104F, 0.0F, 0.0F); - this.Righthandleftfinger = new ModelRenderer(this, 220, 260); - this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); - this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); - this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornleft2.setRotationPoint(4.0F, 5.0F, -3.0F); - this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); - this.Righttoelowermid = new ModelRenderer(this, 290, 270); - this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); - this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Smallheadhornleft1 = new ModelRenderer(this, 190, 420); - this.Smallheadhornleft1.setRotationPoint(0.0F, 0.0F, 6.0F); - this.Smallheadhornleft1.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(Smallheadhornleft1, 0.0F, 0.5009094953223726F, 0.0F); - this.Spiketop6 = new ModelRenderer(this, 300, 460); - this.Spiketop6.setRotationPoint(0.0F, 1.0F, 0.1F); - this.Spiketop6.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); - this.setRotateAngle(Spiketop6, -0.136659280431156F, 0.0F, 0.0F); - this.Wingupperarmleft = new ModelRenderer(this, 390, 230); - this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); - this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); - this.Spiketop8 = new ModelRenderer(this, 300, 460); - this.Spiketop8.setRotationPoint(0.0F, -5.0F, 0.1F); - this.Spiketop8.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); - this.setRotateAngle(Spiketop8, -0.045553093477052F, 0.0F, 0.0F); - this.Lowerjaw.addChild(this.Tooth13); - this.Smallheadhornright2.addChild(this.Smallheadhornright3); - this.Headmidhornlowerright.addChild(this.Headmidhornupperright); - this.Body.addChild(this.Spikebase4); - this.Tail4.addChild(this.Spiketop16); - this.Righttoeleft.addChild(this.Righttoelowerleft); - this.Lowerjawback.addChild(this.Underlowerjaw2); - this.Tail1.addChild(this.Spiketop10); - this.Righthandrightfinger.addChild(this.Clawrighthandright); - this.Lefthip.addChild(this.Rightleg); - this.Tail1.addChild(this.Righthip); - this.Snout.addChild(this.Tooth10); - this.Snout.addChild(this.Tooth3); - this.Body.addChild(this.Shoulderleft); - this.Rightfoot.addChild(this.Outertoeleft); - this.Body.addChild(this.Spikebase1); - this.Lowerjaw.addChild(this.Tooth12); - this.Wingfinger2right.addChild(this.Wingfingerlower2right); - this.Snout.addChild(this.Tooth8); - this.Lowerjaw.addChild(this.Tooth18); - this.Lowerarmleft.addChild(this.Thumbtoeupperleft); - this.Headback.addChild(this.Headlargehornlowerright); - this.Lowerjaw.addChild(this.Tooth16); - this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); - this.Spikebase5.addChild(this.Spiketop7); - this.Headback.addChild(this.Snout); - this.Rightfoot.addChild(this.Lefttoeleft); - this.Rightfoot.addChild(this.Lefttoeright); - this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); - this.Headlargehornupperright.addChild(this.Smallheadhornright1); - this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); - this.Lowerjawback.addChild(this.Smallheadhornright3_1); - this.Wingupperarmright.addChild(this.Winglowerarmright); - this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); - this.Tail1.addChild(this.Tail3); - this.Lowerjawback.addChild(this.Smallheadhornleft3_1); - this.Wingupperarmright.addChild(this.Wingmembramesmallright); - this.RTailSpike.addChild(this.RTailMembrane); - this.Body.addChild(this.Wingshoulderleft); - this.Body.addChild(this.Neckbase); - this.Spikebase2.addChild(this.Spiketop4); - this.Lefthandmidfinger.addChild(this.Clawlefthandmid); - this.Snout.addChild(this.Tooth9); - this.Wingfinger1right.addChild(this.Wingfinger3right); - this.Winglowerarmleft.addChild(this.Wingfinger1left); - this.Lowerjaw.addChild(this.Tooth15); - this.Neckbase.addChild(this.Neckmid); - this.Lowerjaw.addChild(this.Tooth17); - this.RightLeg.addChild(this.RightFoot); - this.Tail3.addChild(this.Spiketop13); - this.Snout.addChild(this.Tooth2); - this.Tail7.addChild(this.Tail8); - this.LTailSpike.addChild(this.LTailMembrane); - this.RightFoot.addChild(this.Righttoemid); - this.Lowerarmleft_1.addChild(this.Righthandrightfinger); - this.Body.addChild(this.Tail1); - this.Lowerjaw.addChild(this.Tooth11); - this.Tail3.addChild(this.Tail4); - this.Headback.addChild(this.Headmidhornlowerright); - this.Neckmid.addChild(this.Spiketop1); - this.Headlargehornlowerright.addChild(this.Headlargehornupperright); - this.Wingshoulderright.addChild(this.Wingupperarmright); - this.Wingfinger2left.addChild(this.Wingfingerlower2left); - this.Righthandleftfinger.addChild(this.Clawrighthandleft); - this.Rightleg.addChild(this.Rightfoot); - this.Shoulderleft_1.addChild(this.Lowerarmleft_1); - this.Snout.addChild(this.Tooth1); - this.Tail8.addChild(this.LTailSpike); - this.Wingfinger1left.addChild(this.Wingmembramelargeleft); - this.Wingfinger1right.addChild(this.Wingfinger2right); - this.Righttoeright.addChild(this.Righttoelowerright); - this.Outertoeleft.addChild(this.Outertoelowerleft); - this.Tail1.addChild(this.Spikebase5); - this.Winglowerarmleft.addChild(this.Wingmembramemidleft); - this.Neckmid.addChild(this.Neckend); - this.Headback.addChild(this.Headmidhornlowerleft); - this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); - this.Headback.addChild(this.Smallheadhornright2); - this.Winglowerarmright.addChild(this.Wingfinger1right); - this.Tail6.addChild(this.Spiketop17); - this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); - this.Tail4.addChild(this.Spiketop15); - this.RightFoot.addChild(this.Outertoelowerright); - this.Neckend.addChild(this.Headback); - this.Shoulderleft.addChild(this.Lowerarmleft); - this.Wingfinger3right.addChild(this.Wingfingerlower3right); - this.Body.addChild(this.Wingshoulderright); - this.Wingfinger1left.addChild(this.Wingfingerlower1left); - this.Tail3.addChild(this.Spiketop12); - this.Lowerarmleft_1.addChild(this.Righthandmidfinger); - this.Body.addChild(this.Shoulderleft_1); - this.Rightfoot.addChild(this.Lefttoemid); - this.Righthip.addChild(this.RightLeg); - this.Spikebase7.addChild(this.Spiketop9); - this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); - this.Tail3.addChild(this.Spiketop11); - this.Snout.addChild(this.Tooth6); - this.RightFoot.addChild(this.Righttoeright); - this.Lefttoeleft.addChild(this.Lefttoelowerleft); - this.Wingfinger1right.addChild(this.Wingfingerlower1right); - this.Lowerjawback.addChild(this.Lowerjaw); - this.Tail6.addChild(this.Spiketop18); - this.Body.addChild(this.Belly1); - this.Snout.addChild(this.Tooth5); - this.Tail1.addChild(this.Spikebase6); - this.Lowerarmleft.addChild(this.Lefthandmidfinger); - this.Lefttoemid.addChild(this.Lefttoelowermid); - this.Underlowerjaw2.addChild(this.Underlowerjaw3); - this.Snout.addChild(this.Tooth4); - this.Headback.addChild(this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH); - this.Body.addChild(this.Spikebase2); - this.Tail4.addChild(this.Spiketop14); - this.Snout.addChild(this.shape159); - this.Winglowerarmright.addChild(this.Wingmembramemidright); - this.Lefttoeright.addChild(this.Lefttoelowerright); - this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); - this.Neckbase.addChild(this.Spiketop2); - this.Wingfinger1right.addChild(this.Wingmembramelargeright); - this.Spkebase3.addChild(this.Spiketop5); - this.Wingupperarmleft.addChild(this.Winglowerarmleft); - this.Righthandmidfinger.addChild(this.Clawrighthandmid); - this.Tail6.addChild(this.Spiketop19); - this.Outertoelowerright.addChild(this.Outertoelowerright_1); - this.Wingfinger3left.addChild(this.Wingfingerlower3left); - this.Headback.addChild(this.Headlargehornlowerleft); - this.Wingfinger1left.addChild(this.Wingfinger3left); - this.Tail8.addChild(this.RTailSpike); - this.Tail6.addChild(this.Tail7); - this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.addChild(this.Lowerjawback); - this.Lowerjaw.addChild(this.Tooth14); - this.Lowerarmleft.addChild(this.Lefthandrightfinger); - this.Lefthandrightfinger.addChild(this.Clawlefthandright); - this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); - this.Tail1.addChild(this.Spikebase7); - this.Tail1.addChild(this.Lefthip); - this.RightFoot.addChild(this.Righttoeleft); - this.Wingfinger1left.addChild(this.Wingfinger2left); - this.Spikebase1.addChild(this.Spiketop3); - this.Lowerjawback.addChild(this.Underlowerjaw); - this.Snout.addChild(this.Tooth7); - this.Body.addChild(this.Spkebase3); - this.Tail4.addChild(this.Tail6); - this.Lowerarmleft_1.addChild(this.Righthandleftfinger); - this.Headback.addChild(this.Smallheadhornleft2); - this.Righttoemid.addChild(this.Righttoelowermid); - this.Headlargehornupperleft.addChild(this.Smallheadhornleft1); - this.Spikebase4.addChild(this.Spiketop6); - this.Wingshoulderleft.addChild(this.Wingupperarmleft); - this.Spikebase6.addChild(this.Spiketop8); - } + public ModelFrostDragon() { + this.textureWidth = 512; + this.textureHeight = 512; + this.Tooth13 = new ModelRenderer(this, 180, 500); + this.Tooth13.setRotationPoint(2.5F, 0.6F, -7.5F); + this.Tooth13.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth13, 0.0F, 0.0F, 0.22759093446006054F); + this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornright3.setRotationPoint(1.0F, 1.0F, 0.0F); + this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Smallheadhornright3, -0.27314402793711257F, 0.0F, 0.0F); + this.Headmidhornupperright = new ModelRenderer(this, 190, 430); + this.Headmidhornupperright.setRotationPoint(-1.0F, 0.1F, 5.9F); + this.Headmidhornupperright.addBox(0.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); + this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, 0.31869712141416456F, 0.0F); + this.Spikebase4 = new ModelRenderer(this, 280, 440); + this.Spikebase4.setRotationPoint(0.0F, -2.0F, 25.0F); + this.Spikebase4.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 4, 0.0F); + this.setRotateAngle(Spikebase4, -0.8651597102135892F, 0.0F, 0.0F); + this.Spiketop16 = new ModelRenderer(this, 300, 460); + this.Spiketop16.setRotationPoint(0.0F, 1.5F, 14.0F); + this.Spiketop16.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop16, -0.091106186954104F, 0.0F, 0.0F); + this.Righttoelowerleft = new ModelRenderer(this, 290, 270); + this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); + this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.Underlowerjaw2 = new ModelRenderer(this, 160, 340); + this.Underlowerjaw2.setRotationPoint(0.0F, 4.0F, -3.0F); + this.Underlowerjaw2.addBox(-2.0F, -1.0F, -4.0F, 4, 1, 4, 0.0F); + this.setRotateAngle(Underlowerjaw2, -0.22759093446006054F, 0.0F, 0.0F); + this.Spiketop10 = new ModelRenderer(this, 300, 460); + this.Spiketop10.setRotationPoint(0.0F, 0.0F, 25.0F); + this.Spiketop10.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); + this.setRotateAngle(Spiketop10, -0.31869712141416456F, 0.0F, 0.0F); + this.Clawrighthandright = new ModelRenderer(this, 200, 260); + this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); + this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); + this.Rightleg = new ModelRenderer(this, 260, 275); + this.Rightleg.mirror = true; + this.Rightleg.setRotationPoint(1.0F, 14.6F, 0.0F); + this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.22759093446006054F, 0.136659280431156F); + this.Righthip = new ModelRenderer(this, 260, 300); + this.Righthip.setRotationPoint(-5.5F, 3.0F, 15.0F); + this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Righthip, -0.27314402793711257F, -0.27314402793711257F, 0.18203784098300857F); + this.Tooth10 = new ModelRenderer(this, 180, 500); + this.Tooth10.setRotationPoint(-2.7F, 4.8F, -9.7F); + this.Tooth10.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth10, 0.6829473363053812F, -1.9123572614101867F, -0.31869712141416456F); + this.Tooth3 = new ModelRenderer(this, 180, 500); + this.Tooth3.setRotationPoint(2.7F, 5.0F, -8.1F); + this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); + this.Shoulderleft = new ModelRenderer(this, 220, 300); + this.Shoulderleft.mirror = true; + this.Shoulderleft.setRotationPoint(8.0F, 8.0F, 6.0F); + this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); + this.Outertoeleft = new ModelRenderer(this, 305, 280); + this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.22759093446006054F, 0.40980330836826856F); + this.Spikebase1 = new ModelRenderer(this, 300, 440); + this.Spikebase1.setRotationPoint(0.0F, 0.0F, 1.0F); + this.Spikebase1.addBox(-1.0F, -3.0F, 0.0F, 2, 3, 3, 0.0F); + this.setRotateAngle(Spikebase1, -0.4553564018453205F, 0.0F, 0.0F); + this.Tooth12 = new ModelRenderer(this, 180, 500); + this.Tooth12.setRotationPoint(2.5F, 0.4F, -4.5F); + this.Tooth12.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth12, 0.0F, 0.0F, 0.22759093446006054F); + this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); + this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); + this.Tooth8 = new ModelRenderer(this, 180, 500); + this.Tooth8.setRotationPoint(-2.8F, 5.0F, -5.5F); + this.Tooth8.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth8, 0.045553093477052F, -0.045553093477052F, 0.31869712141416456F); + this.Tooth18 = new ModelRenderer(this, 180, 500); + this.Tooth18.setRotationPoint(-2.5F, 0.6F, -10.0F); + this.Tooth18.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth18, 0.22759093446006054F, 0.0F, -0.22759093446006054F); + this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); + this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); + this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerright.setRotationPoint(-1.6F, 0.0F, -3.0F); + this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornlowerright, 0.18203784098300857F, -0.27314402793711257F, + -0.36425021489121656F); + this.Tooth16 = new ModelRenderer(this, 180, 500); + this.Tooth16.setRotationPoint(-2.5F, 0.4F, -4.5F); + this.Tooth16.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth16, 0.0F, 0.0F, -0.22759093446006054F); + this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); + this.Headlargehornupperleft.setRotationPoint(1.1F, 0.1F, 4.7F); + this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornupperleft, 0.0F, -0.7285004297824331F, 0.0F); + this.Spiketop7 = new ModelRenderer(this, 300, 460); + this.Spiketop7.setRotationPoint(0.0F, -5.0F, 0.1F); + this.Spiketop7.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop7, -0.136659280431156F, 0.0F, 0.0F); + this.Snout = new ModelRenderer(this, 120, 365); + this.Snout.setRotationPoint(0.0F, 0.61F, -10.0F); + this.Snout.addBox(-3.0F, 0.0F, -10.0F, 6, 6, 10, 0.0F); + this.setRotateAngle(Snout, -0.091106186954104F, 0.0F, 0.015533430342749534F); + this.Lefttoeleft = new ModelRenderer(this, 290, 280); + this.Lefttoeleft.mirror = true; + this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); + this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); + this.Lefttoeright = new ModelRenderer(this, 290, 280); + this.Lefttoeright.mirror = true; + this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); + this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); + this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); + this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); + this.Smallheadhornright1 = new ModelRenderer(this, 190, 420); + this.Smallheadhornright1.setRotationPoint(0.0F, 0.1F, 6.0F); + this.Smallheadhornright1.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornright1, 0.0F, -0.5009094953223726F, 0.0F); + this.Wingmembramesmallleft = new ModelRenderer(this, 420, 280); + this.Wingmembramesmallleft.mirror = true; + this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); + this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); + this.Smallheadhornright3_1 = new ModelRenderer(this, 190, 410); + this.Smallheadhornright3_1.setRotationPoint(-2.0F, -2.4F, -1.5F); + this.Smallheadhornright3_1.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(Smallheadhornright3_1, -0.6373942428283291F, -0.4553564018453205F, 0.0F); + this.Winglowerarmright = new ModelRenderer(this, 400, 215); + this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); + this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); + this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger_1.mirror = true; + this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); + this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); + this.Tail3 = new ModelRenderer(this, 5, 335); + this.Tail3.setRotationPoint(0.0F, 1.0F, 24.0F); + this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); + this.setRotateAngle(Tail3, 0.091106186954104F, 0.0F, 0.0F); + this.Smallheadhornleft3_1 = new ModelRenderer(this, 190, 410); + this.Smallheadhornleft3_1.setRotationPoint(2.0F, -2.4F, -2.5F); + this.Smallheadhornleft3_1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(Smallheadhornleft3_1, -0.6373942428283291F, 0.4553564018453205F, 0.0F); + this.Wingmembramesmallright = new ModelRenderer(this, 420, 280); + this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); + this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); + this.RTailMembrane = new ModelRenderer(this, 381, 270); + this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); + this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); + this.Wingshoulderleft = new ModelRenderer(this, 470, 230); + this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 4.0F); + this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); + this.Neckbase = new ModelRenderer(this, 120, 470); + this.Neckbase.setRotationPoint(0.0F, 4.0F, 8.0F); + this.Neckbase.addBox(-6.0F, 0.0F, -14.0F, 12, 14, 14, 0.0F); + this.setRotateAngle(Neckbase, -0.4553564018453205F, 0.0F, 0.0F); + this.Spiketop4 = new ModelRenderer(this, 300, 460); + this.Spiketop4.setRotationPoint(0.0F, -2.0F, 0.1F); + this.Spiketop4.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop4, -0.27314402793711257F, 0.0F, 0.0F); + this.Clawlefthandmid = new ModelRenderer(this, 200, 260); + this.Clawlefthandmid.mirror = true; + this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Body = new ModelRenderer(this, 6, 460); + this.Body.setRotationPoint(0.0F, -3.0F, -16.0F); + this.Body.addBox(-8.0F, 0.0F, 0.0F, 16, 18, 23, 0.0F); + this.setRotateAngle(Body, 0.5462880558742251F, 0.0F, 0.0F); + this.Tooth9 = new ModelRenderer(this, 180, 500); + this.Tooth9.setRotationPoint(-2.7F, 5.0F, -8.1F); + this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); + this.Wingfinger3right = new ModelRenderer(this, 390, 170); + this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); + this.Wingfinger1left = new ModelRenderer(this, 350, 200); + this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); + this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); + this.Tooth15 = new ModelRenderer(this, 180, 500); + this.Tooth15.setRotationPoint(-2.5F, 0.6F, -1.3F); + this.Tooth15.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth15, 0.0F, 0.0F, -0.22759093446006054F); + this.Neckmid = new ModelRenderer(this, 120, 445); + this.Neckmid.setRotationPoint(0.0F, 1.0F, -12.0F); + this.Neckmid.addBox(-4.5F, 0.0F, -9.0F, 9, 11, 12, 0.0F); + this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Tooth17 = new ModelRenderer(this, 180, 500); + this.Tooth17.setRotationPoint(-2.5F, 0.6F, -7.5F); + this.Tooth17.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth17, 0.0F, 0.0F, -0.22759093446006054F); + this.RightFoot = new ModelRenderer(this, 260, 255); + this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); + this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Spiketop13 = new ModelRenderer(this, 300, 460); + this.Spiketop13.setRotationPoint(0.0F, 1.9F, 17.0F); + this.Spiketop13.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(Spiketop13, -0.27314402793711257F, 0.0F, 0.0F); + this.Tooth2 = new ModelRenderer(this, 180, 500); + this.Tooth2.setRotationPoint(2.8F, 5.0F, -5.5F); + this.Tooth2.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth2, -0.045553093477052F, 0.045553093477052F, -0.31869712141416456F); + this.Tail8 = new ModelRenderer(this, 5, 220); + this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); + this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); + this.LTailMembrane = new ModelRenderer(this, 380, 250); + this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); + this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); + this.Righttoemid = new ModelRenderer(this, 290, 280); + this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); + this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.Righthandrightfinger = new ModelRenderer(this, 220, 260); + this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); + this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); + this.Tail1 = new ModelRenderer(this, 5, 370); + this.Tail1.setRotationPoint(0.0F, 1.0F, 23.0F); + this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); + this.setRotateAngle(Tail1, -0.6829473363053812F, 0.0F, 0.0F); + this.Tooth11 = new ModelRenderer(this, 180, 500); + this.Tooth11.setRotationPoint(2.5F, 0.6F, -1.3F); + this.Tooth11.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth11, 0.0F, 0.0F, 0.22759093446006054F); + this.Tail4 = new ModelRenderer(this, 5, 300); + this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); + this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); + this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerright.setRotationPoint(-3.0F, 2.0F, -3.8F); + this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headmidhornlowerright, -0.136659280431156F, -0.5462880558742251F, 0.0F); + this.Spiketop1 = new ModelRenderer(this, 300, 460); + this.Spiketop1.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Spiketop1.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop1, -0.091106186954104F, 0.0F, 0.0F); + this.Headlargehornupperright = new ModelRenderer(this, 190, 470); + this.Headlargehornupperright.setRotationPoint(-1.1F, 0.1F, 4.7F); + this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornupperright, 0.0F, 0.7285004297824331F, 0.0F); + this.Wingupperarmright = new ModelRenderer(this, 390, 230); + this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); + this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); + this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); + this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); + this.Clawrighthandleft = new ModelRenderer(this, 200, 260); + this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); + this.Rightfoot = new ModelRenderer(this, 260, 255); + this.Rightfoot.mirror = true; + this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); + this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); + this.Lowerarmleft_1.setRotationPoint(-3.01F, 8.5F, 0.0F); + this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, 0.0F, 0.0F); + this.Tooth1 = new ModelRenderer(this, 180, 500); + this.Tooth1.setRotationPoint(2.8F, 5.0F, -3.2F); + this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); + this.LTailSpike = new ModelRenderer(this, 350, 300); + this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); + this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); + this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Wingfinger2right = new ModelRenderer(this, 330, 150); + this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); + this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); + this.Righttoelowerright = new ModelRenderer(this, 290, 270); + this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); + this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Outertoelowerleft = new ModelRenderer(this, 305, 270); + this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); + this.Spikebase5 = new ModelRenderer(this, 280, 440); + this.Spikebase5.setRotationPoint(0.0F, 2.5F, 5.3F); + this.Spikebase5.addBox(-1.0F, -7.0F, 0.0F, 2, 7, 4, 0.0F); + this.setRotateAngle(Spikebase5, -0.18203784098300857F, 0.0F, 0.0F); + this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); + this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); + this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); + this.Neckend = new ModelRenderer(this, 120, 420); + this.Neckend.setRotationPoint(0.0F, -0.9F, -8.5F); + this.Neckend.addBox(-3.5F, 1.0F, -10.0F, 7, 9, 10, 0.0F); + this.setRotateAngle(Neckend, 0.27314402793711257F, 0.0F, 0.0F); + this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerleft.setRotationPoint(3.0F, 2.0F, -3.8F); + this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headmidhornlowerleft, -0.136659280431156F, 0.5462880558742251F, 0.0F); + this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornleft3.setRotationPoint(-1.0F, 1.0F, 0.0F); + this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Smallheadhornleft3, -0.27314402793711257F, 0.0F, 0.0F); + this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornright2.setRotationPoint(-4.0F, 5.0F, -3.0F); + this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); + this.Wingfinger1right = new ModelRenderer(this, 350, 200); + this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); + this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); + this.Spiketop17 = new ModelRenderer(this, 300, 460); + this.Spiketop17.setRotationPoint(0.0F, 1.5F, 2.0F); + this.Spiketop17.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.setRotateAngle(Spiketop17, -0.18203784098300857F, 0.0F, 0.0F); + this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); + this.Headmidhornupperleft.setRotationPoint(1.0F, 0.1F, 5.9F); + this.Headmidhornupperleft.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 7, 0.0F); + this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, -0.31869712141416456F, 0.0F); + this.Spiketop15 = new ModelRenderer(this, 300, 460); + this.Spiketop15.setRotationPoint(0.0F, 2.6F, 9.0F); + this.Spiketop15.addBox(-0.5F, -8.0F, 0.0F, 1, 8, 2, 0.0F); + this.setRotateAngle(Spiketop15, -0.18203784098300857F, 0.0F, 0.0F); + this.Outertoelowerright = new ModelRenderer(this, 320, 280); + this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); + this.Headback = new ModelRenderer(this, 120, 390); + this.Headback.setRotationPoint(-0.01F, 0.6F, -9.0F); + this.Headback.addBox(-4.0F, 0.0F, -11.0F, 8, 7, 11, 0.0F); + this.setRotateAngle(Headback, 0.27314402793711257F, 0.0F, 0.0F); + this.Lowerarmleft = new ModelRenderer(this, 220, 275); + this.Lowerarmleft.mirror = true; + this.Lowerarmleft.setRotationPoint(1.01F, 8.5F, 0.0F); + this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.0F, 0.0F); + this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); + this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); + this.Wingshoulderright = new ModelRenderer(this, 470, 230); + this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 4.0F); + this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); + this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); + this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); + this.Spiketop12 = new ModelRenderer(this, 300, 460); + this.Spiketop12.setRotationPoint(0.0F, 0.5F, 12.0F); + this.Spiketop12.addBox(-0.5F, -11.0F, 0.0F, 1, 11, 2, 0.0F); + this.setRotateAngle(Spiketop12, -0.36425021489121656F, 0.0F, 0.0F); + this.Righthandmidfinger = new ModelRenderer(this, 220, 260); + this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); + this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); + this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); + this.Shoulderleft_1.setRotationPoint(-6.0F, 8.0F, 6.0F); + this.Shoulderleft_1.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); + this.Lefttoemid = new ModelRenderer(this, 290, 280); + this.Lefttoemid.mirror = true; + this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); + this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.RightLeg = new ModelRenderer(this, 260, 275); + this.RightLeg.setRotationPoint(-1.0F, 14.6F, 0.0F); + this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.23911010752322312F, -0.091106186954104F); + this.Spiketop9 = new ModelRenderer(this, 300, 460); + this.Spiketop9.setRotationPoint(0.0F, -1.5F, 0.1F); + this.Spiketop9.addBox(-0.5F, -13.0F, 0.0F, 1, 13, 2, 0.0F); + this.setRotateAngle(Spiketop9, -0.045553093477052F, 0.0F, 0.0F); + this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); + this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); + this.Spiketop11 = new ModelRenderer(this, 300, 460); + this.Spiketop11.setRotationPoint(0.0F, 0.5F, 8.0F); + this.Spiketop11.addBox(-0.5F, -12.0F, -1.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop11, -0.36425021489121656F, 0.0F, 0.0F); + this.Tooth6 = new ModelRenderer(this, 180, 500); + this.Tooth6.setRotationPoint(-0.5F, 5.0F, -9.0F); + this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); + this.Righttoeright = new ModelRenderer(this, 290, 280); + this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); + this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); + this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); + this.Lefttoelowerleft.mirror = true; + this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); + this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); + this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); + this.Lowerjaw = new ModelRenderer(this, 120, 345); + this.Lowerjaw.setRotationPoint(0.0F, -0.05F, -6.7F); + this.Lowerjaw.addBox(-2.5F, 0.0F, -10.0F, 5, 2, 10, 0.0F); + this.setRotateAngle(Lowerjaw, 0.045553093477052F, 0.0F, 0.0F); + this.Spiketop18 = new ModelRenderer(this, 300, 460); + this.Spiketop18.setRotationPoint(0.0F, 1.5F, 7.0F); + this.Spiketop18.addBox(-0.5F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.Belly1 = new ModelRenderer(this, 5, 415); + this.Belly1.setRotationPoint(0.0F, 18.0F, 2.0F); + this.Belly1.addBox(-6.5F, -10.0F, 0.0F, 13, 10, 30, 0.0F); + this.setRotateAngle(Belly1, -0.22759093446006054F, 0.0F, 0.0F); + this.Tooth5 = new ModelRenderer(this, 180, 500); + this.Tooth5.setRotationPoint(0.5F, 5.0F, -9.0F); + this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); + this.Spikebase6 = new ModelRenderer(this, 300, 440); + this.Spikebase6.setRotationPoint(0.0F, 0.5F, 12.0F); + this.Spikebase6.addBox(-1.0F, -5.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Spikebase6, -0.27314402793711257F, 0.0F, 0.0F); + this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); + this.Lefthandmidfinger.mirror = true; + this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); + this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); + this.Lefttoelowermid = new ModelRenderer(this, 290, 270); + this.Lefttoelowermid.mirror = true; + this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); + this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Underlowerjaw3 = new ModelRenderer(this, 160, 325); + this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Underlowerjaw3.addBox(-2.0F, -3.0F, 0.0F, 4, 3, 6, 0.0F); + this.setRotateAngle(Underlowerjaw3, 0.4553564018453205F, 0.0F, 0.0F); + this.Tooth4 = new ModelRenderer(this, 180, 500); + this.Tooth4.setRotationPoint(2.6F, 4.8F, -9.7F); + this.Tooth4.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth4, 0.6829473363053812F, 1.8668041679331349F, 0.31869712141416456F); + this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH = new ModelRenderer(this, 120, 320); + this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.setRotationPoint(0.0F, 6.0F, -4.0F); + this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.addBox(-2.5F, 0.0F, -5.0F, 5, 3, 6, 0.0F); + this.setRotateAngle(Mouthback_MOVE_THIS_TO_OPEN_MOUTH, 0F, 0.0F, 0.0F); + this.Spikebase2 = new ModelRenderer(this, 280, 440); + this.Spikebase2.setRotationPoint(0.0F, 0.0F, 7.0F); + this.Spikebase2.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 4, 0.0F); + this.setRotateAngle(Spikebase2, -0.4553564018453205F, 0.0F, 0.0F); + this.Spiketop14 = new ModelRenderer(this, 300, 460); + this.Spiketop14.setRotationPoint(0.0F, 1.0F, 4.5F); + this.Spiketop14.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(Spiketop14, -0.27314402793711257F, 0.0F, 0.0F); + this.shape159 = new ModelRenderer(this, 0, 0); + this.shape159.setRotationPoint(0.0F, 0.0F, 0.0F); + this.shape159.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F); + this.Wingmembramemidright = new ModelRenderer(this, 350, 340); + this.Wingmembramemidright.mirror = true; + this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); + this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); + this.Lefttoelowerright = new ModelRenderer(this, 290, 270); + this.Lefttoelowerright.mirror = true; + this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); + this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Clawlefthandleft = new ModelRenderer(this, 200, 260); + this.Clawlefthandleft.mirror = true; + this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); + this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); + this.Spiketop2 = new ModelRenderer(this, 300, 460); + this.Spiketop2.setRotationPoint(0.0F, 1.0F, -12.5F); + this.Spiketop2.addBox(-0.5F, -9.0F, 0.0F, 1, 9, 2, 0.0F); + this.setRotateAngle(Spiketop2, -0.22759093446006054F, 0.0F, 0.0F); + this.Wingmembramelargeright = new ModelRenderer(this, 270, 365); + this.Wingmembramelargeright.mirror = true; + this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Spiketop5 = new ModelRenderer(this, 300, 460); + this.Spiketop5.setRotationPoint(0.0F, -7.0F, 2.1F); + this.Spiketop5.addBox(-0.5F, -15.0F, 0.0F, 1, 15, 2, 0.0F); + this.setRotateAngle(Spiketop5, -0.136659280431156F, 0.0F, 0.0F); + this.Winglowerarmleft = new ModelRenderer(this, 400, 215); + this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); + this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); + this.Clawrighthandmid = new ModelRenderer(this, 200, 260); + this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Spiketop19 = new ModelRenderer(this, 300, 460); + this.Spiketop19.setRotationPoint(0.0F, 3.0F, 11.0F); + this.Spiketop19.addBox(-0.5F, -7.0F, 0.0F, 1, 7, 2, 0.0F); + this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); + this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); + this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); + this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); + this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerleft.setRotationPoint(1.6F, 0.0F, -3.0F); + this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornlowerleft, 0.18203784098300857F, 0.27314402793711257F, 0.36425021489121656F); + this.Wingfinger3left = new ModelRenderer(this, 390, 170); + this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); + this.RTailSpike = new ModelRenderer(this, 350, 300); + this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); + this.Tail7 = new ModelRenderer(this, 5, 240); + this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); + this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); + this.setRotateAngle(Tail7, 0.136659280431156F, 0.0F, 0.0F); + this.Lowerjawback = new ModelRenderer(this, 120, 330); + this.Lowerjawback.setRotationPoint(0.0F, 0.5F, 1.0F); + this.Lowerjawback.addBox(-3.0F, 0.0F, -7.0F, 6, 3, 7, 0.0F); + this.setRotateAngle(Lowerjawback, 0.31869712141416456F, 0.0F, 0.0F); + this.Tooth14 = new ModelRenderer(this, 180, 500); + this.Tooth14.setRotationPoint(2.5F, 0.5F, -10.0F); + this.Tooth14.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth14, 0.22759093446006054F, 0.0F, 0.22759093446006054F); + this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger.mirror = true; + this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); + this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); + this.Clawlefthandright = new ModelRenderer(this, 200, 260); + this.Clawlefthandright.mirror = true; + this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); + this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); + this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); + this.Spikebase7 = new ModelRenderer(this, 300, 440); + this.Spikebase7.setRotationPoint(0.0F, 0.0F, 18.5F); + this.Spikebase7.addBox(-1.0F, -4.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Spikebase7, -0.27314402793711257F, 0.0F, 0.0F); + this.Lefthip = new ModelRenderer(this, 260, 300); + this.Lefthip.mirror = true; + this.Lefthip.setRotationPoint(5.5F, 3.0F, 15.0F); + this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Lefthip, -0.27314402793711257F, 0.27314402793711257F, -0.18203784098300857F); + this.Righttoeleft = new ModelRenderer(this, 290, 280); + this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); + this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); + this.Wingfinger2left = new ModelRenderer(this, 330, 150); + this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); + this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); + this.Spiketop3 = new ModelRenderer(this, 300, 460); + this.Spiketop3.setRotationPoint(0.0F, -3.0F, 0.1F); + this.Spiketop3.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop3, -0.22759093446006054F, 0.0F, 0.0F); + this.Underlowerjaw = new ModelRenderer(this, 160, 350); + this.Underlowerjaw.setRotationPoint(0.0F, 3.0F, -7.0F); + this.Underlowerjaw.addBox(-1.5F, -1.0F, -8.0F, 3, 1, 8, 0.0F); + this.setRotateAngle(Underlowerjaw, -0.091106186954104F, 0.0F, 0.0F); + this.Tooth7 = new ModelRenderer(this, 180, 500); + this.Tooth7.setRotationPoint(-2.8F, 5.0F, -3.2F); + this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); + this.Spkebase3 = new ModelRenderer(this, 280, 440); + this.Spkebase3.setRotationPoint(0.0F, 0.0F, 11.5F); + this.Spkebase3.addBox(-1.0F, -7.0F, 2.0F, 2, 7, 4, 0.0F); + this.setRotateAngle(Spkebase3, -0.7285004297824331F, 0.0F, 0.0F); + this.Tail6 = new ModelRenderer(this, 5, 275); + this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); + this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); + this.setRotateAngle(Tail6, 0.091106186954104F, 0.0F, 0.0F); + this.Righthandleftfinger = new ModelRenderer(this, 220, 260); + this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); + this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); + this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornleft2.setRotationPoint(4.0F, 5.0F, -3.0F); + this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); + this.Righttoelowermid = new ModelRenderer(this, 290, 270); + this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); + this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Smallheadhornleft1 = new ModelRenderer(this, 190, 420); + this.Smallheadhornleft1.setRotationPoint(0.0F, 0.0F, 6.0F); + this.Smallheadhornleft1.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(Smallheadhornleft1, 0.0F, 0.5009094953223726F, 0.0F); + this.Spiketop6 = new ModelRenderer(this, 300, 460); + this.Spiketop6.setRotationPoint(0.0F, 1.0F, 0.1F); + this.Spiketop6.addBox(-0.5F, -14.0F, 0.0F, 1, 14, 2, 0.0F); + this.setRotateAngle(Spiketop6, -0.136659280431156F, 0.0F, 0.0F); + this.Wingupperarmleft = new ModelRenderer(this, 390, 230); + this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); + this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); + this.Spiketop8 = new ModelRenderer(this, 300, 460); + this.Spiketop8.setRotationPoint(0.0F, -5.0F, 0.1F); + this.Spiketop8.addBox(-0.5F, -12.0F, 0.0F, 1, 12, 2, 0.0F); + this.setRotateAngle(Spiketop8, -0.045553093477052F, 0.0F, 0.0F); + this.Lowerjaw.addChild(this.Tooth13); + this.Smallheadhornright2.addChild(this.Smallheadhornright3); + this.Headmidhornlowerright.addChild(this.Headmidhornupperright); + this.Body.addChild(this.Spikebase4); + this.Tail4.addChild(this.Spiketop16); + this.Righttoeleft.addChild(this.Righttoelowerleft); + this.Lowerjawback.addChild(this.Underlowerjaw2); + this.Tail1.addChild(this.Spiketop10); + this.Righthandrightfinger.addChild(this.Clawrighthandright); + this.Lefthip.addChild(this.Rightleg); + this.Tail1.addChild(this.Righthip); + this.Snout.addChild(this.Tooth10); + this.Snout.addChild(this.Tooth3); + this.Body.addChild(this.Shoulderleft); + this.Rightfoot.addChild(this.Outertoeleft); + this.Body.addChild(this.Spikebase1); + this.Lowerjaw.addChild(this.Tooth12); + this.Wingfinger2right.addChild(this.Wingfingerlower2right); + this.Snout.addChild(this.Tooth8); + this.Lowerjaw.addChild(this.Tooth18); + this.Lowerarmleft.addChild(this.Thumbtoeupperleft); + this.Headback.addChild(this.Headlargehornlowerright); + this.Lowerjaw.addChild(this.Tooth16); + this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); + this.Spikebase5.addChild(this.Spiketop7); + this.Headback.addChild(this.Snout); + this.Rightfoot.addChild(this.Lefttoeleft); + this.Rightfoot.addChild(this.Lefttoeright); + this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); + this.Headlargehornupperright.addChild(this.Smallheadhornright1); + this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); + this.Lowerjawback.addChild(this.Smallheadhornright3_1); + this.Wingupperarmright.addChild(this.Winglowerarmright); + this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); + this.Tail1.addChild(this.Tail3); + this.Lowerjawback.addChild(this.Smallheadhornleft3_1); + this.Wingupperarmright.addChild(this.Wingmembramesmallright); + this.RTailSpike.addChild(this.RTailMembrane); + this.Body.addChild(this.Wingshoulderleft); + this.Body.addChild(this.Neckbase); + this.Spikebase2.addChild(this.Spiketop4); + this.Lefthandmidfinger.addChild(this.Clawlefthandmid); + this.Snout.addChild(this.Tooth9); + this.Wingfinger1right.addChild(this.Wingfinger3right); + this.Winglowerarmleft.addChild(this.Wingfinger1left); + this.Lowerjaw.addChild(this.Tooth15); + this.Neckbase.addChild(this.Neckmid); + this.Lowerjaw.addChild(this.Tooth17); + this.RightLeg.addChild(this.RightFoot); + this.Tail3.addChild(this.Spiketop13); + this.Snout.addChild(this.Tooth2); + this.Tail7.addChild(this.Tail8); + this.LTailSpike.addChild(this.LTailMembrane); + this.RightFoot.addChild(this.Righttoemid); + this.Lowerarmleft_1.addChild(this.Righthandrightfinger); + this.Body.addChild(this.Tail1); + this.Lowerjaw.addChild(this.Tooth11); + this.Tail3.addChild(this.Tail4); + this.Headback.addChild(this.Headmidhornlowerright); + this.Neckmid.addChild(this.Spiketop1); + this.Headlargehornlowerright.addChild(this.Headlargehornupperright); + this.Wingshoulderright.addChild(this.Wingupperarmright); + this.Wingfinger2left.addChild(this.Wingfingerlower2left); + this.Righthandleftfinger.addChild(this.Clawrighthandleft); + this.Rightleg.addChild(this.Rightfoot); + this.Shoulderleft_1.addChild(this.Lowerarmleft_1); + this.Snout.addChild(this.Tooth1); + this.Tail8.addChild(this.LTailSpike); + this.Wingfinger1left.addChild(this.Wingmembramelargeleft); + this.Wingfinger1right.addChild(this.Wingfinger2right); + this.Righttoeright.addChild(this.Righttoelowerright); + this.Outertoeleft.addChild(this.Outertoelowerleft); + this.Tail1.addChild(this.Spikebase5); + this.Winglowerarmleft.addChild(this.Wingmembramemidleft); + this.Neckmid.addChild(this.Neckend); + this.Headback.addChild(this.Headmidhornlowerleft); + this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); + this.Headback.addChild(this.Smallheadhornright2); + this.Winglowerarmright.addChild(this.Wingfinger1right); + this.Tail6.addChild(this.Spiketop17); + this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); + this.Tail4.addChild(this.Spiketop15); + this.RightFoot.addChild(this.Outertoelowerright); + this.Neckend.addChild(this.Headback); + this.Shoulderleft.addChild(this.Lowerarmleft); + this.Wingfinger3right.addChild(this.Wingfingerlower3right); + this.Body.addChild(this.Wingshoulderright); + this.Wingfinger1left.addChild(this.Wingfingerlower1left); + this.Tail3.addChild(this.Spiketop12); + this.Lowerarmleft_1.addChild(this.Righthandmidfinger); + this.Body.addChild(this.Shoulderleft_1); + this.Rightfoot.addChild(this.Lefttoemid); + this.Righthip.addChild(this.RightLeg); + this.Spikebase7.addChild(this.Spiketop9); + this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); + this.Tail3.addChild(this.Spiketop11); + this.Snout.addChild(this.Tooth6); + this.RightFoot.addChild(this.Righttoeright); + this.Lefttoeleft.addChild(this.Lefttoelowerleft); + this.Wingfinger1right.addChild(this.Wingfingerlower1right); + this.Lowerjawback.addChild(this.Lowerjaw); + this.Tail6.addChild(this.Spiketop18); + this.Body.addChild(this.Belly1); + this.Snout.addChild(this.Tooth5); + this.Tail1.addChild(this.Spikebase6); + this.Lowerarmleft.addChild(this.Lefthandmidfinger); + this.Lefttoemid.addChild(this.Lefttoelowermid); + this.Underlowerjaw2.addChild(this.Underlowerjaw3); + this.Snout.addChild(this.Tooth4); + this.Headback.addChild(this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH); + this.Body.addChild(this.Spikebase2); + this.Tail4.addChild(this.Spiketop14); + this.Snout.addChild(this.shape159); + this.Winglowerarmright.addChild(this.Wingmembramemidright); + this.Lefttoeright.addChild(this.Lefttoelowerright); + this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); + this.Neckbase.addChild(this.Spiketop2); + this.Wingfinger1right.addChild(this.Wingmembramelargeright); + this.Spkebase3.addChild(this.Spiketop5); + this.Wingupperarmleft.addChild(this.Winglowerarmleft); + this.Righthandmidfinger.addChild(this.Clawrighthandmid); + this.Tail6.addChild(this.Spiketop19); + this.Outertoelowerright.addChild(this.Outertoelowerright_1); + this.Wingfinger3left.addChild(this.Wingfingerlower3left); + this.Headback.addChild(this.Headlargehornlowerleft); + this.Wingfinger1left.addChild(this.Wingfinger3left); + this.Tail8.addChild(this.RTailSpike); + this.Tail6.addChild(this.Tail7); + this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.addChild(this.Lowerjawback); + this.Lowerjaw.addChild(this.Tooth14); + this.Lowerarmleft.addChild(this.Lefthandrightfinger); + this.Lefthandrightfinger.addChild(this.Clawlefthandright); + this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); + this.Tail1.addChild(this.Spikebase7); + this.Tail1.addChild(this.Lefthip); + this.RightFoot.addChild(this.Righttoeleft); + this.Wingfinger1left.addChild(this.Wingfinger2left); + this.Spikebase1.addChild(this.Spiketop3); + this.Lowerjawback.addChild(this.Underlowerjaw); + this.Snout.addChild(this.Tooth7); + this.Body.addChild(this.Spkebase3); + this.Tail4.addChild(this.Tail6); + this.Lowerarmleft_1.addChild(this.Righthandleftfinger); + this.Headback.addChild(this.Smallheadhornleft2); + this.Righttoemid.addChild(this.Righttoelowermid); + this.Headlargehornupperleft.addChild(this.Smallheadhornleft1); + this.Spikebase4.addChild(this.Spiketop6); + this.Wingshoulderleft.addChild(this.Wingupperarmleft); + this.Spikebase6.addChild(this.Spiketop8); + } - public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { - modelRenderer.rotateAngleX = x; - modelRenderer.rotateAngleY = y; - modelRenderer.rotateAngleZ = z; - } + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); - this.Body.render(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); + this.Body.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, - float head4) { - super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); - float wingFlap = (float) Math.toRadians(dragon.wingFlap()); - float jawAngle = (float) Math.toRadians(dragon.getJawMove()); - float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); + public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, + float head4) { + super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); + float wingFlap = (float) Math.toRadians(dragon.wingFlap()); + float jawAngle = (float) Math.toRadians(dragon.getJawMove()); + float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); - this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; - this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); + this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; + this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); - this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.rotateAngleX = jawAngle - (3.141F / 9F); - // this.Tail1.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - // this.Tail3.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - // this.Tail4.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + this.Mouthback_MOVE_THIS_TO_OPEN_MOUTH.rotateAngleX = jawAngle - (3.141F / 9F); + // this.Tail1.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail3.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail4.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - if (!dragon.isTerrestrial()) // Fly - { - if (!dragon.onGround) { - float angle = (float) Math.toRadians(dragon.getVertTailAngle()); - this.Body.rotateAngleX = 0.546F - angle; - } else { - this.Body.rotateAngleX = 0.5462880558742251F; - } + if (!dragon.isTerrestrial()) // Fly + { + if (!dragon.onGround) { + float angle = (float) Math.toRadians(dragon.getVertTailAngle()); + this.Body.rotateAngleX = 0.546F - angle; + } else { + this.Body.rotateAngleX = 0.5462880558742251F; + } - if (dragon.motionY < -0.01F)// Glide - { - wingFlap = 0; - } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover - { - wingFlap = (float) Math.toRadians(dragon.wingFlap()); - } else { - wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move - } - this.Wingshoulderright.rotateAngleZ = wingFlap * 0.75F; - this.Wingshoulderleft.rotateAngleZ = -(wingFlap * 0.75F); - this.Wingupperarmright.rotateAngleZ = wingFlap * 0.25F; - this.Wingupperarmleft.rotateAngleZ = -(wingFlap * 0.25F); + if (dragon.motionY < -0.01F)// Glide + { + wingFlap = 0; + } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover + { + wingFlap = (float) Math.toRadians(dragon.wingFlap()); + } else { + wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move + } + this.Wingshoulderright.rotateAngleZ = wingFlap * 0.75F; + this.Wingshoulderleft.rotateAngleZ = -(wingFlap * 0.75F); + this.Wingupperarmright.rotateAngleZ = wingFlap * 0.25F; + this.Wingupperarmleft.rotateAngleZ = -(wingFlap * 0.25F); - } else // Walk - { - this.Body.rotateAngleX = 0.5462880558742251F; - this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); - this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); - // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); - // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); + } else // Walk + { + this.Body.rotateAngleX = 0.5462880558742251F; + this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); + this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); + // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); + // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); - this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - } - } + this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelHound.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelHound.java index ba12f94e..99123a02 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelHound.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelHound.java @@ -1,313 +1,328 @@ package minefantasy.mf2.client.render.mob; -import org.lwjgl.opengl.GL11; - import minefantasy.mf2.entity.mob.EntityHound; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.MathHelper; +import org.lwjgl.opengl.GL11; public class ModelHound extends ModelBase { - /** main box for the wolf head */ - public ModelRenderer WolfHead; - /** The wolf's body */ - public ModelRenderer Body; - /** Wolf'se first leg */ - public ModelRenderer Leg1; - /** Wolf's second leg */ - public ModelRenderer Leg2; - /** Wolf's third leg */ - public ModelRenderer Leg3; - /** Wolf's fourth leg */ - public ModelRenderer Leg4; - /** The wolf's tail */ - public ModelRenderer Tail; - /** The wolf's mane */ - public ModelRenderer Mane; - public ModelRenderer Collar; - public ModelRenderer Jaw; - public ModelRenderer Ear1; - public ModelRenderer Ear2; - public ModelRenderer Nose; + /** + * main box for the wolf head + */ + public ModelRenderer WolfHead; + /** + * The wolf's body + */ + public ModelRenderer Body; + /** + * Wolf'se first leg + */ + public ModelRenderer Leg1; + /** + * Wolf's second leg + */ + public ModelRenderer Leg2; + /** + * Wolf's third leg + */ + public ModelRenderer Leg3; + /** + * Wolf's fourth leg + */ + public ModelRenderer Leg4; + /** + * The wolf's tail + */ + public ModelRenderer Tail; + /** + * The wolf's mane + */ + public ModelRenderer Mane; + public ModelRenderer Collar; + public ModelRenderer Jaw; + public ModelRenderer Ear1; + public ModelRenderer Ear2; + public ModelRenderer Nose; - public ModelHound() { - this(0F); - } + public ModelHound() { + this(0F); + } - public ModelHound(float scale) { - float var1 = 0F; - float var2 = 13.5F; - textureWidth = 64; - textureHeight = 32; + public ModelHound(float scale) { + float var1 = 0F; + float var2 = 13.5F; + textureWidth = 64; + textureHeight = 32; - Collar = new ModelRenderer(this, 20, 24); - Collar.addBox(-3.5F, -3.5F, 0.5F, 7, 7, 1, scale); - Collar.setRotationPoint(-1F, 12.5F, -7F); - Collar.setTextureSize(64, 32); - Collar.mirror = true; - setRotation(Collar, 0F, 0F, 0F); - Body = new ModelRenderer(this, 38, 17); - Body.addBox(-4F, -2F, -3F, 6, 8, 7, scale); - Body.setRotationPoint(-1F, 15F, 3F); - Body.setTextureSize(64, 32); - Body.mirror = true; - setRotation(Body, 1.570796F, 0F, 0F); - Mane = new ModelRenderer(this, 32, 0); - Mane.addBox(-4F, -3F, -4F, 8, 8, 8, scale); - Mane.setRotationPoint(0F, 14F, -3F); - Mane.setTextureSize(64, 32); - Mane.mirror = true; - setRotation(Mane, 1.570796F, 0F, 0F); - Leg1 = new ModelRenderer(this, 0, 18); - Leg1.addBox(-3F, 0F, -2F, 3, 8, 3, scale); - Leg1.setRotationPoint(-1.5F, 16F, 7F); - Leg1.setTextureSize(64, 32); - Leg1.mirror = true; - setRotation(Leg1, 0F, 0F, 0F); - Leg2 = new ModelRenderer(this, 0, 18); - Leg2.addBox(0F, 0F, -2F, 3, 8, 3, scale); - Leg2.setRotationPoint(-0.5F, 16F, 7F); - Leg2.setTextureSize(64, 32); - Leg2.mirror = true; - setRotation(Leg2, 0F, 0F, 0F); - Leg3 = new ModelRenderer(this, 0, 18); - Leg3.addBox(-3F, 0F, -1F, 3, 8, 3, scale); - Leg3.setRotationPoint(-1.5F, 16F, -4F); - Leg3.setTextureSize(64, 32); - Leg3.mirror = true; - setRotation(Leg3, 0F, 0F, 0F); - Leg4 = new ModelRenderer(this, 0, 18); - Leg4.addBox(0F, 0F, -1F, 3, 8, 3, scale); - Leg4.setRotationPoint(-0.5F, 16F, -4F); - Leg4.setTextureSize(64, 32); - Leg4.mirror = true; - setRotation(Leg4, 0F, 0F, 0F); - Tail = new ModelRenderer(this, 12, 27); - Tail.addBox(-1F, 0F, -1F, 2, 3, 2, scale); - Tail.setRotationPoint(-1F, 13F, 8F); - Tail.setTextureSize(64, 32); - Tail.mirror = true; - setRotation(Tail, 1.130069F, 0F, 0F); - Ear1 = new ModelRenderer(this, 16, 11); - Ear1.addBox(-3F, -6F, 0F, 2, 5, 1, scale); - Ear1.setRotationPoint(-1F, 12.5F, -7F); - Ear1.setTextureSize(64, 32); - Ear1.mirror = true; - setRotation(Ear1, 0F, 0F, 0F); - Ear2 = new ModelRenderer(this, 16, 11); - Ear2.mirror = true; - Ear2.addBox(1F, -6F, 0F, 2, 5, 1, scale); - Ear2.setRotationPoint(-1F, 12.5F, -7F); - Ear2.setTextureSize(64, 32); - Ear2.mirror = true; - setRotation(Ear2, 0F, 0F, 0F); - Ear2.mirror = false; - Jaw = new ModelRenderer(this, 12, 17); - Jaw.addBox(-1.5F, 2F, -7F, 3, 1, 4, scale); - Jaw.setRotationPoint(-1F, 12.5F, -7F); - Jaw.setTextureSize(64, 32); - Jaw.mirror = true; - setRotation(Jaw, 0F, 0F, 0F); - Nose = new ModelRenderer(this, 0, 11); - Nose.addBox(-1.5F, 0F, -7F, 3, 2, 4, scale); - Nose.setRotationPoint(-1F, 12.5F, -7F); - Nose.setTextureSize(64, 32); - Nose.mirror = true; - setRotation(Nose, 0F, 0F, 0F); - WolfHead = new ModelRenderer(this, 0, 0); - WolfHead.addBox(-3F, -3F, -3F, 6, 6, 5, scale); - WolfHead.setRotationPoint(-1F, 12.5F, -7F); - WolfHead.setTextureSize(64, 32); - WolfHead.mirror = true; - setRotation(WolfHead, 0F, 0F, 0F); - } + Collar = new ModelRenderer(this, 20, 24); + Collar.addBox(-3.5F, -3.5F, 0.5F, 7, 7, 1, scale); + Collar.setRotationPoint(-1F, 12.5F, -7F); + Collar.setTextureSize(64, 32); + Collar.mirror = true; + setRotation(Collar, 0F, 0F, 0F); + Body = new ModelRenderer(this, 38, 17); + Body.addBox(-4F, -2F, -3F, 6, 8, 7, scale); + Body.setRotationPoint(-1F, 15F, 3F); + Body.setTextureSize(64, 32); + Body.mirror = true; + setRotation(Body, 1.570796F, 0F, 0F); + Mane = new ModelRenderer(this, 32, 0); + Mane.addBox(-4F, -3F, -4F, 8, 8, 8, scale); + Mane.setRotationPoint(0F, 14F, -3F); + Mane.setTextureSize(64, 32); + Mane.mirror = true; + setRotation(Mane, 1.570796F, 0F, 0F); + Leg1 = new ModelRenderer(this, 0, 18); + Leg1.addBox(-3F, 0F, -2F, 3, 8, 3, scale); + Leg1.setRotationPoint(-1.5F, 16F, 7F); + Leg1.setTextureSize(64, 32); + Leg1.mirror = true; + setRotation(Leg1, 0F, 0F, 0F); + Leg2 = new ModelRenderer(this, 0, 18); + Leg2.addBox(0F, 0F, -2F, 3, 8, 3, scale); + Leg2.setRotationPoint(-0.5F, 16F, 7F); + Leg2.setTextureSize(64, 32); + Leg2.mirror = true; + setRotation(Leg2, 0F, 0F, 0F); + Leg3 = new ModelRenderer(this, 0, 18); + Leg3.addBox(-3F, 0F, -1F, 3, 8, 3, scale); + Leg3.setRotationPoint(-1.5F, 16F, -4F); + Leg3.setTextureSize(64, 32); + Leg3.mirror = true; + setRotation(Leg3, 0F, 0F, 0F); + Leg4 = new ModelRenderer(this, 0, 18); + Leg4.addBox(0F, 0F, -1F, 3, 8, 3, scale); + Leg4.setRotationPoint(-0.5F, 16F, -4F); + Leg4.setTextureSize(64, 32); + Leg4.mirror = true; + setRotation(Leg4, 0F, 0F, 0F); + Tail = new ModelRenderer(this, 12, 27); + Tail.addBox(-1F, 0F, -1F, 2, 3, 2, scale); + Tail.setRotationPoint(-1F, 13F, 8F); + Tail.setTextureSize(64, 32); + Tail.mirror = true; + setRotation(Tail, 1.130069F, 0F, 0F); + Ear1 = new ModelRenderer(this, 16, 11); + Ear1.addBox(-3F, -6F, 0F, 2, 5, 1, scale); + Ear1.setRotationPoint(-1F, 12.5F, -7F); + Ear1.setTextureSize(64, 32); + Ear1.mirror = true; + setRotation(Ear1, 0F, 0F, 0F); + Ear2 = new ModelRenderer(this, 16, 11); + Ear2.mirror = true; + Ear2.addBox(1F, -6F, 0F, 2, 5, 1, scale); + Ear2.setRotationPoint(-1F, 12.5F, -7F); + Ear2.setTextureSize(64, 32); + Ear2.mirror = true; + setRotation(Ear2, 0F, 0F, 0F); + Ear2.mirror = false; + Jaw = new ModelRenderer(this, 12, 17); + Jaw.addBox(-1.5F, 2F, -7F, 3, 1, 4, scale); + Jaw.setRotationPoint(-1F, 12.5F, -7F); + Jaw.setTextureSize(64, 32); + Jaw.mirror = true; + setRotation(Jaw, 0F, 0F, 0F); + Nose = new ModelRenderer(this, 0, 11); + Nose.addBox(-1.5F, 0F, -7F, 3, 2, 4, scale); + Nose.setRotationPoint(-1F, 12.5F, -7F); + Nose.setTextureSize(64, 32); + Nose.mirror = true; + setRotation(Nose, 0F, 0F, 0F); + WolfHead = new ModelRenderer(this, 0, 0); + WolfHead.addBox(-3F, -3F, -3F, 6, 6, 5, scale); + WolfHead.setRotationPoint(-1F, 12.5F, -7F); + WolfHead.setTextureSize(64, 32); + WolfHead.mirror = true; + setRotation(WolfHead, 0F, 0F, 0F); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - /** - * Sets the models various rotation angles then renders the model. - */ - @Override - public void render(Entity entity, float f1, float f2, float f3, float f4, float f5, float f6) { - super.render(entity, f1, f2, f3, f4, f5, f6); - EntityHound var5 = (EntityHound) entity; - this.setRotationAngles(var5, f1, f2, f3, f4, f5, f6); - if (this.isChild) { - float var8 = 2F; - GL11.glPushMatrix(); - GL11.glTranslatef(0F, 5F * f6, 2F * f6); - this.WolfHead.renderWithRotation(f6); - this.Collar.renderWithRotation(f6); - this.Ear1.renderWithRotation(f6); - this.Ear2.renderWithRotation(f6); - this.Jaw.renderWithRotation(f6); - this.Nose.renderWithRotation(f6); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(1F / var8, 1F / var8, 1F / var8); - GL11.glTranslatef(0F, 24F * f6, 0F); - this.Body.render(f6); - this.Leg1.render(f6); - this.Leg2.render(f6); - this.Leg3.render(f6); - this.Leg4.render(f6); - this.Tail.renderWithRotation(f6); - this.Mane.render(f6); - GL11.glPopMatrix(); - } else { - this.WolfHead.renderWithRotation(f6); - this.Collar.renderWithRotation(f6); - this.Ear1.renderWithRotation(f6); - this.Ear2.renderWithRotation(f6); - this.Jaw.renderWithRotation(f6); - this.Nose.renderWithRotation(f6); - this.Body.render(f6); - this.Leg1.render(f6); - this.Leg2.render(f6); - this.Leg3.render(f6); - this.Leg4.render(f6); - this.Tail.renderWithRotation(f6); - this.Mane.render(f6); - } - } + /** + * Sets the models various rotation angles then renders the model. + */ + @Override + public void render(Entity entity, float f1, float f2, float f3, float f4, float f5, float f6) { + super.render(entity, f1, f2, f3, f4, f5, f6); + EntityHound var5 = (EntityHound) entity; + this.setRotationAngles(var5, f1, f2, f3, f4, f5, f6); + if (this.isChild) { + float var8 = 2F; + GL11.glPushMatrix(); + GL11.glTranslatef(0F, 5F * f6, 2F * f6); + this.WolfHead.renderWithRotation(f6); + this.Collar.renderWithRotation(f6); + this.Ear1.renderWithRotation(f6); + this.Ear2.renderWithRotation(f6); + this.Jaw.renderWithRotation(f6); + this.Nose.renderWithRotation(f6); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(1F / var8, 1F / var8, 1F / var8); + GL11.glTranslatef(0F, 24F * f6, 0F); + this.Body.render(f6); + this.Leg1.render(f6); + this.Leg2.render(f6); + this.Leg3.render(f6); + this.Leg4.render(f6); + this.Tail.renderWithRotation(f6); + this.Mane.render(f6); + GL11.glPopMatrix(); + } else { + this.WolfHead.renderWithRotation(f6); + this.Collar.renderWithRotation(f6); + this.Ear1.renderWithRotation(f6); + this.Ear2.renderWithRotation(f6); + this.Jaw.renderWithRotation(f6); + this.Nose.renderWithRotation(f6); + this.Body.render(f6); + this.Leg1.render(f6); + this.Leg2.render(f6); + this.Leg3.render(f6); + this.Leg4.render(f6); + this.Tail.renderWithRotation(f6); + this.Mane.render(f6); + } + } - /** - * Used for easily adding entity-dependent animations. The second and third - * float params here are the same second and third as in the setRotationAngles - * method. - */ - @Override - public void setLivingAnimations(EntityLivingBase living, float step1, float step2, float z) { - EntityHound var5 = (EntityHound) living; + /** + * Used for easily adding entity-dependent animations. The second and third + * float params here are the same second and third as in the setRotationAngles + * method. + */ + @Override + public void setLivingAnimations(EntityLivingBase living, float step1, float step2, float z) { + EntityHound var5 = (EntityHound) living; - float walk1 = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - float walk2 = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + float walk1 = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + float walk2 = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - if (var5.isAngry()) { - this.Tail.rotateAngleY = 0F; - } else { - this.Tail.rotateAngleY = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - } + if (var5.isAngry()) { + this.Tail.rotateAngleY = 0F; + } else { + this.Tail.rotateAngleY = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + } - if (var5.isSitting()) { - float dig = 0; - this.Mane.setRotationPoint(-1F, 16F, -2F); - this.Mane.rotateAngleX = ((float) Math.PI * 2F / 5F); - this.Mane.rotateAngleY = 0F; - this.Body.setRotationPoint(0F, 18F, 0F); - this.Body.rotateAngleX = ((float) Math.PI / 4F); - this.Tail.setRotationPoint(-1F, 21F, 6F); - this.Leg1.setRotationPoint(-2.5F, 22F, 2F); - this.Leg1.rotateAngleX = ((float) Math.PI * 3F / 2F); - this.Leg2.setRotationPoint(0.5F, 22F, 2F); - this.Leg2.rotateAngleX = ((float) Math.PI * 3F / 2F); - this.Leg3.rotateAngleX = 5.811947F + dig; - this.Leg3.setRotationPoint(-2.49F, 17F, -4F); - this.Leg4.rotateAngleX = 5.811947F - dig; - this.Leg4.setRotationPoint(0.51F, 17F, -4F); - } else // WALK - { - this.Body.setRotationPoint(0F, 14F, 2F); - this.Body.rotateAngleX = ((float) Math.PI / 2F); - this.Mane.setRotationPoint(-1F, 14F, -2F); - this.Mane.rotateAngleX = this.Body.rotateAngleX; - this.Tail.setRotationPoint(-1F, 12F, 8F); - this.Leg1.setRotationPoint(-2.5F, 16F, 7F); - this.Leg2.setRotationPoint(0.5F, 16F, 7F); - this.Leg3.setRotationPoint(-2.5F, 16F, -4F); - this.Leg4.setRotationPoint(0.5F, 16F, -4F); + if (var5.isSitting()) { + float dig = 0; + this.Mane.setRotationPoint(-1F, 16F, -2F); + this.Mane.rotateAngleX = ((float) Math.PI * 2F / 5F); + this.Mane.rotateAngleY = 0F; + this.Body.setRotationPoint(0F, 18F, 0F); + this.Body.rotateAngleX = ((float) Math.PI / 4F); + this.Tail.setRotationPoint(-1F, 21F, 6F); + this.Leg1.setRotationPoint(-2.5F, 22F, 2F); + this.Leg1.rotateAngleX = ((float) Math.PI * 3F / 2F); + this.Leg2.setRotationPoint(0.5F, 22F, 2F); + this.Leg2.rotateAngleX = ((float) Math.PI * 3F / 2F); + this.Leg3.rotateAngleX = 5.811947F + dig; + this.Leg3.setRotationPoint(-2.49F, 17F, -4F); + this.Leg4.rotateAngleX = 5.811947F - dig; + this.Leg4.setRotationPoint(0.51F, 17F, -4F); + } else // WALK + { + this.Body.setRotationPoint(0F, 14F, 2F); + this.Body.rotateAngleX = ((float) Math.PI / 2F); + this.Mane.setRotationPoint(-1F, 14F, -2F); + this.Mane.rotateAngleX = this.Body.rotateAngleX; + this.Tail.setRotationPoint(-1F, 12F, 8F); + this.Leg1.setRotationPoint(-2.5F, 16F, 7F); + this.Leg2.setRotationPoint(0.5F, 16F, 7F); + this.Leg3.setRotationPoint(-2.5F, 16F, -4F); + this.Leg4.setRotationPoint(0.5F, 16F, -4F); - if (var5.isChild() || var5.isSprinting())// Alternate run - { - this.Leg1.rotateAngleX = walk1; - this.Leg2.rotateAngleX = walk1; - this.Leg3.rotateAngleX = walk2; - this.Leg4.rotateAngleX = walk2; - } else { - this.Leg2.rotateAngleX = walk1; - this.Leg3.rotateAngleX = walk1; - this.Leg1.rotateAngleX = walk2; - this.Leg4.rotateAngleX = walk2; - } - } + if (var5.isChild() || var5.isSprinting())// Alternate run + { + this.Leg1.rotateAngleX = walk1; + this.Leg2.rotateAngleX = walk1; + this.Leg3.rotateAngleX = walk2; + this.Leg4.rotateAngleX = walk2; + } else { + this.Leg2.rotateAngleX = walk1; + this.Leg3.rotateAngleX = walk1; + this.Leg1.rotateAngleX = walk2; + this.Leg4.rotateAngleX = walk2; + } + } - this.WolfHead.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); - this.Collar.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); - this.Ear1.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); - this.Ear2.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); - this.Jaw.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); - this.Nose.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); - this.Mane.rotateAngleZ = var5.getShakeAngle(z, -0.08F); - this.Body.rotateAngleZ = var5.getShakeAngle(z, -0.16F); - this.Tail.rotateAngleZ = var5.getShakeAngle(z, -0.2F); - } + this.WolfHead.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); + this.Collar.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); + this.Ear1.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); + this.Ear2.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); + this.Jaw.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); + this.Nose.rotateAngleZ = var5.getInterestedAngle(z) + var5.getShakeAngle(z, 0F); + this.Mane.rotateAngleZ = var5.getShakeAngle(z, -0.08F); + this.Body.rotateAngleZ = var5.getShakeAngle(z, -0.16F); + this.Tail.rotateAngleZ = var5.getShakeAngle(z, -0.2F); + } - /** - * Sets the models various rotation angles. - */ - public void setRotationAngles(EntityHound wolf, float f1, float f2, float f3, float f4, float f5, float f6) { - super.setRotationAngles(f1, f2, f3, f4, f5, f6, wolf); - int neck = wolf.eatAnimation; - if (neck < -15) - neck = -15; + /** + * Sets the models various rotation angles. + */ + public void setRotationAngles(EntityHound wolf, float f1, float f2, float f3, float f4, float f5, float f6) { + super.setRotationAngles(f1, f2, f3, f4, f5, f6, wolf); + int neck = wolf.eatAnimation; + if (neck < -15) + neck = -15; - float neckAngle = f5 + (4F * neck); - float jawAngle = neckAngle + (1.5F * wolf.jawMove); - this.WolfHead.rotateAngleX = neckAngle / (180F / (float) Math.PI); - this.WolfHead.rotateAngleY = f4 / (180F / (float) Math.PI); + float neckAngle = f5 + (4F * neck); + float jawAngle = neckAngle + (1.5F * wolf.jawMove); + this.WolfHead.rotateAngleX = neckAngle / (180F / (float) Math.PI); + this.WolfHead.rotateAngleY = f4 / (180F / (float) Math.PI); - this.Collar.rotateAngleX = neckAngle / (180F / (float) Math.PI); - this.Collar.rotateAngleY = f4 / (180F / (float) Math.PI); + this.Collar.rotateAngleX = neckAngle / (180F / (float) Math.PI); + this.Collar.rotateAngleY = f4 / (180F / (float) Math.PI); - this.Ear1.rotateAngleX = neckAngle / (180F / (float) Math.PI); - this.Ear1.rotateAngleY = f4 / (180F / (float) Math.PI); + this.Ear1.rotateAngleX = neckAngle / (180F / (float) Math.PI); + this.Ear1.rotateAngleY = f4 / (180F / (float) Math.PI); - this.Ear2.rotateAngleX = neckAngle / (180F / (float) Math.PI); - this.Ear2.rotateAngleY = f4 / (180F / (float) Math.PI); + this.Ear2.rotateAngleX = neckAngle / (180F / (float) Math.PI); + this.Ear2.rotateAngleY = f4 / (180F / (float) Math.PI); - this.Jaw.rotateAngleX = jawAngle / (180F / (float) Math.PI); - this.Jaw.rotateAngleY = f4 / (180F / (float) Math.PI); + this.Jaw.rotateAngleX = jawAngle / (180F / (float) Math.PI); + this.Jaw.rotateAngleY = f4 / (180F / (float) Math.PI); - this.Nose.rotateAngleX = neckAngle / (180F / (float) Math.PI); - this.Nose.rotateAngleY = f4 / (180F / (float) Math.PI); + this.Nose.rotateAngleX = neckAngle / (180F / (float) Math.PI); + this.Nose.rotateAngleY = f4 / (180F / (float) Math.PI); - this.Tail.rotateAngleX = f3; - } + this.Tail.rotateAngleX = f3; + } - private void rotateSleeping() { - Leg1.rotationPointY = 23F; - Leg2.rotationPointY = 23F; - Leg3.rotationPointY = 23F; - Leg4.rotationPointY = 23F; + private void rotateSleeping() { + Leg1.rotationPointY = 23F; + Leg2.rotationPointY = 23F; + Leg3.rotationPointY = 23F; + Leg4.rotationPointY = 23F; - Leg1.rotationPointZ = 9F; - Leg2.rotationPointZ = 9F; - Leg3.rotationPointZ = -1F; - Leg4.rotationPointZ = -1F; - this.Leg1.rotateAngleX = -(float) (Math.PI / 2); - this.Leg2.rotateAngleX = -(float) (Math.PI / 2); - this.Leg3.rotateAngleX = -(float) (Math.PI / 2); - this.Leg4.rotateAngleX = -(float) (Math.PI / 2); - Body.rotateAngleX = 1; - Mane.rotateAngleX = 0; - Tail.rotateAngleX = 0; + Leg1.rotationPointZ = 9F; + Leg2.rotationPointZ = 9F; + Leg3.rotationPointZ = -1F; + Leg4.rotationPointZ = -1F; + this.Leg1.rotateAngleX = -(float) (Math.PI / 2); + this.Leg2.rotateAngleX = -(float) (Math.PI / 2); + this.Leg3.rotateAngleX = -(float) (Math.PI / 2); + this.Leg4.rotateAngleX = -(float) (Math.PI / 2); + Body.rotateAngleX = 1; + Mane.rotateAngleX = 0; + Tail.rotateAngleX = 0; - Body.rotationPointZ = 5; - this.Collar.rotationPointY = 17.5F; - this.Ear1.rotationPointY = 17.5F; - this.Ear2.rotationPointY = 17.5F; - this.WolfHead.rotationPointY = 17.5F; - this.Nose.rotationPointY = 17.5F; - this.Jaw.rotationPointY = 17.5F; + Body.rotationPointZ = 5; + this.Collar.rotationPointY = 17.5F; + this.Ear1.rotationPointY = 17.5F; + this.Ear2.rotationPointY = 17.5F; + this.WolfHead.rotationPointY = 17.5F; + this.Nose.rotationPointY = 17.5F; + this.Jaw.rotationPointY = 17.5F; - this.WolfHead.rotateAngleX = Ear1.rotateAngleX = Ear2.rotateAngleX = Nose.rotateAngleX = Collar.rotateAngleX = Jaw.rotateAngleX = 0.5F; - this.WolfHead.rotateAngleY = Ear1.rotateAngleY = Ear2.rotateAngleY = Nose.rotateAngleY = Collar.rotateAngleY = Jaw.rotateAngleY = 0F; - } + this.WolfHead.rotateAngleX = Ear1.rotateAngleX = Ear2.rotateAngleX = Nose.rotateAngleX = Collar.rotateAngleX = Jaw.rotateAngleX = 0.5F; + this.WolfHead.rotateAngleY = Ear1.rotateAngleY = Ear2.rotateAngleY = Nose.rotateAngleY = Collar.rotateAngleY = Jaw.rotateAngleY = 0F; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelMinotaur.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelMinotaur.java index ad2652ef..b3cd926a 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelMinotaur.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelMinotaur.java @@ -1,4 +1,3 @@ - package minefantasy.mf2.client.render.mob; import minefantasy.mf2.entity.mob.EntityMinotaur; @@ -8,316 +7,316 @@ import net.minecraft.util.MathHelper; public class ModelMinotaur extends ModelBiped { - ModelRenderer Nose; - ModelRenderer Mane; - ModelRenderer bipedLeftForearm; - ModelRenderer tailEnd; - ModelRenderer bipedRightThigh; - ModelRenderer Lhorn1; - ModelRenderer Lhorn2; - ModelRenderer Rhorn1; - ModelRenderer Rhorn2; - ModelRenderer bipedLeftThigh; - ModelRenderer bipedLeftFoot; - ModelRenderer bipedRightFoot; - ModelRenderer tail; - ModelRenderer bipedRightForearm; - ModelRenderer shoulders; - ModelRenderer trapezius; - - ModelRenderer helmet; - ModelRenderer armour; - ModelRenderer warlordhelm; - - public ModelMinotaur() { - // AXIAL - textureWidth = 128; - textureHeight = 128; - - bipedHead = new ModelRenderer(this, 0, 0); - bipedHead.addBox(-2F, -3F, -5F, 4, 6, 6); - bipedHead.setRotationPoint(0F, -9F, -2F); - bipedHead.setTextureSize(128, 128); - - Nose = new ModelRenderer(this, 0, 54); - Nose.addBox(-2F, -1F, -9F, 4, 4, 4); - Nose.setRotationPoint(0F, -9F, -2F); - Nose.setTextureSize(128, 128); - - Mane = new ModelRenderer(this, 0, 88); - Mane.addBox(-3F, -3F, -2F, 6, 12, 8); - Mane.setRotationPoint(0F, -8F, 1F); - Mane.setTextureSize(128, 128); - - tailEnd = new ModelRenderer(this, 64, 0); - tailEnd.addBox(-1F, 4F, 10F, 2, 2, 11); - tailEnd.setRotationPoint(0F, 4F, 0F); - tailEnd.setTextureSize(128, 128); - setRotation(tailEnd, -0.5363927F, 0F, 0F); - - bipedBody = new ModelRenderer(this, 0, 12); - bipedBody.addBox(-5F, 0F, -5F, 10, 14, 9); - bipedBody.setRotationPoint(0F, -8F, 1F); - bipedBody.setTextureSize(128, 128); - - tail = new ModelRenderer(this, 64, 17); - tail.addBox(-2F, -3F, 2F, 4, 3, 11); - tail.setRotationPoint(0F, 4F, 0F); - tail.setTextureSize(128, 128); - setRotation(tail, -1.182165F, 0F, 0F); - - shoulders = new ModelRenderer(this, 86, 50); - shoulders.addBox(-7.5F, -1F, -4F, 15, 7, 6); - shoulders.setRotationPoint(0F, -8F, 1F); - shoulders.setTextureSize(128, 128); - - trapezius = new ModelRenderer(this, 0, 64); - trapezius.addBox(-4F, -2F, -4F, 8, 13, 9); - trapezius.setRotationPoint(0F, -8F, 1F); - trapezius.setTextureSize(128, 128); - - // APPENDICULAR - LEFT - Lhorn1 = new ModelRenderer(this, 20, 5); - Lhorn1.mirror = true; - Lhorn1.addBox(2F, -2F, -2F, 5, 2, 2); - Lhorn1.setRotationPoint(0F, -9F, -2F); - Lhorn1.setTextureSize(128, 128); - - Lhorn2 = new ModelRenderer(this, 20, 0); - Lhorn2.mirror = true; - Lhorn2.addBox(6F, -6F, -2F, 1, 4, 1); - Lhorn2.setRotationPoint(0F, -9F, -2F); - Lhorn2.setTextureSize(128, 128); - - bipedLeftArm = new ModelRenderer(this, 38, 33); - bipedLeftArm.mirror = true; - bipedLeftArm.addBox(-1F, -2F, -3F, 5, 10, 7); - bipedLeftArm.setRotationPoint(7F, -6F, 1F); - bipedLeftArm.setTextureSize(128, 128); - - bipedLeftForearm = new ModelRenderer(this, 62, 33); - bipedLeftForearm.mirror = true; - bipedLeftForearm.addBox(0F, 8F, -1F, 4, 10, 4); - bipedLeftForearm.setRotationPoint(7F, -6F, 1F); - bipedLeftForearm.setTextureSize(128, 128); - - bipedLeftThigh = new ModelRenderer(this, 38, 0); - bipedLeftThigh.mirror = true; - bipedLeftThigh.addBox(-2F, 0F, -3F, 5, 10, 8); - bipedLeftThigh.setRotationPoint(3F, 4F, 0F); - bipedLeftThigh.setTextureSize(128, 128); - - bipedLeftLeg = new ModelRenderer(this, 20, 50); - bipedLeftLeg.mirror = true; - bipedLeftLeg.addBox(-1F, 10F, 0F, 4, 6, 5); - bipedLeftLeg.setRotationPoint(3F, 4F, 0F); - bipedLeftLeg.setTextureSize(128, 128); - - bipedLeftFoot = new ModelRenderer(this, 20, 38); - bipedLeftFoot.mirror = true; - bipedLeftFoot.addBox(-1F, 13F, -2F, 4, 7, 5); - bipedLeftFoot.setRotationPoint(3F, 4F, 0F); - bipedLeftFoot.setTextureSize(128, 128); - - // APPENDICULAR - RIGHT - Rhorn1 = new ModelRenderer(this, 20, 5); - Rhorn1.addBox(-7F, -2F, -2F, 5, 2, 2); - Rhorn1.setRotationPoint(0F, -9F, -2F); - Rhorn1.setTextureSize(128, 128); - - Rhorn2 = new ModelRenderer(this, 20, 0); - Rhorn2.addBox(-7F, -6F, -2F, 1, 4, 1); - Rhorn2.setRotationPoint(0F, -9F, -2F); - Rhorn2.setTextureSize(128, 128); - - bipedRightArm = new ModelRenderer(this, 38, 33); - bipedRightArm.addBox(-4F, -2F, -3F, 5, 10, 7); - bipedRightArm.setRotationPoint(-7F, -6F, 1F); - bipedRightArm.setTextureSize(128, 128); - - bipedRightForearm = new ModelRenderer(this, 62, 33); - bipedRightForearm.addBox(-4F, 8F, -1F, 4, 10, 4); - bipedRightForearm.setRotationPoint(-7F, -6F, 1F); - bipedRightForearm.setTextureSize(128, 128); - - bipedRightThigh = new ModelRenderer(this, 38, 0); - bipedRightThigh.addBox(-3F, 0F, -3F, 5, 10, 8); - bipedRightThigh.setRotationPoint(-3F, 4F, 0F); - bipedRightThigh.setTextureSize(128, 128); - - bipedRightLeg = new ModelRenderer(this, 20, 50); - bipedRightLeg.addBox(-3F, 10F, 0F, 4, 6, 5); - bipedRightLeg.setRotationPoint(-3F, 4F, 0F); - bipedRightLeg.setTextureSize(128, 128); - - bipedRightFoot = new ModelRenderer(this, 20, 38); - bipedRightFoot.addBox(-3F, 13F, -2F, 4, 7, 5); - bipedRightFoot.setRotationPoint(-3F, 4F, 0F); - bipedRightFoot.setTextureSize(128, 128); - - // ARMOUR - helmet = new ModelRenderer(this, 74, 98); - helmet.addBox(-2.5F, -3.5F, -5.5F, 5, 6, 6); - helmet.setRotationPoint(0F, -9F, -2F); - - armour = new ModelRenderer(this, 86, 103); - armour.setTextureOffset(86, 103).addBox(-5.5F, -0.5F, -5.5F, 11, 15, 10);// chest - armour.setTextureOffset(90, 77).addBox(-4.5F, -4.5F, -2.5F, 9, 16, 10);// back - armour.setTextureOffset(34, 110).addBox(-8F, -1.5F, -5F, 16, 8, 10);// shoulders - armour.setRotationPoint(0F, -8F, 1F); - - warlordhelm = new ModelRenderer(this, 46, 97); - warlordhelm.addBox(-3.5F, -2F, -10F, 7, 6, 7); - warlordhelm.setRotationPoint(-32F, -9F, -2F); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - renderMinotaur((EntityMinotaur) entity, f, f1, f2, f3, f4, f5); - } - - public void renderMinotaur(EntityMinotaur mino, float f, float f1, float f2, float f3, float f4, float f5) { - setRotationAngles(mino, f, f1, f2, f3, f4, f5); - Nose.render(f5); - tailEnd.render(f5); - bipedLeftFoot.render(f5); - bipedRightFoot.render(f5); - shoulders.render(f5); - bipedLeftThigh.render(f5); - bipedRightThigh.render(f5); - tail.render(f5); - Rhorn1.render(f5); - Rhorn2.render(f5); - Lhorn1.render(f5); - if (!mino.isBloodied()) { - Lhorn2.render(f5); - } - bipedHead.render(f5); - bipedLeftLeg.render(f5); - bipedRightLeg.render(f5); - bipedBody.render(f5); - bipedRightArm.render(f5); - bipedLeftArm.render(f5); - bipedRightForearm.render(f5); - bipedLeftForearm.render(f5); - bipedRightLeg.render(f5); - bipedLeftLeg.render(f5); - Mane.render(f5); - trapezius.render(f5); - - armour.render(f5); - helmet.render(f5); - warlordhelm.render(f5); - } - - public void setRotationAngles(EntityMinotaur mino, float f, float f1, float f2, float f3, float f4, float f5) { - int swingAngle = 28 * mino.swing; - double swingRad = Math.toRadians(swingAngle); - - int swingAngleY = 9 * mino.swing; - double swingRadY = Math.toRadians(swingAngleY); - bipedHead.rotateAngleY = f3 / 57.29578F; - bipedHead.rotateAngleX = f4 / 57.29578F + (float) Math.toRadians(mino.getHeadChargeAngle()); - if (mino.swing <= 0) { - bipedRightArm.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 2.0F * f1 * 0.5F; - bipedLeftArm.rotateAngleX = MathHelper.cos(f * 0.6662F) * 2.0F * f1 * 0.5F; - bipedRightArm.rotateAngleY = 0.0F; - bipedLeftArm.rotateAngleY = 0.0F; - } else { - bipedRightArm.rotateAngleX = (float) -swingRad; - bipedLeftArm.rotateAngleX = (float) -swingRad; - bipedRightArm.rotateAngleY = (float) swingRadY; - bipedLeftArm.rotateAngleY = (float) -swingRadY; - } - bipedRightArm.rotateAngleZ = 0.0F; - bipedLeftArm.rotateAngleZ = 0.0F; - bipedRightLeg.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; - bipedLeftLeg.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 1.4F * f1; - bipedRightLeg.rotateAngleY = 0.0F; - bipedLeftLeg.rotateAngleY = 0.0F; - - tail.rotateAngleX = -1.182165F; - tailEnd.rotateAngleX = -0.5363927F; - Nose.rotateAngleX = bipedHead.rotateAngleX; - Nose.rotateAngleY = bipedHead.rotateAngleY; - Rhorn1.rotateAngleX = bipedHead.rotateAngleX; - Rhorn1.rotateAngleY = bipedHead.rotateAngleY; - Rhorn2.rotateAngleX = bipedHead.rotateAngleX; - Rhorn2.rotateAngleY = bipedHead.rotateAngleY; - Lhorn1.rotateAngleX = bipedHead.rotateAngleX; - Lhorn1.rotateAngleY = bipedHead.rotateAngleY; - Lhorn2.rotateAngleX = bipedHead.rotateAngleX; - Lhorn2.rotateAngleY = bipedHead.rotateAngleY; - - if (onGround > -9990F) { - float f6 = onGround; - bipedBody.rotateAngleY = MathHelper.sin(MathHelper.sqrt_float(f6) * 3.141593F * 2.0F) * 0.2F; - bipedRightArm.rotationPointZ = MathHelper.sin(bipedBody.rotateAngleY) * 5F; - bipedRightArm.rotationPointX = -MathHelper.cos(bipedBody.rotateAngleY) * 5F; - bipedLeftArm.rotationPointZ = -MathHelper.sin(bipedBody.rotateAngleY) * 5F; - bipedLeftArm.rotationPointX = MathHelper.cos(bipedBody.rotateAngleY) * 5F; - bipedRightArm.rotateAngleY += bipedBody.rotateAngleY; - bipedLeftArm.rotateAngleY += bipedBody.rotateAngleY; - bipedLeftArm.rotateAngleX += bipedBody.rotateAngleY; - f6 = 1.0F - onGround; - f6 *= f6; - f6 *= f6; - f6 = 1.0F - f6; - float f8 = MathHelper.sin(f6 * 3.141593F); - float f10 = MathHelper.sin(onGround * 3.141593F) * -(bipedHead.rotateAngleX - 0.7F) * 0.75F; - bipedRightArm.rotateAngleX -= f8 * 1.2D + f10; - bipedRightArm.rotateAngleY += bipedBody.rotateAngleY * 2.0F; - bipedRightArm.rotateAngleZ = MathHelper.sin(onGround * 3.141593F) * -0.4F; - } - if (mino.riddenByEntity != null) { - bipedLeftArm.rotateAngleX = (float) Math.toRadians(180F); - } - if (mino.getAttack() == 3 && mino.getHeldItem() == null)// if is power attack - { - bipedLeftArm.rotateAngleX = (float) Math.toRadians(-135F); - bipedRightArm.rotateAngleX = (float) Math.toRadians(-135F); - } - - bipedRightArm.rotateAngleZ += MathHelper.cos(f2 * 0.09F) * 0.05F + 0.05F; - bipedLeftArm.rotateAngleZ -= MathHelper.cos(f2 * 0.09F) * 0.05F + 0.05F; - bipedRightArm.rotateAngleX += MathHelper.sin(f2 * 0.067F) * 0.05F; - bipedLeftArm.rotateAngleX -= MathHelper.sin(f2 * 0.067F) * 0.05F; - - bipedLeftThigh.rotateAngleX = bipedLeftFoot.rotateAngleX = bipedLeftLeg.rotateAngleX; - bipedRightThigh.rotateAngleX = bipedRightFoot.rotateAngleX = bipedRightLeg.rotateAngleX; - - joinBlocks(Mane, bipedBody); - joinBlocks(trapezius, bipedBody); - joinBlocks2(bipedLeftForearm, bipedLeftArm); - joinBlocks2(bipedRightForearm, bipedRightArm); - - joinBlocks(armour, bipedBody); - joinBlocks2(helmet, bipedHead); - joinBlocks2(warlordhelm, bipedHead); - } - - private void joinBlocks(ModelRenderer model, ModelRenderer anchor) { - joinBlocks(model, anchor, 1.0F); - } - - private void joinBlocks2(ModelRenderer model, ModelRenderer anchor) { - model.rotateAngleX = anchor.rotateAngleX; - model.rotateAngleY = anchor.rotateAngleY; - model.rotateAngleZ = anchor.rotateAngleZ; - - model.rotationPointX = anchor.rotationPointX; - model.rotationPointY = anchor.rotationPointY; - model.rotationPointZ = anchor.rotationPointZ; - } - - private void joinBlocks(ModelRenderer model, ModelRenderer anchor, float ratio) { - model.rotateAngleX = anchor.rotateAngleX * ratio; - model.rotateAngleY = anchor.rotateAngleY * ratio; - model.rotateAngleZ = anchor.rotateAngleZ * ratio; - } + ModelRenderer Nose; + ModelRenderer Mane; + ModelRenderer bipedLeftForearm; + ModelRenderer tailEnd; + ModelRenderer bipedRightThigh; + ModelRenderer Lhorn1; + ModelRenderer Lhorn2; + ModelRenderer Rhorn1; + ModelRenderer Rhorn2; + ModelRenderer bipedLeftThigh; + ModelRenderer bipedLeftFoot; + ModelRenderer bipedRightFoot; + ModelRenderer tail; + ModelRenderer bipedRightForearm; + ModelRenderer shoulders; + ModelRenderer trapezius; + + ModelRenderer helmet; + ModelRenderer armour; + ModelRenderer warlordhelm; + + public ModelMinotaur() { + // AXIAL + textureWidth = 128; + textureHeight = 128; + + bipedHead = new ModelRenderer(this, 0, 0); + bipedHead.addBox(-2F, -3F, -5F, 4, 6, 6); + bipedHead.setRotationPoint(0F, -9F, -2F); + bipedHead.setTextureSize(128, 128); + + Nose = new ModelRenderer(this, 0, 54); + Nose.addBox(-2F, -1F, -9F, 4, 4, 4); + Nose.setRotationPoint(0F, -9F, -2F); + Nose.setTextureSize(128, 128); + + Mane = new ModelRenderer(this, 0, 88); + Mane.addBox(-3F, -3F, -2F, 6, 12, 8); + Mane.setRotationPoint(0F, -8F, 1F); + Mane.setTextureSize(128, 128); + + tailEnd = new ModelRenderer(this, 64, 0); + tailEnd.addBox(-1F, 4F, 10F, 2, 2, 11); + tailEnd.setRotationPoint(0F, 4F, 0F); + tailEnd.setTextureSize(128, 128); + setRotation(tailEnd, -0.5363927F, 0F, 0F); + + bipedBody = new ModelRenderer(this, 0, 12); + bipedBody.addBox(-5F, 0F, -5F, 10, 14, 9); + bipedBody.setRotationPoint(0F, -8F, 1F); + bipedBody.setTextureSize(128, 128); + + tail = new ModelRenderer(this, 64, 17); + tail.addBox(-2F, -3F, 2F, 4, 3, 11); + tail.setRotationPoint(0F, 4F, 0F); + tail.setTextureSize(128, 128); + setRotation(tail, -1.182165F, 0F, 0F); + + shoulders = new ModelRenderer(this, 86, 50); + shoulders.addBox(-7.5F, -1F, -4F, 15, 7, 6); + shoulders.setRotationPoint(0F, -8F, 1F); + shoulders.setTextureSize(128, 128); + + trapezius = new ModelRenderer(this, 0, 64); + trapezius.addBox(-4F, -2F, -4F, 8, 13, 9); + trapezius.setRotationPoint(0F, -8F, 1F); + trapezius.setTextureSize(128, 128); + + // APPENDICULAR - LEFT + Lhorn1 = new ModelRenderer(this, 20, 5); + Lhorn1.mirror = true; + Lhorn1.addBox(2F, -2F, -2F, 5, 2, 2); + Lhorn1.setRotationPoint(0F, -9F, -2F); + Lhorn1.setTextureSize(128, 128); + + Lhorn2 = new ModelRenderer(this, 20, 0); + Lhorn2.mirror = true; + Lhorn2.addBox(6F, -6F, -2F, 1, 4, 1); + Lhorn2.setRotationPoint(0F, -9F, -2F); + Lhorn2.setTextureSize(128, 128); + + bipedLeftArm = new ModelRenderer(this, 38, 33); + bipedLeftArm.mirror = true; + bipedLeftArm.addBox(-1F, -2F, -3F, 5, 10, 7); + bipedLeftArm.setRotationPoint(7F, -6F, 1F); + bipedLeftArm.setTextureSize(128, 128); + + bipedLeftForearm = new ModelRenderer(this, 62, 33); + bipedLeftForearm.mirror = true; + bipedLeftForearm.addBox(0F, 8F, -1F, 4, 10, 4); + bipedLeftForearm.setRotationPoint(7F, -6F, 1F); + bipedLeftForearm.setTextureSize(128, 128); + + bipedLeftThigh = new ModelRenderer(this, 38, 0); + bipedLeftThigh.mirror = true; + bipedLeftThigh.addBox(-2F, 0F, -3F, 5, 10, 8); + bipedLeftThigh.setRotationPoint(3F, 4F, 0F); + bipedLeftThigh.setTextureSize(128, 128); + + bipedLeftLeg = new ModelRenderer(this, 20, 50); + bipedLeftLeg.mirror = true; + bipedLeftLeg.addBox(-1F, 10F, 0F, 4, 6, 5); + bipedLeftLeg.setRotationPoint(3F, 4F, 0F); + bipedLeftLeg.setTextureSize(128, 128); + + bipedLeftFoot = new ModelRenderer(this, 20, 38); + bipedLeftFoot.mirror = true; + bipedLeftFoot.addBox(-1F, 13F, -2F, 4, 7, 5); + bipedLeftFoot.setRotationPoint(3F, 4F, 0F); + bipedLeftFoot.setTextureSize(128, 128); + + // APPENDICULAR - RIGHT + Rhorn1 = new ModelRenderer(this, 20, 5); + Rhorn1.addBox(-7F, -2F, -2F, 5, 2, 2); + Rhorn1.setRotationPoint(0F, -9F, -2F); + Rhorn1.setTextureSize(128, 128); + + Rhorn2 = new ModelRenderer(this, 20, 0); + Rhorn2.addBox(-7F, -6F, -2F, 1, 4, 1); + Rhorn2.setRotationPoint(0F, -9F, -2F); + Rhorn2.setTextureSize(128, 128); + + bipedRightArm = new ModelRenderer(this, 38, 33); + bipedRightArm.addBox(-4F, -2F, -3F, 5, 10, 7); + bipedRightArm.setRotationPoint(-7F, -6F, 1F); + bipedRightArm.setTextureSize(128, 128); + + bipedRightForearm = new ModelRenderer(this, 62, 33); + bipedRightForearm.addBox(-4F, 8F, -1F, 4, 10, 4); + bipedRightForearm.setRotationPoint(-7F, -6F, 1F); + bipedRightForearm.setTextureSize(128, 128); + + bipedRightThigh = new ModelRenderer(this, 38, 0); + bipedRightThigh.addBox(-3F, 0F, -3F, 5, 10, 8); + bipedRightThigh.setRotationPoint(-3F, 4F, 0F); + bipedRightThigh.setTextureSize(128, 128); + + bipedRightLeg = new ModelRenderer(this, 20, 50); + bipedRightLeg.addBox(-3F, 10F, 0F, 4, 6, 5); + bipedRightLeg.setRotationPoint(-3F, 4F, 0F); + bipedRightLeg.setTextureSize(128, 128); + + bipedRightFoot = new ModelRenderer(this, 20, 38); + bipedRightFoot.addBox(-3F, 13F, -2F, 4, 7, 5); + bipedRightFoot.setRotationPoint(-3F, 4F, 0F); + bipedRightFoot.setTextureSize(128, 128); + + // ARMOUR + helmet = new ModelRenderer(this, 74, 98); + helmet.addBox(-2.5F, -3.5F, -5.5F, 5, 6, 6); + helmet.setRotationPoint(0F, -9F, -2F); + + armour = new ModelRenderer(this, 86, 103); + armour.setTextureOffset(86, 103).addBox(-5.5F, -0.5F, -5.5F, 11, 15, 10);// chest + armour.setTextureOffset(90, 77).addBox(-4.5F, -4.5F, -2.5F, 9, 16, 10);// back + armour.setTextureOffset(34, 110).addBox(-8F, -1.5F, -5F, 16, 8, 10);// shoulders + armour.setRotationPoint(0F, -8F, 1F); + + warlordhelm = new ModelRenderer(this, 46, 97); + warlordhelm.addBox(-3.5F, -2F, -10F, 7, 6, 7); + warlordhelm.setRotationPoint(-32F, -9F, -2F); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + renderMinotaur((EntityMinotaur) entity, f, f1, f2, f3, f4, f5); + } + + public void renderMinotaur(EntityMinotaur mino, float f, float f1, float f2, float f3, float f4, float f5) { + setRotationAngles(mino, f, f1, f2, f3, f4, f5); + Nose.render(f5); + tailEnd.render(f5); + bipedLeftFoot.render(f5); + bipedRightFoot.render(f5); + shoulders.render(f5); + bipedLeftThigh.render(f5); + bipedRightThigh.render(f5); + tail.render(f5); + Rhorn1.render(f5); + Rhorn2.render(f5); + Lhorn1.render(f5); + if (!mino.isBloodied()) { + Lhorn2.render(f5); + } + bipedHead.render(f5); + bipedLeftLeg.render(f5); + bipedRightLeg.render(f5); + bipedBody.render(f5); + bipedRightArm.render(f5); + bipedLeftArm.render(f5); + bipedRightForearm.render(f5); + bipedLeftForearm.render(f5); + bipedRightLeg.render(f5); + bipedLeftLeg.render(f5); + Mane.render(f5); + trapezius.render(f5); + + armour.render(f5); + helmet.render(f5); + warlordhelm.render(f5); + } + + public void setRotationAngles(EntityMinotaur mino, float f, float f1, float f2, float f3, float f4, float f5) { + int swingAngle = 28 * mino.swing; + double swingRad = Math.toRadians(swingAngle); + + int swingAngleY = 9 * mino.swing; + double swingRadY = Math.toRadians(swingAngleY); + bipedHead.rotateAngleY = f3 / 57.29578F; + bipedHead.rotateAngleX = f4 / 57.29578F + (float) Math.toRadians(mino.getHeadChargeAngle()); + if (mino.swing <= 0) { + bipedRightArm.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 2.0F * f1 * 0.5F; + bipedLeftArm.rotateAngleX = MathHelper.cos(f * 0.6662F) * 2.0F * f1 * 0.5F; + bipedRightArm.rotateAngleY = 0.0F; + bipedLeftArm.rotateAngleY = 0.0F; + } else { + bipedRightArm.rotateAngleX = (float) -swingRad; + bipedLeftArm.rotateAngleX = (float) -swingRad; + bipedRightArm.rotateAngleY = (float) swingRadY; + bipedLeftArm.rotateAngleY = (float) -swingRadY; + } + bipedRightArm.rotateAngleZ = 0.0F; + bipedLeftArm.rotateAngleZ = 0.0F; + bipedRightLeg.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; + bipedLeftLeg.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 1.4F * f1; + bipedRightLeg.rotateAngleY = 0.0F; + bipedLeftLeg.rotateAngleY = 0.0F; + + tail.rotateAngleX = -1.182165F; + tailEnd.rotateAngleX = -0.5363927F; + Nose.rotateAngleX = bipedHead.rotateAngleX; + Nose.rotateAngleY = bipedHead.rotateAngleY; + Rhorn1.rotateAngleX = bipedHead.rotateAngleX; + Rhorn1.rotateAngleY = bipedHead.rotateAngleY; + Rhorn2.rotateAngleX = bipedHead.rotateAngleX; + Rhorn2.rotateAngleY = bipedHead.rotateAngleY; + Lhorn1.rotateAngleX = bipedHead.rotateAngleX; + Lhorn1.rotateAngleY = bipedHead.rotateAngleY; + Lhorn2.rotateAngleX = bipedHead.rotateAngleX; + Lhorn2.rotateAngleY = bipedHead.rotateAngleY; + + if (onGround > -9990F) { + float f6 = onGround; + bipedBody.rotateAngleY = MathHelper.sin(MathHelper.sqrt_float(f6) * 3.141593F * 2.0F) * 0.2F; + bipedRightArm.rotationPointZ = MathHelper.sin(bipedBody.rotateAngleY) * 5F; + bipedRightArm.rotationPointX = -MathHelper.cos(bipedBody.rotateAngleY) * 5F; + bipedLeftArm.rotationPointZ = -MathHelper.sin(bipedBody.rotateAngleY) * 5F; + bipedLeftArm.rotationPointX = MathHelper.cos(bipedBody.rotateAngleY) * 5F; + bipedRightArm.rotateAngleY += bipedBody.rotateAngleY; + bipedLeftArm.rotateAngleY += bipedBody.rotateAngleY; + bipedLeftArm.rotateAngleX += bipedBody.rotateAngleY; + f6 = 1.0F - onGround; + f6 *= f6; + f6 *= f6; + f6 = 1.0F - f6; + float f8 = MathHelper.sin(f6 * 3.141593F); + float f10 = MathHelper.sin(onGround * 3.141593F) * -(bipedHead.rotateAngleX - 0.7F) * 0.75F; + bipedRightArm.rotateAngleX -= f8 * 1.2D + f10; + bipedRightArm.rotateAngleY += bipedBody.rotateAngleY * 2.0F; + bipedRightArm.rotateAngleZ = MathHelper.sin(onGround * 3.141593F) * -0.4F; + } + if (mino.riddenByEntity != null) { + bipedLeftArm.rotateAngleX = (float) Math.toRadians(180F); + } + if (mino.getAttack() == 3 && mino.getHeldItem() == null)// if is power attack + { + bipedLeftArm.rotateAngleX = (float) Math.toRadians(-135F); + bipedRightArm.rotateAngleX = (float) Math.toRadians(-135F); + } + + bipedRightArm.rotateAngleZ += MathHelper.cos(f2 * 0.09F) * 0.05F + 0.05F; + bipedLeftArm.rotateAngleZ -= MathHelper.cos(f2 * 0.09F) * 0.05F + 0.05F; + bipedRightArm.rotateAngleX += MathHelper.sin(f2 * 0.067F) * 0.05F; + bipedLeftArm.rotateAngleX -= MathHelper.sin(f2 * 0.067F) * 0.05F; + + bipedLeftThigh.rotateAngleX = bipedLeftFoot.rotateAngleX = bipedLeftLeg.rotateAngleX; + bipedRightThigh.rotateAngleX = bipedRightFoot.rotateAngleX = bipedRightLeg.rotateAngleX; + + joinBlocks(Mane, bipedBody); + joinBlocks(trapezius, bipedBody); + joinBlocks2(bipedLeftForearm, bipedLeftArm); + joinBlocks2(bipedRightForearm, bipedRightArm); + + joinBlocks(armour, bipedBody); + joinBlocks2(helmet, bipedHead); + joinBlocks2(warlordhelm, bipedHead); + } + + private void joinBlocks(ModelRenderer model, ModelRenderer anchor) { + joinBlocks(model, anchor, 1.0F); + } + + private void joinBlocks2(ModelRenderer model, ModelRenderer anchor) { + model.rotateAngleX = anchor.rotateAngleX; + model.rotateAngleY = anchor.rotateAngleY; + model.rotateAngleZ = anchor.rotateAngleZ; + + model.rotationPointX = anchor.rotationPointX; + model.rotationPointY = anchor.rotationPointY; + model.rotationPointZ = anchor.rotationPointZ; + } + + private void joinBlocks(ModelRenderer model, ModelRenderer anchor, float ratio) { + model.rotateAngleX = anchor.rotateAngleX * ratio; + model.rotateAngleY = anchor.rotateAngleY * ratio; + model.rotateAngleZ = anchor.rotateAngleZ * ratio; + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/ModelVenomDragon.java b/src/main/java/minefantasy/mf2/client/render/mob/ModelVenomDragon.java index a52d01d4..0ecc5776 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/ModelVenomDragon.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/ModelVenomDragon.java @@ -7,1101 +7,1101 @@ import net.minecraft.util.MathHelper; public class ModelVenomDragon extends ModelBase { - public ModelRenderer Body; - public ModelRenderer Tail1; - public ModelRenderer Belly1; - public ModelRenderer Wingshoulderright; - public ModelRenderer Wingshoulderleft; - public ModelRenderer Neckbase; - public ModelRenderer Shoulderleft; - public ModelRenderer Shoulderleft_1; - public ModelRenderer Spike1; - public ModelRenderer Spike2; - public ModelRenderer Spike3; - public ModelRenderer Tail3; - public ModelRenderer Righthip; - public ModelRenderer Lefthip; - public ModelRenderer Spike4; - public ModelRenderer Spike5; - public ModelRenderer Spike6; - public ModelRenderer Spike7; - public ModelRenderer Tail4; - public ModelRenderer Spike8; - public ModelRenderer Spike9; - public ModelRenderer Tail6; - public ModelRenderer Spike10; - public ModelRenderer Spike11; - public ModelRenderer Tail7; - public ModelRenderer Spike12; - public ModelRenderer Spike13; - public ModelRenderer Tail8; - public ModelRenderer Spike14; - public ModelRenderer Spike15; - public ModelRenderer LTailSpike; - public ModelRenderer RTailSpike; - public ModelRenderer LTailMembrane; - public ModelRenderer RTailMembrane; - public ModelRenderer RightLeg; - public ModelRenderer RightFoot; - public ModelRenderer Righttoemid; - public ModelRenderer Righttoeleft; - public ModelRenderer Righttoeright; - public ModelRenderer Outertoelowerright; - public ModelRenderer Righttoelowermid; - public ModelRenderer Righttoelowerleft; - public ModelRenderer Righttoelowerright; - public ModelRenderer Outertoelowerright_1; - public ModelRenderer Rightleg; - public ModelRenderer Rightfoot; - public ModelRenderer Lefttoemid; - public ModelRenderer Lefttoeright; - public ModelRenderer Lefttoeleft; - public ModelRenderer Outertoeleft; - public ModelRenderer Lefttoelowermid; - public ModelRenderer Lefttoelowerright; - public ModelRenderer Lefttoelowerleft; - public ModelRenderer Outertoelowerleft; - public ModelRenderer Belly2; - public ModelRenderer Wingupperarmright; - public ModelRenderer Winglowerarmright; - public ModelRenderer Wingmembramesmallright; - public ModelRenderer Wingfinger1right; - public ModelRenderer Wingmembramemidright; - public ModelRenderer Wingfinger2right; - public ModelRenderer Wingfinger3right; - public ModelRenderer Wingfingerlower1right; - public ModelRenderer Wingmembramelargeright; - public ModelRenderer Wingfingerlower2right; - public ModelRenderer Wingfingerlower3right; - public ModelRenderer Wingupperarmleft; - public ModelRenderer Winglowerarmleft; - public ModelRenderer Wingmembramesmallleft; - public ModelRenderer Wingfinger1left; - public ModelRenderer Wingmembramemidleft; - public ModelRenderer Wingfingerlower1left; - public ModelRenderer Wingfinger2left; - public ModelRenderer Wingfinger3left; - public ModelRenderer Wingmembramelargeleft; - public ModelRenderer Wingfingerlower2left; - public ModelRenderer Wingfingerlower3left; - public ModelRenderer Neckmid; - public ModelRenderer Neckend; - public ModelRenderer Headback; - public ModelRenderer Snout; - public ModelRenderer Headlargehornlowerleft; - public ModelRenderer Headlargehornlowerright; - public ModelRenderer Smallheadhornleft2; - public ModelRenderer Smallheadhornright2; - public ModelRenderer Headmidhornlowerleft; - public ModelRenderer Headmidhornlowerright; - public ModelRenderer shape151; - public ModelRenderer Tooth5; - public ModelRenderer Tooth4; - public ModelRenderer Tooth3; - public ModelRenderer Tooth1; - public ModelRenderer Tooth6; - public ModelRenderer Tooth7; - public ModelRenderer Tooth9; - public ModelRenderer Tooth10; - public ModelRenderer BrowfrontR; - public ModelRenderer BrowfrontL; - public ModelRenderer RBrowback; - public ModelRenderer BrowbackL; - public ModelRenderer Headlargehornupperleft; - public ModelRenderer Lheadhorncrown1; - public ModelRenderer Lheadhorncrown1_1; - public ModelRenderer LHeadhornlargeback; - public ModelRenderer Lheadhorncrown2; - public ModelRenderer Lheadhorncrown3; - public ModelRenderer Lheadhorncrown2_1; - public ModelRenderer Lheadhorncrown3_1; - public ModelRenderer Headlargehornupperright; - public ModelRenderer Rheadhorncrown1; - public ModelRenderer Rheadhorncrown1_1; - public ModelRenderer RHeadhornlargeback; - public ModelRenderer Rheadhorncrown2; - public ModelRenderer Rheadhorncrown3; - public ModelRenderer Rhorncrownlower2; - public ModelRenderer Rhorncrownlower3; - public ModelRenderer Headmidhornupperleft; - public ModelRenderer Headmidhornupperright; - public ModelRenderer Lowerjawback; - public ModelRenderer Lowerjaw; - public ModelRenderer Smallheadhornright3; - public ModelRenderer Smallheadhornleft3; - public ModelRenderer Underlowerjaw2; - public ModelRenderer Underlowerjaw; - public ModelRenderer Tooth17; - public ModelRenderer Tooth13; - public ModelRenderer Tooth16; - public ModelRenderer Tooth12; - public ModelRenderer Tooth18; - public ModelRenderer Tooth14; - public ModelRenderer Tooth15; - public ModelRenderer Tooth11; - public ModelRenderer Underlowerjaw3; - public ModelRenderer Lowerarmleft; - public ModelRenderer Lefthandrightfinger; - public ModelRenderer Lefthandmidfinger; - public ModelRenderer Lefthandrightfinger_1; - public ModelRenderer Thumbtoeupperleft; - public ModelRenderer Clawlefthandright; - public ModelRenderer Clawlefthandmid; - public ModelRenderer Clawlefthandleft; - public ModelRenderer Thumbtoelowerleft; - public ModelRenderer Lowerarmleft_1; - public ModelRenderer Righthandleftfinger; - public ModelRenderer Righthandmidfinger; - public ModelRenderer Righthandrightfinger; - public ModelRenderer Thumbtoeupperright; - public ModelRenderer Clawrighthandleft; - public ModelRenderer Clawrighthandmid; - public ModelRenderer Clawrighthandright; - public ModelRenderer Thumbtoelowerright; + public ModelRenderer Body; + public ModelRenderer Tail1; + public ModelRenderer Belly1; + public ModelRenderer Wingshoulderright; + public ModelRenderer Wingshoulderleft; + public ModelRenderer Neckbase; + public ModelRenderer Shoulderleft; + public ModelRenderer Shoulderleft_1; + public ModelRenderer Spike1; + public ModelRenderer Spike2; + public ModelRenderer Spike3; + public ModelRenderer Tail3; + public ModelRenderer Righthip; + public ModelRenderer Lefthip; + public ModelRenderer Spike4; + public ModelRenderer Spike5; + public ModelRenderer Spike6; + public ModelRenderer Spike7; + public ModelRenderer Tail4; + public ModelRenderer Spike8; + public ModelRenderer Spike9; + public ModelRenderer Tail6; + public ModelRenderer Spike10; + public ModelRenderer Spike11; + public ModelRenderer Tail7; + public ModelRenderer Spike12; + public ModelRenderer Spike13; + public ModelRenderer Tail8; + public ModelRenderer Spike14; + public ModelRenderer Spike15; + public ModelRenderer LTailSpike; + public ModelRenderer RTailSpike; + public ModelRenderer LTailMembrane; + public ModelRenderer RTailMembrane; + public ModelRenderer RightLeg; + public ModelRenderer RightFoot; + public ModelRenderer Righttoemid; + public ModelRenderer Righttoeleft; + public ModelRenderer Righttoeright; + public ModelRenderer Outertoelowerright; + public ModelRenderer Righttoelowermid; + public ModelRenderer Righttoelowerleft; + public ModelRenderer Righttoelowerright; + public ModelRenderer Outertoelowerright_1; + public ModelRenderer Rightleg; + public ModelRenderer Rightfoot; + public ModelRenderer Lefttoemid; + public ModelRenderer Lefttoeright; + public ModelRenderer Lefttoeleft; + public ModelRenderer Outertoeleft; + public ModelRenderer Lefttoelowermid; + public ModelRenderer Lefttoelowerright; + public ModelRenderer Lefttoelowerleft; + public ModelRenderer Outertoelowerleft; + public ModelRenderer Belly2; + public ModelRenderer Wingupperarmright; + public ModelRenderer Winglowerarmright; + public ModelRenderer Wingmembramesmallright; + public ModelRenderer Wingfinger1right; + public ModelRenderer Wingmembramemidright; + public ModelRenderer Wingfinger2right; + public ModelRenderer Wingfinger3right; + public ModelRenderer Wingfingerlower1right; + public ModelRenderer Wingmembramelargeright; + public ModelRenderer Wingfingerlower2right; + public ModelRenderer Wingfingerlower3right; + public ModelRenderer Wingupperarmleft; + public ModelRenderer Winglowerarmleft; + public ModelRenderer Wingmembramesmallleft; + public ModelRenderer Wingfinger1left; + public ModelRenderer Wingmembramemidleft; + public ModelRenderer Wingfingerlower1left; + public ModelRenderer Wingfinger2left; + public ModelRenderer Wingfinger3left; + public ModelRenderer Wingmembramelargeleft; + public ModelRenderer Wingfingerlower2left; + public ModelRenderer Wingfingerlower3left; + public ModelRenderer Neckmid; + public ModelRenderer Neckend; + public ModelRenderer Headback; + public ModelRenderer Snout; + public ModelRenderer Headlargehornlowerleft; + public ModelRenderer Headlargehornlowerright; + public ModelRenderer Smallheadhornleft2; + public ModelRenderer Smallheadhornright2; + public ModelRenderer Headmidhornlowerleft; + public ModelRenderer Headmidhornlowerright; + public ModelRenderer shape151; + public ModelRenderer Tooth5; + public ModelRenderer Tooth4; + public ModelRenderer Tooth3; + public ModelRenderer Tooth1; + public ModelRenderer Tooth6; + public ModelRenderer Tooth7; + public ModelRenderer Tooth9; + public ModelRenderer Tooth10; + public ModelRenderer BrowfrontR; + public ModelRenderer BrowfrontL; + public ModelRenderer RBrowback; + public ModelRenderer BrowbackL; + public ModelRenderer Headlargehornupperleft; + public ModelRenderer Lheadhorncrown1; + public ModelRenderer Lheadhorncrown1_1; + public ModelRenderer LHeadhornlargeback; + public ModelRenderer Lheadhorncrown2; + public ModelRenderer Lheadhorncrown3; + public ModelRenderer Lheadhorncrown2_1; + public ModelRenderer Lheadhorncrown3_1; + public ModelRenderer Headlargehornupperright; + public ModelRenderer Rheadhorncrown1; + public ModelRenderer Rheadhorncrown1_1; + public ModelRenderer RHeadhornlargeback; + public ModelRenderer Rheadhorncrown2; + public ModelRenderer Rheadhorncrown3; + public ModelRenderer Rhorncrownlower2; + public ModelRenderer Rhorncrownlower3; + public ModelRenderer Headmidhornupperleft; + public ModelRenderer Headmidhornupperright; + public ModelRenderer Lowerjawback; + public ModelRenderer Lowerjaw; + public ModelRenderer Smallheadhornright3; + public ModelRenderer Smallheadhornleft3; + public ModelRenderer Underlowerjaw2; + public ModelRenderer Underlowerjaw; + public ModelRenderer Tooth17; + public ModelRenderer Tooth13; + public ModelRenderer Tooth16; + public ModelRenderer Tooth12; + public ModelRenderer Tooth18; + public ModelRenderer Tooth14; + public ModelRenderer Tooth15; + public ModelRenderer Tooth11; + public ModelRenderer Underlowerjaw3; + public ModelRenderer Lowerarmleft; + public ModelRenderer Lefthandrightfinger; + public ModelRenderer Lefthandmidfinger; + public ModelRenderer Lefthandrightfinger_1; + public ModelRenderer Thumbtoeupperleft; + public ModelRenderer Clawlefthandright; + public ModelRenderer Clawlefthandmid; + public ModelRenderer Clawlefthandleft; + public ModelRenderer Thumbtoelowerleft; + public ModelRenderer Lowerarmleft_1; + public ModelRenderer Righthandleftfinger; + public ModelRenderer Righthandmidfinger; + public ModelRenderer Righthandrightfinger; + public ModelRenderer Thumbtoeupperright; + public ModelRenderer Clawrighthandleft; + public ModelRenderer Clawrighthandmid; + public ModelRenderer Clawrighthandright; + public ModelRenderer Thumbtoelowerright; - public ModelVenomDragon() { - this.textureWidth = 512; - this.textureHeight = 512; - this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); - this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); - this.Outertoelowerleft = new ModelRenderer(this, 305, 270); - this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); - this.Spike7 = new ModelRenderer(this, 230, 500); - this.Spike7.setRotationPoint(0.0F, 0.0F, 22.1F); - this.Spike7.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike7, 0.5918411493512771F, 0.0F, 0.0F); - this.Wingmembramesmallleft = new ModelRenderer(this, 420, 255); - this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); - this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); - this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); - this.Outertoelowerright_1.mirror = true; - this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); - this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); - this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornleft3.setRotationPoint(2.0F, -2.4F, -2.5F); - this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); - this.setRotateAngle(Smallheadhornleft3, -0.6373942428283291F, 0.4553564018453205F, 0.0F); - this.LTailSpike = new ModelRenderer(this, 350, 300); - this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); - this.Clawlefthandright = new ModelRenderer(this, 200, 260); - this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); - this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerleft.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 5, 0.0F); - this.setRotateAngle(Headlargehornlowerleft, 0.5462880558742251F, 0.091106186954104F, 0.36425021489121656F); - this.Lefttoeleft = new ModelRenderer(this, 290, 280); - this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); - this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); - this.RightLeg = new ModelRenderer(this, 260, 275); - this.RightLeg.setRotationPoint(0.0F, 14.6F, 0.0F); - this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.045553093477052F, -0.091106186954104F); - this.Righttoeright = new ModelRenderer(this, 290, 280); - this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); - this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); - this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); - this.Headmidhornupperright = new ModelRenderer(this, 190, 420); - this.Headmidhornupperright.setRotationPoint(0.0F, 0.1F, 2.7F); - this.Headmidhornupperright.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, -0.091106186954104F, 0.0F); - this.Wingfinger1left = new ModelRenderer(this, 350, 200); - this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); - this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); - this.Rheadhorncrown1 = new ModelRenderer(this, 190, 400); - this.Rheadhorncrown1.setRotationPoint(-2.0F, 0.0F, 1.0F); - this.Rheadhorncrown1.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 4, 0.0F); - this.setRotateAngle(Rheadhorncrown1, -0.40980330836826856F, -0.31869712141416456F, 0.40980330836826856F); - this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); - this.Shoulderleft_1.setRotationPoint(-8.0F, 11.0F, 9.0F); - this.Shoulderleft_1.addBox(-2.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); - this.RTailMembrane = new ModelRenderer(this, 381, 270); - this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); - this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); - this.BrowfrontL = new ModelRenderer(this, 190, 390); - this.BrowfrontL.setRotationPoint(2.3F, 0.7F, -4.7F); - this.BrowfrontL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(BrowfrontL, 0.091106186954104F, 0.36425021489121656F, -0.18203784098300857F); - this.Wingupperarmright = new ModelRenderer(this, 390, 230); - this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); - this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); - this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); - this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Headlargehornupperright = new ModelRenderer(this, 190, 470); - this.Headlargehornupperright.setRotationPoint(-0.1F, 0.0F, 4.5F); - this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornupperright, 0.18203784098300857F, -0.136659280431156F, 0.0F); - this.Headback = new ModelRenderer(this, 120, 390); - this.Headback.setRotationPoint(-0.01F, -0.8F, -9.0F); - this.Headback.addBox(-3.5F, 0.0F, -11.0F, 7, 6, 11, 0.0F); - this.setRotateAngle(Headback, 0.27314402793711257F, 0.0F, 0.0F); - this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); - this.Headlargehornupperleft.setRotationPoint(0.1F, 0.0F, 4.5F); - this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); - this.setRotateAngle(Headlargehornupperleft, 0.18203784098300857F, 0.136659280431156F, 0.0F); - this.Lheadhorncrown2 = new ModelRenderer(this, 205, 420); - this.Lheadhorncrown2.setRotationPoint(0.0F, 0.0F, 3.0F); - this.Lheadhorncrown2.addBox(0.0F, 0.0F, 0.0F, 2, 1, 2, 0.0F); - this.setRotateAngle(Lheadhorncrown2, 0.0F, 0.7285004297824331F, 0.0F); - this.Spike1 = new ModelRenderer(this, 230, 500); - this.Spike1.setRotationPoint(0.0F, 0.0F, 1.0F); - this.Spike1.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike1, 0.8196066167365371F, 0.0F, 0.0F); - this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); - this.Headlargehornlowerright.setRotationPoint(0.0F, 0.0F, -5.0F); - this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 5, 0.0F); - this.setRotateAngle(Headlargehornlowerright, 0.5462880558742251F, -0.091106186954104F, -0.36425021489121656F); - this.Spike10 = new ModelRenderer(this, 230, 500); - this.Spike10.setRotationPoint(0.0F, 0.0F, 3.0F); - this.Spike10.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike10, 0.36425021489121656F, 0.0F, 0.0F); - this.Tooth3 = new ModelRenderer(this, 180, 500); - this.Tooth3.setRotationPoint(2.7F, 4.0F, -6.1F); - this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); - this.Righttoemid = new ModelRenderer(this, 290, 280); - this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); - this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.Spike12 = new ModelRenderer(this, 230, 490); - this.Spike12.setRotationPoint(0.0F, 0.0F, 3.0F); - this.Spike12.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); - this.setRotateAngle(Spike12, 0.36425021489121656F, 0.0F, 0.0F); - this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); - this.Thumbtoelowerright.mirror = true; - this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); - this.Clawrighthandmid = new ModelRenderer(this, 200, 260); - this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Body = new ModelRenderer(this, 5, 470); - this.Body.setRotationPoint(0.0F, -4.0F, -23.0F); - this.Body.addBox(-9.0F, 0.0F, 0.0F, 18, 18, 23, 0.0F); - this.setRotateAngle(Body, 0.5009094953223726F, 0.0F, 0.0F); - this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); - this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); - this.Tooth9 = new ModelRenderer(this, 180, 500); - this.Tooth9.setRotationPoint(-2.7F, 4.0F, -6.1F); - this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); - this.Clawrighthandright = new ModelRenderer(this, 200, 260); - this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); - this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); - this.Rheadhorncrown2 = new ModelRenderer(this, 205, 420); - this.Rheadhorncrown2.setRotationPoint(0.0F, 0.0F, 3.0F); - this.Rheadhorncrown2.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 2, 0.0F); - this.setRotateAngle(Rheadhorncrown2, 0.0F, -0.7285004297824331F, 0.0F); - this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); - this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); - this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); - this.Neckend = new ModelRenderer(this, 120, 420); - this.Neckend.setRotationPoint(0.0F, 0.5F, -8.0F); - this.Neckend.addBox(-3.5F, 0.0F, -9.0F, 7, 9, 9, 0.0F); - this.setRotateAngle(Neckend, 0.18203784098300857F, 0.0F, 0.0F); - this.Tooth10 = new ModelRenderer(this, 180, 500); - this.Tooth10.setRotationPoint(-2.8F, 3.9F, -8.4F); - this.Tooth10.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth10, 0.0F, 0.0F, 0.22759093446006054F); - this.Lefttoelowerright = new ModelRenderer(this, 290, 270); - this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); - this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Rheadhorncrown1_1 = new ModelRenderer(this, 190, 420); - this.Rheadhorncrown1_1.setRotationPoint(-0.4F, 0.0F, 2.51F); - this.Rheadhorncrown1_1.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(Rheadhorncrown1_1, -0.091106186954104F, -0.6373942428283291F, -0.091106186954104F); - this.Wingshoulderright = new ModelRenderer(this, 470, 230); - this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 4.0F); - this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); - this.Shoulderleft = new ModelRenderer(this, 220, 300); - this.Shoulderleft.mirror = true; - this.Shoulderleft.setRotationPoint(8.0F, 11.0F, 9.0F); - this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); - this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); - this.Wingshoulderleft = new ModelRenderer(this, 470, 230); - this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 4.0F); - this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); - this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); - this.Neckbase = new ModelRenderer(this, 120, 470); - this.Neckbase.setRotationPoint(0.0F, 2.0F, 7.0F); - this.Neckbase.addBox(-6.0F, 0.0F, -13.0F, 12, 14, 13, 0.0F); - this.setRotateAngle(Neckbase, -0.136659280431156F, 0.0F, 0.0F); - this.Tail4 = new ModelRenderer(this, 5, 300); - this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); - this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); - this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); - this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); - this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.RTailSpike = new ModelRenderer(this, 350, 300); - this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); - this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); - this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); - this.Lheadhorncrown1_1 = new ModelRenderer(this, 190, 420); - this.Lheadhorncrown1_1.setRotationPoint(0.4F, 0.0F, 2.51F); - this.Lheadhorncrown1_1.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(Lheadhorncrown1_1, 0.091106186954104F, 0.6373942428283291F, 0.18203784098300857F); - this.Tooth15 = new ModelRenderer(this, 180, 500); - this.Tooth15.setRotationPoint(-2.5F, 0.6F, -1.3F); - this.Tooth15.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth15, 0.0F, 0.0F, -0.22759093446006054F); - this.Spike2 = new ModelRenderer(this, 230, 475); - this.Spike2.setRotationPoint(0.0F, 0.0F, 8.0F); - this.Spike2.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 7, 0.0F); - this.setRotateAngle(Spike2, 0.9560913642424937F, 0.0F, 0.0F); - this.Spike3 = new ModelRenderer(this, 230, 460); - this.Spike3.setRotationPoint(0.0F, 0.0F, 16.0F); - this.Spike3.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 8, 0.0F); - this.setRotateAngle(Spike3, 0.9560913642424937F, 0.0F, 0.0F); - this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); - this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); - this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); - this.Wingfinger2left = new ModelRenderer(this, 330, 150); - this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); - this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); - this.Belly1 = new ModelRenderer(this, 0, 180); - this.Belly1.setRotationPoint(0.0F, 18.0F, 0.0F); - this.Belly1.addBox(-7.5F, -11.0F, 0.0F, 15, 11, 21, 0.0F); - this.setRotateAngle(Belly1, -0.27314402793711257F, 0.0F, 0.0F); - this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerleft.setRotationPoint(1.8F, 0.5F, -8.0F); - this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); - this.setRotateAngle(Headmidhornlowerleft, 0.091106186954104F, 0.5462880558742251F, -0.31869712141416456F); - this.shape151 = new ModelRenderer(this, 120, 320); - this.shape151.setRotationPoint(0.0F, 6.0F, -3.0F); - this.shape151.addBox(-2.5F, 0.0F, -5.0F, 5, 3, 6, 0.0F); - this.Clawlefthandmid = new ModelRenderer(this, 200, 260); - this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); - this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Underlowerjaw3 = new ModelRenderer(this, 160, 325); - this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Underlowerjaw3.addBox(-2.0F, -3.0F, 0.0F, 4, 3, 6, 0.0F); - this.setRotateAngle(Underlowerjaw3, 0.31869712141416456F, 0.0F, 0.0F); - this.Wingmembramemidright = new ModelRenderer(this, 350, 340); - this.Wingmembramemidright.mirror = true; - this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); - this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); - this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); - this.Neckmid = new ModelRenderer(this, 120, 445); - this.Neckmid.setRotationPoint(0.0F, 2.6F, -7.0F); - this.Neckmid.addBox(-4.5F, 0.0F, -10.0F, 9, 11, 10, 0.0F); - this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); - this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); - this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); - this.Rheadhorncrown3 = new ModelRenderer(this, 220, 420); - this.Rheadhorncrown3.setRotationPoint(0.0F, 0.0F, 2.0F); - this.Rheadhorncrown3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); - this.setRotateAngle(Rheadhorncrown3, 0.0F, -0.8196066167365371F, 0.0F); - this.Belly2 = new ModelRenderer(this, 5, 145); - this.Belly2.setRotationPoint(0.0F, 0.0F, 21.0F); - this.Belly2.addBox(-5.5F, -9.0F, 0.0F, 11, 9, 20, 0.0F); - this.setRotateAngle(Belly2, 0.18203784098300857F, 0.0F, 0.0F); - this.Tooth17 = new ModelRenderer(this, 180, 500); - this.Tooth17.setRotationPoint(-2.5F, 0.6F, -7.5F); - this.Tooth17.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth17, 0.0F, 0.0F, -0.22759093446006054F); - this.Spike11 = new ModelRenderer(this, 230, 490); - this.Spike11.setRotationPoint(0.0F, 0.0F, 11.0F); - this.Spike11.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); - this.setRotateAngle(Spike11, 0.36425021489121656F, 0.0F, 0.0F); - this.Underlowerjaw2 = new ModelRenderer(this, 160, 340); - this.Underlowerjaw2.setRotationPoint(0.0F, 4.0F, -3.0F); - this.Underlowerjaw2.addBox(-2.0F, -1.0F, -4.0F, 4, 1, 4, 0.0F); - this.setRotateAngle(Underlowerjaw2, -0.22759093446006054F, 0.0F, 0.0F); - this.Tooth12 = new ModelRenderer(this, 180, 500); - this.Tooth12.setRotationPoint(2.5F, 0.4F, -4.5F); - this.Tooth12.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth12, 0.0F, 0.0F, 0.22759093446006054F); - this.Outertoelowerright = new ModelRenderer(this, 320, 280); - this.Outertoelowerright.mirror = true; - this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); - this.LHeadhornlargeback = new ModelRenderer(this, 190, 370); - this.LHeadhornlargeback.setRotationPoint(-0.01F, 0.0F, 0.0F); - this.LHeadhornlargeback.addBox(0.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(LHeadhornlargeback, -0.7285004297824331F, 0.0F, 0.0F); - this.Righthip = new ModelRenderer(this, 260, 300); - this.Righthip.setRotationPoint(-7.0F, 5.0F, 14.0F); - this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Righthip, -0.27314402793711257F, 0.27314402793711257F, 0.18203784098300857F); - this.Lheadhorncrown2_1 = new ModelRenderer(this, 205, 400); - this.Lheadhorncrown2_1.setRotationPoint(0.0F, 0.01F, 4.0F); - this.Lheadhorncrown2_1.addBox(0.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); - this.setRotateAngle(Lheadhorncrown2_1, 0.0F, 0.9105382707654417F, 0.0F); - this.Winglowerarmleft = new ModelRenderer(this, 400, 215); - this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); - this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); - this.Righttoeleft = new ModelRenderer(this, 290, 280); - this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); - this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); - this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); - this.Smallheadhornright3.setRotationPoint(-2.0F, -2.4F, -1.5F); - this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); - this.setRotateAngle(Smallheadhornright3, -0.6373942428283291F, -0.4553564018453205F, 0.0F); - this.Lheadhorncrown1 = new ModelRenderer(this, 190, 400); - this.Lheadhorncrown1.setRotationPoint(2.0F, 0.0F, 1.0F); - this.Lheadhorncrown1.addBox(0.0F, 0.0F, 0.0F, 2, 2, 4, 0.0F); - this.setRotateAngle(Lheadhorncrown1, -0.40980330836826856F, 0.31869712141416456F, -0.40980330836826856F); - this.Lefttoelowermid = new ModelRenderer(this, 290, 270); - this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); - this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Tooth18 = new ModelRenderer(this, 180, 500); - this.Tooth18.setRotationPoint(-2.5F, 0.6F, -10.0F); - this.Tooth18.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth18, 0.22759093446006054F, 0.0F, -0.22759093446006054F); - this.Snout = new ModelRenderer(this, 120, 365); - this.Snout.setRotationPoint(0.0F, 0.61F, -9.0F); - this.Snout.addBox(-3.0F, 0.0F, -10.0F, 6, 5, 10, 0.0F); - this.setRotateAngle(Snout, -0.045553093477052F, 0.0F, 0.015533430342749534F); - this.Tooth5 = new ModelRenderer(this, 180, 500); - this.Tooth5.setRotationPoint(0.4F, 4.3F, -8.9F); - this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); - this.Tooth6 = new ModelRenderer(this, 180, 500); - this.Tooth6.setRotationPoint(-0.4F, 4.3F, -8.9F); - this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); - this.Lowerjaw = new ModelRenderer(this, 120, 345); - this.Lowerjaw.setRotationPoint(0.0F, -0.05F, -6.7F); - this.Lowerjaw.addBox(-2.5F, 0.0F, -10.0F, 5, 2, 10, 0.0F); - this.setRotateAngle(Lowerjaw, 0.045553093477052F, 0.0F, 0.0F); - this.Winglowerarmright = new ModelRenderer(this, 400, 215); - this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); - this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); - this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); - this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); - this.Lowerarmleft_1.setRotationPoint(-2.01F, 8.5F, 0.0F); - this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, -0.136659280431156F, -0.136659280431156F); - this.Lefttoeright = new ModelRenderer(this, 290, 280); - this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); - this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); - this.Clawlefthandleft = new ModelRenderer(this, 200, 260); - this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); - this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); - this.LTailMembrane = new ModelRenderer(this, 380, 250); - this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); - this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); - this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); - this.Righttoelowerright = new ModelRenderer(this, 290, 270); - this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); - this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); - this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); - this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); - this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); - this.Headmidhornlowerright.setRotationPoint(-1.8F, 0.5F, -8.0F); - this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); - this.setRotateAngle(Headmidhornlowerright, 0.091106186954104F, -0.5462880558742251F, 0.31869712141416456F); - this.Wingfinger3right = new ModelRenderer(this, 390, 170); - this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); - this.Lheadhorncrown3_1 = new ModelRenderer(this, 220, 400); - this.Lheadhorncrown3_1.setRotationPoint(0.0F, 0.5F, 3.0F); - this.Lheadhorncrown3_1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Lheadhorncrown3_1, 0.22759093446006054F, 1.0471975511965976F, 0.0F); - this.Rhorncrownlower3 = new ModelRenderer(this, 220, 400); - this.Rhorncrownlower3.setRotationPoint(0.0F, 0.5F, 3.0F); - this.Rhorncrownlower3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); - this.setRotateAngle(Rhorncrownlower3, 0.22759093446006054F, -1.0471975511965976F, 0.0F); - this.RHeadhornlargeback = new ModelRenderer(this, 190, 370); - this.RHeadhornlargeback.setRotationPoint(0.01F, 0.0F, 0.0F); - this.RHeadhornlargeback.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); - this.setRotateAngle(RHeadhornlargeback, -0.7285004297824331F, 0.0F, 0.0F); - this.Underlowerjaw = new ModelRenderer(this, 160, 350); - this.Underlowerjaw.setRotationPoint(0.0F, 3.0F, -7.0F); - this.Underlowerjaw.addBox(-1.5F, -1.0F, -8.0F, 3, 1, 8, 0.0F); - this.setRotateAngle(Underlowerjaw, -0.091106186954104F, 0.0F, 0.0F); - this.Rightleg = new ModelRenderer(this, 260, 275); - this.Rightleg.mirror = true; - this.Rightleg.setRotationPoint(0.0F, 14.6F, 0.0F); - this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); - this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.045553093477052F, 0.091106186954104F); - this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornright2.setRotationPoint(-3.2F, 5.0F, -3.0F); - this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); - this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); - this.Spike5 = new ModelRenderer(this, 230, 500); - this.Spike5.setRotationPoint(0.0F, 0.0F, 7.7F); - this.Spike5.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike5, 0.9105382707654417F, 0.0F, 0.0F); - this.Lowerjawback = new ModelRenderer(this, 120, 330); - this.Lowerjawback.setRotationPoint(0.0F, 0.5F, 1.0F); - this.Lowerjawback.addBox(-3.0F, 0.0F, -7.0F, 6, 3, 7, 0.0F); - this.setRotateAngle(Lowerjawback, -0.091106186954104F, 0.0F, 0.0F); - this.Tooth14 = new ModelRenderer(this, 180, 500); - this.Tooth14.setRotationPoint(2.5F, 0.5F, -10.0F); - this.Tooth14.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth14, 0.22759093446006054F, 0.0F, 0.22759093446006054F); - this.RightFoot = new ModelRenderer(this, 260, 255); - this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); - this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Lheadhorncrown3 = new ModelRenderer(this, 220, 420); - this.Lheadhorncrown3.setRotationPoint(0.0F, 0.0F, 2.0F); - this.Lheadhorncrown3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); - this.setRotateAngle(Lheadhorncrown3, 0.0F, 0.8196066167365371F, 0.0F); - this.Spike9 = new ModelRenderer(this, 230, 500); - this.Spike9.setRotationPoint(0.0F, 0.0F, 13.5F); - this.Spike9.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike9, 0.40980330836826856F, 0.0F, 0.0F); - this.Tail3 = new ModelRenderer(this, 5, 335); - this.Tail3.setRotationPoint(0.0F, 0.5F, 24.0F); - this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); - this.setRotateAngle(Tail3, -0.091106186954104F, 0.0F, 0.0F); - this.Spike13 = new ModelRenderer(this, 230, 490); - this.Spike13.setRotationPoint(0.0F, 0.0F, 11.0F); - this.Spike13.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); - this.setRotateAngle(Spike13, 0.36425021489121656F, 0.0F, 0.0F); - this.RBrowback = new ModelRenderer(this, 190, 380); - this.RBrowback.setRotationPoint(0.0F, 0.0F, 5.0F); - this.RBrowback.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(RBrowback, 0.0F, 0.4553564018453205F, 0.0F); - this.Tail6 = new ModelRenderer(this, 5, 275); - this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); - this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); - this.setRotateAngle(Tail6, 0.136659280431156F, 0.0F, 0.0F); - this.Tooth4 = new ModelRenderer(this, 180, 500); - this.Tooth4.setRotationPoint(2.8F, 3.9F, -8.4F); - this.Tooth4.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth4, 0.0F, 0.0F, -0.31869712141416456F); - this.Spike15 = new ModelRenderer(this, 230, 490); - this.Spike15.setRotationPoint(0.0F, 0.0F, 12.0F); - this.Spike15.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); - this.setRotateAngle(Spike15, 0.36425021489121656F, 0.0F, 0.0F); - this.Righttoelowermid = new ModelRenderer(this, 290, 270); - this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); - this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); - this.Tooth16 = new ModelRenderer(this, 180, 500); - this.Tooth16.setRotationPoint(-2.5F, 0.4F, -4.5F); - this.Tooth16.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth16, 0.0F, 0.0F, -0.22759093446006054F); - this.Tail7 = new ModelRenderer(this, 5, 240); - this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); - this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); - this.setRotateAngle(Tail7, 0.136659280431156F, 0.0F, 0.0F); - this.BrowfrontR = new ModelRenderer(this, 190, 390); - this.BrowfrontR.setRotationPoint(-2.3F, 0.7F, -4.7F); - this.BrowfrontR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); - this.setRotateAngle(BrowfrontR, 0.091106186954104F, -0.36425021489121656F, 0.18203784098300857F); - this.Clawrighthandleft = new ModelRenderer(this, 200, 260); - this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); - this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); - this.Wingmembramesmallright = new ModelRenderer(this, 420, 255); - this.Wingmembramesmallright.mirror = true; - this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); - this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); - this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); - this.Tooth1 = new ModelRenderer(this, 180, 500); - this.Tooth1.setRotationPoint(2.8F, 4.0F, -3.2F); - this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); - this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); - this.Thumbtoeupperright.mirror = true; - this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); - this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); - this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); - this.Rightfoot = new ModelRenderer(this, 260, 255); - this.Rightfoot.mirror = true; - this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); - this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); - this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); - this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); - this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); - this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); - this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); - this.BrowbackL = new ModelRenderer(this, 190, 380); - this.BrowbackL.setRotationPoint(0.0F, 0.0F, 5.0F); - this.BrowbackL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(BrowbackL, 0.0F, -0.4553564018453205F, 0.0F); - this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); - this.Headmidhornupperleft.setRotationPoint(0.0F, 0.1F, 2.7F); - this.Headmidhornupperleft.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); - this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, 0.091106186954104F, 0.0F); - this.Tail1 = new ModelRenderer(this, 5, 425); - this.Tail1.setRotationPoint(0.0F, 0.0F, 23.0F); - this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); - this.setRotateAngle(Tail1, -0.5462880558742251F, 0.0F, 0.0F); - this.Rhorncrownlower2 = new ModelRenderer(this, 205, 400); - this.Rhorncrownlower2.setRotationPoint(0.0F, 0.01F, 4.0F); - this.Rhorncrownlower2.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); - this.setRotateAngle(Rhorncrownlower2, 0.0F, -0.9105382707654417F, 0.0F); - this.Righttoelowerleft = new ModelRenderer(this, 290, 270); - this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); - this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); - this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); - this.Outertoeleft = new ModelRenderer(this, 305, 280); - this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); - this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); - this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.31869712141416456F, 0.40980330836826856F); - this.Righthandmidfinger = new ModelRenderer(this, 220, 260); - this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); - this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); - this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); - this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); - this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); - this.Lowerarmleft = new ModelRenderer(this, 220, 275); - this.Lowerarmleft.mirror = true; - this.Lowerarmleft.setRotationPoint(2.01F, 8.5F, 0.0F); - this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); - this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.136659280431156F, 0.136659280431156F); - this.Spike14 = new ModelRenderer(this, 230, 490); - this.Spike14.setRotationPoint(0.0F, 0.0F, 5.0F); - this.Spike14.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); - this.setRotateAngle(Spike14, 0.36425021489121656F, 0.0F, 0.0F); - this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); - this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); - this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); - this.Lefthip = new ModelRenderer(this, 260, 300); - this.Lefthip.mirror = true; - this.Lefthip.setRotationPoint(7.0F, 5.0F, 14.0F); - this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); - this.setRotateAngle(Lefthip, -0.27314402793711257F, -0.27314402793711257F, -0.18203784098300857F); - this.Tail8 = new ModelRenderer(this, 5, 220); - this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); - this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); - this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); - this.Spike8 = new ModelRenderer(this, 230, 500); - this.Spike8.setRotationPoint(0.0F, 0.0F, 5.5F); - this.Spike8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike8, 0.40980330836826856F, 0.0F, 0.0F); - this.Lefttoemid = new ModelRenderer(this, 290, 280); - this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); - this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); - this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); - this.Righthandleftfinger = new ModelRenderer(this, 220, 260); - this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); - this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); - this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); - this.Smallheadhornleft2.setRotationPoint(3.2F, 5.0F, -4.0F); - this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); - this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); - this.Righthandrightfinger = new ModelRenderer(this, 220, 260); - this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); - this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); - this.Spike6 = new ModelRenderer(this, 230, 500); - this.Spike6.setRotationPoint(0.0F, 0.0F, 15.7F); - this.Spike6.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); - this.setRotateAngle(Spike6, 0.8196066167365371F, 0.0F, 0.0F); - this.Tooth11 = new ModelRenderer(this, 180, 500); - this.Tooth11.setRotationPoint(2.5F, 0.6F, -1.3F); - this.Tooth11.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth11, 0.0F, 0.0F, 0.22759093446006054F); - this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); - this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); - this.Spike4 = new ModelRenderer(this, 230, 450); - this.Spike4.setRotationPoint(0.0F, 0.0F, 1.0F); - this.Spike4.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 5, 0.0F); - this.setRotateAngle(Spike4, 1.1838568316277536F, 0.0F, 0.0F); - this.Wingupperarmleft = new ModelRenderer(this, 390, 230); - this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); - this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); - this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); - this.Tooth7 = new ModelRenderer(this, 180, 500); - this.Tooth7.setRotationPoint(-2.8F, 4.0F, -3.2F); - this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); - this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); - this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); - this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); - this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); - this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); - this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); - this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); - this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); - this.Wingfinger3left = new ModelRenderer(this, 390, 170); - this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); - this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); - this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); - this.Tooth13 = new ModelRenderer(this, 180, 500); - this.Tooth13.setRotationPoint(2.5F, 0.6F, -7.5F); - this.Tooth13.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); - this.setRotateAngle(Tooth13, 0.0F, 0.0F, 0.22759093446006054F); - this.Wingfinger1right = new ModelRenderer(this, 350, 200); - this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); - this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); - this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); - this.Wingfinger2right = new ModelRenderer(this, 330, 150); - this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); - this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); - this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); - this.Wingmembramelargeright = new ModelRenderer(this, 270, 365); - this.Wingmembramelargeright.mirror = true; - this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); - this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); - this.Lowerarmleft.addChild(this.Thumbtoeupperleft); - this.Outertoeleft.addChild(this.Outertoelowerleft); - this.Tail1.addChild(this.Spike7); - this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); - this.Outertoelowerright.addChild(this.Outertoelowerright_1); - this.Lowerjawback.addChild(this.Smallheadhornleft3); - this.Tail8.addChild(this.LTailSpike); - this.Lefthandrightfinger.addChild(this.Clawlefthandright); - this.Headback.addChild(this.Headlargehornlowerleft); - this.Rightfoot.addChild(this.Lefttoeleft); - this.Righthip.addChild(this.RightLeg); - this.RightFoot.addChild(this.Righttoeright); - this.Headmidhornlowerright.addChild(this.Headmidhornupperright); - this.Winglowerarmleft.addChild(this.Wingfinger1left); - this.Headlargehornlowerright.addChild(this.Rheadhorncrown1); - this.Body.addChild(this.Shoulderleft_1); - this.RTailSpike.addChild(this.RTailMembrane); - this.Snout.addChild(this.BrowfrontL); - this.Wingshoulderright.addChild(this.Wingupperarmright); - this.Wingfinger1left.addChild(this.Wingmembramelargeleft); - this.Headlargehornlowerright.addChild(this.Headlargehornupperright); - this.Neckend.addChild(this.Headback); - this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); - this.Lheadhorncrown1_1.addChild(this.Lheadhorncrown2); - this.Body.addChild(this.Spike1); - this.Headback.addChild(this.Headlargehornlowerright); - this.Tail4.addChild(this.Spike10); - this.Snout.addChild(this.Tooth3); - this.RightFoot.addChild(this.Righttoemid); - this.Tail6.addChild(this.Spike12); - this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); - this.Righthandmidfinger.addChild(this.Clawrighthandmid); - this.Wingfinger2left.addChild(this.Wingfingerlower2left); - this.Snout.addChild(this.Tooth9); - this.Righthandrightfinger.addChild(this.Clawrighthandright); - this.Rheadhorncrown1_1.addChild(this.Rheadhorncrown2); - this.Winglowerarmleft.addChild(this.Wingmembramemidleft); - this.Neckmid.addChild(this.Neckend); - this.Snout.addChild(this.Tooth10); - this.Lefttoeright.addChild(this.Lefttoelowerright); - this.Headlargehornupperright.addChild(this.Rheadhorncrown1_1); - this.Body.addChild(this.Wingshoulderright); - this.Body.addChild(this.Shoulderleft); - this.Body.addChild(this.Wingshoulderleft); - this.Body.addChild(this.Neckbase); - this.Tail3.addChild(this.Tail4); - this.Lefttoeleft.addChild(this.Lefttoelowerleft); - this.Tail8.addChild(this.RTailSpike); - this.Headlargehornupperleft.addChild(this.Lheadhorncrown1_1); - this.Lowerjaw.addChild(this.Tooth15); - this.Body.addChild(this.Spike2); - this.Body.addChild(this.Spike3); - this.Lowerarmleft.addChild(this.Lefthandmidfinger); - this.Wingfinger1left.addChild(this.Wingfinger2left); - this.Body.addChild(this.Belly1); - this.Headback.addChild(this.Headmidhornlowerleft); - this.Headback.addChild(this.shape151); - this.Lefthandmidfinger.addChild(this.Clawlefthandmid); - this.Underlowerjaw2.addChild(this.Underlowerjaw3); - this.Winglowerarmright.addChild(this.Wingmembramemidright); - this.Neckbase.addChild(this.Neckmid); - this.Wingfinger2right.addChild(this.Wingfingerlower2right); - this.Rheadhorncrown2.addChild(this.Rheadhorncrown3); - this.Belly1.addChild(this.Belly2); - this.Lowerjaw.addChild(this.Tooth17); - this.Tail4.addChild(this.Spike11); - this.Lowerjawback.addChild(this.Underlowerjaw2); - this.Lowerjaw.addChild(this.Tooth12); - this.RightFoot.addChild(this.Outertoelowerright); - this.Headlargehornupperleft.addChild(this.LHeadhornlargeback); - this.Tail1.addChild(this.Righthip); - this.Lheadhorncrown1.addChild(this.Lheadhorncrown2_1); - this.Wingupperarmleft.addChild(this.Winglowerarmleft); - this.RightFoot.addChild(this.Righttoeleft); - this.Lowerjawback.addChild(this.Smallheadhornright3); - this.Headlargehornlowerleft.addChild(this.Lheadhorncrown1); - this.Lefttoemid.addChild(this.Lefttoelowermid); - this.Lowerjaw.addChild(this.Tooth18); - this.Headback.addChild(this.Snout); - this.Snout.addChild(this.Tooth5); - this.Snout.addChild(this.Tooth6); - this.Lowerjawback.addChild(this.Lowerjaw); - this.Wingupperarmright.addChild(this.Winglowerarmright); - this.Shoulderleft_1.addChild(this.Lowerarmleft_1); - this.Rightfoot.addChild(this.Lefttoeright); - this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); - this.LTailSpike.addChild(this.LTailMembrane); - this.Righttoeright.addChild(this.Righttoelowerright); - this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); - this.Headback.addChild(this.Headmidhornlowerright); - this.Wingfinger1right.addChild(this.Wingfinger3right); - this.Lheadhorncrown2_1.addChild(this.Lheadhorncrown3_1); - this.Rhorncrownlower2.addChild(this.Rhorncrownlower3); - this.Headlargehornupperright.addChild(this.RHeadhornlargeback); - this.Lowerjawback.addChild(this.Underlowerjaw); - this.Lefthip.addChild(this.Rightleg); - this.Headback.addChild(this.Smallheadhornright2); - this.Tail1.addChild(this.Spike5); - this.shape151.addChild(this.Lowerjawback); - this.Lowerjaw.addChild(this.Tooth14); - this.RightLeg.addChild(this.RightFoot); - this.Lheadhorncrown2.addChild(this.Lheadhorncrown3); - this.Tail3.addChild(this.Spike9); - this.Tail1.addChild(this.Tail3); - this.Tail6.addChild(this.Spike13); - this.BrowfrontR.addChild(this.RBrowback); - this.Tail4.addChild(this.Tail6); - this.Snout.addChild(this.Tooth4); - this.Tail7.addChild(this.Spike15); - this.Righttoemid.addChild(this.Righttoelowermid); - this.Lowerjaw.addChild(this.Tooth16); - this.Tail6.addChild(this.Tail7); - this.Snout.addChild(this.BrowfrontR); - this.Righthandleftfinger.addChild(this.Clawrighthandleft); - this.Wingupperarmright.addChild(this.Wingmembramesmallright); - this.Snout.addChild(this.Tooth1); - this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); - this.Rightleg.addChild(this.Rightfoot); - this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); - this.BrowfrontL.addChild(this.BrowbackL); - this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); - this.Body.addChild(this.Tail1); - this.Rheadhorncrown1.addChild(this.Rhorncrownlower2); - this.Righttoeleft.addChild(this.Righttoelowerleft); - this.Rightfoot.addChild(this.Outertoeleft); - this.Lowerarmleft_1.addChild(this.Righthandmidfinger); - this.Wingfinger3left.addChild(this.Wingfingerlower3left); - this.Shoulderleft.addChild(this.Lowerarmleft); - this.Tail7.addChild(this.Spike14); - this.Wingfinger3right.addChild(this.Wingfingerlower3right); - this.Tail1.addChild(this.Lefthip); - this.Tail7.addChild(this.Tail8); - this.Tail3.addChild(this.Spike8); - this.Rightfoot.addChild(this.Lefttoemid); - this.Lowerarmleft_1.addChild(this.Righthandleftfinger); - this.Headback.addChild(this.Smallheadhornleft2); - this.Lowerarmleft_1.addChild(this.Righthandrightfinger); - this.Tail1.addChild(this.Spike6); - this.Lowerjaw.addChild(this.Tooth11); - this.Wingfinger1left.addChild(this.Wingfingerlower1left); - this.Tail1.addChild(this.Spike4); - this.Wingshoulderleft.addChild(this.Wingupperarmleft); - this.Snout.addChild(this.Tooth7); - this.Lowerarmleft.addChild(this.Lefthandrightfinger); - this.Wingfinger1right.addChild(this.Wingfingerlower1right); - this.Wingfinger1left.addChild(this.Wingfinger3left); - this.Lowerjaw.addChild(this.Tooth13); - this.Winglowerarmright.addChild(this.Wingfinger1right); - this.Wingfinger1right.addChild(this.Wingfinger2right); - this.Wingfinger1right.addChild(this.Wingmembramelargeright); + public ModelVenomDragon() { + this.textureWidth = 512; + this.textureHeight = 512; + this.Thumbtoeupperleft = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperleft.setRotationPoint(-5.0F, 8.0F, 2.7F); + this.Thumbtoeupperleft.addBox(0.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperleft, 0.091106186954104F, 0.4553564018453205F, 0.5009094953223726F); + this.Outertoelowerleft = new ModelRenderer(this, 305, 270); + this.Outertoelowerleft.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerleft.addBox(0.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerleft, 0.0F, 0.0F, 0.36425021489121656F); + this.Spike7 = new ModelRenderer(this, 230, 500); + this.Spike7.setRotationPoint(0.0F, 0.0F, 22.1F); + this.Spike7.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike7, 0.5918411493512771F, 0.0F, 0.0F); + this.Wingmembramesmallleft = new ModelRenderer(this, 420, 255); + this.Wingmembramesmallleft.setRotationPoint(20.0F, -0.7F, -1.0F); + this.Wingmembramesmallleft.addBox(0.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallleft, 0.0F, -1.392423677241076F, 0.0F); + this.Outertoelowerright_1 = new ModelRenderer(this, 315, 270); + this.Outertoelowerright_1.mirror = true; + this.Outertoelowerright_1.setRotationPoint(-0.01F, 5.0F, 0.0F); + this.Outertoelowerright_1.addBox(-2.0F, 0.0F, -1.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Outertoelowerright_1, 0.0F, 0.0F, -0.36425021489121656F); + this.Smallheadhornleft3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornleft3.setRotationPoint(2.0F, -2.4F, -2.5F); + this.Smallheadhornleft3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(Smallheadhornleft3, -0.6373942428283291F, 0.4553564018453205F, 0.0F); + this.LTailSpike = new ModelRenderer(this, 350, 300); + this.LTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.LTailSpike.addBox(0.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(LTailSpike, 0.0F, -0.18203784098300857F, 0.091106186954104F); + this.Clawlefthandright = new ModelRenderer(this, 200, 260); + this.Clawlefthandright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawlefthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandright, -0.091106186954104F, 0.0F, 0.0F); + this.Headlargehornlowerleft = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerleft.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Headlargehornlowerleft.addBox(0.0F, 0.0F, 0.0F, 3, 2, 5, 0.0F); + this.setRotateAngle(Headlargehornlowerleft, 0.5462880558742251F, 0.091106186954104F, 0.36425021489121656F); + this.Lefttoeleft = new ModelRenderer(this, 290, 280); + this.Lefttoeleft.setRotationPoint(4.0F, 7.0F, 0.1F); + this.Lefttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Lefttoeleft, -0.045553093477052F, -0.136659280431156F, -0.31869712141416456F); + this.RightLeg = new ModelRenderer(this, 260, 275); + this.RightLeg.setRotationPoint(0.0F, 14.6F, 0.0F); + this.RightLeg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(RightLeg, 0.7988371986378046F, 0.045553093477052F, -0.091106186954104F); + this.Righttoeright = new ModelRenderer(this, 290, 280); + this.Righttoeright.setRotationPoint(-4.0F, 7.0F, 0.1F); + this.Righttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 3, 0.0F); + this.setRotateAngle(Righttoeright, -0.045553093477052F, 0.136659280431156F, 0.31869712141416456F); + this.Headmidhornupperright = new ModelRenderer(this, 190, 420); + this.Headmidhornupperright.setRotationPoint(0.0F, 0.1F, 2.7F); + this.Headmidhornupperright.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(Headmidhornupperright, 0.136659280431156F, -0.091106186954104F, 0.0F); + this.Wingfinger1left = new ModelRenderer(this, 350, 200); + this.Wingfinger1left.setRotationPoint(23.0F, 2.1F, 3.0F); + this.Wingfinger1left.addBox(0.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1left, 0.0F, -0.9105382707654417F, 0.0F); + this.Rheadhorncrown1 = new ModelRenderer(this, 190, 400); + this.Rheadhorncrown1.setRotationPoint(-2.0F, 0.0F, 1.0F); + this.Rheadhorncrown1.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 4, 0.0F); + this.setRotateAngle(Rheadhorncrown1, -0.40980330836826856F, -0.31869712141416456F, 0.40980330836826856F); + this.Shoulderleft_1 = new ModelRenderer(this, 220, 300); + this.Shoulderleft_1.setRotationPoint(-8.0F, 11.0F, 9.0F); + this.Shoulderleft_1.addBox(-2.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft_1, 0.091106186954104F, 0.091106186954104F, 0.18203784098300857F); + this.RTailMembrane = new ModelRenderer(this, 381, 270); + this.RTailMembrane.setRotationPoint(-1.0F, 0.21F, 0.0F); + this.RTailMembrane.addBox(-5.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(RTailMembrane, -0.091106186954104F, -0.022514747350726852F, -0.022514747350726852F); + this.BrowfrontL = new ModelRenderer(this, 190, 390); + this.BrowfrontL.setRotationPoint(2.3F, 0.7F, -4.7F); + this.BrowfrontL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(BrowfrontL, 0.091106186954104F, 0.36425021489121656F, -0.18203784098300857F); + this.Wingupperarmright = new ModelRenderer(this, 390, 230); + this.Wingupperarmright.setRotationPoint(-3.0F, 3.0F, 1.0F); + this.Wingupperarmright.addBox(-21.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmright, -0.5009094953223726F, 0.5009094953223726F, -0.091106186954104F); + this.Wingmembramelargeleft = new ModelRenderer(this, 270, 365); + this.Wingmembramelargeleft.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeleft.addBox(0.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Headlargehornupperright = new ModelRenderer(this, 190, 470); + this.Headlargehornupperright.setRotationPoint(-0.1F, 0.0F, 4.5F); + this.Headlargehornupperright.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornupperright, 0.18203784098300857F, -0.136659280431156F, 0.0F); + this.Headback = new ModelRenderer(this, 120, 390); + this.Headback.setRotationPoint(-0.01F, -0.8F, -9.0F); + this.Headback.addBox(-3.5F, 0.0F, -11.0F, 7, 6, 11, 0.0F); + this.setRotateAngle(Headback, 0.27314402793711257F, 0.0F, 0.0F); + this.Headlargehornupperleft = new ModelRenderer(this, 190, 470); + this.Headlargehornupperleft.setRotationPoint(0.1F, 0.0F, 4.5F); + this.Headlargehornupperleft.addBox(0.0F, 0.0F, 0.0F, 2, 2, 6, 0.0F); + this.setRotateAngle(Headlargehornupperleft, 0.18203784098300857F, 0.136659280431156F, 0.0F); + this.Lheadhorncrown2 = new ModelRenderer(this, 205, 420); + this.Lheadhorncrown2.setRotationPoint(0.0F, 0.0F, 3.0F); + this.Lheadhorncrown2.addBox(0.0F, 0.0F, 0.0F, 2, 1, 2, 0.0F); + this.setRotateAngle(Lheadhorncrown2, 0.0F, 0.7285004297824331F, 0.0F); + this.Spike1 = new ModelRenderer(this, 230, 500); + this.Spike1.setRotationPoint(0.0F, 0.0F, 1.0F); + this.Spike1.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike1, 0.8196066167365371F, 0.0F, 0.0F); + this.Headlargehornlowerright = new ModelRenderer(this, 190, 500); + this.Headlargehornlowerright.setRotationPoint(0.0F, 0.0F, -5.0F); + this.Headlargehornlowerright.addBox(-3.0F, 0.0F, 0.0F, 3, 2, 5, 0.0F); + this.setRotateAngle(Headlargehornlowerright, 0.5462880558742251F, -0.091106186954104F, -0.36425021489121656F); + this.Spike10 = new ModelRenderer(this, 230, 500); + this.Spike10.setRotationPoint(0.0F, 0.0F, 3.0F); + this.Spike10.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike10, 0.36425021489121656F, 0.0F, 0.0F); + this.Tooth3 = new ModelRenderer(this, 180, 500); + this.Tooth3.setRotationPoint(2.7F, 4.0F, -6.1F); + this.Tooth3.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth3, 0.091106186954104F, 0.091106186954104F, -0.31869712141416456F); + this.Righttoemid = new ModelRenderer(this, 290, 280); + this.Righttoemid.setRotationPoint(-2.5F, 7.0F, -0.1F); + this.Righttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.Spike12 = new ModelRenderer(this, 230, 490); + this.Spike12.setRotationPoint(0.0F, 0.0F, 3.0F); + this.Spike12.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); + this.setRotateAngle(Spike12, 0.36425021489121656F, 0.0F, 0.0F); + this.Thumbtoelowerright = new ModelRenderer(this, 315, 270); + this.Thumbtoelowerright.mirror = true; + this.Thumbtoelowerright.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerright.addBox(-2.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerright, 0.0F, 0.0F, -0.3272492347489368F); + this.Clawrighthandmid = new ModelRenderer(this, 200, 260); + this.Clawrighthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawrighthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Body = new ModelRenderer(this, 5, 470); + this.Body.setRotationPoint(0.0F, -4.0F, -23.0F); + this.Body.addBox(-9.0F, 0.0F, 0.0F, 18, 18, 23, 0.0F); + this.setRotateAngle(Body, 0.5009094953223726F, 0.0F, 0.0F); + this.Wingfingerlower2left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2left.setRotationPoint(2.0F, 0.0F, 39.5F); + this.Wingfingerlower2left.addBox(-31.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2left, 0.0F, 1.4114477660878142F, 0.0F); + this.Tooth9 = new ModelRenderer(this, 180, 500); + this.Tooth9.setRotationPoint(-2.7F, 4.0F, -6.1F); + this.Tooth9.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth9, 0.091106186954104F, -0.091106186954104F, 0.31869712141416456F); + this.Clawrighthandright = new ModelRenderer(this, 200, 260); + this.Clawrighthandright.setRotationPoint(-1.0F, 4.0F, 0.0F); + this.Clawrighthandright.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandright, -0.36425021489121656F, 0.0F, 0.0F); + this.Rheadhorncrown2 = new ModelRenderer(this, 205, 420); + this.Rheadhorncrown2.setRotationPoint(0.0F, 0.0F, 3.0F); + this.Rheadhorncrown2.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 2, 0.0F); + this.setRotateAngle(Rheadhorncrown2, 0.0F, -0.7285004297824331F, 0.0F); + this.Wingmembramemidleft = new ModelRenderer(this, 350, 340); + this.Wingmembramemidleft.setRotationPoint(21.0F, 2.7F, 5.0F); + this.Wingmembramemidleft.addBox(0.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidleft, 0.0F, -109.29251775988492F, 0.0F); + this.Neckend = new ModelRenderer(this, 120, 420); + this.Neckend.setRotationPoint(0.0F, 0.5F, -8.0F); + this.Neckend.addBox(-3.5F, 0.0F, -9.0F, 7, 9, 9, 0.0F); + this.setRotateAngle(Neckend, 0.18203784098300857F, 0.0F, 0.0F); + this.Tooth10 = new ModelRenderer(this, 180, 500); + this.Tooth10.setRotationPoint(-2.8F, 3.9F, -8.4F); + this.Tooth10.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth10, 0.0F, 0.0F, 0.22759093446006054F); + this.Lefttoelowerright = new ModelRenderer(this, 290, 270); + this.Lefttoelowerright.setRotationPoint(-0.01F, 6.0F, 0.0F); + this.Lefttoelowerright.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Rheadhorncrown1_1 = new ModelRenderer(this, 190, 420); + this.Rheadhorncrown1_1.setRotationPoint(-0.4F, 0.0F, 2.51F); + this.Rheadhorncrown1_1.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(Rheadhorncrown1_1, -0.091106186954104F, -0.6373942428283291F, -0.091106186954104F); + this.Wingshoulderright = new ModelRenderer(this, 470, 230); + this.Wingshoulderright.setRotationPoint(-5.0F, 2.0F, 4.0F); + this.Wingshoulderright.addBox(-5.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderright, 0.091106186954104F, -0.091106186954104F, 0.4553564018453205F); + this.Shoulderleft = new ModelRenderer(this, 220, 300); + this.Shoulderleft.mirror = true; + this.Shoulderleft.setRotationPoint(8.0F, 11.0F, 9.0F); + this.Shoulderleft.addBox(-4.0F, 0.0F, -5.0F, 6, 13, 8, 0.0F); + this.setRotateAngle(Shoulderleft, 0.091106186954104F, -0.091106186954104F, -0.18203784098300857F); + this.Wingshoulderleft = new ModelRenderer(this, 470, 230); + this.Wingshoulderleft.setRotationPoint(5.0F, 2.0F, 4.0F); + this.Wingshoulderleft.addBox(0.0F, 0.0F, 0.0F, 5, 7, 8, 0.0F); + this.setRotateAngle(Wingshoulderleft, 0.091106186954104F, 0.091106186954104F, -0.4553564018453205F); + this.Neckbase = new ModelRenderer(this, 120, 470); + this.Neckbase.setRotationPoint(0.0F, 2.0F, 7.0F); + this.Neckbase.addBox(-6.0F, 0.0F, -13.0F, 12, 14, 13, 0.0F); + this.setRotateAngle(Neckbase, -0.136659280431156F, 0.0F, 0.0F); + this.Tail4 = new ModelRenderer(this, 5, 300); + this.Tail4.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail4.addBox(-4.0F, 0.0F, 0.0F, 8, 9, 19, 0.0F); + this.setRotateAngle(Tail4, 0.091106186954104F, 0.0F, 0.0F); + this.Lefttoelowerleft = new ModelRenderer(this, 290, 270); + this.Lefttoelowerleft.setRotationPoint(-0.01F, 4.0F, 0.0F); + this.Lefttoelowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.RTailSpike = new ModelRenderer(this, 350, 300); + this.RTailSpike.setRotationPoint(0.0F, 0.0F, -2.0F); + this.RTailSpike.addBox(-7.0F, 0.0F, 0.0F, 7, 1, 3, 0.0F); + this.setRotateAngle(RTailSpike, 0.0F, 0.18203784098300857F, -0.091106186954104F); + this.Lheadhorncrown1_1 = new ModelRenderer(this, 190, 420); + this.Lheadhorncrown1_1.setRotationPoint(0.4F, 0.0F, 2.51F); + this.Lheadhorncrown1_1.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(Lheadhorncrown1_1, 0.091106186954104F, 0.6373942428283291F, 0.18203784098300857F); + this.Tooth15 = new ModelRenderer(this, 180, 500); + this.Tooth15.setRotationPoint(-2.5F, 0.6F, -1.3F); + this.Tooth15.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth15, 0.0F, 0.0F, -0.22759093446006054F); + this.Spike2 = new ModelRenderer(this, 230, 475); + this.Spike2.setRotationPoint(0.0F, 0.0F, 8.0F); + this.Spike2.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 7, 0.0F); + this.setRotateAngle(Spike2, 0.9560913642424937F, 0.0F, 0.0F); + this.Spike3 = new ModelRenderer(this, 230, 460); + this.Spike3.setRotationPoint(0.0F, 0.0F, 16.0F); + this.Spike3.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 8, 0.0F); + this.setRotateAngle(Spike3, 0.9560913642424937F, 0.0F, 0.0F); + this.Lefthandmidfinger = new ModelRenderer(this, 220, 260); + this.Lefthandmidfinger.setRotationPoint(-2.5F, 12.0F, 0.0F); + this.Lefthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Lefthandmidfinger, -0.5009094953223726F, -0.136659280431156F, 0.091106186954104F); + this.Wingfinger2left = new ModelRenderer(this, 330, 150); + this.Wingfinger2left.setRotationPoint(-2.0F, 0.0F, 0.0F); + this.Wingfinger2left.addBox(0.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2left, 0.0F, 0.9560913642424937F, 0.0F); + this.Belly1 = new ModelRenderer(this, 0, 180); + this.Belly1.setRotationPoint(0.0F, 18.0F, 0.0F); + this.Belly1.addBox(-7.5F, -11.0F, 0.0F, 15, 11, 21, 0.0F); + this.setRotateAngle(Belly1, -0.27314402793711257F, 0.0F, 0.0F); + this.Headmidhornlowerleft = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerleft.setRotationPoint(1.8F, 0.5F, -8.0F); + this.Headmidhornlowerleft.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); + this.setRotateAngle(Headmidhornlowerleft, 0.091106186954104F, 0.5462880558742251F, -0.31869712141416456F); + this.shape151 = new ModelRenderer(this, 120, 320); + this.shape151.setRotationPoint(0.0F, 6.0F, -3.0F); + this.shape151.addBox(-2.5F, 0.0F, -5.0F, 5, 3, 6, 0.0F); + this.Clawlefthandmid = new ModelRenderer(this, 200, 260); + this.Clawlefthandmid.setRotationPoint(0.0F, 5.0F, 0.0F); + this.Clawlefthandmid.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Underlowerjaw3 = new ModelRenderer(this, 160, 325); + this.Underlowerjaw3.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Underlowerjaw3.addBox(-2.0F, -3.0F, 0.0F, 4, 3, 6, 0.0F); + this.setRotateAngle(Underlowerjaw3, 0.31869712141416456F, 0.0F, 0.0F); + this.Wingmembramemidright = new ModelRenderer(this, 350, 340); + this.Wingmembramemidright.mirror = true; + this.Wingmembramemidright.setRotationPoint(-21.0F, 2.7F, 5.0F); + this.Wingmembramemidright.addBox(-49.0F, 0.0F, 0.0F, 49, 0, 15, 0.0F); + this.setRotateAngle(Wingmembramemidright, 0.0F, 109.29251775988492F, 0.0F); + this.Neckmid = new ModelRenderer(this, 120, 445); + this.Neckmid.setRotationPoint(0.0F, 2.6F, -7.0F); + this.Neckmid.addBox(-4.5F, 0.0F, -10.0F, 9, 11, 10, 0.0F); + this.setRotateAngle(Neckmid, -0.22759093446006054F, 0.0F, 0.0F); + this.Wingfingerlower2right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower2right.setRotationPoint(-2.0F, 0.0F, 39.5F); + this.Wingfingerlower2right.addBox(0.0F, 0.0F, -2.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower2right, 0.0F, -1.4114477660878142F, 0.0F); + this.Rheadhorncrown3 = new ModelRenderer(this, 220, 420); + this.Rheadhorncrown3.setRotationPoint(0.0F, 0.0F, 2.0F); + this.Rheadhorncrown3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); + this.setRotateAngle(Rheadhorncrown3, 0.0F, -0.8196066167365371F, 0.0F); + this.Belly2 = new ModelRenderer(this, 5, 145); + this.Belly2.setRotationPoint(0.0F, 0.0F, 21.0F); + this.Belly2.addBox(-5.5F, -9.0F, 0.0F, 11, 9, 20, 0.0F); + this.setRotateAngle(Belly2, 0.18203784098300857F, 0.0F, 0.0F); + this.Tooth17 = new ModelRenderer(this, 180, 500); + this.Tooth17.setRotationPoint(-2.5F, 0.6F, -7.5F); + this.Tooth17.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth17, 0.0F, 0.0F, -0.22759093446006054F); + this.Spike11 = new ModelRenderer(this, 230, 490); + this.Spike11.setRotationPoint(0.0F, 0.0F, 11.0F); + this.Spike11.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); + this.setRotateAngle(Spike11, 0.36425021489121656F, 0.0F, 0.0F); + this.Underlowerjaw2 = new ModelRenderer(this, 160, 340); + this.Underlowerjaw2.setRotationPoint(0.0F, 4.0F, -3.0F); + this.Underlowerjaw2.addBox(-2.0F, -1.0F, -4.0F, 4, 1, 4, 0.0F); + this.setRotateAngle(Underlowerjaw2, -0.22759093446006054F, 0.0F, 0.0F); + this.Tooth12 = new ModelRenderer(this, 180, 500); + this.Tooth12.setRotationPoint(2.5F, 0.4F, -4.5F); + this.Tooth12.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth12, 0.0F, 0.0F, 0.22759093446006054F); + this.Outertoelowerright = new ModelRenderer(this, 320, 280); + this.Outertoelowerright.mirror = true; + this.Outertoelowerright.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoelowerright.addBox(-3.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoelowerright, 0.9560913642424937F, 0.31869712141416456F, -0.40980330836826856F); + this.LHeadhornlargeback = new ModelRenderer(this, 190, 370); + this.LHeadhornlargeback.setRotationPoint(-0.01F, 0.0F, 0.0F); + this.LHeadhornlargeback.addBox(0.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(LHeadhornlargeback, -0.7285004297824331F, 0.0F, 0.0F); + this.Righthip = new ModelRenderer(this, 260, 300); + this.Righthip.setRotationPoint(-7.0F, 5.0F, 14.0F); + this.Righthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Righthip, -0.27314402793711257F, 0.27314402793711257F, 0.18203784098300857F); + this.Lheadhorncrown2_1 = new ModelRenderer(this, 205, 400); + this.Lheadhorncrown2_1.setRotationPoint(0.0F, 0.01F, 4.0F); + this.Lheadhorncrown2_1.addBox(0.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); + this.setRotateAngle(Lheadhorncrown2_1, 0.0F, 0.9105382707654417F, 0.0F); + this.Winglowerarmleft = new ModelRenderer(this, 400, 215); + this.Winglowerarmleft.setRotationPoint(18.4F, -3.9F, 1.0F); + this.Winglowerarmleft.addBox(-2.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmleft, -0.03316125578789226F, 1.0927506446736497F, 0.0F); + this.Righttoeleft = new ModelRenderer(this, 290, 280); + this.Righttoeleft.setRotationPoint(-1.0F, 7.0F, 0.2F); + this.Righttoeleft.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Righttoeleft, -0.136659280431156F, -0.091106186954104F, -0.36425021489121656F); + this.Smallheadhornright3 = new ModelRenderer(this, 190, 410); + this.Smallheadhornright3.setRotationPoint(-2.0F, -2.4F, -1.5F); + this.Smallheadhornright3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 2, 0.0F); + this.setRotateAngle(Smallheadhornright3, -0.6373942428283291F, -0.4553564018453205F, 0.0F); + this.Lheadhorncrown1 = new ModelRenderer(this, 190, 400); + this.Lheadhorncrown1.setRotationPoint(2.0F, 0.0F, 1.0F); + this.Lheadhorncrown1.addBox(0.0F, 0.0F, 0.0F, 2, 2, 4, 0.0F); + this.setRotateAngle(Lheadhorncrown1, -0.40980330836826856F, 0.31869712141416456F, -0.40980330836826856F); + this.Lefttoelowermid = new ModelRenderer(this, 290, 270); + this.Lefttoelowermid.setRotationPoint(-0.01F, 5.2F, 0.2F); + this.Lefttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Lefttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Tooth18 = new ModelRenderer(this, 180, 500); + this.Tooth18.setRotationPoint(-2.5F, 0.6F, -10.0F); + this.Tooth18.addBox(0.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth18, 0.22759093446006054F, 0.0F, -0.22759093446006054F); + this.Snout = new ModelRenderer(this, 120, 365); + this.Snout.setRotationPoint(0.0F, 0.61F, -9.0F); + this.Snout.addBox(-3.0F, 0.0F, -10.0F, 6, 5, 10, 0.0F); + this.setRotateAngle(Snout, -0.045553093477052F, 0.0F, 0.015533430342749534F); + this.Tooth5 = new ModelRenderer(this, 180, 500); + this.Tooth5.setRotationPoint(0.4F, 4.3F, -8.9F); + this.Tooth5.addBox(0.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth5, -0.22759093446006054F, 0.0F, -0.045553093477052F); + this.Tooth6 = new ModelRenderer(this, 180, 500); + this.Tooth6.setRotationPoint(-0.4F, 4.3F, -8.9F); + this.Tooth6.addBox(-1.0F, 0.0F, -1.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth6, -0.22759093446006054F, 0.0F, 0.045553093477052F); + this.Lowerjaw = new ModelRenderer(this, 120, 345); + this.Lowerjaw.setRotationPoint(0.0F, -0.05F, -6.7F); + this.Lowerjaw.addBox(-2.5F, 0.0F, -10.0F, 5, 2, 10, 0.0F); + this.setRotateAngle(Lowerjaw, 0.045553093477052F, 0.0F, 0.0F); + this.Winglowerarmright = new ModelRenderer(this, 400, 215); + this.Winglowerarmright.setRotationPoint(-18.4F, -3.9F, 1.0F); + this.Winglowerarmright.addBox(-24.0F, 2.0F, 0.0F, 26, 3, 4, 0.0F); + this.setRotateAngle(Winglowerarmright, -0.03316125578789226F, -1.0927506446736497F, 0.0F); + this.Lowerarmleft_1 = new ModelRenderer(this, 220, 275); + this.Lowerarmleft_1.setRotationPoint(-2.01F, 8.5F, 0.0F); + this.Lowerarmleft_1.addBox(0.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft_1, -1.0471975511965976F, -0.136659280431156F, -0.136659280431156F); + this.Lefttoeright = new ModelRenderer(this, 290, 280); + this.Lefttoeright.setRotationPoint(1.0F, 7.0F, 0.1F); + this.Lefttoeright.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoeright, -0.136659280431156F, 0.091106186954104F, 0.36425021489121656F); + this.Clawlefthandleft = new ModelRenderer(this, 200, 260); + this.Clawlefthandleft.setRotationPoint(1.0F, 4.0F, 0.0F); + this.Clawlefthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawlefthandleft, -0.36425021489121656F, 0.0F, 0.0F); + this.LTailMembrane = new ModelRenderer(this, 380, 250); + this.LTailMembrane.setRotationPoint(1.0F, 0.21F, 0.0F); + this.LTailMembrane.addBox(0.0F, 0.0F, 0.0F, 5, 1, 15, 0.0F); + this.setRotateAngle(LTailMembrane, -0.091106186954104F, 0.022514747350726852F, -0.022514747350726852F); + this.Righttoelowerright = new ModelRenderer(this, 290, 270); + this.Righttoelowerright.setRotationPoint(0.01F, 4.0F, 0.0F); + this.Righttoelowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerright, -0.31869712141416456F, 0.0F, 0.0F); + this.Lefthandrightfinger_1 = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger_1.setRotationPoint(-2.0F, 12.0F, 0.0F); + this.Lefthandrightfinger_1.addBox(0.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger_1, -0.22759093446006054F, -0.31869712141416456F, -0.22759093446006054F); + this.Headmidhornlowerright = new ModelRenderer(this, 190, 450); + this.Headmidhornlowerright.setRotationPoint(-1.8F, 0.5F, -8.0F); + this.Headmidhornlowerright.addBox(-1.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); + this.setRotateAngle(Headmidhornlowerright, 0.091106186954104F, -0.5462880558742251F, 0.31869712141416456F); + this.Wingfinger3right = new ModelRenderer(this, 390, 170); + this.Wingfinger3right.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3right.addBox(-35.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3right, 0.0F, 1.1383037381507017F, 0.0F); + this.Lheadhorncrown3_1 = new ModelRenderer(this, 220, 400); + this.Lheadhorncrown3_1.setRotationPoint(0.0F, 0.5F, 3.0F); + this.Lheadhorncrown3_1.addBox(0.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Lheadhorncrown3_1, 0.22759093446006054F, 1.0471975511965976F, 0.0F); + this.Rhorncrownlower3 = new ModelRenderer(this, 220, 400); + this.Rhorncrownlower3.setRotationPoint(0.0F, 0.5F, 3.0F); + this.Rhorncrownlower3.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 4, 0.0F); + this.setRotateAngle(Rhorncrownlower3, 0.22759093446006054F, -1.0471975511965976F, 0.0F); + this.RHeadhornlargeback = new ModelRenderer(this, 190, 370); + this.RHeadhornlargeback.setRotationPoint(0.01F, 0.0F, 0.0F); + this.RHeadhornlargeback.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 5, 0.0F); + this.setRotateAngle(RHeadhornlargeback, -0.7285004297824331F, 0.0F, 0.0F); + this.Underlowerjaw = new ModelRenderer(this, 160, 350); + this.Underlowerjaw.setRotationPoint(0.0F, 3.0F, -7.0F); + this.Underlowerjaw.addBox(-1.5F, -1.0F, -8.0F, 3, 1, 8, 0.0F); + this.setRotateAngle(Underlowerjaw, -0.091106186954104F, 0.0F, 0.0F); + this.Rightleg = new ModelRenderer(this, 260, 275); + this.Rightleg.mirror = true; + this.Rightleg.setRotationPoint(0.0F, 14.6F, 0.0F); + this.Rightleg.addBox(-3.0F, 0.0F, 0.0F, 6, 14, 7, 0.0F); + this.setRotateAngle(Rightleg, 0.7988371986378046F, -0.045553093477052F, 0.091106186954104F); + this.Smallheadhornright2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornright2.setRotationPoint(-3.2F, 5.0F, -3.0F); + this.Smallheadhornright2.addBox(0.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); + this.setRotateAngle(Smallheadhornright2, -0.18203784098300857F, -0.31869712141416456F, 0.0F); + this.Spike5 = new ModelRenderer(this, 230, 500); + this.Spike5.setRotationPoint(0.0F, 0.0F, 7.7F); + this.Spike5.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike5, 0.9105382707654417F, 0.0F, 0.0F); + this.Lowerjawback = new ModelRenderer(this, 120, 330); + this.Lowerjawback.setRotationPoint(0.0F, 0.5F, 1.0F); + this.Lowerjawback.addBox(-3.0F, 0.0F, -7.0F, 6, 3, 7, 0.0F); + this.setRotateAngle(Lowerjawback, -0.091106186954104F, 0.0F, 0.0F); + this.Tooth14 = new ModelRenderer(this, 180, 500); + this.Tooth14.setRotationPoint(2.5F, 0.5F, -10.0F); + this.Tooth14.addBox(-1.0F, -2.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth14, 0.22759093446006054F, 0.0F, 0.22759093446006054F); + this.RightFoot = new ModelRenderer(this, 260, 255); + this.RightFoot.setRotationPoint(2.5F, 9.6F, 4.0F); + this.RightFoot.addBox(-5.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(RightFoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Lheadhorncrown3 = new ModelRenderer(this, 220, 420); + this.Lheadhorncrown3.setRotationPoint(0.0F, 0.0F, 2.0F); + this.Lheadhorncrown3.addBox(0.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); + this.setRotateAngle(Lheadhorncrown3, 0.0F, 0.8196066167365371F, 0.0F); + this.Spike9 = new ModelRenderer(this, 230, 500); + this.Spike9.setRotationPoint(0.0F, 0.0F, 13.5F); + this.Spike9.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike9, 0.40980330836826856F, 0.0F, 0.0F); + this.Tail3 = new ModelRenderer(this, 5, 335); + this.Tail3.setRotationPoint(0.0F, 0.5F, 24.0F); + this.Tail3.addBox(-5.0F, 0.0F, 0.0F, 10, 11, 21, 0.0F); + this.setRotateAngle(Tail3, -0.091106186954104F, 0.0F, 0.0F); + this.Spike13 = new ModelRenderer(this, 230, 490); + this.Spike13.setRotationPoint(0.0F, 0.0F, 11.0F); + this.Spike13.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); + this.setRotateAngle(Spike13, 0.36425021489121656F, 0.0F, 0.0F); + this.RBrowback = new ModelRenderer(this, 190, 380); + this.RBrowback.setRotationPoint(0.0F, 0.0F, 5.0F); + this.RBrowback.addBox(0.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(RBrowback, 0.0F, 0.4553564018453205F, 0.0F); + this.Tail6 = new ModelRenderer(this, 5, 275); + this.Tail6.setRotationPoint(0.0F, 1.0F, 17.0F); + this.Tail6.addBox(-3.0F, 0.0F, 0.0F, 6, 7, 17, 0.0F); + this.setRotateAngle(Tail6, 0.136659280431156F, 0.0F, 0.0F); + this.Tooth4 = new ModelRenderer(this, 180, 500); + this.Tooth4.setRotationPoint(2.8F, 3.9F, -8.4F); + this.Tooth4.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth4, 0.0F, 0.0F, -0.31869712141416456F); + this.Spike15 = new ModelRenderer(this, 230, 490); + this.Spike15.setRotationPoint(0.0F, 0.0F, 12.0F); + this.Spike15.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); + this.setRotateAngle(Spike15, 0.36425021489121656F, 0.0F, 0.0F); + this.Righttoelowermid = new ModelRenderer(this, 290, 270); + this.Righttoelowermid.setRotationPoint(0.01F, 5.2F, 0.2F); + this.Righttoelowermid.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowermid, -0.27314402793711257F, 0.0F, 0.0F); + this.Tooth16 = new ModelRenderer(this, 180, 500); + this.Tooth16.setRotationPoint(-2.5F, 0.4F, -4.5F); + this.Tooth16.addBox(0.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth16, 0.0F, 0.0F, -0.22759093446006054F); + this.Tail7 = new ModelRenderer(this, 5, 240); + this.Tail7.setRotationPoint(0.0F, 1.0F, 13.0F); + this.Tail7.addBox(-2.0F, 0.0F, 0.0F, 4, 5, 20, 0.0F); + this.setRotateAngle(Tail7, 0.136659280431156F, 0.0F, 0.0F); + this.BrowfrontR = new ModelRenderer(this, 190, 390); + this.BrowfrontR.setRotationPoint(-2.3F, 0.7F, -4.7F); + this.BrowfrontR.addBox(0.0F, 0.0F, 0.0F, 2, 1, 5, 0.0F); + this.setRotateAngle(BrowfrontR, 0.091106186954104F, -0.36425021489121656F, 0.18203784098300857F); + this.Clawrighthandleft = new ModelRenderer(this, 200, 260); + this.Clawrighthandleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Clawrighthandleft.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 2, 0.0F); + this.setRotateAngle(Clawrighthandleft, -0.091106186954104F, 0.0F, 0.0F); + this.Wingmembramesmallright = new ModelRenderer(this, 420, 255); + this.Wingmembramesmallright.mirror = true; + this.Wingmembramesmallright.setRotationPoint(-20.0F, -0.6F, -1.0F); + this.Wingmembramesmallright.addBox(-21.0F, 0.0F, 0.0F, 21, 0, 22, 0.0F); + this.setRotateAngle(Wingmembramesmallright, 0.0F, 1.392423677241076F, 0.0F); + this.Tooth1 = new ModelRenderer(this, 180, 500); + this.Tooth1.setRotationPoint(2.8F, 4.0F, -3.2F); + this.Tooth1.addBox(-1.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth1, 0.0F, 0.091106186954104F, -0.31869712141416456F); + this.Thumbtoeupperright = new ModelRenderer(this, 305, 280); + this.Thumbtoeupperright.mirror = true; + this.Thumbtoeupperright.setRotationPoint(5.0F, 8.0F, 2.7F); + this.Thumbtoeupperright.addBox(-3.0F, 0.0F, 0.0F, 3, 5, 2, 0.0F); + this.setRotateAngle(Thumbtoeupperright, 0.091106186954104F, -0.4553564018453205F, -0.5009094953223726F); + this.Rightfoot = new ModelRenderer(this, 260, 255); + this.Rightfoot.mirror = true; + this.Rightfoot.setRotationPoint(-2.5F, 9.6F, 4.0F); + this.Rightfoot.addBox(0.0F, 0.0F, 0.0F, 5, 10, 5, 0.0F); + this.setRotateAngle(Rightfoot, -1.0471975511965976F, 0.0F, 0.0F); + this.Thumbtoelowerleft = new ModelRenderer(this, 305, 270); + this.Thumbtoelowerleft.setRotationPoint(0.0F, 4.0F, 0.0F); + this.Thumbtoelowerleft.addBox(0.0F, 0.0F, 0.0F, 2, 4, 2, 0.0F); + this.setRotateAngle(Thumbtoelowerleft, 0.0F, 0.0F, 0.31869712141416456F); + this.BrowbackL = new ModelRenderer(this, 190, 380); + this.BrowbackL.setRotationPoint(0.0F, 0.0F, 5.0F); + this.BrowbackL.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(BrowbackL, 0.0F, -0.4553564018453205F, 0.0F); + this.Headmidhornupperleft = new ModelRenderer(this, 190, 430); + this.Headmidhornupperleft.setRotationPoint(0.0F, 0.1F, 2.7F); + this.Headmidhornupperleft.addBox(-1.0F, 0.0F, 0.0F, 2, 1, 3, 0.0F); + this.setRotateAngle(Headmidhornupperleft, 0.136659280431156F, 0.091106186954104F, 0.0F); + this.Tail1 = new ModelRenderer(this, 5, 425); + this.Tail1.setRotationPoint(0.0F, 0.0F, 23.0F); + this.Tail1.addBox(-7.0F, 0.0F, 0.0F, 14, 14, 28, 0.0F); + this.setRotateAngle(Tail1, -0.5462880558742251F, 0.0F, 0.0F); + this.Rhorncrownlower2 = new ModelRenderer(this, 205, 400); + this.Rhorncrownlower2.setRotationPoint(0.0F, 0.01F, 4.0F); + this.Rhorncrownlower2.addBox(-2.0F, 0.0F, 0.0F, 2, 2, 3, 0.0F); + this.setRotateAngle(Rhorncrownlower2, 0.0F, -0.9105382707654417F, 0.0F); + this.Righttoelowerleft = new ModelRenderer(this, 290, 270); + this.Righttoelowerleft.setRotationPoint(0.01F, 6.0F, 0.0F); + this.Righttoelowerleft.addBox(-1.0F, -1.0F, 0.0F, 2, 4, 3, 0.0F); + this.setRotateAngle(Righttoelowerleft, -0.31869712141416456F, 0.0F, 0.0F); + this.Outertoeleft = new ModelRenderer(this, 305, 280); + this.Outertoeleft.setRotationPoint(0.0F, 5.0F, 1.0F); + this.Outertoeleft.addBox(0.0F, 0.0F, -1.0F, 3, 6, 2, 0.0F); + this.setRotateAngle(Outertoeleft, 0.9560913642424937F, -0.31869712141416456F, 0.40980330836826856F); + this.Righthandmidfinger = new ModelRenderer(this, 220, 260); + this.Righthandmidfinger.setRotationPoint(2.5F, 12.0F, 0.0F); + this.Righthandmidfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 2, 0.0F); + this.setRotateAngle(Righthandmidfinger, -0.5009094953223726F, 0.136659280431156F, -0.091106186954104F); + this.Wingfingerlower3left = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3left.setRotationPoint(34.0F, 0.0F, 0.0F); + this.Wingfingerlower3left.addBox(0.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3left, 0.0F, -0.31869712141416456F, 0.0F); + this.Lowerarmleft = new ModelRenderer(this, 220, 275); + this.Lowerarmleft.mirror = true; + this.Lowerarmleft.setRotationPoint(2.01F, 8.5F, 0.0F); + this.Lowerarmleft.addBox(-5.0F, 0.0F, 0.0F, 5, 15, 5, 0.0F); + this.setRotateAngle(Lowerarmleft, -1.0471975511965976F, 0.136659280431156F, 0.136659280431156F); + this.Spike14 = new ModelRenderer(this, 230, 490); + this.Spike14.setRotationPoint(0.0F, 0.0F, 5.0F); + this.Spike14.addBox(-0.5F, 0.0F, 0.0F, 1, 2, 5, 0.0F); + this.setRotateAngle(Spike14, 0.36425021489121656F, 0.0F, 0.0F); + this.Wingfingerlower3right = new ModelRenderer(this, 390, 150); + this.Wingfingerlower3right.setRotationPoint(-34.0F, 0.0F, 0.0F); + this.Wingfingerlower3right.addBox(-31.0F, 0.0F, 0.0F, 31, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower3right, 0.0F, 0.31869712141416456F, 0.0F); + this.Lefthip = new ModelRenderer(this, 260, 300); + this.Lefthip.mirror = true; + this.Lefthip.setRotationPoint(7.0F, 5.0F, 14.0F); + this.Lefthip.addBox(-4.0F, 0.0F, 0.0F, 8, 15, 10, 0.0F); + this.setRotateAngle(Lefthip, -0.27314402793711257F, -0.27314402793711257F, -0.18203784098300857F); + this.Tail8 = new ModelRenderer(this, 5, 220); + this.Tail8.setRotationPoint(0.0F, 1.0F, 18.0F); + this.Tail8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 16, 0.0F); + this.setRotateAngle(Tail8, 0.31869712141416456F, 0.0F, 0.0F); + this.Spike8 = new ModelRenderer(this, 230, 500); + this.Spike8.setRotationPoint(0.0F, 0.0F, 5.5F); + this.Spike8.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike8, 0.40980330836826856F, 0.0F, 0.0F); + this.Lefttoemid = new ModelRenderer(this, 290, 280); + this.Lefttoemid.setRotationPoint(2.5F, 7.0F, 0.0F); + this.Lefttoemid.addBox(-1.0F, 0.0F, 0.0F, 2, 6, 3, 0.0F); + this.setRotateAngle(Lefttoemid, -0.22759093446006054F, 0.0F, 0.0F); + this.Righthandleftfinger = new ModelRenderer(this, 220, 260); + this.Righthandleftfinger.setRotationPoint(4.0F, 12.0F, 0.0F); + this.Righthandleftfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandleftfinger, -0.5009094953223726F, -0.136659280431156F, -0.31869712141416456F); + this.Smallheadhornleft2 = new ModelRenderer(this, 190, 420); + this.Smallheadhornleft2.setRotationPoint(3.2F, 5.0F, -4.0F); + this.Smallheadhornleft2.addBox(-1.0F, 0.0F, 0.0F, 1, 1, 3, 0.0F); + this.setRotateAngle(Smallheadhornleft2, -0.18203784098300857F, 0.31869712141416456F, 0.0F); + this.Righthandrightfinger = new ModelRenderer(this, 220, 260); + this.Righthandrightfinger.setRotationPoint(2.0F, 12.0F, 0.0F); + this.Righthandrightfinger.addBox(-2.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Righthandrightfinger, -0.22759093446006054F, 0.31869712141416456F, 0.22759093446006054F); + this.Spike6 = new ModelRenderer(this, 230, 500); + this.Spike6.setRotationPoint(0.0F, 0.0F, 15.7F); + this.Spike6.addBox(-1.0F, 0.0F, 0.0F, 2, 3, 5, 0.0F); + this.setRotateAngle(Spike6, 0.8196066167365371F, 0.0F, 0.0F); + this.Tooth11 = new ModelRenderer(this, 180, 500); + this.Tooth11.setRotationPoint(2.5F, 0.6F, -1.3F); + this.Tooth11.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth11, 0.0F, 0.0F, 0.22759093446006054F); + this.Wingfingerlower1left = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1left.setRotationPoint(35.1F, 0.1F, 0.0F); + this.Wingfingerlower1left.addBox(0.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1left, 0.0F, -0.22759093446006054F, 0.0F); + this.Spike4 = new ModelRenderer(this, 230, 450); + this.Spike4.setRotationPoint(0.0F, 0.0F, 1.0F); + this.Spike4.addBox(-1.5F, 0.0F, 0.0F, 3, 4, 5, 0.0F); + this.setRotateAngle(Spike4, 1.1838568316277536F, 0.0F, 0.0F); + this.Wingupperarmleft = new ModelRenderer(this, 390, 230); + this.Wingupperarmleft.setRotationPoint(3.0F, 3.0F, 1.0F); + this.Wingupperarmleft.addBox(0.0F, -2.0F, 0.0F, 21, 4, 5, 0.0F); + this.setRotateAngle(Wingupperarmleft, -0.5009094953223726F, -0.5009094953223726F, 0.091106186954104F); + this.Tooth7 = new ModelRenderer(this, 180, 500); + this.Tooth7.setRotationPoint(-2.8F, 4.0F, -3.2F); + this.Tooth7.addBox(0.0F, 0.0F, 0.0F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth7, 0.0F, -0.091106186954104F, 0.31869712141416456F); + this.Lefthandrightfinger = new ModelRenderer(this, 220, 260); + this.Lefthandrightfinger.setRotationPoint(-4.0F, 12.0F, 0.0F); + this.Lefthandrightfinger.addBox(-1.0F, 0.0F, 0.0F, 2, 5, 2, 0.0F); + this.setRotateAngle(Lefthandrightfinger, -0.5009094953223726F, 0.136659280431156F, 0.31869712141416456F); + this.Wingfingerlower1right = new ModelRenderer(this, 380, 140); + this.Wingfingerlower1right.setRotationPoint(-35.1F, 0.1F, 0.0F); + this.Wingfingerlower1right.addBox(-41.0F, 0.0F, -1.0F, 41, 1, 2, 0.0F); + this.setRotateAngle(Wingfingerlower1right, 0.0F, 0.22759093446006054F, 0.0F); + this.Wingfinger3left = new ModelRenderer(this, 390, 170); + this.Wingfinger3left.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Wingfinger3left.addBox(0.0F, 0.0F, 0.0F, 35, 1, 2, 0.0F); + this.setRotateAngle(Wingfinger3left, 0.0F, -1.1383037381507017F, 0.0F); + this.Tooth13 = new ModelRenderer(this, 180, 500); + this.Tooth13.setRotationPoint(2.5F, 0.6F, -7.5F); + this.Tooth13.addBox(-1.0F, -2.0F, -0.5F, 1, 2, 1, 0.0F); + this.setRotateAngle(Tooth13, 0.0F, 0.0F, 0.22759093446006054F); + this.Wingfinger1right = new ModelRenderer(this, 350, 200); + this.Wingfinger1right.setRotationPoint(-23.0F, 2.1F, 3.0F); + this.Wingfinger1right.addBox(-36.0F, 0.0F, -1.0F, 36, 2, 3, 0.0F); + this.setRotateAngle(Wingfinger1right, 0.0F, 0.9105382707654417F, 0.0F); + this.Wingfinger2right = new ModelRenderer(this, 330, 150); + this.Wingfinger2right.setRotationPoint(2.0F, 0.0F, 0.0F); + this.Wingfinger2right.addBox(-2.0F, 0.0F, 0.0F, 2, 1, 40, 0.0F); + this.setRotateAngle(Wingfinger2right, 0.0F, -0.9560913642424937F, 0.0F); + this.Wingmembramelargeright = new ModelRenderer(this, 270, 365); + this.Wingmembramelargeright.mirror = true; + this.Wingmembramelargeright.setRotationPoint(0.0F, 0.5F, 0.0F); + this.Wingmembramelargeright.addBox(-74.0F, 0.0F, 0.0F, 74, 0, 61, 0.0F); + this.Lowerarmleft.addChild(this.Thumbtoeupperleft); + this.Outertoeleft.addChild(this.Outertoelowerleft); + this.Tail1.addChild(this.Spike7); + this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); + this.Outertoelowerright.addChild(this.Outertoelowerright_1); + this.Lowerjawback.addChild(this.Smallheadhornleft3); + this.Tail8.addChild(this.LTailSpike); + this.Lefthandrightfinger.addChild(this.Clawlefthandright); + this.Headback.addChild(this.Headlargehornlowerleft); + this.Rightfoot.addChild(this.Lefttoeleft); + this.Righthip.addChild(this.RightLeg); + this.RightFoot.addChild(this.Righttoeright); + this.Headmidhornlowerright.addChild(this.Headmidhornupperright); + this.Winglowerarmleft.addChild(this.Wingfinger1left); + this.Headlargehornlowerright.addChild(this.Rheadhorncrown1); + this.Body.addChild(this.Shoulderleft_1); + this.RTailSpike.addChild(this.RTailMembrane); + this.Snout.addChild(this.BrowfrontL); + this.Wingshoulderright.addChild(this.Wingupperarmright); + this.Wingfinger1left.addChild(this.Wingmembramelargeleft); + this.Headlargehornlowerright.addChild(this.Headlargehornupperright); + this.Neckend.addChild(this.Headback); + this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); + this.Lheadhorncrown1_1.addChild(this.Lheadhorncrown2); + this.Body.addChild(this.Spike1); + this.Headback.addChild(this.Headlargehornlowerright); + this.Tail4.addChild(this.Spike10); + this.Snout.addChild(this.Tooth3); + this.RightFoot.addChild(this.Righttoemid); + this.Tail6.addChild(this.Spike12); + this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); + this.Righthandmidfinger.addChild(this.Clawrighthandmid); + this.Wingfinger2left.addChild(this.Wingfingerlower2left); + this.Snout.addChild(this.Tooth9); + this.Righthandrightfinger.addChild(this.Clawrighthandright); + this.Rheadhorncrown1_1.addChild(this.Rheadhorncrown2); + this.Winglowerarmleft.addChild(this.Wingmembramemidleft); + this.Neckmid.addChild(this.Neckend); + this.Snout.addChild(this.Tooth10); + this.Lefttoeright.addChild(this.Lefttoelowerright); + this.Headlargehornupperright.addChild(this.Rheadhorncrown1_1); + this.Body.addChild(this.Wingshoulderright); + this.Body.addChild(this.Shoulderleft); + this.Body.addChild(this.Wingshoulderleft); + this.Body.addChild(this.Neckbase); + this.Tail3.addChild(this.Tail4); + this.Lefttoeleft.addChild(this.Lefttoelowerleft); + this.Tail8.addChild(this.RTailSpike); + this.Headlargehornupperleft.addChild(this.Lheadhorncrown1_1); + this.Lowerjaw.addChild(this.Tooth15); + this.Body.addChild(this.Spike2); + this.Body.addChild(this.Spike3); + this.Lowerarmleft.addChild(this.Lefthandmidfinger); + this.Wingfinger1left.addChild(this.Wingfinger2left); + this.Body.addChild(this.Belly1); + this.Headback.addChild(this.Headmidhornlowerleft); + this.Headback.addChild(this.shape151); + this.Lefthandmidfinger.addChild(this.Clawlefthandmid); + this.Underlowerjaw2.addChild(this.Underlowerjaw3); + this.Winglowerarmright.addChild(this.Wingmembramemidright); + this.Neckbase.addChild(this.Neckmid); + this.Wingfinger2right.addChild(this.Wingfingerlower2right); + this.Rheadhorncrown2.addChild(this.Rheadhorncrown3); + this.Belly1.addChild(this.Belly2); + this.Lowerjaw.addChild(this.Tooth17); + this.Tail4.addChild(this.Spike11); + this.Lowerjawback.addChild(this.Underlowerjaw2); + this.Lowerjaw.addChild(this.Tooth12); + this.RightFoot.addChild(this.Outertoelowerright); + this.Headlargehornupperleft.addChild(this.LHeadhornlargeback); + this.Tail1.addChild(this.Righthip); + this.Lheadhorncrown1.addChild(this.Lheadhorncrown2_1); + this.Wingupperarmleft.addChild(this.Winglowerarmleft); + this.RightFoot.addChild(this.Righttoeleft); + this.Lowerjawback.addChild(this.Smallheadhornright3); + this.Headlargehornlowerleft.addChild(this.Lheadhorncrown1); + this.Lefttoemid.addChild(this.Lefttoelowermid); + this.Lowerjaw.addChild(this.Tooth18); + this.Headback.addChild(this.Snout); + this.Snout.addChild(this.Tooth5); + this.Snout.addChild(this.Tooth6); + this.Lowerjawback.addChild(this.Lowerjaw); + this.Wingupperarmright.addChild(this.Winglowerarmright); + this.Shoulderleft_1.addChild(this.Lowerarmleft_1); + this.Rightfoot.addChild(this.Lefttoeright); + this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); + this.LTailSpike.addChild(this.LTailMembrane); + this.Righttoeright.addChild(this.Righttoelowerright); + this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); + this.Headback.addChild(this.Headmidhornlowerright); + this.Wingfinger1right.addChild(this.Wingfinger3right); + this.Lheadhorncrown2_1.addChild(this.Lheadhorncrown3_1); + this.Rhorncrownlower2.addChild(this.Rhorncrownlower3); + this.Headlargehornupperright.addChild(this.RHeadhornlargeback); + this.Lowerjawback.addChild(this.Underlowerjaw); + this.Lefthip.addChild(this.Rightleg); + this.Headback.addChild(this.Smallheadhornright2); + this.Tail1.addChild(this.Spike5); + this.shape151.addChild(this.Lowerjawback); + this.Lowerjaw.addChild(this.Tooth14); + this.RightLeg.addChild(this.RightFoot); + this.Lheadhorncrown2.addChild(this.Lheadhorncrown3); + this.Tail3.addChild(this.Spike9); + this.Tail1.addChild(this.Tail3); + this.Tail6.addChild(this.Spike13); + this.BrowfrontR.addChild(this.RBrowback); + this.Tail4.addChild(this.Tail6); + this.Snout.addChild(this.Tooth4); + this.Tail7.addChild(this.Spike15); + this.Righttoemid.addChild(this.Righttoelowermid); + this.Lowerjaw.addChild(this.Tooth16); + this.Tail6.addChild(this.Tail7); + this.Snout.addChild(this.BrowfrontR); + this.Righthandleftfinger.addChild(this.Clawrighthandleft); + this.Wingupperarmright.addChild(this.Wingmembramesmallright); + this.Snout.addChild(this.Tooth1); + this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); + this.Rightleg.addChild(this.Rightfoot); + this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); + this.BrowfrontL.addChild(this.BrowbackL); + this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); + this.Body.addChild(this.Tail1); + this.Rheadhorncrown1.addChild(this.Rhorncrownlower2); + this.Righttoeleft.addChild(this.Righttoelowerleft); + this.Rightfoot.addChild(this.Outertoeleft); + this.Lowerarmleft_1.addChild(this.Righthandmidfinger); + this.Wingfinger3left.addChild(this.Wingfingerlower3left); + this.Shoulderleft.addChild(this.Lowerarmleft); + this.Tail7.addChild(this.Spike14); + this.Wingfinger3right.addChild(this.Wingfingerlower3right); + this.Tail1.addChild(this.Lefthip); + this.Tail7.addChild(this.Tail8); + this.Tail3.addChild(this.Spike8); + this.Rightfoot.addChild(this.Lefttoemid); + this.Lowerarmleft_1.addChild(this.Righthandleftfinger); + this.Headback.addChild(this.Smallheadhornleft2); + this.Lowerarmleft_1.addChild(this.Righthandrightfinger); + this.Tail1.addChild(this.Spike6); + this.Lowerjaw.addChild(this.Tooth11); + this.Wingfinger1left.addChild(this.Wingfingerlower1left); + this.Tail1.addChild(this.Spike4); + this.Wingshoulderleft.addChild(this.Wingupperarmleft); + this.Snout.addChild(this.Tooth7); + this.Lowerarmleft.addChild(this.Lefthandrightfinger); + this.Wingfinger1right.addChild(this.Wingfingerlower1right); + this.Wingfinger1left.addChild(this.Wingfinger3left); + this.Lowerjaw.addChild(this.Tooth13); + this.Winglowerarmright.addChild(this.Wingfinger1right); + this.Wingfinger1right.addChild(this.Wingfinger2right); + this.Wingfinger1right.addChild(this.Wingmembramelargeright); - // Grouping - this.RightFoot.addChild(this.Righttoeleft); - this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); - this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); - this.Headback.addChild(this.Snout); - this.Lowerarmleft.addChild(this.Thumbtoeupperleft); - this.Rightleg.addChild(this.Rightfoot); - this.Wingfinger1left.addChild(this.Wingfinger3left); - this.Snout.addChild(this.Tooth10); - this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); - this.RightFoot.addChild(this.Righttoeright); - this.Headback.addChild(this.Headmidhornlowerright); - this.Outertoelowerright.addChild(this.Outertoelowerright_1); - this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); - this.Wingfinger1right.addChild(this.Wingfinger3right); - this.Snout.addChild(this.Tooth1); - this.Lefttoeleft.addChild(this.Lefttoelowerleft); - this.Smallheadhornright2.addChild(this.Smallheadhornright3); - this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); - this.Tail1.addChild(this.Righthip); - this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); - this.Headmidhornlowerright.addChild(this.Headmidhornupperright); - this.Snout.addChild(this.Tooth6); - this.Wingfinger3left.addChild(this.Wingfingerlower3left); - this.Lowerarmleft.addChild(this.Lefthandmidfinger); - this.Shoulderleft_1.addChild(this.Lowerarmleft_1); - this.Headback.addChild(this.Headlargehornlowerright); - this.Body.addChild(this.Wingshoulderright); - this.Righthandrightfinger.addChild(this.Clawrighthandright); - this.Lefttoemid.addChild(this.Lefttoelowermid); - this.Headback.addChild(this.Smallheadhornleft2); - this.Lefthandrightfinger.addChild(this.Clawlefthandright); - this.RTailSpike.addChild(this.RTailMembrane); - this.Lowerarmleft_1.addChild(this.Righthandrightfinger); - this.Winglowerarmleft.addChild(this.Wingmembramemidleft); - this.Body.addChild(this.Tail1); - this.Headback.addChild(this.Smallheadhornright2); - this.Lefttoeright.addChild(this.Lefttoelowerright); - this.Wingfinger1right.addChild(this.Wingmembramelargeright); - this.Wingupperarmleft.addChild(this.Winglowerarmleft); - this.Tail7.addChild(this.Tail8); - this.Snout.addChild(this.Tooth4); - this.Wingfinger1left.addChild(this.Wingfingerlower1left); - this.Tail8.addChild(this.RTailSpike); - this.RightFoot.addChild(this.Outertoelowerright); - this.Winglowerarmleft.addChild(this.Wingfinger1left); - this.Lefthandmidfinger.addChild(this.Clawlefthandmid); - this.Righttoeleft.addChild(this.Righttoelowerleft); - this.Body.addChild(this.Shoulderleft); - this.Wingshoulderleft.addChild(this.Wingupperarmleft); - this.LTailSpike.addChild(this.LTailMembrane); - this.Snout.addChild(this.Tooth3); - this.Neckmid.addChild(this.Neckend); - this.Headlargehornlowerright.addChild(this.Headlargehornupperright); - this.Righttoemid.addChild(this.Righttoelowermid); - this.Neckbase.addChild(this.Neckmid); - this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); - this.Tail6.addChild(this.Tail7); - this.RightFoot.addChild(this.Righttoemid); - this.Rightfoot.addChild(this.Lefttoeleft); - this.Righthandleftfinger.addChild(this.Clawrighthandleft); - this.Neckend.addChild(this.Headback); - // this.Headback.addChild(this.Lowerjaw); - this.Shoulderleft.addChild(this.Lowerarmleft); - this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); - this.Body.addChild(this.Shoulderleft_1); - this.Winglowerarmright.addChild(this.Wingfinger1right); - this.Wingfinger2right.addChild(this.Wingfingerlower2right); - this.RightLeg.addChild(this.RightFoot); - this.Wingfinger2left.addChild(this.Wingfingerlower2left); - this.Wingupperarmright.addChild(this.Winglowerarmright); - this.Righttoeright.addChild(this.Righttoelowerright); - this.Lefthip.addChild(this.Rightleg); - this.Snout.addChild(this.Tooth5); - this.Rightfoot.addChild(this.Outertoeleft); - this.Wingfinger1right.addChild(this.Wingfinger2right); - this.Tail8.addChild(this.LTailSpike); - this.Righthandmidfinger.addChild(this.Clawrighthandmid); - this.Snout.addChild(this.Tooth9); - this.Wingfinger1right.addChild(this.Wingfingerlower1right); - this.Wingupperarmright.addChild(this.Wingmembramesmallright); - this.Headback.addChild(this.Headlargehornlowerleft); - this.Wingfinger1left.addChild(this.Wingmembramelargeleft); - this.Wingfinger3right.addChild(this.Wingfingerlower3right); - this.Tail3.addChild(this.Tail4); - this.Tail1.addChild(this.Tail3); - this.Wingshoulderright.addChild(this.Wingupperarmright); - this.Outertoeleft.addChild(this.Outertoelowerleft); - this.Body.addChild(this.Wingshoulderleft); - this.Wingfinger1left.addChild(this.Wingfinger2left); - this.Tail1.addChild(this.Lefthip); - this.Lowerarmleft_1.addChild(this.Righthandmidfinger); - this.Lowerarmleft_1.addChild(this.Righthandleftfinger); - this.Headback.addChild(this.Headmidhornlowerleft); - this.Tail4.addChild(this.Tail6); - this.Rightfoot.addChild(this.Lefttoeright); - this.Snout.addChild(this.Tooth7); - this.Winglowerarmright.addChild(this.Wingmembramemidright); - this.Body.addChild(this.Neckbase); - this.Lowerarmleft.addChild(this.Lefthandrightfinger); - this.Righthip.addChild(this.RightLeg); - this.Rightfoot.addChild(this.Lefttoemid); - this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); - } + // Grouping + this.RightFoot.addChild(this.Righttoeleft); + this.Thumbtoeupperright.addChild(this.Thumbtoelowerright); + this.Wingupperarmleft.addChild(this.Wingmembramesmallleft); + this.Headback.addChild(this.Snout); + this.Lowerarmleft.addChild(this.Thumbtoeupperleft); + this.Rightleg.addChild(this.Rightfoot); + this.Wingfinger1left.addChild(this.Wingfinger3left); + this.Snout.addChild(this.Tooth10); + this.Headmidhornlowerleft.addChild(this.Headmidhornupperleft); + this.RightFoot.addChild(this.Righttoeright); + this.Headback.addChild(this.Headmidhornlowerright); + this.Outertoelowerright.addChild(this.Outertoelowerright_1); + this.Headlargehornlowerleft.addChild(this.Headlargehornupperleft); + this.Wingfinger1right.addChild(this.Wingfinger3right); + this.Snout.addChild(this.Tooth1); + this.Lefttoeleft.addChild(this.Lefttoelowerleft); + this.Smallheadhornright2.addChild(this.Smallheadhornright3); + this.Lowerarmleft.addChild(this.Lefthandrightfinger_1); + this.Tail1.addChild(this.Righthip); + this.Smallheadhornleft2.addChild(this.Smallheadhornleft3); + this.Headmidhornlowerright.addChild(this.Headmidhornupperright); + this.Snout.addChild(this.Tooth6); + this.Wingfinger3left.addChild(this.Wingfingerlower3left); + this.Lowerarmleft.addChild(this.Lefthandmidfinger); + this.Shoulderleft_1.addChild(this.Lowerarmleft_1); + this.Headback.addChild(this.Headlargehornlowerright); + this.Body.addChild(this.Wingshoulderright); + this.Righthandrightfinger.addChild(this.Clawrighthandright); + this.Lefttoemid.addChild(this.Lefttoelowermid); + this.Headback.addChild(this.Smallheadhornleft2); + this.Lefthandrightfinger.addChild(this.Clawlefthandright); + this.RTailSpike.addChild(this.RTailMembrane); + this.Lowerarmleft_1.addChild(this.Righthandrightfinger); + this.Winglowerarmleft.addChild(this.Wingmembramemidleft); + this.Body.addChild(this.Tail1); + this.Headback.addChild(this.Smallheadhornright2); + this.Lefttoeright.addChild(this.Lefttoelowerright); + this.Wingfinger1right.addChild(this.Wingmembramelargeright); + this.Wingupperarmleft.addChild(this.Winglowerarmleft); + this.Tail7.addChild(this.Tail8); + this.Snout.addChild(this.Tooth4); + this.Wingfinger1left.addChild(this.Wingfingerlower1left); + this.Tail8.addChild(this.RTailSpike); + this.RightFoot.addChild(this.Outertoelowerright); + this.Winglowerarmleft.addChild(this.Wingfinger1left); + this.Lefthandmidfinger.addChild(this.Clawlefthandmid); + this.Righttoeleft.addChild(this.Righttoelowerleft); + this.Body.addChild(this.Shoulderleft); + this.Wingshoulderleft.addChild(this.Wingupperarmleft); + this.LTailSpike.addChild(this.LTailMembrane); + this.Snout.addChild(this.Tooth3); + this.Neckmid.addChild(this.Neckend); + this.Headlargehornlowerright.addChild(this.Headlargehornupperright); + this.Righttoemid.addChild(this.Righttoelowermid); + this.Neckbase.addChild(this.Neckmid); + this.Lowerarmleft_1.addChild(this.Thumbtoeupperright); + this.Tail6.addChild(this.Tail7); + this.RightFoot.addChild(this.Righttoemid); + this.Rightfoot.addChild(this.Lefttoeleft); + this.Righthandleftfinger.addChild(this.Clawrighthandleft); + this.Neckend.addChild(this.Headback); + // this.Headback.addChild(this.Lowerjaw); + this.Shoulderleft.addChild(this.Lowerarmleft); + this.Thumbtoeupperleft.addChild(this.Thumbtoelowerleft); + this.Body.addChild(this.Shoulderleft_1); + this.Winglowerarmright.addChild(this.Wingfinger1right); + this.Wingfinger2right.addChild(this.Wingfingerlower2right); + this.RightLeg.addChild(this.RightFoot); + this.Wingfinger2left.addChild(this.Wingfingerlower2left); + this.Wingupperarmright.addChild(this.Winglowerarmright); + this.Righttoeright.addChild(this.Righttoelowerright); + this.Lefthip.addChild(this.Rightleg); + this.Snout.addChild(this.Tooth5); + this.Rightfoot.addChild(this.Outertoeleft); + this.Wingfinger1right.addChild(this.Wingfinger2right); + this.Tail8.addChild(this.LTailSpike); + this.Righthandmidfinger.addChild(this.Clawrighthandmid); + this.Snout.addChild(this.Tooth9); + this.Wingfinger1right.addChild(this.Wingfingerlower1right); + this.Wingupperarmright.addChild(this.Wingmembramesmallright); + this.Headback.addChild(this.Headlargehornlowerleft); + this.Wingfinger1left.addChild(this.Wingmembramelargeleft); + this.Wingfinger3right.addChild(this.Wingfingerlower3right); + this.Tail3.addChild(this.Tail4); + this.Tail1.addChild(this.Tail3); + this.Wingshoulderright.addChild(this.Wingupperarmright); + this.Outertoeleft.addChild(this.Outertoelowerleft); + this.Body.addChild(this.Wingshoulderleft); + this.Wingfinger1left.addChild(this.Wingfinger2left); + this.Tail1.addChild(this.Lefthip); + this.Lowerarmleft_1.addChild(this.Righthandmidfinger); + this.Lowerarmleft_1.addChild(this.Righthandleftfinger); + this.Headback.addChild(this.Headmidhornlowerleft); + this.Tail4.addChild(this.Tail6); + this.Rightfoot.addChild(this.Lefttoeright); + this.Snout.addChild(this.Tooth7); + this.Winglowerarmright.addChild(this.Wingmembramemidright); + this.Body.addChild(this.Neckbase); + this.Lowerarmleft.addChild(this.Lefthandrightfinger); + this.Righthip.addChild(this.RightLeg); + this.Rightfoot.addChild(this.Lefttoemid); + this.Lefthandrightfinger_1.addChild(this.Clawlefthandleft); + } - public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { - modelRenderer.rotateAngleX = x; - modelRenderer.rotateAngleY = y; - modelRenderer.rotateAngleZ = z; - } + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); - this.Body.render(f5); - } + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles((EntityDragon) entity, f, f1, f2, f3, f4, f5); + this.Body.render(f5); + } - private void setRotation(ModelRenderer model, float x, float y, float z) { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } - public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, - float head4) { - super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); - float wingFlap = (float) Math.toRadians(dragon.wingFlap()); - float jawAngle = (float) Math.toRadians(dragon.getJawMove()); - float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); + public void setRotationAngles(EntityDragon dragon, float step1, float step2, float head1, float neckY, float neckX, + float head4) { + super.setRotationAngles(step1, step2, head1, neckY, neckX, head4, dragon); + float wingFlap = (float) Math.toRadians(dragon.wingFlap()); + float jawAngle = (float) Math.toRadians(dragon.getJawMove()); + float neckAngle = -(float) Math.toRadians(4.5F * dragon.getNeckAngle()); - this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; - this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); + this.Headback.rotateAngleX = neckX / (180F / (float) Math.PI) + neckAngle; + this.Headback.rotateAngleY = neckY / (180F / (float) Math.PI); - this.Lowerjaw.rotateAngleX = 0.045553093477052F + jawAngle; - // this.Tail1.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - // this.Tail3.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - // this.Tail4.rotateAngleY = (float) - // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + this.Lowerjaw.rotateAngleX = 0.045553093477052F + jawAngle; + // this.Tail1.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail3.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; + // this.Tail4.rotateAngleY = (float) + // Math.toRadians(dragon.prevRotationYaw-dragon.rotationYaw)*1.5F; - if (!dragon.isTerrestrial()) // Fly - { - if (!dragon.onGround) { - float angle = (float) Math.toRadians(dragon.getVertTailAngle()); - this.Body.rotateAngleX = 0.546F - angle; - } else { - this.Body.rotateAngleX = 0.5462880558742251F; - } + if (!dragon.isTerrestrial()) // Fly + { + if (!dragon.onGround) { + float angle = (float) Math.toRadians(dragon.getVertTailAngle()); + this.Body.rotateAngleX = 0.546F - angle; + } else { + this.Body.rotateAngleX = 0.5462880558742251F; + } - if (dragon.motionY < -0.01F)// Glide - { - wingFlap = 0; - } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover - { - wingFlap = (float) Math.toRadians(dragon.wingFlap()); - } else { - wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move - } - this.Wingshoulderright.rotateAngleZ = wingFlap * 0.75F; - this.Wingshoulderleft.rotateAngleZ = -(wingFlap * 0.75F); - this.Wingupperarmright.rotateAngleZ = wingFlap * 0.25F; - this.Wingupperarmleft.rotateAngleZ = -(wingFlap * 0.25F); + if (dragon.motionY < -0.01F)// Glide + { + wingFlap = 0; + } else if (dragon.motionX == 0 && dragon.motionZ == 0) // Hover + { + wingFlap = (float) Math.toRadians(dragon.wingFlap()); + } else { + wingFlap = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2;// Move + } + this.Wingshoulderright.rotateAngleZ = wingFlap * 0.75F; + this.Wingshoulderleft.rotateAngleZ = -(wingFlap * 0.75F); + this.Wingupperarmright.rotateAngleZ = wingFlap * 0.25F; + this.Wingupperarmleft.rotateAngleZ = -(wingFlap * 0.25F); - } else // Walk - { - this.Body.rotateAngleX = 0.5462880558742251F; - this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); - this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); - // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); - // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); + } else // Walk + { + this.Body.rotateAngleX = 0.5462880558742251F; + this.Wingshoulderright.rotateAngleZ = (float) -Math.toRadians(40); + this.Wingshoulderleft.rotateAngleZ = (float) Math.toRadians(40); + // this.Winglowerarmright.rotateAngleZ = (float) Math.toRadians(180); + // this.Winglowerarmleft.rotateAngleZ = (float) -Math.toRadians(180); - this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; - this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; - } - } + this.Righthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + this.Lefthip.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft_1.rotateAngleX = MathHelper.cos(step1 * 0.6662F + (float) Math.PI) * 1.4F * step2; + this.Shoulderleft.rotateAngleX = MathHelper.cos(step1 * 0.6662F) * 1.4F * step2; + } + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/RenderDragon.java b/src/main/java/minefantasy/mf2/client/render/mob/RenderDragon.java index 314e0d2a..b951bb7f 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/RenderDragon.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/RenderDragon.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.render.mob; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -13,43 +11,44 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.boss.BossStatus; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class RenderDragon extends RenderLiving { - private static ModelBase dragonModel = new ModelDragon(); - private static ModelBase venomModel = new ModelVenomDragon(); - private static ModelBase frostModel = new ModelFrostDragon(); - private static ModelBase ashModel = new ModelAshDragon(); - - public RenderDragon(float shadow) { - super(dragonModel, shadow); - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - if (entity instanceof EntityDragon) { - return TextureHelperMF - .getResource("textures/models/monster/dragon/" + ((EntityDragon) entity).getTexture() + ".png"); - } - return TextureHelperMF.getResource("textures/models/monster/dragon/dragonGreen.png"); - } - - @Override - protected void preRenderCallback(EntityLivingBase entity, float f) { - this.preRenderCallback((EntityDragon) entity, f); - } - - public void doRender(EntityLiving entity, double x, double y, double z, float f, float f1) { - String breed = ((EntityDragon) entity).getType().breedName; - this.mainModel = breed.equalsIgnoreCase("ash") ? ashModel - : breed.equalsIgnoreCase("white") ? frostModel - : breed.equalsIgnoreCase("green") ? venomModel : dragonModel; - super.doRender(entity, x, y, z, f, 1); - BossStatus.setBossStatus((EntityDragon) entity, ((EntityDragon) entity).getType().tier == 4); - } - - protected void preRenderCallback(EntityDragon mob, float f) { - float scale = mob.getScale(); - GL11.glScalef(scale, scale, scale); - } + private static ModelBase dragonModel = new ModelDragon(); + private static ModelBase venomModel = new ModelVenomDragon(); + private static ModelBase frostModel = new ModelFrostDragon(); + private static ModelBase ashModel = new ModelAshDragon(); + + public RenderDragon(float shadow) { + super(dragonModel, shadow); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + if (entity instanceof EntityDragon) { + return TextureHelperMF + .getResource("textures/models/monster/dragon/" + ((EntityDragon) entity).getTexture() + ".png"); + } + return TextureHelperMF.getResource("textures/models/monster/dragon/dragonGreen.png"); + } + + @Override + protected void preRenderCallback(EntityLivingBase entity, float f) { + this.preRenderCallback((EntityDragon) entity, f); + } + + public void doRender(EntityLiving entity, double x, double y, double z, float f, float f1) { + String breed = ((EntityDragon) entity).getType().breedName; + this.mainModel = breed.equalsIgnoreCase("ash") ? ashModel + : breed.equalsIgnoreCase("white") ? frostModel + : breed.equalsIgnoreCase("green") ? venomModel : dragonModel; + super.doRender(entity, x, y, z, f, 1); + BossStatus.setBossStatus((EntityDragon) entity, ((EntityDragon) entity).getType().tier == 4); + } + + protected void preRenderCallback(EntityDragon mob, float f) { + float scale = mob.getScale(); + GL11.glScalef(scale, scale, scale); + } } diff --git a/src/main/java/minefantasy/mf2/client/render/mob/RenderHound.java b/src/main/java/minefantasy/mf2/client/render/mob/RenderHound.java index 80a8d5a1..e48a780b 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/RenderHound.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/RenderHound.java @@ -1,7 +1,5 @@ package minefantasy.mf2.client.render.mob; -import org.lwjgl.opengl.GL11; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -12,72 +10,73 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntitySheep; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class RenderHound extends RenderLiving { - public RenderHound(ModelBase modelbase) { - super(modelbase, 1.0F); - this.setRenderPassModel(modelbase); - } + public RenderHound(ModelBase modelbase) { + super(modelbase, 1.0F); + this.setRenderPassModel(modelbase); + } - /** - * Defines what float the third param in setRotationAngles of ModelBase is - */ - protected float handleRotationFloat(EntityHound mob, float f) { - return mob.getTailRotation(); - } + /** + * Defines what float the third param in setRotationAngles of ModelBase is + */ + protected float handleRotationFloat(EntityHound mob, float f) { + return mob.getTailRotation(); + } - /** - * Queries whether should render the specified pass or not. - */ - protected int shouldRenderPass(EntityHound hound, int layer, float f) { - if (layer == 0 && hound.getWolfShaking()) { - float f1 = hound.getBrightness(f) * hound.getShadingWhileShaking(f); - this.bindTexture("hound"); - GL11.glColor3f(f1, f1, f1); - return 1; - } else if (layer == 1 && hound.isTamed()) { - this.bindTexture("collar"); - int j = hound.getCollarColor(); - GL11.glColor3f(EntitySheep.fleeceColorTable[j][0], EntitySheep.fleeceColorTable[j][1], - EntitySheep.fleeceColorTable[j][2]); - return 1; - } else { - return -1; - } - } + /** + * Queries whether should render the specified pass or not. + */ + protected int shouldRenderPass(EntityHound hound, int layer, float f) { + if (layer == 0 && hound.getWolfShaking()) { + float f1 = hound.getBrightness(f) * hound.getShadingWhileShaking(f); + this.bindTexture("hound"); + GL11.glColor3f(f1, f1, f1); + return 1; + } else if (layer == 1 && hound.isTamed()) { + this.bindTexture("collar"); + int j = hound.getCollarColor(); + GL11.glColor3f(EntitySheep.fleeceColorTable[j][0], EntitySheep.fleeceColorTable[j][1], + EntitySheep.fleeceColorTable[j][2]); + return 1; + } else { + return -1; + } + } - private void bindTexture(String string) { - bindTexture(TextureHelperMF.getResource("textures/models/animal/hound/" + string + ".png")); - } + private void bindTexture(String string) { + bindTexture(TextureHelperMF.getResource("textures/models/animal/hound/" + string + ".png")); + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless - * you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntityHound p_110775_1_) { - return TextureHelperMF.getResource("textures/models/animal/hound/hound.png"); - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(EntityHound p_110775_1_) { + return TextureHelperMF.getResource("textures/models/animal/hound/hound.png"); + } - /** - * Queries whether should render the specified pass or not. - */ - protected int shouldRenderPass(EntityLivingBase p_77032_1_, int p_77032_2_, float p_77032_3_) { - return this.shouldRenderPass((EntityHound) p_77032_1_, p_77032_2_, p_77032_3_); - } + /** + * Queries whether should render the specified pass or not. + */ + protected int shouldRenderPass(EntityLivingBase p_77032_1_, int p_77032_2_, float p_77032_3_) { + return this.shouldRenderPass((EntityHound) p_77032_1_, p_77032_2_, p_77032_3_); + } - /** - * Defines what float the third param in setRotationAngles of ModelBase is - */ - protected float handleRotationFloat(EntityLivingBase p_77044_1_, float p_77044_2_) { - return this.handleRotationFloat((EntityHound) p_77044_1_, p_77044_2_); - } + /** + * Defines what float the third param in setRotationAngles of ModelBase is + */ + protected float handleRotationFloat(EntityLivingBase p_77044_1_, float p_77044_2_) { + return this.handleRotationFloat((EntityHound) p_77044_1_, p_77044_2_); + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless - * you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(Entity p_110775_1_) { - return this.getEntityTexture((EntityHound) p_110775_1_); - } + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless + * you call Render.bindEntityTexture. + */ + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture((EntityHound) p_110775_1_); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/client/render/mob/RenderMinotaur.java b/src/main/java/minefantasy/mf2/client/render/mob/RenderMinotaur.java index 0881cb5a..45184923 100644 --- a/src/main/java/minefantasy/mf2/client/render/mob/RenderMinotaur.java +++ b/src/main/java/minefantasy/mf2/client/render/mob/RenderMinotaur.java @@ -1,11 +1,6 @@ package minefantasy.mf2.client.render.mob; -import java.util.UUID; - -import org.lwjgl.opengl.GL11; - import com.mojang.authlib.GameProfile; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.TextureHelperMF; @@ -25,159 +20,162 @@ import net.minecraft.nbt.NBTUtil; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StringUtils; +import org.lwjgl.opengl.GL11; + +import java.util.UUID; @SideOnly(Side.CLIENT) public class RenderMinotaur extends RenderBiped { - public RenderMinotaur(ModelBiped model, float shadow) { - super(model, shadow); - - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - if (entity instanceof EntityMinotaur) { - return TextureHelperMF - .getResource("textures/models/monster/minotaur/" + ((EntityMinotaur) entity).getTexture() + ".png"); - } - return TextureHelperMF.getResource("textures/models/monster/minotaur/minotaurBrown.png"); - } - - @Override - public void doRender(EntityLiving entity, double x, double y, double z, float f, float f1) { - super.doRender(entity, x, y, z, f, 1); - } - - @Override - protected void renderEquippedItems(EntityLiving p_77029_1_, float p_77029_2_) { - GL11.glColor3f(1.0F, 1.0F, 1.0F); - ItemStack itemstack = p_77029_1_.getHeldItem(); - ItemStack itemstack1 = p_77029_1_.func_130225_q(3); - Item item; - float f1; - - if (itemstack1 != null) { - GL11.glPushMatrix(); - this.modelBipedMain.bipedHead.postRender(0.0625F); - item = itemstack1.getItem(); - - net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient - .getItemRenderer(itemstack1, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); - boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( - net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack1, - net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); - - if (item instanceof ItemBlock) { - if (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType())) { - f1 = 0.625F; - GL11.glTranslatef(0.0F, -0.25F, 0.0F); - GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(f1, -f1, -f1); - } - - this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack1, 0); - } else if (item == Items.skull) { - f1 = 1.0625F; - GL11.glScalef(f1, -f1, -f1); - GameProfile gameprofile = null; - - if (itemstack1.hasTagCompound()) { - NBTTagCompound nbttagcompound = itemstack1.getTagCompound(); - - if (nbttagcompound.hasKey("SkullOwner", 10)) { - gameprofile = NBTUtil.func_152459_a(nbttagcompound.getCompoundTag("SkullOwner")); - } else if (nbttagcompound.hasKey("SkullOwner", 8) - && !StringUtils.isNullOrEmpty(nbttagcompound.getString("SkullOwner"))) { - gameprofile = new GameProfile((UUID) null, nbttagcompound.getString("SkullOwner")); - } - } - - TileEntitySkullRenderer.field_147536_b.func_152674_a(-0.5F, 0.0F, -0.5F, 1, 180.0F, - itemstack1.getItemDamage(), gameprofile); - } - - GL11.glPopMatrix(); - } - - if (itemstack != null && itemstack.getItem() != null) { - item = itemstack.getItem(); - GL11.glPushMatrix(); - - if (this.mainModel.isChild) { - f1 = 0.5F; - GL11.glTranslatef(0.0F, 0.625F, 0.0F); - GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F); - GL11.glScalef(f1, f1, f1); - } - GL11.glTranslatef(0.0F, 8F / 16F, 0.0F); - - this.modelBipedMain.bipedRightArm.postRender(0.0625F); - GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); - - net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient - .getItemRenderer(itemstack, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); - boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( - net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack, - net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); - - if (item instanceof ItemBlock - && (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType()))) { - f1 = 0.5F; - GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); - f1 *= 0.75F; - GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(-f1, -f1, f1); - } else if (item == Items.bow) { - f1 = 0.625F; - GL11.glTranslatef(0.0F, 0.125F, 0.3125F); - GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(f1, -f1, f1); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } else if (item.isFull3D()) { - f1 = 0.625F; - - if (item.shouldRotateAroundWhenRendering()) { - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.0F, -0.125F, 0.0F); - } - - this.func_82422_c(); - GL11.glScalef(f1, -f1, f1); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } else { - f1 = 0.375F; - GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); - GL11.glScalef(f1, f1, f1); - GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); - } - - float f2; - int i; - float f5; - - if (itemstack.getItem().requiresMultipleRenderPasses()) { - for (i = 0; i < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++i) { - int j = itemstack.getItem().getColorFromItemStack(itemstack, i); - f5 = (j >> 16 & 255) / 255.0F; - f2 = (j >> 8 & 255) / 255.0F; - float f3 = (j & 255) / 255.0F; - GL11.glColor4f(f5, f2, f3, 1.0F); - this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack, i); - } - } else { - i = itemstack.getItem().getColorFromItemStack(itemstack, 0); - float f4 = (i >> 16 & 255) / 255.0F; - f5 = (i >> 8 & 255) / 255.0F; - f2 = (i & 255) / 255.0F; - GL11.glColor4f(f4, f5, f2, 1.0F); - this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack, 0); - } - - GL11.glPopMatrix(); - } - } + public RenderMinotaur(ModelBiped model, float shadow) { + super(model, shadow); + + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + if (entity instanceof EntityMinotaur) { + return TextureHelperMF + .getResource("textures/models/monster/minotaur/" + ((EntityMinotaur) entity).getTexture() + ".png"); + } + return TextureHelperMF.getResource("textures/models/monster/minotaur/minotaurBrown.png"); + } + + @Override + public void doRender(EntityLiving entity, double x, double y, double z, float f, float f1) { + super.doRender(entity, x, y, z, f, 1); + } + + @Override + protected void renderEquippedItems(EntityLiving p_77029_1_, float p_77029_2_) { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + ItemStack itemstack = p_77029_1_.getHeldItem(); + ItemStack itemstack1 = p_77029_1_.func_130225_q(3); + Item item; + float f1; + + if (itemstack1 != null) { + GL11.glPushMatrix(); + this.modelBipedMain.bipedHead.postRender(0.0625F); + item = itemstack1.getItem(); + + net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient + .getItemRenderer(itemstack1, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); + boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( + net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack1, + net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); + + if (item instanceof ItemBlock) { + if (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType())) { + f1 = 0.625F; + GL11.glTranslatef(0.0F, -0.25F, 0.0F); + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(f1, -f1, -f1); + } + + this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack1, 0); + } else if (item == Items.skull) { + f1 = 1.0625F; + GL11.glScalef(f1, -f1, -f1); + GameProfile gameprofile = null; + + if (itemstack1.hasTagCompound()) { + NBTTagCompound nbttagcompound = itemstack1.getTagCompound(); + + if (nbttagcompound.hasKey("SkullOwner", 10)) { + gameprofile = NBTUtil.func_152459_a(nbttagcompound.getCompoundTag("SkullOwner")); + } else if (nbttagcompound.hasKey("SkullOwner", 8) + && !StringUtils.isNullOrEmpty(nbttagcompound.getString("SkullOwner"))) { + gameprofile = new GameProfile((UUID) null, nbttagcompound.getString("SkullOwner")); + } + } + + TileEntitySkullRenderer.field_147536_b.func_152674_a(-0.5F, 0.0F, -0.5F, 1, 180.0F, + itemstack1.getItemDamage(), gameprofile); + } + + GL11.glPopMatrix(); + } + + if (itemstack != null && itemstack.getItem() != null) { + item = itemstack.getItem(); + GL11.glPushMatrix(); + + if (this.mainModel.isChild) { + f1 = 0.5F; + GL11.glTranslatef(0.0F, 0.625F, 0.0F); + GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F); + GL11.glScalef(f1, f1, f1); + } + GL11.glTranslatef(0.0F, 8F / 16F, 0.0F); + + this.modelBipedMain.bipedRightArm.postRender(0.0625F); + GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); + + net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient + .getItemRenderer(itemstack, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); + boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper( + net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack, + net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); + + if (item instanceof ItemBlock + && (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType()))) { + f1 = 0.5F; + GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); + f1 *= 0.75F; + GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(-f1, -f1, f1); + } else if (item == Items.bow) { + f1 = 0.625F; + GL11.glTranslatef(0.0F, 0.125F, 0.3125F); + GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); + GL11.glScalef(f1, -f1, f1); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else if (item.isFull3D()) { + f1 = 0.625F; + + if (item.shouldRotateAroundWhenRendering()) { + GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0F, -0.125F, 0.0F); + } + + this.func_82422_c(); + GL11.glScalef(f1, -f1, f1); + GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } else { + f1 = 0.375F; + GL11.glTranslatef(0.25F, 0.1875F, -0.1875F); + GL11.glScalef(f1, f1, f1); + GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); + } + + float f2; + int i; + float f5; + + if (itemstack.getItem().requiresMultipleRenderPasses()) { + for (i = 0; i < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++i) { + int j = itemstack.getItem().getColorFromItemStack(itemstack, i); + f5 = (j >> 16 & 255) / 255.0F; + f2 = (j >> 8 & 255) / 255.0F; + float f3 = (j & 255) / 255.0F; + GL11.glColor4f(f5, f2, f3, 1.0F); + this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack, i); + } + } else { + i = itemstack.getItem().getColorFromItemStack(itemstack, 0); + float f4 = (i >> 16 & 255) / 255.0F; + f5 = (i >> 8 & 255) / 255.0F; + f2 = (i & 255) / 255.0F; + GL11.glColor4f(f4, f5, f2, 1.0F); + this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack, 0); + } + + GL11.glPopMatrix(); + } + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigArmour.java b/src/main/java/minefantasy/mf2/config/ConfigArmour.java index e9229492..f770de38 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigArmour.java +++ b/src/main/java/minefantasy/mf2/config/ConfigArmour.java @@ -5,52 +5,49 @@ import minefantasy.mf2.entity.EntityCogwork; public class ConfigArmour extends ConfigurationBaseMF { - public static final String CATEGORY_BONUS = "Bonuses"; - - public static boolean resistArrow; - - public static final String CATEGORY_PENALTIES = "Penalties"; - - public static final String CATEGORY_COGWORK = "Cogwork Features"; - public static boolean cogworkGrief; - public static float cogworkFuelUnits; - - @Override - protected void loadConfig() { - resistArrow = Boolean.parseBoolean(config.get(CATEGORY_BONUS, "Deflect Arrows", true, - "With this option; arrows have a chance to deflect off armour. It compares the arrow damage and armour rating. Chain and plate have higher rates. Arrows bounced off can hurt enemies") - .getString()); - TacticalManager.arrowDeflectChance = Float.parseFloat(config.get(CATEGORY_BONUS, "Deflect Arrows Modifier", - 1.0F, - "This modifies the chance for arrows to deflect off armour: Increasing this increases the deflect chance, decreasing decreases the chance, 0 means it's impossible") - .getString()); - - TacticalManager.shouldSlow = Boolean.parseBoolean(config.get(CATEGORY_PENALTIES, "Armour Slow Movement", true, - "With this: Heavier armours slow your movement down acrosss both walking and sprinting. Speed is affected by design and material") - .getString()); - TacticalManager.minWeightSpeed = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Min armour weigh speed", 10F, - "The minimal speed percent capable from weight (10 = 10%), MF armours don't go lower than 75% anyway") - .getString()); - ArmourCalculator.slowRate = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Slowdown Rate", 1.0F, - "A modifier for the rate armours slow down movement, increasing this slows you more, decreasing it slows less, just keep it above 0") - .getString()); - - ArmourCalculator.useConfigIndirectDmg = Boolean.parseBoolean(config.get("Misc", "Use config indrect damage", - true, - "Allows config for indirect projectiles, disable if you get problems when getting hit by modded projectiles") - .getString()); - - cogworkGrief = Boolean.parseBoolean(config.get(CATEGORY_COGWORK, "Cogwork Grief", true, - "Should cogwork armour cause envionmental damage when impact landing").getString()); - cogworkFuelUnits = Float.parseFloat( - config.get(CATEGORY_COGWORK, "Cogwork Fuel Modifier", 1F, "Modify the amount of fuel added to cogworks") - .getString()); - EntityCogwork.health_modifier = Float.parseFloat(config.get(CATEGORY_COGWORK, "Cogwork Durability Modifier", - 1.0F, "Modify the relative durability of cogwork armour").getString()); - EntityCogwork.rating_modifier = Float.parseFloat(config.get(CATEGORY_COGWORK, "Cogwork Armour Modifier", 1.0F, - "Modify the relative armour rating of cogwork armour").getString()); - EntityCogwork.allowedBulk = Integer.parseInt(config.get(CATEGORY_COGWORK, "Worn Apparel Restrict", 0, - "-1: can't wear armour with cogwork, 0=Can enter cogwork with light armour, 1=can enter with medium, 2=can enter in any armour") - .getString()); - } + public static final String CATEGORY_BONUS = "Bonuses"; + public static final String CATEGORY_PENALTIES = "Penalties"; + public static final String CATEGORY_COGWORK = "Cogwork Features"; + public static boolean resistArrow; + public static boolean cogworkGrief; + public static float cogworkFuelUnits; + + @Override + protected void loadConfig() { + resistArrow = Boolean.parseBoolean(config.get(CATEGORY_BONUS, "Deflect Arrows", true, + "With this option; arrows have a chance to deflect off armour. It compares the arrow damage and armour rating. Chain and plate have higher rates. Arrows bounced off can hurt enemies") + .getString()); + TacticalManager.arrowDeflectChance = Float.parseFloat(config.get(CATEGORY_BONUS, "Deflect Arrows Modifier", + 1.0F, + "This modifies the chance for arrows to deflect off armour: Increasing this increases the deflect chance, decreasing decreases the chance, 0 means it's impossible") + .getString()); + + TacticalManager.shouldSlow = Boolean.parseBoolean(config.get(CATEGORY_PENALTIES, "Armour Slow Movement", true, + "With this: Heavier armours slow your movement down acrosss both walking and sprinting. Speed is affected by design and material") + .getString()); + TacticalManager.minWeightSpeed = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Min armour weigh speed", 10F, + "The minimal speed percent capable from weight (10 = 10%), MF armours don't go lower than 75% anyway") + .getString()); + ArmourCalculator.slowRate = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Slowdown Rate", 1.0F, + "A modifier for the rate armours slow down movement, increasing this slows you more, decreasing it slows less, just keep it above 0") + .getString()); + + ArmourCalculator.useConfigIndirectDmg = Boolean.parseBoolean(config.get("Misc", "Use config indrect damage", + true, + "Allows config for indirect projectiles, disable if you get problems when getting hit by modded projectiles") + .getString()); + + cogworkGrief = Boolean.parseBoolean(config.get(CATEGORY_COGWORK, "Cogwork Grief", true, + "Should cogwork armour cause envionmental damage when impact landing").getString()); + cogworkFuelUnits = Float.parseFloat( + config.get(CATEGORY_COGWORK, "Cogwork Fuel Modifier", 1F, "Modify the amount of fuel added to cogworks") + .getString()); + EntityCogwork.health_modifier = Float.parseFloat(config.get(CATEGORY_COGWORK, "Cogwork Durability Modifier", + 1.0F, "Modify the relative durability of cogwork armour").getString()); + EntityCogwork.rating_modifier = Float.parseFloat(config.get(CATEGORY_COGWORK, "Cogwork Armour Modifier", 1.0F, + "Modify the relative armour rating of cogwork armour").getString()); + EntityCogwork.allowedBulk = Integer.parseInt(config.get(CATEGORY_COGWORK, "Worn Apparel Restrict", 0, + "-1: can't wear armour with cogwork, 0=Can enter cogwork with light armour, 1=can enter with medium, 2=can enter in any armour") + .getString()); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigClient.java b/src/main/java/minefantasy/mf2/config/ConfigClient.java index 7a784e15..f143ed2f 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigClient.java +++ b/src/main/java/minefantasy/mf2/config/ConfigClient.java @@ -2,160 +2,136 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.block.crafting.BlockAnvilMF; -import minefantasy.mf2.block.crafting.BlockBombBench; -import minefantasy.mf2.block.crafting.BlockBombPress; -import minefantasy.mf2.block.crafting.BlockCarpenter; -import minefantasy.mf2.block.crafting.BlockCrossbowBench; -import minefantasy.mf2.block.crafting.BlockFirepit; -import minefantasy.mf2.block.crafting.BlockResearchStation; -import minefantasy.mf2.block.crafting.BlockRoast; -import minefantasy.mf2.block.crafting.BlockTanningRack; +import minefantasy.mf2.block.crafting.*; import minefantasy.mf2.block.decor.BlockAmmoBox; import minefantasy.mf2.block.decor.BlockComponent; import minefantasy.mf2.block.decor.BlockRack; import minefantasy.mf2.block.decor.BlockTrough; -import minefantasy.mf2.block.refining.BlockBellows; -import minefantasy.mf2.block.refining.BlockBigFurnace; -import minefantasy.mf2.block.refining.BlockBloomery; -import minefantasy.mf2.block.refining.BlockChimney; -import minefantasy.mf2.block.refining.BlockForge; -import minefantasy.mf2.block.refining.BlockQuern; +import minefantasy.mf2.block.refining.*; import minefantasy.mf2.mechanics.EventManagerMF; @SideOnly(Side.CLIENT) public class ConfigClient extends ConfigurationBaseMF { - public static final String CATEGORY_GUI = "Gui/Hud Features"; - - public static final String CATEGORY_AESTHETIC = "Aesthetics"; - - public static boolean playBreath; - public static boolean playHitsound; - public static boolean customModel; - - public static final String GUI_STAMINA = "Stamina Bar Positioning"; - - public static int stam_xOrient; - public static int stam_yOrient; - public static int stam_xPos; - public static int stam_yPos; - public static int stam_direction; - - public static final String GUI_ARATING = "Armour Rating Positioning"; - - public static int AR_xOrient; - public static int AR_yOrient; - public static int AR_xPos; - public static int AR_yPos; - - public static final String GUI_ACOUNT = "Arrow Count Positioning"; - - public static int AC_xOrient; - public static int AC_yOrient; - public static int AC_xPos; - public static int AC_yPos; - - public static final String GUI_CAFUEL = "Clockwork Armour Fuel Positioning"; - - public static int CF_xOrient; - public static int CF_yOrient; - public static int CF_xPos; - public static int CF_yPos; - - public static final String CATEGORY_BLOCK = "Block Render Ids"; - - public static final String CATEGORY_DEBUG = "Debug Info"; - - @Override - protected void loadConfig() { - playBreath = Boolean.parseBoolean(config.get(CATEGORY_AESTHETIC, "Make Breathe Sound", true, - "[With Stamina System] Plays breath sounds when low on energy(sound may be annoying to some...)") - .getString()); - playHitsound = Boolean.parseBoolean(config.get(CATEGORY_AESTHETIC, "Make Hit Sound", true, - "Plays sounds when hitting entities with different items").getString()); - customModel = Boolean - .parseBoolean(config - .get(CATEGORY_AESTHETIC, "Custom Apparel Model", true, - "Determines if some work apparel (like aprons and clothing) use special models") - .getString()); - - stam_xOrient = Integer.parseInt(config.get(GUI_STAMINA, "X Orient", 1, - "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") - .getString()); - stam_yOrient = Integer.parseInt(config.get(GUI_STAMINA, "Y Orient", 1, - "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") - .getString()); - stam_xPos = Integer.parseInt( - config.get(GUI_STAMINA, "X Position", -82, "The Offset value away from the orient (-)left, (+)right") - .getString()); - stam_yPos = Integer.parseInt( - config.get(GUI_STAMINA, "Y Position", -7, "The Offset value away from the orient (-)up, (+)down") - .getString()); - stam_direction = Integer.parseInt(config.get(GUI_STAMINA, "Metre Direction", 1, - "The direction the metre goes down: -1 = left to right, 0 = middle, 1 = right to left (May have subtle flaws in altered directions 1 and 0)") - .getString()); - - AR_xOrient = Integer.parseInt(config.get(GUI_ARATING, "X Orient", -1, - "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") - .getString()); - AR_yOrient = Integer.parseInt(config.get(GUI_ARATING, "Y Orient", -1, - "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") - .getString()); - AR_xPos = Integer.parseInt( - config.get(GUI_ARATING, "X Position", 4, "The Offset value away from the orient (-)left, (+)right") - .getString()); - AR_yPos = Integer.parseInt(config - .get(GUI_ARATING, "Y Position", 4, "The Offset value away from the orient (-)up, (+)down").getString()); - - AC_xOrient = Integer.parseInt(config.get(GUI_ACOUNT, "X Orient", -1, - "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") - .getString()); - AC_yOrient = Integer.parseInt(config.get(GUI_ACOUNT, "Y Orient", -1, - "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") - .getString()); - AC_xPos = Integer.parseInt( - config.get(GUI_ACOUNT, "X Position", 4, "The Offset value away from the orient (-)left, (+)right") - .getString()); - AC_yPos = Integer.parseInt(config - .get(GUI_ACOUNT, "Y Position", 4, "The Offset value away from the orient (-)up, (+)down").getString()); - - CF_xOrient = Integer.parseInt(config.get(GUI_CAFUEL, "X Orient", 1, - "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") - .getString()); - CF_yOrient = Integer.parseInt(config.get(GUI_CAFUEL, "Y Orient", -1, - "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") - .getString()); - CF_xPos = Integer.parseInt( - config.get(GUI_CAFUEL, "X Position", -164, "The Offset value away from the orient (-)left, (+)right") - .getString()); - CF_yPos = Integer.parseInt(config - .get(GUI_CAFUEL, "Y Position", -4, "The Offset value away from the orient (-)up, (+)down").getString()); - - BlockAnvilMF.anvil_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Anvil", -100).getString()); - BlockCarpenter.carpenter_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Carpenter", -101).getString()); - BlockBombBench.bomb_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bomb Bench", -102).getString()); - BlockTanningRack.tanner_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Tanning Rack", -103).getString()); - BlockForge.forge_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Forge", -104).getString()); - BlockBellows.bellows_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bellows", -105).getString()); - BlockResearchStation.research_RI = Integer - .parseInt(config.get(CATEGORY_BLOCK, "ResearchTable", -106).getString()); - BlockBombPress.bpress_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bomb Press", -107).getString()); - BlockTrough.trough_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Trough", -108).getString()); - BlockBloomery.bloomery_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bloomery", -109).getString()); - BlockCrossbowBench.crossBench_RI = Integer - .parseInt(config.get(CATEGORY_BLOCK, "Crossbow Bench", -110).getString()); - BlockQuern.quern_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Quern", -111).getString()); - BlockFirepit.firepit_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Firepit", -112).getString()); - BlockRoast.roast_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Roast", -113).getString()); - BlockBigFurnace.furn_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Big Furnace", -114).getString()); - BlockRack.rack_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Rack", -115).getString()); - BlockAmmoBox.ammo_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Ammo Box", -116).getString()); - BlockChimney.pipe_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Smoke Pipe", -117).getString()); - BlockComponent.component_RI = Integer - .parseInt(config.get(CATEGORY_BLOCK, "Component Storage", -118).getString()); - - EventManagerMF.displayOreDict = Boolean.parseBoolean(config.get(CATEGORY_DEBUG, "Show Debug OreDict", false, - "Displays a list of Ore Dictionary entries to tooltips").getString()); - } + public static final String CATEGORY_GUI = "Gui/Hud Features"; + + public static final String CATEGORY_AESTHETIC = "Aesthetics"; + public static final String GUI_STAMINA = "Stamina Bar Positioning"; + public static final String GUI_ARATING = "Armour Rating Positioning"; + public static final String GUI_ACOUNT = "Arrow Count Positioning"; + public static final String GUI_CAFUEL = "Clockwork Armour Fuel Positioning"; + public static final String CATEGORY_BLOCK = "Block Render Ids"; + public static final String CATEGORY_DEBUG = "Debug Info"; + public static boolean playBreath; + public static boolean playHitsound; + public static boolean customModel; + public static int stam_xOrient; + public static int stam_yOrient; + public static int stam_xPos; + public static int stam_yPos; + public static int stam_direction; + public static int AR_xOrient; + public static int AR_yOrient; + public static int AR_xPos; + public static int AR_yPos; + public static int AC_xOrient; + public static int AC_yOrient; + public static int AC_xPos; + public static int AC_yPos; + public static int CF_xOrient; + public static int CF_yOrient; + public static int CF_xPos; + public static int CF_yPos; + + @Override + protected void loadConfig() { + playBreath = Boolean.parseBoolean(config.get(CATEGORY_AESTHETIC, "Make Breathe Sound", true, + "[With Stamina System] Plays breath sounds when low on energy(sound may be annoying to some...)") + .getString()); + playHitsound = Boolean.parseBoolean(config.get(CATEGORY_AESTHETIC, "Make Hit Sound", true, + "Plays sounds when hitting entities with different items").getString()); + customModel = Boolean + .parseBoolean(config + .get(CATEGORY_AESTHETIC, "Custom Apparel Model", true, + "Determines if some work apparel (like aprons and clothing) use special models") + .getString()); + + stam_xOrient = Integer.parseInt(config.get(GUI_STAMINA, "X Orient", 1, + "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") + .getString()); + stam_yOrient = Integer.parseInt(config.get(GUI_STAMINA, "Y Orient", 1, + "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") + .getString()); + stam_xPos = Integer.parseInt( + config.get(GUI_STAMINA, "X Position", -82, "The Offset value away from the orient (-)left, (+)right") + .getString()); + stam_yPos = Integer.parseInt( + config.get(GUI_STAMINA, "Y Position", -7, "The Offset value away from the orient (-)up, (+)down") + .getString()); + stam_direction = Integer.parseInt(config.get(GUI_STAMINA, "Metre Direction", 1, + "The direction the metre goes down: -1 = left to right, 0 = middle, 1 = right to left (May have subtle flaws in altered directions 1 and 0)") + .getString()); + + AR_xOrient = Integer.parseInt(config.get(GUI_ARATING, "X Orient", -1, + "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") + .getString()); + AR_yOrient = Integer.parseInt(config.get(GUI_ARATING, "Y Orient", -1, + "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") + .getString()); + AR_xPos = Integer.parseInt( + config.get(GUI_ARATING, "X Position", 4, "The Offset value away from the orient (-)left, (+)right") + .getString()); + AR_yPos = Integer.parseInt(config + .get(GUI_ARATING, "Y Position", 4, "The Offset value away from the orient (-)up, (+)down").getString()); + + AC_xOrient = Integer.parseInt(config.get(GUI_ACOUNT, "X Orient", -1, + "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") + .getString()); + AC_yOrient = Integer.parseInt(config.get(GUI_ACOUNT, "Y Orient", -1, + "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") + .getString()); + AC_xPos = Integer.parseInt( + config.get(GUI_ACOUNT, "X Position", 4, "The Offset value away from the orient (-)left, (+)right") + .getString()); + AC_yPos = Integer.parseInt(config + .get(GUI_ACOUNT, "Y Position", 4, "The Offset value away from the orient (-)up, (+)down").getString()); + + CF_xOrient = Integer.parseInt(config.get(GUI_CAFUEL, "X Orient", 1, + "The orientation for the X axis (-1 = left, 0 = middle, 1 = right). Determines what point in the axis to snap to") + .getString()); + CF_yOrient = Integer.parseInt(config.get(GUI_CAFUEL, "Y Orient", -1, + "The orientation for the Y axis (-1 = top, 0 = middle, 1 = bottom). Determines what point in the axis to snap to") + .getString()); + CF_xPos = Integer.parseInt( + config.get(GUI_CAFUEL, "X Position", -164, "The Offset value away from the orient (-)left, (+)right") + .getString()); + CF_yPos = Integer.parseInt(config + .get(GUI_CAFUEL, "Y Position", -4, "The Offset value away from the orient (-)up, (+)down").getString()); + + BlockAnvilMF.anvil_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Anvil", -100).getString()); + BlockCarpenter.carpenter_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Carpenter", -101).getString()); + BlockBombBench.bomb_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bomb Bench", -102).getString()); + BlockTanningRack.tanner_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Tanning Rack", -103).getString()); + BlockForge.forge_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Forge", -104).getString()); + BlockBellows.bellows_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bellows", -105).getString()); + BlockResearchStation.research_RI = Integer + .parseInt(config.get(CATEGORY_BLOCK, "ResearchTable", -106).getString()); + BlockBombPress.bpress_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bomb Press", -107).getString()); + BlockTrough.trough_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Trough", -108).getString()); + BlockBloomery.bloomery_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Bloomery", -109).getString()); + BlockCrossbowBench.crossBench_RI = Integer + .parseInt(config.get(CATEGORY_BLOCK, "Crossbow Bench", -110).getString()); + BlockQuern.quern_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Quern", -111).getString()); + BlockFirepit.firepit_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Firepit", -112).getString()); + BlockRoast.roast_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Roast", -113).getString()); + BlockBigFurnace.furn_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Big Furnace", -114).getString()); + BlockRack.rack_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Rack", -115).getString()); + BlockAmmoBox.ammo_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Ammo Box", -116).getString()); + BlockChimney.pipe_RI = Integer.parseInt(config.get(CATEGORY_BLOCK, "Smoke Pipe", -117).getString()); + BlockComponent.component_RI = Integer + .parseInt(config.get(CATEGORY_BLOCK, "Component Storage", -118).getString()); + + EventManagerMF.displayOreDict = Boolean.parseBoolean(config.get(CATEGORY_DEBUG, "Show Debug OreDict", false, + "Displays a list of Ore Dictionary entries to tooltips").getString()); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigCrafting.java b/src/main/java/minefantasy/mf2/config/ConfigCrafting.java index a9a008ce..b86c0f65 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigCrafting.java +++ b/src/main/java/minefantasy/mf2/config/ConfigCrafting.java @@ -4,20 +4,20 @@ import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFH; public class ConfigCrafting extends ConfigurationBaseMF { - public static final String CATEGORY_REFINING = "Refining"; - public static boolean allowIronResmelt; - public static final String CATEGORY_COOKING = "Cooking"; + public static final String CATEGORY_REFINING = "Refining"; + public static final String CATEGORY_COOKING = "Cooking"; + public static boolean allowIronResmelt; - @Override - protected void loadConfig() { - allowIronResmelt = Boolean.parseBoolean(config - .get(CATEGORY_REFINING, "Allow Iron ingots to make Pig Iron", false, - "If you're not resoureful: you can allow iron ingots to make prepared iron for refining.") - .getString()); - TileEntityBlastFH.maxFurnaceHeight = Integer.parseInt(config.get(CATEGORY_REFINING, "Max Blast Furnace Height", - 16, "The max amount of chambers a blast furnace can read").getString()); - CookRecipe.canCookBasics = Boolean.parseBoolean(config.get(CATEGORY_COOKING, "Cook non-mf food on cooktop", - true, "This means non-mf food cooked in a furnace can work on a cooking plate").getString()); - } + @Override + protected void loadConfig() { + allowIronResmelt = Boolean.parseBoolean(config + .get(CATEGORY_REFINING, "Allow Iron ingots to make Pig Iron", false, + "If you're not resoureful: you can allow iron ingots to make prepared iron for refining.") + .getString()); + TileEntityBlastFH.maxFurnaceHeight = Integer.parseInt(config.get(CATEGORY_REFINING, "Max Blast Furnace Height", + 16, "The max amount of chambers a blast furnace can read").getString()); + CookRecipe.canCookBasics = Boolean.parseBoolean(config.get(CATEGORY_COOKING, "Cook non-mf food on cooktop", + true, "This means non-mf food cooked in a furnace can work on a cooking plate").getString()); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigExperiment.java b/src/main/java/minefantasy/mf2/config/ConfigExperiment.java index 2044560a..30968516 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigExperiment.java +++ b/src/main/java/minefantasy/mf2/config/ConfigExperiment.java @@ -3,42 +3,38 @@ import minefantasy.mf2.api.helpers.ArmourCalculator; public class ConfigExperiment extends ConfigurationBaseMF { - public static final String CATEGORY_EARLY = "Unfinished Features"; - public static final String CATEGORY_ARCHERY = "Archery Features"; - - public static boolean stickArrows; - public static boolean dynamicArrows; - - public static final String CATEGORY_ARMOUR = "Armour Features"; - - public static final String CATEGORY_FOOD = "Experimental: Hunger Modification"; - - public static String debug = ""; - - @Override - protected void loadConfig() { - // RPGElements.isSystemActive = Boolean.parseBoolean(config.get(CATEGORY_EARLY, - // "Enable Skills", false, "This will be a later feature where skills determine - // a number of actions ingame, also will be used to unlock perks").getString()); - stickArrows = Boolean.parseBoolean(config - .get(CATEGORY_ARCHERY, "Save Arrows", true, - "With this active; arrows fired into enemies save, so they can be dropped on death") - .getString()); - dynamicArrows = Boolean.parseBoolean(config.get(CATEGORY_ARCHERY, "Dynamic arrow sync", true, - "This is for whatever hosts the world (singleplayer, or servers); it increases the rate arrows sync their data for smoother rendering for players. This however increases packet traffic. If you have a lot of players on a server or a lot of arrows, disable this to help clean it up") - .getString()); - - String AADesc = "This feature Sets supported armours to calculate weapons differently: \n" - + "Damage is divided into cutting and blunt, and MF armours will alter their ratings depending \n" - + "Both weapons and ranged entities can be registered to deliver a certain ratio \n" - + "Armours can't be registered, all coding needs to be hardwired into the code themselves \n" - + "So this means mod armours can not support this, they need to have a system built-in to their own coding" - + "But this ratio only effects armours that are told to. so it should have no effect on unsupported armours, being balanced as usual \n" - + "Undefined weapon damages however have no effect either, but it will try and guess \n" - + "This will also change change axes and blunt weapons to match blade damage (since armour is vulnerable to blunt"; - ArmourCalculator.advancedDamageTypes = Boolean - .parseBoolean(config.get(CATEGORY_ARMOUR, "Advanced Armour Calculator", true, AADesc).getString()); - debug = config.get("###Enable Debug Mode###", "Debug Passcode", "").getString(); - } + public static final String CATEGORY_EARLY = "Unfinished Features"; + public static final String CATEGORY_ARCHERY = "Archery Features"; + public static final String CATEGORY_ARMOUR = "Armour Features"; + public static final String CATEGORY_FOOD = "Experimental: Hunger Modification"; + public static boolean stickArrows; + public static boolean dynamicArrows; + public static String debug = ""; + + @Override + protected void loadConfig() { + // RPGElements.isSystemActive = Boolean.parseBoolean(config.get(CATEGORY_EARLY, + // "Enable Skills", false, "This will be a later feature where skills determine + // a number of actions ingame, also will be used to unlock perks").getString()); + stickArrows = Boolean.parseBoolean(config + .get(CATEGORY_ARCHERY, "Save Arrows", true, + "With this active; arrows fired into enemies save, so they can be dropped on death") + .getString()); + dynamicArrows = Boolean.parseBoolean(config.get(CATEGORY_ARCHERY, "Dynamic arrow sync", true, + "This is for whatever hosts the world (singleplayer, or servers); it increases the rate arrows sync their data for smoother rendering for players. This however increases packet traffic. If you have a lot of players on a server or a lot of arrows, disable this to help clean it up") + .getString()); + + String AADesc = "This feature Sets supported armours to calculate weapons differently: \n" + + "Damage is divided into cutting and blunt, and MF armours will alter their ratings depending \n" + + "Both weapons and ranged entities can be registered to deliver a certain ratio \n" + + "Armours can't be registered, all coding needs to be hardwired into the code themselves \n" + + "So this means mod armours can not support this, they need to have a system built-in to their own coding" + + "But this ratio only effects armours that are told to. so it should have no effect on unsupported armours, being balanced as usual \n" + + "Undefined weapon damages however have no effect either, but it will try and guess \n" + + "This will also change change axes and blunt weapons to match blade damage (since armour is vulnerable to blunt"; + ArmourCalculator.advancedDamageTypes = Boolean + .parseBoolean(config.get(CATEGORY_ARMOUR, "Advanced Armour Calculator", true, AADesc).getString()); + debug = config.get("###Enable Debug Mode###", "Debug Passcode", "").getString(); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigFarming.java b/src/main/java/minefantasy/mf2/config/ConfigFarming.java index 8adb057d..4110f297 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigFarming.java +++ b/src/main/java/minefantasy/mf2/config/ConfigFarming.java @@ -3,24 +3,24 @@ import minefantasy.mf2.farming.FarmingHelper; public class ConfigFarming extends ConfigurationBaseMF { - public static final String CATEGORY_BONUS = "Bonuses"; + public static final String CATEGORY_BONUS = "Bonuses"; - public static final String CATEGORY_PENALTIES = "Penalties"; + public static final String CATEGORY_PENALTIES = "Penalties"; - public static final String CATEGORY_MISC = "Other Features"; + public static final String CATEGORY_MISC = "Other Features"; - @Override - protected void loadConfig() { - FarmingHelper.isEnabled = Boolean.parseBoolean( - config.get("##Enable System##", "isEnabled", true, "This toggles the farming mechanics").getString()); + @Override + protected void loadConfig() { + FarmingHelper.isEnabled = Boolean.parseBoolean( + config.get("##Enable System##", "isEnabled", true, "This toggles the farming mechanics").getString()); - FarmingHelper.hoeFailChanceCfg = Float.parseFloat(config - .get(CATEGORY_PENALTIES, "Hoe Fail Modifier", 1.0F, "Modifies the rate for hoes to fail making fields") - .getString()); - FarmingHelper.farmBreakCfg = Float.parseFloat(config - .get(CATEGORY_PENALTIES, "Harvest Ruin Modifier", 1.0F, - "Modifies the rate for ruining fields when harvesting (scythes increase this chance)") - .getString()); - } + FarmingHelper.hoeFailChanceCfg = Float.parseFloat(config + .get(CATEGORY_PENALTIES, "Hoe Fail Modifier", 1.0F, "Modifies the rate for hoes to fail making fields") + .getString()); + FarmingHelper.farmBreakCfg = Float.parseFloat(config + .get(CATEGORY_PENALTIES, "Harvest Ruin Modifier", 1.0F, + "Modifies the rate for ruining fields when harvesting (scythes increase this chance)") + .getString()); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigHardcore.java b/src/main/java/minefantasy/mf2/config/ConfigHardcore.java index 8da5d169..b7d9cc96 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigHardcore.java +++ b/src/main/java/minefantasy/mf2/config/ConfigHardcore.java @@ -8,101 +8,95 @@ import minefantasy.mf2.mechanics.CombatMechanics; public class ConfigHardcore extends ConfigurationBaseMF { - public static final String CATEGORY_CRAFTING = "1: HARDCORE CRAFTING"; - public static boolean HCCreduceIngots = true; - public static boolean HCChotBurn = true; - public static boolean HCCWeakItems = true; - public static boolean HCCallowRocks = true; - public static boolean HCCRemoveCraft = true; - public static boolean HCCRemoveBooksCraft = false; - public static boolean HCCRemoveTalismansCraft = false; + public static final String CATEGORY_CRAFTING = "1: HARDCORE CRAFTING"; + public static final String CATEGORY_RESEARCH = "2: Research"; + public static final String CATEGORY_FOOD = "3: Food and Hunting"; + public static final String CATEGORY_MOB = "4: Monster Upgrades"; + public static final String CATEGORY_USER = "5: Player Debuffs"; + public static boolean HCCreduceIngots = true; + public static boolean HCChotBurn = true; + public static boolean HCCWeakItems = true; + public static boolean HCCallowRocks = true; + public static boolean HCCRemoveCraft = true; + public static boolean HCCRemoveBooksCraft = false; + public static boolean HCCRemoveTalismansCraft = false; + public static boolean hunterKnife; + public static boolean lessHunt; + public static boolean preventCook; + public static boolean upgradeZombieWep; + public static float zombieWepChance; + public static boolean fastZombies; + public static boolean critLimp; - public static final String CATEGORY_RESEARCH = "2: Research"; + @Override + protected void loadConfig() { + HCCreduceIngots = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Hardcore Ingots", true, + "Some Metals (Like iron, steel and direct ore smelts) Must be worked manually on an anvil rather than smelted. They may also cost more! Big furnace still works.") + .getString()); + HCChotBurn = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Hot burns", true, + "You cannot hold hot items (apron or not), tongs must be used.").getString()); + Heatable.HCCquenchRuin = Boolean.parseBoolean(config + .get(CATEGORY_CRAFTING, "Hardcore Quench", true, "Hot items can be damaged if a trough is not used.") + .getString()); + HCCWeakItems = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Weaken Basic items", true, + "This will significantly reduce the durability of basic items (made on basic crafting table), they can still be crafted but are practically useless.") + .getString()); + HCCallowRocks = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Allow Stone-Age", true, + "Allows punching stone for sharp rocks, and using them on leaves for sticks/vines: These make primitive stone tools") + .getString()); + HCCRemoveCraft = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Remove Recipes", true, + "Some recipes (Such as Bread, or Flint and Steel) will be removed, since MF has its own recipe for such items.") + .getString()); + HCCRemoveBooksCraft = Boolean + .parseBoolean(config + .get(CATEGORY_CRAFTING, "Remove Books Recipes", false, + "Skill books recipes will be disabled, but you still can find them it the world.") + .getString()); + HCCRemoveTalismansCraft = Boolean.parseBoolean(config + .get(CATEGORY_CRAFTING, "Remove Talismans Recipes", false, + "Research talismans recipes will be disabled, but you still can find them it the world.") + .getString()); - public static final String CATEGORY_FOOD = "3: Food and Hunting"; + ResearchLogic.knowledgelyr = Integer.parseInt(config.get(CATEGORY_RESEARCH, "###CHANGE RESEARCH ID###", 0, + "This changes the research ID, removing all entries").getString()); + InformationBase.unlockAll = Boolean.parseBoolean(config.get(CATEGORY_RESEARCH, "Unlock entries", false, + "If you don't want to research, this will unlock all entries.").getString()); + InformationBase.easyResearch = Boolean.parseBoolean(config.get(CATEGORY_RESEARCH, "Baby-Mode Research", false, + "This removes the process of examining artefacts, research is unlocked by clicking entries in the book.") + .getString()); - public static boolean hunterKnife; - public static boolean lessHunt; - public static boolean preventCook; + hunterKnife = Boolean.parseBoolean(config.get(CATEGORY_FOOD, "Restrict to hunting weapon", false, + "This option means animals ONLY drop meat and hide when killed with a hunting weapon such as a knife, only the killing blow counts") + .getString()); + lessHunt = Boolean.parseBoolean(config + .get(CATEGORY_FOOD, "Reduce Meat Drops", false, + "This will alter the stack size of animal meat drops, meaning they only drop 1 every time") + .getString()); + preventCook = Boolean.parseBoolean( + config.get(CATEGORY_FOOD, "Prevent furnace food", false, "Stop food from being cooked in a furnace") + .getString()); + HungerSystemMF.slowdownRate = Integer.parseInt(config.get(CATEGORY_FOOD, "Hunger slow rate", 3, + "how many added points per haunch is slows by. Default is 3: meaning it's takes 3 additional haunches to remove 1, meaning each haunch takes 4 times to be removed") + .getString()); + TileEntityRoast.enableOverheat = Boolean + .parseBoolean(config + .get(CATEGORY_FOOD, "Burn at high temperature", true, + "Cooking food on a stove or oven will automatically burn at high temperatures") + .getString()); - public static final String CATEGORY_MOB = "4: Monster Upgrades"; - - public static boolean upgradeZombieWep; - public static float zombieWepChance; - public static boolean fastZombies; - - public static final String CATEGORY_USER = "5: Player Debuffs"; - public static boolean critLimp; - - @Override - protected void loadConfig() { - HCCreduceIngots = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Hardcore Ingots", true, - "Some Metals (Like iron, steel and direct ore smelts) Must be worked manually on an anvil rather than smelted. They may also cost more! Big furnace still works.") - .getString()); - HCChotBurn = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Hot burns", true, - "You cannot hold hot items (apron or not), tongs must be used.").getString()); - Heatable.HCCquenchRuin = Boolean.parseBoolean(config - .get(CATEGORY_CRAFTING, "Hardcore Quench", true, "Hot items can be damaged if a trough is not used.") - .getString()); - HCCWeakItems = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Weaken Basic items", true, - "This will significantly reduce the durability of basic items (made on basic crafting table), they can still be crafted but are practically useless.") - .getString()); - HCCallowRocks = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Allow Stone-Age", true, - "Allows punching stone for sharp rocks, and using them on leaves for sticks/vines: These make primitive stone tools") - .getString()); - HCCRemoveCraft = Boolean.parseBoolean(config.get(CATEGORY_CRAFTING, "Remove Recipes", true, - "Some recipes (Such as Bread, or Flint and Steel) will be removed, since MF has its own recipe for such items.") - .getString()); - HCCRemoveBooksCraft = Boolean - .parseBoolean(config - .get(CATEGORY_CRAFTING, "Remove Books Recipes", false, - "Skill books recipes will be disabled, but you still can find them it the world.") - .getString()); - HCCRemoveTalismansCraft = Boolean.parseBoolean(config - .get(CATEGORY_CRAFTING, "Remove Talismans Recipes", false, - "Research talismans recipes will be disabled, but you still can find them it the world.") - .getString()); - - ResearchLogic.knowledgelyr = Integer.parseInt(config.get(CATEGORY_RESEARCH, "###CHANGE RESEARCH ID###", 0, - "This changes the research ID, removing all entries").getString()); - InformationBase.unlockAll = Boolean.parseBoolean(config.get(CATEGORY_RESEARCH, "Unlock entries", false, - "If you don't want to research, this will unlock all entries.").getString()); - InformationBase.easyResearch = Boolean.parseBoolean(config.get(CATEGORY_RESEARCH, "Baby-Mode Research", false, - "This removes the process of examining artefacts, research is unlocked by clicking entries in the book.") - .getString()); - - hunterKnife = Boolean.parseBoolean(config.get(CATEGORY_FOOD, "Restrict to hunting weapon", false, - "This option means animals ONLY drop meat and hide when killed with a hunting weapon such as a knife, only the killing blow counts") - .getString()); - lessHunt = Boolean.parseBoolean(config - .get(CATEGORY_FOOD, "Reduce Meat Drops", false, - "This will alter the stack size of animal meat drops, meaning they only drop 1 every time") - .getString()); - preventCook = Boolean.parseBoolean( - config.get(CATEGORY_FOOD, "Prevent furnace food", false, "Stop food from being cooked in a furnace") - .getString()); - HungerSystemMF.slowdownRate = Integer.parseInt(config.get(CATEGORY_FOOD, "Hunger slow rate", 3, - "how many added points per haunch is slows by. Default is 3: meaning it's takes 3 additional haunches to remove 1, meaning each haunch takes 4 times to be removed") - .getString()); - TileEntityRoast.enableOverheat = Boolean - .parseBoolean(config - .get(CATEGORY_FOOD, "Burn at high temperature", true, - "Cooking food on a stove or oven will automatically burn at high temperatures") - .getString()); - - upgradeZombieWep = Boolean.parseBoolean(config.get(CATEGORY_MOB, "Give Zombie Weapon", true, - "Zombies have a chance on spawning with forged iron weapons, It also controls some zombies having MF armour") - .getString()); - zombieWepChance = Float.parseFloat(config.get(CATEGORY_MOB, "Zombie Weapon Spawn Chance Modifier", 1.0F, - "Chance for Zombies to have forged weapons, increased with difficulty").getString()); - fastZombies = Boolean.parseBoolean(config - .get(CATEGORY_MOB, "Speed up zombies", true, - "Speed up zombies (Sure it's not as real.. but it makes them a bit more dangerous)") - .getString()); - critLimp = Boolean.parseBoolean(config.get(CATEGORY_MOB, "Critical Injury Limp", true, - "This means when you're badly wounded, you slow down and limp").getString()); - CombatMechanics.swordSkeleton = Boolean.parseBoolean( - config.get(CATEGORY_MOB, "Skeleton Swords", true, "Some Skeletons use swords").getString()); - } + upgradeZombieWep = Boolean.parseBoolean(config.get(CATEGORY_MOB, "Give Zombie Weapon", true, + "Zombies have a chance on spawning with forged iron weapons, It also controls some zombies having MF armour") + .getString()); + zombieWepChance = Float.parseFloat(config.get(CATEGORY_MOB, "Zombie Weapon Spawn Chance Modifier", 1.0F, + "Chance for Zombies to have forged weapons, increased with difficulty").getString()); + fastZombies = Boolean.parseBoolean(config + .get(CATEGORY_MOB, "Speed up zombies", true, + "Speed up zombies (Sure it's not as real.. but it makes them a bit more dangerous)") + .getString()); + critLimp = Boolean.parseBoolean(config.get(CATEGORY_MOB, "Critical Injury Limp", true, + "This means when you're badly wounded, you slow down and limp").getString()); + CombatMechanics.swordSkeleton = Boolean.parseBoolean( + config.get(CATEGORY_MOB, "Skeleton Swords", true, "Some Skeletons use swords").getString()); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigIntegration.java b/src/main/java/minefantasy/mf2/config/ConfigIntegration.java index d1938f3e..27ea7feb 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigIntegration.java +++ b/src/main/java/minefantasy/mf2/config/ConfigIntegration.java @@ -1,32 +1,31 @@ package minefantasy.mf2.config; -import java.util.Arrays; - import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; -public class ConfigIntegration extends ConfigurationBaseMF { +import java.util.Arrays; - public static final String CATEGORY_MODS = "Cross-mod Integration"; - public static boolean neiIntegration; - public static boolean mtIntegration; +public class ConfigIntegration extends ConfigurationBaseMF { - public static final String CATEGORY_BUKKIT = "Bukkit Integration"; - public static String[] pluginsList = new String[0]; + public static final String CATEGORY_MODS = "Cross-mod Integration"; + public static final String CATEGORY_BUKKIT = "Bukkit Integration"; + public static boolean neiIntegration; + public static boolean mtIntegration; + public static String[] pluginsList = new String[0]; - @Override - protected void loadConfig() { - neiIntegration = Boolean.parseBoolean( - config.get(CATEGORY_MODS, "NEI Integration", true, "Enable Not Enough Items integration").getString()); - mtIntegration = Boolean.parseBoolean( - config.get(CATEGORY_MODS, "MT Integration", true, "Enable MineTweaker (CraftTweaker) integration") - .getString()); + @Override + protected void loadConfig() { + neiIntegration = Boolean.parseBoolean( + config.get(CATEGORY_MODS, "NEI Integration", true, "Enable Not Enough Items integration").getString()); + mtIntegration = Boolean.parseBoolean( + config.get(CATEGORY_MODS, "MT Integration", true, "Enable MineTweaker (CraftTweaker) integration") + .getString()); - if (FMLCommonHandler.instance().getSide() == Side.SERVER) { - pluginsList = config.get(CATEGORY_BUKKIT, "Plugins List", new String[] { "WorldGuard" }, - "This registers listeners of Bukkit plugins (if avaliable). Here you are should list all protection-related plugins (e.g WorldGuard). You are can find correct plugin name in its plugin.yml (inside plugin's .jar file)") - .getStringList(); - Arrays.sort(pluginsList); - } - } + if (FMLCommonHandler.instance().getSide() == Side.SERVER) { + pluginsList = config.get(CATEGORY_BUKKIT, "Plugins List", new String[]{"WorldGuard"}, + "This registers listeners of Bukkit plugins (if avaliable). Here you are should list all protection-related plugins (e.g WorldGuard). You are can find correct plugin name in its plugin.yml (inside plugin's .jar file)") + .getStringList(); + Arrays.sort(pluginsList); + } + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigItemRegistry.java b/src/main/java/minefantasy/mf2/config/ConfigItemRegistry.java index ef1f3a2b..9d144067 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigItemRegistry.java +++ b/src/main/java/minefantasy/mf2/config/ConfigItemRegistry.java @@ -1,7 +1,5 @@ package minefantasy.mf2.config; -import java.util.Arrays; - import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.armour.CustomArmourEntry; import minefantasy.mf2.api.armour.CustomDamageRatioEntry; @@ -10,338 +8,333 @@ import minefantasy.mf2.util.MFLogUtil; import net.minecraft.item.Item; +import java.util.Arrays; + public class ConfigItemRegistry extends ConfigurationBaseMF { - public static final String CATEGORY_ARMOUR = "Armour List"; - - public static String[] armourListAC = new String[0]; - - public static final String CATEGORY_FARM = "Farming"; - - public static String[] hoeList = new String[0]; - - public static final String CATEGORY_TOOL = "Tools"; - - public static String[] crafterList = new String[0]; - - public static final String CATEGORY_WEPS = "Weapon Register"; - - public static String[] customDamagerList = new String[0]; - public static String[] customDamagerEntityList = new String[0]; - - @Override - protected void loadConfig() { - // Weight - - String AAdesc = "This will register items under a certain 'Design' calculating the variables itself.\n Each entry has it's own line:\n" - + "Order itemid|Design|WeightGroup|WeightModifier \n" - + "The WeightModifier alters the weight for heavier or lighter materials keep it at 1.0 unless you have a special material (like mithril and adamamantium)\n" - + "Designs can be any that are registered: MineFantasy designs are 'clothing', 'leather', 'mail', 'default'(that's just basic metal armour), and 'plate'\n" - + "WeightGroup refers to whether it is light medium or heavy armour \n" - + "EXAMPLE (This is what vanilla gold is registered under) \n" - + "minecraft:golden_helmet|default|medium|2.0 \n" + "minecraft:golden_chestplate|default|medium|2.0 \n" - + "minecraft:golden_leggings|default|medium|2.0 \n" + "minecraft:golden_boots|default|medium|2.0 \n" - + "The 2.0 means it is 2x heavier than other vanilla armours \n" - + "This does not override existing MF armours \n"; - - armourListAC = config.get(CATEGORY_ARMOUR, "Auto-Armour Registry", new String[0], AAdesc).getStringList(); - Arrays.sort(armourListAC); - - // Hoes - - String hoeDesc = "This Registers Hoe items to an efficiency level: (It uses the same variable as efficiency, you may need to find that out first, by default: it should be able to guess it:\n" - + "Order itemid|efficicncy \n" - + "Efficicney is a variable that goes into play with the failure chance, higher efficicnecy has easier tiling\n"; - - hoeList = config.get(CATEGORY_FARM, "Hoe Registry", new String[0], hoeDesc).getStringList(); - Arrays.sort(hoeList); - - // Crafters - - String craftDesc = "This Registers items to a tool type and efficiency (such as hammer, hvyHammer, knife, saw, etc):\n" - + "Order itemid|efficiency|tier|tooltype \n" - + "tooltype can be hammer, hvyHammer, knife, shears, needle, spoon, mallet, saw, spanner \n" - + "efficiency is the measure of how fast it works (similar to dig speed)"; - - crafterList = config.get(CATEGORY_TOOL, "Crafter Registry", new String[0], craftDesc).getStringList(); - Arrays.sort(crafterList); - - // Weapons - - String damageDesc = "[Experimental] This registers weapons for the damage variable mechanics implemented by option. \n" - + "Though mod-added armours have absolutely no support, and never can without being specifically coded to \n" - + "MineFantasy armours will take these variables and function differently on the values. But weapon items can \n" - + "be added to the list: Put each entry on it's own line set out like this: \n" - + "id|cutting|pierce|blunt \n" - + "id is the item id as a string (you need to find it out yourself), cutting and blunt are the ratio. \n" - + "EXAMPLE (for example... making a stick to piercing damage) \n" + "minecraft:stick|0|1.0|0 \n" - + "The difference between the ratio is what determines damage 1|0 means 100% cutting damage, 3|1 means it's 3 cutting to 1 blunt (or 75%, 25%). use whatever numbers you need to make the ratio."; - - customDamagerList = config.get(CATEGORY_WEPS, "Custom Damage Ratios", new String[0], damageDesc) - .getStringList(); - Arrays.sort(customDamagerList); - - String damageEDesc = "Similar method to 'Custom Damage Ratios' only with entities, This is for registering things like arrows, same format only with the entity registry name (usually modid:name)"; - - customDamagerEntityList = config.get(CATEGORY_WEPS, "Custom Entity Damage Ratios", new String[0], damageEDesc) - .getStringList(); - Arrays.sort(customDamagerEntityList); - } - - public static void readCustoms() { - MFLogUtil.logDebug("Loading Custom Item Entries from config..."); - try { - for (String s : armourListAC) { - breakdownLineForAutoarmour(s); - } - for (String s : hoeList) { - breakdownLineForHoe(s); - } - for (String s : crafterList) { - breakdownLineForCrafter(s); - } - for (String s : customDamagerList) { - breakdownLineForDamage(s); - } - for (String s : customDamagerEntityList) { - breakdownLineForDamage(s); - } - } catch (Exception e) { - MFLogUtil.logWarn("Failed to load Custom Item Entries from config. Check the config file"); - } - } - - private static void registerArmourclassEntry(Item piece, String design, float weight) { - ArmourDesign AC = getClassFor(design); - if (AC == null) { - MFLogUtil.logWarn( - "Could not define armour design '" + design + "' for item id: " + Item.getIdFromItem(piece)); - return; - } - CustomArmourEntry.registerItem(piece, AC, weight, AC.getGroup()); - } - - private static ArmourDesign getClassFor(String name) { - ArmourDesign design = ArmourDesign.designs.get(name); - if (design != null) { - return design; - } - return null; - } - - private static void breakdownLineForAutoarmour(String config) { - String temp = ""; - int phase = 0; - String id = ""; - ArmourDesign AD = null; - String weightGroup = "medium"; - float weight = 1.0F; - for (int a = 0; a < config.length(); a++) { - if (a == config.length() - 1) { - temp = temp + config.charAt(a); - } - if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { - if (phase == 0) { - id = temp; - temp = ""; - phase++; - } else if (phase == 1) { - ArmourDesign design = getClassFor(temp); - if (design != null) { - AD = design; - } - temp = ""; - phase++; - } else if (phase == 2) { - weightGroup = temp; - temp = ""; - phase++; - } else if (phase == 3) { - weight = Float.valueOf(temp); - temp = ""; - - Item piece = getItemFromString(id); - if (AD != null && piece != null) { - CustomArmourEntry.registerItem(piece, AD, weight, weightGroup); - MFLogUtil.logDebug("Added Armour: " + piece.getUnlocalizedName() + "(" + AD.getName() + ") To " - + weightGroup + " armour category... Modified weight is " + weight); - } - phase = 0; - } - } else { - if (config.charAt(a) != " ".charAt(0)) { - temp = temp + config.charAt(a); - } - } - } - } - - private static void breakdownLineForHoe(String config) { - String temp = ""; - int phase = 0; - String id = ""; - float eff = 6.0F; - - for (int a = 0; a < config.length(); a++) { - if (a == config.length() - 1) { - temp = temp + config.charAt(a); - } - if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { - if (phase == 0) { - id = temp; - temp = ""; - phase++; - } else if (phase == 1) { - eff = Float.valueOf(temp); - temp = ""; - - Item hoe = getItemFromString(id); - if (hoe != null) { - CustomHoeEntry.registerItem(hoe, eff); - MFLogUtil.logDebug("Added Hoe: " + id + " With Efficiency " + eff); - } - phase = 0; - } - } else { - if (config.charAt(a) != " ".charAt(0)) { - temp = temp + config.charAt(a); - } - } - } - } - - private static void breakdownLineForCrafter(String config) { - String temp = ""; - int phase = 0; - String id = ""; - String type = ""; - int tier = -1; - float efficiency = 2.0F; - - for (int a = 0; a < config.length(); a++) { - if (a == config.length() - 1) { - temp = temp + config.charAt(a); - } - if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { - if (phase == 0) { - id = temp; - temp = ""; - phase++; - } else if (phase == 1) { - efficiency = Float.valueOf(temp); - temp = ""; - phase++; - } else if (phase == 2) { - tier = Integer.valueOf(temp); - temp = ""; - phase++; - } else if (phase == 3) { - type = temp; - temp = ""; - - Item hoe = getItemFromString(id); - if (hoe != null) { - CustomCrafterEntry.registerItem(hoe, type, efficiency, tier); - MFLogUtil.logDebug("Added Crafter: " + id + " as " + type + " for efficiency " + efficiency); - } - phase = 0; - } - } else { - if (config.charAt(a) != " ".charAt(0)) { - temp = temp + config.charAt(a); - } - } - } - } - - private static void breakdownLineForDamage(String config) { - String temp = ""; - int phase = 0; - String id = ""; - float cut = 0; - float blunt = 0; - float pierce = 0; - - for (int a = 0; a < config.length(); a++) { - if (a == config.length() - 1) { - temp = temp + config.charAt(a); - } - if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { - if (phase == 0) { - id = temp; - temp = ""; - phase++; - } else if (phase == 1) { - cut = Float.valueOf(temp); - temp = ""; - phase++; - } else if (phase == 2) { - pierce = Float.valueOf(temp); - temp = ""; - phase++; - } else if (phase == 3) { - blunt = Float.valueOf(temp); - temp = ""; - - Item weapon = getItemFromString(id); - if (weapon != null) { - CustomDamageRatioEntry.registerItem(weapon, new float[] { cut, blunt, pierce }); - MFLogUtil.logDebug( - "Added Custom weapon: " + id + " With Ratio " + cut + ":" + pierce + ":" + blunt); - } - phase = 0; - } - } else { - if (config.charAt(a) != " ".charAt(0)) { - temp = temp + config.charAt(a); - } - } - } - } - - private static void breakdownLineForDamageEntity(String config) { - String temp = ""; - int phase = 0; - String id = ""; - float cut = 0; - float pierce = 0; - float blunt = 0; - - for (int a = 0; a < config.length(); a++) { - if (a == config.length() - 1) { - temp = temp + config.charAt(a); - } - if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { - if (phase == 0) { - id = temp; - temp = ""; - phase++; - } else if (phase == 1) { - cut = Float.valueOf(temp); - temp = ""; - phase++; - } else if (phase == 2) { - pierce = Float.valueOf(temp); - temp = ""; - phase++; - } else if (phase == 3) { - blunt = Float.valueOf(temp); - temp = ""; - - CustomDamageRatioEntry.registerEntity(id, new float[] { cut, blunt, pierce }); - MFLogUtil - .logDebug("Added Custom entity: " + id + " With Ratio " + cut + ":" + pierce + ":" + blunt); - phase = 0; - } - } else { - if (config.charAt(a) != " ".charAt(0)) { - temp = temp + config.charAt(a); - } - } - } - } - - private static Item getItemFromString(String id) { - Object object = Item.itemRegistry.getObject(id); - return object != null && object instanceof Item ? (Item) object : null; - } + public static final String CATEGORY_ARMOUR = "Armour List"; + public static final String CATEGORY_FARM = "Farming"; + public static final String CATEGORY_TOOL = "Tools"; + public static final String CATEGORY_WEPS = "Weapon Register"; + public static String[] armourListAC = new String[0]; + public static String[] hoeList = new String[0]; + public static String[] crafterList = new String[0]; + public static String[] customDamagerList = new String[0]; + public static String[] customDamagerEntityList = new String[0]; + + public static void readCustoms() { + MFLogUtil.logDebug("Loading Custom Item Entries from config..."); + try { + for (String s : armourListAC) { + breakdownLineForAutoarmour(s); + } + for (String s : hoeList) { + breakdownLineForHoe(s); + } + for (String s : crafterList) { + breakdownLineForCrafter(s); + } + for (String s : customDamagerList) { + breakdownLineForDamage(s); + } + for (String s : customDamagerEntityList) { + breakdownLineForDamage(s); + } + } catch (Exception e) { + MFLogUtil.logWarn("Failed to load Custom Item Entries from config. Check the config file"); + } + } + + private static void registerArmourclassEntry(Item piece, String design, float weight) { + ArmourDesign AC = getClassFor(design); + if (AC == null) { + MFLogUtil.logWarn( + "Could not define armour design '" + design + "' for item id: " + Item.getIdFromItem(piece)); + return; + } + CustomArmourEntry.registerItem(piece, AC, weight, AC.getGroup()); + } + + private static ArmourDesign getClassFor(String name) { + ArmourDesign design = ArmourDesign.designs.get(name); + if (design != null) { + return design; + } + return null; + } + + private static void breakdownLineForAutoarmour(String config) { + String temp = ""; + int phase = 0; + String id = ""; + ArmourDesign AD = null; + String weightGroup = "medium"; + float weight = 1.0F; + for (int a = 0; a < config.length(); a++) { + if (a == config.length() - 1) { + temp = temp + config.charAt(a); + } + if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { + if (phase == 0) { + id = temp; + temp = ""; + phase++; + } else if (phase == 1) { + ArmourDesign design = getClassFor(temp); + if (design != null) { + AD = design; + } + temp = ""; + phase++; + } else if (phase == 2) { + weightGroup = temp; + temp = ""; + phase++; + } else if (phase == 3) { + weight = Float.valueOf(temp); + temp = ""; + + Item piece = getItemFromString(id); + if (AD != null && piece != null) { + CustomArmourEntry.registerItem(piece, AD, weight, weightGroup); + MFLogUtil.logDebug("Added Armour: " + piece.getUnlocalizedName() + "(" + AD.getName() + ") To " + + weightGroup + " armour category... Modified weight is " + weight); + } + phase = 0; + } + } else { + if (config.charAt(a) != " ".charAt(0)) { + temp = temp + config.charAt(a); + } + } + } + } + + private static void breakdownLineForHoe(String config) { + String temp = ""; + int phase = 0; + String id = ""; + float eff = 6.0F; + + for (int a = 0; a < config.length(); a++) { + if (a == config.length() - 1) { + temp = temp + config.charAt(a); + } + if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { + if (phase == 0) { + id = temp; + temp = ""; + phase++; + } else if (phase == 1) { + eff = Float.valueOf(temp); + temp = ""; + + Item hoe = getItemFromString(id); + if (hoe != null) { + CustomHoeEntry.registerItem(hoe, eff); + MFLogUtil.logDebug("Added Hoe: " + id + " With Efficiency " + eff); + } + phase = 0; + } + } else { + if (config.charAt(a) != " ".charAt(0)) { + temp = temp + config.charAt(a); + } + } + } + } + + private static void breakdownLineForCrafter(String config) { + String temp = ""; + int phase = 0; + String id = ""; + String type = ""; + int tier = -1; + float efficiency = 2.0F; + + for (int a = 0; a < config.length(); a++) { + if (a == config.length() - 1) { + temp = temp + config.charAt(a); + } + if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { + if (phase == 0) { + id = temp; + temp = ""; + phase++; + } else if (phase == 1) { + efficiency = Float.valueOf(temp); + temp = ""; + phase++; + } else if (phase == 2) { + tier = Integer.valueOf(temp); + temp = ""; + phase++; + } else if (phase == 3) { + type = temp; + temp = ""; + + Item hoe = getItemFromString(id); + if (hoe != null) { + CustomCrafterEntry.registerItem(hoe, type, efficiency, tier); + MFLogUtil.logDebug("Added Crafter: " + id + " as " + type + " for efficiency " + efficiency); + } + phase = 0; + } + } else { + if (config.charAt(a) != " ".charAt(0)) { + temp = temp + config.charAt(a); + } + } + } + } + + private static void breakdownLineForDamage(String config) { + String temp = ""; + int phase = 0; + String id = ""; + float cut = 0; + float blunt = 0; + float pierce = 0; + + for (int a = 0; a < config.length(); a++) { + if (a == config.length() - 1) { + temp = temp + config.charAt(a); + } + if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { + if (phase == 0) { + id = temp; + temp = ""; + phase++; + } else if (phase == 1) { + cut = Float.valueOf(temp); + temp = ""; + phase++; + } else if (phase == 2) { + pierce = Float.valueOf(temp); + temp = ""; + phase++; + } else if (phase == 3) { + blunt = Float.valueOf(temp); + temp = ""; + + Item weapon = getItemFromString(id); + if (weapon != null) { + CustomDamageRatioEntry.registerItem(weapon, new float[]{cut, blunt, pierce}); + MFLogUtil.logDebug( + "Added Custom weapon: " + id + " With Ratio " + cut + ":" + pierce + ":" + blunt); + } + phase = 0; + } + } else { + if (config.charAt(a) != " ".charAt(0)) { + temp = temp + config.charAt(a); + } + } + } + } + + private static void breakdownLineForDamageEntity(String config) { + String temp = ""; + int phase = 0; + String id = ""; + float cut = 0; + float pierce = 0; + float blunt = 0; + + for (int a = 0; a < config.length(); a++) { + if (a == config.length() - 1) { + temp = temp + config.charAt(a); + } + if (config.charAt(a) == "|".charAt(0) || a == config.length() - 1) { + if (phase == 0) { + id = temp; + temp = ""; + phase++; + } else if (phase == 1) { + cut = Float.valueOf(temp); + temp = ""; + phase++; + } else if (phase == 2) { + pierce = Float.valueOf(temp); + temp = ""; + phase++; + } else if (phase == 3) { + blunt = Float.valueOf(temp); + temp = ""; + + CustomDamageRatioEntry.registerEntity(id, new float[]{cut, blunt, pierce}); + MFLogUtil + .logDebug("Added Custom entity: " + id + " With Ratio " + cut + ":" + pierce + ":" + blunt); + phase = 0; + } + } else { + if (config.charAt(a) != " ".charAt(0)) { + temp = temp + config.charAt(a); + } + } + } + } + + private static Item getItemFromString(String id) { + Object object = Item.itemRegistry.getObject(id); + return object != null && object instanceof Item ? (Item) object : null; + } + + @Override + protected void loadConfig() { + // Weight + + String AAdesc = "This will register items under a certain 'Design' calculating the variables itself.\n Each entry has it's own line:\n" + + "Order itemid|Design|WeightGroup|WeightModifier \n" + + "The WeightModifier alters the weight for heavier or lighter materials keep it at 1.0 unless you have a special material (like mithril and adamamantium)\n" + + "Designs can be any that are registered: MineFantasy designs are 'clothing', 'leather', 'mail', 'default'(that's just basic metal armour), and 'plate'\n" + + "WeightGroup refers to whether it is light medium or heavy armour \n" + + "EXAMPLE (This is what vanilla gold is registered under) \n" + + "minecraft:golden_helmet|default|medium|2.0 \n" + "minecraft:golden_chestplate|default|medium|2.0 \n" + + "minecraft:golden_leggings|default|medium|2.0 \n" + "minecraft:golden_boots|default|medium|2.0 \n" + + "The 2.0 means it is 2x heavier than other vanilla armours \n" + + "This does not override existing MF armours \n"; + + armourListAC = config.get(CATEGORY_ARMOUR, "Auto-Armour Registry", new String[0], AAdesc).getStringList(); + Arrays.sort(armourListAC); + + // Hoes + + String hoeDesc = "This Registers Hoe items to an efficiency level: (It uses the same variable as efficiency, you may need to find that out first, by default: it should be able to guess it:\n" + + "Order itemid|efficicncy \n" + + "Efficicney is a variable that goes into play with the failure chance, higher efficicnecy has easier tiling\n"; + + hoeList = config.get(CATEGORY_FARM, "Hoe Registry", new String[0], hoeDesc).getStringList(); + Arrays.sort(hoeList); + + // Crafters + + String craftDesc = "This Registers items to a tool type and efficiency (such as hammer, hvyHammer, knife, saw, etc):\n" + + "Order itemid|efficiency|tier|tooltype \n" + + "tooltype can be hammer, hvyHammer, knife, shears, needle, spoon, mallet, saw, spanner \n" + + "efficiency is the measure of how fast it works (similar to dig speed)"; + + crafterList = config.get(CATEGORY_TOOL, "Crafter Registry", new String[0], craftDesc).getStringList(); + Arrays.sort(crafterList); + + // Weapons + + String damageDesc = "[Experimental] This registers weapons for the damage variable mechanics implemented by option. \n" + + "Though mod-added armours have absolutely no support, and never can without being specifically coded to \n" + + "MineFantasy armours will take these variables and function differently on the values. But weapon items can \n" + + "be added to the list: Put each entry on it's own line set out like this: \n" + + "id|cutting|pierce|blunt \n" + + "id is the item id as a string (you need to find it out yourself), cutting and blunt are the ratio. \n" + + "EXAMPLE (for example... making a stick to piercing damage) \n" + "minecraft:stick|0|1.0|0 \n" + + "The difference between the ratio is what determines damage 1|0 means 100% cutting damage, 3|1 means it's 3 cutting to 1 blunt (or 75%, 25%). use whatever numbers you need to make the ratio."; + + customDamagerList = config.get(CATEGORY_WEPS, "Custom Damage Ratios", new String[0], damageDesc) + .getStringList(); + Arrays.sort(customDamagerList); + + String damageEDesc = "Similar method to 'Custom Damage Ratios' only with entities, This is for registering things like arrows, same format only with the entity registry name (usually modid:name)"; + + customDamagerEntityList = config.get(CATEGORY_WEPS, "Custom Entity Damage Ratios", new String[0], damageEDesc) + .getStringList(); + Arrays.sort(customDamagerEntityList); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigMobs.java b/src/main/java/minefantasy/mf2/config/ConfigMobs.java index 208c10c8..480621af 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigMobs.java +++ b/src/main/java/minefantasy/mf2/config/ConfigMobs.java @@ -3,139 +3,137 @@ import minefantasy.mf2.entity.mob.EntityDragon; public class ConfigMobs extends ConfigurationBaseMF { - public static final String BASIC = "1-1: Basic Entities"; - public static final String MOB_DRAGON = "2-4: DRAGON"; - - public static int youngdragonHP, dragonHP, diredragonHP, elderdragonHP, ancientdragonHP; - public static int youngdragonMD, dragonMD, diredragonMD, elderdragonMD, ancientdragonMD; - public static int youngdragonFD, dragonFD, diredragonFD, elderdragonFD, ancientdragonFD; - public static int youngdragonFT, dragonFT, diredragonFT, elderdragonFT, ancientdragonFT; - public static float dragonChance; - public static int dragonInterval; - public static boolean dragonKillNPC; - public static boolean dragonGriefFire; - public static boolean dragonGriefGeneral; - public static boolean dragonMSG; - - public static final String MOB_MINOTAUR = "5-5: MINOTAUR"; - public static int minotaurHP, minotaurMD, minotaurGD, minotaurBT, minotaurBD, minotaurDC, minotaurGC, minotaurGCB, - minotaurTC; - public static int guardminotaurHP, guardminotaurMD, guardminotaurGD, guardminotaurBT, guardminotaurBD, - guardminotaurDC, guardminotaurGC, guardminotaurGCB, guardminotaurTC; - public static int eliteminotaurHP, eliteminotaurMD, eliteminotaurGD, eliteminotaurBT, eliteminotaurBD, - eliteminotaurDC, eliteminotaurGC, eliteminotaurGCB, eliteminotaurTC; - public static int bossminotaurHP, bossminotaurMD, bossminotaurGD, bossminotaurBT, bossminotaurBD, bossminotaurDC, - bossminotaurGC, bossminotaurGCB, bossminotaurTC; - public static int lightminotaurAR, mediumminotaurAR, heavyminotaurAR, frostminotaurAR, dreadminotaurAR; - public static int minotaurSpawnrate, minotaurSpawnrateNether; - - @Override - protected void loadConfig() { - youngdragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Aa: Health", 60, "Young Dragon Stats").getString()); - youngdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Ab: Bite dmg", 4).getString()); - youngdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Ab: Fire dmg", 2).getString()); - youngdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Ac: Fire time", 10).getString()); - - dragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Ba: Health", 100, "Adult Dragon Stats").getString()); - dragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Bb: Bite dmg", 7).getString()); - dragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Bb: Fire dmg", 5).getString()); - dragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Bc: Fire time", 40).getString()); - - diredragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Ca: Health", 200, "Dire Dragon Stats").getString()); - diredragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Cb: Bite dmg", 8).getString()); - diredragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Cb: Fire dmg", 8).getString()); - diredragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Cc: Fire time", 40).getString()); - - elderdragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Da: Health", 500, "Elder Dragon Stats").getString()); - elderdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Db: Bite dmg", 14).getString()); - elderdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Db: Fire dmg", 10).getString()); - elderdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Dc: Fire time", 50).getString()); - - ancientdragonHP = Integer - .parseInt(config.get(MOB_DRAGON, "2Ea: Health", 1000, "Ancient Dragon Stats").getString()); - ancientdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Eb: Bite dmg", 20).getString()); - ancientdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Eb: Fire dmg", 10).getString()); - ancientdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Ec: Fire time", 100).getString()); - - dragonInterval = Integer.parseInt(config.get(MOB_DRAGON, "3A: Dragon Spawn Interval", 12000, - "How many ticks between visits (12000 means 4 times a day), there is a chance for a dragon each time") - .getString()); - dragonChance = Float.parseFloat(config - .get(MOB_DRAGON, "3B: Spawn Chance", 5F, "A Percent (0-100) chance that a dragon spawns at set times") - .getString()); - - dragonKillNPC = Boolean.parseBoolean(config.get(MOB_DRAGON, "4A: Kill NPC Grief", true, - "Should dragons kill NPCs (including villages as well as animals/mobs)... Not as determined though") - .getString()); - dragonGriefFire = Boolean.parseBoolean( - config.get(MOB_DRAGON, "4B: Fire Grief", true, "Should fire breath start fires").getString()); - dragonGriefGeneral = Boolean.parseBoolean(config.get(MOB_DRAGON, "4C: General Block Grief", true, - "Should blocks be frozen by frost breath, melted by fire, or glass shatter with fire and stomping") - .getString()); - dragonMSG = Boolean.parseBoolean( - config.get(MOB_DRAGON, "4D: Spawn Message", true, "Will players get a message when dragons enter/leave") - .getString()); - EntityDragon.interestTimeSeconds = Integer.parseInt(config.get(MOB_DRAGON, "4E: Dragon Interest Time", 90, - "How many seconds until a dragon leaves (2x as long if wounded) ").getString()); - EntityDragon.heartChance = Float.parseFloat(config - .get(MOB_DRAGON, "4F: Heart Drop chance modifier", 1F, "Modify chance of getting a heart").getString()); - - minotaurSpawnrate = Integer.parseInt(config.get(MOB_MINOTAUR, "5Aa: Overworld Spawnrate", 5).getString()); - minotaurSpawnrateNether = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ab: Nether Spawnrate", 25).getString()); - - minotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ba: Health", 30, "Lesser Minotaur").getString()); - minotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bb: Pound dmg", 5).getString()); - minotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bc: Gore dmg", 5).getString()); - minotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bd: Beserk dmg", 7).getString()); - minotaurBT = Integer.parseInt(config.get(MOB_MINOTAUR, "5Be: Beserk threshold (% health)", 25).getString()); - minotaurDC = Integer - .parseInt(config.get(MOB_MINOTAUR, "5Bf: Disarm chance when mob power attacks", 10).getString()); - minotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bg: Grab Chance", 5).getString()); - minotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bh: Grab Chance (Beserk)", 10).getString()); - minotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bi: Throw Chance", 20).getString()); - - guardminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ca: Health", 30, "Minotaur Warrior").getString()); - guardminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cb: Pound dmg", 6).getString()); - guardminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cc: Gore dmg", 7).getString()); - guardminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cd: Beserk dmg", 8).getString()); - guardminotaurBT = Integer - .parseInt(config.get(MOB_MINOTAUR, "5Ce: Beserk threshold (% health)", 35).getString()); - guardminotaurDC = Integer - .parseInt(config.get(MOB_MINOTAUR, "5Cf: Disarm chance when mob power attacks", 10).getString()); - guardminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cg: Grab Chance", 5).getString()); - guardminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ch: Grab Chance (Beserk)", 10).getString()); - guardminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ci: Throw Chance", 20).getString()); - lightminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cj: Armour rating", 100).getString()); - - eliteminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Da: Health", 50, "Elite Minotaur").getString()); - eliteminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Db: Pound dmg", 6).getString()); - eliteminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dc: Gore dmg", 6).getString()); - eliteminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dd: Beserk dmg", 8).getString()); - eliteminotaurBT = Integer - .parseInt(config.get(MOB_MINOTAUR, "5De: Beserk threshold (% health)", 40).getString()); - eliteminotaurDC = Integer - .parseInt(config.get(MOB_MINOTAUR, "5Df: Disarm chance when mob power attacks", 20).getString()); - eliteminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dg: Grab Chance", 10).getString()); - eliteminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dh: Grab Chance (Beserk)", 20).getString()); - eliteminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Di: Throw Chance", 20).getString()); - mediumminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dj: Armour rating", 400).getString()); - - bossminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ea: Health", 60, "Minotaur Warlord").getString()); - bossminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eb: Pound dmg", 8).getString()); - bossminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ec: Gore dmg", 10).getString()); - bossminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ed: Beserk dmg", 10).getString()); - bossminotaurBT = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ee: Beserk threshold (% health)", 40).getString()); - bossminotaurDC = Integer - .parseInt(config.get(MOB_MINOTAUR, "5Ef: Disarm chance when mob power attacks", 40).getString()); - bossminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eg: Grab Chance", 20).getString()); - bossminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eh: Grab Chance (Beserk)", 40).getString()); - bossminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ei: Throw Chance", 20).getString()); - heavyminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ej: Armour rating", 600).getString()); - - frostminotaurAR = Integer - .parseInt(config.get(MOB_MINOTAUR, "5Fa: Frost armour bonus", 50, "Species Bonus").getString()); - dreadminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Fb: Dread armour bonus", 100).getString()); - - } + public static final String BASIC = "1-1: Basic Entities"; + public static final String MOB_DRAGON = "2-4: DRAGON"; + public static final String MOB_MINOTAUR = "5-5: MINOTAUR"; + public static int youngdragonHP, dragonHP, diredragonHP, elderdragonHP, ancientdragonHP; + public static int youngdragonMD, dragonMD, diredragonMD, elderdragonMD, ancientdragonMD; + public static int youngdragonFD, dragonFD, diredragonFD, elderdragonFD, ancientdragonFD; + public static int youngdragonFT, dragonFT, diredragonFT, elderdragonFT, ancientdragonFT; + public static float dragonChance; + public static int dragonInterval; + public static boolean dragonKillNPC; + public static boolean dragonGriefFire; + public static boolean dragonGriefGeneral; + public static boolean dragonMSG; + public static int minotaurHP, minotaurMD, minotaurGD, minotaurBT, minotaurBD, minotaurDC, minotaurGC, minotaurGCB, + minotaurTC; + public static int guardminotaurHP, guardminotaurMD, guardminotaurGD, guardminotaurBT, guardminotaurBD, + guardminotaurDC, guardminotaurGC, guardminotaurGCB, guardminotaurTC; + public static int eliteminotaurHP, eliteminotaurMD, eliteminotaurGD, eliteminotaurBT, eliteminotaurBD, + eliteminotaurDC, eliteminotaurGC, eliteminotaurGCB, eliteminotaurTC; + public static int bossminotaurHP, bossminotaurMD, bossminotaurGD, bossminotaurBT, bossminotaurBD, bossminotaurDC, + bossminotaurGC, bossminotaurGCB, bossminotaurTC; + public static int lightminotaurAR, mediumminotaurAR, heavyminotaurAR, frostminotaurAR, dreadminotaurAR; + public static int minotaurSpawnrate, minotaurSpawnrateNether; + + @Override + protected void loadConfig() { + youngdragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Aa: Health", 60, "Young Dragon Stats").getString()); + youngdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Ab: Bite dmg", 4).getString()); + youngdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Ab: Fire dmg", 2).getString()); + youngdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Ac: Fire time", 10).getString()); + + dragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Ba: Health", 100, "Adult Dragon Stats").getString()); + dragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Bb: Bite dmg", 7).getString()); + dragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Bb: Fire dmg", 5).getString()); + dragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Bc: Fire time", 40).getString()); + + diredragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Ca: Health", 200, "Dire Dragon Stats").getString()); + diredragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Cb: Bite dmg", 8).getString()); + diredragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Cb: Fire dmg", 8).getString()); + diredragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Cc: Fire time", 40).getString()); + + elderdragonHP = Integer.parseInt(config.get(MOB_DRAGON, "2Da: Health", 500, "Elder Dragon Stats").getString()); + elderdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Db: Bite dmg", 14).getString()); + elderdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Db: Fire dmg", 10).getString()); + elderdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Dc: Fire time", 50).getString()); + + ancientdragonHP = Integer + .parseInt(config.get(MOB_DRAGON, "2Ea: Health", 1000, "Ancient Dragon Stats").getString()); + ancientdragonMD = Integer.parseInt(config.get(MOB_DRAGON, "2Eb: Bite dmg", 20).getString()); + ancientdragonFD = Integer.parseInt(config.get(MOB_DRAGON, "2Eb: Fire dmg", 10).getString()); + ancientdragonFT = Integer.parseInt(config.get(MOB_DRAGON, "2Ec: Fire time", 100).getString()); + + dragonInterval = Integer.parseInt(config.get(MOB_DRAGON, "3A: Dragon Spawn Interval", 12000, + "How many ticks between visits (12000 means 4 times a day), there is a chance for a dragon each time") + .getString()); + dragonChance = Float.parseFloat(config + .get(MOB_DRAGON, "3B: Spawn Chance", 5F, "A Percent (0-100) chance that a dragon spawns at set times") + .getString()); + + dragonKillNPC = Boolean.parseBoolean(config.get(MOB_DRAGON, "4A: Kill NPC Grief", true, + "Should dragons kill NPCs (including villages as well as animals/mobs)... Not as determined though") + .getString()); + dragonGriefFire = Boolean.parseBoolean( + config.get(MOB_DRAGON, "4B: Fire Grief", true, "Should fire breath start fires").getString()); + dragonGriefGeneral = Boolean.parseBoolean(config.get(MOB_DRAGON, "4C: General Block Grief", true, + "Should blocks be frozen by frost breath, melted by fire, or glass shatter with fire and stomping") + .getString()); + dragonMSG = Boolean.parseBoolean( + config.get(MOB_DRAGON, "4D: Spawn Message", true, "Will players get a message when dragons enter/leave") + .getString()); + EntityDragon.interestTimeSeconds = Integer.parseInt(config.get(MOB_DRAGON, "4E: Dragon Interest Time", 90, + "How many seconds until a dragon leaves (2x as long if wounded) ").getString()); + EntityDragon.heartChance = Float.parseFloat(config + .get(MOB_DRAGON, "4F: Heart Drop chance modifier", 1F, "Modify chance of getting a heart").getString()); + + minotaurSpawnrate = Integer.parseInt(config.get(MOB_MINOTAUR, "5Aa: Overworld Spawnrate", 5).getString()); + minotaurSpawnrateNether = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ab: Nether Spawnrate", 25).getString()); + + minotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ba: Health", 30, "Lesser Minotaur").getString()); + minotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bb: Pound dmg", 5).getString()); + minotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bc: Gore dmg", 5).getString()); + minotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bd: Beserk dmg", 7).getString()); + minotaurBT = Integer.parseInt(config.get(MOB_MINOTAUR, "5Be: Beserk threshold (% health)", 25).getString()); + minotaurDC = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Bf: Disarm chance when mob power attacks", 10).getString()); + minotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bg: Grab Chance", 5).getString()); + minotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bh: Grab Chance (Beserk)", 10).getString()); + minotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Bi: Throw Chance", 20).getString()); + + guardminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ca: Health", 30, "Minotaur Warrior").getString()); + guardminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cb: Pound dmg", 6).getString()); + guardminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cc: Gore dmg", 7).getString()); + guardminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cd: Beserk dmg", 8).getString()); + guardminotaurBT = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Ce: Beserk threshold (% health)", 35).getString()); + guardminotaurDC = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Cf: Disarm chance when mob power attacks", 10).getString()); + guardminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cg: Grab Chance", 5).getString()); + guardminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ch: Grab Chance (Beserk)", 10).getString()); + guardminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ci: Throw Chance", 20).getString()); + lightminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Cj: Armour rating", 100).getString()); + + eliteminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Da: Health", 50, "Elite Minotaur").getString()); + eliteminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Db: Pound dmg", 6).getString()); + eliteminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dc: Gore dmg", 6).getString()); + eliteminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dd: Beserk dmg", 8).getString()); + eliteminotaurBT = Integer + .parseInt(config.get(MOB_MINOTAUR, "5De: Beserk threshold (% health)", 40).getString()); + eliteminotaurDC = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Df: Disarm chance when mob power attacks", 20).getString()); + eliteminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dg: Grab Chance", 10).getString()); + eliteminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dh: Grab Chance (Beserk)", 20).getString()); + eliteminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Di: Throw Chance", 20).getString()); + mediumminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Dj: Armour rating", 400).getString()); + + bossminotaurHP = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ea: Health", 60, "Minotaur Warlord").getString()); + bossminotaurMD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eb: Pound dmg", 8).getString()); + bossminotaurGD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ec: Gore dmg", 10).getString()); + bossminotaurBD = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ed: Beserk dmg", 10).getString()); + bossminotaurBT = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ee: Beserk threshold (% health)", 40).getString()); + bossminotaurDC = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Ef: Disarm chance when mob power attacks", 40).getString()); + bossminotaurGC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eg: Grab Chance", 20).getString()); + bossminotaurGCB = Integer.parseInt(config.get(MOB_MINOTAUR, "5Eh: Grab Chance (Beserk)", 40).getString()); + bossminotaurTC = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ei: Throw Chance", 20).getString()); + heavyminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Ej: Armour rating", 600).getString()); + + frostminotaurAR = Integer + .parseInt(config.get(MOB_MINOTAUR, "5Fa: Frost armour bonus", 50, "Species Bonus").getString()); + dreadminotaurAR = Integer.parseInt(config.get(MOB_MINOTAUR, "5Fb: Dread armour bonus", 100).getString()); + + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigStamina.java b/src/main/java/minefantasy/mf2/config/ConfigStamina.java index e63c762b..263740d3 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigStamina.java +++ b/src/main/java/minefantasy/mf2/config/ConfigStamina.java @@ -3,79 +3,79 @@ import minefantasy.mf2.api.stamina.StaminaBar; public class ConfigStamina extends ConfigurationBaseMF { - public static String VALUES = "Value Modifiers"; + public static String VALUES = "Value Modifiers"; - public static float exhaustDamage; - public static float weaponModifier; - public static float sprintModifier; - public static int fullRegenSeconds; - public static float weaponDrain; - public static float bowModifier; - public static float miningSpeed; + public static float exhaustDamage; + public static float weaponModifier; + public static float sprintModifier; + public static int fullRegenSeconds; + public static float weaponDrain; + public static float bowModifier; + public static float miningSpeed; - public static String OPTION = "Options"; + public static String OPTION = "Options"; - public static boolean affectSpeed; - public static boolean affectMining; + public static boolean affectSpeed; + public static boolean affectMining; - public static String OTHER = "Misc"; + public static String OTHER = "Misc"; - @Override - protected void loadConfig() { - StaminaBar.isSystemActive = Boolean.parseBoolean(config.get("##Activate Stamina System##", "Is enabled", true, - "This is the main switch for the stamina bar and all it's features. Setting false disables the system entirely") - .getString()); + @Override + protected void loadConfig() { + StaminaBar.isSystemActive = Boolean.parseBoolean(config.get("##Activate Stamina System##", "Is enabled", true, + "This is the main switch for the stamina bar and all it's features. Setting false disables the system entirely") + .getString()); - StaminaBar.decayModifierCfg = Float - .parseFloat(config.get(VALUES, "Decay Modifier", 1.0F, "This modifies the rate of decay").getString()); - StaminaBar.configRegenModifier = Float - .parseFloat(config.get(VALUES, "Regen Modifier", 1.0F, "This modifies the rate of regen").getString()); - StaminaBar.pauseModifier = Float.parseFloat( - config.get(VALUES, "Idle Modifier", 1.0F, "This modifies the time between decaying and regenning back") - .getString()); - StaminaBar.configBulk = Float.parseFloat(config.get(VALUES, "Bulk Regen Modifier", 1.0F, - "This is the rate that worn apparel slows regen: Most items bring it down by 25%, plate is more scale/leather is less") - .getString()); - StaminaBar.scaleDifficulty = Boolean.parseBoolean(config.get(VALUES, "Difficulty Scale Decay", false, - "This makes difficulty change your decay rate across all fields: peaceful(-50%), easy(-25%), normal(base), hard(+25%)") - .getString()); - StaminaBar.defaultMax = Float.parseFloat(config.get(VALUES, "Max stamina base", 100F, - "This is where your stamina starts on spawning, Note that when changed: it only applies on death or new worlds") - .getString()); - // StaminaBar.restrictSystem = Boolean.parseBoolean(config.get("Restrict use to - // players", "Will restrict", false, "This restricts the stamina system only to - // players").getString()); + StaminaBar.decayModifierCfg = Float + .parseFloat(config.get(VALUES, "Decay Modifier", 1.0F, "This modifies the rate of decay").getString()); + StaminaBar.configRegenModifier = Float + .parseFloat(config.get(VALUES, "Regen Modifier", 1.0F, "This modifies the rate of regen").getString()); + StaminaBar.pauseModifier = Float.parseFloat( + config.get(VALUES, "Idle Modifier", 1.0F, "This modifies the time between decaying and regenning back") + .getString()); + StaminaBar.configBulk = Float.parseFloat(config.get(VALUES, "Bulk Regen Modifier", 1.0F, + "This is the rate that worn apparel slows regen: Most items bring it down by 25%, plate is more scale/leather is less") + .getString()); + StaminaBar.scaleDifficulty = Boolean.parseBoolean(config.get(VALUES, "Difficulty Scale Decay", false, + "This makes difficulty change your decay rate across all fields: peaceful(-50%), easy(-25%), normal(base), hard(+25%)") + .getString()); + StaminaBar.defaultMax = Float.parseFloat(config.get(VALUES, "Max stamina base", 100F, + "This is where your stamina starts on spawning, Note that when changed: it only applies on death or new worlds") + .getString()); + // StaminaBar.restrictSystem = Boolean.parseBoolean(config.get("Restrict use to + // players", "Will restrict", false, "This restricts the stamina system only to + // players").getString()); - weaponModifier = Float.parseFloat( - config.get(VALUES, "Weapon Modifier", 1.0F, "This modifies the amount using weapons influences stamina") - .getString()); - sprintModifier = Float.parseFloat( - config.get(VALUES, "Sprint Modifier", 1.0F, "Modify how fast sprinting decays stamina").getString()); - fullRegenSeconds = Integer.parseInt(config.get(VALUES, "Regen Time", 15, - "Base time(seconds) until the metre is refilled(this is the base, other variables will be modified)") - .getString()); - weaponDrain = Float.parseFloat(config.get(VALUES, "Exhausted Damage Modifier", 0.85F, - "This is how being exhausted(empty stamina) influences your damage as a decimal. 0.85 = 85%. A value more than 1 increases the damage when out of stamina") - .getString()); - bowModifier = Float.parseFloat( - config.get(VALUES, "Bow Time", 1.0F, "Modifies the rate drawing bows will drain stamina").getString()); - StaminaBar.configArmourWeightModifier = Float.parseFloat(config - .get(VALUES, "Weight Modifier", 1.0F, "Modifies the amount weight of armour slows decay").getString()); - miningSpeed = Float.parseFloat(config - .get(VALUES, "Mining Modifier", 1.0F, "Modifies the rate block breaking drains stamina").getString()); - exhaustDamage = Float.parseFloat(config.get(VALUES, "Exhausted Damage Modifier", 1.5F, - "How much damage you take when out of stamina (1.5 = +50% more damage)").getString()); + weaponModifier = Float.parseFloat( + config.get(VALUES, "Weapon Modifier", 1.0F, "This modifies the amount using weapons influences stamina") + .getString()); + sprintModifier = Float.parseFloat( + config.get(VALUES, "Sprint Modifier", 1.0F, "Modify how fast sprinting decays stamina").getString()); + fullRegenSeconds = Integer.parseInt(config.get(VALUES, "Regen Time", 15, + "Base time(seconds) until the metre is refilled(this is the base, other variables will be modified)") + .getString()); + weaponDrain = Float.parseFloat(config.get(VALUES, "Exhausted Damage Modifier", 0.85F, + "This is how being exhausted(empty stamina) influences your damage as a decimal. 0.85 = 85%. A value more than 1 increases the damage when out of stamina") + .getString()); + bowModifier = Float.parseFloat( + config.get(VALUES, "Bow Time", 1.0F, "Modifies the rate drawing bows will drain stamina").getString()); + StaminaBar.configArmourWeightModifier = Float.parseFloat(config + .get(VALUES, "Weight Modifier", 1.0F, "Modifies the amount weight of armour slows decay").getString()); + miningSpeed = Float.parseFloat(config + .get(VALUES, "Mining Modifier", 1.0F, "Modifies the rate block breaking drains stamina").getString()); + exhaustDamage = Float.parseFloat(config.get(VALUES, "Exhausted Damage Modifier", 1.5F, + "How much damage you take when out of stamina (1.5 = +50% more damage)").getString()); - affectSpeed = Boolean.parseBoolean( - config.get(OPTION, "Affect Speed", true, "Slowness effect adds when out of stamina").getString()); - affectMining = Boolean.parseBoolean(config - .get(OPTION, "Affect Mining", true, "Breaking blocks drains stamina, adds mining fatigue").getString()); + affectSpeed = Boolean.parseBoolean( + config.get(OPTION, "Affect Speed", true, "Slowness effect adds when out of stamina").getString()); + affectMining = Boolean.parseBoolean(config + .get(OPTION, "Affect Mining", true, "Breaking blocks drains stamina, adds mining fatigue").getString()); - StaminaBar.levelUp = Boolean.parseBoolean( - config.get(OTHER, "Level Max Stamina", false, "This makes your experience bar increase max stamina") - .getString()); - StaminaBar.levelAmount = Float.parseFloat(config - .get(OTHER, "Level Up Amount", 5F, "How much an experience level increases stamina max").getString()); - } + StaminaBar.levelUp = Boolean.parseBoolean( + config.get(OTHER, "Level Max Stamina", false, "This makes your experience bar increase max stamina") + .getString()); + StaminaBar.levelAmount = Float.parseFloat(config + .get(OTHER, "Level Up Amount", 5F, "How much an experience level increases stamina max").getString()); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigTools.java b/src/main/java/minefantasy/mf2/config/ConfigTools.java index 29049890..69e85e54 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigTools.java +++ b/src/main/java/minefantasy/mf2/config/ConfigTools.java @@ -1,22 +1,19 @@ package minefantasy.mf2.config; public class ConfigTools extends ConfigurationBaseMF { - public static final String CATEGORY_BONUS = "Bonuses"; + public static final String CATEGORY_BONUS = "Bonuses"; + public static final String CATEGORY_PENALTIES = "Penalties"; + public static float handpickBonus; + public static float hvyDropChance; - public static float handpickBonus; + @Override + protected void loadConfig() { + handpickBonus = Float.parseFloat(config.get(CATEGORY_BONUS, "Handpick double-drop chance", 20F, + "This is the percent value (0-100) handpicks double item drops").getString()); - public static final String CATEGORY_PENALTIES = "Penalties"; - - public static float hvyDropChance; - - @Override - protected void loadConfig() { - handpickBonus = Float.parseFloat(config.get(CATEGORY_BONUS, "Handpick double-drop chance", 20F, - "This is the percent value (0-100) handpicks double item drops").getString()); - - hvyDropChance = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Heavy ruin-drop chance", 25F, - "This is the percent value (0-100) heavy picks/shovels and lumber axe do NOT drop blocks on break") - .getString()); - } + hvyDropChance = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Heavy ruin-drop chance", 25F, + "This is the percent value (0-100) heavy picks/shovels and lumber axe do NOT drop blocks on break") + .getString()); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigWeapon.java b/src/main/java/minefantasy/mf2/config/ConfigWeapon.java index 31e63d74..83966a52 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigWeapon.java +++ b/src/main/java/minefantasy/mf2/config/ConfigWeapon.java @@ -1,32 +1,29 @@ package minefantasy.mf2.config; public class ConfigWeapon extends ConfigurationBaseMF { - public static final String CATEGORY_PENALTIES = "Penalties"; + public static final String CATEGORY_PENALTIES = "Penalties"; + public static final String CATEGORY_BONUS = "Bonuses"; + public static boolean useBalance; + public static boolean breakArrowsGround; + public static float arrowBreakMod; + public static boolean xpTrain; - public static boolean useBalance; - public static boolean breakArrowsGround; - public static float arrowBreakMod; + @Override + protected void loadConfig() { + useBalance = Boolean.parseBoolean(config.get(CATEGORY_PENALTIES, "Heavy Weapon Balance", true, + "This causes heavy weapons to throw the camera off angle. This is recommended as it gives a downside to avoid overpowering heavy weapons. With this active: spamming hits is difficult") + .getString()); + breakArrowsGround = Boolean.parseBoolean( + config.get(CATEGORY_PENALTIES, "Arrow Ground Break", true, "Arrows can break when hitting the ground") + .getString()); + arrowBreakMod = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Arrow Break Chance modifier", 1.0F, + "This modifies the rate that arrows break when hitting blocks, 1.0=normal higher numbers increases the break chance") + .getString()); - public static final String CATEGORY_BONUS = "Bonuses"; - - public static boolean xpTrain; - - @Override - protected void loadConfig() { - useBalance = Boolean.parseBoolean(config.get(CATEGORY_PENALTIES, "Heavy Weapon Balance", true, - "This causes heavy weapons to throw the camera off angle. This is recommended as it gives a downside to avoid overpowering heavy weapons. With this active: spamming hits is difficult") - .getString()); - breakArrowsGround = Boolean.parseBoolean( - config.get(CATEGORY_PENALTIES, "Arrow Ground Break", true, "Arrows can break when hitting the ground") - .getString()); - arrowBreakMod = Float.parseFloat(config.get(CATEGORY_PENALTIES, "Arrow Break Chance modifier", 1.0F, - "This modifies the rate that arrows break when hitting blocks, 1.0=normal higher numbers increases the break chance") - .getString()); - - xpTrain = Boolean.parseBoolean(config - .get(CATEGORY_BONUS, "Training weapon xp", true, - "This option allows training weapons to increase your xp level slowly when hitting with them") - .getString()); - } + xpTrain = Boolean.parseBoolean(config + .get(CATEGORY_BONUS, "Training weapon xp", true, + "This option allows training weapons to increase your xp level slowly when hitting with them") + .getString()); + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigWorldGen.java b/src/main/java/minefantasy/mf2/config/ConfigWorldGen.java index 6b232307..98df04f4 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigWorldGen.java +++ b/src/main/java/minefantasy/mf2/config/ConfigWorldGen.java @@ -1,418 +1,418 @@ package minefantasy.mf2.config; public class ConfigWorldGen extends ConfigurationBaseMF { - public static String copper = "1A: [Ore Gen] Copper Ore"; - public static float copperRarity; - public static int copperFrequencyMin; - public static int copperFrequencyMax; - public static int copperLayerMin; - public static int copperLayerMax; - public static int copperSize; - - public static String tin = "1B: [Ore Gen] Tin Ore"; - public static float tinRarity; - public static int tinFrequencyMin; - public static int tinFrequencyMax; - public static int tinLayerMin; - public static int tinLayerMax; - public static int tinSize; - - public static String silver = "1C: [Ore Gen] Silver Ore"; - public static float silverRarity; - public static int silverFrequencyMin; - public static int silverFrequencyMax; - public static int silverLayerMin; - public static int silverLayerMax; - public static int silverSize; - - public static String wolframite = "1D: [Ore Gen] Wolframite Ore"; - public static float wolframiteRarity; - public static int wolframiteFrequencyMin; - public static int wolframiteFrequencyMax; - public static int wolframiteLayerMin; - public static int wolframiteLayerMax; - public static int wolframiteSize; - - public static String mythic = "1E: [Ore Gen] Mythic Ore"; - public static float mythicRarity; - public static int mythicFrequencyMin; - public static int mythicFrequencyMax; - public static int mythicLayerMin; - public static int mythicLayerMax; - public static int mythicSize; - - public static String kaolinite = "2A: [Mineral Gen] Kaolinite Deposit"; - public static float kaoliniteRarity; - public static int kaoliniteFrequencyMin; - public static int kaoliniteFrequencyMax; - public static int kaoliniteLayerMin; - public static int kaoliniteLayerMax; - public static int kaoliniteSize; - - public static String clay = "2B: [Mineral Gen] Clay Deposit"; - public static float clayRarity; - public static int clayFrequencyMin; - public static int clayFrequencyMax; - public static int clayLayerMin; - public static int clayLayerMax; - public static int claySize; - - public static String nitre = "2C: [Mineral Gen] Nitre Deposit"; - public static float nitreRarity; - public static int nitreFrequencyMin; - public static int nitreFrequencyMax; - public static int nitreLayerMin; - public static int nitreLayerMax; - public static int nitreSize; - - public static String sulfur = "2D: [Mineral Gen] Sulfur Deposit"; - public static float sulfurRarity; - public static int sulfurFrequencyMin; - public static int sulfurFrequencyMax; - public static int sulfurLayerMin; - public static int sulfurLayerMax; - public static int sulfurSize; - - public static String borax = "2E: [Mineral Gen] Borax Deposit"; - public static float boraxRarity; - public static int boraxFrequencyMin; - public static int boraxFrequencyMax; - public static int boraxLayerMin; - public static int boraxLayerMax; - public static int boraxSize; - - public static String coal = "2F: [Mineral Gen] Rich Coal Deposit"; - public static float coalRarity; - public static int coalFrequencyMin; - public static int coalFrequencyMax; - public static int coalLayerMin; - public static int coalLayerMax; - public static int coalSize; - - public static String limestone = "3A: [Rock Gen] Limestone"; - public static float limestoneRarity; - public static int limestoneFrequencyMax; - public static int limestoneFrequencyMin; - public static int limestoneLayerMax; - public static int limestoneLayerMin; - public static int limestoneSize; - - public static String berry = "4A: [Plant Gen] Berry Bush"; - public static float berryRarity; - public static float berryMinTemp; - public static float berryMaxTemp; - public static float berryMinRain; - public static float berryMaxRain; - - public static String yew = "5A: [Tree Gen] Yew"; - public static float yewRarity; - public static float yewMinTemp; - public static float yewMaxTemp; - public static float yewMinRain; - public static float yewMaxRain; - - public static String ironbark = "5B: [Tree Gen] Ironbark"; - public static float ironbarkRarity; - public static float ironbarkMinTemp; - public static float ironbarkMaxTemp; - public static float ironbarkMinRain; - public static float ironbarkMaxRain; - - public static String ebony = "5C: [Tree Gen] Ebony"; - public static float ebonyRarity; - public static float ebonyMinTemp; - public static float ebonyMaxTemp; - public static float ebonyMinRain; - public static float ebonyMaxRain; - - public static String structure = "6A: [Structure Gen] General"; - public static int structureTickRate; - public static String ancientForge = "6B: [Structure Gen] Ancient Forge"; - public static float MFChance; - public static String ancientAlter = "6C: [Structure Gen] Ancient Alter"; - public static float MAChance; - public static String dwarvenSH = "6D: [Structure Gen] Dwarven Stronghold"; - public static float DSChance; - public static int DSGrid, DSLength, DSDeviations; - - @Override - protected void loadConfig() { - copperRarity = Float.parseFloat(config.get(copper, "Copper Rarity", 1.0D, - "The chance for copper to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any copper") - .getString()); - copperFrequencyMin = Integer.parseInt(config - .get(copper, "Copper Frequency Min", 8, "Copper will try spawn between this and max veins per chunk") - .getString()); - copperFrequencyMax = Integer.parseInt(config - .get(copper, "Copper Frequency Max", 8, "Copper will try spawn between min and this veins per chunk") - .getString()); - copperLayerMin = Integer.parseInt( - config.get(copper, "Copper Layer Min", 48, "Copper veins spawn above this layer").getString()); - copperLayerMax = Integer.parseInt( - config.get(copper, "Copper Layer Max", 96, "Copper veins spawn below this layer").getString()); - copperSize = Integer - .parseInt(config.get(copper, "Copper Size", 8, "How many blocks consist of the vein").getString()); - - tinRarity = Float.parseFloat(config.get(tin, "Tin Rarity", 1.0D, - "The chance for tin to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any tin") - .getString()); - tinFrequencyMin = Integer.parseInt( - config.get(tin, "Tin Frequency Min", 8, "Tin will try spawn between this and max veins per chunk") - .getString()); - tinFrequencyMax = Integer.parseInt( - config.get(tin, "Tin Frequency Max", 8, "Tin will try spawn between min and this veins per chunk") - .getString()); - tinLayerMin = Integer - .parseInt(config.get(tin, "Tin Layer Min", 48, "Tin veins spawn above this layer").getString()); - tinLayerMax = Integer - .parseInt(config.get(tin, "Tin Layer Max", 96, "Tin veins spawn below this layer").getString()); - tinSize = Integer.parseInt(config.get(tin, "Tin Size", 5, "How many blocks consist of the vein").getString()); - - silverRarity = Float.parseFloat(config.get(silver, "Silver Rarity", 1.0D, - "The chance for silver to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any ") - .getString()); - silverFrequencyMin = Integer.parseInt(config - .get(silver, "Silver Frequency Min", 3, "Silver will try spawn between this and max veins per chunk") - .getString()); - silverFrequencyMax = Integer.parseInt(config - .get(silver, "Silver Frequency Max", 4, "Silver will try spawn between min and this veins per chunk") - .getString()); - silverLayerMin = Integer - .parseInt(config.get(silver, "Silver Layer Min", 0, "Silver veins spawn above this layer").getString()); - silverLayerMax = Integer.parseInt( - config.get(silver, "Silver Layer Max", 32, "Silver veins spawn below this layer").getString()); - silverSize = Integer - .parseInt(config.get(silver, "Silver Size", 8, "How many blocks consist of the vein").getString()); - - wolframiteRarity = Float.parseFloat(config.get(wolframite, "Wolframite Rarity", 1.0D, - "The chance for wolframite to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any ") - .getString()); - wolframiteFrequencyMin = Integer.parseInt(config.get(wolframite, "Wolframite Frequency Min", 1, - "Wolframite will try spawn between this and max veins per chunk").getString()); - wolframiteFrequencyMax = Integer.parseInt(config.get(wolframite, "Wolframite Frequency Max", 1, - "Wolframite will try spawn between min and this veins per chunk").getString()); - wolframiteLayerMin = Integer.parseInt(config - .get(wolframite, "Wolframite Layer Min", 0, "Wolframite veins spawn above this layer").getString()); - wolframiteLayerMax = Integer.parseInt(config - .get(wolframite, "Wolframite Layer Max", 16, "Wolframite veins spawn below this layer").getString()); - wolframiteSize = Integer.parseInt( - config.get(wolframite, "Wolframite Size", 7, "How many blocks consist of the vein").getString()); - - mythicRarity = Float.parseFloat(config.get(mythic, "Mythic Rarity", 0.05D, - "The chance for mythic to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any mythic") - .getString()); - mythicFrequencyMin = Integer.parseInt(config - .get(mythic, "Mythic Frequency Min", 2, "Mythic will try spawn between this and max veins per chunk") - .getString()); - mythicFrequencyMax = Integer.parseInt(config - .get(mythic, "Mythic Frequency Max", 5, "Mythic will try spawn between min and this veins per chunk") - .getString()); - mythicLayerMin = Integer - .parseInt(config.get(mythic, "Mythic Layer Min", 4, "Mythic veins spawn above this layer").getString()); - mythicLayerMax = Integer - .parseInt(config.get(mythic, "Mythic Layer Max", 6, "Mythic veins spawn below this layer").getString()); - mythicSize = Integer - .parseInt(config.get(mythic, "Mythic Size", 8, "How many blocks consist of the vein").getString()); - - kaoliniteRarity = Float.parseFloat(config.get(kaolinite, "Kaolinite Rarity", 0.25D, - "The chance for kaolinite to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any kaolinite") - .getString()); - kaoliniteFrequencyMin = Integer.parseInt(config.get(kaolinite, "Kaolinite Frequency Min", 1, - "Kaolinite will try spawn between this and max deposits per chunk").getString()); - kaoliniteFrequencyMax = Integer.parseInt(config.get(kaolinite, "Kaolinite Frequency Max", 1, - "Kaolinite will try spawn between min and this deposits per chunk").getString()); - kaoliniteLayerMin = Integer.parseInt(config - .get(kaolinite, "Kaolinite Layer Min", 48, "Kaolinite deposits spawn above this layer").getString()); - kaoliniteLayerMax = Integer.parseInt(config - .get(kaolinite, "Kaolinite Layer Max", 72, "Kaolinite deposits spawn below this layer").getString()); - kaoliniteSize = Integer.parseInt( - config.get(kaolinite, "Kaolinite Size", 16, "How many blocks consist of the deposit").getString()); - - // Coal: 20 deposits of 16: Up to 320 coal value per chunk - // Rich Coal: 10 deposits of 8: up to 80 coal value - coalRarity = Float.parseFloat(config.get(coal, "Rich Coal Rarity", 1F, - "The chance for rich coal to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any rich coal deposits") - .getString()); - coalFrequencyMin = Integer.parseInt(config.get(coal, "Rich Coal Frequency Min", 5, - "Rich Coal will try spawn between this and max deposits per chunk").getString()); - coalFrequencyMax = Integer.parseInt(config.get(coal, "Rich Coal Frequency Max", 5, - "Rich Coal will try spawn between min and this deposits per chunk").getString()); - coalLayerMin = Integer.parseInt( - config.get(coal, "Rich Coal Layer Min", 0, "Rich Coal deposits spawn above this layer").getString()); - coalLayerMax = Integer.parseInt( - config.get(coal, "Rich Coal Layer Max", 64, "Rich Coal deposits spawn below this layer").getString()); - coalSize = Integer - .parseInt(config.get(coal, "Rich Coal Size", 8, "How many blocks consist of the deposit").getString()); - - clayRarity = Float.parseFloat(config.get(clay, "Clay Rarity", 0.15D, - "The chance for clay to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any clay") - .getString()); - clayFrequencyMin = Integer.parseInt( - config.get(clay, "Clay Frequency Min", 1, "Clay will try spawn between this and max deposits per chunk") - .getString()); - clayFrequencyMax = Integer.parseInt( - config.get(clay, "Clay Frequency Max", 1, "Clay will try spawn between min and this deposits per chunk") - .getString()); - clayLayerMin = Integer - .parseInt(config.get(clay, "Clay Layer Min", 60, "Clay deposits spawn above this layer").getString()); - clayLayerMax = Integer - .parseInt(config.get(clay, "Clay Layer Max", 68, "Clay deposits spawn below this layer").getString()); - claySize = Integer - .parseInt(config.get(clay, "Clay Size", 32, "How many blocks consist of the deposit").getString()); - - nitreRarity = Float.parseFloat(config.get(nitre, "Nitre Rarity", 1.0D, - "The chance for nitre to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any nitre") - .getString()); - nitreFrequencyMin = Integer.parseInt(config - .get(nitre, "Nitre Frequency Min", 2, "Nitre will try spawn between this and max deposits per chunk") - .getString()); - nitreFrequencyMax = Integer.parseInt(config - .get(nitre, "Nitre Frequency Max", 5, "Nitre will try spawn between min and this deposits per chunk") - .getString()); - nitreLayerMin = Integer.parseInt( - config.get(nitre, "Nitre Layer Min", 16, "Nitre deposits spawn above this layer").getString()); - nitreLayerMax = Integer.parseInt( - config.get(nitre, "Nitre Layer Max", 64, "Nitre deposits spawn below this layer").getString()); - nitreSize = Integer - .parseInt(config.get(nitre, "Nitre Size", 8, "How many blocks consist of the deposit").getString()); - - sulfurRarity = Float.parseFloat(config.get(sulfur, "Sulfur Rarity", 1.0D, - "The chance for sulfur to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any sulfur") - .getString()); - sulfurFrequencyMin = Integer.parseInt(config - .get(sulfur, "Sulfur Frequency Min", 6, "Sulfur will try spawn between this and max deposits per chunk") - .getString()); - sulfurFrequencyMax = Integer.parseInt(config.get(sulfur, "Sulfur Frequency Max", 12, - "Sulfur will try spawn between min and this deposits per chunk").getString()); - sulfurLayerMin = Integer.parseInt( - config.get(sulfur, "Sulfur Layer Min", 0, "Sulfur deposits spawn above this layer").getString()); - sulfurLayerMax = Integer.parseInt( - config.get(sulfur, "Sulfur Layer Max", 16, "Sulfur deposits spawn below this layer").getString()); - sulfurSize = Integer - .parseInt(config.get(sulfur, "Sulfur Size", 4, "How many blocks consist of the deposit").getString()); - - boraxRarity = Float.parseFloat(config.get(borax, "Borax Rarity", 0.1D, - "The chance for borax to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any borax") - .getString()); - boraxFrequencyMin = Integer.parseInt(config - .get(borax, "Borax Frequency Min", 5, "Borax will try spawn between this and max deposits per chunk") - .getString()); - boraxFrequencyMax = Integer.parseInt(config - .get(borax, "Borax Frequency Max", 10, "Borax will try spawn between min and this deposits per chunk") - .getString()); - boraxLayerMin = Integer.parseInt( - config.get(borax, "Borax Layer Min", 48, "Borax deposits spawn above this layer").getString()); - boraxLayerMax = Integer.parseInt( - config.get(borax, "Borax Layer Max", 96, "Borax deposits spawn below this layer").getString()); - boraxSize = Integer - .parseInt(config.get(borax, "Borax Size", 8, "How many blocks consist of the deposit").getString()); - - limestoneRarity = Float.parseFloat(config.get(limestone, "Limestone Rarity", 2.5E-2D, - "The chance for limestone to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any limestone") - .getString()); - limestoneFrequencyMin = Integer.parseInt(config.get(limestone, "Limestone Frequency Min", 1, - "Limestone will try spawn between this and max deposits per chunk").getString()); - limestoneFrequencyMax = Integer.parseInt(config.get(limestone, "Limestone Frequency Max", 1, - "Limestone will try spawn between min and this deposits per chunk").getString()); - limestoneLayerMin = Integer.parseInt(config - .get(limestone, "Limestone Layer Min", 48, "Limestone deposits spawn above this layer").getString()); - limestoneLayerMax = Integer.parseInt(config - .get(limestone, "Limestone Layer Max", 96, "Limestone deposits spawn below this layer").getString()); - limestoneSize = Integer.parseInt( - config.get(limestone, "Limestone Size", 128, "How many blocks consist of the deposit").getString()); - - // Trees and Plants use SN values to make them more compact (since their pretty - // rare) - berryRarity = Float.parseFloat(config.get(berry, "Berry Bush Rarity", 3.0E-2D, - "The chance for berry bushes to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any berries") - .getString()); - yewRarity = Float.parseFloat(config.get(yew, "Yew Tree Rarity", 1.0E-3D, - "The chance for yew trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees") - .getString()); - ironbarkRarity = Float.parseFloat(config.get(ironbark, "Ironbark Tree Rarity", 1.5E-3D, - "The chance for ironbark trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees") - .getString()); - ebonyRarity = Float.parseFloat(config.get(ebony, "Ebony Tree Rarity", 5.0E-4D, - "The chance for ebony trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees") - .getString()); - - berryMinTemp = Float.parseFloat( - config.get(berry, "Berry Bush Spawn Temp Min", 0.2D, "The minimal biome temperature berries can spawn") - .getString()); - berryMaxTemp = Float.parseFloat( - config.get(berry, "Berry Bush Spawn Temp Max", 1.0D, "The maximum biome temperature berries can spawn") - .getString()); - berryMinRain = Float.parseFloat( - config.get(berry, "Berry Bush Spawn Rain Min", 0.3D, "The minimal biome rainfall berries can spawn") - .getString()); - berryMaxRain = Float.parseFloat( - config.get(berry, "Berry Bush Spawn Rain Max", 1.0D, "The maximum biome rainfall berries can spawn") - .getString()); - - yewMinTemp = Float.parseFloat(config - .get(yew, "Yew Tree Spawn Temp Min", 0.2D, "The minimal biome temperature yew can spawn").getString()); - yewMaxTemp = Float.parseFloat(config - .get(yew, "Yew Tree Spawn Temp Max", 1.0D, "The maximum biome temperature yew can spawn").getString()); - yewMinRain = Float.parseFloat(config - .get(yew, "Yew Tree Spawn Rain Min", 0.3D, "The minimal biome rainfall yew can spawn").getString()); - yewMaxRain = Float.parseFloat(config - .get(yew, "Yew Tree Spawn Rain Max", 1.0D, "The maximum biome rainfall yew can spawn").getString()); - - ironbarkMinTemp = Float.parseFloat(config - .get(ironbark, "Ironbark Tree Spawn Temp Min", 0.4D, "The minimal biome temperature ironbark can spawn") - .getString()); - ironbarkMaxTemp = Float.parseFloat(config - .get(ironbark, "Ironbark Tree Spawn Temp Max", 1.2D, "The maximum biome temperature ironbark can spawn") - .getString()); - ironbarkMinRain = Float.parseFloat(config - .get(ironbark, "Ironbark Tree Spawn Rain Min", 0.0D, "The minimal biome rainfall ironbark can spawn") - .getString()); - ironbarkMaxRain = Float.parseFloat(config - .get(ironbark, "Ironbark Tree Spawn Rain Max", 0.8D, "The maximum biome rainfall ironbark can spawn") - .getString()); - - ebonyMinTemp = Float.parseFloat( - config.get(ebony, "Ebony Tree Spawn Temp Min", 0.2D, "The minimal biome temperature ebony can spawn") - .getString()); - ebonyMaxTemp = Float.parseFloat( - config.get(ebony, "Ebony Tree Spawn Temp Max", 1.0D, "The maximum biome temperature ebony can spawn") - .getString()); - ebonyMinRain = Float.parseFloat( - config.get(ebony, "Ebony Tree Spawn Rain Min", 0.4D, "The minimal biome rainfall ebony can spawn") - .getString()); - ebonyMaxRain = Float.parseFloat( - config.get(ebony, "Ebony Tree Spawn Rain Max", 1.0D, "The maximum biome rainfall ebony can spawn") - .getString()); - - structureTickRate = Integer.parseInt(config - .get(structure, "Generation Tick rate", 1, "How many ticks (1/20seconds) for each section to generate") - .getString()); - MFChance = Float - .parseFloat(config - .get(ancientForge, "Spawn Chance", 1.5E-2D, - "The chance for this structure to generate in a chunk. (0=never, 1.0=always)") - .getString()); - MAChance = Float - .parseFloat(config - .get(ancientAlter, "Spawn Chance", 1.0E-2D, - "The chance for this structure to generate in a chunk. (0=never, 1.0=always)") - .getString()); - DSChance = Float - .parseFloat(config - .get(dwarvenSH, "Spawn Chance", 5.0E-2D, - "The chance for this structure to generate in a chunk. (0=never, 1.0=always)") - .getString()); - - DSGrid = Integer.parseInt(config.get(dwarvenSH, "Stronghold Grid size", 8, - "Strongholds generate on a grid on the map to avoid overlaps, this defines the minimum distance between two strongholds (in 16x16 block chunks)") - .getString()); - DSLength = Integer.parseInt(config.get(dwarvenSH, "Stronghold max length", 8, - "Max amount of halls making the length of dwarf strongholds (some may be smaller or larger, but this is a guideline)") - .getString()); - DSDeviations = Integer.parseInt(config.get(dwarvenSH, "Stronghold max deviations", 1, - "Max amount of intersections in dwarf stronghold hallways (not including living hubs). This can significantly increase complexity of strongholds and in turn lag when generating") - .getString()); - - } + public static String copper = "1A: [Ore Gen] Copper Ore"; + public static float copperRarity; + public static int copperFrequencyMin; + public static int copperFrequencyMax; + public static int copperLayerMin; + public static int copperLayerMax; + public static int copperSize; + + public static String tin = "1B: [Ore Gen] Tin Ore"; + public static float tinRarity; + public static int tinFrequencyMin; + public static int tinFrequencyMax; + public static int tinLayerMin; + public static int tinLayerMax; + public static int tinSize; + + public static String silver = "1C: [Ore Gen] Silver Ore"; + public static float silverRarity; + public static int silverFrequencyMin; + public static int silverFrequencyMax; + public static int silverLayerMin; + public static int silverLayerMax; + public static int silverSize; + + public static String wolframite = "1D: [Ore Gen] Wolframite Ore"; + public static float wolframiteRarity; + public static int wolframiteFrequencyMin; + public static int wolframiteFrequencyMax; + public static int wolframiteLayerMin; + public static int wolframiteLayerMax; + public static int wolframiteSize; + + public static String mythic = "1E: [Ore Gen] Mythic Ore"; + public static float mythicRarity; + public static int mythicFrequencyMin; + public static int mythicFrequencyMax; + public static int mythicLayerMin; + public static int mythicLayerMax; + public static int mythicSize; + + public static String kaolinite = "2A: [Mineral Gen] Kaolinite Deposit"; + public static float kaoliniteRarity; + public static int kaoliniteFrequencyMin; + public static int kaoliniteFrequencyMax; + public static int kaoliniteLayerMin; + public static int kaoliniteLayerMax; + public static int kaoliniteSize; + + public static String clay = "2B: [Mineral Gen] Clay Deposit"; + public static float clayRarity; + public static int clayFrequencyMin; + public static int clayFrequencyMax; + public static int clayLayerMin; + public static int clayLayerMax; + public static int claySize; + + public static String nitre = "2C: [Mineral Gen] Nitre Deposit"; + public static float nitreRarity; + public static int nitreFrequencyMin; + public static int nitreFrequencyMax; + public static int nitreLayerMin; + public static int nitreLayerMax; + public static int nitreSize; + + public static String sulfur = "2D: [Mineral Gen] Sulfur Deposit"; + public static float sulfurRarity; + public static int sulfurFrequencyMin; + public static int sulfurFrequencyMax; + public static int sulfurLayerMin; + public static int sulfurLayerMax; + public static int sulfurSize; + + public static String borax = "2E: [Mineral Gen] Borax Deposit"; + public static float boraxRarity; + public static int boraxFrequencyMin; + public static int boraxFrequencyMax; + public static int boraxLayerMin; + public static int boraxLayerMax; + public static int boraxSize; + + public static String coal = "2F: [Mineral Gen] Rich Coal Deposit"; + public static float coalRarity; + public static int coalFrequencyMin; + public static int coalFrequencyMax; + public static int coalLayerMin; + public static int coalLayerMax; + public static int coalSize; + + public static String limestone = "3A: [Rock Gen] Limestone"; + public static float limestoneRarity; + public static int limestoneFrequencyMax; + public static int limestoneFrequencyMin; + public static int limestoneLayerMax; + public static int limestoneLayerMin; + public static int limestoneSize; + + public static String berry = "4A: [Plant Gen] Berry Bush"; + public static float berryRarity; + public static float berryMinTemp; + public static float berryMaxTemp; + public static float berryMinRain; + public static float berryMaxRain; + + public static String yew = "5A: [Tree Gen] Yew"; + public static float yewRarity; + public static float yewMinTemp; + public static float yewMaxTemp; + public static float yewMinRain; + public static float yewMaxRain; + + public static String ironbark = "5B: [Tree Gen] Ironbark"; + public static float ironbarkRarity; + public static float ironbarkMinTemp; + public static float ironbarkMaxTemp; + public static float ironbarkMinRain; + public static float ironbarkMaxRain; + + public static String ebony = "5C: [Tree Gen] Ebony"; + public static float ebonyRarity; + public static float ebonyMinTemp; + public static float ebonyMaxTemp; + public static float ebonyMinRain; + public static float ebonyMaxRain; + + public static String structure = "6A: [Structure Gen] General"; + public static int structureTickRate; + public static String ancientForge = "6B: [Structure Gen] Ancient Forge"; + public static float MFChance; + public static String ancientAlter = "6C: [Structure Gen] Ancient Alter"; + public static float MAChance; + public static String dwarvenSH = "6D: [Structure Gen] Dwarven Stronghold"; + public static float DSChance; + public static int DSGrid, DSLength, DSDeviations; + + @Override + protected void loadConfig() { + copperRarity = Float.parseFloat(config.get(copper, "Copper Rarity", 1.0D, + "The chance for copper to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any copper") + .getString()); + copperFrequencyMin = Integer.parseInt(config + .get(copper, "Copper Frequency Min", 8, "Copper will try spawn between this and max veins per chunk") + .getString()); + copperFrequencyMax = Integer.parseInt(config + .get(copper, "Copper Frequency Max", 8, "Copper will try spawn between min and this veins per chunk") + .getString()); + copperLayerMin = Integer.parseInt( + config.get(copper, "Copper Layer Min", 48, "Copper veins spawn above this layer").getString()); + copperLayerMax = Integer.parseInt( + config.get(copper, "Copper Layer Max", 96, "Copper veins spawn below this layer").getString()); + copperSize = Integer + .parseInt(config.get(copper, "Copper Size", 8, "How many blocks consist of the vein").getString()); + + tinRarity = Float.parseFloat(config.get(tin, "Tin Rarity", 1.0D, + "The chance for tin to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any tin") + .getString()); + tinFrequencyMin = Integer.parseInt( + config.get(tin, "Tin Frequency Min", 8, "Tin will try spawn between this and max veins per chunk") + .getString()); + tinFrequencyMax = Integer.parseInt( + config.get(tin, "Tin Frequency Max", 8, "Tin will try spawn between min and this veins per chunk") + .getString()); + tinLayerMin = Integer + .parseInt(config.get(tin, "Tin Layer Min", 48, "Tin veins spawn above this layer").getString()); + tinLayerMax = Integer + .parseInt(config.get(tin, "Tin Layer Max", 96, "Tin veins spawn below this layer").getString()); + tinSize = Integer.parseInt(config.get(tin, "Tin Size", 5, "How many blocks consist of the vein").getString()); + + silverRarity = Float.parseFloat(config.get(silver, "Silver Rarity", 1.0D, + "The chance for silver to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any ") + .getString()); + silverFrequencyMin = Integer.parseInt(config + .get(silver, "Silver Frequency Min", 3, "Silver will try spawn between this and max veins per chunk") + .getString()); + silverFrequencyMax = Integer.parseInt(config + .get(silver, "Silver Frequency Max", 4, "Silver will try spawn between min and this veins per chunk") + .getString()); + silverLayerMin = Integer + .parseInt(config.get(silver, "Silver Layer Min", 0, "Silver veins spawn above this layer").getString()); + silverLayerMax = Integer.parseInt( + config.get(silver, "Silver Layer Max", 32, "Silver veins spawn below this layer").getString()); + silverSize = Integer + .parseInt(config.get(silver, "Silver Size", 8, "How many blocks consist of the vein").getString()); + + wolframiteRarity = Float.parseFloat(config.get(wolframite, "Wolframite Rarity", 1.0D, + "The chance for wolframite to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any ") + .getString()); + wolframiteFrequencyMin = Integer.parseInt(config.get(wolframite, "Wolframite Frequency Min", 1, + "Wolframite will try spawn between this and max veins per chunk").getString()); + wolframiteFrequencyMax = Integer.parseInt(config.get(wolframite, "Wolframite Frequency Max", 1, + "Wolframite will try spawn between min and this veins per chunk").getString()); + wolframiteLayerMin = Integer.parseInt(config + .get(wolframite, "Wolframite Layer Min", 0, "Wolframite veins spawn above this layer").getString()); + wolframiteLayerMax = Integer.parseInt(config + .get(wolframite, "Wolframite Layer Max", 16, "Wolframite veins spawn below this layer").getString()); + wolframiteSize = Integer.parseInt( + config.get(wolframite, "Wolframite Size", 7, "How many blocks consist of the vein").getString()); + + mythicRarity = Float.parseFloat(config.get(mythic, "Mythic Rarity", 0.05D, + "The chance for mythic to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any mythic") + .getString()); + mythicFrequencyMin = Integer.parseInt(config + .get(mythic, "Mythic Frequency Min", 2, "Mythic will try spawn between this and max veins per chunk") + .getString()); + mythicFrequencyMax = Integer.parseInt(config + .get(mythic, "Mythic Frequency Max", 5, "Mythic will try spawn between min and this veins per chunk") + .getString()); + mythicLayerMin = Integer + .parseInt(config.get(mythic, "Mythic Layer Min", 4, "Mythic veins spawn above this layer").getString()); + mythicLayerMax = Integer + .parseInt(config.get(mythic, "Mythic Layer Max", 6, "Mythic veins spawn below this layer").getString()); + mythicSize = Integer + .parseInt(config.get(mythic, "Mythic Size", 8, "How many blocks consist of the vein").getString()); + + kaoliniteRarity = Float.parseFloat(config.get(kaolinite, "Kaolinite Rarity", 0.25D, + "The chance for kaolinite to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any kaolinite") + .getString()); + kaoliniteFrequencyMin = Integer.parseInt(config.get(kaolinite, "Kaolinite Frequency Min", 1, + "Kaolinite will try spawn between this and max deposits per chunk").getString()); + kaoliniteFrequencyMax = Integer.parseInt(config.get(kaolinite, "Kaolinite Frequency Max", 1, + "Kaolinite will try spawn between min and this deposits per chunk").getString()); + kaoliniteLayerMin = Integer.parseInt(config + .get(kaolinite, "Kaolinite Layer Min", 48, "Kaolinite deposits spawn above this layer").getString()); + kaoliniteLayerMax = Integer.parseInt(config + .get(kaolinite, "Kaolinite Layer Max", 72, "Kaolinite deposits spawn below this layer").getString()); + kaoliniteSize = Integer.parseInt( + config.get(kaolinite, "Kaolinite Size", 16, "How many blocks consist of the deposit").getString()); + + // Coal: 20 deposits of 16: Up to 320 coal value per chunk + // Rich Coal: 10 deposits of 8: up to 80 coal value + coalRarity = Float.parseFloat(config.get(coal, "Rich Coal Rarity", 1F, + "The chance for rich coal to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any rich coal deposits") + .getString()); + coalFrequencyMin = Integer.parseInt(config.get(coal, "Rich Coal Frequency Min", 5, + "Rich Coal will try spawn between this and max deposits per chunk").getString()); + coalFrequencyMax = Integer.parseInt(config.get(coal, "Rich Coal Frequency Max", 5, + "Rich Coal will try spawn between min and this deposits per chunk").getString()); + coalLayerMin = Integer.parseInt( + config.get(coal, "Rich Coal Layer Min", 0, "Rich Coal deposits spawn above this layer").getString()); + coalLayerMax = Integer.parseInt( + config.get(coal, "Rich Coal Layer Max", 64, "Rich Coal deposits spawn below this layer").getString()); + coalSize = Integer + .parseInt(config.get(coal, "Rich Coal Size", 8, "How many blocks consist of the deposit").getString()); + + clayRarity = Float.parseFloat(config.get(clay, "Clay Rarity", 0.15D, + "The chance for clay to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any clay") + .getString()); + clayFrequencyMin = Integer.parseInt( + config.get(clay, "Clay Frequency Min", 1, "Clay will try spawn between this and max deposits per chunk") + .getString()); + clayFrequencyMax = Integer.parseInt( + config.get(clay, "Clay Frequency Max", 1, "Clay will try spawn between min and this deposits per chunk") + .getString()); + clayLayerMin = Integer + .parseInt(config.get(clay, "Clay Layer Min", 60, "Clay deposits spawn above this layer").getString()); + clayLayerMax = Integer + .parseInt(config.get(clay, "Clay Layer Max", 68, "Clay deposits spawn below this layer").getString()); + claySize = Integer + .parseInt(config.get(clay, "Clay Size", 32, "How many blocks consist of the deposit").getString()); + + nitreRarity = Float.parseFloat(config.get(nitre, "Nitre Rarity", 1.0D, + "The chance for nitre to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any nitre") + .getString()); + nitreFrequencyMin = Integer.parseInt(config + .get(nitre, "Nitre Frequency Min", 2, "Nitre will try spawn between this and max deposits per chunk") + .getString()); + nitreFrequencyMax = Integer.parseInt(config + .get(nitre, "Nitre Frequency Max", 5, "Nitre will try spawn between min and this deposits per chunk") + .getString()); + nitreLayerMin = Integer.parseInt( + config.get(nitre, "Nitre Layer Min", 16, "Nitre deposits spawn above this layer").getString()); + nitreLayerMax = Integer.parseInt( + config.get(nitre, "Nitre Layer Max", 64, "Nitre deposits spawn below this layer").getString()); + nitreSize = Integer + .parseInt(config.get(nitre, "Nitre Size", 8, "How many blocks consist of the deposit").getString()); + + sulfurRarity = Float.parseFloat(config.get(sulfur, "Sulfur Rarity", 1.0D, + "The chance for sulfur to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any sulfur") + .getString()); + sulfurFrequencyMin = Integer.parseInt(config + .get(sulfur, "Sulfur Frequency Min", 6, "Sulfur will try spawn between this and max deposits per chunk") + .getString()); + sulfurFrequencyMax = Integer.parseInt(config.get(sulfur, "Sulfur Frequency Max", 12, + "Sulfur will try spawn between min and this deposits per chunk").getString()); + sulfurLayerMin = Integer.parseInt( + config.get(sulfur, "Sulfur Layer Min", 0, "Sulfur deposits spawn above this layer").getString()); + sulfurLayerMax = Integer.parseInt( + config.get(sulfur, "Sulfur Layer Max", 16, "Sulfur deposits spawn below this layer").getString()); + sulfurSize = Integer + .parseInt(config.get(sulfur, "Sulfur Size", 4, "How many blocks consist of the deposit").getString()); + + boraxRarity = Float.parseFloat(config.get(borax, "Borax Rarity", 0.1D, + "The chance for borax to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any borax") + .getString()); + boraxFrequencyMin = Integer.parseInt(config + .get(borax, "Borax Frequency Min", 5, "Borax will try spawn between this and max deposits per chunk") + .getString()); + boraxFrequencyMax = Integer.parseInt(config + .get(borax, "Borax Frequency Max", 10, "Borax will try spawn between min and this deposits per chunk") + .getString()); + boraxLayerMin = Integer.parseInt( + config.get(borax, "Borax Layer Min", 48, "Borax deposits spawn above this layer").getString()); + boraxLayerMax = Integer.parseInt( + config.get(borax, "Borax Layer Max", 96, "Borax deposits spawn below this layer").getString()); + boraxSize = Integer + .parseInt(config.get(borax, "Borax Size", 8, "How many blocks consist of the deposit").getString()); + + limestoneRarity = Float.parseFloat(config.get(limestone, "Limestone Rarity", 2.5E-2D, + "The chance for limestone to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any limestone") + .getString()); + limestoneFrequencyMin = Integer.parseInt(config.get(limestone, "Limestone Frequency Min", 1, + "Limestone will try spawn between this and max deposits per chunk").getString()); + limestoneFrequencyMax = Integer.parseInt(config.get(limestone, "Limestone Frequency Max", 1, + "Limestone will try spawn between min and this deposits per chunk").getString()); + limestoneLayerMin = Integer.parseInt(config + .get(limestone, "Limestone Layer Min", 48, "Limestone deposits spawn above this layer").getString()); + limestoneLayerMax = Integer.parseInt(config + .get(limestone, "Limestone Layer Max", 96, "Limestone deposits spawn below this layer").getString()); + limestoneSize = Integer.parseInt( + config.get(limestone, "Limestone Size", 128, "How many blocks consist of the deposit").getString()); + + // Trees and Plants use SN values to make them more compact (since their pretty + // rare) + berryRarity = Float.parseFloat(config.get(berry, "Berry Bush Rarity", 3.0E-2D, + "The chance for berry bushes to spawn in a chunk. (0=never, 1.0=always), this means some chunks may not have any berries") + .getString()); + yewRarity = Float.parseFloat(config.get(yew, "Yew Tree Rarity", 1.0E-3D, + "The chance for yew trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees") + .getString()); + ironbarkRarity = Float.parseFloat(config.get(ironbark, "Ironbark Tree Rarity", 1.5E-3D, + "The chance for ironbark trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees") + .getString()); + ebonyRarity = Float.parseFloat(config.get(ebony, "Ebony Tree Rarity", 5.0E-4D, + "The chance for ebony trees to spawn in a chunk. (0=never, 1.0=always), this means many chunks may not have any trees") + .getString()); + + berryMinTemp = Float.parseFloat( + config.get(berry, "Berry Bush Spawn Temp Min", 0.2D, "The minimal biome temperature berries can spawn") + .getString()); + berryMaxTemp = Float.parseFloat( + config.get(berry, "Berry Bush Spawn Temp Max", 1.0D, "The maximum biome temperature berries can spawn") + .getString()); + berryMinRain = Float.parseFloat( + config.get(berry, "Berry Bush Spawn Rain Min", 0.3D, "The minimal biome rainfall berries can spawn") + .getString()); + berryMaxRain = Float.parseFloat( + config.get(berry, "Berry Bush Spawn Rain Max", 1.0D, "The maximum biome rainfall berries can spawn") + .getString()); + + yewMinTemp = Float.parseFloat(config + .get(yew, "Yew Tree Spawn Temp Min", 0.2D, "The minimal biome temperature yew can spawn").getString()); + yewMaxTemp = Float.parseFloat(config + .get(yew, "Yew Tree Spawn Temp Max", 1.0D, "The maximum biome temperature yew can spawn").getString()); + yewMinRain = Float.parseFloat(config + .get(yew, "Yew Tree Spawn Rain Min", 0.3D, "The minimal biome rainfall yew can spawn").getString()); + yewMaxRain = Float.parseFloat(config + .get(yew, "Yew Tree Spawn Rain Max", 1.0D, "The maximum biome rainfall yew can spawn").getString()); + + ironbarkMinTemp = Float.parseFloat(config + .get(ironbark, "Ironbark Tree Spawn Temp Min", 0.4D, "The minimal biome temperature ironbark can spawn") + .getString()); + ironbarkMaxTemp = Float.parseFloat(config + .get(ironbark, "Ironbark Tree Spawn Temp Max", 1.2D, "The maximum biome temperature ironbark can spawn") + .getString()); + ironbarkMinRain = Float.parseFloat(config + .get(ironbark, "Ironbark Tree Spawn Rain Min", 0.0D, "The minimal biome rainfall ironbark can spawn") + .getString()); + ironbarkMaxRain = Float.parseFloat(config + .get(ironbark, "Ironbark Tree Spawn Rain Max", 0.8D, "The maximum biome rainfall ironbark can spawn") + .getString()); + + ebonyMinTemp = Float.parseFloat( + config.get(ebony, "Ebony Tree Spawn Temp Min", 0.2D, "The minimal biome temperature ebony can spawn") + .getString()); + ebonyMaxTemp = Float.parseFloat( + config.get(ebony, "Ebony Tree Spawn Temp Max", 1.0D, "The maximum biome temperature ebony can spawn") + .getString()); + ebonyMinRain = Float.parseFloat( + config.get(ebony, "Ebony Tree Spawn Rain Min", 0.4D, "The minimal biome rainfall ebony can spawn") + .getString()); + ebonyMaxRain = Float.parseFloat( + config.get(ebony, "Ebony Tree Spawn Rain Max", 1.0D, "The maximum biome rainfall ebony can spawn") + .getString()); + + structureTickRate = Integer.parseInt(config + .get(structure, "Generation Tick rate", 1, "How many ticks (1/20seconds) for each section to generate") + .getString()); + MFChance = Float + .parseFloat(config + .get(ancientForge, "Spawn Chance", 1.5E-2D, + "The chance for this structure to generate in a chunk. (0=never, 1.0=always)") + .getString()); + MAChance = Float + .parseFloat(config + .get(ancientAlter, "Spawn Chance", 1.0E-2D, + "The chance for this structure to generate in a chunk. (0=never, 1.0=always)") + .getString()); + DSChance = Float + .parseFloat(config + .get(dwarvenSH, "Spawn Chance", 5.0E-2D, + "The chance for this structure to generate in a chunk. (0=never, 1.0=always)") + .getString()); + + DSGrid = Integer.parseInt(config.get(dwarvenSH, "Stronghold Grid size", 8, + "Strongholds generate on a grid on the map to avoid overlaps, this defines the minimum distance between two strongholds (in 16x16 block chunks)") + .getString()); + DSLength = Integer.parseInt(config.get(dwarvenSH, "Stronghold max length", 8, + "Max amount of halls making the length of dwarf strongholds (some may be smaller or larger, but this is a guideline)") + .getString()); + DSDeviations = Integer.parseInt(config.get(dwarvenSH, "Stronghold max deviations", 1, + "Max amount of intersections in dwarf stronghold hallways (not including living hubs). This can significantly increase complexity of strongholds and in turn lag when generating") + .getString()); + + } } diff --git a/src/main/java/minefantasy/mf2/config/ConfigurationBaseMF.java b/src/main/java/minefantasy/mf2/config/ConfigurationBaseMF.java index 806d6c04..2f3a0ecc 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigurationBaseMF.java +++ b/src/main/java/minefantasy/mf2/config/ConfigurationBaseMF.java @@ -3,14 +3,14 @@ import net.minecraftforge.common.config.Configuration; public abstract class ConfigurationBaseMF { - protected Configuration config; + protected Configuration config; - public void setConfig(Configuration configuration) { - configuration.load(); - config = configuration; - loadConfig(); - configuration.save(); - } + public void setConfig(Configuration configuration) { + configuration.load(); + config = configuration; + loadConfig(); + configuration.save(); + } - protected abstract void loadConfig(); + protected abstract void loadConfig(); } diff --git a/src/main/java/minefantasy/mf2/container/ContainerAnvilMF.java b/src/main/java/minefantasy/mf2/container/ContainerAnvilMF.java index 559259d4..3e14eb1e 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerAnvilMF.java +++ b/src/main/java/minefantasy/mf2/container/ContainerAnvilMF.java @@ -9,101 +9,101 @@ import net.minecraft.item.ItemStack; public class ContainerAnvilMF extends Container { - private TileEntityAnvilMF tile; - private boolean isGuiContainer = false; - private int xInvOffset = 28; - - public ContainerAnvilMF(TileEntityAnvilMF tile) { - isGuiContainer = false; - this.tile = tile; - int width = 6; - int height = 4; - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - int slot = y * width + x; - this.addSlotToContainer(new Slot(tile, slot, 8 + x * 18, 38 + y * 18)); - } - } - this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 1, 150, 65)); - } - - public ContainerAnvilMF(InventoryPlayer user, TileEntityAnvilMF tile) { - isGuiContainer = true; - this.tile = tile; - int width = 6; - int height = 4; - - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - int slot = y * width + x; - this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 39 + y * 18)); - } - } - this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 1, 214, 66)); - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18 + xInvOffset, 128 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18 + xInvOffset, 186)); - } - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - if (isGuiContainer) { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { - return null; - } - - if (itemstack1.stackSize <= 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - } - - return itemstack; - } + private TileEntityAnvilMF tile; + private boolean isGuiContainer = false; + private int xInvOffset = 28; + + public ContainerAnvilMF(TileEntityAnvilMF tile) { + isGuiContainer = false; + this.tile = tile; + int width = 6; + int height = 4; + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int slot = y * width + x; + this.addSlotToContainer(new Slot(tile, slot, 8 + x * 18, 38 + y * 18)); + } + } + this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 1, 150, 65)); + } + + public ContainerAnvilMF(InventoryPlayer user, TileEntityAnvilMF tile) { + isGuiContainer = true; + this.tile = tile; + int width = 6; + int height = 4; + + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int slot = y * width + x; + this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 39 + y * 18)); + } + } + this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 1, 214, 66)); + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18 + xInvOffset, 128 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18 + xInvOffset, 186)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerBigFurnace.java b/src/main/java/minefantasy/mf2/container/ContainerBigFurnace.java index 7be79a65..8f772f91 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerBigFurnace.java +++ b/src/main/java/minefantasy/mf2/container/ContainerBigFurnace.java @@ -11,189 +11,188 @@ import net.minecraft.item.ItemStack; /** - * * @author Anonymous Productions - * - * Sources are provided for educational reasons. though small bits of - * code, or methods can be used in your own creations. + *

+ * Sources are provided for educational reasons. though small bits of + * code, or methods can be used in your own creations. */ public class ContainerBigFurnace extends Container { - public TileEntityBigFurnace smelter; - public int lastProgress; - public int lastFuel; - public int lastMaxFuel; - public int lastHeat; - public int lastMaxHeat; - - public ContainerBigFurnace(EntityPlayer play, TileEntityBigFurnace tileentityfurnace) { - lastProgress = 0; - lastFuel = 0; - lastMaxFuel = 0; - lastHeat = 0; - lastMaxHeat = 0; - smelter = tileentityfurnace; - tileentityfurnace.openChest(); - - if (smelter.isHeater()) { - addSlotToContainer(new Slot(smelter, 0, 59, 44)); - } else { - // IN - addSlotToContainer(new Slot(smelter, 0, 36, 26)); - addSlotToContainer(new Slot(smelter, 1, 54, 26)); - addSlotToContainer(new Slot(smelter, 2, 36, 44)); - addSlotToContainer(new Slot(smelter, 3, 54, 44)); - - // OUT - addSlotToContainer(new SlotFurnace(play, smelter, 4, 106, 26)); - addSlotToContainer(new SlotFurnace(play, smelter, 5, 124, 26)); - addSlotToContainer(new SlotFurnace(play, smelter, 6, 106, 44)); - addSlotToContainer(new SlotFurnace(play, smelter, 7, 124, 44)); - } - - // PLAYER INV - for (int i = 0; i < 3; i++) { - for (int k = 0; k < 9; k++) { - addSlotToContainer(new Slot(play.inventory, k + i * 9 + 9, 8 + k * 18, 84 + i * 18)); - } - } - - for (int j = 0; j < 9; j++) { - addSlotToContainer(new Slot(play.inventory, j, 8 + j * 18, 142)); - } - } - - @Override - public void onContainerClosed(EntityPlayer player) { - super.onContainerClosed(player); - this.smelter.closeChest(); - } - - @Override - public void addCraftingToCrafters(ICrafting icrafting) { - super.addCraftingToCrafters(icrafting); - icrafting.sendProgressBarUpdate(this, 0, smelter.progress); - icrafting.sendProgressBarUpdate(this, 1, smelter.fuel); - icrafting.sendProgressBarUpdate(this, 2, smelter.maxFuel); - icrafting.sendProgressBarUpdate(this, 3, (int) smelter.heat); - icrafting.sendProgressBarUpdate(this, 4, (int) smelter.maxHeat); - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - - for (int i = 0; i < this.crafters.size(); ++i) { - ICrafting icrafting = (ICrafting) this.crafters.get(i); - - if (this.lastProgress != this.smelter.progress) { - icrafting.sendProgressBarUpdate(this, 0, this.smelter.progress); - } - - if (this.lastFuel != this.smelter.fuel) { - icrafting.sendProgressBarUpdate(this, 1, this.smelter.fuel); - } - - if (this.lastMaxFuel != this.smelter.maxFuel) { - icrafting.sendProgressBarUpdate(this, 2, this.smelter.maxFuel); - } - - if (this.lastHeat != this.smelter.heat) { - icrafting.sendProgressBarUpdate(this, 3, (int) this.smelter.heat); - } - - if (this.lastMaxHeat != this.smelter.maxHeat) { - icrafting.sendProgressBarUpdate(this, 4, (int) this.smelter.maxHeat); - } - - } - - this.lastProgress = this.smelter.progress; - this.lastFuel = this.smelter.fuel; - this.lastMaxFuel = this.smelter.maxFuel; - this.lastHeat = (int) this.smelter.heat; - this.lastMaxHeat = (int) this.smelter.maxHeat; - } - - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) { - if (id == 0) { - this.smelter.progress = value; - } - - if (id == 1) { - this.smelter.fuel = value; - } - - if (id == 2) { - this.smelter.maxFuel = value; - } - - if (id == 3) { - this.smelter.heat = value; - } - - if (id == 4) { - this.smelter.maxHeat = value; - } - } - - public boolean canInteractWith(EntityPlayer entityplayer) { - return smelter.isUseableByPlayer(entityplayer); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int num) { - int invSize = 8; - if (smelter.isHeater()) { - invSize = 1; - } - ItemStack placedItem = null; - Slot slot = (Slot) this.inventorySlots.get(num); - - if (slot != null && slot.getHasStack()) { - ItemStack itemSlot = slot.getStack(); - placedItem = itemSlot.copy(); - - // Take - if (num < invSize) { - if (!this.mergeItemStack(itemSlot, invSize, 36 + invSize, true)) { - return null; - } - - slot.onSlotChange(itemSlot, placedItem); - } - // Put - else { - if (smelter.isHeater()) { - if (smelter.isItemFuel(itemSlot)) { - if (!this.mergeItemStack(itemSlot, 0, 1, false)) { - return null; - } - } - } else { - if (smelter.getResult(itemSlot) != null) { - if (!this.mergeItemStack(itemSlot, 0, 4, false)) { - return null; - } - } - } - - slot.onSlotChange(itemSlot, placedItem); - } - - if (itemSlot.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - - if (itemSlot.stackSize == placedItem.stackSize) { - return null; - } - - slot.onPickupFromSlot(player, itemSlot); - } - - return placedItem; - } + public TileEntityBigFurnace smelter; + public int lastProgress; + public int lastFuel; + public int lastMaxFuel; + public int lastHeat; + public int lastMaxHeat; + + public ContainerBigFurnace(EntityPlayer play, TileEntityBigFurnace tileentityfurnace) { + lastProgress = 0; + lastFuel = 0; + lastMaxFuel = 0; + lastHeat = 0; + lastMaxHeat = 0; + smelter = tileentityfurnace; + tileentityfurnace.openChest(); + + if (smelter.isHeater()) { + addSlotToContainer(new Slot(smelter, 0, 59, 44)); + } else { + // IN + addSlotToContainer(new Slot(smelter, 0, 36, 26)); + addSlotToContainer(new Slot(smelter, 1, 54, 26)); + addSlotToContainer(new Slot(smelter, 2, 36, 44)); + addSlotToContainer(new Slot(smelter, 3, 54, 44)); + + // OUT + addSlotToContainer(new SlotFurnace(play, smelter, 4, 106, 26)); + addSlotToContainer(new SlotFurnace(play, smelter, 5, 124, 26)); + addSlotToContainer(new SlotFurnace(play, smelter, 6, 106, 44)); + addSlotToContainer(new SlotFurnace(play, smelter, 7, 124, 44)); + } + + // PLAYER INV + for (int i = 0; i < 3; i++) { + for (int k = 0; k < 9; k++) { + addSlotToContainer(new Slot(play.inventory, k + i * 9 + 9, 8 + k * 18, 84 + i * 18)); + } + } + + for (int j = 0; j < 9; j++) { + addSlotToContainer(new Slot(play.inventory, j, 8 + j * 18, 142)); + } + } + + @Override + public void onContainerClosed(EntityPlayer player) { + super.onContainerClosed(player); + this.smelter.closeChest(); + } + + @Override + public void addCraftingToCrafters(ICrafting icrafting) { + super.addCraftingToCrafters(icrafting); + icrafting.sendProgressBarUpdate(this, 0, smelter.progress); + icrafting.sendProgressBarUpdate(this, 1, smelter.fuel); + icrafting.sendProgressBarUpdate(this, 2, smelter.maxFuel); + icrafting.sendProgressBarUpdate(this, 3, (int) smelter.heat); + icrafting.sendProgressBarUpdate(this, 4, (int) smelter.maxHeat); + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastProgress != this.smelter.progress) { + icrafting.sendProgressBarUpdate(this, 0, this.smelter.progress); + } + + if (this.lastFuel != this.smelter.fuel) { + icrafting.sendProgressBarUpdate(this, 1, this.smelter.fuel); + } + + if (this.lastMaxFuel != this.smelter.maxFuel) { + icrafting.sendProgressBarUpdate(this, 2, this.smelter.maxFuel); + } + + if (this.lastHeat != this.smelter.heat) { + icrafting.sendProgressBarUpdate(this, 3, (int) this.smelter.heat); + } + + if (this.lastMaxHeat != this.smelter.maxHeat) { + icrafting.sendProgressBarUpdate(this, 4, (int) this.smelter.maxHeat); + } + + } + + this.lastProgress = this.smelter.progress; + this.lastFuel = this.smelter.fuel; + this.lastMaxFuel = this.smelter.maxFuel; + this.lastHeat = (int) this.smelter.heat; + this.lastMaxHeat = (int) this.smelter.maxHeat; + } + + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + this.smelter.progress = value; + } + + if (id == 1) { + this.smelter.fuel = value; + } + + if (id == 2) { + this.smelter.maxFuel = value; + } + + if (id == 3) { + this.smelter.heat = value; + } + + if (id == 4) { + this.smelter.maxHeat = value; + } + } + + public boolean canInteractWith(EntityPlayer entityplayer) { + return smelter.isUseableByPlayer(entityplayer); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int num) { + int invSize = 8; + if (smelter.isHeater()) { + invSize = 1; + } + ItemStack placedItem = null; + Slot slot = (Slot) this.inventorySlots.get(num); + + if (slot != null && slot.getHasStack()) { + ItemStack itemSlot = slot.getStack(); + placedItem = itemSlot.copy(); + + // Take + if (num < invSize) { + if (!this.mergeItemStack(itemSlot, invSize, 36 + invSize, true)) { + return null; + } + + slot.onSlotChange(itemSlot, placedItem); + } + // Put + else { + if (smelter.isHeater()) { + if (smelter.isItemFuel(itemSlot)) { + if (!this.mergeItemStack(itemSlot, 0, 1, false)) { + return null; + } + } + } else { + if (smelter.getResult(itemSlot) != null) { + if (!this.mergeItemStack(itemSlot, 0, 4, false)) { + return null; + } + } + } + + slot.onSlotChange(itemSlot, placedItem); + } + + if (itemSlot.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemSlot.stackSize == placedItem.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemSlot); + } + + return placedItem; + } } diff --git a/src/main/java/minefantasy/mf2/container/ContainerBlastChamber.java b/src/main/java/minefantasy/mf2/container/ContainerBlastChamber.java index b6e8acf1..948e1c65 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerBlastChamber.java +++ b/src/main/java/minefantasy/mf2/container/ContainerBlastChamber.java @@ -9,105 +9,105 @@ import net.minecraft.item.ItemStack; public class ContainerBlastChamber extends Container { - private TileEntityBlastFC tile; - private boolean isGuiContainer = false; - - public ContainerBlastChamber(InventoryPlayer user, TileEntityBlastFC tile) { - isGuiContainer = true; - this.tile = tile; - - this.addSlotToContainer(new SlotRestrictive(tile, 0, 80, 30)); - this.addSlotToContainer(new SlotRestrictive(tile, 1, 80, 68)); - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); - } - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - if (isGuiContainer) { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(clicked); - // TOTAL SLOTS: 38 = 2+27+9 - // Chamber = 0-1 - // Inv = 2-28 - // Bar = 29-47 - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked > 1)// INVENTORY - { - if (TileEntityBlastFC.isCarbon(itemstack1)) { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) { - return null; - } - } else if (TileEntityBlastFC.isInput(itemstack1)) { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) { - return null; - } - } else if (clicked >= 2 && clicked < 29)// INVENTORY - { - if (!this.mergeItemStack(itemstack1, 29, 38, false)) { - return null; - } - } - // BAR - else if (clicked >= 29 && clicked < 38 && !this.mergeItemStack(itemstack1, 2, 29, false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 2, 38, false)) { - return null; - } - - if (itemstack1.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + private TileEntityBlastFC tile; + private boolean isGuiContainer = false; + + public ContainerBlastChamber(InventoryPlayer user, TileEntityBlastFC tile) { + isGuiContainer = true; + this.tile = tile; + + this.addSlotToContainer(new SlotRestrictive(tile, 0, 80, 30)); + this.addSlotToContainer(new SlotRestrictive(tile, 1, 80, 68)); + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + // TOTAL SLOTS: 38 = 2+27+9 + // Chamber = 0-1 + // Inv = 2-28 + // Bar = 29-47 + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked > 1)// INVENTORY + { + if (TileEntityBlastFC.isCarbon(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (TileEntityBlastFC.isInput(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) { + return null; + } + } else if (clicked >= 2 && clicked < 29)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 29, 38, false)) { + return null; + } + } + // BAR + else if (clicked >= 29 && clicked < 38 && !this.mergeItemStack(itemstack1, 2, 29, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 2, 38, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerBlastHeater.java b/src/main/java/minefantasy/mf2/container/ContainerBlastHeater.java index 9ddf0047..6f95ea24 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerBlastHeater.java +++ b/src/main/java/minefantasy/mf2/container/ContainerBlastHeater.java @@ -11,124 +11,124 @@ import net.minecraft.item.ItemStack; public class ContainerBlastHeater extends Container { - private TileEntityBlastFH tile; - private boolean isGuiContainer = false; - private int lastFuel; - private int lastFuelMax; - - public ContainerBlastHeater(InventoryPlayer user, TileEntityBlastFH tile) { - isGuiContainer = true; - this.tile = tile; - - this.addSlotToContainer(new Slot(tile, 0, 80, 76)); - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); - } - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.crafters.size(); ++i) { - ICrafting icrafting = (ICrafting) this.crafters.get(i); - - if (this.lastFuel != tile.fuel) { - icrafting.sendProgressBarUpdate(this, 0, tile.fuel); - } - - if (this.lastFuelMax != tile.maxFuel) { - icrafting.sendProgressBarUpdate(this, 1, tile.maxFuel); - } - } - this.lastFuel = tile.fuel; - this.lastFuelMax = tile.maxFuel; - - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - if (isGuiContainer) { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) { - if (id == 0) { - tile.fuel = value; - } - - if (id == 1) { - tile.maxFuel = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(clicked); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked > 0)// INVENTORY - { - if (TileEntityBlastFH.isFuel(itemstack1)) { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) { - return null; - } - } else if (clicked >= 1 && clicked < 28)// INVENTORY - { - if (!this.mergeItemStack(itemstack1, 28, 37, false)) { - return null; - } - } - // BAR - else if (clicked >= 28 && clicked < 37 && !this.mergeItemStack(itemstack1, 1, 28, false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 1, 37, false)) { - return null; - } - - if (itemstack1.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + private TileEntityBlastFH tile; + private boolean isGuiContainer = false; + private int lastFuel; + private int lastFuelMax; + + public ContainerBlastHeater(InventoryPlayer user, TileEntityBlastFH tile) { + isGuiContainer = true; + this.tile = tile; + + this.addSlotToContainer(new Slot(tile, 0, 80, 76)); + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastFuel != tile.fuel) { + icrafting.sendProgressBarUpdate(this, 0, tile.fuel); + } + + if (this.lastFuelMax != tile.maxFuel) { + icrafting.sendProgressBarUpdate(this, 1, tile.maxFuel); + } + } + this.lastFuel = tile.fuel; + this.lastFuelMax = tile.maxFuel; + + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.fuel = value; + } + + if (id == 1) { + tile.maxFuel = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked > 0)// INVENTORY + { + if (TileEntityBlastFH.isFuel(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (clicked >= 1 && clicked < 28)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 28, 37, false)) { + return null; + } + } + // BAR + else if (clicked >= 28 && clicked < 37 && !this.mergeItemStack(itemstack1, 1, 28, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 1, 37, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerBloomery.java b/src/main/java/minefantasy/mf2/container/ContainerBloomery.java index c2be9051..32962407 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerBloomery.java +++ b/src/main/java/minefantasy/mf2/container/ContainerBloomery.java @@ -10,101 +10,101 @@ import net.minecraft.item.ItemStack; public class ContainerBloomery extends Container { - private TileEntityBloomery tile; - private boolean isGuiContainer = false; - - public ContainerBloomery(InventoryPlayer user, TileEntityBloomery tile) { - isGuiContainer = true; - this.tile = tile; - - this.addSlotToContainer(new SlotRestrictive(tile, 0, 80, 30)); - this.addSlotToContainer(new SlotRestrictive(tile, 1, 80, 68)); - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); - } - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(clicked); - // TOTAL SLOTS: 38 = 2+27+9 - // Chamber = 0-1 - // Inv = 2-28 - // Bar = 29-47 - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked > 1)// INVENTORY - { - if (TileEntityBloomery.isInput(itemstack1)) { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) { - return null; - } - } else if (TileEntityBlastFC.isCarbon(itemstack1)) { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) { - return null; - } - } else if (clicked >= 2 && clicked < 29)// INVENTORY - { - if (!this.mergeItemStack(itemstack1, 29, 38, false)) { - return null; - } - } - // BAR - else if (clicked >= 29 && clicked < 38 && !this.mergeItemStack(itemstack1, 2, 29, false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 2, 38, false)) { - return null; - } - - if (itemstack1.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + private TileEntityBloomery tile; + private boolean isGuiContainer = false; + + public ContainerBloomery(InventoryPlayer user, TileEntityBloomery tile) { + isGuiContainer = true; + this.tile = tile; + + this.addSlotToContainer(new SlotRestrictive(tile, 0, 80, 30)); + this.addSlotToContainer(new SlotRestrictive(tile, 1, 80, 68)); + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + // TOTAL SLOTS: 38 = 2+27+9 + // Chamber = 0-1 + // Inv = 2-28 + // Bar = 29-47 + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked > 1)// INVENTORY + { + if (TileEntityBloomery.isInput(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (TileEntityBlastFC.isCarbon(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) { + return null; + } + } else if (clicked >= 2 && clicked < 29)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 29, 38, false)) { + return null; + } + } + // BAR + else if (clicked >= 29 && clicked < 38 && !this.mergeItemStack(itemstack1, 2, 29, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 2, 38, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerBombBench.java b/src/main/java/minefantasy/mf2/container/ContainerBombBench.java index ac3fd0db..38c52257 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerBombBench.java +++ b/src/main/java/minefantasy/mf2/container/ContainerBombBench.java @@ -9,127 +9,127 @@ import net.minecraft.item.ItemStack; public class ContainerBombBench extends Container { - private TileEntityBombBench tile; - private boolean isGuiContainer = false; - - public ContainerBombBench(InventoryPlayer user, TileEntityBombBench tile) { - isGuiContainer = true; - this.tile = tile; - - this.addSlotToContainer(new SlotBombBench("case", tile, 0, 77, 74)); - this.addSlotToContainer(new SlotBombBench("powder", tile, 1, 77, 48)); - this.addSlotToContainer(new SlotBombBench("filling", tile, 2, 52, 23)); - this.addSlotToContainer(new SlotBombBench("fuse", tile, 3, 102, 23)); - this.addSlotToContainer(new SlotBombBench("bomb", tile, 4, 147, 48)); - this.addSlotToContainer(new SlotBombBench("misc", tile, 5, 147, 75)); - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); - } - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - if (isGuiContainer) { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(clicked); - // TOTAL SLOTS: 41 = 5+27+9 - // Bomb = 0-4 - // Inv = 5-31 - // Bar = 32-40 - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked == 4)// OUTPUT - { - if (!this.mergeItemStack(itemstack1, 5, 41, true)) { - return null; - } - - slot.onSlotChange(itemstack1, itemstack); - } else if (clicked > 4)// INVENTORY - { - if (TileEntityBombBench.isMatch(itemstack1, "bolt") || TileEntityBombBench.isMatch(itemstack1, "arrow") - || TileEntityBombBench.isMatch(itemstack1, "bombcase") - || TileEntityBombBench.isMatch(itemstack1, "minecase")) { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) { - return null; - } - } else if (TileEntityBombBench.isMatch(itemstack1, "powder")) { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) { - return null; - } - } else if (TileEntityBombBench.isMatch(itemstack1, "filling")) { - if (!this.mergeItemStack(itemstack1, 2, 3, false)) { - return null; - } - } else if (TileEntityBombBench.isMatch(itemstack1, "fuse")) { - if (!this.mergeItemStack(itemstack1, 3, 4, false)) { - return null; - } - } else if (clicked >= 5 && clicked < 32)// INVENTORY - { - if (!this.mergeItemStack(itemstack1, 32, 41, false)) { - return null; - } - } - // BAR - else if (clicked >= 32 && clicked < 41 && !this.mergeItemStack(itemstack1, 5, 32, false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 5, 41, false))// BOMB INVENTORY - { - return null; - } - - if (itemstack1.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + private TileEntityBombBench tile; + private boolean isGuiContainer = false; + + public ContainerBombBench(InventoryPlayer user, TileEntityBombBench tile) { + isGuiContainer = true; + this.tile = tile; + + this.addSlotToContainer(new SlotBombBench("case", tile, 0, 77, 74)); + this.addSlotToContainer(new SlotBombBench("powder", tile, 1, 77, 48)); + this.addSlotToContainer(new SlotBombBench("filling", tile, 2, 52, 23)); + this.addSlotToContainer(new SlotBombBench("fuse", tile, 3, 102, 23)); + this.addSlotToContainer(new SlotBombBench("bomb", tile, 4, 147, 48)); + this.addSlotToContainer(new SlotBombBench("misc", tile, 5, 147, 75)); + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + // TOTAL SLOTS: 41 = 5+27+9 + // Bomb = 0-4 + // Inv = 5-31 + // Bar = 32-40 + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked == 4)// OUTPUT + { + if (!this.mergeItemStack(itemstack1, 5, 41, true)) { + return null; + } + + slot.onSlotChange(itemstack1, itemstack); + } else if (clicked > 4)// INVENTORY + { + if (TileEntityBombBench.isMatch(itemstack1, "bolt") || TileEntityBombBench.isMatch(itemstack1, "arrow") + || TileEntityBombBench.isMatch(itemstack1, "bombcase") + || TileEntityBombBench.isMatch(itemstack1, "minecase")) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (TileEntityBombBench.isMatch(itemstack1, "powder")) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) { + return null; + } + } else if (TileEntityBombBench.isMatch(itemstack1, "filling")) { + if (!this.mergeItemStack(itemstack1, 2, 3, false)) { + return null; + } + } else if (TileEntityBombBench.isMatch(itemstack1, "fuse")) { + if (!this.mergeItemStack(itemstack1, 3, 4, false)) { + return null; + } + } else if (clicked >= 5 && clicked < 32)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 32, 41, false)) { + return null; + } + } + // BAR + else if (clicked >= 32 && clicked < 41 && !this.mergeItemStack(itemstack1, 5, 32, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 5, 41, false))// BOMB INVENTORY + { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerCarpenterMF.java b/src/main/java/minefantasy/mf2/container/ContainerCarpenterMF.java index 522b8072..60e1f58b 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerCarpenterMF.java +++ b/src/main/java/minefantasy/mf2/container/ContainerCarpenterMF.java @@ -9,109 +9,109 @@ import net.minecraft.item.ItemStack; public class ContainerCarpenterMF extends Container { - private TileEntityCarpenterMF tile; - private boolean isGuiContainer = false; - - public ContainerCarpenterMF(TileEntityCarpenterMF tile) { - isGuiContainer = false; - this.tile = tile; - int width = tile.width; - int height = tile.height; - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - int slot = y * width + x; - this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 54 + y * 18)); - } - } - this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 5, 174, 80)); - for (int y = 0; y < 4; y++) { - int slot = tile.getSizeInventory() - 4 + y; - this.addSlotToContainer(new Slot(tile, slot, 3, 54 + y * 18)); - } - } - - public ContainerCarpenterMF(InventoryPlayer user, TileEntityCarpenterMF tile) { - isGuiContainer = true; - this.tile = tile; - int width = tile.width; - int height = tile.height; - - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - int slot = y * width + x; - this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 54 + y * 18)); - } - } - this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 5, 174, 80)); - for (int y = 0; y < 4; y++) { - int slot = tile.getSizeInventory() - 4 + y; - this.addSlotToContainer(new Slot(tile, slot, 3, 54 + y * 18)); - } - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 158 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 216)); - } - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - if (isGuiContainer) { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 5, false)) { - return null; - } - - if (itemstack1.stackSize <= 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - } - - return itemstack; - } + private TileEntityCarpenterMF tile; + private boolean isGuiContainer = false; + + public ContainerCarpenterMF(TileEntityCarpenterMF tile) { + isGuiContainer = false; + this.tile = tile; + int width = tile.width; + int height = tile.height; + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int slot = y * width + x; + this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 54 + y * 18)); + } + } + this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 5, 174, 80)); + for (int y = 0; y < 4; y++) { + int slot = tile.getSizeInventory() - 4 + y; + this.addSlotToContainer(new Slot(tile, slot, 3, 54 + y * 18)); + } + } + + public ContainerCarpenterMF(InventoryPlayer user, TileEntityCarpenterMF tile) { + isGuiContainer = true; + this.tile = tile; + int width = tile.width; + int height = tile.height; + + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int slot = y * width + x; + this.addSlotToContainer(new Slot(tile, slot, 44 + x * 18, 54 + y * 18)); + } + } + this.addSlotToContainer(new Slot(tile, tile.getSizeInventory() - 5, 174, 80)); + for (int y = 0; y < 4; y++) { + int slot = tile.getSizeInventory() - 4 + y; + this.addSlotToContainer(new Slot(tile, slot, 3, 54 + y * 18)); + } + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 158 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 216)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 5, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerCrossbowBench.java b/src/main/java/minefantasy/mf2/container/ContainerCrossbowBench.java index c33e84a4..316e33c6 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerCrossbowBench.java +++ b/src/main/java/minefantasy/mf2/container/ContainerCrossbowBench.java @@ -9,124 +9,124 @@ import net.minecraft.item.ItemStack; public class ContainerCrossbowBench extends Container { - private TileEntityCrossbowBench tile; - private boolean isGuiContainer = false; - - public ContainerCrossbowBench(InventoryPlayer user, TileEntityCrossbowBench tile) { - isGuiContainer = true; - this.tile = tile; - - this.addSlotToContainer(new SlotRestrictive(tile, 0, 77, 74)); - this.addSlotToContainer(new SlotRestrictive(tile, 1, 77, 48)); - this.addSlotToContainer(new SlotRestrictive(tile, 2, 52, 48)); - this.addSlotToContainer(new SlotRestrictive(tile, 3, 100, 30)); - this.addSlotToContainer(new SlotRestrictive(tile, 4, 147, 48)); - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); - } - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - if (isGuiContainer) { - tile.onInventoryChanged(); - } - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(clicked); - // TOTAL SLOTS: 41 = 5+27+9 - // Crossbow = 0-4 - // Inv = 5-31 - // Bar = 32-40 - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked == 4)// OUTPUT - { - if (!this.mergeItemStack(itemstack1, 5, 41, true)) { - return null; - } - - slot.onSlotChange(itemstack1, itemstack); - } else if (clicked > 4)// INVENTORY - { - if (TileEntityCrossbowBench.isMatch(itemstack1, "stock")) { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) { - return null; - } - } else if (TileEntityCrossbowBench.isMatch(itemstack1, "mechanism")) { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) { - return null; - } - } else if (TileEntityCrossbowBench.isMatch(itemstack1, "mod")) { - if (!this.mergeItemStack(itemstack1, 2, 3, false)) { - return null; - } - } else if (TileEntityCrossbowBench.isMatch(itemstack1, "muzzle")) { - if (!this.mergeItemStack(itemstack1, 3, 4, false)) { - return null; - } - } else if (clicked >= 5 && clicked < 32)// INVENTORY - { - if (!this.mergeItemStack(itemstack1, 32, 41, false)) { - return null; - } - } - // BAR - else if (clicked >= 32 && clicked < 41 && !this.mergeItemStack(itemstack1, 5, 32, false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 5, 41, false))// BOMB INVENTORY - { - return null; - } - - if (itemstack1.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + private TileEntityCrossbowBench tile; + private boolean isGuiContainer = false; + + public ContainerCrossbowBench(InventoryPlayer user, TileEntityCrossbowBench tile) { + isGuiContainer = true; + this.tile = tile; + + this.addSlotToContainer(new SlotRestrictive(tile, 0, 77, 74)); + this.addSlotToContainer(new SlotRestrictive(tile, 1, 77, 48)); + this.addSlotToContainer(new SlotRestrictive(tile, 2, 52, 48)); + this.addSlotToContainer(new SlotRestrictive(tile, 3, 100, 30)); + this.addSlotToContainer(new SlotRestrictive(tile, 4, 147, 48)); + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 126 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 184)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + if (isGuiContainer) { + tile.onInventoryChanged(); + } + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + // TOTAL SLOTS: 41 = 5+27+9 + // Crossbow = 0-4 + // Inv = 5-31 + // Bar = 32-40 + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked == 4)// OUTPUT + { + if (!this.mergeItemStack(itemstack1, 5, 41, true)) { + return null; + } + + slot.onSlotChange(itemstack1, itemstack); + } else if (clicked > 4)// INVENTORY + { + if (TileEntityCrossbowBench.isMatch(itemstack1, "stock")) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (TileEntityCrossbowBench.isMatch(itemstack1, "mechanism")) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) { + return null; + } + } else if (TileEntityCrossbowBench.isMatch(itemstack1, "mod")) { + if (!this.mergeItemStack(itemstack1, 2, 3, false)) { + return null; + } + } else if (TileEntityCrossbowBench.isMatch(itemstack1, "muzzle")) { + if (!this.mergeItemStack(itemstack1, 3, 4, false)) { + return null; + } + } else if (clicked >= 5 && clicked < 32)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 32, 41, false)) { + return null; + } + } + // BAR + else if (clicked >= 32 && clicked < 41 && !this.mergeItemStack(itemstack1, 5, 32, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 5, 41, false))// BOMB INVENTORY + { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerCrucible.java b/src/main/java/minefantasy/mf2/container/ContainerCrucible.java index dcfd1f50..2fdba1df 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerCrucible.java +++ b/src/main/java/minefantasy/mf2/container/ContainerCrucible.java @@ -11,118 +11,118 @@ import net.minecraft.item.ItemStack; public class ContainerCrucible extends Container { - private TileEntityCrucible tile; - private int lastProgress; - private int lastProgressMax; - private int lastTemp; - - public ContainerCrucible(InventoryPlayer user, TileEntityCrucible tile) { - this.tile = tile; - int width = 3; - int height = 3; - - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - int slot = y * width + x; - this.addSlotToContainer(new Slot(tile, slot, 62 + x * 18, 14 + y * 18)); - } - } - this.addSlotToContainer(new SlotCrucibleOut(tile, tile.getSizeInventory() - 1, 129, 32)); - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 162)); - } - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.crafters.size(); ++i) { - ICrafting icrafting = (ICrafting) this.crafters.get(i); - - if (this.lastProgress != (int) tile.progress) { - icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); - } - if (this.lastProgressMax != (int) tile.progressMax) { - icrafting.sendProgressBarUpdate(this, 1, (int) tile.progressMax); - } - if (this.lastTemp != (int) tile.temperature) { - icrafting.sendProgressBarUpdate(this, 2, (int) tile.temperature); - } - } - this.lastProgress = (int) tile.progress; - this.lastProgressMax = (int) tile.progressMax; - this.lastTemp = (int) tile.temperature; - - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - tile.onInventoryChanged(); - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) { - if (id == 0) { - tile.progress = value; - } - - if (id == 1) { - tile.progressMax = value; - } - - if (id == 2) { - tile.temperature = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { - return null; - } - - if (itemstack1.stackSize <= 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - } - - return itemstack; - } + private TileEntityCrucible tile; + private int lastProgress; + private int lastProgressMax; + private int lastTemp; + + public ContainerCrucible(InventoryPlayer user, TileEntityCrucible tile) { + this.tile = tile; + int width = 3; + int height = 3; + + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int slot = y * width + x; + this.addSlotToContainer(new Slot(tile, slot, 62 + x * 18, 14 + y * 18)); + } + } + this.addSlotToContainer(new SlotCrucibleOut(tile, tile.getSizeInventory() - 1, 129, 32)); + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 162)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastProgress != (int) tile.progress) { + icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); + } + if (this.lastProgressMax != (int) tile.progressMax) { + icrafting.sendProgressBarUpdate(this, 1, (int) tile.progressMax); + } + if (this.lastTemp != (int) tile.temperature) { + icrafting.sendProgressBarUpdate(this, 2, (int) tile.temperature); + } + } + this.lastProgress = (int) tile.progress; + this.lastProgressMax = (int) tile.progressMax; + this.lastTemp = (int) tile.temperature; + + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + tile.onInventoryChanged(); + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.progress = value; + } + + if (id == 1) { + tile.progressMax = value; + } + + if (id == 2) { + tile.temperature = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerForge.java b/src/main/java/minefantasy/mf2/container/ContainerForge.java index 579e8cbf..b9862b80 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerForge.java +++ b/src/main/java/minefantasy/mf2/container/ContainerForge.java @@ -11,174 +11,174 @@ import net.minecraft.item.ItemStack; public class ContainerForge extends Container { - private TileEntityForge tile; - private int lastTemp; - - public ContainerForge(InventoryPlayer user, TileEntityForge tile) { - this.tile = tile; - int width = 3; - int height = 3; - - this.addSlotToContainer(new Slot(tile, 0, 70 + 18, 14 + 18)); - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 93 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 151)); - } - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.crafters.size(); ++i) { - ICrafting icrafting = (ICrafting) this.crafters.get(i); - - if (this.lastTemp != (int) tile.temperature) { - icrafting.sendProgressBarUpdate(this, 0, (int) tile.temperature); - } - } - this.lastTemp = (int) tile.temperature; - - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - tile.onInventoryChanged(); - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) { - if (id == 0) { - tile.temperature = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { - return null; - } - } else if (!this.mergeItemStack(true, itemstack1, 0, slotCount, false)) { - return null; - } - - if (itemstack1.stackSize <= 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - } - - return itemstack; - } - - @Override - protected boolean mergeItemStack(ItemStack item, int minSlot, int maxSlot, boolean goBackwards) { - return mergeItemStack(true, item, minSlot, maxSlot, goBackwards); - } - - protected boolean mergeItemStack(boolean allowStack, ItemStack item, int minSlot, int maxSlot, - boolean goBackwards) { - boolean flag1 = false; - int k = minSlot; - - if (goBackwards) { - k = maxSlot - 1; - } - - Slot slot; - ItemStack itemstack1; - - if (allowStack && item.isStackable()) { - while (item.stackSize > 0 && (!goBackwards && k < maxSlot || goBackwards && k >= minSlot)) { - slot = (Slot) this.inventorySlots.get(k); - itemstack1 = slot.getStack(); - - if (itemstack1 != null && itemstack1.getItem() == item.getItem() - && (!item.getHasSubtypes() || item.getItemDamage() == itemstack1.getItemDamage()) - && ItemStack.areItemStackTagsEqual(item, itemstack1)) { - int l = itemstack1.stackSize + item.stackSize; - - if (l <= item.getMaxStackSize()) { - item.stackSize = 0; - itemstack1.stackSize = l; - slot.onSlotChanged(); - flag1 = true; - } else if (itemstack1.stackSize < item.getMaxStackSize()) { - item.stackSize -= item.getMaxStackSize() - itemstack1.stackSize; - itemstack1.stackSize = item.getMaxStackSize(); - slot.onSlotChanged(); - flag1 = true; - } - } - - if (goBackwards) { - --k; - } else { - ++k; - } - } - } - - if (item.stackSize > 0) { - if (goBackwards) { - k = maxSlot - 1; - } else { - k = minSlot; - } - - while (!goBackwards && k < maxSlot || goBackwards && k >= minSlot) { - slot = (Slot) this.inventorySlots.get(k); - itemstack1 = slot.getStack(); - - if (itemstack1 == null) { - ItemStack i2 = item.copy(); - i2.stackSize = 1; - slot.putStack(i2); - slot.onSlotChanged(); - item.stackSize--; - flag1 = true; - break; - } - - if (goBackwards) { - --k; - } else { - ++k; - } - } - } - - return flag1; - } + private TileEntityForge tile; + private int lastTemp; + + public ContainerForge(InventoryPlayer user, TileEntityForge tile) { + this.tile = tile; + int width = 3; + int height = 3; + + this.addSlotToContainer(new Slot(tile, 0, 70 + 18, 14 + 18)); + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 93 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 151)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastTemp != (int) tile.temperature) { + icrafting.sendProgressBarUpdate(this, 0, (int) tile.temperature); + } + } + this.lastTemp = (int) tile.temperature; + + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + tile.onInventoryChanged(); + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.temperature = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(true, itemstack1, 0, slotCount, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } + + @Override + protected boolean mergeItemStack(ItemStack item, int minSlot, int maxSlot, boolean goBackwards) { + return mergeItemStack(true, item, minSlot, maxSlot, goBackwards); + } + + protected boolean mergeItemStack(boolean allowStack, ItemStack item, int minSlot, int maxSlot, + boolean goBackwards) { + boolean flag1 = false; + int k = minSlot; + + if (goBackwards) { + k = maxSlot - 1; + } + + Slot slot; + ItemStack itemstack1; + + if (allowStack && item.isStackable()) { + while (item.stackSize > 0 && (!goBackwards && k < maxSlot || goBackwards && k >= minSlot)) { + slot = (Slot) this.inventorySlots.get(k); + itemstack1 = slot.getStack(); + + if (itemstack1 != null && itemstack1.getItem() == item.getItem() + && (!item.getHasSubtypes() || item.getItemDamage() == itemstack1.getItemDamage()) + && ItemStack.areItemStackTagsEqual(item, itemstack1)) { + int l = itemstack1.stackSize + item.stackSize; + + if (l <= item.getMaxStackSize()) { + item.stackSize = 0; + itemstack1.stackSize = l; + slot.onSlotChanged(); + flag1 = true; + } else if (itemstack1.stackSize < item.getMaxStackSize()) { + item.stackSize -= item.getMaxStackSize() - itemstack1.stackSize; + itemstack1.stackSize = item.getMaxStackSize(); + slot.onSlotChanged(); + flag1 = true; + } + } + + if (goBackwards) { + --k; + } else { + ++k; + } + } + } + + if (item.stackSize > 0) { + if (goBackwards) { + k = maxSlot - 1; + } else { + k = minSlot; + } + + while (!goBackwards && k < maxSlot || goBackwards && k >= minSlot) { + slot = (Slot) this.inventorySlots.get(k); + itemstack1 = slot.getStack(); + + if (itemstack1 == null) { + ItemStack i2 = item.copy(); + i2.stackSize = 1; + slot.putStack(i2); + slot.onSlotChanged(); + item.stackSize--; + flag1 = true; + break; + } + + if (goBackwards) { + --k; + } else { + ++k; + } + } + } + + return flag1; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerQuern.java b/src/main/java/minefantasy/mf2/container/ContainerQuern.java index 05d8bb8d..82a38044 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerQuern.java +++ b/src/main/java/minefantasy/mf2/container/ContainerQuern.java @@ -8,85 +8,85 @@ import net.minecraft.item.ItemStack; public class ContainerQuern extends Container { - private TileEntityQuern tile; - private boolean isGuiContainer = false; + private TileEntityQuern tile; + private boolean isGuiContainer = false; - public ContainerQuern(InventoryPlayer user, TileEntityQuern tile) { - isGuiContainer = true; - this.tile = tile; + public ContainerQuern(InventoryPlayer user, TileEntityQuern tile) { + isGuiContainer = true; + this.tile = tile; - this.addSlotToContainer(new SlotRestrictive(tile, 0, 81, 9)); - this.addSlotToContainer(new SlotRestrictive(tile, 1, 81, 32)); - this.addSlotToContainer(new SlotRestrictive(tile, 2, 81, 55)); + this.addSlotToContainer(new SlotRestrictive(tile, 0, 81, 9)); + this.addSlotToContainer(new SlotRestrictive(tile, 1, 81, 32)); + this.addSlotToContainer(new SlotRestrictive(tile, 2, 81, 55)); - int i; + int i; - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 93 + i * 18)); - } - } + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 93 + i * 18)); + } + } - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 151)); - } - } + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 151)); + } + } - @Override - public boolean canInteractWith(EntityPlayer user) { - return this.tile.isUseableByPlayer(user); - } + @Override + public boolean canInteractWith(EntityPlayer user) { + return this.tile.isUseableByPlayer(user); + } - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(clicked); - // TOTAL SLOTS: 39 = 3+27+9 - // Chamber = 0-2 - // Inv = 2-28 - // Bar = 29-47 + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + // TOTAL SLOTS: 39 = 3+27+9 + // Chamber = 0-2 + // Inv = 2-28 + // Bar = 29-47 - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); - if (clicked > 2)// INVENTORY - { - if (TileEntityQuern.isInput(itemstack1)) { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) { - return null; - } - } else if (TileEntityQuern.isPot(itemstack1)) { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) { - return null; - } - } else if (clicked >= 3 && clicked < 30)// INVENTORY - { - if (!this.mergeItemStack(itemstack1, 30, 39, false)) { - return null; - } - } - // BAR - else if (clicked >= 30 && clicked < 39 && !this.mergeItemStack(itemstack1, 3, 30, false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 3, 39, false)) { - return null; - } + if (clicked > 2)// INVENTORY + { + if (TileEntityQuern.isInput(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (TileEntityQuern.isPot(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) { + return null; + } + } else if (clicked >= 3 && clicked < 30)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 30, 39, false)) { + return null; + } + } + // BAR + else if (clicked >= 30 && clicked < 39 && !this.mergeItemStack(itemstack1, 3, 30, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 3, 39, false)) { + return null; + } - if (itemstack1.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } - if (itemstack1.stackSize == itemstack.stackSize) { - return null; - } + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } - slot.onPickupFromSlot(user, itemstack1); - } + slot.onPickupFromSlot(user, itemstack1); + } - return itemstack; - } + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerReload.java b/src/main/java/minefantasy/mf2/container/ContainerReload.java index 3f6dd4c8..b30ddcff 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerReload.java +++ b/src/main/java/minefantasy/mf2/container/ContainerReload.java @@ -12,119 +12,118 @@ import net.minecraft.item.ItemStack; public class ContainerReload extends Container { - private InventoryBasic weaponInv; - private ItemStack weapon; - - public ContainerReload(InventoryPlayer user, ItemStack weapon) { - this.weapon = weapon; - weaponInv = new InventoryBasic("reload", false, 1); - weaponInv.setInventorySlotContents(0, AmmoMechanicsMF.getAmmo(weapon)); - this.addSlotToContainer(new SlotReload(this, weaponInv, 0, 79, 11)); - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 66 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - if (i != user.currentItem) { - this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 124)); - } - } - } - - @Override - public ItemStack slotClick(int p_75144_1_, int p_75144_2_, int p_75144_3_, EntityPlayer p_75144_4_) { - ItemStack result = super.slotClick(p_75144_1_, p_75144_2_, p_75144_3_, p_75144_4_); - - ItemStack ammo = weaponInv.getStackInSlot(0); - AmmoMechanicsMF.setAmmo(weapon, ammo); - - return result; - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - previousAmmo = weaponInv.getStackInSlot(0); - } - - private ItemStack previousAmmo; - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(clicked); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked > 0)// INVENTORY - { - if (canAccept(itemstack1)) { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) { - return null; - } - } else if (clicked >= 1 && clicked < 27)// INVENTORY - { - if (!this.mergeItemStack(itemstack1, 27, 36, false)) { - return null; - } - } - // BAR - else if (clicked >= 27 && clicked < 36 && !this.mergeItemStack(itemstack1, 1, 27, false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 1, 36, false)) { - return null; - } - - if (itemstack1.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } - - public boolean canAccept(ItemStack ammo) { - String ammoType = "null"; - if (ammo != null && ammo.getItem() instanceof IAmmo) { - ammoType = ((IAmmo) ammo.getItem()).getAmmoType(ammo); - } - - if (weapon != null && weapon.getItem() instanceof IFirearm) { - return ((IFirearm) weapon.getItem()).canAcceptAmmo(weapon, ammoType); - } - - return ammoType.equalsIgnoreCase("arrow"); - } - - @Override - public boolean canInteractWith(EntityPlayer user) { - return true; - } + private InventoryBasic weaponInv; + private ItemStack weapon; + private ItemStack previousAmmo; + + public ContainerReload(InventoryPlayer user, ItemStack weapon) { + this.weapon = weapon; + weaponInv = new InventoryBasic("reload", false, 1); + weaponInv.setInventorySlotContents(0, AmmoMechanicsMF.getAmmo(weapon)); + this.addSlotToContainer(new SlotReload(this, weaponInv, 0, 79, 11)); + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 8 + j * 18, 66 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + if (i != user.currentItem) { + this.addSlotToContainer(new Slot(user, i, 8 + i * 18, 124)); + } + } + } + + @Override + public ItemStack slotClick(int p_75144_1_, int p_75144_2_, int p_75144_3_, EntityPlayer p_75144_4_) { + ItemStack result = super.slotClick(p_75144_1_, p_75144_2_, p_75144_3_, p_75144_4_); + + ItemStack ammo = weaponInv.getStackInSlot(0); + AmmoMechanicsMF.setAmmo(weapon, ammo); + + return result; + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + previousAmmo = weaponInv.getStackInSlot(0); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked > 0)// INVENTORY + { + if (canAccept(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (clicked >= 1 && clicked < 27)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 27, 36, false)) { + return null; + } + } + // BAR + else if (clicked >= 27 && clicked < 36 && !this.mergeItemStack(itemstack1, 1, 27, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 1, 36, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } + + public boolean canAccept(ItemStack ammo) { + String ammoType = "null"; + if (ammo != null && ammo.getItem() instanceof IAmmo) { + ammoType = ((IAmmo) ammo.getItem()).getAmmoType(ammo); + } + + if (weapon != null && weapon.getItem() instanceof IFirearm) { + return ((IFirearm) weapon.getItem()).canAcceptAmmo(weapon, ammoType); + } + + return ammoType.equalsIgnoreCase("arrow"); + } + + @Override + public boolean canInteractWith(EntityPlayer user) { + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerResearch.java b/src/main/java/minefantasy/mf2/container/ContainerResearch.java index 911604da..e6a30313 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerResearch.java +++ b/src/main/java/minefantasy/mf2/container/ContainerResearch.java @@ -11,104 +11,104 @@ import net.minecraft.item.ItemStack; public class ContainerResearch extends Container { - private TileEntityResearch tile; - private boolean isGuiContainer = false; - private int lastProgress; - private int lastProgressMax; - - public ContainerResearch(InventoryPlayer user, TileEntityResearch tile) { - isGuiContainer = true; - this.tile = tile; - - this.addSlotToContainer(new Slot(tile, 0, 83, 40)); - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 10 + j * 18, 76 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.addSlotToContainer(new Slot(user, i, 10 + i * 18, 134)); - } - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.crafters.size(); ++i) { - ICrafting icrafting = (ICrafting) this.crafters.get(i); - - if (this.lastProgress != tile.progress) { - icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); - } - if (this.lastProgressMax != tile.maxProgress) { - icrafting.sendProgressBarUpdate(this, 1, (int) tile.maxProgress); - } - } - this.lastProgress = (int) tile.progress; - this.lastProgressMax = (int) tile.maxProgress; - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) { - if (id == 0) { - tile.progress = value; - } - if (id == 1) { - tile.maxProgress = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer user) { - return this.tile.isUseableByPlayer(user); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(clicked); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (clicked > 0)// INVENTORY - { - if (TileEntityResearch.canAccept(itemstack1)) { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) { - return null; - } - } else if (clicked >= 1 && clicked < 28)// INVENTORY - { - if (!this.mergeItemStack(itemstack1, 28, 37, false)) { - return null; - } - } - // BAR - else if (clicked >= 28 && clicked < 37 && !this.mergeItemStack(itemstack1, 1, 28, false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 1, 37, false)) { - return null; - } - - if (itemstack1.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) { - return null; - } - - slot.onPickupFromSlot(user, itemstack1); - } - - return itemstack; - } + private TileEntityResearch tile; + private boolean isGuiContainer = false; + private int lastProgress; + private int lastProgressMax; + + public ContainerResearch(InventoryPlayer user, TileEntityResearch tile) { + isGuiContainer = true; + this.tile = tile; + + this.addSlotToContainer(new Slot(tile, 0, 83, 40)); + + int i; + + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(user, j + i * 9 + 9, 10 + j * 18, 76 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(user, i, 10 + i * 18, 134)); + } + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastProgress != tile.progress) { + icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); + } + if (this.lastProgressMax != tile.maxProgress) { + icrafting.sendProgressBarUpdate(this, 1, (int) tile.maxProgress); + } + } + this.lastProgress = (int) tile.progress; + this.lastProgressMax = (int) tile.maxProgress; + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.progress = value; + } + if (id == 1) { + tile.maxProgress = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer user) { + return this.tile.isUseableByPlayer(user); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int clicked) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(clicked); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (clicked > 0)// INVENTORY + { + if (TileEntityResearch.canAccept(itemstack1)) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (clicked >= 1 && clicked < 28)// INVENTORY + { + if (!this.mergeItemStack(itemstack1, 28, 37, false)) { + return null; + } + } + // BAR + else if (clicked >= 28 && clicked < 37 && !this.mergeItemStack(itemstack1, 1, 28, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 1, 37, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(user, itemstack1); + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerRoast.java b/src/main/java/minefantasy/mf2/container/ContainerRoast.java index ada3eb74..261c16d7 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerRoast.java +++ b/src/main/java/minefantasy/mf2/container/ContainerRoast.java @@ -10,89 +10,89 @@ import net.minecraft.item.ItemStack; public class ContainerRoast extends Container { - private TileEntityRoast tile; - private int lastProgress; - private int lastProgressMax; - - public ContainerRoast(TileEntityRoast tile) { - this.tile = tile; - this.addSlotToContainer(new Slot(tile, 0, 0, 0)); - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.crafters.size(); ++i) { - ICrafting icrafting = (ICrafting) this.crafters.get(i); - - if (this.lastProgress != (int) tile.progress) { - icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); - } - if (this.lastProgressMax != (int) tile.maxProgress) { - icrafting.sendProgressBarUpdate(this, 1, (int) tile.maxProgress); - } - } - this.lastProgress = (int) tile.progress; - this.lastProgressMax = (int) tile.maxProgress; - - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - tile.onInventoryChanged(); - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) { - if (id == 0) { - tile.progress = value; - } - - if (id == 1) { - tile.maxProgress = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { - return null; - } - - if (itemstack1.stackSize <= 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - } - - return itemstack; - } + private TileEntityRoast tile; + private int lastProgress; + private int lastProgressMax; + + public ContainerRoast(TileEntityRoast tile) { + this.tile = tile; + this.addSlotToContainer(new Slot(tile, 0, 0, 0)); + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastProgress != (int) tile.progress) { + icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); + } + if (this.lastProgressMax != (int) tile.maxProgress) { + icrafting.sendProgressBarUpdate(this, 1, (int) tile.maxProgress); + } + } + this.lastProgress = (int) tile.progress; + this.lastProgressMax = (int) tile.maxProgress; + + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + tile.onInventoryChanged(); + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.progress = value; + } + + if (id == 1) { + tile.maxProgress = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/ContainerTanner.java b/src/main/java/minefantasy/mf2/container/ContainerTanner.java index 56ab9e59..b925ae06 100644 --- a/src/main/java/minefantasy/mf2/container/ContainerTanner.java +++ b/src/main/java/minefantasy/mf2/container/ContainerTanner.java @@ -10,90 +10,90 @@ import net.minecraft.item.ItemStack; public class ContainerTanner extends Container { - private TileEntityTanningRack tile; - private int lastProgress; - private int lastProgressMax; - - public ContainerTanner(TileEntityTanningRack tile) { - this.tile = tile; - for (int a = 0; a < 2; a++) - this.addSlotToContainer(new Slot(tile, a, 0, 0)); - } - - @Override - public void detectAndSendChanges() { - for (int i = 0; i < this.crafters.size(); ++i) { - ICrafting icrafting = (ICrafting) this.crafters.get(i); - - if (this.lastProgress != (int) tile.progress) { - icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); - } - if (this.lastProgressMax != (int) tile.maxProgress) { - icrafting.sendProgressBarUpdate(this, 1, (int) tile.maxProgress); - } - } - this.lastProgress = (int) tile.progress; - this.lastProgressMax = (int) tile.maxProgress; - - for (int i = 0; i < this.inventorySlots.size(); ++i) { - ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); - ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); - - if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { - tile.onInventoryChanged(); - - itemstack1 = itemstack == null ? null : itemstack.copy(); - this.inventoryItemStacks.set(i, itemstack1); - - for (int j = 0; j < this.crafters.size(); ++j) { - ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); - } - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void updateProgressBar(int id, int value) { - if (id == 0) { - tile.progress = value; - } - - if (id == 1) { - tile.maxProgress = value; - } - } - - @Override - public boolean canInteractWith(EntityPlayer p_75145_1_) { - return this.tile.isUseableByPlayer(p_75145_1_); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { - int slotCount = tile.getSizeInventory(); - ItemStack itemstack = null; - Slot slot = (Slot) this.inventorySlots.get(currentSlot); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (currentSlot < slotCount) { - if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { - return null; - } - } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { - return null; - } - - if (itemstack1.stackSize <= 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - } - - return itemstack; - } + private TileEntityTanningRack tile; + private int lastProgress; + private int lastProgressMax; + + public ContainerTanner(TileEntityTanningRack tile) { + this.tile = tile; + for (int a = 0; a < 2; a++) + this.addSlotToContainer(new Slot(tile, a, 0, 0)); + } + + @Override + public void detectAndSendChanges() { + for (int i = 0; i < this.crafters.size(); ++i) { + ICrafting icrafting = (ICrafting) this.crafters.get(i); + + if (this.lastProgress != (int) tile.progress) { + icrafting.sendProgressBarUpdate(this, 0, (int) tile.progress); + } + if (this.lastProgressMax != (int) tile.maxProgress) { + icrafting.sendProgressBarUpdate(this, 1, (int) tile.maxProgress); + } + } + this.lastProgress = (int) tile.progress; + this.lastProgressMax = (int) tile.maxProgress; + + for (int i = 0; i < this.inventorySlots.size(); ++i) { + ItemStack itemstack = ((Slot) this.inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack) this.inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { + tile.onInventoryChanged(); + + itemstack1 = itemstack == null ? null : itemstack.copy(); + this.inventoryItemStacks.set(i, itemstack1); + + for (int j = 0; j < this.crafters.size(); ++j) { + ((ICrafting) this.crafters.get(j)).sendSlotContents(this, i, itemstack1); + } + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int id, int value) { + if (id == 0) { + tile.progress = value; + } + + if (id == 1) { + tile.maxProgress = value; + } + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return this.tile.isUseableByPlayer(p_75145_1_); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer user, int currentSlot) { + int slotCount = tile.getSizeInventory(); + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(currentSlot); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (currentSlot < slotCount) { + if (!this.mergeItemStack(itemstack1, slotCount, this.inventorySlots.size(), false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, slotCount - 1, false)) { + return null; + } + + if (itemstack1.stackSize <= 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/container/InventoryReload.java b/src/main/java/minefantasy/mf2/container/InventoryReload.java index 98e607d4..ae14de97 100644 --- a/src/main/java/minefantasy/mf2/container/InventoryReload.java +++ b/src/main/java/minefantasy/mf2/container/InventoryReload.java @@ -6,88 +6,88 @@ import net.minecraft.item.ItemStack; public class InventoryReload implements IInventory { - private ItemStack weapon; - - public InventoryReload(ItemStack weapon) { - this.weapon = weapon; - } - - @Override - public int getSizeInventory() { - return 1; - } - - @Override - public ItemStack getStackInSlot(int i) { - return AmmoMechanicsMF.getAmmo(weapon); - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - ItemStack ammo = AmmoMechanicsMF.getAmmo(weapon); - if (ammo != null) { - ItemStack ammo2 = ammo.copy(); - ammo.stackSize -= num; - ammo2.stackSize = num; - if (ammo.stackSize > 0) { - setInventorySlotContents(slot, ammo); - } else { - setInventorySlotContents(slot, null); - } - return ammo2; - } - return ammo; - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return null; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - if (item != null) { - AmmoMechanicsMF.setAmmo(weapon, item); - } else { - AmmoMechanicsMF.removeAmmo(weapon); - } - } - - @Override - public String getInventoryName() { - return null; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public void markDirty() { - } - - @Override - public boolean isUseableByPlayer(EntityPlayer user) { - return true; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack item) { - return false; - } + private ItemStack weapon; + + public InventoryReload(ItemStack weapon) { + this.weapon = weapon; + } + + @Override + public int getSizeInventory() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int i) { + return AmmoMechanicsMF.getAmmo(weapon); + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + ItemStack ammo = AmmoMechanicsMF.getAmmo(weapon); + if (ammo != null) { + ItemStack ammo2 = ammo.copy(); + ammo.stackSize -= num; + ammo2.stackSize = num; + if (ammo.stackSize > 0) { + setInventorySlotContents(slot, ammo); + } else { + setInventorySlotContents(slot, null); + } + return ammo2; + } + return ammo; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return null; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + if (item != null) { + AmmoMechanicsMF.setAmmo(weapon, item); + } else { + AmmoMechanicsMF.removeAmmo(weapon); + } + } + + @Override + public String getInventoryName() { + return null; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public void markDirty() { + } + + @Override + public boolean isUseableByPlayer(EntityPlayer user) { + return true; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) { + return false; + } } diff --git a/src/main/java/minefantasy/mf2/container/SlotBombBench.java b/src/main/java/minefantasy/mf2/container/SlotBombBench.java index 707ce81f..30bfad77 100644 --- a/src/main/java/minefantasy/mf2/container/SlotBombBench.java +++ b/src/main/java/minefantasy/mf2/container/SlotBombBench.java @@ -8,22 +8,22 @@ import net.minecraft.item.ItemStack; public class SlotBombBench extends Slot { - private final String type; + private final String type; - public SlotBombBench(String type, IInventory parent, int id, int x, int y) { - super(parent, id, x, y); - this.type = type; - } + public SlotBombBench(String type, IInventory parent, int id, int x, int y) { + super(parent, id, x, y); + this.type = type; + } - @Override - public boolean isItemValid(ItemStack item) { - if (type.equalsIgnoreCase("case")) { - return TileEntityBombBench.isMatch(item, "arrow") || TileEntityBombBench.isMatch(item, "bolt") - || TileEntityBombBench.isMatch(item, "bombCase") || TileEntityBombBench.isMatch(item, "mineCase"); - } - if (type.equalsIgnoreCase("bomb")) { - return item.getItem() instanceof ItemBomb || item.getItem() instanceof ItemMine; - } - return TileEntityBombBench.isMatch(item, type); - } + @Override + public boolean isItemValid(ItemStack item) { + if (type.equalsIgnoreCase("case")) { + return TileEntityBombBench.isMatch(item, "arrow") || TileEntityBombBench.isMatch(item, "bolt") + || TileEntityBombBench.isMatch(item, "bombCase") || TileEntityBombBench.isMatch(item, "mineCase"); + } + if (type.equalsIgnoreCase("bomb")) { + return item.getItem() instanceof ItemBomb || item.getItem() instanceof ItemMine; + } + return TileEntityBombBench.isMatch(item, type); + } } diff --git a/src/main/java/minefantasy/mf2/container/SlotCrucibleOut.java b/src/main/java/minefantasy/mf2/container/SlotCrucibleOut.java index 5b946508..0dacb742 100644 --- a/src/main/java/minefantasy/mf2/container/SlotCrucibleOut.java +++ b/src/main/java/minefantasy/mf2/container/SlotCrucibleOut.java @@ -8,30 +8,30 @@ import net.minecraft.item.ItemStack; public class SlotCrucibleOut extends Slot { - private TileEntityCrucible tile; - private int slotNum; + private TileEntityCrucible tile; + private int slotNum; - public SlotCrucibleOut(TileEntityCrucible parent, int id, int x, int y) { - super(parent, id, x, y); - this.tile = parent; - this.slotNum = id; - } + public SlotCrucibleOut(TileEntityCrucible parent, int id, int x, int y) { + super(parent, id, x, y); + this.tile = parent; + this.slotNum = id; + } - @Override - public boolean canTakeStack(EntityPlayer player) { - return canTakeStack(); - } + @Override + public boolean canTakeStack(EntityPlayer player) { + return canTakeStack(); + } - public boolean canTakeStack() { - ItemStack slot = tile.getStackInSlot(slotNum); - if (slot != null && slot.getItem() instanceof ItemBlock) { - return true; - } - return !ConfigHardcore.HCCreduceIngots || tile.isAuto(); - } + public boolean canTakeStack() { + ItemStack slot = tile.getStackInSlot(slotNum); + if (slot != null && slot.getItem() instanceof ItemBlock) { + return true; + } + return !ConfigHardcore.HCCreduceIngots || tile.isAuto(); + } - @Override - public boolean isItemValid(ItemStack item) { - return true; - } + @Override + public boolean isItemValid(ItemStack item) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/container/SlotReload.java b/src/main/java/minefantasy/mf2/container/SlotReload.java index 1e2bb46d..94c2df4e 100644 --- a/src/main/java/minefantasy/mf2/container/SlotReload.java +++ b/src/main/java/minefantasy/mf2/container/SlotReload.java @@ -5,17 +5,17 @@ import net.minecraft.item.ItemStack; public class SlotReload extends Slot { - private ContainerReload container; - private int slot; + private ContainerReload container; + private int slot; - public SlotReload(ContainerReload container, IInventory parent, int id, int x, int y) { - super(parent, id, x, y); - this.container = container; - this.slot = id; - } + public SlotReload(ContainerReload container, IInventory parent, int id, int x, int y) { + super(parent, id, x, y); + this.container = container; + this.slot = id; + } - @Override - public boolean isItemValid(ItemStack item) { - return container.canAccept(item); - } + @Override + public boolean isItemValid(ItemStack item) { + return container.canAccept(item); + } } diff --git a/src/main/java/minefantasy/mf2/container/SlotRestrictive.java b/src/main/java/minefantasy/mf2/container/SlotRestrictive.java index c1975d81..d078e1f8 100644 --- a/src/main/java/minefantasy/mf2/container/SlotRestrictive.java +++ b/src/main/java/minefantasy/mf2/container/SlotRestrictive.java @@ -5,17 +5,17 @@ import net.minecraft.item.ItemStack; public class SlotRestrictive extends Slot { - private IInventory tile; - private int slot; + private IInventory tile; + private int slot; - public SlotRestrictive(IInventory parent, int id, int x, int y) { - super(parent, id, x, y); - this.tile = parent; - this.slot = id; - } + public SlotRestrictive(IInventory parent, int id, int x, int y) { + super(parent, id, x, y); + this.tile = parent; + this.slot = id; + } - @Override - public boolean isItemValid(ItemStack item) { - return tile.isItemValidForSlot(slot, item); - } + @Override + public boolean isItemValid(ItemStack item) { + return tile.isItemValidForSlot(slot, item); + } } diff --git a/src/main/java/minefantasy/mf2/entity/EntityArrowMF.java b/src/main/java/minefantasy/mf2/entity/EntityArrowMF.java index ed1fd322..53b1aa2a 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityArrowMF.java +++ b/src/main/java/minefantasy/mf2/entity/EntityArrowMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.entity; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.archery.IArrowMF; @@ -32,924 +29,930 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.play.server.S2BPacketChangeGameState; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; +import net.minecraft.util.*; import net.minecraft.world.World; +import java.util.Iterator; +import java.util.List; + public class EntityArrowMF extends EntityArrow implements IProjectile, IDamageType, IArrowRetrieve { - private boolean playedSound = false; - private int xTile = -1; - private int yTile = -1; - private int zTile = -1; - private Block inBlock; - private int inData; - private boolean inGround; - /** 1 if the player can pick up the arrow */ - public int canBePickedUp; - /** Seems to be some sort of timer for animating an arrow. */ - public int arrowShake; - /** The owner of this arrow. */ - public Entity shootingEntity; - private int ticksInGround; - private int ticksInAir; - private double damage = 2.0D; - /** The amount of knockback an arrow applies when it hits a mob. */ - private int knockbackStrength; - public float velocityModifier = 1.0F; - public ArrowType arrowtype = ArrowType.NORMAL; - public float firepower = 1F; - - public EntityArrowMF(World world) { - super(world); - this.renderDistanceWeight = 10.0D; - this.setSize(0.5F, 0.5F); - } - - public EntityArrowMF(World world, double x, double y, double z) { - super(world); - this.renderDistanceWeight = 10.0D; - this.setSize(0.5F, 0.5F); - this.setPosition(x, y, z); - this.yOffset = 0.0F; - } - - /** - * This is for shooting an arrow from a shooting entity to a target(Like - * skeletons and such) - */ - public EntityArrowMF(World world, EntityLivingBase shooter, EntityLivingBase target, float accuracy, float power) { - super(world); - this.renderDistanceWeight = 10.0D; - this.shootingEntity = shooter; - - this.firepower = power; - if (shooter instanceof EntityPlayer) { - this.canBePickedUp = 1; - } - - this.posY = shooter.posY + shooter.getEyeHeight() - 0.10000000149011612D; - double d0 = target.posX - shooter.posX; - double d1 = target.boundingBox.minY + target.height / 3.0F - this.posY; - double d2 = target.posZ - shooter.posZ; - double d3 = MathHelper.sqrt_double(d0 * d0 + d2 * d2); - - if (d3 >= 1.0E-7D) { - float f2 = (float) (Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F; - float f3 = (float) (-(Math.atan2(d1, d3) * 180.0D / Math.PI)); - double d4 = d0 / d3; - double d5 = d2 / d3; - this.setLocationAndAngles(shooter.posX + d4, this.posY, shooter.posZ + d5, f2, f3); - this.yOffset = 0.0F; - float f4 = (float) d3 * 0.2F; - this.setThrowableHeading(d0, d1 + f4, d2, accuracy, power); - } - } - - /** - * This method is for firing an arrow from an entity (Mostly player shooting) - */ - public EntityArrowMF(World world, EntityLivingBase shooter, float power) { - this(world, shooter, 1.0F, power); - } - - public EntityArrowMF(World world, EntityLivingBase shooter, float spread, float power) { - super(world); - this.firepower = power / 2F; - this.renderDistanceWeight = 10.0D; - this.shootingEntity = shooter; - - if (shooter instanceof EntityPlayer) { - this.canBePickedUp = 1; - } - - this.setSize(0.5F, 0.5F); - this.setLocationAndAngles(shooter.posX, shooter.posY + shooter.getEyeHeight(), shooter.posZ, - shooter.rotationYaw, shooter.rotationPitch); - this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; - this.posY -= 0.10000000149011612D; - this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; - this.setPosition(this.posX, this.posY, this.posZ); - this.yOffset = 0.0F; - this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) - * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); - this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) - * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); - this.motionY = (-MathHelper.sin(this.rotationPitch / 180.0F * (float) Math.PI)); - this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, power * 1.5F, spread); - } - - public EntityArrowMF setDeisgn(ArrowType type) { - this.arrowtype = type; - return this; - } - - /** - * Implement this with the constructor - */ - public EntityArrowMF setArrow(ItemStack arrow) { - ItemStack arrowStack = arrow.copy(); - arrowStack.stackSize = 1; - setArrowStack(arrowStack); - return this; - } - - public EntityArrowMF setArrowTex(String tex) { - updateTex(tex); - return this; - } - - private final int texture_dw = 18; - private float power = 0F; - - @Override - protected void entityInit() { - this.dataWatcher.addObject(16, Byte.valueOf((byte) 0));// Critical - this.dataWatcher.addObject(texture_dw, "steel_arrow"); - } - - /** - * Similar to setArrowHeading, it's point the throwable entity to a x, y, z - * direction. - */ - @Override - public void setThrowableHeading(double x, double y, double z, float power, float spread) { - float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); - x /= f2; - y /= f2; - z /= f2; - x += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * spread; - y += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * spread; - z += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * spread; - x *= power; - y *= power; - z *= power; - this.motionX = x; - this.motionY = y; - this.motionZ = z; - float f3 = MathHelper.sqrt_double(x * x + z * z); - this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(x, z) * 180.0D / Math.PI); - this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(y, f3) * 180.0D / Math.PI); - this.ticksInGround = 0; - } - - /** - * Sets the position and rotation. Only difference from the other one is no - * bounding on the rotation. Args: posX, posY, posZ, yaw, pitch - */ - @Override - @SideOnly(Side.CLIENT) - public void setPositionAndRotation2(double x, double y, double z, float yaw, float pitch, int i) { - this.setPosition(x, y, z); - this.setRotation(yaw, pitch); - } - - /** - * Sets the position and rotation. Only difference from the other one is no - * bounding on the rotation. Args: posX, posY, posZ, yaw, pitch - */ - public void setPositionAndRotation(double x, double y, double z, float yaw, float pitch, int i) { - this.setPosition(x, y, z); - this.setRotation(yaw, pitch); - } - - /** - * Sets the velocity to the args. Args: x, y, z - */ - @Override - @SideOnly(Side.CLIENT) - public void setVelocity(double xv, double yv, double zv) { - this.motionX = xv; - this.motionY = yv; - this.motionZ = zv; - - if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { - float f = MathHelper.sqrt_double(xv * xv + zv * zv); - this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(xv, zv) * 180.0D / Math.PI); - this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(yv, f) * 180.0D / Math.PI); - this.prevRotationPitch = this.rotationPitch; - this.prevRotationYaw = this.rotationYaw; - this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); - this.ticksInGround = 0; - } - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() { - super.onEntityUpdate(); - - if (ConfigExperiment.dynamicArrows && worldObj.isRemote) { - return; - } - if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { - float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D - / Math.PI); - this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(this.motionY, f) * 180.0D / Math.PI); - } - - Block block = this.worldObj.getBlock(this.xTile, this.yTile, this.zTile); - - if (block.getMaterial() != Material.air) { - block.setBlockBoundsBasedOnState(this.worldObj, this.xTile, this.yTile, this.zTile); - AxisAlignedBB axisalignedbb = block.getCollisionBoundingBoxFromPool(this.worldObj, this.xTile, this.yTile, - this.zTile); - - if (axisalignedbb != null - && axisalignedbb.isVecInside(Vec3.createVectorHelper(this.posX, this.posY, this.posZ))) { - this.inGround = true; - } - } - - if (this.arrowShake > 0) { - --this.arrowShake; - } - - if (this.inGround) { - int j = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile); - - if (block == this.inBlock && j == this.inData) { - ++this.ticksInGround; - - if (this.ticksInGround == 1200) { - this.setDead(); - } - } else { - this.inGround = false; - this.motionX *= this.rand.nextFloat() * 0.2F; - this.motionY *= this.rand.nextFloat() * 0.2F; - this.motionZ *= this.rand.nextFloat() * 0.2F; - this.ticksInGround = 0; - this.ticksInAir = 0; - } - } else { - ++this.ticksInAir; - Vec3 vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - Vec3 vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, - this.posZ + this.motionZ); - MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(vec31, vec3, false, true, false); - vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, - this.posZ + this.motionZ); - - if (movingobjectposition != null) { - vec3 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, - movingobjectposition.hitVec.zCoord); - } - - Entity entity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, - this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - int i; - float f1; - - for (i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5)) { - f1 = 0.3F; - AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand(f1, f1, f1); - MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3); - - if (movingobjectposition1 != null) { - double d1 = vec31.distanceTo(movingobjectposition1.hitVec); - - if (d1 < d0 || d0 == 0.0D) { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null && movingobjectposition.entityHit != null - && movingobjectposition.entityHit instanceof EntityPlayer) { - EntityPlayer entityplayer = (EntityPlayer) movingobjectposition.entityHit; - - if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer - && !((EntityPlayer) this.shootingEntity).canAttackPlayer(entityplayer)) { - movingobjectposition = null; - } - } - - float f2; - float f4; - - if (movingobjectposition != null) { - if (isExplosive()) { - explode(); - } - if (movingobjectposition.entityHit != null) { - f2 = MathHelper.sqrt_double( - this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ) - / velocityModifier; - - float dam = Math.max(0.1F, this.getHitDamage() * firepower);// (getDamageModifier()*power) / 10F * - // (float)k; - - dam *= getDamageModifier(movingobjectposition.entityHit); - - if (this.getIsCritical()) { - dam *= (rand.nextFloat() * 0.5F) + 1.0F; - } - - DamageSource damagesource = null; - - if (this.shootingEntity == null) { - damagesource = DamageSource.causeArrowDamage(this, this); - } else { - damagesource = DamageSource.causeArrowDamage(this, this.shootingEntity); - } - - if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman)) { - movingobjectposition.entityHit.setFire(5); - } - if (isExplosive()) { - dam = this.getExplosionDamage(); - damagesource.setExplosion(); - if (this.getFilling() == 2) { - damagesource.setFireDamage(); - } - } - if (movingobjectposition.entityHit.attackEntityFrom(damagesource, dam)) { - onHitEntity(movingobjectposition.entityHit, dam); - if (movingobjectposition.entityHit instanceof EntityLivingBase) { - EntityLivingBase entitylivingbase = (EntityLivingBase) movingobjectposition.entityHit; - - if (!this.worldObj.isRemote) { - entitylivingbase.setArrowCountInEntity(entitylivingbase.getArrowCountInEntity() + 1); - } - - if (this.knockbackStrength > 0) { - f4 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - - if (f4 > 0.0F) { - movingobjectposition.entityHit.addVelocity( - this.motionX * this.knockbackStrength * 0.6000000238418579D / f4, 0.1D, - this.motionZ * this.knockbackStrength * 0.6000000238418579D / f4); - } - } - - if (this.shootingEntity != null && this.shootingEntity instanceof EntityLivingBase) { - EnchantmentHelper.func_151384_a(entitylivingbase, this.shootingEntity); - EnchantmentHelper.func_151385_b((EntityLivingBase) this.shootingEntity, - entitylivingbase); - } - - if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity - && movingobjectposition.entityHit instanceof EntityPlayer - && this.shootingEntity instanceof EntityPlayerMP) { - ((EntityPlayerMP) this.shootingEntity).playerNetServerHandler - .sendPacket(new S2BPacketChangeGameState(6, 0.0F)); - } - } - - playHitSound(); - - if (!(movingobjectposition.entityHit instanceof EntityEnderman)) { - this.setDead(); - } - } else { - this.motionX *= -0.10000000149011612D; - this.motionY *= -0.10000000149011612D; - this.motionZ *= -0.10000000149011612D; - this.rotationYaw += 180.0F; - this.prevRotationYaw += 180.0F; - this.ticksInAir = 0; - } - if (isMagicArrow()) { - setDead(); - } - } else { - this.xTile = movingobjectposition.blockX; - this.yTile = movingobjectposition.blockY; - this.zTile = movingobjectposition.blockZ; - this.inBlock = block; - this.inData = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile); - this.motionX = ((float) (movingobjectposition.hitVec.xCoord - this.posX)); - this.motionY = ((float) (movingobjectposition.hitVec.yCoord - this.posY)); - this.motionZ = ((float) (movingobjectposition.hitVec.zCoord - this.posZ)); - f2 = MathHelper.sqrt_double( - this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); - this.posX -= this.motionX / f2 * 0.05000000074505806D; - this.posY -= this.motionY / f2 * 0.05000000074505806D; - this.posZ -= this.motionZ / f2 * 0.05000000074505806D; - playHitSound(); - this.inGround = true; - this.arrowShake = 7; - this.setIsCritical(false); - - if (this.inBlock.getMaterial() != Material.air) { - this.inBlock.onEntityCollidedWithBlock(this.worldObj, this.xTile, this.yTile, this.zTile, this); - } - if (isMagicArrow()) { - setDead(); - } - if (ConfigWeapon.breakArrowsGround && didArrowBreak()) { - breakArrow(); - } - } - if (getEntityData().hasKey("hasBroken_MFArrow")) { - worldObj.playSoundAtEntity(this, "random.break", 1.0F, 1.0F); - setDead(); - } - } - - if (isMagicArrow()) { - for (i = 0; i < 4; ++i) { - this.worldObj.spawnParticle("reddust", this.posX + this.motionX * i / 4.0D, - this.posY + this.motionY * i / 4.0D, this.posZ + this.motionZ * i / 4.0D, -this.motionX, - -this.motionY + 0.2D, -this.motionZ); - } - } - - if (this.getIsCritical()) { - for (i = 0; i < 4; ++i) { - this.worldObj.spawnParticle("crit", this.posX + this.motionX * i / 4.0D, - this.posY + this.motionY * i / 4.0D, this.posZ + this.motionZ * i / 4.0D, -this.motionX, - -this.motionY + 0.2D, -this.motionZ); - } - } - - this.posX += this.motionX; - this.posY += this.motionY; - this.posZ += this.motionZ; - f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); - - for (this.rotationPitch = (float) (Math.atan2(this.motionY, f2) * 180.0D / Math.PI); this.rotationPitch - - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { - ; - } - - while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { - this.prevRotationPitch += 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw < -180.0F) { - this.prevRotationYaw -= 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { - this.prevRotationYaw += 360.0F; - } - - this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; - this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; - float f3 = 0.99F; - f1 = 0.05F; - - if (this.isInWater()) { - for (int l = 0; l < 4; ++l) { - f4 = 0.25F; - this.worldObj.spawnParticle("bubble", this.posX - this.motionX * f4, this.posY - this.motionY * f4, - this.posZ - this.motionZ * f4, this.motionX, this.motionY, this.motionZ); - } - - f3 = 0.8F; - } - - if (this.isWet()) { - this.extinguish(); - } - - this.motionX *= f3; - this.motionY *= f3; - this.motionZ *= f3; - this.motionY -= f1 * getGravityModifier(); - this.setPosition(this.posX, this.posY, this.posZ); - this.func_145775_I(); - } - } - - private float getDamageModifier(Entity target) { - CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(getArrowStack()); - return CombatMechanics.getSpecialModifier(material, "standard", target, true); - } - - private float getModifiedVelocity() { - String s = "MF_Bow_Velocity"; - if (getEntityData().hasKey(s)) { - return getEntityData().getFloat(s); - } - return 1.0F; - } - - private boolean isExplosive() { - return getEntityData().hasKey("Explosive"); - } - - private void playHitSound() { - if (worldObj.isRemote || playedSound) - return; - float pitch = 1.0F / (this.rand.nextFloat() * 0.2F + 0.9F); - if (this.arrowtype != null && this.arrowtype == ArrowType.BROADHEAD) { - pitch *= 0.75F; - } - this.playSound("minefantasy2:weapon.arrowHit", 0.5F, pitch); - playedSound = true; - } - - private void onHitEntity(Entity entityHit, float dam) { - ItemStack arrow = getArrowStack(); - if (arrow != null && arrow.getItem() instanceof IArrowMF) { - ((IArrowMF) arrow.getItem()).onHitEntity(this, shootingEntity, entityHit, dam); - } - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - nbt.setFloat("firepower", firepower); - nbt.setBoolean("PlayedSound", playedSound); - nbt.setFloat("pierceChance", velocityModifier); - nbt.setShort("xTile", (short) this.xTile); - nbt.setShort("yTile", (short) this.yTile); - nbt.setShort("zTile", (short) this.zTile); - nbt.setShort("life", (short) this.ticksInGround); - nbt.setByte("inTile", (byte) Block.getIdFromBlock(this.inBlock)); - nbt.setByte("inData", (byte) this.inData); - nbt.setByte("shake", (byte) this.arrowShake); - nbt.setByte("inGround", (byte) (this.inGround ? 1 : 0)); - nbt.setByte("pickup", (byte) this.canBePickedUp); - nbt.setDouble("damage", this.damage); - - nbt.setString("arrowTexture", this.getCustomTex()); - nbt.setString("arrowtype", arrowtype.name); - nbt.setFloat("FirePower", power); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - firepower = nbt.getFloat("firepower"); - playedSound = nbt.getBoolean("PlayedSound"); - velocityModifier = nbt.getFloat("pierceChance"); - this.xTile = nbt.getShort("xTile"); - this.yTile = nbt.getShort("yTile"); - this.zTile = nbt.getShort("zTile"); - this.ticksInGround = nbt.getShort("life"); - this.inBlock = Block.getBlockById(nbt.getByte("inTile") & 255); - this.inData = nbt.getByte("inData") & 255; - this.arrowShake = nbt.getByte("shake") & 255; - this.inGround = nbt.getByte("inGround") == 1; - - if (nbt.hasKey("damage", 99)) { - this.damage = nbt.getDouble("damage"); - } - - if (nbt.hasKey("pickup", 99)) { - this.canBePickedUp = nbt.getByte("pickup"); - } else if (nbt.hasKey("player", 99)) { - this.canBePickedUp = nbt.getBoolean("player") ? 1 : 0; - } - - if (nbt.hasKey("arrowTexture")) { - updateTex(nbt.getString("arrowTexture")); - } - if (nbt.hasKey("arrowtype")) { - ArrowType arrow = ArrowType.arrowMap.get(nbt.getString("arrowtype")); - if (arrow != null) { - arrowtype = arrow; - } - } - power = nbt.getFloat("FirePower"); - } - - /** - * Called by a player entity when they collide with an entity - */ - @Override - public void onCollideWithPlayer(EntityPlayer player) { - if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0) { - boolean canPickUp = this.canBePickedUp == 1 - || this.canBePickedUp == 2 && player.capabilities.isCreativeMode; - - if (this.canBePickedUp == 1 && !player.inventory.addItemStackToInventory(getPickedUpItem())) { - canPickUp = false; - } - - if (canPickUp) { - this.playSound("random.pop", 0.2F, - ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); - player.onItemPickup(this, 1); - this.setDead(); - } - } - } - - /** - * returns if this entity triggers Block.onEntityWalking on the blocks they walk - * on. used for spiders and wolves to prevent them from trampling crops - */ - @Override - protected boolean canTriggerWalking() { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public float getShadowSize() { - return 0.0F; - } - - @Override - public void setDamage(double dam) { - this.damage = dam; - } - - @Override - public double getDamage() { - return this.damage; - } - - /** - * Sets the amount of knockback the arrow applies when it hits a mob. - */ - @Override - public void setKnockbackStrength(int str) { - this.knockbackStrength = str; - } - - /** - * If returns false, the item will not inflict any damage against entities. - */ - @Override - public boolean canAttackWithItem() { - return false; - } - - /** - * The old critical method called on full charge, I use my own - */ - @Override - public void setIsCritical(boolean flag) { - - } - - /** - * [New Method] Whether the arrow has a stream of critical hit particles flying - * behind it. Called by chance - */ - public void setCritical(boolean flag) { - byte b0 = this.dataWatcher.getWatchableObjectByte(16); - - if (flag) { - this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 1))); - } else { - this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -2))); - } - } - - /** - * Whether the arrow has a stream of critical hit particles flying behind it. - */ - @Override - public boolean getIsCritical() { - byte b0 = this.dataWatcher.getWatchableObjectByte(16); - return (b0 & 1) != 0; - } - - public float getHitDamage() { - float dam = 2.0F; - ItemStack arrowStack = getArrowStack(); - if (arrowStack != null) { - if (arrowStack.getItem() instanceof IArrowMF) { - dam = ((IArrowMF) arrowStack.getItem()).getDamageModifier(arrowStack); - } - } - if (getEntityData().hasKey("MF_Bow_Damage")) { - dam *= getEntityData().getFloat("MF_Bow_Damage"); - } - return dam; - } - - public float getGravityModifier() { - ItemStack arrowStack = getArrowStack(); - if (arrowStack != null) { - if (arrowStack.getItem() instanceof IArrowMF) { - return ((IArrowMF) arrowStack.getItem()).getGravityModifier(arrowStack); - } - } - return 1.0F; - } - - public float getBreakChance() { - ItemStack arrowStack = getArrowStack(); - if (arrowStack != null) { - if (arrowStack.getItem() instanceof IArrowMF) { - return ((IArrowMF) arrowStack.getItem()).getBreakChance(this, arrowStack); - } - } - return 1.0F; - } - - @SideOnly(Side.CLIENT) - public String getTexture() { - return "textures/projectile/" + getCustomTex(); - } - - public ItemStack getPickedUpItem() { - return getArrowStack(); - } - - /** - * Saves the arrow to the NBT - * - * @param arrow - */ - private void setArrowStack(ItemStack arrow) { - NBTTagCompound arrowNBT = new NBTTagCompound(); - arrow.writeToNBT(arrowNBT); - getEntityData().setTag("MF_ArrowItem", arrowNBT); - } - - private ItemStack getArrowStack() { - if (getEntityData().hasKey("MF_ArrowItem")) { - NBTTagCompound heldArrow = getEntityData().getCompoundTag("MF_ArrowItem"); - return ItemStack.loadItemStackFromNBT(heldArrow); - } - return new ItemStack(Items.arrow); - } - - private void updateTex(String tex) { - dataWatcher.updateObject(texture_dw, tex); - } - - private String getCustomTex() { - try { - return dataWatcher.getWatchableObjectString(texture_dw); - } catch (Exception e) { - MFLogUtil.logWarn("Arrow Failed To Load Texture"); - return "steel_arrow"; - } - } - - @Override - public boolean canBePickedUp() { - if (isMagicArrow()) { - return false; - } - if (didArrowBreak()) { - breakArrow(); - return false; - } - return canBePickedUp == 1; - } - - private void breakArrow() { - getEntityData().setBoolean("hasBroken_MFArrow", true); - } - - private boolean didArrowBreak() { - if (isExplosive()) { - return false; - } - float c = rand.nextFloat(); - float br = getBreakChance() * ConfigWeapon.arrowBreakMod; - return c < br; - } - - @Override - public ItemStack getDroppedItem() { - return getArrowStack(); - } - - @Override - public float[] getDamageRatio(Object... implement) { - if (isExplosive()) { - return new float[] { 0, 1, 0 }; - } - if (arrowtype != null) { - return arrowtype.ratio; - } - return new float[] { 0, 0, 1 }; - } - - public void modifyVelocity(float velocity) { - this.velocityModifier = velocity; - motionX *= velocity; - motionY *= velocity; - motionZ *= velocity; - } - - @Override - public float getPenetrationLevel(Object implement) { - return arrowtype == ArrowType.BROADHEAD ? -0.5F : 0F; - } - - public void setPower(float f) { - power = f; - } - - public EntityArrowMF setBombStats(int powder, int filling) { - getEntityData().setInteger("powder", powder); - getEntityData().setInteger("filling", filling); - getEntityData().setBoolean("Explosive", true); - return this; - } - - public void explode() { - worldObj.playSoundAtEntity(this, "random.explode", 0.3F, 10F - 5F); - worldObj.createExplosion(this, posX, posY, posZ, 0, false); - if (!this.worldObj.isRemote) { - double area = getRangeOfBlast() * 2D; - AxisAlignedBB var3 = this.boundingBox.expand(area, area / 2, area); - List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); - - if (var4 != null && !var4.isEmpty()) { - Iterator splashDamage = var4.iterator(); - - while (splashDamage.hasNext()) { - Entity entityHit = (Entity) splashDamage.next(); - double distanceToEntity = this.getDistanceToEntity(entityHit); - - double radius = getRangeOfBlast(); - if (distanceToEntity < radius) { - float dam = getExplosionDamage(); - - if (distanceToEntity > radius / 2) { - double sc = distanceToEntity - (radius / 2); - if (sc < 0) - sc = 0; - if (sc > (radius / 2)) - sc = (radius / 2); - dam *= (sc / (radius / 2)); - } - if (!(entityHit instanceof EntityItem)) { - DamageSource source = causeBombDamage(this, shootingEntity != null ? shootingEntity : this); - source.setExplosion(); - if (getFilling() == 2) { - source.setFireDamage(); - } - entityHit.attackEntityFrom(source, dam); - } - } - } - } - this.setDead(); - } - - int filling = getFilling(); - if (filling > 0) { - for (int a = 0; a < 16; a++) { - float range = 0.6F; - EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY + 0.5D, posZ, - (rand.nextDouble() - 0.5) * range, (rand.nextDouble() - 0.5) * range, - (rand.nextDouble() - 0.5) * range); - - if (filling == 2) { - shrapnel.setFire(10); - } - worldObj.spawnEntityInWorld(shrapnel); - } - } - } - - private int getFilling() { - return getEntityData().getInteger("filling"); - } - - private int getPowder() { - return getEntityData().getInteger("powder"); - } - - private EnumExplosiveType getBlast() { - return EnumExplosiveType.getType((byte) getFilling()); - } - - private EnumPowderType getPowderType() { - return EnumPowderType.getType((byte) getPowder()); - } - - private double getRangeOfBlast() { - return getBlast().range * getPowderType().rangeModifier * 0.5F; - } - - private int getExplosionDamage() { - return (int) (getBlast().damage * getPowderType().damageModifier * 0.5F); - } - - public static DamageSource causeBombDamage(Entity bomb, Entity user) { - return (new EntityDamageSourceBomb(bomb, user)).setProjectile(); - } - - public boolean isMagicArrow() { - CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(getArrowStack()); - return material != null && material.type.equalsIgnoreCase("magic"); - } + private final int texture_dw = 18; + /** + * 1 if the player can pick up the arrow + */ + public int canBePickedUp; + /** + * Seems to be some sort of timer for animating an arrow. + */ + public int arrowShake; + /** + * The owner of this arrow. + */ + public Entity shootingEntity; + public float velocityModifier = 1.0F; + public ArrowType arrowtype = ArrowType.NORMAL; + public float firepower = 1F; + private boolean playedSound = false; + private int xTile = -1; + private int yTile = -1; + private int zTile = -1; + private Block inBlock; + private int inData; + private boolean inGround; + private int ticksInGround; + private int ticksInAir; + private double damage = 2.0D; + /** + * The amount of knockback an arrow applies when it hits a mob. + */ + private int knockbackStrength; + private float power = 0F; + + public EntityArrowMF(World world) { + super(world); + this.renderDistanceWeight = 10.0D; + this.setSize(0.5F, 0.5F); + } + + public EntityArrowMF(World world, double x, double y, double z) { + super(world); + this.renderDistanceWeight = 10.0D; + this.setSize(0.5F, 0.5F); + this.setPosition(x, y, z); + this.yOffset = 0.0F; + } + + /** + * This is for shooting an arrow from a shooting entity to a target(Like + * skeletons and such) + */ + public EntityArrowMF(World world, EntityLivingBase shooter, EntityLivingBase target, float accuracy, float power) { + super(world); + this.renderDistanceWeight = 10.0D; + this.shootingEntity = shooter; + + this.firepower = power; + if (shooter instanceof EntityPlayer) { + this.canBePickedUp = 1; + } + + this.posY = shooter.posY + shooter.getEyeHeight() - 0.10000000149011612D; + double d0 = target.posX - shooter.posX; + double d1 = target.boundingBox.minY + target.height / 3.0F - this.posY; + double d2 = target.posZ - shooter.posZ; + double d3 = MathHelper.sqrt_double(d0 * d0 + d2 * d2); + + if (d3 >= 1.0E-7D) { + float f2 = (float) (Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F; + float f3 = (float) (-(Math.atan2(d1, d3) * 180.0D / Math.PI)); + double d4 = d0 / d3; + double d5 = d2 / d3; + this.setLocationAndAngles(shooter.posX + d4, this.posY, shooter.posZ + d5, f2, f3); + this.yOffset = 0.0F; + float f4 = (float) d3 * 0.2F; + this.setThrowableHeading(d0, d1 + f4, d2, accuracy, power); + } + } + + /** + * This method is for firing an arrow from an entity (Mostly player shooting) + */ + public EntityArrowMF(World world, EntityLivingBase shooter, float power) { + this(world, shooter, 1.0F, power); + } + + public EntityArrowMF(World world, EntityLivingBase shooter, float spread, float power) { + super(world); + this.firepower = power / 2F; + this.renderDistanceWeight = 10.0D; + this.shootingEntity = shooter; + + if (shooter instanceof EntityPlayer) { + this.canBePickedUp = 1; + } + + this.setSize(0.5F, 0.5F); + this.setLocationAndAngles(shooter.posX, shooter.posY + shooter.getEyeHeight(), shooter.posZ, + shooter.rotationYaw, shooter.rotationPitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.posY -= 0.10000000149011612D; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); + this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); + this.motionY = (-MathHelper.sin(this.rotationPitch / 180.0F * (float) Math.PI)); + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, power * 1.5F, spread); + } + + public static DamageSource causeBombDamage(Entity bomb, Entity user) { + return (new EntityDamageSourceBomb(bomb, user)).setProjectile(); + } + + public EntityArrowMF setDeisgn(ArrowType type) { + this.arrowtype = type; + return this; + } + + /** + * Implement this with the constructor + */ + public EntityArrowMF setArrow(ItemStack arrow) { + ItemStack arrowStack = arrow.copy(); + arrowStack.stackSize = 1; + setArrowStack(arrowStack); + return this; + } + + public EntityArrowMF setArrowTex(String tex) { + updateTex(tex); + return this; + } + + @Override + protected void entityInit() { + this.dataWatcher.addObject(16, Byte.valueOf((byte) 0));// Critical + this.dataWatcher.addObject(texture_dw, "steel_arrow"); + } + + /** + * Similar to setArrowHeading, it's point the throwable entity to a x, y, z + * direction. + */ + @Override + public void setThrowableHeading(double x, double y, double z, float power, float spread) { + float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); + x /= f2; + y /= f2; + z /= f2; + x += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * spread; + y += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * spread; + z += this.rand.nextGaussian() * (this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * spread; + x *= power; + y *= power; + z *= power; + this.motionX = x; + this.motionY = y; + this.motionZ = z; + float f3 = MathHelper.sqrt_double(x * x + z * z); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(x, z) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(y, f3) * 180.0D / Math.PI); + this.ticksInGround = 0; + } + + /** + * Sets the position and rotation. Only difference from the other one is no + * bounding on the rotation. Args: posX, posY, posZ, yaw, pitch + */ + @Override + @SideOnly(Side.CLIENT) + public void setPositionAndRotation2(double x, double y, double z, float yaw, float pitch, int i) { + this.setPosition(x, y, z); + this.setRotation(yaw, pitch); + } + + /** + * Sets the position and rotation. Only difference from the other one is no + * bounding on the rotation. Args: posX, posY, posZ, yaw, pitch + */ + public void setPositionAndRotation(double x, double y, double z, float yaw, float pitch, int i) { + this.setPosition(x, y, z); + this.setRotation(yaw, pitch); + } + + /** + * Sets the velocity to the args. Args: x, y, z + */ + @Override + @SideOnly(Side.CLIENT) + public void setVelocity(double xv, double yv, double zv) { + this.motionX = xv; + this.motionY = yv; + this.motionZ = zv; + + if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { + float f = MathHelper.sqrt_double(xv * xv + zv * zv); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(xv, zv) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(yv, f) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch; + this.prevRotationYaw = this.rotationYaw; + this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); + this.ticksInGround = 0; + } + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + super.onEntityUpdate(); + + if (ConfigExperiment.dynamicArrows && worldObj.isRemote) { + return; + } + if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { + float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D + / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(this.motionY, f) * 180.0D / Math.PI); + } + + Block block = this.worldObj.getBlock(this.xTile, this.yTile, this.zTile); + + if (block.getMaterial() != Material.air) { + block.setBlockBoundsBasedOnState(this.worldObj, this.xTile, this.yTile, this.zTile); + AxisAlignedBB axisalignedbb = block.getCollisionBoundingBoxFromPool(this.worldObj, this.xTile, this.yTile, + this.zTile); + + if (axisalignedbb != null + && axisalignedbb.isVecInside(Vec3.createVectorHelper(this.posX, this.posY, this.posZ))) { + this.inGround = true; + } + } + + if (this.arrowShake > 0) { + --this.arrowShake; + } + + if (this.inGround) { + int j = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile); + + if (block == this.inBlock && j == this.inData) { + ++this.ticksInGround; + + if (this.ticksInGround == 1200) { + this.setDead(); + } + } else { + this.inGround = false; + this.motionX *= this.rand.nextFloat() * 0.2F; + this.motionY *= this.rand.nextFloat() * 0.2F; + this.motionZ *= this.rand.nextFloat() * 0.2F; + this.ticksInGround = 0; + this.ticksInAir = 0; + } + } else { + ++this.ticksInAir; + Vec3 vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(vec31, vec3, false, true, false); + vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + + if (movingobjectposition != null) { + vec3 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, + movingobjectposition.hitVec.zCoord); + } + + Entity entity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, + this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double d0 = 0.0D; + int i; + float f1; + + for (i = 0; i < list.size(); ++i) { + Entity entity1 = (Entity) list.get(i); + + if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5)) { + f1 = 0.3F; + AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand(f1, f1, f1); + MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3); + + if (movingobjectposition1 != null) { + double d1 = vec31.distanceTo(movingobjectposition1.hitVec); + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; + d0 = d1; + } + } + } + } + + if (entity != null) { + movingobjectposition = new MovingObjectPosition(entity); + } + + if (movingobjectposition != null && movingobjectposition.entityHit != null + && movingobjectposition.entityHit instanceof EntityPlayer) { + EntityPlayer entityplayer = (EntityPlayer) movingobjectposition.entityHit; + + if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer + && !((EntityPlayer) this.shootingEntity).canAttackPlayer(entityplayer)) { + movingobjectposition = null; + } + } + + float f2; + float f4; + + if (movingobjectposition != null) { + if (isExplosive()) { + explode(); + } + if (movingobjectposition.entityHit != null) { + f2 = MathHelper.sqrt_double( + this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ) + / velocityModifier; + + float dam = Math.max(0.1F, this.getHitDamage() * firepower);// (getDamageModifier()*power) / 10F * + // (float)k; + + dam *= getDamageModifier(movingobjectposition.entityHit); + + if (this.getIsCritical()) { + dam *= (rand.nextFloat() * 0.5F) + 1.0F; + } + + DamageSource damagesource = null; + + if (this.shootingEntity == null) { + damagesource = DamageSource.causeArrowDamage(this, this); + } else { + damagesource = DamageSource.causeArrowDamage(this, this.shootingEntity); + } + + if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman)) { + movingobjectposition.entityHit.setFire(5); + } + if (isExplosive()) { + dam = this.getExplosionDamage(); + damagesource.setExplosion(); + if (this.getFilling() == 2) { + damagesource.setFireDamage(); + } + } + if (movingobjectposition.entityHit.attackEntityFrom(damagesource, dam)) { + onHitEntity(movingobjectposition.entityHit, dam); + if (movingobjectposition.entityHit instanceof EntityLivingBase) { + EntityLivingBase entitylivingbase = (EntityLivingBase) movingobjectposition.entityHit; + + if (!this.worldObj.isRemote) { + entitylivingbase.setArrowCountInEntity(entitylivingbase.getArrowCountInEntity() + 1); + } + + if (this.knockbackStrength > 0) { + f4 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + + if (f4 > 0.0F) { + movingobjectposition.entityHit.addVelocity( + this.motionX * this.knockbackStrength * 0.6000000238418579D / f4, 0.1D, + this.motionZ * this.knockbackStrength * 0.6000000238418579D / f4); + } + } + + if (this.shootingEntity != null && this.shootingEntity instanceof EntityLivingBase) { + EnchantmentHelper.func_151384_a(entitylivingbase, this.shootingEntity); + EnchantmentHelper.func_151385_b((EntityLivingBase) this.shootingEntity, + entitylivingbase); + } + + if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity + && movingobjectposition.entityHit instanceof EntityPlayer + && this.shootingEntity instanceof EntityPlayerMP) { + ((EntityPlayerMP) this.shootingEntity).playerNetServerHandler + .sendPacket(new S2BPacketChangeGameState(6, 0.0F)); + } + } + + playHitSound(); + + if (!(movingobjectposition.entityHit instanceof EntityEnderman)) { + this.setDead(); + } + } else { + this.motionX *= -0.10000000149011612D; + this.motionY *= -0.10000000149011612D; + this.motionZ *= -0.10000000149011612D; + this.rotationYaw += 180.0F; + this.prevRotationYaw += 180.0F; + this.ticksInAir = 0; + } + if (isMagicArrow()) { + setDead(); + } + } else { + this.xTile = movingobjectposition.blockX; + this.yTile = movingobjectposition.blockY; + this.zTile = movingobjectposition.blockZ; + this.inBlock = block; + this.inData = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile); + this.motionX = ((float) (movingobjectposition.hitVec.xCoord - this.posX)); + this.motionY = ((float) (movingobjectposition.hitVec.yCoord - this.posY)); + this.motionZ = ((float) (movingobjectposition.hitVec.zCoord - this.posZ)); + f2 = MathHelper.sqrt_double( + this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + this.posX -= this.motionX / f2 * 0.05000000074505806D; + this.posY -= this.motionY / f2 * 0.05000000074505806D; + this.posZ -= this.motionZ / f2 * 0.05000000074505806D; + playHitSound(); + this.inGround = true; + this.arrowShake = 7; + this.setIsCritical(false); + + if (this.inBlock.getMaterial() != Material.air) { + this.inBlock.onEntityCollidedWithBlock(this.worldObj, this.xTile, this.yTile, this.zTile, this); + } + if (isMagicArrow()) { + setDead(); + } + if (ConfigWeapon.breakArrowsGround && didArrowBreak()) { + breakArrow(); + } + } + if (getEntityData().hasKey("hasBroken_MFArrow")) { + worldObj.playSoundAtEntity(this, "random.break", 1.0F, 1.0F); + setDead(); + } + } + + if (isMagicArrow()) { + for (i = 0; i < 4; ++i) { + this.worldObj.spawnParticle("reddust", this.posX + this.motionX * i / 4.0D, + this.posY + this.motionY * i / 4.0D, this.posZ + this.motionZ * i / 4.0D, -this.motionX, + -this.motionY + 0.2D, -this.motionZ); + } + } + + if (this.getIsCritical()) { + for (i = 0; i < 4; ++i) { + this.worldObj.spawnParticle("crit", this.posX + this.motionX * i / 4.0D, + this.posY + this.motionY * i / 4.0D, this.posZ + this.motionZ * i / 4.0D, -this.motionX, + -this.motionY + 0.2D, -this.motionZ); + } + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + + for (this.rotationPitch = (float) (Math.atan2(this.motionY, f2) * 180.0D / Math.PI); this.rotationPitch + - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + ; + } + + while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float f3 = 0.99F; + f1 = 0.05F; + + if (this.isInWater()) { + for (int l = 0; l < 4; ++l) { + f4 = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * f4, this.posY - this.motionY * f4, + this.posZ - this.motionZ * f4, this.motionX, this.motionY, this.motionZ); + } + + f3 = 0.8F; + } + + if (this.isWet()) { + this.extinguish(); + } + + this.motionX *= f3; + this.motionY *= f3; + this.motionZ *= f3; + this.motionY -= f1 * getGravityModifier(); + this.setPosition(this.posX, this.posY, this.posZ); + this.func_145775_I(); + } + } + + private float getDamageModifier(Entity target) { + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(getArrowStack()); + return CombatMechanics.getSpecialModifier(material, "standard", target, true); + } + + private float getModifiedVelocity() { + String s = "MF_Bow_Velocity"; + if (getEntityData().hasKey(s)) { + return getEntityData().getFloat(s); + } + return 1.0F; + } + + private boolean isExplosive() { + return getEntityData().hasKey("Explosive"); + } + + private void playHitSound() { + if (worldObj.isRemote || playedSound) + return; + float pitch = 1.0F / (this.rand.nextFloat() * 0.2F + 0.9F); + if (this.arrowtype != null && this.arrowtype == ArrowType.BROADHEAD) { + pitch *= 0.75F; + } + this.playSound("minefantasy2:weapon.arrowHit", 0.5F, pitch); + playedSound = true; + } + + private void onHitEntity(Entity entityHit, float dam) { + ItemStack arrow = getArrowStack(); + if (arrow != null && arrow.getItem() instanceof IArrowMF) { + ((IArrowMF) arrow.getItem()).onHitEntity(this, shootingEntity, entityHit, dam); + } + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setFloat("firepower", firepower); + nbt.setBoolean("PlayedSound", playedSound); + nbt.setFloat("pierceChance", velocityModifier); + nbt.setShort("xTile", (short) this.xTile); + nbt.setShort("yTile", (short) this.yTile); + nbt.setShort("zTile", (short) this.zTile); + nbt.setShort("life", (short) this.ticksInGround); + nbt.setByte("inTile", (byte) Block.getIdFromBlock(this.inBlock)); + nbt.setByte("inData", (byte) this.inData); + nbt.setByte("shake", (byte) this.arrowShake); + nbt.setByte("inGround", (byte) (this.inGround ? 1 : 0)); + nbt.setByte("pickup", (byte) this.canBePickedUp); + nbt.setDouble("damage", this.damage); + + nbt.setString("arrowTexture", this.getCustomTex()); + nbt.setString("arrowtype", arrowtype.name); + nbt.setFloat("FirePower", power); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + firepower = nbt.getFloat("firepower"); + playedSound = nbt.getBoolean("PlayedSound"); + velocityModifier = nbt.getFloat("pierceChance"); + this.xTile = nbt.getShort("xTile"); + this.yTile = nbt.getShort("yTile"); + this.zTile = nbt.getShort("zTile"); + this.ticksInGround = nbt.getShort("life"); + this.inBlock = Block.getBlockById(nbt.getByte("inTile") & 255); + this.inData = nbt.getByte("inData") & 255; + this.arrowShake = nbt.getByte("shake") & 255; + this.inGround = nbt.getByte("inGround") == 1; + + if (nbt.hasKey("damage", 99)) { + this.damage = nbt.getDouble("damage"); + } + + if (nbt.hasKey("pickup", 99)) { + this.canBePickedUp = nbt.getByte("pickup"); + } else if (nbt.hasKey("player", 99)) { + this.canBePickedUp = nbt.getBoolean("player") ? 1 : 0; + } + + if (nbt.hasKey("arrowTexture")) { + updateTex(nbt.getString("arrowTexture")); + } + if (nbt.hasKey("arrowtype")) { + ArrowType arrow = ArrowType.arrowMap.get(nbt.getString("arrowtype")); + if (arrow != null) { + arrowtype = arrow; + } + } + power = nbt.getFloat("FirePower"); + } + + /** + * Called by a player entity when they collide with an entity + */ + @Override + public void onCollideWithPlayer(EntityPlayer player) { + if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0) { + boolean canPickUp = this.canBePickedUp == 1 + || this.canBePickedUp == 2 && player.capabilities.isCreativeMode; + + if (this.canBePickedUp == 1 && !player.inventory.addItemStackToInventory(getPickedUpItem())) { + canPickUp = false; + } + + if (canPickUp) { + this.playSound("random.pop", 0.2F, + ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); + player.onItemPickup(this, 1); + this.setDead(); + } + } + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they walk + * on. used for spiders and wolves to prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public float getShadowSize() { + return 0.0F; + } + + @Override + public double getDamage() { + return this.damage; + } + + @Override + public void setDamage(double dam) { + this.damage = dam; + } + + /** + * Sets the amount of knockback the arrow applies when it hits a mob. + */ + @Override + public void setKnockbackStrength(int str) { + this.knockbackStrength = str; + } + + /** + * If returns false, the item will not inflict any damage against entities. + */ + @Override + public boolean canAttackWithItem() { + return false; + } + + /** + * [New Method] Whether the arrow has a stream of critical hit particles flying + * behind it. Called by chance + */ + public void setCritical(boolean flag) { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (flag) { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 1))); + } else { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -2))); + } + } + + /** + * Whether the arrow has a stream of critical hit particles flying behind it. + */ + @Override + public boolean getIsCritical() { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + return (b0 & 1) != 0; + } + + /** + * The old critical method called on full charge, I use my own + */ + @Override + public void setIsCritical(boolean flag) { + + } + + public float getHitDamage() { + float dam = 2.0F; + ItemStack arrowStack = getArrowStack(); + if (arrowStack != null) { + if (arrowStack.getItem() instanceof IArrowMF) { + dam = ((IArrowMF) arrowStack.getItem()).getDamageModifier(arrowStack); + } + } + if (getEntityData().hasKey("MF_Bow_Damage")) { + dam *= getEntityData().getFloat("MF_Bow_Damage"); + } + return dam; + } + + public float getGravityModifier() { + ItemStack arrowStack = getArrowStack(); + if (arrowStack != null) { + if (arrowStack.getItem() instanceof IArrowMF) { + return ((IArrowMF) arrowStack.getItem()).getGravityModifier(arrowStack); + } + } + return 1.0F; + } + + public float getBreakChance() { + ItemStack arrowStack = getArrowStack(); + if (arrowStack != null) { + if (arrowStack.getItem() instanceof IArrowMF) { + return ((IArrowMF) arrowStack.getItem()).getBreakChance(this, arrowStack); + } + } + return 1.0F; + } + + @SideOnly(Side.CLIENT) + public String getTexture() { + return "textures/projectile/" + getCustomTex(); + } + + public ItemStack getPickedUpItem() { + return getArrowStack(); + } + + private ItemStack getArrowStack() { + if (getEntityData().hasKey("MF_ArrowItem")) { + NBTTagCompound heldArrow = getEntityData().getCompoundTag("MF_ArrowItem"); + return ItemStack.loadItemStackFromNBT(heldArrow); + } + return new ItemStack(Items.arrow); + } + + /** + * Saves the arrow to the NBT + * + * @param arrow + */ + private void setArrowStack(ItemStack arrow) { + NBTTagCompound arrowNBT = new NBTTagCompound(); + arrow.writeToNBT(arrowNBT); + getEntityData().setTag("MF_ArrowItem", arrowNBT); + } + + private void updateTex(String tex) { + dataWatcher.updateObject(texture_dw, tex); + } + + private String getCustomTex() { + try { + return dataWatcher.getWatchableObjectString(texture_dw); + } catch (Exception e) { + MFLogUtil.logWarn("Arrow Failed To Load Texture"); + return "steel_arrow"; + } + } + + @Override + public boolean canBePickedUp() { + if (isMagicArrow()) { + return false; + } + if (didArrowBreak()) { + breakArrow(); + return false; + } + return canBePickedUp == 1; + } + + private void breakArrow() { + getEntityData().setBoolean("hasBroken_MFArrow", true); + } + + private boolean didArrowBreak() { + if (isExplosive()) { + return false; + } + float c = rand.nextFloat(); + float br = getBreakChance() * ConfigWeapon.arrowBreakMod; + return c < br; + } + + @Override + public ItemStack getDroppedItem() { + return getArrowStack(); + } + + @Override + public float[] getDamageRatio(Object... implement) { + if (isExplosive()) { + return new float[]{0, 1, 0}; + } + if (arrowtype != null) { + return arrowtype.ratio; + } + return new float[]{0, 0, 1}; + } + + public void modifyVelocity(float velocity) { + this.velocityModifier = velocity; + motionX *= velocity; + motionY *= velocity; + motionZ *= velocity; + } + + @Override + public float getPenetrationLevel(Object implement) { + return arrowtype == ArrowType.BROADHEAD ? -0.5F : 0F; + } + + public void setPower(float f) { + power = f; + } + + public EntityArrowMF setBombStats(int powder, int filling) { + getEntityData().setInteger("powder", powder); + getEntityData().setInteger("filling", filling); + getEntityData().setBoolean("Explosive", true); + return this; + } + + public void explode() { + worldObj.playSoundAtEntity(this, "random.explode", 0.3F, 10F - 5F); + worldObj.createExplosion(this, posX, posY, posZ, 0, false); + if (!this.worldObj.isRemote) { + double area = getRangeOfBlast() * 2D; + AxisAlignedBB var3 = this.boundingBox.expand(area, area / 2, area); + List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); + + if (var4 != null && !var4.isEmpty()) { + Iterator splashDamage = var4.iterator(); + + while (splashDamage.hasNext()) { + Entity entityHit = (Entity) splashDamage.next(); + double distanceToEntity = this.getDistanceToEntity(entityHit); + + double radius = getRangeOfBlast(); + if (distanceToEntity < radius) { + float dam = getExplosionDamage(); + + if (distanceToEntity > radius / 2) { + double sc = distanceToEntity - (radius / 2); + if (sc < 0) + sc = 0; + if (sc > (radius / 2)) + sc = (radius / 2); + dam *= (sc / (radius / 2)); + } + if (!(entityHit instanceof EntityItem)) { + DamageSource source = causeBombDamage(this, shootingEntity != null ? shootingEntity : this); + source.setExplosion(); + if (getFilling() == 2) { + source.setFireDamage(); + } + entityHit.attackEntityFrom(source, dam); + } + } + } + } + this.setDead(); + } + + int filling = getFilling(); + if (filling > 0) { + for (int a = 0; a < 16; a++) { + float range = 0.6F; + EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY + 0.5D, posZ, + (rand.nextDouble() - 0.5) * range, (rand.nextDouble() - 0.5) * range, + (rand.nextDouble() - 0.5) * range); + + if (filling == 2) { + shrapnel.setFire(10); + } + worldObj.spawnEntityInWorld(shrapnel); + } + } + } + + private int getFilling() { + return getEntityData().getInteger("filling"); + } + + private int getPowder() { + return getEntityData().getInteger("powder"); + } + + private EnumExplosiveType getBlast() { + return EnumExplosiveType.getType((byte) getFilling()); + } + + private EnumPowderType getPowderType() { + return EnumPowderType.getType((byte) getPowder()); + } + + private double getRangeOfBlast() { + return getBlast().range * getPowderType().rangeModifier * 0.5F; + } + + private int getExplosionDamage() { + return (int) (getBlast().damage * getPowderType().damageModifier * 0.5F); + } + + public boolean isMagicArrow() { + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(getArrowStack()); + return material != null && material.type.equalsIgnoreCase("magic"); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityBomb.java b/src/main/java/minefantasy/mf2/entity/EntityBomb.java index 0c720f27..8df26f76 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityBomb.java +++ b/src/main/java/minefantasy/mf2/entity/EntityBomb.java @@ -1,8 +1,5 @@ package minefantasy.mf2.entity; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -26,406 +23,410 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; +import java.util.Iterator; +import java.util.List; + public class EntityBomb extends Entity { - /** How long the fuse is */ - public int fuse; - private EntityLivingBase thrower; - - public EntityBomb(World world) { - super(world); - this.fuse = getFuseTime(); - this.preventEntitySpawning = true; - this.setSize(0.5F, 0.5F); - this.yOffset = this.height / 2.0F; - } - - public EntityBomb(World world, EntityLivingBase thrower) { - this(world); - this.thrower = thrower; - - this.setLocationAndAngles(thrower.posX, thrower.posY + thrower.getEyeHeight(), thrower.posZ, - thrower.rotationYaw, thrower.rotationPitch); - this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; - this.posY -= 0.10000000149011612D; - this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; - this.setPosition(this.posX, this.posY, this.posZ); - - float force = this.getThrownForce() + (CombatMechanics.getStrengthEnhancement(thrower) / 4); - - float f = 0.4F; - this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) - * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; - this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) - * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; - this.motionY = -MathHelper.sin((this.rotationPitch + this.getThrownOffset()) / 180.0F * (float) Math.PI) * f; - this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, force, 1.0F); - - this.prevPosX = posX; - this.prevPosY = posY; - this.prevPosZ = posZ; - } - - private int getFuseTime() { - return (this.fuse = getFuseType().time) + (isSticky() ? 20 : 0); - } - - public void setThrowableHeading(double x, double y, double z, float offset, float force) { - float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); - x /= f2; - y /= f2; - z /= f2; - x += this.rand.nextGaussian() * 0.007499999832361937D * force; - y += this.rand.nextGaussian() * 0.007499999832361937D * force; - z += this.rand.nextGaussian() * 0.007499999832361937D * force; - x *= offset; - y *= offset; - z *= offset; - this.motionX = x; - this.motionY = y; - this.motionZ = z; - float f3 = MathHelper.sqrt_double(x * x + z * z); - this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(x, z) * 180.0D / Math.PI); - this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(y, f3) * 180.0D / Math.PI); - } - - protected float getThrownOffset() { - return 0.0F; - } - - protected float getThrownForce() { - return 1.5F; - } - - @Override - protected void entityInit() { - dataWatcher.addObject(typeId, (byte) 0); - dataWatcher.addObject(typeId + 1, (byte) 0); - dataWatcher.addObject(typeId + 2, (byte) 0); - dataWatcher.addObject(typeId + 3, (byte) 0); - } - - /** - * returns if this entity triggers Block.onEntityWalking on the blocks they walk - * on. used for spiders and wolves to prevent them from trampling crops - */ - @Override - protected boolean canTriggerWalking() { - return false; - } - - /** - * Returns true if other Entities should be prevented from moving through this - * Entity. - */ - @Override - public boolean canBeCollidedWith() { - return true; - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - this.motionY -= (0.03999999910593033D * getGravityModifier()); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.9800000190734863D; - this.motionY *= 0.9800000190734863D; - this.motionZ *= 0.9800000190734863D; - - if (this.onGround) { - double d = 0.75D; - this.motionX *= d; - this.motionZ *= d; - this.motionY *= -0.99D; - } - List collide = worldObj.getEntitiesWithinAABBExcludingEntity(this, boundingBox); - if (!collide.isEmpty() && !(thrower != null && collide.contains(thrower))) { - if (isSticky()) { - Object object = collide.get(0); - if (object instanceof Entity && object != this) { - if (this.ridingEntity == null && ((Entity) object).riddenByEntity == null - && canStick((Entity) object)) { - this.mountEntity((Entity) object); - this.fuse = getFuseTime(); - } - } - } - this.motionX = motionZ = 0; - } - - if (this.fuse-- <= 0) { - this.setDead(); - - if (!this.worldObj.isRemote) { - this.explode(); - } - } else { - this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.125D, this.posZ, 0.0D, 0.0D, 0.0D); - this.worldObj.spawnParticle("flame", this.posX, this.posY + 0.125D, this.posZ, 0.0D, 0.0D, 0.0D); - } - - if (!worldObj.isRemote && this.ridingEntity != null && ridingEntity instanceof EntityLivingBase) { - if (!(ridingEntity instanceof EntityChicken)) { - CombatMechanics.panic((EntityLivingBase) ridingEntity, 1.0F, 30); - } - } - if (isStuckInBlock()) { - motionX = motionY = motionZ = 0; - } - } - - private boolean canStick(Entity entity) { - return !(entity instanceof EntityCogwork); - } - - @Override - public void mountEntity(Entity object) { - super.mountEntity(object); - - if (object instanceof EntityChicken) { - EntityChicken chook = (EntityChicken) object; - Entity target = worldObj.findNearestEntityWithinAABB(IMob.class, chook.boundingBox.expand(64, 8, 64), - chook); - if (target != null) { - if (target instanceof EntityLivingBase) { - chook.setCustomNameTag("Suicide Chook!"); - fuse = getFuseTime() * 2; - chook.getNavigator().clearPathEntity(); - chook.setAttackTarget((EntityLivingBase) target); - chook.targetTasks.addTask(1, new EntityAIAttackOnCollide(chook, IMob.class, 1.25D, true)); - chook.setAIMoveSpeed(0.5F); - } - } - } - } - - private boolean isStuckInBlock() { - return false;// isSticky() && isAABBInSolid(boundingBox.expand(0.5D, 0.5D, 0.5D)); - } - - private boolean isSticky() { - return getEntityData().hasKey("stickyBomb"); - } - - private double getGravityModifier() { - return isStuckInBlock() ? 0F : getCase().weightModifier; - } - - private void explode2() { - float power = 3.5F; - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, power, false); - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - protected void writeEntityToNBT(NBTTagCompound nbt) { - nbt.setByte("Fuse", (byte) this.fuse); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - protected void readEntityFromNBT(NBTTagCompound nbt) { - this.fuse = nbt.getByte("Fuse"); - } - - @Override - @SideOnly(Side.CLIENT) - public float getShadowSize() { - return 0.25F; - } - - /** - * returns null or the entityliving it was placed or ignited by - */ - public EntityLivingBase getTntPlacedBy() { - return this.thrower; - } - - @Override - public void applyEntityCollision(Entity entity) { - if (!(thrower != null && thrower == entity)) { - this.motionX = 0; - this.motionZ = 0; - } - } - - public void explode() { - worldObj.playSoundAtEntity(this, "random.explode", 0.3F, 10F - 5F); - worldObj.createExplosion(this, posX, posY, posZ, 0, false); - if (!this.worldObj.isRemote) { - double area = getRangeOfBlast() * 2D; - AxisAlignedBB var3 = this.boundingBox.expand(area, area / 2, area); - List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); - - if (var4 != null && !var4.isEmpty()) { - Iterator splashDamage = var4.iterator(); - - while (splashDamage.hasNext()) { - Entity entityHit = (Entity) splashDamage.next(); - - if (MineFantasyII.isBukkitServer() - && BukkitUtils.cantDamage(thrower != null ? thrower : this, entityHit)) { - continue; - } - - double distanceToEntity = this.getDistanceToEntity(entityHit); - double radius = getRangeOfBlast(); - if (distanceToEntity < radius) { - float dam = getDamage(); - - if (getCasing() != 2 && distanceToEntity > radius / 2) { - double sc = distanceToEntity - (radius / 2); - if (sc < 0) - sc = 0; - if (sc > (radius / 2)) - sc = (radius / 2); - dam *= (sc / (radius / 2)); - } - if (!(entityHit instanceof EntityItem)) { - - DamageSource source = causeBombDamage(this, thrower != null ? thrower : this); - source.setExplosion(); - if (getFilling() == 2) { - source.setFireDamage(); - } - if (ridingEntity != null && entityHit == ridingEntity) { - dam *= 1.5F; - } - if (entityHit.attackEntityFrom(source, dam)) { - applyEffects(entityHit); - } - } - } - } - } - this.setDead(); - } - - int t = getFilling(); - if (t > 0) { - for (int a = 0; a < 16; a++) { - float range = 0.6F; - EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY + 0.5D, posZ, - (rand.nextDouble() - 0.5) * range, (rand.nextDouble() - 0.5F) * range, - (rand.nextDouble() - 0.5) * range); - - if (t == 2) { - shrapnel.setFire(10); - } - worldObj.spawnEntityInWorld(shrapnel); - } - } - } - - private void applyEffects(Entity hit) { - if (getFilling() == 2) { - hit.setFire(5); - } - if (hit instanceof EntityLivingBase) { - EntityLivingBase live = (EntityLivingBase) hit; - } - } - - private double getRangeOfBlast() { - return getBlast().range * getCase().rangeModifier * getPowderType().rangeModifier; - } - - private int getDamage() { - return (int) (getBlast().damage * getCase().damageModifier * getPowderType().damageModifier); - } - - public static DamageSource causeBombDamage(Entity bomb, Entity user) { - return (new EntityDamageSourceBomb(bomb, user)).setProjectile(); - } - - public boolean canEntityBeSeen(Entity entity) { - return this.worldObj.rayTraceBlocks( - Vec3.createVectorHelper(this.posX, this.posY + this.getEyeHeight(), this.posZ), - Vec3.createVectorHelper(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ)) == null; - } - - private final int typeId = 2; - - public byte getFilling() { - return dataWatcher.getWatchableObjectByte(typeId); - } - - public byte getCasing() { - return dataWatcher.getWatchableObjectByte(typeId + 1); - } - - public byte getFuse() { - return dataWatcher.getWatchableObjectByte(typeId + 2); - } - - public byte getPowder() { - return dataWatcher.getWatchableObjectByte(typeId + 3); - } - - public EntityBomb setType(byte fill, byte casing, byte fuse, byte powder) { - dataWatcher.updateObject(typeId, fill); - dataWatcher.updateObject(typeId + 1, casing); - dataWatcher.updateObject(typeId + 2, fuse); - dataWatcher.updateObject(typeId + 3, powder); - - this.fuse = getFuseType().time; - - return this; - } - - private EnumExplosiveType getBlast() { - return EnumExplosiveType.getType(getFilling()); - } - - private EnumCasingType getCase() { - return EnumCasingType.getType(getCasing()); - } - - private EnumFuseType getFuseType() { - return EnumFuseType.getType(getFuse()); - } - - private EnumPowderType getPowderType() { - return EnumPowderType.getType(getPowder()); - } - - public boolean isAABBInSolid(AxisAlignedBB field) { - int i = MathHelper.floor_double(field.minX); - int j = MathHelper.floor_double(field.maxX + 1.0D); - int k = MathHelper.floor_double(field.minY); - int l = MathHelper.floor_double(field.maxY + 1.0D); - int i1 = MathHelper.floor_double(field.minZ); - int j1 = MathHelper.floor_double(field.maxZ + 1.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = worldObj.getBlock(k1, l1, i2); - - if (block.getMaterial().isSolid()) { - int j2 = worldObj.getBlockMetadata(k1, l1, i2); - double d0 = l1 + 1; - - if (j2 < 8) { - d0 = l1 + 1 - j2 / 8.0D; - } - - if (d0 >= field.minY) { - return true; - } - } - } - } - } - - return false; - } + private final int typeId = 2; + /** + * How long the fuse is + */ + public int fuse; + private EntityLivingBase thrower; + + public EntityBomb(World world) { + super(world); + this.fuse = getFuseTime(); + this.preventEntitySpawning = true; + this.setSize(0.5F, 0.5F); + this.yOffset = this.height / 2.0F; + } + + public EntityBomb(World world, EntityLivingBase thrower) { + this(world); + this.thrower = thrower; + + this.setLocationAndAngles(thrower.posX, thrower.posY + thrower.getEyeHeight(), thrower.posZ, + thrower.rotationYaw, thrower.rotationPitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.posY -= 0.10000000149011612D; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + + float force = this.getThrownForce() + (CombatMechanics.getStrengthEnhancement(thrower) / 4); + + float f = 0.4F; + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; + this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; + this.motionY = -MathHelper.sin((this.rotationPitch + this.getThrownOffset()) / 180.0F * (float) Math.PI) * f; + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, force, 1.0F); + + this.prevPosX = posX; + this.prevPosY = posY; + this.prevPosZ = posZ; + } + + public static DamageSource causeBombDamage(Entity bomb, Entity user) { + return (new EntityDamageSourceBomb(bomb, user)).setProjectile(); + } + + private int getFuseTime() { + return (this.fuse = getFuseType().time) + (isSticky() ? 20 : 0); + } + + public void setThrowableHeading(double x, double y, double z, float offset, float force) { + float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); + x /= f2; + y /= f2; + z /= f2; + x += this.rand.nextGaussian() * 0.007499999832361937D * force; + y += this.rand.nextGaussian() * 0.007499999832361937D * force; + z += this.rand.nextGaussian() * 0.007499999832361937D * force; + x *= offset; + y *= offset; + z *= offset; + this.motionX = x; + this.motionY = y; + this.motionZ = z; + float f3 = MathHelper.sqrt_double(x * x + z * z); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(x, z) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(y, f3) * 180.0D / Math.PI); + } + + protected float getThrownOffset() { + return 0.0F; + } + + protected float getThrownForce() { + return 1.5F; + } + + @Override + protected void entityInit() { + dataWatcher.addObject(typeId, (byte) 0); + dataWatcher.addObject(typeId + 1, (byte) 0); + dataWatcher.addObject(typeId + 2, (byte) 0); + dataWatcher.addObject(typeId + 3, (byte) 0); + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they walk + * on. used for spiders and wolves to prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() { + return false; + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + @Override + public boolean canBeCollidedWith() { + return true; + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY -= (0.03999999910593033D * getGravityModifier()); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.9800000190734863D; + this.motionY *= 0.9800000190734863D; + this.motionZ *= 0.9800000190734863D; + + if (this.onGround) { + double d = 0.75D; + this.motionX *= d; + this.motionZ *= d; + this.motionY *= -0.99D; + } + List collide = worldObj.getEntitiesWithinAABBExcludingEntity(this, boundingBox); + if (!collide.isEmpty() && !(thrower != null && collide.contains(thrower))) { + if (isSticky()) { + Object object = collide.get(0); + if (object instanceof Entity && object != this) { + if (this.ridingEntity == null && ((Entity) object).riddenByEntity == null + && canStick((Entity) object)) { + this.mountEntity((Entity) object); + this.fuse = getFuseTime(); + } + } + } + this.motionX = motionZ = 0; + } + + if (this.fuse-- <= 0) { + this.setDead(); + + if (!this.worldObj.isRemote) { + this.explode(); + } + } else { + this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.125D, this.posZ, 0.0D, 0.0D, 0.0D); + this.worldObj.spawnParticle("flame", this.posX, this.posY + 0.125D, this.posZ, 0.0D, 0.0D, 0.0D); + } + + if (!worldObj.isRemote && this.ridingEntity != null && ridingEntity instanceof EntityLivingBase) { + if (!(ridingEntity instanceof EntityChicken)) { + CombatMechanics.panic((EntityLivingBase) ridingEntity, 1.0F, 30); + } + } + if (isStuckInBlock()) { + motionX = motionY = motionZ = 0; + } + } + + private boolean canStick(Entity entity) { + return !(entity instanceof EntityCogwork); + } + + @Override + public void mountEntity(Entity object) { + super.mountEntity(object); + + if (object instanceof EntityChicken) { + EntityChicken chook = (EntityChicken) object; + Entity target = worldObj.findNearestEntityWithinAABB(IMob.class, chook.boundingBox.expand(64, 8, 64), + chook); + if (target != null) { + if (target instanceof EntityLivingBase) { + chook.setCustomNameTag("Suicide Chook!"); + fuse = getFuseTime() * 2; + chook.getNavigator().clearPathEntity(); + chook.setAttackTarget((EntityLivingBase) target); + chook.targetTasks.addTask(1, new EntityAIAttackOnCollide(chook, IMob.class, 1.25D, true)); + chook.setAIMoveSpeed(0.5F); + } + } + } + } + + private boolean isStuckInBlock() { + return false;// isSticky() && isAABBInSolid(boundingBox.expand(0.5D, 0.5D, 0.5D)); + } + + private boolean isSticky() { + return getEntityData().hasKey("stickyBomb"); + } + + private double getGravityModifier() { + return isStuckInBlock() ? 0F : getCase().weightModifier; + } + + private void explode2() { + float power = 3.5F; + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, power, false); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + protected void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setByte("Fuse", (byte) this.fuse); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + protected void readEntityFromNBT(NBTTagCompound nbt) { + this.fuse = nbt.getByte("Fuse"); + } + + @Override + @SideOnly(Side.CLIENT) + public float getShadowSize() { + return 0.25F; + } + + /** + * returns null or the entityliving it was placed or ignited by + */ + public EntityLivingBase getTntPlacedBy() { + return this.thrower; + } + + @Override + public void applyEntityCollision(Entity entity) { + if (!(thrower != null && thrower == entity)) { + this.motionX = 0; + this.motionZ = 0; + } + } + + public void explode() { + worldObj.playSoundAtEntity(this, "random.explode", 0.3F, 10F - 5F); + worldObj.createExplosion(this, posX, posY, posZ, 0, false); + if (!this.worldObj.isRemote) { + double area = getRangeOfBlast() * 2D; + AxisAlignedBB var3 = this.boundingBox.expand(area, area / 2, area); + List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); + + if (var4 != null && !var4.isEmpty()) { + Iterator splashDamage = var4.iterator(); + + while (splashDamage.hasNext()) { + Entity entityHit = (Entity) splashDamage.next(); + + if (MineFantasyII.isBukkitServer() + && BukkitUtils.cantDamage(thrower != null ? thrower : this, entityHit)) { + continue; + } + + double distanceToEntity = this.getDistanceToEntity(entityHit); + double radius = getRangeOfBlast(); + if (distanceToEntity < radius) { + float dam = getDamage(); + + if (getCasing() != 2 && distanceToEntity > radius / 2) { + double sc = distanceToEntity - (radius / 2); + if (sc < 0) + sc = 0; + if (sc > (radius / 2)) + sc = (radius / 2); + dam *= (sc / (radius / 2)); + } + if (!(entityHit instanceof EntityItem)) { + + DamageSource source = causeBombDamage(this, thrower != null ? thrower : this); + source.setExplosion(); + if (getFilling() == 2) { + source.setFireDamage(); + } + if (ridingEntity != null && entityHit == ridingEntity) { + dam *= 1.5F; + } + if (entityHit.attackEntityFrom(source, dam)) { + applyEffects(entityHit); + } + } + } + } + } + this.setDead(); + } + + int t = getFilling(); + if (t > 0) { + for (int a = 0; a < 16; a++) { + float range = 0.6F; + EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY + 0.5D, posZ, + (rand.nextDouble() - 0.5) * range, (rand.nextDouble() - 0.5F) * range, + (rand.nextDouble() - 0.5) * range); + + if (t == 2) { + shrapnel.setFire(10); + } + worldObj.spawnEntityInWorld(shrapnel); + } + } + } + + private void applyEffects(Entity hit) { + if (getFilling() == 2) { + hit.setFire(5); + } + if (hit instanceof EntityLivingBase) { + EntityLivingBase live = (EntityLivingBase) hit; + } + } + + private double getRangeOfBlast() { + return getBlast().range * getCase().rangeModifier * getPowderType().rangeModifier; + } + + private int getDamage() { + return (int) (getBlast().damage * getCase().damageModifier * getPowderType().damageModifier); + } + + public boolean canEntityBeSeen(Entity entity) { + return this.worldObj.rayTraceBlocks( + Vec3.createVectorHelper(this.posX, this.posY + this.getEyeHeight(), this.posZ), + Vec3.createVectorHelper(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ)) == null; + } + + public byte getFilling() { + return dataWatcher.getWatchableObjectByte(typeId); + } + + public byte getCasing() { + return dataWatcher.getWatchableObjectByte(typeId + 1); + } + + public byte getFuse() { + return dataWatcher.getWatchableObjectByte(typeId + 2); + } + + public byte getPowder() { + return dataWatcher.getWatchableObjectByte(typeId + 3); + } + + public EntityBomb setType(byte fill, byte casing, byte fuse, byte powder) { + dataWatcher.updateObject(typeId, fill); + dataWatcher.updateObject(typeId + 1, casing); + dataWatcher.updateObject(typeId + 2, fuse); + dataWatcher.updateObject(typeId + 3, powder); + + this.fuse = getFuseType().time; + + return this; + } + + private EnumExplosiveType getBlast() { + return EnumExplosiveType.getType(getFilling()); + } + + private EnumCasingType getCase() { + return EnumCasingType.getType(getCasing()); + } + + private EnumFuseType getFuseType() { + return EnumFuseType.getType(getFuse()); + } + + private EnumPowderType getPowderType() { + return EnumPowderType.getType(getPowder()); + } + + public boolean isAABBInSolid(AxisAlignedBB field) { + int i = MathHelper.floor_double(field.minX); + int j = MathHelper.floor_double(field.maxX + 1.0D); + int k = MathHelper.floor_double(field.minY); + int l = MathHelper.floor_double(field.maxY + 1.0D); + int i1 = MathHelper.floor_double(field.minZ); + int j1 = MathHelper.floor_double(field.maxZ + 1.0D); + + for (int k1 = i; k1 < j; ++k1) { + for (int l1 = k; l1 < l; ++l1) { + for (int i2 = i1; i2 < j1; ++i2) { + Block block = worldObj.getBlock(k1, l1, i2); + + if (block.getMaterial().isSolid()) { + int j2 = worldObj.getBlockMetadata(k1, l1, i2); + double d0 = l1 + 1; + + if (j2 < 8) { + d0 = l1 + 1 - j2 / 8.0D; + } + + if (d0 >= field.minY) { + return true; + } + } + } + } + } + + return false; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityCogwork.java b/src/main/java/minefantasy/mf2/entity/EntityCogwork.java index 8c8beadb..92187a7a 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityCogwork.java +++ b/src/main/java/minefantasy/mf2/entity/EntityCogwork.java @@ -4,11 +4,7 @@ import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.armour.IPowerArmour; -import minefantasy.mf2.api.helpers.ArmourCalculator; -import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.PowerArmour; -import minefantasy.mf2.api.helpers.TacticalManager; -import minefantasy.mf2.api.helpers.ToolHelper; +import minefantasy.mf2.api.helpers.*; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigArmour; @@ -36,986 +32,977 @@ import net.minecraftforge.common.ForgeHooks; public class EntityCogwork extends EntityLivingBase implements IPowerArmour { - public static float base_fuel_minutes = 20F; - - private static final float general_step_height = 1.0F; - private int noMoveTime = 0; - - public EntityCogwork(World world) { - super(world); - this.stepHeight = general_step_height; - this.preventEntitySpawning = true; - this.setSize(1.5F, 2.5F); - } - - public EntityCogwork(World world, double posX, double posY, double posZ) { - this(world); - this.setPosition(posX, posY, posZ); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.dataWatcher.addObject(12, ""); - this.dataWatcher.addObject(13, Float.valueOf(0F)); - this.dataWatcher.addObject(14, Integer.valueOf(0)); - } - - public void setBolts(int value) { - this.dataWatcher.updateObject(14, value); - } - - public int getBolts() { - return this.dataWatcher.getWatchableObjectInt(14); - } - - public void setFuel(float level) { - this.dataWatcher.updateObject(13, level); - } - - public float getFuel() { - return this.dataWatcher.getWatchableObjectFloat(13); - } - - public void setCustomMaterial(String name) { - if (name.length() == 0) { - setHealth(getMaxHealth()); - } - this.dataWatcher.updateObject(12, name); - } - - public String getCustomMaterial() { - return this.dataWatcher.getWatchableObjectString(12); - } - - @Override - public ItemStack getHeldItem() { - return null; - } - - @Override - public ItemStack getEquipmentInSlot(int p_71124_1_) { - return null; - } - - @Override - public void setCurrentItemOrArmor(int p_70062_1_, ItemStack p_70062_2_) { - } - - private ItemStack[] items = new ItemStack[] {}; - - @Override - public ItemStack[] getLastActiveItems() { - return items; - } - - @Override - public void onUpdate() { - super.onUpdate(); - if (noMoveTime > 0) { - moveForward = moveStrafing = 0; - --noMoveTime; - } - - float fuel = this.getFuel(); - float maxfuel = this.getMaxFuel(); - if (isPowered()) { - fuel -= getFuelDecay(); - } - fuel = MathHelper.clamp_float(fuel, 0F, maxfuel); - setFuel(fuel); + public static final float base_armour_units = 30F; + private static final float general_step_height = 1.0F; + private static final float base_frame_weight = 100F; + public static float base_fuel_minutes = 20F; + public static int maxBolts = 16; + public static int allowedBulk = 1; + public static float rating_modifier = 1.0F; + public static float health_modifier = 1.0F; + private int noMoveTime = 0; + private ItemStack[] items = new ItemStack[]{}; + private float forwardControl, strafeControl; + private boolean jumpControl; + private int jumpTimer = 0; + private boolean alternateStep; + + public EntityCogwork(World world) { + super(world); + this.stepHeight = general_step_height; + this.preventEntitySpawning = true; + this.setSize(1.5F, 2.5F); + } + + public EntityCogwork(World world, double posX, double posY, double posZ) { + this(world); + this.setPosition(posX, posY, posZ); + } + + @SideOnly(Side.CLIENT) + public static int getArmourRating(CustomMaterial base) { + if (base != null) { + float ratio = base.hardness * ArmourDesign.COGWORK.getRating() * rating_modifier; + return (int) (ratio * ArmourCalculator.armourRatingScale); + } + return 0; + } + + @Override + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(12, ""); + this.dataWatcher.addObject(13, Float.valueOf(0F)); + this.dataWatcher.addObject(14, Integer.valueOf(0)); + } + + public int getBolts() { + return this.dataWatcher.getWatchableObjectInt(14); + } + + public void setBolts(int value) { + this.dataWatcher.updateObject(14, value); + } + + public float getFuel() { + return this.dataWatcher.getWatchableObjectFloat(13); + } + + public void setFuel(float level) { + this.dataWatcher.updateObject(13, level); + } + + public String getCustomMaterial() { + return this.dataWatcher.getWatchableObjectString(12); + } + + public void setCustomMaterial(String name) { + if (name.length() == 0) { + setHealth(getMaxHealth()); + } + this.dataWatcher.updateObject(12, name); + } + + @Override + public ItemStack getHeldItem() { + return null; + } + + @Override + public ItemStack getEquipmentInSlot(int p_71124_1_) { + return null; + } + + @Override + public void setCurrentItemOrArmor(int p_70062_1_, ItemStack p_70062_2_) { + } + + @Override + public ItemStack[] getLastActiveItems() { + return items; + } + + @Override + public void onUpdate() { + super.onUpdate(); + if (noMoveTime > 0) { + moveForward = moveStrafing = 0; + --noMoveTime; + } + + float fuel = this.getFuel(); + float maxfuel = this.getMaxFuel(); + if (isPowered()) { + fuel -= getFuelDecay(); + } + fuel = MathHelper.clamp_float(fuel, 0F, maxfuel); + setFuel(fuel); /* - * if(isSprinting()) { if(riddenByEntity == null || this.getMoveForward() <= 0 + * if(isSprinting()) { if(riddenByEntity == null || this.getMoveForward() <= 0 * || !isPowered()) { setSprinting(false); } } */ - if (this.riddenByEntity != null) { - stepHeight = general_step_height; - updateRider(); - if (riddenByEntity.isBurning() && this.isFullyArmoured()) { - riddenByEntity.extinguish(); - } - - // ARROWS - if (riddenByEntity instanceof EntityLivingBase) { - int arrows = ((EntityLivingBase) riddenByEntity).getArrowCountInEntity(); - ((EntityLivingBase) riddenByEntity).setArrowCountInEntity(0); - int my_arrows = this.getArrowCountInEntity(); - this.setArrowCountInEntity(my_arrows + arrows); - - if (this.isFullyArmoured()) { - ((EntityLivingBase) riddenByEntity).setAir(300); - } - - if (ticksExisted % 20 == 0) { - for (int a = 0; a < 4; a++) { - if (!allowEquipment((EntityLivingBase) riddenByEntity)) { - riddenByEntity.mountEntity(null); - break; - } - } - } - } - - // DAMAGE - if (this.motionX * this.motionX + this.motionZ * this.motionZ > 2.500000277905201E-7D - && this.rand.nextInt(5) == 0) { - int i = MathHelper.floor_double(this.posX); - int j = MathHelper.floor_double(this.posY - 0.20000000298023224D - this.yOffset); - int k = MathHelper.floor_double(this.posZ); - Block block = this.worldObj.getBlock(i, j, k); - - if (block.getMaterial() != Material.air) { - this.worldObj.spawnParticle( - "blockcrack_" + Block.getIdFromBlock(block) + "_" + this.worldObj.getBlockMetadata(i, j, k), - this.posX + (this.rand.nextFloat() - 0.5D) * this.width, this.boundingBox.minY + 0.1D, - this.posZ + (this.rand.nextFloat() - 0.5D) * this.width, - 4.0D * (this.rand.nextFloat() - 0.5D), 0.5D, (this.rand.nextFloat() - 0.5D) * 4.0D); - } - if (!worldObj.isRemote && ConfigArmour.cogworkGrief) { - damageBlock(block, i, j, k, worldObj.getBlockMetadata(i, j, k)); - block = this.worldObj.getBlock(i, j + 1, k); - damageSurface(block, i, j + 1, k, worldObj.getBlockMetadata(i, j, k)); - } - } - } else { - motionX = motionZ = 0; - this.setMoveForward(0F); - this.setMoveStrafe(0F); - stepHeight = 0; - this.limbSwing = this.limbSwingAmount = this.prevLimbSwingAmount = 0; - this.rotationPitch = 20F; - this.rotationYawHead = this.rotationYaw; - this.prevRotationYawHead = this.prevRotationYaw; - this.swingProgress = this.swingProgressInt = 0; - } - if (jumpTimer > 0) { - --jumpTimer; - } - onPortalTick(); - } - - /** - * Modifier for actions and fuel decay (weight of the suit) - */ - private float getFuelCost() { - float mass = this.getWeight(); - return mass / 200F; - } - - /** - * Rate of constant fuel droppage - * - * @return - */ - private float getFuelDecay() { - return getFuelCost() * (isSprinting() ? 3.0F : 1.0F); - } - - private void damageBlock(Block block, int x, int y, int z, int blockMetadata) { - if (block == Blocks.grass || block == Blocks.farmland) { - worldObj.setBlock(x, y, z, Blocks.dirt, 0, 2); - } - if (block.getMaterial() == Material.glass) { - worldObj.setBlockToAir(x, y, z); - this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.glass", 1.0F, - 0.9F + (rand.nextFloat() * 0.2F)); - } - if (block == Blocks.ice) { - worldObj.setBlock(x, y, z, Blocks.water, 0, 2); - this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.glass", 1.0F, - 0.9F + (rand.nextFloat() * 0.2F)); - } - if (block.getMaterial() == Material.leaves) { - worldObj.setBlock(x, y, z, Blocks.water, 0, 2); - this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.grass", 1.0F, - 0.9F + (rand.nextFloat() * 0.2F)); - } - } - - private void damageSurface(Block block, int x, int y, int z, int blockMetadata) { - if (block.getBlockHardness(worldObj, x, y, z) == 0 - && (block.getMaterial() == Material.vine || block.getMaterial() == Material.plants)) { - worldObj.setBlockToAir(x, y, z); - this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.grass", 1.0F, - 0.9F + (rand.nextFloat() * 0.2F)); - } - if (block == Blocks.snow_layer) { - worldObj.setBlockToAir(x, y, z); - this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.cloth", 1.0F, - 0.9F + (rand.nextFloat() * 0.2F)); - } - } - - @Override - public void knockBack(Entity hitter, float f, double d, double d1) { - } - - public CustomMaterial getPlating() { - return CustomMaterial.getMaterial(getCustomMaterial()); - } - - public void updateRider() { - if (!isPowered()) - return; - - if (worldObj.isRemote && riddenByEntity != null && riddenByEntity instanceof EntityPlayer) { - float forward = ((EntityPlayer) riddenByEntity).moveForward; - float strafe = ((EntityPlayer) riddenByEntity).moveStrafing; - - if (riddenByEntity instanceof EntityClientPlayerMP) { - boolean jump = ClientProxyMF.isUserJumpCommand(riddenByEntity); - if (jump != jumpControl || forward != forwardControl || strafe != strafeControl) { - this.forwardControl = forward; - this.strafeControl = strafe; - this.jumpControl = jump; - - ((EntityClientPlayerMP) riddenByEntity).sendQueue - .addToSendQueue(new CogworkControlPacket(this).generatePacket()); - } - } - } - if (ticksExisted % 100 == 0) { - if (rand.nextInt(20) == 0) { - this.playSound("minefantasy2:entity.cogwork.toot", 0.5F, 1.0F); - } - this.playSound("minefantasy2:entity.cogwork.idle", 0.5F, 0.75F + rand.nextFloat() * 0.5F); - } - - if (!worldObj.isRemote) { - if (this.jumpControl && jumpTimer == 0) { - this.jumpTimer = 10; - } - if (!this.isInWater() && !this.handleLavaMovement()) { - if (this.onGround && jumpTimer == 8) { - this.jump(); - } - } - } - } - - protected void jump() { - spendFuel(5F); - worldObj.playSoundEffect(posX, posY, posZ, "tile.piston.out", 2.0F, 1.0F); - this.motionY = 0.41999998688697815D; - if (this.isSprinting()) { - float f = this.rotationYaw * 0.017453292F; - this.motionX -= MathHelper.sin(f) * 0.2F; - this.motionZ += MathHelper.cos(f) * 0.2F; - } - this.isAirBorne = true; - ForgeHooks.onLivingJump(this); - } - - private void spendFuel(float cost) { - this.setFuel(Math.max(0F, getFuel() - cost * getFuelCost())); - } - - @Override - public boolean isSprinting() { - return isPowered() && forwardControl > 0 && riddenByEntity != null && riddenByEntity.isSprinting(); - } - - private float forwardControl, strafeControl; - private boolean jumpControl; - private int jumpTimer = 0; - - public void setMoveForward(float f) { - forwardControl = f; - } - - public float getMoveForward() { - return forwardControl; - } - - public void setMoveStrafe(float f) { - strafeControl = f; - } - - public float getMoveStrafe() { - return strafeControl; - } - - public void setJumpControl(boolean b) { - this.jumpControl = b; - ; - } - - public boolean getJumpControl() { - return jumpControl; - } - - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25F); - } - - @Override - public boolean shouldRiderFaceForward(EntityPlayer player) { - return true; - } - - @Override - public boolean shouldRiderSit() { - return false; - } - - @Override - public double getMountedYOffset() { - return 0.8625D; - } - - @Override - public boolean canBeCollidedWith() { - return riddenByEntity == null && super.canBeCollidedWith(); - } - - @Override - public boolean canBePushed() { - return false; - } - - public static int maxBolts = 16; - - @Override - public boolean interactFirst(EntityPlayer user) { - if (user.isSwingInProgress) { - return false; - } - - ItemStack item = user.getHeldItem(); - if (item != null) { - float fuel_item = PowerArmour.getFuelValue(item); - if (fuel_item > 0) { - float fuel = getFuel(); - float max = getMaxFuel(); - if (fuel < max) { - fuel += Math.max(0F, fuel_item * ConfigArmour.cogworkFuelUnits); - if (fuel > max) { - fuel = max; - } - setFuel(fuel); - - if (!user.capabilities.isCreativeMode) { - --item.stackSize; - - ItemStack container = item.getItem().getContainerItem(item); - if (container != null) { - if (item.stackSize >= 1) { - if (!user.inventory.addItemStackToInventory(container)) { - user.entityDropItem(container, 0F); - } - } - } - if (item.stackSize <= 0) { - user.setCurrentItemOrArmor(0, container); - } - } - } - return true; - } - if (this.riddenByEntity != null) { - return false; - } - if (this.isUnderRepairFrame()) { - if (getPlating() == null && item.getItem() == ComponentListMF.cogwork_armour) { - CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if (material != null) { - this.playSound("mob.horse.armor", 1.0F, 1.0F); - int boltCount = this.getBolts(); - if (boltCount < maxBolts) { - if (!user.isSwingInProgress && user.capabilities.isCreativeMode - || user.inventory.consumeInventoryItem(ComponentListMF.bolt)) { - ++boltCount; - setBolts(boltCount); - } - user.swingItem(); - return true; - } - this.setCustomMaterial(material.name); - float damagePercent = 1F - ((float) item.getItemDamage() / (float) item.getMaxDamage()); - this.setHealth(getMaxHealth() * damagePercent); - if (!user.capabilities.isCreativeMode) { - --item.stackSize; - if (item.stackSize <= 0) { - user.setCurrentItemOrArmor(0, null); - } - } - user.swingItem(); - return true; - } - } - if (this.getPlating() != null && ToolHelper.getCrafterTool(item).equalsIgnoreCase("spanner")) { - this.playSound("mob.horse.armor", 1.2F, 1.0F); - user.swingItem(); - int boltCount = this.getBolts(); - if (boltCount > 0) { - if (!worldObj.isRemote) { - ItemStack bolt = new ItemStack(ComponentListMF.bolt, boltCount); - if (!user.capabilities.isCreativeMode && !user.inventory.addItemStackToInventory(bolt)) { - this.entityDropItem(bolt, 0.0F); - } - } - setBolts(0); - } - float damagePercent = 1F - (getHealth() / getMaxHealth()); - if (!worldObj.isRemote) { - ItemStack armour = ComponentListMF.cogwork_armour.createComm(getPlating().name, 1, - damagePercent); - if (!user.capabilities.isCreativeMode && !user.inventory.addItemStackToInventory(armour)) { - this.entityDropItem(armour, 0.0F); - } - } - this.playSound("mob.irongolem.hit", 1.0F, 1.0F); - this.setCustomMaterial(""); - return true; - } - } - } - if (user.ridingEntity == null) { - if (!this.allowEquipment(user)) { - return true; - } else { - this.noMoveTime = 20; - user.moveForward = user.moveStrafing = 0F; - user.mountEntity(this); - this.playSound("tile.piston.in", 1.0F, 0.6F); - return true; - } - } - return false; - } - - private float getMaxFuel() { - return base_fuel_minutes * 1200F; - } - - public static int allowedBulk = 1; - - private boolean allowEquipment(EntityLivingBase user) { - if (allowedBulk >= 2) { - return true;// Any Armour - } - - float bulk = ArmourCalculator.getEquipmentBulk(user); - if (allowedBulk >= 0) { - if (bulk > allowedBulk) { - if (user instanceof EntityPlayer && worldObj.isRemote) { - ((EntityPlayer) user).addChatComponentMessage(new ChatComponentTranslation("vehicle.tooBigArmour")); - } - return false; - } - return true; - } - for (int a = 0; a < 4; a++) { - if (user.getEquipmentInSlot(a + 1) != null) { - if (user instanceof EntityPlayer && worldObj.isRemote) { - ((EntityPlayer) user).addChatComponentMessage(new ChatComponentTranslation("vehicle.noArmour")); - } - return false; - } - } - return true; - } - - @Override - protected boolean isMovementBlocked() { - return true; - } - - @Override - public boolean isPowered() { - return noMoveTime == 0 && getFuel() > 0 && riddenByEntity != null; - } - - @Override - public void moveEntityWithHeading(float strafe, float forward) { - if (isPowered() && this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase) { - EntityLivingBase user = (EntityLivingBase) riddenByEntity; - - this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw; - this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F; - this.setRotation(this.rotationYaw, this.rotationPitch); - this.rotationYawHead = this.renderYawOffset = this.rotationYaw; - strafe = MathHelper.clamp_float(this.getMoveStrafe(), -1F, 1F) * 0.5F; - forward = MathHelper.clamp_float(this.getMoveForward(), -1F, 1F) * 0.5F; - - if (forward <= 0.0F) { - forward *= 0.5F;// Backstep slower - } - - if (!this.worldObj.isRemote) { - this.setAIMoveSpeed( - (float) this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue()); - moveCogwork(strafe, forward); - } - - user.prevLimbSwingAmount = user.limbSwingAmount; - double d1 = this.posX - this.prevPosX; - double d0 = this.posZ - this.prevPosZ; - float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F; - - if (f4 > 1.0F) { - f4 = 1.0F; - } - - user.limbSwingAmount += (f4 - user.limbSwingAmount) * 0.4F; - user.limbSwing += user.limbSwingAmount; - } else { - super.moveEntityWithHeading(strafe, forward); - } - } - - private float getSpeedModifier() { - return isSprinting() ? 2.0F : 1.0F; - } - - public void moveCogwork(float p_70612_1_, float p_70612_2_) { - double d0; - - if (this.isInWater() || this.handleLavaMovement()) { - d0 = this.posY; - this.motionY -= 0.03D; - - if (this.isCollidedHorizontally && this.isOffsetPositionInLiquid(this.motionX, - this.motionY + 0.6000000238418579D - this.posY + d0, this.motionZ)) { - this.motionY = 0.30000001192092896D; - } - } - { - float f2 = 0.91F; - - if (this.onGround) { - f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), - MathHelper.floor_double(this.boundingBox.minY) - 1, - MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; - } - - float f3 = 0.16277136F / (f2 * f2 * f2); - float f4; - - if (this.onGround) { - f4 = this.getAIMoveSpeed() * f3; - } else { - f4 = this.jumpMovementFactor; - } - if (riddenByEntity == null) { - f4 = 0F; - } - if (isSprinting()) { - f4 *= 2.0F; - } - - this.moveFlying(p_70612_1_, p_70612_2_, f4); - f2 = 0.91F; - - if (this.onGround) { - f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), - MathHelper.floor_double(this.boundingBox.minY) - 1, - MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; - } - - if (this.isOnLadder()) { - float f5 = 0.15F; - - if (this.motionX < (-f5)) { - this.motionX = (-f5); - } - - if (this.motionX > f5) { - this.motionX = f5; - } - - if (this.motionZ < (-f5)) { - this.motionZ = (-f5); - } - - if (this.motionZ > f5) { - this.motionZ = f5; - } - - this.fallDistance = 0.0F; - - if (this.motionY < -0.15D) { - this.motionY = -0.15D; - } - } - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - - if (this.isCollidedHorizontally && this.isOnLadder()) { - this.motionY = 0.2D; - } - - if (this.worldObj.isRemote && (!this.worldObj.blockExists((int) this.posX, 0, (int) this.posZ) - || !this.worldObj.getChunkFromBlockCoords((int) this.posX, (int) this.posZ).isChunkLoaded)) { - if (this.posY > 0.0D) { - this.motionY = -0.1D; - } else { - this.motionY = 0.0D; - } - } else { - this.motionY -= 0.08D; - } - - this.motionY *= 0.9800000190734863D; - this.motionX *= f2; - this.motionZ *= f2; - } - - this.prevLimbSwingAmount = this.limbSwingAmount; - d0 = this.posX - this.prevPosX; - double d1 = this.posZ - this.prevPosZ; - float f6 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F; - - if (f6 > 1.0F) { - f6 = 1.0F; - } - - this.limbSwingAmount += (f6 - this.limbSwingAmount) * 0.4F; - this.limbSwing += this.limbSwingAmount; - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - super.writeEntityToNBT(nbt); - nbt.setString("Plating", this.getCustomMaterial()); - nbt.setFloat("Fuel", getFuel()); - nbt.setInteger("Bolts", getBolts()); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - super.readEntityFromNBT(nbt); - if (nbt.hasKey("Plating", 8) && nbt.getString("Plating").length() > 0) { - this.setCustomMaterial(nbt.getString("Plating")); - } - this.setFuel(nbt.getFloat("Fuel")); - setBolts(nbt.getInteger("Bolts")); - } - - @Override - public boolean canBreatheUnderwater() { - return true; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() { - return "mob.irongolem.death"; - } - - @Override - protected String getHurtSound() { - return "mob.irongolem.hurt"; - } - - private boolean alternateStep; - - @Override - protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) { - String s = alternateStep ? "in" : "out"; - alternateStep = !alternateStep; - this.playSound("tile.piston." + s, 0.25F, 1.0F); - this.playSound("mob.irongolem.walk", 1.0F, 1.0F); - } - - @Override - protected void updatePotionEffects() { - } - - @Override - public void addPotionEffect(PotionEffect effect) { - } - - @Override - public boolean isPotionApplicable(PotionEffect effect) { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public void performHurtAnimation() { - } - - @Override - public float getAIMoveSpeed() { - return riddenByEntity == null ? 1F : super.getAIMoveSpeed(); - } - - @Override - public boolean isFullyArmoured() { - return getPlating() != null; - } - - @Override - public boolean attackEntityFrom(DamageSource source, float damage) { - return attackEntityFrom(source, damage, true); - } - - /** - * Modified attackEntityFrom - * - * @param shouldPass - * is used to determine if the wearer should take the hit - */ - public boolean attackEntityFrom(DamageSource source, float damage, boolean shouldPass) { - if (shouldPass && this.riddenByEntity != null) { - return this.riddenByEntity.attackEntityFrom(source, damage); - } - - if (source.isExplosion()) { - this.noMoveTime = 20; - damage *= 1.5F; - } - return super.attackEntityFrom(source, modifyDamage(this, damage, source)); - } - - public boolean shouldBlockPoisonOrMagic() { - return getPlating() != null; - } - - @Override - public float modifyDamage(EntityLivingBase user, float damage, DamageSource src) { - if (src.getDamageType().equalsIgnoreCase("humanstomp")) { - return 0F; - } - if (src == DamageSource.wither || src.isMagicDamage()) { - return shouldBlockPoisonOrMagic() ? 0F : damage; - } - - if (user != this) { - this.attackEntityFrom(src, damage, false); - } - - float AC = 2.0F; - float fResist = 0.0F; - CustomMaterial plating = getPlating(); - if (plating != null) { - AC = plating.hardness * ArmourDesign.COGWORK.getRating() * rating_modifier; - fResist = plating.getFireResistance() / 100F; - } - - if (src.isFireDamage()) { - if (user == this) { - return damage * MathHelper.clamp_float(1F - fResist, 0F, 1F); - } else if (isFullyArmoured()) { - return 0F;// All or nothing depends on if armour is full - } - } - if (user == this) { - return damage; - } - - if (src.isUnblockable() && !isFullyArmoured()) { - return damage; - } - return damage * 1F / AC; - } - - @Override - public void setFire(int i) { - } - - @Override - protected void damageEntity(DamageSource source, float dam) { - CustomMaterial plating = this.getPlating(); - boolean canDestroy = false;// Only spanner or fire can destroy frames - boolean isFrame = plating == null; - - if (source.getSourceOfDamage() != null && source.getSourceOfDamage() instanceof EntityLivingBase) { - canDestroy = ToolHelper.getCrafterTool(((EntityLivingBase) source.getSourceOfDamage()).getHeldItem()) - .equalsIgnoreCase("spanner"); - } - if (source.isFireDamage() || source.canHarmInCreative()) { - canDestroy = true; - } - - if (isFrame) { - if (canDestroy && riddenByEntity == null) { - setHealth(0); - } else { - setHealth(getMaxHealth()); - } - return; - } else if (dam != 0.0F) { - if (plating != null) { - float HP = plating.durability * ArmourDesign.COGWORK.getDurability() * 20F * health_modifier; - dam *= (this.getMaxHealth() / HP); - } - dam = this.applyPotionDamageCalculations(source, dam); - - float hp = this.getHealth() - dam; - if (hp <= 1.0F) { - hp = getMaxHealth(); - destroyArmour(); - } - this.setHealth(hp); - - if (!source.isFireDamage()) { - this.playSound("mob.irongolem.hit", 1.0F, - (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); - } - } - } - - private void destroyArmour() { - this.setCustomMaterial(""); - } - - @Override - public void heal(float amount) { - } - - @SideOnly(Side.CLIENT) - public int getMetreScaled(int i) { - return (int) (i / getMaxFuel() * getFuel()); - } - - @Override - protected void fall(float distance) { - if (distance > 2) { - float power = Math.min(distance / 2F, 3F); - initImpactLanding(posX, posY, posZ, power / 2F, ConfigArmour.cogworkGrief); - } - } - - public Shockwave initImpactLanding(double x, double y, double z, float power, boolean grief) { - noMoveTime = 10; - return newShockwave(x, y, z, power, false, grief); - } - - @Override - protected void collideWithEntity(Entity hit) { - super.collideWithEntity(hit); - if (!isSprinting() || !isPowered() || hit == riddenByEntity) { - return; - } - this.playSound(this.getHurtSound(), this.getSoundVolume(), this.getSoundPitch()); - float modifier = width * width * height / hit.width * hit.width * hit.height;// compare volume - float force = (float) Math.hypot(motionX, motionZ) * modifier; - TacticalManager.knockbackEntity(hit, this, force, force / 4F); - hit.attackEntityFrom( - DamageSource.causeMobDamage((riddenByEntity != null && riddenByEntity instanceof EntityLivingBase) - ? (EntityLivingBase) riddenByEntity - : this), - force); - } - - /** - * returns a new explosion. Does initiation (at time of writing Explosion is not - * finished) - */ - public Shockwave newShockwave(double x, double y, double z, float power, boolean fire, boolean grief) { - Shockwave explosion = new Shockwave("humanstomp", worldObj, - this.riddenByEntity != null ? this.riddenByEntity : this, x, y, z, power); - explosion.isFlaming = fire; - explosion.isGriefing = grief; - explosion.isSmoking = grief; - explosion.initiate(); - explosion.decorateWave(true); - return explosion; - } - - @Override - protected void dropFewItems(boolean pkill, int looting) { - this.dropItem(Item.getItemFromBlock(BlockListMF.cogwork_helm), 1); - this.dropItem(Item.getItemFromBlock(BlockListMF.cogwork_chest), 1); - this.dropItem(Item.getItemFromBlock(BlockListMF.cogwork_legs), 1); - - } - - @SideOnly(Side.CLIENT) - public int getArmourRating() { - return getArmourRating(getPlating()); - } - - public static float rating_modifier = 1.0F; - public static float health_modifier = 1.0F; - - @SideOnly(Side.CLIENT) - public static int getArmourRating(CustomMaterial base) { - if (base != null) { - float ratio = base.hardness * ArmourDesign.COGWORK.getRating() * rating_modifier; - return (int) (ratio * ArmourCalculator.armourRatingScale); - } - return 0; - } - - private static final float base_frame_weight = 100F; - public static final float base_armour_units = 30F; - - public float getWeight() { - float weight = base_frame_weight;// Weight of frame - CustomMaterial plating = getPlating(); - if (plating != null) { - weight += plating.density * base_armour_units; - } - return weight; - } - - public boolean isUnderRepairFrame() { - int i = MathHelper.floor_double(this.posX); - int j = MathHelper.floor_double(this.posY + 3); - int k = MathHelper.floor_double(this.posZ); - - return PowerArmour.isStationBlock(worldObj, i, j, k); - } - - private void onPortalTick() { - if (!this.worldObj.isRemote && this.worldObj instanceof WorldServer) { - this.worldObj.theProfiler.startSection("portal"); - MinecraftServer minecraftserver = ((WorldServer) this.worldObj).func_73046_m(); - int i = this.getMaxInPortalTime(); - - if (this.inPortal) { - if (minecraftserver.getAllowNether()) { - if (this.ridingEntity == null && this.portalCounter++ >= i) { - this.portalCounter = i; - this.timeUntilPortal = this.getPortalCooldown(); - byte b0; - - if (this.worldObj.provider.dimensionId == -1) { - b0 = 0; - } else { - b0 = -1; - } - this.travelToDimension(b0); - } - - this.inPortal = false; - } - } else { - if (this.portalCounter > 0) { - this.portalCounter -= 4; - } - - if (this.portalCounter < 0) { - this.portalCounter = 0; - } - } - - if (this.timeUntilPortal > 0) { - --this.timeUntilPortal; - } - - this.worldObj.theProfiler.endSection(); - } - } - - @Override - public void travelToDimension(int id) { - if (this.riddenByEntity != null) { - riddenByEntity.travelToDimension(id); - } - super.travelToDimension(id); - } - - @Override - public boolean isArmoured(String piece) { - return isFullyArmoured(); - } + if (this.riddenByEntity != null) { + stepHeight = general_step_height; + updateRider(); + if (riddenByEntity.isBurning() && this.isFullyArmoured()) { + riddenByEntity.extinguish(); + } + + // ARROWS + if (riddenByEntity instanceof EntityLivingBase) { + int arrows = ((EntityLivingBase) riddenByEntity).getArrowCountInEntity(); + ((EntityLivingBase) riddenByEntity).setArrowCountInEntity(0); + int my_arrows = this.getArrowCountInEntity(); + this.setArrowCountInEntity(my_arrows + arrows); + + if (this.isFullyArmoured()) { + ((EntityLivingBase) riddenByEntity).setAir(300); + } + + if (ticksExisted % 20 == 0) { + for (int a = 0; a < 4; a++) { + if (!allowEquipment((EntityLivingBase) riddenByEntity)) { + riddenByEntity.mountEntity(null); + break; + } + } + } + } + + // DAMAGE + if (this.motionX * this.motionX + this.motionZ * this.motionZ > 2.500000277905201E-7D + && this.rand.nextInt(5) == 0) { + int i = MathHelper.floor_double(this.posX); + int j = MathHelper.floor_double(this.posY - 0.20000000298023224D - this.yOffset); + int k = MathHelper.floor_double(this.posZ); + Block block = this.worldObj.getBlock(i, j, k); + + if (block.getMaterial() != Material.air) { + this.worldObj.spawnParticle( + "blockcrack_" + Block.getIdFromBlock(block) + "_" + this.worldObj.getBlockMetadata(i, j, k), + this.posX + (this.rand.nextFloat() - 0.5D) * this.width, this.boundingBox.minY + 0.1D, + this.posZ + (this.rand.nextFloat() - 0.5D) * this.width, + 4.0D * (this.rand.nextFloat() - 0.5D), 0.5D, (this.rand.nextFloat() - 0.5D) * 4.0D); + } + if (!worldObj.isRemote && ConfigArmour.cogworkGrief) { + damageBlock(block, i, j, k, worldObj.getBlockMetadata(i, j, k)); + block = this.worldObj.getBlock(i, j + 1, k); + damageSurface(block, i, j + 1, k, worldObj.getBlockMetadata(i, j, k)); + } + } + } else { + motionX = motionZ = 0; + this.setMoveForward(0F); + this.setMoveStrafe(0F); + stepHeight = 0; + this.limbSwing = this.limbSwingAmount = this.prevLimbSwingAmount = 0; + this.rotationPitch = 20F; + this.rotationYawHead = this.rotationYaw; + this.prevRotationYawHead = this.prevRotationYaw; + this.swingProgress = this.swingProgressInt = 0; + } + if (jumpTimer > 0) { + --jumpTimer; + } + onPortalTick(); + } + + /** + * Modifier for actions and fuel decay (weight of the suit) + */ + private float getFuelCost() { + float mass = this.getWeight(); + return mass / 200F; + } + + /** + * Rate of constant fuel droppage + * + * @return + */ + private float getFuelDecay() { + return getFuelCost() * (isSprinting() ? 3.0F : 1.0F); + } + + private void damageBlock(Block block, int x, int y, int z, int blockMetadata) { + if (block == Blocks.grass || block == Blocks.farmland) { + worldObj.setBlock(x, y, z, Blocks.dirt, 0, 2); + } + if (block.getMaterial() == Material.glass) { + worldObj.setBlockToAir(x, y, z); + this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.glass", 1.0F, + 0.9F + (rand.nextFloat() * 0.2F)); + } + if (block == Blocks.ice) { + worldObj.setBlock(x, y, z, Blocks.water, 0, 2); + this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.glass", 1.0F, + 0.9F + (rand.nextFloat() * 0.2F)); + } + if (block.getMaterial() == Material.leaves) { + worldObj.setBlock(x, y, z, Blocks.water, 0, 2); + this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.grass", 1.0F, + 0.9F + (rand.nextFloat() * 0.2F)); + } + } + + private void damageSurface(Block block, int x, int y, int z, int blockMetadata) { + if (block.getBlockHardness(worldObj, x, y, z) == 0 + && (block.getMaterial() == Material.vine || block.getMaterial() == Material.plants)) { + worldObj.setBlockToAir(x, y, z); + this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.grass", 1.0F, + 0.9F + (rand.nextFloat() * 0.2F)); + } + if (block == Blocks.snow_layer) { + worldObj.setBlockToAir(x, y, z); + this.worldObj.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.cloth", 1.0F, + 0.9F + (rand.nextFloat() * 0.2F)); + } + } + + @Override + public void knockBack(Entity hitter, float f, double d, double d1) { + } + + public CustomMaterial getPlating() { + return CustomMaterial.getMaterial(getCustomMaterial()); + } + + public void updateRider() { + if (!isPowered()) + return; + + if (worldObj.isRemote && riddenByEntity != null && riddenByEntity instanceof EntityPlayer) { + float forward = ((EntityPlayer) riddenByEntity).moveForward; + float strafe = ((EntityPlayer) riddenByEntity).moveStrafing; + + if (riddenByEntity instanceof EntityClientPlayerMP) { + boolean jump = ClientProxyMF.isUserJumpCommand(riddenByEntity); + if (jump != jumpControl || forward != forwardControl || strafe != strafeControl) { + this.forwardControl = forward; + this.strafeControl = strafe; + this.jumpControl = jump; + + ((EntityClientPlayerMP) riddenByEntity).sendQueue + .addToSendQueue(new CogworkControlPacket(this).generatePacket()); + } + } + } + if (ticksExisted % 100 == 0) { + if (rand.nextInt(20) == 0) { + this.playSound("minefantasy2:entity.cogwork.toot", 0.5F, 1.0F); + } + this.playSound("minefantasy2:entity.cogwork.idle", 0.5F, 0.75F + rand.nextFloat() * 0.5F); + } + + if (!worldObj.isRemote) { + if (this.jumpControl && jumpTimer == 0) { + this.jumpTimer = 10; + } + if (!this.isInWater() && !this.handleLavaMovement()) { + if (this.onGround && jumpTimer == 8) { + this.jump(); + } + } + } + } + + protected void jump() { + spendFuel(5F); + worldObj.playSoundEffect(posX, posY, posZ, "tile.piston.out", 2.0F, 1.0F); + this.motionY = 0.41999998688697815D; + if (this.isSprinting()) { + float f = this.rotationYaw * 0.017453292F; + this.motionX -= MathHelper.sin(f) * 0.2F; + this.motionZ += MathHelper.cos(f) * 0.2F; + } + this.isAirBorne = true; + ForgeHooks.onLivingJump(this); + } + + private void spendFuel(float cost) { + this.setFuel(Math.max(0F, getFuel() - cost * getFuelCost())); + } + + @Override + public boolean isSprinting() { + return isPowered() && forwardControl > 0 && riddenByEntity != null && riddenByEntity.isSprinting(); + } + + public float getMoveForward() { + return forwardControl; + } + + public void setMoveForward(float f) { + forwardControl = f; + } + + public float getMoveStrafe() { + return strafeControl; + } + + public void setMoveStrafe(float f) { + strafeControl = f; + } + + public boolean getJumpControl() { + return jumpControl; + } + + public void setJumpControl(boolean b) { + this.jumpControl = b; + ; + } + + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25F); + } + + @Override + public boolean shouldRiderFaceForward(EntityPlayer player) { + return true; + } + + @Override + public boolean shouldRiderSit() { + return false; + } + + @Override + public double getMountedYOffset() { + return 0.8625D; + } + + @Override + public boolean canBeCollidedWith() { + return riddenByEntity == null && super.canBeCollidedWith(); + } + + @Override + public boolean canBePushed() { + return false; + } + + @Override + public boolean interactFirst(EntityPlayer user) { + if (user.isSwingInProgress) { + return false; + } + + ItemStack item = user.getHeldItem(); + if (item != null) { + float fuel_item = PowerArmour.getFuelValue(item); + if (fuel_item > 0) { + float fuel = getFuel(); + float max = getMaxFuel(); + if (fuel < max) { + fuel += Math.max(0F, fuel_item * ConfigArmour.cogworkFuelUnits); + if (fuel > max) { + fuel = max; + } + setFuel(fuel); + + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + + ItemStack container = item.getItem().getContainerItem(item); + if (container != null) { + if (item.stackSize >= 1) { + if (!user.inventory.addItemStackToInventory(container)) { + user.entityDropItem(container, 0F); + } + } + } + if (item.stackSize <= 0) { + user.setCurrentItemOrArmor(0, container); + } + } + } + return true; + } + if (this.riddenByEntity != null) { + return false; + } + if (this.isUnderRepairFrame()) { + if (getPlating() == null && item.getItem() == ComponentListMF.cogwork_armour) { + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); + if (material != null) { + this.playSound("mob.horse.armor", 1.0F, 1.0F); + int boltCount = this.getBolts(); + if (boltCount < maxBolts) { + if (!user.isSwingInProgress && user.capabilities.isCreativeMode + || user.inventory.consumeInventoryItem(ComponentListMF.bolt)) { + ++boltCount; + setBolts(boltCount); + } + user.swingItem(); + return true; + } + this.setCustomMaterial(material.name); + float damagePercent = 1F - ((float) item.getItemDamage() / (float) item.getMaxDamage()); + this.setHealth(getMaxHealth() * damagePercent); + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + if (item.stackSize <= 0) { + user.setCurrentItemOrArmor(0, null); + } + } + user.swingItem(); + return true; + } + } + if (this.getPlating() != null && ToolHelper.getCrafterTool(item).equalsIgnoreCase("spanner")) { + this.playSound("mob.horse.armor", 1.2F, 1.0F); + user.swingItem(); + int boltCount = this.getBolts(); + if (boltCount > 0) { + if (!worldObj.isRemote) { + ItemStack bolt = new ItemStack(ComponentListMF.bolt, boltCount); + if (!user.capabilities.isCreativeMode && !user.inventory.addItemStackToInventory(bolt)) { + this.entityDropItem(bolt, 0.0F); + } + } + setBolts(0); + } + float damagePercent = 1F - (getHealth() / getMaxHealth()); + if (!worldObj.isRemote) { + ItemStack armour = ComponentListMF.cogwork_armour.createComm(getPlating().name, 1, + damagePercent); + if (!user.capabilities.isCreativeMode && !user.inventory.addItemStackToInventory(armour)) { + this.entityDropItem(armour, 0.0F); + } + } + this.playSound("mob.irongolem.hit", 1.0F, 1.0F); + this.setCustomMaterial(""); + return true; + } + } + } + if (user.ridingEntity == null) { + if (!this.allowEquipment(user)) { + return true; + } else { + this.noMoveTime = 20; + user.moveForward = user.moveStrafing = 0F; + user.mountEntity(this); + this.playSound("tile.piston.in", 1.0F, 0.6F); + return true; + } + } + return false; + } + + private float getMaxFuel() { + return base_fuel_minutes * 1200F; + } + + private boolean allowEquipment(EntityLivingBase user) { + if (allowedBulk >= 2) { + return true;// Any Armour + } + + float bulk = ArmourCalculator.getEquipmentBulk(user); + if (allowedBulk >= 0) { + if (bulk > allowedBulk) { + if (user instanceof EntityPlayer && worldObj.isRemote) { + ((EntityPlayer) user).addChatComponentMessage(new ChatComponentTranslation("vehicle.tooBigArmour")); + } + return false; + } + return true; + } + for (int a = 0; a < 4; a++) { + if (user.getEquipmentInSlot(a + 1) != null) { + if (user instanceof EntityPlayer && worldObj.isRemote) { + ((EntityPlayer) user).addChatComponentMessage(new ChatComponentTranslation("vehicle.noArmour")); + } + return false; + } + } + return true; + } + + @Override + protected boolean isMovementBlocked() { + return true; + } + + @Override + public boolean isPowered() { + return noMoveTime == 0 && getFuel() > 0 && riddenByEntity != null; + } + + @Override + public void moveEntityWithHeading(float strafe, float forward) { + if (isPowered() && this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase) { + EntityLivingBase user = (EntityLivingBase) riddenByEntity; + + this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw; + this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F; + this.setRotation(this.rotationYaw, this.rotationPitch); + this.rotationYawHead = this.renderYawOffset = this.rotationYaw; + strafe = MathHelper.clamp_float(this.getMoveStrafe(), -1F, 1F) * 0.5F; + forward = MathHelper.clamp_float(this.getMoveForward(), -1F, 1F) * 0.5F; + + if (forward <= 0.0F) { + forward *= 0.5F;// Backstep slower + } + + if (!this.worldObj.isRemote) { + this.setAIMoveSpeed( + (float) this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue()); + moveCogwork(strafe, forward); + } + + user.prevLimbSwingAmount = user.limbSwingAmount; + double d1 = this.posX - this.prevPosX; + double d0 = this.posZ - this.prevPosZ; + float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F; + + if (f4 > 1.0F) { + f4 = 1.0F; + } + + user.limbSwingAmount += (f4 - user.limbSwingAmount) * 0.4F; + user.limbSwing += user.limbSwingAmount; + } else { + super.moveEntityWithHeading(strafe, forward); + } + } + + private float getSpeedModifier() { + return isSprinting() ? 2.0F : 1.0F; + } + + public void moveCogwork(float p_70612_1_, float p_70612_2_) { + double d0; + + if (this.isInWater() || this.handleLavaMovement()) { + d0 = this.posY; + this.motionY -= 0.03D; + + if (this.isCollidedHorizontally && this.isOffsetPositionInLiquid(this.motionX, + this.motionY + 0.6000000238418579D - this.posY + d0, this.motionZ)) { + this.motionY = 0.30000001192092896D; + } + } + { + float f2 = 0.91F; + + if (this.onGround) { + f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), + MathHelper.floor_double(this.boundingBox.minY) - 1, + MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; + } + + float f3 = 0.16277136F / (f2 * f2 * f2); + float f4; + + if (this.onGround) { + f4 = this.getAIMoveSpeed() * f3; + } else { + f4 = this.jumpMovementFactor; + } + if (riddenByEntity == null) { + f4 = 0F; + } + if (isSprinting()) { + f4 *= 2.0F; + } + + this.moveFlying(p_70612_1_, p_70612_2_, f4); + f2 = 0.91F; + + if (this.onGround) { + f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), + MathHelper.floor_double(this.boundingBox.minY) - 1, + MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; + } + + if (this.isOnLadder()) { + float f5 = 0.15F; + + if (this.motionX < (-f5)) { + this.motionX = (-f5); + } + + if (this.motionX > f5) { + this.motionX = f5; + } + + if (this.motionZ < (-f5)) { + this.motionZ = (-f5); + } + + if (this.motionZ > f5) { + this.motionZ = f5; + } + + this.fallDistance = 0.0F; + + if (this.motionY < -0.15D) { + this.motionY = -0.15D; + } + } + + this.moveEntity(this.motionX, this.motionY, this.motionZ); + + if (this.isCollidedHorizontally && this.isOnLadder()) { + this.motionY = 0.2D; + } + + if (this.worldObj.isRemote && (!this.worldObj.blockExists((int) this.posX, 0, (int) this.posZ) + || !this.worldObj.getChunkFromBlockCoords((int) this.posX, (int) this.posZ).isChunkLoaded)) { + if (this.posY > 0.0D) { + this.motionY = -0.1D; + } else { + this.motionY = 0.0D; + } + } else { + this.motionY -= 0.08D; + } + + this.motionY *= 0.9800000190734863D; + this.motionX *= f2; + this.motionZ *= f2; + } + + this.prevLimbSwingAmount = this.limbSwingAmount; + d0 = this.posX - this.prevPosX; + double d1 = this.posZ - this.prevPosZ; + float f6 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F; + + if (f6 > 1.0F) { + f6 = 1.0F; + } + + this.limbSwingAmount += (f6 - this.limbSwingAmount) * 0.4F; + this.limbSwing += this.limbSwingAmount; + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setString("Plating", this.getCustomMaterial()); + nbt.setFloat("Fuel", getFuel()); + nbt.setInteger("Bolts", getBolts()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + if (nbt.hasKey("Plating", 8) && nbt.getString("Plating").length() > 0) { + this.setCustomMaterial(nbt.getString("Plating")); + } + this.setFuel(nbt.getFloat("Fuel")); + setBolts(nbt.getInteger("Bolts")); + } + + @Override + public boolean canBreatheUnderwater() { + return true; + } + + /** + * Returns the sound this mob makes on death. + */ + @Override + protected String getDeathSound() { + return "mob.irongolem.death"; + } + + @Override + protected String getHurtSound() { + return "mob.irongolem.hurt"; + } + + @Override + protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) { + String s = alternateStep ? "in" : "out"; + alternateStep = !alternateStep; + this.playSound("tile.piston." + s, 0.25F, 1.0F); + this.playSound("mob.irongolem.walk", 1.0F, 1.0F); + } + + @Override + protected void updatePotionEffects() { + } + + @Override + public void addPotionEffect(PotionEffect effect) { + } + + @Override + public boolean isPotionApplicable(PotionEffect effect) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void performHurtAnimation() { + } + + @Override + public float getAIMoveSpeed() { + return riddenByEntity == null ? 1F : super.getAIMoveSpeed(); + } + + @Override + public boolean isFullyArmoured() { + return getPlating() != null; + } + + @Override + public boolean attackEntityFrom(DamageSource source, float damage) { + return attackEntityFrom(source, damage, true); + } + + /** + * Modified attackEntityFrom + * + * @param shouldPass is used to determine if the wearer should take the hit + */ + public boolean attackEntityFrom(DamageSource source, float damage, boolean shouldPass) { + if (shouldPass && this.riddenByEntity != null) { + return this.riddenByEntity.attackEntityFrom(source, damage); + } + + if (source.isExplosion()) { + this.noMoveTime = 20; + damage *= 1.5F; + } + return super.attackEntityFrom(source, modifyDamage(this, damage, source)); + } + + public boolean shouldBlockPoisonOrMagic() { + return getPlating() != null; + } + + @Override + public float modifyDamage(EntityLivingBase user, float damage, DamageSource src) { + if (src.getDamageType().equalsIgnoreCase("humanstomp")) { + return 0F; + } + if (src == DamageSource.wither || src.isMagicDamage()) { + return shouldBlockPoisonOrMagic() ? 0F : damage; + } + + if (user != this) { + this.attackEntityFrom(src, damage, false); + } + + float AC = 2.0F; + float fResist = 0.0F; + CustomMaterial plating = getPlating(); + if (plating != null) { + AC = plating.hardness * ArmourDesign.COGWORK.getRating() * rating_modifier; + fResist = plating.getFireResistance() / 100F; + } + + if (src.isFireDamage()) { + if (user == this) { + return damage * MathHelper.clamp_float(1F - fResist, 0F, 1F); + } else if (isFullyArmoured()) { + return 0F;// All or nothing depends on if armour is full + } + } + if (user == this) { + return damage; + } + + if (src.isUnblockable() && !isFullyArmoured()) { + return damage; + } + return damage * 1F / AC; + } + + @Override + public void setFire(int i) { + } + + @Override + protected void damageEntity(DamageSource source, float dam) { + CustomMaterial plating = this.getPlating(); + boolean canDestroy = false;// Only spanner or fire can destroy frames + boolean isFrame = plating == null; + + if (source.getSourceOfDamage() != null && source.getSourceOfDamage() instanceof EntityLivingBase) { + canDestroy = ToolHelper.getCrafterTool(((EntityLivingBase) source.getSourceOfDamage()).getHeldItem()) + .equalsIgnoreCase("spanner"); + } + if (source.isFireDamage() || source.canHarmInCreative()) { + canDestroy = true; + } + + if (isFrame) { + if (canDestroy && riddenByEntity == null) { + setHealth(0); + } else { + setHealth(getMaxHealth()); + } + return; + } else if (dam != 0.0F) { + if (plating != null) { + float HP = plating.durability * ArmourDesign.COGWORK.getDurability() * 20F * health_modifier; + dam *= (this.getMaxHealth() / HP); + } + dam = this.applyPotionDamageCalculations(source, dam); + + float hp = this.getHealth() - dam; + if (hp <= 1.0F) { + hp = getMaxHealth(); + destroyArmour(); + } + this.setHealth(hp); + + if (!source.isFireDamage()) { + this.playSound("mob.irongolem.hit", 1.0F, + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + } + } + } + + private void destroyArmour() { + this.setCustomMaterial(""); + } + + @Override + public void heal(float amount) { + } + + @SideOnly(Side.CLIENT) + public int getMetreScaled(int i) { + return (int) (i / getMaxFuel() * getFuel()); + } + + @Override + protected void fall(float distance) { + if (distance > 2) { + float power = Math.min(distance / 2F, 3F); + initImpactLanding(posX, posY, posZ, power / 2F, ConfigArmour.cogworkGrief); + } + } + + public Shockwave initImpactLanding(double x, double y, double z, float power, boolean grief) { + noMoveTime = 10; + return newShockwave(x, y, z, power, false, grief); + } + + @Override + protected void collideWithEntity(Entity hit) { + super.collideWithEntity(hit); + if (!isSprinting() || !isPowered() || hit == riddenByEntity) { + return; + } + this.playSound(this.getHurtSound(), this.getSoundVolume(), this.getSoundPitch()); + float modifier = width * width * height / hit.width * hit.width * hit.height;// compare volume + float force = (float) Math.hypot(motionX, motionZ) * modifier; + TacticalManager.knockbackEntity(hit, this, force, force / 4F); + hit.attackEntityFrom( + DamageSource.causeMobDamage((riddenByEntity != null && riddenByEntity instanceof EntityLivingBase) + ? (EntityLivingBase) riddenByEntity + : this), + force); + } + + /** + * returns a new explosion. Does initiation (at time of writing Explosion is not + * finished) + */ + public Shockwave newShockwave(double x, double y, double z, float power, boolean fire, boolean grief) { + Shockwave explosion = new Shockwave("humanstomp", worldObj, + this.riddenByEntity != null ? this.riddenByEntity : this, x, y, z, power); + explosion.isFlaming = fire; + explosion.isGriefing = grief; + explosion.isSmoking = grief; + explosion.initiate(); + explosion.decorateWave(true); + return explosion; + } + + @Override + protected void dropFewItems(boolean pkill, int looting) { + this.dropItem(Item.getItemFromBlock(BlockListMF.cogwork_helm), 1); + this.dropItem(Item.getItemFromBlock(BlockListMF.cogwork_chest), 1); + this.dropItem(Item.getItemFromBlock(BlockListMF.cogwork_legs), 1); + + } + + @SideOnly(Side.CLIENT) + public int getArmourRating() { + return getArmourRating(getPlating()); + } + + public float getWeight() { + float weight = base_frame_weight;// Weight of frame + CustomMaterial plating = getPlating(); + if (plating != null) { + weight += plating.density * base_armour_units; + } + return weight; + } + + public boolean isUnderRepairFrame() { + int i = MathHelper.floor_double(this.posX); + int j = MathHelper.floor_double(this.posY + 3); + int k = MathHelper.floor_double(this.posZ); + + return PowerArmour.isStationBlock(worldObj, i, j, k); + } + + private void onPortalTick() { + if (!this.worldObj.isRemote && this.worldObj instanceof WorldServer) { + this.worldObj.theProfiler.startSection("portal"); + MinecraftServer minecraftserver = ((WorldServer) this.worldObj).func_73046_m(); + int i = this.getMaxInPortalTime(); + + if (this.inPortal) { + if (minecraftserver.getAllowNether()) { + if (this.ridingEntity == null && this.portalCounter++ >= i) { + this.portalCounter = i; + this.timeUntilPortal = this.getPortalCooldown(); + byte b0; + + if (this.worldObj.provider.dimensionId == -1) { + b0 = 0; + } else { + b0 = -1; + } + this.travelToDimension(b0); + } + + this.inPortal = false; + } + } else { + if (this.portalCounter > 0) { + this.portalCounter -= 4; + } + + if (this.portalCounter < 0) { + this.portalCounter = 0; + } + } + + if (this.timeUntilPortal > 0) { + --this.timeUntilPortal; + } + + this.worldObj.theProfiler.endSection(); + } + } + + @Override + public void travelToDimension(int id) { + if (this.riddenByEntity != null) { + riddenByEntity.travelToDimension(id); + } + super.travelToDimension(id); + } + + @Override + public boolean isArmoured(String piece) { + return isFullyArmoured(); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityDamageSourceBomb.java b/src/main/java/minefantasy/mf2/entity/EntityDamageSourceBomb.java index 4b335cf2..2ae2c544 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityDamageSourceBomb.java +++ b/src/main/java/minefantasy/mf2/entity/EntityDamageSourceBomb.java @@ -4,10 +4,10 @@ import net.minecraft.util.EntityDamageSourceIndirect; public class EntityDamageSourceBomb extends EntityDamageSourceIndirect { - private Entity thrower; + private Entity thrower; - public EntityDamageSourceBomb(Entity bomb, Entity user) { - super("bomb", bomb, user); - thrower = user; - } + public EntityDamageSourceBomb(Entity bomb, Entity user) { + super("bomb", bomb, user); + thrower = user; + } } diff --git a/src/main/java/minefantasy/mf2/entity/EntityDragonBreath.java b/src/main/java/minefantasy/mf2/entity/EntityDragonBreath.java index ddba9074..1264bd81 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityDragonBreath.java +++ b/src/main/java/minefantasy/mf2/entity/EntityDragonBreath.java @@ -1,7 +1,5 @@ package minefantasy.mf2.entity; -import java.util.Random; - import minefantasy.mf2.entity.mob.DragonBreath; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityFireball; @@ -11,186 +9,186 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import java.util.Random; + public class EntityDragonBreath extends EntityFireball { - private static final float size = 0.75F; - public Random rand = new Random(); - - public EntityDragonBreath(World world) { - super(world); - this.setSize(size, size); - } - - public EntityDragonBreath(World world, EntityLivingBase shooter, double xVelocity, double yVelocity, - double zVelocity, float spread) { - this(world); - this.shootingEntity = shooter; - this.setSize(1.0F, 1.0F); - this.setLocationAndAngles(shooter.posX, shooter.posY, shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); - this.setPosition(this.posX, this.posY, this.posZ); - this.yOffset = 0.0F; - this.motionX = this.motionY = this.motionZ = 0.0D; - xVelocity += this.rand.nextGaussian() * spread; - yVelocity += this.rand.nextGaussian() * spread; - zVelocity += this.rand.nextGaussian() * spread; - double d3 = MathHelper.sqrt_double(xVelocity * xVelocity + yVelocity * yVelocity + zVelocity * zVelocity); - this.accelerationX = xVelocity / d3 * 0.1D; - this.accelerationY = yVelocity / d3 * 0.1D; - this.accelerationZ = zVelocity / d3 * 0.1D; - } - - private final int typeId = 2; - - @Override - protected void entityInit() { - dataWatcher.addObject(typeId, 0); - } - - public EntityDragonBreath setType(int type) { - dataWatcher.updateObject(typeId, type); - return this; - } - - @Override - public void setFire(int time) { - } - - public int getType() { - return dataWatcher.getWatchableObjectInt(typeId); - } - - @Override - public void onUpdate() { - super.onUpdate(); - if (this.ticksExisted >= getLifeSpan()) { - setDead(); - } - if (ticksExisted % 5 == 0 && shouldExpand()) { - int lifeScale = (int) Math.floor(ticksExisted / 5F); - float newSize = size + (size / 4 * lifeScale); - this.setSize(newSize, newSize); - } - if (ticksExisted % 10 == 0) { - for (int x = -1; x <= 1; x++) { - for (int y = -1; y <= 1; y++) { - for (int z = -1; z <= 1; z++) { - int i = (int) posX + x; - int j = (int) posY + y; - int k = (int) posZ + z; - getBreath().hitBlock(worldObj, this, i, j, k, false); - } - } - } - } - } - - private boolean shouldExpand() { - return getBreath().shouldExpand(); - } - - private int getLifeSpan() { - return getBreath().getLifeSpan(); - } - - /** - * Called when this EntityFireball hits a block or entity. - */ - protected void onImpact(MovingObjectPosition pos) { - if (!this.worldObj.isRemote) { - if (pos.entityHit != null && (shootingEntity == null || shootingEntity != pos.entityHit)) { - getBreath().onHitEntity(pos.entityHit, this); - } else { - int i = pos.blockX; - int j = pos.blockY; - int k = pos.blockZ; - - switch (pos.sideHit) { - case 0: - --j; - break; - case 1: - ++j; - break; - case 2: - --k; - break; - case 3: - ++k; - break; - case 4: - --i; - break; - case 5: - ++i; - } - getBreath().hitBlock(worldObj, this, i, j, k, true); - } - - this.setDead(); - } - } - - /** - * Returns true if other Entities should be prevented from moving through this - * Entity. - */ - public boolean canBeCollidedWith() { - return false; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource src, float power) { - return false; - } - - public void modifySpeed(float mod) { - this.accelerationX *= mod; - this.accelerationY *= mod; - this.accelerationZ *= mod; - } - - public EntityDragonBreath setDamage(float dam) { - getEntityData().setFloat("Damage", dam); - return this; - } - - public float getDamage() { - if (getEntityData().hasKey("Damage")) { - return getEntityData().getFloat("Damage"); - } - return 2.0F; - } - - private DragonBreath breath; - - public DragonBreath getBreath() { - if (breath == null) { - DragonBreath load = DragonBreath.projectiles.get(getType()); - if (load != null) { - breath = load; - } else { - breath = DragonBreath.frost; - } - } - return breath; - } - - public DamageSource causeFireblastDamage() { - return this.getBreath().getDamageSource(this, this.shootingEntity); - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - nbt.setInteger("type", getType()); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - setType(nbt.getInteger("type")); - } - - public String getTextureName() { - return getBreath().getTexture(this); - } + private static final float size = 0.75F; + private final int typeId = 2; + public Random rand = new Random(); + private DragonBreath breath; + + public EntityDragonBreath(World world) { + super(world); + this.setSize(size, size); + } + + public EntityDragonBreath(World world, EntityLivingBase shooter, double xVelocity, double yVelocity, + double zVelocity, float spread) { + this(world); + this.shootingEntity = shooter; + this.setSize(1.0F, 1.0F); + this.setLocationAndAngles(shooter.posX, shooter.posY, shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = this.motionY = this.motionZ = 0.0D; + xVelocity += this.rand.nextGaussian() * spread; + yVelocity += this.rand.nextGaussian() * spread; + zVelocity += this.rand.nextGaussian() * spread; + double d3 = MathHelper.sqrt_double(xVelocity * xVelocity + yVelocity * yVelocity + zVelocity * zVelocity); + this.accelerationX = xVelocity / d3 * 0.1D; + this.accelerationY = yVelocity / d3 * 0.1D; + this.accelerationZ = zVelocity / d3 * 0.1D; + } + + @Override + protected void entityInit() { + dataWatcher.addObject(typeId, 0); + } + + @Override + public void setFire(int time) { + } + + public int getType() { + return dataWatcher.getWatchableObjectInt(typeId); + } + + public EntityDragonBreath setType(int type) { + dataWatcher.updateObject(typeId, type); + return this; + } + + @Override + public void onUpdate() { + super.onUpdate(); + if (this.ticksExisted >= getLifeSpan()) { + setDead(); + } + if (ticksExisted % 5 == 0 && shouldExpand()) { + int lifeScale = (int) Math.floor(ticksExisted / 5F); + float newSize = size + (size / 4 * lifeScale); + this.setSize(newSize, newSize); + } + if (ticksExisted % 10 == 0) { + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + int i = (int) posX + x; + int j = (int) posY + y; + int k = (int) posZ + z; + getBreath().hitBlock(worldObj, this, i, j, k, false); + } + } + } + } + } + + private boolean shouldExpand() { + return getBreath().shouldExpand(); + } + + private int getLifeSpan() { + return getBreath().getLifeSpan(); + } + + /** + * Called when this EntityFireball hits a block or entity. + */ + protected void onImpact(MovingObjectPosition pos) { + if (!this.worldObj.isRemote) { + if (pos.entityHit != null && (shootingEntity == null || shootingEntity != pos.entityHit)) { + getBreath().onHitEntity(pos.entityHit, this); + } else { + int i = pos.blockX; + int j = pos.blockY; + int k = pos.blockZ; + + switch (pos.sideHit) { + case 0: + --j; + break; + case 1: + ++j; + break; + case 2: + --k; + break; + case 3: + ++k; + break; + case 4: + --i; + break; + case 5: + ++i; + } + getBreath().hitBlock(worldObj, this, i, j, k, true); + } + + this.setDead(); + } + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + public boolean canBeCollidedWith() { + return false; + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource src, float power) { + return false; + } + + public void modifySpeed(float mod) { + this.accelerationX *= mod; + this.accelerationY *= mod; + this.accelerationZ *= mod; + } + + public float getDamage() { + if (getEntityData().hasKey("Damage")) { + return getEntityData().getFloat("Damage"); + } + return 2.0F; + } + + public EntityDragonBreath setDamage(float dam) { + getEntityData().setFloat("Damage", dam); + return this; + } + + public DragonBreath getBreath() { + if (breath == null) { + DragonBreath load = DragonBreath.projectiles.get(getType()); + if (load != null) { + breath = load; + } else { + breath = DragonBreath.frost; + } + } + return breath; + } + + public DamageSource causeFireblastDamage() { + return this.getBreath().getDamageSource(this, this.shootingEntity); + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setInteger("type", getType()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + setType(nbt.getInteger("type")); + } + + public String getTextureName() { + return getBreath().getTexture(this); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityFireBlast.java b/src/main/java/minefantasy/mf2/entity/EntityFireBlast.java index b6d46d2a..cbe0c9db 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityFireBlast.java +++ b/src/main/java/minefantasy/mf2/entity/EntityFireBlast.java @@ -1,261 +1,256 @@ package minefantasy.mf2.entity; -import static net.minecraftforge.common.util.ForgeDirection.UP; - import minefantasy.mf2.config.ConfigMobs; import minefantasy.mf2.entity.mob.EntityDragon; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityFireball; import net.minecraft.init.Blocks; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSourceIndirect; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import static net.minecraftforge.common.util.ForgeDirection.UP; + public class EntityFireBlast extends EntityFireball { - private static final float size = 0.75F; - - public EntityFireBlast(World world) { - super(world); - this.setInvisible(true); - this.setSize(size, size); - } - - public EntityFireBlast(World world, EntityLivingBase shooter, double xv, double yv, double zv) { - super(world, shooter, xv, yv, zv); - this.setInvisible(true); - this.setSize(size, size); - } - - public EntityFireBlast(World world, double x, double y, double z, double xv, double yv, double zv) { - super(world, x, y, z, xv, yv, zv); - this.setInvisible(true); - this.setSize(size, size); - } - - @Override - public void onUpdate() { - super.onUpdate(); - if (this.ticksExisted >= getLifeSpan()) { - setDead(); - } - if (ticksExisted % 5 == 0) { - int lifeScale = (int) Math.floor(ticksExisted / 5F); - float newSize = size + (size / 4 * lifeScale); - this.setSize(newSize, newSize); - } - if (ticksExisted % 10 == 0) { - for (int x = -1; x <= 1; x++) { - for (int y = -1; y <= 1; y++) { - for (int z = -1; z <= 1; z++) { - int i = (int) posX + x; - int j = (int) posY + y; - int k = (int) posZ + z; - - if (!worldObj.isRemote && canBlockCatchFire(i, j - 1, k) && worldObj.isAirBlock(i, j, k) - && rand.nextFloat() < getPyro()) { - this.worldObj.setBlock(i, j, k, Blocks.fire); - } - } - } - } - } - AxisAlignedBB bb = this.boundingBox.expand(1D, 1D, 1D); - if (!worldObj.isRemote) - this.destroyBlocksInAABB(bb); - } - - private int getLifeSpan() { - if (isPreset("BlastFurnace")) { - return 15; - } - return 30; - } - - /** - * Called when this EntityFireball hits a block or entity. - */ - protected void onImpact(MovingObjectPosition pos) { - if (!this.worldObj.isRemote) { - if (pos.entityHit != null) { - if (!pos.entityHit.isImmuneToFire()) { - pos.entityHit.setFire(isPreset("Dragon") ? 2 : 4); - pos.entityHit.attackEntityFrom(causeFireblastDamage(), getDamage()); - } - } else { - int i = pos.blockX; - int j = pos.blockY; - int k = pos.blockZ; - - switch (pos.sideHit) { - case 0: - --j; - break; - case 1: - ++j; - break; - case 2: - --k; - break; - case 3: - ++k; - break; - case 4: - --i; - break; - case 5: - ++i; - } - - if (!worldObj.isRemote && this.worldObj.isAirBlock(i, j, k) && rand.nextFloat() < getPyro()) { - this.worldObj.setBlock(i, j, k, Blocks.fire); - } - boolean tnt = worldObj.getBlock(pos.blockX, pos.blockY, pos.blockZ).getMaterial() == Material.tnt; - if (isPreset("BlastFurnace") && (rand.nextInt(50) == 0) || tnt) { - boolean solid = worldObj.isBlockNormalCubeDefault(pos.blockX, pos.blockY, pos.blockZ, false); - worldObj.newExplosion(this, posX, posY, posZ, solid ? 1.5F : 0.5F, true, true); - } - } - - this.setDead(); - } - } - - private float getPyro() { - - if (!ConfigMobs.dragonGriefFire && shootingEntity != null && shootingEntity instanceof EntityDragon) { - return 0F; - } - - if (getEntityData().hasKey("Pyro")) { - return getEntityData().getFloat("Pyro"); - } - - return 0.75F; - } - - private float getDamage() { - if (getEntityData().hasKey("Damage")) { - return getEntityData().getFloat("Damage"); - } - - if (isPreset("BlastFurnace")) { - return 8F; - } - return 2.0F; - } - - /** - * Returns true if other Entities should be prevented from moving through this - * Entity. - */ - public boolean canBeCollidedWith() { - return false; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource src, float power) { - return false; - } - - @Override - public boolean isInvisible() { - return true; - } - - public void modifySpeed(float mod) { - this.accelerationX *= mod; - this.accelerationY *= mod; - this.accelerationZ *= mod; - } - - public boolean isPreset(String s) { - if (getEntityData().hasKey("Preset")) { - return getEntityData().getString("Preset").equalsIgnoreCase(s); - } - return false; - } - - public boolean canBlockCatchFire(int x, int y, int z) { - return canCatchFire(x, y, z, UP); - } - - public boolean canCatchFire(int x, int y, int z, ForgeDirection face) { - return worldObj.getBlock(x, y, z).isFlammable(worldObj, x, y, z, face); - } - - public EntityFireBlast preset(String string) { - getEntityData().setBoolean(string, true); - return this; - } - - public EntityFireBlast setDamage(float dam) { - getEntityData().setFloat("Damage", dam); - return this; - } - - public EntityFireBlast setPyro(float dam) { - getEntityData().setFloat("Pyro", dam); - return this; - } - - private boolean destroyBlocksInAABB(AxisAlignedBB box) { - int var2 = MathHelper.floor_double(box.minX); - int var3 = MathHelper.floor_double(box.minY); - int var4 = MathHelper.floor_double(box.minZ); - int var5 = MathHelper.floor_double(box.maxX); - int var6 = MathHelper.floor_double(box.maxY); - int var7 = MathHelper.floor_double(box.maxZ); - boolean var8 = false; - boolean var9 = false; - - for (int var10 = var2; var10 <= var5; ++var10) { - for (int var11 = var3; var11 <= var6; ++var11) { - for (int var12 = var4; var12 <= var7; ++var12) { - Material var13 = this.worldObj.getBlock(var10, var11, var12).getMaterial(); - - if (var13 != null) { - if (var13 == Material.glass) { - var9 = true; - this.worldObj.setBlockToAir(var10, var11, var12); - } else if (var13 == Material.tnt) { - var9 = true; - this.worldObj.setBlockToAir(var10, var11, var12); - this.worldObj.createExplosion(this, var10, var11, var12, 4.0F, true); - } else { - var8 = true; - } - } - } - } - } - - if (var9) { - double var16 = box.minX + (box.maxX - box.minX) * this.rand.nextFloat(); - double var17 = box.minY + (box.maxY - box.minY) * this.rand.nextFloat(); - double var14 = box.minZ + (box.maxZ - box.minZ) * this.rand.nextFloat(); - this.worldObj.spawnParticle("largeexplode", var16, var17, var14, 0.0D, 0.0D, 0.0D); - for (int a = 0; a < 1 + rand.nextInt(4); a++) - this.worldObj.playSoundAtEntity(this, "dig.glass", 1F, 1F); - } - - return var8; - } - - public static DamageSource blastDamage = (new DamageSource("blastfurn")).setFireDamage(); - public static DamageSource basicDamage = (new DamageSource("fireblastBase")).setFireDamage(); - - public DamageSource causeFireblastDamage() { - if (isPreset("BlastFurnace")) { - return blastDamage; - } - return shootingEntity == null ? basicDamage - : (new EntityDamageSourceIndirect("fireblast", this, shootingEntity)).setFireDamage().setProjectile(); - } + private static final float size = 0.75F; + public static DamageSource blastDamage = (new DamageSource("blastfurn")).setFireDamage(); + public static DamageSource basicDamage = (new DamageSource("fireblastBase")).setFireDamage(); + + public EntityFireBlast(World world) { + super(world); + this.setInvisible(true); + this.setSize(size, size); + } + + public EntityFireBlast(World world, EntityLivingBase shooter, double xv, double yv, double zv) { + super(world, shooter, xv, yv, zv); + this.setInvisible(true); + this.setSize(size, size); + } + + public EntityFireBlast(World world, double x, double y, double z, double xv, double yv, double zv) { + super(world, x, y, z, xv, yv, zv); + this.setInvisible(true); + this.setSize(size, size); + } + + @Override + public void onUpdate() { + super.onUpdate(); + if (this.ticksExisted >= getLifeSpan()) { + setDead(); + } + if (ticksExisted % 5 == 0) { + int lifeScale = (int) Math.floor(ticksExisted / 5F); + float newSize = size + (size / 4 * lifeScale); + this.setSize(newSize, newSize); + } + if (ticksExisted % 10 == 0) { + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + int i = (int) posX + x; + int j = (int) posY + y; + int k = (int) posZ + z; + + if (!worldObj.isRemote && canBlockCatchFire(i, j - 1, k) && worldObj.isAirBlock(i, j, k) + && rand.nextFloat() < getPyro()) { + this.worldObj.setBlock(i, j, k, Blocks.fire); + } + } + } + } + } + AxisAlignedBB bb = this.boundingBox.expand(1D, 1D, 1D); + if (!worldObj.isRemote) + this.destroyBlocksInAABB(bb); + } + + private int getLifeSpan() { + if (isPreset("BlastFurnace")) { + return 15; + } + return 30; + } + + /** + * Called when this EntityFireball hits a block or entity. + */ + protected void onImpact(MovingObjectPosition pos) { + if (!this.worldObj.isRemote) { + if (pos.entityHit != null) { + if (!pos.entityHit.isImmuneToFire()) { + pos.entityHit.setFire(isPreset("Dragon") ? 2 : 4); + pos.entityHit.attackEntityFrom(causeFireblastDamage(), getDamage()); + } + } else { + int i = pos.blockX; + int j = pos.blockY; + int k = pos.blockZ; + + switch (pos.sideHit) { + case 0: + --j; + break; + case 1: + ++j; + break; + case 2: + --k; + break; + case 3: + ++k; + break; + case 4: + --i; + break; + case 5: + ++i; + } + + if (!worldObj.isRemote && this.worldObj.isAirBlock(i, j, k) && rand.nextFloat() < getPyro()) { + this.worldObj.setBlock(i, j, k, Blocks.fire); + } + boolean tnt = worldObj.getBlock(pos.blockX, pos.blockY, pos.blockZ).getMaterial() == Material.tnt; + if (isPreset("BlastFurnace") && (rand.nextInt(50) == 0) || tnt) { + boolean solid = worldObj.isBlockNormalCubeDefault(pos.blockX, pos.blockY, pos.blockZ, false); + worldObj.newExplosion(this, posX, posY, posZ, solid ? 1.5F : 0.5F, true, true); + } + } + + this.setDead(); + } + } + + private float getPyro() { + + if (!ConfigMobs.dragonGriefFire && shootingEntity != null && shootingEntity instanceof EntityDragon) { + return 0F; + } + + if (getEntityData().hasKey("Pyro")) { + return getEntityData().getFloat("Pyro"); + } + + return 0.75F; + } + + public EntityFireBlast setPyro(float dam) { + getEntityData().setFloat("Pyro", dam); + return this; + } + + private float getDamage() { + if (getEntityData().hasKey("Damage")) { + return getEntityData().getFloat("Damage"); + } + + if (isPreset("BlastFurnace")) { + return 8F; + } + return 2.0F; + } + + public EntityFireBlast setDamage(float dam) { + getEntityData().setFloat("Damage", dam); + return this; + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + public boolean canBeCollidedWith() { + return false; + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource src, float power) { + return false; + } + + @Override + public boolean isInvisible() { + return true; + } + + public void modifySpeed(float mod) { + this.accelerationX *= mod; + this.accelerationY *= mod; + this.accelerationZ *= mod; + } + + public boolean isPreset(String s) { + if (getEntityData().hasKey("Preset")) { + return getEntityData().getString("Preset").equalsIgnoreCase(s); + } + return false; + } + + public boolean canBlockCatchFire(int x, int y, int z) { + return canCatchFire(x, y, z, UP); + } + + public boolean canCatchFire(int x, int y, int z, ForgeDirection face) { + return worldObj.getBlock(x, y, z).isFlammable(worldObj, x, y, z, face); + } + + public EntityFireBlast preset(String string) { + getEntityData().setBoolean(string, true); + return this; + } + + private boolean destroyBlocksInAABB(AxisAlignedBB box) { + int var2 = MathHelper.floor_double(box.minX); + int var3 = MathHelper.floor_double(box.minY); + int var4 = MathHelper.floor_double(box.minZ); + int var5 = MathHelper.floor_double(box.maxX); + int var6 = MathHelper.floor_double(box.maxY); + int var7 = MathHelper.floor_double(box.maxZ); + boolean var8 = false; + boolean var9 = false; + + for (int var10 = var2; var10 <= var5; ++var10) { + for (int var11 = var3; var11 <= var6; ++var11) { + for (int var12 = var4; var12 <= var7; ++var12) { + Material var13 = this.worldObj.getBlock(var10, var11, var12).getMaterial(); + + if (var13 != null) { + if (var13 == Material.glass) { + var9 = true; + this.worldObj.setBlockToAir(var10, var11, var12); + } else if (var13 == Material.tnt) { + var9 = true; + this.worldObj.setBlockToAir(var10, var11, var12); + this.worldObj.createExplosion(this, var10, var11, var12, 4.0F, true); + } else { + var8 = true; + } + } + } + } + } + + if (var9) { + double var16 = box.minX + (box.maxX - box.minX) * this.rand.nextFloat(); + double var17 = box.minY + (box.maxY - box.minY) * this.rand.nextFloat(); + double var14 = box.minZ + (box.maxZ - box.minZ) * this.rand.nextFloat(); + this.worldObj.spawnParticle("largeexplode", var16, var17, var14, 0.0D, 0.0D, 0.0D); + for (int a = 0; a < 1 + rand.nextInt(4); a++) + this.worldObj.playSoundAtEntity(this, "dig.glass", 1F, 1F); + } + + return var8; + } + + public DamageSource causeFireblastDamage() { + if (isPreset("BlastFurnace")) { + return blastDamage; + } + return shootingEntity == null ? basicDamage + : (new EntityDamageSourceIndirect("fireblast", this, shootingEntity)).setFireDamage().setProjectile(); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityItemUnbreakable.java b/src/main/java/minefantasy/mf2/entity/EntityItemUnbreakable.java index 0b25c512..01036732 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityItemUnbreakable.java +++ b/src/main/java/minefantasy/mf2/entity/EntityItemUnbreakable.java @@ -1,7 +1,5 @@ package minefantasy.mf2.entity; -import java.util.Iterator; - import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; @@ -11,138 +9,140 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.item.ItemExpireEvent; +import java.util.Iterator; + public class EntityItemUnbreakable extends EntityItem { - public EntityItemUnbreakable(World world) { - super(world); - } - - public EntityItemUnbreakable(World world, EntityItem parent) { - super(world, parent.posX, parent.posY, parent.posZ, parent.getEntityItem()); - this.mimicSpeed(parent); - delayBeforeCanPickup = parent.delayBeforeCanPickup; - isImmuneToFire = true; - } - - public void mimicSpeed(EntityItem parent) { - this.motionX = parent.motionX; - this.motionY = parent.motionY; - this.motionZ = parent.motionZ; - } - - @Override - public boolean attackEntityFrom(DamageSource src, float dam) { - if (isBreakable() && !src.isFireDamage()) { - return super.attackEntityFrom(src, dam); - } - return false; - } - - @Override - public void onUpdate() { - ItemStack stack = this.getDataWatcher().getWatchableObjectItemStack(10); - if (stack != null && stack.getItem() != null) { - if (stack.getItem().onEntityItemUpdate(this)) { - return; - } - } - - if (this.getEntityItem() == null) { - this.setDead(); - } else { - this.onEntityUpdate(); - - if (this.delayBeforeCanPickup > 0) { - --this.delayBeforeCanPickup; - } - - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - if (!isBreakable() && posY <= 1.0F) { - motionY = 0D; - } else { - this.motionY -= 0.03999999910593033D; - } - this.noClip = this.func_145771_j(this.posX, (this.boundingBox.minY + this.boundingBox.maxY) / 2.0D, - this.posZ); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - boolean flag = (int) this.prevPosX != (int) this.posX || (int) this.prevPosY != (int) this.posY - || (int) this.prevPosZ != (int) this.posZ; - - if (flag || this.ticksExisted % 25 == 0) { - if (this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), - MathHelper.floor_double(this.posZ)).getMaterial() == Material.lava) { - this.motionY = 0.20000000298023224D; - this.motionX = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F; - this.motionZ = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F; - } - - if (!this.worldObj.isRemote) { - this.searchForOtherItemsNearby(); - } - } - - float f = 0.98F; - - if (this.onGround) { - f = this.worldObj.getBlock(MathHelper.floor_double(this.posX), - MathHelper.floor_double(this.boundingBox.minY) - 1, - MathHelper.floor_double(this.posZ)).slipperiness * 0.98F; - } - - this.motionX *= f; - this.motionY *= 0.9800000190734863D; - this.motionZ *= f; - - if (this.onGround) { - this.motionY *= -0.5D; - } - - ++this.age; - - ItemStack item = getDataWatcher().getWatchableObjectItemStack(10); - - if (isBreakable()) { - if (!this.worldObj.isRemote && this.age >= lifespan) { - if (item != null) { - ItemExpireEvent event = new ItemExpireEvent(this, - (item.getItem() == null ? 6000 : item.getItem().getEntityLifespan(item, worldObj))); - if (MinecraftForge.EVENT_BUS.post(event)) { - lifespan += event.extraLife; - } else { - this.setDead(); - } - } else { - this.setDead(); - } - } - } - - if (item != null && item.stackSize <= 0) { - this.setDead(); - } - } - } - - private boolean isBreakable() { - return false; - } - - private void searchForOtherItemsNearby() { - Iterator iterator = this.worldObj - .getEntitiesWithinAABB(EntityItem.class, this.boundingBox.expand(0.5D, 0.0D, 0.5D)).iterator(); - - while (iterator.hasNext()) { - EntityItem entityitem = (EntityItem) iterator.next(); - this.combineItems(entityitem); - } - } - - @Override - public void playSound(String sound, float volume, float pitch) { - if (sound.equalsIgnoreCase("random.fizz")) { - return; - } - this.worldObj.playSoundAtEntity(this, sound, volume, pitch); - } + public EntityItemUnbreakable(World world) { + super(world); + } + + public EntityItemUnbreakable(World world, EntityItem parent) { + super(world, parent.posX, parent.posY, parent.posZ, parent.getEntityItem()); + this.mimicSpeed(parent); + delayBeforeCanPickup = parent.delayBeforeCanPickup; + isImmuneToFire = true; + } + + public void mimicSpeed(EntityItem parent) { + this.motionX = parent.motionX; + this.motionY = parent.motionY; + this.motionZ = parent.motionZ; + } + + @Override + public boolean attackEntityFrom(DamageSource src, float dam) { + if (isBreakable() && !src.isFireDamage()) { + return super.attackEntityFrom(src, dam); + } + return false; + } + + @Override + public void onUpdate() { + ItemStack stack = this.getDataWatcher().getWatchableObjectItemStack(10); + if (stack != null && stack.getItem() != null) { + if (stack.getItem().onEntityItemUpdate(this)) { + return; + } + } + + if (this.getEntityItem() == null) { + this.setDead(); + } else { + this.onEntityUpdate(); + + if (this.delayBeforeCanPickup > 0) { + --this.delayBeforeCanPickup; + } + + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if (!isBreakable() && posY <= 1.0F) { + motionY = 0D; + } else { + this.motionY -= 0.03999999910593033D; + } + this.noClip = this.func_145771_j(this.posX, (this.boundingBox.minY + this.boundingBox.maxY) / 2.0D, + this.posZ); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + boolean flag = (int) this.prevPosX != (int) this.posX || (int) this.prevPosY != (int) this.posY + || (int) this.prevPosZ != (int) this.posZ; + + if (flag || this.ticksExisted % 25 == 0) { + if (this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), + MathHelper.floor_double(this.posZ)).getMaterial() == Material.lava) { + this.motionY = 0.20000000298023224D; + this.motionX = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F; + this.motionZ = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F; + } + + if (!this.worldObj.isRemote) { + this.searchForOtherItemsNearby(); + } + } + + float f = 0.98F; + + if (this.onGround) { + f = this.worldObj.getBlock(MathHelper.floor_double(this.posX), + MathHelper.floor_double(this.boundingBox.minY) - 1, + MathHelper.floor_double(this.posZ)).slipperiness * 0.98F; + } + + this.motionX *= f; + this.motionY *= 0.9800000190734863D; + this.motionZ *= f; + + if (this.onGround) { + this.motionY *= -0.5D; + } + + ++this.age; + + ItemStack item = getDataWatcher().getWatchableObjectItemStack(10); + + if (isBreakable()) { + if (!this.worldObj.isRemote && this.age >= lifespan) { + if (item != null) { + ItemExpireEvent event = new ItemExpireEvent(this, + (item.getItem() == null ? 6000 : item.getItem().getEntityLifespan(item, worldObj))); + if (MinecraftForge.EVENT_BUS.post(event)) { + lifespan += event.extraLife; + } else { + this.setDead(); + } + } else { + this.setDead(); + } + } + } + + if (item != null && item.stackSize <= 0) { + this.setDead(); + } + } + } + + private boolean isBreakable() { + return false; + } + + private void searchForOtherItemsNearby() { + Iterator iterator = this.worldObj + .getEntitiesWithinAABB(EntityItem.class, this.boundingBox.expand(0.5D, 0.0D, 0.5D)).iterator(); + + while (iterator.hasNext()) { + EntityItem entityitem = (EntityItem) iterator.next(); + this.combineItems(entityitem); + } + } + + @Override + public void playSound(String sound, float volume, float pitch) { + if (sound.equalsIgnoreCase("random.fizz")) { + return; + } + this.worldObj.playSoundAtEntity(this, sound, volume, pitch); + } } diff --git a/src/main/java/minefantasy/mf2/entity/EntityMine.java b/src/main/java/minefantasy/mf2/entity/EntityMine.java index 834ef4ba..661636e8 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityMine.java +++ b/src/main/java/minefantasy/mf2/entity/EntityMine.java @@ -1,8 +1,5 @@ package minefantasy.mf2.entity; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -24,337 +21,340 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; +import java.util.Iterator; +import java.util.List; + public class EntityMine extends Entity { - /** How long the fuse is */ - public int fuse; - private EntityLivingBase thrower; - - public EntityMine(World world) { - super(world); - this.preventEntitySpawning = true; - this.setSize(0.5F, 0.25F); - this.yOffset = this.height / 2.0F; - } - - public EntityMine(World world, EntityLivingBase thrower) { - this(world); - this.thrower = thrower; - this.fuse = 40; - - this.setLocationAndAngles(thrower.posX, thrower.posY + thrower.getEyeHeight(), thrower.posZ, - thrower.rotationYaw, thrower.rotationPitch); - this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; - this.posY -= 0.10000000149011612D; - this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; - this.setPosition(this.posX, this.posY, this.posZ); - - float f = 0.4F; - this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) - * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; - this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) - * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; - this.motionY = -MathHelper.sin((this.rotationPitch + this.getThrownOffset()) / 180.0F * (float) Math.PI) * f; - this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, this.getThrownForce(), 1.0F); - - this.prevPosX = posX; - this.prevPosY = posY; - this.prevPosZ = posZ; - } - - @Override - public boolean interactFirst(EntityPlayer user) { - if (user.isSneaking()) { - // DISARM - setDead(); - user.swingItem(); - if (!worldObj.isRemote) { - ItemStack item = ToolListMF.mine_custom.createMine(getCasing(), getFilling(), getFuse(), getPowder(), - 1); - if (!user.inventory.addItemStackToInventory(item)) { - this.entityDropItem(item, 0.0F); - } - } - } - return super.interactFirst(user); - } - - public void setThrowableHeading(double x, double y, double z, float offset, float force) { - float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); - x /= f2; - y /= f2; - z /= f2; - x += this.rand.nextGaussian() * 0.007499999832361937D * force; - y += this.rand.nextGaussian() * 0.007499999832361937D * force; - z += this.rand.nextGaussian() * 0.007499999832361937D * force; - x *= offset; - y *= offset; - z *= offset; - this.motionX = x; - this.motionY = y; - this.motionZ = z; - float f3 = MathHelper.sqrt_double(x * x + z * z); - this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(x, z) * 180.0D / Math.PI); - this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(y, f3) * 180.0D / Math.PI); - } - - protected float getThrownOffset() { - return 0.0F; - } - - protected float getThrownForce() { - return 0.5F; - } - - @Override - protected void entityInit() { - dataWatcher.addObject(typeId, (byte) 0); - dataWatcher.addObject(typeId + 1, (byte) 0); - dataWatcher.addObject(typeId + 2, (byte) 0); - dataWatcher.addObject(typeId + 3, (byte) 0); - } - - /** - * returns if this entity triggers Block.onEntityWalking on the blocks they walk - * on. used for spiders and wolves to prevent them from trampling crops - */ - @Override - protected boolean canTriggerWalking() { - return false; - } - - /** - * Returns true if other Entities should be prevented from moving through this - * Entity. - */ - @Override - public boolean canBeCollidedWith() { - return !this.isDead; - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - this.motionY -= (0.03999999910593033D * getCase().weightModifier); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.9800000190734863D; - this.motionY *= 0.9800000190734863D; - this.motionZ *= 0.9800000190734863D; - - if (this.onGround) { - this.motionX = 0; - this.motionZ = 0; - this.motionY *= -0.99D; - } - - if (fuse > 0) { - --fuse; - } - double radius = Math.max(1.0D, getRangeOfBlast() - 1.5D); - - if (ticksExisted % 5 == 0) { - List list = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, - boundingBox.expand(radius * 2, radius, radius * 2)); - if (fuse == 0 && !list.isEmpty()) { - boolean detonate = false; - Iterator i = list.iterator(); - while (i.hasNext()) { - EntityLivingBase e = (EntityLivingBase) i.next(); - if (e.getDistanceToEntity(this) < radius) { - detonate = true; - break; - } - } - - if (detonate) { - worldObj.playSoundEffect(posX, posY, posZ, "game.tnt.primed", 1.0F, 0.75F); - --fuse; - } - } - } - if (fuse < 0) { - fuse--; - - if (fuse < -10) { - this.setDead(); - - if (!this.worldObj.isRemote) { - this.explode(); - } - } - } - } - - private void explode2() { - float power = 5.0F; - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, power, false); - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - protected void writeEntityToNBT(NBTTagCompound nbt) { - nbt.setByte("Fuse", (byte) this.fuse); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - protected void readEntityFromNBT(NBTTagCompound nbt) { - this.fuse = nbt.getByte("Fuse"); - } - - @Override - @SideOnly(Side.CLIENT) - public float getShadowSize() { - return 0.25F; - } - - /** - * returns null or the entityliving it was placed or ignited by - */ - public EntityLivingBase getTntPlacedBy() { - return this.thrower; - } - - public void explode() { - worldObj.playSoundAtEntity(this, "random.explode", 0.3F, 10F - 5F); - worldObj.createExplosion(this, posX, posY, posZ, 0, false); - if (!this.worldObj.isRemote) { - double area = getRangeOfBlast() * 2D * getPowderType().rangeModifier; - AxisAlignedBB var3 = this.boundingBox.expand(area, area / 2, area); - List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); - - if (var4 != null && !var4.isEmpty()) { - Iterator splashDamage = var4.iterator(); - - while (splashDamage.hasNext()) { - Entity entityHit = (Entity) splashDamage.next(); - - if (MineFantasyII.isBukkitServer() - && BukkitUtils.cantDamage(thrower != null ? thrower : this, entityHit)) { - continue; - } - - double distanceToEntity = this.getDistanceToEntity(entityHit); - - double radius = getRangeOfBlast() * getPowderType().rangeModifier; - if (distanceToEntity < radius) { - float dam = getDamage(); - - if (getCasing() != 2 && distanceToEntity > radius / 2) { - double sc = distanceToEntity - (radius / 2); - if (sc < 0) - sc = 0; - if (sc > (radius / 2)) - sc = (radius / 2); - dam *= (sc / (radius / 2)); - } - if (!(entityHit instanceof EntityItem)) { - DamageSource source = mineDmg; - if (getFilling() == 2) { - source = mineFireDmg; - } - if (entityHit.attackEntityFrom(source, dam)) { - applyEffects(entityHit); - } - } - } - } - } - this.setDead(); - } - - int t = getFilling(); - if (t > 0) { - for (int a = 0; a < 16; a++) { - float range = 0.6F; - EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY + 0.5D, posZ, - (rand.nextDouble() - 0.5) * (range / 2), (rand.nextDouble()) * range, - (rand.nextDouble() - 0.5) * (range / 2)); - - if (t == 2) { - shrapnel.setFire(10); - } - worldObj.spawnEntityInWorld(shrapnel); - } - } - } - - private void applyEffects(Entity hit) { - if (getFilling() == 2) { - hit.setFire(8); - } - if (hit instanceof EntityLivingBase) { - EntityLivingBase live = (EntityLivingBase) hit; - } - } - - private double getRangeOfBlast() { - return getBlast().range * getCase().rangeModifier; - } - - private float getDamage() { - return getBlast().damage * getCase().damageModifier * getPowderType().damageModifier; - } - - private static DamageSource mineDmg = new DamageSource("mine").setExplosion(); - private static DamageSource mineFireDmg = new DamageSource("mine").setExplosion().setFireDamage(); - - public boolean canEntityBeSeen(Entity entity) { - return this.worldObj.rayTraceBlocks( - Vec3.createVectorHelper(this.posX, this.posY + this.getEyeHeight(), this.posZ), - Vec3.createVectorHelper(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ)) == null; - } - - private final int typeId = 2; - - public byte getFilling() { - return dataWatcher.getWatchableObjectByte(typeId); - } - - public byte getCasing() { - return dataWatcher.getWatchableObjectByte(typeId + 1); - } - - public byte getFuse() { - return dataWatcher.getWatchableObjectByte(typeId + 2); - } - - public byte getPowder() { - return dataWatcher.getWatchableObjectByte(typeId + 3); - } - - public EntityMine setType(byte fill, byte casing, byte fuse, byte powder) { - dataWatcher.updateObject(typeId, fill); - dataWatcher.updateObject(typeId + 1, casing); - dataWatcher.updateObject(typeId + 2, fuse); - dataWatcher.updateObject(typeId + 3, powder); - - this.fuse = getFuseType().time; - - return this; - } - - private EnumExplosiveType getBlast() { - return EnumExplosiveType.getType(getFilling()); - } - - private EnumCasingType getCase() { - return EnumCasingType.getType(getCasing()); - } - - private EnumFuseType getFuseType() { - return EnumFuseType.getType(getFuse()); - } - - private EnumPowderType getPowderType() { - return EnumPowderType.getType(getPowder()); - } + private static DamageSource mineDmg = new DamageSource("mine").setExplosion(); + private static DamageSource mineFireDmg = new DamageSource("mine").setExplosion().setFireDamage(); + private final int typeId = 2; + /** + * How long the fuse is + */ + public int fuse; + private EntityLivingBase thrower; + + public EntityMine(World world) { + super(world); + this.preventEntitySpawning = true; + this.setSize(0.5F, 0.25F); + this.yOffset = this.height / 2.0F; + } + + public EntityMine(World world, EntityLivingBase thrower) { + this(world); + this.thrower = thrower; + this.fuse = 40; + + this.setLocationAndAngles(thrower.posX, thrower.posY + thrower.getEyeHeight(), thrower.posZ, + thrower.rotationYaw, thrower.rotationPitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.posY -= 0.10000000149011612D; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + + float f = 0.4F; + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; + this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) + * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * f; + this.motionY = -MathHelper.sin((this.rotationPitch + this.getThrownOffset()) / 180.0F * (float) Math.PI) * f; + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, this.getThrownForce(), 1.0F); + + this.prevPosX = posX; + this.prevPosY = posY; + this.prevPosZ = posZ; + } + + @Override + public boolean interactFirst(EntityPlayer user) { + if (user.isSneaking()) { + // DISARM + setDead(); + user.swingItem(); + if (!worldObj.isRemote) { + ItemStack item = ToolListMF.mine_custom.createMine(getCasing(), getFilling(), getFuse(), getPowder(), + 1); + if (!user.inventory.addItemStackToInventory(item)) { + this.entityDropItem(item, 0.0F); + } + } + } + return super.interactFirst(user); + } + + public void setThrowableHeading(double x, double y, double z, float offset, float force) { + float f2 = MathHelper.sqrt_double(x * x + y * y + z * z); + x /= f2; + y /= f2; + z /= f2; + x += this.rand.nextGaussian() * 0.007499999832361937D * force; + y += this.rand.nextGaussian() * 0.007499999832361937D * force; + z += this.rand.nextGaussian() * 0.007499999832361937D * force; + x *= offset; + y *= offset; + z *= offset; + this.motionX = x; + this.motionY = y; + this.motionZ = z; + float f3 = MathHelper.sqrt_double(x * x + z * z); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(x, z) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(y, f3) * 180.0D / Math.PI); + } + + protected float getThrownOffset() { + return 0.0F; + } + + protected float getThrownForce() { + return 0.5F; + } + + @Override + protected void entityInit() { + dataWatcher.addObject(typeId, (byte) 0); + dataWatcher.addObject(typeId + 1, (byte) 0); + dataWatcher.addObject(typeId + 2, (byte) 0); + dataWatcher.addObject(typeId + 3, (byte) 0); + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they walk + * on. used for spiders and wolves to prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() { + return false; + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + @Override + public boolean canBeCollidedWith() { + return !this.isDead; + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + this.motionY -= (0.03999999910593033D * getCase().weightModifier); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.9800000190734863D; + this.motionY *= 0.9800000190734863D; + this.motionZ *= 0.9800000190734863D; + + if (this.onGround) { + this.motionX = 0; + this.motionZ = 0; + this.motionY *= -0.99D; + } + + if (fuse > 0) { + --fuse; + } + double radius = Math.max(1.0D, getRangeOfBlast() - 1.5D); + + if (ticksExisted % 5 == 0) { + List list = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, + boundingBox.expand(radius * 2, radius, radius * 2)); + if (fuse == 0 && !list.isEmpty()) { + boolean detonate = false; + Iterator i = list.iterator(); + while (i.hasNext()) { + EntityLivingBase e = (EntityLivingBase) i.next(); + if (e.getDistanceToEntity(this) < radius) { + detonate = true; + break; + } + } + + if (detonate) { + worldObj.playSoundEffect(posX, posY, posZ, "game.tnt.primed", 1.0F, 0.75F); + --fuse; + } + } + } + if (fuse < 0) { + fuse--; + + if (fuse < -10) { + this.setDead(); + + if (!this.worldObj.isRemote) { + this.explode(); + } + } + } + } + + private void explode2() { + float power = 5.0F; + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, power, false); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + protected void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setByte("Fuse", (byte) this.fuse); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + protected void readEntityFromNBT(NBTTagCompound nbt) { + this.fuse = nbt.getByte("Fuse"); + } + + @Override + @SideOnly(Side.CLIENT) + public float getShadowSize() { + return 0.25F; + } + + /** + * returns null or the entityliving it was placed or ignited by + */ + public EntityLivingBase getTntPlacedBy() { + return this.thrower; + } + + public void explode() { + worldObj.playSoundAtEntity(this, "random.explode", 0.3F, 10F - 5F); + worldObj.createExplosion(this, posX, posY, posZ, 0, false); + if (!this.worldObj.isRemote) { + double area = getRangeOfBlast() * 2D * getPowderType().rangeModifier; + AxisAlignedBB var3 = this.boundingBox.expand(area, area / 2, area); + List var4 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, var3); + + if (var4 != null && !var4.isEmpty()) { + Iterator splashDamage = var4.iterator(); + + while (splashDamage.hasNext()) { + Entity entityHit = (Entity) splashDamage.next(); + + if (MineFantasyII.isBukkitServer() + && BukkitUtils.cantDamage(thrower != null ? thrower : this, entityHit)) { + continue; + } + + double distanceToEntity = this.getDistanceToEntity(entityHit); + + double radius = getRangeOfBlast() * getPowderType().rangeModifier; + if (distanceToEntity < radius) { + float dam = getDamage(); + + if (getCasing() != 2 && distanceToEntity > radius / 2) { + double sc = distanceToEntity - (radius / 2); + if (sc < 0) + sc = 0; + if (sc > (radius / 2)) + sc = (radius / 2); + dam *= (sc / (radius / 2)); + } + if (!(entityHit instanceof EntityItem)) { + DamageSource source = mineDmg; + if (getFilling() == 2) { + source = mineFireDmg; + } + if (entityHit.attackEntityFrom(source, dam)) { + applyEffects(entityHit); + } + } + } + } + } + this.setDead(); + } + + int t = getFilling(); + if (t > 0) { + for (int a = 0; a < 16; a++) { + float range = 0.6F; + EntityShrapnel shrapnel = new EntityShrapnel(worldObj, posX, posY + 0.5D, posZ, + (rand.nextDouble() - 0.5) * (range / 2), (rand.nextDouble()) * range, + (rand.nextDouble() - 0.5) * (range / 2)); + + if (t == 2) { + shrapnel.setFire(10); + } + worldObj.spawnEntityInWorld(shrapnel); + } + } + } + + private void applyEffects(Entity hit) { + if (getFilling() == 2) { + hit.setFire(8); + } + if (hit instanceof EntityLivingBase) { + EntityLivingBase live = (EntityLivingBase) hit; + } + } + + private double getRangeOfBlast() { + return getBlast().range * getCase().rangeModifier; + } + + private float getDamage() { + return getBlast().damage * getCase().damageModifier * getPowderType().damageModifier; + } + + public boolean canEntityBeSeen(Entity entity) { + return this.worldObj.rayTraceBlocks( + Vec3.createVectorHelper(this.posX, this.posY + this.getEyeHeight(), this.posZ), + Vec3.createVectorHelper(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ)) == null; + } + + public byte getFilling() { + return dataWatcher.getWatchableObjectByte(typeId); + } + + public byte getCasing() { + return dataWatcher.getWatchableObjectByte(typeId + 1); + } + + public byte getFuse() { + return dataWatcher.getWatchableObjectByte(typeId + 2); + } + + public byte getPowder() { + return dataWatcher.getWatchableObjectByte(typeId + 3); + } + + public EntityMine setType(byte fill, byte casing, byte fuse, byte powder) { + dataWatcher.updateObject(typeId, fill); + dataWatcher.updateObject(typeId + 1, casing); + dataWatcher.updateObject(typeId + 2, fuse); + dataWatcher.updateObject(typeId + 3, powder); + + this.fuse = getFuseType().time; + + return this; + } + + private EnumExplosiveType getBlast() { + return EnumExplosiveType.getType(getFilling()); + } + + private EnumCasingType getCase() { + return EnumCasingType.getType(getCasing()); + } + + private EnumFuseType getFuseType() { + return EnumFuseType.getType(getFuse()); + } + + private EnumPowderType getPowderType() { + return EnumPowderType.getType(getPowder()); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityParachute.java b/src/main/java/minefantasy/mf2/entity/EntityParachute.java index 866c1971..ca3c38b7 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityParachute.java +++ b/src/main/java/minefantasy/mf2/entity/EntityParachute.java @@ -1,7 +1,5 @@ package minefantasy.mf2.entity; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.helpers.ArmourCalculator; @@ -19,478 +17,482 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.List; + public class EntityParachute extends Entity { - /** true if no player in parachute */ - private boolean isParachuteEmpty; - private double speedMultiplier; - private int parachutePosRotationIncrements; - private double parachuteX; - private double parachuteY; - private double parachuteZ; - private double parachuteYaw; - private double parachutePitch; - @SideOnly(Side.CLIENT) - private double velocityX; - @SideOnly(Side.CLIENT) - private double velocityY; - @SideOnly(Side.CLIENT) - private double velocityZ; - - public EntityParachute(World world) { - super(world); - this.isParachuteEmpty = true; - this.speedMultiplier = 0.07D; - this.preventEntitySpawning = true; - this.setSize(2F, 4F); - } - - /** - * returns if this entity triggers Block.onEntityWalking on the blocks they walk - * on. used for spiders and wolves to prevent them from trampling crops - */ - @Override - protected boolean canTriggerWalking() { - return false; - } - - @Override - public boolean canRiderInteract() { - return false; - } - - protected void entityInit() { - this.dataWatcher.addObject(17, new Integer(0)); - this.dataWatcher.addObject(18, new Integer(1)); - this.dataWatcher.addObject(19, new Float(0.0F)); - } - - /** - * Returns a boundingBox used to collide the entity with other entities and - * blocks. This enables the entity to be pushable on contact, like parachutes or - * minecarts. - */ - public AxisAlignedBB getCollisionBox(Entity entity) { - return entity.boundingBox; - } - - /** - * returns the bounding box for this entity - */ - public AxisAlignedBB getBoundingBox() { - return this.boundingBox; - } - - /** - * Returns true if this entity should push and be pushed by other entities when - * colliding. - */ - public boolean canBePushed() { - return true; - } - - public EntityParachute(World world, double x, double y, double z) { - this(world); - this.setPosition(x, y + this.yOffset, z); - this.motionX = 0.0D; - this.motionY = 0.0D; - this.motionZ = 0.0D; - this.prevPosX = x; - this.prevPosY = y; - this.prevPosZ = z; - } - - /** - * Returns the Y offset from the entity's position for any entity riding this - * one. - */ - public double getMountedYOffset() { - return 1D; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource src, float dam) { - if (this.isEntityInvulnerable()) { - return false; - } else if (!this.worldObj.isRemote && !this.isDead) { - this.setForwardDirection(-this.getForwardDirection()); - this.setTimeSinceHit(10); - this.setDamageTaken(this.getDamageTaken() + dam * 10.0F); - this.setBeenAttacked(); - boolean flag = src.getEntity() instanceof EntityPlayer - && ((EntityPlayer) src.getEntity()).capabilities.isCreativeMode; - - if (flag || this.getDamageTaken() > 20.0F) { - if (this.riddenByEntity != null) { - this.riddenByEntity.mountEntity(this); - } - - if (!flag) { - this.func_145778_a(ToolListMF.parachute, 1, 0.0F); - } - - this.setDead(); - } - - return true; - } else { - return true; - } - } - - /** - * Setups the entity to do the hurt animation. Only used by packets in - * multiplayer. - */ - @SideOnly(Side.CLIENT) - public void performHurtAnimation() { - this.setForwardDirection(-this.getForwardDirection()); - this.setTimeSinceHit(10); - this.setDamageTaken(this.getDamageTaken() * 11.0F); - } - - /** - * Returns true if other Entities should be prevented from moving through this - * Entity. - */ - public boolean canBeCollidedWith() { - return !this.isDead; - } - - /** - * Sets the position and rotation. Only difference from the other one is no - * bounding on the rotation. Args: posX, posY, posZ, yaw, pitch - */ - @SideOnly(Side.CLIENT) - public void setPositionAndRotation2(double x, double y, double z, float xr, float yr, int zr) { - if (this.isParachuteEmpty) { - this.parachutePosRotationIncrements = zr + 5; - } else { - double d3 = x - this.posX; - double d4 = y - this.posY; - double d5 = z - this.posZ; - double d6 = d3 * d3 + d4 * d4 + d5 * d5; - - if (d6 <= 1.0D) { - return; - } - - this.parachutePosRotationIncrements = 3; - } - - this.parachuteX = x; - this.parachuteY = y; - this.parachuteZ = z; - this.parachuteYaw = xr; - this.parachutePitch = yr; - this.motionX = this.velocityX; - this.motionY = this.velocityY; - this.motionZ = this.velocityZ; - } - - /** - * Sets the velocity to the args. Args: x, y, z - */ - @SideOnly(Side.CLIENT) - public void setVelocity(double xv, double yv, double zv) { - this.velocityX = this.motionX = xv; - this.velocityY = this.motionY = yv; - this.velocityZ = this.motionZ = zv; - } - - /** - * Called to update the entity's position/logic. - */ - protected void fall(float distance) { - } - - public void onUpdate() { - if (this.riddenByEntity != null) { - riddenByEntity.fallDistance = 0; - // this.rotationYaw = riddenByEntity.rotationYaw; - } - super.onUpdate(); - - if (this.getTimeSinceHit() > 0) { - this.setTimeSinceHit(this.getTimeSinceHit() - 1); - } - - if (this.getDamageTaken() > 0.0F) { - this.setDamageTaken(this.getDamageTaken() - 1.0F); - } - - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - byte b0 = 5; - double d0 = 0.0D; - - for (int i = 0; i < b0; ++i) { - double d1 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (i + 0) / b0 - 0.125D; - double d3 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (i + 1) / b0 - 0.125D; - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.boundingBox.minX, d1, this.boundingBox.minZ, - this.boundingBox.maxX, d3, this.boundingBox.maxZ); - - if (this.worldObj.isAABBInMaterial(axisalignedbb, Material.water)) { - d0 += 1.0D / b0; - } - } - - double d10 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); - double d2; - double d4; - double d11; - double d12; - - if (this.worldObj.isRemote && this.isParachuteEmpty) { - if (this.parachutePosRotationIncrements > 0) { - d2 = this.posX + (this.parachuteX - this.posX) / this.parachutePosRotationIncrements; - d4 = this.posY + (this.parachuteY - this.posY) / this.parachutePosRotationIncrements; - d11 = this.posZ + (this.parachuteZ - this.posZ) / this.parachutePosRotationIncrements; - d12 = MathHelper.wrapAngleTo180_double(this.parachuteYaw - this.rotationYaw); - this.rotationYaw = (float) (this.rotationYaw + d12 / this.parachutePosRotationIncrements); - this.rotationPitch = (float) (this.rotationPitch - + (this.parachutePitch - this.rotationPitch) / this.parachutePosRotationIncrements); - --this.parachutePosRotationIncrements; - this.setPosition(d2, d4, d11); - this.setRotation(this.rotationYaw, this.rotationPitch); - } else { - d2 = this.posX + this.motionX; - d4 = this.posY + this.motionY; - d11 = this.posZ + this.motionZ; - this.setPosition(d2, d4, d11); - - if (this.onGround) { - this.motionX *= 0.5D; - this.motionY *= 0.5D; - this.motionZ *= 0.5D; - } - - this.motionX *= 0.9900000095367432D; - this.motionY *= 0.949999988079071D; - this.motionZ *= 0.9900000095367432D; - } - } else { - if (d0 < 1.0D) { - d2 = d0 * 2.0D - 1.0D; - this.motionY += 0.03999999910593033D * d2; - } else { - if (this.motionY < 0.0D) { - this.motionY /= 2.0D; - } - - this.motionY += 0.007000000216066837D; - } - - if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase) { - EntityLivingBase entitylivingbase = (EntityLivingBase) this.riddenByEntity; - float f = this.riddenByEntity.rotationYaw + -entitylivingbase.moveStrafing * 90.0F; - this.motionX += -Math.sin(f * (float) Math.PI / 180.0F) * this.speedMultiplier - * entitylivingbase.moveForward * 0.05000000074505806D; - this.motionZ += Math.cos(f * (float) Math.PI / 180.0F) * this.speedMultiplier - * entitylivingbase.moveForward * 0.05000000074505806D; - } - - d2 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); - - if (d2 > 0.35D) { - d4 = 0.35D / d2; - this.motionX *= d4; - this.motionZ *= d4; - d2 = 0.35D; - } - - if (d2 > d10 && this.speedMultiplier < 0.35D) { - this.speedMultiplier += (0.35D - this.speedMultiplier) / 35.0D; - - if (this.speedMultiplier > 0.35D) { - this.speedMultiplier = 0.35D; - } - } else { - this.speedMultiplier -= (this.speedMultiplier - 0.07D) / 35.0D; - - if (this.speedMultiplier < 0.07D) { - this.speedMultiplier = 0.07D; - } - } - - int l; - - this.motionY *= 0.5D; - if (this.onGround) { - this.motionX *= 0.5D; - this.motionZ *= 0.5D; - } - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - - if ((this.isCollidedHorizontally && d10 > 0D) || isTooHeavy()) { - if (!this.worldObj.isRemote && !this.isDead) { - this.setDead(); - - for (l = 0; l < 3; ++l) { - this.func_145778_a(Item.getItemFromBlock(Blocks.wool), 1, 0.0F); - } - - for (l = 0; l < 2; ++l) { - this.func_145778_a(ComponentListMF.leather_strip, 1, 0.0F); - } - } - } else { - this.motionX *= 0.9900000095367432D; - this.motionY *= 0.949999988079071D; - this.motionZ *= 0.9900000095367432D; - } - - this.rotationPitch = 0.0F; - d4 = this.rotationYaw; - d11 = this.prevPosX - this.posX; - d12 = this.prevPosZ - this.posZ; - - if (d11 * d11 + d12 * d12 > 0.001D) { - d4 = ((float) (Math.atan2(d12, d11) * 180.0D / Math.PI)); - } - - double d7 = MathHelper.wrapAngleTo180_double(d4 - this.rotationYaw); - - if (d7 > 20.0D) { - d7 = 20.0D; - } - - if (d7 < -20.0D) { - d7 = -20.0D; - } - - this.rotationYaw = (float) (this.rotationYaw + d7); - this.setRotation(this.rotationYaw, this.rotationPitch); - - if (!this.worldObj.isRemote) { - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, - this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - - if (list != null && !list.isEmpty()) { - for (int k1 = 0; k1 < list.size(); ++k1) { - Entity entity = (Entity) list.get(k1); - - if (entity != this.riddenByEntity && entity.canBePushed() - && entity instanceof EntityParachute) { - entity.applyEntityCollision(this); - } - } - } - - if (this.riddenByEntity != null && this.riddenByEntity.isDead) { - this.riddenByEntity = null; - } - } - } - } - - private boolean isTooHeavy() { - if (riddenByEntity != null && riddenByEntity instanceof EntityLivingBase) { - return ArmourCalculator.getTotalWeightOfWorn((EntityLivingBase) riddenByEntity, false) > 100F; - } - return false; - } - - public void updateRiderPosition() { - if (this.riddenByEntity != null) { - double d0 = Math.cos(this.rotationYaw * Math.PI / 180.0D) * 0.4D; - double d1 = Math.sin(this.rotationYaw * Math.PI / 180.0D) * 0.4D; - this.riddenByEntity.setPosition(this.posX + d0, - this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ + d1); - } - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - protected void writeEntityToNBT(NBTTagCompound nbt) { - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - protected void readEntityFromNBT(NBTTagCompound nbt) { - } - - @SideOnly(Side.CLIENT) - public float getShadowSize() { - return 0.0F; - } - - /** - * Takes in the distance the entity has fallen this tick and whether its on the - * ground to update the fall distance and deal fall damage if landing on the - * ground. Args: distanceFallenThisTick, onGround - */ - protected void updateFallState(double dist, boolean hitGound) { - int i = MathHelper.floor_double(this.posX); - int j = MathHelper.floor_double(this.posY); - int k = MathHelper.floor_double(this.posZ); - - if (hitGound) { - if (this.fallDistance > 0.0F || onGround) { - if (!this.worldObj.isRemote && !this.isDead) { - this.setDead(); - this.func_145778_a(ToolListMF.parachute, 1, 0.0F); - } - - this.fallDistance = 0.0F; - } - } else if (this.worldObj.getBlock(i, j - 1, k).getMaterial() != Material.water && dist < 0.0D) { - this.fallDistance = (float) (this.fallDistance - dist); - } - } - - /** - * Sets the damage taken from the last hit. - */ - public void setDamageTaken(float dam) { - this.dataWatcher.updateObject(19, Float.valueOf(dam)); - } - - /** - * Gets the damage taken from the last hit. - */ - public float getDamageTaken() { - return this.dataWatcher.getWatchableObjectFloat(19); - } - - /** - * Sets the time to count down from since the last time entity was hit. - */ - public void setTimeSinceHit(int time) { - this.dataWatcher.updateObject(17, Integer.valueOf(time)); - } - - /** - * Gets the time since the last hit. - */ - public int getTimeSinceHit() { - return this.dataWatcher.getWatchableObjectInt(17); - } - - /** - * Sets the forward direction of the entity. - */ - public void setForwardDirection(int dir) { - this.dataWatcher.updateObject(18, Integer.valueOf(dir)); - } - - /** - * Gets the forward direction of the entity. - */ - public int getForwardDirection() { - return this.dataWatcher.getWatchableObjectInt(18); - } - - /** - * true if no player in parachute - */ - @SideOnly(Side.CLIENT) - public void setIsParachuteEmpty(boolean flag) { - this.isParachuteEmpty = flag; - } + /** + * true if no player in parachute + */ + private boolean isParachuteEmpty; + private double speedMultiplier; + private int parachutePosRotationIncrements; + private double parachuteX; + private double parachuteY; + private double parachuteZ; + private double parachuteYaw; + private double parachutePitch; + @SideOnly(Side.CLIENT) + private double velocityX; + @SideOnly(Side.CLIENT) + private double velocityY; + @SideOnly(Side.CLIENT) + private double velocityZ; + + public EntityParachute(World world) { + super(world); + this.isParachuteEmpty = true; + this.speedMultiplier = 0.07D; + this.preventEntitySpawning = true; + this.setSize(2F, 4F); + } + + public EntityParachute(World world, double x, double y, double z) { + this(world); + this.setPosition(x, y + this.yOffset, z); + this.motionX = 0.0D; + this.motionY = 0.0D; + this.motionZ = 0.0D; + this.prevPosX = x; + this.prevPosY = y; + this.prevPosZ = z; + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they walk + * on. used for spiders and wolves to prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + public boolean canRiderInteract() { + return false; + } + + protected void entityInit() { + this.dataWatcher.addObject(17, new Integer(0)); + this.dataWatcher.addObject(18, new Integer(1)); + this.dataWatcher.addObject(19, new Float(0.0F)); + } + + /** + * Returns a boundingBox used to collide the entity with other entities and + * blocks. This enables the entity to be pushable on contact, like parachutes or + * minecarts. + */ + public AxisAlignedBB getCollisionBox(Entity entity) { + return entity.boundingBox; + } + + /** + * returns the bounding box for this entity + */ + public AxisAlignedBB getBoundingBox() { + return this.boundingBox; + } + + /** + * Returns true if this entity should push and be pushed by other entities when + * colliding. + */ + public boolean canBePushed() { + return true; + } + + /** + * Returns the Y offset from the entity's position for any entity riding this + * one. + */ + public double getMountedYOffset() { + return 1D; + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource src, float dam) { + if (this.isEntityInvulnerable()) { + return false; + } else if (!this.worldObj.isRemote && !this.isDead) { + this.setForwardDirection(-this.getForwardDirection()); + this.setTimeSinceHit(10); + this.setDamageTaken(this.getDamageTaken() + dam * 10.0F); + this.setBeenAttacked(); + boolean flag = src.getEntity() instanceof EntityPlayer + && ((EntityPlayer) src.getEntity()).capabilities.isCreativeMode; + + if (flag || this.getDamageTaken() > 20.0F) { + if (this.riddenByEntity != null) { + this.riddenByEntity.mountEntity(this); + } + + if (!flag) { + this.func_145778_a(ToolListMF.parachute, 1, 0.0F); + } + + this.setDead(); + } + + return true; + } else { + return true; + } + } + + /** + * Setups the entity to do the hurt animation. Only used by packets in + * multiplayer. + */ + @SideOnly(Side.CLIENT) + public void performHurtAnimation() { + this.setForwardDirection(-this.getForwardDirection()); + this.setTimeSinceHit(10); + this.setDamageTaken(this.getDamageTaken() * 11.0F); + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + public boolean canBeCollidedWith() { + return !this.isDead; + } + + /** + * Sets the position and rotation. Only difference from the other one is no + * bounding on the rotation. Args: posX, posY, posZ, yaw, pitch + */ + @SideOnly(Side.CLIENT) + public void setPositionAndRotation2(double x, double y, double z, float xr, float yr, int zr) { + if (this.isParachuteEmpty) { + this.parachutePosRotationIncrements = zr + 5; + } else { + double d3 = x - this.posX; + double d4 = y - this.posY; + double d5 = z - this.posZ; + double d6 = d3 * d3 + d4 * d4 + d5 * d5; + + if (d6 <= 1.0D) { + return; + } + + this.parachutePosRotationIncrements = 3; + } + + this.parachuteX = x; + this.parachuteY = y; + this.parachuteZ = z; + this.parachuteYaw = xr; + this.parachutePitch = yr; + this.motionX = this.velocityX; + this.motionY = this.velocityY; + this.motionZ = this.velocityZ; + } + + /** + * Sets the velocity to the args. Args: x, y, z + */ + @SideOnly(Side.CLIENT) + public void setVelocity(double xv, double yv, double zv) { + this.velocityX = this.motionX = xv; + this.velocityY = this.motionY = yv; + this.velocityZ = this.motionZ = zv; + } + + /** + * Called to update the entity's position/logic. + */ + protected void fall(float distance) { + } + + public void onUpdate() { + if (this.riddenByEntity != null) { + riddenByEntity.fallDistance = 0; + // this.rotationYaw = riddenByEntity.rotationYaw; + } + super.onUpdate(); + + if (this.getTimeSinceHit() > 0) { + this.setTimeSinceHit(this.getTimeSinceHit() - 1); + } + + if (this.getDamageTaken() > 0.0F) { + this.setDamageTaken(this.getDamageTaken() - 1.0F); + } + + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + byte b0 = 5; + double d0 = 0.0D; + + for (int i = 0; i < b0; ++i) { + double d1 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (i + 0) / b0 - 0.125D; + double d3 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (i + 1) / b0 - 0.125D; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.boundingBox.minX, d1, this.boundingBox.minZ, + this.boundingBox.maxX, d3, this.boundingBox.maxZ); + + if (this.worldObj.isAABBInMaterial(axisalignedbb, Material.water)) { + d0 += 1.0D / b0; + } + } + + double d10 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); + double d2; + double d4; + double d11; + double d12; + + if (this.worldObj.isRemote && this.isParachuteEmpty) { + if (this.parachutePosRotationIncrements > 0) { + d2 = this.posX + (this.parachuteX - this.posX) / this.parachutePosRotationIncrements; + d4 = this.posY + (this.parachuteY - this.posY) / this.parachutePosRotationIncrements; + d11 = this.posZ + (this.parachuteZ - this.posZ) / this.parachutePosRotationIncrements; + d12 = MathHelper.wrapAngleTo180_double(this.parachuteYaw - this.rotationYaw); + this.rotationYaw = (float) (this.rotationYaw + d12 / this.parachutePosRotationIncrements); + this.rotationPitch = (float) (this.rotationPitch + + (this.parachutePitch - this.rotationPitch) / this.parachutePosRotationIncrements); + --this.parachutePosRotationIncrements; + this.setPosition(d2, d4, d11); + this.setRotation(this.rotationYaw, this.rotationPitch); + } else { + d2 = this.posX + this.motionX; + d4 = this.posY + this.motionY; + d11 = this.posZ + this.motionZ; + this.setPosition(d2, d4, d11); + + if (this.onGround) { + this.motionX *= 0.5D; + this.motionY *= 0.5D; + this.motionZ *= 0.5D; + } + + this.motionX *= 0.9900000095367432D; + this.motionY *= 0.949999988079071D; + this.motionZ *= 0.9900000095367432D; + } + } else { + if (d0 < 1.0D) { + d2 = d0 * 2.0D - 1.0D; + this.motionY += 0.03999999910593033D * d2; + } else { + if (this.motionY < 0.0D) { + this.motionY /= 2.0D; + } + + this.motionY += 0.007000000216066837D; + } + + if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase) { + EntityLivingBase entitylivingbase = (EntityLivingBase) this.riddenByEntity; + float f = this.riddenByEntity.rotationYaw + -entitylivingbase.moveStrafing * 90.0F; + this.motionX += -Math.sin(f * (float) Math.PI / 180.0F) * this.speedMultiplier + * entitylivingbase.moveForward * 0.05000000074505806D; + this.motionZ += Math.cos(f * (float) Math.PI / 180.0F) * this.speedMultiplier + * entitylivingbase.moveForward * 0.05000000074505806D; + } + + d2 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); + + if (d2 > 0.35D) { + d4 = 0.35D / d2; + this.motionX *= d4; + this.motionZ *= d4; + d2 = 0.35D; + } + + if (d2 > d10 && this.speedMultiplier < 0.35D) { + this.speedMultiplier += (0.35D - this.speedMultiplier) / 35.0D; + + if (this.speedMultiplier > 0.35D) { + this.speedMultiplier = 0.35D; + } + } else { + this.speedMultiplier -= (this.speedMultiplier - 0.07D) / 35.0D; + + if (this.speedMultiplier < 0.07D) { + this.speedMultiplier = 0.07D; + } + } + + int l; + + this.motionY *= 0.5D; + if (this.onGround) { + this.motionX *= 0.5D; + this.motionZ *= 0.5D; + } + + this.moveEntity(this.motionX, this.motionY, this.motionZ); + + if ((this.isCollidedHorizontally && d10 > 0D) || isTooHeavy()) { + if (!this.worldObj.isRemote && !this.isDead) { + this.setDead(); + + for (l = 0; l < 3; ++l) { + this.func_145778_a(Item.getItemFromBlock(Blocks.wool), 1, 0.0F); + } + + for (l = 0; l < 2; ++l) { + this.func_145778_a(ComponentListMF.leather_strip, 1, 0.0F); + } + } + } else { + this.motionX *= 0.9900000095367432D; + this.motionY *= 0.949999988079071D; + this.motionZ *= 0.9900000095367432D; + } + + this.rotationPitch = 0.0F; + d4 = this.rotationYaw; + d11 = this.prevPosX - this.posX; + d12 = this.prevPosZ - this.posZ; + + if (d11 * d11 + d12 * d12 > 0.001D) { + d4 = ((float) (Math.atan2(d12, d11) * 180.0D / Math.PI)); + } + + double d7 = MathHelper.wrapAngleTo180_double(d4 - this.rotationYaw); + + if (d7 > 20.0D) { + d7 = 20.0D; + } + + if (d7 < -20.0D) { + d7 = -20.0D; + } + + this.rotationYaw = (float) (this.rotationYaw + d7); + this.setRotation(this.rotationYaw, this.rotationPitch); + + if (!this.worldObj.isRemote) { + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, + this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D)); + + if (list != null && !list.isEmpty()) { + for (int k1 = 0; k1 < list.size(); ++k1) { + Entity entity = (Entity) list.get(k1); + + if (entity != this.riddenByEntity && entity.canBePushed() + && entity instanceof EntityParachute) { + entity.applyEntityCollision(this); + } + } + } + + if (this.riddenByEntity != null && this.riddenByEntity.isDead) { + this.riddenByEntity = null; + } + } + } + } + + private boolean isTooHeavy() { + if (riddenByEntity != null && riddenByEntity instanceof EntityLivingBase) { + return ArmourCalculator.getTotalWeightOfWorn((EntityLivingBase) riddenByEntity, false) > 100F; + } + return false; + } + + public void updateRiderPosition() { + if (this.riddenByEntity != null) { + double d0 = Math.cos(this.rotationYaw * Math.PI / 180.0D) * 0.4D; + double d1 = Math.sin(this.rotationYaw * Math.PI / 180.0D) * 0.4D; + this.riddenByEntity.setPosition(this.posX + d0, + this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ + d1); + } + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + protected void writeEntityToNBT(NBTTagCompound nbt) { + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + protected void readEntityFromNBT(NBTTagCompound nbt) { + } + + @SideOnly(Side.CLIENT) + public float getShadowSize() { + return 0.0F; + } + + /** + * Takes in the distance the entity has fallen this tick and whether its on the + * ground to update the fall distance and deal fall damage if landing on the + * ground. Args: distanceFallenThisTick, onGround + */ + protected void updateFallState(double dist, boolean hitGound) { + int i = MathHelper.floor_double(this.posX); + int j = MathHelper.floor_double(this.posY); + int k = MathHelper.floor_double(this.posZ); + + if (hitGound) { + if (this.fallDistance > 0.0F || onGround) { + if (!this.worldObj.isRemote && !this.isDead) { + this.setDead(); + this.func_145778_a(ToolListMF.parachute, 1, 0.0F); + } + + this.fallDistance = 0.0F; + } + } else if (this.worldObj.getBlock(i, j - 1, k).getMaterial() != Material.water && dist < 0.0D) { + this.fallDistance = (float) (this.fallDistance - dist); + } + } + + /** + * Gets the damage taken from the last hit. + */ + public float getDamageTaken() { + return this.dataWatcher.getWatchableObjectFloat(19); + } + + /** + * Sets the damage taken from the last hit. + */ + public void setDamageTaken(float dam) { + this.dataWatcher.updateObject(19, Float.valueOf(dam)); + } + + /** + * Gets the time since the last hit. + */ + public int getTimeSinceHit() { + return this.dataWatcher.getWatchableObjectInt(17); + } + + /** + * Sets the time to count down from since the last time entity was hit. + */ + public void setTimeSinceHit(int time) { + this.dataWatcher.updateObject(17, Integer.valueOf(time)); + } + + /** + * Gets the forward direction of the entity. + */ + public int getForwardDirection() { + return this.dataWatcher.getWatchableObjectInt(18); + } + + /** + * Sets the forward direction of the entity. + */ + public void setForwardDirection(int dir) { + this.dataWatcher.updateObject(18, Integer.valueOf(dir)); + } + + /** + * true if no player in parachute + */ + @SideOnly(Side.CLIENT) + public void setIsParachuteEmpty(boolean flag) { + this.isParachuteEmpty = flag; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntityShrapnel.java b/src/main/java/minefantasy/mf2/entity/EntityShrapnel.java index bfb6d0b2..6b6abb0b 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityShrapnel.java +++ b/src/main/java/minefantasy/mf2/entity/EntityShrapnel.java @@ -1,7 +1,5 @@ package minefantasy.mf2.entity; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.weapon.IDamageType; @@ -16,288 +14,290 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; +import java.util.List; + public class EntityShrapnel extends Entity implements IDamageType { - private int field_145795_e = -1; - private int field_145793_f = -1; - private int field_145794_g = -1; - private Block field_145796_h; - private boolean inGround; - public EntityLivingBase shootingEntity; - private int ticksAlive; - private int ticksInAir; - public double accelerationX; - public double accelerationY; - public double accelerationZ; - - public EntityShrapnel(World world) { - super(world); - this.setSize(0.5F, 0.5F); - } - - @Override - protected void entityInit() { - } - - /** - * Checks if the entity is in range to render by using the past in distance and - * comparing it to its average edge length * 64 * renderDistanceWeight Args: - * distance - */ - @Override - @SideOnly(Side.CLIENT) - public boolean isInRangeToRenderDist(double dist) { - double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D; - d1 *= 64.0D; - return dist < d1 * d1; - } - - public EntityShrapnel(World world, double x, double y, double z, double xv, double yv, double zv) { - super(world); - this.setSize(1.0F, 1.0F); - this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); - this.setPosition(x, y, z); - double d6 = MathHelper.sqrt_double(xv * xv + yv * yv + zv * zv); - this.accelerationX = xv / d6 * 0.1D; - this.accelerationY = yv / d6 * 0.1D; - this.accelerationZ = zv / d6 * 0.1D; - } - - public EntityShrapnel(World world, EntityLivingBase shooter, double x, double y, double z) { - super(world); - this.shootingEntity = shooter; - this.setSize(1.0F, 1.0F); - this.setLocationAndAngles(shooter.posX, shooter.posY, shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); - this.setPosition(this.posX, this.posY, this.posZ); - this.yOffset = 0.0F; - this.motionX = this.motionY = this.motionZ = 0.0D; - x += this.rand.nextGaussian() * 0.4D; - y += this.rand.nextGaussian() * 0.4D; - z += this.rand.nextGaussian() * 0.4D; - double d3 = MathHelper.sqrt_double(x * x + y * y + z * z); - this.accelerationX = x / d3 * 0.1D; - this.accelerationY = y / d3 * 0.1D; - this.accelerationZ = z / d3 * 0.1D; - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() { - if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead - || !this.worldObj.blockExists((int) this.posX, (int) this.posY, (int) this.posZ))) { - this.setDead(); - } else { - super.onUpdate(); - - if (this.inGround) { - this.setDead(); - this.inGround = false; - this.motionX *= this.rand.nextFloat() * 0.2F; - this.motionY *= this.rand.nextFloat() * 0.2F; - this.motionZ *= this.rand.nextFloat() * 0.2F; - this.ticksAlive = 0; - this.ticksInAir = 0; - return; - } else { - ++this.ticksInAir; - if (ticksInAir >= 10) - setDead(); - } - - Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, - this.posZ + this.motionZ); - MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31); - vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, - this.posZ + this.motionZ); - - if (movingobjectposition != null) { - vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, - movingobjectposition.hitVec.zCoord); - } - - Entity entity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, - this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1.canBeCollidedWith() - && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) { - float f = 0.3F; - AxisAlignedBB axisalignedbb = entity1.boundingBox.expand(f, f, f); - MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31); - - if (movingobjectposition1 != null) { - double d1 = vec3.distanceTo(movingobjectposition1.hitVec); - - if (d1 < d0 || d0 == 0.0D) { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null) { - this.onImpact(movingobjectposition); - } - - this.posX += this.motionX; - this.posY += this.motionY; - this.posZ += this.motionZ; - float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.rotationYaw = (float) (Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F; - - for (this.rotationPitch = (float) (Math.atan2(f1, this.motionY) * 180.0D / Math.PI) - - 90.0F; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { - ; - } - - while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { - this.prevRotationPitch += 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw < -180.0F) { - this.prevRotationYaw -= 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { - this.prevRotationYaw += 360.0F; - } - - this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; - this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; - float f2 = this.getMotionFactor(); - - if (this.isInWater()) { - for (int j = 0; j < 4; ++j) { - float f3 = 0.25F; - this.worldObj.spawnParticle("bubble", this.posX - this.motionX * f3, this.posY - this.motionY * f3, - this.posZ - this.motionZ * f3, this.motionX, this.motionY, this.motionZ); - } - - f2 = 0.8F; - } - - this.motionX += this.accelerationX; - this.motionY += this.accelerationY; - this.motionZ += this.accelerationZ; - this.motionX *= f2; - this.motionY *= f2; - this.motionZ *= f2; - this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); - this.setPosition(this.posX, this.posY, this.posZ); - } - } - - /** - * Return the motion factor for this projectile. The factor is multiplied by the - * original motion. - */ - protected float getMotionFactor() { - return 0.95F; - } - - /** - * Called when this EntityFireball hits a block or entity. - */ - protected void onImpact(MovingObjectPosition hitPos) { - if (isBurning() && hitPos.entityHit != null) { - hitPos.entityHit.setFire(1); - } - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound p_70014_1_) { - p_70014_1_.setShort("xTile", (short) this.field_145795_e); - p_70014_1_.setShort("yTile", (short) this.field_145793_f); - p_70014_1_.setShort("zTile", (short) this.field_145794_g); - p_70014_1_.setByte("inTile", (byte) Block.getIdFromBlock(this.field_145796_h)); - p_70014_1_.setByte("inGround", (byte) (this.inGround ? 1 : 0)); - p_70014_1_.setTag("direction", - this.newDoubleNBTList(new double[] { this.motionX, this.motionY, this.motionZ })); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound p_70037_1_) { - this.field_145795_e = p_70037_1_.getShort("xTile"); - this.field_145793_f = p_70037_1_.getShort("yTile"); - this.field_145794_g = p_70037_1_.getShort("zTile"); - this.field_145796_h = Block.getBlockById(p_70037_1_.getByte("inTile") & 255); - this.inGround = p_70037_1_.getByte("inGround") == 1; - - if (p_70037_1_.hasKey("direction", 9)) { - NBTTagList nbttaglist = p_70037_1_.getTagList("direction", 6); - this.motionX = nbttaglist.func_150309_d(0); - this.motionY = nbttaglist.func_150309_d(1); - this.motionZ = nbttaglist.func_150309_d(2); - } else { - this.setDead(); - } - } - - /** - * Returns true if other Entities should be prevented from moving through this - * Entity. - */ - @Override - public boolean canBeCollidedWith() { - return true; - } - - @Override - public float getCollisionBorderSize() { - return 1.0F; - } - - @Override - @SideOnly(Side.CLIENT) - public float getShadowSize() { - return 0.0F; - } - - /** - * Gets how bright this entity is. - */ - @Override - public float getBrightness(float p_70013_1_) { - return 1.0F; - } - - @Override - @SideOnly(Side.CLIENT) - public int getBrightnessForRender(float p_70070_1_) { - return 15728880; - } - - @SideOnly(Side.CLIENT) - public String getTexture() { - return isBurning() ? "fireshrapnel" : "shrapnel"; - } - - @Override - public float[] getDamageRatio(Object... implement) { - return isBurning() ? new float[] { 0, 1, 0 } : new float[] { 0, 1, 1 };// 50/50 blunt and piercing, fire bombs - // are full blunt - } - - @Override - public float getPenetrationLevel(Object implement) { - return 0; - } + public EntityLivingBase shootingEntity; + public double accelerationX; + public double accelerationY; + public double accelerationZ; + private int field_145795_e = -1; + private int field_145793_f = -1; + private int field_145794_g = -1; + private Block field_145796_h; + private boolean inGround; + private int ticksAlive; + private int ticksInAir; + + public EntityShrapnel(World world) { + super(world); + this.setSize(0.5F, 0.5F); + } + + public EntityShrapnel(World world, double x, double y, double z, double xv, double yv, double zv) { + super(world); + this.setSize(1.0F, 1.0F); + this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); + this.setPosition(x, y, z); + double d6 = MathHelper.sqrt_double(xv * xv + yv * yv + zv * zv); + this.accelerationX = xv / d6 * 0.1D; + this.accelerationY = yv / d6 * 0.1D; + this.accelerationZ = zv / d6 * 0.1D; + } + + public EntityShrapnel(World world, EntityLivingBase shooter, double x, double y, double z) { + super(world); + this.shootingEntity = shooter; + this.setSize(1.0F, 1.0F); + this.setLocationAndAngles(shooter.posX, shooter.posY, shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = this.motionY = this.motionZ = 0.0D; + x += this.rand.nextGaussian() * 0.4D; + y += this.rand.nextGaussian() * 0.4D; + z += this.rand.nextGaussian() * 0.4D; + double d3 = MathHelper.sqrt_double(x * x + y * y + z * z); + this.accelerationX = x / d3 * 0.1D; + this.accelerationY = y / d3 * 0.1D; + this.accelerationZ = z / d3 * 0.1D; + } + + @Override + protected void entityInit() { + } + + /** + * Checks if the entity is in range to render by using the past in distance and + * comparing it to its average edge length * 64 * renderDistanceWeight Args: + * distance + */ + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double dist) { + double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D; + d1 *= 64.0D; + return dist < d1 * d1; + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead + || !this.worldObj.blockExists((int) this.posX, (int) this.posY, (int) this.posZ))) { + this.setDead(); + } else { + super.onUpdate(); + + if (this.inGround) { + this.setDead(); + this.inGround = false; + this.motionX *= this.rand.nextFloat() * 0.2F; + this.motionY *= this.rand.nextFloat() * 0.2F; + this.motionZ *= this.rand.nextFloat() * 0.2F; + this.ticksAlive = 0; + this.ticksInAir = 0; + return; + } else { + ++this.ticksInAir; + if (ticksInAir >= 10) + setDead(); + } + + Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31); + vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + + if (movingobjectposition != null) { + vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, + movingobjectposition.hitVec.zCoord); + } + + Entity entity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, + this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double d0 = 0.0D; + + for (int i = 0; i < list.size(); ++i) { + Entity entity1 = (Entity) list.get(i); + + if (entity1.canBeCollidedWith() + && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) { + float f = 0.3F; + AxisAlignedBB axisalignedbb = entity1.boundingBox.expand(f, f, f); + MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31); + + if (movingobjectposition1 != null) { + double d1 = vec3.distanceTo(movingobjectposition1.hitVec); + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; + d0 = d1; + } + } + } + } + + if (entity != null) { + movingobjectposition = new MovingObjectPosition(entity); + } + + if (movingobjectposition != null) { + this.onImpact(movingobjectposition); + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float) (Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F; + + for (this.rotationPitch = (float) (Math.atan2(f1, this.motionY) * 180.0D / Math.PI) + - 90.0F; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + ; + } + + while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float f2 = this.getMotionFactor(); + + if (this.isInWater()) { + for (int j = 0; j < 4; ++j) { + float f3 = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * f3, this.posY - this.motionY * f3, + this.posZ - this.motionZ * f3, this.motionX, this.motionY, this.motionZ); + } + + f2 = 0.8F; + } + + this.motionX += this.accelerationX; + this.motionY += this.accelerationY; + this.motionZ += this.accelerationZ; + this.motionX *= f2; + this.motionY *= f2; + this.motionZ *= f2; + this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); + this.setPosition(this.posX, this.posY, this.posZ); + } + } + + /** + * Return the motion factor for this projectile. The factor is multiplied by the + * original motion. + */ + protected float getMotionFactor() { + return 0.95F; + } + + /** + * Called when this EntityFireball hits a block or entity. + */ + protected void onImpact(MovingObjectPosition hitPos) { + if (isBurning() && hitPos.entityHit != null) { + hitPos.entityHit.setFire(1); + } + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + public void writeEntityToNBT(NBTTagCompound p_70014_1_) { + p_70014_1_.setShort("xTile", (short) this.field_145795_e); + p_70014_1_.setShort("yTile", (short) this.field_145793_f); + p_70014_1_.setShort("zTile", (short) this.field_145794_g); + p_70014_1_.setByte("inTile", (byte) Block.getIdFromBlock(this.field_145796_h)); + p_70014_1_.setByte("inGround", (byte) (this.inGround ? 1 : 0)); + p_70014_1_.setTag("direction", + this.newDoubleNBTList(new double[]{this.motionX, this.motionY, this.motionZ})); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + public void readEntityFromNBT(NBTTagCompound p_70037_1_) { + this.field_145795_e = p_70037_1_.getShort("xTile"); + this.field_145793_f = p_70037_1_.getShort("yTile"); + this.field_145794_g = p_70037_1_.getShort("zTile"); + this.field_145796_h = Block.getBlockById(p_70037_1_.getByte("inTile") & 255); + this.inGround = p_70037_1_.getByte("inGround") == 1; + + if (p_70037_1_.hasKey("direction", 9)) { + NBTTagList nbttaglist = p_70037_1_.getTagList("direction", 6); + this.motionX = nbttaglist.func_150309_d(0); + this.motionY = nbttaglist.func_150309_d(1); + this.motionZ = nbttaglist.func_150309_d(2); + } else { + this.setDead(); + } + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public float getCollisionBorderSize() { + return 1.0F; + } + + @Override + @SideOnly(Side.CLIENT) + public float getShadowSize() { + return 0.0F; + } + + /** + * Gets how bright this entity is. + */ + @Override + public float getBrightness(float p_70013_1_) { + return 1.0F; + } + + @Override + @SideOnly(Side.CLIENT) + public int getBrightnessForRender(float p_70070_1_) { + return 15728880; + } + + @SideOnly(Side.CLIENT) + public String getTexture() { + return isBurning() ? "fireshrapnel" : "shrapnel"; + } + + @Override + public float[] getDamageRatio(Object... implement) { + return isBurning() ? new float[]{0, 1, 0} : new float[]{0, 1, 1};// 50/50 blunt and piercing, fire bombs + // are full blunt + } + + @Override + public float getPenetrationLevel(Object implement) { + return 0; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/EntitySmoke.java b/src/main/java/minefantasy/mf2/entity/EntitySmoke.java index 70081b78..3b8e0687 100644 --- a/src/main/java/minefantasy/mf2/entity/EntitySmoke.java +++ b/src/main/java/minefantasy/mf2/entity/EntitySmoke.java @@ -1,8 +1,5 @@ package minefantasy.mf2.entity; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.armour.IGasProtector; @@ -16,304 +13,303 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.*; import net.minecraft.util.MovingObjectPosition.MovingObjectType; -import net.minecraft.util.Vec3; import net.minecraft.world.World; +import java.util.List; +import java.util.Random; + public class EntitySmoke extends Entity { - private int field_145795_e = -1; - private int field_145793_f = -1; - private int field_145794_g = -1; - private Block field_145796_h; - private boolean inGround; - public EntityLivingBase shootingEntity; - private int ticksAlive; - private int ticksInAir; - public double accelerationX; - public double accelerationY; - public double accelerationZ; - - public EntitySmoke(World world) { - super(world); - this.setSize(0.2F, 0.2F); - } - - @Override - protected boolean canTriggerWalking() { - return false; - } - - @Override - public boolean canAttackWithItem() { - return false; - } - - protected void entityInit() { - } - - /** - * Checks if the entity is in range to render by using the past in distance and - * comparing it to its average edge length * 64 * renderDistanceWeight Args: - * distance - */ - @SideOnly(Side.CLIENT) - public boolean isInRangeToRenderDist(double dist) { - double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D; - d1 *= 64.0D; - return dist < d1 * d1; - } - - public EntitySmoke(World world, double x, double y, double z, double xv, double yv, double zv) { - super(world); - noClip = false; - this.setSize(0.5F, 0.5F); - this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); - this.setPosition(x, y, z); - double d6 = MathHelper.sqrt_double(xv * xv + yv * yv + zv * zv); - this.accelerationX = xv / d6 * 0.1D; - this.accelerationY = yv / d6 * 0.1D; - this.accelerationZ = zv / d6 * 0.1D; - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() { - if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead - || !this.worldObj.blockExists((int) this.posX, (int) this.posY, (int) this.posZ))) { - this.setDead(); - } else { - super.onUpdate(); - - if (this.inGround) { - if (this.worldObj.getBlock(this.field_145795_e, this.field_145793_f, - this.field_145794_g) == this.field_145796_h) { - ++this.ticksAlive; - - if (this.ticksAlive == 600) { - this.setDead(); - } - - return; - } - - this.inGround = false; - this.motionX *= this.rand.nextFloat() * 0.2F; - this.motionY *= this.rand.nextFloat() * 0.2F; - this.motionZ *= this.rand.nextFloat() * 0.2F; - this.ticksAlive = 0; - this.ticksInAir = 0; - } else { - ++this.ticksInAir; - } - - Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, - this.posZ + this.motionZ); - MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31); - vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, - this.posZ + this.motionZ); - - if (movingobjectposition != null) { - vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, - movingobjectposition.hitVec.zCoord); - } - - Entity entity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, - this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1.canBeCollidedWith() - && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) { - float f = 0.3F; - AxisAlignedBB axisalignedbb = entity1.boundingBox.expand(f, f, f); - MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31); - - if (movingobjectposition1 != null) { - double d1 = vec3.distanceTo(movingobjectposition1.hitVec); - - if (d1 < d0 || d0 == 0.0D) { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null) { - this.onImpact(movingobjectposition); - } - - this.posX += this.motionX; - this.posY += this.motionY; - this.posZ += this.motionZ; - float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.rotationYaw = (float) (Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F; - - for (this.rotationPitch = (float) (Math.atan2(f1, this.motionY) * 180.0D / Math.PI) - - 90.0F; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { - ; - } - - while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { - this.prevRotationPitch += 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw < -180.0F) { - this.prevRotationYaw -= 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { - this.prevRotationYaw += 360.0F; - } - - this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; - this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; - float f2 = this.getMotionFactor(); - - if (this.isInWater()) { - f2 = 0.8F; - } - - double floating = 0.01F; - this.motionX += this.accelerationX; - this.motionY += this.accelerationY + floating; - this.motionZ += this.accelerationZ; - - double slowdownRate = 0.5F; - this.accelerationX *= slowdownRate; - this.accelerationY *= slowdownRate; - this.accelerationZ *= slowdownRate; - - this.motionX *= f2; - this.motionY *= f2; - this.motionZ *= f2; - this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); - this.setPosition(this.posX, this.posY, this.posZ); - } - } - - /** - * Return the motion factor for this projectile. The factor is multiplied by the - * original motion. - */ - protected float getMotionFactor() { - return 0.95F; - } - - /** - * Called when this EntityFireball hits a block or entity. - */ - protected void onImpact(MovingObjectPosition pos) { - if (!this.worldObj.isRemote) { - if (pos.entityHit != null) { - if (pos.entityHit instanceof EntityLivingBase && !worldObj.isRemote) { - EntityLivingBase hit = (EntityLivingBase) pos.entityHit; - - if (canPoison(hit, rand)) { - hit.addPotionEffect(new PotionEffect(Potion.hunger.id, 20, 0)); - if (rand.nextInt(20) == 0) { - if (hit.getActivePotionEffect(Potion.blindness) != null) { - hit.addPotionEffect(new PotionEffect(Potion.wither.id, 200, 0)); - } else if (hit.getActivePotionEffect(Potion.confusion) != null) { - hit.addPotionEffect(new PotionEffect(Potion.blindness.id, 200, 0)); - } else { - hit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 0)); - } - } - } - } - } - if (pos.typeOfHit == MovingObjectType.BLOCK) { - setDead(); - } - } - } - - public static boolean canPoison(Entity hit, Random rand) { - if (!(hit instanceof EntityLivingBase)) - return false; - - ItemStack helmet = ((EntityLivingBase) hit).getEquipmentInSlot(4); - if (helmet != null && helmet.getItem() instanceof IGasProtector) { - float prot = ((IGasProtector) helmet.getItem()).getGasProtection(helmet); - if (prot >= 100F || rand.nextFloat() * 100 < prot) { - return false; - } - } - if (PowerArmour.isWearingCogwork((EntityLivingBase) hit)) { - return false; - } - return ((EntityLivingBase) hit).getCreatureAttribute() != EnumCreatureAttribute.UNDEAD; - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - public void writeEntityToNBT(NBTTagCompound nbt) { - nbt.setShort("xTile", (short) this.field_145795_e); - nbt.setShort("yTile", (short) this.field_145793_f); - nbt.setShort("zTile", (short) this.field_145794_g); - nbt.setByte("inTile", (byte) Block.getIdFromBlock(this.field_145796_h)); - nbt.setByte("inGround", (byte) (this.inGround ? 1 : 0)); - nbt.setTag("direction", this.newDoubleNBTList(new double[] { this.motionX, this.motionY, this.motionZ })); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - public void readEntityFromNBT(NBTTagCompound nbt) { - this.field_145795_e = nbt.getShort("xTile"); - this.field_145793_f = nbt.getShort("yTile"); - this.field_145794_g = nbt.getShort("zTile"); - this.field_145796_h = Block.getBlockById(nbt.getByte("inTile") & 255); - this.inGround = nbt.getByte("inGround") == 1; - - if (nbt.hasKey("direction", 9)) { - NBTTagList nbttaglist = nbt.getTagList("direction", 6); - this.motionX = nbttaglist.func_150309_d(0); - this.motionY = nbttaglist.func_150309_d(1); - this.motionZ = nbttaglist.func_150309_d(2); - } else { - this.setDead(); - } - } - - /** - * Returns true if other Entities should be prevented from moving through this - * Entity. - */ - @Override - public boolean canBeCollidedWith() { - return false; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource source, float amount) { - return false; - } - - @SideOnly(Side.CLIENT) - public float getShadowSize() { - return 1.0F; - } - - @Override - public void setFire(int i) { - } + public EntityLivingBase shootingEntity; + public double accelerationX; + public double accelerationY; + public double accelerationZ; + private int field_145795_e = -1; + private int field_145793_f = -1; + private int field_145794_g = -1; + private Block field_145796_h; + private boolean inGround; + private int ticksAlive; + private int ticksInAir; + + public EntitySmoke(World world) { + super(world); + this.setSize(0.2F, 0.2F); + } + + public EntitySmoke(World world, double x, double y, double z, double xv, double yv, double zv) { + super(world); + noClip = false; + this.setSize(0.5F, 0.5F); + this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); + this.setPosition(x, y, z); + double d6 = MathHelper.sqrt_double(xv * xv + yv * yv + zv * zv); + this.accelerationX = xv / d6 * 0.1D; + this.accelerationY = yv / d6 * 0.1D; + this.accelerationZ = zv / d6 * 0.1D; + } + + public static boolean canPoison(Entity hit, Random rand) { + if (!(hit instanceof EntityLivingBase)) + return false; + + ItemStack helmet = ((EntityLivingBase) hit).getEquipmentInSlot(4); + if (helmet != null && helmet.getItem() instanceof IGasProtector) { + float prot = ((IGasProtector) helmet.getItem()).getGasProtection(helmet); + if (prot >= 100F || rand.nextFloat() * 100 < prot) { + return false; + } + } + if (PowerArmour.isWearingCogwork((EntityLivingBase) hit)) { + return false; + } + return ((EntityLivingBase) hit).getCreatureAttribute() != EnumCreatureAttribute.UNDEAD; + } + + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + public boolean canAttackWithItem() { + return false; + } + + protected void entityInit() { + } + + /** + * Checks if the entity is in range to render by using the past in distance and + * comparing it to its average edge length * 64 * renderDistanceWeight Args: + * distance + */ + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double dist) { + double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D; + d1 *= 64.0D; + return dist < d1 * d1; + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() { + if (!this.worldObj.isRemote && (this.shootingEntity != null && this.shootingEntity.isDead + || !this.worldObj.blockExists((int) this.posX, (int) this.posY, (int) this.posZ))) { + this.setDead(); + } else { + super.onUpdate(); + + if (this.inGround) { + if (this.worldObj.getBlock(this.field_145795_e, this.field_145793_f, + this.field_145794_g) == this.field_145796_h) { + ++this.ticksAlive; + + if (this.ticksAlive == 600) { + this.setDead(); + } + + return; + } + + this.inGround = false; + this.motionX *= this.rand.nextFloat() * 0.2F; + this.motionY *= this.rand.nextFloat() * 0.2F; + this.motionZ *= this.rand.nextFloat() * 0.2F; + this.ticksAlive = 0; + this.ticksInAir = 0; + } else { + ++this.ticksInAir; + } + + Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31); + vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, + this.posZ + this.motionZ); + + if (movingobjectposition != null) { + vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, + movingobjectposition.hitVec.zCoord); + } + + Entity entity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, + this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double d0 = 0.0D; + + for (int i = 0; i < list.size(); ++i) { + Entity entity1 = (Entity) list.get(i); + + if (entity1.canBeCollidedWith() + && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) { + float f = 0.3F; + AxisAlignedBB axisalignedbb = entity1.boundingBox.expand(f, f, f); + MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31); + + if (movingobjectposition1 != null) { + double d1 = vec3.distanceTo(movingobjectposition1.hitVec); + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; + d0 = d1; + } + } + } + } + + if (entity != null) { + movingobjectposition = new MovingObjectPosition(entity); + } + + if (movingobjectposition != null) { + this.onImpact(movingobjectposition); + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float) (Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F; + + for (this.rotationPitch = (float) (Math.atan2(f1, this.motionY) * 180.0D / Math.PI) + - 90.0F; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + ; + } + + while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float f2 = this.getMotionFactor(); + + if (this.isInWater()) { + f2 = 0.8F; + } + + double floating = 0.01F; + this.motionX += this.accelerationX; + this.motionY += this.accelerationY + floating; + this.motionZ += this.accelerationZ; + + double slowdownRate = 0.5F; + this.accelerationX *= slowdownRate; + this.accelerationY *= slowdownRate; + this.accelerationZ *= slowdownRate; + + this.motionX *= f2; + this.motionY *= f2; + this.motionZ *= f2; + this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); + this.setPosition(this.posX, this.posY, this.posZ); + } + } + + /** + * Return the motion factor for this projectile. The factor is multiplied by the + * original motion. + */ + protected float getMotionFactor() { + return 0.95F; + } + + /** + * Called when this EntityFireball hits a block or entity. + */ + protected void onImpact(MovingObjectPosition pos) { + if (!this.worldObj.isRemote) { + if (pos.entityHit != null) { + if (pos.entityHit instanceof EntityLivingBase && !worldObj.isRemote) { + EntityLivingBase hit = (EntityLivingBase) pos.entityHit; + + if (canPoison(hit, rand)) { + hit.addPotionEffect(new PotionEffect(Potion.hunger.id, 20, 0)); + if (rand.nextInt(20) == 0) { + if (hit.getActivePotionEffect(Potion.blindness) != null) { + hit.addPotionEffect(new PotionEffect(Potion.wither.id, 200, 0)); + } else if (hit.getActivePotionEffect(Potion.confusion) != null) { + hit.addPotionEffect(new PotionEffect(Potion.blindness.id, 200, 0)); + } else { + hit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 0)); + } + } + } + } + } + if (pos.typeOfHit == MovingObjectType.BLOCK) { + setDead(); + } + } + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setShort("xTile", (short) this.field_145795_e); + nbt.setShort("yTile", (short) this.field_145793_f); + nbt.setShort("zTile", (short) this.field_145794_g); + nbt.setByte("inTile", (byte) Block.getIdFromBlock(this.field_145796_h)); + nbt.setByte("inGround", (byte) (this.inGround ? 1 : 0)); + nbt.setTag("direction", this.newDoubleNBTList(new double[]{this.motionX, this.motionY, this.motionZ})); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound nbt) { + this.field_145795_e = nbt.getShort("xTile"); + this.field_145793_f = nbt.getShort("yTile"); + this.field_145794_g = nbt.getShort("zTile"); + this.field_145796_h = Block.getBlockById(nbt.getByte("inTile") & 255); + this.inGround = nbt.getByte("inGround") == 1; + + if (nbt.hasKey("direction", 9)) { + NBTTagList nbttaglist = nbt.getTagList("direction", 6); + this.motionX = nbttaglist.func_150309_d(0); + this.motionY = nbttaglist.func_150309_d(1); + this.motionZ = nbttaglist.func_150309_d(2); + } else { + this.setDead(); + } + } + + /** + * Returns true if other Entities should be prevented from moving through this + * Entity. + */ + @Override + public boolean canBeCollidedWith() { + return false; + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource source, float amount) { + return false; + } + + @SideOnly(Side.CLIENT) + public float getShadowSize() { + return 1.0F; + } + + @Override + public void setFire(int i) { + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/Shockwave.java b/src/main/java/minefantasy/mf2/entity/Shockwave.java index 30c16f51..39448da7 100644 --- a/src/main/java/minefantasy/mf2/entity/Shockwave.java +++ b/src/main/java/minefantasy/mf2/entity/Shockwave.java @@ -1,13 +1,5 @@ package minefantasy.mf2.entity; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.enchantment.EnchantmentProtection; @@ -15,224 +7,228 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; +import net.minecraft.util.*; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; +import java.util.*; + public class Shockwave {// Explosion - /** whether or not the explosion sets fire to blocks around it */ - public boolean isFlaming; - /** whether or not this explosion spawns smoke particles */ - public boolean isSmoking = true; - public boolean isGriefing = true; - private int maxRange = 16; - private Random explosionRNG = new Random(); - private World worldObj; - public double explosionX; - public double explosionY; - public double explosionZ; - public Entity exploder; - public float explosionSize; - /** A list of ChunkPositions of blocks affected by this explosion */ - public List affectedBlockPositions = new ArrayList(); - private Map field_77288_k = new HashMap(); - private String type; - - public Shockwave(String type, World world, Entity cause, double x, double y, double z, float power) { - this.worldObj = world; - this.exploder = cause; - this.explosionSize = power; - this.explosionX = x; - this.explosionY = y; - this.explosionZ = z; - this.type = type; - } - - /** - * Does the first part of the explosion (destroy blocks) - */ - public void initiate() { - float f = this.explosionSize; - HashSet hashset = new HashSet(); - int i; - int j; - int k; - double d5; - double d6; - double d7; - - for (i = 0; i < this.maxRange; ++i) { - for (j = 0; j < this.maxRange; ++j) { - for (k = 0; k < this.maxRange; ++k) { - if (i == 0 || i == this.maxRange - 1 || j == 0 || j == this.maxRange - 1 || k == 0 - || k == this.maxRange - 1) { - double d0 = i / (this.maxRange - 1.0F) * 2.0F - 1.0F; - double d1 = j / (this.maxRange - 1.0F) * 2.0F - 1.0F; - double d2 = k / (this.maxRange - 1.0F) * 2.0F - 1.0F; - double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - d0 /= d3; - d1 /= d3; - d2 /= d3; - float f1 = this.explosionSize * (0.7F + this.worldObj.rand.nextFloat() * 0.6F); - d5 = this.explosionX; - d6 = this.explosionY; - d7 = this.explosionZ; - - for (float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) { - int j1 = MathHelper.floor_double(d5); - int k1 = MathHelper.floor_double(d6); - int l1 = MathHelper.floor_double(d7); - Block block = this.worldObj.getBlock(j1, k1, l1); - - if (block.getMaterial() == Material.glass) { - hashset.add(new ChunkPosition(j1, k1, l1)); - } - - d5 += d0 * f2; - d6 += d1 * f2; - d7 += d2 * f2; - } - } - } - } - } - - this.affectedBlockPositions.addAll(hashset); - this.explosionSize *= 2.0F; - i = MathHelper.floor_double(this.explosionX - this.explosionSize - 1.0D); - j = MathHelper.floor_double(this.explosionX + this.explosionSize + 1.0D); - k = MathHelper.floor_double(this.explosionY - this.explosionSize - 1.0D); - int i2 = MathHelper.floor_double(this.explosionY + this.explosionSize + 1.0D); - int l = MathHelper.floor_double(this.explosionZ - this.explosionSize - 1.0D); - int j2 = MathHelper.floor_double(this.explosionZ + this.explosionSize + 1.0D); - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.exploder, - AxisAlignedBB.getBoundingBox(i, k, l, j, i2, j2)); - Vec3 vec3 = Vec3.createVectorHelper(this.explosionX, this.explosionY, this.explosionZ); - - for (int i1 = 0; i1 < list.size(); ++i1) { - Entity entity = (Entity) list.get(i1); - double d4 = entity.getDistance(this.explosionX, this.explosionY, this.explosionZ) / this.explosionSize; - - if (d4 <= 1.0D && !(entity instanceof EntityItem)) { - d5 = entity.posX - this.explosionX; - d6 = entity.posY + entity.getEyeHeight() - this.explosionY; - d7 = entity.posZ - this.explosionZ; - double d9 = MathHelper.sqrt_double(d5 * d5 + d6 * d6 + d7 * d7); - - if (d9 != 0.0D) { - d5 /= d9; - d6 /= d9; - d7 /= d9; - double d10 = this.worldObj.getBlockDensity(vec3, entity.boundingBox); - double d11 = (1.0D - d4) * d10; - float damage = ((int) ((d11 * d11 + d11) / 2.0D * 8.0D * this.explosionSize + 1.0D)); - entity.attackEntityFrom(getExplosionSource(), Math.min(64F, 4F + (damage / 2F))); - double d8 = EnchantmentProtection.func_92092_a(entity, d11); - entity.motionX += d5 * d8; - entity.motionY += d6 * d8; - entity.motionZ += d7 * d8; - - if (entity instanceof EntityPlayer) { - this.field_77288_k.put(entity, Vec3.createVectorHelper(d5 * d11, d6 * d11, d7 * d11)); - } - } - } - } - - this.explosionSize = f; - } - - /** - * Does the second part of the explosion (sound, particles, drop spawn) - */ - public void decorateWave(boolean flag) { - this.worldObj.playSoundEffect(this.explosionX, this.explosionY, this.explosionZ, "random.explode", 4.0F, - (1.0F + (this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F) * 0.7F); - - if (this.explosionSize >= 2.0F && this.isSmoking) { - this.worldObj.spawnParticle("largesmoke", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, - 0.0D); - } else { - this.worldObj.spawnParticle("smoke", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D); - } - - Iterator iterator; - ChunkPosition chunkposition; - int i; - int j; - int k; - Block block; - - if (this.isSmoking) { - iterator = this.affectedBlockPositions.iterator(); - - while (iterator.hasNext()) { - chunkposition = (ChunkPosition) iterator.next(); - i = chunkposition.chunkPosX; - j = chunkposition.chunkPosY; - k = chunkposition.chunkPosZ; - block = this.worldObj.getBlock(i, j, k); - - if (flag) { - double d0 = i + this.worldObj.rand.nextFloat(); - double d1 = j + this.worldObj.rand.nextFloat(); - double d2 = k + this.worldObj.rand.nextFloat(); - double d3 = d0 - this.explosionX; - double d4 = d1 - this.explosionY; - double d5 = d2 - this.explosionZ; - double d6 = MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5); - d3 /= d6; - d4 /= d6; - d5 /= d6; - double d7 = 0.5D / (d6 / this.explosionSize + 0.1D); - d7 *= this.worldObj.rand.nextFloat() * this.worldObj.rand.nextFloat() + 0.3F; - d3 *= d7; - d4 *= d7; - d5 *= d7; - this.worldObj.spawnParticle("explode", (d0 + this.explosionX * 1.0D) / 2.0D, - (d1 + this.explosionY * 1.0D) / 2.0D, (d2 + this.explosionZ * 1.0D) / 2.0D, d3, d4, d5); - this.worldObj.spawnParticle("smoke", d0, d1, d2, d3, d4, d5); - } - - if (isGriefing && block.getMaterial() == Material.glass) { - this.worldObj.setBlockToAir(i, j, k); - this.worldObj.playSoundEffect(i, j, k, "break.glass", 1.0F, - 0.75F + (explosionRNG.nextFloat() * 0.5F)); - } - } - } - - if (this.isFlaming) { - iterator = this.affectedBlockPositions.iterator(); - - while (iterator.hasNext()) { - chunkposition = (ChunkPosition) iterator.next(); - i = chunkposition.chunkPosX; - j = chunkposition.chunkPosY; - k = chunkposition.chunkPosZ; - block = this.worldObj.getBlock(i, j, k); - Block block1 = this.worldObj.getBlock(i, j - 1, k); - - if (block.getMaterial() == Material.air && block1.func_149730_j() - && this.explosionRNG.nextInt(3) == 0) { - this.worldObj.setBlock(i, j, k, Blocks.fire); - } - } - } - } - - public Map func_77277_b() { - return this.field_77288_k; - } - - public DamageSource getExplosionSource() { - if (exploder != null) { - return new EntityDamageSource(type, exploder).setExplosion(); - } - return new DamageSource(type).setExplosion(); - } + /** + * whether or not the explosion sets fire to blocks around it + */ + public boolean isFlaming; + /** + * whether or not this explosion spawns smoke particles + */ + public boolean isSmoking = true; + public boolean isGriefing = true; + public double explosionX; + public double explosionY; + public double explosionZ; + public Entity exploder; + public float explosionSize; + /** + * A list of ChunkPositions of blocks affected by this explosion + */ + public List affectedBlockPositions = new ArrayList(); + private int maxRange = 16; + private Random explosionRNG = new Random(); + private World worldObj; + private Map field_77288_k = new HashMap(); + private String type; + + public Shockwave(String type, World world, Entity cause, double x, double y, double z, float power) { + this.worldObj = world; + this.exploder = cause; + this.explosionSize = power; + this.explosionX = x; + this.explosionY = y; + this.explosionZ = z; + this.type = type; + } + + /** + * Does the first part of the explosion (destroy blocks) + */ + public void initiate() { + float f = this.explosionSize; + HashSet hashset = new HashSet(); + int i; + int j; + int k; + double d5; + double d6; + double d7; + + for (i = 0; i < this.maxRange; ++i) { + for (j = 0; j < this.maxRange; ++j) { + for (k = 0; k < this.maxRange; ++k) { + if (i == 0 || i == this.maxRange - 1 || j == 0 || j == this.maxRange - 1 || k == 0 + || k == this.maxRange - 1) { + double d0 = i / (this.maxRange - 1.0F) * 2.0F - 1.0F; + double d1 = j / (this.maxRange - 1.0F) * 2.0F - 1.0F; + double d2 = k / (this.maxRange - 1.0F) * 2.0F - 1.0F; + double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2); + d0 /= d3; + d1 /= d3; + d2 /= d3; + float f1 = this.explosionSize * (0.7F + this.worldObj.rand.nextFloat() * 0.6F); + d5 = this.explosionX; + d6 = this.explosionY; + d7 = this.explosionZ; + + for (float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) { + int j1 = MathHelper.floor_double(d5); + int k1 = MathHelper.floor_double(d6); + int l1 = MathHelper.floor_double(d7); + Block block = this.worldObj.getBlock(j1, k1, l1); + + if (block.getMaterial() == Material.glass) { + hashset.add(new ChunkPosition(j1, k1, l1)); + } + + d5 += d0 * f2; + d6 += d1 * f2; + d7 += d2 * f2; + } + } + } + } + } + + this.affectedBlockPositions.addAll(hashset); + this.explosionSize *= 2.0F; + i = MathHelper.floor_double(this.explosionX - this.explosionSize - 1.0D); + j = MathHelper.floor_double(this.explosionX + this.explosionSize + 1.0D); + k = MathHelper.floor_double(this.explosionY - this.explosionSize - 1.0D); + int i2 = MathHelper.floor_double(this.explosionY + this.explosionSize + 1.0D); + int l = MathHelper.floor_double(this.explosionZ - this.explosionSize - 1.0D); + int j2 = MathHelper.floor_double(this.explosionZ + this.explosionSize + 1.0D); + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.exploder, + AxisAlignedBB.getBoundingBox(i, k, l, j, i2, j2)); + Vec3 vec3 = Vec3.createVectorHelper(this.explosionX, this.explosionY, this.explosionZ); + + for (int i1 = 0; i1 < list.size(); ++i1) { + Entity entity = (Entity) list.get(i1); + double d4 = entity.getDistance(this.explosionX, this.explosionY, this.explosionZ) / this.explosionSize; + + if (d4 <= 1.0D && !(entity instanceof EntityItem)) { + d5 = entity.posX - this.explosionX; + d6 = entity.posY + entity.getEyeHeight() - this.explosionY; + d7 = entity.posZ - this.explosionZ; + double d9 = MathHelper.sqrt_double(d5 * d5 + d6 * d6 + d7 * d7); + + if (d9 != 0.0D) { + d5 /= d9; + d6 /= d9; + d7 /= d9; + double d10 = this.worldObj.getBlockDensity(vec3, entity.boundingBox); + double d11 = (1.0D - d4) * d10; + float damage = ((int) ((d11 * d11 + d11) / 2.0D * 8.0D * this.explosionSize + 1.0D)); + entity.attackEntityFrom(getExplosionSource(), Math.min(64F, 4F + (damage / 2F))); + double d8 = EnchantmentProtection.func_92092_a(entity, d11); + entity.motionX += d5 * d8; + entity.motionY += d6 * d8; + entity.motionZ += d7 * d8; + + if (entity instanceof EntityPlayer) { + this.field_77288_k.put(entity, Vec3.createVectorHelper(d5 * d11, d6 * d11, d7 * d11)); + } + } + } + } + + this.explosionSize = f; + } + + /** + * Does the second part of the explosion (sound, particles, drop spawn) + */ + public void decorateWave(boolean flag) { + this.worldObj.playSoundEffect(this.explosionX, this.explosionY, this.explosionZ, "random.explode", 4.0F, + (1.0F + (this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F) * 0.7F); + + if (this.explosionSize >= 2.0F && this.isSmoking) { + this.worldObj.spawnParticle("largesmoke", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, + 0.0D); + } else { + this.worldObj.spawnParticle("smoke", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D); + } + + Iterator iterator; + ChunkPosition chunkposition; + int i; + int j; + int k; + Block block; + + if (this.isSmoking) { + iterator = this.affectedBlockPositions.iterator(); + + while (iterator.hasNext()) { + chunkposition = (ChunkPosition) iterator.next(); + i = chunkposition.chunkPosX; + j = chunkposition.chunkPosY; + k = chunkposition.chunkPosZ; + block = this.worldObj.getBlock(i, j, k); + + if (flag) { + double d0 = i + this.worldObj.rand.nextFloat(); + double d1 = j + this.worldObj.rand.nextFloat(); + double d2 = k + this.worldObj.rand.nextFloat(); + double d3 = d0 - this.explosionX; + double d4 = d1 - this.explosionY; + double d5 = d2 - this.explosionZ; + double d6 = MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5); + d3 /= d6; + d4 /= d6; + d5 /= d6; + double d7 = 0.5D / (d6 / this.explosionSize + 0.1D); + d7 *= this.worldObj.rand.nextFloat() * this.worldObj.rand.nextFloat() + 0.3F; + d3 *= d7; + d4 *= d7; + d5 *= d7; + this.worldObj.spawnParticle("explode", (d0 + this.explosionX * 1.0D) / 2.0D, + (d1 + this.explosionY * 1.0D) / 2.0D, (d2 + this.explosionZ * 1.0D) / 2.0D, d3, d4, d5); + this.worldObj.spawnParticle("smoke", d0, d1, d2, d3, d4, d5); + } + + if (isGriefing && block.getMaterial() == Material.glass) { + this.worldObj.setBlockToAir(i, j, k); + this.worldObj.playSoundEffect(i, j, k, "break.glass", 1.0F, + 0.75F + (explosionRNG.nextFloat() * 0.5F)); + } + } + } + + if (this.isFlaming) { + iterator = this.affectedBlockPositions.iterator(); + + while (iterator.hasNext()) { + chunkposition = (ChunkPosition) iterator.next(); + i = chunkposition.chunkPosX; + j = chunkposition.chunkPosY; + k = chunkposition.chunkPosZ; + block = this.worldObj.getBlock(i, j, k); + Block block1 = this.worldObj.getBlock(i, j - 1, k); + + if (block.getMaterial() == Material.air && block1.func_149730_j() + && this.explosionRNG.nextInt(3) == 0) { + this.worldObj.setBlock(i, j, k, Blocks.fire); + } + } + } + } + + public Map func_77277_b() { + return this.field_77288_k; + } + + public DamageSource getExplosionSource() { + if (exploder != null) { + return new EntityDamageSource(type, exploder).setExplosion(); + } + return new DamageSource(type).setExplosion(); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/list/EntityListMF.java b/src/main/java/minefantasy/mf2/entity/list/EntityListMF.java index b86335b7..58dee519 100644 --- a/src/main/java/minefantasy/mf2/entity/list/EntityListMF.java +++ b/src/main/java/minefantasy/mf2/entity/list/EntityListMF.java @@ -3,48 +3,40 @@ import cpw.mods.fml.common.registry.EntityRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.config.ConfigExperiment; -import minefantasy.mf2.entity.EntityArrowMF; -import minefantasy.mf2.entity.EntityBomb; -import minefantasy.mf2.entity.EntityDragonBreath; -import minefantasy.mf2.entity.EntityFireBlast; -import minefantasy.mf2.entity.EntityItemUnbreakable; -import minefantasy.mf2.entity.EntityMine; -import minefantasy.mf2.entity.EntityParachute; -import minefantasy.mf2.entity.EntityShrapnel; -import minefantasy.mf2.entity.EntitySmoke; +import minefantasy.mf2.entity.*; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; public class EntityListMF { - public static void register() { - addEntity(EntityArrowMF.class, "arrowMF", 1, 16, ConfigExperiment.dynamicArrows ? 1 : 20); - addEntity(EntityBomb.class, "bombMF", 2, 16, ConfigExperiment.dynamicArrows ? 1 : 20); - addEntity(EntityShrapnel.class, "shrapnel_mf", 3, 16, ConfigExperiment.dynamicArrows ? 1 : 20); - addEntity(EntityFireBlast.class, "fire_blast", 4, 16, ConfigExperiment.dynamicArrows ? 2 : 20); - addEntity(EntitySmoke.class, "smoke_mf", 5, 16, ConfigExperiment.dynamicArrows ? 2 : 20); - addEntity(EntityItemUnbreakable.class, "special_eitem_mf", 6, 16, ConfigExperiment.dynamicArrows ? 2 : 20); + public static void register() { + addEntity(EntityArrowMF.class, "arrowMF", 1, 16, ConfigExperiment.dynamicArrows ? 1 : 20); + addEntity(EntityBomb.class, "bombMF", 2, 16, ConfigExperiment.dynamicArrows ? 1 : 20); + addEntity(EntityShrapnel.class, "shrapnel_mf", 3, 16, ConfigExperiment.dynamicArrows ? 1 : 20); + addEntity(EntityFireBlast.class, "fire_blast", 4, 16, ConfigExperiment.dynamicArrows ? 2 : 20); + addEntity(EntitySmoke.class, "smoke_mf", 5, 16, ConfigExperiment.dynamicArrows ? 2 : 20); + addEntity(EntityItemUnbreakable.class, "special_eitem_mf", 6, 16, ConfigExperiment.dynamicArrows ? 2 : 20); - addEntity(EntityMine.class, "landmineMF", 7, 16, 10); - addEntity(EntityParachute.class, "parachute_mf", 8, 16, 20); + addEntity(EntityMine.class, "landmineMF", 7, 16, 10); + addEntity(EntityParachute.class, "parachute_mf", 8, 16, 20); - addEntity(EntityDragonBreath.class, "dragonbreath", 9, 16, ConfigExperiment.dynamicArrows ? 2 : 20); + addEntity(EntityDragonBreath.class, "dragonbreath", 9, 16, ConfigExperiment.dynamicArrows ? 2 : 20); - MobListMF.register(); - } + MobListMF.register(); + } - public static int autoAssign() { - for (int a = 0; a <= 255; a++) { - if (!EntityList.IDtoClassMapping.containsKey(Integer.valueOf(a))) { - System.out.println("MineFantasy: Autoassigned EntityID " + a); - return a; - } - } - throw new IllegalArgumentException( - "MineFantasy: No Available Entity ID!, you can try manually adding them in Config/Mobs.cfg"); - } + public static int autoAssign() { + for (int a = 0; a <= 255; a++) { + if (!EntityList.IDtoClassMapping.containsKey(Integer.valueOf(a))) { + System.out.println("MineFantasy: Autoassigned EntityID " + a); + return a; + } + } + throw new IllegalArgumentException( + "MineFantasy: No Available Entity ID!, you can try manually adding them in Config/Mobs.cfg"); + } - private static void addEntity(Class entityClass, String entityName, int id, int range, - int ticks) { - EntityRegistry.registerModEntity(entityClass, entityName, id, MineFantasyII.instance, range, ticks, true); - } + private static void addEntity(Class entityClass, String entityName, int id, int range, + int ticks) { + EntityRegistry.registerModEntity(entityClass, entityName, id, MineFantasyII.instance, range, ticks, true); + } } diff --git a/src/main/java/minefantasy/mf2/entity/list/MobListMF.java b/src/main/java/minefantasy/mf2/entity/list/MobListMF.java index d2f6dd17..2da97b65 100644 --- a/src/main/java/minefantasy/mf2/entity/list/MobListMF.java +++ b/src/main/java/minefantasy/mf2/entity/list/MobListMF.java @@ -16,58 +16,58 @@ import net.minecraftforge.common.BiomeDictionary.Type; public class MobListMF { - public static void register() { - DragonBreath.init(); - addEntity(10, EntityDragon.class, "MF_Dragon"); - addEntity(11, EntityMinotaur.class, "MF_Minotaur"); - addEntity(12, EntityCogwork.class, "MF_CogSuit"); - addEntity(13, EntityHound.class, "MF_Hound"); + public static void register() { + DragonBreath.init(); + addEntity(10, EntityDragon.class, "MF_Dragon"); + addEntity(11, EntityMinotaur.class, "MF_Minotaur"); + addEntity(12, EntityCogwork.class, "MF_CogSuit"); + addEntity(13, EntityHound.class, "MF_Hound"); - addSpawn(EntityDragon.class, 1, 1, 1, EnumCreatureType.monster, Type.NETHER); - if (ConfigMobs.minotaurSpawnrate > 0) { - addSpawn(EntityMinotaur.class, ConfigMobs.minotaurSpawnrate, 1, 1, EnumCreatureType.monster); - } - if (ConfigMobs.minotaurSpawnrateNether > 0) { - addSpawn(EntityMinotaur.class, ConfigMobs.minotaurSpawnrateNether, 1, 1, EnumCreatureType.monster, - Type.NETHER); - } - } + addSpawn(EntityDragon.class, 1, 1, 1, EnumCreatureType.monster, Type.NETHER); + if (ConfigMobs.minotaurSpawnrate > 0) { + addSpawn(EntityMinotaur.class, ConfigMobs.minotaurSpawnrate, 1, 1, EnumCreatureType.monster); + } + if (ConfigMobs.minotaurSpawnrateNether > 0) { + addSpawn(EntityMinotaur.class, ConfigMobs.minotaurSpawnrateNether, 1, 1, EnumCreatureType.monster, + Type.NETHER); + } + } - private static void addEntity(int IDBase, Class entityClass, String entityName) { - EntityRegistry.registerModEntity(entityClass, entityName, IDBase, MineFantasyII.instance, 128, 1, true); - } + private static void addEntity(int IDBase, Class entityClass, String entityName) { + EntityRegistry.registerModEntity(entityClass, entityName, IDBase, MineFantasyII.instance, 128, 1, true); + } - public static void addSpawn(Class entityClass, int weightedProb, int min, int max, - EnumCreatureType typeOfCreature) { - for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) { - if (biome != null) { - if (BiomeDictionary.isBiomeRegistered(biome)) { - if (BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.END)) { - return; - } - if (BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.NETHER)) { - return; - } - if (BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.MUSHROOM)) { - return; - } - } + public static void addSpawn(Class entityClass, int weightedProb, int min, int max, + EnumCreatureType typeOfCreature) { + for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) { + if (biome != null) { + if (BiomeDictionary.isBiomeRegistered(biome)) { + if (BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.END)) { + return; + } + if (BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.NETHER)) { + return; + } + if (BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.MUSHROOM)) { + return; + } + } - EntityRegistry.addSpawn(entityClass, weightedProb, min, max, typeOfCreature, biome); - } - } - } + EntityRegistry.addSpawn(entityClass, weightedProb, min, max, typeOfCreature, biome); + } + } + } - public static void addSpawn(Class entityClass, int weightedProb, int min, int max, - EnumCreatureType typeOfCreature, BiomeDictionary.Type type) { - for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) { - if (biome != null) { - if (BiomeDictionary.isBiomeRegistered(biome)) { - if (BiomeDictionary.isBiomeOfType(biome, type)) { - EntityRegistry.addSpawn(entityClass, weightedProb, min, max, typeOfCreature, biome); - } - } - } - } - } + public static void addSpawn(Class entityClass, int weightedProb, int min, int max, + EnumCreatureType typeOfCreature, BiomeDictionary.Type type) { + for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) { + if (biome != null) { + if (BiomeDictionary.isBiomeRegistered(biome)) { + if (BiomeDictionary.isBiomeOfType(biome, type)) { + EntityRegistry.addSpawn(entityClass, weightedProb, min, max, typeOfCreature, biome); + } + } + } + } + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/AshBreath.java b/src/main/java/minefantasy/mf2/entity/mob/AshBreath.java index 1db136b5..bb432500 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/AshBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/AshBreath.java @@ -14,36 +14,36 @@ public class AshBreath extends DragonBreath { - public AshBreath(String name) { - super(name); - } - - @Override - public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { - return shooter == null ? new DamageSource("ashblastBase").setDamageBypassesArmor() - : (new EntityDamageSourceIndirect("ashblast", breath, shooter).setDamageBypassesArmor()); - } - - @Override - @SideOnly(Side.CLIENT) - public String getTexture(EntityDragonBreath instance) { - return "textures/projectile/dragonbreath_ash"; - } - - public void onHitEntity(Entity target, EntityDragonBreath instance) { - super.onHitEntity(target, instance); - if (target instanceof EntityLivingBase) { - float dam = instance.getDamage(); - ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.blindness.id, 100, 0)); - } - } - - @Override - public float modifyDamage(Entity hit, float dam) { - return EntitySmoke.canPoison(hit, random) ? (dam / 5F + 1) : 0F; - } - - @Override - public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { - } + public AshBreath(String name) { + super(name); + } + + @Override + public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { + return shooter == null ? new DamageSource("ashblastBase").setDamageBypassesArmor() + : (new EntityDamageSourceIndirect("ashblast", breath, shooter).setDamageBypassesArmor()); + } + + @Override + @SideOnly(Side.CLIENT) + public String getTexture(EntityDragonBreath instance) { + return "textures/projectile/dragonbreath_ash"; + } + + public void onHitEntity(Entity target, EntityDragonBreath instance) { + super.onHitEntity(target, instance); + if (target instanceof EntityLivingBase) { + float dam = instance.getDamage(); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.blindness.id, 100, 0)); + } + } + + @Override + public float modifyDamage(Entity hit, float dam) { + return EntitySmoke.canPoison(hit, random) ? (dam / 5F + 1) : 0F; + } + + @Override + public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/DamageSourceMobMF.java b/src/main/java/minefantasy/mf2/entity/mob/DamageSourceMobMF.java index e58fb213..69636ae6 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/DamageSourceMobMF.java +++ b/src/main/java/minefantasy/mf2/entity/mob/DamageSourceMobMF.java @@ -7,24 +7,24 @@ import net.minecraft.util.IChatComponent; public class DamageSourceMobMF extends EntityDamageSource { - protected Entity damageSourceEntity; - private String attackName; + protected Entity damageSourceEntity; + private String attackName; - public DamageSourceMobMF(String name, Entity attacker) { - super("mob", attacker); - this.attackName = name; - this.damageSourceEntity = attacker; - } + public DamageSourceMobMF(String name, Entity attacker) { + super("mob", attacker); + this.attackName = name; + this.damageSourceEntity = attacker; + } - @Override - public Entity getEntity() { - return this.damageSourceEntity; - } + @Override + public Entity getEntity() { + return this.damageSourceEntity; + } - @Override - public IChatComponent func_151519_b(EntityLivingBase target) { - String s = "death.attack." + this.damageType + "." + attackName; - return new ChatComponentTranslation(s, - new Object[] { target.func_145748_c_(), this.damageSourceEntity.func_145748_c_() }); - } + @Override + public IChatComponent func_151519_b(EntityLivingBase target) { + String s = "death.attack." + this.damageType + "." + attackName; + return new ChatComponentTranslation(s, + new Object[]{target.func_145748_c_(), this.damageSourceEntity.func_145748_c_()}); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java b/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java index ea7d318a..c1c9067b 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java @@ -1,8 +1,5 @@ package minefantasy.mf2.entity.mob; -import java.util.ArrayList; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.entity.EntityDragonBreath; @@ -11,56 +8,57 @@ import net.minecraft.util.DamageSource; import net.minecraft.world.World; -public abstract class DragonBreath { - public static ArrayList projectiles = new ArrayList(); - - public static int nextID = 0; - protected Random random = new Random(); - public static DragonBreath fire, frost, poison, ash; +import java.util.ArrayList; +import java.util.Random; - public static void init() { - fire = new FireBreath("fire"); - frost = new FrostBreath("frost"); - poison = new PoisonBreath("poison"); - ash = new AshBreath("ash"); - } +public abstract class DragonBreath { + public static ArrayList projectiles = new ArrayList(); - public int id = 0; - public final String name; + public static int nextID = 0; + public static DragonBreath fire, frost, poison, ash; + public final String name; + public int id = 0; + protected Random random = new Random(); + public DragonBreath(String name) { + this.name = name; + register(); + } - public DragonBreath(String name) { - this.name = name; - register(); - } + public static void init() { + fire = new FireBreath("fire"); + frost = new FrostBreath("frost"); + poison = new PoisonBreath("poison"); + ash = new AshBreath("ash"); + } - public void register() { - this.id = nextID; - projectiles.add(this); - ++nextID; - } + public void register() { + this.id = nextID; + projectiles.add(this); + ++nextID; + } - public abstract DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter); + public abstract DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter); - public boolean shouldExpand() { - return true; - } + public boolean shouldExpand() { + return true; + } - public int getLifeSpan() { - return 30; - } + public int getLifeSpan() { + return 30; + } - @SideOnly(Side.CLIENT) - public abstract String getTexture(EntityDragonBreath instance); + @SideOnly(Side.CLIENT) + public abstract String getTexture(EntityDragonBreath instance); - public void onHitEntity(Entity entityHit, EntityDragonBreath instance) { - entityHit.attackEntityFrom(getDamageSource(instance, instance.shootingEntity), - modifyDamage(entityHit, instance.getDamage())); - } + public void onHitEntity(Entity entityHit, EntityDragonBreath instance) { + entityHit.attackEntityFrom(getDamageSource(instance, instance.shootingEntity), + modifyDamage(entityHit, instance.getDamage())); + } - public float modifyDamage(Entity hit, float dam) { - return dam; - } + public float modifyDamage(Entity hit, float dam) { + return dam; + } - public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { - } + public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/DragonBreed.java b/src/main/java/minefantasy/mf2/entity/mob/DragonBreed.java index 1815f886..f3454c6c 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/DragonBreed.java +++ b/src/main/java/minefantasy/mf2/entity/mob/DragonBreed.java @@ -1,170 +1,167 @@ package minefantasy.mf2.entity.mob; -import java.util.ArrayList; -import java.util.Random; - import minefantasy.mf2.config.ConfigMobs; import net.minecraft.world.biome.BiomeGenBase; +import java.util.ArrayList; +import java.util.Random; + public class DragonBreed { - private static final ArrayList[] breeds = new ArrayList[] { new ArrayList(), - new ArrayList(), new ArrayList(), new ArrayList(), - new ArrayList() }; - - /* - * New System Breeds Red: Fire, plains and hills Green: Poison, swamps, forests - * and plains White: Frost, cold regions Black: Dire, nether - * - */ - public static DragonBreed YOUNGRED = new DragonBreed(0, "dragon_young", "red", "dragon_red", DragonBreath.fire) - .setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 15, 200) - .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 1000, 0.05F).register(); - public static DragonBreed YOUNGWHITE = new DragonBreed(0, "dragon_young", "white", "dragon_frost", - DragonBreath.frost).setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 25, 200) - .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 800, 0.05F).register(); - public static DragonBreed YOUNGGREEN = new DragonBreed(0, "dragon_young", "green", "dragon_green", - DragonBreath.poison).setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 35, 100) - .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 400, 0.05F).register(); - public static DragonBreed YOUNGASH = new DragonBreed(0, "dragon_young", "ash", "dragon_ash", DragonBreath.ash) - .setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 15, 200) - .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 200, 0.05F).setBlind().register(); - - public static DragonBreed RED = new DragonBreed(1, "dragon", "red", "dragon_red", DragonBreath.fire) - .setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 15, 300) - .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 500, 0.1F).register(); - public static DragonBreed WHITE = new DragonBreed(1, "dragon", "white", "dragon_frost", DragonBreath.frost) - .setCombat(ConfigMobs.youngdragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 25, 300) - .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 400, 0.1F).register(); - public static DragonBreed GREEN = new DragonBreed(1, "dragon", "green", "dragon_green", DragonBreath.poison) - .setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 35, 200) - .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 300, 0.1F).register(); - public static DragonBreed ASH = new DragonBreed(1, "dragon", "ash", "dragon_ash", DragonBreath.ash) - .setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 15, 300) - .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 150, 0.1F).setBlind().register(); - - public static DragonBreed REDM = new DragonBreed(2, "dragon_mature", "red", "dragon_red", DragonBreath.fire) - .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 15, 300) - .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 400, 0.25F).register(); - public static DragonBreed WHITEM = new DragonBreed(2, "dragon_mature", "white", "dragon_frost", DragonBreath.frost) - .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 25, 300) - .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 300, 0.25F).register(); - public static DragonBreed GREENM = new DragonBreed(2, "dragon_mature", "green", "dragon_green", DragonBreath.poison) - .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 30, 200) - .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 200, 0.25F).register(); - public static DragonBreed ASHM = new DragonBreed(2, "dragon_mature", "ash", "dragon_ash", DragonBreath.ash) - .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 15, 300) - .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 100, 0.25F).setBlind().register(); - - public static DragonBreed ELDERRED = new DragonBreed(3, "dragon_elder", "red", "dragon_red", DragonBreath.fire) - .setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 15, 300) - .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 400, 0.35F).register(); - public static DragonBreed ELDERWHITE = new DragonBreed(3, "dragon_elder", "white", "dragon_frost", - DragonBreath.frost).setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 25, 300) - .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 300, 0.35F).register(); - public static DragonBreed ELDERGREEN = new DragonBreed(3, "dragon_elder", "green", "dragon_green", - DragonBreath.poison).setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 35, 200) - .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 200, 0.35F).register(); - public static DragonBreed ELDERASH = new DragonBreed(3, "dragon_elder", "ash", "dragon_ash", DragonBreath.ash) - .setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 15, 300) - .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 100, 0.35F).setBlind().register(); - - public static DragonBreed ANCIENT = new DragonBreed(4, "dragon_ancient", "dire", "dragon_ancient", - DragonBreath.fire).setCombat(ConfigMobs.ancientdragonHP, 2.0F, 5F, ConfigMobs.ancientdragonMD, 20, 300) - .setProjectile(ConfigMobs.ancientdragonFD, ConfigMobs.ancientdragonFT, 400, 1.0F).register(); - - public int tier = 0; - public String name = "dragon"; - public String breedName = "red"; - public DragonBreath rangedAttack; - public String tex = "dragonGreen"; - public float health = 200; - public float regenRate = 0; - public float meleeDamage = 8; - public float fireDamage = 5; - public float pyro = 0.1F; - public int disengageChance = 200; - public int fireTimer = 50; - public int coolTimer = 200; - public int meleeSpeed = 20; - public float DT = 2.0F; - - public DragonBreed(int tier, String name, String breedname, String tex, DragonBreath breath) { - this.tier = tier; - this.name = name; - this.breedName = breedname; - this.tex = tex; - this.rangedAttack = breath; - } - - public DragonBreed setCombat(float health, float DT, float regenRate, float meleeDamage, int meleeSpeed, - int disengageChance) { - this.health = health; - this.regenRate = regenRate; - this.meleeDamage = meleeDamage; - this.meleeSpeed = meleeSpeed; - this.disengageChance = disengageChance; - this.DT = DT; - return this; - } - - public DragonBreed setProjectile(float fireDamage, int fireTimer, int coolTimer, float pyro) { - this.fireDamage = fireDamage; - this.fireTimer = fireTimer; - this.coolTimer = coolTimer; - this.pyro = pyro; - return this; - } - - public DragonBreed register() { - breeds[tier].add(this); - return this; - } - - private boolean isBlind = false; - - public DragonBreed setBlind() { - isBlind = true; - return this; - } - - public boolean isBlind() { - return isBlind; - } - - public static DragonBreed getBreed(int tier, int id) { - tier = Math.min(breeds.length - 1, tier); - id = Math.min(breeds[tier].size() - 1, id); - DragonBreed breed = breeds[tier].get(id); - return breed != null ? breed : breeds[tier].get(0); - } - - private static Random rand = new Random(); - - public static int getRandomDragon(EntityDragon dragon, int tier) { - ArrayList pool = breeds[tier]; - BiomeGenBase biome = dragon.worldObj.getBiomeGenForCoords((int) (dragon.posX), (int) (dragon.posZ)); - int id = getIdForBiome(biome, - dragon.worldObj.canLightningStrikeAt((int) dragon.posX, (int) dragon.posY, (int) dragon.posZ), - dragon.dimension); - if (id >= pool.size()) { - id = pool.size() - 1; - } - return id; - } - - private static int getIdForBiome(BiomeGenBase biome, boolean isRaining, int dimension) { - if (dimension == -1) { - return rand.nextBoolean() ? 3 : 0;// Ash or Fire - } - BiomeGenBase.TempCategory category = biome.getTempCategory(); - if (!biome.func_150559_j() && !biome.canSpawnLightningBolt()) - return 3;// Ash - if (biome.getEnableSnow() || biome.temperature <= 0.25F || category == BiomeGenBase.TempCategory.COLD) - return 1;// Frost - if (biome.isHighHumidity() || (category == BiomeGenBase.TempCategory.MEDIUM && isRaining)) - return 2;// Poison - if (category == BiomeGenBase.TempCategory.OCEAN) - return 2;// Poison - return 0;// Fire - } + private static final ArrayList[] breeds = new ArrayList[]{new ArrayList(), + new ArrayList(), new ArrayList(), new ArrayList(), + new ArrayList()}; + + /* + * New System Breeds Red: Fire, plains and hills Green: Poison, swamps, forests + * and plains White: Frost, cold regions Black: Dire, nether + * + */ + public static DragonBreed YOUNGRED = new DragonBreed(0, "dragon_young", "red", "dragon_red", DragonBreath.fire) + .setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 15, 200) + .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 1000, 0.05F).register(); + public static DragonBreed YOUNGWHITE = new DragonBreed(0, "dragon_young", "white", "dragon_frost", + DragonBreath.frost).setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 25, 200) + .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 800, 0.05F).register(); + public static DragonBreed YOUNGGREEN = new DragonBreed(0, "dragon_young", "green", "dragon_green", + DragonBreath.poison).setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 35, 100) + .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 400, 0.05F).register(); + public static DragonBreed YOUNGASH = new DragonBreed(0, "dragon_young", "ash", "dragon_ash", DragonBreath.ash) + .setCombat(ConfigMobs.youngdragonHP, 0.0F, 0F, ConfigMobs.youngdragonMD, 15, 200) + .setProjectile(ConfigMobs.youngdragonFD, ConfigMobs.youngdragonFT, 200, 0.05F).setBlind().register(); + + public static DragonBreed RED = new DragonBreed(1, "dragon", "red", "dragon_red", DragonBreath.fire) + .setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 15, 300) + .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 500, 0.1F).register(); + public static DragonBreed WHITE = new DragonBreed(1, "dragon", "white", "dragon_frost", DragonBreath.frost) + .setCombat(ConfigMobs.youngdragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 25, 300) + .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 400, 0.1F).register(); + public static DragonBreed GREEN = new DragonBreed(1, "dragon", "green", "dragon_green", DragonBreath.poison) + .setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 35, 200) + .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 300, 0.1F).register(); + public static DragonBreed ASH = new DragonBreed(1, "dragon", "ash", "dragon_ash", DragonBreath.ash) + .setCombat(ConfigMobs.dragonHP, 2.0F, 0F, ConfigMobs.dragonMD, 15, 300) + .setProjectile(ConfigMobs.dragonFD, ConfigMobs.dragonFT, 150, 0.1F).setBlind().register(); + + public static DragonBreed REDM = new DragonBreed(2, "dragon_mature", "red", "dragon_red", DragonBreath.fire) + .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 15, 300) + .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 400, 0.25F).register(); + public static DragonBreed WHITEM = new DragonBreed(2, "dragon_mature", "white", "dragon_frost", DragonBreath.frost) + .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 25, 300) + .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 300, 0.25F).register(); + public static DragonBreed GREENM = new DragonBreed(2, "dragon_mature", "green", "dragon_green", DragonBreath.poison) + .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 30, 200) + .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 200, 0.25F).register(); + public static DragonBreed ASHM = new DragonBreed(2, "dragon_mature", "ash", "dragon_ash", DragonBreath.ash) + .setCombat(ConfigMobs.diredragonHP, 2.0F, 1F, ConfigMobs.diredragonMD, 15, 300) + .setProjectile(ConfigMobs.diredragonFD, ConfigMobs.diredragonFT, 100, 0.25F).setBlind().register(); + + public static DragonBreed ELDERRED = new DragonBreed(3, "dragon_elder", "red", "dragon_red", DragonBreath.fire) + .setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 15, 300) + .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 400, 0.35F).register(); + public static DragonBreed ELDERWHITE = new DragonBreed(3, "dragon_elder", "white", "dragon_frost", + DragonBreath.frost).setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 25, 300) + .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 300, 0.35F).register(); + public static DragonBreed ELDERGREEN = new DragonBreed(3, "dragon_elder", "green", "dragon_green", + DragonBreath.poison).setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 35, 200) + .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 200, 0.35F).register(); + public static DragonBreed ELDERASH = new DragonBreed(3, "dragon_elder", "ash", "dragon_ash", DragonBreath.ash) + .setCombat(ConfigMobs.elderdragonHP, 2.0F, 2F, ConfigMobs.elderdragonMD, 15, 300) + .setProjectile(ConfigMobs.elderdragonFD, ConfigMobs.elderdragonFT, 100, 0.35F).setBlind().register(); + + public static DragonBreed ANCIENT = new DragonBreed(4, "dragon_ancient", "dire", "dragon_ancient", + DragonBreath.fire).setCombat(ConfigMobs.ancientdragonHP, 2.0F, 5F, ConfigMobs.ancientdragonMD, 20, 300) + .setProjectile(ConfigMobs.ancientdragonFD, ConfigMobs.ancientdragonFT, 400, 1.0F).register(); + private static Random rand = new Random(); + public int tier = 0; + public String name = "dragon"; + public String breedName = "red"; + public DragonBreath rangedAttack; + public String tex = "dragonGreen"; + public float health = 200; + public float regenRate = 0; + public float meleeDamage = 8; + public float fireDamage = 5; + public float pyro = 0.1F; + public int disengageChance = 200; + public int fireTimer = 50; + public int coolTimer = 200; + public int meleeSpeed = 20; + public float DT = 2.0F; + private boolean isBlind = false; + + public DragonBreed(int tier, String name, String breedname, String tex, DragonBreath breath) { + this.tier = tier; + this.name = name; + this.breedName = breedname; + this.tex = tex; + this.rangedAttack = breath; + } + + public static DragonBreed getBreed(int tier, int id) { + tier = Math.min(breeds.length - 1, tier); + id = Math.min(breeds[tier].size() - 1, id); + DragonBreed breed = breeds[tier].get(id); + return breed != null ? breed : breeds[tier].get(0); + } + + public static int getRandomDragon(EntityDragon dragon, int tier) { + ArrayList pool = breeds[tier]; + BiomeGenBase biome = dragon.worldObj.getBiomeGenForCoords((int) (dragon.posX), (int) (dragon.posZ)); + int id = getIdForBiome(biome, + dragon.worldObj.canLightningStrikeAt((int) dragon.posX, (int) dragon.posY, (int) dragon.posZ), + dragon.dimension); + if (id >= pool.size()) { + id = pool.size() - 1; + } + return id; + } + + private static int getIdForBiome(BiomeGenBase biome, boolean isRaining, int dimension) { + if (dimension == -1) { + return rand.nextBoolean() ? 3 : 0;// Ash or Fire + } + BiomeGenBase.TempCategory category = biome.getTempCategory(); + if (!biome.func_150559_j() && !biome.canSpawnLightningBolt()) + return 3;// Ash + if (biome.getEnableSnow() || biome.temperature <= 0.25F || category == BiomeGenBase.TempCategory.COLD) + return 1;// Frost + if (biome.isHighHumidity() || (category == BiomeGenBase.TempCategory.MEDIUM && isRaining)) + return 2;// Poison + if (category == BiomeGenBase.TempCategory.OCEAN) + return 2;// Poison + return 0;// Fire + } + + public DragonBreed setCombat(float health, float DT, float regenRate, float meleeDamage, int meleeSpeed, + int disengageChance) { + this.health = health; + this.regenRate = regenRate; + this.meleeDamage = meleeDamage; + this.meleeSpeed = meleeSpeed; + this.disengageChance = disengageChance; + this.DT = DT; + return this; + } + + public DragonBreed setProjectile(float fireDamage, int fireTimer, int coolTimer, float pyro) { + this.fireDamage = fireDamage; + this.fireTimer = fireTimer; + this.coolTimer = coolTimer; + this.pyro = pyro; + return this; + } + + public DragonBreed register() { + breeds[tier].add(this); + return this; + } + + public DragonBreed setBlind() { + isBlind = true; + return this; + } + + public boolean isBlind() { + return isBlind; + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityDragon.java b/src/main/java/minefantasy/mf2/entity/mob/EntityDragon.java index bfedcd68..558a4543 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityDragon.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityDragon.java @@ -1,8 +1,5 @@ package minefantasy.mf2.entity.mob; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.armour.IArmourPenetrationMob; @@ -16,11 +13,7 @@ import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.ToolListMF; import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.*; import net.minecraft.entity.boss.IBossDisplayData; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; @@ -29,873 +22,869 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.StatCollector; -import net.minecraft.util.Vec3; +import net.minecraft.util.*; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; +import java.util.Iterator; +import java.util.List; + public class EntityDragon extends EntityFlyingMF - implements IMob, IBossDisplayData, IArmouredEntity, IArmourPenetrationMob { - public static int interestTimeSeconds = 90; - public static float heartChance = 1.0F; - - public int courseChangeCooldown; - public double waypointX; - public double waypointY; - public double waypointZ; - private Entity targetedEntity; - private int attackCounter; - private int fireBreathTick; - public int fireBreathCooldown; - private Entity lastEnemy; - private int interestTime; - @SideOnly(Side.CLIENT) - private int wingFlap, wingTick; - - public EntityDragon(World world) { - super(world); - this.setSize(4.0F, 3.0F); - this.isImmuneToFire = true; - this.experienceValue = 50; - stepHeight = 1.25F; - } - - @Override - protected void fall(float distance) { - if (isTerrestrial()) { - float power = Math.min(distance / 2F, 3F) * getScale(); - createShockwave(posX, posY, posZ, power / 2F, ConfigMobs.dragonGriefGeneral); - } - } - - public void setDragon(int tier) { - setTier(tier); - setBreed(DragonBreed.getRandomDragon(this, tier)); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(getType().health); - setHealth(getMaxHealth()); - this.setSize(3.0F * getScale(), 2.0F * getScale()); - stepHeight = 1.25F + (tier * 0.25F); - this.experienceValue = 50 * (tier + 1); - } - - @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { - setDragon(getRandomTier()); - return super.onSpawnWithEgg(data); - } - - private int getRandomTier() { - float f = rand.nextFloat() * 100F; - - if (f < 25F) { - return 0;// 0-25 (25%) - } - if (f < 50F) { - return 2;// 25-50 (25%) - } - if (f < 59F) { - return 3;// 50-59 (9%) - } - if (f < 60F)// 59-60 (1%) - { - return 4;// 55-60 - } - return 1;// 60-100 40% - } - - private static final int dataID = 12; - - protected void entityInit() { - super.entityInit(); - this.dataWatcher.addObject(dataID, Byte.valueOf((byte) 0)); - this.dataWatcher.addObject(dataID + 1, Float.valueOf(0F)); - this.dataWatcher.addObject(dataID + 2, Float.valueOf(0F)); - this.dataWatcher.addObject(dataID + 3, Integer.valueOf(0)); - this.dataWatcher.addObject(dataID + 4, Integer.valueOf(0)); - this.dataWatcher.addObject(dataID + 5, Integer.valueOf(rand.nextInt(5))); - } - - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(ConfigMobs.dragonHP); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(1.5D); - } - - @Override - public void onUpdate() { - super.onUpdate(); - - if (fireBreathTick > 0) - --fireBreathTick; - if (fireBreathCooldown > 0) - --fireBreathCooldown; - - if (!isTerrestrial()) { - this.fallDistance = 0; - } - if (!worldObj.isRemote) { - if (isInWater()) { - if (rand.nextFloat() < 0.8F) { - getJumpHelper().setJumping(); - } - } - - int disengageTime = getDisengageTime(); - if (disengageTime > 0) { - if (targetedEntity != null) - targetedEntity = null; - --disengageTime; - } - if (disengageTime == 1 && lastEnemy != null && this.canAttackEntity(lastEnemy)) { - setTarget(lastEnemy); - lastEnemy = null; - } - setDisengageTime(disengageTime); - if (rand.nextInt(this.getDisengageChance()) == 0 && disengageTime <= 0) { - disengage(100); - } - - if (onGround)// Ground begin walk - { - setTerrestrial(true); - } - if (targetedEntity != null && targetedEntity.posY < (posY - 5D) - && this.getDistance(targetedEntity.posX, posY, targetedEntity.posZ) < 2D)// Slam to enemy - { - setTerrestrial(true); - } - if (rand.nextInt(100) == 0 && targetedEntity == null)// Idle take off - { - setTerrestrial(false); - jump(); - } - if (targetedEntity != null && targetedEntity.posY > (posY + 2D))// Combat take off - { - setTerrestrial(false); - jump(); - } - - if (fireBreathTick > 0 && targetedEntity != null) { - this.faceEntity(targetedEntity, 1F, 1F); - breatheFire(); - } - - if (targetedEntity == null && (rand.nextInt(100) == 0) && disengageTime <= 0) { - this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; - this.waypointY = this.posY + (this.rand.nextFloat() * 1.5F - 1.0F) * 12.0F; - this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; - } - if (targetedEntity == null && (rand.nextInt(100) == 0) && disengageTime > 0) { - this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; - this.waypointY = this.posY - 4D; - this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; - } - if (getHealth() < getMaxHealth() && this.ticksExisted % 100 == 0 && getType().regenRate > 0) { - heal(getType().regenRate); - if (getHealth() > getMaxHealth()) { - setHealth(getMaxHealth()); - } - } - int time = getInterestTime(); - int maxTime = ((getHealth() > (getMaxHealth() * 0.75F)) ? time : time * 2) * 20; - if (dimension != -1) { - ++interestTime; - if (interestTime > maxTime && worldObj.canBlockSeeTheSky((int) posX, (int) posY, (int) posZ) - && posY > 128F) { - if (ConfigMobs.dragonMSG) { - List list = worldObj.playerEntities; - Iterator players = list.iterator(); - while (players.hasNext()) { - Object instance = players.next(); - if (instance != null && instance instanceof EntityPlayer) { - if (((EntityPlayer) instance).getDistanceToEntity(this) < 128D) { - ((EntityPlayer) instance).addChatMessage(new ChatComponentText( - StatCollector.translateToLocal("event.dragonaway.name"))); - } - } - } - } - this.setDead(); - } - if (interestTime > maxTime - 60 && worldObj.canBlockSeeTheSky((int) posX, (int) posY, (int) posZ)) { - this.waypointY = this.posY + 4D; - } - } - } else { - float jawMove = getJawMove(); - if (jawMove > 0) { - --jawMove; - } - setJawMove(jawMove); - float neckAngle = getNeckAngle(); - if (neckAngle > 0) { - --neckAngle; - } - setNeckAngle(neckAngle); - - wingTick++; - if (wingTick == 20) { - wingTick = 0; - if (!isTerrestrial()) - worldObj.playSoundAtEntity(this, "mob.enderdragon.flap", 0.5F, 1.5F); - } - int i = (120 / 20) * wingTick; - wingFlap = -40 + i; - } - } - - private int getInterestTime() { - return interestTimeSeconds; - } - - private void breatheFire() { - int spread = 4; - - for (int a = 0; a < spread; a++) { - double xAngle = this.targetedEntity.posX - this.posX; - double yAngle = this.targetedEntity.boundingBox.minY + this.targetedEntity.height / 2.0F - - (this.posY + this.height / 2.0F); - double zAngle = this.targetedEntity.posZ - this.posZ; - double power = 1.0D; - Vec3 var20 = this.getLook(1.0F); - Entity breath = getBreath(xAngle, yAngle, zAngle); - breath.posX = this.posX + var20.xCoord * power; - breath.posY = this.posY + this.height / 2.0F + 0.5D; - breath.posZ = this.posZ + var20.zCoord * power; - this.worldObj.spawnEntityInWorld(breath); - } - } - - private Entity getBreath(double xAngle, double yAngle, double zAngle) { - return new EntityDragonBreath(this.worldObj, this, xAngle, yAngle, zAngle, 1.0F).setDamage(getType().fireDamage) - .setType(getType().rangedAttack.id); - } - - @Override - protected void updateEntityActionState() { - if (!this.worldObj.isRemote && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { - this.setDead(); - } - - this.despawnEntity(); - double d0 = this.waypointX - this.posX; - double d1 = this.waypointY - this.posY; - double d2 = this.waypointZ - this.posZ; - double d3 = d0 * d0 + d1 * d1 + d2 * d2; - - if (d3 < 1.0D || d3 > 3600.0D) { - this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; - this.waypointY = this.posY + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; - this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; - } - - if (this.courseChangeCooldown-- <= 0) { - this.courseChangeCooldown += this.rand.nextInt(5) + 2; - d3 = MathHelper.sqrt_double(d3); - double flyspd = getFlightSpeed(); - if (this.isCourseTraversable(this.waypointX, this.waypointY, this.waypointZ, d3)) { - this.motionX += d0 / d3 * 0.5D * flyspd; - this.motionY += d1 / d3 * 0.5D * flyspd; - this.motionZ += d2 / d3 * 0.5D * flyspd; - } else { - this.waypointX = this.posX; - this.waypointY = this.posY; - this.waypointZ = this.posZ; - } - } - - if (this.targetedEntity != null && this.targetedEntity.isDead) { - this.targetedEntity = null; - } - - if (this.targetedEntity == null) { - EntityPlayer closest = this.worldObj.getClosestVulnerablePlayerToEntity(this, 100.0D); - if (closest != null && canAttackEntity(closest)) { - targetedEntity = closest; - closest = null; - } - if (this.targetedEntity != null) { - this.moveToTarget(); - } - } - - if (this.targetedEntity != null && this.targetedEntity.isDead) { - this.targetedEntity = null; - } - - if (this.targetedEntity == null) { - this.setEntityToAttack(EntityPlayer.class); - } - if (ConfigMobs.dragonKillNPC && this.targetedEntity == null) { - this.setEntityToAttack(EntityLiving.class); - } - - double var9 = 200.0D; - - if (this.targetedEntity != null && getDisengageTime() <= 0 - && this.targetedEntity.getDistanceSqToEntity(this) < var9 * var9) { - if (!worldObj.isRemote && !this.canEntityBeSeen(this.targetedEntity) && getDisengageTime() <= 0 - && (targetedEntity instanceof EntityPlayer ? rand.nextInt(40) == 0 : true)) { - disengage(200); - return; - } - float range = getAttackRange(); - - double var11 = this.targetedEntity.posX - this.posX; - double var13 = this.targetedEntity.boundingBox.minY + this.targetedEntity.height / 2.0F - - (this.posY + this.height / 2.0F); - double var15 = this.targetedEntity.posZ - this.posZ; - this.renderYawOffset = this.rotationYaw = -((float) Math.atan2(var11, var15)) * 180.0F / (float) Math.PI; - - boolean inRangeOfAttack = this.targetedEntity.getDistanceToEntity(this) < (range * getScale()) - && this.canEntityBeSeen(targetedEntity); - boolean inRangeOfLeap = onGround && this.targetedEntity.getDistanceToEntity(this) > range * 2 - && this.targetedEntity.getDistanceToEntity(this) < range * 8; - boolean inRangeOfFire = this.targetedEntity.getDistanceToEntity(this) > range - && this.targetedEntity.getDistanceToEntity(this) < range * 6 && fireBreathCooldown <= 0; - - if (this.canEntityBeSeen(this.targetedEntity) && inRangeOfFire) { - this.fireBreathTick = getType().fireTimer; - - fireBreathCooldown = 600 + getBreathCooldown() + rand.nextInt(getBreathCooldown()); - worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.fire", 1, 1); - setJawMove(20); - } - if (this.canEntityBeSeen(this.targetedEntity) && inRangeOfLeap && rand.nextInt(100) == 0) { - TacticalManager.lungeEntity(this, targetedEntity, 3.0F, 1.5F); - } - if (fallDistance <= 0 && this.canEntityBeSeen(this.targetedEntity) && inRangeOfAttack) { - if ((targetedEntity.isSneaking() && !targetedEntity.onGround) || this.attackCounter <= 0) { - if (targetedEntity.isRiding() && posY > (targetedEntity.posY)) { - targetedEntity.mountEntity(null); - targetedEntity.motionY = 1.0F; - targetedEntity.motionX = this.motionX; - targetedEntity.motionZ = this.motionZ; - if (targetedEntity instanceof EntityLivingBase) { - ((EntityLivingBase) targetedEntity) - .addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 5)); - ((EntityLivingBase) targetedEntity) - .addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 5)); - ((EntityLivingBase) targetedEntity) - .addPotionEffect(new PotionEffect(Potion.weakness.id, 200, 2)); - } - } - attackEntity(targetedEntity, this.getAttackStrength(targetedEntity)); - this.attackCounter = getAttackTime(); - setJawMove(40); - if (getHealth() <= this.getLowHPThreshold()) { - disengage(50); - } - worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.bite", 1, 1); - } - } - if (this.attackCounter > 0) { - --this.attackCounter; - } - if (this.canEntityBeSeen(this.targetedEntity) && !inRangeOfAttack) { - this.faceEntity(targetedEntity, 1F, 1F); - waypointX = targetedEntity.posX; - waypointY = targetedEntity.posY; - waypointZ = targetedEntity.posZ; - } - } else { - this.renderYawOffset = this.rotationYaw = -((float) Math.atan2(this.motionX, this.motionZ)) * 180.0F - / (float) Math.PI; - - if (this.attackCounter > 0) { - --this.attackCounter; - } - } - } - - private float getAttackRange() { - return 6.0F; - } - - private float getFlightSpeed() { - return 0.8F; - } - - @Override - public boolean canEntityBeSeen(Entity entity) { - return entity != null && super.canEntityBeSeen(entity); - } - - private int getBreathCooldown() { - return getType().coolTimer; - } - - private int getAttackTime() { - return getType().meleeSpeed; - } - - /** - * True if the ghast has an unobstructed line of travel to the waypoint. - */ - private boolean isCourseTraversable(double x, double y, double z, double distance) { - double d4 = (this.waypointX - this.posX) / distance; - double d5 = (this.waypointY - this.posY) / distance; - double d6 = (this.waypointZ - this.posZ) / distance; - AxisAlignedBB axisalignedbb = this.boundingBox.copy(); - - for (int i = 1; i < distance; ++i) { - axisalignedbb.offset(d4, d5, d6); - - if (!this.worldObj.getCollidingBoundingBoxes(this, axisalignedbb).isEmpty()) { - return false; - } - Block block = worldObj.getBlock((int) d4, (int) d5, (int) d6); - if (block.getMaterial().isLiquid()) { - return false; - } - } - - return true; - } - - protected void attackEntity(Entity entity, float f) { - float damage = this.getAttackStrength(entity); - - if (rand.nextInt(3) == 0) { - targetedEntity.motionY = 2; - jump(); - setNeckAngle(10); - damage = 2.0F; - } - worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.bite", 1, 1); - entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage); - } - - @Override - public void playLivingSound() { - super.playLivingSound(); - setJawMove(20); - } - - private float getAttackStrength(Entity entity) { - return getType().meleeDamage; - } - - public void setEntityToAttack(Class enClass) { - List list = worldObj.getEntitiesWithinAABB(enClass, - AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1.0D, posY + 1.0D, posZ + 1.0D).expand(getAggro(), - getAggro(), getAggro())); - while (!list.isEmpty()) { - Entity target = (Entity) list.get(0); - if (canAttackEntity(target)) { - double r = getAggro(); - boolean inRange = this.getDistanceToEntity(target) <= r; - if (getDisengageTime() <= 0 && inRange) { - setTarget(target); - list.clear(); - } else { - list.remove(0); - } - } else { - list.remove(0); - } - } - } - - public void setTarget(Entity target) { - this.targetedEntity = target; - } - - private boolean canAttackEntity(Entity target) { - if (this.getType().isBlind() && !this.canHearEntity(target)) { - return false; - } - if (getDisengageTime() > 0) { - return false; - } - if (!this.canEntityBeSeen(target)) - return false; - if (target instanceof EntityDragon || target == this.riddenByEntity) { - return false; - } - if (target instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) target; - return !player.capabilities.isCreativeMode; - } - return canEntityBeSeen(target); - } - - private double getAggro() { - return 256D; - } - - @Override - public boolean attackEntityFrom(DamageSource source, float damage) { - if (source.getEntity() != null) { - this.interestTime = 0; - } - if (getDisengageTime() <= 0 && this.getHealth() < getLowHPThreshold()) { - disengage(100); - } - if (source.isFireDamage()) - return false; - - if (source == DamageSource.inWall) - return false; - - if (source.getEntity() != null && source.getEntity() instanceof EntityPlayer) { - if (getDisengageTime() <= 0 && getAttackTarget() == null || damage > 16 - || (targetedEntity != null && !(targetedEntity instanceof EntityPlayer))) - setTarget(source.getEntity()); - } - - if (source.getEntity() != null) { - if (getDisengageTime() <= 0 && getAttackTarget() == null) - setTarget(source.getEntity()); - } - return super.attackEntityFrom(source, damage); - } - - /** - * @return The health threshold where dragons constantly retreat - */ - private float getLowHPThreshold() { - return getType().health / 4; - } - - private int getDisengageChance() { - return getType().disengageChance; - } - - @Override - protected String getLivingSound() { - return "minefantasy2:mob.dragon.say"; - } - - @Override - protected void func_145780_a(int x, int y, int z, Block floor) { - this.playSound("minefantasy2:mob.dragon.step", 1.0F, 1.0F); - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() { - return "minefantasy2:mob.dragon.hurt"; - } - - /** - * Returns the volume for the sounds this mob makes. - */ - @Override - protected float getSoundVolume() { - return 2.0F; - } - - @Override - protected float getSoundPitch() { - return 1.0F; - } - - protected Item getDropItem() { - return ComponentListMF.dragon_heart; - } - - /** - * Drop 0-2 items of this living's type. @param par1 - Whether this entity has - * recently been hit by a player. @param par2 - Level of Looting used to kill - * this mob. - */ - @Override - protected void dropFewItems(boolean playerKill, int looting) { - int count = getLootCount(getTier()) + rand.nextInt(looting + 1); - for (int a = 0; a < count; a++) { - Item drop = getLoot(getTier()); - this.dropItem(drop, 1); - } - if (getTier() == 4)// ANCIENT - { - this.dropItem(Items.nether_star, 1); - } - if (didDropHeart(this.getTier())) { - this.dropItem(ComponentListMF.dragon_heart, 1); - } - } - - private Item getLoot(int tier) { - if (tier == 4)// Ancient - { - return ToolListMF.loot_sack_rare; - } - return ToolListMF.loot_sack_uc;// Any - } - - private boolean didDropHeart(int tier) { - if (tier == 4)// Ancient - { - return true; - } - if (tier == 3)// Elder - { - return true; - } - if (tier == 2)// Mature - { - return rand.nextFloat() * heartChance > 0.25F;// 75% chance - } - if (tier == 1)// Adult - { - return rand.nextFloat() * heartChance > 0.85F;// 15% chance - } - return false;// Young - } - - private int getLootCount(int tier) { - if (tier == 4)// Ancient - { - return 1;// 1 Exquisite - } - if (tier == 3)// Elder - { - return 2 + rand.nextInt(4);// 2-5 Valuable - } - if (tier == 2)// Mature - { - return 2 + rand.nextInt(1);// 2-3 Valuable - } - if (tier == 1)// Adult - { - return 1 + rand.nextInt(1);// 1-2 Valuable - } - return 1;// Young, 1 Valuable - } - - /** - * Checks if the entity's current position is a valid location to spawn this - * entity. - */ - @Override - public boolean getCanSpawnHere() { - return super.getCanSpawnHere() && this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL; - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - public int getMaxSpawnedInChunk() { - return 1; - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - public void writeEntityToNBT(NBTTagCompound nbt) { - super.writeEntityToNBT(nbt); - - nbt.setInteger("FireBreath", fireBreathTick); - nbt.setInteger("FireBreathCooldown", fireBreathTick); - - nbt.setInteger("Breed", getBreed()); - nbt.setInteger("Tier", getTier()); - nbt.setInteger("interestTime", interestTime); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - public void readEntityFromNBT(NBTTagCompound nbt) { - super.readEntityFromNBT(nbt); - - fireBreathTick = nbt.getInteger("FireBreath"); - fireBreathCooldown = nbt.getInteger("FireBreathCooldown"); - - setBreed(nbt.getInteger("Breed")); - setTier(nbt.getInteger("Tier")); - interestTime = nbt.getInteger("interestTime"); - - } - - @SideOnly(Side.CLIENT) - public String getTexture() { - return getType().tex; - } - - @SideOnly(Side.CLIENT) - public double wingFlap() { - return wingFlap; - } - - @SideOnly(Side.CLIENT) - public float getJawMove() { - return dataWatcher.getWatchableObjectFloat(dataID + 1); - } - - @SideOnly(Side.CLIENT) - public float getNeckAngle() { - return dataWatcher.getWatchableObjectFloat(dataID + 2); - } - - public int getDisengageTime() { - return dataWatcher.getWatchableObjectInt(dataID + 3); - } - - public void setJawMove(float i) { - dataWatcher.updateObject(dataID + 1, i); - } - - public void setNeckAngle(float i) { - dataWatcher.updateObject(dataID + 2, i); - } - - public void setDisengageTime(int i) { - dataWatcher.updateObject(dataID + 3, i); - } - - @Override - public boolean isTerrestrial() { - return dataWatcher.getWatchableObjectByte(dataID) == 1; - } - - public void setTerrestrial(boolean flag) { - dataWatcher.updateObject(dataID, (byte) (flag ? 1 : 0)); - } - - public double wingAngle() { - return isTerrestrial() ? 0D : 45D; - } - - private void moveToTarget() { - if (getDisengageTime() <= 0 && targetedEntity != null) { - this.faceEntity(targetedEntity, 1F, 1F); - this.waypointX = targetedEntity.posX; - this.waypointY = targetedEntity.posY; - this.waypointZ = targetedEntity.posZ; - } - } - - public void disengage(int time) { - if (targetedEntity != null && targetedEntity instanceof EntityPlayer) { - lastEnemy = targetedEntity; - } - setDisengageTime(time); - setTerrestrial(false); - this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; - this.waypointY = this.posY + (this.rand.nextFloat()) * 16.0F; - this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; - targetedEntity = null; - } - - public DragonBreed getType() { - return DragonBreed.getBreed(getTier(), getBreed()); - } - - public int getBreed() { - return dataWatcher.getWatchableObjectInt(dataID + 4); - } - - public void setBreed(int i) { - dataWatcher.updateObject(dataID + 4, i); - } - - public int getTier() { - return dataWatcher.getWatchableObjectInt(dataID + 5); - } - - public void setTier(int i) { - dataWatcher.updateObject(dataID + 5, i); - } - - public String getCommandSenderName() { - String tierName = StatCollector.translateToLocal("entity." + getType().name + ".name"); - String breedName = StatCollector.translateToLocal("entity.dragonbreed." + getType().breedName + ".name"); - return StatCollector.translateToLocalFormatted(tierName, breedName); - } - - public float getScale() { - return 0.6F + (getTier() * 0.2F); - } - - public Shockwave createShockwave(double x, double y, double z, float power, boolean grief) { - return newShockwave(x, y, z, power, false, grief); - } - - /** - * returns a new explosion. Does initiation (at time of writing Explosion is not - * finished) - */ - public Shockwave newShockwave(double x, double y, double z, float power, boolean fire, boolean smoke) { - Shockwave explosion = new Shockwave("dragonstomp", worldObj, this, x, y, z, power); - explosion.isFlaming = fire; - explosion.isGriefing = worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"); - explosion.isSmoking = smoke; - explosion.initiate(); - explosion.decorateWave(true); - return explosion; - } - - public float getFirePyro() { - if (!ConfigMobs.dragonGriefFire) { - return 0F; - } - return getType().pyro; - } - - @Override - public float getThreshold(DamageSource src) { - if (!src.isUnblockable()) { - return getType().DT; - } - return 0; - } - - @Override - public float[] getHitTraits() { - return new float[] { 0, 1, 9 };// 90% Piercing, 10% BLunt - } - - @SideOnly(Side.CLIENT) - public float getVertTailAngle() { - if (this.motionY > 0.05F || this.motionY < -0.05F)// accend or decend - { - if (!(this.motionX == 0 && this.motionZ == 0))// moving - { - float angle = (float) (45F * this.motionY) * 5; - if (angle < -45) - angle = -45; - if (angle > 45) - angle = 45; - - return angle; - } - } - return 0; - } - - private boolean canHearEntity(Entity target) { - if (target instanceof EntityLivingBase && PowerArmour.isWearingCogwork((EntityLivingBase) target)) - return true; - - double distance = getDistanceToEntity(target); - - if (distance < width / 2) { - return true;// touching - } - if (distance < 16 && this.getAttackTarget() != null && getAttackTarget() == target) { - return true;// Smell - } - float tarSpeed = (float) Math.hypot(target.motionX, target.motionZ); - - if (tarSpeed < 0.1F) { - return false; - } - if (target instanceof EntityLivingBase) { - return getSound((EntityLivingBase) target, tarSpeed) >= distance; - } - return true; - } - - private double getSound(EntityLivingBase target, float speed) { - float value = 10F * (60F + ArmourCalculator.getTotalWeightOfWorn(target, false)) * speed; - return value; - } + implements IMob, IBossDisplayData, IArmouredEntity, IArmourPenetrationMob { + private static final int dataID = 12; + public static int interestTimeSeconds = 90; + public static float heartChance = 1.0F; + public int courseChangeCooldown; + public double waypointX; + public double waypointY; + public double waypointZ; + public int fireBreathCooldown; + private Entity targetedEntity; + private int attackCounter; + private int fireBreathTick; + private Entity lastEnemy; + private int interestTime; + @SideOnly(Side.CLIENT) + private int wingFlap, wingTick; + + public EntityDragon(World world) { + super(world); + this.setSize(4.0F, 3.0F); + this.isImmuneToFire = true; + this.experienceValue = 50; + stepHeight = 1.25F; + } + + @Override + protected void fall(float distance) { + if (isTerrestrial()) { + float power = Math.min(distance / 2F, 3F) * getScale(); + createShockwave(posX, posY, posZ, power / 2F, ConfigMobs.dragonGriefGeneral); + } + } + + public void setDragon(int tier) { + setTier(tier); + setBreed(DragonBreed.getRandomDragon(this, tier)); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(getType().health); + setHealth(getMaxHealth()); + this.setSize(3.0F * getScale(), 2.0F * getScale()); + stepHeight = 1.25F + (tier * 0.25F); + this.experienceValue = 50 * (tier + 1); + } + + @Override + public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { + setDragon(getRandomTier()); + return super.onSpawnWithEgg(data); + } + + private int getRandomTier() { + float f = rand.nextFloat() * 100F; + + if (f < 25F) { + return 0;// 0-25 (25%) + } + if (f < 50F) { + return 2;// 25-50 (25%) + } + if (f < 59F) { + return 3;// 50-59 (9%) + } + if (f < 60F)// 59-60 (1%) + { + return 4;// 55-60 + } + return 1;// 60-100 40% + } + + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(dataID, Byte.valueOf((byte) 0)); + this.dataWatcher.addObject(dataID + 1, Float.valueOf(0F)); + this.dataWatcher.addObject(dataID + 2, Float.valueOf(0F)); + this.dataWatcher.addObject(dataID + 3, Integer.valueOf(0)); + this.dataWatcher.addObject(dataID + 4, Integer.valueOf(0)); + this.dataWatcher.addObject(dataID + 5, Integer.valueOf(rand.nextInt(5))); + } + + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(ConfigMobs.dragonHP); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(1.5D); + } + + @Override + public void onUpdate() { + super.onUpdate(); + + if (fireBreathTick > 0) + --fireBreathTick; + if (fireBreathCooldown > 0) + --fireBreathCooldown; + + if (!isTerrestrial()) { + this.fallDistance = 0; + } + if (!worldObj.isRemote) { + if (isInWater()) { + if (rand.nextFloat() < 0.8F) { + getJumpHelper().setJumping(); + } + } + + int disengageTime = getDisengageTime(); + if (disengageTime > 0) { + if (targetedEntity != null) + targetedEntity = null; + --disengageTime; + } + if (disengageTime == 1 && lastEnemy != null && this.canAttackEntity(lastEnemy)) { + setTarget(lastEnemy); + lastEnemy = null; + } + setDisengageTime(disengageTime); + if (rand.nextInt(this.getDisengageChance()) == 0 && disengageTime <= 0) { + disengage(100); + } + + if (onGround)// Ground begin walk + { + setTerrestrial(true); + } + if (targetedEntity != null && targetedEntity.posY < (posY - 5D) + && this.getDistance(targetedEntity.posX, posY, targetedEntity.posZ) < 2D)// Slam to enemy + { + setTerrestrial(true); + } + if (rand.nextInt(100) == 0 && targetedEntity == null)// Idle take off + { + setTerrestrial(false); + jump(); + } + if (targetedEntity != null && targetedEntity.posY > (posY + 2D))// Combat take off + { + setTerrestrial(false); + jump(); + } + + if (fireBreathTick > 0 && targetedEntity != null) { + this.faceEntity(targetedEntity, 1F, 1F); + breatheFire(); + } + + if (targetedEntity == null && (rand.nextInt(100) == 0) && disengageTime <= 0) { + this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.waypointY = this.posY + (this.rand.nextFloat() * 1.5F - 1.0F) * 12.0F; + this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + } + if (targetedEntity == null && (rand.nextInt(100) == 0) && disengageTime > 0) { + this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.waypointY = this.posY - 4D; + this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + } + if (getHealth() < getMaxHealth() && this.ticksExisted % 100 == 0 && getType().regenRate > 0) { + heal(getType().regenRate); + if (getHealth() > getMaxHealth()) { + setHealth(getMaxHealth()); + } + } + int time = getInterestTime(); + int maxTime = ((getHealth() > (getMaxHealth() * 0.75F)) ? time : time * 2) * 20; + if (dimension != -1) { + ++interestTime; + if (interestTime > maxTime && worldObj.canBlockSeeTheSky((int) posX, (int) posY, (int) posZ) + && posY > 128F) { + if (ConfigMobs.dragonMSG) { + List list = worldObj.playerEntities; + Iterator players = list.iterator(); + while (players.hasNext()) { + Object instance = players.next(); + if (instance != null && instance instanceof EntityPlayer) { + if (((EntityPlayer) instance).getDistanceToEntity(this) < 128D) { + ((EntityPlayer) instance).addChatMessage(new ChatComponentText( + StatCollector.translateToLocal("event.dragonaway.name"))); + } + } + } + } + this.setDead(); + } + if (interestTime > maxTime - 60 && worldObj.canBlockSeeTheSky((int) posX, (int) posY, (int) posZ)) { + this.waypointY = this.posY + 4D; + } + } + } else { + float jawMove = getJawMove(); + if (jawMove > 0) { + --jawMove; + } + setJawMove(jawMove); + float neckAngle = getNeckAngle(); + if (neckAngle > 0) { + --neckAngle; + } + setNeckAngle(neckAngle); + + wingTick++; + if (wingTick == 20) { + wingTick = 0; + if (!isTerrestrial()) + worldObj.playSoundAtEntity(this, "mob.enderdragon.flap", 0.5F, 1.5F); + } + int i = (120 / 20) * wingTick; + wingFlap = -40 + i; + } + } + + private int getInterestTime() { + return interestTimeSeconds; + } + + private void breatheFire() { + int spread = 4; + + for (int a = 0; a < spread; a++) { + double xAngle = this.targetedEntity.posX - this.posX; + double yAngle = this.targetedEntity.boundingBox.minY + this.targetedEntity.height / 2.0F + - (this.posY + this.height / 2.0F); + double zAngle = this.targetedEntity.posZ - this.posZ; + double power = 1.0D; + Vec3 var20 = this.getLook(1.0F); + Entity breath = getBreath(xAngle, yAngle, zAngle); + breath.posX = this.posX + var20.xCoord * power; + breath.posY = this.posY + this.height / 2.0F + 0.5D; + breath.posZ = this.posZ + var20.zCoord * power; + this.worldObj.spawnEntityInWorld(breath); + } + } + + private Entity getBreath(double xAngle, double yAngle, double zAngle) { + return new EntityDragonBreath(this.worldObj, this, xAngle, yAngle, zAngle, 1.0F).setDamage(getType().fireDamage) + .setType(getType().rangedAttack.id); + } + + @Override + protected void updateEntityActionState() { + if (!this.worldObj.isRemote && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + this.setDead(); + } + + this.despawnEntity(); + double d0 = this.waypointX - this.posX; + double d1 = this.waypointY - this.posY; + double d2 = this.waypointZ - this.posZ; + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + + if (d3 < 1.0D || d3 > 3600.0D) { + this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.waypointY = this.posY + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + } + + if (this.courseChangeCooldown-- <= 0) { + this.courseChangeCooldown += this.rand.nextInt(5) + 2; + d3 = MathHelper.sqrt_double(d3); + double flyspd = getFlightSpeed(); + if (this.isCourseTraversable(this.waypointX, this.waypointY, this.waypointZ, d3)) { + this.motionX += d0 / d3 * 0.5D * flyspd; + this.motionY += d1 / d3 * 0.5D * flyspd; + this.motionZ += d2 / d3 * 0.5D * flyspd; + } else { + this.waypointX = this.posX; + this.waypointY = this.posY; + this.waypointZ = this.posZ; + } + } + + if (this.targetedEntity != null && this.targetedEntity.isDead) { + this.targetedEntity = null; + } + + if (this.targetedEntity == null) { + EntityPlayer closest = this.worldObj.getClosestVulnerablePlayerToEntity(this, 100.0D); + if (closest != null && canAttackEntity(closest)) { + targetedEntity = closest; + closest = null; + } + if (this.targetedEntity != null) { + this.moveToTarget(); + } + } + + if (this.targetedEntity != null && this.targetedEntity.isDead) { + this.targetedEntity = null; + } + + if (this.targetedEntity == null) { + this.setEntityToAttack(EntityPlayer.class); + } + if (ConfigMobs.dragonKillNPC && this.targetedEntity == null) { + this.setEntityToAttack(EntityLiving.class); + } + + double var9 = 200.0D; + + if (this.targetedEntity != null && getDisengageTime() <= 0 + && this.targetedEntity.getDistanceSqToEntity(this) < var9 * var9) { + if (!worldObj.isRemote && !this.canEntityBeSeen(this.targetedEntity) && getDisengageTime() <= 0 + && (targetedEntity instanceof EntityPlayer ? rand.nextInt(40) == 0 : true)) { + disengage(200); + return; + } + float range = getAttackRange(); + + double var11 = this.targetedEntity.posX - this.posX; + double var13 = this.targetedEntity.boundingBox.minY + this.targetedEntity.height / 2.0F + - (this.posY + this.height / 2.0F); + double var15 = this.targetedEntity.posZ - this.posZ; + this.renderYawOffset = this.rotationYaw = -((float) Math.atan2(var11, var15)) * 180.0F / (float) Math.PI; + + boolean inRangeOfAttack = this.targetedEntity.getDistanceToEntity(this) < (range * getScale()) + && this.canEntityBeSeen(targetedEntity); + boolean inRangeOfLeap = onGround && this.targetedEntity.getDistanceToEntity(this) > range * 2 + && this.targetedEntity.getDistanceToEntity(this) < range * 8; + boolean inRangeOfFire = this.targetedEntity.getDistanceToEntity(this) > range + && this.targetedEntity.getDistanceToEntity(this) < range * 6 && fireBreathCooldown <= 0; + + if (this.canEntityBeSeen(this.targetedEntity) && inRangeOfFire) { + this.fireBreathTick = getType().fireTimer; + + fireBreathCooldown = 600 + getBreathCooldown() + rand.nextInt(getBreathCooldown()); + worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.fire", 1, 1); + setJawMove(20); + } + if (this.canEntityBeSeen(this.targetedEntity) && inRangeOfLeap && rand.nextInt(100) == 0) { + TacticalManager.lungeEntity(this, targetedEntity, 3.0F, 1.5F); + } + if (fallDistance <= 0 && this.canEntityBeSeen(this.targetedEntity) && inRangeOfAttack) { + if ((targetedEntity.isSneaking() && !targetedEntity.onGround) || this.attackCounter <= 0) { + if (targetedEntity.isRiding() && posY > (targetedEntity.posY)) { + targetedEntity.mountEntity(null); + targetedEntity.motionY = 1.0F; + targetedEntity.motionX = this.motionX; + targetedEntity.motionZ = this.motionZ; + if (targetedEntity instanceof EntityLivingBase) { + ((EntityLivingBase) targetedEntity) + .addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 5)); + ((EntityLivingBase) targetedEntity) + .addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 5)); + ((EntityLivingBase) targetedEntity) + .addPotionEffect(new PotionEffect(Potion.weakness.id, 200, 2)); + } + } + attackEntity(targetedEntity, this.getAttackStrength(targetedEntity)); + this.attackCounter = getAttackTime(); + setJawMove(40); + if (getHealth() <= this.getLowHPThreshold()) { + disengage(50); + } + worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.bite", 1, 1); + } + } + if (this.attackCounter > 0) { + --this.attackCounter; + } + if (this.canEntityBeSeen(this.targetedEntity) && !inRangeOfAttack) { + this.faceEntity(targetedEntity, 1F, 1F); + waypointX = targetedEntity.posX; + waypointY = targetedEntity.posY; + waypointZ = targetedEntity.posZ; + } + } else { + this.renderYawOffset = this.rotationYaw = -((float) Math.atan2(this.motionX, this.motionZ)) * 180.0F + / (float) Math.PI; + + if (this.attackCounter > 0) { + --this.attackCounter; + } + } + } + + private float getAttackRange() { + return 6.0F; + } + + private float getFlightSpeed() { + return 0.8F; + } + + @Override + public boolean canEntityBeSeen(Entity entity) { + return entity != null && super.canEntityBeSeen(entity); + } + + private int getBreathCooldown() { + return getType().coolTimer; + } + + private int getAttackTime() { + return getType().meleeSpeed; + } + + /** + * True if the ghast has an unobstructed line of travel to the waypoint. + */ + private boolean isCourseTraversable(double x, double y, double z, double distance) { + double d4 = (this.waypointX - this.posX) / distance; + double d5 = (this.waypointY - this.posY) / distance; + double d6 = (this.waypointZ - this.posZ) / distance; + AxisAlignedBB axisalignedbb = this.boundingBox.copy(); + + for (int i = 1; i < distance; ++i) { + axisalignedbb.offset(d4, d5, d6); + + if (!this.worldObj.getCollidingBoundingBoxes(this, axisalignedbb).isEmpty()) { + return false; + } + Block block = worldObj.getBlock((int) d4, (int) d5, (int) d6); + if (block.getMaterial().isLiquid()) { + return false; + } + } + + return true; + } + + protected void attackEntity(Entity entity, float f) { + float damage = this.getAttackStrength(entity); + + if (rand.nextInt(3) == 0) { + targetedEntity.motionY = 2; + jump(); + setNeckAngle(10); + damage = 2.0F; + } + worldObj.playSoundAtEntity(this, "minefantasy2:mob.dragon.bite", 1, 1); + entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage); + } + + @Override + public void playLivingSound() { + super.playLivingSound(); + setJawMove(20); + } + + private float getAttackStrength(Entity entity) { + return getType().meleeDamage; + } + + public void setEntityToAttack(Class enClass) { + List list = worldObj.getEntitiesWithinAABB(enClass, + AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1.0D, posY + 1.0D, posZ + 1.0D).expand(getAggro(), + getAggro(), getAggro())); + while (!list.isEmpty()) { + Entity target = (Entity) list.get(0); + if (canAttackEntity(target)) { + double r = getAggro(); + boolean inRange = this.getDistanceToEntity(target) <= r; + if (getDisengageTime() <= 0 && inRange) { + setTarget(target); + list.clear(); + } else { + list.remove(0); + } + } else { + list.remove(0); + } + } + } + + public void setTarget(Entity target) { + this.targetedEntity = target; + } + + private boolean canAttackEntity(Entity target) { + if (this.getType().isBlind() && !this.canHearEntity(target)) { + return false; + } + if (getDisengageTime() > 0) { + return false; + } + if (!this.canEntityBeSeen(target)) + return false; + if (target instanceof EntityDragon || target == this.riddenByEntity) { + return false; + } + if (target instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) target; + return !player.capabilities.isCreativeMode; + } + return canEntityBeSeen(target); + } + + private double getAggro() { + return 256D; + } + + @Override + public boolean attackEntityFrom(DamageSource source, float damage) { + if (source.getEntity() != null) { + this.interestTime = 0; + } + if (getDisengageTime() <= 0 && this.getHealth() < getLowHPThreshold()) { + disengage(100); + } + if (source.isFireDamage()) + return false; + + if (source == DamageSource.inWall) + return false; + + if (source.getEntity() != null && source.getEntity() instanceof EntityPlayer) { + if (getDisengageTime() <= 0 && getAttackTarget() == null || damage > 16 + || (targetedEntity != null && !(targetedEntity instanceof EntityPlayer))) + setTarget(source.getEntity()); + } + + if (source.getEntity() != null) { + if (getDisengageTime() <= 0 && getAttackTarget() == null) + setTarget(source.getEntity()); + } + return super.attackEntityFrom(source, damage); + } + + /** + * @return The health threshold where dragons constantly retreat + */ + private float getLowHPThreshold() { + return getType().health / 4; + } + + private int getDisengageChance() { + return getType().disengageChance; + } + + @Override + protected String getLivingSound() { + return "minefantasy2:mob.dragon.say"; + } + + @Override + protected void func_145780_a(int x, int y, int z, Block floor) { + this.playSound("minefantasy2:mob.dragon.step", 1.0F, 1.0F); + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + @Override + protected String getHurtSound() { + return "minefantasy2:mob.dragon.hurt"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + @Override + protected float getSoundVolume() { + return 2.0F; + } + + @Override + protected float getSoundPitch() { + return 1.0F; + } + + protected Item getDropItem() { + return ComponentListMF.dragon_heart; + } + + /** + * Drop 0-2 items of this living's type. @param par1 - Whether this entity has + * recently been hit by a player. @param par2 - Level of Looting used to kill + * this mob. + */ + @Override + protected void dropFewItems(boolean playerKill, int looting) { + int count = getLootCount(getTier()) + rand.nextInt(looting + 1); + for (int a = 0; a < count; a++) { + Item drop = getLoot(getTier()); + this.dropItem(drop, 1); + } + if (getTier() == 4)// ANCIENT + { + this.dropItem(Items.nether_star, 1); + } + if (didDropHeart(this.getTier())) { + this.dropItem(ComponentListMF.dragon_heart, 1); + } + } + + private Item getLoot(int tier) { + if (tier == 4)// Ancient + { + return ToolListMF.loot_sack_rare; + } + return ToolListMF.loot_sack_uc;// Any + } + + private boolean didDropHeart(int tier) { + if (tier == 4)// Ancient + { + return true; + } + if (tier == 3)// Elder + { + return true; + } + if (tier == 2)// Mature + { + return rand.nextFloat() * heartChance > 0.25F;// 75% chance + } + if (tier == 1)// Adult + { + return rand.nextFloat() * heartChance > 0.85F;// 15% chance + } + return false;// Young + } + + private int getLootCount(int tier) { + if (tier == 4)// Ancient + { + return 1;// 1 Exquisite + } + if (tier == 3)// Elder + { + return 2 + rand.nextInt(4);// 2-5 Valuable + } + if (tier == 2)// Mature + { + return 2 + rand.nextInt(1);// 2-3 Valuable + } + if (tier == 1)// Adult + { + return 1 + rand.nextInt(1);// 1-2 Valuable + } + return 1;// Young, 1 Valuable + } + + /** + * Checks if the entity's current position is a valid location to spawn this + * entity. + */ + @Override + public boolean getCanSpawnHere() { + return super.getCanSpawnHere() && this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL; + } + + /** + * Will return how many at most can spawn in a chunk at once. + */ + public int getMaxSpawnedInChunk() { + return 1; + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + + nbt.setInteger("FireBreath", fireBreathTick); + nbt.setInteger("FireBreathCooldown", fireBreathTick); + + nbt.setInteger("Breed", getBreed()); + nbt.setInteger("Tier", getTier()); + nbt.setInteger("interestTime", interestTime); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + + fireBreathTick = nbt.getInteger("FireBreath"); + fireBreathCooldown = nbt.getInteger("FireBreathCooldown"); + + setBreed(nbt.getInteger("Breed")); + setTier(nbt.getInteger("Tier")); + interestTime = nbt.getInteger("interestTime"); + + } + + @SideOnly(Side.CLIENT) + public String getTexture() { + return getType().tex; + } + + @SideOnly(Side.CLIENT) + public double wingFlap() { + return wingFlap; + } + + @SideOnly(Side.CLIENT) + public float getJawMove() { + return dataWatcher.getWatchableObjectFloat(dataID + 1); + } + + public void setJawMove(float i) { + dataWatcher.updateObject(dataID + 1, i); + } + + @SideOnly(Side.CLIENT) + public float getNeckAngle() { + return dataWatcher.getWatchableObjectFloat(dataID + 2); + } + + public void setNeckAngle(float i) { + dataWatcher.updateObject(dataID + 2, i); + } + + public int getDisengageTime() { + return dataWatcher.getWatchableObjectInt(dataID + 3); + } + + public void setDisengageTime(int i) { + dataWatcher.updateObject(dataID + 3, i); + } + + @Override + public boolean isTerrestrial() { + return dataWatcher.getWatchableObjectByte(dataID) == 1; + } + + public void setTerrestrial(boolean flag) { + dataWatcher.updateObject(dataID, (byte) (flag ? 1 : 0)); + } + + public double wingAngle() { + return isTerrestrial() ? 0D : 45D; + } + + private void moveToTarget() { + if (getDisengageTime() <= 0 && targetedEntity != null) { + this.faceEntity(targetedEntity, 1F, 1F); + this.waypointX = targetedEntity.posX; + this.waypointY = targetedEntity.posY; + this.waypointZ = targetedEntity.posZ; + } + } + + public void disengage(int time) { + if (targetedEntity != null && targetedEntity instanceof EntityPlayer) { + lastEnemy = targetedEntity; + } + setDisengageTime(time); + setTerrestrial(false); + this.waypointX = this.posX + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.waypointY = this.posY + (this.rand.nextFloat()) * 16.0F; + this.waypointZ = this.posZ + (this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F; + targetedEntity = null; + } + + public DragonBreed getType() { + return DragonBreed.getBreed(getTier(), getBreed()); + } + + public int getBreed() { + return dataWatcher.getWatchableObjectInt(dataID + 4); + } + + public void setBreed(int i) { + dataWatcher.updateObject(dataID + 4, i); + } + + public int getTier() { + return dataWatcher.getWatchableObjectInt(dataID + 5); + } + + public void setTier(int i) { + dataWatcher.updateObject(dataID + 5, i); + } + + public String getCommandSenderName() { + String tierName = StatCollector.translateToLocal("entity." + getType().name + ".name"); + String breedName = StatCollector.translateToLocal("entity.dragonbreed." + getType().breedName + ".name"); + return StatCollector.translateToLocalFormatted(tierName, breedName); + } + + public float getScale() { + return 0.6F + (getTier() * 0.2F); + } + + public Shockwave createShockwave(double x, double y, double z, float power, boolean grief) { + return newShockwave(x, y, z, power, false, grief); + } + + /** + * returns a new explosion. Does initiation (at time of writing Explosion is not + * finished) + */ + public Shockwave newShockwave(double x, double y, double z, float power, boolean fire, boolean smoke) { + Shockwave explosion = new Shockwave("dragonstomp", worldObj, this, x, y, z, power); + explosion.isFlaming = fire; + explosion.isGriefing = worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"); + explosion.isSmoking = smoke; + explosion.initiate(); + explosion.decorateWave(true); + return explosion; + } + + public float getFirePyro() { + if (!ConfigMobs.dragonGriefFire) { + return 0F; + } + return getType().pyro; + } + + @Override + public float getThreshold(DamageSource src) { + if (!src.isUnblockable()) { + return getType().DT; + } + return 0; + } + + @Override + public float[] getHitTraits() { + return new float[]{0, 1, 9};// 90% Piercing, 10% BLunt + } + + @SideOnly(Side.CLIENT) + public float getVertTailAngle() { + if (this.motionY > 0.05F || this.motionY < -0.05F)// accend or decend + { + if (!(this.motionX == 0 && this.motionZ == 0))// moving + { + float angle = (float) (45F * this.motionY) * 5; + if (angle < -45) + angle = -45; + if (angle > 45) + angle = 45; + + return angle; + } + } + return 0; + } + + private boolean canHearEntity(Entity target) { + if (target instanceof EntityLivingBase && PowerArmour.isWearingCogwork((EntityLivingBase) target)) + return true; + + double distance = getDistanceToEntity(target); + + if (distance < width / 2) { + return true;// touching + } + if (distance < 16 && this.getAttackTarget() != null && getAttackTarget() == target) { + return true;// Smell + } + float tarSpeed = (float) Math.hypot(target.motionX, target.motionZ); + + if (tarSpeed < 0.1F) { + return false; + } + if (target instanceof EntityLivingBase) { + return getSound((EntityLivingBase) target, tarSpeed) >= distance; + } + return true; + } + + private double getSound(EntityLivingBase target, float speed) { + float value = 10F * (60F + ArmourCalculator.getTotalWeightOfWorn(target, false)) * speed; + return value; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityFlyingMF.java b/src/main/java/minefantasy/mf2/entity/mob/EntityFlyingMF.java index b4276816..b9d0c4ae 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityFlyingMF.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityFlyingMF.java @@ -5,92 +5,92 @@ import net.minecraft.world.World; public abstract class EntityFlyingMF extends EntityLiving { - public EntityFlyingMF(World world) { - super(world); - } + public EntityFlyingMF(World world) { + super(world); + } - /** - * Called when the mob is falling. Calculates and applies fall damage. - */ - protected void fall(float distance) { - } + /** + * Called when the mob is falling. Calculates and applies fall damage. + */ + protected void fall(float distance) { + } - /** - * Takes in the distance the entity has fallen this tick and whether its on the - * ground to update the fall distance and deal fall damage if landing on the - * ground. Args: distanceFallenThisTick, onGround - */ - protected void updateFallState(double distance, boolean hitground) { - if (isTerrestrial()) { - super.updateFallState(distance, hitground); - } - } + /** + * Takes in the distance the entity has fallen this tick and whether its on the + * ground to update the fall distance and deal fall damage if landing on the + * ground. Args: distanceFallenThisTick, onGround + */ + protected void updateFallState(double distance, boolean hitground) { + if (isTerrestrial()) { + super.updateFallState(distance, hitground); + } + } - /** - * Moves the entity based on the specified heading. Args: strafe, forward - */ - @Override - public void moveEntityWithHeading(float strafe, float forward) { - if (isTerrestrial()) { - super.moveEntityWithHeading(strafe, forward); - return; - } - if (this.isInWater()) { - this.moveFlying(strafe, forward, 0.02F); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.800000011920929D; - this.motionY *= 0.800000011920929D; - this.motionZ *= 0.800000011920929D; - } else if (this.handleLavaMovement()) { - this.moveFlying(strafe, forward, 0.02F); - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.5D; - this.motionY *= 0.5D; - this.motionZ *= 0.5D; - } else { - float f2 = 0.91F; + /** + * Moves the entity based on the specified heading. Args: strafe, forward + */ + @Override + public void moveEntityWithHeading(float strafe, float forward) { + if (isTerrestrial()) { + super.moveEntityWithHeading(strafe, forward); + return; + } + if (this.isInWater()) { + this.moveFlying(strafe, forward, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.800000011920929D; + this.motionY *= 0.800000011920929D; + this.motionZ *= 0.800000011920929D; + } else if (this.handleLavaMovement()) { + this.moveFlying(strafe, forward, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.5D; + this.motionY *= 0.5D; + this.motionZ *= 0.5D; + } else { + float f2 = 0.91F; - if (this.onGround) { - f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), - MathHelper.floor_double(this.boundingBox.minY) - 1, - MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; - } + if (this.onGround) { + f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), + MathHelper.floor_double(this.boundingBox.minY) - 1, + MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; + } - float f3 = 0.16277136F / (f2 * f2 * f2); - this.moveFlying(strafe, forward, this.onGround ? 0.1F * f3 : 0.02F); - f2 = 0.91F; + float f3 = 0.16277136F / (f2 * f2 * f2); + this.moveFlying(strafe, forward, this.onGround ? 0.1F * f3 : 0.02F); + f2 = 0.91F; - if (this.onGround) { - f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), - MathHelper.floor_double(this.boundingBox.minY) - 1, - MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; - } + if (this.onGround) { + f2 = this.worldObj.getBlock(MathHelper.floor_double(this.posX), + MathHelper.floor_double(this.boundingBox.minY) - 1, + MathHelper.floor_double(this.posZ)).slipperiness * 0.91F; + } - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= f2; - this.motionY *= f2; - this.motionZ *= f2; - } + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= f2; + this.motionY *= f2; + this.motionZ *= f2; + } - this.prevLimbSwingAmount = this.limbSwingAmount; - double d1 = this.posX - this.prevPosX; - double d0 = this.posZ - this.prevPosZ; - float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F; + this.prevLimbSwingAmount = this.limbSwingAmount; + double d1 = this.posX - this.prevPosX; + double d0 = this.posZ - this.prevPosZ; + float f4 = MathHelper.sqrt_double(d1 * d1 + d0 * d0) * 4.0F; - if (f4 > 1.0F) { - f4 = 1.0F; - } + if (f4 > 1.0F) { + f4 = 1.0F; + } - this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F; - this.limbSwing += this.limbSwingAmount; - } + this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F; + this.limbSwing += this.limbSwingAmount; + } - /** - * returns true if this entity is by a ladder, false otherwise - */ - public boolean isOnLadder() { - return isTerrestrial() ? super.isOnLadder() : false; - } + /** + * returns true if this entity is by a ladder, false otherwise + */ + public boolean isOnLadder() { + return isTerrestrial() ? super.isOnLadder() : false; + } - public abstract boolean isTerrestrial(); + public abstract boolean isTerrestrial(); } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityHound.java b/src/main/java/minefantasy/mf2/entity/mob/EntityHound.java index a72d1ed1..ca6c3338 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityHound.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityHound.java @@ -11,17 +11,7 @@ import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILeapAtTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIMate; -import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget; -import net.minecraft.entity.ai.EntityAIOwnerHurtTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAITargetNonTamed; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.ai.*; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.monster.EntityGhast; import net.minecraft.entity.passive.EntityAnimal; @@ -41,542 +31,545 @@ import net.minecraft.world.World; public class EntityHound extends EntityTameable { - private float field_70926_e; - private float field_70924_f; - /** true is the wolf is wet else false */ - private boolean isShaking; - private boolean field_70928_h; - /** This time increases while wolf is shaking and emitting water particles. */ - private float timeWolfIsShaking; - private float prevTimeWolfIsShaking; - - public EntityHound(World world) { - super(world); - this.setSize(0.6F, 0.8F); - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(1, new AI_CommonSprint(this, 16.0F)); - this.tasks.addTask(2, this.aiSit); - this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); - this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); - this.tasks.addTask(5, new AI_HoundFollow(this, 1.0D, 6.0F, 2.0F)); - this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(8, new AI_HoundBeg(this, 8.0F)); - this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(9, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); - this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); - this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); - - this.setTamed(false); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); - - if (this.isTamed()) { - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); - } else { - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D); - } - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - public boolean isAIEnabled() { - return true; - } - - /** - * Sets the active target the Task system uses for tracking - */ - @Override - public void setAttackTarget(EntityLivingBase target) { - super.setAttackTarget(target); - - if (target == null) { - this.setAngry(false); - } else if (!this.isTamed()) { - this.setAngry(true); - } - } - - /** - * main AI tick function, replaces updateEntityActionState - */ - @Override - protected void updateAITick() { - this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.dataWatcher.addObject(18, new Float(this.getHealth())); - this.dataWatcher.addObject(19, new Byte((byte) 0)); - this.dataWatcher.addObject(20, new Byte((byte) BlockColored.func_150032_b(1))); - } - - @Override - protected void func_145780_a(int x, int y, int z, Block surface) { - this.playSound("mob.wolf.step", 0.15F, 1.0F); - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - super.writeEntityToNBT(nbt); - nbt.setBoolean("Angry", this.isAngry()); - nbt.setByte("CollarColor", (byte) this.getCollarColor()); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - super.readEntityFromNBT(nbt); - this.setAngry(nbt.getBoolean("Angry")); - - if (nbt.hasKey("CollarColor", 99)) { - this.setCollarColor(nbt.getByte("CollarColor")); - } - } - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() { - return this.isAngry() ? "mob.wolf.growl" - : (this.rand.nextInt(3) == 0 - ? (this.isTamed() && this.dataWatcher.getWatchableObjectFloat(18) < 10.0F ? "mob.wolf.whine" - : "mob.wolf.panting") - : "mob.wolf.bark"); - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() { - return "mob.wolf.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() { - return "mob.wolf.death"; - } - - /** - * Returns the volume for the sounds this mob makes. - */ - @Override - protected float getSoundVolume() { - return 0.4F; - } - - @Override - protected Item getDropItem() { - return Item.getItemById(-1); - } - - /** - * Called frequently so the entity can update its state every tick as required. - * For example, zombies and skeletons use this to react to sunlight and start to - * burn. - */ - @Override - public void onLivingUpdate() { - super.onLivingUpdate(); - - if (!this.worldObj.isRemote && this.isShaking && !this.field_70928_h && !this.hasPath() && this.onGround) { - this.field_70928_h = true; - this.timeWolfIsShaking = 0.0F; - this.prevTimeWolfIsShaking = 0.0F; - this.worldObj.setEntityState(this, (byte) 8); - } - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() { - super.onUpdate(); - this.field_70924_f = this.field_70926_e; - - if (this.func_70922_bv()) { - this.field_70926_e += (1.0F - this.field_70926_e) * 0.4F; - } else { - this.field_70926_e += (0.0F - this.field_70926_e) * 0.4F; - } - - if (this.func_70922_bv()) { - this.numTicksToChaseTarget = 10; - } - - if (this.isWet()) { - this.isShaking = true; - this.field_70928_h = false; - this.timeWolfIsShaking = 0.0F; - this.prevTimeWolfIsShaking = 0.0F; - } else if ((this.isShaking || this.field_70928_h) && this.field_70928_h) { - if (this.timeWolfIsShaking == 0.0F) { - this.playSound("mob.wolf.shake", this.getSoundVolume(), - (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); - } - - this.prevTimeWolfIsShaking = this.timeWolfIsShaking; - this.timeWolfIsShaking += 0.05F; - - if (this.prevTimeWolfIsShaking >= 2.0F) { - this.isShaking = false; - this.field_70928_h = false; - this.prevTimeWolfIsShaking = 0.0F; - this.timeWolfIsShaking = 0.0F; - } - - if (this.timeWolfIsShaking > 0.4F) { - float f = (float) this.boundingBox.minY; - int i = (int) (MathHelper.sin((this.timeWolfIsShaking - 0.4F) * (float) Math.PI) * 7.0F); - - for (int j = 0; j < i; ++j) { - float f1 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; - float f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; - this.worldObj.spawnParticle("splash", this.posX + f1, f + 0.8F, this.posZ + f2, this.motionX, - this.motionY, this.motionZ); - } - } - } - } - - @SideOnly(Side.CLIENT) - public boolean getWolfShaking() { - return this.isShaking; - } - - /** - * Used when calculating the amount of shading to apply while the wolf is - * shaking. - */ - @SideOnly(Side.CLIENT) - public float getShadingWhileShaking(float p_70915_1_) { - return 0.75F + (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70915_1_) - / 2.0F * 0.25F; - } - - @SideOnly(Side.CLIENT) - public float getShakeAngle(float p_70923_1_, float p_70923_2_) { - float f2 = (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70923_1_ - + p_70923_2_) / 1.8F; - - if (f2 < 0.0F) { - f2 = 0.0F; - } else if (f2 > 1.0F) { - f2 = 1.0F; - } - - return MathHelper.sin(f2 * (float) Math.PI) * MathHelper.sin(f2 * (float) Math.PI * 11.0F) * 0.15F - * (float) Math.PI; - } - - @Override - public float getEyeHeight() { - return this.height * 0.8F; - } - - @SideOnly(Side.CLIENT) - public float getInterestedAngle(float p_70917_1_) { - return (this.field_70924_f + (this.field_70926_e - this.field_70924_f) * p_70917_1_) * 0.15F * (float) Math.PI; - } - - /** - * The speed it takes to move the entityliving's rotationPitch through the - * faceEntity method. This is only currently use in wolves. - */ - @Override - public int getVerticalFaceSpeed() { - return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); - } - - /** - * Called when the entity is attacked. - */ - @Override - public boolean attackEntityFrom(DamageSource source, float dam) { - if (this.isEntityInvulnerable()) { - return false; - } else { - Entity entity = source.getEntity(); - this.aiSit.setSitting(false); - - if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) { - dam = (dam + 1.0F) / 2.0F; - } - - return super.attackEntityFrom(source, dam); - } - } - - @Override - public boolean attackEntityAsMob(Entity target) { - int i = this.isTamed() ? 4 : 2; - return target.attackEntityFrom(DamageSource.causeMobDamage(this), i); - } - - @Override - public void setTamed(boolean flag) { - super.setTamed(flag); - - if (flag) { - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); - } else { - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D); - } - } - - /** - * Called when a player interacts with a mob. e.g. gets milk from a cow, gets - * into the saddle on a pig. - */ - @Override - public boolean interact(EntityPlayer user) { - ItemStack itemstack = user.inventory.getCurrentItem(); - - if (this.isTamed()) { - if (itemstack != null) { - if (itemstack.getItem() instanceof ItemFood) { - ItemFood itemfood = (ItemFood) itemstack.getItem(); - - if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < 20.0F) { - if (!user.capabilities.isCreativeMode) { - --itemstack.stackSize; - } - - this.heal(itemfood.func_150905_g(itemstack)); - - if (itemstack.stackSize <= 0) { - user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack) null); - } - - return true; - } - } else if (itemstack.getItem() == Items.dye) { - int i = BlockColored.func_150032_b(itemstack.getItemDamage()); - - if (i != this.getCollarColor()) { - this.setCollarColor(i); - - if (!user.capabilities.isCreativeMode && --itemstack.stackSize <= 0) { - user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack) null); - } - - return true; - } - } - } - - if (this.func_152114_e(user) && !this.worldObj.isRemote && !this.isBreedingItem(itemstack)) { - this.aiSit.setSitting(!this.isSitting()); - this.isJumping = false; - this.setPathToEntity((PathEntity) null); - this.setTarget((Entity) null); - this.setAttackTarget((EntityLivingBase) null); - } - } else if (itemstack != null && itemstack.getItem() == Items.bone && !this.isAngry()) { - if (!user.capabilities.isCreativeMode) { - --itemstack.stackSize; - } - - if (itemstack.stackSize <= 0) { - user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack) null); - } - - if (!this.worldObj.isRemote) { - if (this.rand.nextInt(3) == 0) { - this.setTamed(true); - this.setPathToEntity((PathEntity) null); - this.setAttackTarget((EntityLivingBase) null); - this.aiSit.setSitting(true); - this.setHealth(20.0F); - this.func_152115_b(user.getUniqueID().toString()); - this.playTameEffect(true); - this.worldObj.setEntityState(this, (byte) 7); - } else { - this.playTameEffect(false); - this.worldObj.setEntityState(this, (byte) 6); - } - } - - return true; - } - - return super.interact(user); - } - - @SideOnly(Side.CLIENT) - @Override - public void handleHealthUpdate(byte id) { - if (id == 8) { - this.field_70928_h = true; - this.timeWolfIsShaking = 0.0F; - this.prevTimeWolfIsShaking = 0.0F; - } else { - super.handleHealthUpdate(id); - } - } - - @SideOnly(Side.CLIENT) - public float getTailRotation() { - return this.isAngry() ? 1.5393804F - : (this.isTamed() - ? (0.55F - (20.0F - this.dataWatcher.getWatchableObjectFloat(18)) * 0.02F) * (float) Math.PI - : ((float) Math.PI / 5F)); - } - - /** - * Checks if the parameter is an item which this animal can be fed to breed it - * (wheat, carrots or seeds depending on the animal type) - */ - @Override - public boolean isBreedingItem(ItemStack item) { - return item == null ? false - : (!(item.getItem() instanceof ItemFood) ? false : ((ItemFood) item.getItem()).isWolfsFavoriteMeat()); - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - @Override - public int getMaxSpawnedInChunk() { - return 8; - } - - /** - * Determines whether this wolf is angry or not. - */ - public boolean isAngry() { - return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; - } - - /** - * Sets whether this wolf is angry or not. - */ - public void setAngry(boolean flag) { - byte b0 = this.dataWatcher.getWatchableObjectByte(16); - - if (flag) { - this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); - } else { - this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); - } - } - - /** - * Return this wolf's collar color. - */ - public int getCollarColor() { - return this.dataWatcher.getWatchableObjectByte(20) & 15; - } - - /** - * Set this wolf's collar color. - */ - public void setCollarColor(int colour) { - this.dataWatcher.updateObject(20, Byte.valueOf((byte) (colour & 15))); - } - - @Override - public EntityHound createChild(EntityAgeable parent) { - EntityHound entitywolf = new EntityHound(this.worldObj); - String s = this.func_152113_b(); - - if (s != null && s.trim().length() > 0) { - entitywolf.func_152115_b(s); - entitywolf.setTamed(true); - } - - return entitywolf; - } - - public void func_70918_i(boolean flag) { - if (flag) { - this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); - } else { - this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); - } - } - - /** - * Returns true if the mob is currently able to mate with the specified mob. - */ - @Override - public boolean canMateWith(EntityAnimal mate) { - if (mate == this) { - return false; - } else if (!this.isTamed()) { - return false; - } else if (!(mate instanceof EntityHound)) { - return false; - } else { - EntityHound entitywolf = (EntityHound) mate; - return !entitywolf.isTamed() ? false - : (entitywolf.isSitting() ? false : this.isInLove() && entitywolf.isInLove()); - } - } - - public boolean func_70922_bv() { - return this.dataWatcher.getWatchableObjectByte(19) == 1; - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() { - return !this.isTamed() && this.ticksExisted > 2400; - } - - @Override - public boolean func_142018_a(EntityLivingBase target, EntityLivingBase owner) { - if (!(target instanceof EntityCreeper) && !(target instanceof EntityGhast)) { - if (target instanceof EntityHound) { - EntityHound entitywolf = (EntityHound) target; - - if (entitywolf.isTamed() && entitywolf.getOwner() == owner) { - return false; - } - } - - return target instanceof EntityPlayer && owner instanceof EntityPlayer - && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) target) ? false - : !(target instanceof EntityHorse) || !((EntityHorse) target).isTame(); - } else { - return false; - } - } - - // Animations - public float jawMove; - public int eatAnimation; - - public String getTexture() { - return "hound"; - } - - public boolean shouldFollowOwner() { - return true; - } + // Animations + public float jawMove; + public int eatAnimation; + private float field_70926_e; + private float field_70924_f; + /** + * true is the wolf is wet else false + */ + private boolean isShaking; + private boolean field_70928_h; + /** + * This time increases while wolf is shaking and emitting water particles. + */ + private float timeWolfIsShaking; + private float prevTimeWolfIsShaking; + + public EntityHound(World world) { + super(world); + this.setSize(0.6F, 0.8F); + this.getNavigator().setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + this.tasks.addTask(1, new AI_CommonSprint(this, 16.0F)); + this.tasks.addTask(2, this.aiSit); + this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(5, new AI_HoundFollow(this, 1.0D, 6.0F, 2.0F)); + this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + this.tasks.addTask(8, new AI_HoundBeg(this, 8.0F)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); + this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); + this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); + + this.setTamed(false); + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); + + if (this.isTamed()) { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); + } else { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D); + } + } + + /** + * Returns true if the newer Entity AI code should be run + */ + @Override + public boolean isAIEnabled() { + return true; + } + + /** + * Sets the active target the Task system uses for tracking + */ + @Override + public void setAttackTarget(EntityLivingBase target) { + super.setAttackTarget(target); + + if (target == null) { + this.setAngry(false); + } else if (!this.isTamed()) { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + @Override + protected void updateAITick() { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + @Override + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + this.dataWatcher.addObject(20, new Byte((byte) BlockColored.func_150032_b(1))); + } + + @Override + protected void func_145780_a(int x, int y, int z, Block surface) { + this.playSound("mob.wolf.step", 0.15F, 1.0F); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setBoolean("Angry", this.isAngry()); + nbt.setByte("CollarColor", (byte) this.getCollarColor()); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + this.setAngry(nbt.getBoolean("Angry")); + + if (nbt.hasKey("CollarColor", 99)) { + this.setCollarColor(nbt.getByte("CollarColor")); + } + } + + /** + * Returns the sound this mob makes while it's alive. + */ + @Override + protected String getLivingSound() { + return this.isAngry() ? "mob.wolf.growl" + : (this.rand.nextInt(3) == 0 + ? (this.isTamed() && this.dataWatcher.getWatchableObjectFloat(18) < 10.0F ? "mob.wolf.whine" + : "mob.wolf.panting") + : "mob.wolf.bark"); + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + @Override + protected String getHurtSound() { + return "mob.wolf.hurt"; + } + + /** + * Returns the sound this mob makes on death. + */ + @Override + protected String getDeathSound() { + return "mob.wolf.death"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + @Override + protected float getSoundVolume() { + return 0.4F; + } + + @Override + protected Item getDropItem() { + return Item.getItemById(-1); + } + + /** + * Called frequently so the entity can update its state every tick as required. + * For example, zombies and skeletons use this to react to sunlight and start to + * burn. + */ + @Override + public void onLivingUpdate() { + super.onLivingUpdate(); + + if (!this.worldObj.isRemote && this.isShaking && !this.field_70928_h && !this.hasPath() && this.onGround) { + this.field_70928_h = true; + this.timeWolfIsShaking = 0.0F; + this.prevTimeWolfIsShaking = 0.0F; + this.worldObj.setEntityState(this, (byte) 8); + } + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + super.onUpdate(); + this.field_70924_f = this.field_70926_e; + + if (this.func_70922_bv()) { + this.field_70926_e += (1.0F - this.field_70926_e) * 0.4F; + } else { + this.field_70926_e += (0.0F - this.field_70926_e) * 0.4F; + } + + if (this.func_70922_bv()) { + this.numTicksToChaseTarget = 10; + } + + if (this.isWet()) { + this.isShaking = true; + this.field_70928_h = false; + this.timeWolfIsShaking = 0.0F; + this.prevTimeWolfIsShaking = 0.0F; + } else if ((this.isShaking || this.field_70928_h) && this.field_70928_h) { + if (this.timeWolfIsShaking == 0.0F) { + this.playSound("mob.wolf.shake", this.getSoundVolume(), + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); + } + + this.prevTimeWolfIsShaking = this.timeWolfIsShaking; + this.timeWolfIsShaking += 0.05F; + + if (this.prevTimeWolfIsShaking >= 2.0F) { + this.isShaking = false; + this.field_70928_h = false; + this.prevTimeWolfIsShaking = 0.0F; + this.timeWolfIsShaking = 0.0F; + } + + if (this.timeWolfIsShaking > 0.4F) { + float f = (float) this.boundingBox.minY; + int i = (int) (MathHelper.sin((this.timeWolfIsShaking - 0.4F) * (float) Math.PI) * 7.0F); + + for (int j = 0; j < i; ++j) { + float f1 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; + float f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; + this.worldObj.spawnParticle("splash", this.posX + f1, f + 0.8F, this.posZ + f2, this.motionX, + this.motionY, this.motionZ); + } + } + } + } + + @SideOnly(Side.CLIENT) + public boolean getWolfShaking() { + return this.isShaking; + } + + /** + * Used when calculating the amount of shading to apply while the wolf is + * shaking. + */ + @SideOnly(Side.CLIENT) + public float getShadingWhileShaking(float p_70915_1_) { + return 0.75F + (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70915_1_) + / 2.0F * 0.25F; + } + + @SideOnly(Side.CLIENT) + public float getShakeAngle(float p_70923_1_, float p_70923_2_) { + float f2 = (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70923_1_ + + p_70923_2_) / 1.8F; + + if (f2 < 0.0F) { + f2 = 0.0F; + } else if (f2 > 1.0F) { + f2 = 1.0F; + } + + return MathHelper.sin(f2 * (float) Math.PI) * MathHelper.sin(f2 * (float) Math.PI * 11.0F) * 0.15F + * (float) Math.PI; + } + + @Override + public float getEyeHeight() { + return this.height * 0.8F; + } + + @SideOnly(Side.CLIENT) + public float getInterestedAngle(float p_70917_1_) { + return (this.field_70924_f + (this.field_70926_e - this.field_70924_f) * p_70917_1_) * 0.15F * (float) Math.PI; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the + * faceEntity method. This is only currently use in wolves. + */ + @Override + public int getVerticalFaceSpeed() { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + @Override + public boolean attackEntityFrom(DamageSource source, float dam) { + if (this.isEntityInvulnerable()) { + return false; + } else { + Entity entity = source.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) { + dam = (dam + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(source, dam); + } + } + + @Override + public boolean attackEntityAsMob(Entity target) { + int i = this.isTamed() ? 4 : 2; + return target.attackEntityFrom(DamageSource.causeMobDamage(this), i); + } + + @Override + public void setTamed(boolean flag) { + super.setTamed(flag); + + if (flag) { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); + } else { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets + * into the saddle on a pig. + */ + @Override + public boolean interact(EntityPlayer user) { + ItemStack itemstack = user.inventory.getCurrentItem(); + + if (this.isTamed()) { + if (itemstack != null) { + if (itemstack.getItem() instanceof ItemFood) { + ItemFood itemfood = (ItemFood) itemstack.getItem(); + + if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < 20.0F) { + if (!user.capabilities.isCreativeMode) { + --itemstack.stackSize; + } + + this.heal(itemfood.func_150905_g(itemstack)); + + if (itemstack.stackSize <= 0) { + user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } else if (itemstack.getItem() == Items.dye) { + int i = BlockColored.func_150032_b(itemstack.getItemDamage()); + + if (i != this.getCollarColor()) { + this.setCollarColor(i); + + if (!user.capabilities.isCreativeMode && --itemstack.stackSize <= 0) { + user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } + } + + if (this.func_152114_e(user) && !this.worldObj.isRemote && !this.isBreedingItem(itemstack)) { + this.aiSit.setSitting(!this.isSitting()); + this.isJumping = false; + this.setPathToEntity((PathEntity) null); + this.setTarget((Entity) null); + this.setAttackTarget((EntityLivingBase) null); + } + } else if (itemstack != null && itemstack.getItem() == Items.bone && !this.isAngry()) { + if (!user.capabilities.isCreativeMode) { + --itemstack.stackSize; + } + + if (itemstack.stackSize <= 0) { + user.inventory.setInventorySlotContents(user.inventory.currentItem, (ItemStack) null); + } + + if (!this.worldObj.isRemote) { + if (this.rand.nextInt(3) == 0) { + this.setTamed(true); + this.setPathToEntity((PathEntity) null); + this.setAttackTarget((EntityLivingBase) null); + this.aiSit.setSitting(true); + this.setHealth(20.0F); + this.func_152115_b(user.getUniqueID().toString()); + this.playTameEffect(true); + this.worldObj.setEntityState(this, (byte) 7); + } else { + this.playTameEffect(false); + this.worldObj.setEntityState(this, (byte) 6); + } + } + + return true; + } + + return super.interact(user); + } + + @SideOnly(Side.CLIENT) + @Override + public void handleHealthUpdate(byte id) { + if (id == 8) { + this.field_70928_h = true; + this.timeWolfIsShaking = 0.0F; + this.prevTimeWolfIsShaking = 0.0F; + } else { + super.handleHealthUpdate(id); + } + } + + @SideOnly(Side.CLIENT) + public float getTailRotation() { + return this.isAngry() ? 1.5393804F + : (this.isTamed() + ? (0.55F - (20.0F - this.dataWatcher.getWatchableObjectFloat(18)) * 0.02F) * (float) Math.PI + : ((float) Math.PI / 5F)); + } + + /** + * Checks if the parameter is an item which this animal can be fed to breed it + * (wheat, carrots or seeds depending on the animal type) + */ + @Override + public boolean isBreedingItem(ItemStack item) { + return item == null ? false + : (!(item.getItem() instanceof ItemFood) ? false : ((ItemFood) item.getItem()).isWolfsFavoriteMeat()); + } + + /** + * Will return how many at most can spawn in a chunk at once. + */ + @Override + public int getMaxSpawnedInChunk() { + return 8; + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean flag) { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (flag) { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int colour) { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (colour & 15))); + } + + @Override + public EntityHound createChild(EntityAgeable parent) { + EntityHound entitywolf = new EntityHound(this.worldObj); + String s = this.func_152113_b(); + + if (s != null && s.trim().length() > 0) { + entitywolf.func_152115_b(s); + entitywolf.setTamed(true); + } + + return entitywolf; + } + + public void func_70918_i(boolean flag) { + if (flag) { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + @Override + public boolean canMateWith(EntityAnimal mate) { + if (mate == this) { + return false; + } else if (!this.isTamed()) { + return false; + } else if (!(mate instanceof EntityHound)) { + return false; + } else { + EntityHound entitywolf = (EntityHound) mate; + return !entitywolf.isTamed() ? false + : (entitywolf.isSitting() ? false : this.isInLove() && entitywolf.isInLove()); + } + } + + public boolean func_70922_bv() { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + @Override + protected boolean canDespawn() { + return !this.isTamed() && this.ticksExisted > 2400; + } + + @Override + public boolean func_142018_a(EntityLivingBase target, EntityLivingBase owner) { + if (!(target instanceof EntityCreeper) && !(target instanceof EntityGhast)) { + if (target instanceof EntityHound) { + EntityHound entitywolf = (EntityHound) target; + + if (entitywolf.isTamed() && entitywolf.getOwner() == owner) { + return false; + } + } + + return target instanceof EntityPlayer && owner instanceof EntityPlayer + && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) target) ? false + : !(target instanceof EntityHorse) || !((EntityHorse) target).isTame(); + } else { + return false; + } + } + + public String getTexture() { + return "hound"; + } + + public boolean shouldFollowOwner() { + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java index 7a7cec70..ed54a1e4 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java @@ -19,18 +19,8 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockCrops; import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -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.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.*; +import net.minecraft.entity.ai.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.Item; @@ -42,691 +32,686 @@ import net.minecraft.world.World; public class EntityMinotaur extends EntityMobMF implements IArmourPenetrationMob, ISpecialCombatMob { - public int swing; - private int grabCooldown; - private int hitCooldownTime; - - public EntityMinotaur(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(4, new EntityAIAttackOnCollide(this, EntityLivingBase.class, 1.0D, true)); - this.tasks.addTask(5, new EntityAIMoveTowardsRestriction(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWander(this, 0.5D)); - this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 12.0F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new AI_MinotaurFindTarget(this, EntityPlayer.class, 0, true)); - - this.setSize(1.5F, 2.5F); - this.stepHeight = 1.0F; - this.experienceValue = 40; - - for (int i = 0; i < this.equipmentDropChances.length; ++i) { - this.equipmentDropChances[i] = 1F; - } - } - - public void worldGenTier(int species, int tier) { - setMob(species, tier); - setLoadout(); - if (tier > 0) { - this.setHomeArea((int) posX, (int) posY, (int) posZ, getRange(tier)); - } - } - - private int getRange(int tier) { - return tier > 1 ? 12 : 24; - } - - @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { - int species = MinotaurBreed.getEnvironment(this); - - setMob(species, 0); - setLoadout(); - return super.onSpawnWithEgg(data); - } - - public void setLoadout() { - String tier = getMinotaur().weaponTier; - if (tier != null) { - this.setCurrentItemOrArmor(0, getRandomWeapon().construct(tier, "OakWood")); - } - } - - public ItemWeaponMF getRandomWeapon() { - if (getTier() == 3) { - return OrnateStyle.ornate_greatsword; - } - ItemWeaponMF[] list = new ItemWeaponMF[] { CustomToolListMF.standard_greatsword, - CustomToolListMF.standard_katana, CustomToolListMF.standard_battleaxe, - CustomToolListMF.standard_warhammer, CustomToolListMF.standard_spear, - CustomToolListMF.standard_halbeard }; - return list[rand.nextInt(list.length)]; - } - - @Override - public String getCommandSenderName() { - return StatCollector.translateToLocal("entity." + getMinotaur().name + ".name"); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(24.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.35F); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(ConfigMobs.minotaurMD); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(ConfigMobs.minotaurHP); - } - - @Override - protected boolean isAIEnabled() { - return true; - } - - private static final int dataID = 12; - - protected void entityInit() { - super.entityInit(); - this.dataWatcher.addObject(dataID, Byte.valueOf((byte) 0)); - this.dataWatcher.addObject(dataID + 1, Integer.valueOf((byte) 1)); - this.dataWatcher.addObject(dataID + 2, Integer.valueOf(2)); - this.dataWatcher.addObject(dataID + 3, Integer.valueOf(0)); - } - - @Override - public float getBlockPathWeight(int x, int y, int z) { - return super.getBlockPathWeight(x, y, z); - } - - @Override - public void onUpdate() { - super.onUpdate(); - - if (!worldObj.isRemote) { - if (getRageLevel() == 0 && getAttackTarget() == null) { - if (ticksExisted % 40 == 0) { - forage(); - } - } - if (ticksExisted % 20 == 0) { - if (!isBloodied()) { - if (getRageVariable() > 0) { - addRage(-1); - if (getRageVariable() > 50) { - setRage(50); - } - } - } - } - if (hitCooldownTime > 0) - --hitCooldownTime; - if (grabCooldown > 0) { - --grabCooldown; - } - if (specialAttackTime > 0) { - --specialAttackTime; - } - if ((getAttack() == (byte) 1 || getAttack() == (byte) 3) && specialAttackTime == 0) { - initBasicAttack(); - } - if (this.getAttackTarget() != null) { - if (getRageLevel() > 20 && getAttack() != (byte) 2 && getHeldItem() == null && rand.nextInt(100) == 0) { - this.initHeadbutt(); - } - EntityLivingBase target = getAttackTarget(); - int intLvl = getIntLvl(); - - if (intLvl > 0)// Smarter means more likely - { - if (getAttack() != 2 && rand.nextInt(10) < intLvl && onGround && target instanceof EntityPlayer - && ((EntityPlayer) target).isBlocking() && this.getDistanceToEntity(target) < 4F) { - this.jump(); - this.initPowerAttack(); - } - } else { - if (getRageLevel() > 40 && getAttack() != 2 && rand.nextInt(50) == 0 && onGround - && target instanceof EntityPlayer && ((EntityPlayer) target).isBlocking() - && this.getDistanceToEntity(target) < 4F) { - this.jump(); - this.initPowerAttack(); - } - } - double distance = this.getDistanceSqToEntity(target); - if (!TacticalManager.isFlankedBy(target, this, 270) && distance > 6 && distance < 12 - && rand.nextInt(50) == 0 && this.getAttack() == (byte) 0 && this.getMinotaur().throwsBombs) { - this.throwBomb(target, 1.0F); - } - - if (this.ticksExisted % 20 == 0 && (getRageLevel() <= 0 || !canEntityBeSeen(getAttackTarget()))) { - if (rand.nextInt(50 + (50 * getIntLvl())) == 0) { - this.setAttackTarget(null); - } - } - } - - boolean inBeserk = getRageLevel() >= 100 && isBloodied(); - if (getAttack() == (byte) 2) { - if (!inBeserk) { - initBasicAttack(); - } else { - this.swingItem(); - } - } - if (getAttack() != (byte) 2 && inBeserk) { - initBeserk(); - } - } - } - - private void forage() { - if (rand.nextInt(100) == 0) { - int radius = 8; - for (int x = -radius; x <= radius; x++) { - for (int y = -2; y <= 2; y++) { - for (int z = -radius; z <= radius; z++) { - int xPos = (int) posX + x; - int yPos = (int) posY + y; - int zPos = (int) posZ + z; - if (rand.nextInt(10) == 0) { - if (worldObj.getBlock(xPos, yPos, zPos) == BlockListMF.berryBush - && worldObj.getBlockMetadata(xPos, yPos, zPos) == 0) { - getNavigator().tryMoveToXYZ(xPos + 0.5, yPos + 1, zPos + 0.5, 0.6F); - return; - } - if (worldObj.getBlock(xPos, yPos, zPos) instanceof BlockCrops - && worldObj.getBlockMetadata(xPos, yPos, zPos) >= 4) { - getNavigator().tryMoveToXYZ(xPos + 0.5, yPos + 1, zPos + 0.5, 0.6F); - return; - } - } - } - } - } - return; - } - if (worldObj.getBlock((int) posX, (int) posY, (int) posZ) == BlockListMF.berryBush - && worldObj.getBlockMetadata((int) posX, (int) posY, (int) posZ) == 0) { - worldObj.playSoundEffect(posX, posY + getEyeHeight(), posZ, "random.eat", 1.0F, 0.75F); - swingItem(); - heal(10); - worldObj.setBlockMetadataWithNotify((int) posX, (int) posY, (int) posZ, 1, 2); - } else if (worldObj.getBlock((int) posX, (int) posY, (int) posZ) instanceof BlockCrops - && worldObj.getBlockMetadata((int) posX, (int) posY, (int) posZ) > 0) { - worldObj.playSoundEffect(posX, posY + getEyeHeight(), posZ, "random.eat", 1.0F, 0.75F); - worldObj.playSoundEffect(posX, posY + getEyeHeight(), posZ, "dig.grass", 1.0F, 1.00F); - swingItem(); - heal(5); - worldObj.setBlockToAir((int) posX, (int) posY, (int) posZ); - } - } - - @Override - protected void dropFewItems(boolean playerKill, int looting) { - int count = getLootCount() == 1 ? 1 : rand.nextInt(looting + getLootCount() + 1); - for (int a = 0; a < count; a++) { - Item drop = getLoot(); - this.dropItem(drop, 1); - } - count = rand.nextInt(looting + 4) + 1; - for (int a = 0; a < count; a++) { - this.dropItem(ComponentListMF.rawhideLarge, 1); - } - count = rand.nextInt(looting + 2) + 1; - for (int a = 0; a < count; a++) { - this.dropItem(isBurning() ? Items.cooked_beef : Items.beef, 1); - } - } - - private Item getLoot() { - int breed = getTier(); - if (breed > 2) { - return ToolListMF.loot_sack_rare; - } - if (breed > 0) { - return ToolListMF.loot_sack_uc; - } - return ToolListMF.loot_sack; - } - - private int getLootCount() { - int breed = getTier(); - if (breed > 2) { - return 1; - } - return 2 + breed; - } - - @Override - public boolean attackEntityFrom(DamageSource source, float damage) { - if (!super.attackEntityFrom(source, damage)) { - return false; - } else { - Entity entity = source.getEntity(); - if (entity != null) { - addRage(this.getIntLvl() >= 1 ? (int) (damage / 2) : (int) damage); - } - } - return true; - } - - public void initBeserk() { - TacticalManager.tryDisarm(this); - // this.playSound("minefantasy2:mob.minotaur.beserk", 1.0F, 1.0F); - setSprinting(true); - setAttack((byte) 2); - } - - public void initPowerAttack() { - setSprinting(true); - specialAttackTime = 30; - hitCooldownTime = 0; - setAttack((byte) 3); - } - - public void initHeadbutt() { - setSprinting(true); - specialAttackTime = 20; - this.hitCooldownTime = 0; - setAttack((byte) 1); - } - - public void initBasicAttack() { - setSprinting(false); - specialAttackTime = 0; - setAttack((byte) 0); - } - - @Override - protected String getLivingSound() { - return "mob.cow.say"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() { - return "mob.cow.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() { - return "minefantasy2:mob.minotaur.death"; - } - - @Override - public float getSoundPitch() { - return 0.5F; - } - - protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) { - this.playSound("mob.cow.step", 0.75F, 0.9F); - } - - protected Item getDropItem() { - return ComponentListMF.hideLarge; - } - - public double getHeadChargeAngle() { - return getAttack() == (byte) 1 ? 80F : 0F; - } - - public float getArmourRating(DamageSource src) { - float[] armour = getValueResistences(); - return (getMinotaur().armour_rating / 100F) - * ArmourCalculator.adjustACForDamage(src, getDT(), armour[0], armour[1], armour[2]); - } - - @Override - protected void damageEntity(DamageSource source, float dam) { - float AR = 1.0F + Math.max(0.0F, getArmourRating(source)); - - super.damageEntity(source, dam / AR); - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - super.writeEntityToNBT(nbt); - - nbt.setInteger("Attack", getAttack()); - nbt.setInteger("Species", getSpecies()); - nbt.setInteger("Breed", getTier()); - nbt.setInteger("Rage", getRageVariable()); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - super.readEntityFromNBT(nbt); - - setAttack((byte) nbt.getInteger("Attack")); - int species = nbt.getInteger("Species"); - int breed = nbt.getInteger("Breed"); - setMob(species, breed); - - setRage(nbt.getInteger("Rage")); - } - - private float getDT() { - byte att = getAttack(); - if (att == (byte) 2) { - return 5F; - } - return 2F; - } - - /** - * Cutting, Blunt, Piercing - */ - private float[] getValueResistences() { - return new float[] { 0.75F, 1F, 0.5F }; - } - - /** - * 0=Normal, 1=Headbutt, 2=Beserk, 3=Power - */ - public byte getAttack() { - return dataWatcher.getWatchableObjectByte(dataID); - } - - /** - * 0=Normal, 1=Headbutt, 2=Beserk, 3=Power - */ - public void setAttack(byte type) { - dataWatcher.updateObject(dataID, type); - } - - /** - * @param species - * Brown, Snow, Nether - * @param subspecies - * the tier such as normal, warlord, etc - */ - public void setMob(int species, int subspecies) { - MinotaurBreed minotaur = MinotaurBreed.getBreed(species, subspecies); - - setSpecies(species); - setTier(subspecies); - - this.preventEntitySpawning = minotaur.isSpecial; - this.isImmuneToFire = species == 1; - this.experienceValue = minotaur.experienceValue; - - if (subspecies == 0) { - this.targetTasks.addTask(2, new AI_MinotaurFindTarget(this, EntityLiving.class, 0, false)); - } - if (subspecies >= 3) { - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(16.0D); - } - } - - @Override - protected boolean canDespawn() { - return !getMinotaur().isSpecial; - } - - /** - * 0=Normal, 1=Nether - */ - public int getSpecies() { - return dataWatcher.getWatchableObjectInt(dataID + 1); - } - - /** - * 0=Normal, 1=Nether - */ - public void setSpecies(int type) { - dataWatcher.updateObject(dataID + 1, type); - - } - - public int getTier() { - return dataWatcher.getWatchableObjectInt(dataID + 2); - } - - public void setTier(int type) { - dataWatcher.updateObject(dataID + 2, type); - } - - private int specialAttackTime; - - private float[] punch = new float[] { 0F, 1F, 0F }; - private float[] headbutt = new float[] { 0F, 1F, 4F }; - - @Override - public float[] getHitTraits() { - byte att = getAttack(); - if (att == (byte) 1) { - return headbutt; - } - return punch; - } - - @Override - public boolean attackEntityAsMob(Entity target) { - if (worldObj.difficultySetting == EnumDifficulty.PEACEFUL && target instanceof EntityPlayer) { - return false; - } - // if(hitCooldownTime > 0)return false; - - if (!canEntityBeSeen(target)) { - return false; - } - if (getAttack() == 3 && motionY > 0 && target.posY < posY) { - return false; - } - - float dam = getHitDamage(); - - if (getRageLevel() > 50) { - addRage((int) (dam * 1.5)); - } - if (getAttack() == 2 && this.riddenByEntity != null && this.riddenByEntity == target) { - if (target instanceof EntityLivingBase && rand.nextInt(4) == 0) { - ArmourCalculator.damageArmour((EntityLivingBase) target, (int) (dam * 0.25F)); - } - } - if (this.riddenByEntity == null) { - if (grabCooldown <= 0 && rand.nextInt(100) < getGrabChance() && canPickUp(target)) { - target.mountEntity(this); - } - } else if (rand.nextInt(100) < ConfigMobs.minotaurTC && riddenByEntity == target) { - riddenByEntity.mountEntity(null); - grabCooldown = 60; - TacticalManager.knockbackEntity(target, this, 4F, 1F); - } - if (getAttack() == 3 && fallDistance > 0 && target instanceof EntityPlayer - && ((EntityPlayer) target).isBlocking() && rand.nextInt(100) < getDisarmChance()) { - TacticalManager.tryDisarm(this, (EntityLivingBase) target, true); - } - - int i = getKnockbackBoost(); - - if (target instanceof EntityLivingBase) { - dam += EnchantmentHelper.getEnchantmentModifierLiving(this, (EntityLivingBase) target); - i += EnchantmentHelper.getKnockbackModifier(this, (EntityLivingBase) target); - } - - boolean flag = target.attackEntityFrom(new DamageSourceMobMF(getAttackType(), this), dam); - - if (flag) { - this.hitCooldownTime = getAttackSpeed(); - this.swingItem(); - if (i > 0) { - target.addVelocity(-MathHelper.sin(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F, 0.1D, - MathHelper.cos(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F); - this.motionX *= 0.6D; - this.motionZ *= 0.6D; - } - - int j = EnchantmentHelper.getFireAspectModifier(this); - - if (j > 0) { - target.setFire(j * 4); - } - - if (target instanceof EntityLivingBase) { - EnchantmentHelper.func_151384_a((EntityLivingBase) target, this); - } - - EnchantmentHelper.func_151385_b(this, target); - } - - return flag; - } - - private boolean canPickUp(Entity target) { - if (target instanceof EntityLivingBase && PowerArmour.isWearingCogwork((EntityLivingBase) target)) { - return false; - } - float mysize = getVolume(this); - float theirsize = getVolume(target); - return mysize > theirsize; - } - - private float getVolume(Entity entity) { - return entity.width * entity.width * entity.height; - } - - private int getAttackSpeed() { - return 0; - /* + private static final int dataID = 12; + public int swing; + private int grabCooldown; + private int hitCooldownTime; + private int specialAttackTime; + private float[] punch = new float[]{0F, 1F, 0F}; + private float[] headbutt = new float[]{0F, 1F, 4F}; + + public EntityMinotaur(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(4, new EntityAIAttackOnCollide(this, EntityLivingBase.class, 1.0D, true)); + this.tasks.addTask(5, new EntityAIMoveTowardsRestriction(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 0.5D)); + this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 12.0F)); + this.tasks.addTask(8, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(2, new AI_MinotaurFindTarget(this, EntityPlayer.class, 0, true)); + + this.setSize(1.5F, 2.5F); + this.stepHeight = 1.0F; + this.experienceValue = 40; + + for (int i = 0; i < this.equipmentDropChances.length; ++i) { + this.equipmentDropChances[i] = 1F; + } + } + + public void worldGenTier(int species, int tier) { + setMob(species, tier); + setLoadout(); + if (tier > 0) { + this.setHomeArea((int) posX, (int) posY, (int) posZ, getRange(tier)); + } + } + + private int getRange(int tier) { + return tier > 1 ? 12 : 24; + } + + @Override + public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { + int species = MinotaurBreed.getEnvironment(this); + + setMob(species, 0); + setLoadout(); + return super.onSpawnWithEgg(data); + } + + public void setLoadout() { + String tier = getMinotaur().weaponTier; + if (tier != null) { + this.setCurrentItemOrArmor(0, getRandomWeapon().construct(tier, "OakWood")); + } + } + + public ItemWeaponMF getRandomWeapon() { + if (getTier() == 3) { + return OrnateStyle.ornate_greatsword; + } + ItemWeaponMF[] list = new ItemWeaponMF[]{CustomToolListMF.standard_greatsword, + CustomToolListMF.standard_katana, CustomToolListMF.standard_battleaxe, + CustomToolListMF.standard_warhammer, CustomToolListMF.standard_spear, + CustomToolListMF.standard_halbeard}; + return list[rand.nextInt(list.length)]; + } + + @Override + public String getCommandSenderName() { + return StatCollector.translateToLocal("entity." + getMinotaur().name + ".name"); + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(24.0D); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.35F); + this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(ConfigMobs.minotaurMD); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(ConfigMobs.minotaurHP); + } + + @Override + protected boolean isAIEnabled() { + return true; + } + + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(dataID, Byte.valueOf((byte) 0)); + this.dataWatcher.addObject(dataID + 1, Integer.valueOf((byte) 1)); + this.dataWatcher.addObject(dataID + 2, Integer.valueOf(2)); + this.dataWatcher.addObject(dataID + 3, Integer.valueOf(0)); + } + + @Override + public float getBlockPathWeight(int x, int y, int z) { + return super.getBlockPathWeight(x, y, z); + } + + @Override + public void onUpdate() { + super.onUpdate(); + + if (!worldObj.isRemote) { + if (getRageLevel() == 0 && getAttackTarget() == null) { + if (ticksExisted % 40 == 0) { + forage(); + } + } + if (ticksExisted % 20 == 0) { + if (!isBloodied()) { + if (getRageVariable() > 0) { + addRage(-1); + if (getRageVariable() > 50) { + setRage(50); + } + } + } + } + if (hitCooldownTime > 0) + --hitCooldownTime; + if (grabCooldown > 0) { + --grabCooldown; + } + if (specialAttackTime > 0) { + --specialAttackTime; + } + if ((getAttack() == (byte) 1 || getAttack() == (byte) 3) && specialAttackTime == 0) { + initBasicAttack(); + } + if (this.getAttackTarget() != null) { + if (getRageLevel() > 20 && getAttack() != (byte) 2 && getHeldItem() == null && rand.nextInt(100) == 0) { + this.initHeadbutt(); + } + EntityLivingBase target = getAttackTarget(); + int intLvl = getIntLvl(); + + if (intLvl > 0)// Smarter means more likely + { + if (getAttack() != 2 && rand.nextInt(10) < intLvl && onGround && target instanceof EntityPlayer + && ((EntityPlayer) target).isBlocking() && this.getDistanceToEntity(target) < 4F) { + this.jump(); + this.initPowerAttack(); + } + } else { + if (getRageLevel() > 40 && getAttack() != 2 && rand.nextInt(50) == 0 && onGround + && target instanceof EntityPlayer && ((EntityPlayer) target).isBlocking() + && this.getDistanceToEntity(target) < 4F) { + this.jump(); + this.initPowerAttack(); + } + } + double distance = this.getDistanceSqToEntity(target); + if (!TacticalManager.isFlankedBy(target, this, 270) && distance > 6 && distance < 12 + && rand.nextInt(50) == 0 && this.getAttack() == (byte) 0 && this.getMinotaur().throwsBombs) { + this.throwBomb(target, 1.0F); + } + + if (this.ticksExisted % 20 == 0 && (getRageLevel() <= 0 || !canEntityBeSeen(getAttackTarget()))) { + if (rand.nextInt(50 + (50 * getIntLvl())) == 0) { + this.setAttackTarget(null); + } + } + } + + boolean inBeserk = getRageLevel() >= 100 && isBloodied(); + if (getAttack() == (byte) 2) { + if (!inBeserk) { + initBasicAttack(); + } else { + this.swingItem(); + } + } + if (getAttack() != (byte) 2 && inBeserk) { + initBeserk(); + } + } + } + + private void forage() { + if (rand.nextInt(100) == 0) { + int radius = 8; + for (int x = -radius; x <= radius; x++) { + for (int y = -2; y <= 2; y++) { + for (int z = -radius; z <= radius; z++) { + int xPos = (int) posX + x; + int yPos = (int) posY + y; + int zPos = (int) posZ + z; + if (rand.nextInt(10) == 0) { + if (worldObj.getBlock(xPos, yPos, zPos) == BlockListMF.berryBush + && worldObj.getBlockMetadata(xPos, yPos, zPos) == 0) { + getNavigator().tryMoveToXYZ(xPos + 0.5, yPos + 1, zPos + 0.5, 0.6F); + return; + } + if (worldObj.getBlock(xPos, yPos, zPos) instanceof BlockCrops + && worldObj.getBlockMetadata(xPos, yPos, zPos) >= 4) { + getNavigator().tryMoveToXYZ(xPos + 0.5, yPos + 1, zPos + 0.5, 0.6F); + return; + } + } + } + } + } + return; + } + if (worldObj.getBlock((int) posX, (int) posY, (int) posZ) == BlockListMF.berryBush + && worldObj.getBlockMetadata((int) posX, (int) posY, (int) posZ) == 0) { + worldObj.playSoundEffect(posX, posY + getEyeHeight(), posZ, "random.eat", 1.0F, 0.75F); + swingItem(); + heal(10); + worldObj.setBlockMetadataWithNotify((int) posX, (int) posY, (int) posZ, 1, 2); + } else if (worldObj.getBlock((int) posX, (int) posY, (int) posZ) instanceof BlockCrops + && worldObj.getBlockMetadata((int) posX, (int) posY, (int) posZ) > 0) { + worldObj.playSoundEffect(posX, posY + getEyeHeight(), posZ, "random.eat", 1.0F, 0.75F); + worldObj.playSoundEffect(posX, posY + getEyeHeight(), posZ, "dig.grass", 1.0F, 1.00F); + swingItem(); + heal(5); + worldObj.setBlockToAir((int) posX, (int) posY, (int) posZ); + } + } + + @Override + protected void dropFewItems(boolean playerKill, int looting) { + int count = getLootCount() == 1 ? 1 : rand.nextInt(looting + getLootCount() + 1); + for (int a = 0; a < count; a++) { + Item drop = getLoot(); + this.dropItem(drop, 1); + } + count = rand.nextInt(looting + 4) + 1; + for (int a = 0; a < count; a++) { + this.dropItem(ComponentListMF.rawhideLarge, 1); + } + count = rand.nextInt(looting + 2) + 1; + for (int a = 0; a < count; a++) { + this.dropItem(isBurning() ? Items.cooked_beef : Items.beef, 1); + } + } + + private Item getLoot() { + int breed = getTier(); + if (breed > 2) { + return ToolListMF.loot_sack_rare; + } + if (breed > 0) { + return ToolListMF.loot_sack_uc; + } + return ToolListMF.loot_sack; + } + + private int getLootCount() { + int breed = getTier(); + if (breed > 2) { + return 1; + } + return 2 + breed; + } + + @Override + public boolean attackEntityFrom(DamageSource source, float damage) { + if (!super.attackEntityFrom(source, damage)) { + return false; + } else { + Entity entity = source.getEntity(); + if (entity != null) { + addRage(this.getIntLvl() >= 1 ? (int) (damage / 2) : (int) damage); + } + } + return true; + } + + public void initBeserk() { + TacticalManager.tryDisarm(this); + // this.playSound("minefantasy2:mob.minotaur.beserk", 1.0F, 1.0F); + setSprinting(true); + setAttack((byte) 2); + } + + public void initPowerAttack() { + setSprinting(true); + specialAttackTime = 30; + hitCooldownTime = 0; + setAttack((byte) 3); + } + + public void initHeadbutt() { + setSprinting(true); + specialAttackTime = 20; + this.hitCooldownTime = 0; + setAttack((byte) 1); + } + + public void initBasicAttack() { + setSprinting(false); + specialAttackTime = 0; + setAttack((byte) 0); + } + + @Override + protected String getLivingSound() { + return "mob.cow.say"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + @Override + protected String getHurtSound() { + return "mob.cow.hurt"; + } + + /** + * Returns the sound this mob makes on death. + */ + @Override + protected String getDeathSound() { + return "minefantasy2:mob.minotaur.death"; + } + + @Override + public float getSoundPitch() { + return 0.5F; + } + + protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) { + this.playSound("mob.cow.step", 0.75F, 0.9F); + } + + protected Item getDropItem() { + return ComponentListMF.hideLarge; + } + + public double getHeadChargeAngle() { + return getAttack() == (byte) 1 ? 80F : 0F; + } + + public float getArmourRating(DamageSource src) { + float[] armour = getValueResistences(); + return (getMinotaur().armour_rating / 100F) + * ArmourCalculator.adjustACForDamage(src, getDT(), armour[0], armour[1], armour[2]); + } + + @Override + protected void damageEntity(DamageSource source, float dam) { + float AR = 1.0F + Math.max(0.0F, getArmourRating(source)); + + super.damageEntity(source, dam / AR); + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + + nbt.setInteger("Attack", getAttack()); + nbt.setInteger("Species", getSpecies()); + nbt.setInteger("Breed", getTier()); + nbt.setInteger("Rage", getRageVariable()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + + setAttack((byte) nbt.getInteger("Attack")); + int species = nbt.getInteger("Species"); + int breed = nbt.getInteger("Breed"); + setMob(species, breed); + + setRage(nbt.getInteger("Rage")); + } + + private float getDT() { + byte att = getAttack(); + if (att == (byte) 2) { + return 5F; + } + return 2F; + } + + /** + * Cutting, Blunt, Piercing + */ + private float[] getValueResistences() { + return new float[]{0.75F, 1F, 0.5F}; + } + + /** + * 0=Normal, 1=Headbutt, 2=Beserk, 3=Power + */ + public byte getAttack() { + return dataWatcher.getWatchableObjectByte(dataID); + } + + /** + * 0=Normal, 1=Headbutt, 2=Beserk, 3=Power + */ + public void setAttack(byte type) { + dataWatcher.updateObject(dataID, type); + } + + /** + * @param species Brown, Snow, Nether + * @param subspecies the tier such as normal, warlord, etc + */ + public void setMob(int species, int subspecies) { + MinotaurBreed minotaur = MinotaurBreed.getBreed(species, subspecies); + + setSpecies(species); + setTier(subspecies); + + this.preventEntitySpawning = minotaur.isSpecial; + this.isImmuneToFire = species == 1; + this.experienceValue = minotaur.experienceValue; + + if (subspecies == 0) { + this.targetTasks.addTask(2, new AI_MinotaurFindTarget(this, EntityLiving.class, 0, false)); + } + if (subspecies >= 3) { + this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(16.0D); + } + } + + @Override + protected boolean canDespawn() { + return !getMinotaur().isSpecial; + } + + /** + * 0=Normal, 1=Nether + */ + public int getSpecies() { + return dataWatcher.getWatchableObjectInt(dataID + 1); + } + + /** + * 0=Normal, 1=Nether + */ + public void setSpecies(int type) { + dataWatcher.updateObject(dataID + 1, type); + + } + + public int getTier() { + return dataWatcher.getWatchableObjectInt(dataID + 2); + } + + public void setTier(int type) { + dataWatcher.updateObject(dataID + 2, type); + } + + @Override + public float[] getHitTraits() { + byte att = getAttack(); + if (att == (byte) 1) { + return headbutt; + } + return punch; + } + + @Override + public boolean attackEntityAsMob(Entity target) { + if (worldObj.difficultySetting == EnumDifficulty.PEACEFUL && target instanceof EntityPlayer) { + return false; + } + // if(hitCooldownTime > 0)return false; + + if (!canEntityBeSeen(target)) { + return false; + } + if (getAttack() == 3 && motionY > 0 && target.posY < posY) { + return false; + } + + float dam = getHitDamage(); + + if (getRageLevel() > 50) { + addRage((int) (dam * 1.5)); + } + if (getAttack() == 2 && this.riddenByEntity != null && this.riddenByEntity == target) { + if (target instanceof EntityLivingBase && rand.nextInt(4) == 0) { + ArmourCalculator.damageArmour((EntityLivingBase) target, (int) (dam * 0.25F)); + } + } + if (this.riddenByEntity == null) { + if (grabCooldown <= 0 && rand.nextInt(100) < getGrabChance() && canPickUp(target)) { + target.mountEntity(this); + } + } else if (rand.nextInt(100) < ConfigMobs.minotaurTC && riddenByEntity == target) { + riddenByEntity.mountEntity(null); + grabCooldown = 60; + TacticalManager.knockbackEntity(target, this, 4F, 1F); + } + if (getAttack() == 3 && fallDistance > 0 && target instanceof EntityPlayer + && ((EntityPlayer) target).isBlocking() && rand.nextInt(100) < getDisarmChance()) { + TacticalManager.tryDisarm(this, (EntityLivingBase) target, true); + } + + int i = getKnockbackBoost(); + + if (target instanceof EntityLivingBase) { + dam += EnchantmentHelper.getEnchantmentModifierLiving(this, (EntityLivingBase) target); + i += EnchantmentHelper.getKnockbackModifier(this, (EntityLivingBase) target); + } + + boolean flag = target.attackEntityFrom(new DamageSourceMobMF(getAttackType(), this), dam); + + if (flag) { + this.hitCooldownTime = getAttackSpeed(); + this.swingItem(); + if (i > 0) { + target.addVelocity(-MathHelper.sin(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F, 0.1D, + MathHelper.cos(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F); + this.motionX *= 0.6D; + this.motionZ *= 0.6D; + } + + int j = EnchantmentHelper.getFireAspectModifier(this); + + if (j > 0) { + target.setFire(j * 4); + } + + if (target instanceof EntityLivingBase) { + EnchantmentHelper.func_151384_a((EntityLivingBase) target, this); + } + + EnchantmentHelper.func_151385_b(this, target); + } + + return flag; + } + + private boolean canPickUp(Entity target) { + if (target instanceof EntityLivingBase && PowerArmour.isWearingCogwork((EntityLivingBase) target)) { + return false; + } + float mysize = getVolume(this); + float theirsize = getVolume(target); + return mysize > theirsize; + } + + private float getVolume(Entity entity) { + return entity.width * entity.width * entity.height; + } + + private int getAttackSpeed() { + return 0; + /* * if(rage >= 100) { return 10; } if(rage > 80) { return 15; } if(rage > 50) { * return 20; } if(rage > 25) { return 30; } return 35; */ - } - - @Override - public void onKillEntity(EntityLivingBase victim) { - super.onKillEntity(victim); - if (!isBloodied()) { - addRage(-20); - } - if (getHealth() < getMaxHealth() * 0.75F) { - this.heal(5); - } - } - - public MinotaurBreed getMinotaur() { - return MinotaurBreed.getBreed(getSpecies(), getTier()); - } - - private int getDisarmChance() { - return getMinotaur().disarmChance; - } - - private int getGrabChance() { - return (getAttack() == 2 ? getMinotaur().grabChanceBeserk : getMinotaur().grabChance); - } - - private int getThrowChance() { - return getMinotaur().throwChance; - } - - private String getAttackType() { - byte att = getAttack(); - if (att == (byte) 1) { - return "gore"; - } - if (att == (byte) 2) { - return "beserk"; - } - return "pound"; - } - - private int getKnockbackBoost() { - byte att = getAttack(); - if (att == (byte) 1) { - return getSpecies() == 1 ? 4 : 2; - } - return 0; - } - - private float getHitDamage() { - MinotaurBreed breed = getMinotaur(); - byte att = getAttack(); - - if (att != (byte) 1 && getHeldItem() != null)// no weapon dam on gore - { - float melee = att == (byte) 2 ? breed.beserkDamage : breed.poundDamage; - - return Math.max(2F, melee - 2F);// Weapon Dam - } - - if (att == (byte) 1) { - return breed.goreDamage; - } - if (att == (byte) 2) { - return breed.beserkDamage; - } - return breed.poundDamage; - } - - public boolean isBloodied() { - float t = this.getMinotaur().beserkThreshold / 100F; - return getHealth() < (getMaxHealth() * t); - } - - @SideOnly(Side.CLIENT) - public String getTexture() { - String tex = "minotaur" + getMinotaur().tex; - if (isBloodied()) { - tex += "_bloodied"; - } - return tex; - } - - public int getRageVariable() { - return dataWatcher.getWatchableObjectInt(dataID + 3); - } - - public void addRage(int level) { - setRage(getRageVariable() + level); - } - - public void setRage(int level) { - if (!worldObj.isRemote) - dataWatcher.updateObject(dataID + 3, Math.max(0, level)); - } - - public int getRageLevel() { - return isBloodied() ? 100 : getRageVariable(); - } - - private int getIntLvl() { - return this.getMinotaur().intelligenceLvl; - } - - public boolean isDocile() { - return getIntLvl() <= 0; - } - - @Override - public boolean canParry(DamageSource source) { - int intLvl = this.getIntLvl(); - if (intLvl == 0) { - return rand.nextInt(8) == 0; - } - return this.getAttack() == (byte) 0; - } - - public void throwBomb(EntityLivingBase attackTarget, float spread) { - EntityBomb bomb = new EntityBomb(worldObj, this).setType((byte) 1, (byte) 0, (byte) 0, (byte) 0); - worldObj.spawnEntityInWorld(bomb); - this.swingItem(); - } - - @Override - public void onParry(DamageSource source, Entity attacker, float dam) { - Entity target = this.getEntityToAttack(); - if (getIntLvl() > 1 && target != null && attacker == target && this.getDistanceSqToEntity(attacker) < 4) { - this.setAttack((byte) 1); - TacticalManager.lungeEntity(this, attacker, 2.0F, 0.2F); - } - } + } + + @Override + public void onKillEntity(EntityLivingBase victim) { + super.onKillEntity(victim); + if (!isBloodied()) { + addRage(-20); + } + if (getHealth() < getMaxHealth() * 0.75F) { + this.heal(5); + } + } + + public MinotaurBreed getMinotaur() { + return MinotaurBreed.getBreed(getSpecies(), getTier()); + } + + private int getDisarmChance() { + return getMinotaur().disarmChance; + } + + private int getGrabChance() { + return (getAttack() == 2 ? getMinotaur().grabChanceBeserk : getMinotaur().grabChance); + } + + private int getThrowChance() { + return getMinotaur().throwChance; + } + + private String getAttackType() { + byte att = getAttack(); + if (att == (byte) 1) { + return "gore"; + } + if (att == (byte) 2) { + return "beserk"; + } + return "pound"; + } + + private int getKnockbackBoost() { + byte att = getAttack(); + if (att == (byte) 1) { + return getSpecies() == 1 ? 4 : 2; + } + return 0; + } + + private float getHitDamage() { + MinotaurBreed breed = getMinotaur(); + byte att = getAttack(); + + if (att != (byte) 1 && getHeldItem() != null)// no weapon dam on gore + { + float melee = att == (byte) 2 ? breed.beserkDamage : breed.poundDamage; + + return Math.max(2F, melee - 2F);// Weapon Dam + } + + if (att == (byte) 1) { + return breed.goreDamage; + } + if (att == (byte) 2) { + return breed.beserkDamage; + } + return breed.poundDamage; + } + + public boolean isBloodied() { + float t = this.getMinotaur().beserkThreshold / 100F; + return getHealth() < (getMaxHealth() * t); + } + + @SideOnly(Side.CLIENT) + public String getTexture() { + String tex = "minotaur" + getMinotaur().tex; + if (isBloodied()) { + tex += "_bloodied"; + } + return tex; + } + + public int getRageVariable() { + return dataWatcher.getWatchableObjectInt(dataID + 3); + } + + public void addRage(int level) { + setRage(getRageVariable() + level); + } + + public void setRage(int level) { + if (!worldObj.isRemote) + dataWatcher.updateObject(dataID + 3, Math.max(0, level)); + } + + public int getRageLevel() { + return isBloodied() ? 100 : getRageVariable(); + } + + private int getIntLvl() { + return this.getMinotaur().intelligenceLvl; + } + + public boolean isDocile() { + return getIntLvl() <= 0; + } + + @Override + public boolean canParry(DamageSource source) { + int intLvl = this.getIntLvl(); + if (intLvl == 0) { + return rand.nextInt(8) == 0; + } + return this.getAttack() == (byte) 0; + } + + public void throwBomb(EntityLivingBase attackTarget, float spread) { + EntityBomb bomb = new EntityBomb(worldObj, this).setType((byte) 1, (byte) 0, (byte) 0, (byte) 0); + worldObj.spawnEntityInWorld(bomb); + this.swingItem(); + } + + @Override + public void onParry(DamageSource source, Entity attacker, float dam) { + Entity target = this.getEntityToAttack(); + if (getIntLvl() > 1 && target != null && attacker == target && this.getDistanceSqToEntity(attacker) < 4) { + this.setAttack((byte) 1); + TacticalManager.lungeEntity(this, attacker, 2.0F, 0.2F); + } + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityMobMF.java b/src/main/java/minefantasy/mf2/entity/mob/EntityMobMF.java index e55d5d7b..882629bc 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityMobMF.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityMobMF.java @@ -14,210 +14,210 @@ import net.minecraft.world.World; public abstract class EntityMobMF extends EntityCreature implements IMob { - public EntityMobMF(World world) { - super(world); - this.experienceValue = 5; - } - - /** - * Called frequently so the entity can update its state every tick as required. - * For example, zombies and skeletons use this to react to sunlight and start to - * burn. - */ - @Override - public void onLivingUpdate() { - this.updateArmSwingProgress(); - float f = this.getBrightness(1.0F); - - if (f > 0.5F) { - this.entityAge += 2; - } - - super.onLivingUpdate(); - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() { - super.onUpdate(); - - if (this.canDespawn() && !this.worldObj.isRemote - && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { - this.setDead(); - } - } - - @Override - protected String getSwimSound() { - return "game.hostile.swim"; - } - - @Override - protected String getSplashSound() { - return "game.hostile.swim.splash"; - } - - /** - * Finds the closest player within 16 blocks to attack, or null if this Entity - * isn't interested in attacking (Animals, Spiders at day, peaceful PigZombies). - */ - @Override - protected Entity findPlayerToAttack() { - EntityPlayer entityplayer = this.worldObj.getClosestVulnerablePlayerToEntity(this, 16.0D); - return entityplayer != null && this.canEntityBeSeen(entityplayer) ? entityplayer : null; - } - - /** - * Called when the entity is attacked. - */ - @Override - public boolean attackEntityFrom(DamageSource source, float dam) { - if (this.isEntityInvulnerable()) { - return false; - } else if (super.attackEntityFrom(source, dam)) { - Entity entity = source.getEntity(); - - if (this.riddenByEntity != entity && this.ridingEntity != entity) { - if (entity != this) { - this.entityToAttack = entity; - } - - return true; - } else { - return true; - } - } else { - return false; - } - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() { - return "game.hostile.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() { - return "game.hostile.die"; - } - - @Override - protected String func_146067_o(int distance) { - return distance > 4 ? "game.hostile.hurt.fall.big" : "game.hostile.hurt.fall.small"; - } - - @Override - public boolean attackEntityAsMob(Entity target) { - if (worldObj.difficultySetting == EnumDifficulty.PEACEFUL && target instanceof EntityPlayer) { - return false; - } - - float f = (float) this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue(); - int i = 0; - - if (target instanceof EntityLivingBase) { - f += EnchantmentHelper.getEnchantmentModifierLiving(this, (EntityLivingBase) target); - i += EnchantmentHelper.getKnockbackModifier(this, (EntityLivingBase) target); - } - - boolean flag = target.attackEntityFrom(DamageSource.causeMobDamage(this), f); - - if (flag) { - if (i > 0) { - target.addVelocity(-MathHelper.sin(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F, 0.1D, - MathHelper.cos(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F); - this.motionX *= 0.6D; - this.motionZ *= 0.6D; - } - - int j = EnchantmentHelper.getFireAspectModifier(this); - - if (j > 0) { - target.setFire(j * 4); - } - - if (target instanceof EntityLivingBase) { - EnchantmentHelper.func_151384_a((EntityLivingBase) target, this); - } - - EnchantmentHelper.func_151385_b(this, target); - } - - return flag; - } - - /** - * Basic mob attack. Default to touch of death in EntityCreature. Overridden by - * each mob to define their attack. - */ - @Override - protected void attackEntity(Entity target, float dam) { - if (this.attackTime <= 0 && dam < 2.0F && target.boundingBox.maxY > this.boundingBox.minY - && target.boundingBox.minY < this.boundingBox.maxY) { - this.attackTime = 20; - this.attackEntityAsMob(target); - } - } - - /** - * Takes a coordinate in and returns a weight to determine how likely this - * creature will try to path to the block. Args: x, y, z - */ - @Override - public float getBlockPathWeight(int x, int y, int z) { - return 0.5F - this.worldObj.getLightBrightness(x, y, z); - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - protected boolean isValidLightLevel() { - int i = MathHelper.floor_double(this.posX); - int j = MathHelper.floor_double(this.boundingBox.minY); - int k = MathHelper.floor_double(this.posZ); - - if (this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, i, j, k) > this.rand.nextInt(32)) { - return false; - } else { - int l = this.worldObj.getBlockLightValue(i, j, k); - - if (this.worldObj.isThundering()) { - int i1 = this.worldObj.skylightSubtracted; - this.worldObj.skylightSubtracted = 10; - l = this.worldObj.getBlockLightValue(i, j, k); - this.worldObj.skylightSubtracted = i1; - } - - return l <= this.rand.nextInt(8); - } - } - - /** - * Checks if the entity's current position is a valid location to spawn this - * entity. - */ - @Override - public boolean getCanSpawnHere() { - return this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && this.isValidLightLevel() - && super.getCanSpawnHere(); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getAttributeMap().registerAttribute(SharedMonsterAttributes.attackDamage); - } - - @Override - protected boolean func_146066_aG() { - return true; - } + public EntityMobMF(World world) { + super(world); + this.experienceValue = 5; + } + + /** + * Called frequently so the entity can update its state every tick as required. + * For example, zombies and skeletons use this to react to sunlight and start to + * burn. + */ + @Override + public void onLivingUpdate() { + this.updateArmSwingProgress(); + float f = this.getBrightness(1.0F); + + if (f > 0.5F) { + this.entityAge += 2; + } + + super.onLivingUpdate(); + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() { + super.onUpdate(); + + if (this.canDespawn() && !this.worldObj.isRemote + && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + this.setDead(); + } + } + + @Override + protected String getSwimSound() { + return "game.hostile.swim"; + } + + @Override + protected String getSplashSound() { + return "game.hostile.swim.splash"; + } + + /** + * Finds the closest player within 16 blocks to attack, or null if this Entity + * isn't interested in attacking (Animals, Spiders at day, peaceful PigZombies). + */ + @Override + protected Entity findPlayerToAttack() { + EntityPlayer entityplayer = this.worldObj.getClosestVulnerablePlayerToEntity(this, 16.0D); + return entityplayer != null && this.canEntityBeSeen(entityplayer) ? entityplayer : null; + } + + /** + * Called when the entity is attacked. + */ + @Override + public boolean attackEntityFrom(DamageSource source, float dam) { + if (this.isEntityInvulnerable()) { + return false; + } else if (super.attackEntityFrom(source, dam)) { + Entity entity = source.getEntity(); + + if (this.riddenByEntity != entity && this.ridingEntity != entity) { + if (entity != this) { + this.entityToAttack = entity; + } + + return true; + } else { + return true; + } + } else { + return false; + } + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + @Override + protected String getHurtSound() { + return "game.hostile.hurt"; + } + + /** + * Returns the sound this mob makes on death. + */ + @Override + protected String getDeathSound() { + return "game.hostile.die"; + } + + @Override + protected String func_146067_o(int distance) { + return distance > 4 ? "game.hostile.hurt.fall.big" : "game.hostile.hurt.fall.small"; + } + + @Override + public boolean attackEntityAsMob(Entity target) { + if (worldObj.difficultySetting == EnumDifficulty.PEACEFUL && target instanceof EntityPlayer) { + return false; + } + + float f = (float) this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue(); + int i = 0; + + if (target instanceof EntityLivingBase) { + f += EnchantmentHelper.getEnchantmentModifierLiving(this, (EntityLivingBase) target); + i += EnchantmentHelper.getKnockbackModifier(this, (EntityLivingBase) target); + } + + boolean flag = target.attackEntityFrom(DamageSource.causeMobDamage(this), f); + + if (flag) { + if (i > 0) { + target.addVelocity(-MathHelper.sin(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F, 0.1D, + MathHelper.cos(this.rotationYaw * (float) Math.PI / 180.0F) * i * 0.5F); + this.motionX *= 0.6D; + this.motionZ *= 0.6D; + } + + int j = EnchantmentHelper.getFireAspectModifier(this); + + if (j > 0) { + target.setFire(j * 4); + } + + if (target instanceof EntityLivingBase) { + EnchantmentHelper.func_151384_a((EntityLivingBase) target, this); + } + + EnchantmentHelper.func_151385_b(this, target); + } + + return flag; + } + + /** + * Basic mob attack. Default to touch of death in EntityCreature. Overridden by + * each mob to define their attack. + */ + @Override + protected void attackEntity(Entity target, float dam) { + if (this.attackTime <= 0 && dam < 2.0F && target.boundingBox.maxY > this.boundingBox.minY + && target.boundingBox.minY < this.boundingBox.maxY) { + this.attackTime = 20; + this.attackEntityAsMob(target); + } + } + + /** + * Takes a coordinate in and returns a weight to determine how likely this + * creature will try to path to the block. Args: x, y, z + */ + @Override + public float getBlockPathWeight(int x, int y, int z) { + return 0.5F - this.worldObj.getLightBrightness(x, y, z); + } + + /** + * Checks to make sure the light is not too bright where the mob is spawning + */ + protected boolean isValidLightLevel() { + int i = MathHelper.floor_double(this.posX); + int j = MathHelper.floor_double(this.boundingBox.minY); + int k = MathHelper.floor_double(this.posZ); + + if (this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, i, j, k) > this.rand.nextInt(32)) { + return false; + } else { + int l = this.worldObj.getBlockLightValue(i, j, k); + + if (this.worldObj.isThundering()) { + int i1 = this.worldObj.skylightSubtracted; + this.worldObj.skylightSubtracted = 10; + l = this.worldObj.getBlockLightValue(i, j, k); + this.worldObj.skylightSubtracted = i1; + } + + return l <= this.rand.nextInt(8); + } + } + + /** + * Checks if the entity's current position is a valid location to spawn this + * entity. + */ + @Override + public boolean getCanSpawnHere() { + return this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && this.isValidLightLevel() + && super.getCanSpawnHere(); + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getAttributeMap().registerAttribute(SharedMonsterAttributes.attackDamage); + } + + @Override + protected boolean func_146066_aG() { + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/FireBreath.java b/src/main/java/minefantasy/mf2/entity/mob/FireBreath.java index 782f9853..28f54a29 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/FireBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/FireBreath.java @@ -16,54 +16,54 @@ public class FireBreath extends DragonBreath { - public FireBreath(String name) { - super(name); - } + public FireBreath(String name) { + super(name); + } - @Override - public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { - return shooter == null ? new DamageSource("fireblastBase").setFireDamage() - : (new EntityDamageSourceIndirect("fireblast", breath, shooter)).setFireDamage(); - } + @Override + public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { + return shooter == null ? new DamageSource("fireblastBase").setFireDamage() + : (new EntityDamageSourceIndirect("fireblast", breath, shooter)).setFireDamage(); + } - @Override - @SideOnly(Side.CLIENT) - public String getTexture(EntityDragonBreath instance) { - return "textures/projectile/dragonbreath_fire"; - } + @Override + @SideOnly(Side.CLIENT) + public String getTexture(EntityDragonBreath instance) { + return "textures/projectile/dragonbreath_fire"; + } - public void onHitEntity(Entity target, EntityDragonBreath instance) { - super.onHitEntity(target, instance); - if (target instanceof EntityLivingBase) { - target.setFire(5); - } - } + public void onHitEntity(Entity target, EntityDragonBreath instance) { + super.onHitEntity(target, instance); + if (target instanceof EntityLivingBase) { + target.setFire(5); + } + } - @Override - public float modifyDamage(Entity hit, float dam) { - return dam; - } + @Override + public float modifyDamage(Entity hit, float dam) { + return dam; + } - @Override - public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { - Block hit = world.getBlock(x, y, z); - if (!world.isRemote && (impact || instance.rand.nextInt(20) == 0)) { - if (!world.isRemote && world.isAirBlock(x, y + 1, z)) { - if (ConfigMobs.dragonGriefFire && hit.isSideSolid(world, x, y, z, ForgeDirection.UP) - && hit.isFlammable(world, x, y + 1, z, ForgeDirection.UP)) { - world.setBlock(x, y + 1, z, Blocks.fire); - } - if (!world.getGameRules().getGameRuleBooleanValue("mobGriefing")) - return; + @Override + public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { + Block hit = world.getBlock(x, y, z); + if (!world.isRemote && (impact || instance.rand.nextInt(20) == 0)) { + if (!world.isRemote && world.isAirBlock(x, y + 1, z)) { + if (ConfigMobs.dragonGriefFire && hit.isSideSolid(world, x, y, z, ForgeDirection.UP) + && hit.isFlammable(world, x, y + 1, z, ForgeDirection.UP)) { + world.setBlock(x, y + 1, z, Blocks.fire); + } + if (!world.getGameRules().getGameRuleBooleanValue("mobGriefing")) + return; - if (ConfigMobs.dragonGriefGeneral && hit == Blocks.ice) { - world.setBlock(x, y, z, Blocks.water); - } - if (ConfigMobs.dragonGriefGeneral && hit.getMaterial() == Material.glass) { - world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.glass", 1.0F, 1.0F); - world.setBlockToAir(x, y, z); - } - } - } - } + if (ConfigMobs.dragonGriefGeneral && hit == Blocks.ice) { + world.setBlock(x, y, z, Blocks.water); + } + if (ConfigMobs.dragonGriefGeneral && hit.getMaterial() == Material.glass) { + world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "dig.glass", 1.0F, 1.0F); + world.setBlockToAir(x, y, z); + } + } + } + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/FrostBreath.java b/src/main/java/minefantasy/mf2/entity/mob/FrostBreath.java index 75f120e8..8576e34a 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/FrostBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/FrostBreath.java @@ -18,58 +18,58 @@ public class FrostBreath extends DragonBreath { - public FrostBreath(String name) { - super(name); - } + public FrostBreath(String name) { + super(name); + } - @Override - public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { - return shooter == null ? new DamageSource("frostblastBase") - : (new EntityDamageSourceIndirect("frostblast", breath, shooter)); - } + @Override + public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { + return shooter == null ? new DamageSource("frostblastBase") + : (new EntityDamageSourceIndirect("frostblast", breath, shooter)); + } - @Override - @SideOnly(Side.CLIENT) - public String getTexture(EntityDragonBreath instance) { - return "textures/projectile/dragonbreath_frost"; - } + @Override + @SideOnly(Side.CLIENT) + public String getTexture(EntityDragonBreath instance) { + return "textures/projectile/dragonbreath_frost"; + } - public void onHitEntity(Entity target, EntityDragonBreath instance) { - super.onHitEntity(target, instance); - if (target instanceof EntityLivingBase) { - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity((EntityLivingBase) target)) { - StaminaBar.modifyStaminaValue((EntityLivingBase) target, -1F); - } - ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 2)); - } - } + public void onHitEntity(Entity target, EntityDragonBreath instance) { + super.onHitEntity(target, instance); + if (target instanceof EntityLivingBase) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity((EntityLivingBase) target)) { + StaminaBar.modifyStaminaValue((EntityLivingBase) target, -1F); + } + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 2)); + } + } - @Override - public float modifyDamage(Entity hit, float dam) { - return dam; - } + @Override + public float modifyDamage(Entity hit, float dam) { + return dam; + } - @Override - public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { - Block hit = world.getBlock(x, y, z); - if (!world.isRemote && (impact || instance.rand.nextInt(20) == 0)) { - if (ConfigMobs.dragonGriefGeneral && world.isAirBlock(x, y + 1, z)) { - if (hit.isSideSolid(world, x, y, z, ForgeDirection.UP)) { - world.setBlock(x, y + 1, z, Blocks.snow_layer); - } + @Override + public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { + Block hit = world.getBlock(x, y, z); + if (!world.isRemote && (impact || instance.rand.nextInt(20) == 0)) { + if (ConfigMobs.dragonGriefGeneral && world.isAirBlock(x, y + 1, z)) { + if (hit.isSideSolid(world, x, y, z, ForgeDirection.UP)) { + world.setBlock(x, y + 1, z, Blocks.snow_layer); + } - if (!world.getGameRules().getGameRuleBooleanValue("mobGriefing")) - return; - if (hit == Blocks.water || hit == Blocks.flowing_water) { - world.setBlock(x, y, z, Blocks.ice); - } - if (hit == Blocks.water || hit == Blocks.lava) { - world.setBlock(x, y, z, Blocks.obsidian); - } - if (hit == Blocks.water || hit == Blocks.flowing_lava) { - world.setBlock(x, y, z, Blocks.cobblestone); - } - } - } - } + if (!world.getGameRules().getGameRuleBooleanValue("mobGriefing")) + return; + if (hit == Blocks.water || hit == Blocks.flowing_water) { + world.setBlock(x, y, z, Blocks.ice); + } + if (hit == Blocks.water || hit == Blocks.lava) { + world.setBlock(x, y, z, Blocks.obsidian); + } + if (hit == Blocks.water || hit == Blocks.flowing_lava) { + world.setBlock(x, y, z, Blocks.cobblestone); + } + } + } + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/MinotaurBreed.java b/src/main/java/minefantasy/mf2/entity/mob/MinotaurBreed.java index 69edcd24..3c6f02f7 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/MinotaurBreed.java +++ b/src/main/java/minefantasy/mf2/entity/mob/MinotaurBreed.java @@ -1,224 +1,213 @@ package minefantasy.mf2.entity.mob; -import java.util.ArrayList; -import java.util.Random; - import minefantasy.mf2.config.ConfigMobs; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; +import java.util.ArrayList; +import java.util.Random; + public class MinotaurBreed { - public static final ArrayList normal = new ArrayList(); - public static final ArrayList frost = new ArrayList(); - public static final ArrayList nether = new ArrayList(); - private static Random rand = new Random(); - - public static MinotaurBreed BROWN = new MinotaurBreed(normal, "minotaur", "Brown", null, 10, ConfigMobs.minotaurHP, - ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, 0) - .setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC) - .setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); - public static MinotaurBreed BROWNGUARD = new MinotaurBreed(normal, "minotaur_guard", "GuardBrown", "iron", 20, - ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, - ConfigMobs.lightminotaurAR) - .setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC) - .setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB) - .setIntelligence(1); - public static MinotaurBreed BROWNELITE = new MinotaurBreed(normal, "minotaur_elite", "EliteBrown", "steel", 40, - ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, - ConfigMobs.mediumminotaurAR) - .setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC) - .setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB) - .setIntelligence(2); - public static MinotaurBreed BROWNBOSS = new MinotaurBreed(normal, "minotaur_boss", "BossBrown", "obsidian", 100, - ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, ConfigMobs.heavyminotaurAR) - .setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC) - .setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB) - .setIntelligence(3).throwBombs(); - - public static MinotaurBreed FROST = new MinotaurBreed(frost, "frostminotaur", "White", null, 15, - ConfigMobs.minotaurHP, ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, ConfigMobs.frostminotaurAR) - .setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC) - .setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); - public static MinotaurBreed FROSTGUARD = new MinotaurBreed(frost, "frostminotaur_guard", "GuardWhite", "iron", 25, - ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, - ConfigMobs.lightminotaurAR + ConfigMobs.frostminotaurAR) - .setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC) - .setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB) - .setIntelligence(1); - public static MinotaurBreed FROSTELITE = new MinotaurBreed(frost, "frostminotaur_elite", "EliteWhite", "steel", 50, - ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, - ConfigMobs.mediumminotaurAR + ConfigMobs.frostminotaurAR) - .setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC) - .setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB) - .setIntelligence(2); - public static MinotaurBreed FROSTBOSS = new MinotaurBreed(frost, "frostminotaurr_boss", "BossWhite", "obsidian", - 120, ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, - ConfigMobs.heavyminotaurAR + ConfigMobs.frostminotaurAR) - .setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC) - .setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB) - .setIntelligence(3).throwBombs(); - - public static MinotaurBreed NETHER = new MinotaurBreed(nether, "dredminotaur", "Nether", null, 15, - ConfigMobs.minotaurHP, ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, ConfigMobs.dreadminotaurAR) - .setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC) - .setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); - public static MinotaurBreed NETHERGUARD = new MinotaurBreed(nether, "dredminotaur_guard", "GuardNether", "iron", 25, - ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, - ConfigMobs.lightminotaurAR + ConfigMobs.dreadminotaurAR) - .setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC) - .setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB) - .setIntelligence(1); - public static MinotaurBreed NETHERELITE = new MinotaurBreed(nether, "dredminotaur_elite", "EliteNether", "steel", - 50, ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, - ConfigMobs.mediumminotaurAR + ConfigMobs.dreadminotaurAR) - .setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC) - .setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB) - .setIntelligence(2); - public static MinotaurBreed NETHERBOSS = new MinotaurBreed(nether, "dredminotaur_boss", "BossNether", "obsidian", - 150, ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, - ConfigMobs.heavyminotaurAR + ConfigMobs.dreadminotaurAR) - .setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC) - .setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB) - .setIntelligence(3).throwBombs(); - - public String name = "minotaur"; - public String tex = "Brown"; - public float health = 50; - public float poundDamage = 8; - public float goreDamage = 8; - public float beserkDamage = 12; - public int beserkThreshold = 40; - public int grabChance = 10; - public int grabChanceBeserk = 25; - public int throwChance = 20; - public int disarmChance = 10; - public ArrayList pool; - public int intelligenceLvl = 0; - - public int experienceValue; - public boolean isSpecial = true; - public String weaponTier; - public int armour_rating; - public boolean throwsBombs = false; - - public MinotaurBreed(ArrayList pool, String name, String tex, String weapons, int xp, float health, - float poundDamage, float goreDamage, int AR) { - this.pool = pool; - pool.add(this); - this.name = name; - this.tex = tex; - this.health = health; - this.poundDamage = poundDamage; - this.goreDamage = goreDamage; - this.beserkDamage = poundDamage * 1.5F; - this.weaponTier = weapons; - this.experienceValue = xp; - this.armour_rating = AR; - } - - /** - * Set beserk stats - * - * @param threshold - * the percent (0-100) health where it triggers (Default 25%) - * @param damage - * (The damage done by melee) - * @param grabChance - * the percent (0-100) chance to grab enemies when beserked (Default - * 25%) - */ - public MinotaurBreed setBeserk(int threshold, float damage, int grabChance) { - this.beserkThreshold = threshold; - this.beserkDamage = damage; - this.grabChanceBeserk = grabChance; - return this; - } - - /** - * - * @param grabChance - * the percent (0-100) chance to disarm enemies with a power attack - * (Default 10%) - * @param grabChance - * the percent (0-100) chance to grab enemies (Default 10%) - * @param grabChance - * the percent (0-100) chance to throw grabbed enemies when hit - * (Default 20%) - * @return - */ - public MinotaurBreed setGrabs(int disarmChance, int grabChance, int throwChance) { - this.disarmChance = disarmChance; - this.grabChance = grabChance; - this.throwChance = throwChance; - return this; - } - - /** - * Set the intelligence for the mob 0 For docile... 1 For basic... 2 For Orderly - */ - public MinotaurBreed setIntelligence(int level) { - this.intelligenceLvl = level; - return this; - } - - /** - * Enables spawning and despawning - */ - public MinotaurBreed setLesser() { - this.isSpecial = false; - return this; - } - - public MinotaurBreed throwBombs() { - this.throwsBombs = true; - return this; - } - - public static int getRandomMinotaur(int species) { - return getRandomMinotaur(species == 1 ? MinotaurBreed.nether : MinotaurBreed.normal); - } - - public static int getRandomMinotaur(ArrayList pool) { - if (pool.size() <= 1) { - return 0; - } - return rand.nextInt(pool.size()); - } - - public static MinotaurBreed getBreed(int species, int id) { - return getBreed(species == 2 ? MinotaurBreed.frost : species == 1 ? MinotaurBreed.nether : MinotaurBreed.normal, - id); - } - - public static MinotaurBreed getBreed(ArrayList pool, int id) { - if (id >= pool.size()) { - id = (pool.size() - 1); - } - return pool.get(id); - } - - public static int getEnvironment(EntityMinotaur mob) { - return getEnvironment(mob.worldObj, (int) mob.posX, (int) mob.posZ, mob.dimension); - } - - public static int getEnvironment(World world, int x, int z, int dimension) { - if (dimension == -1) - return 1;// NETHER - - BiomeGenBase biome = world.getBiomeGenForCoords(x, z); - if (biome != null) { - if (biome.getEnableSnow() || biome.temperature <= 0.25F - || biome.getTempCategory() == BiomeGenBase.TempCategory.COLD) { - return 2;// FROST - } - } - return 0;// BROWN - } - - /** - * What environment is a particular structure - */ - public static int getEnvironment(String subtype) { - return subtype.equalsIgnoreCase("Frost") ? (byte) 2 : subtype.equalsIgnoreCase("Nether") ? (byte) 1 : (byte) 0; - } + public static final ArrayList normal = new ArrayList(); + public static final ArrayList frost = new ArrayList(); + public static final ArrayList nether = new ArrayList(); + public static MinotaurBreed BROWN = new MinotaurBreed(normal, "minotaur", "Brown", null, 10, ConfigMobs.minotaurHP, + ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, 0) + .setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC) + .setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); + public static MinotaurBreed BROWNGUARD = new MinotaurBreed(normal, "minotaur_guard", "GuardBrown", "iron", 20, + ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, + ConfigMobs.lightminotaurAR) + .setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC) + .setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB) + .setIntelligence(1); + public static MinotaurBreed BROWNELITE = new MinotaurBreed(normal, "minotaur_elite", "EliteBrown", "steel", 40, + ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, + ConfigMobs.mediumminotaurAR) + .setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC) + .setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB) + .setIntelligence(2); + public static MinotaurBreed BROWNBOSS = new MinotaurBreed(normal, "minotaur_boss", "BossBrown", "obsidian", 100, + ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, ConfigMobs.heavyminotaurAR) + .setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC) + .setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB) + .setIntelligence(3).throwBombs(); + public static MinotaurBreed FROST = new MinotaurBreed(frost, "frostminotaur", "White", null, 15, + ConfigMobs.minotaurHP, ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, ConfigMobs.frostminotaurAR) + .setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC) + .setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); + public static MinotaurBreed FROSTGUARD = new MinotaurBreed(frost, "frostminotaur_guard", "GuardWhite", "iron", 25, + ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, + ConfigMobs.lightminotaurAR + ConfigMobs.frostminotaurAR) + .setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC) + .setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB) + .setIntelligence(1); + public static MinotaurBreed FROSTELITE = new MinotaurBreed(frost, "frostminotaur_elite", "EliteWhite", "steel", 50, + ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, + ConfigMobs.mediumminotaurAR + ConfigMobs.frostminotaurAR) + .setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC) + .setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB) + .setIntelligence(2); + public static MinotaurBreed FROSTBOSS = new MinotaurBreed(frost, "frostminotaurr_boss", "BossWhite", "obsidian", + 120, ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, + ConfigMobs.heavyminotaurAR + ConfigMobs.frostminotaurAR) + .setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC) + .setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB) + .setIntelligence(3).throwBombs(); + public static MinotaurBreed NETHER = new MinotaurBreed(nether, "dredminotaur", "Nether", null, 15, + ConfigMobs.minotaurHP, ConfigMobs.minotaurMD, ConfigMobs.minotaurGD, ConfigMobs.dreadminotaurAR) + .setGrabs(ConfigMobs.minotaurDC, ConfigMobs.minotaurGC, ConfigMobs.minotaurTC) + .setBeserk(ConfigMobs.minotaurBT, ConfigMobs.minotaurBD, ConfigMobs.minotaurGCB).setLesser(); + public static MinotaurBreed NETHERGUARD = new MinotaurBreed(nether, "dredminotaur_guard", "GuardNether", "iron", 25, + ConfigMobs.guardminotaurHP, ConfigMobs.guardminotaurMD, ConfigMobs.guardminotaurGD, + ConfigMobs.lightminotaurAR + ConfigMobs.dreadminotaurAR) + .setGrabs(ConfigMobs.guardminotaurDC, ConfigMobs.guardminotaurGC, ConfigMobs.guardminotaurTC) + .setBeserk(ConfigMobs.guardminotaurBT, ConfigMobs.guardminotaurBD, ConfigMobs.guardminotaurGCB) + .setIntelligence(1); + public static MinotaurBreed NETHERELITE = new MinotaurBreed(nether, "dredminotaur_elite", "EliteNether", "steel", + 50, ConfigMobs.eliteminotaurHP, ConfigMobs.eliteminotaurMD, ConfigMobs.eliteminotaurGD, + ConfigMobs.mediumminotaurAR + ConfigMobs.dreadminotaurAR) + .setGrabs(ConfigMobs.eliteminotaurDC, ConfigMobs.eliteminotaurGC, ConfigMobs.eliteminotaurTC) + .setBeserk(ConfigMobs.eliteminotaurBT, ConfigMobs.eliteminotaurBD, ConfigMobs.eliteminotaurGCB) + .setIntelligence(2); + public static MinotaurBreed NETHERBOSS = new MinotaurBreed(nether, "dredminotaur_boss", "BossNether", "obsidian", + 150, ConfigMobs.bossminotaurHP, ConfigMobs.bossminotaurMD, ConfigMobs.bossminotaurGD, + ConfigMobs.heavyminotaurAR + ConfigMobs.dreadminotaurAR) + .setGrabs(ConfigMobs.bossminotaurDC, ConfigMobs.bossminotaurGC, ConfigMobs.bossminotaurTC) + .setBeserk(ConfigMobs.bossminotaurBT, ConfigMobs.bossminotaurBD, ConfigMobs.bossminotaurGCB) + .setIntelligence(3).throwBombs(); + private static Random rand = new Random(); + public String name = "minotaur"; + public String tex = "Brown"; + public float health = 50; + public float poundDamage = 8; + public float goreDamage = 8; + public float beserkDamage = 12; + public int beserkThreshold = 40; + public int grabChance = 10; + public int grabChanceBeserk = 25; + public int throwChance = 20; + public int disarmChance = 10; + public ArrayList pool; + public int intelligenceLvl = 0; + + public int experienceValue; + public boolean isSpecial = true; + public String weaponTier; + public int armour_rating; + public boolean throwsBombs = false; + + public MinotaurBreed(ArrayList pool, String name, String tex, String weapons, int xp, float health, + float poundDamage, float goreDamage, int AR) { + this.pool = pool; + pool.add(this); + this.name = name; + this.tex = tex; + this.health = health; + this.poundDamage = poundDamage; + this.goreDamage = goreDamage; + this.beserkDamage = poundDamage * 1.5F; + this.weaponTier = weapons; + this.experienceValue = xp; + this.armour_rating = AR; + } + + public static int getRandomMinotaur(int species) { + return getRandomMinotaur(species == 1 ? MinotaurBreed.nether : MinotaurBreed.normal); + } + + public static int getRandomMinotaur(ArrayList pool) { + if (pool.size() <= 1) { + return 0; + } + return rand.nextInt(pool.size()); + } + + public static MinotaurBreed getBreed(int species, int id) { + return getBreed(species == 2 ? MinotaurBreed.frost : species == 1 ? MinotaurBreed.nether : MinotaurBreed.normal, + id); + } + + public static MinotaurBreed getBreed(ArrayList pool, int id) { + if (id >= pool.size()) { + id = (pool.size() - 1); + } + return pool.get(id); + } + + public static int getEnvironment(EntityMinotaur mob) { + return getEnvironment(mob.worldObj, (int) mob.posX, (int) mob.posZ, mob.dimension); + } + + public static int getEnvironment(World world, int x, int z, int dimension) { + if (dimension == -1) + return 1;// NETHER + + BiomeGenBase biome = world.getBiomeGenForCoords(x, z); + if (biome != null) { + if (biome.getEnableSnow() || biome.temperature <= 0.25F + || biome.getTempCategory() == BiomeGenBase.TempCategory.COLD) { + return 2;// FROST + } + } + return 0;// BROWN + } + + /** + * What environment is a particular structure + */ + public static int getEnvironment(String subtype) { + return subtype.equalsIgnoreCase("Frost") ? (byte) 2 : subtype.equalsIgnoreCase("Nether") ? (byte) 1 : (byte) 0; + } + + /** + * Set beserk stats + * + * @param threshold the percent (0-100) health where it triggers (Default 25%) + * @param damage (The damage done by melee) + * @param grabChance the percent (0-100) chance to grab enemies when beserked (Default + * 25%) + */ + public MinotaurBreed setBeserk(int threshold, float damage, int grabChance) { + this.beserkThreshold = threshold; + this.beserkDamage = damage; + this.grabChanceBeserk = grabChance; + return this; + } + + /** + * @param grabChance the percent (0-100) chance to disarm enemies with a power attack + * (Default 10%) + * @param grabChance the percent (0-100) chance to grab enemies (Default 10%) + * @param grabChance the percent (0-100) chance to throw grabbed enemies when hit + * (Default 20%) + * @return + */ + public MinotaurBreed setGrabs(int disarmChance, int grabChance, int throwChance) { + this.disarmChance = disarmChance; + this.grabChance = grabChance; + this.throwChance = throwChance; + return this; + } + + /** + * Set the intelligence for the mob 0 For docile... 1 For basic... 2 For Orderly + */ + public MinotaurBreed setIntelligence(int level) { + this.intelligenceLvl = level; + return this; + } + + /** + * Enables spawning and despawning + */ + public MinotaurBreed setLesser() { + this.isSpecial = false; + return this; + } + + public MinotaurBreed throwBombs() { + this.throwsBombs = true; + return this; + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/PoisonBreath.java b/src/main/java/minefantasy/mf2/entity/mob/PoisonBreath.java index 9f9e3dde..1222e416 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/PoisonBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/PoisonBreath.java @@ -15,53 +15,53 @@ public class PoisonBreath extends DragonBreath { - public PoisonBreath(String name) { - super(name); - } + public PoisonBreath(String name) { + super(name); + } - @Override - public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { - return shooter == null ? new DamageSource("acidblastBase") - : (new EntityDamageSourceIndirect("acidblast", breath, shooter)); - } + @Override + public DamageSource getDamageSource(EntityDragonBreath breath, EntityLivingBase shooter) { + return shooter == null ? new DamageSource("acidblastBase") + : (new EntityDamageSourceIndirect("acidblast", breath, shooter)); + } - @Override - @SideOnly(Side.CLIENT) - public String getTexture(EntityDragonBreath instance) { - return "textures/projectile/dragonbreath_poison"; - } + @Override + @SideOnly(Side.CLIENT) + public String getTexture(EntityDragonBreath instance) { + return "textures/projectile/dragonbreath_poison"; + } - public void onHitEntity(Entity target, EntityDragonBreath instance) { - super.onHitEntity(target, instance); - if (target instanceof EntityLivingBase) { - float dam = instance.getDamage(); - ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.poison.id, 40, (int) dam)); - ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.confusion.id, 50, 10)); + public void onHitEntity(Entity target, EntityDragonBreath instance) { + super.onHitEntity(target, instance); + if (target instanceof EntityLivingBase) { + float dam = instance.getDamage(); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.poison.id, 40, (int) dam)); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.confusion.id, 50, 10)); - if (instance.rand.nextInt(10) == 0) { - for (int a = 0; a < 5; a++) { - ItemStack item = ((EntityLivingBase) target).getEquipmentInSlot(a); - if (item != null) { - item.damageItem((int) dam, ((EntityLivingBase) target)); - if (item.getItemDamage() >= item.getMaxDamage()) { - ((EntityLivingBase) target).renderBrokenItemStack(item); - ((EntityLivingBase) target).setCurrentItemOrArmor(a, null); - } - } - } - } - } - } + if (instance.rand.nextInt(10) == 0) { + for (int a = 0; a < 5; a++) { + ItemStack item = ((EntityLivingBase) target).getEquipmentInSlot(a); + if (item != null) { + item.damageItem((int) dam, ((EntityLivingBase) target)); + if (item.getItemDamage() >= item.getMaxDamage()) { + ((EntityLivingBase) target).renderBrokenItemStack(item); + ((EntityLivingBase) target).setCurrentItemOrArmor(a, null); + } + } + } + } + } + } - @Override - public float modifyDamage(Entity hit, float dam) { - if (hit instanceof EntityCogwork) { - return dam * 2; - } - return dam; - } + @Override + public float modifyDamage(Entity hit, float dam) { + if (hit instanceof EntityCogwork) { + return dam * 2; + } + return dam; + } - @Override - public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { - } + @Override + public void hitBlock(World world, EntityDragonBreath instance, int x, int y, int z, boolean impact) { + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/ai/AI_CommonSprint.java b/src/main/java/minefantasy/mf2/entity/mob/ai/AI_CommonSprint.java index 80313cee..14355540 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/ai/AI_CommonSprint.java +++ b/src/main/java/minefantasy/mf2/entity/mob/ai/AI_CommonSprint.java @@ -6,35 +6,35 @@ import net.minecraft.pathfinding.PathPoint; public class AI_CommonSprint extends EntityAIBase { - public EntityLiving entity; - public float range; + public EntityLiving entity; + public float range; - public AI_CommonSprint(EntityLiving entity, float range) { - this.entity = entity; - this.range = range; - } + public AI_CommonSprint(EntityLiving entity, float range) { + this.entity = entity; + this.range = range; + } - @Override - public boolean shouldExecute() { - return !this.entity.isChild(); - } + @Override + public boolean shouldExecute() { + return !this.entity.isChild(); + } - @Override - public void updateTask() { - double distance = 0; - PathEntity path = this.entity.getNavigator().getPath(); - if (path != null) { - PathPoint end = path.getFinalPathPoint(); - if (path != null) { - distance = this.entity.getDistanceSq(end.xCoord, end.yCoord, end.zCoord); - } + @Override + public void updateTask() { + double distance = 0; + PathEntity path = this.entity.getNavigator().getPath(); + if (path != null) { + PathPoint end = path.getFinalPathPoint(); + if (path != null) { + distance = this.entity.getDistanceSq(end.xCoord, end.yCoord, end.zCoord); + } - } - boolean isSprinting = this.entity.isSprinting(); - boolean shouldSprint = distance >= this.range; - if (isSprinting != shouldSprint) { - this.entity.setSprinting(shouldSprint); - } - } + } + boolean isSprinting = this.entity.isSprinting(); + boolean shouldSprint = distance >= this.range; + if (isSprinting != shouldSprint) { + this.entity.setSprinting(shouldSprint); + } + } } diff --git a/src/main/java/minefantasy/mf2/entity/mob/ai/AI_MinotaurFindTarget.java b/src/main/java/minefantasy/mf2/entity/mob/ai/AI_MinotaurFindTarget.java index 03481bb9..e7b3ee39 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/ai/AI_MinotaurFindTarget.java +++ b/src/main/java/minefantasy/mf2/entity/mob/ai/AI_MinotaurFindTarget.java @@ -1,103 +1,102 @@ package minefantasy.mf2.entity.mob.ai; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - import minefantasy.mf2.entity.mob.EntityMinotaur; import net.minecraft.command.IEntitySelector; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAITarget; -public class AI_MinotaurFindTarget extends EntityAITarget { - private final Class targetClass; - private final int targetChance; - private final AI_MinotaurFindTarget.Sorter theNearestAttackableTargetSorter; - private final IEntitySelector targetEntitySelector; - private EntityLivingBase targetEntity; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; - private final EntityMinotaur minotaur; +public class AI_MinotaurFindTarget extends EntityAITarget { + private final Class targetClass; + private final int targetChance; + private final AI_MinotaurFindTarget.Sorter theNearestAttackableTargetSorter; + private final IEntitySelector targetEntitySelector; + private final EntityMinotaur minotaur; + private EntityLivingBase targetEntity; - public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight) { - this(mob, target, chance, sight, false); - } + public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight) { + this(mob, target, chance, sight, false); + } - public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight, boolean nearby) { - this(mob, target, chance, sight, nearby, (IEntitySelector) null); - } + public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight, boolean nearby) { + this(mob, target, chance, sight, nearby, (IEntitySelector) null); + } - public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight, boolean nearby, - final IEntitySelector selector) { - super(mob, sight, nearby); - this.minotaur = mob; - this.targetClass = target; - this.targetChance = chance; - this.theNearestAttackableTargetSorter = new AI_MinotaurFindTarget.Sorter(mob); - this.setMutexBits(1); - this.targetEntitySelector = new IEntitySelector() { - public boolean isEntityApplicable(Entity target) { - if (target instanceof EntityMinotaur) { - return false; - } - return !(target instanceof EntityLivingBase) ? false - : (selector != null && !selector.isEntityApplicable(target) ? false - : AI_MinotaurFindTarget.this.isSuitableTarget((EntityLivingBase) target, false)); - } - }; - } + public AI_MinotaurFindTarget(EntityMinotaur mob, Class target, int chance, boolean sight, boolean nearby, + final IEntitySelector selector) { + super(mob, sight, nearby); + this.minotaur = mob; + this.targetClass = target; + this.targetChance = chance; + this.theNearestAttackableTargetSorter = new AI_MinotaurFindTarget.Sorter(mob); + this.setMutexBits(1); + this.targetEntitySelector = new IEntitySelector() { + public boolean isEntityApplicable(Entity target) { + if (target instanceof EntityMinotaur) { + return false; + } + return !(target instanceof EntityLivingBase) ? false + : (selector != null && !selector.isEntityApplicable(target) ? false + : AI_MinotaurFindTarget.this.isSuitableTarget((EntityLivingBase) target, false)); + } + }; + } - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - if (this.targetChance > 0 && this.taskOwner.getRNG().nextInt(this.targetChance) != 0) { - return false; - } else { - double d0 = this.getTargetDistance(); - if (minotaur.isDocile())// Docile are less aggro when calm - { - if (minotaur.getRageLevel() < 10) { - d0 = 1.5D; - } - } + /** + * Returns whether the EntityAIBase should begin execution. + */ + public boolean shouldExecute() { + if (this.targetChance > 0 && this.taskOwner.getRNG().nextInt(this.targetChance) != 0) { + return false; + } else { + double d0 = this.getTargetDistance(); + if (minotaur.isDocile())// Docile are less aggro when calm + { + if (minotaur.getRageLevel() < 10) { + d0 = 1.5D; + } + } - List list = this.taskOwner.worldObj.selectEntitiesWithinAABB(this.targetClass, - this.taskOwner.boundingBox.expand(d0, 4.0D, d0), this.targetEntitySelector); - Collections.sort(list, this.theNearestAttackableTargetSorter); + List list = this.taskOwner.worldObj.selectEntitiesWithinAABB(this.targetClass, + this.taskOwner.boundingBox.expand(d0, 4.0D, d0), this.targetEntitySelector); + Collections.sort(list, this.theNearestAttackableTargetSorter); - if (list.isEmpty()) { - return false; - } else { - this.targetEntity = (EntityLivingBase) list.get(0); - return true; - } - } - } + if (list.isEmpty()) { + return false; + } else { + this.targetEntity = (EntityLivingBase) list.get(0); + return true; + } + } + } - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() { - this.taskOwner.setAttackTarget(this.targetEntity); - super.startExecuting(); - } + /** + * Execute a one shot task or start executing a continuous task + */ + public void startExecuting() { + this.taskOwner.setAttackTarget(this.targetEntity); + super.startExecuting(); + } - public static class Sorter implements Comparator { - private final Entity theEntity; + public static class Sorter implements Comparator { + private final Entity theEntity; - public Sorter(Entity p_i1662_1_) { - this.theEntity = p_i1662_1_; - } + public Sorter(Entity p_i1662_1_) { + this.theEntity = p_i1662_1_; + } - public int compare(Entity p_compare_1_, Entity p_compare_2_) { - double d0 = this.theEntity.getDistanceSqToEntity(p_compare_1_); - double d1 = this.theEntity.getDistanceSqToEntity(p_compare_2_); - return d0 < d1 ? -1 : (d0 > d1 ? 1 : 0); - } + public int compare(Entity p_compare_1_, Entity p_compare_2_) { + double d0 = this.theEntity.getDistanceSqToEntity(p_compare_1_); + double d1 = this.theEntity.getDistanceSqToEntity(p_compare_2_); + return d0 < d1 ? -1 : (d0 > d1 ? 1 : 0); + } - public int compare(Object p_compare_1_, Object p_compare_2_) { - return this.compare((Entity) p_compare_1_, (Entity) p_compare_2_); - } - } + public int compare(Object p_compare_1_, Object p_compare_2_) { + return this.compare((Entity) p_compare_1_, (Entity) p_compare_2_); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundBeg.java b/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundBeg.java index 7f89d8e4..9003e1be 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundBeg.java +++ b/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundBeg.java @@ -8,71 +8,71 @@ import net.minecraft.world.World; public class AI_HoundBeg extends EntityAIBase { - private EntityHound theWolf; - private EntityPlayer thePlayer; - private World worldObject; - private float minPlayerDistance; - private int field_75384_e; - private static final String __OBFID = "CL_00001576"; + private static final String __OBFID = "CL_00001576"; + private EntityHound theWolf; + private EntityPlayer thePlayer; + private World worldObject; + private float minPlayerDistance; + private int field_75384_e; - public AI_HoundBeg(EntityHound p_i1617_1_, float p_i1617_2_) { - this.theWolf = p_i1617_1_; - this.worldObject = p_i1617_1_.worldObj; - this.minPlayerDistance = p_i1617_2_; - this.setMutexBits(2); - } + public AI_HoundBeg(EntityHound p_i1617_1_, float p_i1617_2_) { + this.theWolf = p_i1617_1_; + this.worldObject = p_i1617_1_.worldObj; + this.minPlayerDistance = p_i1617_2_; + this.setMutexBits(2); + } - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - this.thePlayer = this.worldObject.getClosestPlayerToEntity(this.theWolf, this.minPlayerDistance); - return this.thePlayer == null ? false : this.hasPlayerGotBoneInHand(this.thePlayer); - } + /** + * Returns whether the EntityAIBase should begin execution. + */ + public boolean shouldExecute() { + this.thePlayer = this.worldObject.getClosestPlayerToEntity(this.theWolf, this.minPlayerDistance); + return this.thePlayer == null ? false : this.hasPlayerGotBoneInHand(this.thePlayer); + } - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() { - return !this.thePlayer.isEntityAlive() ? false - : (this.theWolf.getDistanceSqToEntity(this.thePlayer) > this.minPlayerDistance * this.minPlayerDistance - ? false - : this.field_75384_e > 0 && this.hasPlayerGotBoneInHand(this.thePlayer)); - } + /** + * Returns whether an in-progress EntityAIBase should continue executing + */ + public boolean continueExecuting() { + return !this.thePlayer.isEntityAlive() ? false + : (this.theWolf.getDistanceSqToEntity(this.thePlayer) > this.minPlayerDistance * this.minPlayerDistance + ? false + : this.field_75384_e > 0 && this.hasPlayerGotBoneInHand(this.thePlayer)); + } - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() { - this.theWolf.func_70918_i(true); - this.field_75384_e = 40 + this.theWolf.getRNG().nextInt(40); - } + /** + * Execute a one shot task or start executing a continuous task + */ + public void startExecuting() { + this.theWolf.func_70918_i(true); + this.field_75384_e = 40 + this.theWolf.getRNG().nextInt(40); + } - /** - * Resets the task - */ - public void resetTask() { - this.theWolf.func_70918_i(false); - this.thePlayer = null; - } + /** + * Resets the task + */ + public void resetTask() { + this.theWolf.func_70918_i(false); + this.thePlayer = null; + } - /** - * Updates the task - */ - public void updateTask() { - this.theWolf.getLookHelper().setLookPosition(this.thePlayer.posX, - this.thePlayer.posY + this.thePlayer.getEyeHeight(), this.thePlayer.posZ, 10.0F, - this.theWolf.getVerticalFaceSpeed()); - --this.field_75384_e; - } + /** + * Updates the task + */ + public void updateTask() { + this.theWolf.getLookHelper().setLookPosition(this.thePlayer.posX, + this.thePlayer.posY + this.thePlayer.getEyeHeight(), this.thePlayer.posZ, 10.0F, + this.theWolf.getVerticalFaceSpeed()); + --this.field_75384_e; + } - /** - * Gets if the Player has the Bone in the hand. - */ - private boolean hasPlayerGotBoneInHand(EntityPlayer p_75382_1_) { - ItemStack itemstack = p_75382_1_.inventory.getCurrentItem(); - return itemstack == null ? false - : (!this.theWolf.isTamed() && itemstack.getItem() == Items.bone ? true - : this.theWolf.isBreedingItem(itemstack)); - } + /** + * Gets if the Player has the Bone in the hand. + */ + private boolean hasPlayerGotBoneInHand(EntityPlayer p_75382_1_) { + ItemStack itemstack = p_75382_1_.inventory.getCurrentItem(); + return itemstack == null ? false + : (!this.theWolf.isTamed() && itemstack.getItem() == Items.bone ? true + : this.theWolf.isBreedingItem(itemstack)); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundFollow.java b/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundFollow.java index ec1256f8..3dce898d 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundFollow.java +++ b/src/main/java/minefantasy/mf2/entity/mob/ai/hound/AI_HoundFollow.java @@ -8,106 +8,106 @@ import net.minecraft.world.World; public class AI_HoundFollow extends EntityAIBase { - private EntityHound thePet; - private EntityLivingBase theOwner; - World theWorld; - private double field_75336_f; - private PathNavigate petPathfinder; - private int field_75343_h; - float maxDist; - float minDist; - private boolean field_75344_i; + World theWorld; + float maxDist; + float minDist; + private EntityHound thePet; + private EntityLivingBase theOwner; + private double field_75336_f; + private PathNavigate petPathfinder; + private int field_75343_h; + private boolean field_75344_i; - public AI_HoundFollow(EntityHound dog, double p_i1625_2_, float min, float max) { - this.thePet = dog; - this.theWorld = dog.worldObj; - this.field_75336_f = p_i1625_2_; - this.petPathfinder = dog.getNavigator(); - this.minDist = min; - this.maxDist = max; - this.setMutexBits(3); - } + public AI_HoundFollow(EntityHound dog, double p_i1625_2_, float min, float max) { + this.thePet = dog; + this.theWorld = dog.worldObj; + this.field_75336_f = p_i1625_2_; + this.petPathfinder = dog.getNavigator(); + this.minDist = min; + this.maxDist = max; + this.setMutexBits(3); + } - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - EntityLivingBase entitylivingbase = this.thePet.getOwner(); + /** + * Returns whether the EntityAIBase should begin execution. + */ + public boolean shouldExecute() { + EntityLivingBase entitylivingbase = this.thePet.getOwner(); - if (entitylivingbase == null) { - return false; - } else if (this.thePet.isSitting()) { - return false; - } else if (this.thePet.getDistanceSqToEntity(entitylivingbase) < this.minDist * this.minDist) { - return false; - } else { - this.theOwner = entitylivingbase; - return true; - } - } + if (entitylivingbase == null) { + return false; + } else if (this.thePet.isSitting()) { + return false; + } else if (this.thePet.getDistanceSqToEntity(entitylivingbase) < this.minDist * this.minDist) { + return false; + } else { + this.theOwner = entitylivingbase; + return true; + } + } - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() { - return !this.petPathfinder.noPath() - && this.thePet.getDistanceSqToEntity(this.theOwner) > this.maxDist * this.maxDist - && !this.thePet.isSitting(); - } + /** + * Returns whether an in-progress EntityAIBase should continue executing + */ + public boolean continueExecuting() { + return !this.petPathfinder.noPath() + && this.thePet.getDistanceSqToEntity(this.theOwner) > this.maxDist * this.maxDist + && !this.thePet.isSitting(); + } - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() { - this.field_75343_h = 0; - this.field_75344_i = this.thePet.getNavigator().getAvoidsWater(); - this.thePet.getNavigator().setAvoidsWater(false); - } + /** + * Execute a one shot task or start executing a continuous task + */ + public void startExecuting() { + this.field_75343_h = 0; + this.field_75344_i = this.thePet.getNavigator().getAvoidsWater(); + this.thePet.getNavigator().setAvoidsWater(false); + } - /** - * Resets the task - */ - public void resetTask() { - this.theOwner = null; - this.petPathfinder.clearPathEntity(); - this.thePet.getNavigator().setAvoidsWater(this.field_75344_i); - } + /** + * Resets the task + */ + public void resetTask() { + this.theOwner = null; + this.petPathfinder.clearPathEntity(); + this.thePet.getNavigator().setAvoidsWater(this.field_75344_i); + } - /** - * Updates the task - */ - public void updateTask() { - this.thePet.getLookHelper().setLookPositionWithEntity(this.theOwner, 10.0F, this.thePet.getVerticalFaceSpeed()); + /** + * Updates the task + */ + public void updateTask() { + this.thePet.getLookHelper().setLookPositionWithEntity(this.theOwner, 10.0F, this.thePet.getVerticalFaceSpeed()); - if (!this.thePet.isSitting() && this.thePet.shouldFollowOwner()) { - if (--this.field_75343_h <= 0) { - this.field_75343_h = 10; + if (!this.thePet.isSitting() && this.thePet.shouldFollowOwner()) { + if (--this.field_75343_h <= 0) { + this.field_75343_h = 10; - if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.field_75336_f)) { - if (!this.thePet.getLeashed()) { - if (this.thePet.getDistanceSqToEntity(this.theOwner) >= 144.0D)// Teleport - { - int i = MathHelper.floor_double(this.theOwner.posX) - 2; - int j = MathHelper.floor_double(this.theOwner.posZ) - 2; - int k = MathHelper.floor_double(this.theOwner.boundingBox.minY); + if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.field_75336_f)) { + if (!this.thePet.getLeashed()) { + if (this.thePet.getDistanceSqToEntity(this.theOwner) >= 144.0D)// Teleport + { + int i = MathHelper.floor_double(this.theOwner.posX) - 2; + int j = MathHelper.floor_double(this.theOwner.posZ) - 2; + int k = MathHelper.floor_double(this.theOwner.boundingBox.minY); - for (int l = 0; l <= 4; ++l) { - for (int i1 = 0; i1 <= 4; ++i1) { - if ((l < 1 || i1 < 1 || l > 3 || i1 > 3) - && World.doesBlockHaveSolidTopSurface(this.theWorld, i + l, k - 1, j + i1) - && !this.theWorld.getBlock(i + l, k, j + i1).isNormalCube() - && !this.theWorld.getBlock(i + l, k + 1, j + i1).isNormalCube()) { - this.thePet.setLocationAndAngles(i + l + 0.5F, k, j + i1 + 0.5F, - this.thePet.rotationYaw, this.thePet.rotationPitch); - this.petPathfinder.clearPathEntity(); - return; - } - } - } - } - } - } - } - } - } + for (int l = 0; l <= 4; ++l) { + for (int i1 = 0; i1 <= 4; ++i1) { + if ((l < 1 || i1 < 1 || l > 3 || i1 > 3) + && World.doesBlockHaveSolidTopSurface(this.theWorld, i + l, k - 1, j + i1) + && !this.theWorld.getBlock(i + l, k, j + i1).isNormalCube() + && !this.theWorld.getBlock(i + l, k + 1, j + i1).isNormalCube()) { + this.thePet.setLocationAndAngles(i + l + 0.5F, k, j + i1 + 0.5F, + this.thePet.rotationYaw, this.thePet.rotationPitch); + this.petPathfinder.clearPathEntity(); + return; + } + } + } + } + } + } + } + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/farming/FarmingHelper.java b/src/main/java/minefantasy/mf2/farming/FarmingHelper.java index 6fdb5a7b..3403dd0b 100644 --- a/src/main/java/minefantasy/mf2/farming/FarmingHelper.java +++ b/src/main/java/minefantasy/mf2/farming/FarmingHelper.java @@ -1,7 +1,5 @@ package minefantasy.mf2.farming; -import java.util.Random; - import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.farming.CustomHoeEntry; import net.minecraft.item.Item.ToolMaterial; @@ -9,48 +7,48 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import java.util.Random; + public class FarmingHelper { - private static Random rand = new Random(); - private static float hoeFailChanceModifier = 1.0F; - - public static boolean isEnabled = true; - - public static float hoeFailChanceCfg = 1.0F; - public static float farmBreakCfg = 1.0F; - - public static boolean didHoeFail(ItemStack hoe, World world, boolean grass) { - if (!isEnabled) { - return false; - } - float chanceMax = 30F * hoeFailChanceModifier * hoeFailChanceCfg; - float chance = rand.nextFloat() * chanceMax; - float efficiency = (getHoeEfficiency(hoe) * (grass ? 2.0F : 3.0F)); - - MineFantasyAPI.debugMsg("Hoe Chance Fail = " + chance + " / " + efficiency + " (max= " + chanceMax + ")"); - return chance > efficiency;// Dirt is easier to hoe - } - - public static boolean didHarvestRuinBlock(World world, boolean scythe) { - if (!isEnabled) { - return false; - } - float chance = 20F + (world.difficultySetting.getDifficultyId() * 10F); - if (scythe) - chance *= 2F; - return rand.nextFloat() * 100F <= chance * farmBreakCfg; - } - - private static float getHoeEfficiency(ItemStack hoe) { - if (hoe != null) { - if (hoe.getItem() instanceof ItemHoe) { - String name = ((ItemHoe) hoe.getItem()).getToolMaterialName(); - ToolMaterial mat = ToolMaterial.valueOf(name); - - if (mat != null) { - return CustomHoeEntry.getEntryEfficiency(hoe, mat.getEfficiencyOnProperMaterial()); - } - } - } - return CustomHoeEntry.getEntryEfficiency(hoe, 6.0F); - } + public static boolean isEnabled = true; + public static float hoeFailChanceCfg = 1.0F; + public static float farmBreakCfg = 1.0F; + private static Random rand = new Random(); + private static float hoeFailChanceModifier = 1.0F; + + public static boolean didHoeFail(ItemStack hoe, World world, boolean grass) { + if (!isEnabled) { + return false; + } + float chanceMax = 30F * hoeFailChanceModifier * hoeFailChanceCfg; + float chance = rand.nextFloat() * chanceMax; + float efficiency = (getHoeEfficiency(hoe) * (grass ? 2.0F : 3.0F)); + + MineFantasyAPI.debugMsg("Hoe Chance Fail = " + chance + " / " + efficiency + " (max= " + chanceMax + ")"); + return chance > efficiency;// Dirt is easier to hoe + } + + public static boolean didHarvestRuinBlock(World world, boolean scythe) { + if (!isEnabled) { + return false; + } + float chance = 20F + (world.difficultySetting.getDifficultyId() * 10F); + if (scythe) + chance *= 2F; + return rand.nextFloat() * 100F <= chance * farmBreakCfg; + } + + private static float getHoeEfficiency(ItemStack hoe) { + if (hoe != null) { + if (hoe.getItem() instanceof ItemHoe) { + String name = ((ItemHoe) hoe.getItem()).getToolMaterialName(); + ToolMaterial mat = ToolMaterial.valueOf(name); + + if (mat != null) { + return CustomHoeEntry.getEntryEfficiency(hoe, mat.getEfficiencyOnProperMaterial()); + } + } + } + return CustomHoeEntry.getEntryEfficiency(hoe, 6.0F); + } } diff --git a/src/main/java/minefantasy/mf2/hunger/HungerSystemMF.java b/src/main/java/minefantasy/mf2/hunger/HungerSystemMF.java index 61c30fc5..bbfaf925 100644 --- a/src/main/java/minefantasy/mf2/hunger/HungerSystemMF.java +++ b/src/main/java/minefantasy/mf2/hunger/HungerSystemMF.java @@ -6,96 +6,95 @@ import net.minecraft.entity.player.EntityPlayer; public class HungerSystemMF { - private static final String prevFoodNBT = "MF_previousFoodLevel"; - private static final String tempFoodNBT = "MF_tempFood"; - private static final String saturationNBT = "MF_saturationTicks"; - - @SubscribeEvent - public void onPlayerTick(TickEvent.PlayerTickEvent event) { - if (!event.player.worldObj.isRemote) { - if (event.phase == TickEvent.Phase.START) { - event.player.getEntityData().setInteger(prevFoodNBT, event.player.getFoodStats().getFoodLevel()); - } - if (event.phase == TickEvent.Phase.END) { - slowHunger(event.player); - } - } - } - - public void slowHunger(EntityPlayer player) { - // init vars - int food = player.getFoodStats().getFoodLevel(); - - int prevFood = food; - if (player.getEntityData().hasKey(prevFoodNBT)) { - prevFood = player.getEntityData().getInteger(prevFoodNBT); - } - - if (food < prevFood) { - float sat = getSaturation(player); - float temp = getTempFood(player); - MineFantasyAPI.debugMsg("Saturation: " + sat + " Temp: " + temp); - - if (slowdownRate < 0 || temp > 0) { - MineFantasyAPI.debugMsg("Hunger drop cancelled: Temp"); - setTempFood(player, temp - 1); - player.getFoodStats().addStats(1, 0.0F); - } else if (sat > 0) { - decrSaturation(player); - MineFantasyAPI.debugMsg("Hunger drop cancelled: Sat = " + (sat - 1)); - player.getFoodStats().addStats(1, 0.0F); - } - - if (temp <= 0) { - setTempFood(player, getTempSlowdownLvl(player)); - } - } - } - - private float getTempSlowdownLvl(EntityPlayer player) { - return slowdownRate; - } - - public static int slowdownRate = 3; - - public static void setSaturation(EntityPlayer user, float value) { - user.getEntityData().setFloat(saturationNBT, value); - } - - public static float getSaturation(EntityPlayer user) { - if (user.getEntityData().hasKey(saturationNBT)) { - return user.getEntityData().getFloat(saturationNBT); - } - return 0F; - } - - public static void setTempFood(EntityPlayer user, float value) { - user.getEntityData().setFloat(tempFoodNBT, value); - } - - public static float getTempFood(EntityPlayer user) { - if (user.getEntityData().hasKey(tempFoodNBT)) { - return user.getEntityData().getFloat(tempFoodNBT); - } - return 0F; - } - - public static void decrSaturation(EntityPlayer user) { - float sat = getSaturation(user); - sat--; - if (sat < 0) { - sat = -1; - } - if (!user.worldObj.isRemote) { - setSaturation(user, sat); - } - } - - public static void applySaturation(EntityPlayer consumer, float newValue) { - float value = getSaturation(consumer); - - if (newValue > value) { - setSaturation(consumer, newValue); - } - } + private static final String prevFoodNBT = "MF_previousFoodLevel"; + private static final String tempFoodNBT = "MF_tempFood"; + private static final String saturationNBT = "MF_saturationTicks"; + public static int slowdownRate = 3; + + public static void setSaturation(EntityPlayer user, float value) { + user.getEntityData().setFloat(saturationNBT, value); + } + + public static float getSaturation(EntityPlayer user) { + if (user.getEntityData().hasKey(saturationNBT)) { + return user.getEntityData().getFloat(saturationNBT); + } + return 0F; + } + + public static void setTempFood(EntityPlayer user, float value) { + user.getEntityData().setFloat(tempFoodNBT, value); + } + + public static float getTempFood(EntityPlayer user) { + if (user.getEntityData().hasKey(tempFoodNBT)) { + return user.getEntityData().getFloat(tempFoodNBT); + } + return 0F; + } + + public static void decrSaturation(EntityPlayer user) { + float sat = getSaturation(user); + sat--; + if (sat < 0) { + sat = -1; + } + if (!user.worldObj.isRemote) { + setSaturation(user, sat); + } + } + + public static void applySaturation(EntityPlayer consumer, float newValue) { + float value = getSaturation(consumer); + + if (newValue > value) { + setSaturation(consumer, newValue); + } + } + + @SubscribeEvent + public void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (!event.player.worldObj.isRemote) { + if (event.phase == TickEvent.Phase.START) { + event.player.getEntityData().setInteger(prevFoodNBT, event.player.getFoodStats().getFoodLevel()); + } + if (event.phase == TickEvent.Phase.END) { + slowHunger(event.player); + } + } + } + + public void slowHunger(EntityPlayer player) { + // init vars + int food = player.getFoodStats().getFoodLevel(); + + int prevFood = food; + if (player.getEntityData().hasKey(prevFoodNBT)) { + prevFood = player.getEntityData().getInteger(prevFoodNBT); + } + + if (food < prevFood) { + float sat = getSaturation(player); + float temp = getTempFood(player); + MineFantasyAPI.debugMsg("Saturation: " + sat + " Temp: " + temp); + + if (slowdownRate < 0 || temp > 0) { + MineFantasyAPI.debugMsg("Hunger drop cancelled: Temp"); + setTempFood(player, temp - 1); + player.getFoodStats().addStats(1, 0.0F); + } else if (sat > 0) { + decrSaturation(player); + MineFantasyAPI.debugMsg("Hunger drop cancelled: Sat = " + (sat - 1)); + player.getFoodStats().addStats(1, 0.0F); + } + + if (temp <= 0) { + setTempFood(player, getTempSlowdownLvl(player)); + } + } + } + + private float getTempSlowdownLvl(EntityPlayer player) { + return slowdownRate; + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java index c04e644f..d0402303 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -11,12 +11,12 @@ public class MTCompat { - private static final Class[] tweakers = { Anvil.class, Bloomery.class, CarpentersBench.class, CustomMaterialHandler.class, Crucible.class, - Forge.class, MaterialExpansion.class, TanningRack.class }; + private static final Class[] tweakers = {Anvil.class, Bloomery.class, CarpentersBench.class, CustomMaterialHandler.class, Crucible.class, + Forge.class, MaterialExpansion.class, TanningRack.class}; - public static void loadTweakers() { - for (Class tweaker : tweakers) { - MineTweakerAPI.registerClass(tweaker); - } - } + public static void loadTweakers() { + for (Class tweaker : tweakers) { + MineTweakerAPI.registerClass(tweaker); + } + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java index 82cee0f0..d499ecf7 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java @@ -1,9 +1,5 @@ package minefantasy.mf2.integration.minetweaker; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import minefantasy.mf2.api.crafting.MineFantasyFuels; import minefantasy.mf2.api.refine.Alloy; import minetweaker.api.item.IIngredient; @@ -12,53 +8,57 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + public class TweakedAlloyRecipe extends Alloy { - public TweakedAlloyRecipe(IItemStack output, int requiredLevel, List items) { - super(MineTweakerMC.getItemStack(output), requiredLevel, items); - } + public TweakedAlloyRecipe(IItemStack output, int requiredLevel, List items) { + super(MineTweakerMC.getItemStack(output), requiredLevel, items); + } - @Override - public boolean matches(ItemStack[] inv) { - ArrayList check = new ArrayList(recipeItems); - ArrayList check2 = new ArrayList(recipeItems); - for (ItemStack stack : inv) { - if (stack != null) { - boolean matches = false; - Iterator it = check.iterator(); - while (it.hasNext()) { - IIngredient ingred = (IIngredient) it.next(); - for (IItemStack i : ingred.getItems()) { - ItemStack is = MineTweakerMC.getItemStack(i); - if (stack.isItemEqual(is) && (is.getItemDamage() == OreDictionary.WILDCARD_VALUE - || is.getItemDamage() == stack.getItemDamage())) { - matches = true; - check2.remove(ingred); - break; - } - if (areBothCarbon(is, stack)) { - matches = true; - check2.remove(ingred); - break; - } - } - if (matches) - break; - } - if (!matches) - return false; - } - } - boolean empty = true; - for (Object o : check2) { - if (o != null) - empty = false; - } - return empty; - } + @Override + public boolean matches(ItemStack[] inv) { + ArrayList check = new ArrayList(recipeItems); + ArrayList check2 = new ArrayList(recipeItems); + for (ItemStack stack : inv) { + if (stack != null) { + boolean matches = false; + Iterator it = check.iterator(); + while (it.hasNext()) { + IIngredient ingred = (IIngredient) it.next(); + for (IItemStack i : ingred.getItems()) { + ItemStack is = MineTweakerMC.getItemStack(i); + if (stack.isItemEqual(is) && (is.getItemDamage() == OreDictionary.WILDCARD_VALUE + || is.getItemDamage() == stack.getItemDamage())) { + matches = true; + check2.remove(ingred); + break; + } + if (areBothCarbon(is, stack)) { + matches = true; + check2.remove(ingred); + break; + } + } + if (matches) + break; + } + if (!matches) + return false; + } + } + boolean empty = true; + for (Object o : check2) { + if (o != null) + empty = false; + } + return empty; + } - private boolean areBothCarbon(ItemStack item1, ItemStack item2) { - return MineFantasyFuels.isCarbon(item1) && MineFantasyFuels.isCarbon(item2); - } + private boolean areBothCarbon(ItemStack item1, ItemStack item2) { + return MineFantasyFuels.isCarbon(item1) && MineFantasyFuels.isCarbon(item2); + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java index b69eb386..b097c2ae 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java @@ -10,120 +10,121 @@ public class TweakedShapedAnvilRecipe implements IAnvilRecipe { - private int hammer, anvil, /* craft, */ time, width, height; - private float exp; - private IItemStack result; - private IIngredient[][] ingreds; - private Skill s; - private String research, tool; - private boolean hot; - - public TweakedShapedAnvilRecipe(IIngredient[][] input, IItemStack output, String tool, int time, int hammer, - int anvil, float exp, boolean hot, String research, Skill s) { - this.height = 4; - this.width = 6; - this.ingreds = input; - this.result = output; - this.tool = tool; - this.hammer = hammer; - this.anvil = anvil; - this.exp = exp; - this.hot = hot; - this.research = research; - this.s = s; - this.time = time; - } - - @Override - public int getAnvil() { - return anvil; - } - - @Override - public int getCraftTime() { - return time; - } - - @Override - public ItemStack getCraftingResult(AnvilCraftMatrix arg0) { - return this.getRecipeOutput().copy(); - } - - @Override - public float getExperiance() { - return exp; - } - - @Override - public int getRecipeHammer() { - return hammer; - } - - @Override - public ItemStack getRecipeOutput() { - return MineTweakerMC.getItemStack(result).copy(); - } - - @Override - public int getRecipeSize() { - return this.width * this.height; - } - - @Override - public String getResearch() { - return research; - } - - @Override - public Skill getSkill() { - return this.s; - } - - @Override - public String getToolType() { - return tool; - } - - @Override - public boolean matches(AnvilCraftMatrix inv) { - boolean matches = true; - for (int x = 0; x < 6; x++) { - for (int y = 0; y < 4; y++) { - if (!matches) - return false; - ItemStack stack = inv.getStackInRowAndColumn(x, y); - - // int a = y + x * 4; - if (stack == null && this.ingreds[y][x] == null) { - continue; - } - boolean hasMatch = false; - if (stack != null && this.ingreds[y][x] != null) { - for (IItemStack i : this.ingreds[y][x].getItems()) { - ItemStack ingred = MineTweakerMC.getItemStack(i); - if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == stack.getItemDamage()) { - hasMatch = true; - } - } - } else { - matches = false; - } - if (!hasMatch) - matches = false; - } - } - return matches; - } - - @Override - public boolean outputHot() { - return hot; - } - - @Override - public boolean useCustomTiers() { - // TODO Auto-generated method stub - return false; - } + private int hammer, anvil, /* craft, */ + time, width, height; + private float exp; + private IItemStack result; + private IIngredient[][] ingreds; + private Skill s; + private String research, tool; + private boolean hot; + + public TweakedShapedAnvilRecipe(IIngredient[][] input, IItemStack output, String tool, int time, int hammer, + int anvil, float exp, boolean hot, String research, Skill s) { + this.height = 4; + this.width = 6; + this.ingreds = input; + this.result = output; + this.tool = tool; + this.hammer = hammer; + this.anvil = anvil; + this.exp = exp; + this.hot = hot; + this.research = research; + this.s = s; + this.time = time; + } + + @Override + public int getAnvil() { + return anvil; + } + + @Override + public int getCraftTime() { + return time; + } + + @Override + public ItemStack getCraftingResult(AnvilCraftMatrix arg0) { + return this.getRecipeOutput().copy(); + } + + @Override + public float getExperiance() { + return exp; + } + + @Override + public int getRecipeHammer() { + return hammer; + } + + @Override + public ItemStack getRecipeOutput() { + return MineTweakerMC.getItemStack(result).copy(); + } + + @Override + public int getRecipeSize() { + return this.width * this.height; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return this.s; + } + + @Override + public String getToolType() { + return tool; + } + + @Override + public boolean matches(AnvilCraftMatrix inv) { + boolean matches = true; + for (int x = 0; x < 6; x++) { + for (int y = 0; y < 4; y++) { + if (!matches) + return false; + ItemStack stack = inv.getStackInRowAndColumn(x, y); + + // int a = y + x * 4; + if (stack == null && this.ingreds[y][x] == null) { + continue; + } + boolean hasMatch = false; + if (stack != null && this.ingreds[y][x] != null) { + for (IItemStack i : this.ingreds[y][x].getItems()) { + ItemStack ingred = MineTweakerMC.getItemStack(i); + if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == stack.getItemDamage()) { + hasMatch = true; + } + } + } else { + matches = false; + } + if (!hasMatch) + matches = false; + } + } + return matches; + } + + @Override + public boolean outputHot() { + return hot; + } + + @Override + public boolean useCustomTiers() { + // TODO Auto-generated method stub + return false; + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java index 46f4b2cb..aa1a7d89 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java @@ -10,118 +10,119 @@ public class TweakedShapedCBRecipes implements ICarpenterRecipe { - private int hammer, anvil, /* craft, */ time, width, height; - private float exp; - private IItemStack result; - private IIngredient[][] ingreds; - private Skill s; - private String research, tool, sound; - - public TweakedShapedCBRecipes(IIngredient[][] input, IItemStack output, String tool, int time, int hammer, - int anvil, float exp, String sound, String research, Skill s) { - this.height = 4; - this.width = 6; - this.ingreds = input; - this.result = output; - this.tool = tool; - this.hammer = hammer; - this.anvil = anvil; - this.exp = exp; - this.sound = sound; - this.research = research; - this.s = s; - this.time = time; - } - - @Override - public int getAnvil() { - return anvil; - } - - @Override - public int getCraftTime() { - return time; - } - - @Override - public ItemStack getCraftingResult(CarpenterCraftMatrix arg0) { - return this.getRecipeOutput().copy(); - } - - @Override - public float getExperiance() { - return exp; - } - - @Override - public int getRecipeHammer() { - return hammer; - } - - @Override - public ItemStack getRecipeOutput() { - return MineTweakerMC.getItemStack(result).copy(); - } - - @Override - public int getRecipeSize() { - return this.width * this.height; - } - - @Override - public String getResearch() { - return research; - } - - @Override - public Skill getSkill() { - return this.s; - } - - @Override - public String getToolType() { - return tool; - } - - @Override - public boolean matches(CarpenterCraftMatrix inv) { - boolean matches = true; - for (int x = 0; x < 4; x++) { - for (int y = 0; y < 4; y++) { - if (!matches) - return false; - ItemStack stack = inv.getStackInRowAndColumn(x, y); - - // int a = y + x * 4; - if (stack == null && this.ingreds[y][x] == null) { - continue; - } - boolean hasMatch = false; - if (stack != null && this.ingreds[y][x] != null) { - for (IItemStack i : this.ingreds[y][x].getItems()) { - ItemStack ingred = MineTweakerMC.getItemStack(i); - if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == stack.getItemDamage()) { - hasMatch = true; - } - } - } else { - matches = false; - } - if (!hasMatch) - matches = false; - } - } - return matches; - } - - @Override - public String getSound() { - return sound; - } - - @Override - public boolean outputHot() { - return false; - } + private int hammer, anvil, /* craft, */ + time, width, height; + private float exp; + private IItemStack result; + private IIngredient[][] ingreds; + private Skill s; + private String research, tool, sound; + + public TweakedShapedCBRecipes(IIngredient[][] input, IItemStack output, String tool, int time, int hammer, + int anvil, float exp, String sound, String research, Skill s) { + this.height = 4; + this.width = 6; + this.ingreds = input; + this.result = output; + this.tool = tool; + this.hammer = hammer; + this.anvil = anvil; + this.exp = exp; + this.sound = sound; + this.research = research; + this.s = s; + this.time = time; + } + + @Override + public int getAnvil() { + return anvil; + } + + @Override + public int getCraftTime() { + return time; + } + + @Override + public ItemStack getCraftingResult(CarpenterCraftMatrix arg0) { + return this.getRecipeOutput().copy(); + } + + @Override + public float getExperiance() { + return exp; + } + + @Override + public int getRecipeHammer() { + return hammer; + } + + @Override + public ItemStack getRecipeOutput() { + return MineTweakerMC.getItemStack(result).copy(); + } + + @Override + public int getRecipeSize() { + return this.width * this.height; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return this.s; + } + + @Override + public String getToolType() { + return tool; + } + + @Override + public boolean matches(CarpenterCraftMatrix inv) { + boolean matches = true; + for (int x = 0; x < 4; x++) { + for (int y = 0; y < 4; y++) { + if (!matches) + return false; + ItemStack stack = inv.getStackInRowAndColumn(x, y); + + // int a = y + x * 4; + if (stack == null && this.ingreds[y][x] == null) { + continue; + } + boolean hasMatch = false; + if (stack != null && this.ingreds[y][x] != null) { + for (IItemStack i : this.ingreds[y][x].getItems()) { + ItemStack ingred = MineTweakerMC.getItemStack(i); + if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == stack.getItemDamage()) { + hasMatch = true; + } + } + } else { + matches = false; + } + if (!hasMatch) + matches = false; + } + } + return matches; + } + + @Override + public String getSound() { + return sound; + } + + @Override + public boolean outputHot() { + return false; + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java index 6cc3e865..6239c5bd 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java @@ -10,131 +10,132 @@ public class TweakedShapelessAnvilRecipe implements IAnvilRecipe { - private int hammer, anvil, /* craft, */ time, width, height; - private float exp; - private IItemStack result; - private IIngredient[] ingreds; - private Skill s; - private String research, tool; - private boolean hot; - - public TweakedShapelessAnvilRecipe(IIngredient[] input, IItemStack output, String tool, int time, int hammer, - int anvil, float exp, boolean hot, String research, Skill s) { - this.height = 4; - this.width = 4; - this.ingreds = input; - this.result = output; - this.tool = tool; - this.hammer = hammer; - this.anvil = anvil; - this.exp = exp; - this.hot = hot; - this.research = research; - this.s = s; - this.time = 1; - } - - @Override - public int getAnvil() { - return anvil; - } - - @Override - public int getCraftTime() { - return time; - } - - @Override - public ItemStack getCraftingResult(AnvilCraftMatrix arg0) { - return this.getRecipeOutput().copy(); - } - - @Override - public float getExperiance() { - return exp; - } - - @Override - public int getRecipeHammer() { - return hammer; - } - - @Override - public ItemStack getRecipeOutput() { - return MineTweakerMC.getItemStack(result).copy(); - } - - @Override - public int getRecipeSize() { - return this.width * this.height; - } - - @Override - public String getResearch() { - return research; - } - - @Override - public Skill getSkill() { - return s; - } - - @Override - public String getToolType() { - return tool; - } - - @Override - public boolean matches(AnvilCraftMatrix inv) { - boolean matches[] = new boolean[this.ingreds.length]; - boolean items[][] = new boolean[6][4]; - for (int a = 0; a < this.ingreds.length; a++) { - IIngredient i = this.ingreds[a]; - for (IItemStack s : i.getItems()) { - ItemStack ingred = MineTweakerMC.getItemStack(s); - boolean found = false; - for (int x = 0; x < 6; x++) { - for (int y = 0; y < 4; y++) { - ItemStack stack = inv.getStackInRowAndColumn(x, y); - if (stack == null) - continue; - if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == ingred.getItemDamage() - && !items[x][y]) { - matches[a] = true; - items[x][y] = true; - found = true; - break; - } - } - if (found) - break; - } - if (found) - break; - } - } - boolean isMatch = true; - for (boolean b : matches) - if (!b) - isMatch = false; - for (int x = 0; x < 6; x++) { - for (int y = 0; y < 4; y++) { - if (!items[x][y] && inv.getStackInRowAndColumn(x, y) != null) - isMatch = false; - } - } - return isMatch; - } - - @Override - public boolean outputHot() { - return hot; - } - - @Override - public boolean useCustomTiers() { - // TODO Auto-generated method stub - return false; - } + private int hammer, anvil, /* craft, */ + time, width, height; + private float exp; + private IItemStack result; + private IIngredient[] ingreds; + private Skill s; + private String research, tool; + private boolean hot; + + public TweakedShapelessAnvilRecipe(IIngredient[] input, IItemStack output, String tool, int time, int hammer, + int anvil, float exp, boolean hot, String research, Skill s) { + this.height = 4; + this.width = 4; + this.ingreds = input; + this.result = output; + this.tool = tool; + this.hammer = hammer; + this.anvil = anvil; + this.exp = exp; + this.hot = hot; + this.research = research; + this.s = s; + this.time = 1; + } + + @Override + public int getAnvil() { + return anvil; + } + + @Override + public int getCraftTime() { + return time; + } + + @Override + public ItemStack getCraftingResult(AnvilCraftMatrix arg0) { + return this.getRecipeOutput().copy(); + } + + @Override + public float getExperiance() { + return exp; + } + + @Override + public int getRecipeHammer() { + return hammer; + } + + @Override + public ItemStack getRecipeOutput() { + return MineTweakerMC.getItemStack(result).copy(); + } + + @Override + public int getRecipeSize() { + return this.width * this.height; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return s; + } + + @Override + public String getToolType() { + return tool; + } + + @Override + public boolean matches(AnvilCraftMatrix inv) { + boolean matches[] = new boolean[this.ingreds.length]; + boolean items[][] = new boolean[6][4]; + for (int a = 0; a < this.ingreds.length; a++) { + IIngredient i = this.ingreds[a]; + for (IItemStack s : i.getItems()) { + ItemStack ingred = MineTweakerMC.getItemStack(s); + boolean found = false; + for (int x = 0; x < 6; x++) { + for (int y = 0; y < 4; y++) { + ItemStack stack = inv.getStackInRowAndColumn(x, y); + if (stack == null) + continue; + if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == ingred.getItemDamage() + && !items[x][y]) { + matches[a] = true; + items[x][y] = true; + found = true; + break; + } + } + if (found) + break; + } + if (found) + break; + } + } + boolean isMatch = true; + for (boolean b : matches) + if (!b) + isMatch = false; + for (int x = 0; x < 6; x++) { + for (int y = 0; y < 4; y++) { + if (!items[x][y] && inv.getStackInRowAndColumn(x, y) != null) + isMatch = false; + } + } + return isMatch; + } + + @Override + public boolean outputHot() { + return hot; + } + + @Override + public boolean useCustomTiers() { + // TODO Auto-generated method stub + return false; + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java index cae140ac..5d8d5e6f 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java @@ -10,129 +10,130 @@ public class TweakedShapelessCBRecipes implements ICarpenterRecipe { - private int hammer, anvil, /* craft, */ time, width, height; - private float exp; - private IItemStack result; - private IIngredient[] ingreds; - private Skill s; - private String research, tool, sound; - - public TweakedShapelessCBRecipes(IIngredient[] input, IItemStack output, String tool, int time, int hammer, - int anvil, float exp, String sound, String research, Skill s) { - this.height = 4; - this.width = 4; - this.ingreds = input; - this.result = output; - this.tool = tool; - this.hammer = hammer; - this.anvil = anvil; - this.exp = exp; - this.sound = sound; - this.research = research; - this.s = s; - this.time = 1; - } - - @Override - public int getAnvil() { - return anvil; - } - - @Override - public int getCraftTime() { - return time; - } - - @Override - public ItemStack getCraftingResult(CarpenterCraftMatrix arg0) { - return this.getRecipeOutput().copy(); - } - - @Override - public float getExperiance() { - return exp; - } - - @Override - public int getRecipeHammer() { - return hammer; - } - - @Override - public ItemStack getRecipeOutput() { - return MineTweakerMC.getItemStack(result).copy(); - } - - @Override - public int getRecipeSize() { - return this.width * this.height; - } - - @Override - public String getResearch() { - return research; - } - - @Override - public Skill getSkill() { - return s; - } - - @Override - public String getToolType() { - return tool; - } - - @Override - public boolean matches(CarpenterCraftMatrix inv) { - boolean matches[] = new boolean[this.ingreds.length]; - boolean items[][] = new boolean[4][4]; - for (int a = 0; a < this.ingreds.length; a++) { - IIngredient i = this.ingreds[a]; - for (IItemStack s : i.getItems()) { - ItemStack ingred = MineTweakerMC.getItemStack(s); - boolean found = false; - for (int x = 0; x < 4; x++) { - for (int y = 0; y < 4; y++) { - ItemStack stack = inv.getStackInRowAndColumn(x, y); - if (stack == null) - continue; - if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == ingred.getItemDamage() - && !items[x][y]) { - matches[a] = true; - items[x][y] = true; - found = true; - break; - } - } - if (found) - break; - } - if (found) - break; - } - } - boolean isMatch = true; - for (boolean b : matches) - if (!b) - isMatch = false; - for (int x = 0; x < 4; x++) { - for (int y = 0; y < 4; y++) { - if (!items[x][y] && inv.getStackInRowAndColumn(x, y) != null) - isMatch = false; - } - } - return isMatch; - } - - @Override - public boolean outputHot() { - return false; - } - - @Override - public String getSound() { - return sound; - } + private int hammer, anvil, /* craft, */ + time, width, height; + private float exp; + private IItemStack result; + private IIngredient[] ingreds; + private Skill s; + private String research, tool, sound; + + public TweakedShapelessCBRecipes(IIngredient[] input, IItemStack output, String tool, int time, int hammer, + int anvil, float exp, String sound, String research, Skill s) { + this.height = 4; + this.width = 4; + this.ingreds = input; + this.result = output; + this.tool = tool; + this.hammer = hammer; + this.anvil = anvil; + this.exp = exp; + this.sound = sound; + this.research = research; + this.s = s; + this.time = 1; + } + + @Override + public int getAnvil() { + return anvil; + } + + @Override + public int getCraftTime() { + return time; + } + + @Override + public ItemStack getCraftingResult(CarpenterCraftMatrix arg0) { + return this.getRecipeOutput().copy(); + } + + @Override + public float getExperiance() { + return exp; + } + + @Override + public int getRecipeHammer() { + return hammer; + } + + @Override + public ItemStack getRecipeOutput() { + return MineTweakerMC.getItemStack(result).copy(); + } + + @Override + public int getRecipeSize() { + return this.width * this.height; + } + + @Override + public String getResearch() { + return research; + } + + @Override + public Skill getSkill() { + return s; + } + + @Override + public String getToolType() { + return tool; + } + + @Override + public boolean matches(CarpenterCraftMatrix inv) { + boolean matches[] = new boolean[this.ingreds.length]; + boolean items[][] = new boolean[4][4]; + for (int a = 0; a < this.ingreds.length; a++) { + IIngredient i = this.ingreds[a]; + for (IItemStack s : i.getItems()) { + ItemStack ingred = MineTweakerMC.getItemStack(s); + boolean found = false; + for (int x = 0; x < 4; x++) { + for (int y = 0; y < 4; y++) { + ItemStack stack = inv.getStackInRowAndColumn(x, y); + if (stack == null) + continue; + if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == ingred.getItemDamage() + && !items[x][y]) { + matches[a] = true; + items[x][y] = true; + found = true; + break; + } + } + if (found) + break; + } + if (found) + break; + } + } + boolean isMatch = true; + for (boolean b : matches) + if (!b) + isMatch = false; + for (int x = 0; x < 4; x++) { + for (int y = 0; y < 4; y++) { + if (!items[x][y] && inv.getStackInRowAndColumn(x, y) != null) + isMatch = false; + } + } + return isMatch; + } + + @Override + public boolean outputHot() { + return false; + } + + @Override + public String getSound() { + return sound; + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java index 0e09b531..81452455 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java @@ -1,4 +1,3 @@ - package minefantasy.mf2.integration.minetweaker.tweakers; import minefantasy.mf2.api.crafting.refine.BloomRecipe; @@ -14,54 +13,54 @@ @ZenClass("mods.minefantasy.Bloomery") public class Bloomery { - @ZenMethod - public static void addRecipe(IItemStack result, IIngredient input) { - MineTweakerAPI.apply(new addBloomRecipe(result, input)); - } + @ZenMethod + public static void addRecipe(IItemStack result, IIngredient input) { + MineTweakerAPI.apply(new addBloomRecipe(result, input)); + } - public static class addBloomRecipe implements IUndoableAction { + public static class addBloomRecipe implements IUndoableAction { - IItemStack result; - IIngredient input; + IItemStack result; + IIngredient input; - public addBloomRecipe(IItemStack result, IIngredient input) { - this.result = result; - this.input = input; - } + public addBloomRecipe(IItemStack result, IIngredient input) { + this.result = result; + this.input = input; + } - @Override - public void apply() { - for (IItemStack stack : input.getItems()) { - ItemStack s = MineTweakerMC.getItemStack(stack); - BloomRecipe.addRecipe(s, MineTweakerMC.getItemStack(result)); - } - } + @Override + public void apply() { + for (IItemStack stack : input.getItems()) { + ItemStack s = MineTweakerMC.getItemStack(stack); + BloomRecipe.addRecipe(s, MineTweakerMC.getItemStack(result)); + } + } - @Override - public String describe() { - return "Adding Bloomery Recipe That Results In " + result.getDisplayName(); - } + @Override + public String describe() { + return "Adding Bloomery Recipe That Results In " + result.getDisplayName(); + } - @Override - public Object getOverrideKey() { - return null; - } + @Override + public Object getOverrideKey() { + return null; + } - @Override - public boolean canUndo() { - return true; - } + @Override + public boolean canUndo() { + return true; + } - @Override - public String describeUndo() { - return "STAHP UNDOOOOIN MAH RECIPES"; - } + @Override + public String describeUndo() { + return "STAHP UNDOOOOIN MAH RECIPES"; + } - @Override - public void undo() { - BloomRecipe.recipeList.remove(input); - } + @Override + public void undo() { + BloomRecipe.recipeList.remove(input); + } - } + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java index d71293ae..55b1279e 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java @@ -17,97 +17,97 @@ @ZenClass("mods.minefantasy.CarpenterBench") public class CarpentersBench { - @ZenMethod - public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, String sound, - double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { - MineTweakerAPI.apply(new CarpentersAction(output, RPGElements.getSkillByName(skill), research, sound, - (float) exp, tool, hammer, anvil, time, ingreds)); - } - - @ZenMethod - public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, String sound, - double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { - MineTweakerAPI.apply(new CarpentersAction(output, RPGElements.getSkillByName(skill), research, sound, - (float) exp, tool, hammer, anvil, time, ingreds)); - } - - public static class CarpentersAction implements IUndoableAction { - - IItemStack out; - Skill s; - String research, tool, sound; - float exp; - int hammer, anvil, time; - IIngredient[][] ingreds; - IIngredient[] ingreds2; - boolean shaped; - ICarpenterRecipe r; - - // private static final char[] chars = - // {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; - - public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, - int hammer, int anvil, int time, IIngredient[][] ingreds) { - this.out = out; - this.s = s; - this.research = research; - this.tool = tool; - this.sound = sound; - this.exp = exp; - this.hammer = hammer; - this.anvil = anvil; - this.time = time; - this.ingreds = ingreds; - this.shaped = true; - r = new TweakedShapedCBRecipes(ingreds, out, tool, time, hammer, anvil, exp, sound, research, s); - } - - public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, - int hammer, int anvil, int time, IIngredient[] ingreds) { - this.out = out; - this.s = s; - this.research = research; - this.tool = tool; - this.sound = sound; - this.exp = exp; - this.hammer = hammer; - this.anvil = anvil; - this.time = time; - this.ingreds2 = ingreds; - this.shaped = false; - r = new TweakedShapelessCBRecipes(ingreds2, out, tool, time, hammer, anvil, exp, sound, research, s); - } - - @Override - public void apply() { - CraftingManagerCarpenter.getInstance().recipes.add(r); - } - - @Override - public String describe() { - return "Adding Carpenters Bench Recipe..."; - } - - @Override - public Object getOverrideKey() { - return null; - } - - @Override - public boolean canUndo() { - return true; - } - - @Override - public String describeUndo() { - return "Undoing Carpenters Recipe"; - } - - @Override - public void undo() { - CraftingManagerCarpenter.getInstance().recipes.remove(r); - } - - } + @ZenMethod + public static void addShapedRecipe(@NotNull IItemStack output, String skill, String research, String sound, + double exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { + MineTweakerAPI.apply(new CarpentersAction(output, RPGElements.getSkillByName(skill), research, sound, + (float) exp, tool, hammer, anvil, time, ingreds)); + } + + @ZenMethod + public static void addShapelessRecipe(@NotNull IItemStack output, String skill, String research, String sound, + double exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { + MineTweakerAPI.apply(new CarpentersAction(output, RPGElements.getSkillByName(skill), research, sound, + (float) exp, tool, hammer, anvil, time, ingreds)); + } + + public static class CarpentersAction implements IUndoableAction { + + IItemStack out; + Skill s; + String research, tool, sound; + float exp; + int hammer, anvil, time; + IIngredient[][] ingreds; + IIngredient[] ingreds2; + boolean shaped; + ICarpenterRecipe r; + + // private static final char[] chars = + // {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; + + public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, + int hammer, int anvil, int time, IIngredient[][] ingreds) { + this.out = out; + this.s = s; + this.research = research; + this.tool = tool; + this.sound = sound; + this.exp = exp; + this.hammer = hammer; + this.anvil = anvil; + this.time = time; + this.ingreds = ingreds; + this.shaped = true; + r = new TweakedShapedCBRecipes(ingreds, out, tool, time, hammer, anvil, exp, sound, research, s); + } + + public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, + int hammer, int anvil, int time, IIngredient[] ingreds) { + this.out = out; + this.s = s; + this.research = research; + this.tool = tool; + this.sound = sound; + this.exp = exp; + this.hammer = hammer; + this.anvil = anvil; + this.time = time; + this.ingreds2 = ingreds; + this.shaped = false; + r = new TweakedShapelessCBRecipes(ingreds2, out, tool, time, hammer, anvil, exp, sound, research, s); + } + + @Override + public void apply() { + CraftingManagerCarpenter.getInstance().recipes.add(r); + } + + @Override + public String describe() { + return "Adding Carpenters Bench Recipe..."; + } + + @Override + public Object getOverrideKey() { + return null; + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public String describeUndo() { + return "Undoing Carpenters Recipe"; + } + + @Override + public void undo() { + CraftingManagerCarpenter.getInstance().recipes.remove(r); + } + + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java index 2b5afc98..367b45a5 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java @@ -1,8 +1,5 @@ package minefantasy.mf2.integration.minetweaker.tweakers; -import java.util.ArrayList; -import java.util.List; - import minefantasy.mf2.api.refine.Alloy; import minefantasy.mf2.api.refine.AlloyRecipes; import minefantasy.mf2.integration.minetweaker.TweakedAlloyRecipe; @@ -13,48 +10,51 @@ import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; +import java.util.ArrayList; +import java.util.List; + @ZenClass("mods.minefantasy.Crucible") public class Crucible { - @ZenMethod - public static void addAlloy(IItemStack out, int level, int dupe, IIngredient[] ingred) { - MineTweakerAPI.apply(new AlloyAction(out, level, ingred, dupe)); - } - - private static class AlloyAction extends OneWayAction { - - private IItemStack out; - private int level; - private List ingreds; - private int dupe; - Alloy a; - - public AlloyAction(IItemStack out, int level, IIngredient[] ingreds, int dupe) { - this.out = out; - this.level = level; - this.ingreds = new ArrayList(); - this.dupe = dupe; - for (IIngredient i : ingreds) { - this.ingreds.add(i); - } - a = new TweakedAlloyRecipe(out, level, this.ingreds); - } - - @Override - public void apply() { - AlloyRecipes.addAlloy(a); - } - - @Override - public String describe() { - return "Adding Custom Alloy"; - } - - @Override - public Object getOverrideKey() { - return null; - } - - } + @ZenMethod + public static void addAlloy(IItemStack out, int level, int dupe, IIngredient[] ingred) { + MineTweakerAPI.apply(new AlloyAction(out, level, ingred, dupe)); + } + + private static class AlloyAction extends OneWayAction { + + Alloy a; + private IItemStack out; + private int level; + private List ingreds; + private int dupe; + + public AlloyAction(IItemStack out, int level, IIngredient[] ingreds, int dupe) { + this.out = out; + this.level = level; + this.ingreds = new ArrayList(); + this.dupe = dupe; + for (IIngredient i : ingreds) { + this.ingreds.add(i); + } + a = new TweakedAlloyRecipe(out, level, this.ingreds); + } + + @Override + public void apply() { + AlloyRecipes.addAlloy(a); + } + + @Override + public String describe() { + return "Adding Custom Alloy"; + } + + @Override + public Object getOverrideKey() { + return null; + } + + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java index 458bdd5c..618df0f1 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java @@ -24,10 +24,10 @@ public static CustomMaterial getMaterial(String materialName) { private static class RegisterCustomMaterial implements IUndoableAction { - public CustomMaterial material; private final String type, name; private final int tier; private final float hardness, durability, flexibility, sharpness, resistance, density; + public CustomMaterial material; public RegisterCustomMaterial(String type, String name, int tier, float hardness, float durability, float flexibility, float sharpness, float resistance, float density) { diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java index 561849c1..42b7fa4c 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java @@ -12,57 +12,57 @@ @ZenClass("mods.minefantasy.Forge") public class Forge { - @ZenMethod - public static void addHeatableItem(IIngredient input, int min, int unstable, int max) { - MineTweakerAPI.apply(new heatableItemAction(input, min, unstable, max)); - } + @ZenMethod + public static void addHeatableItem(IIngredient input, int min, int unstable, int max) { + MineTweakerAPI.apply(new heatableItemAction(input, min, unstable, max)); + } - public static class heatableItemAction implements IUndoableAction { + public static class heatableItemAction implements IUndoableAction { - IIngredient input; - int min, unstable, max; + IIngredient input; + int min, unstable, max; - public heatableItemAction(IIngredient input, int min, int unstable, int max) { - this.input = input; - this.min = min; - this.unstable = unstable; - this.max = max; - } + public heatableItemAction(IIngredient input, int min, int unstable, int max) { + this.input = input; + this.min = min; + this.unstable = unstable; + this.max = max; + } - @Override - public void apply() { - for (IItemStack s : input.getItems()) { - Heatable.addItem(MineTweakerMC.getItemStack(s), min, unstable, max); - } - } + @Override + public void apply() { + for (IItemStack s : input.getItems()) { + Heatable.addItem(MineTweakerMC.getItemStack(s), min, unstable, max); + } + } - @Override - public boolean canUndo() { - return true; - } + @Override + public boolean canUndo() { + return true; + } - @Override - public String describe() { - return "Adding a heatable item"; - } + @Override + public String describe() { + return "Adding a heatable item"; + } - @Override - public String describeUndo() { - return "Removing heatable item"; - } + @Override + public String describeUndo() { + return "Removing heatable item"; + } - @Override - public Object getOverrideKey() { - return null; - } + @Override + public Object getOverrideKey() { + return null; + } - @Override - public void undo() { - for (IItemStack s : input.getItems()) { - Heatable.registerList.remove(Heatable.getRegistrationForItem(MineTweakerMC.getItemStack(s))); - } - } + @Override + public void undo() { + for (IItemStack s : input.getItems()) { + Heatable.registerList.remove(Heatable.getRegistrationForItem(MineTweakerMC.getItemStack(s))); + } + } - } + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java index ed899cad..f59149cc 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java @@ -13,50 +13,50 @@ @ZenClass("mods.minefantasy.TanningRack") public class TanningRack { - @ZenMethod - public static void addTieredRecipe(IItemStack output, IIngredient input, float time, int tier) { - MineTweakerAPI.apply(new TanningAction(output, input, time, tier, "knife")); - } - - @ZenMethod - public static void addTieredAndToolRecipe(IItemStack output, IIngredient input, float time, int tier, String tool) { - MineTweakerAPI.apply(new TanningAction(output, input, time, tier, tool)); - } - - public static class TanningAction extends OneWayAction { - - IItemStack output; - IIngredient input; - float time; - int tier; - String tool; - - public TanningAction(IItemStack output, IIngredient input, float time, int tier, String tool) { - this.output = output; - this.input = input; - this.time = time; - this.tier = tier; - this.tool = tool; - } - - @Override - public void apply() { - for (IItemStack s : input.getItems()) { - ItemStack stack = MineTweakerMC.getItemStack(s); - TanningRecipe.addRecipe(stack, time, tier, tool, MineTweakerMC.getItemStack(output)); - } - } - - @Override - public String describe() { - return "Creating Tanning Recipe"; - } - - @Override - public Object getOverrideKey() { - return null; - } - - } + @ZenMethod + public static void addTieredRecipe(IItemStack output, IIngredient input, float time, int tier) { + MineTweakerAPI.apply(new TanningAction(output, input, time, tier, "knife")); + } + + @ZenMethod + public static void addTieredAndToolRecipe(IItemStack output, IIngredient input, float time, int tier, String tool) { + MineTweakerAPI.apply(new TanningAction(output, input, time, tier, tool)); + } + + public static class TanningAction extends OneWayAction { + + IItemStack output; + IIngredient input; + float time; + int tier; + String tool; + + public TanningAction(IItemStack output, IIngredient input, float time, int tier, String tool) { + this.output = output; + this.input = input; + this.time = time; + this.tier = tier; + this.tool = tool; + } + + @Override + public void apply() { + for (IItemStack s : input.getItems()) { + ItemStack stack = MineTweakerMC.getItemStack(s); + TanningRecipe.addRecipe(stack, time, tier, tool, MineTweakerMC.getItemStack(output)); + } + } + + @Override + public String describe() { + return "Creating Tanning Recipe"; + } + + @Override + public Object getOverrideKey() { + return null; + } + + } } diff --git a/src/main/java/minefantasy/mf2/integration/nei/MFPositionedStack.java b/src/main/java/minefantasy/mf2/integration/nei/MFPositionedStack.java index c7bbfae8..aefe9ee8 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/MFPositionedStack.java +++ b/src/main/java/minefantasy/mf2/integration/nei/MFPositionedStack.java @@ -1,61 +1,61 @@ package minefantasy.mf2.integration.nei; -import java.util.ArrayList; -import java.util.List; - import codechicken.nei.ItemList; import codechicken.nei.PositionedStack; import minefantasy.mf2.api.helpers.CustomToolHelper; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; +import java.util.ArrayList; +import java.util.List; + public class MFPositionedStack extends PositionedStack { - public boolean permutated = false; - - public MFPositionedStack(Object object, int x, int y) { - this(object, x, y, true); - } - - public MFPositionedStack(Object object, int x, int y, boolean genPerm) { - super(object, x, y, genPerm); - } - - @Override - public void generatePermutations() { - if (permutated) - return; - - ArrayList stacks = new ArrayList(); - for (ItemStack item : items) { - if (item == null || item.getItem() == null) - continue; - - if (item.getItemDamage() == Short.MAX_VALUE) { - List permutations = ItemList.itemMap.get(item.getItem()); - if (!permutations.isEmpty()) { - for (ItemStack stack : permutations) { - if (item.getItem().equals(stack.getItem()) - && CustomToolHelper.doesMatchForRecipe(item, stack)) { // TODO: - // Rework - stacks.add(stack.copy()); - } - } - } else { - ItemStack base = new ItemStack(item.getItem(), item.stackSize); - base.setTagCompound(item.getTagCompound()); - stacks.add(base); - } - continue; - } - - stacks.add(item.copy()); - } - items = stacks.toArray(new ItemStack[0]); - - if (items.length == 0) - items = new ItemStack[] { new ItemStack(Blocks.fire) }; - - permutated = true; - setPermutationToRender(0); - } + public boolean permutated = false; + + public MFPositionedStack(Object object, int x, int y) { + this(object, x, y, true); + } + + public MFPositionedStack(Object object, int x, int y, boolean genPerm) { + super(object, x, y, genPerm); + } + + @Override + public void generatePermutations() { + if (permutated) + return; + + ArrayList stacks = new ArrayList(); + for (ItemStack item : items) { + if (item == null || item.getItem() == null) + continue; + + if (item.getItemDamage() == Short.MAX_VALUE) { + List permutations = ItemList.itemMap.get(item.getItem()); + if (!permutations.isEmpty()) { + for (ItemStack stack : permutations) { + if (item.getItem().equals(stack.getItem()) + && CustomToolHelper.doesMatchForRecipe(item, stack)) { // TODO: + // Rework + stacks.add(stack.copy()); + } + } + } else { + ItemStack base = new ItemStack(item.getItem(), item.stackSize); + base.setTagCompound(item.getTagCompound()); + stacks.add(base); + } + continue; + } + + stacks.add(item.copy()); + } + items = stacks.toArray(new ItemStack[0]); + + if (items.length == 0) + items = new ItemStack[]{new ItemStack(Blocks.fire)}; + + permutated = true; + setPermutationToRender(0); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java b/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java index c4af3774..8643cf54 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java +++ b/src/main/java/minefantasy/mf2/integration/nei/NEIConfig.java @@ -9,50 +9,50 @@ @Optional.Interface(iface = "codechicken.nei.api.IConfigureNEI", modid = "NotEnoughItems") public class NEIConfig implements IConfigureNEI { - @Override - public String getName() { - return MineFantasyII.NAME + " NEI Plugin"; - } - - @Override - public String getVersion() { - return MineFantasyII.VERSION; - } - - @Override - public void loadConfig() { - if (ConfigIntegration.neiIntegration) { - RecipeHandlerCarpenter handlerCarpenter = new RecipeHandlerCarpenter(); - API.registerRecipeHandler(handlerCarpenter); - API.registerUsageHandler(handlerCarpenter); - - RecipeHandlerAnvil handlerAnvil = new RecipeHandlerAnvil(); - API.registerRecipeHandler(handlerAnvil); - API.registerUsageHandler(handlerAnvil); - - RecipeHandlerBloom handlerBloom = new RecipeHandlerBloom(); - API.registerRecipeHandler(handlerBloom); - API.registerUsageHandler(handlerBloom); - - RecipeHandlerQuern handlerQuern = new RecipeHandlerQuern(); - API.registerRecipeHandler(handlerQuern); - API.registerUsageHandler(handlerQuern); + @Override + public String getName() { + return MineFantasyII.NAME + " NEI Plugin"; + } + + @Override + public String getVersion() { + return MineFantasyII.VERSION; + } + + @Override + public void loadConfig() { + if (ConfigIntegration.neiIntegration) { + RecipeHandlerCarpenter handlerCarpenter = new RecipeHandlerCarpenter(); + API.registerRecipeHandler(handlerCarpenter); + API.registerUsageHandler(handlerCarpenter); + + RecipeHandlerAnvil handlerAnvil = new RecipeHandlerAnvil(); + API.registerRecipeHandler(handlerAnvil); + API.registerUsageHandler(handlerAnvil); + + RecipeHandlerBloom handlerBloom = new RecipeHandlerBloom(); + API.registerRecipeHandler(handlerBloom); + API.registerUsageHandler(handlerBloom); + + RecipeHandlerQuern handlerQuern = new RecipeHandlerQuern(); + API.registerRecipeHandler(handlerQuern); + API.registerUsageHandler(handlerQuern); /*RecipeHandlerTanning handlerTanning = new RecipeHandlerTanning(); - API.registerRecipeHandler(handlerTanning); + API.registerRecipeHandler(handlerTanning); API.registerUsageHandler(handlerTanning);*/ - RecipeHandlerCrucible handlerCrucible = new RecipeHandlerCrucible(); - API.registerRecipeHandler(handlerCrucible); - API.registerUsageHandler(handlerCrucible); + RecipeHandlerCrucible handlerCrucible = new RecipeHandlerCrucible(); + API.registerRecipeHandler(handlerCrucible); + API.registerUsageHandler(handlerCrucible); - RecipeHandlerBigFurnace handlerBigFurnace = new RecipeHandlerBigFurnace(); - API.registerRecipeHandler(handlerBigFurnace); - API.registerUsageHandler(handlerBigFurnace); + RecipeHandlerBigFurnace handlerBigFurnace = new RecipeHandlerBigFurnace(); + API.registerRecipeHandler(handlerBigFurnace); + API.registerUsageHandler(handlerBigFurnace); - RecipeHandlerBlastFurnace handlerBlastFurnace = new RecipeHandlerBlastFurnace(); - API.registerRecipeHandler(handlerBlastFurnace); - API.registerUsageHandler(handlerBlastFurnace); - } - } + RecipeHandlerBlastFurnace handlerBlastFurnace = new RecipeHandlerBlastFurnace(); + API.registerRecipeHandler(handlerBlastFurnace); + API.registerUsageHandler(handlerBlastFurnace); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java index c74f393c..20e77115 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerAnvil.java @@ -3,19 +3,15 @@ import codechicken.lib.gui.GuiDraw; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; -import minefantasy.mf2.api.crafting.ITieredComponent; import minefantasy.mf2.api.crafting.anvil.CraftingManagerAnvil; import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; import minefantasy.mf2.api.crafting.anvil.ShapedAnvilRecipes; import minefantasy.mf2.api.crafting.anvil.ShapelessAnvilRecipes; -import minefantasy.mf2.api.crafting.exotic.ISpecialCraftItem; import minefantasy.mf2.api.crafting.exotic.SpecialForging; import minefantasy.mf2.api.heating.Heatable; import minefantasy.mf2.api.heating.IHotItem; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.knowledge.ResearchLogic; -import minefantasy.mf2.api.material.CustomMaterial; -import minefantasy.mf2.item.ItemSpecialDesign; import minefantasy.mf2.knowledge.KnowledgeListMF; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.OpenGlHelper; @@ -59,11 +55,11 @@ public int recipiesPerPage() { public void loadCraftingRecipes(ItemStack inputStack) { ItemStack hiddenStack = null; - if(inputStack.getItem() instanceof IHotItem) { + if (inputStack.getItem() instanceof IHotItem) { inputStack = Heatable.getItem(inputStack); } - if(ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, KnowledgeListMF.smeltDragonforge)) { + if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, KnowledgeListMF.smeltDragonforge)) { for (Map.Entry entry : SpecialForging.dragonforgeCrafts.entrySet()) { if (CustomToolHelper.areEqual(new ItemStack(entry.getValue()), inputStack)) { hiddenStack = CustomToolHelper.tryDeconstruct(new ItemStack(entry.getKey()), inputStack); @@ -104,7 +100,7 @@ public void loadCraftingRecipes(ItemStack inputStack) { @SuppressWarnings("unchecked") @Override public void loadUsageRecipes(ItemStack ingredient) { - if(ingredient.getItem() instanceof IHotItem) { + if (ingredient.getItem() instanceof IHotItem) { ingredient = Heatable.getItem(ingredient); } @@ -137,13 +133,13 @@ private CachedAnvilRecipe handleRecipe(IAnvilRecipe irecipe, ItemStack inputStac //TODO: Implement wood permutations, add additional helper method for custom material support in crafting and usage handlers private class CachedAnvilRecipe extends CachedRecipe { - private ItemStack inputStack; private final ArrayList ingredients = new ArrayList(); + private ItemStack inputStack; private IAnvilRecipe iAnvilRecipe; private CachedAnvilRecipe(ShapedAnvilRecipes recipe, ItemStack inputStack) { iAnvilRecipe = recipe; - if(inputStack != null) { + if (inputStack != null) { this.inputStack = inputStack; this.inputStack.stackSize = recipe.getRecipeOutput().stackSize; } else { diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java index 3da92050..58fbdfae 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBigFurnace.java @@ -1,9 +1,5 @@ package minefantasy.mf2.integration.nei; -import java.util.ArrayList; - -import org.lwjgl.opengl.GL11; - import codechicken.lib.gui.GuiDraw; import codechicken.nei.ItemList; import codechicken.nei.PositionedStack; @@ -12,99 +8,102 @@ import minefantasy.mf2.api.refine.BigFurnaceRecipes; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; public class RecipeHandlerBigFurnace extends TemplateRecipeHandler { - private static ArrayList recipeList; - - @Override - public TemplateRecipeHandler newInstance() { - if (recipeList == null || recipeList.isEmpty()) { - fillRecipeList(); - } - - return super.newInstance(); - } - - private void fillRecipeList() { - recipeList = new ArrayList(); - for (ItemStack item : ItemList.items) { - BigFurnaceRecipes tempRecipe = BigFurnaceRecipes.getResult(item); - if (tempRecipe != null) { - recipeList.add(new RecipePair(item, tempRecipe.result)); - } - } - } - - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("nei.method.big_furnace"); - } - - @Override - public String getGuiTexture() { - return "minefantasy2:textures/gui/furnace_top.png"; - } - - @Override - public int recipiesPerPage() { - return 2; - } - - @Override - public void drawBackground(int recipe) { - GL11.glColor4f(1, 1, 1, 1); - GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(0, 0, 5, 11, 166, 63); - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - for (RecipePair recipePair : recipeList) { - if (CustomToolHelper.areEqual(recipePair.outputStack, result)) { - BigFurnaceRecipe cachedRecipe = new BigFurnaceRecipe(recipePair.inputStack, recipePair.outputStack); - arecipes.add(cachedRecipe); - } - } - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - BigFurnaceRecipes recipe = BigFurnaceRecipes.getResult(ingredient); - if (recipe != null) { - BigFurnaceRecipe cachedRecipe = new BigFurnaceRecipe(ingredient, recipe.result); - arecipes.add(cachedRecipe); - } - } - - private class RecipePair { - private ItemStack inputStack; - private ItemStack outputStack; - - private RecipePair(ItemStack input, ItemStack output) { - inputStack = input; - outputStack = output; - } - } - - private class BigFurnaceRecipe extends CachedRecipe { - - private PositionedStack input; - private PositionedStack output; - - private BigFurnaceRecipe(ItemStack inputStack, ItemStack outputStack) { - input = new PositionedStack(inputStack, 31, 15); - output = new PositionedStack(outputStack, 102, 16); // Hell of a perfectionist - } - - @Override - public PositionedStack getOtherStack() { - return input; - } - - @Override - public PositionedStack getResult() { - return output; - } - } + private static ArrayList recipeList; + + @Override + public TemplateRecipeHandler newInstance() { + if (recipeList == null || recipeList.isEmpty()) { + fillRecipeList(); + } + + return super.newInstance(); + } + + private void fillRecipeList() { + recipeList = new ArrayList(); + for (ItemStack item : ItemList.items) { + BigFurnaceRecipes tempRecipe = BigFurnaceRecipes.getResult(item); + if (tempRecipe != null) { + recipeList.add(new RecipePair(item, tempRecipe.result)); + } + } + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("nei.method.big_furnace"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/furnace_top.png"; + } + + @Override + public int recipiesPerPage() { + return 2; + } + + @Override + public void drawBackground(int recipe) { + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 5, 11, 166, 63); + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (RecipePair recipePair : recipeList) { + if (CustomToolHelper.areEqual(recipePair.outputStack, result)) { + BigFurnaceRecipe cachedRecipe = new BigFurnaceRecipe(recipePair.inputStack, recipePair.outputStack); + arecipes.add(cachedRecipe); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + BigFurnaceRecipes recipe = BigFurnaceRecipes.getResult(ingredient); + if (recipe != null) { + BigFurnaceRecipe cachedRecipe = new BigFurnaceRecipe(ingredient, recipe.result); + arecipes.add(cachedRecipe); + } + } + + private class RecipePair { + private ItemStack inputStack; + private ItemStack outputStack; + + private RecipePair(ItemStack input, ItemStack output) { + inputStack = input; + outputStack = output; + } + } + + private class BigFurnaceRecipe extends CachedRecipe { + + private PositionedStack input; + private PositionedStack output; + + private BigFurnaceRecipe(ItemStack inputStack, ItemStack outputStack) { + input = new PositionedStack(inputStack, 31, 15); + output = new PositionedStack(outputStack, 102, 16); // Hell of a perfectionist + } + + @Override + public PositionedStack getOtherStack() { + return input; + } + + @Override + public PositionedStack getResult() { + return output; + } + } } diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java index ed4d0998..7fb06dc2 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBlastFurnace.java @@ -1,9 +1,5 @@ package minefantasy.mf2.integration.nei; -import java.util.Map.Entry; - -import org.lwjgl.opengl.GL11; - import codechicken.lib.gui.GuiDraw; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; @@ -14,73 +10,76 @@ import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; -public class RecipeHandlerBlastFurnace extends TemplateRecipeHandler { - - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("method.blastfurnace"); - } - - @Override - public String getGuiTexture() { - return "minefantasy2:textures/gui/blast_chamber.png"; - } - - @Override - public void drawBackground(int recipe) { - GL11.glColor4f(1, 1, 1, 1); - GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(0, 0, 5, 0, 133, 112); - } - - @Override - public int recipiesPerPage() { - return 1; - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, KnowledgeListMF.blastfurn)) { - for (Entry entry : BlastFurnaceRecipes.smelting().getSmeltingList().entrySet()) { - if (CustomToolHelper.areEqual(entry.getValue(), result)) { - CachedBlastFurnaceRecipe recipe = new CachedBlastFurnaceRecipe(entry.getKey(), result); - arecipes.add(recipe); - } - } - } - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, KnowledgeListMF.blastfurn)) { - ItemStack result = BlastFurnaceRecipes.smelting().getSmeltingResult(ingredient); - if (result != null) { - CachedBlastFurnaceRecipe recipe = new CachedBlastFurnaceRecipe(ingredient, result); - arecipes.add(recipe); - } - } - } - - private class CachedBlastFurnaceRecipe extends CachedRecipe { - - private PositionedStack input; - private PositionedStack output; - - private CachedBlastFurnaceRecipe(ItemStack inputStack, ItemStack outputStack) { - input = new PositionedStack(inputStack, 75, 30); - output = new PositionedStack(outputStack, 75, 68); - } - - @Override - public PositionedStack getOtherStack() { - return input; - } +import java.util.Map.Entry; - @Override - public PositionedStack getResult() { - return output; - } +public class RecipeHandlerBlastFurnace extends TemplateRecipeHandler { - } + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.blastfurnace"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/blast_chamber.png"; + } + + @Override + public void drawBackground(int recipe) { + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 5, 0, 133, 112); + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, KnowledgeListMF.blastfurn)) { + for (Entry entry : BlastFurnaceRecipes.smelting().getSmeltingList().entrySet()) { + if (CustomToolHelper.areEqual(entry.getValue(), result)) { + CachedBlastFurnaceRecipe recipe = new CachedBlastFurnaceRecipe(entry.getKey(), result); + arecipes.add(recipe); + } + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, KnowledgeListMF.blastfurn)) { + ItemStack result = BlastFurnaceRecipes.smelting().getSmeltingResult(ingredient); + if (result != null) { + CachedBlastFurnaceRecipe recipe = new CachedBlastFurnaceRecipe(ingredient, result); + arecipes.add(recipe); + } + } + } + + private class CachedBlastFurnaceRecipe extends CachedRecipe { + + private PositionedStack input; + private PositionedStack output; + + private CachedBlastFurnaceRecipe(ItemStack inputStack, ItemStack outputStack) { + input = new PositionedStack(inputStack, 75, 30); + output = new PositionedStack(outputStack, 75, 68); + } + + @Override + public PositionedStack getOtherStack() { + return input; + } + + @Override + public PositionedStack getResult() { + return output; + } + + } } diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java index e97a9ac7..18ebef7f 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerBloom.java @@ -1,13 +1,5 @@ package minefantasy.mf2.integration.nei; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.lwjgl.opengl.GL11; - import codechicken.lib.gui.GuiDraw; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; @@ -19,101 +11,108 @@ import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; public class RecipeHandlerBloom extends TemplateRecipeHandler { - private static ArrayList afuels; - - @Override - public TemplateRecipeHandler newInstance() { - if (afuels == null || afuels.isEmpty()) { - findFuels(); - } - return super.newInstance(); - } - - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("method.bloomery"); - } - - @Override - public String getGuiTexture() { - return "minefantasy2:textures/gui/bloomery.png"; - } - - @Override - public int recipiesPerPage() { - return 1; - } - - @Override - public void drawBackground(int recipe) { - GL11.glColor4f(1, 1, 1, 1); - GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(0, 0, 0, 11, 176, 89); - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - Map recipes = BloomRecipe.recipeList; - for (Entry recipe : recipes.entrySet()) { - if (CustomToolHelper.areEqual(recipe.getValue(), result)) { - arecipes.add(new SmeltingPair(recipe.getKey(), recipe.getValue())); - } - } - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - ItemStack result = BloomRecipe.getSmeltingResult(ingredient); - if (result != null) { - SmeltingPair arecipe = new SmeltingPair(ingredient, result); - arecipe.setIngredientPermutation(Arrays.asList(arecipe.ingred), ingredient); - arecipes.add(arecipe); - } - } - - private static void findFuels() { - afuels = new ArrayList(); - for (ForgeFuel fuel : ForgeItemHandler.forgeFuel) { - ItemStack item = fuel.fuel; - if (TileEntityBlastFC.isCarbon(item) && MineFantasyFuels.getCarbon(item) > 0) { - afuels.add(new FuelPair(item.copy())); - } - } - } - - private static class FuelPair { - private PositionedStack stack; - - private FuelPair(ItemStack fuel) { - this.stack = new PositionedStack(fuel, 75, 57, false); - } - } - - private class SmeltingPair extends CachedRecipe { - private PositionedStack ingred; - private PositionedStack result; - - private SmeltingPair(ItemStack ingred, ItemStack result) { - this.ingred = new PositionedStack(ingred, 75, 19); - this.result = new PositionedStack(result, 120, 29); - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 48, Arrays.asList(ingred)); - } - - @Override - public PositionedStack getResult() { - return result; - } - - @Override - public PositionedStack getOtherStack() { - return afuels.get((cycleticks / 48) % afuels.size()).stack; - } - } + private static ArrayList afuels; + + private static void findFuels() { + afuels = new ArrayList(); + for (ForgeFuel fuel : ForgeItemHandler.forgeFuel) { + ItemStack item = fuel.fuel; + if (TileEntityBlastFC.isCarbon(item) && MineFantasyFuels.getCarbon(item) > 0) { + afuels.add(new FuelPair(item.copy())); + } + } + } + + @Override + public TemplateRecipeHandler newInstance() { + if (afuels == null || afuels.isEmpty()) { + findFuels(); + } + return super.newInstance(); + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.bloomery"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/bloomery.png"; + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @Override + public void drawBackground(int recipe) { + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 0, 11, 176, 89); + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + Map recipes = BloomRecipe.recipeList; + for (Entry recipe : recipes.entrySet()) { + if (CustomToolHelper.areEqual(recipe.getValue(), result)) { + arecipes.add(new SmeltingPair(recipe.getKey(), recipe.getValue())); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + ItemStack result = BloomRecipe.getSmeltingResult(ingredient); + if (result != null) { + SmeltingPair arecipe = new SmeltingPair(ingredient, result); + arecipe.setIngredientPermutation(Arrays.asList(arecipe.ingred), ingredient); + arecipes.add(arecipe); + } + } + + private static class FuelPair { + private PositionedStack stack; + + private FuelPair(ItemStack fuel) { + this.stack = new PositionedStack(fuel, 75, 57, false); + } + } + + private class SmeltingPair extends CachedRecipe { + private PositionedStack ingred; + private PositionedStack result; + + private SmeltingPair(ItemStack ingred, ItemStack result) { + this.ingred = new PositionedStack(ingred, 75, 19); + this.result = new PositionedStack(result, 120, 29); + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 48, Arrays.asList(ingred)); + } + + @Override + public PositionedStack getResult() { + return result; + } + + @Override + public PositionedStack getOtherStack() { + return afuels.get((cycleticks / 48) % afuels.size()).stack; + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java index 12b955eb..85fd0eeb 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCarpenter.java @@ -1,10 +1,5 @@ package minefantasy.mf2.integration.nei; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.opengl.GL11; - import codechicken.lib.gui.GuiDraw; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; @@ -18,143 +13,147 @@ import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.List; public class RecipeHandlerCarpenter extends TemplateRecipeHandler { - public int[][] stackorder = new int[][] { { 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 1, 2 }, { 2, 0 }, - { 2, 1 }, { 2, 2 } }; - - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("method.carpenter"); - } - - @Override - public String getGuiTexture() { - return "minefantasy2:textures/gui/knowledge/carpenterGrid.png"; - } - - @Override - public int recipiesPerPage() { - return 1; - } - - @SuppressWarnings("unchecked") - @Override - public void loadCraftingRecipes(ItemStack result) { - for (ICarpenterRecipe irecipe : (List) CraftingManagerCarpenter.getInstance() - .getRecipeList()) { - if (CustomToolHelper.areEqual(irecipe.getRecipeOutput(), result) - && ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { - CachedCarpenterRecipe recipe = handleRecipe(irecipe); - - if (recipe == null) - continue; - - recipe.computeVisuals(); - arecipes.add(recipe); - } - } - } - - @SuppressWarnings("unchecked") - @Override - public void loadUsageRecipes(ItemStack ingredient) { - for (ICarpenterRecipe irecipe : (List) CraftingManagerCarpenter.getInstance() - .getRecipeList()) { - - if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { - continue; - } - - CachedCarpenterRecipe recipe = handleRecipe(irecipe); - - if (recipe == null || !recipe.contains(recipe.ingredients, ingredient.getItem())) - continue; - - recipe.computeVisuals(); - if (recipe.contains(recipe.ingredients, ingredient)) { - recipe.setIngredientPermutation(recipe.ingredients, ingredient); - arecipes.add(recipe); - } - } - } - - @Override - public void drawBackground(int recipe) { - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(0, 0, 5, 33, 166, 171); - } - - private CachedCarpenterRecipe handleRecipe(ICarpenterRecipe irecipe) { - if (irecipe instanceof ShapedCarpenterRecipes) { - return new CachedCarpenterRecipe((ShapedCarpenterRecipes) irecipe); - } else if (irecipe instanceof ShapelessCarpenterRecipes) { - return new CachedCarpenterRecipe((ShapelessCarpenterRecipes) irecipe); - } - return null; - } - - class CachedCarpenterRecipe extends CachedRecipe { - - ICarpenterRecipe carpRecipe; - ArrayList ingredients = new ArrayList(); - PositionedStack result; - - public CachedCarpenterRecipe(ShapedCarpenterRecipes recipe) { - carpRecipe = recipe; - result = new PositionedStack(recipe.getRecipeOutput(), 75, 8); - setIngredients(recipe.recipeWidth, recipe.recipeHeight, recipe.recipeItems); - } - - @SuppressWarnings("unchecked") - public CachedCarpenterRecipe(ShapelessCarpenterRecipes recipe) { - carpRecipe = recipe; - result = new PositionedStack(recipe.getRecipeOutput(), 75, 8); - setIngredients(recipe.recipeItems); - } - - public void setIngredients(List items) { - ingredients.clear(); - for (int ingred = 0; ingred < items.size(); ingred++) { - MFPositionedStack stack = new MFPositionedStack(items.get(ingred), 41 + stackorder[ingred][0] * 23, - 47 + stackorder[ingred][1] * 12); - stack.setMaxSize(1); - ingredients.add(stack); - } - } - - public void setIngredients(int width, int height, Object[] items) { - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - if (items[y * width + x] == null) - continue; - - MFPositionedStack stack = new MFPositionedStack(items[y * width + x], 41 + x * 23, 47 + y * 23, - false); - stack.setMaxSize(1); - ingredients.add(stack); - } - } - } - - public void computeVisuals() { - for (PositionedStack p : ingredients) { - p.generatePermutations(); - } - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 20, ingredients); - } - - @Override - public PositionedStack getResult() { - return result; - } - } + public int[][] stackorder = new int[][]{{0, 0}, {1, 0}, {0, 1}, {1, 1}, {0, 2}, {1, 2}, {2, 0}, + {2, 1}, {2, 2}}; + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.carpenter"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/knowledge/carpenterGrid.png"; + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @SuppressWarnings("unchecked") + @Override + public void loadCraftingRecipes(ItemStack result) { + for (ICarpenterRecipe irecipe : (List) CraftingManagerCarpenter.getInstance() + .getRecipeList()) { + if (CustomToolHelper.areEqual(irecipe.getRecipeOutput(), result) + && ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { + CachedCarpenterRecipe recipe = handleRecipe(irecipe); + + if (recipe == null) + continue; + + recipe.computeVisuals(); + arecipes.add(recipe); + } + } + } + + @SuppressWarnings("unchecked") + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (ICarpenterRecipe irecipe : (List) CraftingManagerCarpenter.getInstance() + .getRecipeList()) { + + if (ResearchLogic.hasInfoUnlocked(Minecraft.getMinecraft().thePlayer, irecipe.getResearch())) { + continue; + } + + CachedCarpenterRecipe recipe = handleRecipe(irecipe); + + if (recipe == null || !recipe.contains(recipe.ingredients, ingredient.getItem())) + continue; + + recipe.computeVisuals(); + if (recipe.contains(recipe.ingredients, ingredient)) { + recipe.setIngredientPermutation(recipe.ingredients, ingredient); + arecipes.add(recipe); + } + } + } + + @Override + public void drawBackground(int recipe) { + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 5, 33, 166, 171); + } + + private CachedCarpenterRecipe handleRecipe(ICarpenterRecipe irecipe) { + if (irecipe instanceof ShapedCarpenterRecipes) { + return new CachedCarpenterRecipe((ShapedCarpenterRecipes) irecipe); + } else if (irecipe instanceof ShapelessCarpenterRecipes) { + return new CachedCarpenterRecipe((ShapelessCarpenterRecipes) irecipe); + } + return null; + } + + class CachedCarpenterRecipe extends CachedRecipe { + + ICarpenterRecipe carpRecipe; + ArrayList ingredients = new ArrayList(); + PositionedStack result; + + public CachedCarpenterRecipe(ShapedCarpenterRecipes recipe) { + carpRecipe = recipe; + result = new PositionedStack(recipe.getRecipeOutput(), 75, 8); + setIngredients(recipe.recipeWidth, recipe.recipeHeight, recipe.recipeItems); + } + + @SuppressWarnings("unchecked") + public CachedCarpenterRecipe(ShapelessCarpenterRecipes recipe) { + carpRecipe = recipe; + result = new PositionedStack(recipe.getRecipeOutput(), 75, 8); + setIngredients(recipe.recipeItems); + } + + public void setIngredients(int width, int height, Object[] items) { + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + if (items[y * width + x] == null) + continue; + + MFPositionedStack stack = new MFPositionedStack(items[y * width + x], 41 + x * 23, 47 + y * 23, + false); + stack.setMaxSize(1); + ingredients.add(stack); + } + } + } + + public void computeVisuals() { + for (PositionedStack p : ingredients) { + p.generatePermutations(); + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, ingredients); + } + + public void setIngredients(List items) { + ingredients.clear(); + for (int ingred = 0; ingred < items.size(); ingred++) { + MFPositionedStack stack = new MFPositionedStack(items.get(ingred), 41 + stackorder[ingred][0] * 23, + 47 + stackorder[ingred][1] * 12); + stack.setMaxSize(1); + ingredients.add(stack); + } + } + + @Override + public PositionedStack getResult() { + return result; + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java index 5d6ddc5e..b22662c0 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerCrucible.java @@ -1,10 +1,5 @@ package minefantasy.mf2.integration.nei; -import java.util.ArrayList; -import java.util.List; - -import org.lwjgl.opengl.GL11; - import codechicken.lib.gui.GuiDraw; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; @@ -13,105 +8,109 @@ import minefantasy.mf2.api.refine.AlloyRecipes; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.List; public class RecipeHandlerCrucible extends TemplateRecipeHandler { - private String recipeName = "method.crucible"; - - @Override - public String getRecipeName() { - return StatCollector.translateToLocal(recipeName); - } - - @Override - public String getGuiTexture() { - return getTexture(0); - } - - @Override - public int recipiesPerPage() { - return 1; - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - for (Alloy alloy : AlloyRecipes.alloys) { - if (CustomToolHelper.areEqual(alloy.recipeOutput, result)) { - CachedAlloyRecipe recipe = new CachedAlloyRecipe(alloy); - arecipes.add(recipe); - } - } - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - for (Alloy alloy : AlloyRecipes.alloys) { - for (Object object : alloy.recipeItems) { - ItemStack recipeIngredient = (ItemStack) object; - if (CustomToolHelper.areEqual(recipeIngredient, ingredient)) { - CachedAlloyRecipe recipe = new CachedAlloyRecipe(alloy); - arecipes.add(recipe); - } - } - } - } - - @Override - public void drawBackground(int recipe) { - CachedAlloyRecipe cachedRecipe = (CachedAlloyRecipe) arecipes.get(recipe); - GL11.glColor4f(1, 1, 1, 1); - GuiDraw.changeTexture(getTexture(cachedRecipe.tier)); - GuiDraw.drawTexturedModalRect(0, 0, 5, 0, 151, 94); - } - - private String getTexture(int tier) { - if (tier == 1) { - return "minefantasy2:textures/gui/crucible_advanced.png"; - } - if (tier >= 2) { - return "minefantasy2:textures/gui/crucible_mythic.png"; - } - return "minefantasy2:textures/gui/crucible.png"; - } - - private class CachedAlloyRecipe extends CachedRecipe { - - private ArrayList ingredients = new ArrayList(); - private PositionedStack output; - private int tier; - - @SuppressWarnings("unchecked") - private CachedAlloyRecipe(Alloy alloy) { - setIngridients(alloy.recipeItems); - output = new PositionedStack(alloy.recipeOutput, 124, 32); - tier = alloy.level; - } - - private void setIngridients(List recipeItems) { - for (int x = 0; x < 3; x++) { - for (int y = 0; y < 3; y++) { - int index = y * 3 + x; - if (recipeItems.size() > index) { - ItemStack currentStack = (ItemStack) recipeItems.get(index); - if (currentStack == null) { - continue; - } - - PositionedStack stack = new PositionedStack(currentStack, 57 + x * 18, 14 + y * 18); - ingredients.add(stack); - } - } - } - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 20, ingredients); - } - - @Override - public PositionedStack getResult() { - return output; - } - } + private String recipeName = "method.crucible"; + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal(recipeName); + } + + @Override + public String getGuiTexture() { + return getTexture(0); + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (Alloy alloy : AlloyRecipes.alloys) { + if (CustomToolHelper.areEqual(alloy.recipeOutput, result)) { + CachedAlloyRecipe recipe = new CachedAlloyRecipe(alloy); + arecipes.add(recipe); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (Alloy alloy : AlloyRecipes.alloys) { + for (Object object : alloy.recipeItems) { + ItemStack recipeIngredient = (ItemStack) object; + if (CustomToolHelper.areEqual(recipeIngredient, ingredient)) { + CachedAlloyRecipe recipe = new CachedAlloyRecipe(alloy); + arecipes.add(recipe); + } + } + } + } + + @Override + public void drawBackground(int recipe) { + CachedAlloyRecipe cachedRecipe = (CachedAlloyRecipe) arecipes.get(recipe); + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getTexture(cachedRecipe.tier)); + GuiDraw.drawTexturedModalRect(0, 0, 5, 0, 151, 94); + } + + private String getTexture(int tier) { + if (tier == 1) { + return "minefantasy2:textures/gui/crucible_advanced.png"; + } + if (tier >= 2) { + return "minefantasy2:textures/gui/crucible_mythic.png"; + } + return "minefantasy2:textures/gui/crucible.png"; + } + + private class CachedAlloyRecipe extends CachedRecipe { + + private ArrayList ingredients = new ArrayList(); + private PositionedStack output; + private int tier; + + @SuppressWarnings("unchecked") + private CachedAlloyRecipe(Alloy alloy) { + setIngridients(alloy.recipeItems); + output = new PositionedStack(alloy.recipeOutput, 124, 32); + tier = alloy.level; + } + + private void setIngridients(List recipeItems) { + for (int x = 0; x < 3; x++) { + for (int y = 0; y < 3; y++) { + int index = y * 3 + x; + if (recipeItems.size() > index) { + ItemStack currentStack = (ItemStack) recipeItems.get(index); + if (currentStack == null) { + continue; + } + + PositionedStack stack = new PositionedStack(currentStack, 57 + x * 18, 14 + y * 18); + ingredients.add(stack); + } + } + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, ingredients); + } + + @Override + public PositionedStack getResult() { + return output; + } + } } diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java index 9952c849..727574f0 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java @@ -1,9 +1,5 @@ package minefantasy.mf2.integration.nei; -import java.util.ArrayList; - -import org.lwjgl.opengl.GL11; - import codechicken.lib.gui.GuiDraw; import codechicken.nei.ItemList; import codechicken.nei.PositionedStack; @@ -13,117 +9,120 @@ import minefantasy.mf2.item.list.ComponentListMF; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; public class RecipeHandlerQuern extends TemplateRecipeHandler { - private static ArrayList recipeList; - - @Override - public TemplateRecipeHandler newInstance() { - if (recipeList == null || recipeList.isEmpty()) { - fillRecipeList(); - } - - return super.newInstance(); - } - - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("method.quern"); - } - - @Override - public String getGuiTexture() { - return "minefantasy2:textures/gui/quern.png"; - } - - @Override - public int recipiesPerPage() { - return 1; - } - - @Override - public void drawBackground(int recipe) { - GL11.glColor4f(1, 1, 1, 1); - GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(0, 0, 5, 0, 122, 80); - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - for (RecipePair recipeInpit : recipeList) { - if (CustomToolHelper.areEqual(recipeInpit.outputStack, result)) { - CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipeInpit.inputStack, result); - arecipes.add(cachedRecipe); - } - } - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - if (ingredient != null) { - if (ingredient.getItem().equals(ComponentListMF.clay_pot)) { - for (RecipePair recipePair : recipeList) { - CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipePair.inputStack, - recipePair.outputStack); - arecipes.add(cachedRecipe); - } - return; - } - - QuernRecipes output = QuernRecipes.getResult(ingredient); - if (output != null) { - CachedQuernRecipe recipe = new CachedQuernRecipe(ingredient, output.result); - arecipes.add(recipe); - } - } - } - - private void fillRecipeList() { - recipeList = new ArrayList(); - for (ItemStack item : ItemList.items) { - QuernRecipes tempRecipe = QuernRecipes.getResult(item); - if (tempRecipe != null) { - recipeList.add(new RecipePair(item, tempRecipe.result)); - } - } - } - - private static class RecipePair { - private ItemStack inputStack; - private ItemStack outputStack; - - private RecipePair(ItemStack input, ItemStack output) { - inputStack = input; - outputStack = output; - } - } - - private class CachedQuernRecipe extends CachedRecipe { - - private PositionedStack resultStack; - private PositionedStack potStack; - private PositionedStack inputStack; - - private CachedQuernRecipe(ItemStack ingredient, ItemStack result) { - inputStack = new PositionedStack(ingredient, 76, 9); - potStack = new PositionedStack(new ItemStack(ComponentListMF.clay_pot), 76, 32); - resultStack = new PositionedStack(result, 76, 55); - } - - @Override - public PositionedStack getIngredient() { - return inputStack; - } - - @Override - public PositionedStack getOtherStack() { - return potStack; - } - - @Override - public PositionedStack getResult() { - return resultStack; - } - } + private static ArrayList recipeList; + + @Override + public TemplateRecipeHandler newInstance() { + if (recipeList == null || recipeList.isEmpty()) { + fillRecipeList(); + } + + return super.newInstance(); + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("method.quern"); + } + + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/quern.png"; + } + + @Override + public int recipiesPerPage() { + return 1; + } + + @Override + public void drawBackground(int recipe) { + GL11.glColor4f(1, 1, 1, 1); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 5, 0, 122, 80); + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (RecipePair recipeInpit : recipeList) { + if (CustomToolHelper.areEqual(recipeInpit.outputStack, result)) { + CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipeInpit.inputStack, result); + arecipes.add(cachedRecipe); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if (ingredient != null) { + if (ingredient.getItem().equals(ComponentListMF.clay_pot)) { + for (RecipePair recipePair : recipeList) { + CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipePair.inputStack, + recipePair.outputStack); + arecipes.add(cachedRecipe); + } + return; + } + + QuernRecipes output = QuernRecipes.getResult(ingredient); + if (output != null) { + CachedQuernRecipe recipe = new CachedQuernRecipe(ingredient, output.result); + arecipes.add(recipe); + } + } + } + + private void fillRecipeList() { + recipeList = new ArrayList(); + for (ItemStack item : ItemList.items) { + QuernRecipes tempRecipe = QuernRecipes.getResult(item); + if (tempRecipe != null) { + recipeList.add(new RecipePair(item, tempRecipe.result)); + } + } + } + + private static class RecipePair { + private ItemStack inputStack; + private ItemStack outputStack; + + private RecipePair(ItemStack input, ItemStack output) { + inputStack = input; + outputStack = output; + } + } + + private class CachedQuernRecipe extends CachedRecipe { + + private PositionedStack resultStack; + private PositionedStack potStack; + private PositionedStack inputStack; + + private CachedQuernRecipe(ItemStack ingredient, ItemStack result) { + inputStack = new PositionedStack(ingredient, 76, 9); + potStack = new PositionedStack(new ItemStack(ComponentListMF.clay_pot), 76, 32); + resultStack = new PositionedStack(result, 76, 55); + } + + @Override + public PositionedStack getIngredient() { + return inputStack; + } + + @Override + public PositionedStack getOtherStack() { + return potStack; + } + + @Override + public PositionedStack getResult() { + return resultStack; + } + } } diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java index a5f0bdcb..2fbddd11 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerTanning.java @@ -1,7 +1,5 @@ package minefantasy.mf2.integration.nei; -import java.util.Arrays; - import codechicken.lib.gui.GuiDraw; import codechicken.nei.NEIServerUtils; import codechicken.nei.PositionedStack; @@ -10,70 +8,72 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import java.util.Arrays; + public class RecipeHandlerTanning extends TemplateRecipeHandler { - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("tile.tannerStrong.name"); - } + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("tile.tannerStrong.name"); + } - @Override - public String getGuiTexture() { - return "minefantasy2:textures/gui/quern.png"; // need to draw texture - } + @Override + public String getGuiTexture() { + return "minefantasy2:textures/gui/quern.png"; // need to draw texture + } - @Override - public void loadCraftingRecipes(ItemStack result) { - for (TanningRecipe recipe : TanningRecipe.recipeList) { - if (NEIServerUtils.areStacksSameTypeCrafting(result, recipe.output)) { - TanningPair cachedRecipe = new TanningPair(recipe); - arecipes.add(cachedRecipe); - } - } - } + @Override + public void loadCraftingRecipes(ItemStack result) { + for (TanningRecipe recipe : TanningRecipe.recipeList) { + if (NEIServerUtils.areStacksSameTypeCrafting(result, recipe.output)) { + TanningPair cachedRecipe = new TanningPair(recipe); + arecipes.add(cachedRecipe); + } + } + } - @Override - public void loadUsageRecipes(ItemStack ingredient) { - TanningRecipe recipe = TanningRecipe.getRecipe(ingredient); - if (recipe != null) { - TanningPair cachedRecipe = new TanningPair(recipe); - cachedRecipe.setIngredientPermutation(Arrays.asList(cachedRecipe.input), ingredient); - arecipes.add(cachedRecipe); - } - } + @Override + public void loadUsageRecipes(ItemStack ingredient) { + TanningRecipe recipe = TanningRecipe.getRecipe(ingredient); + if (recipe != null) { + TanningPair cachedRecipe = new TanningPair(recipe); + cachedRecipe.setIngredientPermutation(Arrays.asList(cachedRecipe.input), ingredient); + arecipes.add(cachedRecipe); + } + } - @Override - public void drawExtras(int recipe) { - TanningPair cachedRecipe = (TanningPair) this.arecipes.get(recipe); - GuiDraw.drawString(String.format("%s: %s", StatCollector.translateToLocal("nei.method.tanning.tool"), - cachedRecipe.toolType), 10, 85, -16777216, false); - } + @Override + public void drawExtras(int recipe) { + TanningPair cachedRecipe = (TanningPair) this.arecipes.get(recipe); + GuiDraw.drawString(String.format("%s: %s", StatCollector.translateToLocal("nei.method.tanning.tool"), + cachedRecipe.toolType), 10, 85, -16777216, false); + } - @Override - public int recipiesPerPage() { - return 1; - } + @Override + public int recipiesPerPage() { + return 1; + } - private class TanningPair extends CachedRecipe { + private class TanningPair extends CachedRecipe { - private PositionedStack input; - private PositionedStack output; - private String toolType; + private PositionedStack input; + private PositionedStack output; + private String toolType; - private TanningPair(TanningRecipe recipe) { - input = new PositionedStack(recipe.input, 50, 20); - output = new PositionedStack(recipe.output, 100, 20); - toolType = recipe.toolType; - } + private TanningPair(TanningRecipe recipe) { + input = new PositionedStack(recipe.input, 50, 20); + output = new PositionedStack(recipe.output, 100, 20); + toolType = recipe.toolType; + } - @Override - public PositionedStack getOtherStack() { - return input; - } + @Override + public PositionedStack getOtherStack() { + return input; + } - @Override - public PositionedStack getResult() { - return output; - } - } + @Override + public PositionedStack getResult() { + return output; + } + } } diff --git a/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java b/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java index 2dc0eb81..ca91f665 100644 --- a/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java +++ b/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java @@ -11,31 +11,31 @@ public class AdvancedFuelHandlerMF implements IFuelHandler { - public static void registerItems() { - MineFantasyFuels.addCarbon(new ItemStack(Items.coal, 1, OreDictionary.WILDCARD_VALUE), 1); - MineFantasyFuels.addCarbon(ComponentListMF.coke, 1); - MineFantasyFuels.addCarbon(ComponentListMF.coal_flux, 1); - MineFantasyFuels.addCarbon(Blocks.coal_block, 9); - } + public static void registerItems() { + MineFantasyFuels.addCarbon(new ItemStack(Items.coal, 1, OreDictionary.WILDCARD_VALUE), 1); + MineFantasyFuels.addCarbon(ComponentListMF.coke, 1); + MineFantasyFuels.addCarbon(ComponentListMF.coal_flux, 1); + MineFantasyFuels.addCarbon(Blocks.coal_block, 9); + } - @Override - public int getBurnTime(ItemStack fuel) { - if (fuel == null) { - return 0; - } - if (fuel.getItem() == ComponentListMF.coalDust) { - return 300;// 15s - } - if (fuel.getItem() == ComponentListMF.coke) { - return 2400; - } - if (fuel.getItem() == Items.coal) { - return 1200; - } - if (fuel.getItem() == Item.getItemFromBlock(Blocks.coal_block)) { - return 10800; - } - return 0; - } + @Override + public int getBurnTime(ItemStack fuel) { + if (fuel == null) { + return 0; + } + if (fuel.getItem() == ComponentListMF.coalDust) { + return 300;// 15s + } + if (fuel.getItem() == ComponentListMF.coke) { + return 2400; + } + if (fuel.getItem() == Items.coal) { + return 1200; + } + if (fuel.getItem() == Item.getItemFromBlock(Blocks.coal_block)) { + return 10800; + } + return 0; + } } diff --git a/src/main/java/minefantasy/mf2/item/ClientItemsMF.java b/src/main/java/minefantasy/mf2/item/ClientItemsMF.java index d9a970a5..cf493ff1 100644 --- a/src/main/java/minefantasy/mf2/item/ClientItemsMF.java +++ b/src/main/java/minefantasy/mf2/item/ClientItemsMF.java @@ -1,9 +1,5 @@ package minefantasy.mf2.item; -import java.util.List; - -import org.lwjgl.input.Keyboard; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; @@ -11,18 +7,21 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import org.lwjgl.input.Keyboard; + +import java.util.List; @SideOnly(Side.CLIENT) public class ClientItemsMF { - public static boolean showSpecials(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - if (GameSettings.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindSneak)) { - return true; - } else { - String keyname = Keyboard.getKeyName(Minecraft.getMinecraft().gameSettings.keyBindSneak.getKeyCode()); - list.add(StatCollector.translateToLocalFormatted("info.tooltip.moreinfo", keyname.toUpperCase())); - return false; - } - } + public static boolean showSpecials(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + if (GameSettings.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindSneak)) { + return true; + } else { + String keyname = Keyboard.getKeyName(Minecraft.getMinecraft().gameSettings.keyBindSneak.getKeyCode()); + list.add(StatCollector.translateToLocalFormatted("info.tooltip.moreinfo", keyname.toUpperCase())); + return false; + } + } } diff --git a/src/main/java/minefantasy/mf2/item/FuelHandlerMF.java b/src/main/java/minefantasy/mf2/item/FuelHandlerMF.java index 03a1c07f..f8706e66 100644 --- a/src/main/java/minefantasy/mf2/item/FuelHandlerMF.java +++ b/src/main/java/minefantasy/mf2/item/FuelHandlerMF.java @@ -7,21 +7,21 @@ public class FuelHandlerMF implements IFuelHandler { - @Override - public int getBurnTime(ItemStack fuel) { - if (fuel.getItem() == null) { - return 0; - } - if (fuel.getItem() == ComponentListMF.plank) { - return (int) (200 * CustomToolHelper.getBurnModifier(fuel)); - } - if (fuel.getItem() == ComponentListMF.coalDust) { - return 400; - } - if (fuel.getItem() == ComponentListMF.coke) { - return 2400; - } - return 0; - } + @Override + public int getBurnTime(ItemStack fuel) { + if (fuel.getItem() == null) { + return 0; + } + if (fuel.getItem() == ComponentListMF.plank) { + return (int) (200 * CustomToolHelper.getBurnModifier(fuel)); + } + if (fuel.getItem() == ComponentListMF.coalDust) { + return 400; + } + if (fuel.getItem() == ComponentListMF.coke) { + return 2400; + } + return 0; + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemArtefact.java b/src/main/java/minefantasy/mf2/item/ItemArtefact.java index e212c785..04296d16 100644 --- a/src/main/java/minefantasy/mf2/item/ItemArtefact.java +++ b/src/main/java/minefantasy/mf2/item/ItemArtefact.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -23,144 +21,146 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; +import java.util.List; + public class ItemArtefact extends Item implements IArtefact { - public static final String MYTHIC = "mythic_artefacts"; - public static final String DWARVEN = "dwarven_artefacts"; - public static final String GNOMISH = "gnomish_artefacts"; - - private static final Artefact[] types = new Artefact[] { - new Artefact("ancient_jewel", "mithril_jewel", 20, 2, MYTHIC, 2, "smeltMithril", "smeltMaster"), - new Artefact("ancient_jewel", "adamant_jewel", 20, 2, MYTHIC, 2, "smeltAdamantium", "smeltMaster"), - new Artefact("ancient_jewel", "master_jewel", 30, 2, MYTHIC, 1, "smeltMaster"), - new Artefact("trilogy_jewel", "trilogy_jewel", 3, null, 1), - new Artefact("schem_bomb", "schem_bomb", 50, 2, null, 1, "bombObsidian", "mineObsidian"), - new Artefact("schem_crossbow", "schem_crossbow", 50, 2, null, 1, "crossShaftAdvanced", "crossHeadAdvanced"), - new Artefact("schem_forge", "schem_forge", 50, 2, null, 1, "advforge", "advcrucible"), - new Artefact("schem_gears", "schem_gears", 50, 2, null, 1, "cogArmour"), - new Artefact("schem_cogwork", "schem_cogwork", 50, 2, null, 1, "cogArmour"), - new Artefact("schem_alloy", "schem_alloy", 50, 2, null, 1, "compPlate"), }; - - @SideOnly(Side.CLIENT) - private static IIcon[] icons; - - public ItemArtefact(String name) { - this(name, 2); - } - - public ItemArtefact(String name, int rarity) { - this.setCreativeTab(CreativeTabMF.tabMaterialsMF); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setHasSubtypes(true); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int dam) { - return icons[Math.min(dam, icons.length - 1)]; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - icons = new IIcon[types.length]; - for (int i = 0; i < types.length; ++i) { - icons[i] = reg.registerIcon("minefantasy2:artefact/" + types[i].tex); - } - } - - @Override - public String getUnlocalizedName(ItemStack item) { - return "item." + getArtefact(item).name; - } - - private Artefact getArtefact(ItemStack item) { - return types[Math.min(item.getItemDamage(), types.length - 1)]; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs tab, List list) { - for (int i = 0; i < types.length; i++) { - list.add(new ItemStack(item, 1, i)); - } - } - - @Override - public EnumRarity getRarity(ItemStack item) { - int lvl = getArtefact(item).rarity + 1; - - if (item.isItemEnchanted()) { - if (lvl == 0) { - lvl++; - } - lvl++; - } - if (lvl >= ToolListMF.rarity.length) { - lvl = ToolListMF.rarity.length - 1; - } - return ToolListMF.rarity[lvl]; - } - - public void registerAll() { - for (int id = 0; id < types.length; id++) { - types[id].register(this, id); - } - } - - @Override - public int getStudyTime(ItemStack item) { - return getArtefact(item).time; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - int meta = item.getItemDamage(); - if (!world.isRemote && meta > 3) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); - - if (movingobjectposition == null) { - return item; - } else { - if (BlockSchematic.useSchematic(item, world, user, movingobjectposition)) { - item.stackSize--; - return item; - } - } - } - return item; - } + public static final String MYTHIC = "mythic_artefacts"; + public static final String DWARVEN = "dwarven_artefacts"; + public static final String GNOMISH = "gnomish_artefacts"; + + private static final Artefact[] types = new Artefact[]{ + new Artefact("ancient_jewel", "mithril_jewel", 20, 2, MYTHIC, 2, "smeltMithril", "smeltMaster"), + new Artefact("ancient_jewel", "adamant_jewel", 20, 2, MYTHIC, 2, "smeltAdamantium", "smeltMaster"), + new Artefact("ancient_jewel", "master_jewel", 30, 2, MYTHIC, 1, "smeltMaster"), + new Artefact("trilogy_jewel", "trilogy_jewel", 3, null, 1), + new Artefact("schem_bomb", "schem_bomb", 50, 2, null, 1, "bombObsidian", "mineObsidian"), + new Artefact("schem_crossbow", "schem_crossbow", 50, 2, null, 1, "crossShaftAdvanced", "crossHeadAdvanced"), + new Artefact("schem_forge", "schem_forge", 50, 2, null, 1, "advforge", "advcrucible"), + new Artefact("schem_gears", "schem_gears", 50, 2, null, 1, "cogArmour"), + new Artefact("schem_cogwork", "schem_cogwork", 50, 2, null, 1, "cogArmour"), + new Artefact("schem_alloy", "schem_alloy", 50, 2, null, 1, "compPlate"),}; + + @SideOnly(Side.CLIENT) + private static IIcon[] icons; + + public ItemArtefact(String name) { + this(name, 2); + } + + public ItemArtefact(String name, int rarity) { + this.setCreativeTab(CreativeTabMF.tabMaterialsMF); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setHasSubtypes(true); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int dam) { + return icons[Math.min(dam, icons.length - 1)]; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + icons = new IIcon[types.length]; + for (int i = 0; i < types.length; ++i) { + icons[i] = reg.registerIcon("minefantasy2:artefact/" + types[i].tex); + } + } + + @Override + public String getUnlocalizedName(ItemStack item) { + return "item." + getArtefact(item).name; + } + + private Artefact getArtefact(ItemStack item) { + return types[Math.min(item.getItemDamage(), types.length - 1)]; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i < types.length; i++) { + list.add(new ItemStack(item, 1, i)); + } + } + + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = getArtefact(item).rarity + 1; + + if (item.isItemEnchanted()) { + if (lvl == 0) { + lvl++; + } + lvl++; + } + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; + } + return ToolListMF.rarity[lvl]; + } + + public void registerAll() { + for (int id = 0; id < types.length; id++) { + types[id].register(this, id); + } + } + + @Override + public int getStudyTime(ItemStack item) { + return getArtefact(item).time; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + int meta = item.getItemDamage(); + if (!world.isRemote && meta > 3) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); + + if (movingobjectposition == null) { + return item; + } else { + if (BlockSchematic.useSchematic(item, world, user, movingobjectposition)) { + item.stackSize--; + return item; + } + } + } + return item; + } } class Artefact { - public final String name, tex; - public final int rarity, time; - public final String[] researches; - public final String lootType; - public final int dropWeight; - - Artefact(String name, String tex, int rarity, String lootType, int dropChance) { - this(name, tex, 0, rarity, lootType, dropChance); - } - - Artefact(String name, String tex, int time, int rarity, String lootType, int dropChance, String... researches) { - this.name = name; - this.time = time; - this.tex = tex; - this.rarity = rarity; - this.researches = researches; - this.lootType = lootType; - this.dropWeight = dropChance; - } - - public void register(Item item, int id) { - if (researches != null) { - for (String research : this.researches) { - ResearchArtefacts.addArtefact(new ItemStack(item, 1, id), research.toLowerCase()); - } - } - if (lootType != null) { - ChestGenHooks.addItem(lootType, - new WeightedRandomChestContent(new ItemStack(item, 1, id), 1, 1, dropWeight)); - } - } + public final String name, tex; + public final int rarity, time; + public final String[] researches; + public final String lootType; + public final int dropWeight; + + Artefact(String name, String tex, int rarity, String lootType, int dropChance) { + this(name, tex, 0, rarity, lootType, dropChance); + } + + Artefact(String name, String tex, int time, int rarity, String lootType, int dropChance, String... researches) { + this.name = name; + this.time = time; + this.tex = tex; + this.rarity = rarity; + this.researches = researches; + this.lootType = lootType; + this.dropWeight = dropChance; + } + + public void register(Item item, int id) { + if (researches != null) { + for (String research : this.researches) { + ResearchArtefacts.addArtefact(new ItemStack(item, 1, id), research.toLowerCase()); + } + } + if (lootType != null) { + ChestGenHooks.addItem(lootType, + new WeightedRandomChestContent(new ItemStack(item, 1, id), 1, 1, dropWeight)); + } + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemBandage.java b/src/main/java/minefantasy/mf2/item/ItemBandage.java index 607be2b6..8b469821 100644 --- a/src/main/java/minefantasy/mf2/item/ItemBandage.java +++ b/src/main/java/minefantasy/mf2/item/ItemBandage.java @@ -15,153 +15,152 @@ import net.minecraft.world.World; public class ItemBandage extends Item { - private String name; - private float healPwr; - private float secondsToUse = 5F; - - public ItemBandage(String id, float healAmount) { - super(); - name = id; - healPwr = healAmount; - setMaxStackSize(16); - setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/" + name); - GameRegistry.registerItem(this, "MF_Aid_" + name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public EnumRarity getRarity(ItemStack item) { - if (healPwr <= 5) { - return ToolListMF.poor; - } - return super.getRarity(item); - } - - /** - * Called whenever this item is equipped and the right mouse button is pressed. - * Args: itemStack, world, entityPlayer - */ - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (!user.isSneaking() && canHeal(user) && user.hurtResistantTime <= 0) { - int time = this.getMaxItemUseDuration(item); - if (ResearchLogic.hasInfoUnlocked(user, "firstaid")) { - time /= 3; - } - user.setItemInUse(item, time); - } - return item; - } - - /** - * returns the action that specifies what animation to play when the items is - * being used - */ - @Override - public EnumAction getItemUseAction(ItemStack item) { - return EnumAction.block; - } - - @Override - public int getMaxItemUseDuration(ItemStack item) { - return (int) (20F * secondsToUse); - } - - @Override - public ItemStack onEaten(ItemStack item, World world, EntityPlayer player) { - return heal(player, player, item); - } - - @Override - public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { - super.onUsingTick(stack, player, count); - - if (!canHeal(player) && !player.worldObj.isRemote) { - player.stopUsingItem(); - } - if (count % 5 == 0) { - player.playSound("dig.cloth", 1F, 0.005F); - } - player.swingItem(); - } - - @Override - public boolean itemInteractionForEntity(ItemStack itemstack, EntityPlayer player, EntityLivingBase entity) { - if (player.isSneaking() && isReadyToHeal(player, entity)) { - heal(player, entity, itemstack); - return true; - } - return super.itemInteractionForEntity(itemstack, player, entity); - } - - private ItemStack heal(EntityPlayer player, EntityLivingBase toHeal, ItemStack item) { - if (player.worldObj.isRemote) { - return item; - } - - if (toHeal != null) { - if (canHeal(toHeal)) { - toHeal.worldObj.playSoundEffect(toHeal.posX, toHeal.posY, toHeal.posZ, "dig.cloth", 1.0F, 3.0F); - player.swingItem(); - - if (!player.worldObj.isRemote) { - float power = healPwr; - if (ResearchLogic.hasInfoUnlocked(player, "doctor")) { - power *= 1.5F; - } - toHeal.heal(power); - - if (!player.capabilities.isCreativeMode) { - item.stackSize--; - if (item.stackSize <= 0) { - - } - } - } - toHeal.getEntityData().setInteger(EventManagerMF.injuredNBT, 0); - } - } - return item; - } - - private boolean canHeal(EntityLivingBase toHeal) { - return toHeal.hurtResistantTime <= 0 - && (toHeal.getHealth() <= (toHeal.getMaxHealth() - 1F) || EventManagerMF.getInjuredTime(toHeal) > 0) - && !toHeal.isBurning(); - } - - public boolean isReadyToHeal(EntityPlayer player, EntityLivingBase patient) { - int time = getUserHealTime(patient) + 1; - if (ResearchLogic.hasInfoUnlocked(player, "firstaid")) { - time += 3; - } - patient.playSound("dig.cloth", 1F, 0.005F); - player.swingItem(); - - if (time >= (int) (4 * secondsToUse)) { - setUserHealTime(patient, 0); - return true; - } - - setUserHealTime(patient, time); - return false; - } - - public void setUserHealTime(EntityLivingBase user, int value) { - if (user.getEntityData() != null) { - user.getEntityData().setInteger(healingID, value); - } - } - - public int getUserHealTime(EntityLivingBase user) { - if (user.getEntityData() != null) { - if (user.getEntityData().hasKey(healingID)) { - return user.getEntityData().getInteger(healingID); - } - } - return 0; - } - - private static final String healingID = "MF_Bandage_progress"; + private static final String healingID = "MF_Bandage_progress"; + private String name; + private float healPwr; + private float secondsToUse = 5F; + + public ItemBandage(String id, float healAmount) { + super(); + name = id; + healPwr = healAmount; + setMaxStackSize(16); + setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/" + name); + GameRegistry.registerItem(this, "MF_Aid_" + name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + if (healPwr <= 5) { + return ToolListMF.poor; + } + return super.getRarity(item); + } + + /** + * Called whenever this item is equipped and the right mouse button is pressed. + * Args: itemStack, world, entityPlayer + */ + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!user.isSneaking() && canHeal(user) && user.hurtResistantTime <= 0) { + int time = this.getMaxItemUseDuration(item); + if (ResearchLogic.hasInfoUnlocked(user, "firstaid")) { + time /= 3; + } + user.setItemInUse(item, time); + } + return item; + } + + /** + * returns the action that specifies what animation to play when the items is + * being used + */ + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.block; + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + return (int) (20F * secondsToUse); + } + + @Override + public ItemStack onEaten(ItemStack item, World world, EntityPlayer player) { + return heal(player, player, item); + } + + @Override + public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { + super.onUsingTick(stack, player, count); + + if (!canHeal(player) && !player.worldObj.isRemote) { + player.stopUsingItem(); + } + if (count % 5 == 0) { + player.playSound("dig.cloth", 1F, 0.005F); + } + player.swingItem(); + } + + @Override + public boolean itemInteractionForEntity(ItemStack itemstack, EntityPlayer player, EntityLivingBase entity) { + if (player.isSneaking() && isReadyToHeal(player, entity)) { + heal(player, entity, itemstack); + return true; + } + return super.itemInteractionForEntity(itemstack, player, entity); + } + + private ItemStack heal(EntityPlayer player, EntityLivingBase toHeal, ItemStack item) { + if (player.worldObj.isRemote) { + return item; + } + + if (toHeal != null) { + if (canHeal(toHeal)) { + toHeal.worldObj.playSoundEffect(toHeal.posX, toHeal.posY, toHeal.posZ, "dig.cloth", 1.0F, 3.0F); + player.swingItem(); + + if (!player.worldObj.isRemote) { + float power = healPwr; + if (ResearchLogic.hasInfoUnlocked(player, "doctor")) { + power *= 1.5F; + } + toHeal.heal(power); + + if (!player.capabilities.isCreativeMode) { + item.stackSize--; + if (item.stackSize <= 0) { + + } + } + } + toHeal.getEntityData().setInteger(EventManagerMF.injuredNBT, 0); + } + } + return item; + } + + private boolean canHeal(EntityLivingBase toHeal) { + return toHeal.hurtResistantTime <= 0 + && (toHeal.getHealth() <= (toHeal.getMaxHealth() - 1F) || EventManagerMF.getInjuredTime(toHeal) > 0) + && !toHeal.isBurning(); + } + + public boolean isReadyToHeal(EntityPlayer player, EntityLivingBase patient) { + int time = getUserHealTime(patient) + 1; + if (ResearchLogic.hasInfoUnlocked(player, "firstaid")) { + time += 3; + } + patient.playSound("dig.cloth", 1F, 0.005F); + player.swingItem(); + + if (time >= (int) (4 * secondsToUse)) { + setUserHealTime(patient, 0); + return true; + } + + setUserHealTime(patient, time); + return false; + } + + public void setUserHealTime(EntityLivingBase user, int value) { + if (user.getEntityData() != null) { + user.getEntityData().setInteger(healingID, value); + } + } + + public int getUserHealTime(EntityLivingBase user) { + if (user.getEntityData() != null) { + if (user.getEntityData().hasKey(healingID)) { + return user.getEntityData().getInteger(healingID); + } + } + return 0; + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemBurntFood.java b/src/main/java/minefantasy/mf2/item/ItemBurntFood.java index 69718f10..fb340e4a 100644 --- a/src/main/java/minefantasy/mf2/item/ItemBurntFood.java +++ b/src/main/java/minefantasy/mf2/item/ItemBurntFood.java @@ -1,39 +1,39 @@ package minefantasy.mf2.item; -import java.util.Random; - import minefantasy.mf2.item.food.FoodListMF; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import java.util.Random; + public class ItemBurntFood extends ItemComponentMF { - public ItemBurntFood(String name) { - super(name, -1); - setTextureName("minefantasy2:food/" + name); - } + private Random rand = new Random(); - private Random rand = new Random(); + public ItemBurntFood(String name) { + super(name, -1); + setTextureName("minefantasy2:food/" + name); + } - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { - if (this == FoodListMF.burnt_food) { - if (!world.isRemote && rand.nextInt(5) == 0) { - player.entityDropItem(new ItemStack(Items.coal, 1, 1), 0.0F); - } - --item.stackSize; - return item; - } - if (!world.isRemote) { - player.entityDropItem(new ItemStack(FoodListMF.burnt_food, item.stackSize), 0.0F); - } - return item.getItem().getContainerItem(item); - } + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + if (this == FoodListMF.burnt_food) { + if (!world.isRemote && rand.nextInt(5) == 0) { + player.entityDropItem(new ItemStack(Items.coal, 1, 1), 0.0F); + } + --item.stackSize; + return item; + } + if (!world.isRemote) { + player.entityDropItem(new ItemStack(FoodListMF.burnt_food, item.stackSize), 0.0F); + } + return item.getItem().getContainerItem(item); + } - @Override - public ItemStack getContainerItem(ItemStack itemStack) { - return new ItemStack(getContainerItem(), itemStack.stackSize); - } + @Override + public ItemStack getContainerItem(ItemStack itemStack) { + return new ItemStack(getContainerItem(), itemStack.stackSize); + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemComponentMF.java b/src/main/java/minefantasy/mf2/item/ItemComponentMF.java index 8126bb3f..82966f33 100644 --- a/src/main/java/minefantasy/mf2/item/ItemComponentMF.java +++ b/src/main/java/minefantasy/mf2/item/ItemComponentMF.java @@ -1,9 +1,5 @@ package minefantasy.mf2.item; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,32 +21,22 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemComponentMF extends Item implements ITieredComponent { - protected String name; - - public ItemComponentMF(int rarity) { - itemRarity = rarity; - } - - public ItemComponentMF(String name) { - this(name, 0); - } - - public ItemComponentMF(String name, int rarity) { - itemRarity = rarity; - this.name = name; - setTextureName("minefantasy2:component/" + name); - this.setCreativeTab(CreativeTabMF.tabMaterialsMF); - GameRegistry.registerItem(this, "MF_Com_" + name, MineFantasyII.MODID); - - this.setUnlocalizedName(name); - } + protected String name; + protected int itemRarity; + // STORAGE + protected String blocktex; + protected String storageType; /* - * private int itemRarity; + * private int itemRarity; * * @Override public EnumRarity getRarity(ItemStack item) { int lvl = * itemRarity+1; @@ -59,274 +45,282 @@ public ItemComponentMF(String name, int rarity) { * ToolListMF.rarity.length) { lvl = ToolListMF.rarity.length-1; } return * ToolListMF.rarity[lvl]; } */ - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (this.getCreativeTab() != CreativeTabMF.tabMaterialsMF) { - super.getSubItems(item, tab, list); - return; - } - - if (this != ComponentListMF.plank) { - return; - } - - for (Item ingot : ComponentListMF.ingots) { - if (ingot == ComponentListMF.ingots[3]) { - add(list, Items.iron_ingot); - } - if (ingot == ComponentListMF.ingots[7]) { - add(list, Items.gold_ingot); - } - add(list, ingot); - } - - if (isCustom) { - ArrayList wood = CustomMaterial.getList("wood"); - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorWood = wood.iterator(); - while (iteratorWood.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - list.add(this.construct(customMat.name)); - list.add(((ItemComponentMF) ComponentListMF.plank_pane).construct(customMat.name)); - } - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - list.add(ComponentListMF.bar(customMat.name)); - } - } - - add(list, ComponentListMF.nail); - add(list, ComponentListMF.rivet); - add(list, ComponentListMF.thread); - add(list, ComponentListMF.clay_pot_uncooked); - add(list, ComponentListMF.clay_pot); - add(list, ComponentListMF.ingot_mould_uncooked); - add(list, ComponentListMF.ingot_mould); - - add(list, ComponentListMF.leather_strip); - add(list, ComponentListMF.rawhideSmall); - add(list, ComponentListMF.rawhideMedium); - add(list, ComponentListMF.rawhideLarge); - add(list, ComponentListMF.hideSmall); - add(list, ComponentListMF.hideMedium); - add(list, ComponentListMF.hideLarge); - - add(list, ComponentListMF.oreCopper); - add(list, ComponentListMF.oreTin); - add(list, ComponentListMF.oreIron); - add(list, ComponentListMF.oreSilver); - add(list, ComponentListMF.oreGold); - add(list, ComponentListMF.oreTungsten); - - add(list, ComponentListMF.flux); - add(list, ComponentListMF.flux_strong); - add(list, ComponentListMF.flux_pot); - add(list, ComponentListMF.coal_flux); - add(list, ComponentListMF.coke); - add(list, ComponentListMF.diamond_shards); - add(list, ComponentListMF.fletching); - add(list, ComponentListMF.plant_oil); - - add(list, ComponentListMF.coalDust); - add(list, ComponentListMF.iron_prep); - add(list, ComponentListMF.obsidian_rock); - add(list, ComponentListMF.sulfur); - add(list, ComponentListMF.nitre); - add(list, ComponentListMF.blackpowder); - add(list, ComponentListMF.blackpowder_advanced); - add(list, ComponentListMF.bomb_fuse); - add(list, ComponentListMF.bomb_fuse_long); - add(list, ComponentListMF.shrapnel); - add(list, ComponentListMF.magma_cream_refined); - add(list, ComponentListMF.bomb_casing_uncooked); - add(list, ComponentListMF.bomb_casing); - add(list, ComponentListMF.mine_casing_uncooked); - add(list, ComponentListMF.mine_casing); - add(list, ComponentListMF.bomb_casing_iron); - add(list, ComponentListMF.mine_casing_iron); - add(list, ComponentListMF.bomb_casing_obsidian); - add(list, ComponentListMF.mine_casing_obsidian); - add(list, ComponentListMF.bomb_casing_crystal); - add(list, ComponentListMF.mine_casing_crystal); - add(list, ComponentListMF.bomb_casing_arrow); - add(list, ComponentListMF.bomb_casing_bolt); - - add(list, ComponentListMF.clay_brick); - add(list, ComponentListMF.kaolinite); - add(list, ComponentListMF.kaolinite_dust); - add(list, ComponentListMF.fireclay); - add(list, ComponentListMF.fireclay_brick); - add(list, ComponentListMF.strong_brick); - add(list, ComponentListMF.dragon_heart); - add(list, ComponentListMF.ornate_items); - - add(list, ComponentListMF.talisman_lesser); - add(list, ComponentListMF.talisman_greater); - - add(list, ComponentListMF.bolt); - add(list, ComponentListMF.iron_frame); - add(list, ComponentListMF.iron_strut); - add(list, ComponentListMF.steel_tube); - add(list, ComponentListMF.bronze_gears); - add(list, ComponentListMF.tungsten_gears); - add(list, ComponentListMF.cogwork_shaft); - add(list, ComponentListMF.ingotCompositeAlloy); - - add(list, ComponentListMF.crossbow_handle_wood); - add(list, ComponentListMF.crossbow_stock_wood); - add(list, ComponentListMF.crossbow_stock_iron); - - add(list, ComponentListMF.cross_arms_basic); - add(list, ComponentListMF.cross_arms_light); - add(list, ComponentListMF.cross_arms_heavy); - add(list, ComponentListMF.cross_arms_advanced); - - add(list, ComponentListMF.cross_ammo); - add(list, ComponentListMF.cross_scope); - add(list, ComponentListMF.cross_bayonet); - - add(list, ComponentListMF.copper_coin); - add(list, ComponentListMF.silver_coin); - add(list, ComponentListMF.gold_coin); - } - - private void add(List list, Item item) { - list.add(new ItemStack(item)); - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - - super.addInformation(item, user, list, extra); - if (isCustom) { - CustomToolHelper.addComponentString(item, list, - CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main), this.unitCount); - } - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - private float unitCount = 1; - - public ItemComponentMF setCustom(float units, String type) { - canRepair = false; - this.unitCount = units; - setTextureName("minefantasy2:custom/component/" + name); - isCustom = true; - this.setHasSubtypes(true); - this.materialType = type; - return this; - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon componentTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - componentTex = reg.registerIcon(this.getIconString()); - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom) { - return componentTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - //// Probably not the cleanest way to do this, but I decided to because for this - //// item, - /// the color will always be only one layer from only one material - - public int getColorFromItemStack(ItemStack item, int layer) { - // return CustomToolHelper.getColourFromItemStack(item, layer, - // super.getColorFromItemStack(item, layer)); - if (isCustom) { - CustomMaterial mat = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); - if (mat != null) - return mat.getColourInt(); - } - return super.getColorFromItemStack(item, layer); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - public ItemStack construct(String main) { - return construct(main, 1); - } - - public ItemStack construct(String main, int stacksize) { - return CustomToolHelper.constructSingleColoredLayer(this, main, stacksize); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - if (isCustom) { - return CustomToolHelper.getLocalisedName(item, "item.commodity_" + name + ".name"); - } - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - - private String materialType = null; - - @Override - public String getMaterialType(ItemStack item) { - return isCustom ? materialType : null; - } - // ====================================================== CUSTOM END - // ==============================================================\\ - - // STORAGE - protected String blocktex; - protected String storageType; - - public ItemComponentMF setStoragePlacement(String type, String tex) { - this.blocktex = tex; - this.storageType = type; - return this; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (!world.isRemote && storageType != null) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); - - if (movingobjectposition == null) { - return item; - } else { - int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, - movingobjectposition); - if (placed > 0) { - item.stackSize -= placed; - return item; - } - } - } - return super.onItemRightClick(item, world, user); - } + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float unitCount = 1; + private IIcon componentTex = null; + private String materialType = null; + public ItemComponentMF(int rarity) { + itemRarity = rarity; + } + + public ItemComponentMF(String name) { + this(name, 0); + } + + public ItemComponentMF(String name, int rarity) { + itemRarity = rarity; + this.name = name; + setTextureName("minefantasy2:component/" + name); + this.setCreativeTab(CreativeTabMF.tabMaterialsMF); + GameRegistry.registerItem(this, "MF_Com_" + name, MineFantasyII.MODID); + + this.setUnlocalizedName(name); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (this.getCreativeTab() != CreativeTabMF.tabMaterialsMF) { + super.getSubItems(item, tab, list); + return; + } + + if (this != ComponentListMF.plank) { + return; + } + + for (Item ingot : ComponentListMF.ingots) { + if (ingot == ComponentListMF.ingots[3]) { + add(list, Items.iron_ingot); + } + if (ingot == ComponentListMF.ingots[7]) { + add(list, Items.gold_ingot); + } + add(list, ingot); + } + + if (isCustom) { + ArrayList wood = CustomMaterial.getList("wood"); + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorWood = wood.iterator(); + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + list.add(this.construct(customMat.name)); + list.add(((ItemComponentMF) ComponentListMF.plank_pane).construct(customMat.name)); + } + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + list.add(ComponentListMF.bar(customMat.name)); + } + } + + add(list, ComponentListMF.nail); + add(list, ComponentListMF.rivet); + add(list, ComponentListMF.thread); + add(list, ComponentListMF.clay_pot_uncooked); + add(list, ComponentListMF.clay_pot); + add(list, ComponentListMF.ingot_mould_uncooked); + add(list, ComponentListMF.ingot_mould); + + add(list, ComponentListMF.leather_strip); + add(list, ComponentListMF.rawhideSmall); + add(list, ComponentListMF.rawhideMedium); + add(list, ComponentListMF.rawhideLarge); + add(list, ComponentListMF.hideSmall); + add(list, ComponentListMF.hideMedium); + add(list, ComponentListMF.hideLarge); + + add(list, ComponentListMF.oreCopper); + add(list, ComponentListMF.oreTin); + add(list, ComponentListMF.oreIron); + add(list, ComponentListMF.oreSilver); + add(list, ComponentListMF.oreGold); + add(list, ComponentListMF.oreTungsten); + + add(list, ComponentListMF.flux); + add(list, ComponentListMF.flux_strong); + add(list, ComponentListMF.flux_pot); + add(list, ComponentListMF.coal_flux); + add(list, ComponentListMF.coke); + add(list, ComponentListMF.diamond_shards); + add(list, ComponentListMF.fletching); + add(list, ComponentListMF.plant_oil); + + add(list, ComponentListMF.coalDust); + add(list, ComponentListMF.iron_prep); + add(list, ComponentListMF.obsidian_rock); + add(list, ComponentListMF.sulfur); + add(list, ComponentListMF.nitre); + add(list, ComponentListMF.blackpowder); + add(list, ComponentListMF.blackpowder_advanced); + add(list, ComponentListMF.bomb_fuse); + add(list, ComponentListMF.bomb_fuse_long); + add(list, ComponentListMF.shrapnel); + add(list, ComponentListMF.magma_cream_refined); + add(list, ComponentListMF.bomb_casing_uncooked); + add(list, ComponentListMF.bomb_casing); + add(list, ComponentListMF.mine_casing_uncooked); + add(list, ComponentListMF.mine_casing); + add(list, ComponentListMF.bomb_casing_iron); + add(list, ComponentListMF.mine_casing_iron); + add(list, ComponentListMF.bomb_casing_obsidian); + add(list, ComponentListMF.mine_casing_obsidian); + add(list, ComponentListMF.bomb_casing_crystal); + add(list, ComponentListMF.mine_casing_crystal); + add(list, ComponentListMF.bomb_casing_arrow); + add(list, ComponentListMF.bomb_casing_bolt); + + add(list, ComponentListMF.clay_brick); + add(list, ComponentListMF.kaolinite); + add(list, ComponentListMF.kaolinite_dust); + add(list, ComponentListMF.fireclay); + add(list, ComponentListMF.fireclay_brick); + add(list, ComponentListMF.strong_brick); + add(list, ComponentListMF.dragon_heart); + add(list, ComponentListMF.ornate_items); + + add(list, ComponentListMF.talisman_lesser); + add(list, ComponentListMF.talisman_greater); + + add(list, ComponentListMF.bolt); + add(list, ComponentListMF.iron_frame); + add(list, ComponentListMF.iron_strut); + add(list, ComponentListMF.steel_tube); + add(list, ComponentListMF.bronze_gears); + add(list, ComponentListMF.tungsten_gears); + add(list, ComponentListMF.cogwork_shaft); + add(list, ComponentListMF.ingotCompositeAlloy); + + add(list, ComponentListMF.crossbow_handle_wood); + add(list, ComponentListMF.crossbow_stock_wood); + add(list, ComponentListMF.crossbow_stock_iron); + + add(list, ComponentListMF.cross_arms_basic); + add(list, ComponentListMF.cross_arms_light); + add(list, ComponentListMF.cross_arms_heavy); + add(list, ComponentListMF.cross_arms_advanced); + + add(list, ComponentListMF.cross_ammo); + add(list, ComponentListMF.cross_scope); + add(list, ComponentListMF.cross_bayonet); + + add(list, ComponentListMF.copper_coin); + add(list, ComponentListMF.silver_coin); + add(list, ComponentListMF.gold_coin); + } + + private void add(List list, Item item) { + list.add(new ItemStack(item)); + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + + super.addInformation(item, user, list, extra); + if (isCustom) { + CustomToolHelper.addComponentString(item, list, + CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main), this.unitCount); + } + } + + public ItemComponentMF setCustom(float units, String type) { + canRepair = false; + this.unitCount = units; + setTextureName("minefantasy2:custom/component/" + name); + isCustom = true; + this.setHasSubtypes(true); + this.materialType = type; + return this; + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + componentTex = reg.registerIcon(this.getIconString()); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom) { + return componentTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + //// Probably not the cleanest way to do this, but I decided to because for this + //// item, + /// the color will always be only one layer from only one material + + public int getColorFromItemStack(ItemStack item, int layer) { + // return CustomToolHelper.getColourFromItemStack(item, layer, + // super.getColorFromItemStack(item, layer)); + if (isCustom) { + CustomMaterial mat = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); + if (mat != null) + return mat.getColourInt(); + } + return super.getColorFromItemStack(item, layer); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + public ItemStack construct(String main) { + return construct(main, 1); + } + + public ItemStack construct(String main, int stacksize) { + return CustomToolHelper.constructSingleColoredLayer(this, main, stacksize); + } + // ====================================================== CUSTOM END + // ==============================================================\\ + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + if (isCustom) { + return CustomToolHelper.getLocalisedName(item, "item.commodity_" + name + ".name"); + } + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + @Override + public String getMaterialType(ItemStack item) { + return isCustom ? materialType : null; + } + + public ItemComponentMF setStoragePlacement(String type, String tex) { + this.blocktex = tex; + this.storageType = type; + return this; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote && storageType != null) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); + + if (movingobjectposition == null) { + return item; + } else { + int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, + movingobjectposition); + if (placed > 0) { + item.stackSize -= placed; + return item; + } + } + } + return super.onItemRightClick(item, world, user); + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemFilledMould.java b/src/main/java/minefantasy/mf2/item/ItemFilledMould.java index 9cbb768c..41072294 100644 --- a/src/main/java/minefantasy/mf2/item/ItemFilledMould.java +++ b/src/main/java/minefantasy/mf2/item/ItemFilledMould.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.heating.TongsHelper; @@ -13,109 +11,111 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import java.util.List; + public class ItemFilledMould extends ItemComponentMF { - public ItemFilledMould() { - super("ingot_mould_filled"); - // setMaxStackSize(1); - this.setUnlocalizedName("ingot_mould"); - } - - private static final String itemNBT = "MF_HeldItem"; - - public static ItemStack createMould(ItemStack fill) { - ItemStack mould = new ItemStack(ComponentListMF.ingot_mould_filled); - NBTTagCompound nbt = getOrCreateNBT(mould); - NBTTagCompound save = new NBTTagCompound(); - fill.writeToNBT(save); - nbt.setTag(itemNBT, save); - return mould; - } - - public ItemStack getHeldItem(ItemStack item) { - NBTTagCompound nbt = getOrCreateNBT(item); - if (nbt.hasKey(itemNBT)) { - return ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(itemNBT)); - } - return null; - } - - public static NBTTagCompound getOrCreateNBT(ItemStack item) { - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - return item.getTagCompound(); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - ItemStack held = getHeldItem(item); - if (held != null) { - list.add(held.getDisplayName()); - } - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - - if (movingobjectposition == null) { - return item; - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (!world.canMineBlock(player, i, j, k)) { - return item; - } - - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { - return item; - } - - float water = TongsHelper.getWaterSource(world, i, j, k); - ItemStack drop = getHeldItem(item); - - if (drop != null && water >= 0) { - player.playSound("random.splash", 1F, 1F); - player.playSound("random.fizz", 2F, 0.5F); - - for (int a = 0; a < 5; a++) { - world.spawnParticle("largesmoke", i + 0.5F, j + 1, k + 0.5F, 0, 0.065F, 0); - } - - if (!world.isRemote) { - ItemStack mould = new ItemStack(ComponentListMF.ingot_mould); - if (!world.getBlock(i, j + 1, k).getMaterial().isSolid()) { - dropItem(world, i, j + 1, k, drop); - dropItem(world, i, j + 1, k, mould); - } else { - dropItem(world, player.posX, player.posY, player.posZ, drop, false); - dropItem(world, player.posX, player.posY, player.posZ, mould, false); - } - } - - --item.stackSize; - } - } - - return item; - } - } - - private void dropItem(World world, int i, int j, int k, ItemStack drop) { - dropItem(world, i + 0.5, j + 0.5, k + 0.5, drop, true); - } - - private void dropItem(World world, double i, double j, double k, ItemStack drop, boolean delay) { - EntityItem entity = new EntityItem(world, i, j, k, drop); - if (delay) - entity.delayBeforeCanPickup = 20; - entity.motionX = entity.motionY = entity.motionZ = 0F; - world.spawnEntityInWorld(entity); - } + private static final String itemNBT = "MF_HeldItem"; + + public ItemFilledMould() { + super("ingot_mould_filled"); + // setMaxStackSize(1); + this.setUnlocalizedName("ingot_mould"); + } + + public static ItemStack createMould(ItemStack fill) { + ItemStack mould = new ItemStack(ComponentListMF.ingot_mould_filled); + NBTTagCompound nbt = getOrCreateNBT(mould); + NBTTagCompound save = new NBTTagCompound(); + fill.writeToNBT(save); + nbt.setTag(itemNBT, save); + return mould; + } + + public static NBTTagCompound getOrCreateNBT(ItemStack item) { + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + return item.getTagCompound(); + } + + public ItemStack getHeldItem(ItemStack item) { + NBTTagCompound nbt = getOrCreateNBT(item); + if (nbt.hasKey(itemNBT)) { + return ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(itemNBT)); + } + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + ItemStack held = getHeldItem(item); + if (held != null) { + list.add(held.getDisplayName()); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + + if (movingobjectposition == null) { + return item; + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) { + return item; + } + + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return item; + } + + float water = TongsHelper.getWaterSource(world, i, j, k); + ItemStack drop = getHeldItem(item); + + if (drop != null && water >= 0) { + player.playSound("random.splash", 1F, 1F); + player.playSound("random.fizz", 2F, 0.5F); + + for (int a = 0; a < 5; a++) { + world.spawnParticle("largesmoke", i + 0.5F, j + 1, k + 0.5F, 0, 0.065F, 0); + } + + if (!world.isRemote) { + ItemStack mould = new ItemStack(ComponentListMF.ingot_mould); + if (!world.getBlock(i, j + 1, k).getMaterial().isSolid()) { + dropItem(world, i, j + 1, k, drop); + dropItem(world, i, j + 1, k, mould); + } else { + dropItem(world, player.posX, player.posY, player.posZ, drop, false); + dropItem(world, player.posX, player.posY, player.posZ, mould, false); + } + } + + --item.stackSize; + } + } + + return item; + } + } + + private void dropItem(World world, int i, int j, int k, ItemStack drop) { + dropItem(world, i + 0.5, j + 0.5, k + 0.5, drop, true); + } + + private void dropItem(World world, double i, double j, double k, ItemStack drop, boolean delay) { + EntityItem entity = new EntityItem(world, i, j, k, drop); + if (delay) + entity.delayBeforeCanPickup = 20; + entity.motionX = entity.motionY = entity.motionZ = 0F; + world.spawnEntityInWorld(entity); + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemHide.java b/src/main/java/minefantasy/mf2/item/ItemHide.java index 93f2d09f..3e90248b 100644 --- a/src/main/java/minefantasy/mf2/item/ItemHide.java +++ b/src/main/java/minefantasy/mf2/item/ItemHide.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item; -import java.util.Random; - import minefantasy.mf2.api.heating.IQuenchBlock; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; @@ -13,79 +11,80 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -public class ItemHide extends ItemComponentMF { - private final Item result; - private float hardness; +import java.util.Random; - public ItemHide(String name, Item result, float hardness) { - super(name, -1); - this.result = result; - this.hardness = hardness; - } +public class ItemHide extends ItemComponentMF { + private final Item result; + private float hardness; + private Random rand = new Random(); - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + public ItemHide(String name, Item result, float hardness) { + super(name, -1); + this.result = result; + this.hardness = hardness; + } - if (movingobjectposition == null) { - return item; - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - if (!world.canMineBlock(player, i, j, k)) { - return item; - } + if (movingobjectposition == null) { + return item; + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { - return item; - } + if (!world.canMineBlock(player, i, j, k)) { + return item; + } - if (isWaterSource(world, i, j, k)) { - tryClean(item, world, player); - } - } + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return item; + } - return item; - } - } + if (isWaterSource(world, i, j, k)) { + tryClean(item, world, player); + } + } - private Random rand = new Random(); + return item; + } + } - private void tryClean(ItemStack item, World world, EntityPlayer player) { - player.swingItem(); - if (!world.isRemote) { - world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, 0.5F + rand.nextFloat()); - if (rand.nextFloat() * 2 * hardness < 1.0F) { - item.stackSize--; - EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, - new ItemStack(result)); - world.spawnEntityInWorld(resultItem); - } - } - } + private void tryClean(ItemStack item, World world, EntityPlayer player) { + player.swingItem(); + if (!world.isRemote) { + world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, 0.5F + rand.nextFloat()); + if (rand.nextFloat() * 2 * hardness < 1.0F) { + item.stackSize--; + EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, + new ItemStack(result)); + world.spawnEntityInWorld(resultItem); + } + } + } - private boolean isWaterSource(World world, int i, int j, int k) { - if (world.getBlock(i, j, k).getMaterial() == Material.water) { - return true; - } - if (isCauldron(world, i, j, k)) { - return true; - } - if (isTrough(world, i, j, k)) { - return true; - } - return false; - } + private boolean isWaterSource(World world, int i, int j, int k) { + if (world.getBlock(i, j, k).getMaterial() == Material.water) { + return true; + } + if (isCauldron(world, i, j, k)) { + return true; + } + if (isTrough(world, i, j, k)) { + return true; + } + return false; + } - public boolean isTrough(World world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - return tile != null && tile instanceof IQuenchBlock; - } + public boolean isTrough(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + return tile != null && tile instanceof IQuenchBlock; + } - public boolean isCauldron(World world, int x, int y, int z) { - return world.getBlock(x, y, z) == Blocks.cauldron && world.getBlockMetadata(x, y, z) > 0; - } + public boolean isCauldron(World world, int x, int y, int z) { + return world.getBlock(x, y, z) == Blocks.cauldron && world.getBlockMetadata(x, y, z) > 0; + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemMFBowl.java b/src/main/java/minefantasy/mf2/item/ItemMFBowl.java index d1fe47af..aad5a55e 100644 --- a/src/main/java/minefantasy/mf2/item/ItemMFBowl.java +++ b/src/main/java/minefantasy/mf2/item/ItemMFBowl.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item; -import java.util.Random; - import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.util.MFLogUtil; import net.minecraft.block.material.Material; @@ -13,66 +11,68 @@ import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; +import java.util.Random; + public class ItemMFBowl extends ItemComponentMF { - public ItemMFBowl(String name) { - super(name, 0); - } + private Random rand = new Random(); - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + public ItemMFBowl(String name) { + super(name, 0); + } - if (movingobjectposition == null) { - return super.onItemRightClick(item, world, player); - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - if (!world.canMineBlock(player, i, j, k)) { - return super.onItemRightClick(item, world, player); - } + if (movingobjectposition == null) { + return super.onItemRightClick(item, world, player); + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { - return super.onItemRightClick(item, world, player); - } + if (!world.canMineBlock(player, i, j, k)) { + return super.onItemRightClick(item, world, player); + } - if (isWaterSource(world, i, j, k)) { - gather(item, world, player); - return item; - } - } - } - return super.onItemRightClick(item, world, player); - } + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return super.onItemRightClick(item, world, player); + } - private Random rand = new Random(); + if (isWaterSource(world, i, j, k)) { + gather(item, world, player); + return item; + } + } + } + return super.onItemRightClick(item, world, player); + } - private void gather(ItemStack item, World world, EntityPlayer player) { - player.swingItem(); - if (!world.isRemote) { - world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, 0.5F + rand.nextFloat()); - item.stackSize--; - EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, - new ItemStack(FoodListMF.bowl_water_salt)); - world.spawnEntityInWorld(resultItem); - } - } + private void gather(ItemStack item, World world, EntityPlayer player) { + player.swingItem(); + if (!world.isRemote) { + world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, 0.5F + rand.nextFloat()); + item.stackSize--; + EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, + new ItemStack(FoodListMF.bowl_water_salt)); + world.spawnEntityInWorld(resultItem); + } + } - private boolean isWaterSource(World world, int i, int j, int k) { - if (world.getBlock(i, j, k).getMaterial() != Material.water) { - return false; - } + private boolean isWaterSource(World world, int i, int j, int k) { + if (world.getBlock(i, j, k).getMaterial() != Material.water) { + return false; + } - BiomeGenBase biome = world.getBiomeGenForCoords(i, k); - if (biome == BiomeGenBase.ocean || biome == BiomeGenBase.deepOcean || biome == BiomeGenBase.beach) { - return true; - } - MFLogUtil.logDebug("Biome = " + biome.biomeName); - if (world.getBlock(i, j - 1, k) == Blocks.sand) { - return true; - } - return false; - } + BiomeGenBase biome = world.getBiomeGenForCoords(i, k); + if (biome == BiomeGenBase.ocean || biome == BiomeGenBase.deepOcean || biome == BiomeGenBase.beach) { + return true; + } + MFLogUtil.logDebug("Biome = " + biome.biomeName); + if (world.getBlock(i, j - 1, k) == Blocks.sand) { + return true; + } + return false; + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemRawOreMF.java b/src/main/java/minefantasy/mf2/item/ItemRawOreMF.java index ea378b70..e8d92506 100644 --- a/src/main/java/minefantasy/mf2/item/ItemRawOreMF.java +++ b/src/main/java/minefantasy/mf2/item/ItemRawOreMF.java @@ -5,11 +5,11 @@ import minefantasy.mf2.item.list.CreativeTabMF; public class ItemRawOreMF extends ItemComponentMF { - public ItemRawOreMF(String name, int rarity) { - super(rarity); - setTextureName("minefantasy2:oreItem/" + name); - this.setCreativeTab(CreativeTabMF.tabMaterialsMF); - GameRegistry.registerItem(this, "MF_Ore_" + name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } + public ItemRawOreMF(String name, int rarity) { + super(rarity); + setTextureName("minefantasy2:oreItem/" + name); + this.setCreativeTab(CreativeTabMF.tabMaterialsMF); + GameRegistry.registerItem(this, "MF_Ore_" + name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemResearchBook.java b/src/main/java/minefantasy/mf2/item/ItemResearchBook.java index 9dce0778..a494924f 100644 --- a/src/main/java/minefantasy/mf2/item/ItemResearchBook.java +++ b/src/main/java/minefantasy/mf2/item/ItemResearchBook.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -15,39 +13,41 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import java.util.List; + public class ItemResearchBook extends Item { - public ItemResearchBook() { - super(); - setMaxStackSize(1); - setCreativeTab(CreativeTabMF.tabGadget); - GameRegistry.registerItem(this, "MF_ResearchBook", MineFantasyII.MODID); - this.setUnlocalizedName("infobook"); - this.setTextureName("minefantasy2:Other/research_book"); - setContainerItem(this); - } + public ItemResearchBook() { + super(); + setMaxStackSize(1); + setCreativeTab(CreativeTabMF.tabGadget); + GameRegistry.registerItem(this, "MF_ResearchBook", MineFantasyII.MODID); + this.setUnlocalizedName("infobook"); + this.setTextureName("minefantasy2:Other/research_book"); + setContainerItem(this); + } - @Override - public EnumRarity getRarity(ItemStack item) { - return EnumRarity.uncommon; - } + @Override + public EnumRarity getRarity(ItemStack item) { + return EnumRarity.uncommon; + } - /** - * Called whenever this item is equipped and the right mouse button is pressed. - * Args: itemStack, world, entityPlayer - */ - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (!world.isRemote) { - ResearchLogic.syncData(user); - RPGElements.syncAll(user); - } - user.openGui(MineFantasyII.instance, 1, world, 0, -1, 0); - return item; - } + /** + * Called whenever this item is equipped and the right mouse button is pressed. + * Args: itemStack, world, entityPlayer + */ + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote) { + ResearchLogic.syncData(user); + RPGElements.syncAll(user); + } + user.openGui(MineFantasyII.instance, 1, world, 0, -1, 0); + return item; + } - @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - super.addInformation(item, user, list, fullInfo); - } + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemSkillBook.java b/src/main/java/minefantasy/mf2/item/ItemSkillBook.java index 4cde58bd..3401264a 100644 --- a/src/main/java/minefantasy/mf2/item/ItemSkillBook.java +++ b/src/main/java/minefantasy/mf2/item/ItemSkillBook.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.rpg.RPGElements; @@ -14,60 +12,62 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.List; + public class ItemSkillBook extends ItemComponentMF { - private Skill skill; - private String name; - private boolean isMax = false; + private Skill skill; + private String name; + private boolean isMax = false; - public ItemSkillBook(String name, Skill skill) { - super(name, 1); - setMaxStackSize(16); - setTextureName("minefantasy2:Other/" + name); - this.setCreativeTab(CreativeTabMF.tabGadget); - this.skill = skill; - this.name = name; - } + public ItemSkillBook(String name, Skill skill) { + super(name, 1); + setMaxStackSize(16); + setTextureName("minefantasy2:Other/" + name); + this.setCreativeTab(CreativeTabMF.tabGadget); + this.skill = skill; + this.name = name; + } - public Item setMax() { - isMax = true; - return setMaxStackSize(1); - } + public Item setMax() { + isMax = true; + return setMaxStackSize(1); + } - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - if (isMax) { - list.add(StatCollector.translateToLocal("item." + name + ".desc")); - } else { - list.add(StatCollector.translateToLocalFormatted("item." + name + ".desc", 1)); - } - } + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + if (isMax) { + list.add(StatCollector.translateToLocal("item." + name + ".desc")); + } else { + list.add(StatCollector.translateToLocalFormatted("item." + name + ".desc", 1)); + } + } - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - boolean used = false; - if (skill != null) { - int lvl = RPGElements.getLevel(user, skill); - if (lvl < skill.getMaxLevel()) { - if (isMax) { - skill.manualLvlUp(user, 100); - } else { - skill.addXP(user, world.rand.nextInt(skill.getLvlXP(lvl, user))); - } - used = true; - } - } - if (used) { - user.worldObj.playSoundEffect(user.posX, user.posY, user.posZ, "minefantasy2:updateResearch", 1.0F, 1.0F); - if (!user.capabilities.isCreativeMode) { - --item.stackSize; - } - } - return item; - } + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + boolean used = false; + if (skill != null) { + int lvl = RPGElements.getLevel(user, skill); + if (lvl < skill.getMaxLevel()) { + if (isMax) { + skill.manualLvlUp(user, 100); + } else { + skill.addXP(user, world.rand.nextInt(skill.getLvlXP(lvl, user))); + } + used = true; + } + } + if (used) { + user.worldObj.playSoundEffect(user.posX, user.posY, user.posZ, "minefantasy2:updateResearch", 1.0F, 1.0F); + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + } + return item; + } - @Override - public EnumRarity getRarity(ItemStack item) { - return isMax ? EnumRarity.epic : EnumRarity.uncommon; - } + @Override + public EnumRarity getRarity(ItemStack item) { + return isMax ? EnumRarity.epic : EnumRarity.uncommon; + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemSpecialDesign.java b/src/main/java/minefantasy/mf2/item/ItemSpecialDesign.java index bda11d53..833e4fd1 100644 --- a/src/main/java/minefantasy/mf2/item/ItemSpecialDesign.java +++ b/src/main/java/minefantasy/mf2/item/ItemSpecialDesign.java @@ -4,16 +4,16 @@ import net.minecraft.item.ItemStack; public class ItemSpecialDesign extends ItemComponentMF implements ISpecialCraftItem { - private String design; + private String design; - public ItemSpecialDesign(String name, int rarity, String design) { - super(name, rarity); - this.design = design; - } + public ItemSpecialDesign(String name, int rarity, String design) { + super(name, rarity); + this.design = design; + } - @Override - public String getDesign(ItemStack item) { - return this.design; - } + @Override + public String getDesign(ItemStack item) { + return this.design; + } } diff --git a/src/main/java/minefantasy/mf2/item/ItemWorldGenPlacer.java b/src/main/java/minefantasy/mf2/item/ItemWorldGenPlacer.java index c3c4ebbb..75667ab0 100644 --- a/src/main/java/minefantasy/mf2/item/ItemWorldGenPlacer.java +++ b/src/main/java/minefantasy/mf2/item/ItemWorldGenPlacer.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -20,105 +18,107 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.List; + public class ItemWorldGenPlacer extends Item { - private static final String[] types = new String[] { "AncientForge", "AncientAlter", "DwarvenStronghold" }; - public IIcon[] icons; - - public ItemWorldGenPlacer() { - this.setCreativeTab(CreativeTabs.tabMisc); - GameRegistry.registerItem(this, "PlaceWorldGenMF", MineFantasyII.MODID); - this.setHasSubtypes(true); - } - - @Override - public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int side, - float offsetX, float offsetY, float offsetZ) { - if (side == 0) { - --y; - } - - if (side == 1) { - ++y; - } - - if (side == 2) { - --z; - } - - if (side == 3) { - ++z; - } - - if (side == 4) { - --x; - } - - if (side == 5) { - ++x; - } - - if (!user.canPlayerEdit(x, y, z, side, item)) { - return false; - } else { - if (!world.isRemote) { - WorldGenStructureBase wg = getWorldGen(item.getItemDamage()); - if (wg instanceof WorldGenDwarvenStronghold) { - WorldGenDwarvenStronghold ds = (WorldGenDwarvenStronghold) wg; - MFLogUtil.logDebug("DS: Try Cliff Build"); - if (!ds.generate(world, itemRand, x, y, z)) { - MFLogUtil.logDebug("Failed... DS: Try Surface Build"); - ds.setSurfaceMode(true); - if (ds.generate(world, itemRand, x, y, z)) { - MFLogUtil.logDebug("Success... DS: Placed Surface Build"); - } else { - MFLogUtil.logDebug("Failed... DS: No Build Placed"); - } - } else { - MFLogUtil.logDebug("Success... DS: Placed Cliff Build"); - } - } else { - wg.generate(world, itemRand, x, y, z); - } - } - return true; - } - } - - @Override - public String getItemStackDisplayName(ItemStack item) { - int d = MathHelper.clamp_int(item.getItemDamage(), 0, types.length - 1); - return "World Gen " + types[d]; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs tab, List list) { - for (int id = 0; id < types.length; id++) - list.add(new ItemStack(item, 1, id)); - } - - private WorldGenStructureBase getWorldGen(int meta) { - if (meta == 1) { - return new WorldGenAncientAlter(); - } - if (meta == 2) { - return new WorldGenDwarvenStronghold(); - } - return new WorldGenAncientForge(); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int d) { - return icons[Math.min(icons.length - 1, d)]; - } - - @SideOnly(Side.CLIENT) - @Override - public void registerIcons(IIconRegister reg) { - icons = new IIcon[types.length]; - for (int i = 0; i < types.length; i++) { - icons[i] = reg.registerIcon("minefantasy2:Other/generate_" + types[i]); - } - } + private static final String[] types = new String[]{"AncientForge", "AncientAlter", "DwarvenStronghold"}; + public IIcon[] icons; + + public ItemWorldGenPlacer() { + this.setCreativeTab(CreativeTabs.tabMisc); + GameRegistry.registerItem(this, "PlaceWorldGenMF", MineFantasyII.MODID); + this.setHasSubtypes(true); + } + + @Override + public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int side, + float offsetX, float offsetY, float offsetZ) { + if (side == 0) { + --y; + } + + if (side == 1) { + ++y; + } + + if (side == 2) { + --z; + } + + if (side == 3) { + ++z; + } + + if (side == 4) { + --x; + } + + if (side == 5) { + ++x; + } + + if (!user.canPlayerEdit(x, y, z, side, item)) { + return false; + } else { + if (!world.isRemote) { + WorldGenStructureBase wg = getWorldGen(item.getItemDamage()); + if (wg instanceof WorldGenDwarvenStronghold) { + WorldGenDwarvenStronghold ds = (WorldGenDwarvenStronghold) wg; + MFLogUtil.logDebug("DS: Try Cliff Build"); + if (!ds.generate(world, itemRand, x, y, z)) { + MFLogUtil.logDebug("Failed... DS: Try Surface Build"); + ds.setSurfaceMode(true); + if (ds.generate(world, itemRand, x, y, z)) { + MFLogUtil.logDebug("Success... DS: Placed Surface Build"); + } else { + MFLogUtil.logDebug("Failed... DS: No Build Placed"); + } + } else { + MFLogUtil.logDebug("Success... DS: Placed Cliff Build"); + } + } else { + wg.generate(world, itemRand, x, y, z); + } + } + return true; + } + } + + @Override + public String getItemStackDisplayName(ItemStack item) { + int d = MathHelper.clamp_int(item.getItemDamage(), 0, types.length - 1); + return "World Gen " + types[d]; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int id = 0; id < types.length; id++) + list.add(new ItemStack(item, 1, id)); + } + + private WorldGenStructureBase getWorldGen(int meta) { + if (meta == 1) { + return new WorldGenAncientAlter(); + } + if (meta == 2) { + return new WorldGenDwarvenStronghold(); + } + return new WorldGenAncientForge(); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int d) { + return icons[Math.min(icons.length - 1, d)]; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IIconRegister reg) { + icons = new IIcon[types.length]; + for (int i = 0; i < types.length; i++) { + icons[i] = reg.registerIcon("minefantasy2:Other/generate_" + types[i]); + } + } } diff --git a/src/main/java/minefantasy/mf2/item/archery/ArrowFireFlint.java b/src/main/java/minefantasy/mf2/item/archery/ArrowFireFlint.java index 639b00d0..d009e70c 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ArrowFireFlint.java +++ b/src/main/java/minefantasy/mf2/item/archery/ArrowFireFlint.java @@ -15,55 +15,55 @@ */ public class ArrowFireFlint implements IArrowHandler { - @Override - public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, - boolean infinite) { - if (infinite || arrow.getItem() != Items.arrow) { - return false; - } - float maxCharge = 20F; - if (bow != null && bow.getItem() instanceof ISpecialBow) { - maxCharge = ((ISpecialBow) bow.getItem()).getMaxCharge(); - } - float firepower = charge / maxCharge; + @Override + public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, + boolean infinite) { + if (infinite || arrow.getItem() != Items.arrow) { + return false; + } + float maxCharge = 20F; + if (bow != null && bow.getItem() instanceof ISpecialBow) { + maxCharge = ((ISpecialBow) bow.getItem()).getMaxCharge(); + } + float firepower = charge / maxCharge; - if (firepower < 0.1D) { - return false; - } - if (firepower > 1.0F) { - firepower = 1.0F; - } + if (firepower < 0.1D) { + return false; + } + if (firepower > 1.0F) { + firepower = 1.0F; + } - EntityArrow entArrow = new EntityArrow(world, user, firepower * 2.0F); + EntityArrow entArrow = new EntityArrow(world, user, firepower * 2.0F); - int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); + int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); - if (var9 > 0) { - entArrow.setDamage(entArrow.getDamage() + var9 * 0.5D + 0.5D); - } + if (var9 > 0) { + entArrow.setDamage(entArrow.getDamage() + var9 * 0.5D + 0.5D); + } - int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); + int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); - if (var10 > 0) { - entArrow.setKnockbackStrength(var10); - } + if (var10 > 0) { + entArrow.setKnockbackStrength(var10); + } - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) { - entArrow.setFire(100); - } + if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) { + entArrow.setFire(100); + } - if (infinite) { - entArrow.canBePickedUp = 2; - } + if (infinite) { + entArrow.canBePickedUp = 2; + } - if (bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) { - entArrow = (EntityArrow) ((ISpecialBow) bow.getItem()).modifyArrow(bow, entArrow); - } - if (!world.isRemote) { - world.spawnEntityInWorld(entArrow); - } + if (bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) { + entArrow = (EntityArrow) ((ISpecialBow) bow.getItem()).modifyArrow(bow, entArrow); + } + if (!world.isRemote) { + world.spawnEntityInWorld(entArrow); + } - return true; - } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/item/archery/ArrowFirerMF.java b/src/main/java/minefantasy/mf2/item/archery/ArrowFirerMF.java index 0af44234..2e69f24c 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ArrowFirerMF.java +++ b/src/main/java/minefantasy/mf2/item/archery/ArrowFirerMF.java @@ -14,62 +14,62 @@ */ public class ArrowFirerMF implements IArrowHandler { - @Override - public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, - boolean infinite) { - if (arrow == null || !(arrow.getItem() instanceof ItemArrowMF)) { - return false; - } + @Override + public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, + boolean infinite) { + if (arrow == null || !(arrow.getItem() instanceof ItemArrowMF)) { + return false; + } - float maxCharge = 20F; - if (bow != null && bow.getItem() instanceof ISpecialBow) { - // maxCharge = ((ISpecialBow)bow.getItem()).getMaxCharge(); - } else { - return false; - } - float firepower = charge / maxCharge * 20F; + float maxCharge = 20F; + if (bow != null && bow.getItem() instanceof ISpecialBow) { + // maxCharge = ((ISpecialBow)bow.getItem()).getMaxCharge(); + } else { + return false; + } + float firepower = charge / maxCharge * 20F; - if (firepower < 0.1D) { - return false; - } - if (firepower > 1.0F) { - firepower = 1.0F; - } + if (firepower < 0.1D) { + return false; + } + if (firepower > 1.0F) { + firepower = 1.0F; + } - ItemArrowMF ammo = (ItemArrowMF) arrow.getItem(); - float spread = 1.0F; - if (bow != null && bow.getItem() instanceof ISpecialBow) { - firepower *= ((ISpecialBow) bow.getItem()).getRange(bow); - spread = ((ISpecialBow) bow.getItem()).getSpread(bow); - } + ItemArrowMF ammo = (ItemArrowMF) arrow.getItem(); + float spread = 1.0F; + if (bow != null && bow.getItem() instanceof ISpecialBow) { + firepower *= ((ISpecialBow) bow.getItem()).getRange(bow); + spread = ((ISpecialBow) bow.getItem()).getSpread(bow); + } - EntityArrowMF entArrow = ammo.getFiredArrow(new EntityArrowMF(world, user, spread, firepower * 2.0F), arrow); + EntityArrowMF entArrow = ammo.getFiredArrow(new EntityArrowMF(world, user, spread, firepower * 2.0F), arrow); - int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); - entArrow.setPower(1 + (0.25F * var9)); + int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); + entArrow.setPower(1 + (0.25F * var9)); - int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); + int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); - if (var10 > 0) { - entArrow.setKnockbackStrength(var10); - } + if (var10 > 0) { + entArrow.setKnockbackStrength(var10); + } - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) { - entArrow.setFire(100); - } + if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) { + entArrow.setFire(100); + } - if (infinite) { - entArrow.canBePickedUp = 2; - } + if (infinite) { + entArrow.canBePickedUp = 2; + } - if (bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) { - entArrow = (EntityArrowMF) ((ISpecialBow) bow.getItem()).modifyArrow(bow, entArrow); - } - if (!world.isRemote) { - world.spawnEntityInWorld(entArrow); - } + if (bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) { + entArrow = (EntityArrowMF) ((ISpecialBow) bow.getItem()).modifyArrow(bow, entArrow); + } + if (!world.isRemote) { + world.spawnEntityInWorld(entArrow); + } - return true; - } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/item/archery/ArrowType.java b/src/main/java/minefantasy/mf2/item/archery/ArrowType.java index 81692f04..37924d40 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ArrowType.java +++ b/src/main/java/minefantasy/mf2/item/archery/ArrowType.java @@ -3,46 +3,41 @@ import java.util.HashMap; public class ArrowType { - public static HashMap arrowMap = new HashMap(); - public final float weightModifier; - public final float damageModifier; - public final float velocity; - public final String name; - public float[] ratio = new float[] { 0F, 0F, 1F }; + public static HashMap arrowMap = new HashMap(); + public static ArrowType BOLT = new ArrowType("bolt", 1.50F, 1.50F, 1.50F).setRatio(0F, 1F, 0F);// Crossbow Bolt + public static ArrowType EXPLOSIVEBOLT = new ArrowType("explosivebolt", 1.50F, 1.50F, 0.25F).setRatio(0F, 0F, 1F);// Blunt + public static ArrowType NORMAL = new ArrowType("normal", 1.00F, 1.00F, 1.00F).setRatio(1F, 3F, 0F);// Some cut, most + // pierce + public static ArrowType BODKIN = new ArrowType("bodkin", 1.50F, 0.65F, 0.75F).setRatio(0F, 1F, 0F);// Pure piercing + public static ArrowType BROADHEAD = new ArrowType("broad", 0.80F, 1.20F, 1.50F).setRatio(1F, 2F, 0F);// More cutting + // than + // normal + public static ArrowType EXPLOSIVE = new ArrowType("explosive", 1.0F, 1.50F, 0.25F).setRatio(0F, 0F, 1F);// Blunt + public final float weightModifier; + public final float damageModifier; + public final float velocity; + public final String name; + public float[] ratio = new float[]{0F, 0F, 1F}; - public static ArrowType BOLT = new ArrowType("bolt", 1.50F, 1.50F, 1.50F).setRatio(0F, 1F, 0F);// Crossbow Bolt - public static ArrowType EXPLOSIVEBOLT = new ArrowType("explosivebolt", 1.50F, 1.50F, 0.25F).setRatio(0F, 0F, 1F);// Blunt + public ArrowType(String name, float velocity, float weightModifier, float damageModifier) { + this.name = name; + this.velocity = velocity; + this.weightModifier = weightModifier; + this.damageModifier = damageModifier; + arrowMap.put(name, this); + } - public static ArrowType NORMAL = new ArrowType("normal", 1.00F, 1.00F, 1.00F).setRatio(1F, 3F, 0F);// Some cut, most - // pierce - public static ArrowType BODKIN = new ArrowType("bodkin", 1.50F, 0.65F, 0.75F).setRatio(0F, 1F, 0F);// Pure piercing - public static ArrowType BROADHEAD = new ArrowType("broad", 0.80F, 1.20F, 1.50F).setRatio(1F, 2F, 0F);// More cutting - // than - // normal - public static ArrowType EXPLOSIVE = new ArrowType("explosive", 1.0F, 1.50F, 0.25F).setRatio(0F, 0F, 1F);// Blunt - - public ArrowType(String name, float velocity, float weightModifier, float damageModifier) { - this.name = name; - this.velocity = velocity; - this.weightModifier = weightModifier; - this.damageModifier = damageModifier; - arrowMap.put(name, this); - } - - /** - * Sets up a ratio system for damage values - * - * @param cutting - * the amount cutting damage - * @param piercing - * the amount piercing damage - * @param blunt - * the amount blunt damage - * @return - */ - public ArrowType setRatio(float cutting, float piercing, float blunt) { - ratio = new float[] { cutting, blunt, piercing }; - return this; - } + /** + * Sets up a ratio system for damage values + * + * @param cutting the amount cutting damage + * @param piercing the amount piercing damage + * @param blunt the amount blunt damage + * @return + */ + public ArrowType setRatio(float cutting, float piercing, float blunt) { + ratio = new float[]{cutting, blunt, piercing}; + return this; + } } diff --git a/src/main/java/minefantasy/mf2/item/archery/EnumBowType.java b/src/main/java/minefantasy/mf2/item/archery/EnumBowType.java index c76390db..5b692327 100644 --- a/src/main/java/minefantasy/mf2/item/archery/EnumBowType.java +++ b/src/main/java/minefantasy/mf2/item/archery/EnumBowType.java @@ -1,36 +1,32 @@ package minefantasy.mf2.item.archery; public enum EnumBowType { - /** - * Standard bow Reinforced with metal - */ - SHORTBOW(1.0F, 1.0F, 1.0F, 1.0F, 1.0F), - /** - * Larger varient, more power - */ - LONGBOW(1.0F, 1.5F, 1.0F, 1.5F, 0.5F); + /** + * Standard bow Reinforced with metal + */ + SHORTBOW(1.0F, 1.0F, 1.0F, 1.0F, 1.0F), + /** + * Larger varient, more power + */ + LONGBOW(1.0F, 1.5F, 1.0F, 1.5F, 0.5F); - public final float damageModifier; - public final float velocity; - public final float spread; - public final float chargeTime; - public final float durabilityModifier; + public final float damageModifier; + public final float velocity; + public final float spread; + public final float chargeTime; + public final float durabilityModifier; - /** - * @param dam - * modifes damage (1.0=normal) - * @param time - * is how many seconds until it reaches full charge - * @param durability - * modifies the durability (1.0=normal) - * @param velocity - * modifies the speed of the fired projectile - */ - private EnumBowType(float dam, float time, float durability, float velocity, float spread) { - this.damageModifier = dam; - this.chargeTime = time * 20F; - this.durabilityModifier = durability; - this.velocity = velocity; - this.spread = spread; - } + /** + * @param dam modifes damage (1.0=normal) + * @param time is how many seconds until it reaches full charge + * @param durability modifies the durability (1.0=normal) + * @param velocity modifies the speed of the fired projectile + */ + private EnumBowType(float dam, float time, float durability, float velocity, float spread) { + this.damageModifier = dam; + this.chargeTime = time * 20F; + this.durabilityModifier = durability; + this.velocity = velocity; + this.spread = spread; + } } diff --git a/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java b/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java index 95eb98e5..89d80424 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java +++ b/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java @@ -1,10 +1,5 @@ package minefantasy.mf2.item.archery; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -31,224 +26,225 @@ import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemArrowMF extends Item implements IArrowMF, IAmmo { - protected float damage; - protected String arrowName; - protected ArrowType design; - private ToolMaterial arrowMat; - public static final DecimalFormat decimal_format = new DecimalFormat("#.##"); - public static final MFArrowDispenser dispenser = new MFArrowDispenser(); - - public ItemArrowMF(String name, ArrowType type, int stackSize) { - this(name, 0, ToolMaterial.WOOD, type); - setMaxStackSize(stackSize); - } - - public ItemArrowMF(String name, ArrowType type) { - this(name, 0, ToolMaterial.WOOD, type); - } - - public ItemArrowMF(String name) { - this(name, 0, ToolMaterial.WOOD); - } - - public ItemArrowMF(String name, int rarity, ToolMaterial material) { - this(name, rarity, material, ArrowType.NORMAL); - } - - public ItemArrowMF(String name, int rarity, ToolMaterial material, ArrowType type) { - name = convertName(name); - material = convertMaterial(material); - - super.setUnlocalizedName((type == ArrowType.EXPLOSIVE || type == ArrowType.EXPLOSIVEBOLT) ? name - : type == ArrowType.BOLT ? (name + "_bolt") : (name + "_arrow")); - name = getName(name, type); - design = type; - arrowName = name; - arrowMat = material; - damage = (3 + material.getDamageVsEntity()) * type.damageModifier; - if (type == ArrowType.EXPLOSIVE || type == ArrowType.EXPLOSIVEBOLT) { - damage = 1; - } - itemRarity = rarity; - setTextureName("minefantasy2:Ammo/" + name); - setCreativeTab(CreativeTabMF.tabOldTools); - GameRegistry.registerItem(this, "MF_Com_" + name, MineFantasyII.MODID); - - AmmoMechanicsMF.addArrow(new ItemStack(this)); - QuiverArrowRegistry.addArrowToRegistry(new ItemStack(this), null); - BlockDispenser.dispenseBehaviorRegistry.putObject(this, dispenser); - } - - private ToolMaterial convertMaterial(ToolMaterial material) { - if (material == BaseMaterialMF.getMaterial("ornate").getToolConversion()) { - return BaseMaterialMF.getMaterial("silver").getToolConversion(); - } - return material; - } - - private String convertName(String name) { - if (name.equalsIgnoreCase("ornate")) { - return "silver"; - } - return name; - } - - private String getName(String mat, ArrowType type) { - if (type == ArrowType.EXPLOSIVE) { - return "exploding_arrow"; - } - if (type == ArrowType.EXPLOSIVEBOLT) { - return "exploding_bolt"; - } - if (type.name.equalsIgnoreCase("normal")) { - return mat + "_arrow"; - } - if (type.name.equalsIgnoreCase("bolt")) { - return mat + "_bolt"; - } - return mat + "_arrow_" + type.name.toLowerCase(); - } - - public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) { - instance.modifyVelocity(design.velocity); - return instance.setArrow(arrow).setArrowTex(arrowName); - } - - @Override - public void onHitEntity(Entity arrowInstance, Entity shooter, Entity hit, float damage) { - if (arrowMat == BaseMaterialMF.getMaterial("dragonforge").getToolConversion()) { - hit.setFire((int) (damage * (arrowInstance.isBurning() ? 2.0F : 1.0F))); - } - } - - public ItemArrowMF setAmmoType(String type) { - ammoType = type; - return this; - } - - private String ammoType = "arrow"; - - @Override - public String getAmmoType(ItemStack arrow) { - return ammoType; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemArrowMF setCustom(String designType) { - canRepair = false; - setTextureName("minefantasy2:custom/ammo/" + designType + "/" + arrowName); - isCustom = true; - return this; - } - - @Override - public float getDamageModifier(ItemStack arrow) { - return (4F + CustomToolHelper.getMeleeDamage(arrow, damage)) * design.damageModifier; - } - - @Override - public float getGravityModifier(ItemStack arrow) { - float weight = 1.0F * design.weightModifier; - return CustomToolHelper.getWeightModifier(arrow, weight); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @SideOnly(Side.CLIENT) - private IIcon detailTex; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - } - super.registerIcons(reg); - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass > 0 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - int c = CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - - return c; - } - - public ItemStack construct(String main) { - return CustomToolHelper.construct(this, main, null); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name)); - } - } - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.arrowPower.name") + ": " - + decimal_format.format(getDamageModifier(item))); - } - - @Override - public String getItemStackDisplayName(ItemStack item) { - String name = ("" + StatCollector.translateToLocal(this.getUnlocalizedNameInefficiently(item) + ".name")) - .trim(); - - if (isCustom) - name = CustomToolHelper.getLocalisedName(item, name); - - if (design != ArrowType.NORMAL && design != ArrowType.EXPLOSIVE && design != ArrowType.BOLT - && design != ArrowType.EXPLOSIVEBOLT) { - name += " (" + StatCollector.translateToLocal("arrow.head." + design.name.toLowerCase() + ".name") + ")"; - } - - return name; - } - - @Override - public float getBreakChance(Entity entityArrow, ItemStack arrow) { - int maxUses = CustomToolHelper.getMaxDamage(arrow, arrowMat.getMaxUses()); - return 1F / (maxUses / 150); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - // ====================================================== CUSTOM END - // ==============================================================\\ + public static final DecimalFormat decimal_format = new DecimalFormat("#.##"); + public static final MFArrowDispenser dispenser = new MFArrowDispenser(); + protected float damage; + protected String arrowName; + protected ArrowType design; + protected int itemRarity; + private ToolMaterial arrowMat; + private String ammoType = "arrow"; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + @SideOnly(Side.CLIENT) + private IIcon detailTex; + + public ItemArrowMF(String name, ArrowType type, int stackSize) { + this(name, 0, ToolMaterial.WOOD, type); + setMaxStackSize(stackSize); + } + + public ItemArrowMF(String name, ArrowType type) { + this(name, 0, ToolMaterial.WOOD, type); + } + + public ItemArrowMF(String name) { + this(name, 0, ToolMaterial.WOOD); + } + + public ItemArrowMF(String name, int rarity, ToolMaterial material) { + this(name, rarity, material, ArrowType.NORMAL); + } + + public ItemArrowMF(String name, int rarity, ToolMaterial material, ArrowType type) { + name = convertName(name); + material = convertMaterial(material); + + super.setUnlocalizedName((type == ArrowType.EXPLOSIVE || type == ArrowType.EXPLOSIVEBOLT) ? name + : type == ArrowType.BOLT ? (name + "_bolt") : (name + "_arrow")); + name = getName(name, type); + design = type; + arrowName = name; + arrowMat = material; + damage = (3 + material.getDamageVsEntity()) * type.damageModifier; + if (type == ArrowType.EXPLOSIVE || type == ArrowType.EXPLOSIVEBOLT) { + damage = 1; + } + itemRarity = rarity; + setTextureName("minefantasy2:Ammo/" + name); + setCreativeTab(CreativeTabMF.tabOldTools); + GameRegistry.registerItem(this, "MF_Com_" + name, MineFantasyII.MODID); + + AmmoMechanicsMF.addArrow(new ItemStack(this)); + QuiverArrowRegistry.addArrowToRegistry(new ItemStack(this), null); + BlockDispenser.dispenseBehaviorRegistry.putObject(this, dispenser); + } + + private ToolMaterial convertMaterial(ToolMaterial material) { + if (material == BaseMaterialMF.getMaterial("ornate").getToolConversion()) { + return BaseMaterialMF.getMaterial("silver").getToolConversion(); + } + return material; + } + + private String convertName(String name) { + if (name.equalsIgnoreCase("ornate")) { + return "silver"; + } + return name; + } + + private String getName(String mat, ArrowType type) { + if (type == ArrowType.EXPLOSIVE) { + return "exploding_arrow"; + } + if (type == ArrowType.EXPLOSIVEBOLT) { + return "exploding_bolt"; + } + if (type.name.equalsIgnoreCase("normal")) { + return mat + "_arrow"; + } + if (type.name.equalsIgnoreCase("bolt")) { + return mat + "_bolt"; + } + return mat + "_arrow_" + type.name.toLowerCase(); + } + + public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) { + instance.modifyVelocity(design.velocity); + return instance.setArrow(arrow).setArrowTex(arrowName); + } + + @Override + public void onHitEntity(Entity arrowInstance, Entity shooter, Entity hit, float damage) { + if (arrowMat == BaseMaterialMF.getMaterial("dragonforge").getToolConversion()) { + hit.setFire((int) (damage * (arrowInstance.isBurning() ? 2.0F : 1.0F))); + } + } + + public ItemArrowMF setAmmoType(String type) { + ammoType = type; + return this; + } + + @Override + public String getAmmoType(ItemStack arrow) { + return ammoType; + } + + public ItemArrowMF setCustom(String designType) { + canRepair = false; + setTextureName("minefantasy2:custom/ammo/" + designType + "/" + arrowName); + isCustom = true; + return this; + } + + @Override + public float getDamageModifier(ItemStack arrow) { + return (4F + CustomToolHelper.getMeleeDamage(arrow, damage)) * design.damageModifier; + } + + @Override + public float getGravityModifier(ItemStack arrow) { + float weight = 1.0F * design.weightModifier; + return CustomToolHelper.getWeightModifier(arrow, weight); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass > 0 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + int c = CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + + return c; + } + + public ItemStack construct(String main) { + return CustomToolHelper.construct(this, main, null); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name)); + } + } + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.arrowPower.name") + ": " + + decimal_format.format(getDamageModifier(item))); + } + + @Override + public String getItemStackDisplayName(ItemStack item) { + String name = ("" + StatCollector.translateToLocal(this.getUnlocalizedNameInefficiently(item) + ".name")) + .trim(); + + if (isCustom) + name = CustomToolHelper.getLocalisedName(item, name); + + if (design != ArrowType.NORMAL && design != ArrowType.EXPLOSIVE && design != ArrowType.BOLT + && design != ArrowType.EXPLOSIVEBOLT) { + name += " (" + StatCollector.translateToLocal("arrow.head." + design.name.toLowerCase() + ".name") + ")"; + } + + return name; + } + + @Override + public float getBreakChance(Entity entityArrow, ItemStack arrow) { + int maxUses = CustomToolHelper.getMaxDamage(arrow, arrowMat.getMaxUses()); + return 1F / (maxUses / 150); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java b/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java index df5b8322..899adb0c 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java +++ b/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java @@ -1,19 +1,10 @@ package minefantasy.mf2.item.archery; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.api.archery.AmmoMechanicsMF; -import minefantasy.mf2.api.archery.IAmmo; -import minefantasy.mf2.api.archery.IDisplayMFAmmo; -import minefantasy.mf2.api.archery.IFirearm; -import minefantasy.mf2.api.archery.ISpecialBow; +import minefantasy.mf2.api.archery.*; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.item.list.CreativeTabMF; @@ -27,11 +18,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.init.Items; -import net.minecraft.item.EnumAction; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBow; -import net.minecraft.item.ItemStack; +import net.minecraft.item.*; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; @@ -42,456 +29,457 @@ import net.minecraftforge.event.entity.player.ArrowNockEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + public class ItemBowMF extends ItemBow implements ISpecialBow, IDisplayMFAmmo, IBattlegearWeapon, IFirearm { - public static final DecimalFormat decimal_format = new DecimalFormat("#.##"); - private final EnumBowType model; - private int itemRarity; - private float baseDamage = 1.0F; - private String name; - - public ItemBowMF(String name, EnumBowType type) { - this(name, ToolMaterial.WOOD, type, 0); - } - - public ItemBowMF(String name, ToolMaterial mat, EnumBowType type, int rarity) { - this(name, (int) (mat.getMaxUses() * type.durabilityModifier), type, mat.getDamageVsEntity(), rarity); - this.enchantmentLvl = mat.getEnchantability(); - } - - private ItemBowMF(String name, int dura, EnumBowType type, float damage, int rarity) { - this.name = name; - this.baseDamage = damage; - model = type; - this.maxStackSize = 1; - this.setMaxDamage(dura); - itemRarity = rarity; - setTextureName("minefantasy2:Bow/" + name); - this.setUnlocalizedName(name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - setCreativeTab(CreativeTabMF.tabOldTools); - } - - @Override - @SideOnly(Side.CLIENT) - /** - * Returns True is the item is renderer in full 3D when hold. - */ - public boolean isFull3D() { - return true; - } - - /** - * called when the player releases the use item button. Args: itemstack, world, - * entityplayer, itemInUseCount - */ - @Override - public void onPlayerStoppedUsing(ItemStack item, World world, EntityPlayer player, int time) { - int power = (this.getMaxItemUseDuration(item) - time); - - ArrowLooseEvent event = new ArrowLooseEvent(player, item, power); - MinecraftForge.EVENT_BUS.post(event); - - if (event.isCanceled()) { - return; - } - boolean var5 = player.capabilities.isCreativeMode - || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, item) > 0; - power = event.charge; - - if (var5 || player.inventory.hasItem(Items.arrow)) { - float firepower = power / model.chargeTime; - - if (firepower < 0.1D) { - return; - } - if (firepower > 1.0F) { - firepower = 1.0F; - } - - EntityArrow var8 = new EntityArrow(world, player, firepower * 2.0F); - - if (firepower == 1.0F) { - var8.setIsCritical(true); - } - - int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, item); - - if (var9 > 0) { - var8.setDamage(var8.getDamage() + var9 * 0.5D + 0.5D); - } - - int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, item); - - if (var10 > 0) { - var8.setKnockbackStrength(var10); - } - - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, item) > 0) { - var8.setFire(100); - } - - AmmoMechanicsMF.damageContainer(item, player, 1); - world.playSoundAtEntity(player, "minefantasy2:weapon.bowFire", 1.0F, - 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + firepower * 0.5F); - - if (var5) { - var8.canBePickedUp = 2; - } else { - player.inventory.consumeInventoryItem(Items.arrow); - } - var8 = (EntityArrow) modifyArrow(item, var8); - - if (!world.isRemote) { - world.spawnEntityInWorld(var8); - } - } - } - - public ItemStack onFoodEaten(ItemStack item, World world, EntityPlayer player) { - return item; - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack item) { - return 72000; - } - - /** - * returns the action that specifies what animation to play when the items is - * being used - */ - @Override - public EnumAction getItemUseAction(ItemStack item) { - return EnumAction.bow; - } - - @Override - public void addInformation(ItemStack item, EntityPlayer player, List desc, boolean flag) { - super.addInformation(item, player, desc, flag); - - CustomToolHelper.addBowInformation(item, desc); - ItemStack ammo = AmmoMechanicsMF.getAmmo(item); - if (ammo != null) { - desc.add(EnumChatFormatting.DARK_GRAY + ammo.getDisplayName() + " x" + ammo.stackSize); - } - - desc.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.bowPower.name", - decimal_format.format(getBowDamage(item)))); - } - - /** - * Called whenever this item is equipped and the right mouse button is pressed. - * Args: itemStack, world, entityPlayer - */ - @Override - /// Item is the bow. - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { - - if (!world.isRemote && player.isSneaking() || AmmoMechanicsMF.isDepleted(item)) { - reloadBow(item, player); - return item; - } - ArrowNockEvent event = new ArrowNockEvent(player, item); - MinecraftForge.EVENT_BUS.post(event); - if (event.isCanceled()) { - return event.result; - } - return item; - - // player.inventory.hasItem(Items.arrow) - } - - public boolean canAccept(ItemStack ammo) { - String ammoType = "null"; - ItemStack weapon = new ItemStack(this); - if (ammo != null && ammo.getItem() instanceof IAmmo) { - ammoType = ((IAmmo) ammo.getItem()).getAmmoType(ammo); - } - - if (weapon != null && weapon.getItem() instanceof IFirearm) { - return ((IFirearm) weapon.getItem()).canAcceptAmmo(weapon, ammoType); - } - - return ammoType.equalsIgnoreCase("arrow"); - } - - private void reloadBow(ItemStack item, EntityPlayer player) { - player.openGui(MineFantasyII.instance, 1, player.worldObj, 1, 0, 0); - } - - /** - * Return the enchantability factor of the item, most of the time is based on - * material. - */ - private int enchantmentLvl = 1; - - @Override - public int getItemEnchantability() { - return enchantmentLvl; - } - - @Override - public void onUpdate(ItemStack item, World world, Entity entity, int i, boolean b) { - super.onUpdate(item, world, entity, i, b); - if (!item.hasTagCompound()) - item.setTagCompound(new NBTTagCompound()); - item.stackTagCompound.setInteger("Use", i); - } - - public int getDrawAmount(int timer) { - float maxCharge = this.getMaxCharge(); - if (timer > (maxCharge * 0.9F)) - return 2; - else if (timer > (maxCharge * 0.65F)) - return 1; - else if (timer > 0) - return 0; - - return -2; - } - - @Override - public EnumRarity getRarity(ItemStack item) { - int lvl = itemRarity; - - EnumRarity[] rarity = new EnumRarity[] { EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, - EnumRarity.epic }; - if (item.isItemEnchanted()) { - if (lvl == 0) { - lvl++; - } - lvl++; - } - if (lvl >= rarity.length) { - lvl = rarity.length - 1; - } - return rarity[lvl]; - } - - private EnumRarity rarity(ItemStack item, int lvl) { - EnumRarity[] rarity = new EnumRarity[] { EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, - EnumRarity.epic }; - if (item.isItemEnchanted()) { - if (lvl == 0) { - lvl++; - } - lvl++; - } - if (lvl >= rarity.length) { - lvl = rarity.length - 1; - } - return rarity[lvl]; - } - - @Override - public Entity modifyArrow(ItemStack bow, Entity arrow) { - if (this.isCustom) { - CustomMaterial custom = CustomToolHelper.getCustomPrimaryMaterial(bow); - if (custom != null) { - if (custom.name.equalsIgnoreCase("silver")) { - arrow.getEntityData().setBoolean("MF_Silverbow", true); - } - } - } - - float dam = getBowDamage(bow); - - arrow.getEntityData().setFloat("MF_Bow_Damage", dam); - arrow.getEntityData().setString("Design", designType); - - return arrow; - } - - public boolean canUseRenderer(ItemStack item) { - return true; - } - - private void addSet(List list, Item[] items) { - for (Item item : items) { - list.add(new ItemStack(item)); - } - } - - @Override - public boolean sheatheOnBack(ItemStack item) { - return true; - } - - @Override - public boolean isOffhandHandDual(ItemStack off) { - return false; - } - - @Override - public boolean offhandAttackEntity(OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) { - return false; - } - - @Override - public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { - return false; - } - - @Override - public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { - return false; - } - - @Override - public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem) { - } - - @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { - return false; - } - - @Override - public boolean canAcceptAmmo(ItemStack weapon, String ammo) { - return ammo.equalsIgnoreCase("arrow"); - } - - @Override - public int getAmmoCapacity(ItemStack item) { - return 1; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - private String designType = "standard"; - - public ItemBowMF setCustom(String designType) { - canRepair = false; - setTextureName("minefantasy2:custom/bow/" + designType + "/" + name); - isCustom = true; - this.designType = designType; - return this; - } - - public IIcon[] mainIcons = new IIcon[3]; - - public IIcon cus_metal_standby; - public IIcon[] cus_metal_pulling = new IIcon[3]; - public IIcon cus_wood_standby; - public IIcon[] cus_wood_pulling = new IIcon[3]; - public IIcon cus_detail_standby; - public IIcon[] cus_detail_pulling = new IIcon[3]; - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack stack, int pass) { - return getIcon(stack, pass, -1); - } - - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack bow, int layer, int pull) { - if (!isCustom) { - return pull >= 0 ? mainIcons[pull] : this.itemIcon; - } - - if (layer == 0) { - return pull >= 0 ? cus_metal_pulling[pull] : cus_metal_standby; - } - if (layer == 1) { - return pull >= 0 ? cus_wood_pulling[pull] : cus_wood_standby; - } else { - return pull >= 0 ? cus_detail_pulling[pull] : cus_detail_standby; - } - } - - @SideOnly(Side.CLIENT) - @Override - public void registerIcons(IIconRegister reg) { - this.itemIcon = reg.registerIcon(this.getIconString() + "_standby"); - for (int i = 0; i < 3; ++i) { - this.mainIcons[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i)); - } - - if (isCustom) { - this.cus_metal_standby = reg.registerIcon(this.getIconString() + "_standby"); - this.cus_wood_standby = reg.registerIcon(this.getIconString() + "_standby_haft"); - this.cus_detail_standby = reg.registerIcon(this.getIconString() + "_standby_detail"); - - for (int i = 0; i < 3; ++i) { - this.cus_metal_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i)); - this.cus_wood_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i) + "_haft"); - this.cus_detail_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i) + "_detail"); - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - int c = CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - return c; - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getWoodenLocalisedName(item, unlocalName); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList wood = CustomMaterial.getList("wood"); - Iterator iteratorWood = wood.iterator(); - while (iteratorWood.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct("Iron", customMat.name)); - } - } - return; - } - } - - public float getBowDamage(ItemStack item) { - return CustomToolHelper.getBowDamage(item, baseDamage) * model.damageModifier; - } - - @Override - public float getRange(ItemStack item) { - return model.velocity; - } - - @Override - public float getSpread(ItemStack item) { - return model.spread; - } - - // ====================================================== CUSTOM END - // ==============================================================\\ - @Override - public float getMaxCharge() { - return model.chargeTime; - } + public static final DecimalFormat decimal_format = new DecimalFormat("#.##"); + private final EnumBowType model; + public IIcon[] mainIcons = new IIcon[3]; + public IIcon cus_metal_standby; + public IIcon[] cus_metal_pulling = new IIcon[3]; + public IIcon cus_wood_standby; + public IIcon[] cus_wood_pulling = new IIcon[3]; + public IIcon cus_detail_standby; + public IIcon[] cus_detail_pulling = new IIcon[3]; + private int itemRarity; + private float baseDamage = 1.0F; + private String name; + /** + * Return the enchantability factor of the item, most of the time is based on + * material. + */ + private int enchantmentLvl = 1; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private String designType = "standard"; + + public ItemBowMF(String name, EnumBowType type) { + this(name, ToolMaterial.WOOD, type, 0); + } + + public ItemBowMF(String name, ToolMaterial mat, EnumBowType type, int rarity) { + this(name, (int) (mat.getMaxUses() * type.durabilityModifier), type, mat.getDamageVsEntity(), rarity); + this.enchantmentLvl = mat.getEnchantability(); + } + + private ItemBowMF(String name, int dura, EnumBowType type, float damage, int rarity) { + this.name = name; + this.baseDamage = damage; + model = type; + this.maxStackSize = 1; + this.setMaxDamage(dura); + itemRarity = rarity; + setTextureName("minefantasy2:Bow/" + name); + this.setUnlocalizedName(name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + setCreativeTab(CreativeTabMF.tabOldTools); + } + + @Override + @SideOnly(Side.CLIENT) + /** + * Returns True is the item is renderer in full 3D when hold. + */ + public boolean isFull3D() { + return true; + } + + /** + * called when the player releases the use item button. Args: itemstack, world, + * entityplayer, itemInUseCount + */ + @Override + public void onPlayerStoppedUsing(ItemStack item, World world, EntityPlayer player, int time) { + int power = (this.getMaxItemUseDuration(item) - time); + + ArrowLooseEvent event = new ArrowLooseEvent(player, item, power); + MinecraftForge.EVENT_BUS.post(event); + + if (event.isCanceled()) { + return; + } + boolean var5 = player.capabilities.isCreativeMode + || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, item) > 0; + power = event.charge; + + if (var5 || player.inventory.hasItem(Items.arrow)) { + float firepower = power / model.chargeTime; + + if (firepower < 0.1D) { + return; + } + if (firepower > 1.0F) { + firepower = 1.0F; + } + + EntityArrow var8 = new EntityArrow(world, player, firepower * 2.0F); + + if (firepower == 1.0F) { + var8.setIsCritical(true); + } + + int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, item); + + if (var9 > 0) { + var8.setDamage(var8.getDamage() + var9 * 0.5D + 0.5D); + } + + int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, item); + + if (var10 > 0) { + var8.setKnockbackStrength(var10); + } + + if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, item) > 0) { + var8.setFire(100); + } + + AmmoMechanicsMF.damageContainer(item, player, 1); + world.playSoundAtEntity(player, "minefantasy2:weapon.bowFire", 1.0F, + 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + firepower * 0.5F); + + if (var5) { + var8.canBePickedUp = 2; + } else { + player.inventory.consumeInventoryItem(Items.arrow); + } + var8 = (EntityArrow) modifyArrow(item, var8); + + if (!world.isRemote) { + world.spawnEntityInWorld(var8); + } + } + } + + public ItemStack onFoodEaten(ItemStack item, World world, EntityPlayer player) { + return item; + } + + /** + * How long it takes to use or consume an item + */ + @Override + public int getMaxItemUseDuration(ItemStack item) { + return 72000; + } + + /** + * returns the action that specifies what animation to play when the items is + * being used + */ + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.bow; + } + + @Override + public void addInformation(ItemStack item, EntityPlayer player, List desc, boolean flag) { + super.addInformation(item, player, desc, flag); + + CustomToolHelper.addBowInformation(item, desc); + ItemStack ammo = AmmoMechanicsMF.getAmmo(item); + if (ammo != null) { + desc.add(EnumChatFormatting.DARK_GRAY + ammo.getDisplayName() + " x" + ammo.stackSize); + } + + desc.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.bowPower.name", + decimal_format.format(getBowDamage(item)))); + } + + /** + * Called whenever this item is equipped and the right mouse button is pressed. + * Args: itemStack, world, entityPlayer + */ + @Override + /// Item is the bow. + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + + if (!world.isRemote && player.isSneaking() || AmmoMechanicsMF.isDepleted(item)) { + reloadBow(item, player); + return item; + } + ArrowNockEvent event = new ArrowNockEvent(player, item); + MinecraftForge.EVENT_BUS.post(event); + if (event.isCanceled()) { + return event.result; + } + return item; + + // player.inventory.hasItem(Items.arrow) + } + + public boolean canAccept(ItemStack ammo) { + String ammoType = "null"; + ItemStack weapon = new ItemStack(this); + if (ammo != null && ammo.getItem() instanceof IAmmo) { + ammoType = ((IAmmo) ammo.getItem()).getAmmoType(ammo); + } + + if (weapon != null && weapon.getItem() instanceof IFirearm) { + return ((IFirearm) weapon.getItem()).canAcceptAmmo(weapon, ammoType); + } + + return ammoType.equalsIgnoreCase("arrow"); + } + + private void reloadBow(ItemStack item, EntityPlayer player) { + player.openGui(MineFantasyII.instance, 1, player.worldObj, 1, 0, 0); + } + + @Override + public int getItemEnchantability() { + return enchantmentLvl; + } + + @Override + public void onUpdate(ItemStack item, World world, Entity entity, int i, boolean b) { + super.onUpdate(item, world, entity, i, b); + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + item.stackTagCompound.setInteger("Use", i); + } + + public int getDrawAmount(int timer) { + float maxCharge = this.getMaxCharge(); + if (timer > (maxCharge * 0.9F)) + return 2; + else if (timer > (maxCharge * 0.65F)) + return 1; + else if (timer > 0) + return 0; + + return -2; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = itemRarity; + + EnumRarity[] rarity = new EnumRarity[]{EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, + EnumRarity.epic}; + if (item.isItemEnchanted()) { + if (lvl == 0) { + lvl++; + } + lvl++; + } + if (lvl >= rarity.length) { + lvl = rarity.length - 1; + } + return rarity[lvl]; + } + + private EnumRarity rarity(ItemStack item, int lvl) { + EnumRarity[] rarity = new EnumRarity[]{EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, + EnumRarity.epic}; + if (item.isItemEnchanted()) { + if (lvl == 0) { + lvl++; + } + lvl++; + } + if (lvl >= rarity.length) { + lvl = rarity.length - 1; + } + return rarity[lvl]; + } + + @Override + public Entity modifyArrow(ItemStack bow, Entity arrow) { + if (this.isCustom) { + CustomMaterial custom = CustomToolHelper.getCustomPrimaryMaterial(bow); + if (custom != null) { + if (custom.name.equalsIgnoreCase("silver")) { + arrow.getEntityData().setBoolean("MF_Silverbow", true); + } + } + } + + float dam = getBowDamage(bow); + + arrow.getEntityData().setFloat("MF_Bow_Damage", dam); + arrow.getEntityData().setString("Design", designType); + + return arrow; + } + + public boolean canUseRenderer(ItemStack item) { + return true; + } + + private void addSet(List list, Item[] items) { + for (Item item : items) { + list.add(new ItemStack(item)); + } + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return true; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return false; + } + + @Override + public boolean offhandAttackEntity(OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) { + return false; + } + + @Override + public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { + return false; + } + + @Override + public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { + return false; + } + + @Override + public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem) { + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return false; + } + + @Override + public boolean canAcceptAmmo(ItemStack weapon, String ammo) { + return ammo.equalsIgnoreCase("arrow"); + } + + @Override + public int getAmmoCapacity(ItemStack item) { + return 1; + } + + public ItemBowMF setCustom(String designType) { + canRepair = false; + setTextureName("minefantasy2:custom/bow/" + designType + "/" + name); + isCustom = true; + this.designType = designType; + return this; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack stack, int pass) { + return getIcon(stack, pass, -1); + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack bow, int layer, int pull) { + if (!isCustom) { + return pull >= 0 ? mainIcons[pull] : this.itemIcon; + } + + if (layer == 0) { + return pull >= 0 ? cus_metal_pulling[pull] : cus_metal_standby; + } + if (layer == 1) { + return pull >= 0 ? cus_wood_pulling[pull] : cus_wood_standby; + } else { + return pull >= 0 ? cus_detail_pulling[pull] : cus_detail_standby; + } + } + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IIconRegister reg) { + this.itemIcon = reg.registerIcon(this.getIconString() + "_standby"); + for (int i = 0; i < 3; ++i) { + this.mainIcons[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i)); + } + + if (isCustom) { + this.cus_metal_standby = reg.registerIcon(this.getIconString() + "_standby"); + this.cus_wood_standby = reg.registerIcon(this.getIconString() + "_standby_haft"); + this.cus_detail_standby = reg.registerIcon(this.getIconString() + "_standby_detail"); + + for (int i = 0; i < 3; ++i) { + this.cus_metal_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i)); + this.cus_wood_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i) + "_haft"); + this.cus_detail_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i) + "_detail"); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + int c = CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + return c; + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getWoodenLocalisedName(item, unlocalName); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList wood = CustomMaterial.getList("wood"); + Iterator iteratorWood = wood.iterator(); + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct("Iron", customMat.name)); + } + } + return; + } + } + + public float getBowDamage(ItemStack item) { + return CustomToolHelper.getBowDamage(item, baseDamage) * model.damageModifier; + } + + @Override + public float getRange(ItemStack item) { + return model.velocity; + } + + @Override + public float getSpread(ItemStack item) { + return model.spread; + } + + // ====================================================== CUSTOM END + // ==============================================================\\ + @Override + public float getMaxCharge() { + return model.chargeTime; + } } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemApron.java b/src/main/java/minefantasy/mf2/item/armour/ItemApron.java index 0c106be5..2afba183 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemApron.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemApron.java @@ -5,15 +5,15 @@ import net.minecraft.item.ItemStack; public class ItemApron extends ItemClothingMF { - public ItemApron(String name, BaseMaterialMF material, String tex, int rarity) { - super(name, material, 1, tex, rarity); - } + public ItemApron(String name, BaseMaterialMF material, String tex, int rarity) { + super(name, material, 1, tex, rarity); + } - public static boolean isUserProtected(EntityPlayer user) { - ItemStack worn = user.getCurrentArmor(2); - if (worn == null) { - return false; - } - return worn.getItem() instanceof ItemApron; - } + public static boolean isUserProtected(EntityPlayer user) { + ItemStack worn = user.getCurrentArmor(2); + if (worn == null) { + return false; + } + return worn.getItem() instanceof ItemApron; + } } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java index f0486367..9ffc2305 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemArmourMF.java @@ -33,409 +33,407 @@ import java.util.List; public class ItemArmourMF extends ItemArmourMFBase implements IElementalResistance { - @SideOnly(Side.CLIENT) - private static Object fullplate; - - private int itemRarity; - protected BaseMaterialMF baseMaterial; - - public ItemArmourMF(String name, BaseMaterialMF material, ArmourDesign AD, int slot, String tex, int rarity) { - super(name, material.getArmourConversion(), AD, slot, tex); - baseMaterial = material; - this.setTextureName("minefantasy2:apparel/" + AD.getName().toLowerCase() + "/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - setCreativeTab(CreativeTabMF.tabArmour); - - itemRarity = rarity; - } - - public ItemArmourMF(String name, BaseMaterialMF material, ArmourDesign AD, int slot, String tex, int rarity, - float customBulk) { - this(name, material, AD, slot, tex, rarity); - this.suitBulk = customBulk; - } - - @Override - public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { - if (source.isMagicDamage() && this.getMagicResistance(stack, source) > 100F) { - return; - } - if (source.isFireDamage() && this.getFireResistance(stack, source) > 100F) { - return; - } - if (ArmourListMF.isUnbreakable(baseMaterial, entity)) { - return; - } - initArmourDamage(entity, stack, damage); - } - - @Override - public float getMagicResistance(ItemStack item, DamageSource source) { - CustomMaterial custom = getCustomMaterial(item); - if (custom != null) { - return custom.resistance; - } - return material.magicResistanceModifier; - } - - @Override - public float getFireResistance(ItemStack item, DamageSource source) { - CustomMaterial custom = getCustomMaterial(item); - if (custom != null) { - MFLogUtil.logDebug("Fire Resist: " + custom.getFireResistance()); - return custom.getFireResistance() * design.getRating(); - } - return material.fireResistanceModifier; - } - - @Override - public float getArrowDeflection(ItemStack item, DamageSource source) { - return (design == ArmourDesign.MAIL || design == ArmourDesign.PLATE) ? 0.5F : 0.0F; - } - - @Override - public float getBaseResistance(ItemStack item, DamageSource source) { - if (baseMaterial == BaseMaterialMF.getMaterial("ender") && source.getSourceOfDamage() != null - && source.getSourceOfDamage() instanceof EntityEnderPearl) { - return 100F; - } - return 0; - } - - @Override - public EnumRarity getRarity(ItemStack item) { - int lvl = itemRarity + 1; - - if (item.isItemEnchanted()) { - if (lvl == 0) { - lvl++; - } - lvl++; - } - if (design == ArmourDesign.PLATE) { - lvl++; - } - if (lvl >= ToolListMF.rarity.length) { - lvl = ToolListMF.rarity.length - 1; - } - return ToolListMF.rarity[lvl]; - } - - @Override - protected boolean isUnbreakable() { - return baseMaterial == BaseMaterialMF.getMaterial("ender"); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (this != ArmourListMF.leather[0]) { - return; - } - list.add(new ItemStack(ArmourListMF.leatherapron)); - addSet(list, ArmourListMF.leather); - } - - private void addSet(List list, Item[] items) { - for (Item item : items) { - list.add(new ItemStack(item)); - } - } - - @SideOnly(Side.CLIENT) - private IIcon clothIcon; - @SideOnly(Side.CLIENT) - private IIcon armourIcon; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (!canColour()) { - super.registerIcons(reg); - } else { - String baseLayer = isMetal() ? "" : "_overlay"; - this.armourIcon = reg.registerIcon(this.getIconString() + baseLayer); - String dyeLayer = isMetal() ? "_cloth" : ""; - this.clothIcon = reg.registerIcon(this.getIconString() + dyeLayer); - } - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamageForRenderPass(int dam, int layer) { - if (!canColour()) { - return super.getIconFromDamage(dam); - } - return layer == 1 ? armourIcon : clothIcon; - } - - public boolean canColour() { - return design == ArmourDesign.PADDING || design == ArmourDesign.LEATHER || design == ArmourDesign.CLOTH - || isMetal(); - } - - public boolean isMetal() { - return design == ArmourDesign.MAIL || design == ArmourDesign.PLATE; - } - - @SideOnly(Side.CLIENT) - @Override - public boolean requiresMultipleRenderPasses() { - return canColour(); - } - - /** - * Return whether the specified armor ItemStack has a color. - */ - @Override - public boolean hasColor(ItemStack item) { - return !canColour() ? false - : (!item.hasTagCompound() ? false - : (!item.getTagCompound().hasKey("display", 10) ? false - : item.getTagCompound().getCompoundTag("display").hasKey("color", 3))); - } - - /** - * The Colour of the armour when not dyed - */ - public int getBaseColour(ItemStack item) { - if (!this.isCustom()) { - return 10511680; - } - return -1; - } - - /** - * Return the color for the specified armor ItemStack. - */ - @Override - public int getColor(ItemStack item) { - int metal = getBaseColour(item); - if (!canColour()) { - return metal; - } else { - NBTTagCompound nbttagcompound = item.getTagCompound(); - - if (nbttagcompound == null) { - return metal; - } else { - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); - return nbttagcompound1 == null ? metal - : (nbttagcompound1.hasKey("color", 3) ? nbttagcompound1.getInteger("color") : metal); - } - } - } - - /** - * Remove the color from the specified armor ItemStack. - */ - @Override - public void removeColor(ItemStack item) { - if (canColour()) { - NBTTagCompound nbttagcompound = item.getTagCompound(); - - if (nbttagcompound != null) { - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); - - if (nbttagcompound1.hasKey("color")) { - nbttagcompound1.removeTag("color"); - } - } - } - } - - @Override - public void func_82813_b(ItemStack item, int colour) { - if (!canColour()) { - return; - } else { - NBTTagCompound nbttagcompound = item.getTagCompound(); - - if (nbttagcompound == null) { - nbttagcompound = new NBTTagCompound(); - item.setTagCompound(nbttagcompound); - } - - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); - - if (!nbttagcompound.hasKey("display", 10)) { - nbttagcompound.setTag("display", nbttagcompound1); - } - - nbttagcompound1.setInteger("color", colour); - } - } - - @Override - public float getMagicAC(float AC, DamageSource source, double damage, EntityLivingBase player) { - if (damage > 1 && material.isMythic) { - return AC; - } - return 0F; - } - - @Override - public String getSuitWeigthType(ItemStack item) { - if (design == ArmourDesign.MAIL) { - return "medium"; - } - if (design == ArmourDesign.PLATE) { - return "heavy"; - } - return super.getSuitWeigthType(item); - } - - public ItemStack construct(String plate) { - ItemStack item = new ItemStack(this); - CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, plate.toLowerCase()); - return item; - } - - /** - * A bit of the new system, gets custom materials for armour Only used on - * cogwork armour though - */ - public CustomMaterial getCustomMaterial(ItemStack item) { - CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); - if (material != null) { - return material; - } - return null; - } - - @Override - public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src) { - float DR = getProtectionRatio(armour) * scalePiece(); - - if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { - DR = ArmourCalculator.adjustACForDamage(src, DR, getProtectiveTrait(armour, 0), - getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); - } - MFLogUtil.logDebug(">>>>DR<<<< = " + DR); - return DR; - } - - @Override - protected float getProtectionRatio(ItemStack item) { - CustomMaterial main = getCustomMaterial(item); - if (main != null) { - return main.hardness * design.getRating(); - } - return super.getProtectionRatio(item); - } - - /** - * Gets the modifier for a certain damage type (Cutting, Blunt, Piercing) - */ - @Override - public float getProtectiveTrait(ItemStack item, int dtype) { - float value = super.getProtectiveTrait(item, dtype); - float cutting = 1.0F; - float piercing = 1.0F; - float blunt = 1.0F; - - CustomMaterial material = getCustomMaterial(item); - if (material != null) { - cutting = material.getArmourProtection(0); - blunt = material.getArmourProtection(1); - piercing = material.getArmourProtection(2); - } - - if (dtype == 0)// Cutting - { - value *= cutting; - } - if (dtype == 2)// Piercing - { - value *= piercing; - } - if (dtype == 1)// Blunt - { - value *= blunt; - } - return value; - } - - public float getResistanceModifier(ItemStack item, String hazard) { - CustomMaterial custom = getCustomMaterial(item); - if (custom != null) { - return custom.resistance; - } - return super.getResistanceModifier(item, hazard); - } - - public boolean isCustom() { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean full) { - CustomToolHelper.addInformation(item, list); - float mass = getPieceWeight(item, armorType); - - list.add(CustomMaterial.getWeightString(mass)); - super.addInformation(item, user, list, full); - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) { - if (entity instanceof EntityPlayer && armorType < 2 && design == ArmourDesign.FIELDPLATE - && ConfigClient.customModel) { - return getArmourTextureName(stack, entity, slot, type) + "_S.png"; - } - return getArmourTextureName(stack, entity, slot, type) + ".png"; - } - - public String getArmourTextureName(ItemStack stack, Entity entity, int slot, String type) { - String tex = "minefantasy2:textures/models/armour/" + design.getName().toLowerCase() + "/" + texture; - if (type == null && canColour())// bottom layer - { - return tex + "_cloth"; - } - return tex; - } - - @Override - @SideOnly(Side.CLIENT) - public net.minecraft.client.model.ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, - int armorSlot) { - if (!(entityLiving instanceof EntityPlayer) || armorType >= 2 || !ConfigClient.customModel) { - return super.getArmorModel(entityLiving, itemStack, armorSlot); - } - - if (fullplate == null) { - fullplate = new minefantasy.mf2.client.render.armour.ModelFullplate(1.0F); - } - net.minecraft.client.model.ModelBiped model = this.design == ArmourDesign.FIELDPLATE - ? (net.minecraft.client.model.ModelBiped) fullplate - : null; - if (model == null) { - return super.getArmorModel(entityLiving, itemStack, armorSlot); - } - if (entityLiving != null) { - model.heldItemRight = entityLiving.getHeldItem() != null ? 1 : 0; - model.aimedBow = false; - if (entityLiving instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) entityLiving; - ItemStack held = player.getHeldItem(); - if (held != null && player.getItemInUseCount() > 0) { - EnumAction enumaction = held.getItemUseAction(); - - if (enumaction == EnumAction.block) { - model.heldItemRight = 3; - } else if (enumaction == EnumAction.bow) { - model.aimedBow = true; - } - } - } - } - model.bipedHead.showModel = (this.armorType == 0); - model.bipedHeadwear.showModel = (this.armorType == 0); - - model.bipedCloak.showModel = (this.armorType == 1); - model.bipedBody.showModel = (this.armorType == 1); - model.bipedLeftArm.showModel = (this.armorType == 1); - model.bipedRightArm.showModel = (this.armorType == 1); - return model; - } + @SideOnly(Side.CLIENT) + private static Object fullplate; + protected BaseMaterialMF baseMaterial; + private int itemRarity; + @SideOnly(Side.CLIENT) + private IIcon clothIcon; + @SideOnly(Side.CLIENT) + private IIcon armourIcon; + + public ItemArmourMF(String name, BaseMaterialMF material, ArmourDesign AD, int slot, String tex, int rarity) { + super(name, material.getArmourConversion(), AD, slot, tex); + baseMaterial = material; + this.setTextureName("minefantasy2:apparel/" + AD.getName().toLowerCase() + "/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + setCreativeTab(CreativeTabMF.tabArmour); + + itemRarity = rarity; + } + + public ItemArmourMF(String name, BaseMaterialMF material, ArmourDesign AD, int slot, String tex, int rarity, + float customBulk) { + this(name, material, AD, slot, tex, rarity); + this.suitBulk = customBulk; + } + + @Override + public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { + if (source.isMagicDamage() && this.getMagicResistance(stack, source) > 100F) { + return; + } + if (source.isFireDamage() && this.getFireResistance(stack, source) > 100F) { + return; + } + if (ArmourListMF.isUnbreakable(baseMaterial, entity)) { + return; + } + initArmourDamage(entity, stack, damage); + } + + @Override + public float getMagicResistance(ItemStack item, DamageSource source) { + CustomMaterial custom = getCustomMaterial(item); + if (custom != null) { + return custom.resistance; + } + return material.magicResistanceModifier; + } + + @Override + public float getFireResistance(ItemStack item, DamageSource source) { + CustomMaterial custom = getCustomMaterial(item); + if (custom != null) { + MFLogUtil.logDebug("Fire Resist: " + custom.getFireResistance()); + return custom.getFireResistance() * design.getRating(); + } + return material.fireResistanceModifier; + } + + @Override + public float getArrowDeflection(ItemStack item, DamageSource source) { + return (design == ArmourDesign.MAIL || design == ArmourDesign.PLATE) ? 0.5F : 0.0F; + } + + @Override + public float getBaseResistance(ItemStack item, DamageSource source) { + if (baseMaterial == BaseMaterialMF.getMaterial("ender") && source.getSourceOfDamage() != null + && source.getSourceOfDamage() instanceof EntityEnderPearl) { + return 100F; + } + return 0; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = itemRarity + 1; + + if (item.isItemEnchanted()) { + if (lvl == 0) { + lvl++; + } + lvl++; + } + if (design == ArmourDesign.PLATE) { + lvl++; + } + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; + } + return ToolListMF.rarity[lvl]; + } + + @Override + protected boolean isUnbreakable() { + return baseMaterial == BaseMaterialMF.getMaterial("ender"); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (this != ArmourListMF.leather[0]) { + return; + } + list.add(new ItemStack(ArmourListMF.leatherapron)); + addSet(list, ArmourListMF.leather); + } + + private void addSet(List list, Item[] items) { + for (Item item : items) { + list.add(new ItemStack(item)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (!canColour()) { + super.registerIcons(reg); + } else { + String baseLayer = isMetal() ? "" : "_overlay"; + this.armourIcon = reg.registerIcon(this.getIconString() + baseLayer); + String dyeLayer = isMetal() ? "_cloth" : ""; + this.clothIcon = reg.registerIcon(this.getIconString() + dyeLayer); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamageForRenderPass(int dam, int layer) { + if (!canColour()) { + return super.getIconFromDamage(dam); + } + return layer == 1 ? armourIcon : clothIcon; + } + + public boolean canColour() { + return design == ArmourDesign.PADDING || design == ArmourDesign.LEATHER || design == ArmourDesign.CLOTH + || isMetal(); + } + + public boolean isMetal() { + return design == ArmourDesign.MAIL || design == ArmourDesign.PLATE; + } + + @SideOnly(Side.CLIENT) + @Override + public boolean requiresMultipleRenderPasses() { + return canColour(); + } + + /** + * Return whether the specified armor ItemStack has a color. + */ + @Override + public boolean hasColor(ItemStack item) { + return !canColour() ? false + : (!item.hasTagCompound() ? false + : (!item.getTagCompound().hasKey("display", 10) ? false + : item.getTagCompound().getCompoundTag("display").hasKey("color", 3))); + } + + /** + * The Colour of the armour when not dyed + */ + public int getBaseColour(ItemStack item) { + if (!this.isCustom()) { + return 10511680; + } + return -1; + } + + /** + * Return the color for the specified armor ItemStack. + */ + @Override + public int getColor(ItemStack item) { + int metal = getBaseColour(item); + if (!canColour()) { + return metal; + } else { + NBTTagCompound nbttagcompound = item.getTagCompound(); + + if (nbttagcompound == null) { + return metal; + } else { + NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); + return nbttagcompound1 == null ? metal + : (nbttagcompound1.hasKey("color", 3) ? nbttagcompound1.getInteger("color") : metal); + } + } + } + + /** + * Remove the color from the specified armor ItemStack. + */ + @Override + public void removeColor(ItemStack item) { + if (canColour()) { + NBTTagCompound nbttagcompound = item.getTagCompound(); + + if (nbttagcompound != null) { + NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); + + if (nbttagcompound1.hasKey("color")) { + nbttagcompound1.removeTag("color"); + } + } + } + } + + @Override + public void func_82813_b(ItemStack item, int colour) { + if (!canColour()) { + return; + } else { + NBTTagCompound nbttagcompound = item.getTagCompound(); + + if (nbttagcompound == null) { + nbttagcompound = new NBTTagCompound(); + item.setTagCompound(nbttagcompound); + } + + NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display"); + + if (!nbttagcompound.hasKey("display", 10)) { + nbttagcompound.setTag("display", nbttagcompound1); + } + + nbttagcompound1.setInteger("color", colour); + } + } + + @Override + public float getMagicAC(float AC, DamageSource source, double damage, EntityLivingBase player) { + if (damage > 1 && material.isMythic) { + return AC; + } + return 0F; + } + + @Override + public String getSuitWeigthType(ItemStack item) { + if (design == ArmourDesign.MAIL) { + return "medium"; + } + if (design == ArmourDesign.PLATE) { + return "heavy"; + } + return super.getSuitWeigthType(item); + } + + public ItemStack construct(String plate) { + ItemStack item = new ItemStack(this); + CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, plate.toLowerCase()); + return item; + } + + /** + * A bit of the new system, gets custom materials for armour Only used on + * cogwork armour though + */ + public CustomMaterial getCustomMaterial(ItemStack item) { + CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); + if (material != null) { + return material; + } + return null; + } + + @Override + public float getDRValue(EntityLivingBase user, ItemStack armour, DamageSource src) { + float DR = getProtectionRatio(armour) * scalePiece(); + + if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { + DR = ArmourCalculator.adjustACForDamage(src, DR, getProtectiveTrait(armour, 0), + getProtectiveTrait(armour, 1), getProtectiveTrait(armour, 2)); + } + MFLogUtil.logDebug(">>>>DR<<<< = " + DR); + return DR; + } + + @Override + protected float getProtectionRatio(ItemStack item) { + CustomMaterial main = getCustomMaterial(item); + if (main != null) { + return main.hardness * design.getRating(); + } + return super.getProtectionRatio(item); + } + + /** + * Gets the modifier for a certain damage type (Cutting, Blunt, Piercing) + */ + @Override + public float getProtectiveTrait(ItemStack item, int dtype) { + float value = super.getProtectiveTrait(item, dtype); + float cutting = 1.0F; + float piercing = 1.0F; + float blunt = 1.0F; + + CustomMaterial material = getCustomMaterial(item); + if (material != null) { + cutting = material.getArmourProtection(0); + blunt = material.getArmourProtection(1); + piercing = material.getArmourProtection(2); + } + + if (dtype == 0)// Cutting + { + value *= cutting; + } + if (dtype == 2)// Piercing + { + value *= piercing; + } + if (dtype == 1)// Blunt + { + value *= blunt; + } + return value; + } + + public float getResistanceModifier(ItemStack item, String hazard) { + CustomMaterial custom = getCustomMaterial(item); + if (custom != null) { + return custom.resistance; + } + return super.getResistanceModifier(item, hazard); + } + + public boolean isCustom() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean full) { + CustomToolHelper.addInformation(item, list); + float mass = getPieceWeight(item, armorType); + + list.add(CustomMaterial.getWeightString(mass)); + super.addInformation(item, user, list, full); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) { + if (entity instanceof EntityPlayer && armorType < 2 && design == ArmourDesign.FIELDPLATE + && ConfigClient.customModel) { + return getArmourTextureName(stack, entity, slot, type) + "_S.png"; + } + return getArmourTextureName(stack, entity, slot, type) + ".png"; + } + + public String getArmourTextureName(ItemStack stack, Entity entity, int slot, String type) { + String tex = "minefantasy2:textures/models/armour/" + design.getName().toLowerCase() + "/" + texture; + if (type == null && canColour())// bottom layer + { + return tex + "_cloth"; + } + return tex; + } + + @Override + @SideOnly(Side.CLIENT) + public net.minecraft.client.model.ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, + int armorSlot) { + if (!(entityLiving instanceof EntityPlayer) || armorType >= 2 || !ConfigClient.customModel) { + return super.getArmorModel(entityLiving, itemStack, armorSlot); + } + + if (fullplate == null) { + fullplate = new minefantasy.mf2.client.render.armour.ModelFullplate(1.0F); + } + net.minecraft.client.model.ModelBiped model = this.design == ArmourDesign.FIELDPLATE + ? (net.minecraft.client.model.ModelBiped) fullplate + : null; + if (model == null) { + return super.getArmorModel(entityLiving, itemStack, armorSlot); + } + if (entityLiving != null) { + model.heldItemRight = entityLiving.getHeldItem() != null ? 1 : 0; + model.aimedBow = false; + if (entityLiving instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) entityLiving; + ItemStack held = player.getHeldItem(); + if (held != null && player.getItemInUseCount() > 0) { + EnumAction enumaction = held.getItemUseAction(); + + if (enumaction == EnumAction.block) { + model.heldItemRight = 3; + } else if (enumaction == EnumAction.bow) { + model.aimedBow = true; + } + } + } + } + model.bipedHead.showModel = (this.armorType == 0); + model.bipedHeadwear.showModel = (this.armorType == 0); + + model.bipedCloak.showModel = (this.armorType == 1); + model.bipedBody.showModel = (this.armorType == 1); + model.bipedLeftArm.showModel = (this.armorType == 1); + model.bipedRightArm.showModel = (this.armorType == 1); + return model; + } } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemClothingMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemClothingMF.java index 9554f4e8..eaf3d53b 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemClothingMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemClothingMF.java @@ -10,43 +10,42 @@ import net.minecraft.item.ItemStack; public class ItemClothingMF extends ItemArmourMF { - @SideOnly(Side.CLIENT) - private Object model; - - /** - * @param piece - * 0head, 1body, 2legs, 3boots - */ - public ItemClothingMF(String name, BaseMaterialMF material, int piece, String tex, int rarity) { - super(name, material, ArmourDesign.CLOTH, piece, tex, rarity); - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) { - String tex = "minefantasy2:textures/models/armour/" + design.getName().toLowerCase() + "/" + texture; - if (type == null && canColour())// bottom layer - { - return tex + "_cloth.png"; - } - return tex + ".png"; - } - - @Override - @SideOnly(Side.CLIENT) - public net.minecraft.client.model.ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, - int armorSlot) { - - if (!ConfigClient.customModel) { - return super.getArmorModel(entityLiving, itemStack, armorSlot); - } - if (model == null) { - model = new net.minecraft.client.model.ModelBiped(0.25F); - } - - if (entityLiving != null) { - ((net.minecraft.client.model.ModelBiped) model).heldItemRight = entityLiving.getHeldItem() != null ? 1 : 0; - } - return (net.minecraft.client.model.ModelBiped) model; - } + @SideOnly(Side.CLIENT) + private Object model; + + /** + * @param piece 0head, 1body, 2legs, 3boots + */ + public ItemClothingMF(String name, BaseMaterialMF material, int piece, String tex, int rarity) { + super(name, material, ArmourDesign.CLOTH, piece, tex, rarity); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) { + String tex = "minefantasy2:textures/models/armour/" + design.getName().toLowerCase() + "/" + texture; + if (type == null && canColour())// bottom layer + { + return tex + "_cloth.png"; + } + return tex + ".png"; + } + + @Override + @SideOnly(Side.CLIENT) + public net.minecraft.client.model.ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, + int armorSlot) { + + if (!ConfigClient.customModel) { + return super.getArmorModel(entityLiving, itemStack, armorSlot); + } + if (model == null) { + model = new net.minecraft.client.model.ModelBiped(0.25F); + } + + if (entityLiving != null) { + ((net.minecraft.client.model.ModelBiped) model).heldItemRight = entityLiving.getHeldItem() != null ? 1 : 0; + } + return (net.minecraft.client.model.ModelBiped) model; + } } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemCustomArmour.java b/src/main/java/minefantasy/mf2/item/armour/ItemCustomArmour.java index df0aecfe..fbead90a 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemCustomArmour.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemCustomArmour.java @@ -1,9 +1,5 @@ package minefantasy.mf2.item.armour; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -26,188 +22,191 @@ import net.minecraft.util.IIcon; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + public class ItemCustomArmour extends ItemArmourMF { - private String specialDesign = "standard"; - private float ratingModifier = 1.0F; - - public ItemCustomArmour(String craftDesign, String name, ArmourDesign AD, int slot, String tex, int rarity) { - super(craftDesign + "_" + name, BaseMaterialMF.iron, AD, slot, craftDesign + "_" + tex, rarity); - this.setTextureName("minefantasy2:custom/apparel/" + craftDesign + "/" + craftDesign + "_" + name); - this.specialDesign = craftDesign; - canRepair = false; - } - - public ItemCustomArmour modifyRating(float rating) { - this.ratingModifier = rating; - return this; - } - - @Override - public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { - super.damageArmor(entity, stack, source, damage, slot); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - - @Override - public String getArmourTextureName(ItemStack stack, Entity entity, int slot, String type) { - String tex = "minefantasy2:textures/models/armour/custom/" + specialDesign + "/" + texture; - if (type == null)// bottom layer - { - return tex;// COLOUR LAYER - } - return tex + "_detail";// STATIC LAYER - } - - @Override - public boolean hasColor(ItemStack item) { - return true; - } - - @Override - public boolean canColour() { - return true; - } - - /** - * Return the colour of the material it is made of. - */ - @Override - public int getBaseColour(ItemStack item) { - CustomMaterial material = getCustomMaterial(item); - if (material == null) { - return (255 << 16) + (255 << 8) + 255; - } - return material.getColourInt(); - } - - @Override - public CustomMaterial getCustomMaterial(ItemStack item) { - CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); - if (material != null) { - return material; - } - return null; - } - - /** - * Adds a suit ONLY IF the material ingot exists - */ - public static void tryAddSuits(List list, String plating) { - ArrayList mats = OreDictionary.getOres("ingot" + plating); - if (MineFantasyII.isDebug() || (mats != null && !mats.isEmpty())) { - addSuits(list, plating); - } - } - - public static void addSuits(List list, String material) { - list.add(CustomArmourListMF.standard_chain_helmet.construct(material)); - list.add(CustomArmourListMF.standard_chain_chest.construct(material)); - list.add(CustomArmourListMF.standard_chain_legs.construct(material)); - list.add(CustomArmourListMF.standard_chain_boots.construct(material)); - - list.add(CustomArmourListMF.standard_scale_helmet.construct(material)); - list.add(CustomArmourListMF.standard_scale_chest.construct(material)); - list.add(CustomArmourListMF.standard_scale_legs.construct(material)); - list.add(CustomArmourListMF.standard_scale_boots.construct(material)); - - list.add(CustomArmourListMF.standard_splint_helmet.construct(material)); - list.add(CustomArmourListMF.standard_splint_chest.construct(material)); - list.add(CustomArmourListMF.standard_splint_legs.construct(material)); - list.add(CustomArmourListMF.standard_splint_boots.construct(material)); - - list.add(CustomArmourListMF.standard_plate_helmet.construct(material)); - list.add(CustomArmourListMF.standard_plate_chest.construct(material)); - list.add(CustomArmourListMF.standard_plate_legs.construct(material)); - list.add(CustomArmourListMF.standard_plate_boots.construct(material)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - if (this.getCreativeTab() != CreativeTabMF.tabArmour) { - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - - if (customMat.getItem() != null) { - list.add(construct(customMat.name)); - } - } - return; - } - if (this != CustomArmourListMF.standard_chain_boots) - return; - - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - - if (customMat.getItem() != null) { - addSuits(list, customMat.name); - } - } - } - - private IIcon plateIcon, detailIcon; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - this.plateIcon = reg.registerIcon(this.getIconString()); - this.detailIcon = reg.registerIcon(this.getIconString() + "_detail"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamageForRenderPass(int dam, int layer) { - return layer == 1 ? detailIcon : plateIcon; - } - - @SideOnly(Side.CLIENT) - @Override - public boolean requiresMultipleRenderPasses() { - return true; - } - - @Override - public float getPieceWeight(ItemStack item, int slot) { - float baseWeight = armourWeight * ArmourCalculator.sizes[slot]; - CustomMaterial material = this.getCustomMaterial(item); - if (material != null) { - baseWeight *= material.density; - } - return baseWeight; - } - - public int getMaxDamage(ItemStack stack) { - CustomMaterial material = this.getCustomMaterial(stack); - if (material != null) { - return (int) ((material.durability * 250) * (design.getDurability() / 2F)); - } - return getMaxDamage(); - } - - public boolean isCustom() { - return true; - } - - @Override - protected float getSpecialModifier(ItemStack armour, DamageSource source) { - float modifier = CombatMechanics.getSpecialModifier(this.getCustomMaterial(armour), this.specialDesign, - source.getEntity(), false); - - MFLogUtil.logDebug("Modifier = " + modifier); - - return super.getSpecialModifier(armour, source) * modifier; - } - - @Override - protected float getProtectionRatio(ItemStack item) { - return super.getProtectionRatio(item) * ratingModifier; - } + private String specialDesign = "standard"; + private float ratingModifier = 1.0F; + private IIcon plateIcon, detailIcon; + + public ItemCustomArmour(String craftDesign, String name, ArmourDesign AD, int slot, String tex, int rarity) { + super(craftDesign + "_" + name, BaseMaterialMF.iron, AD, slot, craftDesign + "_" + tex, rarity); + this.setTextureName("minefantasy2:custom/apparel/" + craftDesign + "/" + craftDesign + "_" + name); + this.specialDesign = craftDesign; + canRepair = false; + } + + /** + * Adds a suit ONLY IF the material ingot exists + */ + public static void tryAddSuits(List list, String plating) { + ArrayList mats = OreDictionary.getOres("ingot" + plating); + if (MineFantasyII.isDebug() || (mats != null && !mats.isEmpty())) { + addSuits(list, plating); + } + } + + public static void addSuits(List list, String material) { + list.add(CustomArmourListMF.standard_chain_helmet.construct(material)); + list.add(CustomArmourListMF.standard_chain_chest.construct(material)); + list.add(CustomArmourListMF.standard_chain_legs.construct(material)); + list.add(CustomArmourListMF.standard_chain_boots.construct(material)); + + list.add(CustomArmourListMF.standard_scale_helmet.construct(material)); + list.add(CustomArmourListMF.standard_scale_chest.construct(material)); + list.add(CustomArmourListMF.standard_scale_legs.construct(material)); + list.add(CustomArmourListMF.standard_scale_boots.construct(material)); + + list.add(CustomArmourListMF.standard_splint_helmet.construct(material)); + list.add(CustomArmourListMF.standard_splint_chest.construct(material)); + list.add(CustomArmourListMF.standard_splint_legs.construct(material)); + list.add(CustomArmourListMF.standard_splint_boots.construct(material)); + + list.add(CustomArmourListMF.standard_plate_helmet.construct(material)); + list.add(CustomArmourListMF.standard_plate_chest.construct(material)); + list.add(CustomArmourListMF.standard_plate_legs.construct(material)); + list.add(CustomArmourListMF.standard_plate_boots.construct(material)); + } + + public ItemCustomArmour modifyRating(float rating) { + this.ratingModifier = rating; + return this; + } + + @Override + public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { + super.damageArmor(entity, stack, source, damage, slot); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + @Override + public String getArmourTextureName(ItemStack stack, Entity entity, int slot, String type) { + String tex = "minefantasy2:textures/models/armour/custom/" + specialDesign + "/" + texture; + if (type == null)// bottom layer + { + return tex;// COLOUR LAYER + } + return tex + "_detail";// STATIC LAYER + } + + @Override + public boolean hasColor(ItemStack item) { + return true; + } + + @Override + public boolean canColour() { + return true; + } + + /** + * Return the colour of the material it is made of. + */ + @Override + public int getBaseColour(ItemStack item) { + CustomMaterial material = getCustomMaterial(item); + if (material == null) { + return (255 << 16) + (255 << 8) + 255; + } + return material.getColourInt(); + } + + @Override + public CustomMaterial getCustomMaterial(ItemStack item) { + CustomMaterial material = CustomMaterial.getMaterialFor(item, CustomToolHelper.slot_main); + if (material != null) { + return material; + } + return null; + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + if (this.getCreativeTab() != CreativeTabMF.tabArmour) { + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + + if (customMat.getItem() != null) { + list.add(construct(customMat.name)); + } + } + return; + } + if (this != CustomArmourListMF.standard_chain_boots) + return; + + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + + if (customMat.getItem() != null) { + addSuits(list, customMat.name); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + this.plateIcon = reg.registerIcon(this.getIconString()); + this.detailIcon = reg.registerIcon(this.getIconString() + "_detail"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamageForRenderPass(int dam, int layer) { + return layer == 1 ? detailIcon : plateIcon; + } + + @SideOnly(Side.CLIENT) + @Override + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + public float getPieceWeight(ItemStack item, int slot) { + float baseWeight = armourWeight * ArmourCalculator.sizes[slot]; + CustomMaterial material = this.getCustomMaterial(item); + if (material != null) { + baseWeight *= material.density; + } + return baseWeight; + } + + public int getMaxDamage(ItemStack stack) { + CustomMaterial material = this.getCustomMaterial(stack); + if (material != null) { + return (int) ((material.durability * 250) * (design.getDurability() / 2F)); + } + return getMaxDamage(); + } + + public boolean isCustom() { + return true; + } + + @Override + protected float getSpecialModifier(ItemStack armour, DamageSource source) { + float modifier = CombatMechanics.getSpecialModifier(this.getCustomMaterial(armour), this.specialDesign, + source.getEntity(), false); + + MFLogUtil.logDebug("Modifier = " + modifier); + + return super.getSpecialModifier(armour, source) * modifier; + } + + @Override + protected float getProtectionRatio(ItemStack item) { + return super.getProtectionRatio(item) * ratingModifier; + } } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java index 3bd0a4d5..c2641c44 100644 --- a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java +++ b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java @@ -1,6 +1,5 @@ package minefantasy.mf2.item.armour; -import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -9,18 +8,12 @@ import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; -import minefantasy.mf2.client.render.mob.RenderVanillaHorse; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.material.BaseMaterialMF; -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.ModelHorse; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.entity.passive.EntityHorse; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraftforge.client.event.RenderLivingEvent; -import sun.java2d.pipe.RenderingEngine; public class ItemHorseArmorMF extends ItemHorseArmorMFBase { diff --git a/src/main/java/minefantasy/mf2/item/custom/ItemCustomComponent.java b/src/main/java/minefantasy/mf2/item/custom/ItemCustomComponent.java index 5603a0d1..72e1c48b 100644 --- a/src/main/java/minefantasy/mf2/item/custom/ItemCustomComponent.java +++ b/src/main/java/minefantasy/mf2/item/custom/ItemCustomComponent.java @@ -1,9 +1,5 @@ package minefantasy.mf2.item.custom; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,185 +21,187 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + public class ItemCustomComponent extends Item implements ITieredComponent { - @SideOnly(Side.CLIENT) - public IIcon baseTex; - private String name; - private float mass; - - public ItemCustomComponent(String name, String type) { - this(name, -1F, type); - } - - public ItemCustomComponent(String name, float mass, String type) { - this.name = name; - this.setCreativeTab(CreativeTabMF.tabMaterials); - GameRegistry.registerItem(this, "custom_" + name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - this.mass = mass; - this.materialType = type; - } - - private boolean canDamage = false;; - - public ItemCustomComponent setCanDamage() { - this.canDamage = true; - this.setHasSubtypes(false); - return this; - } - - @Override - public boolean isDamageable() { - return canDamage; - } - - @Override - public boolean isRepairable() { - return false; - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (tab != CreativeTabMF.tabMaterialsMF) { - ArrayList wood = CustomMaterial.getList("metal"); - Iterator iteratorWood = wood.iterator(); - while (iteratorWood.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - list.add(this.createComm(customMat.name)); - } - } - } - - public float getWeightInKg(ItemStack tool) { - CustomMaterial base = getBase(tool); - if (base != null) { - return base.density * mass; - } - return mass; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack tool, EntityPlayer user, List list, boolean fullInfo) { - super.addInformation(tool, user, list, fullInfo); - if (!canDamage) { - CustomToolHelper.addComponentString(tool, list, getBase(tool), mass); - } - if (this == ComponentListMF.cogwork_armour) { - int AR = EntityCogwork.getArmourRating(getBase(tool)); - list.add(StatCollector.translateToLocal("attribute.armour.protection") + " " + AR); - if (mass > 0) - list.add(CustomMaterial.getWeightString(getWeightInKg(tool))); - } - } - - @Override - public String getItemStackDisplayName(ItemStack tool) { - return CustomToolHelper.getLocalisedName(tool, "item.commodity_" + name + ".name"); - } - - public CustomMaterial getBase(ItemStack component) { - return CustomToolHelper.getCustomPrimaryMaterial(component); - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderPasses(int metadata) { - return 1; - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - CustomMaterial base = getBase(item); - if (base != null) { - return base.getColourInt(); - } - return super.getColorFromItemStack(item, layer); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack item, int layer) { - return baseTex; - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - baseTex = reg.registerIcon("minefantasy2:custom/component/" + name); - } - - public ItemStack createComm(String base) { - return createComm(base, 1); - } - - public ItemStack createComm(String base, int stack) { - return createComm(base, stack, 0); - } - - public ItemStack createComm(String base, int stack, float damage) { - ItemStack item = new ItemStack(this, stack); - CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, base); - int maxdam = this.getMaxDamage(item); - - item.setItemDamage((int) (maxdam * damage)); - return item; - } - - @Override - public int getMaxDamage(ItemStack stack) { - if (canDamage) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - return super.getMaxDamage(stack); - } - - public ItemStack createComm(String base, int stack, int damage) { - ItemStack item = new ItemStack(this, stack, damage); - CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, base); - return item; - } - - private final String materialType; - - @Override - public String getMaterialType(ItemStack item) { - return materialType; - } - - // STORAGE - private String blocktex; - private String storageType; - - public ItemCustomComponent setStoragePlacement(String type, String tex) { - this.blocktex = tex; - this.storageType = type; - return this; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (!world.isRemote && storageType != null) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); - - if (movingobjectposition == null) { - return item; - } else { - int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, - movingobjectposition); - if (placed > 0) { - item.stackSize -= placed; - return item; - } - } - } - return item; - } + private final String materialType; + @SideOnly(Side.CLIENT) + public IIcon baseTex; + private String name; + private float mass; + private boolean canDamage = false; + // STORAGE + private String blocktex; + ; + private String storageType; + + public ItemCustomComponent(String name, String type) { + this(name, -1F, type); + } + + public ItemCustomComponent(String name, float mass, String type) { + this.name = name; + this.setCreativeTab(CreativeTabMF.tabMaterials); + GameRegistry.registerItem(this, "custom_" + name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + this.mass = mass; + this.materialType = type; + } + + public ItemCustomComponent setCanDamage() { + this.canDamage = true; + this.setHasSubtypes(false); + return this; + } + + @Override + public boolean isDamageable() { + return canDamage; + } + + @Override + public boolean isRepairable() { + return false; + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (tab != CreativeTabMF.tabMaterialsMF) { + ArrayList wood = CustomMaterial.getList("metal"); + Iterator iteratorWood = wood.iterator(); + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + list.add(this.createComm(customMat.name)); + } + } + } + + public float getWeightInKg(ItemStack tool) { + CustomMaterial base = getBase(tool); + if (base != null) { + return base.density * mass; + } + return mass; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack tool, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(tool, user, list, fullInfo); + if (!canDamage) { + CustomToolHelper.addComponentString(tool, list, getBase(tool), mass); + } + if (this == ComponentListMF.cogwork_armour) { + int AR = EntityCogwork.getArmourRating(getBase(tool)); + list.add(StatCollector.translateToLocal("attribute.armour.protection") + " " + AR); + if (mass > 0) + list.add(CustomMaterial.getWeightString(getWeightInKg(tool))); + } + } + + @Override + public String getItemStackDisplayName(ItemStack tool) { + return CustomToolHelper.getLocalisedName(tool, "item.commodity_" + name + ".name"); + } + + public CustomMaterial getBase(ItemStack component) { + return CustomToolHelper.getCustomPrimaryMaterial(component); + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderPasses(int metadata) { + return 1; + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + CustomMaterial base = getBase(item); + if (base != null) { + return base.getColourInt(); + } + return super.getColorFromItemStack(item, layer); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack item, int layer) { + return baseTex; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + baseTex = reg.registerIcon("minefantasy2:custom/component/" + name); + } + + public ItemStack createComm(String base) { + return createComm(base, 1); + } + + public ItemStack createComm(String base, int stack) { + return createComm(base, stack, 0); + } + + public ItemStack createComm(String base, int stack, float damage) { + ItemStack item = new ItemStack(this, stack); + CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, base); + int maxdam = this.getMaxDamage(item); + + item.setItemDamage((int) (maxdam * damage)); + return item; + } + + @Override + public int getMaxDamage(ItemStack stack) { + if (canDamage) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + return super.getMaxDamage(stack); + } + + public ItemStack createComm(String base, int stack, int damage) { + ItemStack item = new ItemStack(this, stack, damage); + CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, base); + return item; + } + + @Override + public String getMaterialType(ItemStack item) { + return materialType; + } + + public ItemCustomComponent setStoragePlacement(String type, String tex) { + this.blocktex = tex; + this.storageType = type; + return this; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote && storageType != null) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); + + if (movingobjectposition == null) { + return item; + } else { + int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, + movingobjectposition); + if (placed > 0) { + item.stackSize -= placed; + return item; + } + } + } + return item; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/food/FoodListMF.java b/src/main/java/minefantasy/mf2/item/food/FoodListMF.java index 9b52b39e..44590209 100644 --- a/src/main/java/minefantasy/mf2/item/food/FoodListMF.java +++ b/src/main/java/minefantasy/mf2/item/food/FoodListMF.java @@ -11,187 +11,166 @@ import net.minecraft.potion.Potion; public class FoodListMF { - // MORSELS - public static Item wolf_raw = (new ItemFoodMF("wolf_raw", 2, 0.2F, true)); - public static Item wolf_cooked = (new ItemFoodMF("wolf_cooked", 6, 0.6F, true)); - public static Item horse_raw = (new ItemFoodMF("horse_raw", 4, 0.4F, true)).setPotionEffect(Potion.hunger.id, 50, 0, - 0.5F); - public static Item horse_cooked = (new ItemFoodMF("horse_cooked", 10, 1.0F, true)); - - public static Item generic_meat_uncooked = (new ItemFoodMF("generic_meat_uncooked", 2, 0.2F, true)); - public static Item generic_meat_cooked = (new ItemFoodMF("generic_meat_cooked", 5, 0.5F, true)); - public static Item generic_meat_strip_uncooked = (new ItemFoodMF("generic_meat_strip_uncooked", 2, 0.2F, true)); - public static Item generic_meat_strip_cooked = (new ItemFoodMF("generic_meat_strip_cooked", 5, 0.5F, true)); - public static Item generic_meat_chunk_uncooked = (new ItemFoodMF("generic_meat_chunk_uncooked", 2, 0.2F, true)); - public static Item generic_meat_chunk_cooked = (new ItemFoodMF("generic_meat_chunk_cooked", 5, 0.5F, true)); - public static Item generic_meat_mince_uncooked = (new ItemFoodMF("generic_meat_mince_uncooked", 2, 0.2F, true)) - .setContainerItem(ComponentListMF.clay_pot); - public static Item generic_meat_mince_cooked = (new ItemFoodMF("generic_meat_mince_cooked", 5, 0.5F, true)) - .setContainerItem(ComponentListMF.clay_pot); - - public static Item flour = new ItemComponentMF("flour", 0).setCreativeTab(CreativeTabMF.tabFood) - .setContainerItem(ComponentListMF.clay_pot); - public static Item breadcrumbs = new ItemComponentMF("breadcrumbs", 0).setCreativeTab(CreativeTabMF.tabFood) - .setContainerItem(ComponentListMF.clay_pot); - public static Item guts = new ItemComponentMF("guts", 0).setCreativeTab(CreativeTabMF.tabFood); - - public static Item breadroll = (new ItemFoodMF("breadroll", 5, 1.0F, false)); - public static Item breadSlice = (new ItemFoodMF("breadslice", 2, 1.0F, false)); - - public static Item curds = new ItemUnfinishedFood("curds"); - public static Item cheese_pot = new ItemUnfinishedFood("cheese_pot").setContainerItem(ComponentListMF.clay_pot); - public static Item cheese_slice = (new ItemFoodMF("cheese_slice", 4, 1.0F, false, 0).setFoodStats(1, 0.0F, 0.0F, - 1.0F)); - - // T1 (basic mixing) - // Util: Roast, Prep Block (Stone-Bronze Age) - public static Item stew = (new ItemFoodMF("stew", 5, 1.0F, false, 0)).setFoodStats(1, 0.0F, 0.0F, 1.0F) - .setReturnItem(Items.bowl).setMaxStackSize(1); - public static Item oats = (new ItemFoodMF("oats", 5, 1.0F, false, 0)).setFoodStats(1, 0.0F, 0.8F, 0.2F) - .setReturnItem(Items.bowl).setMaxStackSize(1); - - // T2 (Basic baking, stone oven, processed mixing) - // Util: Stone Oven, Prep Block (Bronze Age - Early Iron Age) - public static Item cheese_roll = (new ItemFoodMF("cheese_roll", 6, 1.0F, false, 0)) - .setFoodStats(2, 0.0F, 0.4F, 0.6F).setMaxStackSize(1); - public static Item jerky = (new ItemFoodMF("jerky", 6, 1.0F, true, 0)).setFoodStats(2, 0.0F, 0.0F, 1.0F) - .setMaxStackSize(8); - public static Item saussage_raw = (new ItemFoodMF("saussage_raw", 4, 1.0F, true, 0)) - .setFoodStats(2, 0.0F, 0.1F, 0.6F).setMaxStackSize(16); - public static Item saussage_cooked = (new ItemFoodMF("saussage_cooked", 8, 1.0F, true, 0)) - .setFoodStats(2, 0.0F, 0.2F, 0.8F).setMaxStackSize(16); - public static Item sweetroll_uniced = (new ItemFoodMF("sweetroll_uniced", 5, 1.0F, false, 0)) - .setFoodStats(2, 0.5F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64); - public static Item sweetroll = (new ItemMultiFood("sweetroll", 2, 3, 1.0F, false, 0)) - .setFoodStats(2, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible(); - public static Item sandwitch_meat = (new ItemMultiFood("sandwitch_meat", 2, 6, 1.0F, false, 0)) - .setFoodStats(2, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/sandwitch") - .setUnlocalizedName("sandwitch"); - public static Item sandwitch_big = (new ItemMultiFood("sandwitch_big", 4, 6, 1.0F, false, 1)) - .setFoodStats(2, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/sandwitchbig") - .setUnlocalizedName("sandwitch"); - - // T3 (Quality baking, metal oven) - // Util: Metal Oven, Prep Block, Steel Tools (Mid Iron Age) - public static Item meatpie_slice = (new ItemFoodMF("meatpie_slice", 8, 1.0F, false, 0)) - .setFoodStats(3, 0.0F, 0.2F, 0.8F).setMaxStackSize(1); - public static Item pieslice_apple = (new ItemFoodMF("pieslice_apple", 5, 1.0F, false, 0)) - .setFoodStats(3, 0.8F, 0.2F, 0.0F).setEatTime(16).setAlwaysEdible().setAlwaysEdible() - .setTextureName("minefantasy2:food/applepie_slice").setMaxStackSize(1); - public static Item pieslice_berry = (new ItemFoodMF("pieslice_berry", 5, 1.0F, false, 0)) - .setFoodStats(3, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setAlwaysEdible() - .setTextureName("minefantasy2:food/berrypie_slice").setMaxStackSize(1); - - // T4 (Advanced baking, multiple processes, temperature regulation) - // Util : Metal Oven, Prep Block, Full tool set, Proper kitchen setup (Mid Iron - // Age) - public static Item pieslice_shepards = (new ItemFoodMF("pieslice_shepards", 10, 1.0F, false, 1)) - .setFoodStats(4, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/shepardspie_slice").setMaxStackSize(1); - - public static Item cake_slice = (new ItemFoodMF("cake_slice", 3, 0.8F, false, 0)).setFoodStats(3, 1.0F, 0.0F, 0.0F) - .setEatTime(16).setAlwaysEdible().setMaxStackSize(1); - public static Item carrotcake_slice = (new ItemFoodMF("carrotcake_slice", 4, 0.8F, false, 0)) - .setFoodStats(4, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); - public static Item choccake_slice = (new ItemFoodMF("choccake_slice", 4, 0.8F, false, 0)) - .setFoodStats(4, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); - - // T5 (Advanced baking, multiple process, temperature regulation, many - // ingreedients) - - // T6 (Perfeted meals, extremely difficylt to create) - public static Item bfcake_slice = (new ItemFoodMF("bfcake_slice", 6, 1.0F, false, 1)) - .setFoodStats(5, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); - public static Item eclair_uniced = (new ItemFoodMF("eclair_uniced", 5, 1.0F, false, 0)) - .setFoodStats(5, 0.3F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64) - .setTextureName("minefantasy2:food/unfinished/eclair_uniced"); - public static Item eclair_empty = (new ItemFoodMF("eclair_empty", 5, 1.0F, false, 0)) - .setFoodStats(5, 0.5F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64) - .setTextureName("minefantasy2:food/unfinished/eclair_empty"); - public static Item eclair = (new ItemMultiFood("eclair", 4, 4, 1.0F, false, 1)).setFoodStats(5, 1.0F, 0.0F, 0.0F) - .setEatTime(16).setAlwaysEdible().setMaxStackSize(1); - - // MISC - public static Item cake_tin = new ItemComponentMF("cake_tin", 0).setCreativeTab(CreativeTabMF.tabFood); - public static Item pie_tray = new ItemComponentMF("pie_tin", 0).setStoragePlacement("bigplate", "tray") - .setCreativeTab(CreativeTabMF.tabFood); - public static Item icing = new ItemComponentMF("icing", 0).setCreativeTab(CreativeTabMF.tabFood) - .setContainerItem(ComponentListMF.clay_pot); - public static Item custard = new ItemComponentMF("custard", 0).setCreativeTab(CreativeTabMF.tabFood) - .setContainerItem(ComponentListMF.clay_pot); - public static Item coca_powder = new ItemComponentMF("coca_powder", 0).setCreativeTab(CreativeTabMF.tabFood) - .setContainerItem(ComponentListMF.clay_pot); - public static Item chocolate = new ItemComponentMF("chocolate", 0).setCreativeTab(CreativeTabMF.tabFood) - .setContainerItem(ComponentListMF.clay_pot); - public static Item chocchips = new ItemComponentMF("chocchips", 0).setCreativeTab(CreativeTabMF.tabFood) - .setContainerItem(ComponentListMF.clay_pot); - public static Item berries = (new ItemFoodMF("berries", 2, 2.0F, false)).setEatTime(10).setStaminaRestore(10F) - .setAlwaysEdible(); - public static Item berriesJuicy = (new ItemFoodMF("berriesJuicy", 3, 5.0F, false)).setEatTime(10) - .setStaminaRestore(25F).setRarity(1).setAlwaysEdible(); - - public static Item sweetroll_raw = new ItemUnfinishedFood("sweetroll_raw").setMaxStackSize(64); - public static Item eclair_raw = new ItemUnfinishedFood("eclair_raw").setMaxStackSize(64); - public static Item cake_raw = new ItemUnfinishedFood("cake_raw"); - public static Item cake_simple_raw = new ItemUnfinishedFood("cake_simple_raw"); - public static Item cake_carrot_raw = new ItemUnfinishedFood("cake_carrot_raw"); - public static Item cake_choc_raw = new ItemUnfinishedFood("cake_choc_raw"); - public static Item cake_bf_raw = new ItemUnfinishedFood("cake_bf_raw"); - - public static Item cake_uniced = new ItemUnfinishedFood("cake_uniced").setContainerItem(cake_tin); - public static Item cake_simple_uniced = new ItemUnfinishedFood("cake_simple_uniced").setContainerItem(cake_tin); - public static Item cake_carrot_uniced = new ItemUnfinishedFood("cake_carrot_uniced").setContainerItem(cake_tin); - public static Item cake_choc_uniced = new ItemUnfinishedFood("cake_choc_uniced").setContainerItem(cake_tin); - public static Item cake_bf_uniced = new ItemUnfinishedFood("cake_bf_uniced").setContainerItem(cake_tin); - - public static Item pie_meat_uncooked = new ItemUnfinishedFood("pie_meat_uncooked") - .setTextureName("minefantasy2:food/unfinished/pie_meat_uncooked"); - - public static Item pie_apple_uncooked = new ItemUnfinishedFood("pie_apple_uncooked"); - public static Item pie_berry_uncooked = new ItemUnfinishedFood("pie_berry_uncooked"); - public static Item pie_shepard_uncooked = new ItemUnfinishedFood("pie_shepard_uncooked"); - public static Item pie_pumpkin_uncooked = new ItemUnfinishedFood("pie_pumpkin_uncooked"); - - public static Item pie_meat_cooked = new ItemUnfinishedFood("pie_meat_cooked") - .setTextureName("minefantasy2:food/unfinished/pie_meat_cooked").setContainerItem(pie_tray); - - public static Item pie_apple_cooked = new ItemUnfinishedFood("pie_apple_cooked").setContainerItem(pie_tray); - public static Item pie_berry_cooked = new ItemUnfinishedFood("pie_berry_cooked").setContainerItem(pie_tray); - public static Item pie_shepard_cooked = new ItemUnfinishedFood("pie_shepard_cooked").setContainerItem(pie_tray); - public static Item pie_pumpkin_cooked = new ItemUnfinishedFood("pie_pumpkin_cooked").setContainerItem(pie_tray); - public static Item salt = new ItemComponentMF("salt", 0).setCreativeTab(CreativeTabMF.tabFood) - .setContainerItem(ComponentListMF.clay_pot); - public static Item sugarpot = new ItemComponentMF("sugarpot", 0).setCreativeTab(CreativeTabMF.tabFood) - .setContainerItem(ComponentListMF.clay_pot); - public static Item bowl_water_salt = new ItemComponentMF("bowl_water_salt", 0) - .setCreativeTab(CreativeTabMF.tabFood); - - public static Item dough = new ItemUnfinishedFood("dough").setMaxStackSize(64); - public static Item pastry = new ItemUnfinishedFood("pastry").setMaxStackSize(64); - public static Item raw_bread = new ItemUnfinishedFood("raw_bread").setMaxStackSize(64); - - public static Item jug_uncooked = new ItemJug("uncooked"); - public static Item jug_empty = new ItemJug("empty").setStoragePlacement("jug", "jug"); - public static Item jug_water = new ItemJug("water").setStoragePlacement("jug", "jugwater") - .setContainerItem(jug_empty); - public static Item jug_milk = new ItemJug("milk").setStoragePlacement("jug", "jugmilk").setContainerItem(jug_empty); - - public static Item burnt_food = new ItemBurntFood("burnt_food"); - public static Item burnt_pot = new ItemBurntFood("burnt_pot").setContainerItem(ComponentListMF.clay_pot); - public static Item burnt_pie = new ItemBurntFood("burnt_pie").setContainerItem(pie_tray); - public static Item burnt_cake = new ItemBurntFood("burnt_cake").setContainerItem(cake_tin); - // SPECIAL RECIPES - - public static final float satModifier = 1.0F; - - public static void load() { - CookRecipe.burnt_food = burnt_food; - } - - /** - * FOOD TYPES: Sugar: Stamina Regen Dairy: Saturation Grain: Stamina Max - * - * Protien: Saturation / Stamina Max Fruit: Stamina Max / Stamina Time - * Vegetable: Stamina Time / Saturation - */ + public static final float satModifier = 1.0F; + // MORSELS + public static Item wolf_raw = (new ItemFoodMF("wolf_raw", 2, 0.2F, true)); + public static Item wolf_cooked = (new ItemFoodMF("wolf_cooked", 6, 0.6F, true)); + public static Item horse_raw = (new ItemFoodMF("horse_raw", 4, 0.4F, true)).setPotionEffect(Potion.hunger.id, 50, 0, + 0.5F); + public static Item horse_cooked = (new ItemFoodMF("horse_cooked", 10, 1.0F, true)); + public static Item generic_meat_uncooked = (new ItemFoodMF("generic_meat_uncooked", 2, 0.2F, true)); + public static Item generic_meat_cooked = (new ItemFoodMF("generic_meat_cooked", 5, 0.5F, true)); + public static Item generic_meat_strip_uncooked = (new ItemFoodMF("generic_meat_strip_uncooked", 2, 0.2F, true)); + public static Item generic_meat_strip_cooked = (new ItemFoodMF("generic_meat_strip_cooked", 5, 0.5F, true)); + public static Item generic_meat_chunk_uncooked = (new ItemFoodMF("generic_meat_chunk_uncooked", 2, 0.2F, true)); + public static Item generic_meat_chunk_cooked = (new ItemFoodMF("generic_meat_chunk_cooked", 5, 0.5F, true)); + public static Item generic_meat_mince_uncooked = (new ItemFoodMF("generic_meat_mince_uncooked", 2, 0.2F, true)) + .setContainerItem(ComponentListMF.clay_pot); + public static Item generic_meat_mince_cooked = (new ItemFoodMF("generic_meat_mince_cooked", 5, 0.5F, true)) + .setContainerItem(ComponentListMF.clay_pot); + public static Item flour = new ItemComponentMF("flour", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item breadcrumbs = new ItemComponentMF("breadcrumbs", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item guts = new ItemComponentMF("guts", 0).setCreativeTab(CreativeTabMF.tabFood); + public static Item breadroll = (new ItemFoodMF("breadroll", 5, 1.0F, false)); + public static Item breadSlice = (new ItemFoodMF("breadslice", 2, 1.0F, false)); + public static Item curds = new ItemUnfinishedFood("curds"); + public static Item cheese_pot = new ItemUnfinishedFood("cheese_pot").setContainerItem(ComponentListMF.clay_pot); + public static Item cheese_slice = (new ItemFoodMF("cheese_slice", 4, 1.0F, false, 0).setFoodStats(1, 0.0F, 0.0F, + 1.0F)); + // T1 (basic mixing) + // Util: Roast, Prep Block (Stone-Bronze Age) + public static Item stew = (new ItemFoodMF("stew", 5, 1.0F, false, 0)).setFoodStats(1, 0.0F, 0.0F, 1.0F) + .setReturnItem(Items.bowl).setMaxStackSize(1); + public static Item oats = (new ItemFoodMF("oats", 5, 1.0F, false, 0)).setFoodStats(1, 0.0F, 0.8F, 0.2F) + .setReturnItem(Items.bowl).setMaxStackSize(1); + // T2 (Basic baking, stone oven, processed mixing) + // Util: Stone Oven, Prep Block (Bronze Age - Early Iron Age) + public static Item cheese_roll = (new ItemFoodMF("cheese_roll", 6, 1.0F, false, 0)) + .setFoodStats(2, 0.0F, 0.4F, 0.6F).setMaxStackSize(1); + public static Item jerky = (new ItemFoodMF("jerky", 6, 1.0F, true, 0)).setFoodStats(2, 0.0F, 0.0F, 1.0F) + .setMaxStackSize(8); + public static Item saussage_raw = (new ItemFoodMF("saussage_raw", 4, 1.0F, true, 0)) + .setFoodStats(2, 0.0F, 0.1F, 0.6F).setMaxStackSize(16); + public static Item saussage_cooked = (new ItemFoodMF("saussage_cooked", 8, 1.0F, true, 0)) + .setFoodStats(2, 0.0F, 0.2F, 0.8F).setMaxStackSize(16); + public static Item sweetroll_uniced = (new ItemFoodMF("sweetroll_uniced", 5, 1.0F, false, 0)) + .setFoodStats(2, 0.5F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64); + public static Item sweetroll = (new ItemMultiFood("sweetroll", 2, 3, 1.0F, false, 0)) + .setFoodStats(2, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible(); + public static Item sandwitch_meat = (new ItemMultiFood("sandwitch_meat", 2, 6, 1.0F, false, 0)) + .setFoodStats(2, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/sandwitch") + .setUnlocalizedName("sandwitch"); + public static Item sandwitch_big = (new ItemMultiFood("sandwitch_big", 4, 6, 1.0F, false, 1)) + .setFoodStats(2, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/sandwitchbig") + .setUnlocalizedName("sandwitch"); + // T3 (Quality baking, metal oven) + // Util: Metal Oven, Prep Block, Steel Tools (Mid Iron Age) + public static Item meatpie_slice = (new ItemFoodMF("meatpie_slice", 8, 1.0F, false, 0)) + .setFoodStats(3, 0.0F, 0.2F, 0.8F).setMaxStackSize(1); + public static Item pieslice_apple = (new ItemFoodMF("pieslice_apple", 5, 1.0F, false, 0)) + .setFoodStats(3, 0.8F, 0.2F, 0.0F).setEatTime(16).setAlwaysEdible().setAlwaysEdible() + .setTextureName("minefantasy2:food/applepie_slice").setMaxStackSize(1); + public static Item pieslice_berry = (new ItemFoodMF("pieslice_berry", 5, 1.0F, false, 0)) + .setFoodStats(3, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setAlwaysEdible() + .setTextureName("minefantasy2:food/berrypie_slice").setMaxStackSize(1); + // T4 (Advanced baking, multiple processes, temperature regulation) + // Util : Metal Oven, Prep Block, Full tool set, Proper kitchen setup (Mid Iron + // Age) + public static Item pieslice_shepards = (new ItemFoodMF("pieslice_shepards", 10, 1.0F, false, 1)) + .setFoodStats(4, 0.0F, 0.5F, 0.5F).setTextureName("minefantasy2:food/shepardspie_slice").setMaxStackSize(1); + public static Item cake_slice = (new ItemFoodMF("cake_slice", 3, 0.8F, false, 0)).setFoodStats(3, 1.0F, 0.0F, 0.0F) + .setEatTime(16).setAlwaysEdible().setMaxStackSize(1); + public static Item carrotcake_slice = (new ItemFoodMF("carrotcake_slice", 4, 0.8F, false, 0)) + .setFoodStats(4, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); + + // T5 (Advanced baking, multiple process, temperature regulation, many + // ingreedients) + public static Item choccake_slice = (new ItemFoodMF("choccake_slice", 4, 0.8F, false, 0)) + .setFoodStats(4, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); + // T6 (Perfeted meals, extremely difficylt to create) + public static Item bfcake_slice = (new ItemFoodMF("bfcake_slice", 6, 1.0F, false, 1)) + .setFoodStats(5, 1.0F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(1); + public static Item eclair_uniced = (new ItemFoodMF("eclair_uniced", 5, 1.0F, false, 0)) + .setFoodStats(5, 0.3F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64) + .setTextureName("minefantasy2:food/unfinished/eclair_uniced"); + public static Item eclair_empty = (new ItemFoodMF("eclair_empty", 5, 1.0F, false, 0)) + .setFoodStats(5, 0.5F, 0.0F, 0.0F).setEatTime(16).setAlwaysEdible().setMaxStackSize(64) + .setTextureName("minefantasy2:food/unfinished/eclair_empty"); + public static Item eclair = (new ItemMultiFood("eclair", 4, 4, 1.0F, false, 1)).setFoodStats(5, 1.0F, 0.0F, 0.0F) + .setEatTime(16).setAlwaysEdible().setMaxStackSize(1); + // MISC + public static Item cake_tin = new ItemComponentMF("cake_tin", 0).setCreativeTab(CreativeTabMF.tabFood); + public static Item pie_tray = new ItemComponentMF("pie_tin", 0).setStoragePlacement("bigplate", "tray") + .setCreativeTab(CreativeTabMF.tabFood); + public static Item icing = new ItemComponentMF("icing", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item custard = new ItemComponentMF("custard", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item coca_powder = new ItemComponentMF("coca_powder", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item chocolate = new ItemComponentMF("chocolate", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item chocchips = new ItemComponentMF("chocchips", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item berries = (new ItemFoodMF("berries", 2, 2.0F, false)).setEatTime(10).setStaminaRestore(10F) + .setAlwaysEdible(); + public static Item berriesJuicy = (new ItemFoodMF("berriesJuicy", 3, 5.0F, false)).setEatTime(10) + .setStaminaRestore(25F).setRarity(1).setAlwaysEdible(); + public static Item sweetroll_raw = new ItemUnfinishedFood("sweetroll_raw").setMaxStackSize(64); + public static Item eclair_raw = new ItemUnfinishedFood("eclair_raw").setMaxStackSize(64); + public static Item cake_raw = new ItemUnfinishedFood("cake_raw"); + public static Item cake_simple_raw = new ItemUnfinishedFood("cake_simple_raw"); + public static Item cake_carrot_raw = new ItemUnfinishedFood("cake_carrot_raw"); + public static Item cake_choc_raw = new ItemUnfinishedFood("cake_choc_raw"); + public static Item cake_bf_raw = new ItemUnfinishedFood("cake_bf_raw"); + public static Item cake_uniced = new ItemUnfinishedFood("cake_uniced").setContainerItem(cake_tin); + public static Item cake_simple_uniced = new ItemUnfinishedFood("cake_simple_uniced").setContainerItem(cake_tin); + public static Item cake_carrot_uniced = new ItemUnfinishedFood("cake_carrot_uniced").setContainerItem(cake_tin); + public static Item cake_choc_uniced = new ItemUnfinishedFood("cake_choc_uniced").setContainerItem(cake_tin); + public static Item cake_bf_uniced = new ItemUnfinishedFood("cake_bf_uniced").setContainerItem(cake_tin); + public static Item pie_meat_uncooked = new ItemUnfinishedFood("pie_meat_uncooked") + .setTextureName("minefantasy2:food/unfinished/pie_meat_uncooked"); + public static Item pie_apple_uncooked = new ItemUnfinishedFood("pie_apple_uncooked"); + public static Item pie_berry_uncooked = new ItemUnfinishedFood("pie_berry_uncooked"); + public static Item pie_shepard_uncooked = new ItemUnfinishedFood("pie_shepard_uncooked"); + public static Item pie_pumpkin_uncooked = new ItemUnfinishedFood("pie_pumpkin_uncooked"); + public static Item pie_meat_cooked = new ItemUnfinishedFood("pie_meat_cooked") + .setTextureName("minefantasy2:food/unfinished/pie_meat_cooked").setContainerItem(pie_tray); + public static Item pie_apple_cooked = new ItemUnfinishedFood("pie_apple_cooked").setContainerItem(pie_tray); + public static Item pie_berry_cooked = new ItemUnfinishedFood("pie_berry_cooked").setContainerItem(pie_tray); + public static Item pie_shepard_cooked = new ItemUnfinishedFood("pie_shepard_cooked").setContainerItem(pie_tray); + public static Item pie_pumpkin_cooked = new ItemUnfinishedFood("pie_pumpkin_cooked").setContainerItem(pie_tray); + public static Item salt = new ItemComponentMF("salt", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item sugarpot = new ItemComponentMF("sugarpot", 0).setCreativeTab(CreativeTabMF.tabFood) + .setContainerItem(ComponentListMF.clay_pot); + public static Item bowl_water_salt = new ItemComponentMF("bowl_water_salt", 0) + .setCreativeTab(CreativeTabMF.tabFood); + public static Item dough = new ItemUnfinishedFood("dough").setMaxStackSize(64); + public static Item pastry = new ItemUnfinishedFood("pastry").setMaxStackSize(64); + public static Item raw_bread = new ItemUnfinishedFood("raw_bread").setMaxStackSize(64); + public static Item jug_uncooked = new ItemJug("uncooked"); + public static Item jug_empty = new ItemJug("empty").setStoragePlacement("jug", "jug"); + public static Item jug_water = new ItemJug("water").setStoragePlacement("jug", "jugwater") + .setContainerItem(jug_empty); + public static Item jug_milk = new ItemJug("milk").setStoragePlacement("jug", "jugmilk").setContainerItem(jug_empty); + public static Item burnt_food = new ItemBurntFood("burnt_food"); + public static Item burnt_pot = new ItemBurntFood("burnt_pot").setContainerItem(ComponentListMF.clay_pot); + public static Item burnt_pie = new ItemBurntFood("burnt_pie").setContainerItem(pie_tray); + // SPECIAL RECIPES + public static Item burnt_cake = new ItemBurntFood("burnt_cake").setContainerItem(cake_tin); + + public static void load() { + CookRecipe.burnt_food = burnt_food; + } + + /** + * FOOD TYPES: Sugar: Stamina Regen Dairy: Saturation Grain: Stamina Max + * + * Protien: Saturation / Stamina Max Fruit: Stamina Max / Stamina Time + * Vegetable: Stamina Time / Saturation + */ } diff --git a/src/main/java/minefantasy/mf2/item/food/ItemFoodMF.java b/src/main/java/minefantasy/mf2/item/food/ItemFoodMF.java index 42c361f4..942918db 100644 --- a/src/main/java/minefantasy/mf2/item/food/ItemFoodMF.java +++ b/src/main/java/minefantasy/mf2/item/food/ItemFoodMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.item.food; -import java.text.DecimalFormat; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,315 +23,306 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.text.DecimalFormat; +import java.util.List; + public class ItemFoodMF extends ItemFood { - private static final String eatDelayNBT = "MF_EatenFoodDelay"; - private float staminaRestore = 0F; - private Item leftOver; - private float mfSaturation = 0F; - protected int hungerLevel; - protected float saturationLevel; - - public ItemFoodMF(String name, int hunger, float saturation, boolean isMeat) { - super(hunger, 0F, isMeat); - - hungerLevel = hunger; - saturationLevel = saturation; - setCreativeTab(CreativeTabMF.tabFood); - GameRegistry.registerItem(this, "MF2_food_" + name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - this.setTextureName("minefantasy2:food/" + name); - } - - public ItemFoodMF(String name, int hunger, float saturation, boolean isMeat, int rarity) { - this(name, hunger, saturation, isMeat); - itemRarity = rarity; - } - - protected void onMFFoodEaten(ItemStack food, World world, EntityPlayer consumer) { - if (StaminaBar.isSystemActive) { - if (staminaRestore > 0) { - StaminaBar.modifyStaminaValue(consumer, staminaRestore); - } - if (staminaSeconds > 0) { - StaminaBar.buffStamina(consumer, staminaBuff, staminaSeconds); - } - if (staminaRegenSeconds > 0) { - StaminaBar.buffStaminaRegen(consumer, staminaRegenBuff, staminaRegenSeconds); - } - } - if (mfSaturation > 0) { - int foodLeftOver = consumer.getFoodStats().getFoodLevel(); - - float saturation = mfSaturation - (20 - foodLeftOver); - - if (saturation > 0) { - HungerSystemMF.applySaturation(consumer, saturation); - - } - } - - if (this == FoodListMF.berriesJuicy) { - PotionEffect poison = consumer.getActivePotionEffect(Potion.poison); - if (poison != null) { - poison.addCurativeItem(food); - consumer.curePotionEffects(food); - } - } - } - - public ItemFoodMF setRarity(int i) { - itemRarity = i; - return this; - } - - public ItemFoodMF setStaminaRestore(float f) { - staminaRestore = f; - hasEffect = true; - return this; - } - - /** - * Grade Sugar, Carbs and Fats from 0-1 and tier does the rest 0 means - * non-existent - * - * @param sugar - * restore stamina and add regen - * @param carbs - * increase max stamina for 1 hr - * @param fats - * saturation - */ - public ItemFoodMF setFoodStats(int tier, float sugar, float carbs, float fats) { - return setFoodStats(sugar * tier, carbs * tier, fats * tier); - } - - /** - * New system for setting food vales: Values should be based on tier value (t1, - * t2, t3,...,tx) 0 means non-existent - * - * @param sugar - * restore stamina and add regen - * @param carbs - * increase max stamina for 1 hr - * @param fats - * saturation - */ - public ItemFoodMF setFoodStats(float sugar, float carbs, float fats) { - if (sugar > 0) { - setStaminaRestore((int) (sugar * 50)); - setStaminaRegenModifier((int) sugar, sugar / 30); - } - if (carbs > 0) { - setStaminaModifier(50 * carbs, 1F); - } - if (fats > 0) { - setSaturation(10 * fats); - } - return this; - } - - public ItemFoodMF setSaturation(float amount) { - hasEffect = true; - this.mfSaturation = amount * FoodListMF.satModifier; - return this; - } - - public ItemFoodMF setStaminaModifier(float buff, float hours) { - int secondsLasting = (int) (hours * 3600F); - staminaBuff = buff; - staminaSeconds = secondsLasting; - staminaInMinutes = secondsLasting > 60; - staminaInHours = secondsLasting > 3600; - hasEffect = true; - return this; - } - - public ItemFoodMF setStaminaRegenModifier(float buff, float minutesLasting) { - int secondsLasting = (int) (minutesLasting * 60F); - staminaRegenBuff = buff; - staminaRegenSeconds = secondsLasting; - staminaRegenInMinutes = secondsLasting > 60; - hasEffect = true; - return this; - } - - public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack food, EntityPlayer user, List list, boolean extra) { - super.addInformation(food, user, list, extra); - list.add(StatCollector.translateToLocalFormatted("food.stat.hunger.name", hungerLevel)); - - if (hasEffect && ClientItemsMF.showSpecials(food, user, list, extra)) { - list.add(""); - list.add(EnumChatFormatting.WHITE + StatCollector.translateToLocal("food.stat.list.name")); - if (mfSaturation > 0) { - list.add(StatCollector.translateToLocalFormatted("food.stat.saturation.name", - decimal_format.format(mfSaturation))); - } - if (staminaRestore > 0) { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminaPlus.name", (int) staminaRestore)); - } - if (staminaBuff > 0) { - if (staminaInHours) { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffHours.name", - decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds / 3600F))); - } else if (staminaInMinutes) { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffMinutes.name", - decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds / 60F))); - } else { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffSeconds.name", - decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds))); - } - } - if (staminaRegenBuff > 0) { - if (staminaRegenInMinutes) { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffRegenMinutes.name", - decimal_format.format(staminaRegenBuff), decimal_format.format(staminaRegenSeconds / 60F))); - } else { - list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffRegenSeconds.name", - decimal_format.format(staminaRegenBuff), decimal_format.format(staminaRegenSeconds))); - } - } - } - if (this == FoodListMF.berriesJuicy) { - list.add(StatCollector.translateToLocal("food.stat.cure.poison")); - } - } - - public int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - int lvl = itemRarity + 1; - - if (item.isItemEnchanted()) { - if (lvl == 0) { - lvl++; - } - lvl++; - } - if (lvl >= ToolListMF.rarity.length) { - lvl = ToolListMF.rarity.length - 1; - } - return ToolListMF.rarity[lvl]; - } - - private boolean hasEffect = false; - private float staminaBuff = 0F; - private int staminaSeconds = 0; - private boolean staminaInMinutes = false; - private boolean staminaInHours = false; - - private float staminaRegenBuff = 0F; - private int staminaRegenSeconds = 0; - private boolean staminaRegenInMinutes = false; - - private static final String leftOverNbt = "MF_Food_leftover"; - - public ItemFoodMF setReturnItem(Item item) { - leftOver = item; - return this; - } - - @Override - public ItemStack onEaten(ItemStack food, World world, EntityPlayer consumer) { - setEatDelay(consumer, 10); - consumer.getFoodStats().func_151686_a(this, food); - world.playSoundAtEntity(consumer, "random.burp", 0.5F, world.rand.nextFloat() * 0.1F + 0.9F); - this.onMFFoodEaten(food, world, consumer); - - if (this.isDamageable())// Multifood - { - if (food.attemptDamageItem(1, consumer.getRNG())) { - --food.stackSize; - if (food.stackSize < 0) { - food.stackSize = 0; - } - } - } else// Food - { - ItemStack left = getLeftOver(food); - if (left != null) { - if (food.stackSize == 1) { - return left; - } - if (!consumer.inventory.addItemStackToInventory(left) && !consumer.worldObj.isRemote) { - consumer.entityDropItem(left, 1.0F); - } - } - --food.stackSize; - } - return food; - } - - public static void setLeftOver(ItemStack food, ItemStack leftover) { - if (!food.hasTagCompound()) { - food.setTagCompound(new NBTTagCompound()); - } - NBTTagCompound savedItem = new NBTTagCompound(); - leftover.writeToNBT(savedItem); - food.getTagCompound().setTag(leftOverNbt, savedItem); - } - - protected ItemStack getLeftOver(ItemStack food) { - if (food.hasTagCompound() && food.getTagCompound().hasKey(leftOverNbt)) { - return ItemStack.loadItemStackFromNBT(food.getTagCompound().getCompoundTag(leftOverNbt)); - } - if (leftOver != null) { - return new ItemStack(leftOver); - } - return getContainerItem(food); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - ItemStack food = new ItemStack(item); - if (this.getUnlocalizedName().contains("stew")) { - setLeftOver(food, new ItemStack(Items.bowl)); - } - list.add(food); - } - - private int useTime = 32; - - public ItemFoodMF setEatTime(int i) { - useTime = i; - return this; - } - - @Override - public int getMaxItemUseDuration(ItemStack item) { - return useTime; - } - - public static void onTick(EntityPlayer player) { - int time = getEatDelay(player); - if (time > 0) { - time--; - setEatDelay(player, time); - } - } - - private static void setEatDelay(EntityPlayer player, int time) { - time += getEatDelay(player);// add to existing - - player.getEntityData().setInteger(eatDelayNBT, time); - } - - private static int getEatDelay(EntityPlayer player) { - if (player.getEntityData().hasKey(eatDelayNBT)) { - return player.getEntityData().getInteger(eatDelayNBT); - } - return 0; - } - - @Override - public ItemStack onItemRightClick(ItemStack food, World world, EntityPlayer user) { - if (getEatDelay(user) > 0) { - return food; - } - return super.onItemRightClick(food, world, user); - } + public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); + private static final String eatDelayNBT = "MF_EatenFoodDelay"; + private static final String leftOverNbt = "MF_Food_leftover"; + public int itemRarity; + protected int hungerLevel; + protected float saturationLevel; + private float staminaRestore = 0F; + private Item leftOver; + private float mfSaturation = 0F; + private boolean hasEffect = false; + private float staminaBuff = 0F; + private int staminaSeconds = 0; + private boolean staminaInMinutes = false; + private boolean staminaInHours = false; + private float staminaRegenBuff = 0F; + private int staminaRegenSeconds = 0; + private boolean staminaRegenInMinutes = false; + private int useTime = 32; + + public ItemFoodMF(String name, int hunger, float saturation, boolean isMeat) { + super(hunger, 0F, isMeat); + + hungerLevel = hunger; + saturationLevel = saturation; + setCreativeTab(CreativeTabMF.tabFood); + GameRegistry.registerItem(this, "MF2_food_" + name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + this.setTextureName("minefantasy2:food/" + name); + } + + public ItemFoodMF(String name, int hunger, float saturation, boolean isMeat, int rarity) { + this(name, hunger, saturation, isMeat); + itemRarity = rarity; + } + + public static void setLeftOver(ItemStack food, ItemStack leftover) { + if (!food.hasTagCompound()) { + food.setTagCompound(new NBTTagCompound()); + } + NBTTagCompound savedItem = new NBTTagCompound(); + leftover.writeToNBT(savedItem); + food.getTagCompound().setTag(leftOverNbt, savedItem); + } + + public static void onTick(EntityPlayer player) { + int time = getEatDelay(player); + if (time > 0) { + time--; + setEatDelay(player, time); + } + } + + private static void setEatDelay(EntityPlayer player, int time) { + time += getEatDelay(player);// add to existing + + player.getEntityData().setInteger(eatDelayNBT, time); + } + + private static int getEatDelay(EntityPlayer player) { + if (player.getEntityData().hasKey(eatDelayNBT)) { + return player.getEntityData().getInteger(eatDelayNBT); + } + return 0; + } + + protected void onMFFoodEaten(ItemStack food, World world, EntityPlayer consumer) { + if (StaminaBar.isSystemActive) { + if (staminaRestore > 0) { + StaminaBar.modifyStaminaValue(consumer, staminaRestore); + } + if (staminaSeconds > 0) { + StaminaBar.buffStamina(consumer, staminaBuff, staminaSeconds); + } + if (staminaRegenSeconds > 0) { + StaminaBar.buffStaminaRegen(consumer, staminaRegenBuff, staminaRegenSeconds); + } + } + if (mfSaturation > 0) { + int foodLeftOver = consumer.getFoodStats().getFoodLevel(); + + float saturation = mfSaturation - (20 - foodLeftOver); + + if (saturation > 0) { + HungerSystemMF.applySaturation(consumer, saturation); + + } + } + + if (this == FoodListMF.berriesJuicy) { + PotionEffect poison = consumer.getActivePotionEffect(Potion.poison); + if (poison != null) { + poison.addCurativeItem(food); + consumer.curePotionEffects(food); + } + } + } + + public ItemFoodMF setRarity(int i) { + itemRarity = i; + return this; + } + + public ItemFoodMF setStaminaRestore(float f) { + staminaRestore = f; + hasEffect = true; + return this; + } + + /** + * Grade Sugar, Carbs and Fats from 0-1 and tier does the rest 0 means + * non-existent + * + * @param sugar restore stamina and add regen + * @param carbs increase max stamina for 1 hr + * @param fats saturation + */ + public ItemFoodMF setFoodStats(int tier, float sugar, float carbs, float fats) { + return setFoodStats(sugar * tier, carbs * tier, fats * tier); + } + + /** + * New system for setting food vales: Values should be based on tier value (t1, + * t2, t3,...,tx) 0 means non-existent + * + * @param sugar restore stamina and add regen + * @param carbs increase max stamina for 1 hr + * @param fats saturation + */ + public ItemFoodMF setFoodStats(float sugar, float carbs, float fats) { + if (sugar > 0) { + setStaminaRestore((int) (sugar * 50)); + setStaminaRegenModifier((int) sugar, sugar / 30); + } + if (carbs > 0) { + setStaminaModifier(50 * carbs, 1F); + } + if (fats > 0) { + setSaturation(10 * fats); + } + return this; + } + + public ItemFoodMF setSaturation(float amount) { + hasEffect = true; + this.mfSaturation = amount * FoodListMF.satModifier; + return this; + } + + public ItemFoodMF setStaminaModifier(float buff, float hours) { + int secondsLasting = (int) (hours * 3600F); + staminaBuff = buff; + staminaSeconds = secondsLasting; + staminaInMinutes = secondsLasting > 60; + staminaInHours = secondsLasting > 3600; + hasEffect = true; + return this; + } + + public ItemFoodMF setStaminaRegenModifier(float buff, float minutesLasting) { + int secondsLasting = (int) (minutesLasting * 60F); + staminaRegenBuff = buff; + staminaRegenSeconds = secondsLasting; + staminaRegenInMinutes = secondsLasting > 60; + hasEffect = true; + return this; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack food, EntityPlayer user, List list, boolean extra) { + super.addInformation(food, user, list, extra); + list.add(StatCollector.translateToLocalFormatted("food.stat.hunger.name", hungerLevel)); + + if (hasEffect && ClientItemsMF.showSpecials(food, user, list, extra)) { + list.add(""); + list.add(EnumChatFormatting.WHITE + StatCollector.translateToLocal("food.stat.list.name")); + if (mfSaturation > 0) { + list.add(StatCollector.translateToLocalFormatted("food.stat.saturation.name", + decimal_format.format(mfSaturation))); + } + if (staminaRestore > 0) { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminaPlus.name", (int) staminaRestore)); + } + if (staminaBuff > 0) { + if (staminaInHours) { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffHours.name", + decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds / 3600F))); + } else if (staminaInMinutes) { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffMinutes.name", + decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds / 60F))); + } else { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffSeconds.name", + decimal_format.format(staminaBuff), decimal_format.format(staminaSeconds))); + } + } + if (staminaRegenBuff > 0) { + if (staminaRegenInMinutes) { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffRegenMinutes.name", + decimal_format.format(staminaRegenBuff), decimal_format.format(staminaRegenSeconds / 60F))); + } else { + list.add(StatCollector.translateToLocalFormatted("food.stat.staminabuffRegenSeconds.name", + decimal_format.format(staminaRegenBuff), decimal_format.format(staminaRegenSeconds))); + } + } + } + if (this == FoodListMF.berriesJuicy) { + list.add(StatCollector.translateToLocal("food.stat.cure.poison")); + } + } + + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = itemRarity + 1; + + if (item.isItemEnchanted()) { + if (lvl == 0) { + lvl++; + } + lvl++; + } + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; + } + return ToolListMF.rarity[lvl]; + } + + public ItemFoodMF setReturnItem(Item item) { + leftOver = item; + return this; + } + + @Override + public ItemStack onEaten(ItemStack food, World world, EntityPlayer consumer) { + setEatDelay(consumer, 10); + consumer.getFoodStats().func_151686_a(this, food); + world.playSoundAtEntity(consumer, "random.burp", 0.5F, world.rand.nextFloat() * 0.1F + 0.9F); + this.onMFFoodEaten(food, world, consumer); + + if (this.isDamageable())// Multifood + { + if (food.attemptDamageItem(1, consumer.getRNG())) { + --food.stackSize; + if (food.stackSize < 0) { + food.stackSize = 0; + } + } + } else// Food + { + ItemStack left = getLeftOver(food); + if (left != null) { + if (food.stackSize == 1) { + return left; + } + if (!consumer.inventory.addItemStackToInventory(left) && !consumer.worldObj.isRemote) { + consumer.entityDropItem(left, 1.0F); + } + } + --food.stackSize; + } + return food; + } + + protected ItemStack getLeftOver(ItemStack food) { + if (food.hasTagCompound() && food.getTagCompound().hasKey(leftOverNbt)) { + return ItemStack.loadItemStackFromNBT(food.getTagCompound().getCompoundTag(leftOverNbt)); + } + if (leftOver != null) { + return new ItemStack(leftOver); + } + return getContainerItem(food); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + ItemStack food = new ItemStack(item); + if (this.getUnlocalizedName().contains("stew")) { + setLeftOver(food, new ItemStack(Items.bowl)); + } + list.add(food); + } + + public ItemFoodMF setEatTime(int i) { + useTime = i; + return this; + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + return useTime; + } + + @Override + public ItemStack onItemRightClick(ItemStack food, World world, EntityPlayer user) { + if (getEatDelay(user) > 0) { + return food; + } + return super.onItemRightClick(food, world, user); + } } diff --git a/src/main/java/minefantasy/mf2/item/food/ItemMultiFood.java b/src/main/java/minefantasy/mf2/item/food/ItemMultiFood.java index 4ca273d9..5034a9d5 100644 --- a/src/main/java/minefantasy/mf2/item/food/ItemMultiFood.java +++ b/src/main/java/minefantasy/mf2/item/food/ItemMultiFood.java @@ -8,44 +8,44 @@ import net.minecraft.util.MathHelper; public class ItemMultiFood extends ItemFoodMF { - private IIcon[] icons; - private int bites = 6; - - public ItemMultiFood(String name, int bites, int hunger, float saturation, int rarity) { - this(name, bites, hunger, saturation, false, rarity); - } - - public ItemMultiFood(String name, int bites, int hunger, float saturation, boolean meat, int rarity) { - super(name, hunger, saturation, meat, rarity); - setMaxStackSize(1); - this.bites = bites; - setMaxDamage(bites - 1); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int damage) { - int index = MathHelper.clamp_int(damage, 0, bites - 1); - return this.icons[index]; - } - - @Override - public boolean isRepairable() { - return false; - } - - @Override - public boolean isItemTool(ItemStack item) { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister register) { - this.icons = new IIcon[bites]; - - for (int i = 0; i < bites; ++i) { - this.icons[i] = register.registerIcon(this.getIconString() + "_" + i); - } - } + private IIcon[] icons; + private int bites = 6; + + public ItemMultiFood(String name, int bites, int hunger, float saturation, int rarity) { + this(name, bites, hunger, saturation, false, rarity); + } + + public ItemMultiFood(String name, int bites, int hunger, float saturation, boolean meat, int rarity) { + super(name, hunger, saturation, meat, rarity); + setMaxStackSize(1); + this.bites = bites; + setMaxDamage(bites - 1); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int damage) { + int index = MathHelper.clamp_int(damage, 0, bites - 1); + return this.icons[index]; + } + + @Override + public boolean isRepairable() { + return false; + } + + @Override + public boolean isItemTool(ItemStack item) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister register) { + this.icons = new IIcon[bites]; + + for (int i = 0; i < bites; ++i) { + this.icons[i] = register.registerIcon(this.getIconString() + "_" + i); + } + } } diff --git a/src/main/java/minefantasy/mf2/item/food/ItemUnfinishedFood.java b/src/main/java/minefantasy/mf2/item/food/ItemUnfinishedFood.java index 12a903a6..187221af 100644 --- a/src/main/java/minefantasy/mf2/item/food/ItemUnfinishedFood.java +++ b/src/main/java/minefantasy/mf2/item/food/ItemUnfinishedFood.java @@ -13,38 +13,38 @@ * @author Anonymous Productions */ public class ItemUnfinishedFood extends Item { - public ItemUnfinishedFood(String name) { - this(name, 0); - } + private int itemRarity; - public ItemUnfinishedFood(String name, int rarity) { - super(); - setMaxStackSize(1); - itemRarity = rarity; - setTextureName("minefantasy2:food/unfinished/" + name); - this.setCreativeTab(CreativeTabMF.tabFood); - GameRegistry.registerItem(this, "MF_UFood" + name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } + public ItemUnfinishedFood(String name) { + this(name, 0); + } - private int itemRarity; + public ItemUnfinishedFood(String name, int rarity) { + super(); + setMaxStackSize(1); + itemRarity = rarity; + setTextureName("minefantasy2:food/unfinished/" + name); + this.setCreativeTab(CreativeTabMF.tabFood); + GameRegistry.registerItem(this, "MF_UFood" + name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } - @Override - public EnumRarity getRarity(ItemStack item) { - int lvl = itemRarity + 1; + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = itemRarity + 1; - if (item.isItemEnchanted()) { - if (lvl == 0) { - lvl++; - } - lvl++; - } - if (lvl >= ToolListMF.rarity.length) { - lvl = ToolListMF.rarity.length - 1; - } - return ToolListMF.rarity[lvl]; - } + if (item.isItemEnchanted()) { + if (lvl == 0) { + lvl++; + } + lvl++; + } + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; + } + return ToolListMF.rarity[lvl]; + } - public void onCrafted(EntityPlayer user, ItemStack item) { - } + public void onCrafted(EntityPlayer user, ItemStack item) { + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/EnumCasingType.java b/src/main/java/minefantasy/mf2/item/gadget/EnumCasingType.java index 420378cb..46c47e02 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/EnumCasingType.java +++ b/src/main/java/minefantasy/mf2/item/gadget/EnumCasingType.java @@ -1,34 +1,34 @@ package minefantasy.mf2.item.gadget; public enum EnumCasingType { - CRUDE("crude", 0.5F, 3F, 1.0F), CERAMIC("ceramic", 1.0F, 5F, 1.0F), IRON("iron", 1.5F, 4F, - 2.0F), OBSIDIAN("obsidian", 2.0F, 4F, 1.5F), CRYSTAL("crystal", 1.5F, 5F, 0.75F); + CRUDE("crude", 0.5F, 3F, 1.0F), CERAMIC("ceramic", 1.0F, 5F, 1.0F), IRON("iron", 1.5F, 4F, + 2.0F), OBSIDIAN("obsidian", 2.0F, 4F, 1.5F), CRYSTAL("crystal", 1.5F, 5F, 0.75F); - public String name; - public float damageModifier; - public float rangeModifier; - public float weightModifier; + public String name; + public float damageModifier; + public float rangeModifier; + public float weightModifier; - private EnumCasingType(String name, float damage, float range, float weight) { - this.name = name; - this.damageModifier = damage; - this.rangeModifier = range; - this.weightModifier = weight; - } + private EnumCasingType(String name, float damage, float range, float weight) { + this.name = name; + this.damageModifier = damage; + this.rangeModifier = range; + this.weightModifier = weight; + } - public static EnumCasingType getType(byte i) { - if (i == -1) { - return CRUDE; - } - if (i == 1) { - return IRON; - } - if (i == 2) { - return OBSIDIAN; - } - if (i == 3) { - return CRYSTAL; - } - return CERAMIC; - } + public static EnumCasingType getType(byte i) { + if (i == -1) { + return CRUDE; + } + if (i == 1) { + return IRON; + } + if (i == 2) { + return OBSIDIAN; + } + if (i == 3) { + return CRYSTAL; + } + return CERAMIC; + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/EnumExplosiveType.java b/src/main/java/minefantasy/mf2/item/gadget/EnumExplosiveType.java index a9375e0b..9b405477 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/EnumExplosiveType.java +++ b/src/main/java/minefantasy/mf2/item/gadget/EnumExplosiveType.java @@ -1,25 +1,25 @@ package minefantasy.mf2.item.gadget; public enum EnumExplosiveType { - BASIC("basic", 24F, 1.0F), SHRAPNEL("shrapnel", 32F, 1.0F), FIRE("fire", 40F, 1.0F); + BASIC("basic", 24F, 1.0F), SHRAPNEL("shrapnel", 32F, 1.0F), FIRE("fire", 40F, 1.0F); - public String name; - public float damage; - public float range; + public String name; + public float damage; + public float range; - private EnumExplosiveType(String name, float damage, float range) { - this.name = name; - this.damage = damage; - this.range = range; - } + private EnumExplosiveType(String name, float damage, float range) { + this.name = name; + this.damage = damage; + this.range = range; + } - public static EnumExplosiveType getType(byte i) { - if (i == 1) { - return SHRAPNEL; - } - if (i == 2) { - return FIRE; - } - return BASIC; - } + public static EnumExplosiveType getType(byte i) { + if (i == 1) { + return SHRAPNEL; + } + if (i == 2) { + return FIRE; + } + return BASIC; + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/EnumFuseType.java b/src/main/java/minefantasy/mf2/item/gadget/EnumFuseType.java index 053added..064945ad 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/EnumFuseType.java +++ b/src/main/java/minefantasy/mf2/item/gadget/EnumFuseType.java @@ -1,20 +1,20 @@ package minefantasy.mf2.item.gadget; public enum EnumFuseType { - BASIC("basic", 30), LONGFUSE("long", 60); + BASIC("basic", 30), LONGFUSE("long", 60); - public String name; - public int time; + public String name; + public int time; - private EnumFuseType(String name, int time) { - this.name = name; - this.time = time; - } + private EnumFuseType(String name, int time) { + this.name = name; + this.time = time; + } - public static EnumFuseType getType(byte i) { - if (i == 1) { - return LONGFUSE; - } - return BASIC; - } + public static EnumFuseType getType(byte i) { + if (i == 1) { + return LONGFUSE; + } + return BASIC; + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/EnumPowderType.java b/src/main/java/minefantasy/mf2/item/gadget/EnumPowderType.java index 4c802972..46639e3c 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/EnumPowderType.java +++ b/src/main/java/minefantasy/mf2/item/gadget/EnumPowderType.java @@ -1,22 +1,22 @@ package minefantasy.mf2.item.gadget; public enum EnumPowderType { - BLACKPOWDER("blackpowder", 1.0F, 1.0F), ADVBLACKPOWDER("advBlackpowder", 1.5F, 1.0F); + BLACKPOWDER("blackpowder", 1.0F, 1.0F), ADVBLACKPOWDER("advBlackpowder", 1.5F, 1.0F); - public String name; - public float damageModifier; - public float rangeModifier; + public String name; + public float damageModifier; + public float rangeModifier; - private EnumPowderType(String name, float damage, float range) { - this.name = name; - this.damageModifier = damage; - this.rangeModifier = range; - } + private EnumPowderType(String name, float damage, float range) { + this.name = name; + this.damageModifier = damage; + this.rangeModifier = range; + } - public static EnumPowderType getType(byte i) { - if (i == 1) { - return ADVBLACKPOWDER; - } - return BLACKPOWDER; - } + public static EnumPowderType getType(byte i) { + if (i == 1) { + return ADVBLACKPOWDER; + } + return BLACKPOWDER; + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/IScope.java b/src/main/java/minefantasy/mf2/item/gadget/IScope.java index 598b381c..588f5e49 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/IScope.java +++ b/src/main/java/minefantasy/mf2/item/gadget/IScope.java @@ -3,5 +3,5 @@ import net.minecraft.item.ItemStack; public interface IScope { - public float getZoom(ItemStack item); + public float getZoom(ItemStack item); } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemArtefactLoot.java b/src/main/java/minefantasy/mf2/item/gadget/ItemArtefactLoot.java index 7880cbe0..830d1145 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemArtefactLoot.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemArtefactLoot.java @@ -1,9 +1,9 @@ package minefantasy.mf2.item.gadget; public class ItemArtefactLoot extends ItemLootSack { - public ItemArtefactLoot(String name, String pool, int ammount) { - super(name, ammount, 2); - this.pool = pool; - setTextureName("minefantasy2:artefact/box/" + name); - } + public ItemArtefactLoot(String name, String pool, int ammount) { + super(name, ammount, 2); + this.pool = pool; + setTextureName("minefantasy2:artefact/box/" + name); + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemBomb.java b/src/main/java/minefantasy/mf2/item/gadget/ItemBomb.java index 3d4df858..d29f616e 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemBomb.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemBomb.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -27,295 +25,296 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.List; + public class ItemBomb extends Item implements ISpecialSalvage, IAmmo { - public ItemBomb(String name) { - this.maxStackSize = 16; - this.setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - BlockDispenser.dispenseBehaviorRegistry.putObject(this, new BombDispenser()); - } - - @Override - public EnumAction getItemUseAction(ItemStack item) { - return EnumAction.block; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (!user.isSwingInProgress) { - world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "fire.ignite", 1.0F, - itemRand.nextFloat() * 0.4F + 0.8F); - world.playSoundEffect(user.posX, user.posY + 1.5, user.posZ, "game.tnt.primed", 1.0F, 1.0F); - user.setItemInUse(item, getMaxItemUseDuration(item)); - } - return item; - } - - @Override - public int getMaxItemUseDuration(ItemStack item) { - return 15; - } - - @Override - public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { - user.swingItem(); - if (!user.capabilities.isCreativeMode) { - --item.stackSize; - } - - if (!world.isRemote) { - EntityBomb bomb = new EntityBomb(world, user).setType(getFilling(item), getCasing(item), getFuse(item), - getPowder(item)); - world.spawnEntityInWorld(bomb); - if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { - bomb.getEntityData().setBoolean("stickyBomb", true); - } - } - return item; - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - super.addInformation(item, user, list, fullInfo); - - if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { - list.add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("bomb.case.sticky") - + EnumChatFormatting.GRAY); - } - EnumExplosiveType fill = EnumExplosiveType.getType(getFilling(item)); - EnumCasingType casing = EnumCasingType.getType(getCasing(item)); - EnumFuseType fuse = EnumFuseType.getType(getFuse(item)); - EnumPowderType powder = EnumPowderType.getType(getPowder(item)); - - int damage = (int) (fill.damage * casing.damageModifier * powder.damageModifier); - float range = fill.range * casing.rangeModifier * powder.rangeModifier; - float fusetime = fuse.time / 20F; - - list.add(StatCollector.translateToLocal("bomb.case." + casing.name + ".name")); - list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); - list.add(StatCollector.translateToLocal("bomb.fuse." + fuse.name + ".name")); - list.add(""); - list.add(StatCollector.translateToLocalFormatted("bomb.fusetime.name", fusetime)); - list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); - list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); - } - - @Override - public String getUnlocalizedName(ItemStack item) { - EnumExplosiveType type = EnumExplosiveType.getType(getFilling(item)); - return "item.bomb_" + type.name; - } - - private static final String powderNBT = "MineFantasy_PowderType"; - private static final String fuseNBT = "MineFantasy_FuseType"; - private static final String fillingNBT = "MineFantasy_ExplosiveType"; - private static final String casingNBT = "MineFantasy_CaseType"; - - public static void setSticky(ItemStack item) { - NBTTagCompound nbt = getNBT(item); - nbt.setBoolean("stickyBomb", true); - } - - public static void setFuse(ItemStack item, byte fuse) { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(fuseNBT, fuse); - } - - public static byte getFuse(ItemStack item) { - NBTTagCompound nbt = getNBT(item); - if (item.getItem() instanceof ItemBomb) { - return ((ItemBomb) item.getItem()).getItemFuse(nbt.getByte(fuseNBT)); - } - return nbt.getByte(fuseNBT); - } - - public static void setPowder(ItemStack item, byte powder) { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(powderNBT, powder); - } - - public static byte getPowder(ItemStack item) { - NBTTagCompound nbt = getNBT(item); - if (item.getItem() instanceof ItemBomb) { - return ((ItemBomb) item.getItem()).getItemPowder(nbt.getByte(powderNBT)); - } - return nbt.getByte(powderNBT); - } - - /** - * 0 = Basic 1 = Shrapnel 2 = Fire - */ - public static void setFilling(ItemStack item, byte filling) { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(fillingNBT, filling); - } - - public static byte getFilling(ItemStack item) { - NBTTagCompound nbt = getNBT(item); - if (item.getItem() instanceof ItemBomb) { - return ((ItemBomb) item.getItem()).getItemFilling(nbt.getByte(fillingNBT)); - } - return nbt.getByte(fillingNBT); - } - - /** - * 0 = Ceramic 1 = Iron - */ - public static void setCasing(ItemStack item, byte casing) { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(casingNBT, casing); - } - - public static byte getCasing(ItemStack item) { - NBTTagCompound nbt = getNBT(item); - if (item.getItem() instanceof ItemBomb) { - return ((ItemBomb) item.getItem()).getItemCasing(nbt.getByte(casingNBT)); - } - return nbt.getByte(casingNBT); - } - - public static NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) - item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - public static ItemStack createExplosive(Item item, byte casing, byte filling, byte fuse, byte powder, int stackSize, - boolean sticky) { - ItemStack bomb = new ItemStack(item, stackSize); - setFilling(bomb, filling); - setCasing(bomb, casing); - setFuse(bomb, fuse); - setPowder(bomb, powder); - if (sticky) { - setSticky(bomb); - } - return bomb; - } - - public static ItemStack createExplosive(Item item, byte casing, byte filling, byte fuse, byte powder, - int stackSize) { - return createExplosive(item, casing, filling, fuse, powder, stackSize, false); - } - - public ItemStack createBomb(byte casing, byte filling, byte fuse, byte powder, int stackSize) { - return ItemBomb.createExplosive(this, casing, filling, fuse, powder, stackSize); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - list.add(createBomb((byte) 0, (byte) 0, (byte) 0, (byte) 0, 1)); - list.add(createBomb((byte) 0, (byte) 1, (byte) 0, (byte) 0, 1)); - list.add(createBomb((byte) 0, (byte) 2, (byte) 0, (byte) 0, 1)); - - list.add(createBomb((byte) 1, (byte) 0, (byte) 0, (byte) 0, 1)); - list.add(createBomb((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1)); - list.add(createBomb((byte) 1, (byte) 2, (byte) 0, (byte) 0, 1)); - - list.add(createBomb((byte) 2, (byte) 0, (byte) 0, (byte) 0, 1)); - list.add(createBomb((byte) 2, (byte) 1, (byte) 0, (byte) 0, 1)); - list.add(createBomb((byte) 2, (byte) 2, (byte) 0, (byte) 0, 1)); - - list.add(createBomb((byte) 3, (byte) 0, (byte) 0, (byte) 0, 1)); - list.add(createBomb((byte) 3, (byte) 1, (byte) 0, (byte) 0, 1)); - list.add(createBomb((byte) 3, (byte) 2, (byte) 0, (byte) 0, 1)); - } - - // TODO Icons - @SideOnly(Side.CLIENT) - public IIcon getIcon(byte type) { - if (type < 0) { - return ToolListMF.bomb_crude.getIcon(type); - } - return bombs[type]; - } - - public IIcon[] icons = new IIcon[2]; - private IIcon[] bombs = new IIcon[4]; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - icons[0] = reg.registerIcon("minefantasy2:Other/bomb_icon_shrapnel"); - icons[1] = reg.registerIcon("minefantasy2:Other/bomb_icon_fire"); - - this.itemIcon = bombs[0] = reg.registerIcon("minefantasy2:Other/bomb_ceramic"); - bombs[1] = reg.registerIcon("minefantasy2:Other/bomb_iron"); - bombs[2] = reg.registerIcon("minefantasy2:Other/bomb_obsidian"); - bombs[3] = reg.registerIcon("minefantasy2:Other/bomb_crystal"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconIndex(ItemStack item) { - int type = getCasing(item); - return bombs[type]; - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack item, int layer) { - boolean sticky = item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb"); - if (layer == 0 && sticky) { - return Items.slime_ball.getIconFromDamage(0); - } - if (layer > (sticky ? 1 : 0)) { - int type = getFilling(item); - if (type != 0) { - return icons[type - 1]; - } - } - return getIconIndex(item); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return true; - } - - @Override - public EnumRarity getRarity(ItemStack item) { - if (getFilling(item) >= 2 || getCasing(item) >= 2) { - return EnumRarity.uncommon; - } - return EnumRarity.common; - } - - @Override - public Object[] getSalvage(ItemStack item) { - return new Object[] { ItemBombComponent.getBombComponent("bombcase", getCasing(item)), - ItemBombComponent.getBombComponent("fuse", getFuse(item)), - ItemBombComponent.getBombComponent("powder", getPowder(item)), - ItemBombComponent.getBombComponent("filling", getFilling(item)), }; - } - - public byte getItemFuse(byte value) { - return value; - } - - public byte getItemFilling(byte value) { - return value; - } - - public byte getItemCasing(byte value) { - return value; - } - - public byte getItemPowder(byte value) { - return value; - } - - @Override - public String getAmmoType(ItemStack arrow) { - return "mine"; - } + private static final String powderNBT = "MineFantasy_PowderType"; + private static final String fuseNBT = "MineFantasy_FuseType"; + private static final String fillingNBT = "MineFantasy_ExplosiveType"; + private static final String casingNBT = "MineFantasy_CaseType"; + public IIcon[] icons = new IIcon[2]; + private IIcon[] bombs = new IIcon[4]; + + public ItemBomb(String name) { + this.maxStackSize = 16; + this.setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + BlockDispenser.dispenseBehaviorRegistry.putObject(this, new BombDispenser()); + } + + public static void setSticky(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + nbt.setBoolean("stickyBomb", true); + } + + public static void setFuse(ItemStack item, byte fuse) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(fuseNBT, fuse); + } + + public static byte getFuse(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (item.getItem() instanceof ItemBomb) { + return ((ItemBomb) item.getItem()).getItemFuse(nbt.getByte(fuseNBT)); + } + return nbt.getByte(fuseNBT); + } + + public static void setPowder(ItemStack item, byte powder) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(powderNBT, powder); + } + + public static byte getPowder(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (item.getItem() instanceof ItemBomb) { + return ((ItemBomb) item.getItem()).getItemPowder(nbt.getByte(powderNBT)); + } + return nbt.getByte(powderNBT); + } + + /** + * 0 = Basic 1 = Shrapnel 2 = Fire + */ + public static void setFilling(ItemStack item, byte filling) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(fillingNBT, filling); + } + + public static byte getFilling(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (item.getItem() instanceof ItemBomb) { + return ((ItemBomb) item.getItem()).getItemFilling(nbt.getByte(fillingNBT)); + } + return nbt.getByte(fillingNBT); + } + + /** + * 0 = Ceramic 1 = Iron + */ + public static void setCasing(ItemStack item, byte casing) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(casingNBT, casing); + } + + public static byte getCasing(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (item.getItem() instanceof ItemBomb) { + return ((ItemBomb) item.getItem()).getItemCasing(nbt.getByte(casingNBT)); + } + return nbt.getByte(casingNBT); + } + + public static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + public static ItemStack createExplosive(Item item, byte casing, byte filling, byte fuse, byte powder, int stackSize, + boolean sticky) { + ItemStack bomb = new ItemStack(item, stackSize); + setFilling(bomb, filling); + setCasing(bomb, casing); + setFuse(bomb, fuse); + setPowder(bomb, powder); + if (sticky) { + setSticky(bomb); + } + return bomb; + } + + public static ItemStack createExplosive(Item item, byte casing, byte filling, byte fuse, byte powder, + int stackSize) { + return createExplosive(item, casing, filling, fuse, powder, stackSize, false); + } + + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.block; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!user.isSwingInProgress) { + world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "fire.ignite", 1.0F, + itemRand.nextFloat() * 0.4F + 0.8F); + world.playSoundEffect(user.posX, user.posY + 1.5, user.posZ, "game.tnt.primed", 1.0F, 1.0F); + user.setItemInUse(item, getMaxItemUseDuration(item)); + } + return item; + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + return 15; + } + + @Override + public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { + user.swingItem(); + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + + if (!world.isRemote) { + EntityBomb bomb = new EntityBomb(world, user).setType(getFilling(item), getCasing(item), getFuse(item), + getPowder(item)); + world.spawnEntityInWorld(bomb); + if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { + bomb.getEntityData().setBoolean("stickyBomb", true); + } + } + return item; + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); + + if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { + list.add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("bomb.case.sticky") + + EnumChatFormatting.GRAY); + } + EnumExplosiveType fill = EnumExplosiveType.getType(getFilling(item)); + EnumCasingType casing = EnumCasingType.getType(getCasing(item)); + EnumFuseType fuse = EnumFuseType.getType(getFuse(item)); + EnumPowderType powder = EnumPowderType.getType(getPowder(item)); + + int damage = (int) (fill.damage * casing.damageModifier * powder.damageModifier); + float range = fill.range * casing.rangeModifier * powder.rangeModifier; + float fusetime = fuse.time / 20F; + + list.add(StatCollector.translateToLocal("bomb.case." + casing.name + ".name")); + list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); + list.add(StatCollector.translateToLocal("bomb.fuse." + fuse.name + ".name")); + list.add(""); + list.add(StatCollector.translateToLocalFormatted("bomb.fusetime.name", fusetime)); + list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); + list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); + } + + @Override + public String getUnlocalizedName(ItemStack item) { + EnumExplosiveType type = EnumExplosiveType.getType(getFilling(item)); + return "item.bomb_" + type.name; + } + + public ItemStack createBomb(byte casing, byte filling, byte fuse, byte powder, int stackSize) { + return ItemBomb.createExplosive(this, casing, filling, fuse, powder, stackSize); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(createBomb((byte) 0, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 0, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 0, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createBomb((byte) 1, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 1, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createBomb((byte) 2, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 2, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 2, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createBomb((byte) 3, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 3, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createBomb((byte) 3, (byte) 2, (byte) 0, (byte) 0, 1)); + } + + // TODO Icons + @SideOnly(Side.CLIENT) + public IIcon getIcon(byte type) { + if (type < 0) { + return ToolListMF.bomb_crude.getIcon(type); + } + return bombs[type]; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + icons[0] = reg.registerIcon("minefantasy2:Other/bomb_icon_shrapnel"); + icons[1] = reg.registerIcon("minefantasy2:Other/bomb_icon_fire"); + + this.itemIcon = bombs[0] = reg.registerIcon("minefantasy2:Other/bomb_ceramic"); + bombs[1] = reg.registerIcon("minefantasy2:Other/bomb_iron"); + bombs[2] = reg.registerIcon("minefantasy2:Other/bomb_obsidian"); + bombs[3] = reg.registerIcon("minefantasy2:Other/bomb_crystal"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack item) { + int type = getCasing(item); + return bombs[type]; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack item, int layer) { + boolean sticky = item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb"); + if (layer == 0 && sticky) { + return Items.slime_ball.getIconFromDamage(0); + } + if (layer > (sticky ? 1 : 0)) { + int type = getFilling(item); + if (type != 0) { + return icons[type - 1]; + } + } + return getIconIndex(item); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + if (getFilling(item) >= 2 || getCasing(item) >= 2) { + return EnumRarity.uncommon; + } + return EnumRarity.common; + } + + @Override + public Object[] getSalvage(ItemStack item) { + return new Object[]{ItemBombComponent.getBombComponent("bombcase", getCasing(item)), + ItemBombComponent.getBombComponent("fuse", getFuse(item)), + ItemBombComponent.getBombComponent("powder", getPowder(item)), + ItemBombComponent.getBombComponent("filling", getFilling(item)),}; + } + + public byte getItemFuse(byte value) { + return value; + } + + public byte getItemFilling(byte value) { + return value; + } + + public byte getItemCasing(byte value) { + return value; + } + + public byte getItemPowder(byte value) { + return value; + } + + @Override + public String getAmmoType(ItemStack arrow) { + return "mine"; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemBombComponent.java b/src/main/java/minefantasy/mf2/item/gadget/ItemBombComponent.java index 6181361f..27a3d666 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemBombComponent.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemBombComponent.java @@ -1,8 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.HashMap; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.crafting.ISalvageDrop; @@ -14,49 +11,52 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import java.util.HashMap; +import java.util.List; + public class ItemBombComponent extends ItemComponentMF implements IBombComponent, ISalvageDrop { - private static HashMap components = new HashMap(); - - private byte tier; - private String type; - - public ItemBombComponent(String name, String type, int tier) { - this(name, 0, type, tier); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("bomb.component.name")); - list.add(EnumChatFormatting.ITALIC + StatCollector.translateToLocal("bomb.component." + type)); - } - - public ItemBombComponent(String name, int rarity, String type, int tier) { - super(name, rarity); - this.type = type; - this.tier = (byte) tier; - components.put(type + tier, this); - } - - @Override - public String getComponentType() { - return type; - } - - @Override - public byte getTier() { - return tier; - } - - public static Item getBombComponent(String name, int tier) { - return components.get(name + tier); - } - - @Override - public boolean canSalvage(EntityPlayer user, ItemStack item) { - if (getContainerItem() != null) { - return false; - } - return true; - } + private static HashMap components = new HashMap(); + + private byte tier; + private String type; + + public ItemBombComponent(String name, String type, int tier) { + this(name, 0, type, tier); + } + + public ItemBombComponent(String name, int rarity, String type, int tier) { + super(name, rarity); + this.type = type; + this.tier = (byte) tier; + components.put(type + tier, this); + } + + public static Item getBombComponent(String name, int tier) { + return components.get(name + tier); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("bomb.component.name")); + list.add(EnumChatFormatting.ITALIC + StatCollector.translateToLocal("bomb.component." + type)); + } + + @Override + public String getComponentType() { + return type; + } + + @Override + public byte getTier() { + return tier; + } + + @Override + public boolean canSalvage(EntityPlayer user, ItemStack item) { + if (getContainerItem() != null) { + return false; + } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemClimbingPick.java b/src/main/java/minefantasy/mf2/item/gadget/ItemClimbingPick.java index a62cf70c..8b74cdd8 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemClimbingPick.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemClimbingPick.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.ToolHelper; @@ -21,185 +19,186 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemClimbingPick extends ItemPickaxe implements IToolMaterial { - private Random rand = new Random(); - - public ItemClimbingPick(String name, ToolMaterial material, int rarity) { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabGadget); - - setTextureName("minefantasy2:Other/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - setMaxDamage(material.getMaxUses()); - } - - private int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - int lvl = itemRarity + 1; - - if (item.isItemEnchanted()) { - if (lvl == 0) { - lvl++; - } - lvl++; - } - if (lvl >= ToolListMF.rarity.length) { - lvl = ToolListMF.rarity.length - 1; - } - return ToolListMF.rarity[lvl]; - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - @Override - public int getMaxDamage(ItemStack stack) { - return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); - } - - public boolean isInWall(EntityPlayer player, boolean init) { - if (player.getHeldItem() == null) - return false; - - World world = player.worldObj; - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - - if (movingobjectposition == null) { - return false; - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int x = movingobjectposition.blockX; - int y = movingobjectposition.blockY; - int z = movingobjectposition.blockZ; - - NBTTagCompound nbt = getOrCreateNBT(player.getHeldItem()); - if (init) { - nbt.setInteger("MF_HeldPosX", x); - nbt.setInteger("MF_HeldPosY", y); - nbt.setInteger("MF_HeldPosZ", z); - } else { - int x1 = nbt.getInteger("MF_HeldPosX"); - int y1 = nbt.getInteger("MF_HeldPosY"); - int z1 = nbt.getInteger("MF_HeldPosZ"); - - if (x1 != x || y1 != y || z1 != z) { - player.stopUsingItem(); - return false; - } - } - - Block block = world.getBlock(x, y, z); - - if (player.posY < (y + 2.8F) && player.posY > (y - 3) - && player.getDistance(x + 0.5, player.posY, z + 0.5) < 1D && player.fallDistance < 5 - && block.getMaterial().isSolid() && block.isOpaqueCube()) { - return true; - } - } - } - return false; - } - - private NBTTagCompound getOrCreateNBT(ItemStack item) { - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - return item.getTagCompound(); - } - - @Override - public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { - float cost = 0.5F; - if (stack.getItemDamage() >= stack.getMaxDamage()) { - player.destroyCurrentEquippedItem(); - } - World world = player.worldObj; - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - - if (movingobjectposition == null) { - if (!world.isRemote && StaminaBar.isSystemActive && !tryPerformAbility(player, cost)) { - player.stopUsingItem(); - } - return; - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int x = movingobjectposition.blockX; - int y = movingobjectposition.blockY; - int z = movingobjectposition.blockZ; - Block block = world.getBlock(x, y, z); - - if (isInWall(player, false)) { - if (!player.isSwingInProgress) { - cost *= 0.5F; - player.motionY = 0; - } else { - - player.fallDistance = 0; - if (!player.isSneaking() && player.posY < y + 3) { - player.motionY = 0.05D; - } else if (player.isSneaking() && player.posY > y - 2) { - player.motionY = -0.05D; - cost *= 0.75F; - } else { - player.motionY = 0; - cost *= 0.5F; - } - } - } - } - } - if (!world.isRemote && StaminaBar.isSystemActive && !tryPerformAbility(player, cost)) { - player.stopUsingItem(); - } - } - - @Override - public EnumAction getItemUseAction(ItemStack item) { - return EnumAction.bow; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (user.isUsingItem()) - return item; - if (StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(user, true)) { - return item; - } - - if (isInWall(user, true)) { - user.setItemInUse(item, getMaxItemUseDuration(item)); - if (!world.isRemote) { - item.damageItem(1, user); - } - user.playSound("mob.sheep.shear", 1.0F, 2.0F); - } - return item; - } - - @Override - public int getMaxItemUseDuration(ItemStack item) { - return Integer.MAX_VALUE; - } - - public static boolean tryPerformAbility(EntityLivingBase user, float points) { - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { - points *= StaminaBar.getClimbinbDecayModifier(user, true); - if (StaminaBar.isStaminaAvailable(user, points, true)) { - ItemWeaponMF.applyFatigue(user, points); - return true; - } else { - return false; - } - } - return true; - } + private Random rand = new Random(); + private int itemRarity; + + public ItemClimbingPick(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabGadget); + + setTextureName("minefantasy2:Other/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + setMaxDamage(material.getMaxUses()); + } + + public static boolean tryPerformAbility(EntityLivingBase user, float points) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { + points *= StaminaBar.getClimbinbDecayModifier(user, true); + if (StaminaBar.isStaminaAvailable(user, points, true)) { + ItemWeaponMF.applyFatigue(user, points); + return true; + } else { + return false; + } + } + return true; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = itemRarity + 1; + + if (item.isItemEnchanted()) { + if (lvl == 0) { + lvl++; + } + lvl++; + } + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; + } + return ToolListMF.rarity[lvl]; + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + @Override + public int getMaxDamage(ItemStack stack) { + return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); + } + + public boolean isInWall(EntityPlayer player, boolean init) { + if (player.getHeldItem() == null) + return false; + + World world = player.worldObj; + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + + if (movingobjectposition == null) { + return false; + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int x = movingobjectposition.blockX; + int y = movingobjectposition.blockY; + int z = movingobjectposition.blockZ; + + NBTTagCompound nbt = getOrCreateNBT(player.getHeldItem()); + if (init) { + nbt.setInteger("MF_HeldPosX", x); + nbt.setInteger("MF_HeldPosY", y); + nbt.setInteger("MF_HeldPosZ", z); + } else { + int x1 = nbt.getInteger("MF_HeldPosX"); + int y1 = nbt.getInteger("MF_HeldPosY"); + int z1 = nbt.getInteger("MF_HeldPosZ"); + + if (x1 != x || y1 != y || z1 != z) { + player.stopUsingItem(); + return false; + } + } + + Block block = world.getBlock(x, y, z); + + if (player.posY < (y + 2.8F) && player.posY > (y - 3) + && player.getDistance(x + 0.5, player.posY, z + 0.5) < 1D && player.fallDistance < 5 + && block.getMaterial().isSolid() && block.isOpaqueCube()) { + return true; + } + } + } + return false; + } + + private NBTTagCompound getOrCreateNBT(ItemStack item) { + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + return item.getTagCompound(); + } + + @Override + public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { + float cost = 0.5F; + if (stack.getItemDamage() >= stack.getMaxDamage()) { + player.destroyCurrentEquippedItem(); + } + World world = player.worldObj; + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + + if (movingobjectposition == null) { + if (!world.isRemote && StaminaBar.isSystemActive && !tryPerformAbility(player, cost)) { + player.stopUsingItem(); + } + return; + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int x = movingobjectposition.blockX; + int y = movingobjectposition.blockY; + int z = movingobjectposition.blockZ; + Block block = world.getBlock(x, y, z); + + if (isInWall(player, false)) { + if (!player.isSwingInProgress) { + cost *= 0.5F; + player.motionY = 0; + } else { + + player.fallDistance = 0; + if (!player.isSneaking() && player.posY < y + 3) { + player.motionY = 0.05D; + } else if (player.isSneaking() && player.posY > y - 2) { + player.motionY = -0.05D; + cost *= 0.75F; + } else { + player.motionY = 0; + cost *= 0.5F; + } + } + } + } + } + if (!world.isRemote && StaminaBar.isSystemActive && !tryPerformAbility(player, cost)) { + player.stopUsingItem(); + } + } + + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.bow; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (user.isUsingItem()) + return item; + if (StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(user, true)) { + return item; + } + + if (isInWall(user, true)) { + user.setItemInUse(item, getMaxItemUseDuration(item)); + if (!world.isRemote) { + item.damageItem(1, user); + } + user.playSound("mob.sheep.shear", 1.0F, 2.0F); + } + return item; + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + return Integer.MAX_VALUE; + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbow.java b/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbow.java index 020f0c27..de5aed75 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbow.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbow.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -38,482 +36,481 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.List; + public class ItemCrossbow extends Item - implements IFirearm, IDisplayMFAmmo, IDamageModifier, IRackItem, IDamageType, IScope, ISpecialSalvage { - public ItemCrossbow() { - String name = "MF_CrossbowCustom"; - this.setCreativeTab(CreativeTabMF.tabGadget); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - this.setFull3D(); - this.setTextureName("minefantasy2:gun/stock/cross_stock_wood"); - this.setMaxDamage(150); - this.setMaxStackSize(1); - } - - @Override - public EnumAction getItemUseAction(ItemStack item) { - String action = getUseAction(item); - if (action.equalsIgnoreCase("reload")) { - return EnumAction.block; - } - return EnumAction.bow; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (!world.isRemote && user.isSneaking() || AmmoMechanicsMF.isDepleted(item))// OPEN INV - { - user.openGui(MineFantasyII.instance, 1, user.worldObj, 1, 0, 0); - return item; - } - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); - if (loaded == null || user.isSwingInProgress)// RELOAD - { - startUse(user, item, "reload"); - return item; - } else // FIRE - { - } - startUse(user, item, "fire"); - return item; - } - - @Override - public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { - boolean infinity = EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, item) > 0; - user.swingItem(); - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); - ItemStack storage = AmmoMechanicsMF.getAmmo(item); - String action = getUseAction(item); - boolean shouldConsume = true; - - if (action.equalsIgnoreCase("reload")) { - if (storage == null && infinity) { - shouldConsume = false; - storage = CustomToolListMF.standard_bolt.construct("Magic"); - } - if (storage != null)// RELOAD - { - boolean success = false; - if (loaded == null) { - ItemStack ammo = storage.copy(); - ammo.stackSize = 1; - if (shouldConsume) - AmmoMechanicsMF.consumeAmmo(user, item); - AmmoMechanicsMF.putAmmoOnFirearm(item, ammo); - success = true; - } else if (loaded.isItemEqual(storage) && loaded.stackSize < getAmmoCapacity(item)) { - if (shouldConsume) - AmmoMechanicsMF.consumeAmmo(user, item); - ++loaded.stackSize; - AmmoMechanicsMF.putAmmoOnFirearm(item, loaded); - success = true; - } - if (success) { - user.playSound("random.click", 1.0F, 1.0F); - } - } - } - return super.onEaten(item, world, user); - } - - @Override - public void onUsingTick(ItemStack item, EntityPlayer player, int time) { - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); - int max = getMaxItemUseDuration(item); - - if (time == (max - 5) && getUseAction(item).equalsIgnoreCase("reload") - && (loaded == null || loaded.stackSize < getAmmoCapacity(item))) { - player.playSound("minefantasy2:weapon.crossbowload", 1.0F, 1 / (getFullValue(item, "speed") / 4F)); - } - } - - @Override - public void onPlayerStoppedUsing(ItemStack item, World world, EntityPlayer user, int time) { - ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); - String action = getUseAction(item); - - if (action.equalsIgnoreCase("fire") && this.onFireArrow(user.worldObj, AmmoMechanicsMF.getArrowOnBow(item), - item, user, this.getFullValue(item, "power"), false)) { - if (loaded != null) { - --loaded.stackSize; - AmmoMechanicsMF.putAmmoOnFirearm(item, (loaded.stackSize > 0 ? loaded : null)); - } - recoilUser(user, getFullValue(item, "recoil")); - AmmoMechanicsMF.damageContainer(item, user, 1); - } - stopUse(item); - } - - public void startUse(EntityPlayer user, ItemStack item, String action) { - setUseAction(item, action); - if (user != null) - user.setItemInUse(item, getMaxItemUseDuration(item)); - } - - public void stopUse(ItemStack item) { - startUse(null, item, "null"); - } - - public static String useTypeNBT = "MF_ActionInUse"; - - public static void setUseAction(ItemStack item, String action) { - AmmoMechanicsMF.getNBT(item).setString(useTypeNBT, action); - } - - public static String getUseAction(ItemStack item) { - String action = AmmoMechanicsMF.getNBT(item).getString(useTypeNBT); - - return action != null ? action : "null"; - } - - private void recoilUser(EntityPlayer user, float value) { - if (PowerArmour.isPowered(user)) { - return; - } - float str = CombatMechanics.getStrengthEnhancement(user) + 1; - value /= str; - - float angle = value; - user.rotationPitch -= itemRand.nextFloat() * angle; - user.rotationYawHead += itemRand.nextFloat() * angle - 0.5F; - } - - @Override - public int getMaxItemUseDuration(ItemStack item) { - String action = getUseAction(item); - if (action.equalsIgnoreCase("reload")) { - return (int) (getFullValue(item, "speed") * 20F); - } - return 72000; - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - super.addInformation(item, user, list, fullInfo); - - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.power.name", getFullValue(item, "power"))); - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.speed.name", getFullValue(item, "speed"))); - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.recoil.name", - getFullValue(item, "recoil"))); - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.spread.name", - getFullValue(item, "spread"))); - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.capacity.name", getAmmoCapacity(item))); - list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.bash.name", getMeleeDmg(item))); - } - - public String getItemStackDisplayName(ItemStack item) { - String base = getNameModifier(item, "stock"); - String arms = getNameModifier(item, "mechanism"); - String mod = getNameModifier(item, "mod"); - - String fullName = "Crossbow"; - - if (base != null) - fullName = base; - if (arms != null) - fullName = arms + " " + fullName; - if (mod != null) - fullName = mod + " " + fullName; - - return fullName; - } - - private static final String partNBT = "MineFantasy_GunPiece_"; - - public static void setPart(String part, ItemStack item, int id) { - NBTTagCompound nbt = getNBT(item); - nbt.setInteger(partNBT + part, id); - } - - public static int getPart(String part, ItemStack item) { - NBTTagCompound nbt = getNBT(item); - if (nbt.hasKey(partNBT + part)) { - return nbt.getInteger(partNBT + part); - } - return -1; - } - - /** - * Constructs a crossbow with a list of parts - */ - public ItemStack constructCrossbow(ICrossbowPart... crossbowParts) { - ItemStack crossbow = new ItemStack(this); - - for (ICrossbowPart part : crossbowParts) { - if (part != null) { - setPart(crossbow, part); - } - } - return crossbow; - } - - /** - * Adds a part to a crossbow - */ - public ItemStack setPart(ItemStack item, ICrossbowPart part) { - setPart(part.getComponentType(), item, part.getID()); - return item; - } - - public static NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) - item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack item, int layer) { - IIcon stock = getPartIcon(item, "stock"); - if (stock != null && layer == 0) { - return stock; - } - IIcon muzzle = getPartIcon(item, "muzzle"); - if (muzzle != null && layer == 1) { - return muzzle; - } - IIcon mod = getPartIcon(item, "mod"); - if (mod != null && layer == 2) { - return mod; - } - IIcon head = getPartIcon(item, "mechanism"); - return head != null ? head : getIconIndex(item); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderPasses(int metadata) { - return 4; - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_handle_wood, - (ICrossbowPart) ComponentListMF.cross_arms_basic)); - list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_wood, - (ICrossbowPart) ComponentListMF.cross_arms_light)); - - list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_wood, - (ICrossbowPart) ComponentListMF.cross_arms_basic, (ICrossbowPart) ComponentListMF.cross_ammo)); - list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_wood, - (ICrossbowPart) ComponentListMF.cross_arms_heavy, (ICrossbowPart) ComponentListMF.cross_bayonet)); - list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_iron, - (ICrossbowPart) ComponentListMF.cross_arms_advanced, (ICrossbowPart) ComponentListMF.cross_scope)); - } - - @SideOnly(Side.CLIENT) - public IIcon getPartIcon(ItemStack item, String partname) { - if (partname.equalsIgnoreCase("string")) { - return strings[AmmoMechanicsMF.getArrowOnBow(item) != null ? 1 : 0]; - } - ICrossbowPart part = ItemCrossbowPart.getPart(partname, getPart(partname, item)); - if (part != null) { - return part.getIcon(); - } - return null; - } - - public String getNameModifier(ItemStack item, String partname) { - ICrossbowPart part = ItemCrossbowPart.getPart(partname, getPart(partname, item)); - if (part != null) { - String name = part.getUnlocalisedName(); - if (name != null) { - return StatCollector.translateToLocal(name); - } - } - return null; - } - - /** - * Get the modifier for a part (such as power, speed, recoil, capacity and - * spread) - */ - public float getModifierForPart(ItemStack item, String partName, String variable) { - ICrossbowPart part = ItemCrossbowPart.getPart(partName, getPart(partName, item)); - if (part != null) { - return part.getModifier(variable); - } - return 0F; - } - - private String[] fullParts = new String[] { "mod", "muzzle", "mechanism", "stock" }; - - /** - * Checks all "fullParts" for value modifiers - */ - public float getFullValue(ItemStack item, String variable) { - float min = variable.equalsIgnoreCase("speed") ? 0.5F : 0F; - float value = 0F; - - for (String part : fullParts) { - value += getModifierForPart(item, part, variable); - } - - return Math.max(min, value); - } - - @Override - public int getAmmoCapacity(ItemStack item) { - return 1 + (int) getModifierForPart(item, "mod", "capacity");// only mod affects capacity - } - - public float getMeleeDmg(ItemStack item) { - return 1 + getModifierForPart(item, "muzzle", "bash");// only muzzle affects capacity - } - - @Override - public boolean canAcceptAmmo(ItemStack weapon, String ammo) { - return ammo.equalsIgnoreCase("bolt"); - } - - @Override - public float[] getDamageRatio(Object... implement) { - if (implement.length > 0 && implement[0] instanceof ItemStack) { - if (this.getMeleeDmg((ItemStack) implement[0]) > 1.0F)// Bayonet is used - { - return new float[] { 0F, 0F, 1F }; - } - } - - return new float[] { 0F, 1F, 0F }; - } - - @Override - public float getPenetrationLevel(Object implement) { - return 0; - } - - private IIcon[] strings; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - super.registerIcons(reg); - strings = new IIcon[2]; - strings[0] = reg.registerIcon("minefantasy2:gun/mechanism/cross_string_unload"); - strings[1] = reg.registerIcon("minefantasy2:gun/mechanism/cross_string_load"); - } - - @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, - boolean properHit) { - return initialDam + this.getMeleeDmg(item) - 1; - } - - public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, - boolean infinite) { - if (arrow == null || !(arrow.getItem() instanceof ItemArrowMF)) { - return false; - } - ItemArrowMF ammo = (ItemArrowMF) arrow.getItem(); - if (!(ammo.getAmmoType(arrow).equalsIgnoreCase("bolt"))) { - return false; - } - // TODO Arrow entity instance - EntityArrowMF entArrow = ammo - .getFiredArrow(new EntityArrowMF(world, user, getFullValue(bow, "spread"), charge * 2.0F), arrow); - - int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); - entArrow.setPower(1 + (0.25F * var9)); - - int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); - - if (var10 > 0) { - entArrow.setKnockbackStrength(var10); - } - - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) { - entArrow.setFire(100); - } - - if (infinite) { - entArrow.canBePickedUp = 2; - } - - if (bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) { - entArrow = (EntityArrowMF) ((ISpecialBow) bow.getItem()).modifyArrow(bow, entArrow); - } - if (!world.isRemote) { - world.spawnEntityInWorld(entArrow); - } - world.playSoundAtEntity(user, "minefantasy2:weapon.crossbow_fire", 1.0F, 1.0F); - - return true; - } - - @Override - public float getZoom(ItemStack item) { - return getUseAction(item).equalsIgnoreCase("fire") ? getModifierForPart(item, "mod", "zoom") : 0F;// only mod - // affects - // zoom; - } - - @Override - public Object[] getSalvage(ItemStack item) { - return new Object[] { getItem(item, "stock"), getItem(item, "mechanism"), getItem(item, "muzzle"), - getItem(item, "mod") }; - } - - private Object getItem(ItemStack item, String type) { - return ItemCrossbowPart.getPart(type, this.getPart(type, item)); - } - - @Override - public int getMaxDamage(ItemStack item) { - return super.getMaxDamage(item) + (int) getFullValue(item, "durability"); - } - - @Override - public float getScale(ItemStack itemstack) { - return 1.0F; - } - - @Override - public float getOffsetX(ItemStack itemstack) { - return 0F; - } - - @Override - public float getOffsetY(ItemStack itemstack) { - return (isHandCrossbow(itemstack) ? 0F : 0.5F) + 1 / 8F; - } - - @Override - public float getOffsetZ(ItemStack itemstack) { - return 0.25F; - } - - @Override - public float getRotationOffset(ItemStack itemstack) { - return 0; - } - - @Override - public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { - if (slot == 0 || slot == 3) - return false; - - return isHandCrossbow(item) || rack.hasRackBelow(slot); - } - - @Override - public boolean isSpecialRender(ItemStack item) { - return true; - } - - public boolean isHandCrossbow(ItemStack item) { - ICrossbowPart part = ItemCrossbowPart.getPart("stock", getPart("stock", item)); - if (part != null) { - return part.makesSmallWeapon(); - } - return true; - } + implements IFirearm, IDisplayMFAmmo, IDamageModifier, IRackItem, IDamageType, IScope, ISpecialSalvage { + private static final String partNBT = "MineFantasy_GunPiece_"; + public static String useTypeNBT = "MF_ActionInUse"; + private String[] fullParts = new String[]{"mod", "muzzle", "mechanism", "stock"}; + private IIcon[] strings; + + public ItemCrossbow() { + String name = "MF_CrossbowCustom"; + this.setCreativeTab(CreativeTabMF.tabGadget); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + this.setFull3D(); + this.setTextureName("minefantasy2:gun/stock/cross_stock_wood"); + this.setMaxDamage(150); + this.setMaxStackSize(1); + } + + public static void setUseAction(ItemStack item, String action) { + AmmoMechanicsMF.getNBT(item).setString(useTypeNBT, action); + } + + public static String getUseAction(ItemStack item) { + String action = AmmoMechanicsMF.getNBT(item).getString(useTypeNBT); + + return action != null ? action : "null"; + } + + public static void setPart(String part, ItemStack item, int id) { + NBTTagCompound nbt = getNBT(item); + nbt.setInteger(partNBT + part, id); + } + + public static int getPart(String part, ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (nbt.hasKey(partNBT + part)) { + return nbt.getInteger(partNBT + part); + } + return -1; + } + + public static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + @Override + public EnumAction getItemUseAction(ItemStack item) { + String action = getUseAction(item); + if (action.equalsIgnoreCase("reload")) { + return EnumAction.block; + } + return EnumAction.bow; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote && user.isSneaking() || AmmoMechanicsMF.isDepleted(item))// OPEN INV + { + user.openGui(MineFantasyII.instance, 1, user.worldObj, 1, 0, 0); + return item; + } + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); + if (loaded == null || user.isSwingInProgress)// RELOAD + { + startUse(user, item, "reload"); + return item; + } else // FIRE + { + } + startUse(user, item, "fire"); + return item; + } + + @Override + public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { + boolean infinity = EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, item) > 0; + user.swingItem(); + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); + ItemStack storage = AmmoMechanicsMF.getAmmo(item); + String action = getUseAction(item); + boolean shouldConsume = true; + + if (action.equalsIgnoreCase("reload")) { + if (storage == null && infinity) { + shouldConsume = false; + storage = CustomToolListMF.standard_bolt.construct("Magic"); + } + if (storage != null)// RELOAD + { + boolean success = false; + if (loaded == null) { + ItemStack ammo = storage.copy(); + ammo.stackSize = 1; + if (shouldConsume) + AmmoMechanicsMF.consumeAmmo(user, item); + AmmoMechanicsMF.putAmmoOnFirearm(item, ammo); + success = true; + } else if (loaded.isItemEqual(storage) && loaded.stackSize < getAmmoCapacity(item)) { + if (shouldConsume) + AmmoMechanicsMF.consumeAmmo(user, item); + ++loaded.stackSize; + AmmoMechanicsMF.putAmmoOnFirearm(item, loaded); + success = true; + } + if (success) { + user.playSound("random.click", 1.0F, 1.0F); + } + } + } + return super.onEaten(item, world, user); + } + + @Override + public void onUsingTick(ItemStack item, EntityPlayer player, int time) { + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); + int max = getMaxItemUseDuration(item); + + if (time == (max - 5) && getUseAction(item).equalsIgnoreCase("reload") + && (loaded == null || loaded.stackSize < getAmmoCapacity(item))) { + player.playSound("minefantasy2:weapon.crossbowload", 1.0F, 1 / (getFullValue(item, "speed") / 4F)); + } + } + + @Override + public void onPlayerStoppedUsing(ItemStack item, World world, EntityPlayer user, int time) { + ItemStack loaded = AmmoMechanicsMF.getArrowOnBow(item); + String action = getUseAction(item); + + if (action.equalsIgnoreCase("fire") && this.onFireArrow(user.worldObj, AmmoMechanicsMF.getArrowOnBow(item), + item, user, this.getFullValue(item, "power"), false)) { + if (loaded != null) { + --loaded.stackSize; + AmmoMechanicsMF.putAmmoOnFirearm(item, (loaded.stackSize > 0 ? loaded : null)); + } + recoilUser(user, getFullValue(item, "recoil")); + AmmoMechanicsMF.damageContainer(item, user, 1); + } + stopUse(item); + } + + public void startUse(EntityPlayer user, ItemStack item, String action) { + setUseAction(item, action); + if (user != null) + user.setItemInUse(item, getMaxItemUseDuration(item)); + } + + public void stopUse(ItemStack item) { + startUse(null, item, "null"); + } + + private void recoilUser(EntityPlayer user, float value) { + if (PowerArmour.isPowered(user)) { + return; + } + float str = CombatMechanics.getStrengthEnhancement(user) + 1; + value /= str; + + float angle = value; + user.rotationPitch -= itemRand.nextFloat() * angle; + user.rotationYawHead += itemRand.nextFloat() * angle - 0.5F; + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + String action = getUseAction(item); + if (action.equalsIgnoreCase("reload")) { + return (int) (getFullValue(item, "speed") * 20F); + } + return 72000; + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); + + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.power.name", getFullValue(item, "power"))); + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.speed.name", getFullValue(item, "speed"))); + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.recoil.name", + getFullValue(item, "recoil"))); + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.spread.name", + getFullValue(item, "spread"))); + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.capacity.name", getAmmoCapacity(item))); + list.add(StatCollector.translateToLocalFormatted("attribute.crossbow.bash.name", getMeleeDmg(item))); + } + + public String getItemStackDisplayName(ItemStack item) { + String base = getNameModifier(item, "stock"); + String arms = getNameModifier(item, "mechanism"); + String mod = getNameModifier(item, "mod"); + + String fullName = "Crossbow"; + + if (base != null) + fullName = base; + if (arms != null) + fullName = arms + " " + fullName; + if (mod != null) + fullName = mod + " " + fullName; + + return fullName; + } + + /** + * Constructs a crossbow with a list of parts + */ + public ItemStack constructCrossbow(ICrossbowPart... crossbowParts) { + ItemStack crossbow = new ItemStack(this); + + for (ICrossbowPart part : crossbowParts) { + if (part != null) { + setPart(crossbow, part); + } + } + return crossbow; + } + + /** + * Adds a part to a crossbow + */ + public ItemStack setPart(ItemStack item, ICrossbowPart part) { + setPart(part.getComponentType(), item, part.getID()); + return item; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack item, int layer) { + IIcon stock = getPartIcon(item, "stock"); + if (stock != null && layer == 0) { + return stock; + } + IIcon muzzle = getPartIcon(item, "muzzle"); + if (muzzle != null && layer == 1) { + return muzzle; + } + IIcon mod = getPartIcon(item, "mod"); + if (mod != null && layer == 2) { + return mod; + } + IIcon head = getPartIcon(item, "mechanism"); + return head != null ? head : getIconIndex(item); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderPasses(int metadata) { + return 4; + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_handle_wood, + (ICrossbowPart) ComponentListMF.cross_arms_basic)); + list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_wood, + (ICrossbowPart) ComponentListMF.cross_arms_light)); + + list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_wood, + (ICrossbowPart) ComponentListMF.cross_arms_basic, (ICrossbowPart) ComponentListMF.cross_ammo)); + list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_wood, + (ICrossbowPart) ComponentListMF.cross_arms_heavy, (ICrossbowPart) ComponentListMF.cross_bayonet)); + list.add(constructCrossbow((ICrossbowPart) ComponentListMF.crossbow_stock_iron, + (ICrossbowPart) ComponentListMF.cross_arms_advanced, (ICrossbowPart) ComponentListMF.cross_scope)); + } + + @SideOnly(Side.CLIENT) + public IIcon getPartIcon(ItemStack item, String partname) { + if (partname.equalsIgnoreCase("string")) { + return strings[AmmoMechanicsMF.getArrowOnBow(item) != null ? 1 : 0]; + } + ICrossbowPart part = ItemCrossbowPart.getPart(partname, getPart(partname, item)); + if (part != null) { + return part.getIcon(); + } + return null; + } + + public String getNameModifier(ItemStack item, String partname) { + ICrossbowPart part = ItemCrossbowPart.getPart(partname, getPart(partname, item)); + if (part != null) { + String name = part.getUnlocalisedName(); + if (name != null) { + return StatCollector.translateToLocal(name); + } + } + return null; + } + + /** + * Get the modifier for a part (such as power, speed, recoil, capacity and + * spread) + */ + public float getModifierForPart(ItemStack item, String partName, String variable) { + ICrossbowPart part = ItemCrossbowPart.getPart(partName, getPart(partName, item)); + if (part != null) { + return part.getModifier(variable); + } + return 0F; + } + + /** + * Checks all "fullParts" for value modifiers + */ + public float getFullValue(ItemStack item, String variable) { + float min = variable.equalsIgnoreCase("speed") ? 0.5F : 0F; + float value = 0F; + + for (String part : fullParts) { + value += getModifierForPart(item, part, variable); + } + + return Math.max(min, value); + } + + @Override + public int getAmmoCapacity(ItemStack item) { + return 1 + (int) getModifierForPart(item, "mod", "capacity");// only mod affects capacity + } + + public float getMeleeDmg(ItemStack item) { + return 1 + getModifierForPart(item, "muzzle", "bash");// only muzzle affects capacity + } + + @Override + public boolean canAcceptAmmo(ItemStack weapon, String ammo) { + return ammo.equalsIgnoreCase("bolt"); + } + + @Override + public float[] getDamageRatio(Object... implement) { + if (implement.length > 0 && implement[0] instanceof ItemStack) { + if (this.getMeleeDmg((ItemStack) implement[0]) > 1.0F)// Bayonet is used + { + return new float[]{0F, 0F, 1F}; + } + } + + return new float[]{0F, 1F, 0F}; + } + + @Override + public float getPenetrationLevel(Object implement) { + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + super.registerIcons(reg); + strings = new IIcon[2]; + strings[0] = reg.registerIcon("minefantasy2:gun/mechanism/cross_string_unload"); + strings[1] = reg.registerIcon("minefantasy2:gun/mechanism/cross_string_load"); + } + + @Override + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + return initialDam + this.getMeleeDmg(item) - 1; + } + + public boolean onFireArrow(World world, ItemStack arrow, ItemStack bow, EntityPlayer user, float charge, + boolean infinite) { + if (arrow == null || !(arrow.getItem() instanceof ItemArrowMF)) { + return false; + } + ItemArrowMF ammo = (ItemArrowMF) arrow.getItem(); + if (!(ammo.getAmmoType(arrow).equalsIgnoreCase("bolt"))) { + return false; + } + // TODO Arrow entity instance + EntityArrowMF entArrow = ammo + .getFiredArrow(new EntityArrowMF(world, user, getFullValue(bow, "spread"), charge * 2.0F), arrow); + + int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, bow); + entArrow.setPower(1 + (0.25F * var9)); + + int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, bow); + + if (var10 > 0) { + entArrow.setKnockbackStrength(var10); + } + + if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, bow) > 0) { + entArrow.setFire(100); + } + + if (infinite) { + entArrow.canBePickedUp = 2; + } + + if (bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) { + entArrow = (EntityArrowMF) ((ISpecialBow) bow.getItem()).modifyArrow(bow, entArrow); + } + if (!world.isRemote) { + world.spawnEntityInWorld(entArrow); + } + world.playSoundAtEntity(user, "minefantasy2:weapon.crossbow_fire", 1.0F, 1.0F); + + return true; + } + + @Override + public float getZoom(ItemStack item) { + return getUseAction(item).equalsIgnoreCase("fire") ? getModifierForPart(item, "mod", "zoom") : 0F;// only mod + // affects + // zoom; + } + + @Override + public Object[] getSalvage(ItemStack item) { + return new Object[]{getItem(item, "stock"), getItem(item, "mechanism"), getItem(item, "muzzle"), + getItem(item, "mod")}; + } + + private Object getItem(ItemStack item, String type) { + return ItemCrossbowPart.getPart(type, this.getPart(type, item)); + } + + @Override + public int getMaxDamage(ItemStack item) { + return super.getMaxDamage(item) + (int) getFullValue(item, "durability"); + } + + @Override + public float getScale(ItemStack itemstack) { + return 1.0F; + } + + @Override + public float getOffsetX(ItemStack itemstack) { + return 0F; + } + + @Override + public float getOffsetY(ItemStack itemstack) { + return (isHandCrossbow(itemstack) ? 0F : 0.5F) + 1 / 8F; + } + + @Override + public float getOffsetZ(ItemStack itemstack) { + return 0.25F; + } + + @Override + public float getRotationOffset(ItemStack itemstack) { + return 0; + } + + @Override + public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { + if (slot == 0 || slot == 3) + return false; + + return isHandCrossbow(item) || rack.hasRackBelow(slot); + } + + @Override + public boolean isSpecialRender(ItemStack item) { + return true; + } + + public boolean isHandCrossbow(ItemStack item) { + ICrossbowPart part = ItemCrossbowPart.getPart("stock", getPart("stock", item)); + if (part != null) { + return part.makesSmallWeapon(); + } + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbowPart.java b/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbowPart.java index eef91fc4..74ca2dfa 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbowPart.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemCrossbowPart.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.MineFantasyAPI; @@ -15,144 +13,144 @@ import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; +import java.util.List; + public class ItemCrossbowPart extends ItemComponentMF implements ICrossbowPart { - private int tier; - private String type, partname; - public IIcon modelIcon; - - public ItemCrossbowPart(String name, String type) { - this(name, type, ICrossbowPart.components.size(), name); - } - - public ItemCrossbowPart(String name, String type, int tier) { - this(name, type, tier, name); - } - - public ItemCrossbowPart(String name, String type, int tier, String model) { - super(name, 0); - this.setFull3D(); - this.type = type; - this.tier = tier; - this.partname = model; - MineFantasyAPI.registerCrossbowPart(this); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("crossbow.component.name")); - list.add(EnumChatFormatting.ITALIC + StatCollector.translateToLocal("crossbow.component." + type)); - list.add(EnumChatFormatting.DARK_GRAY + StatCollector.translateToLocal(getUnlocalizedName() + ".desc")); - } - - @Override - public String getComponentType() { - return type; - } - - @Override - public int getID() { - return tier; - } - - public static ICrossbowPart getPart(String type, int id) { - return components.get(type + id); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon() { - return modelIcon; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - super.registerIcons(reg); - modelIcon = reg.registerIcon("minefantasy2:gun/" + type + "/" + partname); - } - - @Override - public String getUnlocalisedName() { - if (this == ComponentListMF.cross_arms_basic) { - return null; - } - return "crosspart." + type + "." + partname; - } - - private int capacity = 0, durability = 50; - private float power, spread, recoil, speed, bash, zoom; - - public ItemCrossbowPart addPower(float power) { - this.power = power; - return this; - } - - public ItemCrossbowPart setScope(float zoom) { - this.zoom = zoom; - return this; - } - - public ItemCrossbowPart addSpread(float spread) { - this.spread = spread; - return this; - } - - public ItemCrossbowPart addRecoil(float recoil) { - this.recoil = recoil; - return this; - } - - public ItemCrossbowPart addSpeed(float speed) { - this.speed = speed; - return this; - } - - public ItemCrossbowPart addBash(float bash) { - this.bash = bash; - return this; - } - - public ItemCrossbowPart addCapacity(int capacity) { - this.capacity = capacity; - return this; - } - - public ItemCrossbowPart addDurability(int durability) { - this.durability = durability; - return this; - } - - public ItemCrossbowPart setHandCrossbow(boolean flag) { - this.isHandle = flag; - return this; - } - - @Override - public float getModifier(String type) { - if (type.equalsIgnoreCase("power")) - return power; - if (type.equalsIgnoreCase("spread")) - return spread; - if (type.equalsIgnoreCase("recoil")) - return recoil; - if (type.equalsIgnoreCase("speed")) - return speed; - if (type.equalsIgnoreCase("capacity")) - return capacity; - if (type.equalsIgnoreCase("bash")) - return bash; - if (type.equalsIgnoreCase("zoom")) - return zoom; - if (type.equalsIgnoreCase("durability")) - return durability; - return 0F; - } - - private boolean isHandle = false; - - @Override - public boolean makesSmallWeapon() { - return isHandle; - } + public IIcon modelIcon; + private int tier; + private String type, partname; + private int capacity = 0, durability = 50; + private float power, spread, recoil, speed, bash, zoom; + private boolean isHandle = false; + + public ItemCrossbowPart(String name, String type) { + this(name, type, ICrossbowPart.components.size(), name); + } + + public ItemCrossbowPart(String name, String type, int tier) { + this(name, type, tier, name); + } + + public ItemCrossbowPart(String name, String type, int tier, String model) { + super(name, 0); + this.setFull3D(); + this.type = type; + this.tier = tier; + this.partname = model; + MineFantasyAPI.registerCrossbowPart(this); + } + + public static ICrossbowPart getPart(String type, int id) { + return components.get(type + id); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("crossbow.component.name")); + list.add(EnumChatFormatting.ITALIC + StatCollector.translateToLocal("crossbow.component." + type)); + list.add(EnumChatFormatting.DARK_GRAY + StatCollector.translateToLocal(getUnlocalizedName() + ".desc")); + } + + @Override + public String getComponentType() { + return type; + } + + @Override + public int getID() { + return tier; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon() { + return modelIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + super.registerIcons(reg); + modelIcon = reg.registerIcon("minefantasy2:gun/" + type + "/" + partname); + } + + @Override + public String getUnlocalisedName() { + if (this == ComponentListMF.cross_arms_basic) { + return null; + } + return "crosspart." + type + "." + partname; + } + + public ItemCrossbowPart addPower(float power) { + this.power = power; + return this; + } + + public ItemCrossbowPart setScope(float zoom) { + this.zoom = zoom; + return this; + } + + public ItemCrossbowPart addSpread(float spread) { + this.spread = spread; + return this; + } + + public ItemCrossbowPart addRecoil(float recoil) { + this.recoil = recoil; + return this; + } + + public ItemCrossbowPart addSpeed(float speed) { + this.speed = speed; + return this; + } + + public ItemCrossbowPart addBash(float bash) { + this.bash = bash; + return this; + } + + public ItemCrossbowPart addCapacity(int capacity) { + this.capacity = capacity; + return this; + } + + public ItemCrossbowPart addDurability(int durability) { + this.durability = durability; + return this; + } + + public ItemCrossbowPart setHandCrossbow(boolean flag) { + this.isHandle = flag; + return this; + } + + @Override + public float getModifier(String type) { + if (type.equalsIgnoreCase("power")) + return power; + if (type.equalsIgnoreCase("spread")) + return spread; + if (type.equalsIgnoreCase("recoil")) + return recoil; + if (type.equalsIgnoreCase("speed")) + return speed; + if (type.equalsIgnoreCase("capacity")) + return capacity; + if (type.equalsIgnoreCase("bash")) + return bash; + if (type.equalsIgnoreCase("zoom")) + return zoom; + if (type.equalsIgnoreCase("durability")) + return durability; + return 0F; + } + + @Override + public boolean makesSmallWeapon() { + return isHandle; + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemCrudeBomb.java b/src/main/java/minefantasy/mf2/item/gadget/ItemCrudeBomb.java index b7dcdf8b..c6a17b76 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemCrudeBomb.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemCrudeBomb.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.api.crafting.ISpecialSalvage; @@ -15,91 +13,93 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import java.util.List; + public class ItemCrudeBomb extends ItemBomb implements ISpecialSalvage { - public ItemCrudeBomb(String name) { - super(name); - } - - @Override - public int getMaxItemUseDuration(ItemStack item) { - return 20; - } - - @Override - public String getUnlocalizedName(ItemStack item) { - return "item.bomb_crude"; - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - list.add(new ItemStack(this)); - } - - // TODO Icons - @SideOnly(Side.CLIENT) - public IIcon getIcon(byte type) { - return basicIcon; - } - - private IIcon basicIcon; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - basicIcon = reg.registerIcon("minefantasy2:Other/bomb_crude"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconIndex(ItemStack item) { - return basicIcon; - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderPasses(int metadata) { - return 1; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack item, int layer) { - return getIconIndex(item); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return false; - } - - @Override - public EnumRarity getRarity(ItemStack item) { - return ToolListMF.poor; - } - - @Override - public Object[] getSalvage(ItemStack item) { - return new Object[] { Items.paper, ComponentListMF.thread, ComponentListMF.blackpowder }; - } - - @Override - public byte getItemFuse(byte value) { - return 0; - } - - @Override - public byte getItemFilling(byte value) { - return 0; - } - - @Override - public byte getItemCasing(byte value) { - return -1; - } - - @Override - public byte getItemPowder(byte value) { - return 0; - } + private IIcon basicIcon; + + public ItemCrudeBomb(String name) { + super(name); + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + return 20; + } + + @Override + public String getUnlocalizedName(ItemStack item) { + return "item.bomb_crude"; + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(new ItemStack(this)); + } + + // TODO Icons + @SideOnly(Side.CLIENT) + public IIcon getIcon(byte type) { + return basicIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + basicIcon = reg.registerIcon("minefantasy2:Other/bomb_crude"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack item) { + return basicIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderPasses(int metadata) { + return 1; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack item, int layer) { + return getIconIndex(item); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return false; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return ToolListMF.poor; + } + + @Override + public Object[] getSalvage(ItemStack item) { + return new Object[]{Items.paper, ComponentListMF.thread, ComponentListMF.blackpowder}; + } + + @Override + public byte getItemFuse(byte value) { + return 0; + } + + @Override + public byte getItemFilling(byte value) { + return 0; + } + + @Override + public byte getItemCasing(byte value) { + return -1; + } + + @Override + public byte getItemPowder(byte value) { + return 0; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingArrow.java b/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingArrow.java index 85d1b8b4..e261c9f6 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingArrow.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingArrow.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.List; - import minefantasy.mf2.api.crafting.ISpecialSalvage; import minefantasy.mf2.entity.EntityArrowMF; import minefantasy.mf2.item.archery.ArrowType; @@ -17,68 +15,70 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import java.util.List; + public class ItemExplodingArrow extends ItemArrowMF implements ISpecialSalvage { - public ItemExplodingArrow() { - super("exploding_arrow", 1, BaseMaterialMF.iron.getToolConversion(), ArrowType.EXPLOSIVE); - setCreativeTab(CreativeTabMF.tabGadget); - setMaxStackSize(16); - } + public ItemExplodingArrow() { + super("exploding_arrow", 1, BaseMaterialMF.iron.getToolConversion(), ArrowType.EXPLOSIVE); + setCreativeTab(CreativeTabMF.tabGadget); + setMaxStackSize(16); + } - @Override - public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) { - instance = super.getFiredArrow(instance, arrow); - instance.canBePickedUp = 0; - return instance.setBombStats(ItemBomb.getPowder(arrow), ItemBomb.getFilling(arrow)); - } + public static ItemStack createBombArrow(byte powder, byte filling) { + return createBombArrow(ToolListMF.exploding_arrow, powder, filling); + } - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - super.addInformation(item, user, list, fullInfo); + public static ItemStack createBombArrow(Item design, byte powder, byte filling) { + ItemStack arrow = new ItemStack(design); - if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { - list.add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("bomb.case.sticky") - + EnumChatFormatting.GRAY); - } - EnumExplosiveType fill = EnumExplosiveType.getType(ItemBomb.getFilling(item)); - EnumPowderType powder = EnumPowderType.getType(ItemBomb.getPowder(item)); + ItemBomb.setFilling(arrow, filling); + ItemBomb.setPowder(arrow, powder); - int damage = (int) (fill.damage * powder.damageModifier * 0.5F); - float range = fill.range * powder.rangeModifier * 0.5F; + return arrow; + } - list.add(StatCollector.translateToLocal(ToolListMF.bomb_custom.getUnlocalizedName(item) + ".name")); - list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); - list.add(""); - list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); - list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); - } + @Override + public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) { + instance = super.getFiredArrow(instance, arrow); + instance.canBePickedUp = 0; + return instance.setBombStats(ItemBomb.getPowder(arrow), ItemBomb.getFilling(arrow)); + } - public static ItemStack createBombArrow(byte powder, byte filling) { - return createBombArrow(ToolListMF.exploding_arrow, powder, filling); - } + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); - public static ItemStack createBombArrow(Item design, byte powder, byte filling) { - ItemStack arrow = new ItemStack(design); + if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { + list.add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("bomb.case.sticky") + + EnumChatFormatting.GRAY); + } + EnumExplosiveType fill = EnumExplosiveType.getType(ItemBomb.getFilling(item)); + EnumPowderType powder = EnumPowderType.getType(ItemBomb.getPowder(item)); - ItemBomb.setFilling(arrow, filling); - ItemBomb.setPowder(arrow, powder); + int damage = (int) (fill.damage * powder.damageModifier * 0.5F); + float range = fill.range * powder.rangeModifier * 0.5F; - return arrow; - } + list.add(StatCollector.translateToLocal(ToolListMF.bomb_custom.getUnlocalizedName(item) + ".name")); + list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); + list.add(""); + list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); + list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); + } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - for (byte pdr = 0; pdr < 2; pdr++) { - for (byte fill = 0; fill < 3; fill++) { - list.add(createBombArrow(pdr, fill)); - } - } - } + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (byte pdr = 0; pdr < 2; pdr++) { + for (byte fill = 0; fill < 3; fill++) { + list.add(createBombArrow(pdr, fill)); + } + } + } - @Override - public Object[] getSalvage(ItemStack item) { - return new Object[] { ComponentListMF.bomb_casing_arrow, - ItemBombComponent.getBombComponent("powder", ItemBomb.getPowder(item)), - ItemBombComponent.getBombComponent("filling", ItemBomb.getFilling(item)), }; - } + @Override + public Object[] getSalvage(ItemStack item) { + return new Object[]{ComponentListMF.bomb_casing_arrow, + ItemBombComponent.getBombComponent("powder", ItemBomb.getPowder(item)), + ItemBombComponent.getBombComponent("filling", ItemBomb.getFilling(item)),}; + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingBolt.java b/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingBolt.java index 493b859e..264d10a5 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingBolt.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemExplodingBolt.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.List; - import minefantasy.mf2.api.crafting.ISpecialSalvage; import minefantasy.mf2.entity.EntityArrowMF; import minefantasy.mf2.item.archery.ArrowType; @@ -16,61 +14,63 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import java.util.List; + public class ItemExplodingBolt extends ItemArrowMF implements ISpecialSalvage { - public ItemExplodingBolt() { - super("exploding_bolt", 1, BaseMaterialMF.iron.getToolConversion(), ArrowType.EXPLOSIVEBOLT); - setCreativeTab(CreativeTabMF.tabGadget); - setAmmoType("bolt"); - setMaxStackSize(20); - } + public ItemExplodingBolt() { + super("exploding_bolt", 1, BaseMaterialMF.iron.getToolConversion(), ArrowType.EXPLOSIVEBOLT); + setCreativeTab(CreativeTabMF.tabGadget); + setAmmoType("bolt"); + setMaxStackSize(20); + } - @Override - public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) { - instance = super.getFiredArrow(instance, arrow); - instance.canBePickedUp = 0; - return instance.setBombStats(ItemBomb.getPowder(arrow), ItemBomb.getFilling(arrow)); - } + public static ItemStack createBombArrow(byte powder, byte filling) { + ItemStack arrow = new ItemStack(ToolListMF.exploding_bolt); - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - super.addInformation(item, user, list, fullInfo); + ItemBomb.setFilling(arrow, filling); + ItemBomb.setPowder(arrow, powder); - EnumExplosiveType fill = EnumExplosiveType.getType(ItemBomb.getFilling(item)); - EnumPowderType powder = EnumPowderType.getType(ItemBomb.getPowder(item)); + return arrow; + } - int damage = (int) (fill.damage * powder.damageModifier * 0.5F); - float range = fill.range * powder.rangeModifier * 0.5F; + @Override + public EntityArrowMF getFiredArrow(EntityArrowMF instance, ItemStack arrow) { + instance = super.getFiredArrow(instance, arrow); + instance.canBePickedUp = 0; + return instance.setBombStats(ItemBomb.getPowder(arrow), ItemBomb.getFilling(arrow)); + } - list.add(StatCollector.translateToLocal(ToolListMF.bomb_custom.getUnlocalizedName(item) + ".name")); - list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); - list.add(""); - list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); - list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); - } + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); - public static ItemStack createBombArrow(byte powder, byte filling) { - ItemStack arrow = new ItemStack(ToolListMF.exploding_bolt); + EnumExplosiveType fill = EnumExplosiveType.getType(ItemBomb.getFilling(item)); + EnumPowderType powder = EnumPowderType.getType(ItemBomb.getPowder(item)); - ItemBomb.setFilling(arrow, filling); - ItemBomb.setPowder(arrow, powder); + int damage = (int) (fill.damage * powder.damageModifier * 0.5F); + float range = fill.range * powder.rangeModifier * 0.5F; - return arrow; - } + list.add(StatCollector.translateToLocal(ToolListMF.bomb_custom.getUnlocalizedName(item) + ".name")); + list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); + list.add(""); + list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); + list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); + } - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - for (byte pdr = 0; pdr < 2; pdr++) { - for (byte fill = 0; fill < 3; fill++) { - list.add(createBombArrow(pdr, fill)); - } - } - } + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (byte pdr = 0; pdr < 2; pdr++) { + for (byte fill = 0; fill < 3; fill++) { + list.add(createBombArrow(pdr, fill)); + } + } + } - @Override - public Object[] getSalvage(ItemStack item) { - return new Object[] { ComponentListMF.bomb_casing_bolt, - ItemBombComponent.getBombComponent("powder", ItemBomb.getPowder(item)), - ItemBombComponent.getBombComponent("filling", ItemBomb.getFilling(item)), }; - } + @Override + public Object[] getSalvage(ItemStack item) { + return new Object[]{ComponentListMF.bomb_casing_bolt, + ItemBombComponent.getBombComponent("powder", ItemBomb.getPowder(item)), + ItemBombComponent.getBombComponent("filling", ItemBomb.getFilling(item)),}; + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemJug.java b/src/main/java/minefantasy/mf2/item/gadget/ItemJug.java index bbfb0588..d5c5ac47 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemJug.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemJug.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.Random; - import minefantasy.mf2.api.heating.TongsHelper; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.block.decor.BlockComponent; @@ -15,132 +13,133 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import java.util.Random; + public class ItemJug extends ItemComponentMF { - private String type; - - public ItemJug(String type) { - super("jug_" + type, 0); - setCreativeTab(CreativeTabMF.tabFood); - this.type = type; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { - if (type.equalsIgnoreCase("uncooked")) { - return super.onItemRightClick(item, world, player); - } - if (type.equalsIgnoreCase("empty")) { - return rightClickEmpty(item, world, player); - } - return useFilled(item, world, player); - } - - @Override - public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { - if (!world.isRemote) { - if (type.equalsIgnoreCase("milk")) { - curePotionEffects(user); - } - if (StaminaBar.isSystemActive) { - StaminaBar.modifyStaminaValue(user, 10); - } - } - ItemStack container = getContainerItem(item); - if (item.stackSize > 1) { - if (!user.capabilities.isCreativeMode) { - --item.stackSize; - } - if (!user.inventory.addItemStackToInventory(container)) { - user.entityDropItem(container, 0F); - } - return item; - } - - return container; - } - - private void curePotionEffects(EntityPlayer user) { - user.clearActivePotions(); - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack item) { - return 24; - } - - /** - * returns the action that specifies what animation to play when the items is - * being used - */ - @Override - public EnumAction getItemUseAction(ItemStack item) { - return EnumAction.drink; - } - - private ItemStack rightClickEmpty(ItemStack item, World world, EntityPlayer player) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - - if (movingobjectposition == null) { - return super.onItemRightClick(item, world, player); - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (!world.canMineBlock(player, i, j, k)) { - return super.onItemRightClick(item, world, player); - } - - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { - return super.onItemRightClick(item, world, player); - } - - if (isWaterSource(world, i, j, k)) { - gather(item, world, player); - return item; - } - } - return super.onItemRightClick(item, world, player); - } - } - - private Random rand = new Random(); - - private void gather(ItemStack item, World world, EntityPlayer player) { - player.swingItem(); - if (!world.isRemote) { - world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, 0.5F + rand.nextFloat()); - item.stackSize--; - EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, - new ItemStack(FoodListMF.jug_water)); - world.spawnEntityInWorld(resultItem); - } - } - - private boolean isWaterSource(World world, int i, int j, int k) { - return TongsHelper.getWaterSource(world, i, j, k) >= 0; - } - - public ItemStack useFilled(ItemStack item, World world, EntityPlayer user) { - if (!world.isRemote && storageType != null) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); - - if (movingobjectposition == null) { - return item; - } else { - int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, - movingobjectposition); - if (placed > 0) { - item.stackSize -= placed; - return item; - } - } - } - user.setItemInUse(item, getMaxItemUseDuration(item)); - return item; - } + private String type; + private Random rand = new Random(); + + public ItemJug(String type) { + super("jug_" + type, 0); + setCreativeTab(CreativeTabMF.tabFood); + this.type = type; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + if (type.equalsIgnoreCase("uncooked")) { + return super.onItemRightClick(item, world, player); + } + if (type.equalsIgnoreCase("empty")) { + return rightClickEmpty(item, world, player); + } + return useFilled(item, world, player); + } + + @Override + public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote) { + if (type.equalsIgnoreCase("milk")) { + curePotionEffects(user); + } + if (StaminaBar.isSystemActive) { + StaminaBar.modifyStaminaValue(user, 10); + } + } + ItemStack container = getContainerItem(item); + if (item.stackSize > 1) { + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + if (!user.inventory.addItemStackToInventory(container)) { + user.entityDropItem(container, 0F); + } + return item; + } + + return container; + } + + private void curePotionEffects(EntityPlayer user) { + user.clearActivePotions(); + } + + /** + * How long it takes to use or consume an item + */ + @Override + public int getMaxItemUseDuration(ItemStack item) { + return 24; + } + + /** + * returns the action that specifies what animation to play when the items is + * being used + */ + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.drink; + } + + private ItemStack rightClickEmpty(ItemStack item, World world, EntityPlayer player) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + + if (movingobjectposition == null) { + return super.onItemRightClick(item, world, player); + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) { + return super.onItemRightClick(item, world, player); + } + + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return super.onItemRightClick(item, world, player); + } + + if (isWaterSource(world, i, j, k)) { + gather(item, world, player); + return item; + } + } + return super.onItemRightClick(item, world, player); + } + } + + private void gather(ItemStack item, World world, EntityPlayer player) { + player.swingItem(); + if (!world.isRemote) { + world.playSoundAtEntity(player, "random.splash", 0.125F + rand.nextFloat() / 4F, 0.5F + rand.nextFloat()); + item.stackSize--; + EntityItem resultItem = new EntityItem(world, player.posX, player.posY, player.posZ, + new ItemStack(FoodListMF.jug_water)); + world.spawnEntityInWorld(resultItem); + } + } + + private boolean isWaterSource(World world, int i, int j, int k) { + return TongsHelper.getWaterSource(world, i, j, k) >= 0; + } + + public ItemStack useFilled(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote && storageType != null) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, user, false); + + if (movingobjectposition == null) { + return item; + } else { + int placed = BlockComponent.useComponent(item, storageType, blocktex, world, user, + movingobjectposition); + if (placed > 0) { + item.stackSize -= placed; + return item; + } + } + } + user.setItemInUse(item, getMaxItemUseDuration(item)); + return item; + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemLootSack.java b/src/main/java/minefantasy/mf2/item/gadget/ItemLootSack.java index 91860c8a..88ac4e62 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemLootSack.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemLootSack.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.Random; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.block.list.BlockListMF; @@ -18,218 +16,220 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; +import java.util.Random; + public class ItemLootSack extends Item { - public static final String COMMON = "commonLootBag"; - public static final String VALUABLE = "valuableLootBag"; - public static final String EXQUISITE = "exquisiteLootBag"; - - protected int amount, tier; - protected String pool; - - public ItemLootSack(String name, int amount, int tier) { - this.setCreativeTab(CreativeTabMF.tabGadget); - this.amount = amount; - this.tier = tier; - pool = tier == 0 ? COMMON : tier == 1 ? VALUABLE : EXQUISITE; - setTextureName("minefantasy2:Other/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (user.isSwingInProgress) - return item; - - user.swingItem(); - if (!user.capabilities.isCreativeMode) { - --item.stackSize; - } - user.playSound("mob.horse.leather", 1.0F, 1.5F); - - if (!world.isRemote) { - ChestGenHooks gen = ChestGenHooks.getInfo(pool); - IInventory inv = new Loot(amount); - Random rand = new Random(); - WeightedRandomChestContent.generateChestContents(rand, gen.getItems(rand), inv, 1 + rand.nextInt(amount)); - for (int a = 0; a < inv.getSizeInventory(); a++) { - if (inv.getStackInSlot(a) != null) { - ItemStack drop = inv.getStackInSlot(a); - if (!user.inventory.addItemStackToInventory(drop)) { - user.entityDropItem(drop, 0F); - } - } - } - } - return item; - } - - @Override - public EnumRarity getRarity(ItemStack item) { - return tier == 0 ? EnumRarity.common : tier == 1 ? EnumRarity.uncommon : EnumRarity.epic; - } - - public static class Loot implements IInventory { - public ItemStack[] contents; - - public Loot(int count) { - contents = new ItemStack[count]; - } - - @Override - public int getSizeInventory() { - return contents.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return contents[slot]; - } - - @Override - public ItemStack decrStackSize(int slot, int num) { - contents[slot].stackSize -= num; - return contents[slot]; - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - return null; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack item) { - contents[slot] = item; - } - - @Override - public String getInventoryName() { - return null; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public void markDirty() { - // TODO Auto-generated method stub - - } - - @Override - public boolean isUseableByPlayer(EntityPlayer p_70300_1_) { - return false; - } - - @Override - public void openInventory() { - } - - @Override - public void closeInventory() { - } - - @Override - public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) { - return false; - } - - } - - public static void addItems() { - String loot = COMMON; // Some books, Commodities - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 1, 1, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 1, 1, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 1, 1, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 1, 1, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 1, 1, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_basic), 1, 1, 10)); - - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.coal), 4, 12, 20)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(ComponentListMF.plank.construct("OakWood"), 1, 8, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.leather), 1, 4, 20)); - - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.string), 1, 2, 10)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(ComponentListMF.plank.construct("RefinedWood"), 1, 2, 10)); - - loot = VALUABLE; // Books, Valued commodities - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 1, 3, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 1, 3, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 1, 3, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 1, 3, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 1, 3, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_advanced), 1, 1, 2)); - - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ComponentListMF.kaolinite), 1, 8, 10)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.dye, 1, 4), 1, 8, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20));// Silver - - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 2, 10)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 2, 10)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.ender_pearl), 1, 2, 10)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 4, 10)); - addRecords(loot, 2); - - loot = EXQUISITE; // Many books, Highly sought commodities - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 2, 5, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 2, 5, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 2, 5, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 2, 5, 5)); - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 2, 5, 5)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_ornate), 1, 1, 5)); - - ChestGenHooks.addItem(loot, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.flux_strong), 12, 32, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.diamond), 4, 8, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.emerald), 4, 8, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.ender_eye), 4, 8, 20)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20));// Wolframite - - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.golden_apple, 1, 1), 1, 1, 10)); - addRecords(loot, 5); - - } - - private static void addRecords(String loot, int rarity) { - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_11), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_13), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_blocks), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_cat), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_chirp), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_far), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_mall), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_mellohi), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_stal), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_strad), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_wait), 1, 1, rarity)); - ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_ward), 1, 1, rarity)); - } + public static final String COMMON = "commonLootBag"; + public static final String VALUABLE = "valuableLootBag"; + public static final String EXQUISITE = "exquisiteLootBag"; + + protected int amount, tier; + protected String pool; + + public ItemLootSack(String name, int amount, int tier) { + this.setCreativeTab(CreativeTabMF.tabGadget); + this.amount = amount; + this.tier = tier; + pool = tier == 0 ? COMMON : tier == 1 ? VALUABLE : EXQUISITE; + setTextureName("minefantasy2:Other/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + public static void addItems() { + String loot = COMMON; // Some books, Commodities + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 1, 1, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 1, 1, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 1, 1, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 1, 1, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 1, 1, 5)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_basic), 1, 1, 10)); + + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.coal), 4, 12, 20)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(ComponentListMF.plank.construct("OakWood"), 1, 8, 20)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 20)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.leather), 1, 4, 20)); + + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.string), 1, 2, 10)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(ComponentListMF.plank.construct("RefinedWood"), 1, 2, 10)); + + loot = VALUABLE; // Books, Valued commodities + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 1, 3, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 1, 3, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 1, 3, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 1, 3, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 1, 3, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_advanced), 1, 1, 2)); + + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(ComponentListMF.kaolinite), 1, 8, 10)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.dye, 1, 4), 1, 8, 20)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 20)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20));// Silver + + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 2, 10)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 2, 10)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.ender_pearl), 1, 2, 10)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 4, 10)); + addRecords(loot, 2); + + loot = EXQUISITE; // Many books, Highly sought commodities + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_artisanry), 2, 5, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_construction), 2, 5, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_provisioning), 2, 5, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_engineering), 2, 5, 5)); + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ToolListMF.skillbook_combat), 2, 5, 5)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_ornate), 1, 1, 5)); + + ChestGenHooks.addItem(loot, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.flux_strong), 12, 32, 20)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.diamond), 4, 8, 20)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.emerald), 4, 8, 20)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.ender_eye), 4, 8, 20)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20));// Wolframite + + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.golden_apple, 1, 1), 1, 1, 10)); + addRecords(loot, 5); + + } + + private static void addRecords(String loot, int rarity) { + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_11), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_13), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_blocks), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_cat), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_chirp), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_far), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_mall), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_mellohi), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_stal), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_strad), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_wait), 1, 1, rarity)); + ChestGenHooks.addItem(loot, new WeightedRandomChestContent(new ItemStack(Items.record_ward), 1, 1, rarity)); + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (user.isSwingInProgress) + return item; + + user.swingItem(); + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + user.playSound("mob.horse.leather", 1.0F, 1.5F); + + if (!world.isRemote) { + ChestGenHooks gen = ChestGenHooks.getInfo(pool); + IInventory inv = new Loot(amount); + Random rand = new Random(); + WeightedRandomChestContent.generateChestContents(rand, gen.getItems(rand), inv, 1 + rand.nextInt(amount)); + for (int a = 0; a < inv.getSizeInventory(); a++) { + if (inv.getStackInSlot(a) != null) { + ItemStack drop = inv.getStackInSlot(a); + if (!user.inventory.addItemStackToInventory(drop)) { + user.entityDropItem(drop, 0F); + } + } + } + } + return item; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return tier == 0 ? EnumRarity.common : tier == 1 ? EnumRarity.uncommon : EnumRarity.epic; + } + + public static class Loot implements IInventory { + public ItemStack[] contents; + + public Loot(int count) { + contents = new ItemStack[count]; + } + + @Override + public int getSizeInventory() { + return contents.length; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return contents[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int num) { + contents[slot].stackSize -= num; + return contents[slot]; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return null; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack item) { + contents[slot] = item; + } + + @Override + public String getInventoryName() { + return null; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public void markDirty() { + // TODO Auto-generated method stub + + } + + @Override + public boolean isUseableByPlayer(EntityPlayer p_70300_1_) { + return false; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) { + return false; + } + + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemMine.java b/src/main/java/minefantasy/mf2/item/gadget/ItemMine.java index b1ea68c4..e9c43c1b 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemMine.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemMine.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,232 +23,233 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.List; + public class ItemMine extends Item implements ISpecialSalvage, IAmmo { - public ItemMine(String name) { - this.maxStackSize = 16; - this.setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - BlockDispenser.dispenseBehaviorRegistry.putObject(this, new BombDispenser()); - } - - @Override - public EnumAction getItemUseAction(ItemStack item) { - return EnumAction.block; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (!user.isSwingInProgress) { - world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "fire.ignite", 1.0F, - itemRand.nextFloat() * 0.4F + 0.8F); - user.setItemInUse(item, getMaxItemUseDuration(item)); - } - return item; - } - - @Override - public int getMaxItemUseDuration(ItemStack item) { - return 35; - } - - @Override - public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { - world.playSoundEffect(user.posX, user.posY + 1.5, user.posZ, "random.click", 1.0F, 1.0F); - user.swingItem(); - if (!user.capabilities.isCreativeMode) { - --item.stackSize; - } - - if (!world.isRemote) { - world.spawnEntityInWorld(new EntityMine(world, user).setType(getFilling(item), getCasing(item), - getFuse(item), getPowder(item))); - } - - return item; - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { - super.addInformation(item, user, list, fullInfo); - - EnumExplosiveType fill = EnumExplosiveType.getType(getFilling(item)); - EnumCasingType casing = EnumCasingType.getType(getCasing(item)); - EnumFuseType fuse = EnumFuseType.getType(getFuse(item)); - EnumPowderType powder = EnumPowderType.getType(getPowder(item)); - - int damage = (int) (fill.damage * casing.damageModifier * powder.damageModifier); - float range = fill.range * casing.rangeModifier * powder.rangeModifier; - float fusetime = fuse.time / 20F; - - list.add(StatCollector.translateToLocal("bomb.case." + casing.name + ".name")); - list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); - list.add(StatCollector.translateToLocal("bomb.fuse." + fuse.name + ".name")); - list.add(""); - list.add(StatCollector.translateToLocalFormatted("bomb.fusetime.name", fusetime)); - list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); - list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); - } - - @Override - public String getUnlocalizedName(ItemStack item) { - EnumExplosiveType type = EnumExplosiveType.getType(getFilling(item)); - return "item.mine_" + type.name; - } - - private static final String powderNBT = "MineFantasy_PowderType"; - private static final String fuseNBT = "MineFantasy_FuseType"; - private static final String fillingNBT = "MineFantasy_ExplosiveType"; - private static final String casingNBT = "MineFantasy_CaseType"; - - public static void setFuse(ItemStack item, byte fuse) { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(fuseNBT, fuse); - } - - public static byte getFuse(ItemStack item) { - NBTTagCompound nbt = getNBT(item); - if (nbt.hasKey(fuseNBT)) { - return nbt.getByte(fuseNBT); - } - return (byte) 0; - } - - public static void setPowder(ItemStack item, byte powder) { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(powderNBT, powder); - } - - public static byte getPowder(ItemStack item) { - NBTTagCompound nbt = getNBT(item); - if (nbt.hasKey(powderNBT)) { - return nbt.getByte(powderNBT); - } - return (byte) 0; - } - - /** - * 0 = Basic 1 = Shrapnel 2 = Fire - */ - public static void setFilling(ItemStack item, byte filling) { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(fillingNBT, filling); - } - - public static byte getFilling(ItemStack item) { - NBTTagCompound nbt = getNBT(item); - if (nbt.hasKey(fillingNBT)) { - return nbt.getByte(fillingNBT); - } - return (byte) 0; - } - - /** - * 0 = Ceramic 1 = Iron - */ - public static void setCasing(ItemStack item, byte casing) { - NBTTagCompound nbt = getNBT(item); - nbt.setByte(casingNBT, casing); - } - - public static byte getCasing(ItemStack item) { - NBTTagCompound nbt = getNBT(item); - if (nbt.hasKey(casingNBT)) { - return nbt.getByte(casingNBT); - } - return (byte) 0; - } - - public static NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) - item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - public ItemStack createMine(byte casing, byte filling, byte fuse, byte powder, int stackSize) { - return ItemBomb.createExplosive(this, casing, filling, fuse, powder, stackSize); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - list.add(createMine((byte) 0, (byte) 0, (byte) 0, (byte) 0, 1)); - list.add(createMine((byte) 0, (byte) 1, (byte) 0, (byte) 0, 1)); - list.add(createMine((byte) 0, (byte) 2, (byte) 0, (byte) 0, 1)); - - list.add(createMine((byte) 1, (byte) 0, (byte) 0, (byte) 0, 1)); - list.add(createMine((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1)); - list.add(createMine((byte) 1, (byte) 2, (byte) 0, (byte) 0, 1)); - - list.add(createMine((byte) 2, (byte) 0, (byte) 0, (byte) 0, 1)); - list.add(createMine((byte) 2, (byte) 1, (byte) 0, (byte) 0, 1)); - list.add(createMine((byte) 2, (byte) 2, (byte) 0, (byte) 0, 1)); - - list.add(createMine((byte) 3, (byte) 0, (byte) 0, (byte) 0, 1)); - list.add(createMine((byte) 3, (byte) 1, (byte) 0, (byte) 0, 1)); - list.add(createMine((byte) 3, (byte) 2, (byte) 0, (byte) 0, 1)); - } - - // TODO Icons - @SideOnly(Side.CLIENT) - public IIcon getIcon(byte type) { - return mines[type]; - } - - private IIcon[] mines = new IIcon[4]; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - this.itemIcon = mines[0] = reg.registerIcon("minefantasy2:Other/mine_ceramic"); - mines[1] = reg.registerIcon("minefantasy2:Other/mine_iron"); - mines[2] = reg.registerIcon("minefantasy2:Other/mine_obsidian"); - mines[3] = reg.registerIcon("minefantasy2:Other/mine_crystal"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconIndex(ItemStack item) { - int type = getCasing(item); - return mines[type]; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack item, int layer) { - if (layer > 0) { - int type = getFilling(item); - if (type != 0) { - return ToolListMF.bomb_custom.icons[type - 1]; - } - } - return getIconIndex(item); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return true; - } - - @Override - public EnumRarity getRarity(ItemStack item) { - if (getFilling(item) >= 2 || getCasing(item) >= 2) { - return EnumRarity.uncommon; - } - return EnumRarity.common; - } - - @Override - public Object[] getSalvage(ItemStack item) { - return new Object[] { ItemBombComponent.getBombComponent("minecase", getCasing(item)), - ItemBombComponent.getBombComponent("fuse", getFuse(item)), - ItemBombComponent.getBombComponent("powder", getPowder(item)), - ItemBombComponent.getBombComponent("filling", getFilling(item)), }; - } - - @Override - public String getAmmoType(ItemStack arrow) { - return "mine"; - } + private static final String powderNBT = "MineFantasy_PowderType"; + private static final String fuseNBT = "MineFantasy_FuseType"; + private static final String fillingNBT = "MineFantasy_ExplosiveType"; + private static final String casingNBT = "MineFantasy_CaseType"; + private IIcon[] mines = new IIcon[4]; + + public ItemMine(String name) { + this.maxStackSize = 16; + this.setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + BlockDispenser.dispenseBehaviorRegistry.putObject(this, new BombDispenser()); + } + + public static void setFuse(ItemStack item, byte fuse) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(fuseNBT, fuse); + } + + public static byte getFuse(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (nbt.hasKey(fuseNBT)) { + return nbt.getByte(fuseNBT); + } + return (byte) 0; + } + + public static void setPowder(ItemStack item, byte powder) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(powderNBT, powder); + } + + public static byte getPowder(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (nbt.hasKey(powderNBT)) { + return nbt.getByte(powderNBT); + } + return (byte) 0; + } + + /** + * 0 = Basic 1 = Shrapnel 2 = Fire + */ + public static void setFilling(ItemStack item, byte filling) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(fillingNBT, filling); + } + + public static byte getFilling(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (nbt.hasKey(fillingNBT)) { + return nbt.getByte(fillingNBT); + } + return (byte) 0; + } + + /** + * 0 = Ceramic 1 = Iron + */ + public static void setCasing(ItemStack item, byte casing) { + NBTTagCompound nbt = getNBT(item); + nbt.setByte(casingNBT, casing); + } + + public static byte getCasing(ItemStack item) { + NBTTagCompound nbt = getNBT(item); + if (nbt.hasKey(casingNBT)) { + return nbt.getByte(casingNBT); + } + return (byte) 0; + } + + public static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.block; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!user.isSwingInProgress) { + world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "fire.ignite", 1.0F, + itemRand.nextFloat() * 0.4F + 0.8F); + user.setItemInUse(item, getMaxItemUseDuration(item)); + } + return item; + } + + @Override + public int getMaxItemUseDuration(ItemStack item) { + return 35; + } + + @Override + public ItemStack onEaten(ItemStack item, World world, EntityPlayer user) { + world.playSoundEffect(user.posX, user.posY + 1.5, user.posZ, "random.click", 1.0F, 1.0F); + user.swingItem(); + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + + if (!world.isRemote) { + world.spawnEntityInWorld(new EntityMine(world, user).setType(getFilling(item), getCasing(item), + getFuse(item), getPowder(item))); + } + + return item; + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean fullInfo) { + super.addInformation(item, user, list, fullInfo); + + EnumExplosiveType fill = EnumExplosiveType.getType(getFilling(item)); + EnumCasingType casing = EnumCasingType.getType(getCasing(item)); + EnumFuseType fuse = EnumFuseType.getType(getFuse(item)); + EnumPowderType powder = EnumPowderType.getType(getPowder(item)); + + int damage = (int) (fill.damage * casing.damageModifier * powder.damageModifier); + float range = fill.range * casing.rangeModifier * powder.rangeModifier; + float fusetime = fuse.time / 20F; + + list.add(StatCollector.translateToLocal("bomb.case." + casing.name + ".name")); + list.add(StatCollector.translateToLocal("bomb.powder." + powder.name + ".name")); + list.add(StatCollector.translateToLocal("bomb.fuse." + fuse.name + ".name")); + list.add(""); + list.add(StatCollector.translateToLocalFormatted("bomb.fusetime.name", fusetime)); + list.add(StatCollector.translateToLocal("bomb.damage.name") + ": " + damage); + list.add(StatCollector.translateToLocalFormatted("bomb.range.metric.name", range)); + } + + @Override + public String getUnlocalizedName(ItemStack item) { + EnumExplosiveType type = EnumExplosiveType.getType(getFilling(item)); + return "item.mine_" + type.name; + } + + public ItemStack createMine(byte casing, byte filling, byte fuse, byte powder, int stackSize) { + return ItemBomb.createExplosive(this, casing, filling, fuse, powder, stackSize); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(createMine((byte) 0, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 0, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 0, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createMine((byte) 1, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 1, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createMine((byte) 2, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 2, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 2, (byte) 2, (byte) 0, (byte) 0, 1)); + + list.add(createMine((byte) 3, (byte) 0, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 3, (byte) 1, (byte) 0, (byte) 0, 1)); + list.add(createMine((byte) 3, (byte) 2, (byte) 0, (byte) 0, 1)); + } + + // TODO Icons + @SideOnly(Side.CLIENT) + public IIcon getIcon(byte type) { + return mines[type]; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + this.itemIcon = mines[0] = reg.registerIcon("minefantasy2:Other/mine_ceramic"); + mines[1] = reg.registerIcon("minefantasy2:Other/mine_iron"); + mines[2] = reg.registerIcon("minefantasy2:Other/mine_obsidian"); + mines[3] = reg.registerIcon("minefantasy2:Other/mine_crystal"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack item) { + int type = getCasing(item); + return mines[type]; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack item, int layer) { + if (layer > 0) { + int type = getFilling(item); + if (type != 0) { + return ToolListMF.bomb_custom.icons[type - 1]; + } + } + return getIconIndex(item); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + public EnumRarity getRarity(ItemStack item) { + if (getFilling(item) >= 2 || getCasing(item) >= 2) { + return EnumRarity.uncommon; + } + return EnumRarity.common; + } + + @Override + public Object[] getSalvage(ItemStack item) { + return new Object[]{ItemBombComponent.getBombComponent("minecase", getCasing(item)), + ItemBombComponent.getBombComponent("fuse", getFuse(item)), + ItemBombComponent.getBombComponent("powder", getPowder(item)), + ItemBombComponent.getBombComponent("filling", getFilling(item)),}; + } + + @Override + public String getAmmoType(ItemStack arrow) { + return "mine"; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemParachute.java b/src/main/java/minefantasy/mf2/item/gadget/ItemParachute.java index 792ba8b5..12d416ee 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemParachute.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemParachute.java @@ -10,24 +10,24 @@ import net.minecraft.world.World; public class ItemParachute extends Item { - public ItemParachute() { - String name = "parachute"; - this.maxStackSize = 1; - this.setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } + public ItemParachute() { + String name = "parachute"; + this.maxStackSize = 1; + this.setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (!world.isRemote) { - world.playSoundAtEntity(user, "mob.horse.leather", 1.0F, 0.5F); - EntityParachute chute = new EntityParachute(world, user.posX, user.posY, user.posZ); - world.spawnEntityInWorld(chute); - user.mountEntity(chute); - --item.stackSize; - } - return item; - } + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (!world.isRemote) { + world.playSoundAtEntity(user, "mob.horse.leather", 1.0F, 0.5F); + EntityParachute chute = new EntityParachute(world, user.posX, user.posY, user.posZ); + world.spawnEntityInWorld(chute); + user.mountEntity(chute); + --item.stackSize; + } + return item; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemSpyglass.java b/src/main/java/minefantasy/mf2/item/gadget/ItemSpyglass.java index 0ead0c75..db8bf9c6 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemSpyglass.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemSpyglass.java @@ -14,65 +14,65 @@ import net.minecraft.world.World; public class ItemSpyglass extends Item implements IScope { - public ItemSpyglass() { - this.setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/spyglass_small"); - GameRegistry.registerItem(this, "spyglass", MineFantasyII.MODID); - this.setUnlocalizedName("spyglass"); - this.setHasSubtypes(true); - this.setMaxDamage(0); - this.setMaxStackSize(1); - } + public IIcon[] icons = new IIcon[3]; - @Override - public EnumAction getItemUseAction(ItemStack item) { - return EnumAction.bow; - } + public ItemSpyglass() { + this.setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/spyglass_small"); + GameRegistry.registerItem(this, "spyglass", MineFantasyII.MODID); + this.setUnlocalizedName("spyglass"); + this.setHasSubtypes(true); + this.setMaxDamage(0); + this.setMaxStackSize(1); + } - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (user.isSneaking()) { - world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "random.click", 1.0F, 1.5F); - toggleMode(item); - user.swingItem(); - } else { - user.setItemInUse(item, getMaxItemUseDuration(item)); - } - return item; - } + @Override + public EnumAction getItemUseAction(ItemStack item) { + return EnumAction.bow; + } - private void toggleMode(ItemStack item) { - int dam = item.getItemDamage(); - item.setItemDamage(dam == 2 ? 0 : dam + 1); - } + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (user.isSneaking()) { + world.playSoundEffect(user.posX, user.posY + 1.5D, user.posZ, "random.click", 1.0F, 1.5F); + toggleMode(item); + user.swingItem(); + } else { + user.setItemInUse(item, getMaxItemUseDuration(item)); + } + return item; + } - @Override - public int getMaxItemUseDuration(ItemStack item) { - return Integer.MAX_VALUE; - } + private void toggleMode(ItemStack item) { + int dam = item.getItemDamage(); + item.setItemDamage(dam == 2 ? 0 : dam + 1); + } - public IIcon[] icons = new IIcon[3]; + @Override + public int getMaxItemUseDuration(ItemStack item) { + return Integer.MAX_VALUE; + } - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - icons[0] = reg.registerIcon("minefantasy2:Other/spyglass_small"); - icons[1] = reg.registerIcon("minefantasy2:Other/spyglass_medium"); - icons[2] = reg.registerIcon("minefantasy2:Other/spyglass_long"); - } + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + icons[0] = reg.registerIcon("minefantasy2:Other/spyglass_small"); + icons[1] = reg.registerIcon("minefantasy2:Other/spyglass_medium"); + icons[2] = reg.registerIcon("minefantasy2:Other/spyglass_long"); + } - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int id) { - if (id > 2) { - id = 2; - } - return icons[id]; - } + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int id) { + if (id > 2) { + id = 2; + } + return icons[id]; + } - @Override - public float getZoom(ItemStack item) { - int id = item.getItemDamage(); - return 0.5F + (0.25F * id); - } + @Override + public float getZoom(ItemStack item) { + int id = item.getItemDamage(); + return 0.5F + (0.25F * id); + } } diff --git a/src/main/java/minefantasy/mf2/item/gadget/ItemSyringe.java b/src/main/java/minefantasy/mf2/item/gadget/ItemSyringe.java index ee50ec42..7e6fa229 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/ItemSyringe.java +++ b/src/main/java/minefantasy/mf2/item/gadget/ItemSyringe.java @@ -1,13 +1,7 @@ package minefantasy.mf2.item.gadget; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -30,180 +24,184 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + public class ItemSyringe extends ItemPotion { - public ItemSyringe() { - super(); - this.setMaxStackSize(16); - String name = "syringe"; - this.setCreativeTab(CreativeTabMF.tabGadget); - setTextureName("minefantasy2:Other/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", 0, 0)); - - return map; - } - - @Override - public boolean hitEntity(ItemStack item, EntityLivingBase target, EntityLivingBase user) { - World world = user.worldObj; - - target.playSound("random.drink", 1.0F, 2.0F); - target.playSound("minefantasy2:weapon.hit.blade.metal", 1.0F, 1.5F); - if (!world.isRemote) { - apply(target, item); - } - - if (user instanceof EntityPlayer && !((EntityPlayer) user).capabilities.isCreativeMode) { - --item.stackSize; - - if (item.stackSize <= 0) { - user.setCurrentItemOrArmor(0, new ItemStack(ToolListMF.syringe_empty)); - } else { - if (!((EntityPlayer) user).inventory.addItemStackToInventory(new ItemStack(ToolListMF.syringe_empty))) { - user.entityDropItem(new ItemStack(ToolListMF.syringe_empty), 0F); - } - } - } - - return true; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { - if (user.isSwingInProgress) { - return item; - } - user.swingItem(); - - if (!user.capabilities.isCreativeMode) { - --item.stackSize; - } - - user.playSound("random.drink", 1.0F, 2.0F); - user.playSound("minefantasy2:weapon.hit.blade.metal", 1.0F, 1.5F); - if (!world.isRemote) { - apply(user, item); - } - - if (!user.capabilities.isCreativeMode) { - if (item.stackSize <= 0) { - return new ItemStack(ToolListMF.syringe_empty); - } - - if (!user.inventory.addItemStackToInventory(new ItemStack(ToolListMF.syringe_empty))) { - user.entityDropItem(new ItemStack(ToolListMF.syringe_empty), 0F); - } - } - - return item; - } - - private void apply(EntityLivingBase target, ItemStack item) { - List list = this.getEffects(item); - - if (list != null) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - PotionEffect potioneffect = (PotionEffect) iterator.next(); - target.addPotionEffect(new PotionEffect(potioneffect)); - } - } - } - - private IIcon icon, fill; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - this.icon = reg.registerIcon(this.getIconString()); - this.fill = reg.registerIcon(this.getIconString() + "_" + "fill"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int p_77617_1_) { - return icon; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamageForRenderPass(int p_77618_1_, int p_77618_2_) { - return p_77618_2_ == 0 ? fill : super.getIconFromDamageForRenderPass(p_77618_1_, p_77618_2_); - } - - @Override - public String getItemStackDisplayName(ItemStack item) { - if (item.getItemDamage() == 0) { - return StatCollector.translateToLocal("item.syringe_empty.name"); - } else { - String s = ""; - - List list = Items.potionitem.getEffects(item); - String s1; - - if (list != null && !list.isEmpty()) { - s1 = ((PotionEffect) list.get(0)).getEffectName(); - s1 = s1 + ".postfix"; - return s + StatCollector.translateToLocal(s1).trim(); - } else { - s1 = PotionHelper.func_77905_c(item.getItemDamage()); - return StatCollector.translateToLocal(s1).trim() + " " + super.getItemStackDisplayName(item); - } - } - } - - private static final Map potionMap = new LinkedHashMap(); - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs tab, List list) { - int sub; - - if (potionMap.isEmpty()) { - for (int i = 0; i <= 15; ++i) { - for (sub = 0; sub <= 0; ++sub) { - int k; - - if (sub == 0) { - k = i | 8192; - } else { - k = i | 16384; - } - - for (int l = 0; l <= 2; ++l) { - int i1 = k; - - if (l != 0) { - if (l == 1) { - i1 = k | 32; - } else if (l == 2) { - i1 = k | 64; - } - } - - List list1 = PotionHelper.getPotionEffects(i1, false); - - if (list1 != null && !list1.isEmpty() && !ItemPotion.isSplash(i1)) { - potionMap.put(list1, Integer.valueOf(i1)); - } - } - } - } - } - - Iterator iterator = potionMap.values().iterator(); - - while (iterator.hasNext()) { - sub = ((Integer) iterator.next()).intValue(); - list.add(new ItemStack(item, 1, sub)); - } - } + private static final Map potionMap = new LinkedHashMap(); + private IIcon icon, fill; + + public ItemSyringe() { + super(); + this.setMaxStackSize(16); + String name = "syringe"; + this.setCreativeTab(CreativeTabMF.tabGadget); + setTextureName("minefantasy2:Other/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", 0, 0)); + + return map; + } + + @Override + public boolean hitEntity(ItemStack item, EntityLivingBase target, EntityLivingBase user) { + World world = user.worldObj; + + target.playSound("random.drink", 1.0F, 2.0F); + target.playSound("minefantasy2:weapon.hit.blade.metal", 1.0F, 1.5F); + if (!world.isRemote) { + apply(target, item); + } + + if (user instanceof EntityPlayer && !((EntityPlayer) user).capabilities.isCreativeMode) { + --item.stackSize; + + if (item.stackSize <= 0) { + user.setCurrentItemOrArmor(0, new ItemStack(ToolListMF.syringe_empty)); + } else { + if (!((EntityPlayer) user).inventory.addItemStackToInventory(new ItemStack(ToolListMF.syringe_empty))) { + user.entityDropItem(new ItemStack(ToolListMF.syringe_empty), 0F); + } + } + } + + return true; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user) { + if (user.isSwingInProgress) { + return item; + } + user.swingItem(); + + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + + user.playSound("random.drink", 1.0F, 2.0F); + user.playSound("minefantasy2:weapon.hit.blade.metal", 1.0F, 1.5F); + if (!world.isRemote) { + apply(user, item); + } + + if (!user.capabilities.isCreativeMode) { + if (item.stackSize <= 0) { + return new ItemStack(ToolListMF.syringe_empty); + } + + if (!user.inventory.addItemStackToInventory(new ItemStack(ToolListMF.syringe_empty))) { + user.entityDropItem(new ItemStack(ToolListMF.syringe_empty), 0F); + } + } + + return item; + } + + private void apply(EntityLivingBase target, ItemStack item) { + List list = this.getEffects(item); + + if (list != null) { + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) { + PotionEffect potioneffect = (PotionEffect) iterator.next(); + target.addPotionEffect(new PotionEffect(potioneffect)); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + this.icon = reg.registerIcon(this.getIconString()); + this.fill = reg.registerIcon(this.getIconString() + "_" + "fill"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int p_77617_1_) { + return icon; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamageForRenderPass(int p_77618_1_, int p_77618_2_) { + return p_77618_2_ == 0 ? fill : super.getIconFromDamageForRenderPass(p_77618_1_, p_77618_2_); + } + + @Override + public String getItemStackDisplayName(ItemStack item) { + if (item.getItemDamage() == 0) { + return StatCollector.translateToLocal("item.syringe_empty.name"); + } else { + String s = ""; + + List list = Items.potionitem.getEffects(item); + String s1; + + if (list != null && !list.isEmpty()) { + s1 = ((PotionEffect) list.get(0)).getEffectName(); + s1 = s1 + ".postfix"; + return s + StatCollector.translateToLocal(s1).trim(); + } else { + s1 = PotionHelper.func_77905_c(item.getItemDamage()); + return StatCollector.translateToLocal(s1).trim() + " " + super.getItemStackDisplayName(item); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + int sub; + + if (potionMap.isEmpty()) { + for (int i = 0; i <= 15; ++i) { + for (sub = 0; sub <= 0; ++sub) { + int k; + + if (sub == 0) { + k = i | 8192; + } else { + k = i | 16384; + } + + for (int l = 0; l <= 2; ++l) { + int i1 = k; + + if (l != 0) { + if (l == 1) { + i1 = k | 32; + } else if (l == 2) { + i1 = k | 64; + } + } + + List list1 = PotionHelper.getPotionEffects(i1, false); + + if (list1 != null && !list1.isEmpty() && !ItemPotion.isSplash(i1)) { + potionMap.put(list1, Integer.valueOf(i1)); + } + } + } + } + } + + Iterator iterator = potionMap.values().iterator(); + + while (iterator.hasNext()) { + sub = ((Integer) iterator.next()).intValue(); + list.add(new ItemStack(item, 1, sub)); + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/gadget/MobSpawnerMF.java b/src/main/java/minefantasy/mf2/item/gadget/MobSpawnerMF.java index 93adafe3..6873b5a5 100644 --- a/src/main/java/minefantasy/mf2/item/gadget/MobSpawnerMF.java +++ b/src/main/java/minefantasy/mf2/item/gadget/MobSpawnerMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.gadget; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.entity.EntityCogwork; @@ -25,115 +23,117 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.List; + public class MobSpawnerMF extends ItemComponentMF { - public String[] types = new String[] { "dragon", "minotaur", "hound", "cogwork" }; - public IIcon[] icons; - - public MobSpawnerMF() { - super("MF_Spawner"); - this.setHasSubtypes(true); - this.setCreativeTab(CreativeTabs.tabMisc); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - list.add(StatCollector - .translateToLocal("item.spawn_" + types[Math.min(types.length - 1, item.getItemDamage())] + ".desc")); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - for (int i = 0; i < types.length; i++) { - list.add(new ItemStack(item, 1, i)); - } - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - return StatCollector - .translateToLocal("item.spawn_" + types[Math.min(types.length - 1, item.getItemDamage())] + ".name"); - } - - @Override - public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int blockX, int blockY, int blockZ, - int face, float ox, float oy, float oz) { - if (world.isRemote) { - return true; - } else { - Block block = world.getBlock(blockX, blockY, blockZ); - blockX += Facing.offsetsXForSide[face]; - blockY += Facing.offsetsYForSide[face]; - blockZ += Facing.offsetsZForSide[face]; - double d0 = 0.0D; - - if (face == 1 && block.getRenderType() == 11) { - d0 = 0.5D; - } - - Entity entity = spawnCreature(world, item.getItemDamage(), blockX + 0.5D, blockY + d0, blockZ + 0.5D); - - if (entity != null) { - if (entity instanceof EntityLivingBase && item.hasDisplayName()) { - ((EntityLiving) entity).setCustomNameTag(item.getDisplayName()); - } - - if (!user.capabilities.isCreativeMode) { - --item.stackSize; - } - } - - return true; - } - } - - private Entity spawnCreature(World world, int itemDamage, double x, double y, double z) { - EntityLivingBase entityliving = getLiving(world, itemDamage); - - entityliving.setLocationAndAngles(x, y, z, MathHelper.wrapAngleTo180_float(world.rand.nextFloat() * 360.0F), - 0.0F); - entityliving.rotationYawHead = entityliving.rotationYaw; - entityliving.renderYawOffset = entityliving.rotationYaw; - if (entityliving instanceof EntityLiving) { - ((EntityLiving) entityliving).onSpawnWithEgg((IEntityLivingData) null); - } - world.spawnEntityInWorld(entityliving); - if (entityliving instanceof EntityLiving) { - ((EntityLiving) entityliving).playLivingSound(); - } - - return entityliving; - } - - private EntityLivingBase getLiving(World world, int id) { - switch (id) { - case 0: - return new EntityDragon(world); - case 1: - return new EntityMinotaur(world); - case 2: - return new EntityHound(world); - case 3: - return new EntityCogwork(world); - - default: - return new EntityDragon(world); - } - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int d) { - return icons[Math.min(icons.length - 1, d)]; - } - - @SideOnly(Side.CLIENT) - @Override - public void registerIcons(IIconRegister reg) { - icons = new IIcon[types.length]; - for (int i = 0; i < types.length; i++) { - icons[i] = reg.registerIcon("minefantasy2:Other/spawn_" + types[i]); - } - } + public String[] types = new String[]{"dragon", "minotaur", "hound", "cogwork"}; + public IIcon[] icons; + + public MobSpawnerMF() { + super("MF_Spawner"); + this.setHasSubtypes(true); + this.setCreativeTab(CreativeTabs.tabMisc); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + list.add(StatCollector + .translateToLocal("item.spawn_" + types[Math.min(types.length - 1, item.getItemDamage())] + ".desc")); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i < types.length; i++) { + list.add(new ItemStack(item, 1, i)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + return StatCollector + .translateToLocal("item.spawn_" + types[Math.min(types.length - 1, item.getItemDamage())] + ".name"); + } + + @Override + public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int blockX, int blockY, int blockZ, + int face, float ox, float oy, float oz) { + if (world.isRemote) { + return true; + } else { + Block block = world.getBlock(blockX, blockY, blockZ); + blockX += Facing.offsetsXForSide[face]; + blockY += Facing.offsetsYForSide[face]; + blockZ += Facing.offsetsZForSide[face]; + double d0 = 0.0D; + + if (face == 1 && block.getRenderType() == 11) { + d0 = 0.5D; + } + + Entity entity = spawnCreature(world, item.getItemDamage(), blockX + 0.5D, blockY + d0, blockZ + 0.5D); + + if (entity != null) { + if (entity instanceof EntityLivingBase && item.hasDisplayName()) { + ((EntityLiving) entity).setCustomNameTag(item.getDisplayName()); + } + + if (!user.capabilities.isCreativeMode) { + --item.stackSize; + } + } + + return true; + } + } + + private Entity spawnCreature(World world, int itemDamage, double x, double y, double z) { + EntityLivingBase entityliving = getLiving(world, itemDamage); + + entityliving.setLocationAndAngles(x, y, z, MathHelper.wrapAngleTo180_float(world.rand.nextFloat() * 360.0F), + 0.0F); + entityliving.rotationYawHead = entityliving.rotationYaw; + entityliving.renderYawOffset = entityliving.rotationYaw; + if (entityliving instanceof EntityLiving) { + ((EntityLiving) entityliving).onSpawnWithEgg((IEntityLivingData) null); + } + world.spawnEntityInWorld(entityliving); + if (entityliving instanceof EntityLiving) { + ((EntityLiving) entityliving).playLivingSound(); + } + + return entityliving; + } + + private EntityLivingBase getLiving(World world, int id) { + switch (id) { + case 0: + return new EntityDragon(world); + case 1: + return new EntityMinotaur(world); + case 2: + return new EntityHound(world); + case 3: + return new EntityCogwork(world); + + default: + return new EntityDragon(world); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int d) { + return icons[Math.min(icons.length - 1, d)]; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IIconRegister reg) { + icons = new IIcon[types.length]; + for (int i = 0; i < types.length; i++) { + icons[i] = reg.registerIcon("minefantasy2:Other/spawn_" + types[i]); + } + } } diff --git a/src/main/java/minefantasy/mf2/item/heatable/ItemHeated.java b/src/main/java/minefantasy/mf2/item/heatable/ItemHeated.java index ff9a2055..757a56ca 100644 --- a/src/main/java/minefantasy/mf2/item/heatable/ItemHeated.java +++ b/src/main/java/minefantasy/mf2/item/heatable/ItemHeated.java @@ -1,8 +1,5 @@ package minefantasy.mf2.item.heatable; -import java.awt.Color; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,329 +23,332 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.awt.*; +import java.util.List; + public class ItemHeated extends Item implements IHotItem { - public ItemHeated() { - GameRegistry.registerItem(this, "MF_Hot_Item", MineFantasyII.MODID); - this.setUnlocalizedName("MF_Hot_Item"); - this.setHasSubtypes(true); - this.setMaxStackSize(64); - } - - public static int getTemp(ItemStack item) { - return Heatable.getTemp(item); - } - - public static int getWorkTemp(ItemStack item) { - return Heatable.getWorkTemp(item); - } - - public static int getUnstableTemp(ItemStack item) { - return Heatable.getWorkTemp(item); - } - - public static ItemStack getItem(ItemStack item) { - return Heatable.getItem(item); - } - - public static void setTemp(ItemStack item, int heat) { - NBTTagCompound nbt = getNBT(item); - - nbt.setInteger(Heatable.NBT_CurrentTemp, heat); - } - - public static void setWorkTemp(ItemStack item, int heat) { - NBTTagCompound nbt = getNBT(item); - MFLogUtil.logDebug("Set Workable Temp: " + heat); - nbt.setInteger(Heatable.NBT_WorkableTemp, heat); - } - - public static void setUnstableTemp(ItemStack item, int heat) { - NBTTagCompound nbt = getNBT(item); - MFLogUtil.logDebug("Set Unstable Temp: " + heat); - nbt.setInteger(Heatable.NBT_UnstableTemp, heat); - } - - public static ItemStack createHotItem(ItemStack item) { - return createHotItem(item, false); - } - - public static ItemStack createHotItem(ItemStack item, int temp) { - ItemStack hot = createHotItem(item, true); - setTemp(hot, temp); - - return hot; - } - - public static ItemStack createHotItem(ItemStack item, boolean ignoreStats) { - Heatable stats = Heatable.loadStats(item); - if (stats != null) { - ItemStack out = new ItemStack(ComponentListMF.hotItem, item.stackSize); - NBTTagCompound nbt = getNBT(out); - NBTTagCompound save = new NBTTagCompound(); - item.writeToNBT(save); - nbt.setTag(Heatable.NBT_Item, save); - - nbt.setBoolean(Heatable.NBT_ShouldDisplay, true); - setWorkTemp(out, stats.getWorkableStat(item)); - setUnstableTemp(out, stats.getUnstableStat(item)); - - return out; - } else if (ignoreStats) { - ItemStack out = new ItemStack(ComponentListMF.hotItem, item.stackSize); - NBTTagCompound nbt = getNBT(out); - NBTTagCompound save = new NBTTagCompound(); - item.writeToNBT(save); - nbt.setTag(Heatable.NBT_Item, save); - - nbt.setBoolean(Heatable.NBT_ShouldDisplay, false); - setWorkTemp(out, 0); - setUnstableTemp(out, 0); - - return out; - } - return item; - } - - private static void shareTraits(NBTTagCompound nbt, ItemStack item) { - NBTTagCompound itemtag = getNBT(item); - if (itemtag.hasKey("Unbreakable")) { - nbt.setBoolean("Unbreakable", itemtag.getBoolean("Unbreakable")); - } - if (itemtag.hasKey("MF_Inferior")) { - nbt.setBoolean("MF_Inferior", itemtag.getBoolean("MF_Inferior")); - } - if (itemtag.hasKey("MFCraftQuality")) { - nbt.setFloat("MFCraftQuality", itemtag.getFloat("MFCraftQuality")); - } - } - - @Override - public String getItemStackDisplayName(ItemStack stack) { - String name = ""; - - ItemStack item = getItem(stack); - if (item != null) - name = item.getItem().getItemStackDisplayName(item); - return StatCollector.translateToLocalFormatted("prefix.hotitem.name", name); - } - - @Override - public EnumRarity getRarity(ItemStack stack) { - ItemStack item = getItem(stack); - if (item != null) - return item.getItem().getRarity(item); - - return EnumRarity.common; - } - - public static boolean showTemp(ItemStack stack) { - if (stack == null) - return false; - - NBTTagCompound nbt = getNBT(stack); - - if (nbt == null) - return false; - - if (nbt.hasKey(Heatable.NBT_ShouldDisplay)) { - return nbt.getBoolean(Heatable.NBT_ShouldDisplay); - } - return false; - } - - private static NBTTagCompound getNBT(ItemStack item) { - if (!item.hasTagCompound()) - item.setTagCompound(new NBTTagCompound()); - return item.getTagCompound(); - } - - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { - ItemStack item = getItem(stack); - - if (item != null) { - item.getItem().addInformation(item, player, list, b); - } else - super.addInformation(stack, player, list, b); - - NBTTagCompound nbt = getNBT(stack); - if (nbt.hasKey(Heatable.NBT_ShouldDisplay)) { - if (nbt.getBoolean(Heatable.NBT_ShouldDisplay)) { - list.add(getHeatString(stack)); - if (!getWorkString(item, stack).equals("")) - list.add(getWorkString(item, stack)); - } - } - } - - private String getHeatString(ItemStack item) { - int heat = getTemp(item); - String unit = "*C"; - return heat + unit; - } - - private String getWorkString(ItemStack heated, ItemStack item) { - byte stage = Heatable.getHeatableStage(item); - switch (stage) { - case 1: - return EnumChatFormatting.YELLOW + StatCollector.translateToLocal("state.workable"); - case 2: - return EnumChatFormatting.RED + StatCollector.translateToLocal("state.unstable"); - } - return ""; - } - - public IIcon getIcon(ItemStack stack, int renderPass) { - ItemStack item = getItem(stack); - - if (item != null) { - return item.getItem().getIcon(item, renderPass); - } - return Blocks.fire.getBlockTextureFromSide(2); - } - - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - - } - - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - - if (movingobjectposition == null) { - return item; - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (!world.canMineBlock(player, i, j, k)) { - return item; - } - - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { - return item; - } - float water = TongsHelper.getWaterSource(world, i, j, k); - - if (water >= 0) { - player.playSound("random.splash", 1F, 1F); - player.playSound("random.fizz", 2F, 0.5F); - - for (int a = 0; a < 5; a++) { - world.spawnParticle("largesmoke", i + 0.5F, j + 1, k + 0.5F, 0, 0.065F, 0); - } - - ItemStack drop = getItem(item).copy(); - - if (Heatable.HCCquenchRuin) { - float damageDone = 50F + (water > 0F ? water : 0F); - if (damageDone > 99F) - damageDone = 99F; - - if (drop.isItemStackDamageable()) { - drop.setItemDamage((int) (drop.getMaxDamage() * damageDone / 100F)); - } - } - drop.stackSize = item.stackSize; - if (drop != null) { - item.stackSize = 0; - - if (item.stackSize <= 0) { - return drop.copy(); - } - } - } - } - - return item; - } - } - - public static boolean renderDynamicHotIngotRendering = true; - - public int getColorFromItemStack(ItemStack item, int renderPass) { - if (renderPass > 1 || !renderDynamicHotIngotRendering) { - return Color.WHITE.getRGB(); - } - NBTTagCompound nbt = getNBT(item); - int heat = getTemp(item); - int maxHeat = Heatable.forgeMaximumMetalHeat; - double heatPer = (double) heat / (double) maxHeat * 100D; - - int red = getRedOnHeat(heatPer); - int green = getGreenOnHeat(heatPer); - int blue = getBlueOnHeat(heatPer); - - float curr_red = 1.0F; - float curr_green = 1.0F; - float curr_blue = 1.0F; - - ItemStack held = getItem(item); - if (held != null) { - int colour = held.getItem().getColorFromItemStack(held, 0); - - curr_red = (colour >> 16 & 255) / 255.0F; - curr_green = (colour >> 8 & 255) / 255.0F; - curr_blue = (colour & 255) / 255.0F; - - red = (int) (red * curr_red); - green = (int) (green * curr_green); - blue = (int) (blue * curr_blue); - } - - return GuiHelper.getColourForRGB(red, green, blue); - } - - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return true; - } - - private int getRedOnHeat(double percent) { - if (percent <= 0) - return 255; - return 255; - } - - private int getGreenOnHeat(double percent) { - if (percent <= 0) - return 255; - if (percent > 100) - percent = 100; - if (percent < 0) - percent = 0; - - if (percent <= 55) { - return (int) (255 - ((255 / 55) * percent)); - } else { - return (int) ((255 / 55) * (percent - 55)); - } - } - - private int getBlueOnHeat(double percent) { - if (percent <= 0) - return 255; - - if (percent > 100) - percent = 100; - if (percent < 0) - percent = 0; - - if (percent <= 55) { - return (int) (255 - ((255 / 55) * percent)); - } - return 0; - } - - @Override - public boolean isHot(ItemStack item) { - return true; - } - - @Override - public boolean isCoolable(ItemStack item) { - return true; - } + public static boolean renderDynamicHotIngotRendering = true; + + public ItemHeated() { + GameRegistry.registerItem(this, "MF_Hot_Item", MineFantasyII.MODID); + this.setUnlocalizedName("MF_Hot_Item"); + this.setHasSubtypes(true); + this.setMaxStackSize(64); + } + + public static int getTemp(ItemStack item) { + return Heatable.getTemp(item); + } + + public static int getWorkTemp(ItemStack item) { + return Heatable.getWorkTemp(item); + } + + public static int getUnstableTemp(ItemStack item) { + return Heatable.getWorkTemp(item); + } + + public static ItemStack getItem(ItemStack item) { + return Heatable.getItem(item); + } + + public static void setTemp(ItemStack item, int heat) { + NBTTagCompound nbt = getNBT(item); + + nbt.setInteger(Heatable.NBT_CurrentTemp, heat); + } + + public static void setWorkTemp(ItemStack item, int heat) { + NBTTagCompound nbt = getNBT(item); + MFLogUtil.logDebug("Set Workable Temp: " + heat); + nbt.setInteger(Heatable.NBT_WorkableTemp, heat); + } + + public static void setUnstableTemp(ItemStack item, int heat) { + NBTTagCompound nbt = getNBT(item); + MFLogUtil.logDebug("Set Unstable Temp: " + heat); + nbt.setInteger(Heatable.NBT_UnstableTemp, heat); + } + + public static ItemStack createHotItem(ItemStack item) { + return createHotItem(item, false); + } + + public static ItemStack createHotItem(ItemStack item, int temp) { + ItemStack hot = createHotItem(item, true); + setTemp(hot, temp); + + return hot; + } + + public static ItemStack createHotItem(ItemStack item, boolean ignoreStats) { + Heatable stats = Heatable.loadStats(item); + if (stats != null) { + ItemStack out = new ItemStack(ComponentListMF.hotItem, item.stackSize); + NBTTagCompound nbt = getNBT(out); + NBTTagCompound save = new NBTTagCompound(); + item.writeToNBT(save); + nbt.setTag(Heatable.NBT_Item, save); + + nbt.setBoolean(Heatable.NBT_ShouldDisplay, true); + setWorkTemp(out, stats.getWorkableStat(item)); + setUnstableTemp(out, stats.getUnstableStat(item)); + + return out; + } else if (ignoreStats) { + ItemStack out = new ItemStack(ComponentListMF.hotItem, item.stackSize); + NBTTagCompound nbt = getNBT(out); + NBTTagCompound save = new NBTTagCompound(); + item.writeToNBT(save); + nbt.setTag(Heatable.NBT_Item, save); + + nbt.setBoolean(Heatable.NBT_ShouldDisplay, false); + setWorkTemp(out, 0); + setUnstableTemp(out, 0); + + return out; + } + return item; + } + + private static void shareTraits(NBTTagCompound nbt, ItemStack item) { + NBTTagCompound itemtag = getNBT(item); + if (itemtag.hasKey("Unbreakable")) { + nbt.setBoolean("Unbreakable", itemtag.getBoolean("Unbreakable")); + } + if (itemtag.hasKey("MF_Inferior")) { + nbt.setBoolean("MF_Inferior", itemtag.getBoolean("MF_Inferior")); + } + if (itemtag.hasKey("MFCraftQuality")) { + nbt.setFloat("MFCraftQuality", itemtag.getFloat("MFCraftQuality")); + } + } + + public static boolean showTemp(ItemStack stack) { + if (stack == null) + return false; + + NBTTagCompound nbt = getNBT(stack); + + if (nbt == null) + return false; + + if (nbt.hasKey(Heatable.NBT_ShouldDisplay)) { + return nbt.getBoolean(Heatable.NBT_ShouldDisplay); + } + return false; + } + + private static NBTTagCompound getNBT(ItemStack item) { + if (!item.hasTagCompound()) + item.setTagCompound(new NBTTagCompound()); + return item.getTagCompound(); + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + String name = ""; + + ItemStack item = getItem(stack); + if (item != null) + name = item.getItem().getItemStackDisplayName(item); + return StatCollector.translateToLocalFormatted("prefix.hotitem.name", name); + } + + @Override + public EnumRarity getRarity(ItemStack stack) { + ItemStack item = getItem(stack); + if (item != null) + return item.getItem().getRarity(item); + + return EnumRarity.common; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { + ItemStack item = getItem(stack); + + if (item != null) { + item.getItem().addInformation(item, player, list, b); + } else + super.addInformation(stack, player, list, b); + + NBTTagCompound nbt = getNBT(stack); + if (nbt.hasKey(Heatable.NBT_ShouldDisplay)) { + if (nbt.getBoolean(Heatable.NBT_ShouldDisplay)) { + list.add(getHeatString(stack)); + if (!getWorkString(item, stack).equals("")) + list.add(getWorkString(item, stack)); + } + } + } + + private String getHeatString(ItemStack item) { + int heat = getTemp(item); + String unit = "*C"; + return heat + unit; + } + + private String getWorkString(ItemStack heated, ItemStack item) { + byte stage = Heatable.getHeatableStage(item); + switch (stage) { + case 1: + return EnumChatFormatting.YELLOW + StatCollector.translateToLocal("state.workable"); + case 2: + return EnumChatFormatting.RED + StatCollector.translateToLocal("state.unstable"); + } + return ""; + } + + public IIcon getIcon(ItemStack stack, int renderPass) { + ItemStack item = getItem(stack); + + if (item != null) { + return item.getItem().getIcon(item, renderPass); + } + return Blocks.fire.getBlockTextureFromSide(2); + } + + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + + } + + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + + if (movingobjectposition == null) { + return item; + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) { + return item; + } + + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return item; + } + float water = TongsHelper.getWaterSource(world, i, j, k); + + if (water >= 0) { + player.playSound("random.splash", 1F, 1F); + player.playSound("random.fizz", 2F, 0.5F); + + for (int a = 0; a < 5; a++) { + world.spawnParticle("largesmoke", i + 0.5F, j + 1, k + 0.5F, 0, 0.065F, 0); + } + + ItemStack drop = getItem(item).copy(); + + if (Heatable.HCCquenchRuin) { + float damageDone = 50F + (water > 0F ? water : 0F); + if (damageDone > 99F) + damageDone = 99F; + + if (drop.isItemStackDamageable()) { + drop.setItemDamage((int) (drop.getMaxDamage() * damageDone / 100F)); + } + } + drop.stackSize = item.stackSize; + if (drop != null) { + item.stackSize = 0; + + if (item.stackSize <= 0) { + return drop.copy(); + } + } + } + } + + return item; + } + } + + public int getColorFromItemStack(ItemStack item, int renderPass) { + if (renderPass > 1 || !renderDynamicHotIngotRendering) { + return Color.WHITE.getRGB(); + } + NBTTagCompound nbt = getNBT(item); + int heat = getTemp(item); + int maxHeat = Heatable.forgeMaximumMetalHeat; + double heatPer = (double) heat / (double) maxHeat * 100D; + + int red = getRedOnHeat(heatPer); + int green = getGreenOnHeat(heatPer); + int blue = getBlueOnHeat(heatPer); + + float curr_red = 1.0F; + float curr_green = 1.0F; + float curr_blue = 1.0F; + + ItemStack held = getItem(item); + if (held != null) { + int colour = held.getItem().getColorFromItemStack(held, 0); + + curr_red = (colour >> 16 & 255) / 255.0F; + curr_green = (colour >> 8 & 255) / 255.0F; + curr_blue = (colour & 255) / 255.0F; + + red = (int) (red * curr_red); + green = (int) (green * curr_green); + blue = (int) (blue * curr_blue); + } + + return GuiHelper.getColourForRGB(red, green, blue); + } + + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + private int getRedOnHeat(double percent) { + if (percent <= 0) + return 255; + return 255; + } + + private int getGreenOnHeat(double percent) { + if (percent <= 0) + return 255; + if (percent > 100) + percent = 100; + if (percent < 0) + percent = 0; + + if (percent <= 55) { + return (int) (255 - ((255 / 55) * percent)); + } else { + return (int) ((255 / 55) * (percent - 55)); + } + } + + private int getBlueOnHeat(double percent) { + if (percent <= 0) + return 255; + + if (percent > 100) + percent = 100; + if (percent < 0) + percent = 0; + + if (percent <= 55) { + return (int) (255 - ((255 / 55) * percent)); + } + return 0; + } + + @Override + public boolean isHot(ItemStack item) { + return true; + } + + @Override + public boolean isCoolable(ItemStack item) { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/item/list/ArmourListMF.java b/src/main/java/minefantasy/mf2/item/list/ArmourListMF.java index afc8642f..83cc67a1 100644 --- a/src/main/java/minefantasy/mf2/item/list/ArmourListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ArmourListMF.java @@ -13,58 +13,56 @@ * @author Anonymous Productions */ public class ArmourListMF { - public static ArmourMaterialMF LEATHER = new ArmourMaterialMF("Leather", 5, 0.30F, 18, 1.00F); - public static ArmourMaterialMF APRON = new ArmourMaterialMF("Apron", 6, 0.30F, 0, 1.00F); + public static final String[] leathermats = new String[]{"hide", "roughleather", "strongleather", "studleather", + "padded",}; + public static ArmourMaterialMF LEATHER = new ArmourMaterialMF("Leather", 5, 0.30F, 18, 1.00F); + public static ArmourMaterialMF APRON = new ArmourMaterialMF("Apron", 6, 0.30F, 0, 1.00F); + public static ItemArmourMF[] leather = new ItemArmourMF[leathermats.length * 4]; + public static ItemArmourMF leatherapron; - public static final String[] leathermats = new String[] { "hide", "roughleather", "strongleather", "studleather", - "padded", }; + public static void load() { + leatherapron = new ItemApron("leatherapron", BaseMaterialMF.leatherapron, "leatherapron_layer_1", 0); - public static ItemArmourMF[] leather = new ItemArmourMF[leathermats.length * 4]; - public static ItemArmourMF leatherapron; + for (int a = 0; a < leathermats.length; a++) { + BaseMaterialMF baseMat = BaseMaterialMF.getMaterial(leathermats[a]); + String matName = baseMat.name; + int rarity = baseMat.rarity; + int id = a * 4; + float bulk = baseMat.weight; + ArmourDesign design = baseMat == BaseMaterialMF.padding ? ArmourDesign.PADDING : ArmourDesign.LEATHER; - public static void load() { - leatherapron = new ItemApron("leatherapron", BaseMaterialMF.leatherapron, "leatherapron_layer_1", 0); + leather[id + 0] = new ItemArmourMF(matName.toLowerCase() + "_helmet", baseMat, design, 0, + matName.toLowerCase() + "_layer_1", rarity, bulk); + leather[id + 1] = new ItemArmourMF(matName.toLowerCase() + "_chest", baseMat, design, 1, + matName.toLowerCase() + "_layer_1", rarity, bulk); + leather[id + 2] = new ItemArmourMF(matName.toLowerCase() + "_legs", baseMat, design, 2, + matName.toLowerCase() + "_layer_2", rarity, bulk); + leather[id + 3] = new ItemArmourMF(matName.toLowerCase() + "_boots", baseMat, design, 3, + matName.toLowerCase() + "_layer_1", rarity, bulk); + } + } - for (int a = 0; a < leathermats.length; a++) { - BaseMaterialMF baseMat = BaseMaterialMF.getMaterial(leathermats[a]); - String matName = baseMat.name; - int rarity = baseMat.rarity; - int id = a * 4; - float bulk = baseMat.weight; - ArmourDesign design = baseMat == BaseMaterialMF.padding ? ArmourDesign.PADDING : ArmourDesign.LEATHER; + public static ItemStack armour(ItemArmourMF[] pool, int tier, int piece) { + int slot = tier * 4 + piece; + if (slot >= pool.length) { + slot = pool.length - 1; + } + return new ItemStack(pool[slot]); + } - leather[id + 0] = new ItemArmourMF(matName.toLowerCase() + "_helmet", baseMat, design, 0, - matName.toLowerCase() + "_layer_1", rarity, bulk); - leather[id + 1] = new ItemArmourMF(matName.toLowerCase() + "_chest", baseMat, design, 1, - matName.toLowerCase() + "_layer_1", rarity, bulk); - leather[id + 2] = new ItemArmourMF(matName.toLowerCase() + "_legs", baseMat, design, 2, - matName.toLowerCase() + "_layer_2", rarity, bulk); - leather[id + 3] = new ItemArmourMF(matName.toLowerCase() + "_boots", baseMat, design, 3, - matName.toLowerCase() + "_layer_1", rarity, bulk); - } - } + public static Item armourItem(ItemArmourMF[] pool, int tier, int piece) { + int slot = tier * 4 + piece; + if (slot >= pool.length) { + slot = pool.length - 1; + } + return pool[slot]; + } - public static ItemStack armour(ItemArmourMF[] pool, int tier, int piece) { - int slot = tier * 4 + piece; - if (slot >= pool.length) { - slot = pool.length - 1; - } - return new ItemStack(pool[slot]); - } - - public static Item armourItem(ItemArmourMF[] pool, int tier, int piece) { - int slot = tier * 4 + piece; - if (slot >= pool.length) { - slot = pool.length - 1; - } - return pool[slot]; - } - - public static boolean isUnbreakable(BaseMaterialMF material, EntityLivingBase user) { - if (material == BaseMaterialMF.enderforge || material == BaseMaterialMF.ignotumite - || material == BaseMaterialMF.mithium) { - return true; - } - return false; - } + public static boolean isUnbreakable(BaseMaterialMF material, EntityLivingBase user) { + if (material == BaseMaterialMF.enderforge || material == BaseMaterialMF.ignotumite + || material == BaseMaterialMF.mithium) { + return true; + } + return false; + } } diff --git a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java index 643fff4b..8df7d58c 100644 --- a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java @@ -6,15 +6,7 @@ import minefantasy.mf2.api.mining.RandomDigs; import minefantasy.mf2.api.mining.RandomOre; import minefantasy.mf2.block.list.BlockListMF; -import minefantasy.mf2.item.AdvancedFuelHandlerMF; -import minefantasy.mf2.item.FuelHandlerMF; -import minefantasy.mf2.item.ItemArtefact; -import minefantasy.mf2.item.ItemComponentMF; -import minefantasy.mf2.item.ItemFilledMould; -import minefantasy.mf2.item.ItemHide; -import minefantasy.mf2.item.ItemMFBowl; -import minefantasy.mf2.item.ItemRawOreMF; -import minefantasy.mf2.item.ItemSpecialDesign; +import minefantasy.mf2.item.*; import minefantasy.mf2.item.custom.ItemCustomComponent; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.gadget.ItemBombComponent; @@ -32,249 +24,249 @@ * @author Anonymous Productions */ public class ComponentListMF { - public static final String[] ingotMats = new String[] { "copper", "tin", "bronze", "pigiron", "steel", "encrusted", - "blacksteelweak", "blacksteel", "silver", "redsteelweak", "redsteel", "bluesteelweak", "bluesteel", - "adamantium", "mithril", "ignotumite", "mithium", "ender", "tungsten", "obsidian", }; - - public static Item clay_pot = new ItemMFBowl("clay_pot").setStoragePlacement("pot", "pot"); - public static Item clay_pot_uncooked = new ItemComponentMF("clay_pot_uncooked", 0); - public static Item ingot_mould = new ItemComponentMF("ingot_mould").setStoragePlacement("bar", "mould"); - public static Item ingot_mould_uncooked = new ItemComponentMF("ingot_mould_uncooked", 0); - public static Item pie_tray_uncooked = new ItemComponentMF("pie_tray_uncooked", 0); - - public static ItemComponentMF[] ingots = new ItemComponentMF[ingotMats.length]; - - public static ItemComponentMF plank = new ItemComponentMF("plank").setCustom(1, "wood").setStoragePlacement("plank", - "plank"); - public static Item vine = new ItemComponentMF("vine", -1); - public static Item sharp_rock = new ItemComponentMF("sharp_rock", -1); - - public static Item flux = new ItemComponentMF("flux", 0); - public static Item flux_strong = new ItemComponentMF("flux_strong", 0); - - public static Item coalDust = new ItemComponentMF("coalDust", 0).setContainerItem(clay_pot); - public static Item nitre = new ItemComponentMF("nitre", 0); - public static Item sulfur = new ItemComponentMF("sulfur", 0); - public static Item iron_prep = new ItemComponentMF("iron_prep", 0); - public static Item blackpowder = new ItemBombComponent("blackpowder", 0, "powder", 0).setContainerItem(clay_pot); - public static Item blackpowder_advanced = new ItemBombComponent("blackpowder_advanced", 1, "powder", 1) - .setContainerItem(clay_pot); - public static Item fletching = new ItemComponentMF("fletching", 0); - public static Item shrapnel = new ItemBombComponent("shrapnel", 0, "filling", 1) - .setContainerItem(ComponentListMF.clay_pot); - public static Item magma_cream_refined = new ItemBombComponent("magma_cream_refined", 1, "filling", 2) - .setContainerItem(clay_pot); - public static Item bomb_fuse = new ItemBombComponent("bomb_fuse", 0, "fuse", 0); - public static Item bomb_fuse_long = new ItemBombComponent("bomb_fuse_long", 0, "fuse", 1); - public static Item bomb_casing_uncooked = new ItemComponentMF("bomb_casing_uncooked", 0); - public static Item bomb_casing = new ItemBombComponent("bomb_casing", 0, "bombcase", 0); - public static Item mine_casing_uncooked = new ItemComponentMF("mine_casing_uncooked", 0); - public static Item mine_casing = new ItemBombComponent("mine_casing", 0, "minecase", 0); - public static Item bomb_casing_iron = new ItemBombComponent("bomb_casing_iron", 0, "bombcase", 1); - public static Item mine_casing_iron = new ItemBombComponent("mine_casing_iron", 0, "minecase", 1); - public static Item bomb_casing_obsidian = new ItemBombComponent("bomb_casing_obsidian", 1, "bombcase", 2); - public static Item mine_casing_obsidian = new ItemBombComponent("mine_casing_obsidian", 1, "minecase", 2); - public static Item bomb_casing_crystal = new ItemBombComponent("bomb_casing_crystal", 1, "bombcase", 3); - public static Item mine_casing_crystal = new ItemBombComponent("mine_casing_crystal", 1, "minecase", 3); - public static Item bomb_casing_arrow = new ItemBombComponent("bomb_casing_arrow", 1, "arrow", 0); - public static Item bomb_casing_bolt = new ItemBombComponent("bomb_casing_bolt", 1, "bolt", 0); - - public static Item coke = new ItemComponentMF("coke", 1); - public static Item diamond_shards = new ItemComponentMF("diamond_shards", 0); - - public static Item clay_brick = new ItemComponentMF("clay_brick", 0); - public static Item kaolinite = new ItemComponentMF("kaolinite", 0); - public static Item kaolinite_dust = new ItemComponentMF("kaolinite_dust", 0).setContainerItem(clay_pot); - public static Item fireclay = new ItemComponentMF("fireclay", 0); - public static Item fireclay_brick = new ItemComponentMF("fireclay_brick", 0); - public static Item strong_brick = new ItemComponentMF("strong_brick", 0).setStoragePlacement("bar", "firebrick"); - - public static Item hideSmall = new ItemComponentMF("hideSmall", 0); - public static Item hideMedium = new ItemComponentMF("hideMedium", 0); - public static Item hideLarge = new ItemComponentMF("hideLarge", 0); - public static Item rawhideSmall = new ItemHide("rawhideSmall", hideSmall, 1.0F); - public static Item rawhideMedium = new ItemHide("rawhideMedium", hideMedium, 1.5F); - public static Item rawhideLarge = new ItemHide("rawhideLarge", hideLarge, 3.0F); - - public static Item dragon_heart = new ItemSpecialDesign("dragon_heart", 1, "dragon"); - - public static Item leather_strip = new ItemComponentMF("leather_strip", 0); - public static Item nail = new ItemComponentMF("nail", 0); - public static Item rivet = new ItemComponentMF("rivet", 0); - public static Item thread = new ItemComponentMF("thread", 0); - public static Item obsidian_rock = new ItemComponentMF("obsidian_rock", 0); - - public static Item oreCopper = new ItemRawOreMF("oreCopper", -1); - public static Item oreTin = new ItemRawOreMF("oreTin", -1); - public static Item oreIron = new ItemRawOreMF("oreIron", 0); - public static Item oreSilver = new ItemRawOreMF("oreSilver", 0); - public static Item oreGold = new ItemRawOreMF("oreGold", 0); - public static Item oreTungsten = new ItemRawOreMF("oreTungsten", 1); - - public static Item hotItem = new ItemHeated(); - - public static Item plant_oil = new ItemComponentMF("plant_oil", 0).setStoragePlacement("jug", "jugoil") - .setContainerItem(FoodListMF.jug_empty); - - public static Item talisman_lesser = new ItemComponentMF("talisman_lesser", 1); - public static Item talisman_greater = new ItemComponentMF("talisman_greater", 3); - - public static Item bolt = new ItemComponentMF("bolt", 0); - public static Item iron_frame = new ItemComponentMF("iron_frame", 0); - public static Item iron_strut = new ItemComponentMF("iron_strut", 0); - public static Item bronze_gears = new ItemComponentMF("bronze_gears", 0); - public static Item tungsten_gears = new ItemComponentMF("tungsten_gears", 1); - public static Item steel_tube = new ItemComponentMF("steel_tube", 0); - public static Item cogwork_shaft = new ItemComponentMF("cogwork_shaft", 1); - public static Item ingotCompositeAlloy = new ItemComponentMF("ingotCompositeAlloy", 1); - public static Item coal_prep = new ItemComponentMF("coal_prep", 0); - - public static Item ingot_mould_filled = new ItemFilledMould(); - - public static Item crossbow_stock_wood = new ItemCrossbowPart("cross_stock_wood", "stock").addSpeed(1.0F) - .addRecoil(0F); - public static Item crossbow_stock_iron = new ItemCrossbowPart("cross_stock_iron", "stock").addSpeed(1.0F) - .addRecoil(-2F).addDurability(150); - public static Item crossbow_handle_wood = new ItemCrossbowPart("cross_handle_wood", "stock").addSpeed(0.5F) - .addRecoil(2F).addSpread(1.0F).setHandCrossbow(true); - - public static Item cross_arms_basic = new ItemCrossbowPart("cross_arms_basic", "mechanism").addPower(1.00F) - .addSpeed(0.50F).addRecoil(4F).addSpread(1.00F); - public static Item cross_arms_light = new ItemCrossbowPart("cross_arms_light", "mechanism").addPower(0.85F) - .addSpeed(0.25F).addRecoil(2F).addSpread(0.50F); - public static Item cross_arms_heavy = new ItemCrossbowPart("cross_arms_heavy", "mechanism").addPower(1.15F) - .addSpeed(1.00F).addRecoil(8F).addSpread(2.00F); - public static Item cross_arms_advanced = new ItemCrossbowPart("cross_arms_advanced", "mechanism").addPower(1.15F) - .addSpeed(1.00F).addRecoil(6F).addSpread(0.25F).addDurability(150); - - public static Item cross_bayonet = new ItemCrossbowPart("cross_bayonet", "muzzle").addBash(4.0F).addRecoil(-1F) - .addSpeed(0.5F); - public static Item cross_ammo = new ItemCrossbowPart("cross_ammo", "mod").addCapacity(5).addSpread(2.00F); - public static Item cross_scope = new ItemCrossbowPart("cross_scope", "mod").setScope(0.75F); - - public static ItemCustomComponent chainmesh = new ItemCustomComponent("chainmesh", 1F, "metal") - .setStoragePlacement("sheet", "mail"); - public static ItemCustomComponent scalemesh = new ItemCustomComponent("scalemesh", 1F, "metal") - .setStoragePlacement("sheet", "scale"); - public static ItemCustomComponent splintmesh = new ItemCustomComponent("splintmesh", 1F, "metal") - .setStoragePlacement("sheet", "splint"); - public static ItemCustomComponent plate = new ItemCustomComponent("plate", 2F, "metal").setStoragePlacement("sheet", - "plate"); - public static ItemCustomComponent plate_huge = new ItemCustomComponent("plate_huge", 8F, "metal") - .setStoragePlacement("bigplate", "bigplate"); - public static ItemCustomComponent metalHunk = new ItemCustomComponent("hunk", 0.25F, "metal"); - public static ItemCustomComponent arrowhead = new ItemCustomComponent("arrowhead", 1 / 4F, "metal"); - public static ItemCustomComponent bodkinhead = new ItemCustomComponent("bodkinhead", 1 / 4F, "metal"); - public static ItemCustomComponent broadhead = new ItemCustomComponent("broadhead", 1 / 4F, "metal"); - public static ItemCustomComponent cogwork_armour = (ItemCustomComponent) new ItemCustomComponent("cogwork_armour", - 30F, "metal").setCanDamage().setCreativeTab(CreativeTabMF.tabGadget).setMaxStackSize(1); - public static ItemCustomComponent bar = (ItemCustomComponent) new ItemCustomComponent("bar", 1F, "metal") - .setStoragePlacement("bar", "bar").setCreativeTab(CreativeTabMF.tabMaterialsMF); - - public static Item flux_pot = new ItemComponentMF("flux_pot", 0).setContainerItem(clay_pot); - public static Item coal_flux = new ItemComponentMF("coal_flux", 0); - - public static Item copper_coin = new ItemComponentMF("copper_coin", 0); - public static Item silver_coin = new ItemComponentMF("silver_coin", 0); - public static Item gold_coin = new ItemComponentMF("gold_coin", 0); - - public static Item hinge = new ItemComponentMF("hinge", 0); - public static Item plank_cut = new ItemComponentMF("plank_cut").setCustom(1, "wood").setStoragePlacement("plank", - "plankcut"); - public static Item plank_pane = new ItemComponentMF("plank_pane").setCustom(6, "wood").setStoragePlacement("sheet", - "woodpane"); - - public static Item cogwork_pulley = new ItemComponentMF("cogwork_pulley", 1) - .setCreativeTab(CreativeTabMF.tabGadget); - - public static Item artefacts = new ItemArtefact("artefact_any"); - - public static Item ornate_items = new ItemSpecialDesign("ornate_items", 1, "ornate"); - - public static void load() { - WoodMaterial.init(); - Items.potionitem.setContainerItem(Items.glass_bottle); - GameRegistry.registerFuelHandler(new FuelHandlerMF()); - MineFantasyAPI.registerFuelHandler(new AdvancedFuelHandlerMF()); - Items.iron_ingot.setTextureName("minefantasy2:component/ingotWroughtIron"); - Blocks.iron_block.setBlockTextureName("minefantasy2:metal/iron_block"); - Blocks.iron_bars.setBlockTextureName("minefantasy2:metal/iron_bars"); - for (int a = 0; a < ingotMats.length; a++) { - BaseMaterialMF mat = BaseMaterialMF.getMaterial(ingotMats[a]); - String name = mat.name; - int rarity = mat.rarity; - - ingots[a] = new ItemComponentMF("ingot" + name, rarity); - OreDictionary.registerOre("ingot" + name, ingots[a]); - } - - addRandomDrops(); - initFuels(); - OreDictionary.registerOre("ingotCompositeAlloy", ingotCompositeAlloy); - OreDictionary.registerOre("ingotIron", Items.iron_ingot); - OreDictionary.registerOre("ingotGold", Items.gold_ingot); - - AdvancedFuelHandlerMF.registerItems(); - } - - private static void initFuels() { - MineFantasyFuels.addForgeFuel(new ItemStack(Items.coal, 1, 0), 900, 1500);// 1500C , 45s - MineFantasyFuels.addForgeFuel(new ItemStack(Items.coal, 1, 1), 1200, 1800);// 1800C , 1m - MineFantasyFuels.addForgeFuel(Items.blaze_powder, 200, 3000, true);// 3000C , 10s - MineFantasyFuels.addForgeFuel(Items.blaze_rod, 300, 3000, true);// 3000C , 15s - MineFantasyFuels.addForgeFuel(Items.fire_charge, 1200, 3500, true);// 3500C , 1m - MineFantasyFuels.addForgeFuel(Items.lava_bucket, 2400, 5000, true);// 5000C , 2m - MineFantasyFuels.addForgeFuel(Items.magma_cream, 2400, 4000, true, true);// 4000C , 2m - - MineFantasyFuels.addForgeFuel(ComponentListMF.coke, 1200, 2500, false, true);// 2500C , 1m - MineFantasyFuels.addForgeFuel(ComponentListMF.magma_cream_refined, 2400, 5000, true, true);// 5000C , 2m - - MineFantasyFuels.addForgeFuel(ComponentListMF.coalDust, 1200, 180);// 180C , 60s - } - - private static void addRandomDrops() { - RandomOre.addOre(new ItemStack(kaolinite), 1.5F, Blocks.stone, -1, 32, 128, false); - RandomOre.addOre(new ItemStack(flux), 2F, Blocks.stone, -1, 0, 128, false); - RandomOre.addOre(new ItemStack(flux_strong), 1F, Blocks.stone, 2, 0, 128, false); - RandomOre.addOre(new ItemStack(flux), 20F, BlockListMF.limestone, 0, -1, 0, 256, true); - RandomOre.addOre(new ItemStack(flux_strong), 10F, BlockListMF.limestone, 0, 2, 0, 256, true); - RandomOre.addOre(new ItemStack(Items.coal), 2F, Blocks.stone, -1, 0, 128, false); - RandomOre.addOre(new ItemStack(sulfur), 2F, Blocks.stone, -1, 0, 16, false); - RandomOre.addOre(new ItemStack(nitre), 3F, Blocks.stone, -1, 0, 64, false); - RandomOre.addOre(new ItemStack(Items.redstone), 5F, Blocks.stone, 2, 0, 16, false); - RandomOre.addOre(new ItemStack(Items.flint), 1F, Blocks.stone, -1, 0, 64, false); - RandomOre.addOre(new ItemStack(diamond_shards), 0.2F, Blocks.stone, 2, 0, 16, false); - RandomOre.addOre(new ItemStack(Items.quartz), 0.5F, Blocks.stone, 3, 0, 16, false); - - RandomOre.addOre(new ItemStack(sulfur), 10F, Blocks.netherrack, -1, 0, 512, false); - RandomOre.addOre(new ItemStack(Items.glowstone_dust), 5F, Blocks.netherrack, -1, 0, 512, false); - RandomOre.addOre(new ItemStack(Items.quartz), 5F, Blocks.netherrack, -1, 0, 512, false); - RandomOre.addOre(new ItemStack(Items.blaze_powder), 5F, Blocks.netherrack, -1, 0, 512, false); - RandomOre.addOre(new ItemStack(Items.nether_wart), 1F, Blocks.netherrack, -1, 0, 512, false); - RandomOre.addOre(new ItemStack(Items.nether_star), 0.01F, Blocks.netherrack, -1, 0, 512, false); - - RandomDigs.addOre(new ItemStack(Blocks.skull, 1, 1), 0.1F, Blocks.soul_sand, 3, 0, 256, false); - RandomDigs.addOre(new ItemStack(Items.bone), 5F, Blocks.dirt, -1, 0, 256, false); - RandomDigs.addOre(new ItemStack(Items.rotten_flesh), 2F, Blocks.dirt, -1, 0, 256, false); - RandomDigs.addOre(new ItemStack(Items.coal, 1, 1), 1F, Blocks.dirt, -1, 32, 64, false); - - RandomDigs.addOre(new ItemStack(Items.melon_seeds), 5F, Blocks.grass, -1, 0, 256, false); - RandomDigs.addOre(new ItemStack(Items.pumpkin_seeds), 8F, Blocks.grass, -1, 0, 256, false); - - RandomOre.addOre(new ItemStack(oreCopper), 4F, Blocks.stone, 0, 48, 96, false); - RandomOre.addOre(new ItemStack(oreTin), 2F, Blocks.stone, 0, 48, 96, false); - RandomOre.addOre(new ItemStack(oreIron), 5F, Blocks.stone, 0, 0, 64, false); - RandomOre.addOre(new ItemStack(oreSilver), 1.5F, Blocks.stone, 0, 0, 32, false); - RandomOre.addOre(new ItemStack(oreGold), 1F, Blocks.stone, 0, 0, 32, false); - - RandomOre.addOre(new ItemStack(oreTungsten), 2F, Blocks.stone, 3, 0, 16, false, "tungsten"); - } - - public static ItemStack bar(String material) { - return bar(material, 1); - } - - public static ItemStack bar(String material, int stackSize) { - return bar.createComm(material, stackSize); - } + public static final String[] ingotMats = new String[]{"copper", "tin", "bronze", "pigiron", "steel", "encrusted", + "blacksteelweak", "blacksteel", "silver", "redsteelweak", "redsteel", "bluesteelweak", "bluesteel", + "adamantium", "mithril", "ignotumite", "mithium", "ender", "tungsten", "obsidian",}; + + public static Item clay_pot = new ItemMFBowl("clay_pot").setStoragePlacement("pot", "pot"); + public static Item clay_pot_uncooked = new ItemComponentMF("clay_pot_uncooked", 0); + public static Item ingot_mould = new ItemComponentMF("ingot_mould").setStoragePlacement("bar", "mould"); + public static Item ingot_mould_uncooked = new ItemComponentMF("ingot_mould_uncooked", 0); + public static Item pie_tray_uncooked = new ItemComponentMF("pie_tray_uncooked", 0); + + public static ItemComponentMF[] ingots = new ItemComponentMF[ingotMats.length]; + + public static ItemComponentMF plank = new ItemComponentMF("plank").setCustom(1, "wood").setStoragePlacement("plank", + "plank"); + public static Item vine = new ItemComponentMF("vine", -1); + public static Item sharp_rock = new ItemComponentMF("sharp_rock", -1); + + public static Item flux = new ItemComponentMF("flux", 0); + public static Item flux_strong = new ItemComponentMF("flux_strong", 0); + + public static Item coalDust = new ItemComponentMF("coalDust", 0).setContainerItem(clay_pot); + public static Item nitre = new ItemComponentMF("nitre", 0); + public static Item sulfur = new ItemComponentMF("sulfur", 0); + public static Item iron_prep = new ItemComponentMF("iron_prep", 0); + public static Item blackpowder = new ItemBombComponent("blackpowder", 0, "powder", 0).setContainerItem(clay_pot); + public static Item blackpowder_advanced = new ItemBombComponent("blackpowder_advanced", 1, "powder", 1) + .setContainerItem(clay_pot); + public static Item fletching = new ItemComponentMF("fletching", 0); + public static Item shrapnel = new ItemBombComponent("shrapnel", 0, "filling", 1) + .setContainerItem(ComponentListMF.clay_pot); + public static Item magma_cream_refined = new ItemBombComponent("magma_cream_refined", 1, "filling", 2) + .setContainerItem(clay_pot); + public static Item bomb_fuse = new ItemBombComponent("bomb_fuse", 0, "fuse", 0); + public static Item bomb_fuse_long = new ItemBombComponent("bomb_fuse_long", 0, "fuse", 1); + public static Item bomb_casing_uncooked = new ItemComponentMF("bomb_casing_uncooked", 0); + public static Item bomb_casing = new ItemBombComponent("bomb_casing", 0, "bombcase", 0); + public static Item mine_casing_uncooked = new ItemComponentMF("mine_casing_uncooked", 0); + public static Item mine_casing = new ItemBombComponent("mine_casing", 0, "minecase", 0); + public static Item bomb_casing_iron = new ItemBombComponent("bomb_casing_iron", 0, "bombcase", 1); + public static Item mine_casing_iron = new ItemBombComponent("mine_casing_iron", 0, "minecase", 1); + public static Item bomb_casing_obsidian = new ItemBombComponent("bomb_casing_obsidian", 1, "bombcase", 2); + public static Item mine_casing_obsidian = new ItemBombComponent("mine_casing_obsidian", 1, "minecase", 2); + public static Item bomb_casing_crystal = new ItemBombComponent("bomb_casing_crystal", 1, "bombcase", 3); + public static Item mine_casing_crystal = new ItemBombComponent("mine_casing_crystal", 1, "minecase", 3); + public static Item bomb_casing_arrow = new ItemBombComponent("bomb_casing_arrow", 1, "arrow", 0); + public static Item bomb_casing_bolt = new ItemBombComponent("bomb_casing_bolt", 1, "bolt", 0); + + public static Item coke = new ItemComponentMF("coke", 1); + public static Item diamond_shards = new ItemComponentMF("diamond_shards", 0); + + public static Item clay_brick = new ItemComponentMF("clay_brick", 0); + public static Item kaolinite = new ItemComponentMF("kaolinite", 0); + public static Item kaolinite_dust = new ItemComponentMF("kaolinite_dust", 0).setContainerItem(clay_pot); + public static Item fireclay = new ItemComponentMF("fireclay", 0); + public static Item fireclay_brick = new ItemComponentMF("fireclay_brick", 0); + public static Item strong_brick = new ItemComponentMF("strong_brick", 0).setStoragePlacement("bar", "firebrick"); + + public static Item hideSmall = new ItemComponentMF("hideSmall", 0); + public static Item hideMedium = new ItemComponentMF("hideMedium", 0); + public static Item hideLarge = new ItemComponentMF("hideLarge", 0); + public static Item rawhideSmall = new ItemHide("rawhideSmall", hideSmall, 1.0F); + public static Item rawhideMedium = new ItemHide("rawhideMedium", hideMedium, 1.5F); + public static Item rawhideLarge = new ItemHide("rawhideLarge", hideLarge, 3.0F); + + public static Item dragon_heart = new ItemSpecialDesign("dragon_heart", 1, "dragon"); + + public static Item leather_strip = new ItemComponentMF("leather_strip", 0); + public static Item nail = new ItemComponentMF("nail", 0); + public static Item rivet = new ItemComponentMF("rivet", 0); + public static Item thread = new ItemComponentMF("thread", 0); + public static Item obsidian_rock = new ItemComponentMF("obsidian_rock", 0); + + public static Item oreCopper = new ItemRawOreMF("oreCopper", -1); + public static Item oreTin = new ItemRawOreMF("oreTin", -1); + public static Item oreIron = new ItemRawOreMF("oreIron", 0); + public static Item oreSilver = new ItemRawOreMF("oreSilver", 0); + public static Item oreGold = new ItemRawOreMF("oreGold", 0); + public static Item oreTungsten = new ItemRawOreMF("oreTungsten", 1); + + public static Item hotItem = new ItemHeated(); + + public static Item plant_oil = new ItemComponentMF("plant_oil", 0).setStoragePlacement("jug", "jugoil") + .setContainerItem(FoodListMF.jug_empty); + + public static Item talisman_lesser = new ItemComponentMF("talisman_lesser", 1); + public static Item talisman_greater = new ItemComponentMF("talisman_greater", 3); + + public static Item bolt = new ItemComponentMF("bolt", 0); + public static Item iron_frame = new ItemComponentMF("iron_frame", 0); + public static Item iron_strut = new ItemComponentMF("iron_strut", 0); + public static Item bronze_gears = new ItemComponentMF("bronze_gears", 0); + public static Item tungsten_gears = new ItemComponentMF("tungsten_gears", 1); + public static Item steel_tube = new ItemComponentMF("steel_tube", 0); + public static Item cogwork_shaft = new ItemComponentMF("cogwork_shaft", 1); + public static Item ingotCompositeAlloy = new ItemComponentMF("ingotCompositeAlloy", 1); + public static Item coal_prep = new ItemComponentMF("coal_prep", 0); + + public static Item ingot_mould_filled = new ItemFilledMould(); + + public static Item crossbow_stock_wood = new ItemCrossbowPart("cross_stock_wood", "stock").addSpeed(1.0F) + .addRecoil(0F); + public static Item crossbow_stock_iron = new ItemCrossbowPart("cross_stock_iron", "stock").addSpeed(1.0F) + .addRecoil(-2F).addDurability(150); + public static Item crossbow_handle_wood = new ItemCrossbowPart("cross_handle_wood", "stock").addSpeed(0.5F) + .addRecoil(2F).addSpread(1.0F).setHandCrossbow(true); + + public static Item cross_arms_basic = new ItemCrossbowPart("cross_arms_basic", "mechanism").addPower(1.00F) + .addSpeed(0.50F).addRecoil(4F).addSpread(1.00F); + public static Item cross_arms_light = new ItemCrossbowPart("cross_arms_light", "mechanism").addPower(0.85F) + .addSpeed(0.25F).addRecoil(2F).addSpread(0.50F); + public static Item cross_arms_heavy = new ItemCrossbowPart("cross_arms_heavy", "mechanism").addPower(1.15F) + .addSpeed(1.00F).addRecoil(8F).addSpread(2.00F); + public static Item cross_arms_advanced = new ItemCrossbowPart("cross_arms_advanced", "mechanism").addPower(1.15F) + .addSpeed(1.00F).addRecoil(6F).addSpread(0.25F).addDurability(150); + + public static Item cross_bayonet = new ItemCrossbowPart("cross_bayonet", "muzzle").addBash(4.0F).addRecoil(-1F) + .addSpeed(0.5F); + public static Item cross_ammo = new ItemCrossbowPart("cross_ammo", "mod").addCapacity(5).addSpread(2.00F); + public static Item cross_scope = new ItemCrossbowPart("cross_scope", "mod").setScope(0.75F); + + public static ItemCustomComponent chainmesh = new ItemCustomComponent("chainmesh", 1F, "metal") + .setStoragePlacement("sheet", "mail"); + public static ItemCustomComponent scalemesh = new ItemCustomComponent("scalemesh", 1F, "metal") + .setStoragePlacement("sheet", "scale"); + public static ItemCustomComponent splintmesh = new ItemCustomComponent("splintmesh", 1F, "metal") + .setStoragePlacement("sheet", "splint"); + public static ItemCustomComponent plate = new ItemCustomComponent("plate", 2F, "metal").setStoragePlacement("sheet", + "plate"); + public static ItemCustomComponent plate_huge = new ItemCustomComponent("plate_huge", 8F, "metal") + .setStoragePlacement("bigplate", "bigplate"); + public static ItemCustomComponent metalHunk = new ItemCustomComponent("hunk", 0.25F, "metal"); + public static ItemCustomComponent arrowhead = new ItemCustomComponent("arrowhead", 1 / 4F, "metal"); + public static ItemCustomComponent bodkinhead = new ItemCustomComponent("bodkinhead", 1 / 4F, "metal"); + public static ItemCustomComponent broadhead = new ItemCustomComponent("broadhead", 1 / 4F, "metal"); + public static ItemCustomComponent cogwork_armour = (ItemCustomComponent) new ItemCustomComponent("cogwork_armour", + 30F, "metal").setCanDamage().setCreativeTab(CreativeTabMF.tabGadget).setMaxStackSize(1); + public static ItemCustomComponent bar = (ItemCustomComponent) new ItemCustomComponent("bar", 1F, "metal") + .setStoragePlacement("bar", "bar").setCreativeTab(CreativeTabMF.tabMaterialsMF); + + public static Item flux_pot = new ItemComponentMF("flux_pot", 0).setContainerItem(clay_pot); + public static Item coal_flux = new ItemComponentMF("coal_flux", 0); + + public static Item copper_coin = new ItemComponentMF("copper_coin", 0); + public static Item silver_coin = new ItemComponentMF("silver_coin", 0); + public static Item gold_coin = new ItemComponentMF("gold_coin", 0); + + public static Item hinge = new ItemComponentMF("hinge", 0); + public static Item plank_cut = new ItemComponentMF("plank_cut").setCustom(1, "wood").setStoragePlacement("plank", + "plankcut"); + public static Item plank_pane = new ItemComponentMF("plank_pane").setCustom(6, "wood").setStoragePlacement("sheet", + "woodpane"); + + public static Item cogwork_pulley = new ItemComponentMF("cogwork_pulley", 1) + .setCreativeTab(CreativeTabMF.tabGadget); + + public static Item artefacts = new ItemArtefact("artefact_any"); + + public static Item ornate_items = new ItemSpecialDesign("ornate_items", 1, "ornate"); + + public static void load() { + WoodMaterial.init(); + Items.potionitem.setContainerItem(Items.glass_bottle); + GameRegistry.registerFuelHandler(new FuelHandlerMF()); + MineFantasyAPI.registerFuelHandler(new AdvancedFuelHandlerMF()); + Items.iron_ingot.setTextureName("minefantasy2:component/ingotWroughtIron"); + Blocks.iron_block.setBlockTextureName("minefantasy2:metal/iron_block"); + Blocks.iron_bars.setBlockTextureName("minefantasy2:metal/iron_bars"); + for (int a = 0; a < ingotMats.length; a++) { + BaseMaterialMF mat = BaseMaterialMF.getMaterial(ingotMats[a]); + String name = mat.name; + int rarity = mat.rarity; + + ingots[a] = new ItemComponentMF("ingot" + name, rarity); + OreDictionary.registerOre("ingot" + name, ingots[a]); + } + + addRandomDrops(); + initFuels(); + OreDictionary.registerOre("ingotCompositeAlloy", ingotCompositeAlloy); + OreDictionary.registerOre("ingotIron", Items.iron_ingot); + OreDictionary.registerOre("ingotGold", Items.gold_ingot); + + AdvancedFuelHandlerMF.registerItems(); + } + + private static void initFuels() { + MineFantasyFuels.addForgeFuel(new ItemStack(Items.coal, 1, 0), 900, 1500);// 1500C , 45s + MineFantasyFuels.addForgeFuel(new ItemStack(Items.coal, 1, 1), 1200, 1800);// 1800C , 1m + MineFantasyFuels.addForgeFuel(Items.blaze_powder, 200, 3000, true);// 3000C , 10s + MineFantasyFuels.addForgeFuel(Items.blaze_rod, 300, 3000, true);// 3000C , 15s + MineFantasyFuels.addForgeFuel(Items.fire_charge, 1200, 3500, true);// 3500C , 1m + MineFantasyFuels.addForgeFuel(Items.lava_bucket, 2400, 5000, true);// 5000C , 2m + MineFantasyFuels.addForgeFuel(Items.magma_cream, 2400, 4000, true, true);// 4000C , 2m + + MineFantasyFuels.addForgeFuel(ComponentListMF.coke, 1200, 2500, false, true);// 2500C , 1m + MineFantasyFuels.addForgeFuel(ComponentListMF.magma_cream_refined, 2400, 5000, true, true);// 5000C , 2m + + MineFantasyFuels.addForgeFuel(ComponentListMF.coalDust, 1200, 180);// 180C , 60s + } + + private static void addRandomDrops() { + RandomOre.addOre(new ItemStack(kaolinite), 1.5F, Blocks.stone, -1, 32, 128, false); + RandomOre.addOre(new ItemStack(flux), 2F, Blocks.stone, -1, 0, 128, false); + RandomOre.addOre(new ItemStack(flux_strong), 1F, Blocks.stone, 2, 0, 128, false); + RandomOre.addOre(new ItemStack(flux), 20F, BlockListMF.limestone, 0, -1, 0, 256, true); + RandomOre.addOre(new ItemStack(flux_strong), 10F, BlockListMF.limestone, 0, 2, 0, 256, true); + RandomOre.addOre(new ItemStack(Items.coal), 2F, Blocks.stone, -1, 0, 128, false); + RandomOre.addOre(new ItemStack(sulfur), 2F, Blocks.stone, -1, 0, 16, false); + RandomOre.addOre(new ItemStack(nitre), 3F, Blocks.stone, -1, 0, 64, false); + RandomOre.addOre(new ItemStack(Items.redstone), 5F, Blocks.stone, 2, 0, 16, false); + RandomOre.addOre(new ItemStack(Items.flint), 1F, Blocks.stone, -1, 0, 64, false); + RandomOre.addOre(new ItemStack(diamond_shards), 0.2F, Blocks.stone, 2, 0, 16, false); + RandomOre.addOre(new ItemStack(Items.quartz), 0.5F, Blocks.stone, 3, 0, 16, false); + + RandomOre.addOre(new ItemStack(sulfur), 10F, Blocks.netherrack, -1, 0, 512, false); + RandomOre.addOre(new ItemStack(Items.glowstone_dust), 5F, Blocks.netherrack, -1, 0, 512, false); + RandomOre.addOre(new ItemStack(Items.quartz), 5F, Blocks.netherrack, -1, 0, 512, false); + RandomOre.addOre(new ItemStack(Items.blaze_powder), 5F, Blocks.netherrack, -1, 0, 512, false); + RandomOre.addOre(new ItemStack(Items.nether_wart), 1F, Blocks.netherrack, -1, 0, 512, false); + RandomOre.addOre(new ItemStack(Items.nether_star), 0.01F, Blocks.netherrack, -1, 0, 512, false); + + RandomDigs.addOre(new ItemStack(Blocks.skull, 1, 1), 0.1F, Blocks.soul_sand, 3, 0, 256, false); + RandomDigs.addOre(new ItemStack(Items.bone), 5F, Blocks.dirt, -1, 0, 256, false); + RandomDigs.addOre(new ItemStack(Items.rotten_flesh), 2F, Blocks.dirt, -1, 0, 256, false); + RandomDigs.addOre(new ItemStack(Items.coal, 1, 1), 1F, Blocks.dirt, -1, 32, 64, false); + + RandomDigs.addOre(new ItemStack(Items.melon_seeds), 5F, Blocks.grass, -1, 0, 256, false); + RandomDigs.addOre(new ItemStack(Items.pumpkin_seeds), 8F, Blocks.grass, -1, 0, 256, false); + + RandomOre.addOre(new ItemStack(oreCopper), 4F, Blocks.stone, 0, 48, 96, false); + RandomOre.addOre(new ItemStack(oreTin), 2F, Blocks.stone, 0, 48, 96, false); + RandomOre.addOre(new ItemStack(oreIron), 5F, Blocks.stone, 0, 0, 64, false); + RandomOre.addOre(new ItemStack(oreSilver), 1.5F, Blocks.stone, 0, 0, 32, false); + RandomOre.addOre(new ItemStack(oreGold), 1F, Blocks.stone, 0, 0, 32, false); + + RandomOre.addOre(new ItemStack(oreTungsten), 2F, Blocks.stone, 3, 0, 16, false, "tungsten"); + } + + public static ItemStack bar(String material) { + return bar(material, 1); + } + + public static ItemStack bar(String material, int stackSize) { + return bar.createComm(material, stackSize); + } } diff --git a/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java b/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java index 337252cf..617d402c 100644 --- a/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java @@ -4,7 +4,6 @@ import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.item.food.FoodListMF; -import minefantasy.mf2.item.gadget.MobSpawnerMF; import minefantasy.mf2.item.weapon.ItemSwordMF; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; diff --git a/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java b/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java index 42cb5014..b72f96b9 100644 --- a/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CustomArmourListMF.java @@ -3,58 +3,56 @@ import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.item.armour.ItemArmourMF; import minefantasy.mf2.item.armour.ItemCustomArmour; -import minefantasy.mf2.item.armour.ItemHorseArmorMF; -import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.creativetab.CreativeTabs; public class CustomArmourListMF { - public static ItemArmourMF standard_scale_helmet, standard_scale_chest, standard_scale_legs, standard_scale_boots; - public static ItemArmourMF standard_chain_helmet, standard_chain_chest, standard_chain_legs, standard_chain_boots; - public static ItemArmourMF standard_splint_helmet, standard_splint_chest, standard_splint_legs, - standard_splint_boots; - public static ItemArmourMF standard_plate_helmet, standard_plate_chest, standard_plate_legs, standard_plate_boots; - - //public static ItemHorseArmorMF standart_plate_horse_armor; - - public static void load() { - String design = "standard"; - CreativeTabs tab = CreativeTabMF.tabArmour; - standard_scale_helmet = (ItemArmourMF) new ItemCustomArmour(design, "scale_helmet", ArmourDesign.SCALEMAIL, 0, - "scale_layer_1", 0).setCreativeTab(tab); - standard_scale_chest = (ItemArmourMF) new ItemCustomArmour(design, "scale_chest", ArmourDesign.SCALEMAIL, 1, - "scale_layer_1", 0).setCreativeTab(tab); - standard_scale_legs = (ItemArmourMF) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, 2, - "scale_layer_2", 0).setCreativeTab(tab); - standard_scale_boots = (ItemArmourMF) new ItemCustomArmour(design, "scale_boots", ArmourDesign.SCALEMAIL, 3, - "scale_layer_1", 0).setCreativeTab(tab); - - standard_chain_helmet = (ItemArmourMF) new ItemCustomArmour(design, "chain_helmet", ArmourDesign.CHAINMAIL, 0, - "chain_layer_1", 0).setCreativeTab(tab); - standard_chain_chest = (ItemArmourMF) new ItemCustomArmour(design, "chain_chest", ArmourDesign.CHAINMAIL, 1, - "chain_layer_1", 0).setCreativeTab(tab); - standard_chain_legs = (ItemArmourMF) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, 2, - "chain_layer_2", 0).setCreativeTab(tab); - standard_chain_boots = (ItemArmourMF) new ItemCustomArmour(design, "chain_boots", ArmourDesign.CHAINMAIL, 3, - "chain_layer_1", 0).setCreativeTab(tab); - - standard_splint_helmet = (ItemArmourMF) new ItemCustomArmour(design, "splint_helmet", ArmourDesign.SPLINTMAIL, - 0, "splint_layer_1", 0).setCreativeTab(tab); - standard_splint_chest = (ItemArmourMF) new ItemCustomArmour(design, "splint_chest", ArmourDesign.SPLINTMAIL, 1, - "splint_layer_1", 0).setCreativeTab(tab); - standard_splint_legs = (ItemArmourMF) new ItemCustomArmour(design, "splint_legs", ArmourDesign.SPLINTMAIL, 2, - "splint_layer_2", 0).setCreativeTab(tab); - standard_splint_boots = (ItemArmourMF) new ItemCustomArmour(design, "splint_boots", ArmourDesign.SPLINTMAIL, 3, - "splint_layer_1", 0).setCreativeTab(tab); - - standard_plate_helmet = (ItemArmourMF) new ItemCustomArmour(design, "plate_helmet", ArmourDesign.FIELDPLATE, 0, - "plate_layer_1", 0).setCreativeTab(tab); - standard_plate_chest = (ItemArmourMF) new ItemCustomArmour(design, "plate_chest", ArmourDesign.FIELDPLATE, 1, - "plate_layer_1", 0).setCreativeTab(tab); - standard_plate_legs = (ItemArmourMF) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, 2, - "plate_layer_2", 0).setCreativeTab(tab); - standard_plate_boots = (ItemArmourMF) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, - "plate_layer_1", 0).setCreativeTab(tab); - - //standart_plate_horse_armor = new ItemHorseArmorMF("horse_armor", BaseMaterialMF.getMaterial("steel"), ArmourDesign.FIELDPLATE, "plate_layer_1", 0); - } + public static ItemArmourMF standard_scale_helmet, standard_scale_chest, standard_scale_legs, standard_scale_boots; + public static ItemArmourMF standard_chain_helmet, standard_chain_chest, standard_chain_legs, standard_chain_boots; + public static ItemArmourMF standard_splint_helmet, standard_splint_chest, standard_splint_legs, + standard_splint_boots; + public static ItemArmourMF standard_plate_helmet, standard_plate_chest, standard_plate_legs, standard_plate_boots; + + //public static ItemHorseArmorMF standart_plate_horse_armor; + + public static void load() { + String design = "standard"; + CreativeTabs tab = CreativeTabMF.tabArmour; + standard_scale_helmet = (ItemArmourMF) new ItemCustomArmour(design, "scale_helmet", ArmourDesign.SCALEMAIL, 0, + "scale_layer_1", 0).setCreativeTab(tab); + standard_scale_chest = (ItemArmourMF) new ItemCustomArmour(design, "scale_chest", ArmourDesign.SCALEMAIL, 1, + "scale_layer_1", 0).setCreativeTab(tab); + standard_scale_legs = (ItemArmourMF) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, 2, + "scale_layer_2", 0).setCreativeTab(tab); + standard_scale_boots = (ItemArmourMF) new ItemCustomArmour(design, "scale_boots", ArmourDesign.SCALEMAIL, 3, + "scale_layer_1", 0).setCreativeTab(tab); + + standard_chain_helmet = (ItemArmourMF) new ItemCustomArmour(design, "chain_helmet", ArmourDesign.CHAINMAIL, 0, + "chain_layer_1", 0).setCreativeTab(tab); + standard_chain_chest = (ItemArmourMF) new ItemCustomArmour(design, "chain_chest", ArmourDesign.CHAINMAIL, 1, + "chain_layer_1", 0).setCreativeTab(tab); + standard_chain_legs = (ItemArmourMF) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, 2, + "chain_layer_2", 0).setCreativeTab(tab); + standard_chain_boots = (ItemArmourMF) new ItemCustomArmour(design, "chain_boots", ArmourDesign.CHAINMAIL, 3, + "chain_layer_1", 0).setCreativeTab(tab); + + standard_splint_helmet = (ItemArmourMF) new ItemCustomArmour(design, "splint_helmet", ArmourDesign.SPLINTMAIL, + 0, "splint_layer_1", 0).setCreativeTab(tab); + standard_splint_chest = (ItemArmourMF) new ItemCustomArmour(design, "splint_chest", ArmourDesign.SPLINTMAIL, 1, + "splint_layer_1", 0).setCreativeTab(tab); + standard_splint_legs = (ItemArmourMF) new ItemCustomArmour(design, "splint_legs", ArmourDesign.SPLINTMAIL, 2, + "splint_layer_2", 0).setCreativeTab(tab); + standard_splint_boots = (ItemArmourMF) new ItemCustomArmour(design, "splint_boots", ArmourDesign.SPLINTMAIL, 3, + "splint_layer_1", 0).setCreativeTab(tab); + + standard_plate_helmet = (ItemArmourMF) new ItemCustomArmour(design, "plate_helmet", ArmourDesign.FIELDPLATE, 0, + "plate_layer_1", 0).setCreativeTab(tab); + standard_plate_chest = (ItemArmourMF) new ItemCustomArmour(design, "plate_chest", ArmourDesign.FIELDPLATE, 1, + "plate_layer_1", 0).setCreativeTab(tab); + standard_plate_legs = (ItemArmourMF) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, 2, + "plate_layer_2", 0).setCreativeTab(tab); + standard_plate_boots = (ItemArmourMF) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, + "plate_layer_1", 0).setCreativeTab(tab); + + //standart_plate_horse_armor = new ItemHorseArmorMF("horse_armor", BaseMaterialMF.getMaterial("steel"), ArmourDesign.FIELDPLATE, "plate_layer_1", 0); + } } diff --git a/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java b/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java index 07f1a0d6..dbbf79e1 100644 --- a/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java @@ -6,152 +6,125 @@ import minefantasy.mf2.item.archery.ItemBowMF; import minefantasy.mf2.item.list.styles.DragonforgedStyle; import minefantasy.mf2.item.list.styles.OrnateStyle; -import minefantasy.mf2.item.tool.ItemAxeMF; -import minefantasy.mf2.item.tool.ItemHoeMF; -import minefantasy.mf2.item.tool.ItemPickMF; -import minefantasy.mf2.item.tool.ItemShearsMF; -import minefantasy.mf2.item.tool.ItemSpadeMF; -import minefantasy.mf2.item.tool.advanced.ItemHandpick; -import minefantasy.mf2.item.tool.advanced.ItemHvyPick; -import minefantasy.mf2.item.tool.advanced.ItemHvyShovel; -import minefantasy.mf2.item.tool.advanced.ItemLumberAxe; -import minefantasy.mf2.item.tool.advanced.ItemMattock; -import minefantasy.mf2.item.tool.advanced.ItemScythe; -import minefantasy.mf2.item.tool.advanced.ItemTrowMF; -import minefantasy.mf2.item.tool.crafting.ItemBasicCraftTool; -import minefantasy.mf2.item.tool.crafting.ItemHammer; -import minefantasy.mf2.item.tool.crafting.ItemKnifeMF; -import minefantasy.mf2.item.tool.crafting.ItemNeedle; -import minefantasy.mf2.item.tool.crafting.ItemSaw; -import minefantasy.mf2.item.tool.crafting.ItemSpanner; -import minefantasy.mf2.item.tool.crafting.ItemTongs; -import minefantasy.mf2.item.weapon.ItemBattleaxeMF; -import minefantasy.mf2.item.weapon.ItemDagger; -import minefantasy.mf2.item.weapon.ItemGreatswordMF; -import minefantasy.mf2.item.weapon.ItemHalbeardMF; -import minefantasy.mf2.item.weapon.ItemKatanaMF; -import minefantasy.mf2.item.weapon.ItemLance; -import minefantasy.mf2.item.weapon.ItemMaceMF; -import minefantasy.mf2.item.weapon.ItemSpearMF; -import minefantasy.mf2.item.weapon.ItemSwordMF; -import minefantasy.mf2.item.weapon.ItemWaraxeMF; -import minefantasy.mf2.item.weapon.ItemWarhammerMF; -import minefantasy.mf2.item.weapon.ItemWeaponMF; +import minefantasy.mf2.item.tool.*; +import minefantasy.mf2.item.tool.advanced.*; +import minefantasy.mf2.item.tool.crafting.*; +import minefantasy.mf2.item.weapon.*; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item.ToolMaterial; public class CustomToolListMF { - // STANDARD - public static ItemWeaponMF standard_sword, standard_waraxe, standard_mace, standard_dagger, standard_spear; - public static ItemWeaponMF standard_greatsword, standard_battleaxe, standard_warhammer, standard_katana, - standard_halbeard, standard_lance; - public static ItemPickMF standard_pick; - public static ItemAxeMF standard_axe; - public static ItemSpadeMF standard_spade; - public static ItemHoeMF standard_hoe; - public static ItemHvyPick standard_hvypick; - public static ItemHvyShovel standard_hvyshovel; - public static ItemHandpick standard_handpick; - public static ItemTrowMF standard_trow; - public static ItemScythe standard_scythe; - public static ItemMattock standard_mattock; - public static ItemLumberAxe standard_lumber; + // STANDARD + public static ItemWeaponMF standard_sword, standard_waraxe, standard_mace, standard_dagger, standard_spear; + public static ItemWeaponMF standard_greatsword, standard_battleaxe, standard_warhammer, standard_katana, + standard_halbeard, standard_lance; + public static ItemPickMF standard_pick; + public static ItemAxeMF standard_axe; + public static ItemSpadeMF standard_spade; + public static ItemHoeMF standard_hoe; + public static ItemHvyPick standard_hvypick; + public static ItemHvyShovel standard_hvyshovel; + public static ItemHandpick standard_handpick; + public static ItemTrowMF standard_trow; + public static ItemScythe standard_scythe; + public static ItemMattock standard_mattock; + public static ItemLumberAxe standard_lumber; - public static ItemHammer standard_hammer, standard_hvyhammer; - public static ItemTongs standard_tongs; - public static ItemShearsMF standard_shears; - public static ItemKnifeMF standard_knife; - public static ItemNeedle standard_needle; - public static ItemSaw standard_saw; - public static ItemSpanner standard_spanner; - public static ItemBasicCraftTool standard_spoon, standard_mallet; + public static ItemHammer standard_hammer, standard_hvyhammer; + public static ItemTongs standard_tongs; + public static ItemShearsMF standard_shears; + public static ItemKnifeMF standard_knife; + public static ItemNeedle standard_needle; + public static ItemSaw standard_saw; + public static ItemSpanner standard_spanner; + public static ItemBasicCraftTool standard_spoon, standard_mallet; - public static ItemBowMF standard_bow; - public static ItemArrowMF standard_arrow, standard_bolt, standard_arrow_bodkin, standard_arrow_broad; + public static ItemBowMF standard_bow; + public static ItemArrowMF standard_arrow, standard_bolt, standard_arrow_bodkin, standard_arrow_broad; - public static void load() { - String design = "standard"; - CreativeTabs tab = CreativeTabMF.tabWeapon; - // Standard Weapons - standard_dagger = new ItemDagger(design + "_dagger", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_sword = new ItemSwordMF(design + "_sword", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_waraxe = new ItemWaraxeMF(design + "_waraxe", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_mace = new ItemMaceMF(design + "_mace", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_spear = new ItemSpearMF(design + "_spear", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_katana = new ItemKatanaMF(design + "_katana", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_greatsword = new ItemGreatswordMF(design + "_greatsword", ToolMaterial.IRON, 0, 1F).setCustom(design) - .setTab(tab); - standard_battleaxe = new ItemBattleaxeMF(design + "_battleaxe", ToolMaterial.IRON, 0, 1F).setCustom(design) - .setTab(tab); - standard_warhammer = new ItemWarhammerMF(design + "_warhammer", ToolMaterial.IRON, 0, 1F).setCustom(design) - .setTab(tab); - standard_halbeard = new ItemHalbeardMF(design + "_halbeard", ToolMaterial.IRON, 0, 1F).setCustom(design) - .setTab(tab); - standard_lance = new ItemLance(design + "_lance", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + public static void load() { + String design = "standard"; + CreativeTabs tab = CreativeTabMF.tabWeapon; + // Standard Weapons + standard_dagger = new ItemDagger(design + "_dagger", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_sword = new ItemSwordMF(design + "_sword", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_waraxe = new ItemWaraxeMF(design + "_waraxe", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_mace = new ItemMaceMF(design + "_mace", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_spear = new ItemSpearMF(design + "_spear", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_katana = new ItemKatanaMF(design + "_katana", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_greatsword = new ItemGreatswordMF(design + "_greatsword", ToolMaterial.IRON, 0, 1F).setCustom(design) + .setTab(tab); + standard_battleaxe = new ItemBattleaxeMF(design + "_battleaxe", ToolMaterial.IRON, 0, 1F).setCustom(design) + .setTab(tab); + standard_warhammer = new ItemWarhammerMF(design + "_warhammer", ToolMaterial.IRON, 0, 1F).setCustom(design) + .setTab(tab); + standard_halbeard = new ItemHalbeardMF(design + "_halbeard", ToolMaterial.IRON, 0, 1F).setCustom(design) + .setTab(tab); + standard_lance = new ItemLance(design + "_lance", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - tab = CreativeTabMF.tabArcher; - standard_bow = (ItemBowMF) new ItemBowMF(design + "_bow", EnumBowType.SHORTBOW).setCustom(design) - .setCreativeTab(tab); - standard_bolt = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BOLT, 20).setCustom(design).setAmmoType("bolt") - .setCreativeTab(tab); - standard_arrow = (ItemArrowMF) new ItemArrowMF(design, ArrowType.NORMAL, 16).setCustom(design) - .setCreativeTab(tab); - standard_arrow_bodkin = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BODKIN, 16).setCustom(design) - .setCreativeTab(tab); - standard_arrow_broad = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BROADHEAD, 16).setCustom(design) - .setCreativeTab(tab); + tab = CreativeTabMF.tabArcher; + standard_bow = (ItemBowMF) new ItemBowMF(design + "_bow", EnumBowType.SHORTBOW).setCustom(design) + .setCreativeTab(tab); + standard_bolt = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BOLT, 20).setCustom(design).setAmmoType("bolt") + .setCreativeTab(tab); + standard_arrow = (ItemArrowMF) new ItemArrowMF(design, ArrowType.NORMAL, 16).setCustom(design) + .setCreativeTab(tab); + standard_arrow_bodkin = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BODKIN, 16).setCustom(design) + .setCreativeTab(tab); + standard_arrow_broad = (ItemArrowMF) new ItemArrowMF(design, ArrowType.BROADHEAD, 16).setCustom(design) + .setCreativeTab(tab); - tab = CreativeTabMF.tabTool; - // Standard Tools - standard_pick = (ItemPickMF) new ItemPickMF(design + "_pick", ToolMaterial.IRON, 0).setCustom(design) - .setCreativeTab(tab); - standard_axe = (ItemAxeMF) new ItemAxeMF(design + "_axe", ToolMaterial.IRON, 0).setCustom(design) - .setCreativeTab(tab); - standard_spade = (ItemSpadeMF) new ItemSpadeMF(design + "_spade", ToolMaterial.IRON, 0).setCustom(design) - .setCreativeTab(tab); - standard_hoe = (ItemHoeMF) new ItemHoeMF(design + "_hoe", ToolMaterial.IRON, 0).setCustom(design) - .setCreativeTab(tab); + tab = CreativeTabMF.tabTool; + // Standard Tools + standard_pick = (ItemPickMF) new ItemPickMF(design + "_pick", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_axe = (ItemAxeMF) new ItemAxeMF(design + "_axe", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_spade = (ItemSpadeMF) new ItemSpadeMF(design + "_spade", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_hoe = (ItemHoeMF) new ItemHoeMF(design + "_hoe", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); - tab = CreativeTabMF.tabToolAdvanced; - standard_handpick = (ItemHandpick) new ItemHandpick(design + "_handpick", ToolMaterial.IRON, 0) - .setCustom(design).setCreativeTab(tab); - standard_hvypick = (ItemHvyPick) new ItemHvyPick(design + "_hvypick", ToolMaterial.IRON, 0).setCustom(design) - .setCreativeTab(tab); - standard_trow = (ItemTrowMF) new ItemTrowMF(design + "_trow", ToolMaterial.IRON, 0).setCustom(design) - .setCreativeTab(tab); - standard_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design + "_hvyshovel", ToolMaterial.IRON, 0) - .setCustom(design).setCreativeTab(tab); - standard_scythe = (ItemScythe) new ItemScythe(design + "_scythe", ToolMaterial.IRON, 0).setCustom(design) - .setCreativeTab(tab); - standard_mattock = (ItemMattock) new ItemMattock(design + "_mattock", ToolMaterial.IRON, 0).setCustom(design) - .setCreativeTab(tab); - standard_lumber = (ItemLumberAxe) new ItemLumberAxe(design + "_lumber", ToolMaterial.IRON, 0).setCustom(design) - .setCreativeTab(tab); - // Standard Crafters - tab = CreativeTabMF.tabCraftTool; - standard_hammer = (ItemHammer) new ItemHammer(design + "_hammer", ToolMaterial.IRON, false, 0, 0) - .setCustom(design).setCreativeTab(tab); - standard_hvyhammer = (ItemHammer) new ItemHammer(design + "_hvyhammer", ToolMaterial.IRON, true, 0, 0) - .setCustom(design).setCreativeTab(tab); - standard_shears = (ItemShearsMF) new ItemShearsMF(design + "_shears", ToolMaterial.IRON, 0, 0).setCustom(design) - .setCreativeTab(tab); - standard_knife = (ItemKnifeMF) new ItemKnifeMF(design + "_knife", ToolMaterial.IRON, 0, 1F, 0).setCustom(design) - .setCreativeTab(tab); - standard_needle = (ItemNeedle) new ItemNeedle(design + "_needle", ToolMaterial.IRON, 0, 0).setCustom(design) - .setCreativeTab(tab); - standard_saw = (ItemSaw) new ItemSaw(design + "_saw", ToolMaterial.IRON, 0, 0).setCustom(design) - .setCreativeTab(tab); - standard_tongs = (ItemTongs) new ItemTongs(design + "_tongs", ToolMaterial.IRON, 0).setCustom(design) - .setCreativeTab(tab); - standard_spanner = (ItemSpanner) new ItemSpanner(design + "_spanner", 0, 0).setCustom(design) - .setCreativeTab(tab); + tab = CreativeTabMF.tabToolAdvanced; + standard_handpick = (ItemHandpick) new ItemHandpick(design + "_handpick", ToolMaterial.IRON, 0) + .setCustom(design).setCreativeTab(tab); + standard_hvypick = (ItemHvyPick) new ItemHvyPick(design + "_hvypick", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_trow = (ItemTrowMF) new ItemTrowMF(design + "_trow", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design + "_hvyshovel", ToolMaterial.IRON, 0) + .setCustom(design).setCreativeTab(tab); + standard_scythe = (ItemScythe) new ItemScythe(design + "_scythe", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_mattock = (ItemMattock) new ItemMattock(design + "_mattock", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_lumber = (ItemLumberAxe) new ItemLumberAxe(design + "_lumber", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + // Standard Crafters + tab = CreativeTabMF.tabCraftTool; + standard_hammer = (ItemHammer) new ItemHammer(design + "_hammer", ToolMaterial.IRON, false, 0, 0) + .setCustom(design).setCreativeTab(tab); + standard_hvyhammer = (ItemHammer) new ItemHammer(design + "_hvyhammer", ToolMaterial.IRON, true, 0, 0) + .setCustom(design).setCreativeTab(tab); + standard_shears = (ItemShearsMF) new ItemShearsMF(design + "_shears", ToolMaterial.IRON, 0, 0).setCustom(design) + .setCreativeTab(tab); + standard_knife = (ItemKnifeMF) new ItemKnifeMF(design + "_knife", ToolMaterial.IRON, 0, 1F, 0).setCustom(design) + .setCreativeTab(tab); + standard_needle = (ItemNeedle) new ItemNeedle(design + "_needle", ToolMaterial.IRON, 0, 0).setCustom(design) + .setCreativeTab(tab); + standard_saw = (ItemSaw) new ItemSaw(design + "_saw", ToolMaterial.IRON, 0, 0).setCustom(design) + .setCreativeTab(tab); + standard_tongs = (ItemTongs) new ItemTongs(design + "_tongs", ToolMaterial.IRON, 0).setCustom(design) + .setCreativeTab(tab); + standard_spanner = (ItemSpanner) new ItemSpanner(design + "_spanner", 0, 0).setCustom(design) + .setCreativeTab(tab); - standard_spoon = (ItemBasicCraftTool) new ItemBasicCraftTool(design + "_spoon", "spoon", 0, 64) - .setCustom(design).setCreativeTab(tab); - standard_mallet = (ItemBasicCraftTool) new ItemBasicCraftTool(design + "_mallet", "mallet", 0, 64) - .setCustom(design).setCreativeTab(tab); + standard_spoon = (ItemBasicCraftTool) new ItemBasicCraftTool(design + "_spoon", "spoon", 0, 64) + .setCustom(design).setCreativeTab(tab); + standard_mallet = (ItemBasicCraftTool) new ItemBasicCraftTool(design + "_mallet", "mallet", 0, 64) + .setCustom(design).setCreativeTab(tab); - DragonforgedStyle.load(); - OrnateStyle.load(); - } + DragonforgedStyle.load(); + OrnateStyle.load(); + } } diff --git a/src/main/java/minefantasy/mf2/item/list/ToolListMF.java b/src/main/java/minefantasy/mf2/item/list/ToolListMF.java index bc583045..46455341 100644 --- a/src/main/java/minefantasy/mf2/item/list/ToolListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ToolListMF.java @@ -4,35 +4,11 @@ import minefantasy.mf2.block.decor.ItemBedMF; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigHardcore; -import minefantasy.mf2.item.ItemBandage; -import minefantasy.mf2.item.ItemComponentMF; -import minefantasy.mf2.item.ItemResearchBook; -import minefantasy.mf2.item.ItemSkillBook; -import minefantasy.mf2.item.ItemWorldGenPlacer; +import minefantasy.mf2.item.*; import minefantasy.mf2.item.food.FoodListMF; -import minefantasy.mf2.item.gadget.ItemBomb; -import minefantasy.mf2.item.gadget.ItemClimbingPick; -import minefantasy.mf2.item.gadget.ItemCrossbow; -import minefantasy.mf2.item.gadget.ItemCrudeBomb; -import minefantasy.mf2.item.gadget.ItemExplodingArrow; -import minefantasy.mf2.item.gadget.ItemExplodingBolt; -import minefantasy.mf2.item.gadget.ItemLootSack; -import minefantasy.mf2.item.gadget.ItemMine; -import minefantasy.mf2.item.gadget.ItemParachute; -import minefantasy.mf2.item.gadget.ItemSpyglass; -import minefantasy.mf2.item.gadget.ItemSyringe; -import minefantasy.mf2.item.gadget.MobSpawnerMF; -import minefantasy.mf2.item.tool.ItemAxeMF; -import minefantasy.mf2.item.tool.ItemHoeMF; -import minefantasy.mf2.item.tool.ItemLighterMF; -import minefantasy.mf2.item.tool.ItemPickMF; -import minefantasy.mf2.item.tool.ItemSpadeMF; -import minefantasy.mf2.item.tool.crafting.ItemEAnvilTools; -import minefantasy.mf2.item.tool.crafting.ItemHammer; -import minefantasy.mf2.item.tool.crafting.ItemKnifeMF; -import minefantasy.mf2.item.tool.crafting.ItemNeedle; -import minefantasy.mf2.item.tool.crafting.ItemPaintBrush; -import minefantasy.mf2.item.tool.crafting.ItemTongs; +import minefantasy.mf2.item.gadget.*; +import minefantasy.mf2.item.tool.*; +import minefantasy.mf2.item.tool.crafting.*; import minefantasy.mf2.item.weapon.ItemMaceMF; import minefantasy.mf2.item.weapon.ItemSpearMF; import minefantasy.mf2.item.weapon.ItemSwordMF; @@ -53,322 +29,322 @@ * @author Anonymous Productions */ public class ToolListMF { - public static EnumRarity poor = EnumHelper.addRarity("Poor", EnumChatFormatting.DARK_GRAY, "poor"); - public static EnumRarity unique = EnumHelper.addRarity("Unique", EnumChatFormatting.DARK_GREEN, "unique"); - public static EnumRarity rare = EnumHelper.addRarity("Rare", EnumChatFormatting.DARK_BLUE, "rare"); - - public static EnumRarity[] rarity = new EnumRarity[] { ToolListMF.poor, EnumRarity.common, EnumRarity.uncommon, - EnumRarity.rare, EnumRarity.epic }; - - public static Item swordTraining = new ItemSwordMF("training_sword", ToolMaterial.WOOD, -1, 0.8F); - public static Item waraxeTraining = new ItemWaraxeMF("training_waraxe", ToolMaterial.WOOD, -1, 0.8F); - public static Item maceTraining = new ItemMaceMF("training_mace", ToolMaterial.WOOD, -1, 0.8F); - public static Item spearTraining = new ItemSpearMF("training_spear", ToolMaterial.WOOD, -1, 0.8F); - public static Item knifeStone = new ItemKnifeMF("stone_knife", - BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 3.5F, 0); - public static Item hammerStone = new ItemHammer("stone_hammer", - BaseMaterialMF.getMaterial("stone").getToolConversion(), false, -1, 0); - public static Item tongsStone = new ItemTongs("stone_tongs", - BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); - public static Item needleBone = new ItemNeedle("bone_needle", - BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 0); - - public static Item pickStone = new ItemPickMF("stone_pick", BaseMaterialMF.getMaterial("stone").getToolConversion(), - -1); - public static Item axeStone = new ItemAxeMF("stone_axe", BaseMaterialMF.getMaterial("stone").getToolConversion(), - -1); - public static Item spadeStone = new ItemSpadeMF("stone_spade", - BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); - public static Item hoeStone = new ItemHoeMF("stone_hoe", BaseMaterialMF.getMaterial("stone").getToolConversion(), - -1); - - public static Item swordStone = new ItemSwordMF("stone_sword", - BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); - public static Item maceStone = new ItemMaceMF("stone_mace", BaseMaterialMF.getMaterial("stone").getToolConversion(), - -1, 2.0F); - public static Item waraxeStone = new ItemWaraxeMF("stone_waraxe", - BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); - public static Item spearStone = new ItemSpearMF("stone_spear", - BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); - - public static Item bandage_crude = new ItemBandage("bandage_crude", 5F); - public static Item bandage_wool = new ItemBandage("bandage_wool", 8F); - public static Item bandage_tough = new ItemBandage("bandage_tough", 12F); - - public static ItemCrudeBomb bomb_crude = new ItemCrudeBomb("bomb_crude"); - public static ItemBomb bomb_custom = new ItemBomb("bomb_basic"); - public static ItemMine mine_custom = new ItemMine("mine_basic"); - - public static ItemResearchBook researchBook = new ItemResearchBook(); - - public static Item dryrocks = new ItemLighterMF("dryrocks", 0.1F, 16); - public static Item tinderbox = new ItemLighterMF("tinderbox", 0.5F, 100); - - public static Item skillbook_artisanry = new ItemSkillBook("skillbook_artisanry", SkillList.artisanry); - public static Item skillbook_construction = new ItemSkillBook("skillbook_construction", SkillList.construction); - public static Item skillbook_provisioning = new ItemSkillBook("skillbook_provisioning", SkillList.provisioning); - public static Item skillbook_engineering = new ItemSkillBook("skillbook_engineering", SkillList.engineering); - public static Item skillbook_combat = new ItemSkillBook("skillbook_combat", SkillList.combat); - - public static Item skillbook_artisanry2 = new ItemSkillBook("skillbook_artisanry2", SkillList.artisanry).setMax(); - public static Item skillbook_construction2 = new ItemSkillBook("skillbook_construction2", SkillList.construction) - .setMax(); - public static Item skillbook_provisioning2 = new ItemSkillBook("skillbook_provisioning2", SkillList.provisioning) - .setMax(); - public static Item skillbook_engineering2 = new ItemSkillBook("skillbook_engineering2", SkillList.engineering) - .setMax(); - public static Item skillbook_combat2 = new ItemSkillBook("skillbook_combat2", SkillList.combat).setMax(); - - public static Item engin_anvil_tools = new ItemEAnvilTools("engin_anvil_tools", 64); - - public static Item exploding_arrow = new ItemExplodingArrow(); - public static Item spyglass = new ItemSpyglass(); - public static Item climbing_pick_basic; - public static Item parachute = new ItemParachute(); - - public static Item syringe = new ItemSyringe(); - public static Item syringe_empty = new ItemComponentMF("syringe_empty").setTextureName("minefantasy2:Other/syringe") - .setCreativeTab(CreativeTabMF.tabGadget); - - public static Item loot_sack = new ItemLootSack("loot_sack", 8, 0); - public static Item loot_sack_uc = new ItemLootSack("loot_sack_uc", 8, 1); - public static Item loot_sack_rare = new ItemLootSack("loot_sack_rare", 12, 2); - public static ItemCrossbow crossbow_custom = new ItemCrossbow(); - public static Item exploding_bolt = new ItemExplodingBolt(); - public static Item paint_brush = new ItemPaintBrush("paint_brush", 256); - - public static Item bedroll = new ItemBedMF("bedroll"); - - public static Item debug_place = new ItemWorldGenPlacer(); - public static Item debug_mob = new MobSpawnerMF(); - - public static void load() { - if (ConfigHardcore.HCCWeakItems) { - weakenItems(); - } - climbing_pick_basic = new ItemClimbingPick("climbing_pick_basic", ToolMaterial.IRON, 0); - BlockListMF.load(); - ArmourListMF.load(); - FoodListMF.load(); - CustomToolListMF.load(); - CustomArmourListMF.load(); - - ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, - new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 1, 5, 50)); - ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, - new WeightedRandomChestContent(new ItemStack(skillbook_construction), 1, 1, 10)); - ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, - new WeightedRandomChestContent(new ItemStack(ArmourListMF.leatherapron), 1, 1, 10)); - - ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 2)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); - - ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, - new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); - ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, - new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); - ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, - new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); - - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, - new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, - new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, - new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); - - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, - new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, - new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); - ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, - new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); - - ChestGenHooks.addItem(ChestGenHooks.MINESHAFT_CORRIDOR, - new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 6, 20)); - ChestGenHooks.addItem(ChestGenHooks.MINESHAFT_CORRIDOR, - new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 2)); - - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CORRIDOR, - new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 5)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CORRIDOR, - new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 3)); - - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, - new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 3, 20)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, - new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 10)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, - new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 2)); - - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, - new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 2, 6, 10)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, - new WeightedRandomChestContent(new ItemStack(skillbook_construction), 2, 6, 10)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, - new WeightedRandomChestContent(new ItemStack(skillbook_provisioning), 2, 6, 10)); - ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, - new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 4, 8)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, - new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 1, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, - new WeightedRandomChestContent(new ItemStack(Items.paper), 5, 36, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, - new WeightedRandomChestContent(new ItemStack(Items.feather), 1, 4, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, - new WeightedRandomChestContent(new ItemStack(Items.book), 5, 26, 80)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, - new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 1, 1, 40)); - ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, - new WeightedRandomChestContent(new ItemStack(Items.coal), 5, 17, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, - new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, - new WeightedRandomChestContent(new ItemStack(Items.leather), 1, 4, 80)); - ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, - new WeightedRandomChestContent(ComponentListMF.bar("Steel"), 1, 6, 40)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, - new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_basic), 1, 1, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, - new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_advanced), 1, 1, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.coke), 1, 10, 60)); - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, - new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 1, 40)); - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.bronze_gears), 1, 9, 30)); - ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.tungsten_gears), 1, 1, 20)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, - new WeightedRandomChestContent(CustomToolListMF.standard_bolt.construct("Iron"), 1, 1, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, - new WeightedRandomChestContent(CustomToolListMF.standard_bolt.construct("Encrusted"), 1, 1, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, new WeightedRandomChestContent( - bomb_custom.createBomb((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1), 1, 1, 25)); - ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, new WeightedRandomChestContent( - mine_custom.createMine((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1), 1, 1, 25)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 1, 40)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 10)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(new ItemStack(Items.book), 1, 4, 60)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(new ItemStack(Items.bowl), 1, 6, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.clay_pot), 1, 7, 100)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(new ItemStack(Items.bone), 1, 9, 80)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 1, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 1, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 30)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(new ItemStack(Items.bucket), 1, 1, 80)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, - new WeightedRandomChestContent(new ItemStack(Items.clock), 1, 1, 20)); - - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 40)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 10)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(new ItemStack(Items.book), 1, 4, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(new ItemStack(Items.bowl), 1, 6, 30)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(new ItemStack(ComponentListMF.clay_pot), 1, 7, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(new ItemStack(Items.bone), 1, 9, 10)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 1, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 1, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 30)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 50)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(new ItemStack(Items.bucket), 1, 1, 20)); - ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, - new WeightedRandomChestContent(new ItemStack(Items.clock), 1, 1, 40)); - } - - private static void weakenItems() { - weakenItem(Items.wooden_pickaxe, 5); - weakenItem(Items.wooden_axe, 5); - weakenItem(Items.wooden_shovel, 5); - weakenItem(Items.wooden_sword, 5); - weakenItem(Items.wooden_hoe, 5); - weakenItem(Items.leather_helmet); - weakenItem(Items.leather_chestplate); - weakenItem(Items.leather_leggings); - weakenItem(Items.leather_boots); - - weakenItem(Items.stone_pickaxe, 10); - weakenItem(Items.stone_axe, 10); - weakenItem(Items.stone_shovel, 10); - weakenItem(Items.stone_sword, 10); - weakenItem(Items.stone_hoe, 10); - - weakenItem(Items.iron_pickaxe, 25); - weakenItem(Items.iron_axe, 25); - weakenItem(Items.iron_shovel, 25); - weakenItem(Items.iron_sword, 25); - weakenItem(Items.iron_hoe, 25); - weakenItem(Items.iron_helmet); - weakenItem(Items.iron_chestplate); - weakenItem(Items.iron_leggings); - weakenItem(Items.iron_boots); - - weakenItem(Items.golden_pickaxe, 1); - weakenItem(Items.golden_axe, 1); - weakenItem(Items.golden_shovel, 1); - weakenItem(Items.golden_sword, 1); - weakenItem(Items.golden_hoe, 1); - weakenItem(Items.golden_helmet); - weakenItem(Items.golden_chestplate); - weakenItem(Items.golden_leggings); - weakenItem(Items.golden_boots); - - weakenItem(Items.diamond_pickaxe, 100); - weakenItem(Items.diamond_axe, 100); - weakenItem(Items.diamond_shovel, 100); - weakenItem(Items.diamond_sword, 100); - weakenItem(Items.diamond_hoe, 100); - weakenItem(Items.diamond_helmet); - weakenItem(Items.diamond_chestplate); - weakenItem(Items.diamond_leggings); - weakenItem(Items.diamond_boots); - } - - private static void weakenItem(Item item) { - weakenItem(item, (item.getMaxDamage() / 10) + 1); - } - - private static void weakenItem(Item item, int hp) { - if (item.isDamageable()) { - item.setMaxDamage(hp); - } - } + public static EnumRarity poor = EnumHelper.addRarity("Poor", EnumChatFormatting.DARK_GRAY, "poor"); + public static EnumRarity unique = EnumHelper.addRarity("Unique", EnumChatFormatting.DARK_GREEN, "unique"); + public static EnumRarity rare = EnumHelper.addRarity("Rare", EnumChatFormatting.DARK_BLUE, "rare"); + + public static EnumRarity[] rarity = new EnumRarity[]{ToolListMF.poor, EnumRarity.common, EnumRarity.uncommon, + EnumRarity.rare, EnumRarity.epic}; + + public static Item swordTraining = new ItemSwordMF("training_sword", ToolMaterial.WOOD, -1, 0.8F); + public static Item waraxeTraining = new ItemWaraxeMF("training_waraxe", ToolMaterial.WOOD, -1, 0.8F); + public static Item maceTraining = new ItemMaceMF("training_mace", ToolMaterial.WOOD, -1, 0.8F); + public static Item spearTraining = new ItemSpearMF("training_spear", ToolMaterial.WOOD, -1, 0.8F); + public static Item knifeStone = new ItemKnifeMF("stone_knife", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 3.5F, 0); + public static Item hammerStone = new ItemHammer("stone_hammer", + BaseMaterialMF.getMaterial("stone").getToolConversion(), false, -1, 0); + public static Item tongsStone = new ItemTongs("stone_tongs", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); + public static Item needleBone = new ItemNeedle("bone_needle", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 0); + + public static Item pickStone = new ItemPickMF("stone_pick", BaseMaterialMF.getMaterial("stone").getToolConversion(), + -1); + public static Item axeStone = new ItemAxeMF("stone_axe", BaseMaterialMF.getMaterial("stone").getToolConversion(), + -1); + public static Item spadeStone = new ItemSpadeMF("stone_spade", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1); + public static Item hoeStone = new ItemHoeMF("stone_hoe", BaseMaterialMF.getMaterial("stone").getToolConversion(), + -1); + + public static Item swordStone = new ItemSwordMF("stone_sword", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); + public static Item maceStone = new ItemMaceMF("stone_mace", BaseMaterialMF.getMaterial("stone").getToolConversion(), + -1, 2.0F); + public static Item waraxeStone = new ItemWaraxeMF("stone_waraxe", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); + public static Item spearStone = new ItemSpearMF("stone_spear", + BaseMaterialMF.getMaterial("stone").getToolConversion(), -1, 2.0F); + + public static Item bandage_crude = new ItemBandage("bandage_crude", 5F); + public static Item bandage_wool = new ItemBandage("bandage_wool", 8F); + public static Item bandage_tough = new ItemBandage("bandage_tough", 12F); + + public static ItemCrudeBomb bomb_crude = new ItemCrudeBomb("bomb_crude"); + public static ItemBomb bomb_custom = new ItemBomb("bomb_basic"); + public static ItemMine mine_custom = new ItemMine("mine_basic"); + + public static ItemResearchBook researchBook = new ItemResearchBook(); + + public static Item dryrocks = new ItemLighterMF("dryrocks", 0.1F, 16); + public static Item tinderbox = new ItemLighterMF("tinderbox", 0.5F, 100); + + public static Item skillbook_artisanry = new ItemSkillBook("skillbook_artisanry", SkillList.artisanry); + public static Item skillbook_construction = new ItemSkillBook("skillbook_construction", SkillList.construction); + public static Item skillbook_provisioning = new ItemSkillBook("skillbook_provisioning", SkillList.provisioning); + public static Item skillbook_engineering = new ItemSkillBook("skillbook_engineering", SkillList.engineering); + public static Item skillbook_combat = new ItemSkillBook("skillbook_combat", SkillList.combat); + + public static Item skillbook_artisanry2 = new ItemSkillBook("skillbook_artisanry2", SkillList.artisanry).setMax(); + public static Item skillbook_construction2 = new ItemSkillBook("skillbook_construction2", SkillList.construction) + .setMax(); + public static Item skillbook_provisioning2 = new ItemSkillBook("skillbook_provisioning2", SkillList.provisioning) + .setMax(); + public static Item skillbook_engineering2 = new ItemSkillBook("skillbook_engineering2", SkillList.engineering) + .setMax(); + public static Item skillbook_combat2 = new ItemSkillBook("skillbook_combat2", SkillList.combat).setMax(); + + public static Item engin_anvil_tools = new ItemEAnvilTools("engin_anvil_tools", 64); + + public static Item exploding_arrow = new ItemExplodingArrow(); + public static Item spyglass = new ItemSpyglass(); + public static Item climbing_pick_basic; + public static Item parachute = new ItemParachute(); + + public static Item syringe = new ItemSyringe(); + public static Item syringe_empty = new ItemComponentMF("syringe_empty").setTextureName("minefantasy2:Other/syringe") + .setCreativeTab(CreativeTabMF.tabGadget); + + public static Item loot_sack = new ItemLootSack("loot_sack", 8, 0); + public static Item loot_sack_uc = new ItemLootSack("loot_sack_uc", 8, 1); + public static Item loot_sack_rare = new ItemLootSack("loot_sack_rare", 12, 2); + public static ItemCrossbow crossbow_custom = new ItemCrossbow(); + public static Item exploding_bolt = new ItemExplodingBolt(); + public static Item paint_brush = new ItemPaintBrush("paint_brush", 256); + + public static Item bedroll = new ItemBedMF("bedroll"); + + public static Item debug_place = new ItemWorldGenPlacer(); + public static Item debug_mob = new MobSpawnerMF(); + + public static void load() { + if (ConfigHardcore.HCCWeakItems) { + weakenItems(); + } + climbing_pick_basic = new ItemClimbingPick("climbing_pick_basic", ToolMaterial.IRON, 0); + BlockListMF.load(); + ArmourListMF.load(); + FoodListMF.load(); + CustomToolListMF.load(); + CustomArmourListMF.load(); + + ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, + new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 1, 5, 50)); + ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, + new WeightedRandomChestContent(new ItemStack(skillbook_construction), 1, 1, 10)); + ChestGenHooks.addItem(ChestGenHooks.VILLAGE_BLACKSMITH, + new WeightedRandomChestContent(new ItemStack(ArmourListMF.leatherapron), 1, 1, 10)); + + ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 2)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.talisman_lesser), 1, 1, 3)); + + ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); + ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); + ChestGenHooks.addItem(ChestGenHooks.DUNGEON_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); + + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_DESERT_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); + + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 10)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 5)); + ChestGenHooks.addItem(ChestGenHooks.PYRAMID_JUNGLE_CHEST, + new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 1)); + + ChestGenHooks.addItem(ChestGenHooks.MINESHAFT_CORRIDOR, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 6, 20)); + ChestGenHooks.addItem(ChestGenHooks.MINESHAFT_CORRIDOR, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 2)); + + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CORRIDOR, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 4, 5)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CORRIDOR, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 3)); + + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 3, 20)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 2, 10)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_CROSSING, + new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 2)); + + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, + new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 2, 6, 10)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, + new WeightedRandomChestContent(new ItemStack(skillbook_construction), 2, 6, 10)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, + new WeightedRandomChestContent(new ItemStack(skillbook_provisioning), 2, 6, 10)); + ChestGenHooks.addItem(ChestGenHooks.STRONGHOLD_LIBRARY, + new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 4, 8)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, + new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 1, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, + new WeightedRandomChestContent(new ItemStack(Items.paper), 5, 36, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, + new WeightedRandomChestContent(new ItemStack(Items.feather), 1, 4, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_STUDY, + new WeightedRandomChestContent(new ItemStack(Items.book), 5, 26, 80)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, + new WeightedRandomChestContent(new ItemStack(skillbook_artisanry), 1, 1, 40)); + ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, + new WeightedRandomChestContent(new ItemStack(Items.coal), 5, 17, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, + new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, + new WeightedRandomChestContent(new ItemStack(Items.leather), 1, 4, 80)); + ChestGenHooks.addItem(LootTypes.DWARVEN_FORGE, + new WeightedRandomChestContent(ComponentListMF.bar("Steel"), 1, 6, 40)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_basic), 1, 1, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(BlockListMF.repair_advanced), 1, 1, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.coke), 1, 10, 60)); + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(skillbook_engineering), 1, 1, 40)); + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.bronze_gears), 1, 9, 30)); + ChestGenHooks.addItem(LootTypes.DWARVEN_ARMOURY, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.tungsten_gears), 1, 1, 20)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, + new WeightedRandomChestContent(CustomToolListMF.standard_bolt.construct("Iron"), 1, 1, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, + new WeightedRandomChestContent(CustomToolListMF.standard_bolt.construct("Encrusted"), 1, 1, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, new WeightedRandomChestContent( + bomb_custom.createBomb((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1), 1, 1, 25)); + ChestGenHooks.addItem(LootTypes.DWARVEN_AMMO, new WeightedRandomChestContent( + mine_custom.createMine((byte) 1, (byte) 1, (byte) 0, (byte) 0, 1), 1, 1, 25)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(loot_sack), 1, 1, 40)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 10)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.book), 1, 4, 60)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.bowl), 1, 6, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.clay_pot), 1, 7, 100)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.bone), 1, 9, 80)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 1, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 1, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 30)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.bucket), 1, 1, 80)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME, + new WeightedRandomChestContent(new ItemStack(Items.clock), 1, 1, 20)); + + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(loot_sack_uc), 1, 1, 40)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(loot_sack_rare), 1, 1, 10)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.book), 1, 4, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.bowl), 1, 6, 30)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(ComponentListMF.clay_pot), 1, 7, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.bone), 1, 9, 10)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.emerald), 1, 1, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.diamond), 1, 1, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(ComponentListMF.bar("Iron"), 1, 4, 30)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(ComponentListMF.bar("Gold"), 1, 4, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(ComponentListMF.bar("Silver"), 1, 4, 50)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.bucket), 1, 1, 20)); + ChestGenHooks.addItem(LootTypes.DWARVEN_HOME_RICH, + new WeightedRandomChestContent(new ItemStack(Items.clock), 1, 1, 40)); + } + + private static void weakenItems() { + weakenItem(Items.wooden_pickaxe, 5); + weakenItem(Items.wooden_axe, 5); + weakenItem(Items.wooden_shovel, 5); + weakenItem(Items.wooden_sword, 5); + weakenItem(Items.wooden_hoe, 5); + weakenItem(Items.leather_helmet); + weakenItem(Items.leather_chestplate); + weakenItem(Items.leather_leggings); + weakenItem(Items.leather_boots); + + weakenItem(Items.stone_pickaxe, 10); + weakenItem(Items.stone_axe, 10); + weakenItem(Items.stone_shovel, 10); + weakenItem(Items.stone_sword, 10); + weakenItem(Items.stone_hoe, 10); + + weakenItem(Items.iron_pickaxe, 25); + weakenItem(Items.iron_axe, 25); + weakenItem(Items.iron_shovel, 25); + weakenItem(Items.iron_sword, 25); + weakenItem(Items.iron_hoe, 25); + weakenItem(Items.iron_helmet); + weakenItem(Items.iron_chestplate); + weakenItem(Items.iron_leggings); + weakenItem(Items.iron_boots); + + weakenItem(Items.golden_pickaxe, 1); + weakenItem(Items.golden_axe, 1); + weakenItem(Items.golden_shovel, 1); + weakenItem(Items.golden_sword, 1); + weakenItem(Items.golden_hoe, 1); + weakenItem(Items.golden_helmet); + weakenItem(Items.golden_chestplate); + weakenItem(Items.golden_leggings); + weakenItem(Items.golden_boots); + + weakenItem(Items.diamond_pickaxe, 100); + weakenItem(Items.diamond_axe, 100); + weakenItem(Items.diamond_shovel, 100); + weakenItem(Items.diamond_sword, 100); + weakenItem(Items.diamond_hoe, 100); + weakenItem(Items.diamond_helmet); + weakenItem(Items.diamond_chestplate); + weakenItem(Items.diamond_leggings); + weakenItem(Items.diamond_boots); + } + + private static void weakenItem(Item item) { + weakenItem(item, (item.getMaxDamage() / 10) + 1); + } + + private static void weakenItem(Item item, int hp) { + if (item.isDamageable()) { + item.setMaxDamage(hp); + } + } } diff --git a/src/main/java/minefantasy/mf2/item/list/styles/DragonforgedStyle.java b/src/main/java/minefantasy/mf2/item/list/styles/DragonforgedStyle.java index bcd892e8..0d6a39e0 100644 --- a/src/main/java/minefantasy/mf2/item/list/styles/DragonforgedStyle.java +++ b/src/main/java/minefantasy/mf2/item/list/styles/DragonforgedStyle.java @@ -8,238 +8,212 @@ import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.CustomArmourListMF; import minefantasy.mf2.item.list.CustomToolListMF; -import minefantasy.mf2.item.tool.ItemAxeMF; -import minefantasy.mf2.item.tool.ItemHoeMF; -import minefantasy.mf2.item.tool.ItemPickMF; -import minefantasy.mf2.item.tool.ItemShearsMF; -import minefantasy.mf2.item.tool.ItemSpadeMF; -import minefantasy.mf2.item.tool.advanced.ItemHandpick; -import minefantasy.mf2.item.tool.advanced.ItemHvyPick; -import minefantasy.mf2.item.tool.advanced.ItemHvyShovel; -import minefantasy.mf2.item.tool.advanced.ItemLumberAxe; -import minefantasy.mf2.item.tool.advanced.ItemMattock; -import minefantasy.mf2.item.tool.advanced.ItemScythe; -import minefantasy.mf2.item.tool.advanced.ItemTrowMF; -import minefantasy.mf2.item.tool.crafting.ItemHammer; -import minefantasy.mf2.item.tool.crafting.ItemKnifeMF; -import minefantasy.mf2.item.tool.crafting.ItemNeedle; -import minefantasy.mf2.item.tool.crafting.ItemSaw; -import minefantasy.mf2.item.tool.crafting.ItemSpanner; -import minefantasy.mf2.item.tool.crafting.ItemTongs; -import minefantasy.mf2.item.weapon.ItemBattleaxeMF; -import minefantasy.mf2.item.weapon.ItemDagger; -import minefantasy.mf2.item.weapon.ItemGreatswordMF; -import minefantasy.mf2.item.weapon.ItemHalbeardMF; -import minefantasy.mf2.item.weapon.ItemKatanaMF; -import minefantasy.mf2.item.weapon.ItemLance; -import minefantasy.mf2.item.weapon.ItemMaceMF; -import minefantasy.mf2.item.weapon.ItemSpearMF; -import minefantasy.mf2.item.weapon.ItemSwordMF; -import minefantasy.mf2.item.weapon.ItemWaraxeMF; -import minefantasy.mf2.item.weapon.ItemWarhammerMF; -import minefantasy.mf2.item.weapon.ItemWeaponMF; +import minefantasy.mf2.item.tool.*; +import minefantasy.mf2.item.tool.advanced.*; +import minefantasy.mf2.item.tool.crafting.*; +import minefantasy.mf2.item.weapon.*; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item.ToolMaterial; import net.minecraftforge.common.util.EnumHelper; public class DragonforgedStyle { - public static ToolMaterial dragonforged = EnumHelper.addToolMaterial("dragonforged", 2, 250, 6.0F, 2.0F, 15); - - public static ItemWeaponMF dragonforged_sword, dragonforged_waraxe, dragonforged_mace, dragonforged_dagger, - dragonforged_spear; - public static ItemWeaponMF dragonforged_greatsword, dragonforged_battleaxe, dragonforged_warhammer, - dragonforged_katana, dragonforged_halbeard, dragonforged_lance; - public static ItemPickMF dragonforged_pick; - public static ItemAxeMF dragonforged_axe; - public static ItemSpadeMF dragonforged_spade; - public static ItemHoeMF dragonforged_hoe; - public static ItemHvyPick dragonforged_hvypick; - public static ItemHvyShovel dragonforged_hvyshovel; - public static ItemHandpick dragonforged_handpick; - public static ItemTrowMF dragonforged_trow; - public static ItemScythe dragonforged_scythe; - public static ItemMattock dragonforged_mattock; - public static ItemLumberAxe dragonforged_lumber; - - public static ItemHammer dragonforged_hammer, dragonforged_hvyhammer; - public static ItemTongs dragonforged_tongs; - public static ItemShearsMF dragonforged_shears; - public static ItemKnifeMF dragonforged_knife; - public static ItemNeedle dragonforged_needle; - public static ItemSaw dragonforged_saw; - public static ItemSpanner dragonforged_spanner; - - public static ItemBowMF dragonforged_bow; - - public static ItemCustomArmour dragonforged_scale_helmet, dragonforged_scale_chest, dragonforged_scale_legs, - dragonforged_scale_boots; - public static ItemCustomArmour dragonforged_chain_helmet, dragonforged_chain_chest, dragonforged_chain_legs, - dragonforged_chain_boots; - public static ItemCustomArmour dragonforged_splint_helmet, dragonforged_splint_chest, dragonforged_splint_legs, - dragonforged_splint_boots; - public static ItemCustomArmour dragonforged_plate_helmet, dragonforged_plate_chest, dragonforged_plate_legs, - dragonforged_plate_boots; - - public static void load() { - String design = "dragonforged"; - CreativeTabs tab = CreativeTabMF.tabDragonforged; - ToolMaterial mat = dragonforged; - float ratingMod = 1.2F; - - dragonforged_dagger = new ItemDagger(design + "_dagger", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - dragonforged_sword = new ItemSwordMF(design + "_sword", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - dragonforged_waraxe = new ItemWaraxeMF(design + "_waraxe", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - dragonforged_mace = new ItemMaceMF(design + "_mace", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - dragonforged_spear = new ItemSpearMF(design + "_spear", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - dragonforged_katana = new ItemKatanaMF(design + "_katana", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - dragonforged_greatsword = new ItemGreatswordMF(design + "_greatsword", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - dragonforged_battleaxe = new ItemBattleaxeMF(design + "_battleaxe", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - dragonforged_warhammer = new ItemWarhammerMF(design + "_warhammer", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - dragonforged_halbeard = new ItemHalbeardMF(design + "_halbeard", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - dragonforged_lance = new ItemLance(design + "_lance", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(1); - - dragonforged_bow = (ItemBowMF) new ItemBowMF(design + "_bow", mat, EnumBowType.SHORTBOW, 1).setCustom(design) - .setCreativeTab(tab); - - // Tools - dragonforged_pick = (ItemPickMF) new ItemPickMF(design + "_pick", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_axe = (ItemAxeMF) new ItemAxeMF(design + "_axe", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_spade = (ItemSpadeMF) new ItemSpadeMF(design + "_spade", mat, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_hoe = (ItemHoeMF) new ItemHoeMF(design + "_hoe", mat, 0).setCustom(design).setCreativeTab(tab); - - dragonforged_handpick = (ItemHandpick) new ItemHandpick(design + "_handpick", mat, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_hvypick = (ItemHvyPick) new ItemHvyPick(design + "_hvypick", mat, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_trow = (ItemTrowMF) new ItemTrowMF(design + "_trow", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design + "_hvyshovel", mat, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_scythe = (ItemScythe) new ItemScythe(design + "_scythe", mat, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_mattock = (ItemMattock) new ItemMattock(design + "_mattock", mat, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_lumber = (ItemLumberAxe) new ItemLumberAxe(design + "_lumber", mat, 0).setCustom(design) - .setCreativeTab(tab); - - // Crafters - dragonforged_hammer = (ItemHammer) new ItemHammer(design + "_hammer", mat, false, 0, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_hvyhammer = (ItemHammer) new ItemHammer(design + "_hvyhammer", mat, true, 0, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_shears = (ItemShearsMF) new ItemShearsMF(design + "_shears", mat, 0, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_knife = (ItemKnifeMF) new ItemKnifeMF(design + "_knife", mat, 0, 1F, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_needle = (ItemNeedle) new ItemNeedle(design + "_needle", mat, 0, 0).setCustom(design) - .setCreativeTab(tab); - dragonforged_saw = (ItemSaw) new ItemSaw(design + "_saw", mat, 0, 0).setCustom(design).setCreativeTab(tab); - dragonforged_tongs = (ItemTongs) new ItemTongs(design + "_tongs", mat, 0).setCustom(design).setCreativeTab(tab); - dragonforged_spanner = (ItemSpanner) new ItemSpanner(design + "_spanner", 0, 0).setCustom(design) - .setCreativeTab(tab); - - dragonforged_chain_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "chain_helmet", - ArmourDesign.CHAINMAIL, 0, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_chain_chest = (ItemCustomArmour) new ItemCustomArmour(design, "chain_chest", - ArmourDesign.CHAINMAIL, 1, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_chain_legs = (ItemCustomArmour) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, - 2, "chain_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_chain_boots = (ItemCustomArmour) new ItemCustomArmour(design, "chain_boots", - ArmourDesign.CHAINMAIL, 3, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - dragonforged_scale_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "scale_helmet", - ArmourDesign.SCALEMAIL, 0, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_scale_chest = (ItemCustomArmour) new ItemCustomArmour(design, "scale_chest", - ArmourDesign.SCALEMAIL, 1, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_scale_legs = (ItemCustomArmour) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, - 2, "scale_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_scale_boots = (ItemCustomArmour) new ItemCustomArmour(design, "scale_boots", - ArmourDesign.SCALEMAIL, 3, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - dragonforged_splint_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "splint_helmet", - ArmourDesign.SPLINTMAIL, 0, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_splint_chest = (ItemCustomArmour) new ItemCustomArmour(design, "splint_chest", - ArmourDesign.SPLINTMAIL, 1, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_splint_legs = (ItemCustomArmour) new ItemCustomArmour(design, "splint_legs", - ArmourDesign.SPLINTMAIL, 2, "splint_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_splint_boots = (ItemCustomArmour) new ItemCustomArmour(design, "splint_boots", - ArmourDesign.SPLINTMAIL, 3, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - dragonforged_plate_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "plate_helmet", - ArmourDesign.FIELDPLATE, 0, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_plate_chest = (ItemCustomArmour) new ItemCustomArmour(design, "plate_chest", - ArmourDesign.FIELDPLATE, 1, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_plate_legs = (ItemCustomArmour) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, - 2, "plate_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - dragonforged_plate_boots = (ItemCustomArmour) new ItemCustomArmour(design, "plate_boots", - ArmourDesign.FIELDPLATE, 3, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - } - - public static void loadCrafting() { - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_dagger, dragonforged_dagger); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_sword, dragonforged_sword); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_mace, dragonforged_mace); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_waraxe, dragonforged_waraxe); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_spear, dragonforged_spear); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_katana, dragonforged_katana); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_greatsword, dragonforged_greatsword); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_warhammer, dragonforged_warhammer); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_battleaxe, dragonforged_battleaxe); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_halbeard, dragonforged_halbeard); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_lance, dragonforged_lance); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_bow, dragonforged_bow); - - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_pick, dragonforged_pick); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_axe, dragonforged_axe); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_spade, dragonforged_spade); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hoe, dragonforged_hoe); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_shears, dragonforged_shears); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hvypick, dragonforged_hvypick); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hvyshovel, dragonforged_hvyshovel); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_trow, dragonforged_trow); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_handpick, dragonforged_handpick); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_mattock, dragonforged_mattock); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_spade, dragonforged_spade); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_scythe, dragonforged_scythe); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_spanner, dragonforged_spanner); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_lumber, dragonforged_lumber); - - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hammer, dragonforged_hammer); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hvyhammer, dragonforged_hvyhammer); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_tongs, dragonforged_tongs); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_saw, dragonforged_saw); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_needle, dragonforged_needle); - SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_knife, dragonforged_knife); - - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_boots, dragonforged_chain_boots); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_legs, dragonforged_chain_legs); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_chest, dragonforged_chain_chest); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_helmet, dragonforged_chain_helmet); - - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_boots, dragonforged_scale_boots); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_legs, dragonforged_scale_legs); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_chest, dragonforged_scale_chest); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_helmet, dragonforged_scale_helmet); - - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_boots, dragonforged_splint_boots); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_legs, dragonforged_splint_legs); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_chest, dragonforged_splint_chest); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_helmet, dragonforged_splint_helmet); - - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_boots, dragonforged_plate_boots); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_legs, dragonforged_plate_legs); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_chest, dragonforged_plate_chest); - SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_helmet, dragonforged_plate_helmet); - } + public static ToolMaterial dragonforged = EnumHelper.addToolMaterial("dragonforged", 2, 250, 6.0F, 2.0F, 15); + + public static ItemWeaponMF dragonforged_sword, dragonforged_waraxe, dragonforged_mace, dragonforged_dagger, + dragonforged_spear; + public static ItemWeaponMF dragonforged_greatsword, dragonforged_battleaxe, dragonforged_warhammer, + dragonforged_katana, dragonforged_halbeard, dragonforged_lance; + public static ItemPickMF dragonforged_pick; + public static ItemAxeMF dragonforged_axe; + public static ItemSpadeMF dragonforged_spade; + public static ItemHoeMF dragonforged_hoe; + public static ItemHvyPick dragonforged_hvypick; + public static ItemHvyShovel dragonforged_hvyshovel; + public static ItemHandpick dragonforged_handpick; + public static ItemTrowMF dragonforged_trow; + public static ItemScythe dragonforged_scythe; + public static ItemMattock dragonforged_mattock; + public static ItemLumberAxe dragonforged_lumber; + + public static ItemHammer dragonforged_hammer, dragonforged_hvyhammer; + public static ItemTongs dragonforged_tongs; + public static ItemShearsMF dragonforged_shears; + public static ItemKnifeMF dragonforged_knife; + public static ItemNeedle dragonforged_needle; + public static ItemSaw dragonforged_saw; + public static ItemSpanner dragonforged_spanner; + + public static ItemBowMF dragonforged_bow; + + public static ItemCustomArmour dragonforged_scale_helmet, dragonforged_scale_chest, dragonforged_scale_legs, + dragonforged_scale_boots; + public static ItemCustomArmour dragonforged_chain_helmet, dragonforged_chain_chest, dragonforged_chain_legs, + dragonforged_chain_boots; + public static ItemCustomArmour dragonforged_splint_helmet, dragonforged_splint_chest, dragonforged_splint_legs, + dragonforged_splint_boots; + public static ItemCustomArmour dragonforged_plate_helmet, dragonforged_plate_chest, dragonforged_plate_legs, + dragonforged_plate_boots; + + public static void load() { + String design = "dragonforged"; + CreativeTabs tab = CreativeTabMF.tabDragonforged; + ToolMaterial mat = dragonforged; + float ratingMod = 1.2F; + + dragonforged_dagger = new ItemDagger(design + "_dagger", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_sword = new ItemSwordMF(design + "_sword", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_waraxe = new ItemWaraxeMF(design + "_waraxe", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_mace = new ItemMaceMF(design + "_mace", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_spear = new ItemSpearMF(design + "_spear", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_katana = new ItemKatanaMF(design + "_katana", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_greatsword = new ItemGreatswordMF(design + "_greatsword", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_battleaxe = new ItemBattleaxeMF(design + "_battleaxe", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_warhammer = new ItemWarhammerMF(design + "_warhammer", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_halbeard = new ItemHalbeardMF(design + "_halbeard", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + dragonforged_lance = new ItemLance(design + "_lance", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + + dragonforged_bow = (ItemBowMF) new ItemBowMF(design + "_bow", mat, EnumBowType.SHORTBOW, 1).setCustom(design) + .setCreativeTab(tab); + + // Tools + dragonforged_pick = (ItemPickMF) new ItemPickMF(design + "_pick", mat, 0).setCustom(design).setCreativeTab(tab); + dragonforged_axe = (ItemAxeMF) new ItemAxeMF(design + "_axe", mat, 0).setCustom(design).setCreativeTab(tab); + dragonforged_spade = (ItemSpadeMF) new ItemSpadeMF(design + "_spade", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_hoe = (ItemHoeMF) new ItemHoeMF(design + "_hoe", mat, 0).setCustom(design).setCreativeTab(tab); + + dragonforged_handpick = (ItemHandpick) new ItemHandpick(design + "_handpick", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_hvypick = (ItemHvyPick) new ItemHvyPick(design + "_hvypick", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_trow = (ItemTrowMF) new ItemTrowMF(design + "_trow", mat, 0).setCustom(design).setCreativeTab(tab); + dragonforged_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design + "_hvyshovel", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_scythe = (ItemScythe) new ItemScythe(design + "_scythe", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_mattock = (ItemMattock) new ItemMattock(design + "_mattock", mat, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_lumber = (ItemLumberAxe) new ItemLumberAxe(design + "_lumber", mat, 0).setCustom(design) + .setCreativeTab(tab); + + // Crafters + dragonforged_hammer = (ItemHammer) new ItemHammer(design + "_hammer", mat, false, 0, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_hvyhammer = (ItemHammer) new ItemHammer(design + "_hvyhammer", mat, true, 0, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_shears = (ItemShearsMF) new ItemShearsMF(design + "_shears", mat, 0, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_knife = (ItemKnifeMF) new ItemKnifeMF(design + "_knife", mat, 0, 1F, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_needle = (ItemNeedle) new ItemNeedle(design + "_needle", mat, 0, 0).setCustom(design) + .setCreativeTab(tab); + dragonforged_saw = (ItemSaw) new ItemSaw(design + "_saw", mat, 0, 0).setCustom(design).setCreativeTab(tab); + dragonforged_tongs = (ItemTongs) new ItemTongs(design + "_tongs", mat, 0).setCustom(design).setCreativeTab(tab); + dragonforged_spanner = (ItemSpanner) new ItemSpanner(design + "_spanner", 0, 0).setCustom(design) + .setCreativeTab(tab); + + dragonforged_chain_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "chain_helmet", + ArmourDesign.CHAINMAIL, 0, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_chain_chest = (ItemCustomArmour) new ItemCustomArmour(design, "chain_chest", + ArmourDesign.CHAINMAIL, 1, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_chain_legs = (ItemCustomArmour) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, + 2, "chain_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_chain_boots = (ItemCustomArmour) new ItemCustomArmour(design, "chain_boots", + ArmourDesign.CHAINMAIL, 3, "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + dragonforged_scale_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "scale_helmet", + ArmourDesign.SCALEMAIL, 0, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_scale_chest = (ItemCustomArmour) new ItemCustomArmour(design, "scale_chest", + ArmourDesign.SCALEMAIL, 1, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_scale_legs = (ItemCustomArmour) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, + 2, "scale_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_scale_boots = (ItemCustomArmour) new ItemCustomArmour(design, "scale_boots", + ArmourDesign.SCALEMAIL, 3, "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + dragonforged_splint_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "splint_helmet", + ArmourDesign.SPLINTMAIL, 0, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_splint_chest = (ItemCustomArmour) new ItemCustomArmour(design, "splint_chest", + ArmourDesign.SPLINTMAIL, 1, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_splint_legs = (ItemCustomArmour) new ItemCustomArmour(design, "splint_legs", + ArmourDesign.SPLINTMAIL, 2, "splint_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_splint_boots = (ItemCustomArmour) new ItemCustomArmour(design, "splint_boots", + ArmourDesign.SPLINTMAIL, 3, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + dragonforged_plate_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "plate_helmet", + ArmourDesign.FIELDPLATE, 0, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_plate_chest = (ItemCustomArmour) new ItemCustomArmour(design, "plate_chest", + ArmourDesign.FIELDPLATE, 1, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_plate_legs = (ItemCustomArmour) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, + 2, "plate_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + dragonforged_plate_boots = (ItemCustomArmour) new ItemCustomArmour(design, "plate_boots", + ArmourDesign.FIELDPLATE, 3, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + } + + public static void loadCrafting() { + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_dagger, dragonforged_dagger); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_sword, dragonforged_sword); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_mace, dragonforged_mace); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_waraxe, dragonforged_waraxe); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_spear, dragonforged_spear); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_katana, dragonforged_katana); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_greatsword, dragonforged_greatsword); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_warhammer, dragonforged_warhammer); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_battleaxe, dragonforged_battleaxe); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_halbeard, dragonforged_halbeard); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_lance, dragonforged_lance); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_bow, dragonforged_bow); + + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_pick, dragonforged_pick); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_axe, dragonforged_axe); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_spade, dragonforged_spade); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hoe, dragonforged_hoe); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_shears, dragonforged_shears); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hvypick, dragonforged_hvypick); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hvyshovel, dragonforged_hvyshovel); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_trow, dragonforged_trow); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_handpick, dragonforged_handpick); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_mattock, dragonforged_mattock); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_spade, dragonforged_spade); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_scythe, dragonforged_scythe); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_spanner, dragonforged_spanner); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_lumber, dragonforged_lumber); + + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hammer, dragonforged_hammer); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_hvyhammer, dragonforged_hvyhammer); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_tongs, dragonforged_tongs); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_saw, dragonforged_saw); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_needle, dragonforged_needle); + SpecialForging.addDragonforgeCraft(CustomToolListMF.standard_knife, dragonforged_knife); + + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_boots, dragonforged_chain_boots); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_legs, dragonforged_chain_legs); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_chest, dragonforged_chain_chest); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_chain_helmet, dragonforged_chain_helmet); + + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_boots, dragonforged_scale_boots); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_legs, dragonforged_scale_legs); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_chest, dragonforged_scale_chest); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_scale_helmet, dragonforged_scale_helmet); + + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_boots, dragonforged_splint_boots); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_legs, dragonforged_splint_legs); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_chest, dragonforged_splint_chest); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_splint_helmet, dragonforged_splint_helmet); + + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_boots, dragonforged_plate_boots); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_legs, dragonforged_plate_legs); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_chest, dragonforged_plate_chest); + SpecialForging.addDragonforgeCraft(CustomArmourListMF.standard_plate_helmet, dragonforged_plate_helmet); + } } diff --git a/src/main/java/minefantasy/mf2/item/list/styles/OrnateStyle.java b/src/main/java/minefantasy/mf2/item/list/styles/OrnateStyle.java index 6e7397ea..c1eeb9af 100644 --- a/src/main/java/minefantasy/mf2/item/list/styles/OrnateStyle.java +++ b/src/main/java/minefantasy/mf2/item/list/styles/OrnateStyle.java @@ -8,230 +8,204 @@ import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.CustomArmourListMF; import minefantasy.mf2.item.list.CustomToolListMF; -import minefantasy.mf2.item.tool.ItemAxeMF; -import minefantasy.mf2.item.tool.ItemHoeMF; -import minefantasy.mf2.item.tool.ItemPickMF; -import minefantasy.mf2.item.tool.ItemShearsMF; -import minefantasy.mf2.item.tool.ItemSpadeMF; -import minefantasy.mf2.item.tool.advanced.ItemHandpick; -import minefantasy.mf2.item.tool.advanced.ItemHvyPick; -import minefantasy.mf2.item.tool.advanced.ItemHvyShovel; -import minefantasy.mf2.item.tool.advanced.ItemLumberAxe; -import minefantasy.mf2.item.tool.advanced.ItemMattock; -import minefantasy.mf2.item.tool.advanced.ItemScythe; -import minefantasy.mf2.item.tool.advanced.ItemTrowMF; -import minefantasy.mf2.item.tool.crafting.ItemHammer; -import minefantasy.mf2.item.tool.crafting.ItemKnifeMF; -import minefantasy.mf2.item.tool.crafting.ItemNeedle; -import minefantasy.mf2.item.tool.crafting.ItemSaw; -import minefantasy.mf2.item.tool.crafting.ItemSpanner; -import minefantasy.mf2.item.tool.crafting.ItemTongs; -import minefantasy.mf2.item.weapon.ItemBattleaxeMF; -import minefantasy.mf2.item.weapon.ItemDagger; -import minefantasy.mf2.item.weapon.ItemGreatswordMF; -import minefantasy.mf2.item.weapon.ItemHalbeardMF; -import minefantasy.mf2.item.weapon.ItemKatanaMF; -import minefantasy.mf2.item.weapon.ItemLance; -import minefantasy.mf2.item.weapon.ItemMaceMF; -import minefantasy.mf2.item.weapon.ItemSpearMF; -import minefantasy.mf2.item.weapon.ItemSwordMF; -import minefantasy.mf2.item.weapon.ItemWaraxeMF; -import minefantasy.mf2.item.weapon.ItemWarhammerMF; -import minefantasy.mf2.item.weapon.ItemWeaponMF; +import minefantasy.mf2.item.tool.*; +import minefantasy.mf2.item.tool.advanced.*; +import minefantasy.mf2.item.tool.crafting.*; +import minefantasy.mf2.item.weapon.*; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item.ToolMaterial; import net.minecraftforge.common.util.EnumHelper; public class OrnateStyle { - public static ToolMaterial ornate = EnumHelper.addToolMaterial("ornate", 2, 250, 6.0F, 2.0F, 100); - - public static ItemWeaponMF ornate_sword, ornate_waraxe, ornate_mace, ornate_dagger, ornate_spear; - public static ItemWeaponMF ornate_greatsword, ornate_battleaxe, ornate_warhammer, ornate_katana, ornate_halbeard, - ornate_lance; - public static ItemPickMF ornate_pick; - public static ItemAxeMF ornate_axe; - public static ItemSpadeMF ornate_spade; - public static ItemHoeMF ornate_hoe; - public static ItemHvyPick ornate_hvypick; - public static ItemHvyShovel ornate_hvyshovel; - public static ItemHandpick ornate_handpick; - public static ItemTrowMF ornate_trow; - public static ItemScythe ornate_scythe; - public static ItemMattock ornate_mattock; - public static ItemLumberAxe ornate_lumber; - - public static ItemHammer ornate_hammer, ornate_hvyhammer; - public static ItemTongs ornate_tongs; - public static ItemShearsMF ornate_shears; - public static ItemKnifeMF ornate_knife; - public static ItemNeedle ornate_needle; - public static ItemSaw ornate_saw; - public static ItemSpanner ornate_spanner; - - public static ItemBowMF ornate_bow; - - public static ItemCustomArmour ornate_scale_helmet, ornate_scale_chest, ornate_scale_legs, ornate_scale_boots; - public static ItemCustomArmour ornate_chain_helmet, ornate_chain_chest, ornate_chain_legs, ornate_chain_boots; - public static ItemCustomArmour ornate_splint_helmet, ornate_splint_chest, ornate_splint_legs, ornate_splint_boots; - public static ItemCustomArmour ornate_plate_helmet, ornate_plate_chest, ornate_plate_legs, ornate_plate_boots; - - public static void load() { - String design = "ornate"; - CreativeTabs tab = CreativeTabMF.tabOrnate; - ToolMaterial mat = ornate; - float ratingMod = 0.8F; - - ornate_dagger = new ItemDagger(design + "_dagger", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(-1); - ornate_sword = new ItemSwordMF(design + "_sword", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(-1); - ornate_waraxe = new ItemWaraxeMF(design + "_waraxe", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(-1); - ornate_mace = new ItemMaceMF(design + "_mace", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - ornate_spear = new ItemSpearMF(design + "_spear", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(-1); - ornate_katana = new ItemKatanaMF(design + "_katana", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(-1); - ornate_greatsword = new ItemGreatswordMF(design + "_greatsword", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(-1); - ornate_battleaxe = new ItemBattleaxeMF(design + "_battleaxe", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(-1); - ornate_warhammer = new ItemWarhammerMF(design + "_warhammer", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(-1); - ornate_halbeard = new ItemHalbeardMF(design + "_halbeard", mat, 0, 1F).setCustom(design).setTab(tab) - .modifyBaseDamage(-1); - ornate_lance = new ItemLance(design + "_lance", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); - - ornate_bow = (ItemBowMF) new ItemBowMF(design + "_bow", mat, EnumBowType.SHORTBOW, 1).setCustom(design) - .setCreativeTab(tab); - - // Tools - ornate_pick = (ItemPickMF) new ItemPickMF(design + "_pick", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_axe = (ItemAxeMF) new ItemAxeMF(design + "_axe", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_spade = (ItemSpadeMF) new ItemSpadeMF(design + "_spade", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_hoe = (ItemHoeMF) new ItemHoeMF(design + "_hoe", mat, 0).setCustom(design).setCreativeTab(tab); - - ornate_handpick = (ItemHandpick) new ItemHandpick(design + "_handpick", mat, 0).setCustom(design) - .setCreativeTab(tab); - ornate_hvypick = (ItemHvyPick) new ItemHvyPick(design + "_hvypick", mat, 0).setCustom(design) - .setCreativeTab(tab); - ornate_trow = (ItemTrowMF) new ItemTrowMF(design + "_trow", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design + "_hvyshovel", mat, 0).setCustom(design) - .setCreativeTab(tab); - ornate_scythe = (ItemScythe) new ItemScythe(design + "_scythe", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_mattock = (ItemMattock) new ItemMattock(design + "_mattock", mat, 0).setCustom(design) - .setCreativeTab(tab); - ornate_lumber = (ItemLumberAxe) new ItemLumberAxe(design + "_lumber", mat, 0).setCustom(design) - .setCreativeTab(tab); - - // Crafters - ornate_hammer = (ItemHammer) new ItemHammer(design + "_hammer", mat, false, 0, 0).setCustom(design) - .setCreativeTab(tab); - ornate_hvyhammer = (ItemHammer) new ItemHammer(design + "_hvyhammer", mat, true, 0, 0).setCustom(design) - .setCreativeTab(tab); - ornate_shears = (ItemShearsMF) new ItemShearsMF(design + "_shears", mat, 0, 0).setCustom(design) - .setCreativeTab(tab); - ornate_knife = (ItemKnifeMF) new ItemKnifeMF(design + "_knife", mat, 0, 1F, 0).setCustom(design) - .setCreativeTab(tab); - ornate_needle = (ItemNeedle) new ItemNeedle(design + "_needle", mat, 0, 0).setCustom(design) - .setCreativeTab(tab); - ornate_saw = (ItemSaw) new ItemSaw(design + "_saw", mat, 0, 0).setCustom(design).setCreativeTab(tab); - ornate_tongs = (ItemTongs) new ItemTongs(design + "_tongs", mat, 0).setCustom(design).setCreativeTab(tab); - ornate_spanner = (ItemSpanner) new ItemSpanner(design + "_spanner", 0, 0).setCustom(design).setCreativeTab(tab); - - ornate_chain_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "chain_helmet", ArmourDesign.CHAINMAIL, 0, - "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_chain_chest = (ItemCustomArmour) new ItemCustomArmour(design, "chain_chest", ArmourDesign.CHAINMAIL, 1, - "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_chain_legs = (ItemCustomArmour) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, 2, - "chain_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_chain_boots = (ItemCustomArmour) new ItemCustomArmour(design, "chain_boots", ArmourDesign.CHAINMAIL, 3, - "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - ornate_scale_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "scale_helmet", ArmourDesign.SCALEMAIL, 0, - "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_scale_chest = (ItemCustomArmour) new ItemCustomArmour(design, "scale_chest", ArmourDesign.SCALEMAIL, 1, - "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_scale_legs = (ItemCustomArmour) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, 2, - "scale_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_scale_boots = (ItemCustomArmour) new ItemCustomArmour(design, "scale_boots", ArmourDesign.SCALEMAIL, 3, - "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - ornate_splint_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "splint_helmet", ArmourDesign.SPLINTMAIL, - 0, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_splint_chest = (ItemCustomArmour) new ItemCustomArmour(design, "splint_chest", ArmourDesign.SPLINTMAIL, - 1, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_splint_legs = (ItemCustomArmour) new ItemCustomArmour(design, "splint_legs", ArmourDesign.SPLINTMAIL, 2, - "splint_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_splint_boots = (ItemCustomArmour) new ItemCustomArmour(design, "splint_boots", ArmourDesign.SPLINTMAIL, - 3, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - - ornate_plate_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "plate_helmet", ArmourDesign.FIELDPLATE, - 0, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_plate_chest = (ItemCustomArmour) new ItemCustomArmour(design, "plate_chest", ArmourDesign.FIELDPLATE, 1, - "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_plate_legs = (ItemCustomArmour) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, 2, - "plate_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); - ornate_plate_boots = (ItemCustomArmour) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, - "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); - } - - public static void loadCrafting() { - String id = "ornate"; - - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_dagger, ornate_dagger); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_sword, ornate_sword); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_mace, ornate_mace); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_waraxe, ornate_waraxe); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_spear, ornate_spear); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_katana, ornate_katana); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_greatsword, ornate_greatsword); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_warhammer, ornate_warhammer); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_battleaxe, ornate_battleaxe); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_halbeard, ornate_halbeard); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_lance, ornate_lance); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_bow, ornate_bow); - - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_pick, ornate_pick); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_axe, ornate_axe); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_spade, ornate_spade); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hoe, ornate_hoe); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_shears, ornate_shears); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hvypick, ornate_hvypick); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hvyshovel, ornate_hvyshovel); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_trow, ornate_trow); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_handpick, ornate_handpick); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_mattock, ornate_mattock); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_spade, ornate_spade); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_scythe, ornate_scythe); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_spanner, ornate_spanner); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_lumber, ornate_lumber); - - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hammer, ornate_hammer); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hvyhammer, ornate_hvyhammer); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_tongs, ornate_tongs); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_saw, ornate_saw); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_needle, ornate_needle); - SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_knife, ornate_knife); - - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_boots, ornate_chain_boots); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_legs, ornate_chain_legs); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_chest, ornate_chain_chest); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_helmet, ornate_chain_helmet); - - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_boots, ornate_scale_boots); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_legs, ornate_scale_legs); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_chest, ornate_scale_chest); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_helmet, ornate_scale_helmet); - - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_boots, ornate_splint_boots); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_legs, ornate_splint_legs); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_chest, ornate_splint_chest); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_helmet, ornate_splint_helmet); - - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_boots, ornate_plate_boots); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_legs, ornate_plate_legs); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_chest, ornate_plate_chest); - SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_helmet, ornate_plate_helmet); - } + public static ToolMaterial ornate = EnumHelper.addToolMaterial("ornate", 2, 250, 6.0F, 2.0F, 100); + + public static ItemWeaponMF ornate_sword, ornate_waraxe, ornate_mace, ornate_dagger, ornate_spear; + public static ItemWeaponMF ornate_greatsword, ornate_battleaxe, ornate_warhammer, ornate_katana, ornate_halbeard, + ornate_lance; + public static ItemPickMF ornate_pick; + public static ItemAxeMF ornate_axe; + public static ItemSpadeMF ornate_spade; + public static ItemHoeMF ornate_hoe; + public static ItemHvyPick ornate_hvypick; + public static ItemHvyShovel ornate_hvyshovel; + public static ItemHandpick ornate_handpick; + public static ItemTrowMF ornate_trow; + public static ItemScythe ornate_scythe; + public static ItemMattock ornate_mattock; + public static ItemLumberAxe ornate_lumber; + + public static ItemHammer ornate_hammer, ornate_hvyhammer; + public static ItemTongs ornate_tongs; + public static ItemShearsMF ornate_shears; + public static ItemKnifeMF ornate_knife; + public static ItemNeedle ornate_needle; + public static ItemSaw ornate_saw; + public static ItemSpanner ornate_spanner; + + public static ItemBowMF ornate_bow; + + public static ItemCustomArmour ornate_scale_helmet, ornate_scale_chest, ornate_scale_legs, ornate_scale_boots; + public static ItemCustomArmour ornate_chain_helmet, ornate_chain_chest, ornate_chain_legs, ornate_chain_boots; + public static ItemCustomArmour ornate_splint_helmet, ornate_splint_chest, ornate_splint_legs, ornate_splint_boots; + public static ItemCustomArmour ornate_plate_helmet, ornate_plate_chest, ornate_plate_legs, ornate_plate_boots; + + public static void load() { + String design = "ornate"; + CreativeTabs tab = CreativeTabMF.tabOrnate; + ToolMaterial mat = ornate; + float ratingMod = 0.8F; + + ornate_dagger = new ItemDagger(design + "_dagger", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_sword = new ItemSwordMF(design + "_sword", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_waraxe = new ItemWaraxeMF(design + "_waraxe", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_mace = new ItemMaceMF(design + "_mace", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); + ornate_spear = new ItemSpearMF(design + "_spear", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_katana = new ItemKatanaMF(design + "_katana", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_greatsword = new ItemGreatswordMF(design + "_greatsword", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_battleaxe = new ItemBattleaxeMF(design + "_battleaxe", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_warhammer = new ItemWarhammerMF(design + "_warhammer", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_halbeard = new ItemHalbeardMF(design + "_halbeard", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(-1); + ornate_lance = new ItemLance(design + "_lance", mat, 0, 1F).setCustom(design).setTab(tab).modifyBaseDamage(-1); + + ornate_bow = (ItemBowMF) new ItemBowMF(design + "_bow", mat, EnumBowType.SHORTBOW, 1).setCustom(design) + .setCreativeTab(tab); + + // Tools + ornate_pick = (ItemPickMF) new ItemPickMF(design + "_pick", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_axe = (ItemAxeMF) new ItemAxeMF(design + "_axe", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_spade = (ItemSpadeMF) new ItemSpadeMF(design + "_spade", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_hoe = (ItemHoeMF) new ItemHoeMF(design + "_hoe", mat, 0).setCustom(design).setCreativeTab(tab); + + ornate_handpick = (ItemHandpick) new ItemHandpick(design + "_handpick", mat, 0).setCustom(design) + .setCreativeTab(tab); + ornate_hvypick = (ItemHvyPick) new ItemHvyPick(design + "_hvypick", mat, 0).setCustom(design) + .setCreativeTab(tab); + ornate_trow = (ItemTrowMF) new ItemTrowMF(design + "_trow", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_hvyshovel = (ItemHvyShovel) new ItemHvyShovel(design + "_hvyshovel", mat, 0).setCustom(design) + .setCreativeTab(tab); + ornate_scythe = (ItemScythe) new ItemScythe(design + "_scythe", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_mattock = (ItemMattock) new ItemMattock(design + "_mattock", mat, 0).setCustom(design) + .setCreativeTab(tab); + ornate_lumber = (ItemLumberAxe) new ItemLumberAxe(design + "_lumber", mat, 0).setCustom(design) + .setCreativeTab(tab); + + // Crafters + ornate_hammer = (ItemHammer) new ItemHammer(design + "_hammer", mat, false, 0, 0).setCustom(design) + .setCreativeTab(tab); + ornate_hvyhammer = (ItemHammer) new ItemHammer(design + "_hvyhammer", mat, true, 0, 0).setCustom(design) + .setCreativeTab(tab); + ornate_shears = (ItemShearsMF) new ItemShearsMF(design + "_shears", mat, 0, 0).setCustom(design) + .setCreativeTab(tab); + ornate_knife = (ItemKnifeMF) new ItemKnifeMF(design + "_knife", mat, 0, 1F, 0).setCustom(design) + .setCreativeTab(tab); + ornate_needle = (ItemNeedle) new ItemNeedle(design + "_needle", mat, 0, 0).setCustom(design) + .setCreativeTab(tab); + ornate_saw = (ItemSaw) new ItemSaw(design + "_saw", mat, 0, 0).setCustom(design).setCreativeTab(tab); + ornate_tongs = (ItemTongs) new ItemTongs(design + "_tongs", mat, 0).setCustom(design).setCreativeTab(tab); + ornate_spanner = (ItemSpanner) new ItemSpanner(design + "_spanner", 0, 0).setCustom(design).setCreativeTab(tab); + + ornate_chain_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "chain_helmet", ArmourDesign.CHAINMAIL, 0, + "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_chain_chest = (ItemCustomArmour) new ItemCustomArmour(design, "chain_chest", ArmourDesign.CHAINMAIL, 1, + "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_chain_legs = (ItemCustomArmour) new ItemCustomArmour(design, "chain_legs", ArmourDesign.CHAINMAIL, 2, + "chain_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_chain_boots = (ItemCustomArmour) new ItemCustomArmour(design, "chain_boots", ArmourDesign.CHAINMAIL, 3, + "chain_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + ornate_scale_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "scale_helmet", ArmourDesign.SCALEMAIL, 0, + "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_scale_chest = (ItemCustomArmour) new ItemCustomArmour(design, "scale_chest", ArmourDesign.SCALEMAIL, 1, + "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_scale_legs = (ItemCustomArmour) new ItemCustomArmour(design, "scale_legs", ArmourDesign.SCALEMAIL, 2, + "scale_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_scale_boots = (ItemCustomArmour) new ItemCustomArmour(design, "scale_boots", ArmourDesign.SCALEMAIL, 3, + "scale_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + ornate_splint_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "splint_helmet", ArmourDesign.SPLINTMAIL, + 0, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_splint_chest = (ItemCustomArmour) new ItemCustomArmour(design, "splint_chest", ArmourDesign.SPLINTMAIL, + 1, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_splint_legs = (ItemCustomArmour) new ItemCustomArmour(design, "splint_legs", ArmourDesign.SPLINTMAIL, 2, + "splint_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_splint_boots = (ItemCustomArmour) new ItemCustomArmour(design, "splint_boots", ArmourDesign.SPLINTMAIL, + 3, "splint_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + + ornate_plate_helmet = (ItemCustomArmour) new ItemCustomArmour(design, "plate_helmet", ArmourDesign.FIELDPLATE, + 0, "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_plate_chest = (ItemCustomArmour) new ItemCustomArmour(design, "plate_chest", ArmourDesign.FIELDPLATE, 1, + "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_plate_legs = (ItemCustomArmour) new ItemCustomArmour(design, "plate_legs", ArmourDesign.FIELDPLATE, 2, + "plate_layer_2", 0).modifyRating(ratingMod).setCreativeTab(tab); + ornate_plate_boots = (ItemCustomArmour) new ItemCustomArmour(design, "plate_boots", ArmourDesign.FIELDPLATE, 3, + "plate_layer_1", 0).modifyRating(ratingMod).setCreativeTab(tab); + } + + public static void loadCrafting() { + String id = "ornate"; + + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_dagger, ornate_dagger); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_sword, ornate_sword); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_mace, ornate_mace); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_waraxe, ornate_waraxe); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_spear, ornate_spear); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_katana, ornate_katana); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_greatsword, ornate_greatsword); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_warhammer, ornate_warhammer); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_battleaxe, ornate_battleaxe); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_halbeard, ornate_halbeard); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_lance, ornate_lance); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_bow, ornate_bow); + + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_pick, ornate_pick); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_axe, ornate_axe); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_spade, ornate_spade); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hoe, ornate_hoe); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_shears, ornate_shears); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hvypick, ornate_hvypick); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hvyshovel, ornate_hvyshovel); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_trow, ornate_trow); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_handpick, ornate_handpick); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_mattock, ornate_mattock); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_spade, ornate_spade); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_scythe, ornate_scythe); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_spanner, ornate_spanner); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_lumber, ornate_lumber); + + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hammer, ornate_hammer); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_hvyhammer, ornate_hvyhammer); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_tongs, ornate_tongs); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_saw, ornate_saw); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_needle, ornate_needle); + SpecialForging.addSpecialCraft(id, CustomToolListMF.standard_knife, ornate_knife); + + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_boots, ornate_chain_boots); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_legs, ornate_chain_legs); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_chest, ornate_chain_chest); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_chain_helmet, ornate_chain_helmet); + + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_boots, ornate_scale_boots); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_legs, ornate_scale_legs); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_chest, ornate_scale_chest); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_scale_helmet, ornate_scale_helmet); + + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_boots, ornate_splint_boots); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_legs, ornate_splint_legs); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_chest, ornate_splint_chest); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_splint_helmet, ornate_splint_helmet); + + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_boots, ornate_plate_boots); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_legs, ornate_plate_legs); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_chest, ornate_plate_chest); + SpecialForging.addSpecialCraft(id, CustomArmourListMF.standard_plate_helmet, ornate_plate_helmet); + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemAxeMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemAxeMF.java index 9d6156e2..04b26b23 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemAxeMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemAxeMF.java @@ -1,12 +1,7 @@ package minefantasy.mf2.item.tool; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,179 +23,179 @@ import net.minecraft.util.IIcon; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemAxeMF extends ItemAxe implements IToolMaterial { - private String name; - private float baseDamage = 3F; - - public ItemAxeMF(String name, ToolMaterial material, int rarity) { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name = name; - setTextureName("minefantasy2:Tool/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemAxeMF setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - canRepair = false; - return this; - } - - public ItemAxeMF setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemAxeMF setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); - } - - public float func_150893_a(ItemStack stack, Block block) { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private String name; + private float baseDamage = 3F; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemAxeMF(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + public ItemAxeMF setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + canRepair = false; + return this; + } + + public ItemAxeMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemAxeMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemHoeMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemHoeMF.java index 8bddc8de..03a0aea5 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemHoeMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemHoeMF.java @@ -1,9 +1,5 @@ package minefantasy.mf2.item.tool; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -21,144 +17,144 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemHoeMF extends ItemHoe implements IToolMaterial { - private String name; - private ToolMaterial toolMaterial; - - public ItemHoeMF(String name, ToolMaterial material, int rarity) { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name = name; - this.toolMaterial = material; - setTextureName("minefantasy2:Tool/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemHoeMF setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemHoeMF setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - public float getEfficiency(ItemStack stack) { - return CustomToolHelper.getEfficiency(stack, 1.0F, efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private String name; + private ToolMaterial toolMaterial; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemHoeMF(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + this.toolMaterial = material; + setTextureName("minefantasy2:Tool/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + public ItemHoeMF setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemHoeMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + public float getEfficiency(ItemStack stack) { + return CustomToolHelper.getEfficiency(stack, 1.0F, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemLighterMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemLighterMF.java index 4935b646..ec590a3a 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemLighterMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemLighterMF.java @@ -12,84 +12,84 @@ import net.minecraft.world.World; public class ItemLighterMF extends Item implements ILighter { - private float chance; + private float chance; - public ItemLighterMF(String name, float chance, int uses) { - setTextureName("minefantasy2:Tool/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - setMaxDamage(uses); - this.chance = chance; - this.setMaxStackSize(1); - this.setCreativeTab(CreativeTabMF.tabGadget); - } + public ItemLighterMF(String name, float chance, int uses) { + setTextureName("minefantasy2:Tool/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + setMaxDamage(uses); + this.chance = chance; + this.setMaxStackSize(1); + this.setCreativeTab(CreativeTabMF.tabGadget); + } - @Override - public boolean canLight() { - return true; - } + // 0 for N/A -1 for fail, 1 for succeed + public static int tryUse(ItemStack held, EntityPlayer user) { + if (held == null) + return 0; - @Override - public double getChance() { - return chance; - } + if (held.getItem() instanceof ItemFlintAndSteel) { + return 1; + } + if (held.getItem() instanceof ILighter) { + ILighter lighter = (ILighter) held.getItem(); + return (lighter.canLight() && user.getRNG().nextFloat() < lighter.getChance()) ? 1 : -1; + } + return 0; + } - // 0 for N/A -1 for fail, 1 for succeed - public static int tryUse(ItemStack held, EntityPlayer user) { - if (held == null) - return 0; + @Override + public boolean canLight() { + return true; + } - if (held.getItem() instanceof ItemFlintAndSteel) { - return 1; - } - if (held.getItem() instanceof ILighter) { - ILighter lighter = (ILighter) held.getItem(); - return (lighter.canLight() && user.getRNG().nextFloat() < lighter.getChance()) ? 1 : -1; - } - return 0; - } + @Override + public double getChance() { + return chance; + } - public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int face, float xo, - float yo, float zo) { - if (face == 0) { - --y; - } + public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int face, float xo, + float yo, float zo) { + if (face == 0) { + --y; + } - if (face == 1) { - ++y; - } + if (face == 1) { + ++y; + } - if (face == 2) { - --z; - } + if (face == 2) { + --z; + } - if (face == 3) { - ++z; - } + if (face == 3) { + ++z; + } - if (face == 4) { - --x; - } + if (face == 4) { + --x; + } - if (face == 5) { - ++x; - } + if (face == 5) { + ++x; + } - if (!user.canPlayerEdit(x, y, z, face, item)) { - return false; - } else { - boolean success = user.getRNG().nextFloat() < chance; - if (world.isAirBlock(x, y, z)) { - world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "fire.ignite", 1.0F, - itemRand.nextFloat() * 0.4F + 0.8F); - if (success) { - world.setBlock(x, y, z, Blocks.fire); - } - } - if (success) { - item.damageItem(1, user); - } - return true; - } - } + if (!user.canPlayerEdit(x, y, z, face, item)) { + return false; + } else { + boolean success = user.getRNG().nextFloat() < chance; + if (world.isAirBlock(x, y, z)) { + world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "fire.ignite", 1.0F, + itemRand.nextFloat() * 0.4F + 0.8F); + if (success) { + world.setBlock(x, y, z, Blocks.fire); + } + } + if (success) { + item.damageItem(1, user); + } + return true; + } + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemPickMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemPickMF.java index a1803b15..b4766a11 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemPickMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemPickMF.java @@ -1,12 +1,7 @@ package minefantasy.mf2.item.tool; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,232 +21,228 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.StatCollector; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemPickMF extends ItemPickaxe implements IToolMaterial { - private String name; - private float baseDamage = 2F; - - public ItemPickMF(String name, ToolMaterial material, int rarity) { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name = name; - - setTextureName("minefantasy2:Tool/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { - if (!world.isRemote) - return item; - - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - - if (movingobjectposition == null) { - return item; - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (!world.canMineBlock(player, i, j, k)) { - return item; - } - - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { - return item; - } - - Block block = world.getBlock(i, j, k); - int blockTier = block.getHarvestLevel(world.getBlockMetadata(i, j, k)); - - int HL = CustomToolHelper.getHarvestLevel(item, toolMaterial.getHarvestLevel()); - if (blockTier > HL) { - String msg = StatCollector.translateToLocalFormatted("prospect.cannotmine", HL, blockTier); - player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + msg)); - } else { - String msg = StatCollector.translateToLocalFormatted("prospect.canmine", HL, blockTier); - player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + msg)); - } - } - - return item; - } - } - - private boolean canMineBlock(World world, int i, int j, int k) { - // TODO Auto-generated method stub - return false; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemPickMF setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemPickMF setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemPickMF setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); - } - - public float func_150893_a(ItemStack stack, Block block) { - return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil - && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private String name; + private float baseDamage = 2F; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemPickMF(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + + setTextureName("minefantasy2:Tool/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + if (!world.isRemote) + return item; + + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + + if (movingobjectposition == null) { + return item; + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) { + return item; + } + + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return item; + } + + Block block = world.getBlock(i, j, k); + int blockTier = block.getHarvestLevel(world.getBlockMetadata(i, j, k)); + + int HL = CustomToolHelper.getHarvestLevel(item, toolMaterial.getHarvestLevel()); + if (blockTier > HL) { + String msg = StatCollector.translateToLocalFormatted("prospect.cannotmine", HL, blockTier); + player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + msg)); + } else { + String msg = StatCollector.translateToLocalFormatted("prospect.canmine", HL, blockTier); + player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + msg)); + } + } + + return item; + } + } + + private boolean canMineBlock(World world, int i, int j, int k) { + // TODO Auto-generated method stub + return false; + } + + public ItemPickMF setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemPickMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemPickMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + public float func_150893_a(ItemStack stack, Block block) { + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil + && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemShearsMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemShearsMF.java index cf298d17..8383aed5 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemShearsMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemShearsMF.java @@ -1,9 +1,5 @@ package minefantasy.mf2.item.tool; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -22,151 +18,151 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemShearsMF extends ItemShears implements IToolMaterial, IToolMF { - private ToolMaterial toolMaterial; - private int tier; - private String name; - - public ItemShearsMF(String name, ToolMaterial material, int rarity, int tier) { - super(); - this.name = name; - this.tier = tier; - itemRarity = rarity; - toolMaterial = material; - setCreativeTab(CreativeTabMF.tabOldTools); - this.setMaxDamage(material.getMaxUses()); - setTextureName("minefantasy2:Tool/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemShearsMF setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemShearsMF setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass > 0 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - public float getEfficiency(ItemStack item) { - return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); - } - - @Override - public int getTier(ItemStack item) { - return CustomToolHelper.getCrafterTier(item, tier); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - - // ====================================================== CUSTOM END - // ==============================================================\\ - @Override - public String getToolType(ItemStack item) { - return "shears"; - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } + protected int itemRarity; + private ToolMaterial toolMaterial; + private int tier; + private String name; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + + public ItemShearsMF(String name, ToolMaterial material, int rarity, int tier) { + super(); + this.name = name; + this.tier = tier; + itemRarity = rarity; + toolMaterial = material; + setCreativeTab(CreativeTabMF.tabOldTools); + this.setMaxDamage(material.getMaxUses()); + setTextureName("minefantasy2:Tool/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + public ItemShearsMF setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemShearsMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass > 0 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + public float getEfficiency(ItemStack item) { + return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); + } + + @Override + public int getTier(ItemStack item) { + return CustomToolHelper.getCrafterTier(item, tier); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + // ====================================================== CUSTOM END + // ==============================================================\\ + @Override + public String getToolType(ItemStack item) { + return "shears"; + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/ItemSpadeMF.java b/src/main/java/minefantasy/mf2/item/tool/ItemSpadeMF.java index 6709651a..5abbd32a 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ItemSpadeMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ItemSpadeMF.java @@ -1,12 +1,7 @@ package minefantasy.mf2.item.tool; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,178 +23,178 @@ import net.minecraft.util.IIcon; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemSpadeMF extends ItemSpade implements IToolMaterial { - private String name; - private float baseDamage = 1F; - - public ItemSpadeMF(String name, ToolMaterial material, int rarity) { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name = name; - setTextureName("minefantasy2:Tool/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemSpadeMF setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemSpadeMF setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemSpadeMF setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); - } - - public float func_150893_a(ItemStack stack, Block block) { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private String name; + private float baseDamage = 1F; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemSpadeMF(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + public ItemSpadeMF setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemSpadeMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemSpadeMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java b/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java index cc794006..567d8b50 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java @@ -4,20 +4,20 @@ import net.minecraft.item.Item.ToolMaterial; public class ToolMaterialMF { - /* + /* * WOOD(0, 59, 2.0F, 0, 15), STONE(1, 131, 4.0F, 1, 5), IRON(2, 250, 6.0F, 2, * 14), EMERALD(3, 1561, 8.0F, 3, 10), GOLD(0, 32, 12.0F, 0, 22); */ - // public static EnumToolMaterial STEEL = EnumHelper.addToolMaterial("STEEL", 2, - // 1000, 7.8F, 2.5F, 22); + // public static EnumToolMaterial STEEL = EnumHelper.addToolMaterial("STEEL", 2, + // 1000, 7.8F, 2.5F, 22); - // Misc + // Misc - // Basics stage1 + // Basics stage1 - public static boolean isUnbreakable(ToolMaterial toolMaterial) { - return toolMaterial == BaseMaterialMF.enderforge.getToolConversion() - || toolMaterial == BaseMaterialMF.ignotumite.getToolConversion() - || toolMaterial == BaseMaterialMF.mithium.getToolConversion(); - } + public static boolean isUnbreakable(ToolMaterial toolMaterial) { + return toolMaterial == BaseMaterialMF.enderforge.getToolConversion() + || toolMaterial == BaseMaterialMF.ignotumite.getToolConversion() + || toolMaterial == BaseMaterialMF.mithium.getToolConversion(); + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHandpick.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHandpick.java index 5e2cdb0b..6503bc27 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHandpick.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHandpick.java @@ -1,13 +1,7 @@ package minefantasy.mf2.item.tool.advanced; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,261 +22,258 @@ import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemPickaxe; -import net.minecraft.item.ItemStack; +import net.minecraft.item.*; import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemHandpick extends ItemPickaxe implements IToolMaterial { - private String name; - private float baseDamage = 1F; - private Random rand = new Random(); - - public ItemHandpick(String name, ToolMaterial material, int rarity) { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name = name; - setTextureName("minefantasy2:Tool/Advanced/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - setMaxDamage(material.getMaxUses()); - } - - @Override - public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, - EntityLivingBase user) { - boolean silk = EnchantmentHelper.getSilkTouchModifier(user); - int m = world.getBlockMetadata(x, y, z); - ArrayList drops = block.getDrops(world, x, y, z, 0, m); - - if (!silk && drops != null && !drops.isEmpty()) { - Iterator list = drops.iterator(); - while (list.hasNext()) { - ItemStack drop = list.next(); - if (isOre(block, m) && !drop.isItemEqual(new ItemStack(block, 1, m)) - && !(drop.getItem() instanceof ItemBlock) && rand.nextFloat() < getDoubleDropChance()) { - dropItem(world, x, y, z, drop.copy()); - } - } - } - - if (!world.isRemote) { - int meta = world.getBlockMetadata(x, y, z); - int harvestlvl = this.getMaterial().getHarvestLevel(); - int fortune = EnchantmentHelper.getFortuneModifier(user); - - ArrayList specialdrops = RandomOre.getDroppedItems(user, block, meta, harvestlvl, fortune, silk, - y); - - if (specialdrops != null && !specialdrops.isEmpty()) { - Iterator list = specialdrops.iterator(); - - while (list.hasNext()) { - ItemStack newdrop = (ItemStack) list.next(); - - if (newdrop != null) { - if (newdrop.stackSize < 1) - newdrop.stackSize = 1; - - dropItem(world, x, y, z, newdrop); - } - } - } - } - return super.onBlockDestroyed(item, world, block, x, y, z, user); - } - - private boolean isOre(Block block, int meta) { - if (!block.isToolEffective("pickaxe", meta)) { - return false; - } - for (int i : OreDictionary.getOreIDs(new ItemStack(block, 1, meta))) { - String orename = OreDictionary.getOreName(i); - if (orename != null && orename.startsWith("ore")) { - return true; - } - } - return false; - } - - private void dropItem(World world, int x, int y, int z, ItemStack drop) { - if (world.isRemote) - return; - - EntityItem dropItem = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, drop); - dropItem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(dropItem); - } - - private float getDoubleDropChance() { - return ConfigTools.handpickBonus / 100F; - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemHandpick setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemHandpick setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemHandpick setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) / 2; - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 2); - } - - public float func_150893_a(ItemStack stack, Block block) { - return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil - && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private String name; + private float baseDamage = 1F; + private Random rand = new Random(); + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemHandpick(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/Advanced/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + setMaxDamage(material.getMaxUses()); + } + + @Override + public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, + EntityLivingBase user) { + boolean silk = EnchantmentHelper.getSilkTouchModifier(user); + int m = world.getBlockMetadata(x, y, z); + ArrayList drops = block.getDrops(world, x, y, z, 0, m); + + if (!silk && drops != null && !drops.isEmpty()) { + Iterator list = drops.iterator(); + while (list.hasNext()) { + ItemStack drop = list.next(); + if (isOre(block, m) && !drop.isItemEqual(new ItemStack(block, 1, m)) + && !(drop.getItem() instanceof ItemBlock) && rand.nextFloat() < getDoubleDropChance()) { + dropItem(world, x, y, z, drop.copy()); + } + } + } + + if (!world.isRemote) { + int meta = world.getBlockMetadata(x, y, z); + int harvestlvl = this.getMaterial().getHarvestLevel(); + int fortune = EnchantmentHelper.getFortuneModifier(user); + + ArrayList specialdrops = RandomOre.getDroppedItems(user, block, meta, harvestlvl, fortune, silk, + y); + + if (specialdrops != null && !specialdrops.isEmpty()) { + Iterator list = specialdrops.iterator(); + + while (list.hasNext()) { + ItemStack newdrop = (ItemStack) list.next(); + + if (newdrop != null) { + if (newdrop.stackSize < 1) + newdrop.stackSize = 1; + + dropItem(world, x, y, z, newdrop); + } + } + } + } + return super.onBlockDestroyed(item, world, block, x, y, z, user); + } + + private boolean isOre(Block block, int meta) { + if (!block.isToolEffective("pickaxe", meta)) { + return false; + } + for (int i : OreDictionary.getOreIDs(new ItemStack(block, 1, meta))) { + String orename = OreDictionary.getOreName(i); + if (orename != null && orename.startsWith("ore")) { + return true; + } + } + return false; + } + + private void dropItem(World world, int x, int y, int z, ItemStack drop) { + if (world.isRemote) + return; + + EntityItem dropItem = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, drop); + dropItem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(dropItem); + } + + private float getDoubleDropChance() { + return ConfigTools.handpickBonus / 100F; + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + public ItemHandpick setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemHandpick setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemHandpick setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) / 2; + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 2); + } + + public float func_150893_a(ItemStack stack, Block block) { + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil + && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java index e6b85071..85ec70a0 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyPick.java @@ -1,13 +1,7 @@ package minefantasy.mf2.item.tool.advanced; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -36,227 +30,228 @@ import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemHvyPick extends ItemPickaxe implements IToolMaterial { - private String name; - private float baseDamage = 2F; - private Random rand = new Random(); - - public ItemHvyPick(String name, ToolMaterial material, int rarity) { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name = name; - setTextureName("minefantasy2:Tool/Advanced/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - setMaxDamage(material.getMaxUses()); - } - - @Override - public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, - EntityLivingBase user) { - if (!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z)) - && ItemLumberAxe.canAcceptCost(user)) { - for (int x1 = -1; x1 <= 1; x1++) { - for (int y1 = -1; y1 <= 1; y1++) { - for (int z1 = -1; z1 <= 1; z1++) { - ForgeDirection FD = getFDFor(user); - int blockX = x + x1 + FD.offsetX; - int blockY = y + y1 + FD.offsetY; - int blockZ = z + z1 + FD.offsetZ; - - if (!(x1 + FD.offsetX == 0 && y1 + FD.offsetY == 0 && z1 + FD.offsetZ == 0)) { - Block newblock = world.getBlock(blockX, blockY, blockZ); - int m = world.getBlockMetadata(blockX, blockY, blockZ); - - if (newblock != null && user instanceof EntityPlayer - && ForgeHooks.canHarvestBlock(newblock, (EntityPlayer) user, m) - && ForgeHooks.isToolEffective(item, newblock, m)) { - if ((MineFantasyII.isBukkitServer() - && BukkitUtils.cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ))) { - continue; - } - - if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { - newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, - EnchantmentHelper.getFortuneModifier(user)); - } - world.setBlockToAir(blockX, blockY, blockZ); - item.damageItem(1, user); - ItemLumberAxe.tirePlayer(user, 1F); - } - } - } - } - } - } - return super.onBlockDestroyed(item, world, block, x, y, z, user); - } - - private ForgeDirection getFDFor(EntityLivingBase user) { - return ForgeDirection.UNKNOWN;// TODO: FD - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemHvyPick setCustom(String s) { - setCreativeTab(CreativeTabMF.tabOldTools); - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemHvyPick setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemHvyPick setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) * 2; - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 10); - } - - public float func_150893_a(ItemStack stack, Block block) { - return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil - && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private String name; + private float baseDamage = 2F; + private Random rand = new Random(); + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemHvyPick(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/Advanced/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + setMaxDamage(material.getMaxUses()); + } + + @Override + public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, + EntityLivingBase user) { + if (!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z)) + && ItemLumberAxe.canAcceptCost(user)) { + for (int x1 = -1; x1 <= 1; x1++) { + for (int y1 = -1; y1 <= 1; y1++) { + for (int z1 = -1; z1 <= 1; z1++) { + ForgeDirection FD = getFDFor(user); + int blockX = x + x1 + FD.offsetX; + int blockY = y + y1 + FD.offsetY; + int blockZ = z + z1 + FD.offsetZ; + + if (!(x1 + FD.offsetX == 0 && y1 + FD.offsetY == 0 && z1 + FD.offsetZ == 0)) { + Block newblock = world.getBlock(blockX, blockY, blockZ); + int m = world.getBlockMetadata(blockX, blockY, blockZ); + + if (newblock != null && user instanceof EntityPlayer + && ForgeHooks.canHarvestBlock(newblock, (EntityPlayer) user, m) + && ForgeHooks.isToolEffective(item, newblock, m)) { + if ((MineFantasyII.isBukkitServer() + && BukkitUtils.cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ))) { + continue; + } + + if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { + newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, + EnchantmentHelper.getFortuneModifier(user)); + } + world.setBlockToAir(blockX, blockY, blockZ); + item.damageItem(1, user); + ItemLumberAxe.tirePlayer(user, 1F); + } + } + } + } + } + } + return super.onBlockDestroyed(item, world, block, x, y, z, user); + } + + private ForgeDirection getFDFor(EntityLivingBase user) { + return ForgeDirection.UNKNOWN;// TODO: FD + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + public ItemHvyPick setCustom(String s) { + setCreativeTab(CreativeTabMF.tabOldTools); + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemHvyPick setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemHvyPick setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) * 2; + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 10); + } + + public float func_150893_a(ItemStack stack, Block block) { + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil + && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java index 3d2238c7..0dc652a6 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemHvyShovel.java @@ -1,13 +1,7 @@ package minefantasy.mf2.item.tool.advanced; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -37,239 +31,240 @@ import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.util.ForgeDirection; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemHvyShovel extends ItemSpade implements IToolMaterial { - private String name; - private float baseDamage = 2F; - private Random rand = new Random(); - - public ItemHvyShovel(String name, ToolMaterial material, int rarity) { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name = name; - setTextureName("minefantasy2:Tool/Advanced/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - setMaxDamage(material.getMaxUses()); - } - - @Override - public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, - EntityLivingBase user) { - if (!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z)) - && ItemLumberAxe.canAcceptCost(user)) { - int range = 2; - for (int x1 = -range; x1 <= range; x1++) { - // for(int y1 = -1; y1 <= 1; y1 ++) - { - for (int z1 = -range; z1 <= range; z1++) { - if (getDistance(x + x1, y, z + z1, x, y, z) <= range * 1 + 0.5D) { - ForgeDirection FD = getFDFor(user); - int blockX = x + x1 + FD.offsetX; - int blockY = y + FD.offsetY; - int blockZ = z + z1 + FD.offsetZ; - - if (!(x1 + FD.offsetX == 0 && FD.offsetY == 0 && z1 + FD.offsetZ == 0)) { - Block newblock = world.getBlock(blockX, blockY, blockZ); - Block above = world.getBlock(blockX, blockY + 1, blockZ); - int m = world.getBlockMetadata(blockX, blockY, blockZ); - - if ((above == null || !above.getMaterial().isSolid()) && newblock != null - && user instanceof EntityPlayer - && ForgeHooks.canHarvestBlock(newblock, (EntityPlayer) user, m) - && ForgeHooks.isToolEffective(item, newblock, m)) { - if ((MineFantasyII.isBukkitServer() && BukkitUtils - .cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ))) { - continue; - } - - if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { - newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, - EnchantmentHelper.getFortuneModifier(user)); - } - world.setBlockToAir(blockX, blockY, blockZ); - item.damageItem(1, user); - ItemLumberAxe.tirePlayer(user, 1F); - } - } - } - } - } - } - } - return super.onBlockDestroyed(item, world, block, x, y, z, user); - } - - public double getDistance(double x, double y, double z, int posX, int posY, int posZ) { - double var7 = posX - x; - double var9 = posY - y; - double var11 = posZ - z; - return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); - } - - private ForgeDirection getFDFor(EntityLivingBase user) { - return ForgeDirection.UNKNOWN;// TODO: FD - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemHvyShovel setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemHvyShovel setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemHvyShovel setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) * 2; - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 10); - } - - public float func_150893_a(ItemStack stack, Block block) { - return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil - && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private String name; + private float baseDamage = 2F; + private Random rand = new Random(); + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemHvyShovel(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/Advanced/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + setMaxDamage(material.getMaxUses()); + } + + @Override + public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, + EntityLivingBase user) { + if (!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z)) + && ItemLumberAxe.canAcceptCost(user)) { + int range = 2; + for (int x1 = -range; x1 <= range; x1++) { + // for(int y1 = -1; y1 <= 1; y1 ++) + { + for (int z1 = -range; z1 <= range; z1++) { + if (getDistance(x + x1, y, z + z1, x, y, z) <= range * 1 + 0.5D) { + ForgeDirection FD = getFDFor(user); + int blockX = x + x1 + FD.offsetX; + int blockY = y + FD.offsetY; + int blockZ = z + z1 + FD.offsetZ; + + if (!(x1 + FD.offsetX == 0 && FD.offsetY == 0 && z1 + FD.offsetZ == 0)) { + Block newblock = world.getBlock(blockX, blockY, blockZ); + Block above = world.getBlock(blockX, blockY + 1, blockZ); + int m = world.getBlockMetadata(blockX, blockY, blockZ); + + if ((above == null || !above.getMaterial().isSolid()) && newblock != null + && user instanceof EntityPlayer + && ForgeHooks.canHarvestBlock(newblock, (EntityPlayer) user, m) + && ForgeHooks.isToolEffective(item, newblock, m)) { + if ((MineFantasyII.isBukkitServer() && BukkitUtils + .cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ))) { + continue; + } + + if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { + newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, + EnchantmentHelper.getFortuneModifier(user)); + } + world.setBlockToAir(blockX, blockY, blockZ); + item.damageItem(1, user); + ItemLumberAxe.tirePlayer(user, 1F); + } + } + } + } + } + } + } + return super.onBlockDestroyed(item, world, block, x, y, z, user); + } + + public double getDistance(double x, double y, double z, int posX, int posY, int posZ) { + double var7 = posX - x; + double var9 = posY - y; + double var11 = posZ - z; + return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); + } + + private ForgeDirection getFDFor(EntityLivingBase user) { + return ForgeDirection.UNKNOWN;// TODO: FD + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + public ItemHvyShovel setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemHvyShovel setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemHvyShovel setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) * 2; + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 10); + } + + public float func_150893_a(ItemStack stack, Block block) { + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil + && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java index dea1d592..8b6b4d7b 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.tool.advanced; -import java.util.Random; - import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.api.weapon.IRackItem; @@ -19,145 +17,147 @@ import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Random; + public class ItemLumberAxe extends ItemAxeMF implements IRackItem { - private Random rand = new Random(); - - public ItemLumberAxe(String name, ToolMaterial material, int rarity) { - super(name, material, rarity); - this.setMaxDamage(getMaxDamage() * 5); - } - - @Override - public float getScale(ItemStack itemstack) { - return 2.0F; - } - - @Override - public float getOffsetX(ItemStack itemstack) { - return 0; - } - - @Override - public float getOffsetY(ItemStack itemstack) { - return 0; - } - - @Override - public float getOffsetZ(ItemStack itemstack) { - return 0; - } - - @Override - public float getRotationOffset(ItemStack itemstack) { - return 0; - } - - @Override - public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { - return true; - } - - @Override - public boolean isSpecialRender(ItemStack item) { - return true; - } - - @Override - public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, - EntityLivingBase user) { - if (user instanceof EntityPlayer && canAcceptCost(user)) { - breakChain(world, x, y, z, item, block, user, 32, block, world.getBlockMetadata(x, y, z)); - } - return super.onBlockDestroyed(item, world, block, x, y, z, user); - } - - private void breakChain(World world, int x, int y, int z, ItemStack item, Block block, EntityLivingBase user, - int maxLogs, Block orient, int orientM) { - if (maxLogs > 0 && isLog(world, x, y, z, orient, orientM)) { - if (MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock((EntityPlayer) user, x, y, z)) { - return; - } - - Block newblock = world.getBlock(x, y, z); - breakSurrounding(item, world, newblock, x, y, z, user); - if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { - newblock.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), - EnchantmentHelper.getFortuneModifier(user)); - } - world.setBlockToAir(x, y, z); - item.damageItem(1, user); - - maxLogs--; - for (int x1 = -1; x1 <= 1; x1++) { - for (int y1 = -1; y1 <= 1; y1++) { - for (int z1 = -1; z1 <= 1; z1++) { - breakChain(world, x + x1, y + y1, z + z1, item, newblock, user, maxLogs, orient, orientM); - } - } - } - tirePlayer(user, 0.5F); - } - } - - public static boolean canAcceptCost(EntityLivingBase user) { - return canAcceptCost(user, 0.1F); - } - - public static boolean canAcceptCost(EntityLivingBase user, float cost) { - if (user instanceof EntityPlayer && StaminaBar.isSystemActive) { - return StaminaBar.isPercentStamAvailable(user, cost, true); - } - return true; - } - - public static void tirePlayer(EntityLivingBase user, float points) { - if (user instanceof EntityPlayer && StaminaBar.isSystemActive) { - StaminaBar.modifyStaminaValue(user, -StaminaBar.getBaseDecayModifier(user, true, true) * points); - StaminaBar.ModifyIdleTime(user, 5F * points); - } - } - - private boolean isLog(World world, int x, int y, int z, Block orient, int orientM) { - Block block = world.getBlock(x, y, z); - int meta = world.getBlockMetadata(x, y, z); - if (block != null) { - return block == orient && block.getMaterial() == Material.wood; - } - return false; - } - - public void breakSurrounding(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user) { - if (!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z))) { - for (int x1 = -2; x1 <= 2; x1++) { - for (int y1 = -2; y1 <= 2; y1++) { - for (int z1 = -2; z1 <= 2; z1++) { - ForgeDirection FD = getFDFor(user); - int blockX = x + x1 + FD.offsetX; - int blockY = y + y1 + FD.offsetY; - int blockZ = z + z1 + FD.offsetZ; - - if (!(x1 + FD.offsetX == 0 && y1 + FD.offsetY == 0 && z1 + FD.offsetZ == 0)) { - Block newblock = world.getBlock(blockX, blockY, blockZ); - int m = world.getBlockMetadata(blockX, blockY, blockZ); - - if (item.getItemDamage() < item.getMaxDamage() && newblock != null - && user instanceof EntityPlayer && newblock.getMaterial() == Material.leaves) { - if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { - newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, - EnchantmentHelper.getFortuneModifier(user)); - } - world.setBlockToAir(blockX, blockY, blockZ); - item.damageItem(1, user); - } - } - } - } - } - } - } - - private ForgeDirection getFDFor(EntityLivingBase user) { - return ForgeDirection.UNKNOWN;// TODO: FD - } + private Random rand = new Random(); + + public ItemLumberAxe(String name, ToolMaterial material, int rarity) { + super(name, material, rarity); + this.setMaxDamage(getMaxDamage() * 5); + } + + public static boolean canAcceptCost(EntityLivingBase user) { + return canAcceptCost(user, 0.1F); + } + + public static boolean canAcceptCost(EntityLivingBase user, float cost) { + if (user instanceof EntityPlayer && StaminaBar.isSystemActive) { + return StaminaBar.isPercentStamAvailable(user, cost, true); + } + return true; + } + + public static void tirePlayer(EntityLivingBase user, float points) { + if (user instanceof EntityPlayer && StaminaBar.isSystemActive) { + StaminaBar.modifyStaminaValue(user, -StaminaBar.getBaseDecayModifier(user, true, true) * points); + StaminaBar.ModifyIdleTime(user, 5F * points); + } + } + + @Override + public float getScale(ItemStack itemstack) { + return 2.0F; + } + + @Override + public float getOffsetX(ItemStack itemstack) { + return 0; + } + + @Override + public float getOffsetY(ItemStack itemstack) { + return 0; + } + + @Override + public float getOffsetZ(ItemStack itemstack) { + return 0; + } + + @Override + public float getRotationOffset(ItemStack itemstack) { + return 0; + } + + @Override + public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { + return true; + } + + @Override + public boolean isSpecialRender(ItemStack item) { + return true; + } + + @Override + public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, + EntityLivingBase user) { + if (user instanceof EntityPlayer && canAcceptCost(user)) { + breakChain(world, x, y, z, item, block, user, 32, block, world.getBlockMetadata(x, y, z)); + } + return super.onBlockDestroyed(item, world, block, x, y, z, user); + } + + private void breakChain(World world, int x, int y, int z, ItemStack item, Block block, EntityLivingBase user, + int maxLogs, Block orient, int orientM) { + if (maxLogs > 0 && isLog(world, x, y, z, orient, orientM)) { + if (MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock((EntityPlayer) user, x, y, z)) { + return; + } + + Block newblock = world.getBlock(x, y, z); + breakSurrounding(item, world, newblock, x, y, z, user); + if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { + newblock.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), + EnchantmentHelper.getFortuneModifier(user)); + } + world.setBlockToAir(x, y, z); + item.damageItem(1, user); + + maxLogs--; + for (int x1 = -1; x1 <= 1; x1++) { + for (int y1 = -1; y1 <= 1; y1++) { + for (int z1 = -1; z1 <= 1; z1++) { + breakChain(world, x + x1, y + y1, z + z1, item, newblock, user, maxLogs, orient, orientM); + } + } + } + tirePlayer(user, 0.5F); + } + } + + private boolean isLog(World world, int x, int y, int z, Block orient, int orientM) { + Block block = world.getBlock(x, y, z); + int meta = world.getBlockMetadata(x, y, z); + if (block != null) { + return block == orient && block.getMaterial() == Material.wood; + } + return false; + } + + public void breakSurrounding(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user) { + if (!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z))) { + for (int x1 = -2; x1 <= 2; x1++) { + for (int y1 = -2; y1 <= 2; y1++) { + for (int z1 = -2; z1 <= 2; z1++) { + ForgeDirection FD = getFDFor(user); + int blockX = x + x1 + FD.offsetX; + int blockY = y + y1 + FD.offsetY; + int blockZ = z + z1 + FD.offsetZ; + + if (!(x1 + FD.offsetX == 0 && y1 + FD.offsetY == 0 && z1 + FD.offsetZ == 0)) { + Block newblock = world.getBlock(blockX, blockY, blockZ); + int m = world.getBlockMetadata(blockX, blockY, blockZ); + + if (item.getItemDamage() < item.getMaxDamage() && newblock != null + && user instanceof EntityPlayer && newblock.getMaterial() == Material.leaves) { + if (rand.nextFloat() * 100F < (100F - ConfigTools.hvyDropChance)) { + newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, + EnchantmentHelper.getFortuneModifier(user)); + } + world.setBlockToAir(blockX, blockY, blockZ); + item.damageItem(1, user); + } + } + } + } + } + } + } + + private ForgeDirection getFDFor(EntityLivingBase user) { + return ForgeDirection.UNKNOWN;// TODO: FD + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemMattock.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemMattock.java index 7e7415de..759822ab 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemMattock.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemMattock.java @@ -1,12 +1,7 @@ package minefantasy.mf2.item.tool.advanced; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -33,220 +28,220 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemMattock extends ItemPickaxe implements IToolMaterial { - private String name; - - public ItemMattock(String name, ToolMaterial material, int rarity) { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - - setTextureName("minefantasy2:Tool/Advanced/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setHarvestLevel("pickaxe", Math.max(0, material.getHarvestLevel() - 2)); - this.setUnlocalizedName(name); - this.name = name; - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - @Override - public boolean canHarvestBlock(Block block, ItemStack stack) { - return super.canHarvestBlock(block, stack) || Items.iron_shovel.canHarvestBlock(block, stack); - } - - @Override - public boolean onItemUse(ItemStack mattock, EntityPlayer player, World world, int x, int y, int z, int facing, - float pitch, float yaw, float pan) { - if (!player.canPlayerEdit(x, y, z, facing, mattock)) { - return false; - } else { - Block ground = world.getBlock(x, y, z); - int groundmeta = world.getBlockMetadata(x, y, z); - Block above = world.getBlock(x, y + 1, z); - int meta = ground == Blocks.sand ? 1 : 0; - - if (facing == 0 || above != Blocks.air) { - return false; - } else if (ground == Blocks.grass || ground == Blocks.dirt || ground == Blocks.sand) { - Block var13 = BlockListMF.road; - if (ground == Blocks.grass) { - ground = Blocks.dirt; - } - world.playSoundEffect(x + 0.5F, y + 0.5F, z + 0.5F, "dig." + ground.stepSound.soundName, - (var13.stepSound.getVolume() + 1.0F) / 2.0F, var13.stepSound.getPitch() * 0.8F); - - if (world.isRemote) { - return true; - } else { - world.setBlock(x, y, z, var13, meta, 2); - - TileEntityRoad road = new TileEntityRoad(); - road.setWorldObj(world); - world.setTileEntity(x, y, z, road); - road.setSurface(ground, groundmeta); - mattock.damageItem(1, player); - return true; - } - } else { - return false; - } - } - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private float baseDamage = 1.0F; - private boolean isCustom = false; - - public ItemMattock setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemMattock setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemMattock setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private String name; + // ===================================================== CUSTOM START + // =============================================================\\ + private float baseDamage = 1.0F; + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemMattock(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + + setTextureName("minefantasy2:Tool/Advanced/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setHarvestLevel("pickaxe", Math.max(0, material.getHarvestLevel() - 2)); + this.setUnlocalizedName(name); + this.name = name; + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + @Override + public boolean canHarvestBlock(Block block, ItemStack stack) { + return super.canHarvestBlock(block, stack) || Items.iron_shovel.canHarvestBlock(block, stack); + } + + @Override + public boolean onItemUse(ItemStack mattock, EntityPlayer player, World world, int x, int y, int z, int facing, + float pitch, float yaw, float pan) { + if (!player.canPlayerEdit(x, y, z, facing, mattock)) { + return false; + } else { + Block ground = world.getBlock(x, y, z); + int groundmeta = world.getBlockMetadata(x, y, z); + Block above = world.getBlock(x, y + 1, z); + int meta = ground == Blocks.sand ? 1 : 0; + + if (facing == 0 || above != Blocks.air) { + return false; + } else if (ground == Blocks.grass || ground == Blocks.dirt || ground == Blocks.sand) { + Block var13 = BlockListMF.road; + if (ground == Blocks.grass) { + ground = Blocks.dirt; + } + world.playSoundEffect(x + 0.5F, y + 0.5F, z + 0.5F, "dig." + ground.stepSound.soundName, + (var13.stepSound.getVolume() + 1.0F) / 2.0F, var13.stepSound.getPitch() * 0.8F); + + if (world.isRemote) { + return true; + } else { + world.setBlock(x, y, z, var13, meta, 2); + + TileEntityRoad road = new TileEntityRoad(); + road.setWorldObj(world); + world.setTileEntity(x, y, z, road); + road.setSurface(ground, groundmeta); + mattock.damageItem(1, player); + return true; + } + } else { + return false; + } + } + } + + public ItemMattock setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemMattock setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemMattock setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java index d3c87788..68eede2c 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemScythe.java @@ -1,13 +1,7 @@ package minefantasy.mf2.item.tool.advanced; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -38,334 +32,334 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemScythe extends Item implements IToolMaterial, IDamageType, IRackItem { - private Random rand = new Random(); - private ToolMaterial toolMaterial; - private String name; - - /** - */ - public ItemScythe(String name, ToolMaterial material, int rarity) { - this.toolMaterial = material; - this.setFull3D(); - itemRarity = rarity; - this.name = name; - setCreativeTab(CreativeTabMF.tabOldTools); - setTextureName("minefantasy2:Tool/Advanced/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - this.maxStackSize = 1; - this.setMaxDamage(material.getMaxUses()); - } - - private float baseDamage = 3.0F; - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - private boolean cutGrass(World world, int x, int y, int z, int r, EntityPlayer entity, boolean leaf) { - boolean flag = false; - ItemStack item = entity.getHeldItem(); - if (item == null) - return false; - - for (int x2 = -r; x2 <= r; x2++) { - for (int y2 = -r; y2 <= r; y2++) { - for (int z2 = -r; z2 <= r; z2++) { - Block block = world.getBlock(x + x2, y + y2, z + z2); - int meta = world.getBlockMetadata(x + x2, y + y2, z + z2); - if (block != null) { - Material m = block.getMaterial(); - if (canCutMaterial(m, block.getBlockHardness(world, x + x2, y + y2, z + z2), leaf)) { - if ((MineFantasyII.isBukkitServer() - && BukkitUtils.cantBreakBlock(entity, x + x2, y + y2, z + z2))) { - continue; - } - - if (getDistance(x + x2, y + y2, z + z2, x, y, z) < r * 1) { - flag = true; - - ArrayList items = block.getDrops(world, x + x2, y + y2, z + z2, meta, 0); - world.setBlockToAir(x + x2, y + y2, z + z2); - world.playAuxSFXAtEntity(entity, 2001, x + x2, y + y2, z + z2, - Block.getIdFromBlock(block) - + (world.getBlockMetadata(x + x2, y + y2, z + z2) << 16)); - tryBreakFarmland(world, x + x2, y + y2 - 1, z + z2); - if (!entity.capabilities.isCreativeMode) { - ItemLumberAxe.tirePlayer(entity, 1F); - for (ItemStack drop : items) { - if (world.rand.nextFloat() <= 1.0F) { - dropBlockAsItem_do(world, x + x2, y + y2, z + z2, drop); - } - } - } - item.damageItem(1, entity); - } - } - } - } - } - } - return flag; - } - - private void tryBreakFarmland(World world, int x, int y, int z) { - Block base = world.getBlock(x, y, z); - - if (base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(world, true)) { - world.setBlock(x, y, z, Blocks.dirt); - } - } - - protected void dropBlockAsItem_do(World world, int x, int y, int z, ItemStack drop) { - if (!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) { - float var6 = 0.7F; - double var7 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; - double var9 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; - double var11 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; - EntityItem var13 = new EntityItem(world, x + var7, y + var9, z + var11, drop); - var13.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(var13); - } - } - - private boolean canCutMaterial(Material m, float str, boolean leaf) { - if (!leaf) { - if (str <= 0.0F) { - return m == Material.vine || m == Material.plants || m == Material.grass; - } else - return false; - } - return m == Material.leaves || m == Material.vine; - } - - public double getDistance(double x, double y, double z, int posX, int posY, int posZ) { - double var7 = posX - x; - double var9 = posY - y; - double var11 = posZ - z; - return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); - } - - @Override - public boolean onItemUse(ItemStack hoe, EntityPlayer player, World world, int x, int y, int z, int facing, - float pitch, float yaw, float pan) { - if (!player.canPlayerEdit(x, y, z, facing, hoe) || !ItemLumberAxe.canAcceptCost(player)) { - return false; - } else { - Block block = world.getBlock(x, y, z); - - if (block != null) { - Material m = block.getMaterial(); - float hard = block.getBlockHardness(world, x, y, z); - if (this.canCutMaterial(m, hard, false)) { - if (cutGrass(world, x, y, z, 5, player, false)) { - player.swingItem(); - } - } else if (this.canCutMaterial(m, hard, true)) { - if (cutGrass(world, x, y, z, 3, player, true)) { - player.swingItem(); - } - } - } - } - return false; - } - - @Override - public float[] getDamageRatio(Object... implement) { - return new float[] { 1, 0, 2 }; - } - - @Override - public float getPenetrationLevel(Object implement) { - return 0F; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemScythe setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemScythe setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemScythe setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ - - @Override - public float getScale(ItemStack itemstack) { - return 2.0F; - } - - @Override - public float getOffsetX(ItemStack itemstack) { - return 0; - } - - @Override - public float getOffsetY(ItemStack itemstack) { - return 5F / 16F; - } - - @Override - public float getOffsetZ(ItemStack itemstack) { - return 0; - } - - @Override - public float getRotationOffset(ItemStack itemstack) { - return 0; - } - - @Override - public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { - return rack.hasRackBelow(slot); - } - - @Override - public boolean isSpecialRender(ItemStack item) { - return false; - } + protected int itemRarity; + private Random rand = new Random(); + private ToolMaterial toolMaterial; + private String name; + private float baseDamage = 3.0F; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + /** + */ + public ItemScythe(String name, ToolMaterial material, int rarity) { + this.toolMaterial = material; + this.setFull3D(); + itemRarity = rarity; + this.name = name; + setCreativeTab(CreativeTabMF.tabOldTools); + setTextureName("minefantasy2:Tool/Advanced/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + this.maxStackSize = 1; + this.setMaxDamage(material.getMaxUses()); + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + private boolean cutGrass(World world, int x, int y, int z, int r, EntityPlayer entity, boolean leaf) { + boolean flag = false; + ItemStack item = entity.getHeldItem(); + if (item == null) + return false; + + for (int x2 = -r; x2 <= r; x2++) { + for (int y2 = -r; y2 <= r; y2++) { + for (int z2 = -r; z2 <= r; z2++) { + Block block = world.getBlock(x + x2, y + y2, z + z2); + int meta = world.getBlockMetadata(x + x2, y + y2, z + z2); + if (block != null) { + Material m = block.getMaterial(); + if (canCutMaterial(m, block.getBlockHardness(world, x + x2, y + y2, z + z2), leaf)) { + if ((MineFantasyII.isBukkitServer() + && BukkitUtils.cantBreakBlock(entity, x + x2, y + y2, z + z2))) { + continue; + } + + if (getDistance(x + x2, y + y2, z + z2, x, y, z) < r * 1) { + flag = true; + + ArrayList items = block.getDrops(world, x + x2, y + y2, z + z2, meta, 0); + world.setBlockToAir(x + x2, y + y2, z + z2); + world.playAuxSFXAtEntity(entity, 2001, x + x2, y + y2, z + z2, + Block.getIdFromBlock(block) + + (world.getBlockMetadata(x + x2, y + y2, z + z2) << 16)); + tryBreakFarmland(world, x + x2, y + y2 - 1, z + z2); + if (!entity.capabilities.isCreativeMode) { + ItemLumberAxe.tirePlayer(entity, 1F); + for (ItemStack drop : items) { + if (world.rand.nextFloat() <= 1.0F) { + dropBlockAsItem_do(world, x + x2, y + y2, z + z2, drop); + } + } + } + item.damageItem(1, entity); + } + } + } + } + } + } + return flag; + } + + private void tryBreakFarmland(World world, int x, int y, int z) { + Block base = world.getBlock(x, y, z); + + if (base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(world, true)) { + world.setBlock(x, y, z, Blocks.dirt); + } + } + + protected void dropBlockAsItem_do(World world, int x, int y, int z, ItemStack drop) { + if (!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) { + float var6 = 0.7F; + double var7 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; + double var9 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; + double var11 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; + EntityItem var13 = new EntityItem(world, x + var7, y + var9, z + var11, drop); + var13.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(var13); + } + } + + private boolean canCutMaterial(Material m, float str, boolean leaf) { + if (!leaf) { + if (str <= 0.0F) { + return m == Material.vine || m == Material.plants || m == Material.grass; + } else + return false; + } + return m == Material.leaves || m == Material.vine; + } + + public double getDistance(double x, double y, double z, int posX, int posY, int posZ) { + double var7 = posX - x; + double var9 = posY - y; + double var11 = posZ - z; + return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); + } + + @Override + public boolean onItemUse(ItemStack hoe, EntityPlayer player, World world, int x, int y, int z, int facing, + float pitch, float yaw, float pan) { + if (!player.canPlayerEdit(x, y, z, facing, hoe) || !ItemLumberAxe.canAcceptCost(player)) { + return false; + } else { + Block block = world.getBlock(x, y, z); + + if (block != null) { + Material m = block.getMaterial(); + float hard = block.getBlockHardness(world, x, y, z); + if (this.canCutMaterial(m, hard, false)) { + if (cutGrass(world, x, y, z, 5, player, false)) { + player.swingItem(); + } + } else if (this.canCutMaterial(m, hard, true)) { + if (cutGrass(world, x, y, z, 3, player, true)) { + player.swingItem(); + } + } + } + } + return false; + } + + @Override + public float[] getDamageRatio(Object... implement) { + return new float[]{1, 0, 2}; + } + + @Override + public float getPenetrationLevel(Object implement) { + return 0F; + } + + public ItemScythe setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemScythe setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemScythe setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ + + @Override + public float getScale(ItemStack itemstack) { + return 2.0F; + } + + @Override + public float getOffsetX(ItemStack itemstack) { + return 0; + } + + @Override + public float getOffsetY(ItemStack itemstack) { + return 5F / 16F; + } + + @Override + public float getOffsetZ(ItemStack itemstack) { + return 0; + } + + @Override + public float getRotationOffset(ItemStack itemstack) { + return 0; + } + + @Override + public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { + return rack.hasRackBelow(slot); + } + + @Override + public boolean isSpecialRender(ItemStack item) { + return false; + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemTrowMF.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemTrowMF.java index fa41bb4d..0b2a24c1 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemTrowMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemTrowMF.java @@ -1,13 +1,7 @@ package minefantasy.mf2.item.tool.advanced; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -37,234 +31,235 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemTrowMF extends ItemSpade implements IToolMaterial { - private String name; - private float baseDamage = 1F; - private Random rand = new Random(); - - public ItemTrowMF(String name, ToolMaterial material, int rarity) { - super(material); - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.name = name; - setTextureName("minefantasy2:Tool/Advanced/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - setMaxDamage(material.getMaxUses()); - } - - @Override - public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, - EntityLivingBase user) { - int m = world.getBlockMetadata(x, y, z); - alwaysDropFlint(block, item, world, user, x, y, z); - - if (!world.isRemote) { - int meta = world.getBlockMetadata(x, y, z); - int harvestlvl = this.getMaterial().getHarvestLevel(); - int fortune = EnchantmentHelper.getFortuneModifier(user); - boolean silk = EnchantmentHelper.getSilkTouchModifier(user); - - ArrayList specialdrops = RandomDigs.getDroppedItems(block, meta, harvestlvl, fortune, silk, y); - - if (specialdrops != null && !specialdrops.isEmpty()) { - Iterator list = specialdrops.iterator(); - - while (list.hasNext()) { - ItemStack newdrop = (ItemStack) list.next(); - - if (newdrop != null) { - if (newdrop.stackSize < 1) - newdrop.stackSize = 1; - - dropItem(world, x, y, z, newdrop); - } - } - } - } - return super.onBlockDestroyed(item, world, block, x, y, z, user); - } - - private void alwaysDropFlint(Block block, ItemStack item, World world, EntityLivingBase user, int x, int y, int z) { - if (block == Blocks.gravel) { - world.setBlockToAir(x, y, z); - int loot = 0; - int enc = EnchantmentHelper.getFortuneModifier(user); - if (enc > 0) { - loot = rand.nextInt(enc); - } - dropItem(world, x, y, z, new ItemStack(Items.flint, 1 + loot)); - } - } - - private void dropItem(World world, int x, int y, int z, ItemStack drop) { - if (world.isRemote) - return; - - EntityItem dropItem = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, drop); - dropItem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(dropItem); - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemTrowMF setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemTrowMF setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemTrowMF setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) / 2; - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 2); - } - - public float func_150893_a(ItemStack stack, Block block) { - return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil - && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private String name; + private float baseDamage = 1F; + private Random rand = new Random(); + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemTrowMF(String name, ToolMaterial material, int rarity) { + super(material); + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.name = name; + setTextureName("minefantasy2:Tool/Advanced/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + setMaxDamage(material.getMaxUses()); + } + + @Override + public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, + EntityLivingBase user) { + int m = world.getBlockMetadata(x, y, z); + alwaysDropFlint(block, item, world, user, x, y, z); + + if (!world.isRemote) { + int meta = world.getBlockMetadata(x, y, z); + int harvestlvl = this.getMaterial().getHarvestLevel(); + int fortune = EnchantmentHelper.getFortuneModifier(user); + boolean silk = EnchantmentHelper.getSilkTouchModifier(user); + + ArrayList specialdrops = RandomDigs.getDroppedItems(block, meta, harvestlvl, fortune, silk, y); + + if (specialdrops != null && !specialdrops.isEmpty()) { + Iterator list = specialdrops.iterator(); + + while (list.hasNext()) { + ItemStack newdrop = (ItemStack) list.next(); + + if (newdrop != null) { + if (newdrop.stackSize < 1) + newdrop.stackSize = 1; + + dropItem(world, x, y, z, newdrop); + } + } + } + } + return super.onBlockDestroyed(item, world, block, x, y, z, user); + } + + private void alwaysDropFlint(Block block, ItemStack item, World world, EntityLivingBase user, int x, int y, int z) { + if (block == Blocks.gravel) { + world.setBlockToAir(x, y, z); + int loot = 0; + int enc = EnchantmentHelper.getFortuneModifier(user); + if (enc > 0) { + loot = rand.nextInt(enc); + } + dropItem(world, x, y, z, new ItemStack(Items.flint, 1 + loot)); + } + } + + private void dropItem(World world, int x, int y, int z, ItemStack drop) { + if (world.isRemote) + return; + + EntityItem dropItem = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, drop); + dropItem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(dropItem); + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + public ItemTrowMF setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemTrowMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemTrowMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)) / 2; + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod / 2); + } + + public float func_150893_a(ItemStack stack, Block block) { + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil + && block.getMaterial() != Material.rock ? super.func_150893_a(stack, block) + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod / 2); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemBasicCraftTool.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemBasicCraftTool.java index bf793d26..cda00aff 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemBasicCraftTool.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemBasicCraftTool.java @@ -1,9 +1,6 @@ package minefantasy.mf2.item.tool.crafting; -import java.util.List; - import com.google.common.collect.Sets; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -21,119 +18,118 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemBasicCraftTool extends ItemTool implements IToolMaterial, IToolMF, IDamageType { - private int tier; - private String name; - private String toolType; - - public ItemBasicCraftTool(String name, String type, int tier, int uses) { - super(1.0F, ToolMaterial.WOOD, Sets.newHashSet(new Block[] {})); - this.tier = tier; - setCreativeTab(CreativeTabMF.tabCraftTool); - - this.name = name; - toolType = type; - setTextureName("minefantasy2:Tool/Crafting/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - setMaxDamage(uses); - this.setMaxStackSize(1); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - @Override - public String getToolType(ItemStack item) { - return toolType; - } - - @Override - public float[] getDamageRatio(Object... implement) { - return new float[] { 0, 1, 0 }; - } - - private void addSet(List list, Item[] items) { - for (Item item : items) { - list.add(new ItemStack(item)); - } - } - - @Override - public float getPenetrationLevel(Object implement) { - return 0F; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemBasicCraftTool setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemStack construct(String main) { - return CustomToolHelper.construct(this, main); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - list.add(this.construct("OakWood")); - list.add(this.construct("IronbarkWood")); - list.add(this.construct("EbonyWood")); - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - super.addInformation(item, user, list, extra); - } - - private float efficiencyMod = 1.0F; - - @Override - public float getEfficiency(ItemStack item) { - return CustomToolHelper.getEfficiencyForHds(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); - } - - @Override - public int getTier(ItemStack item) { - return CustomToolHelper.getCrafterTier(item, tier); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } + protected int itemRarity; + private int tier; + private String name; + private String toolType; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + + public ItemBasicCraftTool(String name, String type, int tier, int uses) { + super(1.0F, ToolMaterial.WOOD, Sets.newHashSet(new Block[]{})); + this.tier = tier; + setCreativeTab(CreativeTabMF.tabCraftTool); + + this.name = name; + toolType = type; + setTextureName("minefantasy2:Tool/Crafting/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + setMaxDamage(uses); + this.setMaxStackSize(1); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + @Override + public String getToolType(ItemStack item) { + return toolType; + } + + @Override + public float[] getDamageRatio(Object... implement) { + return new float[]{0, 1, 0}; + } + + private void addSet(List list, Item[] items) { + for (Item item : items) { + list.add(new ItemStack(item)); + } + } + + @Override + public float getPenetrationLevel(Object implement) { + return 0F; + } + + public ItemBasicCraftTool setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemStack construct(String main) { + return CustomToolHelper.construct(this, main); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + list.add(this.construct("OakWood")); + list.add(this.construct("IronbarkWood")); + list.add(this.construct("EbonyWood")); + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + super.addInformation(item, user, list, extra); + } + + @Override + public float getEfficiency(ItemStack item) { + return CustomToolHelper.getEfficiencyForHds(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); + } + + @Override + public int getTier(ItemStack item) { + return CustomToolHelper.getCrafterTier(item, tier); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEAnvilTools.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEAnvilTools.java index 8d7ac2e7..36710cb5 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEAnvilTools.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEAnvilTools.java @@ -11,24 +11,24 @@ * @author Anonymous Productions */ public class ItemEAnvilTools extends Item { - public ItemEAnvilTools(String name, int uses) { - setCreativeTab(CreativeTabMF.tabCraftTool); + public ItemEAnvilTools(String name, int uses) { + setCreativeTab(CreativeTabMF.tabCraftTool); - setTextureName("minefantasy2:Tool/Crafting/Engineer/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - this.setMaxDamage(uses); - setMaxStackSize(1); - } + setTextureName("minefantasy2:Tool/Crafting/Engineer/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + this.setMaxDamage(uses); + setMaxStackSize(1); + } - @Override - public ItemStack getContainerItem(ItemStack item) { - item.setItemDamage(item.getItemDamage() + 1); - return item.getItemDamage() >= item.getMaxDamage() ? null : item; - } + @Override + public ItemStack getContainerItem(ItemStack item) { + item.setItemDamage(item.getItemDamage() + 1); + return item.getItemDamage() >= item.getMaxDamage() ? null : item; + } - @Override - public int getMaxDamage(ItemStack stack) { - return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); - } + @Override + public int getMaxDamage(ItemStack stack) { + return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEngineerTool.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEngineerTool.java index b60bf373..ddbcaa7b 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEngineerTool.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemEngineerTool.java @@ -1,7 +1,6 @@ package minefantasy.mf2.item.tool.crafting; import com.google.common.collect.Sets; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.ToolHelper; @@ -19,73 +18,72 @@ * @author Anonymous Productions */ public class ItemEngineerTool extends ItemTool implements IToolMaterial, IToolMF, IDamageType { - private ToolMaterial material; - private int tier; - private String toolType; - - public ItemEngineerTool(String name, ToolMaterial material, int tier, String toolType, int rarity) { - super(1.0F, material, Sets.newHashSet(new Block[] {})); - this.toolType = toolType; - this.material = material; - this.tier = tier; - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabCraftTool); + private ToolMaterial material; + private int tier; + private String toolType; + private int itemRarity; - setTextureName("minefantasy2:Tool/Crafting/Engineer/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } + public ItemEngineerTool(String name, ToolMaterial material, int tier, String toolType, int rarity) { + super(1.0F, material, Sets.newHashSet(new Block[]{})); + this.toolType = toolType; + this.material = material; + this.tier = tier; + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabCraftTool); - private int itemRarity; + setTextureName("minefantasy2:Tool/Crafting/Engineer/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } - @Override - public EnumRarity getRarity(ItemStack item) { - int lvl = itemRarity + 1; + @Override + public EnumRarity getRarity(ItemStack item) { + int lvl = itemRarity + 1; - if (item.isItemEnchanted()) { - if (lvl == 0) { - lvl++; - } - lvl++; - } - if (lvl >= ToolListMF.rarity.length) { - lvl = ToolListMF.rarity.length - 1; - } - return ToolListMF.rarity[lvl]; - } + if (item.isItemEnchanted()) { + if (lvl == 0) { + lvl++; + } + lvl++; + } + if (lvl >= ToolListMF.rarity.length) { + lvl = ToolListMF.rarity.length - 1; + } + return ToolListMF.rarity[lvl]; + } - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } - @Override - public float getEfficiency(ItemStack item) { - return ToolHelper.modifyDigOnQuality(item, material.getEfficiencyOnProperMaterial()); - } + @Override + public float getEfficiency(ItemStack item) { + return ToolHelper.modifyDigOnQuality(item, material.getEfficiencyOnProperMaterial()); + } - @Override - public int getTier(ItemStack item) { - return tier; - } + @Override + public int getTier(ItemStack item) { + return tier; + } - @Override - public String getToolType(ItemStack item) { - return toolType; - } + @Override + public String getToolType(ItemStack item) { + return toolType; + } - @Override - public int getMaxDamage(ItemStack stack) { - return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); - } + @Override + public int getMaxDamage(ItemStack stack) { + return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); + } - @Override - public float[] getDamageRatio(Object... implement) { - return new float[] { 0, 1, 0 }; - } + @Override + public float[] getDamageRatio(Object... implement) { + return new float[]{0, 1, 0}; + } - @Override - public float getPenetrationLevel(Object implement) { - return 0F; - } + @Override + public float getPenetrationLevel(Object implement) { + return 0F; + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemHammer.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemHammer.java index dd29d2ee..6ab49c19 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemHammer.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemHammer.java @@ -1,13 +1,8 @@ package minefantasy.mf2.item.tool.crafting; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -31,217 +26,217 @@ import net.minecraft.util.IIcon; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemHammer extends ItemTool implements IToolMaterial, IToolMF, IDamageType { - private ToolMaterial material; - private int tier; - private boolean heavy; - private float baseDamage; - private String name; - - public ItemHammer(String name, ToolMaterial material, boolean heavy, int rarity, int tier) { - super(heavy ? 3.0F : 2.0F, material, Sets.newHashSet(new Block[] {})); - this.heavy = heavy; - this.material = material; - this.name = name; - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.setMaxDamage(material.getMaxUses() * 2); - this.tier = tier; - setTextureName("minefantasy2:Tool/Crafting/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - @Override - public String getToolType(ItemStack item) { - return heavy ? "hvyHammer" : "hammer"; - } - - @Override - public float[] getDamageRatio(Object... implement) { - return new float[] { 0, 1, 0 }; - } - - private void addSet(List list, Item[] items) { - for (Item item : items) { - list.add(new ItemStack(item)); - } - } - - @Override - public float getPenetrationLevel(Object implement) { - return 0F; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemHammer setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemHammer setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemHammer setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getEfficiency(ItemStack item) { - return CustomToolHelper.getEfficiency(item, material.getEfficiencyOnProperMaterial(), efficiencyMod); - } - - @Override - public int getTier(ItemStack item) { - return CustomToolHelper.getCrafterTier(item, tier); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); - } - - public float func_150893_a(ItemStack stack, Block block) { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private ToolMaterial material; + private int tier; + private boolean heavy; + private float baseDamage; + private String name; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemHammer(String name, ToolMaterial material, boolean heavy, int rarity, int tier) { + super(heavy ? 3.0F : 2.0F, material, Sets.newHashSet(new Block[]{})); + this.heavy = heavy; + this.material = material; + this.name = name; + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.setMaxDamage(material.getMaxUses() * 2); + this.tier = tier; + setTextureName("minefantasy2:Tool/Crafting/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + @Override + public String getToolType(ItemStack item) { + return heavy ? "hvyHammer" : "hammer"; + } + + @Override + public float[] getDamageRatio(Object... implement) { + return new float[]{0, 1, 0}; + } + + private void addSet(List list, Item[] items) { + for (Item item : items) { + list.add(new ItemStack(item)); + } + } + + @Override + public float getPenetrationLevel(Object implement) { + return 0F; + } + + public ItemHammer setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemHammer setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemHammer setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getEfficiency(ItemStack item) { + return CustomToolHelper.getEfficiency(item, material.getEfficiencyOnProperMaterial(), efficiencyMod); + } + + @Override + public int getTier(ItemStack item) { + return CustomToolHelper.getCrafterTier(item, tier); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java index 169f3b9f..c43c2034 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java @@ -1,13 +1,7 @@ package minefantasy.mf2.item.tool.crafting; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import minefantasy.mf2.MineFantasyII; @@ -30,222 +24,223 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemKnifeMF extends ItemWeaponMF implements IToolMF, IHuntingItem { - private Random rand = new Random(); - private int tier; - private float baseDamage; - - /** - * Knives are weapons used for hunting, and tools used for processing - */ - public ItemKnifeMF(String name, ToolMaterial material, int rarity, float weight, int tier) { - super(material, name, rarity, weight); - this.tier = tier; - setTextureName("minefantasy2:Tool/Crafting/" + name); - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { - return item; - } - - @Override - public boolean canRetrieveDrops(ItemStack item) { - return true; - } - - @Override - public String getToolType(ItemStack item) { - return "knife"; - } - - @Override - public boolean canBlock() { - return false; - } - - /** - * Determines if the weapon can parry - */ - @Override - public boolean canWeaponParry() { - return false; - } - - @Override - protected float getStaminaMod() { - return 0.5F; - } - - @Override - public WeaponClass getWeaponClass() { - return null; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemKnifeMF setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemKnifeMF setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - @Override - public float getEfficiency(ItemStack item) { - return CustomToolHelper.getEfficiency(item, material.getEfficiencyOnProperMaterial(), efficiencyMod); - } - - @Override - public int getTier(ItemStack item) { - return CustomToolHelper.getCrafterTier(item, tier); - } - - private float efficiencyMod = 1.0F; - - public ItemKnifeMF setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, material.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); - } - - public float func_150893_a(ItemStack stack, Block block) { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base - : CustomToolHelper.getEfficiency(stack, material.getEfficiencyOnProperMaterial(), efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private Random rand = new Random(); + private int tier; + private float baseDamage; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + /** + * Knives are weapons used for hunting, and tools used for processing + */ + public ItemKnifeMF(String name, ToolMaterial material, int rarity, float weight, int tier) { + super(material, name, rarity, weight); + this.tier = tier; + setTextureName("minefantasy2:Tool/Crafting/" + name); + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + return item; + } + + @Override + public boolean canRetrieveDrops(ItemStack item) { + return true; + } + + @Override + public String getToolType(ItemStack item) { + return "knife"; + } + + @Override + public boolean canBlock() { + return false; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return false; + } + + @Override + protected float getStaminaMod() { + return 0.5F; + } + + @Override + public WeaponClass getWeaponClass() { + return null; + } + + public ItemKnifeMF setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemKnifeMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + @Override + public float getEfficiency(ItemStack item) { + return CustomToolHelper.getEfficiency(item, material.getEfficiencyOnProperMaterial(), efficiencyMod); + } + + @Override + public int getTier(ItemStack item) { + return CustomToolHelper.getCrafterTier(item, tier); + } + + public ItemKnifeMF setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, material.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, material.getEfficiencyOnProperMaterial(), efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemNeedle.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemNeedle.java index 931cc966..61729fa3 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemNeedle.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemNeedle.java @@ -1,13 +1,8 @@ package minefantasy.mf2.item.tool.crafting; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -29,160 +24,160 @@ import net.minecraft.item.ItemTool; import net.minecraft.util.IIcon; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemNeedle extends ItemTool implements IToolMaterial, IToolMF { - private ToolMaterial material; - private int tier; - private float baseDamage; - private String name; - - public ItemNeedle(String name, ToolMaterial material, int rarity, int tier) { - super(0F, material, Sets.newHashSet(new Block[] {})); - this.material = material; - this.name = name; - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.tier = tier; - setTextureName("minefantasy2:Tool/Crafting/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public Multimap getItemAttributeModifiers() { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", 0.5D, 0)); - - return map; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemNeedle setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemNeedle setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass > 0 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main) { - return CustomToolHelper.construct(this, main, null); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name)); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - public float getEfficiency(ItemStack item) { - return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); - } - - @Override - public int getTier(ItemStack item) { - return CustomToolHelper.getCrafterTier(item, tier); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - - // ====================================================== CUSTOM END - // ==============================================================\\ - @Override - public String getToolType(ItemStack item) { - return "needle"; - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } + protected int itemRarity; + private ToolMaterial material; + private int tier; + private float baseDamage; + private String name; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + + public ItemNeedle(String name, ToolMaterial material, int rarity, int tier) { + super(0F, material, Sets.newHashSet(new Block[]{})); + this.material = material; + this.name = name; + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.tier = tier; + setTextureName("minefantasy2:Tool/Crafting/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + @Override + public Multimap getItemAttributeModifiers() { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", 0.5D, 0)); + + return map; + } + + public ItemNeedle setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemNeedle setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass > 0 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main) { + return CustomToolHelper.construct(this, main, null); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name)); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + public float getEfficiency(ItemStack item) { + return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); + } + + @Override + public int getTier(ItemStack item) { + return CustomToolHelper.getCrafterTier(item, tier); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + // ====================================================== CUSTOM END + // ==============================================================\\ + @Override + public String getToolType(ItemStack item) { + return "needle"; + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java index d11b3514..a0172b97 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java @@ -20,105 +20,105 @@ * @author Anonymous Productions */ public class ItemPaintBrush extends ItemBasicCraftTool implements IRackItem { - public ItemPaintBrush(String name, int uses) { - super(name, "brush", 0, uses); - setCreativeTab(CreativeTabMF.tabCraftTool); - - // setTextureName("minefantasy2:Tool/Crafting/"+name); - // this.setUnlocalizedName(name); - // this.setMaxDamage(uses); - // setMaxStackSize(1); - this.setFull3D(); - } - - @Override - public ItemStack getContainerItem(ItemStack item) { - item.setItemDamage(item.getItemDamage() + 1); - return item.getItemDamage() >= item.getMaxDamage() ? null : item; - } - - @Override - public int getMaxDamage(ItemStack stack) { - return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); - } - - private boolean onUsedWithBlock(World world, int x, int y, int z, Block block, ItemStack item, EntityPlayer user) { - Block newBlock = null; - int meta = world.getBlockMetadata(x, y, z); - ItemStack output = PaintOilRecipe.getPaintResult(new ItemStack(block, 1, meta)); - if (output != null && output.getItem() instanceof ItemBlock) { - newBlock = Block.getBlockFromItem(output.getItem()); - if (output.getItemDamage() != OreDictionary.WILDCARD_VALUE) { - meta = output.getItemDamage(); - } - } - if (newBlock != null) { - world.playAuxSFXAtEntity(user, 2001, x, y, z, Block.getIdFromBlock(newBlock) + (meta << 12)); - - user.inventory.consumeInventoryItem(ComponentListMF.plant_oil); - ItemStack jug = new ItemStack(FoodListMF.jug_empty); - - if (!user.inventory.addItemStackToInventory(jug) && !world.isRemote) { - user.entityDropItem(jug, 0F); - } - if (world.isRemote) - return true; - - SkillList.construction.addXP(user, 1); - item.damageItem(1, user); - world.setBlock(x, y, z, newBlock); - world.setBlockMetadataWithNotify(x, y, z, meta, 2); - } - return false; - } - - @Override - public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int side, float f, - float f1, float f2) { - if (!ResearchLogic.hasInfoUnlocked(user, "paint_brush")) { - return false; - } - if (!user.canPlayerEdit(x, y, z, side, item)) { - return false; - } else if (!user.isSwingInProgress && user.inventory.hasItem(ComponentListMF.plant_oil)) { - Block block = world.getBlock(x, y, z); - return onUsedWithBlock(world, x, y, z, block, item, user); - } - return false; - } - - @Override - public float getScale(ItemStack itemstack) { - return 1.0F; - } - - @Override - public float getOffsetX(ItemStack itemstack) { - return 0; - } - - @Override - public float getOffsetY(ItemStack itemstack) { - return 9F / 16F; - } - - @Override - public float getOffsetZ(ItemStack itemstack) { - return 1F / 8F; - } - - @Override - public float getRotationOffset(ItemStack itemstack) { - return 90; - } - - @Override - public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { - return true; - } - - @Override - public boolean isSpecialRender(ItemStack item) { - return false; - } + public ItemPaintBrush(String name, int uses) { + super(name, "brush", 0, uses); + setCreativeTab(CreativeTabMF.tabCraftTool); + + // setTextureName("minefantasy2:Tool/Crafting/"+name); + // this.setUnlocalizedName(name); + // this.setMaxDamage(uses); + // setMaxStackSize(1); + this.setFull3D(); + } + + @Override + public ItemStack getContainerItem(ItemStack item) { + item.setItemDamage(item.getItemDamage() + 1); + return item.getItemDamage() >= item.getMaxDamage() ? null : item; + } + + @Override + public int getMaxDamage(ItemStack stack) { + return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); + } + + private boolean onUsedWithBlock(World world, int x, int y, int z, Block block, ItemStack item, EntityPlayer user) { + Block newBlock = null; + int meta = world.getBlockMetadata(x, y, z); + ItemStack output = PaintOilRecipe.getPaintResult(new ItemStack(block, 1, meta)); + if (output != null && output.getItem() instanceof ItemBlock) { + newBlock = Block.getBlockFromItem(output.getItem()); + if (output.getItemDamage() != OreDictionary.WILDCARD_VALUE) { + meta = output.getItemDamage(); + } + } + if (newBlock != null) { + world.playAuxSFXAtEntity(user, 2001, x, y, z, Block.getIdFromBlock(newBlock) + (meta << 12)); + + user.inventory.consumeInventoryItem(ComponentListMF.plant_oil); + ItemStack jug = new ItemStack(FoodListMF.jug_empty); + + if (!user.inventory.addItemStackToInventory(jug) && !world.isRemote) { + user.entityDropItem(jug, 0F); + } + if (world.isRemote) + return true; + + SkillList.construction.addXP(user, 1); + item.damageItem(1, user); + world.setBlock(x, y, z, newBlock); + world.setBlockMetadataWithNotify(x, y, z, meta, 2); + } + return false; + } + + @Override + public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int side, float f, + float f1, float f2) { + if (!ResearchLogic.hasInfoUnlocked(user, "paint_brush")) { + return false; + } + if (!user.canPlayerEdit(x, y, z, side, item)) { + return false; + } else if (!user.isSwingInProgress && user.inventory.hasItem(ComponentListMF.plant_oil)) { + Block block = world.getBlock(x, y, z); + return onUsedWithBlock(world, x, y, z, block, item, user); + } + return false; + } + + @Override + public float getScale(ItemStack itemstack) { + return 1.0F; + } + + @Override + public float getOffsetX(ItemStack itemstack) { + return 0; + } + + @Override + public float getOffsetY(ItemStack itemstack) { + return 9F / 16F; + } + + @Override + public float getOffsetZ(ItemStack itemstack) { + return 1F / 8F; + } + + @Override + public float getRotationOffset(ItemStack itemstack) { + return 90; + } + + @Override + public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { + return true; + } + + @Override + public boolean isSpecialRender(ItemStack item) { + return false; + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSaw.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSaw.java index 339362d2..e783a292 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSaw.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSaw.java @@ -1,12 +1,7 @@ package minefantasy.mf2.item.tool.crafting; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -32,254 +27,254 @@ import net.minecraft.util.IIcon; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemSaw extends ItemAxe implements IToolMaterial, IDamageType, IToolMF, IRackItem { - private float hitDamage; - private float baseDamage; - private String name; - private int tier; - - /** - */ - public ItemSaw(String name, ToolMaterial material, int rarity, int tier) { - super(material); - this.tier = tier; - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.hitDamage = (2.0F + material.getDamageVsEntity()) / 2F; - setTextureName("minefantasy2:Tool/Crafting/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - this.name = name; - this.setHarvestLevel("axe", material.getHarvestLevel()); - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - @Override - public Multimap getItemAttributeModifiers() { - Multimap multimap = super.getItemAttributeModifiers(); - multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Tool modifier", this.hitDamage, 0)); - return multimap; - } - - @Override - public float[] getDamageRatio(Object... implement) { - return new float[] { 1, 0, 0 }; - } - - @Override - public String getToolType(ItemStack item) { - return "saw"; - } - - @Override - public float getPenetrationLevel(Object implement) { - return 0.5F; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemSaw setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemSaw setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - @Override - public float getEfficiency(ItemStack item) { - return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); - } - - @Override - public int getTier(ItemStack item) { - return CustomToolHelper.getCrafterTier(item, tier); - } - - private float efficiencyMod = 1.0F; - - public ItemSaw setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); - } - - public float func_150893_a(ItemStack stack, Block block) { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ - - @Override - public float getScale(ItemStack itemstack) { - return 1.0F; - } - - @Override - public float getOffsetX(ItemStack itemstack) { - return 0; - } - - @Override - public float getOffsetY(ItemStack itemstack) { - return 9F / 16F; - } - - @Override - public float getOffsetZ(ItemStack itemstack) { - return 0; - } - - @Override - public float getRotationOffset(ItemStack itemstack) { - return 90F; - } - - @Override - public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { - return true; - } - - @Override - public boolean isSpecialRender(ItemStack item) { - return false; - } + protected int itemRarity; + private float hitDamage; + private float baseDamage; + private String name; + private int tier; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + /** + */ + public ItemSaw(String name, ToolMaterial material, int rarity, int tier) { + super(material); + this.tier = tier; + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.hitDamage = (2.0F + material.getDamageVsEntity()) / 2F; + setTextureName("minefantasy2:Tool/Crafting/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + this.name = name; + this.setHarvestLevel("axe", material.getHarvestLevel()); + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + @Override + public Multimap getItemAttributeModifiers() { + Multimap multimap = super.getItemAttributeModifiers(); + multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Tool modifier", this.hitDamage, 0)); + return multimap; + } + + @Override + public float[] getDamageRatio(Object... implement) { + return new float[]{1, 0, 0}; + } + + @Override + public String getToolType(ItemStack item) { + return "saw"; + } + + @Override + public float getPenetrationLevel(Object implement) { + return 0.5F; + } + + public ItemSaw setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemSaw setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + @Override + public float getEfficiency(ItemStack item) { + return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod); + } + + @Override + public int getTier(ItemStack item) { + return CustomToolHelper.getCrafterTier(item, tier); + } + + public ItemSaw setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ + + @Override + public float getScale(ItemStack itemstack) { + return 1.0F; + } + + @Override + public float getOffsetX(ItemStack itemstack) { + return 0; + } + + @Override + public float getOffsetY(ItemStack itemstack) { + return 9F / 16F; + } + + @Override + public float getOffsetZ(ItemStack itemstack) { + return 0; + } + + @Override + public float getRotationOffset(ItemStack itemstack) { + return 90F; + } + + @Override + public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { + return true; + } + + @Override + public boolean isSpecialRender(ItemStack item) { + return false; + } } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java index 32f97bce..038e6e30 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java @@ -1,13 +1,8 @@ package minefantasy.mf2.item.tool.crafting; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -31,215 +26,215 @@ import net.minecraft.util.IIcon; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemSpanner extends ItemTool implements IToolMaterial, IToolMF, IDamageType { - private ToolMaterial material; - private int tier; - private float baseDamage; - private String name; - - public ItemSpanner(String name, int rarity, int tier) { - super(2.0F, ToolMaterial.IRON, Sets.newHashSet(new Block[] {})); - this.material = ToolMaterial.IRON; - this.name = name; - itemRarity = rarity; - setCreativeTab(CreativeTabMF.tabOldTools); - this.setMaxDamage(material.getMaxUses() * 2); - this.tier = tier; - setTextureName("minefantasy2:Tool/Crafting/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - @Override - public String getToolType(ItemStack item) { - return "spanner"; - } - - @Override - public float[] getDamageRatio(Object... implement) { - return new float[] { 0, 1, 0 }; - } - - private void addSet(List list, Item[] items) { - for (Item item : items) { - list.add(new ItemStack(item)); - } - } - - @Override - public float getPenetrationLevel(Object implement) { - return 0F; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemSpanner setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemSpanner setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemSpanner setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getEfficiency(ItemStack item) { - return CustomToolHelper.getEfficiency(item, material.getEfficiencyOnProperMaterial(), efficiencyMod); - } - - @Override - public int getTier(ItemStack item) { - return CustomToolHelper.getCrafterTier(item, tier); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); - } - - public float func_150893_a(ItemStack stack, Block block) { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - // ====================================================== CUSTOM END - // ==============================================================\\ + protected int itemRarity; + private ToolMaterial material; + private int tier; + private float baseDamage; + private String name; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + private IIcon haftTex = null; + + public ItemSpanner(String name, int rarity, int tier) { + super(2.0F, ToolMaterial.IRON, Sets.newHashSet(new Block[]{})); + this.material = ToolMaterial.IRON; + this.name = name; + itemRarity = rarity; + setCreativeTab(CreativeTabMF.tabOldTools); + this.setMaxDamage(material.getMaxUses() * 2); + this.tier = tier; + setTextureName("minefantasy2:Tool/Crafting/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + @Override + public String getToolType(ItemStack item) { + return "spanner"; + } + + @Override + public float[] getDamageRatio(Object... implement) { + return new float[]{0, 1, 0}; + } + + private void addSet(List list, Item[] items) { + for (Item item : items) { + list.add(new ItemStack(item)); + } + } + + @Override + public float getPenetrationLevel(Object implement) { + return 0F; + } + + public ItemSpanner setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemSpanner setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemSpanner setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getEfficiency(ItemStack item) { + return CustomToolHelper.getEfficiency(item, material.getEfficiencyOnProperMaterial(), efficiencyMod); + } + + @Override + public int getTier(ItemStack item) { + return CustomToolHelper.getCrafterTier(item, tier); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java index d265bd33..c54e2350 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java @@ -1,13 +1,8 @@ package minefantasy.mf2.item.tool.crafting; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -36,174 +31,171 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemTongs extends ItemTool implements IToolMaterial, ISmithTongs { - private ToolMaterial material; - private float baseDamage; - private String name; - - public ItemTongs(String name, ToolMaterial material, int rarity) { - super(0F, material, Sets.newHashSet(new Block[] {})); - this.material = material; - itemRarity = rarity; - this.name = name; - setCreativeTab(CreativeTabMF.tabOldTools); - setTextureName("minefantasy2:Tool/Crafting/" + name); - this.setMaxDamage(getMaxDamage() / 5); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - } - - @Override - public Multimap getItemAttributeModifiers() { - Multimap map = HashMultimap.create(); - map.clear(); - - return map; - } - - @Override - public ToolMaterial getMaterial() { - return toolMaterial; - } - - @Override - public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - - if (movingobjectposition == null) { - return item; - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (!world.canMineBlock(player, i, j, k)) { - return item; - } - - if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { - return item; - } - - float water = TongsHelper.getWaterSource(world, i, j, k); - - if (TongsHelper.getHeldItem(item) != null && water >= 0) { - ItemStack drop = TongsHelper.getHeldItem(item).copy(), cooled = drop; - - if (TongsHelper.isCoolableItem(drop)) { - cooled = Heatable.getQuenchedItem(drop, water); - cooled.stackSize = drop.stackSize; - - player.playSound("random.splash", 1F, 1F); - player.playSound("random.fizz", 2F, 0.5F); - - for (int a = 0; a < 5; a++) { - world.spawnParticle("largesmoke", i + 0.5F, j + 1, k + 0.5F, 0, 0.065F, 0); - } - } - if (cooled != null && !world.isRemote) { - if (world.isAirBlock(i, j + 1, k)) { - EntityItem entity = new EntityItem(world, i + 0.5, j + 1, k + 0.5, cooled); - entity.delayBeforeCanPickup = 20; - entity.motionX = entity.motionY = entity.motionZ = 0F; - world.spawnEntityInWorld(entity); - } else { - player.entityDropItem(cooled, 0); - } - } - - return TongsHelper.clearHeldItem(item, player); - } - } - - return item; - } - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return true; - } - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemTongs setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/tool/" + s + "/" + name); - isCustom = true; - return this; - } - - public ItemTongs setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - private float efficiencyMod = 1.0F; - - public ItemTongs setEfficiencyMod(float efficiencyMod) { - this.efficiencyMod = efficiencyMod; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, 1.0F); - } - - private IIcon detailTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - } - super.registerIcons(reg); - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - ItemStack item = TongsHelper.getHeldItem(stack); - boolean hasHeld = item != null; - int baseLayer = hasHeld ? 1 : 0; - - if (hasHeld && pass == 0) { - return item.getItem().getIcon(item, pass); - } - if (!isCustom || pass == baseLayer && detailTex != null) { - return super.getIcon(stack, pass); - } - return detailTex != null ? detailTex : super.getIcon(stack, pass); - } - - @Override - public int getRenderPasses(int metadata) { - return 3; - } - /* + protected int itemRarity; + private ToolMaterial material; + private float baseDamage; + private String name; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private float efficiencyMod = 1.0F; + private IIcon detailTex = null; + + public ItemTongs(String name, ToolMaterial material, int rarity) { + super(0F, material, Sets.newHashSet(new Block[]{})); + this.material = material; + itemRarity = rarity; + this.name = name; + setCreativeTab(CreativeTabMF.tabOldTools); + setTextureName("minefantasy2:Tool/Crafting/" + name); + this.setMaxDamage(getMaxDamage() / 5); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + } + + @Override + public Multimap getItemAttributeModifiers() { + Multimap map = HashMultimap.create(); + map.clear(); + + return map; + } + + @Override + public ToolMaterial getMaterial() { + return toolMaterial; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); + + if (movingobjectposition == null) { + return item; + } else { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) { + return item; + } + + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, item)) { + return item; + } + + float water = TongsHelper.getWaterSource(world, i, j, k); + + if (TongsHelper.getHeldItem(item) != null && water >= 0) { + ItemStack drop = TongsHelper.getHeldItem(item).copy(), cooled = drop; + + if (TongsHelper.isCoolableItem(drop)) { + cooled = Heatable.getQuenchedItem(drop, water); + cooled.stackSize = drop.stackSize; + + player.playSound("random.splash", 1F, 1F); + player.playSound("random.fizz", 2F, 0.5F); + + for (int a = 0; a < 5; a++) { + world.spawnParticle("largesmoke", i + 0.5F, j + 1, k + 0.5F, 0, 0.065F, 0); + } + } + if (cooled != null && !world.isRemote) { + if (world.isAirBlock(i, j + 1, k)) { + EntityItem entity = new EntityItem(world, i + 0.5, j + 1, k + 0.5, cooled); + entity.delayBeforeCanPickup = 20; + entity.motionX = entity.motionY = entity.motionZ = 0F; + world.spawnEntityInWorld(entity); + } else { + player.entityDropItem(cooled, 0); + } + } + + return TongsHelper.clearHeldItem(item, player); + } + } + + return item; + } + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + public ItemTongs setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/tool/" + s + "/" + name); + isCustom = true; + return this; + } + + public ItemTongs setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + public ItemTongs setEfficiencyMod(float efficiencyMod) { + this.efficiencyMod = efficiencyMod; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + } + super.registerIcons(reg); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + ItemStack item = TongsHelper.getHeldItem(stack); + boolean hasHeld = item != null; + int baseLayer = hasHeld ? 1 : 0; + + if (hasHeld && pass == 0) { + return item.getItem().getIcon(item, pass); + } + if (!isCustom || pass == baseLayer && detailTex != null) { + return super.getIcon(stack, pass); + } + return detailTex != null ? detailTex : super.getIcon(stack, pass); + } + /* * @Override * * @SideOnly(Side.CLIENT) public IIcon getIcon(ItemStack stack, int renderPass) @@ -213,101 +205,104 @@ public int getRenderPasses(int metadata) { * renderPass); } return itemIcon; } */ - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - ItemStack held = TongsHelper.getHeldItem(item); - boolean hasHeld = held != null; - int baseLayer = hasHeld ? 1 : 0; - if (hasHeld) // Bottom Layer - { - if (layer == 0) { - return held.getItem().getColorFromItemStack(held, 0); - } - return CustomToolHelper.getColourFromItemStack(item, layer - 1, super.getColorFromItemStack(item, layer)); - } - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main) { - return CustomToolHelper.construct(this, main, null); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - public float getDigSpeed(ItemStack stack, Block block, int meta) { - if (!ForgeHooks.isToolEffective(stack, block, meta)) { - return this.func_150893_a(stack, block); - } - return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); - } - - public float func_150893_a(ItemStack stack, Block block) { - float base = super.func_150893_a(stack, block); - return base <= 1.0F ? base - : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); - } - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) { - return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); - } - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name)); - } - } - } else { - super.getSubItems(item, tab, list); - } - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - if (isCustom) { - CustomToolHelper.addInformation(item, list); - } else { - - ItemStack held = TongsHelper.getHeldItem(item); - if (held != null) { - list.add(""); - list.add(held.getItem().getItemStackDisplayName(held)); - held.getItem().addInformation(held, user, list, extra); - } - } - - super.addInformation(item, user, list, extra); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - - @Override - public boolean hitEntity(ItemStack item, EntityLivingBase target, EntityLivingBase user) { - return true; - } - // ====================================================== CUSTOM END - // ==============================================================\\ + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + ItemStack held = TongsHelper.getHeldItem(item); + boolean hasHeld = held != null; + int baseLayer = hasHeld ? 1 : 0; + if (hasHeld) // Bottom Layer + { + if (layer == 0) { + return held.getItem().getColorFromItemStack(held, 0); + } + return CustomToolHelper.getColourFromItemStack(item, layer - 1, super.getColorFromItemStack(item, layer)); + } + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main) { + return CustomToolHelper.construct(this, main, null); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) { + if (!ForgeHooks.isToolEffective(stack, block, meta)) { + return this.func_150893_a(stack, block); + } + return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); + } + + public float func_150893_a(ItemStack stack, Block block) { + float base = super.func_150893_a(stack, block); + return base <= 1.0F ? base + : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) { + return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name)); + } + } + } else { + super.getSubItems(item, tab, list); + } + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + if (isCustom) { + CustomToolHelper.addInformation(item, list); + } else { + + ItemStack held = TongsHelper.getHeldItem(item); + if (held != null) { + list.add(""); + list.add(held.getItem().getItemStackDisplayName(held)); + held.getItem().addInformation(held, user, list, extra); + } + } + + super.addInformation(item, user, list, extra); + } + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + @Override + public boolean hitEntity(ItemStack item, EntityLivingBase target, EntityLivingBase user) { + return true; + } + // ====================================================== CUSTOM END + // ==============================================================\\ } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemBattleaxeMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemBattleaxeMF.java index eb743343..b2f004a7 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemBattleaxeMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemBattleaxeMF.java @@ -17,177 +17,177 @@ * @author Anonymous Productions */ public class ItemBattleaxeMF extends ItemHeavyWeaponMF { - private float injuryChance = 0.05F; - - /** - * A battleaxe is a heavy counterpart to the waraxe, it does more damage and - * knockback, can also parry easier - */ - public ItemBattleaxeMF(String name, ToolMaterial material, int rarity, float weight) { - super(material, name, rarity, weight); - } - - @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, - boolean properHit) { - float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); - if (!(hit instanceof EntityLivingBase)) { - return damage; - } - EntityLivingBase target = (EntityLivingBase) hit; - - if (wielder.isSprinting()) { - if (wielder.fallDistance > 0 && canLunge(wielder) - && tryPerformAbility(wielder, lunge_cost, !properHit, true, true, true))// LUNGE: 20 Points - { - return chargeAt(wielder, target, true, damage, properHit); - } else if (wielder.onGround && getHeightGap(target, wielder) <= 0.5F - && tryPerformAbility(wielder, charge_cost))// CHARGE: 10 points - { - return chargeAt(wielder, target, false, damage, properHit); - } - } else if (wielder.fallDistance > 0 && !wielder.isOnLadder() && tryPerformAbility(wielder, jump_cost))// JUMP: 2 - // points - { - if (properHit) - brutalise(wielder, target, 1.0F); - return damage * 1.25F; - } - return damage; - } - - private float chargeAt(EntityLivingBase entityHitting, EntityLivingBase entityHit, boolean lunge, float dam, - boolean properHit) { - if (properHit) - brutalise(entityHitting, entityHit, 1.0F); - - if (lunge) { - float fallBonus = (Math.min(entityHitting.fallDistance, getMeleeDamage(entityHitting.getHeldItem()))) / 2F; - if (entityHit.onGround && !properHit) { - entityHitting.hurtResistantTime = 20; - TacticalManager.knockbackEntity(entityHit, entityHitting, 4F, 0.5F); - TacticalManager.lungeEntity(entityHitting, entityHit, 2F, 0.1F); - } - if (properHit) { - if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { - entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 400, 3)); - entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 1)); - } - - entityHitting.fallDistance -= fallBonus; - } - if (fallBonus > 0) { - dam += fallBonus; - } - } else { - if (properHit) { - if (entityHitting.onGround && entityHit.onGround && !properHit) { - entityHitting.hurtResistantTime = 20; - TacticalManager.lungeEntity(entityHitting, entityHit, 1F, 0.0F); - } - if (properHit) { - if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { - entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 3)); - entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 0)); - } - } - } - } - return dam * 1.25F; - } - - @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { - if (rand.nextFloat() < injuryChance) { - hit.getEntityData().setInteger(EventManagerMF.injuredNBT, 300 + rand.nextInt(1000)); - } - super.onProperHit(user, weapon, hit, dam); - } - - /** - * Determines if sprint-jump lunges work - */ - private boolean canLunge(EntityLivingBase entityHitting) { - return true; - } - - private double getHeightGap(EntityLivingBase entityHit, EntityLivingBase entityHitting) { - double a = entityHitting.posY - entityHit.posY; - return Math.max(a, -a); - } - - @Override - public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { - if (Items.iron_axe.getDigSpeed(itemstack, block, metadata) > 2.0F) { - return material.getEfficiencyOnProperMaterial() * 0.75F; - } - return super.getDigSpeed(itemstack, block, metadata); - } - - public static void brutalise(EntityLivingBase entityHitting, EntityLivingBase entityHit, float power) { - if (!entityHit.worldObj.isRemote) { - if (entityHitting instanceof EntityPlayer) { - ((EntityPlayer) entityHitting).onCriticalHit(entityHit); - } - } - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { - blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.75F); - return true; - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return super.modifyHitTime(user, item) + speedModAxe; - } - - @Override - public float getDamageModifier() { - return damageModAxe; - } - - @Override - protected float[] getWeaponRatio(ItemStack implement) { - return hvyHackingDamage; - } - - @Override - public float getPenetrationLevel(Object implement) { - return axeAPModifier; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return axeParryTime + heavyParryTime; - } - - @Override - protected float getStaminaMod() { - return heavyStaminaCost * axeStaminaCost; - } - - @Override - public WeaponClass getWeaponClass() { - return WeaponClass.AXE; - } - - @Override - public boolean canCounter() { - return true; - } - - @Override - public float[] getCounterRatio() { - return crushingDamage; - } - - @Override - public float getCounterDamage() { - return 0.5F; - } + private float injuryChance = 0.05F; + + /** + * A battleaxe is a heavy counterpart to the waraxe, it does more damage and + * knockback, can also parry easier + */ + public ItemBattleaxeMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + public static void brutalise(EntityLivingBase entityHitting, EntityLivingBase entityHit, float power) { + if (!entityHit.worldObj.isRemote) { + if (entityHitting instanceof EntityPlayer) { + ((EntityPlayer) entityHitting).onCriticalHit(entityHit); + } + } + } + + @Override + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); + if (!(hit instanceof EntityLivingBase)) { + return damage; + } + EntityLivingBase target = (EntityLivingBase) hit; + + if (wielder.isSprinting()) { + if (wielder.fallDistance > 0 && canLunge(wielder) + && tryPerformAbility(wielder, lunge_cost, !properHit, true, true, true))// LUNGE: 20 Points + { + return chargeAt(wielder, target, true, damage, properHit); + } else if (wielder.onGround && getHeightGap(target, wielder) <= 0.5F + && tryPerformAbility(wielder, charge_cost))// CHARGE: 10 points + { + return chargeAt(wielder, target, false, damage, properHit); + } + } else if (wielder.fallDistance > 0 && !wielder.isOnLadder() && tryPerformAbility(wielder, jump_cost))// JUMP: 2 + // points + { + if (properHit) + brutalise(wielder, target, 1.0F); + return damage * 1.25F; + } + return damage; + } + + private float chargeAt(EntityLivingBase entityHitting, EntityLivingBase entityHit, boolean lunge, float dam, + boolean properHit) { + if (properHit) + brutalise(entityHitting, entityHit, 1.0F); + + if (lunge) { + float fallBonus = (Math.min(entityHitting.fallDistance, getMeleeDamage(entityHitting.getHeldItem()))) / 2F; + if (entityHit.onGround && !properHit) { + entityHitting.hurtResistantTime = 20; + TacticalManager.knockbackEntity(entityHit, entityHitting, 4F, 0.5F); + TacticalManager.lungeEntity(entityHitting, entityHit, 2F, 0.1F); + } + if (properHit) { + if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { + entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 400, 3)); + entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 1)); + } + + entityHitting.fallDistance -= fallBonus; + } + if (fallBonus > 0) { + dam += fallBonus; + } + } else { + if (properHit) { + if (entityHitting.onGround && entityHit.onGround && !properHit) { + entityHitting.hurtResistantTime = 20; + TacticalManager.lungeEntity(entityHitting, entityHit, 1F, 0.0F); + } + if (properHit) { + if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { + entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 3)); + entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 0)); + } + } + } + } + return dam * 1.25F; + } + + @Override + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (rand.nextFloat() < injuryChance) { + hit.getEntityData().setInteger(EventManagerMF.injuredNBT, 300 + rand.nextInt(1000)); + } + super.onProperHit(user, weapon, hit, dam); + } + + /** + * Determines if sprint-jump lunges work + */ + private boolean canLunge(EntityLivingBase entityHitting) { + return true; + } + + private double getHeightGap(EntityLivingBase entityHit, EntityLivingBase entityHitting) { + double a = entityHitting.posY - entityHit.posY; + return Math.max(a, -a); + } + + @Override + public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { + if (Items.iron_axe.getDigSpeed(itemstack, block, metadata) > 2.0F) { + return material.getEfficiencyOnProperMaterial() * 0.75F; + } + return super.getDigSpeed(itemstack, block, metadata); + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.75F); + return true; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModAxe; + } + + @Override + public float getDamageModifier() { + return damageModAxe; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return hvyHackingDamage; + } + + @Override + public float getPenetrationLevel(Object implement) { + return axeAPModifier; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return axeParryTime + heavyParryTime; + } + + @Override + protected float getStaminaMod() { + return heavyStaminaCost * axeStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.AXE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return crushingDamage; + } + + @Override + public float getCounterDamage() { + return 0.5F; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemDagger.java b/src/main/java/minefantasy/mf2/item/weapon/ItemDagger.java index d639f41d..4acecae8 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemDagger.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemDagger.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.weapon; -import java.util.Random; - import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.api.weapon.WeaponClass; import net.minecraft.entity.Entity; @@ -9,121 +7,123 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemDagger extends ItemWeaponMF { - private Random rand = new Random(); - - /** - * Daggers are fast and weak weapons, but are fast and light - * - * These are for the fast player - */ - public ItemDagger(String name, ToolMaterial material, int rarity, float weight) { - super(material, name, rarity, weight); - } - - @Override - public boolean canBlock() { - return true; - } - - /** - * Determines if the weapon can parry - */ - @Override - public boolean canWeaponParry() { - return true; - } - - @Override - protected int getParryDamage(float dam) { - return 2; - } - - /** - * Gets the angle the weapon can parry - */ - @Override - public float getParryAngleModifier(EntityLivingBase user) { - return 0.75F; - } - - /** - * Gets the multiplier for the parry threshold - * - * @return - */ - @Override - public float getParryDamageModifier(EntityLivingBase user) { - return 0.5F; - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { - blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 1.65F + (rand.nextFloat() * 0.5F)); - return true; - } - - @Override - public float getDecayModifier(EntityLivingBase user, ItemStack item) { - return 0.5F; - } - - @Override - public float getRegenModifier(EntityLivingBase user, ItemStack item) { - return user.worldObj.difficultySetting.getDifficultyId() < 3 ? 1.5F : 1.0F; - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - if (!StaminaBar.isSystemActive || StaminaBar.isAnyStamina(user, false)) { - return speedModKatana; - } - return 0; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return daggerParryTime; - } - - @Override - protected float getStaminaMod() { - return daggerStaminaCost; - } - - @Override - public WeaponClass getWeaponClass() { - return WeaponClass.BLADE; - } - - @Override - public boolean canCounter() { - return true; - } - - @Override - public float[] getCounterRatio() { - return piercingDamage; - } - - @Override - protected float[] getWeaponRatio(ItemStack implement) { - return piercingDamage; - } - - @Override - public float getCounterDamage() { - return 1.5F; - } - - @Override - protected float getMeleeDamage(ItemStack item) { - return super.getMeleeDamage(item) / 2; - } + private Random rand = new Random(); + + /** + * Daggers are fast and weak weapons, but are fast and light + *

+ * These are for the fast player + */ + public ItemDagger(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { + return true; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } + + @Override + protected int getParryDamage(float dam) { + return 2; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 0.75F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return 0.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 1.65F + (rand.nextFloat() * 0.5F)); + return true; + } + + @Override + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 0.5F; + } + + @Override + public float getRegenModifier(EntityLivingBase user, ItemStack item) { + return user.worldObj.difficultySetting.getDifficultyId() < 3 ? 1.5F : 1.0F; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + if (!StaminaBar.isSystemActive || StaminaBar.isAnyStamina(user, false)) { + return speedModKatana; + } + return 0; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return daggerParryTime; + } + + @Override + protected float getStaminaMod() { + return daggerStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return piercingDamage; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return piercingDamage; + } + + @Override + public float getCounterDamage() { + return 1.5F; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) / 2; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemGreatswordMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemGreatswordMF.java index 6213e02f..91052351 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemGreatswordMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemGreatswordMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.weapon; -import java.util.Random; - import minefantasy.mf2.api.weapon.WeaponClass; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -9,120 +7,122 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemGreatswordMF extends ItemHeavyWeaponMF { - private Random rand = new Random(); - - /** - * Greatswords are heavy counterparts to swords, with added damage, knockback - * and parrying arc - */ - public ItemGreatswordMF(String name, ToolMaterial material, int rarity, float weight) { - super(material, name, rarity, weight); - } - - @Override - public boolean canBlock() { - return true; - } - - /** - * Determines if the weapon can parry - */ - @Override - public boolean canWeaponParry() { - return true; - } - - @Override - public boolean canWeaponEvade() { - return true; - } - - @Override - protected int getParryDamage(float dam) { - return 1; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(EntityLivingBase user) { - return 12; - } - - /** - * Gets the angle the weapon can parry - */ - @Override - public float getParryAngleModifier(EntityLivingBase user) { - return 1.5F; - } - - /** - * Gets the multiplier for the parry threshold - * - * @return - */ - @Override - public float getParryDamageModifier(EntityLivingBase user) { - return user instanceof EntityPlayer ? 3.0F : 1.5F; - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { - blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat() * 0.5F)); - return true; - } - - @Override - public float getBalance() { - return 0.5F; - } - - @Override - protected boolean canAnyMobParry() { - return true; - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return super.modifyHitTime(user, item) + speedModSword; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return swordParryTime + heavyParryTime; - } - - @Override - protected float getStaminaMod() { - return heavyStaminaCost * swordStaminaCost; - } - - @Override - public WeaponClass getWeaponClass() { - return WeaponClass.BLADE; - } - - @Override - public boolean canCounter() { - return true; - } - - @Override - public float[] getCounterRatio() { - return crushingDamage; - } - - @Override - public float getCounterDamage() { - return 0.5F; - } + private Random rand = new Random(); + + /** + * Greatswords are heavy counterparts to swords, with added damage, knockback + * and parrying arc + */ + public ItemGreatswordMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { + return true; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } + + @Override + public boolean canWeaponEvade() { + return true; + } + + @Override + protected int getParryDamage(float dam) { + return 1; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(EntityLivingBase user) { + return 12; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.5F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return user instanceof EntityPlayer ? 3.0F : 1.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat() * 0.5F)); + return true; + } + + @Override + public float getBalance() { + return 0.5F; + } + + @Override + protected boolean canAnyMobParry() { + return true; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSword; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return swordParryTime + heavyParryTime; + } + + @Override + protected float getStaminaMod() { + return heavyStaminaCost * swordStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return crushingDamage; + } + + @Override + public float getCounterDamage() { + return 0.5F; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemHalbeardMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemHalbeardMF.java index a92a79a9..da721db0 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemHalbeardMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemHalbeardMF.java @@ -9,95 +9,95 @@ * @author Anonymous Productions */ public class ItemHalbeardMF extends ItemSpearMF { - /** - * The halbeard is the heavy counterpart for the spear: It has increased damage, - * knockback distance and parry arc - * - * Halbeards use a swinging attack rather than a stab, but will still stab when - * sprinting - */ - public ItemHalbeardMF(String name, ToolMaterial material, int rarity, float weight) { - super(name, material, rarity, weight); - setMaxDamage(getMaxDamage() * 2); - } - - @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { - return false; - } - - @Override - public float getReachModifierInBlocks(ItemStack stack) { - return 3.0F; - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { - blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.7F); - return true; - } - - @Override - protected int getParryDamage(float dam) { - return (int) dam; - } - - /** - * Gets the angle the weapon can parry - */ - @Override - public float getParryAngleModifier(EntityLivingBase user) { - return user.isSneaking() ? 1.5F : 1.0F; - } - - @Override - public float getBalance() { - return 0.8F; - } - - @Override - protected float getKnockbackStrength() { - return 3.5F; - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return super.modifyHitTime(user, item) + speedModSpear; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return spearParryTime + heavyParryTime; - } - - @Override - protected float getStaminaMod() { - return heavyStaminaCost * spearStaminaCost; - } - - @Override - protected float[] getWeaponRatio(ItemStack implement, EntityLivingBase user) { - if (user.isSprinting()) { - return piercingDamage; - } - return getWeaponRatio(implement); - } - - @Override - protected float[] getWeaponRatio(ItemStack implement) { - return hvyHackingDamage; - } - - @Override - protected float getMeleeDamage(ItemStack item) { - return super.getMeleeDamage(item) * 1.5F; - } - - @Override - public float getScale(ItemStack itemstack) { - return 3.0F; - } + /** + * The halbeard is the heavy counterpart for the spear: It has increased damage, + * knockback distance and parry arc + *

+ * Halbeards use a swinging attack rather than a stab, but will still stab when + * sprinting + */ + public ItemHalbeardMF(String name, ToolMaterial material, int rarity, float weight) { + super(name, material, rarity, weight); + setMaxDamage(getMaxDamage() * 2); + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return false; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 3.0F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.7F); + return true; + } + + @Override + protected int getParryDamage(float dam) { + return (int) dam; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return user.isSneaking() ? 1.5F : 1.0F; + } + + @Override + public float getBalance() { + return 0.8F; + } + + @Override + protected float getKnockbackStrength() { + return 3.5F; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSpear; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return spearParryTime + heavyParryTime; + } + + @Override + protected float getStaminaMod() { + return heavyStaminaCost * spearStaminaCost; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement, EntityLivingBase user) { + if (user.isSprinting()) { + return piercingDamage; + } + return getWeaponRatio(implement); + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return hvyHackingDamage; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 1.5F; + } + + @Override + public float getScale(ItemStack itemstack) { + return 3.0F; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemHeavyWeaponMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemHeavyWeaponMF.java index ef6b731d..be01ac42 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemHeavyWeaponMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemHeavyWeaponMF.java @@ -8,115 +8,115 @@ public abstract class ItemHeavyWeaponMF extends ItemWeaponMF implements IExtendedReachWeapon { - /** - * Heavy weapons are larger varients of their own counterparts(sword, waraxe, - * mace and spear). These have 2x the durability, have a wider parry arc, and do - * 50% more damage. - * - * Heavy weapons weigh more and throw you off balance when used. - */ - public ItemHeavyWeaponMF(ToolMaterial material, String named, int rarity, float weight) { - super(material, named, rarity, weight); - setMaxDamage((int) (getMaxDamage() * 1.5F)); - } - - @Override - public boolean sheatheOnBack(ItemStack item) { - return true; - } - - @Override - public boolean isHeavyWeapon() { - return true; - } - - @Override - public boolean isOffhandHandDual(ItemStack off) { - return false; - } - - @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { - return false; - } - - public int getParryCooldown(EntityLivingBase user) { - return 18; - } - - /** - * Gets the angle the weapon can parry - */ - @Override - public float getParryAngleModifier(EntityLivingBase user) { - return 1.0F; - } - - @Override - public float getBalance() { - return 0.75F; - } - - @Override - protected float getKnockbackStrength() { - return 1.5F; - } - - @Override - public float getDecayModifier(EntityLivingBase user, ItemStack item) { - return 1.25F; - } - - @Override - protected boolean canAnyMobParry() { - return false; - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return super.modifyHitTime(user, item) + speedModHeavy; - } - - @Override - protected float[] getWeaponRatio(ItemStack implement) { - return hvySlashingDamage; - } - - @Override - public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { - return heavyParryFatigue; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return heavyParryTime; - } - - @Override - public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { - return 50; - } - - @Override - protected float getStaminaMod() { - return heavyStaminaCost; - } - - @Override - public float getReachModifierInBlocks(ItemStack stack) { - return 2.0F; - } - - @Override - protected float getMeleeDamage(ItemStack item) { - return super.getMeleeDamage(item) * 1.5F; - } - - @Override - public float getScale(ItemStack itemstack) { - return 2.0F; - } + /** + * Heavy weapons are larger varients of their own counterparts(sword, waraxe, + * mace and spear). These have 2x the durability, have a wider parry arc, and do + * 50% more damage. + *

+ * Heavy weapons weigh more and throw you off balance when used. + */ + public ItemHeavyWeaponMF(ToolMaterial material, String named, int rarity, float weight) { + super(material, named, rarity, weight); + setMaxDamage((int) (getMaxDamage() * 1.5F)); + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return true; + } + + @Override + public boolean isHeavyWeapon() { + return true; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return false; + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return false; + } + + public int getParryCooldown(EntityLivingBase user) { + return 18; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.0F; + } + + @Override + public float getBalance() { + return 0.75F; + } + + @Override + protected float getKnockbackStrength() { + return 1.5F; + } + + @Override + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 1.25F; + } + + @Override + protected boolean canAnyMobParry() { + return false; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModHeavy; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return hvySlashingDamage; + } + + @Override + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { + return heavyParryFatigue; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return heavyParryTime; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 50; + } + + @Override + protected float getStaminaMod() { + return heavyStaminaCost; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 2.0F; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 1.5F; + } + + @Override + public float getScale(ItemStack itemstack) { + return 2.0F; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemKatanaMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemKatanaMF.java index 7e7e047b..8b238398 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemKatanaMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemKatanaMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.weapon; -import java.util.Random; - import minefantasy.mf2.api.helpers.ArmourCalculator; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.api.weapon.WeaponClass; @@ -11,156 +9,158 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemKatanaMF extends ItemHeavyWeaponMF { - private Random rand = new Random(); - - /** - * Katanas are heavy counterparts to Tantos, unlike most heavy weapons: these - * act more like light-weapons - */ - public ItemKatanaMF(String name, ToolMaterial material, int rarity, float weight) { - super(material, name, rarity, weight); - } - - @Override - public boolean canBlock() { - return true; - } - - @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { - return true; - } - - /** - * Determines if the weapon can parry - */ - @Override - public boolean canWeaponParry() { - return true; - } - - @Override - protected int getParryDamage(float dam) { - return 1; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(EntityLivingBase user) { - return 8; - } - - /** - * Gets the angle the weapon can parry - */ - @Override - public float getParryAngleModifier(EntityLivingBase user) { - return 1.0F; - } - - /** - * Gets the multiplier for the parry threshold - * - * @return - */ - @Override - public float getParryDamageModifier(EntityLivingBase user) { - return 1.5F; - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { - blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 1.15F + (rand.nextFloat() * 0.5F)); - return true; - } - - @Override - public float getBalance() { - return 0.0F; - } - - @Override - public float getDecayModifier(EntityLivingBase user, ItemStack item) { - return 0.75F; - } - - @Override - public float getRegenModifier(EntityLivingBase user, ItemStack item) { - return user.worldObj.difficultySetting.getDifficultyId() < 3 ? 1.25F : 1.0F; - } - - @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { - if (user.motionY < 0 && !user.onGround && (!(user instanceof EntityPlayer) || user.isSneaking()) - && tryPerformAbility(user, cleave_cost)) { - hurtInRange(user, 4D); - if (hit instanceof EntityLivingBase) { - ArmourCalculator.damageArmour((EntityLivingBase) hit, (int) (dam * 10)); - } - user.setSneaking(false); - } - super.onProperHit(user, weapon, hit, dam); - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - if (!StaminaBar.isSystemActive || StaminaBar.isAnyStamina(user, false)) { - return speedModKatana; - } - return speedModHeavy / 2; - } - - @Override - public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { - return 1.0F; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return swordParryTime; - } - - @Override - protected float getStaminaMod() { - return katanaStaminaCost; - } - - @Override - public WeaponClass getWeaponClass() { - return WeaponClass.BLADE; - } - - @Override - protected float[] getWeaponRatio(ItemStack implement) { - return slashingDamage; - } - - @Override - public boolean canCounter() { - return true; - } - - @Override - public float[] getCounterRatio() { - return piercingDamage; - } - - @Override - public float getCounterDamage() { - return 1.5F; - } - - @Override - protected float getMeleeDamage(ItemStack item) { - return super.getMeleeDamage(item) * 0.5F; - } + private Random rand = new Random(); + + /** + * Katanas are heavy counterparts to Tantos, unlike most heavy weapons: these + * act more like light-weapons + */ + public ItemKatanaMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { + return true; + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return true; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } + + @Override + protected int getParryDamage(float dam) { + return 1; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(EntityLivingBase user) { + return 8; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.0F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return 1.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 1.15F + (rand.nextFloat() * 0.5F)); + return true; + } + + @Override + public float getBalance() { + return 0.0F; + } + + @Override + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 0.75F; + } + + @Override + public float getRegenModifier(EntityLivingBase user, ItemStack item) { + return user.worldObj.difficultySetting.getDifficultyId() < 3 ? 1.25F : 1.0F; + } + + @Override + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (user.motionY < 0 && !user.onGround && (!(user instanceof EntityPlayer) || user.isSneaking()) + && tryPerformAbility(user, cleave_cost)) { + hurtInRange(user, 4D); + if (hit instanceof EntityLivingBase) { + ArmourCalculator.damageArmour((EntityLivingBase) hit, (int) (dam * 10)); + } + user.setSneaking(false); + } + super.onProperHit(user, weapon, hit, dam); + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + if (!StaminaBar.isSystemActive || StaminaBar.isAnyStamina(user, false)) { + return speedModKatana; + } + return speedModHeavy / 2; + } + + @Override + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { + return 1.0F; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return swordParryTime; + } + + @Override + protected float getStaminaMod() { + return katanaStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return slashingDamage; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return piercingDamage; + } + + @Override + public float getCounterDamage() { + return 1.5F; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 0.5F; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemLance.java b/src/main/java/minefantasy/mf2/item/weapon/ItemLance.java index d30c23e7..970b0dbd 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemLance.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemLance.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.weapon; -import java.util.List; - import minefantasy.mf2.api.stamina.StaminaBar; import mods.battlegear2.api.shield.IShield; import net.minecraft.entity.Entity; @@ -11,115 +9,117 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemLance extends ItemSpearMF { - /** - */ - public ItemLance(String name, ToolMaterial material, int rarity, float weight) { - super(name, material, rarity, weight); - setMaxDamage(getMaxDamage() * 2); - } - - @Override - public void addInformation(ItemStack weapon, EntityPlayer user, List list, boolean extra) { - super.addInformation(weapon, user, list, extra); - - list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.modifier.plus." + 0, - decimal_format.format(getJoustDamage(weapon)), - StatCollector.translateToLocal("attribute.weapon.joustDam"))); - } - - @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { - return offhand == null || offhand.getItem() instanceof IShield; - } - - @Override - public float getReachModifierInBlocks(ItemStack stack) { - return 3.0F; - } - - @Override - protected float[] getWeaponRatio(ItemStack implement) { - return hvyPiercingDamage; - } - - @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, - boolean properHit) { - float dam = super.modifyDamage(item, wielder, hit, initialDam, properHit); - if (hit instanceof EntityLivingBase) { - return joust((EntityLivingBase) hit, wielder, dam); - } - return dam; - } - - @Override - public boolean canWeaponParry() { - return false; - } - - // Higher stamina means more precice hits: Full stamina hits are perfect - @Override - public float getBalance(EntityLivingBase user) { - if (StaminaBar.isSystemActive) { - return 0.0F + (2 * (1 - StaminaBar.getStaminaDecimal(user))); - } - return 0.0F; - } - - @Override - protected float getKnockbackStrength() { - return 5.0F; - } - - @Override - protected float getStaminaMod() { - return 5.0F; - } - - @Override - public boolean canBlock() { - return false; - } - - public float joust(EntityLivingBase target, EntityLivingBase attacker, float dam) { - float speedMod = 20F; - float speedCap = 5F; - - if (attacker.isRiding()) { - Entity mount = attacker.ridingEntity; - float speed = (float) Math.hypot(mount.motionX, mount.motionZ) * speedMod; - if (speed > speedCap) - speed = speedCap; - - dam += getJoustDamage(target.getHeldItem()) / speedCap * speed; - - if (attacker instanceof EntityPlayer) { - ((EntityPlayer) attacker).onCriticalHit(target); - } - - if (target.isRiding() && speed > (speedCap / 2F)) { - target.dismountEntity(target.ridingEntity); - target.mountEntity(null); - } - } - return dam; - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return super.modifyHitTime(user, item) + speedModSpear * 2; - } - - @Override - protected float getMeleeDamage(ItemStack item) { - return 2F; - } - - protected float getJoustDamage(ItemStack item) { - return super.getMeleeDamage(item) * 2.5F; - } + /** + */ + public ItemLance(String name, ToolMaterial material, int rarity, float weight) { + super(name, material, rarity, weight); + setMaxDamage(getMaxDamage() * 2); + } + + @Override + public void addInformation(ItemStack weapon, EntityPlayer user, List list, boolean extra) { + super.addInformation(weapon, user, list, extra); + + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.modifier.plus." + 0, + decimal_format.format(getJoustDamage(weapon)), + StatCollector.translateToLocal("attribute.weapon.joustDam"))); + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return offhand == null || offhand.getItem() instanceof IShield; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 3.0F; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return hvyPiercingDamage; + } + + @Override + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + float dam = super.modifyDamage(item, wielder, hit, initialDam, properHit); + if (hit instanceof EntityLivingBase) { + return joust((EntityLivingBase) hit, wielder, dam); + } + return dam; + } + + @Override + public boolean canWeaponParry() { + return false; + } + + // Higher stamina means more precice hits: Full stamina hits are perfect + @Override + public float getBalance(EntityLivingBase user) { + if (StaminaBar.isSystemActive) { + return 0.0F + (2 * (1 - StaminaBar.getStaminaDecimal(user))); + } + return 0.0F; + } + + @Override + protected float getKnockbackStrength() { + return 5.0F; + } + + @Override + protected float getStaminaMod() { + return 5.0F; + } + + @Override + public boolean canBlock() { + return false; + } + + public float joust(EntityLivingBase target, EntityLivingBase attacker, float dam) { + float speedMod = 20F; + float speedCap = 5F; + + if (attacker.isRiding()) { + Entity mount = attacker.ridingEntity; + float speed = (float) Math.hypot(mount.motionX, mount.motionZ) * speedMod; + if (speed > speedCap) + speed = speedCap; + + dam += getJoustDamage(target.getHeldItem()) / speedCap * speed; + + if (attacker instanceof EntityPlayer) { + ((EntityPlayer) attacker).onCriticalHit(target); + } + + if (target.isRiding() && speed > (speedCap / 2F)) { + target.dismountEntity(target.ridingEntity); + target.mountEntity(null); + } + } + return dam; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSpear * 2; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return 2F; + } + + protected float getJoustDamage(ItemStack item) { + return super.getMeleeDamage(item) * 2.5F; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemMaceMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemMaceMF.java index e325bf2f..9c07e471 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemMaceMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemMaceMF.java @@ -13,89 +13,89 @@ * @author Anonymous Productions */ public class ItemMaceMF extends ItemWeaponMF { - private float stunChance = 0.20F; - - /** - * The mace does the most damage Maces also have more durability - * - * These are for the player who just wants to hit stuff - */ - public ItemMaceMF(String name, ToolMaterial material, int rarity, float weight) { - super(material, name, rarity, weight); - this.setMaxDamage((int) (getMaxDamage() * 2F)); - } - - @Override - protected int getParryDamage(float dam) { - return (int) (dam * 2F); - } - - @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { - if (!user.worldObj.isRemote && user.getRNG().nextInt(5) == 0) { - if (hit instanceof EntityLivingBase) { - ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 1)); - } - } - super.onProperHit(user, weapon, hit, dam); - } - - @Override - public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { - return super.getDigSpeed(itemstack, block, metadata) * 1.5F; - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { - blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 1.0F); - return true; - } - - @Override - protected float getKnockbackStrength() { - return 1.5F; - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return super.modifyHitTime(user, item) + speedModMace; - } - - @Override - public float getDamageModifier() { - return damageModMace; - } - - @Override - protected float[] getWeaponRatio(ItemStack implement) { - return crushingDamage; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return maceParryTime; - } - - @Override - public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { - return 40; - } - - @Override - protected float getStaminaMod() { - return maceStaminaCost; - } - - @Override - public WeaponClass getWeaponClass() { - return WeaponClass.BLUNT; - } - - @Override - public boolean canCounter() { - return false; - } + private float stunChance = 0.20F; + + /** + * The mace does the most damage Maces also have more durability + *

+ * These are for the player who just wants to hit stuff + */ + public ItemMaceMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + this.setMaxDamage((int) (getMaxDamage() * 2F)); + } + + @Override + protected int getParryDamage(float dam) { + return (int) (dam * 2F); + } + + @Override + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (!user.worldObj.isRemote && user.getRNG().nextInt(5) == 0) { + if (hit instanceof EntityLivingBase) { + ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 1)); + } + } + super.onProperHit(user, weapon, hit, dam); + } + + @Override + public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { + return super.getDigSpeed(itemstack, block, metadata) * 1.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 1.0F); + return true; + } + + @Override + protected float getKnockbackStrength() { + return 1.5F; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModMace; + } + + @Override + public float getDamageModifier() { + return damageModMace; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return crushingDamage; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return maceParryTime; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 40; + } + + @Override + protected float getStaminaMod() { + return maceStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLUNT; + } + + @Override + public boolean canCounter() { + return false; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemSpearMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemSpearMF.java index c05400b0..75fedbb6 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemSpearMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemSpearMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.item.weapon; -import java.util.List; - import minefantasy.mf2.api.helpers.TacticalManager; import minefantasy.mf2.api.weapon.WeaponClass; import minefantasy.mf2.config.ConfigWeapon; @@ -15,165 +13,167 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +import java.util.List; + /** * @author Anonymous Productions */ public class ItemSpearMF extends ItemWeaponMF implements IExtendedReachWeapon { - /** - * The spear is for the defensive player, it has a long reach, knockback and can - * be thrown. Spears are good for keeping enemies at a distance, Parrying is - * easier when sneaking - * - * These are for the defensive player - */ - public ItemSpearMF(String name, ToolMaterial material, int rarity, float weight) { - super(material, name, rarity, weight); - } - - @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { - return offhand == null || offhand.getItem() instanceof IShield; - } - - @Override - public boolean isHeavyWeapon() { - return true; - } - - @Override - public boolean isOffhandHandDual(ItemStack off) { - return false; - } - - @Override - public boolean sheatheOnBack(ItemStack item) { - return true; - } - - @Override - public float getReachModifierInBlocks(ItemStack stack) { - return 3.0F; - } - - @Override - public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { - super.addInformation(item, user, list, extra); - - if (material != ToolMaterial.WOOD) { - list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( - "attribute.modifier.plus." + 0, decimal_format.format(getMountedDamage()), - StatCollector.translateToLocal("attribute.weapon.mountedBonus"))); - } - } - - @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, - boolean properHit) { - float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); - - if (!(hit instanceof EntityLivingBase) || this instanceof ItemLance) { - return damage; - } - EntityLivingBase target = (EntityLivingBase) hit; - - if (wielder.isRiding() && tryPerformAbility(wielder, charge_cost)) { - ItemWaraxeMF.brutalise(wielder, target, 1.0F); - return damage + getMountedDamage(); - } - if (!wielder.isRiding() && wielder.isSprinting()) { - if (this instanceof ItemHalbeardMF) { - return Math.max(damage / 1.25F, 1.0F); - } else { - return damage * 1.25F; - } - } - return damage; - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { - blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.8F); - return true; - } - - @Override - public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam) { - super.onParry(source, user, attacker, dam); - if (ConfigWeapon.useBalance && user instanceof EntityPlayer) { - TacticalManager.throwPlayerOffBalance((EntityPlayer) user, getBalance(), rand.nextBoolean()); - } - } - - private float getMountedDamage() { - if (material == ToolMaterial.WOOD) { - return 0; - } - return 4F; - } - - @Override - protected int getParryDamage(float dam) { - return (int) dam; - } - - /** - * Gets the angle the weapon can parry - */ - @Override - public float getParryAngleModifier(EntityLivingBase user) { - return user.isSneaking() ? 1.2F : 0.85F; - } - - @Override - public float getBalance() { - return 0.5F; - } - - @Override - protected float getKnockbackStrength() { - return 2.5F; - } - - @Override - protected boolean canAnyMobParry() { - return false; - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return super.modifyHitTime(user, item) + speedModSpear; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return spearParryTime; - } - - @Override - protected float getStaminaMod() { - return spearStaminaCost; - } - - @Override - public WeaponClass getWeaponClass() { - return WeaponClass.POLEARM; - } - - @Override - protected float[] getWeaponRatio(ItemStack implement) { - return piercingDamage; - } - - @Override - public boolean canCounter() { - return false; - } - - @Override - public float getScale(ItemStack itemstack) { - return 3.0F; - } + /** + * The spear is for the defensive player, it has a long reach, knockback and can + * be thrown. Spears are good for keeping enemies at a distance, Parrying is + * easier when sneaking + *

+ * These are for the defensive player + */ + public ItemSpearMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return offhand == null || offhand.getItem() instanceof IShield; + } + + @Override + public boolean isHeavyWeapon() { + return true; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return false; + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return true; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 3.0F; + } + + @Override + public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { + super.addInformation(item, user, list, extra); + + if (material != ToolMaterial.WOOD) { + list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( + "attribute.modifier.plus." + 0, decimal_format.format(getMountedDamage()), + StatCollector.translateToLocal("attribute.weapon.mountedBonus"))); + } + } + + @Override + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); + + if (!(hit instanceof EntityLivingBase) || this instanceof ItemLance) { + return damage; + } + EntityLivingBase target = (EntityLivingBase) hit; + + if (wielder.isRiding() && tryPerformAbility(wielder, charge_cost)) { + ItemWaraxeMF.brutalise(wielder, target, 1.0F); + return damage + getMountedDamage(); + } + if (!wielder.isRiding() && wielder.isSprinting()) { + if (this instanceof ItemHalbeardMF) { + return Math.max(damage / 1.25F, 1.0F); + } else { + return damage * 1.25F; + } + } + return damage; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.8F); + return true; + } + + @Override + public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam) { + super.onParry(source, user, attacker, dam); + if (ConfigWeapon.useBalance && user instanceof EntityPlayer) { + TacticalManager.throwPlayerOffBalance((EntityPlayer) user, getBalance(), rand.nextBoolean()); + } + } + + private float getMountedDamage() { + if (material == ToolMaterial.WOOD) { + return 0; + } + return 4F; + } + + @Override + protected int getParryDamage(float dam) { + return (int) dam; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return user.isSneaking() ? 1.2F : 0.85F; + } + + @Override + public float getBalance() { + return 0.5F; + } + + @Override + protected float getKnockbackStrength() { + return 2.5F; + } + + @Override + protected boolean canAnyMobParry() { + return false; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSpear; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return spearParryTime; + } + + @Override + protected float getStaminaMod() { + return spearStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.POLEARM; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return piercingDamage; + } + + @Override + public boolean canCounter() { + return false; + } + + @Override + public float getScale(ItemStack itemstack) { + return 3.0F; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java index ff9fe908..0781de2e 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java @@ -1,100 +1,100 @@ package minefantasy.mf2.item.weapon; -import java.util.Random; - import minefantasy.mf2.api.weapon.WeaponClass; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; +import java.util.Random; + /** * @author Anonymous Productions */ public class ItemSwordMF extends ItemWeaponMF { - private Random rand = new Random(); + private Random rand = new Random(); - /** - * Swords are the average weapon. They do regular damage and are extremely - * effective at parrying balancing both attack and defense - * - * These are for the average player - */ - public ItemSwordMF(String name, ToolMaterial material, int rarity, float weight) { - super(material, name, rarity, weight); - } + /** + * Swords are the average weapon. They do regular damage and are extremely + * effective at parrying balancing both attack and defense + *

+ * These are for the average player + */ + public ItemSwordMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } - @Override - public boolean canBlock() { - return true; - } + @Override + public boolean canBlock() { + return true; + } - /** - * Determines if the weapon can parry - */ - @Override - public boolean canWeaponParry() { - return true; - } + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } - @Override - protected int getParryDamage(float dam) { - return 1; - } + @Override + protected int getParryDamage(float dam) { + return 1; + } - /** - * Gets the angle the weapon can parry - */ - @Override - public float getParryAngleModifier(EntityLivingBase user) { - return 1.0F; - } + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.0F; + } - /** - * Gets the multiplier for the parry threshold - * - * @return - */ - @Override - public float getParryDamageModifier(EntityLivingBase user) { - return user instanceof EntityPlayer ? 2.0F : 1.5F; - } + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return user instanceof EntityPlayer ? 2.0F : 1.5F; + } - /** - * Determines if the weapon can do those cool ninja evades - * - * @return - */ - @Override - public boolean canWeaponEvade() { - return true; - } + /** + * Determines if the weapon can do those cool ninja evades + * + * @return + */ + @Override + public boolean canWeaponEvade() { + return true; + } - @Override - protected boolean canAnyMobParry() { - return true; - } + @Override + protected boolean canAnyMobParry() { + return true; + } - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return super.modifyHitTime(user, item) + speedModSword; - } + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSword; + } - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return swordParryTime; - } + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return swordParryTime; + } - @Override - protected float getStaminaMod() { - return swordStaminaCost; - } + @Override + protected float getStaminaMod() { + return swordStaminaCost; + } - @Override - public WeaponClass getWeaponClass() { - return WeaponClass.BLADE; - } + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemWaraxeMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemWaraxeMF.java index 67b679c8..eb00e749 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemWaraxeMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemWaraxeMF.java @@ -17,179 +17,179 @@ * @author Anonymous Productions */ public class ItemWaraxeMF extends ItemWeaponMF { - private float injuryChance = 0.05F; - - /** - * The waraxe is for brutal players. It does more damage and a higher bonus when - * sprinting or jumping. Waraxes are pure damage - * - * These are for the brutal player - */ - public ItemWaraxeMF(String name, ToolMaterial material, int rarity, float weight) { - super(material, name, rarity, weight); - } - - @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, - boolean properHit) { - float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); - if (!(hit instanceof EntityLivingBase)) { - return damage; - } - EntityLivingBase target = (EntityLivingBase) hit; - - if (wielder.isSprinting()) { - if (wielder.fallDistance > 0 && canLunge(wielder) - && tryPerformAbility(wielder, lunge_cost, !properHit, true, true, true))// LUNGE: 20 Points - { - return chargeAt(wielder, target, true, damage, properHit); - } else if (wielder.onGround && getHeightGap(target, wielder) <= 0.5F - && tryPerformAbility(wielder, charge_cost))// CHARGE: 10 points - { - return chargeAt(wielder, target, false, damage, properHit); - } - } else if (wielder.fallDistance > 0 && !wielder.isOnLadder() && tryPerformAbility(wielder, jump_cost))// JUMP: 2 - // points - { - if (properHit) - brutalise(wielder, target, 1.0F); - return damage * 1.25F; - } - return damage; - } - - private float chargeAt(EntityLivingBase entityHitting, EntityLivingBase entityHit, boolean lunge, float dam, - boolean properHit) { - if (properHit) - brutalise(entityHitting, entityHit, 1.0F); - - if (lunge) { - float fallBonus = (Math.min(entityHitting.fallDistance, getMeleeDamage(entityHitting.getHeldItem()))) / 2F; - if (entityHit.onGround && !properHit) { - entityHitting.hurtResistantTime = 20; - TacticalManager.knockbackEntity(entityHit, entityHitting, 4F, 0.5F); - TacticalManager.lungeEntity(entityHitting, entityHit, 2F, 0.1F); - } - if (properHit) { - if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { - entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 400, 3)); - entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 1)); - } - - entityHitting.fallDistance -= fallBonus; - } - if (fallBonus > 0) { - dam += fallBonus; - } - } else { - if (properHit) { - if (entityHitting.onGround && entityHit.onGround && !properHit) { - entityHitting.hurtResistantTime = 20; - TacticalManager.lungeEntity(entityHitting, entityHit, 1F, 0.0F); - } - if (properHit) { - if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { - entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 3)); - entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 0)); - } - } - } - } - return dam * 1.25F; - } - - @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { - if (rand.nextFloat() < injuryChance && dam > 0) { - hit.getEntityData().setInteger(EventManagerMF.injuredNBT, 200 + rand.nextInt(600)); - } - super.onProperHit(user, weapon, hit, dam); - } - - /** - * Determines if sprint-jump lunges work - */ - private boolean canLunge(EntityLivingBase entityHitting) { - return true; - } - - private double getHeightGap(EntityLivingBase entityHit, EntityLivingBase entityHitting) { - double a = entityHitting.posY - entityHit.posY; - return Math.max(a, -a); - } - - @Override - public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { - if (Items.iron_axe.getDigSpeed(itemstack, block, metadata) > 2.0F) { - return material.getEfficiencyOnProperMaterial() * 0.75F; - } - return super.getDigSpeed(itemstack, block, metadata); - } - - public static void brutalise(EntityLivingBase entityHitting, EntityLivingBase entityHit, float power) { - if (!entityHit.worldObj.isRemote) { - if (entityHitting instanceof EntityPlayer) { - ((EntityPlayer) entityHitting).onCriticalHit(entityHit); - } - } - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { - blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 1.0F); - return true; - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return super.modifyHitTime(user, item) + speedModAxe; - } - - @Override - public float getDamageModifier() { - return damageModAxe; - } - - @Override - protected float[] getWeaponRatio(ItemStack implement) { - return hackingDamage; - } - - @Override - public float getPenetrationLevel(Object implement) { - return axeAPModifier; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return axeParryTime; - } - - @Override - protected float getStaminaMod() { - return axeStaminaCost; - } - - @Override - public WeaponClass getWeaponClass() { - return WeaponClass.AXE; - } - - @Override - public boolean canCounter() { - return true; - } - - @Override - public float[] getCounterRatio() { - return piercingDamage; - } - - @Override - public float getCounterDamage() { - return 1.0F; - } + private float injuryChance = 0.05F; + + /** + * The waraxe is for brutal players. It does more damage and a higher bonus when + * sprinting or jumping. Waraxes are pure damage + *

+ * These are for the brutal player + */ + public ItemWaraxeMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + public static void brutalise(EntityLivingBase entityHitting, EntityLivingBase entityHit, float power) { + if (!entityHit.worldObj.isRemote) { + if (entityHitting instanceof EntityPlayer) { + ((EntityPlayer) entityHitting).onCriticalHit(entityHit); + } + } + } + + @Override + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); + if (!(hit instanceof EntityLivingBase)) { + return damage; + } + EntityLivingBase target = (EntityLivingBase) hit; + + if (wielder.isSprinting()) { + if (wielder.fallDistance > 0 && canLunge(wielder) + && tryPerformAbility(wielder, lunge_cost, !properHit, true, true, true))// LUNGE: 20 Points + { + return chargeAt(wielder, target, true, damage, properHit); + } else if (wielder.onGround && getHeightGap(target, wielder) <= 0.5F + && tryPerformAbility(wielder, charge_cost))// CHARGE: 10 points + { + return chargeAt(wielder, target, false, damage, properHit); + } + } else if (wielder.fallDistance > 0 && !wielder.isOnLadder() && tryPerformAbility(wielder, jump_cost))// JUMP: 2 + // points + { + if (properHit) + brutalise(wielder, target, 1.0F); + return damage * 1.25F; + } + return damage; + } + + private float chargeAt(EntityLivingBase entityHitting, EntityLivingBase entityHit, boolean lunge, float dam, + boolean properHit) { + if (properHit) + brutalise(entityHitting, entityHit, 1.0F); + + if (lunge) { + float fallBonus = (Math.min(entityHitting.fallDistance, getMeleeDamage(entityHitting.getHeldItem()))) / 2F; + if (entityHit.onGround && !properHit) { + entityHitting.hurtResistantTime = 20; + TacticalManager.knockbackEntity(entityHit, entityHitting, 4F, 0.5F); + TacticalManager.lungeEntity(entityHitting, entityHit, 2F, 0.1F); + } + if (properHit) { + if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { + entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 400, 3)); + entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 1)); + } + + entityHitting.fallDistance -= fallBonus; + } + if (fallBonus > 0) { + dam += fallBonus; + } + } else { + if (properHit) { + if (entityHitting.onGround && entityHit.onGround && !properHit) { + entityHitting.hurtResistantTime = 20; + TacticalManager.lungeEntity(entityHitting, entityHit, 1F, 0.0F); + } + if (properHit) { + if (!entityHit.isPotionActive(Potion.moveSlowdown.id)) { + entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 3)); + entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 0)); + } + } + } + } + return dam * 1.25F; + } + + @Override + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (rand.nextFloat() < injuryChance && dam > 0) { + hit.getEntityData().setInteger(EventManagerMF.injuredNBT, 200 + rand.nextInt(600)); + } + super.onProperHit(user, weapon, hit, dam); + } + + /** + * Determines if sprint-jump lunges work + */ + private boolean canLunge(EntityLivingBase entityHitting) { + return true; + } + + private double getHeightGap(EntityLivingBase entityHit, EntityLivingBase entityHitting) { + double a = entityHitting.posY - entityHit.posY; + return Math.max(a, -a); + } + + @Override + public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { + if (Items.iron_axe.getDigSpeed(itemstack, block, metadata) > 2.0F) { + return material.getEfficiencyOnProperMaterial() * 0.75F; + } + return super.getDigSpeed(itemstack, block, metadata); + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 1.0F); + return true; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModAxe; + } + + @Override + public float getDamageModifier() { + return damageModAxe; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return hackingDamage; + } + + @Override + public float getPenetrationLevel(Object implement) { + return axeAPModifier; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return axeParryTime; + } + + @Override + protected float getStaminaMod() { + return axeStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.AXE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return piercingDamage; + } + + @Override + public float getCounterDamage() { + return 1.0F; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemWarhammerMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemWarhammerMF.java index 3ce9d070..5c7df404 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemWarhammerMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemWarhammerMF.java @@ -14,93 +14,93 @@ * @author Anonymous Productions */ public class ItemWarhammerMF extends ItemHeavyWeaponMF { - private float stunChance = 0.20F; - - /** - * Warhammers are heavy counterparts to maces: They have more damage and - * knockback - * - * They can also strike heavy forces, being rather satisfying - */ - public ItemWarhammerMF(String name, ToolMaterial material, int rarity, float weight) { - super(material, name, rarity, weight); - this.setMaxDamage((int) (getMaxDamage() * 2F)); - } - - @Override - protected int getParryDamage(float dam) { - return (int) (dam * 2F); - } - - @Override - public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { - return super.getDigSpeed(itemstack, block, metadata) * 1.5F; - } - - @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { - if (!user.worldObj.isRemote && user.getRNG().nextInt(5) == 0) { - hit.worldObj.createExplosion(user, hit.posX, hit.posY, hit.posZ, 0.0F, false); - TacticalManager.knockbackEntity(hit, user, 2.0F, 1.5F); - if (hit instanceof EntityLivingBase) { - ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 10)); - ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 1)); - } - } - super.onProperHit(user, weapon, hit, dam); - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { - blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.75F); - return true; - } - - @Override - protected float getKnockbackStrength() { - return 2.0F; - } - - @Override - protected float getStaminaMod() { - return heavyStaminaCost * maceStaminaCost; - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return super.modifyHitTime(user, item) + speedModMace; - } - - @Override - public float getDamageModifier() { - return damageModMace; - } - - @Override - protected float[] getWeaponRatio(ItemStack implement) { - return crushingDamage; - } - - /** - * gets the time after being hit your guard will be let down - */ - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return maceParryTime + heavyParryTime; - } - - @Override - public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { - return 80; - } - - @Override - public WeaponClass getWeaponClass() { - return WeaponClass.BLUNT; - } - - @Override - public boolean canCounter() { - return false; - } + private float stunChance = 0.20F; + + /** + * Warhammers are heavy counterparts to maces: They have more damage and + * knockback + *

+ * They can also strike heavy forces, being rather satisfying + */ + public ItemWarhammerMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + this.setMaxDamage((int) (getMaxDamage() * 2F)); + } + + @Override + protected int getParryDamage(float dam) { + return (int) (dam * 2F); + } + + @Override + public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { + return super.getDigSpeed(itemstack, block, metadata) * 1.5F; + } + + @Override + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (!user.worldObj.isRemote && user.getRNG().nextInt(5) == 0) { + hit.worldObj.createExplosion(user, hit.posX, hit.posY, hit.posZ, 0.0F, false); + TacticalManager.knockbackEntity(hit, user, 2.0F, 1.5F); + if (hit instanceof EntityLivingBase) { + ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 10)); + ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 1)); + } + } + super.onProperHit(user, weapon, hit, dam); + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.75F); + return true; + } + + @Override + protected float getKnockbackStrength() { + return 2.0F; + } + + @Override + protected float getStaminaMod() { + return heavyStaminaCost * maceStaminaCost; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModMace; + } + + @Override + public float getDamageModifier() { + return damageModMace; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return crushingDamage; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return maceParryTime + heavyParryTime; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 80; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLUNT; + } + + @Override + public boolean canCounter() { + return false; + } } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java index c8ce84b8..d10c6560 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java @@ -1,14 +1,7 @@ package minefantasy.mf2.item.weapon; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -22,17 +15,8 @@ import minefantasy.mf2.api.stamina.IStaminaWeapon; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.api.tier.IToolMaterial; -import minefantasy.mf2.api.weapon.IDamageModifier; -import minefantasy.mf2.api.weapon.IDamageType; -import minefantasy.mf2.api.weapon.IKnockbackWeapon; -import minefantasy.mf2.api.weapon.IParryable; -import minefantasy.mf2.api.weapon.IPowerAttack; -import minefantasy.mf2.api.weapon.IRackItem; -import minefantasy.mf2.api.weapon.ISpecialCombatMob; +import minefantasy.mf2.api.weapon.*; import minefantasy.mf2.api.weapon.ISpecialEffect; -import minefantasy.mf2.api.weapon.IWeaponClass; -import minefantasy.mf2.api.weapon.IWeaponSpeed; -import minefantasy.mf2.api.weapon.IWeightedWeapon; import minefantasy.mf2.block.tileentity.decor.TileEntityRack; import minefantasy.mf2.config.ConfigWeapon; import minefantasy.mf2.item.list.CreativeTabMF; @@ -41,12 +25,7 @@ import minefantasy.mf2.material.BaseMaterialMF; import minefantasy.mf2.util.MFLogUtil; import mods.battlegear2.api.PlayerEventChild.OffhandAttackEvent; -import mods.battlegear2.api.weapons.IBackStabbable; -import mods.battlegear2.api.weapons.IBattlegearWeapon; -import mods.battlegear2.api.weapons.IExtendedReachWeapon; -import mods.battlegear2.api.weapons.IHitTimeModifier; -import mods.battlegear2.api.weapons.IPenetrateWeapon; -import mods.battlegear2.api.weapons.WeaponRegistry; +import mods.battlegear2.api.weapons.*; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -65,789 +44,772 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; +import net.minecraft.util.*; import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + //Made this extend the sword class (allows them to be enchanted) public abstract class ItemWeaponMF extends ItemSword implements ISpecialDesign, IPowerAttack, IDamageType, - IKnockbackWeapon, IWeaponSpeed, IHeldStaminaItem, IStaminaWeapon, IBattlegearWeapon, IToolMaterial, - IWeightedWeapon, IParryable, ISpecialEffect, IDamageModifier, IWeaponClass, IRackItem { - public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); - - protected final ToolMaterial material; - protected String name; - /** - * The damage of the weapon without material modifiers - */ - private float baseDamage; - protected Random rand = new Random(); - - protected float lunge_cost = 25; - protected float charge_cost = 10; - protected float jump_cost = 2; - - protected float cleave_cost = 40; - - /** - * The base file for Weapons in MineFantasy - * - * Size Varients, (Normal and Heavy) Normal weapons are as is, regular damage - * and weight Heavy weapons do more damage, exhaust more and have balance offset - * (+50% dam) - * - * Weapon Types: Blade: Parry Defensive, average damage and speed Axe: Brutal - * Offensive, slower than sword, more damage, Good against Armour Blunt: Simple - * Offensive, slower than axe, more damage, Good against Medium Armour Polearm: - * Ranged Defensive, Good against Heavy Armour Lightblade: Fast Offensive, - * Better against Unarmoured - */ - public ItemWeaponMF(ToolMaterial material, String named, int rarity, float weight) { - super(material); - materialWeight = weight; - itemRarity = rarity; - // May be unsafe, but will allow others to add weapons using custom materials - // (also more efficent) - name = named; - this.material = material; - setCreativeTab(CreativeTabMF.tabOldTools); - setTextureName("minefantasy2:Weapon/" + name); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setUnlocalizedName(name); - - this.baseDamage = 4 + getDamageModifier(); - - if (material == ToolMaterial.WOOD) { - baseDamage = 0F; - } - if (isHeavyWeapon()) { - WeaponRegistry.addTwoHanded(new ItemStack(this)); - } else { - WeaponRegistry.addDualWeapon(new ItemStack(this)); - } - } - - /** - * Gets the amount more damaged added to each item - */ - public float getDamageModifier() { - return 0; - } - - /** - * Determines if the item can block/parry - */ - public boolean canBlock() { - return true; - } - - /** - * Determines if the weapon can parry - */ - public boolean canWeaponParry() { - return true; - } - - /** - * Gets the angle the weapon can parry - */ - public float getParryAngleModifier(EntityLivingBase user) { - return 0.75F; - } - - /** - * Gets the multiplier for the parry threshold - * - * @return - */ - public float getParryDamageModifier(EntityLivingBase user) { - return 1.0F; - } - - /** - * Determines if the weapon can do those cool ninja evades - * - * @return - */ - public boolean canWeaponEvade() { - return true; - } - - // MECHANICS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - @Override - public ToolMaterial getMaterial() { - return this.material; - } - - @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack weapon, EntityPlayer user, List list, boolean extra) { - super.addInformation(weapon, user, list, extra); - - if (material == ToolMaterial.WOOD) { - return; - } - - if (isCustom) { - CustomToolHelper.addInformation(weapon, list); - } - - if (this instanceof IExtendedReachWeapon || this instanceof IPenetrateWeapon - || this instanceof IHitTimeModifier) { - list.add(""); - - if (this instanceof IPenetrateWeapon) { - list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( - "attribute.modifier.plus." + 1, decimal_format.format(getAPDamText()), - StatCollector.translateToLocal("attribute.weapon.penetrateArmor"))); - } - - if (this instanceof IExtendedReachWeapon) { - float reach = ((IExtendedReachWeapon) this).getReachModifierInBlocks(weapon); - - if (reach > 0) { - list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( - "attribute.modifier.plus." + 0, decimal_format.format(reach), - StatCollector.translateToLocal("attribute.weapon.extendedReach"))); - } else { - list.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted( - "attribute.modifier.take." + 0, decimal_format.format(-1 * reach), - StatCollector.translateToLocal("attribute.weapon.extendedReach"))); - } - } - - if (this instanceof IHitTimeModifier) { - int hitMod = ((IHitTimeModifier) this).getHitTime(weapon, null); - if (hitMod > 0) { - list.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted( - "attribute.modifier.take." + 1, decimal_format.format(hitMod / 10F * 100), - StatCollector.translateToLocal("attribute.weapon.attackSpeed"))); - } else { - list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( - "attribute.modifier.plus." + 1, decimal_format.format(-(float) hitMod / 10F * 100), - StatCollector.translateToLocal("attribute.weapon.attackSpeed"))); - } - } - - if (this instanceof IBackStabbable) { - list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("attribute.weapon.backstab")); - - } - } - } - - protected float getAPDamText() { - return 0F; - } - - @Override - public boolean sheatheOnBack(ItemStack item) { - return isHeavyWeapon(); - } - - public boolean isHeavyWeapon() { - return false; - } - - @Override - public boolean isOffhandHandDual(ItemStack off) { - return true; - } - - @Override - public boolean offhandAttackEntity(OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) { - return true; - } - - @Override - public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { - return true; - } - - @Override - public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { - return true; - } - - @Override - public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem) { - } - - @Override - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { - return offhand != null; - } - - protected void addXp(EntityLivingBase user, int chance) { - if (ConfigWeapon.xpTrain && user instanceof EntityPlayer && material == ToolMaterial.WOOD) { - if (chance == 0 || user.getRNG().nextInt(chance) == 0) { - ((EntityPlayer) user).addExperience(1); - } - } - } - - public static int getParry(ItemStack item) { - if (item.hasTagCompound()) { - if (item.getTagCompound().hasKey("ParryAnimation")) { - return item.getTagCompound().getInteger("ParryAnimation"); - } - } - return -1; - } - - public static void setParry(ItemStack item, int i) { - NBTTagCompound nbt = getOrCreateNBT(item); - - nbt.setInteger("ParryAnimation", i); - } - - public static NBTTagCompound getOrCreateNBT(ItemStack item) { - if (!item.hasTagCompound()) { - item.setTagCompound(new NBTTagCompound()); - } - return item.getTagCompound(); - } - - @Override - public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam) { - ItemStack weapon = user.getHeldItem(); - int pd = getParryDamage(dam); - if (pd > 0) { - weapon.damageItem(pd, user); - } - - addXp(user, 30); - } - - /** - * Gets the amount of durability lost when parrying - */ - protected int getParryDamage(float dam) { - return (int) dam; - } - - @Override - public float getMaxDamageParry(EntityLivingBase user, ItemStack weapon) { - float mod = 1.0F; - return getMeleeDamage(weapon) * getParryDamageModifier(user) * mod; - } - - @Override - public float getParryAngle(DamageSource source, EntityLivingBase blocker, ItemStack item) { - float base = 30; - - if (source.isProjectile()) { - if (!(blocker instanceof EntityPlayer)) { - base = 0F; - } - base *= 0.25F; - } - if (blocker instanceof EntityZombie && !(blocker instanceof EntityPigZombie)) { - base *= 2; - } - return base * getParryAngleModifier(blocker); - } - - @Override - public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { - if (ConfigWeapon.xpTrain && user instanceof EntityLivingBase && material == ToolMaterial.WOOD) { - addXp(user, 50); - } - } - - protected float getKnockbackStrength() { - return 0; - } - - @Override - public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { - if (material == ToolMaterial.WOOD) { - blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 1.0F); - return true; - } - if (material == BaseMaterialMF.stone.getToolConversion()) { - blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.5F); - return true; - } - return false; - } - - @Override - public boolean canParry(DamageSource source, EntityLivingBase blocker, ItemStack item) { - return canWeaponParry(); - } - - @Override - public float getBalance(EntityLivingBase user) { - return getBalance(); - } - - public float getBalance() { - return 0.0F; - } - - @Override - public float getStaminaDrainOnHit(EntityLivingBase user, ItemStack item) { - return 2F * getStaminaMod() * getWeightModifier(item); - } - - protected float getStaminaMod() { - return 1.0F; - } - - public static boolean canPerformAbility(EntityLivingBase user, float points) { - return tryPerformAbility(user, points, false, true, true, false); - } - - public static boolean tryPerformAbility(EntityLivingBase user, float points) { - return tryPerformAbility(user, points, true, true); - } - - public static boolean tryPerformAbility(EntityLivingBase user, float points, boolean armour, boolean weapon) { - return tryPerformAbility(user, points, true, armour, weapon, true); - } - - public static boolean tryPerformAbility(EntityLivingBase user, float points, boolean flash, boolean armour, - boolean weapon, boolean takePoints) { - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { - points *= StaminaBar.getBaseDecayModifier(user, armour, weapon); - if (StaminaBar.isStaminaAvailable(user, points, flash)) { - if (takePoints && !user.worldObj.isRemote) { - applyFatigue(user, points); - } - return true; - } else { - return false; - } - } - return true; - } - - public static void applyFatigue(EntityLivingBase user, float points) { - applyFatigue(user, points, 50F); - } - - public static void applyFatigue(EntityLivingBase user, float points, float pause) { - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { - float stam = StaminaBar.getStaminaValue(user); - if (stam > 0) { - StaminaBar.modifyStaminaValue(user, -points); - } - StaminaBar.setIdleTime(user, pause * StaminaBar.pauseModifier); - - if (!user.worldObj.isRemote) { - MFLogUtil.logDebug("Spent " + points + " Stamina Pts"); - } - } - } - - @Override - public float getDecayMod(EntityLivingBase user, ItemStack item) { - return getDecayModifier(user, item) * getWeightModifier(item); - } - - /** - * The Modifier for the weapon - */ - public float getDecayModifier(EntityLivingBase user, ItemStack item) { - return 1.0F; - } - - @Override - public float getRegenModifier(EntityLivingBase user, ItemStack item) { - return 1.0F; - } - - @Override - public float getIdleModifier(EntityLivingBase user, ItemStack item) { - return 1.0F; - } - - protected void hurtInRange(EntityLivingBase user, double range) { - AxisAlignedBB bb = user.boundingBox.expand(range, range, range); - List hurt = user.worldObj.getEntitiesWithinAABBExcludingEntity(user, bb); - Iterator list = hurt.iterator(); - while (list.hasNext()) { - Entity hit = (Entity) list.next(); - - if (user.canEntityBeSeen(hit)) { - TacticalManager.knockbackEntity(hit, user, 1.5F, 0.2F); - if (StaminaBar.isSystemActive) { - StaminaBar.setIdleTime(user, 60); - } - if (hit instanceof EntityLivingBase) { - for (int a = 0; a < 4; a++) { - hit.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(Blocks.redstone_block) + "_0", - hit.posX, hit.posY + hit.getEyeHeight(), hit.posZ, rand.nextDouble() / 2D, - rand.nextDouble() / 2D, rand.nextDouble() / 2D); - } - ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 0)); - } - } - } - } - - @Override - public boolean canUserParry(EntityLivingBase user) { - return user instanceof EntityPlayer || user instanceof ISpecialCombatMob - || (canAnyMobParry() || rand.nextFloat() < 0.20F); - } - - protected boolean canAnyMobParry() { - return false; - } - - @Override - public float getAddedKnockback(EntityLivingBase user, ItemStack item) { - return getKnockbackStrength(); - } - - @Override - public int modifyHitTime(EntityLivingBase user, ItemStack item) { - return 0; - } - - @Override - public float[] getDamageRatio(Object... implement) { - if (implement.length > 1) { - return getWeaponRatio((ItemStack) implement[0], (EntityLivingBase) implement[1]); - } - return getWeaponRatio((ItemStack) implement[0]); - } - - @Override - public float getPenetrationLevel(Object implement) { - ItemStack item = (ItemStack) implement; - return 0F; - } - - protected float[] getWeaponRatio(ItemStack implement) { - return new float[] { 1F, 0F, 0F }; - } - - protected float[] getWeaponRatio(ItemStack implement, EntityLivingBase user) { - if (canCounter(user, implement) == 1) { - return getCounterRatio(); - } - return getWeaponRatio(implement); - } - - protected float[] slashingDamage = new float[] { 1F, 0F, 0F }; - protected float[] crushingDamage = new float[] { 0F, 1F, 0F }; - - protected float[] hackingDamage = new float[] { 4F, 1F, 0F }; - protected float[] hvyHackingDamage = new float[] { 3F, 1F, 0F }; - - protected float[] piercingDamage = new float[] { 0F, 0F, 1F }; - protected float[] hvyPiercingDamage = new float[] { 0F, 1F, 9F }; - protected float[] hvySlashingDamage = new float[] { 9F, 1F, 0F }; - private float materialWeight = 1.0F; - - protected static int speedModHeavy = 5; - - protected static int speedModSword = 0; - protected static int speedModAxe = 1; - protected static int speedModMace = 2; - protected static int speedModKatana = -5; - protected static int speedModSpear = 2; - - protected static float damageModSword = 0.0F; - protected static float damageModAxe = 0.5F; - protected static float damageModMace = 1.0F; - - public static float axeAPModifier = -0.1F; - - @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - if (isCustom) { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - if (MineFantasyII.isDebug() || customMat.getItem() != null) { - list.add(this.construct(customMat.name, "OakWood")); - } - } - return; - } - - if (this instanceof ItemKnifeMF) { - super.getSubItems(item, tab, list); - return; - } - if (this != ToolListMF.swordTraining) { - return; - } - list.add(new ItemStack(ToolListMF.swordTraining)); - list.add(new ItemStack(ToolListMF.waraxeTraining)); - list.add(new ItemStack(ToolListMF.maceTraining)); - list.add(new ItemStack(ToolListMF.spearTraining)); - - list.add(new ItemStack(ToolListMF.swordStone)); - list.add(new ItemStack(ToolListMF.waraxeStone)); - list.add(new ItemStack(ToolListMF.maceStone)); - list.add(new ItemStack(ToolListMF.spearStone)); - } - - private void addSet(List list, Item[] items) { - for (Item item : items) { - list.add(new ItemStack(item)); - } - } - - @Override - public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, - boolean properHit) { - if (canCounter(wielder, item) == 1) { - initialDam *= getCounterDamage(); - } - if (canCounter(wielder, item) == 0) { - initialDam *= getFailCounterDamage(); - } - return initialDam; - } - - @Override - public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { - return 1.0F; - } - - @Override - public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { - return 15; - } - - @Override - public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { - return 30; - } - - @Override - public void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit) { - - } - - public boolean canCounter() { - return true; - } - - public float[] getCounterRatio() { - return new float[] { 0, 0, 1 }; - } - - public float getCounterDamage() { - return 0.75F; - } - - public float getFailCounterDamage() { - return 0.5F; - } - - /* - * 0 = Cannot Counter 1 = Can Counter -1 = Not Possible - */ - private int canCounter(EntityLivingBase user, ItemStack item) { - if (user != null && user instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) user; - if (getParry(item) > 0) { - if (ResearchLogic.hasInfoUnlocked(player, "counteratt")) { - return 1;// Can - } - return 0;// Cannot - } - } - return -1;// N/A - } - - protected int defParryTime = 15; - protected int swordParryTime = 10; - protected int axeParryTime = 15; - protected int maceParryTime = 15; - protected int daggerParryTime = 5; - protected int spearParryTime = 20; - - protected int heavyParryTime = 10; - - protected float heavyParryFatigue = 2.0F; - - protected float daggerStaminaCost = 0.50F; - protected float swordStaminaCost = 1.00F; - protected float katanaStaminaCost = 0.75F; - protected float axeStaminaCost = 1.20F; - protected float maceStaminaCost = 1.30F; - protected float spearStaminaCost = 1.40F; - - protected float heavyStaminaCost = 1.50F; - - // ===================================================== CUSTOM START - // =============================================================\\ - private boolean isCustom = false; - - public ItemWeaponMF setCustom(String s) { - canRepair = false; - setTextureName("minefantasy2:custom/weapon/" + s + "/" + name); - designType = s; - isCustom = true; - return this; - } - - @Override - public Multimap getAttributeModifiers(ItemStack item) { - Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), - new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); - - return map; - } - - public ItemWeaponMF modifyBaseDamage(float mod) { - this.baseDamage = Math.max(1.0F, baseDamage + mod); - return this; - } - - public ItemWeaponMF setBaseDamage(float baseDamage) { - this.baseDamage = baseDamage; - return this; - } - - /** - * Gets a stack-sensitive value for the melee dmg - */ - protected float getMeleeDamage(ItemStack item) { - return baseDamage + CustomToolHelper.getMeleeDamage(item, material.getDamageVsEntity()); - } - - protected float getWeightModifier(ItemStack stack) { - return CustomToolHelper.getWeightModifier(stack, materialWeight); - } - - private IIcon detailTex = null; - private IIcon haftTex = null; - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - if (isCustom) { - haftTex = reg.registerIcon(this.getIconString() + "_haft"); - detailTex = reg.registerIcon(this.getIconString() + "_detail"); - - } - super.registerIcons(reg); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return isCustom; - } - - // Returns the number of render passes this item has. - @Override - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - public IIcon getIcon(ItemStack stack, int pass) { - if (isCustom && pass == 1 && haftTex != null) { - return haftTex; - } - if (isCustom && pass == 2 && detailTex != null) { - return detailTex; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); - } - - @Override - public int getMaxDamage(ItemStack stack) { - return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); - } - - public ItemStack construct(String main, String haft) { - return CustomToolHelper.construct(this, main, haft); - } - - protected int itemRarity; - - @Override - public EnumRarity getRarity(ItemStack item) { - return CustomToolHelper.getRarity(item, itemRarity); - } - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack item) { - String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; - return CustomToolHelper.getLocalisedName(item, unlocalName); - } - - // ====================================================== CUSTOM END - // ==============================================================\\ - - public ItemWeaponMF setTab(CreativeTabs tab) { - setCreativeTab(tab); - return this; - } - - @Override - public float getScale(ItemStack itemstack) { - return 1.0F; - } - - @Override - public float getOffsetX(ItemStack itemstack) { - return 0; - } - - @Override - public float getOffsetY(ItemStack itemstack) { - if (this.getScale(itemstack) > 1.5F) { - return 0.5F; - } - return 0; - } - - @Override - public float getOffsetZ(ItemStack itemstack) { - return 0; - } - - @Override - public float getRotationOffset(ItemStack itemstack) { - return 0; - } - - @Override - public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { - float scale = this.getScale(item); - if (scale > 1.5F && !rack.hasRackBelow(slot)) { - return false; - } - if (scale > 2.5F && !rack.hasRackAbove(slot)) { - return false; - } - return true; - } - - @Override - public boolean isSpecialRender(ItemStack item) { - return false; - } - - public String designType = "standard"; - - @Override - public String getDesign(ItemStack item) { - return designType; - } + IKnockbackWeapon, IWeaponSpeed, IHeldStaminaItem, IStaminaWeapon, IBattlegearWeapon, IToolMaterial, + IWeightedWeapon, IParryable, ISpecialEffect, IDamageModifier, IWeaponClass, IRackItem { + public static final DecimalFormat decimal_format = new DecimalFormat("#.#"); + public static float axeAPModifier = -0.1F; + protected static int speedModHeavy = 5; + protected static int speedModSword = 0; + protected static int speedModAxe = 1; + protected static int speedModMace = 2; + protected static int speedModKatana = -5; + protected static int speedModSpear = 2; + protected static float damageModSword = 0.0F; + protected static float damageModAxe = 0.5F; + protected static float damageModMace = 1.0F; + protected final ToolMaterial material; + public String designType = "standard"; + protected String name; + protected Random rand = new Random(); + protected float lunge_cost = 25; + + // MECHANICS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + protected float charge_cost = 10; + protected float jump_cost = 2; + protected float cleave_cost = 40; + protected float[] slashingDamage = new float[]{1F, 0F, 0F}; + protected float[] crushingDamage = new float[]{0F, 1F, 0F}; + protected float[] hackingDamage = new float[]{4F, 1F, 0F}; + protected float[] hvyHackingDamage = new float[]{3F, 1F, 0F}; + protected float[] piercingDamage = new float[]{0F, 0F, 1F}; + protected float[] hvyPiercingDamage = new float[]{0F, 1F, 9F}; + protected float[] hvySlashingDamage = new float[]{9F, 1F, 0F}; + protected int defParryTime = 15; + protected int swordParryTime = 10; + protected int axeParryTime = 15; + protected int maceParryTime = 15; + protected int daggerParryTime = 5; + protected int spearParryTime = 20; + protected int heavyParryTime = 10; + protected float heavyParryFatigue = 2.0F; + protected float daggerStaminaCost = 0.50F; + protected float swordStaminaCost = 1.00F; + protected float katanaStaminaCost = 0.75F; + protected float axeStaminaCost = 1.20F; + protected float maceStaminaCost = 1.30F; + protected float spearStaminaCost = 1.40F; + protected float heavyStaminaCost = 1.50F; + protected int itemRarity; + /** + * The damage of the weapon without material modifiers + */ + private float baseDamage; + private float materialWeight = 1.0F; + // ===================================================== CUSTOM START + // =============================================================\\ + private boolean isCustom = false; + private IIcon detailTex = null; + private IIcon haftTex = null; + + /** + * The base file for Weapons in MineFantasy + *

+ * Size Varients, (Normal and Heavy) Normal weapons are as is, regular damage + * and weight Heavy weapons do more damage, exhaust more and have balance offset + * (+50% dam) + *

+ * Weapon Types: Blade: Parry Defensive, average damage and speed Axe: Brutal + * Offensive, slower than sword, more damage, Good against Armour Blunt: Simple + * Offensive, slower than axe, more damage, Good against Medium Armour Polearm: + * Ranged Defensive, Good against Heavy Armour Lightblade: Fast Offensive, + * Better against Unarmoured + */ + public ItemWeaponMF(ToolMaterial material, String named, int rarity, float weight) { + super(material); + materialWeight = weight; + itemRarity = rarity; + // May be unsafe, but will allow others to add weapons using custom materials + // (also more efficent) + name = named; + this.material = material; + setCreativeTab(CreativeTabMF.tabOldTools); + setTextureName("minefantasy2:Weapon/" + name); + GameRegistry.registerItem(this, name, MineFantasyII.MODID); + this.setUnlocalizedName(name); + + this.baseDamage = 4 + getDamageModifier(); + + if (material == ToolMaterial.WOOD) { + baseDamage = 0F; + } + if (isHeavyWeapon()) { + WeaponRegistry.addTwoHanded(new ItemStack(this)); + } else { + WeaponRegistry.addDualWeapon(new ItemStack(this)); + } + } + + public static int getParry(ItemStack item) { + if (item.hasTagCompound()) { + if (item.getTagCompound().hasKey("ParryAnimation")) { + return item.getTagCompound().getInteger("ParryAnimation"); + } + } + return -1; + } + + public static void setParry(ItemStack item, int i) { + NBTTagCompound nbt = getOrCreateNBT(item); + + nbt.setInteger("ParryAnimation", i); + } + + public static NBTTagCompound getOrCreateNBT(ItemStack item) { + if (!item.hasTagCompound()) { + item.setTagCompound(new NBTTagCompound()); + } + return item.getTagCompound(); + } + + public static boolean canPerformAbility(EntityLivingBase user, float points) { + return tryPerformAbility(user, points, false, true, true, false); + } + + public static boolean tryPerformAbility(EntityLivingBase user, float points) { + return tryPerformAbility(user, points, true, true); + } + + public static boolean tryPerformAbility(EntityLivingBase user, float points, boolean armour, boolean weapon) { + return tryPerformAbility(user, points, true, armour, weapon, true); + } + + public static boolean tryPerformAbility(EntityLivingBase user, float points, boolean flash, boolean armour, + boolean weapon, boolean takePoints) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { + points *= StaminaBar.getBaseDecayModifier(user, armour, weapon); + if (StaminaBar.isStaminaAvailable(user, points, flash)) { + if (takePoints && !user.worldObj.isRemote) { + applyFatigue(user, points); + } + return true; + } else { + return false; + } + } + return true; + } + + public static void applyFatigue(EntityLivingBase user, float points) { + applyFatigue(user, points, 50F); + } + + public static void applyFatigue(EntityLivingBase user, float points, float pause) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { + float stam = StaminaBar.getStaminaValue(user); + if (stam > 0) { + StaminaBar.modifyStaminaValue(user, -points); + } + StaminaBar.setIdleTime(user, pause * StaminaBar.pauseModifier); + + if (!user.worldObj.isRemote) { + MFLogUtil.logDebug("Spent " + points + " Stamina Pts"); + } + } + } + + /** + * Gets the amount more damaged added to each item + */ + public float getDamageModifier() { + return 0; + } + + /** + * Determines if the item can block/parry + */ + public boolean canBlock() { + return true; + } + + /** + * Determines if the weapon can parry + */ + public boolean canWeaponParry() { + return true; + } + + /** + * Gets the angle the weapon can parry + */ + public float getParryAngleModifier(EntityLivingBase user) { + return 0.75F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + public float getParryDamageModifier(EntityLivingBase user) { + return 1.0F; + } + + /** + * Determines if the weapon can do those cool ninja evades + * + * @return + */ + public boolean canWeaponEvade() { + return true; + } + + @Override + public ToolMaterial getMaterial() { + return this.material; + } + + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack weapon, EntityPlayer user, List list, boolean extra) { + super.addInformation(weapon, user, list, extra); + + if (material == ToolMaterial.WOOD) { + return; + } + + if (isCustom) { + CustomToolHelper.addInformation(weapon, list); + } + + if (this instanceof IExtendedReachWeapon || this instanceof IPenetrateWeapon + || this instanceof IHitTimeModifier) { + list.add(""); + + if (this instanceof IPenetrateWeapon) { + list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( + "attribute.modifier.plus." + 1, decimal_format.format(getAPDamText()), + StatCollector.translateToLocal("attribute.weapon.penetrateArmor"))); + } + + if (this instanceof IExtendedReachWeapon) { + float reach = ((IExtendedReachWeapon) this).getReachModifierInBlocks(weapon); + + if (reach > 0) { + list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( + "attribute.modifier.plus." + 0, decimal_format.format(reach), + StatCollector.translateToLocal("attribute.weapon.extendedReach"))); + } else { + list.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted( + "attribute.modifier.take." + 0, decimal_format.format(-1 * reach), + StatCollector.translateToLocal("attribute.weapon.extendedReach"))); + } + } + + if (this instanceof IHitTimeModifier) { + int hitMod = ((IHitTimeModifier) this).getHitTime(weapon, null); + if (hitMod > 0) { + list.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted( + "attribute.modifier.take." + 1, decimal_format.format(hitMod / 10F * 100), + StatCollector.translateToLocal("attribute.weapon.attackSpeed"))); + } else { + list.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocalFormatted( + "attribute.modifier.plus." + 1, decimal_format.format(-(float) hitMod / 10F * 100), + StatCollector.translateToLocal("attribute.weapon.attackSpeed"))); + } + } + + if (this instanceof IBackStabbable) { + list.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("attribute.weapon.backstab")); + + } + } + } + + protected float getAPDamText() { + return 0F; + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return isHeavyWeapon(); + } + + public boolean isHeavyWeapon() { + return false; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return true; + } + + @Override + public boolean offhandAttackEntity(OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) { + return true; + } + + @Override + public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { + return true; + } + + @Override + public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem) { + return true; + } + + @Override + public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem) { + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return offhand != null; + } + + protected void addXp(EntityLivingBase user, int chance) { + if (ConfigWeapon.xpTrain && user instanceof EntityPlayer && material == ToolMaterial.WOOD) { + if (chance == 0 || user.getRNG().nextInt(chance) == 0) { + ((EntityPlayer) user).addExperience(1); + } + } + } + + @Override + public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam) { + ItemStack weapon = user.getHeldItem(); + int pd = getParryDamage(dam); + if (pd > 0) { + weapon.damageItem(pd, user); + } + + addXp(user, 30); + } + + /** + * Gets the amount of durability lost when parrying + */ + protected int getParryDamage(float dam) { + return (int) dam; + } + + @Override + public float getMaxDamageParry(EntityLivingBase user, ItemStack weapon) { + float mod = 1.0F; + return getMeleeDamage(weapon) * getParryDamageModifier(user) * mod; + } + + @Override + public float getParryAngle(DamageSource source, EntityLivingBase blocker, ItemStack item) { + float base = 30; + + if (source.isProjectile()) { + if (!(blocker instanceof EntityPlayer)) { + base = 0F; + } + base *= 0.25F; + } + if (blocker instanceof EntityZombie && !(blocker instanceof EntityPigZombie)) { + base *= 2; + } + return base * getParryAngleModifier(blocker); + } + + @Override + public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { + if (ConfigWeapon.xpTrain && user instanceof EntityLivingBase && material == ToolMaterial.WOOD) { + addXp(user, 50); + } + } + + protected float getKnockbackStrength() { + return 0; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + if (material == ToolMaterial.WOOD) { + blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 1.0F); + return true; + } + if (material == BaseMaterialMF.stone.getToolConversion()) { + blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.5F); + return true; + } + return false; + } + + @Override + public boolean canParry(DamageSource source, EntityLivingBase blocker, ItemStack item) { + return canWeaponParry(); + } + + @Override + public float getBalance(EntityLivingBase user) { + return getBalance(); + } + + public float getBalance() { + return 0.0F; + } + + @Override + public float getStaminaDrainOnHit(EntityLivingBase user, ItemStack item) { + return 2F * getStaminaMod() * getWeightModifier(item); + } + + protected float getStaminaMod() { + return 1.0F; + } + + @Override + public float getDecayMod(EntityLivingBase user, ItemStack item) { + return getDecayModifier(user, item) * getWeightModifier(item); + } + + /** + * The Modifier for the weapon + */ + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 1.0F; + } + + @Override + public float getRegenModifier(EntityLivingBase user, ItemStack item) { + return 1.0F; + } + + @Override + public float getIdleModifier(EntityLivingBase user, ItemStack item) { + return 1.0F; + } + + protected void hurtInRange(EntityLivingBase user, double range) { + AxisAlignedBB bb = user.boundingBox.expand(range, range, range); + List hurt = user.worldObj.getEntitiesWithinAABBExcludingEntity(user, bb); + Iterator list = hurt.iterator(); + while (list.hasNext()) { + Entity hit = (Entity) list.next(); + + if (user.canEntityBeSeen(hit)) { + TacticalManager.knockbackEntity(hit, user, 1.5F, 0.2F); + if (StaminaBar.isSystemActive) { + StaminaBar.setIdleTime(user, 60); + } + if (hit instanceof EntityLivingBase) { + for (int a = 0; a < 4; a++) { + hit.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(Blocks.redstone_block) + "_0", + hit.posX, hit.posY + hit.getEyeHeight(), hit.posZ, rand.nextDouble() / 2D, + rand.nextDouble() / 2D, rand.nextDouble() / 2D); + } + ((EntityLivingBase) hit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 0)); + } + } + } + } + + @Override + public boolean canUserParry(EntityLivingBase user) { + return user instanceof EntityPlayer || user instanceof ISpecialCombatMob + || (canAnyMobParry() || rand.nextFloat() < 0.20F); + } + + protected boolean canAnyMobParry() { + return false; + } + + @Override + public float getAddedKnockback(EntityLivingBase user, ItemStack item) { + return getKnockbackStrength(); + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return 0; + } + + @Override + public float[] getDamageRatio(Object... implement) { + if (implement.length > 1) { + return getWeaponRatio((ItemStack) implement[0], (EntityLivingBase) implement[1]); + } + return getWeaponRatio((ItemStack) implement[0]); + } + + @Override + public float getPenetrationLevel(Object implement) { + ItemStack item = (ItemStack) implement; + return 0F; + } + + protected float[] getWeaponRatio(ItemStack implement) { + return new float[]{1F, 0F, 0F}; + } + + protected float[] getWeaponRatio(ItemStack implement, EntityLivingBase user) { + if (canCounter(user, implement) == 1) { + return getCounterRatio(); + } + return getWeaponRatio(implement); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + if (isCustom) { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + if (MineFantasyII.isDebug() || customMat.getItem() != null) { + list.add(this.construct(customMat.name, "OakWood")); + } + } + return; + } + + if (this instanceof ItemKnifeMF) { + super.getSubItems(item, tab, list); + return; + } + if (this != ToolListMF.swordTraining) { + return; + } + list.add(new ItemStack(ToolListMF.swordTraining)); + list.add(new ItemStack(ToolListMF.waraxeTraining)); + list.add(new ItemStack(ToolListMF.maceTraining)); + list.add(new ItemStack(ToolListMF.spearTraining)); + + list.add(new ItemStack(ToolListMF.swordStone)); + list.add(new ItemStack(ToolListMF.waraxeStone)); + list.add(new ItemStack(ToolListMF.maceStone)); + list.add(new ItemStack(ToolListMF.spearStone)); + } + + private void addSet(List list, Item[] items) { + for (Item item : items) { + list.add(new ItemStack(item)); + } + } + + @Override + public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, + boolean properHit) { + if (canCounter(wielder, item) == 1) { + initialDam *= getCounterDamage(); + } + if (canCounter(wielder, item) == 0) { + initialDam *= getFailCounterDamage(); + } + return initialDam; + } + + @Override + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { + return 1.0F; + } + + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return 15; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 30; + } + + @Override + public void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit) { + + } + + public boolean canCounter() { + return true; + } + + public float[] getCounterRatio() { + return new float[]{0, 0, 1}; + } + + public float getCounterDamage() { + return 0.75F; + } + + public float getFailCounterDamage() { + return 0.5F; + } + + /* + * 0 = Cannot Counter 1 = Can Counter -1 = Not Possible + */ + private int canCounter(EntityLivingBase user, ItemStack item) { + if (user != null && user instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) user; + if (getParry(item) > 0) { + if (ResearchLogic.hasInfoUnlocked(player, "counteratt")) { + return 1;// Can + } + return 0;// Cannot + } + } + return -1;// N/A + } + + public ItemWeaponMF setCustom(String s) { + canRepair = false; + setTextureName("minefantasy2:custom/weapon/" + s + "/" + name); + designType = s; + isCustom = true; + return this; + } + + @Override + public Multimap getAttributeModifiers(ItemStack item) { + Multimap map = HashMultimap.create(); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), + new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); + + return map; + } + + public ItemWeaponMF modifyBaseDamage(float mod) { + this.baseDamage = Math.max(1.0F, baseDamage + mod); + return this; + } + + public ItemWeaponMF setBaseDamage(float baseDamage) { + this.baseDamage = baseDamage; + return this; + } + + /** + * Gets a stack-sensitive value for the melee dmg + */ + protected float getMeleeDamage(ItemStack item) { + return baseDamage + CustomToolHelper.getMeleeDamage(item, material.getDamageVsEntity()); + } + + protected float getWeightModifier(ItemStack stack) { + return CustomToolHelper.getWeightModifier(stack, materialWeight); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + if (isCustom) { + haftTex = reg.registerIcon(this.getIconString() + "_haft"); + detailTex = reg.registerIcon(this.getIconString() + "_detail"); + + } + super.registerIcons(reg); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return isCustom; + } + + // Returns the number of render passes this item has. + @Override + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + if (isCustom && pass == 1 && haftTex != null) { + return haftTex; + } + if (isCustom && pass == 2 && detailTex != null) { + return detailTex; + } + return super.getIcon(stack, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack item, int layer) { + return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); + } + + public ItemStack construct(String main, String haft) { + return CustomToolHelper.construct(this, main, haft); + } + + @Override + public EnumRarity getRarity(ItemStack item) { + return CustomToolHelper.getRarity(item, itemRarity); + } + + // ====================================================== CUSTOM END + // ==============================================================\\ + + @Override + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack item) { + String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; + return CustomToolHelper.getLocalisedName(item, unlocalName); + } + + public ItemWeaponMF setTab(CreativeTabs tab) { + setCreativeTab(tab); + return this; + } + + @Override + public float getScale(ItemStack itemstack) { + return 1.0F; + } + + @Override + public float getOffsetX(ItemStack itemstack) { + return 0; + } + + @Override + public float getOffsetY(ItemStack itemstack) { + if (this.getScale(itemstack) > 1.5F) { + return 0.5F; + } + return 0; + } + + @Override + public float getOffsetZ(ItemStack itemstack) { + return 0; + } + + @Override + public float getRotationOffset(ItemStack itemstack) { + return 0; + } + + @Override + public boolean canHang(TileEntityRack rack, ItemStack item, int slot) { + float scale = this.getScale(item); + if (scale > 1.5F && !rack.hasRackBelow(slot)) { + return false; + } + if (scale > 2.5F && !rack.hasRackAbove(slot)) { + return false; + } + return true; + } + + @Override + public boolean isSpecialRender(ItemStack item) { + return false; + } + + @Override + public String getDesign(ItemStack item) { + return designType; + } } diff --git a/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java b/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java index 0cd924fc..6a7fb708 100644 --- a/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java +++ b/src/main/java/minefantasy/mf2/knowledge/ArtefactListMF.java @@ -14,141 +14,141 @@ import net.minecraftforge.oredict.OreDictionary; public class ArtefactListMF { - public static void init() { - ((ItemArtefact) ComponentListMF.artefacts).registerAll(); - addArtisanry(); - addConstruction(); - addProvisioning(); - addEngineering(); - } - - private static void addEngineering() { - add(KnowledgeListMF.blackpowder, ComponentListMF.nitre, ComponentListMF.sulfur, Items.coal, Items.gunpowder); - add(KnowledgeListMF.advblackpowder, Items.glowstone_dust, Items.redstone); - add(KnowledgeListMF.tungsten, ComponentListMF.oreTungsten, BlockListMF.oreTungsten); - add(KnowledgeListMF.coke, Items.coal, Items.redstone); - add(KnowledgeListMF.spyglass, ComponentListMF.bronze_gears, Blocks.glass); - add(KnowledgeListMF.parachute, Items.feather, Blocks.wool); - add(KnowledgeListMF.syringe, Items.potionitem); - add(KnowledgeListMF.engTanner, ComponentListMF.bronze_gears); - add(KnowledgeListMF.bombarrow, Items.feather, ComponentListMF.blackpowder); - add(KnowledgeListMF.bpress, ComponentListMF.bronze_gears, Blocks.lever); - add(KnowledgeListMF.bombs, ComponentListMF.blackpowder, Items.redstone, Items.string); - add(KnowledgeListMF.shrapnel, Items.flint); - add(KnowledgeListMF.firebomb, ComponentListMF.dragon_heart, Items.magma_cream); - add(KnowledgeListMF.stickybomb, Items.slime_ball); - add(KnowledgeListMF.mineCeramic, ComponentListMF.blackpowder, Blocks.stone_pressure_plate); - add(KnowledgeListMF.bombIron, Items.iron_ingot); - add(KnowledgeListMF.mineIron, Items.iron_ingot); - add(KnowledgeListMF.bombObsidian, Blocks.obsidian); - add(KnowledgeListMF.mineObsidian, Blocks.obsidian); - add(KnowledgeListMF.bombCrystal, Items.diamond); - add(KnowledgeListMF.mineCrystal, Items.diamond); - - add(KnowledgeListMF.crossbows, Items.string, ComponentListMF.plank, Blocks.lever); - add(KnowledgeListMF.crossShaftAdvanced, ComponentListMF.tungsten_gears); - add(KnowledgeListMF.crossHeadAdvanced, ComponentListMF.tungsten_gears); - add(KnowledgeListMF.crossAmmo, ComponentListMF.tungsten_gears); - add(KnowledgeListMF.crossScope, ToolListMF.spyglass); - add(KnowledgeListMF.crossBayonet, CustomToolListMF.standard_dagger); - } - - private static void addProvisioning() { - add(KnowledgeListMF.jerky, FoodListMF.generic_meat_uncooked); - add(KnowledgeListMF.saussage, FoodListMF.generic_meat_uncooked, FoodListMF.guts); - add(KnowledgeListMF.sandwitch, FoodListMF.generic_meat_uncooked, FoodListMF.cheese_slice, Items.bread); - add(KnowledgeListMF.sandwitchBig, FoodListMF.generic_meat_uncooked, FoodListMF.cheese_slice, Items.bread); - - add(KnowledgeListMF.meatpie, FoodListMF.generic_meat_uncooked, FoodListMF.pastry); - add(KnowledgeListMF.shepardpie, FoodListMF.generic_meat_uncooked, Items.potato, FoodListMF.pastry); - add(KnowledgeListMF.berrypie, FoodListMF.berries, FoodListMF.pastry); - add(KnowledgeListMF.applepie, Items.apple, FoodListMF.pastry); - - add(KnowledgeListMF.sweetroll, Items.sugar, FoodListMF.berries, FoodListMF.sugarpot); - add(KnowledgeListMF.eclair, Items.egg, new ItemStack(Items.dye, 1, 3), FoodListMF.pastry); - add(KnowledgeListMF.cheeseroll, Items.bread, FoodListMF.cheese_slice); - - add(KnowledgeListMF.cake, FoodListMF.flour, Items.egg); - add(KnowledgeListMF.carrotcake, FoodListMF.flour, Items.egg, Items.carrot); - add(KnowledgeListMF.chococake, FoodListMF.flour, Items.egg, new ItemStack(Items.dye, 1, 3)); - add(KnowledgeListMF.bfcake, FoodListMF.flour, Items.egg, new ItemStack(Items.dye, 1, 3), - FoodListMF.berriesJuicy); - - add(KnowledgeListMF.bandageadv, Blocks.wool, Items.leather); - } - - private static void addConstruction() { - add(KnowledgeListMF.refined_planks, ComponentListMF.nail); - add(KnowledgeListMF.clay_wall, Items.clay_ball, ComponentListMF.nail); - add(KnowledgeListMF.paint_brush, Blocks.wool); - add(KnowledgeListMF.decorated_stone, Items.iron_ingot, BlockListMF.reinforced_stone); - add(KnowledgeListMF.bed_roll, Items.bed); - add(KnowledgeListMF.ammo_box, Blocks.chest); - add(KnowledgeListMF.big_box, Blocks.chest); - - } - - private static void addArtisanry() { - for (ItemStack copper : OreDictionary.getOres("ingotCopper")) { - for (ItemStack tin : OreDictionary.getOres("ingotTin")) { - add(KnowledgeListMF.smeltBronze, copper, tin); - } - } - add(KnowledgeListMF.coalflux, Items.coal, ComponentListMF.flux); - add(KnowledgeListMF.smeltIron, Blocks.iron_ore); - add(KnowledgeListMF.crucible2, ComponentListMF.fireclay); - add(KnowledgeListMF.blastfurn, Items.iron_ingot, Blocks.iron_ore, Blocks.furnace, BlockListMF.bloomery, - BlockListMF.limestone, ComponentListMF.kaolinite); - add(KnowledgeListMF.bigfurn, Items.iron_ingot, Blocks.furnace, BlockListMF.bloomery, ComponentListMF.kaolinite, - Items.coal); - for (ItemStack pig : OreDictionary.getOres("ingotPigIron")) { - add(KnowledgeListMF.smeltSteel, pig); - } - for (ItemStack steel : OreDictionary.getOres("ingotSteel")) { - add(KnowledgeListMF.encrusted, steel, Items.diamond); - add(KnowledgeListMF.obsidian, steel, Blocks.obsidian); - for (ItemStack bronze : OreDictionary.getOres("ingotBronze")) { - add(KnowledgeListMF.smeltBlackSteel, Blocks.obsidian, bronze, steel); - } - } - for (ItemStack black : OreDictionary.getOres("ingotBlackSteel")) { - for (ItemStack silver : OreDictionary.getOres("ingotSilver")) { - add(KnowledgeListMF.smeltBlueSteel, Items.blaze_powder, silver, black, new ItemStack(Items.dye, 1, 4), - ComponentListMF.flux_strong); - } - add(KnowledgeListMF.smeltRedSteel, Items.blaze_powder, Items.gold_ingot, Items.redstone, black, - ComponentListMF.flux_strong); - } - - for (ItemStack silver : OreDictionary.getOres("ingotSilver")) { - add(KnowledgeListMF.smeltMithril, BlockListMF.oreMythic, silver); - } - add(KnowledgeListMF.smeltAdamant, BlockListMF.oreMythic, Items.gold_ingot); - - for (ItemStack mithril : OreDictionary.getOres("ingotMithril")) { - add(KnowledgeListMF.smeltMithium, mithril, Items.ghast_tear, Items.diamond); - for (ItemStack adamant : OreDictionary.getOres("ingotAdamantium")) { - add(KnowledgeListMF.smeltIgnotumite, adamant, Items.emerald, Items.blaze_powder); - add(KnowledgeListMF.smeltEnderforge, adamant, mithril, Items.ender_pearl); - } - } - add(KnowledgeListMF.craftArmourMedium, Items.leather); - add(KnowledgeListMF.craftArmourHeavy, Items.leather, Blocks.wool, Items.feather); - add(KnowledgeListMF.smeltDragonforge, ComponentListMF.dragon_heart); - - add(KnowledgeListMF.craftOrnate, new ItemStack(Items.dye, 1, 4)); - - add(KnowledgeListMF.arrowsBodkin, Items.feather); - add(KnowledgeListMF.arrowsBroad, Items.feather, Items.flint); - - add(KnowledgeListMF.repair_basic, Items.leather, Items.flint, ComponentListMF.nail); - add(KnowledgeListMF.repair_advanced, BlockListMF.repair_basic, Items.slime_ball, Items.string); - add(KnowledgeListMF.repair_ornate, Items.diamond, Items.gold_ingot, BlockListMF.repair_advanced); - } - - private static void add(InformationBase info, Object... artifacts) { - for (Object artifact : artifacts) { - ResearchArtefacts.addArtefact(artifact, info); - } - } + public static void init() { + ((ItemArtefact) ComponentListMF.artefacts).registerAll(); + addArtisanry(); + addConstruction(); + addProvisioning(); + addEngineering(); + } + + private static void addEngineering() { + add(KnowledgeListMF.blackpowder, ComponentListMF.nitre, ComponentListMF.sulfur, Items.coal, Items.gunpowder); + add(KnowledgeListMF.advblackpowder, Items.glowstone_dust, Items.redstone); + add(KnowledgeListMF.tungsten, ComponentListMF.oreTungsten, BlockListMF.oreTungsten); + add(KnowledgeListMF.coke, Items.coal, Items.redstone); + add(KnowledgeListMF.spyglass, ComponentListMF.bronze_gears, Blocks.glass); + add(KnowledgeListMF.parachute, Items.feather, Blocks.wool); + add(KnowledgeListMF.syringe, Items.potionitem); + add(KnowledgeListMF.engTanner, ComponentListMF.bronze_gears); + add(KnowledgeListMF.bombarrow, Items.feather, ComponentListMF.blackpowder); + add(KnowledgeListMF.bpress, ComponentListMF.bronze_gears, Blocks.lever); + add(KnowledgeListMF.bombs, ComponentListMF.blackpowder, Items.redstone, Items.string); + add(KnowledgeListMF.shrapnel, Items.flint); + add(KnowledgeListMF.firebomb, ComponentListMF.dragon_heart, Items.magma_cream); + add(KnowledgeListMF.stickybomb, Items.slime_ball); + add(KnowledgeListMF.mineCeramic, ComponentListMF.blackpowder, Blocks.stone_pressure_plate); + add(KnowledgeListMF.bombIron, Items.iron_ingot); + add(KnowledgeListMF.mineIron, Items.iron_ingot); + add(KnowledgeListMF.bombObsidian, Blocks.obsidian); + add(KnowledgeListMF.mineObsidian, Blocks.obsidian); + add(KnowledgeListMF.bombCrystal, Items.diamond); + add(KnowledgeListMF.mineCrystal, Items.diamond); + + add(KnowledgeListMF.crossbows, Items.string, ComponentListMF.plank, Blocks.lever); + add(KnowledgeListMF.crossShaftAdvanced, ComponentListMF.tungsten_gears); + add(KnowledgeListMF.crossHeadAdvanced, ComponentListMF.tungsten_gears); + add(KnowledgeListMF.crossAmmo, ComponentListMF.tungsten_gears); + add(KnowledgeListMF.crossScope, ToolListMF.spyglass); + add(KnowledgeListMF.crossBayonet, CustomToolListMF.standard_dagger); + } + + private static void addProvisioning() { + add(KnowledgeListMF.jerky, FoodListMF.generic_meat_uncooked); + add(KnowledgeListMF.saussage, FoodListMF.generic_meat_uncooked, FoodListMF.guts); + add(KnowledgeListMF.sandwitch, FoodListMF.generic_meat_uncooked, FoodListMF.cheese_slice, Items.bread); + add(KnowledgeListMF.sandwitchBig, FoodListMF.generic_meat_uncooked, FoodListMF.cheese_slice, Items.bread); + + add(KnowledgeListMF.meatpie, FoodListMF.generic_meat_uncooked, FoodListMF.pastry); + add(KnowledgeListMF.shepardpie, FoodListMF.generic_meat_uncooked, Items.potato, FoodListMF.pastry); + add(KnowledgeListMF.berrypie, FoodListMF.berries, FoodListMF.pastry); + add(KnowledgeListMF.applepie, Items.apple, FoodListMF.pastry); + + add(KnowledgeListMF.sweetroll, Items.sugar, FoodListMF.berries, FoodListMF.sugarpot); + add(KnowledgeListMF.eclair, Items.egg, new ItemStack(Items.dye, 1, 3), FoodListMF.pastry); + add(KnowledgeListMF.cheeseroll, Items.bread, FoodListMF.cheese_slice); + + add(KnowledgeListMF.cake, FoodListMF.flour, Items.egg); + add(KnowledgeListMF.carrotcake, FoodListMF.flour, Items.egg, Items.carrot); + add(KnowledgeListMF.chococake, FoodListMF.flour, Items.egg, new ItemStack(Items.dye, 1, 3)); + add(KnowledgeListMF.bfcake, FoodListMF.flour, Items.egg, new ItemStack(Items.dye, 1, 3), + FoodListMF.berriesJuicy); + + add(KnowledgeListMF.bandageadv, Blocks.wool, Items.leather); + } + + private static void addConstruction() { + add(KnowledgeListMF.refined_planks, ComponentListMF.nail); + add(KnowledgeListMF.clay_wall, Items.clay_ball, ComponentListMF.nail); + add(KnowledgeListMF.paint_brush, Blocks.wool); + add(KnowledgeListMF.decorated_stone, Items.iron_ingot, BlockListMF.reinforced_stone); + add(KnowledgeListMF.bed_roll, Items.bed); + add(KnowledgeListMF.ammo_box, Blocks.chest); + add(KnowledgeListMF.big_box, Blocks.chest); + + } + + private static void addArtisanry() { + for (ItemStack copper : OreDictionary.getOres("ingotCopper")) { + for (ItemStack tin : OreDictionary.getOres("ingotTin")) { + add(KnowledgeListMF.smeltBronze, copper, tin); + } + } + add(KnowledgeListMF.coalflux, Items.coal, ComponentListMF.flux); + add(KnowledgeListMF.smeltIron, Blocks.iron_ore); + add(KnowledgeListMF.crucible2, ComponentListMF.fireclay); + add(KnowledgeListMF.blastfurn, Items.iron_ingot, Blocks.iron_ore, Blocks.furnace, BlockListMF.bloomery, + BlockListMF.limestone, ComponentListMF.kaolinite); + add(KnowledgeListMF.bigfurn, Items.iron_ingot, Blocks.furnace, BlockListMF.bloomery, ComponentListMF.kaolinite, + Items.coal); + for (ItemStack pig : OreDictionary.getOres("ingotPigIron")) { + add(KnowledgeListMF.smeltSteel, pig); + } + for (ItemStack steel : OreDictionary.getOres("ingotSteel")) { + add(KnowledgeListMF.encrusted, steel, Items.diamond); + add(KnowledgeListMF.obsidian, steel, Blocks.obsidian); + for (ItemStack bronze : OreDictionary.getOres("ingotBronze")) { + add(KnowledgeListMF.smeltBlackSteel, Blocks.obsidian, bronze, steel); + } + } + for (ItemStack black : OreDictionary.getOres("ingotBlackSteel")) { + for (ItemStack silver : OreDictionary.getOres("ingotSilver")) { + add(KnowledgeListMF.smeltBlueSteel, Items.blaze_powder, silver, black, new ItemStack(Items.dye, 1, 4), + ComponentListMF.flux_strong); + } + add(KnowledgeListMF.smeltRedSteel, Items.blaze_powder, Items.gold_ingot, Items.redstone, black, + ComponentListMF.flux_strong); + } + + for (ItemStack silver : OreDictionary.getOres("ingotSilver")) { + add(KnowledgeListMF.smeltMithril, BlockListMF.oreMythic, silver); + } + add(KnowledgeListMF.smeltAdamant, BlockListMF.oreMythic, Items.gold_ingot); + + for (ItemStack mithril : OreDictionary.getOres("ingotMithril")) { + add(KnowledgeListMF.smeltMithium, mithril, Items.ghast_tear, Items.diamond); + for (ItemStack adamant : OreDictionary.getOres("ingotAdamantium")) { + add(KnowledgeListMF.smeltIgnotumite, adamant, Items.emerald, Items.blaze_powder); + add(KnowledgeListMF.smeltEnderforge, adamant, mithril, Items.ender_pearl); + } + } + add(KnowledgeListMF.craftArmourMedium, Items.leather); + add(KnowledgeListMF.craftArmourHeavy, Items.leather, Blocks.wool, Items.feather); + add(KnowledgeListMF.smeltDragonforge, ComponentListMF.dragon_heart); + + add(KnowledgeListMF.craftOrnate, new ItemStack(Items.dye, 1, 4)); + + add(KnowledgeListMF.arrowsBodkin, Items.feather); + add(KnowledgeListMF.arrowsBroad, Items.feather, Items.flint); + + add(KnowledgeListMF.repair_basic, Items.leather, Items.flint, ComponentListMF.nail); + add(KnowledgeListMF.repair_advanced, BlockListMF.repair_basic, Items.slime_ball, Items.string); + add(KnowledgeListMF.repair_ornate, Items.diamond, Items.gold_ingot, BlockListMF.repair_advanced); + } + + private static void add(InformationBase info, Object... artifacts) { + for (Object artifact : artifacts) { + ResearchArtefacts.addArtefact(artifact, info); + } + } } diff --git a/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java b/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java index f254eed8..a50c9eef 100644 --- a/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java +++ b/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.knowledge; -import java.util.ArrayList; - import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; import minefantasy.mf2.api.knowledge.InformationBase; @@ -12,506 +10,484 @@ import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.item.food.FoodListMF; -import minefantasy.mf2.item.list.ArmourListMF; -import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.item.list.CustomArmourListMF; -import minefantasy.mf2.item.list.CustomToolListMF; -import minefantasy.mf2.item.list.ToolListMF; +import minefantasy.mf2.item.list.*; import minefantasy.mf2.material.MetalMaterial; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; -public class KnowledgeListMF { - public static InformationPage artisanry = InformationList.artisanry; - public static InformationPage construction = InformationList.construction; - public static InformationPage engineering = InformationList.engineering; - public static InformationPage provisioning = InformationList.provisioning; - public static InformationPage mastery = InformationList.mastery; - - // BASICS -FREE - public static InformationBase carpenter, gettingStarted, salvage, research, talisman, ores, plants, chimney, - tanning, commodities, dust, craftCrafters, stamina, combat, craftArmourBasic, craftHCCTools, firemaker, - dragons, minotaurs; - public static InformationBase bloomery, crucible, crucible2, smeltCopper, smeltBronze, smeltIron, coalflux, bigfurn, - blastfurn, smeltPig, smeltSteel, encrusted, obsidian, smeltBlackSteel, smeltDragonforge, smeltBlueSteel, - smeltRedSteel, smeltMithril, smeltAdamant, smeltMaster, smeltMithium, smeltIgnotumite, smeltEnderforge; - public static InformationBase bellows, trough, forge, anvil, bar, apron, craftTools, craftAdvTools, craftWeapons, - craftAdvWeapons, arrows, craftOrnate, craftArmourLight, craftArmourMedium, craftArmourHeavy, arrowsBodkin, - arrowsBroad, repair_basic, repair_advanced, repair_ornate; - public static InformationBase coke, etools, ecomponents, tungsten, climber, spyglass, parachute, syringe, engTanner, - advforge, advcrucible, blackpowder, advblackpowder, bombs, bpress, bombarrow, bombFuse, shrapnel, firebomb, - stickybomb, bombCeramic, bombIron, bombObsidian, bombCrystal, mineCeramic, mineIron, mineObsidian, - mineCrystal, crossbows, crossShafts, crossHeads, crossHeadAdvanced, crossShaftAdvanced, crossAmmo, - crossScope, crossBayonet, cogArmour, compPlate; - public static InformationBase constructionPts, refined_planks, reinforced_stone, clay_wall, glass, brickworks, - decorated_stone, bars, thatch, easyRefine, paint_brush, tool_rack, food_box, ammo_box, big_box, bed_roll; - public static InformationBase toughness, fitness, armourpro, parrypro, counteratt, autoparry, scrapper, firstaid, - doctor; - public static InformationBase cookingutensil, firepit, generic_meat, stew, jerky, saussage, sandwitch, sandwitchBig, - meatpie, shepardpie, bread, oats, salt, jug, berry, icing, sweetroll, eclair, cake, carrotcake, chococake, - bfcake, applepie, berrypie, cheese, cheeseroll, bandage, bandageadv; - - public static void init() { - carpenter = (new InformationBase("carpenter", 0, -3, 0, BlockListMF.carpenter, (InformationBase) null)) - .registerStat().setUnlocked(); - salvage = (new InformationBase("salvage", 0, -4, 0, BlockListMF.salvage_basic, (InformationBase) null)) - .registerStat().setUnlocked(); - gettingStarted = (new InformationBase("gettingStarted", 0, 0, 0, Items.book, (InformationBase) null)) - .registerStat().setUnlocked(); - research = (new InformationBase("research", 1, 1, 0, ToolListMF.researchBook, (InformationBase) null)) - .registerStat().setUnlocked(); - talisman = (new InformationBase("talisman", 4, 2, 0, ComponentListMF.talisman_lesser, research)).registerStat() - .setUnlocked(); - ores = (new InformationBase("ores", 1, -2, 0, BlockListMF.oreCopper, (InformationBase) null)).registerStat() - .setUnlocked(); - plants = (new InformationBase("plants", 1, -3, 0, BlockListMF.log_ironbark, ores)).registerStat().setUnlocked(); - chimney = (new InformationBase("chimney", 0, 2, 0, BlockListMF.chimney_stone, (InformationBase) null)) - .registerStat().setUnlocked(); - tanning = (new InformationBase("tanning", 0, -2, 0, Items.leather, (InformationBase) null)).registerStat() - .setUnlocked().setSpecial(); - commodities = (new InformationBase("commodities", -1, -2, 0, ComponentListMF.nail, (InformationBase) null)) - .registerStat().setUnlocked(); - dust = (new InformationBase("dust", -1, -3, 0, ComponentListMF.clay_pot, commodities)).registerStat() - .setUnlocked(); - craftCrafters = (new InformationBase("craftCrafters", -1, 1, 0, CustomToolListMF.standard_hammer, - (InformationBase) null)).registerStat().setUnlocked(); - stamina = (new InformationBase("stamina", -3, 1, 0, Items.feather, craftCrafters)).registerStat().setUnlocked(); - combat = (new InformationBase("combat", -5, 2, 0, Items.iron_sword, stamina)).registerStat().setUnlocked(); - craftArmourBasic = (new InformationBase("craftArmourBasic", -5, 0, 5, - ArmourListMF.armour(ArmourListMF.leather, 0, 1), combat)).registerStat().setUnlocked(); - firemaker = (new InformationBase("firemaker", 5, 1, 0, Items.flint_and_steel, (InformationBase) null)) - .registerStat().setUnlocked(); - - dragons = (new InformationBase("dragons", -1, 3, 0, ComponentListMF.dragon_heart, (InformationBase) null)) - .registerStat().setUnlocked(); - minotaurs = (new InformationBase("minotaurs", 1, 3, 0, Items.beef, (InformationBase) null)).registerStat() - .setUnlocked(); - - // ARTISANRY -From Not very to the most Expensive - bloomery = (new InformationBase("bloomery", 4, -2, 0, BlockListMF.bloomery, crucible)).registerStat() - .setPage(artisanry).setUnlocked().setSpecial(); - crucible = (new InformationBase("crucible", 4, 0, 0, BlockListMF.crucible, (InformationBase) null)) - .registerStat().setPage(artisanry).setUnlocked().setSpecial(); - crucible2 = (new InformationBase("crucible2", 6, 0, 1, BlockListMF.crucibleadv_active, crucible)).registerStat() - .setPage(artisanry).addSkill(SkillList.artisanry, 40); - - smeltCopper = (new InformationBase("smeltCopper", 1, 0, 0, ComponentListMF.ingots[0], (InformationBase) null)) - .registerStat().setPage(artisanry).setUnlocked().setDescriptValues(getMetalTier("copper")); - smeltBronze = (new InformationBase("smeltBronze", 1, 2, 2, ComponentListMF.ingots[2], crucible)).registerStat() - .setPage(artisanry).addSkill(SkillList.artisanry, 5).setDescriptValues(getMetalTier("bronze")); - smeltIron = (new InformationBase("smeltIron", 1, 4, 1, Items.iron_ingot, null)).registerStat() - .setPage(artisanry).addSkill(SkillList.artisanry, 10).setDescriptValues(getMetalTier("iron")); - coalflux = (new InformationBase("coalflux", 1, 6, 2, ComponentListMF.coal_flux, smeltIron)).registerStat() - .setPage(artisanry).addSkill(SkillList.artisanry, 15); - blastfurn = (new InformationBase("blastfurn", 2, 5, 5, BlockListMF.blast_heater_active, smeltIron)) - .registerStat().setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, 25); - bigfurn = (new InformationBase("bigfurn", 0, 5, 4, BlockListMF.furnace_stone, smeltIron)).registerStat() - .setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, 10); - smeltPig = (new InformationBase("smeltPig", 3, 3, 0, ComponentListMF.ingots[3], blastfurn)).registerStat() - .setPage(artisanry).setUnlocked().addSkill(SkillList.artisanry, 25); - smeltSteel = (new InformationBase("smeltSteel", 4, 5, 1, ComponentListMF.ingots[4], smeltPig)).registerStat() - .setPage(artisanry).addSkill(SkillList.artisanry, 25).setDescriptValues(getMetalTier("Steel")); - encrusted = (new InformationBase("smeltEncrusted", 6, 5, 2, ComponentListMF.diamond_shards, smeltSteel)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 35) - .setDescriptValues(getMetalTier("encrusted")); - obsidian = (new InformationBase("smeltObsidian", 6, 3, 2, ComponentListMF.ingots[19], smeltSteel)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 40) - .setDescriptValues(getMetalTier("obsidian")); - smeltBlackSteel = (new InformationBase("smeltBlackSteel", 4, 7, 3, ComponentListMF.ingots[7], smeltSteel)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50) - .setDescriptValues(getMetalTier("blacksteel")); - smeltDragonforge = (new InformationBase("smeltDragonforge", -4, -1, 1, ComponentListMF.dragon_heart, null)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50); - smeltRedSteel = (new InformationBase("smeltRedSteel", 3, 9, 5, ComponentListMF.ingots[10], smeltBlackSteel)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 65) - .setDescriptValues(getMetalTier("redsteel")); - smeltBlueSteel = (new InformationBase("smeltBlueSteel", 5, 9, 5, ComponentListMF.ingots[12], smeltBlackSteel)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 65) - .setDescriptValues(getMetalTier("bluesteel")); - smeltMithril = (new InformationBase("smeltMithril", 5, 12, 3, ComponentListMF.ingots[14], null)).registerStat() - .setPage(artisanry).addSkill(SkillList.artisanry, 75).setDescriptValues(getMetalTier("mithril")); - smeltAdamant = (new InformationBase("smeltAdamantium", 3, 12, 3, ComponentListMF.ingots[13], null)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 75) - .setDescriptValues(getMetalTier("adamantium")); - - smeltMaster = (new InformationBase("smeltMaster", 4, 13, 3, new ItemStack(ComponentListMF.artefacts, 1, 3), - (InformationBase) null)).registerStat().setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, - 100); - smeltIgnotumite = (new InformationBase("smeltIgnotumite", 2, 15, 3, ComponentListMF.ingots[15], smeltMaster)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100) - .setDescriptValues(getMetalTier("ignotumite")); - smeltMithium = (new InformationBase("smeltMithium", 6, 15, 3, ComponentListMF.ingots[16], smeltMaster)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100) - .setDescriptValues(getMetalTier("mithium")); - smeltEnderforge = (new InformationBase("smeltEnder", 4, 16, 3, ComponentListMF.ingots[17], smeltMaster)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100) - .setDescriptValues(getMetalTier("ender")); - - craftHCCTools = (new InformationBase("craftHCCTools", -1, -2, 0, ToolListMF.pickStone, (InformationBase) null)) - .registerStat().setPage(artisanry).setUnlocked(); - bellows = (new InformationBase("bellows", 0, -1, 0, BlockListMF.bellows, (InformationBase) null)).registerStat() - .setPage(artisanry).setUnlocked(); - trough = (new InformationBase("trough", 0, -2, 0, BlockListMF.trough_wood, bellows)).registerStat() - .setPage(artisanry).setUnlocked(); - forge = (new InformationBase("forge", 0, 0, 0, BlockListMF.forge, (InformationBase) null)).registerStat() - .setPage(artisanry).setUnlocked(); - anvil = (new InformationBase("anvil", -1, 0, 0, BlockListMF.anvil[1], forge)).registerStat().setPage(artisanry) - .setUnlocked().setSpecial(); - bar = (new InformationBase("bar", -1, 2, 0, ComponentListMF.bar, anvil)).registerStat().setPage(artisanry) - .setUnlocked(); - apron = (new InformationBase("apron", -1, -1, 0, ArmourListMF.leatherapron, anvil)).registerStat() - .setPage(artisanry).setUnlocked(); - craftTools = (new InformationBase("craftTools", -3, 2, 0, CustomToolListMF.standard_pick, bar)).registerStat() - .setPage(artisanry).setUnlocked(); - craftAdvTools = (new InformationBase("craftAdvTools", -5, 2, 0, CustomToolListMF.standard_hvypick, craftTools)) - .registerStat().setPage(artisanry).setUnlocked(); - craftWeapons = (new InformationBase("craftWeapons", -3, 1, 5, CustomToolListMF.standard_sword, bar)) - .registerStat().setPage(artisanry).setUnlocked(); - craftAdvWeapons = (new InformationBase("craftAdvWeapons", -5, 1, 0, CustomToolListMF.standard_battleaxe, - craftWeapons)).registerStat().setPage(artisanry).setUnlocked(); - arrows = (new InformationBase("arrows", -3, 4, 0, CustomToolListMF.standard_arrow, bar)).registerStat() - .setPage(artisanry).setUnlocked(); - - craftOrnate = (new InformationBase("craftOrnate", -3, -1, 1, ComponentListMF.ornate_items, null)).registerStat() - .setPage(artisanry).addSkill(SkillList.artisanry, 35); - craftArmourLight = (new InformationBase("craftArmourLight", -3, 3, 1, - ArmourListMF.armour(ArmourListMF.leather, 3, 1), anvil)).registerStat().setPage(artisanry) - .setUnlocked(); - craftArmourMedium = (new InformationBase("craftArmourMedium", -4, 3, 1, CustomArmourListMF.standard_chain_chest, - craftArmourLight)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 0); - craftArmourHeavy = (new InformationBase("craftArmourHeavy", -5, 3, 3, CustomArmourListMF.standard_plate_chest, - craftArmourMedium)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); - arrowsBodkin = (new InformationBase("arrowsBodkin", -4, 5, 1, CustomToolListMF.standard_arrow_bodkin, arrows)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); - arrowsBroad = (new InformationBase("arrowsBroad", -5, 5, 2, CustomToolListMF.standard_arrow_broad, arrows)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 20); - - // ENGINEERING - Highly Expensive - etools = (new InformationBase("etools", 3, 0, 0, CustomToolListMF.standard_spanner, (InformationBase) null)) - .registerStat().setPage(engineering).setUnlocked(); - ecomponents = (new InformationBase("ecomponents", 5, 0, 0, ComponentListMF.bolt, etools)).registerStat() - .setPage(engineering).setUnlocked(); - tungsten = (new InformationBase("tungsten", 8, -1, 1, ComponentListMF.ingots[18], ecomponents)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 20).addSkill(SkillList.artisanry, 20); - coke = (new InformationBase("coke", 4, -1, 2, ComponentListMF.coke, ecomponents)).registerStat() - .setPage(engineering); - climber = (new InformationBase("climber", 7, 0, 1, ToolListMF.climbing_pick_basic, ecomponents)).registerStat() - .setPage(engineering).setUnlocked(); - spyglass = (new InformationBase("spyglass", 8, 1, 2, new ItemStack(ToolListMF.spyglass, 1, 2), climber)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 5); - parachute = (new InformationBase("parachute", 9, 2, 2, ToolListMF.parachute, climber)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 10); - syringe = (new InformationBase("syringe", 5, -2, 1, ToolListMF.syringe_empty, ecomponents)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 25); - engTanner = (new InformationBase("engTanner", 5, 2, 1, BlockListMF.engTanner, ecomponents)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 40).addSkill(SkillList.artisanry, 25); - advcrucible = (new InformationBase("advcrucible", 7, 3, 1, BlockListMF.crucibleauto, engTanner)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 50).addSkill(SkillList.artisanry, 35); - advforge = (new InformationBase("advforge", 9, 3, 1, BlockListMF.forge_metal, advcrucible)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 75).addSkill(SkillList.artisanry, 50); - - blackpowder = (new InformationBase("blackpowder", 0, 0, 4, ComponentListMF.blackpowder, (InformationBase) null)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 0); - advblackpowder = (new InformationBase("advblackpowder", 2, -2, 2, ComponentListMF.blackpowder_advanced, - blackpowder)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 50); - bombs = (new InformationBase("bombs", 0, 2, 3, ToolListMF.bomb_custom, blackpowder)).registerStat() - .setPage(engineering).setSpecial().addSkill(SkillList.engineering, 10); - bpress = (new InformationBase("bpress", -1, 1, 2, BlockListMF.bombPress, bombs)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 30); - bombarrow = (new InformationBase("bombarrow", 1, 1, 2, ToolListMF.exploding_arrow, bombs)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 40); - bombFuse = (new InformationBase("bombFuse", 2, 2, 0, ComponentListMF.bomb_fuse, bombs)).registerStat() - .setUnlocked().setPage(engineering); - shrapnel = (new InformationBase("shrapnel", 0, 4, 1, ComponentListMF.shrapnel, bombs)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 25); - firebomb = (new InformationBase("firebomb", 0, 6, 2, Items.blaze_powder, shrapnel)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 85); - stickybomb = (new InformationBase("stickybomb", -2, 2, 1, Items.slime_ball, bombs)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 50); - bombCeramic = (new InformationBase("bombCeramic", 2, 3, 0, ComponentListMF.bomb_casing, bombs)).registerStat() - .setUnlocked().setPage(engineering); - bombIron = (new InformationBase("bombIron", 4, 5, 1, ComponentListMF.bomb_casing_iron, bombCeramic)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); - bombObsidian = (new InformationBase("bombObsidian", 4, 7, 2, ComponentListMF.bomb_casing_obsidian, bombIron)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 35); - bombCrystal = (new InformationBase("bombCrystal", 2, 9, 1, ComponentListMF.bomb_casing_crystal, bombObsidian)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); - mineCeramic = (new InformationBase("mineCeramic", -2, 3, 2, ComponentListMF.mine_casing, bombs)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 15); - mineIron = (new InformationBase("mineIron", -4, 5, 1, ComponentListMF.mine_casing_iron, mineCeramic)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); - mineObsidian = (new InformationBase("mineObsidian", -4, 7, 2, ComponentListMF.mine_casing_obsidian, mineIron)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 35); - mineCrystal = (new InformationBase("mineCrystal", -2, 9, 1, ComponentListMF.mine_casing_crystal, mineObsidian)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); - - crossbows = (new InformationBase("crossbows", -4, 0, 3, BlockListMF.crossbowBench, null)).registerStat() - .setPage(engineering).setSpecial().addSkill(SkillList.engineering, 0); - crossShafts = (new InformationBase("crossShafts", -6, 2, 0, ComponentListMF.crossbow_stock_wood, crossbows)) - .registerStat().setPage(engineering).setUnlocked(); - crossShaftAdvanced = (new InformationBase("crossShaftAdvanced", -6, 4, 2, ComponentListMF.crossbow_stock_iron, - crossShafts)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); - crossHeads = (new InformationBase("crossHeads", -2, -2, 0, ComponentListMF.cross_arms_basic, crossbows)) - .registerStat().setPage(engineering).setUnlocked(); - crossHeadAdvanced = (new InformationBase("crossHeadAdvanced", -3, -3, 2, ComponentListMF.cross_arms_advanced, - crossHeads)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 30); - crossBayonet = (new InformationBase("crossBayonet", -1, -3, 1, ComponentListMF.cross_bayonet, crossHeads)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 10); - crossAmmo = (new InformationBase("crossAmmo", -5, 3, 1, ComponentListMF.cross_ammo, crossShafts)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 30); - crossScope = (new InformationBase("crossScope", -7, 3, 1, ComponentListMF.cross_scope, crossShafts)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); - - cogArmour = (new InformationBase("cogArmour", 8, -3, 2, BlockListMF.cogwork_helm, tungsten)).registerStat() - .setPage(engineering).addSkill(SkillList.engineering, 60); - compPlate = (new InformationBase("compPlate", 10, -3, 1, ComponentListMF.ingotCompositeAlloy, tungsten)) - .registerStat().setPage(engineering).addSkill(SkillList.engineering, 50) - .addSkill(SkillList.artisanry, 40); - - repair_basic = (new InformationBase("repair_basic", 8, 0, 2, BlockListMF.repair_basic, (InformationBase) null)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); - repair_advanced = (new InformationBase("repair_advanced", 10, 0, 3, BlockListMF.repair_advanced, repair_basic)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 25); - repair_ornate = (new InformationBase("repair_ornate", 12, 2, 3, BlockListMF.repair_ornate, repair_advanced)) - .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50); - - constructionPts = (new InformationBase("constructionPts", 0, 0, 0, ComponentListMF.plank_cut, - (InformationBase) null)).registerStat().setPage(construction).setUnlocked(); - reinforced_stone = (new InformationBase("reinforced_stone", 1, 0, 0, BlockListMF.reinforced_stone, - (InformationBase) null)).registerStat().setPage(construction).setUnlocked(); - glass = (new InformationBase("glass", 0, 1, 0, BlockListMF.framed_glass, (InformationBase) null)).registerStat() - .setPage(construction).setUnlocked(); - brickworks = (new InformationBase("brickworks", 3, 0, 0, BlockListMF.cobble_brick, reinforced_stone)) - .registerStat().setPage(construction).setUnlocked(); - bars = (new InformationBase("bars", 0, 3, 0, BlockListMF.bars[2], glass)).registerStat().setPage(construction) - .setUnlocked(); - thatch = (new InformationBase("thatch", 0, -3, 0, BlockListMF.thatch, clay_wall)).registerStat() - .setPage(construction).setUnlocked(); - refined_planks = (new InformationBase("refined_planks", -1, 0, 1, BlockListMF.refined_planks, - (InformationBase) null)).registerStat().setPage(construction).addSkill(SkillList.construction, 0); - clay_wall = (new InformationBase("clay_wall", 0, -1, 2, BlockListMF.clayWall, (InformationBase) null)) - .registerStat().setPage(construction).addSkill(SkillList.construction, 5); - paint_brush = (new InformationBase("paint_brush", -3, 0, 1, ToolListMF.paint_brush, refined_planks)) - .registerStat().setPage(construction).addSkill(SkillList.construction, 10); - decorated_stone = (new InformationBase("decorated_stone", 5, 0, 2, BlockListMF.reinforced_stone_framed, - brickworks)).registerStat().setPage(construction).addSkill(SkillList.construction, 15); - - bed_roll = (new InformationBase("bed_roll", 2, 3, 1, ToolListMF.bedroll, (InformationBase) null)).registerStat() - .setPage(construction).setUnlocked(); - tool_rack = (new InformationBase("tool_rack", 2, 2, 0, BlockListMF.rack_wood, (InformationBase) null)) - .registerStat().setPage(construction).setUnlocked(); - food_box = (new InformationBase("food_box", 2, 4, 1, BlockListMF.food_box_basic, tool_rack)).registerStat() - .setPage(construction).setUnlocked(); - ammo_box = (new InformationBase("ammo_box", 4, 4, 1, BlockListMF.ammo_box_basic, food_box)).registerStat() - .setPage(construction).addSkill(SkillList.construction, 15); - big_box = (new InformationBase("big_box", 6, 4, 1, BlockListMF.crate_basic, ammo_box)).registerStat() - .setPage(construction).addSkill(SkillList.construction, 25); - - // COOKING -The Cheapest - cookingutensil = (new InformationBase("cookingutensil", -1, 0, 0, FoodListMF.pie_tray, (InformationBase) null)) - .registerStat().setPage(provisioning).setUnlocked(); - firepit = (new InformationBase("firepit", 0, 0, 0, BlockListMF.firepit, (InformationBase) null)).registerStat() - .setPage(provisioning).setUnlocked(); - - generic_meat = (new InformationBase("generic_meat", 0, -1, 0, FoodListMF.generic_meat_uncooked, - (InformationBase) null)).registerStat().setPage(provisioning).setUnlocked(); - stew = (new InformationBase("stew", 0, -3, 0, FoodListMF.stew, generic_meat)).registerStat() - .setPage(provisioning).setUnlocked(); - jerky = (new InformationBase("jerky", 0, -5, 1, FoodListMF.jerky, stew)).registerStat().setPage(provisioning) - .addSkill(SkillList.provisioning, 10); - saussage = (new InformationBase("saussage", 2, -5, 2, FoodListMF.saussage_cooked, jerky)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 35); - sandwitch = (new InformationBase("sandwitch", 1, -7, 3, FoodListMF.sandwitch_meat, jerky)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 15); - sandwitchBig = (new InformationBase("sandwitchBig", 3, -7, 3, FoodListMF.sandwitch_big, sandwitch)) - .registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 25); - meatpie = (new InformationBase("meatpie", -1, -7, 2, BlockListMF.pie_meat, jerky)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 35); - shepardpie = (new InformationBase("shepardpie", -2, -9, 3, BlockListMF.pie_shepards, meatpie)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 80); - bread = (new InformationBase("bread", 1, 0, 0, FoodListMF.breadroll, (InformationBase) null)).registerStat() - .setPage(provisioning).setUnlocked(); - oats = (new InformationBase("oats", 3, 0, 0, FoodListMF.oats, bread)).registerStat().setPage(provisioning) - .setUnlocked(); - - salt = (new InformationBase("salt", -2, -2, 0, FoodListMF.salt, (InformationBase) null)).registerStat() - .setPage(provisioning).setUnlocked(); - jug = (new InformationBase("jug", -1, -2, 0, FoodListMF.jug_water, (InformationBase) null)).registerStat() - .setPage(provisioning).setUnlocked(); - berry = (new InformationBase("berry", 0, 1, 0, FoodListMF.berries, (InformationBase) null)).registerStat() - .setPage(provisioning).setUnlocked(); - icing = (new InformationBase("icing", -1, 2, 0, FoodListMF.icing, berry)).registerStat().setPage(provisioning) - .setUnlocked(); - sweetroll = (new InformationBase("sweetroll", 0, 3, 2, FoodListMF.sweetroll, berry)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 15); - eclair = (new InformationBase("eclair", 2, 3, 3, FoodListMF.eclair, sweetroll)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 75); - cake = (new InformationBase("cake", 0, 5, 2, BlockListMF.cake_vanilla, sweetroll)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 25); - carrotcake = (new InformationBase("carrotcake", -1, 7, 3, BlockListMF.cake_carrot, cake)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 40); - chococake = (new InformationBase("chococake", 1, 7, 3, BlockListMF.cake_chocolate, cake)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 40); - bfcake = (new InformationBase("bfcake", 1, 9, 4, BlockListMF.cake_bf, chococake)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 90); - berrypie = (new InformationBase("berrypie", 2, 1, 2, BlockListMF.pie_berry, berry)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 20); - applepie = (new InformationBase("applepie", 4, 1, 2, BlockListMF.pie_apple, berrypie)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 30); - - cheese = (new InformationBase("cheese", 1, -1, 0, BlockListMF.cheese_wheel, (InformationBase) null)) - .registerStat().setPage(provisioning).setUnlocked(); - cheeseroll = (new InformationBase("cheeseroll", 3, -1, 2, FoodListMF.cheese_roll, cheese)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 15); - - bandage = (new InformationBase("bandage", -3, 0, 0, ToolListMF.bandage_wool, (InformationBase) null)) - .registerStat().setPage(provisioning).setUnlocked(); - bandageadv = (new InformationBase("bandageadv", -5, -1, 2, ToolListMF.bandage_tough, bandage)).registerStat() - .setPage(provisioning).addSkill(SkillList.provisioning, 40); - - // MASTERY - toughness = (new InformationBase("toughness", -1, 0, 0, CustomArmourListMF.standard_plate_helmet, - (InformationBase) null)).registerStat().setPage(mastery).addSkill(SkillList.combat, 10).setPerk(); - fitness = (new InformationBase("fitness", 1, 0, 0, ComponentListMF.dragon_heart, (InformationBase) null)) - .registerStat().setPage(mastery).addSkill(SkillList.combat, 20).setPerk(); - armourpro = (new InformationBase("armourpro", 2, -1, 0, Items.diamond_chestplate, fitness)).registerStat() - .setPage(mastery).addSkill(SkillList.combat, 60).setPerk(); - parrypro = (new InformationBase("parrypro", -2, -1, 0, Items.iron_sword, toughness)).registerStat() - .setPage(mastery).addSkill(SkillList.combat, 20).setPerk(); - counteratt = (new InformationBase("counteratt", -1, -2, 0, CustomToolListMF.standard_waraxe, parrypro)) - .registerStat().setPage(mastery).addSkill(SkillList.combat, 25).setPerk(); - autoparry = (new InformationBase("autoparry", -3, -2, 0, CustomToolListMF.standard_sword, parrypro)) - .registerStat().setPage(mastery).addSkill(SkillList.combat, 50).setPerk(); - firstaid = (new InformationBase("firstaid", 0, 1, 0, ToolListMF.bandage_wool, (InformationBase) null)) - .registerStat().setPage(mastery).addSkill(SkillList.provisioning, 25).setPerk(); - doctor = (new InformationBase("doctor", 0, 3, 0, ToolListMF.syringe, firstaid)).registerStat().setPage(mastery) - .addSkill(SkillList.provisioning, 50).setPerk(); - scrapper = (new InformationBase("scrapper", 0, -1, 0, BlockListMF.salvage_basic, (InformationBase) null)) - .registerStat().setPage(mastery).addSkill(SkillList.artisanry, 35).setPerk(); - - } - - private static Object getMetalTier(String string) { - CustomMaterial mat = MetalMaterial.getMaterial(string); - if (mat != null) - return mat.crafterTier; - - return "?"; - } - - public static IRecipe firepitRecipe, cooktopRecipe, carpenterRecipe, waterJugR, milkJugR, plantOilR, sugarRecipe, - stickRecipe, dryrocksR, meatpieOut, shepardOut, cheeseOut, berryOut, appleOut, pumpPieOut; - public static final ArrayList plankRecipe = new ArrayList(); - public static final ArrayList stoneBricksR = new ArrayList(); - - public static IAnvilRecipe hunkR, ingotR, bucketR, crestR; - public static final ArrayList barR = new ArrayList(); - public static final ArrayList baringotR = new ArrayList(); - - public static final ArrayList talismanRecipe = new ArrayList(); - public static ICarpenterRecipe artBookR, conBookR, proBookR, engBookR, comBookR, artBook2R, conBook2R, proBook2R, - engBook2R, comBook2R; - public static IAnvilRecipe greatTalismanRecipe; - - public static ICarpenterRecipe fireclayR, fireBrickR, fireBricksR, fireBrickStairR, refinedPlankBlockR, clayWallR, - bSalvageR, tannerRecipe, stoneAnvilRecipe, forgeRecipe, apronRecipe, woodTroughRecipe; - public static ICarpenterRecipe researchTableRecipe, framedGlassR, windowR, thatchR, thatchStairR; - public static IAnvilRecipe smokePipeR, framedStoneR, iframedStoneR, fluxR, nailR, rivetR; - public static final ArrayList barsR = new ArrayList(); - - public static IAnvilRecipe tinderboxR, flintAndSteelR; - public static ICarpenterRecipe dirtRockR, lStripsR, threadR, stringR, sharpRocksR, stonePickR, stoneAxeR, - stoneSpadeR, stoneHoeR, stoneSwordR, stoneWarR, stoneMaceR, stoneSpearR, stoneHammerR, stoneTongsR, - boneNeedleR, stoneKnifeR, quernR, stoneovenRecipe; - - public static Alloy[] reStone, bronze, steel, obsidalloy, black, red, blue, mithril, adamantium, ignotumite, - mithium, enderforge, wolframiteR; - public static IAnvilRecipe coalfluxR, encrustedR, steelR, obsidianHunkR, diamondR; - public static ICarpenterRecipe nailPlanksR, nailStairR, refinedStairR, strongRackR, bellowsRecipe, bloomeryR, - crucibleRecipe, advCrucibleRecipe, trilogyRecipe, chimneyRecipe, wideChimneyRecipe, extractChimneyRecipe; - - public static ICarpenterRecipe hideHelmR, hideChestR, hideLegsR, hideBootsR, roughHelmetR, roughChestR, roughLegsR, - roughBootsR, reHelmetR, reChestR, reLegsR, reBootsR; - public static IAnvilRecipe studHelmetR, studChestR, studLegsR, studBootsR; - public static final ArrayList mailRecipes = new ArrayList(); - public static final ArrayList mailHelmetR = new ArrayList(); - public static final ArrayList mailChestR = new ArrayList(); - public static final ArrayList mailLegsR = new ArrayList(); - public static final ArrayList mailBootsR = new ArrayList(); - - public static final ArrayList scaleRecipes = new ArrayList(); - public static final ArrayList scaleHelmetR = new ArrayList(); - public static final ArrayList scaleChestR = new ArrayList(); - public static final ArrayList scaleLegsR = new ArrayList(); - public static final ArrayList scaleBootsR = new ArrayList(); - - public static final ArrayList splintRecipes = new ArrayList(); - public static final ArrayList splintHelmetR = new ArrayList(); - public static final ArrayList splintChestR = new ArrayList(); - public static final ArrayList splintLegsR = new ArrayList(); - public static final ArrayList splintBootsR = new ArrayList(); - - public static final ArrayList plateRecipes = new ArrayList(); - public static final ArrayList plateHelmetR = new ArrayList(); - public static final ArrayList plateChestR = new ArrayList(); - public static final ArrayList plateLegsR = new ArrayList(); - public static final ArrayList plateBootsR = new ArrayList(); - - public static final ArrayList ornateWepsR = new ArrayList(); - public static final ArrayList advOrnateWepsR = new ArrayList(); - - public static IAnvilRecipe pickR, axeR, spadeR, hoeR, shearsR; - public static IAnvilRecipe daggerR, swordR, waraxeR, maceR, spearR, bowR, katanaR, gswordR, whammerR, battleaxeR, - halbeardR, lanceR; - public static IAnvilRecipe trowR, hvyPickR, hvyShovelR, handpickR, scytheR, mattockR, lumberR; - public static IAnvilRecipe hammerR, tongsR, hvyHammerR, needleR, sawsR, knifeR, spannerR; - public static IAnvilRecipe arrowheadR, bodkinheadR, broadheadR, crossBoltR; - - public static ICarpenterRecipe fletchingR, fletchingR2, malletR, spoonR; - public static final ArrayList arrowR = new ArrayList(); - - public static IAnvilRecipe ironPrepR, ironPrepR2, coalPrepR; - public static IAnvilRecipe blastChamR, blastHeatR, bigFurnR, bigHeatR; - - public static ICarpenterRecipe padding[] = new ICarpenterRecipe[4]; - public static ICarpenterRecipe repairBasicR, repairAdvancedR, repairOrnateR; - public static ICarpenterRecipe spyglassR, bombBenchCraft, bombPressCraft, advancedForgeR, engTannerR, autoCrucibleR; - public static ICarpenterRecipe crudeBombR, bombFuseR, longFuseR; - public static ICarpenterRecipe crossBenchCraft, crossStockWoodR, crossStockIronR, crossHandleWoodR, crossHeadLightR, - crossHeadMediumR, crossHeadHeavyR, crossHeadAdvancedR, crossAmmoR, crossScopeR; - - public static ICarpenterRecipe bombCaseCeramicR, mineCaseCeramicR, bombCaseCrystalR, mineCaseCrystalR; - public static IAnvilRecipe bombCaseIronR, mineCaseIronR, bombCaseObsidianR, mineCaseObsidianR, crossBayonetR; - - public static final ArrayList meatRecipes = new ArrayList(); - public static ICarpenterRecipe meatStripR, meatHunkR, gutsRecipe; - public static IAnvilRecipe caketinRecipe; - public static ICarpenterRecipe breadSliceR, pastryRecipe, doughRecipe, breadRecipe, curdRecipe, oatsRecipe, - custardRecipe, icingRecipe, stewRecipe, saussageR, jerkyRecipe, meatPieRecipe, sandwitchRecipe, - sandwitchBigRecipe, shepardRecipe, sweetrollRecipe, iceSR, eclairDoughR, eclairIceR, eclairFillR; - public static ICarpenterRecipe pumpPieR, simpCakeR, simpCakeOut, berryR, appleR, cheeserollR, cakeR, carrotCakeR, - chocoCakeR, bfCakeR, cakeI, carrotCakeI, chocoCakeI, bfCakeI; - - public static ICarpenterRecipe syringeR, parachuteR, bandageR, badBandageR, goodBandageR, cogShaftR; - - public static IAnvilRecipe hingeRecipe, brushRecipe, climbPickbR, iframeR, boltR, istrutR, bgearR, tgearR, stubeR, - eatoolsR, bombarrowR, bombBoltR, compPlateR; - public static ICarpenterRecipe mouldRecipe, jugRecipe, potRecipe, pieTrayRecipe, blackpowderRec, advblackpowderRec, - magmaRefinedR, chocoRecipe, bedrollR; - - public static IAnvilRecipe frameBlockR, cogPulleyR, cogLegsR, cogChestR, cogHelmR; - public static ArrayList hugePlateR = new ArrayList(); - public static ArrayList cogPlateR = new ArrayList(); - - public static final ArrayList easyPaintPlank = new ArrayList(); - public static final ArrayList refinedPlankR = new ArrayList(); +import java.util.ArrayList; - public static ArrayList sawnPlankR = new ArrayList(); - public static ArrayList plankPaneR = new ArrayList(); - public static ArrayList rackRecipe = new ArrayList(); - public static ArrayList foodboxR = new ArrayList(); - public static ArrayList ammoboxR = new ArrayList(); - public static ArrayList bigboxR = new ArrayList(); - public static ArrayList nailTroughR = new ArrayList(); +public class KnowledgeListMF { + public static final ArrayList plankRecipe = new ArrayList(); + public static final ArrayList stoneBricksR = new ArrayList(); + public static final ArrayList barR = new ArrayList(); + public static final ArrayList baringotR = new ArrayList(); + public static final ArrayList talismanRecipe = new ArrayList(); + public static final ArrayList barsR = new ArrayList(); + public static final ArrayList mailRecipes = new ArrayList(); + public static final ArrayList mailHelmetR = new ArrayList(); + public static final ArrayList mailChestR = new ArrayList(); + public static final ArrayList mailLegsR = new ArrayList(); + public static final ArrayList mailBootsR = new ArrayList(); + public static final ArrayList scaleRecipes = new ArrayList(); + public static final ArrayList scaleHelmetR = new ArrayList(); + public static final ArrayList scaleChestR = new ArrayList(); + public static final ArrayList scaleLegsR = new ArrayList(); + public static final ArrayList scaleBootsR = new ArrayList(); + public static final ArrayList splintRecipes = new ArrayList(); + public static final ArrayList splintHelmetR = new ArrayList(); + public static final ArrayList splintChestR = new ArrayList(); + public static final ArrayList splintLegsR = new ArrayList(); + public static final ArrayList splintBootsR = new ArrayList(); + public static final ArrayList plateRecipes = new ArrayList(); + public static final ArrayList plateHelmetR = new ArrayList(); + public static final ArrayList plateChestR = new ArrayList(); + public static final ArrayList plateLegsR = new ArrayList(); + public static final ArrayList plateBootsR = new ArrayList(); + public static final ArrayList ornateWepsR = new ArrayList(); + public static final ArrayList advOrnateWepsR = new ArrayList(); + public static final ArrayList arrowR = new ArrayList(); + public static final ArrayList meatRecipes = new ArrayList(); + public static final ArrayList easyPaintPlank = new ArrayList(); + public static final ArrayList refinedPlankR = new ArrayList(); + public static InformationPage artisanry = InformationList.artisanry; + public static InformationPage construction = InformationList.construction; + public static InformationPage engineering = InformationList.engineering; + public static InformationPage provisioning = InformationList.provisioning; + public static InformationPage mastery = InformationList.mastery; + // BASICS -FREE + public static InformationBase carpenter, gettingStarted, salvage, research, talisman, ores, plants, chimney, + tanning, commodities, dust, craftCrafters, stamina, combat, craftArmourBasic, craftHCCTools, firemaker, + dragons, minotaurs; + public static InformationBase bloomery, crucible, crucible2, smeltCopper, smeltBronze, smeltIron, coalflux, bigfurn, + blastfurn, smeltPig, smeltSteel, encrusted, obsidian, smeltBlackSteel, smeltDragonforge, smeltBlueSteel, + smeltRedSteel, smeltMithril, smeltAdamant, smeltMaster, smeltMithium, smeltIgnotumite, smeltEnderforge; + public static InformationBase bellows, trough, forge, anvil, bar, apron, craftTools, craftAdvTools, craftWeapons, + craftAdvWeapons, arrows, craftOrnate, craftArmourLight, craftArmourMedium, craftArmourHeavy, arrowsBodkin, + arrowsBroad, repair_basic, repair_advanced, repair_ornate; + public static InformationBase coke, etools, ecomponents, tungsten, climber, spyglass, parachute, syringe, engTanner, + advforge, advcrucible, blackpowder, advblackpowder, bombs, bpress, bombarrow, bombFuse, shrapnel, firebomb, + stickybomb, bombCeramic, bombIron, bombObsidian, bombCrystal, mineCeramic, mineIron, mineObsidian, + mineCrystal, crossbows, crossShafts, crossHeads, crossHeadAdvanced, crossShaftAdvanced, crossAmmo, + crossScope, crossBayonet, cogArmour, compPlate; + public static InformationBase constructionPts, refined_planks, reinforced_stone, clay_wall, glass, brickworks, + decorated_stone, bars, thatch, easyRefine, paint_brush, tool_rack, food_box, ammo_box, big_box, bed_roll; + public static InformationBase toughness, fitness, armourpro, parrypro, counteratt, autoparry, scrapper, firstaid, + doctor; + public static InformationBase cookingutensil, firepit, generic_meat, stew, jerky, saussage, sandwitch, sandwitchBig, + meatpie, shepardpie, bread, oats, salt, jug, berry, icing, sweetroll, eclair, cake, carrotcake, chococake, + bfcake, applepie, berrypie, cheese, cheeseroll, bandage, bandageadv; + public static IRecipe firepitRecipe, cooktopRecipe, carpenterRecipe, waterJugR, milkJugR, plantOilR, sugarRecipe, + stickRecipe, dryrocksR, meatpieOut, shepardOut, cheeseOut, berryOut, appleOut, pumpPieOut; + public static IAnvilRecipe hunkR, ingotR, bucketR, crestR; + public static ICarpenterRecipe artBookR, conBookR, proBookR, engBookR, comBookR, artBook2R, conBook2R, proBook2R, + engBook2R, comBook2R; + public static IAnvilRecipe greatTalismanRecipe; + public static ICarpenterRecipe fireclayR, fireBrickR, fireBricksR, fireBrickStairR, refinedPlankBlockR, clayWallR, + bSalvageR, tannerRecipe, stoneAnvilRecipe, forgeRecipe, apronRecipe, woodTroughRecipe; + public static ICarpenterRecipe researchTableRecipe, framedGlassR, windowR, thatchR, thatchStairR; + public static IAnvilRecipe smokePipeR, framedStoneR, iframedStoneR, fluxR, nailR, rivetR; + public static IAnvilRecipe tinderboxR, flintAndSteelR; + public static ICarpenterRecipe dirtRockR, lStripsR, threadR, stringR, sharpRocksR, stonePickR, stoneAxeR, + stoneSpadeR, stoneHoeR, stoneSwordR, stoneWarR, stoneMaceR, stoneSpearR, stoneHammerR, stoneTongsR, + boneNeedleR, stoneKnifeR, quernR, stoneovenRecipe; + public static Alloy[] reStone, bronze, steel, obsidalloy, black, red, blue, mithril, adamantium, ignotumite, + mithium, enderforge, wolframiteR; + public static IAnvilRecipe coalfluxR, encrustedR, steelR, obsidianHunkR, diamondR; + public static ICarpenterRecipe nailPlanksR, nailStairR, refinedStairR, strongRackR, bellowsRecipe, bloomeryR, + crucibleRecipe, advCrucibleRecipe, trilogyRecipe, chimneyRecipe, wideChimneyRecipe, extractChimneyRecipe; + public static ICarpenterRecipe hideHelmR, hideChestR, hideLegsR, hideBootsR, roughHelmetR, roughChestR, roughLegsR, + roughBootsR, reHelmetR, reChestR, reLegsR, reBootsR; + public static IAnvilRecipe studHelmetR, studChestR, studLegsR, studBootsR; + public static IAnvilRecipe pickR, axeR, spadeR, hoeR, shearsR; + public static IAnvilRecipe daggerR, swordR, waraxeR, maceR, spearR, bowR, katanaR, gswordR, whammerR, battleaxeR, + halbeardR, lanceR; + public static IAnvilRecipe trowR, hvyPickR, hvyShovelR, handpickR, scytheR, mattockR, lumberR; + public static IAnvilRecipe hammerR, tongsR, hvyHammerR, needleR, sawsR, knifeR, spannerR; + public static IAnvilRecipe arrowheadR, bodkinheadR, broadheadR, crossBoltR; + public static ICarpenterRecipe fletchingR, fletchingR2, malletR, spoonR; + public static IAnvilRecipe ironPrepR, ironPrepR2, coalPrepR; + public static IAnvilRecipe blastChamR, blastHeatR, bigFurnR, bigHeatR; + public static ICarpenterRecipe padding[] = new ICarpenterRecipe[4]; + public static ICarpenterRecipe repairBasicR, repairAdvancedR, repairOrnateR; + public static ICarpenterRecipe spyglassR, bombBenchCraft, bombPressCraft, advancedForgeR, engTannerR, autoCrucibleR; + public static ICarpenterRecipe crudeBombR, bombFuseR, longFuseR; + public static ICarpenterRecipe crossBenchCraft, crossStockWoodR, crossStockIronR, crossHandleWoodR, crossHeadLightR, + crossHeadMediumR, crossHeadHeavyR, crossHeadAdvancedR, crossAmmoR, crossScopeR; + public static ICarpenterRecipe bombCaseCeramicR, mineCaseCeramicR, bombCaseCrystalR, mineCaseCrystalR; + public static IAnvilRecipe bombCaseIronR, mineCaseIronR, bombCaseObsidianR, mineCaseObsidianR, crossBayonetR; + public static ICarpenterRecipe meatStripR, meatHunkR, gutsRecipe; + public static IAnvilRecipe caketinRecipe; + public static ICarpenterRecipe breadSliceR, pastryRecipe, doughRecipe, breadRecipe, curdRecipe, oatsRecipe, + custardRecipe, icingRecipe, stewRecipe, saussageR, jerkyRecipe, meatPieRecipe, sandwitchRecipe, + sandwitchBigRecipe, shepardRecipe, sweetrollRecipe, iceSR, eclairDoughR, eclairIceR, eclairFillR; + public static ICarpenterRecipe pumpPieR, simpCakeR, simpCakeOut, berryR, appleR, cheeserollR, cakeR, carrotCakeR, + chocoCakeR, bfCakeR, cakeI, carrotCakeI, chocoCakeI, bfCakeI; + + public static ICarpenterRecipe syringeR, parachuteR, bandageR, badBandageR, goodBandageR, cogShaftR; + + public static IAnvilRecipe hingeRecipe, brushRecipe, climbPickbR, iframeR, boltR, istrutR, bgearR, tgearR, stubeR, + eatoolsR, bombarrowR, bombBoltR, compPlateR; + public static ICarpenterRecipe mouldRecipe, jugRecipe, potRecipe, pieTrayRecipe, blackpowderRec, advblackpowderRec, + magmaRefinedR, chocoRecipe, bedrollR; + + public static IAnvilRecipe frameBlockR, cogPulleyR, cogLegsR, cogChestR, cogHelmR; + public static ArrayList hugePlateR = new ArrayList(); + public static ArrayList cogPlateR = new ArrayList(); + public static ArrayList sawnPlankR = new ArrayList(); + public static ArrayList plankPaneR = new ArrayList(); + public static ArrayList rackRecipe = new ArrayList(); + public static ArrayList foodboxR = new ArrayList(); + public static ArrayList ammoboxR = new ArrayList(); + public static ArrayList bigboxR = new ArrayList(); + public static ArrayList nailTroughR = new ArrayList(); + + public static void init() { + carpenter = (new InformationBase("carpenter", 0, -3, 0, BlockListMF.carpenter, (InformationBase) null)) + .registerStat().setUnlocked(); + salvage = (new InformationBase("salvage", 0, -4, 0, BlockListMF.salvage_basic, (InformationBase) null)) + .registerStat().setUnlocked(); + gettingStarted = (new InformationBase("gettingStarted", 0, 0, 0, Items.book, (InformationBase) null)) + .registerStat().setUnlocked(); + research = (new InformationBase("research", 1, 1, 0, ToolListMF.researchBook, (InformationBase) null)) + .registerStat().setUnlocked(); + talisman = (new InformationBase("talisman", 4, 2, 0, ComponentListMF.talisman_lesser, research)).registerStat() + .setUnlocked(); + ores = (new InformationBase("ores", 1, -2, 0, BlockListMF.oreCopper, (InformationBase) null)).registerStat() + .setUnlocked(); + plants = (new InformationBase("plants", 1, -3, 0, BlockListMF.log_ironbark, ores)).registerStat().setUnlocked(); + chimney = (new InformationBase("chimney", 0, 2, 0, BlockListMF.chimney_stone, (InformationBase) null)) + .registerStat().setUnlocked(); + tanning = (new InformationBase("tanning", 0, -2, 0, Items.leather, (InformationBase) null)).registerStat() + .setUnlocked().setSpecial(); + commodities = (new InformationBase("commodities", -1, -2, 0, ComponentListMF.nail, (InformationBase) null)) + .registerStat().setUnlocked(); + dust = (new InformationBase("dust", -1, -3, 0, ComponentListMF.clay_pot, commodities)).registerStat() + .setUnlocked(); + craftCrafters = (new InformationBase("craftCrafters", -1, 1, 0, CustomToolListMF.standard_hammer, + (InformationBase) null)).registerStat().setUnlocked(); + stamina = (new InformationBase("stamina", -3, 1, 0, Items.feather, craftCrafters)).registerStat().setUnlocked(); + combat = (new InformationBase("combat", -5, 2, 0, Items.iron_sword, stamina)).registerStat().setUnlocked(); + craftArmourBasic = (new InformationBase("craftArmourBasic", -5, 0, 5, + ArmourListMF.armour(ArmourListMF.leather, 0, 1), combat)).registerStat().setUnlocked(); + firemaker = (new InformationBase("firemaker", 5, 1, 0, Items.flint_and_steel, (InformationBase) null)) + .registerStat().setUnlocked(); + + dragons = (new InformationBase("dragons", -1, 3, 0, ComponentListMF.dragon_heart, (InformationBase) null)) + .registerStat().setUnlocked(); + minotaurs = (new InformationBase("minotaurs", 1, 3, 0, Items.beef, (InformationBase) null)).registerStat() + .setUnlocked(); + + // ARTISANRY -From Not very to the most Expensive + bloomery = (new InformationBase("bloomery", 4, -2, 0, BlockListMF.bloomery, crucible)).registerStat() + .setPage(artisanry).setUnlocked().setSpecial(); + crucible = (new InformationBase("crucible", 4, 0, 0, BlockListMF.crucible, (InformationBase) null)) + .registerStat().setPage(artisanry).setUnlocked().setSpecial(); + crucible2 = (new InformationBase("crucible2", 6, 0, 1, BlockListMF.crucibleadv_active, crucible)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 40); + + smeltCopper = (new InformationBase("smeltCopper", 1, 0, 0, ComponentListMF.ingots[0], (InformationBase) null)) + .registerStat().setPage(artisanry).setUnlocked().setDescriptValues(getMetalTier("copper")); + smeltBronze = (new InformationBase("smeltBronze", 1, 2, 2, ComponentListMF.ingots[2], crucible)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 5).setDescriptValues(getMetalTier("bronze")); + smeltIron = (new InformationBase("smeltIron", 1, 4, 1, Items.iron_ingot, null)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 10).setDescriptValues(getMetalTier("iron")); + coalflux = (new InformationBase("coalflux", 1, 6, 2, ComponentListMF.coal_flux, smeltIron)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 15); + blastfurn = (new InformationBase("blastfurn", 2, 5, 5, BlockListMF.blast_heater_active, smeltIron)) + .registerStat().setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, 25); + bigfurn = (new InformationBase("bigfurn", 0, 5, 4, BlockListMF.furnace_stone, smeltIron)).registerStat() + .setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, 10); + smeltPig = (new InformationBase("smeltPig", 3, 3, 0, ComponentListMF.ingots[3], blastfurn)).registerStat() + .setPage(artisanry).setUnlocked().addSkill(SkillList.artisanry, 25); + smeltSteel = (new InformationBase("smeltSteel", 4, 5, 1, ComponentListMF.ingots[4], smeltPig)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 25).setDescriptValues(getMetalTier("Steel")); + encrusted = (new InformationBase("smeltEncrusted", 6, 5, 2, ComponentListMF.diamond_shards, smeltSteel)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 35) + .setDescriptValues(getMetalTier("encrusted")); + obsidian = (new InformationBase("smeltObsidian", 6, 3, 2, ComponentListMF.ingots[19], smeltSteel)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 40) + .setDescriptValues(getMetalTier("obsidian")); + smeltBlackSteel = (new InformationBase("smeltBlackSteel", 4, 7, 3, ComponentListMF.ingots[7], smeltSteel)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50) + .setDescriptValues(getMetalTier("blacksteel")); + smeltDragonforge = (new InformationBase("smeltDragonforge", -4, -1, 1, ComponentListMF.dragon_heart, null)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50); + smeltRedSteel = (new InformationBase("smeltRedSteel", 3, 9, 5, ComponentListMF.ingots[10], smeltBlackSteel)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 65) + .setDescriptValues(getMetalTier("redsteel")); + smeltBlueSteel = (new InformationBase("smeltBlueSteel", 5, 9, 5, ComponentListMF.ingots[12], smeltBlackSteel)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 65) + .setDescriptValues(getMetalTier("bluesteel")); + smeltMithril = (new InformationBase("smeltMithril", 5, 12, 3, ComponentListMF.ingots[14], null)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 75).setDescriptValues(getMetalTier("mithril")); + smeltAdamant = (new InformationBase("smeltAdamantium", 3, 12, 3, ComponentListMF.ingots[13], null)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 75) + .setDescriptValues(getMetalTier("adamantium")); + + smeltMaster = (new InformationBase("smeltMaster", 4, 13, 3, new ItemStack(ComponentListMF.artefacts, 1, 3), + (InformationBase) null)).registerStat().setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, + 100); + smeltIgnotumite = (new InformationBase("smeltIgnotumite", 2, 15, 3, ComponentListMF.ingots[15], smeltMaster)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100) + .setDescriptValues(getMetalTier("ignotumite")); + smeltMithium = (new InformationBase("smeltMithium", 6, 15, 3, ComponentListMF.ingots[16], smeltMaster)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100) + .setDescriptValues(getMetalTier("mithium")); + smeltEnderforge = (new InformationBase("smeltEnder", 4, 16, 3, ComponentListMF.ingots[17], smeltMaster)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 100) + .setDescriptValues(getMetalTier("ender")); + + craftHCCTools = (new InformationBase("craftHCCTools", -1, -2, 0, ToolListMF.pickStone, (InformationBase) null)) + .registerStat().setPage(artisanry).setUnlocked(); + bellows = (new InformationBase("bellows", 0, -1, 0, BlockListMF.bellows, (InformationBase) null)).registerStat() + .setPage(artisanry).setUnlocked(); + trough = (new InformationBase("trough", 0, -2, 0, BlockListMF.trough_wood, bellows)).registerStat() + .setPage(artisanry).setUnlocked(); + forge = (new InformationBase("forge", 0, 0, 0, BlockListMF.forge, (InformationBase) null)).registerStat() + .setPage(artisanry).setUnlocked(); + anvil = (new InformationBase("anvil", -1, 0, 0, BlockListMF.anvil[1], forge)).registerStat().setPage(artisanry) + .setUnlocked().setSpecial(); + bar = (new InformationBase("bar", -1, 2, 0, ComponentListMF.bar, anvil)).registerStat().setPage(artisanry) + .setUnlocked(); + apron = (new InformationBase("apron", -1, -1, 0, ArmourListMF.leatherapron, anvil)).registerStat() + .setPage(artisanry).setUnlocked(); + craftTools = (new InformationBase("craftTools", -3, 2, 0, CustomToolListMF.standard_pick, bar)).registerStat() + .setPage(artisanry).setUnlocked(); + craftAdvTools = (new InformationBase("craftAdvTools", -5, 2, 0, CustomToolListMF.standard_hvypick, craftTools)) + .registerStat().setPage(artisanry).setUnlocked(); + craftWeapons = (new InformationBase("craftWeapons", -3, 1, 5, CustomToolListMF.standard_sword, bar)) + .registerStat().setPage(artisanry).setUnlocked(); + craftAdvWeapons = (new InformationBase("craftAdvWeapons", -5, 1, 0, CustomToolListMF.standard_battleaxe, + craftWeapons)).registerStat().setPage(artisanry).setUnlocked(); + arrows = (new InformationBase("arrows", -3, 4, 0, CustomToolListMF.standard_arrow, bar)).registerStat() + .setPage(artisanry).setUnlocked(); + + craftOrnate = (new InformationBase("craftOrnate", -3, -1, 1, ComponentListMF.ornate_items, null)).registerStat() + .setPage(artisanry).addSkill(SkillList.artisanry, 35); + craftArmourLight = (new InformationBase("craftArmourLight", -3, 3, 1, + ArmourListMF.armour(ArmourListMF.leather, 3, 1), anvil)).registerStat().setPage(artisanry) + .setUnlocked(); + craftArmourMedium = (new InformationBase("craftArmourMedium", -4, 3, 1, CustomArmourListMF.standard_chain_chest, + craftArmourLight)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 0); + craftArmourHeavy = (new InformationBase("craftArmourHeavy", -5, 3, 3, CustomArmourListMF.standard_plate_chest, + craftArmourMedium)).registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); + arrowsBodkin = (new InformationBase("arrowsBodkin", -4, 5, 1, CustomToolListMF.standard_arrow_bodkin, arrows)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); + arrowsBroad = (new InformationBase("arrowsBroad", -5, 5, 2, CustomToolListMF.standard_arrow_broad, arrows)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 20); + + // ENGINEERING - Highly Expensive + etools = (new InformationBase("etools", 3, 0, 0, CustomToolListMF.standard_spanner, (InformationBase) null)) + .registerStat().setPage(engineering).setUnlocked(); + ecomponents = (new InformationBase("ecomponents", 5, 0, 0, ComponentListMF.bolt, etools)).registerStat() + .setPage(engineering).setUnlocked(); + tungsten = (new InformationBase("tungsten", 8, -1, 1, ComponentListMF.ingots[18], ecomponents)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 20).addSkill(SkillList.artisanry, 20); + coke = (new InformationBase("coke", 4, -1, 2, ComponentListMF.coke, ecomponents)).registerStat() + .setPage(engineering); + climber = (new InformationBase("climber", 7, 0, 1, ToolListMF.climbing_pick_basic, ecomponents)).registerStat() + .setPage(engineering).setUnlocked(); + spyglass = (new InformationBase("spyglass", 8, 1, 2, new ItemStack(ToolListMF.spyglass, 1, 2), climber)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 5); + parachute = (new InformationBase("parachute", 9, 2, 2, ToolListMF.parachute, climber)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 10); + syringe = (new InformationBase("syringe", 5, -2, 1, ToolListMF.syringe_empty, ecomponents)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 25); + engTanner = (new InformationBase("engTanner", 5, 2, 1, BlockListMF.engTanner, ecomponents)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 40).addSkill(SkillList.artisanry, 25); + advcrucible = (new InformationBase("advcrucible", 7, 3, 1, BlockListMF.crucibleauto, engTanner)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 50).addSkill(SkillList.artisanry, 35); + advforge = (new InformationBase("advforge", 9, 3, 1, BlockListMF.forge_metal, advcrucible)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 75).addSkill(SkillList.artisanry, 50); + + blackpowder = (new InformationBase("blackpowder", 0, 0, 4, ComponentListMF.blackpowder, (InformationBase) null)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 0); + advblackpowder = (new InformationBase("advblackpowder", 2, -2, 2, ComponentListMF.blackpowder_advanced, + blackpowder)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 50); + bombs = (new InformationBase("bombs", 0, 2, 3, ToolListMF.bomb_custom, blackpowder)).registerStat() + .setPage(engineering).setSpecial().addSkill(SkillList.engineering, 10); + bpress = (new InformationBase("bpress", -1, 1, 2, BlockListMF.bombPress, bombs)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 30); + bombarrow = (new InformationBase("bombarrow", 1, 1, 2, ToolListMF.exploding_arrow, bombs)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 40); + bombFuse = (new InformationBase("bombFuse", 2, 2, 0, ComponentListMF.bomb_fuse, bombs)).registerStat() + .setUnlocked().setPage(engineering); + shrapnel = (new InformationBase("shrapnel", 0, 4, 1, ComponentListMF.shrapnel, bombs)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 25); + firebomb = (new InformationBase("firebomb", 0, 6, 2, Items.blaze_powder, shrapnel)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 85); + stickybomb = (new InformationBase("stickybomb", -2, 2, 1, Items.slime_ball, bombs)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 50); + bombCeramic = (new InformationBase("bombCeramic", 2, 3, 0, ComponentListMF.bomb_casing, bombs)).registerStat() + .setUnlocked().setPage(engineering); + bombIron = (new InformationBase("bombIron", 4, 5, 1, ComponentListMF.bomb_casing_iron, bombCeramic)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); + bombObsidian = (new InformationBase("bombObsidian", 4, 7, 2, ComponentListMF.bomb_casing_obsidian, bombIron)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 35); + bombCrystal = (new InformationBase("bombCrystal", 2, 9, 1, ComponentListMF.bomb_casing_crystal, bombObsidian)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); + mineCeramic = (new InformationBase("mineCeramic", -2, 3, 2, ComponentListMF.mine_casing, bombs)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 15); + mineIron = (new InformationBase("mineIron", -4, 5, 1, ComponentListMF.mine_casing_iron, mineCeramic)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); + mineObsidian = (new InformationBase("mineObsidian", -4, 7, 2, ComponentListMF.mine_casing_obsidian, mineIron)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 35); + mineCrystal = (new InformationBase("mineCrystal", -2, 9, 1, ComponentListMF.mine_casing_crystal, mineObsidian)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); + + crossbows = (new InformationBase("crossbows", -4, 0, 3, BlockListMF.crossbowBench, null)).registerStat() + .setPage(engineering).setSpecial().addSkill(SkillList.engineering, 0); + crossShafts = (new InformationBase("crossShafts", -6, 2, 0, ComponentListMF.crossbow_stock_wood, crossbows)) + .registerStat().setPage(engineering).setUnlocked(); + crossShaftAdvanced = (new InformationBase("crossShaftAdvanced", -6, 4, 2, ComponentListMF.crossbow_stock_iron, + crossShafts)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 40); + crossHeads = (new InformationBase("crossHeads", -2, -2, 0, ComponentListMF.cross_arms_basic, crossbows)) + .registerStat().setPage(engineering).setUnlocked(); + crossHeadAdvanced = (new InformationBase("crossHeadAdvanced", -3, -3, 2, ComponentListMF.cross_arms_advanced, + crossHeads)).registerStat().setPage(engineering).addSkill(SkillList.engineering, 30); + crossBayonet = (new InformationBase("crossBayonet", -1, -3, 1, ComponentListMF.cross_bayonet, crossHeads)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 10); + crossAmmo = (new InformationBase("crossAmmo", -5, 3, 1, ComponentListMF.cross_ammo, crossShafts)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 30); + crossScope = (new InformationBase("crossScope", -7, 3, 1, ComponentListMF.cross_scope, crossShafts)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 20); + + cogArmour = (new InformationBase("cogArmour", 8, -3, 2, BlockListMF.cogwork_helm, tungsten)).registerStat() + .setPage(engineering).addSkill(SkillList.engineering, 60); + compPlate = (new InformationBase("compPlate", 10, -3, 1, ComponentListMF.ingotCompositeAlloy, tungsten)) + .registerStat().setPage(engineering).addSkill(SkillList.engineering, 50) + .addSkill(SkillList.artisanry, 40); + + repair_basic = (new InformationBase("repair_basic", 8, 0, 2, BlockListMF.repair_basic, (InformationBase) null)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 10); + repair_advanced = (new InformationBase("repair_advanced", 10, 0, 3, BlockListMF.repair_advanced, repair_basic)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 25); + repair_ornate = (new InformationBase("repair_ornate", 12, 2, 3, BlockListMF.repair_ornate, repair_advanced)) + .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 50); + + constructionPts = (new InformationBase("constructionPts", 0, 0, 0, ComponentListMF.plank_cut, + (InformationBase) null)).registerStat().setPage(construction).setUnlocked(); + reinforced_stone = (new InformationBase("reinforced_stone", 1, 0, 0, BlockListMF.reinforced_stone, + (InformationBase) null)).registerStat().setPage(construction).setUnlocked(); + glass = (new InformationBase("glass", 0, 1, 0, BlockListMF.framed_glass, (InformationBase) null)).registerStat() + .setPage(construction).setUnlocked(); + brickworks = (new InformationBase("brickworks", 3, 0, 0, BlockListMF.cobble_brick, reinforced_stone)) + .registerStat().setPage(construction).setUnlocked(); + bars = (new InformationBase("bars", 0, 3, 0, BlockListMF.bars[2], glass)).registerStat().setPage(construction) + .setUnlocked(); + thatch = (new InformationBase("thatch", 0, -3, 0, BlockListMF.thatch, clay_wall)).registerStat() + .setPage(construction).setUnlocked(); + refined_planks = (new InformationBase("refined_planks", -1, 0, 1, BlockListMF.refined_planks, + (InformationBase) null)).registerStat().setPage(construction).addSkill(SkillList.construction, 0); + clay_wall = (new InformationBase("clay_wall", 0, -1, 2, BlockListMF.clayWall, (InformationBase) null)) + .registerStat().setPage(construction).addSkill(SkillList.construction, 5); + paint_brush = (new InformationBase("paint_brush", -3, 0, 1, ToolListMF.paint_brush, refined_planks)) + .registerStat().setPage(construction).addSkill(SkillList.construction, 10); + decorated_stone = (new InformationBase("decorated_stone", 5, 0, 2, BlockListMF.reinforced_stone_framed, + brickworks)).registerStat().setPage(construction).addSkill(SkillList.construction, 15); + + bed_roll = (new InformationBase("bed_roll", 2, 3, 1, ToolListMF.bedroll, (InformationBase) null)).registerStat() + .setPage(construction).setUnlocked(); + tool_rack = (new InformationBase("tool_rack", 2, 2, 0, BlockListMF.rack_wood, (InformationBase) null)) + .registerStat().setPage(construction).setUnlocked(); + food_box = (new InformationBase("food_box", 2, 4, 1, BlockListMF.food_box_basic, tool_rack)).registerStat() + .setPage(construction).setUnlocked(); + ammo_box = (new InformationBase("ammo_box", 4, 4, 1, BlockListMF.ammo_box_basic, food_box)).registerStat() + .setPage(construction).addSkill(SkillList.construction, 15); + big_box = (new InformationBase("big_box", 6, 4, 1, BlockListMF.crate_basic, ammo_box)).registerStat() + .setPage(construction).addSkill(SkillList.construction, 25); + + // COOKING -The Cheapest + cookingutensil = (new InformationBase("cookingutensil", -1, 0, 0, FoodListMF.pie_tray, (InformationBase) null)) + .registerStat().setPage(provisioning).setUnlocked(); + firepit = (new InformationBase("firepit", 0, 0, 0, BlockListMF.firepit, (InformationBase) null)).registerStat() + .setPage(provisioning).setUnlocked(); + + generic_meat = (new InformationBase("generic_meat", 0, -1, 0, FoodListMF.generic_meat_uncooked, + (InformationBase) null)).registerStat().setPage(provisioning).setUnlocked(); + stew = (new InformationBase("stew", 0, -3, 0, FoodListMF.stew, generic_meat)).registerStat() + .setPage(provisioning).setUnlocked(); + jerky = (new InformationBase("jerky", 0, -5, 1, FoodListMF.jerky, stew)).registerStat().setPage(provisioning) + .addSkill(SkillList.provisioning, 10); + saussage = (new InformationBase("saussage", 2, -5, 2, FoodListMF.saussage_cooked, jerky)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 35); + sandwitch = (new InformationBase("sandwitch", 1, -7, 3, FoodListMF.sandwitch_meat, jerky)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 15); + sandwitchBig = (new InformationBase("sandwitchBig", 3, -7, 3, FoodListMF.sandwitch_big, sandwitch)) + .registerStat().setPage(provisioning).addSkill(SkillList.provisioning, 25); + meatpie = (new InformationBase("meatpie", -1, -7, 2, BlockListMF.pie_meat, jerky)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 35); + shepardpie = (new InformationBase("shepardpie", -2, -9, 3, BlockListMF.pie_shepards, meatpie)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 80); + bread = (new InformationBase("bread", 1, 0, 0, FoodListMF.breadroll, (InformationBase) null)).registerStat() + .setPage(provisioning).setUnlocked(); + oats = (new InformationBase("oats", 3, 0, 0, FoodListMF.oats, bread)).registerStat().setPage(provisioning) + .setUnlocked(); + + salt = (new InformationBase("salt", -2, -2, 0, FoodListMF.salt, (InformationBase) null)).registerStat() + .setPage(provisioning).setUnlocked(); + jug = (new InformationBase("jug", -1, -2, 0, FoodListMF.jug_water, (InformationBase) null)).registerStat() + .setPage(provisioning).setUnlocked(); + berry = (new InformationBase("berry", 0, 1, 0, FoodListMF.berries, (InformationBase) null)).registerStat() + .setPage(provisioning).setUnlocked(); + icing = (new InformationBase("icing", -1, 2, 0, FoodListMF.icing, berry)).registerStat().setPage(provisioning) + .setUnlocked(); + sweetroll = (new InformationBase("sweetroll", 0, 3, 2, FoodListMF.sweetroll, berry)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 15); + eclair = (new InformationBase("eclair", 2, 3, 3, FoodListMF.eclair, sweetroll)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 75); + cake = (new InformationBase("cake", 0, 5, 2, BlockListMF.cake_vanilla, sweetroll)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 25); + carrotcake = (new InformationBase("carrotcake", -1, 7, 3, BlockListMF.cake_carrot, cake)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 40); + chococake = (new InformationBase("chococake", 1, 7, 3, BlockListMF.cake_chocolate, cake)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 40); + bfcake = (new InformationBase("bfcake", 1, 9, 4, BlockListMF.cake_bf, chococake)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 90); + berrypie = (new InformationBase("berrypie", 2, 1, 2, BlockListMF.pie_berry, berry)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 20); + applepie = (new InformationBase("applepie", 4, 1, 2, BlockListMF.pie_apple, berrypie)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 30); + + cheese = (new InformationBase("cheese", 1, -1, 0, BlockListMF.cheese_wheel, (InformationBase) null)) + .registerStat().setPage(provisioning).setUnlocked(); + cheeseroll = (new InformationBase("cheeseroll", 3, -1, 2, FoodListMF.cheese_roll, cheese)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 15); + + bandage = (new InformationBase("bandage", -3, 0, 0, ToolListMF.bandage_wool, (InformationBase) null)) + .registerStat().setPage(provisioning).setUnlocked(); + bandageadv = (new InformationBase("bandageadv", -5, -1, 2, ToolListMF.bandage_tough, bandage)).registerStat() + .setPage(provisioning).addSkill(SkillList.provisioning, 40); + + // MASTERY + toughness = (new InformationBase("toughness", -1, 0, 0, CustomArmourListMF.standard_plate_helmet, + (InformationBase) null)).registerStat().setPage(mastery).addSkill(SkillList.combat, 10).setPerk(); + fitness = (new InformationBase("fitness", 1, 0, 0, ComponentListMF.dragon_heart, (InformationBase) null)) + .registerStat().setPage(mastery).addSkill(SkillList.combat, 20).setPerk(); + armourpro = (new InformationBase("armourpro", 2, -1, 0, Items.diamond_chestplate, fitness)).registerStat() + .setPage(mastery).addSkill(SkillList.combat, 60).setPerk(); + parrypro = (new InformationBase("parrypro", -2, -1, 0, Items.iron_sword, toughness)).registerStat() + .setPage(mastery).addSkill(SkillList.combat, 20).setPerk(); + counteratt = (new InformationBase("counteratt", -1, -2, 0, CustomToolListMF.standard_waraxe, parrypro)) + .registerStat().setPage(mastery).addSkill(SkillList.combat, 25).setPerk(); + autoparry = (new InformationBase("autoparry", -3, -2, 0, CustomToolListMF.standard_sword, parrypro)) + .registerStat().setPage(mastery).addSkill(SkillList.combat, 50).setPerk(); + firstaid = (new InformationBase("firstaid", 0, 1, 0, ToolListMF.bandage_wool, (InformationBase) null)) + .registerStat().setPage(mastery).addSkill(SkillList.provisioning, 25).setPerk(); + doctor = (new InformationBase("doctor", 0, 3, 0, ToolListMF.syringe, firstaid)).registerStat().setPage(mastery) + .addSkill(SkillList.provisioning, 50).setPerk(); + scrapper = (new InformationBase("scrapper", 0, -1, 0, BlockListMF.salvage_basic, (InformationBase) null)) + .registerStat().setPage(mastery).addSkill(SkillList.artisanry, 35).setPerk(); + + } + + private static Object getMetalTier(String string) { + CustomMaterial mat = MetalMaterial.getMaterial(string); + if (mat != null) + return mat.crafterTier; + + return "?"; + } } diff --git a/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java b/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java index 928d4458..192916f8 100644 --- a/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java +++ b/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java @@ -1,39 +1,37 @@ package minefantasy.mf2.material; -import java.util.HashMap; - import minefantasy.mf2.api.armour.ArmourMaterialMF; import minefantasy.mf2.util.MFLogUtil; import net.minecraft.item.Item.ToolMaterial; import net.minecraftforge.common.util.EnumHelper; +import java.util.HashMap; + /** * This is used to create both tool and armour materials. Variables needed: * Durability, protection, sharpness, enchantment, weight, harvestLvl */ public class BaseMaterialMF { - public static HashMap materialMap = new HashMap(); - public static BaseMaterialMF linen, wool, leatherapron, hide, rough, reinforced, padding, studded, scaled, - dragonscale;// Cloth and leather - public static BaseMaterialMF stone, tin, pigiron, silver, gold, ornate, weakblacksteel, weakredsteel, weakbluesteel, - tungsten;// Misc Mats - public static BaseMaterialMF copper, bronze, iron, steel, encrusted, obsidian, blacksteel, bluesteel, redsteel, - dragonforge, adamantium, mithril, ignotumite, mithium, enderforge;// Tiers - - public static BaseMaterialMF cogworks, compositeAlloy;// Engineer - /** - * This scales armour so a sword hitting full mail of equal tier has this as a - * result Used so armour can scale up with weapon damage - */ - private static final float armourVsSwordBalance = 2.0F; - /** - * The base damage for swords used with players. (Swords are 4+dam, adding 1 dam - * for player base hit dam) - */ - private static final float swordDam = 5F; - - private static float ACrounding = 10F; // round to nearest 10 - /* + /** + * This scales armour so a sword hitting full mail of equal tier has this as a + * result Used so armour can scale up with weapon damage + */ + private static final float armourVsSwordBalance = 2.0F; + /** + * The base damage for swords used with players. (Swords are 4+dam, adding 1 dam + * for player base hit dam) + */ + private static final float swordDam = 5F; + public static HashMap materialMap = new HashMap(); + public static BaseMaterialMF linen, wool, leatherapron, hide, rough, reinforced, padding, studded, scaled, + dragonscale;// Cloth and leather + public static BaseMaterialMF stone, tin, pigiron, silver, gold, ornate, weakblacksteel, weakredsteel, weakbluesteel, + tungsten;// Misc Mats + public static BaseMaterialMF copper, bronze, iron, steel, encrusted, obsidian, blacksteel, bluesteel, redsteel, + dragonforge, adamantium, mithril, ignotumite, mithium, enderforge;// Tiers + public static BaseMaterialMF cogworks, compositeAlloy;// Engineer + private static float ACrounding = 10F; // round to nearest 10 + /* * WOOD(0, 59, 2.0F, 0.0F, 15), STONE(1, 131, 4.0F, 1.0F, 5), IRON(2, 250, 6.0F, * 2.0F, 14), EMERALD(3, 1561, 8.0F, 3.0F, 10), GOLD(0, 32, 12.0F, 0.0F, 22); * @@ -41,254 +39,248 @@ public class BaseMaterialMF { * * X = Z * Y Y = X / Z Z = X / Y */ - // Rounding off to nearest 0.5 makes about an 0.03 difference, but the AR is - // cleaner - // Hardness isn't added, it calculats armour itself to match sharpness - // name dura, AC enchant weight - - public static void init() { - // LEATHER AND CLOTH - linen = addArmourSpecificMaterial("Linen", 0, 10, 0.1F, 0, 1.00F, 0); - wool = addArmourSpecificMaterial("Wool", 1, 15, 0.1F, 0, 1.00F, 5); - - leatherapron = addArmourSpecificMaterial("LeatherApron", 0, 10, 1.5F, 0, 0.50F, 0); - hide = addArmourSpecificMaterial("Hide", 0, 100, 1.5F, 0, 1.00F, 0); - rough = addArmourSpecificMaterial("RoughLeather", 0, 150, 1.5F, 1, 1.00F, 0); - reinforced = addArmourSpecificMaterial("StrongLeather", 1, 250, 2.0F, 1, 1.00F, 5); - padding = addArmourSpecificMaterial("Padded", 1, 200, 2.0F, 0, 1.00F, 5); - studded = addArmourSpecificMaterial("StudLeather", 1, 500, 2.5F, 5, 1.20F, 15); - scaled = addArmourSpecificMaterial("ScaleLeather", 2, 1000, 2.8F, 8, 1.50F, 25); - dragonscale = addArmourSpecificMaterial("Dragonscale", 3, 3000, 5F, 20, 1.20F, 85).setRarity(2); - - // name Tier dura, harvest sharpness enchant weight - // MISC - weakblacksteel = addMaterial("BlackSteelWeak", -1, 250, 4, 2.0F, 0, 1.00F, 40).setForgeStats(4, 4, 4.0F, 150, - 500); - weakredsteel = addMaterial("RedSteelWeak", -1, 400, 5, 3.0F, 0, 1.10F, 65).setForgeStats(4, 4, 4.0F, 200, 500); - weakbluesteel = addMaterial("BlueSteelWeak", -1, 300, 5, 2.5F, 0, 0.90F, 65).setForgeStats(4, 4, 4.0F, 175, - 500); - stone = addMaterial("Stone", 0, 50, 0, 0.1F, 0.0F, 0, 2.00F, 0).setForgeStats(0, 0, 0.75F, 0, 0); - tin = addMaterial("Tin", 0, 100, 0, 0.2F, 5, 0.80F, 0).setForgeStats(0, 0, 0, 85, 100); - pigiron = addMaterial("PigIron", 0, 250, 0, 1.5F, 3, 1.00F, 0).setForgeStats(2, 2, 2.0F, 100, 400); - silver = addMaterial("Silver", -1, 150, 0, 0.0F, 10, 0.70F, 0).setForgeStats(1, 1, 3F, 90, 120); - gold = addMaterial("Gold", -1, 150, 0, 0.0F, 25, 1.50F, 0).setForgeStats(1, 1, 3F, 90, 120); - // goldPure = addMaterial("PureGold", -1, 50 , 0, 0.0F, 50, 2.00F, - // 0).setRarity(1); - ornate = addMaterial("Ornate", -1, 300, 0, 0.0F, 30, 1.00F, 30).setRarity(1).setForgeStats(1, 1, 4F, 120, 150); - tungsten = addMaterial("Tungsten", 2, 600, 3, 4F, 5, 1.50F, 0).setRarity(1).setForgeStats(3, 3, 5.0F, 150, 300); - - // TIERS - // Basic / Common Materials (0-2) Levels 0-50 - copper = addMaterial("Copper", 0, 200, 1, 1.0F, 5, 1.00F, 0).setForgeStats(0, 0, 1.0F, 95, 250); // lvl 0-4 - bronze = addMaterial("Bronze", 1, 300, 2, 1.5F, 5, 1.00F, 5).setForgeStats(1, 1, 2.5F, 100, 250); // lvl 5-14 - iron = addMaterial("Iron", 2, 500, 2, 2.0F, 5, 1.00F, 15).setForgeStats(2, 2, 2.0F, 90, 250); // lvl 15-24 - steel = addMaterial("Steel", 3, 750, 2, 2.5F, 10, 1.00F, 25).setForgeStats(3, 3, 2.5F, 120, 250); // lvl 25-39 - encrusted = addMaterial("Encrusted", 3, 2000, 3, 3.5F, 25, 1.00F, 40).setForgeStats(3, 3, 5.0F, 130, 240); // lvl - // 40-49 - obsidian = addMaterial("Obsidian", 3, 2000, 3, 3.5F, 25, 1.00F, 40).setForgeStats(3, 3, 5.0F, 130, 240); // lvl - // 40-49 - // Advanced Materials (3 - 4) Levels 50-75 - blacksteel = addMaterial("BlackSteel", 4, 1500, 4, 4.0F, 12, 1.00F, 50).setForgeStats(4, 4, 4.0F, 150, 350);// lvl - // 50 - dragonforge = addMaterial("Dragonforge", 4, 1500, 4, 5.0F, 14, 1.00F, 60).setForgeStats(4, 4, 8.0F, 250, 350) - .setRarity(1).setResistances(100F, 0F);// lvl 60 - redsteel = addMaterial("RedSteel", 5, 2000, 5, 6.0F, 1, 1.15F, 75).setForgeStats(5, 5, 6.5F, 200, 350) - .setResistances(20F, 0F);// lvl 75 - bluesteel = addMaterial("BlueSteel", 5, 1800, 5, 5.0F, 20, 0.75F, 75).setForgeStats(5, 5, 4.5F, 175, 325) - .setResistances(0F, 20F);// lvl 75 - // Mythic Materials (5) Levels 75-100 - adamantium = addMaterial("Adamantium", 6, 3000, 6, 8.0F, 10, 1.25F, 90).setForgeStats(6, 5, 9.0F, 300, 400) - .setRarity(1).setResistances(35F, 0F);// lvl 90 - mithril = addMaterial("Mithril", 6, 2500, 6, 7.0F, 30, 0.50F, 90).setForgeStats(6, 5, 6.0F, 280, 400) - .setRarity(1).setResistances(0F, 35F);// lvl 90 - // Masterwork Materials (6) Level 100 - ignotumite = addMaterial("Ignotumite", 7, 1000, 7, 14.0F, 20, 2.00F, 100).setForgeStats(7, 5, 15.0F, 350, 400) - .setRarity(2).setResistances(50F, 0F);// High damage, heavy, fire resist lvl 100 - mithium = addMaterial("Mithium", 7, 1000, 7, 10.0F, 40, 0.25F, 100).setForgeStats(7, 5, 15.0F, 330, 400) - .setRarity(2).setResistances(0F, 50F);// Low damage, light, magic resist lvl 100 - enderforge = addMaterial("Ender", 7, 1000, 7, 12.0F, 20, 1.00F, 100).setForgeStats(7, 5, 15.0F, 400, 450) - .setRarity(2).setResistances(25F, 25F);// Middle lvl 100 - // Engineer Materials - // steel = addMaterial("Steel", 3, 750, 2, 2.5F, 10, 1.00F, 25).setForgeStats(3, - // 3, 2.5F, 120, 250); //lvl 25-39 - cogworks = addArmourSpecificMaterial("Cogworks", 4, 500, 1.0F, 10, 1.00F, 85).setForgeStats(3, 3, 2.5F, 120, - 250); - compositeAlloy = addArmourSpecificMaterial("CompositeAlloy", 4, 1800, 4.0F, 10, 2.00F, 85) - .setForgeStats(3, 3, 2.5F, 120, 250).setResistances(95F, 85F); - - } - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CLASS - // START~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// - /** - * This method auto-calculates the Armour Rating to scale the damage - */ - public static BaseMaterialMF addArmourSpecificMaterial(String name, int tier, int durability, float AC, - int enchantment, float weight, int lvl) { - return addMaterial(name, tier, durability, -1, AC, -1, enchantment, weight, lvl); - } - - public static BaseMaterialMF addMaterial(String name, int tier, int durability, int harvestLevel, float sharpness, - int enchantment, float weight, int lvl) { - float AC = 0; - AC = ((sharpness + swordDam) / armourVsSwordBalance) - 1.0F; - MFLogUtil.logDebug("Added Ratio Armour Material " + name + " AR = " + AC); - float initAc = AC; - - AC = Math.round(AC * (100F / ACrounding)); - AC = AC / (100F / ACrounding); - - if (initAc != AC) { - MFLogUtil.logDebug("Auto-Calculated ArmourRating for tier: " + name + ", modified to " + AC); - } - return addMaterial(name, tier, durability, harvestLevel, AC, sharpness, enchantment, weight, lvl); - } - - public static BaseMaterialMF addMaterial(String name, int tier, int durability, int harvestLevel, float hardness, - float sharpness, int enchantment, float weight, int lvl) { - return register(new BaseMaterialMF(name, tier, durability, harvestLevel, hardness, sharpness, enchantment, - weight, lvl)); - } - - public static BaseMaterialMF register(BaseMaterialMF material) { - materialMap.put(material.name.toLowerCase(), material); - return material; - } - - public String name; - - /** - * This variable determines max uses - */ - public int durability; - /** - * This variable determines the protection : Hardness and sharpness are normally - * relevant to each other (so armour vs weapon equal tier has the same - * after-calculation damage) - */ - public float hardness; - /** - * This variable determines damage and dig speed : Hardness and sharpness are - * normally relevant to each other (so armour vs weapon equal tier has the same - * after-calculation damage) - */ - public float sharpness; - /** - * This variable determines enchantement - */ - public int enchantment; - public float weight; - - /** - * The required level to craft - */ - public int requiredLevel; - - // TIERING - /** - * The tier the material is on - */ - public int tier; - public int harvestLevel; - - // FORGING - public int hammerTier; - public int anvilTier; - public float craftTimeModifier = 2.0F; - public int workableTemp = 100; - public int unstableTemp = 150; - - // RESISTANCES - public float fireResistance; - public float arcaneResistance; - public boolean isMythic = false; - - // SPECIALS - private ArmourMaterialMF armourConversion; - private ToolMaterial toolConversion; - public int rarity; - - public BaseMaterialMF(String name, int tier, int durability, int harvestLevel, float hardness, float sharpness, - int enchantment, float weight, int lvl) { - this.requiredLevel = lvl; - this.name = name; - this.tier = tier; - this.durability = durability; - this.hardness = hardness; - this.sharpness = sharpness; - this.enchantment = enchantment; - this.weight = weight; - this.harvestLevel = harvestLevel; - } - - protected BaseMaterialMF setForgeStats(int hammer, int anvil, float timer, int workable, int unstable) { - hammerTier = hammer; - anvilTier = anvil; - craftTimeModifier = (timer * 2F) + 2.0F; - workableTemp = workable; - unstableTemp = unstable; - return this; - } - - protected BaseMaterialMF setResistances(float fire, float arcane) { - fireResistance = fire; - arcaneResistance = arcane; - return this; - } - - protected BaseMaterialMF setRarity(int value) { - rarity = value; - return this; - } - - protected BaseMaterialMF setMythic() { - isMythic = true; - return this; - } - - private ArmourMaterialMF convertToMFArmour() { - return new ArmourMaterialMF("MF" + name, durability, hardness, enchantment, weight) - .setFireResistance(fireResistance).setMagicResistance(arcaneResistance).setMythic(isMythic); - } - - private ToolMaterial convertToTool() { - return EnumHelper.addToolMaterial("MF" + name, harvestLevel, durability, 2.0F + (sharpness * 2F), sharpness, - enchantment); - } - - private static ArmourMaterialMF getMFArmourMaterial(String name) { - BaseMaterialMF material = materialMap.get(name); - return material != null ? getMFArmourMaterial(material) : null; - } - - public ArmourMaterialMF getArmourConversion() { - if (armourConversion == null) { - armourConversion = getMFArmourMaterial(this); - } - return armourConversion; - } - - public static ArmourMaterialMF getMFArmourMaterial(BaseMaterialMF material) { - return material.convertToMFArmour(); - } - - public static ToolMaterial getToolMaterial(String name) { - BaseMaterialMF material = materialMap.get(name); - return material != null ? getToolMaterial(material) : null; - } - - public ToolMaterial getToolConversion() { - if (toolConversion == null) { - toolConversion = getToolMaterial(this); - } - return toolConversion; - } - - public static ToolMaterial getToolMaterial(BaseMaterialMF material) { - return material.convertToTool(); - } - - public static BaseMaterialMF getMaterial(String name) { - return materialMap.get(name.toLowerCase()); - } + // Rounding off to nearest 0.5 makes about an 0.03 difference, but the AR is + // cleaner + // Hardness isn't added, it calculats armour itself to match sharpness + // name dura, AC enchant weight + public String name; + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CLASS + // START~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + /** + * This variable determines max uses + */ + public int durability; + /** + * This variable determines the protection : Hardness and sharpness are normally + * relevant to each other (so armour vs weapon equal tier has the same + * after-calculation damage) + */ + public float hardness; + /** + * This variable determines damage and dig speed : Hardness and sharpness are + * normally relevant to each other (so armour vs weapon equal tier has the same + * after-calculation damage) + */ + public float sharpness; + /** + * This variable determines enchantement + */ + public int enchantment; + public float weight; + /** + * The required level to craft + */ + public int requiredLevel; + /** + * The tier the material is on + */ + public int tier; + public int harvestLevel; + // FORGING + public int hammerTier; + public int anvilTier; + public float craftTimeModifier = 2.0F; + + // TIERING + public int workableTemp = 100; + public int unstableTemp = 150; + // RESISTANCES + public float fireResistance; + public float arcaneResistance; + public boolean isMythic = false; + public int rarity; + // SPECIALS + private ArmourMaterialMF armourConversion; + private ToolMaterial toolConversion; + public BaseMaterialMF(String name, int tier, int durability, int harvestLevel, float hardness, float sharpness, + int enchantment, float weight, int lvl) { + this.requiredLevel = lvl; + this.name = name; + this.tier = tier; + this.durability = durability; + this.hardness = hardness; + this.sharpness = sharpness; + this.enchantment = enchantment; + this.weight = weight; + this.harvestLevel = harvestLevel; + } + + public static void init() { + // LEATHER AND CLOTH + linen = addArmourSpecificMaterial("Linen", 0, 10, 0.1F, 0, 1.00F, 0); + wool = addArmourSpecificMaterial("Wool", 1, 15, 0.1F, 0, 1.00F, 5); + + leatherapron = addArmourSpecificMaterial("LeatherApron", 0, 10, 1.5F, 0, 0.50F, 0); + hide = addArmourSpecificMaterial("Hide", 0, 100, 1.5F, 0, 1.00F, 0); + rough = addArmourSpecificMaterial("RoughLeather", 0, 150, 1.5F, 1, 1.00F, 0); + reinforced = addArmourSpecificMaterial("StrongLeather", 1, 250, 2.0F, 1, 1.00F, 5); + padding = addArmourSpecificMaterial("Padded", 1, 200, 2.0F, 0, 1.00F, 5); + studded = addArmourSpecificMaterial("StudLeather", 1, 500, 2.5F, 5, 1.20F, 15); + scaled = addArmourSpecificMaterial("ScaleLeather", 2, 1000, 2.8F, 8, 1.50F, 25); + dragonscale = addArmourSpecificMaterial("Dragonscale", 3, 3000, 5F, 20, 1.20F, 85).setRarity(2); + + // name Tier dura, harvest sharpness enchant weight + // MISC + weakblacksteel = addMaterial("BlackSteelWeak", -1, 250, 4, 2.0F, 0, 1.00F, 40).setForgeStats(4, 4, 4.0F, 150, + 500); + weakredsteel = addMaterial("RedSteelWeak", -1, 400, 5, 3.0F, 0, 1.10F, 65).setForgeStats(4, 4, 4.0F, 200, 500); + weakbluesteel = addMaterial("BlueSteelWeak", -1, 300, 5, 2.5F, 0, 0.90F, 65).setForgeStats(4, 4, 4.0F, 175, + 500); + stone = addMaterial("Stone", 0, 50, 0, 0.1F, 0.0F, 0, 2.00F, 0).setForgeStats(0, 0, 0.75F, 0, 0); + tin = addMaterial("Tin", 0, 100, 0, 0.2F, 5, 0.80F, 0).setForgeStats(0, 0, 0, 85, 100); + pigiron = addMaterial("PigIron", 0, 250, 0, 1.5F, 3, 1.00F, 0).setForgeStats(2, 2, 2.0F, 100, 400); + silver = addMaterial("Silver", -1, 150, 0, 0.0F, 10, 0.70F, 0).setForgeStats(1, 1, 3F, 90, 120); + gold = addMaterial("Gold", -1, 150, 0, 0.0F, 25, 1.50F, 0).setForgeStats(1, 1, 3F, 90, 120); + // goldPure = addMaterial("PureGold", -1, 50 , 0, 0.0F, 50, 2.00F, + // 0).setRarity(1); + ornate = addMaterial("Ornate", -1, 300, 0, 0.0F, 30, 1.00F, 30).setRarity(1).setForgeStats(1, 1, 4F, 120, 150); + tungsten = addMaterial("Tungsten", 2, 600, 3, 4F, 5, 1.50F, 0).setRarity(1).setForgeStats(3, 3, 5.0F, 150, 300); + + // TIERS + // Basic / Common Materials (0-2) Levels 0-50 + copper = addMaterial("Copper", 0, 200, 1, 1.0F, 5, 1.00F, 0).setForgeStats(0, 0, 1.0F, 95, 250); // lvl 0-4 + bronze = addMaterial("Bronze", 1, 300, 2, 1.5F, 5, 1.00F, 5).setForgeStats(1, 1, 2.5F, 100, 250); // lvl 5-14 + iron = addMaterial("Iron", 2, 500, 2, 2.0F, 5, 1.00F, 15).setForgeStats(2, 2, 2.0F, 90, 250); // lvl 15-24 + steel = addMaterial("Steel", 3, 750, 2, 2.5F, 10, 1.00F, 25).setForgeStats(3, 3, 2.5F, 120, 250); // lvl 25-39 + encrusted = addMaterial("Encrusted", 3, 2000, 3, 3.5F, 25, 1.00F, 40).setForgeStats(3, 3, 5.0F, 130, 240); // lvl + // 40-49 + obsidian = addMaterial("Obsidian", 3, 2000, 3, 3.5F, 25, 1.00F, 40).setForgeStats(3, 3, 5.0F, 130, 240); // lvl + // 40-49 + // Advanced Materials (3 - 4) Levels 50-75 + blacksteel = addMaterial("BlackSteel", 4, 1500, 4, 4.0F, 12, 1.00F, 50).setForgeStats(4, 4, 4.0F, 150, 350);// lvl + // 50 + dragonforge = addMaterial("Dragonforge", 4, 1500, 4, 5.0F, 14, 1.00F, 60).setForgeStats(4, 4, 8.0F, 250, 350) + .setRarity(1).setResistances(100F, 0F);// lvl 60 + redsteel = addMaterial("RedSteel", 5, 2000, 5, 6.0F, 1, 1.15F, 75).setForgeStats(5, 5, 6.5F, 200, 350) + .setResistances(20F, 0F);// lvl 75 + bluesteel = addMaterial("BlueSteel", 5, 1800, 5, 5.0F, 20, 0.75F, 75).setForgeStats(5, 5, 4.5F, 175, 325) + .setResistances(0F, 20F);// lvl 75 + // Mythic Materials (5) Levels 75-100 + adamantium = addMaterial("Adamantium", 6, 3000, 6, 8.0F, 10, 1.25F, 90).setForgeStats(6, 5, 9.0F, 300, 400) + .setRarity(1).setResistances(35F, 0F);// lvl 90 + mithril = addMaterial("Mithril", 6, 2500, 6, 7.0F, 30, 0.50F, 90).setForgeStats(6, 5, 6.0F, 280, 400) + .setRarity(1).setResistances(0F, 35F);// lvl 90 + // Masterwork Materials (6) Level 100 + ignotumite = addMaterial("Ignotumite", 7, 1000, 7, 14.0F, 20, 2.00F, 100).setForgeStats(7, 5, 15.0F, 350, 400) + .setRarity(2).setResistances(50F, 0F);// High damage, heavy, fire resist lvl 100 + mithium = addMaterial("Mithium", 7, 1000, 7, 10.0F, 40, 0.25F, 100).setForgeStats(7, 5, 15.0F, 330, 400) + .setRarity(2).setResistances(0F, 50F);// Low damage, light, magic resist lvl 100 + enderforge = addMaterial("Ender", 7, 1000, 7, 12.0F, 20, 1.00F, 100).setForgeStats(7, 5, 15.0F, 400, 450) + .setRarity(2).setResistances(25F, 25F);// Middle lvl 100 + // Engineer Materials + // steel = addMaterial("Steel", 3, 750, 2, 2.5F, 10, 1.00F, 25).setForgeStats(3, + // 3, 2.5F, 120, 250); //lvl 25-39 + cogworks = addArmourSpecificMaterial("Cogworks", 4, 500, 1.0F, 10, 1.00F, 85).setForgeStats(3, 3, 2.5F, 120, + 250); + compositeAlloy = addArmourSpecificMaterial("CompositeAlloy", 4, 1800, 4.0F, 10, 2.00F, 85) + .setForgeStats(3, 3, 2.5F, 120, 250).setResistances(95F, 85F); + + } + + /** + * This method auto-calculates the Armour Rating to scale the damage + */ + public static BaseMaterialMF addArmourSpecificMaterial(String name, int tier, int durability, float AC, + int enchantment, float weight, int lvl) { + return addMaterial(name, tier, durability, -1, AC, -1, enchantment, weight, lvl); + } + + public static BaseMaterialMF addMaterial(String name, int tier, int durability, int harvestLevel, float sharpness, + int enchantment, float weight, int lvl) { + float AC = 0; + AC = ((sharpness + swordDam) / armourVsSwordBalance) - 1.0F; + MFLogUtil.logDebug("Added Ratio Armour Material " + name + " AR = " + AC); + float initAc = AC; + + AC = Math.round(AC * (100F / ACrounding)); + AC = AC / (100F / ACrounding); + + if (initAc != AC) { + MFLogUtil.logDebug("Auto-Calculated ArmourRating for tier: " + name + ", modified to " + AC); + } + return addMaterial(name, tier, durability, harvestLevel, AC, sharpness, enchantment, weight, lvl); + } + + public static BaseMaterialMF addMaterial(String name, int tier, int durability, int harvestLevel, float hardness, + float sharpness, int enchantment, float weight, int lvl) { + return register(new BaseMaterialMF(name, tier, durability, harvestLevel, hardness, sharpness, enchantment, + weight, lvl)); + } + + public static BaseMaterialMF register(BaseMaterialMF material) { + materialMap.put(material.name.toLowerCase(), material); + return material; + } + + private static ArmourMaterialMF getMFArmourMaterial(String name) { + BaseMaterialMF material = materialMap.get(name); + return material != null ? getMFArmourMaterial(material) : null; + } + + public static ArmourMaterialMF getMFArmourMaterial(BaseMaterialMF material) { + return material.convertToMFArmour(); + } + + public static ToolMaterial getToolMaterial(String name) { + BaseMaterialMF material = materialMap.get(name); + return material != null ? getToolMaterial(material) : null; + } + + public static ToolMaterial getToolMaterial(BaseMaterialMF material) { + return material.convertToTool(); + } + + public static BaseMaterialMF getMaterial(String name) { + return materialMap.get(name.toLowerCase()); + } + + protected BaseMaterialMF setForgeStats(int hammer, int anvil, float timer, int workable, int unstable) { + hammerTier = hammer; + anvilTier = anvil; + craftTimeModifier = (timer * 2F) + 2.0F; + workableTemp = workable; + unstableTemp = unstable; + return this; + } + + protected BaseMaterialMF setResistances(float fire, float arcane) { + fireResistance = fire; + arcaneResistance = arcane; + return this; + } + + protected BaseMaterialMF setRarity(int value) { + rarity = value; + return this; + } + + protected BaseMaterialMF setMythic() { + isMythic = true; + return this; + } + + private ArmourMaterialMF convertToMFArmour() { + return new ArmourMaterialMF("MF" + name, durability, hardness, enchantment, weight) + .setFireResistance(fireResistance).setMagicResistance(arcaneResistance).setMythic(isMythic); + } + + private ToolMaterial convertToTool() { + return EnumHelper.addToolMaterial("MF" + name, harvestLevel, durability, 2.0F + (sharpness * 2F), sharpness, + enchantment); + } + + public ArmourMaterialMF getArmourConversion() { + if (armourConversion == null) { + armourConversion = getMFArmourMaterial(this); + } + return armourConversion; + } + + public ToolMaterial getToolConversion() { + if (toolConversion == null) { + toolConversion = getToolMaterial(this); + } + return toolConversion; + } } diff --git a/src/main/java/minefantasy/mf2/material/LeatherMaterial.java b/src/main/java/minefantasy/mf2/material/LeatherMaterial.java index eea4d6e6..bab8d94f 100644 --- a/src/main/java/minefantasy/mf2/material/LeatherMaterial.java +++ b/src/main/java/minefantasy/mf2/material/LeatherMaterial.java @@ -3,24 +3,24 @@ import minefantasy.mf2.api.material.CustomMaterial; public class LeatherMaterial extends CustomMaterial { - public LeatherMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, - float resistance, float density) { - super(name, "leather", tier, hardness, durability, flexibility, sharpness, resistance, density); - } + public LeatherMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, + float resistance, float density) { + super(name, "leather", tier, hardness, durability, flexibility, sharpness, resistance, density); + } - public static CustomMaterial getOrAddWood(String name, int tier, float hardness, float durability, - float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) { - if (getMaterial(name) != null) { - return CustomMaterial.getMaterial(name); - } - return new LeatherMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density) - .setColour(red, green, blue).register(); - } + public static CustomMaterial getOrAddWood(String name, int tier, float hardness, float durability, + float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) { + if (getMaterial(name) != null) { + return CustomMaterial.getMaterial(name); + } + return new LeatherMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density) + .setColour(red, green, blue).register(); + } - public static void init() { - getOrAddWood("Leather", 0, 1.0F, 0.4F, 1.2F, 0F, 0.5F, 0.1F, 198, 92, 53); - getOrAddWood("HardLeather", 1, 1.5F, 0.8F, 1.0F, 0F, 0.5F, 0.2F, 154, 72, 41); - getOrAddWood("MinotaurSkin", 2, 2.0F, 1.5F, 0.8F, 0F, 1.0F, 0.5F, 118, 69, 48); - getOrAddWood("DragonSkin", 3, 3.0F, 2.0F, 1.0F, 0F, 1.2F, 0.75F, 56, 43, 66); - } + public static void init() { + getOrAddWood("Leather", 0, 1.0F, 0.4F, 1.2F, 0F, 0.5F, 0.1F, 198, 92, 53); + getOrAddWood("HardLeather", 1, 1.5F, 0.8F, 1.0F, 0F, 0.5F, 0.2F, 154, 72, 41); + getOrAddWood("MinotaurSkin", 2, 2.0F, 1.5F, 0.8F, 0F, 1.0F, 0.5F, 118, 69, 48); + getOrAddWood("DragonSkin", 3, 3.0F, 2.0F, 1.0F, 0F, 1.2F, 0.75F, 56, 43, 66); + } } diff --git a/src/main/java/minefantasy/mf2/material/MetalMaterial.java b/src/main/java/minefantasy/mf2/material/MetalMaterial.java index de78ddeb..e8f36428 100644 --- a/src/main/java/minefantasy/mf2/material/MetalMaterial.java +++ b/src/main/java/minefantasy/mf2/material/MetalMaterial.java @@ -1,8 +1,5 @@ package minefantasy.mf2.material; -import java.util.ArrayList; -import java.util.Iterator; - import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.item.list.ComponentListMF; @@ -10,144 +7,140 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; + public class MetalMaterial extends CustomMaterial { - public MetalMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, - float resistance, float density) { - super(name, "metal", tier, hardness, durability, flexibility, resistance, sharpness, density); - setArmourStats(1.0F, flexibility, 1F / flexibility);// Harder materials absorb blunt less but resist cutting and - // piercing more - } - - /** - * Adds a new metal - * - * @param name - * The name, and register for the metal - * @param tier - * What tier the metal is - * @param hardness - * How hard the material is to break - * @param flexibility - * How well the metal can bend - * @param sharpness - * How well the metal can be sharpened - * @param resistance - * The resistance to elements such as fire and corrosion, right now - * its just 0-100 for armour resistance against elements - * @param density - * The overall mass (Kg) for an ingot - */ - public static CustomMaterial getOrAddMetal(String name, int tier, float durability, float flexibility, - float sharpness, float resistance, float density, int red, int green, int blue) { - if (getMaterial(name) != null) { - return CustomMaterial.getMaterial(name); - } - float hardness = ((sharpness + 5F) / 2F) - 1F; - return new MetalMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density) - .setColour(red, green, blue).register(); - } - - public static CustomMaterial getOrAddMetal(String name, int tier, float hardness, float durability, - float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) { - if (getMaterial(name) != null) { - return CustomMaterial.getMaterial(name); - } - return new MetalMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density) - .setColour(red, green, blue).register(); - } - - public static void init() { - /* + public MetalMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, + float resistance, float density) { + super(name, "metal", tier, hardness, durability, flexibility, resistance, sharpness, density); + setArmourStats(1.0F, flexibility, 1F / flexibility);// Harder materials absorb blunt less but resist cutting and + // piercing more + } + + /** + * Adds a new metal + * + * @param name The name, and register for the metal + * @param tier What tier the metal is + * @param hardness How hard the material is to break + * @param flexibility How well the metal can bend + * @param sharpness How well the metal can be sharpened + * @param resistance The resistance to elements such as fire and corrosion, right now + * its just 0-100 for armour resistance against elements + * @param density The overall mass (Kg) for an ingot + */ + public static CustomMaterial getOrAddMetal(String name, int tier, float durability, float flexibility, + float sharpness, float resistance, float density, int red, int green, int blue) { + if (getMaterial(name) != null) { + return CustomMaterial.getMaterial(name); + } + float hardness = ((sharpness + 5F) / 2F) - 1F; + return new MetalMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density) + .setColour(red, green, blue).register(); + } + + public static CustomMaterial getOrAddMetal(String name, int tier, float hardness, float durability, + float flexibility, float sharpness, float resistance, float density, int red, int green, int blue) { + if (getMaterial(name) != null) { + return CustomMaterial.getMaterial(name); + } + return new MetalMaterial(name, tier, hardness, durability, flexibility, sharpness, resistance, density) + .setColour(red, green, blue).register(); + } + + public static void init() { + /* * BaseMaterialMF WOOD(0, 59, 2.0F, 0.0F, 15), STONE(1, 131, 4.0F, 1.0F, 5), * IRON(2, 250, 6.0F, 2.0F, 14), EMERALD(3, 1561, 8.0F, 3.0F, 10), GOLD(0, 32, * 12.0F, 0.0F, 22); */ - // Weak Mats Name T Dur Flx Shp Rst Wg - getOrAddMetal("Tin", 0, 1.0F, 0.5F, 0.0F, 10F, 2.0F, 164, 177, 177).setRarity(-1).setMeltingPoint(900); - getOrAddMetal("Copper", 0, 1.0F, 1.0F, 0.0F, 50F, 3.0F, 255, 132, 66).setMeltingPoint(1000); - - // Standard Mats Name T Dur Flx Shp Rst Wg - getOrAddMetal("Bronze", 1, 1.5F, 1.0F, 1.5F, 20F, 3.0F, 207, 165, 118).setCrafterTiers(1).setMeltingPoint(1200); - getOrAddMetal("Iron", 2, 2.0F, 1.0F, 2.0F, 20F, 2.5F, 140, 120, 100).setCrafterTiers(2).setMeltingPoint(1200) - .setArmourStats(1.0F, 1.0F, 1.0F);// Standard - getOrAddMetal("PigIron", 2, 2.0F, 0.8F, 2.0F, 20F, 2.5F, 120, 95, 95).setCrafterTiers(2).setMeltingPoint(1200) - .setArmourStats(1.1F, 0.8F, 1.1F);// Less Blunt for more cutting/piercing - getOrAddMetal("Steel", 3, 3.0F, 1.0F, 2.5F, 30F, 2.5F, 168, 168, 168).setCrafterTiers(3).setMeltingPoint(1500); - getOrAddMetal("Encrusted", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 64, 255, 255).setCrafterTiers(3) - .setMeltingPoint(1800).setArmourStats(1.0F, 1.0F, 1.2F);// Better Piercing - getOrAddMetal("Obsidian", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 90, 45, 90).setCrafterTiers(3).setMeltingPoint(2000) - .setArmourStats(1.0F, 1.3F, 1.0F);// Better Blunt - getOrAddMetal("Tungsten", 4, 8.0F, 0.8F, 3.0F, 35F, 4.0F, 66, 86, 65).setCrafterTiers(3).setMeltingPoint(2000) - .setArmourStats(1.3F, 1.0F, 1.3F);// Better Cutting/Piercing - getOrAddMetal("BlackSteel", 5, 6.0F, 1.0F, 4.0F, 50F, 3.0F, 80, 80, 80).setCrafterTiers(4).setMeltingPoint(2000) - .setArmourStats(1.0F, 1.0F, 1.0F);// Standard - getOrAddMetal("BlueSteel", 6, 7.0F, 1.2F, 5.0F, 65F, 2.0F, 28, 31, 159).setCrafterTiers(5).setMeltingPoint(2000) - .setArmourStats(1.0F, 1.2F, 0.8F);// Better Blunt and Resist - getOrAddMetal("RedSteel", 6, 8.0F, 0.8F, 6.0F, 50F, 3.5F, 219, 56, 56).setCrafterTiers(5).setMeltingPoint(2000) - .setArmourStats(0.9F, 0.9F, 1.2F);// Better AC and Piercing - - // Precious Mats - getOrAddMetal("Silver", 0, 2.5F, 1.0F, 0.0F, 40F, 3.5F, 155, 206, 205).setMeltingPoint(1200); - getOrAddMetal("Gold", 0, 2.0F, 1.0F, 0.0F, 40F, 3.5F, 243, 222, 49).setMeltingPoint(1200); - - // Mythic Mats Name T Dur Flx Shp Rst Wg - getOrAddMetal("Mithril", 7, 10.0F, 0.8F, 7.0F, 90F, 2.0F, 250, 180, 250).setMeltingPoint(2500) - .setCrafterTiers(6).setRarity(1); - getOrAddMetal("Adamantium", 7, 12.0F, 0.8F, 8.0F, 80F, 3.5F, 100, 200, 100).setMeltingPoint(2500) - .setCrafterTiers(6).setRarity(1); - getOrAddMetal("Mithium", 8, 15.0F, 0.8F, 10.0F, 95F, 2.0F, 60, 200, 255).setMeltingPoint(2500) - .setCrafterTiers(7).setRarity(2).setUnbreakable(); - getOrAddMetal("Ignotumite", 8, 15.0F, 0.8F, 14.0F, 85F, 3.5F, 20, 255, 100).setMeltingPoint(3000) - .setCrafterTiers(7).setRarity(2).setUnbreakable(); - getOrAddMetal("Ender", 8, 15.0F, 0.8F, 12.0F, 90F, 3.0F, 255, 63, 243).setMeltingPoint(3000).setCrafterTiers(7) - .setRarity(2).setUnbreakable(); - - // Non-MF - getOrAddMetal("StainlessSteel", 3, 5.0F, 1.0F, 2.5F, 40F, 2.5F, 188, 188, 198).setMeltingPoint(1600) - .setCrafterTiers(3); - getOrAddMetal("Titanium", 6, 10.0F, 1.0F, 4.0F, 50F, 1.0F, 190, 190, 160).setMeltingPoint(2000) - .setCrafterTiers(3); - - getOrAddMetal("Thaumium", 4, 4.0F, 1.0F, 3.0F, 65F, 2.5F, 115, 65, 183).setMeltingPoint(1500) - .setCrafterTiers(3); - getOrAddMetal("Void", 4, 10.0F, 2.0F, 4.0F, 75F, 1.0F, 75, 45, 75).setMeltingPoint(1800).setCrafterTiers(3); - getOrAddMetal("Manasteel", 2, 3.0F, 1.0F, 2.0F, 40F, 2.5F, 88, 195, 231).setMeltingPoint(1500) - .setArmourStats(1.0F, 1.2F, 1.0F).setCrafterTiers(2);// More Resistant, Stronger than iron - getOrAddMetal("ElvenElementium", 3, 4.0F, 1.0F, 2.5F, 40F, 2.5F, 235, 108, 235).setMeltingPoint(1800) - .setArmourStats(1.1F, 1.0F, 1.1F).setCrafterTiers(2);// Similar to Manasteel, Slightly stronger - getOrAddMetal("Terrasteel", 4, 6.0F, 1.0F, 4.0F, 40F, 2.5F, 88, 250, 150).setMeltingPoint(1500) - .setArmourStats(1.0F, 0.9F, 1.0F).setCrafterTiers(3); - - // Alloy - getOrAddMetal("CompositeAlloy", 4, 4.5F, 10.0F, 1.0F, 2.5F, 75F, 4.0F, 65, 75, 65).setMeltingPoint(2500) - .setRarity(1).setCrafterTiers(3).modifyCraftTime(5.0F);// Powerful All-Rounder - } - - public static void addHeatables() { - ArrayList metal = CustomMaterial.getList("metal"); - Iterator iteratorMetal = metal.iterator(); - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - int[] stats = customMat.getHeatableStats(); - MFLogUtil.logDebug( - "Set Heatable Stats for " + customMat.name + ": " + stats[0] + "," + stats[1] + "," + stats[2]); - - MineFantasyAPI.setHeatableStats("ingot" + customMat.name, stats[0], stats[1], stats[2]); - MineFantasyAPI.setHeatableStats("hunk" + customMat.name, stats[0], stats[1], stats[2]); - } - - MineFantasyAPI.setHeatableStats(ComponentListMF.rivet, 1000, 2000, 3000); - MineFantasyAPI.setHeatableStats(ComponentListMF.metalHunk, -1, -1, -1); - MineFantasyAPI.setHeatableStats(ComponentListMF.bar, -1, -1, -1); - } - - @Override - public ItemStack getItem() { - ArrayList list = OreDictionary.getOres("ingot" + name); - if (list != null && !list.isEmpty()) { - return list.get(0); - } - return null; - } + // Weak Mats Name T Dur Flx Shp Rst Wg + getOrAddMetal("Tin", 0, 1.0F, 0.5F, 0.0F, 10F, 2.0F, 164, 177, 177).setRarity(-1).setMeltingPoint(900); + getOrAddMetal("Copper", 0, 1.0F, 1.0F, 0.0F, 50F, 3.0F, 255, 132, 66).setMeltingPoint(1000); + + // Standard Mats Name T Dur Flx Shp Rst Wg + getOrAddMetal("Bronze", 1, 1.5F, 1.0F, 1.5F, 20F, 3.0F, 207, 165, 118).setCrafterTiers(1).setMeltingPoint(1200); + getOrAddMetal("Iron", 2, 2.0F, 1.0F, 2.0F, 20F, 2.5F, 140, 120, 100).setCrafterTiers(2).setMeltingPoint(1200) + .setArmourStats(1.0F, 1.0F, 1.0F);// Standard + getOrAddMetal("PigIron", 2, 2.0F, 0.8F, 2.0F, 20F, 2.5F, 120, 95, 95).setCrafterTiers(2).setMeltingPoint(1200) + .setArmourStats(1.1F, 0.8F, 1.1F);// Less Blunt for more cutting/piercing + getOrAddMetal("Steel", 3, 3.0F, 1.0F, 2.5F, 30F, 2.5F, 168, 168, 168).setCrafterTiers(3).setMeltingPoint(1500); + getOrAddMetal("Encrusted", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 64, 255, 255).setCrafterTiers(3) + .setMeltingPoint(1800).setArmourStats(1.0F, 1.0F, 1.2F);// Better Piercing + getOrAddMetal("Obsidian", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 90, 45, 90).setCrafterTiers(3).setMeltingPoint(2000) + .setArmourStats(1.0F, 1.3F, 1.0F);// Better Blunt + getOrAddMetal("Tungsten", 4, 8.0F, 0.8F, 3.0F, 35F, 4.0F, 66, 86, 65).setCrafterTiers(3).setMeltingPoint(2000) + .setArmourStats(1.3F, 1.0F, 1.3F);// Better Cutting/Piercing + getOrAddMetal("BlackSteel", 5, 6.0F, 1.0F, 4.0F, 50F, 3.0F, 80, 80, 80).setCrafterTiers(4).setMeltingPoint(2000) + .setArmourStats(1.0F, 1.0F, 1.0F);// Standard + getOrAddMetal("BlueSteel", 6, 7.0F, 1.2F, 5.0F, 65F, 2.0F, 28, 31, 159).setCrafterTiers(5).setMeltingPoint(2000) + .setArmourStats(1.0F, 1.2F, 0.8F);// Better Blunt and Resist + getOrAddMetal("RedSteel", 6, 8.0F, 0.8F, 6.0F, 50F, 3.5F, 219, 56, 56).setCrafterTiers(5).setMeltingPoint(2000) + .setArmourStats(0.9F, 0.9F, 1.2F);// Better AC and Piercing + + // Precious Mats + getOrAddMetal("Silver", 0, 2.5F, 1.0F, 0.0F, 40F, 3.5F, 155, 206, 205).setMeltingPoint(1200); + getOrAddMetal("Gold", 0, 2.0F, 1.0F, 0.0F, 40F, 3.5F, 243, 222, 49).setMeltingPoint(1200); + + // Mythic Mats Name T Dur Flx Shp Rst Wg + getOrAddMetal("Mithril", 7, 10.0F, 0.8F, 7.0F, 90F, 2.0F, 250, 180, 250).setMeltingPoint(2500) + .setCrafterTiers(6).setRarity(1); + getOrAddMetal("Adamantium", 7, 12.0F, 0.8F, 8.0F, 80F, 3.5F, 100, 200, 100).setMeltingPoint(2500) + .setCrafterTiers(6).setRarity(1); + getOrAddMetal("Mithium", 8, 15.0F, 0.8F, 10.0F, 95F, 2.0F, 60, 200, 255).setMeltingPoint(2500) + .setCrafterTiers(7).setRarity(2).setUnbreakable(); + getOrAddMetal("Ignotumite", 8, 15.0F, 0.8F, 14.0F, 85F, 3.5F, 20, 255, 100).setMeltingPoint(3000) + .setCrafterTiers(7).setRarity(2).setUnbreakable(); + getOrAddMetal("Ender", 8, 15.0F, 0.8F, 12.0F, 90F, 3.0F, 255, 63, 243).setMeltingPoint(3000).setCrafterTiers(7) + .setRarity(2).setUnbreakable(); + + // Non-MF + getOrAddMetal("StainlessSteel", 3, 5.0F, 1.0F, 2.5F, 40F, 2.5F, 188, 188, 198).setMeltingPoint(1600) + .setCrafterTiers(3); + getOrAddMetal("Titanium", 6, 10.0F, 1.0F, 4.0F, 50F, 1.0F, 190, 190, 160).setMeltingPoint(2000) + .setCrafterTiers(3); + + getOrAddMetal("Thaumium", 4, 4.0F, 1.0F, 3.0F, 65F, 2.5F, 115, 65, 183).setMeltingPoint(1500) + .setCrafterTiers(3); + getOrAddMetal("Void", 4, 10.0F, 2.0F, 4.0F, 75F, 1.0F, 75, 45, 75).setMeltingPoint(1800).setCrafterTiers(3); + getOrAddMetal("Manasteel", 2, 3.0F, 1.0F, 2.0F, 40F, 2.5F, 88, 195, 231).setMeltingPoint(1500) + .setArmourStats(1.0F, 1.2F, 1.0F).setCrafterTiers(2);// More Resistant, Stronger than iron + getOrAddMetal("ElvenElementium", 3, 4.0F, 1.0F, 2.5F, 40F, 2.5F, 235, 108, 235).setMeltingPoint(1800) + .setArmourStats(1.1F, 1.0F, 1.1F).setCrafterTiers(2);// Similar to Manasteel, Slightly stronger + getOrAddMetal("Terrasteel", 4, 6.0F, 1.0F, 4.0F, 40F, 2.5F, 88, 250, 150).setMeltingPoint(1500) + .setArmourStats(1.0F, 0.9F, 1.0F).setCrafterTiers(3); + + // Alloy + getOrAddMetal("CompositeAlloy", 4, 4.5F, 10.0F, 1.0F, 2.5F, 75F, 4.0F, 65, 75, 65).setMeltingPoint(2500) + .setRarity(1).setCrafterTiers(3).modifyCraftTime(5.0F);// Powerful All-Rounder + } + + public static void addHeatables() { + ArrayList metal = CustomMaterial.getList("metal"); + Iterator iteratorMetal = metal.iterator(); + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + int[] stats = customMat.getHeatableStats(); + MFLogUtil.logDebug( + "Set Heatable Stats for " + customMat.name + ": " + stats[0] + "," + stats[1] + "," + stats[2]); + + MineFantasyAPI.setHeatableStats("ingot" + customMat.name, stats[0], stats[1], stats[2]); + MineFantasyAPI.setHeatableStats("hunk" + customMat.name, stats[0], stats[1], stats[2]); + } + + MineFantasyAPI.setHeatableStats(ComponentListMF.rivet, 1000, 2000, 3000); + MineFantasyAPI.setHeatableStats(ComponentListMF.metalHunk, -1, -1, -1); + MineFantasyAPI.setHeatableStats(ComponentListMF.bar, -1, -1, -1); + } + + @Override + public ItemStack getItem() { + ArrayList list = OreDictionary.getOres("ingot" + name); + if (list != null && !list.isEmpty()) { + return list.get(0); + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/material/WoodMaterial.java b/src/main/java/minefantasy/mf2/material/WoodMaterial.java index fe2f1ed0..9e0ae4fc 100644 --- a/src/main/java/minefantasy/mf2/material/WoodMaterial.java +++ b/src/main/java/minefantasy/mf2/material/WoodMaterial.java @@ -1,82 +1,70 @@ package minefantasy.mf2.material; -import java.util.ArrayList; - import minefantasy.mf2.api.material.CustomMaterial; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; -public class WoodMaterial extends CustomMaterial { - public WoodMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, - float resistance, float density) { - super(name, "wood", tier, hardness, durability, flexibility, resistance, sharpness, density); - } +import java.util.ArrayList; - /** - * @param name - * The name of the wood - * @param tier - * Tier of the material - * @param hardness - * The impact it can take (used for reinforcment in BG shields), - * usually an armour rating based value - * @param durability - * how many uses / 250 - * @param flexibility - * The ability to flex and reshape, used in bow power - * @param resistance - * Resistance to rot - * @param density - * How much a unit (timber plank) weighs in Kg - */ - public static CustomMaterial getOrAddWood(String name, int tier, float hardness, float durability, - float flexibility, float resistance, float density, int red, int green, int blue) { - if (getMaterial(name) != null) { - return CustomMaterial.getMaterial(name); - } - return new WoodMaterial(name, tier, hardness, durability, flexibility, 0F, resistance, density) - .setColour(red, green, blue).register(); - } +public class WoodMaterial extends CustomMaterial { + public WoodMaterial(String name, int tier, float hardness, float durability, float flexibility, float sharpness, + float resistance, float density) { + super(name, "wood", tier, hardness, durability, flexibility, resistance, sharpness, density); + } - @Override - public String getMaterialString() { - return StatCollector.translateToLocalFormatted("materialtype." + this.type + ".name", this.tier); - } + /** + * @param name The name of the wood + * @param tier Tier of the material + * @param hardness The impact it can take (used for reinforcment in BG shields), + * usually an armour rating based value + * @param durability how many uses / 250 + * @param flexibility The ability to flex and reshape, used in bow power + * @param resistance Resistance to rot + * @param density How much a unit (timber plank) weighs in Kg + */ + public static CustomMaterial getOrAddWood(String name, int tier, float hardness, float durability, + float flexibility, float resistance, float density, int red, int green, int blue) { + if (getMaterial(name) != null) { + return CustomMaterial.getMaterial(name); + } + return new WoodMaterial(name, tier, hardness, durability, flexibility, 0F, resistance, density) + .setColour(red, green, blue).register(); + } - public static void init() { - new CustomMaterial("magic", "Magic", -1, 1F, 0F, 1F, 0F, 0F, 0F).setColour(157, 157, 255).register(); + public static void init() { + new CustomMaterial("magic", "Magic", -1, 1F, 0F, 1F, 0F, 0F, 0F).setColour(157, 157, 255).register(); - MetalMaterial.init(); - LeatherMaterial.init(); - // Hardness-The Impact it can take. Used for armour rating, in this case - // nothing. - // Durability- how many uses it has, 1 pt per 250 uses (1/5th this adds to - // durability to tools if used as a haft). - // Flexibility- how well the wood can bend and reshape, affects bow damage. This - // is the direct damage modifier of the bow - // Resistance- Score of how well the wood withstands rot and weathering. - // Density- how much weight (Kg) does the timber plank weigh. + MetalMaterial.init(); + LeatherMaterial.init(); + // Hardness-The Impact it can take. Used for armour rating, in this case + // nothing. + // Durability- how many uses it has, 1 pt per 250 uses (1/5th this adds to + // durability to tools if used as a haft). + // Flexibility- how well the wood can bend and reshape, affects bow damage. This + // is the direct damage modifier of the bow + // Resistance- Score of how well the wood withstands rot and weathering. + // Density- how much weight (Kg) does the timber plank weigh. - // Name T Hds Dua Flx Rst Wgt R G B - getOrAddWood("ScrapWood", 0, 0.10F, 0.50F, 0.50F, 10F, 0.5F, 100, 95, 80); + // Name T Hds Dua Flx Rst Wgt R G B + getOrAddWood("ScrapWood", 0, 0.10F, 0.50F, 0.50F, 10F, 0.5F, 100, 95, 80); - getOrAddWood("OakWood", 1, 0.70F, 1.00F, 1.30F, 40F, 0.8F, 149, 119, 70).setCrafterTiers(1); - getOrAddWood("SpruceWood", 1, 0.20F, 0.90F, 1.00F, 20F, 0.4F, 102, 79, 47).setCrafterTiers(1); - getOrAddWood("BirchWood", 1, 0.50F, 0.90F, 1.30F, 10F, 0.7F, 200, 183, 122).setCrafterTiers(1); - getOrAddWood("JungleWood", 1, 0.40F, 1.00F, 1.20F, 50F, 0.6F, 159, 113, 74).setCrafterTiers(1); - getOrAddWood("AcaciaWood", 1, 0.50F, 1.20F, 1.00F, 20F, 0.6F, 173, 93, 50).setCrafterTiers(1); - getOrAddWood("DarkOakWood", 1, 1.20F, 1.50F, 1.30F, 50F, 1.0F, 62, 41, 18).setCrafterTiers(1); + getOrAddWood("OakWood", 1, 0.70F, 1.00F, 1.30F, 40F, 0.8F, 149, 119, 70).setCrafterTiers(1); + getOrAddWood("SpruceWood", 1, 0.20F, 0.90F, 1.00F, 20F, 0.4F, 102, 79, 47).setCrafterTiers(1); + getOrAddWood("BirchWood", 1, 0.50F, 0.90F, 1.30F, 10F, 0.7F, 200, 183, 122).setCrafterTiers(1); + getOrAddWood("JungleWood", 1, 0.40F, 1.00F, 1.20F, 50F, 0.6F, 159, 113, 74).setCrafterTiers(1); + getOrAddWood("AcaciaWood", 1, 0.50F, 1.20F, 1.00F, 20F, 0.6F, 173, 93, 50).setCrafterTiers(1); + getOrAddWood("DarkOakWood", 1, 1.20F, 1.50F, 1.30F, 50F, 1.0F, 62, 41, 18).setCrafterTiers(1); - getOrAddWood("RefinedWood", 2, 0.80F, 2.00F, 1.30F, 50F, 0.8F, 95, 40, 24).setCrafterTiers(2).setRarity(1); - getOrAddWood("YewWood", 2, 0.70F, 2.00F, 2.00F, 40F, 0.7F, 195, 138, 54).setCrafterTiers(2).setRarity(1); - getOrAddWood("IronbarkWood", 2, 0.90F, 3.50F, 1.10F, 50F, 0.9F, 202, 92, 29).setCrafterTiers(2).setRarity(1); + getOrAddWood("RefinedWood", 2, 0.80F, 2.00F, 1.30F, 50F, 0.8F, 95, 40, 24).setCrafterTiers(2).setRarity(1); + getOrAddWood("YewWood", 2, 0.70F, 2.00F, 2.00F, 40F, 0.7F, 195, 138, 54).setCrafterTiers(2).setRarity(1); + getOrAddWood("IronbarkWood", 2, 0.90F, 3.50F, 1.10F, 50F, 0.9F, 202, 92, 29).setCrafterTiers(2).setRarity(1); - getOrAddWood("EbonyWood", 3, 1.30F, 4.00F, 1.60F, 80F, 1.0F, 50, 46, 40).setCrafterTiers(3).setRarity(2); + getOrAddWood("EbonyWood", 3, 1.30F, 4.00F, 1.60F, 80F, 1.0F, 50, 46, 40).setCrafterTiers(3).setRarity(2); - getOrAddWood("SilverwoodWood", 2, 1.00F, 3.50F, 2.20F, 75F, 0.8F, 224, 220, 208).setCrafterTiers(2); - getOrAddWood("GreatwoodWood", 2, 1.20F, 1.50F, 1.00F, 50F, 1.5F, 37, 25, 23).setCrafterTiers(2); - /* + getOrAddWood("SilverwoodWood", 2, 1.00F, 3.50F, 2.20F, 75F, 0.8F, 224, 220, 208).setCrafterTiers(2); + getOrAddWood("GreatwoodWood", 2, 1.20F, 1.50F, 1.00F, 50F, 1.5F, 37, 25, 23).setCrafterTiers(2); + /* * //OTHERS. playing around with, mainly forestry getOrAddWood("PineWood", 0, 1, * 1, 1, 1, 1, 1, 189, 147, 63); getOrAddWood("CherryWood", 0, 1, 1, 1, 1, 1, 1, * 162, 116, 47); getOrAddWood("PapayaWood", 0, 1, 1, 1, 1, 1, 1, 214, 194, 91); @@ -103,15 +91,20 @@ public static void init() { * getOrAddWood("PurpleHeartWood", 0, 1, 1, 1, 1, 1, 1, 55, 25, 49); */ - } + } + + @Override + public String getMaterialString() { + return StatCollector.translateToLocalFormatted("materialtype." + this.type + ".name", this.tier); + } - @Override - public ItemStack getItem() { - ArrayList list = OreDictionary.getOres("planks" + name); - if (list != null && !list.isEmpty()) { - return list.get(0); - } - return null; - } + @Override + public ItemStack getItem() { + ArrayList list = OreDictionary.getOres("planks" + name); + if (list != null && !list.isEmpty()) { + return list.get(0); + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java b/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java index 7a292fcc..fef57372 100644 --- a/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java @@ -16,39 +16,67 @@ import net.minecraftforge.event.entity.player.ArrowNockEvent; public class ArrowHandlerMF { - /** - * When the arrow is pulled back it initiates - */ - @SubscribeEvent - public void readyBow(ArrowNockEvent event) { - EntityPlayer user = event.entityPlayer; - ItemStack bow = event.result; - - if (AmmoMechanicsMF.arrows == null || AmmoMechanicsMF.arrows.size() <= 0) { - if (getIsInfinite(event.entityPlayer, event.result)) { - user.setItemInUse(bow, bow.getMaxItemUseDuration());// Starts pullback - event.setCanceled(true); - } - return; - } + /** + * This method adds arrows to the bow + */ + public static void loadArrow(EntityPlayer player, ItemStack bow, ItemStack arrow) { + if (player.worldObj.isRemote) { + return; + } + NBTTagCompound nbt = getOrApplyNBT(bow); + + if (arrow == null) { + nbt.removeTag("loadedArrow"); + } else { + NBTTagCompound loaded = new NBTTagCompound(); + arrow.writeToNBT(loaded); + nbt.setTag("loadedArrow", loaded); + } + } + + /** + * Gets the NBT, if there is none, it creates it + */ + private static NBTTagCompound getOrApplyNBT(ItemStack bow) { + if (!bow.hasTagCompound()) { + bow.setTagCompound(new NBTTagCompound()); + } + return bow.getTagCompound(); + } + + /** + * When the arrow is pulled back it initiates + */ + @SubscribeEvent + public void readyBow(ArrowNockEvent event) { + EntityPlayer user = event.entityPlayer; + ItemStack bow = event.result; + + if (AmmoMechanicsMF.arrows == null || AmmoMechanicsMF.arrows.size() <= 0) { + if (getIsInfinite(event.entityPlayer, event.result)) { + user.setItemInUse(bow, bow.getMaxItemUseDuration());// Starts pullback + event.setCanceled(true); + } + return; + } /* - * Checks over registered arrows and finds one to load The Quiver can be used to + * Checks over registered arrows and finds one to load The Quiver can be used to * determine this */ - ItemStack arrowToFire = AmmoMechanicsMF.reloadBow(bow); - if (arrowToFire != null) { - user.setItemInUse(bow, bow.getMaxItemUseDuration());// Starts pullback - loadArrow(user, bow, arrowToFire);// adds the arrow to NBT for rendering and later use - event.setCanceled(true); - return; - } else { - if (getIsInfinite(event.entityPlayer, event.result)) { - user.setItemInUse(bow, bow.getMaxItemUseDuration());// Starts pullback - event.setCanceled(true); - return; - } - } + ItemStack arrowToFire = AmmoMechanicsMF.reloadBow(bow); + if (arrowToFire != null) { + user.setItemInUse(bow, bow.getMaxItemUseDuration());// Starts pullback + loadArrow(user, bow, arrowToFire);// adds the arrow to NBT for rendering and later use + event.setCanceled(true); + return; + } else { + if (getIsInfinite(event.entityPlayer, event.result)) { + user.setItemInUse(bow, bow.getMaxItemUseDuration());// Starts pullback + event.setCanceled(true); + return; + } + } /* * for(int a = 0; a < AmmoMechanicsMF.arrows.size(); a ++) { ItemStack arrow = * AmmoMechanicsMF.arrows.get(a); if(user.inventory.hasItemStack(arrow)) { @@ -56,108 +84,80 @@ public void readyBow(ArrowNockEvent event) { * loadArrow(user, bow, arrow);//adds the arrow to NBT for rendering and later * use event.setCanceled(true); return; } } */ - } - - /** - * This method adds arrows to the bow - */ - public static void loadArrow(EntityPlayer player, ItemStack bow, ItemStack arrow) { - if (player.worldObj.isRemote) { - return; - } - NBTTagCompound nbt = getOrApplyNBT(bow); - - if (arrow == null) { - nbt.removeTag("loadedArrow"); - } else { - NBTTagCompound loaded = new NBTTagCompound(); - arrow.writeToNBT(loaded); - nbt.setTag("loadedArrow", loaded); - } - } - - /** - * Gets the NBT, if there is none, it creates it - */ - private static NBTTagCompound getOrApplyNBT(ItemStack bow) { - if (!bow.hasTagCompound()) { - bow.setTagCompound(new NBTTagCompound()); - } - return bow.getTagCompound(); - } - - @SubscribeEvent(priority = EventPriority.HIGHEST) - public void applyExhaustArrow(ArrowLooseEvent event) { - if (StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(event.entityPlayer, false)) { - if (ConfigStamina.weaponDrain < 1.0F) - event.charge *= ConfigStamina.weaponDrain; - } - } - - /** - * This initates when firing a bow - * - * @param event - */ - @SubscribeEvent - public void fireArrow(ArrowLooseEvent event) { - float power = event.charge; - EntityPlayer user = event.entityPlayer; - - ItemStack bow = event.bow; - World world = event.entity.worldObj; - boolean creative = user.capabilities.isCreativeMode; - - float charge = power / 20.0F; - charge = (charge * charge + charge * 2.0F) / 3.0F; - - if (charge < 0.1D) { - return; - } - - if (charge > 1.0F) { - charge = 1.0F; - } - - // Default is flint arrow - ItemStack arrow = new ItemStack(Items.arrow); - if (AmmoMechanicsMF.getArrowOnBow(bow) != null) { - // if an arrow is on the bow, it uses that - arrow = AmmoMechanicsMF.getArrowOnBow(bow); - } - if (AmmoMechanicsMF.handlers != null && AmmoMechanicsMF.handlers.size() > 0) { - for (int a = 0; a < AmmoMechanicsMF.handlers.size(); a++) { - // If the Arrow handler succeeds at firing an arrow - if (AmmoMechanicsMF.handlers.get(a).onFireArrow(world, arrow, bow, user, charge, creative)) { - if (!user.capabilities.isCreativeMode) { - bow.damageItem(1, user); - } - world.playSoundAtEntity(user, "minefantasy2:weapon.bowFire", 0.5F, - 1.0F / (world.rand.nextFloat() * 0.4F + 1.2F) + charge * 0.5F); - loadArrow(user, bow, null); - event.setCanceled(true); - AmmoMechanicsMF.consumeAmmo(user, bow); - break; - } - } - } - } - - private boolean getIsInfinite(EntityPlayer user, ItemStack bow) { - return user.capabilities.isCreativeMode - || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, bow) > 0; - } - - // Used to take an item/subId from the inventory - private boolean consumePlayerItem(EntityPlayer player, ItemStack item) { - for (int a = 0; a < player.inventory.getSizeInventory(); a++) { - ItemStack i = player.inventory.getStackInSlot(a); - if (i != null && i.isItemEqual(item)) { - player.inventory.decrStackSize(a, 1); - return true; - } - } - return false; - } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void applyExhaustArrow(ArrowLooseEvent event) { + if (StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(event.entityPlayer, false)) { + if (ConfigStamina.weaponDrain < 1.0F) + event.charge *= ConfigStamina.weaponDrain; + } + } + + /** + * This initates when firing a bow + * + * @param event + */ + @SubscribeEvent + public void fireArrow(ArrowLooseEvent event) { + float power = event.charge; + EntityPlayer user = event.entityPlayer; + + ItemStack bow = event.bow; + World world = event.entity.worldObj; + boolean creative = user.capabilities.isCreativeMode; + + float charge = power / 20.0F; + charge = (charge * charge + charge * 2.0F) / 3.0F; + + if (charge < 0.1D) { + return; + } + + if (charge > 1.0F) { + charge = 1.0F; + } + + // Default is flint arrow + ItemStack arrow = new ItemStack(Items.arrow); + if (AmmoMechanicsMF.getArrowOnBow(bow) != null) { + // if an arrow is on the bow, it uses that + arrow = AmmoMechanicsMF.getArrowOnBow(bow); + } + if (AmmoMechanicsMF.handlers != null && AmmoMechanicsMF.handlers.size() > 0) { + for (int a = 0; a < AmmoMechanicsMF.handlers.size(); a++) { + // If the Arrow handler succeeds at firing an arrow + if (AmmoMechanicsMF.handlers.get(a).onFireArrow(world, arrow, bow, user, charge, creative)) { + if (!user.capabilities.isCreativeMode) { + bow.damageItem(1, user); + } + world.playSoundAtEntity(user, "minefantasy2:weapon.bowFire", 0.5F, + 1.0F / (world.rand.nextFloat() * 0.4F + 1.2F) + charge * 0.5F); + loadArrow(user, bow, null); + event.setCanceled(true); + AmmoMechanicsMF.consumeAmmo(user, bow); + break; + } + } + } + } + + private boolean getIsInfinite(EntityPlayer user, ItemStack bow) { + return user.capabilities.isCreativeMode + || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, bow) > 0; + } + + // Used to take an item/subId from the inventory + private boolean consumePlayerItem(EntityPlayer player, ItemStack item) { + for (int a = 0; a < player.inventory.getSizeInventory(); a++) { + ItemStack i = player.inventory.getStackInSlot(a); + if (i != null && i.isItemEqual(item)) { + player.inventory.decrStackSize(a, 1); + return true; + } + } + return false; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/ArrowListMF.java b/src/main/java/minefantasy/mf2/mechanics/ArrowListMF.java index 51afa5b3..42a311e6 100644 --- a/src/main/java/minefantasy/mf2/mechanics/ArrowListMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/ArrowListMF.java @@ -1,23 +1,23 @@ package minefantasy.mf2.mechanics; +import net.minecraft.item.ItemStack; + import java.util.ArrayList; import java.util.List; -import net.minecraft.item.ItemStack; - @Deprecated public class ArrowListMF { - public static List useableArrows = new ArrayList(); + public static List useableArrows = new ArrayList(); - private static void addArrow(ItemStack arrow) { - useableArrows.add(arrow); - } + private static void addArrow(ItemStack arrow) { + useableArrows.add(arrow); + } - private static boolean canShootArrow(ItemStack arrow) { - for (ItemStack Comparearrow : useableArrows) { - if (Comparearrow.isItemEqual(arrow)) - return true; - } - return false; - } + private static boolean canShootArrow(ItemStack arrow) { + for (ItemStack Comparearrow : useableArrows) { + if (Comparearrow.isItemEqual(arrow)) + return true; + } + return false; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/BombDispenser.java b/src/main/java/minefantasy/mf2/mechanics/BombDispenser.java index 067800be..6ec8d8ac 100644 --- a/src/main/java/minefantasy/mf2/mechanics/BombDispenser.java +++ b/src/main/java/minefantasy/mf2/mechanics/BombDispenser.java @@ -13,66 +13,66 @@ public class BombDispenser implements IBehaviorDispenseItem { - @Override - public ItemStack dispense(IBlockSource dispenser, ItemStack item) { - EnumFacing direction = BlockDispenser.func_149937_b(dispenser.getBlockMetadata()); - // BlockDispenser - if (item == null) - return null; + @Override + public ItemStack dispense(IBlockSource dispenser, ItemStack item) { + EnumFacing direction = BlockDispenser.func_149937_b(dispenser.getBlockMetadata()); + // BlockDispenser + if (item == null) + return null; - if (item.getItem() instanceof ItemBomb) { - ItemBomb itembomb = (ItemBomb) item.getItem(); - World world = dispenser.getWorld(); + if (item.getItem() instanceof ItemBomb) { + ItemBomb itembomb = (ItemBomb) item.getItem(); + World world = dispenser.getWorld(); - double posX = dispenser.getX() + (direction.getFrontOffsetX() / 2F); - double posY = dispenser.getY() + (direction.getFrontOffsetY() / 2F); - double posZ = dispenser.getZ() + (direction.getFrontOffsetZ() / 2F); + double posX = dispenser.getX() + (direction.getFrontOffsetX() / 2F); + double posY = dispenser.getY() + (direction.getFrontOffsetY() / 2F); + double posZ = dispenser.getZ() + (direction.getFrontOffsetZ() / 2F); - double xVelocity = +direction.getFrontOffsetX(); - double yVelocity = +direction.getFrontOffsetY(); - double zVelocity = +direction.getFrontOffsetZ(); - float velocityModifier = 1.5F; + double xVelocity = +direction.getFrontOffsetX(); + double yVelocity = +direction.getFrontOffsetY(); + double zVelocity = +direction.getFrontOffsetZ(); + float velocityModifier = 1.5F; - if (!world.isRemote) { - EntityBomb bomb = new EntityBomb(world).setType(ItemBomb.getFilling(item), ItemBomb.getCasing(item), - ItemBomb.getFuse(item), ItemBomb.getPowder(item)); - bomb.setPosition(posX, posY, posZ); - bomb.setThrowableHeading(xVelocity, yVelocity, zVelocity, 1.0F, velocityModifier); - world.spawnEntityInWorld(bomb); - if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { - bomb.getEntityData().setBoolean("stickyBomb", true); - } - } - item.splitStack(1); - } + if (!world.isRemote) { + EntityBomb bomb = new EntityBomb(world).setType(ItemBomb.getFilling(item), ItemBomb.getCasing(item), + ItemBomb.getFuse(item), ItemBomb.getPowder(item)); + bomb.setPosition(posX, posY, posZ); + bomb.setThrowableHeading(xVelocity, yVelocity, zVelocity, 1.0F, velocityModifier); + world.spawnEntityInWorld(bomb); + if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { + bomb.getEntityData().setBoolean("stickyBomb", true); + } + } + item.splitStack(1); + } - if (item.getItem() instanceof ItemMine) { - ItemMine itembomb = (ItemMine) item.getItem(); - World world = dispenser.getWorld(); + if (item.getItem() instanceof ItemMine) { + ItemMine itembomb = (ItemMine) item.getItem(); + World world = dispenser.getWorld(); - double posX = dispenser.getX() + (direction.getFrontOffsetX() / 2F); - double posY = dispenser.getY() + (direction.getFrontOffsetY() / 2F); - double posZ = dispenser.getZ() + (direction.getFrontOffsetZ() / 2F); + double posX = dispenser.getX() + (direction.getFrontOffsetX() / 2F); + double posY = dispenser.getY() + (direction.getFrontOffsetY() / 2F); + double posZ = dispenser.getZ() + (direction.getFrontOffsetZ() / 2F); - double xVelocity = +direction.getFrontOffsetX(); - double yVelocity = +direction.getFrontOffsetY(); - double zVelocity = +direction.getFrontOffsetZ(); - float velocityModifier = 0.5F; + double xVelocity = +direction.getFrontOffsetX(); + double yVelocity = +direction.getFrontOffsetY(); + double zVelocity = +direction.getFrontOffsetZ(); + float velocityModifier = 0.5F; - if (!world.isRemote) { - EntityMine bomb = new EntityMine(world).setType(ItemBomb.getFilling(item), ItemBomb.getCasing(item), - ItemBomb.getFuse(item), ItemBomb.getPowder(item)); - bomb.setPosition(posX, posY, posZ); - bomb.setThrowableHeading(xVelocity, yVelocity, zVelocity, 1.0F, velocityModifier); - world.spawnEntityInWorld(bomb); - if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { - bomb.getEntityData().setBoolean("stickyBomb", true); - } - } - item.splitStack(1); - } + if (!world.isRemote) { + EntityMine bomb = new EntityMine(world).setType(ItemBomb.getFilling(item), ItemBomb.getCasing(item), + ItemBomb.getFuse(item), ItemBomb.getPowder(item)); + bomb.setPosition(posX, posY, posZ); + bomb.setThrowableHeading(xVelocity, yVelocity, zVelocity, 1.0F, velocityModifier); + world.spawnEntityInWorld(bomb); + if (item.hasTagCompound() && item.getTagCompound().hasKey("stickyBomb")) { + bomb.getEntityData().setBoolean("stickyBomb", true); + } + } + item.splitStack(1); + } - return item; - } + return item; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java index 63d18a52..2a415265 100644 --- a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java +++ b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java @@ -3,7 +3,6 @@ import cpw.mods.fml.common.eventhandler.SubscribeEvent; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.armour.IElementalResistance; -import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; import minefantasy.mf2.api.helpers.*; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.api.material.CustomMaterial; @@ -31,7 +30,6 @@ import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.monster.EntitySkeleton; import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.passive.EntityHorse; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.init.Items; @@ -52,133 +50,358 @@ import java.util.Map; public class CombatMechanics { - public static final String parryCooldownNBT = "MF_Parry_Cooldown"; - public static final String posthitCooldownNBT = "MF_PostHit"; - /** Damage done by silver to undead/witches */ - public static final float specialUnholyModifier = 2.0F; - /** Damage done by silver to werewolves */ - public static final float specialWerewolfModifier = 8.0F; - /** Damage done with dragonforged design to dragons */ - public static final float specialDragonModifier = 1.5F; - /** Damage done with ornate design to undead/witches */ - public static final float specialOrnateModifier = 1.5F; - public static boolean swordSkeleton = true; - - protected float jumpEvade_cost = 30; - protected float evade_cost = 10; - - @SubscribeEvent - public void initAttack(LivingAttackEvent event) { - EntityLivingBase hitter = getHitter(event.source); - int spd = EventManagerMF.getHitspeedTime(hitter); - if (hitter != null && !hitter.worldObj.isRemote) { - if (spd > 0 && !(event.entityLiving instanceof EntityPlayer || event.entityLiving instanceof EntityEnderman)) { - event.setCanceled(true); - return; - } - } - DamageSource src = event.source; - EntityLivingBase hit = event.entityLiving; - World world = hit.worldObj; - boolean powerArmour = PowerArmour.isFullyArmoured(hit); - float damage = modifyDamage(src, world, hit, event.ammount, false); - - if (event.source.isProjectile() && !event.source.isFireDamage()) { - if (powerArmour || (damage < event.ammount && hit.getTotalArmorValue() > 0))// only if dam has been reduced - { - if (ConfigArmour.resistArrow && !event.isCanceled() && (damage <= 0.5F))// TacticalManager.resistArrow(event.entityLiving, - // event.source, damage)) - { - if (event.source.getSourceOfDamage() != null - && !event.source.getSourceOfDamage().getEntityData().hasKey("arrowDeflectMF") - && !(event.source.getEntity() instanceof EntityEnderPearl)) { - event.source.getSourceOfDamage().getEntityData().setBoolean("arrowDeflectMF", true); - event.entityLiving.worldObj.playSoundAtEntity(event.entityLiving, "random.break", 1.0F, 0.5F); - event.setCanceled(true); - } - } - } - } - - if (damage <= 0) { - event.setCanceled(true); - } - if (hitter != null && hitter instanceof EntityLivingBase) { - int hitTime = 5; - if (hitter.getHeldItem() != null) { - ItemStack weapon = hitter.getHeldItem(); - if (weapon.getItem() instanceof IWeaponSpeed) { - hitTime += ((IWeaponSpeed) weapon.getItem()).modifyHitTime(hitter, weapon); - } - } - if (hitTime > 0) - EventManagerMF.setHitTime(hitter, hitTime); - } - } - - /** - * gets the melee hitter - */ - private EntityLivingBase getHitter(DamageSource source) { - if (source != null && source.getEntity() != null && source.getEntity() == source.getSourceOfDamage() - && source.getEntity() instanceof EntityLivingBase) { - return (EntityLivingBase) source.getEntity(); - } - return null; - } - - @SubscribeEvent - public void onHit(LivingHurtEvent event) { - DamageSource src = event.source; - EntityLivingBase hit = event.entityLiving; - - if (src != null && src == DamageSource.fall) { - onFall(hit, event.ammount); - } - World world = hit.worldObj; - float damage = modifyDamage(src, world, hit, event.ammount, true); - - if (damage > 0 && hit.isSprinting()) { - hit.setSprinting(false); - } - // TODO: Zombie armour - if (event.entityLiving.getEntityData().hasKey(MonsterUpgrader.zombieArmourNBT) - && event.entityLiving instanceof EntityZombie) { - float percent = 1.0F; - ItemStack[] armours = new ItemStack[4]; - for (int a = 1; a < 5; a++) { - armours[a - 1] = event.entityLiving.getEquipmentInSlot(a); - } - damage = ISpecialArmor.ArmorProperties.ApplyArmor(event.entityLiving, armours, event.source, damage); - } - // TODO: Stick arrows (EXPERIMENTAL) - if (ConfigExperiment.stickArrows && event.source.getSourceOfDamage() != null - && event.source.getSourceOfDamage() instanceof EntityArrow) { - if (!event.entity.worldObj.isRemote) { - ArrowEffectsMF.stickArrowIn(event.entity, - ArrowEffectsMF.getDroppedArrow(event.source.getSourceOfDamage()), - event.source.getSourceOfDamage()); - } - } - if (damage > 0) { - onOfficialHit(src, hit, damage); - - if (event.source instanceof EntityDamageSource && !(event.source instanceof EntityDamageSourceIndirect) - && !event.source.damageType.equals("battlegearExtra")) { - Entity entityHitter = ((EntityDamageSource) event.source).getEntity(); - - if (entityHitter instanceof EntityLivingBase) { - EntityLivingBase attacker = (EntityLivingBase) entityHitter; - StaminaMechanics.onAttack(attacker, hit); - ItemStack weapon = attacker.getHeldItem(); - HitSoundGenerator.makeHitSound(weapon, event.entityLiving); - } - } - } - event.ammount = damage; - - //Horses has own damage watcher - /*if (hit instanceof EntityHorse) { + public static final String parryCooldownNBT = "MF_Parry_Cooldown"; + public static final String posthitCooldownNBT = "MF_PostHit"; + /** + * Damage done by silver to undead/witches + */ + public static final float specialUnholyModifier = 2.0F; + /** + * Damage done by silver to werewolves + */ + public static final float specialWerewolfModifier = 8.0F; + /** + * Damage done with dragonforged design to dragons + */ + public static final float specialDragonModifier = 1.5F; + /** + * Damage done with ornate design to undead/witches + */ + public static final float specialOrnateModifier = 1.5F; + private static final float power_attack_base = 25F; + private static final float parryFatigue = 5F; + public static boolean swordSkeleton = true; + private static boolean debugParry = true; + protected float jumpEvade_cost = 30; + protected float evade_cost = 10; + + /** + * 0 = false 1 = true -1 = failure + */ + private static int initPowerAttack(EntityLivingBase user, Entity target, boolean properHit) { + if (!canExecutePower(user)) { + return 0; + } + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { + float points = power_attack_base * (StaminaBar.getBaseDecayModifier(user, true, true) * 0.5F + 0.5F); + if (StaminaBar.isStaminaAvailable(user, points, properHit)) { + if (properHit) { + ItemWeaponMF.applyFatigue(user, points); + } + return getPostHitCooldown(user) > 0 ? -1 : 1; + } else { + return 0; + } + } + return 1; + } + + private static boolean canExecutePower(EntityLivingBase user) { + if (user.isInWater()) { + return false; + } + if (user instanceof EntityPlayer) { + if (!isFightStance(user)) + return false; + } + return user.fallDistance > 0 && !user.isOnLadder(); + } + + private static boolean isFightStance(EntityLivingBase user) { + return user.isSneaking(); + } + + public static void applyUndeadBane(EntityLivingBase living) { + living.playSound("random.fizz", 0.5F, 0.5F); + living.addPotionEffect(new PotionEffect(Potion.weakness.id, 1200, 2)); + living.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 1200, 2)); + if (MineFantasyII.random.nextInt(5) == 0) { + living.setFire(3); + } + } + + protected static void performEffects(Map map, EntityLivingBase entityHit) { + double roll = Math.random(); + if (map == null || map.isEmpty()) { + return; + } + + for (PotionEffect effect : map.keySet()) { + // add effects if they aren't already applied, with corresponding chance factor + if (!entityHit.isPotionActive(effect.getPotionID()) && map.get(effect) > roll) { + entityHit.addPotionEffect(new PotionEffect(effect)); + } + } + } + + public static void setParryCooldown(EntityLivingBase user, int ticks) { + user.getEntityData().setInteger(parryCooldownNBT, ticks); + + if (!user.worldObj.isRemote && user instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) user; + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new ParryPacket(ticks, player).generatePacket()); + } + } + + public static int getParryCooldown(EntityLivingBase user) { + if (user.getEntityData().hasKey(parryCooldownNBT)) { + return user.getEntityData().getInteger(parryCooldownNBT); + } + return 0; + } + + public static void tickParryCooldown(EntityLivingBase user) { + int ticks = getParryCooldown(user); + if (ticks > 0) { + setParryCooldown(user, ticks - 1); + } + } + + public static boolean isParryAvailable(EntityLivingBase user) { + return getParryCooldown(user) <= 0; + } + + public static void setPostHitCooldown(EntityLivingBase user, int ticks) { + user.getEntityData().setInteger(posthitCooldownNBT, ticks); + } + + public static int getPostHitCooldown(EntityLivingBase user) { + if (user.getEntityData().hasKey(posthitCooldownNBT)) { + return user.getEntityData().getInteger(posthitCooldownNBT); + } + return 0; + } + + public static void tickPostHitCooldown(EntityLivingBase user) { + int ticks = getPostHitCooldown(user); + if (ticks > 0) { + setPostHitCooldown(user, ticks - 1); + } + } + + /** + * Client-sided dodge + */ + private static void commandDodge(EntityPlayer user, int type) { + initDodge(user, type); + ((EntityClientPlayerMP) user).sendQueue.addToSendQueue(new DodgeCommand(user, type).generatePacket()); + } + + public static void initDodge(EntityPlayer user, int type) { + float bulk = ArmourCalculator.getTotalBulk(user); + int cost = (int) ((type == 0 ? 15 : 10) * (bulk + 1));// Medium armour cost 2x more + + if (bulk <= 1.0F && ItemWeaponMF.tryPerformAbility(user, cost)) { + float force = 1.0F - (bulk * 0.25F);// Medium armour gives 75% + + float direction = user.rotationYaw; + if (type == 0) + direction += 180;// BACK + if (type == 1) + direction -= 90;// LEFT + if (type == -1) + direction += 90;// RIGHT + TacticalManager.leap(user, direction, force, 0.0F); + } + } + + /* + * Causes the victim to 'Spaz out' which never stops being funny (Apply every + * tick) + */ + public static void panic(EntityLivingBase victim, float speed, int directionTimer) { + if (!shouldPanic(victim)) { + return; + } + double moveX = victim.getEntityData().getDouble("MF2_PanicX"); + double moveZ = victim.getEntityData().getDouble("MF2_PanicZ"); + victim.setJumping(true); + + if ((moveX == 0 && moveZ == 0) || MineFantasyII.random.nextInt(directionTimer) == 0) { + moveX = (MineFantasyII.random.nextDouble() - 0.5D) * 0.85D * speed; + moveZ = (MineFantasyII.random.nextDouble() - 0.5D) * 0.85D * speed; + + victim.getEntityData().setDouble("MF2_PanicX", moveX); + victim.getEntityData().setDouble("MF2_PanicZ", moveZ); + if (victim.onGround) + victim.motionY = 0.25F; + victim.rotationYaw = (float) (Math.atan2(moveX, moveZ)); + } + victim.swingItem(); + victim.limbSwing = 1.0F; + victim.moveEntity(moveX, 0D, moveZ); + } + + private static boolean shouldPanic(EntityLivingBase victim) { + if (victim instanceof EntityMinotaur) { + return ((EntityMinotaur) victim).getRageLevel() < 80; + } + return !(victim instanceof EntityPlayer || victim instanceof EntityCogwork); + } + + /** + * How much strength is added (directly adds to melee dmg) + */ + public static float getStrengthEnhancement(EntityLivingBase user) { + float mod = 0F; + if (PowerArmour.isPowered(user)) { + mod += 3F; + } + return Math.max(-0.5F, mod); + } + + public static float getSpecialModifier(CustomMaterial material, String design, Entity target, boolean addEffect) { + if (target == null) + return 1.0F; + + float modifier = 1.0F; + + if (design != null) { + if (design.equalsIgnoreCase("dragonforged")) { + if (TacticalManager.isDragon(target)) { + modifier *= specialDragonModifier; + } + } + + if (design.equalsIgnoreCase("ornate")) { + if (TacticalManager.isUnholyCreature(target)) { + modifier *= specialOrnateModifier; + } + } + } + + if (material != null) { + if (isSilverishMaterial(material.name) && target instanceof EntityLivingBase) { + if (target.getClass().getName().contains("Werewolf")) { + modifier *= specialWerewolfModifier; + applyUndeadBane((EntityLivingBase) target); + } else if (TacticalManager.isUnholyCreature(target)) { + modifier *= specialUnholyModifier; + applyUndeadBane((EntityLivingBase) target); + } + } + } + + return modifier; + } + + public static boolean isSilverishMaterial(String material) { + return material.equalsIgnoreCase("silver"); + } + + @SubscribeEvent + public void initAttack(LivingAttackEvent event) { + EntityLivingBase hitter = getHitter(event.source); + int spd = EventManagerMF.getHitspeedTime(hitter); + if (hitter != null && !hitter.worldObj.isRemote) { + if (spd > 0 && !(event.entityLiving instanceof EntityPlayer || event.entityLiving instanceof EntityEnderman)) { + event.setCanceled(true); + return; + } + } + DamageSource src = event.source; + EntityLivingBase hit = event.entityLiving; + World world = hit.worldObj; + boolean powerArmour = PowerArmour.isFullyArmoured(hit); + float damage = modifyDamage(src, world, hit, event.ammount, false); + + if (event.source.isProjectile() && !event.source.isFireDamage()) { + if (powerArmour || (damage < event.ammount && hit.getTotalArmorValue() > 0))// only if dam has been reduced + { + if (ConfigArmour.resistArrow && !event.isCanceled() && (damage <= 0.5F))// TacticalManager.resistArrow(event.entityLiving, + // event.source, damage)) + { + if (event.source.getSourceOfDamage() != null + && !event.source.getSourceOfDamage().getEntityData().hasKey("arrowDeflectMF") + && !(event.source.getEntity() instanceof EntityEnderPearl)) { + event.source.getSourceOfDamage().getEntityData().setBoolean("arrowDeflectMF", true); + event.entityLiving.worldObj.playSoundAtEntity(event.entityLiving, "random.break", 1.0F, 0.5F); + event.setCanceled(true); + } + } + } + } + + if (damage <= 0) { + event.setCanceled(true); + } + if (hitter != null && hitter instanceof EntityLivingBase) { + int hitTime = 5; + if (hitter.getHeldItem() != null) { + ItemStack weapon = hitter.getHeldItem(); + if (weapon.getItem() instanceof IWeaponSpeed) { + hitTime += ((IWeaponSpeed) weapon.getItem()).modifyHitTime(hitter, weapon); + } + } + if (hitTime > 0) + EventManagerMF.setHitTime(hitter, hitTime); + } + } + + /** + * gets the melee hitter + */ + private EntityLivingBase getHitter(DamageSource source) { + if (source != null && source.getEntity() != null && source.getEntity() == source.getSourceOfDamage() + && source.getEntity() instanceof EntityLivingBase) { + return (EntityLivingBase) source.getEntity(); + } + return null; + } + + @SubscribeEvent + public void onHit(LivingHurtEvent event) { + DamageSource src = event.source; + EntityLivingBase hit = event.entityLiving; + + if (src != null && src == DamageSource.fall) { + onFall(hit, event.ammount); + } + World world = hit.worldObj; + float damage = modifyDamage(src, world, hit, event.ammount, true); + + if (damage > 0 && hit.isSprinting()) { + hit.setSprinting(false); + } + // TODO: Zombie armour + if (event.entityLiving.getEntityData().hasKey(MonsterUpgrader.zombieArmourNBT) + && event.entityLiving instanceof EntityZombie) { + float percent = 1.0F; + ItemStack[] armours = new ItemStack[4]; + for (int a = 1; a < 5; a++) { + armours[a - 1] = event.entityLiving.getEquipmentInSlot(a); + } + damage = ISpecialArmor.ArmorProperties.ApplyArmor(event.entityLiving, armours, event.source, damage); + } + // TODO: Stick arrows (EXPERIMENTAL) + if (ConfigExperiment.stickArrows && event.source.getSourceOfDamage() != null + && event.source.getSourceOfDamage() instanceof EntityArrow) { + if (!event.entity.worldObj.isRemote) { + ArrowEffectsMF.stickArrowIn(event.entity, + ArrowEffectsMF.getDroppedArrow(event.source.getSourceOfDamage()), + event.source.getSourceOfDamage()); + } + } + if (damage > 0) { + onOfficialHit(src, hit, damage); + + if (event.source instanceof EntityDamageSource && !(event.source instanceof EntityDamageSourceIndirect) + && !event.source.damageType.equals("battlegearExtra")) { + Entity entityHitter = ((EntityDamageSource) event.source).getEntity(); + + if (entityHitter instanceof EntityLivingBase) { + EntityLivingBase attacker = (EntityLivingBase) entityHitter; + StaminaMechanics.onAttack(attacker, hit); + ItemStack weapon = attacker.getHeldItem(); + HitSoundGenerator.makeHitSound(weapon, event.entityLiving); + } + } + } + event.ammount = damage; + + //Horses has own damage watcher + /*if (hit instanceof EntityHorse) { EntityHorse horse = (EntityHorse) event.entity; ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); @@ -187,761 +410,541 @@ public void onHit(LivingHurtEvent event) { event.setCanceled(armor.onHorseDamaged(horse, customArmor, event.source, event.ammount)); } }*/ - } - - private void onFall(EntityLivingBase fallen, float height) { - float weight = ArmourCalculator.getTotalWeightOfWorn(fallen, false); - if (weight > 100) { - weight -= 100F; - float power = (height / 4F) * (weight / 100F); - newShockwave(fallen, fallen.posX, fallen.posY, fallen.posZ, power, false, true); - } - } - - public Shockwave newShockwave(Entity source, double x, double y, double z, float power, boolean fire, - boolean smoke) { - Shockwave explosion = new Shockwave("humanstomp", source.worldObj, source, x, y, z, power); - explosion.isFlaming = fire; - explosion.isSmoking = smoke; - explosion.initiate(); - explosion.decorateWave(true); - return explosion; - } - - private float modifyDamage(DamageSource src, World world, EntityLivingBase hit, float dam, boolean properHit) { - Entity source = src.getSourceOfDamage(); - Entity hitter = src.getEntity(); - - if (PowerArmour.allowDamageToBlock(src)) { - dam = PowerArmour.modifyDamage(hit, dam, src); - } - - if (properHit && hit instanceof EntityPlayer) { - dam = modifyPlayerDamage((EntityPlayer) hit, dam); - } - - if (source != null && hitter != null && hitter instanceof EntityLivingBase) { - dam = modifyUserHitDamage(dam, (EntityLivingBase) hitter, source, hitter == source, hit, properHit); - } - if (src.isExplosion() && isSkeleton(hit)) { - dam *= 5F; - } - - // TODO: Elemental resistance - dam *= TacticalManager.getResistance(hit, src); - if (src.isFireDamage()) { - if (dam <= 0.0F) { - hit.extinguish(); - } - } - - return onUserHit(hit, hitter, src, dam, properHit); - } - - private boolean isSkeleton(Entity target) { - return target instanceof EntitySkeleton; - } - - // TODO: damage modifier - private float modifyUserHitDamage(float dam, EntityLivingBase user, Entity source, boolean melee, Entity target, - boolean properHit) { - dam = modifyMobDamage(user, dam); - String special = "standard"; - // Power Attack - if (melee) { - int powerAttack = initPowerAttack(user, target, properHit); - if (powerAttack == 1) { - dam *= (2F / 1.5F); - onPowerAttack(dam, user, target, properHit); - - if (isSkeleton(target)) { - dam *= 1.5F; - if (properHit) { - if (MineFantasyII.random.nextInt(2) == 0) { - target.entityDropItem(new ItemStack(Items.bone), 0.5F); - } - } - } - } - if (powerAttack == -1) { - dam /= 2F; - } - } else { - String arrowDesign = source.getEntityData().getString("Design"); - if (arrowDesign != null && arrowDesign.length() > 0) { - special = arrowDesign; - } - } - if (user instanceof EntityLivingBase) { - EntityLivingBase player = user; - - // TODO: Stamina Traits - if (StaminaBar.isSystemActive) { - if (StaminaBar.getStaminaValue(player) <= 0) { - dam *= ConfigStamina.weaponDrain; - } - } - } - if (user.hurtResistantTime > 12) { - dam *= 0.5F; - } - - ItemStack weapon = user.getHeldItem(); - if (weapon != null) { - if (weapon.getItem() instanceof IDamageModifier) { - // TODO: IDamageModifier, this mods the damage for weapons - dam = ((IDamageModifier) weapon.getItem()).modifyDamage(weapon, user, target, dam, properHit); - } - CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(weapon); - String weaponType = CustomToolHelper.getCustomStyle(weapon); - dam *= getSpecialModifier(material, weaponType, target, true); - } - return dam; - } - - private void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit) { - ItemStack weapon = user.getHeldItem(); - int ticks = 20; - if (weapon != null && weapon.getItem() instanceof IPowerAttack) { - ((IPowerAttack) weapon.getItem()).onPowerAttack(dam, user, target, properHit); - ticks = ((IPowerAttack) weapon.getItem()).getParryModifier(weapon, user, target); - } - if (target instanceof EntityLivingBase) { - if (ticks > getParryCooldown((EntityLivingBase) target)) { - setParryCooldown((EntityLivingBase) target, ticks); - } - } - if (!user.worldObj.isRemote) { - user.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 20, 5)); - user.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20, 10)); - } - if (user instanceof EntityPlayer) { - TacticalManager.lungeEntity(user, target, 0.5F, 0F); - TacticalManager.throwPlayerOffBalance((EntityPlayer) user, 0.5F, true); - } - - target.worldObj.playSoundAtEntity(target, "minefantasy2:weapon.critical", 1.0F, 1.0F); - } - - private static final float power_attack_base = 25F; - - /** - * 0 = false 1 = true -1 = failure - */ - private static int initPowerAttack(EntityLivingBase user, Entity target, boolean properHit) { - if (!canExecutePower(user)) { - return 0; - } - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user)) { - float points = power_attack_base * (StaminaBar.getBaseDecayModifier(user, true, true) * 0.5F + 0.5F); - if (StaminaBar.isStaminaAvailable(user, points, properHit)) { - if (properHit) { - ItemWeaponMF.applyFatigue(user, points); - } - return getPostHitCooldown(user) > 0 ? -1 : 1; - } else { - return 0; - } - } - return 1; - } - - private static boolean canExecutePower(EntityLivingBase user) { - if (user.isInWater()) { - return false; - } - if (user instanceof EntityPlayer) { - if (!isFightStance(user)) - return false; - } - return user.fallDistance > 0 && !user.isOnLadder(); - } - - private static boolean isFightStance(EntityLivingBase user) { - return user.isSneaking(); - } - - private float modifyMobDamage(EntityLivingBase user, float dam) { - if (user instanceof EntityZombie && user.isChild()) { - dam *= 0.65F; - } - return dam + getStrengthEnhancement(user); - } - - public static void applyUndeadBane(EntityLivingBase living) { - living.playSound("random.fizz", 0.5F, 0.5F); - living.addPotionEffect(new PotionEffect(Potion.weakness.id, 1200, 2)); - living.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 1200, 2)); - if (MineFantasyII.random.nextInt(5) == 0) { - living.setFire(3); - } - } - - private void onOfficialHit(DamageSource src, EntityLivingBase target, float damage) { - Entity source = src.getSourceOfDamage(); - Entity hitter = src.getEntity(); - - if (source != null && hitter != null && hitter instanceof EntityLivingBase) { - if (source == hitter) { - EntityLivingBase user = (EntityLivingBase) hitter; - ItemStack weapon = user.getHeldItem(); - if (weapon != null) { - onWeaponHit(user, weapon, target, damage); - } - if (RPGElements.isSystemActive && user instanceof EntityPlayer && !user.worldObj.isRemote) { - SkillList.combat.addXP((EntityPlayer) user, (int) (damage / 5F)); - } - } else { - if (source instanceof EntityArrow && src.isProjectile()) { - onArrowHit(source, target, hitter, damage); - } - } - } - CombatMechanics.setPostHitCooldown(target, 10); - } - - private void onWeaponHit(EntityLivingBase user, ItemStack weapon, Entity target, float dam) { - if (target instanceof EntityLivingBase && weapon.getItem() instanceof ISpecialEffect) { - ((ISpecialEffect) weapon.getItem()).onProperHit(user, weapon, target, dam); - } - - if (weapon.getItem() instanceof IWeaponSpeed) { - target.hurtResistantTime += ((IWeaponSpeed) weapon.getItem()).modifyHitTime(user, weapon); - } - if (weapon.getItem() instanceof IKnockbackWeapon) { - float kb = ((IKnockbackWeapon) weapon.getItem()).getAddedKnockback(user, weapon); - - if (kb > 0) { - TacticalManager.knockbackEntity(target, user, kb, 0F); - } - } - if (ConfigWeapon.useBalance && user instanceof EntityPlayer) { - applyBalance((EntityPlayer) user); - } - } - - private void onArrowHit(Entity arrow, Entity target, Entity shooter, float damage) { + } + + private void onFall(EntityLivingBase fallen, float height) { + float weight = ArmourCalculator.getTotalWeightOfWorn(fallen, false); + if (weight > 100) { + weight -= 100F; + float power = (height / 4F) * (weight / 100F); + newShockwave(fallen, fallen.posX, fallen.posY, fallen.posZ, power, false, true); + } + } + + public Shockwave newShockwave(Entity source, double x, double y, double z, float power, boolean fire, + boolean smoke) { + Shockwave explosion = new Shockwave("humanstomp", source.worldObj, source, x, y, z, power); + explosion.isFlaming = fire; + explosion.isSmoking = smoke; + explosion.initiate(); + explosion.decorateWave(true); + return explosion; + } + + private float modifyDamage(DamageSource src, World world, EntityLivingBase hit, float dam, boolean properHit) { + Entity source = src.getSourceOfDamage(); + Entity hitter = src.getEntity(); + + if (PowerArmour.allowDamageToBlock(src)) { + dam = PowerArmour.modifyDamage(hit, dam, src); + } + + if (properHit && hit instanceof EntityPlayer) { + dam = modifyPlayerDamage((EntityPlayer) hit, dam); + } + + if (source != null && hitter != null && hitter instanceof EntityLivingBase) { + dam = modifyUserHitDamage(dam, (EntityLivingBase) hitter, source, hitter == source, hit, properHit); + } + if (src.isExplosion() && isSkeleton(hit)) { + dam *= 5F; + } + + // TODO: Elemental resistance + dam *= TacticalManager.getResistance(hit, src); + if (src.isFireDamage()) { + if (dam <= 0.0F) { + hit.extinguish(); + } + } + + return onUserHit(hit, hitter, src, dam, properHit); + } + + private boolean isSkeleton(Entity target) { + return target instanceof EntitySkeleton; + } + + // TODO: damage modifier + private float modifyUserHitDamage(float dam, EntityLivingBase user, Entity source, boolean melee, Entity target, + boolean properHit) { + dam = modifyMobDamage(user, dam); + String special = "standard"; + // Power Attack + if (melee) { + int powerAttack = initPowerAttack(user, target, properHit); + if (powerAttack == 1) { + dam *= (2F / 1.5F); + onPowerAttack(dam, user, target, properHit); + + if (isSkeleton(target)) { + dam *= 1.5F; + if (properHit) { + if (MineFantasyII.random.nextInt(2) == 0) { + target.entityDropItem(new ItemStack(Items.bone), 0.5F); + } + } + } + } + if (powerAttack == -1) { + dam /= 2F; + } + } else { + String arrowDesign = source.getEntityData().getString("Design"); + if (arrowDesign != null && arrowDesign.length() > 0) { + special = arrowDesign; + } + } + if (user instanceof EntityLivingBase) { + EntityLivingBase player = user; + + // TODO: Stamina Traits + if (StaminaBar.isSystemActive) { + if (StaminaBar.getStaminaValue(player) <= 0) { + dam *= ConfigStamina.weaponDrain; + } + } + } + if (user.hurtResistantTime > 12) { + dam *= 0.5F; + } + + ItemStack weapon = user.getHeldItem(); + if (weapon != null) { + if (weapon.getItem() instanceof IDamageModifier) { + // TODO: IDamageModifier, this mods the damage for weapons + dam = ((IDamageModifier) weapon.getItem()).modifyDamage(weapon, user, target, dam, properHit); + } + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(weapon); + String weaponType = CustomToolHelper.getCustomStyle(weapon); + dam *= getSpecialModifier(material, weaponType, target, true); + } + return dam; + } + + private void onPowerAttack(float dam, EntityLivingBase user, Entity target, boolean properHit) { + ItemStack weapon = user.getHeldItem(); + int ticks = 20; + if (weapon != null && weapon.getItem() instanceof IPowerAttack) { + ((IPowerAttack) weapon.getItem()).onPowerAttack(dam, user, target, properHit); + ticks = ((IPowerAttack) weapon.getItem()).getParryModifier(weapon, user, target); + } + if (target instanceof EntityLivingBase) { + if (ticks > getParryCooldown((EntityLivingBase) target)) { + setParryCooldown((EntityLivingBase) target, ticks); + } + } + if (!user.worldObj.isRemote) { + user.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 20, 5)); + user.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20, 10)); + } + if (user instanceof EntityPlayer) { + TacticalManager.lungeEntity(user, target, 0.5F, 0F); + TacticalManager.throwPlayerOffBalance((EntityPlayer) user, 0.5F, true); + } + + target.worldObj.playSoundAtEntity(target, "minefantasy2:weapon.critical", 1.0F, 1.0F); + } + + private float modifyMobDamage(EntityLivingBase user, float dam) { + if (user instanceof EntityZombie && user.isChild()) { + dam *= 0.65F; + } + return dam + getStrengthEnhancement(user); + } + + private void onOfficialHit(DamageSource src, EntityLivingBase target, float damage) { + Entity source = src.getSourceOfDamage(); + Entity hitter = src.getEntity(); + + if (source != null && hitter != null && hitter instanceof EntityLivingBase) { + if (source == hitter) { + EntityLivingBase user = (EntityLivingBase) hitter; + ItemStack weapon = user.getHeldItem(); + if (weapon != null) { + onWeaponHit(user, weapon, target, damage); + } + if (RPGElements.isSystemActive && user instanceof EntityPlayer && !user.worldObj.isRemote) { + SkillList.combat.addXP((EntityPlayer) user, (int) (damage / 5F)); + } + } else { + if (source instanceof EntityArrow && src.isProjectile()) { + onArrowHit(source, target, hitter, damage); + } + } + } + CombatMechanics.setPostHitCooldown(target, 10); + } + + private void onWeaponHit(EntityLivingBase user, ItemStack weapon, Entity target, float dam) { + if (target instanceof EntityLivingBase && weapon.getItem() instanceof ISpecialEffect) { + ((ISpecialEffect) weapon.getItem()).onProperHit(user, weapon, target, dam); + } + + if (weapon.getItem() instanceof IWeaponSpeed) { + target.hurtResistantTime += ((IWeaponSpeed) weapon.getItem()).modifyHitTime(user, weapon); + } + if (weapon.getItem() instanceof IKnockbackWeapon) { + float kb = ((IKnockbackWeapon) weapon.getItem()).getAddedKnockback(user, weapon); + + if (kb > 0) { + TacticalManager.knockbackEntity(target, user, kb, 0F); + } + } + if (ConfigWeapon.useBalance && user instanceof EntityPlayer) { + applyBalance((EntityPlayer) user); + } + } + + private void onArrowHit(Entity arrow, Entity target, Entity shooter, float damage) { /* * if(RPGElements.isSystemActive && shooter instanceof EntityPlayer) { * SkillList.archery.addXP((EntityPlayer) shooter, (int)damage); } */ - } - - protected static void performEffects(Map map, EntityLivingBase entityHit) { - double roll = Math.random(); - if (map == null || map.isEmpty()) { - return; - } - - for (PotionEffect effect : map.keySet()) { - // add effects if they aren't already applied, with corresponding chance factor - if (!entityHit.isPotionActive(effect.getPotionID()) && map.get(effect) > roll) { - entityHit.addPotionEffect(new PotionEffect(effect)); - } - } - } - - private static boolean debugParry = true; - private static final float parryFatigue = 5F; - - private float onUserHit(EntityLivingBase user, Entity entityHitting, DamageSource source, float dam, - boolean properHit) { - ItemStack weapon = user.getHeldItem(); - if ((properHit || source.isProjectile()) && weapon != null && !source.isUnblockable() - && !source.isExplosion()) { - float threshold = 10;// DEFAULT PARRY THRESHOLD - float weaponFatigue = 2.0F;// DEFAULT FATIGUE - int ticks = 18;// DEFAULT TICKS - IParryable parry = null; - - if (weapon.getItem() instanceof IParryable) { - parry = (IParryable) weapon.getItem(); - - ticks = parry.getParryCooldown(source, dam, weapon); - threshold = parry.getMaxDamageParry(user, weapon); - weaponFatigue = parry.getParryStaminaDecay(source, weapon); - } - if (StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(user, false)) { - threshold /= 2; - } - threshold *= TacticalManager.getHighgroundModifier(user, entityHitting, 1.15F); - - if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { - threshold = ArmourCalculator.adjustACForDamage(source, threshold, 1.0F, 0.75F, 0.5F); - } - - if (debugParry && !user.worldObj.isRemote) { - MFLogUtil.logDebug("Init Parry: Damage = " + dam + " Threshold = " + threshold); - } - - // USED FOR PARRYING its harder to block arrows - if (TacticalManager.canParry(source, user, entityHitting, weapon)) { - float previousDam = dam; - dam = Math.max(0F, dam - threshold); - - if (properHit || dam <= 0) { - user.hurtResistantTime = user.maxHurtResistantTime; - user.hurtTime = 0; - - int result = onParry(source, user, entityHitting, dam, previousDam, parry); - - if (result == 1) { - dam = 0; - } - ticks = ArmourCalculator.modifyParryCooldown(user, ticks); - - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) - && !StaminaBar.isAnyStamina(user, false)) { - ticks *= 3; - } - if (ticks > getParryCooldown(user)) { - setParryCooldown(user, ticks); - } - - ItemWeaponMF.applyFatigue(user, TacticalManager.getHighgroundModifier(user, entityHitting, 2.0F) - * (dam + 1F) * parryFatigue * weaponFatigue); - if (parry == null) { - user.worldObj.playSoundAtEntity(user, getDefaultParrySound(weapon), 1.0F, - 1.25F + (MineFantasyII.random.nextFloat() * 0.5F)); - } else if (!parry.playCustomParrySound(user, entityHitting, weapon)) { - user.worldObj.playSoundAtEntity(user, "mob.zombie.metal", 1.0F, - 1.25F + (MineFantasyII.random.nextFloat() * 0.5F)); - } - if (user instanceof EntityPlayer) { - ((EntityPlayer) user).stopUsingItem(); - ItemWeaponMF.setParry(weapon, 20); - } - - if (entityHitting != null && entityHitting instanceof EntityLivingBase) { - EntityLivingBase hitter = (EntityLivingBase) entityHitting; - int hitTime = 5; - if (hitter.getHeldItem() != null) { - ItemStack attackingWep = hitter.getHeldItem(); - if (attackingWep.getItem() instanceof IWeaponSpeed) { - hitTime += ((IWeaponSpeed) attackingWep.getItem()).modifyHitTime(hitter, weapon); - } - } - if (hitTime > 0) { - MFLogUtil.logDebug("Recoil hitter: " + hitter.getCommandSenderName() + " for " + hitTime * 3 - + " ticks."); - EventManagerMF.setHitTime(hitter, hitTime * 3); - } - } - } - } - } - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) && !StaminaBar.isAnyStamina(user, false)) { - dam *= Math.max(1.0F, ConfigStamina.exhaustDamage); - } - - // Fire dura degrade - if (properHit && source.isFireDamage() && dam > 0) { - for (int a = 0; a < 4; a++) { - ItemStack armour = user.getEquipmentInSlot(a + 1); - if (armour != null) { - int dura = (int) (dam) + 1; - if (!user.worldObj.isRemote && !isArmourFireImmune(armour, source)) { - MFLogUtil.logDebug("Armour Flame Damage: " + dura); - if (armour.getItemDamage() + dura < armour.getMaxDamage()) { - armour.damageItem(dura, user); - } else { - armour.setItemDamage(armour.getMaxDamage()); - } - } - if (armour.getItemDamage() >= armour.getMaxDamage()) { - user.setCurrentItemOrArmor(a + 1, null); - user.worldObj.playSoundEffect(user.posX, user.posY + user.getEyeHeight() - (0.4F * a), - user.posZ, "random.break", 1.0F, 1.0F); - } - } - } - } - - if (dam > 0 && user instanceof EntityPlayer - || (entityHitting != null && entityHitting instanceof EntityPlayer)) { - if (!user.worldObj.isRemote) { - String type = "Mixed"; - float[] f = ArmourCalculator.getRatioForSource(source); - if (f == null) { - type = "Basic"; - } else { - if (f[0] > f[1] && f[0] > f[2]) - type = "Cutting"; - if (f[2] > f[1] && f[2] > f[0]) - type = "Piercing"; - if (f[1] > f[0] && f[1] > f[2]) - type = "Blunt"; - } - - MFLogUtil.logDebug(dam + "x " + type + " Damage inflicted to: " + user.getCommandSenderName() + " (" - + user.getEntityId() + ")"); - } - } - return dam; - } - - private boolean isArmourFireImmune(ItemStack armour, DamageSource src) { - if (armour != null && armour.getItem() instanceof IElementalResistance) { - return ((IElementalResistance) armour.getItem()).getFireResistance(armour, src) >= 100F; - } - return false; - } - - private String getDefaultParrySound(ItemStack weapon) { - if (weapon.getUnlocalizedName().contains("wood") || weapon.getUnlocalizedName().contains("Wood") - || weapon.getUnlocalizedName().contains("stone") || weapon.getUnlocalizedName().contains("Stone")) { - return "minefantasy2:weapon.wood_parry"; - } - return "mob.zombie.metal"; - } - - /** - * @return 0 for normal parry and 1 for evade - */ - private int onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam, float prevDam, - IParryable parry) { + } + + private float onUserHit(EntityLivingBase user, Entity entityHitting, DamageSource source, float dam, + boolean properHit) { + ItemStack weapon = user.getHeldItem(); + if ((properHit || source.isProjectile()) && weapon != null && !source.isUnblockable() + && !source.isExplosion()) { + float threshold = 10;// DEFAULT PARRY THRESHOLD + float weaponFatigue = 2.0F;// DEFAULT FATIGUE + int ticks = 18;// DEFAULT TICKS + IParryable parry = null; + + if (weapon.getItem() instanceof IParryable) { + parry = (IParryable) weapon.getItem(); + + ticks = parry.getParryCooldown(source, dam, weapon); + threshold = parry.getMaxDamageParry(user, weapon); + weaponFatigue = parry.getParryStaminaDecay(source, weapon); + } + if (StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(user, false)) { + threshold /= 2; + } + threshold *= TacticalManager.getHighgroundModifier(user, entityHitting, 1.15F); + + if (ArmourCalculator.advancedDamageTypes && !user.worldObj.isRemote) { + threshold = ArmourCalculator.adjustACForDamage(source, threshold, 1.0F, 0.75F, 0.5F); + } + + if (debugParry && !user.worldObj.isRemote) { + MFLogUtil.logDebug("Init Parry: Damage = " + dam + " Threshold = " + threshold); + } + + // USED FOR PARRYING its harder to block arrows + if (TacticalManager.canParry(source, user, entityHitting, weapon)) { + float previousDam = dam; + dam = Math.max(0F, dam - threshold); + + if (properHit || dam <= 0) { + user.hurtResistantTime = user.maxHurtResistantTime; + user.hurtTime = 0; + + int result = onParry(source, user, entityHitting, dam, previousDam, parry); + + if (result == 1) { + dam = 0; + } + ticks = ArmourCalculator.modifyParryCooldown(user, ticks); + + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) + && !StaminaBar.isAnyStamina(user, false)) { + ticks *= 3; + } + if (ticks > getParryCooldown(user)) { + setParryCooldown(user, ticks); + } + + ItemWeaponMF.applyFatigue(user, TacticalManager.getHighgroundModifier(user, entityHitting, 2.0F) + * (dam + 1F) * parryFatigue * weaponFatigue); + if (parry == null) { + user.worldObj.playSoundAtEntity(user, getDefaultParrySound(weapon), 1.0F, + 1.25F + (MineFantasyII.random.nextFloat() * 0.5F)); + } else if (!parry.playCustomParrySound(user, entityHitting, weapon)) { + user.worldObj.playSoundAtEntity(user, "mob.zombie.metal", 1.0F, + 1.25F + (MineFantasyII.random.nextFloat() * 0.5F)); + } + if (user instanceof EntityPlayer) { + ((EntityPlayer) user).stopUsingItem(); + ItemWeaponMF.setParry(weapon, 20); + } + + if (entityHitting != null && entityHitting instanceof EntityLivingBase) { + EntityLivingBase hitter = (EntityLivingBase) entityHitting; + int hitTime = 5; + if (hitter.getHeldItem() != null) { + ItemStack attackingWep = hitter.getHeldItem(); + if (attackingWep.getItem() instanceof IWeaponSpeed) { + hitTime += ((IWeaponSpeed) attackingWep.getItem()).modifyHitTime(hitter, weapon); + } + } + if (hitTime > 0) { + MFLogUtil.logDebug("Recoil hitter: " + hitter.getCommandSenderName() + " for " + hitTime * 3 + + " ticks."); + EventManagerMF.setHitTime(hitter, hitTime * 3); + } + } + } + } + } + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user) && !StaminaBar.isAnyStamina(user, false)) { + dam *= Math.max(1.0F, ConfigStamina.exhaustDamage); + } + + // Fire dura degrade + if (properHit && source.isFireDamage() && dam > 0) { + for (int a = 0; a < 4; a++) { + ItemStack armour = user.getEquipmentInSlot(a + 1); + if (armour != null) { + int dura = (int) (dam) + 1; + if (!user.worldObj.isRemote && !isArmourFireImmune(armour, source)) { + MFLogUtil.logDebug("Armour Flame Damage: " + dura); + if (armour.getItemDamage() + dura < armour.getMaxDamage()) { + armour.damageItem(dura, user); + } else { + armour.setItemDamage(armour.getMaxDamage()); + } + } + if (armour.getItemDamage() >= armour.getMaxDamage()) { + user.setCurrentItemOrArmor(a + 1, null); + user.worldObj.playSoundEffect(user.posX, user.posY + user.getEyeHeight() - (0.4F * a), + user.posZ, "random.break", 1.0F, 1.0F); + } + } + } + } + + if (dam > 0 && user instanceof EntityPlayer + || (entityHitting != null && entityHitting instanceof EntityPlayer)) { + if (!user.worldObj.isRemote) { + String type = "Mixed"; + float[] f = ArmourCalculator.getRatioForSource(source); + if (f == null) { + type = "Basic"; + } else { + if (f[0] > f[1] && f[0] > f[2]) + type = "Cutting"; + if (f[2] > f[1] && f[2] > f[0]) + type = "Piercing"; + if (f[1] > f[0] && f[1] > f[2]) + type = "Blunt"; + } + + MFLogUtil.logDebug(dam + "x " + type + " Damage inflicted to: " + user.getCommandSenderName() + " (" + + user.getEntityId() + ")"); + } + } + return dam; + } + + private boolean isArmourFireImmune(ItemStack armour, DamageSource src) { + if (armour != null && armour.getItem() instanceof IElementalResistance) { + return ((IElementalResistance) armour.getItem()).getFireResistance(armour, src) >= 100F; + } + return false; + } + + private String getDefaultParrySound(ItemStack weapon) { + if (weapon.getUnlocalizedName().contains("wood") || weapon.getUnlocalizedName().contains("Wood") + || weapon.getUnlocalizedName().contains("stone") || weapon.getUnlocalizedName().contains("Stone")) { + return "minefantasy2:weapon.wood_parry"; + } + return "mob.zombie.metal"; + } + + /** + * @return 0 for normal parry and 1 for evade + */ + private int onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam, float prevDam, + IParryable parry) { /* * if(RPGElements.isSystemActive && user instanceof EntityPlayer) { * SkillList.block.addXP((EntityPlayer)user, 10 + (int)prevDam*2); } */ - if (RPGElements.isSystemActive && user instanceof EntityPlayer) { - SkillList.combat.addXP((EntityPlayer) user, (int) (prevDam / 3F)); - } - if (parry != null) { - parry.onParry(source, user, attacker, dam); - } - if (user instanceof ISpecialCombatMob) { - ((ISpecialCombatMob) user).onParry(source, attacker, dam); - } - - boolean groundBlock = user.onGround; - ItemStack weapon = user.getHeldItem(); - - // Redirect - if (!user.worldObj.isRemote && !TacticalManager.isRanged(source)) { - if (canEvade(user)) { - float powerMod = attacker.isSprinting() ? 4.0F : 2.5F; - - attacker.setSprinting(false); - TacticalManager.lungeEntity(attacker, user, powerMod, 0.0F); - TacticalManager.lungeEntity(user, attacker, 3F, 0.0F); - return 1; - } - } - return 0; - } - - /** - * Determines if an evade can be made (jump or normal) - */ - private boolean canEvade(EntityLivingBase user) { - float stamModifier = 1.0F; - if (user instanceof EntityPlayer) { - if (!ResearchLogic.hasInfoUnlocked((EntityPlayer) user, "parrypro")) { - return false; - } - - if (!isFightStance(user)) { - return false; - } - } else { - if (MineFantasyII.random.nextInt(10) != 0)// Mobs can evade - { - return false; - } - } - - if (!user.onGround && !tryJumpEvade(user, stamModifier)) { - return false; - } - return tryGroundEvade(user, stamModifier); - } - - /** - * If the player can slip past enemies Should be any armour but heavy - */ - private boolean tryGroundEvade(EntityLivingBase user, float cost) { - return ItemWeaponMF.tryPerformAbility(user, evade_cost * cost, true, false); - } - - /** - * If the player can jump over enemies in evading Only ment for - * unarmoured/Lightarmour - */ - private boolean tryJumpEvade(EntityLivingBase user, float cost) { - return ItemWeaponMF.tryPerformAbility(user, jumpEvade_cost * cost, true, false); - } - - @SubscribeEvent - public void updateLiving(LivingUpdateEvent event) { - EntityLivingBase living = event.entityLiving; - - tickParryCooldown(living); - tickPostHitCooldown(living); - if (living instanceof EntityLiving) { - EntityLiving mob = (EntityLiving) living; - ItemStack held = mob.getHeldItem(); - - { - EntityLivingBase tar = mob.getAttackTarget(); - - if (tar != null && tar instanceof EntityPlayer && ((EntityPlayer) tar).isBlocking()) { - double dist = mob.getDistanceSqToEntity(tar); - - if (tar instanceof EntityZombie && mob.onGround && mob.getRNG().nextInt(10) == 0 && dist > 1D - && dist < 4D) { - mob.motionY = 0.5F; - } - } - } - if (isAxe(held)) { - EntityLivingBase tar = mob.getAttackTarget(); - - if (tar != null) { - double dist = mob.getDistanceSqToEntity(tar); - - if (mob.onGround && mob.getRNG().nextInt(5) == 0 && dist > 1D && dist < 4.0D) { - mob.motionY = 0.5F; - } - } - if (mob.getRNG().nextInt(100) == 0 && !mob.isSprinting() && !mob.isChild()) { - mob.setSprinting(true); - } - } - if (isFastblade(held)) { - EntityLivingBase tar = mob.getAttackTarget(); - - if (tar != null) { - double dist = mob.getDistanceSqToEntity(tar); - - if (mob.onGround && mob.getRNG().nextInt(20) == 0 && dist > 1D && dist < 4.0D) { - mob.motionY = 0.5F; - } - } - if (mob.getRNG().nextInt(20) == 0 && !mob.isSprinting() && !mob.isChild()) { - mob.setSprinting(true); - } - } - if (living.isBurning() && !living.isImmuneToFire()) { - panic(living, 0.25F, 5); - } - } - } - - private boolean isAxe(ItemStack held) { - return held != null && held.getItem() instanceof ItemWaraxeMF - || held != null && held.getItem() instanceof ItemBattleaxeMF; - } - - private boolean isFastblade(ItemStack held) { - return held != null && held.getItem() instanceof ItemDagger - || held != null && held.getItem() instanceof ItemKatanaMF; - } - - private void applyBalance(EntityPlayer entityPlayer) { - MFLogUtil.logDebug("Weapon Balance Init"); - ItemStack weapon = entityPlayer.getHeldItem(); - float balance = 0.0F; - - if (weapon != null && weapon.getItem() instanceof IWeightedWeapon) { - balance = ((IWeightedWeapon) weapon.getItem()).getBalance(entityPlayer); - } - - if (ConfigWeapon.useBalance && balance > 0 && entityPlayer != null) { - TacticalManager.throwPlayerOffBalance(entityPlayer, balance, true); - } - } - - public static void setParryCooldown(EntityLivingBase user, int ticks) { - user.getEntityData().setInteger(parryCooldownNBT, ticks); - - if (!user.worldObj.isRemote && user instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) user; - ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, - new ParryPacket(ticks, player).generatePacket()); - } - } - - public static int getParryCooldown(EntityLivingBase user) { - if (user.getEntityData().hasKey(parryCooldownNBT)) { - return user.getEntityData().getInteger(parryCooldownNBT); - } - return 0; - } - - public static void tickParryCooldown(EntityLivingBase user) { - int ticks = getParryCooldown(user); - if (ticks > 0) { - setParryCooldown(user, ticks - 1); - } - } - - public static boolean isParryAvailable(EntityLivingBase user) { - return getParryCooldown(user) <= 0; - } - - public static void setPostHitCooldown(EntityLivingBase user, int ticks) { - user.getEntityData().setInteger(posthitCooldownNBT, ticks); - } - - public static int getPostHitCooldown(EntityLivingBase user) { - if (user.getEntityData().hasKey(posthitCooldownNBT)) { - return user.getEntityData().getInteger(posthitCooldownNBT); - } - return 0; - } - - public static void tickPostHitCooldown(EntityLivingBase user) { - int ticks = getPostHitCooldown(user); - if (ticks > 0) { - setPostHitCooldown(user, ticks - 1); - } - } - - @SubscribeEvent - public void jump(LivingJumpEvent event) { - if (event.entityLiving instanceof EntityPlayer) { - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(event.entityLiving)) { - StaminaMechanics.onJump(event.entityLiving); - } - } - if (event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityPlayer) { - tryDodge((EntityPlayer) event.entityLiving); - } - } - - private void tryDodge(EntityPlayer user) { - if (user.isBlocking()) { - float forward = user.moveForward; - float side = user.moveStrafing; - - if (side > 0F)// LEFT - { - commandDodge(user, 1); - } else if (side < 0)// RIGHT - { - commandDodge(user, -1); - } else if (forward < 0)// BACK - { - commandDodge(user, 0); - } - } - } - - /** - * Client-sided dodge - */ - private static void commandDodge(EntityPlayer user, int type) { - initDodge(user, type); - ((EntityClientPlayerMP) user).sendQueue.addToSendQueue(new DodgeCommand(user, type).generatePacket()); - } - - public static void initDodge(EntityPlayer user, int type) { - float bulk = ArmourCalculator.getTotalBulk(user); - int cost = (int) ((type == 0 ? 15 : 10) * (bulk + 1));// Medium armour cost 2x more - - if (bulk <= 1.0F && ItemWeaponMF.tryPerformAbility(user, cost)) { - float force = 1.0F - (bulk * 0.25F);// Medium armour gives 75% - - float direction = user.rotationYaw; - if (type == 0) - direction += 180;// BACK - if (type == 1) - direction -= 90;// LEFT - if (type == -1) - direction += 90;// RIGHT - TacticalManager.leap(user, direction, force, 0.0F); - } - } - - /* - * Causes the victim to 'Spaz out' which never stops being funny (Apply every - * tick) - */ - public static void panic(EntityLivingBase victim, float speed, int directionTimer) { - if (!shouldPanic(victim)) { - return; - } - double moveX = victim.getEntityData().getDouble("MF2_PanicX"); - double moveZ = victim.getEntityData().getDouble("MF2_PanicZ"); - victim.setJumping(true); - - if ((moveX == 0 && moveZ == 0) || MineFantasyII.random.nextInt(directionTimer) == 0) { - moveX = (MineFantasyII.random.nextDouble() - 0.5D) * 0.85D * speed; - moveZ = (MineFantasyII.random.nextDouble() - 0.5D) * 0.85D * speed; - - victim.getEntityData().setDouble("MF2_PanicX", moveX); - victim.getEntityData().setDouble("MF2_PanicZ", moveZ); - if (victim.onGround) - victim.motionY = 0.25F; - victim.rotationYaw = (float) (Math.atan2(moveX, moveZ)); - } - victim.swingItem(); - victim.limbSwing = 1.0F; - victim.moveEntity(moveX, 0D, moveZ); - } - - private static boolean shouldPanic(EntityLivingBase victim) { - if (victim instanceof EntityMinotaur) { - return ((EntityMinotaur) victim).getRageLevel() < 80; - } - return !(victim instanceof EntityPlayer || victim instanceof EntityCogwork); - } - - private float modifyPlayerDamage(EntityPlayer hit, float dam) { - if (ResearchLogic.hasInfoUnlocked(hit, KnowledgeListMF.toughness)) { - dam *= 0.9F;// 10% Resist - } - return dam; - } - - /** - * How much strength is added (directly adds to melee dmg) - */ - public static float getStrengthEnhancement(EntityLivingBase user) { - float mod = 0F; - if (PowerArmour.isPowered(user)) { - mod += 3F; - } - return Math.max(-0.5F, mod); - } - - public static float getSpecialModifier(CustomMaterial material, String design, Entity target, boolean addEffect) { - if (target == null) - return 1.0F; - - float modifier = 1.0F; - - if (design != null) { - if (design.equalsIgnoreCase("dragonforged")) { - if (TacticalManager.isDragon(target)) { - modifier *= specialDragonModifier; - } - } - - if (design.equalsIgnoreCase("ornate")) { - if (TacticalManager.isUnholyCreature(target)) { - modifier *= specialOrnateModifier; - } - } - } - - if (material != null) { - if (isSilverishMaterial(material.name) && target instanceof EntityLivingBase) { - if (target.getClass().getName().contains("Werewolf")) { - modifier *= specialWerewolfModifier; - applyUndeadBane((EntityLivingBase) target); - } else if (TacticalManager.isUnholyCreature(target)) { - modifier *= specialUnholyModifier; - applyUndeadBane((EntityLivingBase) target); - } - } - } - - return modifier; - } - - public static boolean isSilverishMaterial(String material) { - return material.equalsIgnoreCase("silver"); - } + if (RPGElements.isSystemActive && user instanceof EntityPlayer) { + SkillList.combat.addXP((EntityPlayer) user, (int) (prevDam / 3F)); + } + if (parry != null) { + parry.onParry(source, user, attacker, dam); + } + if (user instanceof ISpecialCombatMob) { + ((ISpecialCombatMob) user).onParry(source, attacker, dam); + } + + boolean groundBlock = user.onGround; + ItemStack weapon = user.getHeldItem(); + + // Redirect + if (!user.worldObj.isRemote && !TacticalManager.isRanged(source)) { + if (canEvade(user)) { + float powerMod = attacker.isSprinting() ? 4.0F : 2.5F; + + attacker.setSprinting(false); + TacticalManager.lungeEntity(attacker, user, powerMod, 0.0F); + TacticalManager.lungeEntity(user, attacker, 3F, 0.0F); + return 1; + } + } + return 0; + } + + /** + * Determines if an evade can be made (jump or normal) + */ + private boolean canEvade(EntityLivingBase user) { + float stamModifier = 1.0F; + if (user instanceof EntityPlayer) { + if (!ResearchLogic.hasInfoUnlocked((EntityPlayer) user, "parrypro")) { + return false; + } + + if (!isFightStance(user)) { + return false; + } + } else { + if (MineFantasyII.random.nextInt(10) != 0)// Mobs can evade + { + return false; + } + } + + if (!user.onGround && !tryJumpEvade(user, stamModifier)) { + return false; + } + return tryGroundEvade(user, stamModifier); + } + + /** + * If the player can slip past enemies Should be any armour but heavy + */ + private boolean tryGroundEvade(EntityLivingBase user, float cost) { + return ItemWeaponMF.tryPerformAbility(user, evade_cost * cost, true, false); + } + + /** + * If the player can jump over enemies in evading Only ment for + * unarmoured/Lightarmour + */ + private boolean tryJumpEvade(EntityLivingBase user, float cost) { + return ItemWeaponMF.tryPerformAbility(user, jumpEvade_cost * cost, true, false); + } + + @SubscribeEvent + public void updateLiving(LivingUpdateEvent event) { + EntityLivingBase living = event.entityLiving; + + tickParryCooldown(living); + tickPostHitCooldown(living); + if (living instanceof EntityLiving) { + EntityLiving mob = (EntityLiving) living; + ItemStack held = mob.getHeldItem(); + + { + EntityLivingBase tar = mob.getAttackTarget(); + + if (tar != null && tar instanceof EntityPlayer && ((EntityPlayer) tar).isBlocking()) { + double dist = mob.getDistanceSqToEntity(tar); + + if (tar instanceof EntityZombie && mob.onGround && mob.getRNG().nextInt(10) == 0 && dist > 1D + && dist < 4D) { + mob.motionY = 0.5F; + } + } + } + if (isAxe(held)) { + EntityLivingBase tar = mob.getAttackTarget(); + + if (tar != null) { + double dist = mob.getDistanceSqToEntity(tar); + + if (mob.onGround && mob.getRNG().nextInt(5) == 0 && dist > 1D && dist < 4.0D) { + mob.motionY = 0.5F; + } + } + if (mob.getRNG().nextInt(100) == 0 && !mob.isSprinting() && !mob.isChild()) { + mob.setSprinting(true); + } + } + if (isFastblade(held)) { + EntityLivingBase tar = mob.getAttackTarget(); + + if (tar != null) { + double dist = mob.getDistanceSqToEntity(tar); + + if (mob.onGround && mob.getRNG().nextInt(20) == 0 && dist > 1D && dist < 4.0D) { + mob.motionY = 0.5F; + } + } + if (mob.getRNG().nextInt(20) == 0 && !mob.isSprinting() && !mob.isChild()) { + mob.setSprinting(true); + } + } + if (living.isBurning() && !living.isImmuneToFire()) { + panic(living, 0.25F, 5); + } + } + } + + private boolean isAxe(ItemStack held) { + return held != null && held.getItem() instanceof ItemWaraxeMF + || held != null && held.getItem() instanceof ItemBattleaxeMF; + } + + private boolean isFastblade(ItemStack held) { + return held != null && held.getItem() instanceof ItemDagger + || held != null && held.getItem() instanceof ItemKatanaMF; + } + + private void applyBalance(EntityPlayer entityPlayer) { + MFLogUtil.logDebug("Weapon Balance Init"); + ItemStack weapon = entityPlayer.getHeldItem(); + float balance = 0.0F; + + if (weapon != null && weapon.getItem() instanceof IWeightedWeapon) { + balance = ((IWeightedWeapon) weapon.getItem()).getBalance(entityPlayer); + } + + if (ConfigWeapon.useBalance && balance > 0 && entityPlayer != null) { + TacticalManager.throwPlayerOffBalance(entityPlayer, balance, true); + } + } + + @SubscribeEvent + public void jump(LivingJumpEvent event) { + if (event.entityLiving instanceof EntityPlayer) { + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(event.entityLiving)) { + StaminaMechanics.onJump(event.entityLiving); + } + } + if (event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityPlayer) { + tryDodge((EntityPlayer) event.entityLiving); + } + } + + private void tryDodge(EntityPlayer user) { + if (user.isBlocking()) { + float forward = user.moveForward; + float side = user.moveStrafing; + + if (side > 0F)// LEFT + { + commandDodge(user, 1); + } else if (side < 0)// RIGHT + { + commandDodge(user, -1); + } else if (forward < 0)// BACK + { + commandDodge(user, 0); + } + } + } + + private float modifyPlayerDamage(EntityPlayer hit, float dam) { + if (ResearchLogic.hasInfoUnlocked(hit, KnowledgeListMF.toughness)) { + dam *= 0.9F;// 10% Resist + } + return dam; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index 59fea54d..bce54adf 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -1,9 +1,5 @@ package minefantasy.mf2.mechanics; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -11,16 +7,9 @@ import minefantasy.mf2.api.armour.IPowerArmour; import minefantasy.mf2.api.armour.ISpecialArmourMF; import minefantasy.mf2.api.armour.ItemArmourMFBase; -import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; import minefantasy.mf2.api.heating.IHotItem; import minefantasy.mf2.api.heating.TongsHelper; -import minefantasy.mf2.api.helpers.ArmourCalculator; -import minefantasy.mf2.api.helpers.ArrowEffectsMF; -import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.helpers.EntityHelper; -import minefantasy.mf2.api.helpers.PowerArmour; -import minefantasy.mf2.api.helpers.TacticalManager; -import minefantasy.mf2.api.helpers.ToolHelper; +import minefantasy.mf2.api.helpers.*; import minefantasy.mf2.api.knowledge.ResearchLogic; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.rpg.LevelupEvent; @@ -55,34 +44,17 @@ import net.minecraft.client.gui.inventory.GuiInventory; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.renderer.entity.RenderPlayer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.*; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.EntitySkeleton; import net.minecraft.entity.monster.EntityWitch; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.passive.EntityChicken; -import net.minecraft.entity.passive.EntityCow; -import net.minecraft.entity.passive.EntityHorse; -import net.minecraft.entity.passive.EntityPig; -import net.minecraft.entity.passive.EntitySheep; -import net.minecraft.entity.passive.EntityVillager; -import net.minecraft.entity.passive.EntityWolf; -import net.minecraft.entity.passive.IAnimals; +import net.minecraft.entity.passive.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; -import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemBow; -import net.minecraft.item.ItemFood; -import net.minecraft.item.ItemStack; +import net.minecraft.item.*; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; @@ -97,858 +69,855 @@ import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingDropsEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; -import net.minecraftforge.event.entity.player.EntityItemPickupEvent; -import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.entity.player.PlayerUseItemEvent; -import net.minecraftforge.event.entity.player.PlayerWakeUpEvent; -import net.minecraftforge.event.entity.player.UseHoeEvent; +import net.minecraftforge.event.entity.player.*; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.event.world.BlockEvent.BreakEvent; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + public class EventManagerMF { - @SubscribeEvent - public void tryDropItems(LivingDropsEvent event) { - EntityLivingBase dropper = event.entityLiving; - - if (dropper instanceof EntityChicken) { - int dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1 * 4); - - for (int a = 0; a < dropCount; a++) { - dropper.entityDropItem(new ItemStack(Items.feather), 0.0F); - } - } - if (dropper.getEntityData().hasKey("MF_LootDrop")) { - int id = dropper.getEntityData().getInteger("MF_LootDrop"); - Item drop = id == 0 ? ToolListMF.loot_sack : id == 1 ? ToolListMF.loot_sack_uc : ToolListMF.loot_sack_rare; - dropper.entityDropItem(new ItemStack(drop), 0.0F); - } - if (dropper instanceof EntityAgeable && dropper.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD) { - if (MineFantasyII.random.nextFloat() * (1 + event.lootingLevel) < 0.05F) { - dropper.entityDropItem(new ItemStack(FoodListMF.guts), 0.0F); - } - } - if (dropper instanceof IAnimals && !(dropper instanceof IMob)) { - if (ConfigHardcore.hunterKnife && !dropper.getEntityData().hasKey("hunterKill")) { - event.setCanceled(true); - return; - } - if (ConfigHardcore.lessHunt) { - alterDrops(dropper, event); - } - } - if (getRegisterName(dropper).contains("Horse")) { - int dropCount = MineFantasyII.random.nextInt(3 + event.lootingLevel); - if (ConfigHardcore.lessHunt) { - dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1); - } - - Item meat = dropper.isBurning() ? FoodListMF.horse_cooked : FoodListMF.horse_raw; - for (int a = 0; a < dropCount; a++) { - dropper.entityDropItem(new ItemStack(meat), 0.0F); - } - } - if (getRegisterName(dropper).contains("Wolf")) { - int dropCount = MineFantasyII.random.nextInt(3 + event.lootingLevel); - if (ConfigHardcore.lessHunt) { - dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1); - } - - Item meat = dropper.isBurning() ? FoodListMF.wolf_cooked : FoodListMF.wolf_raw; - for (int a = 0; a < dropCount; a++) { - dropper.entityDropItem(new ItemStack(meat), 0.0F); - } - } - dropLeather(event.entityLiving, event); - - if (dropper instanceof EntitySkeleton) { - EntitySkeleton skeleton = (EntitySkeleton) dropper; - - if ((skeleton.getHeldItem() == null || !(skeleton.getHeldItem().getItem() instanceof ItemBow)) - && event.drops != null && !event.drops.isEmpty()) { - Iterator list = event.drops.iterator(); - - while (list.hasNext()) { - EntityItem entItem = list.next(); - ItemStack drop = entItem.getEntityItem(); - - if (drop.getItem() == Items.arrow) { - entItem.setDead(); - } - } - } - } - } - - private void dropLeather(EntityLivingBase mob, LivingDropsEvent event) { - boolean dropHide = shouldAnimalDropHide(mob); - Item hide = getHideFor(mob); - - if (event.drops != null && !event.drops.isEmpty()) { - Iterator list = event.drops.iterator(); - - while (list.hasNext()) { - EntityItem entItem = list.next(); - ItemStack drop = entItem.getEntityItem(); - - if (drop.getItem() == Items.leather) { - entItem.setDead(); - dropHide = true; - } - } - } - if (dropHide && hide != null && !(ConfigHardcore.hunterKnife && !mob.getEntityData().hasKey("hunterKill"))) { - mob.entityDropItem(new ItemStack(hide), 0.0F); - } - } - - private Item getHideFor(EntityLivingBase mob) { - Item[] hide = new Item[] { ComponentListMF.rawhideSmall, ComponentListMF.rawhideMedium, - ComponentListMF.rawhideLarge }; - int size = getHideSizeFor(mob); - if (mob.isChild()) { - size--; - } - - if (size <= 0) { - return null; - } - if (size > hide.length) { - size = hide.length; - } - - return hide[size - 1]; - } - - private int getHideSizeFor(EntityLivingBase mob) { - String mobName = mob.getClass().getName(); - if (mobName.endsWith("EntityCow") || mobName.endsWith("EntityHorse")) { - return 3; - } - if (mobName.endsWith("EntitySheep")) { - return 2; - } - if (mobName.endsWith("EntityPig")) { - return 1; - } - - int size = mob.myEntitySize.ordinal() + 1; - if (size <= 1) { - return 0; - } - if (size == 2) { - return 1; - } else if (size <= 4) { - return 2; - } - return 3; - } - - private boolean shouldAnimalDropHide(EntityLivingBase mob) { - String mobName = mob.getClass().getName(); - if (mobName.endsWith("EntityWolf") || mobName.endsWith("EntityPig") || mobName.endsWith("EntitySheep") - || mobName.endsWith("EntityCow") || mobName.endsWith("EntityHorse")) { - return true; - } - if (mob instanceof EntityWolf || mob instanceof EntityCow || mob instanceof EntityPig - || mob instanceof EntitySheep || mob instanceof EntityHorse) { - return true; - } - return false; - } - - @SubscribeEvent - public void onDeath(LivingDeathEvent event) { - if (!event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityDragon && event.source != null - && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer) { - PlayerTickHandlerMF.addDragonKill((EntityPlayer) event.source.getEntity()); - } - if (!event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityPlayer && event.source != null - && event.source.getEntity() != null && event.source.getEntity() instanceof EntityDragon) { - PlayerTickHandlerMF.addDragonEnemyPts((EntityPlayer) event.entityLiving, -1); - } - Entity dropper = event.entity; - - boolean useArrows = true; - try { - Class.forName("minefantasy.mf2.api.helpers.ArrowEffectsMF"); - } catch (Exception e) { - useArrows = false; - } - if (dropper != null && useArrows && ConfigExperiment.stickArrows && !dropper.worldObj.isRemote) { - ArrayList stuckArrows = (ArrayList) ArrowEffectsMF.getStuckArrows(dropper); - if (stuckArrows != null && !stuckArrows.isEmpty()) { - Iterator list = stuckArrows.iterator(); - - while (list.hasNext()) { - ItemStack arrow = (ItemStack) list.next(); - if (arrow != null) { - dropper.entityDropItem(arrow, 0.0F); - } - } - } - } - - } - - @SubscribeEvent - public void spawnEntity(EntityJoinWorldEvent event) { - if (event.entity.isDead) { - return; - } - if (event.entity instanceof EntityItem && !(event.entity instanceof EntityItemUnbreakable)) { - EntityItem eitem = (EntityItem) event.entity; - if (eitem.getEntityItem() != null) { - if (eitem.getEntityItem().hasTagCompound() - && eitem.getEntityItem().getTagCompound().hasKey("Unbreakable")) { - EntityItem newEntity = new EntityItemUnbreakable(event.world, eitem); - event.world.spawnEntityInWorld(newEntity); - eitem.setDead(); - } - if (isDragonforge(eitem.getEntityItem())) { - MFLogUtil.logDebug("Found dragon heart"); - EntityItem newEntity = new EntityItemUnbreakable(event.world, eitem); - event.world.spawnEntityInWorld(newEntity); - eitem.setDead(); - } - } - } - } - - private boolean isDragonforge(ItemStack itemstack) { - return itemstack.getItem() == ComponentListMF.dragon_heart; - } - - public void alterDrops(EntityLivingBase dropper, LivingDropsEvent event) { - ArrayList meats = new ArrayList(); - - if (event.drops != null && !event.drops.isEmpty()) { - Iterator list = event.drops.iterator(); - - while (list.hasNext()) { - EntityItem entItem = list.next(); - ItemStack drop = entItem.getEntityItem(); - boolean dropItem = true; - - if (drop.getItem() instanceof ItemFood) { - entItem.setDead(); - - if (!meats.isEmpty()) { - for (int a = 0; a < meats.size(); a++) { - ItemStack compare = meats.get(a); - if (drop.isItemEqual(compare)) { - dropItem = false; - } - } - } - if (dropItem) { - drop.stackSize = 1; - if (event.lootingLevel > 0) { - drop.stackSize += dropper.getRNG().nextInt(event.lootingLevel + 1); - } - meats.add(drop.copy()); - } - } - } - - for (int a = 0; a < meats.size(); a++) { - ItemStack meat = meats.get(a); - dropper.entityDropItem(meat, 0.0F); - } - } - } - - @SubscribeEvent - public void killEntity(LivingDeathEvent event) { - // killsCount - EntityLivingBase dead = event.entityLiving; - EntityLivingBase hunter = null; - ItemStack weapon = null; - DamageSource source = event.source; - - if (dead instanceof EntityWitch) { - dropBook(dead, 0); - } - if (dead instanceof EntityVillager) { - dropBook(dead, 1); - } - if (dead instanceof EntityZombie) { - dropBook(dead, 2); - } - if (source != null && source.getEntity() != null) { - if (source.getEntity() instanceof EntityLivingBase) { - hunter = (EntityLivingBase) source.getEntity(); - weapon = hunter.getHeldItem(); - if (hunter instanceof EntityPlayer) { - addKill((EntityPlayer) hunter, dead); - } - } - } - if (weapon != null) { - String type = ToolHelper.getCrafterTool(weapon); - if (weapon.getItem() instanceof IHuntingItem) { - if (((IHuntingItem) weapon.getItem()).canRetrieveDrops(weapon)) { - dead.getEntityData().setBoolean("hunterKill", true); - } - } else if (type != null && type.equalsIgnoreCase("knife")) { - dead.getEntityData().setBoolean("hunterKill", true); - } - } - } - - private void dropBook(EntityLivingBase dead, int id) { - if (dead.worldObj.isRemote) - return; - Item book = null; - if (id == 0) { - float chance = MineFantasyII.random.nextFloat(); - if (chance > 0.75F) { - book = ToolListMF.skillbook_engineering; - } else { - book = ToolListMF.skillbook_provisioning; - } - } else if (id == 1 && MineFantasyII.random.nextInt(5) == 0) { - float chance = MineFantasyII.random.nextFloat(); - if (chance > 0.9F) { - book = ToolListMF.skillbook_engineering; - } else if (chance > 0.6F) { - book = ToolListMF.skillbook_artisanry; - } else if (chance > 0.3F) { - book = ToolListMF.skillbook_construction; - } else { - book = ToolListMF.skillbook_provisioning; - } - } else if (id == 2 && MineFantasyII.random.nextInt(25) == 0) { - float chance = MineFantasyII.random.nextFloat(); - if (chance > 0.9F) { - book = ToolListMF.skillbook_engineering; - } else if (chance > 0.6F) { - book = ToolListMF.skillbook_artisanry; - } else if (chance > 0.3F) { - book = ToolListMF.skillbook_construction; - } else { - book = ToolListMF.skillbook_provisioning; - } - } - if (book != null) { - dead.entityDropItem(new ItemStack(book), 0F); - } - } - - private void addKill(EntityPlayer hunter, EntityLivingBase dead) { - addKillTo(hunter, "killsCount"); - if (dead instanceof IMob) { - addKillTo(hunter, "killsCountMob"); - } else if (dead instanceof IAnimals) { - addKillTo(hunter, "killsCountAnimal"); - } - if (dead instanceof EntityPlayer) { - addKillTo(hunter, "killsCountPlayer"); - } - } - - @SubscribeEvent - public void useHoe(UseHoeEvent event) { - Block block = event.world.getBlock(event.x, event.y, event.z); - if (block != Blocks.farmland && FarmingHelper.didHoeFail(event.current, event.world, block == Blocks.grass)) { - event.entityPlayer.swingItem(); - event.world.playAuxSFXAtEntity(event.entityPlayer, 2001, event.x, event.y, event.z, - Block.getIdFromBlock(block) + (event.world.getBlockMetadata(event.x, event.y, event.z) << 12)); - event.setCanceled(true); - } - } - - @SubscribeEvent - public void breakBlock(BreakEvent event) { - // Block block = event.block; - Block base = event.world.getBlock(event.x, event.y - 1, event.z); - // int meta = event.blockMetadata; - - if (base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(event.world, false)) { - event.world.setBlock(event.x, event.y - 1, event.z, Blocks.dirt); - } - - EntityPlayer player = event.getPlayer(); - if (player != null && !player.capabilities.isCreativeMode && !(player instanceof FakePlayer)) { - playerMineBlock(event); - } - } - - public void playerMineBlock(BlockEvent.BreakEvent event) { - EntityPlayer player = event.getPlayer(); - ItemStack held = player.getHeldItem(); - Block broken = event.block; - - if (broken != null && ConfigHardcore.HCCallowRocks) { - if (broken == Blocks.stone && held == null) { - entityDropItem(event.world, event.x, event.y, event.z, - new ItemStack(ComponentListMF.sharp_rock, MineFantasyII.random.nextInt(3) + 1)); - } - if (broken instanceof BlockLeavesBase && held != null && held.getItem() == ComponentListMF.sharp_rock) { - if (MineFantasyII.random.nextInt(5) == 0) { - entityDropItem(event.world, event.x, event.y, event.z, - new ItemStack(Items.stick, MineFantasyII.random.nextInt(3) + 1)); - } - if (MineFantasyII.random.nextInt(3) == 0) { - entityDropItem(event.world, event.x, event.y, event.z, - new ItemStack(ComponentListMF.vine, MineFantasyII.random.nextInt(3) + 1)); - } - } - } - - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(player) && ConfigStamina.affectMining) { - float points = 2.0F * ConfigStamina.miningSpeed; - ItemWeaponMF.applyFatigue(player, points, 20F); - - if (points > 0 && !StaminaBar.isAnyStamina(player, false)) { - player.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 100, 1)); - } - } - } - - public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) { - if (item.stackSize != 0 && item.getItem() != null) { - EntityItem entityitem = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, item); - entityitem.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(entityitem); - return entityitem; - } else { - return null; - } - } - - private void addKillTo(EntityPlayer hunter, String type) { - int kills = hunter.getEntityData().hasKey(type) ? hunter.getEntityData().getInteger(type) : 0; - kills++; - hunter.getEntityData().setInteger(type, kills); - } - - public static boolean displayOreDict = false; - - @SubscribeEvent - public void setTooltip(ItemTooltipEvent event) { - if (!event.entity.worldObj.isRemote) { - return; - } - - if (event.itemStack != null) { - boolean saidArtefact = false; - int[] ids = OreDictionary.getOreIDs(event.itemStack); - boolean hasInfo = false; - if (ids != null) { - for (int id : ids) { - String s = OreDictionary.getOreName(id); - if (s != null) { - if (!hasInfo && s.startsWith("ingot")) { - String s2 = s.substring(5, s.length()); - CustomMaterial material = CustomMaterial.getMaterial(s2); - if (material != null) - hasInfo = true; - - CustomToolHelper.addComponentString(event.itemStack, event.toolTip, material); - } - if (s.startsWith("Artefact-")) { - if (!saidArtefact) { - String knowledge = s.substring(9).toLowerCase(); - - if (!ResearchLogic.hasInfoUnlocked(event.entityPlayer, knowledge)) { - saidArtefact = true; - event.toolTip.add(EnumChatFormatting.AQUA - + StatCollector.translateToLocal("info.hasKnowledge")); - } - } - } else if (displayOreDict) { - event.toolTip.add("oreDict: " + s); - } - } - } - } - - if (event.itemStack.hasTagCompound() && event.itemStack.getTagCompound().hasKey("MF_Inferior")) { - if (event.itemStack.getTagCompound().getBoolean("MF_Inferior")) { - event.toolTip - .add(EnumChatFormatting.RED + StatCollector.translateToLocal("attribute.inferior.name")); - } - if (!event.itemStack.getTagCompound().getBoolean("MF_Inferior")) { - event.toolTip - .add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("attribute.superior.name")); - } - } - if (event.itemStack.getItem() instanceof ItemArmor - && (!(event.itemStack.getItem() instanceof ItemArmourMFBase) || ClientItemsMF.showSpecials( - event.itemStack, event.entityPlayer, event.toolTip, event.showAdvancedItemTooltips))) { - addArmourDR(event.itemStack, event.entityPlayer, event.toolTip, event.showAdvancedItemTooltips); - } - if (ArmourCalculator.advancedDamageTypes && ArmourCalculator.getRatioForWeapon(event.itemStack) != null) { - displayWeaponTraits(ArmourCalculator.getRatioForWeapon(event.itemStack), event.toolTip); - } - if (ToolHelper.shouldShowTooltip(event.itemStack)) { - showCrafterTooltip(event.itemStack, event.toolTip); - } - if (event.itemStack.hasTagCompound() && event.itemStack.getTagCompound().hasKey("MF_CraftedByName")) { - String name = event.itemStack.getTagCompound().getString("MF_CraftedByName"); - boolean special = MineFantasyII.isNameModder(name);// Mod creators have highlights - - event.toolTip.add((special ? EnumChatFormatting.GREEN : "") - + StatCollector.translateToLocal("attribute.mfcraftedbyname.name") + ": " + name - + EnumChatFormatting.GRAY); - } - WeaponClass WC = WeaponClass.findClassForAny(event.itemStack); - if (WC != null && RPGElements.isSystemActive && WC.parentSkill != null) { - event.toolTip.add(StatCollector.translateToLocal("weaponclass." + WC.name.toLowerCase())); - float skillMod = RPGElements.getWeaponModifier(event.entityPlayer, WC.parentSkill) * 100F; - if (skillMod > 100) - event.toolTip.add(StatCollector.translateToLocal("rpg.skillmod") - + ItemWeaponMF.decimal_format.format(skillMod - 100) + "%"); - - } - } - } - - private void displayWeaponTraits(float[] ratio, List list) { - int cutting = (int) (ratio[0] / (ratio[0] + ratio[1] + ratio[2]) * 100F); - int piercing = (int) (ratio[2] / (ratio[0] + ratio[1] + ratio[2]) * 100F); - int blunt = (int) (ratio[1] / (ratio[0] + ratio[1] + ratio[2]) * 100F); - - addDamageType(list, cutting, "cutting"); - addDamageType(list, piercing, "piercing"); - addDamageType(list, blunt, "blunt"); - } - - private void addDamageType(List list, int value, String name) { - if (value > 0) { - String s = StatCollector.translateToLocal("attribute.weapon." + name); - if (value < 100) { - s += " " + value + "%"; - } - list.add(s); - } - } - - public static void addArmourDT(ItemStack armour, EntityPlayer user, List list, boolean extra) { - list.add(""); - String AC = ArmourCalculator.getArmourClass(armour); - if (AC != null) { - list.add(StatCollector.translateToLocal("attribute.armour." + AC)); - } - list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.protection")); - addSingleDT(armour, user, 0, list, extra); - addSingleDT(armour, user, 2, list, extra); - addSingleDT(armour, user, 1, list, extra); - } - - public static void addSingleDT(ItemStack armour, EntityPlayer user, int id, List list, boolean extra) { - int slot = ((ItemArmor) armour.getItem()).armorType; - String attatch = ""; - - int rating = (int) (ArmourCalculator.getDTForDisplayPiece(armour, id) * 100F); - int equipped = (int) (ArmourCalculator.getDTForDisplayPiece(user.getCurrentArmor(3 - slot), id) * 100F); - - if (rating > 0 || equipped > 0) { - if (equipped > 0 && rating != equipped) { - float d = rating - equipped; - if (d > 0) { - attatch += EnumChatFormatting.DARK_GREEN; - } - if (d < 0) { - attatch += EnumChatFormatting.RED; - } - String d2 = ItemWeaponMF.decimal_format.format(d); - attatch += " (" + (d > 0 ? "+" : "") + d2 + ")"; - } - list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.rating." + id) + " " - + rating + attatch); - } - } - - public static void addArmourDR(ItemStack armour, EntityPlayer user, List list, boolean extra) { - list.add(""); - String AC = ArmourCalculator.getArmourClass(armour); - if (AC != null) { - list.add(StatCollector.translateToLocal("attribute.armour." + AC)); - } - if (armour.getItem() instanceof ISpecialArmourMF) { - if (ArmourCalculator.advancedDamageTypes) { - list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.protection")); - addSingleDR(armour, user, 0, list, extra, true); - addSingleDR(armour, user, 2, list, extra, true); - addSingleDR(armour, user, 1, list, extra, true); - } else { - addSingleDR(armour, user, 0, list, extra, false); - } - } - } - - public static void addSingleDR(ItemStack armour, EntityPlayer user, int id, List list, boolean extra, - boolean advanced) { - int slot = ((ItemArmor) armour.getItem()).armorType; - String attatch = ""; - - int rating = (int) (ArmourCalculator.getDRForDisplayPiece(armour, id) * 100F); - int equipped = (int) (ArmourCalculator.getDRForDisplayPiece(user.getCurrentArmor(3 - slot), id) * 100F); - - if (rating > 0 || equipped > 0) { - if (equipped > 0 && rating != equipped) { - float d = rating - equipped; - if (d > 0) { - attatch += EnumChatFormatting.DARK_GREEN; - } - if (d < 0) { - attatch += EnumChatFormatting.RED; - } - String d2 = ItemWeaponMF.decimal_format.format(d); - attatch += " (" + (d > 0 ? "+" : "") + d2 + ")"; - } - if (advanced) { - list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.rating." + id) + " " - + rating + attatch); - } else { - list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.protection") + ": " - + rating + attatch); - } - } - } - - private void showCrafterTooltip(ItemStack tool, List list) { - String toolType = ToolHelper.getCrafterTool(tool); - int tier = ToolHelper.getCrafterTier(tool); - float efficiency = ToolHelper.getCrafterEfficiency(tool); - - list.add(StatCollector.translateToLocal("attribute.mfcrafttool.name") + ": " - + StatCollector.translateToLocal("tooltype." + toolType)); - list.add(StatCollector.translateToLocal("attribute.mfcrafttier.name") + ": " + tier); - list.add(StatCollector.translateToLocal("attribute.mfcrafteff.name") + ": " + efficiency); - } + public static final String hitspeedNBT = "MF_HitCooldown"; + public static final String injuredNBT = "MF_Injured"; + public static boolean displayOreDict = false; + + public static void addArmourDT(ItemStack armour, EntityPlayer user, List list, boolean extra) { + list.add(""); + String AC = ArmourCalculator.getArmourClass(armour); + if (AC != null) { + list.add(StatCollector.translateToLocal("attribute.armour." + AC)); + } + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.protection")); + addSingleDT(armour, user, 0, list, extra); + addSingleDT(armour, user, 2, list, extra); + addSingleDT(armour, user, 1, list, extra); + } + + public static void addSingleDT(ItemStack armour, EntityPlayer user, int id, List list, boolean extra) { + int slot = ((ItemArmor) armour.getItem()).armorType; + String attatch = ""; + + int rating = (int) (ArmourCalculator.getDTForDisplayPiece(armour, id) * 100F); + int equipped = (int) (ArmourCalculator.getDTForDisplayPiece(user.getCurrentArmor(3 - slot), id) * 100F); + + if (rating > 0 || equipped > 0) { + if (equipped > 0 && rating != equipped) { + float d = rating - equipped; + if (d > 0) { + attatch += EnumChatFormatting.DARK_GREEN; + } + if (d < 0) { + attatch += EnumChatFormatting.RED; + } + String d2 = ItemWeaponMF.decimal_format.format(d); + attatch += " (" + (d > 0 ? "+" : "") + d2 + ")"; + } + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.rating." + id) + " " + + rating + attatch); + } + } + + public static void addArmourDR(ItemStack armour, EntityPlayer user, List list, boolean extra) { + list.add(""); + String AC = ArmourCalculator.getArmourClass(armour); + if (AC != null) { + list.add(StatCollector.translateToLocal("attribute.armour." + AC)); + } + if (armour.getItem() instanceof ISpecialArmourMF) { + if (ArmourCalculator.advancedDamageTypes) { + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.protection")); + addSingleDR(armour, user, 0, list, extra, true); + addSingleDR(armour, user, 2, list, extra, true); + addSingleDR(armour, user, 1, list, extra, true); + } else { + addSingleDR(armour, user, 0, list, extra, false); + } + } + } + + public static void addSingleDR(ItemStack armour, EntityPlayer user, int id, List list, boolean extra, + boolean advanced) { + int slot = ((ItemArmor) armour.getItem()).armorType; + String attatch = ""; + + int rating = (int) (ArmourCalculator.getDRForDisplayPiece(armour, id) * 100F); + int equipped = (int) (ArmourCalculator.getDRForDisplayPiece(user.getCurrentArmor(3 - slot), id) * 100F); + + if (rating > 0 || equipped > 0) { + if (equipped > 0 && rating != equipped) { + float d = rating - equipped; + if (d > 0) { + attatch += EnumChatFormatting.DARK_GREEN; + } + if (d < 0) { + attatch += EnumChatFormatting.RED; + } + String d2 = ItemWeaponMF.decimal_format.format(d); + attatch += " (" + (d > 0 ? "+" : "") + d2 + ")"; + } + if (advanced) { + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.rating." + id) + " " + + rating + attatch); + } else { + list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("attribute.armour.protection") + ": " + + rating + attatch); + } + } + } + + public static String getRegisterName(Entity entity) { + String s = EntityList.getEntityString(entity); + + if (s == null) { + s = "generic"; + } + + return s; + } + + public static void tickHitSpeeds(EntityLivingBase user) { + int time = getHitspeedTime(user); + if (time > 0) { + time--; + user.getEntityData().setInteger(hitspeedNBT, time); + } + + } + + public static void setHitTime(EntityLivingBase user, int time) { + user.getEntityData().setInteger(hitspeedNBT, time); + } + + public static int getHitspeedTime(Entity entity) { + if (entity != null && entity.getEntityData().hasKey(hitspeedNBT)) { + return entity.getEntityData().getInteger(hitspeedNBT); + } + return 0; + } + + public static int getInjuredTime(Entity entity) { + if (entity.getEntityData().hasKey(injuredNBT)) { + return entity.getEntityData().getInteger(injuredNBT); + } + return 0; + } + + @SubscribeEvent + public void tryDropItems(LivingDropsEvent event) { + EntityLivingBase dropper = event.entityLiving; + + if (dropper instanceof EntityChicken) { + int dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1 * 4); + + for (int a = 0; a < dropCount; a++) { + dropper.entityDropItem(new ItemStack(Items.feather), 0.0F); + } + } + if (dropper.getEntityData().hasKey("MF_LootDrop")) { + int id = dropper.getEntityData().getInteger("MF_LootDrop"); + Item drop = id == 0 ? ToolListMF.loot_sack : id == 1 ? ToolListMF.loot_sack_uc : ToolListMF.loot_sack_rare; + dropper.entityDropItem(new ItemStack(drop), 0.0F); + } + if (dropper instanceof EntityAgeable && dropper.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD) { + if (MineFantasyII.random.nextFloat() * (1 + event.lootingLevel) < 0.05F) { + dropper.entityDropItem(new ItemStack(FoodListMF.guts), 0.0F); + } + } + if (dropper instanceof IAnimals && !(dropper instanceof IMob)) { + if (ConfigHardcore.hunterKnife && !dropper.getEntityData().hasKey("hunterKill")) { + event.setCanceled(true); + return; + } + if (ConfigHardcore.lessHunt) { + alterDrops(dropper, event); + } + } + if (getRegisterName(dropper).contains("Horse")) { + int dropCount = MineFantasyII.random.nextInt(3 + event.lootingLevel); + if (ConfigHardcore.lessHunt) { + dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1); + } + + Item meat = dropper.isBurning() ? FoodListMF.horse_cooked : FoodListMF.horse_raw; + for (int a = 0; a < dropCount; a++) { + dropper.entityDropItem(new ItemStack(meat), 0.0F); + } + } + if (getRegisterName(dropper).contains("Wolf")) { + int dropCount = MineFantasyII.random.nextInt(3 + event.lootingLevel); + if (ConfigHardcore.lessHunt) { + dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1); + } + + Item meat = dropper.isBurning() ? FoodListMF.wolf_cooked : FoodListMF.wolf_raw; + for (int a = 0; a < dropCount; a++) { + dropper.entityDropItem(new ItemStack(meat), 0.0F); + } + } + dropLeather(event.entityLiving, event); + + if (dropper instanceof EntitySkeleton) { + EntitySkeleton skeleton = (EntitySkeleton) dropper; + + if ((skeleton.getHeldItem() == null || !(skeleton.getHeldItem().getItem() instanceof ItemBow)) + && event.drops != null && !event.drops.isEmpty()) { + Iterator list = event.drops.iterator(); + + while (list.hasNext()) { + EntityItem entItem = list.next(); + ItemStack drop = entItem.getEntityItem(); + + if (drop.getItem() == Items.arrow) { + entItem.setDead(); + } + } + } + } + } + + private void dropLeather(EntityLivingBase mob, LivingDropsEvent event) { + boolean dropHide = shouldAnimalDropHide(mob); + Item hide = getHideFor(mob); + + if (event.drops != null && !event.drops.isEmpty()) { + Iterator list = event.drops.iterator(); + + while (list.hasNext()) { + EntityItem entItem = list.next(); + ItemStack drop = entItem.getEntityItem(); + + if (drop.getItem() == Items.leather) { + entItem.setDead(); + dropHide = true; + } + } + } + if (dropHide && hide != null && !(ConfigHardcore.hunterKnife && !mob.getEntityData().hasKey("hunterKill"))) { + mob.entityDropItem(new ItemStack(hide), 0.0F); + } + } + + private Item getHideFor(EntityLivingBase mob) { + Item[] hide = new Item[]{ComponentListMF.rawhideSmall, ComponentListMF.rawhideMedium, + ComponentListMF.rawhideLarge}; + int size = getHideSizeFor(mob); + if (mob.isChild()) { + size--; + } + + if (size <= 0) { + return null; + } + if (size > hide.length) { + size = hide.length; + } + + return hide[size - 1]; + } + + private int getHideSizeFor(EntityLivingBase mob) { + String mobName = mob.getClass().getName(); + if (mobName.endsWith("EntityCow") || mobName.endsWith("EntityHorse")) { + return 3; + } + if (mobName.endsWith("EntitySheep")) { + return 2; + } + if (mobName.endsWith("EntityPig")) { + return 1; + } + + int size = mob.myEntitySize.ordinal() + 1; + if (size <= 1) { + return 0; + } + if (size == 2) { + return 1; + } else if (size <= 4) { + return 2; + } + return 3; + } + + private boolean shouldAnimalDropHide(EntityLivingBase mob) { + String mobName = mob.getClass().getName(); + if (mobName.endsWith("EntityWolf") || mobName.endsWith("EntityPig") || mobName.endsWith("EntitySheep") + || mobName.endsWith("EntityCow") || mobName.endsWith("EntityHorse")) { + return true; + } + if (mob instanceof EntityWolf || mob instanceof EntityCow || mob instanceof EntityPig + || mob instanceof EntitySheep || mob instanceof EntityHorse) { + return true; + } + return false; + } + + @SubscribeEvent + public void onDeath(LivingDeathEvent event) { + if (!event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityDragon && event.source != null + && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer) { + PlayerTickHandlerMF.addDragonKill((EntityPlayer) event.source.getEntity()); + } + if (!event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityPlayer && event.source != null + && event.source.getEntity() != null && event.source.getEntity() instanceof EntityDragon) { + PlayerTickHandlerMF.addDragonEnemyPts((EntityPlayer) event.entityLiving, -1); + } + Entity dropper = event.entity; + + boolean useArrows = true; + try { + Class.forName("minefantasy.mf2.api.helpers.ArrowEffectsMF"); + } catch (Exception e) { + useArrows = false; + } + if (dropper != null && useArrows && ConfigExperiment.stickArrows && !dropper.worldObj.isRemote) { + ArrayList stuckArrows = (ArrayList) ArrowEffectsMF.getStuckArrows(dropper); + if (stuckArrows != null && !stuckArrows.isEmpty()) { + Iterator list = stuckArrows.iterator(); + + while (list.hasNext()) { + ItemStack arrow = (ItemStack) list.next(); + if (arrow != null) { + dropper.entityDropItem(arrow, 0.0F); + } + } + } + } + + } + + @SubscribeEvent + public void spawnEntity(EntityJoinWorldEvent event) { + if (event.entity.isDead) { + return; + } + if (event.entity instanceof EntityItem && !(event.entity instanceof EntityItemUnbreakable)) { + EntityItem eitem = (EntityItem) event.entity; + if (eitem.getEntityItem() != null) { + if (eitem.getEntityItem().hasTagCompound() + && eitem.getEntityItem().getTagCompound().hasKey("Unbreakable")) { + EntityItem newEntity = new EntityItemUnbreakable(event.world, eitem); + event.world.spawnEntityInWorld(newEntity); + eitem.setDead(); + } + if (isDragonforge(eitem.getEntityItem())) { + MFLogUtil.logDebug("Found dragon heart"); + EntityItem newEntity = new EntityItemUnbreakable(event.world, eitem); + event.world.spawnEntityInWorld(newEntity); + eitem.setDead(); + } + } + } + } + + private boolean isDragonforge(ItemStack itemstack) { + return itemstack.getItem() == ComponentListMF.dragon_heart; + } + + public void alterDrops(EntityLivingBase dropper, LivingDropsEvent event) { + ArrayList meats = new ArrayList(); + + if (event.drops != null && !event.drops.isEmpty()) { + Iterator list = event.drops.iterator(); + + while (list.hasNext()) { + EntityItem entItem = list.next(); + ItemStack drop = entItem.getEntityItem(); + boolean dropItem = true; + + if (drop.getItem() instanceof ItemFood) { + entItem.setDead(); + + if (!meats.isEmpty()) { + for (int a = 0; a < meats.size(); a++) { + ItemStack compare = meats.get(a); + if (drop.isItemEqual(compare)) { + dropItem = false; + } + } + } + if (dropItem) { + drop.stackSize = 1; + if (event.lootingLevel > 0) { + drop.stackSize += dropper.getRNG().nextInt(event.lootingLevel + 1); + } + meats.add(drop.copy()); + } + } + } + + for (int a = 0; a < meats.size(); a++) { + ItemStack meat = meats.get(a); + dropper.entityDropItem(meat, 0.0F); + } + } + } + + @SubscribeEvent + public void killEntity(LivingDeathEvent event) { + // killsCount + EntityLivingBase dead = event.entityLiving; + EntityLivingBase hunter = null; + ItemStack weapon = null; + DamageSource source = event.source; + + if (dead instanceof EntityWitch) { + dropBook(dead, 0); + } + if (dead instanceof EntityVillager) { + dropBook(dead, 1); + } + if (dead instanceof EntityZombie) { + dropBook(dead, 2); + } + if (source != null && source.getEntity() != null) { + if (source.getEntity() instanceof EntityLivingBase) { + hunter = (EntityLivingBase) source.getEntity(); + weapon = hunter.getHeldItem(); + if (hunter instanceof EntityPlayer) { + addKill((EntityPlayer) hunter, dead); + } + } + } + if (weapon != null) { + String type = ToolHelper.getCrafterTool(weapon); + if (weapon.getItem() instanceof IHuntingItem) { + if (((IHuntingItem) weapon.getItem()).canRetrieveDrops(weapon)) { + dead.getEntityData().setBoolean("hunterKill", true); + } + } else if (type != null && type.equalsIgnoreCase("knife")) { + dead.getEntityData().setBoolean("hunterKill", true); + } + } + } + + private void dropBook(EntityLivingBase dead, int id) { + if (dead.worldObj.isRemote) + return; + Item book = null; + if (id == 0) { + float chance = MineFantasyII.random.nextFloat(); + if (chance > 0.75F) { + book = ToolListMF.skillbook_engineering; + } else { + book = ToolListMF.skillbook_provisioning; + } + } else if (id == 1 && MineFantasyII.random.nextInt(5) == 0) { + float chance = MineFantasyII.random.nextFloat(); + if (chance > 0.9F) { + book = ToolListMF.skillbook_engineering; + } else if (chance > 0.6F) { + book = ToolListMF.skillbook_artisanry; + } else if (chance > 0.3F) { + book = ToolListMF.skillbook_construction; + } else { + book = ToolListMF.skillbook_provisioning; + } + } else if (id == 2 && MineFantasyII.random.nextInt(25) == 0) { + float chance = MineFantasyII.random.nextFloat(); + if (chance > 0.9F) { + book = ToolListMF.skillbook_engineering; + } else if (chance > 0.6F) { + book = ToolListMF.skillbook_artisanry; + } else if (chance > 0.3F) { + book = ToolListMF.skillbook_construction; + } else { + book = ToolListMF.skillbook_provisioning; + } + } + if (book != null) { + dead.entityDropItem(new ItemStack(book), 0F); + } + } + + private void addKill(EntityPlayer hunter, EntityLivingBase dead) { + addKillTo(hunter, "killsCount"); + if (dead instanceof IMob) { + addKillTo(hunter, "killsCountMob"); + } else if (dead instanceof IAnimals) { + addKillTo(hunter, "killsCountAnimal"); + } + if (dead instanceof EntityPlayer) { + addKillTo(hunter, "killsCountPlayer"); + } + } + + @SubscribeEvent + public void useHoe(UseHoeEvent event) { + Block block = event.world.getBlock(event.x, event.y, event.z); + if (block != Blocks.farmland && FarmingHelper.didHoeFail(event.current, event.world, block == Blocks.grass)) { + event.entityPlayer.swingItem(); + event.world.playAuxSFXAtEntity(event.entityPlayer, 2001, event.x, event.y, event.z, + Block.getIdFromBlock(block) + (event.world.getBlockMetadata(event.x, event.y, event.z) << 12)); + event.setCanceled(true); + } + } + + @SubscribeEvent + public void breakBlock(BreakEvent event) { + // Block block = event.block; + Block base = event.world.getBlock(event.x, event.y - 1, event.z); + // int meta = event.blockMetadata; + + if (base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(event.world, false)) { + event.world.setBlock(event.x, event.y - 1, event.z, Blocks.dirt); + } + + EntityPlayer player = event.getPlayer(); + if (player != null && !player.capabilities.isCreativeMode && !(player instanceof FakePlayer)) { + playerMineBlock(event); + } + } /*@SubscribeEvent - public void loadChunk(ChunkEvent.Load event) { + public void loadChunk(ChunkEvent.Load event) { }*/ - public static String getRegisterName(Entity entity) { - String s = EntityList.getEntityString(entity); - - if (s == null) { - s = "generic"; - } - - return s; - } - - @SubscribeEvent - public void updateEntity(LivingUpdateEvent event) { - if (event.entity instanceof EntityCogwork) { - return; - } - EntityLivingBase entity = event.entityLiving; - - if (ASMHelper.isASMEnabled && entity instanceof EntityHorse) { - EntityHorse horse = (EntityHorse) entity; - ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); - if (customArmor != null && customArmor.getItem() instanceof ItemHorseArmorMF) { - ItemHorseArmorMF armor = (ItemHorseArmorMF) customArmor.getItem(); - armor.onHorseUpdate(horse, customArmor); - } - } - - float lowHp = entity.getMaxHealth() / 5F; - int injury = getInjuredTime(entity); - - if (ConfigHardcore.critLimp && (entity instanceof EntityLiving - || !(entity instanceof EntityPlayer && ((EntityPlayer) entity).capabilities.isCreativeMode))) { - if (entity.getHealth() <= lowHp || injury > 0) { - if (entity.getRNG().nextInt(10) == 0 && entity.onGround && !entity.isRiding()) { - entity.motionX = 0F; - entity.motionZ = 0F; - } - if (entity.ticksExisted % 15 == 0) { - entity.limbSwing = 2.0F; - float x = (float) (entity.posX + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); - float y = (float) (entity.posY + entity.getEyeHeight() + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); - float z = (float) (entity.posZ + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); - entity.worldObj.spawnParticle("reddust", x, y, z, 0F, 0F, 0F); - } - } - if (!entity.worldObj.isRemote && entity.getHealth() <= (lowHp / 2) && entity.getRNG().nextInt(200) == 0) { - entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 50)); - } - } - if (injury > 0 && !entity.worldObj.isRemote) { - injury--; - entity.getEntityData().setInteger(injuredNBT, injury); - } - if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(entity)) { - StaminaMechanics.tickEntity(event.entityLiving); - } - tickHitSpeeds(event.entityLiving); + public void playerMineBlock(BlockEvent.BreakEvent event) { + EntityPlayer player = event.getPlayer(); + ItemStack held = player.getHeldItem(); + Block broken = event.block; + + if (broken != null && ConfigHardcore.HCCallowRocks) { + if (broken == Blocks.stone && held == null) { + entityDropItem(event.world, event.x, event.y, event.z, + new ItemStack(ComponentListMF.sharp_rock, MineFantasyII.random.nextInt(3) + 1)); + } + if (broken instanceof BlockLeavesBase && held != null && held.getItem() == ComponentListMF.sharp_rock) { + if (MineFantasyII.random.nextInt(5) == 0) { + entityDropItem(event.world, event.x, event.y, event.z, + new ItemStack(Items.stick, MineFantasyII.random.nextInt(3) + 1)); + } + if (MineFantasyII.random.nextInt(3) == 0) { + entityDropItem(event.world, event.x, event.y, event.z, + new ItemStack(ComponentListMF.vine, MineFantasyII.random.nextInt(3) + 1)); + } + } + } + + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(player) && ConfigStamina.affectMining) { + float points = 2.0F * ConfigStamina.miningSpeed; + ItemWeaponMF.applyFatigue(player, points, 20F); + + if (points > 0 && !StaminaBar.isAnyStamina(player, false)) { + player.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 100, 1)); + } + } + } + + public EntityItem entityDropItem(World world, int x, int y, int z, ItemStack item) { + if (item.stackSize != 0 && item.getItem() != null) { + EntityItem entityitem = new EntityItem(world, x + 0.5D, y + 0.5D, z + 0.5D, item); + entityitem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(entityitem); + return entityitem; + } else { + return null; + } + } + + private void addKillTo(EntityPlayer hunter, String type) { + int kills = hunter.getEntityData().hasKey(type) ? hunter.getEntityData().getInteger(type) : 0; + kills++; + hunter.getEntityData().setInteger(type, kills); + } + + @SubscribeEvent + public void setTooltip(ItemTooltipEvent event) { + if (!event.entity.worldObj.isRemote) { + return; + } + + if (event.itemStack != null) { + boolean saidArtefact = false; + int[] ids = OreDictionary.getOreIDs(event.itemStack); + boolean hasInfo = false; + if (ids != null) { + for (int id : ids) { + String s = OreDictionary.getOreName(id); + if (s != null) { + if (!hasInfo && s.startsWith("ingot")) { + String s2 = s.substring(5, s.length()); + CustomMaterial material = CustomMaterial.getMaterial(s2); + if (material != null) + hasInfo = true; + + CustomToolHelper.addComponentString(event.itemStack, event.toolTip, material); + } + if (s.startsWith("Artefact-")) { + if (!saidArtefact) { + String knowledge = s.substring(9).toLowerCase(); + + if (!ResearchLogic.hasInfoUnlocked(event.entityPlayer, knowledge)) { + saidArtefact = true; + event.toolTip.add(EnumChatFormatting.AQUA + + StatCollector.translateToLocal("info.hasKnowledge")); + } + } + } else if (displayOreDict) { + event.toolTip.add("oreDict: " + s); + } + } + } + } + + if (event.itemStack.hasTagCompound() && event.itemStack.getTagCompound().hasKey("MF_Inferior")) { + if (event.itemStack.getTagCompound().getBoolean("MF_Inferior")) { + event.toolTip + .add(EnumChatFormatting.RED + StatCollector.translateToLocal("attribute.inferior.name")); + } + if (!event.itemStack.getTagCompound().getBoolean("MF_Inferior")) { + event.toolTip + .add(EnumChatFormatting.GREEN + StatCollector.translateToLocal("attribute.superior.name")); + } + } + if (event.itemStack.getItem() instanceof ItemArmor + && (!(event.itemStack.getItem() instanceof ItemArmourMFBase) || ClientItemsMF.showSpecials( + event.itemStack, event.entityPlayer, event.toolTip, event.showAdvancedItemTooltips))) { + addArmourDR(event.itemStack, event.entityPlayer, event.toolTip, event.showAdvancedItemTooltips); + } + if (ArmourCalculator.advancedDamageTypes && ArmourCalculator.getRatioForWeapon(event.itemStack) != null) { + displayWeaponTraits(ArmourCalculator.getRatioForWeapon(event.itemStack), event.toolTip); + } + if (ToolHelper.shouldShowTooltip(event.itemStack)) { + showCrafterTooltip(event.itemStack, event.toolTip); + } + if (event.itemStack.hasTagCompound() && event.itemStack.getTagCompound().hasKey("MF_CraftedByName")) { + String name = event.itemStack.getTagCompound().getString("MF_CraftedByName"); + boolean special = MineFantasyII.isNameModder(name);// Mod creators have highlights + + event.toolTip.add((special ? EnumChatFormatting.GREEN : "") + + StatCollector.translateToLocal("attribute.mfcraftedbyname.name") + ": " + name + + EnumChatFormatting.GRAY); + } + WeaponClass WC = WeaponClass.findClassForAny(event.itemStack); + if (WC != null && RPGElements.isSystemActive && WC.parentSkill != null) { + event.toolTip.add(StatCollector.translateToLocal("weaponclass." + WC.name.toLowerCase())); + float skillMod = RPGElements.getWeaponModifier(event.entityPlayer, WC.parentSkill) * 100F; + if (skillMod > 100) + event.toolTip.add(StatCollector.translateToLocal("rpg.skillmod") + + ItemWeaponMF.decimal_format.format(skillMod - 100) + "%"); + + } + } + } + + private void displayWeaponTraits(float[] ratio, List list) { + int cutting = (int) (ratio[0] / (ratio[0] + ratio[1] + ratio[2]) * 100F); + int piercing = (int) (ratio[2] / (ratio[0] + ratio[1] + ratio[2]) * 100F); + int blunt = (int) (ratio[1] / (ratio[0] + ratio[1] + ratio[2]) * 100F); + + addDamageType(list, cutting, "cutting"); + addDamageType(list, piercing, "piercing"); + addDamageType(list, blunt, "blunt"); + } + + private void addDamageType(List list, int value, String name) { + if (value > 0) { + String s = StatCollector.translateToLocal("attribute.weapon." + name); + if (value < 100) { + s += " " + value + "%"; + } + list.add(s); + } + } + + private void showCrafterTooltip(ItemStack tool, List list) { + String toolType = ToolHelper.getCrafterTool(tool); + int tier = ToolHelper.getCrafterTier(tool); + float efficiency = ToolHelper.getCrafterEfficiency(tool); + + list.add(StatCollector.translateToLocal("attribute.mfcrafttool.name") + ": " + + StatCollector.translateToLocal("tooltype." + toolType)); + list.add(StatCollector.translateToLocal("attribute.mfcrafttier.name") + ": " + tier); + list.add(StatCollector.translateToLocal("attribute.mfcrafteff.name") + ": " + efficiency); + } + + @SubscribeEvent + public void updateEntity(LivingUpdateEvent event) { + if (event.entity instanceof EntityCogwork) { + return; + } + EntityLivingBase entity = event.entityLiving; + + if (ASMHelper.isASMEnabled && entity instanceof EntityHorse) { + EntityHorse horse = (EntityHorse) entity; + ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); + if (customArmor != null && customArmor.getItem() instanceof ItemHorseArmorMF) { + ItemHorseArmorMF armor = (ItemHorseArmorMF) customArmor.getItem(); + armor.onHorseUpdate(horse, customArmor); + } + } + + float lowHp = entity.getMaxHealth() / 5F; + int injury = getInjuredTime(entity); + + if (ConfigHardcore.critLimp && (entity instanceof EntityLiving + || !(entity instanceof EntityPlayer && ((EntityPlayer) entity).capabilities.isCreativeMode))) { + if (entity.getHealth() <= lowHp || injury > 0) { + if (entity.getRNG().nextInt(10) == 0 && entity.onGround && !entity.isRiding()) { + entity.motionX = 0F; + entity.motionZ = 0F; + } + if (entity.ticksExisted % 15 == 0) { + entity.limbSwing = 2.0F; + float x = (float) (entity.posX + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); + float y = (float) (entity.posY + entity.getEyeHeight() + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); + float z = (float) (entity.posZ + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); + entity.worldObj.spawnParticle("reddust", x, y, z, 0F, 0F, 0F); + } + } + if (!entity.worldObj.isRemote && entity.getHealth() <= (lowHp / 2) && entity.getRNG().nextInt(200) == 0) { + entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 50)); + } + } + if (injury > 0 && !entity.worldObj.isRemote) { + injury--; + entity.getEntityData().setInteger(injuredNBT, injury); + } + if (StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(entity)) { + StaminaMechanics.tickEntity(event.entityLiving); + } + tickHitSpeeds(event.entityLiving); /*if (event.entity.ticksExisted == 1 && event.entity instanceof EntityPlayer && !event.entity.worldObj.isRemote) { }*/ - } - - public static void tickHitSpeeds(EntityLivingBase user) { - int time = getHitspeedTime(user); - if (time > 0) { - time--; - user.getEntityData().setInteger(hitspeedNBT, time); - } - - } - - public static final String hitspeedNBT = "MF_HitCooldown"; - - public static void setHitTime(EntityLivingBase user, int time) { - user.getEntityData().setInteger(hitspeedNBT, time); - } - - public static int getHitspeedTime(Entity entity) { - if (entity != null && entity.getEntityData().hasKey(hitspeedNBT)) { - return entity.getEntityData().getInteger(hitspeedNBT); - } - return 0; - } - - public static final String injuredNBT = "MF_Injured"; - - public static int getInjuredTime(Entity entity) { - if (entity.getEntityData().hasKey(injuredNBT)) { - return entity.getEntityData().getInteger(injuredNBT); - } - return 0; - } - - @SubscribeEvent - public void clonePlayer(PlayerEvent.Clone event) { - EntityPlayer origin = event.original; - EntityPlayer spawn = event.entityPlayer; - if (origin != null && spawn != null) { - EntityHelper.cloneNBT(origin, spawn); - } - } - - @SubscribeEvent - public void startUseItem(PlayerUseItemEvent.Start event) { - EntityPlayer player = event.entityPlayer; - if (event.item != null && event.item.getItemUseAction() == EnumAction.block) { - if ((StaminaBar.isSystemActive && TacticalManager.shouldStaminaBlock - && !StaminaBar.isAnyStamina(player, false)) || !CombatMechanics.isParryAvailable(player)) { - event.setCanceled(true); - } - } - } - - @SubscribeEvent - public void levelup(LevelupEvent event) { - EntityPlayer player = event.thePlayer; - if (!player.worldObj.isRemote) { - ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, - new LevelupPacket(player, event.theSkill, event.theLevel).generatePacket()); - ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, - new SkillPacket(player, event.theSkill).generatePacket()); - } - } - - @SubscribeEvent - public void syncSkill(SyncSkillEvent event) { - EntityPlayer player = event.thePlayer; - if (!player.worldObj.isRemote) { - ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, - new SkillPacket(player, event.theSkill).generatePacket()); - } - } - - @SubscribeEvent - public void itemEvent(EntityItemPickupEvent event) { - EntityPlayer player = event.entityPlayer; - - EntityItem drop = event.item; - ItemStack item = drop.getEntityItem(); - ItemStack held = player.getHeldItem(); - - if (held != null && held.getItem() instanceof ISmithTongs) { - if (!TongsHelper.hasHeldItem(held)) { - if (isHotItem(item)) { - if (TongsHelper.trySetHeldItem(held, item)) { - drop.setDead(); - - if (event.isCancelable()) { - event.setCanceled(true); - } - return; - } - } - } - } - { - if (ConfigHardcore.HCChotBurn && item != null && isHotItem(item)) { - if (event.isCancelable()) { - event.setCanceled(true); - } - } - } - } - - @SubscribeEvent - public void wakeUp(PlayerWakeUpEvent event) { - PlayerTickHandlerMF.wakeUp(event.entityPlayer); - } - - private boolean isHotItem(ItemStack item) { - return item != null && (item.getItem() instanceof IHotItem); - } - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void renderEntity(RenderPlayerEvent.Specials.Pre event) { - Minecraft mc = Minecraft.getMinecraft(); - boolean showHeld = true; - if (PowerArmour.isWearingCogwork(event.entityPlayer) && mc.gameSettings.thirdPersonView != 0) { - IPowerArmour cogwork = (IPowerArmour) event.entity.ridingEntity; - showHeld = !cogwork.isArmoured("right_arm"); - } - event.renderItem = showHeld; - } - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void renderEntity(RenderLivingEvent.Pre event) { - if (!(event.renderer instanceof RenderPowerArmour)) { - boolean renderHead = false; - boolean renderBody = false; - boolean renderLeftArm = false; - boolean renderRightArm = false; - boolean renderLeftLeg = false; - boolean renderRightLeg = false; - Minecraft mc = Minecraft.getMinecraft(); - - if (event.entity instanceof EntityPlayer && !(event.entity == mc.thePlayer - && (mc.currentScreen instanceof GuiContainerCreative || mc.currentScreen instanceof GuiInventory)) - && PowerArmour.isWearingCogwork(event.entity) && mc.gameSettings.thirdPersonView != 0) { - IPowerArmour cogwork = (IPowerArmour) event.entity.ridingEntity; - renderHead = cogwork.isArmoured("left_leg"); - renderBody = cogwork.isArmoured("right_leg"); - renderLeftArm = cogwork.isArmoured("left_arm"); - renderRightArm = cogwork.isArmoured("right_arm"); - renderLeftLeg = cogwork.isArmoured("left_leg"); - renderRightLeg = cogwork.isArmoured("right_leg"); - } - - if (event.renderer instanceof RenderPlayer) { - RenderPlayer RP = (RenderPlayer) event.renderer; - ModelBiped[] layers = new ModelBiped[] { RP.modelArmor, RP.modelArmorChestplate }; - - for (ModelBiped model : layers) { - model.bipedHead.isHidden = model.bipedHeadwear.isHidden = model.bipedEars.isHidden = renderHead; - model.bipedBody.isHidden = model.bipedCloak.isHidden = renderBody; - - model.bipedLeftArm.isHidden = renderLeftArm; - model.bipedRightArm.isHidden = renderRightArm; - model.bipedLeftLeg.isHidden = renderLeftLeg; - model.bipedRightLeg.isHidden = renderRightLeg; - } - } - } - } + } + + @SubscribeEvent + public void clonePlayer(PlayerEvent.Clone event) { + EntityPlayer origin = event.original; + EntityPlayer spawn = event.entityPlayer; + if (origin != null && spawn != null) { + EntityHelper.cloneNBT(origin, spawn); + } + } + + @SubscribeEvent + public void startUseItem(PlayerUseItemEvent.Start event) { + EntityPlayer player = event.entityPlayer; + if (event.item != null && event.item.getItemUseAction() == EnumAction.block) { + if ((StaminaBar.isSystemActive && TacticalManager.shouldStaminaBlock + && !StaminaBar.isAnyStamina(player, false)) || !CombatMechanics.isParryAvailable(player)) { + event.setCanceled(true); + } + } + } + + @SubscribeEvent + public void levelup(LevelupEvent event) { + EntityPlayer player = event.thePlayer; + if (!player.worldObj.isRemote) { + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new LevelupPacket(player, event.theSkill, event.theLevel).generatePacket()); + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new SkillPacket(player, event.theSkill).generatePacket()); + } + } + + @SubscribeEvent + public void syncSkill(SyncSkillEvent event) { + EntityPlayer player = event.thePlayer; + if (!player.worldObj.isRemote) { + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new SkillPacket(player, event.theSkill).generatePacket()); + } + } + + @SubscribeEvent + public void itemEvent(EntityItemPickupEvent event) { + EntityPlayer player = event.entityPlayer; + + EntityItem drop = event.item; + ItemStack item = drop.getEntityItem(); + ItemStack held = player.getHeldItem(); + + if (held != null && held.getItem() instanceof ISmithTongs) { + if (!TongsHelper.hasHeldItem(held)) { + if (isHotItem(item)) { + if (TongsHelper.trySetHeldItem(held, item)) { + drop.setDead(); + + if (event.isCancelable()) { + event.setCanceled(true); + } + return; + } + } + } + } + { + if (ConfigHardcore.HCChotBurn && item != null && isHotItem(item)) { + if (event.isCancelable()) { + event.setCanceled(true); + } + } + } + } + + @SubscribeEvent + public void wakeUp(PlayerWakeUpEvent event) { + PlayerTickHandlerMF.wakeUp(event.entityPlayer); + } + + private boolean isHotItem(ItemStack item) { + return item != null && (item.getItem() instanceof IHotItem); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void renderEntity(RenderPlayerEvent.Specials.Pre event) { + Minecraft mc = Minecraft.getMinecraft(); + boolean showHeld = true; + if (PowerArmour.isWearingCogwork(event.entityPlayer) && mc.gameSettings.thirdPersonView != 0) { + IPowerArmour cogwork = (IPowerArmour) event.entity.ridingEntity; + showHeld = !cogwork.isArmoured("right_arm"); + } + event.renderItem = showHeld; + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void renderEntity(RenderLivingEvent.Pre event) { + if (!(event.renderer instanceof RenderPowerArmour)) { + boolean renderHead = false; + boolean renderBody = false; + boolean renderLeftArm = false; + boolean renderRightArm = false; + boolean renderLeftLeg = false; + boolean renderRightLeg = false; + Minecraft mc = Minecraft.getMinecraft(); + + if (event.entity instanceof EntityPlayer && !(event.entity == mc.thePlayer + && (mc.currentScreen instanceof GuiContainerCreative || mc.currentScreen instanceof GuiInventory)) + && PowerArmour.isWearingCogwork(event.entity) && mc.gameSettings.thirdPersonView != 0) { + IPowerArmour cogwork = (IPowerArmour) event.entity.ridingEntity; + renderHead = cogwork.isArmoured("left_leg"); + renderBody = cogwork.isArmoured("right_leg"); + renderLeftArm = cogwork.isArmoured("left_arm"); + renderRightArm = cogwork.isArmoured("right_arm"); + renderLeftLeg = cogwork.isArmoured("left_leg"); + renderRightLeg = cogwork.isArmoured("right_leg"); + } + + if (event.renderer instanceof RenderPlayer) { + RenderPlayer RP = (RenderPlayer) event.renderer; + ModelBiped[] layers = new ModelBiped[]{RP.modelArmor, RP.modelArmorChestplate}; + + for (ModelBiped model : layers) { + model.bipedHead.isHidden = model.bipedHeadwear.isHidden = model.bipedEars.isHidden = renderHead; + model.bipedBody.isHidden = model.bipedCloak.isHidden = renderBody; + + model.bipedLeftArm.isHidden = renderLeftArm; + model.bipedRightArm.isHidden = renderRightArm; + model.bipedLeftLeg.isHidden = renderLeftLeg; + model.bipedRightLeg.isHidden = renderRightLeg; + } + } + } + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java b/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java index a5455686..3a6357f8 100644 --- a/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.mechanics; -import java.util.List; - import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; @@ -15,101 +13,103 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; +import java.util.List; + /** * This class exists because minecraft hunger seems to decrease faster than * windows stock */ public class ExtendedReachMF { - // SPRINT JUMPING - // DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for - // 4 missing bars) - // SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for - // 4 missing bars) - // EXHAUSTION SCALE = 3.0F = 1hunger - @SubscribeEvent - public void onPlayerTick(TickEvent.PlayerTickEvent event) { - if (event.phase == TickEvent.Phase.END) { - tickEnd(event.player); - } - } + // SPRINT JUMPING + // DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for + // 4 missing bars) + // SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for + // 4 missing bars) + // EXHAUSTION SCALE = 3.0F = 1hunger + @SubscribeEvent + public void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + tickEnd(event.player); + } + } - public void tickEnd(EntityPlayer entityPlayer) { - // If we JUST swung an Item - if (entityPlayer.swingProgressInt == 1) { - ItemStack mainhand = entityPlayer.getCurrentEquippedItem(); - if (mainhand != null && mainhand.getItem() instanceof IExtendedReachWeapon) { - float extendedReach = ((IExtendedReachWeapon) mainhand.getItem()).getReachModifierInBlocks(mainhand); - if (extendedReach > 0) { - MovingObjectPosition mouseOver = getMouseOver(0, extendedReach + 4); - if (mouseOver != null && mouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) { - Entity target = mouseOver.entityHit; - if (target instanceof EntityLiving && target != entityPlayer) { - if (target.hurtResistantTime != ((EntityLiving) target).maxHurtResistantTime) { - FMLClientHandler.instance().getClient().playerController.attackEntity(entityPlayer, - target); - } - } - } - } - } - } - } + public void tickEnd(EntityPlayer entityPlayer) { + // If we JUST swung an Item + if (entityPlayer.swingProgressInt == 1) { + ItemStack mainhand = entityPlayer.getCurrentEquippedItem(); + if (mainhand != null && mainhand.getItem() instanceof IExtendedReachWeapon) { + float extendedReach = ((IExtendedReachWeapon) mainhand.getItem()).getReachModifierInBlocks(mainhand); + if (extendedReach > 0) { + MovingObjectPosition mouseOver = getMouseOver(0, extendedReach + 4); + if (mouseOver != null && mouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) { + Entity target = mouseOver.entityHit; + if (target instanceof EntityLiving && target != entityPlayer) { + if (target.hurtResistantTime != ((EntityLiving) target).maxHurtResistantTime) { + FMLClientHandler.instance().getClient().playerController.attackEntity(entityPlayer, + target); + } + } + } + } + } + } + } - public MovingObjectPosition getMouseOver(float tickPart, float maxDist) { - Minecraft mc = FMLClientHandler.instance().getClient(); - if (mc.renderViewEntity != null) { - if (mc.theWorld != null) { - mc.pointedEntity = null; - double d0 = maxDist; - MovingObjectPosition objectMouseOver = mc.renderViewEntity.rayTrace(d0, tickPart); - double d1 = d0; - Vec3 vec3 = mc.renderViewEntity.getPosition(tickPart); + public MovingObjectPosition getMouseOver(float tickPart, float maxDist) { + Minecraft mc = FMLClientHandler.instance().getClient(); + if (mc.renderViewEntity != null) { + if (mc.theWorld != null) { + mc.pointedEntity = null; + double d0 = maxDist; + MovingObjectPosition objectMouseOver = mc.renderViewEntity.rayTrace(d0, tickPart); + double d1 = d0; + Vec3 vec3 = mc.renderViewEntity.getPosition(tickPart); - if (objectMouseOver != null) { - d1 = objectMouseOver.hitVec.distanceTo(vec3); - } + if (objectMouseOver != null) { + d1 = objectMouseOver.hitVec.distanceTo(vec3); + } - Vec3 vec31 = mc.renderViewEntity.getLook(tickPart); - Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0); - Entity pointedEntity = null; - float f1 = 1.0F; - List list = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.renderViewEntity, - mc.renderViewEntity.boundingBox - .addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand(f1, f1, f1)); - double d2 = d1; + Vec3 vec31 = mc.renderViewEntity.getLook(tickPart); + Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0); + Entity pointedEntity = null; + float f1 = 1.0F; + List list = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.renderViewEntity, + mc.renderViewEntity.boundingBox + .addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand(f1, f1, f1)); + double d2 = d1; - for (int i = 0; i < list.size(); ++i) { - Entity entity = (Entity) list.get(i); + for (int i = 0; i < list.size(); ++i) { + Entity entity = (Entity) list.get(i); - if (entity.canBeCollidedWith()) { - float f2 = entity.getCollisionBorderSize(); - AxisAlignedBB axisalignedbb = entity.boundingBox.expand(f2, f2, f2); - MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32); + if (entity.canBeCollidedWith()) { + float f2 = entity.getCollisionBorderSize(); + AxisAlignedBB axisalignedbb = entity.boundingBox.expand(f2, f2, f2); + MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32); - if (axisalignedbb.isVecInside(vec3)) { - if (0.0D < d2 || d2 == 0.0D) { - pointedEntity = entity; - d2 = 0.0D; - } - } else if (movingobjectposition != null) { - double d3 = vec3.distanceTo(movingobjectposition.hitVec); + if (axisalignedbb.isVecInside(vec3)) { + if (0.0D < d2 || d2 == 0.0D) { + pointedEntity = entity; + d2 = 0.0D; + } + } else if (movingobjectposition != null) { + double d3 = vec3.distanceTo(movingobjectposition.hitVec); - if (d3 < d2 || d2 == 0.0D) { - pointedEntity = entity; - d2 = d3; - } - } - } - } + if (d3 < d2 || d2 == 0.0D) { + pointedEntity = entity; + d2 = d3; + } + } + } + } - if (pointedEntity != null && (d2 < d1 || objectMouseOver == null)) { - objectMouseOver = new MovingObjectPosition(pointedEntity); - } + if (pointedEntity != null && (d2 < d1 || objectMouseOver == null)) { + objectMouseOver = new MovingObjectPosition(pointedEntity); + } - return objectMouseOver; - } - } - return null; - } + return objectMouseOver; + } + } + return null; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/HitSoundGenerator.java b/src/main/java/minefantasy/mf2/mechanics/HitSoundGenerator.java index e5d0fb25..d475ea8b 100644 --- a/src/main/java/minefantasy/mf2/mechanics/HitSoundGenerator.java +++ b/src/main/java/minefantasy/mf2/mechanics/HitSoundGenerator.java @@ -10,46 +10,46 @@ import net.minecraft.world.WorldServer; public class HitSoundGenerator { - public static void makeHitSound(ItemStack weapon, Entity target) { - WeaponClass WC = WeaponClass.findClassForAny(weapon); - String material = "metal"; - String type = "blunt"; + public static void makeHitSound(ItemStack weapon, Entity target) { + WeaponClass WC = WeaponClass.findClassForAny(weapon); + String material = "metal"; + String type = "blunt"; - material = getMaterial(material, weapon); - if (WC != null) { - type = WC.getSound(); - String sndString = "minefantasy2:weapon.hit." + type + "." + material; + material = getMaterial(material, weapon); + if (WC != null) { + type = WC.getSound(); + String sndString = "minefantasy2:weapon.hit." + type + "." + material; - if (!target.worldObj.isRemote) { - ((WorldServer) target.worldObj).getEntityTracker().func_151248_b(target, - new HitSoundPacket(sndString, target).generatePacket()); - } - } - } + if (!target.worldObj.isRemote) { + ((WorldServer) target.worldObj).getEntityTracker().func_151248_b(target, + new HitSoundPacket(sndString, target).generatePacket()); + } + } + } - public static String getMaterial(String material, ItemStack itemstack) { - if (itemstack == null) { - return "metal"; - } - Item item = itemstack.getItem(); - if (item instanceof ItemTool) { - if (((ItemTool) item).getToolMaterialName().equalsIgnoreCase("WOOD")) { - material = "wood"; - } - if (((ItemTool) item).getToolMaterialName().equalsIgnoreCase("STONE")) { - material = "stone"; - } - } + public static String getMaterial(String material, ItemStack itemstack) { + if (itemstack == null) { + return "metal"; + } + Item item = itemstack.getItem(); + if (item instanceof ItemTool) { + if (((ItemTool) item).getToolMaterialName().equalsIgnoreCase("WOOD")) { + material = "wood"; + } + if (((ItemTool) item).getToolMaterialName().equalsIgnoreCase("STONE")) { + material = "stone"; + } + } - if (item instanceof ItemSword) { - if (((ItemSword) item).getToolMaterialName().equalsIgnoreCase("WOOD")) { - material = "wood"; - } - if (((ItemSword) item).getToolMaterialName().equalsIgnoreCase("STONE")) { - material = "stone"; - } - } + if (item instanceof ItemSword) { + if (((ItemSword) item).getToolMaterialName().equalsIgnoreCase("WOOD")) { + material = "wood"; + } + if (((ItemSword) item).getToolMaterialName().equalsIgnoreCase("STONE")) { + material = "stone"; + } + } - return material; - } + return material; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/MFArrowDispenser.java b/src/main/java/minefantasy/mf2/mechanics/MFArrowDispenser.java index ef97eeee..458cede4 100644 --- a/src/main/java/minefantasy/mf2/mechanics/MFArrowDispenser.java +++ b/src/main/java/minefantasy/mf2/mechanics/MFArrowDispenser.java @@ -11,41 +11,41 @@ import net.minecraft.world.World; public class MFArrowDispenser extends BehaviorDefaultDispenseItem { - /** - * Dispense the specified stack, play the dispense sound and spawn particles. - */ - public ItemStack dispenseStack(IBlockSource dispenser, ItemStack item) { - World world = dispenser.getWorld(); - IPosition iposition = BlockDispenser.func_149939_a(dispenser); - EnumFacing direction = BlockDispenser.func_149937_b(dispenser.getBlockMetadata()); - double posX = dispenser.getX() + (direction.getFrontOffsetX()); - double posY = dispenser.getY() + (direction.getFrontOffsetY()); - double posZ = dispenser.getZ() + (direction.getFrontOffsetZ()); + /** + * Dispense the specified stack, play the dispense sound and spawn particles. + */ + public ItemStack dispenseStack(IBlockSource dispenser, ItemStack item) { + World world = dispenser.getWorld(); + IPosition iposition = BlockDispenser.func_149939_a(dispenser); + EnumFacing direction = BlockDispenser.func_149937_b(dispenser.getBlockMetadata()); + double posX = dispenser.getX() + (direction.getFrontOffsetX()); + double posY = dispenser.getY() + (direction.getFrontOffsetY()); + double posZ = dispenser.getZ() + (direction.getFrontOffsetZ()); - if (item.getItem() instanceof ItemArrowMF) { - ItemArrowMF arrowitem = (ItemArrowMF) item.getItem(); - EntityArrowMF arrow = arrowitem.getFiredArrow(new EntityArrowMF(world, posX, posY, posZ), item); - arrow.setThrowableHeading(direction.getFrontOffsetX(), direction.getFrontOffsetY() + 0.1F, - direction.getFrontOffsetZ(), this.func_82500_b(), this.func_82498_a()); - world.spawnEntityInWorld(arrow); - arrow.canBePickedUp = 1; - item.splitStack(1); - } - return item; - } + if (item.getItem() instanceof ItemArrowMF) { + ItemArrowMF arrowitem = (ItemArrowMF) item.getItem(); + EntityArrowMF arrow = arrowitem.getFiredArrow(new EntityArrowMF(world, posX, posY, posZ), item); + arrow.setThrowableHeading(direction.getFrontOffsetX(), direction.getFrontOffsetY() + 0.1F, + direction.getFrontOffsetZ(), this.func_82500_b(), this.func_82498_a()); + world.spawnEntityInWorld(arrow); + arrow.canBePickedUp = 1; + item.splitStack(1); + } + return item; + } - /** - * Play the dispense sound from the specified block. - */ - protected void playDispenseSound(IBlockSource p_82485_1_) { - p_82485_1_.getWorld().playAuxSFX(1002, p_82485_1_.getXInt(), p_82485_1_.getYInt(), p_82485_1_.getZInt(), 0); - } + /** + * Play the dispense sound from the specified block. + */ + protected void playDispenseSound(IBlockSource p_82485_1_) { + p_82485_1_.getWorld().playAuxSFX(1002, p_82485_1_.getXInt(), p_82485_1_.getYInt(), p_82485_1_.getZInt(), 0); + } - protected float func_82498_a() { - return 6.0F; - } + protected float func_82498_a() { + return 6.0F; + } - protected float func_82500_b() { - return 1.1F; - } + protected float func_82500_b() { + return 1.1F; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java b/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java index 13666d3e..06f578a9 100644 --- a/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java +++ b/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java @@ -1,7 +1,5 @@ package minefantasy.mf2.mechanics; -import java.util.Random; - import cpw.mods.fml.common.eventhandler.SubscribeEvent; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.material.CustomMaterial; @@ -11,178 +9,171 @@ import minefantasy.mf2.item.weapon.ItemWeaponMF; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.monster.EntityCreeper; -import net.minecraft.entity.monster.EntityPigZombie; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.monster.EntityWitch; -import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.monster.*; import net.minecraft.init.Items; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; public class MonsterUpgrader { - private static final float zombieWepChance = 10F; - private static final float zombieKnightChance = 200F; - private static final float zombieBruteChance = 200F; - - private static final float creeperJockeyChance = 60F; - private static final float witchRiderChance = 100F; - - public static final String zombieArmourNBT = "MF_ZombieArmour"; - - public void upgradeMob(EntityLivingBase mob) { - int diff = mob.worldObj.difficultySetting.getDifficultyId(); - - if (ConfigHardcore.upgradeZombieWep) { - if (mob instanceof EntitySkeleton) { - if (((EntitySkeleton) mob).getSkeletonType() == 1) { - giveEntityWeapon(mob, "Diamond", MineFantasyII.random.nextInt(8)); - } else if (CombatMechanics.swordSkeleton && MineFantasyII.random.nextInt(3) == 0) { - mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_sword.construct("Bronze", "OakWood")); - ((EntitySkeleton) mob).setCombatTask(); - } - } else if (mob instanceof EntityZombie) { - String tier = "Iron"; - if (mob instanceof EntityPigZombie) { - tier = "Obsidian"; - giveEntityWeapon(mob, tier, MineFantasyII.random.nextInt(7)); - if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { - mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); - } - } else { - if (mob.getHeldItem() != null && mob.getHeldItem().getItem() == Items.iron_sword) { - giveEntityWeapon(mob, tier, 0); - if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { - mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); - } - } else { - float mod = diff >= 2 ? ConfigHardcore.zombieWepChance * 2 - : diff < 1 ? ConfigHardcore.zombieWepChance / 2 : ConfigHardcore.zombieWepChance; - float chance = MineFantasyII.random.nextFloat() * 100F * mod; - if (chance >= (100F - zombieWepChance)) { - giveEntityWeapon(mob, tier, MineFantasyII.random.nextInt(5)); - if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { - mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); - } - } - } - } - if (MineFantasyII.random.nextFloat() * (zombieKnightChance) < diff) { - createZombieKnight((EntityZombie) mob); - } else if (MineFantasyII.random.nextFloat() * (zombieBruteChance) < diff) { - createZombieBrute((EntityZombie) mob); - } else if (ConfigHardcore.fastZombies) { - mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3F); - } - } - } else if (mob instanceof EntitySpider) { - if (mob.riddenByEntity == null) { - if (MineFantasyII.random.nextFloat() * (witchRiderChance) < diff) { - EntityWitch rider = new EntityWitch(mob.worldObj); - rider.setPosition(mob.posX, mob.posY, mob.posZ); - mob.worldObj.spawnEntityInWorld(rider); - rider.mountEntity(mob); - } else if (MineFantasyII.random.nextFloat() * (creeperJockeyChance) < diff) { - EntityCreeper rider = new EntityCreeper(mob.worldObj); - rider.setPosition(mob.posX, mob.posY, mob.posZ); - mob.worldObj.spawnEntityInWorld(rider); - rider.mountEntity(mob); - } - } - } else { - if (mob.getHeldItem() != null && mob.getHeldItem().getItem() == Items.iron_sword) { - giveEntityWeapon(mob, "iron", 0); - } - } - if (mob instanceof EntityPigZombie) { - mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); - } - } - - private void createZombieKnight(EntityZombie mob) { - if (mob.isChild()) - return; - String tier = "steel"; - int lootId = 0; - if (mob instanceof EntityPigZombie) { - lootId = 1; - tier = "encrusted"; - } - mob.setVillager(false); - mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); - mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_greatsword.construct(tier, "OakWood")); - setArmour(mob, 1, tier); - mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.2F); - mob.getEntityData().setInteger("MF_LootDrop", lootId); - } - - private void setArmour(EntityLivingBase mob, int id, String tier) { - if (id == 1) { - mob.setCurrentItemOrArmor(1, CustomArmourListMF.standard_plate_boots.construct(tier)); - mob.setCurrentItemOrArmor(2, CustomArmourListMF.standard_plate_legs.construct(tier)); - mob.setCurrentItemOrArmor(3, CustomArmourListMF.standard_plate_chest.construct(tier)); - mob.setCurrentItemOrArmor(4, CustomArmourListMF.standard_plate_helmet.construct(tier)); - return; - } - mob.setCurrentItemOrArmor(1, CustomArmourListMF.standard_chain_boots.construct(tier)); - mob.setCurrentItemOrArmor(2, CustomArmourListMF.standard_chain_legs.construct(tier)); - mob.setCurrentItemOrArmor(3, CustomArmourListMF.standard_chain_chest.construct(tier)); - mob.setCurrentItemOrArmor(4, CustomArmourListMF.standard_chain_helmet.construct(tier)); - } - - private void createZombieBrute(EntityZombie mob) { - if (mob.isChild()) - return; - String tier = "iron"; - int lootId = 0; - if (mob instanceof EntityPigZombie) { - lootId = 1; - tier = "encrusted"; - } - mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); - mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_waraxe.construct(tier, "OakWood")); - setArmour(mob, 0, tier); - mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.35F); - mob.getEntityData().setInteger("MF_LootDrop", lootId); - } - - /** - * 1=Axe.....2=Mace.....3=dagger.....4=spear.....else sword - */ - private void giveEntityWeapon(EntityLivingBase mob, String tier, int weaponType) { - if (CustomMaterial.getMaterial(tier) == null) - return; - - ItemWeaponMF weapon = CustomToolListMF.standard_sword; - if (weaponType == 1) { - weapon = CustomToolListMF.standard_waraxe; - } - if (weaponType == 2) { - weapon = CustomToolListMF.standard_mace; - } - if (weaponType == 3) { - weapon = CustomToolListMF.standard_dagger; - } - if (weaponType == 4) { - weapon = CustomToolListMF.standard_spear; - } - - if (mob != null && weapon != null) { - mob.setCurrentItemOrArmor(0, weapon.construct(tier, "OakWood")); - } - } - - @SubscribeEvent - public void updateLiving(LivingUpdateEvent event) { - EntityLivingBase living = event.entityLiving; - - if (isEnabled() && !living.worldObj.isRemote && !living.getEntityData().hasKey("giveMFWeapon")) { - living.getEntityData().setBoolean("giveMFWeapon", true); - upgradeMob(event.entityLiving); - } - } - - private boolean isEnabled() { - return true; - } + public static final String zombieArmourNBT = "MF_ZombieArmour"; + private static final float zombieWepChance = 10F; + private static final float zombieKnightChance = 200F; + private static final float zombieBruteChance = 200F; + private static final float creeperJockeyChance = 60F; + private static final float witchRiderChance = 100F; + + public void upgradeMob(EntityLivingBase mob) { + int diff = mob.worldObj.difficultySetting.getDifficultyId(); + + if (ConfigHardcore.upgradeZombieWep) { + if (mob instanceof EntitySkeleton) { + if (((EntitySkeleton) mob).getSkeletonType() == 1) { + giveEntityWeapon(mob, "Diamond", MineFantasyII.random.nextInt(8)); + } else if (CombatMechanics.swordSkeleton && MineFantasyII.random.nextInt(3) == 0) { + mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_sword.construct("Bronze", "OakWood")); + ((EntitySkeleton) mob).setCombatTask(); + } + } else if (mob instanceof EntityZombie) { + String tier = "Iron"; + if (mob instanceof EntityPigZombie) { + tier = "Obsidian"; + giveEntityWeapon(mob, tier, MineFantasyII.random.nextInt(7)); + if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { + mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); + } + } else { + if (mob.getHeldItem() != null && mob.getHeldItem().getItem() == Items.iron_sword) { + giveEntityWeapon(mob, tier, 0); + if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { + mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); + } + } else { + float mod = diff >= 2 ? ConfigHardcore.zombieWepChance * 2 + : diff < 1 ? ConfigHardcore.zombieWepChance / 2 : ConfigHardcore.zombieWepChance; + float chance = MineFantasyII.random.nextFloat() * 100F * mod; + if (chance >= (100F - zombieWepChance)) { + giveEntityWeapon(mob, tier, MineFantasyII.random.nextInt(5)); + if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { + mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); + } + } + } + } + if (MineFantasyII.random.nextFloat() * (zombieKnightChance) < diff) { + createZombieKnight((EntityZombie) mob); + } else if (MineFantasyII.random.nextFloat() * (zombieBruteChance) < diff) { + createZombieBrute((EntityZombie) mob); + } else if (ConfigHardcore.fastZombies) { + mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3F); + } + } + } else if (mob instanceof EntitySpider) { + if (mob.riddenByEntity == null) { + if (MineFantasyII.random.nextFloat() * (witchRiderChance) < diff) { + EntityWitch rider = new EntityWitch(mob.worldObj); + rider.setPosition(mob.posX, mob.posY, mob.posZ); + mob.worldObj.spawnEntityInWorld(rider); + rider.mountEntity(mob); + } else if (MineFantasyII.random.nextFloat() * (creeperJockeyChance) < diff) { + EntityCreeper rider = new EntityCreeper(mob.worldObj); + rider.setPosition(mob.posX, mob.posY, mob.posZ); + mob.worldObj.spawnEntityInWorld(rider); + rider.mountEntity(mob); + } + } + } else { + if (mob.getHeldItem() != null && mob.getHeldItem().getItem() == Items.iron_sword) { + giveEntityWeapon(mob, "iron", 0); + } + } + if (mob instanceof EntityPigZombie) { + mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); + } + } + + private void createZombieKnight(EntityZombie mob) { + if (mob.isChild()) + return; + String tier = "steel"; + int lootId = 0; + if (mob instanceof EntityPigZombie) { + lootId = 1; + tier = "encrusted"; + } + mob.setVillager(false); + mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); + mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_greatsword.construct(tier, "OakWood")); + setArmour(mob, 1, tier); + mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.2F); + mob.getEntityData().setInteger("MF_LootDrop", lootId); + } + + private void setArmour(EntityLivingBase mob, int id, String tier) { + if (id == 1) { + mob.setCurrentItemOrArmor(1, CustomArmourListMF.standard_plate_boots.construct(tier)); + mob.setCurrentItemOrArmor(2, CustomArmourListMF.standard_plate_legs.construct(tier)); + mob.setCurrentItemOrArmor(3, CustomArmourListMF.standard_plate_chest.construct(tier)); + mob.setCurrentItemOrArmor(4, CustomArmourListMF.standard_plate_helmet.construct(tier)); + return; + } + mob.setCurrentItemOrArmor(1, CustomArmourListMF.standard_chain_boots.construct(tier)); + mob.setCurrentItemOrArmor(2, CustomArmourListMF.standard_chain_legs.construct(tier)); + mob.setCurrentItemOrArmor(3, CustomArmourListMF.standard_chain_chest.construct(tier)); + mob.setCurrentItemOrArmor(4, CustomArmourListMF.standard_chain_helmet.construct(tier)); + } + + private void createZombieBrute(EntityZombie mob) { + if (mob.isChild()) + return; + String tier = "iron"; + int lootId = 0; + if (mob instanceof EntityPigZombie) { + lootId = 1; + tier = "encrusted"; + } + mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); + mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_waraxe.construct(tier, "OakWood")); + setArmour(mob, 0, tier); + mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.35F); + mob.getEntityData().setInteger("MF_LootDrop", lootId); + } + + /** + * 1=Axe.....2=Mace.....3=dagger.....4=spear.....else sword + */ + private void giveEntityWeapon(EntityLivingBase mob, String tier, int weaponType) { + if (CustomMaterial.getMaterial(tier) == null) + return; + + ItemWeaponMF weapon = CustomToolListMF.standard_sword; + if (weaponType == 1) { + weapon = CustomToolListMF.standard_waraxe; + } + if (weaponType == 2) { + weapon = CustomToolListMF.standard_mace; + } + if (weaponType == 3) { + weapon = CustomToolListMF.standard_dagger; + } + if (weaponType == 4) { + weapon = CustomToolListMF.standard_spear; + } + + if (mob != null && weapon != null) { + mob.setCurrentItemOrArmor(0, weapon.construct(tier, "OakWood")); + } + } + + @SubscribeEvent + public void updateLiving(LivingUpdateEvent event) { + EntityLivingBase living = event.entityLiving; + + if (isEnabled() && !living.worldObj.isRemote && !living.getEntityData().hasKey("giveMFWeapon")) { + living.getEntityData().setBoolean("giveMFWeapon", true); + upgradeMob(event.entityLiving); + } + } + + private boolean isEnabled() { + return true; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java b/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java index 72063689..2d833c36 100644 --- a/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java @@ -1,9 +1,5 @@ package minefantasy.mf2.mechanics; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; import cpw.mods.fml.common.gameevent.TickEvent; @@ -30,42 +26,176 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StatCollector; +import net.minecraft.util.*; import net.minecraft.world.EnumDifficulty; +import java.util.Iterator; +import java.util.List; + public class PlayerTickHandlerMF { - private static ItemStack lastStack; - - // SPRINT JUMPING - // DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for - // 4 missing bars) - // SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for - // 4 missing bars) - // EXHAUSTION SCALE = 3.0F = 1hunger - @SubscribeEvent - public void onPlayerTick(TickEvent.PlayerTickEvent event) { - if (event.phase == TickEvent.Phase.END) { - ItemStack held = event.player.getHeldItem(); - if (held != null) { - int parry = ItemWeaponMF.getParry(held); - if (parry > 0) { - ItemWeaponMF.setParry(held, parry - 1); - } - } - - // COMMON - TacticalManager.applyArmourWeight(event.player); - - if (event.player.worldObj.isRemote) { - if (isNextStep(event.player)) { - onStep(event.player, event.player.getEntityData().getInteger(stepNBT) % 2 == 0); - } - } - /* + private static ItemStack lastStack; + private static String stepNBT = "MF_LastStep"; + private static String chunkCoords = "MF_BedPos"; + private static String resetBed = "MF_Resetbed"; + + public static void spawnDragon(EntityPlayer player) { + spawnDragon(player, 64); + } + + public static void spawnDragon(EntityPlayer player, int offset) { + int y = (int) (player.posY + offset); + boolean canMobSpawn = !player.worldObj.isRemote && canDragonSpawnOnPlayer(player, y); + if (canMobSpawn && !player.worldObj.isRemote) { + int tier = getDragonTier(player);// Gets tier on kills + EntityDragon dragon = new EntityDragon(player.worldObj); + dragon.setPosition(player.posX, y, player.posZ); + player.worldObj.spawnEntityInWorld(dragon); + dragon.setDragon(tier); + dragon.disengage(100); + player.worldObj.playSoundEffect(dragon.posX, dragon.posY - 16D, dragon.posZ, "mob.enderdragon.growl", 3.0F, + 1.5F); + dragon.fireBreathCooldown = 200; + + if (ConfigMobs.dragonMSG && !player.worldObj.isRemote) { + player.addChatMessage(new ChatComponentText( + EnumChatFormatting.GOLD + StatCollector.translateToLocal("event.dragonnear.name"))); + + List list = player.worldObj.playerEntities; + Iterator players = list.iterator(); + while (players.hasNext()) { + Object instance = players.next(); + if (instance != null && instance instanceof EntityPlayer) { + if (((EntityPlayer) instance).getDistanceToEntity(player) < 256D && instance != player) { + ((EntityPlayer) instance).addChatMessage(new ChatComponentText( + EnumChatFormatting.GOLD + StatCollector.translateToLocal("event.dragonnear.name"))); + } + } + } + } + } + } + + private static boolean canDragonSpawnOnPlayer(EntityPlayer player, int y) { + for (int x = -3; x <= 3; x++) { + for (int z = -3; z <= 3; z++) { + if (!player.worldObj.canBlockSeeTheSky((int) player.posX + x, y, (int) player.posZ + z)) { + return false; + } + } + } + return true; + } + + public static int getDragonTier(EntityPlayer player) { + int kills = getDragonEnemyPoints(player); + if (kills < 5) { + return 0;// Young 100% + } + if (kills < 10) { + if (MineFantasyII.random.nextInt(5) == 0) + return 0;// 20% chance for Young + return 1;// Adult + } + if (kills < 15) { + if (MineFantasyII.random.nextInt(10) == 0) + return 0;// 10% chance for Young + return 1;// Adult + } + if (kills < 25) { + if (MineFantasyII.random.nextInt(20) == 0) + return 0;// 5% chance for Young + if (MineFantasyII.random.nextInt(10) == 0) + return 2;// 10% chance for Mature + return 1;// Adult + } + if (kills < 35) { + if (MineFantasyII.random.nextInt(4) == 0) + return 2;// 25% chance for Mature + return 1;// Adult + } + if (kills >= 50) { + if (MineFantasyII.random.nextInt(10) == 0) + return 1;// 10% chance for Adult + if (MineFantasyII.random.nextInt(5) == 0) + return 3;// 20% chance Elder + return 2;// Mature + } + if (kills > 75) { + if (MineFantasyII.random.nextInt(100) == 0) + return 4;// 1% chance Ancient + if (MineFantasyII.random.nextInt(2) == 0) + return 3;// 50% chance Elder + return 2;// Mature + } + + return 0;// Young 100% + } + + public static void addDragonKill(EntityPlayer player) { + addDragonEnemyPts(player, 1); + } + + public static void addDragonEnemyPts(EntityPlayer player, int i) { + setDragonEnemyPts(player, getDragonEnemyPoints(player) + i); + } + + public static void setDragonEnemyPts(EntityPlayer player, int i) { + if (i < 0) { + i = 0; + } + NBTTagCompound nbt = PlayerTagData.getPersistedData(player); + nbt.setInteger("MF_DragonKills", i); + } + + public static int getDragonEnemyPoints(EntityPlayer player) { + NBTTagCompound nbt = PlayerTagData.getPersistedData(player); + return nbt.getInteger("MF_DragonKills"); + } + + public static void wakeUp(EntityPlayer player) { + if (StaminaBar.isSystemActive) { + StaminaBar.setStaminaValue(player, StaminaBar.getBaseMaxStamina(player)); + } + if (player.getEntityData().hasKey(chunkCoords + "_x")) { + player.getEntityData().setBoolean(resetBed, true); + } + } + + public static void readyToResetBedPosition(EntityPlayer player) { + ChunkCoordinates coords = player.getBedLocation(player.dimension); + if (coords != null) { + player.getEntityData().setInteger(chunkCoords + "_x", coords.posX); + player.getEntityData().setInteger(chunkCoords + "_y", coords.posY); + player.getEntityData().setInteger(chunkCoords + "_z", coords.posZ); + } + } + + // SPRINT JUMPING + // DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for + // 4 missing bars) + // SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for + // 4 missing bars) + // EXHAUSTION SCALE = 3.0F = 1hunger + @SubscribeEvent + public void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + ItemStack held = event.player.getHeldItem(); + if (held != null) { + int parry = ItemWeaponMF.getParry(held); + if (parry > 0) { + ItemWeaponMF.setParry(held, parry - 1); + } + } + + // COMMON + TacticalManager.applyArmourWeight(event.player); + + if (event.player.worldObj.isRemote) { + if (isNextStep(event.player)) { + onStep(event.player, event.player.getEntityData().getInteger(stepNBT) % 2 == 0); + } + } + /* * if(RPGElements.isSystemActive) { if(event.player.isSprinting() && * event.player.ticksExisted % 10 == 0) { * SkillList.athletics.addXP(event.player, 1); } else @@ -73,337 +203,200 @@ public void onPlayerTick(TickEvent.PlayerTickEvent event) { * && event.player.ticksExisted % 10 == 0) { SkillList.sneak.addXP(event.player, * 1); } } */ - // DRAGON EVENT - if (!event.player.worldObj.isRemote) { - tickDragonSpawner(event.player); - } - if (!event.player.worldObj.isRemote) { - tryResetBed(event.player); - } - // updatePitch(event.player); (This keeps track of player camera angles, could - // make a mechanic based on swinging the camera) - } - - if (event.phase == TickEvent.Phase.START) { - applyBalance(event.player); - ItemFoodMF.onTick(event.player); - - if (!event.player.worldObj.isRemote - && !(!ConfigHardcore.HCChotBurn && ItemApron.isUserProtected(event.player)) - && event.player.ticksExisted % 100 == 0) { - for (int a = 0; a < event.player.inventory.getSizeInventory(); a++) { - ItemStack item = event.player.inventory.getStackInSlot(a); - if (item != null && item.getItem() instanceof IHotItem) { - event.player.setFire(5); - event.player.attackEntityFrom(DamageSource.onFire, 1.0F); - } - } - } - if (event.player.worldObj.isRemote) { - ItemStack item = event.player.getHeldItem(); - if (lastStack == null && item != null) { - if (item.getItem() instanceof IFirearm) { - NBTTagCompound nbt = AmmoMechanicsMF.getNBT(item); - if (nbt.hasKey(ItemCrossbow.useTypeNBT) - && nbt.getString(ItemCrossbow.useTypeNBT).equalsIgnoreCase("fire")) { - nbt.setString(ItemCrossbow.useTypeNBT, "null"); - } - } - } - if (lastStack != null && (item == null || item != lastStack)) { - if (lastStack.getItem() instanceof IFirearm) { - NBTTagCompound nbt = AmmoMechanicsMF.getNBT(lastStack); - if (nbt.hasKey(ItemCrossbow.useTypeNBT) - && nbt.getString(ItemCrossbow.useTypeNBT).equalsIgnoreCase("fire")) { - nbt.setString(ItemCrossbow.useTypeNBT, "null"); - } - } - } - lastStack = item; - } - - float weight = ArmourCalculator.getTotalWeightOfWorn(event.player, false); - if (weight > 100F) { - if (event.player.isInWater()) { - event.player.motionY -= (weight / 20000F); - } - } - } - } - - private void onStep(EntityPlayer player, boolean alternateStep) { - if (ArmourCalculator.getTotalWeightOfWorn(player, false) >= 50) { - player.playSound("mob.irongolem.throw", 1.0F, 1.0F); - } - } - - private static String stepNBT = "MF_LastStep"; - - private boolean isNextStep(EntityPlayer player) { - int prevStep = player.getEntityData().getInteger(stepNBT); - int stepcount = (int) player.distanceWalkedOnStepModified; - player.getEntityData().setInteger(stepNBT, stepcount); - - return prevStep != stepcount; - } - - /* - * private static String lastPitchNBT = "MF_last_AimPitch"; public static void - * setLastPitch(EntityPlayer user, float value) { - * user.getEntityData().setFloat(lastPitchNBT, value); } public static void - * updatePitch(EntityPlayer user) { user.getEntityData().setFloat(lastPitchNBT, - * user.rotationPitch); } public static float getPitchMovement(EntityPlayer - * user) { float lastPitch = user.getEntityData().getFloat(lastPitchNBT) + - * 1000F; float nowPitch = user.rotationPitch + 1000F; - * - * return nowPitch - lastPitch; } - */ - private void tickDragonSpawner(EntityPlayer player) { - if (player.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && player.dimension == 0) { - int i = ConfigMobs.dragonInterval; - float chance = ConfigMobs.dragonChance; - - if (PlayerTickHandlerMF.getDragonEnemyPoints(player) >= 100) { - i /= 2;// twice as frequent - } - if (PlayerTickHandlerMF.getDragonEnemyPoints(player) >= 50) { - chance *= 2;// twice the chance - } - if (!player.worldObj.isRemote && player.worldObj.getTotalWorldTime() % i == 0 - && MineFantasyII.random.nextFloat() * 100F < chance) { - spawnDragon(player); - } - } - } - - public static void spawnDragon(EntityPlayer player) { - spawnDragon(player, 64); - } - - public static void spawnDragon(EntityPlayer player, int offset) { - int y = (int) (player.posY + offset); - boolean canMobSpawn = !player.worldObj.isRemote && canDragonSpawnOnPlayer(player, y); - if (canMobSpawn && !player.worldObj.isRemote) { - int tier = getDragonTier(player);// Gets tier on kills - EntityDragon dragon = new EntityDragon(player.worldObj); - dragon.setPosition(player.posX, y, player.posZ); - player.worldObj.spawnEntityInWorld(dragon); - dragon.setDragon(tier); - dragon.disengage(100); - player.worldObj.playSoundEffect(dragon.posX, dragon.posY - 16D, dragon.posZ, "mob.enderdragon.growl", 3.0F, - 1.5F); - dragon.fireBreathCooldown = 200; - - if (ConfigMobs.dragonMSG && !player.worldObj.isRemote) { - player.addChatMessage(new ChatComponentText( - EnumChatFormatting.GOLD + StatCollector.translateToLocal("event.dragonnear.name"))); - - List list = player.worldObj.playerEntities; - Iterator players = list.iterator(); - while (players.hasNext()) { - Object instance = players.next(); - if (instance != null && instance instanceof EntityPlayer) { - if (((EntityPlayer) instance).getDistanceToEntity(player) < 256D && instance != player) { - ((EntityPlayer) instance).addChatMessage(new ChatComponentText( - EnumChatFormatting.GOLD + StatCollector.translateToLocal("event.dragonnear.name"))); - } - } - } - } - } - } - - private static boolean canDragonSpawnOnPlayer(EntityPlayer player, int y) { - for (int x = -3; x <= 3; x++) { - for (int z = -3; z <= 3; z++) { - if (!player.worldObj.canBlockSeeTheSky((int) player.posX + x, y, (int) player.posZ + z)) { - return false; - } - } - } - return true; - } - - private void applyBalance(EntityPlayer entityPlayer) { - float weight = 2.0F; - float pitchBalance = entityPlayer.getEntityData().hasKey("MF_Balance_Pitch") - ? entityPlayer.getEntityData().getFloat("MF_Balance_Pitch") - : 0F; - float yawBalance = entityPlayer.getEntityData().hasKey("MF_Balance_Yaw") - ? entityPlayer.getEntityData().getFloat("MF_Balance_Yaw") - : 0F; - - if (pitchBalance > 0) { - if (pitchBalance < 1.0F && pitchBalance > -1.0F) - weight = pitchBalance; - pitchBalance -= weight; - - if (ConfigWeapon.useBalance) { - entityPlayer.rotationPitch += pitchBalance > 0 ? weight : -weight; - } - - if (pitchBalance < 0) - pitchBalance = 0; - } - if (yawBalance > 0) { - if (yawBalance < 1.0F && yawBalance > -1.0F) - weight = yawBalance; - yawBalance -= weight; - - if (ConfigWeapon.useBalance) { - MFLogUtil.logDebug("Weapon Balance Move"); - entityPlayer.rotationYaw += yawBalance > 0 ? weight : -weight; - } - - if (yawBalance < 0) - yawBalance = 0; - } - entityPlayer.getEntityData().setFloat("MF_Balance_Pitch", pitchBalance); - entityPlayer.getEntityData().setFloat("MF_Balance_Yaw", yawBalance); - } - - @SubscribeEvent - public void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { - onPlayerEnterWorld(event.player); - } - - @SubscribeEvent - public void onPlayerTravel(PlayerEvent.PlayerChangedDimensionEvent event) { - onPlayerEnterWorld(event.player); - } - - @SubscribeEvent - public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { - onPlayerEnterWorld(event.player); - } - - public void onPlayerEnterWorld(EntityPlayer player) { - if (player.worldObj.isRemote) - return; - - NBTTagCompound persist = PlayerTagData.getPersistedData(player); - MFLogUtil.logDebug("Sync data"); - ResearchLogic.syncData(player); - - if (!persist.hasKey("MF_HasBook")) { - persist.setBoolean("MF_HasBook", true); - if (player.capabilities.isCreativeMode) - return; - - player.inventory.addItemStackToInventory(new ItemStack(ToolListMF.researchBook)); - } - if (RPGElements.isSystemActive) { - RPGElements.initSkills(player); - } - } - - public static int getDragonTier(EntityPlayer player) { - int kills = getDragonEnemyPoints(player); - if (kills < 5) { - return 0;// Young 100% - } - if (kills < 10) { - if (MineFantasyII.random.nextInt(5) == 0) - return 0;// 20% chance for Young - return 1;// Adult - } - if (kills < 15) { - if (MineFantasyII.random.nextInt(10) == 0) - return 0;// 10% chance for Young - return 1;// Adult - } - if (kills < 25) { - if (MineFantasyII.random.nextInt(20) == 0) - return 0;// 5% chance for Young - if (MineFantasyII.random.nextInt(10) == 0) - return 2;// 10% chance for Mature - return 1;// Adult - } - if (kills < 35) { - if (MineFantasyII.random.nextInt(4) == 0) - return 2;// 25% chance for Mature - return 1;// Adult - } - if (kills >= 50) { - if (MineFantasyII.random.nextInt(10) == 0) - return 1;// 10% chance for Adult - if (MineFantasyII.random.nextInt(5) == 0) - return 3;// 20% chance Elder - return 2;// Mature - } - if (kills > 75) { - if (MineFantasyII.random.nextInt(100) == 0) - return 4;// 1% chance Ancient - if (MineFantasyII.random.nextInt(2) == 0) - return 3;// 50% chance Elder - return 2;// Mature - } - - return 0;// Young 100% - } - - public static void addDragonKill(EntityPlayer player) { - addDragonEnemyPts(player, 1); - } - - public static void addDragonEnemyPts(EntityPlayer player, int i) { - setDragonEnemyPts(player, getDragonEnemyPoints(player) + i); - } - - public static void setDragonEnemyPts(EntityPlayer player, int i) { - if (i < 0) { - i = 0; - } - NBTTagCompound nbt = PlayerTagData.getPersistedData(player); - nbt.setInteger("MF_DragonKills", i); - } - - public static int getDragonEnemyPoints(EntityPlayer player) { - NBTTagCompound nbt = PlayerTagData.getPersistedData(player); - return nbt.getInteger("MF_DragonKills"); - } - - private static String chunkCoords = "MF_BedPos"; - private static String resetBed = "MF_Resetbed"; - - public static void wakeUp(EntityPlayer player) { - if (StaminaBar.isSystemActive) { - StaminaBar.setStaminaValue(player, StaminaBar.getBaseMaxStamina(player)); - } - if (player.getEntityData().hasKey(chunkCoords + "_x")) { - player.getEntityData().setBoolean(resetBed, true); - } - } - - private void tryResetBed(EntityPlayer player) { - if (player.getEntityData().hasKey(resetBed)) { - player.getEntityData().removeTag(resetBed); - resetBedPosition(player); - } - } - - public static void readyToResetBedPosition(EntityPlayer player) { - ChunkCoordinates coords = player.getBedLocation(player.dimension); - if (coords != null) { - player.getEntityData().setInteger(chunkCoords + "_x", coords.posX); - player.getEntityData().setInteger(chunkCoords + "_y", coords.posY); - player.getEntityData().setInteger(chunkCoords + "_z", coords.posZ); - } - } - - private void resetBedPosition(EntityPlayer player) { - if (player.getEntityData().hasKey(chunkCoords + "_x")) { - MFLogUtil.logDebug("Reset bed data for " + player.getCommandSenderName()); - int x = player.getEntityData().getInteger(chunkCoords + "_x"); - int y = player.getEntityData().getInteger(chunkCoords + "_y"); - int z = player.getEntityData().getInteger(chunkCoords + "_z"); - ChunkCoordinates coords = new ChunkCoordinates(x, y, z); - - player.getEntityData().removeTag(chunkCoords + "_x"); - player.getEntityData().removeTag(chunkCoords + "_y"); - player.getEntityData().removeTag(chunkCoords + "_z"); - - player.setSpawnChunk(coords, false); - } - } + // DRAGON EVENT + if (!event.player.worldObj.isRemote) { + tickDragonSpawner(event.player); + } + if (!event.player.worldObj.isRemote) { + tryResetBed(event.player); + } + // updatePitch(event.player); (This keeps track of player camera angles, could + // make a mechanic based on swinging the camera) + } + + if (event.phase == TickEvent.Phase.START) { + applyBalance(event.player); + ItemFoodMF.onTick(event.player); + + if (!event.player.worldObj.isRemote + && !(!ConfigHardcore.HCChotBurn && ItemApron.isUserProtected(event.player)) + && event.player.ticksExisted % 100 == 0) { + for (int a = 0; a < event.player.inventory.getSizeInventory(); a++) { + ItemStack item = event.player.inventory.getStackInSlot(a); + if (item != null && item.getItem() instanceof IHotItem) { + event.player.setFire(5); + event.player.attackEntityFrom(DamageSource.onFire, 1.0F); + } + } + } + if (event.player.worldObj.isRemote) { + ItemStack item = event.player.getHeldItem(); + if (lastStack == null && item != null) { + if (item.getItem() instanceof IFirearm) { + NBTTagCompound nbt = AmmoMechanicsMF.getNBT(item); + if (nbt.hasKey(ItemCrossbow.useTypeNBT) + && nbt.getString(ItemCrossbow.useTypeNBT).equalsIgnoreCase("fire")) { + nbt.setString(ItemCrossbow.useTypeNBT, "null"); + } + } + } + if (lastStack != null && (item == null || item != lastStack)) { + if (lastStack.getItem() instanceof IFirearm) { + NBTTagCompound nbt = AmmoMechanicsMF.getNBT(lastStack); + if (nbt.hasKey(ItemCrossbow.useTypeNBT) + && nbt.getString(ItemCrossbow.useTypeNBT).equalsIgnoreCase("fire")) { + nbt.setString(ItemCrossbow.useTypeNBT, "null"); + } + } + } + lastStack = item; + } + + float weight = ArmourCalculator.getTotalWeightOfWorn(event.player, false); + if (weight > 100F) { + if (event.player.isInWater()) { + event.player.motionY -= (weight / 20000F); + } + } + } + } + + private void onStep(EntityPlayer player, boolean alternateStep) { + if (ArmourCalculator.getTotalWeightOfWorn(player, false) >= 50) { + player.playSound("mob.irongolem.throw", 1.0F, 1.0F); + } + } + + private boolean isNextStep(EntityPlayer player) { + int prevStep = player.getEntityData().getInteger(stepNBT); + int stepcount = (int) player.distanceWalkedOnStepModified; + player.getEntityData().setInteger(stepNBT, stepcount); + + return prevStep != stepcount; + } + + /* + * private static String lastPitchNBT = "MF_last_AimPitch"; public static void + * setLastPitch(EntityPlayer user, float value) { + * user.getEntityData().setFloat(lastPitchNBT, value); } public static void + * updatePitch(EntityPlayer user) { user.getEntityData().setFloat(lastPitchNBT, + * user.rotationPitch); } public static float getPitchMovement(EntityPlayer + * user) { float lastPitch = user.getEntityData().getFloat(lastPitchNBT) + + * 1000F; float nowPitch = user.rotationPitch + 1000F; + * + * return nowPitch - lastPitch; } + */ + private void tickDragonSpawner(EntityPlayer player) { + if (player.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && player.dimension == 0) { + int i = ConfigMobs.dragonInterval; + float chance = ConfigMobs.dragonChance; + + if (PlayerTickHandlerMF.getDragonEnemyPoints(player) >= 100) { + i /= 2;// twice as frequent + } + if (PlayerTickHandlerMF.getDragonEnemyPoints(player) >= 50) { + chance *= 2;// twice the chance + } + if (!player.worldObj.isRemote && player.worldObj.getTotalWorldTime() % i == 0 + && MineFantasyII.random.nextFloat() * 100F < chance) { + spawnDragon(player); + } + } + } + + private void applyBalance(EntityPlayer entityPlayer) { + float weight = 2.0F; + float pitchBalance = entityPlayer.getEntityData().hasKey("MF_Balance_Pitch") + ? entityPlayer.getEntityData().getFloat("MF_Balance_Pitch") + : 0F; + float yawBalance = entityPlayer.getEntityData().hasKey("MF_Balance_Yaw") + ? entityPlayer.getEntityData().getFloat("MF_Balance_Yaw") + : 0F; + + if (pitchBalance > 0) { + if (pitchBalance < 1.0F && pitchBalance > -1.0F) + weight = pitchBalance; + pitchBalance -= weight; + + if (ConfigWeapon.useBalance) { + entityPlayer.rotationPitch += pitchBalance > 0 ? weight : -weight; + } + + if (pitchBalance < 0) + pitchBalance = 0; + } + if (yawBalance > 0) { + if (yawBalance < 1.0F && yawBalance > -1.0F) + weight = yawBalance; + yawBalance -= weight; + + if (ConfigWeapon.useBalance) { + MFLogUtil.logDebug("Weapon Balance Move"); + entityPlayer.rotationYaw += yawBalance > 0 ? weight : -weight; + } + + if (yawBalance < 0) + yawBalance = 0; + } + entityPlayer.getEntityData().setFloat("MF_Balance_Pitch", pitchBalance); + entityPlayer.getEntityData().setFloat("MF_Balance_Yaw", yawBalance); + } + + @SubscribeEvent + public void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { + onPlayerEnterWorld(event.player); + } + + @SubscribeEvent + public void onPlayerTravel(PlayerEvent.PlayerChangedDimensionEvent event) { + onPlayerEnterWorld(event.player); + } + + @SubscribeEvent + public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { + onPlayerEnterWorld(event.player); + } + + public void onPlayerEnterWorld(EntityPlayer player) { + if (player.worldObj.isRemote) + return; + + NBTTagCompound persist = PlayerTagData.getPersistedData(player); + MFLogUtil.logDebug("Sync data"); + ResearchLogic.syncData(player); + + if (!persist.hasKey("MF_HasBook")) { + persist.setBoolean("MF_HasBook", true); + if (player.capabilities.isCreativeMode) + return; + + player.inventory.addItemStackToInventory(new ItemStack(ToolListMF.researchBook)); + } + if (RPGElements.isSystemActive) { + RPGElements.initSkills(player); + } + } + + private void tryResetBed(EntityPlayer player) { + if (player.getEntityData().hasKey(resetBed)) { + player.getEntityData().removeTag(resetBed); + resetBedPosition(player); + } + } + + private void resetBedPosition(EntityPlayer player) { + if (player.getEntityData().hasKey(chunkCoords + "_x")) { + MFLogUtil.logDebug("Reset bed data for " + player.getCommandSenderName()); + int x = player.getEntityData().getInteger(chunkCoords + "_x"); + int y = player.getEntityData().getInteger(chunkCoords + "_y"); + int z = player.getEntityData().getInteger(chunkCoords + "_z"); + ChunkCoordinates coords = new ChunkCoordinates(x, y, z); + + player.getEntityData().removeTag(chunkCoords + "_x"); + player.getEntityData().removeTag(chunkCoords + "_y"); + player.getEntityData().removeTag(chunkCoords + "_z"); + + player.setSpawnChunk(coords, false); + } + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/StaminaMechanics.java b/src/main/java/minefantasy/mf2/mechanics/StaminaMechanics.java index ebbb716c..1e0aff6a 100644 --- a/src/main/java/minefantasy/mf2/mechanics/StaminaMechanics.java +++ b/src/main/java/minefantasy/mf2/mechanics/StaminaMechanics.java @@ -20,212 +20,212 @@ import net.minecraft.world.WorldServer; public class StaminaMechanics { - private static boolean hurtAdreneline = true; - private static int bowSeconds = 30; - - public static void tickEntity(EntityLivingBase entity) { - if (entity.ticksExisted % 20 == 0) { - ArmourCalculator.setTotalWeightOfWorn(entity, true); - ArmourCalculator.setTotalWeightOfWorn(entity, false); - } - - float[] packet = new float[] { StaminaBar.getStaminaValue(entity), StaminaBar.getBaseMaxStamina(entity), - StaminaBar.getFlashTime(entity), StaminaBar.getBonusStamina(entity) }; - float[] values = new float[] { StaminaBar.getStaminaValue(entity), StaminaBar.getTotalMaxStamina(entity) }; - if (entity.worldObj.isRemote && ConfigClient.playBreath) { - if (!StaminaBar.isPercentStamAvailable(entity, 0.2F, false) && !entity.isInsideOfMaterial(Material.water)) { - if (entity.ticksExisted % 20 == 0) { - entity.playSound("mob.blaze.breathe", 0.1F, 1.8F); - } - if (entity.ticksExisted + 5 % 20 == 0) { - entity.playSound("mob.blaze.breathe", 0.15F, 1.5F); - } - } - return; - } - float decay = getConstantDecay(entity); - // Decay - if (decay > 0) { - if (values[0] > 0) { - StaminaBar.modifyStaminaValue(entity, -decay); - } - StaminaBar.setIdleTime(entity, 60F * getIdleRate(entity)); - } - - // Regen - if (decay <= 0 && StaminaBar.getIdleTime(entity) <= 0) { - float regen = getRegenRate(entity); - if (values[0] < values[1]) { - StaminaBar.modifyStaminaValue(entity, regen); - } - } - // Bonus Regen - if (decay <= 0) { - float regen = StaminaBar.getRegenBonus(entity); - if (values[0] < values[1]) { - StaminaBar.modifyStaminaValue(entity, regen); - } - } - - // float[] stam = new float[]{StaminaBar.getStaminaValue(player), - // StaminaBar.getMaxStamina(player)}; - - // out of stamina - if (values[0] <= 0) { - if (ConfigStamina.affectSpeed) { - entity.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 2)); - } - entity.addPotionEffect(new PotionEffect(Potion.hunger.id, 2)); - // Drain air when exhausted, you will drown faster - if (isInWater(entity) && entity.getAir() > -20 && entity.ticksExisted % 20 == 0) { - entity.setAir(entity.getAir() - 1); - } - if (entity instanceof EntityPlayer && TacticalManager.shouldStaminaBlock) { - if (((EntityPlayer) entity).isUsingItem() && (entity.getHeldItem() != null - && entity.getHeldItem().getItemUseAction() == EnumAction.block)) { - ((EntityPlayer) entity).stopUsingItem(); - } - } - } - // This phase decreases the cooldown - if (StaminaBar.getIdleTime(entity) > 0) { - StaminaBar.ModifyIdleTime(entity, -1); - } - if (StaminaBar.getFlashTime(entity) > 0) { - StaminaBar.ModifyFlashTime(entity, -1); - } - - // REFRESH - StaminaBar.refreshSystem(entity); - - StaminaBar.tickBonus(entity); - StaminaBar.tickBonusRegen(entity); - - // if changed, resync - // if((StaminaBar.getStaminaValue(player) != stam[0] || - // StaminaBar.getMaxStamina(player) != stam[1]) || player.ticksExisted % 20 == - // 0) - if (entity instanceof EntityPlayer) { - syncStamina((EntityPlayer) entity, packet); - } - } - - private static void syncStamina(EntityPlayer player, float[] stam) { - if (!player.worldObj.isRemote) { - ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, - new StaminaPacket(stam, player).generatePacket()); - } - } - - public static float getConstantDecay(EntityLivingBase user) { - if (user instanceof EntityPlayer && ((EntityPlayer) user).capabilities.isCreativeMode) { - return 0F; - } - float value = 0.0F; - boolean countArmour = false; - - if (user.isSprinting() && ConfigStamina.sprintModifier > 0 && user.ridingEntity == null) { - float sprintingSeconds = 60F; - countArmour = true;// Armour gets factored in with sprinting - value += value += (5F / sprintingSeconds) * ConfigStamina.sprintModifier; - } - if (user instanceof EntityPlayer) { - if (user.getHeldItem() != null && ((EntityPlayer) user).isUsingItem() && ConfigStamina.bowModifier > 0) { - if (user.getHeldItem().getItemUseAction() == EnumAction.bow) { - // Item gets factored in with bow - value += StaminaBar.getDefaultMax(user) / 20F / bowSeconds * ConfigStamina.bowModifier; - } - } - } - return value * StaminaBar.getBaseDecayModifier(user, countArmour, true); - } - - public static float getRegenRate(EntityLivingBase user) { - if (user instanceof EntityPlayer && ((EntityPlayer) user).capabilities.isCreativeMode) { - return 100F; - } - if (StaminaBar.getIdleTime(user) > 0) { - return 0; - } - if (isInWater(user) && user.getActivePotionEffect(Potion.waterBreathing) == null) { - return 0;// can't catch your breath when underwater - } - // The base time it takes to regen - float value = StaminaBar.getTotalMaxStamina(user) / 20 / ConfigStamina.fullRegenSeconds; - if (hurtAdreneline && user.getHealth() <= 2F) { - value *= 1.5F; - } - return value * StaminaBar.getBaseRegenModifier(user, true, true); - } - - private static boolean isInWater(EntityLivingBase user) { - return user.isInsideOfMaterial(Material.water); - } - - public static float getIdleRate(EntityLivingBase user) { - float value = 1.0F; - - if (hurtAdreneline && user.getHealth() <= 4F) { - value *= 0.2F; - } - - return value * StaminaBar.getBaseIdleModifier(user, true, true); - } - - public static void onJump(EntityLivingBase user) { - if (user.worldObj.isRemote) { - return; - } - float stam = StaminaBar.getStaminaValue(user); - if (stam > 0) { - StaminaBar.modifyStaminaValue(user, -getJumpDecay(user)); - } - StaminaBar.setIdleTime(user, 40F * getIdleRate(user)); - // syncStamina(user, new float[]{stam, StaminaBar.getMaxStamina(user)}); - } - - public static float getJumpDecay(EntityLivingBase user) { - float value = 2.0F; - - if (user.isSprinting()) { - value = 3.0F; - } - return value * StaminaBar.getBaseDecayModifier(user, true, false); - } - - public static void onAttack(EntityLivingBase user, Entity target) { - applyHitFatigue(user, 1.0F * TacticalManager.getHighgroundModifier(target, user, 1.5F)); - } - - public static void applyHitFatigue(EntityLivingBase user, float modifier) { - float stam = StaminaBar.getStaminaValue(user); - - if (stam > 0) { - StaminaBar.modifyStaminaValue(user, -getWeaponModifier(user) * modifier); - } - StaminaBar.setIdleTime(user, 50F * getIdleRate(user)); - // syncStamina(user, new float[]{stam, StaminaBar.getMaxStamina(user)}); - } - - public static float getWeaponModifier(EntityLivingBase user) { - ItemStack weapon = user.getHeldItem(); - float value = 0.0F; - - if (weapon != null) { - value = 2F; - - if (weapon.getItem() instanceof IStaminaWeapon) { - value = ((IStaminaWeapon) weapon.getItem()).getStaminaDrainOnHit(user, weapon); - } else { - if (weapon.getItem() instanceof ItemSword) { - value = 5; - } - if (weapon.getItem() instanceof ItemTool) { - value = 10; - } - } - } - - return value * ConfigStamina.weaponModifier * StaminaBar.getBaseDecayModifier(user, true, true); - } + private static boolean hurtAdreneline = true; + private static int bowSeconds = 30; + + public static void tickEntity(EntityLivingBase entity) { + if (entity.ticksExisted % 20 == 0) { + ArmourCalculator.setTotalWeightOfWorn(entity, true); + ArmourCalculator.setTotalWeightOfWorn(entity, false); + } + + float[] packet = new float[]{StaminaBar.getStaminaValue(entity), StaminaBar.getBaseMaxStamina(entity), + StaminaBar.getFlashTime(entity), StaminaBar.getBonusStamina(entity)}; + float[] values = new float[]{StaminaBar.getStaminaValue(entity), StaminaBar.getTotalMaxStamina(entity)}; + if (entity.worldObj.isRemote && ConfigClient.playBreath) { + if (!StaminaBar.isPercentStamAvailable(entity, 0.2F, false) && !entity.isInsideOfMaterial(Material.water)) { + if (entity.ticksExisted % 20 == 0) { + entity.playSound("mob.blaze.breathe", 0.1F, 1.8F); + } + if (entity.ticksExisted + 5 % 20 == 0) { + entity.playSound("mob.blaze.breathe", 0.15F, 1.5F); + } + } + return; + } + float decay = getConstantDecay(entity); + // Decay + if (decay > 0) { + if (values[0] > 0) { + StaminaBar.modifyStaminaValue(entity, -decay); + } + StaminaBar.setIdleTime(entity, 60F * getIdleRate(entity)); + } + + // Regen + if (decay <= 0 && StaminaBar.getIdleTime(entity) <= 0) { + float regen = getRegenRate(entity); + if (values[0] < values[1]) { + StaminaBar.modifyStaminaValue(entity, regen); + } + } + // Bonus Regen + if (decay <= 0) { + float regen = StaminaBar.getRegenBonus(entity); + if (values[0] < values[1]) { + StaminaBar.modifyStaminaValue(entity, regen); + } + } + + // float[] stam = new float[]{StaminaBar.getStaminaValue(player), + // StaminaBar.getMaxStamina(player)}; + + // out of stamina + if (values[0] <= 0) { + if (ConfigStamina.affectSpeed) { + entity.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 2)); + } + entity.addPotionEffect(new PotionEffect(Potion.hunger.id, 2)); + // Drain air when exhausted, you will drown faster + if (isInWater(entity) && entity.getAir() > -20 && entity.ticksExisted % 20 == 0) { + entity.setAir(entity.getAir() - 1); + } + if (entity instanceof EntityPlayer && TacticalManager.shouldStaminaBlock) { + if (((EntityPlayer) entity).isUsingItem() && (entity.getHeldItem() != null + && entity.getHeldItem().getItemUseAction() == EnumAction.block)) { + ((EntityPlayer) entity).stopUsingItem(); + } + } + } + // This phase decreases the cooldown + if (StaminaBar.getIdleTime(entity) > 0) { + StaminaBar.ModifyIdleTime(entity, -1); + } + if (StaminaBar.getFlashTime(entity) > 0) { + StaminaBar.ModifyFlashTime(entity, -1); + } + + // REFRESH + StaminaBar.refreshSystem(entity); + + StaminaBar.tickBonus(entity); + StaminaBar.tickBonusRegen(entity); + + // if changed, resync + // if((StaminaBar.getStaminaValue(player) != stam[0] || + // StaminaBar.getMaxStamina(player) != stam[1]) || player.ticksExisted % 20 == + // 0) + if (entity instanceof EntityPlayer) { + syncStamina((EntityPlayer) entity, packet); + } + } + + private static void syncStamina(EntityPlayer player, float[] stam) { + if (!player.worldObj.isRemote) { + ((WorldServer) player.worldObj).getEntityTracker().func_151248_b(player, + new StaminaPacket(stam, player).generatePacket()); + } + } + + public static float getConstantDecay(EntityLivingBase user) { + if (user instanceof EntityPlayer && ((EntityPlayer) user).capabilities.isCreativeMode) { + return 0F; + } + float value = 0.0F; + boolean countArmour = false; + + if (user.isSprinting() && ConfigStamina.sprintModifier > 0 && user.ridingEntity == null) { + float sprintingSeconds = 60F; + countArmour = true;// Armour gets factored in with sprinting + value += value += (5F / sprintingSeconds) * ConfigStamina.sprintModifier; + } + if (user instanceof EntityPlayer) { + if (user.getHeldItem() != null && ((EntityPlayer) user).isUsingItem() && ConfigStamina.bowModifier > 0) { + if (user.getHeldItem().getItemUseAction() == EnumAction.bow) { + // Item gets factored in with bow + value += StaminaBar.getDefaultMax(user) / 20F / bowSeconds * ConfigStamina.bowModifier; + } + } + } + return value * StaminaBar.getBaseDecayModifier(user, countArmour, true); + } + + public static float getRegenRate(EntityLivingBase user) { + if (user instanceof EntityPlayer && ((EntityPlayer) user).capabilities.isCreativeMode) { + return 100F; + } + if (StaminaBar.getIdleTime(user) > 0) { + return 0; + } + if (isInWater(user) && user.getActivePotionEffect(Potion.waterBreathing) == null) { + return 0;// can't catch your breath when underwater + } + // The base time it takes to regen + float value = StaminaBar.getTotalMaxStamina(user) / 20 / ConfigStamina.fullRegenSeconds; + if (hurtAdreneline && user.getHealth() <= 2F) { + value *= 1.5F; + } + return value * StaminaBar.getBaseRegenModifier(user, true, true); + } + + private static boolean isInWater(EntityLivingBase user) { + return user.isInsideOfMaterial(Material.water); + } + + public static float getIdleRate(EntityLivingBase user) { + float value = 1.0F; + + if (hurtAdreneline && user.getHealth() <= 4F) { + value *= 0.2F; + } + + return value * StaminaBar.getBaseIdleModifier(user, true, true); + } + + public static void onJump(EntityLivingBase user) { + if (user.worldObj.isRemote) { + return; + } + float stam = StaminaBar.getStaminaValue(user); + if (stam > 0) { + StaminaBar.modifyStaminaValue(user, -getJumpDecay(user)); + } + StaminaBar.setIdleTime(user, 40F * getIdleRate(user)); + // syncStamina(user, new float[]{stam, StaminaBar.getMaxStamina(user)}); + } + + public static float getJumpDecay(EntityLivingBase user) { + float value = 2.0F; + + if (user.isSprinting()) { + value = 3.0F; + } + return value * StaminaBar.getBaseDecayModifier(user, true, false); + } + + public static void onAttack(EntityLivingBase user, Entity target) { + applyHitFatigue(user, 1.0F * TacticalManager.getHighgroundModifier(target, user, 1.5F)); + } + + public static void applyHitFatigue(EntityLivingBase user, float modifier) { + float stam = StaminaBar.getStaminaValue(user); + + if (stam > 0) { + StaminaBar.modifyStaminaValue(user, -getWeaponModifier(user) * modifier); + } + StaminaBar.setIdleTime(user, 50F * getIdleRate(user)); + // syncStamina(user, new float[]{stam, StaminaBar.getMaxStamina(user)}); + } + + public static float getWeaponModifier(EntityLivingBase user) { + ItemStack weapon = user.getHeldItem(); + float value = 0.0F; + + if (weapon != null) { + value = 2F; + + if (weapon.getItem() instanceof IStaminaWeapon) { + value = ((IStaminaWeapon) weapon.getItem()).getStaminaDrainOnHit(user, weapon); + } else { + if (weapon.getItem() instanceof ItemSword) { + value = 5; + } + if (weapon.getItem() instanceof ItemTool) { + value = 10; + } + } + } + + return value * ConfigStamina.weaponModifier * StaminaBar.getBaseDecayModifier(user, true, true); + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/TierHelper.java b/src/main/java/minefantasy/mf2/mechanics/TierHelper.java index 7f1f22db..0fd60d82 100644 --- a/src/main/java/minefantasy/mf2/mechanics/TierHelper.java +++ b/src/main/java/minefantasy/mf2/mechanics/TierHelper.java @@ -1,24 +1,24 @@ package minefantasy.mf2.mechanics; public class TierHelper { - /** - * This gets the "points" on how powerful food is (This is used to help balance - * cost) - */ - public static int getPointsWorthForFood(int hunger, float saturation, float staminaMax, float staminaMaxTime, - float staminaSpeed, float staminaSpeedTime) { - float satCost = 5F;// Pts for each hour - float boostCost = 1F;// Pts for each 1 per day - float regenCost = 2F;// Pts for each 1s per minute + /** + * This gets the "points" on how powerful food is (This is used to help balance + * cost) + */ + public static int getPointsWorthForFood(int hunger, float saturation, float staminaMax, float staminaMaxTime, + float staminaSpeed, float staminaSpeedTime) { + float satCost = 5F;// Pts for each hour + float boostCost = 1F;// Pts for each 1 per day + float regenCost = 2F;// Pts for each 1s per minute - float staminaPoints = (staminaMax) * (staminaMaxTime / 1200F); - float staminaRegenPoints = (staminaSpeed) * (staminaSpeedTime / 60F); + float staminaPoints = (staminaMax) * (staminaMaxTime / 1200F); + float staminaRegenPoints = (staminaSpeed) * (staminaSpeedTime / 60F); - float pts = 0; - pts += saturation / 3600F * satCost; - pts += staminaPoints * boostCost; - pts += staminaRegenPoints * regenCost; + float pts = 0; + pts += saturation / 3600F * satCost; + pts += staminaPoints * boostCost; + pts += staminaRegenPoints * regenCost; - return (int) pts; - } + return (int) pts; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBiological.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBiological.java index 0419be0a..62f8a7c2 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBiological.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBiological.java @@ -1,7 +1,5 @@ package minefantasy.mf2.mechanics.worldGen; -import java.util.Random; - import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigWorldGen; @@ -12,113 +10,115 @@ import net.minecraft.world.WorldType; import net.minecraft.world.biome.BiomeGenBase; +import java.util.Random; + public class WorldGenBiological { - public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) { - boolean debug = world.getWorldInfo().getTerrainType() == WorldType.FLAT && MineFantasyII.isDebug(); + public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) { + boolean debug = world.getWorldInfo().getTerrainType() == WorldType.FLAT && MineFantasyII.isDebug(); - BiomeGenBase biome = world.getBiomeGenForCoords(chunkX * 16, chunkZ * 16); - if (debug || isBiomeInConstraint(biome, ConfigWorldGen.berryMinTemp, ConfigWorldGen.berryMaxTemp, - ConfigWorldGen.berryMinRain, ConfigWorldGen.berryMaxRain)) { - generatePlant(seed, chunkX, chunkZ, world, BlockListMF.berryBush, 0, ConfigWorldGen.berryRarity, 6); - } - if (debug || isBiomeInConstraint(biome, ConfigWorldGen.yewMinTemp, ConfigWorldGen.yewMaxTemp, - ConfigWorldGen.yewMinRain, ConfigWorldGen.yewMaxRain)) { - generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_yew, BlockListMF.leaves_yew, - ConfigWorldGen.yewRarity); - } - if (debug || isBiomeInConstraint(biome, ConfigWorldGen.ironbarkMinTemp, ConfigWorldGen.ironbarkMaxTemp, - ConfigWorldGen.ironbarkMinRain, ConfigWorldGen.ironbarkMaxRain)) { - generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_ironbark, BlockListMF.leaves_ironbark, - ConfigWorldGen.ironbarkRarity); - } - if (debug || isBiomeInConstraint(biome, ConfigWorldGen.ebonyMinTemp, ConfigWorldGen.ebonyMaxTemp, - ConfigWorldGen.ebonyMinRain, ConfigWorldGen.ebonyMaxRain)) { - generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_ebony, BlockListMF.leaves_ebony, - ConfigWorldGen.ebonyRarity); - } - } + BiomeGenBase biome = world.getBiomeGenForCoords(chunkX * 16, chunkZ * 16); + if (debug || isBiomeInConstraint(biome, ConfigWorldGen.berryMinTemp, ConfigWorldGen.berryMaxTemp, + ConfigWorldGen.berryMinRain, ConfigWorldGen.berryMaxRain)) { + generatePlant(seed, chunkX, chunkZ, world, BlockListMF.berryBush, 0, ConfigWorldGen.berryRarity, 6); + } + if (debug || isBiomeInConstraint(biome, ConfigWorldGen.yewMinTemp, ConfigWorldGen.yewMaxTemp, + ConfigWorldGen.yewMinRain, ConfigWorldGen.yewMaxRain)) { + generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_yew, BlockListMF.leaves_yew, + ConfigWorldGen.yewRarity); + } + if (debug || isBiomeInConstraint(biome, ConfigWorldGen.ironbarkMinTemp, ConfigWorldGen.ironbarkMaxTemp, + ConfigWorldGen.ironbarkMinRain, ConfigWorldGen.ironbarkMaxRain)) { + generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_ironbark, BlockListMF.leaves_ironbark, + ConfigWorldGen.ironbarkRarity); + } + if (debug || isBiomeInConstraint(biome, ConfigWorldGen.ebonyMinTemp, ConfigWorldGen.ebonyMaxTemp, + ConfigWorldGen.ebonyMinRain, ConfigWorldGen.ebonyMaxRain)) { + generateTree(seed, chunkX, chunkZ, world, BlockListMF.log_ebony, BlockListMF.leaves_ebony, + ConfigWorldGen.ebonyRarity); + } + } - public static boolean isBiomeInConstraint(BiomeGenBase biome, float tempMin, float tempMax, float rainMin, - float rainMax) { - if (biome != null) { - return biome.temperature >= tempMin && biome.temperature < tempMax && biome.rainfall >= rainMin - && biome.rainfall < rainMax; - } - return false; - } + public static boolean isBiomeInConstraint(BiomeGenBase biome, float tempMin, float tempMax, float rainMin, + float rainMax) { + if (biome != null) { + return biome.temperature >= tempMin && biome.temperature < tempMax && biome.rainfall >= rainMin + && biome.rainfall < rainMax; + } + return false; + } - private static void generatePlant(Random seed, int chunkX, int chunkZ, World world, Block plant, int meta, - float chance, int count) { - boolean doGen = world.getWorldInfo().getTerrainType() != WorldType.FLAT; - if (doGen && seed.nextFloat() < chance) { - for (int a = 0; a < count; a++) { - int j = chunkX * 16 + seed.nextInt(16); - int k = chunkZ * 16 + seed.nextInt(16); - int l = world.getTopSolidOrLiquidBlock(j, k); - (new WorldGenBush(plant, meta)).generate(world, seed, j, l, k); - } - } - } + private static void generatePlant(Random seed, int chunkX, int chunkZ, World world, Block plant, int meta, + float chance, int count) { + boolean doGen = world.getWorldInfo().getTerrainType() != WorldType.FLAT; + if (doGen && seed.nextFloat() < chance) { + for (int a = 0; a < count; a++) { + int j = chunkX * 16 + seed.nextInt(16); + int k = chunkZ * 16 + seed.nextInt(16); + int l = world.getTopSolidOrLiquidBlock(j, k); + (new WorldGenBush(plant, meta)).generate(world, seed, j, l, k); + } + } + } - private static void generateTree(Random seed, int chunkX, int chunkZ, World world, Block log, Block leaves, - float chance) { - boolean doGen = world.getWorldInfo().getTerrainType() != WorldType.FLAT - || (doGen = MineFantasyII.isDebug() && world.getWorldInfo().getTerrainType() == WorldType.FLAT); - if (doGen && seed.nextFloat() < chance) { - int j = chunkX * 16 + seed.nextInt(16); - int k = chunkZ * 16 + seed.nextInt(16); - int l = world.getTopSolidOrLiquidBlock(j, k); - (new WorldGenMFTree(false, log, leaves)).generate(world, seed, j, l, k); - } - } + private static void generateTree(Random seed, int chunkX, int chunkZ, World world, Block log, Block leaves, + float chance) { + boolean doGen = world.getWorldInfo().getTerrainType() != WorldType.FLAT + || (doGen = MineFantasyII.isDebug() && world.getWorldInfo().getTerrainType() == WorldType.FLAT); + if (doGen && seed.nextFloat() < chance) { + int j = chunkX * 16 + seed.nextInt(16); + int k = chunkZ * 16 + seed.nextInt(16); + int l = world.getTopSolidOrLiquidBlock(j, k); + (new WorldGenMFTree(false, log, leaves)).generate(world, seed, j, l, k); + } + } - private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, - Material neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, - int layerMax) { - int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if (seed.nextFloat() < rarity) { - for (int count = 0; count < frequency; count++) { - int x = chunkX * 16 + seed.nextInt(16); - int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ * 16 + seed.nextInt(16); + private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, + Material neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, + int layerMax) { + int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); + int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); + int z = chunkZ * 16 + seed.nextInt(16); - if (isNeibourNear(world, x, y, z, neighbour)) { - if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { - } - } - } - } - } + if (isNeibourNear(world, x, y, z, neighbour)) { + if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { + } + } + } + } + } - private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, - Block neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) { - int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if (seed.nextFloat() < rarity) { - for (int count = 0; count < frequency; count++) { - int x = chunkX * 16 + seed.nextInt(16); - int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ * 16 + seed.nextInt(16); + private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, + Block neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) { + int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); + int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); + int z = chunkZ * 16 + seed.nextInt(16); - if (isNeibourNear(world, x, y, z, neighbour)) { - if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { - } - } - } - } - } + if (isNeibourNear(world, x, y, z, neighbour)) { + if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { + } + } + } + } + } - private static boolean isNeibourNear(World world, int x, int y, int z, Block neighbour) { - return world.getBlock(x - 1, y, z) == neighbour || world.getBlock(+1, y, z) == neighbour - || world.getBlock(x, y - 1, z) == neighbour || world.getBlock(x, y + 1, z) == neighbour - || world.getBlock(x, y, z - 1) == neighbour || world.getBlock(x, y, z + 1) == neighbour; - } + private static boolean isNeibourNear(World world, int x, int y, int z, Block neighbour) { + return world.getBlock(x - 1, y, z) == neighbour || world.getBlock(+1, y, z) == neighbour + || world.getBlock(x, y - 1, z) == neighbour || world.getBlock(x, y + 1, z) == neighbour + || world.getBlock(x, y, z - 1) == neighbour || world.getBlock(x, y, z + 1) == neighbour; + } - private static boolean isNeibourNear(World world, int x, int y, int z, Material neighbour) { - return world.getBlock(x - 1, y, z).getMaterial() == neighbour - || world.getBlock(+1, y, z).getMaterial() == neighbour - || world.getBlock(x, y - 1, z).getMaterial() == neighbour - || world.getBlock(x, y + 1, z).getMaterial() == neighbour - || world.getBlock(x, y, z - 1).getMaterial() == neighbour - || world.getBlock(x, y, z + 1).getMaterial() == neighbour; - } + private static boolean isNeibourNear(World world, int x, int y, int z, Material neighbour) { + return world.getBlock(x - 1, y, z).getMaterial() == neighbour + || world.getBlock(+1, y, z).getMaterial() == neighbour + || world.getBlock(x, y - 1, z).getMaterial() == neighbour + || world.getBlock(x, y + 1, z).getMaterial() == neighbour + || world.getBlock(x, y, z - 1).getMaterial() == neighbour + || world.getBlock(x, y, z + 1).getMaterial() == neighbour; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBush.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBush.java index 488989e0..05199c6b 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBush.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenBush.java @@ -1,35 +1,35 @@ package minefantasy.mf2.mechanics.worldGen; -import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; +import java.util.Random; + public class WorldGenBush extends WorldGenerator { - private Block block; - private int meta; + private Block block; + private int meta; - public WorldGenBush(Block block, int meta) { - super(); - this.block = block; - this.meta = meta; - } + public WorldGenBush(Block block, int meta) { + super(); + this.block = block; + this.meta = meta; + } - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - for (int l = 0; l < 8; ++l) { - int i1 = x + rand.nextInt(8) - rand.nextInt(8); - int j1 = y + rand.nextInt(4) - rand.nextInt(4); - int k1 = z + rand.nextInt(8) - rand.nextInt(8); + @Override + public boolean generate(World world, Random rand, int x, int y, int z) { + for (int l = 0; l < 8; ++l) { + int i1 = x + rand.nextInt(8) - rand.nextInt(8); + int j1 = y + rand.nextInt(4) - rand.nextInt(4); + int k1 = z + rand.nextInt(8) - rand.nextInt(8); - if (world.isAirBlock(i1, j1, k1) && world.getBlock(i1, j1 - 1, k1) == Blocks.grass - && block.canPlaceBlockAt(world, i1, j1, k1)) { - world.setBlock(i1, j1, k1, block, meta, 2); - } - } + if (world.isAirBlock(i1, j1, k1) && world.getBlock(i1, j1 - 1, k1) == Blocks.grass + && block.canPlaceBlockAt(world, i1, j1, k1)) { + world.setBlock(i1, j1, k1, block, meta, 2); + } + } - return true; - } + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenDuelMinable.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenDuelMinable.java index db4523cf..719bc0c7 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenDuelMinable.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenDuelMinable.java @@ -1,85 +1,87 @@ package minefantasy.mf2.mechanics.worldGen; -import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; +import java.util.Random; + public class WorldGenDuelMinable extends WorldGenerator { - private Block ore, specialOre; - /** The number of blocks to generate. */ - private int veinSize; - private Block bed; - private int oreMeta, specialMeta; - private float chanceForSpecial; + private Block ore, specialOre; + /** + * The number of blocks to generate. + */ + private int veinSize; + private Block bed; + private int oreMeta, specialMeta; + private float chanceForSpecial; - public WorldGenDuelMinable(Block main, int number, Block extra, float chance) { - this(main, 0, number, Blocks.stone, extra, 0, chance); - } + public WorldGenDuelMinable(Block main, int number, Block extra, float chance) { + this(main, 0, number, Blocks.stone, extra, 0, chance); + } - public WorldGenDuelMinable(Block main, int mainMeta, int number, Block target, Block extra, int extraMeta, - float chance) { - this.ore = main; - this.oreMeta = mainMeta; - this.veinSize = number; - this.bed = target; - this.specialOre = extra; - this.specialMeta = extraMeta; - this.chanceForSpecial = chance; - } + public WorldGenDuelMinable(Block main, int mainMeta, int number, Block target, Block extra, int extraMeta, + float chance) { + this.ore = main; + this.oreMeta = mainMeta; + this.veinSize = number; + this.bed = target; + this.specialOre = extra; + this.specialMeta = extraMeta; + this.chanceForSpecial = chance; + } - public boolean generate(World world, Random seed, int x, int y, int z) { - float f = seed.nextFloat() * (float) Math.PI; - double d0 = x + 8 + MathHelper.sin(f) * this.veinSize / 8.0F; - double d1 = x + 8 - MathHelper.sin(f) * this.veinSize / 8.0F; - double d2 = z + 8 + MathHelper.cos(f) * this.veinSize / 8.0F; - double d3 = z + 8 - MathHelper.cos(f) * this.veinSize / 8.0F; - double d4 = y + seed.nextInt(3) - 2; - double d5 = y + seed.nextInt(3) - 2; + public boolean generate(World world, Random seed, int x, int y, int z) { + float f = seed.nextFloat() * (float) Math.PI; + double d0 = x + 8 + MathHelper.sin(f) * this.veinSize / 8.0F; + double d1 = x + 8 - MathHelper.sin(f) * this.veinSize / 8.0F; + double d2 = z + 8 + MathHelper.cos(f) * this.veinSize / 8.0F; + double d3 = z + 8 - MathHelper.cos(f) * this.veinSize / 8.0F; + double d4 = y + seed.nextInt(3) - 2; + double d5 = y + seed.nextInt(3) - 2; - for (int l = 0; l <= this.veinSize; ++l) { - double d6 = d0 + (d1 - d0) * l / this.veinSize; - double d7 = d4 + (d5 - d4) * l / this.veinSize; - double d8 = d2 + (d3 - d2) * l / this.veinSize; - double d9 = seed.nextDouble() * this.veinSize / 16.0D; - double d10 = (MathHelper.sin(l * (float) Math.PI / this.veinSize) + 1.0F) * d9 + 1.0D; - double d11 = (MathHelper.sin(l * (float) Math.PI / this.veinSize) + 1.0F) * d9 + 1.0D; - int i1 = MathHelper.floor_double(d6 - d10 / 2.0D); - int j1 = MathHelper.floor_double(d7 - d11 / 2.0D); - int k1 = MathHelper.floor_double(d8 - d10 / 2.0D); - int l1 = MathHelper.floor_double(d6 + d10 / 2.0D); - int i2 = MathHelper.floor_double(d7 + d11 / 2.0D); - int j2 = MathHelper.floor_double(d8 + d10 / 2.0D); + for (int l = 0; l <= this.veinSize; ++l) { + double d6 = d0 + (d1 - d0) * l / this.veinSize; + double d7 = d4 + (d5 - d4) * l / this.veinSize; + double d8 = d2 + (d3 - d2) * l / this.veinSize; + double d9 = seed.nextDouble() * this.veinSize / 16.0D; + double d10 = (MathHelper.sin(l * (float) Math.PI / this.veinSize) + 1.0F) * d9 + 1.0D; + double d11 = (MathHelper.sin(l * (float) Math.PI / this.veinSize) + 1.0F) * d9 + 1.0D; + int i1 = MathHelper.floor_double(d6 - d10 / 2.0D); + int j1 = MathHelper.floor_double(d7 - d11 / 2.0D); + int k1 = MathHelper.floor_double(d8 - d10 / 2.0D); + int l1 = MathHelper.floor_double(d6 + d10 / 2.0D); + int i2 = MathHelper.floor_double(d7 + d11 / 2.0D); + int j2 = MathHelper.floor_double(d8 + d10 / 2.0D); - for (int k2 = i1; k2 <= l1; ++k2) { - double d12 = (k2 + 0.5D - d6) / (d10 / 2.0D); + for (int k2 = i1; k2 <= l1; ++k2) { + double d12 = (k2 + 0.5D - d6) / (d10 / 2.0D); - if (d12 * d12 < 1.0D) { - for (int l2 = j1; l2 <= i2; ++l2) { - double d13 = (l2 + 0.5D - d7) / (d11 / 2.0D); + if (d12 * d12 < 1.0D) { + for (int l2 = j1; l2 <= i2; ++l2) { + double d13 = (l2 + 0.5D - d7) / (d11 / 2.0D); - if (d12 * d12 + d13 * d13 < 1.0D) { - for (int i3 = k1; i3 <= j2; ++i3) { - double d14 = (i3 + 0.5D - d8) / (d10 / 2.0D); + if (d12 * d12 + d13 * d13 < 1.0D) { + for (int i3 = k1; i3 <= j2; ++i3) { + double d14 = (i3 + 0.5D - d8) / (d10 / 2.0D); - if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0D - && world.getBlock(k2, l2, i3).isReplaceableOreGen(world, k2, l2, i3, bed)) { - if (seed.nextFloat() < chanceForSpecial) { - world.setBlock(k2, l2, i3, this.specialOre, specialMeta, 2);// Special Block - } else { - world.setBlock(k2, l2, i3, this.ore, oreMeta, 2);// Ore - } - } - } - } - } - } - } - } + if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0D + && world.getBlock(k2, l2, i3).isReplaceableOreGen(world, k2, l2, i3, bed)) { + if (seed.nextFloat() < chanceForSpecial) { + world.setBlock(k2, l2, i3, this.specialOre, specialMeta, 2);// Special Block + } else { + world.setBlock(k2, l2, i3, this.ore, oreMeta, 2);// Ore + } + } + } + } + } + } + } + } - return true; - } + return true; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java index 34de031e..f487d852 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java @@ -1,7 +1,5 @@ package minefantasy.mf2.mechanics.worldGen; -import java.util.Random; - import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.config.ConfigWorldGen; import net.minecraft.block.Block; @@ -11,144 +9,146 @@ import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenMinable; +import java.util.Random; + public class WorldGenGeological { - public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) { - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreCopper, Blocks.stone, ConfigWorldGen.copperSize, - ConfigWorldGen.copperFrequencyMin, ConfigWorldGen.copperFrequencyMax, ConfigWorldGen.copperRarity, - ConfigWorldGen.copperLayerMin, ConfigWorldGen.copperLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreTin, Blocks.stone, ConfigWorldGen.tinSize, - ConfigWorldGen.tinFrequencyMin, ConfigWorldGen.tinFrequencyMax, ConfigWorldGen.tinRarity, - ConfigWorldGen.tinLayerMin, ConfigWorldGen.tinLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreSilver, Blocks.stone, ConfigWorldGen.silverSize, - ConfigWorldGen.silverFrequencyMin, ConfigWorldGen.silverFrequencyMax, ConfigWorldGen.silverRarity, - ConfigWorldGen.silverLayerMin, ConfigWorldGen.silverLayerMax); - generateOreWithNeighbour(seed, chunkX, chunkZ, world, BlockListMF.oreMythic, Blocks.stone, Blocks.bedrock, - ConfigWorldGen.mythicSize, ConfigWorldGen.mythicFrequencyMin, ConfigWorldGen.mythicFrequencyMax, - ConfigWorldGen.mythicRarity, ConfigWorldGen.mythicLayerMin, ConfigWorldGen.mythicLayerMax); + public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) { + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreCopper, Blocks.stone, ConfigWorldGen.copperSize, + ConfigWorldGen.copperFrequencyMin, ConfigWorldGen.copperFrequencyMax, ConfigWorldGen.copperRarity, + ConfigWorldGen.copperLayerMin, ConfigWorldGen.copperLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreTin, Blocks.stone, ConfigWorldGen.tinSize, + ConfigWorldGen.tinFrequencyMin, ConfigWorldGen.tinFrequencyMax, ConfigWorldGen.tinRarity, + ConfigWorldGen.tinLayerMin, ConfigWorldGen.tinLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreSilver, Blocks.stone, ConfigWorldGen.silverSize, + ConfigWorldGen.silverFrequencyMin, ConfigWorldGen.silverFrequencyMax, ConfigWorldGen.silverRarity, + ConfigWorldGen.silverLayerMin, ConfigWorldGen.silverLayerMax); + generateOreWithNeighbour(seed, chunkX, chunkZ, world, BlockListMF.oreMythic, Blocks.stone, Blocks.bedrock, + ConfigWorldGen.mythicSize, ConfigWorldGen.mythicFrequencyMin, ConfigWorldGen.mythicFrequencyMax, + ConfigWorldGen.mythicRarity, ConfigWorldGen.mythicLayerMin, ConfigWorldGen.mythicLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreKaolinite, Blocks.stone, ConfigWorldGen.kaoliniteSize, - ConfigWorldGen.kaoliniteFrequencyMin, ConfigWorldGen.kaoliniteFrequencyMax, - ConfigWorldGen.kaoliniteRarity, ConfigWorldGen.kaoliniteLayerMin, ConfigWorldGen.kaoliniteLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreClay, Blocks.dirt, ConfigWorldGen.claySize, - ConfigWorldGen.clayFrequencyMin, ConfigWorldGen.clayFrequencyMax, ConfigWorldGen.clayRarity, - ConfigWorldGen.clayLayerMin, ConfigWorldGen.clayLayerMax); - generateOreWithNeighbour(seed, chunkX, chunkZ, world, BlockListMF.oreNitre, Blocks.stone, Blocks.air, - ConfigWorldGen.nitreSize, ConfigWorldGen.nitreFrequencyMin, ConfigWorldGen.nitreFrequencyMax, - ConfigWorldGen.nitreRarity, ConfigWorldGen.nitreLayerMin, ConfigWorldGen.nitreLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreSulfur, Blocks.stone, ConfigWorldGen.sulfurSize, - ConfigWorldGen.sulfurFrequencyMin, ConfigWorldGen.sulfurFrequencyMax, ConfigWorldGen.sulfurRarity, - ConfigWorldGen.sulfurLayerMin, ConfigWorldGen.sulfurLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreBorax, Blocks.stone, ConfigWorldGen.boraxSize, - ConfigWorldGen.boraxFrequencyMin, ConfigWorldGen.boraxFrequencyMax, ConfigWorldGen.boraxRarity, - ConfigWorldGen.boraxLayerMin, ConfigWorldGen.boraxLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreTungsten, Blocks.stone, ConfigWorldGen.wolframiteSize, - ConfigWorldGen.wolframiteFrequencyMin, ConfigWorldGen.wolframiteFrequencyMax, - ConfigWorldGen.wolframiteRarity, ConfigWorldGen.wolframiteLayerMin, ConfigWorldGen.wolframiteLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreCoalRich, Blocks.stone, ConfigWorldGen.coalSize, - ConfigWorldGen.coalFrequencyMin, ConfigWorldGen.coalFrequencyMax, ConfigWorldGen.coalRarity, - ConfigWorldGen.coalLayerMin, ConfigWorldGen.coalLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreKaolinite, Blocks.stone, ConfigWorldGen.kaoliniteSize, + ConfigWorldGen.kaoliniteFrequencyMin, ConfigWorldGen.kaoliniteFrequencyMax, + ConfigWorldGen.kaoliniteRarity, ConfigWorldGen.kaoliniteLayerMin, ConfigWorldGen.kaoliniteLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreClay, Blocks.dirt, ConfigWorldGen.claySize, + ConfigWorldGen.clayFrequencyMin, ConfigWorldGen.clayFrequencyMax, ConfigWorldGen.clayRarity, + ConfigWorldGen.clayLayerMin, ConfigWorldGen.clayLayerMax); + generateOreWithNeighbour(seed, chunkX, chunkZ, world, BlockListMF.oreNitre, Blocks.stone, Blocks.air, + ConfigWorldGen.nitreSize, ConfigWorldGen.nitreFrequencyMin, ConfigWorldGen.nitreFrequencyMax, + ConfigWorldGen.nitreRarity, ConfigWorldGen.nitreLayerMin, ConfigWorldGen.nitreLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreSulfur, Blocks.stone, ConfigWorldGen.sulfurSize, + ConfigWorldGen.sulfurFrequencyMin, ConfigWorldGen.sulfurFrequencyMax, ConfigWorldGen.sulfurRarity, + ConfigWorldGen.sulfurLayerMin, ConfigWorldGen.sulfurLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreBorax, Blocks.stone, ConfigWorldGen.boraxSize, + ConfigWorldGen.boraxFrequencyMin, ConfigWorldGen.boraxFrequencyMax, ConfigWorldGen.boraxRarity, + ConfigWorldGen.boraxLayerMin, ConfigWorldGen.boraxLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreTungsten, Blocks.stone, ConfigWorldGen.wolframiteSize, + ConfigWorldGen.wolframiteFrequencyMin, ConfigWorldGen.wolframiteFrequencyMax, + ConfigWorldGen.wolframiteRarity, ConfigWorldGen.wolframiteLayerMin, ConfigWorldGen.wolframiteLayerMax); + generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreCoalRich, Blocks.stone, ConfigWorldGen.coalSize, + ConfigWorldGen.coalFrequencyMin, ConfigWorldGen.coalFrequencyMax, ConfigWorldGen.coalRarity, + ConfigWorldGen.coalLayerMin, ConfigWorldGen.coalLayerMax); - generateOre(seed, chunkX, chunkZ, world, BlockListMF.limestone, Blocks.stone, ConfigWorldGen.limestoneSize, - ConfigWorldGen.limestoneFrequencyMin, ConfigWorldGen.limestoneFrequencyMax, - ConfigWorldGen.limestoneRarity, ConfigWorldGen.limestoneLayerMin, ConfigWorldGen.limestoneLayerMax); - } + generateOre(seed, chunkX, chunkZ, world, BlockListMF.limestone, Blocks.stone, ConfigWorldGen.limestoneSize, + ConfigWorldGen.limestoneFrequencyMin, ConfigWorldGen.limestoneFrequencyMax, + ConfigWorldGen.limestoneRarity, ConfigWorldGen.limestoneLayerMin, ConfigWorldGen.limestoneLayerMax); + } - /** - * Not used yet, allows a vein consisting of two block types - */ - private static void generateDuelOre(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, - int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax, Block special, - float chance) { - int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if (seed.nextFloat() < rarity) { - for (int count = 0; count < frequency; count++) { - int x = chunkX * 16 + seed.nextInt(16); - int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ * 16 + seed.nextInt(16); - (new WorldGenDuelMinable(ore, size, special, chance)).generate(world, seed, x, y, z); - } - } - } + /** + * Not used yet, allows a vein consisting of two block types + */ + private static void generateDuelOre(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, + int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax, Block special, + float chance) { + int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); + int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); + int z = chunkZ * 16 + seed.nextInt(16); + (new WorldGenDuelMinable(ore, size, special, chance)).generate(world, seed, x, y, z); + } + } + } - private static void generateOre(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, int size, - int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) { - int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if (seed.nextFloat() < rarity) { - for (int count = 0; count < frequency; count++) { - int x = chunkX * 16 + seed.nextInt(16); - int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ * 16 + seed.nextInt(16); - (new WorldGenMinable(ore, size, bed)).generate(world, seed, x, y, z); - } - } - } + private static void generateOre(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, int size, + int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) { + int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); + int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); + int z = chunkZ * 16 + seed.nextInt(16); + (new WorldGenMinable(ore, size, bed)).generate(world, seed, x, y, z); + } + } + } - private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, - Material neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, - int layerMax) { - int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if (seed.nextFloat() < rarity) { - for (int count = 0; count < frequency; count++) { - int x = chunkX * 16 + seed.nextInt(16); - int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ * 16 + seed.nextInt(16); + private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, + Material neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, + int layerMax) { + int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); + int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); + int z = chunkZ * 16 + seed.nextInt(16); - if (isNeibourNear(world, x, y, z, neighbour)) { - if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { - } - } - } - } - } + if (isNeibourNear(world, x, y, z, neighbour)) { + if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { + } + } + } + } + } - private static void generateOreWithNeighbour2(Random seed, int chunkX, int chunkZ, World world, Block basic, - float chance, Block special, Block bed, Block neighbour, int size, int frequencyMin, int frequencyMax, - float rarity, int layerMin, int layerMax) { - int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if (seed.nextFloat() < rarity) { - for (int count = 0; count < frequency; count++) { - int x = chunkX * 16 + seed.nextInt(16); - int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ * 16 + seed.nextInt(16); + private static void generateOreWithNeighbour2(Random seed, int chunkX, int chunkZ, World world, Block basic, + float chance, Block special, Block bed, Block neighbour, int size, int frequencyMin, int frequencyMax, + float rarity, int layerMin, int layerMax) { + int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); + int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); + int z = chunkZ * 16 + seed.nextInt(16); - if (isNeibourNear(world, x, y, z, neighbour)) { - Block ore = (seed.nextFloat() <= chance ? special : basic); - if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { - } - } - } - } - } + if (isNeibourNear(world, x, y, z, neighbour)) { + Block ore = (seed.nextFloat() <= chance ? special : basic); + if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { + } + } + } + } + } - private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, - Block neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) { - int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); - if (seed.nextFloat() < rarity) { - for (int count = 0; count < frequency; count++) { - int x = chunkX * 16 + seed.nextInt(16); - int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); - int z = chunkZ * 16 + seed.nextInt(16); + private static void generateOreWithNeighbour(Random seed, int chunkX, int chunkZ, World world, Block ore, Block bed, + Block neighbour, int size, int frequencyMin, int frequencyMax, float rarity, int layerMin, int layerMax) { + int frequency = MathHelper.getRandomIntegerInRange(seed, frequencyMin, frequencyMax); + if (seed.nextFloat() < rarity) { + for (int count = 0; count < frequency; count++) { + int x = chunkX * 16 + seed.nextInt(16); + int y = MathHelper.getRandomIntegerInRange(seed, layerMin, layerMax); + int z = chunkZ * 16 + seed.nextInt(16); - if (isNeibourNear(world, x, y, z, neighbour)) { - if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { - } - } - } - } - } + if (isNeibourNear(world, x, y, z, neighbour)) { + if ((new WorldGenMinableMF(ore, size, bed)).generate(world, seed, x, y, z)) { + } + } + } + } + } - private static boolean isNeibourNear(World world, int x, int y, int z, Block neighbour) { - return world.getBlock(x - 1, y, z) == neighbour || world.getBlock(+1, y, z) == neighbour - || world.getBlock(x, y - 1, z) == neighbour || world.getBlock(x, y + 1, z) == neighbour - || world.getBlock(x, y, z - 1) == neighbour || world.getBlock(x, y, z + 1) == neighbour; - } + private static boolean isNeibourNear(World world, int x, int y, int z, Block neighbour) { + return world.getBlock(x - 1, y, z) == neighbour || world.getBlock(+1, y, z) == neighbour + || world.getBlock(x, y - 1, z) == neighbour || world.getBlock(x, y + 1, z) == neighbour + || world.getBlock(x, y, z - 1) == neighbour || world.getBlock(x, y, z + 1) == neighbour; + } - private static boolean isNeibourNear(World world, int x, int y, int z, Material neighbour) { - return world.getBlock(x - 1, y, z).getMaterial() == neighbour - || world.getBlock(+1, y, z).getMaterial() == neighbour - || world.getBlock(x, y - 1, z).getMaterial() == neighbour - || world.getBlock(x, y + 1, z).getMaterial() == neighbour - || world.getBlock(x, y, z - 1).getMaterial() == neighbour - || world.getBlock(x, y, z + 1).getMaterial() == neighbour; - } + private static boolean isNeibourNear(World world, int x, int y, int z, Material neighbour) { + return world.getBlock(x - 1, y, z).getMaterial() == neighbour + || world.getBlock(+1, y, z).getMaterial() == neighbour + || world.getBlock(x, y - 1, z).getMaterial() == neighbour + || world.getBlock(x, y + 1, z).getMaterial() == neighbour + || world.getBlock(x, y, z - 1).getMaterial() == neighbour + || world.getBlock(x, y, z + 1).getMaterial() == neighbour; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFBase.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFBase.java index c7735ffe..d9a73ca8 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFBase.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFBase.java @@ -1,21 +1,21 @@ package minefantasy.mf2.mechanics.worldGen; -import java.util.Random; - import cpw.mods.fml.common.IWorldGenerator; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkProvider; +import java.util.Random; + public class WorldGenMFBase implements IWorldGenerator { - @Override - public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, - IChunkProvider chunkProvider) { - generate(random, chunkX, chunkZ, world, world.provider.dimensionId); - } + @Override + public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, + IChunkProvider chunkProvider) { + generate(random, chunkX, chunkZ, world, world.provider.dimensionId); + } - public void generate(Random random, int chunkX, int chunkZ, World world, int dimension) { - WorldGenGeological.generate(random, chunkX, chunkZ, world, dimension); - WorldGenBiological.generate(random, chunkX, chunkZ, world, dimension); - WorldGenStructures.generate(random, chunkX, chunkZ, world, dimension); - } + public void generate(Random random, int chunkX, int chunkZ, World world, int dimension) { + WorldGenGeological.generate(random, chunkX, chunkZ, world, dimension); + WorldGenBiological.generate(random, chunkX, chunkZ, world, dimension); + WorldGenStructures.generate(random, chunkX, chunkZ, world, dimension); + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java index fc437d10..865f06e5 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java @@ -13,445 +13,451 @@ import java.util.Random; public class WorldGenMFTree extends WorldGenAbstractTree { - /** - * Contains three sets of two values that provide complimentary indices for a - * given 'major' index - 1 and 2 for 0, 0 and 2 for 1, and 0 and 1 for 2. - */ - static final byte[] otherCoordPairs = new byte[] { (byte) 2, (byte) 0, (byte) 0, (byte) 1, (byte) 2, (byte) 1 }; - /** Reference to the World object. */ - World worldObj; - int[] basePos = new int[] { 0, 0, 0 }; - int heightLimit; - int height; - double heightAttenuation = 0.618D; - double branchDensity = 1.0D; - double branchSlope = 0.381D; - double scaleWidth = 1.0D; - double leafDensity = 1.0D; - /** - * Currently always 1, can be set to 2 in the class constructor to generate a - * double-sized tree trunk for big trees. - */ - int trunkSize = 1; - /** Sets the limit of the random value used to initialize the height limit. */ - int heightLimitLimit = 12; - /** - * Sets the distance limit for how far away the generator will populate leaves - * from the base leaf node. - */ - int leafDistanceLimit = 4; - /** Contains a list of a points at which to generate groups of leaves. */ - int[][] leafNodes; - private final Block log, leaves; - private int leafMeta = 0; - - public WorldGenMFTree(boolean update, Block log, Block leaves) { - super(update); - this.log = log; - this.leaves = leaves; - if (log == BlockListMF.log_ironbark) { - leafDistanceLimit = 2; - } - heightLimitLimit = log == BlockListMF.log_ebony ? 10 : 8; - } - - public WorldGenMFTree setSaplingGrown() { - leafMeta = 1; - return this; - } - - public WorldGenMFTree setLimits(int height, int leaf) { - heightLimitLimit = height; - leafDistanceLimit = leaf; - return this; - } - - /** - * Generates a list of leaf nodes for the tree, to be populated by - * generateLeaves. - */ - void generateLeafNodeList() { - this.height = (int) (this.heightLimit * this.heightAttenuation); - - if (this.height >= this.heightLimit) { - this.height = this.heightLimit - 1; - } - - int i = (int) (1.382D + Math.pow(this.leafDensity * this.heightLimit / 13.0D, 2.0D)); - - if (i < 1) { - i = 1; - } - - int[][] aint = new int[i * this.heightLimit][4]; - int j = this.basePos[1] + this.heightLimit - this.leafDistanceLimit; - int k = 1; - int l = this.basePos[1] + this.height; - int i1 = j - this.basePos[1]; - aint[0][0] = this.basePos[0]; - aint[0][1] = j; - aint[0][2] = this.basePos[2]; - aint[0][3] = l; - --j; - - while (i1 >= 0) { - int j1 = 0; - float f = this.layerSize(i1); - - if (f < 0.0F) { - --j; - --i1; - } else { - for (double d0 = 0.5D; j1 < i; ++j1) { - double d1 = this.scaleWidth * f * (MineFantasyII.random.nextFloat() + 0.328D); - double d2 = MineFantasyII.random.nextFloat() * 2.0D * Math.PI; - int k1 = MathHelper.floor_double(d1 * Math.sin(d2) + this.basePos[0] + d0); - int l1 = MathHelper.floor_double(d1 * Math.cos(d2) + this.basePos[2] + d0); - int[] aint1 = new int[] { k1, j, l1 }; - int[] aint2 = new int[] { k1, j + this.leafDistanceLimit, l1 }; - - if (this.checkBlockLine(aint1, aint2) == -1) { - int[] aint3 = new int[] { this.basePos[0], this.basePos[1], this.basePos[2] }; - double d3 = Math.sqrt(Math.pow(Math.abs(this.basePos[0] - aint1[0]), 2.0D) - + Math.pow(Math.abs(this.basePos[2] - aint1[2]), 2.0D)); - double d4 = d3 * this.branchSlope; - - if (aint1[1] - d4 > l) { - aint3[1] = l; - } else { - aint3[1] = (int) (aint1[1] - d4); - } - - if (this.checkBlockLine(aint3, aint1) == -1) { - aint[k][0] = k1; - aint[k][1] = j; - aint[k][2] = l1; - aint[k][3] = aint3[1]; - ++k; - } - } - } - - --j; - --i1; - } - } - - this.leafNodes = new int[k][4]; - System.arraycopy(aint, 0, this.leafNodes, 0, k); - } - - void generateLeaf(int x, int y, int z, float f, byte b, Block block) { - int l = (int) (f + 0.618D); - byte b1 = otherCoordPairs[b]; - byte b2 = otherCoordPairs[b + 3]; - int[] aint = new int[] { x, y, z }; - int[] aint1 = new int[] { 0, 0, 0 }; - int i1 = -l; - int j1 = -l; - - for (aint1[b] = aint[b]; i1 <= l; ++i1) { - aint1[b1] = aint[b1] + i1; - j1 = -l; - - while (j1 <= l) { - double d0 = Math.pow(Math.abs(i1) + 0.5D, 2.0D) + Math.pow(Math.abs(j1) + 0.5D, 2.0D); - - if (d0 > f * f) { - ++j1; - } else { - aint1[b2] = aint[b2] + j1; - Block block1 = this.worldObj.getBlock(aint1[0], aint1[1], aint1[2]); - - if (!block1.isAir(worldObj, aint1[0], aint1[1], aint1[2]) - && !block1.isLeaves(worldObj, aint1[0], aint1[1], aint1[2])) { - ++j1; - } else { - this.setBlockAndNotifyAdequately(this.worldObj, aint1[0], aint1[1], aint1[2], block, leafMeta); - ++j1; - } - } - } - } - } - - /** - * Gets the rough size of a layer of the tree. - */ - float layerSize(int layer) { - if (layer < (this.heightLimit) * 0.3D) { - return -1.618F; - } else { - float f = this.heightLimit / 2.0F; - float f1 = this.heightLimit / 2.0F - layer; - float f2; - - if (f1 == 0.0F) { - f2 = f; - } else if (Math.abs(f1) >= f) { - f2 = 0.0F; - } else { - f2 = (float) Math.sqrt(Math.pow(Math.abs(f), 2.0D) - Math.pow(Math.abs(f1), 2.0D)); - } - - f2 *= 0.5F; - return f2; - } - } - - float leafSize(int layer) { - return layer >= 0 && layer < this.leafDistanceLimit - ? (layer != 0 && layer != this.leafDistanceLimit - 1 ? 3.0F : 2.0F) - : -1.0F; - } - - /** - * Generates the leaves surrounding an individual entry in the leafNodes list. - */ - void generateLeafNode(int x, int y, int z) { - int l = y; - - for (int i1 = y + this.leafDistanceLimit; l < i1; ++l) { - float f = this.leafSize(l - y); - this.generateLeaf(x, l, z, f, (byte) 1, this.leaves); - } - } - - void func_150530_a(int[] x, int[] y, Block block) { - int[] aint2 = new int[] { 0, 0, 0 }; - byte b0 = 0; - byte b1; - - for (b1 = 0; b0 < 3; ++b0) { - aint2[b0] = y[b0] - x[b0]; - - if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) { - b1 = b0; - } - } - - if (aint2[b1] != 0) { - byte b2 = otherCoordPairs[b1]; - byte b3 = otherCoordPairs[b1 + 3]; - byte b4; - - if (aint2[b1] > 0) { - b4 = 1; - } else { - b4 = -1; - } - - double d0 = (double) aint2[b2] / (double) aint2[b1]; - double d1 = (double) aint2[b3] / (double) aint2[b1]; - int[] aint3 = new int[] { 0, 0, 0 }; - int i = 0; - - for (int j = aint2[b1] + b4; i != j; i += b4) { - aint3[b1] = MathHelper.floor_double(x[b1] + i + 0.5D); - aint3[b2] = MathHelper.floor_double(x[b2] + i * d0 + 0.5D); - aint3[b3] = MathHelper.floor_double(x[b3] + i * d1 + 0.5D); - byte b5 = 0; - int k = Math.abs(aint3[0] - x[0]); - int l = Math.abs(aint3[2] - x[2]); - int i1 = Math.max(k, l); - - if (i1 > 0) { - if (k == i1) { - b5 = 4; - } else if (l == i1) { - b5 = 8; - } - } - - this.setBlockAndNotifyAdequately(this.worldObj, aint3[0], aint3[1], aint3[2], block, b5); - } - } - } - - /** - * Generates the leaf portion of the tree as specified by the leafNodes list. - */ - void generateLeaves() { - int i = 0; - - for (int j = this.leafNodes.length; i < j; ++i) { - int k = this.leafNodes[i][0]; - int l = this.leafNodes[i][1]; - int i1 = this.leafNodes[i][2]; - this.generateLeafNode(k, l, i1); - } - } - - /** - * Indicates whether or not a leaf node requires additional wood to be added to - * preserve integrity. - */ - boolean leafNodeNeedsBase(int p_76493_1_) { - return p_76493_1_ >= this.heightLimit * 0.2D; - } - - /** - * Places the trunk for the big tree that is being generated. Able to generate - * double-sized trunks by changing a field that is always 1 to 2. - */ - void generateTrunk() { - int i = this.basePos[0]; - int j = this.basePos[1]; - int k = this.basePos[1] + this.height; - int l = this.basePos[2]; - int[] aint = new int[] { i, j, l }; - int[] aint1 = new int[] { i, k, l }; - this.func_150530_a(aint, aint1, this.log); - - if (this.trunkSize == 2) { - ++aint[0]; - ++aint1[0]; - this.func_150530_a(aint, aint1, this.log); - ++aint[2]; - ++aint1[2]; - this.func_150530_a(aint, aint1, this.log); - aint[0] += -1; - aint1[0] += -1; - this.func_150530_a(aint, aint1, this.log); - } - } - - /** - * Generates additional wood blocks to fill out the bases of different leaf - * nodes that would otherwise degrade. - */ - void generateLeafNodeBases() { - int i = 0; - int j = this.leafNodes.length; - - for (int[] aint = new int[] { this.basePos[0], this.basePos[1], this.basePos[2] }; i < j; ++i) { - int[] aint1 = this.leafNodes[i]; - int[] aint2 = new int[] { aint1[0], aint1[1], aint1[2] }; - aint[1] = aint1[3]; - int k = aint[1] - this.basePos[1]; - - if (this.leafNodeNeedsBase(k)) { - this.func_150530_a(aint, aint2, this.log); - } - } - } - - /** - * Checks a line of blocks in the world from the first coordinate to triplet to - * the second, returning the distance (in blocks) before a non-air, non-leaf - * block is encountered and/or the end is encountered. - */ - int checkBlockLine(int[] p_76496_1_, int[] p_76496_2_) { - int[] aint2 = new int[] { 0, 0, 0 }; - byte b0 = 0; - byte b1; - - for (b1 = 0; b0 < 3; ++b0) { - aint2[b0] = p_76496_2_[b0] - p_76496_1_[b0]; - - if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) { - b1 = b0; - } - } - - if (aint2[b1] == 0) { - return -1; - } else { - byte b2 = otherCoordPairs[b1]; - byte b3 = otherCoordPairs[b1 + 3]; - byte b4; - - if (aint2[b1] > 0) { - b4 = 1; - } else { - b4 = -1; - } - - double d0 = (double) aint2[b2] / (double) aint2[b1]; - double d1 = (double) aint2[b3] / (double) aint2[b1]; - int[] aint3 = new int[] { 0, 0, 0 }; - int i = 0; - int j; - - for (j = aint2[b1] + b4; i != j; i += b4) { - aint3[b1] = p_76496_1_[b1] + i; - aint3[b2] = MathHelper.floor_double(p_76496_1_[b2] + i * d0); - aint3[b3] = MathHelper.floor_double(p_76496_1_[b3] + i * d1); - Block block = this.worldObj.getBlock(aint3[0], aint3[1], aint3[2]); - - if (!this.isReplaceable(worldObj, aint3[0], aint3[1], aint3[2])) { - break; - } - } - - return i == j ? -1 : Math.abs(i); - } - } - - /** - * Returns a boolean indicating whether or not the current location for the - * tree, spanning basePos to to the height limit, is valid. - */ - boolean validTreeLocation() { - int[] aint = new int[] { this.basePos[0], this.basePos[1], this.basePos[2] }; - int[] aint1 = new int[] { this.basePos[0], this.basePos[1] + this.heightLimit - 1, this.basePos[2] }; - Block block = this.worldObj.getBlock(this.basePos[0], this.basePos[1] - 1, this.basePos[2]); - - boolean isSoil = block.canSustainPlant(worldObj, basePos[0], basePos[1] - 1, basePos[2], ForgeDirection.UP, - (BlockSapling) Blocks.sapling); - if (!isSoil) { - return false; - } else { - int i = this.checkBlockLine(aint, aint1); - - if (i == -1) { - return true; - } else if (i < 6) { - return false; - } else { - this.heightLimit = i; - return true; - } - } - } - - /** - * Rescales the generator settings, only used in WorldGenBigTree - */ - public void setScale(double p_76487_1_, double p_76487_3_, double p_76487_5_) { - this.heightLimitLimit = (int) (p_76487_1_ * 12.0D); - - if (p_76487_1_ > 0.5D) { - this.leafDistanceLimit = 5; - } - - this.scaleWidth = p_76487_3_; - this.leafDensity = p_76487_5_; - } - - public boolean generate(World world, Random rand, int x, int y, int z) { - this.worldObj = world; - long l = rand.nextLong(); - MineFantasyII.random.setSeed(l); - this.basePos[0] = x; - this.basePos[1] = y; - this.basePos[2] = z; - - if (this.heightLimit == 0) { - this.heightLimit = 5 + MineFantasyII.random.nextInt(this.heightLimitLimit); - } - - if (!this.validTreeLocation()) { - this.worldObj = null; // Fix vanilla Mem leak, holds latest world - return false; - } else { - this.generateLeafNodeList(); - this.generateLeaves(); - this.generateTrunk(); - this.generateLeafNodeBases(); - worldObj.setBlock(x, y, z, log, 15, 2); - this.worldObj = null; // Fix vanilla Mem leak, holds latest world - return true; - } - } + /** + * Contains three sets of two values that provide complimentary indices for a + * given 'major' index - 1 and 2 for 0, 0 and 2 for 1, and 0 and 1 for 2. + */ + static final byte[] otherCoordPairs = new byte[]{(byte) 2, (byte) 0, (byte) 0, (byte) 1, (byte) 2, (byte) 1}; + private final Block log, leaves; + /** + * Reference to the World object. + */ + World worldObj; + int[] basePos = new int[]{0, 0, 0}; + int heightLimit; + int height; + double heightAttenuation = 0.618D; + double branchDensity = 1.0D; + double branchSlope = 0.381D; + double scaleWidth = 1.0D; + double leafDensity = 1.0D; + /** + * Currently always 1, can be set to 2 in the class constructor to generate a + * double-sized tree trunk for big trees. + */ + int trunkSize = 1; + /** + * Sets the limit of the random value used to initialize the height limit. + */ + int heightLimitLimit = 12; + /** + * Sets the distance limit for how far away the generator will populate leaves + * from the base leaf node. + */ + int leafDistanceLimit = 4; + /** + * Contains a list of a points at which to generate groups of leaves. + */ + int[][] leafNodes; + private int leafMeta = 0; + + public WorldGenMFTree(boolean update, Block log, Block leaves) { + super(update); + this.log = log; + this.leaves = leaves; + if (log == BlockListMF.log_ironbark) { + leafDistanceLimit = 2; + } + heightLimitLimit = log == BlockListMF.log_ebony ? 10 : 8; + } + + public WorldGenMFTree setSaplingGrown() { + leafMeta = 1; + return this; + } + + public WorldGenMFTree setLimits(int height, int leaf) { + heightLimitLimit = height; + leafDistanceLimit = leaf; + return this; + } + + /** + * Generates a list of leaf nodes for the tree, to be populated by + * generateLeaves. + */ + void generateLeafNodeList() { + this.height = (int) (this.heightLimit * this.heightAttenuation); + + if (this.height >= this.heightLimit) { + this.height = this.heightLimit - 1; + } + + int i = (int) (1.382D + Math.pow(this.leafDensity * this.heightLimit / 13.0D, 2.0D)); + + if (i < 1) { + i = 1; + } + + int[][] aint = new int[i * this.heightLimit][4]; + int j = this.basePos[1] + this.heightLimit - this.leafDistanceLimit; + int k = 1; + int l = this.basePos[1] + this.height; + int i1 = j - this.basePos[1]; + aint[0][0] = this.basePos[0]; + aint[0][1] = j; + aint[0][2] = this.basePos[2]; + aint[0][3] = l; + --j; + + while (i1 >= 0) { + int j1 = 0; + float f = this.layerSize(i1); + + if (f < 0.0F) { + --j; + --i1; + } else { + for (double d0 = 0.5D; j1 < i; ++j1) { + double d1 = this.scaleWidth * f * (MineFantasyII.random.nextFloat() + 0.328D); + double d2 = MineFantasyII.random.nextFloat() * 2.0D * Math.PI; + int k1 = MathHelper.floor_double(d1 * Math.sin(d2) + this.basePos[0] + d0); + int l1 = MathHelper.floor_double(d1 * Math.cos(d2) + this.basePos[2] + d0); + int[] aint1 = new int[]{k1, j, l1}; + int[] aint2 = new int[]{k1, j + this.leafDistanceLimit, l1}; + + if (this.checkBlockLine(aint1, aint2) == -1) { + int[] aint3 = new int[]{this.basePos[0], this.basePos[1], this.basePos[2]}; + double d3 = Math.sqrt(Math.pow(Math.abs(this.basePos[0] - aint1[0]), 2.0D) + + Math.pow(Math.abs(this.basePos[2] - aint1[2]), 2.0D)); + double d4 = d3 * this.branchSlope; + + if (aint1[1] - d4 > l) { + aint3[1] = l; + } else { + aint3[1] = (int) (aint1[1] - d4); + } + + if (this.checkBlockLine(aint3, aint1) == -1) { + aint[k][0] = k1; + aint[k][1] = j; + aint[k][2] = l1; + aint[k][3] = aint3[1]; + ++k; + } + } + } + + --j; + --i1; + } + } + + this.leafNodes = new int[k][4]; + System.arraycopy(aint, 0, this.leafNodes, 0, k); + } + + void generateLeaf(int x, int y, int z, float f, byte b, Block block) { + int l = (int) (f + 0.618D); + byte b1 = otherCoordPairs[b]; + byte b2 = otherCoordPairs[b + 3]; + int[] aint = new int[]{x, y, z}; + int[] aint1 = new int[]{0, 0, 0}; + int i1 = -l; + int j1 = -l; + + for (aint1[b] = aint[b]; i1 <= l; ++i1) { + aint1[b1] = aint[b1] + i1; + j1 = -l; + + while (j1 <= l) { + double d0 = Math.pow(Math.abs(i1) + 0.5D, 2.0D) + Math.pow(Math.abs(j1) + 0.5D, 2.0D); + + if (d0 > f * f) { + ++j1; + } else { + aint1[b2] = aint[b2] + j1; + Block block1 = this.worldObj.getBlock(aint1[0], aint1[1], aint1[2]); + + if (!block1.isAir(worldObj, aint1[0], aint1[1], aint1[2]) + && !block1.isLeaves(worldObj, aint1[0], aint1[1], aint1[2])) { + ++j1; + } else { + this.setBlockAndNotifyAdequately(this.worldObj, aint1[0], aint1[1], aint1[2], block, leafMeta); + ++j1; + } + } + } + } + } + + /** + * Gets the rough size of a layer of the tree. + */ + float layerSize(int layer) { + if (layer < (this.heightLimit) * 0.3D) { + return -1.618F; + } else { + float f = this.heightLimit / 2.0F; + float f1 = this.heightLimit / 2.0F - layer; + float f2; + + if (f1 == 0.0F) { + f2 = f; + } else if (Math.abs(f1) >= f) { + f2 = 0.0F; + } else { + f2 = (float) Math.sqrt(Math.pow(Math.abs(f), 2.0D) - Math.pow(Math.abs(f1), 2.0D)); + } + + f2 *= 0.5F; + return f2; + } + } + + float leafSize(int layer) { + return layer >= 0 && layer < this.leafDistanceLimit + ? (layer != 0 && layer != this.leafDistanceLimit - 1 ? 3.0F : 2.0F) + : -1.0F; + } + + /** + * Generates the leaves surrounding an individual entry in the leafNodes list. + */ + void generateLeafNode(int x, int y, int z) { + int l = y; + + for (int i1 = y + this.leafDistanceLimit; l < i1; ++l) { + float f = this.leafSize(l - y); + this.generateLeaf(x, l, z, f, (byte) 1, this.leaves); + } + } + + void func_150530_a(int[] x, int[] y, Block block) { + int[] aint2 = new int[]{0, 0, 0}; + byte b0 = 0; + byte b1; + + for (b1 = 0; b0 < 3; ++b0) { + aint2[b0] = y[b0] - x[b0]; + + if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) { + b1 = b0; + } + } + + if (aint2[b1] != 0) { + byte b2 = otherCoordPairs[b1]; + byte b3 = otherCoordPairs[b1 + 3]; + byte b4; + + if (aint2[b1] > 0) { + b4 = 1; + } else { + b4 = -1; + } + + double d0 = (double) aint2[b2] / (double) aint2[b1]; + double d1 = (double) aint2[b3] / (double) aint2[b1]; + int[] aint3 = new int[]{0, 0, 0}; + int i = 0; + + for (int j = aint2[b1] + b4; i != j; i += b4) { + aint3[b1] = MathHelper.floor_double(x[b1] + i + 0.5D); + aint3[b2] = MathHelper.floor_double(x[b2] + i * d0 + 0.5D); + aint3[b3] = MathHelper.floor_double(x[b3] + i * d1 + 0.5D); + byte b5 = 0; + int k = Math.abs(aint3[0] - x[0]); + int l = Math.abs(aint3[2] - x[2]); + int i1 = Math.max(k, l); + + if (i1 > 0) { + if (k == i1) { + b5 = 4; + } else if (l == i1) { + b5 = 8; + } + } + + this.setBlockAndNotifyAdequately(this.worldObj, aint3[0], aint3[1], aint3[2], block, b5); + } + } + } + + /** + * Generates the leaf portion of the tree as specified by the leafNodes list. + */ + void generateLeaves() { + int i = 0; + + for (int j = this.leafNodes.length; i < j; ++i) { + int k = this.leafNodes[i][0]; + int l = this.leafNodes[i][1]; + int i1 = this.leafNodes[i][2]; + this.generateLeafNode(k, l, i1); + } + } + + /** + * Indicates whether or not a leaf node requires additional wood to be added to + * preserve integrity. + */ + boolean leafNodeNeedsBase(int p_76493_1_) { + return p_76493_1_ >= this.heightLimit * 0.2D; + } + + /** + * Places the trunk for the big tree that is being generated. Able to generate + * double-sized trunks by changing a field that is always 1 to 2. + */ + void generateTrunk() { + int i = this.basePos[0]; + int j = this.basePos[1]; + int k = this.basePos[1] + this.height; + int l = this.basePos[2]; + int[] aint = new int[]{i, j, l}; + int[] aint1 = new int[]{i, k, l}; + this.func_150530_a(aint, aint1, this.log); + + if (this.trunkSize == 2) { + ++aint[0]; + ++aint1[0]; + this.func_150530_a(aint, aint1, this.log); + ++aint[2]; + ++aint1[2]; + this.func_150530_a(aint, aint1, this.log); + aint[0] += -1; + aint1[0] += -1; + this.func_150530_a(aint, aint1, this.log); + } + } + + /** + * Generates additional wood blocks to fill out the bases of different leaf + * nodes that would otherwise degrade. + */ + void generateLeafNodeBases() { + int i = 0; + int j = this.leafNodes.length; + + for (int[] aint = new int[]{this.basePos[0], this.basePos[1], this.basePos[2]}; i < j; ++i) { + int[] aint1 = this.leafNodes[i]; + int[] aint2 = new int[]{aint1[0], aint1[1], aint1[2]}; + aint[1] = aint1[3]; + int k = aint[1] - this.basePos[1]; + + if (this.leafNodeNeedsBase(k)) { + this.func_150530_a(aint, aint2, this.log); + } + } + } + + /** + * Checks a line of blocks in the world from the first coordinate to triplet to + * the second, returning the distance (in blocks) before a non-air, non-leaf + * block is encountered and/or the end is encountered. + */ + int checkBlockLine(int[] p_76496_1_, int[] p_76496_2_) { + int[] aint2 = new int[]{0, 0, 0}; + byte b0 = 0; + byte b1; + + for (b1 = 0; b0 < 3; ++b0) { + aint2[b0] = p_76496_2_[b0] - p_76496_1_[b0]; + + if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) { + b1 = b0; + } + } + + if (aint2[b1] == 0) { + return -1; + } else { + byte b2 = otherCoordPairs[b1]; + byte b3 = otherCoordPairs[b1 + 3]; + byte b4; + + if (aint2[b1] > 0) { + b4 = 1; + } else { + b4 = -1; + } + + double d0 = (double) aint2[b2] / (double) aint2[b1]; + double d1 = (double) aint2[b3] / (double) aint2[b1]; + int[] aint3 = new int[]{0, 0, 0}; + int i = 0; + int j; + + for (j = aint2[b1] + b4; i != j; i += b4) { + aint3[b1] = p_76496_1_[b1] + i; + aint3[b2] = MathHelper.floor_double(p_76496_1_[b2] + i * d0); + aint3[b3] = MathHelper.floor_double(p_76496_1_[b3] + i * d1); + Block block = this.worldObj.getBlock(aint3[0], aint3[1], aint3[2]); + + if (!this.isReplaceable(worldObj, aint3[0], aint3[1], aint3[2])) { + break; + } + } + + return i == j ? -1 : Math.abs(i); + } + } + + /** + * Returns a boolean indicating whether or not the current location for the + * tree, spanning basePos to to the height limit, is valid. + */ + boolean validTreeLocation() { + int[] aint = new int[]{this.basePos[0], this.basePos[1], this.basePos[2]}; + int[] aint1 = new int[]{this.basePos[0], this.basePos[1] + this.heightLimit - 1, this.basePos[2]}; + Block block = this.worldObj.getBlock(this.basePos[0], this.basePos[1] - 1, this.basePos[2]); + + boolean isSoil = block.canSustainPlant(worldObj, basePos[0], basePos[1] - 1, basePos[2], ForgeDirection.UP, + (BlockSapling) Blocks.sapling); + if (!isSoil) { + return false; + } else { + int i = this.checkBlockLine(aint, aint1); + + if (i == -1) { + return true; + } else if (i < 6) { + return false; + } else { + this.heightLimit = i; + return true; + } + } + } + + /** + * Rescales the generator settings, only used in WorldGenBigTree + */ + public void setScale(double p_76487_1_, double p_76487_3_, double p_76487_5_) { + this.heightLimitLimit = (int) (p_76487_1_ * 12.0D); + + if (p_76487_1_ > 0.5D) { + this.leafDistanceLimit = 5; + } + + this.scaleWidth = p_76487_3_; + this.leafDensity = p_76487_5_; + } + + public boolean generate(World world, Random rand, int x, int y, int z) { + this.worldObj = world; + long l = rand.nextLong(); + MineFantasyII.random.setSeed(l); + this.basePos[0] = x; + this.basePos[1] = y; + this.basePos[2] = z; + + if (this.heightLimit == 0) { + this.heightLimit = 5 + MineFantasyII.random.nextInt(this.heightLimitLimit); + } + + if (!this.validTreeLocation()) { + this.worldObj = null; // Fix vanilla Mem leak, holds latest world + return false; + } else { + this.generateLeafNodeList(); + this.generateLeaves(); + this.generateTrunk(); + this.generateLeafNodeBases(); + worldObj.setBlock(x, y, z, log, 15, 2); + this.worldObj = null; // Fix vanilla Mem leak, holds latest world + return true; + } + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMinableMF.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMinableMF.java index bafd69a5..e5c8bbff 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMinableMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMinableMF.java @@ -1,85 +1,87 @@ package minefantasy.mf2.mechanics.worldGen; -import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; +import java.util.Random; + public class WorldGenMinableMF extends WorldGenerator { - private Block oreBlock; - /** The number of blocks to generate. */ - private int numberOfBlocks; - private Block beddingBlock; - private static final String __OBFID = "CL_00000426"; - private int mineableBlockMeta; + private static final String __OBFID = "CL_00000426"; + private Block oreBlock; + /** + * The number of blocks to generate. + */ + private int numberOfBlocks; + private Block beddingBlock; + private int mineableBlockMeta; - public WorldGenMinableMF(Block ore, int size) { - this(ore, size, Blocks.stone); - } + public WorldGenMinableMF(Block ore, int size) { + this(ore, size, Blocks.stone); + } - public WorldGenMinableMF(Block ore, int size, Block bed) { - this.oreBlock = ore; - this.numberOfBlocks = size; - this.beddingBlock = bed; - } + public WorldGenMinableMF(Block ore, int size, Block bed) { + this.oreBlock = ore; + this.numberOfBlocks = size; + this.beddingBlock = bed; + } - public WorldGenMinableMF(Block block, int meta, int number, Block target) { - this(block, number, target); - this.mineableBlockMeta = meta; - } + public WorldGenMinableMF(Block block, int meta, int number, Block target) { + this(block, number, target); + this.mineableBlockMeta = meta; + } - @Override - public boolean generate(World world, Random seed, int x, int y, int z) { - boolean success = false; + @Override + public boolean generate(World world, Random seed, int x, int y, int z) { + boolean success = false; - float f = seed.nextFloat() * (float) Math.PI; - double d0 = x + 8 + MathHelper.sin(f) * this.numberOfBlocks / 8.0F; - double d1 = x + 8 - MathHelper.sin(f) * this.numberOfBlocks / 8.0F; - double d2 = z + 8 + MathHelper.cos(f) * this.numberOfBlocks / 8.0F; - double d3 = z + 8 - MathHelper.cos(f) * this.numberOfBlocks / 8.0F; - double d4 = y + seed.nextInt(3) - 2; - double d5 = y + seed.nextInt(3) - 2; + float f = seed.nextFloat() * (float) Math.PI; + double d0 = x + 8 + MathHelper.sin(f) * this.numberOfBlocks / 8.0F; + double d1 = x + 8 - MathHelper.sin(f) * this.numberOfBlocks / 8.0F; + double d2 = z + 8 + MathHelper.cos(f) * this.numberOfBlocks / 8.0F; + double d3 = z + 8 - MathHelper.cos(f) * this.numberOfBlocks / 8.0F; + double d4 = y + seed.nextInt(3) - 2; + double d5 = y + seed.nextInt(3) - 2; - for (int l = 0; l <= this.numberOfBlocks; ++l) { - double d6 = d0 + (d1 - d0) * l / this.numberOfBlocks; - double d7 = d4 + (d5 - d4) * l / this.numberOfBlocks; - double d8 = d2 + (d3 - d2) * l / this.numberOfBlocks; - double d9 = seed.nextDouble() * this.numberOfBlocks / 16.0D; - double d10 = (MathHelper.sin(l * (float) Math.PI / this.numberOfBlocks) + 1.0F) * d9 + 1.0D; - double d11 = (MathHelper.sin(l * (float) Math.PI / this.numberOfBlocks) + 1.0F) * d9 + 1.0D; - int i1 = MathHelper.floor_double(d6 - d10 / 2.0D); - int j1 = MathHelper.floor_double(d7 - d11 / 2.0D); - int k1 = MathHelper.floor_double(d8 - d10 / 2.0D); - int l1 = MathHelper.floor_double(d6 + d10 / 2.0D); - int i2 = MathHelper.floor_double(d7 + d11 / 2.0D); - int j2 = MathHelper.floor_double(d8 + d10 / 2.0D); + for (int l = 0; l <= this.numberOfBlocks; ++l) { + double d6 = d0 + (d1 - d0) * l / this.numberOfBlocks; + double d7 = d4 + (d5 - d4) * l / this.numberOfBlocks; + double d8 = d2 + (d3 - d2) * l / this.numberOfBlocks; + double d9 = seed.nextDouble() * this.numberOfBlocks / 16.0D; + double d10 = (MathHelper.sin(l * (float) Math.PI / this.numberOfBlocks) + 1.0F) * d9 + 1.0D; + double d11 = (MathHelper.sin(l * (float) Math.PI / this.numberOfBlocks) + 1.0F) * d9 + 1.0D; + int i1 = MathHelper.floor_double(d6 - d10 / 2.0D); + int j1 = MathHelper.floor_double(d7 - d11 / 2.0D); + int k1 = MathHelper.floor_double(d8 - d10 / 2.0D); + int l1 = MathHelper.floor_double(d6 + d10 / 2.0D); + int i2 = MathHelper.floor_double(d7 + d11 / 2.0D); + int j2 = MathHelper.floor_double(d8 + d10 / 2.0D); - for (int oreX = i1; oreX <= l1; ++oreX) { - double d12 = (oreX + 0.5D - d6) / (d10 / 2.0D); + for (int oreX = i1; oreX <= l1; ++oreX) { + double d12 = (oreX + 0.5D - d6) / (d10 / 2.0D); - if (d12 * d12 < 1.0D) { - for (int oreY = j1; oreY <= i2; ++oreY) { - double d13 = (oreY + 0.5D - d7) / (d11 / 2.0D); + if (d12 * d12 < 1.0D) { + for (int oreY = j1; oreY <= i2; ++oreY) { + double d13 = (oreY + 0.5D - d7) / (d11 / 2.0D); - if (d12 * d12 + d13 * d13 < 1.0D) { - for (int oreZ = k1; oreZ <= j2; ++oreZ) { - double d14 = (oreZ + 0.5D - d8) / (d10 / 2.0D); + if (d12 * d12 + d13 * d13 < 1.0D) { + for (int oreZ = k1; oreZ <= j2; ++oreZ) { + double d14 = (oreZ + 0.5D - d8) / (d10 / 2.0D); - if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0D && world.getBlock(oreX, oreY, oreZ) - .isReplaceableOreGen(world, oreX, oreY, oreZ, beddingBlock)) { - success = true; - world.setBlock(oreX, oreY, oreZ, this.oreBlock, mineableBlockMeta, 2); - } - } - } - } - } - } - } + if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0D && world.getBlock(oreX, oreY, oreZ) + .isReplaceableOreGen(world, oreX, oreY, oreZ, beddingBlock)) { + success = true; + world.setBlock(oreX, oreY, oreZ, this.oreBlock, mineableBlockMeta, 2); + } + } + } + } + } + } + } - return success; - } + return success; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenStructures.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenStructures.java index f81a778f..c678aa58 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenStructures.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenStructures.java @@ -1,7 +1,5 @@ package minefantasy.mf2.mechanics.worldGen; -import java.util.Random; - import minefantasy.mf2.config.ConfigWorldGen; import minefantasy.mf2.mechanics.worldGen.structure.WorldGenAncientAlter; import minefantasy.mf2.mechanics.worldGen.structure.WorldGenAncientForge; @@ -10,111 +8,113 @@ import net.minecraft.init.Blocks; import net.minecraft.world.World; +import java.util.Random; + public class WorldGenStructures { - public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) { - ++chunkCount; - if (dimension == 0) { - if (seed.nextFloat() < ConfigWorldGen.MFChance) { - generateAncientForge(seed, chunkX, chunkZ, world); - } - if (seed.nextFloat() < ConfigWorldGen.MAChance) { - generateAncientAlter(seed, chunkX, chunkZ, world); - } - if (confineToGrid(chunkX, chunkZ, ConfigWorldGen.DSGrid)) { - if (seed.nextFloat() < ConfigWorldGen.DSChance) { - generateDwarvenStronghold(seed, chunkX, chunkZ, world); - } else { - // placeGridBeacon(world, chunkX, chunkZ); - } - } - } - } + private static int strongholdCount, chunkCount; - /** - * Used in testing to determine the potential areas for dwarven entries - */ - private static void placeGridBeacon(World world, int chunkX, int chunkZ) { - int x = (16 * chunkX); - int z = (16 * chunkZ); - int y = world.getTopSolidOrLiquidBlock(x, z) + 1; - for (int x1 = 0; x1 < 3; x1++) { - for (int z1 = 0; z1 < 3; z1++) { - world.setBlock(x + x1, y, z + z1, (x == 0 && z == 0) ? Blocks.gold_block : Blocks.iron_block); - } - } - world.setBlock(x + 1, y + 1, z + 1, Blocks.beacon); - } + public static void generate(Random seed, int chunkX, int chunkZ, World world, int dimension) { + ++chunkCount; + if (dimension == 0) { + if (seed.nextFloat() < ConfigWorldGen.MFChance) { + generateAncientForge(seed, chunkX, chunkZ, world); + } + if (seed.nextFloat() < ConfigWorldGen.MAChance) { + generateAncientAlter(seed, chunkX, chunkZ, world); + } + if (confineToGrid(chunkX, chunkZ, ConfigWorldGen.DSGrid)) { + if (seed.nextFloat() < ConfigWorldGen.DSChance) { + generateDwarvenStronghold(seed, chunkX, chunkZ, world); + } else { + // placeGridBeacon(world, chunkX, chunkZ); + } + } + } + } - private static boolean confineToGrid(int chunkX, int chunkZ, int chunkSize) { - return chunkX % chunkSize == 0 && chunkZ % chunkSize == 0; - } + /** + * Used in testing to determine the potential areas for dwarven entries + */ + private static void placeGridBeacon(World world, int chunkX, int chunkZ) { + int x = (16 * chunkX); + int z = (16 * chunkZ); + int y = world.getTopSolidOrLiquidBlock(x, z) + 1; + for (int x1 = 0; x1 < 3; x1++) { + for (int z1 = 0; z1 < 3; z1++) { + world.setBlock(x + x1, y, z + z1, (x == 0 && z == 0) ? Blocks.gold_block : Blocks.iron_block); + } + } + world.setBlock(x + 1, y + 1, z + 1, Blocks.beacon); + } - private static void generateAncientForge(Random seed, int chunkX, int chunkZ, World world) { - int x = (16 * chunkX); - int z = (16 * chunkZ); - WorldGenAncientForge forge = new WorldGenAncientForge(); - for (int x1 = 0; x1 < 16; x1++) { - for (int z1 = 0; z1 < 16; z1++) { - if (forge.generate(world, seed, x + x1, 0, z + z1)) { - MFLogUtil.logDebug("Placed Ancient Forge at " + x + x1 + " " + z + z1); - return; - } - } - } - forge = null; - } + private static boolean confineToGrid(int chunkX, int chunkZ, int chunkSize) { + return chunkX % chunkSize == 0 && chunkZ % chunkSize == 0; + } - private static int strongholdCount, chunkCount; + private static void generateAncientForge(Random seed, int chunkX, int chunkZ, World world) { + int x = (16 * chunkX); + int z = (16 * chunkZ); + WorldGenAncientForge forge = new WorldGenAncientForge(); + for (int x1 = 0; x1 < 16; x1++) { + for (int z1 = 0; z1 < 16; z1++) { + if (forge.generate(world, seed, x + x1, 0, z + z1)) { + MFLogUtil.logDebug("Placed Ancient Forge at " + x + x1 + " " + z + z1); + return; + } + } + } + forge = null; + } - private static void generateDwarvenStronghold(Random seed, int chunkX, int chunkZ, World world) { - int x = (16 * chunkX); - int z = (16 * chunkZ); - WorldGenDwarvenStronghold stronghold = new WorldGenDwarvenStronghold(); - for (int x1 = 0; x1 < 16; x1++) { - for (int z1 = 0; z1 < 16; z1++) { - if (stronghold.generate(world, seed, x + x1, 0, z + z1)) { - ++strongholdCount; - MFLogUtil.logDebug("Placed Dwarven Stronghold in wall at " + x + x1 + " " + z + z1); - String s = "Gen: " + strongholdCount + " Strongholds in " + chunkCount + " Chunks = " - + ((float) strongholdCount / (float) chunkCount * 100F) + "% cases"; - System.out.println(s); - return; - } - } - } - stronghold.setSurfaceMode(true); - int x1 = seed.nextInt(16); - int z1 = seed.nextInt(16); - if (stronghold.generate(world, seed, x + x1, 0, z + z1)) { - ++strongholdCount; - MFLogUtil.logDebug("Placed Dwarven Stronghold on ground at " + x + x1 + " " + z + z1); - String s = "Gen: " + strongholdCount + " Strongholds in " + chunkCount + " Chunks = " - + ((float) strongholdCount / (float) chunkCount * 100F) + "% cases"; - System.out.println(s); - return; - } - stronghold = null; - } + private static void generateDwarvenStronghold(Random seed, int chunkX, int chunkZ, World world) { + int x = (16 * chunkX); + int z = (16 * chunkZ); + WorldGenDwarvenStronghold stronghold = new WorldGenDwarvenStronghold(); + for (int x1 = 0; x1 < 16; x1++) { + for (int z1 = 0; z1 < 16; z1++) { + if (stronghold.generate(world, seed, x + x1, 0, z + z1)) { + ++strongholdCount; + MFLogUtil.logDebug("Placed Dwarven Stronghold in wall at " + x + x1 + " " + z + z1); + String s = "Gen: " + strongholdCount + " Strongholds in " + chunkCount + " Chunks = " + + ((float) strongholdCount / (float) chunkCount * 100F) + "% cases"; + System.out.println(s); + return; + } + } + } + stronghold.setSurfaceMode(true); + int x1 = seed.nextInt(16); + int z1 = seed.nextInt(16); + if (stronghold.generate(world, seed, x + x1, 0, z + z1)) { + ++strongholdCount; + MFLogUtil.logDebug("Placed Dwarven Stronghold on ground at " + x + x1 + " " + z + z1); + String s = "Gen: " + strongholdCount + " Strongholds in " + chunkCount + " Chunks = " + + ((float) strongholdCount / (float) chunkCount * 100F) + "% cases"; + System.out.println(s); + return; + } + stronghold = null; + } - private static void generateAncientAlter(Random seed, int chunkX, int chunkZ, World world) { - int spawnZ = world.getSpawnPoint().posZ; - int spawnChunkZ = (int) (spawnZ / 16F); + private static void generateAncientAlter(Random seed, int chunkX, int chunkZ, World world) { + int spawnZ = world.getSpawnPoint().posZ; + int spawnChunkZ = (int) (spawnZ / 16F); - if (chunkZ == spawnChunkZ) { - int x = (16 * chunkX); - int z = (16 * chunkZ); + if (chunkZ == spawnChunkZ) { + int x = (16 * chunkX); + int z = (16 * chunkZ); - WorldGenAncientAlter ruin = new WorldGenAncientAlter(); - for (int x1 = 0; x1 < 16; x1++) { - // for(int z1 = 0; z1 < 16; z1++) - { - if (ruin.generate(world, seed, x + x1, 0, spawnZ)) { - MFLogUtil.logDebug("Placed Ancient Alter at " + x + x1 + " " + spawnZ); - return; - } - } - } - ruin = null; - } - } + WorldGenAncientAlter ruin = new WorldGenAncientAlter(); + for (int x1 = 0; x1 < 16; x1++) { + // for(int z1 = 0; z1 < 16; z1++) + { + if (ruin.generate(world, seed, x + x1, 0, spawnZ)) { + MFLogUtil.logDebug("Placed Ancient Alter at " + x + x1 + " " + spawnZ); + return; + } + } + } + ruin = null; + } + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/LootTypes.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/LootTypes.java index e1ab5037..2711bf88 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/LootTypes.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/LootTypes.java @@ -1,10 +1,10 @@ package minefantasy.mf2.mechanics.worldGen.structure; public class LootTypes { - public static final String DWARVEN_ARMOURY = "DwarvenArmoury"; - public static final String DWARVEN_AMMO = "DwarvenAmmo"; - public static final String DWARVEN_FORGE = "DwarvenForge"; - public static final String DWARVEN_HOME = "DwarvenHouse"; - public static final String DWARVEN_HOME_RICH = "DwarvenHouseRich"; - public static final String DWARVEN_STUDY = "DwarvenStudy"; + public static final String DWARVEN_ARMOURY = "DwarvenArmoury"; + public static final String DWARVEN_AMMO = "DwarvenAmmo"; + public static final String DWARVEN_FORGE = "DwarvenForge"; + public static final String DWARVEN_HOME = "DwarvenHouse"; + public static final String DWARVEN_HOME_RICH = "DwarvenHouseRich"; + public static final String DWARVEN_STUDY = "DwarvenStudy"; } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java index 5fcd2af3..0255bcc5 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAFRoom.java @@ -1,7 +1,5 @@ package minefantasy.mf2.mechanics.worldGen.structure; -import java.util.Random; - import minefantasy.mf2.item.list.ComponentListMF; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; @@ -12,95 +10,94 @@ public class StructureGenAFRoom extends StructureModuleMF { - public StructureGenAFRoom(World world, int x, int y, int z, int d) { - super(world, x, y, z, d); - } - - public StructureGenAFRoom(World world, StructureCoordinates position) { - super(world, position); - } - - @Override - public void generate() { - int width = 7; - int depth = 6; - // FLOOR - for (int x = -width / 2; x <= width / 2; x++) { - for (int z = 0; z <= depth; z++) { - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, 0, z); - } - } - - // CEIL - for (int x = -width / 2; x <= width / 2; x++) { - for (int z = 0; z <= depth; z++) { - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, 5, z); - } - } - // INT - for (int x = -width / 2; x <= width / 2; x++) { - for (int z = 0; z <= depth; z++) { - for (int y = 1; y <= 4; y++) { - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y, z); - } - } - } - // HOLLOW - for (int x = (-width / 2) + 1; x <= (width / 2) - 1; x++) { - for (int z = 1; z <= depth - 1; z++) { - for (int y = 1; y <= 4; y++) { - placeBlock(Blocks.air, 0, x, y, z); - } - } - } - - // CHEST - { - int x = 0; - int y = 0; - int z = depth / 2; - - placeChest(0, 1, depth - 1, lootType); - placeSpawner(0, 1, z, "Silverfish"); - - for (int x2 = -1; x2 <= 1; x2++) { - placeBlock(Blocks.air, 0, x2, 1, 0); - placeBlock(Blocks.air, 0, x2, 2, 0); - } - placeBlock(Blocks.air, 0, 0, 3, 0); - - } - } - - private void placeChest(int x, int y, int z, String loot) { - int[] coords = this.offsetPos(x, y, z, direction); - worldObj.setBlock(coords[0], coords[1], coords[2], Blocks.chest, direction, 2); - TileEntityChest tileentitychest = (TileEntityChest) worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if (tileentitychest != null) { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tileentitychest, - ChestGenHooks.getCount(loot, rand)); - if (hasTrinket) { - // North = -z, South = +z - int sp = worldObj.getSpawnPoint().posZ; - int item = (coords[2] < sp) ? 1 : 0; - int artId = rand.nextInt(tileentitychest.getSizeInventory()); - tileentitychest.setInventorySlotContents(artId, new ItemStack(ComponentListMF.artefacts, 1, item)); - } - } - } - - private String lootType = ChestGenHooks.DUNGEON_CHEST; - - public StructureModuleMF setLoot(String loot) { - this.lootType = loot; - return this; - } - - private boolean hasTrinket = false; - - public StructureModuleMF giveTrinket() { - hasTrinket = true; - return this; - } + private String lootType = ChestGenHooks.DUNGEON_CHEST; + private boolean hasTrinket = false; + + public StructureGenAFRoom(World world, int x, int y, int z, int d) { + super(world, x, y, z, d); + } + + public StructureGenAFRoom(World world, StructureCoordinates position) { + super(world, position); + } + + @Override + public void generate() { + int width = 7; + int depth = 6; + // FLOOR + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, 0, z); + } + } + + // CEIL + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, 5, z); + } + } + // INT + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { + for (int y = 1; y <= 4; y++) { + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y, z); + } + } + } + // HOLLOW + for (int x = (-width / 2) + 1; x <= (width / 2) - 1; x++) { + for (int z = 1; z <= depth - 1; z++) { + for (int y = 1; y <= 4; y++) { + placeBlock(Blocks.air, 0, x, y, z); + } + } + } + + // CHEST + { + int x = 0; + int y = 0; + int z = depth / 2; + + placeChest(0, 1, depth - 1, lootType); + placeSpawner(0, 1, z, "Silverfish"); + + for (int x2 = -1; x2 <= 1; x2++) { + placeBlock(Blocks.air, 0, x2, 1, 0); + placeBlock(Blocks.air, 0, x2, 2, 0); + } + placeBlock(Blocks.air, 0, 0, 3, 0); + + } + } + + private void placeChest(int x, int y, int z, String loot) { + int[] coords = this.offsetPos(x, y, z, direction); + worldObj.setBlock(coords[0], coords[1], coords[2], Blocks.chest, direction, 2); + TileEntityChest tileentitychest = (TileEntityChest) worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (tileentitychest != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tileentitychest, + ChestGenHooks.getCount(loot, rand)); + if (hasTrinket) { + // North = -z, South = +z + int sp = worldObj.getSpawnPoint().posZ; + int item = (coords[2] < sp) ? 1 : 0; + int artId = rand.nextInt(tileentitychest.getSizeInventory()); + tileentitychest.setInventorySlotContents(artId, new ItemStack(ComponentListMF.artefacts, 1, item)); + } + } + } + + public StructureModuleMF setLoot(String loot) { + this.lootType = loot; + return this; + } + + public StructureModuleMF giveTrinket() { + hasTrinket = true; + return this; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientAlter.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientAlter.java index 0db4f312..cbdc3664 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientAlter.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientAlter.java @@ -11,103 +11,103 @@ import net.minecraftforge.common.ChestGenHooks; public class StructureGenAncientAlter extends StructureModuleMF { - public StructureGenAncientAlter(World world, int x, int y, int z, int d) { - super(world, x, y, z, d); - } - - StructureGenAncientAlter(World world, StructureCoordinates position) { - super(world, position); - } - - @Override - public void generate() { - int radius = 2; - // FLOOR - for (int x = -radius; x <= radius; x++) { - for (int z = -radius; z <= radius; z++) { - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, 0, z); - - Object[] array = getFoundation(radius, x, z); - if (array != null) { - int m = (Boolean) array[1] ? -1 : 0; - buildFoundation((Block) array[0], m, x, -1, z, 32, 3, false); - } - } - } - for (int p = -1; p <= 1; p++) { - placeBlock(Blocks.stone_brick_stairs, 0, -radius, 0, p, 0); - placeBlock(Blocks.stone_brick_stairs, 1, radius, 0, p, 0); - placeBlock(Blocks.stone_brick_stairs, 2, p, 0, -radius, 0); - placeBlock(Blocks.stone_brick_stairs, 3, p, 0, radius, 0); - } - placeBlock(BlockListMF.mythic_decor, 1, -radius, 0, -radius); - placeBlock(BlockListMF.mythic_decor, 1, radius, 0, -radius); - placeBlock(BlockListMF.mythic_decor, 1, -radius, 0, radius); - placeBlock(BlockListMF.mythic_decor, 1, radius, 0, radius); - - placeBlock(BlockListMF.mythic_decor, 0, -radius, 1, -radius); - placeBlock(BlockListMF.mythic_decor, 0, radius, 1, -radius); - placeBlock(BlockListMF.mythic_decor, 0, -radius, 1, radius); - placeBlock(BlockListMF.mythic_decor, 0, radius, 1, radius); - - placeBlock(BlockListMF.mythic_decor, 1, -radius, 2, -radius); - placeBlock(BlockListMF.mythic_decor, 1, radius, 2, -radius); - placeBlock(BlockListMF.mythic_decor, 1, -radius, 2, radius); - placeBlock(BlockListMF.mythic_decor, 1, radius, 2, radius); - - // CHEST - { - int x = 0; - int y = 0; - int z = 0; - - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y + 1, z); - placeChest(0, y + 2, z, lootType); - placeSpawner(0, y, z, "Enderman"); - } - - } - - private Object[] getFoundation(int radius, int x, int z) { - if (x == -radius && z == -radius) - return null; - if (x == radius && z == -radius) - return null; - if (x == -radius && z == radius) - return null; - if (x == radius && z == radius) - return null; - - if (x == 0 && z == -radius) - return new Object[] { Blocks.obsidian, false }; - if (x == 0 && z == radius) - return new Object[] { Blocks.obsidian, false }; - if (x == -radius && z == 0) - return new Object[] { Blocks.obsidian, false }; - if (x == radius && z == 0) - return new Object[] { Blocks.obsidian, false }; - - return new Object[] { Blocks.stonebrick, true }; - } - - private void placeChest(int x, int y, int z, String loot) { - int[] coords = this.offsetPos(x, y, z, direction); - worldObj.setBlock(coords[0], coords[1], coords[2], Blocks.chest, direction, 2); - TileEntityChest tileentitychest = (TileEntityChest) worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if (tileentitychest != null) { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tileentitychest, - ChestGenHooks.getCount(loot, rand)); - - int artId = rand.nextInt(tileentitychest.getSizeInventory()); - tileentitychest.setInventorySlotContents(artId, new ItemStack(ComponentListMF.artefacts, 1, 2)); - } - } - - private String lootType = ChestGenHooks.DUNGEON_CHEST; - - public StructureModuleMF setLoot(String loot) { - this.lootType = loot; - return this; - } + private String lootType = ChestGenHooks.DUNGEON_CHEST; + + public StructureGenAncientAlter(World world, int x, int y, int z, int d) { + super(world, x, y, z, d); + } + + StructureGenAncientAlter(World world, StructureCoordinates position) { + super(world, position); + } + + @Override + public void generate() { + int radius = 2; + // FLOOR + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, 0, z); + + Object[] array = getFoundation(radius, x, z); + if (array != null) { + int m = (Boolean) array[1] ? -1 : 0; + buildFoundation((Block) array[0], m, x, -1, z, 32, 3, false); + } + } + } + for (int p = -1; p <= 1; p++) { + placeBlock(Blocks.stone_brick_stairs, 0, -radius, 0, p, 0); + placeBlock(Blocks.stone_brick_stairs, 1, radius, 0, p, 0); + placeBlock(Blocks.stone_brick_stairs, 2, p, 0, -radius, 0); + placeBlock(Blocks.stone_brick_stairs, 3, p, 0, radius, 0); + } + placeBlock(BlockListMF.mythic_decor, 1, -radius, 0, -radius); + placeBlock(BlockListMF.mythic_decor, 1, radius, 0, -radius); + placeBlock(BlockListMF.mythic_decor, 1, -radius, 0, radius); + placeBlock(BlockListMF.mythic_decor, 1, radius, 0, radius); + + placeBlock(BlockListMF.mythic_decor, 0, -radius, 1, -radius); + placeBlock(BlockListMF.mythic_decor, 0, radius, 1, -radius); + placeBlock(BlockListMF.mythic_decor, 0, -radius, 1, radius); + placeBlock(BlockListMF.mythic_decor, 0, radius, 1, radius); + + placeBlock(BlockListMF.mythic_decor, 1, -radius, 2, -radius); + placeBlock(BlockListMF.mythic_decor, 1, radius, 2, -radius); + placeBlock(BlockListMF.mythic_decor, 1, -radius, 2, radius); + placeBlock(BlockListMF.mythic_decor, 1, radius, 2, radius); + + // CHEST + { + int x = 0; + int y = 0; + int z = 0; + + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y + 1, z); + placeChest(0, y + 2, z, lootType); + placeSpawner(0, y, z, "Enderman"); + } + + } + + private Object[] getFoundation(int radius, int x, int z) { + if (x == -radius && z == -radius) + return null; + if (x == radius && z == -radius) + return null; + if (x == -radius && z == radius) + return null; + if (x == radius && z == radius) + return null; + + if (x == 0 && z == -radius) + return new Object[]{Blocks.obsidian, false}; + if (x == 0 && z == radius) + return new Object[]{Blocks.obsidian, false}; + if (x == -radius && z == 0) + return new Object[]{Blocks.obsidian, false}; + if (x == radius && z == 0) + return new Object[]{Blocks.obsidian, false}; + + return new Object[]{Blocks.stonebrick, true}; + } + + private void placeChest(int x, int y, int z, String loot) { + int[] coords = this.offsetPos(x, y, z, direction); + worldObj.setBlock(coords[0], coords[1], coords[2], Blocks.chest, direction, 2); + TileEntityChest tileentitychest = (TileEntityChest) worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (tileentitychest != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tileentitychest, + ChestGenHooks.getCount(loot, rand)); + + int artId = rand.nextInt(tileentitychest.getSizeInventory()); + tileentitychest.setInventorySlotContents(artId, new ItemStack(ComponentListMF.artefacts, 1, 2)); + } + } + + public StructureModuleMF setLoot(String loot) { + this.lootType = loot; + return this; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java index a0fb82f0..f902a8e9 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForge.java @@ -1,154 +1,154 @@ package minefantasy.mf2.mechanics.worldGen.structure; -import java.util.Random; - import minefantasy.mf2.block.list.BlockListMF; import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; +import java.util.Random; + public class StructureGenAncientForge extends StructureModuleMF { - public StructureGenAncientForge(World world, int x, int y, int z, int d) { - super(world, x, y, z, d); - } - - public StructureGenAncientForge(World world, StructureCoordinates position) { - super(world, position); - } - - @Override - public void generate() { - placeBlock(Blocks.stonebrick, getRandomMetadata(rand), 0, 0, -1); - - int width = 14; - int depth = 16; - // FLOOR - for (int x = -width / 2; x <= width / 2; x++) { - for (int z = 0; z <= depth; z++) { - placeBlock(Blocks.stonebrick, getRandomMetadata(rand), x, 0, z); - } - } - - // CEIL - for (int x = -width / 2; x <= width / 2; x++) { - for (int z = 0; z <= depth; z++) { - placeBlock(Blocks.stonebrick, getRandomMetadata(rand), x, 5, z); - } - } - // WALLS - for (int x = -width / 2; x <= width / 2; x++) { - for (int z = 0; z <= depth; z++) { - for (int y = 1; y <= 4; y++) { - placeBlock(Blocks.stonebrick, getRandomMetadata(rand), x, y, z); - } - } - } - // INTERIOR - for (int x = (-width / 2) + 1; x <= (width / 2) - 1; x++) { - for (int z = 1; z <= depth - 1; z++) { - for (int y = 1; y <= 4; y++) { - if (x % 4 != 0 || z % 4 != 0) - placeBlock(Blocks.air, 0, x, y, z); - } - } - } - - // OBSIDIAN - for (int x = -3; x <= 3; x++) { - for (int z = 5; z <= 11; z++) { - for (int y = -3; y <= 0; y++) { - placeBlock(y == 0 ? BlockListMF.mythic_decor : Blocks.obsidian, 0, x, y, z); - } - } - } - // HOLLOW - for (int x = -2; x <= 2; x++) { - for (int z = 6; z <= 10; z++) { - for (int y = -2; y <= 0; y++) { - placeBlock(Blocks.air, 0, x, y, z); - } - } - } - // LAVA - for (int x = -2; x <= 2; x++) { - for (int z = 6; z <= 10; z++) { - placeBlock(Blocks.lava, 0, x, -2, z); - } - } - placeBlock(Blocks.air, 0, 0, 2, depth / 2); - placeBlock(Blocks.air, 0, 0, 3, depth / 2); - placeBlock(Blocks.air, 0, 0, 4, depth / 2); - - placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth / 2); - placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth / 2); - placeBlock(BlockListMF.mythic_decor, 1, 0, 0, depth / 2 + 3); - placeBlock(BlockListMF.mythic_decor, 1, 0, 0, depth / 2 - 3); - - placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth / 2 - 3); - placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth / 2 + 3); - placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth / 2 - 3); - placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth / 2 + 3); - - placeBlock(Blocks.obsidian, 0, 0, 0, depth / 2); - placeBlock(Blocks.obsidian, 0, 0, 0, depth / 2 - 1); - placeBlock(Blocks.obsidian, 0, 0, 0, depth / 2 - 2); - - placeBlock(BlockListMF.cruciblemythic, 0, 0, 1, depth / 2); - placeBlock(Blocks.end_portal_frame, 0, 3, 0, depth / 2 - 1); - placeBlock(Blocks.end_portal_frame, 0, -3, 0, depth / 2 - 1); - placeBlock(Blocks.end_portal_frame, 0, -1, 0, depth / 2 + 3); - placeBlock(Blocks.end_portal_frame, 0, -1, 0, depth / 2 - 3); - - placeBlock(Blocks.end_portal_frame, 0, 3, 0, depth / 2 + 1); - placeBlock(Blocks.end_portal_frame, 0, -3, 0, depth / 2 + 1); - placeBlock(Blocks.end_portal_frame, 0, 1, 0, depth / 2 + 3); - placeBlock(Blocks.end_portal_frame, 0, 1, 0, depth / 2 - 3); - - for (int y = 0; y < 4; y++) { - placeBlock(Blocks.air, 0, 0, y + 1, depth / 2 - 4); - } - placeBlock(Blocks.glowstone, 0, 0, 5, depth / 2); - placeBlock(Blocks.air, 0, 0, 1, 0); - placeBlock(Blocks.air, 0, 0, 2, 0); - - getRandomForge(0, 0, depth, direction).generate(); - - getRandomForge(width / 2, 0, depth / 2, rotateLeft()).generate(); - getRandomForge(-width / 2, 0, depth / 2, rotateRight()).generate(); - - } - - private StructureModuleMF getRandomForge(int x, int y, int z, int newDirection) { - int[] coord = this.offsetPos(x, y, z, direction); - StructureGenAFRoom room = new StructureGenAFRoom(worldObj, coord[0], coord[1], coord[2], newDirection); - - if (newDirection == direction) { - room.giveTrinket(); - } - room.setLoot(getRandomLoot()); - - return room; - } - - private String getRandomLoot() { - int i = rand.nextInt(3); - if (i == 0) { - return rand.nextBoolean() ? ChestGenHooks.STRONGHOLD_CORRIDOR : ChestGenHooks.STRONGHOLD_CROSSING; - } - if (i == 1) { - return rand.nextBoolean() ? ChestGenHooks.PYRAMID_DESERT_CHEST : ChestGenHooks.PYRAMID_JUNGLE_CHEST; - } - return ChestGenHooks.DUNGEON_CHEST; - } - - public static int getRandomMetadata(Random RNG) { - float f = RNG.nextFloat(); - - if (f < 0.2F) { - return 2; - } else if (f < 0.5F) { - return 1; - } - return 0; - } + public StructureGenAncientForge(World world, int x, int y, int z, int d) { + super(world, x, y, z, d); + } + + public StructureGenAncientForge(World world, StructureCoordinates position) { + super(world, position); + } + + public static int getRandomMetadata(Random RNG) { + float f = RNG.nextFloat(); + + if (f < 0.2F) { + return 2; + } else if (f < 0.5F) { + return 1; + } + return 0; + } + + @Override + public void generate() { + placeBlock(Blocks.stonebrick, getRandomMetadata(rand), 0, 0, -1); + + int width = 14; + int depth = 16; + // FLOOR + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { + placeBlock(Blocks.stonebrick, getRandomMetadata(rand), x, 0, z); + } + } + + // CEIL + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { + placeBlock(Blocks.stonebrick, getRandomMetadata(rand), x, 5, z); + } + } + // WALLS + for (int x = -width / 2; x <= width / 2; x++) { + for (int z = 0; z <= depth; z++) { + for (int y = 1; y <= 4; y++) { + placeBlock(Blocks.stonebrick, getRandomMetadata(rand), x, y, z); + } + } + } + // INTERIOR + for (int x = (-width / 2) + 1; x <= (width / 2) - 1; x++) { + for (int z = 1; z <= depth - 1; z++) { + for (int y = 1; y <= 4; y++) { + if (x % 4 != 0 || z % 4 != 0) + placeBlock(Blocks.air, 0, x, y, z); + } + } + } + + // OBSIDIAN + for (int x = -3; x <= 3; x++) { + for (int z = 5; z <= 11; z++) { + for (int y = -3; y <= 0; y++) { + placeBlock(y == 0 ? BlockListMF.mythic_decor : Blocks.obsidian, 0, x, y, z); + } + } + } + // HOLLOW + for (int x = -2; x <= 2; x++) { + for (int z = 6; z <= 10; z++) { + for (int y = -2; y <= 0; y++) { + placeBlock(Blocks.air, 0, x, y, z); + } + } + } + // LAVA + for (int x = -2; x <= 2; x++) { + for (int z = 6; z <= 10; z++) { + placeBlock(Blocks.lava, 0, x, -2, z); + } + } + placeBlock(Blocks.air, 0, 0, 2, depth / 2); + placeBlock(Blocks.air, 0, 0, 3, depth / 2); + placeBlock(Blocks.air, 0, 0, 4, depth / 2); + + placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth / 2); + placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth / 2); + placeBlock(BlockListMF.mythic_decor, 1, 0, 0, depth / 2 + 3); + placeBlock(BlockListMF.mythic_decor, 1, 0, 0, depth / 2 - 3); + + placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth / 2 - 3); + placeBlock(BlockListMF.mythic_decor, 1, -3, 0, depth / 2 + 3); + placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth / 2 - 3); + placeBlock(BlockListMF.mythic_decor, 1, +3, 0, depth / 2 + 3); + + placeBlock(Blocks.obsidian, 0, 0, 0, depth / 2); + placeBlock(Blocks.obsidian, 0, 0, 0, depth / 2 - 1); + placeBlock(Blocks.obsidian, 0, 0, 0, depth / 2 - 2); + + placeBlock(BlockListMF.cruciblemythic, 0, 0, 1, depth / 2); + placeBlock(Blocks.end_portal_frame, 0, 3, 0, depth / 2 - 1); + placeBlock(Blocks.end_portal_frame, 0, -3, 0, depth / 2 - 1); + placeBlock(Blocks.end_portal_frame, 0, -1, 0, depth / 2 + 3); + placeBlock(Blocks.end_portal_frame, 0, -1, 0, depth / 2 - 3); + + placeBlock(Blocks.end_portal_frame, 0, 3, 0, depth / 2 + 1); + placeBlock(Blocks.end_portal_frame, 0, -3, 0, depth / 2 + 1); + placeBlock(Blocks.end_portal_frame, 0, 1, 0, depth / 2 + 3); + placeBlock(Blocks.end_portal_frame, 0, 1, 0, depth / 2 - 3); + + for (int y = 0; y < 4; y++) { + placeBlock(Blocks.air, 0, 0, y + 1, depth / 2 - 4); + } + placeBlock(Blocks.glowstone, 0, 0, 5, depth / 2); + placeBlock(Blocks.air, 0, 0, 1, 0); + placeBlock(Blocks.air, 0, 0, 2, 0); + + getRandomForge(0, 0, depth, direction).generate(); + + getRandomForge(width / 2, 0, depth / 2, rotateLeft()).generate(); + getRandomForge(-width / 2, 0, depth / 2, rotateRight()).generate(); + + } + + private StructureModuleMF getRandomForge(int x, int y, int z, int newDirection) { + int[] coord = this.offsetPos(x, y, z, direction); + StructureGenAFRoom room = new StructureGenAFRoom(worldObj, coord[0], coord[1], coord[2], newDirection); + + if (newDirection == direction) { + room.giveTrinket(); + } + room.setLoot(getRandomLoot()); + + return room; + } + + private String getRandomLoot() { + int i = rand.nextInt(3); + if (i == 0) { + return rand.nextBoolean() ? ChestGenHooks.STRONGHOLD_CORRIDOR : ChestGenHooks.STRONGHOLD_CROSSING; + } + if (i == 1) { + return rand.nextBoolean() ? ChestGenHooks.PYRAMID_DESERT_CHEST : ChestGenHooks.PYRAMID_JUNGLE_CHEST; + } + return ChestGenHooks.DUNGEON_CHEST; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java index 96df59aa..e67eaa3d 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureGenAncientForgeEntry.java @@ -1,54 +1,52 @@ package minefantasy.mf2.mechanics.worldGen.structure; -import java.util.Random; - import net.minecraft.init.Blocks; import net.minecraft.world.World; public class StructureGenAncientForgeEntry extends StructureModuleMF { - public StructureGenAncientForgeEntry(World world, int x, int y, int z, int d) { - super(world, x, y, z, d); - } - - public StructureGenAncientForgeEntry(World world, StructureCoordinates position) { - super(world, position); - } - - @Override - public void generate() { - // Stairway - int length = 8 + rand.nextInt(8); - if (yCoord > 48) - length += (yCoord - 48); - for (int d = 1; d <= length; d++) { - for (int w = 0; w < 3; w++) { - for (int h = 0; h < 6; h++) { - if (d != 1 || h != 5) - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), -1 + w, - -d + h - 1, d + 1); - } - } - - for (int h = 0; h < 4; h++) - placeBlock(Blocks.air, 0, 0, -d + h, d + 1); - placeBlock(Blocks.stone_brick_stairs, getStairDirection(reverse()), 0, -d, d + 1); - } - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), 0, 2, 2); - for (int x = -1; x <= 1; x++) { - for (int y = -1; y <= 5; y++) { - placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y - 3, 1); - } - } - placeBlock(Blocks.air, 0, 0, 0, 1); - placeBlock(Blocks.air, 0, 0, 1, 1); - - int[] coord = offsetPos(0, -length + 1, length + 1, direction); - int x = coord[0]; - int y = coord[1]; - int z = coord[2]; - - StructureModuleMF structure = new StructureGenAncientForge(worldObj, x, y, z, direction); - structure.generate(); - } + public StructureGenAncientForgeEntry(World world, int x, int y, int z, int d) { + super(world, x, y, z, d); + } + + public StructureGenAncientForgeEntry(World world, StructureCoordinates position) { + super(world, position); + } + + @Override + public void generate() { + // Stairway + int length = 8 + rand.nextInt(8); + if (yCoord > 48) + length += (yCoord - 48); + for (int d = 1; d <= length; d++) { + for (int w = 0; w < 3; w++) { + for (int h = 0; h < 6; h++) { + if (d != 1 || h != 5) + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), -1 + w, + -d + h - 1, d + 1); + } + } + + for (int h = 0; h < 4; h++) + placeBlock(Blocks.air, 0, 0, -d + h, d + 1); + placeBlock(Blocks.stone_brick_stairs, getStairDirection(reverse()), 0, -d, d + 1); + } + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), 0, 2, 2); + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 5; y++) { + placeBlock(Blocks.stonebrick, StructureGenAncientForge.getRandomMetadata(rand), x, y - 3, 1); + } + } + placeBlock(Blocks.air, 0, 0, 0, 1); + placeBlock(Blocks.air, 0, 0, 1, 1); + + int[] coord = offsetPos(0, -length + 1, length + 1, direction); + int x = coord[0]; + int y = coord[1]; + int z = coord[2]; + + StructureModuleMF structure = new StructureGenAncientForge(worldObj, x, y, z, direction); + structure.generate(); + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java index f94457e8..671346b4 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/StructureModuleMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.mechanics.worldGen.structure; -import java.util.Random; - import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.block.tileentity.TileEntityWorldGenMarker; import minefantasy.mf2.util.XSTRandom; @@ -14,375 +12,349 @@ import net.minecraft.world.World; import net.minecraftforge.common.DungeonHooks; -import javax.xml.bind.annotation.XmlSchema; - public abstract class StructureModuleMF { - public final int xCoord; - public final int yCoord; - public final int zCoord; - /** - * (0-3) South, West, North, East - */ - public final int direction; - public final World worldObj; - protected XSTRandom rand = new XSTRandom(); - /** - * How much longer can units be added - */ - public int lengthId; - /** - * How many more branches can be added - */ - public int deviationCount; - protected String subtype = "Normal"; - - public StructureModuleMF(World world, StructureCoordinates position) { - worldObj = world; - xCoord = position.posX; - yCoord = position.posY; - zCoord = position.posZ; - direction = position.direction; - - } - - public StructureModuleMF(World world, int x, int y, int z, int d) { - this(world, new StructureCoordinates(x, y, z, d)); - } - - public StructureModuleMF(World world, int x, int y, int z) { - this(world, x, y, z, 0); - } - - public abstract void generate(); - - public boolean canGenerate() { - return true; - } - - public int rotateLeft() { - switch (direction) { - case 0: - return 3; - case 1: - return 0; - case 2: - return 1; - case 3: - return 2; - } - return 0; - } - - public int rotateRight() { - switch (direction) { - case 0: - return 1; - case 1: - return 2; - case 2: - return 3; - case 3: - return 0; - } - return 0; - } - - public int reverse() { - switch (direction) { - case 0: - return 2; - case 1: - return 3; - case 2: - return 0; - case 3: - return 1; - } - return 0; - } - - /** - * Places a block and rotates it on it's base direction for pregen designed not - * to override the worldGen marker - * - * @param id - * The blockID - * @param meta - * the block metadata - * @param x - * The x offset(relation to xCoord) - * @param y - * The y offset(relation to yCoord) - * @param z - * The z offset(relation to zCoord) - */ - public void pregenPlaceBlock(Block id, int meta, int x, int y, int z) { - if (!(x == 0 && y == 0 && z == 0)) { - placeBlock(id, meta, x, y, z, direction); - } - } - - /** - * Places a block and rotates it on it's base direction - * - * @param id - * The blockID - * @param meta - * the block metadata - * @param x - * The x offset(relation to xCoord) - * @param y - * The y offset(relation to yCoord) - * @param z - * The z offset(relation to zCoord) - */ - public void placeBlock(Block id, int meta, int x, int y, int z) { - placeBlock(id, meta, x, y, z, direction); - } - - /** - * Places a block and rotates it on direction - * - * @param id - * The blockID - * @param meta - * the block metadata - * @param xo - * The x offset(relation to xCoord) - * @param yo - * The y offset(relation to yCoord) - * @param zo - * The z offset(relation to zCoord) - * @param dir - * The direction to face - */ - public void placeBlock(Block id, int meta, int xo, int yo, int zo, int dir) { - int[] offset = offsetPos(xo, yo, zo, dir); - worldObj.setBlock(offset[0], offset[1], offset[2], id, meta, 2); - } - - public void placeBlockIfAir(Block id, int meta, int xo, int yo, int zo) { - int[] offset = offsetPos(xo, yo, zo, direction); - if (worldObj.getBlock(offset[0], offset[1], offset[2]).isReplaceable(worldObj, offset[0], offset[1], - offset[2])) { - worldObj.setBlock(offset[0], offset[1], offset[2], id, meta, 2); - } - } - - public void placeEntity(Entity entity, int x, int y, int z) { - placeEntity(entity, x, y, z, direction); - } - - public void placeEntity(Entity entity, int xo, int yo, int zo, int dir) { - int[] offset = offsetPos(xo, yo, zo, dir); - entity.setLocationAndAngles(offset[0] + 0.5D, offset[1] + entity.height - 1.0F, offset[2] + 0.5D, - MathHelper.wrapAngleTo180_float(worldObj.rand.nextFloat() * 360.0F), 0.0F); - worldObj.spawnEntityInWorld(entity); - } - - protected void buildFoundation(Block block, int meta, int x, int z) { - buildFoundation(block, meta, x, -1, z, 32, 0, false); - } - - /** - * Builds a foundation column from -1y - * - * @param block - * The block used - * @param meta - * metadata used - * @param x - * the relative x position - * @param y - * the relative y position to start - * @param z - * the relative z position - * @param max - * the max depth - * @param penetrance - * how many solid blocks can it pass through - * @param relative - * whether or not it must be stopped by concecutive blocks. - */ - protected void buildFoundation(Block block, int meta, int x, int y, int z, int max, int penetrance, - boolean relative) { - penetrance -= y; - int init_penetrance = penetrance; - while (-y < max) { - Block current = getBlock(x, y, z, direction); - boolean empty = current.getMaterial().isReplaceable(); - - if (isUnbreakable(x, y, z, direction)) { - return; - } - if (!empty) { - --penetrance; - } else if (!relative) { - penetrance = init_penetrance; - } - - if (empty || penetrance >= 0) { - placeBlock(block, meta == -1 ? StructureGenAncientForge.getRandomMetadata(rand) : meta, x, y, z); - --y; - } else { - return; - } - } - } - - public TileEntity getTileEntity(int xo, int yo, int zo, int dir) { - int[] offset = offsetPos(xo, yo, zo, dir); - return worldObj.getTileEntity(offset[0], offset[1], offset[2]); - } - - public Block getBlock(int x, int y, int z) { - return getBlock(x, y, z, direction); - } - - public Block getBlock(int xo, int yo, int zo, int dir) { - int[] offset = offsetPos(xo, yo, zo, dir); - return worldObj.getBlock(offset[0], offset[1], offset[2]); - } - - public boolean isUnbreakable(int xo, int yo, int zo, int dir) { - return getHardness(xo, yo, zo, dir) < 0; - } - - public float getHardness(int xo, int yo, int zo, int dir) { - int[] offset = offsetPos(xo, yo, zo, dir); - return worldObj.getBlock(offset[0], offset[1], offset[2]).getBlockHardness(worldObj, offset[0], offset[1], - offset[2]); - } - - public void notifyBlock(Block id, int xo, int yo, int zo, int dir) { - int[] offset = offsetPos(xo, yo, zo, dir); - worldObj.notifyBlockChange(offset[0], offset[1], offset[2], id); - } - - public int[] offsetPos(int xo, int yo, int zo, int dir) { - int u = 2; - int x = xCoord; - int y = yCoord + yo; - int z = zCoord; - - switch (dir) { - case 0:// NORTH - x += xo; - z += zo; - break; - - case 1:// EAST - x -= zo; - z += xo; - break; - - case 2:// SOUTH - x -= xo; - z -= zo; - break; - - case 3:// WEST - x += zo; - z -= xo; - break; - } - - return new int[] { x, y, z }; - } - - protected void mapStructure(int x, int y, int z, Class piece) { - mapStructure(x, y, z, direction, piece); - } - - protected void mapStructure(int x, int y, int z, int dir, Class piece) { - mapStructure(x, y, z, dir, piece, 0); - } - - protected void mapStructure(int x, int y, int z, int dir, Class piece, int delay) { - int[] offset = offsetPos(x, y, z, this.direction); - - Block block = worldObj.getBlock(offset[0], offset[1], offset[2]); - int meta = worldObj.getBlockMetadata(offset[0], offset[1], offset[2]); - - worldObj.setBlock(offset[0], offset[1], offset[2], BlockListMF.WG_Mark, dir, 2); - TileEntity tile = worldObj.getTileEntity(offset[0], offset[1], offset[2]); - if (tile != null && tile instanceof TileEntityWorldGenMarker) { - ((TileEntityWorldGenMarker) tile).className = piece.getName(); - ((TileEntityWorldGenMarker) tile).length = lengthId - 1; - ((TileEntityWorldGenMarker) tile).deviation = deviationCount; - ((TileEntityWorldGenMarker) tile).prevID = Block.getIdFromBlock(block); - ((TileEntityWorldGenMarker) tile).prevMeta = meta; - ((TileEntityWorldGenMarker) tile).ticks -= delay; - ((TileEntityWorldGenMarker) tile).type = this.subtype; - } - block = null; - } - - public static void placeStructure(String classname, String subtype, int lengthID, int deviation, World world, int x, - int y, int z, int dir) { - try { - Class oclass = Class.forName(classname); - - if (oclass != null) { - StructureModuleMF module = (StructureModuleMF) oclass - .getConstructor(new Class[] { World.class, StructureCoordinates.class }) - .newInstance(world, new StructureCoordinates(x, y, z, dir)); - - if (module != null) { - module.subtype = subtype; - module.lengthId = lengthID; - module.deviationCount = deviation; - if (module.canGenerate()) { - module.generate(); - } - } - } - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - protected int getStairDirection(int d) { - switch (d) { - case 0: - return 2; - - case 1: - return 1; - - case 2: - return 3; - - case 3: - return 0; - - } - return 0; - } - - public static class StructureCoordinates { - public final int posX, posY, posZ, direction; - - public StructureCoordinates(int x, int y, int z, int direction) { - this.posX = x; - this.posY = y; - this.posZ = z; - this.direction = direction; - } - } - - public void placeSpawner(int x, int y, int z) { - placeSpawner(x, y, z, DungeonHooks.getRandomDungeonMob(rand)); - } - - public void placeSpawner(int x, int y, int z, String mob) { - this.placeBlock(Blocks.mob_spawner, 0, x, y, z); - TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner) getTileEntity(x, y, z, direction); - - if (tileentitymobspawner != null) { - tileentitymobspawner.func_145881_a().setEntityName(mob); - } else { - this.placeBlock(Blocks.air, 0, x, y, z); - } - } + public final int xCoord; + public final int yCoord; + public final int zCoord; + /** + * (0-3) South, West, North, East + */ + public final int direction; + public final World worldObj; + /** + * How much longer can units be added + */ + public int lengthId; + /** + * How many more branches can be added + */ + public int deviationCount; + protected XSTRandom rand = new XSTRandom(); + protected String subtype = "Normal"; + + public StructureModuleMF(World world, StructureCoordinates position) { + worldObj = world; + xCoord = position.posX; + yCoord = position.posY; + zCoord = position.posZ; + direction = position.direction; + + } + + public StructureModuleMF(World world, int x, int y, int z, int d) { + this(world, new StructureCoordinates(x, y, z, d)); + } + + public StructureModuleMF(World world, int x, int y, int z) { + this(world, x, y, z, 0); + } + + public static void placeStructure(String classname, String subtype, int lengthID, int deviation, World world, int x, + int y, int z, int dir) { + try { + Class oclass = Class.forName(classname); + + if (oclass != null) { + StructureModuleMF module = (StructureModuleMF) oclass + .getConstructor(new Class[]{World.class, StructureCoordinates.class}) + .newInstance(world, new StructureCoordinates(x, y, z, dir)); + + if (module != null) { + module.subtype = subtype; + module.lengthId = lengthID; + module.deviationCount = deviation; + if (module.canGenerate()) { + module.generate(); + } + } + } + } catch (Exception exception) { + exception.printStackTrace(); + } + } + + public abstract void generate(); + + public boolean canGenerate() { + return true; + } + + public int rotateLeft() { + switch (direction) { + case 0: + return 3; + case 1: + return 0; + case 2: + return 1; + case 3: + return 2; + } + return 0; + } + + public int rotateRight() { + switch (direction) { + case 0: + return 1; + case 1: + return 2; + case 2: + return 3; + case 3: + return 0; + } + return 0; + } + + public int reverse() { + switch (direction) { + case 0: + return 2; + case 1: + return 3; + case 2: + return 0; + case 3: + return 1; + } + return 0; + } + + /** + * Places a block and rotates it on it's base direction for pregen designed not + * to override the worldGen marker + * + * @param id The blockID + * @param meta the block metadata + * @param x The x offset(relation to xCoord) + * @param y The y offset(relation to yCoord) + * @param z The z offset(relation to zCoord) + */ + public void pregenPlaceBlock(Block id, int meta, int x, int y, int z) { + if (!(x == 0 && y == 0 && z == 0)) { + placeBlock(id, meta, x, y, z, direction); + } + } + + /** + * Places a block and rotates it on it's base direction + * + * @param id The blockID + * @param meta the block metadata + * @param x The x offset(relation to xCoord) + * @param y The y offset(relation to yCoord) + * @param z The z offset(relation to zCoord) + */ + public void placeBlock(Block id, int meta, int x, int y, int z) { + placeBlock(id, meta, x, y, z, direction); + } + + /** + * Places a block and rotates it on direction + * + * @param id The blockID + * @param meta the block metadata + * @param xo The x offset(relation to xCoord) + * @param yo The y offset(relation to yCoord) + * @param zo The z offset(relation to zCoord) + * @param dir The direction to face + */ + public void placeBlock(Block id, int meta, int xo, int yo, int zo, int dir) { + int[] offset = offsetPos(xo, yo, zo, dir); + worldObj.setBlock(offset[0], offset[1], offset[2], id, meta, 2); + } + + public void placeBlockIfAir(Block id, int meta, int xo, int yo, int zo) { + int[] offset = offsetPos(xo, yo, zo, direction); + if (worldObj.getBlock(offset[0], offset[1], offset[2]).isReplaceable(worldObj, offset[0], offset[1], + offset[2])) { + worldObj.setBlock(offset[0], offset[1], offset[2], id, meta, 2); + } + } + + public void placeEntity(Entity entity, int x, int y, int z) { + placeEntity(entity, x, y, z, direction); + } + + public void placeEntity(Entity entity, int xo, int yo, int zo, int dir) { + int[] offset = offsetPos(xo, yo, zo, dir); + entity.setLocationAndAngles(offset[0] + 0.5D, offset[1] + entity.height - 1.0F, offset[2] + 0.5D, + MathHelper.wrapAngleTo180_float(worldObj.rand.nextFloat() * 360.0F), 0.0F); + worldObj.spawnEntityInWorld(entity); + } + + protected void buildFoundation(Block block, int meta, int x, int z) { + buildFoundation(block, meta, x, -1, z, 32, 0, false); + } + + /** + * Builds a foundation column from -1y + * + * @param block The block used + * @param meta metadata used + * @param x the relative x position + * @param y the relative y position to start + * @param z the relative z position + * @param max the max depth + * @param penetrance how many solid blocks can it pass through + * @param relative whether or not it must be stopped by concecutive blocks. + */ + protected void buildFoundation(Block block, int meta, int x, int y, int z, int max, int penetrance, + boolean relative) { + penetrance -= y; + int init_penetrance = penetrance; + while (-y < max) { + Block current = getBlock(x, y, z, direction); + boolean empty = current.getMaterial().isReplaceable(); + + if (isUnbreakable(x, y, z, direction)) { + return; + } + if (!empty) { + --penetrance; + } else if (!relative) { + penetrance = init_penetrance; + } + + if (empty || penetrance >= 0) { + placeBlock(block, meta == -1 ? StructureGenAncientForge.getRandomMetadata(rand) : meta, x, y, z); + --y; + } else { + return; + } + } + } + + public TileEntity getTileEntity(int xo, int yo, int zo, int dir) { + int[] offset = offsetPos(xo, yo, zo, dir); + return worldObj.getTileEntity(offset[0], offset[1], offset[2]); + } + + public Block getBlock(int x, int y, int z) { + return getBlock(x, y, z, direction); + } + + public Block getBlock(int xo, int yo, int zo, int dir) { + int[] offset = offsetPos(xo, yo, zo, dir); + return worldObj.getBlock(offset[0], offset[1], offset[2]); + } + + public boolean isUnbreakable(int xo, int yo, int zo, int dir) { + return getHardness(xo, yo, zo, dir) < 0; + } + + public float getHardness(int xo, int yo, int zo, int dir) { + int[] offset = offsetPos(xo, yo, zo, dir); + return worldObj.getBlock(offset[0], offset[1], offset[2]).getBlockHardness(worldObj, offset[0], offset[1], + offset[2]); + } + + public void notifyBlock(Block id, int xo, int yo, int zo, int dir) { + int[] offset = offsetPos(xo, yo, zo, dir); + worldObj.notifyBlockChange(offset[0], offset[1], offset[2], id); + } + + public int[] offsetPos(int xo, int yo, int zo, int dir) { + int u = 2; + int x = xCoord; + int y = yCoord + yo; + int z = zCoord; + + switch (dir) { + case 0:// NORTH + x += xo; + z += zo; + break; + + case 1:// EAST + x -= zo; + z += xo; + break; + + case 2:// SOUTH + x -= xo; + z -= zo; + break; + + case 3:// WEST + x += zo; + z -= xo; + break; + } + + return new int[]{x, y, z}; + } + + protected void mapStructure(int x, int y, int z, Class piece) { + mapStructure(x, y, z, direction, piece); + } + + protected void mapStructure(int x, int y, int z, int dir, Class piece) { + mapStructure(x, y, z, dir, piece, 0); + } + + protected void mapStructure(int x, int y, int z, int dir, Class piece, int delay) { + int[] offset = offsetPos(x, y, z, this.direction); + + Block block = worldObj.getBlock(offset[0], offset[1], offset[2]); + int meta = worldObj.getBlockMetadata(offset[0], offset[1], offset[2]); + + worldObj.setBlock(offset[0], offset[1], offset[2], BlockListMF.WG_Mark, dir, 2); + TileEntity tile = worldObj.getTileEntity(offset[0], offset[1], offset[2]); + if (tile != null && tile instanceof TileEntityWorldGenMarker) { + ((TileEntityWorldGenMarker) tile).className = piece.getName(); + ((TileEntityWorldGenMarker) tile).length = lengthId - 1; + ((TileEntityWorldGenMarker) tile).deviation = deviationCount; + ((TileEntityWorldGenMarker) tile).prevID = Block.getIdFromBlock(block); + ((TileEntityWorldGenMarker) tile).prevMeta = meta; + ((TileEntityWorldGenMarker) tile).ticks -= delay; + ((TileEntityWorldGenMarker) tile).type = this.subtype; + } + block = null; + } + + protected int getStairDirection(int d) { + switch (d) { + case 0: + return 2; + + case 1: + return 1; + + case 2: + return 3; + + case 3: + return 0; + + } + return 0; + } + + public void placeSpawner(int x, int y, int z) { + placeSpawner(x, y, z, DungeonHooks.getRandomDungeonMob(rand)); + } + + public void placeSpawner(int x, int y, int z, String mob) { + this.placeBlock(Blocks.mob_spawner, 0, x, y, z); + TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner) getTileEntity(x, y, z, direction); + + if (tileentitymobspawner != null) { + tileentitymobspawner.func_145881_a().setEntityName(mob); + } else { + this.placeBlock(Blocks.air, 0, x, y, z); + } + } + + public static class StructureCoordinates { + public final int posX, posY, posZ, direction; + + public StructureCoordinates(int x, int y, int z, int direction) { + this.posX = x; + this.posY = y; + this.posZ = z; + this.direction = direction; + } + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientAlter.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientAlter.java index bb58271f..17661930 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientAlter.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientAlter.java @@ -3,32 +3,32 @@ import net.minecraft.world.World; public class WorldGenAncientAlter extends WorldGenStructureBase { - public WorldGenAncientAlter() { - } + public WorldGenAncientAlter() { + } - @Override - protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) { - return new StructureGenAncientAlter(world, x, y, z, direction); - } + @Override + protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) { + return new StructureGenAncientAlter(world, x, y, z, direction); + } - @Override - protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) { - return world.getBlock(x, y, z).getMaterial().isSolid() && isValidGround(world, x, y, z) - && world.canBlockSeeTheSky(x, y + 2, z); - } + @Override + protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) { + return world.getBlock(x, y, z).getMaterial().isSolid() && isValidGround(world, x, y, z) + && world.canBlockSeeTheSky(x, y + 2, z); + } - @Override - protected boolean canStructureBuild(StructureModuleMF piece) { - return true; - } + @Override + protected boolean canStructureBuild(StructureModuleMF piece) { + return true; + } - @Override - protected boolean isDirectionRandom() { - return true; - } + @Override + protected boolean isDirectionRandom() { + return true; + } - @Override - protected int[] getYGenBounds(World world) { - return new int[] { 64, 255 }; - } + @Override + protected int[] getYGenBounds(World world) { + return new int[]{64, 255}; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientForge.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientForge.java index 84b83861..f7ae98d3 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientForge.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenAncientForge.java @@ -5,53 +5,53 @@ import net.minecraft.world.World; public class WorldGenAncientForge extends WorldGenStructureBase { - public WorldGenAncientForge() { - } - - @Override - protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) { - return new StructureGenAncientForgeEntry(world, x, y, z, direction); - } - - @Override - protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) { - return world.getBlock(x, y, z).getMaterial().isSolid() && isValidGround(world, x, y, z); - } - - @Override - protected boolean canStructureBuild(StructureModuleMF piece) { - // SEARCH FOR CLIFF - for (int x = -1; x <= 1; x++) { - for (int y = 0; y < 3; y++) { - for (int z = 1; z <= 2; z++) { - int[] pos = piece.offsetPos(x, y, z, piece.direction); - Material material = piece.worldObj.getBlock(pos[0], pos[1], pos[2]).getMaterial(); - - if (!material.isOpaque()) { - return false; - } - if (!material.isSolid()) { - return false; - } - } - for (int z = 0; z > -2; z--) { - Block block = piece.getBlock(x, y, z); - if (block.getMaterial().isSolid()) { - return false; - } - } - } - } - return true; - } - - @Override - protected boolean isDirectionRandom() { - return false; - } - - @Override - protected int[] getYGenBounds(World world) { - return new int[] { 64, 255 }; - } + public WorldGenAncientForge() { + } + + @Override + protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) { + return new StructureGenAncientForgeEntry(world, x, y, z, direction); + } + + @Override + protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) { + return world.getBlock(x, y, z).getMaterial().isSolid() && isValidGround(world, x, y, z); + } + + @Override + protected boolean canStructureBuild(StructureModuleMF piece) { + // SEARCH FOR CLIFF + for (int x = -1; x <= 1; x++) { + for (int y = 0; y < 3; y++) { + for (int z = 1; z <= 2; z++) { + int[] pos = piece.offsetPos(x, y, z, piece.direction); + Material material = piece.worldObj.getBlock(pos[0], pos[1], pos[2]).getMaterial(); + + if (!material.isOpaque()) { + return false; + } + if (!material.isSolid()) { + return false; + } + } + for (int z = 0; z > -2; z--) { + Block block = piece.getBlock(x, y, z); + if (block.getMaterial().isSolid()) { + return false; + } + } + } + } + return true; + } + + @Override + protected boolean isDirectionRandom() { + return false; + } + + @Override + protected int[] getYGenBounds(World world) { + return new int[]{64, 255}; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenStructureBase.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenStructureBase.java index fd6b0f15..c69833da 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenStructureBase.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/WorldGenStructureBase.java @@ -1,78 +1,78 @@ package minefantasy.mf2.mechanics.worldGen.structure; -import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; +import java.util.Random; + public abstract class WorldGenStructureBase extends WorldGenerator { - public WorldGenStructureBase() { - } + public WorldGenStructureBase() { + } - @Override - public boolean generate(World world, Random random, int i, int j, int k) { - StructureModuleMF building; - int[] bounds = getYGenBounds(world); - for (int y = bounds[1]; y >= bounds[0]; y--) { - if (isBlockAcceptableOrigin(world, i, y, k)) { - if (isDirectionRandom()) { - building = getStartPiece(world, i, y + 1, k, random.nextInt(4)); - if (building != null && canStructureBuild(building)) { - building.generate(); - return true; - } - } else { - for (int d = 0; d < 4; d++) { - building = getStartPiece(world, i, y + 1, k, d); - if (building != null && canStructureBuild(building)) { - building.generate(); - return true; - } - } - } - building = null; - return false; - } - } - building = null; - return false; - } + @Override + public boolean generate(World world, Random random, int i, int j, int k) { + StructureModuleMF building; + int[] bounds = getYGenBounds(world); + for (int y = bounds[1]; y >= bounds[0]; y--) { + if (isBlockAcceptableOrigin(world, i, y, k)) { + if (isDirectionRandom()) { + building = getStartPiece(world, i, y + 1, k, random.nextInt(4)); + if (building != null && canStructureBuild(building)) { + building.generate(); + return true; + } + } else { + for (int d = 0; d < 4; d++) { + building = getStartPiece(world, i, y + 1, k, d); + if (building != null && canStructureBuild(building)) { + building.generate(); + return true; + } + } + } + building = null; + return false; + } + } + building = null; + return false; + } - protected boolean isValidGround(World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - if (!block.getMaterial().isSolid()) { - return false; - } + protected boolean isValidGround(World world, int x, int y, int z) { + Block block = world.getBlock(x, y, z); + if (!block.getMaterial().isSolid()) { + return false; + } - return block.getMaterial() == Material.rock || block.getMaterial() == Material.ground - || block.getMaterial() == Material.grass; - } + return block.getMaterial() == Material.rock || block.getMaterial() == Material.ground + || block.getMaterial() == Material.grass; + } - /** - * The min then max values which y axis allows generation - */ - protected abstract int[] getYGenBounds(World world); + /** + * The min then max values which y axis allows generation + */ + protected abstract int[] getYGenBounds(World world); - /** - * Whether or not a particular block allows a generation - */ - protected abstract boolean isBlockAcceptableOrigin(World world, int x, int y, int z); + /** + * Whether or not a particular block allows a generation + */ + protected abstract boolean isBlockAcceptableOrigin(World world, int x, int y, int z); - /** - * Called after IsBlockAcceptableOrigin: If a specific structure can generate - * here - */ - protected abstract boolean canStructureBuild(StructureModuleMF ruin); + /** + * Called after IsBlockAcceptableOrigin: If a specific structure can generate + * here + */ + protected abstract boolean canStructureBuild(StructureModuleMF ruin); - /** - * True if direction is random, false if it tries one of four - */ - protected abstract boolean isDirectionRandom(); + /** + * True if direction is random, false if it tries one of four + */ + protected abstract boolean isDirectionRandom(); - /** - * The "Entry" instance - */ - protected abstract StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction); + /** + * The "Entry" instance + */ + protected abstract StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction); } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureDSSurfaceAppendage.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureDSSurfaceAppendage.java index e65c9872..854c00c5 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureDSSurfaceAppendage.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureDSSurfaceAppendage.java @@ -13,217 +13,217 @@ import net.minecraftforge.common.ChestGenHooks; public class StructureDSSurfaceAppendage extends StructureModuleMF { - private String type; - - public StructureDSSurfaceAppendage(World world, StructureCoordinates position) { - super(world, position); - type = randomiseType(); - } - - private String randomiseType() { - return rand.nextInt(3) == 0 ? "Tower" : "Room"; - } - - protected int getHeight() { - return type == "Tower" ? 12 : 5; - } - - protected int getDepth() { - return 6; - } - - protected int getWidth() { - return 3; - } - - @Override - public boolean canGenerate() { - int width = getWidth(), depth = getDepth(), height = getHeight(); - int filledSpaces = 0, emptySpaces = 0; - - for (int x = -width; x <= width; x++) { - for (int y = 0; y <= height; y++) { - for (int z = 1; z <= depth; z++) { - Block block = this.getBlock(x, y, z); - if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { - return false; - } - if (!block.getMaterial().isSolid()) { - ++emptySpaces; - } else { - ++filledSpaces; - } - } - } - } - if (WorldGenDwarvenStronghold.debug_air) { - return true; - } - return ((float) emptySpaces / (float) filledSpaces) > 1.0F;// at least 50% empty - } - - private boolean allowBuildOverBlock(Block block) { - if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { - return false; - } - return true; - } - - @Override - public void generate() { - int width = getWidth(), depth = getDepth(), height = getHeight(); - - for (int x = -width; x <= width; x++) { - for (int z = 0; z <= depth; z++) { - Object[] blockarray; - - // FLOOR - blockarray = getFloor(width, depth, x, z); - if (blockarray != null) { - placeBlock((Block) blockarray[0], 0, x, 0, z); - } - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, -1, - z); - if (z < depth) { - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, - -2, z); - } - if (z < depth - 1) { - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, - -3, z); - } - // WALLS - for (int y = 0; y <= height; y++) { - blockarray = getWalls(width, depth, height, x, y, z); - if (blockarray != null && this.allowBuildOverBlock(getBlock(x, y, z))) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, y, z); - } - } - // CEILING - blockarray = getCeiling(width, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height, z); - } - // BATTLEMENT - if (type == "Tower") { - blockarray = getRoofDecor(width, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height + 1, z); - } - } - } - } - placeBlock(Blocks.air, 0, 0, 1, 0); - placeBlock(Blocks.air, 0, 0, 2, 0); - - placeBlock(BlockListMF.reinforced_stone_framed, 0, -1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, -1, 3, -1); - - placeBlock(BlockListMF.reinforced_stone_framed, 0, 1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, 1, 3, -1); - - placeBlock(BlockListMF.reinforced_stone, 1, 0, 3, -1); - placeBlock(Blocks.air, 0, 0, 1, -1); - placeBlock(Blocks.air, 0, 0, 2, -1); - - if (type == "Tower") { - decorateTower(width, depth, height); - } else { - buildHomeFurnishings(width, depth, height); - } - } - - private Object[] getFloor(int width, int depth, int x, int z) { - if (x <= -(width - 1) || x >= (width - 1) || z <= 1 || z >= depth - 1) { - return new Object[] { BlockListMF.reinforced_stone, 0 }; - } - return new Object[] { BlockListMF.cobble_pavement, 0 }; - } - - private Object[] getCeiling(int width, int depth, int x, int z) { - if (x == -width || x == width || z == 0 || z == depth) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - - private Object[] getRoofDecor(int width, int depth, int x, int z) { - if (x == -width || x == width || z == 0 || z == depth) { - if (x == 0 || x == -width || x == width) { - if (z == 0 || z == depth / 2 || z == depth) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - } - return new Object[] { BlockListMF.bars[0], false }; - } - return null; - } - - private Object[] getWalls(int radius, int depth, int height, int x, int y, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - if (type == "Tower" && y == (height / 2)) { - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - if (y <= 0) { - return null; - } - return new Object[] { Blocks.air, false }; - } - - private void decorateTower(int width, int depth, int height) { - for (int y = 1; y <= height; y++) { - if (y >= 2 && y <= (height - 2) && (y < (height / 2) - 1 || y > (height / 2) + 1)) { - this.placeBlock(BlockListMF.bars[0], 0, -width, y, depth / 2); - this.placeBlock(BlockListMF.bars[0], 0, width, y, depth / 2); - this.placeBlock(BlockListMF.bars[0], 0, 0, y, depth); - if (y > (height / 2) + 1) { - this.placeBlock(BlockListMF.bars[0], 0, 0, y, 0); - } - } - this.placeBlock(Blocks.ladder, BlockRack.getDirection(direction), -1, y, 1); - } - this.placeBlock(Blocks.glowstone, 0, 0, height / 2, depth / 2); - - } - - private void buildHomeFurnishings(int width, int depth, int height) { - for (int x = width - 1; x >= (width - 4); x--) { - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 1, 3); - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 2, 3); - placeBlock(Blocks.stone_slab, 0, x, 3, 3); - } - placeBlock(Blocks.stone_slab, 0, width - 1, 1, depth - 1); - placeBlock(Blocks.stone_slab, 0, width - 2, 1, depth - 1); - - placeChest(width - 3, 1, depth - 1, rotateLeft(), LootTypes.DWARVEN_HOME); - - for (int x = -(width - 1); x < width; x++) { - for (int z = 1; z < depth; z++) { - if (x == width - 1 || x == -(width - 1) || z == 1 || z == (depth - 1)) { - placeBlock(BlockListMF.reinforced_stone, 0, x, height + 1, z); - } - } - } - } - - private void placeChest(int x, int y, int z, int d, String loot) { - placeBlock(Blocks.chest, d, x, y, z); - TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); - - if (tile != null) { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, - 2 + rand.nextInt(3)); - } - } + private String type; + + public StructureDSSurfaceAppendage(World world, StructureCoordinates position) { + super(world, position); + type = randomiseType(); + } + + private String randomiseType() { + return rand.nextInt(3) == 0 ? "Tower" : "Room"; + } + + protected int getHeight() { + return type == "Tower" ? 12 : 5; + } + + protected int getDepth() { + return 6; + } + + protected int getWidth() { + return 3; + } + + @Override + public boolean canGenerate() { + int width = getWidth(), depth = getDepth(), height = getHeight(); + int filledSpaces = 0, emptySpaces = 0; + + for (int x = -width; x <= width; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { + Block block = this.getBlock(x, y, z); + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { + return false; + } + if (!block.getMaterial().isSolid()) { + ++emptySpaces; + } else { + ++filledSpaces; + } + } + } + } + if (WorldGenDwarvenStronghold.debug_air) { + return true; + } + return ((float) emptySpaces / (float) filledSpaces) > 1.0F;// at least 50% empty + } + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { + return false; + } + return true; + } + + @Override + public void generate() { + int width = getWidth(), depth = getDepth(), height = getHeight(); + + for (int x = -width; x <= width; x++) { + for (int z = 0; z <= depth; z++) { + Object[] blockarray; + + // FLOOR + blockarray = getFloor(width, depth, x, z); + if (blockarray != null) { + placeBlock((Block) blockarray[0], 0, x, 0, z); + } + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, -1, + z); + if (z < depth) { + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, + -2, z); + } + if (z < depth - 1) { + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, + -3, z); + } + // WALLS + for (int y = 0; y <= height; y++) { + blockarray = getWalls(width, depth, height, x, y, z); + if (blockarray != null && this.allowBuildOverBlock(getBlock(x, y, z))) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); + } + } + // CEILING + blockarray = getCeiling(width, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height, z); + } + // BATTLEMENT + if (type == "Tower") { + blockarray = getRoofDecor(width, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1, z); + } + } + } + } + placeBlock(Blocks.air, 0, 0, 1, 0); + placeBlock(Blocks.air, 0, 0, 2, 0); + + placeBlock(BlockListMF.reinforced_stone_framed, 0, -1, 1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, -1, 3, -1); + + placeBlock(BlockListMF.reinforced_stone_framed, 0, 1, 1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, 1, 3, -1); + + placeBlock(BlockListMF.reinforced_stone, 1, 0, 3, -1); + placeBlock(Blocks.air, 0, 0, 1, -1); + placeBlock(Blocks.air, 0, 0, 2, -1); + + if (type == "Tower") { + decorateTower(width, depth, height); + } else { + buildHomeFurnishings(width, depth, height); + } + } + + private Object[] getFloor(int width, int depth, int x, int z) { + if (x <= -(width - 1) || x >= (width - 1) || z <= 1 || z >= depth - 1) { + return new Object[]{BlockListMF.reinforced_stone, 0}; + } + return new Object[]{BlockListMF.cobble_pavement, 0}; + } + + private Object[] getCeiling(int width, int depth, int x, int z) { + if (x == -width || x == width || z == 0 || z == depth) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + + private Object[] getRoofDecor(int width, int depth, int x, int z) { + if (x == -width || x == width || z == 0 || z == depth) { + if (x == 0 || x == -width || x == width) { + if (z == 0 || z == depth / 2 || z == depth) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + } + return new Object[]{BlockListMF.bars[0], false}; + } + return null; + } + + private Object[] getWalls(int radius, int depth, int height, int x, int y, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + if (type == "Tower" && y == (height / 2)) { + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + if (y <= 0) { + return null; + } + return new Object[]{Blocks.air, false}; + } + + private void decorateTower(int width, int depth, int height) { + for (int y = 1; y <= height; y++) { + if (y >= 2 && y <= (height - 2) && (y < (height / 2) - 1 || y > (height / 2) + 1)) { + this.placeBlock(BlockListMF.bars[0], 0, -width, y, depth / 2); + this.placeBlock(BlockListMF.bars[0], 0, width, y, depth / 2); + this.placeBlock(BlockListMF.bars[0], 0, 0, y, depth); + if (y > (height / 2) + 1) { + this.placeBlock(BlockListMF.bars[0], 0, 0, y, 0); + } + } + this.placeBlock(Blocks.ladder, BlockRack.getDirection(direction), -1, y, 1); + } + this.placeBlock(Blocks.glowstone, 0, 0, height / 2, depth / 2); + + } + + private void buildHomeFurnishings(int width, int depth, int height) { + for (int x = width - 1; x >= (width - 4); x--) { + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 1, 3); + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 2, 3); + placeBlock(Blocks.stone_slab, 0, x, 3, 3); + } + placeBlock(Blocks.stone_slab, 0, width - 1, 1, depth - 1); + placeBlock(Blocks.stone_slab, 0, width - 2, 1, depth - 1); + + placeChest(width - 3, 1, depth - 1, rotateLeft(), LootTypes.DWARVEN_HOME); + + for (int x = -(width - 1); x < width; x++) { + for (int z = 1; z < depth; z++) { + if (x == width - 1 || x == -(width - 1) || z == 1 || z == (depth - 1)) { + placeBlock(BlockListMF.reinforced_stone, 0, x, height + 1, z); + } + } + } + } + + private void placeChest(int x, int y, int z, int d, String loot) { + placeBlock(Blocks.chest, d, x, y, z); + TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); + + if (tile != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, + 2 + rand.nextInt(3)); + } + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSCrossroads.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSCrossroads.java index 2b8415e2..3ec1a634 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSCrossroads.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSCrossroads.java @@ -12,250 +12,249 @@ import net.minecraftforge.common.ChestGenHooks; public class StructureGenDSCrossroads extends StructureModuleMF { - public StructureGenDSCrossroads(World world, StructureCoordinates position) { - super(world, position); - } - - public StructureGenDSCrossroads(World world, int x, int y, int z, int direction) { - super(world, x, y, z, direction); - } - - @Override - public boolean canGenerate() { - if (lengthId == -100) { - return true; - } - int width_span = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - int filledSpaces = 0, emptySpaces = 0; - for (int x = -width_span; x <= width_span; x++) { - for (int y = 0; y <= height; y++) { - for (int z = 1; z <= depth; z++) { - Block block = this.getBlock(x, y, z); - if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { - return false; - } - if (!block.getMaterial().isSolid()) { - ++emptySpaces; - } else { - ++filledSpaces; - } - } - } - } - if (WorldGenDwarvenStronghold.debug_air) { - return true; - } - return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at - // least - // 75% - // full - } - - private boolean allowBuildOverBlock(Block block) { - if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { - return false; - } - return true; - } - - @Override - public void generate() { - if (lengthId == -100) { - this.lengthId = ConfigWorldGen.DSLength; - this.deviationCount = ConfigWorldGen.DSDeviations; - } - - int width_span = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - for (int x = -width_span; x <= width_span; x++) { - for (int z = 0; z <= depth; z++) { - Object[] blockarray; - // FLOOR - blockarray = getFloor(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, 0, z); - } - // WALLS - for (int y = 1; y <= height + 1; y++) { - blockarray = getWalls(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, y, z); - } - } - // CEILING - blockarray = getCeiling(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height + 1, z); - } - - // TRIM - blockarray = getTrim(width_span, depth, x, z); - if (blockarray != null) { - int meta = 0; - if (blockarray[1] instanceof Integer) { - meta = (Integer) blockarray[1]; - } - if (blockarray[1] instanceof Boolean) { - meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - } - placeBlock((Block) blockarray[0], meta, x, height, z); - placeBlock(BlockListMF.reinforced_stone, meta, x, 4, z); - if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { - for (int h = height - 1; h > 1; h--) { - placeBlock(h == 5 ? Blocks.glowstone : BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, - z); - } - placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); - } - } - - } - } - - // DOORWAY - buildDoorway(width_span, depth, height); - - generateCrossroad(); - } - - protected void buildDoorway(int width_span, int depth, int height) { - for (int x = -1; x <= 1; x++) { - for (int y = 1; y <= 3; y++) { - for (int z = 0; z >= -1; z--) { - placeBlock(Blocks.air, 0, x, y, z); - } - } - } - } - - protected int getHeight() { - return 7; - } - - protected int getDepthSpan() { - return 19; - } - - protected int getWidthSpan() { - return 7; - } - - private Object[] getTrim(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - return null; - } - if (x == -(radius - 1) || x == (radius - 1)) { - if (z == (int) Math.ceil((float) depth / 2) || z == (int) Math.floor((float) depth / 2)) { - return new Object[] { BlockListMF.reinforced_stone_framed, false }; - } - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) - || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { - return new Object[] { BlockListMF.reinforced_stone_framed, false }; - } - int m = 0; - if (x == 0 || z == 5 || z == (depth - 5)) { - m = 1; - } - return new Object[] { BlockListMF.reinforced_stone, m }; - } - return null; - } - - private Object[] getCeiling(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - return null; - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - - private Object[] getFloor(int radius, int depth, int x, int z) { - if (z < 2 && x >= -1 && x <= 1) { - return new Object[] { floor_block, false }; - } - if (x == -radius || x == radius || z == depth || z == 0) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { floor_block, false }; - } - - private Object[] getWalls(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - return new Object[] { Blocks.air, false }; - } - - protected String lootType = ChestGenHooks.DUNGEON_CHEST; - - public StructureModuleMF setLoot(String loot) { - this.lootType = loot; - return this; - } - - protected Block floor_block = BlockListMF.cobble_pavement; - - public void generateCrossroad() { - int width_span = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - - int zOffset = 4; - - boolean stairSide = rand.nextBoolean(); - - tryPlaceCrossroadHall(0, 0, depth + 1, direction, stairSide, 0); - - tryPlaceCrossroadHall((width_span + 1), 0, zOffset, rotateLeft(), stairSide, 20); - tryPlaceCrossroadHall((width_span + 1), 0, depth - zOffset, rotateLeft(), !stairSide, 40); - - tryPlaceCrossroadHall(-(width_span + 1), 0, zOffset, rotateRight(), stairSide, 60); - tryPlaceCrossroadHall(-(width_span + 1), 0, depth - zOffset, rotateRight(), !stairSide, 80); - - this.placeMinotaur(0, 1, depth - 2, 1); - this.placeMinotaur(0, 1, 2, 1); - - int w = 2, d = 3; - for (int x = -w; x <= w; x++) { - for (int z = -d; z <= d; z++) { - Block block = Blocks.water; - if (z == -d || z == d || x == -w || x == w) { - block = BlockListMF.reinforced_stone; - } - this.placeBlock(block, 0, x, 1, depth / 2 + z); - } - } - - } - - private void placeMinotaur(int x, int y, int z, int tier) { - EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, x, y, z); - mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); - mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), tier); - } - - protected void tryPlaceCrossroadHall(int x, int y, int z, int d, boolean stair, int delay) { - Class extension = stair ? StructureGenDSStairs.class : StructureGenDSHall.class; - if (extension != null) { - mapStructure(x, y, z, d, extension, delay); - } - } + protected String lootType = ChestGenHooks.DUNGEON_CHEST; + protected Block floor_block = BlockListMF.cobble_pavement; + + public StructureGenDSCrossroads(World world, StructureCoordinates position) { + super(world, position); + } + + public StructureGenDSCrossroads(World world, int x, int y, int z, int direction) { + super(world, x, y, z, direction); + } + + @Override + public boolean canGenerate() { + if (lengthId == -100) { + return true; + } + int width_span = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + int filledSpaces = 0, emptySpaces = 0; + for (int x = -width_span; x <= width_span; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { + Block block = this.getBlock(x, y, z); + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { + return false; + } + if (!block.getMaterial().isSolid()) { + ++emptySpaces; + } else { + ++filledSpaces; + } + } + } + } + if (WorldGenDwarvenStronghold.debug_air) { + return true; + } + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full + } + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { + return false; + } + return true; + } + + @Override + public void generate() { + if (lengthId == -100) { + this.lengthId = ConfigWorldGen.DSLength; + this.deviationCount = ConfigWorldGen.DSDeviations; + } + + int width_span = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + for (int x = -width_span; x <= width_span; x++) { + for (int z = 0; z <= depth; z++) { + Object[] blockarray; + // FLOOR + blockarray = getFloor(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, 0, z); + } + // WALLS + for (int y = 1; y <= height + 1; y++) { + blockarray = getWalls(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); + } + } + // CEILING + blockarray = getCeiling(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1, z); + } + + // TRIM + blockarray = getTrim(width_span, depth, x, z); + if (blockarray != null) { + int meta = 0; + if (blockarray[1] instanceof Integer) { + meta = (Integer) blockarray[1]; + } + if (blockarray[1] instanceof Boolean) { + meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + } + placeBlock((Block) blockarray[0], meta, x, height, z); + placeBlock(BlockListMF.reinforced_stone, meta, x, 4, z); + if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { + for (int h = height - 1; h > 1; h--) { + placeBlock(h == 5 ? Blocks.glowstone : BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, + z); + } + placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); + } + } + + } + } + + // DOORWAY + buildDoorway(width_span, depth, height); + + generateCrossroad(); + } + + protected void buildDoorway(int width_span, int depth, int height) { + for (int x = -1; x <= 1; x++) { + for (int y = 1; y <= 3; y++) { + for (int z = 0; z >= -1; z--) { + placeBlock(Blocks.air, 0, x, y, z); + } + } + } + } + + protected int getHeight() { + return 7; + } + + protected int getDepthSpan() { + return 19; + } + + protected int getWidthSpan() { + return 7; + } + + private Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + return null; + } + if (x == -(radius - 1) || x == (radius - 1)) { + if (z == (int) Math.ceil((float) depth / 2) || z == (int) Math.floor((float) depth / 2)) { + return new Object[]{BlockListMF.reinforced_stone_framed, false}; + } + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) + || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { + return new Object[]{BlockListMF.reinforced_stone_framed, false}; + } + int m = 0; + if (x == 0 || z == 5 || z == (depth - 5)) { + m = 1; + } + return new Object[]{BlockListMF.reinforced_stone, m}; + } + return null; + } + + private Object[] getCeiling(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + return null; + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + + private Object[] getFloor(int radius, int depth, int x, int z) { + if (z < 2 && x >= -1 && x <= 1) { + return new Object[]{floor_block, false}; + } + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{floor_block, false}; + } + + private Object[] getWalls(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + return new Object[]{Blocks.air, false}; + } + + public StructureModuleMF setLoot(String loot) { + this.lootType = loot; + return this; + } + + public void generateCrossroad() { + int width_span = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + + int zOffset = 4; + + boolean stairSide = rand.nextBoolean(); + + tryPlaceCrossroadHall(0, 0, depth + 1, direction, stairSide, 0); + + tryPlaceCrossroadHall((width_span + 1), 0, zOffset, rotateLeft(), stairSide, 20); + tryPlaceCrossroadHall((width_span + 1), 0, depth - zOffset, rotateLeft(), !stairSide, 40); + + tryPlaceCrossroadHall(-(width_span + 1), 0, zOffset, rotateRight(), stairSide, 60); + tryPlaceCrossroadHall(-(width_span + 1), 0, depth - zOffset, rotateRight(), !stairSide, 80); + + this.placeMinotaur(0, 1, depth - 2, 1); + this.placeMinotaur(0, 1, 2, 1); + + int w = 2, d = 3; + for (int x = -w; x <= w; x++) { + for (int z = -d; z <= d; z++) { + Block block = Blocks.water; + if (z == -d || z == d || x == -w || x == w) { + block = BlockListMF.reinforced_stone; + } + this.placeBlock(block, 0, x, 1, depth / 2 + z); + } + } + + } + + private void placeMinotaur(int x, int y, int z, int tier) { + EntityMinotaur mob = new EntityMinotaur(worldObj); + this.placeEntity(mob, x, y, z); + mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); + mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), tier); + } + + protected void tryPlaceCrossroadHall(int x, int y, int z, int d, boolean stair, int delay) { + Class extension = stair ? StructureGenDSStairs.class : StructureGenDSHall.class; + if (extension != null) { + mapStructure(x, y, z, d, extension, delay); + } + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSEntry.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSEntry.java index b3c7dbef..19c3e3a3 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSEntry.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSEntry.java @@ -11,200 +11,198 @@ import net.minecraftforge.common.ChestGenHooks; public class StructureGenDSEntry extends StructureModuleMF { - public boolean isSurfaceBuild; - - public StructureGenDSEntry(World world, StructureCoordinates position) { - super(world, position); - } - - public StructureGenDSEntry(World world, int x, int y, int z, int direction, boolean surface) { - super(world, x, y, z, direction); - this.isSurfaceBuild = surface; - } - - @Override - public void generate() { - int environment = MinotaurBreed.getEnvironment(worldObj, xCoord, zCoord, 0); - subtype = environment == 2 ? "Frost" : "Normal"; - - int width_span = 4; - int depth = 10; - int height = 5; - for (int x = -width_span; x <= width_span; x++) { - for (int z = 0; z <= depth; z++) { - // FOUNDATION - Object[] blockarray = getFoundation(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? -1 : 0; - this.buildFoundation((Block) blockarray[0], meta, x, -1, z, 32, 4, false); - } - - // FLOOR - blockarray = getFloor(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, 0, z); - } - // WALLS - for (int y = 1; y <= height + 1; y++) { - blockarray = getWalls(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, y, z); - } - } - // CEILING - blockarray = getCeiling(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height + 1, z); - } - - // TRIM - blockarray = getTrim(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height + 2, z); - placeBlock((Block) blockarray[0], meta, x, height, z); - if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { - for (int h = height - 1; h > 1; h--) { - placeBlock(BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, z); - } - placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); - } - } - - } - } - - // DOORWAY - for (int x = -1; x <= 1; x++) { - for (int y = 1; y <= 3; y++) { - placeBlock(Blocks.air, 0, x, y, 0); - } - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 0, -1); - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 0, -2); - - placeBlock(BlockListMF.reinforced_stone, 0, x, -1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, x, -1, -2); - placeBlock(BlockListMF.reinforced_stone, 0, x, 0, -3); - } - placeBlock(BlockListMF.reinforced_stone, 0, -2, 0, -1); - placeBlock(BlockListMF.reinforced_stone, 0, -2, 0, -2); - placeBlock(BlockListMF.reinforced_stone, 0, 2, 0, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 2, 0, -2); - - placeDoorway(-1, width_span, height, depth); - placeDoorway(1, width_span, height, depth); - placeBlock(BlockListMF.reinforced_stone, 0, 0, height - 1, -3); - placeBlock(BlockListMF.reinforced_stone, 0, 0, height, -1); - - EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 1, depth / 2); - mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 1); - - this.lengthId = -99; - mapStructure(0, 0, depth, StructureGenDSStairs.class); - - if (isSurfaceBuild) { - mapStructure(-width_span, 0, depth - 1, rotateRight(), StructureDSSurfaceAppendage.class); - mapStructure(-width_span, 0, 2, rotateRight(), StructureDSSurfaceAppendage.class); - - mapStructure(width_span, 0, depth - 1, rotateLeft(), StructureDSSurfaceAppendage.class); - mapStructure(width_span, 0, 2, rotateLeft(), StructureDSSurfaceAppendage.class); - } - } - - private void placeDoorway(int mod, int width_span, int height, int depth) { - int h = height; - placeBlock(BlockListMF.reinforced_stone, 0, 3 * mod, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 3 * mod, 1, -2); - for (int y = 1; y < h; y++) { - placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, y, -3); - } - placeBlock(BlockListMF.reinforced_stone, 0, 1 * mod, height - 1, -3); - - placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height, -3); - placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height, -2); - placeBlock(BlockListMF.reinforced_stone, 0, 1 * mod, height, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 3 * mod, height, -1); - - placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height + 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height + 2, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height + 2, 0); - } - - private Object[] getTrim(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - return null; - } - if (x == -(radius - 1) || x == (radius - 1)) { - if (z == (int) Math.ceil((float) depth / 2)) { - return new Object[] { BlockListMF.reinforced_stone_framed, false }; - } - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) - || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { - return new Object[] { BlockListMF.reinforced_stone_framed, false }; - } - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return null; - } - - private Object[] getCeiling(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - return null; - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - - private Object[] getFloor(int radius, int depth, int x, int z) { - if (z < 2 && x >= -1 && x <= 1) { - return new Object[] { floor, false }; - } - if (x == -radius || x == radius || z == depth || z == 0) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { floor, false }; - } - - private Object[] getFoundation(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - if (x == -radius || x == radius || x == 0) { - if (z == depth || z == Math.ceil((float) depth / 2) || z == 0) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - } - } - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - - private Object[] getWalls(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - return new Object[] { Blocks.air, false }; - } - - private String lootType = ChestGenHooks.DUNGEON_CHEST; - - public StructureModuleMF setLoot(String loot) { - this.lootType = loot; - return this; - } - - private static Block floor = BlockListMF.cobble_pavement; + private static Block floor = BlockListMF.cobble_pavement; + public boolean isSurfaceBuild; + private String lootType = ChestGenHooks.DUNGEON_CHEST; + + public StructureGenDSEntry(World world, StructureCoordinates position) { + super(world, position); + } + + public StructureGenDSEntry(World world, int x, int y, int z, int direction, boolean surface) { + super(world, x, y, z, direction); + this.isSurfaceBuild = surface; + } + + @Override + public void generate() { + int environment = MinotaurBreed.getEnvironment(worldObj, xCoord, zCoord, 0); + subtype = environment == 2 ? "Frost" : "Normal"; + + int width_span = 4; + int depth = 10; + int height = 5; + for (int x = -width_span; x <= width_span; x++) { + for (int z = 0; z <= depth; z++) { + // FOUNDATION + Object[] blockarray = getFoundation(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? -1 : 0; + this.buildFoundation((Block) blockarray[0], meta, x, -1, z, 32, 4, false); + } + + // FLOOR + blockarray = getFloor(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, 0, z); + } + // WALLS + for (int y = 1; y <= height + 1; y++) { + blockarray = getWalls(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); + } + } + // CEILING + blockarray = getCeiling(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1, z); + } + + // TRIM + blockarray = getTrim(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 2, z); + placeBlock((Block) blockarray[0], meta, x, height, z); + if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { + for (int h = height - 1; h > 1; h--) { + placeBlock(BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, z); + } + placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); + } + } + + } + } + + // DOORWAY + for (int x = -1; x <= 1; x++) { + for (int y = 1; y <= 3; y++) { + placeBlock(Blocks.air, 0, x, y, 0); + } + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 0, -1); + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 0, -2); + + placeBlock(BlockListMF.reinforced_stone, 0, x, -1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, x, -1, -2); + placeBlock(BlockListMF.reinforced_stone, 0, x, 0, -3); + } + placeBlock(BlockListMF.reinforced_stone, 0, -2, 0, -1); + placeBlock(BlockListMF.reinforced_stone, 0, -2, 0, -2); + placeBlock(BlockListMF.reinforced_stone, 0, 2, 0, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 2, 0, -2); + + placeDoorway(-1, width_span, height, depth); + placeDoorway(1, width_span, height, depth); + placeBlock(BlockListMF.reinforced_stone, 0, 0, height - 1, -3); + placeBlock(BlockListMF.reinforced_stone, 0, 0, height, -1); + + EntityMinotaur mob = new EntityMinotaur(worldObj); + this.placeEntity(mob, 0, 1, depth / 2); + mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 1); + + this.lengthId = -99; + mapStructure(0, 0, depth, StructureGenDSStairs.class); + + if (isSurfaceBuild) { + mapStructure(-width_span, 0, depth - 1, rotateRight(), StructureDSSurfaceAppendage.class); + mapStructure(-width_span, 0, 2, rotateRight(), StructureDSSurfaceAppendage.class); + + mapStructure(width_span, 0, depth - 1, rotateLeft(), StructureDSSurfaceAppendage.class); + mapStructure(width_span, 0, 2, rotateLeft(), StructureDSSurfaceAppendage.class); + } + } + + private void placeDoorway(int mod, int width_span, int height, int depth) { + int h = height; + placeBlock(BlockListMF.reinforced_stone, 0, 3 * mod, 1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 3 * mod, 1, -2); + for (int y = 1; y < h; y++) { + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, y, -3); + } + placeBlock(BlockListMF.reinforced_stone, 0, 1 * mod, height - 1, -3); + + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height, -3); + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height, -2); + placeBlock(BlockListMF.reinforced_stone, 0, 1 * mod, height, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 3 * mod, height, -1); + + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height + 1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height + 2, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 2 * mod, height + 2, 0); + } + + private Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + return null; + } + if (x == -(radius - 1) || x == (radius - 1)) { + if (z == (int) Math.ceil((float) depth / 2)) { + return new Object[]{BlockListMF.reinforced_stone_framed, false}; + } + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) + || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { + return new Object[]{BlockListMF.reinforced_stone_framed, false}; + } + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return null; + } + + private Object[] getCeiling(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + return null; + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + + private Object[] getFloor(int radius, int depth, int x, int z) { + if (z < 2 && x >= -1 && x <= 1) { + return new Object[]{floor, false}; + } + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{floor, false}; + } + + private Object[] getFoundation(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if (x == -radius || x == radius || x == 0) { + if (z == depth || z == Math.ceil((float) depth / 2) || z == 0) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + } + } + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + + private Object[] getWalls(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + return new Object[]{Blocks.air, false}; + } + + public StructureModuleMF setLoot(String loot) { + this.lootType = loot; + return this; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSHall.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSHall.java index 0d9fca26..7cbf46f1 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSHall.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSHall.java @@ -1,7 +1,5 @@ package minefantasy.mf2.mechanics.worldGen.structure.dwarven; -import java.util.Random; - import minefantasy.mf2.block.list.BlockListMF; import minefantasy.mf2.mechanics.worldGen.structure.StructureGenAncientForge; import minefantasy.mf2.mechanics.worldGen.structure.StructureModuleMF; @@ -10,237 +8,238 @@ import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; +import java.util.Random; + public class StructureGenDSHall extends StructureModuleMF { - public StructureGenDSHall(World world, StructureCoordinates position) { - super(world, position); - } - - public StructureGenDSHall(World world, int x, int y, int z, int direction) { - super(world, x, y, z, direction); - } - - @Override - public boolean canGenerate() { - int width_span = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - int empty_spaces = 0; - int filledSpaces = 0, emptySpaces = 0; - for (int x = -width_span; x <= width_span; x++) { - for (int y = 0; y <= height; y++) { - for (int z = 1; z <= depth; z++) { - Block block = this.getBlock(x, y, z); - if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { - return false; - } - if (!block.getMaterial().isSolid()) { - ++emptySpaces; - } else { - ++filledSpaces; - } - } - } - } - if (WorldGenDwarvenStronghold.debug_air) { - return true; - } - return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at - // least - // 75% - // full - } - - private boolean allowBuildOverBlock(Block block) { - if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { - return false; - } - return true; - } - - @Override - public void generate() { - int width_span = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - for (int x = -width_span; x <= width_span; x++) { - for (int z = 0; z <= depth; z++) { - Object[] blockarray; - - // FLOOR - blockarray = getFloor(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, 0, z); - } - // WALLS - for (int y = 1; y <= height + 1; y++) { - blockarray = getWalls(width_span, height, depth, x, y, z); - if (blockarray != null) { - int meta = 0; - if (blockarray[1] instanceof Integer) { - meta = (Integer) blockarray[1]; - } - if (blockarray[1] instanceof Boolean) { - meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - } - if (blockarray[1] instanceof String) { - meta = (String) blockarray[1] == "Hall" ? getRandomEngravedWall(rand) : 0; - } - placeBlock((Block) blockarray[0], meta, x, y, z); - } - } - // CEILING - blockarray = getCeiling(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height + 1, z); - } - - // TRIM - blockarray = getTrim(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height, z); - if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { - for (int h = height - 1; h > 1; h--) { - placeBlock(BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, z); - } - placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); - } - } - - } - } - - // DOORWAY - buildDoorway(width_span, depth, height); - - if (lengthId > 0) { - buildNext(width_span, depth, height); - } else { - mapStructure(0, 0, depth, StructureGenDSRoom.class); - } - if (rand.nextInt(3) != 0) { - tryPlaceMinorRoom((width_span), 0, (int) Math.floor((float) depth / 2), rotateLeft()); - } - if (rand.nextInt(3) != 0) { - tryPlaceMinorRoom(-(width_span), 0, (int) Math.floor((float) depth / 2), rotateRight()); - } - if (this instanceof StructureGenDSIntersection || this.lengthId % 2 == 0) { - placeBlock(Blocks.glowstone, 0, 0, height + 1, depth / 2); - } - } - - protected void buildDoorway(int width_span, int depth, int height) { - for (int x = -1; x <= 1; x++) { - for (int y = 1; y <= 3; y++) { - for (int z = 0; z >= -1; z--) { - placeBlock(Blocks.air, 0, x, y, z); - } - } - } - } - - protected void buildNext(int width_span, int depth, int height) { - tryPlaceHall(0, 0, depth, direction); - } - - protected void tryPlaceHall(int x, int y, int z, int d) { - Class extension = getRandomExtension(); - if (extension != null) { - mapStructure(x, y, z, d, extension); - } - } - - protected void tryPlaceMinorRoom(int x, int y, int z, int d) { - Class extension = getRandomMinorRoom(); - if (extension != null) { - mapStructure(x, y, z, d, extension); - } - } - - protected int getHeight() { - return 4; - } - - protected int getDepthSpan() { - return 9; - } - - protected int getWidthSpan() { - return 3; - } - - protected Class getRandomMinorRoom() { - return StructureGenDSRoomSml.class; - } - - protected Class getRandomExtension() { - if (lengthId == 1) { - return StructureGenDSRoom.class; - } - if (deviationCount > 0 && rand.nextInt(4) == 0) { - return StructureGenDSIntersection.class; - } - if (rand.nextInt(16) == 0 && this.yCoord >= StructureGenDSStairs.minLevel) { - return StructureGenDSStairs.class; - } - return StructureGenDSHall.class; - } - - protected Object[] getTrim(int radius, int depth, int x, int z) { - if (x == -radius || x == radius) { - return null; - } - - if (x == -(radius - 1) || x == (radius - 1)) { - if (z == Math.floor((float) depth / 2)) { - return new Object[] { BlockListMF.reinforced_stone_framed, false }; - } - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return null; - } - - protected Object[] getCeiling(int radius, int depth, int x, int z) { - return x == 0 ? new Object[] { BlockListMF.reinforced_stone, false } - : new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - - protected Object[] getFloor(int radius, int depth, int x, int z) { - if (x >= -1 && x <= 1) { - return new Object[] { floor, false }; - } - if (x == -radius || x == radius || z == depth || z == 0) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { floor, false }; - } - - protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) { - if (x != -radius && x != radius && z == 0) { - return new Object[] { Blocks.air, false }; - } - if (x == -radius || x == radius || z == depth) { - return y == height / 2 ? new Object[] { BlockListMF.reinforced_stone, "Hall" } - : new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - return new Object[] { Blocks.air, false }; - } - - protected String lootType = ChestGenHooks.DUNGEON_CHEST; - - public StructureModuleMF setLoot(String loot) { - this.lootType = loot; - return this; - } - - protected static Block floor = BlockListMF.cobble_pavement; - - public static int getRandomEngravedWall(Random rand) { - return 2 + rand.nextInt(3); - } + protected static Block floor = BlockListMF.cobble_pavement; + protected String lootType = ChestGenHooks.DUNGEON_CHEST; + + public StructureGenDSHall(World world, StructureCoordinates position) { + super(world, position); + } + + public StructureGenDSHall(World world, int x, int y, int z, int direction) { + super(world, x, y, z, direction); + } + + public static int getRandomEngravedWall(Random rand) { + return 2 + rand.nextInt(3); + } + + @Override + public boolean canGenerate() { + int width_span = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + int empty_spaces = 0; + int filledSpaces = 0, emptySpaces = 0; + for (int x = -width_span; x <= width_span; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { + Block block = this.getBlock(x, y, z); + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { + return false; + } + if (!block.getMaterial().isSolid()) { + ++emptySpaces; + } else { + ++filledSpaces; + } + } + } + } + if (WorldGenDwarvenStronghold.debug_air) { + return true; + } + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full + } + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { + return false; + } + return true; + } + + @Override + public void generate() { + int width_span = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + for (int x = -width_span; x <= width_span; x++) { + for (int z = 0; z <= depth; z++) { + Object[] blockarray; + + // FLOOR + blockarray = getFloor(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, 0, z); + } + // WALLS + for (int y = 1; y <= height + 1; y++) { + blockarray = getWalls(width_span, height, depth, x, y, z); + if (blockarray != null) { + int meta = 0; + if (blockarray[1] instanceof Integer) { + meta = (Integer) blockarray[1]; + } + if (blockarray[1] instanceof Boolean) { + meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + } + if (blockarray[1] instanceof String) { + meta = (String) blockarray[1] == "Hall" ? getRandomEngravedWall(rand) : 0; + } + placeBlock((Block) blockarray[0], meta, x, y, z); + } + } + // CEILING + blockarray = getCeiling(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1, z); + } + + // TRIM + blockarray = getTrim(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height, z); + if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { + for (int h = height - 1; h > 1; h--) { + placeBlock(BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, z); + } + placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); + } + } + + } + } + + // DOORWAY + buildDoorway(width_span, depth, height); + + if (lengthId > 0) { + buildNext(width_span, depth, height); + } else { + mapStructure(0, 0, depth, StructureGenDSRoom.class); + } + if (rand.nextInt(3) != 0) { + tryPlaceMinorRoom((width_span), 0, (int) Math.floor((float) depth / 2), rotateLeft()); + } + if (rand.nextInt(3) != 0) { + tryPlaceMinorRoom(-(width_span), 0, (int) Math.floor((float) depth / 2), rotateRight()); + } + if (this instanceof StructureGenDSIntersection || this.lengthId % 2 == 0) { + placeBlock(Blocks.glowstone, 0, 0, height + 1, depth / 2); + } + } + + protected void buildDoorway(int width_span, int depth, int height) { + for (int x = -1; x <= 1; x++) { + for (int y = 1; y <= 3; y++) { + for (int z = 0; z >= -1; z--) { + placeBlock(Blocks.air, 0, x, y, z); + } + } + } + } + + protected void buildNext(int width_span, int depth, int height) { + tryPlaceHall(0, 0, depth, direction); + } + + protected void tryPlaceHall(int x, int y, int z, int d) { + Class extension = getRandomExtension(); + if (extension != null) { + mapStructure(x, y, z, d, extension); + } + } + + protected void tryPlaceMinorRoom(int x, int y, int z, int d) { + Class extension = getRandomMinorRoom(); + if (extension != null) { + mapStructure(x, y, z, d, extension); + } + } + + protected int getHeight() { + return 4; + } + + protected int getDepthSpan() { + return 9; + } + + protected int getWidthSpan() { + return 3; + } + + protected Class getRandomMinorRoom() { + return StructureGenDSRoomSml.class; + } + + protected Class getRandomExtension() { + if (lengthId == 1) { + return StructureGenDSRoom.class; + } + if (deviationCount > 0 && rand.nextInt(4) == 0) { + return StructureGenDSIntersection.class; + } + if (rand.nextInt(16) == 0 && this.yCoord >= StructureGenDSStairs.minLevel) { + return StructureGenDSStairs.class; + } + return StructureGenDSHall.class; + } + + protected Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius) { + return null; + } + + if (x == -(radius - 1) || x == (radius - 1)) { + if (z == Math.floor((float) depth / 2)) { + return new Object[]{BlockListMF.reinforced_stone_framed, false}; + } + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return null; + } + + protected Object[] getCeiling(int radius, int depth, int x, int z) { + return x == 0 ? new Object[]{BlockListMF.reinforced_stone, false} + : new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + + protected Object[] getFloor(int radius, int depth, int x, int z) { + if (x >= -1 && x <= 1) { + return new Object[]{floor, false}; + } + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{floor, false}; + } + + protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) { + if (x != -radius && x != radius && z == 0) { + return new Object[]{Blocks.air, false}; + } + if (x == -radius || x == radius || z == depth) { + return y == height / 2 ? new Object[]{BlockListMF.reinforced_stone, "Hall"} + : new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + return new Object[]{Blocks.air, false}; + } + + public StructureModuleMF setLoot(String loot) { + this.lootType = loot; + return this; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSIntersection.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSIntersection.java index 9836aa2f..1aac8feb 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSIntersection.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSIntersection.java @@ -9,135 +9,135 @@ public class StructureGenDSIntersection extends StructureGenDSHall { - public StructureGenDSIntersection(World world, StructureCoordinates position) { - super(world, position); - } - - @Override - protected void buildNext(int width_span, int depth, int height) { - --deviationCount; - int offset = 0; - boolean[] intersection = getRandomIntersectionPattern(); - if (intersection[0]) { - tryPlaceHall(0, 0, depth + offset, direction); - } - if (intersection[1]) { - tryPlaceHall(-(width_span + offset), 0, (int) Math.floor((float) depth / 2), rotateRight()); - } - if (intersection[2]) { - tryPlaceHall((width_span + offset), 0, (int) Math.floor((float) depth / 2), rotateLeft()); - } - } - - private boolean[] getRandomIntersectionPattern() { - boolean[][] groups = new boolean[][] { new boolean[] { true, true, true }, new boolean[] { true, true, false }, - new boolean[] { true, false, true }, new boolean[] { false, true, true }, }; - - return groups[rand.nextInt(groups.length)]; - } - - @Override - protected int getHeight() { - return 4; - } - - @Override - protected int getDepthSpan() { - return 8; - } - - @Override - protected int getWidthSpan() { - return 4; - } - - protected void tryPlaceMinorRoom(int x, int y, int z, int d) { - } - - @Override - protected Object[] getTrim(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - return null; - } - - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) - || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { - return new Object[] { BlockListMF.reinforced_stone_framed, false }; - } - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return null; - } - - @Override - protected Object[] getCeiling(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - return null; - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - - @Override - protected Object[] getFloor(int radius, int depth, int x, int z) { - if (z == 0 && x >= -1 && x <= 1) { - return new Object[] { floor, false }; - } - if (x == -radius || x == radius || z == depth || z == 0) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { floor, false }; - } - - @Override - protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - - return y == height / 2 ? new Object[] { BlockListMF.reinforced_stone, "Hall" } - : new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - return new Object[] { Blocks.air, false }; - } - - @Override - protected void buildDoorway(int width_span, int depth, int height) { - for (int x = -2; x <= 2; x++) { - for (int y = 1; y <= 3; y++) { - for (int z = 0; z >= -1; z--) { - placeBlock(Blocks.air, 0, x, y, z); - } - } - } - for (int x = -1; x <= 1; x++) { - for (int z = 0; z >= -1; z--) { - placeBlock(Blocks.air, 0, x, 4, z); - } - } - - placeBlock(BlockListMF.reinforced_stone, 0, -2, 4, 0); - placeBlock(BlockListMF.reinforced_stone, 0, 2, 4, 0); - - EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 0, depth / 2); - mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); - mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 1); - } - - @Override - protected Class getRandomExtension() { - if (lengthId == 1) { - return StructureGenDSRoom.class; - } - return (yCoord >= StructureGenDSStairs.minLevel && rand.nextInt(3) == 0) ? StructureGenDSStairs.class - : StructureGenDSHall.class; - } + public StructureGenDSIntersection(World world, StructureCoordinates position) { + super(world, position); + } + + @Override + protected void buildNext(int width_span, int depth, int height) { + --deviationCount; + int offset = 0; + boolean[] intersection = getRandomIntersectionPattern(); + if (intersection[0]) { + tryPlaceHall(0, 0, depth + offset, direction); + } + if (intersection[1]) { + tryPlaceHall(-(width_span + offset), 0, (int) Math.floor((float) depth / 2), rotateRight()); + } + if (intersection[2]) { + tryPlaceHall((width_span + offset), 0, (int) Math.floor((float) depth / 2), rotateLeft()); + } + } + + private boolean[] getRandomIntersectionPattern() { + boolean[][] groups = new boolean[][]{new boolean[]{true, true, true}, new boolean[]{true, true, false}, + new boolean[]{true, false, true}, new boolean[]{false, true, true},}; + + return groups[rand.nextInt(groups.length)]; + } + + @Override + protected int getHeight() { + return 4; + } + + @Override + protected int getDepthSpan() { + return 8; + } + + @Override + protected int getWidthSpan() { + return 4; + } + + protected void tryPlaceMinorRoom(int x, int y, int z, int d) { + } + + @Override + protected Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + return null; + } + + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) + || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { + return new Object[]{BlockListMF.reinforced_stone_framed, false}; + } + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return null; + } + + @Override + protected Object[] getCeiling(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + return null; + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + + @Override + protected Object[] getFloor(int radius, int depth, int x, int z) { + if (z == 0 && x >= -1 && x <= 1) { + return new Object[]{floor, false}; + } + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{floor, false}; + } + + @Override + protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + + return y == height / 2 ? new Object[]{BlockListMF.reinforced_stone, "Hall"} + : new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + return new Object[]{Blocks.air, false}; + } + + @Override + protected void buildDoorway(int width_span, int depth, int height) { + for (int x = -2; x <= 2; x++) { + for (int y = 1; y <= 3; y++) { + for (int z = 0; z >= -1; z--) { + placeBlock(Blocks.air, 0, x, y, z); + } + } + } + for (int x = -1; x <= 1; x++) { + for (int z = 0; z >= -1; z--) { + placeBlock(Blocks.air, 0, x, 4, z); + } + } + + placeBlock(BlockListMF.reinforced_stone, 0, -2, 4, 0); + placeBlock(BlockListMF.reinforced_stone, 0, 2, 4, 0); + + EntityMinotaur mob = new EntityMinotaur(worldObj); + this.placeEntity(mob, 0, 0, depth / 2); + mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); + mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 1); + } + + @Override + protected Class getRandomExtension() { + if (lengthId == 1) { + return StructureGenDSRoom.class; + } + return (yCoord >= StructureGenDSStairs.minLevel && rand.nextInt(3) == 0) ? StructureGenDSStairs.class + : StructureGenDSHall.class; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoom.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoom.java index b2c6f446..4ea1b96a 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoom.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoom.java @@ -25,505 +25,503 @@ import net.minecraftforge.common.ChestGenHooks; public class StructureGenDSRoom extends StructureModuleMF { - private String type = "Basic"; - private static final String[] possible_types = new String[] { "Living", "Forge", "Study", "Armoury" }; - - public StructureGenDSRoom(World world, StructureCoordinates position) { - super(world, position); - randomiseType(); - } - - public StructureGenDSRoom(World world, int x, int y, int z, int direction) { - super(world, x, y, z, direction); - randomiseType(); - } - - private void randomiseType() { - type = geRandomType(); - } - - /** - * @return 10% for Armoury----20& for Forge----30% for Study----40% for Living - */ - private String geRandomType() { - int c = rand.nextInt(10); - if (c == 0) - return "Armoury";// 0 (10%) - else if (c < 3) - return "Forge";// 1,2 (20%) - else if (c < 6) - return "Study";// 3,4,5 (30%) - - return "Living";// 6,7,8,9 (40%) - } - - @Override - public boolean canGenerate() { - int width_span = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - int filledSpaces = 0, emptySpaces = 0; - for (int x = -width_span; x <= width_span; x++) { - for (int y = 0; y <= height; y++) { - for (int z = 1; z <= depth; z++) { - Block block = this.getBlock(x, y, z); - if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { - return false; - } - if (!block.getMaterial().isSolid()) { - ++emptySpaces; - } else { - ++filledSpaces; - } - } - } - } - if (WorldGenDwarvenStronghold.debug_air) { - return true; - } - return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at - // least - // 75% - // full - } - - private boolean allowBuildOverBlock(Block block) { - if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { - return false; - } - return true; - } - - @Override - public void generate() { - int width_span = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - for (int x = -width_span; x <= width_span; x++) { - for (int z = 0; z <= depth; z++) { - Object[] blockarray; - // FLOOR - blockarray = getFloor(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, 0, z); - } - // WALLS - for (int y = 1; y <= height + 1; y++) { - blockarray = getWalls(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, y, z); - } - } - // CEILING - blockarray = getCeiling(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height + 1, z); - } - - // TRIM - blockarray = getTrim(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height, z); - if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { - for (int h = height - 1; h > 1; h--) { - placeBlock(h == 4 ? Blocks.glowstone : BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, - z); - } - placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); - } - } - - } - } - - // DOORWAY - buildDoorway(width_span, depth, height); - - if (type.equalsIgnoreCase("Living")) { - generateLivingHub(); - } - if (type.equalsIgnoreCase("Armoury")) { - generateArmoury(); - } - if (type.equalsIgnoreCase("Forge")) { - generateForge(); - } - if (type.equalsIgnoreCase("Study")) { - generateStudy(); - } - } - - protected void buildDoorway(int width_span, int depth, int height) { - for (int x = -1; x <= 1; x++) { - for (int y = 1; y <= 3; y++) { - for (int z = 0; z >= -1; z--) { - placeBlock(Blocks.air, 0, x, y, z); - } - } - } - } - - protected void tryPlaceHall(int x, int y, int z, int d) { - Class extension = getRandomExtension(); - if (extension != null) { - mapStructure(x, y, z, d, extension); - } - } - - protected int getHeight() { - if (type.equalsIgnoreCase("Forge")) { - return 7; - } - return 5; - } - - protected int getDepthSpan() { - if (type.equalsIgnoreCase("Living")) { - return 19; - } - return 13; - } - - protected int getWidthSpan() { - return 5; - } - - protected Class getRandomExtension() { - if (rand.nextInt(4) == 0) { - return StructureGenDSIntersection.class; - } - if (rand.nextInt(8) == 0 && this.yCoord > 24) { - return StructureGenDSStairs.class; - } - return StructureGenDSRoom.class; - } - - private Object[] getTrim(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - return null; - } - if (x == -(radius - 1) || x == (radius - 1)) { - if (z == (int) Math.ceil((float) depth / 2) || z == (int) Math.floor((float) depth / 2)) { - return new Object[] { BlockListMF.reinforced_stone_framed, false }; - } - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) - || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { - return new Object[] { BlockListMF.reinforced_stone_framed, false }; - } - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return null; - } - - private Object[] getCeiling(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - return null; - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - - private Object[] getFloor(int radius, int depth, int x, int z) { - if (type.equalsIgnoreCase("Living") || type.equalsIgnoreCase("Study")) { - floor_block = BlockListMF.refined_planks; - if (x > -2 && x < 2 && z > 3 && z < (depth - 3)) { - floor_block = Blocks.obsidian; - } - } - if (z < 2 && x >= -1 && x <= 1) { - return new Object[] { floor_block, false }; - } - if (x == -radius || x == radius || z == depth || z == 0) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { floor_block, false }; - } - - private Object[] getWalls(int radius, int depth, int x, int z) { - if (x == -radius || x == radius || z == depth || z == 0) { - if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - return new Object[] { Blocks.air, false }; - } - - protected String lootType = ChestGenHooks.DUNGEON_CHEST; - - public StructureModuleMF setLoot(String loot) { - this.lootType = loot; - return this; - } - - protected Block floor_block = BlockListMF.cobble_pavement; - - public void generateLivingHub() { - int width_span = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - - int zOffset = 4; - - boolean hall1 = rand.nextInt(3) == 0, hall2 = rand.nextInt(3) == 0, hall3 = rand.nextInt(3) == 0; - int offset1 = hall1 ? width_span + 1 : width_span; - int offset2 = hall2 ? -(width_span + 1) : -width_span; - int offset3 = hall3 ? depth + 1 : depth; - - tryPlaceMinorRoom(width_span, 0, zOffset, rotateLeft(), false); - tryPlaceMinorRoom(offset1, 0, depth - zOffset, rotateLeft(), hall1); - - tryPlaceMinorRoom(-width_span, 0, zOffset, rotateRight(), false); - tryPlaceMinorRoom(offset2, 0, depth - zOffset, rotateRight(), hall2); - tryPlaceMinorRoom(0, 0, offset3, direction, hall3); - // this.placeSpawner(0, 1, depth-5); - - EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 1, depth - 5); - mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); - mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 1); - - } - - public void generateStudy() { - int width = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - - for (int z = 0; z < depth; z++) { - int ystart = 1; - if (z == (int) Math.ceil((float) depth / 2) + 1 || z == (int) Math.floor((float) depth / 2) - 1) { - ystart = 3; - placeChest(-(width - 1), 1, z, rotateLeft(), LootTypes.DWARVEN_STUDY); - placeChest(width - 1, 1, z, rotateRight(), LootTypes.DWARVEN_STUDY); - } - for (int y = ystart; y < height; y++) { - if (getBlock(-(width - 1), y, z).getMaterial().isReplaceable()) { - placeBlock(Blocks.bookshelf, 0, -(width - 1), y, z); - } - if (getBlock(width - 1, y, z).getMaterial().isReplaceable()) { - placeBlock(Blocks.bookshelf, 0, width - 1, y, z); - } - } - } - for (int x = 0; x < 3; x++) { - placeBlock(Blocks.double_stone_slab, 0, -1 + x, 1, (int) Math.floor((float) depth / 2) - 1); - placeBlock(Blocks.double_stone_slab, 0, -1 + x, 1, (int) Math.ceil((float) depth / 2) + 1); - } - placeBlock(BlockListMF.schematic_general, 0, 0, 2, (int) Math.floor((float) depth / 2) - 1); - placeBlock(BlockListMF.schematic_general, 1, 0, 2, (int) Math.ceil((float) depth / 2) + 1); - // this.placeSpawner(0, 1, depth/2, "Silverfish"); - EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 1, depth / 2); - mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); - mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 2); - } - - public void generateArmoury() { - int width = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - - for (int y = 1; y <= 4; y++) { - placeBlock(BlockListMF.frame_block, 0, 0, y, depth - 1); - - placeBlock(BlockListMF.frame_block, 0, -1, y, depth - 2); - placeBlock(BlockListMF.frame_block, 0, 1, y, depth - 2); - } - placeBlock(BlockListMF.cogwork_builder, 0, 0, 4, depth - 2); - - int z = (int) Math.ceil((float) depth / 2); - for (int x = -width; x <= width; x++) { - placeBlock(x == 0 ? BlockListMF.reinforced_stone_framediron : BlockListMF.reinforced_stone, 0, x, height, - z); - if (x < -1 || x > 1) { - if (getBlock(x, 1, z).getMaterial().isReplaceable()) { - Block block = (x == -2 || x == 2) ? BlockListMF.reinforced_stone_framed - : BlockListMF.reinforced_stone; - placeBlock(block, 0, x, 1, z); - } - } - for (int y = 2; y < height; y++) { - if (x < -1 || x > 1 || y > 3) { - if (getBlock(x, y, z).getMaterial().isReplaceable()) { - placeBlock(BlockListMF.bars[0], 0, x, y, z); - } - } - } - } - placeChest(-(width - 2), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); - placeChest(-(width - 3), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); - placeChest((width - 2), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); - placeChest((width - 3), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); - - for (int z1 = 1; z1 < z; z1++) { - for (int y = 1; y < height; y++) { - if (getBlock(-(width - 1), y, z1).getMaterial().isReplaceable()) { - if (y == 1 || y == 3) { - placeAmmoBox(-(width - 1), y, z1, rotateRight(), LootTypes.DWARVEN_AMMO); - } else { - placeBlock(Blocks.stone_slab, 11, -(width - 1), y, z1); - } - } - if (getBlock((width - 1), y, z1).getMaterial().isReplaceable()) { - if (y == 1 || y == 3) { - placeAmmoBox((width - 1), y, z1, rotateLeft(), LootTypes.DWARVEN_AMMO); - } else { - placeBlock(Blocks.stone_slab, 11, (width - 1), y, z1); - } - } - } - } - for (int z1 = 0; z1 < 4; z1++) { - placeRack((width - 1), 2, depth - 2 - z1, rotateRight()); - placeRack(-(width - 1), 2, depth - 2 - z1, rotateLeft()); - } - placeBlock(BlockListMF.schematic_general, 3, -2, 2, depth - 1); - placeBlock(BlockListMF.schematic_general, 4, 2, 2, depth - 1); - placeBlock(BlockListMF.reinforced_stone, 0, -2, 1, depth - 1); - placeBlock(BlockListMF.reinforced_stone, 0, 2, 1, depth - 1); - EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 1, z); - mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); - mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 3); - } - - private void placeRack(int x, int y, int z, int newDirection) { - placeBlock(BlockListMF.rack_wood, BlockRack.getDirection(newDirection), x, y, z); - TileEntity tile = this.getTileEntity(x, y, z, direction); - if (tile != null && tile instanceof TileEntityRack) { - setupRack((TileEntityRack) tile); - } - } - - private void setupRack(TileEntityRack rack) { - rack.setMaterial(CustomMaterial.getMaterial("ScrapWood")); - ItemWeaponMF[] items = new ItemWeaponMF[] { CustomToolListMF.standard_sword, CustomToolListMF.standard_waraxe, - CustomToolListMF.standard_mace, CustomToolListMF.standard_dagger }; - for (int i = 0; i < rack.getSizeInventory(); i++) { - if (rand.nextInt(3) != 0) { - ItemWeaponMF loot = items[rand.nextInt(items.length)]; - rack.setInventorySlotContents(i, loot.construct("Iron", "ScrapWood")); - } - } - } - - private void generateForge() { - boolean reverseForge = rand.nextBoolean(); - int width = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - int z = (int) Math.ceil((float) depth / 2); - - int position = reverseForge ? -1 : 1; - - placeBlock(BlockListMF.chimney_stone_extractor, 0, (width * position), 2, z); - placeBlock(BlockListMF.chimney_stone_extractor, 0, (width * position), 2, z - 1); - placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z); - placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z - 1); - placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z + 1); - placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z + 2); - placeBlock(BlockListMF.chimney_pipe, 0, ((width - 1) * position), 3, z + 2); - placeBlock(BlockListMF.chimney_pipe, 0, ((width - 1) * position), 4, z + 2); - placeBlock(BlockListMF.chimney_pipe, 0, ((width - 1) * position), 5, z + 2); - - int chestFacing = position < 0 ? rotateLeft() : rotateRight(); - placeChest((-(width - 2) * position), 1, z, chestFacing, LootTypes.DWARVEN_FORGE); - placeChest((-(width - 2) * position), 1, z - 1, chestFacing, LootTypes.DWARVEN_FORGE); - - placeBlock(BlockListMF.forge, 0, ((width - 1) * position), 1, z); - placeBlock(BlockListMF.forge, 0, ((width - 1) * position), 1, z - 1); - placeBlock(Blocks.air, 0, ((width - 1) * position), 2, z); - placeBlock(Blocks.air, 0, ((width - 1) * position), 2, z - 1); - - placeBlock(BlockListMF.schematic_general, 2, ((width - 1) * position), 2, z + 2); - placeBlock(BlockListMF.schematic_general, 5, ((width - 1) * position), 2, z - 3); - placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 1, z + 2); - placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 1, z - 3); - - placeBlock(BlockListMF.reinforced_stone_framed, 0, ((width - 1) * position), 1, z - 2); - placeBlock(BlockListMF.reinforced_stone_framed, 0, ((width - 1) * position), 1, z + 1); - placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 2, z - 2); - placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 2, z + 1); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, ((width - 1) * position), 3, z - 2); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, ((width - 1) * position), 3, z + 1); - - placeBlock(BlockListMF.anvil[1], rotateLeft(), position * 2, 1, z); - placeBlock(Blocks.cauldron, 0, position * 2, 1, z - 1); - - placeMiscMachine1(-(width - 2) * position, 0, depth - 3); - placeMiscMachine1(-(width - 2) * position, 0, 3); - // this.placeSpawner(0, 1, depth/2); - - EntityMinotaur mob = new EntityMinotaur(worldObj); - this.placeEntity(mob, 0, 1, depth / 2); - mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); - mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 2); - - } - - private void placeMiscMachine1(int x, int y, int z) { - placeBlock(Blocks.lava, 0, x, y, z); - placeBlock(BlockListMF.reinforced_stone_framed, 0, x - 1, y + 1, z - 1); - placeBlock(BlockListMF.reinforced_stone_framed, 0, x - 1, y + 1, z + 1); - placeBlock(BlockListMF.reinforced_stone_framed, 0, x + 1, y + 1, z - 1); - placeBlock(BlockListMF.reinforced_stone_framed, 0, x + 1, y + 1, z + 1); - placeBlock(BlockListMF.reinforced_stone, 0, x - 1, y + 2, z - 1); - placeBlock(BlockListMF.reinforced_stone, 0, x - 1, y + 2, z + 1); - placeBlock(BlockListMF.reinforced_stone, 0, x + 1, y + 2, z - 1); - placeBlock(BlockListMF.reinforced_stone, 0, x + 1, y + 2, z + 1); - placeBlock(BlockListMF.reinforced_stone, 0, x, y + 2, z); - placeBlock(BlockListMF.reinforced_stone, 0, x, y + 3, z); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, x + 1, y + 2, z); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, x - 1, y + 2, z); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, x, y + 2, z + 1); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, x, y + 2, z - 1); - - } - - private void placeChest(int x, int y, int z, int d, String loot) { - placeBlock(Blocks.chest, d, x, y, z); - TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); - - if (tile != null) { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, - 5 + rand.nextInt(5)); - } - } - - private void placeAmmoBox(int x, int y, int z, int d, String loot) { - placeBlock(BlockListMF.ammo_box_basic, d, x, y, z); - TileEntityAmmoBox tile = (TileEntityAmmoBox) getTileEntity(x, y, z, direction); - - if (tile != null) { - ItemStack ammo = ChestGenHooks.getOneItem(loot, rand); - tile.setMaterial(WoodMaterial.getMaterial("RefinedWood")); - tile.ammo = ammo; - tile.stock = ammo.getMaxStackSize() * (rand.nextInt(2) + 1) - + (ammo.stackSize > 1 ? rand.nextInt(ammo.stackSize) : 0); - if (ammo.getItem() instanceof ItemBomb || ammo.getItem() instanceof ItemMine) { - tile.stock = Math.max(1, tile.stock / 4); - } - ammo = null; - } - } - - protected void tryPlaceMinorRoom(int x, int y, int z, int d, boolean hall) { - Class extension = hall ? StructureGenDSHall.class : StructureGenDSRoomSml2.class; - if (extension != null) { - mapStructure(x, y, z, d, extension); - } - } + private static final String[] possible_types = new String[]{"Living", "Forge", "Study", "Armoury"}; + protected String lootType = ChestGenHooks.DUNGEON_CHEST; + protected Block floor_block = BlockListMF.cobble_pavement; + private String type = "Basic"; + + public StructureGenDSRoom(World world, StructureCoordinates position) { + super(world, position); + randomiseType(); + } + + public StructureGenDSRoom(World world, int x, int y, int z, int direction) { + super(world, x, y, z, direction); + randomiseType(); + } + + private void randomiseType() { + type = geRandomType(); + } + + /** + * @return 10% for Armoury----20& for Forge----30% for Study----40% for Living + */ + private String geRandomType() { + int c = rand.nextInt(10); + if (c == 0) + return "Armoury";// 0 (10%) + else if (c < 3) + return "Forge";// 1,2 (20%) + else if (c < 6) + return "Study";// 3,4,5 (30%) + + return "Living";// 6,7,8,9 (40%) + } + + @Override + public boolean canGenerate() { + int width_span = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + int filledSpaces = 0, emptySpaces = 0; + for (int x = -width_span; x <= width_span; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { + Block block = this.getBlock(x, y, z); + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { + return false; + } + if (!block.getMaterial().isSolid()) { + ++emptySpaces; + } else { + ++filledSpaces; + } + } + } + } + if (WorldGenDwarvenStronghold.debug_air) { + return true; + } + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full + } + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { + return false; + } + return true; + } + + @Override + public void generate() { + int width_span = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + for (int x = -width_span; x <= width_span; x++) { + for (int z = 0; z <= depth; z++) { + Object[] blockarray; + // FLOOR + blockarray = getFloor(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, 0, z); + } + // WALLS + for (int y = 1; y <= height + 1; y++) { + blockarray = getWalls(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); + } + } + // CEILING + blockarray = getCeiling(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1, z); + } + + // TRIM + blockarray = getTrim(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height, z); + if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { + for (int h = height - 1; h > 1; h--) { + placeBlock(h == 4 ? Blocks.glowstone : BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h, + z); + } + placeBlock(BlockListMF.reinforced_stone_framed, 0, x, 1, z); + } + } + + } + } + + // DOORWAY + buildDoorway(width_span, depth, height); + + if (type.equalsIgnoreCase("Living")) { + generateLivingHub(); + } + if (type.equalsIgnoreCase("Armoury")) { + generateArmoury(); + } + if (type.equalsIgnoreCase("Forge")) { + generateForge(); + } + if (type.equalsIgnoreCase("Study")) { + generateStudy(); + } + } + + protected void buildDoorway(int width_span, int depth, int height) { + for (int x = -1; x <= 1; x++) { + for (int y = 1; y <= 3; y++) { + for (int z = 0; z >= -1; z--) { + placeBlock(Blocks.air, 0, x, y, z); + } + } + } + } + + protected void tryPlaceHall(int x, int y, int z, int d) { + Class extension = getRandomExtension(); + if (extension != null) { + mapStructure(x, y, z, d, extension); + } + } + + protected int getHeight() { + if (type.equalsIgnoreCase("Forge")) { + return 7; + } + return 5; + } + + protected int getDepthSpan() { + if (type.equalsIgnoreCase("Living")) { + return 19; + } + return 13; + } + + protected int getWidthSpan() { + return 5; + } + + protected Class getRandomExtension() { + if (rand.nextInt(4) == 0) { + return StructureGenDSIntersection.class; + } + if (rand.nextInt(8) == 0 && this.yCoord > 24) { + return StructureGenDSStairs.class; + } + return StructureGenDSRoom.class; + } + + private Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + return null; + } + if (x == -(radius - 1) || x == (radius - 1)) { + if (z == (int) Math.ceil((float) depth / 2) || z == (int) Math.floor((float) depth / 2)) { + return new Object[]{BlockListMF.reinforced_stone_framed, false}; + } + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + if ((x == -(radius - 1) && (z == (depth - 1) || z == 1)) + || (x == (radius - 1) && (z == (depth - 1) || z == 1))) { + return new Object[]{BlockListMF.reinforced_stone_framed, false}; + } + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return null; + } + + private Object[] getCeiling(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + return null; + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + + private Object[] getFloor(int radius, int depth, int x, int z) { + if (type.equalsIgnoreCase("Living") || type.equalsIgnoreCase("Study")) { + floor_block = BlockListMF.refined_planks; + if (x > -2 && x < 2 && z > 3 && z < (depth - 3)) { + floor_block = Blocks.obsidian; + } + } + if (z < 2 && x >= -1 && x <= 1) { + return new Object[]{floor_block, false}; + } + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{floor_block, false}; + } + + private Object[] getWalls(int radius, int depth, int x, int z) { + if (x == -radius || x == radius || z == depth || z == 0) { + if ((x == -radius && (z == depth || z == 0)) || (x == radius && (z == depth || z == 0))) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + return new Object[]{Blocks.air, false}; + } + + public StructureModuleMF setLoot(String loot) { + this.lootType = loot; + return this; + } + + public void generateLivingHub() { + int width_span = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + + int zOffset = 4; + + boolean hall1 = rand.nextInt(3) == 0, hall2 = rand.nextInt(3) == 0, hall3 = rand.nextInt(3) == 0; + int offset1 = hall1 ? width_span + 1 : width_span; + int offset2 = hall2 ? -(width_span + 1) : -width_span; + int offset3 = hall3 ? depth + 1 : depth; + + tryPlaceMinorRoom(width_span, 0, zOffset, rotateLeft(), false); + tryPlaceMinorRoom(offset1, 0, depth - zOffset, rotateLeft(), hall1); + + tryPlaceMinorRoom(-width_span, 0, zOffset, rotateRight(), false); + tryPlaceMinorRoom(offset2, 0, depth - zOffset, rotateRight(), hall2); + tryPlaceMinorRoom(0, 0, offset3, direction, hall3); + // this.placeSpawner(0, 1, depth-5); + + EntityMinotaur mob = new EntityMinotaur(worldObj); + this.placeEntity(mob, 0, 1, depth - 5); + mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); + mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 1); + + } + + public void generateStudy() { + int width = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + + for (int z = 0; z < depth; z++) { + int ystart = 1; + if (z == (int) Math.ceil((float) depth / 2) + 1 || z == (int) Math.floor((float) depth / 2) - 1) { + ystart = 3; + placeChest(-(width - 1), 1, z, rotateLeft(), LootTypes.DWARVEN_STUDY); + placeChest(width - 1, 1, z, rotateRight(), LootTypes.DWARVEN_STUDY); + } + for (int y = ystart; y < height; y++) { + if (getBlock(-(width - 1), y, z).getMaterial().isReplaceable()) { + placeBlock(Blocks.bookshelf, 0, -(width - 1), y, z); + } + if (getBlock(width - 1, y, z).getMaterial().isReplaceable()) { + placeBlock(Blocks.bookshelf, 0, width - 1, y, z); + } + } + } + for (int x = 0; x < 3; x++) { + placeBlock(Blocks.double_stone_slab, 0, -1 + x, 1, (int) Math.floor((float) depth / 2) - 1); + placeBlock(Blocks.double_stone_slab, 0, -1 + x, 1, (int) Math.ceil((float) depth / 2) + 1); + } + placeBlock(BlockListMF.schematic_general, 0, 0, 2, (int) Math.floor((float) depth / 2) - 1); + placeBlock(BlockListMF.schematic_general, 1, 0, 2, (int) Math.ceil((float) depth / 2) + 1); + // this.placeSpawner(0, 1, depth/2, "Silverfish"); + EntityMinotaur mob = new EntityMinotaur(worldObj); + this.placeEntity(mob, 0, 1, depth / 2); + mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); + mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 2); + } + + public void generateArmoury() { + int width = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + + for (int y = 1; y <= 4; y++) { + placeBlock(BlockListMF.frame_block, 0, 0, y, depth - 1); + + placeBlock(BlockListMF.frame_block, 0, -1, y, depth - 2); + placeBlock(BlockListMF.frame_block, 0, 1, y, depth - 2); + } + placeBlock(BlockListMF.cogwork_builder, 0, 0, 4, depth - 2); + + int z = (int) Math.ceil((float) depth / 2); + for (int x = -width; x <= width; x++) { + placeBlock(x == 0 ? BlockListMF.reinforced_stone_framediron : BlockListMF.reinforced_stone, 0, x, height, + z); + if (x < -1 || x > 1) { + if (getBlock(x, 1, z).getMaterial().isReplaceable()) { + Block block = (x == -2 || x == 2) ? BlockListMF.reinforced_stone_framed + : BlockListMF.reinforced_stone; + placeBlock(block, 0, x, 1, z); + } + } + for (int y = 2; y < height; y++) { + if (x < -1 || x > 1 || y > 3) { + if (getBlock(x, y, z).getMaterial().isReplaceable()) { + placeBlock(BlockListMF.bars[0], 0, x, y, z); + } + } + } + } + placeChest(-(width - 2), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); + placeChest(-(width - 3), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); + placeChest((width - 2), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); + placeChest((width - 3), 1, z - 1, direction, LootTypes.DWARVEN_ARMOURY); + + for (int z1 = 1; z1 < z; z1++) { + for (int y = 1; y < height; y++) { + if (getBlock(-(width - 1), y, z1).getMaterial().isReplaceable()) { + if (y == 1 || y == 3) { + placeAmmoBox(-(width - 1), y, z1, rotateRight(), LootTypes.DWARVEN_AMMO); + } else { + placeBlock(Blocks.stone_slab, 11, -(width - 1), y, z1); + } + } + if (getBlock((width - 1), y, z1).getMaterial().isReplaceable()) { + if (y == 1 || y == 3) { + placeAmmoBox((width - 1), y, z1, rotateLeft(), LootTypes.DWARVEN_AMMO); + } else { + placeBlock(Blocks.stone_slab, 11, (width - 1), y, z1); + } + } + } + } + for (int z1 = 0; z1 < 4; z1++) { + placeRack((width - 1), 2, depth - 2 - z1, rotateRight()); + placeRack(-(width - 1), 2, depth - 2 - z1, rotateLeft()); + } + placeBlock(BlockListMF.schematic_general, 3, -2, 2, depth - 1); + placeBlock(BlockListMF.schematic_general, 4, 2, 2, depth - 1); + placeBlock(BlockListMF.reinforced_stone, 0, -2, 1, depth - 1); + placeBlock(BlockListMF.reinforced_stone, 0, 2, 1, depth - 1); + EntityMinotaur mob = new EntityMinotaur(worldObj); + this.placeEntity(mob, 0, 1, z); + mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); + mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 3); + } + + private void placeRack(int x, int y, int z, int newDirection) { + placeBlock(BlockListMF.rack_wood, BlockRack.getDirection(newDirection), x, y, z); + TileEntity tile = this.getTileEntity(x, y, z, direction); + if (tile != null && tile instanceof TileEntityRack) { + setupRack((TileEntityRack) tile); + } + } + + private void setupRack(TileEntityRack rack) { + rack.setMaterial(CustomMaterial.getMaterial("ScrapWood")); + ItemWeaponMF[] items = new ItemWeaponMF[]{CustomToolListMF.standard_sword, CustomToolListMF.standard_waraxe, + CustomToolListMF.standard_mace, CustomToolListMF.standard_dagger}; + for (int i = 0; i < rack.getSizeInventory(); i++) { + if (rand.nextInt(3) != 0) { + ItemWeaponMF loot = items[rand.nextInt(items.length)]; + rack.setInventorySlotContents(i, loot.construct("Iron", "ScrapWood")); + } + } + } + + private void generateForge() { + boolean reverseForge = rand.nextBoolean(); + int width = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + int z = (int) Math.ceil((float) depth / 2); + + int position = reverseForge ? -1 : 1; + + placeBlock(BlockListMF.chimney_stone_extractor, 0, (width * position), 2, z); + placeBlock(BlockListMF.chimney_stone_extractor, 0, (width * position), 2, z - 1); + placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z); + placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z - 1); + placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z + 1); + placeBlock(BlockListMF.chimney_pipe, 0, (width * position), 3, z + 2); + placeBlock(BlockListMF.chimney_pipe, 0, ((width - 1) * position), 3, z + 2); + placeBlock(BlockListMF.chimney_pipe, 0, ((width - 1) * position), 4, z + 2); + placeBlock(BlockListMF.chimney_pipe, 0, ((width - 1) * position), 5, z + 2); + + int chestFacing = position < 0 ? rotateLeft() : rotateRight(); + placeChest((-(width - 2) * position), 1, z, chestFacing, LootTypes.DWARVEN_FORGE); + placeChest((-(width - 2) * position), 1, z - 1, chestFacing, LootTypes.DWARVEN_FORGE); + + placeBlock(BlockListMF.forge, 0, ((width - 1) * position), 1, z); + placeBlock(BlockListMF.forge, 0, ((width - 1) * position), 1, z - 1); + placeBlock(Blocks.air, 0, ((width - 1) * position), 2, z); + placeBlock(Blocks.air, 0, ((width - 1) * position), 2, z - 1); + + placeBlock(BlockListMF.schematic_general, 2, ((width - 1) * position), 2, z + 2); + placeBlock(BlockListMF.schematic_general, 5, ((width - 1) * position), 2, z - 3); + placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 1, z + 2); + placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 1, z - 3); + + placeBlock(BlockListMF.reinforced_stone_framed, 0, ((width - 1) * position), 1, z - 2); + placeBlock(BlockListMF.reinforced_stone_framed, 0, ((width - 1) * position), 1, z + 1); + placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 2, z - 2); + placeBlock(BlockListMF.reinforced_stone, 0, ((width - 1) * position), 2, z + 1); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, ((width - 1) * position), 3, z - 2); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, ((width - 1) * position), 3, z + 1); + + placeBlock(BlockListMF.anvil[1], rotateLeft(), position * 2, 1, z); + placeBlock(Blocks.cauldron, 0, position * 2, 1, z - 1); + + placeMiscMachine1(-(width - 2) * position, 0, depth - 3); + placeMiscMachine1(-(width - 2) * position, 0, 3); + // this.placeSpawner(0, 1, depth/2); + + EntityMinotaur mob = new EntityMinotaur(worldObj); + this.placeEntity(mob, 0, 1, depth / 2); + mob.setSpecies(MinotaurBreed.getEnvironment(subtype)); + mob.worldGenTier(MinotaurBreed.getEnvironment(subtype), 2); + + } + + private void placeMiscMachine1(int x, int y, int z) { + placeBlock(Blocks.lava, 0, x, y, z); + placeBlock(BlockListMF.reinforced_stone_framed, 0, x - 1, y + 1, z - 1); + placeBlock(BlockListMF.reinforced_stone_framed, 0, x - 1, y + 1, z + 1); + placeBlock(BlockListMF.reinforced_stone_framed, 0, x + 1, y + 1, z - 1); + placeBlock(BlockListMF.reinforced_stone_framed, 0, x + 1, y + 1, z + 1); + placeBlock(BlockListMF.reinforced_stone, 0, x - 1, y + 2, z - 1); + placeBlock(BlockListMF.reinforced_stone, 0, x - 1, y + 2, z + 1); + placeBlock(BlockListMF.reinforced_stone, 0, x + 1, y + 2, z - 1); + placeBlock(BlockListMF.reinforced_stone, 0, x + 1, y + 2, z + 1); + placeBlock(BlockListMF.reinforced_stone, 0, x, y + 2, z); + placeBlock(BlockListMF.reinforced_stone, 0, x, y + 3, z); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, x + 1, y + 2, z); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, x - 1, y + 2, z); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, x, y + 2, z + 1); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, x, y + 2, z - 1); + + } + + private void placeChest(int x, int y, int z, int d, String loot) { + placeBlock(Blocks.chest, d, x, y, z); + TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); + + if (tile != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, + 5 + rand.nextInt(5)); + } + } + + private void placeAmmoBox(int x, int y, int z, int d, String loot) { + placeBlock(BlockListMF.ammo_box_basic, d, x, y, z); + TileEntityAmmoBox tile = (TileEntityAmmoBox) getTileEntity(x, y, z, direction); + + if (tile != null) { + ItemStack ammo = ChestGenHooks.getOneItem(loot, rand); + tile.setMaterial(WoodMaterial.getMaterial("RefinedWood")); + tile.ammo = ammo; + tile.stock = ammo.getMaxStackSize() * (rand.nextInt(2) + 1) + + (ammo.stackSize > 1 ? rand.nextInt(ammo.stackSize) : 0); + if (ammo.getItem() instanceof ItemBomb || ammo.getItem() instanceof ItemMine) { + tile.stock = Math.max(1, tile.stock / 4); + } + ammo = null; + } + } + + protected void tryPlaceMinorRoom(int x, int y, int z, int d, boolean hall) { + Class extension = hall ? StructureGenDSHall.class : StructureGenDSRoomSml2.class; + if (extension != null) { + mapStructure(x, y, z, d, extension); + } + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml.java index d2de424d..dca41b80 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml.java @@ -12,158 +12,158 @@ import net.minecraftforge.common.ChestGenHooks; public class StructureGenDSRoomSml extends StructureModuleMF { - public StructureGenDSRoomSml(World world, StructureCoordinates position) { - super(world, position); - } - - protected int getHeight() { - return 5; - } - - protected int getDepth() { - return 8; - } - - protected int getWidth() { - return 4; - } - - @Override - public boolean canGenerate() { - int width = getWidth(), depth = getDepth(), height = getHeight(); - int filledSpaces = 0, emptySpaces = 0; - - for (int x = -width; x <= width; x++) { - for (int y = 0; y <= height; y++) { - for (int z = 1; z <= depth; z++) { - Block block = this.getBlock(x, y, z); - if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { - return false; - } - if (!block.getMaterial().isSolid()) { - ++emptySpaces; - } else { - ++filledSpaces; - } - } - } - } - if (WorldGenDwarvenStronghold.debug_air) { - return true; - } - return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at - // least - // 75% - // full - } - - private boolean allowBuildOverBlock(Block block) { - if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { - return false; - } - return true; - } - - @Override - public void generate() { - int width = getWidth(), depth = getDepth(), height = getHeight(); - - for (int x = -width; x <= width; x++) { - for (int z = 0; z <= depth; z++) { - Object[] blockarray; - // FLOOR - blockarray = getFloor(width, depth, x, z); - if (blockarray != null) { - placeBlock((Block) blockarray[0], 0, x, 0, z); - } - // WALLS - for (int y = 1; y <= height; y++) { - blockarray = getWalls(width, depth, x, z); - if (blockarray != null && this.allowBuildOverBlock(getBlock(x, y, z))) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, y, z); - } - } - // CEILING - blockarray = getCeiling(width, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height, z); - } - } - } - placeBlock(Blocks.air, 0, 0, 1, 0); - placeBlock(Blocks.air, 0, 0, 2, 0); - - placeBlock(BlockListMF.reinforced_stone_framed, 0, -1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, -1, 3, -1); - - placeBlock(BlockListMF.reinforced_stone_framed, 0, 1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, 1, 3, -1); - - placeBlock(BlockListMF.reinforced_stone, 1, 0, 3, -1); - placeBlock(Blocks.air, 0, 0, 1, -1); - placeBlock(Blocks.air, 0, 0, 2, -1); - - buildHomeFurnishings(width, depth, height); - } - - private Object[] getFloor(int width, int depth, int x, int z) { - if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { - return new Object[] { BlockListMF.reinforced_stone, 0 }; - } - return new Object[] { BlockListMF.cobble_pavement, 0 }; - } - - private Object[] getCeiling(int width, int depth, int x, int z) { - if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - - private Object[] getWalls(int width, int depth, int x, int z) { - if (x == -width || x == width || z == depth || z == 0) { - if ((x == -width && (z == depth || z == 0)) || (x == width && (z == depth || z == 0))) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - return new Object[] { Blocks.air, false }; - } - - private void buildHomeFurnishings(int width, int depth, int height) { - placeBlock(Blocks.furnace, rotateLeft(), width, 2, 2); - - placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 1); - placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 2); - - for (int x = width - 1; x >= (width - 4); x--) { - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 1, 4); - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 2, 4); - placeBlock(Blocks.stone_slab, 0, x, 3, 4); - } - placeBlock(Blocks.stone_slab, 0, width - 1, 1, 6); - placeBlock(Blocks.stone_slab, 0, width - 2, 1, 6); - placeBlock(Blocks.cauldron, 0, width - 2, 1, 1); - - placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(reverse()), -(width - 1), 1, 1); - placeBlock(Blocks.stone_slab, 8, -(width - 1), 1, 2); - placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(direction), -(width - 1), 1, 3); - - placeChest(width - 3, 1, 6, rotateLeft(), LootTypes.DWARVEN_HOME); - } - - private void placeChest(int x, int y, int z, int d, String loot) { - placeBlock(Blocks.chest, d, x, y, z); - TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); - - if (tile != null) { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, - 2 + rand.nextInt(3)); - } - } + public StructureGenDSRoomSml(World world, StructureCoordinates position) { + super(world, position); + } + + protected int getHeight() { + return 5; + } + + protected int getDepth() { + return 8; + } + + protected int getWidth() { + return 4; + } + + @Override + public boolean canGenerate() { + int width = getWidth(), depth = getDepth(), height = getHeight(); + int filledSpaces = 0, emptySpaces = 0; + + for (int x = -width; x <= width; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { + Block block = this.getBlock(x, y, z); + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { + return false; + } + if (!block.getMaterial().isSolid()) { + ++emptySpaces; + } else { + ++filledSpaces; + } + } + } + } + if (WorldGenDwarvenStronghold.debug_air) { + return true; + } + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full + } + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { + return false; + } + return true; + } + + @Override + public void generate() { + int width = getWidth(), depth = getDepth(), height = getHeight(); + + for (int x = -width; x <= width; x++) { + for (int z = 0; z <= depth; z++) { + Object[] blockarray; + // FLOOR + blockarray = getFloor(width, depth, x, z); + if (blockarray != null) { + placeBlock((Block) blockarray[0], 0, x, 0, z); + } + // WALLS + for (int y = 1; y <= height; y++) { + blockarray = getWalls(width, depth, x, z); + if (blockarray != null && this.allowBuildOverBlock(getBlock(x, y, z))) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); + } + } + // CEILING + blockarray = getCeiling(width, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height, z); + } + } + } + placeBlock(Blocks.air, 0, 0, 1, 0); + placeBlock(Blocks.air, 0, 0, 2, 0); + + placeBlock(BlockListMF.reinforced_stone_framed, 0, -1, 1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, -1, 3, -1); + + placeBlock(BlockListMF.reinforced_stone_framed, 0, 1, 1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, 1, 3, -1); + + placeBlock(BlockListMF.reinforced_stone, 1, 0, 3, -1); + placeBlock(Blocks.air, 0, 0, 1, -1); + placeBlock(Blocks.air, 0, 0, 2, -1); + + buildHomeFurnishings(width, depth, height); + } + + private Object[] getFloor(int width, int depth, int x, int z) { + if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { + return new Object[]{BlockListMF.reinforced_stone, 0}; + } + return new Object[]{BlockListMF.cobble_pavement, 0}; + } + + private Object[] getCeiling(int width, int depth, int x, int z) { + if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + + private Object[] getWalls(int width, int depth, int x, int z) { + if (x == -width || x == width || z == depth || z == 0) { + if ((x == -width && (z == depth || z == 0)) || (x == width && (z == depth || z == 0))) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + return new Object[]{Blocks.air, false}; + } + + private void buildHomeFurnishings(int width, int depth, int height) { + placeBlock(Blocks.furnace, rotateLeft(), width, 2, 2); + + placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 1); + placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 2); + + for (int x = width - 1; x >= (width - 4); x--) { + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 1, 4); + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 2, 4); + placeBlock(Blocks.stone_slab, 0, x, 3, 4); + } + placeBlock(Blocks.stone_slab, 0, width - 1, 1, 6); + placeBlock(Blocks.stone_slab, 0, width - 2, 1, 6); + placeBlock(Blocks.cauldron, 0, width - 2, 1, 1); + + placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(reverse()), -(width - 1), 1, 1); + placeBlock(Blocks.stone_slab, 8, -(width - 1), 1, 2); + placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(direction), -(width - 1), 1, 3); + + placeChest(width - 3, 1, 6, rotateLeft(), LootTypes.DWARVEN_HOME); + } + + private void placeChest(int x, int y, int z, int d, String loot) { + placeBlock(Blocks.chest, d, x, y, z); + TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); + + if (tile != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, + 2 + rand.nextInt(3)); + } + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml2.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml2.java index 27bf8126..5a30c241 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml2.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSRoomSml2.java @@ -12,159 +12,159 @@ import net.minecraftforge.common.ChestGenHooks; public class StructureGenDSRoomSml2 extends StructureModuleMF { - public StructureGenDSRoomSml2(World world, StructureCoordinates position) { - super(world, position); - } - - protected int getHeight() { - return 5; - } - - protected int getDepth() { - return 10; - } - - protected int getWidth() { - return 4; - } - - @Override - public boolean canGenerate() { - int width = getWidth(), depth = getDepth(), height = getHeight(); - int filledSpaces = 0, emptySpaces = 0; - - for (int x = -width; x <= width; x++) { - for (int y = 0; y <= height; y++) { - for (int z = 1; z <= depth; z++) { - Block block = this.getBlock(x, y, z); - if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { - return false; - } - if (!block.getMaterial().isSolid()) { - ++emptySpaces; - } else { - ++filledSpaces; - } - } - } - } - if (WorldGenDwarvenStronghold.debug_air) { - return true; - } - return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at - // least - // 75% - // full - } - - private boolean allowBuildOverBlock(Block block) { - if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { - return false; - } - return true; - } - - @Override - public void generate() { - int width = getWidth(), depth = getDepth(), height = getHeight(); - - for (int x = -width; x <= width; x++) { - for (int z = 0; z <= depth; z++) { - Object[] blockarray; - // FLOOR - blockarray = getFloor(width, depth, x, z); - if (blockarray != null) { - placeBlock((Block) blockarray[0], 0, x, 0, z); - } - // WALLS - for (int y = 1; y <= height; y++) { - blockarray = getWalls(width, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, y, z); - } - } - // CEILING - blockarray = getCeiling(width, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height, z); - } - } - } - placeBlock(Blocks.air, 0, 0, 1, 0); - placeBlock(Blocks.air, 0, 0, 2, 0); - - placeBlock(BlockListMF.reinforced_stone_framed, 0, -1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, -1, 3, -1); - - placeBlock(BlockListMF.reinforced_stone_framed, 0, 1, 1, -1); - placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); - placeBlock(BlockListMF.reinforced_stone_framediron, 0, 1, 3, -1); - - placeBlock(BlockListMF.reinforced_stone, 1, 0, 3, -1); - placeBlock(Blocks.air, 0, 0, 1, -1); - placeBlock(Blocks.air, 0, 0, 2, -1); - - buildHomeFurnishings(width, depth, height); - } - - private Object[] getFloor(int width, int depth, int x, int z) { - if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { - return new Object[] { BlockListMF.reinforced_stone, 0 }; - } - return new Object[] { BlockListMF.refined_planks, 0 }; - } - - private Object[] getCeiling(int width, int depth, int x, int z) { - if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - - private Object[] getWalls(int width, int depth, int x, int z) { - if (x == -width || x == width || z == depth || z == 0) { - if ((x == -width && (z == depth || z == 0)) || (x == width && (z == depth || z == 0))) { - return new Object[] { BlockListMF.reinforced_stone, false }; - } - - return new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - return new Object[] { Blocks.air, false }; - } - - private void buildHomeFurnishings(int width, int depth, int height) { - placeBlock(Blocks.furnace, rotateLeft(), width, 2, 2); - placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 1); - placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 2); - - for (int x = width - 1; x >= (width - 4); x--) { - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 1, 5); - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 2, 5); - placeBlock(Blocks.stone_slab, 0, x, 3, 5); - } - placeBlock(Blocks.stone_slab, 0, width - 1, 1, 7); - placeBlock(Blocks.stone_slab, 0, width - 2, 1, 7); - placeBlock(Blocks.stone_slab, 0, width - 1, 1, 8); - placeBlock(Blocks.stone_slab, 0, width - 2, 1, 8); - placeBlock(Blocks.cauldron, 0, width - 2, 1, 1); - - placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(reverse()), -(width - 1), 1, 1); - placeBlock(Blocks.stone_slab, 8, -(width - 1), 1, 2); - placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(direction), -(width - 1), 1, 3); - - placeChest(width - 3, 1, 7, rotateLeft(), LootTypes.DWARVEN_HOME_RICH); - } - - private void placeChest(int x, int y, int z, int d, String loot) { - placeBlock(Blocks.chest, d, x, y, z); - TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); - - if (tile != null) { - WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, - 2 + rand.nextInt(3)); - } - } + public StructureGenDSRoomSml2(World world, StructureCoordinates position) { + super(world, position); + } + + protected int getHeight() { + return 5; + } + + protected int getDepth() { + return 10; + } + + protected int getWidth() { + return 4; + } + + @Override + public boolean canGenerate() { + int width = getWidth(), depth = getDepth(), height = getHeight(); + int filledSpaces = 0, emptySpaces = 0; + + for (int x = -width; x <= width; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { + Block block = this.getBlock(x, y, z); + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y, z, direction)) { + return false; + } + if (!block.getMaterial().isSolid()) { + ++emptySpaces; + } else { + ++filledSpaces; + } + } + } + } + if (WorldGenDwarvenStronghold.debug_air) { + return true; + } + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full + } + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { + return false; + } + return true; + } + + @Override + public void generate() { + int width = getWidth(), depth = getDepth(), height = getHeight(); + + for (int x = -width; x <= width; x++) { + for (int z = 0; z <= depth; z++) { + Object[] blockarray; + // FLOOR + blockarray = getFloor(width, depth, x, z); + if (blockarray != null) { + placeBlock((Block) blockarray[0], 0, x, 0, z); + } + // WALLS + for (int y = 1; y <= height; y++) { + blockarray = getWalls(width, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, y, z); + } + } + // CEILING + blockarray = getCeiling(width, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height, z); + } + } + } + placeBlock(Blocks.air, 0, 0, 1, 0); + placeBlock(Blocks.air, 0, 0, 2, 0); + + placeBlock(BlockListMF.reinforced_stone_framed, 0, -1, 1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, -1, 2, -1); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, -1, 3, -1); + + placeBlock(BlockListMF.reinforced_stone_framed, 0, 1, 1, -1); + placeBlock(BlockListMF.reinforced_stone, 0, 1, 2, -1); + placeBlock(BlockListMF.reinforced_stone_framediron, 0, 1, 3, -1); + + placeBlock(BlockListMF.reinforced_stone, 1, 0, 3, -1); + placeBlock(Blocks.air, 0, 0, 1, -1); + placeBlock(Blocks.air, 0, 0, 2, -1); + + buildHomeFurnishings(width, depth, height); + } + + private Object[] getFloor(int width, int depth, int x, int z) { + if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { + return new Object[]{BlockListMF.reinforced_stone, 0}; + } + return new Object[]{BlockListMF.refined_planks, 0}; + } + + private Object[] getCeiling(int width, int depth, int x, int z) { + if (x == -(width - 1) || x == (width - 1) || z == 1 || z == depth - 1) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + + private Object[] getWalls(int width, int depth, int x, int z) { + if (x == -width || x == width || z == depth || z == 0) { + if ((x == -width && (z == depth || z == 0)) || (x == width && (z == depth || z == 0))) { + return new Object[]{BlockListMF.reinforced_stone, false}; + } + + return new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + return new Object[]{Blocks.air, false}; + } + + private void buildHomeFurnishings(int width, int depth, int height) { + placeBlock(Blocks.furnace, rotateLeft(), width, 2, 2); + placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 1); + placeBlock(Blocks.double_stone_slab, 0, width - 3, 1, 2); + + for (int x = width - 1; x >= (width - 4); x--) { + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 1, 5); + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, 2, 5); + placeBlock(Blocks.stone_slab, 0, x, 3, 5); + } + placeBlock(Blocks.stone_slab, 0, width - 1, 1, 7); + placeBlock(Blocks.stone_slab, 0, width - 2, 1, 7); + placeBlock(Blocks.stone_slab, 0, width - 1, 1, 8); + placeBlock(Blocks.stone_slab, 0, width - 2, 1, 8); + placeBlock(Blocks.cauldron, 0, width - 2, 1, 1); + + placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(reverse()), -(width - 1), 1, 1); + placeBlock(Blocks.stone_slab, 8, -(width - 1), 1, 2); + placeBlock(Blocks.stone_brick_stairs, this.getStairDirection(direction), -(width - 1), 1, 3); + + placeChest(width - 3, 1, 7, rotateLeft(), LootTypes.DWARVEN_HOME_RICH); + } + + private void placeChest(int x, int y, int z, int d, String loot) { + placeBlock(Blocks.chest, d, x, y, z); + TileEntityChest tile = (TileEntityChest) getTileEntity(x, y, z, direction); + + if (tile != null) { + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(loot, rand), tile, + 2 + rand.nextInt(3)); + } + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSStairs.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSStairs.java index 40a8e54e..39366b5e 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSStairs.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/StructureGenDSStairs.java @@ -9,247 +9,246 @@ import net.minecraftforge.common.ChestGenHooks; public class StructureGenDSStairs extends StructureModuleMF { - /** - * The minimal height for a stairway to be created - */ - public static final int minLevel = 20; - - public StructureGenDSStairs(World world, StructureCoordinates position) { - super(world, position); - } - - public StructureGenDSStairs(World world, int x, int y, int z, int direction) { - super(world, x, y, z, direction); - } - - @Override - public boolean canGenerate() { - if (lengthId == -100) { - return true; - } - - int width_span = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - int empty_spaces = 0; - int filledSpaces = 0, emptySpaces = 0; - for (int x = -width_span; x <= width_span; x++) { - for (int y = 0; y <= height; y++) { - for (int z = 1; z <= depth; z++) { - Block block = this.getBlock(x, y - z, z); - if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y - z, z, direction)) { - return false; - } - if (!block.getMaterial().isSolid()) { - ++emptySpaces; - } else { - ++filledSpaces; - } - } - } - } - if (WorldGenDwarvenStronghold.debug_air) { - return true; - } - return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at - // least - // 75% - // full - } - - private boolean allowBuildOverBlock(Block block) { - if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { - return false; - } - return true; - } - - @Override - public void generate() { - int width_span = getWidthSpan(); - int depth = getDepthSpan(); - int height = getHeight(); - for (int x = -width_span; x <= width_span; x++) { - for (int z = 0; z <= depth; z++) { - Object[] blockarray; - - // FLOOR - blockarray = getFloor(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Integer) blockarray[1]; - placeBlock((Block) blockarray[0], meta, x, -z - 1, z); - - placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, - -z - 2, z); - - if (x == (width_span - 1) || x == -(width_span - 1)) { - placeBlock(BlockListMF.reinforced_stone, 0, x, -z, z); - } else { - placeBlock(Blocks.air, 0, x, -z, z); - } - } - // WALLS - for (int y = 0; y <= height + 1; y++) { - blockarray = getWalls(width_span, height, depth, x, y, z); - if (blockarray != null) { - int meta = 0; - if (blockarray[1] instanceof Integer) { - meta = (Integer) blockarray[1]; - } - if (blockarray[1] instanceof Boolean) { - meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - } - if (blockarray[1] instanceof String) { - meta = (String) blockarray[1] == "Hall" ? StructureGenDSHall.getRandomEngravedWall(rand) - : 0; - } - placeBlock((Block) blockarray[0], meta, x, y - z, z); - } - } - // CEILING - blockarray = getCeiling(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height + 1 - z, z); - } - - // TRIM - blockarray = getTrim(width_span, depth, x, z); - if (blockarray != null) { - int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; - placeBlock((Block) blockarray[0], meta, x, height - z, z); - if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { - placeBlock(BlockListMF.reinforced_stone, 0, x, height - z, z); - placeBlock(BlockListMF.reinforced_stone_framed, 0, x, height - z - 1, z); - - for (int h = height - 1; h > 1; h--) { - placeBlock(BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h - z - 1, z); - } - placeBlock(BlockListMF.reinforced_stone_framed, 0, x, -z, z); - } - } - - } - } - - // DOORWAY - buildDoorway(width_span, depth, height); - - if (lengthId == -100) { - this.lengthId = -99; - if ((yCoord > 64 && rand.nextInt(3) != 0) || (yCoord >= 56 && rand.nextInt(3) == 0)) { - mapStructure(0, -depth, depth, StructureGenDSStairs.class); - } else { - mapStructure(0, -depth, depth, StructureGenDSCrossroads.class); - } - } - ++lengthId;// Stairs don't count toward length - if (lengthId > 0) { - buildNext(width_span, depth, height); - } - } - - protected void buildDoorway(int width_span, int depth, int height) { - for (int x = -1; x <= 1; x++) { - for (int y = 1; y <= 3; y++) { - for (int z = 0; z >= -1; z--) { - placeBlock(Blocks.air, 0, x, y, z); - } - } - placeBlock(BlockListMF.cobble_pavement_stair, getStairDirection(reverse()), x, 0, -1); - } - } - - protected void buildNext(int width_span, int depth, int height) { - if (lengthId > 1 && rand.nextInt(3) == 0 && yCoord >= minLevel) { - mapStructure(0, -depth, depth, StructureGenDSStairs.class); - } else { - tryPlaceHall(0, -depth, depth, direction); - } - } - - protected void tryPlaceHall(int x, int y, int z, int d) { - Class extension = getRandomExtension(); - if (extension != null) { - mapStructure(x, y, z, d, extension); - } - } - - protected int getHeight() { - return 4; - } - - protected int getDepthSpan() { - return 9; - } - - protected int getWidthSpan() { - return 3; - } - - protected Class getRandomExtension() { - if (rand.nextInt(20) == 0 && this.yCoord > 24) { - return StructureGenDSStairs.class; - } - if (lengthId == 1) { - return StructureGenDSRoom.class; - } - if (deviationCount > 0 && rand.nextInt(4) == 0) { - return StructureGenDSIntersection.class; - } - return StructureGenDSHall.class; - } - - protected Object[] getTrim(int radius, int depth, int x, int z) { - if (x == -radius || x == radius) { - return null; - } - - if (x == -(radius - 1) || x == (radius - 1)) { - if (z == Math.floor((float) depth / 2)) { - return new Object[] { BlockListMF.reinforced_stone_framed, false }; - } - return new Object[] { BlockListMF.reinforced_stone, false }; - } - return null; - } - - protected Object[] getCeiling(int radius, int depth, int x, int z) { - return x == 0 ? new Object[] { BlockListMF.reinforced_stone, false } - : new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - - protected Object[] getFloor(int radius, int depth, int x, int z) { - if (x >= -1 && x <= 1) { - if (z >= depth - 1) { - return new Object[] { BlockListMF.cobble_pavement, 0 }; - } - return new Object[] { BlockListMF.cobble_pavement_stair, Integer.valueOf(getStairDirection(reverse())) }; - } - if (x == -radius || x == radius || z == depth || z == 0) { - return new Object[] { BlockListMF.reinforced_stone, Integer.valueOf(0) }; - } - if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { - return new Object[] { BlockListMF.reinforced_stone, Integer.valueOf(0) }; - } - return new Object[] { BlockListMF.cobble_pavement, 0 }; - } - - protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) { - if (x != -radius && x != radius && z == 0) { - return new Object[] { Blocks.air, false }; - } - if (x == -radius || x == radius || z == depth) { - return y == height / 2 ? new Object[] { BlockListMF.reinforced_stone, "Hall" } - : new Object[] { BlockListMF.reinforced_stone_bricks, true }; - } - return new Object[] { Blocks.air, false }; - } - - protected String lootType = ChestGenHooks.DUNGEON_CHEST; - - public StructureModuleMF setLoot(String loot) { - this.lootType = loot; - return this; - } + /** + * The minimal height for a stairway to be created + */ + public static final int minLevel = 20; + protected String lootType = ChestGenHooks.DUNGEON_CHEST; + + public StructureGenDSStairs(World world, StructureCoordinates position) { + super(world, position); + } + + public StructureGenDSStairs(World world, int x, int y, int z, int direction) { + super(world, x, y, z, direction); + } + + @Override + public boolean canGenerate() { + if (lengthId == -100) { + return true; + } + + int width_span = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + int empty_spaces = 0; + int filledSpaces = 0, emptySpaces = 0; + for (int x = -width_span; x <= width_span; x++) { + for (int y = 0; y <= height; y++) { + for (int z = 1; z <= depth; z++) { + Block block = this.getBlock(x, y - z, z); + if (!allowBuildOverBlock(block) || this.isUnbreakable(x, y - z, z, direction)) { + return false; + } + if (!block.getMaterial().isSolid()) { + ++emptySpaces; + } else { + ++filledSpaces; + } + } + } + } + if (WorldGenDwarvenStronghold.debug_air) { + return true; + } + return ((float) emptySpaces / (float) (emptySpaces + filledSpaces)) < WorldGenDwarvenStronghold.maxAir;// at + // least + // 75% + // full + } + + private boolean allowBuildOverBlock(Block block) { + if (block == BlockListMF.reinforced_stone_bricks || block == BlockListMF.reinforced_stone) { + return false; + } + return true; + } + + @Override + public void generate() { + int width_span = getWidthSpan(); + int depth = getDepthSpan(); + int height = getHeight(); + for (int x = -width_span; x <= width_span; x++) { + for (int z = 0; z <= depth; z++) { + Object[] blockarray; + + // FLOOR + blockarray = getFloor(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Integer) blockarray[1]; + placeBlock((Block) blockarray[0], meta, x, -z - 1, z); + + placeBlock(BlockListMF.reinforced_stone_bricks, StructureGenAncientForge.getRandomMetadata(rand), x, + -z - 2, z); + + if (x == (width_span - 1) || x == -(width_span - 1)) { + placeBlock(BlockListMF.reinforced_stone, 0, x, -z, z); + } else { + placeBlock(Blocks.air, 0, x, -z, z); + } + } + // WALLS + for (int y = 0; y <= height + 1; y++) { + blockarray = getWalls(width_span, height, depth, x, y, z); + if (blockarray != null) { + int meta = 0; + if (blockarray[1] instanceof Integer) { + meta = (Integer) blockarray[1]; + } + if (blockarray[1] instanceof Boolean) { + meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + } + if (blockarray[1] instanceof String) { + meta = (String) blockarray[1] == "Hall" ? StructureGenDSHall.getRandomEngravedWall(rand) + : 0; + } + placeBlock((Block) blockarray[0], meta, x, y - z, z); + } + } + // CEILING + blockarray = getCeiling(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height + 1 - z, z); + } + + // TRIM + blockarray = getTrim(width_span, depth, x, z); + if (blockarray != null) { + int meta = (Boolean) blockarray[1] ? StructureGenAncientForge.getRandomMetadata(rand) : 0; + placeBlock((Block) blockarray[0], meta, x, height - z, z); + if ((Block) blockarray[0] == BlockListMF.reinforced_stone_framed) { + placeBlock(BlockListMF.reinforced_stone, 0, x, height - z, z); + placeBlock(BlockListMF.reinforced_stone_framed, 0, x, height - z - 1, z); + + for (int h = height - 1; h > 1; h--) { + placeBlock(BlockListMF.reinforced_stone, h == 2 ? 1 : 0, x, h - z - 1, z); + } + placeBlock(BlockListMF.reinforced_stone_framed, 0, x, -z, z); + } + } + + } + } + + // DOORWAY + buildDoorway(width_span, depth, height); + + if (lengthId == -100) { + this.lengthId = -99; + if ((yCoord > 64 && rand.nextInt(3) != 0) || (yCoord >= 56 && rand.nextInt(3) == 0)) { + mapStructure(0, -depth, depth, StructureGenDSStairs.class); + } else { + mapStructure(0, -depth, depth, StructureGenDSCrossroads.class); + } + } + ++lengthId;// Stairs don't count toward length + if (lengthId > 0) { + buildNext(width_span, depth, height); + } + } + + protected void buildDoorway(int width_span, int depth, int height) { + for (int x = -1; x <= 1; x++) { + for (int y = 1; y <= 3; y++) { + for (int z = 0; z >= -1; z--) { + placeBlock(Blocks.air, 0, x, y, z); + } + } + placeBlock(BlockListMF.cobble_pavement_stair, getStairDirection(reverse()), x, 0, -1); + } + } + + protected void buildNext(int width_span, int depth, int height) { + if (lengthId > 1 && rand.nextInt(3) == 0 && yCoord >= minLevel) { + mapStructure(0, -depth, depth, StructureGenDSStairs.class); + } else { + tryPlaceHall(0, -depth, depth, direction); + } + } + + protected void tryPlaceHall(int x, int y, int z, int d) { + Class extension = getRandomExtension(); + if (extension != null) { + mapStructure(x, y, z, d, extension); + } + } + + protected int getHeight() { + return 4; + } + + protected int getDepthSpan() { + return 9; + } + + protected int getWidthSpan() { + return 3; + } + + protected Class getRandomExtension() { + if (rand.nextInt(20) == 0 && this.yCoord > 24) { + return StructureGenDSStairs.class; + } + if (lengthId == 1) { + return StructureGenDSRoom.class; + } + if (deviationCount > 0 && rand.nextInt(4) == 0) { + return StructureGenDSIntersection.class; + } + return StructureGenDSHall.class; + } + + protected Object[] getTrim(int radius, int depth, int x, int z) { + if (x == -radius || x == radius) { + return null; + } + + if (x == -(radius - 1) || x == (radius - 1)) { + if (z == Math.floor((float) depth / 2)) { + return new Object[]{BlockListMF.reinforced_stone_framed, false}; + } + return new Object[]{BlockListMF.reinforced_stone, false}; + } + return null; + } + + protected Object[] getCeiling(int radius, int depth, int x, int z) { + return x == 0 ? new Object[]{BlockListMF.reinforced_stone, false} + : new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + + protected Object[] getFloor(int radius, int depth, int x, int z) { + if (x >= -1 && x <= 1) { + if (z >= depth - 1) { + return new Object[]{BlockListMF.cobble_pavement, 0}; + } + return new Object[]{BlockListMF.cobble_pavement_stair, Integer.valueOf(getStairDirection(reverse()))}; + } + if (x == -radius || x == radius || z == depth || z == 0) { + return new Object[]{BlockListMF.reinforced_stone, Integer.valueOf(0)}; + } + if (x == -(radius - 1) || x == (radius - 1) || z == (depth - 1) || z == 1) { + return new Object[]{BlockListMF.reinforced_stone, Integer.valueOf(0)}; + } + return new Object[]{BlockListMF.cobble_pavement, 0}; + } + + protected Object[] getWalls(int radius, int height, int depth, int x, int y, int z) { + if (x != -radius && x != radius && z == 0) { + return new Object[]{Blocks.air, false}; + } + if (x == -radius || x == radius || z == depth) { + return y == height / 2 ? new Object[]{BlockListMF.reinforced_stone, "Hall"} + : new Object[]{BlockListMF.reinforced_stone_bricks, true}; + } + return new Object[]{Blocks.air, false}; + } + + public StructureModuleMF setLoot(String loot) { + this.lootType = loot; + return this; + } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java index aa4da9c1..ca219250 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java @@ -6,71 +6,71 @@ import net.minecraft.world.World; public class WorldGenDwarvenStronghold extends WorldGenStructureBase { - /** - * Max percentage of air blocks allowed for structures to build - */ - public static float maxAir = 0.25F; - /** - * A debug method used to allow strongholds to generate in the air, for easy - * observation of shape and size. - */ - public static final boolean debug_air = false; - private boolean isSurfaceBuild = false; + /** + * A debug method used to allow strongholds to generate in the air, for easy + * observation of shape and size. + */ + public static final boolean debug_air = false; + /** + * Max percentage of air blocks allowed for structures to build + */ + public static float maxAir = 0.25F; + private boolean isSurfaceBuild = false; - public WorldGenDwarvenStronghold() { - } + public WorldGenDwarvenStronghold() { + } - public void setSurfaceMode(boolean flag) { - isSurfaceBuild = flag; - } + public void setSurfaceMode(boolean flag) { + isSurfaceBuild = flag; + } - @Override - protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) { - return new StructureGenDSEntry(world, x, y - 1, z, direction, isSurfaceBuild); - /* + @Override + protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) { + return new StructureGenDSEntry(world, x, y - 1, z, direction, isSurfaceBuild); + /* * if(startPiece == null) { startPiece = new StructureGenDSEntry(world, x, y-1, * z, direction, isSurfaceBuild); } startPiece.direction = direction; return * startPiece; * */ - } + } - @Override - protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) { - return isValidGround(world, x, y, z);// && world.canBlockSeeTheSky(x, y+2, z); - } + @Override + protected boolean isBlockAcceptableOrigin(World world, int x, int y, int z) { + return isValidGround(world, x, y, z);// && world.canBlockSeeTheSky(x, y+2, z); + } - @Override - protected boolean canStructureBuild(StructureModuleMF piece) { - if (debug_air || isSurfaceBuild) { - return true; - } - // SEARCH FOR CLIFF - for (int x = -3; x <= 3; x++) { - for (int y = 0; y < 5; y++) { - for (int z = 4; z <= 8; z++) { - int[] pos = piece.offsetPos(x, y, z, piece.direction); - Material material = piece.worldObj.getBlock(pos[0], pos[1], pos[2]).getMaterial(); + @Override + protected boolean canStructureBuild(StructureModuleMF piece) { + if (debug_air || isSurfaceBuild) { + return true; + } + // SEARCH FOR CLIFF + for (int x = -3; x <= 3; x++) { + for (int y = 0; y < 5; y++) { + for (int z = 4; z <= 8; z++) { + int[] pos = piece.offsetPos(x, y, z, piece.direction); + Material material = piece.worldObj.getBlock(pos[0], pos[1], pos[2]).getMaterial(); - if (!material.isOpaque()) { - return false; - } - if (!material.isSolid()) { - return false; - } - } - } - } - return true; - } + if (!material.isOpaque()) { + return false; + } + if (!material.isSolid()) { + return false; + } + } + } + } + return true; + } - @Override - protected boolean isDirectionRandom() { - return isSurfaceBuild; - } + @Override + protected boolean isDirectionRandom() { + return isSurfaceBuild; + } - @Override - protected int[] getYGenBounds(World world) { - return new int[] { 60, 255 }; - } + @Override + protected int[] getYGenBounds(World world) { + return new int[]{60, 255}; + } } diff --git a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java index c8c671f3..1a435471 100644 --- a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java @@ -1,10 +1,5 @@ package minefantasy.mf2.network; -import minefantasy.mf2.client.render.mob.*; -import net.minecraft.client.model.ModelHorse; -import net.minecraft.entity.passive.EntityHorse; -import org.lwjgl.input.Keyboard; - import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; @@ -12,107 +7,19 @@ import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.helpers.ClientTickHandler; import minefantasy.mf2.api.knowledge.InformationList; -import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; -import minefantasy.mf2.block.tileentity.TileEntityBellows; -import minefantasy.mf2.block.tileentity.TileEntityBigFurnace; -import minefantasy.mf2.block.tileentity.TileEntityBloomery; -import minefantasy.mf2.block.tileentity.TileEntityBombBench; -import minefantasy.mf2.block.tileentity.TileEntityBombPress; -import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; -import minefantasy.mf2.block.tileentity.TileEntityChimney; -import minefantasy.mf2.block.tileentity.TileEntityComponent; -import minefantasy.mf2.block.tileentity.TileEntityCrossbowBench; -import minefantasy.mf2.block.tileentity.TileEntityCrucible; -import minefantasy.mf2.block.tileentity.TileEntityFirepit; -import minefantasy.mf2.block.tileentity.TileEntityForge; -import minefantasy.mf2.block.tileentity.TileEntityQuern; -import minefantasy.mf2.block.tileentity.TileEntityResearch; -import minefantasy.mf2.block.tileentity.TileEntityRoast; -import minefantasy.mf2.block.tileentity.TileEntityTanningRack; +import minefantasy.mf2.block.tileentity.*; import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFH; import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; import minefantasy.mf2.block.tileentity.decor.TileEntityRack; import minefantasy.mf2.block.tileentity.decor.TileEntityTrough; import minefantasy.mf2.client.KnowledgePageRegistry; -import minefantasy.mf2.client.gui.GuiAnvilMF; -import minefantasy.mf2.client.gui.GuiBigFurnace; -import minefantasy.mf2.client.gui.GuiBlastChamber; -import minefantasy.mf2.client.gui.GuiBlastHeater; -import minefantasy.mf2.client.gui.GuiBloomery; -import minefantasy.mf2.client.gui.GuiBombBench; -import minefantasy.mf2.client.gui.GuiCarpenterMF; -import minefantasy.mf2.client.gui.GuiCrossbowBench; -import minefantasy.mf2.client.gui.GuiCrucible; -import minefantasy.mf2.client.gui.GuiForge; -import minefantasy.mf2.client.gui.GuiKnowledge; -import minefantasy.mf2.client.gui.GuiKnowledgeEntry; -import minefantasy.mf2.client.gui.GuiQuern; -import minefantasy.mf2.client.gui.GuiReload; -import minefantasy.mf2.client.gui.GuiResearchBlock; -import minefantasy.mf2.client.render.AnimationHandlerMF; -import minefantasy.mf2.client.render.HudHandlerMF; -import minefantasy.mf2.client.render.RenderArrowMF; -import minefantasy.mf2.client.render.RenderBombIcon; -import minefantasy.mf2.client.render.RenderBow; -import minefantasy.mf2.client.render.RenderCrossbow; -import minefantasy.mf2.client.render.RenderDragonBreath; -import minefantasy.mf2.client.render.RenderFireBlast; -import minefantasy.mf2.client.render.RenderHeavyWeapon; -import minefantasy.mf2.client.render.RenderLance; -import minefantasy.mf2.client.render.RenderMine; -import minefantasy.mf2.client.render.RenderParachute; -import minefantasy.mf2.client.render.RenderPowerArmour; -import minefantasy.mf2.client.render.RenderSaw; -import minefantasy.mf2.client.render.RenderShrapnel; -import minefantasy.mf2.client.render.RenderSpear; -import minefantasy.mf2.client.render.RenderSword; -import minefantasy.mf2.client.render.block.RenderAmmoBox; -import minefantasy.mf2.client.render.block.RenderAnvilMF; -import minefantasy.mf2.client.render.block.RenderBellows; -import minefantasy.mf2.client.render.block.RenderBigFurnace; -import minefantasy.mf2.client.render.block.RenderBloomery; -import minefantasy.mf2.client.render.block.RenderBombBench; -import minefantasy.mf2.client.render.block.RenderBombPress; -import minefantasy.mf2.client.render.block.RenderCarpenter; -import minefantasy.mf2.client.render.block.RenderCrossbowBench; -import minefantasy.mf2.client.render.block.RenderFirepit; -import minefantasy.mf2.client.render.block.RenderForge; -import minefantasy.mf2.client.render.block.RenderQuern; -import minefantasy.mf2.client.render.block.RenderRack; -import minefantasy.mf2.client.render.block.RenderResearch; -import minefantasy.mf2.client.render.block.RenderRoast; -import minefantasy.mf2.client.render.block.RenderSmokePipe; -import minefantasy.mf2.client.render.block.RenderTanningRack; -import minefantasy.mf2.client.render.block.RenderTrough; -import minefantasy.mf2.client.render.block.TileEntityAmmoBoxRenderer; -import minefantasy.mf2.client.render.block.TileEntityAnvilMFRenderer; -import minefantasy.mf2.client.render.block.TileEntityBellowsRenderer; -import minefantasy.mf2.client.render.block.TileEntityBigFurnaceRenderer; -import minefantasy.mf2.client.render.block.TileEntityBloomeryRenderer; -import minefantasy.mf2.client.render.block.TileEntityBombBenchRenderer; -import minefantasy.mf2.client.render.block.TileEntityBombPressRenderer; -import minefantasy.mf2.client.render.block.TileEntityCarpenterRenderer; -import minefantasy.mf2.client.render.block.TileEntityCrossbowBenchRenderer; -import minefantasy.mf2.client.render.block.TileEntityFirepitRenderer; -import minefantasy.mf2.client.render.block.TileEntityForgeRenderer; -import minefantasy.mf2.client.render.block.TileEntityQuernRenderer; -import minefantasy.mf2.client.render.block.TileEntityRackRenderer; -import minefantasy.mf2.client.render.block.TileEntityResearchRenderer; -import minefantasy.mf2.client.render.block.TileEntityRoastRenderer; -import minefantasy.mf2.client.render.block.TileEntitySmokePipeRenderer; -import minefantasy.mf2.client.render.block.TileEntityTanningRackRenderer; -import minefantasy.mf2.client.render.block.TileEntityTroughRenderer; +import minefantasy.mf2.client.gui.*; +import minefantasy.mf2.client.render.*; +import minefantasy.mf2.client.render.block.*; import minefantasy.mf2.client.render.block.component.TileEntityComponentRenderer; -import minefantasy.mf2.entity.EntityArrowMF; -import minefantasy.mf2.entity.EntityBomb; -import minefantasy.mf2.entity.EntityCogwork; -import minefantasy.mf2.entity.EntityDragonBreath; -import minefantasy.mf2.entity.EntityFireBlast; -import minefantasy.mf2.entity.EntityMine; -import minefantasy.mf2.entity.EntityParachute; -import minefantasy.mf2.entity.EntityShrapnel; -import minefantasy.mf2.entity.EntitySmoke; +import minefantasy.mf2.client.render.mob.*; +import minefantasy.mf2.entity.*; import minefantasy.mf2.entity.mob.EntityDragon; import minefantasy.mf2.entity.mob.EntityHound; import minefantasy.mf2.entity.mob.EntityMinotaur; @@ -123,258 +30,261 @@ import minefantasy.mf2.mechanics.ExtendedReachMF; import minefantasy.mf2.mechanics.PlayerTickHandlerMF; import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ModelHorse; import net.minecraft.entity.Entity; +import net.minecraft.entity.passive.EntityHorse; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.common.MinecraftForge; +import org.lwjgl.input.Keyboard; /** * @author Anonymous Productions */ public class ClientProxyMF extends CommonProxyMF { - @Override - public World getClientWorld() { - return FMLClientHandler.instance().getClient().theWorld; - } + /** + * Is the player trying to jump (assuming no screens are open) + */ + public static boolean isUserJumpCommand(Entity user) { + return Minecraft.getMinecraft().currentScreen == null && user == Minecraft.getMinecraft().thePlayer + && Keyboard.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindJump.getKeyCode()); + } - @Override - public void preInit() { - } + @Override + public World getClientWorld() { + return FMLClientHandler.instance().getClient().theWorld; + } - @Override - public void registerMain() { - super.registerMain(); - } + @Override + public void preInit() { + } - @Override - public void postInit() { - super.postInit(); - registerRenders(); - MineFantasyAPI.init(); - KnowledgePageRegistry.registerPages(); - } + @Override + public void registerMain() { + super.registerMain(); + } - @Override - public void registerTickHandlers() { - super.registerTickHandlers(); - FMLCommonHandler.instance().bus().register(new PlayerTickHandlerMF()); - FMLCommonHandler.instance().bus().register(new AnimationHandlerMF()); - FMLCommonHandler.instance().bus().register(new ExtendedReachMF()); - MinecraftForge.EVENT_BUS.register(new HudHandlerMF()); - FMLCommonHandler.instance().bus().register(new ClientTickHandler()); + @Override + public void postInit() { + super.postInit(); + registerRenders(); + MineFantasyAPI.init(); + KnowledgePageRegistry.registerPages(); + } - RenderingRegistry.registerBlockHandler(new RenderAnvilMF()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAnvilMF.class, new TileEntityAnvilMFRenderer()); - RenderingRegistry.registerBlockHandler(new RenderCarpenter()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCarpenterMF.class, new TileEntityCarpenterRenderer()); - RenderingRegistry.registerBlockHandler(new RenderBombBench()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBombBench.class, new TileEntityBombBenchRenderer()); - RenderingRegistry.registerBlockHandler(new RenderTanningRack()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTanningRack.class, new TileEntityTanningRackRenderer()); - RenderingRegistry.registerBlockHandler(new RenderForge()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityForge.class, new TileEntityForgeRenderer()); - RenderingRegistry.registerBlockHandler(new RenderBellows()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBellows.class, new TileEntityBellowsRenderer()); - RenderingRegistry.registerBlockHandler(new RenderResearch()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityResearch.class, new TileEntityResearchRenderer()); - RenderingRegistry.registerBlockHandler(new RenderTrough()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTrough.class, new TileEntityTroughRenderer()); - RenderingRegistry.registerBlockHandler(new RenderBombPress()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBombPress.class, new TileEntityBombPressRenderer()); - RenderingRegistry.registerBlockHandler(new RenderBloomery()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBloomery.class, new TileEntityBloomeryRenderer()); - RenderingRegistry.registerBlockHandler(new RenderCrossbowBench()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCrossbowBench.class, - new TileEntityCrossbowBenchRenderer()); - RenderingRegistry.registerBlockHandler(new RenderQuern()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityQuern.class, new TileEntityQuernRenderer()); - RenderingRegistry.registerBlockHandler(new RenderFirepit()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFirepit.class, new TileEntityFirepitRenderer()); - RenderingRegistry.registerBlockHandler(new RenderRoast()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRoast.class, new TileEntityRoastRenderer()); - RenderingRegistry.registerBlockHandler(new RenderBigFurnace()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBigFurnace.class, new TileEntityBigFurnaceRenderer()); - RenderingRegistry.registerBlockHandler(new RenderRack()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRack.class, new TileEntityRackRenderer()); - RenderingRegistry.registerBlockHandler(new RenderAmmoBox()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAmmoBox.class, new TileEntityAmmoBoxRenderer()); - RenderingRegistry.registerBlockHandler(new RenderSmokePipe()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityChimney.class, new TileEntitySmokePipeRenderer()); + @Override + public void registerTickHandlers() { + super.registerTickHandlers(); + FMLCommonHandler.instance().bus().register(new PlayerTickHandlerMF()); + FMLCommonHandler.instance().bus().register(new AnimationHandlerMF()); + FMLCommonHandler.instance().bus().register(new ExtendedReachMF()); + MinecraftForge.EVENT_BUS.register(new HudHandlerMF()); + FMLCommonHandler.instance().bus().register(new ClientTickHandler()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityComponent.class, new TileEntityComponentRenderer()); - } + RenderingRegistry.registerBlockHandler(new RenderAnvilMF()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAnvilMF.class, new TileEntityAnvilMFRenderer()); + RenderingRegistry.registerBlockHandler(new RenderCarpenter()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCarpenterMF.class, new TileEntityCarpenterRenderer()); + RenderingRegistry.registerBlockHandler(new RenderBombBench()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBombBench.class, new TileEntityBombBenchRenderer()); + RenderingRegistry.registerBlockHandler(new RenderTanningRack()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTanningRack.class, new TileEntityTanningRackRenderer()); + RenderingRegistry.registerBlockHandler(new RenderForge()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityForge.class, new TileEntityForgeRenderer()); + RenderingRegistry.registerBlockHandler(new RenderBellows()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBellows.class, new TileEntityBellowsRenderer()); + RenderingRegistry.registerBlockHandler(new RenderResearch()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityResearch.class, new TileEntityResearchRenderer()); + RenderingRegistry.registerBlockHandler(new RenderTrough()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTrough.class, new TileEntityTroughRenderer()); + RenderingRegistry.registerBlockHandler(new RenderBombPress()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBombPress.class, new TileEntityBombPressRenderer()); + RenderingRegistry.registerBlockHandler(new RenderBloomery()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBloomery.class, new TileEntityBloomeryRenderer()); + RenderingRegistry.registerBlockHandler(new RenderCrossbowBench()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCrossbowBench.class, + new TileEntityCrossbowBenchRenderer()); + RenderingRegistry.registerBlockHandler(new RenderQuern()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityQuern.class, new TileEntityQuernRenderer()); + RenderingRegistry.registerBlockHandler(new RenderFirepit()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFirepit.class, new TileEntityFirepitRenderer()); + RenderingRegistry.registerBlockHandler(new RenderRoast()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRoast.class, new TileEntityRoastRenderer()); + RenderingRegistry.registerBlockHandler(new RenderBigFurnace()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBigFurnace.class, new TileEntityBigFurnaceRenderer()); + RenderingRegistry.registerBlockHandler(new RenderRack()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRack.class, new TileEntityRackRenderer()); + RenderingRegistry.registerBlockHandler(new RenderAmmoBox()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAmmoBox.class, new TileEntityAmmoBoxRenderer()); + RenderingRegistry.registerBlockHandler(new RenderSmokePipe()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityChimney.class, new TileEntitySmokePipeRenderer()); - public void registerEntityRenderer() { - RenderingRegistry.registerEntityRenderingHandler(EntityArrowMF.class, new RenderArrowMF()); - RenderingRegistry.registerEntityRenderingHandler(EntityBomb.class, new RenderBombIcon());// Switch to RenderBomb - // when syncing is - // fixed - RenderingRegistry.registerEntityRenderingHandler(EntityMine.class, new RenderMine()); - RenderingRegistry.registerEntityRenderingHandler(EntityShrapnel.class, new RenderShrapnel("shrapnel")); - RenderingRegistry.registerEntityRenderingHandler(EntityFireBlast.class, new RenderFireBlast()); - RenderingRegistry.registerEntityRenderingHandler(EntitySmoke.class, new RenderFireBlast()); - RenderingRegistry.registerEntityRenderingHandler(EntityDragonBreath.class, new RenderDragonBreath()); - RenderingRegistry.registerEntityRenderingHandler(EntityParachute.class, new RenderParachute()); - RenderingRegistry.registerEntityRenderingHandler(EntityCogwork.class, new RenderPowerArmour()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityComponent.class, new TileEntityComponentRenderer()); + } - RenderingRegistry.registerEntityRenderingHandler(EntityDragon.class, new RenderDragon(2F)); - RenderingRegistry.registerEntityRenderingHandler(EntityMinotaur.class, - new RenderMinotaur(new ModelMinotaur(), 1.5F)); - RenderingRegistry.registerEntityRenderingHandler(EntityHound.class, new RenderHound(new ModelHound())); - RenderingRegistry.registerEntityRenderingHandler(EntityHorse.class, new RenderVanillaHorse(new ModelHorse(), 0.75F)); - } + public void registerEntityRenderer() { + RenderingRegistry.registerEntityRenderingHandler(EntityArrowMF.class, new RenderArrowMF()); + RenderingRegistry.registerEntityRenderingHandler(EntityBomb.class, new RenderBombIcon());// Switch to RenderBomb + // when syncing is + // fixed + RenderingRegistry.registerEntityRenderingHandler(EntityMine.class, new RenderMine()); + RenderingRegistry.registerEntityRenderingHandler(EntityShrapnel.class, new RenderShrapnel("shrapnel")); + RenderingRegistry.registerEntityRenderingHandler(EntityFireBlast.class, new RenderFireBlast()); + RenderingRegistry.registerEntityRenderingHandler(EntitySmoke.class, new RenderFireBlast()); + RenderingRegistry.registerEntityRenderingHandler(EntityDragonBreath.class, new RenderDragonBreath()); + RenderingRegistry.registerEntityRenderingHandler(EntityParachute.class, new RenderParachute()); + RenderingRegistry.registerEntityRenderingHandler(EntityCogwork.class, new RenderPowerArmour()); - @Override - public EntityPlayer getClientPlayer() { - return Minecraft.getMinecraft().thePlayer; - } + RenderingRegistry.registerEntityRenderingHandler(EntityDragon.class, new RenderDragon(2F)); + RenderingRegistry.registerEntityRenderingHandler(EntityMinotaur.class, + new RenderMinotaur(new ModelMinotaur(), 1.5F)); + RenderingRegistry.registerEntityRenderingHandler(EntityHound.class, new RenderHound(new ModelHound())); + RenderingRegistry.registerEntityRenderingHandler(EntityHorse.class, new RenderVanillaHorse(new ModelHorse(), 0.75F)); + } - @Override - public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { - Minecraft mc = Minecraft.getMinecraft(); - if (ID == 0) { - TileEntity tile = world.getTileEntity(x, y, z); - // int meta = world.getBlockMetadata(x, y, z); + @Override + public EntityPlayer getClientPlayer() { + return Minecraft.getMinecraft().thePlayer; + } - if (tile == null) { - return null; - } + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + Minecraft mc = Minecraft.getMinecraft(); + if (ID == 0) { + TileEntity tile = world.getTileEntity(x, y, z); + // int meta = world.getBlockMetadata(x, y, z); - if (tile instanceof TileEntityAnvilMF) { - return new GuiAnvilMF(player.inventory, (TileEntityAnvilMF) tile); - } - if (tile instanceof TileEntityCarpenterMF) { - return new GuiCarpenterMF(player.inventory, (TileEntityCarpenterMF) tile); - } - if (tile instanceof TileEntityBombBench) { - return new GuiBombBench(player.inventory, (TileEntityBombBench) tile); - } - if (tile instanceof TileEntityBlastFH) { - return new GuiBlastHeater(player.inventory, (TileEntityBlastFH) tile); - } - if (tile instanceof TileEntityBlastFC) { - return new GuiBlastChamber(player.inventory, (TileEntityBlastFC) tile); - } - if (tile instanceof TileEntityCrucible) { - return new GuiCrucible(player.inventory, (TileEntityCrucible) tile); - } - if (tile instanceof TileEntityForge) { - return new GuiForge(player.inventory, (TileEntityForge) tile); - } - if (tile instanceof TileEntityResearch) { - return new GuiResearchBlock(player.inventory, (TileEntityResearch) tile); - } - if (tile instanceof TileEntityBloomery) { - return new GuiBloomery(player.inventory, (TileEntityBloomery) tile); - } - if (tile instanceof TileEntityCrossbowBench) { - return new GuiCrossbowBench(player.inventory, (TileEntityCrossbowBench) tile); - } - if (tile instanceof TileEntityQuern) { - return new GuiQuern(player.inventory, (TileEntityQuern) tile); - } - if (tile instanceof TileEntityBigFurnace) { - return new GuiBigFurnace(player, (TileEntityBigFurnace) tile); - } - return null; - } - if (ID == 1) { - if (x == 0) {// GuiAchievements - if (y >= 0) { - return new GuiKnowledgeEntry(mc.currentScreen, InformationList.knowledgeList.get(y)); - } - return new GuiKnowledge(player); - } - if (x == 1 && player.getHeldItem() != null) { - return new GuiReload(player.inventory, player.getHeldItem()); - } - } - return null; - } + if (tile == null) { + return null; + } - private void registerRenders() { - registerEntityRenderer(); + if (tile instanceof TileEntityAnvilMF) { + return new GuiAnvilMF(player.inventory, (TileEntityAnvilMF) tile); + } + if (tile instanceof TileEntityCarpenterMF) { + return new GuiCarpenterMF(player.inventory, (TileEntityCarpenterMF) tile); + } + if (tile instanceof TileEntityBombBench) { + return new GuiBombBench(player.inventory, (TileEntityBombBench) tile); + } + if (tile instanceof TileEntityBlastFH) { + return new GuiBlastHeater(player.inventory, (TileEntityBlastFH) tile); + } + if (tile instanceof TileEntityBlastFC) { + return new GuiBlastChamber(player.inventory, (TileEntityBlastFC) tile); + } + if (tile instanceof TileEntityCrucible) { + return new GuiCrucible(player.inventory, (TileEntityCrucible) tile); + } + if (tile instanceof TileEntityForge) { + return new GuiForge(player.inventory, (TileEntityForge) tile); + } + if (tile instanceof TileEntityResearch) { + return new GuiResearchBlock(player.inventory, (TileEntityResearch) tile); + } + if (tile instanceof TileEntityBloomery) { + return new GuiBloomery(player.inventory, (TileEntityBloomery) tile); + } + if (tile instanceof TileEntityCrossbowBench) { + return new GuiCrossbowBench(player.inventory, (TileEntityCrossbowBench) tile); + } + if (tile instanceof TileEntityQuern) { + return new GuiQuern(player.inventory, (TileEntityQuern) tile); + } + if (tile instanceof TileEntityBigFurnace) { + return new GuiBigFurnace(player, (TileEntityBigFurnace) tile); + } + return null; + } + if (ID == 1) { + if (x == 0) {// GuiAchievements + if (y >= 0) { + return new GuiKnowledgeEntry(mc.currentScreen, InformationList.knowledgeList.get(y)); + } + return new GuiKnowledge(player); + } + if (x == 1 && player.getHeldItem() != null) { + return new GuiReload(player.inventory, player.getHeldItem()); + } + } + return null; + } - MinecraftForgeClient.registerItemRenderer(ToolListMF.swordStone, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(ToolListMF.maceStone, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(ToolListMF.waraxeStone, new RenderSword().setAxe()); - MinecraftForgeClient.registerItemRenderer(ToolListMF.spearStone, new RenderSpear()); - MinecraftForgeClient.registerItemRenderer(ToolListMF.swordTraining, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(ToolListMF.crossbow_custom, new RenderCrossbow(2.0F)); + private void registerRenders() { + registerEntityRenderer(); - // STANDARD - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_dagger, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_sword, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_waraxe, new RenderSword().setAxe()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_mace, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_scythe, new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_warhammer, - new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_battleaxe, - new RenderHeavyWeapon().setBlunt().setParryable()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_greatsword, - new RenderHeavyWeapon().setGreatsword().setParryable()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_katana, - new RenderHeavyWeapon().setKatana().setParryable()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_spear, new RenderSpear()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_halbeard, new RenderSpear(true)); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_lance, new RenderLance()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_lumber, new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_saw, new RenderSaw()); - MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_bow, new RenderBow(false)); - // DRAGONFORGED - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_dagger, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_sword, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_waraxe, new RenderSword().setAxe()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_mace, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_warhammer, - new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_battleaxe, - new RenderHeavyWeapon().setBlunt().setParryable()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_greatsword, - new RenderHeavyWeapon().setGreatsword().setParryable()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_katana, - new RenderHeavyWeapon().setKatana().setParryable()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_spear, new RenderSpear()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_halbeard, new RenderSpear(true)); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_lance, new RenderLance()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_scythe, - new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_lumber, - new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_saw, new RenderSaw()); - MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_bow, new RenderBow(false)); + MinecraftForgeClient.registerItemRenderer(ToolListMF.swordStone, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(ToolListMF.maceStone, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(ToolListMF.waraxeStone, new RenderSword().setAxe()); + MinecraftForgeClient.registerItemRenderer(ToolListMF.spearStone, new RenderSpear()); + MinecraftForgeClient.registerItemRenderer(ToolListMF.swordTraining, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(ToolListMF.crossbow_custom, new RenderCrossbow(2.0F)); - // ORNATE - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_dagger, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_sword, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_waraxe, new RenderSword().setAxe()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_mace, new RenderSword()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_warhammer, new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_battleaxe, - new RenderHeavyWeapon().setBlunt().setParryable()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_greatsword, - new RenderHeavyWeapon().setGreatsword().setParryable()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_katana, - new RenderHeavyWeapon().setKatana().setParryable()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_spear, new RenderSpear()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_halbeard, new RenderSpear(true)); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_lance, new RenderLance()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_scythe, new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_lumber, new RenderHeavyWeapon().setBlunt()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_saw, new RenderSaw()); - MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_bow, new RenderBow(false)); + // STANDARD + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_dagger, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_sword, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_waraxe, new RenderSword().setAxe()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_mace, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_scythe, new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_warhammer, + new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_battleaxe, + new RenderHeavyWeapon().setBlunt().setParryable()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_greatsword, + new RenderHeavyWeapon().setGreatsword().setParryable()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_katana, + new RenderHeavyWeapon().setKatana().setParryable()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_spear, new RenderSpear()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_halbeard, new RenderSpear(true)); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_lance, new RenderLance()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_lumber, new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_saw, new RenderSaw()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_bow, new RenderBow(false)); + // DRAGONFORGED + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_dagger, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_sword, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_waraxe, new RenderSword().setAxe()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_mace, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_warhammer, + new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_battleaxe, + new RenderHeavyWeapon().setBlunt().setParryable()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_greatsword, + new RenderHeavyWeapon().setGreatsword().setParryable()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_katana, + new RenderHeavyWeapon().setKatana().setParryable()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_spear, new RenderSpear()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_halbeard, new RenderSpear(true)); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_lance, new RenderLance()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_scythe, + new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_lumber, + new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_saw, new RenderSaw()); + MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_bow, new RenderBow(false)); - } + // ORNATE + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_dagger, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_sword, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_waraxe, new RenderSword().setAxe()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_mace, new RenderSword()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_warhammer, new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_battleaxe, + new RenderHeavyWeapon().setBlunt().setParryable()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_greatsword, + new RenderHeavyWeapon().setGreatsword().setParryable()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_katana, + new RenderHeavyWeapon().setKatana().setParryable()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_spear, new RenderSpear()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_halbeard, new RenderSpear(true)); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_lance, new RenderLance()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_scythe, new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_lumber, new RenderHeavyWeapon().setBlunt()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_saw, new RenderSaw()); + MinecraftForgeClient.registerItemRenderer(OrnateStyle.ornate_bow, new RenderBow(false)); - /** - * Is the player trying to jump (assuming no screens are open) - */ - public static boolean isUserJumpCommand(Entity user) { - return Minecraft.getMinecraft().currentScreen == null && user == Minecraft.getMinecraft().thePlayer - && Keyboard.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindJump.getKeyCode()); - } + } } diff --git a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java index 82462a7b..19c196d2 100644 --- a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.network; -import java.util.Random; - import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.registry.GameRegistry; @@ -9,53 +7,19 @@ import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.refine.ISmokeHandler; import minefantasy.mf2.api.refine.SmokeMechanics; -import minefantasy.mf2.block.tileentity.TileEntityAnvilMF; -import minefantasy.mf2.block.tileentity.TileEntityBellows; -import minefantasy.mf2.block.tileentity.TileEntityBigFurnace; -import minefantasy.mf2.block.tileentity.TileEntityBloomery; -import minefantasy.mf2.block.tileentity.TileEntityBombBench; -import minefantasy.mf2.block.tileentity.TileEntityBombPress; -import minefantasy.mf2.block.tileentity.TileEntityCarpenterMF; -import minefantasy.mf2.block.tileentity.TileEntityChimney; -import minefantasy.mf2.block.tileentity.TileEntityComponent; -import minefantasy.mf2.block.tileentity.TileEntityCrossbowBench; -import minefantasy.mf2.block.tileentity.TileEntityCrucible; -import minefantasy.mf2.block.tileentity.TileEntityFirepit; -import minefantasy.mf2.block.tileentity.TileEntityForge; -import minefantasy.mf2.block.tileentity.TileEntityQuern; -import minefantasy.mf2.block.tileentity.TileEntityResearch; -import minefantasy.mf2.block.tileentity.TileEntityRoad; -import minefantasy.mf2.block.tileentity.TileEntityRoast; -import minefantasy.mf2.block.tileentity.TileEntityTanningRack; -import minefantasy.mf2.block.tileentity.TileEntityWorldGenMarker; +import minefantasy.mf2.block.tileentity.*; import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFC; import minefantasy.mf2.block.tileentity.blastfurnace.TileEntityBlastFH; import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; import minefantasy.mf2.block.tileentity.decor.TileEntityRack; import minefantasy.mf2.block.tileentity.decor.TileEntityTrough; -import minefantasy.mf2.container.ContainerAnvilMF; -import minefantasy.mf2.container.ContainerBigFurnace; -import minefantasy.mf2.container.ContainerBlastChamber; -import minefantasy.mf2.container.ContainerBlastHeater; -import minefantasy.mf2.container.ContainerBloomery; -import minefantasy.mf2.container.ContainerBombBench; -import minefantasy.mf2.container.ContainerCarpenterMF; -import minefantasy.mf2.container.ContainerCrossbowBench; -import minefantasy.mf2.container.ContainerCrucible; -import minefantasy.mf2.container.ContainerForge; -import minefantasy.mf2.container.ContainerQuern; -import minefantasy.mf2.container.ContainerReload; -import minefantasy.mf2.container.ContainerResearch; +import minefantasy.mf2.container.*; import minefantasy.mf2.entity.EntitySmoke; import minefantasy.mf2.entity.list.EntityListMF; import minefantasy.mf2.hunger.HungerSystemMF; import minefantasy.mf2.item.archery.ArrowFireFlint; import minefantasy.mf2.item.archery.ArrowFirerMF; -import minefantasy.mf2.mechanics.ArrowHandlerMF; -import minefantasy.mf2.mechanics.CombatMechanics; -import minefantasy.mf2.mechanics.EventManagerMF; -import minefantasy.mf2.mechanics.MonsterUpgrader; -import minefantasy.mf2.mechanics.PlayerTickHandlerMF; +import minefantasy.mf2.mechanics.*; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -65,132 +29,132 @@ * @author Anonymous Productions */ public class CommonProxyMF implements IGuiHandler, ISmokeHandler { - @Override - public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { - return null; - } + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } - @Override - public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { - if (ID == 1 && x == 1 && player.getHeldItem() != null) { - return new ContainerReload(player.inventory, player.getHeldItem()); - } else if (ID == 0) { - TileEntity tile = world.getTileEntity(x, y, z); - // int meta = world.getBlockMetadata(x, y, z); - if (tile == null) { - return null; - } + @Override + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + if (ID == 1 && x == 1 && player.getHeldItem() != null) { + return new ContainerReload(player.inventory, player.getHeldItem()); + } else if (ID == 0) { + TileEntity tile = world.getTileEntity(x, y, z); + // int meta = world.getBlockMetadata(x, y, z); + if (tile == null) { + return null; + } - if (tile instanceof TileEntityAnvilMF) { - return new ContainerAnvilMF(player.inventory, (TileEntityAnvilMF) tile); - } - if (tile instanceof TileEntityCarpenterMF) { - return new ContainerCarpenterMF(player.inventory, (TileEntityCarpenterMF) tile); - } - if (tile instanceof TileEntityBombBench) { - return new ContainerBombBench(player.inventory, (TileEntityBombBench) tile); - } - if (tile instanceof TileEntityBlastFH) { - return new ContainerBlastHeater(player.inventory, (TileEntityBlastFH) tile); - } - if (tile instanceof TileEntityBlastFC) { - return new ContainerBlastChamber(player.inventory, (TileEntityBlastFC) tile); - } - if (tile instanceof TileEntityCrucible) { - return new ContainerCrucible(player.inventory, (TileEntityCrucible) tile); - } - if (tile instanceof TileEntityForge) { - return new ContainerForge(player.inventory, (TileEntityForge) tile); - } - if (tile instanceof TileEntityResearch) { - return new ContainerResearch(player.inventory, (TileEntityResearch) tile); - } - if (tile instanceof TileEntityBloomery) { - return new ContainerBloomery(player.inventory, (TileEntityBloomery) tile); - } - if (tile instanceof TileEntityCrossbowBench) { - return new ContainerCrossbowBench(player.inventory, (TileEntityCrossbowBench) tile); - } - if (tile instanceof TileEntityQuern) { - return new ContainerQuern(player.inventory, (TileEntityQuern) tile); - } - if (tile instanceof TileEntityBigFurnace) { - return new ContainerBigFurnace(player, (TileEntityBigFurnace) tile); - } - } - return null; - } + if (tile instanceof TileEntityAnvilMF) { + return new ContainerAnvilMF(player.inventory, (TileEntityAnvilMF) tile); + } + if (tile instanceof TileEntityCarpenterMF) { + return new ContainerCarpenterMF(player.inventory, (TileEntityCarpenterMF) tile); + } + if (tile instanceof TileEntityBombBench) { + return new ContainerBombBench(player.inventory, (TileEntityBombBench) tile); + } + if (tile instanceof TileEntityBlastFH) { + return new ContainerBlastHeater(player.inventory, (TileEntityBlastFH) tile); + } + if (tile instanceof TileEntityBlastFC) { + return new ContainerBlastChamber(player.inventory, (TileEntityBlastFC) tile); + } + if (tile instanceof TileEntityCrucible) { + return new ContainerCrucible(player.inventory, (TileEntityCrucible) tile); + } + if (tile instanceof TileEntityForge) { + return new ContainerForge(player.inventory, (TileEntityForge) tile); + } + if (tile instanceof TileEntityResearch) { + return new ContainerResearch(player.inventory, (TileEntityResearch) tile); + } + if (tile instanceof TileEntityBloomery) { + return new ContainerBloomery(player.inventory, (TileEntityBloomery) tile); + } + if (tile instanceof TileEntityCrossbowBench) { + return new ContainerCrossbowBench(player.inventory, (TileEntityCrossbowBench) tile); + } + if (tile instanceof TileEntityQuern) { + return new ContainerQuern(player.inventory, (TileEntityQuern) tile); + } + if (tile instanceof TileEntityBigFurnace) { + return new ContainerBigFurnace(player, (TileEntityBigFurnace) tile); + } + } + return null; + } - public World getClientWorld() { - return null; - } + public World getClientWorld() { + return null; + } - public void registerMain() { - AmmoMechanicsMF.addHandler(new ArrowFireFlint()); - AmmoMechanicsMF.addHandler(new ArrowFirerMF()); - registerTileEntities(); - SmokeMechanics.handler = this; - } + public void registerMain() { + AmmoMechanicsMF.addHandler(new ArrowFireFlint()); + AmmoMechanicsMF.addHandler(new ArrowFirerMF()); + registerTileEntities(); + SmokeMechanics.handler = this; + } - protected void registerTileEntities() { - GameRegistry.registerTileEntity(TileEntityAnvilMF.class, "MF_Anvil"); - GameRegistry.registerTileEntity(TileEntityCarpenterMF.class, "MF_CarpenterBench"); - GameRegistry.registerTileEntity(TileEntityBombBench.class, "MF_BombBench"); - GameRegistry.registerTileEntity(TileEntityCrossbowBench.class, "MF_CrossbowBench"); - GameRegistry.registerTileEntity(TileEntityBlastFC.class, "MF_BlastChamber"); - GameRegistry.registerTileEntity(TileEntityBlastFH.class, "MF_BlastHeater"); - GameRegistry.registerTileEntity(TileEntityCrucible.class, "MF_Crucible"); - GameRegistry.registerTileEntity(TileEntityChimney.class, "MF_Chimney"); - GameRegistry.registerTileEntity(TileEntityTanningRack.class, "MF_Tanner"); - GameRegistry.registerTileEntity(TileEntityForge.class, "MF_Forge"); - GameRegistry.registerTileEntity(TileEntityBellows.class, "MF_Bellows"); - GameRegistry.registerTileEntity(TileEntityResearch.class, "MF_Research"); - GameRegistry.registerTileEntity(TileEntityTrough.class, "MF_Trough"); - GameRegistry.registerTileEntity(TileEntityBombPress.class, "MF_BombPress"); - GameRegistry.registerTileEntity(TileEntityBloomery.class, "MF_Bloomery"); - GameRegistry.registerTileEntity(TileEntityQuern.class, "MF_Quern"); - GameRegistry.registerTileEntity(TileEntityFirepit.class, "MF_Firepit"); - GameRegistry.registerTileEntity(TileEntityRoast.class, "MF_SpitRoast"); - GameRegistry.registerTileEntity(TileEntityBigFurnace.class, "MF_BigFurnace"); - GameRegistry.registerTileEntity(TileEntityRack.class, "MF_Rack"); - GameRegistry.registerTileEntity(TileEntityAmmoBox.class, "MF_AmmoBox"); - GameRegistry.registerTileEntity(TileEntityWorldGenMarker.class, "MF_WorldGenFlag"); - GameRegistry.registerTileEntity(TileEntityComponent.class, "MF_ComponentTile"); - GameRegistry.registerTileEntity(TileEntityRoad.class, "MF_Road"); - } + protected void registerTileEntities() { + GameRegistry.registerTileEntity(TileEntityAnvilMF.class, "MF_Anvil"); + GameRegistry.registerTileEntity(TileEntityCarpenterMF.class, "MF_CarpenterBench"); + GameRegistry.registerTileEntity(TileEntityBombBench.class, "MF_BombBench"); + GameRegistry.registerTileEntity(TileEntityCrossbowBench.class, "MF_CrossbowBench"); + GameRegistry.registerTileEntity(TileEntityBlastFC.class, "MF_BlastChamber"); + GameRegistry.registerTileEntity(TileEntityBlastFH.class, "MF_BlastHeater"); + GameRegistry.registerTileEntity(TileEntityCrucible.class, "MF_Crucible"); + GameRegistry.registerTileEntity(TileEntityChimney.class, "MF_Chimney"); + GameRegistry.registerTileEntity(TileEntityTanningRack.class, "MF_Tanner"); + GameRegistry.registerTileEntity(TileEntityForge.class, "MF_Forge"); + GameRegistry.registerTileEntity(TileEntityBellows.class, "MF_Bellows"); + GameRegistry.registerTileEntity(TileEntityResearch.class, "MF_Research"); + GameRegistry.registerTileEntity(TileEntityTrough.class, "MF_Trough"); + GameRegistry.registerTileEntity(TileEntityBombPress.class, "MF_BombPress"); + GameRegistry.registerTileEntity(TileEntityBloomery.class, "MF_Bloomery"); + GameRegistry.registerTileEntity(TileEntityQuern.class, "MF_Quern"); + GameRegistry.registerTileEntity(TileEntityFirepit.class, "MF_Firepit"); + GameRegistry.registerTileEntity(TileEntityRoast.class, "MF_SpitRoast"); + GameRegistry.registerTileEntity(TileEntityBigFurnace.class, "MF_BigFurnace"); + GameRegistry.registerTileEntity(TileEntityRack.class, "MF_Rack"); + GameRegistry.registerTileEntity(TileEntityAmmoBox.class, "MF_AmmoBox"); + GameRegistry.registerTileEntity(TileEntityWorldGenMarker.class, "MF_WorldGenFlag"); + GameRegistry.registerTileEntity(TileEntityComponent.class, "MF_ComponentTile"); + GameRegistry.registerTileEntity(TileEntityRoad.class, "MF_Road"); + } - public void preInit() { - } + public void preInit() { + } - public void registerTickHandlers() { - FMLCommonHandler.instance().bus().register(new PlayerTickHandlerMF()); - FMLCommonHandler.instance().bus().register(new HungerSystemMF()); - MinecraftForge.EVENT_BUS.register(new EventManagerMF()); - MinecraftForge.EVENT_BUS.register(new CombatMechanics()); - MinecraftForge.EVENT_BUS.register(new MonsterUpgrader()); - MinecraftForge.EVENT_BUS.register(new ArrowHandlerMF()); - } + public void registerTickHandlers() { + FMLCommonHandler.instance().bus().register(new PlayerTickHandlerMF()); + FMLCommonHandler.instance().bus().register(new HungerSystemMF()); + MinecraftForge.EVENT_BUS.register(new EventManagerMF()); + MinecraftForge.EVENT_BUS.register(new CombatMechanics()); + MinecraftForge.EVENT_BUS.register(new MonsterUpgrader()); + MinecraftForge.EVENT_BUS.register(new ArrowHandlerMF()); + } - public EntityPlayer getClientPlayer() { - return null; - } + public EntityPlayer getClientPlayer() { + return null; + } - @Override - public void spawnSmoke(World world, double x, double y, double z, int value) { - for (int a = 0; a < value; a++) { - float sprayRange = 0.005F; - float sprayX = (MineFantasyII.random.nextFloat() * sprayRange) - (sprayRange / 2); - float sprayZ = (MineFantasyII.random.nextFloat() * sprayRange) - (sprayRange / 2); - float height = 0.001F; - if (MineFantasyII.random.nextInt(2) == 0) { - EntitySmoke smoke = new EntitySmoke(world, x, y - 0.5D, z, sprayX, height, sprayZ); - world.spawnEntityInWorld(smoke); - } - } - } + @Override + public void spawnSmoke(World world, double x, double y, double z, int value) { + for (int a = 0; a < value; a++) { + float sprayRange = 0.005F; + float sprayX = (MineFantasyII.random.nextFloat() * sprayRange) - (sprayRange / 2); + float sprayZ = (MineFantasyII.random.nextFloat() * sprayRange) - (sprayRange / 2); + float height = 0.001F; + if (MineFantasyII.random.nextInt(2) == 0) { + EntitySmoke smoke = new EntitySmoke(world, x, y - 0.5D, z, sprayX, height, sprayZ); + world.spawnEntityInWorld(smoke); + } + } + } - public void postInit() { - EntityListMF.register(); - } + public void postInit() { + EntityListMF.register(); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/network/NetworkUtils.java b/src/main/java/minefantasy/mf2/network/NetworkUtils.java index 242bef62..c0e73e78 100644 --- a/src/main/java/minefantasy/mf2/network/NetworkUtils.java +++ b/src/main/java/minefantasy/mf2/network/NetworkUtils.java @@ -9,7 +9,7 @@ /** * Here I used code in Railcraft. - * + *

* https://github.com/Railcraft/Railcraft/blob/mc-1.7.10/src/main/java/mods/railcraft/common/util/network/PacketDispatcher.java */ diff --git a/src/main/java/minefantasy/mf2/network/packet/AmmoBoxPacket.java b/src/main/java/minefantasy/mf2/network/packet/AmmoBoxPacket.java index 38741fb7..71d77f5b 100644 --- a/src/main/java/minefantasy/mf2/network/packet/AmmoBoxPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/AmmoBoxPacket.java @@ -8,45 +8,45 @@ import net.minecraft.tileentity.TileEntity; public class AmmoBoxPacket extends PacketMF { - public static final String packetName = "MF2_AmmoBoxPkt"; - private int[] coords = new int[3]; - private int stock; - private ItemStack ammo; - - public AmmoBoxPacket(TileEntityAmmoBox tile) { - this.coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - this.ammo = tile.ammo; - this.stock = tile.stock; - } - - public AmmoBoxPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - stock = packet.readInt(); - ammo = ByteBufUtils.readItemStack(packet); - - if (entity != null && entity instanceof TileEntityAmmoBox) { - TileEntityAmmoBox tile = (TileEntityAmmoBox) entity; - tile.ammo = this.ammo; - tile.stock = this.stock; - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeInt(stock); - ByteBufUtils.writeItemStack(packet, ammo); - } + public static final String packetName = "MF2_AmmoBoxPkt"; + private int[] coords = new int[3]; + private int stock; + private ItemStack ammo; + + public AmmoBoxPacket(TileEntityAmmoBox tile) { + this.coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + this.ammo = tile.ammo; + this.stock = tile.stock; + } + + public AmmoBoxPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + stock = packet.readInt(); + ammo = ByteBufUtils.readItemStack(packet); + + if (entity != null && entity instanceof TileEntityAmmoBox) { + TileEntityAmmoBox tile = (TileEntityAmmoBox) entity; + tile.ammo = this.ammo; + tile.stock = this.stock; + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeInt(stock); + ByteBufUtils.writeItemStack(packet, ammo); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/AnvilPacket.java b/src/main/java/minefantasy/mf2/network/packet/AnvilPacket.java index 2b49001d..43afa9d5 100644 --- a/src/main/java/minefantasy/mf2/network/packet/AnvilPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/AnvilPacket.java @@ -7,80 +7,80 @@ import net.minecraft.tileentity.TileEntity; public class AnvilPacket extends PacketMF { - public static final String packetName = "MF2_AnvilPacket"; - private int[] coords = new int[3]; - private String resultName; - private String toolNeeded; - private String research; - private float[] floats = new float[6]; - private int[] tiers = new int[2]; + public static final String packetName = "MF2_AnvilPacket"; + private int[] coords = new int[3]; + private String resultName; + private String toolNeeded; + private String research; + private float[] floats = new float[6]; + private int[] tiers = new int[2]; - public AnvilPacket(TileEntityAnvilMF tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - resultName = tile.getResultName(); - toolNeeded = tile.getToolNeeded(); - research = tile.getResearchNeeded(); - floats = new float[] { tile.progress, tile.progressMax, tile.qualityBalance, tile.thresholdPosition, - tile.leftHit, tile.rightHit }; - tiers = new int[] { tile.getToolTierNeeded(), tile.getAnvilTierNeeded() }; - if (floats[1] <= 0) { - floats[1] = 0; - } - } + public AnvilPacket(TileEntityAnvilMF tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + resultName = tile.getResultName(); + toolNeeded = tile.getToolNeeded(); + research = tile.getResearchNeeded(); + floats = new float[]{tile.progress, tile.progressMax, tile.qualityBalance, tile.thresholdPosition, + tile.leftHit, tile.rightHit}; + tiers = new int[]{tile.getToolTierNeeded(), tile.getAnvilTierNeeded()}; + if (floats[1] <= 0) { + floats[1] = 0; + } + } - public AnvilPacket() { - } + public AnvilPacket() { + } - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - if (entity != null && entity instanceof TileEntityAnvilMF) { - floats[0] = packet.readFloat(); - floats[1] = packet.readFloat(); - floats[2] = packet.readFloat(); - floats[3] = packet.readFloat(); - floats[4] = packet.readFloat(); - floats[5] = packet.readFloat(); - tiers[0] = packet.readInt(); - tiers[1] = packet.readInt(); - resultName = ByteBufUtils.readUTF8String(packet); - toolNeeded = ByteBufUtils.readUTF8String(packet); - research = ByteBufUtils.readUTF8String(packet); + if (entity != null && entity instanceof TileEntityAnvilMF) { + floats[0] = packet.readFloat(); + floats[1] = packet.readFloat(); + floats[2] = packet.readFloat(); + floats[3] = packet.readFloat(); + floats[4] = packet.readFloat(); + floats[5] = packet.readFloat(); + tiers[0] = packet.readInt(); + tiers[1] = packet.readInt(); + resultName = ByteBufUtils.readUTF8String(packet); + toolNeeded = ByteBufUtils.readUTF8String(packet); + research = ByteBufUtils.readUTF8String(packet); - TileEntityAnvilMF anvil = (TileEntityAnvilMF) entity; - anvil.resName = resultName; - anvil.setToolType(toolNeeded); - anvil.progress = floats[0]; - anvil.progressMax = floats[1]; - anvil.qualityBalance = floats[2]; - anvil.thresholdPosition = floats[3]; - anvil.leftHit = floats[4]; - anvil.rightHit = floats[5]; - anvil.setHammerUsed(tiers[0]); - anvil.setRequiredAnvil(tiers[1]); - anvil.setResearch(research); - } - } + TileEntityAnvilMF anvil = (TileEntityAnvilMF) entity; + anvil.resName = resultName; + anvil.setToolType(toolNeeded); + anvil.progress = floats[0]; + anvil.progressMax = floats[1]; + anvil.qualityBalance = floats[2]; + anvil.thresholdPosition = floats[3]; + anvil.leftHit = floats[4]; + anvil.rightHit = floats[5]; + anvil.setHammerUsed(tiers[0]); + anvil.setRequiredAnvil(tiers[1]); + anvil.setResearch(research); + } + } - @Override - public String getChannel() { - return packetName; - } + @Override + public String getChannel() { + return packetName; + } - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - for (int a = 0; a < floats.length; a++) { - packet.writeFloat(floats[a]); - } - packet.writeInt(tiers[0]); - packet.writeInt(tiers[1]); - ByteBufUtils.writeUTF8String(packet, resultName); - ByteBufUtils.writeUTF8String(packet, toolNeeded); - ByteBufUtils.writeUTF8String(packet, research); - } + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + for (int a = 0; a < floats.length; a++) { + packet.writeFloat(floats[a]); + } + packet.writeInt(tiers[0]); + packet.writeInt(tiers[1]); + ByteBufUtils.writeUTF8String(packet, resultName); + ByteBufUtils.writeUTF8String(packet, toolNeeded); + ByteBufUtils.writeUTF8String(packet, research); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/BigFurnacePacket.java b/src/main/java/minefantasy/mf2/network/packet/BigFurnacePacket.java index 9a43369a..e62954f3 100644 --- a/src/main/java/minefantasy/mf2/network/packet/BigFurnacePacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/BigFurnacePacket.java @@ -6,66 +6,66 @@ import net.minecraft.tileentity.TileEntity; public class BigFurnacePacket extends PacketMF { - public static final String packetName = "MF2_BigfurnPkt"; - private int[] coords = new int[3]; - private int fuel, progress, burn, doorAngle; + public static final String packetName = "MF2_BigfurnPkt"; + private int[] coords = new int[3]; + private int fuel, progress, burn, doorAngle; - public BigFurnacePacket(TileEntityBigFurnace tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - fuel = tile.fuel; - progress = tile.progress; - // heat = (int)tile.heat; - burn = tile.isBurning() ? 1 : 0; - // justShared = tile.justShared; - doorAngle = tile.doorAngle; - } + public BigFurnacePacket(TileEntityBigFurnace tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + fuel = tile.fuel; + progress = tile.progress; + // heat = (int)tile.heat; + burn = tile.isBurning() ? 1 : 0; + // justShared = tile.justShared; + doorAngle = tile.doorAngle; + } - public BigFurnacePacket() { - } + public BigFurnacePacket() { + } - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; - fuel = packet.readInt(); - progress = packet.readInt(); - // heat = packet.readInt(); - burn = packet.readInt(); - // justShared = packet.readInt(); - doorAngle = packet.readInt(); + fuel = packet.readInt(); + progress = packet.readInt(); + // heat = packet.readInt(); + burn = packet.readInt(); + // justShared = packet.readInt(); + doorAngle = packet.readInt(); - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - if (entity != null && entity instanceof TileEntityBigFurnace) { - TileEntityBigFurnace tile = (TileEntityBigFurnace) entity; + if (entity != null && entity instanceof TileEntityBigFurnace) { + TileEntityBigFurnace tile = (TileEntityBigFurnace) entity; - tile.fuel = fuel; - tile.progress = progress; - // tile.heat = heat; - // tile.justShared = justShared; - tile.doorAngle = doorAngle; + tile.fuel = fuel; + tile.progress = progress; + // tile.heat = heat; + // tile.justShared = justShared; + tile.doorAngle = doorAngle; - if (tile.getWorldObj().isRemote) { - tile.isBurningClient = (burn == 1); - } - } - } + if (tile.getWorldObj().isRemote) { + tile.isBurningClient = (burn == 1); + } + } + } - @Override - public String getChannel() { - return packetName; - } + @Override + public String getChannel() { + return packetName; + } - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeInt(fuel); - packet.writeInt(progress); - // packet.writeInt(heat); - packet.writeInt(burn); - // packet.writeInt(justShared); - packet.writeInt(doorAngle); - } + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeInt(fuel); + packet.writeInt(progress); + // packet.writeInt(heat); + packet.writeInt(burn); + // packet.writeInt(justShared); + packet.writeInt(doorAngle); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/BloomeryPacket.java b/src/main/java/minefantasy/mf2/network/packet/BloomeryPacket.java index cf678685..0ccc2b9b 100644 --- a/src/main/java/minefantasy/mf2/network/packet/BloomeryPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/BloomeryPacket.java @@ -6,45 +6,45 @@ import net.minecraft.tileentity.TileEntity; public class BloomeryPacket extends PacketMF { - public static final String packetName = "MF2_BloomeryPacket"; - private int[] coords = new int[3]; - private boolean renderBloom, isActive; - - public BloomeryPacket(TileEntityBloomery tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - renderBloom = tile.hasBloom(); - isActive = tile.isActive; - } - - public BloomeryPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - renderBloom = packet.readBoolean(); - isActive = packet.readBoolean(); - - if (entity != null && entity instanceof TileEntityBloomery) { - TileEntityBloomery tile = (TileEntityBloomery) entity; - tile.hasBloom = renderBloom; - tile.isActive = isActive; - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeBoolean(renderBloom); - packet.writeBoolean(isActive); - } + public static final String packetName = "MF2_BloomeryPacket"; + private int[] coords = new int[3]; + private boolean renderBloom, isActive; + + public BloomeryPacket(TileEntityBloomery tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + renderBloom = tile.hasBloom(); + isActive = tile.isActive; + } + + public BloomeryPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + renderBloom = packet.readBoolean(); + isActive = packet.readBoolean(); + + if (entity != null && entity instanceof TileEntityBloomery) { + TileEntityBloomery tile = (TileEntityBloomery) entity; + tile.hasBloom = renderBloom; + tile.isActive = isActive; + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeBoolean(renderBloom); + packet.writeBoolean(isActive); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/BombBenchPacket.java b/src/main/java/minefantasy/mf2/network/packet/BombBenchPacket.java index ce28840a..851a86d5 100644 --- a/src/main/java/minefantasy/mf2/network/packet/BombBenchPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/BombBenchPacket.java @@ -6,50 +6,50 @@ import net.minecraft.tileentity.TileEntity; public class BombBenchPacket extends PacketMF { - public static final String packetName = "MF2_BombBenchPkt"; - private int[] coords = new int[3]; - private float progress; - private float maxProgress; - private boolean hasRecipe; - - public BombBenchPacket(TileEntityBombBench tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - progress = tile.progress; - maxProgress = tile.maxProgress; - hasRecipe = tile.hasRecipe; - } - - public BombBenchPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - float newProgress = packet.readFloat(); - float newMaxProgress = packet.readFloat(); - boolean newRecipe = packet.readBoolean(); - - if (entity != null && entity instanceof TileEntityBombBench) { - TileEntityBombBench tile = (TileEntityBombBench) entity; - tile.progress = newProgress; - tile.maxProgress = newMaxProgress; - tile.hasRecipe = newRecipe; - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeFloat(progress); - packet.writeFloat(maxProgress); - packet.writeBoolean(hasRecipe); - } + public static final String packetName = "MF2_BombBenchPkt"; + private int[] coords = new int[3]; + private float progress; + private float maxProgress; + private boolean hasRecipe; + + public BombBenchPacket(TileEntityBombBench tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + progress = tile.progress; + maxProgress = tile.maxProgress; + hasRecipe = tile.hasRecipe; + } + + public BombBenchPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + float newProgress = packet.readFloat(); + float newMaxProgress = packet.readFloat(); + boolean newRecipe = packet.readBoolean(); + + if (entity != null && entity instanceof TileEntityBombBench) { + TileEntityBombBench tile = (TileEntityBombBench) entity; + tile.progress = newProgress; + tile.maxProgress = newMaxProgress; + tile.hasRecipe = newRecipe; + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeFloat(progress); + packet.writeFloat(maxProgress); + packet.writeBoolean(hasRecipe); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/CarpenterPacket.java b/src/main/java/minefantasy/mf2/network/packet/CarpenterPacket.java index d6cb361b..05e34796 100644 --- a/src/main/java/minefantasy/mf2/network/packet/CarpenterPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/CarpenterPacket.java @@ -7,70 +7,70 @@ import net.minecraft.tileentity.TileEntity; public class CarpenterPacket extends PacketMF { - public static final String packetName = "MF2_CarpenterPacket"; - private int[] coords = new int[3]; - private String resultName; - private String toolNeeded; - private float[] progress = new float[2]; - private int[] tiers = new int[2]; - private String research; + public static final String packetName = "MF2_CarpenterPacket"; + private int[] coords = new int[3]; + private String resultName; + private String toolNeeded; + private float[] progress = new float[2]; + private int[] tiers = new int[2]; + private String research; - public CarpenterPacket(TileEntityCarpenterMF tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - resultName = tile.getResultName(); - toolNeeded = tile.getToolNeeded(); - progress = new float[] { tile.progress, tile.progressMax }; - tiers = new int[] { tile.getToolTierNeeded(), tile.getCarpenterTierNeeded() }; - if (progress[1] <= 0) { - progress[1] = 0; - } - research = tile.getResearchNeeded(); - } + public CarpenterPacket(TileEntityCarpenterMF tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + resultName = tile.getResultName(); + toolNeeded = tile.getToolNeeded(); + progress = new float[]{tile.progress, tile.progressMax}; + tiers = new int[]{tile.getToolTierNeeded(), tile.getCarpenterTierNeeded()}; + if (progress[1] <= 0) { + progress[1] = 0; + } + research = tile.getResearchNeeded(); + } - public CarpenterPacket() { - } + public CarpenterPacket() { + } - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - if (entity != null && entity instanceof TileEntityCarpenterMF) { - progress[0] = packet.readFloat(); - progress[1] = packet.readFloat(); - tiers[0] = packet.readInt(); - tiers[1] = packet.readInt(); - resultName = ByteBufUtils.readUTF8String(packet); - toolNeeded = ByteBufUtils.readUTF8String(packet); - research = ByteBufUtils.readUTF8String(packet); + if (entity != null && entity instanceof TileEntityCarpenterMF) { + progress[0] = packet.readFloat(); + progress[1] = packet.readFloat(); + tiers[0] = packet.readInt(); + tiers[1] = packet.readInt(); + resultName = ByteBufUtils.readUTF8String(packet); + toolNeeded = ByteBufUtils.readUTF8String(packet); + research = ByteBufUtils.readUTF8String(packet); - TileEntityCarpenterMF carpenter = (TileEntityCarpenterMF) entity; - carpenter.resName = resultName; - carpenter.setToolType(toolNeeded); - carpenter.setResearch(research); - carpenter.progress = progress[0]; - carpenter.progressMax = progress[1]; - carpenter.setToolTier(tiers[0]); - carpenter.setRequiredCarpenter(tiers[1]); - } - } + TileEntityCarpenterMF carpenter = (TileEntityCarpenterMF) entity; + carpenter.resName = resultName; + carpenter.setToolType(toolNeeded); + carpenter.setResearch(research); + carpenter.progress = progress[0]; + carpenter.progressMax = progress[1]; + carpenter.setToolTier(tiers[0]); + carpenter.setRequiredCarpenter(tiers[1]); + } + } - @Override - public String getChannel() { - return packetName; - } + @Override + public String getChannel() { + return packetName; + } - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeFloat(progress[0]); - packet.writeFloat(progress[1]); - packet.writeInt(tiers[0]); - packet.writeInt(tiers[1]); - ByteBufUtils.writeUTF8String(packet, resultName); - ByteBufUtils.writeUTF8String(packet, toolNeeded); - ByteBufUtils.writeUTF8String(packet, research); - } + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeFloat(progress[0]); + packet.writeFloat(progress[1]); + packet.writeInt(tiers[0]); + packet.writeInt(tiers[1]); + ByteBufUtils.writeUTF8String(packet, resultName); + ByteBufUtils.writeUTF8String(packet, toolNeeded); + ByteBufUtils.writeUTF8String(packet, research); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/ChimneyPacket.java b/src/main/java/minefantasy/mf2/network/packet/ChimneyPacket.java index 7612136f..98b3dd27 100644 --- a/src/main/java/minefantasy/mf2/network/packet/ChimneyPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/ChimneyPacket.java @@ -7,44 +7,44 @@ import net.minecraft.tileentity.TileEntity; public class ChimneyPacket extends PacketMF { - public static final String packetName = "MF2_ChimneyPacket"; - private int[] coords = new int[3]; - private int block, meta; - - public ChimneyPacket(TileEntityChimney tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - block = Block.getIdFromBlock(tile.maskBlock); - meta = tile.blockMetadata; - } - - public ChimneyPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - - if (entity != null && entity instanceof TileEntityChimney) { - TileEntityChimney tile = (TileEntityChimney) entity; - - int blockID = packet.readInt(); - int blockMetadata = packet.readInt(); - tile.setBlock(blockID, blockMetadata); - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeInt(block); - packet.writeInt(meta); - } + public static final String packetName = "MF2_ChimneyPacket"; + private int[] coords = new int[3]; + private int block, meta; + + public ChimneyPacket(TileEntityChimney tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + block = Block.getIdFromBlock(tile.maskBlock); + meta = tile.blockMetadata; + } + + public ChimneyPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + + if (entity != null && entity instanceof TileEntityChimney) { + TileEntityChimney tile = (TileEntityChimney) entity; + + int blockID = packet.readInt(); + int blockMetadata = packet.readInt(); + tile.setBlock(blockID, blockMetadata); + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeInt(block); + packet.writeInt(meta); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/CogworkControlPacket.java b/src/main/java/minefantasy/mf2/network/packet/CogworkControlPacket.java index a4adbde3..aec41f03 100644 --- a/src/main/java/minefantasy/mf2/network/packet/CogworkControlPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/CogworkControlPacket.java @@ -6,47 +6,47 @@ import net.minecraft.entity.player.EntityPlayer; public class CogworkControlPacket extends PacketMF { - public static final String packetName = "MF2_CogworkCtrl"; - private EntityCogwork suit; - private float forward, strafe; - private boolean isJumping; - - public CogworkControlPacket(EntityCogwork suit) { - this.suit = suit; - this.forward = suit.getMoveForward(); - this.strafe = suit.getMoveStrafe(); - this.isJumping = suit.getJumpControl(); - } - - public CogworkControlPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - int id = packet.readInt(); - forward = packet.readFloat(); - strafe = packet.readFloat(); - isJumping = packet.readBoolean(); - Entity entity = player.worldObj.getEntityByID(id); - - if (entity != null && entity instanceof EntityCogwork) { - suit = (EntityCogwork) entity; - suit.setMoveForward(forward); - suit.setMoveStrafe(strafe); - suit.setJumpControl(isJumping); - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - packet.writeInt(suit.getEntityId()); - packet.writeFloat(forward); - packet.writeFloat(strafe); - packet.writeBoolean(isJumping); - } + public static final String packetName = "MF2_CogworkCtrl"; + private EntityCogwork suit; + private float forward, strafe; + private boolean isJumping; + + public CogworkControlPacket(EntityCogwork suit) { + this.suit = suit; + this.forward = suit.getMoveForward(); + this.strafe = suit.getMoveStrafe(); + this.isJumping = suit.getJumpControl(); + } + + public CogworkControlPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + int id = packet.readInt(); + forward = packet.readFloat(); + strafe = packet.readFloat(); + isJumping = packet.readBoolean(); + Entity entity = player.worldObj.getEntityByID(id); + + if (entity != null && entity instanceof EntityCogwork) { + suit = (EntityCogwork) entity; + suit.setMoveForward(forward); + suit.setMoveStrafe(strafe); + suit.setJumpControl(isJumping); + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + packet.writeInt(suit.getEntityId()); + packet.writeFloat(forward); + packet.writeFloat(strafe); + packet.writeBoolean(isJumping); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/CrossbowBenchPacket.java b/src/main/java/minefantasy/mf2/network/packet/CrossbowBenchPacket.java index d5346798..dbe86168 100644 --- a/src/main/java/minefantasy/mf2/network/packet/CrossbowBenchPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/CrossbowBenchPacket.java @@ -6,50 +6,50 @@ import net.minecraft.tileentity.TileEntity; public class CrossbowBenchPacket extends PacketMF { - public static final String packetName = "MF2_CrossbowBenchPkt"; - private int[] coords = new int[3]; - private float progress; - private float maxProgress; - private boolean hasRecipe; - - public CrossbowBenchPacket(TileEntityCrossbowBench tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - progress = tile.progress; - maxProgress = tile.maxProgress; - hasRecipe = tile.hasRecipe; - } - - public CrossbowBenchPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - float newProgress = packet.readFloat(); - float newMaxProgress = packet.readFloat(); - boolean newRecipe = packet.readBoolean(); - - if (entity != null && entity instanceof TileEntityCrossbowBench) { - TileEntityCrossbowBench tile = (TileEntityCrossbowBench) entity; - tile.progress = newProgress; - tile.maxProgress = newMaxProgress; - tile.hasRecipe = newRecipe; - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeFloat(progress); - packet.writeFloat(maxProgress); - packet.writeBoolean(hasRecipe); - } + public static final String packetName = "MF2_CrossbowBenchPkt"; + private int[] coords = new int[3]; + private float progress; + private float maxProgress; + private boolean hasRecipe; + + public CrossbowBenchPacket(TileEntityCrossbowBench tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + progress = tile.progress; + maxProgress = tile.maxProgress; + hasRecipe = tile.hasRecipe; + } + + public CrossbowBenchPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + float newProgress = packet.readFloat(); + float newMaxProgress = packet.readFloat(); + boolean newRecipe = packet.readBoolean(); + + if (entity != null && entity instanceof TileEntityCrossbowBench) { + TileEntityCrossbowBench tile = (TileEntityCrossbowBench) entity; + tile.progress = newProgress; + tile.maxProgress = newMaxProgress; + tile.hasRecipe = newRecipe; + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeFloat(progress); + packet.writeFloat(maxProgress); + packet.writeBoolean(hasRecipe); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/DodgeCommand.java b/src/main/java/minefantasy/mf2/network/packet/DodgeCommand.java index db6e54bc..b988ee19 100644 --- a/src/main/java/minefantasy/mf2/network/packet/DodgeCommand.java +++ b/src/main/java/minefantasy/mf2/network/packet/DodgeCommand.java @@ -6,38 +6,38 @@ import net.minecraft.entity.player.EntityPlayer; public class DodgeCommand extends PacketMF { - public static final String packetName = "MF2_Command_Dodge"; - private EntityPlayer user; - private int ID; - private String username; - - public DodgeCommand(EntityPlayer user, int id) { - this.ID = id; - this.username = user.getCommandSenderName(); - this.user = user; - } - - public DodgeCommand() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - ID = packet.readInt(); - username = ByteBufUtils.readUTF8String(packet); - - if (username != null && player.getCommandSenderName().equals(username)) { - CombatMechanics.initDodge(player, ID); - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - packet.writeInt(ID); - ByteBufUtils.writeUTF8String(packet, username); - } + public static final String packetName = "MF2_Command_Dodge"; + private EntityPlayer user; + private int ID; + private String username; + + public DodgeCommand(EntityPlayer user, int id) { + this.ID = id; + this.username = user.getCommandSenderName(); + this.user = user; + } + + public DodgeCommand() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + ID = packet.readInt(); + username = ByteBufUtils.readUTF8String(packet); + + if (username != null && player.getCommandSenderName().equals(username)) { + CombatMechanics.initDodge(player, ID); + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + packet.writeInt(ID); + ByteBufUtils.writeUTF8String(packet, username); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/ForgePacket.java b/src/main/java/minefantasy/mf2/network/packet/ForgePacket.java index 105b7748..3d8e5910 100644 --- a/src/main/java/minefantasy/mf2/network/packet/ForgePacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/ForgePacket.java @@ -6,63 +6,63 @@ import net.minecraft.tileentity.TileEntity; public class ForgePacket extends PacketMF { - public static final String packetName = "MF2_ForgePacket"; - private int[] coords = new int[3]; - private float[] fuels = new float[2]; - private float[] temps = new float[3]; - private int workableState; + public static final String packetName = "MF2_ForgePacket"; + private int[] coords = new int[3]; + private float[] fuels = new float[2]; + private float[] temps = new float[3]; + private int workableState; - public ForgePacket(TileEntityForge tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - fuels = new float[] { tile.fuel, tile.maxFuel }; - if (fuels[0] > fuels[1]) { - fuels[0] = fuels[1]; - } - temps = new float[] { tile.temperature, tile.fuelTemperature, tile.getHeat() }; - workableState = tile.getWorkableState(); - } + public ForgePacket(TileEntityForge tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + fuels = new float[]{tile.fuel, tile.maxFuel}; + if (fuels[0] > fuels[1]) { + fuels[0] = fuels[1]; + } + temps = new float[]{tile.temperature, tile.fuelTemperature, tile.getHeat()}; + workableState = tile.getWorkableState(); + } - public ForgePacket() { - } + public ForgePacket() { + } - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - fuels[0] = packet.readFloat(); - fuels[1] = packet.readFloat(); - temps[0] = packet.readFloat(); - temps[1] = packet.readFloat(); - temps[2] = packet.readFloat(); - workableState = packet.readInt(); + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + fuels[0] = packet.readFloat(); + fuels[1] = packet.readFloat(); + temps[0] = packet.readFloat(); + temps[1] = packet.readFloat(); + temps[2] = packet.readFloat(); + workableState = packet.readInt(); - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - if (entity != null && entity instanceof TileEntityForge) { - TileEntityForge tile = (TileEntityForge) entity; - tile.fuel = fuels[0]; - tile.maxFuel = fuels[1]; - tile.temperature = temps[0]; - tile.fuelTemperature = temps[1]; - tile.exactTemperature = (int) temps[2]; - tile.workableState = workableState; - } - } + if (entity != null && entity instanceof TileEntityForge) { + TileEntityForge tile = (TileEntityForge) entity; + tile.fuel = fuels[0]; + tile.maxFuel = fuels[1]; + tile.temperature = temps[0]; + tile.fuelTemperature = temps[1]; + tile.exactTemperature = (int) temps[2]; + tile.workableState = workableState; + } + } - @Override - public String getChannel() { - return packetName; - } + @Override + public String getChannel() { + return packetName; + } - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeFloat(fuels[0]); - packet.writeFloat(fuels[1]); - packet.writeFloat(temps[0]); - packet.writeFloat(temps[1]); - packet.writeFloat(temps[2]); - packet.writeInt(workableState); - } + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeFloat(fuels[0]); + packet.writeFloat(fuels[1]); + packet.writeFloat(temps[0]); + packet.writeFloat(temps[1]); + packet.writeFloat(temps[2]); + packet.writeInt(workableState); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/HitSoundPacket.java b/src/main/java/minefantasy/mf2/network/packet/HitSoundPacket.java index b895b5b0..d595e917 100644 --- a/src/main/java/minefantasy/mf2/network/packet/HitSoundPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/HitSoundPacket.java @@ -7,38 +7,38 @@ import net.minecraft.entity.player.EntityPlayer; public class HitSoundPacket extends PacketMF { - public static final String packetName = "MF2_Hitsound"; - private String sound; - private int entId; + public static final String packetName = "MF2_Hitsound"; + private String sound; + private int entId; - public HitSoundPacket(String sound, Entity hit) { - this.sound = sound; - this.entId = hit.getEntityId(); - } + public HitSoundPacket(String sound, Entity hit) { + this.sound = sound; + this.entId = hit.getEntityId(); + } - public HitSoundPacket() { - } + public HitSoundPacket() { + } - @Override - public void process(ByteBuf packet, EntityPlayer player) { - entId = packet.readInt(); - sound = ByteBufUtils.readUTF8String(packet); - Entity entity = player.worldObj.getEntityByID(entId); - if (entity != null) { - if (ConfigClient.playHitsound) { - entity.worldObj.playSound(entity.posX, entity.posY, entity.posZ, sound, 1.0F, 1.0F, false); - } - } - } + @Override + public void process(ByteBuf packet, EntityPlayer player) { + entId = packet.readInt(); + sound = ByteBufUtils.readUTF8String(packet); + Entity entity = player.worldObj.getEntityByID(entId); + if (entity != null) { + if (ConfigClient.playHitsound) { + entity.worldObj.playSound(entity.posX, entity.posY, entity.posZ, sound, 1.0F, 1.0F, false); + } + } + } - @Override - public String getChannel() { - return packetName; - } + @Override + public String getChannel() { + return packetName; + } - @Override - public void write(ByteBuf packet) { - packet.writeInt(entId); - ByteBufUtils.writeUTF8String(packet, sound); - } + @Override + public void write(ByteBuf packet) { + packet.writeInt(entId); + ByteBufUtils.writeUTF8String(packet, sound); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/KnowledgePacket.java b/src/main/java/minefantasy/mf2/network/packet/KnowledgePacket.java index 9247b57c..cddaec7d 100644 --- a/src/main/java/minefantasy/mf2/network/packet/KnowledgePacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/KnowledgePacket.java @@ -1,8 +1,5 @@ package minefantasy.mf2.network.packet; -import java.util.ArrayList; -import java.util.Iterator; - import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; import minefantasy.mf2.api.knowledge.InformationBase; @@ -10,62 +7,65 @@ import minefantasy.mf2.api.knowledge.ResearchLogic; import net.minecraft.entity.player.EntityPlayer; +import java.util.ArrayList; +import java.util.Iterator; + public class KnowledgePacket extends PacketMF { - public static final String packetName = "MF2_KnowledgeSync"; - private EntityPlayer user; - private String username; + public static final String packetName = "MF2_KnowledgeSync"; + private EntityPlayer user; + private String username; - public KnowledgePacket(EntityPlayer user) { - this.username = user.getCommandSenderName(); - this.user = user; - } + public KnowledgePacket(EntityPlayer user) { + this.username = user.getCommandSenderName(); + this.user = user; + } - public KnowledgePacket() { - } + public KnowledgePacket() { + } - @Override - public void process(ByteBuf packet, EntityPlayer player) { - int size = InformationList.knowledgeList.size(); - ArrayList completed = new ArrayList(); - for (int a = 0; a < size; a++) { - boolean unlocked = packet.readBoolean(); - int artefactCount = packet.readInt(); + @Override + public void process(ByteBuf packet, EntityPlayer player) { + int size = InformationList.knowledgeList.size(); + ArrayList completed = new ArrayList(); + for (int a = 0; a < size; a++) { + boolean unlocked = packet.readBoolean(); + int artefactCount = packet.readInt(); - InformationBase base = InformationList.knowledgeList.get(a); - if (base != null) { - completed.add(new Object[] { base, unlocked, artefactCount }); - } - } - username = ByteBufUtils.readUTF8String(packet); - if (username != null && player.getCommandSenderName().equals(username)) { - Iterator researches = completed.iterator(); - while (researches.hasNext()) { - Object[] entry = (Object[]) researches.next(); - InformationBase base = (InformationBase) entry[0]; - ResearchLogic.setArtefactCount(base.getUnlocalisedName(), player, (Integer) entry[2]); - if ((Boolean) entry[1]) { - ResearchLogic.forceUnlock(player, base); - } - } - } - packet.clear(); - completed = null; - } + InformationBase base = InformationList.knowledgeList.get(a); + if (base != null) { + completed.add(new Object[]{base, unlocked, artefactCount}); + } + } + username = ByteBufUtils.readUTF8String(packet); + if (username != null && player.getCommandSenderName().equals(username)) { + Iterator researches = completed.iterator(); + while (researches.hasNext()) { + Object[] entry = (Object[]) researches.next(); + InformationBase base = (InformationBase) entry[0]; + ResearchLogic.setArtefactCount(base.getUnlocalisedName(), player, (Integer) entry[2]); + if ((Boolean) entry[1]) { + ResearchLogic.forceUnlock(player, base); + } + } + } + packet.clear(); + completed = null; + } - @Override - public String getChannel() { - return packetName; - } + @Override + public String getChannel() { + return packetName; + } - @Override - public void write(ByteBuf packet) { - int size = InformationList.knowledgeList.size(); + @Override + public void write(ByteBuf packet) { + int size = InformationList.knowledgeList.size(); - for (int a = 0; a < size; a++) { - InformationBase base = InformationList.knowledgeList.get(a); - packet.writeBoolean(ResearchLogic.hasInfoUnlocked(user, base)); - packet.writeInt(ResearchLogic.getArtefactCount(base.getUnlocalisedName(), user)); - } - ByteBufUtils.writeUTF8String(packet, username); - } + for (int a = 0; a < size; a++) { + InformationBase base = InformationList.knowledgeList.get(a); + packet.writeBoolean(ResearchLogic.hasInfoUnlocked(user, base)); + packet.writeInt(ResearchLogic.getArtefactCount(base.getUnlocalisedName(), user)); + } + ByteBufUtils.writeUTF8String(packet, username); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/LevelupPacket.java b/src/main/java/minefantasy/mf2/network/packet/LevelupPacket.java index 9ec8cd55..f83579a3 100644 --- a/src/main/java/minefantasy/mf2/network/packet/LevelupPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/LevelupPacket.java @@ -9,48 +9,48 @@ import net.minecraft.util.StatCollector; public class LevelupPacket extends PacketMF { - public static final String packetName = "MF2_levelup"; - private EntityPlayer user; - private String username; - private int level; - private String skillName; - - public LevelupPacket(EntityPlayer user, Skill skill, int level) { - this.username = user.getCommandSenderName(); - this.user = user; - this.skillName = skill.skillName; - this.level = level; - } - - public LevelupPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - String name = ByteBufUtils.readUTF8String(packet); - int skillLvl = packet.readInt(); - - username = ByteBufUtils.readUTF8String(packet); - if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) { - Skill skill = RPGElements.getSkillByName(name); - - if (skill != null) { - player.playSound("random.levelup", 1.0F, 0.5F); - player.addChatMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("rpg.levelup", - skill.getDisplayName().toLowerCase(), skillLvl))); - } - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - ByteBufUtils.writeUTF8String(packet, skillName); - packet.writeInt(level); - ByteBufUtils.writeUTF8String(packet, username); - } + public static final String packetName = "MF2_levelup"; + private EntityPlayer user; + private String username; + private int level; + private String skillName; + + public LevelupPacket(EntityPlayer user, Skill skill, int level) { + this.username = user.getCommandSenderName(); + this.user = user; + this.skillName = skill.skillName; + this.level = level; + } + + public LevelupPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + String name = ByteBufUtils.readUTF8String(packet); + int skillLvl = packet.readInt(); + + username = ByteBufUtils.readUTF8String(packet); + if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) { + Skill skill = RPGElements.getSkillByName(name); + + if (skill != null) { + player.playSound("random.levelup", 1.0F, 0.5F); + player.addChatMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("rpg.levelup", + skill.getDisplayName().toLowerCase(), skillLvl))); + } + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + ByteBufUtils.writeUTF8String(packet, skillName); + packet.writeInt(level); + ByteBufUtils.writeUTF8String(packet, username); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java b/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java index 916defa7..d2d3229d 100644 --- a/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java +++ b/src/main/java/minefantasy/mf2/network/packet/PacketHandlerMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.network.packet; -import java.util.Hashtable; -import java.util.Map; - import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.network.FMLEventChannel; import cpw.mods.fml.common.network.FMLNetworkEvent; @@ -13,64 +10,67 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.NetHandlerPlayServer; +import java.util.Hashtable; +import java.util.Map; + public class PacketHandlerMF { - public Map packetList = new Hashtable(); - public Map channels = new Hashtable(); + public Map packetList = new Hashtable(); + public Map channels = new Hashtable(); - public PacketHandlerMF() { - packetList.put(StaminaPacket.packetName, new StaminaPacket()); - packetList.put(ParryPacket.packetName, new ParryPacket()); - packetList.put(HitSoundPacket.packetName, new HitSoundPacket()); - packetList.put(AnvilPacket.packetName, new AnvilPacket()); - packetList.put(CarpenterPacket.packetName, new CarpenterPacket()); - packetList.put(KnowledgePacket.packetName, new KnowledgePacket()); - packetList.put(ResearchRequest.packetName, new ResearchRequest()); - packetList.put(ChimneyPacket.packetName, new ChimneyPacket()); - packetList.put(SkillPacket.packetName, new SkillPacket()); - packetList.put(LevelupPacket.packetName, new LevelupPacket()); - packetList.put(ForgePacket.packetName, new ForgePacket()); - packetList.put(ResearchTablePacket.packetName, new ResearchTablePacket()); - packetList.put(TroughPacket.packetName, new TroughPacket()); - packetList.put(BombBenchPacket.packetName, new BombBenchPacket()); - packetList.put(TannerPacket.packetName, new TannerPacket()); - packetList.put(RoadPacket.packetName, new RoadPacket()); - packetList.put(BloomeryPacket.packetName, new BloomeryPacket()); - packetList.put(CrossbowBenchPacket.packetName, new CrossbowBenchPacket()); - packetList.put(TileInventoryPacket.packetName, new TileInventoryPacket()); - packetList.put(BigFurnacePacket.packetName, new BigFurnacePacket()); - packetList.put(DodgeCommand.packetName, new DodgeCommand()); - packetList.put(RackCommand.packetName, new RackCommand()); - packetList.put(AmmoBoxPacket.packetName, new AmmoBoxPacket()); - packetList.put(WoodDecorPacket.packetName, new WoodDecorPacket()); - packetList.put(CogworkControlPacket.packetName, new CogworkControlPacket()); - packetList.put(StorageBlockPacket.packetName, new StorageBlockPacket()); - } + public PacketHandlerMF() { + packetList.put(StaminaPacket.packetName, new StaminaPacket()); + packetList.put(ParryPacket.packetName, new ParryPacket()); + packetList.put(HitSoundPacket.packetName, new HitSoundPacket()); + packetList.put(AnvilPacket.packetName, new AnvilPacket()); + packetList.put(CarpenterPacket.packetName, new CarpenterPacket()); + packetList.put(KnowledgePacket.packetName, new KnowledgePacket()); + packetList.put(ResearchRequest.packetName, new ResearchRequest()); + packetList.put(ChimneyPacket.packetName, new ChimneyPacket()); + packetList.put(SkillPacket.packetName, new SkillPacket()); + packetList.put(LevelupPacket.packetName, new LevelupPacket()); + packetList.put(ForgePacket.packetName, new ForgePacket()); + packetList.put(ResearchTablePacket.packetName, new ResearchTablePacket()); + packetList.put(TroughPacket.packetName, new TroughPacket()); + packetList.put(BombBenchPacket.packetName, new BombBenchPacket()); + packetList.put(TannerPacket.packetName, new TannerPacket()); + packetList.put(RoadPacket.packetName, new RoadPacket()); + packetList.put(BloomeryPacket.packetName, new BloomeryPacket()); + packetList.put(CrossbowBenchPacket.packetName, new CrossbowBenchPacket()); + packetList.put(TileInventoryPacket.packetName, new TileInventoryPacket()); + packetList.put(BigFurnacePacket.packetName, new BigFurnacePacket()); + packetList.put(DodgeCommand.packetName, new DodgeCommand()); + packetList.put(RackCommand.packetName, new RackCommand()); + packetList.put(AmmoBoxPacket.packetName, new AmmoBoxPacket()); + packetList.put(WoodDecorPacket.packetName, new WoodDecorPacket()); + packetList.put(CogworkControlPacket.packetName, new CogworkControlPacket()); + packetList.put(StorageBlockPacket.packetName, new StorageBlockPacket()); + } - @SubscribeEvent - public void onServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event) { - packetList.get(event.packet.channel()).process(event.packet.payload(), - ((NetHandlerPlayServer) event.handler).playerEntity); - } + @SubscribeEvent + public void onServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event) { + packetList.get(event.packet.channel()).process(event.packet.payload(), + ((NetHandlerPlayServer) event.handler).playerEntity); + } - @SubscribeEvent - public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) { - packetList.get(event.packet.channel()).process(event.packet.payload(), MineFantasyII.proxy.getClientPlayer()); - } + @SubscribeEvent + public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) { + packetList.get(event.packet.channel()).process(event.packet.payload(), MineFantasyII.proxy.getClientPlayer()); + } - public void sendPacketToPlayer(FMLProxyPacket packet, EntityPlayerMP player) { - channels.get(packet.channel()).sendTo(packet, player); - } + public void sendPacketToPlayer(FMLProxyPacket packet, EntityPlayerMP player) { + channels.get(packet.channel()).sendTo(packet, player); + } - public void sendPacketToServer(FMLProxyPacket packet) { - channels.get(packet.channel()).sendToServer(packet); - } + public void sendPacketToServer(FMLProxyPacket packet) { + channels.get(packet.channel()).sendToServer(packet); + } - public void sendPacketAround(Entity entity, double range, FMLProxyPacket packet) { - channels.get(packet.channel()).sendToAllAround(packet, - new NetworkRegistry.TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, range)); - } + public void sendPacketAround(Entity entity, double range, FMLProxyPacket packet) { + channels.get(packet.channel()).sendToAllAround(packet, + new NetworkRegistry.TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, range)); + } - public void sendPacketToAll(FMLProxyPacket packet) { - channels.get(packet.channel()).sendToAll(packet); - } + public void sendPacketToAll(FMLProxyPacket packet) { + channels.get(packet.channel()).sendToAll(packet); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/PacketMF.java b/src/main/java/minefantasy/mf2/network/packet/PacketMF.java index e34818ac..5f4e7192 100644 --- a/src/main/java/minefantasy/mf2/network/packet/PacketMF.java +++ b/src/main/java/minefantasy/mf2/network/packet/PacketMF.java @@ -7,15 +7,15 @@ public abstract class PacketMF { - public final FMLProxyPacket generatePacket() { - ByteBuf buf = Unpooled.buffer(16); - write(buf); - return new FMLProxyPacket(buf, getChannel()); - } + public final FMLProxyPacket generatePacket() { + ByteBuf buf = Unpooled.buffer(16); + write(buf); + return new FMLProxyPacket(buf, getChannel()); + } - public abstract String getChannel(); + public abstract String getChannel(); - public abstract void write(ByteBuf out); + public abstract void write(ByteBuf out); - public abstract void process(ByteBuf in, EntityPlayer user); + public abstract void process(ByteBuf in, EntityPlayer user); } diff --git a/src/main/java/minefantasy/mf2/network/packet/ParryPacket.java b/src/main/java/minefantasy/mf2/network/packet/ParryPacket.java index 33772f05..fa4fed75 100644 --- a/src/main/java/minefantasy/mf2/network/packet/ParryPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/ParryPacket.java @@ -6,38 +6,38 @@ import net.minecraft.entity.player.EntityPlayer; public class ParryPacket extends PacketMF { - public static final String packetName = "MF2_ParryPacket"; - private int value; - private String username; - - public ParryPacket(int value, EntityPlayer user) { - this.value = value; - this.username = user.getCommandSenderName(); - } - - public ParryPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - value = packet.readInt(); - username = ByteBufUtils.readUTF8String(packet); - - if (username != null) { - EntityPlayer entity = player.worldObj.getPlayerEntityByName(username); - if (entity != null) - CombatMechanics.setParryCooldown(entity, value); - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - packet.writeInt(value); - ByteBufUtils.writeUTF8String(packet, username); - } + public static final String packetName = "MF2_ParryPacket"; + private int value; + private String username; + + public ParryPacket(int value, EntityPlayer user) { + this.value = value; + this.username = user.getCommandSenderName(); + } + + public ParryPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + value = packet.readInt(); + username = ByteBufUtils.readUTF8String(packet); + + if (username != null) { + EntityPlayer entity = player.worldObj.getPlayerEntityByName(username); + if (entity != null) + CombatMechanics.setParryCooldown(entity, value); + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + packet.writeInt(value); + ByteBufUtils.writeUTF8String(packet, username); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/RackCommand.java b/src/main/java/minefantasy/mf2/network/packet/RackCommand.java index d047eb79..8b1bf040 100644 --- a/src/main/java/minefantasy/mf2/network/packet/RackCommand.java +++ b/src/main/java/minefantasy/mf2/network/packet/RackCommand.java @@ -8,50 +8,50 @@ import net.minecraft.tileentity.TileEntity; public class RackCommand extends PacketMF { - public static final String packetName = "MF2_Command_Rack"; - private EntityPlayer user; - private TileEntityRack rack; - private int slot; - private String username; - - public RackCommand(int slot, EntityPlayer user, TileEntityRack rack) { - this.username = user.getCommandSenderName(); - this.slot = slot; - this.rack = rack; - this.user = user; - } - - public RackCommand() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - int x = packet.readInt(); - int y = packet.readInt(); - int z = packet.readInt(); - - slot = packet.readInt(); - username = ByteBufUtils.readUTF8String(packet); - EntityPlayer user = player.worldObj.getPlayerEntityByName(username); - TileEntity tile = player.worldObj.getTileEntity(x, y, z); - - if (user != null && tile != null && tile instanceof TileEntityRack) { - rack = (TileEntityRack) tile; - BlockRack.interact(slot, user.worldObj, rack, user); - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - packet.writeInt(rack.xCoord); - packet.writeInt(rack.yCoord); - packet.writeInt(rack.zCoord); - packet.writeInt(slot); - ByteBufUtils.writeUTF8String(packet, username); - } + public static final String packetName = "MF2_Command_Rack"; + private EntityPlayer user; + private TileEntityRack rack; + private int slot; + private String username; + + public RackCommand(int slot, EntityPlayer user, TileEntityRack rack) { + this.username = user.getCommandSenderName(); + this.slot = slot; + this.rack = rack; + this.user = user; + } + + public RackCommand() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + int x = packet.readInt(); + int y = packet.readInt(); + int z = packet.readInt(); + + slot = packet.readInt(); + username = ByteBufUtils.readUTF8String(packet); + EntityPlayer user = player.worldObj.getPlayerEntityByName(username); + TileEntity tile = player.worldObj.getTileEntity(x, y, z); + + if (user != null && tile != null && tile instanceof TileEntityRack) { + rack = (TileEntityRack) tile; + BlockRack.interact(slot, user.worldObj, rack, user); + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + packet.writeInt(rack.xCoord); + packet.writeInt(rack.yCoord); + packet.writeInt(rack.zCoord); + packet.writeInt(slot); + ByteBufUtils.writeUTF8String(packet, username); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/ResearchRequest.java b/src/main/java/minefantasy/mf2/network/packet/ResearchRequest.java index f416bdb4..e9390c4e 100644 --- a/src/main/java/minefantasy/mf2/network/packet/ResearchRequest.java +++ b/src/main/java/minefantasy/mf2/network/packet/ResearchRequest.java @@ -8,45 +8,45 @@ import net.minecraft.entity.player.EntityPlayer; public class ResearchRequest extends PacketMF { - public static final String packetName = "MF2_RequestResearch"; - private EntityPlayer user; - private int researchID; - private String username; - - public ResearchRequest(EntityPlayer user, int id) { - this.researchID = id; - this.username = user.getCommandSenderName(); - this.user = user; - } - - public ResearchRequest() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - researchID = packet.readInt(); - username = ByteBufUtils.readUTF8String(packet); - - if (username != null && player.getCommandSenderName().equals(username)) { - InformationBase research = InformationList.knowledgeList.get(researchID); - if (player != null && research != null && research.isEasy()) { - if (!player.worldObj.isRemote) { - if (research.onPurchase(player)) { - ResearchLogic.syncData(player); - } - } - } - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - packet.writeInt(researchID); - ByteBufUtils.writeUTF8String(packet, username); - } + public static final String packetName = "MF2_RequestResearch"; + private EntityPlayer user; + private int researchID; + private String username; + + public ResearchRequest(EntityPlayer user, int id) { + this.researchID = id; + this.username = user.getCommandSenderName(); + this.user = user; + } + + public ResearchRequest() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + researchID = packet.readInt(); + username = ByteBufUtils.readUTF8String(packet); + + if (username != null && player.getCommandSenderName().equals(username)) { + InformationBase research = InformationList.knowledgeList.get(researchID); + if (player != null && research != null && research.isEasy()) { + if (!player.worldObj.isRemote) { + if (research.onPurchase(player)) { + ResearchLogic.syncData(player); + } + } + } + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + packet.writeInt(researchID); + ByteBufUtils.writeUTF8String(packet, username); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/ResearchTablePacket.java b/src/main/java/minefantasy/mf2/network/packet/ResearchTablePacket.java index 8648e08a..f30bec46 100644 --- a/src/main/java/minefantasy/mf2/network/packet/ResearchTablePacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/ResearchTablePacket.java @@ -6,55 +6,55 @@ import net.minecraft.tileentity.TileEntity; public class ResearchTablePacket extends PacketMF { - public static final String packetName = "MF2_ResearchTblPkt"; - private int[] coords = new int[3]; - private int id; - private float[] progress = new float[2]; - - public ResearchTablePacket(TileEntityResearch tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - id = tile.researchID; - progress = new float[] { tile.progress, tile.maxProgress }; - if (progress[1] <= 0) { - progress[1] = 0; - } - } - - public ResearchTablePacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - float prog1 = packet.readFloat(); - float prog2 = packet.readFloat(); - int ID = packet.readInt(); - - if (entity != null && entity instanceof TileEntityResearch) { - progress[0] = prog1; - progress[1] = prog2; - id = ID; - - TileEntityResearch carpenter = (TileEntityResearch) entity; - carpenter.researchID = id; - carpenter.progress = progress[0]; - carpenter.maxProgress = (int) progress[1]; - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeFloat(progress[0]); - packet.writeFloat(progress[1]); - packet.writeInt(id); - } + public static final String packetName = "MF2_ResearchTblPkt"; + private int[] coords = new int[3]; + private int id; + private float[] progress = new float[2]; + + public ResearchTablePacket(TileEntityResearch tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + id = tile.researchID; + progress = new float[]{tile.progress, tile.maxProgress}; + if (progress[1] <= 0) { + progress[1] = 0; + } + } + + public ResearchTablePacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + float prog1 = packet.readFloat(); + float prog2 = packet.readFloat(); + int ID = packet.readInt(); + + if (entity != null && entity instanceof TileEntityResearch) { + progress[0] = prog1; + progress[1] = prog2; + id = ID; + + TileEntityResearch carpenter = (TileEntityResearch) entity; + carpenter.researchID = id; + carpenter.progress = progress[0]; + carpenter.maxProgress = (int) progress[1]; + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeFloat(progress[0]); + packet.writeFloat(progress[1]); + packet.writeInt(id); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/RoadPacket.java b/src/main/java/minefantasy/mf2/network/packet/RoadPacket.java index 3ae0bfc6..dcefce1e 100644 --- a/src/main/java/minefantasy/mf2/network/packet/RoadPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/RoadPacket.java @@ -6,67 +6,67 @@ import net.minecraft.tileentity.TileEntity; public class RoadPacket extends PacketMF { - public static final String packetName = "MF2_RoadPacket"; - private int[] coords = new int[3]; - private int[] surface; - private boolean isLocked; - private boolean isRequest = false; + public static final String packetName = "MF2_RoadPacket"; + private int[] coords = new int[3]; + private int[] surface; + private boolean isLocked; + private boolean isRequest = false; - public RoadPacket(TileEntityRoad tile) { - this.coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - this.surface = tile.surface; - this.isLocked = tile.isLocked; - } + public RoadPacket(TileEntityRoad tile) { + this.coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + this.surface = tile.surface; + this.isLocked = tile.isLocked; + } - public RoadPacket request() { - isRequest = true; - return this; - } + public RoadPacket() { + } - public RoadPacket() { - } + public RoadPacket request() { + isRequest = true; + return this; + } - @Override - public void process(ByteBuf packet, EntityPlayer player) { - this.coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - isRequest = packet.readBoolean(); + @Override + public void process(ByteBuf packet, EntityPlayer player) { + this.coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + isRequest = packet.readBoolean(); - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - if (entity != null && entity instanceof TileEntityRoad) { - TileEntityRoad tile = (TileEntityRoad) entity; - if (isRequest) { - tile.sendPacketToClients(); - } else { - int s0 = packet.readInt(); - int s1 = packet.readInt(); - this.isLocked = packet.readBoolean(); + if (entity != null && entity instanceof TileEntityRoad) { + TileEntityRoad tile = (TileEntityRoad) entity; + if (isRequest) { + tile.sendPacketToClients(); + } else { + int s0 = packet.readInt(); + int s1 = packet.readInt(); + this.isLocked = packet.readBoolean(); - tile.surface = new int[] { s0, s1 }; - tile.isLocked = this.isLocked; + tile.surface = new int[]{s0, s1}; + tile.isLocked = this.isLocked; - tile.refreshSurface(); - } - } - packet.clear(); - } + tile.refreshSurface(); + } + } + packet.clear(); + } - @Override - public String getChannel() { - return packetName; - } + @Override + public String getChannel() { + return packetName; + } - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeBoolean(isRequest); + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeBoolean(isRequest); - if (!isRequest) { - packet.writeInt(surface[0]); - packet.writeInt(surface[1]); - packet.writeBoolean(this.isLocked); - } - } + if (!isRequest) { + packet.writeInt(surface[0]); + packet.writeInt(surface[1]); + packet.writeBoolean(this.isLocked); + } + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/SkillPacket.java b/src/main/java/minefantasy/mf2/network/packet/SkillPacket.java index aede4d30..7a7f0f26 100644 --- a/src/main/java/minefantasy/mf2/network/packet/SkillPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/SkillPacket.java @@ -8,52 +8,52 @@ import net.minecraft.nbt.NBTTagCompound; public class SkillPacket extends PacketMF { - public static final String packetName = "MF2_SkillSync"; - private EntityPlayer user; - private String username; - private int level, xp, xpMax; - private String skillName; - - public SkillPacket(EntityPlayer user, Skill skill) { - this.username = user.getCommandSenderName(); - this.user = user; - NBTTagCompound skilltag = RPGElements.getSkill(user, skill.skillName); - skillName = skill.skillName; - level = skilltag.getInteger("level"); - xp = skilltag.getInteger("xp"); - xpMax = skilltag.getInteger("xpMax"); - } - - public SkillPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - String name = ByteBufUtils.readUTF8String(packet); - int skillLvl = packet.readInt(); - int skillXp = packet.readInt(); - int skillMaxXp = packet.readInt(); - - username = ByteBufUtils.readUTF8String(packet); - if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) { - NBTTagCompound tag = RPGElements.getSkill(player, name); - tag.setInteger("level", skillLvl); - tag.setInteger("xp", skillXp); - tag.setInteger("xpMax", skillMaxXp); - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - ByteBufUtils.writeUTF8String(packet, skillName); - packet.writeInt(level); - packet.writeInt(xp); - packet.writeInt(xpMax); - ByteBufUtils.writeUTF8String(packet, username); - } + public static final String packetName = "MF2_SkillSync"; + private EntityPlayer user; + private String username; + private int level, xp, xpMax; + private String skillName; + + public SkillPacket(EntityPlayer user, Skill skill) { + this.username = user.getCommandSenderName(); + this.user = user; + NBTTagCompound skilltag = RPGElements.getSkill(user, skill.skillName); + skillName = skill.skillName; + level = skilltag.getInteger("level"); + xp = skilltag.getInteger("xp"); + xpMax = skilltag.getInteger("xpMax"); + } + + public SkillPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + String name = ByteBufUtils.readUTF8String(packet); + int skillLvl = packet.readInt(); + int skillXp = packet.readInt(); + int skillMaxXp = packet.readInt(); + + username = ByteBufUtils.readUTF8String(packet); + if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) { + NBTTagCompound tag = RPGElements.getSkill(player, name); + tag.setInteger("level", skillLvl); + tag.setInteger("xp", skillXp); + tag.setInteger("xpMax", skillMaxXp); + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + ByteBufUtils.writeUTF8String(packet, skillName); + packet.writeInt(level); + packet.writeInt(xp); + packet.writeInt(xpMax); + ByteBufUtils.writeUTF8String(packet, username); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/StaminaPacket.java b/src/main/java/minefantasy/mf2/network/packet/StaminaPacket.java index dbbfb30f..9d2271ac 100644 --- a/src/main/java/minefantasy/mf2/network/packet/StaminaPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/StaminaPacket.java @@ -6,45 +6,45 @@ import net.minecraft.entity.player.EntityPlayer; public class StaminaPacket extends PacketMF { - public static final String packetName = "MF2_Staminabar"; - private float[] value; - private String username; - - public StaminaPacket(float[] value, EntityPlayer user) { - this.value = value; - this.username = user.getCommandSenderName(); - } - - public StaminaPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - value = new float[] { StaminaBar.getDefaultMax(player), StaminaBar.getDefaultMax(player), 0, 0F }; - value[0] = packet.readFloat(); - value[1] = packet.readFloat(); - value[2] = packet.readFloat(); - value[3] = packet.readFloat(); - username = ByteBufUtils.readUTF8String(packet); - - if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) { - StaminaBar.setStaminaValue(player, value[0]); - StaminaBar.setMaxStamina(player, value[1]); - StaminaBar.setFlashTime(player, value[2]); - StaminaBar.setBonusStamina(player, value[3]); - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (float variable : value) { - packet.writeFloat(variable); - } - ByteBufUtils.writeUTF8String(packet, username); - } + public static final String packetName = "MF2_Staminabar"; + private float[] value; + private String username; + + public StaminaPacket(float[] value, EntityPlayer user) { + this.value = value; + this.username = user.getCommandSenderName(); + } + + public StaminaPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + value = new float[]{StaminaBar.getDefaultMax(player), StaminaBar.getDefaultMax(player), 0, 0F}; + value[0] = packet.readFloat(); + value[1] = packet.readFloat(); + value[2] = packet.readFloat(); + value[3] = packet.readFloat(); + username = ByteBufUtils.readUTF8String(packet); + + if (username != null && player.getCommandSenderName().equalsIgnoreCase(username)) { + StaminaBar.setStaminaValue(player, value[0]); + StaminaBar.setMaxStamina(player, value[1]); + StaminaBar.setFlashTime(player, value[2]); + StaminaBar.setBonusStamina(player, value[3]); + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + for (float variable : value) { + packet.writeFloat(variable); + } + ByteBufUtils.writeUTF8String(packet, username); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/StorageBlockPacket.java b/src/main/java/minefantasy/mf2/network/packet/StorageBlockPacket.java index afa5ef39..12e12b52 100644 --- a/src/main/java/minefantasy/mf2/network/packet/StorageBlockPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/StorageBlockPacket.java @@ -9,62 +9,62 @@ import net.minecraft.tileentity.TileEntity; public class StorageBlockPacket extends PacketMF { - public static final String packetName = "MF2_StoragePkt"; - private int[] coords = new int[3]; - private ItemStack component; - private String type, tex, materialName; - private int stackSize, max; + public static final String packetName = "MF2_StoragePkt"; + private int[] coords = new int[3]; + private ItemStack component; + private String type, tex, materialName; + private int stackSize, max; - public StorageBlockPacket(TileEntityComponent tile) { - this.coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - this.type = tile.type; - this.tex = tile.tex; - this.materialName = tile.material != null ? tile.material.name : "steel"; - this.component = tile.item; - this.stackSize = tile.stackSize; - this.max = tile.max; - } + public StorageBlockPacket(TileEntityComponent tile) { + this.coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + this.type = tile.type; + this.tex = tile.tex; + this.materialName = tile.material != null ? tile.material.name : "steel"; + this.component = tile.item; + this.stackSize = tile.stackSize; + this.max = tile.max; + } - public StorageBlockPacket() { - } + public StorageBlockPacket() { + } - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - type = ByteBufUtils.readUTF8String(packet); - tex = ByteBufUtils.readUTF8String(packet); - materialName = ByteBufUtils.readUTF8String(packet); - component = ByteBufUtils.readItemStack(packet); - stackSize = packet.readInt(); - max = packet.readInt(); + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + type = ByteBufUtils.readUTF8String(packet); + tex = ByteBufUtils.readUTF8String(packet); + materialName = ByteBufUtils.readUTF8String(packet); + component = ByteBufUtils.readItemStack(packet); + stackSize = packet.readInt(); + max = packet.readInt(); - if (entity != null && entity instanceof TileEntityComponent) { - TileEntityComponent tile = (TileEntityComponent) entity; - tile.type = this.type; - tile.tex = this.tex; - tile.material = CustomMaterial.getMaterial(materialName); - tile.item = this.component; - tile.stackSize = this.stackSize; - tile.max = this.max; - } - } + if (entity != null && entity instanceof TileEntityComponent) { + TileEntityComponent tile = (TileEntityComponent) entity; + tile.type = this.type; + tile.tex = this.tex; + tile.material = CustomMaterial.getMaterial(materialName); + tile.item = this.component; + tile.stackSize = this.stackSize; + tile.max = this.max; + } + } - @Override - public String getChannel() { - return packetName; - } + @Override + public String getChannel() { + return packetName; + } - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - ByteBufUtils.writeUTF8String(packet, type); - ByteBufUtils.writeUTF8String(packet, tex); - ByteBufUtils.writeUTF8String(packet, materialName); - ByteBufUtils.writeItemStack(packet, component); - packet.writeInt(stackSize); - packet.writeInt(max); - } + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + ByteBufUtils.writeUTF8String(packet, type); + ByteBufUtils.writeUTF8String(packet, tex); + ByteBufUtils.writeUTF8String(packet, materialName); + ByteBufUtils.writeItemStack(packet, component); + packet.writeInt(stackSize); + packet.writeInt(max); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/TannerPacket.java b/src/main/java/minefantasy/mf2/network/packet/TannerPacket.java index 4bdff027..b63e6949 100644 --- a/src/main/java/minefantasy/mf2/network/packet/TannerPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/TannerPacket.java @@ -6,40 +6,40 @@ import net.minecraft.tileentity.TileEntity; public class TannerPacket extends PacketMF { - public static final String packetName = "MF2_TannerPacket"; - private int[] coords = new int[3]; - private float animation; - - public TannerPacket(TileEntityTanningRack tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - animation = tile.acTime; - } - - public TannerPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - float newAnim = packet.readFloat(); - - if (entity != null && entity instanceof TileEntityTanningRack) { - TileEntityTanningRack tile = (TileEntityTanningRack) entity; - tile.acTime = newAnim; - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeFloat(animation); - } + public static final String packetName = "MF2_TannerPacket"; + private int[] coords = new int[3]; + private float animation; + + public TannerPacket(TileEntityTanningRack tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + animation = tile.acTime; + } + + public TannerPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + float newAnim = packet.readFloat(); + + if (entity != null && entity instanceof TileEntityTanningRack) { + TileEntityTanningRack tile = (TileEntityTanningRack) entity; + tile.acTime = newAnim; + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeFloat(animation); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/TileInventoryPacket.java b/src/main/java/minefantasy/mf2/network/packet/TileInventoryPacket.java index d4f3b8c2..833844b0 100644 --- a/src/main/java/minefantasy/mf2/network/packet/TileInventoryPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/TileInventoryPacket.java @@ -9,57 +9,57 @@ import net.minecraft.tileentity.TileEntity; public class TileInventoryPacket extends PacketMF { - public static final String packetName = "MF2_TileInvPacket"; - private int[] coords = new int[3]; - private int invSize; - private IInventory inventory; + public static final String packetName = "MF2_TileInvPacket"; + private int[] coords = new int[3]; + private int invSize; + private IInventory inventory; - public TileInventoryPacket(IInventory inv, TileEntity tile) { - this.coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - this.inventory = inv; - this.invSize = inv.getSizeInventory(); - } + public TileInventoryPacket(IInventory inv, TileEntity tile) { + this.coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + this.inventory = inv; + this.invSize = inv.getSizeInventory(); + } - public TileInventoryPacket() { - } + public TileInventoryPacket() { + } - @Override - public void process(ByteBuf packet, EntityPlayer player) { - int x = packet.readInt(); - int y = packet.readInt(); - int z = packet.readInt(); - int size = packet.readInt(); + @Override + public void process(ByteBuf packet, EntityPlayer player) { + int x = packet.readInt(); + int y = packet.readInt(); + int z = packet.readInt(); + int size = packet.readInt(); - TileEntity entity = player.worldObj.getTileEntity(x, y, z); + TileEntity entity = player.worldObj.getTileEntity(x, y, z); - if (entity != null && entity instanceof IInventory) { - IInventory inv = (IInventory) entity; - for (int s = 0; s < size; s++) { - ItemStack item = ByteBufUtils.readItemStack(packet); - if (s < inv.getSizeInventory()) { - inv.setInventorySlotContents(s, item); - } else { - item = null; - MFLogUtil.logDebug("Dropped Packet Item " + s); - } - } - } - packet.clear(); - } + if (entity != null && entity instanceof IInventory) { + IInventory inv = (IInventory) entity; + for (int s = 0; s < size; s++) { + ItemStack item = ByteBufUtils.readItemStack(packet); + if (s < inv.getSizeInventory()) { + inv.setInventorySlotContents(s, item); + } else { + item = null; + MFLogUtil.logDebug("Dropped Packet Item " + s); + } + } + } + packet.clear(); + } - @Override - public String getChannel() { - return packetName; - } + @Override + public String getChannel() { + return packetName; + } - @Override - public void write(ByteBuf packet) { - packet.writeInt(coords[0]); - packet.writeInt(coords[1]); - packet.writeInt(coords[2]); - packet.writeInt(invSize); - for (int s = 0; s < invSize; s++) { - ByteBufUtils.writeItemStack(packet, inventory.getStackInSlot(s)); - } - } + @Override + public void write(ByteBuf packet) { + packet.writeInt(coords[0]); + packet.writeInt(coords[1]); + packet.writeInt(coords[2]); + packet.writeInt(invSize); + for (int s = 0; s < invSize; s++) { + ByteBufUtils.writeItemStack(packet, inventory.getStackInSlot(s)); + } + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/TroughPacket.java b/src/main/java/minefantasy/mf2/network/packet/TroughPacket.java index 67f2a2a3..8fd4cd05 100644 --- a/src/main/java/minefantasy/mf2/network/packet/TroughPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/TroughPacket.java @@ -6,40 +6,40 @@ import net.minecraft.tileentity.TileEntity; public class TroughPacket extends PacketMF { - public static final String packetName = "MF2_TroughPacket"; - private int[] coords = new int[3]; - private int fill; - - public TroughPacket(TileEntityTrough tile) { - coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - fill = tile.fill; - } - - public TroughPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - int newFill = packet.readInt(); - - if (entity != null && entity instanceof TileEntityTrough) { - TileEntityTrough tile = (TileEntityTrough) entity; - tile.fill = newFill; - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - packet.writeInt(fill); - } + public static final String packetName = "MF2_TroughPacket"; + private int[] coords = new int[3]; + private int fill; + + public TroughPacket(TileEntityTrough tile) { + coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + fill = tile.fill; + } + + public TroughPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + int newFill = packet.readInt(); + + if (entity != null && entity instanceof TileEntityTrough) { + TileEntityTrough tile = (TileEntityTrough) entity; + tile.fill = newFill; + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + packet.writeInt(fill); + } } diff --git a/src/main/java/minefantasy/mf2/network/packet/WoodDecorPacket.java b/src/main/java/minefantasy/mf2/network/packet/WoodDecorPacket.java index 63709079..566b4ec7 100644 --- a/src/main/java/minefantasy/mf2/network/packet/WoodDecorPacket.java +++ b/src/main/java/minefantasy/mf2/network/packet/WoodDecorPacket.java @@ -7,40 +7,40 @@ import net.minecraft.tileentity.TileEntity; public class WoodDecorPacket extends PacketMF { - public static final String packetName = "MF2_WdDecorPkt"; - private int[] coords = new int[3]; - private String materialName; - - public WoodDecorPacket(TileEntityWoodDecor tile) { - this.coords = new int[] { tile.xCoord, tile.yCoord, tile.zCoord }; - this.materialName = tile.getMaterialName(); - } - - public WoodDecorPacket() { - } - - @Override - public void process(ByteBuf packet, EntityPlayer player) { - coords = new int[] { packet.readInt(), packet.readInt(), packet.readInt() }; - TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); - materialName = ByteBufUtils.readUTF8String(packet); - - if (entity != null && entity instanceof TileEntityWoodDecor) { - TileEntityWoodDecor tile = (TileEntityWoodDecor) entity; - tile.trySetMaterial(materialName); - } - } - - @Override - public String getChannel() { - return packetName; - } - - @Override - public void write(ByteBuf packet) { - for (int a = 0; a < coords.length; a++) { - packet.writeInt(coords[a]); - } - ByteBufUtils.writeUTF8String(packet, materialName); - } + public static final String packetName = "MF2_WdDecorPkt"; + private int[] coords = new int[3]; + private String materialName; + + public WoodDecorPacket(TileEntityWoodDecor tile) { + this.coords = new int[]{tile.xCoord, tile.yCoord, tile.zCoord}; + this.materialName = tile.getMaterialName(); + } + + public WoodDecorPacket() { + } + + @Override + public void process(ByteBuf packet, EntityPlayer player) { + coords = new int[]{packet.readInt(), packet.readInt(), packet.readInt()}; + TileEntity entity = player.worldObj.getTileEntity(coords[0], coords[1], coords[2]); + materialName = ByteBufUtils.readUTF8String(packet); + + if (entity != null && entity instanceof TileEntityWoodDecor) { + TileEntityWoodDecor tile = (TileEntityWoodDecor) entity; + tile.trySetMaterial(materialName); + } + } + + @Override + public String getChannel() { + return packetName; + } + + @Override + public void write(ByteBuf packet) { + for (int a = 0; a < coords.length; a++) { + packet.writeInt(coords[a]); + } + ByteBufUtils.writeUTF8String(packet, materialName); + } } diff --git a/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java b/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java index f0a308e9..211c69fe 100644 --- a/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java +++ b/src/main/java/minefantasy/mf2/recipe/BasicRecipesMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.recipe; -import java.util.ArrayList; -import java.util.Iterator; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.tanning.TanningRecipe; @@ -22,209 +19,212 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; + public class BasicRecipesMF { - public static void init() { - addFoodOutput(); - TempRecipesMF.init();// TODO remove temp recipes - ForgingRecipes.init(); - CarpenterRecipes.init(); - SmeltingRecipesMF.init(); - SalvageRecipes.init(); - CookingRecipes.init(); - DragonforgedStyle.loadCrafting(); - OrnateStyle.loadCrafting(); - GameRegistry.addRecipe(new RecipeArmourDyeMF()); - - ArrayList wood = CustomMaterial.getList("wood"); - Iterator iteratorWood = wood.iterator(); - - KnowledgeListMF.stickRecipe = GameRegistry.addShapedRecipe(new ItemStack(Items.stick, 2), - new Object[] { "S", 'S', ComponentListMF.plank }); - GameRegistry.addShapedRecipe(new ItemStack(Items.stick, 2), - new Object[] { "S", 'S', ComponentListMF.plank_cut }); - - KnowledgeListMF.firepitRecipe = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.firepit), - new Object[] { " P ", "S S", 'S', Items.stick, 'P', ComponentListMF.plank }); - KnowledgeListMF.cooktopRecipe = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.roast), - new Object[] { "PSP", 'S', Blocks.cobblestone, 'P', ComponentListMF.plank }); - - GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.yew_planks, 4), new Object[] { BlockListMF.log_yew }); - GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.ironbark_planks, 4), - new Object[] { BlockListMF.log_ironbark }); - GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.ebony_planks, 4), - new Object[] { BlockListMF.log_ebony }); - - while (iteratorWood.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - assembleWoodVariations(customMat); - } - - KnowledgeListMF.plantOilR = GameRegistry.addShapedRecipe(new ItemStack(ComponentListMF.plant_oil, 4), - new Object[] { " B ", "BFB", " B ", 'F', Items.wheat_seeds, 'B', FoodListMF.jug_empty }); - KnowledgeListMF.waterJugR = GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.jug_water, 4), - new Object[] { " B ", "BWB", " B ", 'W', Items.water_bucket, 'B', FoodListMF.jug_empty }); - KnowledgeListMF.sugarRecipe = GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.sugarpot), - new Object[] { "S", "S", "B", 'S', Items.sugar, 'B', ComponentListMF.clay_pot, }); - GameRegistry.addShapelessRecipe(new ItemStack(Items.sugar, 2), new Object[] { FoodListMF.sugarpot, }); - KnowledgeListMF.milkJugR = GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.jug_milk, 4), - new Object[] { " B ", "BMB", " B ", 'M', Items.milk_bucket, 'B', FoodListMF.jug_empty }); - GameRegistry.addShapedRecipe(new ItemStack(Items.milk_bucket), - new Object[] { " B ", "BMB", " B ", 'M', Items.bucket, 'B', FoodListMF.jug_milk }); - GameRegistry.addShapedRecipe(new ItemStack(Items.water_bucket), - new Object[] { " B ", "BMB", " B ", 'M', Items.bucket, 'B', FoodListMF.jug_water }); - - GameRegistry.addRecipe(new RecipeSyringe()); - // Just a way on making the overpowered gunpowder from black powder - GameRegistry.addShapelessRecipe(new ItemStack(Items.gunpowder), - new Object[] { new ItemStack(ComponentListMF.blackpowder), new ItemStack(ComponentListMF.blackpowder), - new ItemStack(ComponentListMF.nitre), }); - - for (int id = 0; id < BlockListMF.metalBlocks.length; id++) { - BaseMaterialMF material = BaseMaterialMF.getMaterial(BlockListMF.metalBlocks[id]); - - for (ItemStack ingot : OreDictionary.getOres("ingot" + material.name)) { - GameRegistry.addRecipe(new ItemStack(BlockListMF.storage[id]), - new Object[] { "III", "III", "III", 'I', ingot }); - GameRegistry.addShapelessRecipe(new ItemStack(ingot.getItem(), 9), - new Object[] { BlockListMF.storage[id] }); - } - } - - KnowledgeListMF.fireclayR = MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ComponentListMF.fireclay, 4), - new Object[] { " C ", "CDC", " C ", - - 'D', ComponentListMF.kaolinite_dust, 'C', Items.clay_ball }); - KnowledgeListMF.fireBrickR = MineFantasyAPI - .addBasicCarpenterRecipe(new ItemStack(ComponentListMF.fireclay_brick), new Object[] { "C", - - 'C', ComponentListMF.fireclay }); - KnowledgeListMF.fireBricksR = MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(BlockListMF.firebricks), - new Object[] { "BB", "BB", - - 'B', ComponentListMF.strong_brick }); - KnowledgeListMF.fireBrickStairR = MineFantasyAPI - .addBasicCarpenterRecipe(new ItemStack(BlockListMF.firebrick_stair), new Object[] { "B ", "BB", - - 'B', ComponentListMF.strong_brick }); - BaseMaterialMF mat = BaseMaterialMF.iron; - - GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideSmall), - new Object[] { ComponentListMF.rawhideSmall, ComponentListMF.flux }); - GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideMedium), - new Object[] { ComponentListMF.rawhideMedium, ComponentListMF.flux }); - GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideLarge), - new Object[] { ComponentListMF.rawhideLarge, ComponentListMF.flux }); - - TanningRecipe.addRecipe(ComponentListMF.hideSmall, mat.craftTimeModifier * 2F, -1, - new ItemStack(Items.leather)); - TanningRecipe.addRecipe(ComponentListMF.hideMedium, mat.craftTimeModifier * 3F, -1, - new ItemStack(Items.leather, 3)); - TanningRecipe.addRecipe(ComponentListMF.hideLarge, mat.craftTimeModifier * 4F, -1, - new ItemStack(Items.leather, 5)); - TanningRecipe.addRecipe(Items.leather, mat.craftTimeModifier * 2F, -1, "shears", - new ItemStack(ComponentListMF.leather_strip, 4)); - - if (!ConfigHardcore.HCCRemoveBooksCraft) { - KnowledgeListMF.artBookR = MineFantasyAPI.addBasicCarpenterRecipe( - new ItemStack(ToolListMF.skillbook_artisanry), new Object[] { "T", "D", "B", 'T', - ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 1), 'B', Items.book, }); - KnowledgeListMF.conBookR = MineFantasyAPI.addBasicCarpenterRecipe( - new ItemStack(ToolListMF.skillbook_construction), new Object[] { "T", "D", "B", 'T', - ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 14), 'B', Items.book, }); - KnowledgeListMF.proBookR = MineFantasyAPI.addBasicCarpenterRecipe( - new ItemStack(ToolListMF.skillbook_provisioning), new Object[] { "T", "D", "B", 'T', - ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 2), 'B', Items.book, }); - KnowledgeListMF.engBookR = MineFantasyAPI.addBasicCarpenterRecipe( - new ItemStack(ToolListMF.skillbook_engineering), new Object[] { "T", "D", "B", 'T', - ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 12), 'B', Items.book, }); - KnowledgeListMF.comBookR = MineFantasyAPI.addBasicCarpenterRecipe( - new ItemStack(ToolListMF.skillbook_combat), new Object[] { "T", "D", "B", 'T', - ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 5), 'B', Items.book, }); - - KnowledgeListMF.artBook2R = MineFantasyAPI - .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_artisanry2), new Object[] { "T", "B", - 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_artisanry, }); - KnowledgeListMF.conBook2R = MineFantasyAPI - .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_construction2), new Object[] { "T", "B", - 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_construction, }); - KnowledgeListMF.proBook2R = MineFantasyAPI - .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_provisioning2), new Object[] { "T", "B", - 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_provisioning, }); - KnowledgeListMF.engBook2R = MineFantasyAPI - .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_engineering2), new Object[] { "T", "B", - 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_engineering, }); - KnowledgeListMF.comBook2R = MineFantasyAPI - .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_combat2), new Object[] { "T", "B", 'T', - ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_combat, }); - } - - GameRegistry.addShapedRecipe(ComponentListMF.plank.construct("ScrapWood"), - new Object[] { "S", "S", 'S', Items.stick, }); - - Object rock = ConfigHardcore.HCCallowRocks ? ComponentListMF.sharp_rock : Blocks.cobblestone; - KnowledgeListMF.dryrocksR = GameRegistry.addShapedRecipe(new ItemStack(ToolListMF.dryrocks), - new Object[] { "R ", " R", 'R', rock }); - - ((ConstructionBlockMF.StairsConstBlock) BlockListMF.mud_brick_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock) BlockListMF.mud_pavement_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock) BlockListMF.cobble_brick_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock) BlockListMF.cobble_pavement_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock) BlockListMF.reinforced_stone_brick_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock) BlockListMF.reinforced_stone_stair).addRecipe(); - - ((ConstructionBlockMF.StairsConstBlock) BlockListMF.yew_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock) BlockListMF.ironbark_stair).addRecipe(); - ((ConstructionBlockMF.StairsConstBlock) BlockListMF.ebony_stair).addRecipe(); - } - - private static void assembleWoodVariations(CustomMaterial material) { - // TODO - if (material.name != "RefinedWood") { - ArrayList list = OreDictionary.getOres("planks" + material.name); - if (list.isEmpty()) { - for (ItemStack planks : OreDictionary.getOres("plankWood")) { - if (planks.getItemDamage() == OreDictionary.WILDCARD_VALUE) { - ItemStack item = planks.copy(); - for (int i = 0; i < 16; i++) { - item.setItemDamage(i); - tryAddWoodPlanks(item, material); - CarpenterRecipes.tryAddSawPlanks(item, material); - } - } else { - tryAddWoodPlanks(planks, material); - CarpenterRecipes.tryAddSawPlanks(planks, material); - } - } - } else - for (ItemStack block : list) { - KnowledgeListMF.plankRecipe.add(GameRegistry.addShapedRecipe( - ComponentListMF.plank.construct(material.name, 4), new Object[] { "P", "P", 'P', block })); - CarpenterRecipes.addSawPlanks(block, material); - } - } - } - - private static void tryAddWoodPlanks(ItemStack planks, CustomMaterial material) { - String sub = material.name.substring(0, material.name.length() - 4).toLowerCase(); - - if (planks.getUnlocalizedName().toLowerCase().contains(sub)) { - KnowledgeListMF.plankRecipe.add(GameRegistry.addShapedRecipe( - ComponentListMF.plank.construct(material.name, 4), new Object[] { "P", "P", 'P', planks.copy() })); - } - } - - private static void addFoodOutput() { - KnowledgeListMF.cheeseOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cheese_wheel), - new Object[] { "F", 'F', FoodListMF.cheese_pot, }); - KnowledgeListMF.meatpieOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_meat), - new Object[] { "F", 'F', FoodListMF.pie_meat_cooked }); - KnowledgeListMF.shepardOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_shepards), - new Object[] { "F", 'F', FoodListMF.pie_shepard_cooked }); - KnowledgeListMF.appleOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_apple), - new Object[] { "F", 'F', FoodListMF.pie_apple_cooked }); - KnowledgeListMF.berryOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_berry), - new Object[] { "F", 'F', FoodListMF.pie_berry_cooked }); - KnowledgeListMF.pumpPieOut = GameRegistry.addShapedRecipe(new ItemStack(Items.pumpkin_pie), - new Object[] { "F", 'F', FoodListMF.pie_pumpkin_cooked }); - } + public static void init() { + addFoodOutput(); + TempRecipesMF.init();// TODO remove temp recipes + ForgingRecipes.init(); + CarpenterRecipes.init(); + SmeltingRecipesMF.init(); + SalvageRecipes.init(); + CookingRecipes.init(); + DragonforgedStyle.loadCrafting(); + OrnateStyle.loadCrafting(); + GameRegistry.addRecipe(new RecipeArmourDyeMF()); + + ArrayList wood = CustomMaterial.getList("wood"); + Iterator iteratorWood = wood.iterator(); + + KnowledgeListMF.stickRecipe = GameRegistry.addShapedRecipe(new ItemStack(Items.stick, 2), + new Object[]{"S", 'S', ComponentListMF.plank}); + GameRegistry.addShapedRecipe(new ItemStack(Items.stick, 2), + new Object[]{"S", 'S', ComponentListMF.plank_cut}); + + KnowledgeListMF.firepitRecipe = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.firepit), + new Object[]{" P ", "S S", 'S', Items.stick, 'P', ComponentListMF.plank}); + KnowledgeListMF.cooktopRecipe = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.roast), + new Object[]{"PSP", 'S', Blocks.cobblestone, 'P', ComponentListMF.plank}); + + GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.yew_planks, 4), new Object[]{BlockListMF.log_yew}); + GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.ironbark_planks, 4), + new Object[]{BlockListMF.log_ironbark}); + GameRegistry.addShapelessRecipe(new ItemStack(BlockListMF.ebony_planks, 4), + new Object[]{BlockListMF.log_ebony}); + + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + assembleWoodVariations(customMat); + } + + KnowledgeListMF.plantOilR = GameRegistry.addShapedRecipe(new ItemStack(ComponentListMF.plant_oil, 4), + new Object[]{" B ", "BFB", " B ", 'F', Items.wheat_seeds, 'B', FoodListMF.jug_empty}); + KnowledgeListMF.waterJugR = GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.jug_water, 4), + new Object[]{" B ", "BWB", " B ", 'W', Items.water_bucket, 'B', FoodListMF.jug_empty}); + KnowledgeListMF.sugarRecipe = GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.sugarpot), + new Object[]{"S", "S", "B", 'S', Items.sugar, 'B', ComponentListMF.clay_pot,}); + GameRegistry.addShapelessRecipe(new ItemStack(Items.sugar, 2), new Object[]{FoodListMF.sugarpot,}); + KnowledgeListMF.milkJugR = GameRegistry.addShapedRecipe(new ItemStack(FoodListMF.jug_milk, 4), + new Object[]{" B ", "BMB", " B ", 'M', Items.milk_bucket, 'B', FoodListMF.jug_empty}); + GameRegistry.addShapedRecipe(new ItemStack(Items.milk_bucket), + new Object[]{" B ", "BMB", " B ", 'M', Items.bucket, 'B', FoodListMF.jug_milk}); + GameRegistry.addShapedRecipe(new ItemStack(Items.water_bucket), + new Object[]{" B ", "BMB", " B ", 'M', Items.bucket, 'B', FoodListMF.jug_water}); + + GameRegistry.addRecipe(new RecipeSyringe()); + // Just a way on making the overpowered gunpowder from black powder + GameRegistry.addShapelessRecipe(new ItemStack(Items.gunpowder), + new Object[]{new ItemStack(ComponentListMF.blackpowder), new ItemStack(ComponentListMF.blackpowder), + new ItemStack(ComponentListMF.nitre),}); + + for (int id = 0; id < BlockListMF.metalBlocks.length; id++) { + BaseMaterialMF material = BaseMaterialMF.getMaterial(BlockListMF.metalBlocks[id]); + + for (ItemStack ingot : OreDictionary.getOres("ingot" + material.name)) { + GameRegistry.addRecipe(new ItemStack(BlockListMF.storage[id]), + new Object[]{"III", "III", "III", 'I', ingot}); + GameRegistry.addShapelessRecipe(new ItemStack(ingot.getItem(), 9), + new Object[]{BlockListMF.storage[id]}); + } + } + + KnowledgeListMF.fireclayR = MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(ComponentListMF.fireclay, 4), + new Object[]{" C ", "CDC", " C ", + + 'D', ComponentListMF.kaolinite_dust, 'C', Items.clay_ball}); + KnowledgeListMF.fireBrickR = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ComponentListMF.fireclay_brick), new Object[]{"C", + + 'C', ComponentListMF.fireclay}); + KnowledgeListMF.fireBricksR = MineFantasyAPI.addBasicCarpenterRecipe(new ItemStack(BlockListMF.firebricks), + new Object[]{"BB", "BB", + + 'B', ComponentListMF.strong_brick}); + KnowledgeListMF.fireBrickStairR = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(BlockListMF.firebrick_stair), new Object[]{"B ", "BB", + + 'B', ComponentListMF.strong_brick}); + BaseMaterialMF mat = BaseMaterialMF.iron; + + GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideSmall), + new Object[]{ComponentListMF.rawhideSmall, ComponentListMF.flux}); + GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideMedium), + new Object[]{ComponentListMF.rawhideMedium, ComponentListMF.flux}); + GameRegistry.addShapelessRecipe(new ItemStack(ComponentListMF.hideLarge), + new Object[]{ComponentListMF.rawhideLarge, ComponentListMF.flux}); + + TanningRecipe.addRecipe(ComponentListMF.hideSmall, mat.craftTimeModifier * 2F, -1, + new ItemStack(Items.leather)); + TanningRecipe.addRecipe(ComponentListMF.hideMedium, mat.craftTimeModifier * 3F, -1, + new ItemStack(Items.leather, 3)); + TanningRecipe.addRecipe(ComponentListMF.hideLarge, mat.craftTimeModifier * 4F, -1, + new ItemStack(Items.leather, 5)); + TanningRecipe.addRecipe(Items.leather, mat.craftTimeModifier * 2F, -1, "shears", + new ItemStack(ComponentListMF.leather_strip, 4)); + + if (!ConfigHardcore.HCCRemoveBooksCraft) { + KnowledgeListMF.artBookR = MineFantasyAPI.addBasicCarpenterRecipe( + new ItemStack(ToolListMF.skillbook_artisanry), new Object[]{"T", "D", "B", 'T', + ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 1), 'B', Items.book,}); + KnowledgeListMF.conBookR = MineFantasyAPI.addBasicCarpenterRecipe( + new ItemStack(ToolListMF.skillbook_construction), new Object[]{"T", "D", "B", 'T', + ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 14), 'B', Items.book,}); + KnowledgeListMF.proBookR = MineFantasyAPI.addBasicCarpenterRecipe( + new ItemStack(ToolListMF.skillbook_provisioning), new Object[]{"T", "D", "B", 'T', + ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 2), 'B', Items.book,}); + KnowledgeListMF.engBookR = MineFantasyAPI.addBasicCarpenterRecipe( + new ItemStack(ToolListMF.skillbook_engineering), new Object[]{"T", "D", "B", 'T', + ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 12), 'B', Items.book,}); + KnowledgeListMF.comBookR = MineFantasyAPI.addBasicCarpenterRecipe( + new ItemStack(ToolListMF.skillbook_combat), new Object[]{"T", "D", "B", 'T', + ComponentListMF.talisman_lesser, 'D', new ItemStack(Items.dye, 1, 5), 'B', Items.book,}); + + KnowledgeListMF.artBook2R = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_artisanry2), new Object[]{"T", "B", + 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_artisanry,}); + KnowledgeListMF.conBook2R = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_construction2), new Object[]{"T", "B", + 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_construction,}); + KnowledgeListMF.proBook2R = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_provisioning2), new Object[]{"T", "B", + 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_provisioning,}); + KnowledgeListMF.engBook2R = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_engineering2), new Object[]{"T", "B", + 'T', ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_engineering,}); + KnowledgeListMF.comBook2R = MineFantasyAPI + .addBasicCarpenterRecipe(new ItemStack(ToolListMF.skillbook_combat2), new Object[]{"T", "B", 'T', + ComponentListMF.talisman_greater, 'B', ToolListMF.skillbook_combat,}); + } + + GameRegistry.addShapedRecipe(ComponentListMF.plank.construct("ScrapWood"), + new Object[]{"S", "S", 'S', Items.stick,}); + + Object rock = ConfigHardcore.HCCallowRocks ? ComponentListMF.sharp_rock : Blocks.cobblestone; + KnowledgeListMF.dryrocksR = GameRegistry.addShapedRecipe(new ItemStack(ToolListMF.dryrocks), + new Object[]{"R ", " R", 'R', rock}); + + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.mud_brick_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.mud_pavement_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.cobble_brick_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.cobble_pavement_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.reinforced_stone_brick_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.reinforced_stone_stair).addRecipe(); + + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.yew_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.ironbark_stair).addRecipe(); + ((ConstructionBlockMF.StairsConstBlock) BlockListMF.ebony_stair).addRecipe(); + } + + private static void assembleWoodVariations(CustomMaterial material) { + // TODO + if (material.name != "RefinedWood") { + ArrayList list = OreDictionary.getOres("planks" + material.name); + if (list.isEmpty()) { + for (ItemStack planks : OreDictionary.getOres("plankWood")) { + if (planks.getItemDamage() == OreDictionary.WILDCARD_VALUE) { + ItemStack item = planks.copy(); + for (int i = 0; i < 16; i++) { + item.setItemDamage(i); + tryAddWoodPlanks(item, material); + CarpenterRecipes.tryAddSawPlanks(item, material); + } + } else { + tryAddWoodPlanks(planks, material); + CarpenterRecipes.tryAddSawPlanks(planks, material); + } + } + } else + for (ItemStack block : list) { + KnowledgeListMF.plankRecipe.add(GameRegistry.addShapedRecipe( + ComponentListMF.plank.construct(material.name, 4), new Object[]{"P", "P", 'P', block})); + CarpenterRecipes.addSawPlanks(block, material); + } + } + } + + private static void tryAddWoodPlanks(ItemStack planks, CustomMaterial material) { + String sub = material.name.substring(0, material.name.length() - 4).toLowerCase(); + + if (planks.getUnlocalizedName().toLowerCase().contains(sub)) { + KnowledgeListMF.plankRecipe.add(GameRegistry.addShapedRecipe( + ComponentListMF.plank.construct(material.name, 4), new Object[]{"P", "P", 'P', planks.copy()})); + } + } + + private static void addFoodOutput() { + KnowledgeListMF.cheeseOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cheese_wheel), + new Object[]{"F", 'F', FoodListMF.cheese_pot,}); + KnowledgeListMF.meatpieOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_meat), + new Object[]{"F", 'F', FoodListMF.pie_meat_cooked}); + KnowledgeListMF.shepardOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_shepards), + new Object[]{"F", 'F', FoodListMF.pie_shepard_cooked}); + KnowledgeListMF.appleOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_apple), + new Object[]{"F", 'F', FoodListMF.pie_apple_cooked}); + KnowledgeListMF.berryOut = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.pie_berry), + new Object[]{"F", 'F', FoodListMF.pie_berry_cooked}); + KnowledgeListMF.pumpPieOut = GameRegistry.addShapedRecipe(new ItemStack(Items.pumpkin_pie), + new Object[]{"F", 'F', FoodListMF.pie_pumpkin_cooked}); + } } diff --git a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java index 78960317..13ba4ac8 100644 --- a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java @@ -25,961 +25,961 @@ import net.minecraftforge.oredict.OreDictionary; public class CarpenterRecipes { - public static final String basic = "step.wood"; - public static final String chopping = "dig.wood"; - public static final String primitive = "minefantasy2:block.craftprimitive"; - public static final String sewing = "step.cloth"; - public static final String stonemason = "minefantasy2:block.hammercarpenter"; - public static final String snipping = "mob.sheep.shear"; - public static final String sawing = "minefantasy2:block.sawcarpenter"; - public static final String grinding = "dig.gravel"; - public static final String nailHammer = "minefantasy2:block.hammercarpenter"; - public static final String woodHammer = "minefantasy2:block.carpentermallet"; - public static final String mixing = "step.wood"; - public static final String spanner = "minefantasy2:block.twistbolt"; - - private static final Skill artisanry = SkillList.artisanry; - private static final Skill engineering = SkillList.engineering; - private static final Skill construction = SkillList.construction; - private static final Skill provisioning = SkillList.provisioning; - - public static void init() { - /* + public static final String basic = "step.wood"; + public static final String chopping = "dig.wood"; + public static final String primitive = "minefantasy2:block.craftprimitive"; + public static final String sewing = "step.cloth"; + public static final String stonemason = "minefantasy2:block.hammercarpenter"; + public static final String snipping = "mob.sheep.shear"; + public static final String sawing = "minefantasy2:block.sawcarpenter"; + public static final String grinding = "dig.gravel"; + public static final String nailHammer = "minefantasy2:block.hammercarpenter"; + public static final String woodHammer = "minefantasy2:block.carpentermallet"; + public static final String mixing = "step.wood"; + public static final String spanner = "minefantasy2:block.twistbolt"; + + private static final Skill artisanry = SkillList.artisanry; + private static final Skill engineering = SkillList.engineering; + private static final Skill construction = SkillList.construction; + private static final Skill provisioning = SkillList.provisioning; + + public static void init() { + /* * ArrayList wood = CustomMaterial.getList("wood"); Iterator * iteratorWood = wood.iterator(); while(iteratorWood.hasNext()) { * CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); * * } */ - assembleWoodBasic(); - CustomWoodRecipes.init(); - addDusts(); - addWoodworks(); - addStonemason(); - addCooking(); - addMisc(); - addEngineering(); - if (ConfigHardcore.HCCallowRocks) { - addPrimitive(); - } else { - addNonPrimitiveStone(); - } - MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.researchBook), "", sewing, "hands", -1, 1, - new Object[] { "B", 'B', Items.book, }); - - if (ConfigHardcore.HCCallowRocks) { - KnowledgeListMF.sharpRocksR = MineFantasyAPI.addCarpenterRecipe(null, - new ItemStack(ComponentListMF.sharp_rock, 8), "", stonemason, "hammer", -1, 10, - new Object[] { "S", 'S', Blocks.cobblestone, }); - - } else { - - } - Salvage.addSalvage(ToolListMF.dryrocks, Blocks.cobblestone); - - KnowledgeListMF.threadR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.thread, 4), - "commodities", sewing, "hands", -1, 5, new Object[] { "W", "S", 'W', Blocks.wool, 'S', Items.stick, }); - KnowledgeListMF.stringR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(Items.string), "commodities", - sewing, "hands", -1, 10, new Object[] { "T", "T", "T", "T", 'T', ComponentListMF.thread }); - - KnowledgeListMF.lStripsR = MineFantasyAPI.addCarpenterRecipe(null, - new ItemStack(ComponentListMF.leather_strip, 4), "commodities", snipping, "shears", -1, 10, - new Object[] { "L", 'L', Items.leather, }); - - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.swordTraining), nailHammer, "knife", 1, - 40, new Object[] { "NI ", "SIII", "NI ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', - Blocks.planks, }); - - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.waraxeTraining), nailHammer, "knife", 1, - 30, new Object[] { " II ", "SSIN", " I ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', - Blocks.planks, }); - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.maceTraining), nailHammer, "knife", 1, 35, - new Object[] { " II", "SSII", " N ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', - Blocks.planks, }); - MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.spearTraining), nailHammer, "knife", 1, - 20, new Object[] { " N ", "SSSI", " N ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', - Blocks.planks, }); - ItemStack scrapWood = ComponentListMF.plank.construct("ScrapWood"); - Salvage.addSalvage(ToolListMF.swordTraining, new ItemStack(Blocks.planks, 5), - new ItemStack(ComponentListMF.nail, 2), scrapWood); - Salvage.addSalvage(ToolListMF.waraxeTraining, new ItemStack(Blocks.planks, 4), ComponentListMF.nail, scrapWood, - scrapWood); - Salvage.addSalvage(ToolListMF.maceTraining, new ItemStack(Blocks.planks, 4), ComponentListMF.nail, scrapWood, - scrapWood); - Salvage.addSalvage(ToolListMF.waraxeTraining, Blocks.planks, new ItemStack(ComponentListMF.nail, 2), scrapWood, - scrapWood, scrapWood); - - KnowledgeListMF.badBandageR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(ToolListMF.bandage_crude, 2), "bandage", sewing, "needle", -1, 10, - new Object[] { "LLL", 'L', ComponentListMF.rawhideSmall, }); - - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_crude, 4), "bandage", sewing, - "needle", -1, 20, new Object[] { "LLL", 'L', ComponentListMF.rawhideMedium, }); - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_crude, 6), "bandage", sewing, - "needle", -1, 30, new Object[] { "LLL", 'L', ComponentListMF.rawhideLarge, }); - KnowledgeListMF.bandageR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(ToolListMF.bandage_wool, 4), "bandage", sewing, "needle", 1, 10, - new Object[] { "CTC", 'T', ComponentListMF.thread, 'C', Blocks.wool, }); - - KnowledgeListMF.goodBandageR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(ToolListMF.bandage_tough), "bandageadv", sewing, "needle", 2, 20, - new Object[] { "T", "L", "B", 'T', ComponentListMF.thread, 'L', ComponentListMF.leather_strip, 'B', - ToolListMF.bandage_wool }); - - KnowledgeListMF.roughHelmetR = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 1, 0), "craftArmourBasic", sewing, "needle", -1, 25, - new Object[] { "TLT", "S S", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, 'L', - Items.leather }); - KnowledgeListMF.roughChestR = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 1, 1), "craftArmourBasic", sewing, "needle", -1, 40, - new Object[] { "S S", "LLL", "TLT", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, - 'L', Items.leather }); - KnowledgeListMF.roughLegsR = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 1, 2), "craftArmourBasic", sewing, "needle", -1, 35, - new Object[] { "TLT", "L L", "S S", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, - 'L', Items.leather }); - KnowledgeListMF.roughBootsR = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 1, 3), "craftArmourBasic", sewing, "needle", -1, 20, - new Object[] { "T T", "S S", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, }); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), - new ItemStack(ComponentListMF.thread, 2), new ItemStack(ComponentListMF.leather_strip, 2), - Items.leather); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), - new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2), - new ItemStack(Items.leather, 4)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), - new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2), - new ItemStack(Items.leather, 3)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), - new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2)); - - KnowledgeListMF.reHelmetR = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 2, 0), "craftArmourLight", sewing, "needle", 1, 50, - new Object[] { "TTT", "UPU", 'T', ComponentListMF.thread, 'P', - ArmourListMF.armour(ArmourListMF.leather, 1, 0), 'U', Items.leather }); - KnowledgeListMF.reChestR = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 2, 1), "craftArmourLight", sewing, "needle", 1, 80, - new Object[] { "TTT", "UPU", 'T', ComponentListMF.thread, 'P', - ArmourListMF.armour(ArmourListMF.leather, 1, 1), 'U', Items.leather }); - KnowledgeListMF.reLegsR = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 2, 2), "craftArmourLight", sewing, "needle", 1, 70, - new Object[] { "TTT", "UPU", 'T', ComponentListMF.thread, 'P', - ArmourListMF.armour(ArmourListMF.leather, 1, 2), 'U', Items.leather }); - KnowledgeListMF.reBootsR = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 2, 3), "craftArmourLight", sewing, "needle", 1, 40, - new Object[] { "TTT", "UPU", 'T', ComponentListMF.thread, 'P', - ArmourListMF.armour(ArmourListMF.leather, 1, 3), 'U', Items.leather }); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 0), - ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), new ItemStack(ComponentListMF.thread, 3), - new ItemStack(Items.leather, 2)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 1), - ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), new ItemStack(ComponentListMF.thread, 3), - new ItemStack(Items.leather, 2)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 2), - ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), new ItemStack(ComponentListMF.thread, 3), - new ItemStack(Items.leather, 2)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 3), - ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), new ItemStack(ComponentListMF.thread, 3), - new ItemStack(Items.leather, 2)); - - // PADDING - KnowledgeListMF.padding[0] = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 4, 0), "craftArmourLight", sewing, "needle", 1, 50, - new Object[] { " W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 0), 'W', - Blocks.wool, 'S', ComponentListMF.thread, }); - KnowledgeListMF.padding[1] = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 4, 1), "craftArmourLight", sewing, "needle", 1, 80, - new Object[] { " W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 1), 'W', - Blocks.wool, 'S', ComponentListMF.thread, }); - KnowledgeListMF.padding[2] = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 4, 2), "craftArmourLight", sewing, "needle", 1, 70, - new Object[] { " W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 2), 'W', - Blocks.wool, 'S', ComponentListMF.thread, }); - KnowledgeListMF.padding[3] = MineFantasyAPI.addCarpenterRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 4, 3), "craftArmourLight", sewing, "needle", 1, 40, - new Object[] { " W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 3), 'W', - Blocks.wool, 'S', ComponentListMF.thread, }); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 0), - ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), new ItemStack(ComponentListMF.thread, 3), - Blocks.wool); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 1), - ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), new ItemStack(ComponentListMF.thread, 3), - Blocks.wool); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 2), - ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), new ItemStack(ComponentListMF.thread, 3), - Blocks.wool); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 3), - ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), new ItemStack(ComponentListMF.thread, 3), - Blocks.wool); - - KnowledgeListMF.repairBasicR = MineFantasyAPI.addCarpenterRecipe(artisanry, - new ItemStack(BlockListMF.repair_basic), "repair_basic", sewing, "needle", 1, 20, - new Object[] { "TTT", "FNH", "SLS", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, - 'L', Items.leather, 'F', Items.flint, 'H', CustomToolListMF.standard_hammer, 'N', - ComponentListMF.nail, }); - ItemStack bronzePlate = ComponentListMF.plate.createComm("bronze"); - KnowledgeListMF.repairAdvancedR = MineFantasyAPI.addCarpenterRecipe(artisanry, - new ItemStack(BlockListMF.repair_advanced), "repair_advanced", sewing, "needle", 2, 50, - new Object[] { "SCS", "PKH", "CSC", 'K', BlockListMF.repair_basic, 'P', bronzePlate, 'H', - CustomToolListMF.standard_hammer, 'C', Items.slime_ball, 'S', Items.string, }); - KnowledgeListMF.repairOrnateR = MineFantasyAPI.addCarpenterRecipe(artisanry, - new ItemStack(BlockListMF.repair_ornate), "repair_ornate", sewing, "needle", 3, 100, - new Object[] { "GDG", "LKL", "GLG", 'K', BlockListMF.repair_advanced, 'G', Items.gold_ingot, 'L', - new ItemStack(Items.dye, 1, 4), 'D', Items.diamond, }); - - Salvage.addSalvage(BlockListMF.repair_basic, new ItemStack(ComponentListMF.thread, 3), ComponentListMF.nail, - Items.flint, Items.leather, new ItemStack(ComponentListMF.leather_strip, 2)); - Salvage.addSalvage(BlockListMF.repair_advanced, BlockListMF.repair_basic, bronzePlate, - new ItemStack(Items.slime_ball, 3), new ItemStack(Items.string, 3)); - Salvage.addSalvage(BlockListMF.repair_ornate, BlockListMF.repair_advanced, new ItemStack(Items.gold_ingot, 4), - Items.diamond, new ItemStack(Items.dye, 3, 4)); - - KnowledgeListMF.trilogyRecipe = MineFantasyAPI.addShapelessCarpenterRecipe(artisanry, - new ItemStack(ComponentListMF.artefacts, 1, 3), "smeltMaster", basic, "hands", -1, 1, - new Object[] { new ItemStack(ComponentListMF.artefacts, 1, 0), - new ItemStack(ComponentListMF.artefacts, 1, 1), - new ItemStack(ComponentListMF.artefacts, 1, 2) }); - } - - public static void assembleWoodBasic() { - KnowledgeListMF.carpenterRecipe = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.carpenter), - new Object[] { "PBP", "P P", 'B', Blocks.crafting_table, 'P', ComponentListMF.plank }); - Salvage.addSalvage(BlockListMF.carpenter, ComponentListMF.plank.construct("ScrapWood", 4), - Blocks.crafting_table); - - KnowledgeListMF.nailPlanksR = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.nailed_planks), "refined_planks", nailHammer, "hammer", 1, 5, - new Object[] { "N ", "PP", "PP", 'N', ComponentListMF.nail, 'P', - ComponentListMF.plank.construct("OakWood"), }); - KnowledgeListMF.nailStairR = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.nailed_planks_stair), "refined_planks", nailHammer, "hammer", 1, 5, - new Object[] { "N ", "P ", "PP", 'N', ComponentListMF.nail, 'P', - ComponentListMF.plank.construct("OakWood"), }); - KnowledgeListMF.tannerRecipe = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.tanner), "", nailHammer, "hammer", -1, 10, - new Object[] { "PPP", "P P", "PPP", 'P', ComponentListMF.plank, }); - - KnowledgeListMF.clayWallR = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.clayWall, 4), "clay_wall", nailHammer, "hammer", 1, 2, new Object[] { "NPN", - "PCP", "NPN", 'N', ComponentListMF.nail, 'P', ComponentListMF.plank, 'C', Blocks.clay }); - - KnowledgeListMF.researchTableRecipe = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.research), "", nailHammer, "hammer", -1, 10, - new Object[] { "B", "C", 'B', ToolListMF.researchBook, 'C', BlockListMF.carpenter, }); - KnowledgeListMF.bSalvageR = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.salvage_basic), "", nailHammer, "hammer", -1, 10, new Object[] { "SFS", "PWP", - 'W', Blocks.crafting_table, 'S', Blocks.stone, 'F', Items.flint, 'P', ComponentListMF.plank }); - - KnowledgeListMF.framedGlassR = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.framed_glass), "", nailHammer, "hammer", -1, 10, - new Object[] { "PGP", 'P', ComponentListMF.plank, 'G', Blocks.glass }); - KnowledgeListMF.windowR = MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.window), "", - nailHammer, "hammer", -1, 10, - new Object[] { " P ", "PGP", " P ", 'P', ComponentListMF.plank, 'G', Blocks.glass }); - - Salvage.addSalvage(BlockListMF.framed_glass, ComponentListMF.plank.construct("ScrapWood", 2), Blocks.glass); - Salvage.addSalvage(BlockListMF.window, ComponentListMF.plank.construct("ScrapWood", 4), Blocks.glass); - Salvage.addSalvage(BlockListMF.clayWall, ComponentListMF.nail, ComponentListMF.plank.construct("ScrapWood"), - Items.clay_ball); - Salvage.addSalvage(BlockListMF.tanner, ComponentListMF.plank.construct("ScrapWood", 8)); - Salvage.addSalvage(BlockListMF.research, BlockListMF.carpenter); - Salvage.addSalvage(BlockListMF.salvage_basic, Items.flint, new ItemStack(Blocks.stone, 2), - ComponentListMF.plank.construct("ScrapWood", 2), Blocks.crafting_table); - } - - private static void addDusts() { - QuernRecipes.addRecipe(new ItemStack(Items.dye, 1, 3), new ItemStack(FoodListMF.coca_powder), 0);// ItemDye - QuernRecipes.addRecipe(Items.wheat, new ItemStack(FoodListMF.flour), 0); - QuernRecipes.addRecipe(Items.reeds, new ItemStack(FoodListMF.sugarpot), 0); - QuernRecipes.addRecipe(FoodListMF.breadroll, new ItemStack(FoodListMF.breadcrumbs), 0); - - QuernRecipes.addRecipe(FoodListMF.generic_meat_uncooked, new ItemStack(FoodListMF.generic_meat_mince_uncooked), - 0); - QuernRecipes.addRecipe(FoodListMF.generic_meat_strip_uncooked, - new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); - QuernRecipes.addRecipe(FoodListMF.generic_meat_chunk_uncooked, - new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); - QuernRecipes.addRecipe(FoodListMF.generic_meat_cooked, new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); - QuernRecipes.addRecipe(FoodListMF.generic_meat_strip_cooked, - new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); - QuernRecipes.addRecipe(FoodListMF.generic_meat_chunk_cooked, - new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); - - QuernRecipes.addRecipe(Items.coal, new ItemStack(ComponentListMF.coalDust), 0); - QuernRecipes.addRecipe(new ItemStack(Items.coal, 1, 1), new ItemStack(ComponentListMF.coalDust), 0); - QuernRecipes.addRecipe(ComponentListMF.kaolinite, new ItemStack(ComponentListMF.kaolinite_dust), 0); - QuernRecipes.addRecipe(Items.flint, new ItemStack(ComponentListMF.shrapnel), 0); - - QuernRecipes.addRecipe(ComponentListMF.flux, new ItemStack(ComponentListMF.flux_pot), 0); - - KnowledgeListMF.pieTrayRecipe = MineFantasyAPI.addCarpenterRecipe(null, - new ItemStack(ComponentListMF.pie_tray_uncooked), "", basic, "hands", -1, 10, - new Object[] { "CC", 'C', Items.clay_ball, }); - - KnowledgeListMF.potRecipe = MineFantasyAPI.addCarpenterRecipe(null, - new ItemStack(ComponentListMF.clay_pot_uncooked, 8), "", basic, "hands", -1, 5, - new Object[] { "C C", " CC ", 'C', Items.clay_ball, }); - KnowledgeListMF.mouldRecipe = MineFantasyAPI.addCarpenterRecipe(null, - new ItemStack(ComponentListMF.ingot_mould_uncooked), "crucible", basic, "hands", -1, 10, - new Object[] { "CCC", " C ", 'C', Items.clay_ball, }); - KnowledgeListMF.jugRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(FoodListMF.jug_uncooked, 4), - "", basic, "hands", -1, 8, new Object[] { "C ", "C C", " C ", 'C', Items.clay_ball, }); - KnowledgeListMF.blackpowderRec = MineFantasyAPI.addCarpenterRecipe(null, - new ItemStack(ComponentListMF.blackpowder, 2), "blackpowder", basic, "hands", -1, 2, - new Object[] { "NS", "CC", "PP", 'C', ComponentListMF.coalDust, 'N', ComponentListMF.nitre, 'S', - ComponentListMF.sulfur, 'P', ComponentListMF.clay_pot, }); - KnowledgeListMF.crudeBombR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ToolListMF.bomb_crude), "blackpowder", primitive, "hands", -1, 5, - new Object[] { "T", "B", "P", - - 'B', ComponentListMF.blackpowder, 'T', ComponentListMF.thread, 'P', Items.paper, }); - KnowledgeListMF.advblackpowderRec = MineFantasyAPI.addCarpenterRecipe(null, - new ItemStack(ComponentListMF.blackpowder_advanced), "advblackpowder", basic, "hands", -1, 10, - new Object[] { " B ", "RGR", " P ", 'B', ComponentListMF.blackpowder, 'G', Items.glowstone_dust, 'R', - Items.redstone, 'P', ComponentListMF.clay_pot, }); - KnowledgeListMF.magmaRefinedR = MineFantasyAPI.addCarpenterRecipe(null, - new ItemStack(ComponentListMF.magma_cream_refined), "firebomb", grinding, "pestle", -1, 10, - new Object[] { "B", "H", "C", "P", 'H', ComponentListMF.dragon_heart, 'B', Items.blaze_powder, 'C', - Items.magma_cream, 'P', ComponentListMF.clay_pot, }); - Salvage.addSalvage(ComponentListMF.magma_cream_refined, ComponentListMF.dragon_heart, Items.blaze_powder, - Items.magma_cream, ComponentListMF.clay_pot); - } - - private static void addWoodworks() { - KnowledgeListMF.refinedPlankBlockR = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.refined_planks), "refined_planks", nailHammer, "hammer", 1, 10, - new Object[] { "N ", "PP", "PP", 'N', ComponentListMF.nail, 'P', - ComponentListMF.plank.construct("RefinedWood"), }); - - KnowledgeListMF.refinedStairR = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.refined_planks_stair), "refined_planks", nailHammer, "hammer", 1, 10, - new Object[] { "N ", "P ", "PP", 'N', ComponentListMF.nail, 'P', - ComponentListMF.plank.construct("RefinedWood"), }); - Salvage.addSalvage(BlockListMF.nailed_planks, ComponentListMF.nail, - ComponentListMF.plank.construct("ScrapWood", 4)); - Salvage.addSalvage(BlockListMF.refined_planks, ComponentListMF.nail, - ComponentListMF.plank.construct("RefinedWood", 4)); - Salvage.addSalvage(BlockListMF.nailed_planks_stair, ComponentListMF.nail, - ComponentListMF.plank.construct("ScrapWood", 3)); - Salvage.addSalvage(BlockListMF.refined_planks_stair, ComponentListMF.nail, - ComponentListMF.plank.construct("RefinedWood", 3)); - - KnowledgeListMF.bellowsRecipe = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.bellows), "", nailHammer, "hammer", 1, 50, - new Object[] { "NNN", "PPP", "LL ", "PP ", 'N', ComponentListMF.nail, 'P', - ComponentListMF.plank.construct("RefinedWood"), 'L', Items.leather, }); - Salvage.addSalvage(BlockListMF.bellows, new ItemStack(ComponentListMF.nail, 3), - ComponentListMF.plank.construct("RefinedWood", 5), new ItemStack(Items.leather, 2)); - - KnowledgeListMF.woodTroughRecipe = MineFantasyAPI.addCarpenterRecipe(construction, - ((BlockWoodDecor) BlockListMF.trough_wood).construct("ScrapWood"), "", nailHammer, "hammer", -1, 20, - new Object[] { "P P", "PPP", - - 'P', ComponentListMF.plank, }); - - KnowledgeListMF.strongRackR = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.advTanner), "", nailHammer, "hammer", 1, 80, - new Object[] { "NNN", "PPP", "P P", "PPP", 'N', ComponentListMF.nail, 'P', - ComponentListMF.plank.construct("RefinedWood"), }); - Salvage.addSalvage(BlockListMF.advTanner, ComponentListMF.plank.construct("RefinedWood", 8), - new ItemStack(ComponentListMF.nail, 3)); - - MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.refined_planks), "paint_brush", - sewing, "brush", -1, 3, - new Object[] { "O", "P", 'O', ComponentListMF.plant_oil, 'P', BlockListMF.nailed_planks, }); - - PaintOilRecipe.addRecipe(BlockListMF.nailed_planks, BlockListMF.refined_planks); - PaintOilRecipe.addRecipe(BlockListMF.nailed_planks_stair, BlockListMF.refined_planks_stair); - - } - - private static void addStonemason() { - KnowledgeListMF.quernR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.quern), "", - stonemason, "hammer", -1, 10, new Object[] { "FSF", "SSS", 'F', Items.flint, 'S', Blocks.stone, }); - KnowledgeListMF.stoneovenRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.oven_stone), - "", stonemason, "hammer", -1, 10, - new Object[] { "S", "C", 'C', BlockListMF.roast, 'S', Blocks.stone, }); - - KnowledgeListMF.bloomeryR = MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.bloomery), - "bloomery", stonemason, "hammer", -1, 10, - new Object[] { " S ", "S S", "SCS", 'C', Blocks.coal_block, 'S', Blocks.stone, }); - KnowledgeListMF.crucibleRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, - new ItemStack(BlockListMF.crucible), "crucible", stonemason, "hammer", -1, 20, - new Object[] { "SSS", "S S", "SSS", 'S', Blocks.stone, }); - KnowledgeListMF.advCrucibleRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, - new ItemStack(BlockListMF.crucibleadv), "crucible2", basic, 40, - new Object[] { "SSS", "SCS", "SSS", 'S', ComponentListMF.fireclay, 'C', BlockListMF.crucible }); - Salvage.addSalvage(BlockListMF.crucible, new ItemStack(Blocks.stone, 8)); - Salvage.addSalvage(BlockListMF.crucibleadv, new ItemStack(ComponentListMF.fireclay, 8), BlockListMF.crucible); - - KnowledgeListMF.chimneyRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, - new ItemStack(BlockListMF.chimney_stone, 8), "", stonemason, "hammer", -1, 30, - new Object[] { "S S", "S S", "S S", 'S', Blocks.stone, }); - KnowledgeListMF.wideChimneyRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, - new ItemStack(BlockListMF.chimney_stone_wide), "", stonemason, "hammer", -1, 10, - new Object[] { "S", "C", 'C', BlockListMF.chimney_stone, 'S', Blocks.stone, }); - KnowledgeListMF.extractChimneyRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, - new ItemStack(BlockListMF.chimney_stone_extractor), "", stonemason, "hammer", -1, 15, - new Object[] { "C", 'C', BlockListMF.chimney_stone_wide, }); - - KnowledgeListMF.stoneAnvilRecipe = MineFantasyAPI.addCarpenterRecipe(null, - new ItemStack(BlockListMF.anvilStone), "", stonemason, "hammer", -1, 10, - new Object[] { "SS ", "SSS", " S ", 'S', Blocks.stone }); - KnowledgeListMF.forgeRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.forge), "", - stonemason, "hammer", -1, 10, new Object[] { "S S", "SCS", 'C', Items.coal, 'S', Blocks.stone }); - Salvage.addSalvage(BlockListMF.forge, new ItemStack(Blocks.stone, 4), Items.coal); - Salvage.addSalvage(BlockListMF.anvilStone, new ItemStack(Blocks.stone, 6)); - - Salvage.addSalvage(BlockListMF.chimney_stone, Blocks.stone); - Salvage.addSalvage(BlockListMF.chimney_stone_wide, BlockListMF.chimney_stone, Blocks.stone); - Salvage.addSalvage(BlockListMF.chimney_stone_extractor, BlockListMF.chimney_stone_wide); - Salvage.addSalvage(BlockListMF.quern, new ItemStack(Items.flint, 2), new ItemStack(Blocks.stone, 4)); - } - - private static void addCooking() { - String meatRaw = "rawMeat"; - String cookedMeat = "cookedMeat"; - OreDictionary.registerOre(cookedMeat, Items.cooked_beef); - OreDictionary.registerOre(cookedMeat, Items.cooked_chicken); - OreDictionary.registerOre(cookedMeat, Items.cooked_porkchop); - OreDictionary.registerOre(cookedMeat, FoodListMF.wolf_cooked); - OreDictionary.registerOre(cookedMeat, FoodListMF.horse_cooked); - OreDictionary.registerOre(cookedMeat, Items.cooked_fished); - OreDictionary.registerOre(cookedMeat, new ItemStack(Items.cooked_fished, 1, 1)); - addOreD("listAllporkcooked", cookedMeat); - addOreD("listAllmuttoncooked", cookedMeat); - addOreD("listAllbeefcooked", cookedMeat); - addOreD("listAllchickencooked", cookedMeat); - addOreD("listAllfishcooked", cookedMeat); - - OreDictionary.registerOre(meatRaw, FoodListMF.guts); - OreDictionary.registerOre(meatRaw, Items.beef); - OreDictionary.registerOre(meatRaw, Items.chicken); - OreDictionary.registerOre(meatRaw, Items.porkchop); - OreDictionary.registerOre(meatRaw, FoodListMF.wolf_raw); - OreDictionary.registerOre(meatRaw, FoodListMF.horse_raw); - OreDictionary.registerOre(meatRaw, Items.fish); - OreDictionary.registerOre(meatRaw, new ItemStack(Items.fish, 1, 1)); - addOreD("listAllporkraw", meatRaw); - addOreD("listAllmuttonraw", meatRaw); - addOreD("listAllbeefraw", meatRaw); - addOreD("listAllchickenraw", meatRaw); - addOreD("listAllfishraw", meatRaw); - - KnowledgeListMF.curdRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.curds), - "", basic, "hands", -1, 10, new Object[] { "T", "S", "M", "P", 'P', ComponentListMF.clay_pot, 'T', - FoodListMF.salt, 'S', FoodListMF.sugarpot, 'M', FoodListMF.jug_milk, }); - - KnowledgeListMF.oatsRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.oats), "", - chopping, "knife", -1, 20, new Object[] { "M", "W", "S", "B", 'S', Items.wheat_seeds, 'W', Items.wheat, - 'M', FoodListMF.jug_milk, 'B', Items.bowl }); - KnowledgeListMF.doughRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.dough), - "", basic, "hands", -1, 10, - new Object[] { "W", "F", 'W', FoodListMF.jug_water, 'F', FoodListMF.flour, }); - KnowledgeListMF.pastryRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.pastry), - "", basic, "hands", -1, 10, - new Object[] { " S ", "FEF", 'F', FoodListMF.flour, 'E', Items.egg, 'S', FoodListMF.salt, }); - KnowledgeListMF.breadRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.raw_bread), "", basic, "hands", -1, 15, - new Object[] { "DDD", 'D', FoodListMF.dough, }); - KnowledgeListMF.sweetrollRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.sweetroll_raw), "sweetroll", basic, 5, - new Object[] { " M ", "FES", "BBB", 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'B', - FoodListMF.berries, 'E', Items.egg, 'F', FoodListMF.flour, }); - KnowledgeListMF.icingRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.icing), - "", mixing, "spoon", -1, 10, new Object[] { "W", "S", "B", 'W', FoodListMF.jug_water, 'S', - FoodListMF.sugarpot, 'B', ComponentListMF.clay_pot, }); - KnowledgeListMF.chocoRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.chocolate), "icing", mixing, "spoon", -1, 10, - new Object[] { " M ", "SCS", " B ", 'C', FoodListMF.coca_powder, 'M', FoodListMF.jug_milk, 'S', - FoodListMF.sugarpot, 'B', ComponentListMF.clay_pot, }); - KnowledgeListMF.custardRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.custard), "icing", mixing, "spoon", -1, 10, - new Object[] { " M ", "SES", " B ", 'E', Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, - 'B', ComponentListMF.clay_pot, }); - KnowledgeListMF.iceSR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.sweetroll), - "sweetroll", basic, "knife", -1, 15, - new Object[] { "I", "R", 'I', FoodListMF.icing, 'R', FoodListMF.sweetroll_uniced, }); - KnowledgeListMF.eclairDoughR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.eclair_raw), "eclair", basic, 8, - new Object[] { "SSS", "PPP", 'P', FoodListMF.pastry, 'S', FoodListMF.sugarpot, }); - KnowledgeListMF.eclairIceR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.eclair_empty), "eclair", basic, "knife", 2, 20, - new Object[] { "C", "E", 'C', FoodListMF.chocolate, 'E', FoodListMF.eclair_uniced, }); - KnowledgeListMF.eclairFillR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.eclair), - "eclair", basic, "knife", 2, 20, - new Object[] { "C", "E", 'C', FoodListMF.custard, 'E', FoodListMF.eclair_empty, }); - for (ItemStack food : OreDictionary.getOres(meatRaw)) { - int size = getSize(food); - KnowledgeListMF.meatRecipes.add(MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.generic_meat_uncooked, size), "", chopping, "knife", -1, 15, - new Object[] { "M", 'M', food, })); - } - for (ItemStack food : OreDictionary.getOres(cookedMeat)) { - int size = 1; - KnowledgeListMF.meatRecipes.add( - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_cooked, size), - "", chopping, "knife", -1, 15, new Object[] { "M", 'M', food, })); - } - KnowledgeListMF.meatStripR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.generic_meat_strip_uncooked), "", chopping, "knife", -1, 5, - new Object[] { "M", 'M', FoodListMF.generic_meat_uncooked, }); - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_strip_cooked), "", - chopping, "knife", -1, 5, new Object[] { "M", 'M', FoodListMF.generic_meat_cooked, }); - KnowledgeListMF.meatHunkR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.generic_meat_chunk_uncooked), "", chopping, "knife", -1, 5, - new Object[] { "M", 'M', FoodListMF.generic_meat_strip_uncooked, }); - MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_chunk_cooked), "", - chopping, "knife", -1, 5, new Object[] { "M", 'M', FoodListMF.generic_meat_strip_cooked, }); - KnowledgeListMF.gutsRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.guts), "", - chopping, "knife", 1, 8, new Object[] { "MMMM", 'M', Items.rotten_flesh, }); - - KnowledgeListMF.stewRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.stew), "", - chopping, "knife", -1, 15, - new Object[] { "M", "B", 'M', FoodListMF.generic_meat_chunk_cooked, 'B', Items.bowl }); - KnowledgeListMF.jerkyRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.jerky, 1), "jerky", chopping, "knife", 2, 20, - new Object[] { "S", "M", 'S', FoodListMF.salt, 'M', FoodListMF.generic_meat_strip_cooked, }); - KnowledgeListMF.saussageR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.saussage_raw, 4), "saussage", chopping, "knife", 2, 30, - new Object[] { " G ", "MMM", "BES", 'G', FoodListMF.guts, 'E', Items.egg, 'S', FoodListMF.salt, 'B', - FoodListMF.breadcrumbs, 'M', FoodListMF.generic_meat_mince_uncooked, }); - KnowledgeListMF.meatPieRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.pie_meat_uncooked), "meatpie", chopping, "knife", 2, 150, - new Object[] { " P ", "MMM", " P ", " T ", 'P', FoodListMF.pastry, 'M', - FoodListMF.generic_meat_mince_cooked, 'T', FoodListMF.pie_tray, }); - KnowledgeListMF.breadSliceR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.breadSlice, 12), "", "step.cloth", "knife", -1, 10, - new Object[] { "B", 'B', Items.bread, }); - KnowledgeListMF.sandwitchRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.sandwitch_meat), "sandwitch", chopping, "hands", -1, 4, - new Object[] { "B", "C", "M", "B", 'C', FoodListMF.cheese_slice, 'M', FoodListMF.generic_meat_cooked, - 'B', FoodListMF.breadSlice }); - KnowledgeListMF.sandwitchBigRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.sandwitch_big), "sandwitchBig", chopping, "knife", 1, 10, - new Object[] { "CSC", "MBM", 'S', FoodListMF.salt, 'C', FoodListMF.cheese_slice, 'M', - FoodListMF.generic_meat_cooked, 'B', Items.bread }); - KnowledgeListMF.shepardRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.pie_shepard_uncooked), "shepardpie", chopping, "knife", 3, 200, - new Object[] { "PFP", "MMM", "CFC", " T ", 'C', Items.carrot, 'P', Items.potato, 'F', FoodListMF.pastry, - 'M', FoodListMF.generic_meat_mince_cooked, 'T', FoodListMF.pie_tray, }); - - KnowledgeListMF.appleR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.pie_apple_uncooked), "applepie", chopping, "knife", 2, 120, - new Object[] { "SPS", "MMM", "SPS", " T ", 'S', FoodListMF.sugarpot, 'P', FoodListMF.pastry, 'M', - Items.apple, 'T', FoodListMF.pie_tray, }); - KnowledgeListMF.pumpPieR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.pie_pumpkin_uncooked), "bread", chopping, "knife", 1, 50, - new Object[] { "SMS", "SPS", " T ", 'S', FoodListMF.sugarpot, 'P', FoodListMF.pastry, 'M', - Blocks.pumpkin, 'T', FoodListMF.pie_tray, }); - KnowledgeListMF.berryR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.pie_berry_uncooked), "berrypie", chopping, "knife", 2, 100, - new Object[] { "SPS", "MMM", "SPS", " T ", 'S', FoodListMF.sugarpot, 'P', FoodListMF.pastry, 'M', - FoodListMF.berries, 'T', FoodListMF.pie_tray, }); - - KnowledgeListMF.simpCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.cake_simple_raw), "bread", mixing, "spoon", -1, 15, - new Object[] { "MMM", "SES", "FFF", " T ", 'F', FoodListMF.flour, 'E', Items.egg, 'M', - FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin, }); - - KnowledgeListMF.cakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_raw), - "cake", mixing, "spoon", -1, 20, new Object[] { "SMS", "SES", "FFF", " T ", 'F', FoodListMF.flour, 'E', - Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin, }); - KnowledgeListMF.carrotCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.cake_carrot_raw), "carrotcake", mixing, "spoon", -1, 25, - new Object[] { "SMS", "SES", "CCC", "FTF", 'C', Items.carrot, 'F', FoodListMF.flour, 'E', Items.egg, - 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin, }); - KnowledgeListMF.chocoCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.cake_choc_raw), "chococake", mixing, "spoon", -1, 25, - new Object[] { "SMS", "SES", "CCC", "FTF", 'C', FoodListMF.chocolate, 'F', FoodListMF.flour, 'E', - Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin, }); - KnowledgeListMF.bfCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_bf_raw), - "bfcake", mixing, "spoon", -1, 30, - new Object[] { "SMMS", "SEES", "CBBC", "FTFF", 'B', FoodListMF.berriesJuicy, 'C', FoodListMF.chocolate, - 'F', FoodListMF.flour, 'E', Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', - FoodListMF.cake_tin, }); - KnowledgeListMF.simpCakeOut = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(Items.cake), - "bread", basic, "knife", -1, 10, - new Object[] { "I", "R", 'I', FoodListMF.icing, 'R', FoodListMF.cake_simple_uniced, }); - - KnowledgeListMF.cakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(BlockListMF.cake_vanilla), - "cake", basic, "knife", -1, 60, - new Object[] { "III", " R ", 'I', FoodListMF.icing, 'R', FoodListMF.cake_uniced, }); - KnowledgeListMF.carrotCakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(BlockListMF.cake_carrot), "carrotcake", basic, "knife", -1, 60, - new Object[] { "III", " R ", 'I', FoodListMF.icing, 'R', FoodListMF.cake_carrot_uniced, }); - KnowledgeListMF.chocoCakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(BlockListMF.cake_chocolate), "chococake", basic, "knife", -1, 60, new Object[] { "ICI", - " R ", 'C', FoodListMF.chocolate, 'I', FoodListMF.icing, 'R', FoodListMF.cake_choc_uniced, }); - KnowledgeListMF.bfCakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(BlockListMF.cake_bf), - "bfcake", basic, "knife", -1, 100, new Object[] { "BBB", "III", "CRC", 'C', FoodListMF.chocolate, 'B', - FoodListMF.berries, 'I', FoodListMF.icing, 'R', FoodListMF.cake_bf_uniced, }); - - KnowledgeListMF.cheeserollR = MineFantasyAPI.addCarpenterRecipe(provisioning, - new ItemStack(FoodListMF.cheese_roll), "cheeseroll", chopping, "knife", 1, 30, - new Object[] { "C", "R", 'C', FoodListMF.cheese_slice, 'R', FoodListMF.breadroll, }); - } - - private static void addOreD(String list, String mfList) { - for (ItemStack stack : OreDictionary.getOres(list)) { - OreDictionary.registerOre(mfList, stack); - } - } - - private static int getSize(ItemStack food) { - if (food != null && food.getItem() instanceof ItemFood) { - int feed = ((ItemFood) food.getItem()).func_150905_g(food); - return Math.max(1, feed - 1); - } - return 1; - } - - private static void addMisc() { - // Fletching - KnowledgeListMF.fletchingR = MineFantasyAPI.addCarpenterRecipe(artisanry, - new ItemStack(ComponentListMF.fletching, 16), "arrows", chopping, 4, new Object[] { "T", "F", - - 'F', Items.feather, 'T', ComponentListMF.plank, }); - KnowledgeListMF.fletchingR2 = MineFantasyAPI.addCarpenterRecipe(artisanry, - new ItemStack(ComponentListMF.fletching, 4), "arrows", chopping, 4, new Object[] { " T ", "PPP", - - 'P', Items.paper, 'T', ComponentListMF.plank, }); - - // BOMBS - KnowledgeListMF.bombCaseCeramicR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.bomb_casing_uncooked, 2), "bombCeramic", basic, 2, - new Object[] { " C ", "C C", " C ", 'C', Items.clay_ball, }); - KnowledgeListMF.mineCaseCeramicR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.mine_casing_uncooked), "mineCeramic", basic, 2, - new Object[] { " P ", "C C", " C ", - - 'P', Blocks.stone_pressure_plate, 'C', Items.clay_ball, }); - KnowledgeListMF.bombCaseCrystalR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.bomb_casing_crystal), "bombCrystal", basic, 10, - new Object[] { " D ", "R R", " B ", 'B', Items.glass_bottle, 'D', ComponentListMF.diamond_shards, 'R', - Items.redstone }); - KnowledgeListMF.mineCaseCrystalR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.mine_casing_crystal), "mineCrystal", basic, 10, - new Object[] { " P ", "RDR", " B ", 'P', Blocks.heavy_weighted_pressure_plate, 'B', Items.glass_bottle, - 'D', ComponentListMF.diamond_shards, 'R', Items.redstone }); - Salvage.addSalvage(ComponentListMF.bomb_casing_uncooked, new ItemStack(Items.clay_ball, 2)); - Salvage.addSalvage(ComponentListMF.mine_casing_uncooked, new ItemStack(Items.clay_ball, 3), - Blocks.stone_pressure_plate); - - Salvage.addSalvage(ComponentListMF.bomb_casing_crystal, Items.glass_bottle, ComponentListMF.diamond_shards, - new ItemStack(Items.redstone, 2)); - Salvage.addSalvage(ComponentListMF.mine_casing_crystal, Blocks.heavy_weighted_pressure_plate, - Items.glass_bottle, ComponentListMF.diamond_shards, new ItemStack(Items.redstone, 2)); - - KnowledgeListMF.bombFuseR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.bomb_fuse, 8), "bombs", basic, 4, new Object[] { "R", "C", "S", 'S', - ComponentListMF.thread, 'C', ComponentListMF.coalDust, 'R', Items.redstone, }); - KnowledgeListMF.longFuseR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.bomb_fuse_long), "bombs", basic, 1, - new Object[] { "F", "R", "F", 'F', ComponentListMF.bomb_fuse, 'R', Items.redstone, }); - Salvage.addSalvage(ComponentListMF.bomb_fuse_long, new ItemStack(ComponentListMF.bomb_fuse, 2), Items.redstone); - - KnowledgeListMF.thatchR = MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.thatch), "", - "dig.grass", "hands", -1, 1, new Object[] { "HH", "HH", 'H', new ItemStack(Blocks.tallgrass, 1, 1) }); - KnowledgeListMF.thatchStairR = MineFantasyAPI.addCarpenterRecipe(construction, - new ItemStack(BlockListMF.thatch_stair), "", "dig.grass", "hands", -1, 1, - new Object[] { "H ", "HH", 'H', new ItemStack(Blocks.tallgrass, 1, 1) }); - Salvage.addSalvage(BlockListMF.thatch_stair, new ItemStack(Blocks.tallgrass, 3, 1)); - Salvage.addSalvage(BlockListMF.thatch, new ItemStack(Blocks.tallgrass, 4, 1)); - - KnowledgeListMF.apronRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ArmourListMF.leatherapron), - "", sewing, "hands", -1, 1, new Object[] { "LCL", " L ", 'L', Items.leather, 'C', Items.coal, }); - Salvage.addSalvage(ArmourListMF.leatherapron, new ItemStack(Items.leather, 3), Items.coal); - - KnowledgeListMF.hideHelmR = MineFantasyAPI.addCarpenterRecipe(null, - ArmourListMF.armour(ArmourListMF.leather, 0, 0), "", sewing, "hands", -1, 1, - new Object[] { "H", "C", "H", 'H', ComponentListMF.hideSmall, 'C', Blocks.wool, }); - KnowledgeListMF.hideChestR = MineFantasyAPI.addCarpenterRecipe(null, - ArmourListMF.armour(ArmourListMF.leather, 0, 1), "", sewing, "hands", -1, 1, - new Object[] { "H", "C", 'H', ComponentListMF.hideLarge, 'C', Blocks.wool, }); - KnowledgeListMF.hideLegsR = MineFantasyAPI.addCarpenterRecipe(null, - ArmourListMF.armour(ArmourListMF.leather, 0, 2), "", sewing, "hands", -1, 1, - new Object[] { "H", "C", 'H', ComponentListMF.hideMedium, 'C', Blocks.wool, }); - KnowledgeListMF.hideBootsR = MineFantasyAPI.addCarpenterRecipe(null, - ArmourListMF.armour(ArmourListMF.leather, 0, 3), "", sewing, "hands", -1, 1, - new Object[] { "H", "C", 'H', ComponentListMF.hideSmall, 'C', Blocks.wool, }); - - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 0), - new ItemStack(ComponentListMF.hideSmall, 2), Blocks.wool); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 1), ComponentListMF.hideLarge, Blocks.wool); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 2), ComponentListMF.hideMedium, - Blocks.wool); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 3), ComponentListMF.hideSmall, Blocks.wool); - - KnowledgeListMF.bedrollR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.bedroll), "", - sewing, "needle", -1, 50, - new Object[] { "TLT", "CCC", 'C', Blocks.wool, 'T', ComponentListMF.thread, 'L', Items.leather }); - Salvage.addSalvage(ToolListMF.bedroll, new ItemStack(Blocks.wool, 3), Items.leather, - new ItemStack(ComponentListMF.thread, 3)); - } - - public static void addCrossbows() { - // CROSSBOWS - KnowledgeListMF.crossHandleWoodR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.crossbow_handle_wood), "crossShafts", nailHammer, "hammer", 2, 150, - new Object[] { "N N", "PP ", " P ", 'P', ComponentListMF.plank.construct("RefinedWood"), 'N', - ComponentListMF.nail }); - KnowledgeListMF.crossStockWoodR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.crossbow_stock_wood), "crossShafts", nailHammer, "hammer", 2, 300, - new Object[] { "NN N", "PPPP", " PPP", 'P', ComponentListMF.plank.construct("RefinedWood"), 'N', - ComponentListMF.nail }); - KnowledgeListMF.crossStockIronR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.crossbow_stock_iron), "crossShaftAdvanced", spanner, "spanner", 2, 300, - new Object[] { " BBB", "BOGG", "SWSS", " ", 'O', Blocks.obsidian, 'G', - ComponentListMF.tungsten_gears, 'W', ComponentListMF.crossbow_stock_wood, 'S', - ComponentListMF.iron_strut, 'B', ComponentListMF.bolt, }); - - KnowledgeListMF.crossHeadLightR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.cross_arms_light), "crossHeads", nailHammer, "hammer", 2, 200, - new Object[] { "PPP", "NSN", " P ", 'P', ComponentListMF.plank.construct("RefinedWood"), 'N', - ComponentListMF.nail, 'S', Items.string, }); - KnowledgeListMF.crossHeadMediumR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.cross_arms_basic), "crossHeads", nailHammer, "hammer", 2, 250, - new Object[] { "NNN", "PAP", 'N', ComponentListMF.nail, 'P', - ComponentListMF.plank.construct("RefinedWood"), 'A', ComponentListMF.cross_arms_light, }); - KnowledgeListMF.crossHeadHeavyR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.cross_arms_heavy), "crossHeads", nailHammer, "hammer", 2, 350, - new Object[] { "NNN", "PAP", 'N', ComponentListMF.nail, 'P', - ComponentListMF.plank.construct("RefinedWood"), 'A', ComponentListMF.cross_arms_basic, }); - KnowledgeListMF.crossHeadAdvancedR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.cross_arms_advanced), "crossHeadAdvanced", nailHammer, "hammer", 2, 350, - new Object[] { "NRN", "RGR", " A ", 'G', ComponentListMF.tungsten_gears, 'N', ComponentListMF.nail, 'R', - ComponentListMF.steel_tube, 'A', ComponentListMF.cross_arms_basic, }); - - KnowledgeListMF.crossAmmoR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.cross_ammo), "crossAmmo", nailHammer, "hammer", 2, 200, - new Object[] { "NNN", "P P", "PGP", "PPP", 'G', ComponentListMF.tungsten_gears, 'P', - ComponentListMF.plank.construct("RefinedWood"), 'N', ComponentListMF.nail, }); - KnowledgeListMF.crossScopeR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.cross_scope), "crossScope", spanner, "spanner", 2, 150, - new Object[] { "BSB", "GP ", 'G', ComponentListMF.tungsten_gears, 'S', ToolListMF.spyglass, 'P', - ComponentListMF.plank.construct("RefinedWood"), 'B', ComponentListMF.bolt, }); - Salvage.addSalvage(ComponentListMF.cross_arms_light, new ItemStack(ComponentListMF.nail, 2), Items.string, - ComponentListMF.plank.construct("RefinedWood", 4)); - Salvage.addSalvage(ComponentListMF.cross_arms_basic, new ItemStack(ComponentListMF.nail, 3), - ComponentListMF.cross_arms_light, ComponentListMF.plank.construct("RefinedWood", 2)); - Salvage.addSalvage(ComponentListMF.cross_arms_heavy, new ItemStack(ComponentListMF.nail, 3), - ComponentListMF.cross_arms_basic, ComponentListMF.plank.construct("RefinedWood", 2)); - Salvage.addSalvage(ComponentListMF.cross_arms_advanced, ComponentListMF.tungsten_gears, - new ItemStack(ComponentListMF.nail, 2), ComponentListMF.cross_arms_basic, - new ItemStack(ComponentListMF.steel_tube, 3)); - - Salvage.addSalvage(ComponentListMF.cross_scope, ComponentListMF.tungsten_gears, ToolListMF.spyglass, - new ItemStack(ComponentListMF.bolt, 2), ComponentListMF.plank.construct("RefinedWood")); - Salvage.addSalvage(ComponentListMF.cross_ammo, ComponentListMF.tungsten_gears, - new ItemStack(ComponentListMF.nail, 3), ComponentListMF.plank.construct("RefinedWood", 7)); - Salvage.addSalvage(ComponentListMF.crossbow_handle_wood, new ItemStack(ComponentListMF.nail, 2), - ComponentListMF.plank.construct("RefinedWood", 3)); - Salvage.addSalvage(ComponentListMF.crossbow_stock_wood, new ItemStack(ComponentListMF.nail, 3), - ComponentListMF.plank.construct("RefinedWood", 7)); - Salvage.addSalvage(ComponentListMF.crossbow_stock_iron, new ItemStack(ComponentListMF.tungsten_gears, 2), - Blocks.obsidian, new ItemStack(ComponentListMF.bolt, 4), new ItemStack(ComponentListMF.iron_strut, 3), - ComponentListMF.crossbow_stock_wood); - } - - private static void addEngineering() { - addCrossbows(); - KnowledgeListMF.bombBenchCraft = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(BlockListMF.bombBench), "bombs", spanner, "spanner", 0, 150, new Object[] { "BFB", "BCB", - 'B', ComponentListMF.bolt, 'F', ComponentListMF.iron_frame, 'C', BlockListMF.carpenter, }); - KnowledgeListMF.bombPressCraft = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(BlockListMF.bombPress), "bpress", spanner, "spanner", 3, 200, - new Object[] { "BFB", "GGL", "SPS", 'S', ComponentListMF.iron_strut, 'B', ComponentListMF.bolt, 'F', - ComponentListMF.iron_frame, 'L', Blocks.lever, 'P', - new ItemStack(CustomToolListMF.standard_spanner, 1, 0), 'G', ComponentListMF.bronze_gears, }); - - KnowledgeListMF.crossBenchCraft = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(BlockListMF.crossbowBench), "crossbows", spanner, "spanner", 0, 200, - new Object[] { " F ", "PSP", "NCN", 'F', ComponentListMF.iron_frame, 'P', ComponentListMF.plank, 'N', - ComponentListMF.bolt, 'S', Items.string, 'C', BlockListMF.carpenter, }); - - KnowledgeListMF.engTannerR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(BlockListMF.engTanner), "engTanner", spanner, "spanner", 3, 300, - new Object[] { "BLB", "SPS", "GGG", "SFS", 'S', ComponentListMF.iron_strut, 'B', ComponentListMF.bolt, - 'F', ComponentListMF.iron_frame, 'L', Blocks.lever, 'P', - new ItemStack(CustomToolListMF.standard_knife, 1, 0), 'G', ComponentListMF.bronze_gears, }); - ItemStack blackPlate = ComponentListMF.plate.createComm("blackSteel"); - KnowledgeListMF.advancedForgeR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(BlockListMF.forge_metal), "advforge", spanner, "spanner", 4, 400, - new Object[] { " T ", "FRRF", "PPPP", "BBBB", 'B', ComponentListMF.bolt, 'F', - ComponentListMF.iron_frame, 'T', ToolListMF.engin_anvil_tools, 'P', blackPlate, 'R', - Blocks.redstone_block, }); - ItemStack steelPlate = ComponentListMF.plate.createComm("steel"); - KnowledgeListMF.autoCrucibleR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(BlockListMF.crucibleauto), "advcrucible", spanner, "spanner", 4, 200, - new Object[] { " T ", "PCP", "PGP", "BBB", 'B', ComponentListMF.bolt, 'C', BlockListMF.crucibleadv, 'G', - ComponentListMF.tungsten_gears, 'T', ToolListMF.engin_anvil_tools, 'P', steelPlate }); - KnowledgeListMF.spyglassR = MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ToolListMF.spyglass), - "spyglass", spanner, "spanner", 1, 300, - new Object[] { " T ", "BCB", "GPG", 'C', ComponentListMF.bronze_gears, 'G', Blocks.glass, 'B', - ComponentListMF.bolt, 'T', ToolListMF.engin_anvil_tools, 'P', ComponentListMF.steel_tube, }); - - KnowledgeListMF.syringeR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ToolListMF.syringe_empty), "syringe", spanner, "spanner", 1, 200, - new Object[] { "E", "T", "B", "N", 'E', ToolListMF.engin_anvil_tools, 'T', ComponentListMF.steel_tube, - 'B', Items.glass_bottle, 'N', new ItemStack(CustomToolListMF.standard_needle), }); - - KnowledgeListMF.parachuteR = MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ToolListMF.parachute), - "parachute", sewing, "needle", 1, 350, - new Object[] { "TTT", "CCC", "BEB", "BLB", 'E', ToolListMF.engin_anvil_tools, 'T', - ComponentListMF.thread, 'B', ComponentListMF.leather_strip, 'L', Items.leather, 'C', - Blocks.wool, }); - KnowledgeListMF.cogShaftR = MineFantasyAPI.addCarpenterRecipe(engineering, - new ItemStack(ComponentListMF.cogwork_shaft), "cogArmour", spanner, "spanner", 4, 150, - new Object[] { "BPB", "SGS", "BFB", - - 'P', Blocks.piston, 'G', ComponentListMF.tungsten_gears, 'B', ComponentListMF.bolt, 'F', - ComponentListMF.iron_frame, 'S', ComponentListMF.iron_strut, }); - Salvage.addSalvage(ComponentListMF.cogwork_shaft, new ItemStack(ComponentListMF.iron_strut, 2), - new ItemStack(ComponentListMF.bolt, 4), ComponentListMF.iron_frame, Blocks.piston, - ComponentListMF.tungsten_gears); - - Salvage.addSalvage(BlockListMF.crucibleauto, new ItemStack(ComponentListMF.bolt, 3), - ComponentListMF.tungsten_gears, BlockListMF.crucibleadv, steelPlate, steelPlate, steelPlate, - steelPlate); - Salvage.addSalvage(BlockListMF.bombBench, new ItemStack(ComponentListMF.bolt, 4), ComponentListMF.iron_frame, - BlockListMF.carpenter); - Salvage.addSalvage(BlockListMF.crossbowBench, new ItemStack(ComponentListMF.nail, 2), - ComponentListMF.plank.construct("ScrapWood", 2), Items.string, BlockListMF.carpenter); - Salvage.addSalvage(BlockListMF.bombPress, new ItemStack(ComponentListMF.iron_strut, 2), - new ItemStack(ComponentListMF.bolt, 2), new ItemStack(ComponentListMF.bronze_gears, 2), Blocks.lever, - ComponentListMF.iron_frame); - Salvage.addSalvage(BlockListMF.engTanner, new ItemStack(ComponentListMF.iron_strut, 4), - new ItemStack(ComponentListMF.bolt, 2), new ItemStack(ComponentListMF.bronze_gears, 3), - CustomToolListMF.standard_needle, Blocks.lever, ComponentListMF.iron_frame); - Salvage.addSalvage(BlockListMF.forge_metal, new ItemStack(ComponentListMF.bolt, 4), blackPlate, blackPlate, - blackPlate, blackPlate, new ItemStack(ComponentListMF.iron_frame, 2), - new ItemStack(Blocks.redstone_block, 2)); - Salvage.addSalvage(ToolListMF.spyglass, new ItemStack(ComponentListMF.bolt, 2), new ItemStack(Blocks.glass, 2), - ComponentListMF.steel_tube, ComponentListMF.bronze_gears); - Salvage.addSalvage(ToolListMF.syringe_empty, Items.glass_bottle, CustomToolListMF.standard_needle, - ComponentListMF.steel_tube); - Salvage.addSalvage(ToolListMF.parachute, new ItemStack(ComponentListMF.thread, 3), - new ItemStack(Blocks.wool, 3), new ItemStack(ComponentListMF.leather_strip, 4), Items.leather); - } - - private static void addNonPrimitiveStone() { - KnowledgeListMF.stoneKnifeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.knifeStone), "", - primitive, "hands", -1, 4, - new Object[] { "R", "R", "S", 'R', Blocks.cobblestone, 'S', ComponentListMF.plank, }); - KnowledgeListMF.stoneHammerR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hammerStone), - "", primitive, "hands", -1, 4, - new Object[] { "R", "S", 'R', Blocks.cobblestone, 'S', ComponentListMF.plank, }); - - KnowledgeListMF.stoneTongsR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.tongsStone), "", - primitive, "hands", -1, 4, - new Object[] { "R ", "SR", 'R', Blocks.cobblestone, 'S', ComponentListMF.plank, }); - KnowledgeListMF.boneNeedleR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.needleBone), "", - primitive, "hands", -1, 4, new Object[] { "B", 'B', Items.bone, }); - - Salvage.addSalvage(ToolListMF.knifeStone, new ItemStack(Blocks.cobblestone, 2), - ComponentListMF.plank.construct("ScrapWood")); - Salvage.addSalvage(ToolListMF.hammerStone, Blocks.cobblestone, ComponentListMF.plank.construct("ScrapWood")); - Salvage.addSalvage(ToolListMF.tongsStone, new ItemStack(Blocks.cobblestone, 2), - ComponentListMF.plank.construct("ScrapWood")); - Salvage.addSalvage(ToolListMF.needleBone, Items.bone); - } - - private static void addPrimitive() { - KnowledgeListMF.dirtRockR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.sharp_rock), - "", "minecraft:dig.gravel", "hands", -1, 1, new Object[] { "D", 'D', Blocks.dirt, }); - - KnowledgeListMF.stonePickR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.pickStone), "", - primitive, "hands", -1, 5, new Object[] { "RVR", " S ", " S ", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - KnowledgeListMF.stoneAxeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.axeStone), "", - primitive, "hands", -1, 5, new Object[] { "RV", "RS", " S", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - KnowledgeListMF.stoneSpadeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.spadeStone), "", - primitive, "hands", -1, 5, new Object[] { "VR", " S", " S", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - KnowledgeListMF.stoneHoeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hoeStone), "", - primitive, "hands", -1, 5, new Object[] { "RV", " S", " S", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - KnowledgeListMF.stoneSwordR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.swordStone), "", - primitive, "hands", -1, 8, new Object[] { "R ", "R ", "SV", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - KnowledgeListMF.stoneWarR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.waraxeStone), "", - primitive, "hands", -1, 8, new Object[] { "VRV", "RS", " S", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - KnowledgeListMF.stoneMaceR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.maceStone), "", - primitive, "hands", -1, 8, new Object[] { " V ", "RSR", " S ", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - KnowledgeListMF.stoneSpearR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.spearStone), "", - primitive, "hands", -1, 8, new Object[] { "R", "V", "S", "S", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - KnowledgeListMF.stoneKnifeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.knifeStone), "", - primitive, "hands", -1, 4, new Object[] { "R ", "SV", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - KnowledgeListMF.stoneHammerR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hammerStone), - "", primitive, "hands", -1, 4, new Object[] { "R", "V", "S", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - - KnowledgeListMF.stoneTongsR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.tongsStone), "", - primitive, "hands", -1, 4, new Object[] { " R", "SV", 'R', ComponentListMF.sharp_rock, 'V', - ComponentListMF.vine, 'S', Items.stick }); - KnowledgeListMF.boneNeedleR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.needleBone), "", - primitive, "hands", -1, 4, new Object[] { "B", 'B', Items.bone, }); - - Salvage.addSalvage(ToolListMF.pickStone, new ItemStack(ComponentListMF.sharp_rock, 2), - new ItemStack(Items.stick, 2), ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.axeStone, new ItemStack(ComponentListMF.sharp_rock, 2), - new ItemStack(Items.stick, 2), ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.spadeStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), - ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.hoeStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), - ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.swordStone, Items.stick, new ItemStack(ComponentListMF.sharp_rock, 2), - ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.waraxeStone, new ItemStack(ComponentListMF.sharp_rock, 2), - new ItemStack(Items.stick, 2), new ItemStack(ComponentListMF.vine, 2)); - Salvage.addSalvage(ToolListMF.maceStone, new ItemStack(ComponentListMF.sharp_rock, 2), - new ItemStack(Items.stick, 2), ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.spearStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), - ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.knifeStone, ComponentListMF.sharp_rock, Items.stick, ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.hammerStone, ComponentListMF.sharp_rock, Items.stick, ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.tongsStone, ComponentListMF.sharp_rock, Items.stick, ComponentListMF.vine); - Salvage.addSalvage(ToolListMF.needleBone, Items.bone); - } - - public static void initTierWood() { - String basic = CarpenterRecipes.basic; - - float time = 4; - Item plank = ComponentListMF.plank; - - KnowledgeListMF.spoonR = MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_spoon, "", - basic, "hands", -1, 1 + (int) (1 * time), new Object[] { "W", "S", 'W', plank, 'S', Items.stick }); - Salvage.addSalvage(CustomToolListMF.standard_spoon, plank, Items.stick); - KnowledgeListMF.malletR = MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_mallet, "", - basic, "hands", -1, 1 + (int) (2 * time), new Object[] { "WW", " S", 'W', plank, 'S', Items.stick }); - Salvage.addSalvage(CustomToolListMF.standard_mallet, plank, plank, Items.stick); - Salvage.addSalvage(CustomToolListMF.standard_spoon, plank, Items.stick); - - KnowledgeListMF.refinedPlankR.add(MineFantasyAPI.addCarpenterRecipe(construction, - ComponentListMF.plank.construct("RefinedWood"), "", basic, "hands", -1, 1, - new Object[] { "O", "P", 'O', ComponentListMF.plant_oil, 'P', (ComponentListMF.plank) })); - KnowledgeListMF.easyPaintPlank.add(MineFantasyAPI.addCarpenterRecipe(construction, - ComponentListMF.plank.construct("RefinedWood", 4), "paint_brush", sewing, "brush", -1, 2, - new Object[] { " O ", "PPPP", 'O', ComponentListMF.plant_oil, 'P', (ComponentListMF.plank) })); - } - - static void tryAddSawPlanks(ItemStack planks, CustomMaterial material) { - String sub = material.name.substring(0, material.name.length() - 4).toLowerCase(); - - if (planks.getUnlocalizedName().toLowerCase().contains(sub)) { - addSawPlanks(planks, material); - } - } - - static void addSawPlanks(ItemStack planks, CustomMaterial material) { - MineFantasyAPI.addCarpenterRecipe(construction, (ComponentListMF.plank).construct(material.name, 4), - "commodities", sawing, "saw", -1, 10, new Object[] { "P", 'P', planks.copy() }); - } + assembleWoodBasic(); + CustomWoodRecipes.init(); + addDusts(); + addWoodworks(); + addStonemason(); + addCooking(); + addMisc(); + addEngineering(); + if (ConfigHardcore.HCCallowRocks) { + addPrimitive(); + } else { + addNonPrimitiveStone(); + } + MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.researchBook), "", sewing, "hands", -1, 1, + new Object[]{"B", 'B', Items.book,}); + + if (ConfigHardcore.HCCallowRocks) { + KnowledgeListMF.sharpRocksR = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.sharp_rock, 8), "", stonemason, "hammer", -1, 10, + new Object[]{"S", 'S', Blocks.cobblestone,}); + + } else { + + } + Salvage.addSalvage(ToolListMF.dryrocks, Blocks.cobblestone); + + KnowledgeListMF.threadR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.thread, 4), + "commodities", sewing, "hands", -1, 5, new Object[]{"W", "S", 'W', Blocks.wool, 'S', Items.stick,}); + KnowledgeListMF.stringR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(Items.string), "commodities", + sewing, "hands", -1, 10, new Object[]{"T", "T", "T", "T", 'T', ComponentListMF.thread}); + + KnowledgeListMF.lStripsR = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.leather_strip, 4), "commodities", snipping, "shears", -1, 10, + new Object[]{"L", 'L', Items.leather,}); + + MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.swordTraining), nailHammer, "knife", 1, + 40, new Object[]{"NI ", "SIII", "NI ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', + Blocks.planks,}); + + MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.waraxeTraining), nailHammer, "knife", 1, + 30, new Object[]{" II ", "SSIN", " I ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', + Blocks.planks,}); + MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.maceTraining), nailHammer, "knife", 1, 35, + new Object[]{" II", "SSII", " N ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', + Blocks.planks,}); + MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(ToolListMF.spearTraining), nailHammer, "knife", 1, + 20, new Object[]{" N ", "SSSI", " N ", 'N', ComponentListMF.nail, 'S', ComponentListMF.plank, 'I', + Blocks.planks,}); + ItemStack scrapWood = ComponentListMF.plank.construct("ScrapWood"); + Salvage.addSalvage(ToolListMF.swordTraining, new ItemStack(Blocks.planks, 5), + new ItemStack(ComponentListMF.nail, 2), scrapWood); + Salvage.addSalvage(ToolListMF.waraxeTraining, new ItemStack(Blocks.planks, 4), ComponentListMF.nail, scrapWood, + scrapWood); + Salvage.addSalvage(ToolListMF.maceTraining, new ItemStack(Blocks.planks, 4), ComponentListMF.nail, scrapWood, + scrapWood); + Salvage.addSalvage(ToolListMF.waraxeTraining, Blocks.planks, new ItemStack(ComponentListMF.nail, 2), scrapWood, + scrapWood, scrapWood); + + KnowledgeListMF.badBandageR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(ToolListMF.bandage_crude, 2), "bandage", sewing, "needle", -1, 10, + new Object[]{"LLL", 'L', ComponentListMF.rawhideSmall,}); + + MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_crude, 4), "bandage", sewing, + "needle", -1, 20, new Object[]{"LLL", 'L', ComponentListMF.rawhideMedium,}); + MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(ToolListMF.bandage_crude, 6), "bandage", sewing, + "needle", -1, 30, new Object[]{"LLL", 'L', ComponentListMF.rawhideLarge,}); + KnowledgeListMF.bandageR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(ToolListMF.bandage_wool, 4), "bandage", sewing, "needle", 1, 10, + new Object[]{"CTC", 'T', ComponentListMF.thread, 'C', Blocks.wool,}); + + KnowledgeListMF.goodBandageR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(ToolListMF.bandage_tough), "bandageadv", sewing, "needle", 2, 20, + new Object[]{"T", "L", "B", 'T', ComponentListMF.thread, 'L', ComponentListMF.leather_strip, 'B', + ToolListMF.bandage_wool}); + + KnowledgeListMF.roughHelmetR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 1, 0), "craftArmourBasic", sewing, "needle", -1, 25, + new Object[]{"TLT", "S S", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, 'L', + Items.leather}); + KnowledgeListMF.roughChestR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 1, 1), "craftArmourBasic", sewing, "needle", -1, 40, + new Object[]{"S S", "LLL", "TLT", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, + 'L', Items.leather}); + KnowledgeListMF.roughLegsR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 1, 2), "craftArmourBasic", sewing, "needle", -1, 35, + new Object[]{"TLT", "L L", "S S", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, + 'L', Items.leather}); + KnowledgeListMF.roughBootsR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 1, 3), "craftArmourBasic", sewing, "needle", -1, 20, + new Object[]{"T T", "S S", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip,}); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), + new ItemStack(ComponentListMF.thread, 2), new ItemStack(ComponentListMF.leather_strip, 2), + Items.leather); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), + new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2), + new ItemStack(Items.leather, 4)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), + new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2), + new ItemStack(Items.leather, 3)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), + new ItemStack(ComponentListMF.thread, 4), new ItemStack(ComponentListMF.leather_strip, 2)); + + KnowledgeListMF.reHelmetR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 2, 0), "craftArmourLight", sewing, "needle", 1, 50, + new Object[]{"TTT", "UPU", 'T', ComponentListMF.thread, 'P', + ArmourListMF.armour(ArmourListMF.leather, 1, 0), 'U', Items.leather}); + KnowledgeListMF.reChestR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 2, 1), "craftArmourLight", sewing, "needle", 1, 80, + new Object[]{"TTT", "UPU", 'T', ComponentListMF.thread, 'P', + ArmourListMF.armour(ArmourListMF.leather, 1, 1), 'U', Items.leather}); + KnowledgeListMF.reLegsR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 2, 2), "craftArmourLight", sewing, "needle", 1, 70, + new Object[]{"TTT", "UPU", 'T', ComponentListMF.thread, 'P', + ArmourListMF.armour(ArmourListMF.leather, 1, 2), 'U', Items.leather}); + KnowledgeListMF.reBootsR = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 2, 3), "craftArmourLight", sewing, "needle", 1, 40, + new Object[]{"TTT", "UPU", 'T', ComponentListMF.thread, 'P', + ArmourListMF.armour(ArmourListMF.leather, 1, 3), 'U', Items.leather}); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 0), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), new ItemStack(ComponentListMF.thread, 3), + new ItemStack(Items.leather, 2)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 1), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), new ItemStack(ComponentListMF.thread, 3), + new ItemStack(Items.leather, 2)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 2), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), new ItemStack(ComponentListMF.thread, 3), + new ItemStack(Items.leather, 2)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 2, 3), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), new ItemStack(ComponentListMF.thread, 3), + new ItemStack(Items.leather, 2)); + + // PADDING + KnowledgeListMF.padding[0] = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 4, 0), "craftArmourLight", sewing, "needle", 1, 50, + new Object[]{" W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 0), 'W', + Blocks.wool, 'S', ComponentListMF.thread,}); + KnowledgeListMF.padding[1] = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 4, 1), "craftArmourLight", sewing, "needle", 1, 80, + new Object[]{" W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 1), 'W', + Blocks.wool, 'S', ComponentListMF.thread,}); + KnowledgeListMF.padding[2] = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 4, 2), "craftArmourLight", sewing, "needle", 1, 70, + new Object[]{" W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 2), 'W', + Blocks.wool, 'S', ComponentListMF.thread,}); + KnowledgeListMF.padding[3] = MineFantasyAPI.addCarpenterRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 4, 3), "craftArmourLight", sewing, "needle", 1, 40, + new Object[]{" W ", "SPS", " S ", 'P', ArmourListMF.armour(ArmourListMF.leather, 1, 3), 'W', + Blocks.wool, 'S', ComponentListMF.thread,}); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 0), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 0), new ItemStack(ComponentListMF.thread, 3), + Blocks.wool); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 1), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 1), new ItemStack(ComponentListMF.thread, 3), + Blocks.wool); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 2), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 2), new ItemStack(ComponentListMF.thread, 3), + Blocks.wool); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 4, 3), + ArmourListMF.armourItem(ArmourListMF.leather, 1, 3), new ItemStack(ComponentListMF.thread, 3), + Blocks.wool); + + KnowledgeListMF.repairBasicR = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.repair_basic), "repair_basic", sewing, "needle", 1, 20, + new Object[]{"TTT", "FNH", "SLS", 'T', ComponentListMF.thread, 'S', ComponentListMF.leather_strip, + 'L', Items.leather, 'F', Items.flint, 'H', CustomToolListMF.standard_hammer, 'N', + ComponentListMF.nail,}); + ItemStack bronzePlate = ComponentListMF.plate.createComm("bronze"); + KnowledgeListMF.repairAdvancedR = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.repair_advanced), "repair_advanced", sewing, "needle", 2, 50, + new Object[]{"SCS", "PKH", "CSC", 'K', BlockListMF.repair_basic, 'P', bronzePlate, 'H', + CustomToolListMF.standard_hammer, 'C', Items.slime_ball, 'S', Items.string,}); + KnowledgeListMF.repairOrnateR = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.repair_ornate), "repair_ornate", sewing, "needle", 3, 100, + new Object[]{"GDG", "LKL", "GLG", 'K', BlockListMF.repair_advanced, 'G', Items.gold_ingot, 'L', + new ItemStack(Items.dye, 1, 4), 'D', Items.diamond,}); + + Salvage.addSalvage(BlockListMF.repair_basic, new ItemStack(ComponentListMF.thread, 3), ComponentListMF.nail, + Items.flint, Items.leather, new ItemStack(ComponentListMF.leather_strip, 2)); + Salvage.addSalvage(BlockListMF.repair_advanced, BlockListMF.repair_basic, bronzePlate, + new ItemStack(Items.slime_ball, 3), new ItemStack(Items.string, 3)); + Salvage.addSalvage(BlockListMF.repair_ornate, BlockListMF.repair_advanced, new ItemStack(Items.gold_ingot, 4), + Items.diamond, new ItemStack(Items.dye, 3, 4)); + + KnowledgeListMF.trilogyRecipe = MineFantasyAPI.addShapelessCarpenterRecipe(artisanry, + new ItemStack(ComponentListMF.artefacts, 1, 3), "smeltMaster", basic, "hands", -1, 1, + new Object[]{new ItemStack(ComponentListMF.artefacts, 1, 0), + new ItemStack(ComponentListMF.artefacts, 1, 1), + new ItemStack(ComponentListMF.artefacts, 1, 2)}); + } + + public static void assembleWoodBasic() { + KnowledgeListMF.carpenterRecipe = GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.carpenter), + new Object[]{"PBP", "P P", 'B', Blocks.crafting_table, 'P', ComponentListMF.plank}); + Salvage.addSalvage(BlockListMF.carpenter, ComponentListMF.plank.construct("ScrapWood", 4), + Blocks.crafting_table); + + KnowledgeListMF.nailPlanksR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.nailed_planks), "refined_planks", nailHammer, "hammer", 1, 5, + new Object[]{"N ", "PP", "PP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("OakWood"),}); + KnowledgeListMF.nailStairR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.nailed_planks_stair), "refined_planks", nailHammer, "hammer", 1, 5, + new Object[]{"N ", "P ", "PP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("OakWood"),}); + KnowledgeListMF.tannerRecipe = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.tanner), "", nailHammer, "hammer", -1, 10, + new Object[]{"PPP", "P P", "PPP", 'P', ComponentListMF.plank,}); + + KnowledgeListMF.clayWallR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.clayWall, 4), "clay_wall", nailHammer, "hammer", 1, 2, new Object[]{"NPN", + "PCP", "NPN", 'N', ComponentListMF.nail, 'P', ComponentListMF.plank, 'C', Blocks.clay}); + + KnowledgeListMF.researchTableRecipe = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.research), "", nailHammer, "hammer", -1, 10, + new Object[]{"B", "C", 'B', ToolListMF.researchBook, 'C', BlockListMF.carpenter,}); + KnowledgeListMF.bSalvageR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.salvage_basic), "", nailHammer, "hammer", -1, 10, new Object[]{"SFS", "PWP", + 'W', Blocks.crafting_table, 'S', Blocks.stone, 'F', Items.flint, 'P', ComponentListMF.plank}); + + KnowledgeListMF.framedGlassR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.framed_glass), "", nailHammer, "hammer", -1, 10, + new Object[]{"PGP", 'P', ComponentListMF.plank, 'G', Blocks.glass}); + KnowledgeListMF.windowR = MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.window), "", + nailHammer, "hammer", -1, 10, + new Object[]{" P ", "PGP", " P ", 'P', ComponentListMF.plank, 'G', Blocks.glass}); + + Salvage.addSalvage(BlockListMF.framed_glass, ComponentListMF.plank.construct("ScrapWood", 2), Blocks.glass); + Salvage.addSalvage(BlockListMF.window, ComponentListMF.plank.construct("ScrapWood", 4), Blocks.glass); + Salvage.addSalvage(BlockListMF.clayWall, ComponentListMF.nail, ComponentListMF.plank.construct("ScrapWood"), + Items.clay_ball); + Salvage.addSalvage(BlockListMF.tanner, ComponentListMF.plank.construct("ScrapWood", 8)); + Salvage.addSalvage(BlockListMF.research, BlockListMF.carpenter); + Salvage.addSalvage(BlockListMF.salvage_basic, Items.flint, new ItemStack(Blocks.stone, 2), + ComponentListMF.plank.construct("ScrapWood", 2), Blocks.crafting_table); + } + + private static void addDusts() { + QuernRecipes.addRecipe(new ItemStack(Items.dye, 1, 3), new ItemStack(FoodListMF.coca_powder), 0);// ItemDye + QuernRecipes.addRecipe(Items.wheat, new ItemStack(FoodListMF.flour), 0); + QuernRecipes.addRecipe(Items.reeds, new ItemStack(FoodListMF.sugarpot), 0); + QuernRecipes.addRecipe(FoodListMF.breadroll, new ItemStack(FoodListMF.breadcrumbs), 0); + + QuernRecipes.addRecipe(FoodListMF.generic_meat_uncooked, new ItemStack(FoodListMF.generic_meat_mince_uncooked), + 0); + QuernRecipes.addRecipe(FoodListMF.generic_meat_strip_uncooked, + new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); + QuernRecipes.addRecipe(FoodListMF.generic_meat_chunk_uncooked, + new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); + QuernRecipes.addRecipe(FoodListMF.generic_meat_cooked, new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); + QuernRecipes.addRecipe(FoodListMF.generic_meat_strip_cooked, + new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); + QuernRecipes.addRecipe(FoodListMF.generic_meat_chunk_cooked, + new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); + + QuernRecipes.addRecipe(Items.coal, new ItemStack(ComponentListMF.coalDust), 0); + QuernRecipes.addRecipe(new ItemStack(Items.coal, 1, 1), new ItemStack(ComponentListMF.coalDust), 0); + QuernRecipes.addRecipe(ComponentListMF.kaolinite, new ItemStack(ComponentListMF.kaolinite_dust), 0); + QuernRecipes.addRecipe(Items.flint, new ItemStack(ComponentListMF.shrapnel), 0); + + QuernRecipes.addRecipe(ComponentListMF.flux, new ItemStack(ComponentListMF.flux_pot), 0); + + KnowledgeListMF.pieTrayRecipe = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.pie_tray_uncooked), "", basic, "hands", -1, 10, + new Object[]{"CC", 'C', Items.clay_ball,}); + + KnowledgeListMF.potRecipe = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.clay_pot_uncooked, 8), "", basic, "hands", -1, 5, + new Object[]{"C C", " CC ", 'C', Items.clay_ball,}); + KnowledgeListMF.mouldRecipe = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.ingot_mould_uncooked), "crucible", basic, "hands", -1, 10, + new Object[]{"CCC", " C ", 'C', Items.clay_ball,}); + KnowledgeListMF.jugRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(FoodListMF.jug_uncooked, 4), + "", basic, "hands", -1, 8, new Object[]{"C ", "C C", " C ", 'C', Items.clay_ball,}); + KnowledgeListMF.blackpowderRec = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.blackpowder, 2), "blackpowder", basic, "hands", -1, 2, + new Object[]{"NS", "CC", "PP", 'C', ComponentListMF.coalDust, 'N', ComponentListMF.nitre, 'S', + ComponentListMF.sulfur, 'P', ComponentListMF.clay_pot,}); + KnowledgeListMF.crudeBombR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ToolListMF.bomb_crude), "blackpowder", primitive, "hands", -1, 5, + new Object[]{"T", "B", "P", + + 'B', ComponentListMF.blackpowder, 'T', ComponentListMF.thread, 'P', Items.paper,}); + KnowledgeListMF.advblackpowderRec = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.blackpowder_advanced), "advblackpowder", basic, "hands", -1, 10, + new Object[]{" B ", "RGR", " P ", 'B', ComponentListMF.blackpowder, 'G', Items.glowstone_dust, 'R', + Items.redstone, 'P', ComponentListMF.clay_pot,}); + KnowledgeListMF.magmaRefinedR = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(ComponentListMF.magma_cream_refined), "firebomb", grinding, "pestle", -1, 10, + new Object[]{"B", "H", "C", "P", 'H', ComponentListMF.dragon_heart, 'B', Items.blaze_powder, 'C', + Items.magma_cream, 'P', ComponentListMF.clay_pot,}); + Salvage.addSalvage(ComponentListMF.magma_cream_refined, ComponentListMF.dragon_heart, Items.blaze_powder, + Items.magma_cream, ComponentListMF.clay_pot); + } + + private static void addWoodworks() { + KnowledgeListMF.refinedPlankBlockR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.refined_planks), "refined_planks", nailHammer, "hammer", 1, 10, + new Object[]{"N ", "PP", "PP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"),}); + + KnowledgeListMF.refinedStairR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.refined_planks_stair), "refined_planks", nailHammer, "hammer", 1, 10, + new Object[]{"N ", "P ", "PP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"),}); + Salvage.addSalvage(BlockListMF.nailed_planks, ComponentListMF.nail, + ComponentListMF.plank.construct("ScrapWood", 4)); + Salvage.addSalvage(BlockListMF.refined_planks, ComponentListMF.nail, + ComponentListMF.plank.construct("RefinedWood", 4)); + Salvage.addSalvage(BlockListMF.nailed_planks_stair, ComponentListMF.nail, + ComponentListMF.plank.construct("ScrapWood", 3)); + Salvage.addSalvage(BlockListMF.refined_planks_stair, ComponentListMF.nail, + ComponentListMF.plank.construct("RefinedWood", 3)); + + KnowledgeListMF.bellowsRecipe = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.bellows), "", nailHammer, "hammer", 1, 50, + new Object[]{"NNN", "PPP", "LL ", "PP ", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"), 'L', Items.leather,}); + Salvage.addSalvage(BlockListMF.bellows, new ItemStack(ComponentListMF.nail, 3), + ComponentListMF.plank.construct("RefinedWood", 5), new ItemStack(Items.leather, 2)); + + KnowledgeListMF.woodTroughRecipe = MineFantasyAPI.addCarpenterRecipe(construction, + ((BlockWoodDecor) BlockListMF.trough_wood).construct("ScrapWood"), "", nailHammer, "hammer", -1, 20, + new Object[]{"P P", "PPP", + + 'P', ComponentListMF.plank,}); + + KnowledgeListMF.strongRackR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.advTanner), "", nailHammer, "hammer", 1, 80, + new Object[]{"NNN", "PPP", "P P", "PPP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"),}); + Salvage.addSalvage(BlockListMF.advTanner, ComponentListMF.plank.construct("RefinedWood", 8), + new ItemStack(ComponentListMF.nail, 3)); + + MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.refined_planks), "paint_brush", + sewing, "brush", -1, 3, + new Object[]{"O", "P", 'O', ComponentListMF.plant_oil, 'P', BlockListMF.nailed_planks,}); + + PaintOilRecipe.addRecipe(BlockListMF.nailed_planks, BlockListMF.refined_planks); + PaintOilRecipe.addRecipe(BlockListMF.nailed_planks_stair, BlockListMF.refined_planks_stair); + + } + + private static void addStonemason() { + KnowledgeListMF.quernR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.quern), "", + stonemason, "hammer", -1, 10, new Object[]{"FSF", "SSS", 'F', Items.flint, 'S', Blocks.stone,}); + KnowledgeListMF.stoneovenRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.oven_stone), + "", stonemason, "hammer", -1, 10, + new Object[]{"S", "C", 'C', BlockListMF.roast, 'S', Blocks.stone,}); + + KnowledgeListMF.bloomeryR = MineFantasyAPI.addCarpenterRecipe(artisanry, new ItemStack(BlockListMF.bloomery), + "bloomery", stonemason, "hammer", -1, 10, + new Object[]{" S ", "S S", "SCS", 'C', Blocks.coal_block, 'S', Blocks.stone,}); + KnowledgeListMF.crucibleRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.crucible), "crucible", stonemason, "hammer", -1, 20, + new Object[]{"SSS", "S S", "SSS", 'S', Blocks.stone,}); + KnowledgeListMF.advCrucibleRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.crucibleadv), "crucible2", basic, 40, + new Object[]{"SSS", "SCS", "SSS", 'S', ComponentListMF.fireclay, 'C', BlockListMF.crucible}); + Salvage.addSalvage(BlockListMF.crucible, new ItemStack(Blocks.stone, 8)); + Salvage.addSalvage(BlockListMF.crucibleadv, new ItemStack(ComponentListMF.fireclay, 8), BlockListMF.crucible); + + KnowledgeListMF.chimneyRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.chimney_stone, 8), "", stonemason, "hammer", -1, 30, + new Object[]{"S S", "S S", "S S", 'S', Blocks.stone,}); + KnowledgeListMF.wideChimneyRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.chimney_stone_wide), "", stonemason, "hammer", -1, 10, + new Object[]{"S", "C", 'C', BlockListMF.chimney_stone, 'S', Blocks.stone,}); + KnowledgeListMF.extractChimneyRecipe = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(BlockListMF.chimney_stone_extractor), "", stonemason, "hammer", -1, 15, + new Object[]{"C", 'C', BlockListMF.chimney_stone_wide,}); + + KnowledgeListMF.stoneAnvilRecipe = MineFantasyAPI.addCarpenterRecipe(null, + new ItemStack(BlockListMF.anvilStone), "", stonemason, "hammer", -1, 10, + new Object[]{"SS ", "SSS", " S ", 'S', Blocks.stone}); + KnowledgeListMF.forgeRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(BlockListMF.forge), "", + stonemason, "hammer", -1, 10, new Object[]{"S S", "SCS", 'C', Items.coal, 'S', Blocks.stone}); + Salvage.addSalvage(BlockListMF.forge, new ItemStack(Blocks.stone, 4), Items.coal); + Salvage.addSalvage(BlockListMF.anvilStone, new ItemStack(Blocks.stone, 6)); + + Salvage.addSalvage(BlockListMF.chimney_stone, Blocks.stone); + Salvage.addSalvage(BlockListMF.chimney_stone_wide, BlockListMF.chimney_stone, Blocks.stone); + Salvage.addSalvage(BlockListMF.chimney_stone_extractor, BlockListMF.chimney_stone_wide); + Salvage.addSalvage(BlockListMF.quern, new ItemStack(Items.flint, 2), new ItemStack(Blocks.stone, 4)); + } + + private static void addCooking() { + String meatRaw = "rawMeat"; + String cookedMeat = "cookedMeat"; + OreDictionary.registerOre(cookedMeat, Items.cooked_beef); + OreDictionary.registerOre(cookedMeat, Items.cooked_chicken); + OreDictionary.registerOre(cookedMeat, Items.cooked_porkchop); + OreDictionary.registerOre(cookedMeat, FoodListMF.wolf_cooked); + OreDictionary.registerOre(cookedMeat, FoodListMF.horse_cooked); + OreDictionary.registerOre(cookedMeat, Items.cooked_fished); + OreDictionary.registerOre(cookedMeat, new ItemStack(Items.cooked_fished, 1, 1)); + addOreD("listAllporkcooked", cookedMeat); + addOreD("listAllmuttoncooked", cookedMeat); + addOreD("listAllbeefcooked", cookedMeat); + addOreD("listAllchickencooked", cookedMeat); + addOreD("listAllfishcooked", cookedMeat); + + OreDictionary.registerOre(meatRaw, FoodListMF.guts); + OreDictionary.registerOre(meatRaw, Items.beef); + OreDictionary.registerOre(meatRaw, Items.chicken); + OreDictionary.registerOre(meatRaw, Items.porkchop); + OreDictionary.registerOre(meatRaw, FoodListMF.wolf_raw); + OreDictionary.registerOre(meatRaw, FoodListMF.horse_raw); + OreDictionary.registerOre(meatRaw, Items.fish); + OreDictionary.registerOre(meatRaw, new ItemStack(Items.fish, 1, 1)); + addOreD("listAllporkraw", meatRaw); + addOreD("listAllmuttonraw", meatRaw); + addOreD("listAllbeefraw", meatRaw); + addOreD("listAllchickenraw", meatRaw); + addOreD("listAllfishraw", meatRaw); + + KnowledgeListMF.curdRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.curds), + "", basic, "hands", -1, 10, new Object[]{"T", "S", "M", "P", 'P', ComponentListMF.clay_pot, 'T', + FoodListMF.salt, 'S', FoodListMF.sugarpot, 'M', FoodListMF.jug_milk,}); + + KnowledgeListMF.oatsRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.oats), "", + chopping, "knife", -1, 20, new Object[]{"M", "W", "S", "B", 'S', Items.wheat_seeds, 'W', Items.wheat, + 'M', FoodListMF.jug_milk, 'B', Items.bowl}); + KnowledgeListMF.doughRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.dough), + "", basic, "hands", -1, 10, + new Object[]{"W", "F", 'W', FoodListMF.jug_water, 'F', FoodListMF.flour,}); + KnowledgeListMF.pastryRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.pastry), + "", basic, "hands", -1, 10, + new Object[]{" S ", "FEF", 'F', FoodListMF.flour, 'E', Items.egg, 'S', FoodListMF.salt,}); + KnowledgeListMF.breadRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.raw_bread), "", basic, "hands", -1, 15, + new Object[]{"DDD", 'D', FoodListMF.dough,}); + KnowledgeListMF.sweetrollRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.sweetroll_raw), "sweetroll", basic, 5, + new Object[]{" M ", "FES", "BBB", 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'B', + FoodListMF.berries, 'E', Items.egg, 'F', FoodListMF.flour,}); + KnowledgeListMF.icingRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.icing), + "", mixing, "spoon", -1, 10, new Object[]{"W", "S", "B", 'W', FoodListMF.jug_water, 'S', + FoodListMF.sugarpot, 'B', ComponentListMF.clay_pot,}); + KnowledgeListMF.chocoRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.chocolate), "icing", mixing, "spoon", -1, 10, + new Object[]{" M ", "SCS", " B ", 'C', FoodListMF.coca_powder, 'M', FoodListMF.jug_milk, 'S', + FoodListMF.sugarpot, 'B', ComponentListMF.clay_pot,}); + KnowledgeListMF.custardRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.custard), "icing", mixing, "spoon", -1, 10, + new Object[]{" M ", "SES", " B ", 'E', Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, + 'B', ComponentListMF.clay_pot,}); + KnowledgeListMF.iceSR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.sweetroll), + "sweetroll", basic, "knife", -1, 15, + new Object[]{"I", "R", 'I', FoodListMF.icing, 'R', FoodListMF.sweetroll_uniced,}); + KnowledgeListMF.eclairDoughR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.eclair_raw), "eclair", basic, 8, + new Object[]{"SSS", "PPP", 'P', FoodListMF.pastry, 'S', FoodListMF.sugarpot,}); + KnowledgeListMF.eclairIceR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.eclair_empty), "eclair", basic, "knife", 2, 20, + new Object[]{"C", "E", 'C', FoodListMF.chocolate, 'E', FoodListMF.eclair_uniced,}); + KnowledgeListMF.eclairFillR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.eclair), + "eclair", basic, "knife", 2, 20, + new Object[]{"C", "E", 'C', FoodListMF.custard, 'E', FoodListMF.eclair_empty,}); + for (ItemStack food : OreDictionary.getOres(meatRaw)) { + int size = getSize(food); + KnowledgeListMF.meatRecipes.add(MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.generic_meat_uncooked, size), "", chopping, "knife", -1, 15, + new Object[]{"M", 'M', food,})); + } + for (ItemStack food : OreDictionary.getOres(cookedMeat)) { + int size = 1; + KnowledgeListMF.meatRecipes.add( + MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_cooked, size), + "", chopping, "knife", -1, 15, new Object[]{"M", 'M', food,})); + } + KnowledgeListMF.meatStripR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.generic_meat_strip_uncooked), "", chopping, "knife", -1, 5, + new Object[]{"M", 'M', FoodListMF.generic_meat_uncooked,}); + MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_strip_cooked), "", + chopping, "knife", -1, 5, new Object[]{"M", 'M', FoodListMF.generic_meat_cooked,}); + KnowledgeListMF.meatHunkR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.generic_meat_chunk_uncooked), "", chopping, "knife", -1, 5, + new Object[]{"M", 'M', FoodListMF.generic_meat_strip_uncooked,}); + MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.generic_meat_chunk_cooked), "", + chopping, "knife", -1, 5, new Object[]{"M", 'M', FoodListMF.generic_meat_strip_cooked,}); + KnowledgeListMF.gutsRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.guts), "", + chopping, "knife", 1, 8, new Object[]{"MMMM", 'M', Items.rotten_flesh,}); + + KnowledgeListMF.stewRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.stew), "", + chopping, "knife", -1, 15, + new Object[]{"M", "B", 'M', FoodListMF.generic_meat_chunk_cooked, 'B', Items.bowl}); + KnowledgeListMF.jerkyRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.jerky, 1), "jerky", chopping, "knife", 2, 20, + new Object[]{"S", "M", 'S', FoodListMF.salt, 'M', FoodListMF.generic_meat_strip_cooked,}); + KnowledgeListMF.saussageR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.saussage_raw, 4), "saussage", chopping, "knife", 2, 30, + new Object[]{" G ", "MMM", "BES", 'G', FoodListMF.guts, 'E', Items.egg, 'S', FoodListMF.salt, 'B', + FoodListMF.breadcrumbs, 'M', FoodListMF.generic_meat_mince_uncooked,}); + KnowledgeListMF.meatPieRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.pie_meat_uncooked), "meatpie", chopping, "knife", 2, 150, + new Object[]{" P ", "MMM", " P ", " T ", 'P', FoodListMF.pastry, 'M', + FoodListMF.generic_meat_mince_cooked, 'T', FoodListMF.pie_tray,}); + KnowledgeListMF.breadSliceR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.breadSlice, 12), "", "step.cloth", "knife", -1, 10, + new Object[]{"B", 'B', Items.bread,}); + KnowledgeListMF.sandwitchRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.sandwitch_meat), "sandwitch", chopping, "hands", -1, 4, + new Object[]{"B", "C", "M", "B", 'C', FoodListMF.cheese_slice, 'M', FoodListMF.generic_meat_cooked, + 'B', FoodListMF.breadSlice}); + KnowledgeListMF.sandwitchBigRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.sandwitch_big), "sandwitchBig", chopping, "knife", 1, 10, + new Object[]{"CSC", "MBM", 'S', FoodListMF.salt, 'C', FoodListMF.cheese_slice, 'M', + FoodListMF.generic_meat_cooked, 'B', Items.bread}); + KnowledgeListMF.shepardRecipe = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.pie_shepard_uncooked), "shepardpie", chopping, "knife", 3, 200, + new Object[]{"PFP", "MMM", "CFC", " T ", 'C', Items.carrot, 'P', Items.potato, 'F', FoodListMF.pastry, + 'M', FoodListMF.generic_meat_mince_cooked, 'T', FoodListMF.pie_tray,}); + + KnowledgeListMF.appleR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.pie_apple_uncooked), "applepie", chopping, "knife", 2, 120, + new Object[]{"SPS", "MMM", "SPS", " T ", 'S', FoodListMF.sugarpot, 'P', FoodListMF.pastry, 'M', + Items.apple, 'T', FoodListMF.pie_tray,}); + KnowledgeListMF.pumpPieR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.pie_pumpkin_uncooked), "bread", chopping, "knife", 1, 50, + new Object[]{"SMS", "SPS", " T ", 'S', FoodListMF.sugarpot, 'P', FoodListMF.pastry, 'M', + Blocks.pumpkin, 'T', FoodListMF.pie_tray,}); + KnowledgeListMF.berryR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.pie_berry_uncooked), "berrypie", chopping, "knife", 2, 100, + new Object[]{"SPS", "MMM", "SPS", " T ", 'S', FoodListMF.sugarpot, 'P', FoodListMF.pastry, 'M', + FoodListMF.berries, 'T', FoodListMF.pie_tray,}); + + KnowledgeListMF.simpCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.cake_simple_raw), "bread", mixing, "spoon", -1, 15, + new Object[]{"MMM", "SES", "FFF", " T ", 'F', FoodListMF.flour, 'E', Items.egg, 'M', + FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin,}); + + KnowledgeListMF.cakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_raw), + "cake", mixing, "spoon", -1, 20, new Object[]{"SMS", "SES", "FFF", " T ", 'F', FoodListMF.flour, 'E', + Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin,}); + KnowledgeListMF.carrotCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.cake_carrot_raw), "carrotcake", mixing, "spoon", -1, 25, + new Object[]{"SMS", "SES", "CCC", "FTF", 'C', Items.carrot, 'F', FoodListMF.flour, 'E', Items.egg, + 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin,}); + KnowledgeListMF.chocoCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.cake_choc_raw), "chococake", mixing, "spoon", -1, 25, + new Object[]{"SMS", "SES", "CCC", "FTF", 'C', FoodListMF.chocolate, 'F', FoodListMF.flour, 'E', + Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', FoodListMF.cake_tin,}); + KnowledgeListMF.bfCakeR = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(FoodListMF.cake_bf_raw), + "bfcake", mixing, "spoon", -1, 30, + new Object[]{"SMMS", "SEES", "CBBC", "FTFF", 'B', FoodListMF.berriesJuicy, 'C', FoodListMF.chocolate, + 'F', FoodListMF.flour, 'E', Items.egg, 'M', FoodListMF.jug_milk, 'S', FoodListMF.sugarpot, 'T', + FoodListMF.cake_tin,}); + KnowledgeListMF.simpCakeOut = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(Items.cake), + "bread", basic, "knife", -1, 10, + new Object[]{"I", "R", 'I', FoodListMF.icing, 'R', FoodListMF.cake_simple_uniced,}); + + KnowledgeListMF.cakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(BlockListMF.cake_vanilla), + "cake", basic, "knife", -1, 60, + new Object[]{"III", " R ", 'I', FoodListMF.icing, 'R', FoodListMF.cake_uniced,}); + KnowledgeListMF.carrotCakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(BlockListMF.cake_carrot), "carrotcake", basic, "knife", -1, 60, + new Object[]{"III", " R ", 'I', FoodListMF.icing, 'R', FoodListMF.cake_carrot_uniced,}); + KnowledgeListMF.chocoCakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(BlockListMF.cake_chocolate), "chococake", basic, "knife", -1, 60, new Object[]{"ICI", + " R ", 'C', FoodListMF.chocolate, 'I', FoodListMF.icing, 'R', FoodListMF.cake_choc_uniced,}); + KnowledgeListMF.bfCakeI = MineFantasyAPI.addCarpenterRecipe(provisioning, new ItemStack(BlockListMF.cake_bf), + "bfcake", basic, "knife", -1, 100, new Object[]{"BBB", "III", "CRC", 'C', FoodListMF.chocolate, 'B', + FoodListMF.berries, 'I', FoodListMF.icing, 'R', FoodListMF.cake_bf_uniced,}); + + KnowledgeListMF.cheeserollR = MineFantasyAPI.addCarpenterRecipe(provisioning, + new ItemStack(FoodListMF.cheese_roll), "cheeseroll", chopping, "knife", 1, 30, + new Object[]{"C", "R", 'C', FoodListMF.cheese_slice, 'R', FoodListMF.breadroll,}); + } + + private static void addOreD(String list, String mfList) { + for (ItemStack stack : OreDictionary.getOres(list)) { + OreDictionary.registerOre(mfList, stack); + } + } + + private static int getSize(ItemStack food) { + if (food != null && food.getItem() instanceof ItemFood) { + int feed = ((ItemFood) food.getItem()).func_150905_g(food); + return Math.max(1, feed - 1); + } + return 1; + } + + private static void addMisc() { + // Fletching + KnowledgeListMF.fletchingR = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(ComponentListMF.fletching, 16), "arrows", chopping, 4, new Object[]{"T", "F", + + 'F', Items.feather, 'T', ComponentListMF.plank,}); + KnowledgeListMF.fletchingR2 = MineFantasyAPI.addCarpenterRecipe(artisanry, + new ItemStack(ComponentListMF.fletching, 4), "arrows", chopping, 4, new Object[]{" T ", "PPP", + + 'P', Items.paper, 'T', ComponentListMF.plank,}); + + // BOMBS + KnowledgeListMF.bombCaseCeramicR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_uncooked, 2), "bombCeramic", basic, 2, + new Object[]{" C ", "C C", " C ", 'C', Items.clay_ball,}); + KnowledgeListMF.mineCaseCeramicR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.mine_casing_uncooked), "mineCeramic", basic, 2, + new Object[]{" P ", "C C", " C ", + + 'P', Blocks.stone_pressure_plate, 'C', Items.clay_ball,}); + KnowledgeListMF.bombCaseCrystalR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_crystal), "bombCrystal", basic, 10, + new Object[]{" D ", "R R", " B ", 'B', Items.glass_bottle, 'D', ComponentListMF.diamond_shards, 'R', + Items.redstone}); + KnowledgeListMF.mineCaseCrystalR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.mine_casing_crystal), "mineCrystal", basic, 10, + new Object[]{" P ", "RDR", " B ", 'P', Blocks.heavy_weighted_pressure_plate, 'B', Items.glass_bottle, + 'D', ComponentListMF.diamond_shards, 'R', Items.redstone}); + Salvage.addSalvage(ComponentListMF.bomb_casing_uncooked, new ItemStack(Items.clay_ball, 2)); + Salvage.addSalvage(ComponentListMF.mine_casing_uncooked, new ItemStack(Items.clay_ball, 3), + Blocks.stone_pressure_plate); + + Salvage.addSalvage(ComponentListMF.bomb_casing_crystal, Items.glass_bottle, ComponentListMF.diamond_shards, + new ItemStack(Items.redstone, 2)); + Salvage.addSalvage(ComponentListMF.mine_casing_crystal, Blocks.heavy_weighted_pressure_plate, + Items.glass_bottle, ComponentListMF.diamond_shards, new ItemStack(Items.redstone, 2)); + + KnowledgeListMF.bombFuseR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.bomb_fuse, 8), "bombs", basic, 4, new Object[]{"R", "C", "S", 'S', + ComponentListMF.thread, 'C', ComponentListMF.coalDust, 'R', Items.redstone,}); + KnowledgeListMF.longFuseR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.bomb_fuse_long), "bombs", basic, 1, + new Object[]{"F", "R", "F", 'F', ComponentListMF.bomb_fuse, 'R', Items.redstone,}); + Salvage.addSalvage(ComponentListMF.bomb_fuse_long, new ItemStack(ComponentListMF.bomb_fuse, 2), Items.redstone); + + KnowledgeListMF.thatchR = MineFantasyAPI.addCarpenterRecipe(construction, new ItemStack(BlockListMF.thatch), "", + "dig.grass", "hands", -1, 1, new Object[]{"HH", "HH", 'H', new ItemStack(Blocks.tallgrass, 1, 1)}); + KnowledgeListMF.thatchStairR = MineFantasyAPI.addCarpenterRecipe(construction, + new ItemStack(BlockListMF.thatch_stair), "", "dig.grass", "hands", -1, 1, + new Object[]{"H ", "HH", 'H', new ItemStack(Blocks.tallgrass, 1, 1)}); + Salvage.addSalvage(BlockListMF.thatch_stair, new ItemStack(Blocks.tallgrass, 3, 1)); + Salvage.addSalvage(BlockListMF.thatch, new ItemStack(Blocks.tallgrass, 4, 1)); + + KnowledgeListMF.apronRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ArmourListMF.leatherapron), + "", sewing, "hands", -1, 1, new Object[]{"LCL", " L ", 'L', Items.leather, 'C', Items.coal,}); + Salvage.addSalvage(ArmourListMF.leatherapron, new ItemStack(Items.leather, 3), Items.coal); + + KnowledgeListMF.hideHelmR = MineFantasyAPI.addCarpenterRecipe(null, + ArmourListMF.armour(ArmourListMF.leather, 0, 0), "", sewing, "hands", -1, 1, + new Object[]{"H", "C", "H", 'H', ComponentListMF.hideSmall, 'C', Blocks.wool,}); + KnowledgeListMF.hideChestR = MineFantasyAPI.addCarpenterRecipe(null, + ArmourListMF.armour(ArmourListMF.leather, 0, 1), "", sewing, "hands", -1, 1, + new Object[]{"H", "C", 'H', ComponentListMF.hideLarge, 'C', Blocks.wool,}); + KnowledgeListMF.hideLegsR = MineFantasyAPI.addCarpenterRecipe(null, + ArmourListMF.armour(ArmourListMF.leather, 0, 2), "", sewing, "hands", -1, 1, + new Object[]{"H", "C", 'H', ComponentListMF.hideMedium, 'C', Blocks.wool,}); + KnowledgeListMF.hideBootsR = MineFantasyAPI.addCarpenterRecipe(null, + ArmourListMF.armour(ArmourListMF.leather, 0, 3), "", sewing, "hands", -1, 1, + new Object[]{"H", "C", 'H', ComponentListMF.hideSmall, 'C', Blocks.wool,}); + + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 0), + new ItemStack(ComponentListMF.hideSmall, 2), Blocks.wool); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 1), ComponentListMF.hideLarge, Blocks.wool); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 2), ComponentListMF.hideMedium, + Blocks.wool); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 0, 3), ComponentListMF.hideSmall, Blocks.wool); + + KnowledgeListMF.bedrollR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.bedroll), "", + sewing, "needle", -1, 50, + new Object[]{"TLT", "CCC", 'C', Blocks.wool, 'T', ComponentListMF.thread, 'L', Items.leather}); + Salvage.addSalvage(ToolListMF.bedroll, new ItemStack(Blocks.wool, 3), Items.leather, + new ItemStack(ComponentListMF.thread, 3)); + } + + public static void addCrossbows() { + // CROSSBOWS + KnowledgeListMF.crossHandleWoodR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.crossbow_handle_wood), "crossShafts", nailHammer, "hammer", 2, 150, + new Object[]{"N N", "PP ", " P ", 'P', ComponentListMF.plank.construct("RefinedWood"), 'N', + ComponentListMF.nail}); + KnowledgeListMF.crossStockWoodR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.crossbow_stock_wood), "crossShafts", nailHammer, "hammer", 2, 300, + new Object[]{"NN N", "PPPP", " PPP", 'P', ComponentListMF.plank.construct("RefinedWood"), 'N', + ComponentListMF.nail}); + KnowledgeListMF.crossStockIronR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.crossbow_stock_iron), "crossShaftAdvanced", spanner, "spanner", 2, 300, + new Object[]{" BBB", "BOGG", "SWSS", " ", 'O', Blocks.obsidian, 'G', + ComponentListMF.tungsten_gears, 'W', ComponentListMF.crossbow_stock_wood, 'S', + ComponentListMF.iron_strut, 'B', ComponentListMF.bolt,}); + + KnowledgeListMF.crossHeadLightR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_arms_light), "crossHeads", nailHammer, "hammer", 2, 200, + new Object[]{"PPP", "NSN", " P ", 'P', ComponentListMF.plank.construct("RefinedWood"), 'N', + ComponentListMF.nail, 'S', Items.string,}); + KnowledgeListMF.crossHeadMediumR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_arms_basic), "crossHeads", nailHammer, "hammer", 2, 250, + new Object[]{"NNN", "PAP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"), 'A', ComponentListMF.cross_arms_light,}); + KnowledgeListMF.crossHeadHeavyR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_arms_heavy), "crossHeads", nailHammer, "hammer", 2, 350, + new Object[]{"NNN", "PAP", 'N', ComponentListMF.nail, 'P', + ComponentListMF.plank.construct("RefinedWood"), 'A', ComponentListMF.cross_arms_basic,}); + KnowledgeListMF.crossHeadAdvancedR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_arms_advanced), "crossHeadAdvanced", nailHammer, "hammer", 2, 350, + new Object[]{"NRN", "RGR", " A ", 'G', ComponentListMF.tungsten_gears, 'N', ComponentListMF.nail, 'R', + ComponentListMF.steel_tube, 'A', ComponentListMF.cross_arms_basic,}); + + KnowledgeListMF.crossAmmoR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_ammo), "crossAmmo", nailHammer, "hammer", 2, 200, + new Object[]{"NNN", "P P", "PGP", "PPP", 'G', ComponentListMF.tungsten_gears, 'P', + ComponentListMF.plank.construct("RefinedWood"), 'N', ComponentListMF.nail,}); + KnowledgeListMF.crossScopeR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cross_scope), "crossScope", spanner, "spanner", 2, 150, + new Object[]{"BSB", "GP ", 'G', ComponentListMF.tungsten_gears, 'S', ToolListMF.spyglass, 'P', + ComponentListMF.plank.construct("RefinedWood"), 'B', ComponentListMF.bolt,}); + Salvage.addSalvage(ComponentListMF.cross_arms_light, new ItemStack(ComponentListMF.nail, 2), Items.string, + ComponentListMF.plank.construct("RefinedWood", 4)); + Salvage.addSalvage(ComponentListMF.cross_arms_basic, new ItemStack(ComponentListMF.nail, 3), + ComponentListMF.cross_arms_light, ComponentListMF.plank.construct("RefinedWood", 2)); + Salvage.addSalvage(ComponentListMF.cross_arms_heavy, new ItemStack(ComponentListMF.nail, 3), + ComponentListMF.cross_arms_basic, ComponentListMF.plank.construct("RefinedWood", 2)); + Salvage.addSalvage(ComponentListMF.cross_arms_advanced, ComponentListMF.tungsten_gears, + new ItemStack(ComponentListMF.nail, 2), ComponentListMF.cross_arms_basic, + new ItemStack(ComponentListMF.steel_tube, 3)); + + Salvage.addSalvage(ComponentListMF.cross_scope, ComponentListMF.tungsten_gears, ToolListMF.spyglass, + new ItemStack(ComponentListMF.bolt, 2), ComponentListMF.plank.construct("RefinedWood")); + Salvage.addSalvage(ComponentListMF.cross_ammo, ComponentListMF.tungsten_gears, + new ItemStack(ComponentListMF.nail, 3), ComponentListMF.plank.construct("RefinedWood", 7)); + Salvage.addSalvage(ComponentListMF.crossbow_handle_wood, new ItemStack(ComponentListMF.nail, 2), + ComponentListMF.plank.construct("RefinedWood", 3)); + Salvage.addSalvage(ComponentListMF.crossbow_stock_wood, new ItemStack(ComponentListMF.nail, 3), + ComponentListMF.plank.construct("RefinedWood", 7)); + Salvage.addSalvage(ComponentListMF.crossbow_stock_iron, new ItemStack(ComponentListMF.tungsten_gears, 2), + Blocks.obsidian, new ItemStack(ComponentListMF.bolt, 4), new ItemStack(ComponentListMF.iron_strut, 3), + ComponentListMF.crossbow_stock_wood); + } + + private static void addEngineering() { + addCrossbows(); + KnowledgeListMF.bombBenchCraft = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.bombBench), "bombs", spanner, "spanner", 0, 150, new Object[]{"BFB", "BCB", + 'B', ComponentListMF.bolt, 'F', ComponentListMF.iron_frame, 'C', BlockListMF.carpenter,}); + KnowledgeListMF.bombPressCraft = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.bombPress), "bpress", spanner, "spanner", 3, 200, + new Object[]{"BFB", "GGL", "SPS", 'S', ComponentListMF.iron_strut, 'B', ComponentListMF.bolt, 'F', + ComponentListMF.iron_frame, 'L', Blocks.lever, 'P', + new ItemStack(CustomToolListMF.standard_spanner, 1, 0), 'G', ComponentListMF.bronze_gears,}); + + KnowledgeListMF.crossBenchCraft = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.crossbowBench), "crossbows", spanner, "spanner", 0, 200, + new Object[]{" F ", "PSP", "NCN", 'F', ComponentListMF.iron_frame, 'P', ComponentListMF.plank, 'N', + ComponentListMF.bolt, 'S', Items.string, 'C', BlockListMF.carpenter,}); + + KnowledgeListMF.engTannerR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.engTanner), "engTanner", spanner, "spanner", 3, 300, + new Object[]{"BLB", "SPS", "GGG", "SFS", 'S', ComponentListMF.iron_strut, 'B', ComponentListMF.bolt, + 'F', ComponentListMF.iron_frame, 'L', Blocks.lever, 'P', + new ItemStack(CustomToolListMF.standard_knife, 1, 0), 'G', ComponentListMF.bronze_gears,}); + ItemStack blackPlate = ComponentListMF.plate.createComm("blackSteel"); + KnowledgeListMF.advancedForgeR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.forge_metal), "advforge", spanner, "spanner", 4, 400, + new Object[]{" T ", "FRRF", "PPPP", "BBBB", 'B', ComponentListMF.bolt, 'F', + ComponentListMF.iron_frame, 'T', ToolListMF.engin_anvil_tools, 'P', blackPlate, 'R', + Blocks.redstone_block,}); + ItemStack steelPlate = ComponentListMF.plate.createComm("steel"); + KnowledgeListMF.autoCrucibleR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(BlockListMF.crucibleauto), "advcrucible", spanner, "spanner", 4, 200, + new Object[]{" T ", "PCP", "PGP", "BBB", 'B', ComponentListMF.bolt, 'C', BlockListMF.crucibleadv, 'G', + ComponentListMF.tungsten_gears, 'T', ToolListMF.engin_anvil_tools, 'P', steelPlate}); + KnowledgeListMF.spyglassR = MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ToolListMF.spyglass), + "spyglass", spanner, "spanner", 1, 300, + new Object[]{" T ", "BCB", "GPG", 'C', ComponentListMF.bronze_gears, 'G', Blocks.glass, 'B', + ComponentListMF.bolt, 'T', ToolListMF.engin_anvil_tools, 'P', ComponentListMF.steel_tube,}); + + KnowledgeListMF.syringeR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ToolListMF.syringe_empty), "syringe", spanner, "spanner", 1, 200, + new Object[]{"E", "T", "B", "N", 'E', ToolListMF.engin_anvil_tools, 'T', ComponentListMF.steel_tube, + 'B', Items.glass_bottle, 'N', new ItemStack(CustomToolListMF.standard_needle),}); + + KnowledgeListMF.parachuteR = MineFantasyAPI.addCarpenterRecipe(engineering, new ItemStack(ToolListMF.parachute), + "parachute", sewing, "needle", 1, 350, + new Object[]{"TTT", "CCC", "BEB", "BLB", 'E', ToolListMF.engin_anvil_tools, 'T', + ComponentListMF.thread, 'B', ComponentListMF.leather_strip, 'L', Items.leather, 'C', + Blocks.wool,}); + KnowledgeListMF.cogShaftR = MineFantasyAPI.addCarpenterRecipe(engineering, + new ItemStack(ComponentListMF.cogwork_shaft), "cogArmour", spanner, "spanner", 4, 150, + new Object[]{"BPB", "SGS", "BFB", + + 'P', Blocks.piston, 'G', ComponentListMF.tungsten_gears, 'B', ComponentListMF.bolt, 'F', + ComponentListMF.iron_frame, 'S', ComponentListMF.iron_strut,}); + Salvage.addSalvage(ComponentListMF.cogwork_shaft, new ItemStack(ComponentListMF.iron_strut, 2), + new ItemStack(ComponentListMF.bolt, 4), ComponentListMF.iron_frame, Blocks.piston, + ComponentListMF.tungsten_gears); + + Salvage.addSalvage(BlockListMF.crucibleauto, new ItemStack(ComponentListMF.bolt, 3), + ComponentListMF.tungsten_gears, BlockListMF.crucibleadv, steelPlate, steelPlate, steelPlate, + steelPlate); + Salvage.addSalvage(BlockListMF.bombBench, new ItemStack(ComponentListMF.bolt, 4), ComponentListMF.iron_frame, + BlockListMF.carpenter); + Salvage.addSalvage(BlockListMF.crossbowBench, new ItemStack(ComponentListMF.nail, 2), + ComponentListMF.plank.construct("ScrapWood", 2), Items.string, BlockListMF.carpenter); + Salvage.addSalvage(BlockListMF.bombPress, new ItemStack(ComponentListMF.iron_strut, 2), + new ItemStack(ComponentListMF.bolt, 2), new ItemStack(ComponentListMF.bronze_gears, 2), Blocks.lever, + ComponentListMF.iron_frame); + Salvage.addSalvage(BlockListMF.engTanner, new ItemStack(ComponentListMF.iron_strut, 4), + new ItemStack(ComponentListMF.bolt, 2), new ItemStack(ComponentListMF.bronze_gears, 3), + CustomToolListMF.standard_needle, Blocks.lever, ComponentListMF.iron_frame); + Salvage.addSalvage(BlockListMF.forge_metal, new ItemStack(ComponentListMF.bolt, 4), blackPlate, blackPlate, + blackPlate, blackPlate, new ItemStack(ComponentListMF.iron_frame, 2), + new ItemStack(Blocks.redstone_block, 2)); + Salvage.addSalvage(ToolListMF.spyglass, new ItemStack(ComponentListMF.bolt, 2), new ItemStack(Blocks.glass, 2), + ComponentListMF.steel_tube, ComponentListMF.bronze_gears); + Salvage.addSalvage(ToolListMF.syringe_empty, Items.glass_bottle, CustomToolListMF.standard_needle, + ComponentListMF.steel_tube); + Salvage.addSalvage(ToolListMF.parachute, new ItemStack(ComponentListMF.thread, 3), + new ItemStack(Blocks.wool, 3), new ItemStack(ComponentListMF.leather_strip, 4), Items.leather); + } + + private static void addNonPrimitiveStone() { + KnowledgeListMF.stoneKnifeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.knifeStone), "", + primitive, "hands", -1, 4, + new Object[]{"R", "R", "S", 'R', Blocks.cobblestone, 'S', ComponentListMF.plank,}); + KnowledgeListMF.stoneHammerR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hammerStone), + "", primitive, "hands", -1, 4, + new Object[]{"R", "S", 'R', Blocks.cobblestone, 'S', ComponentListMF.plank,}); + + KnowledgeListMF.stoneTongsR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.tongsStone), "", + primitive, "hands", -1, 4, + new Object[]{"R ", "SR", 'R', Blocks.cobblestone, 'S', ComponentListMF.plank,}); + KnowledgeListMF.boneNeedleR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.needleBone), "", + primitive, "hands", -1, 4, new Object[]{"B", 'B', Items.bone,}); + + Salvage.addSalvage(ToolListMF.knifeStone, new ItemStack(Blocks.cobblestone, 2), + ComponentListMF.plank.construct("ScrapWood")); + Salvage.addSalvage(ToolListMF.hammerStone, Blocks.cobblestone, ComponentListMF.plank.construct("ScrapWood")); + Salvage.addSalvage(ToolListMF.tongsStone, new ItemStack(Blocks.cobblestone, 2), + ComponentListMF.plank.construct("ScrapWood")); + Salvage.addSalvage(ToolListMF.needleBone, Items.bone); + } + + private static void addPrimitive() { + KnowledgeListMF.dirtRockR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.sharp_rock), + "", "minecraft:dig.gravel", "hands", -1, 1, new Object[]{"D", 'D', Blocks.dirt,}); + + KnowledgeListMF.stonePickR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.pickStone), "", + primitive, "hands", -1, 5, new Object[]{"RVR", " S ", " S ", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + KnowledgeListMF.stoneAxeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.axeStone), "", + primitive, "hands", -1, 5, new Object[]{"RV", "RS", " S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + KnowledgeListMF.stoneSpadeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.spadeStone), "", + primitive, "hands", -1, 5, new Object[]{"VR", " S", " S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + KnowledgeListMF.stoneHoeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hoeStone), "", + primitive, "hands", -1, 5, new Object[]{"RV", " S", " S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + KnowledgeListMF.stoneSwordR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.swordStone), "", + primitive, "hands", -1, 8, new Object[]{"R ", "R ", "SV", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + KnowledgeListMF.stoneWarR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.waraxeStone), "", + primitive, "hands", -1, 8, new Object[]{"VRV", "RS", " S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + KnowledgeListMF.stoneMaceR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.maceStone), "", + primitive, "hands", -1, 8, new Object[]{" V ", "RSR", " S ", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + KnowledgeListMF.stoneSpearR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.spearStone), "", + primitive, "hands", -1, 8, new Object[]{"R", "V", "S", "S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + KnowledgeListMF.stoneKnifeR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.knifeStone), "", + primitive, "hands", -1, 4, new Object[]{"R ", "SV", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + KnowledgeListMF.stoneHammerR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.hammerStone), + "", primitive, "hands", -1, 4, new Object[]{"R", "V", "S", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + + KnowledgeListMF.stoneTongsR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.tongsStone), "", + primitive, "hands", -1, 4, new Object[]{" R", "SV", 'R', ComponentListMF.sharp_rock, 'V', + ComponentListMF.vine, 'S', Items.stick}); + KnowledgeListMF.boneNeedleR = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ToolListMF.needleBone), "", + primitive, "hands", -1, 4, new Object[]{"B", 'B', Items.bone,}); + + Salvage.addSalvage(ToolListMF.pickStone, new ItemStack(ComponentListMF.sharp_rock, 2), + new ItemStack(Items.stick, 2), ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.axeStone, new ItemStack(ComponentListMF.sharp_rock, 2), + new ItemStack(Items.stick, 2), ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.spadeStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), + ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.hoeStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), + ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.swordStone, Items.stick, new ItemStack(ComponentListMF.sharp_rock, 2), + ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.waraxeStone, new ItemStack(ComponentListMF.sharp_rock, 2), + new ItemStack(Items.stick, 2), new ItemStack(ComponentListMF.vine, 2)); + Salvage.addSalvage(ToolListMF.maceStone, new ItemStack(ComponentListMF.sharp_rock, 2), + new ItemStack(Items.stick, 2), ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.spearStone, ComponentListMF.sharp_rock, new ItemStack(Items.stick, 2), + ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.knifeStone, ComponentListMF.sharp_rock, Items.stick, ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.hammerStone, ComponentListMF.sharp_rock, Items.stick, ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.tongsStone, ComponentListMF.sharp_rock, Items.stick, ComponentListMF.vine); + Salvage.addSalvage(ToolListMF.needleBone, Items.bone); + } + + public static void initTierWood() { + String basic = CarpenterRecipes.basic; + + float time = 4; + Item plank = ComponentListMF.plank; + + KnowledgeListMF.spoonR = MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_spoon, "", + basic, "hands", -1, 1 + (int) (1 * time), new Object[]{"W", "S", 'W', plank, 'S', Items.stick}); + Salvage.addSalvage(CustomToolListMF.standard_spoon, plank, Items.stick); + KnowledgeListMF.malletR = MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_mallet, "", + basic, "hands", -1, 1 + (int) (2 * time), new Object[]{"WW", " S", 'W', plank, 'S', Items.stick}); + Salvage.addSalvage(CustomToolListMF.standard_mallet, plank, plank, Items.stick); + Salvage.addSalvage(CustomToolListMF.standard_spoon, plank, Items.stick); + + KnowledgeListMF.refinedPlankR.add(MineFantasyAPI.addCarpenterRecipe(construction, + ComponentListMF.plank.construct("RefinedWood"), "", basic, "hands", -1, 1, + new Object[]{"O", "P", 'O', ComponentListMF.plant_oil, 'P', (ComponentListMF.plank)})); + KnowledgeListMF.easyPaintPlank.add(MineFantasyAPI.addCarpenterRecipe(construction, + ComponentListMF.plank.construct("RefinedWood", 4), "paint_brush", sewing, "brush", -1, 2, + new Object[]{" O ", "PPPP", 'O', ComponentListMF.plant_oil, 'P', (ComponentListMF.plank)})); + } + + static void tryAddSawPlanks(ItemStack planks, CustomMaterial material) { + String sub = material.name.substring(0, material.name.length() - 4).toLowerCase(); + + if (planks.getUnlocalizedName().toLowerCase().contains(sub)) { + addSawPlanks(planks, material); + } + } + + static void addSawPlanks(ItemStack planks, CustomMaterial material) { + MineFantasyAPI.addCarpenterRecipe(construction, (ComponentListMF.plank).construct(material.name, 4), + "commodities", sawing, "saw", -1, 10, new Object[]{"P", 'P', planks.copy()}); + } } diff --git a/src/main/java/minefantasy/mf2/recipe/ComponentAnvilRecipe.java b/src/main/java/minefantasy/mf2/recipe/ComponentAnvilRecipe.java index d232b693..4b69ebec 100644 --- a/src/main/java/minefantasy/mf2/recipe/ComponentAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/recipe/ComponentAnvilRecipe.java @@ -10,69 +10,69 @@ import net.minecraftforge.oredict.OreDictionary; public class ComponentAnvilRecipe extends ShapedAnvilRecipes { - public ComponentAnvilRecipe(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, - int hammer, int anvi, float exp, boolean hot, String research, Skill skill) { - super(wdth, heit, inputs, output, toolType, time, hammer, anvi, exp, hot, research, skill); - } + public ComponentAnvilRecipe(int wdth, int heit, ItemStack[] inputs, ItemStack output, String toolType, int time, + int hammer, int anvi, float exp, boolean hot, String research, Skill skill) { + super(wdth, heit, inputs, output, toolType, time, hammer, anvi, exp, hot, research, skill); + } - protected boolean checkMatch(InventoryCrafting matrix, int x, int y, boolean b) { - String baseMaterial = null; - for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) { - for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) { - int var7 = var5 - x; - int var8 = var6 - y; - ItemStack recipeItem = null; + protected boolean checkMatch(InventoryCrafting matrix, int x, int y, boolean b) { + String baseMaterial = null; + for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) { + for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) { + int var7 = var5 - x; + int var8 = var6 - y; + ItemStack recipeItem = null; - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { - if (b) { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; - } else { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; - } - } + if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (b) { + recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + } else { + recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + } + } - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); - if (inputItem != null || recipeItem != null) { - CustomMaterial material = CustomMaterial.getMaterialFor(inputItem, "base"); - if (material != null) { - if (baseMaterial == null) { - baseMaterial = material.name; - } else { - if (material.name != baseMaterial) { - return false; - } - } - } - // HEATING - if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { - return false; - } - if (!Heatable.isWorkable(inputItem)) { - return false; - } - inputItem = getHotItem(inputItem); + if (inputItem != null || recipeItem != null) { + CustomMaterial material = CustomMaterial.getMaterialFor(inputItem, "base"); + if (material != null) { + if (baseMaterial == null) { + baseMaterial = material.name; + } else { + if (material.name != baseMaterial) { + return false; + } + } + } + // HEATING + if (Heatable.requiresHeating && Heatable.canHeatItem(inputItem)) { + return false; + } + if (!Heatable.isWorkable(inputItem)) { + return false; + } + inputItem = getHotItem(inputItem); - if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { - return false; - } + if (inputItem == null && recipeItem != null || inputItem != null && recipeItem == null) { + return false; + } - if (inputItem == null) { - return false; - } + if (inputItem == null) { + return false; + } - if (recipeItem.getItem() != inputItem.getItem()) { - return false; - } + if (recipeItem.getItem() != inputItem.getItem()) { + return false; + } - if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE - && recipeItem.getItemDamage() != inputItem.getItemDamage()) { - return false; - } - } - } - } + if (recipeItem.getItemDamage() != OreDictionary.WILDCARD_VALUE + && recipeItem.getItemDamage() != inputItem.getItemDamage()) { + return false; + } + } + } + } - return true; - } + return true; + } } diff --git a/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java b/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java index 529a07a2..54761c6a 100644 --- a/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java @@ -11,112 +11,106 @@ import net.minecraft.item.ItemStack; public class CookingRecipes { - public static void init() { - cookMeat(FoodListMF.horse_raw, FoodListMF.horse_cooked); - cookMeat(FoodListMF.wolf_raw, FoodListMF.wolf_cooked); - cookMeat(FoodListMF.saussage_raw, FoodListMF.saussage_cooked); - cookMeat(FoodListMF.generic_meat_uncooked, FoodListMF.generic_meat_cooked); - cookMeat(FoodListMF.generic_meat_strip_uncooked, FoodListMF.generic_meat_strip_cooked); - cookMeat(FoodListMF.generic_meat_chunk_uncooked, FoodListMF.generic_meat_chunk_cooked); - - bake(FoodListMF.dough, FoodListMF.breadroll, 150, 300, 10, 20, true); - bake(FoodListMF.raw_bread, Items.bread, 150, 300, 20, 40, true); - bake(FoodListMF.curds, FoodListMF.cheese_pot, 100, 300, 60, 20, false); - bake(FoodListMF.sweetroll_raw, FoodListMF.sweetroll_uniced, 150, 250, 20, 10, true); - - bake(FoodListMF.pie_pumpkin_uncooked, FoodListMF.pie_pumpkin_cooked, 150, 300, 20, 20, FoodListMF.burnt_pie); - bake(FoodListMF.pie_apple_uncooked, FoodListMF.pie_apple_cooked, 150, 300, 25, 20, FoodListMF.burnt_pie); - bake(FoodListMF.pie_berry_uncooked, FoodListMF.pie_berry_cooked, 150, 300, 25, 20, FoodListMF.burnt_pie); - bake(FoodListMF.pie_meat_uncooked, FoodListMF.pie_meat_cooked, 150, 300, 30, 20, FoodListMF.burnt_pie); - bake(FoodListMF.pie_shepard_uncooked, FoodListMF.pie_shepard_cooked, 150, 300, 30, 20, FoodListMF.burnt_pie); - - bake(FoodListMF.cake_simple_raw, FoodListMF.cake_simple_uniced, 150, 250, 30, 30, FoodListMF.burnt_cake); - bake(FoodListMF.cake_raw, FoodListMF.cake_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); - bake(FoodListMF.cake_choc_raw, FoodListMF.cake_choc_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); - bake(FoodListMF.cake_carrot_raw, FoodListMF.cake_carrot_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); - bake(FoodListMF.cake_bf_raw, FoodListMF.cake_bf_uniced, 150, 250, 50, 10, FoodListMF.burnt_cake); - bake(FoodListMF.eclair_raw, FoodListMF.eclair_uniced, 150, 250, 60, 5, true); - - addCeramics(); - MineFantasyAPI.addCookingRecipe(new ItemStack(FoodListMF.generic_meat_mince_uncooked), - new ItemStack(FoodListMF.generic_meat_mince_cooked), new ItemStack(FoodListMF.burnt_pot), 100, 200, 10, - false); - - MineFantasyAPI.addCookingRecipe(new ItemStack(FoodListMF.bowl_water_salt), new ItemStack(FoodListMF.salt), 100, - 200, 2, false, false); - - if (!ConfigHardcore.preventCook) { - smeltFood(); - } - } - - /** - * Cook in for out on anything (100C-200C, for ~15s) - */ - private static CookRecipe cookMeat(Item in, Item out) { - return MineFantasyAPI.addCookingRecipe(new ItemStack(in), new ItemStack(out), 100, 200, 15, false); - } - - /** - * Cook in for out enclosed in ovens - * - * @param temp - * how hot the oven is - * @param offset - * the room for error +/- - * @param time - * how much time roughly - */ - private static CookRecipe bake(Item in, Item out, int mint, int maxt, int time, int burn_time, boolean burn) { - return MineFantasyAPI.addCookingRecipe(new ItemStack(in), new ItemStack(out), - new ItemStack(FoodListMF.burnt_food), mint, maxt, time, burn_time, true, burn); - } - - /** - * Cook in for out enclosed in ovens - * - * @param temp - * how hot the oven is - * @param offset - * the room for error +/- - * @param time - * how much time roughly - */ - private static CookRecipe bake(Item in, Item out, int mint, int maxt, int time, int burn_time, Item burn) { - return MineFantasyAPI.addCookingRecipe(new ItemStack(in), new ItemStack(out), new ItemStack(burn), mint, maxt, - time, burn_time, true); - } - - private static void smeltFood() { - GameRegistry.addSmelting(FoodListMF.horse_raw, new ItemStack(FoodListMF.horse_cooked), 0.2F); - GameRegistry.addSmelting(FoodListMF.wolf_raw, new ItemStack(FoodListMF.wolf_cooked), 0.2F); - GameRegistry.addSmelting(FoodListMF.generic_meat_uncooked, new ItemStack(FoodListMF.generic_meat_cooked), 0); - GameRegistry.addSmelting(FoodListMF.generic_meat_strip_uncooked, - new ItemStack(FoodListMF.generic_meat_strip_cooked), 0); - GameRegistry.addSmelting(FoodListMF.generic_meat_chunk_uncooked, - new ItemStack(FoodListMF.generic_meat_chunk_cooked), 0); - GameRegistry.addSmelting(FoodListMF.generic_meat_mince_uncooked, - new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); - GameRegistry.addSmelting(FoodListMF.bowl_water_salt, new ItemStack(FoodListMF.salt), 0); - GameRegistry.addSmelting(FoodListMF.saussage_raw, new ItemStack(FoodListMF.saussage_cooked), 0); - - } - - private static void addCeramics() { - bakeCeramic(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot, 1000, 5); - bakeCeramic(FoodListMF.jug_uncooked, FoodListMF.jug_empty, 1000, 5); - bakeCeramic(ComponentListMF.pie_tray_uncooked, FoodListMF.pie_tray, 1000, 10); - bakeCeramic(ComponentListMF.ingot_mould_uncooked, ComponentListMF.ingot_mould, 1000, 5); - bakeCeramic(ComponentListMF.mine_casing_uncooked, ComponentListMF.mine_casing, 1000, 10); - bakeCeramic(ComponentListMF.bomb_casing_uncooked, ComponentListMF.bomb_casing, 1000, 10); - - bakeCeramic(ComponentListMF.fireclay_brick, ComponentListMF.strong_brick, 1500, 5); - } - - private static CookRecipe bakeCeramic(Item clay, Item ceramic, int temp, int time) { - GameRegistry.addSmelting(clay, new ItemStack(ceramic), 0F); - return MineFantasyAPI.addCookingRecipe(new ItemStack(clay), new ItemStack(ceramic), null, temp, 1000, time, 0, - true, false); - - } + public static void init() { + cookMeat(FoodListMF.horse_raw, FoodListMF.horse_cooked); + cookMeat(FoodListMF.wolf_raw, FoodListMF.wolf_cooked); + cookMeat(FoodListMF.saussage_raw, FoodListMF.saussage_cooked); + cookMeat(FoodListMF.generic_meat_uncooked, FoodListMF.generic_meat_cooked); + cookMeat(FoodListMF.generic_meat_strip_uncooked, FoodListMF.generic_meat_strip_cooked); + cookMeat(FoodListMF.generic_meat_chunk_uncooked, FoodListMF.generic_meat_chunk_cooked); + + bake(FoodListMF.dough, FoodListMF.breadroll, 150, 300, 10, 20, true); + bake(FoodListMF.raw_bread, Items.bread, 150, 300, 20, 40, true); + bake(FoodListMF.curds, FoodListMF.cheese_pot, 100, 300, 60, 20, false); + bake(FoodListMF.sweetroll_raw, FoodListMF.sweetroll_uniced, 150, 250, 20, 10, true); + + bake(FoodListMF.pie_pumpkin_uncooked, FoodListMF.pie_pumpkin_cooked, 150, 300, 20, 20, FoodListMF.burnt_pie); + bake(FoodListMF.pie_apple_uncooked, FoodListMF.pie_apple_cooked, 150, 300, 25, 20, FoodListMF.burnt_pie); + bake(FoodListMF.pie_berry_uncooked, FoodListMF.pie_berry_cooked, 150, 300, 25, 20, FoodListMF.burnt_pie); + bake(FoodListMF.pie_meat_uncooked, FoodListMF.pie_meat_cooked, 150, 300, 30, 20, FoodListMF.burnt_pie); + bake(FoodListMF.pie_shepard_uncooked, FoodListMF.pie_shepard_cooked, 150, 300, 30, 20, FoodListMF.burnt_pie); + + bake(FoodListMF.cake_simple_raw, FoodListMF.cake_simple_uniced, 150, 250, 30, 30, FoodListMF.burnt_cake); + bake(FoodListMF.cake_raw, FoodListMF.cake_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); + bake(FoodListMF.cake_choc_raw, FoodListMF.cake_choc_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); + bake(FoodListMF.cake_carrot_raw, FoodListMF.cake_carrot_uniced, 150, 250, 40, 20, FoodListMF.burnt_cake); + bake(FoodListMF.cake_bf_raw, FoodListMF.cake_bf_uniced, 150, 250, 50, 10, FoodListMF.burnt_cake); + bake(FoodListMF.eclair_raw, FoodListMF.eclair_uniced, 150, 250, 60, 5, true); + + addCeramics(); + MineFantasyAPI.addCookingRecipe(new ItemStack(FoodListMF.generic_meat_mince_uncooked), + new ItemStack(FoodListMF.generic_meat_mince_cooked), new ItemStack(FoodListMF.burnt_pot), 100, 200, 10, + false); + + MineFantasyAPI.addCookingRecipe(new ItemStack(FoodListMF.bowl_water_salt), new ItemStack(FoodListMF.salt), 100, + 200, 2, false, false); + + if (!ConfigHardcore.preventCook) { + smeltFood(); + } + } + + /** + * Cook in for out on anything (100C-200C, for ~15s) + */ + private static CookRecipe cookMeat(Item in, Item out) { + return MineFantasyAPI.addCookingRecipe(new ItemStack(in), new ItemStack(out), 100, 200, 15, false); + } + + /** + * Cook in for out enclosed in ovens + * + * @param temp how hot the oven is + * @param offset the room for error +/- + * @param time how much time roughly + */ + private static CookRecipe bake(Item in, Item out, int mint, int maxt, int time, int burn_time, boolean burn) { + return MineFantasyAPI.addCookingRecipe(new ItemStack(in), new ItemStack(out), + new ItemStack(FoodListMF.burnt_food), mint, maxt, time, burn_time, true, burn); + } + + /** + * Cook in for out enclosed in ovens + * + * @param temp how hot the oven is + * @param offset the room for error +/- + * @param time how much time roughly + */ + private static CookRecipe bake(Item in, Item out, int mint, int maxt, int time, int burn_time, Item burn) { + return MineFantasyAPI.addCookingRecipe(new ItemStack(in), new ItemStack(out), new ItemStack(burn), mint, maxt, + time, burn_time, true); + } + + private static void smeltFood() { + GameRegistry.addSmelting(FoodListMF.horse_raw, new ItemStack(FoodListMF.horse_cooked), 0.2F); + GameRegistry.addSmelting(FoodListMF.wolf_raw, new ItemStack(FoodListMF.wolf_cooked), 0.2F); + GameRegistry.addSmelting(FoodListMF.generic_meat_uncooked, new ItemStack(FoodListMF.generic_meat_cooked), 0); + GameRegistry.addSmelting(FoodListMF.generic_meat_strip_uncooked, + new ItemStack(FoodListMF.generic_meat_strip_cooked), 0); + GameRegistry.addSmelting(FoodListMF.generic_meat_chunk_uncooked, + new ItemStack(FoodListMF.generic_meat_chunk_cooked), 0); + GameRegistry.addSmelting(FoodListMF.generic_meat_mince_uncooked, + new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); + GameRegistry.addSmelting(FoodListMF.bowl_water_salt, new ItemStack(FoodListMF.salt), 0); + GameRegistry.addSmelting(FoodListMF.saussage_raw, new ItemStack(FoodListMF.saussage_cooked), 0); + + } + + private static void addCeramics() { + bakeCeramic(ComponentListMF.clay_pot_uncooked, ComponentListMF.clay_pot, 1000, 5); + bakeCeramic(FoodListMF.jug_uncooked, FoodListMF.jug_empty, 1000, 5); + bakeCeramic(ComponentListMF.pie_tray_uncooked, FoodListMF.pie_tray, 1000, 10); + bakeCeramic(ComponentListMF.ingot_mould_uncooked, ComponentListMF.ingot_mould, 1000, 5); + bakeCeramic(ComponentListMF.mine_casing_uncooked, ComponentListMF.mine_casing, 1000, 10); + bakeCeramic(ComponentListMF.bomb_casing_uncooked, ComponentListMF.bomb_casing, 1000, 10); + + bakeCeramic(ComponentListMF.fireclay_brick, ComponentListMF.strong_brick, 1500, 5); + } + + private static CookRecipe bakeCeramic(Item clay, Item ceramic, int temp, int time) { + GameRegistry.addSmelting(clay, new ItemStack(ceramic), 0F); + return MineFantasyAPI.addCookingRecipe(new ItemStack(clay), new ItemStack(ceramic), null, temp, 1000, time, 0, + true, false); + + } } diff --git a/src/main/java/minefantasy/mf2/recipe/CustomWoodRecipes.java b/src/main/java/minefantasy/mf2/recipe/CustomWoodRecipes.java index 8fc5381b..69ffb549 100644 --- a/src/main/java/minefantasy/mf2/recipe/CustomWoodRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CustomWoodRecipes.java @@ -1,8 +1,5 @@ package minefantasy.mf2.recipe; -import java.util.ArrayList; -import java.util.Iterator; - import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.Salvage; import minefantasy.mf2.api.material.CustomMaterial; @@ -15,82 +12,85 @@ import minefantasy.mf2.knowledge.KnowledgeListMF; import net.minecraft.item.ItemStack; +import java.util.ArrayList; +import java.util.Iterator; + public class CustomWoodRecipes { - public static final String basic = "step.wood"; - public static final String chopping = "dig.wood"; - public static final String sawing = "minefantasy2:block.sawcarpenter"; - public static final String nailHammer = "minefantasy2:block.hammercarpenter"; - public static final String woodHammer = "minefantasy2:block.carpentermallet"; - private static final Skill construction = SkillList.construction; + public static final String basic = "step.wood"; + public static final String chopping = "dig.wood"; + public static final String sawing = "minefantasy2:block.sawcarpenter"; + public static final String nailHammer = "minefantasy2:block.hammercarpenter"; + public static final String woodHammer = "minefantasy2:block.carpentermallet"; + private static final Skill construction = SkillList.construction; - public static void init() { - ArrayList wood = CustomMaterial.getList("wood"); - Iterator iterator = wood.iterator(); - while (iterator.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iterator.next(); - addRecipes(customMat); - } - } + public static void init() { + ArrayList wood = CustomMaterial.getList("wood"); + Iterator iterator = wood.iterator(); + while (iterator.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iterator.next(); + addRecipes(customMat); + } + } - private static void addRecipes(CustomMaterial material) { - ItemStack timber = ComponentListMF.plank.construct(material.name); - ItemStack cutPlank = ((ItemComponentMF) ComponentListMF.plank_cut).construct(material.name); - ItemStack woodpane = ((ItemComponentMF) ComponentListMF.plank_pane).construct(material.name); + private static void addRecipes(CustomMaterial material) { + ItemStack timber = ComponentListMF.plank.construct(material.name); + ItemStack cutPlank = ((ItemComponentMF) ComponentListMF.plank_cut).construct(material.name); + ItemStack woodpane = ((ItemComponentMF) ComponentListMF.plank_pane).construct(material.name); - ItemStack result; - int time; + ItemStack result; + int time; - time = 5; - KnowledgeListMF.sawnPlankR.add(MineFantasyAPI.addCarpenterRecipe(construction, cutPlank, "", sawing, "saw", - material.tier, (int) (material.durability * time), new Object[] { "T", 'T', timber, })); + time = 5; + KnowledgeListMF.sawnPlankR.add(MineFantasyAPI.addCarpenterRecipe(construction, cutPlank, "", sawing, "saw", + material.tier, (int) (material.durability * time), new Object[]{"T", 'T', timber,})); - time = 20; - KnowledgeListMF.plankPaneR.add(MineFantasyAPI.addCarpenterRecipe(construction, woodpane, "", nailHammer, - "hammer", material.tier, (int) (material.durability * time), - new Object[] { "NNN", "CTC", "CTC", 'T', timber, 'C', cutPlank, 'N', ComponentListMF.nail, })); - Salvage.addSalvage(woodpane, cutPlank, cutPlank, cutPlank, cutPlank, timber, timber, - new ItemStack(ComponentListMF.nail, 3)); + time = 20; + KnowledgeListMF.plankPaneR.add(MineFantasyAPI.addCarpenterRecipe(construction, woodpane, "", nailHammer, + "hammer", material.tier, (int) (material.durability * time), + new Object[]{"NNN", "CTC", "CTC", 'T', timber, 'C', cutPlank, 'N', ComponentListMF.nail,})); + Salvage.addSalvage(woodpane, cutPlank, cutPlank, cutPlank, cutPlank, timber, timber, + new ItemStack(ComponentListMF.nail, 3)); - time = 10; - result = ((BlockWoodDecor) BlockListMF.rack_wood).construct(material.name); - KnowledgeListMF.rackRecipe.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "", nailHammer, "hammer", - material.tier, (int) (material.durability * time), - new Object[] { "N N", "T T", "CCC", "T T", 'N', ComponentListMF.nail, 'T', timber, 'C', cutPlank, })); - Salvage.addSalvage(result, cutPlank, cutPlank, cutPlank, timber, timber, timber, timber, - new ItemStack(ComponentListMF.nail, 2)); + time = 10; + result = ((BlockWoodDecor) BlockListMF.rack_wood).construct(material.name); + KnowledgeListMF.rackRecipe.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "", nailHammer, "hammer", + material.tier, (int) (material.durability * time), + new Object[]{"N N", "T T", "CCC", "T T", 'N', ComponentListMF.nail, 'T', timber, 'C', cutPlank,})); + Salvage.addSalvage(result, cutPlank, cutPlank, cutPlank, timber, timber, timber, timber, + new ItemStack(ComponentListMF.nail, 2)); - time = 20; - result = ((BlockWoodDecor) BlockListMF.food_box_basic).construct(material.name); - KnowledgeListMF.foodboxR.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "food_box", nailHammer, - "hammer", material.tier, (int) (material.durability * time), new Object[] { "HC ", "C C", "NCN", 'N', - ComponentListMF.nail, 'H', ComponentListMF.hinge, 'C', cutPlank, })); - Salvage.addSalvage(result, cutPlank, cutPlank, cutPlank, cutPlank, new ItemStack(ComponentListMF.nail, 2), - ComponentListMF.hinge); + time = 20; + result = ((BlockWoodDecor) BlockListMF.food_box_basic).construct(material.name); + KnowledgeListMF.foodboxR.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "food_box", nailHammer, + "hammer", material.tier, (int) (material.durability * time), new Object[]{"HC ", "C C", "NCN", 'N', + ComponentListMF.nail, 'H', ComponentListMF.hinge, 'C', cutPlank,})); + Salvage.addSalvage(result, cutPlank, cutPlank, cutPlank, cutPlank, new ItemStack(ComponentListMF.nail, 2), + ComponentListMF.hinge); - time = 30; - result = ((BlockWoodDecor) BlockListMF.ammo_box_basic).construct(material.name); - KnowledgeListMF.ammoboxR.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "ammo_box", nailHammer, - "hammer", material.tier, (int) (material.durability * time), new Object[] { "HPH", "C C", "NPN", 'N', - ComponentListMF.nail, 'H', ComponentListMF.hinge, 'P', woodpane, 'C', cutPlank, })); - Salvage.addSalvage(result, cutPlank, cutPlank, woodpane, woodpane, new ItemStack(ComponentListMF.nail, 2), - new ItemStack(ComponentListMF.hinge, 2)); + time = 30; + result = ((BlockWoodDecor) BlockListMF.ammo_box_basic).construct(material.name); + KnowledgeListMF.ammoboxR.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "ammo_box", nailHammer, + "hammer", material.tier, (int) (material.durability * time), new Object[]{"HPH", "C C", "NPN", 'N', + ComponentListMF.nail, 'H', ComponentListMF.hinge, 'P', woodpane, 'C', cutPlank,})); + Salvage.addSalvage(result, cutPlank, cutPlank, woodpane, woodpane, new ItemStack(ComponentListMF.nail, 2), + new ItemStack(ComponentListMF.hinge, 2)); - time = 50; - result = ((BlockWoodDecor) BlockListMF.crate_basic).construct(material.name); - KnowledgeListMF.bigboxR.add( - MineFantasyAPI.addCarpenterRecipe(construction, result, "big_box", nailHammer, "hammer", material.tier, - (int) (material.durability * time), new Object[] { "NNNN", "HPPH", "P P", " PP ", 'N', - ComponentListMF.nail, 'H', ComponentListMF.hinge, 'P', woodpane, 'C', cutPlank, })); - Salvage.addSalvage(result, woodpane, woodpane, woodpane, woodpane, woodpane, woodpane, - new ItemStack(ComponentListMF.nail, 4), new ItemStack(ComponentListMF.hinge, 2)); + time = 50; + result = ((BlockWoodDecor) BlockListMF.crate_basic).construct(material.name); + KnowledgeListMF.bigboxR.add( + MineFantasyAPI.addCarpenterRecipe(construction, result, "big_box", nailHammer, "hammer", material.tier, + (int) (material.durability * time), new Object[]{"NNNN", "HPPH", "P P", " PP ", 'N', + ComponentListMF.nail, 'H', ComponentListMF.hinge, 'P', woodpane, 'C', cutPlank,})); + Salvage.addSalvage(result, woodpane, woodpane, woodpane, woodpane, woodpane, woodpane, + new ItemStack(ComponentListMF.nail, 4), new ItemStack(ComponentListMF.hinge, 2)); - time = 15; - result = ((BlockWoodDecor) BlockListMF.trough_wood).construct(material.name); - KnowledgeListMF.nailTroughR.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "", nailHammer, - "hammer", material.tier, (int) (material.durability * time), - new Object[] { "P P", "PPP", "NNN", 'N', ComponentListMF.nail, 'P', timber, })); - Salvage.addSalvage(result, timber, timber, timber, timber, timber, new ItemStack(ComponentListMF.nail, 3)); + time = 15; + result = ((BlockWoodDecor) BlockListMF.trough_wood).construct(material.name); + KnowledgeListMF.nailTroughR.add(MineFantasyAPI.addCarpenterRecipe(construction, result, "", nailHammer, + "hammer", material.tier, (int) (material.durability * time), + new Object[]{"P P", "PPP", "NNN", 'N', ComponentListMF.nail, 'P', timber,})); + Salvage.addSalvage(result, timber, timber, timber, timber, timber, new ItemStack(ComponentListMF.nail, 3)); - } + } } diff --git a/src/main/java/minefantasy/mf2/recipe/ForgedArmourRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgedArmourRecipes.java index 10288241..d631b8e0 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgedArmourRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgedArmourRecipes.java @@ -12,245 +12,245 @@ import net.minecraft.item.ItemStack; public class ForgedArmourRecipes { - private static final Skill artisanry = SkillList.artisanry; - private static final Skill engineering = SkillList.engineering; - private static final Skill construction = SkillList.construction; - - public static void init() { - addMetalComponents(); - assembleChainmail(); - assembleScalemail(); - assembleSplintmail(); - assembleFieldplate(); - assembleCogPlating(); - } - - private static void assembleChainmail() { - Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 2, 0); - Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 2, 1); - Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 2, 2); - Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 2, 3); - - Item mail = ComponentListMF.chainmesh; - Item rivet = ComponentListMF.rivet; - - int time = 20; - KnowledgeListMF.mailHelmetR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_helmet), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMR", "MPM", "RMR", - - 'R', rivet, 'M', mail, 'P', new ItemStack(helm, 1, 0) })); - time = 30; - KnowledgeListMF.mailChestR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_chest), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RM MR", "RMPMR", "RM MR", - - 'R', rivet, 'M', mail, 'P', new ItemStack(chest, 1, 0) })); - time = 20; - KnowledgeListMF.mailLegsR - .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_legs), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMPMR", "RM MR", - - 'R', rivet, 'M', mail, 'P', new ItemStack(legs, 1, 0) })); - time = 10; - KnowledgeListMF.mailBootsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_boots), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "R R", "MPM", - - 'R', rivet, 'M', mail, 'P', new ItemStack(boots, 1, 0) })); - Salvage.addSalvage(CustomArmourListMF.standard_chain_helmet, helm, mail, mail, mail, mail, // 4 Mail - rivet, rivet, rivet, rivet);// 4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_chain_chest, chest, mail, mail, mail, mail, mail, mail, // 6 Mail - rivet, rivet, rivet, rivet, rivet, rivet);// 6 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_chain_legs, legs, mail, mail, mail, mail, // 4 Mail - rivet, rivet, rivet, rivet);// 4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_chain_boots, boots, mail, mail, // 2 Mail - rivet, rivet);// 2 Rivet - } - - private static void assembleScalemail() { - Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 2, 0); - Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 2, 1); - Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 2, 2); - Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 2, 3); - - ItemStack mail = new ItemStack(ComponentListMF.scalemesh); - Item rivet = ComponentListMF.rivet; - - int time = 20; - KnowledgeListMF.scaleHelmetR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_helmet), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMR", "MPM", "RMR", - - 'R', rivet, 'M', mail, 'P', new ItemStack(helm, 1, 0) })); - time = 30; - KnowledgeListMF.scaleChestR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_chest), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RM MR", "RMPMR", "RM MR", - - 'R', rivet, 'M', mail, 'P', new ItemStack(chest, 1, 0) })); - time = 20; - KnowledgeListMF.scaleLegsR - .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_legs), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMPMR", "RM MR", - - 'R', rivet, 'M', mail, 'P', new ItemStack(legs, 1, 0) })); - time = 10; - KnowledgeListMF.scaleBootsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_boots), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "R R", "MPM", - - 'R', rivet, 'M', mail, 'P', new ItemStack(boots, 1, 0) })); - Salvage.addSalvage(CustomArmourListMF.standard_scale_helmet, helm, mail, mail, mail, mail, // 4 Mail - rivet, rivet, rivet, rivet);// 4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_scale_chest, chest, mail, mail, mail, mail, mail, mail, // 6 Mail - rivet, rivet, rivet, rivet, rivet, rivet);// 6 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_scale_legs, legs, mail, mail, mail, mail, // 4 Mail - rivet, rivet, rivet, rivet);// 4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_scale_boots, boots, mail, mail, // 2 Mail - rivet, rivet);// 2 Rivet - } - - private static void assembleSplintmail() { - Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 4, 0); - Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 4, 1); - Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 4, 2); - Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 4, 3); - - ItemStack mail = new ItemStack(ComponentListMF.splintmesh); - Item rivet = ComponentListMF.rivet; - - int time = 20; - KnowledgeListMF.splintHelmetR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_helmet), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMR", "MPM", "RMR", - - 'R', rivet, 'M', mail, 'P', new ItemStack(helm, 1, 0) })); - time = 30; - KnowledgeListMF.splintChestR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_chest), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RM MR", "RMPMR", "RM MR", - - 'R', rivet, 'M', mail, 'P', new ItemStack(chest, 1, 0) })); - time = 20; - KnowledgeListMF.splintLegsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_legs), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "RMPMR", "RM MR", - - 'R', rivet, 'M', mail, 'P', new ItemStack(legs, 1, 0) })); - time = 10; - KnowledgeListMF.splintBootsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_boots), - "craftArmourMedium", true, "hammer", -1, -1, time, new Object[] { "R R", "MPM", - - 'R', rivet, 'M', mail, 'P', new ItemStack(boots, 1, 0) })); - Salvage.addSalvage(CustomArmourListMF.standard_splint_helmet, helm, mail, mail, mail, mail, // 4 Mail - rivet, rivet, rivet, rivet);// 4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_splint_chest, chest, mail, mail, mail, mail, mail, mail, // 6 - // Mail - rivet, rivet, rivet, rivet, rivet, rivet);// 6 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_splint_legs, legs, mail, mail, mail, mail, // 4 Mail - rivet, rivet, rivet, rivet);// 4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_splint_boots, boots, mail, mail, // 2 Mail - rivet, rivet);// 2 Rivet - } - - private static void assembleFieldplate() { - Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 4, 0); - Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 4, 1); - Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 4, 2); - Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 4, 3); - - ItemStack plate = new ItemStack(ComponentListMF.plate); - Item rivet = ComponentListMF.rivet; - - int time = 40; - KnowledgeListMF.plateHelmetR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_helmet), - "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] { " R ", "PHP", " R ", - - 'R', rivet, 'P', plate, 'H', new ItemStack(helm, 1, 0), })); - time = 60; - KnowledgeListMF.plateChestR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_chest), - "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] { "RP PR", "RPCPR", - - 'R', rivet, 'P', plate, 'C', new ItemStack(chest, 1, 0), })); - time = 40; - KnowledgeListMF.plateLegsR - .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_legs), - "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] { "RPLPR", "RP PR", - - 'R', rivet, 'P', plate, 'L', new ItemStack(legs, 1, 0), })); - time = 20; - KnowledgeListMF.plateBootsR.add( - MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_boots), - "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[] { "R R", "PBP", - - 'R', rivet, 'P', plate, 'B', new ItemStack(boots, 1, 0), })); - - Salvage.addSalvage(CustomArmourListMF.standard_plate_helmet, helm, plate, plate, // 2 Plate - rivet, rivet);// Rivet - Salvage.addSalvage(CustomArmourListMF.standard_plate_chest, chest, plate, plate, plate, plate, // 4 Plate - rivet, rivet, rivet, rivet);// 4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_plate_legs, legs, plate, plate, plate, plate, // 4 Plate - rivet, rivet, rivet, rivet);// 4 Rivet - Salvage.addSalvage(CustomArmourListMF.standard_plate_boots, boots, plate, plate, // 2 Plate - rivet, rivet);// 2 Rivet - - } - - private static void assembleCogPlating() { - - ItemStack minorPiece = new ItemStack(ComponentListMF.plate); - ItemStack majorPiece = new ItemStack(ComponentListMF.plate_huge); - - int time = 4; - KnowledgeListMF.hugePlateR - .add(MineFantasyAPI.addAnvilToolRecipe(engineering, majorPiece, "cogArmour", true, "hvyhammer", -1, -1, - time, new Object[] { " RR ", "RIIR", 'R', ComponentListMF.rivet, 'I', minorPiece })); - - Salvage.addSalvage(majorPiece, minorPiece, minorPiece, new ItemStack(ComponentListMF.rivet, 4)); - - time = 25; - KnowledgeListMF.cogPlateR - .add(MineFantasyAPI.addAnvilToolRecipe(engineering, new ItemStack(ComponentListMF.cogwork_armour), - "cogArmour", true, "hvyhammer", -1, -1, time, new Object[] { " P ", "pPPPp", "p P p", " pPp ", - - 'p', minorPiece, 'P', majorPiece, })); - - Salvage.addSalvage(ComponentListMF.cogwork_armour, minorPiece, minorPiece, minorPiece, minorPiece, minorPiece, - minorPiece, majorPiece, majorPiece, majorPiece, majorPiece, majorPiece, majorPiece); - } - - private static void addMetalComponents() { - Item hunk = ComponentListMF.metalHunk; - Item bar = ComponentListMF.bar; - - int time = 3; - KnowledgeListMF.mailRecipes - .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.chainmesh), "", true, - "hammer", -1, -1, time, new Object[] { " H ", "H H", " H ", - - 'H', hunk })); - time = 3; - KnowledgeListMF.scaleRecipes.add(MineFantasyAPI.addAnvilToolRecipe(artisanry, - new ItemStack(ComponentListMF.scalemesh), "", true, "hammer", -1, -1, time, new Object[] { "HHH", " H ", - - 'H', hunk })); - time = 4; - KnowledgeListMF.splintRecipes - .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.splintmesh), "", true, - "hammer", -1, -1, time, new Object[] { "RHR", " H ", " H ", " H ", - - 'H', hunk, 'R', ComponentListMF.rivet, })); - time = 4; - KnowledgeListMF.plateRecipes.add(MineFantasyAPI.addAnvilToolRecipe(artisanry, ComponentListMF.plate, "", true, - "hvyhammer", -1, -1, time, new Object[] { "FF", "II", 'F', ComponentListMF.flux, 'I', bar })); - - Salvage.addSalvage(ComponentListMF.chainmesh, hunk); - Salvage.addSalvage(ComponentListMF.scalemesh, hunk); - Salvage.addSalvage(ComponentListMF.splintmesh, hunk, ComponentListMF.rivet, ComponentListMF.rivet); - Salvage.addSalvage(ComponentListMF.plate, bar, bar); - } + private static final Skill artisanry = SkillList.artisanry; + private static final Skill engineering = SkillList.engineering; + private static final Skill construction = SkillList.construction; + + public static void init() { + addMetalComponents(); + assembleChainmail(); + assembleScalemail(); + assembleSplintmail(); + assembleFieldplate(); + assembleCogPlating(); + } + + private static void assembleChainmail() { + Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 2, 0); + Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 2, 1); + Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 2, 2); + Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 2, 3); + + Item mail = ComponentListMF.chainmesh; + Item rivet = ComponentListMF.rivet; + + int time = 20; + KnowledgeListMF.mailHelmetR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_helmet), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"RMR", "MPM", "RMR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(helm, 1, 0)})); + time = 30; + KnowledgeListMF.mailChestR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_chest), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"RM MR", "RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(chest, 1, 0)})); + time = 20; + KnowledgeListMF.mailLegsR + .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_legs), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(legs, 1, 0)})); + time = 10; + KnowledgeListMF.mailBootsR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_chain_boots), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"R R", "MPM", + + 'R', rivet, 'M', mail, 'P', new ItemStack(boots, 1, 0)})); + Salvage.addSalvage(CustomArmourListMF.standard_chain_helmet, helm, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_chain_chest, chest, mail, mail, mail, mail, mail, mail, // 6 Mail + rivet, rivet, rivet, rivet, rivet, rivet);// 6 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_chain_legs, legs, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_chain_boots, boots, mail, mail, // 2 Mail + rivet, rivet);// 2 Rivet + } + + private static void assembleScalemail() { + Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 2, 0); + Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 2, 1); + Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 2, 2); + Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 2, 3); + + ItemStack mail = new ItemStack(ComponentListMF.scalemesh); + Item rivet = ComponentListMF.rivet; + + int time = 20; + KnowledgeListMF.scaleHelmetR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_helmet), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"RMR", "MPM", "RMR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(helm, 1, 0)})); + time = 30; + KnowledgeListMF.scaleChestR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_chest), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"RM MR", "RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(chest, 1, 0)})); + time = 20; + KnowledgeListMF.scaleLegsR + .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_legs), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(legs, 1, 0)})); + time = 10; + KnowledgeListMF.scaleBootsR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_scale_boots), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"R R", "MPM", + + 'R', rivet, 'M', mail, 'P', new ItemStack(boots, 1, 0)})); + Salvage.addSalvage(CustomArmourListMF.standard_scale_helmet, helm, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_scale_chest, chest, mail, mail, mail, mail, mail, mail, // 6 Mail + rivet, rivet, rivet, rivet, rivet, rivet);// 6 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_scale_legs, legs, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_scale_boots, boots, mail, mail, // 2 Mail + rivet, rivet);// 2 Rivet + } + + private static void assembleSplintmail() { + Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 4, 0); + Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 4, 1); + Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 4, 2); + Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 4, 3); + + ItemStack mail = new ItemStack(ComponentListMF.splintmesh); + Item rivet = ComponentListMF.rivet; + + int time = 20; + KnowledgeListMF.splintHelmetR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_helmet), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"RMR", "MPM", "RMR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(helm, 1, 0)})); + time = 30; + KnowledgeListMF.splintChestR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_chest), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"RM MR", "RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(chest, 1, 0)})); + time = 20; + KnowledgeListMF.splintLegsR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_legs), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"RMPMR", "RM MR", + + 'R', rivet, 'M', mail, 'P', new ItemStack(legs, 1, 0)})); + time = 10; + KnowledgeListMF.splintBootsR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_splint_boots), + "craftArmourMedium", true, "hammer", -1, -1, time, new Object[]{"R R", "MPM", + + 'R', rivet, 'M', mail, 'P', new ItemStack(boots, 1, 0)})); + Salvage.addSalvage(CustomArmourListMF.standard_splint_helmet, helm, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_splint_chest, chest, mail, mail, mail, mail, mail, mail, // 6 + // Mail + rivet, rivet, rivet, rivet, rivet, rivet);// 6 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_splint_legs, legs, mail, mail, mail, mail, // 4 Mail + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_splint_boots, boots, mail, mail, // 2 Mail + rivet, rivet);// 2 Rivet + } + + private static void assembleFieldplate() { + Item helm = ArmourListMF.armourItem(ArmourListMF.leather, 4, 0); + Item chest = ArmourListMF.armourItem(ArmourListMF.leather, 4, 1); + Item legs = ArmourListMF.armourItem(ArmourListMF.leather, 4, 2); + Item boots = ArmourListMF.armourItem(ArmourListMF.leather, 4, 3); + + ItemStack plate = new ItemStack(ComponentListMF.plate); + Item rivet = ComponentListMF.rivet; + + int time = 40; + KnowledgeListMF.plateHelmetR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_helmet), + "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[]{" R ", "PHP", " R ", + + 'R', rivet, 'P', plate, 'H', new ItemStack(helm, 1, 0),})); + time = 60; + KnowledgeListMF.plateChestR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_chest), + "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[]{"RP PR", "RPCPR", + + 'R', rivet, 'P', plate, 'C', new ItemStack(chest, 1, 0),})); + time = 40; + KnowledgeListMF.plateLegsR + .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_legs), + "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[]{"RPLPR", "RP PR", + + 'R', rivet, 'P', plate, 'L', new ItemStack(legs, 1, 0),})); + time = 20; + KnowledgeListMF.plateBootsR.add( + MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(CustomArmourListMF.standard_plate_boots), + "craftArmourHeavy", false, "hammer", -1, -1, time, new Object[]{"R R", "PBP", + + 'R', rivet, 'P', plate, 'B', new ItemStack(boots, 1, 0),})); + + Salvage.addSalvage(CustomArmourListMF.standard_plate_helmet, helm, plate, plate, // 2 Plate + rivet, rivet);// Rivet + Salvage.addSalvage(CustomArmourListMF.standard_plate_chest, chest, plate, plate, plate, plate, // 4 Plate + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_plate_legs, legs, plate, plate, plate, plate, // 4 Plate + rivet, rivet, rivet, rivet);// 4 Rivet + Salvage.addSalvage(CustomArmourListMF.standard_plate_boots, boots, plate, plate, // 2 Plate + rivet, rivet);// 2 Rivet + + } + + private static void assembleCogPlating() { + + ItemStack minorPiece = new ItemStack(ComponentListMF.plate); + ItemStack majorPiece = new ItemStack(ComponentListMF.plate_huge); + + int time = 4; + KnowledgeListMF.hugePlateR + .add(MineFantasyAPI.addAnvilToolRecipe(engineering, majorPiece, "cogArmour", true, "hvyhammer", -1, -1, + time, new Object[]{" RR ", "RIIR", 'R', ComponentListMF.rivet, 'I', minorPiece})); + + Salvage.addSalvage(majorPiece, minorPiece, minorPiece, new ItemStack(ComponentListMF.rivet, 4)); + + time = 25; + KnowledgeListMF.cogPlateR + .add(MineFantasyAPI.addAnvilToolRecipe(engineering, new ItemStack(ComponentListMF.cogwork_armour), + "cogArmour", true, "hvyhammer", -1, -1, time, new Object[]{" P ", "pPPPp", "p P p", " pPp ", + + 'p', minorPiece, 'P', majorPiece,})); + + Salvage.addSalvage(ComponentListMF.cogwork_armour, minorPiece, minorPiece, minorPiece, minorPiece, minorPiece, + minorPiece, majorPiece, majorPiece, majorPiece, majorPiece, majorPiece, majorPiece); + } + + private static void addMetalComponents() { + Item hunk = ComponentListMF.metalHunk; + Item bar = ComponentListMF.bar; + + int time = 3; + KnowledgeListMF.mailRecipes + .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.chainmesh), "", true, + "hammer", -1, -1, time, new Object[]{" H ", "H H", " H ", + + 'H', hunk})); + time = 3; + KnowledgeListMF.scaleRecipes.add(MineFantasyAPI.addAnvilToolRecipe(artisanry, + new ItemStack(ComponentListMF.scalemesh), "", true, "hammer", -1, -1, time, new Object[]{"HHH", " H ", + + 'H', hunk})); + time = 4; + KnowledgeListMF.splintRecipes + .add(MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(ComponentListMF.splintmesh), "", true, + "hammer", -1, -1, time, new Object[]{"RHR", " H ", " H ", " H ", + + 'H', hunk, 'R', ComponentListMF.rivet,})); + time = 4; + KnowledgeListMF.plateRecipes.add(MineFantasyAPI.addAnvilToolRecipe(artisanry, ComponentListMF.plate, "", true, + "hvyhammer", -1, -1, time, new Object[]{"FF", "II", 'F', ComponentListMF.flux, 'I', bar})); + + Salvage.addSalvage(ComponentListMF.chainmesh, hunk); + Salvage.addSalvage(ComponentListMF.scalemesh, hunk); + Salvage.addSalvage(ComponentListMF.splintmesh, hunk, ComponentListMF.rivet, ComponentListMF.rivet); + Salvage.addSalvage(ComponentListMF.plate, bar, bar); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java index a64a1d6f..9c6e484f 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java @@ -1,8 +1,5 @@ package minefantasy.mf2.recipe; -import java.util.ArrayList; -import java.util.Iterator; - import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.Salvage; import minefantasy.mf2.api.material.CustomMaterial; @@ -18,374 +15,377 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; +import java.util.Iterator; + public class ForgedToolRecipes { - private static final Skill artisanry = SkillList.artisanry; - private static final Skill engineering = SkillList.engineering; - private static final Skill construction = SkillList.construction; - - public static void init() { - CarpenterRecipes.initTierWood(); - addStandardTools(); - addStandardCrafters(); - addStandardWeapons(); - addComponentTools(); - addMetalComponents(); - - ArrayList metal = CustomMaterial.getList("metal"); - ArrayList wood = CustomMaterial.getList("wood"); - - Iterator iteratorMetal = metal.iterator(); - - while (iteratorMetal.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); - ItemStack bar = ComponentListMF.bar.createComm(customMat.name); - for (ItemStack ingot : OreDictionary.getOres("ingot" + customMat.name)) { - KnowledgeListMF.barR.add(MineFantasyAPI.addAnvilRecipe(artisanry, bar, "", true, "hammer", -1, -1, - (int) (customMat.craftTimeModifier / 2F), new Object[] { "I", 'I', ingot, })); - } - - ItemStack defaultIngot = customMat.getItem(); - if (defaultIngot != null) { - KnowledgeListMF.baringotR.add(MineFantasyAPI.addAnvilRecipe(artisanry, defaultIngot, "", true, "hammer", - -1, -1, (int) (customMat.craftTimeModifier / 2F), new Object[] { "I", 'I', bar, })); - } - } - - KnowledgeListMF.tinderboxR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ToolListMF.tinderbox), "", true, - "hammer", 0, 0, 10, new Object[] { " F ", "SWS", " I ", 'F', Items.flint, 'S', Items.stick, 'W', - Blocks.wool, 'I', ComponentListMF.bar("Iron"), }); - KnowledgeListMF.flintAndSteelR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(Items.flint_and_steel), "", - true, "hammer", 0, 0, 10, new Object[] { " F", "IC ", " I ", 'F', Items.flint, 'C', Items.coal, 'I', - ComponentListMF.bar("Steel"), }); - Salvage.addSalvage(ToolListMF.tinderbox, Items.flint, Items.stick, Blocks.wool, ComponentListMF.bar("Iron")); - Salvage.addSalvage(Items.flint_and_steel, Items.flint, ComponentListMF.bar("Steel")); - } - - private static void addMetalComponents() { - int time = 2; - Item bar = ComponentListMF.bar; - Item hunk = ComponentListMF.metalHunk; - - KnowledgeListMF.hunkR = MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(hunk, 4), "", true, "hammer", - 0, 0, time, new Object[] { "F", "I", 'F', ComponentListMF.flux, 'I', bar, }); - - KnowledgeListMF.ingotR = MineFantasyAPI.addAnvilToolRecipe(artisanry, bar, "", true, "hammer", 0, 0, time, - new Object[] { "II", "II", 'I', hunk }); - - time = 8; - int count = 1; - KnowledgeListMF.bucketR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(Items.bucket, count), "", true, - "hammer", 0, 0, time, new Object[] { "I I", " I ", 'I', bar, }); - } - - private static void addComponentTools() { - Item bar = ComponentListMF.bar; - Item plank = ComponentListMF.plank; - Item strip = ComponentListMF.leather_strip; - Item rivet = ComponentListMF.rivet; - Item hunk = ComponentListMF.metalHunk; - - int time = 10; - - KnowledgeListMF.nailR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.nail, 16), "", - true, "hammer", -1, -1, time, new Object[] { "HH", " H", " H", - - 'H', hunk }); - KnowledgeListMF.rivetR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.rivet, 8), "", - true, "hammer", -1, -1, time, new Object[] { "H H", " H ", " H ", - - 'H', hunk }); - - KnowledgeListMF.needleR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_needle, "tier", - true, "hammer", -1, -1, time, new Object[] { "H", "H", "H", "H", - - 'H', hunk }); - Salvage.addSalvage(CustomToolListMF.standard_needle, bar); - - time = 3; - KnowledgeListMF.crossBoltR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_bolt, - "tier", true, "hammer", -1, -1, time, new Object[] { "H", "F", - - 'F', ComponentListMF.fletching, 'H', hunk }); - time = 2; - KnowledgeListMF.arrowheadR = MineFantasyAPI.addAnvilToolRecipe(artisanry, - new ItemStack(ComponentListMF.arrowhead, 4), "tier", true, "hammer", -1, -1, time, - new Object[] { "H ", "HH", "H ", - - 'H', hunk }); - time = 5; - KnowledgeListMF.bodkinheadR = MineFantasyAPI.addAnvilToolRecipe(artisanry, - new ItemStack(ComponentListMF.bodkinhead, 4), "tier", true, "hammer", -1, -1, time, - new Object[] { "H ", " HH", "H ", - - 'H', hunk }); - time = 5; - KnowledgeListMF.broadheadR = MineFantasyAPI.addAnvilToolRecipe(artisanry, - new ItemStack(ComponentListMF.broadhead, 4), "tier", true, "hammer", -1, -1, time, - new Object[] { "H ", " H", " H", "H ", - - 'H', hunk }); - Salvage.addSalvage(CustomToolListMF.standard_bolt, ComponentListMF.fletching, hunk); - Salvage.addSalvage(ComponentListMF.arrowhead, hunk); - Salvage.addSalvage(ComponentListMF.bodkinhead, hunk); - Salvage.addSalvage(ComponentListMF.broadhead, hunk); - - time = 1; - KnowledgeListMF.arrowR.add(MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_arrow, - "arrows", "dig.wood", 1, new Object[] { "H", "F", - - 'F', ComponentListMF.fletching, 'H', ComponentListMF.arrowhead })); - KnowledgeListMF.arrowR.add(MineFantasyAPI.addCarpenterToolRecipe(artisanry, - CustomToolListMF.standard_arrow_bodkin, "arrowsBodkin", "dig.wood", 1, new Object[] { "H", "F", - - 'F', ComponentListMF.fletching, 'H', ComponentListMF.bodkinhead })); - KnowledgeListMF.arrowR.add(MineFantasyAPI.addCarpenterToolRecipe(artisanry, - CustomToolListMF.standard_arrow_broad, "arrowsBroad", "dig.wood", 1, new Object[] { "H", "F", - - 'F', ComponentListMF.fletching, 'H', ComponentListMF.broadhead })); - Salvage.addSalvage(CustomToolListMF.standard_arrow, ComponentListMF.arrowhead, ComponentListMF.fletching); - Salvage.addSalvage(CustomToolListMF.standard_arrow_bodkin, ComponentListMF.bodkinhead, - ComponentListMF.fletching); - Salvage.addSalvage(CustomToolListMF.standard_arrow_broad, ComponentListMF.broadhead, ComponentListMF.fletching); - - } - - private static void addStandardTools() { - Item bar = ComponentListMF.bar; - Item plank = ComponentListMF.plank; - Item strip = ComponentListMF.leather_strip; - Item rivet = ComponentListMF.rivet; - - int time = 15; - KnowledgeListMF.pickR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_pick, "tier", - true, "hammer", -1, -1, time, new Object[] { "L I", "PPI", "L I", + private static final Skill artisanry = SkillList.artisanry; + private static final Skill engineering = SkillList.engineering; + private static final Skill construction = SkillList.construction; + + public static void init() { + CarpenterRecipes.initTierWood(); + addStandardTools(); + addStandardCrafters(); + addStandardWeapons(); + addComponentTools(); + addMetalComponents(); + + ArrayList metal = CustomMaterial.getList("metal"); + ArrayList wood = CustomMaterial.getList("wood"); + + Iterator iteratorMetal = metal.iterator(); + + while (iteratorMetal.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); + ItemStack bar = ComponentListMF.bar.createComm(customMat.name); + for (ItemStack ingot : OreDictionary.getOres("ingot" + customMat.name)) { + KnowledgeListMF.barR.add(MineFantasyAPI.addAnvilRecipe(artisanry, bar, "", true, "hammer", -1, -1, + (int) (customMat.craftTimeModifier / 2F), new Object[]{"I", 'I', ingot,})); + } + + ItemStack defaultIngot = customMat.getItem(); + if (defaultIngot != null) { + KnowledgeListMF.baringotR.add(MineFantasyAPI.addAnvilRecipe(artisanry, defaultIngot, "", true, "hammer", + -1, -1, (int) (customMat.craftTimeModifier / 2F), new Object[]{"I", 'I', bar,})); + } + } + + KnowledgeListMF.tinderboxR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ToolListMF.tinderbox), "", true, + "hammer", 0, 0, 10, new Object[]{" F ", "SWS", " I ", 'F', Items.flint, 'S', Items.stick, 'W', + Blocks.wool, 'I', ComponentListMF.bar("Iron"),}); + KnowledgeListMF.flintAndSteelR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(Items.flint_and_steel), "", + true, "hammer", 0, 0, 10, new Object[]{" F", "IC ", " I ", 'F', Items.flint, 'C', Items.coal, 'I', + ComponentListMF.bar("Steel"),}); + Salvage.addSalvage(ToolListMF.tinderbox, Items.flint, Items.stick, Blocks.wool, ComponentListMF.bar("Iron")); + Salvage.addSalvage(Items.flint_and_steel, Items.flint, ComponentListMF.bar("Steel")); + } + + private static void addMetalComponents() { + int time = 2; + Item bar = ComponentListMF.bar; + Item hunk = ComponentListMF.metalHunk; + + KnowledgeListMF.hunkR = MineFantasyAPI.addAnvilToolRecipe(artisanry, new ItemStack(hunk, 4), "", true, "hammer", + 0, 0, time, new Object[]{"F", "I", 'F', ComponentListMF.flux, 'I', bar,}); + + KnowledgeListMF.ingotR = MineFantasyAPI.addAnvilToolRecipe(artisanry, bar, "", true, "hammer", 0, 0, time, + new Object[]{"II", "II", 'I', hunk}); + + time = 8; + int count = 1; + KnowledgeListMF.bucketR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(Items.bucket, count), "", true, + "hammer", 0, 0, time, new Object[]{"I I", " I ", 'I', bar,}); + } + + private static void addComponentTools() { + Item bar = ComponentListMF.bar; + Item plank = ComponentListMF.plank; + Item strip = ComponentListMF.leather_strip; + Item rivet = ComponentListMF.rivet; + Item hunk = ComponentListMF.metalHunk; + + int time = 10; + + KnowledgeListMF.nailR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.nail, 16), "", + true, "hammer", -1, -1, time, new Object[]{"HH", " H", " H", + + 'H', hunk}); + KnowledgeListMF.rivetR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.rivet, 8), "", + true, "hammer", -1, -1, time, new Object[]{"H H", " H ", " H ", + + 'H', hunk}); + + KnowledgeListMF.needleR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_needle, "tier", + true, "hammer", -1, -1, time, new Object[]{"H", "H", "H", "H", + + 'H', hunk}); + Salvage.addSalvage(CustomToolListMF.standard_needle, bar); + + time = 3; + KnowledgeListMF.crossBoltR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_bolt, + "tier", true, "hammer", -1, -1, time, new Object[]{"H", "F", + + 'F', ComponentListMF.fletching, 'H', hunk}); + time = 2; + KnowledgeListMF.arrowheadR = MineFantasyAPI.addAnvilToolRecipe(artisanry, + new ItemStack(ComponentListMF.arrowhead, 4), "tier", true, "hammer", -1, -1, time, + new Object[]{"H ", "HH", "H ", + + 'H', hunk}); + time = 5; + KnowledgeListMF.bodkinheadR = MineFantasyAPI.addAnvilToolRecipe(artisanry, + new ItemStack(ComponentListMF.bodkinhead, 4), "tier", true, "hammer", -1, -1, time, + new Object[]{"H ", " HH", "H ", + + 'H', hunk}); + time = 5; + KnowledgeListMF.broadheadR = MineFantasyAPI.addAnvilToolRecipe(artisanry, + new ItemStack(ComponentListMF.broadhead, 4), "tier", true, "hammer", -1, -1, time, + new Object[]{"H ", " H", " H", "H ", + + 'H', hunk}); + Salvage.addSalvage(CustomToolListMF.standard_bolt, ComponentListMF.fletching, hunk); + Salvage.addSalvage(ComponentListMF.arrowhead, hunk); + Salvage.addSalvage(ComponentListMF.bodkinhead, hunk); + Salvage.addSalvage(ComponentListMF.broadhead, hunk); + + time = 1; + KnowledgeListMF.arrowR.add(MineFantasyAPI.addCarpenterToolRecipe(artisanry, CustomToolListMF.standard_arrow, + "arrows", "dig.wood", 1, new Object[]{"H", "F", + + 'F', ComponentListMF.fletching, 'H', ComponentListMF.arrowhead})); + KnowledgeListMF.arrowR.add(MineFantasyAPI.addCarpenterToolRecipe(artisanry, + CustomToolListMF.standard_arrow_bodkin, "arrowsBodkin", "dig.wood", 1, new Object[]{"H", "F", + + 'F', ComponentListMF.fletching, 'H', ComponentListMF.bodkinhead})); + KnowledgeListMF.arrowR.add(MineFantasyAPI.addCarpenterToolRecipe(artisanry, + CustomToolListMF.standard_arrow_broad, "arrowsBroad", "dig.wood", 1, new Object[]{"H", "F", + + 'F', ComponentListMF.fletching, 'H', ComponentListMF.broadhead})); + Salvage.addSalvage(CustomToolListMF.standard_arrow, ComponentListMF.arrowhead, ComponentListMF.fletching); + Salvage.addSalvage(CustomToolListMF.standard_arrow_bodkin, ComponentListMF.bodkinhead, + ComponentListMF.fletching); + Salvage.addSalvage(CustomToolListMF.standard_arrow_broad, ComponentListMF.broadhead, ComponentListMF.fletching); + + } + + private static void addStandardTools() { + Item bar = ComponentListMF.bar; + Item plank = ComponentListMF.plank; + Item strip = ComponentListMF.leather_strip; + Item rivet = ComponentListMF.rivet; + + int time = 15; + KnowledgeListMF.pickR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_pick, "tier", + true, "hammer", -1, -1, time, new Object[]{"L I", "PPI", "L I", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_pick, bar, bar, bar, plank, plank, strip, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_pick, bar, bar, bar, plank, plank, strip, strip); - time = 15; - KnowledgeListMF.axeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_axe, "tier", true, - "hammer", -1, -1, time, new Object[] { "LII", "PPI", "L ", + time = 15; + KnowledgeListMF.axeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_axe, "tier", true, + "hammer", -1, -1, time, new Object[]{"LII", "PPI", "L ", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_axe, bar, bar, bar, plank, plank, strip, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_axe, bar, bar, bar, plank, plank, strip, strip); - time = 12; - KnowledgeListMF.hoeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hoe, "tier", true, - "hammer", -1, -1, time, new Object[] { "L I", "PPI", "L ", + time = 12; + KnowledgeListMF.hoeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hoe, "tier", true, + "hammer", -1, -1, time, new Object[]{"L I", "PPI", "L ", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_hoe, bar, bar, plank, plank, strip, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_hoe, bar, bar, plank, plank, strip, strip); - time = 10; - KnowledgeListMF.spadeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spade, "tier", - true, "hammer", -1, -1, time, new Object[] { "L ", "PPI", "L ", + time = 10; + KnowledgeListMF.spadeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spade, "tier", + true, "hammer", -1, -1, time, new Object[]{"L ", "PPI", "L ", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_spade, bar, plank, plank, strip, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_spade, bar, plank, plank, strip, strip); - // ADVANCED - time = 25; - KnowledgeListMF.hvyPickR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvypick, - "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LR I", "PPII", "LRII", + // ADVANCED + time = 25; + KnowledgeListMF.hvyPickR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvypick, + "tier", true, "hvyhammer", -1, -1, time, new Object[]{"LR I", "PPII", "LRII", - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_hvypick, bar, bar, bar, bar, bar, plank, plank, strip, strip, - rivet, rivet); + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_hvypick, bar, bar, bar, bar, bar, plank, plank, strip, strip, + rivet, rivet); - time = 15; - KnowledgeListMF.handpickR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_handpick, - "tier", true, "hammer", -1, -1, time, new Object[] { "LI ", "PIR", "L ", + time = 15; + KnowledgeListMF.handpickR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_handpick, + "tier", true, "hammer", -1, -1, time, new Object[]{"LI ", "PIR", "L ", - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_handpick, bar, bar, plank, strip, strip, rivet); - - time = 25; - KnowledgeListMF.hvyShovelR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvyshovel, - "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LRII", "PPII", "LRII", - - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_hvyshovel, bar, bar, bar, bar, bar, bar, plank, plank, strip, - strip, rivet, rivet); + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_handpick, bar, bar, plank, strip, strip, rivet); + + time = 25; + KnowledgeListMF.hvyShovelR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvyshovel, + "tier", true, "hvyhammer", -1, -1, time, new Object[]{"LRII", "PPII", "LRII", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_hvyshovel, bar, bar, bar, bar, bar, bar, plank, plank, strip, + strip, rivet, rivet); - time = 15; - KnowledgeListMF.trowR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_trow, "tier", - true, "hammer", -1, -1, time, new Object[] { "L ", "PIR", "L ", + time = 15; + KnowledgeListMF.trowR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_trow, "tier", + true, "hammer", -1, -1, time, new Object[]{"L ", "PIR", "L ", - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_trow, bar, plank, strip, strip, rivet); + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_trow, bar, plank, strip, strip, rivet); - time = 30; - KnowledgeListMF.scytheR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_scythe, "tier", - true, "hvyhammer", -1, -1, time, new Object[] { " I ", "L PIR", "PPPIR", + time = 30; + KnowledgeListMF.scytheR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_scythe, "tier", + true, "hvyhammer", -1, -1, time, new Object[]{" I ", "L PIR", "PPPIR", - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_scythe, bar, bar, bar, plank, plank, plank, plank, strip, rivet, - rivet); + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_scythe, bar, bar, bar, plank, plank, plank, plank, strip, rivet, + rivet); - time = 14; - KnowledgeListMF.mattockR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_mattock, - "tier", true, "hammer", -1, -1, time, new Object[] { "L I", "PPI", "LIR", + time = 14; + KnowledgeListMF.mattockR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_mattock, + "tier", true, "hammer", -1, -1, time, new Object[]{"L I", "PPI", "LIR", - 'I', bar, 'P', plank, 'L', strip, 'R', rivet }); - Salvage.addSalvage(CustomToolListMF.standard_mattock, bar, bar, bar, rivet, plank, plank, strip, strip); + 'I', bar, 'P', plank, 'L', strip, 'R', rivet}); + Salvage.addSalvage(CustomToolListMF.standard_mattock, bar, bar, bar, rivet, plank, plank, strip, strip); - time = 15; - KnowledgeListMF.lumberR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_lumber, "tier", - true, "hvyHammer", -1, -1, time, new Object[] { "L IIR", "PPPIR", "L R", + time = 15; + KnowledgeListMF.lumberR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_lumber, "tier", + true, "hvyHammer", -1, -1, time, new Object[]{"L IIR", "PPPIR", "L R", - 'I', bar, 'P', plank, 'L', strip, 'R', rivet }); - Salvage.addSalvage(CustomToolListMF.standard_lumber, bar, bar, bar, rivet, rivet, rivet, plank, plank, plank, - strip, strip); - } + 'I', bar, 'P', plank, 'L', strip, 'R', rivet}); + Salvage.addSalvage(CustomToolListMF.standard_lumber, bar, bar, bar, rivet, rivet, rivet, plank, plank, plank, + strip, strip); + } - private static void addStandardCrafters() { - Item bar = ComponentListMF.bar; - Item plank = ComponentListMF.plank; - Item strip = ComponentListMF.leather_strip; - Item rivet = ComponentListMF.rivet; + private static void addStandardCrafters() { + Item bar = ComponentListMF.bar; + Item plank = ComponentListMF.plank; + Item strip = ComponentListMF.leather_strip; + Item rivet = ComponentListMF.rivet; - int time = 10; - KnowledgeListMF.hammerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hammer, "tier", - true, "hammer", 0, 0, time, new Object[] { "I", "L", "P", + int time = 10; + KnowledgeListMF.hammerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hammer, "tier", + true, "hammer", 0, 0, time, new Object[]{"I", "L", "P", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_hammer, bar, plank, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_hammer, bar, plank, strip); - time = 15; - KnowledgeListMF.hvyHammerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvyhammer, - "tier", true, "hammer", -1, -1, time, new Object[] { " II", "RLI", " P ", + time = 15; + KnowledgeListMF.hvyHammerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_hvyhammer, + "tier", true, "hammer", -1, -1, time, new Object[]{" II", "RLI", " P ", - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_hvyhammer, bar, bar, bar, plank, strip, rivet); + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_hvyhammer, bar, bar, bar, plank, strip, rivet); - time = 10; - KnowledgeListMF.tongsR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_tongs, "tier", - true, "hammer", -1, -1, time, new Object[] { "I ", " I", + time = 10; + KnowledgeListMF.tongsR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_tongs, "tier", + true, "hammer", -1, -1, time, new Object[]{"I ", " I", - 'I', bar, }); - Salvage.addSalvage(CustomToolListMF.standard_tongs, bar, bar); + 'I', bar,}); + Salvage.addSalvage(CustomToolListMF.standard_tongs, bar, bar); - time = 10; - KnowledgeListMF.knifeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_knife, "tier", - true, "hammer", -1, -1, time, new Object[] { "I ", "PL", + time = 10; + KnowledgeListMF.knifeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_knife, "tier", + true, "hammer", -1, -1, time, new Object[]{"I ", "PL", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_knife, bar, bar, plank, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_knife, bar, bar, plank, strip); - time = 12; - KnowledgeListMF.shearsR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_shears, "tier", - true, "hammer", -1, -1, time, new Object[] { " I ", "PLI", " P ", + time = 12; + KnowledgeListMF.shearsR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_shears, "tier", + true, "hammer", -1, -1, time, new Object[]{" I ", "PLI", " P ", - 'I', bar, 'P', plank, 'L', Items.leather, }); - Salvage.addSalvage(CustomToolListMF.standard_shears, bar, bar, plank, plank, Items.leather); + 'I', bar, 'P', plank, 'L', Items.leather,}); + Salvage.addSalvage(CustomToolListMF.standard_shears, bar, bar, plank, plank, Items.leather); - time = 20; - KnowledgeListMF.sawsR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_saw, "tier", - true, "hammer", -1, -1, time, new Object[] { "PIII", "LI ", + time = 20; + KnowledgeListMF.sawsR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_saw, "tier", + true, "hammer", -1, -1, time, new Object[]{"PIII", "LI ", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_saw, bar, bar, bar, bar, plank, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_saw, bar, bar, bar, bar, plank, strip); - time = 15; - KnowledgeListMF.spannerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spanner, - "tier", true, "hammer", -1, -1, time, new Object[] { " I ", " II", "LP ", " L ", + time = 15; + KnowledgeListMF.spannerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spanner, + "tier", true, "hammer", -1, -1, time, new Object[]{" I ", " II", "LP ", " L ", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_spanner, bar, bar, bar, plank, strip, strip); - } + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_spanner, bar, bar, bar, plank, strip, strip); + } - private static void addStandardWeapons() { - Item bar = ComponentListMF.bar; - Item plank = ComponentListMF.plank; - Item strip = ComponentListMF.leather_strip; - Item rivet = ComponentListMF.rivet; + private static void addStandardWeapons() { + Item bar = ComponentListMF.bar; + Item plank = ComponentListMF.plank; + Item strip = ComponentListMF.leather_strip; + Item rivet = ComponentListMF.rivet; - int time = 15; - KnowledgeListMF.daggerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_dagger, "tier", - true, "hammer", -1, -1, time, new Object[] { "L ", "PII", "L ", + int time = 15; + KnowledgeListMF.daggerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_dagger, "tier", + true, "hammer", -1, -1, time, new Object[]{"L ", "PII", "L ", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_dagger, bar, bar, plank, strip, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_dagger, bar, bar, plank, strip, strip); - time = 25; - KnowledgeListMF.swordR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_sword, "tier", - true, "hammer", -1, -1, time, new Object[] { "LI ", "PIII", "LI ", + time = 25; + KnowledgeListMF.swordR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_sword, "tier", + true, "hammer", -1, -1, time, new Object[]{"LI ", "PIII", "LI ", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_sword, bar, bar, bar, bar, bar, plank, strip, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_sword, bar, bar, bar, bar, bar, plank, strip, strip); - time = 20; - KnowledgeListMF.waraxeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_waraxe, "tier", - true, "hammer", -1, -1, time, new Object[] { "LII", "PPI", "L I", + time = 20; + KnowledgeListMF.waraxeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_waraxe, "tier", + true, "hammer", -1, -1, time, new Object[]{"LII", "PPI", "L I", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_waraxe, bar, bar, bar, bar, plank, plank, strip, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_waraxe, bar, bar, bar, bar, plank, plank, strip, strip); - KnowledgeListMF.maceR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_mace, "tier", - true, "hammer", -1, -1, time, new Object[] { "L II", "PPII", "L ", + KnowledgeListMF.maceR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_mace, "tier", + true, "hammer", -1, -1, time, new Object[]{"L II", "PPII", "L ", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_mace, bar, bar, bar, bar, plank, plank, strip, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_mace, bar, bar, bar, bar, plank, plank, strip, strip); - KnowledgeListMF.spearR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spear, "tier", - true, "hammer", -1, -1, time, new Object[] { " LLI ", "PPPPI", " LLI ", + KnowledgeListMF.spearR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_spear, "tier", + true, "hammer", -1, -1, time, new Object[]{" LLI ", "PPPPI", " LLI ", - 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_spear, bar, bar, bar, plank, plank, plank, plank, strip, strip, - strip, strip); + 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_spear, bar, bar, bar, plank, plank, plank, plank, strip, strip, + strip, strip); - // HEAVY - time = 30; - KnowledgeListMF.katanaR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_katana, "tier", - true, "hvyhammer", -1, -1, time, new Object[] { "LR I", "PIIII ", "LI ", + // HEAVY + time = 30; + KnowledgeListMF.katanaR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_katana, "tier", + true, "hvyhammer", -1, -1, time, new Object[]{"LR I", "PIIII ", "LI ", - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_katana, bar, bar, bar, bar, bar, bar, plank, strip, strip, rivet); + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_katana, bar, bar, bar, bar, bar, bar, plank, strip, strip, rivet); - time = 40; - KnowledgeListMF.gswordR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_greatsword, - "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LIR ", "PIIIII", "LIR ", + time = 40; + KnowledgeListMF.gswordR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_greatsword, + "tier", true, "hvyhammer", -1, -1, time, new Object[]{"LIR ", "PIIIII", "LIR ", - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_greatsword, bar, bar, bar, bar, bar, bar, bar, plank, strip, strip, - rivet, rivet); + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_greatsword, bar, bar, bar, bar, bar, bar, bar, plank, strip, strip, + rivet, rivet); - time = 30; - KnowledgeListMF.battleaxeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_battleaxe, - "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LLIIR", "PPPIR", "LLIIR", + time = 30; + KnowledgeListMF.battleaxeR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_battleaxe, + "tier", true, "hvyhammer", -1, -1, time, new Object[]{"LLIIR", "PPPIR", "LLIIR", - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_battleaxe, bar, bar, bar, bar, bar, plank, plank, plank, strip, - strip, strip, strip, rivet, rivet, rivet); + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_battleaxe, bar, bar, bar, bar, bar, plank, plank, plank, strip, + strip, strip, strip, rivet, rivet, rivet); - KnowledgeListMF.whammerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_warhammer, - "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LL IIR", "PPPIIR", "LL IR", + KnowledgeListMF.whammerR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_warhammer, + "tier", true, "hvyhammer", -1, -1, time, new Object[]{"LL IIR", "PPPIIR", "LL IR", - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_warhammer, bar, bar, bar, bar, bar, plank, plank, plank, strip, - strip, strip, strip, rivet, rivet, rivet); + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_warhammer, bar, bar, bar, bar, bar, plank, plank, plank, strip, + strip, strip, strip, rivet, rivet, rivet); - KnowledgeListMF.halbeardR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_halbeard, - "tier", true, "hvyhammer", -1, -1, time, new Object[] { "LLRII", "PPPPI", "LLRI ", + KnowledgeListMF.halbeardR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_halbeard, + "tier", true, "hvyhammer", -1, -1, time, new Object[]{"LLRII", "PPPPI", "LLRI ", - 'R', rivet, 'I', bar, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_halbeard, bar, bar, bar, bar, plank, plank, plank, plank, strip, - strip, strip, strip, rivet, rivet); + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_halbeard, bar, bar, bar, bar, plank, plank, plank, plank, strip, + strip, strip, strip, rivet, rivet); - time = 25; - KnowledgeListMF.bowR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_bow, "tier", true, - "hammer", -1, -1, time, new Object[] { "PSSSP", " PLP ", + time = 25; + KnowledgeListMF.bowR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_bow, "tier", true, + "hammer", -1, -1, time, new Object[]{"PSSSP", " PLP ", - 'I', bar, 'S', Items.string, 'P', plank, 'L', strip, }); - Salvage.addSalvage(CustomToolListMF.standard_bow, plank, plank, plank, plank, strip, Items.string, Items.string, - Items.string); + 'I', bar, 'S', Items.string, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_bow, plank, plank, plank, plank, strip, Items.string, Items.string, + Items.string); - time = 60; - KnowledgeListMF.lanceR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_lance, "tier", - true, "hvyhammer", -1, -1, time, new Object[] { "IR ", "IIIIII", "IR ", + time = 60; + KnowledgeListMF.lanceR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_lance, "tier", + true, "hvyhammer", -1, -1, time, new Object[]{"IR ", "IIIIII", "IR ", - 'R', rivet, 'I', bar, }); - Salvage.addSalvage(CustomToolListMF.standard_lance, bar, bar, bar, bar, bar, bar, bar, bar, rivet, rivet); - } + 'R', rivet, 'I', bar,}); + Salvage.addSalvage(CustomToolListMF.standard_lance, bar, bar, bar, bar, bar, bar, bar, bar, rivet, rivet); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java index beb24735..7de28fc3 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java @@ -1,7 +1,5 @@ package minefantasy.mf2.recipe; -import java.util.HashMap; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.Salvage; @@ -23,481 +21,482 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import java.util.HashMap; + public class ForgingRecipes { - private static final Skill artisanry = SkillList.artisanry; - private static final Skill engineering = SkillList.engineering; - private static final Skill construction = SkillList.construction; - - public static void init() { - ForgedToolRecipes.init(); - ForgedArmourRecipes.init(); - addCogworkParts(); - - ItemStack ironbar = ComponentListMF.bar("Iron"); - ItemStack steelbar = ComponentListMF.bar("Steel"); - ItemStack goldbar = ComponentListMF.bar("Gold"); - ItemStack silverbar = ComponentListMF.bar("Silver"); - - // MISC - BaseMaterialMF material; - int time; - time = 1; - material = BaseMaterialMF.encrusted; - - KnowledgeListMF.obsidianHunkR = MineFantasyAPI.addAnvilRecipe(null, - new ItemStack(ComponentListMF.obsidian_rock, 4), "", false, material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "D", 'D', Blocks.obsidian, }); - KnowledgeListMF.diamondR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ComponentListMF.diamond_shards), - "", false, material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "D", 'D', Items.diamond, }); - - time = 3; - KnowledgeListMF.encrustedR = MineFantasyAPI.addAnvilRecipe(artisanry, ComponentListMF.bar("Encrusted"), - "smeltEncrusted", true, material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), - new Object[] { "D", "I", 'D', ComponentListMF.diamond_shards, 'I', ComponentListMF.bar("Steel"), }); - Salvage.addSalvage(ComponentListMF.ingots[5], ComponentListMF.ingots[4], ComponentListMF.diamond_shards); - Salvage.addSalvage(ComponentListMF.bar("Encrusted"), ComponentListMF.ingots[4], - ComponentListMF.diamond_shards); - - material = BaseMaterialMF.pigiron; - KnowledgeListMF.steelR = MineFantasyAPI.addAnvilRecipe(artisanry, ComponentListMF.bar("Steel"), "smeltSteel", - true, 1, 1, 5, - new Object[] { "C", "H", 'C', ComponentListMF.coalDust, 'H', ComponentListMF.bar("PigIron") }); - KnowledgeListMF.fluxR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ComponentListMF.flux, 4), "", false, - -1, -1, 2, new Object[] { "H", 'H', BlockListMF.limestone }); - - // STUDDED - material = BaseMaterialMF.iron; - // HELMET - time = 10; - KnowledgeListMF.studHelmetR = MineFantasyAPI.addAnvilRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 3, 0), "craftArmourLight", false, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { " I ", "IAI", " I ", 'I', - ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 0), }); - // CHEST - time = 20; - KnowledgeListMF.studChestR = MineFantasyAPI.addAnvilRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 3, 1), "craftArmourLight", false, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { " I ", "IAI", " I ", 'I', - ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 1), }); - // LEGS - time = 15; - KnowledgeListMF.studLegsR = MineFantasyAPI.addAnvilRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 3, 2), "craftArmourLight", false, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { " I ", "IAI", " I ", 'I', - ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 2), }); - // BOOTS - time = 6; - KnowledgeListMF.studBootsR = MineFantasyAPI.addAnvilRecipe(artisanry, - ArmourListMF.armour(ArmourListMF.leather, 3, 3), "craftArmourLight", false, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { " I ", "IAI", " I ", 'I', - ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 3), }); - - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 0), - ArmourListMF.armour(ArmourListMF.leather, 2, 0), new ItemStack(ComponentListMF.rivet, 4)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 1), - ArmourListMF.armour(ArmourListMF.leather, 2, 1), new ItemStack(ComponentListMF.rivet, 4)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 2), - ArmourListMF.armour(ArmourListMF.leather, 2, 2), new ItemStack(ComponentListMF.rivet, 4)); - Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 3), - ArmourListMF.armour(ArmourListMF.leather, 2, 3), new ItemStack(ComponentListMF.rivet, 4)); - - time = 2; - material = BaseMaterialMF.iron; - if (ConfigCrafting.allowIronResmelt) { - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), "blastfurn", false, - material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "IFI", 'I', ComponentListMF.bar("iron"), 'F', ComponentListMF.flux, }); - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, - material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "IFI", 'I', ComponentListMF.bar("iron"), 'F', ComponentListMF.flux_strong, }); - } - KnowledgeListMF.coalPrepR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.coal_prep), - "coke", false, material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "RCR", "CFC", "RCR", 'R', Items.redstone, 'C', new ItemStack(Items.coal, 1, 1), 'F', - ComponentListMF.flux_strong, }); - GameRegistry.addSmelting(ComponentListMF.coal_prep, new ItemStack(ComponentListMF.coke), 1F); - - KnowledgeListMF.ironPrepR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), - "blastfurn", false, material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "IFI", 'I', Blocks.iron_ore, 'F', ComponentListMF.flux, }); - KnowledgeListMF.ironPrepR2 = MineFantasyAPI.addAnvilRecipe(artisanry, - new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "IFI", 'I', Blocks.iron_ore, 'F', ComponentListMF.flux_strong, }); - - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), "blastfurn", false, - material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "IFI", 'I', ComponentListMF.oreIron, 'F', ComponentListMF.flux, }); - MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, - material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "IFI", 'I', ComponentListMF.oreIron, 'F', ComponentListMF.flux_strong, }); - ItemStack plate = ComponentListMF.plate.createComm("iron"); - time = 10; - KnowledgeListMF.blastChamR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.blast_chamber), - "blastfurn", false, "hvyHammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), - new Object[] { "RP PR", "RP PR", "RP PR", "RP PR", 'R', ComponentListMF.rivet, 'P', plate, }); - - time = 15; - KnowledgeListMF.blastHeatR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.blast_heater), - "blastfurn", false, "hvyHammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "RP PR", "RP PR", "RP PR", "RPFPR", 'R', - ComponentListMF.rivet, 'P', plate, 'F', Blocks.furnace, }); - - Salvage.addSalvage(BlockListMF.blast_heater, new ItemStack(ComponentListMF.rivet, 8), plate, plate, plate, - plate, plate, plate, plate, plate, Blocks.furnace); - Salvage.addSalvage(BlockListMF.blast_chamber, new ItemStack(ComponentListMF.rivet, 8), plate, plate, plate, - plate, plate, plate, plate, plate); - - time = 10; - KnowledgeListMF.bigFurnR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.furnace_stone), - "bigfurn", false, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "PRP", "RCR", "PFP", 'F', Blocks.furnace, 'R', - ComponentListMF.rivet, 'P', plate, 'C', BlockListMF.firebricks }); - time = 10; - KnowledgeListMF.bigHeatR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.furnace_heater), - "bigfurn", false, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "RCR", "PFP", 'R', ComponentListMF.rivet, 'P', - plate, 'C', BlockListMF.firebricks, 'F', BlockListMF.forge, }); - - Salvage.addSalvage(BlockListMF.furnace_heater, new ItemStack(ComponentListMF.rivet, 2), plate, plate, - BlockListMF.firebricks, BlockListMF.forge); - Salvage.addSalvage(BlockListMF.furnace_stone, new ItemStack(ComponentListMF.rivet, 3), plate, plate, plate, - plate, BlockListMF.firebricks, Blocks.furnace); - - IAnvilRecipe[] anvilRecs = new IAnvilRecipe[BlockListMF.anvils.length]; - for (int id = 0; id < BlockListMF.anvils.length; id++) { - time = 8; - material = BaseMaterialMF.getMaterial(BlockListMF.anvils[id]); - ItemStack bar = ComponentListMF.bar(material.name); - - anvilRecs[id] = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.anvil[id]), - "smelt" + material.name, false, "hammer", -1, -1, (int) (time * material.craftTimeModifier), - new Object[] { " II", "III", " I ", 'I', bar, }); - - Salvage.addSalvage(BlockListMF.anvil[id], ComponentListMF.bar(material.name, 6)); - } - recipeMap.put("anvilCrafting", anvilRecs); - - ItemStack bronzeHunk = ComponentListMF.metalHunk.createComm("bronze"); - ItemStack ironHunk = ComponentListMF.metalHunk.createComm("iron"); - - time = 2; - material = BaseMaterialMF.bronze; - KnowledgeListMF.framedStoneR = MineFantasyAPI.addAnvilRecipe(construction, - new ItemStack(BlockListMF.reinforced_stone_framed), "decorated_stone", false, "hammer", - material.hammerTier - 1, material.anvilTier - 1, (int) (time * material.craftTimeModifier), - new Object[] { " N ", "NSN", " N ", 'N', bronzeHunk, 'S', BlockListMF.reinforced_stone, }); - Salvage.addSalvage(BlockListMF.reinforced_stone_framed, bronzeHunk, bronzeHunk, bronzeHunk, bronzeHunk, - BlockListMF.reinforced_stone); - time = 2; - material = BaseMaterialMF.iron; - KnowledgeListMF.iframedStoneR = MineFantasyAPI.addAnvilRecipe(construction, - new ItemStack(BlockListMF.reinforced_stone_framediron), "decorated_stone", false, "hammer", - material.hammerTier - 1, material.anvilTier - 1, (int) (time * material.craftTimeModifier), - new Object[] { " N ", "NSN", " N ", 'N', ironHunk, 'S', BlockListMF.reinforced_stone, }); - Salvage.addSalvage(BlockListMF.reinforced_stone_framediron, ironHunk, ironHunk, ironHunk, ironHunk, - BlockListMF.reinforced_stone); - - time = 2; - material = BaseMaterialMF.bronze; - KnowledgeListMF.smokePipeR = MineFantasyAPI.addAnvilRecipe(construction, - new ItemStack(BlockListMF.chimney_pipe, 4), "", false, "hammer", material.hammerTier - 1, - material.anvilTier - 1, (int) (time * material.craftTimeModifier), - new Object[] { "N N", "PPPP", "N N", 'N', bronzeHunk, 'P', BlockListMF.chimney_stone, }); - Salvage.addSalvage(BlockListMF.chimney_pipe, BlockListMF.chimney_stone, bronzeHunk); - - for (int id = 0; id < BlockListMF.specialMetalBlocks.length; id++) { - time = 2; - material = BaseMaterialMF.getMaterial(BlockListMF.specialMetalBlocks[id]); - ItemStack hunk = ComponentListMF.metalHunk.createComm(material.name); - if (hunk != null) { - KnowledgeListMF.barsR - .add(MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(BlockListMF.bars[id]), - "smelt" + material.name, false, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "I I", "I I", 'I', hunk, })); - if (hunk.getItem() instanceof ItemComponentMF) { - Salvage.addSalvage(BlockListMF.bars[id], hunk, hunk, hunk, hunk); - } - } - } - if (!ConfigHardcore.HCCRemoveTalismansCraft) { - KnowledgeListMF.talismanRecipe.add(MineFantasyAPI.addAnvilRecipe(artisanry, - new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[] { - "LGL", "GIG", " G ", 'L', new ItemStack(Items.dye, 1, 4), 'I', ironbar, 'G', goldbar, })); - KnowledgeListMF.talismanRecipe.add(MineFantasyAPI.addAnvilRecipe(artisanry, - new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[] { - "LSL", "SIS", " S ", 'L', new ItemStack(Items.dye, 1, 4), 'I', ironbar, 'S', silverbar, })); - KnowledgeListMF.greatTalismanRecipe = MineFantasyAPI.addAnvilRecipe(artisanry, - new ItemStack(ComponentListMF.talisman_greater), "", true, "hammer", 1, 1, 50, - new Object[] { "GSG", "DTD", "GDG", 'G', goldbar, 'D', Items.diamond, 'T', - ComponentListMF.talisman_lesser, 'S', Items.nether_star, }); - } - - addEngineering(); - addConstruction(); - - time = 10; - material = BaseMaterialMF.iron; - KnowledgeListMF.caketinRecipe = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(FoodListMF.cake_tin), "", - true, "hammer", material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { " R ", "I I", " I ", 'I', ironbar, 'R', ComponentListMF.rivet, }); - Salvage.addSalvage(FoodListMF.cake_tin, ComponentListMF.bar("Iron", 3), ComponentListMF.rivet); - - KnowledgeListMF.coalfluxR = MineFantasyAPI.addAnvilRecipe(artisanry, - new ItemStack(ComponentListMF.coal_flux, 2), "coalflux", false, material.hammerTier, material.anvilTier, - 2, new Object[] { "F", "C", 'C', Items.coal, 'F', ComponentListMF.flux_pot, }); - - time = 4; - material = BaseMaterialMF.iron; - KnowledgeListMF.hingeRecipe = MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(ComponentListMF.hinge), - "", true, "hammer", material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "LR", 'L', ComponentListMF.leather_strip, 'R', ComponentListMF.rivet, }); - Salvage.addSalvage(ComponentListMF.hinge, ComponentListMF.leather_strip, ComponentListMF.rivet); - - time = 10; - KnowledgeListMF.crestR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.ornate_items), - "craftOrnate", false, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), - new Object[] { " G ", "SLS", " G ", 'G', goldbar, 'S', silverbar, 'L', new ItemStack(Items.dye, 1, 4) - - }); - } - - private static Item getStrips(BaseMaterialMF material) { - return ComponentListMF.leather_strip; - } - - private static Item getLeather(BaseMaterialMF material) { - return Items.leather; - } - - private static void addEngineering() { - ItemStack copper = ComponentListMF.bar("Copper"); - ItemStack bronze = ComponentListMF.bar("Bronze"); - ItemStack iron = ComponentListMF.bar("Iron"); - ItemStack steel = ComponentListMF.bar("Steel"); - ItemStack tungsten = ComponentListMF.bar("Tungsten"); - ItemStack blacksteel = ComponentListMF.bar("BlackSteel"); - - ItemStack bronzeHunk = ComponentListMF.metalHunk.createComm("bronze"); - ItemStack ironHunk = ComponentListMF.metalHunk.createComm("iron"); - ItemStack steelHunk = ComponentListMF.metalHunk.createComm("steel"); - ItemStack tungstenHunk = ComponentListMF.metalHunk.createComm("tungsten"); - ItemStack obsidianHunk = ComponentListMF.metalHunk.createComm("obsidian"); - - BaseMaterialMF material = BaseMaterialMF.steel; - int time = 15; - KnowledgeListMF.eatoolsR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ToolListMF.engin_anvil_tools), "etools", true, "hammer", material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "SSLL", "LLSS", 'S', steelHunk, 'L', getStrips(material), }); - time = 5; - KnowledgeListMF.iframeR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.iron_frame), - "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "RRR", "ISI", "STS", "ISI", 'T', - ToolListMF.engin_anvil_tools, 'R', ComponentListMF.rivet, 'I', ironHunk, 'S', steelHunk, }); - time = 8; - KnowledgeListMF.istrutR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.iron_strut), - "ecomponents", true, "hvyhammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "RTR", "SIS", "SIS", 'T', - ToolListMF.engin_anvil_tools, 'R', ComponentListMF.rivet, 'I', iron, 'S', steelHunk, }); - time = 8; - KnowledgeListMF.stubeR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.steel_tube), - "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "TR R", "SSSS", 'T', - ToolListMF.engin_anvil_tools, 'R', ComponentListMF.rivet, 'S', steelHunk, }); - time = 2; - KnowledgeListMF.boltR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bolt, 2), - "etools", true, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { " T ", "SIS", " S ", " S ", 'T', - ToolListMF.engin_anvil_tools, 'I', iron, 'S', steelHunk, }); - time = 35; - KnowledgeListMF.climbPickbR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ToolListMF.climbing_pick_basic), "climber", true, "hammer", material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { "L SR", "IISR", "L T ", 'R', ComponentListMF.rivet, 'T', ToolListMF.engin_anvil_tools, - 'I', iron, 'S', steel, 'L', getStrips(material), }); - time = 5; - KnowledgeListMF.bgearR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bronze_gears), - "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { " T ", " B ", "BIB", " B ", 'T', - ToolListMF.engin_anvil_tools, 'I', iron, 'B', bronzeHunk, }); - time = 8; - material = BaseMaterialMF.tungsten; - KnowledgeListMF.tgearR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ComponentListMF.tungsten_gears), "tungsten", true, "hammer", material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { " T ", " W ", "WGW", " W ", 'T', ToolListMF.engin_anvil_tools, 'W', tungstenHunk, 'G', - ComponentListMF.bronze_gears, }); - time = 5; - material = BaseMaterialMF.compositeAlloy; - KnowledgeListMF.compPlateR = MineFantasyAPI.addAnvilRecipe(engineering, ComponentListMF.bar("CompositeAlloy"), - "cogArmour", true, "hvyhammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { " T ", " S ", "RWR", " C ", - - 'R', ComponentListMF.rivet, 'T', ToolListMF.engin_anvil_tools, 'C', copper, 'W', tungstenHunk, - 'S', steel, }); - material = BaseMaterialMF.iron; - - time = 5; - KnowledgeListMF.bombCaseIronR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ComponentListMF.bomb_casing_iron, 2), "bombIron", true, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { " T ", " I ", "IRI", - " I ", 'T', ToolListMF.engin_anvil_tools, 'I', ironHunk, 'R', ComponentListMF.rivet, }); - KnowledgeListMF.mineCaseIronR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ComponentListMF.mine_casing_iron, 2), "bombIron", true, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { " T ", " P ", " IRI ", "IR RI", 'T', ToolListMF.engin_anvil_tools, 'P', - Blocks.heavy_weighted_pressure_plate, 'I', ironHunk, 'R', ComponentListMF.rivet, }); - - time = 5; - KnowledgeListMF.bombarrowR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ComponentListMF.bomb_casing_arrow), "bombarrow", true, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { " IR", "FPITI", " IR", 'T', ToolListMF.engin_anvil_tools, 'I', ironHunk, 'R', - Items.redstone, 'P', ComponentListMF.plank.construct("RefinedWood"), 'F', - ComponentListMF.fletching, }); - KnowledgeListMF.bombBoltR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ComponentListMF.bomb_casing_bolt), "bombarrow", true, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { " IR", "FITI", " IR", 'T', ToolListMF.engin_anvil_tools, 'I', ironHunk, 'R', - Items.redstone, 'F', ComponentListMF.fletching, }); - - material = BaseMaterialMF.blacksteel; - - time = 5; - KnowledgeListMF.bombCaseObsidianR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ComponentListMF.bomb_casing_obsidian, 2), "bombObsidian", true, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { " T ", "RIR", "IOI", "RIR", 'T', ToolListMF.engin_anvil_tools, 'O', Blocks.obsidian, 'I', - obsidianHunk, 'R', ComponentListMF.rivet, }); - KnowledgeListMF.mineCaseObsidianR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ComponentListMF.mine_casing_obsidian, 2), "mineObsidian", true, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), - new Object[] { " T ", " P ", " IRI ", "IRORI", 'T', ToolListMF.engin_anvil_tools, 'O', - Blocks.obsidian, 'P', Blocks.heavy_weighted_pressure_plate, 'I', obsidianHunk, 'R', - ComponentListMF.rivet, }); - time = 15; - material = BaseMaterialMF.steel; - KnowledgeListMF.crossBayonetR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ComponentListMF.cross_bayonet), "crossBayonet", true, material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { "R R I", "PIII ", 'P', - ComponentListMF.plank.construct("RefinedWood"), 'I', ironHunk, 'R', ComponentListMF.rivet, }); - - Salvage.addSalvage(ToolListMF.engin_anvil_tools, steelHunk, steelHunk, steelHunk, steelHunk, - new ItemStack(ComponentListMF.leather_strip, 4)); - - Salvage.addSalvage(ComponentListMF.iron_frame, steelHunk, steelHunk, steelHunk, steelHunk, ironHunk, ironHunk, - ironHunk, ironHunk, new ItemStack(ComponentListMF.rivet, 3)); - - Salvage.addSalvage(ComponentListMF.iron_strut, steelHunk, steelHunk, steelHunk, steelHunk, - ComponentListMF.bar("Iron", 2), new ItemStack(ComponentListMF.rivet, 2)); - - Salvage.addSalvage(ComponentListMF.steel_tube, steelHunk, steelHunk, steelHunk, steelHunk, - new ItemStack(ComponentListMF.rivet, 2)); - - Salvage.addSalvage(ToolListMF.climbing_pick_basic, ComponentListMF.bar("Iron", 2), - ComponentListMF.bar("Steel", 2), new ItemStack(ComponentListMF.rivet, 2), - new ItemStack(ComponentListMF.leather_strip, 2)); - - Salvage.addSalvage(ComponentListMF.bronze_gears, bronzeHunk, bronzeHunk, bronzeHunk, bronzeHunk, iron); - - Salvage.addSalvage(ComponentListMF.tungsten_gears, tungstenHunk, tungstenHunk, tungstenHunk, tungstenHunk, - ComponentListMF.bronze_gears); - - Salvage.addSalvage(ComponentListMF.bar("CompositeAlloy"), copper, steel, tungstenHunk, - new ItemStack(ComponentListMF.rivet, 2)); - Salvage.addSalvage(ComponentListMF.ingotCompositeAlloy, copper, steel, tungstenHunk, - new ItemStack(ComponentListMF.rivet, 2)); - - Salvage.addSalvage(ComponentListMF.bomb_casing_iron, ironHunk, ironHunk); - Salvage.addSalvage(ComponentListMF.mine_casing_iron, ironHunk, ironHunk, ComponentListMF.rivet, iron); - Salvage.addSalvage(ComponentListMF.bomb_casing_arrow, ironHunk, ironHunk, ironHunk, ironHunk, - new ItemStack(Items.redstone, 2), ComponentListMF.plank.construct("RefinedWood"), - ComponentListMF.fletching); - - Salvage.addSalvage(ComponentListMF.bomb_casing_bolt, ironHunk, ironHunk, ironHunk, ironHunk, - new ItemStack(Items.redstone, 2), ComponentListMF.fletching); - - Salvage.addSalvage(ComponentListMF.bomb_casing_obsidian, obsidianHunk, obsidianHunk, - new ItemStack(ComponentListMF.rivet, 2)); - Salvage.addSalvage(ComponentListMF.mine_casing_obsidian, obsidianHunk, obsidianHunk, iron, - ComponentListMF.rivet); - - Salvage.addSalvage(ComponentListMF.cross_bayonet, ironHunk, ironHunk, ironHunk, ironHunk, - ComponentListMF.plank.construct("RefinedWood"), new ItemStack(ComponentListMF.rivet, 2)); - } - - private static void addConstruction() { - BaseMaterialMF material = BaseMaterialMF.tin; - ItemStack tin = ComponentListMF.bar("Tin"); - int time = 10; - KnowledgeListMF.brushRecipe = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ToolListMF.paint_brush), - "paint_brush", true, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "W", "I", "P", - - 'W', Blocks.wool, 'I', tin, 'P', ComponentListMF.plank.construct("RefinedWood"), }); - - Salvage.addSalvage(ToolListMF.paint_brush, Blocks.wool, tin, ComponentListMF.plank.construct("RefinedWood")); - } - - private static void addCogworkParts() { - BaseMaterialMF material = BaseMaterialMF.steel; - int time = 1; - KnowledgeListMF.frameBlockR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.frame_block), - "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "R", "I", - - 'I', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, }); - - Salvage.addSalvage(BlockListMF.frame_block, ComponentListMF.iron_frame, ComponentListMF.rivet); - - time = 10; - KnowledgeListMF.cogPulleyR = MineFantasyAPI.addAnvilRecipe(engineering, - new ItemStack(ComponentListMF.cogwork_pulley), "cogArmour", false, "hammer", material.hammerTier, - material.anvilTier, (int) (time * material.craftTimeModifier), new Object[] { "RFR", "GBG", "RFR", - - 'B', Blocks.redstone_block, 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'G', - ComponentListMF.tungsten_gears, }); - Salvage.addSalvage(ComponentListMF.cogwork_pulley, Blocks.redstone_block, - new ItemStack(ComponentListMF.iron_frame, 2), new ItemStack(ComponentListMF.rivet, 2), - new ItemStack(ComponentListMF.tungsten_gears, 2)); - Salvage.addSalvage(BlockListMF.frame_block, ComponentListMF.iron_frame, ComponentListMF.rivet); - - time = 10; - KnowledgeListMF.cogHelmR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_helm), - "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "RFFR", "SEES", " RR ", - - 'E', Items.ender_eye, 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'S', - ComponentListMF.cogwork_shaft, }); - Salvage.addSalvage(BlockListMF.cogwork_helm, new ItemStack(Items.ender_eye, 2), - new ItemStack(ComponentListMF.iron_frame, 2), new ItemStack(ComponentListMF.cogwork_shaft, 2), - new ItemStack(ComponentListMF.rivet, 4)); - time = 15; - KnowledgeListMF.cogChestR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_chest), - "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { " RFR ", "RSFSR", "RFBFR", " SFS ", - - 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'S', ComponentListMF.cogwork_shaft, - 'B', Blocks.furnace, }); - Salvage.addSalvage(BlockListMF.cogwork_chest, Blocks.furnace, new ItemStack(ComponentListMF.iron_frame, 5), - new ItemStack(ComponentListMF.cogwork_shaft, 4), new ItemStack(ComponentListMF.rivet, 6)); - - time = 10; - KnowledgeListMF.cogLegsR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_legs), - "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, - (int) (time * material.craftTimeModifier), new Object[] { "RFFFR", "RS SR", " S S ", " F F ", - - 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'S', - ComponentListMF.cogwork_shaft, }); - Salvage.addSalvage(BlockListMF.cogwork_legs, new ItemStack(ComponentListMF.iron_frame, 5), - new ItemStack(ComponentListMF.cogwork_shaft, 4), new ItemStack(ComponentListMF.rivet, 4)); - - } - - public static final HashMap recipeMap = new HashMap(); + public static final HashMap recipeMap = new HashMap(); + private static final Skill artisanry = SkillList.artisanry; + private static final Skill engineering = SkillList.engineering; + private static final Skill construction = SkillList.construction; + + public static void init() { + ForgedToolRecipes.init(); + ForgedArmourRecipes.init(); + addCogworkParts(); + + ItemStack ironbar = ComponentListMF.bar("Iron"); + ItemStack steelbar = ComponentListMF.bar("Steel"); + ItemStack goldbar = ComponentListMF.bar("Gold"); + ItemStack silverbar = ComponentListMF.bar("Silver"); + + // MISC + BaseMaterialMF material; + int time; + time = 1; + material = BaseMaterialMF.encrusted; + + KnowledgeListMF.obsidianHunkR = MineFantasyAPI.addAnvilRecipe(null, + new ItemStack(ComponentListMF.obsidian_rock, 4), "", false, material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"D", 'D', Blocks.obsidian,}); + KnowledgeListMF.diamondR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ComponentListMF.diamond_shards), + "", false, material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"D", 'D', Items.diamond,}); + + time = 3; + KnowledgeListMF.encrustedR = MineFantasyAPI.addAnvilRecipe(artisanry, ComponentListMF.bar("Encrusted"), + "smeltEncrusted", true, material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), + new Object[]{"D", "I", 'D', ComponentListMF.diamond_shards, 'I', ComponentListMF.bar("Steel"),}); + Salvage.addSalvage(ComponentListMF.ingots[5], ComponentListMF.ingots[4], ComponentListMF.diamond_shards); + Salvage.addSalvage(ComponentListMF.bar("Encrusted"), ComponentListMF.ingots[4], + ComponentListMF.diamond_shards); + + material = BaseMaterialMF.pigiron; + KnowledgeListMF.steelR = MineFantasyAPI.addAnvilRecipe(artisanry, ComponentListMF.bar("Steel"), "smeltSteel", + true, 1, 1, 5, + new Object[]{"C", "H", 'C', ComponentListMF.coalDust, 'H', ComponentListMF.bar("PigIron")}); + KnowledgeListMF.fluxR = MineFantasyAPI.addAnvilRecipe(null, new ItemStack(ComponentListMF.flux, 4), "", false, + -1, -1, 2, new Object[]{"H", 'H', BlockListMF.limestone}); + + // STUDDED + material = BaseMaterialMF.iron; + // HELMET + time = 10; + KnowledgeListMF.studHelmetR = MineFantasyAPI.addAnvilRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 3, 0), "craftArmourLight", false, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[]{" I ", "IAI", " I ", 'I', + ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 0),}); + // CHEST + time = 20; + KnowledgeListMF.studChestR = MineFantasyAPI.addAnvilRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 3, 1), "craftArmourLight", false, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[]{" I ", "IAI", " I ", 'I', + ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 1),}); + // LEGS + time = 15; + KnowledgeListMF.studLegsR = MineFantasyAPI.addAnvilRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 3, 2), "craftArmourLight", false, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[]{" I ", "IAI", " I ", 'I', + ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 2),}); + // BOOTS + time = 6; + KnowledgeListMF.studBootsR = MineFantasyAPI.addAnvilRecipe(artisanry, + ArmourListMF.armour(ArmourListMF.leather, 3, 3), "craftArmourLight", false, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[]{" I ", "IAI", " I ", 'I', + ComponentListMF.rivet, 'A', ArmourListMF.armourItem(ArmourListMF.leather, 2, 3),}); + + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 0), + ArmourListMF.armour(ArmourListMF.leather, 2, 0), new ItemStack(ComponentListMF.rivet, 4)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 1), + ArmourListMF.armour(ArmourListMF.leather, 2, 1), new ItemStack(ComponentListMF.rivet, 4)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 2), + ArmourListMF.armour(ArmourListMF.leather, 2, 2), new ItemStack(ComponentListMF.rivet, 4)); + Salvage.addSalvage(ArmourListMF.armourItem(ArmourListMF.leather, 3, 3), + ArmourListMF.armour(ArmourListMF.leather, 2, 3), new ItemStack(ComponentListMF.rivet, 4)); + + time = 2; + material = BaseMaterialMF.iron; + if (ConfigCrafting.allowIronResmelt) { + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), "blastfurn", false, + material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"IFI", 'I', ComponentListMF.bar("iron"), 'F', ComponentListMF.flux,}); + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, + material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"IFI", 'I', ComponentListMF.bar("iron"), 'F', ComponentListMF.flux_strong,}); + } + KnowledgeListMF.coalPrepR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.coal_prep), + "coke", false, material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"RCR", "CFC", "RCR", 'R', Items.redstone, 'C', new ItemStack(Items.coal, 1, 1), 'F', + ComponentListMF.flux_strong,}); + GameRegistry.addSmelting(ComponentListMF.coal_prep, new ItemStack(ComponentListMF.coke), 1F); + + KnowledgeListMF.ironPrepR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), + "blastfurn", false, material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"IFI", 'I', Blocks.iron_ore, 'F', ComponentListMF.flux,}); + KnowledgeListMF.ironPrepR2 = MineFantasyAPI.addAnvilRecipe(artisanry, + new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"IFI", 'I', Blocks.iron_ore, 'F', ComponentListMF.flux_strong,}); + + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep), "blastfurn", false, + material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"IFI", 'I', ComponentListMF.oreIron, 'F', ComponentListMF.flux,}); + MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.iron_prep, 2), "blastfurn", false, + material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"IFI", 'I', ComponentListMF.oreIron, 'F', ComponentListMF.flux_strong,}); + ItemStack plate = ComponentListMF.plate.createComm("iron"); + time = 10; + KnowledgeListMF.blastChamR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.blast_chamber), + "blastfurn", false, "hvyHammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), + new Object[]{"RP PR", "RP PR", "RP PR", "RP PR", 'R', ComponentListMF.rivet, 'P', plate,}); + + time = 15; + KnowledgeListMF.blastHeatR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.blast_heater), + "blastfurn", false, "hvyHammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"RP PR", "RP PR", "RP PR", "RPFPR", 'R', + ComponentListMF.rivet, 'P', plate, 'F', Blocks.furnace,}); + + Salvage.addSalvage(BlockListMF.blast_heater, new ItemStack(ComponentListMF.rivet, 8), plate, plate, plate, + plate, plate, plate, plate, plate, Blocks.furnace); + Salvage.addSalvage(BlockListMF.blast_chamber, new ItemStack(ComponentListMF.rivet, 8), plate, plate, plate, + plate, plate, plate, plate, plate); + + time = 10; + KnowledgeListMF.bigFurnR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.furnace_stone), + "bigfurn", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"PRP", "RCR", "PFP", 'F', Blocks.furnace, 'R', + ComponentListMF.rivet, 'P', plate, 'C', BlockListMF.firebricks}); + time = 10; + KnowledgeListMF.bigHeatR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.furnace_heater), + "bigfurn", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"RCR", "PFP", 'R', ComponentListMF.rivet, 'P', + plate, 'C', BlockListMF.firebricks, 'F', BlockListMF.forge,}); + + Salvage.addSalvage(BlockListMF.furnace_heater, new ItemStack(ComponentListMF.rivet, 2), plate, plate, + BlockListMF.firebricks, BlockListMF.forge); + Salvage.addSalvage(BlockListMF.furnace_stone, new ItemStack(ComponentListMF.rivet, 3), plate, plate, plate, + plate, BlockListMF.firebricks, Blocks.furnace); + + IAnvilRecipe[] anvilRecs = new IAnvilRecipe[BlockListMF.anvils.length]; + for (int id = 0; id < BlockListMF.anvils.length; id++) { + time = 8; + material = BaseMaterialMF.getMaterial(BlockListMF.anvils[id]); + ItemStack bar = ComponentListMF.bar(material.name); + + anvilRecs[id] = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(BlockListMF.anvil[id]), + "smelt" + material.name, false, "hammer", -1, -1, (int) (time * material.craftTimeModifier), + new Object[]{" II", "III", " I ", 'I', bar,}); + + Salvage.addSalvage(BlockListMF.anvil[id], ComponentListMF.bar(material.name, 6)); + } + recipeMap.put("anvilCrafting", anvilRecs); + + ItemStack bronzeHunk = ComponentListMF.metalHunk.createComm("bronze"); + ItemStack ironHunk = ComponentListMF.metalHunk.createComm("iron"); + + time = 2; + material = BaseMaterialMF.bronze; + KnowledgeListMF.framedStoneR = MineFantasyAPI.addAnvilRecipe(construction, + new ItemStack(BlockListMF.reinforced_stone_framed), "decorated_stone", false, "hammer", + material.hammerTier - 1, material.anvilTier - 1, (int) (time * material.craftTimeModifier), + new Object[]{" N ", "NSN", " N ", 'N', bronzeHunk, 'S', BlockListMF.reinforced_stone,}); + Salvage.addSalvage(BlockListMF.reinforced_stone_framed, bronzeHunk, bronzeHunk, bronzeHunk, bronzeHunk, + BlockListMF.reinforced_stone); + time = 2; + material = BaseMaterialMF.iron; + KnowledgeListMF.iframedStoneR = MineFantasyAPI.addAnvilRecipe(construction, + new ItemStack(BlockListMF.reinforced_stone_framediron), "decorated_stone", false, "hammer", + material.hammerTier - 1, material.anvilTier - 1, (int) (time * material.craftTimeModifier), + new Object[]{" N ", "NSN", " N ", 'N', ironHunk, 'S', BlockListMF.reinforced_stone,}); + Salvage.addSalvage(BlockListMF.reinforced_stone_framediron, ironHunk, ironHunk, ironHunk, ironHunk, + BlockListMF.reinforced_stone); + + time = 2; + material = BaseMaterialMF.bronze; + KnowledgeListMF.smokePipeR = MineFantasyAPI.addAnvilRecipe(construction, + new ItemStack(BlockListMF.chimney_pipe, 4), "", false, "hammer", material.hammerTier - 1, + material.anvilTier - 1, (int) (time * material.craftTimeModifier), + new Object[]{"N N", "PPPP", "N N", 'N', bronzeHunk, 'P', BlockListMF.chimney_stone,}); + Salvage.addSalvage(BlockListMF.chimney_pipe, BlockListMF.chimney_stone, bronzeHunk); + + for (int id = 0; id < BlockListMF.specialMetalBlocks.length; id++) { + time = 2; + material = BaseMaterialMF.getMaterial(BlockListMF.specialMetalBlocks[id]); + ItemStack hunk = ComponentListMF.metalHunk.createComm(material.name); + if (hunk != null) { + KnowledgeListMF.barsR + .add(MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(BlockListMF.bars[id]), + "smelt" + material.name, false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"I I", "I I", 'I', hunk,})); + if (hunk.getItem() instanceof ItemComponentMF) { + Salvage.addSalvage(BlockListMF.bars[id], hunk, hunk, hunk, hunk); + } + } + } + if (!ConfigHardcore.HCCRemoveTalismansCraft) { + KnowledgeListMF.talismanRecipe.add(MineFantasyAPI.addAnvilRecipe(artisanry, + new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[]{ + "LGL", "GIG", " G ", 'L', new ItemStack(Items.dye, 1, 4), 'I', ironbar, 'G', goldbar,})); + KnowledgeListMF.talismanRecipe.add(MineFantasyAPI.addAnvilRecipe(artisanry, + new ItemStack(ComponentListMF.talisman_lesser), "", true, "hammer", -1, -1, 20, new Object[]{ + "LSL", "SIS", " S ", 'L', new ItemStack(Items.dye, 1, 4), 'I', ironbar, 'S', silverbar,})); + KnowledgeListMF.greatTalismanRecipe = MineFantasyAPI.addAnvilRecipe(artisanry, + new ItemStack(ComponentListMF.talisman_greater), "", true, "hammer", 1, 1, 50, + new Object[]{"GSG", "DTD", "GDG", 'G', goldbar, 'D', Items.diamond, 'T', + ComponentListMF.talisman_lesser, 'S', Items.nether_star,}); + } + + addEngineering(); + addConstruction(); + + time = 10; + material = BaseMaterialMF.iron; + KnowledgeListMF.caketinRecipe = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(FoodListMF.cake_tin), "", + true, "hammer", material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{" R ", "I I", " I ", 'I', ironbar, 'R', ComponentListMF.rivet,}); + Salvage.addSalvage(FoodListMF.cake_tin, ComponentListMF.bar("Iron", 3), ComponentListMF.rivet); + + KnowledgeListMF.coalfluxR = MineFantasyAPI.addAnvilRecipe(artisanry, + new ItemStack(ComponentListMF.coal_flux, 2), "coalflux", false, material.hammerTier, material.anvilTier, + 2, new Object[]{"F", "C", 'C', Items.coal, 'F', ComponentListMF.flux_pot,}); + + time = 4; + material = BaseMaterialMF.iron; + KnowledgeListMF.hingeRecipe = MineFantasyAPI.addAnvilRecipe(construction, new ItemStack(ComponentListMF.hinge), + "", true, "hammer", material.hammerTier, material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"LR", 'L', ComponentListMF.leather_strip, 'R', ComponentListMF.rivet,}); + Salvage.addSalvage(ComponentListMF.hinge, ComponentListMF.leather_strip, ComponentListMF.rivet); + + time = 10; + KnowledgeListMF.crestR = MineFantasyAPI.addAnvilRecipe(artisanry, new ItemStack(ComponentListMF.ornate_items), + "craftOrnate", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), + new Object[]{" G ", "SLS", " G ", 'G', goldbar, 'S', silverbar, 'L', new ItemStack(Items.dye, 1, 4) + + }); + } + + private static Item getStrips(BaseMaterialMF material) { + return ComponentListMF.leather_strip; + } + + private static Item getLeather(BaseMaterialMF material) { + return Items.leather; + } + + private static void addEngineering() { + ItemStack copper = ComponentListMF.bar("Copper"); + ItemStack bronze = ComponentListMF.bar("Bronze"); + ItemStack iron = ComponentListMF.bar("Iron"); + ItemStack steel = ComponentListMF.bar("Steel"); + ItemStack tungsten = ComponentListMF.bar("Tungsten"); + ItemStack blacksteel = ComponentListMF.bar("BlackSteel"); + + ItemStack bronzeHunk = ComponentListMF.metalHunk.createComm("bronze"); + ItemStack ironHunk = ComponentListMF.metalHunk.createComm("iron"); + ItemStack steelHunk = ComponentListMF.metalHunk.createComm("steel"); + ItemStack tungstenHunk = ComponentListMF.metalHunk.createComm("tungsten"); + ItemStack obsidianHunk = ComponentListMF.metalHunk.createComm("obsidian"); + + BaseMaterialMF material = BaseMaterialMF.steel; + int time = 15; + KnowledgeListMF.eatoolsR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ToolListMF.engin_anvil_tools), "etools", true, "hammer", material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"SSLL", "LLSS", 'S', steelHunk, 'L', getStrips(material),}); + time = 5; + KnowledgeListMF.iframeR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.iron_frame), + "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"RRR", "ISI", "STS", "ISI", 'T', + ToolListMF.engin_anvil_tools, 'R', ComponentListMF.rivet, 'I', ironHunk, 'S', steelHunk,}); + time = 8; + KnowledgeListMF.istrutR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.iron_strut), + "ecomponents", true, "hvyhammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"RTR", "SIS", "SIS", 'T', + ToolListMF.engin_anvil_tools, 'R', ComponentListMF.rivet, 'I', iron, 'S', steelHunk,}); + time = 8; + KnowledgeListMF.stubeR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.steel_tube), + "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"TR R", "SSSS", 'T', + ToolListMF.engin_anvil_tools, 'R', ComponentListMF.rivet, 'S', steelHunk,}); + time = 2; + KnowledgeListMF.boltR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bolt, 2), + "etools", true, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{" T ", "SIS", " S ", " S ", 'T', + ToolListMF.engin_anvil_tools, 'I', iron, 'S', steelHunk,}); + time = 35; + KnowledgeListMF.climbPickbR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ToolListMF.climbing_pick_basic), "climber", true, "hammer", material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{"L SR", "IISR", "L T ", 'R', ComponentListMF.rivet, 'T', ToolListMF.engin_anvil_tools, + 'I', iron, 'S', steel, 'L', getStrips(material),}); + time = 5; + KnowledgeListMF.bgearR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ComponentListMF.bronze_gears), + "ecomponents", true, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{" T ", " B ", "BIB", " B ", 'T', + ToolListMF.engin_anvil_tools, 'I', iron, 'B', bronzeHunk,}); + time = 8; + material = BaseMaterialMF.tungsten; + KnowledgeListMF.tgearR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.tungsten_gears), "tungsten", true, "hammer", material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{" T ", " W ", "WGW", " W ", 'T', ToolListMF.engin_anvil_tools, 'W', tungstenHunk, 'G', + ComponentListMF.bronze_gears,}); + time = 5; + material = BaseMaterialMF.compositeAlloy; + KnowledgeListMF.compPlateR = MineFantasyAPI.addAnvilRecipe(engineering, ComponentListMF.bar("CompositeAlloy"), + "cogArmour", true, "hvyhammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{" T ", " S ", "RWR", " C ", + + 'R', ComponentListMF.rivet, 'T', ToolListMF.engin_anvil_tools, 'C', copper, 'W', tungstenHunk, + 'S', steel,}); + material = BaseMaterialMF.iron; + + time = 5; + KnowledgeListMF.bombCaseIronR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_iron, 2), "bombIron", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[]{" T ", " I ", "IRI", + " I ", 'T', ToolListMF.engin_anvil_tools, 'I', ironHunk, 'R', ComponentListMF.rivet,}); + KnowledgeListMF.mineCaseIronR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.mine_casing_iron, 2), "bombIron", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{" T ", " P ", " IRI ", "IR RI", 'T', ToolListMF.engin_anvil_tools, 'P', + Blocks.heavy_weighted_pressure_plate, 'I', ironHunk, 'R', ComponentListMF.rivet,}); + + time = 5; + KnowledgeListMF.bombarrowR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_arrow), "bombarrow", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{" IR", "FPITI", " IR", 'T', ToolListMF.engin_anvil_tools, 'I', ironHunk, 'R', + Items.redstone, 'P', ComponentListMF.plank.construct("RefinedWood"), 'F', + ComponentListMF.fletching,}); + KnowledgeListMF.bombBoltR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_bolt), "bombarrow", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{" IR", "FITI", " IR", 'T', ToolListMF.engin_anvil_tools, 'I', ironHunk, 'R', + Items.redstone, 'F', ComponentListMF.fletching,}); + + material = BaseMaterialMF.blacksteel; + + time = 5; + KnowledgeListMF.bombCaseObsidianR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.bomb_casing_obsidian, 2), "bombObsidian", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{" T ", "RIR", "IOI", "RIR", 'T', ToolListMF.engin_anvil_tools, 'O', Blocks.obsidian, 'I', + obsidianHunk, 'R', ComponentListMF.rivet,}); + KnowledgeListMF.mineCaseObsidianR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.mine_casing_obsidian, 2), "mineObsidian", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), + new Object[]{" T ", " P ", " IRI ", "IRORI", 'T', ToolListMF.engin_anvil_tools, 'O', + Blocks.obsidian, 'P', Blocks.heavy_weighted_pressure_plate, 'I', obsidianHunk, 'R', + ComponentListMF.rivet,}); + time = 15; + material = BaseMaterialMF.steel; + KnowledgeListMF.crossBayonetR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.cross_bayonet), "crossBayonet", true, material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[]{"R R I", "PIII ", 'P', + ComponentListMF.plank.construct("RefinedWood"), 'I', ironHunk, 'R', ComponentListMF.rivet,}); + + Salvage.addSalvage(ToolListMF.engin_anvil_tools, steelHunk, steelHunk, steelHunk, steelHunk, + new ItemStack(ComponentListMF.leather_strip, 4)); + + Salvage.addSalvage(ComponentListMF.iron_frame, steelHunk, steelHunk, steelHunk, steelHunk, ironHunk, ironHunk, + ironHunk, ironHunk, new ItemStack(ComponentListMF.rivet, 3)); + + Salvage.addSalvage(ComponentListMF.iron_strut, steelHunk, steelHunk, steelHunk, steelHunk, + ComponentListMF.bar("Iron", 2), new ItemStack(ComponentListMF.rivet, 2)); + + Salvage.addSalvage(ComponentListMF.steel_tube, steelHunk, steelHunk, steelHunk, steelHunk, + new ItemStack(ComponentListMF.rivet, 2)); + + Salvage.addSalvage(ToolListMF.climbing_pick_basic, ComponentListMF.bar("Iron", 2), + ComponentListMF.bar("Steel", 2), new ItemStack(ComponentListMF.rivet, 2), + new ItemStack(ComponentListMF.leather_strip, 2)); + + Salvage.addSalvage(ComponentListMF.bronze_gears, bronzeHunk, bronzeHunk, bronzeHunk, bronzeHunk, iron); + + Salvage.addSalvage(ComponentListMF.tungsten_gears, tungstenHunk, tungstenHunk, tungstenHunk, tungstenHunk, + ComponentListMF.bronze_gears); + + Salvage.addSalvage(ComponentListMF.bar("CompositeAlloy"), copper, steel, tungstenHunk, + new ItemStack(ComponentListMF.rivet, 2)); + Salvage.addSalvage(ComponentListMF.ingotCompositeAlloy, copper, steel, tungstenHunk, + new ItemStack(ComponentListMF.rivet, 2)); + + Salvage.addSalvage(ComponentListMF.bomb_casing_iron, ironHunk, ironHunk); + Salvage.addSalvage(ComponentListMF.mine_casing_iron, ironHunk, ironHunk, ComponentListMF.rivet, iron); + Salvage.addSalvage(ComponentListMF.bomb_casing_arrow, ironHunk, ironHunk, ironHunk, ironHunk, + new ItemStack(Items.redstone, 2), ComponentListMF.plank.construct("RefinedWood"), + ComponentListMF.fletching); + + Salvage.addSalvage(ComponentListMF.bomb_casing_bolt, ironHunk, ironHunk, ironHunk, ironHunk, + new ItemStack(Items.redstone, 2), ComponentListMF.fletching); + + Salvage.addSalvage(ComponentListMF.bomb_casing_obsidian, obsidianHunk, obsidianHunk, + new ItemStack(ComponentListMF.rivet, 2)); + Salvage.addSalvage(ComponentListMF.mine_casing_obsidian, obsidianHunk, obsidianHunk, iron, + ComponentListMF.rivet); + + Salvage.addSalvage(ComponentListMF.cross_bayonet, ironHunk, ironHunk, ironHunk, ironHunk, + ComponentListMF.plank.construct("RefinedWood"), new ItemStack(ComponentListMF.rivet, 2)); + } + + private static void addConstruction() { + BaseMaterialMF material = BaseMaterialMF.tin; + ItemStack tin = ComponentListMF.bar("Tin"); + int time = 10; + KnowledgeListMF.brushRecipe = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(ToolListMF.paint_brush), + "paint_brush", true, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"W", "I", "P", + + 'W', Blocks.wool, 'I', tin, 'P', ComponentListMF.plank.construct("RefinedWood"),}); + + Salvage.addSalvage(ToolListMF.paint_brush, Blocks.wool, tin, ComponentListMF.plank.construct("RefinedWood")); + } + + private static void addCogworkParts() { + BaseMaterialMF material = BaseMaterialMF.steel; + int time = 1; + KnowledgeListMF.frameBlockR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.frame_block), + "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"R", "I", + + 'I', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet,}); + + Salvage.addSalvage(BlockListMF.frame_block, ComponentListMF.iron_frame, ComponentListMF.rivet); + + time = 10; + KnowledgeListMF.cogPulleyR = MineFantasyAPI.addAnvilRecipe(engineering, + new ItemStack(ComponentListMF.cogwork_pulley), "cogArmour", false, "hammer", material.hammerTier, + material.anvilTier, (int) (time * material.craftTimeModifier), new Object[]{"RFR", "GBG", "RFR", + + 'B', Blocks.redstone_block, 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'G', + ComponentListMF.tungsten_gears,}); + Salvage.addSalvage(ComponentListMF.cogwork_pulley, Blocks.redstone_block, + new ItemStack(ComponentListMF.iron_frame, 2), new ItemStack(ComponentListMF.rivet, 2), + new ItemStack(ComponentListMF.tungsten_gears, 2)); + Salvage.addSalvage(BlockListMF.frame_block, ComponentListMF.iron_frame, ComponentListMF.rivet); + + time = 10; + KnowledgeListMF.cogHelmR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_helm), + "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"RFFR", "SEES", " RR ", + + 'E', Items.ender_eye, 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'S', + ComponentListMF.cogwork_shaft,}); + Salvage.addSalvage(BlockListMF.cogwork_helm, new ItemStack(Items.ender_eye, 2), + new ItemStack(ComponentListMF.iron_frame, 2), new ItemStack(ComponentListMF.cogwork_shaft, 2), + new ItemStack(ComponentListMF.rivet, 4)); + time = 15; + KnowledgeListMF.cogChestR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_chest), + "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{" RFR ", "RSFSR", "RFBFR", " SFS ", + + 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'S', ComponentListMF.cogwork_shaft, + 'B', Blocks.furnace,}); + Salvage.addSalvage(BlockListMF.cogwork_chest, Blocks.furnace, new ItemStack(ComponentListMF.iron_frame, 5), + new ItemStack(ComponentListMF.cogwork_shaft, 4), new ItemStack(ComponentListMF.rivet, 6)); + + time = 10; + KnowledgeListMF.cogLegsR = MineFantasyAPI.addAnvilRecipe(engineering, new ItemStack(BlockListMF.cogwork_legs), + "cogArmour", false, "hammer", material.hammerTier, material.anvilTier, + (int) (time * material.craftTimeModifier), new Object[]{"RFFFR", "RS SR", " S S ", " F F ", + + 'F', ComponentListMF.iron_frame, 'R', ComponentListMF.rivet, 'S', + ComponentListMF.cogwork_shaft,}); + Salvage.addSalvage(BlockListMF.cogwork_legs, new ItemStack(ComponentListMF.iron_frame, 5), + new ItemStack(ComponentListMF.cogwork_shaft, 4), new ItemStack(ComponentListMF.rivet, 4)); + + } } diff --git a/src/main/java/minefantasy/mf2/recipe/RecipeArmourDyeMF.java b/src/main/java/minefantasy/mf2/recipe/RecipeArmourDyeMF.java index aa281e6d..ed9214f7 100644 --- a/src/main/java/minefantasy/mf2/recipe/RecipeArmourDyeMF.java +++ b/src/main/java/minefantasy/mf2/recipe/RecipeArmourDyeMF.java @@ -1,7 +1,5 @@ package minefantasy.mf2.recipe; -import java.util.ArrayList; - import minefantasy.mf2.item.armour.ItemArmourMF; import net.minecraft.block.BlockColored; import net.minecraft.entity.passive.EntitySheep; @@ -11,128 +9,130 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; +import java.util.ArrayList; + public class RecipeArmourDyeMF implements IRecipe { - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(InventoryCrafting matrix, World world) { - ItemStack itemstack = null; - ArrayList arraylist = new ArrayList(); - - for (int i = 0; i < matrix.getSizeInventory(); ++i) { - ItemStack itemstack1 = matrix.getStackInSlot(i); - - if (itemstack1 != null) { - if (itemstack1.getItem() instanceof ItemArmourMF) { - ItemArmourMF itemarmor = (ItemArmourMF) itemstack1.getItem(); - - if (!itemarmor.canColour() || itemstack != null) { - return false; - } - - itemstack = itemstack1; - } else { - if (itemstack1.getItem() != Items.dye) { - return false; - } - - arraylist.add(itemstack1); - } - } - } - - return itemstack != null && !arraylist.isEmpty(); - } - - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(InventoryCrafting matrix) { - ItemStack itemstack = null; - int[] aint = new int[3]; - int i = 0; - int j = 0; - ItemArmourMF itemarmor = null; - int k; - int l; - float f; - float f1; - int l1; - - for (k = 0; k < matrix.getSizeInventory(); ++k) { - ItemStack itemstack1 = matrix.getStackInSlot(k); - - if (itemstack1 != null) { - if (itemstack1.getItem() instanceof ItemArmourMF) { - itemarmor = (ItemArmourMF) itemstack1.getItem(); - - if (!itemarmor.canColour() || itemstack != null) { - return null; - } - - itemstack = itemstack1.copy(); - itemstack.stackSize = 1; - - if (itemarmor.hasColor(itemstack1)) { - l = itemarmor.getColor(itemstack); - f = (l >> 16 & 255) / 255.0F; - f1 = (l >> 8 & 255) / 255.0F; - float f2 = (l & 255) / 255.0F; - i = (int) (i + Math.max(f, Math.max(f1, f2)) * 255.0F); - aint[0] = (int) (aint[0] + f * 255.0F); - aint[1] = (int) (aint[1] + f1 * 255.0F); - aint[2] = (int) (aint[2] + f2 * 255.0F); - ++j; - } - } else { - if (itemstack1.getItem() != Items.dye) { - return null; - } - - float[] afloat = EntitySheep.fleeceColorTable[BlockColored - .func_150032_b(itemstack1.getItemDamage())]; - int j1 = (int) (afloat[0] * 255.0F); - int k1 = (int) (afloat[1] * 255.0F); - l1 = (int) (afloat[2] * 255.0F); - i += Math.max(j1, Math.max(k1, l1)); - aint[0] += j1; - aint[1] += k1; - aint[2] += l1; - ++j; - } - } - } - - if (itemarmor == null) { - return null; - } else { - k = aint[0] / j; - int i1 = aint[1] / j; - l = aint[2] / j; - f = (float) i / (float) j; - f1 = Math.max(k, Math.max(i1, l)); - k = (int) (k * f / f1); - i1 = (int) (i1 * f / f1); - l = (int) (l * f / f1); - l1 = (k << 8) + i1; - l1 = (l1 << 8) + l; - itemarmor.func_82813_b(itemstack, l1); - return itemstack; - } - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() { - return 10; - } - - @Override - public ItemStack getRecipeOutput() { - return null; - } + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(InventoryCrafting matrix, World world) { + ItemStack itemstack = null; + ArrayList arraylist = new ArrayList(); + + for (int i = 0; i < matrix.getSizeInventory(); ++i) { + ItemStack itemstack1 = matrix.getStackInSlot(i); + + if (itemstack1 != null) { + if (itemstack1.getItem() instanceof ItemArmourMF) { + ItemArmourMF itemarmor = (ItemArmourMF) itemstack1.getItem(); + + if (!itemarmor.canColour() || itemstack != null) { + return false; + } + + itemstack = itemstack1; + } else { + if (itemstack1.getItem() != Items.dye) { + return false; + } + + arraylist.add(itemstack1); + } + } + } + + return itemstack != null && !arraylist.isEmpty(); + } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(InventoryCrafting matrix) { + ItemStack itemstack = null; + int[] aint = new int[3]; + int i = 0; + int j = 0; + ItemArmourMF itemarmor = null; + int k; + int l; + float f; + float f1; + int l1; + + for (k = 0; k < matrix.getSizeInventory(); ++k) { + ItemStack itemstack1 = matrix.getStackInSlot(k); + + if (itemstack1 != null) { + if (itemstack1.getItem() instanceof ItemArmourMF) { + itemarmor = (ItemArmourMF) itemstack1.getItem(); + + if (!itemarmor.canColour() || itemstack != null) { + return null; + } + + itemstack = itemstack1.copy(); + itemstack.stackSize = 1; + + if (itemarmor.hasColor(itemstack1)) { + l = itemarmor.getColor(itemstack); + f = (l >> 16 & 255) / 255.0F; + f1 = (l >> 8 & 255) / 255.0F; + float f2 = (l & 255) / 255.0F; + i = (int) (i + Math.max(f, Math.max(f1, f2)) * 255.0F); + aint[0] = (int) (aint[0] + f * 255.0F); + aint[1] = (int) (aint[1] + f1 * 255.0F); + aint[2] = (int) (aint[2] + f2 * 255.0F); + ++j; + } + } else { + if (itemstack1.getItem() != Items.dye) { + return null; + } + + float[] afloat = EntitySheep.fleeceColorTable[BlockColored + .func_150032_b(itemstack1.getItemDamage())]; + int j1 = (int) (afloat[0] * 255.0F); + int k1 = (int) (afloat[1] * 255.0F); + l1 = (int) (afloat[2] * 255.0F); + i += Math.max(j1, Math.max(k1, l1)); + aint[0] += j1; + aint[1] += k1; + aint[2] += l1; + ++j; + } + } + } + + if (itemarmor == null) { + return null; + } else { + k = aint[0] / j; + int i1 = aint[1] / j; + l = aint[2] / j; + f = (float) i / (float) j; + f1 = Math.max(k, Math.max(i1, l)); + k = (int) (k * f / f1); + i1 = (int) (i1 * f / f1); + l = (int) (l * f / f1); + l1 = (k << 8) + i1; + l1 = (l1 << 8) + l; + itemarmor.func_82813_b(itemstack, l1); + return itemstack; + } + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return 10; + } + + @Override + public ItemStack getRecipeOutput() { + return null; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/recipe/RecipeRemover.java b/src/main/java/minefantasy/mf2/recipe/RecipeRemover.java index dd4d3f51..67b7d873 100644 --- a/src/main/java/minefantasy/mf2/recipe/RecipeRemover.java +++ b/src/main/java/minefantasy/mf2/recipe/RecipeRemover.java @@ -8,24 +8,24 @@ import net.minecraft.item.crafting.IRecipe; public class RecipeRemover { - public static void removeRecipes() { - MFLogUtil.log("MineFantasy: Removing replaced recipes..."); - for (int a = 0; a < CraftingManager.getInstance().getRecipeList().size(); a++) { - IRecipe rec = (IRecipe) CraftingManager.getInstance().getRecipeList().get(a); - if (rec.getRecipeOutput() != null && willRemoveItem(rec.getRecipeOutput(), ConfigHardcore.HCCRemoveCraft)) { - CraftingManager.getInstance().getRecipeList().remove(a); - } - } - } + public static void removeRecipes() { + MFLogUtil.log("MineFantasy: Removing replaced recipes..."); + for (int a = 0; a < CraftingManager.getInstance().getRecipeList().size(); a++) { + IRecipe rec = (IRecipe) CraftingManager.getInstance().getRecipeList().get(a); + if (rec.getRecipeOutput() != null && willRemoveItem(rec.getRecipeOutput(), ConfigHardcore.HCCRemoveCraft)) { + CraftingManager.getInstance().getRecipeList().remove(a); + } + } + } - private static boolean willRemoveItem(ItemStack item, boolean HCC) { - if (item.getItem() == Items.stick) - return true; + private static boolean willRemoveItem(ItemStack item, boolean HCC) { + if (item.getItem() == Items.stick) + return true; - if (HCC) { - return item.getItem() == Items.bread || item.getItem() == Items.pumpkin_pie || item.getItem() == Items.cake - || item.getItem() == Items.flint_and_steel || item.getItem() == Items.bucket; - } - return false; - } + if (HCC) { + return item.getItem() == Items.bread || item.getItem() == Items.pumpkin_pie || item.getItem() == Items.cake + || item.getItem() == Items.flint_and_steel || item.getItem() == Items.bucket; + } + return false; + } } diff --git a/src/main/java/minefantasy/mf2/recipe/RecipeSyringe.java b/src/main/java/minefantasy/mf2/recipe/RecipeSyringe.java index 27876018..ea423cd9 100644 --- a/src/main/java/minefantasy/mf2/recipe/RecipeSyringe.java +++ b/src/main/java/minefantasy/mf2/recipe/RecipeSyringe.java @@ -8,76 +8,76 @@ import net.minecraft.world.World; public class RecipeSyringe implements IRecipe { - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(InventoryCrafting matrix, World world) { - ItemStack syringe = null; - ItemStack filler = null; + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(InventoryCrafting matrix, World world) { + ItemStack syringe = null; + ItemStack filler = null; - for (int i = 0; i < matrix.getSizeInventory(); ++i) { - ItemStack itemstack1 = matrix.getStackInSlot(i); + for (int i = 0; i < matrix.getSizeInventory(); ++i) { + ItemStack itemstack1 = matrix.getStackInSlot(i); - if (itemstack1 != null) { - if (itemstack1.getItem() == ToolListMF.syringe_empty) { - syringe = itemstack1; - } else if (itemstack1.getItem() instanceof ItemPotion) { - ItemPotion potion = (ItemPotion) itemstack1.getItem(); + if (itemstack1 != null) { + if (itemstack1.getItem() == ToolListMF.syringe_empty) { + syringe = itemstack1; + } else if (itemstack1.getItem() instanceof ItemPotion) { + ItemPotion potion = (ItemPotion) itemstack1.getItem(); - if (potion.isSplash(itemstack1.getItemDamage())) { - return false; - } + if (potion.isSplash(itemstack1.getItemDamage())) { + return false; + } - filler = itemstack1; - } - } - } + filler = itemstack1; + } + } + } - return syringe != null && filler != null; - } + return syringe != null && filler != null; + } - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(InventoryCrafting matrix) { - ItemStack syringe = null; - ItemStack filler = null; + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(InventoryCrafting matrix) { + ItemStack syringe = null; + ItemStack filler = null; - for (int i = 0; i < matrix.getSizeInventory(); ++i) { - ItemStack itemstack1 = matrix.getStackInSlot(i); + for (int i = 0; i < matrix.getSizeInventory(); ++i) { + ItemStack itemstack1 = matrix.getStackInSlot(i); - if (itemstack1 != null) { - if (itemstack1.getItem() == ToolListMF.syringe_empty) { - syringe = itemstack1; - } else if (itemstack1.getItem() instanceof ItemPotion) { - ItemPotion potion = (ItemPotion) itemstack1.getItem(); + if (itemstack1 != null) { + if (itemstack1.getItem() == ToolListMF.syringe_empty) { + syringe = itemstack1; + } else if (itemstack1.getItem() instanceof ItemPotion) { + ItemPotion potion = (ItemPotion) itemstack1.getItem(); - if (potion.isSplash(itemstack1.getItemDamage())) { - return null; - } + if (potion.isSplash(itemstack1.getItemDamage())) { + return null; + } - filler = itemstack1; - } - } - } - if (syringe != null && filler != null) { - return new ItemStack(ToolListMF.syringe, 1, filler.getItemDamage()); - } - return null; - } + filler = itemstack1; + } + } + } + if (syringe != null && filler != null) { + return new ItemStack(ToolListMF.syringe, 1, filler.getItemDamage()); + } + return null; + } - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() { - return 10; - } + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() { + return 10; + } - @Override - public ItemStack getRecipeOutput() { - return null; - } + @Override + public ItemStack getRecipeOutput() { + return null; + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/recipe/SalvageRecipes.java b/src/main/java/minefantasy/mf2/recipe/SalvageRecipes.java index 94fb3fe9..c3872229 100644 --- a/src/main/java/minefantasy/mf2/recipe/SalvageRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/SalvageRecipes.java @@ -7,134 +7,134 @@ import net.minecraft.item.ItemStack; public class SalvageRecipes { - public static void init() { - ItemStack ironHunk = ComponentListMF.metalHunk.createComm("iron"); - Salvage.addSalvage(Items.wooden_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 3)); - Salvage.addSalvage(Items.wooden_axe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 3)); - Salvage.addSalvage(Items.wooden_shovel, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 1)); - Salvage.addSalvage(Items.wooden_hoe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 2)); - Salvage.addSalvage(Items.wooden_sword, new ItemStack(Items.stick, 1), new ItemStack(Blocks.planks, 2)); + public static void init() { + ItemStack ironHunk = ComponentListMF.metalHunk.createComm("iron"); + Salvage.addSalvage(Items.wooden_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 3)); + Salvage.addSalvage(Items.wooden_axe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 3)); + Salvage.addSalvage(Items.wooden_shovel, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 1)); + Salvage.addSalvage(Items.wooden_hoe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.planks, 2)); + Salvage.addSalvage(Items.wooden_sword, new ItemStack(Items.stick, 1), new ItemStack(Blocks.planks, 2)); - Salvage.addSalvage(Items.stone_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 3)); - Salvage.addSalvage(Items.stone_axe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 3)); - Salvage.addSalvage(Items.stone_shovel, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 1)); - Salvage.addSalvage(Items.stone_hoe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 2)); - Salvage.addSalvage(Items.stone_sword, new ItemStack(Items.stick, 1), new ItemStack(Blocks.cobblestone, 2)); + Salvage.addSalvage(Items.stone_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 3)); + Salvage.addSalvage(Items.stone_axe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 3)); + Salvage.addSalvage(Items.stone_shovel, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 1)); + Salvage.addSalvage(Items.stone_hoe, new ItemStack(Items.stick, 2), new ItemStack(Blocks.cobblestone, 2)); + Salvage.addSalvage(Items.stone_sword, new ItemStack(Items.stick, 1), new ItemStack(Blocks.cobblestone, 2)); - Salvage.addSalvage(Items.leather_helmet, new ItemStack(Items.leather, 5)); - Salvage.addSalvage(Items.leather_chestplate, new ItemStack(Items.leather, 8)); - Salvage.addSalvage(Items.leather_leggings, new ItemStack(Items.leather, 7)); - Salvage.addSalvage(Items.leather_boots, new ItemStack(Items.leather, 4)); + Salvage.addSalvage(Items.leather_helmet, new ItemStack(Items.leather, 5)); + Salvage.addSalvage(Items.leather_chestplate, new ItemStack(Items.leather, 8)); + Salvage.addSalvage(Items.leather_leggings, new ItemStack(Items.leather, 7)); + Salvage.addSalvage(Items.leather_boots, new ItemStack(Items.leather, 4)); - Salvage.addSalvage(Items.iron_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 3)); - Salvage.addSalvage(Items.iron_axe, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 3)); - Salvage.addSalvage(Items.iron_shovel, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 1)); - Salvage.addSalvage(Items.iron_hoe, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 2)); - Salvage.addSalvage(Items.iron_sword, new ItemStack(Items.stick, 1), new ItemStack(Items.iron_ingot, 2)); - Salvage.addSalvage(Items.chainmail_helmet, new ItemStack(Items.iron_ingot, 2)); - Salvage.addSalvage(Items.chainmail_chestplate, new ItemStack(Items.iron_ingot, 4)); - Salvage.addSalvage(Items.chainmail_leggings, new ItemStack(Items.iron_ingot, 4)); - Salvage.addSalvage(Items.chainmail_boots, new ItemStack(Items.iron_ingot, 2)); - Salvage.addSalvage(Items.iron_helmet, new ItemStack(Items.iron_ingot, 5)); - Salvage.addSalvage(Items.iron_chestplate, new ItemStack(Items.iron_ingot, 8)); - Salvage.addSalvage(Items.iron_leggings, new ItemStack(Items.iron_ingot, 7)); - Salvage.addSalvage(Items.iron_boots, new ItemStack(Items.iron_ingot, 4)); - Salvage.addSalvage(Items.iron_horse_armor, Items.leather, new ItemStack(Items.iron_ingot, 8)); + Salvage.addSalvage(Items.iron_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 3)); + Salvage.addSalvage(Items.iron_axe, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 3)); + Salvage.addSalvage(Items.iron_shovel, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 1)); + Salvage.addSalvage(Items.iron_hoe, new ItemStack(Items.stick, 2), new ItemStack(Items.iron_ingot, 2)); + Salvage.addSalvage(Items.iron_sword, new ItemStack(Items.stick, 1), new ItemStack(Items.iron_ingot, 2)); + Salvage.addSalvage(Items.chainmail_helmet, new ItemStack(Items.iron_ingot, 2)); + Salvage.addSalvage(Items.chainmail_chestplate, new ItemStack(Items.iron_ingot, 4)); + Salvage.addSalvage(Items.chainmail_leggings, new ItemStack(Items.iron_ingot, 4)); + Salvage.addSalvage(Items.chainmail_boots, new ItemStack(Items.iron_ingot, 2)); + Salvage.addSalvage(Items.iron_helmet, new ItemStack(Items.iron_ingot, 5)); + Salvage.addSalvage(Items.iron_chestplate, new ItemStack(Items.iron_ingot, 8)); + Salvage.addSalvage(Items.iron_leggings, new ItemStack(Items.iron_ingot, 7)); + Salvage.addSalvage(Items.iron_boots, new ItemStack(Items.iron_ingot, 4)); + Salvage.addSalvage(Items.iron_horse_armor, Items.leather, new ItemStack(Items.iron_ingot, 8)); - Salvage.addSalvage(Items.golden_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 3)); - Salvage.addSalvage(Items.golden_axe, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 3)); - Salvage.addSalvage(Items.golden_shovel, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 1)); - Salvage.addSalvage(Items.golden_hoe, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 2)); - Salvage.addSalvage(Items.golden_sword, new ItemStack(Items.stick, 1), new ItemStack(Items.gold_ingot, 2)); - Salvage.addSalvage(Items.golden_helmet, new ItemStack(Items.gold_ingot, 5)); - Salvage.addSalvage(Items.golden_chestplate, new ItemStack(Items.gold_ingot, 8)); - Salvage.addSalvage(Items.golden_leggings, new ItemStack(Items.gold_ingot, 7)); - Salvage.addSalvage(Items.golden_boots, new ItemStack(Items.gold_ingot, 4)); - Salvage.addSalvage(Items.golden_horse_armor, Items.leather, new ItemStack(Items.gold_ingot, 8)); + Salvage.addSalvage(Items.golden_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 3)); + Salvage.addSalvage(Items.golden_axe, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 3)); + Salvage.addSalvage(Items.golden_shovel, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 1)); + Salvage.addSalvage(Items.golden_hoe, new ItemStack(Items.stick, 2), new ItemStack(Items.gold_ingot, 2)); + Salvage.addSalvage(Items.golden_sword, new ItemStack(Items.stick, 1), new ItemStack(Items.gold_ingot, 2)); + Salvage.addSalvage(Items.golden_helmet, new ItemStack(Items.gold_ingot, 5)); + Salvage.addSalvage(Items.golden_chestplate, new ItemStack(Items.gold_ingot, 8)); + Salvage.addSalvage(Items.golden_leggings, new ItemStack(Items.gold_ingot, 7)); + Salvage.addSalvage(Items.golden_boots, new ItemStack(Items.gold_ingot, 4)); + Salvage.addSalvage(Items.golden_horse_armor, Items.leather, new ItemStack(Items.gold_ingot, 8)); - Salvage.addSalvage(Items.diamond_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 3)); - Salvage.addSalvage(Items.diamond_axe, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 3)); - Salvage.addSalvage(Items.diamond_shovel, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 1)); - Salvage.addSalvage(Items.diamond_hoe, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 2)); - Salvage.addSalvage(Items.diamond_sword, new ItemStack(Items.stick, 1), new ItemStack(Items.diamond, 2)); - Salvage.addSalvage(Items.diamond_helmet, new ItemStack(Items.diamond, 5)); - Salvage.addSalvage(Items.diamond_chestplate, new ItemStack(Items.diamond, 8)); - Salvage.addSalvage(Items.diamond_leggings, new ItemStack(Items.diamond, 7)); - Salvage.addSalvage(Items.diamond_boots, new ItemStack(Items.diamond, 4)); - Salvage.addSalvage(Items.diamond_horse_armor, Items.leather, new ItemStack(Items.diamond, 8)); + Salvage.addSalvage(Items.diamond_pickaxe, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 3)); + Salvage.addSalvage(Items.diamond_axe, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 3)); + Salvage.addSalvage(Items.diamond_shovel, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 1)); + Salvage.addSalvage(Items.diamond_hoe, new ItemStack(Items.stick, 2), new ItemStack(Items.diamond, 2)); + Salvage.addSalvage(Items.diamond_sword, new ItemStack(Items.stick, 1), new ItemStack(Items.diamond, 2)); + Salvage.addSalvage(Items.diamond_helmet, new ItemStack(Items.diamond, 5)); + Salvage.addSalvage(Items.diamond_chestplate, new ItemStack(Items.diamond, 8)); + Salvage.addSalvage(Items.diamond_leggings, new ItemStack(Items.diamond, 7)); + Salvage.addSalvage(Items.diamond_boots, new ItemStack(Items.diamond, 4)); + Salvage.addSalvage(Items.diamond_horse_armor, Items.leather, new ItemStack(Items.diamond, 8)); - Salvage.addSalvage(Items.flint_and_steel, Items.flint, Items.iron_ingot); - Salvage.addSalvage(Items.compass, Items.redstone, new ItemStack(Items.iron_ingot, 4)); - Salvage.addSalvage(Items.clock, Items.redstone, new ItemStack(Items.gold_ingot, 4)); - Salvage.addSalvage(Items.bow, new ItemStack(Items.stick, 3), new ItemStack(Items.string, 3)); - Salvage.addSalvage(Items.fishing_rod, new ItemStack(Items.stick, 3), new ItemStack(Items.string, 2)); - Salvage.addSalvage(Items.shears, new ItemStack(Items.iron_ingot, 2)); - Salvage.addSalvage(Items.minecart, new ItemStack(Items.iron_ingot, 5)); - Salvage.addSalvage(Items.boat, new ItemStack(Blocks.planks, 5)); + Salvage.addSalvage(Items.flint_and_steel, Items.flint, Items.iron_ingot); + Salvage.addSalvage(Items.compass, Items.redstone, new ItemStack(Items.iron_ingot, 4)); + Salvage.addSalvage(Items.clock, Items.redstone, new ItemStack(Items.gold_ingot, 4)); + Salvage.addSalvage(Items.bow, new ItemStack(Items.stick, 3), new ItemStack(Items.string, 3)); + Salvage.addSalvage(Items.fishing_rod, new ItemStack(Items.stick, 3), new ItemStack(Items.string, 2)); + Salvage.addSalvage(Items.shears, new ItemStack(Items.iron_ingot, 2)); + Salvage.addSalvage(Items.minecart, new ItemStack(Items.iron_ingot, 5)); + Salvage.addSalvage(Items.boat, new ItemStack(Blocks.planks, 5)); - Salvage.addSalvage(Blocks.furnace, new ItemStack(Blocks.cobblestone, 8)); - Salvage.addSalvage(Blocks.dispenser, Items.bow, Items.redstone, new ItemStack(Blocks.cobblestone, 7)); - Salvage.addSalvage(Blocks.dropper, Items.redstone, new ItemStack(Blocks.cobblestone, 7)); - Salvage.addSalvage(Blocks.chest, new ItemStack(Blocks.planks, 8)); - Salvage.addSalvage(Blocks.piston, Items.redstone, Items.iron_ingot, new ItemStack(Blocks.cobblestone, 4), - new ItemStack(Blocks.planks, 3)); - Salvage.addSalvage(Blocks.sticky_piston, Items.slime_ball, Blocks.piston); - Salvage.addSalvage(Items.wooden_door, new ItemStack(Blocks.planks, 6)); - Salvage.addSalvage(Items.iron_door, new ItemStack(Items.iron_ingot, 6)); - Salvage.addSalvage(Blocks.trapdoor, new ItemStack(Blocks.planks, 3)); - Salvage.addSalvage(Blocks.hopper, Blocks.chest, new ItemStack(Items.iron_ingot, 5)); - Salvage.addSalvage(Items.cauldron, new ItemStack(Items.iron_ingot, 7)); - Salvage.addSalvage(Items.bed, new ItemStack(Blocks.planks, 3), new ItemStack(Blocks.wool, 3)); - Salvage.addSalvage(Items.book, new ItemStack(Items.paper, 3), Items.leather); - Salvage.addSalvage(Items.brewing_stand, new ItemStack(Blocks.cobblestone, 3), Items.blaze_rod); - Salvage.addSalvage(Items.carrot_on_a_stick, Items.carrot, Items.fishing_rod); - Salvage.addSalvage(Items.comparator, new ItemStack(Blocks.redstone_torch, 3), new ItemStack(Blocks.stone, 3), - Items.quartz); - Salvage.addSalvage(Items.ender_eye, Items.ender_pearl, Items.blaze_powder); - Salvage.addSalvage(Items.magma_cream, Items.blaze_powder, Items.slime_ball); - Salvage.addSalvage(Items.painting, new ItemStack(Items.stick, 8), Blocks.wool); - Salvage.addSalvage(Items.repeater, new ItemStack(Blocks.stone, 3), new ItemStack(Blocks.redstone_torch, 2), - Items.redstone); - Salvage.addSalvage(Items.saddle, Items.leather, 5); - Salvage.addSalvage(Items.sign, new ItemStack(Blocks.planks, 2)); - Salvage.addSalvage(Items.speckled_melon, new ItemStack(Items.gold_nugget, 8), Items.melon); - Salvage.addSalvage(Blocks.activator_rail, Items.iron_ingot, Items.redstone); - Salvage.addSalvage(Blocks.anvil, new ItemStack(Items.iron_ingot, 31)); - Salvage.addSalvage(Blocks.beacon, Items.nether_star, new ItemStack(Blocks.glass, 5), - new ItemStack(Blocks.obsidian, 3)); - Salvage.addSalvage(Blocks.bookshelf, new ItemStack(Blocks.planks, 6), new ItemStack(Items.book, 3)); - Salvage.addSalvage(Blocks.crafting_table, new ItemStack(Blocks.planks, 4)); - Salvage.addSalvage(Blocks.daylight_detector, new ItemStack(Blocks.glass, 3), - new ItemStack(Blocks.wooden_slab, 3), new ItemStack(Items.quartz, 3)); - Salvage.addSalvage(Blocks.deadbush, new ItemStack(Items.stick, 4)); - Salvage.addSalvage(Blocks.detector_rail, Blocks.rail, Blocks.stone_pressure_plate); - Salvage.addSalvage(Blocks.enchanting_table, new ItemStack(Blocks.obsidian, 4), new ItemStack(Items.diamond, 2), - Items.book); - Salvage.addSalvage(Blocks.ender_chest, new ItemStack(Blocks.obsidian, 8), Items.ender_eye); - Salvage.addSalvage(Blocks.fence, new ItemStack(Items.stick, 3)); - Salvage.addSalvage(Blocks.fence_gate, new ItemStack(Blocks.planks, 2), new ItemStack(Items.stick, 4)); - Salvage.addSalvage(Blocks.golden_rail, Items.gold_ingot); - Salvage.addSalvage(Blocks.heavy_weighted_pressure_plate, new ItemStack(Items.iron_ingot, 2)); - Salvage.addSalvage(Blocks.light_weighted_pressure_plate, new ItemStack(Items.gold_ingot, 2)); - Salvage.addSalvage(Blocks.jukebox, new ItemStack(Blocks.planks, 8), Items.diamond); - Salvage.addSalvage(Blocks.ladder, new ItemStack(Items.stick, 2)); - Salvage.addSalvage(Blocks.lever, Items.stick, Blocks.cobblestone); - Salvage.addSalvage(Blocks.lit_pumpkin, Blocks.pumpkin, Blocks.torch); - Salvage.addSalvage(Blocks.noteblock, new ItemStack(Blocks.planks, 8), Items.redstone); - Salvage.addSalvage(Blocks.rail, ironHunk); - Salvage.addSalvage(Blocks.redstone_lamp, new ItemStack(Items.redstone, 4), Blocks.glowstone); - Salvage.addSalvage(Blocks.redstone_torch, Items.stick, Items.redstone); - Salvage.addSalvage(Blocks.sandstone, new ItemStack(Blocks.sand, 4)); - Salvage.addSalvage(Blocks.stonebrick, Blocks.stone); - Salvage.addSalvage(Blocks.stone_button, Blocks.stone); - Salvage.addSalvage(Blocks.stone_pressure_plate, new ItemStack(Blocks.stone, 2)); - Salvage.addSalvage(Blocks.tnt, new ItemStack(Blocks.sand, 4), Items.gunpowder, 5); - Salvage.addSalvage(Blocks.trapped_chest, Blocks.chest, Blocks.tripwire_hook); - Salvage.addSalvage(Blocks.tripwire_hook, ironHunk, ironHunk); - Salvage.addSalvage(Blocks.wooden_button, Blocks.planks); - Salvage.addSalvage(Blocks.wooden_pressure_plate, new ItemStack(Blocks.planks, 2)); - Salvage.addSalvage(Blocks.cobblestone_wall, Blocks.cobblestone); - Salvage.addSalvage(Blocks.iron_bars, ironHunk, ironHunk); - Salvage.addSalvage(Items.item_frame, new ItemStack(Items.stick, 8), Items.leather); - } + Salvage.addSalvage(Blocks.furnace, new ItemStack(Blocks.cobblestone, 8)); + Salvage.addSalvage(Blocks.dispenser, Items.bow, Items.redstone, new ItemStack(Blocks.cobblestone, 7)); + Salvage.addSalvage(Blocks.dropper, Items.redstone, new ItemStack(Blocks.cobblestone, 7)); + Salvage.addSalvage(Blocks.chest, new ItemStack(Blocks.planks, 8)); + Salvage.addSalvage(Blocks.piston, Items.redstone, Items.iron_ingot, new ItemStack(Blocks.cobblestone, 4), + new ItemStack(Blocks.planks, 3)); + Salvage.addSalvage(Blocks.sticky_piston, Items.slime_ball, Blocks.piston); + Salvage.addSalvage(Items.wooden_door, new ItemStack(Blocks.planks, 6)); + Salvage.addSalvage(Items.iron_door, new ItemStack(Items.iron_ingot, 6)); + Salvage.addSalvage(Blocks.trapdoor, new ItemStack(Blocks.planks, 3)); + Salvage.addSalvage(Blocks.hopper, Blocks.chest, new ItemStack(Items.iron_ingot, 5)); + Salvage.addSalvage(Items.cauldron, new ItemStack(Items.iron_ingot, 7)); + Salvage.addSalvage(Items.bed, new ItemStack(Blocks.planks, 3), new ItemStack(Blocks.wool, 3)); + Salvage.addSalvage(Items.book, new ItemStack(Items.paper, 3), Items.leather); + Salvage.addSalvage(Items.brewing_stand, new ItemStack(Blocks.cobblestone, 3), Items.blaze_rod); + Salvage.addSalvage(Items.carrot_on_a_stick, Items.carrot, Items.fishing_rod); + Salvage.addSalvage(Items.comparator, new ItemStack(Blocks.redstone_torch, 3), new ItemStack(Blocks.stone, 3), + Items.quartz); + Salvage.addSalvage(Items.ender_eye, Items.ender_pearl, Items.blaze_powder); + Salvage.addSalvage(Items.magma_cream, Items.blaze_powder, Items.slime_ball); + Salvage.addSalvage(Items.painting, new ItemStack(Items.stick, 8), Blocks.wool); + Salvage.addSalvage(Items.repeater, new ItemStack(Blocks.stone, 3), new ItemStack(Blocks.redstone_torch, 2), + Items.redstone); + Salvage.addSalvage(Items.saddle, Items.leather, 5); + Salvage.addSalvage(Items.sign, new ItemStack(Blocks.planks, 2)); + Salvage.addSalvage(Items.speckled_melon, new ItemStack(Items.gold_nugget, 8), Items.melon); + Salvage.addSalvage(Blocks.activator_rail, Items.iron_ingot, Items.redstone); + Salvage.addSalvage(Blocks.anvil, new ItemStack(Items.iron_ingot, 31)); + Salvage.addSalvage(Blocks.beacon, Items.nether_star, new ItemStack(Blocks.glass, 5), + new ItemStack(Blocks.obsidian, 3)); + Salvage.addSalvage(Blocks.bookshelf, new ItemStack(Blocks.planks, 6), new ItemStack(Items.book, 3)); + Salvage.addSalvage(Blocks.crafting_table, new ItemStack(Blocks.planks, 4)); + Salvage.addSalvage(Blocks.daylight_detector, new ItemStack(Blocks.glass, 3), + new ItemStack(Blocks.wooden_slab, 3), new ItemStack(Items.quartz, 3)); + Salvage.addSalvage(Blocks.deadbush, new ItemStack(Items.stick, 4)); + Salvage.addSalvage(Blocks.detector_rail, Blocks.rail, Blocks.stone_pressure_plate); + Salvage.addSalvage(Blocks.enchanting_table, new ItemStack(Blocks.obsidian, 4), new ItemStack(Items.diamond, 2), + Items.book); + Salvage.addSalvage(Blocks.ender_chest, new ItemStack(Blocks.obsidian, 8), Items.ender_eye); + Salvage.addSalvage(Blocks.fence, new ItemStack(Items.stick, 3)); + Salvage.addSalvage(Blocks.fence_gate, new ItemStack(Blocks.planks, 2), new ItemStack(Items.stick, 4)); + Salvage.addSalvage(Blocks.golden_rail, Items.gold_ingot); + Salvage.addSalvage(Blocks.heavy_weighted_pressure_plate, new ItemStack(Items.iron_ingot, 2)); + Salvage.addSalvage(Blocks.light_weighted_pressure_plate, new ItemStack(Items.gold_ingot, 2)); + Salvage.addSalvage(Blocks.jukebox, new ItemStack(Blocks.planks, 8), Items.diamond); + Salvage.addSalvage(Blocks.ladder, new ItemStack(Items.stick, 2)); + Salvage.addSalvage(Blocks.lever, Items.stick, Blocks.cobblestone); + Salvage.addSalvage(Blocks.lit_pumpkin, Blocks.pumpkin, Blocks.torch); + Salvage.addSalvage(Blocks.noteblock, new ItemStack(Blocks.planks, 8), Items.redstone); + Salvage.addSalvage(Blocks.rail, ironHunk); + Salvage.addSalvage(Blocks.redstone_lamp, new ItemStack(Items.redstone, 4), Blocks.glowstone); + Salvage.addSalvage(Blocks.redstone_torch, Items.stick, Items.redstone); + Salvage.addSalvage(Blocks.sandstone, new ItemStack(Blocks.sand, 4)); + Salvage.addSalvage(Blocks.stonebrick, Blocks.stone); + Salvage.addSalvage(Blocks.stone_button, Blocks.stone); + Salvage.addSalvage(Blocks.stone_pressure_plate, new ItemStack(Blocks.stone, 2)); + Salvage.addSalvage(Blocks.tnt, new ItemStack(Blocks.sand, 4), Items.gunpowder, 5); + Salvage.addSalvage(Blocks.trapped_chest, Blocks.chest, Blocks.tripwire_hook); + Salvage.addSalvage(Blocks.tripwire_hook, ironHunk, ironHunk); + Salvage.addSalvage(Blocks.wooden_button, Blocks.planks); + Salvage.addSalvage(Blocks.wooden_pressure_plate, new ItemStack(Blocks.planks, 2)); + Salvage.addSalvage(Blocks.cobblestone_wall, Blocks.cobblestone); + Salvage.addSalvage(Blocks.iron_bars, ironHunk, ironHunk); + Salvage.addSalvage(Items.item_frame, new ItemStack(Items.stick, 8), Items.leather); + } } diff --git a/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java b/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java index fc66c4c4..9b394f81 100644 --- a/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java +++ b/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java @@ -16,129 +16,129 @@ import net.minecraft.item.ItemStack; public class SmeltingRecipesMF { - public static void init() { - ItemStack copper = ComponentListMF.bar("Copper"); - ItemStack tin = ComponentListMF.bar("Tin"); - ItemStack bronze = ComponentListMF.bar("Bronze"); - ItemStack iron = ComponentListMF.bar("Iron"); - ItemStack pigiron = ComponentListMF.bar("PigIron"); - ItemStack steel = ComponentListMF.bar("Steel"); - ItemStack diamond = ComponentListMF.bar("Encrusted"); - ItemStack tungsten = ComponentListMF.bar("Tungsten"); - ItemStack obsidian = ComponentListMF.bar("Obsidian"); - ItemStack black = ComponentListMF.bar("BlackSteel"); - ItemStack red = ComponentListMF.bar("RedSteel"); - ItemStack blue = ComponentListMF.bar("BlueSteel"); - ItemStack gold = ComponentListMF.bar("Gold"); - ItemStack silver = ComponentListMF.bar("Silver"); - ItemStack mithril = ComponentListMF.bar("Mithril"); - ItemStack adamant = ComponentListMF.bar("Adamantium"); - ItemStack mithium = ComponentListMF.bar("Mithium"); - ItemStack ignotumite = ComponentListMF.bar("Ignotumite"); - ItemStack enderforge = ComponentListMF.bar("Ender"); - - KnowledgeListMF.reStone = MineFantasyAPI.addRatioAlloy(1, new ItemStack(BlockListMF.reinforced_stone, 4), 1, - new Object[] { Blocks.stone, Blocks.stone, Blocks.stone, Blocks.stone, ComponentListMF.fireclay, iron, - ComponentListMF.obsidian_rock }); - if (ConfigHardcore.HCCreduceIngots) { - if (MineFantasyAPI.removeSmelting(Blocks.iron_ore) && MineFantasyAPI.removeSmelting(Blocks.gold_ore)) { - MFLogUtil.logDebug("Removed Ore Smelting (Hardcore Ingots"); - } else { - MFLogUtil.logWarn("Failed to remove Ore smelting!"); - } - BloomRecipe.addRecipe(new ItemStack(Blocks.iron_ore), iron); - BloomRecipe.addRecipe(new ItemStack(Blocks.gold_ore), gold); - - MineFantasyAPI.addFurnaceRecipe(new ItemStack(Blocks.iron_ore), iron, 0); - MineFantasyAPI.addFurnaceRecipe(new ItemStack(Blocks.gold_ore), gold, 0); - } - - refineRawOre(ComponentListMF.oreCopper, copper); - refineRawOre(ComponentListMF.oreTin, tin); - refineRawOre(ComponentListMF.oreIron, iron); - refineRawOre(ComponentListMF.oreSilver, silver); - refineRawOre(ComponentListMF.oreGold, gold); - - refineRawOre(BlockListMF.oreCopper, copper, 0.4F); - refineRawOre(BlockListMF.oreTin, tin, 0.5F); - refineRawOre(BlockListMF.oreSilver, silver, 0.9F); - - GameRegistry.addSmelting(BlockListMF.oreBorax, new ItemStack(ComponentListMF.flux_strong, 4), 0.25F); - GameRegistry.addSmelting(BlockListMF.oreTungsten, new ItemStack(ComponentListMF.oreTungsten, 1), 0.25F); - GameRegistry.addSmelting(BlockListMF.oreKaolinite, new ItemStack(ComponentListMF.kaolinite), 0.25F); - GameRegistry.addSmelting(BlockListMF.oreNitre, new ItemStack(ComponentListMF.nitre, 4), 0.25F); - GameRegistry.addSmelting(BlockListMF.oreSulfur, new ItemStack(ComponentListMF.sulfur, 4), 0.25F); - GameRegistry.addSmelting(BlockListMF.oreClay, new ItemStack(Items.clay_ball, 4), 0.25F); - - // ALLOY - KnowledgeListMF.bronze = MineFantasyAPI.addRatioAlloy(3, ComponentListMF.bar("bronze", 3), - new Object[] { copper, copper, tin }); - - KnowledgeListMF.obsidalloy = MineFantasyAPI.addRatioAlloy(1, obsidian, 1, - new Object[] { steel, ComponentListMF.obsidian_rock, ComponentListMF.obsidian_rock, - ComponentListMF.obsidian_rock, ComponentListMF.obsidian_rock, ComponentListMF.flux_strong }); - KnowledgeListMF.black = MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[6], 2), 1, - new Object[] { steel, steel, bronze, bronze, ComponentListMF.obsidian_rock }); - - KnowledgeListMF.wolframiteR = MineFantasyAPI.addRatioAlloy(1, tungsten, 1, - new Object[] { Items.coal, Items.coal, Items.coal, Items.coal, ComponentListMF.oreTungsten, - ComponentListMF.flux_strong, ComponentListMF.flux_strong, ComponentListMF.flux_strong, - ComponentListMF.flux_strong }); - MineFantasyAPI.addRatioAlloy(1, tungsten, 1, - new Object[] { Items.coal, Items.coal, Items.coal, Items.coal, BlockListMF.oreTungsten, - ComponentListMF.flux_strong, ComponentListMF.flux_strong, ComponentListMF.flux_strong, - ComponentListMF.flux_strong }); - - if (!ConfigHardcore.HCCreduceIngots) { - KnowledgeListMF.steel = MineFantasyAPI.addRatioAlloy(9, steel, 1, new Object[] { pigiron }); - } - KnowledgeListMF.red = MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[9]), 1, - new Object[] { steel, gold, Items.redstone, ComponentListMF.flux_strong, Items.blaze_powder }); - - KnowledgeListMF.blue = MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[11]), 1, - new Object[] { steel, silver, new ItemStack(Items.dye, 1, 4), ComponentListMF.flux_strong, - Items.blaze_powder }); - - KnowledgeListMF.adamantium = MineFantasyAPI.addRatioAlloy(2, ComponentListMF.bar("adamantium", 2), 2, - new Object[] { BlockListMF.oreMythic, gold, gold }); - - KnowledgeListMF.mithril = MineFantasyAPI.addRatioAlloy(2, ComponentListMF.bar("mithril", 2), - new Object[] { BlockListMF.oreMythic, silver, silver }); - - KnowledgeListMF.ignotumite = MineFantasyAPI.addRatioAlloy(2, ignotumite, 3, - new Object[] { adamant, adamant, Items.emerald, Items.blaze_powder }); - - KnowledgeListMF.mithium = MineFantasyAPI.addRatioAlloy(2, mithium, 3, - new Object[] { mithril, mithril, ComponentListMF.diamond_shards, Items.ghast_tear }); - - KnowledgeListMF.enderforge = MineFantasyAPI.addRatioAlloy(2, enderforge, 3, - new Object[] { adamant, mithril, Items.ender_pearl, Items.ender_pearl }); - - MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.iron_prep, ComponentListMF.bar("PigIron")); - MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[6], black); - MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[9], red); - MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[11], blue); - } - - private static void refineRawOre(Item ore, ItemStack bar) { - refineRawOre(ore, bar, 0F); - } - - private static void refineRawOre(Block ore, ItemStack bar) { - refineRawOre(ore, bar, 0F); - } - - private static void refineRawOre(Block ore, ItemStack bar, float xp) { - refineRawOre(Item.getItemFromBlock(ore), bar, xp); - } - - private static void refineRawOre(Item ore, ItemStack bar, float xp) { - if (ConfigHardcore.HCCreduceIngots) { - BloomRecipe.addRecipe(ore, bar); - } else { - GameRegistry.addSmelting(ore, bar, xp); - } - BigFurnaceRecipes.addRecipe(new ItemStack(ore), bar, 0); - } + public static void init() { + ItemStack copper = ComponentListMF.bar("Copper"); + ItemStack tin = ComponentListMF.bar("Tin"); + ItemStack bronze = ComponentListMF.bar("Bronze"); + ItemStack iron = ComponentListMF.bar("Iron"); + ItemStack pigiron = ComponentListMF.bar("PigIron"); + ItemStack steel = ComponentListMF.bar("Steel"); + ItemStack diamond = ComponentListMF.bar("Encrusted"); + ItemStack tungsten = ComponentListMF.bar("Tungsten"); + ItemStack obsidian = ComponentListMF.bar("Obsidian"); + ItemStack black = ComponentListMF.bar("BlackSteel"); + ItemStack red = ComponentListMF.bar("RedSteel"); + ItemStack blue = ComponentListMF.bar("BlueSteel"); + ItemStack gold = ComponentListMF.bar("Gold"); + ItemStack silver = ComponentListMF.bar("Silver"); + ItemStack mithril = ComponentListMF.bar("Mithril"); + ItemStack adamant = ComponentListMF.bar("Adamantium"); + ItemStack mithium = ComponentListMF.bar("Mithium"); + ItemStack ignotumite = ComponentListMF.bar("Ignotumite"); + ItemStack enderforge = ComponentListMF.bar("Ender"); + + KnowledgeListMF.reStone = MineFantasyAPI.addRatioAlloy(1, new ItemStack(BlockListMF.reinforced_stone, 4), 1, + new Object[]{Blocks.stone, Blocks.stone, Blocks.stone, Blocks.stone, ComponentListMF.fireclay, iron, + ComponentListMF.obsidian_rock}); + if (ConfigHardcore.HCCreduceIngots) { + if (MineFantasyAPI.removeSmelting(Blocks.iron_ore) && MineFantasyAPI.removeSmelting(Blocks.gold_ore)) { + MFLogUtil.logDebug("Removed Ore Smelting (Hardcore Ingots"); + } else { + MFLogUtil.logWarn("Failed to remove Ore smelting!"); + } + BloomRecipe.addRecipe(new ItemStack(Blocks.iron_ore), iron); + BloomRecipe.addRecipe(new ItemStack(Blocks.gold_ore), gold); + + MineFantasyAPI.addFurnaceRecipe(new ItemStack(Blocks.iron_ore), iron, 0); + MineFantasyAPI.addFurnaceRecipe(new ItemStack(Blocks.gold_ore), gold, 0); + } + + refineRawOre(ComponentListMF.oreCopper, copper); + refineRawOre(ComponentListMF.oreTin, tin); + refineRawOre(ComponentListMF.oreIron, iron); + refineRawOre(ComponentListMF.oreSilver, silver); + refineRawOre(ComponentListMF.oreGold, gold); + + refineRawOre(BlockListMF.oreCopper, copper, 0.4F); + refineRawOre(BlockListMF.oreTin, tin, 0.5F); + refineRawOre(BlockListMF.oreSilver, silver, 0.9F); + + GameRegistry.addSmelting(BlockListMF.oreBorax, new ItemStack(ComponentListMF.flux_strong, 4), 0.25F); + GameRegistry.addSmelting(BlockListMF.oreTungsten, new ItemStack(ComponentListMF.oreTungsten, 1), 0.25F); + GameRegistry.addSmelting(BlockListMF.oreKaolinite, new ItemStack(ComponentListMF.kaolinite), 0.25F); + GameRegistry.addSmelting(BlockListMF.oreNitre, new ItemStack(ComponentListMF.nitre, 4), 0.25F); + GameRegistry.addSmelting(BlockListMF.oreSulfur, new ItemStack(ComponentListMF.sulfur, 4), 0.25F); + GameRegistry.addSmelting(BlockListMF.oreClay, new ItemStack(Items.clay_ball, 4), 0.25F); + + // ALLOY + KnowledgeListMF.bronze = MineFantasyAPI.addRatioAlloy(3, ComponentListMF.bar("bronze", 3), + new Object[]{copper, copper, tin}); + + KnowledgeListMF.obsidalloy = MineFantasyAPI.addRatioAlloy(1, obsidian, 1, + new Object[]{steel, ComponentListMF.obsidian_rock, ComponentListMF.obsidian_rock, + ComponentListMF.obsidian_rock, ComponentListMF.obsidian_rock, ComponentListMF.flux_strong}); + KnowledgeListMF.black = MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[6], 2), 1, + new Object[]{steel, steel, bronze, bronze, ComponentListMF.obsidian_rock}); + + KnowledgeListMF.wolframiteR = MineFantasyAPI.addRatioAlloy(1, tungsten, 1, + new Object[]{Items.coal, Items.coal, Items.coal, Items.coal, ComponentListMF.oreTungsten, + ComponentListMF.flux_strong, ComponentListMF.flux_strong, ComponentListMF.flux_strong, + ComponentListMF.flux_strong}); + MineFantasyAPI.addRatioAlloy(1, tungsten, 1, + new Object[]{Items.coal, Items.coal, Items.coal, Items.coal, BlockListMF.oreTungsten, + ComponentListMF.flux_strong, ComponentListMF.flux_strong, ComponentListMF.flux_strong, + ComponentListMF.flux_strong}); + + if (!ConfigHardcore.HCCreduceIngots) { + KnowledgeListMF.steel = MineFantasyAPI.addRatioAlloy(9, steel, 1, new Object[]{pigiron}); + } + KnowledgeListMF.red = MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[9]), 1, + new Object[]{steel, gold, Items.redstone, ComponentListMF.flux_strong, Items.blaze_powder}); + + KnowledgeListMF.blue = MineFantasyAPI.addRatioAlloy(1, new ItemStack(ComponentListMF.ingots[11]), 1, + new Object[]{steel, silver, new ItemStack(Items.dye, 1, 4), ComponentListMF.flux_strong, + Items.blaze_powder}); + + KnowledgeListMF.adamantium = MineFantasyAPI.addRatioAlloy(2, ComponentListMF.bar("adamantium", 2), 2, + new Object[]{BlockListMF.oreMythic, gold, gold}); + + KnowledgeListMF.mithril = MineFantasyAPI.addRatioAlloy(2, ComponentListMF.bar("mithril", 2), + new Object[]{BlockListMF.oreMythic, silver, silver}); + + KnowledgeListMF.ignotumite = MineFantasyAPI.addRatioAlloy(2, ignotumite, 3, + new Object[]{adamant, adamant, Items.emerald, Items.blaze_powder}); + + KnowledgeListMF.mithium = MineFantasyAPI.addRatioAlloy(2, mithium, 3, + new Object[]{mithril, mithril, ComponentListMF.diamond_shards, Items.ghast_tear}); + + KnowledgeListMF.enderforge = MineFantasyAPI.addRatioAlloy(2, enderforge, 3, + new Object[]{adamant, mithril, Items.ender_pearl, Items.ender_pearl}); + + MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.iron_prep, ComponentListMF.bar("PigIron")); + MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[6], black); + MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[9], red); + MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[11], blue); + } + + private static void refineRawOre(Item ore, ItemStack bar) { + refineRawOre(ore, bar, 0F); + } + + private static void refineRawOre(Block ore, ItemStack bar) { + refineRawOre(ore, bar, 0F); + } + + private static void refineRawOre(Block ore, ItemStack bar, float xp) { + refineRawOre(Item.getItemFromBlock(ore), bar, xp); + } + + private static void refineRawOre(Item ore, ItemStack bar, float xp) { + if (ConfigHardcore.HCCreduceIngots) { + BloomRecipe.addRecipe(ore, bar); + } else { + GameRegistry.addSmelting(ore, bar, xp); + } + BigFurnaceRecipes.addRecipe(new ItemStack(ore), bar, 0); + } } diff --git a/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java b/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java index 21d99a0c..965093c8 100644 --- a/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java +++ b/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java @@ -1,8 +1,5 @@ package minefantasy.mf2.recipe; -import java.util.ArrayList; -import java.util.Iterator; - import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.list.BlockListMF; @@ -12,52 +9,55 @@ import net.minecraft.init.Items; import net.minecraft.item.ItemStack; +import java.util.ArrayList; +import java.util.Iterator; + public class TempRecipesMF { - public static void init() { - ArrayList wood = CustomMaterial.getList("wood"); - Iterator iteratorWood = wood.iterator(); - while (iteratorWood.hasNext()) { - CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - assembleWoodVariations(customMat); - } - - // RESOURCES - - ItemStack steel = ComponentListMF.bar("Steel"); - - GameRegistry.addRecipe(new ItemStack(Blocks.rail, 64), - new Object[] { "I I", "ISI", "I I", 'I', steel, 'S', Items.stick, }); - - GameRegistry.addShapedRecipe(new ItemStack(Blocks.cobblestone), - new Object[] { "C", 'C', BlockListMF.cobble_brick }); - GameRegistry.addShapedRecipe(new ItemStack(Blocks.cobblestone), - new Object[] { "C", 'C', BlockListMF.cobble_pavement }); - KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cobble_brick, 4), - new Object[] { "C C", " ", "C C", 'C', Blocks.cobblestone })); - KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cobble_pavement, 4), - new Object[] { "CC", "CC", 'C', Blocks.cobblestone })); - - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.reinforced_stone), - new Object[] { "C", 'C', BlockListMF.reinforced_stone_bricks }); - KnowledgeListMF.stoneBricksR - .add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.reinforced_stone_bricks, 4), - new Object[] { "CC", "CC", 'C', BlockListMF.reinforced_stone })); - - GameRegistry.addShapedRecipe(new ItemStack(Blocks.dirt), new Object[] { "C", 'C', BlockListMF.mud_brick }); - GameRegistry.addShapedRecipe(new ItemStack(Blocks.dirt), new Object[] { "C", 'C', BlockListMF.mud_pavement }); - KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.mud_brick, 4), - new Object[] { "C C", " ", "C C", 'C', Blocks.dirt })); - KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.mud_pavement, 4), - new Object[] { "CC", "CC", 'C', Blocks.dirt })); - - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.framed_pane, 16), - new Object[] { "GGG", "GGG", 'G', BlockListMF.framed_glass }); - GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.window_pane, 16), - new Object[] { "GGG", "GGG", 'G', BlockListMF.window }); - - } - - private static void assembleWoodVariations(CustomMaterial material) { - - } + public static void init() { + ArrayList wood = CustomMaterial.getList("wood"); + Iterator iteratorWood = wood.iterator(); + while (iteratorWood.hasNext()) { + CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + assembleWoodVariations(customMat); + } + + // RESOURCES + + ItemStack steel = ComponentListMF.bar("Steel"); + + GameRegistry.addRecipe(new ItemStack(Blocks.rail, 64), + new Object[]{"I I", "ISI", "I I", 'I', steel, 'S', Items.stick,}); + + GameRegistry.addShapedRecipe(new ItemStack(Blocks.cobblestone), + new Object[]{"C", 'C', BlockListMF.cobble_brick}); + GameRegistry.addShapedRecipe(new ItemStack(Blocks.cobblestone), + new Object[]{"C", 'C', BlockListMF.cobble_pavement}); + KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cobble_brick, 4), + new Object[]{"C C", " ", "C C", 'C', Blocks.cobblestone})); + KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.cobble_pavement, 4), + new Object[]{"CC", "CC", 'C', Blocks.cobblestone})); + + GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.reinforced_stone), + new Object[]{"C", 'C', BlockListMF.reinforced_stone_bricks}); + KnowledgeListMF.stoneBricksR + .add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.reinforced_stone_bricks, 4), + new Object[]{"CC", "CC", 'C', BlockListMF.reinforced_stone})); + + GameRegistry.addShapedRecipe(new ItemStack(Blocks.dirt), new Object[]{"C", 'C', BlockListMF.mud_brick}); + GameRegistry.addShapedRecipe(new ItemStack(Blocks.dirt), new Object[]{"C", 'C', BlockListMF.mud_pavement}); + KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.mud_brick, 4), + new Object[]{"C C", " ", "C C", 'C', Blocks.dirt})); + KnowledgeListMF.stoneBricksR.add(GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.mud_pavement, 4), + new Object[]{"CC", "CC", 'C', Blocks.dirt})); + + GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.framed_pane, 16), + new Object[]{"GGG", "GGG", 'G', BlockListMF.framed_glass}); + GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.window_pane, 16), + new Object[]{"GGG", "GGG", 'G', BlockListMF.window}); + + } + + private static void assembleWoodVariations(CustomMaterial material) { + + } } diff --git a/src/main/java/minefantasy/mf2/util/BukkitUtils.java b/src/main/java/minefantasy/mf2/util/BukkitUtils.java index ae4ffdb6..8d0d6a7e 100644 --- a/src/main/java/minefantasy/mf2/util/BukkitUtils.java +++ b/src/main/java/minefantasy/mf2/util/BukkitUtils.java @@ -1,8 +1,10 @@ package minefantasy.mf2.util; -import java.lang.reflect.Method; -import java.util.List; - +import com.google.common.collect.Lists; +import minefantasy.mf2.MineFantasyII; +import minefantasy.mf2.config.ConfigIntegration; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.Event; @@ -13,79 +15,75 @@ import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.RegisteredListener; -import com.google.common.collect.Lists; - -import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.config.ConfigIntegration; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; +import java.lang.reflect.Method; +import java.util.List; public final class BukkitUtils { - private static final Method getBukkitEntity; - private static final List listeners = Lists.newArrayList(); + private static final Method getBukkitEntity; + private static final List listeners = Lists.newArrayList(); - static { - try { - getBukkitEntity = Entity.class.getDeclaredMethod("getBukkitEntity"); - getBukkitEntity.setAccessible(true); - } catch (Throwable throwable) { - throw new RuntimeException("Failed to hook CraftBukkit method!", throwable); - } - } + static { + try { + getBukkitEntity = Entity.class.getDeclaredMethod("getBukkitEntity"); + getBukkitEntity.setAccessible(true); + } catch (Throwable throwable) { + throw new RuntimeException("Failed to hook CraftBukkit method!", throwable); + } + } - public static final boolean cantBreakBlock(EntityPlayer player, int x, int y, int z) { - try { - Player bukkitPlayer = toBukkitEntity(player); - BlockBreakEvent event = new BlockBreakEvent(bukkitPlayer.getWorld().getBlockAt(x, y, z), bukkitPlayer); - callEvent(event); - return event.isCancelled(); - } catch (Throwable throwable) { - MFLogUtil.logWarn(String.format("Failed call BlockBreakEvent: [Player: %s, X:%d, Y:%d, Z:%d]", - String.valueOf(player), x, y, z)); - if (MineFantasyII.isDebug()) - throwable.printStackTrace(); - } - return true; - } + public static final boolean cantBreakBlock(EntityPlayer player, int x, int y, int z) { + try { + Player bukkitPlayer = toBukkitEntity(player); + BlockBreakEvent event = new BlockBreakEvent(bukkitPlayer.getWorld().getBlockAt(x, y, z), bukkitPlayer); + callEvent(event); + return event.isCancelled(); + } catch (Throwable throwable) { + MFLogUtil.logWarn(String.format("Failed call BlockBreakEvent: [Player: %s, X:%d, Y:%d, Z:%d]", + String.valueOf(player), x, y, z)); + if (MineFantasyII.isDebug()) + throwable.printStackTrace(); + } + return true; + } - public static final boolean cantDamage(Entity damager, Entity damagee) { - try { - @SuppressWarnings("deprecation") - EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(toBukkitEntity(damager), - toBukkitEntity(damagee), DamageCause.ENTITY_ATTACK, 0D); - callEvent(event); - return event.isCancelled(); - } catch (Throwable throwable) { - MFLogUtil.logWarn(String.format("Failed call EntityDamageByEntityEvent: [Damager: %s, Damagee: %s]", - String.valueOf(damager), String.valueOf(damagee))); - if (MineFantasyII.isDebug()) - throwable.printStackTrace(); - } - return true; - } + public static final boolean cantDamage(Entity damager, Entity damagee) { + try { + @SuppressWarnings("deprecation") + EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(toBukkitEntity(damager), + toBukkitEntity(damagee), DamageCause.ENTITY_ATTACK, 0D); + callEvent(event); + return event.isCancelled(); + } catch (Throwable throwable) { + MFLogUtil.logWarn(String.format("Failed call EntityDamageByEntityEvent: [Damager: %s, Damagee: %s]", + String.valueOf(damager), String.valueOf(damagee))); + if (MineFantasyII.isDebug()) + throwable.printStackTrace(); + } + return true; + } - private static final org.bukkit.entity.Entity toBukkitEntity(Entity entity) throws Exception { - return (org.bukkit.entity.Entity) getBukkitEntity.invoke(entity); - } + private static final org.bukkit.entity.Entity toBukkitEntity(Entity entity) throws Exception { + return (org.bukkit.entity.Entity) getBukkitEntity.invoke(entity); + } - private static final Player toBukkitEntity(EntityPlayer player) throws Exception { - return (Player) getBukkitEntity.invoke(player); - } + private static final Player toBukkitEntity(EntityPlayer player) throws Exception { + return (Player) getBukkitEntity.invoke(player); + } - public static final void onServerStarted() { - PluginManager plManager = Bukkit.getPluginManager(); - for (String plName : ConfigIntegration.pluginsList) - listeners.addAll(HandlerList.getRegisteredListeners(plManager.getPlugin(plName))); - } + public static final void onServerStarted() { + PluginManager plManager = Bukkit.getPluginManager(); + for (String plName : ConfigIntegration.pluginsList) + listeners.addAll(HandlerList.getRegisteredListeners(plManager.getPlugin(plName))); + } - private static final void callEvent(Event event) { - for (RegisteredListener listener : listeners) - try { - listener.callEvent(event); - } catch (Throwable throwable) { - if (MineFantasyII.isDebug()) - throwable.printStackTrace(); - } - } + private static final void callEvent(Event event) { + for (RegisteredListener listener : listeners) + try { + listener.callEvent(event); + } catch (Throwable throwable) { + if (MineFantasyII.isDebug()) + throwable.printStackTrace(); + } + } } diff --git a/src/main/java/minefantasy/mf2/util/MFLogUtil.java b/src/main/java/minefantasy/mf2/util/MFLogUtil.java index 779ae0bb..8eb18487 100644 --- a/src/main/java/minefantasy/mf2/util/MFLogUtil.java +++ b/src/main/java/minefantasy/mf2/util/MFLogUtil.java @@ -1,31 +1,30 @@ package minefantasy.mf2.util; -import org.apache.logging.log4j.Logger; - import cpw.mods.fml.common.FMLLog; import minefantasy.mf2.MineFantasyII; +import org.apache.logging.log4j.Logger; public class MFLogUtil { - public static final Logger MF_LOGGER = FMLLog.getLogger(); + public static final Logger MF_LOGGER = FMLLog.getLogger(); - public static final String PREFIX = "[MineFantasyII]: "; + public static final String PREFIX = "[MineFantasyII]: "; - public static void log(String mes) { - FMLLog.info(PREFIX + mes); - // MF_LOGGER.log(Level.INFO, PREFIX + mes); - } + public static void log(String mes) { + FMLLog.info(PREFIX + mes); + // MF_LOGGER.log(Level.INFO, PREFIX + mes); + } - public static void logWarn(String mes) { - FMLLog.warning(PREFIX + "(warning) " + mes); - // MF_LOGGER.log(Level.WARN, PREFIX + mes); - } + public static void logWarn(String mes) { + FMLLog.warning(PREFIX + "(warning) " + mes); + // MF_LOGGER.log(Level.WARN, PREFIX + mes); + } - public static void logDebug(String mes) { - if (MineFantasyII.isDebug()) { - FMLLog.info(PREFIX + "(debug) " + mes); - // MF_LOGGER.debug(PREFIX + mes); - } - } + public static void logDebug(String mes) { + if (MineFantasyII.isDebug()) { + FMLLog.info(PREFIX + "(debug) " + mes); + // MF_LOGGER.debug(PREFIX + mes); + } + } } diff --git a/src/main/java/minefantasy/mf2/util/XSTRandom.java b/src/main/java/minefantasy/mf2/util/XSTRandom.java index 1153cb35..1cee7cdf 100644 --- a/src/main/java/minefantasy/mf2/util/XSTRandom.java +++ b/src/main/java/minefantasy/mf2/util/XSTRandom.java @@ -2,24 +2,24 @@ /** * A subclass of java.util.random that implements the Xorshift random number * generator - * + *

* - it is 30% faster than the generator from Java's library - it produces * random sequences of higher quality than java.util.Random - this class also * provides a clone() function - * + *

* Usage: XSRandom rand = new XSRandom(); //Instantiation x = rand.nextInt(); * //pull a random number - * + *

* To use the class in legacy code, you may also instantiate an XSRandom object * and assign it to a java.util.Random object: java.util.Random rand = new * XSRandom(); - * + *

* for an explanation of the algorithm, see * http://demesos.blogspot.com/2011/09/pseudo-random-number-generators.html * * @author Wilfried Elmenreich University of Klagenfurt/Lakeside Labs * http://www.elmenreich.tk - * + *

* This code is released under the GNU Lesser General Public License Version 3 * http://www.gnu.org/licenses/lgpl-3.0.txt */ @@ -37,15 +37,20 @@ public class XSTRandom extends Random { private static final long serialVersionUID = 6208727693524452904L; - private long seed; - private long last; private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53) - private static final float FLOAT_UNIT = 0x1.0p-24f; // 1.0f / (1 << 24) + private static final float FLOAT_UNIT = 0x1.0p-24f; // 1.0f / (1 << 24) + private static final AtomicLong seedUniquifier + = new AtomicLong(8682522807148012L); + boolean haveNextNextGaussian = false; /* MODIFIED BY: Robotia Modification: Implemented Random class seed generator */ + double nextNextGaussian = 0; + private long seed; + private long last; + /** * Creates a new pseudo random number generator. The seed is initialized to * the current time, as if by @@ -54,13 +59,21 @@ public class XSTRandom extends Random { public XSTRandom() { this(seedUniquifier() ^ System.nanoTime()); } - private static final AtomicLong seedUniquifier - = new AtomicLong(8682522807148012L); + + /** + * Creates a new pseudo random number generator, starting with the specified + * seed, using setSeed(seed);. + * + * @param seed the initial seed + */ + public XSTRandom(long seed) { + this.seed = seed; + } private static long seedUniquifier() { // L'Ecuyer, "Tables of Linear Congruential Generators of // Different Sizes and Good Lattice Structure", 1999 - for (;;) { + for (; ; ) { long current = seedUniquifier.get(); long next = current * 181783497276652981L; if (seedUniquifier.compareAndSet(current, next)) { @@ -69,22 +82,14 @@ private static long seedUniquifier() { } } - /** - * Creates a new pseudo random number generator, starting with the specified - * seed, using setSeed(seed);. - * - * @param seed the initial seed - */ - public XSTRandom(long seed) { - this.seed = seed; - } public boolean nextBoolean() { return next(1) != 0; } public double nextDouble() { - return (((long)(next(26)) << 27) + next(27)) * DOUBLE_UNIT; + return (((long) (next(26)) << 27) + next(27)) * DOUBLE_UNIT; } + /** * Returns the current state of the seed, can be used to clone the object * @@ -130,8 +135,7 @@ public int next(int nbits) { x &= ((1L << nbits) - 1); return (int) x; } - boolean haveNextNextGaussian = false; - double nextNextGaussian = 0; + synchronized public double nextGaussian() { // See Knuth, ACP, Section 3.4.1 Algorithm C. if (haveNextNextGaussian) { @@ -144,12 +148,13 @@ synchronized public double nextGaussian() { v2 = 2 * nextDouble() - 1; // between -1 and 1 s = v1 * v1 + v2 * v2; } while (s >= 1 || s == 0); - double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s)/s); + double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s) / s); nextNextGaussian = v2 * multiplier; haveNextNextGaussian = true; return v1 * multiplier; } } + /** * Returns a pseudorandom, uniformly distributed {@code int} value between 0 * (inclusive) and the specified value (exclusive), drawn from this random @@ -213,6 +218,7 @@ public int nextInt(int bound) { int out = (int) last % bound; return (out < 0) ? -out : out; } + public int nextInt() { return next(32); } @@ -223,14 +229,14 @@ public float nextFloat() { public long nextLong() { // it's okay that the bottom word remains signed. - return ((long)(next(32)) << 32) + next(32); + return ((long) (next(32)) << 32) + next(32); } public void nextBytes(byte[] bytes_arr) { for (int iba = 0, lenba = bytes_arr.length; iba < lenba; ) for (int rndba = nextInt(), - nba = Math.min(lenba - iba, Integer.SIZE/Byte.SIZE); + nba = Math.min(lenba - iba, Integer.SIZE / Byte.SIZE); nba-- > 0; rndba >>= Byte.SIZE) - bytes_arr[iba++] = (byte)rndba; + bytes_arr[iba++] = (byte) rndba; } } \ No newline at end of file diff --git a/src/main/java/mods/battlegear2/api/IAllowItem.java b/src/main/java/mods/battlegear2/api/IAllowItem.java index f83d73d8..8276a178 100644 --- a/src/main/java/mods/battlegear2/api/IAllowItem.java +++ b/src/main/java/mods/battlegear2/api/IAllowItem.java @@ -4,9 +4,9 @@ public interface IAllowItem { - /** - * Returns true if the mainhand {@link ItemStack} allows the offhand - * {@link ItemStack} to be placed in the partner offhand slot - */ - public boolean allowOffhand(ItemStack mainhand, ItemStack offhand); + /** + * Returns true if the mainhand {@link ItemStack} allows the offhand + * {@link ItemStack} to be placed in the partner offhand slot + */ + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand); } diff --git a/src/main/java/mods/battlegear2/api/IDefaultRender.java b/src/main/java/mods/battlegear2/api/IDefaultRender.java index 780f94d1..f48af459 100644 --- a/src/main/java/mods/battlegear2/api/IDefaultRender.java +++ b/src/main/java/mods/battlegear2/api/IDefaultRender.java @@ -8,33 +8,32 @@ * client-side only */ public interface IDefaultRender { - public enum RenderType { - Bow, FlagPole, Quiver, Shield, Spear, HeraldryCrest, // Work in progress, not recommended for use - HeraldryItem// Work in progress, not recommended for use - } + /** + * Called before anything else + * + * @return false to disable all features of this interface + */ + public boolean useDefaultRenderer(); - /** - * Called before anything else - * - * @return false to disable all features of this interface - */ - public boolean useDefaultRenderer(); + /** + * Called when registering the {@link IItemRenderer} for this item + * + * @return the type of renderer to use + */ + public RenderType getRenderer(); - /** - * Called when registering the {@link IItemRenderer} for this item - * - * @return the type of renderer to use - */ - public RenderType getRenderer(); + /** + * Called by Battlegear2 configuration GUI when the rendering option is toggled + * Use this to react, using another renderer when this one is disabled for + * example + * + * @param isEnabled the new rendering state: on true, the renderer is going to be + * used, on false, it is disabled + */ + public void setRenderState(boolean isEnabled); - /** - * Called by Battlegear2 configuration GUI when the rendering option is toggled - * Use this to react, using another renderer when this one is disabled for - * example - * - * @param isEnabled - * the new rendering state: on true, the renderer is going to be - * used, on false, it is disabled - */ - public void setRenderState(boolean isEnabled); + public enum RenderType { + Bow, FlagPole, Quiver, Shield, Spear, HeraldryCrest, // Work in progress, not recommended for use + HeraldryItem// Work in progress, not recommended for use + } } diff --git a/src/main/java/mods/battlegear2/api/IDyable.java b/src/main/java/mods/battlegear2/api/IDyable.java index 31fde056..a971baaf 100644 --- a/src/main/java/mods/battlegear2/api/IDyable.java +++ b/src/main/java/mods/battlegear2/api/IDyable.java @@ -5,23 +5,23 @@ //This is a tempory fix until we get the heraldry system up and running public interface IDyable { - /** - * Return whether the specified ItemStack has a color. - */ - public boolean hasColor(ItemStack par1ItemStack); + /** + * Return whether the specified ItemStack has a color. + */ + public boolean hasColor(ItemStack par1ItemStack); - /** - * Return the color for the specified ItemStack. - */ - public int getColor(ItemStack par1ItemStack); + /** + * Return the color for the specified ItemStack. + */ + public int getColor(ItemStack par1ItemStack); - public void setColor(ItemStack dyable, int rgb); + public void setColor(ItemStack dyable, int rgb); - /** - * Remove the color from the specified ItemStack. - */ - public void removeColor(ItemStack par1ItemStack); + /** + * Remove the color from the specified ItemStack. + */ + public void removeColor(ItemStack par1ItemStack); - public int getDefaultColor(ItemStack par1ItemStack); + public int getDefaultColor(ItemStack par1ItemStack); } diff --git a/src/main/java/mods/battlegear2/api/IEnchantable.java b/src/main/java/mods/battlegear2/api/IEnchantable.java index f3ba33e4..f63e0f82 100644 --- a/src/main/java/mods/battlegear2/api/IEnchantable.java +++ b/src/main/java/mods/battlegear2/api/IEnchantable.java @@ -5,13 +5,13 @@ public interface IEnchantable { - /** - * If a Battlegear {@link BaseEnchantment} can be applied to this item, given - * the {@link ItemStack} - * - * @param baseEnchantment - * @param stack - * @return - */ - public boolean isEnchantable(Enchantment baseEnchantment, ItemStack stack); + /** + * If a Battlegear {@link BaseEnchantment} can be applied to this item, given + * the {@link ItemStack} + * + * @param baseEnchantment + * @param stack + * @return + */ + public boolean isEnchantable(Enchantment baseEnchantment, ItemStack stack); } diff --git a/src/main/java/mods/battlegear2/api/IOffhandDual.java b/src/main/java/mods/battlegear2/api/IOffhandDual.java index 51773755..08ece8eb 100644 --- a/src/main/java/mods/battlegear2/api/IOffhandDual.java +++ b/src/main/java/mods/battlegear2/api/IOffhandDual.java @@ -5,67 +5,55 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; public interface IOffhandDual { - /** - * Returns true if the item can be dual wielded in the offhand slot - */ - public boolean isOffhandHandDual(ItemStack off); + /** + * Returns true if the item can be dual wielded in the offhand slot + */ + public boolean isOffhandHandDual(ItemStack off); - /** - * Perform any function when the item is held in the offhand and the user right - * clicks an entity. This is generally used to attack an entity with the offhand - * item. If this is the case the event should be canceled to prevent any default - * right clicking events (Eg Villager Trading) - * - * @param event - * the OffhandAttackEvent that was generated - * @param mainhandItem - * the ItemStack currently being held in the right hand - * @param offhandItem - * the ItemStack currently being held in the left hand - * @return true if the off hand swing animation should be performed - */ - public boolean offhandAttackEntity(PlayerEventChild.OffhandAttackEvent event, ItemStack mainhandItem, - ItemStack offhandItem); + /** + * Perform any function when the item is held in the offhand and the user right + * clicks an entity. This is generally used to attack an entity with the offhand + * item. If this is the case the event should be canceled to prevent any default + * right clicking events (Eg Villager Trading) + * + * @param event the OffhandAttackEvent that was generated + * @param mainhandItem the ItemStack currently being held in the right hand + * @param offhandItem the ItemStack currently being held in the left hand + * @return true if the off hand swing animation should be performed + */ + public boolean offhandAttackEntity(PlayerEventChild.OffhandAttackEvent event, ItemStack mainhandItem, + ItemStack offhandItem); - /** - * Perform any function when the item is held in the offhand and the user right - * clicks "Air". - * - * @param event - * the PlayerInteractEvent that was generated - * @param mainhandItem - * the ItemStack currently being held in the right hand - * @param offhandItem - * the ItemStack currently being held in the left hand - * @return true if the off hand swing animation should be performed - */ - public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem); + /** + * Perform any function when the item is held in the offhand and the user right + * clicks "Air". + * + * @param event the PlayerInteractEvent that was generated + * @param mainhandItem the ItemStack currently being held in the right hand + * @param offhandItem the ItemStack currently being held in the left hand + * @return true if the off hand swing animation should be performed + */ + public boolean offhandClickAir(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem); - /** - * Perform any function when the item is held in the offhand and the user right - * clicks a block. Note that this will happen prior to the activation of any - * activation functions of blocks - * - * @param event - * the PlayerInteractEvent that was generated - * @param mainhandItem - * the ItemStack currently being held in the right hand - * @param offhandItem - * the ItemStack currently being held in the left hand - * @return true if the off hand swing animation should be performed - */ - public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem); + /** + * Perform any function when the item is held in the offhand and the user right + * clicks a block. Note that this will happen prior to the activation of any + * activation functions of blocks + * + * @param event the PlayerInteractEvent that was generated + * @param mainhandItem the ItemStack currently being held in the right hand + * @param offhandItem the ItemStack currently being held in the left hand + * @return true if the off hand swing animation should be performed + */ + public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem); - /** - * Perform any passive effects on each game tick when the item is held in the - * offhand - * - * @param effectiveSide - * the effective side the method was called from - * @param mainhandItem - * the ItemStack currently being held in the right hand - * @param offhandItem - * the ItemStack currently being held in the left hand - */ - public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem); + /** + * Perform any passive effects on each game tick when the item is held in the + * offhand + * + * @param effectiveSide the effective side the method was called from + * @param mainhandItem the ItemStack currently being held in the right hand + * @param offhandItem the ItemStack currently being held in the left hand + */ + public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem); } diff --git a/src/main/java/mods/battlegear2/api/ISheathed.java b/src/main/java/mods/battlegear2/api/ISheathed.java index 174ee895..810f7b14 100644 --- a/src/main/java/mods/battlegear2/api/ISheathed.java +++ b/src/main/java/mods/battlegear2/api/ISheathed.java @@ -4,12 +4,11 @@ public interface ISheathed { - /** - * Returns true if the item should always be sheathed on the back, false if it - * should be sheathed on the hip - * - * @param item - * the {@link ItemStack} to be sheathed - */ - public boolean sheatheOnBack(ItemStack item); + /** + * Returns true if the item should always be sheathed on the back, false if it + * should be sheathed on the hip + * + * @param item the {@link ItemStack} to be sheathed + */ + public boolean sheatheOnBack(ItemStack item); } diff --git a/src/main/java/mods/battlegear2/api/PlayerEventChild.java b/src/main/java/mods/battlegear2/api/PlayerEventChild.java index fdadf7ea..52f74be2 100644 --- a/src/main/java/mods/battlegear2/api/PlayerEventChild.java +++ b/src/main/java/mods/battlegear2/api/PlayerEventChild.java @@ -16,223 +16,223 @@ public abstract class PlayerEventChild extends PlayerEvent { - /** - * The event that this event is a child of - */ - public final PlayerEvent parent; - - public PlayerEventChild(PlayerEvent parent) { - super(parent.entityPlayer); - this.parent = parent; - } - - public void setCancelParentEvent(boolean cancel) { - parent.setCanceled(cancel); - } - - @Override - public void setCanceled(boolean cancel) { - super.setCanceled(cancel); - parent.setCanceled(cancel); - } - - @Override - public void setResult(Result value) { - super.setResult(value); - parent.setResult(value); - } - - /** - * Event fired when a shield successfully blocks an attack (in @link - * LivingHurtEvent) - */ - public static class ShieldBlockEvent extends PlayerEventChild { - public final ItemStack shield; - public final DamageSource source; - public final float ammount; // use same name as other Forge events - /** - * If the {@link IShield#blockAnimation(EntityPlayer, float)} should be called - */ - public boolean performAnimation = true; - /** - * If the shield should be damaged based on the ammount and the result of - * {@link IShield#getDamageReduction(ItemStack, DamageSource)} - */ - public boolean damageShield = true; - - public ShieldBlockEvent(PlayerEvent parent, ItemStack shield, DamageSource source, float ammount) { - super(parent); - this.shield = shield; - this.source = source; - this.ammount = ammount; - } - } - - /** - * Called when a player right clicks in battlemode The parent event can be - * either {@link PlayerInteractEvent} or {@link EntityInteractEvent} if the - * OffhandAttackEvent allowed swinging Both ItemStack can be null If cancelled, - * no offhand swinging will be performed - */ - @Cancelable - public static class OffhandSwingEvent extends PlayerEventChild { - public final ItemStack mainHand; - public final ItemStack offHand; - - public OffhandSwingEvent(PlayerEvent parent, ItemStack mainHand, ItemStack offHand) { - super(parent); - this.mainHand = mainHand; - this.offHand = offHand; - } - } - - /** - * Called when a player right clicks an entity in battlemode Both ItemStack can - * be null Cancelling will prevent any further processing and prevails over the - * boolean fields - */ - @Cancelable - public static class OffhandAttackEvent extends PlayerEventChild { - - /** - * If we should call the OffhandSwingEvent and perform swinging - */ - public boolean swingOffhand = true; - /** - * If we should perform an attack on the entity with the offhand item - */ - public boolean shouldAttack = true; - /** - * If we should cancel the base entity interaction event - */ - public boolean cancelParent = true; - public final EntityInteractEvent event; - public final ItemStack mainHand; - public final ItemStack offHand; - - public OffhandAttackEvent(EntityInteractEvent parent, ItemStack mainHand, ItemStack offHand) { - super(parent); - this.event = parent; - this.mainHand = mainHand; - this.offHand = offHand; - } - - public Entity getTarget() { - return event.target; - } - } - - public static class QuiverArrowEvent extends PlayerEventChild { - /** - * The event from which this occurred - */ - protected final ArrowLooseEvent event; - - public QuiverArrowEvent(ArrowLooseEvent event) { - super(event); - this.event = event; - } - - /** - * @return the player using the bow - */ - public EntityPlayer getArcher() { - return event.entityPlayer; - } - - /** - * @return the bow trying to fire - */ - public ItemStack getBow() { - return event.bow; - } - - /** - * @return the amount of charge in the bow - */ - public float getCharge() { - return event.charge; - } - - /** - * Event fired after an arrow has been selected and taken from a - * {@link IArrowContainer2}, before it is actually spawned - */ - @Cancelable - public static class Firing extends QuiverArrowEvent { - /** - * Damage done to the bow after arrow is fired - */ - public int bowDamage = 1; - /** - * The volume of the sound emitted from the bow after arrow is fired - */ - public float bowSoundVolume = 1.0F; - /** - * Decides if standard enchantments can be added to the arrow - */ - public boolean addEnchantments = true; - /** - * Decides if critical state should be forced into the arrow - */ - public boolean isCritical = false; - /** - * The quiver from which the arrow was pulled from - */ - public final ItemStack quiver; - /** - * The arrow to be fired, can't be null - */ - public final EntityArrow arrow; - - public Firing(ArrowLooseEvent parent, ItemStack quiver, EntityArrow arrow) { - super(parent); - this.quiver = quiver; - this.arrow = arrow; - } - - } - - /** - * The DEFAULT result for this event is the vanilla charge calculated value Use - * setNewCharge to override the value with the one provided Change the event - * result to DENY to prevent further processing - */ - @HasResult - public static class ChargeCalculations extends QuiverArrowEvent { - /** - * Returned value if the result is set to allow - */ - protected float charge; - - public ChargeCalculations(ArrowLooseEvent event) { - super(event); - } - - @Override - public float getCharge() { - MinecraftForge.EVENT_BUS.post(this); - switch (this.getResult()) { - case ALLOW: - return charge; - case DENY: - return 0; - } - float f = super.getCharge() / 20.0F; - f = (f * f + f * 2.0F) / 3.0F; - if (f < 0.1D) { - return 0; - } - if (f > 1.0F) { - f = 1.0F; - } - return f; - } - - public void setNewCharge(float charge) { - this.setResult(Result.ALLOW); - this.charge = charge; - } - } - } + /** + * The event that this event is a child of + */ + public final PlayerEvent parent; + + public PlayerEventChild(PlayerEvent parent) { + super(parent.entityPlayer); + this.parent = parent; + } + + public void setCancelParentEvent(boolean cancel) { + parent.setCanceled(cancel); + } + + @Override + public void setCanceled(boolean cancel) { + super.setCanceled(cancel); + parent.setCanceled(cancel); + } + + @Override + public void setResult(Result value) { + super.setResult(value); + parent.setResult(value); + } + + /** + * Event fired when a shield successfully blocks an attack (in @link + * LivingHurtEvent) + */ + public static class ShieldBlockEvent extends PlayerEventChild { + public final ItemStack shield; + public final DamageSource source; + public final float ammount; // use same name as other Forge events + /** + * If the {@link IShield#blockAnimation(EntityPlayer, float)} should be called + */ + public boolean performAnimation = true; + /** + * If the shield should be damaged based on the ammount and the result of + * {@link IShield#getDamageReduction(ItemStack, DamageSource)} + */ + public boolean damageShield = true; + + public ShieldBlockEvent(PlayerEvent parent, ItemStack shield, DamageSource source, float ammount) { + super(parent); + this.shield = shield; + this.source = source; + this.ammount = ammount; + } + } + + /** + * Called when a player right clicks in battlemode The parent event can be + * either {@link PlayerInteractEvent} or {@link EntityInteractEvent} if the + * OffhandAttackEvent allowed swinging Both ItemStack can be null If cancelled, + * no offhand swinging will be performed + */ + @Cancelable + public static class OffhandSwingEvent extends PlayerEventChild { + public final ItemStack mainHand; + public final ItemStack offHand; + + public OffhandSwingEvent(PlayerEvent parent, ItemStack mainHand, ItemStack offHand) { + super(parent); + this.mainHand = mainHand; + this.offHand = offHand; + } + } + + /** + * Called when a player right clicks an entity in battlemode Both ItemStack can + * be null Cancelling will prevent any further processing and prevails over the + * boolean fields + */ + @Cancelable + public static class OffhandAttackEvent extends PlayerEventChild { + + public final EntityInteractEvent event; + public final ItemStack mainHand; + public final ItemStack offHand; + /** + * If we should call the OffhandSwingEvent and perform swinging + */ + public boolean swingOffhand = true; + /** + * If we should perform an attack on the entity with the offhand item + */ + public boolean shouldAttack = true; + /** + * If we should cancel the base entity interaction event + */ + public boolean cancelParent = true; + + public OffhandAttackEvent(EntityInteractEvent parent, ItemStack mainHand, ItemStack offHand) { + super(parent); + this.event = parent; + this.mainHand = mainHand; + this.offHand = offHand; + } + + public Entity getTarget() { + return event.target; + } + } + + public static class QuiverArrowEvent extends PlayerEventChild { + /** + * The event from which this occurred + */ + protected final ArrowLooseEvent event; + + public QuiverArrowEvent(ArrowLooseEvent event) { + super(event); + this.event = event; + } + + /** + * @return the player using the bow + */ + public EntityPlayer getArcher() { + return event.entityPlayer; + } + + /** + * @return the bow trying to fire + */ + public ItemStack getBow() { + return event.bow; + } + + /** + * @return the amount of charge in the bow + */ + public float getCharge() { + return event.charge; + } + + /** + * Event fired after an arrow has been selected and taken from a + * {@link IArrowContainer2}, before it is actually spawned + */ + @Cancelable + public static class Firing extends QuiverArrowEvent { + /** + * The quiver from which the arrow was pulled from + */ + public final ItemStack quiver; + /** + * The arrow to be fired, can't be null + */ + public final EntityArrow arrow; + /** + * Damage done to the bow after arrow is fired + */ + public int bowDamage = 1; + /** + * The volume of the sound emitted from the bow after arrow is fired + */ + public float bowSoundVolume = 1.0F; + /** + * Decides if standard enchantments can be added to the arrow + */ + public boolean addEnchantments = true; + /** + * Decides if critical state should be forced into the arrow + */ + public boolean isCritical = false; + + public Firing(ArrowLooseEvent parent, ItemStack quiver, EntityArrow arrow) { + super(parent); + this.quiver = quiver; + this.arrow = arrow; + } + + } + + /** + * The DEFAULT result for this event is the vanilla charge calculated value Use + * setNewCharge to override the value with the one provided Change the event + * result to DENY to prevent further processing + */ + @HasResult + public static class ChargeCalculations extends QuiverArrowEvent { + /** + * Returned value if the result is set to allow + */ + protected float charge; + + public ChargeCalculations(ArrowLooseEvent event) { + super(event); + } + + @Override + public float getCharge() { + MinecraftForge.EVENT_BUS.post(this); + switch (this.getResult()) { + case ALLOW: + return charge; + case DENY: + return 0; + } + float f = super.getCharge() / 20.0F; + f = (f * f + f * 2.0F) / 3.0F; + if (f < 0.1D) { + return 0; + } + if (f > 1.0F) { + f = 1.0F; + } + return f; + } + + public void setNewCharge(float charge) { + this.setResult(Result.ALLOW); + this.charge = charge; + } + } + } } diff --git a/src/main/java/mods/battlegear2/api/RenderItemBarEvent.java b/src/main/java/mods/battlegear2/api/RenderItemBarEvent.java index 5ca84ac0..3a07c0eb 100644 --- a/src/main/java/mods/battlegear2/api/RenderItemBarEvent.java +++ b/src/main/java/mods/battlegear2/api/RenderItemBarEvent.java @@ -13,74 +13,74 @@ * helping display HUD elements added to the in-game screen */ public abstract class RenderItemBarEvent extends RenderGameOverlayEvent { - /** - * Horizontal offset from the default position - */ - public int xOffset = 0; - /** - * Vertical offset from the default position - */ - public int yOffset = 0; + /** + * Horizontal offset from the default position + */ + public int xOffset = 0; + /** + * Vertical offset from the default position + */ + public int yOffset = 0; - public RenderItemBarEvent(RenderGameOverlayEvent parent) { - super(parent.partialTicks, parent.resolution, parent.mouseX, parent.mouseY); - } + public RenderItemBarEvent(RenderGameOverlayEvent parent) { + super(parent.partialTicks, parent.resolution, parent.mouseX, parent.mouseY); + } - /** - * Event posted when the player uses the shield in the offhand, display a sort - * of "stamina bar" - */ - @Cancelable - public static class ShieldBar extends RenderItemBarEvent { - /** - * The stack containing the {@link IShield} item held by the player in his - * offhand - */ - public final ItemStack shield; + /** + * Event posted when the player uses the shield in the offhand, display a sort + * of "stamina bar" + */ + @Cancelable + public static class ShieldBar extends RenderItemBarEvent { + /** + * The stack containing the {@link IShield} item held by the player in his + * offhand + */ + public final ItemStack shield; - public ShieldBar(RenderGameOverlayEvent parent, ItemStack item) { - super(parent); - this.shield = item; - } - } + public ShieldBar(RenderGameOverlayEvent parent, ItemStack item) { + super(parent); + this.shield = item; + } + } - /** - * Event posted when the player uses an item compatible with - * {@link QuiverArrowRegistry} that is, a bow and its valid - * {@link IArrowContainer2}, displaying all slots in it - */ - @Cancelable - public static class QuiverSlots extends RenderItemBarEvent { - /** - * The stack containing the compatible bow held by the player in his mainhand - */ - public final ItemStack mainhand; - /** - * The stack containing the valid {@link IArrowContainer2} item - */ - public final ItemStack quiver; + /** + * Event posted when the player uses an item compatible with + * {@link QuiverArrowRegistry} that is, a bow and its valid + * {@link IArrowContainer2}, displaying all slots in it + */ + @Cancelable + public static class QuiverSlots extends RenderItemBarEvent { + /** + * The stack containing the compatible bow held by the player in his mainhand + */ + public final ItemStack mainhand; + /** + * The stack containing the valid {@link IArrowContainer2} item + */ + public final ItemStack quiver; - public QuiverSlots(RenderGameOverlayEvent parent, ItemStack mainhand, ItemStack item) { - super(parent); - this.mainhand = mainhand; - this.quiver = item; - } - } + public QuiverSlots(RenderGameOverlayEvent parent, ItemStack mainhand, ItemStack item) { + super(parent); + this.mainhand = mainhand; + this.quiver = item; + } + } - /** - * Event corresponding to the display of each additional hand slots - */ - @Cancelable - public static class BattleSlots extends RenderItemBarEvent { - /** - * True if the slots are for the mainhand (on the "right"), false for the - * offhand (on the "left") - */ - public final boolean isMainHand; + /** + * Event corresponding to the display of each additional hand slots + */ + @Cancelable + public static class BattleSlots extends RenderItemBarEvent { + /** + * True if the slots are for the mainhand (on the "right"), false for the + * offhand (on the "left") + */ + public final boolean isMainHand; - public BattleSlots(RenderGameOverlayEvent parent, boolean isMainHand) { - super(parent); - this.isMainHand = isMainHand; - } - } + public BattleSlots(RenderGameOverlayEvent parent, boolean isMainHand) { + super(parent); + this.isMainHand = isMainHand; + } + } } diff --git a/src/main/java/mods/battlegear2/api/core/IBattlePlayer.java b/src/main/java/mods/battlegear2/api/core/IBattlePlayer.java index 1e4843a8..9ed44eca 100644 --- a/src/main/java/mods/battlegear2/api/core/IBattlePlayer.java +++ b/src/main/java/mods/battlegear2/api/core/IBattlePlayer.java @@ -5,24 +5,24 @@ /** * Interface added to {@link EntityPlayer} to support offhand management - * + * * @author GotoLink */ public interface IBattlePlayer { - public void swingOffItem(); + public void swingOffItem(); - public float getOffSwingProgress(float frame); + public float getOffSwingProgress(float frame); - public void attackTargetEntityWithCurrentOffItem(Entity target); + public void attackTargetEntityWithCurrentOffItem(Entity target); - public boolean isBattlemode(); + public boolean isBattlemode(); - public boolean isBlockingWithShield(); + public boolean isBlockingWithShield(); - public void setBlockingWithShield(boolean block); + public void setBlockingWithShield(boolean block); - public int getSpecialActionTimer(); + public int getSpecialActionTimer(); - public void setSpecialActionTimer(int time); + public void setSpecialActionTimer(int time); } \ No newline at end of file diff --git a/src/main/java/mods/battlegear2/api/core/IOffhandRender.java b/src/main/java/mods/battlegear2/api/core/IOffhandRender.java index cad2aba7..bb1954a2 100644 --- a/src/main/java/mods/battlegear2/api/core/IOffhandRender.java +++ b/src/main/java/mods/battlegear2/api/core/IOffhandRender.java @@ -7,25 +7,25 @@ * Interface added to {@link ItemRenderer} to support offhand rendering Note * that, they only provide access to added fields for the offhand, NOT the * fields for the mainhand - * + * * @author GotoLink */ public interface IOffhandRender { - public ItemStack getItemToRender(); + public ItemStack getItemToRender(); - public void setItemToRender(ItemStack item); + public void setItemToRender(ItemStack item); - public int getEquippedItemSlot(); + public int getEquippedItemSlot(); - public void setEquippedItemSlot(int slot); + public void setEquippedItemSlot(int slot); - public float getEquippedProgress(); + public float getEquippedProgress(); - public void setEquippedProgress(float progress); + public void setEquippedProgress(float progress); - public float getPrevEquippedProgress(); + public float getPrevEquippedProgress(); - public void setPrevEquippedProgress(float progress); + public void setPrevEquippedProgress(float progress); } diff --git a/src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java b/src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java index 5cb919bd..9713016e 100644 --- a/src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java +++ b/src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java @@ -16,355 +16,352 @@ */ public class InventoryPlayerBattle extends InventoryPlayer { - public boolean hasChanged = true; - public static int ARMOR_OFFSET = 100; - public static int OFFSET = 150; - public static int WEAPON_SETS = 3; - - public static int EXTRA_ITEMS = WEAPON_SETS * 2; - public static int EXTRA_INV_SIZE = EXTRA_ITEMS + 6 + 6; - - public ItemStack[] extraItems; - - public InventoryPlayerBattle(EntityPlayer entityPlayer) { - super(entityPlayer); - extraItems = new ItemStack[EXTRA_INV_SIZE]; - } - - public boolean isBattlemode() { - return this.currentItem >= OFFSET && this.currentItem < OFFSET + EXTRA_ITEMS; - } - - /** - * Returns a new slot index according to the type - * - * @param type - * determines which inventory array to expand - * @return the new slot index, or Integer.MIN_VALUE if it is not possible to - * expand further - */ - public int requestNewSlot(InventorySlotType type) { - ItemStack[] temp; - switch (type) { - case MAIN: - if (mainInventory.length + 1 < ARMOR_OFFSET) { - temp = new ItemStack[mainInventory.length + 1]; - System.arraycopy(mainInventory, 0, temp, 0, mainInventory.length); - mainInventory = temp; - return mainInventory.length;// Between 36 and 99 - } - break; - case ARMOR: - if (ARMOR_OFFSET + armorInventory.length + 1 < OFFSET) { - temp = new ItemStack[armorInventory.length + 1]; - System.arraycopy(armorInventory, 0, temp, 0, armorInventory.length); - armorInventory = temp; - return armorInventory.length;// Between 4 and 49 - } - break; - case BATTLE: - temp = new ItemStack[extraItems.length + 1]; - System.arraycopy(extraItems, 0, temp, 0, extraItems.length); - extraItems = temp; - return extraItems.length + OFFSET; - } - return Integer.MIN_VALUE;// Impossible because of byte cast in inventory NBT - } - - public static boolean isValidSwitch(int id) { - return (id >= 0 && id < getHotbarSize()) || (id >= OFFSET && id < OFFSET + EXTRA_ITEMS); - } - - /** - * Returns a slot index in main inventory containing a specific itemID - */ - private int getInventorySlotContainItem(Item par1) { - for (int j = 0; j < this.extraItems.length; ++j) { - if (this.extraItems[j] != null && this.extraItems[j].getItem() == par1) { - return j; - } - } - return -1; - } - - @SideOnly(Side.CLIENT) - private int getInventorySlotContainItemAndDamage(Item par1, int par2) { - for (int k = 0; k < this.extraItems.length; ++k) { - if (this.extraItems[k] != null && this.extraItems[k].getItem() == par1 - && this.extraItems[k].getItemDamage() == par2) { - return k; - } - } - return -1; - } - - @Override - public ItemStack getCurrentItem() { - return isBattlemode() ? extraItems[currentItem - OFFSET] : super.getCurrentItem(); - } - - @Override - @SideOnly(Side.CLIENT) - public void func_146030_a(Item par1, int par2, boolean par3, boolean par4) { - if (!isBattlemode()) - super.func_146030_a(par1, par2, par3, par4); - } - - @Override - @SideOnly(Side.CLIENT) - public void changeCurrentItem(int direction) { - hasChanged = true; - - if (isBattlemode()) { - - if (direction > 0) { - direction = 1; - } else if (direction != 0) { - direction = -1; - } - - // noinspection StatementWithEmptyBody - for (currentItem -= direction; currentItem < OFFSET; currentItem += WEAPON_SETS) { - } - - while (currentItem >= OFFSET + WEAPON_SETS) { - currentItem -= WEAPON_SETS; - } - - } else { - super.changeCurrentItem(direction); - } - } - - @Override - public int clearInventory(Item targetId, int targetDamage) { - hasChanged = true; - - int stacks = super.clearInventory(targetId, targetDamage); - - for (int i = 0; i < extraItems.length; i++) { - if (extraItems[i] != null && (targetId == null || extraItems[i].getItem() == targetId) - && (targetDamage <= -1 || extraItems[i].getItemDamage() == targetDamage)) { - - stacks += extraItems[i].stackSize; - extraItems[i] = null; - } - } - - return stacks; - } - - /** - * Decrement the number of animations remaining. Only called on client side. - * This is used to handle the animation of receiving a block. - */ - @Override - public void decrementAnimations() { - super.decrementAnimations(); - for (int i = 0; i < this.extraItems.length; ++i) { - if (this.extraItems[i] != null) { - this.extraItems[i].updateAnimation(this.player.worldObj, this.player, i, - this.currentItem + OFFSET == i); - } - } - } - - /** - * removed one item of specified itemID from inventory (if it is in a stack, the - * stack size will reduce with 1) - */ - @Override - public boolean consumeInventoryItem(Item par1) { - int j = this.getInventorySlotContainItem(par1); - - if (j < 0) { - return super.consumeInventoryItem(par1); - } else { - hasChanged = true; - if (--this.extraItems[j].stackSize <= 0) { - this.extraItems[j] = null; - } - - return true; - } - } - - /** - * Get if a specifiied item id is inside the inventory. - */ - @Override - public boolean hasItem(Item par1) { - if (super.hasItem(par1)) { - return true; - } else { - int j = this.getInventorySlotContainItem(par1); - return j >= 0; - } - } - - /** - * Adds the item stack to the inventory, returns false if it is impossible. - */ - @Override - public boolean addItemStackToInventory(ItemStack par1ItemStack) { - return super.addItemStackToInventory(par1ItemStack); - } - - @Override - public ItemStack decrStackSize(int slot, int amount) { - hasChanged = true; - if (slot >= OFFSET) { - ItemStack targetStack = extraItems[slot - OFFSET]; - - if (targetStack != null) { - - if (targetStack.stackSize <= amount) { - - extraItems[slot - OFFSET] = null; - return targetStack; - - } else { - - targetStack = extraItems[slot - OFFSET].splitStack(amount); - - if (extraItems[slot - OFFSET].stackSize == 0) { - extraItems[slot - OFFSET] = null; - } - - return targetStack; - } - } - - return null; - - } else { - return super.decrStackSize(slot, amount); - } - } - - @Override - public ItemStack getStackInSlotOnClosing(int slot) { - if (slot >= OFFSET) { - return extraItems[slot - OFFSET]; - } else { - return super.getStackInSlotOnClosing(slot); - } - } - - @Override - public void setInventorySlotContents(int slot, ItemStack itemStack) { - setInventorySlotContents(slot, itemStack, true); - } - - public void setInventorySlotContents(int slot, ItemStack itemStack, boolean changed) { - hasChanged = changed; - if (slot >= OFFSET) { - extraItems[slot - OFFSET] = itemStack; - } else { - super.setInventorySlotContents(slot, itemStack); - } - } - - @Override - public float func_146023_a(Block block) { - if (isBattlemode()) { - ItemStack currentItemStack = getCurrentItem(); - return currentItemStack != null ? currentItemStack.func_150997_a(block) : 1.0F; - - } else { - return super.func_146023_a(block); - } - } - - @Override - public NBTTagList writeToNBT(NBTTagList par1nbtTagList) { - NBTTagList nbtList = super.writeToNBT(par1nbtTagList); - NBTTagCompound nbttagcompound; - - for (int i = 0; i < extraItems.length; ++i) { - if (extraItems[i] != null) { - nbttagcompound = new NBTTagCompound(); - // This will be -ve, but meh still works - nbttagcompound.setByte("Slot", (byte) (i + OFFSET)); - this.extraItems[i].writeToNBT(nbttagcompound); - nbtList.appendTag(nbttagcompound); - } - } - return nbtList; - } - - @Override - public void readFromNBT(NBTTagList nbtTagList) { - this.mainInventory = new ItemStack[mainInventory.length]; - this.armorInventory = new ItemStack[armorInventory.length]; - this.extraItems = new ItemStack[extraItems.length]; - - for (int i = 0; i < nbtTagList.tagCount(); ++i) { - NBTTagCompound nbttagcompound = nbtTagList.getCompoundTagAt(i); - int j = nbttagcompound.getByte("Slot") & 255; - ItemStack itemstack = ItemStack.loadItemStackFromNBT(nbttagcompound); - - if (itemstack != null) { - if (j >= 0 && j < this.mainInventory.length) { - this.mainInventory[j] = itemstack; - } - if (j >= ARMOR_OFFSET && j - ARMOR_OFFSET < this.armorInventory.length) { - this.armorInventory[j - ARMOR_OFFSET] = itemstack; - } - if (j >= OFFSET && j - OFFSET < this.extraItems.length) { - this.extraItems[j - OFFSET] = itemstack; - } - } - } - } - - @Override - public ItemStack getStackInSlot(int slot) { - if (slot >= OFFSET) { - return extraItems[slot - OFFSET]; - } else { - return super.getStackInSlot(slot); - } - } - - @Override - public int getSizeInventory() { - return this.mainInventory.length + this.armorInventory.length; - } - - @Override - public void dropAllItems() { - super.dropAllItems(); - for (int i = 0; i < this.extraItems.length; ++i) { - if (this.extraItems[i] != null) { - this.player.func_146097_a(this.extraItems[i], true, false); - this.extraItems[i] = null; - } - } - } - - @Override - public void markDirty() { - super.markDirty(); - hasChanged = true; - } - - @Override - public void copyInventory(InventoryPlayer par1InventoryPlayer) { - hasChanged = true; - super.copyInventory(par1InventoryPlayer); - if (par1InventoryPlayer instanceof InventoryPlayerBattle) { - for (int i = 0; i < extraItems.length; i++) { - this.extraItems[i] = par1InventoryPlayer.getStackInSlot(i + OFFSET); - } - } - } - - public ItemStack getCurrentOffhandWeapon() { - if (isBattlemode()) { - return getStackInSlot(currentItem + WEAPON_SETS); - } else { - return null; - } - } + public static int ARMOR_OFFSET = 100; + public static int OFFSET = 150; + public static int WEAPON_SETS = 3; + public static int EXTRA_ITEMS = WEAPON_SETS * 2; + public static int EXTRA_INV_SIZE = EXTRA_ITEMS + 6 + 6; + public boolean hasChanged = true; + public ItemStack[] extraItems; + + public InventoryPlayerBattle(EntityPlayer entityPlayer) { + super(entityPlayer); + extraItems = new ItemStack[EXTRA_INV_SIZE]; + } + + public static boolean isValidSwitch(int id) { + return (id >= 0 && id < getHotbarSize()) || (id >= OFFSET && id < OFFSET + EXTRA_ITEMS); + } + + public boolean isBattlemode() { + return this.currentItem >= OFFSET && this.currentItem < OFFSET + EXTRA_ITEMS; + } + + /** + * Returns a new slot index according to the type + * + * @param type determines which inventory array to expand + * @return the new slot index, or Integer.MIN_VALUE if it is not possible to + * expand further + */ + public int requestNewSlot(InventorySlotType type) { + ItemStack[] temp; + switch (type) { + case MAIN: + if (mainInventory.length + 1 < ARMOR_OFFSET) { + temp = new ItemStack[mainInventory.length + 1]; + System.arraycopy(mainInventory, 0, temp, 0, mainInventory.length); + mainInventory = temp; + return mainInventory.length;// Between 36 and 99 + } + break; + case ARMOR: + if (ARMOR_OFFSET + armorInventory.length + 1 < OFFSET) { + temp = new ItemStack[armorInventory.length + 1]; + System.arraycopy(armorInventory, 0, temp, 0, armorInventory.length); + armorInventory = temp; + return armorInventory.length;// Between 4 and 49 + } + break; + case BATTLE: + temp = new ItemStack[extraItems.length + 1]; + System.arraycopy(extraItems, 0, temp, 0, extraItems.length); + extraItems = temp; + return extraItems.length + OFFSET; + } + return Integer.MIN_VALUE;// Impossible because of byte cast in inventory NBT + } + + /** + * Returns a slot index in main inventory containing a specific itemID + */ + private int getInventorySlotContainItem(Item par1) { + for (int j = 0; j < this.extraItems.length; ++j) { + if (this.extraItems[j] != null && this.extraItems[j].getItem() == par1) { + return j; + } + } + return -1; + } + + @SideOnly(Side.CLIENT) + private int getInventorySlotContainItemAndDamage(Item par1, int par2) { + for (int k = 0; k < this.extraItems.length; ++k) { + if (this.extraItems[k] != null && this.extraItems[k].getItem() == par1 + && this.extraItems[k].getItemDamage() == par2) { + return k; + } + } + return -1; + } + + @Override + public ItemStack getCurrentItem() { + return isBattlemode() ? extraItems[currentItem - OFFSET] : super.getCurrentItem(); + } + + @Override + @SideOnly(Side.CLIENT) + public void func_146030_a(Item par1, int par2, boolean par3, boolean par4) { + if (!isBattlemode()) + super.func_146030_a(par1, par2, par3, par4); + } + + @Override + @SideOnly(Side.CLIENT) + public void changeCurrentItem(int direction) { + hasChanged = true; + + if (isBattlemode()) { + + if (direction > 0) { + direction = 1; + } else if (direction != 0) { + direction = -1; + } + + // noinspection StatementWithEmptyBody + for (currentItem -= direction; currentItem < OFFSET; currentItem += WEAPON_SETS) { + } + + while (currentItem >= OFFSET + WEAPON_SETS) { + currentItem -= WEAPON_SETS; + } + + } else { + super.changeCurrentItem(direction); + } + } + + @Override + public int clearInventory(Item targetId, int targetDamage) { + hasChanged = true; + + int stacks = super.clearInventory(targetId, targetDamage); + + for (int i = 0; i < extraItems.length; i++) { + if (extraItems[i] != null && (targetId == null || extraItems[i].getItem() == targetId) + && (targetDamage <= -1 || extraItems[i].getItemDamage() == targetDamage)) { + + stacks += extraItems[i].stackSize; + extraItems[i] = null; + } + } + + return stacks; + } + + /** + * Decrement the number of animations remaining. Only called on client side. + * This is used to handle the animation of receiving a block. + */ + @Override + public void decrementAnimations() { + super.decrementAnimations(); + for (int i = 0; i < this.extraItems.length; ++i) { + if (this.extraItems[i] != null) { + this.extraItems[i].updateAnimation(this.player.worldObj, this.player, i, + this.currentItem + OFFSET == i); + } + } + } + + /** + * removed one item of specified itemID from inventory (if it is in a stack, the + * stack size will reduce with 1) + */ + @Override + public boolean consumeInventoryItem(Item par1) { + int j = this.getInventorySlotContainItem(par1); + + if (j < 0) { + return super.consumeInventoryItem(par1); + } else { + hasChanged = true; + if (--this.extraItems[j].stackSize <= 0) { + this.extraItems[j] = null; + } + + return true; + } + } + + /** + * Get if a specifiied item id is inside the inventory. + */ + @Override + public boolean hasItem(Item par1) { + if (super.hasItem(par1)) { + return true; + } else { + int j = this.getInventorySlotContainItem(par1); + return j >= 0; + } + } + + /** + * Adds the item stack to the inventory, returns false if it is impossible. + */ + @Override + public boolean addItemStackToInventory(ItemStack par1ItemStack) { + return super.addItemStackToInventory(par1ItemStack); + } + + @Override + public ItemStack decrStackSize(int slot, int amount) { + hasChanged = true; + if (slot >= OFFSET) { + ItemStack targetStack = extraItems[slot - OFFSET]; + + if (targetStack != null) { + + if (targetStack.stackSize <= amount) { + + extraItems[slot - OFFSET] = null; + return targetStack; + + } else { + + targetStack = extraItems[slot - OFFSET].splitStack(amount); + + if (extraItems[slot - OFFSET].stackSize == 0) { + extraItems[slot - OFFSET] = null; + } + + return targetStack; + } + } + + return null; + + } else { + return super.decrStackSize(slot, amount); + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + if (slot >= OFFSET) { + return extraItems[slot - OFFSET]; + } else { + return super.getStackInSlotOnClosing(slot); + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) { + setInventorySlotContents(slot, itemStack, true); + } + + public void setInventorySlotContents(int slot, ItemStack itemStack, boolean changed) { + hasChanged = changed; + if (slot >= OFFSET) { + extraItems[slot - OFFSET] = itemStack; + } else { + super.setInventorySlotContents(slot, itemStack); + } + } + + @Override + public float func_146023_a(Block block) { + if (isBattlemode()) { + ItemStack currentItemStack = getCurrentItem(); + return currentItemStack != null ? currentItemStack.func_150997_a(block) : 1.0F; + + } else { + return super.func_146023_a(block); + } + } + + @Override + public NBTTagList writeToNBT(NBTTagList par1nbtTagList) { + NBTTagList nbtList = super.writeToNBT(par1nbtTagList); + NBTTagCompound nbttagcompound; + + for (int i = 0; i < extraItems.length; ++i) { + if (extraItems[i] != null) { + nbttagcompound = new NBTTagCompound(); + // This will be -ve, but meh still works + nbttagcompound.setByte("Slot", (byte) (i + OFFSET)); + this.extraItems[i].writeToNBT(nbttagcompound); + nbtList.appendTag(nbttagcompound); + } + } + return nbtList; + } + + @Override + public void readFromNBT(NBTTagList nbtTagList) { + this.mainInventory = new ItemStack[mainInventory.length]; + this.armorInventory = new ItemStack[armorInventory.length]; + this.extraItems = new ItemStack[extraItems.length]; + + for (int i = 0; i < nbtTagList.tagCount(); ++i) { + NBTTagCompound nbttagcompound = nbtTagList.getCompoundTagAt(i); + int j = nbttagcompound.getByte("Slot") & 255; + ItemStack itemstack = ItemStack.loadItemStackFromNBT(nbttagcompound); + + if (itemstack != null) { + if (j >= 0 && j < this.mainInventory.length) { + this.mainInventory[j] = itemstack; + } + if (j >= ARMOR_OFFSET && j - ARMOR_OFFSET < this.armorInventory.length) { + this.armorInventory[j - ARMOR_OFFSET] = itemstack; + } + if (j >= OFFSET && j - OFFSET < this.extraItems.length) { + this.extraItems[j - OFFSET] = itemstack; + } + } + } + } + + @Override + public ItemStack getStackInSlot(int slot) { + if (slot >= OFFSET) { + return extraItems[slot - OFFSET]; + } else { + return super.getStackInSlot(slot); + } + } + + @Override + public int getSizeInventory() { + return this.mainInventory.length + this.armorInventory.length; + } + + @Override + public void dropAllItems() { + super.dropAllItems(); + for (int i = 0; i < this.extraItems.length; ++i) { + if (this.extraItems[i] != null) { + this.player.func_146097_a(this.extraItems[i], true, false); + this.extraItems[i] = null; + } + } + } + + @Override + public void markDirty() { + super.markDirty(); + hasChanged = true; + } + + @Override + public void copyInventory(InventoryPlayer par1InventoryPlayer) { + hasChanged = true; + super.copyInventory(par1InventoryPlayer); + if (par1InventoryPlayer instanceof InventoryPlayerBattle) { + for (int i = 0; i < extraItems.length; i++) { + this.extraItems[i] = par1InventoryPlayer.getStackInSlot(i + OFFSET); + } + } + } + + public ItemStack getCurrentOffhandWeapon() { + if (isBattlemode()) { + return getStackInSlot(currentItem + WEAPON_SETS); + } else { + return null; + } + } } diff --git a/src/main/java/mods/battlegear2/api/core/InventorySlotType.java b/src/main/java/mods/battlegear2/api/core/InventorySlotType.java index 3f977bf8..1109ed0d 100644 --- a/src/main/java/mods/battlegear2/api/core/InventorySlotType.java +++ b/src/main/java/mods/battlegear2/api/core/InventorySlotType.java @@ -4,16 +4,16 @@ * Created by GotoLink on 24/04/2014. */ public enum InventorySlotType { - /** - * The main inventory space - */ - MAIN, - /** - * The armor inventory space - */ - ARMOR, - /** - * The inventory space added by battlegear - */ - BATTLE + /** + * The main inventory space + */ + MAIN, + /** + * The armor inventory space + */ + ARMOR, + /** + * The inventory space added by battlegear + */ + BATTLE } diff --git a/src/main/java/mods/battlegear2/api/heraldry/Crest.java b/src/main/java/mods/battlegear2/api/heraldry/Crest.java index 21d62843..8d2d7032 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/Crest.java +++ b/src/main/java/mods/battlegear2/api/heraldry/Crest.java @@ -1,88 +1,84 @@ package mods.battlegear2.api.heraldry; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; +import java.io.*; public class Crest { - public static int dataSize = 4 + 4 + 2 + 1 + 1 + 1; - private short imageIndex; - private int[] crestColours; - private byte size; - private byte x; - private byte y; - private byte[] byteArray; + public static int dataSize = 4 + 4 + 2 + 1 + 1 + 1; + private short imageIndex; + private int[] crestColours; + private byte size; + private byte x; + private byte y; + private byte[] byteArray; - public Crest(int[] crestColours, int imageIndex, byte size, byte x, byte y) { - this.crestColours = crestColours; - this.imageIndex = (short) imageIndex; - this.size = size; - this.x = x; - this.y = y; - } + public Crest(int[] crestColours, int imageIndex, byte size, byte x, byte y) { + this.crestColours = crestColours; + this.imageIndex = (short) imageIndex; + this.size = size; + this.x = x; + this.y = y; + } - public Crest(byte[] crestData) { - DataInputStream input = null; + public Crest(byte[] crestData) { + DataInputStream input = null; - try { - input = new DataInputStream(new ByteArrayInputStream(crestData)); + try { + input = new DataInputStream(new ByteArrayInputStream(crestData)); - crestColours = new int[] { input.readInt(), input.readInt() }; - imageIndex = input.readShort(); - size = input.readByte(); - x = input.readByte(); - y = input.readByte(); + crestColours = new int[]{input.readInt(), input.readInt()}; + imageIndex = input.readShort(); + size = input.readByte(); + x = input.readByte(); + y = input.readByte(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (input != null) { - input.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (input != null) { + input.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } - public byte[] getByteArray() { - if (byteArray != null) { - return byteArray; - } else { - DataOutputStream output = null; + public byte[] getByteArray() { + if (byteArray != null) { + return byteArray; + } else { + DataOutputStream output = null; - try { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - output = new DataOutputStream(bos); + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + output = new DataOutputStream(bos); - output.writeInt(crestColours[0]); - output.writeInt(crestColours[1]); + output.writeInt(crestColours[0]); + output.writeInt(crestColours[1]); - output.writeShort(imageIndex); - output.writeInt(size); - output.writeByte(x); - output.writeByte(y); + output.writeShort(imageIndex); + output.writeInt(size); + output.writeByte(x); + output.writeByte(y); - byteArray = bos.toByteArray(); + byteArray = bos.toByteArray(); - return byteArray; - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (output != null) { - output.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } + return byteArray; + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (output != null) { + output.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } - return null; - } - } + return null; + } + } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java index b22d6d56..359edcf9 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java +++ b/src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java @@ -1,164 +1,157 @@ package mods.battlegear2.api.heraldry; -import java.awt.Color; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; +import java.awt.*; +import java.io.*; import java.util.ArrayList; import java.util.List; public class HeraldryData { - public static final int RED = 1; - public static final int GREEN = 2; - public static final int BLUE = 3; - public static final int MAX_CRESTS = 6; - - private int storageIndex; - private byte pattern; - private int[] patternColours; - private byte[] extraData; - - private static final int extraDataSize = 6; - public static final HeraldryData defaultData = new HeraldryData(0, (byte) 0, Color.YELLOW.getRGB(), - Color.BLUE.getRGB(), Color.BLACK.getRGB(), new ArrayList(), new byte[extraDataSize]); - - private byte[] byteArray = null; - private List crests; - - public HeraldryData(int patternStoreIndex, byte pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3, - List crests, byte[] extraData) { - this.storageIndex = patternStoreIndex; - this.pattern = pattern; - this.patternColours = new int[] { pattern_col_1, pattern_col_2, pattern_col_3 }; - this.crests = crests; - this.extraData = extraData; - } - - public HeraldryData(byte[] crestData) { - DataInputStream input = null; - - try { - input = new DataInputStream(new ByteArrayInputStream(crestData)); - - storageIndex = input.readInt(); - pattern = input.readByte(); - patternColours = new int[] { input.readInt(), input.readInt(), input.readInt() }; - byte crestCount = input.readByte(); - crests = new ArrayList(crestCount); - for (int i = 0; i < crestCount; i++) { - byte[] bytes = new byte[Crest.dataSize]; - input.read(bytes); - crests.add(new Crest(bytes)); - } - extraData = new byte[extraDataSize]; - for (int i = 0; i < extraDataSize; i++) { - extraData[i] = input.readByte(); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (input != null) { - input.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static HeraldryData getDefault() { - return defaultData; - } - - public byte[] getByteArray() { - if (byteArray != null) { - return byteArray; - } else { - DataOutputStream output = null; - - try { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - output = new DataOutputStream(bos); - - output.writeInt(storageIndex); - output.writeByte(pattern); - output.writeInt(patternColours[0]); - output.writeInt(patternColours[1]); - output.writeInt(patternColours[2]); - output.writeByte(crests.size()); - for (Crest c : crests) { - output.write(c.getByteArray()); - } - output.write(extraData); - - byteArray = bos.toByteArray(); - - return byteArray; - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (output != null) { - output.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - return null; - } - } - - public List getCrests() { - return crests; - } - - public byte[] getExtraData() { - return extraData; - } - - public int getPatternIndex() { - return storageIndex; - } - - public byte getPattern() { - return pattern; - } - - public int getColour(int index) { - return patternColours[index]; - } - - public static String byteArrayToHex(byte[] a) { - StringBuilder sb = new StringBuilder(); - for (byte b : a) - sb.append(String.format("%02x", b & 0xff)); - return sb.toString(); - } - - public void setColour(int i, int rgb) { - patternColours[i] = rgb; - byteArray = null; - } - - public void setPatternIndex(int index) { - this.storageIndex = index; - byteArray = null; - } - - public void setPattern(int pattern) { - this.pattern = (byte) pattern; - byteArray = null; - } - - @Override - public HeraldryData clone() { - return new HeraldryData(storageIndex, pattern, patternColours[0], patternColours[1], patternColours[2], crests, - extraData); - } + public static final int RED = 1; + public static final int GREEN = 2; + public static final int BLUE = 3; + public static final int MAX_CRESTS = 6; + private static final int extraDataSize = 6; + public static final HeraldryData defaultData = new HeraldryData(0, (byte) 0, Color.YELLOW.getRGB(), + Color.BLUE.getRGB(), Color.BLACK.getRGB(), new ArrayList(), new byte[extraDataSize]); + private int storageIndex; + private byte pattern; + private int[] patternColours; + private byte[] extraData; + private byte[] byteArray = null; + private List crests; + + public HeraldryData(int patternStoreIndex, byte pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3, + List crests, byte[] extraData) { + this.storageIndex = patternStoreIndex; + this.pattern = pattern; + this.patternColours = new int[]{pattern_col_1, pattern_col_2, pattern_col_3}; + this.crests = crests; + this.extraData = extraData; + } + + public HeraldryData(byte[] crestData) { + DataInputStream input = null; + + try { + input = new DataInputStream(new ByteArrayInputStream(crestData)); + + storageIndex = input.readInt(); + pattern = input.readByte(); + patternColours = new int[]{input.readInt(), input.readInt(), input.readInt()}; + byte crestCount = input.readByte(); + crests = new ArrayList(crestCount); + for (int i = 0; i < crestCount; i++) { + byte[] bytes = new byte[Crest.dataSize]; + input.read(bytes); + crests.add(new Crest(bytes)); + } + extraData = new byte[extraDataSize]; + for (int i = 0; i < extraDataSize; i++) { + extraData[i] = input.readByte(); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (input != null) { + input.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static HeraldryData getDefault() { + return defaultData; + } + + public static String byteArrayToHex(byte[] a) { + StringBuilder sb = new StringBuilder(); + for (byte b : a) + sb.append(String.format("%02x", b & 0xff)); + return sb.toString(); + } + + public byte[] getByteArray() { + if (byteArray != null) { + return byteArray; + } else { + DataOutputStream output = null; + + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + output = new DataOutputStream(bos); + + output.writeInt(storageIndex); + output.writeByte(pattern); + output.writeInt(patternColours[0]); + output.writeInt(patternColours[1]); + output.writeInt(patternColours[2]); + output.writeByte(crests.size()); + for (Crest c : crests) { + output.write(c.getByteArray()); + } + output.write(extraData); + + byteArray = bos.toByteArray(); + + return byteArray; + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (output != null) { + output.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + return null; + } + } + + public List getCrests() { + return crests; + } + + public byte[] getExtraData() { + return extraData; + } + + public int getPatternIndex() { + return storageIndex; + } + + public void setPatternIndex(int index) { + this.storageIndex = index; + byteArray = null; + } + + public byte getPattern() { + return pattern; + } + + public void setPattern(int pattern) { + this.pattern = (byte) pattern; + byteArray = null; + } + + public int getColour(int index) { + return patternColours[index]; + } + + public void setColour(int i, int rgb) { + patternColours[i] = rgb; + byteArray = null; + } + + @Override + public HeraldryData clone() { + return new HeraldryData(storageIndex, pattern, patternColours[0], patternColours[1], patternColours[2], crests, + extraData); + } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java index 785c29a6..7fbe0e70 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java +++ b/src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java @@ -1,151 +1,147 @@ package mods.battlegear2.api.heraldry; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; +import java.io.*; import java.util.Arrays; @SuppressWarnings("unused") public class HeraldryDataBackup { - public static final int RED = 1; - public static final int GREEN = 2; - public static final int BLUE = 3; - - private byte pattern; - private short crest; - private byte crestPosition; - private int[] colours = new int[5]; - - private byte helm; - private byte banner; - - private byte[] byteArray = null; - - public HeraldryDataBackup(int pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3, int crest, - int crest_col_1, int crest_col_2, int crest_position, int helm, int banner) { - this.pattern = (byte) pattern; - this.crest = (short) crest; - colours = new int[] { pattern_col_1, pattern_col_2, pattern_col_3, crest_col_1, crest_col_2 }; - this.crestPosition = (byte) crest_position; - this.helm = (byte) helm; - this.banner = (byte) banner; - } - - public HeraldryDataBackup(byte pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3) { - this(pattern, pattern_col_1, pattern_col_2, pattern_col_3, 0, 0, 0, 0, 0, 0); - } - - public HeraldryDataBackup(byte[] data) { - DataInputStream input = null; - - try { - input = new DataInputStream(new ByteArrayInputStream(data)); - - pattern = input.readByte(); - crest = input.readShort(); - crestPosition = input.readByte(); - colours = new int[5]; - for (int i = 0; i < colours.length; i++) { - colours[i] = input.readInt(); - } - - helm = input.readByte(); - banner = input.readByte(); - - byteArray = Arrays.copyOf(data, data.length); - - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (input != null) { - input.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static HeraldryDataBackup getDefault() { - return new HeraldryDataBackup(10, 0xFF000000, 0xFFFFFFFF, 0xFFFFFF00, 0, 0xFF000000, 0xFF000000, 0, 0, 0); - } - - public byte[] getByteArray() { - - if (byteArray != null) { - return byteArray; - } - - DataOutputStream output = null; - - try { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - output = new DataOutputStream(bos); - - output.writeByte(pattern); - output.writeShort(crest); - output.writeByte(crestPosition); - for (int i = 0; i < 5; i++) { - output.writeInt(colours[i]); - } - - output.writeByte(helm); - output.writeByte(banner); - - return bos.toByteArray(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (output != null) { - output.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - return null; - } - - public int getColourChanel(int colour, int chanelNo) { - switch (chanelNo) { - case RED: - return (colours[colour] >> 16) & 0xFF; - case GREEN: - return (colours[colour] >> 8) & 0xFF; - case BLUE: - return (colours[colour] >> 0) & 0xFF; - default: - return (colours[colour] >> 16) & 0xFF; - } - } - - public byte getPattern() { - return pattern; - } - - public int getColour(int i) { - return colours[i]; - } - - @Override - public String toString() { - return byteArrayToHex(getByteArray()); - } - - public static String byteArrayToHex(byte[] a) { - StringBuilder sb = new StringBuilder(); - for (byte b : a) - sb.append(String.format("%02x", b & 0xff)); - return sb.toString(); - } - - public short getCrest() { - return crest; - } + public static final int RED = 1; + public static final int GREEN = 2; + public static final int BLUE = 3; + + private byte pattern; + private short crest; + private byte crestPosition; + private int[] colours = new int[5]; + + private byte helm; + private byte banner; + + private byte[] byteArray = null; + + public HeraldryDataBackup(int pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3, int crest, + int crest_col_1, int crest_col_2, int crest_position, int helm, int banner) { + this.pattern = (byte) pattern; + this.crest = (short) crest; + colours = new int[]{pattern_col_1, pattern_col_2, pattern_col_3, crest_col_1, crest_col_2}; + this.crestPosition = (byte) crest_position; + this.helm = (byte) helm; + this.banner = (byte) banner; + } + + public HeraldryDataBackup(byte pattern, int pattern_col_1, int pattern_col_2, int pattern_col_3) { + this(pattern, pattern_col_1, pattern_col_2, pattern_col_3, 0, 0, 0, 0, 0, 0); + } + + public HeraldryDataBackup(byte[] data) { + DataInputStream input = null; + + try { + input = new DataInputStream(new ByteArrayInputStream(data)); + + pattern = input.readByte(); + crest = input.readShort(); + crestPosition = input.readByte(); + colours = new int[5]; + for (int i = 0; i < colours.length; i++) { + colours[i] = input.readInt(); + } + + helm = input.readByte(); + banner = input.readByte(); + + byteArray = Arrays.copyOf(data, data.length); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (input != null) { + input.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static HeraldryDataBackup getDefault() { + return new HeraldryDataBackup(10, 0xFF000000, 0xFFFFFFFF, 0xFFFFFF00, 0, 0xFF000000, 0xFF000000, 0, 0, 0); + } + + public static String byteArrayToHex(byte[] a) { + StringBuilder sb = new StringBuilder(); + for (byte b : a) + sb.append(String.format("%02x", b & 0xff)); + return sb.toString(); + } + + public byte[] getByteArray() { + + if (byteArray != null) { + return byteArray; + } + + DataOutputStream output = null; + + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + output = new DataOutputStream(bos); + + output.writeByte(pattern); + output.writeShort(crest); + output.writeByte(crestPosition); + for (int i = 0; i < 5; i++) { + output.writeInt(colours[i]); + } + + output.writeByte(helm); + output.writeByte(banner); + + return bos.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (output != null) { + output.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + return null; + } + + public int getColourChanel(int colour, int chanelNo) { + switch (chanelNo) { + case RED: + return (colours[colour] >> 16) & 0xFF; + case GREEN: + return (colours[colour] >> 8) & 0xFF; + case BLUE: + return (colours[colour] >> 0) & 0xFF; + default: + return (colours[colour] >> 16) & 0xFF; + } + } + + public byte getPattern() { + return pattern; + } + + public int getColour(int i) { + return colours[i]; + } + + @Override + public String toString() { + return byteArrayToHex(getByteArray()); + } + + public short getCrest() { + return crest; + } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java index 9ca3295a..41909190 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java +++ b/src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java @@ -1,51 +1,50 @@ package mods.battlegear2.api.heraldry; -import java.util.ArrayList; -import java.util.List; - import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.util.IIcon; +import java.util.ArrayList; +import java.util.List; + @Deprecated public class HeraldryPattern { - public static List patterns = new ArrayList(); - public static final HeraldryPattern VERTICAL_BLOCK = new HeraldryPattern("battlegear2", "patterns/pattern-0"); - public static final HeraldryPattern HORIZONTAL_BLOCK = new HeraldryPattern("battlegear2", "patterns/pattern-1"); - public static final HeraldryPattern QUARTERD = new HeraldryPattern("battlegear2", "patterns/pattern-2"); - public static final HeraldryPattern HORIZONTAL_MID = new HeraldryPattern("battlegear2", "patterns/pattern-3"); - public static final HeraldryPattern VERTICAL_MID = new HeraldryPattern("battlegear2", "patterns/pattern-4"); - public static final HeraldryPattern HORIZONTAL_BAR = new HeraldryPattern("battlegear2", "patterns/pattern-5"); - public static final HeraldryPattern VERTICAL_BAR = new HeraldryPattern("battlegear2", "patterns/pattern-6"); - public static final HeraldryPattern SMALL_CHECKERED = new HeraldryPattern("battlegear2", "patterns/pattern-7"); - public static final HeraldryPattern DIAG_DOWN = new HeraldryPattern("battlegear2", "patterns/pattern-8"); - public static final HeraldryPattern DIAG_UP = new HeraldryPattern("battlegear2", "patterns/pattern-9"); - public static final HeraldryPattern LOWER_TRIANGLE = new HeraldryPattern("battlegear2", "patterns/pattern-10"); - public static final HeraldryPattern UPPER_TRIANGLE = new HeraldryPattern("battlegear2", "patterns/pattern-11"); - public static final HeraldryPattern VERTICAL_TRIANGLES = new HeraldryPattern("battlegear2", "patterns/pattern-12"); - public static final HeraldryPattern UP_ARROW = new HeraldryPattern("battlegear2", "patterns/pattern-13"); - public static final HeraldryPattern CROSS = new HeraldryPattern("battlegear2", "patterns/pattern-14"); - public static final HeraldryPattern DIAG_CROSS = new HeraldryPattern("battlegear2", "patterns/pattern-15"); - - private IIcon icon; - public final String name; - public final String mod; - - public HeraldryPattern(String modid, String name) { - this.mod = modid; - this.name = name; - patterns.add(this); - } - - public String getPath() { - return "assets/" + mod + "/textures/items/heraldry/" + name + ".png"; - } - - public IIcon getIcon() { - return icon; - } - - public void registerIcon(TextureMap map) { - this.icon = map.registerIcon(mod + ":heraldry/" + name); - } + public static final HeraldryPattern VERTICAL_BLOCK = new HeraldryPattern("battlegear2", "patterns/pattern-0"); + public static final HeraldryPattern HORIZONTAL_BLOCK = new HeraldryPattern("battlegear2", "patterns/pattern-1"); + public static final HeraldryPattern QUARTERD = new HeraldryPattern("battlegear2", "patterns/pattern-2"); + public static final HeraldryPattern HORIZONTAL_MID = new HeraldryPattern("battlegear2", "patterns/pattern-3"); + public static final HeraldryPattern VERTICAL_MID = new HeraldryPattern("battlegear2", "patterns/pattern-4"); + public static final HeraldryPattern HORIZONTAL_BAR = new HeraldryPattern("battlegear2", "patterns/pattern-5"); + public static final HeraldryPattern VERTICAL_BAR = new HeraldryPattern("battlegear2", "patterns/pattern-6"); + public static final HeraldryPattern SMALL_CHECKERED = new HeraldryPattern("battlegear2", "patterns/pattern-7"); + public static final HeraldryPattern DIAG_DOWN = new HeraldryPattern("battlegear2", "patterns/pattern-8"); + public static final HeraldryPattern DIAG_UP = new HeraldryPattern("battlegear2", "patterns/pattern-9"); + public static final HeraldryPattern LOWER_TRIANGLE = new HeraldryPattern("battlegear2", "patterns/pattern-10"); + public static final HeraldryPattern UPPER_TRIANGLE = new HeraldryPattern("battlegear2", "patterns/pattern-11"); + public static final HeraldryPattern VERTICAL_TRIANGLES = new HeraldryPattern("battlegear2", "patterns/pattern-12"); + public static final HeraldryPattern UP_ARROW = new HeraldryPattern("battlegear2", "patterns/pattern-13"); + public static final HeraldryPattern CROSS = new HeraldryPattern("battlegear2", "patterns/pattern-14"); + public static final HeraldryPattern DIAG_CROSS = new HeraldryPattern("battlegear2", "patterns/pattern-15"); + public static List patterns = new ArrayList(); + public final String name; + public final String mod; + private IIcon icon; + + public HeraldryPattern(String modid, String name) { + this.mod = modid; + this.name = name; + patterns.add(this); + } + + public String getPath() { + return "assets/" + mod + "/textures/items/heraldry/" + name + ".png"; + } + + public IIcon getIcon() { + return icon; + } + + public void registerIcon(TextureMap map) { + this.icon = map.registerIcon(mod + ":heraldry/" + name); + } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java index 0be7c481..73bbb348 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java +++ b/src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java @@ -1,31 +1,31 @@ package mods.battlegear2.api.heraldry; -import java.awt.image.BufferedImage; - import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.client.resources.IResourceManager; +import java.awt.image.BufferedImage; + public class HeraldryTextureSmall extends AbstractTexture { - private HeraldryData heraldryData; + private HeraldryData heraldryData; - public HeraldryTextureSmall(HeraldryData crest) { - this.heraldryData = crest; - } + public HeraldryTextureSmall(HeraldryData crest) { + this.heraldryData = crest; + } - @Override - public void loadTexture(IResourceManager resourcemanager) { - int[][][][] patt = PatternStore.DEFAULT.patterns.get(heraldryData.getPatternIndex()); - BufferedImage image = new BufferedImage(patt[heraldryData.getPattern()][0].length, - patt[heraldryData.getPattern()][0][0].length, BufferedImage.TYPE_4BYTE_ABGR); + @Override + public void loadTexture(IResourceManager resourcemanager) { + int[][][][] patt = PatternStore.DEFAULT.patterns.get(heraldryData.getPatternIndex()); + BufferedImage image = new BufferedImage(patt[heraldryData.getPattern()][0].length, + patt[heraldryData.getPattern()][0][0].length, BufferedImage.TYPE_4BYTE_ABGR); - for (int x = 0; x < image.getWidth(); x++) { - for (int y = 0; y < image.getHeight(); y++) { - image.setRGB(x, y, PatternStore.getBlendedSmallPixel(patt, heraldryData.getPattern(), x, y, - heraldryData.getColour(0), heraldryData.getColour(1), heraldryData.getColour(2))); - } - } - TextureUtil.uploadTextureImage(this.getGlTextureId(), image); - } + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + image.setRGB(x, y, PatternStore.getBlendedSmallPixel(patt, heraldryData.getPattern(), x, y, + heraldryData.getColour(0), heraldryData.getColour(1), heraldryData.getColour(2))); + } + } + TextureUtil.uploadTextureImage(this.getGlTextureId(), image); + } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java b/src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java index 1800d3a8..017b262d 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java +++ b/src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java @@ -1,47 +1,45 @@ package mods.battlegear2.api.heraldry; -import java.util.List; - import net.minecraft.item.ItemStack; +import java.util.List; + /** * Defines a {@link #TileEntity} holding flags {@link #ItemStack} */ public interface IFlagHolder { - /** - * Remove all contained flags - */ - public void clearFlags(); - - /** - * Add given flag to the TileEntity - * - * @param flag - * The flag to add return true if flag could be added - */ - public boolean addFlag(ItemStack flag); - - /** - * - * @return All flags currently contained, empty list if none - */ - public List getFlags(); - - /** - * Called by the default {@link FlagPoleTileRenderer} - * - * @param metadata - * @param section - * @return the value to interpolate on the flagpole icon, to render the flagpole - */ - public float getTextureDimensions(int metadata, int section); - - /** - * Called by the default {@link FlagPoleTileRenderer} - * - * @param metadata - * @return the rendered orientation value for the flagpole and thus the flags - */ - public int getOrientation(int metadata); + /** + * Remove all contained flags + */ + public void clearFlags(); + + /** + * Add given flag to the TileEntity + * + * @param flag The flag to add return true if flag could be added + */ + public boolean addFlag(ItemStack flag); + + /** + * @return All flags currently contained, empty list if none + */ + public List getFlags(); + + /** + * Called by the default {@link FlagPoleTileRenderer} + * + * @param metadata + * @param section + * @return the value to interpolate on the flagpole icon, to render the flagpole + */ + public float getTextureDimensions(int metadata, int section); + + /** + * Called by the default {@link FlagPoleTileRenderer} + * + * @param metadata + * @return the rendered orientation value for the flagpole and thus the flags + */ + public int getOrientation(int metadata); } diff --git a/src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java b/src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java index 8beb7344..8dd38044 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java +++ b/src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java @@ -5,60 +5,60 @@ public interface IHeraldryItem { - public static final String heraldryTag = "hc1"; + public static final String heraldryTag = "hc1"; - public enum HeraldyRenderPassess { - Pattern, SecondaryColourTrim, PostRenderIcon - } + /** + * Returns the "base" icon. This icon will be coloured the primary colour + */ + public IIcon getBaseIcon(ItemStack stack); - /** - * Returns the "base" icon. This icon will be coloured the primary colour - */ - public IIcon getBaseIcon(ItemStack stack); + /** + * Returns the trim icon, This will be coloured the secondary colour + */ + public IIcon getTrimIcon(ItemStack stack); - /** - * Returns the trim icon, This will be coloured the secondary colour - */ - public IIcon getTrimIcon(ItemStack stack); + /** + * Returns the post render icon, this Icon will render after all other rendering + * passess in it's default colour + */ + public IIcon getPostRenderIcon(ItemStack stack); - /** - * Returns the post render icon, this Icon will render after all other rendering - * passess in it's default colour - */ - public IIcon getPostRenderIcon(ItemStack stack); + /** + * Returns true if the given itemstack has heraldy attached + */ + public boolean hasHeraldry(ItemStack stack); - /** - * Returns true if the given itemstack has heraldy attached - */ - public boolean hasHeraldry(ItemStack stack); + /** + * Returns the current heraldy code, this will only be called on ItemStacks that + * have been found to have heraldry using the hasHeraldryMethod + */ + public byte[] getHeraldry(ItemStack stack); - /** - * Returns the current heraldy code, this will only be called on ItemStacks that - * have been found to have heraldry using the hasHeraldryMethod - */ - public byte[] getHeraldry(ItemStack stack); + /** + * Saves the given heraldry code in the given stack. It is recommended to save + * the Byte array representation of the crest in the NBT + */ + public void setHeraldry(ItemStack stack, byte[] data); - /** - * Saves the given heraldry code in the given stack. It is recommended to save - * the Byte array representation of the crest in the NBT - */ - public void setHeraldry(ItemStack stack, byte[] data); + /** + * Removes the heraldry code from the item + */ + public void removeHeraldry(ItemStack item); - /** - * Removes the heraldry code from the item - */ - public void removeHeraldry(ItemStack item); + /** + * Returns true if the default renderer should perform the given render pass + */ + public boolean shouldDoPass(HeraldyRenderPassess pass); - /** - * Returns true if the default renderer should perform the given render pass - */ - public boolean shouldDoPass(HeraldyRenderPassess pass); + /** + * Returns true if the default renderer should be used. If the method returns + * true, the default renderer will be attached. If this method returns false it + * is the modders responsibility to attach an appropriate renderer + */ + public boolean useDefaultRenderer(); - /** - * Returns true if the default renderer should be used. If the method returns - * true, the default renderer will be attached. If this method returns false it - * is the modders responsibility to attach an appropriate renderer - */ - public boolean useDefaultRenderer(); + public enum HeraldyRenderPassess { + Pattern, SecondaryColourTrim, PostRenderIcon + } } diff --git a/src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java b/src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java index d7ca5f8d..3279d2be 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java +++ b/src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java @@ -2,7 +2,7 @@ public interface IHeraldyArmour extends IHeraldryItem { - public String getBaseArmourPath(int armourSlot); + public String getBaseArmourPath(int armourSlot); - public String getPatternArmourPath(PatternStore pattern, int index, int armourSlot); + public String getPatternArmourPath(PatternStore pattern, int index, int armourSlot); } diff --git a/src/main/java/mods/battlegear2/api/heraldry/ITool.java b/src/main/java/mods/battlegear2/api/heraldry/ITool.java index c8210448..c7a86cdd 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/ITool.java +++ b/src/main/java/mods/battlegear2/api/heraldry/ITool.java @@ -8,12 +8,12 @@ */ public interface ITool { - public String getToolName(); + public String getToolName(); - public ResourceLocation getToolImage(); + public ResourceLocation getToolImage(); - public void drawOverlay(int x, int y, int[] pixals, DynamicTexture overlay, int rgb, boolean shift); + public void drawOverlay(int x, int y, int[] pixals, DynamicTexture overlay, int rgb, boolean shift); - public void draw(int x, int y, int[] pixels, int rgb, boolean shift); + public void draw(int x, int y, int[] pixels, int rgb, boolean shift); } diff --git a/src/main/java/mods/battlegear2/api/heraldry/PatternStore.java b/src/main/java/mods/battlegear2/api/heraldry/PatternStore.java index 0429c96e..9d3cb826 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/PatternStore.java +++ b/src/main/java/mods/battlegear2/api/heraldry/PatternStore.java @@ -1,127 +1,124 @@ package mods.battlegear2.api.heraldry; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; + +import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; -import javax.imageio.ImageIO; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.IResourceManager; -import net.minecraft.util.ResourceLocation; - public class PatternStore { - public static final IResourceManager rm = Minecraft.getMinecraft().getResourceManager(); - public static final PatternStore DEFAULT = new PatternStore(8, 4); - private final int IMAGES_X; - private final int IMAGES_Y; - public List patterns = new ArrayList(); - - public PatternStore(int xSections, int ySections) { - this.IMAGES_X = xSections; - this.IMAGES_Y = ySections; - } - - /** - * Deconstruct an image and store its data for later use - * - * @param image - * @return the index used to get the data back - */ - public int buildPatternAndStore(ResourceLocation image) { - try { - if (patterns.add(buildPatternFrom(image))) { - return patterns.size() - 1; - } else { - return -1; - } - } catch (IOException io) { - return -1; - } - } - - /** - * See {@link #buildPatternFrom(java.awt.image.BufferedImage)} - * - * @throws IOException - * if the image can't be read - */ - public int[][][][] buildPatternFrom(ResourceLocation image) throws IOException { - return buildPatternFrom(rm.getResource(image).getInputStream()); - } - - /** - * See {@link #buildPatternFrom(java.awt.image.BufferedImage)} - * - * @throws IOException - * if the image can't be read - */ - public int[][][][] buildPatternFrom(InputStream resourceStream) throws IOException { - return buildPatternFrom(ImageIO.read(resourceStream)); - } - - /** - * Analyse the given image by cutting it into subimages - * - * @param image - * @return the subimages rgb values into arrays - */ - public int[][][][] buildPatternFrom(BufferedImage image) { - int[][][][] rgbs = new int[IMAGES_X - * IMAGES_Y][3][(image.getWidth() / IMAGES_X)][(image.getHeight() / IMAGES_Y)]; - - int imageRes = image.getWidth() / IMAGES_X; - for (int x = 0; x < image.getWidth(); x++) { - for (int y = 0; y < image.getHeight(); y++) { - int imageNo = (x / imageRes) + IMAGES_X * (y / imageRes); - int rgb = image.getRGB(x, y); - int red = (rgb >> 16) & 0x000000FF; - int green = (rgb >> 8) & 0x000000FF; - int blue = (rgb) & 0x000000FF; - - int total = red + green + blue; - - if (total == 0) { - rgbs[imageNo][0][x % imageRes][y % imageRes] = 255; - rgbs[imageNo][1][x % imageRes][y % imageRes] = 0; - rgbs[imageNo][2][x % imageRes][y % imageRes] = 0; - } else { - rgbs[imageNo][0][x % imageRes][y % imageRes] = (255 * red) / total; - rgbs[imageNo][1][x % imageRes][y % imageRes] = (255 * green) / total; - rgbs[imageNo][2][x % imageRes][y % imageRes] = (255 * blue) / total; - } - } - } - return rgbs; - } - - public int getBlendedSmallPixel(int index, byte imageNo, int x, int y, int col1, int col2, int col3) { - return getBlendedSmallPixel(patterns.get(index)[imageNo][0][x][y], patterns.get(index)[imageNo][1][x][y], - patterns.get(index)[imageNo][2][x][y], col1, col2, col3); - } - - public static int getBlendedSmallPixel(int[][][][] rgbs, byte imageNo, int x, int y, int col1, int col2, int col3) { - return getBlendedSmallPixel(rgbs[imageNo][0][x][y], rgbs[imageNo][1][x][y], rgbs[imageNo][2][x][y], col1, col2, - col3); - } - - public static int getBlendedSmallPixel(int a, int b, int c, int col1, int col2, int col3) { - int red = ((((col1 >> 16) & 0xFF) * a) / 255) + ((((col2 >> 16) & 0xFF) * b) / 255) - + ((((col3 >> 16) & 0xFF) * c) / 255); - - int green = (((col1 >> 8) & 0xFF) * a / 255) + (((col2 >> 8) & 0xFF) * b / 255) - + (((col3 >> 8) & 0xFF) * c / 255); - - int blue = (((col1) & 0xFF) * a / 255) + (((col2) & 0xFF) * b / 255) + (((col3) & 0xFF) * c / 255); - - return 0xFF000000 | ((red << 16) & 0x00FF0000) | ((green << 8) & 0x0000FF00) | ((blue) & 0x000000FF); - } + public static final IResourceManager rm = Minecraft.getMinecraft().getResourceManager(); + public static final PatternStore DEFAULT = new PatternStore(8, 4); + private final int IMAGES_X; + private final int IMAGES_Y; + public List patterns = new ArrayList(); + + public PatternStore(int xSections, int ySections) { + this.IMAGES_X = xSections; + this.IMAGES_Y = ySections; + } + + public static int getBlendedSmallPixel(int[][][][] rgbs, byte imageNo, int x, int y, int col1, int col2, int col3) { + return getBlendedSmallPixel(rgbs[imageNo][0][x][y], rgbs[imageNo][1][x][y], rgbs[imageNo][2][x][y], col1, col2, + col3); + } + + public static int getBlendedSmallPixel(int a, int b, int c, int col1, int col2, int col3) { + int red = ((((col1 >> 16) & 0xFF) * a) / 255) + ((((col2 >> 16) & 0xFF) * b) / 255) + + ((((col3 >> 16) & 0xFF) * c) / 255); + + int green = (((col1 >> 8) & 0xFF) * a / 255) + (((col2 >> 8) & 0xFF) * b / 255) + + (((col3 >> 8) & 0xFF) * c / 255); + + int blue = (((col1) & 0xFF) * a / 255) + (((col2) & 0xFF) * b / 255) + (((col3) & 0xFF) * c / 255); + + return 0xFF000000 | ((red << 16) & 0x00FF0000) | ((green << 8) & 0x0000FF00) | ((blue) & 0x000000FF); + } + + /** + * Deconstruct an image and store its data for later use + * + * @param image + * @return the index used to get the data back + */ + public int buildPatternAndStore(ResourceLocation image) { + try { + if (patterns.add(buildPatternFrom(image))) { + return patterns.size() - 1; + } else { + return -1; + } + } catch (IOException io) { + return -1; + } + } + + /** + * See {@link #buildPatternFrom(java.awt.image.BufferedImage)} + * + * @throws IOException if the image can't be read + */ + public int[][][][] buildPatternFrom(ResourceLocation image) throws IOException { + return buildPatternFrom(rm.getResource(image).getInputStream()); + } + + /** + * See {@link #buildPatternFrom(java.awt.image.BufferedImage)} + * + * @throws IOException if the image can't be read + */ + public int[][][][] buildPatternFrom(InputStream resourceStream) throws IOException { + return buildPatternFrom(ImageIO.read(resourceStream)); + } + + /** + * Analyse the given image by cutting it into subimages + * + * @param image + * @return the subimages rgb values into arrays + */ + public int[][][][] buildPatternFrom(BufferedImage image) { + int[][][][] rgbs = new int[IMAGES_X + * IMAGES_Y][3][(image.getWidth() / IMAGES_X)][(image.getHeight() / IMAGES_Y)]; + + int imageRes = image.getWidth() / IMAGES_X; + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + int imageNo = (x / imageRes) + IMAGES_X * (y / imageRes); + int rgb = image.getRGB(x, y); + int red = (rgb >> 16) & 0x000000FF; + int green = (rgb >> 8) & 0x000000FF; + int blue = (rgb) & 0x000000FF; + + int total = red + green + blue; + + if (total == 0) { + rgbs[imageNo][0][x % imageRes][y % imageRes] = 255; + rgbs[imageNo][1][x % imageRes][y % imageRes] = 0; + rgbs[imageNo][2][x % imageRes][y % imageRes] = 0; + } else { + rgbs[imageNo][0][x % imageRes][y % imageRes] = (255 * red) / total; + rgbs[imageNo][1][x % imageRes][y % imageRes] = (255 * green) / total; + rgbs[imageNo][2][x % imageRes][y % imageRes] = (255 * blue) / total; + } + } + } + return rgbs; + } + + public int getBlendedSmallPixel(int index, byte imageNo, int x, int y, int col1, int col2, int col3) { + return getBlendedSmallPixel(patterns.get(index)[imageNo][0][x][y], patterns.get(index)[imageNo][1][x][y], + patterns.get(index)[imageNo][2][x][y], col1, col2, col3); + } /* - * public static void initialise(ResourceManager rm){ + * public static void initialise(ResourceManager rm){ * * try{ InputStream inputstream = rm.func_110536_a(small_image).func_110527_b(); * BufferedImage image = ImageIO.read(inputstream); diff --git a/src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java b/src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java index 8aeb92be..d7ec2d2d 100644 --- a/src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java +++ b/src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java @@ -1,54 +1,54 @@ package mods.battlegear2.api.heraldry; -import java.awt.Image; -import java.awt.image.BufferedImage; - import net.minecraft.client.renderer.texture.DynamicTexture; +import java.awt.*; +import java.awt.image.BufferedImage; + public class RefreshableTexture extends DynamicTexture { - private int width; - private int height; - - public RefreshableTexture(BufferedImage par1BufferedImage) { - super(par1BufferedImage); - this.width = par1BufferedImage.getWidth(); - this.height = par1BufferedImage.getHeight(); - } - - public RefreshableTexture(int par1, int par2) { - super(par1, par2); - this.width = par1; - this.height = par2; - } - - public void refreshWith(HeraldryData data, boolean scale) { - refreshWith(data.getPatternIndex(), data, scale); - } - - public void refreshWith(int patternIndex, HeraldryData data, boolean scale) { - if (patternIndex >= 0 && patternIndex < PatternStore.DEFAULT.patterns.size()) { - refreshWith(PatternStore.DEFAULT.patterns.get(patternIndex), data, scale); - } - } - - public void refreshWith(int[][][][] pattern, HeraldryData data, boolean scale) { - BufferedImage image = new BufferedImage(pattern[data.getPattern()][0].length, - pattern[data.getPattern()][0][0].length, BufferedImage.TYPE_4BYTE_ABGR); - for (int x = 0; x < image.getWidth(); x++) { - for (int y = 0; y < image.getHeight(); y++) { - image.setRGB(x, y, PatternStore.getBlendedSmallPixel(pattern, data.getPattern(), x, y, - data.getColour(0), data.getColour(1), data.getColour(2))); - } - } - if (scale && (image.getHeight() != height || image.getWidth() != width)) { - image = (BufferedImage) image.getScaledInstance(width, height, Image.SCALE_SMOOTH); - } - int[] pixels = getTextureData(); - for (int x = 0; x < image.getWidth(); x++) { - for (int y = 0; y < image.getHeight(); y++) { - pixels[x + y * image.getWidth()] = image.getRGB(x, y); - } - } - } + private int width; + private int height; + + public RefreshableTexture(BufferedImage par1BufferedImage) { + super(par1BufferedImage); + this.width = par1BufferedImage.getWidth(); + this.height = par1BufferedImage.getHeight(); + } + + public RefreshableTexture(int par1, int par2) { + super(par1, par2); + this.width = par1; + this.height = par2; + } + + public void refreshWith(HeraldryData data, boolean scale) { + refreshWith(data.getPatternIndex(), data, scale); + } + + public void refreshWith(int patternIndex, HeraldryData data, boolean scale) { + if (patternIndex >= 0 && patternIndex < PatternStore.DEFAULT.patterns.size()) { + refreshWith(PatternStore.DEFAULT.patterns.get(patternIndex), data, scale); + } + } + + public void refreshWith(int[][][][] pattern, HeraldryData data, boolean scale) { + BufferedImage image = new BufferedImage(pattern[data.getPattern()][0].length, + pattern[data.getPattern()][0][0].length, BufferedImage.TYPE_4BYTE_ABGR); + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + image.setRGB(x, y, PatternStore.getBlendedSmallPixel(pattern, data.getPattern(), x, y, + data.getColour(0), data.getColour(1), data.getColour(2))); + } + } + if (scale && (image.getHeight() != height || image.getWidth() != width)) { + image = (BufferedImage) image.getScaledInstance(width, height, Image.SCALE_SMOOTH); + } + int[] pixels = getTextureData(); + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + pixels[x + y * image.getWidth()] = image.getRGB(x, y); + } + } + } } diff --git a/src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java b/src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java index 7bf8d1cf..e07ccb2d 100644 --- a/src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java +++ b/src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java @@ -8,136 +8,111 @@ public interface IArrowContainer2 { - /** - * Returns the maximum amount of slots in the arrow container - * - * @param container - * {@link ItemStack} representing this item - * @return the amount of slots - */ - public int getSlotCount(ItemStack container); + /** + * Returns the maximum amount of slots in the arrow container + * + * @param container {@link ItemStack} representing this item + * @return the amount of slots + */ + public int getSlotCount(ItemStack container); - /** - * Returns the currently selected slot in the arrow container - * - * @param container - * {@link ItemStack} representing this item - * @return the currently selected slot - */ - public int getSelectedSlot(ItemStack container); + /** + * Returns the currently selected slot in the arrow container + * + * @param container {@link ItemStack} representing this item + * @return the currently selected slot + */ + public int getSelectedSlot(ItemStack container); - /** - * Sets the currently selected slot to the given value - * - * @param container - * {@link ItemStack} representing this item - * @param newSlot - * the new slot index - */ - public void setSelectedSlot(ItemStack container, int newSlot); + /** + * Sets the currently selected slot to the given value + * + * @param container {@link ItemStack} representing this item + * @param newSlot the new slot index + */ + public void setSelectedSlot(ItemStack container, int newSlot); - /** - * Returns the itemStack in the currently selected slot - * - * @param container - * The {@link ItemStack} representing this item - * @param slot - * the slot index - * @return The {@link #ItemStack} in the given slot. - */ - public ItemStack getStackInSlot(ItemStack container, int slot); + /** + * Returns the itemStack in the currently selected slot + * + * @param container The {@link ItemStack} representing this item + * @param slot the slot index + * @return The {@link #ItemStack} in the given slot. + */ + public ItemStack getStackInSlot(ItemStack container, int slot); - /** - * Sets places the given item stack in the given slot - * - * @param container - * {@link ItemStack} representing this item - * @param slot - * the slot index - * @param stack - * {@link ItemStack} representing the new stack - */ - public void setStackInSlot(ItemStack container, int slot, ItemStack stack); + /** + * Sets places the given item stack in the given slot + * + * @param container {@link ItemStack} representing this item + * @param slot the slot index + * @param stack {@link ItemStack} representing the new stack + */ + public void setStackInSlot(ItemStack container, int slot, ItemStack stack); - /** - * - * @param container - * The {@link ItemStack} representing this item - * @param bow - * The bow trying to use this container - * @param player - * The {@link EntityPlayer} using the bow - * @return true if the item contains at least one arrow in the selected slot - */ - public boolean hasArrowFor(ItemStack container, ItemStack bow, EntityPlayer player, int slot); + /** + * @param container The {@link ItemStack} representing this item + * @param bow The bow trying to use this container + * @param player The {@link EntityPlayer} using the bow + * @return true if the item contains at least one arrow in the selected slot + */ + public boolean hasArrowFor(ItemStack container, ItemStack bow, EntityPlayer player, int slot); - /** - * The arrow spawned when bow is used with this non empty container equipped - * - * @param container - * The {@link ItemStack} representing this item - * @param charge - * Amount of charge in the bow, ranging from 0.2F to 2.0F - * @param player - * The {@link EntityPlayer} using the bow - * @param world - * @return the arrow entity to spawn when bow is used - */ - public EntityArrow getArrowType(ItemStack container, World world, EntityPlayer player, float charge); + /** + * The arrow spawned when bow is used with this non empty container equipped + * + * @param container The {@link ItemStack} representing this item + * @param charge Amount of charge in the bow, ranging from 0.2F to 2.0F + * @param player The {@link EntityPlayer} using the bow + * @param world + * @return the arrow entity to spawn when bow is used + */ + public EntityArrow getArrowType(ItemStack container, World world, EntityPlayer player, float charge); - /** - * Action to take after an arrow has been fired Usually equal to removing an - * arrow from the container - * - * @param player - * The {@link EntityPlayer} using the bow - * @param world - * @param container - * The {@link ItemStack} representing this item - * @param bow - * The bow which fired - * @param arrow - * the arrow fired - */ - public void onArrowFired(World world, EntityPlayer player, ItemStack container, ItemStack bow, EntityArrow arrow); + /** + * Action to take after an arrow has been fired Usually equal to removing an + * arrow from the container + * + * @param player The {@link EntityPlayer} using the bow + * @param world + * @param container The {@link ItemStack} representing this item + * @param bow The bow which fired + * @param arrow the arrow fired + */ + public void onArrowFired(World world, EntityPlayer player, ItemStack container, ItemStack bow, EntityArrow arrow); - /** - * Called before the arrow is fired from this container - * - * @param arrowEvent - * Used to decide bow damage, bow sound and arrow enchantment - */ - public void onPreArrowFired(PlayerEventChild.QuiverArrowEvent.Firing arrowEvent); + /** + * Called before the arrow is fired from this container + * + * @param arrowEvent Used to decide bow damage, bow sound and arrow enchantment + */ + public void onPreArrowFired(PlayerEventChild.QuiverArrowEvent.Firing arrowEvent); - /** - * Called when the container is put on a crafting bench with other items - * - * @param container - * The {@link ItemStack} representing this item - * @param arrowStack - * The {@link ItemStack} representing other items - * @return True to receive {@link #addArrows(ItemStack, ItemStack)} - */ - public boolean isCraftableWithArrows(ItemStack container, ItemStack arrowStack); + /** + * Called when the container is put on a crafting bench with other items + * + * @param container The {@link ItemStack} representing this item + * @param arrowStack The {@link ItemStack} representing other items + * @return True to receive {@link #addArrows(ItemStack, ItemStack)} + */ + public boolean isCraftableWithArrows(ItemStack container, ItemStack arrowStack); - /** - * Crafts the item with the items from - * {@link #isCraftableWithArrows(ItemStack, ItemStack)} - * - * @param container - * The {@link ItemStack} representing this item - * @param newStack - * Another valid item on the crafting bench - * @return Arrows that couldn't fit in - */ - public ItemStack addArrows(ItemStack container, ItemStack newStack); + /** + * Crafts the item with the items from + * {@link #isCraftableWithArrows(ItemStack, ItemStack)} + * + * @param container The {@link ItemStack} representing this item + * @param newStack Another valid item on the crafting bench + * @return Arrows that couldn't fit in + */ + public ItemStack addArrows(ItemStack container, ItemStack newStack); - /** - * Called through post rendering event on the player - * - * @param container - * @return true if the default quiver model can be rendered - */ - public boolean renderDefaultQuiverModel(ItemStack container); + /** + * Called through post rendering event on the player + * + * @param container + * @return true if the default quiver model can be rendered + */ + public boolean renderDefaultQuiverModel(ItemStack container); } diff --git a/src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java b/src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java index 89105d8f..6ee1561c 100644 --- a/src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java +++ b/src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java @@ -7,33 +7,27 @@ public interface IArrowFireHandler { - /** - * Called from QuiverArrowRegistry.getArrowType, to decide if it is worth trying - * to build an EntityArrow - * - * @param arrow - * the stack which should define the arrow as item - * @param world - * @param player - * player using a bow to fire an arrow - * @param charge - * amount of charge in the bow - * @return true to get called for #getFireArrow - */ - public boolean canFireArrow(ItemStack arrow, World world, EntityPlayer player, float charge); + /** + * Called from QuiverArrowRegistry.getArrowType, to decide if it is worth trying + * to build an EntityArrow + * + * @param arrow the stack which should define the arrow as item + * @param world + * @param player player using a bow to fire an arrow + * @param charge amount of charge in the bow + * @return true to get called for #getFireArrow + */ + public boolean canFireArrow(ItemStack arrow, World world, EntityPlayer player, float charge); - /** - * Called from QuiverArrowRegistry.getArrowType, return null if the EntityArrow - * couldn't be built, let pass to another IArrowFireHandler - * - * @param arrow - * the stack which should define the arrow as item - * @param world - * @param player - * player using a bow to fire an arrow - * @param charge - * amount of charge in the bow - * @return the arrow to fire, or null if it couldn't be built - */ - public EntityArrow getFiredArrow(ItemStack arrow, World world, EntityPlayer player, float charge); + /** + * Called from QuiverArrowRegistry.getArrowType, return null if the EntityArrow + * couldn't be built, let pass to another IArrowFireHandler + * + * @param arrow the stack which should define the arrow as item + * @param world + * @param player player using a bow to fire an arrow + * @param charge amount of charge in the bow + * @return the arrow to fire, or null if it couldn't be built + */ + public EntityArrow getFiredArrow(ItemStack arrow, World world, EntityPlayer player, float charge); } diff --git a/src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java b/src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java index e41695f2..69f4ec87 100644 --- a/src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java +++ b/src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java @@ -5,14 +5,14 @@ public interface IQuiverSelection { - /** - * Defines a quiver selection algorithm, to be added with - * {@link QuiverArrowRegistry#addQuiverSelection} - * - * @param bow - * @param player - * @return a stack holding a {@link IArrowContainer2} item or null if none is - * found - */ - public ItemStack getQuiverFor(ItemStack bow, EntityPlayer player); + /** + * Defines a quiver selection algorithm, to be added with + * {@link QuiverArrowRegistry#addQuiverSelection} + * + * @param bow + * @param player + * @return a stack holding a {@link IArrowContainer2} item or null if none is + * found + */ + public ItemStack getQuiverFor(ItemStack bow, EntityPlayer player); } diff --git a/src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java b/src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java index 1c395c10..6a87c9ee 100644 --- a/src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java +++ b/src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java @@ -1,12 +1,5 @@ package mods.battlegear2.api.quiver; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; @@ -15,210 +8,200 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import java.util.*; + public class QuiverArrowRegistry { - private static Map> itemToClasses = new TreeMap>( - new StackComparator()); - private static Map, ItemStack> classToItems = new HashMap, ItemStack>(); - private static List quiverSelectors = new ArrayList(); - private static List fireHandlers = new ArrayList(); - static { - fireHandlers.add(new DefaultArrowFire()); - } - - /** - * Adds an item to the known arrow lists - * - * @param itemId - * the item id - * @param itemMetadata - * the item damage value, as metadata - * @param entityArrow - * the class from which the arrow entity will be constructed - */ - public static void addArrowToRegistry(Item itemId, int itemMetadata, Class entityArrow) { - ItemStack stack = new ItemStack(itemId, 1, itemMetadata); - addArrowToRegistry(stack, entityArrow); - } - - /** - * NBT sensitive version, can be called through - * FMLInterModComms.sendMessage("battlegear2", "Arrow:"+classPath, itemStack); - * where classPath is the full class path for the arrow class - * - * @param stack - * @param entityArrow - * the class from which the arrow entity will be constructed - */ - public static void addArrowToRegistry(ItemStack stack, Class entityArrow) { - ItemStack st = stack.copy(); - st.stackSize = 1; - itemToClasses.put(st, entityArrow); - classToItems.put(entityArrow, st); - } - - /** - * Adds a new quiver selection algorithm to the known list, can be called - * through FMLInterModComms.sendMessage("battlegear2", "QuiverSelection", - * classpath); where classPath is the full class path for the class implementing - * IQuiverSelection, and said class has a default constructor to built from - * - * @param handler - * the selection algorithm to add - * @return true if it could be added - */ - public static boolean addQuiverSelection(IQuiverSelection handler) { - return quiverSelectors.add(handler); - } - - /** - * Adds a new arrow firing handler to the known list, can be called through - * FMLInterModComms.sendMessage("battlegear2", "FireHandler", classpath); where - * classPath is the full class path for the class implementing - * IArrowFireHandler, and said class has a default constructor to built from - * - * @param handler - * the firing handler to add - * @return true if it could be added - */ - public static boolean addArrowFireHandler(IArrowFireHandler handler) { - return fireHandlers.add(handler); - } - - /** - * Search for an ItemStack whose item is an {@link IArrowContainer2} - * - * @param bow - * the bow in use - * @param entityPlayer - * the player using it - * @return the first non-null itemstack found through the quiver selection - * algorithms - */ - public static ItemStack getArrowContainer(ItemStack bow, EntityPlayer entityPlayer) { - ItemStack temp; - for (IQuiverSelection handler : quiverSelectors) { - temp = handler.getQuiverFor(bow, entityPlayer); - if (temp != null) { - return temp; - } - } - return null; - } - - /** - * Search for an EntityArrow to be spawned, used by the default ItemQuiver - * - * @param arrow - * the stack which should define the arrow as item - * @param world - * @param player - * player using a bow to fire an arrow - * @param charge - * amount of charge in the bow - * @return the first non-null entity arrow built through the firing handlers - */ - public static EntityArrow getArrowType(ItemStack arrow, World world, EntityPlayer player, float charge) { - EntityArrow result; - for (IArrowFireHandler handler : fireHandlers) { - if (handler.canFireArrow(arrow, world, player, charge)) { - result = handler.getFiredArrow(arrow, world, player, charge); - if (result != null) { - return result; - } - } - } - return null; - } - - /** - * @param stack - * @return the EntityArrow class attached to the given stack - */ - public static Class getArrowClass(ItemStack stack) { - return itemToClasses.get(stack); - } - - /** - * @param clazz - * @return the ItemStack attached to the given EntityArrow class - */ - public static ItemStack getItem(Class clazz) { - ItemStack temp = classToItems.get(clazz); - if (temp == null) { - return new ItemStack(Items.arrow); - } else { - return temp.copy(); - } - } - - /** - * - * @param test - * the ItemStack to check - * @return true if that ItemStack is attached to an EntityArrow class - */ - public static boolean isKnownArrow(ItemStack test) { - return itemToClasses.containsKey(test); - } - - /** - * Tool class to compare ItemStack, since this class is final but doesn't - * implement the necessary method - */ - static class StackComparator implements Comparator { - @Override - public int compare(ItemStack stack, ItemStack stack2) { - if (stack == stack2) { - return 0; - } else { - - int idDiff = stack.getItemDamage() - stack2.getItemDamage(); - if (idDiff != 0) { - return idDiff; - } else { - idDiff = Item.getIdFromItem(stack.getItem()) - Item.getIdFromItem(stack2.getItem()); - if (idDiff != 0) { - return idDiff; - } else { - int tag = 0; - if (stack.hasTagCompound()) { - tag = stack.getTagCompound().hashCode(); - } - int tag2 = 0; - if (stack2.hasTagCompound()) { - tag2 = stack2.getTagCompound().hashCode(); - } - return tag - tag2; - } - } - } - } - } - - /** - * Default implementation of a arrow firing handler, which uses this registry of - * arrows to build an EntityArrow with a constructor If the arrow is unknown, or - * the constructor isn't valid, defers to other firing handlers silently - */ - static class DefaultArrowFire implements IArrowFireHandler { - - @Override - public boolean canFireArrow(ItemStack arrow, World world, EntityPlayer player, float charge) { - return isKnownArrow(arrow); - } - - @Override - public EntityArrow getFiredArrow(ItemStack arrow, World world, EntityPlayer player, float charge) { - Class clazz = getArrowClass(arrow); - if (clazz != null) { - try { - return (EntityArrow) clazz.getConstructor(World.class, EntityLivingBase.class, Float.TYPE) - .newInstance(player.worldObj, player, charge); - } catch (Exception ignored) { - } - } - return null; - } - } + private static Map> itemToClasses = new TreeMap>( + new StackComparator()); + private static Map, ItemStack> classToItems = new HashMap, ItemStack>(); + private static List quiverSelectors = new ArrayList(); + private static List fireHandlers = new ArrayList(); + + static { + fireHandlers.add(new DefaultArrowFire()); + } + + /** + * Adds an item to the known arrow lists + * + * @param itemId the item id + * @param itemMetadata the item damage value, as metadata + * @param entityArrow the class from which the arrow entity will be constructed + */ + public static void addArrowToRegistry(Item itemId, int itemMetadata, Class entityArrow) { + ItemStack stack = new ItemStack(itemId, 1, itemMetadata); + addArrowToRegistry(stack, entityArrow); + } + + /** + * NBT sensitive version, can be called through + * FMLInterModComms.sendMessage("battlegear2", "Arrow:"+classPath, itemStack); + * where classPath is the full class path for the arrow class + * + * @param stack + * @param entityArrow the class from which the arrow entity will be constructed + */ + public static void addArrowToRegistry(ItemStack stack, Class entityArrow) { + ItemStack st = stack.copy(); + st.stackSize = 1; + itemToClasses.put(st, entityArrow); + classToItems.put(entityArrow, st); + } + + /** + * Adds a new quiver selection algorithm to the known list, can be called + * through FMLInterModComms.sendMessage("battlegear2", "QuiverSelection", + * classpath); where classPath is the full class path for the class implementing + * IQuiverSelection, and said class has a default constructor to built from + * + * @param handler the selection algorithm to add + * @return true if it could be added + */ + public static boolean addQuiverSelection(IQuiverSelection handler) { + return quiverSelectors.add(handler); + } + + /** + * Adds a new arrow firing handler to the known list, can be called through + * FMLInterModComms.sendMessage("battlegear2", "FireHandler", classpath); where + * classPath is the full class path for the class implementing + * IArrowFireHandler, and said class has a default constructor to built from + * + * @param handler the firing handler to add + * @return true if it could be added + */ + public static boolean addArrowFireHandler(IArrowFireHandler handler) { + return fireHandlers.add(handler); + } + + /** + * Search for an ItemStack whose item is an {@link IArrowContainer2} + * + * @param bow the bow in use + * @param entityPlayer the player using it + * @return the first non-null itemstack found through the quiver selection + * algorithms + */ + public static ItemStack getArrowContainer(ItemStack bow, EntityPlayer entityPlayer) { + ItemStack temp; + for (IQuiverSelection handler : quiverSelectors) { + temp = handler.getQuiverFor(bow, entityPlayer); + if (temp != null) { + return temp; + } + } + return null; + } + + /** + * Search for an EntityArrow to be spawned, used by the default ItemQuiver + * + * @param arrow the stack which should define the arrow as item + * @param world + * @param player player using a bow to fire an arrow + * @param charge amount of charge in the bow + * @return the first non-null entity arrow built through the firing handlers + */ + public static EntityArrow getArrowType(ItemStack arrow, World world, EntityPlayer player, float charge) { + EntityArrow result; + for (IArrowFireHandler handler : fireHandlers) { + if (handler.canFireArrow(arrow, world, player, charge)) { + result = handler.getFiredArrow(arrow, world, player, charge); + if (result != null) { + return result; + } + } + } + return null; + } + + /** + * @param stack + * @return the EntityArrow class attached to the given stack + */ + public static Class getArrowClass(ItemStack stack) { + return itemToClasses.get(stack); + } + + /** + * @param clazz + * @return the ItemStack attached to the given EntityArrow class + */ + public static ItemStack getItem(Class clazz) { + ItemStack temp = classToItems.get(clazz); + if (temp == null) { + return new ItemStack(Items.arrow); + } else { + return temp.copy(); + } + } + + /** + * @param test the ItemStack to check + * @return true if that ItemStack is attached to an EntityArrow class + */ + public static boolean isKnownArrow(ItemStack test) { + return itemToClasses.containsKey(test); + } + + /** + * Tool class to compare ItemStack, since this class is final but doesn't + * implement the necessary method + */ + static class StackComparator implements Comparator { + @Override + public int compare(ItemStack stack, ItemStack stack2) { + if (stack == stack2) { + return 0; + } else { + + int idDiff = stack.getItemDamage() - stack2.getItemDamage(); + if (idDiff != 0) { + return idDiff; + } else { + idDiff = Item.getIdFromItem(stack.getItem()) - Item.getIdFromItem(stack2.getItem()); + if (idDiff != 0) { + return idDiff; + } else { + int tag = 0; + if (stack.hasTagCompound()) { + tag = stack.getTagCompound().hashCode(); + } + int tag2 = 0; + if (stack2.hasTagCompound()) { + tag2 = stack2.getTagCompound().hashCode(); + } + return tag - tag2; + } + } + } + } + } + + /** + * Default implementation of a arrow firing handler, which uses this registry of + * arrows to build an EntityArrow with a constructor If the arrow is unknown, or + * the constructor isn't valid, defers to other firing handlers silently + */ + static class DefaultArrowFire implements IArrowFireHandler { + + @Override + public boolean canFireArrow(ItemStack arrow, World world, EntityPlayer player, float charge) { + return isKnownArrow(arrow); + } + + @Override + public EntityArrow getFiredArrow(ItemStack arrow, World world, EntityPlayer player, float charge) { + Class clazz = getArrowClass(arrow); + if (clazz != null) { + try { + return (EntityArrow) clazz.getConstructor(World.class, EntityLivingBase.class, Float.TYPE) + .newInstance(player.worldObj, player, charge); + } catch (Exception ignored) { + } + } + return null; + } + } } diff --git a/src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java b/src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java index 5d8f2703..26933adb 100644 --- a/src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java +++ b/src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java @@ -6,20 +6,15 @@ /** * Defines an item that can catch IProjectile Used by ItemShield to block arrows - * - * @author GotoLink * + * @author GotoLink */ public interface IArrowCatcher { - /** - * - * @param shield - * the {@link ItemStack} corresponding to the shield in use - * @param player - * the {@link EntityPlayer} holding the shield - * @param projectile - * heading towards the shield - * @return true if the projectile has been caught - */ - public boolean catchArrow(ItemStack shield, EntityPlayer player, IProjectile projectile); + /** + * @param shield the {@link ItemStack} corresponding to the shield in use + * @param player the {@link EntityPlayer} holding the shield + * @param projectile heading towards the shield + * @return true if the projectile has been caught + */ + public boolean catchArrow(ItemStack shield, EntityPlayer player, IProjectile projectile); } diff --git a/src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java b/src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java index 09ee59a1..685e5189 100644 --- a/src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java +++ b/src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java @@ -5,12 +5,11 @@ /** * Defines an item that can hold arrows as an internal variable Used by * ItemShield to display blocked arrows - * - * @author GotoLink * + * @author GotoLink */ public interface IArrowDisplay { - public void setArrowCount(ItemStack stack, int count); + public void setArrowCount(ItemStack stack, int count); - public int getArrowCount(ItemStack stack); + public int getArrowCount(ItemStack stack); } diff --git a/src/main/java/mods/battlegear2/api/shield/IShield.java b/src/main/java/mods/battlegear2/api/shield/IShield.java index 0a7fee53..d4da2705 100644 --- a/src/main/java/mods/battlegear2/api/shield/IShield.java +++ b/src/main/java/mods/battlegear2/api/shield/IShield.java @@ -6,92 +6,83 @@ public interface IShield { - /** - * Gets the decay rate for the stamina bar when the shield is in use. The value - * should be between 0 and 1. The duration of maximum blocking can be calculated - * by 1/decayRate/20. - * - * @param shield - * The {@link ItemStack} representing the shield - * @return a value between 0 & 1 representing the decay rate per tick - */ - public float getDecayRate(ItemStack shield); + /** + * Gets the decay rate for the stamina bar when the shield is in use. The value + * should be between 0 and 1. The duration of maximum blocking can be calculated + * by 1/decayRate/20. + * + * @param shield The {@link ItemStack} representing the shield + * @return a value between 0 & 1 representing the decay rate per tick + */ + public float getDecayRate(ItemStack shield); - /** - * Gets the recovery rate for the stamina bar when the shield is not in use. The - * value should be between 0 and 1. - * - * @param shield - * The {@link ItemStack} representing the shield - * @return a value between 0 & 1 representing the recovery rate per tick - */ - public float getRecoveryRate(ItemStack shield); + /** + * Gets the recovery rate for the stamina bar when the shield is not in use. The + * value should be between 0 and 1. + * + * @param shield The {@link ItemStack} representing the shield + * @return a value between 0 & 1 representing the recovery rate per tick + */ + public float getRecoveryRate(ItemStack shield); - /** - * Returns true if the current shield can and should block the given damage - * source - * - * @param shield - * The {@link ItemStack} representing the shield - * @param source - * The {@link DamageSource} representing the current damage - * @return true if the shield can block the given damage type - */ - public boolean canBlock(ItemStack shield, DamageSource source); + /** + * Returns true if the current shield can and should block the given damage + * source + * + * @param shield The {@link ItemStack} representing the shield + * @param source The {@link DamageSource} representing the current damage + * @return true if the shield can block the given damage type + */ + public boolean canBlock(ItemStack shield, DamageSource source); - /** - * Gets the extra decay rate to the stamina bar when the shield is damaged - * - * @param shield - * The {@link ItemStack} representing the shield - * @param amount - * The amount of damage the shield has absorbed - * @return a value between 0 & 1 representing the decay rate - */ - public float getDamageDecayRate(ItemStack shield, float amount); + /** + * Gets the extra decay rate to the stamina bar when the shield is damaged + * + * @param shield The {@link ItemStack} representing the shield + * @param amount The amount of damage the shield has absorbed + * @return a value between 0 & 1 representing the decay rate + */ + public float getDamageDecayRate(ItemStack shield, float amount); - /** - * Returns the block angle in degrees that the shield can block. This angle is - * taken as 0 degrees being directly in front of the player. The shield will - * block between -blockAngle to blockangle - * - * @param shield - * The {@link ItemStack} representing the shield - * @return The maximum angle the shield should be able to block at - */ - public float getBlockAngle(ItemStack shield); + /** + * Returns the block angle in degrees that the shield can block. This angle is + * taken as 0 degrees being directly in front of the player. The shield will + * block between -blockAngle to blockangle + * + * @param shield The {@link ItemStack} representing the shield + * @return The maximum angle the shield should be able to block at + */ + public float getBlockAngle(ItemStack shield); - /** - * Returns the time a shield bash should take to be performed. A shield bash - * will disallow actions for the number of ticks given and will knockback an - * opponent at time/2 - * - * @return The amount of ticks the shield bash animation will play - */ - public int getBashTimer(ItemStack shield); + /** + * Returns the time a shield bash should take to be performed. A shield bash + * will disallow actions for the number of ticks given and will knockback an + * opponent at time/2 + * + * @return The amount of ticks the shield bash animation will play + */ + public int getBashTimer(ItemStack shield); - /** - * Called after a successful block, if - * {@link PlayerEventShield.ShieldBlockEvent] allowed additional blocking - * animation A common additional animation might include a sound, particle - * effects, etc. - * - * @param player - * @param amount - */ - public void blockAnimation(EntityPlayer player, float amount); + /** + * Called after a successful block, if + * {@link PlayerEventShield.ShieldBlockEvent] allowed additional blocking + * animation A common additional animation might include a sound, particle + * effects, etc. + * + * @param player + * @param amount + */ + public void blockAnimation(EntityPlayer player, float amount); - /** - * Called after a successful block, if - * {@link PlayerEventShield.ShieldBlockEvent] allowed damage to be done and the - * player isn't in creative mode - * - * @param shield - * The {@link ItemStack} representing the shield - * @param source - * The {@link DamageSource} representing the current damage - * @return The amount of damage from the source that won't be dealt to the - * shield - */ - public float getDamageReduction(ItemStack shield, DamageSource source); + /** + * Called after a successful block, if + * {@link PlayerEventShield.ShieldBlockEvent] allowed damage to be done and the + * player isn't in creative mode + * + * @param shield The {@link ItemStack} representing the shield + * @param source The {@link DamageSource} representing the current damage + * @return The amount of damage from the source that won't be dealt to the + * shield + */ + public float getDamageReduction(ItemStack shield, DamageSource source); } diff --git a/src/main/java/mods/battlegear2/api/shield/ShieldType.java b/src/main/java/mods/battlegear2/api/shield/ShieldType.java index 2485df8f..a53a3202 100644 --- a/src/main/java/mods/battlegear2/api/shield/ShieldType.java +++ b/src/main/java/mods/battlegear2/api/shield/ShieldType.java @@ -2,60 +2,60 @@ public class ShieldType { - public static final ShieldType WOOD = new ShieldType("wood", 1F / 1F / 20F, 1F / 20F, 40, 15, 0xFFbc9862); // 1 - // second - // block - public static final ShieldType HIDE = new ShieldType("hide", 1F / 1.5F / 20F, 1F / 20F, 40, 12, 0xFF9b482b); // 1.5 - // second - // block - public static final ShieldType IRON = new ShieldType("iron", 1F / 3F / 20F, 1F / 20F, 120, 9, 0xFFacacac); // 3 - // second - // block - public static final ShieldType DIAMOND = new ShieldType("diamond", 1F / 5F / 20F, 1F / 20F, 263, 10, 0xFF23bfbf); // 5 - // second - // block - public static final ShieldType GOLD = new ShieldType("gold", 1F / 2F / 20F, 1F / 20F, 56, 25, 0xFFa8a400); // 2 - // second - // block - - private final float decayRate; - private final float damageDecay; - private final String name; - private final int enchantability; - private final int maxDamage; - private final int defaultRGB; - - public ShieldType(String name, float decayRate, float damageDecay, int maxDamage, int enchantability, - int defaultColour) { - this.name = name; - this.decayRate = decayRate; - this.damageDecay = damageDecay; - this.enchantability = enchantability; - this.maxDamage = maxDamage; - defaultRGB = defaultColour; - } - - public float getDecayRate() { - return decayRate; - } - - public float getDamageDecay() { - return damageDecay; - } - - public String getName() { - return name; - } - - public int getEnchantability() { - return enchantability; - } - - public int getMaxDamage() { - return maxDamage; - } - - public int getDefaultRGB() { - return defaultRGB; - } + public static final ShieldType WOOD = new ShieldType("wood", 1F / 1F / 20F, 1F / 20F, 40, 15, 0xFFbc9862); // 1 + // second + // block + public static final ShieldType HIDE = new ShieldType("hide", 1F / 1.5F / 20F, 1F / 20F, 40, 12, 0xFF9b482b); // 1.5 + // second + // block + public static final ShieldType IRON = new ShieldType("iron", 1F / 3F / 20F, 1F / 20F, 120, 9, 0xFFacacac); // 3 + // second + // block + public static final ShieldType DIAMOND = new ShieldType("diamond", 1F / 5F / 20F, 1F / 20F, 263, 10, 0xFF23bfbf); // 5 + // second + // block + public static final ShieldType GOLD = new ShieldType("gold", 1F / 2F / 20F, 1F / 20F, 56, 25, 0xFFa8a400); // 2 + // second + // block + + private final float decayRate; + private final float damageDecay; + private final String name; + private final int enchantability; + private final int maxDamage; + private final int defaultRGB; + + public ShieldType(String name, float decayRate, float damageDecay, int maxDamage, int enchantability, + int defaultColour) { + this.name = name; + this.decayRate = decayRate; + this.damageDecay = damageDecay; + this.enchantability = enchantability; + this.maxDamage = maxDamage; + defaultRGB = defaultColour; + } + + public float getDecayRate() { + return decayRate; + } + + public float getDamageDecay() { + return damageDecay; + } + + public String getName() { + return name; + } + + public int getEnchantability() { + return enchantability; + } + + public int getMaxDamage() { + return maxDamage; + } + + public int getDefaultRGB() { + return defaultRGB; + } } diff --git a/src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java b/src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java index c2074b53..a45456f8 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java +++ b/src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java @@ -4,12 +4,12 @@ public interface IBackStabbable { - /** - * Action to perform on back stabbing - * - * @param entityHit - * @param entityHitting - * @return true if it adds an hitting action - */ - public boolean onBackStab(EntityLivingBase entityHit, EntityLivingBase entityHitting); + /** + * Action to perform on back stabbing + * + * @param entityHit + * @param entityHitting + * @return true if it adds an hitting action + */ + public boolean onBackStab(EntityLivingBase entityHit, EntityLivingBase entityHitting); } diff --git a/src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java b/src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java index 799f460d..5e28b734 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java +++ b/src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java @@ -3,12 +3,12 @@ import net.minecraft.item.ItemStack; public interface IExtendedReachWeapon { - /** - * The distance the weapon will hit (note this will ONLY work for main hand - * weapons) - * - * @param stack - * @return - */ - public float getReachModifierInBlocks(ItemStack stack); + /** + * The distance the weapon will hit (note this will ONLY work for main hand + * weapons) + * + * @param stack + * @return + */ + public float getReachModifierInBlocks(ItemStack stack); } diff --git a/src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java b/src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java index 0ff308b2..a457fdf0 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java +++ b/src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java @@ -4,11 +4,10 @@ import net.minecraft.item.ItemStack; public interface IHitTimeModifier { - /** - * - * @param entityHit - * @return The amount to modify the hit shield - */ - public int getHitTime(ItemStack stack, EntityLivingBase entityHit); + /** + * @param entityHit + * @return The amount to modify the hit shield + */ + public int getHitTime(ItemStack stack, EntityLivingBase entityHit); } diff --git a/src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java b/src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java index 93e40d71..ab27caab 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java +++ b/src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java @@ -3,13 +3,12 @@ import net.minecraft.item.ItemStack; public interface IPenetrateWeapon { - /** - * The amount of damage bypassing armor - * - * @param stack - * The {@link net.minecraft.item.ItemStack} representative of the - * item dealing the hit. - * @return the amount of damage that bypasses armour - */ - public float getPenetratingPower(ItemStack stack); + /** + * The amount of damage bypassing armor + * + * @param stack The {@link net.minecraft.item.ItemStack} representative of the + * item dealing the hit. + * @return the amount of damage that bypasses armour + */ + public float getPenetratingPower(ItemStack stack); } diff --git a/src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java b/src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java index 8e4da366..8a9a1786 100644 --- a/src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java +++ b/src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java @@ -1,24 +1,23 @@ package mods.battlegear2.api.weapons; -import java.util.Map; - import net.minecraft.entity.EntityLivingBase; import net.minecraft.potion.PotionEffect; +import java.util.Map; + public interface IPotionEffect { - /** - * Returns a map containing the potion effects to apply to an entity hit by the - * weapon. Each effect has a float value associated with the chance of applying - * the effect. Note that the "dice roll" only occurs once so any value under - * this roll will be applied. - * - * @param entityHit - * The entity the effect will be applied to. - * @param entityHitting - * @return A Map of {@link PotionEffect} with chance value ranging from 0 to 1, - * to be dealt to the entityHit - */ - public Map getEffectsOnHit(EntityLivingBase entityHit, EntityLivingBase entityHitting); + /** + * Returns a map containing the potion effects to apply to an entity hit by the + * weapon. Each effect has a float value associated with the chance of applying + * the effect. Note that the "dice roll" only occurs once so any value under + * this roll will be applied. + * + * @param entityHit The entity the effect will be applied to. + * @param entityHitting + * @return A Map of {@link PotionEffect} with chance value ranging from 0 to 1, + * to be dealt to the entityHit + */ + public Map getEffectsOnHit(EntityLivingBase entityHit, EntityLivingBase entityHitting); } diff --git a/src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java b/src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java index fa68cf2d..17d7081f 100644 --- a/src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java +++ b/src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java @@ -3,12 +3,10 @@ import net.minecraft.entity.EntityLivingBase; public interface ISpecialEffect { - /** - * - * @param entityHit - * The entity the effect will be applied to. - * @param entityHitting - * @return true if it adds an hitting action - */ - public boolean performEffects(EntityLivingBase entityHit, EntityLivingBase entityHitting); + /** + * @param entityHit The entity the effect will be applied to. + * @param entityHitting + * @return true if it adds an hitting action + */ + public boolean performEffects(EntityLivingBase entityHit, EntityLivingBase entityHitting); } diff --git a/src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java b/src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java index 88f6d61a..734b967d 100644 --- a/src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java +++ b/src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java @@ -1,109 +1,104 @@ package mods.battlegear2.api.weapons; -import java.util.HashSet; -import java.util.Set; - -import org.apache.commons.lang3.builder.HashCodeBuilder; - import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import org.apache.commons.lang3.builder.HashCodeBuilder; + +import java.util.HashSet; +import java.util.Set; /** * Registry for stacks which will be allowed in battle inventory, accessible * through {@link FMLInterModComms} messages. Use only if your item is not * recognized by default. Use of {@link IBattlegearWeapon} is preferred over * this method. {@link NBTTagCompound} are supported. - * - * @author GotoLink * + * @author GotoLink */ public class WeaponRegistry { - private static Set weapons = new HashSet(); - private static Set mainHand = new HashSet(); - private static Set offHand = new HashSet(); + private static Set weapons = new HashSet(); + private static Set mainHand = new HashSet(); + private static Set offHand = new HashSet(); - /** - * Called by a {@link IMCMessage} with "Dual" as key, and the {@link ItemStack} - * as value - * - * @param stack - * registered as dual wieldable - */ - public static void addDualWeapon(ItemStack stack) { - weapons.add(new StackHolder(stack)); - mainHand.add(new StackHolder(stack)); - offHand.add(new StackHolder(stack)); - } + /** + * Called by a {@link IMCMessage} with "Dual" as key, and the {@link ItemStack} + * as value + * + * @param stack registered as dual wieldable + */ + public static void addDualWeapon(ItemStack stack) { + weapons.add(new StackHolder(stack)); + mainHand.add(new StackHolder(stack)); + offHand.add(new StackHolder(stack)); + } - /** - * Called by a {@link IMCMessage} with "MainHand" as key, and the - * {@link ItemStack} as value - * - * @param stack - * registered as wieldable only in main hand - */ - public static void addTwoHanded(ItemStack stack) { - weapons.add(new StackHolder(stack)); - mainHand.add(new StackHolder(stack)); - } + /** + * Called by a {@link IMCMessage} with "MainHand" as key, and the + * {@link ItemStack} as value + * + * @param stack registered as wieldable only in main hand + */ + public static void addTwoHanded(ItemStack stack) { + weapons.add(new StackHolder(stack)); + mainHand.add(new StackHolder(stack)); + } - /** - * Called by a {@link IMCMessage} with "OffHand" as key, and the - * {@link ItemStack} as value - * - * @param stack - * registered as wieldable only in offhand - */ - public static void addOffhandWeapon(ItemStack stack) { - weapons.add(new StackHolder(stack)); - offHand.add(new StackHolder(stack)); - } + /** + * Called by a {@link IMCMessage} with "OffHand" as key, and the + * {@link ItemStack} as value + * + * @param stack registered as wieldable only in offhand + */ + public static void addOffhandWeapon(ItemStack stack) { + weapons.add(new StackHolder(stack)); + offHand.add(new StackHolder(stack)); + } - public static boolean isWeapon(ItemStack stack) { - return weapons.contains(new StackHolder(stack)); - } + public static boolean isWeapon(ItemStack stack) { + return weapons.contains(new StackHolder(stack)); + } - public static boolean isMainHand(ItemStack stack) { - return mainHand.contains(new StackHolder(stack)); - } + public static boolean isMainHand(ItemStack stack) { + return mainHand.contains(new StackHolder(stack)); + } - public static boolean isOffHand(ItemStack stack) { - return offHand.contains(new StackHolder(stack)); - } + public static boolean isOffHand(ItemStack stack) { + return offHand.contains(new StackHolder(stack)); + } - static class StackHolder { - private final ItemStack stack; - private int hash; + static class StackHolder { + private final ItemStack stack; + private int hash; - public StackHolder(ItemStack stack) { - this.stack = stack; - } + public StackHolder(ItemStack stack) { + this.stack = stack; + } - @Override - public int hashCode() { - int init = 17, mult = 37; - if (hash == 0) { - if (stack == null) - hash = new HashCodeBuilder(init, mult).toHashCode(); - else - hash = new HashCodeBuilder(init, mult).append(Item.getIdFromItem(stack.getItem())) - .append(stack.getItemDamage()).append(stack.getTagCompound()).toHashCode(); - } - return hash; - } + @Override + public int hashCode() { + int init = 17, mult = 37; + if (hash == 0) { + if (stack == null) + hash = new HashCodeBuilder(init, mult).toHashCode(); + else + hash = new HashCodeBuilder(init, mult).append(Item.getIdFromItem(stack.getItem())) + .append(stack.getItemDamage()).append(stack.getTagCompound()).toHashCode(); + } + return hash; + } - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - return obj instanceof StackHolder && ItemStack.areItemStacksEqual(stack, ((StackHolder) obj).stack); - } - } + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + return obj instanceof StackHolder && ItemStack.areItemStacksEqual(stack, ((StackHolder) obj).stack); + } + } } diff --git a/src/main/resources/assets/minefantasy2/sounds.json b/src/main/resources/assets/minefantasy2/sounds.json index 2699aa27..a8d9ded6 100644 --- a/src/main/resources/assets/minefantasy2/sounds.json +++ b/src/main/resources/assets/minefantasy2/sounds.json @@ -1,280 +1,245 @@ { - "weapon.bombBounce": { + "weapon.bombBounce": { "category": "neutral", "sounds": [ - "weapon/bomb_bounce" - ] - }, - - "weapon.bowFire": { + "weapon/bomb_bounce" + ] + }, + "weapon.bowFire": { "category": "neutral", "sounds": [ - "weapon/bow_fire" - ] - }, - - "weapon.arrowHit": { + "weapon/bow_fire" + ] + }, + "weapon.arrowHit": { "category": "neutral", "sounds": [ - "weapon/arrow_hit" - ] - }, - - "weapon.crossbowload": { + "weapon/arrow_hit" + ] + }, + "weapon.crossbowload": { "category": "neutral", "sounds": [ - "weapon/crossbow_load" - ] - }, - - "weapon.crossbow_fire": { + "weapon/crossbow_load" + ] + }, + "weapon.crossbow_fire": { "category": "neutral", "sounds": [ - "weapon/crossbow_fire" - ] - }, - - "weapon.critical": { + "weapon/crossbow_fire" + ] + }, + "weapon.critical": { "category": "neutral", "sounds": [ - "weapon/critical" - ] - }, - - "weapon.wood_parry": { + "weapon/critical" + ] + }, + "weapon.wood_parry": { "category": "neutral", "sounds": [ - "weapon/wood_parry" - ] - }, - - "weapon.hit.blunt.wood": { + "weapon/wood_parry" + ] + }, + "weapon.hit.blunt.wood": { "category": "neutral", "sounds": [ - "weapon/hit/blunt/wood1" - ] - }, - - "weapon.hit.blunt.stone": { + "weapon/hit/blunt/wood1" + ] + }, + "weapon.hit.blunt.stone": { "category": "neutral", "sounds": [ - "weapon/hit/blunt/stone1" - ] - }, - "weapon.hit.blunt.metal": { + "weapon/hit/blunt/stone1" + ] + }, + "weapon.hit.blunt.metal": { "category": "neutral", "sounds": [ - "weapon/hit/blunt/metal1" - ] - }, - - "weapon.hit.blade.wood": { + "weapon/hit/blunt/metal1" + ] + }, + "weapon.hit.blade.wood": { "category": "neutral", "sounds": [ - "weapon/hit/blade/wood1" - ] - }, - - "weapon.hit.blade.stone": { + "weapon/hit/blade/wood1" + ] + }, + "weapon.hit.blade.stone": { "category": "neutral", "sounds": [ - "weapon/hit/blade/stone1" - ] - }, - - "weapon.hit.blade.metal": { + "weapon/hit/blade/stone1" + ] + }, + "weapon.hit.blade.metal": { "category": "neutral", "sounds": [ - "weapon/hit/blade/metal1" - ] - }, - - "block.mythicore": { + "weapon/hit/blade/metal1" + ] + }, + "block.mythicore": { "category": "neutral", "sounds": [ - "blocks/MythicOre" - ] - }, - - "block.carpentermallet": { + "blocks/MythicOre" + ] + }, + "block.carpentermallet": { "category": "neutral", "sounds": [ - "blocks/CarpenterMallet" - ] - }, - - "block.anvilfail": { + "blocks/CarpenterMallet" + ] + }, + "block.anvilfail": { "category": "neutral", "sounds": [ - "process/anvil/AnvilFail1", - "process/anvil/AnvilFail2", - "process/anvil/AnvilFail3" - ] - }, - - "block.anvilsucceed": { + "process/anvil/AnvilFail1", + "process/anvil/AnvilFail2", + "process/anvil/AnvilFail3" + ] + }, + "block.anvilsucceed": { "category": "neutral", "sounds": [ - "process/anvil/AnvilSucceed1", - "process/anvil/AnvilSucceed2", - "process/anvil/AnvilSucceed3" - ] - }, - - "block.hammercarpenter": { + "process/anvil/AnvilSucceed1", + "process/anvil/AnvilSucceed2", + "process/anvil/AnvilSucceed3" + ] + }, + "block.hammercarpenter": { "category": "neutral", "sounds": [ - "process/carpenter/HammerCarpenter1", - "process/carpenter/HammerCarpenter2", - "process/carpenter/HammerCarpenter3" - ] - }, - - "block.quern": { + "process/carpenter/HammerCarpenter1", + "process/carpenter/HammerCarpenter2", + "process/carpenter/HammerCarpenter3" + ] + }, + "block.quern": { "category": "neutral", "sounds": [ - "process/carpenter/Quern1", - "process/carpenter/Quern2", - "process/carpenter/Quern3" - ] - }, - - "block.craftprimitive": { + "process/carpenter/Quern1", + "process/carpenter/Quern2", + "process/carpenter/Quern3" + ] + }, + "block.craftprimitive": { "category": "neutral", "sounds": [ - "process/carpenter/CraftPrimitive1", - "process/carpenter/CraftPrimitive2", - "process/carpenter/CraftPrimitive3" - ] - }, - - "block.sawcarpenter": { + "process/carpenter/CraftPrimitive1", + "process/carpenter/CraftPrimitive2", + "process/carpenter/CraftPrimitive3" + ] + }, + "block.sawcarpenter": { "category": "neutral", "sounds": [ - "process/carpenter/SawCarpenter1", - "process/carpenter/SawCarpenter2", - "process/carpenter/SawCarpenter3" - ] - }, - - "block.twistbolt": { + "process/carpenter/SawCarpenter1", + "process/carpenter/SawCarpenter2", + "process/carpenter/SawCarpenter3" + ] + }, + "block.twistbolt": { "category": "neutral", "sounds": [ - "process/carpenter/TwistBolt1" - ] - }, - - "updateResearch": { + "process/carpenter/TwistBolt1" + ] + }, + "updateResearch": { "category": "player", "sounds": [ - "updateResearch" - ] - }, - - "block.flipPage": { + "updateResearch" + ] + }, + "block.flipPage": { "category": "neutral", "sounds": [ - "process/research/FlipPage1", - "process/research/FlipPage2", - "process/research/FlipPage3", - "process/research/FlipPage4" - ] - }, - - "block.bellows": { + "process/research/FlipPage1", + "process/research/FlipPage2", + "process/research/FlipPage3", + "process/research/FlipPage4" + ] + }, + "block.bellows": { "category": "neutral", "sounds": [ - "blocks/Bellows" - ] - }, - - "mob.dragon.say": { + "blocks/Bellows" + ] + }, + "mob.dragon.say": { "category": "neutral", "sounds": [ - "monster/dragon/dragon_say1", - "monster/dragon/dragon_say2", - "monster/dragon/dragon_say3" - ] - }, - - "mob.dragon.bite": { + "monster/dragon/dragon_say1", + "monster/dragon/dragon_say2", + "monster/dragon/dragon_say3" + ] + }, + "mob.dragon.bite": { "category": "neutral", "sounds": [ - "monster/dragon/dragon_bite1", - "monster/dragon/dragon_bite2", - "monster/dragon/dragon_bite3" - ] - }, - - "mob.dragon.hurt": { + "monster/dragon/dragon_bite1", + "monster/dragon/dragon_bite2", + "monster/dragon/dragon_bite3" + ] + }, + "mob.dragon.hurt": { "category": "neutral", "sounds": [ - "monster/dragon/dragon_hurt1" - ] - }, - - "mob.dragon.fire": { + "monster/dragon/dragon_hurt1" + ] + }, + "mob.dragon.fire": { "category": "neutral", "sounds": [ - "monster/dragon/dragon_fire1" - ] - }, - - "mob.dragon.step": { + "monster/dragon/dragon_fire1" + ] + }, + "mob.dragon.step": { "category": "neutral", "sounds": [ - "monster/dragon/dragon_step1" - ] - }, - - "mob.minotaur.say": { + "monster/dragon/dragon_step1" + ] + }, + "mob.minotaur.say": { "category": "neutral", "sounds": [ - "monster/minotaur/minotaur_say1" - ] - }, - - "mob.minotaur.hurt": { + "monster/minotaur/minotaur_say1" + ] + }, + "mob.minotaur.hurt": { "category": "neutral", "sounds": [ - "monster/minotaur/minotaur_hurt1" - ] - }, - - "mob.minotaur.death": { + "monster/minotaur/minotaur_hurt1" + ] + }, + "mob.minotaur.death": { "category": "neutral", "sounds": [ - "monster/minotaur/minotaur_death1" - ] - }, - - "block.furnace_open": { + "monster/minotaur/minotaur_death1" + ] + }, + "block.furnace_open": { "category": "block", "sounds": [ - "blocks/furnace_open" - ] - }, - - "block.furnace_close": { + "blocks/furnace_open" + ] + }, + "block.furnace_close": { "category": "block", "sounds": [ - "blocks/furnace_close" - ] - }, - - "entity.cogwork.idle": { + "blocks/furnace_close" + ] + }, + "entity.cogwork.idle": { "category": "neutral", "sounds": [ - "entity/cogwork_idle0", - "entity/cogwork_idle1", - "entity/cogwork_idle2" - ] - }, - - "entity.cogwork.toot": { + "entity/cogwork_idle0", + "entity/cogwork_idle1", + "entity/cogwork_idle2" + ] + }, + "entity.cogwork.toot": { "category": "neutral", "sounds": [ - "entity/cogwork_toot" - ] - } + "entity/cogwork_toot" + ] + } } \ No newline at end of file diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 0ca7c137..35a42cdc 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,16 +1,18 @@ [ -{ - "modid": "MineFantasy2", - "name": "Mine FantasyII", - "description": "NOTE: This is an incomplete mod, crafting has not been implemented. Make sure to have a recipe guide installed. Not all items are obtainable or balanced", - "version": "${version}", - "mcversion": "${mcversion}", - "url": "", - "updateUrl": "", - "authors": ["Anonymous"], - "credits": "-", - "logoFile": "", - "screenshots": [], - "dependencies": [] -} + { + "modid": "MineFantasy2", + "name": "Mine FantasyII", + "description": "NOTE: This is an incomplete mod, crafting has not been implemented. Make sure to have a recipe guide installed. Not all items are obtainable or balanced", + "version": "${version}", + "mcversion": "${mcversion}", + "url": "", + "updateUrl": "", + "authors": [ + "Anonymous" + ], + "credits": "-", + "logoFile": "", + "screenshots": [], + "dependencies": [] + } ] From 42cc787981dc04f03db6da7d92a8dd044828cd13 Mon Sep 17 00:00:00 2001 From: Sirse Date: Wed, 1 Nov 2017 15:28:07 +0700 Subject: [PATCH 080/101] Added Bloomery recipe removing action Also, fixed launch issue. --- .../mf2/api/armour/ArmourDesign.java | 10 ++- .../block/tileentity/TileEntityBloomery.java | 8 -- .../minetweaker/tweakers/Bloomery.java | 83 +++++++++++++++++-- 3 files changed, 84 insertions(+), 17 deletions(-) diff --git a/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java b/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java index 5bdd9a42..a7214e95 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java +++ b/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java @@ -3,9 +3,14 @@ import java.util.HashMap; public class ArmourDesign { + public static HashMap designs = new HashMap(); + public static final String light = "light"; public static final String medium = "medium"; public static final String heavy = "heavy"; + // Weight: Above 50kg slows down and increases stamina decay, and classes as + // heavy armour + // Bulk: Above 0.0 means it slows stamina regen // Reg Name Prot Dura Weight Bulk Ctg Bnt Png public static final ArmourDesign CLOTH = new ArmourDesign("clothing", "Clothing", 1.0F, 1.0F, 0F, 0.25F) .calibrateTraits(0.5F, 1.0F, 0.5F).setWeightGroup(light);// Weak @@ -34,10 +39,7 @@ public class ArmourDesign { .calibrateTraits(1.25F, 1.25F, 1.00F).setWeightGroup(heavy);// 40kg, Vulnerable to piercing public static final ArmourDesign COGWORK = new ArmourDesign("cogwork", "Cogwork", 4.0F, 8.0F, 30F, 2.00F) .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(heavy);// >120kg, Massive Protection - // Weight: Above 50kg slows down and increases stamina decay, and classes as - // heavy armour - // Bulk: Above 0.0 means it slows stamina regen - public static HashMap designs = new HashMap(); + // ArmourCalculator private String name; private float durability; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java index fbc83d53..9302acf3 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBloomery.java @@ -99,14 +99,6 @@ public void syncData() { return; NetworkUtils.sendToWatchers(new BloomeryPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); - /* - List players = ((WorldServer) worldObj).playerEntities; - for (int i = 0; i < players.size(); i++) { - EntityPlayer player = players.get(i); - ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, - new BloomeryPacket(this).generatePacket()); - } - */ } /** diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java index 81452455..428edc32 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java @@ -6,24 +6,53 @@ import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; import minetweaker.api.minecraft.MineTweakerMC; +import minetweaker.mc1710.item.MCItemStack; import net.minecraft.item.ItemStack; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + @ZenClass("mods.minefantasy.Bloomery") public class Bloomery { @ZenMethod public static void addRecipe(IItemStack result, IIngredient input) { - MineTweakerAPI.apply(new addBloomRecipe(result, input)); + MineTweakerAPI.apply(new AddRecipeAction(result, input)); } - public static class addBloomRecipe implements IUndoableAction { + @ZenMethod + public static void remove(IIngredient output, IIngredient input) { + if (output == null) + throw new IllegalArgumentException("Output value cannot be null"); + + HashMap recipeList = BloomRecipe.recipeList; + + List toRemove = new ArrayList(); + List toRemoveValues = new ArrayList(); + for (Map.Entry entry : recipeList.entrySet()) { + if (output.matches(new MCItemStack(entry.getValue())) + && (input == null || input.matches(new MCItemStack(entry.getKey())))) { + toRemove.add(entry.getKey()); + toRemoveValues.add(entry.getValue()); + } + } + if (!toRemove.isEmpty()) { + MineTweakerAPI.apply(new RemoveAction(toRemove, toRemoveValues)); + } else { + MineTweakerAPI.logWarning("No bloomery recipes for " + output.toString()); + } + } + + private static class AddRecipeAction implements IUndoableAction { IItemStack result; IIngredient input; - public addBloomRecipe(IItemStack result, IIngredient input) { + public AddRecipeAction(IItemStack result, IIngredient input) { this.result = result; this.input = input; } @@ -38,7 +67,7 @@ public void apply() { @Override public String describe() { - return "Adding Bloomery Recipe That Results In " + result.getDisplayName(); + return "Adding bloomery recipe for " + result.getDisplayName(); } @Override @@ -53,7 +82,7 @@ public boolean canUndo() { @Override public String describeUndo() { - return "STAHP UNDOOOOIN MAH RECIPES"; + return "Removing furnace recipe for " + result.getDisplayName(); } @Override @@ -63,4 +92,48 @@ public void undo() { } + private static class RemoveAction implements IUndoableAction { + private final List items; + private final List values; + + public RemoveAction(List items, List values) { + this.items = items; + this.values = values; + } + + @Override + public void apply() { + for (ItemStack item : items) { + BloomRecipe.recipeList.remove(item); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + for (int i = 0; i < items.size(); i++) { + BloomRecipe.recipeList.put(items.get(i), values.get(i)); + } + } + + @Override + public String describe() { + return "Removing " + items.size() + " bloomery recipes"; + } + + @Override + public String describeUndo() { + return "Restoring " + items.size() + " bloomery recipes"; + } + + @Override + public Object getOverrideKey() { + return null; + } + } + } From 10e5c5e6b706ba7523801544fcb5b0ff26ce30a6 Mon Sep 17 00:00:00 2001 From: Sirse Date: Thu, 2 Nov 2017 02:00:44 +0700 Subject: [PATCH 081/101] Travis CI deployment --- .travis.yml | 10 ++++++++++ .../minetweaker/tweakers/Fuels.java | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Fuels.java diff --git a/.travis.yml b/.travis.yml index b3e9ac54..675c11dc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,5 +20,15 @@ install: script: - ./gradlew build +deploy: + provider: releases + api_key: + secure: "eAH5VmzD1reEhytSz4vx37IehXfG4IiV3QAEGBvK0xCN3OW/9se6U80t/ymIOKpsxvSlTyuOF/yJ4Q6+VsUl0SjFhu93k3lgoO2iT39NIvnAR6R/cN+vWGUX7kjKV6+h1n71vFV6ok4k8GXqPNDits6DMg97j5lX0w5IUDzoCkz8sTE5ScmJFoMeG+jlETnSsmvkwZabdkta+KzpYDolzAHQ5VbBb0/gu9rSF56fxyXySs8D441eSY0Gc2vl5VC0pHVW0jlfXiGo+Njsb0SuGR2bqbIj122X6dk1rH1u2rYml7QW+jA3MWpPk8CRuRlI2yMnlf4yLRfIgnwa5PLOakici5vAlIvufHaEn16QOc1SpNO/LHRWvAtDCoUJARMrnjaWqGOguuEvhqoXEvl8OfX4CCwoaHGJ5O826G6qS8BjQbfxT6Ew8LZZzWqDhHPVfu3ySDquGNdXRrq8z3cKPkkg8ApLzPBaxDG0nf3AQDSxB/0wnYRZYKmii2wsWSbyC6AqaI1l24pocsCMV2hL1MBtouNl3nheTwfBaEbxVC/CzrTfSlGO0tyD+6oRRH9mRX+ZAWl+Evua7OmVNeVBZhbYVeInJGfwzjjAqCgbumOMcHqomkevEaCWqDU3wjExNL5USlwEh22yq9+uwAZDbio8UcgViMiFWkAIdwLEOMg=" + file_glob: true + file: $HOME/build/libs/* + skip_cleanup: true + on: + tags: true + notifications: email: false \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Fuels.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Fuels.java new file mode 100644 index 00000000..95316c52 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Fuels.java @@ -0,0 +1,20 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minetweaker.api.item.IItemStack; +import net.minecraftforge.oredict.OreDictionary; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.minefantasy.Fuel") +public class Fuels { + + @ZenMethod + public static void addCarbon(IItemStack stack, int uses) { + + } + + public static class addFuelAction { + + } + +} From b5591a321140f34251973fd4ffe6e24023f75f5c Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 5 Nov 2017 18:43:57 +0700 Subject: [PATCH 082/101] Recipe system changes Overwritten Quern recipes: Now Quern supports custom MT recipes, recipes can be added without claypot. NEI Handler for Quern are overwritten (a lot faster now). Added MT removing function for Tanning Rack --- .../minefantasy/mf2/api/MineFantasyAPI.java | 10 ++- .../mf2/api/crafting/refine/QuernRecipes.java | 47 +++++++----- .../mf2/block/tileentity/TileEntityQuern.java | 16 ++-- .../mf2/integration/minetweaker/MTCompat.java | 2 +- .../helpers/MaterialExpansion.java | 13 +++- .../minetweaker/tweakers/Anvil.java | 4 +- .../minetweaker/tweakers/Quern.java | 75 +++++++++++++++++++ .../minetweaker/tweakers/TanningRack.java | 71 +++++++++++++++++- .../integration/nei/RecipeHandlerQuern.java | 67 +++++------------ .../mf2/recipe/CarpenterRecipes.java | 30 ++++---- 10 files changed, 231 insertions(+), 104 deletions(-) create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java diff --git a/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java b/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java index a1d792ea..a083a165 100644 --- a/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java +++ b/src/main/java/minefantasy/mf2/api/MineFantasyAPI.java @@ -535,7 +535,15 @@ public static CookRecipe addCookingRecipe(ItemStack input, ItemStack output, Ite } public static QuernRecipes addQuernRecipe(ItemStack input, ItemStack output) { - return QuernRecipes.addRecipe(input, output, 1); + return addQuernRecipe(input, output, 1, true); + } + + public static QuernRecipes addQuernRecipe(ItemStack input, ItemStack output, int tier) { + return addQuernRecipe(input, output, tier, true); + } + + public static QuernRecipes addQuernRecipe(ItemStack input, ItemStack output, int tier, boolean consumePot) { + return QuernRecipes.addRecipe(input, output, tier, consumePot); } public static BigFurnaceRecipes addFurnaceRecipe(ItemStack input, ItemStack output, int tier) { diff --git a/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java index fb959956..b6fbe4ae 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java @@ -1,45 +1,52 @@ package minefantasy.mf2.api.crafting.refine; -import minefantasy.mf2.api.helpers.CustomToolHelper; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -import java.util.HashMap; +import java.util.ArrayList; public class QuernRecipes { - public static HashMap recipeList = new HashMap(); - public final ItemStack result; + public static ArrayList recipeList = new ArrayList(); + public final ItemStack input, result; + public final boolean consumePot; public final int tier; - public QuernRecipes(ItemStack input, ItemStack output, int tier) { + public QuernRecipes(ItemStack input, ItemStack output, int tier, boolean consumePot) { + this.input = input; this.result = output; + this.consumePot = consumePot; this.tier = tier; } - public static QuernRecipes addRecipe(Block input, ItemStack output, int tier) { - return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); + public static QuernRecipes addRecipe(Block input, ItemStack output, int tier, boolean consumePot) { + return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier, consumePot); } - public static QuernRecipes addRecipe(Item input, ItemStack output, int tier) { - return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier); + public static QuernRecipes addRecipe(Item input, ItemStack output, int tier, boolean consumePot) { + return addRecipe(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, tier, consumePot); } - public static QuernRecipes addRecipe(ItemStack input, ItemStack output, int tier) { - QuernRecipes recipe = new QuernRecipes(input, output, tier); - recipeList.put(CustomToolHelper.getReferenceName(input), recipe); + public static QuernRecipes addRecipe(ItemStack input, ItemStack output, int tier, boolean consumePot) { + QuernRecipes recipe = new QuernRecipes(input, output, tier, consumePot); + recipeList.add(recipe); return recipe; } public static QuernRecipes getResult(ItemStack input) { - if (input == null) - return null; - - QuernRecipes specific = recipeList.get(CustomToolHelper.getReferenceName(input)); - if (specific != null) - return specific; + if (input != null) { + for (QuernRecipes recipes : recipeList) { + if (doesMatch(input, recipes.input)) { + return recipes; + } + } + } + return null; + } - return recipeList.get(CustomToolHelper.getReferenceName(input, "any")); + private static boolean doesMatch(ItemStack item1, ItemStack item2) { + return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE + || item2.getItemDamage() == item1.getItemDamage()); } -} +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java index a95b896c..5fcce6d0 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java @@ -12,12 +12,9 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; -import java.util.Random; - public class TileEntityQuern extends TileEntity implements IInventory, ISidedInventory { public int turnAngle; - private ItemStack[] inv = new ItemStack[3]; - private Random rand = new Random(); + private ItemStack[] inv = new ItemStack[3]; //0 input, 1 pot, 2 output private int postUseTicks; public static final int getMaxRevs() { @@ -68,11 +65,11 @@ public boolean onUse(EntityPlayer user) { public boolean onRevolutionComplete() { QuernRecipes result = this.getResult(inv[0]); - if (result != null && inv[1] != null && result.tier <= getTier()) { + if (result != null && (!result.consumePot || inv[1] != null) && result.tier <= getTier()) { ItemStack craft = result.result; if (canFitResult(craft)) { if (!worldObj.isRemote) { - return tryCraft(craft); + return tryCraft(craft, result.consumePot); } else { worldObj.spawnParticle("smoke", xCoord + 0.5F, yCoord + 1F, zCoord + 0.5F, 0F, 0.2F, 0F); return true; @@ -100,7 +97,7 @@ private boolean canFitResult(ItemStack result) { return true; } - private boolean tryCraft(ItemStack result) { + private boolean tryCraft(ItemStack result, boolean consumePot) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.craftprimitive", 0.5F, 1.2F); /* * if(rand.nextFloat() > 0.20F)//20% success rate { @@ -109,8 +106,9 @@ private boolean tryCraft(ItemStack result) { */ { this.decrStackSize(0, 1); - this.decrStackSize(1, 1); - + if(consumePot) { + this.decrStackSize(1, 1); + } ItemStack out = inv[2]; if (out == null) { this.setInventorySlotContents(2, result.copy()); diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java index d0402303..18eecfb5 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -12,7 +12,7 @@ public class MTCompat { private static final Class[] tweakers = {Anvil.class, Bloomery.class, CarpentersBench.class, CustomMaterialHandler.class, Crucible.class, - Forge.class, MaterialExpansion.class, TanningRack.class}; + Forge.class, MaterialExpansion.class, TanningRack.class, Quern.class}; public static void loadTweakers() { for (Class tweaker : tweakers) { diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java index 3c32fa47..2192291a 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java @@ -2,6 +2,7 @@ import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.material.CustomMaterial; +import minefantasy.mf2.material.MetalMaterial; import stanhebben.zenscript.annotations.ZenExpansion; import stanhebben.zenscript.annotations.ZenMethod; @@ -20,10 +21,14 @@ public static CustomMaterial setColor(CustomMaterial material, int r, int g, int @ZenMethod("setMeltingPoint") public static CustomMaterial setMeltingPoint(CustomMaterial material, float meltingPoint) { if (material != null) { - material.setMeltingPoint(meltingPoint); - int[] stats = material.getHeatableStats(); - MineFantasyAPI.setHeatableStats("ingot" + material.name, stats[0], stats[1], stats[2]); - MineFantasyAPI.setHeatableStats("hunk" + material.name, stats[0], stats[1], stats[2]); + if(material instanceof MetalMaterial) { + material.setMeltingPoint(meltingPoint); + int[] stats = material.getHeatableStats(); + MineFantasyAPI.setHeatableStats("ingot" + material.name, stats[0], stats[1], stats[2]); + MineFantasyAPI.setHeatableStats("hunk" + material.name, stats[0], stats[1], stats[2]); + } else { + throw new IllegalArgumentException("Method setMeltingPoint can be applied only to Metal materials!"); + } } return material; } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java index 2c6b37e9..2c984747 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java @@ -109,7 +109,5 @@ public String describeUndo() { public void undo() { CraftingManagerAnvil.getInstance().recipes.remove(r); } - } - -} +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java new file mode 100644 index 00000000..23783d6c --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java @@ -0,0 +1,75 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.crafting.refine.QuernRecipes; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.ZenMethod; + +public class Quern { + + @ZenMethod + public static void addRecipe(IItemStack result, IIngredient input) { + MineTweakerAPI.apply(new AddRecipeAction(result, input, 0, true)); + } + + @ZenMethod + public static void addRecipe(IItemStack result, IIngredient input, int tier) { + MineTweakerAPI.apply(new AddRecipeAction(result, input, tier, true)); + } + + @ZenMethod + public static void addRecipe(IItemStack result, IIngredient input, int tier, boolean consumePot) { + MineTweakerAPI.apply(new AddRecipeAction(result, input, tier, consumePot)); + } + + private static class AddRecipeAction implements IUndoableAction { + IItemStack result; + IIngredient input; + int tier; + boolean consumePot; + + public AddRecipeAction(IItemStack result, IIngredient input, int tier, boolean consumePot) { + this.result = result; + this.input = input; + this.tier = tier; + this.consumePot = consumePot; + } + + @Override + public void apply() { + for (IItemStack stack : input.getItems()) { + ItemStack s = MineTweakerMC.getItemStack(stack); + QuernRecipes.addRecipe(s, MineTweakerMC.getItemStack(result), this.tier, consumePot); + } + } + + @Override + public boolean canUndo() { + return false; + } + + @Override + public void undo() { + + } + + @Override + public String describe() { + return null; + } + + @Override + public String describeUndo() { + return null; + } + + @Override + public Object getOverrideKey() { + return null; + } + } +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java index f59149cc..7b4a0d95 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java @@ -1,15 +1,20 @@ package minefantasy.mf2.integration.minetweaker.tweakers; import minefantasy.mf2.api.crafting.tanning.TanningRecipe; +import minetweaker.IUndoableAction; import minetweaker.MineTweakerAPI; import minetweaker.OneWayAction; import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; import minetweaker.api.minecraft.MineTweakerMC; +import minetweaker.mc1710.item.MCItemStack; import net.minecraft.item.ItemStack; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; +import java.util.ArrayList; +import java.util.List; + @ZenClass("mods.minefantasy.TanningRack") public class TanningRack { @@ -23,8 +28,29 @@ public static void addTieredAndToolRecipe(IItemStack output, IIngredient input, MineTweakerAPI.apply(new TanningAction(output, input, time, tier, tool)); } - public static class TanningAction extends OneWayAction { + @ZenMethod + public static void remove(IItemStack output, IIngredient input) { + if (output == null) + throw new IllegalArgumentException("Output value cannot be null"); + + ArrayList recipeList = TanningRecipe.recipeList; + List recipesToRemove = new ArrayList(); + + for (TanningRecipe recipe : recipeList) { + if (output.matches(new MCItemStack(recipe.output)) && (input == null || input.matches(new MCItemStack(recipe.input)))) { + recipesToRemove.add(recipe); + } + } + + if (recipesToRemove.isEmpty()) { + MineTweakerAPI.logWarning("No tanning rack recipes for " + output.toString()); + return; + } + + MineTweakerAPI.apply(new RemoveAction(recipesToRemove)); + } + public static class TanningAction extends OneWayAction { IItemStack output; IIngredient input; float time; @@ -59,4 +85,45 @@ public Object getOverrideKey() { } -} + public static class RemoveAction implements IUndoableAction { + private final List recipes; + + public RemoveAction(List recipes) { + this.recipes = recipes; + } + + @Override + public void apply() { + for (TanningRecipe recipe : recipes) { + TanningRecipe.recipeList.remove(recipe); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + for (TanningRecipe recipe : recipes) { + TanningRecipe.recipeList.add(recipe); + } + } + + @Override + public String describe() { + return "Removing " + recipes.size() + " tanning rack recipes"; + } + + @Override + public String describeUndo() { + return "Restoring " + recipes.size() + " tanning rack recipes"; + } + + @Override + public Object getOverrideKey() { + return null; + } + } +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java index 727574f0..30af7731 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java @@ -15,17 +15,6 @@ public class RecipeHandlerQuern extends TemplateRecipeHandler { - private static ArrayList recipeList; - - @Override - public TemplateRecipeHandler newInstance() { - if (recipeList == null || recipeList.isEmpty()) { - fillRecipeList(); - } - - return super.newInstance(); - } - @Override public String getRecipeName() { return StatCollector.translateToLocal("method.quern"); @@ -50,9 +39,9 @@ public void drawBackground(int recipe) { @Override public void loadCraftingRecipes(ItemStack result) { - for (RecipePair recipeInpit : recipeList) { - if (CustomToolHelper.areEqual(recipeInpit.outputStack, result)) { - CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipeInpit.inputStack, result); + for(QuernRecipes recipe : QuernRecipes.recipeList) { + if(CustomToolHelper.areEqual(recipe.result, result)) { + CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipe); arecipes.add(cachedRecipe); } } @@ -62,9 +51,8 @@ public void loadCraftingRecipes(ItemStack result) { public void loadUsageRecipes(ItemStack ingredient) { if (ingredient != null) { if (ingredient.getItem().equals(ComponentListMF.clay_pot)) { - for (RecipePair recipePair : recipeList) { - CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipePair.inputStack, - recipePair.outputStack); + for (QuernRecipes recipe : QuernRecipes.recipeList) { + CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipe); arecipes.add(cachedRecipe); } return; @@ -72,57 +60,38 @@ public void loadUsageRecipes(ItemStack ingredient) { QuernRecipes output = QuernRecipes.getResult(ingredient); if (output != null) { - CachedQuernRecipe recipe = new CachedQuernRecipe(ingredient, output.result); + CachedQuernRecipe recipe = new CachedQuernRecipe(output); arecipes.add(recipe); } } } - private void fillRecipeList() { - recipeList = new ArrayList(); - for (ItemStack item : ItemList.items) { - QuernRecipes tempRecipe = QuernRecipes.getResult(item); - if (tempRecipe != null) { - recipeList.add(new RecipePair(item, tempRecipe.result)); - } - } - } - - private static class RecipePair { - private ItemStack inputStack; - private ItemStack outputStack; - - private RecipePair(ItemStack input, ItemStack output) { - inputStack = input; - outputStack = output; - } - } - private class CachedQuernRecipe extends CachedRecipe { + private ItemStack input, output; + private boolean consumePot; - private PositionedStack resultStack; - private PositionedStack potStack; - private PositionedStack inputStack; - - private CachedQuernRecipe(ItemStack ingredient, ItemStack result) { - inputStack = new PositionedStack(ingredient, 76, 9); - potStack = new PositionedStack(new ItemStack(ComponentListMF.clay_pot), 76, 32); - resultStack = new PositionedStack(result, 76, 55); + private CachedQuernRecipe(QuernRecipes recipe) { + input = recipe.input; + output = recipe.result; + consumePot = recipe.consumePot; } @Override public PositionedStack getIngredient() { - return inputStack; + return new PositionedStack(input, 76, 9); } @Override public PositionedStack getOtherStack() { - return potStack; + if(consumePot) { + return new PositionedStack(new ItemStack(ComponentListMF.clay_pot), 76, 32); + } + return null; } @Override public PositionedStack getResult() { - return resultStack; + return new PositionedStack(output, 76, 55); } } } diff --git a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java index 13ba4ac8..5110077e 100644 --- a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java @@ -288,29 +288,29 @@ public static void assembleWoodBasic() { } private static void addDusts() { - QuernRecipes.addRecipe(new ItemStack(Items.dye, 1, 3), new ItemStack(FoodListMF.coca_powder), 0);// ItemDye - QuernRecipes.addRecipe(Items.wheat, new ItemStack(FoodListMF.flour), 0); - QuernRecipes.addRecipe(Items.reeds, new ItemStack(FoodListMF.sugarpot), 0); - QuernRecipes.addRecipe(FoodListMF.breadroll, new ItemStack(FoodListMF.breadcrumbs), 0); + QuernRecipes.addRecipe(new ItemStack(Items.dye, 1, 3), new ItemStack(FoodListMF.coca_powder), 0, true);// ItemDye + QuernRecipes.addRecipe(Items.wheat, new ItemStack(FoodListMF.flour), 0, true); + QuernRecipes.addRecipe(Items.reeds, new ItemStack(FoodListMF.sugarpot), 0, true); + QuernRecipes.addRecipe(FoodListMF.breadroll, new ItemStack(FoodListMF.breadcrumbs), 0, true); QuernRecipes.addRecipe(FoodListMF.generic_meat_uncooked, new ItemStack(FoodListMF.generic_meat_mince_uncooked), - 0); + 0, true); QuernRecipes.addRecipe(FoodListMF.generic_meat_strip_uncooked, - new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); + new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0, true); QuernRecipes.addRecipe(FoodListMF.generic_meat_chunk_uncooked, - new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0); - QuernRecipes.addRecipe(FoodListMF.generic_meat_cooked, new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); + new ItemStack(FoodListMF.generic_meat_mince_uncooked), 0, true); + QuernRecipes.addRecipe(FoodListMF.generic_meat_cooked, new ItemStack(FoodListMF.generic_meat_mince_cooked), 0, true); QuernRecipes.addRecipe(FoodListMF.generic_meat_strip_cooked, - new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); + new ItemStack(FoodListMF.generic_meat_mince_cooked), 0, true); QuernRecipes.addRecipe(FoodListMF.generic_meat_chunk_cooked, - new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); + new ItemStack(FoodListMF.generic_meat_mince_cooked), 0, true); - QuernRecipes.addRecipe(Items.coal, new ItemStack(ComponentListMF.coalDust), 0); - QuernRecipes.addRecipe(new ItemStack(Items.coal, 1, 1), new ItemStack(ComponentListMF.coalDust), 0); - QuernRecipes.addRecipe(ComponentListMF.kaolinite, new ItemStack(ComponentListMF.kaolinite_dust), 0); - QuernRecipes.addRecipe(Items.flint, new ItemStack(ComponentListMF.shrapnel), 0); + QuernRecipes.addRecipe(Items.coal, new ItemStack(ComponentListMF.coalDust), 0, true); + QuernRecipes.addRecipe(new ItemStack(Items.coal, 1, 1), new ItemStack(ComponentListMF.coalDust), 0, true); + QuernRecipes.addRecipe(ComponentListMF.kaolinite, new ItemStack(ComponentListMF.kaolinite_dust), 0, true); + QuernRecipes.addRecipe(Items.flint, new ItemStack(ComponentListMF.shrapnel), 0, true); - QuernRecipes.addRecipe(ComponentListMF.flux, new ItemStack(ComponentListMF.flux_pot), 0); + QuernRecipes.addRecipe(ComponentListMF.flux, new ItemStack(ComponentListMF.flux_pot), 0, true); KnowledgeListMF.pieTrayRecipe = MineFantasyAPI.addCarpenterRecipe(null, new ItemStack(ComponentListMF.pie_tray_uncooked), "", basic, "hands", -1, 10, From 45a5ce3490df1cae99dcb0e6d93ac996391e0d73 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 10 Nov 2017 01:49:08 +0700 Subject: [PATCH 083/101] 60% of MT integration are done --- .../java/minefantasy/mf2/MineFantasyII.java | 5 + .../minefantasy/mf2/api/crafting/Salvage.java | 7 +- .../mf2/api/crafting/refine/QuernRecipes.java | 6 +- .../mf2/block/tileentity/TileEntityQuern.java | 26 +++--- .../mf2/integration/minetweaker/MTCompat.java | 29 ++++-- .../minetweaker/helpers/MTCommands.java | 33 +++++++ .../minetweaker/tweakers/Bloomery.java | 2 +- .../tweakers/CustomMaterialHandler.java | 19 +--- .../minetweaker/tweakers/Quern.java | 91 +++++++++++++++++-- .../minetweaker/tweakers/SalvageTweaker.java | 69 ++++++++++++++ 10 files changed, 233 insertions(+), 54 deletions(-) create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MTCommands.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 477ec6fb..9d9c677f 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -36,6 +36,7 @@ import minefantasy.mf2.util.BukkitUtils; import minefantasy.mf2.util.MFLogUtil; import minefantasy.mf2.util.XSTRandom; +import minetweaker.MineTweakerAPI; import net.minecraft.init.Items; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.MinecraftForge; @@ -194,6 +195,10 @@ public final void serverStarted(FMLServerStartedEvent event) { MFLogUtil.log("Bukkit has been detected"); BukkitUtils.onServerStarted(); } + + if (Loader.isModLoaded("MineTweaker3") && ConfigIntegration.mtIntegration) { + MTCompat.registerCommands(); + } } private void registerBiomeStuff(BiomeGenBase biome) { diff --git a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java index 98f43a92..a6b4110f 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java +++ b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java @@ -2,6 +2,7 @@ import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.util.MFLogUtil; +import minefantasy.mf2.util.XSTRandom; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -14,9 +15,9 @@ import java.util.Random; public class Salvage { - private static Random random = new Random(); - private static HashMap salvageList = new HashMap(); - private static HashMap sharedSalvage = new HashMap(); + private static XSTRandom random = new XSTRandom(); + public static HashMap salvageList = new HashMap(); + public static HashMap sharedSalvage = new HashMap(); public static void shareSalvage(Item item1, Item item2) { sharedSalvage.put(CustomToolHelper.getSimpleReferenceName(item1), item2); diff --git a/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java index b6fbe4ae..e17de906 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java @@ -5,10 +5,10 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -import java.util.ArrayList; +import java.util.HashSet; public class QuernRecipes { - public static ArrayList recipeList = new ArrayList(); + public static HashSet recipeList = new HashSet(); public final ItemStack input, result; public final boolean consumePot; public final int tier; @@ -45,7 +45,7 @@ public static QuernRecipes getResult(ItemStack input) { return null; } - private static boolean doesMatch(ItemStack item1, ItemStack item2) { + public static boolean doesMatch(ItemStack item1, ItemStack item2) { return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE || item2.getItemDamage() == item1.getItemDamage()); } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java index 5fcce6d0..c3b5c2a0 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java @@ -100,23 +100,23 @@ private boolean canFitResult(ItemStack result) { private boolean tryCraft(ItemStack result, boolean consumePot) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.craftprimitive", 0.5F, 1.2F); /* - * if(rand.nextFloat() > 0.20F)//20% success rate { + * if(rand.nextFloat() > 0.20F)//20% success rate { * worldObj.playSoundEffect(xCoord, yCoord, zCoord, "dig.gravel", 1.0F, 0.5F); * return false; } else */ - { - this.decrStackSize(0, 1); - if(consumePot) { - this.decrStackSize(1, 1); - } - ItemStack out = inv[2]; - if (out == null) { - this.setInventorySlotContents(2, result.copy()); - } else { - out.stackSize += result.stackSize; - } - return true; + + this.decrStackSize(0, 1); + if (consumePot) { + this.decrStackSize(1, 1); } + ItemStack out = inv[2]; + if (out == null) { + this.setInventorySlotContents(2, result.copy()); + } else { + out.stackSize += result.stackSize; + } + return true; + } @Override diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java index 18eecfb5..4d4da9bb 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -1,22 +1,37 @@ package minefantasy.mf2.integration.minetweaker; +import minefantasy.mf2.integration.minetweaker.helpers.MTCommands; import minefantasy.mf2.integration.minetweaker.helpers.MaterialExpansion; import minefantasy.mf2.integration.minetweaker.tweakers.*; +import minetweaker.IRecipeRemover; import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.minecraft.MineTweakerMC; -/* - * Based on @Coolmanzz2 MineFantasyTweaker mod - * https://github.com/Coolmanzz2/MineFantasyTweaker/ - */ - -public class MTCompat { +public class MTCompat /*implements IRecipeRemover */{ private static final Class[] tweakers = {Anvil.class, Bloomery.class, CarpentersBench.class, CustomMaterialHandler.class, Crucible.class, - Forge.class, MaterialExpansion.class, TanningRack.class, Quern.class}; + Forge.class, MaterialExpansion.class, TanningRack.class, Quern.class, SalvageTweaker.class}; + + private static final String[] COMMAND_DESC = { + " MineFantasy commands:", + " /minetweaker mf materials", + " Lists all MF materials" + }; public static void loadTweakers() { for (Class tweaker : tweakers) { MineTweakerAPI.registerClass(tweaker); } } + + public static void registerCommands() { + MineTweakerAPI.server.addMineTweakerCommand("mf", COMMAND_DESC, new MTCommands()); + } + + /* @Override + public void remove(IIngredient iIngredient) { + Bloomery.remove(iIngredient, null); + Quern.remove(iIngredient, null); + }*/ } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MTCommands.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MTCommands.java new file mode 100644 index 00000000..6de8d0db --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MTCommands.java @@ -0,0 +1,33 @@ +package minefantasy.mf2.integration.minetweaker.helpers; + +import minefantasy.mf2.api.material.CustomMaterial; +import minetweaker.MineTweakerAPI; +import minetweaker.MineTweakerImplementationAPI; +import minetweaker.api.player.IPlayer; +import minetweaker.api.server.ICommandFunction; +import scala.actors.threadpool.Arrays; + +import java.util.Map; + +public class MTCommands implements ICommandFunction { + + @Override + public void execute(String[] arguments, IPlayer player) { + if (arguments.length < 1) { + player.sendChat("Please, specify a MF command"); + return; + } + + if (arguments[0].equals("materials")) { + MineTweakerAPI.logCommand("MineFantasy materials list:"); + for (Map.Entry entry : CustomMaterial.materialList.entrySet()) { + CustomMaterial material = entry.getValue(); + MineTweakerAPI.logCommand(String.format(" %s (type: %s, color (RGB): %s, tier: %d, hardness: %f, durability: %f, flexibility: %f, sharpness: %f, resistance: %f, density: %f)", material.name, material.type, Arrays.toString(material.colourRGB),material.tier, material.hardness, material.durability, material.flexibility, material.sharpness, material.resistance, material.density)); + } + + if (player != null) { + player.sendChat(MineTweakerImplementationAPI.platform.getMessage("Materials list generated; see minetweaker.log in your minecraft dir")); + } + } + } +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java index 428edc32..b58aeab8 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java @@ -82,7 +82,7 @@ public boolean canUndo() { @Override public String describeUndo() { - return "Removing furnace recipe for " + result.getDisplayName(); + return "Removing bloomery recipe for " + result.getDisplayName(); } @Override diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java index 618df0f1..124a4385 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java @@ -1,8 +1,8 @@ package minefantasy.mf2.integration.minetweaker.tweakers; import minefantasy.mf2.api.material.CustomMaterial; -import minetweaker.IUndoableAction; import minetweaker.MineTweakerAPI; +import minetweaker.OneWayAction; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; @@ -22,7 +22,7 @@ public static CustomMaterial getMaterial(String materialName) { return CustomMaterial.getMaterial(materialName); } - private static class RegisterCustomMaterial implements IUndoableAction { + private static class RegisterCustomMaterial extends OneWayAction { private final String type, name; private final int tier; @@ -47,26 +47,11 @@ public void apply() { material = CustomMaterial.getMaterial(name) != null ? CustomMaterial.getMaterial(name) : new CustomMaterial(name, type, tier, hardness, durability, flexibility, resistance, sharpness, density).register(); } - @Override - public boolean canUndo() { - return false; - } - - @Override - public void undo() { - - } - @Override public String describe() { return "Registers custom material for MF crafting system"; } - @Override - public String describeUndo() { - return "Impossible to remove registered CustomMaterials!"; - } - @Override public Object getOverrideKey() { return null; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java index 23783d6c..4e2ed8ec 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java @@ -6,19 +6,24 @@ import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; import minetweaker.api.minecraft.MineTweakerMC; +import minetweaker.mc1710.item.MCItemStack; import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; +import java.util.ArrayList; + +@ZenClass("mods.minefantasy.Quern") public class Quern { @ZenMethod public static void addRecipe(IItemStack result, IIngredient input) { - MineTweakerAPI.apply(new AddRecipeAction(result, input, 0, true)); + addRecipe(result, input, 0, true); } @ZenMethod public static void addRecipe(IItemStack result, IIngredient input, int tier) { - MineTweakerAPI.apply(new AddRecipeAction(result, input, tier, true)); + addRecipe(result, input, tier, true); } @ZenMethod @@ -26,11 +31,32 @@ public static void addRecipe(IItemStack result, IIngredient input, int tier, boo MineTweakerAPI.apply(new AddRecipeAction(result, input, tier, consumePot)); } + @ZenMethod + public static void remove(IIngredient result){ + remove(result, null); + } + + @ZenMethod + public static void remove(IIngredient result, IIngredient input) { + if (result == null) + throw new IllegalArgumentException("Output value cannot be null"); + + ArrayList recipesToRemove = new ArrayList(); + for (QuernRecipes recipes : QuernRecipes.recipeList) { + if (result.matches(new MCItemStack(recipes.result)) && (input == null || input.matches(new MCItemStack(recipes.input)))) { + recipesToRemove.add(recipes); + } + } + + MineTweakerAPI.apply(new RemoveAction(recipesToRemove)); + } + private static class AddRecipeAction implements IUndoableAction { - IItemStack result; - IIngredient input; - int tier; - boolean consumePot; + private final IItemStack result; + private final IIngredient input; + private final int tier; + private final boolean consumePot; + private final ArrayList recipesToRemove = new ArrayList(); public AddRecipeAction(IItemStack result, IIngredient input, int tier, boolean consumePot) { this.result = result; @@ -43,29 +69,74 @@ public AddRecipeAction(IItemStack result, IIngredient input, int tier, boolean c public void apply() { for (IItemStack stack : input.getItems()) { ItemStack s = MineTweakerMC.getItemStack(stack); - QuernRecipes.addRecipe(s, MineTweakerMC.getItemStack(result), this.tier, consumePot); + recipesToRemove.add(QuernRecipes.addRecipe(s, MineTweakerMC.getItemStack(result), this.tier, consumePot)); } } @Override public boolean canUndo() { - return false; + return true; } @Override public void undo() { - + for (QuernRecipes recipes : recipesToRemove) { + QuernRecipes.recipeList.remove(recipes); + } + recipesToRemove.clear(); } @Override public String describe() { - return null; + return "Adding quern recipe for " + result.getDisplayName(); } @Override public String describeUndo() { + return "Removing quern recipe for " + result.getDisplayName(); + } + + @Override + public Object getOverrideKey() { return null; } + } + + private static class RemoveAction implements IUndoableAction { + private final ArrayList recipesToRemove; + + public RemoveAction(ArrayList recipesToRemove) { + this.recipesToRemove = recipesToRemove; + } + + @Override + public void apply() { + for (QuernRecipes recipe : recipesToRemove) { + QuernRecipes.recipeList.remove(recipe); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + for (QuernRecipes recipe : recipesToRemove) { + QuernRecipes.recipeList.add(recipe); + } + } + + @Override + public String describe() { + return "Removing " + recipesToRemove.size() + " bloomery recipes"; + } + + @Override + public String describeUndo() { + return "Restoring " + recipesToRemove.size() + " bloomery recipes"; + } @Override public Object getOverrideKey() { diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java new file mode 100644 index 00000000..a87a2149 --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java @@ -0,0 +1,69 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.crafting.Salvage; +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +@ZenClass("mods.minefantasy.SalvageTweaker") +public class SalvageTweaker { + + @ZenMethod + public static void addSalvage(IItemStack output, IIngredient input) { + MineTweakerAPI.apply(new AddSalvageAction(output, input)); + } + + @ZenMethod + public static void shareSalvage() { + + } + + private static class AddSalvageAction implements IUndoableAction { + private final IItemStack output; + private final IIngredient input; + + public AddSalvageAction(IItemStack output, IIngredient input) { + this.output = output; + this.input = input; + } + + @Override + public void apply() { + for (IItemStack stack : input.getItems()) { + ItemStack s = MineTweakerMC.getItemStack(stack); + Salvage.addSalvage(s, MineTweakerMC.getItemStack(output)); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + Salvage.salvageList.remove(input); + } + + @Override + public String describe() { + return null; + } + + @Override + public String describeUndo() { + return null; + } + + @Override + public Object getOverrideKey() { + return null; + } + } +} From 00bcc8208d9ca44dde9b31af64ed8757eae06ca2 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 11 Nov 2017 01:28:25 +0700 Subject: [PATCH 084/101] Little bit more MT handlers Added Big furnace, Blast furnace and Cooking handlers. Added 2 minetweaker commands (mt mf materials and mt mf skills). --- .../java/minefantasy/mf2/MineFantasyII.java | 4 - .../mf2/api/cooking/CookRecipe.java | 2 +- .../mf2/api/crafting/refine/QuernRecipes.java | 8 +- .../api/crafting/tanning/TanningRecipe.java | 14 +-- .../mf2/api/refine/BigFurnaceRecipes.java | 3 +- .../minefantasy/mf2/api/rpg/RPGElements.java | 5 +- .../minetweaker/{helpers => }/MTCommands.java | 17 +++- .../mf2/integration/minetweaker/MTCompat.java | 35 +++++--- .../{ => helpers}/TweakedAlloyRecipe.java | 2 +- .../TweakedShapedAnvilRecipe.java | 2 +- .../{ => helpers}/TweakedShapedCBRecipes.java | 2 +- .../TweakedShapelessAnvilRecipe.java | 2 +- .../TweakedShapelessCBRecipes.java | 2 +- .../minetweaker/tweakers/Anvil.java | 4 +- .../minetweaker/tweakers/BigFurnace.java | 79 +++++++++++++++++ .../minetweaker/tweakers/BlastFurnace.java | 74 ++++++++++++++++ .../minetweaker/tweakers/Bloomery.java | 4 +- .../minetweaker/tweakers/CarpentersBench.java | 4 +- .../minetweaker/tweakers/Cooking.java | 85 +++++++++++++++++++ .../minetweaker/tweakers/Crucible.java | 2 +- .../minetweaker/tweakers/Forge.java | 13 ++- .../minetweaker/tweakers/Quern.java | 38 +++------ .../minetweaker/tweakers/SalvageTweaker.java | 42 +++++++-- .../minetweaker/tweakers/TanningRack.java | 51 ++++++----- .../mf2/network/CommonProxyMF.java | 8 ++ src/main/java/minefantasy/mf2/util/Utils.java | 13 +++ 26 files changed, 410 insertions(+), 105 deletions(-) rename src/main/java/minefantasy/mf2/integration/minetweaker/{helpers => }/MTCommands.java (52%) rename src/main/java/minefantasy/mf2/integration/minetweaker/{ => helpers}/TweakedAlloyRecipe.java (97%) rename src/main/java/minefantasy/mf2/integration/minetweaker/{ => helpers}/TweakedShapedAnvilRecipe.java (98%) rename src/main/java/minefantasy/mf2/integration/minetweaker/{ => helpers}/TweakedShapedCBRecipes.java (98%) rename src/main/java/minefantasy/mf2/integration/minetweaker/{ => helpers}/TweakedShapelessAnvilRecipe.java (98%) rename src/main/java/minefantasy/mf2/integration/minetweaker/{ => helpers}/TweakedShapelessCBRecipes.java (98%) create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/BigFurnace.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/BlastFurnace.java create mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Cooking.java create mode 100644 src/main/java/minefantasy/mf2/util/Utils.java diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 9d9c677f..506e7a95 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -152,10 +152,6 @@ public void load(FMLInitializationEvent evt) { eventChannel.register(packetHandler); packetHandler.channels.put(channel, eventChannel); } - - if (Loader.isModLoaded("MineTweaker3") && ConfigIntegration.mtIntegration) { - MTCompat.loadTweakers(); - } } @EventHandler diff --git a/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java b/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java index a9a6bef6..067a3c46 100644 --- a/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java +++ b/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java @@ -9,7 +9,7 @@ import java.util.HashMap; public class CookRecipe { - private static final HashMap recipeList = new HashMap(); + public static final HashMap recipeList = new HashMap(); public static Item burnt_food = null; public static boolean canCookBasics = true; public final int maxTemperature, minTemperature, time; diff --git a/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java index e17de906..f3ee6647 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/refine/QuernRecipes.java @@ -1,5 +1,6 @@ package minefantasy.mf2.api.crafting.refine; +import minefantasy.mf2.util.Utils; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -37,16 +38,11 @@ public static QuernRecipes addRecipe(ItemStack input, ItemStack output, int tier public static QuernRecipes getResult(ItemStack input) { if (input != null) { for (QuernRecipes recipes : recipeList) { - if (doesMatch(input, recipes.input)) { + if (Utils.doesMatch(input, recipes.input)) { return recipes; } } } return null; } - - public static boolean doesMatch(ItemStack item1, ItemStack item2) { - return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE - || item2.getItemDamage() == item1.getItemDamage()); - } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java b/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java index 82296d81..10885d94 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java +++ b/src/main/java/minefantasy/mf2/api/crafting/tanning/TanningRecipe.java @@ -23,16 +23,18 @@ public TanningRecipe(ItemStack input, float time, int tier, String toolType, Ite this.toolType = toolType; } - public static void addRecipe(Object input, float time, ItemStack output) { - addRecipe(input, time, -1, output); + public static TanningRecipe addRecipe(Object input, float time, ItemStack output) { + return addRecipe(input, time, -1, output); } - public static void addRecipe(Object input, float time, int tier, ItemStack output) { - addRecipe(input, time, tier, "knife", output); + public static TanningRecipe addRecipe(Object input, float time, int tier, ItemStack output) { + return addRecipe(input, time, tier, "knife", output); } - public static void addRecipe(Object input, float time, int tier, String toolType, ItemStack output) { - recipeList.add(new TanningRecipe(convertItem(input), time, tier, toolType, output)); + public static TanningRecipe addRecipe(Object input, float time, int tier, String toolType, ItemStack output) { + TanningRecipe recipe = new TanningRecipe(convertItem(input), time, tier, toolType, output); + recipeList.add(recipe); + return recipe; } public static ItemStack convertItem(Object input) { diff --git a/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java b/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java index e87a9b4e..9c6bee90 100644 --- a/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java +++ b/src/main/java/minefantasy/mf2/api/refine/BigFurnaceRecipes.java @@ -10,10 +10,11 @@ public class BigFurnaceRecipes { public static HashMap recipeList = new HashMap(); - public final ItemStack result; + public final ItemStack input, result; public final int tier; public BigFurnaceRecipes(ItemStack input, ItemStack output, int tier) { + this.input = input; this.result = output; this.tier = tier; } diff --git a/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java b/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java index a0e724b5..8ff55c00 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java +++ b/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java @@ -1,6 +1,7 @@ package minefantasy.mf2.api.rpg; import minefantasy.mf2.api.helpers.PlayerTagData; +import minefantasy.mf2.util.XSTRandom; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -14,8 +15,8 @@ public class RPGElements { public static float levelSpeedModifier = 1.0F; public static float levelUpModifier = 1.5F; private static HashMap skillsMap = new HashMap(); - private static ArrayList skillsList = new ArrayList(); - private static Random rand = new Random(); + public static ArrayList skillsList = new ArrayList(); + private static XSTRandom rand = new XSTRandom(); static { if (isSystemActive) { diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MTCommands.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCommands.java similarity index 52% rename from src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MTCommands.java rename to src/main/java/minefantasy/mf2/integration/minetweaker/MTCommands.java index 6de8d0db..20a64a92 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MTCommands.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCommands.java @@ -1,6 +1,8 @@ -package minefantasy.mf2.integration.minetweaker.helpers; +package minefantasy.mf2.integration.minetweaker; import minefantasy.mf2.api.material.CustomMaterial; +import minefantasy.mf2.api.rpg.RPGElements; +import minefantasy.mf2.api.rpg.Skill; import minetweaker.MineTweakerAPI; import minetweaker.MineTweakerImplementationAPI; import minetweaker.api.player.IPlayer; @@ -22,12 +24,23 @@ public void execute(String[] arguments, IPlayer player) { MineTweakerAPI.logCommand("MineFantasy materials list:"); for (Map.Entry entry : CustomMaterial.materialList.entrySet()) { CustomMaterial material = entry.getValue(); - MineTweakerAPI.logCommand(String.format(" %s (type: %s, color (RGB): %s, tier: %d, hardness: %f, durability: %f, flexibility: %f, sharpness: %f, resistance: %f, density: %f)", material.name, material.type, Arrays.toString(material.colourRGB),material.tier, material.hardness, material.durability, material.flexibility, material.sharpness, material.resistance, material.density)); + MineTweakerAPI.logCommand(String.format(" %s (type: %s, color (RGB): %s, tier: %d, hardness: %.2f, durability: %.2f, flexibility: %.2f, sharpness: %.2f, resistance: %.2f, density: %.2f)", material.name, material.type, Arrays.toString(material.colourRGB), material.tier, material.hardness, material.durability, material.flexibility, material.sharpness, material.resistance, material.density)); } if (player != null) { player.sendChat(MineTweakerImplementationAPI.platform.getMessage("Materials list generated; see minetweaker.log in your minecraft dir")); } } + if (arguments[0].equals("skills")) { + MineTweakerAPI.logCommand("MineFantasy skills list:"); + + for (Skill skill : RPGElements.skillsList) { + MineTweakerAPI.logCommand(String.format("Skill %s registered as %s", skill.getDisplayName(), skill.skillName)); + } + + if (player != null) { + player.sendChat(MineTweakerImplementationAPI.platform.getMessage("Skills list generated; see minetweaker.log in your minecraft dir")); + } + } } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java index 4d4da9bb..13aae3ba 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -1,6 +1,5 @@ package minefantasy.mf2.integration.minetweaker; -import minefantasy.mf2.integration.minetweaker.helpers.MTCommands; import minefantasy.mf2.integration.minetweaker.helpers.MaterialExpansion; import minefantasy.mf2.integration.minetweaker.tweakers.*; import minetweaker.IRecipeRemover; @@ -8,30 +7,40 @@ import minetweaker.api.item.IIngredient; import minetweaker.api.minecraft.MineTweakerMC; -public class MTCompat /*implements IRecipeRemover */{ - - private static final Class[] tweakers = {Anvil.class, Bloomery.class, CarpentersBench.class, CustomMaterialHandler.class, Crucible.class, - Forge.class, MaterialExpansion.class, TanningRack.class, Quern.class, SalvageTweaker.class}; +public class MTCompat implements IRecipeRemover { private static final String[] COMMAND_DESC = { - " MineFantasy commands:", - " /minetweaker mf materials", - " Lists all MF materials" + "MineFantasy commands:", + " /minetweaker mf materials", + " Lists all MF materials", + " /minetweaker mf skills", + " Lists all MF skills" }; public static void loadTweakers() { - for (Class tweaker : tweakers) { - MineTweakerAPI.registerClass(tweaker); - } + MineTweakerAPI.registerClass(Anvil.class); + MineTweakerAPI.registerClass(Bloomery.class); + MineTweakerAPI.registerClass(BigFurnace.class); + MineTweakerAPI.registerClass(BlastFurnace.class); + MineTweakerAPI.registerClass(CarpentersBench.class); + MineTweakerAPI.registerClass(CustomMaterialHandler.class); + MineTweakerAPI.registerClass(Cooking.class); + MineTweakerAPI.registerClass(Crucible.class); + MineTweakerAPI.registerClass(Forge.class); + MineTweakerAPI.registerClass(MaterialExpansion.class); + MineTweakerAPI.registerClass(TanningRack.class); + MineTweakerAPI.registerClass(Quern.class); + MineTweakerAPI.registerClass(SalvageTweaker.class); } public static void registerCommands() { MineTweakerAPI.server.addMineTweakerCommand("mf", COMMAND_DESC, new MTCommands()); } - /* @Override + @Override public void remove(IIngredient iIngredient) { Bloomery.remove(iIngredient, null); Quern.remove(iIngredient, null); - }*/ + TanningRack.remove(iIngredient, null); + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedAlloyRecipe.java similarity index 97% rename from src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java rename to src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedAlloyRecipe.java index d499ecf7..49cce90f 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedAlloyRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedAlloyRecipe.java @@ -1,4 +1,4 @@ -package minefantasy.mf2.integration.minetweaker; +package minefantasy.mf2.integration.minetweaker.helpers; import minefantasy.mf2.api.crafting.MineFantasyFuels; import minefantasy.mf2.api.refine.Alloy; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapedAnvilRecipe.java similarity index 98% rename from src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java rename to src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapedAnvilRecipe.java index b097c2ae..168c0877 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapedAnvilRecipe.java @@ -1,4 +1,4 @@ -package minefantasy.mf2.integration.minetweaker; +package minefantasy.mf2.integration.minetweaker.helpers; import minefantasy.mf2.api.crafting.anvil.AnvilCraftMatrix; import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapedCBRecipes.java similarity index 98% rename from src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java rename to src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapedCBRecipes.java index aa1a7d89..68ffa330 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapedCBRecipes.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapedCBRecipes.java @@ -1,4 +1,4 @@ -package minefantasy.mf2.integration.minetweaker; +package minefantasy.mf2.integration.minetweaker.helpers; import minefantasy.mf2.api.crafting.carpenter.CarpenterCraftMatrix; import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapelessAnvilRecipe.java similarity index 98% rename from src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java rename to src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapelessAnvilRecipe.java index 6239c5bd..0ddc7ab6 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapelessAnvilRecipe.java @@ -1,4 +1,4 @@ -package minefantasy.mf2.integration.minetweaker; +package minefantasy.mf2.integration.minetweaker.helpers; import minefantasy.mf2.api.crafting.anvil.AnvilCraftMatrix; import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapelessCBRecipes.java similarity index 98% rename from src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java rename to src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapelessCBRecipes.java index 5d8d5e6f..3088acff 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/TweakedShapelessCBRecipes.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapelessCBRecipes.java @@ -1,4 +1,4 @@ -package minefantasy.mf2.integration.minetweaker; +package minefantasy.mf2.integration.minetweaker.helpers; import minefantasy.mf2.api.crafting.carpenter.CarpenterCraftMatrix; import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java index 2c984747..28672963 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java @@ -4,8 +4,8 @@ import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.Skill; -import minefantasy.mf2.integration.minetweaker.TweakedShapedAnvilRecipe; -import minefantasy.mf2.integration.minetweaker.TweakedShapelessAnvilRecipe; +import minefantasy.mf2.integration.minetweaker.helpers.TweakedShapedAnvilRecipe; +import minefantasy.mf2.integration.minetweaker.helpers.TweakedShapelessAnvilRecipe; import minetweaker.IUndoableAction; import minetweaker.MineTweakerAPI; import minetweaker.api.item.IIngredient; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/BigFurnace.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/BigFurnace.java new file mode 100644 index 00000000..d201db8f --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/BigFurnace.java @@ -0,0 +1,79 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.refine.BigFurnaceRecipes; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.Optional; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@ZenClass("mods.minefantasy.BigFurnace") +public class BigFurnace { + + @ZenMethod + public static void addRecipe(IItemStack output, IIngredient input, @Optional int tier) { + MineTweakerAPI.apply(new AddRecipeAction(output, input, tier)); + } + + private static class AddRecipeAction implements IUndoableAction { + private final IItemStack output; + private final IIngredient input; + private final int tier; + private final List addedRecipes = new ArrayList(); + + public AddRecipeAction(IItemStack output, IIngredient input, int tier) { + this.output = output; + this.input = input; + this.tier = tier; + } + + @Override + public void apply() { + for (IIngredient ingredient : input.getItems()) { + ItemStack mcInput = MineTweakerMC.getItemStack(ingredient); + addedRecipes.add(BigFurnaceRecipes.addRecipe(mcInput, MineTweakerMC.getItemStack(output), tier)); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + for (Map.Entry entry : BigFurnaceRecipes.recipeList.entrySet()) { + for (BigFurnaceRecipes recipeToRemove : addedRecipes) { + if (entry.getValue().equals(recipeToRemove)) { + BigFurnaceRecipes.recipeList.remove(entry); + } + } + } + addedRecipes.clear(); + } + + @Override + public String describe() { + return "Adding big furnace recipe for " + output.getDisplayName(); + } + + @Override + public String describeUndo() { + return "Removing big furnace recipe for " + output.getDisplayName(); + } + + @Override + public Object getOverrideKey() { + return null; + } + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/BlastFurnace.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/BlastFurnace.java new file mode 100644 index 00000000..5fbc8aad --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/BlastFurnace.java @@ -0,0 +1,74 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.refine.BlastFurnaceRecipes; +import minefantasy.mf2.util.Utils; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +import java.util.Map; + +@ZenClass("mods.minefantasy.BlastFurnace") +public class BlastFurnace { + + @ZenMethod + public static void addRecipe(IItemStack output, IIngredient input) { + MineTweakerAPI.apply(new AddRecipeAction(output, input)); + } + + private static class AddRecipeAction implements IUndoableAction { + + private final IItemStack output; + private final IIngredient input; + + public AddRecipeAction(IItemStack output, IIngredient input) { + this.output = output; + this.input = input; + } + + @Override + public void apply() { + ItemStack mcOutput = MineTweakerMC.getItemStack(output); + for (IIngredient ingredient : input.getItems()) { + ItemStack mcInput = MineTweakerMC.getItemStack(ingredient); + BlastFurnaceRecipes.smelting().addRecipe(mcInput, mcOutput); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + for (IIngredient ingredient : input.getItems()) { + for (Map.Entry entry : BlastFurnaceRecipes.smelting().getSmeltingList().entrySet()) { + if (Utils.doesMatch(entry.getKey(), MineTweakerMC.getItemStack(ingredient)) && Utils.doesMatch(entry.getValue(), MineTweakerMC.getItemStack(output))) { + BlastFurnaceRecipes.smelting().getSmeltingList().remove(entry); + } + } + } + } + + @Override + public String describe() { + return "Adding blast furnace recipe for " + output.getDisplayName(); + } + + @Override + public String describeUndo() { + return "Removing blast furnace recipe for " + output.getDisplayName(); + } + + @Override + public Object getOverrideKey() { + return null; + } + } +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java index b58aeab8..c634a6b2 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Bloomery.java @@ -8,6 +8,8 @@ import minetweaker.api.minecraft.MineTweakerMC; import minetweaker.mc1710.item.MCItemStack; import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.NotNull; +import stanhebben.zenscript.annotations.Optional; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; @@ -25,7 +27,7 @@ public static void addRecipe(IItemStack result, IIngredient input) { } @ZenMethod - public static void remove(IIngredient output, IIngredient input) { + public static void remove(@NotNull IIngredient output, @Optional IIngredient input) { if (output == null) throw new IllegalArgumentException("Output value cannot be null"); diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java index 55b1279e..dea8d74f 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java @@ -4,8 +4,8 @@ import minefantasy.mf2.api.crafting.carpenter.ICarpenterRecipe; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.Skill; -import minefantasy.mf2.integration.minetweaker.TweakedShapedCBRecipes; -import minefantasy.mf2.integration.minetweaker.TweakedShapelessCBRecipes; +import minefantasy.mf2.integration.minetweaker.helpers.TweakedShapedCBRecipes; +import minefantasy.mf2.integration.minetweaker.helpers.TweakedShapelessCBRecipes; import minetweaker.IUndoableAction; import minetweaker.MineTweakerAPI; import minetweaker.api.item.IIngredient; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Cooking.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Cooking.java new file mode 100644 index 00000000..fc759bfb --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Cooking.java @@ -0,0 +1,85 @@ +package minefantasy.mf2.integration.minetweaker.tweakers; + +import minefantasy.mf2.api.cooking.CookRecipe; +import minetweaker.IUndoableAction; +import minetweaker.MineTweakerAPI; +import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; +import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.Optional; +import stanhebben.zenscript.annotations.ZenClass; +import stanhebben.zenscript.annotations.ZenMethod; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@ZenClass("mods.minefantasy.Cooking") +public class Cooking { + + @ZenMethod + public static void addRecipe(IItemStack output, IIngredient input, int minTemp, int maxTemp, int time, int burnTime, boolean requireBaking, @Optional boolean canBurn) { + MineTweakerAPI.apply(new AddRecipeAction(output, input, minTemp, maxTemp, time, burnTime, requireBaking, canBurn)); + } + + private static class AddRecipeAction implements IUndoableAction { + private final IItemStack output; + private final IIngredient input; + private final int minTemp, maxTemp, time, burnTime; + private final boolean requireBaking, canBurn; + private final List addedRecipes = new ArrayList(); + + public AddRecipeAction(IItemStack output, IIngredient input, int minTemp, int maxTemp, int time, int burnTime, boolean requireBaking, boolean canBurn) { + this.output = output; + this.input = input; + this.minTemp = minTemp; + this.maxTemp = maxTemp; + this.time = time; + this.burnTime = burnTime; + this.requireBaking = requireBaking; + this.canBurn = canBurn; + } + + @Override + public void apply() { + for (IIngredient ingredient : input.getItems()) { + ItemStack mcInput = MineTweakerMC.getItemStack(ingredient); + addedRecipes.add(CookRecipe.addRecipe(MineTweakerMC.getItemStack(output), mcInput, new ItemStack(CookRecipe.burnt_food), minTemp, maxTemp, time, burnTime, requireBaking, canBurn)); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + for (Map.Entry recipeEntry : CookRecipe.recipeList.entrySet()) { + for (CookRecipe recipe : addedRecipes) { + if (recipe.equals(recipe)) { + CookRecipe.recipeList.remove(recipeEntry); + } + } + } + addedRecipes.clear(); + } + + @Override + public String describe() { + return null; + } + + @Override + public String describeUndo() { + return null; + } + + @Override + public Object getOverrideKey() { + return null; + } + } + +} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java index 367b45a5..500dad31 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java @@ -2,7 +2,7 @@ import minefantasy.mf2.api.refine.Alloy; import minefantasy.mf2.api.refine.AlloyRecipes; -import minefantasy.mf2.integration.minetweaker.TweakedAlloyRecipe; +import minefantasy.mf2.integration.minetweaker.helpers.TweakedAlloyRecipe; import minetweaker.MineTweakerAPI; import minetweaker.OneWayAction; import minetweaker.api.item.IIngredient; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java index 42b7fa4c..200ac403 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Forge.java @@ -14,15 +14,14 @@ public class Forge { @ZenMethod public static void addHeatableItem(IIngredient input, int min, int unstable, int max) { - MineTweakerAPI.apply(new heatableItemAction(input, min, unstable, max)); + MineTweakerAPI.apply(new AddHeatableAction(input, min, unstable, max)); } - public static class heatableItemAction implements IUndoableAction { + private static class AddHeatableAction implements IUndoableAction { + private final IIngredient input; + private final int min, unstable, max; - IIngredient input; - int min, unstable, max; - - public heatableItemAction(IIngredient input, int min, int unstable, int max) { + public AddHeatableAction(IIngredient input, int min, int unstable, int max) { this.input = input; this.min = min; this.unstable = unstable; @@ -62,7 +61,5 @@ public void undo() { Heatable.registerList.remove(Heatable.getRegistrationForItem(MineTweakerMC.getItemStack(s))); } } - } - } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java index 4e2ed8ec..f42a4d57 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Quern.java @@ -8,6 +8,8 @@ import minetweaker.api.minecraft.MineTweakerMC; import minetweaker.mc1710.item.MCItemStack; import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.NotNull; +import stanhebben.zenscript.annotations.Optional; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; @@ -17,33 +19,15 @@ public class Quern { @ZenMethod - public static void addRecipe(IItemStack result, IIngredient input) { - addRecipe(result, input, 0, true); + public static void addRecipe(IItemStack output, IIngredient input, @Optional int tier, @Optional boolean consumePot) { + MineTweakerAPI.apply(new AddRecipeAction(output, input, tier, consumePot)); } @ZenMethod - public static void addRecipe(IItemStack result, IIngredient input, int tier) { - addRecipe(result, input, tier, true); - } - - @ZenMethod - public static void addRecipe(IItemStack result, IIngredient input, int tier, boolean consumePot) { - MineTweakerAPI.apply(new AddRecipeAction(result, input, tier, consumePot)); - } - - @ZenMethod - public static void remove(IIngredient result){ - remove(result, null); - } - - @ZenMethod - public static void remove(IIngredient result, IIngredient input) { - if (result == null) - throw new IllegalArgumentException("Output value cannot be null"); - + public static void remove(@NotNull IIngredient output, @Optional IIngredient input) { ArrayList recipesToRemove = new ArrayList(); for (QuernRecipes recipes : QuernRecipes.recipeList) { - if (result.matches(new MCItemStack(recipes.result)) && (input == null || input.matches(new MCItemStack(recipes.input)))) { + if (output.matches(new MCItemStack(recipes.result)) && (input == null || input.matches(new MCItemStack(recipes.input)))) { recipesToRemove.add(recipes); } } @@ -52,14 +36,14 @@ public static void remove(IIngredient result, IIngredient input) { } private static class AddRecipeAction implements IUndoableAction { - private final IItemStack result; + private final IItemStack output; private final IIngredient input; private final int tier; private final boolean consumePot; private final ArrayList recipesToRemove = new ArrayList(); public AddRecipeAction(IItemStack result, IIngredient input, int tier, boolean consumePot) { - this.result = result; + this.output = result; this.input = input; this.tier = tier; this.consumePot = consumePot; @@ -69,7 +53,7 @@ public AddRecipeAction(IItemStack result, IIngredient input, int tier, boolean c public void apply() { for (IItemStack stack : input.getItems()) { ItemStack s = MineTweakerMC.getItemStack(stack); - recipesToRemove.add(QuernRecipes.addRecipe(s, MineTweakerMC.getItemStack(result), this.tier, consumePot)); + recipesToRemove.add(QuernRecipes.addRecipe(s, MineTweakerMC.getItemStack(output), this.tier, consumePot)); } } @@ -88,12 +72,12 @@ public void undo() { @Override public String describe() { - return "Adding quern recipe for " + result.getDisplayName(); + return "Adding quern recipe for " + output.getDisplayName(); } @Override public String describeUndo() { - return "Removing quern recipe for " + result.getDisplayName(); + return "Removing quern recipe for " + output.getDisplayName(); } @Override diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java index a87a2149..4ec88b1d 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java @@ -19,11 +19,6 @@ public static void addSalvage(IItemStack output, IIngredient input) { MineTweakerAPI.apply(new AddSalvageAction(output, input)); } - @ZenMethod - public static void shareSalvage() { - - } - private static class AddSalvageAction implements IUndoableAction { private final IItemStack output; private final IIngredient input; @@ -66,4 +61,41 @@ public Object getOverrideKey() { return null; } } + + private static class RemoveAction implements IUndoableAction { + + public RemoveAction() { + + } + + @Override + public void apply() { + + } + + @Override + public boolean canUndo() { + return false; + } + + @Override + public void undo() { + + } + + @Override + public String describe() { + return null; + } + + @Override + public String describeUndo() { + return null; + } + + @Override + public Object getOverrideKey() { + return null; + } + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java index 7b4a0d95..17ccc68b 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/TanningRack.java @@ -3,12 +3,13 @@ import minefantasy.mf2.api.crafting.tanning.TanningRecipe; import minetweaker.IUndoableAction; import minetweaker.MineTweakerAPI; -import minetweaker.OneWayAction; import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; import minetweaker.api.minecraft.MineTweakerMC; import minetweaker.mc1710.item.MCItemStack; import net.minecraft.item.ItemStack; +import stanhebben.zenscript.annotations.NotNull; +import stanhebben.zenscript.annotations.Optional; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; @@ -19,20 +20,12 @@ public class TanningRack { @ZenMethod - public static void addTieredRecipe(IItemStack output, IIngredient input, float time, int tier) { - MineTweakerAPI.apply(new TanningAction(output, input, time, tier, "knife")); - } - - @ZenMethod - public static void addTieredAndToolRecipe(IItemStack output, IIngredient input, float time, int tier, String tool) { + public static void addTieredAndToolRecipe(IItemStack output, IIngredient input, float time, @Optional int tier, @Optional String tool) { MineTweakerAPI.apply(new TanningAction(output, input, time, tier, tool)); } @ZenMethod - public static void remove(IItemStack output, IIngredient input) { - if (output == null) - throw new IllegalArgumentException("Output value cannot be null"); - + public static void remove(@NotNull IIngredient output, @Optional IIngredient input) { ArrayList recipeList = TanningRecipe.recipeList; List recipesToRemove = new ArrayList(); @@ -50,12 +43,13 @@ public static void remove(IItemStack output, IIngredient input) { MineTweakerAPI.apply(new RemoveAction(recipesToRemove)); } - public static class TanningAction extends OneWayAction { - IItemStack output; - IIngredient input; - float time; - int tier; - String tool; + public static class TanningAction implements IUndoableAction { + private final IItemStack output; + private final IIngredient input; + private final float time; + private final int tier; + private final String tool; + private final List addedRecipes = new ArrayList(); public TanningAction(IItemStack output, IIngredient input, float time, int tier, String tool) { this.output = output; @@ -69,13 +63,31 @@ public TanningAction(IItemStack output, IIngredient input, float time, int tier, public void apply() { for (IItemStack s : input.getItems()) { ItemStack stack = MineTweakerMC.getItemStack(s); - TanningRecipe.addRecipe(stack, time, tier, tool, MineTweakerMC.getItemStack(output)); + addedRecipes.add(TanningRecipe.addRecipe(stack, time, tier, tool, MineTweakerMC.getItemStack(output))); + } + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + for (TanningRecipe recipe : addedRecipes) { + TanningRecipe.recipeList.remove(recipe); } + addedRecipes.clear(); } @Override public String describe() { - return "Creating Tanning Recipe"; + return "Adding tanning rack recipe for " + output.getDisplayName(); + } + + @Override + public String describeUndo() {/**/ + return "Removing tanning rack recipe for " + output.getDisplayName(); } @Override @@ -109,6 +121,7 @@ public void undo() { for (TanningRecipe recipe : recipes) { TanningRecipe.recipeList.add(recipe); } + recipes.clear(); } @Override diff --git a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java index 19c196d2..73901b8c 100644 --- a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java @@ -1,6 +1,7 @@ package minefantasy.mf2.network; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.registry.GameRegistry; import minefantasy.mf2.MineFantasyII; @@ -13,13 +14,16 @@ import minefantasy.mf2.block.tileentity.decor.TileEntityAmmoBox; import minefantasy.mf2.block.tileentity.decor.TileEntityRack; import minefantasy.mf2.block.tileentity.decor.TileEntityTrough; +import minefantasy.mf2.config.ConfigIntegration; import minefantasy.mf2.container.*; import minefantasy.mf2.entity.EntitySmoke; import minefantasy.mf2.entity.list.EntityListMF; import minefantasy.mf2.hunger.HungerSystemMF; +import minefantasy.mf2.integration.minetweaker.MTCompat; import minefantasy.mf2.item.archery.ArrowFireFlint; import minefantasy.mf2.item.archery.ArrowFirerMF; import minefantasy.mf2.mechanics.*; +import minetweaker.MineTweakerAPI; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -94,6 +98,10 @@ public void registerMain() { AmmoMechanicsMF.addHandler(new ArrowFirerMF()); registerTileEntities(); SmokeMechanics.handler = this; + if (Loader.isModLoaded("MineTweaker3") && ConfigIntegration.mtIntegration) { + MTCompat.loadTweakers(); + MineTweakerAPI.registerRemover(new MTCompat()); + } } protected void registerTileEntities() { diff --git a/src/main/java/minefantasy/mf2/util/Utils.java b/src/main/java/minefantasy/mf2/util/Utils.java new file mode 100644 index 00000000..a50bf8db --- /dev/null +++ b/src/main/java/minefantasy/mf2/util/Utils.java @@ -0,0 +1,13 @@ +package minefantasy.mf2.util; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class Utils { + + public static boolean doesMatch(ItemStack item1, ItemStack item2) { + return item2.getItem() == item1.getItem() && (item2.getItemDamage() == OreDictionary.WILDCARD_VALUE + || item2.getItemDamage() == item1.getItemDamage()); + } + +} From 0693b37551cd8ac776f51166c3cedff3c33883ae Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 11 Nov 2017 01:47:16 +0700 Subject: [PATCH 085/101] Rewritted CustomMaterial handler --- .../helpers/MaterialExpansion.java | 62 +++++++------------ .../tweakers/CustomMaterialHandler.java | 29 +++++++-- 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java index 2192291a..fe1b6699 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java @@ -3,6 +3,7 @@ import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.material.MetalMaterial; +import stanhebben.zenscript.annotations.NotNull; import stanhebben.zenscript.annotations.ZenExpansion; import stanhebben.zenscript.annotations.ZenMethod; @@ -11,65 +12,46 @@ public class MaterialExpansion { @ZenMethod("setColor") - public static CustomMaterial setColor(CustomMaterial material, int r, int g, int b) { - if (material != null) { - material.setColour(r, g, b); - } - return material; + public static CustomMaterial setColor(@NotNull CustomMaterial material, int r, int g, int b) { + return material.setColour(r, g, b); } @ZenMethod("setMeltingPoint") - public static CustomMaterial setMeltingPoint(CustomMaterial material, float meltingPoint) { - if (material != null) { - if(material instanceof MetalMaterial) { - material.setMeltingPoint(meltingPoint); - int[] stats = material.getHeatableStats(); - MineFantasyAPI.setHeatableStats("ingot" + material.name, stats[0], stats[1], stats[2]); - MineFantasyAPI.setHeatableStats("hunk" + material.name, stats[0], stats[1], stats[2]); - } else { - throw new IllegalArgumentException("Method setMeltingPoint can be applied only to Metal materials!"); - } + public static CustomMaterial setMeltingPoint(@NotNull CustomMaterial material, float meltingPoint) { + if (!(material instanceof MetalMaterial)) { + throw new IllegalArgumentException("Method setMeltingPoint can be applied only to Metal materials!"); } + material.setMeltingPoint(meltingPoint); + int[] stats = material.getHeatableStats(); + MineFantasyAPI.setHeatableStats("ingot" + material.name, stats[0], stats[1], stats[2]); + MineFantasyAPI.setHeatableStats("hunk" + material.name, stats[0], stats[1], stats[2]); return material; } @ZenMethod("setCrafterTiers") - public static CustomMaterial setCrafterTiers(CustomMaterial material, int craftingTier) { - if (material != null) { - material.setCrafterTiers(craftingTier); - } - return material; + public static CustomMaterial setCrafterTiers(@NotNull CustomMaterial material, int craftingTier) { + return material.setCrafterTiers(craftingTier); + } @ZenMethod("setRarity") - public static CustomMaterial setRarity(CustomMaterial material, int rarity) { - if (material != null) { - material.setRarity(rarity); - } - return material; + public static CustomMaterial setRarity(@NotNull CustomMaterial material, int rarity) { + return material.setRarity(rarity); } @ZenMethod("setUnbreakable") - public static CustomMaterial setUnbreakable(CustomMaterial material) { - if (material != null) { - material.setUnbreakable(); - } - return material; + public static CustomMaterial setUnbreakable(@NotNull CustomMaterial material) { + return material.setUnbreakable(); + } @ZenMethod("setArmourStats") - public static CustomMaterial setArmourStats(CustomMaterial material, float cutting, float blunt, float piercing) { - if (material != null) { - material.setArmourStats(cutting, blunt, piercing); - } - return material; + public static CustomMaterial setArmourStats(@NotNull CustomMaterial material, float cutting, float blunt, float piercing) { + return material.setArmourStats(cutting, blunt, piercing); } @ZenMethod("modifyCraftTime") - public static CustomMaterial modifyCraftTime(CustomMaterial material, float time) { - if (material != null) { - material.modifyCraftTime(time); - } - return material; + public static CustomMaterial modifyCraftTime(@NotNull CustomMaterial material, float time) { + return material.modifyCraftTime(time); } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java index 124a4385..f41ad03e 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java @@ -1,8 +1,8 @@ package minefantasy.mf2.integration.minetweaker.tweakers; import minefantasy.mf2.api.material.CustomMaterial; +import minetweaker.IUndoableAction; import minetweaker.MineTweakerAPI; -import minetweaker.OneWayAction; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; @@ -10,8 +10,11 @@ public class CustomMaterialHandler { @ZenMethod - public static CustomMaterial addCustomMaterial(String type, String name, int tier, float hardness, float durability, - float flexibility, float sharpness, float resistance, float density) { + public static CustomMaterial addMaterial(String type, String name, int tier, float hardness, float durability, + float flexibility, float sharpness, float resistance, float density) { + if (CustomMaterial.getMaterial(name) != null) { + throw new IllegalArgumentException("Material with this name already exists!"); + } RegisterCustomMaterial reg = new RegisterCustomMaterial(type.toLowerCase(), name, tier, hardness, durability, flexibility, sharpness, resistance, density); MineTweakerAPI.apply(reg); return reg.material; @@ -22,7 +25,7 @@ public static CustomMaterial getMaterial(String materialName) { return CustomMaterial.getMaterial(materialName); } - private static class RegisterCustomMaterial extends OneWayAction { + private static class RegisterCustomMaterial implements IUndoableAction { private final String type, name; private final int tier; @@ -44,7 +47,18 @@ public RegisterCustomMaterial(String type, String name, int tier, float hardness @Override public void apply() { - material = CustomMaterial.getMaterial(name) != null ? CustomMaterial.getMaterial(name) : new CustomMaterial(name, type, tier, hardness, durability, flexibility, resistance, sharpness, density).register(); + material = new CustomMaterial(name, type, tier, hardness, durability, flexibility, resistance, sharpness, density).register(); + } + + @Override + public boolean canUndo() { + return true; + } + + @Override + public void undo() { + CustomMaterial.materialList.remove(this.name); + CustomMaterial.getList(this.type).remove(this.material); } @Override @@ -52,6 +66,11 @@ public String describe() { return "Registers custom material for MF crafting system"; } + @Override + public String describeUndo() { + return "Removing custom material"; + } + @Override public Object getOverrideKey() { return null; From c05b62a43d55efbdf68fd9ef3b09c30528a46368 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 19 Nov 2017 01:39:31 +0700 Subject: [PATCH 086/101] Fix knife duplication glitch Salvage station drops 2 bars instead 1 --- src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java index 9c6e484f..110c1de9 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java @@ -271,7 +271,7 @@ private static void addStandardCrafters() { true, "hammer", -1, -1, time, new Object[]{"I ", "PL", 'I', bar, 'P', plank, 'L', strip,}); - Salvage.addSalvage(CustomToolListMF.standard_knife, bar, bar, plank, strip); + Salvage.addSalvage(CustomToolListMF.standard_knife, bar, plank, strip); time = 12; KnowledgeListMF.shearsR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_shears, "tier", From 7acf2ee38b0bae0aae7b9bc349f31fb61b7f8e51 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 12 Jan 2018 01:24:16 +0700 Subject: [PATCH 087/101] Reverted horse armor, some code changes ASM has some incompabilities, better to add horse armor via separate addon. --- build.gradle | 9 - .../java/minefantasy/mf2/MineFantasyII.java | 3 - .../mf2/api/armour/ItemHorseArmorMFBase.java | 76 ---- .../mf2/api/cooking/CookRecipe.java | 1 + .../minefantasy/mf2/api/crafting/Salvage.java | 3 +- .../crafting/anvil/ShapedAnvilRecipes.java | 26 +- .../carpenter/ShapedCarpenterRecipes.java | 6 +- .../mf2/api/knowledge/InformationBase.java | 18 +- .../minefantasy/mf2/api/refine/Alloy.java | 2 +- .../mf2/api/refine/AlloyRecipes.java | 2 +- .../minefantasy/mf2/api/rpg/RPGElements.java | 3 +- .../java/minefantasy/mf2/asm/ASMHelper.java | 167 -------- .../mf2/asm/InstructionComparator.java | 312 --------------- .../mf2/asm/MFClassTransformer.java | 17 - .../minefantasy/mf2/asm/MFLoadingPlugin.java | 38 -- .../java/minefantasy/mf2/asm/Mappings.java | 85 ----- .../transformers/EntityHorseTransformer.java | 361 ------------------ .../transformers/RenderHorseTransformer.java | 33 -- .../mf2/block/crafting/BlockSalvage.java | 24 +- .../tileentity/TileEntityBigFurnace.java | 22 +- .../block/tileentity/TileEntityChimney.java | 44 +-- .../block/tileentity/TileEntityCrucible.java | 6 +- .../mf2/block/tileentity/TileEntityForge.java | 16 +- .../mf2/block/tileentity/TileEntityQuern.java | 6 +- .../mf2/client/render/MineFantasyHUD.java | 8 +- .../mf2/client/render/RenderCrossbow.java | 10 +- .../client/render/armour/ModelFullplate.java | 8 +- .../client/render/mob/RenderVanillaHorse.java | 44 --- .../mf2/config/ConfigHardcore.java | 2 +- .../minefantasy/mf2/entity/EntityCogwork.java | 6 +- .../mf2/entity/mob/DragonBreath.java | 1 + .../mf2/entity/mob/EntityMinotaur.java | 6 +- .../mf2/integration/minetweaker/MTCompat.java | 1 - .../helpers/MaterialExpansion.java | 20 + .../helpers/TweakedAlloyRecipe.java | 5 - .../helpers/TweakedShapedAnvilRecipe.java | 82 ++-- .../helpers/TweakedShapelessAnvilRecipe.java | 2 +- .../minetweaker/tweakers/Anvil.java | 21 +- .../minetweaker/tweakers/CarpentersBench.java | 2 +- .../minetweaker/tweakers/Crucible.java | 15 +- .../tweakers/CustomMaterialHandler.java | 9 +- .../minetweaker/tweakers/Fuels.java | 1 - .../minetweaker/tweakers/SalvageTweaker.java | 1 - .../integration/nei/RecipeHandlerQuern.java | 9 +- .../mf2/integration/thaumcraft/TCCompat.java | 9 + .../minefantasy/mf2/item/ItemComponentMF.java | 19 +- .../mf2/item/armour/ItemHorseArmorMF.java | 90 ----- .../mf2/item/list/CreativeTabMF.java | 3 - .../mf2/item/tool/ToolMaterialMF.java | 6 +- .../mf2/item/tool/crafting/ItemTongs.java | 16 +- .../mf2/material/BaseMaterialMF.java | 15 +- .../mf2/material/MetalMaterial.java | 8 +- .../mf2/material/WoodMaterial.java | 50 +-- .../mf2/mechanics/ArrowHandlerMF.java | 20 +- .../mf2/mechanics/CombatMechanics.java | 35 +- .../mf2/mechanics/EventManagerMF.java | 52 ++- .../mf2/mechanics/MonsterUpgrader.java | 22 +- .../mf2/mechanics/PlayerTickHandlerMF.java | 38 +- .../mechanics/worldGen/WorldGenMFTree.java | 9 +- .../dwarven/WorldGenDwarvenStronghold.java | 10 +- .../mf2/network/ClientProxyMF.java | 5 +- .../mf2/network/CommonProxyMF.java | 9 +- .../mf2/recipe/CarpenterRecipes.java | 12 +- .../mf2/recipe/CookingRecipes.java | 5 +- .../java/minefantasy/mf2/util/XSTRandom.java | 2 +- .../animal/horse/armor/horse_armor_main.png | Bin 15103 -> 0 bytes .../horse/armor/horse_armor_overlay.png | Bin 15028 -> 0 bytes .../horse/armor/horse_armor_saddlecloth.png | Bin 15064 -> 0 bytes 68 files changed, 377 insertions(+), 1591 deletions(-) delete mode 100644 src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java delete mode 100644 src/main/java/minefantasy/mf2/asm/ASMHelper.java delete mode 100644 src/main/java/minefantasy/mf2/asm/InstructionComparator.java delete mode 100644 src/main/java/minefantasy/mf2/asm/MFClassTransformer.java delete mode 100644 src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java delete mode 100644 src/main/java/minefantasy/mf2/asm/Mappings.java delete mode 100644 src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java delete mode 100644 src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java delete mode 100644 src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java create mode 100644 src/main/java/minefantasy/mf2/integration/thaumcraft/TCCompat.java delete mode 100644 src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/animal/horse/armor/horse_armor_main.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/animal/horse/armor/horse_armor_overlay.png delete mode 100644 src/main/resources/assets/minefantasy2/textures/items/animal/horse/armor/horse_armor_saddlecloth.png diff --git a/build.gradle b/build.gradle index e42f2a7d..835e4a19 100644 --- a/build.gradle +++ b/build.gradle @@ -56,15 +56,6 @@ dependencies { task deobfJar(type: Jar) { from sourceSets.main.output classifier = 'deobf' - manifest { - attributes "FMLCorePlugin": "minefantasy.mf2.asm.MFLoadingPlugin", "FMLCorePluginContainsFMLMod": "true" - } -} - -jar { - manifest { - attributes "FMLCorePlugin": "minefantasy.mf2.asm.MFLoadingPlugin", "FMLCorePluginContainsFMLMod": "true" - } } tasks.build.dependsOn('deobfJar') diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 506e7a95..65265e60 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -36,7 +36,6 @@ import minefantasy.mf2.util.BukkitUtils; import minefantasy.mf2.util.MFLogUtil; import minefantasy.mf2.util.XSTRandom; -import minetweaker.MineTweakerAPI; import net.minecraft.init.Items; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.MinecraftForge; @@ -61,8 +60,6 @@ public class MineFantasyII { @Instance(MODID) public static MineFantasyII instance; - //Up to 30% faster random implementation. - public static XSTRandom random = new XSTRandom(); private static boolean isBGLoaded; private static boolean isBukkitServer; diff --git a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java b/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java deleted file mode 100644 index cf799074..00000000 --- a/src/main/java/minefantasy/mf2/api/armour/ItemHorseArmorMFBase.java +++ /dev/null @@ -1,76 +0,0 @@ -package minefantasy.mf2.api.armour; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.entity.passive.EntityHorse; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; - -public class ItemHorseArmorMFBase extends Item { - - public ArmourMaterialMF armorMaterial; - public ArmourDesign armorDesign; - public String armorTexture; - - public ItemHorseArmorMFBase(String name, ArmourMaterialMF material, ArmourDesign design, String texture) { - this.setUnlocalizedName(name); - armorMaterial = material; - armorDesign = design; - armorTexture = texture; - - float baseDura = material.durability * design.getDurability() / 2F; - this.setMaxDamage((int) baseDura); - } - - /** - * Used to calculate the amount of protection this item should provide the horse with. - * - * @param horse: An instance of the horse which is currently wearing this piece of armor. - * @param stack: An instance of the ItemStack currently in the horse's armor slot. - * @return int: An integer based representation of the armor points which should be given - * to a horse by this armor item. - */ - public int getArmorValue(EntityHorse horse, ItemStack stack) { - return 0; - } - - /** - * Called every time an EntityHorse updates while wearing this piece of armor. Allows for - * armor to alter the behavior and abilities of a horse. - * - * @param horse: An instance of the horse which is currently wearing this piece of armor. - * @param stack: An instance of the ItemStack currently in the horse's armor slot. - */ - public void onHorseUpdate(EntityHorse horse, ItemStack stack) { - } - - /** - * Called when a horse wearing this piece of armor has been hurt. - * - * @param horse: An instance of the horse which is currently wearing this piece of armor. - * @param stack: An instance of the ItemStack currently in the horse's armor slot. - * @param source: The DamageSource which caused the horse to be hurt. - * @param damage: The amount of damage that the horse received. - * @return boolean: If true, the horse will not be hurt and the event will be canceled. - */ - public boolean onHorseDamaged(EntityHorse horse, ItemStack stack, DamageSource source, float damage) { - stack.damageItem((int) (damage / 5F) + 1, horse); - return true; - } - - /** - * Used to provide a resource path for the armor's texture. Textures follow the same rules - * and layouts as the vanilla horse armor textures. The domain for the texture can be - * switched from minecraft to one of your chosing by preceding the path with 'domain:' - * - * @param horse: An instance of the horse which is currently wearing this piece of armor. - * @param stack: An instance of the ItemStack currently in the horse's armor slot. - * @return String: A string based representation of the armor texture resource location. - * EG: testmod:textures/entity/horse/armor/horse_armor_test.png - */ - @SideOnly(Side.CLIENT) - public String getArmorTexture(EntityHorse horse, ItemStack stack) { - return armorTexture; - } -} diff --git a/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java b/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java index 067a3c46..7fe46b93 100644 --- a/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java +++ b/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java @@ -16,6 +16,7 @@ public class CookRecipe { public final boolean isBaking; public final ItemStack output, burnt; public final boolean canBurn; + public CookRecipe(ItemStack output, ItemStack burnt, int min, int max, int time, boolean bake, boolean burn) { this.output = output; this.burnt = burnt; diff --git a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java index a6b4110f..2a790a46 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/Salvage.java +++ b/src/main/java/minefantasy/mf2/api/crafting/Salvage.java @@ -12,12 +12,11 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Random; public class Salvage { - private static XSTRandom random = new XSTRandom(); public static HashMap salvageList = new HashMap(); public static HashMap sharedSalvage = new HashMap(); + private static XSTRandom random = new XSTRandom(); public static void shareSalvage(Item item1, Item item2) { sharedSalvage.put(CustomToolHelper.getSimpleReferenceName(item1), item2); diff --git a/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java index 0b1b67e1..6a653bf8 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/anvil/ShapedAnvilRecipes.java @@ -87,13 +87,9 @@ public int getRecipeHammer() { */ @Override public boolean matches(AnvilCraftMatrix matrix) { - for (int var2 = 0; var2 <= ShapelessAnvilRecipes.globalWidth - this.recipeWidth; ++var2) { - for (int var3 = 0; var3 <= ShapelessAnvilRecipes.globalHeight - this.recipeHeight; ++var3) { - if (this.checkMatch(matrix, var2, var3, true)) { - return true; - } - - if (this.checkMatch(matrix, var2, var3, false)) { + for (int x = 0; x <= ShapelessAnvilRecipes.globalWidth - this.recipeWidth; ++x) { + for (int y = 0; y <= ShapelessAnvilRecipes.globalHeight - this.recipeHeight; ++y) { + if (this.checkMatch(matrix, x, y, true) || this.checkMatch(matrix, x, y, false)) { return true; } } @@ -106,21 +102,21 @@ public boolean matches(AnvilCraftMatrix matrix) { * Checks if the region of a crafting inventory is match for the recipe. */ protected boolean checkMatch(AnvilCraftMatrix matrix, int x, int y, boolean b) { - for (int var5 = 0; var5 < ShapelessAnvilRecipes.globalWidth; ++var5) { - for (int var6 = 0; var6 < ShapelessAnvilRecipes.globalHeight; ++var6) { - int var7 = var5 - x; - int var8 = var6 - y; + for (int matrixX = 0; matrixX < ShapelessAnvilRecipes.globalWidth; ++matrixX) { + for (int matrixY = 0; matrixY < ShapelessAnvilRecipes.globalHeight; ++matrixY) { + int recipeX = matrixX - x; + int recipeY = matrixY - y; ItemStack recipeItem = null; - if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight) { + if (recipeX >= 0 && recipeY >= 0 && recipeX < this.recipeWidth && recipeY < this.recipeHeight) { if (b) { - recipeItem = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth]; + recipeItem = this.recipeItems[this.recipeWidth - recipeX - 1 + recipeY * this.recipeWidth]; } else { - recipeItem = this.recipeItems[var7 + var8 * this.recipeWidth]; + recipeItem = this.recipeItems[recipeX + recipeY * this.recipeWidth]; } } - ItemStack inputItem = matrix.getStackInRowAndColumn(var5, var6); + ItemStack inputItem = matrix.getStackInRowAndColumn(matrixX, matrixY); if (inputItem != null || recipeItem != null) { // HEATING diff --git a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java index c9a872aa..f7c8bc9b 100644 --- a/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/api/crafting/carpenter/ShapedCarpenterRecipes.java @@ -17,7 +17,7 @@ public class ShapedCarpenterRecipes implements ICarpenterRecipe { */ public final int blockTier; public final int recipeTime; - public final float recipeExperiance; + public final float recipeExperience; public final String toolType; public final String soundOfCraft; public final String research; @@ -50,7 +50,7 @@ public ShapedCarpenterRecipes(int wdth, int heit, ItemStack[] inputs, ItemStack this.recipeOutput = output; this.recipeTime = time; this.recipeHammer = hammer; - this.recipeExperiance = exp; + this.recipeExperience = exp; this.toolType = toolType; this.soundOfCraft = sound; this.skillUsed = skill; @@ -68,7 +68,7 @@ public int getCraftTime() { @Override public float getExperiance() { - return this.recipeExperiance; + return this.recipeExperience; } @Override diff --git a/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java b/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java index 1cfaeb17..0a206a08 100644 --- a/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java +++ b/src/main/java/minefantasy/mf2/api/knowledge/InformationBase.java @@ -93,16 +93,16 @@ public InformationBase setPage(InformationPage page) { return this; } - /* + /* * public IChatComponent func_150951_e() { IChatComponent ichatcomponent = - * super.func_150951_e(); - * ichatcomponent.getChatStyle().setColor(this.getSpecial() ? - * EnumChatFormatting.DARK_PURPLE : EnumChatFormatting.GREEN); return - * ichatcomponent; } - * - * public InformationBase func_150953_b(Class p_150953_1_) { return - * (InformationBase)super.func_150953_b(p_150953_1_); } - */ + * super.func_150951_e(); + * ichatcomponent.getChatStyle().setColor(this.getSpecial() ? + * EnumChatFormatting.DARK_PURPLE : EnumChatFormatting.GREEN); return + * ichatcomponent; } + * + * public InformationBase func_150953_b(Class p_150953_1_) { return + * (InformationBase)super.func_150953_b(p_150953_1_); } + */ /** * Special achievements have a 'spiked' (on normal texture pack) frame, special diff --git a/src/main/java/minefantasy/mf2/api/refine/Alloy.java b/src/main/java/minefantasy/mf2/api/refine/Alloy.java index 2e503ee6..2d9df482 100644 --- a/src/main/java/minefantasy/mf2/api/refine/Alloy.java +++ b/src/main/java/minefantasy/mf2/api/refine/Alloy.java @@ -83,7 +83,7 @@ private boolean areMaterialsEqual(ItemStack itemstack, ItemStack checkItem) { return false; } - private boolean areBothCarbon(ItemStack item1, ItemStack item2) { + public boolean areBothCarbon(ItemStack item1, ItemStack item2) { return MineFantasyFuels.isCarbon(item1) && MineFantasyFuels.isCarbon(item2); } diff --git a/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java b/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java index 5ff72e13..24160c8d 100644 --- a/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java +++ b/src/main/java/minefantasy/mf2/api/refine/AlloyRecipes.java @@ -6,7 +6,7 @@ import java.util.List; public class AlloyRecipes { - public static List alloys = new ArrayList(); + public static List alloys = new ArrayList(); public static Alloy addAlloy(ItemStack out, int level, List in) { Alloy alloy = new Alloy(out, level, in); diff --git a/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java b/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java index 8ff55c00..97a339ab 100644 --- a/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java +++ b/src/main/java/minefantasy/mf2/api/rpg/RPGElements.java @@ -7,15 +7,14 @@ import java.util.ArrayList; import java.util.HashMap; -import java.util.Random; public class RPGElements { private static final String statsName = "RPGStats_MF"; public static boolean isSystemActive = true; public static float levelSpeedModifier = 1.0F; public static float levelUpModifier = 1.5F; - private static HashMap skillsMap = new HashMap(); public static ArrayList skillsList = new ArrayList(); + private static HashMap skillsMap = new HashMap(); private static XSTRandom rand = new XSTRandom(); static { diff --git a/src/main/java/minefantasy/mf2/asm/ASMHelper.java b/src/main/java/minefantasy/mf2/asm/ASMHelper.java deleted file mode 100644 index 080712fb..00000000 --- a/src/main/java/minefantasy/mf2/asm/ASMHelper.java +++ /dev/null @@ -1,167 +0,0 @@ -package minefantasy.mf2.asm; - -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.AbstractInsnNode; -import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.tree.InsnList; -import org.objectweb.asm.tree.MethodNode; - -import java.util.List; - -public final class ASMHelper { - - public static boolean isSrg = true; - public static boolean isASMEnabled = false; - - /** - * Provides an easy way to retrieve an appropriate mapping, based on if the environement is - * using mcp mappings or srg mappings. - * - * @param mcp: The string you want if this environment is using mcp mappings. - * @param srg: The string you want if this environment is using srg mappings. - * @return String: The most appropriate mapping for this environment. - */ - public static String getAppropriateMapping(String mcp, String srg) { - - return (isSrg) ? srg : mcp; - } - - /** - * Converts a ClassNode into a byte array which can then be returned by your transformer. - * - * @param classNode: An instance of the ClassNode you wish to convert into a byte array. - * @param flags: The flags to use when converting the ClassNode. These are generally - * COMPUTE_FRAMES and COMPUTE_MAXS. - * @return byte[]: A byte array representation of the ClassNode. - */ - public static byte[] createByteArrayFromClass(ClassNode classNode, int flags) { - - ClassWriter classWriter = new ClassWriter(flags); - classNode.accept(classWriter); - - return classWriter.toByteArray(); - } - - /** - * Converts a byte array into a ClassNode which can then easily be worked with and - * manipulated. - * - * @param classBytes: The byte array representation of the class. - * @return ClassNode: A ClassNode representation of the class, built from the byte array. - */ - public static ClassNode createClassFromByteArray(byte[] classBytes) { - - ClassNode classNode = new ClassNode(); - ClassReader classReader = new ClassReader(classBytes); - classReader.accept(classNode, ClassReader.EXPAND_FRAMES); - return classNode; - } - - /** - * Checks if a ClassNode has an instance of the target method. This does not take - * descriptors into account. - * - * @param classNode: The instance of ClassNode to look through. - * @param methodName: The name of the method you are looking for. - * @return boolean: True if the method is found, false if it is not. - */ - public static boolean hasClassMethodName(ClassNode classNode, String methodName) { - - for (MethodNode method : classNode.methods) - if (methodName.equals(method.name)) - return true; - - return false; - } - - /** - * Retrieves a MethodNode from a ClassNode, if one can not be found, an exception will be - * thrown, and the game will stop. - * - * @param classNode: An instance of the ClassNode to go looking through. - * @param methodName: The name of the desired method. - * @param descriptor: The descriptor for the method, used to find a specific version of the - * desired method. - * @return MethodNode: A MethodNode which represents the desired method. If this method can - * not be found, a MethodNotFoundException will be thrown and the game will stop. - */ - public static MethodNode getMethodFromClass(ClassNode classNode, String methodName, String descriptor) { - - for (MethodNode mnode : classNode.methods) - if (methodName.equals(mnode.name) && descriptor.equals(mnode.desc)) - return mnode; - - throw new MethodNotFoundException(methodName, descriptor); - } - - /** - * Finds the first instruction node after the the provided instruction list, within a - * larger list of instructions. - * - * @param haystack: A complete list of instructions which is being searched through. - * @param needle: A small list of instructions which represents a very specific part of the - * larger instruction list. - * @return AbstractInsnNode: The first instruction node from the specified list of - * instructions. (the needle) - */ - public static AbstractInsnNode findFirstNodeFromNeedle(InsnList haystack, InsnList needle) { - - List ret = InstructionComparator.insnListFindStart(haystack, needle); - - if (ret.size() != 1) - throw new InvalidNeedleException(ret.size()); - - return ret.get(0); - } - - /** - * Finds the last instruction node after the provided instruction list, within a larger - * list of instructions. - * - * @param haystack: A large list of instructions which is being searched through. - * @param needle: A small list of instructions which represents a very specific part of the - * larger instruction list. - * @return AbstractInsnNode: The last instruction node from the specified list of - * instructions. (the needle) - */ - public static AbstractInsnNode findLastNodeFromNeedle(InsnList haystack, InsnList needle) { - - List ret = InstructionComparator.insnListFindEnd(haystack, needle); - - if (ret.size() != 1) - throw new InvalidNeedleException(ret.size()); - - return ret.get(0); - } - - public static class InvalidNeedleException extends RuntimeException { - - /** - * An exception which is thrown when there is an issue working with a needle. This - * could be due to the needle not being found within a hay stack, multiple versions of - * the same needle being found, or another anomaly. - * - * @param count: The amount of the specified needle which was found. - */ - public InvalidNeedleException(int count) { - - super(count > 1 ? "More than one instance of the needle have been found!" : count < 1 ? "The needle was not found" : "There is a glitch in the matrix"); - } - } - - public static class MethodNotFoundException extends RuntimeException { - - /** - * An exception which is thrown when a MethodNode is being looked for, but couldn't be - * found. - * - * @param methodName: The name of the method being looked for. - * @param methodDesc: The descriptor for the method being looked for. - */ - public MethodNotFoundException(String methodName, String methodDesc) { - - super("Attempt to find a method has failed. Method: " + methodName + " Descriptor: " + methodDesc); - } - } -} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/asm/InstructionComparator.java b/src/main/java/minefantasy/mf2/asm/InstructionComparator.java deleted file mode 100644 index c287846b..00000000 --- a/src/main/java/minefantasy/mf2/asm/InstructionComparator.java +++ /dev/null @@ -1,312 +0,0 @@ -package minefantasy.mf2.asm; - -import org.objectweb.asm.tree.*; - -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; - -import static org.objectweb.asm.tree.AbstractInsnNode.*; - -public final class InstructionComparator { - - /** - * Compares whether or not two instructions are equal. - * - * @param node1: The first instruction. - * @param node2: The second instruction. - * @return boolean: True if they are the same, false if they are not. - */ - public static boolean insnEqual(AbstractInsnNode node1, AbstractInsnNode node2) { - - if (node1.getType() != node2.getType()) - return false; - - else if (node1.getOpcode() != node2.getOpcode()) - return false; - - switch (node2.getType()) { - - case VAR_INSN: - return varInsnEqual((VarInsnNode) node1, (VarInsnNode) node2); - - case TYPE_INSN: - return typeInsnEqual((TypeInsnNode) node1, (TypeInsnNode) node2); - - case FIELD_INSN: - return fieldInsnEqual((FieldInsnNode) node1, (FieldInsnNode) node2); - - case METHOD_INSN: - return methodInsnEqual((MethodInsnNode) node1, (MethodInsnNode) node2); - - case LDC_INSN: - return ldcInsnEqual((LdcInsnNode) node1, (LdcInsnNode) node2); - - case IINC_INSN: - return iincInsnEqual((IincInsnNode) node1, (IincInsnNode) node2); - - case INT_INSN: - return intInsnEqual((IntInsnNode) node1, (IntInsnNode) node2); - - default: - return true; - } - } - - // TODO: Add documentation - public static List insnListFindStart(InsnList haystack, InsnList needle) { - - LinkedList callNodes = new LinkedList(); - - for (int callPoint : insnListFind(haystack, needle)) - callNodes.add(haystack.get(callPoint)); - - return callNodes; - } - - // TODO: Add documentation - public static List insnListFind(InsnList haystack, InsnList needle) { - - LinkedList list = new LinkedList(); - - for (int start = 0; start <= haystack.size() - needle.size(); start++) - if (insnListMatches(haystack, needle, start)) - list.add(start); - - return list; - } - - // TODO: Add documentation - public static List insnListFindEnd(InsnList haystack, InsnList needle) { - - LinkedList callNodes = new LinkedList(); - - for (int callPoint : insnListFind(haystack, needle)) - callNodes.add(haystack.get(callPoint + needle.size() - 1)); - - return callNodes; - } - - // TODO: Add documentation - public static List insnListFindL(InsnList haystack, InsnList needle) { - - HashSet controlFlowLabels = new HashSet(); - - for (AbstractInsnNode insn = haystack.getFirst(); insn != null; insn = insn.getNext()) { - - switch (insn.getType()) { - - case 8: - case 15: - break; - - case 7: - JumpInsnNode jinsn = (JumpInsnNode) insn; - controlFlowLabels.add(jinsn.label); - break; - - case 11: - TableSwitchInsnNode tsinsn = (TableSwitchInsnNode) insn; - for (LabelNode label : tsinsn.labels) - controlFlowLabels.add(label); - break; - - case 12: - LookupSwitchInsnNode lsinsn = (LookupSwitchInsnNode) insn; - for (LabelNode label : lsinsn.labels) - controlFlowLabels.add(label); - break; - } - } - - LinkedList list = new LinkedList(); - - nextsection: - for (int start = 0; start <= haystack.size() - needle.size(); start++) { - InsnListSection section = insnListMatchesL(haystack, needle, start, controlFlowLabels); - - if (section != null) { - - for (InsnListSection asection : list) - if (asection.last == section.last) - continue nextsection; - - list.add(section); - } - } - - return list; - } - - // TODO: Add documentation - public static boolean insnListMatches(InsnList haystack, InsnList needle, int start) { - - if (haystack.size() - start < needle.size()) - return false; - - for (int i = 0; i < needle.size(); i++) - if (!insnEqual(haystack.get(i + start), needle.get(i))) - return false; - - return true; - } - - // TODO: Add documentation - private static InsnListSection insnListMatchesL(InsnList haystack, InsnList needle, int start, HashSet controlFlowLabels) { - - int h = start, n = 0; - - for (; h < haystack.size() && n < needle.size(); h++) { - - AbstractInsnNode insn = haystack.get(h); - - if (insn.getType() == 15) - continue; - - if (insn.getType() == 8 && !controlFlowLabels.contains(insn)) - continue; - - if (!insnEqual(haystack.get(h), needle.get(n))) - return null; - - n++; - } - - if (n != needle.size()) - return null; - - return new InsnListSection(haystack, start, h - 1); - } - - /** - * Checks if two IntInsnNodes are the same. For them to be the same, the operand for the - * instructions must be the same. They will also be considered the same, if either operand - * is -1. - * - * @param node1: The first IntInsnNode to compare. - * @param node2: The second IntInsnNode to compare. - * @return boolean: True if the instructions share the same operand, or if either operand - * is -1. - */ - public static boolean intInsnEqual(IntInsnNode node1, IntInsnNode node2) { - - return node1.operand == -1 || node2.operand == -1 || node1.operand == node2.operand; - - } - - /** - * Checks if two LdcInsnNodes are the same. For them to be the same, the constant that is - * to be loaded onto the stack must be the same. They will also be considered the same, if - * either is loading a String object of ~. - * - * @param insn1: The first LdcInsnNode to compare. - * @param insn2: The second LdcInsnNode to compare. - * @return boolean: True if the instructions are loading the same constant, or if either is - * loading "~". - */ - public static boolean ldcInsnEqual(LdcInsnNode insn1, LdcInsnNode insn2) { - - return insn1.cst.equals("~") || insn2.cst.equals("~") || insn1.cst.equals(insn2.cst); - - } - - /** - * Checks if two MethodInsnNodes are the same. For them to be considered the same, both - * instructions must share the same description, owner, and name.. - * - * @param insn1: The first MethodInsNode to compare. - * @param insn2: The second MethodInsnNode to compare. - * @return boolean: True if the instructions share the same owner, the same name, and the - * same description. - */ - public static boolean methodInsnEqual(MethodInsnNode insn1, MethodInsnNode insn2) { - - return insn1.owner.equals(insn2.owner) && insn1.name.equals(insn2.name) && insn1.desc.equals(insn2.desc); - } - - /** - * Checks if two TypeInsnNodes are the same. For them to be considered the same, both - * instructions must share the same description. They will also be considered to be the - * same, if either has a description of ~. - * - * @param insn1: The first TypeInsnNode to compare. - * @param insn2: The second TypeInsnNode to compare. - * @return boolean: True if the instructions share the same description, or if either - * description is ~. - */ - public static boolean typeInsnEqual(TypeInsnNode insn1, TypeInsnNode insn2) { - - return insn1.desc.equals("~") || insn2.desc.equals("~") || insn1.desc.equals(insn2.desc); - - } - - /** - * Checks two VarInsnNodes to see if they are the same. For them to be the same, their - * variable index must be the same. They will also be considered the same if either one has - * an index of -1. - * - * @param insn1: The first VarInsnNode to compare. - * @param insn2: The second VarInsnNode to compare. - * @return boolean: True if the instructions share the same variable index, or if either - * instruction has an index of -1. - */ - public static boolean varInsnEqual(VarInsnNode insn1, VarInsnNode insn2) { - - return insn1.var == -1 || insn2.var == -1 || insn1.var == insn2.var; - - } - - /** - * Checks if two IincInsnNodes are the same. For them to be the same, they must share the - * same local variable index, and increment by the same amount. - * - * @param node1: The first IincInsnNode to compare. - * @param node2: The second IincInsnNode to compare. - * @return boolean: True if the instructions share the same local variable index, and - * increment by the same amount. - */ - public static boolean iincInsnEqual(IincInsnNode node1, IincInsnNode node2) { - - return node1.var == node2.var && node1.incr == node2.incr; - } - - /** - * Checks if two FieldInsnNodes are the same. For them to be the same, the owner, name and - * description must be the same. - * - * @param insn1: The first instruction to compare. - * @param insn2: The second instruction to compare. - * @return boolean: True if the instructions share the same owner, name and description. - */ - public static boolean fieldInsnEqual(FieldInsnNode insn1, FieldInsnNode insn2) { - - return insn1.owner.equals(insn2.owner) && insn1.name.equals(insn2.name) && insn1.desc.equals(insn2.desc); - } - - public static class InsnListSection { - - /** - * The first instruction in a section. - */ - public AbstractInsnNode first; - - /** - * The last instruction in a section. - */ - public AbstractInsnNode last; - - /** - * Creates an object which reflects the first and last instruction within a list of - * instructions. - * - * @param haystack: The list of instructions to reflect. - * @param start: The index of the first instruction. - * @param end: The index of the last instruction. - */ - public InsnListSection(InsnList haystack, int start, int end) { - - this.first = haystack.get(start); - this.last = haystack.get(end); - } - } -} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/asm/MFClassTransformer.java b/src/main/java/minefantasy/mf2/asm/MFClassTransformer.java deleted file mode 100644 index 4c08851f..00000000 --- a/src/main/java/minefantasy/mf2/asm/MFClassTransformer.java +++ /dev/null @@ -1,17 +0,0 @@ -package minefantasy.mf2.asm; - -import minefantasy.mf2.asm.transformers.EntityHorseTransformer; -import net.minecraft.launchwrapper.IClassTransformer; - -public class MFClassTransformer implements IClassTransformer { - - @Override - public byte[] transform(String name, String transformedName, byte[] classBytes) { - if (transformedName.equals("net.minecraft.entity.passive.EntityHorse")) { - return EntityHorseTransformer.transform(name, transformedName, classBytes); - } - - return classBytes; - } - -} diff --git a/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java b/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java deleted file mode 100644 index 2c24f8e6..00000000 --- a/src/main/java/minefantasy/mf2/asm/MFLoadingPlugin.java +++ /dev/null @@ -1,38 +0,0 @@ -package minefantasy.mf2.asm; - -import cpw.mods.fml.relauncher.IFMLLoadingPlugin; - -import java.util.Map; - -@IFMLLoadingPlugin.SortingIndex(1001) -@IFMLLoadingPlugin.TransformerExclusions("minefantasy.mf2.asm") -@IFMLLoadingPlugin.MCVersion("1.7.10") -public class MFLoadingPlugin implements IFMLLoadingPlugin { - - @Override - public String[] getASMTransformerClass() { - ASMHelper.isASMEnabled = true; - return new String[]{MFClassTransformer.class.getName()}; - } - - @Override - public String getModContainerClass() { - return null; - } - - @Override - public String getSetupClass() { - return null; - } - - @Override - public void injectData(Map data) { - ASMHelper.isSrg = (Boolean) data.get("runtimeDeobfuscationEnabled"); - new Mappings(); - } - - @Override - public String getAccessTransformerClass() { - return null; - } -} diff --git a/src/main/java/minefantasy/mf2/asm/Mappings.java b/src/main/java/minefantasy/mf2/asm/Mappings.java deleted file mode 100644 index 69646e06..00000000 --- a/src/main/java/minefantasy/mf2/asm/Mappings.java +++ /dev/null @@ -1,85 +0,0 @@ -package minefantasy.mf2.asm; - -public class Mappings { - - // Fields - public static String rand; - public static String enchantLevels; - public static String dataWatcher; - public static String stick; - public static String armorValues; - public static String isHorseSaddled; - public static String horseTextureArray; - public static String texturePrefix; - public static String iron_horse_armor; - public static String diamond_horse_armor; - public static String horseChest; - - // Methods - public static String interact; - public static String isArmorItem; - public static String entityInit; - public static String updateHorseSlots; - public static String onInventoryChanged; - public static String getTotalArmorValue; - public static String setHorseTexturePaths; - public static String getWatchableObjectItemStack; - public static String updateObject; - public static String getHorseArmorIndexSynced; - public static String getItem; - public static String playSound; - public static String isItemEqual; - public static String addObject; - public static String getStackInSlot; - public static String getUnlocalizedName; - public static String getInteger; - public static String hasKey; - public static String getTagCompound; - public static String hasTagCompound; - public static String getColorFromItemStack; - - public static String renderHorse; - public static String shouldRenderPass; - - public Mappings() { - - // Fields - rand = ASMHelper.getAppropriateMapping("rand", "field_75169_l"); - enchantLevels = ASMHelper.getAppropriateMapping("enchantLevels", "field_75167_g"); - dataWatcher = ASMHelper.getAppropriateMapping("dataWatcher", "field_70180_af"); - stick = ASMHelper.getAppropriateMapping("stick", "field_151055_y"); - armorValues = ASMHelper.getAppropriateMapping("armorValues", "field_110272_by"); - isHorseSaddled = ASMHelper.getAppropriateMapping("isHorseSaddled", "func_110257_ck"); - horseTextureArray = ASMHelper.getAppropriateMapping("field_110280_bR", "field_110280_bR"); - texturePrefix = ASMHelper.getAppropriateMapping("field_110286_bQ", "field_110286_bQ"); - iron_horse_armor = ASMHelper.getAppropriateMapping("iron_horse_armor", "field_151138_bX"); - diamond_horse_armor = ASMHelper.getAppropriateMapping("diamond_horse_armor", "field_151125_bZ"); - horseChest = ASMHelper.getAppropriateMapping("horseChest", "field_110296_bG"); - - // Methods - interact = ASMHelper.getAppropriateMapping("interact", "func_70085_c"); - isArmorItem = ASMHelper.getAppropriateMapping("func_146085_a", "func_146085_a"); - entityInit = ASMHelper.getAppropriateMapping("entityInit", "func_70088_a"); - updateHorseSlots = ASMHelper.getAppropriateMapping("func_110232_cE", "func_110232_cE"); - onInventoryChanged = ASMHelper.getAppropriateMapping("onInventoryChanged", "func_76316_a"); - getTotalArmorValue = ASMHelper.getAppropriateMapping("getTotalArmorValue", "func_70658_aO"); - setHorseTexturePaths = ASMHelper.getAppropriateMapping("setHorseTexturePaths", "func_110247_cG"); - getWatchableObjectItemStack = ASMHelper.getAppropriateMapping("getWatchableObjectItemStack", "func_82710_f"); - updateObject = ASMHelper.getAppropriateMapping("updateObject", "func_75692_b"); - getHorseArmorIndexSynced = ASMHelper.getAppropriateMapping("func_110241_cb", "func_110241_cb"); - getItem = ASMHelper.getAppropriateMapping("getItem", "func_77973_b"); - playSound = ASMHelper.getAppropriateMapping("playSound", "func_85030_a"); - isItemEqual = ASMHelper.getAppropriateMapping("isItemEqual", "func_77969_a"); - addObject = ASMHelper.getAppropriateMapping("addObject", "func_75682_a"); - getStackInSlot = ASMHelper.getAppropriateMapping("getStackInSlot", "func_70301_a"); - getUnlocalizedName = ASMHelper.getAppropriateMapping("getUnlocalizedName", "func_77977_a"); - getInteger = ASMHelper.getAppropriateMapping("getInteger", "func_74762_e"); - hasKey = ASMHelper.getAppropriateMapping("hasKey", "func_74764_b"); - getTagCompound = ASMHelper.getAppropriateMapping("getTagCompound", "func_77978_p"); - hasTagCompound = ASMHelper.getAppropriateMapping("hasTagCompound", "func_77942_o"); - getColorFromItemStack = ASMHelper.getAppropriateMapping("getColorFromItemStack", "func_82790_a"); - - renderHorse = ASMHelper.getAppropriateMapping("RenderHorse", "bnv"); - shouldRenderPass = ASMHelper.getAppropriateMapping("shouldRenderPass", "func_77032_a"); - } -} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java b/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java deleted file mode 100644 index fd07f1f1..00000000 --- a/src/main/java/minefantasy/mf2/asm/transformers/EntityHorseTransformer.java +++ /dev/null @@ -1,361 +0,0 @@ -// Based on @SanAndreasP code (from Bookshelf lib) - -package minefantasy.mf2.asm.transformers; - -import minefantasy.mf2.asm.ASMHelper; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Label; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.*; - -import static minefantasy.mf2.asm.Mappings.*; - -public class EntityHorseTransformer { - - public static byte[] transform(String name, String transformedName, byte[] bytes) { - - ClassNode horseClass = ASMHelper.createClassFromByteArray(bytes); - - injectGetCustomBookshelfArmor(horseClass); - injectSetCustomBoookhelfArmor(horseClass); - transformGetTotalArmorValue(ASMHelper.getMethodFromClass(horseClass, getTotalArmorValue, "()I")); - transformOnInventoryChanged(ASMHelper.getMethodFromClass(horseClass, onInventoryChanged, "(Lnet/minecraft/inventory/InventoryBasic;)V")); - transformUpdateHorseSlots(ASMHelper.getMethodFromClass(horseClass, updateHorseSlots, "()V")); - transformEntityInit(ASMHelper.getMethodFromClass(horseClass, entityInit, "()V")); - transformIsValidArmor(ASMHelper.getMethodFromClass(horseClass, isArmorItem, "(Lnet/minecraft/item/Item;)Z")); - - /* if (ASMHelper.hasClassMethodName(horseClass, setHorseTexturePaths)) - transformSetHorseTexturePaths(ASMHelper.getMethodFromClass(horseClass, setHorseTexturePaths, "()V"));*/ - - return ASMHelper.createByteArrayFromClass(horseClass, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); - } - - /** - * Injects a new method into the EntityHorse class. This new method allows for the - * retrieval of a custom armor item that is stored on bit 23 of the DataWatcher. - * - * @param horseClass: A ClassNode representation of the EntityHorse class. - */ - private static void injectGetCustomBookshelfArmor(ClassNode horseClass) { - - MethodNode newMethod = new MethodNode(Opcodes.ACC_PRIVATE, "getCustomBookshelfArmor", "()Lnet/minecraft/item/ItemStack;", null, null); - newMethod.visitCode(); - - Label l0 = new Label(); - newMethod.visitLabel(l0); - newMethod.visitVarInsn(Opcodes.ALOAD, 0); - newMethod.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", dataWatcher, "Lnet/minecraft/entity/DataWatcher;"); - newMethod.visitIntInsn(Opcodes.BIPUSH, 23); - newMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/DataWatcher", getWatchableObjectItemStack, "(I)Lnet/minecraft/item/ItemStack;", false); - newMethod.visitInsn(Opcodes.ARETURN); - - Label l1 = new Label(); - newMethod.visitLabel(l1); - newMethod.visitLocalVariable("this", "Lnet/minecraft/entity/passive/EntityHorse;", null, l0, l1, 0); - newMethod.visitMaxs(2, 1); - newMethod.visitEnd(); - - horseClass.methods.add(newMethod); - } - - /** - * Injects a new method into the EntityHorse class. This new method allows for the setting - * of a custom armor item which is stored on bit 23 of the DataWatcher. - * - * @param horseClass: A ClassNode representation of the EntityHorse class. - */ - private static void injectSetCustomBoookhelfArmor(ClassNode horseClass) { - - MethodNode newMethod = new MethodNode(Opcodes.ACC_PRIVATE, "setCustomBookshelfArmor", "(Lnet/minecraft/item/ItemStack;)V", null, null); - newMethod.visitCode(); - - Label l0 = new Label(); - newMethod.visitLabel(l0); - newMethod.visitVarInsn(Opcodes.ALOAD, 1); - - Label l1 = new Label(); - newMethod.visitJumpInsn(Opcodes.IFNONNULL, l1); - newMethod.visitTypeInsn(Opcodes.NEW, "net/minecraft/item/ItemStack"); - newMethod.visitInsn(Opcodes.DUP); - newMethod.visitFieldInsn(Opcodes.GETSTATIC, "net/minecraft/init/Items", stick, "Lnet/minecraft/item/Item;"); - newMethod.visitInsn(Opcodes.ICONST_0); - newMethod.visitMethodInsn(Opcodes.INVOKESPECIAL, "net/minecraft/item/ItemStack", "", "(Lnet/minecraft/item/Item;I)V", false); - newMethod.visitVarInsn(Opcodes.ASTORE, 1); - newMethod.visitLabel(l1); - newMethod.visitFrame(Opcodes.F_SAME, 0, null, 0, null); - newMethod.visitVarInsn(Opcodes.ALOAD, 0); - newMethod.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", dataWatcher, "Lnet/minecraft/entity/DataWatcher;"); - newMethod.visitIntInsn(Opcodes.BIPUSH, 23); - newMethod.visitVarInsn(Opcodes.ALOAD, 1); - newMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/DataWatcher", updateObject, "(ILjava/lang/Object;)V", false); - - Label l3 = new Label(); - newMethod.visitLabel(l3); - newMethod.visitInsn(Opcodes.RETURN); - - Label l4 = new Label(); - newMethod.visitLabel(l4); - newMethod.visitLocalVariable("this", "Lnet/minecraft/entity/passive/EntityHorse;", null, l0, l3, 0); - newMethod.visitLocalVariable("stack", "Lnet/minecraft/item/ItemStack;", null, l0, l3, 1); - newMethod.visitMaxs(5, 2); - newMethod.visitEnd(); - - horseClass.methods.add(newMethod); - } - - /** - * Transforms the getTotalArmorValue method to take custom armor items into consideration. - * This is done by checking if the item stored within he 23rd bit of the data watcher is an - * instance of Bookshelf's implementation of ItemHorseArmor, if it is, the value returned - * by the item's getArmorValue method will be returned by this method. - * - * @param method: Instance of a MethodNode representation of the getTotalArmorValue method. - */ - private static void transformGetTotalArmorValue(MethodNode method) { - - InsnList newInstr = new InsnList(); - - newInstr.add(new LabelNode()); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/passive/EntityHorse", "getCustomBookshelfArmor", "()Lnet/minecraft/item/ItemStack;", false)); - newInstr.add(new VarInsnNode(Opcodes.ASTORE, 1)); - newInstr.add(new LabelNode()); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 1)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getItem, "()Lnet/minecraft/item/Item;", false)); - newInstr.add(new TypeInsnNode(Opcodes.INSTANCEOF, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase")); - - LabelNode l2 = new LabelNode(); - newInstr.add(new JumpInsnNode(Opcodes.IFEQ, l2)); - newInstr.add(new LabelNode()); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 1)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getItem, "()Lnet/minecraft/item/Item;", false)); - newInstr.add(new TypeInsnNode(Opcodes.CHECKCAST, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase")); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 1)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase", "getArmorValue", "(Lnet/minecraft/entity/passive/EntityHorse;Lnet/minecraft/item/ItemStack;)I", false)); - newInstr.add(new InsnNode(Opcodes.IRETURN)); - newInstr.add(l2); - - method.instructions.insertBefore(method.instructions.getFirst(), newInstr); - } - - /** - * Transforms the onInventoryChanged method to take custom armor items into consideration - * when updating the inventory. - * - * @param method: Instance of a MethodNode representation of the onInventoryChanged method. - */ - private static void transformOnInventoryChanged(MethodNode method) { - - InsnList needle = new InsnList(); - needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); - needle.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/passive/EntityHorse", isHorseSaddled, "()Z", false)); - needle.add(new VarInsnNode(Opcodes.ISTORE, 3)); - - AbstractInsnNode pointer = ASMHelper.findLastNodeFromNeedle(method.instructions, needle); - - InsnList newInstr = new InsnList(); - - newInstr.add(new LabelNode()); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/passive/EntityHorse", "getCustomBookshelfArmor", "()Lnet/minecraft/item/ItemStack;", false)); - newInstr.add(new VarInsnNode(Opcodes.ASTORE, 4)); - - method.instructions.insert(pointer, newInstr); - - needle = new InsnList(); - needle.add(new LdcInsnNode("mob.horse.armor")); - needle.add(new LdcInsnNode(new Float("0.5"))); - needle.add(new InsnNode(Opcodes.FCONST_1)); - needle.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/passive/EntityHorse", playSound, "(Ljava/lang/String;FF)V", false)); - needle.add(new LabelNode()); - - pointer = ASMHelper.findLastNodeFromNeedle(method.instructions, needle); - - newInstr = new InsnList(); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getItem, "()Lnet/minecraft/item/Item;", false)); - newInstr.add(new FieldInsnNode(Opcodes.GETSTATIC, "net/minecraft/init/Items", stick, "Lnet/minecraft/item/Item;")); - - LabelNode l9 = new LabelNode(); - newInstr.add(new JumpInsnNode(Opcodes.IF_ACMPNE, l9)); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/passive/EntityHorse", "getCustomBookshelfArmor", "()Lnet/minecraft/item/ItemStack;", false)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", isItemEqual, "(Lnet/minecraft/item/ItemStack;)Z", false)); - newInstr.add(new JumpInsnNode(Opcodes.IFNE, l9)); - - newInstr.add(new LabelNode()); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new LdcInsnNode("mob.horse.armor")); - newInstr.add(new LdcInsnNode(new Float("0.5"))); - newInstr.add(new InsnNode(Opcodes.FCONST_1)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/passive/EntityHorse", playSound, "(Ljava/lang/String;FF)V", false)); - newInstr.add(l9); - - method.instructions.insert(pointer, newInstr); - } - - /** - * Transforms the setHorseTexturePaths method to take our custom armor item into - * consideration. If the horse has a custom armor item in it's inventory and that item is - * an instance of our ItemHorseArmor implementation, the item's getArmorTexture method will - * me used for the armor texture path. - * - * @param method: Instance of a MethodNode representation of the setHorseTexturePaths - * method. - */ - private static void transformSetHorseTexturePaths(MethodNode method) { - - InsnList needle = new InsnList(); - needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); - needle.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/passive/EntityHorse", getHorseArmorIndexSynced, "()I", false)); - needle.add(new VarInsnNode(Opcodes.ISTORE, 3)); - - AbstractInsnNode node = ASMHelper.findLastNodeFromNeedle(method.instructions, needle); - - InsnList newInstr = new InsnList(); - - LabelNode l17 = new LabelNode(); - newInstr.add(l17); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/passive/EntityHorse", "getCustomBookshelfArmor", "()Lnet/minecraft/item/ItemStack;", false)); - newInstr.add(new VarInsnNode(Opcodes.ASTORE, 4)); - - LabelNode l18 = new LabelNode(); - newInstr.add(l18); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getItem, "()Lnet/minecraft/item/Item;", false)); - newInstr.add(new TypeInsnNode(Opcodes.INSTANCEOF, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase")); - - LabelNode l19 = new LabelNode(); - newInstr.add(new JumpInsnNode(Opcodes.IFEQ, l19)); - - LabelNode l20 = new LabelNode(); - newInstr.add(l20); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", horseTextureArray, "[Ljava/lang/String;")); - newInstr.add(new InsnNode(Opcodes.ICONST_2)); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getItem, "()Lnet/minecraft/item/Item;", false)); - newInstr.add(new TypeInsnNode(Opcodes.CHECKCAST, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase")); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase", "getArmorTexture", "(Lnet/minecraft/entity/passive/EntityHorse;Lnet/minecraft/item/ItemStack;)Ljava/lang/String;", false)); - newInstr.add(new InsnNode(Opcodes.AASTORE)); - - LabelNode l21 = new LabelNode(); - newInstr.add(l21); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new TypeInsnNode(Opcodes.NEW, "java/lang/StringBuilder")); - newInstr.add(new InsnNode(Opcodes.DUP)); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", texturePrefix, "Ljava/lang/String;")); - newInstr.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/lang/String", "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;", false)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "", "(Ljava/lang/String;)V", false)); - newInstr.add(new LdcInsnNode("cst-")); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false)); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 4)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/item/ItemStack", getUnlocalizedName, "()Ljava/lang/String;", false)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false)); - newInstr.add(new FieldInsnNode(Opcodes.PUTFIELD, "net/minecraft/entity/passive/EntityHorse", texturePrefix, "Ljava/lang/String;")); - newInstr.add(new InsnNode(Opcodes.RETURN)); - newInstr.add(l19); - - method.instructions.insert(node, newInstr); - } - - /** - * Transforms the updateHorseSlots method to take custom armor items into consideration. - * When an item is set to the armor slot, it will also be stored under our data bit in the - * data watcher. - * - * @param method: Instance of a MethodNode representation of the updateHorseSlots method. - */ - private static void transformUpdateHorseSlots(MethodNode method) { - - InsnList needle = new InsnList(); - needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); - needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); - needle.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", horseChest, "Lnet/minecraft/inventory/AnimalChest;")); - needle.add(new InsnNode(Opcodes.ICONST_1)); - - AbstractInsnNode pointer = ASMHelper.findFirstNodeFromNeedle(method.instructions, needle); - - InsnList newInstr = new InsnList(); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", horseChest, "Lnet/minecraft/inventory/AnimalChest;")); - newInstr.add(new InsnNode(Opcodes.ICONST_1)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/inventory/AnimalChest", getStackInSlot, "(I)Lnet/minecraft/item/ItemStack;", false)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/entity/passive/EntityHorse", "setCustomBookshelfArmor", "(Lnet/minecraft/item/ItemStack;)V", false)); - newInstr.add(new LabelNode()); - - method.instructions.insertBefore(pointer, newInstr); - } - - /** - * Transforms the entityInit method to designate the 23rd bit within the DataWatcher to - * store an ItemStack. This storage is used by our custom methods. - * - * @param method: Instance of a MethodNode representation of the entityInit method. - */ - private static void transformEntityInit(MethodNode method) { - - InsnList needle = new InsnList(); - needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); - needle.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", dataWatcher, "Lnet/minecraft/entity/DataWatcher;")); - needle.add(new IntInsnNode(Opcodes.BIPUSH, 22)); - needle.add(new InsnNode(Opcodes.ICONST_0)); - needle.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false)); - needle.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/DataWatcher", addObject, "(ILjava/lang/Object;)V", false)); - - AbstractInsnNode pointer = ASMHelper.findLastNodeFromNeedle(method.instructions, needle); - - InsnList newInstr = new InsnList(); - newInstr.add(new LabelNode()); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/entity/passive/EntityHorse", dataWatcher, "Lnet/minecraft/entity/DataWatcher;")); - newInstr.add(new IntInsnNode(Opcodes.BIPUSH, 23)); - newInstr.add(new TypeInsnNode(Opcodes.NEW, "net/minecraft/item/ItemStack")); - newInstr.add(new InsnNode(Opcodes.DUP)); - newInstr.add(new FieldInsnNode(Opcodes.GETSTATIC, "net/minecraft/init/Items", stick, "Lnet/minecraft/item/Item;")); - newInstr.add(new InsnNode(Opcodes.ICONST_0)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "net/minecraft/item/ItemStack", "", "(Lnet/minecraft/item/Item;I)V", false)); - newInstr.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "net/minecraft/entity/DataWatcher", addObject, "(ILjava/lang/Object;)V", false)); - - method.instructions.insert(pointer, newInstr); - } - - /** - * Transforms the isValidArmor method to accept items which use our implementation of - * ItemHorseArmor as a valid horse armor item. - * - * @param method: Instance of a MethodNode representation of the isValidArmor method. - */ - private static void transformIsValidArmor(MethodNode method) { - - InsnList needle = new InsnList(); - needle.add(new VarInsnNode(Opcodes.ALOAD, 0)); - needle.add(new FieldInsnNode(Opcodes.GETSTATIC, "net/minecraft/init/Items", iron_horse_armor, "Lnet/minecraft/item/Item;")); - needle.add(new JumpInsnNode(Opcodes.IF_ACMPEQ, new LabelNode())); - - AbstractInsnNode node = ASMHelper.findFirstNodeFromNeedle(method.instructions, needle); - - InsnList newInstr = new InsnList(); - newInstr.add(new VarInsnNode(Opcodes.ALOAD, 0)); - newInstr.add(new TypeInsnNode(Opcodes.INSTANCEOF, "minefantasy/mf2/api/armour/ItemHorseArmorMFBase")); - - LabelNode ln = new LabelNode(); - newInstr.add(new JumpInsnNode(Opcodes.IFEQ, ln)); - newInstr.add(new LabelNode()); - newInstr.add(new InsnNode(Opcodes.ICONST_1)); - newInstr.add(new InsnNode(Opcodes.IRETURN)); - newInstr.add(ln); - - newInstr.add(new FrameNode(Opcodes.F_SAME, 0, null, 0, null)); - - method.instructions.insertBefore(node, newInstr); - } -} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java b/src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java deleted file mode 100644 index 7d08aed1..00000000 --- a/src/main/java/minefantasy/mf2/asm/transformers/RenderHorseTransformer.java +++ /dev/null @@ -1,33 +0,0 @@ -package minefantasy.mf2.asm.transformers; - -import minefantasy.mf2.asm.ASMHelper; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.tree.MethodNode; - -import static minefantasy.mf2.asm.Mappings.shouldRenderPass; - -public class RenderHorseTransformer { - - public static byte[] transform(String name, String transformedName, byte[] bytes) { - ClassNode horseRenderClass = ASMHelper.createClassFromByteArray(bytes); - - injectShouldRenderPass(horseRenderClass); - //transformRenderVanillaHorse(horseRenderClass); - - return ASMHelper.createByteArrayFromClass(horseRenderClass, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); - } - - private static void transformRenderVanillaHorse(MethodNode node) { - - } - - private static void injectShouldRenderPass(ClassNode node) { - MethodNode newMethod = new MethodNode(Opcodes.ACC_PROTECTED, shouldRenderPass, "(Lnet/minecraft/entity/EntityLivingBase;IF)I", null, null); - newMethod.visitCode(); - - node.methods.add(newMethod); - } - -} diff --git a/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java b/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java index cdd0ffbf..ced79a17 100644 --- a/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java +++ b/src/main/java/minefantasy/mf2/block/crafting/BlockSalvage.java @@ -85,11 +85,11 @@ public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer u ItemStack held = user.getHeldItem(); String toolType = ToolHelper.getCrafterTool(held); - /* + /* * Block above = world.getBlock(x, y+1, z); if(above != null) { - * if(salvageBlock(world, user, above, x, y, z)) { world.setBlockToAir(x, y+1, - * z); return true; } } - */ + * if(salvageBlock(world, user, above, x, y, z)) { world.setBlockToAir(x, y+1, + * z); return true; } } + */ EntityItem drop = getDrop(world, x, y, z); if (drop != null && !user.isSwingInProgress) { @@ -114,14 +114,14 @@ public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer u } return false; } - /* - * private boolean salvageBlock(World world, EntityPlayer user, Block junk, int - * x, int y, int z) { List salvage = Salvage.salvageBlock(junk, - * dropLevel); - * - * if(salvage != null) { dropSalvage(world, x, y, z, salvage); - * world.playAuxSFX(1021, x, y, z, 0); return true; } return false; } - */ + /* + * private boolean salvageBlock(World world, EntityPlayer user, Block junk, int + * x, int y, int z) { List salvage = Salvage.salvageBlock(junk, + * dropLevel); + * + * if(salvage != null) { dropSalvage(world, x, y, z, salvage); + * world.playAuxSFX(1021, x, y, z, 0); return true; } return false; } + */ private boolean salvageItem(World world, EntityPlayer user, ItemStack junk, int x, int y, int z) { float modifier = 0.5F; diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java index 22eaf576..50d3bfe5 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityBigFurnace.java @@ -398,11 +398,11 @@ public ItemStack getResult(ItemStack item) { public ItemStack getSpecialResult() { return null; /* - * ItemStack[] input = new ItemStack[4]; for(int a = 0; a < 4; a ++) { input[a] - * = inv[a]; } Alloy alloy = SpecialFurnaceRecipes.getResult(input); if(alloy != - * null) { if(alloy.getLevel() <= getSmeltLevel()) { return - * SpecialFurnaceRecipes.getResult(input).getRecipeOutput(); } } return null; - */ + * ItemStack[] input = new ItemStack[4]; for(int a = 0; a < 4; a ++) { input[a] + * = inv[a]; } Alloy alloy = SpecialFurnaceRecipes.getResult(input); if(alloy != + * null) { if(alloy.getLevel() <= getSmeltLevel()) { return + * SpecialFurnaceRecipes.getResult(input).getRecipeOutput(); } } return null; + */ } public int getSizeInventory() { @@ -624,12 +624,12 @@ private void sendPacketToClients() { } } - /* - * @Override public void recievePacket(ByteArrayDataInput data) { fuel = - * data.readInt(); progress = data.readInt(); direction = data.readInt(); heat = - * data.readInt(); int burn = data.readInt(); isBurningClient = burn == 1; - * justShared = data.readInt(); doorAngle = data.readInt(); } - */ + /* + * @Override public void recievePacket(ByteArrayDataInput data) { fuel = + * data.readInt(); progress = data.readInt(); direction = data.readInt(); heat = + * data.readInt(); int burn = data.readInt(); isBurningClient = burn == 1; + * justShared = data.readInt(); doorAngle = data.readInt(); } + */ public int getBlockMetadata() { if (worldObj == null) diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java index b90837f4..4205693a 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityChimney.java @@ -30,10 +30,10 @@ public void updateEntity() { if (lastSharedInt > 0) --lastSharedInt; - /* + /* * TODO Custom Tex if(ticksExistedTemp == 20) { - * MineFantasyII.debugMsg("Chimney Loaded R = " + worldObj.isRemote); sync(); } - */ + * MineFantasyII.debugMsg("Chimney Loaded R = " + worldObj.isRemote); sync(); } + */ if (smokeStorage > 0) { if (!isPipeChimney()) { SmokeMechanics.emitSmokeFromCarrier(worldObj, xCoord, yCoord, zCoord, this, 5); @@ -125,12 +125,12 @@ public void setBlock(int id) { } public void setBlock(int id, int subId) { - /* - * TODO Custom Tex maskMeta = subId; Block newblock = Block.getBlockById(id); - * if(newblock != null) { maskBlock = newblock; } if(worldObj != null && - * worldObj.isRemote) { worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, - * zCoord, xCoord, yCoord, zCoord); } - */ + /* + * TODO Custom Tex maskMeta = subId; Block newblock = Block.getBlockById(id); + * if(newblock != null) { maskBlock = newblock; } if(worldObj != null && + * worldObj.isRemote) { worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, + * zCoord, xCoord, yCoord, zCoord); } + */ } @Override @@ -152,19 +152,19 @@ public int getMaxSmokeStorage() { } public void sync() { - /* - * TODO Custom Tex MineFantasyII.debugMsg("Block For Chimney = " + - * maskBlock.getUnlocalizedName() + " R = " + worldObj.isRemote); - * if(!worldObj.isRemote) { MineFantasyII.debugMsg("Syncing Chimney " + xCoord + - * ", " + yCoord + ", " + zCoord); List players = - * ((WorldServer)worldObj).playerEntities; for(int i = 0; i < players.size(); - * i++) { EntityPlayer player = players.get(i); - * ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new - * ChimneyPacket(this).generatePacket()); } } - * MineFantasyII.debugMsg("Syncing Render " + xCoord + ", " + yCoord + ", " + - * zCoord); worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, - * xCoord, yCoord, zCoord); - */ + /* + * TODO Custom Tex MineFantasyII.debugMsg("Block For Chimney = " + + * maskBlock.getUnlocalizedName() + " R = " + worldObj.isRemote); + * if(!worldObj.isRemote) { MineFantasyII.debugMsg("Syncing Chimney " + xCoord + + * ", " + yCoord + ", " + zCoord); List players = + * ((WorldServer)worldObj).playerEntities; for(int i = 0; i < players.size(); + * i++) { EntityPlayer player = players.get(i); + * ((WorldServer)worldObj).getEntityTracker().func_151248_b(player, new + * ChimneyPacket(this).generatePacket()); } } + * MineFantasyII.debugMsg("Syncing Render " + xCoord + ", " + yCoord + ", " + + * zCoord); worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, + * xCoord, yCoord, zCoord); + */ } public BlockChimney getActiveBlock() { diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java index 1db47927..3a8617af 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityCrucible.java @@ -40,10 +40,10 @@ public void updateEntity() { progressMax = 2000; } - /* + /* * int time = 400; for(int a = 1; a < getSizeInventory()-1; a ++) { if(inv[a] != - * null) { time += 50; } } if(!worldObj.isRemote) { progressMax = time; } - */ + * null) { time += 50; } } if(!worldObj.isRemote) { progressMax = time; } + */ if (isHot && canSmelt()) { progress += (temperature / 600F); diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java index 7af3b312..4f0af98c 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityForge.java @@ -560,14 +560,14 @@ public float getBlockTemperature() { return 0; } - /* - * private void averageAllItems() { /* int temp = 0; int items = 0; - * for(ItemStack item: inv) { if(item != null && item.getItem() instanceof - * IHotItem) { ++items; temp += ItemHeated.getTemp(item); } } int average = - * (int)((float)temp / items); for(ItemStack item: inv) { if(item != null && - * item.getItem() instanceof IHotItem) { ItemHeated.setTemp(item, average); } } - * } - */ + /* + * private void averageAllItems() { /* int temp = 0; int items = 0; + * for(ItemStack item: inv) { if(item != null && item.getItem() instanceof + * IHotItem) { ++items; temp += ItemHeated.getTemp(item); } } int average = + * (int)((float)temp / items); for(ItemStack item: inv) { if(item != null && + * item.getItem() instanceof IHotItem) { ItemHeated.setTemp(item, average); } } + * } + */ public boolean hasBlockAbove() { if (worldObj == null) diff --git a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java index c3b5c2a0..b4c7031d 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/TileEntityQuern.java @@ -101,9 +101,9 @@ private boolean tryCraft(ItemStack result, boolean consumePot) { worldObj.playSoundEffect(xCoord, yCoord, zCoord, "minefantasy2:block.craftprimitive", 0.5F, 1.2F); /* * if(rand.nextFloat() > 0.20F)//20% success rate { - * worldObj.playSoundEffect(xCoord, yCoord, zCoord, "dig.gravel", 1.0F, 0.5F); - * return false; } else - */ + * worldObj.playSoundEffect(xCoord, yCoord, zCoord, "dig.gravel", 1.0F, 0.5F); + * return false; } else + */ this.decrStackSize(0, 1); if (consumePot) { diff --git a/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java b/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java index 4a85425c..23d5c88c 100644 --- a/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java +++ b/src/main/java/minefantasy/mf2/client/render/MineFantasyHUD.java @@ -361,10 +361,10 @@ private void renderStaminaBar(EntityPlayer player) { this.drawTexturedModalRect(xPos, yPos, 0, 10, 81, 5); } /* - * else if(StaminaBar.getBonusStaminaRegenTicks(player) > 0 && - * player.ticksExisted % 10 < 5) { this.drawTexturedModalRect(xPos, yPos, 0, 15, - * 81, 5); } - */ + * else if(StaminaBar.getBonusStaminaRegenTicks(player) > 0 && + * player.ticksExisted % 10 < 5) { this.drawTexturedModalRect(xPos, yPos, 0, 15, + * 81, 5); } + */ String stamTxt = (int) staminaAt + " / " + (int) staminaMax; boolean bonus = StaminaBar.getBonusStamina(player) > 0; diff --git a/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java b/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java index a3ab3eac..a822b5a7 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderCrossbow.java @@ -251,11 +251,11 @@ private void renderIcon(Minecraft mc, ItemStack item, Tessellator tessellator, I float var11 = 0.3F; GL11.glEnable(GL12.GL_RESCALE_NORMAL); /* - * GL11.glTranslatef(-var10, -var11, 0.0F); float var12 = 1.5F; - * GL11.glScalef(var12, var12, var12); GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); - * GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(-0.9375F, - * -0.0625F, 0.0F); - */ + * GL11.glTranslatef(-var10, -var11, 0.0F); float var12 = 1.5F; + * GL11.glScalef(var12, var12, var12); GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); + * GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(-0.9375F, + * -0.0625F, 0.0F); + */ GL11.glScalef(scale, scale, scale); ItemRenderer.renderItemIn2D(tessellator, x2, y1, x1, y2, (icon.getIconWidth()), (icon.getIconHeight()), diff --git a/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java b/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java index 7f47290a..c7f0c763 100644 --- a/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java +++ b/src/main/java/minefantasy/mf2/client/render/armour/ModelFullplate.java @@ -45,11 +45,11 @@ public ModelFullplate(float f) { armetface.setRotationPoint(0F, -1F, -5F); setRotation(armetface, 0F, 0.7853982F, 0F); - /* + /* * armetface = new ModelRenderer(this, 20, 32); armetface.addBox(-2.5F, -2.5F, - * -2.6F, 5, 4, 5); armetface.setRotationPoint(0F, -0.5F, -4F); - * setRotation(armetface, 0.2617994F, 0.7853982F, 0.2617994F); - */ + * -2.6F, 5, 4, 5); armetface.setRotationPoint(0F, -0.5F, -4F); + * setRotation(armetface, 0.2617994F, 0.7853982F, 0.2617994F); + */ bascinetface = new ModelRenderer(this, 0, 54); bascinetface.addBox(-2.5F, -5F, -7F, 5, 4, 3); diff --git a/src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java b/src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java deleted file mode 100644 index 37a9955f..00000000 --- a/src/main/java/minefantasy/mf2/client/render/mob/RenderVanillaHorse.java +++ /dev/null @@ -1,44 +0,0 @@ -package minefantasy.mf2.client.render.mob; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; -import minefantasy.mf2.api.helpers.TextureHelperMF; -import minefantasy.mf2.api.material.CustomMaterial; -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.entity.RenderHorse; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.passive.EntityHorse; -import net.minecraft.item.Item; -import org.lwjgl.opengl.GL11; - -@SideOnly(Side.CLIENT) -public class RenderVanillaHorse extends RenderHorse { - - public RenderVanillaHorse(ModelBase modelBase, float p_i1256_2_) { - super(modelBase, p_i1256_2_); - this.setRenderPassModel(modelBase); - } - - @Override - protected int shouldRenderPass(EntityLivingBase horse, int pass, float f) { - return shouldRenderPass((EntityHorse) horse, pass, f); - } - - private int shouldRenderPass(EntityHorse horse, int pass, float f) { - if (pass == 2) { - Item armor = horse.getDataWatcher().getWatchableObjectItemStack(23).getItem(); - if (armor instanceof ItemHorseArmorMFBase) { - CustomMaterial material = CustomMaterial.getMaterial("Ignotumite"); - if (material != null) { - GL11.glDepthFunc(GL11.GL_EQUAL); - this.bindTexture(TextureHelperMF.getResource("textures/models/animal/horse/armor/standard_plate_layer_1.png")); - GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - } - return 1; - } - return -1; - } -} diff --git a/src/main/java/minefantasy/mf2/config/ConfigHardcore.java b/src/main/java/minefantasy/mf2/config/ConfigHardcore.java index b7d9cc96..04187abc 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigHardcore.java +++ b/src/main/java/minefantasy/mf2/config/ConfigHardcore.java @@ -73,7 +73,7 @@ protected void loadConfig() { "This will alter the stack size of animal meat drops, meaning they only drop 1 every time") .getString()); preventCook = Boolean.parseBoolean( - config.get(CATEGORY_FOOD, "Prevent furnace food", false, "Stop food from being cooked in a furnace") + config.get(CATEGORY_FOOD, "Prevent furnace food", false, "Stop food and ceramic from being cooked in a furnace") .getString()); HungerSystemMF.slowdownRate = Integer.parseInt(config.get(CATEGORY_FOOD, "Hunger slow rate", 3, "how many added points per haunch is slows by. Default is 3: meaning it's takes 3 additional haunches to remove 1, meaning each haunch takes 4 times to be removed") diff --git a/src/main/java/minefantasy/mf2/entity/EntityCogwork.java b/src/main/java/minefantasy/mf2/entity/EntityCogwork.java index 92187a7a..4227ae65 100644 --- a/src/main/java/minefantasy/mf2/entity/EntityCogwork.java +++ b/src/main/java/minefantasy/mf2/entity/EntityCogwork.java @@ -138,10 +138,10 @@ public void onUpdate() { fuel = MathHelper.clamp_float(fuel, 0F, maxfuel); setFuel(fuel); - /* + /* * if(isSprinting()) { if(riddenByEntity == null || this.getMoveForward() <= 0 - * || !isPowered()) { setSprinting(false); } } - */ + * || !isPowered()) { setSprinting(false); } } + */ if (this.riddenByEntity != null) { stepHeight = general_step_height; updateRider(); diff --git a/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java b/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java index c1c9067b..f6fc511c 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java +++ b/src/main/java/minefantasy/mf2/entity/mob/DragonBreath.java @@ -19,6 +19,7 @@ public abstract class DragonBreath { public final String name; public int id = 0; protected Random random = new Random(); + public DragonBreath(String name) { this.name = name; register(); diff --git a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java index ed54a1e4..fbdd3643 100644 --- a/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java +++ b/src/main/java/minefantasy/mf2/entity/mob/EntityMinotaur.java @@ -581,9 +581,9 @@ private float getVolume(Entity entity) { private int getAttackSpeed() { return 0; /* - * if(rage >= 100) { return 10; } if(rage > 80) { return 15; } if(rage > 50) { - * return 20; } if(rage > 25) { return 30; } return 35; - */ + * if(rage >= 100) { return 10; } if(rage > 80) { return 15; } if(rage > 50) { + * return 20; } if(rage > 25) { return 30; } return 35; + */ } @Override diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java index 13aae3ba..019db9c9 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -5,7 +5,6 @@ import minetweaker.IRecipeRemover; import minetweaker.MineTweakerAPI; import minetweaker.api.item.IIngredient; -import minetweaker.api.minecraft.MineTweakerMC; public class MTCompat implements IRecipeRemover { diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java index fe1b6699..8d3afb96 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java @@ -2,8 +2,14 @@ import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.material.CustomMaterial; +import minefantasy.mf2.api.rpg.SkillList; +import minefantasy.mf2.item.list.ComponentListMF; +import minefantasy.mf2.knowledge.KnowledgeListMF; import minefantasy.mf2.material.MetalMaterial; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; import stanhebben.zenscript.annotations.NotNull; +import stanhebben.zenscript.annotations.Optional; import stanhebben.zenscript.annotations.ZenExpansion; import stanhebben.zenscript.annotations.ZenMethod; @@ -54,4 +60,18 @@ public static CustomMaterial setArmourStats(@NotNull CustomMaterial material, fl public static CustomMaterial modifyCraftTime(@NotNull CustomMaterial material, float time) { return material.modifyCraftTime(time); } + + @ZenMethod("initRecipes") + public static CustomMaterial initRecipes(@NotNull CustomMaterial material, @Optional String oreDictEntry) { + if (oreDictEntry == null) { + oreDictEntry = "ingot" + material.name; + } + + ItemStack bar = ComponentListMF.bar.createComm(material.name); + for (ItemStack ingot : OreDictionary.getOres(oreDictEntry)) { + KnowledgeListMF.barR.add(MineFantasyAPI.addAnvilRecipe(SkillList.artisanry, bar, "", true, "hammer", -1, -1, + (int) (material.craftTimeModifier / 2F), new Object[]{"I", 'I', ingot,})); + } + return material; + } } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedAlloyRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedAlloyRecipe.java index 49cce90f..9eea79bb 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedAlloyRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedAlloyRecipe.java @@ -1,6 +1,5 @@ package minefantasy.mf2.integration.minetweaker.helpers; -import minefantasy.mf2.api.crafting.MineFantasyFuels; import minefantasy.mf2.api.refine.Alloy; import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; @@ -57,8 +56,4 @@ public boolean matches(ItemStack[] inv) { return empty; } - private boolean areBothCarbon(ItemStack item1, ItemStack item2) { - return MineFantasyFuels.isCarbon(item1) && MineFantasyFuels.isCarbon(item2); - } - } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapedAnvilRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapedAnvilRecipe.java index 168c0877..82fdeef3 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapedAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapedAnvilRecipe.java @@ -8,22 +8,21 @@ import minetweaker.api.minecraft.MineTweakerMC; import net.minecraft.item.ItemStack; +import java.util.List; + public class TweakedShapedAnvilRecipe implements IAnvilRecipe { - private int hammer, anvil, /* craft, */ - time, width, height; + private int hammer, anvil, time, recipeWidth, recipeHeight; private float exp; private IItemStack result; - private IIngredient[][] ingreds; - private Skill s; + private IIngredient[][] ingredients; + private Skill skill; private String research, tool; private boolean hot; public TweakedShapedAnvilRecipe(IIngredient[][] input, IItemStack output, String tool, int time, int hammer, - int anvil, float exp, boolean hot, String research, Skill s) { - this.height = 4; - this.width = 6; - this.ingreds = input; + int anvil, float exp, boolean hot, String research, Skill skill) { + this.ingredients = input; this.result = output; this.tool = tool; this.hammer = hammer; @@ -31,8 +30,9 @@ public TweakedShapedAnvilRecipe(IIngredient[][] input, IItemStack output, String this.exp = exp; this.hot = hot; this.research = research; - this.s = s; + this.skill = skill; this.time = time; + calculateRecipeSize(); } @Override @@ -67,7 +67,7 @@ public ItemStack getRecipeOutput() { @Override public int getRecipeSize() { - return this.width * this.height; + return this.recipeWidth * this.recipeHeight; } @Override @@ -77,7 +77,7 @@ public String getResearch() { @Override public Skill getSkill() { - return this.s; + return this.skill; } @Override @@ -86,34 +86,49 @@ public String getToolType() { } @Override - public boolean matches(AnvilCraftMatrix inv) { - boolean matches = true; - for (int x = 0; x < 6; x++) { - for (int y = 0; y < 4; y++) { - if (!matches) + public boolean matches(AnvilCraftMatrix matrix) { + for (int x = 0; x <= this.recipeWidth; ++x) { + for (int y = 0; y <= this.recipeHeight; ++y) { + ItemStack inputItem = matrix.getStackInRowAndColumn(x, y); + /*if(x >= this.recipeWidth || y >= this.recipeHeight) { return false; - ItemStack stack = inv.getStackInRowAndColumn(x, y); + }*/ - // int a = y + x * 4; - if (stack == null && this.ingreds[y][x] == null) { - continue; + if (inputItem == null && ingredients[x][y] != null || inputItem != null && ingredients[x][y] == null) { + return false; } - boolean hasMatch = false; - if (stack != null && this.ingreds[y][x] != null) { - for (IItemStack i : this.ingreds[y][x].getItems()) { - ItemStack ingred = MineTweakerMC.getItemStack(i); - if (stack.getItem() == ingred.getItem() && stack.getItemDamage() == stack.getItemDamage()) { - hasMatch = true; - } - } - } else { - matches = false; + + IIngredient recipeStack = ingredients[x][y]; + + if (!isInList(inputItem, ingredients[x][y].getItems())) { + return false; } - if (!hasMatch) - matches = false; } } - return matches; + + return true; + } + + private boolean isInList(ItemStack inputStack, List items) { + for (IItemStack i : items) { + ItemStack recipeStack = MineTweakerMC.getItemStack(i); + if (inputStack.getItem() == recipeStack.getItem() && inputStack.getItemDamage() == recipeStack.getItemDamage()) { + /*if (!CustomToolHelper.doesMatchForRecipe(inputStack, recipeStack)) { + return false; + }*/ + return true; + } + } + return false; + } + + private void calculateRecipeSize() { + this.recipeHeight = this.ingredients.length; + for (int x = 0; x < this.recipeHeight; x++) { + if (this.ingredients[x] != null && this.ingredients[x].length > this.recipeWidth) { + this.recipeWidth = this.ingredients[x].length; + } + } } @Override @@ -123,7 +138,6 @@ public boolean outputHot() { @Override public boolean useCustomTiers() { - // TODO Auto-generated method stub return false; } diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapelessAnvilRecipe.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapelessAnvilRecipe.java index 0ddc7ab6..3a433a4b 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapelessAnvilRecipe.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/TweakedShapelessAnvilRecipe.java @@ -32,7 +32,7 @@ public TweakedShapelessAnvilRecipe(IIngredient[] input, IItemStack output, Strin this.hot = hot; this.research = research; this.s = s; - this.time = 1; + this.time = time; } @Override diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java index 28672963..ab36385b 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Anvil.java @@ -34,7 +34,7 @@ public static void addShapelessRecipe(@NotNull IItemStack output, String skill, public static class AnvilAction implements IUndoableAction { - IItemStack out; + IItemStack output; Skill s; String research, tool; boolean hot; @@ -43,14 +43,11 @@ public static class AnvilAction implements IUndoableAction { IIngredient[][] ingreds; IIngredient[] ingreds2; boolean shaped; - IAnvilRecipe r; - - // private static final char[] chars = - // {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; + IAnvilRecipe recipe; public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { - this.out = out; + this.output = out; this.s = s; this.research = research; this.tool = tool; @@ -61,12 +58,12 @@ public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float this.time = time; this.ingreds = ingreds; this.shaped = true; - r = new TweakedShapedAnvilRecipe(ingreds, out, tool, time, hammer, anvil, exp, hot, research, s); + recipe = new TweakedShapedAnvilRecipe(ingreds, out, tool, time, hammer, anvil, exp, hot, research, s); } public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float exp, String tool, int hammer, int anvil, int time, IIngredient[] ingreds) { - this.out = out; + this.output = out; this.s = s; this.research = research; this.tool = tool; @@ -77,17 +74,17 @@ public AnvilAction(IItemStack out, Skill s, String research, boolean hot, float this.time = time; this.ingreds2 = ingreds; this.shaped = false; - r = new TweakedShapelessAnvilRecipe(ingreds2, out, tool, time, hammer, anvil, exp, hot, research, s); + recipe = new TweakedShapelessAnvilRecipe(ingreds2, out, tool, time, hammer, anvil, exp, hot, research, s); } @Override public void apply() { - CraftingManagerAnvil.getInstance().recipes.add(r); + CraftingManagerAnvil.getInstance().recipes.add(recipe); } @Override public String describe() { - return "Adding a " + (hot ? "hot" : "") + " Anvil Recipe resulting in " + MineTweakerMC.getItemStack(out); + return "Adding a " + (hot ? "hot" : "") + " Anvil Recipe resulting in " + MineTweakerMC.getItemStack(output); } @Override @@ -107,7 +104,7 @@ public String describeUndo() { @Override public void undo() { - CraftingManagerAnvil.getInstance().recipes.remove(r); + CraftingManagerAnvil.getInstance().recipes.remove(recipe); } } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java index dea8d74f..c585a65d 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CarpentersBench.java @@ -44,7 +44,7 @@ public static class CarpentersAction implements IUndoableAction { ICarpenterRecipe r; // private static final char[] chars = - // {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; + // {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','recipe','s','t','u','v','w','x','y','z'}; public CarpentersAction(IItemStack out, Skill s, String research, String sound, float exp, String tool, int hammer, int anvil, int time, IIngredient[][] ingreds) { diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java index 500dad31..ddfb8c34 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Crucible.java @@ -7,6 +7,7 @@ import minetweaker.OneWayAction; import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; +import stanhebben.zenscript.annotations.Optional; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; @@ -17,19 +18,19 @@ public class Crucible { @ZenMethod - public static void addAlloy(IItemStack out, int level, int dupe, IIngredient[] ingred) { - MineTweakerAPI.apply(new AlloyAction(out, level, ingred, dupe)); + public static void addAlloy(IItemStack out, @Optional int level, int dupe, IIngredient[] ingred) { + MineTweakerAPI.apply(new AddAlloyAction(out, level, ingred, dupe)); } - private static class AlloyAction extends OneWayAction { + private static class AddAlloyAction extends OneWayAction { - Alloy a; + private Alloy alloy; private IItemStack out; private int level; private List ingreds; private int dupe; - public AlloyAction(IItemStack out, int level, IIngredient[] ingreds, int dupe) { + public AddAlloyAction(IItemStack out, int level, IIngredient[] ingreds, int dupe) { this.out = out; this.level = level; this.ingreds = new ArrayList(); @@ -37,12 +38,12 @@ public AlloyAction(IItemStack out, int level, IIngredient[] ingreds, int dupe) { for (IIngredient i : ingreds) { this.ingreds.add(i); } - a = new TweakedAlloyRecipe(out, level, this.ingreds); + alloy = new TweakedAlloyRecipe(out, level, this.ingreds); } @Override public void apply() { - AlloyRecipes.addAlloy(a); + AlloyRecipes.addAlloy(alloy); } @Override diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java index f41ad03e..a631654b 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java @@ -52,13 +52,13 @@ public void apply() { @Override public boolean canUndo() { - return true; + return false; } @Override public void undo() { - CustomMaterial.materialList.remove(this.name); - CustomMaterial.getList(this.type).remove(this.material); + /*CustomMaterial.materialList.remove(this.name); + CustomMaterial.getList(this.type).remove(this.material);*/ } @Override @@ -68,7 +68,8 @@ public String describe() { @Override public String describeUndo() { - return "Removing custom material"; + /*return "Removing custom material";*/ + return null; } @Override diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Fuels.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Fuels.java index 95316c52..9ca5189a 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Fuels.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/Fuels.java @@ -1,7 +1,6 @@ package minefantasy.mf2.integration.minetweaker.tweakers; import minetweaker.api.item.IItemStack; -import net.minecraftforge.oredict.OreDictionary; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java index 4ec88b1d..d2446bb1 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/SalvageTweaker.java @@ -1,7 +1,6 @@ package minefantasy.mf2.integration.minetweaker.tweakers; import minefantasy.mf2.api.crafting.Salvage; -import minefantasy.mf2.api.helpers.CustomToolHelper; import minetweaker.IUndoableAction; import minetweaker.MineTweakerAPI; import minetweaker.api.item.IIngredient; diff --git a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java index 30af7731..b1f8496a 100644 --- a/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java +++ b/src/main/java/minefantasy/mf2/integration/nei/RecipeHandlerQuern.java @@ -1,7 +1,6 @@ package minefantasy.mf2.integration.nei; import codechicken.lib.gui.GuiDraw; -import codechicken.nei.ItemList; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; import minefantasy.mf2.api.crafting.refine.QuernRecipes; @@ -11,8 +10,6 @@ import net.minecraft.util.StatCollector; import org.lwjgl.opengl.GL11; -import java.util.ArrayList; - public class RecipeHandlerQuern extends TemplateRecipeHandler { @Override @@ -39,8 +36,8 @@ public void drawBackground(int recipe) { @Override public void loadCraftingRecipes(ItemStack result) { - for(QuernRecipes recipe : QuernRecipes.recipeList) { - if(CustomToolHelper.areEqual(recipe.result, result)) { + for (QuernRecipes recipe : QuernRecipes.recipeList) { + if (CustomToolHelper.areEqual(recipe.result, result)) { CachedQuernRecipe cachedRecipe = new CachedQuernRecipe(recipe); arecipes.add(cachedRecipe); } @@ -83,7 +80,7 @@ public PositionedStack getIngredient() { @Override public PositionedStack getOtherStack() { - if(consumePot) { + if (consumePot) { return new PositionedStack(new ItemStack(ComponentListMF.clay_pot), 76, 32); } return null; diff --git a/src/main/java/minefantasy/mf2/integration/thaumcraft/TCCompat.java b/src/main/java/minefantasy/mf2/integration/thaumcraft/TCCompat.java new file mode 100644 index 00000000..05484fdf --- /dev/null +++ b/src/main/java/minefantasy/mf2/integration/thaumcraft/TCCompat.java @@ -0,0 +1,9 @@ +package minefantasy.mf2.integration.thaumcraft; + +public class TCCompat { + + public static void load() { + + } + +} diff --git a/src/main/java/minefantasy/mf2/item/ItemComponentMF.java b/src/main/java/minefantasy/mf2/item/ItemComponentMF.java index 82966f33..e8cc5fdf 100644 --- a/src/main/java/minefantasy/mf2/item/ItemComponentMF.java +++ b/src/main/java/minefantasy/mf2/item/ItemComponentMF.java @@ -35,22 +35,23 @@ public class ItemComponentMF extends Item implements ITieredComponent { protected String blocktex; protected String storageType; - /* + /* * private int itemRarity; - * - * @Override public EnumRarity getRarity(ItemStack item) { int lvl = - * itemRarity+1; - * - * if(item.isItemEnchanted()) { if(lvl == 0) { lvl++; } lvl ++; } if(lvl >= - * ToolListMF.rarity.length) { lvl = ToolListMF.rarity.length-1; } return - * ToolListMF.rarity[lvl]; } - */ + * + * @Override public EnumRarity getRarity(ItemStack item) { int lvl = + * itemRarity+1; + * + * if(item.isItemEnchanted()) { if(lvl == 0) { lvl++; } lvl ++; } if(lvl >= + * ToolListMF.rarity.length) { lvl = ToolListMF.rarity.length-1; } return + * ToolListMF.rarity[lvl]; } + */ // ===================================================== CUSTOM START // =============================================================\\ private boolean isCustom = false; private float unitCount = 1; private IIcon componentTex = null; private String materialType = null; + public ItemComponentMF(int rarity) { itemRarity = rarity; } diff --git a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java b/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java deleted file mode 100644 index c2641c44..00000000 --- a/src/main/java/minefantasy/mf2/item/armour/ItemHorseArmorMF.java +++ /dev/null @@ -1,90 +0,0 @@ -package minefantasy.mf2.item.armour; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import minefantasy.mf2.MineFantasyII; -import minefantasy.mf2.api.armour.ArmourDesign; -import minefantasy.mf2.api.armour.ItemHorseArmorMFBase; -import minefantasy.mf2.api.helpers.CustomToolHelper; -import minefantasy.mf2.api.material.CustomMaterial; -import minefantasy.mf2.item.list.CreativeTabMF; -import minefantasy.mf2.material.BaseMaterialMF; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.passive.EntityHorse; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -public class ItemHorseArmorMF extends ItemHorseArmorMFBase { - - protected BaseMaterialMF baseMaterial; - private String specialDesign = "standard"; - private String name; - private ArmourDesign armourDesign; - private int itemRarity; - private String armorTexture; - private IIcon saddleClothLayer; - private IIcon overLayer; - private String texturePath = "minefantasy2:animal/horse/armor/horse_armor"; - - public ItemHorseArmorMF(String name, BaseMaterialMF material, ArmourDesign design, String texture, int rarity) { - super(name, material.getArmourConversion(), design, texture); - GameRegistry.registerItem(this, name, MineFantasyII.MODID); - this.setCreativeTab(CreativeTabMF.tabArmour); - this.setTextureName(texturePath + "_main"); - baseMaterial = material; - armourDesign = design; - itemRarity = rarity; - armorTexture = texture; - } - - @Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() { - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderPasses(int metadata) { - return 3; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister register) { - overLayer = register.registerIcon(texturePath + "_overlay"); - saddleClothLayer = register.registerIcon(texturePath + "_saddlecloth"); - super.registerIcons(register); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(ItemStack stack, int pass) { - if (pass == 1 && overLayer != null) { - return overLayer; - } - if (pass == 2 && saddleClothLayer != null) { - return saddleClothLayer; - } - return super.getIcon(stack, pass); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack item, int layer) { - if (layer == 0) { - CustomMaterial base = CustomToolHelper.getCustomPrimaryMaterial(item); - base = CustomMaterial.getMaterial("Ignotumite"); - if (base != null) { - return base.getColourInt(); - } - } - return super.getColorFromItemStack(item, layer); - } - - @Override - public String getArmorTexture(EntityHorse horse, ItemStack stack) { - return "minefantasy2:textures/models/animal/horse/armor/standard_plate_layer_1.png"; - } -} diff --git a/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java b/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java index 617d402c..84845637 100644 --- a/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java @@ -24,7 +24,6 @@ public final class CreativeTabMF extends CreativeTabs { public static CreativeTabs tabDragonforged = new CreativeTabMF(CreativeTabs.getNextID(), "MFdragonforged", 12); public static CreativeTabs tabOrnate = new CreativeTabMF(CreativeTabs.getNextID(), "MFornate", 13); public static CreativeTabs tabOldTools = new CreativeTabMF(CreativeTabs.getNextID(), "MFOld", 14); - public static CreativeTabs tabPets = new CreativeTabMF(CreativeTabs.getNextID(), "MFpets", 15); private int type; @@ -65,8 +64,6 @@ public ItemStack getIconItemStack() { return new ItemStack(ComponentListMF.ornate_items); case 14: return new ItemStack(ToolListMF.pickStone); - case 15: - return new ItemStack(ToolListMF.debug_mob); } return new ItemStack(ComponentListMF.ingots[3]); } diff --git a/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java b/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java index 567d8b50..0e5e77d7 100644 --- a/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/ToolMaterialMF.java @@ -5,9 +5,9 @@ public class ToolMaterialMF { /* - * WOOD(0, 59, 2.0F, 0, 15), STONE(1, 131, 4.0F, 1, 5), IRON(2, 250, 6.0F, 2, - * 14), EMERALD(3, 1561, 8.0F, 3, 10), GOLD(0, 32, 12.0F, 0, 22); - */ + * WOOD(0, 59, 2.0F, 0, 15), STONE(1, 131, 4.0F, 1, 5), IRON(2, 250, 6.0F, 2, + * 14), EMERALD(3, 1561, 8.0F, 3, 10), GOLD(0, 32, 12.0F, 0, 22); + */ // public static EnumToolMaterial STEEL = EnumHelper.addToolMaterial("STEEL", 2, // 1000, 7.8F, 2.5F, 22); diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java index c54e2350..41dcbc95 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemTongs.java @@ -196,14 +196,14 @@ public IIcon getIcon(ItemStack stack, int pass) { return detailTex != null ? detailTex : super.getIcon(stack, pass); } /* - * @Override - * - * @SideOnly(Side.CLIENT) public IIcon getIcon(ItemStack stack, int renderPass) - * { ItemStack item = TongsHelper.getHeldItem(stack); - * - * if (renderPass == 0 && item != null) { return item.getItem().getIcon(item, - * renderPass); } return itemIcon; } - */ + * @Override + * + * @SideOnly(Side.CLIENT) public IIcon getIcon(ItemStack stack, int renderPass) + * { ItemStack item = TongsHelper.getHeldItem(stack); + * + * if (renderPass == 0 && item != null) { return item.getItem().getIcon(item, + * renderPass); } return itemIcon; } + */ @Override public int getRenderPasses(int metadata) { diff --git a/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java b/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java index 192916f8..8194439d 100644 --- a/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java +++ b/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java @@ -32,13 +32,13 @@ public class BaseMaterialMF { public static BaseMaterialMF cogworks, compositeAlloy;// Engineer private static float ACrounding = 10F; // round to nearest 10 /* - * WOOD(0, 59, 2.0F, 0.0F, 15), STONE(1, 131, 4.0F, 1.0F, 5), IRON(2, 250, 6.0F, - * 2.0F, 14), EMERALD(3, 1561, 8.0F, 3.0F, 10), GOLD(0, 32, 12.0F, 0.0F, 22); - * - * To get variables: X = sword damage, Y = Armour Ratio(+1 of value), Z = Damage - * - * X = Z * Y Y = X / Z Z = X / Y - */ + * WOOD(0, 59, 2.0F, 0.0F, 15), STONE(1, 131, 4.0F, 1.0F, 5), IRON(2, 250, 6.0F, + * 2.0F, 14), EMERALD(3, 1561, 8.0F, 3.0F, 10), GOLD(0, 32, 12.0F, 0.0F, 22); + * + * To get variables: X = sword damage, Y = Armour Ratio(+1 of value), Z = Damage + * + * X = Z * Y Y = X / Z Z = X / Y + */ // Rounding off to nearest 0.5 makes about an 0.03 difference, but the AR is // cleaner // Hardness isn't added, it calculats armour itself to match sharpness @@ -93,6 +93,7 @@ public class BaseMaterialMF { // SPECIALS private ArmourMaterialMF armourConversion; private ToolMaterial toolConversion; + public BaseMaterialMF(String name, int tier, int durability, int harvestLevel, float hardness, float sharpness, int enchantment, float weight, int lvl) { this.requiredLevel = lvl; diff --git a/src/main/java/minefantasy/mf2/material/MetalMaterial.java b/src/main/java/minefantasy/mf2/material/MetalMaterial.java index e8f36428..dd903ee1 100644 --- a/src/main/java/minefantasy/mf2/material/MetalMaterial.java +++ b/src/main/java/minefantasy/mf2/material/MetalMaterial.java @@ -51,10 +51,10 @@ public static CustomMaterial getOrAddMetal(String name, int tier, float hardness public static void init() { /* - * BaseMaterialMF WOOD(0, 59, 2.0F, 0.0F, 15), STONE(1, 131, 4.0F, 1.0F, 5), - * IRON(2, 250, 6.0F, 2.0F, 14), EMERALD(3, 1561, 8.0F, 3.0F, 10), GOLD(0, 32, - * 12.0F, 0.0F, 22); - */ + * BaseMaterialMF WOOD(0, 59, 2.0F, 0.0F, 15), STONE(1, 131, 4.0F, 1.0F, 5), + * IRON(2, 250, 6.0F, 2.0F, 14), EMERALD(3, 1561, 8.0F, 3.0F, 10), GOLD(0, 32, + * 12.0F, 0.0F, 22); + */ // Weak Mats Name T Dur Flx Shp Rst Wg getOrAddMetal("Tin", 0, 1.0F, 0.5F, 0.0F, 10F, 2.0F, 164, 177, 177).setRarity(-1).setMeltingPoint(900); diff --git a/src/main/java/minefantasy/mf2/material/WoodMaterial.java b/src/main/java/minefantasy/mf2/material/WoodMaterial.java index 9e0ae4fc..42a347dc 100644 --- a/src/main/java/minefantasy/mf2/material/WoodMaterial.java +++ b/src/main/java/minefantasy/mf2/material/WoodMaterial.java @@ -65,31 +65,31 @@ public static void init() { getOrAddWood("SilverwoodWood", 2, 1.00F, 3.50F, 2.20F, 75F, 0.8F, 224, 220, 208).setCrafterTiers(2); getOrAddWood("GreatwoodWood", 2, 1.20F, 1.50F, 1.00F, 50F, 1.5F, 37, 25, 23).setCrafterTiers(2); /* - * //OTHERS. playing around with, mainly forestry getOrAddWood("PineWood", 0, 1, - * 1, 1, 1, 1, 1, 189, 147, 63); getOrAddWood("CherryWood", 0, 1, 1, 1, 1, 1, 1, - * 162, 116, 47); getOrAddWood("PapayaWood", 0, 1, 1, 1, 1, 1, 1, 214, 194, 91); - * getOrAddWood("CitrusWood", 0, 1, 1, 1, 1, 1, 1, 142, 153, 27); - * getOrAddWood("PoplarWood", 0, 1, 1, 1, 1, 1, 1, 198, 198, 107); - * getOrAddWood("MapleWood", 0, 1, 1, 1, 1, 1, 1, 158, 99, 39); - * getOrAddWood("MahoeWood", 0, 1, 1, 1, 1, 1, 1, 111, 138, 158); - * getOrAddWood("GreenheartWood", 0, 1, 1, 1, 1, 1, 1, 65, 103, 77); - * getOrAddWood("PalmWood", 0, 1, 1, 1, 1, 1, 1, 195, 114, 56); - * getOrAddWood("LimeWood", 0, 1, 1, 1, 1, 1, 1, 190, 147, 96); - * getOrAddWood("BalsaWood", 0, 1, 1, 1, 1, 1, 1, 159, 152, 143); - * getOrAddWood("WalnutWood", 0, 1, 1, 1, 1, 1, 1, 85, 69, 55); - * getOrAddWood("KapokWood", 0, 1, 1, 1, 1, 1, 1, 99, 95, 45); - * getOrAddWood("ChestnutWood", 0, 1, 1, 1, 1, 1, 1, 156, 147, 74); - * getOrAddWood("BaobabWood", 0, 1, 1, 1, 1, 1, 1, 116, 126, 84); - * getOrAddWood("LarchWood", 0, 1, 1, 1, 1, 1, 1, 200, 143, 122); - * getOrAddWood("WillowWood", 0, 1, 1, 1, 1, 1, 1, 149, 152, 74); - * getOrAddWood("TeakWood", 0, 1, 1, 1, 1, 1, 1, 111, 107, 91); - * getOrAddWood("SequoiaWood", 0, 1, 1, 1, 1, 1, 1, 123, 81, 75); - * getOrAddWood("MahoganyWood", 0, 1, 1, 1, 1, 1, 1, 95, 56, 49); - * getOrAddWood("WengeWood", 0, 1, 1, 1, 1, 1, 1, 76, 72, 62); - * getOrAddWood("RedwoodWood", 0, 1, 1, 1, 1, 1, 1, 148, 104, 55); - * getOrAddWood("FirWood", 0, 1, 1, 1, 1, 1, 1, 114, 111, 63); - * getOrAddWood("PurpleHeartWood", 0, 1, 1, 1, 1, 1, 1, 55, 25, 49); - */ + * //OTHERS. playing around with, mainly forestry getOrAddWood("PineWood", 0, 1, + * 1, 1, 1, 1, 1, 189, 147, 63); getOrAddWood("CherryWood", 0, 1, 1, 1, 1, 1, 1, + * 162, 116, 47); getOrAddWood("PapayaWood", 0, 1, 1, 1, 1, 1, 1, 214, 194, 91); + * getOrAddWood("CitrusWood", 0, 1, 1, 1, 1, 1, 1, 142, 153, 27); + * getOrAddWood("PoplarWood", 0, 1, 1, 1, 1, 1, 1, 198, 198, 107); + * getOrAddWood("MapleWood", 0, 1, 1, 1, 1, 1, 1, 158, 99, 39); + * getOrAddWood("MahoeWood", 0, 1, 1, 1, 1, 1, 1, 111, 138, 158); + * getOrAddWood("GreenheartWood", 0, 1, 1, 1, 1, 1, 1, 65, 103, 77); + * getOrAddWood("PalmWood", 0, 1, 1, 1, 1, 1, 1, 195, 114, 56); + * getOrAddWood("LimeWood", 0, 1, 1, 1, 1, 1, 1, 190, 147, 96); + * getOrAddWood("BalsaWood", 0, 1, 1, 1, 1, 1, 1, 159, 152, 143); + * getOrAddWood("WalnutWood", 0, 1, 1, 1, 1, 1, 1, 85, 69, 55); + * getOrAddWood("KapokWood", 0, 1, 1, 1, 1, 1, 1, 99, 95, 45); + * getOrAddWood("ChestnutWood", 0, 1, 1, 1, 1, 1, 1, 156, 147, 74); + * getOrAddWood("BaobabWood", 0, 1, 1, 1, 1, 1, 1, 116, 126, 84); + * getOrAddWood("LarchWood", 0, 1, 1, 1, 1, 1, 1, 200, 143, 122); + * getOrAddWood("WillowWood", 0, 1, 1, 1, 1, 1, 1, 149, 152, 74); + * getOrAddWood("TeakWood", 0, 1, 1, 1, 1, 1, 1, 111, 107, 91); + * getOrAddWood("SequoiaWood", 0, 1, 1, 1, 1, 1, 1, 123, 81, 75); + * getOrAddWood("MahoganyWood", 0, 1, 1, 1, 1, 1, 1, 95, 56, 49); + * getOrAddWood("WengeWood", 0, 1, 1, 1, 1, 1, 1, 76, 72, 62); + * getOrAddWood("RedwoodWood", 0, 1, 1, 1, 1, 1, 1, 148, 104, 55); + * getOrAddWood("FirWood", 0, 1, 1, 1, 1, 1, 1, 114, 111, 63); + * getOrAddWood("PurpleHeartWood", 0, 1, 1, 1, 1, 1, 1, 55, 25, 49); + */ } diff --git a/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java b/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java index fef57372..770a0089 100644 --- a/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/ArrowHandlerMF.java @@ -60,10 +60,10 @@ public void readyBow(ArrowNockEvent event) { return; } - /* + /* * Checks over registered arrows and finds one to load The Quiver can be used to - * determine this - */ + * determine this + */ ItemStack arrowToFire = AmmoMechanicsMF.reloadBow(bow); if (arrowToFire != null) { user.setItemInUse(bow, bow.getMaxItemUseDuration());// Starts pullback @@ -77,13 +77,13 @@ public void readyBow(ArrowNockEvent event) { return; } } - /* - * for(int a = 0; a < AmmoMechanicsMF.arrows.size(); a ++) { ItemStack arrow = - * AmmoMechanicsMF.arrows.get(a); if(user.inventory.hasItemStack(arrow)) { - * user.setItemInUse(bow, bow.getMaxItemUseDuration());//Starts pullback - * loadArrow(user, bow, arrow);//adds the arrow to NBT for rendering and later - * use event.setCanceled(true); return; } } - */ + /* + * for(int a = 0; a < AmmoMechanicsMF.arrows.size(); a ++) { ItemStack arrow = + * AmmoMechanicsMF.arrows.get(a); if(user.inventory.hasItemStack(arrow)) { + * user.setItemInUse(bow, bow.getMaxItemUseDuration());//Starts pullback + * loadArrow(user, bow, arrow);//adds the arrow to NBT for rendering and later + * use event.setCanceled(true); return; } } + */ } @SubscribeEvent(priority = EventPriority.HIGHEST) diff --git a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java index 2a415265..7cc613d3 100644 --- a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java +++ b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java @@ -1,7 +1,6 @@ package minefantasy.mf2.mechanics; import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.armour.IElementalResistance; import minefantasy.mf2.api.helpers.*; import minefantasy.mf2.api.knowledge.ResearchLogic; @@ -22,6 +21,7 @@ import minefantasy.mf2.network.packet.DodgeCommand; import minefantasy.mf2.network.packet.ParryPacket; import minefantasy.mf2.util.MFLogUtil; +import minefantasy.mf2.util.XSTRandom; import net.minecraft.client.entity.EntityClientPlayerMP; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; @@ -72,6 +72,7 @@ public class CombatMechanics { private static final float parryFatigue = 5F; public static boolean swordSkeleton = true; private static boolean debugParry = true; + private static XSTRandom random = new XSTRandom(); protected float jumpEvade_cost = 30; protected float evade_cost = 10; @@ -115,7 +116,7 @@ public static void applyUndeadBane(EntityLivingBase living) { living.playSound("random.fizz", 0.5F, 0.5F); living.addPotionEffect(new PotionEffect(Potion.weakness.id, 1200, 2)); living.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 1200, 2)); - if (MineFantasyII.random.nextInt(5) == 0) { + if (random.nextInt(5) == 0) { living.setFire(3); } } @@ -218,9 +219,9 @@ public static void panic(EntityLivingBase victim, float speed, int directionTime double moveZ = victim.getEntityData().getDouble("MF2_PanicZ"); victim.setJumping(true); - if ((moveX == 0 && moveZ == 0) || MineFantasyII.random.nextInt(directionTimer) == 0) { - moveX = (MineFantasyII.random.nextDouble() - 0.5D) * 0.85D * speed; - moveZ = (MineFantasyII.random.nextDouble() - 0.5D) * 0.85D * speed; + if ((moveX == 0 && moveZ == 0) || random.nextInt(directionTimer) == 0) { + moveX = (random.nextDouble() - 0.5D) * 0.85D * speed; + moveZ = (random.nextDouble() - 0.5D) * 0.85D * speed; victim.getEntityData().setDouble("MF2_PanicX", moveX); victim.getEntityData().setDouble("MF2_PanicZ", moveZ); @@ -480,7 +481,7 @@ private float modifyUserHitDamage(float dam, EntityLivingBase user, Entity sourc if (isSkeleton(target)) { dam *= 1.5F; if (properHit) { - if (MineFantasyII.random.nextInt(2) == 0) { + if (random.nextInt(2) == 0) { target.entityDropItem(new ItemStack(Items.bone), 0.5F); } } @@ -597,10 +598,10 @@ private void onWeaponHit(EntityLivingBase user, ItemStack weapon, Entity target, } private void onArrowHit(Entity arrow, Entity target, Entity shooter, float damage) { - /* - * if(RPGElements.isSystemActive && shooter instanceof EntityPlayer) { - * SkillList.archery.addXP((EntityPlayer) shooter, (int)damage); } - */ + /* + * if(RPGElements.isSystemActive && shooter instanceof EntityPlayer) { + * SkillList.archery.addXP((EntityPlayer) shooter, (int)damage); } + */ } private float onUserHit(EntityLivingBase user, Entity entityHitting, DamageSource source, float dam, @@ -661,10 +662,10 @@ private float onUserHit(EntityLivingBase user, Entity entityHitting, DamageSourc * (dam + 1F) * parryFatigue * weaponFatigue); if (parry == null) { user.worldObj.playSoundAtEntity(user, getDefaultParrySound(weapon), 1.0F, - 1.25F + (MineFantasyII.random.nextFloat() * 0.5F)); + 1.25F + (random.nextFloat() * 0.5F)); } else if (!parry.playCustomParrySound(user, entityHitting, weapon)) { user.worldObj.playSoundAtEntity(user, "mob.zombie.metal", 1.0F, - 1.25F + (MineFantasyII.random.nextFloat() * 0.5F)); + 1.25F + (random.nextFloat() * 0.5F)); } if (user instanceof EntityPlayer) { ((EntityPlayer) user).stopUsingItem(); @@ -759,10 +760,10 @@ private String getDefaultParrySound(ItemStack weapon) { */ private int onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam, float prevDam, IParryable parry) { - /* - * if(RPGElements.isSystemActive && user instanceof EntityPlayer) { - * SkillList.block.addXP((EntityPlayer)user, 10 + (int)prevDam*2); } - */ + /* + * if(RPGElements.isSystemActive && user instanceof EntityPlayer) { + * SkillList.block.addXP((EntityPlayer)user, 10 + (int)prevDam*2); } + */ if (RPGElements.isSystemActive && user instanceof EntityPlayer) { SkillList.combat.addXP((EntityPlayer) user, (int) (prevDam / 3F)); } @@ -804,7 +805,7 @@ private boolean canEvade(EntityLivingBase user) { return false; } } else { - if (MineFantasyII.random.nextInt(10) != 0)// Mobs can evade + if (random.nextInt(10) != 0)// Mobs can evade { return false; } diff --git a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java index bce54adf..c54fba4a 100644 --- a/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/EventManagerMF.java @@ -19,7 +19,6 @@ import minefantasy.mf2.api.tool.IHuntingItem; import minefantasy.mf2.api.tool.ISmithTongs; import minefantasy.mf2.api.weapon.WeaponClass; -import minefantasy.mf2.asm.ASMHelper; import minefantasy.mf2.client.render.RenderPowerArmour; import minefantasy.mf2.config.ConfigExperiment; import minefantasy.mf2.config.ConfigHardcore; @@ -29,7 +28,6 @@ import minefantasy.mf2.entity.mob.EntityDragon; import minefantasy.mf2.farming.FarmingHelper; import minefantasy.mf2.item.ClientItemsMF; -import minefantasy.mf2.item.armour.ItemHorseArmorMF; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.ToolListMF; @@ -37,6 +35,7 @@ import minefantasy.mf2.network.packet.LevelupPacket; import minefantasy.mf2.network.packet.SkillPacket; import minefantasy.mf2.util.MFLogUtil; +import minefantasy.mf2.util.XSTRandom; import net.minecraft.block.Block; import net.minecraft.block.BlockLeavesBase; import net.minecraft.client.Minecraft; @@ -84,6 +83,8 @@ public class EventManagerMF { public static final String injuredNBT = "MF_Injured"; public static boolean displayOreDict = false; + private static XSTRandom random = new XSTRandom(); + public static void addArmourDT(ItemStack armour, EntityPlayer user, List list, boolean extra) { list.add(""); String AC = ArmourCalculator.getArmourClass(armour); @@ -210,7 +211,7 @@ public void tryDropItems(LivingDropsEvent event) { EntityLivingBase dropper = event.entityLiving; if (dropper instanceof EntityChicken) { - int dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1 * 4); + int dropCount = 1 + random.nextInt(event.lootingLevel + 1 * 4); for (int a = 0; a < dropCount; a++) { dropper.entityDropItem(new ItemStack(Items.feather), 0.0F); @@ -222,7 +223,7 @@ public void tryDropItems(LivingDropsEvent event) { dropper.entityDropItem(new ItemStack(drop), 0.0F); } if (dropper instanceof EntityAgeable && dropper.getCreatureAttribute() != EnumCreatureAttribute.UNDEAD) { - if (MineFantasyII.random.nextFloat() * (1 + event.lootingLevel) < 0.05F) { + if (random.nextFloat() * (1 + event.lootingLevel) < 0.05F) { dropper.entityDropItem(new ItemStack(FoodListMF.guts), 0.0F); } } @@ -236,9 +237,9 @@ public void tryDropItems(LivingDropsEvent event) { } } if (getRegisterName(dropper).contains("Horse")) { - int dropCount = MineFantasyII.random.nextInt(3 + event.lootingLevel); + int dropCount = random.nextInt(3 + event.lootingLevel); if (ConfigHardcore.lessHunt) { - dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1); + dropCount = 1 + random.nextInt(event.lootingLevel + 1); } Item meat = dropper.isBurning() ? FoodListMF.horse_cooked : FoodListMF.horse_raw; @@ -247,9 +248,9 @@ public void tryDropItems(LivingDropsEvent event) { } } if (getRegisterName(dropper).contains("Wolf")) { - int dropCount = MineFantasyII.random.nextInt(3 + event.lootingLevel); + int dropCount = random.nextInt(3 + event.lootingLevel); if (ConfigHardcore.lessHunt) { - dropCount = 1 + MineFantasyII.random.nextInt(event.lootingLevel + 1); + dropCount = 1 + random.nextInt(event.lootingLevel + 1); } Item meat = dropper.isBurning() ? FoodListMF.wolf_cooked : FoodListMF.wolf_raw; @@ -499,14 +500,14 @@ private void dropBook(EntityLivingBase dead, int id) { return; Item book = null; if (id == 0) { - float chance = MineFantasyII.random.nextFloat(); + float chance = random.nextFloat(); if (chance > 0.75F) { book = ToolListMF.skillbook_engineering; } else { book = ToolListMF.skillbook_provisioning; } - } else if (id == 1 && MineFantasyII.random.nextInt(5) == 0) { - float chance = MineFantasyII.random.nextFloat(); + } else if (id == 1 && random.nextInt(5) == 0) { + float chance = random.nextFloat(); if (chance > 0.9F) { book = ToolListMF.skillbook_engineering; } else if (chance > 0.6F) { @@ -516,8 +517,8 @@ private void dropBook(EntityLivingBase dead, int id) { } else { book = ToolListMF.skillbook_provisioning; } - } else if (id == 2 && MineFantasyII.random.nextInt(25) == 0) { - float chance = MineFantasyII.random.nextFloat(); + } else if (id == 2 && random.nextInt(25) == 0) { + float chance = random.nextFloat(); if (chance > 0.9F) { book = ToolListMF.skillbook_engineering; } else if (chance > 0.6F) { @@ -584,16 +585,16 @@ public void playerMineBlock(BlockEvent.BreakEvent event) { if (broken != null && ConfigHardcore.HCCallowRocks) { if (broken == Blocks.stone && held == null) { entityDropItem(event.world, event.x, event.y, event.z, - new ItemStack(ComponentListMF.sharp_rock, MineFantasyII.random.nextInt(3) + 1)); + new ItemStack(ComponentListMF.sharp_rock, random.nextInt(3) + 1)); } if (broken instanceof BlockLeavesBase && held != null && held.getItem() == ComponentListMF.sharp_rock) { - if (MineFantasyII.random.nextInt(5) == 0) { + if (random.nextInt(5) == 0) { entityDropItem(event.world, event.x, event.y, event.z, - new ItemStack(Items.stick, MineFantasyII.random.nextInt(3) + 1)); + new ItemStack(Items.stick, random.nextInt(3) + 1)); } - if (MineFantasyII.random.nextInt(3) == 0) { + if (random.nextInt(3) == 0) { entityDropItem(event.world, event.x, event.y, event.z, - new ItemStack(ComponentListMF.vine, MineFantasyII.random.nextInt(3) + 1)); + new ItemStack(ComponentListMF.vine, random.nextInt(3) + 1)); } } } @@ -743,15 +744,6 @@ public void updateEntity(LivingUpdateEvent event) { } EntityLivingBase entity = event.entityLiving; - if (ASMHelper.isASMEnabled && entity instanceof EntityHorse) { - EntityHorse horse = (EntityHorse) entity; - ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); - if (customArmor != null && customArmor.getItem() instanceof ItemHorseArmorMF) { - ItemHorseArmorMF armor = (ItemHorseArmorMF) customArmor.getItem(); - armor.onHorseUpdate(horse, customArmor); - } - } - float lowHp = entity.getMaxHealth() / 5F; int injury = getInjuredTime(entity); @@ -764,9 +756,9 @@ public void updateEntity(LivingUpdateEvent event) { } if (entity.ticksExisted % 15 == 0) { entity.limbSwing = 2.0F; - float x = (float) (entity.posX + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); - float y = (float) (entity.posY + entity.getEyeHeight() + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); - float z = (float) (entity.posZ + (MineFantasyII.random.nextFloat() - 0.5F) / 4F); + float x = (float) (entity.posX + (random.nextFloat() - 0.5F) / 4F); + float y = (float) (entity.posY + entity.getEyeHeight() + (random.nextFloat() - 0.5F) / 4F); + float z = (float) (entity.posZ + (random.nextFloat() - 0.5F) / 4F); entity.worldObj.spawnParticle("reddust", x, y, z, 0F, 0F, 0F); } } diff --git a/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java b/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java index 06f578a9..98a17b72 100644 --- a/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java +++ b/src/main/java/minefantasy/mf2/mechanics/MonsterUpgrader.java @@ -1,12 +1,12 @@ package minefantasy.mf2.mechanics; import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.item.list.CustomArmourListMF; import minefantasy.mf2.item.list.CustomToolListMF; import minefantasy.mf2.item.weapon.ItemWeaponMF; +import minefantasy.mf2.util.XSTRandom; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.monster.*; @@ -21,14 +21,16 @@ public class MonsterUpgrader { private static final float creeperJockeyChance = 60F; private static final float witchRiderChance = 100F; + private static XSTRandom random = new XSTRandom(); + public void upgradeMob(EntityLivingBase mob) { int diff = mob.worldObj.difficultySetting.getDifficultyId(); if (ConfigHardcore.upgradeZombieWep) { if (mob instanceof EntitySkeleton) { if (((EntitySkeleton) mob).getSkeletonType() == 1) { - giveEntityWeapon(mob, "Diamond", MineFantasyII.random.nextInt(8)); - } else if (CombatMechanics.swordSkeleton && MineFantasyII.random.nextInt(3) == 0) { + giveEntityWeapon(mob, "Diamond", random.nextInt(8)); + } else if (CombatMechanics.swordSkeleton && random.nextInt(3) == 0) { mob.setCurrentItemOrArmor(0, CustomToolListMF.standard_sword.construct("Bronze", "OakWood")); ((EntitySkeleton) mob).setCombatTask(); } @@ -36,7 +38,7 @@ public void upgradeMob(EntityLivingBase mob) { String tier = "Iron"; if (mob instanceof EntityPigZombie) { tier = "Obsidian"; - giveEntityWeapon(mob, tier, MineFantasyII.random.nextInt(7)); + giveEntityWeapon(mob, tier, random.nextInt(7)); if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); } @@ -49,18 +51,18 @@ public void upgradeMob(EntityLivingBase mob) { } else { float mod = diff >= 2 ? ConfigHardcore.zombieWepChance * 2 : diff < 1 ? ConfigHardcore.zombieWepChance / 2 : ConfigHardcore.zombieWepChance; - float chance = MineFantasyII.random.nextFloat() * 100F * mod; + float chance = random.nextFloat() * 100F * mod; if (chance >= (100F - zombieWepChance)) { - giveEntityWeapon(mob, tier, MineFantasyII.random.nextInt(5)); + giveEntityWeapon(mob, tier, random.nextInt(5)); if (mob.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) { mob.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0F); } } } } - if (MineFantasyII.random.nextFloat() * (zombieKnightChance) < diff) { + if (random.nextFloat() * (zombieKnightChance) < diff) { createZombieKnight((EntityZombie) mob); - } else if (MineFantasyII.random.nextFloat() * (zombieBruteChance) < diff) { + } else if (random.nextFloat() * (zombieBruteChance) < diff) { createZombieBrute((EntityZombie) mob); } else if (ConfigHardcore.fastZombies) { mob.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3F); @@ -68,12 +70,12 @@ public void upgradeMob(EntityLivingBase mob) { } } else if (mob instanceof EntitySpider) { if (mob.riddenByEntity == null) { - if (MineFantasyII.random.nextFloat() * (witchRiderChance) < diff) { + if (random.nextFloat() * (witchRiderChance) < diff) { EntityWitch rider = new EntityWitch(mob.worldObj); rider.setPosition(mob.posX, mob.posY, mob.posZ); mob.worldObj.spawnEntityInWorld(rider); rider.mountEntity(mob); - } else if (MineFantasyII.random.nextFloat() * (creeperJockeyChance) < diff) { + } else if (random.nextFloat() * (creeperJockeyChance) < diff) { EntityCreeper rider = new EntityCreeper(mob.worldObj); rider.setPosition(mob.posX, mob.posY, mob.posZ); mob.worldObj.spawnEntityInWorld(rider); diff --git a/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java b/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java index 2d833c36..94ffce65 100644 --- a/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/PlayerTickHandlerMF.java @@ -3,7 +3,6 @@ import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; import cpw.mods.fml.common.gameevent.TickEvent; -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.archery.IFirearm; import minefantasy.mf2.api.heating.IHotItem; @@ -23,6 +22,7 @@ import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.item.weapon.ItemWeaponMF; import minefantasy.mf2.util.MFLogUtil; +import minefantasy.mf2.util.XSTRandom; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -38,6 +38,8 @@ public class PlayerTickHandlerMF { private static String chunkCoords = "MF_BedPos"; private static String resetBed = "MF_Resetbed"; + private static XSTRandom random = new XSTRandom(); + public static void spawnDragon(EntityPlayer player) { spawnDragon(player, 64); } @@ -92,38 +94,38 @@ public static int getDragonTier(EntityPlayer player) { return 0;// Young 100% } if (kills < 10) { - if (MineFantasyII.random.nextInt(5) == 0) + if (random.nextInt(5) == 0) return 0;// 20% chance for Young return 1;// Adult } if (kills < 15) { - if (MineFantasyII.random.nextInt(10) == 0) + if (random.nextInt(10) == 0) return 0;// 10% chance for Young return 1;// Adult } if (kills < 25) { - if (MineFantasyII.random.nextInt(20) == 0) + if (random.nextInt(20) == 0) return 0;// 5% chance for Young - if (MineFantasyII.random.nextInt(10) == 0) + if (random.nextInt(10) == 0) return 2;// 10% chance for Mature return 1;// Adult } if (kills < 35) { - if (MineFantasyII.random.nextInt(4) == 0) + if (random.nextInt(4) == 0) return 2;// 25% chance for Mature return 1;// Adult } if (kills >= 50) { - if (MineFantasyII.random.nextInt(10) == 0) + if (random.nextInt(10) == 0) return 1;// 10% chance for Adult - if (MineFantasyII.random.nextInt(5) == 0) + if (random.nextInt(5) == 0) return 3;// 20% chance Elder return 2;// Mature } if (kills > 75) { - if (MineFantasyII.random.nextInt(100) == 0) + if (random.nextInt(100) == 0) return 4;// 1% chance Ancient - if (MineFantasyII.random.nextInt(2) == 0) + if (random.nextInt(2) == 0) return 3;// 50% chance Elder return 2;// Mature } @@ -196,13 +198,13 @@ public void onPlayerTick(TickEvent.PlayerTickEvent event) { } } /* - * if(RPGElements.isSystemActive) { if(event.player.isSprinting() && - * event.player.ticksExisted % 10 == 0) { - * SkillList.athletics.addXP(event.player, 1); } else - * if(event.player.isSneaking() && TacticalManager.isEntityMoving(event.player) - * && event.player.ticksExisted % 10 == 0) { SkillList.sneak.addXP(event.player, - * 1); } } - */ + * if(RPGElements.isSystemActive) { if(event.player.isSprinting() && + * event.player.ticksExisted % 10 == 0) { + * SkillList.athletics.addXP(event.player, 1); } else + * if(event.player.isSneaking() && TacticalManager.isEntityMoving(event.player) + * && event.player.ticksExisted % 10 == 0) { SkillList.sneak.addXP(event.player, + * 1); } } + */ // DRAGON EVENT if (!event.player.worldObj.isRemote) { tickDragonSpawner(event.player); @@ -298,7 +300,7 @@ private void tickDragonSpawner(EntityPlayer player) { chance *= 2;// twice the chance } if (!player.worldObj.isRemote && player.worldObj.getTotalWorldTime() % i == 0 - && MineFantasyII.random.nextFloat() * 100F < chance) { + && random.nextFloat() * 100F < chance) { spawnDragon(player); } } diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java index 865f06e5..42cc8f1d 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenMFTree.java @@ -1,6 +1,5 @@ package minefantasy.mf2.mechanics.worldGen; -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.block.list.BlockListMF; import net.minecraft.block.Block; import net.minecraft.block.BlockSapling; @@ -109,8 +108,8 @@ void generateLeafNodeList() { --i1; } else { for (double d0 = 0.5D; j1 < i; ++j1) { - double d1 = this.scaleWidth * f * (MineFantasyII.random.nextFloat() + 0.328D); - double d2 = MineFantasyII.random.nextFloat() * 2.0D * Math.PI; + double d1 = this.scaleWidth * f * (worldObj.rand.nextFloat() + 0.328D); + double d2 = worldObj.rand.nextFloat() * 2.0D * Math.PI; int k1 = MathHelper.floor_double(d1 * Math.sin(d2) + this.basePos[0] + d0); int l1 = MathHelper.floor_double(d1 * Math.cos(d2) + this.basePos[2] + d0); int[] aint1 = new int[]{k1, j, l1}; @@ -438,13 +437,13 @@ public void setScale(double p_76487_1_, double p_76487_3_, double p_76487_5_) { public boolean generate(World world, Random rand, int x, int y, int z) { this.worldObj = world; long l = rand.nextLong(); - MineFantasyII.random.setSeed(l); + world.rand.setSeed(l); this.basePos[0] = x; this.basePos[1] = y; this.basePos[2] = z; if (this.heightLimit == 0) { - this.heightLimit = 5 + MineFantasyII.random.nextInt(this.heightLimitLimit); + this.heightLimit = 5 + world.rand.nextInt(this.heightLimitLimit); } if (!this.validTreeLocation()) { diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java index ca219250..8c308d1f 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/structure/dwarven/WorldGenDwarvenStronghold.java @@ -28,11 +28,11 @@ public void setSurfaceMode(boolean flag) { protected StructureModuleMF getStartPiece(World world, int x, int y, int z, int direction) { return new StructureGenDSEntry(world, x, y - 1, z, direction, isSurfaceBuild); /* - * if(startPiece == null) { startPiece = new StructureGenDSEntry(world, x, y-1, - * z, direction, isSurfaceBuild); } startPiece.direction = direction; return - * startPiece; - * - */ + * if(startPiece == null) { startPiece = new StructureGenDSEntry(world, x, y-1, + * z, direction, isSurfaceBuild); } startPiece.direction = direction; return + * startPiece; + * + */ } @Override diff --git a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java index 1a435471..f664ecad 100644 --- a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java @@ -30,9 +30,7 @@ import minefantasy.mf2.mechanics.ExtendedReachMF; import minefantasy.mf2.mechanics.PlayerTickHandlerMF; import net.minecraft.client.Minecraft; -import net.minecraft.client.model.ModelHorse; import net.minecraft.entity.Entity; -import net.minecraft.entity.passive.EntityHorse; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -65,12 +63,12 @@ public void preInit() { @Override public void registerMain() { super.registerMain(); + registerRenders(); } @Override public void postInit() { super.postInit(); - registerRenders(); MineFantasyAPI.init(); KnowledgePageRegistry.registerPages(); } @@ -142,7 +140,6 @@ public void registerEntityRenderer() { RenderingRegistry.registerEntityRenderingHandler(EntityMinotaur.class, new RenderMinotaur(new ModelMinotaur(), 1.5F)); RenderingRegistry.registerEntityRenderingHandler(EntityHound.class, new RenderHound(new ModelHound())); - RenderingRegistry.registerEntityRenderingHandler(EntityHorse.class, new RenderVanillaHorse(new ModelHorse(), 0.75F)); } @Override diff --git a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java index 73901b8c..f8c9970a 100644 --- a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java @@ -4,7 +4,6 @@ import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.registry.GameRegistry; -import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.refine.ISmokeHandler; import minefantasy.mf2.api.refine.SmokeMechanics; @@ -23,6 +22,7 @@ import minefantasy.mf2.item.archery.ArrowFireFlint; import minefantasy.mf2.item.archery.ArrowFirerMF; import minefantasy.mf2.mechanics.*; +import minefantasy.mf2.util.XSTRandom; import minetweaker.MineTweakerAPI; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -149,12 +149,13 @@ public EntityPlayer getClientPlayer() { @Override public void spawnSmoke(World world, double x, double y, double z, int value) { + XSTRandom random = new XSTRandom(); for (int a = 0; a < value; a++) { float sprayRange = 0.005F; - float sprayX = (MineFantasyII.random.nextFloat() * sprayRange) - (sprayRange / 2); - float sprayZ = (MineFantasyII.random.nextFloat() * sprayRange) - (sprayRange / 2); + float sprayX = (random.nextFloat() * sprayRange) - (sprayRange / 2); + float sprayZ = (random.nextFloat() * sprayRange) - (sprayRange / 2); float height = 0.001F; - if (MineFantasyII.random.nextInt(2) == 0) { + if (random.nextInt(2) == 0) { EntitySmoke smoke = new EntitySmoke(world, x, y - 0.5D, z, sprayX, height, sprayZ); world.spawnEntityInWorld(smoke); } diff --git a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java index 5110077e..69291500 100644 --- a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java @@ -45,12 +45,12 @@ public class CarpenterRecipes { public static void init() { /* - * ArrayList wood = CustomMaterial.getList("wood"); Iterator - * iteratorWood = wood.iterator(); while(iteratorWood.hasNext()) { - * CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); - * - * } - */ + * ArrayList wood = CustomMaterial.getList("wood"); Iterator + * iteratorWood = wood.iterator(); while(iteratorWood.hasNext()) { + * CustomMaterial customMat = (CustomMaterial) iteratorWood.next(); + * + * } + */ assembleWoodBasic(); CustomWoodRecipes.init(); addDusts(); diff --git a/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java b/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java index 54761c6a..c16904bd 100644 --- a/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CookingRecipes.java @@ -93,7 +93,6 @@ private static void smeltFood() { new ItemStack(FoodListMF.generic_meat_mince_cooked), 0); GameRegistry.addSmelting(FoodListMF.bowl_water_salt, new ItemStack(FoodListMF.salt), 0); GameRegistry.addSmelting(FoodListMF.saussage_raw, new ItemStack(FoodListMF.saussage_cooked), 0); - } private static void addCeramics() { @@ -108,7 +107,9 @@ private static void addCeramics() { } private static CookRecipe bakeCeramic(Item clay, Item ceramic, int temp, int time) { - GameRegistry.addSmelting(clay, new ItemStack(ceramic), 0F); + if (!ConfigHardcore.preventCook) { + GameRegistry.addSmelting(clay, new ItemStack(ceramic), 0F); + } return MineFantasyAPI.addCookingRecipe(new ItemStack(clay), new ItemStack(ceramic), null, temp, 1000, time, 0, true, false); diff --git a/src/main/java/minefantasy/mf2/util/XSTRandom.java b/src/main/java/minefantasy/mf2/util/XSTRandom.java index 1cee7cdf..5883dfcf 100644 --- a/src/main/java/minefantasy/mf2/util/XSTRandom.java +++ b/src/main/java/minefantasy/mf2/util/XSTRandom.java @@ -179,7 +179,7 @@ synchronized public double nextGaussian() { * } while (bits - val + (bound-1) < 0); * return val; * }} - * + *

*

The hedge "approx * imately" is used in the foregoing description only because the next * method is only approximately an unbiased source of independently chosen diff --git a/src/main/resources/assets/minefantasy2/textures/items/animal/horse/armor/horse_armor_main.png b/src/main/resources/assets/minefantasy2/textures/items/animal/horse/armor/horse_armor_main.png deleted file mode 100644 index c2c1ec91110e1b5af1e785ff1c544a4e133e01f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15103 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 Mtu#J8d-=700R{9?A^-pY From 9234b32078004d10a2a9f3753c008cf4b516e960 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 12 Jan 2018 15:48:24 +0700 Subject: [PATCH 088/101] Light (leather) armor rebalance --- .../minefantasy/mf2/api/armour/ArmourDesign.java | 4 ++-- .../minefantasy/mf2/mechanics/CombatMechanics.java | 13 +------------ 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java b/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java index a7214e95..abb11fb8 100644 --- a/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java +++ b/src/main/java/minefantasy/mf2/api/armour/ArmourDesign.java @@ -24,9 +24,9 @@ public class ArmourDesign { public static final ArmourDesign LEATHER = new ArmourDesign("leather", "Leather", 1.0F, 1.0F, 10F, 0.25F) .calibrateTraits(0.7F, 1.0F, 0.5F).setWeightGroup(light);// Slightly better blunt public static final ArmourDesign PADDING = new ArmourDesign("padding", "Padding", 1.0F, 1.0F, 10F, 1.00F) - .calibrateTraits(0.6F, 1.2F, 0.4F).setWeightGroup(light);// 10kg, Blunt resistent + .calibrateTraits(0.85F, 0.9F, 0.6F).setWeightGroup(light);// 10kg, Cutting resistant public static final ArmourDesign STUDDED = new ArmourDesign("studded", "Studded", 0.8F, 1.0F, 10F, 0.25F) - .calibrateTraits(0.85F, 1.0F, 0.9F).setWeightGroup(light);// 10kg, Vulnerable to blunt + .calibrateTraits(0.6F, 1.2F, 0.9F).setWeightGroup(light);// 10kg, Blunt protection // MEDIUM ARMOUR public static final ArmourDesign SCALEMAIL = new ArmourDesign("scalemail", "Scalemail", 1.0F, 1.0F, 8F, 0.30F) .calibrateTraits(1.00F, 1.00F, 1.00F).setWeightGroup(medium);// 20kg, Average diff --git a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java index 7cc613d3..2301848a 100644 --- a/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java +++ b/src/main/java/minefantasy/mf2/mechanics/CombatMechanics.java @@ -389,7 +389,7 @@ public void onHit(LivingHurtEvent event) { if (event.source instanceof EntityDamageSource && !(event.source instanceof EntityDamageSourceIndirect) && !event.source.damageType.equals("battlegearExtra")) { - Entity entityHitter = ((EntityDamageSource) event.source).getEntity(); + Entity entityHitter = event.source.getEntity(); if (entityHitter instanceof EntityLivingBase) { EntityLivingBase attacker = (EntityLivingBase) entityHitter; @@ -400,17 +400,6 @@ public void onHit(LivingHurtEvent event) { } } event.ammount = damage; - - //Horses has own damage watcher - /*if (hit instanceof EntityHorse) { - EntityHorse horse = (EntityHorse) event.entity; - ItemStack customArmor = horse.getDataWatcher().getWatchableObjectItemStack(23); - - if (customArmor != null && customArmor.getItem() instanceof ItemHorseArmorMFBase) { - ItemHorseArmorMFBase armor = (ItemHorseArmorMFBase) customArmor.getItem(); - event.setCanceled(armor.onHorseDamaged(horse, customArmor, event.source, event.ammount)); - } - }*/ } private void onFall(EntityLivingBase fallen, float height) { From f57029ec9df7b54e2140b9966d5fcb93ebc78033 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 12 Jan 2018 16:23:36 +0700 Subject: [PATCH 089/101] Fixed vanilla cooking recipes handling in oven --- .../Unimplemented/MF2VenomDragon.java | 0 src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java | 8 ++------ src/main/resources/assets/minefantasy2/lang/ru_RU.lang | 4 ++-- 3 files changed, 4 insertions(+), 8 deletions(-) rename MF2VenomDragon.java => TODO/Unimplemented/MF2VenomDragon.java (100%) diff --git a/MF2VenomDragon.java b/TODO/Unimplemented/MF2VenomDragon.java similarity index 100% rename from MF2VenomDragon.java rename to TODO/Unimplemented/MF2VenomDragon.java diff --git a/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java b/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java index 7fe46b93..6eb7d2af 100644 --- a/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java +++ b/src/main/java/minefantasy/mf2/api/cooking/CookRecipe.java @@ -71,14 +71,10 @@ public static CookRecipe getResult(ItemStack item, boolean oven) { return null; CookRecipe result = recipeList.get(CustomToolHelper.getReferenceName(item)); - if (result != null && !result.isBaking || oven) { + if (result != null && result.isBaking == oven) { return result; - } else { - result = recipeList.get(CustomToolHelper.getReferenceName(item)); - if (result != null && !result.isBaking || oven) { - return result; - } } + if (canCookBasics) { ItemStack recipe = FurnaceRecipes.smelting().getSmeltingResult(item); if (recipe != null && recipe.getItem() instanceof ItemFood) { diff --git a/src/main/resources/assets/minefantasy2/lang/ru_RU.lang b/src/main/resources/assets/minefantasy2/lang/ru_RU.lang index a0c38018..d58405e7 100644 --- a/src/main/resources/assets/minefantasy2/lang/ru_RU.lang +++ b/src/main/resources/assets/minefantasy2/lang/ru_RU.lang @@ -2192,7 +2192,7 @@ knowledge.firepit=Костёр и плита knowledge.firepit.desc=Основы приготовления пищи knowledge.firepit.1=Костёр - самое простое средство для приготовления пищи.^Чтобы разжечь костёр, поставьте где-нибудь костровище, наложите туда брусков(ПКМ) и зажгите, к примеру, сухими камнями(ПКМ). knowledge.firepit.2=Плиты хорошо подходят для приготовления пищи, их следует разместить над костром или горном.^Укладывайте сырую еду на плиту и приглядывайте за ней, иначе сгорит. Некоторые рецепты (например, тортов) требуют требуют низкой температуры, для достижения которой отлично подойдёт угольная пыль. -knowledge.firepit.3=Печи позволяют готовить и обычную еду, и что-то более изысканное (например, хлеб).^Так же в печах можно обжаривать ваши глиняные поделки, просто повысив температуру (более горючим топливом). +knowledge.firepit.3=Печи позволяют готовить как обычную еду, так и что-то более изысканное (например, хлеб).^Так же в печах можно обжаривать ваши глиняные поделки, просто повысив температуру (более горючим топливом). knowledge.firepit.4=Используйте костёр для простых рецептов, а для более сложных - горн, растопленный на угольной пыли. Для обжига керамики потребуется обычное топливо, например, уголь. knowledge.cookingutensil=Инструменты для готовки @@ -2217,7 +2217,7 @@ knowledge.title.1= knowledge.fitness=Выносливость knowledge.fitness.desc=Оставайтесь в форме -knowledge.fitness.1=Самый Ваш главный враг в битве - Ваше тщедушное тело. Однако теперь после долгих и частых нагрузок Вы устаёте на 25% медленнее. +knowledge.fitness.1=Ваш самый главный враг в бою - ваше же тщедушное тело. Однако теперь после долгих и частых нагрузок Вы устаёте на 25% медленнее. knowledge.toughness=Сила knowledge.toughness.desc=Выкуси! From 1415a3e8ce70ccfe675f5f6e3c57e482f6871d8c Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 12 Jan 2018 19:14:26 +0700 Subject: [PATCH 090/101] Spanner now can works as wrench Were added only two wrench interfaces - BuildCraft's IToolWrench and CoFH's IToolHammer, but that should cover 90% of tech mods (they uses that interfaces too). That commit do not adds block rotation capability by MF spanner, it will be implamented later. Also, fixed potentional Lumber axe grief on bukkit servers. --- .../buildcraft/api/tools/IToolWrench.java | 40 +++++++++++++++++ src/api/java/cofh/api/item/IToolHammer.java | 44 +++++++++++++++++++ .../java/minefantasy/mf2/MineFantasyII.java | 3 +- .../mf2/config/ConfigHardcore.java | 1 - .../mf2/farming/FarmingHelper.java | 4 +- .../mf2/item/tool/advanced/ItemLumberAxe.java | 4 ++ .../mf2/item/tool/crafting/ItemSpanner.java | 44 ++++++++++++++++++- 7 files changed, 132 insertions(+), 8 deletions(-) create mode 100644 src/api/java/buildcraft/api/tools/IToolWrench.java create mode 100644 src/api/java/cofh/api/item/IToolHammer.java diff --git a/src/api/java/buildcraft/api/tools/IToolWrench.java b/src/api/java/buildcraft/api/tools/IToolWrench.java new file mode 100644 index 00000000..9bf98db9 --- /dev/null +++ b/src/api/java/buildcraft/api/tools/IToolWrench.java @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2011-2017, SpaceToad and the BuildCraft Team + * http://www.mod-buildcraft.com + * + * The BuildCraft API is distributed under the terms of the MIT License. + * Please check the contents of the license, which should be located + * as "LICENSE.API" in the BuildCraft source code distribution. + */ +package buildcraft.api.tools; + +import net.minecraft.entity.player.EntityPlayer; + +/*** + * Implement this interface on subclasses of Item to have that item work as a wrench for buildcraft + */ +public interface IToolWrench { + + /*** + * Called to ensure that the wrench can be used. To get the ItemStack that is used, check player.inventory.getCurrentItem() + * + * @param player + * - The player doing the wrenching + * @param x + * ,y,z - The coordinates for the block being wrenched + * + * @return true if wrenching is allowed, false if not + */ + boolean canWrench(EntityPlayer player, int x, int y, int z); + + /*** + * Callback after the wrench has been used. This can be used to decrease durability or for other purposes. To get the ItemStack that was used, check + * player.inventory.getCurrentItem() + * + * @param player + * - The player doing the wrenching + * @param x + * ,y,z - The coordinates of the block being wrenched + */ + void wrenchUsed(EntityPlayer player, int x, int y, int z); +} diff --git a/src/api/java/cofh/api/item/IToolHammer.java b/src/api/java/cofh/api/item/IToolHammer.java new file mode 100644 index 00000000..f1b4bb9b --- /dev/null +++ b/src/api/java/cofh/api/item/IToolHammer.java @@ -0,0 +1,44 @@ +package cofh.api.item; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; + +/** + * Implement this interface on subclasses of Item to have that item work as a tool for CoFH mods. + */ +public interface IToolHammer { + + /** + * Called to ensure that the tool can be used. + * + * @param item + * The itemstack for the tool. Not required to match equipped item (e.g., multi-tools that contain other tools) + * @param user + * The entity using the tool + * @param x + * X location of the block/tile + * @param y + * Y location of the block/tile + * @param z + * Z location of the block/tile + * @return True if this tool can be used + */ + boolean isUsable(ItemStack item, EntityLivingBase user, int x, int y, int z); + + /** + * Callback for when the tool has been used reactively. + * + * @param item + * The ItemStack for the tool. Not required to match equipped item (e.g., multi-tools that contain other tools) + * @param user + * The entity using the tool + * @param x + * X location of the block/tile + * @param y + * Y location of the block/tile + * @param z + * Z location of the block/tile + */ + void toolUsed(ItemStack item, EntityLivingBase user, int x, int y, int z); + +} diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 65265e60..1cba4dc2 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -35,7 +35,6 @@ import minefantasy.mf2.recipe.RecipeRemover; import minefantasy.mf2.util.BukkitUtils; import minefantasy.mf2.util.MFLogUtil; -import minefantasy.mf2.util.XSTRandom; import net.minecraft.init.Items; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.MinecraftForge; @@ -46,7 +45,7 @@ /** * @author Anonymous Productions */ -@Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);required-after:FML@[5.0.5,);after:NotEnoughItems;after:MineTweaker3", version = MineFantasyII.VERSION) +@Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);" + "required-after:FML@[5.0.5,);" + "after:NotEnoughItems;" + "after:MineTweaker3;" + "after:BuildCraft|Core;" + "after:CoFHCore", version = MineFantasyII.VERSION) public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; diff --git a/src/main/java/minefantasy/mf2/config/ConfigHardcore.java b/src/main/java/minefantasy/mf2/config/ConfigHardcore.java index 04187abc..96303375 100644 --- a/src/main/java/minefantasy/mf2/config/ConfigHardcore.java +++ b/src/main/java/minefantasy/mf2/config/ConfigHardcore.java @@ -98,5 +98,4 @@ protected void loadConfig() { CombatMechanics.swordSkeleton = Boolean.parseBoolean( config.get(CATEGORY_MOB, "Skeleton Swords", true, "Some Skeletons use swords").getString()); } - } diff --git a/src/main/java/minefantasy/mf2/farming/FarmingHelper.java b/src/main/java/minefantasy/mf2/farming/FarmingHelper.java index 3403dd0b..73b86666 100644 --- a/src/main/java/minefantasy/mf2/farming/FarmingHelper.java +++ b/src/main/java/minefantasy/mf2/farming/FarmingHelper.java @@ -39,15 +39,13 @@ public static boolean didHarvestRuinBlock(World world, boolean scythe) { } private static float getHoeEfficiency(ItemStack hoe) { - if (hoe != null) { - if (hoe.getItem() instanceof ItemHoe) { + if (hoe != null && hoe.getItem() instanceof ItemHoe) { String name = ((ItemHoe) hoe.getItem()).getToolMaterialName(); ToolMaterial mat = ToolMaterial.valueOf(name); if (mat != null) { return CustomHoeEntry.getEntryEfficiency(hoe, mat.getEfficiencyOnProperMaterial()); } - } } return CustomHoeEntry.getEntryEfficiency(hoe, 6.0F); } diff --git a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java index 8b6b4d7b..95c937c4 100644 --- a/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java +++ b/src/main/java/minefantasy/mf2/item/tool/advanced/ItemLumberAxe.java @@ -137,6 +137,10 @@ public void breakSurrounding(ItemStack item, World world, Block block, int x, in int blockZ = z + z1 + FD.offsetZ; if (!(x1 + FD.offsetX == 0 && y1 + FD.offsetY == 0 && z1 + FD.offsetZ == 0)) { + if (MineFantasyII.isBukkitServer() && BukkitUtils.cantBreakBlock((EntityPlayer) user, blockX, blockY, blockZ)) { + break; + } + Block newblock = world.getBlock(blockX, blockY, blockZ); int m = world.getBlockMetadata(blockX, blockY, blockZ); diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java index 038e6e30..371f7b7c 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java @@ -1,8 +1,13 @@ package minefantasy.mf2.item.tool.crafting; +import buildcraft.api.tools.IToolWrench; +import cofh.api.item.IToolHammer; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; +import cpw.mods.fml.common.Optional.Interface; +import cpw.mods.fml.common.Optional.InterfaceList; +import cpw.mods.fml.common.Optional.Method; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -16,6 +21,7 @@ import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; @@ -33,7 +39,13 @@ /** * @author Anonymous Productions */ -public class ItemSpanner extends ItemTool implements IToolMaterial, IToolMF, IDamageType { + +@InterfaceList({ + @Interface(iface = "buildcraft.api.tools.IToolWrench", modid = "BuildCraft|Core"), + @Interface(iface = "cofh.api.item.IToolHammer", modid = "CoFHCore") +}) + +public class ItemSpanner extends ItemTool implements IToolMaterial, IToolMF, IDamageType, IToolWrench, IToolHammer { protected int itemRarity; private ToolMaterial material; private int tier; @@ -235,6 +247,34 @@ public String getItemStackDisplayName(ItemStack item) { String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; return CustomToolHelper.getLocalisedName(item, unlocalName); } + // ====================================================== CUSTOM END // ==============================================================\\ -} + + /* BuildCraft wrench support */ + @Override + @Method(modid = "BuildCraft|Core") + public boolean canWrench(EntityPlayer player, int x, int y, int z) { + return true; + } + + @Override + @Method(modid = "BuildCraft|Core") + public void wrenchUsed(EntityPlayer player, int x, int y, int z) { + player.getCurrentEquippedItem().damageItem(1, player); + player.swingItem(); + } + + /* COFH mods wrench support */ + @Override + @Method(modid = "CoFHCore") + public boolean isUsable(ItemStack item, EntityLivingBase user, int x, int y, int z) { + return user instanceof EntityPlayer; + } + + @Override + @Method(modid = "CoFHCore") + public void toolUsed(ItemStack item, EntityLivingBase user, int x, int y, int z) { + item.damageItem(1, user); + } +} \ No newline at end of file From 869942d77b58d81dbcc826e7517ae5e1d6ce5f17 Mon Sep 17 00:00:00 2001 From: Sirse Date: Fri, 12 Jan 2018 20:15:56 +0700 Subject: [PATCH 091/101] Update version --- build.gradle | 2 +- src/main/java/minefantasy/mf2/MineFantasyII.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 835e4a19..43210523 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'idea' -version = "2.8.14.3u" +version = "2.8.14.4u" group= "minefantasy.mf2.minefantasy2" archivesBaseName = "MineFantasyII" diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 1cba4dc2..2ff25d41 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -49,7 +49,7 @@ public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; - public static final String VERSION = "Alpha_2.8.14.3u"; + public static final String VERSION = "Alpha_2.8.14.4u"; public static final WorldGenMFBase worldGenManager = new WorldGenMFBase(); @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") From 27f85499eb7f1023622ec9da0bcdbd5b116fff70 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sat, 13 Jan 2018 14:26:02 +0700 Subject: [PATCH 092/101] Knifes now can be used as shears They are has reduced drop (in three times) and can shear only blocks (leaves, grass, etc). --- .../mf2/item/tool/crafting/ItemKnifeMF.java | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java index c43c2034..755f614c 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemKnifeMF.java @@ -11,30 +11,34 @@ import minefantasy.mf2.api.tool.IToolMF; import minefantasy.mf2.api.weapon.WeaponClass; import minefantasy.mf2.item.weapon.ItemWeaponMF; +import minefantasy.mf2.util.XSTRandom; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.stats.StatList; import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.IShearable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Random; /** * @author Anonymous Productions */ public class ItemKnifeMF extends ItemWeaponMF implements IToolMF, IHuntingItem { protected int itemRarity; - private Random rand = new Random(); private int tier; private float baseDamage; // ===================================================== CUSTOM START @@ -53,6 +57,36 @@ public ItemKnifeMF(String name, ToolMaterial material, int rarity, float weight, setTextureName("minefantasy2:Tool/Crafting/" + name); } + @Override + public boolean onBlockStartBreak(ItemStack itemstack, int x, int y, int z, EntityPlayer player) { + if (!player.worldObj.isRemote) { + Block block = player.worldObj.getBlock(x, y, z); + if (block instanceof IShearable) { + IShearable target = (IShearable) block; + if (target.isShearable(itemstack, player.worldObj, x, y, z)) { + XSTRandom rand = new XSTRandom(); + if(rand.nextInt(10) < 3) { //knife has reduced drop and can't be used to shear entity's + ArrayList drops = target.onSheared(itemstack, player.worldObj, x, y, z, + EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, itemstack)); + for (ItemStack stack : drops) { + float f = 0.7F; + double d = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; + double d1 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; + double d2 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; + EntityItem entityitem = new EntityItem(player.worldObj, (double) x + d, (double) y + d1, (double) z + d2, stack); + entityitem.delayBeforeCanPickup = 10; + player.worldObj.spawnEntityInWorld(entityitem); + } + + itemstack.damageItem(1, player); + player.addStat(StatList.mineBlockStatArray[Block.getIdFromBlock(block)], 1); + } + } + } + } + return false; + } + @Override public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) { return item; From 37b96e6395335dfe8b92489c5d5f42b7154997b3 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 14 Jan 2018 01:59:26 +0700 Subject: [PATCH 093/101] Fixed crash without MT installed Spanner now acts as BuildCraft wrench and can rotate blocks. --- .../mf2/integration/minetweaker/MTCompat.java | 21 +++--- .../item/tool/crafting/ItemPaintBrush.java | 27 ++++---- .../mf2/item/tool/crafting/ItemSpanner.java | 65 +++++++++++++++---- .../mf2/network/CommonProxyMF.java | 1 - src/main/java/minefantasy/mf2/util/Utils.java | 29 +++++++++ src/main/resources/mcmod.info | 33 ++++++---- 6 files changed, 127 insertions(+), 49 deletions(-) diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java index 019db9c9..ada35b38 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -1,12 +1,12 @@ package minefantasy.mf2.integration.minetweaker; +import cpw.mods.fml.common.Optional; import minefantasy.mf2.integration.minetweaker.helpers.MaterialExpansion; import minefantasy.mf2.integration.minetweaker.tweakers.*; -import minetweaker.IRecipeRemover; import minetweaker.MineTweakerAPI; import minetweaker.api.item.IIngredient; -public class MTCompat implements IRecipeRemover { +public class MTCompat { private static final String[] COMMAND_DESC = { "MineFantasy commands:", @@ -30,16 +30,21 @@ public static void loadTweakers() { MineTweakerAPI.registerClass(TanningRack.class); MineTweakerAPI.registerClass(Quern.class); MineTweakerAPI.registerClass(SalvageTweaker.class); + MineTweakerAPI.registerRemover(new MFRecipeRemover()); } public static void registerCommands() { MineTweakerAPI.server.addMineTweakerCommand("mf", COMMAND_DESC, new MTCommands()); } - @Override - public void remove(IIngredient iIngredient) { - Bloomery.remove(iIngredient, null); - Quern.remove(iIngredient, null); - TanningRack.remove(iIngredient, null); + @Optional.Interface(iface = "minetweaker.IRecipeRemover", modid = "MineTweaker3") + public static class MFRecipeRemover implements minetweaker.IRecipeRemover { + @Optional.Method(modid = "MineTweaker3") + @Override + public void remove(IIngredient iIngredient) { + Bloomery.remove(iIngredient, null); + Quern.remove(iIngredient, null); + TanningRack.remove(iIngredient, null); + } } -} +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java index a0172b97..d1ae56f7 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemPaintBrush.java @@ -42,6 +42,18 @@ public int getMaxDamage(ItemStack stack) { return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage()); } + @Override + public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int side, float f, + float f1, float f2) { + if (user.canPlayerEdit(x, y, z, side, item) && ResearchLogic.hasInfoUnlocked(user, "paint_brush")) { + if (!user.isSwingInProgress && user.inventory.hasItem(ComponentListMF.plant_oil)) { + Block block = world.getBlock(x, y, z); + return onUsedWithBlock(world, x, y, z, block, item, user); + } + } + return false; + } + private boolean onUsedWithBlock(World world, int x, int y, int z, Block block, ItemStack item, EntityPlayer user) { Block newBlock = null; int meta = world.getBlockMetadata(x, y, z); @@ -72,21 +84,6 @@ private boolean onUsedWithBlock(World world, int x, int y, int z, Block block, I return false; } - @Override - public boolean onItemUse(ItemStack item, EntityPlayer user, World world, int x, int y, int z, int side, float f, - float f1, float f2) { - if (!ResearchLogic.hasInfoUnlocked(user, "paint_brush")) { - return false; - } - if (!user.canPlayerEdit(x, y, z, side, item)) { - return false; - } else if (!user.isSwingInProgress && user.inventory.hasItem(ComponentListMF.plant_oil)) { - Block block = world.getBlock(x, y, z); - return onUsedWithBlock(world, x, y, z, block, item, user); - } - return false; - } - @Override public float getScale(ItemStack itemstack) { return 1.0F; diff --git a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java index 371f7b7c..da543442 100644 --- a/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java +++ b/src/main/java/minefantasy/mf2/item/tool/crafting/ItemSpanner.java @@ -18,7 +18,8 @@ import minefantasy.mf2.api.tool.IToolMF; import minefantasy.mf2.api.weapon.IDamageType; import minefantasy.mf2.item.list.CreativeTabMF; -import net.minecraft.block.Block; +import minefantasy.mf2.util.Utils; +import net.minecraft.block.*; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; @@ -30,11 +31,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; import net.minecraft.util.IIcon; +import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.util.ForgeDirection; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; +import java.util.*; /** * @author Anonymous Productions @@ -42,7 +43,7 @@ @InterfaceList({ @Interface(iface = "buildcraft.api.tools.IToolWrench", modid = "BuildCraft|Core"), - @Interface(iface = "cofh.api.item.IToolHammer", modid = "CoFHCore") + @Interface(iface = "cofh.api.item.IToolHammer", modid = "CoFHAPI|item") }) public class ItemSpanner extends ItemTool implements IToolMaterial, IToolMF, IDamageType, IToolWrench, IToolHammer { @@ -51,13 +52,14 @@ public class ItemSpanner extends ItemTool implements IToolMaterial, IToolMF, IDa private int tier; private float baseDamage; private String name; - // ===================================================== CUSTOM START - // =============================================================\\ private boolean isCustom = false; private float efficiencyMod = 1.0F; private IIcon detailTex = null; private IIcon haftTex = null; + private final Set> shiftRotations = new HashSet>(); + private final Set> blacklistedRotations = new HashSet>(); + public ItemSpanner(String name, int rarity, int tier) { super(2.0F, ToolMaterial.IRON, Sets.newHashSet(new Block[]{})); this.material = ToolMaterial.IRON; @@ -69,6 +71,48 @@ public ItemSpanner(String name, int rarity, int tier) { setTextureName("minefantasy2:Tool/Crafting/" + name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); + + shiftRotations.add(BlockLever.class); + shiftRotations.add(BlockButton.class); + shiftRotations.add(BlockChest.class); + blacklistedRotations.add(BlockBed.class); + } + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + Block block = world.getBlock(x, y, z); + + if (block == null || isClass(blacklistedRotations, block.getClass())) { + return false; + } + + if (player.isSneaking() != isClass(shiftRotations, block.getClass())) { + return false; + } + + if (block instanceof BlockChest && Utils.getOtherDoubleChest(world.getTileEntity(x, y, z)) != null) { + return false; + } + + if (block.rotateBlock(world, x, y, z, ForgeDirection.getOrientation(side))) { + player.swingItem(); + return !world.isRemote; + } + return false; + } + + private boolean isClass(Set> set, Class cls) { + for (Class shift : set) { + if (shift.isAssignableFrom(cls)) { + return true; + } + } + return false; + } + + @Override + public boolean doesSneakBypassUse(World world, int x, int y, int z, EntityPlayer player) { + return true; } @Override @@ -248,9 +292,6 @@ public String getItemStackDisplayName(ItemStack item) { return CustomToolHelper.getLocalisedName(item, unlocalName); } - // ====================================================== CUSTOM END - // ==============================================================\\ - /* BuildCraft wrench support */ @Override @Method(modid = "BuildCraft|Core") @@ -267,13 +308,13 @@ public void wrenchUsed(EntityPlayer player, int x, int y, int z) { /* COFH mods wrench support */ @Override - @Method(modid = "CoFHCore") + @Method(modid = "CoFHAPI|item") public boolean isUsable(ItemStack item, EntityLivingBase user, int x, int y, int z) { return user instanceof EntityPlayer; } @Override - @Method(modid = "CoFHCore") + @Method(modid = "CoFHAPI|item") public void toolUsed(ItemStack item, EntityLivingBase user, int x, int y, int z) { item.damageItem(1, user); } diff --git a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java index f8c9970a..7245af74 100644 --- a/src/main/java/minefantasy/mf2/network/CommonProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/CommonProxyMF.java @@ -100,7 +100,6 @@ public void registerMain() { SmokeMechanics.handler = this; if (Loader.isModLoaded("MineTweaker3") && ConfigIntegration.mtIntegration) { MTCompat.loadTweakers(); - MineTweakerAPI.registerRemover(new MTCompat()); } } diff --git a/src/main/java/minefantasy/mf2/util/Utils.java b/src/main/java/minefantasy/mf2/util/Utils.java index a50bf8db..3c4dcdf0 100644 --- a/src/main/java/minefantasy/mf2/util/Utils.java +++ b/src/main/java/minefantasy/mf2/util/Utils.java @@ -1,6 +1,8 @@ package minefantasy.mf2.util; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; import net.minecraftforge.oredict.OreDictionary; public class Utils { @@ -10,4 +12,31 @@ public static boolean doesMatch(ItemStack item1, ItemStack item2) { || item2.getItemDamage() == item1.getItemDamage()); } + public static TileEntityChest getOtherDoubleChest(TileEntity inv) { + if (inv instanceof TileEntityChest) { + TileEntityChest chest = (TileEntityChest) inv; + + TileEntityChest adjacent = null; + + if (chest.adjacentChestXNeg != null) { + adjacent = chest.adjacentChestXNeg; + } + + if (chest.adjacentChestXPos != null) { + adjacent = chest.adjacentChestXPos; + } + + if (chest.adjacentChestZNeg != null) { + adjacent = chest.adjacentChestZNeg; + } + + if (chest.adjacentChestZPos != null) { + adjacent = chest.adjacentChestZPos; + } + + return adjacent; + } + return null; + } + } diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 35a42cdc..e8b57f83 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,18 +1,25 @@ [ { - "modid": "MineFantasy2", - "name": "Mine FantasyII", - "description": "NOTE: This is an incomplete mod, crafting has not been implemented. Make sure to have a recipe guide installed. Not all items are obtainable or balanced", - "version": "${version}", - "mcversion": "${mcversion}", - "url": "", - "updateUrl": "", - "authors": [ + "modid":"MineFantasy2", + "name":"Mine FantasyII", + "description":"NOTE: This is an incomplete mod, crafting has not been implemented. Make sure to have a recipe guide installed. Not all items are obtainable or balanced", + "version":"${version}", + "mcversion":"${mcversion}", + "url":"", + "updateUrl":"", + "authors":[ "Anonymous" ], - "credits": "-", - "logoFile": "", - "screenshots": [], - "dependencies": [] + "credits":"-", + "logoFile":"", + "screenshots":[ + + ], + "dependencies":[ + "MineTweaker3", + "NotEnoughItems", + "BuildCraft|Core", + "CoFHCore" + ] } -] +] \ No newline at end of file From f376ed48811d1d31748002c5e36c29f485d2bc88 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 14 Jan 2018 02:00:19 +0700 Subject: [PATCH 094/101] Updated version --- build.gradle | 2 +- src/main/java/minefantasy/mf2/MineFantasyII.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 43210523..7d047e1f 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'idea' -version = "2.8.14.4u" +version = "2.8.14.5u" group= "minefantasy.mf2.minefantasy2" archivesBaseName = "MineFantasyII" diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 2ff25d41..beef49c8 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -49,7 +49,7 @@ public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; - public static final String VERSION = "Alpha_2.8.14.4u"; + public static final String VERSION = "Alpha_2.8.14.5u"; public static final WorldGenMFBase worldGenManager = new WorldGenMFBase(); @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") From 104c9a03921f663d3deafc56590ab81bd3d3a682 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 14 Jan 2018 18:21:33 +0700 Subject: [PATCH 095/101] Update README.md --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 07f4abb4..17ee7efb 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ -# MineFantasy2 Unofficial ![Travis CI](https://travis-ci.org/Sirse/MineFantasyII-Cont.svg?branch=master) +# MineFantasy2 Unofficial [![Travis CI](https://travis-ci.org/Sirse/MineFantasyII-Cont.svg?branch=master)](https://travis-ci.org/Sirse/MineFantasyII-Cont) [![CurseForge](http://cf.way2muchnoise.eu/minefantasy2.svg)](https://minecraft.curseforge.com/projects/minefantasy2) -Unofficial MineFantasy 2 fork aimed for cross-mod integration, bug fixes, stability and perfomance tweaks. +Unofficial, but approved MineFantasy 2 fork aimed for cross-mod integration, bug fixes, stability and perfomance tweaks. -Downloads are avaliable on [releases page](https://github.com/Sirse/MineFantasyII-Cont/releases) +### Useful links: -Feedback are needed! If you found an issue, please, [report it!](https://github.com/Sirse/MineFantasyII-Cont/issues) +- Join a discussion at [our Minecraft forum thread](minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/wip-mods/2467203-minefantasy2-alpha) +- Downloads are avaliable on [releases page](https://github.com/Sirse/MineFantasyII-Cont/releases) +- Feedback are needed! If you found an issue, please, [report it!](https://github.com/Sirse/MineFantasyII-Cont/issues) #### Also, you are can support MineFantasy II Unofficial developing [via donation!](https://www.paypal.me/sirse) From 63125851b430dc9f7612b30462dcf55e2e8c4f54 Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 14 Jan 2018 18:23:30 +0700 Subject: [PATCH 096/101] Update README.md Fixed link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 17ee7efb..b6289f1e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# MineFantasy2 Unofficial [![Travis CI](https://travis-ci.org/Sirse/MineFantasyII-Cont.svg?branch=master)](https://travis-ci.org/Sirse/MineFantasyII-Cont) [![CurseForge](http://cf.way2muchnoise.eu/minefantasy2.svg)](https://minecraft.curseforge.com/projects/minefantasy2) +# MineFantasy2 Unofficial [![Travis CI](https://travis-ci.org/Sirse/MineFantasyII-Cont.svg?branch=master)](https://travis-ci.org/Sirse/MineFantasyII-Cont) [![CurseForge](https://cf.way2muchnoise.eu/minefantasy2.svg)](https://minecraft.curseforge.com/projects/minefantasy2) Unofficial, but approved MineFantasy 2 fork aimed for cross-mod integration, bug fixes, stability and perfomance tweaks. ### Useful links: -- Join a discussion at [our Minecraft forum thread](minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/wip-mods/2467203-minefantasy2-alpha) +- Join a discussion at [our Minecraft forum thread](https://minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/wip-mods/2467203-minefantasy2-alpha) - Downloads are avaliable on [releases page](https://github.com/Sirse/MineFantasyII-Cont/releases) - Feedback are needed! If you found an issue, please, [report it!](https://github.com/Sirse/MineFantasyII-Cont/issues) From d9de4f05713f1ee3403638f4d354d54149d00caf Mon Sep 17 00:00:00 2001 From: Sirse Date: Sun, 14 Jan 2018 18:24:51 +0700 Subject: [PATCH 097/101] Update README.md Broken image --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b6289f1e..59fd2e43 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# MineFantasy2 Unofficial [![Travis CI](https://travis-ci.org/Sirse/MineFantasyII-Cont.svg?branch=master)](https://travis-ci.org/Sirse/MineFantasyII-Cont) [![CurseForge](https://cf.way2muchnoise.eu/minefantasy2.svg)](https://minecraft.curseforge.com/projects/minefantasy2) +# MineFantasy2 Unofficial [![Travis CI](https://travis-ci.org/Sirse/MineFantasyII-Cont.svg?branch=master)](https://travis-ci.org/Sirse/MineFantasyII-Cont) [![CurseForge](http://cf.way2muchnoise.eu/minefantasy2.svg)](https://minecraft.curseforge.com/projects/minefantasy2) Unofficial, but approved MineFantasy 2 fork aimed for cross-mod integration, bug fixes, stability and perfomance tweaks. From 4e88fa075c5eff2e7521a246285e5282ab4bf453 Mon Sep 17 00:00:00 2001 From: Sirse Date: Tue, 1 May 2018 14:01:51 +0700 Subject: [PATCH 098/101] Fixes --- build.gradle | 1 + .../java/minefantasy/mf2/MineFantasyII.java | 17 +- .../mf2/api/helpers/ToolHelper.java | 4 +- .../mf2/client/render/RenderBow.java | 13 +- .../minefantasy/mf2/commands/CommandMF.java | 149 ++++++++++++++++++ .../mf2/item/archery/ItemArrowMF.java | 6 +- .../mf2/item/archery/ItemBowMF.java | 6 +- .../mf2/item/weapon/ItemWeaponMF.java | 21 ++- 8 files changed, 196 insertions(+), 21 deletions(-) create mode 100644 src/main/java/minefantasy/mf2/commands/CommandMF.java diff --git a/build.gradle b/build.gradle index 7d047e1f..f1f9bb0a 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ archivesBaseName = "MineFantasyII" minecraft { version = "1.7.10-10.13.4.1614-1.7.10" runDir = "run" + replace "@VERSION@", project.version } idea { module { inheritOutputDirs = true } } diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index beef49c8..8b6bca51 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -6,10 +6,7 @@ import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.SidedProxy; -import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLPostInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.event.FMLServerStartedEvent; +import cpw.mods.fml.common.event.*; import cpw.mods.fml.common.network.FMLEventChannel; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; @@ -18,6 +15,7 @@ import minefantasy.mf2.api.armour.ArmourDesign; import minefantasy.mf2.api.armour.CustomArmourEntry; import minefantasy.mf2.block.list.BlockListMF; +import minefantasy.mf2.commands.CommandMF; import minefantasy.mf2.config.*; import minefantasy.mf2.integration.minetweaker.MTCompat; import minefantasy.mf2.item.gadget.ItemLootSack; @@ -35,7 +33,9 @@ import minefantasy.mf2.recipe.RecipeRemover; import minefantasy.mf2.util.BukkitUtils; import minefantasy.mf2.util.MFLogUtil; +import net.minecraft.client.Minecraft; import net.minecraft.init.Items; +import net.minecraft.server.MinecraftServer; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; @@ -45,11 +45,11 @@ /** * @author Anonymous Productions */ -@Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);" + "required-after:FML@[5.0.5,);" + "after:NotEnoughItems;" + "after:MineTweaker3;" + "after:BuildCraft|Core;" + "after:CoFHCore", version = MineFantasyII.VERSION) +@Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);" + "required-after:FML@[5.0.5,);" + "after:NotEnoughItems;" + "after:MineTweaker3;" + "after:BuildCraft|Core;" + "after:CoFHCore" + "after:battlegear2", version = MineFantasyII.VERSION) public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; - public static final String VERSION = "Alpha_2.8.14.5u"; + public static final String VERSION = "@VERSION@"; public static final WorldGenMFBase worldGenManager = new WorldGenMFBase(); @SidedProxy(clientSide = "minefantasy.mf2.network.ClientProxyMF", serverSide = "minefantasy.mf2.network.CommonProxyMF") @@ -181,6 +181,11 @@ public void modsLoaded(FMLPostInitializationEvent evt) { MetalMaterial.addHeatables(); } + @EventHandler + public void serverLoad(FMLServerStartingEvent event) { + event.registerServerCommand(new CommandMF()); + } + @EventHandler public final void serverStarted(FMLServerStartedEvent event) { if (event.getSide() != Side.CLIENT && isBukkitServer()) { diff --git a/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java b/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java index b58a9e7b..24e2b792 100644 --- a/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java +++ b/src/main/java/minefantasy/mf2/api/helpers/ToolHelper.java @@ -291,10 +291,10 @@ public static boolean isToolSufficient(ItemStack heldItem, String toolNeeded, in return toolType.equalsIgnoreCase(toolNeeded) && tier >= toolTierNeeded; } - public static void setUnbreakable(ItemStack tool) { + public static void setUnbreakable(ItemStack tool, boolean isUnbreakable) { if (!tool.hasTagCompound()) { tool.setTagCompound(new NBTTagCompound()); } - tool.getTagCompound().setBoolean("Unbreakable", true); + tool.getTagCompound().setBoolean("Unbreakable", isUnbreakable); } } diff --git a/src/main/java/minefantasy/mf2/client/render/RenderBow.java b/src/main/java/minefantasy/mf2/client/render/RenderBow.java index b9d4dba8..5e8db182 100644 --- a/src/main/java/minefantasy/mf2/client/render/RenderBow.java +++ b/src/main/java/minefantasy/mf2/client/render/RenderBow.java @@ -1,11 +1,10 @@ package minefantasy.mf2.client.render; import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.common.Loader; import minefantasy.mf2.api.archery.AmmoMechanicsMF; import minefantasy.mf2.api.helpers.TextureHelperMF; import minefantasy.mf2.item.archery.ItemBowMF; -import mods.battlegear2.api.quiver.IArrowContainer2; -import mods.battlegear2.api.quiver.QuiverArrowRegistry; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.Tessellator; @@ -117,10 +116,12 @@ else if (timer > 0) } - ItemStack quiver = QuiverArrowRegistry.getArrowContainer(item, (EntityPlayer) entityLivingBase); - if (quiver != null) { - arrowStack = ((IArrowContainer2) quiver.getItem()).getStackInSlot(quiver, - ((IArrowContainer2) quiver.getItem()).getSelectedSlot(quiver)); + if(Loader.isModLoaded("battlegear2")) { + ItemStack quiver = mods.battlegear2.api.quiver.QuiverArrowRegistry.getArrowContainer(item, (EntityPlayer) entityLivingBase); + if (quiver != null) { + arrowStack = ((mods.battlegear2.api.quiver.IArrowContainer2) quiver.getItem()).getStackInSlot(quiver, + ((mods.battlegear2.api.quiver.IArrowContainer2) quiver.getItem()).getSelectedSlot(quiver)); + } } if (timer == 0) { diff --git a/src/main/java/minefantasy/mf2/commands/CommandMF.java b/src/main/java/minefantasy/mf2/commands/CommandMF.java new file mode 100644 index 00000000..85d81df9 --- /dev/null +++ b/src/main/java/minefantasy/mf2/commands/CommandMF.java @@ -0,0 +1,149 @@ +package minefantasy.mf2.commands; + +import minefantasy.mf2.api.helpers.CustomToolHelper; +import minefantasy.mf2.api.helpers.ToolHelper; +import minefantasy.mf2.api.material.CustomMaterial; +import net.minecraft.command.ICommand; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.StatCollector; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class CommandMF implements ICommand { + + private final List materials; + + private final List aliases = new ArrayList() {{ + add("mf"); + add("minefantasy"); + }}; + + public CommandMF() { + materials = CustomMaterial.materialList.values().stream().filter(material -> material.type.equalsIgnoreCase("wood") || material.type.equalsIgnoreCase("metal")).collect(Collectors.toList()); + } + + @Override + public String getCommandName() { + return "minefantasy"; + } + + @Override + public String getCommandUsage(ICommandSender iCommandSender) { + return null; + } + + @Override + public List getCommandAliases() { + return this.aliases; + } + + @Override + public void processCommand(ICommandSender iCommandSender, String[] strings) { + if (iCommandSender instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) iCommandSender; + if (strings[0].equalsIgnoreCase("edit")) { + ItemStack equippedItem = player.getCurrentEquippedItem(); + if (equippedItem == null) { + player.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("command.invalid.item"))); + return; + } + + switch (strings[1]) { + case "material": + processEditMaterialCommand(strings, player, equippedItem); + break; + case "quality": + processQualityCommand(strings, player, equippedItem); + break; + case "unbreakable": + processUnbreakableCommand(strings, player, equippedItem); + break; + } + } + } + } + + private void processEditMaterialCommand(String[] strings, EntityPlayer player, ItemStack equippedItem) { + if (!CustomToolHelper.hasAnyMaterial(equippedItem)) { + player.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("command.invalid.item"))); + return; + } + + CustomMaterial material = CustomMaterial.getMaterial(strings[2]); + if (material == null) { + player.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("command.edit.invalid.material"))); + return; + } + + String slot = material.type.equalsIgnoreCase("metal") ? CustomToolHelper.slot_main : CustomToolHelper.slot_haft; + CustomMaterial.addMaterial(equippedItem, slot, material.name); + onSuccess(player); + } + + private void processQualityCommand(String[] strings, EntityPlayer player, ItemStack equippedItem) { + int qualityLvl = Integer.parseInt(strings[2]); + if (0 <= qualityLvl && qualityLvl <= 200) { + equippedItem = ToolHelper.setQuality(equippedItem, qualityLvl); + //this is only approximate trait calculation + if (qualityLvl <= 50) { + equippedItem.stackTagCompound.setBoolean("MF_Inferior", true); + } + if (qualityLvl >= 150) { + equippedItem.stackTagCompound.setBoolean("MF_Inferior", false); + } + onSuccess(player); + } + } + + private void processUnbreakableCommand(String[] strings, EntityPlayer player, ItemStack equippedItem) { + boolean isUnbreakable = Boolean.parseBoolean(strings[2]); + ToolHelper.setUnbreakable(equippedItem, isUnbreakable); + onSuccess(player); + } + + private void onSuccess(EntityPlayer player) { + player.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("command.edit.success"))); + } + + @Override + public boolean canCommandSenderUseCommand(ICommandSender iCommandSender) { + return true; + } + + @Override + public List addTabCompletionOptions(ICommandSender iCommandSender, String[] strings) { + if (strings[0].equalsIgnoreCase("edit")) { + if (strings.length == 2) { + return Arrays.asList("material", "quality", "unbreakable"); + } + + if (strings.length == 3) { + if (strings[2].equalsIgnoreCase("material")) { + return materials; + } + + if (strings[2].equalsIgnoreCase("unbreakable")) { + return Arrays.asList("true", "false"); + } + } + } + + return null; + } + + @Override + public boolean isUsernameIndex(String[] strings, int i) { + return false; + } + + @Override + public int compareTo(Object o) { + return 0; + } +} diff --git a/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java b/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java index 89d80424..da2799b4 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java +++ b/src/main/java/minefantasy/mf2/item/archery/ItemArrowMF.java @@ -1,5 +1,6 @@ package minefantasy.mf2.item.archery; +import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -13,7 +14,6 @@ import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.material.BaseMaterialMF; import minefantasy.mf2.mechanics.MFArrowDispenser; -import mods.battlegear2.api.quiver.QuiverArrowRegistry; import net.minecraft.block.BlockDispenser; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -86,7 +86,9 @@ public ItemArrowMF(String name, int rarity, ToolMaterial material, ArrowType typ GameRegistry.registerItem(this, "MF_Com_" + name, MineFantasyII.MODID); AmmoMechanicsMF.addArrow(new ItemStack(this)); - QuiverArrowRegistry.addArrowToRegistry(new ItemStack(this), null); + if(Loader.isModLoaded("battlegear2")) { + mods.battlegear2.api.quiver.QuiverArrowRegistry.addArrowToRegistry(new ItemStack(this), null); + } BlockDispenser.dispenseBehaviorRegistry.putObject(this, dispenser); } diff --git a/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java b/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java index 899adb0c..4e4263aa 100644 --- a/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java +++ b/src/main/java/minefantasy/mf2/item/archery/ItemBowMF.java @@ -1,5 +1,6 @@ package minefantasy.mf2.item.archery; +import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -8,7 +9,6 @@ import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.item.list.CreativeTabMF; -import mods.battlegear2.api.PlayerEventChild.OffhandAttackEvent; import mods.battlegear2.api.weapons.IBattlegearWeapon; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -34,6 +34,7 @@ import java.util.Iterator; import java.util.List; +@Optional.Interface(iface = "mods.battlegear2.api.weapons.IBattlegearWeapon", modid = "battlegear2") public class ItemBowMF extends ItemBow implements ISpecialBow, IDisplayMFAmmo, IBattlegearWeapon, IFirearm { public static final DecimalFormat decimal_format = new DecimalFormat("#.##"); private final EnumBowType model; @@ -328,7 +329,8 @@ public boolean isOffhandHandDual(ItemStack off) { } @Override - public boolean offhandAttackEntity(OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) { + @Optional.Method(modid = "battlegear2") + public boolean offhandAttackEntity(mods.battlegear2.api.PlayerEventChild.OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) { return false; } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java index d10c6560..73f414bc 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java @@ -2,6 +2,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,8 +25,12 @@ import minefantasy.mf2.item.tool.crafting.ItemKnifeMF; import minefantasy.mf2.material.BaseMaterialMF; import minefantasy.mf2.util.MFLogUtil; -import mods.battlegear2.api.PlayerEventChild.OffhandAttackEvent; -import mods.battlegear2.api.weapons.*; +import mods.battlegear2.api.weapons.IBackStabbable; +import mods.battlegear2.api.weapons.IBattlegearWeapon; +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import mods.battlegear2.api.weapons.IHitTimeModifier; +import mods.battlegear2.api.weapons.IPenetrateWeapon; +import mods.battlegear2.api.weapons.WeaponRegistry; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -53,6 +58,15 @@ import java.util.List; import java.util.Random; +@Optional.InterfaceList(value = { + @Optional.Interface(iface = "mods.battlegear2.api.weapons.IBackStabbable", modid = "battlegear2"), + @Optional.Interface(iface = "mods.battlegear2.api.weapons.IBattlegearWeapon", modid = "battlegear2"), + @Optional.Interface(iface = "mods.battlegear2.api.weapons.IExtendedReachWeapon", modid = "battlegear2"), + @Optional.Interface(iface = "mods.battlegear2.api.weapons.IHitTimeModifier", modid = "battlegear2"), + @Optional.Interface(iface = "mods.battlegear2.api.weapons.IPenetrateWeapon", modid = "battlegear2"), + @Optional.Interface(iface = "mods.battlegear2.api.weapons.WeaponRegistry", modid = "battlegear2") +}) + //Made this extend the sword class (allows them to be enchanted) public abstract class ItemWeaponMF extends ItemSword implements ISpecialDesign, IPowerAttack, IDamageType, IKnockbackWeapon, IWeaponSpeed, IHeldStaminaItem, IStaminaWeapon, IBattlegearWeapon, IToolMaterial, @@ -345,7 +359,8 @@ public boolean isOffhandHandDual(ItemStack off) { } @Override - public boolean offhandAttackEntity(OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) { + @Optional.Method(modid = "battlegear2") + public boolean offhandAttackEntity(mods.battlegear2.api.PlayerEventChild.OffhandAttackEvent event, ItemStack mainhandItem, ItemStack offhandItem) { return true; } From 021b6ceac78f369053519cde3d5d7b7969a640ef Mon Sep 17 00:00:00 2001 From: Sirse Date: Tue, 1 May 2018 14:28:41 +0700 Subject: [PATCH 099/101] Removed hardcoded BG dependency check Removed MT helper for custom materials manipulations Moved battlegear api to separate folder Project was forced for jdk1.8 --- build.gradle | 5 ++ gradle/wrapper/gradle-wrapper.properties | 4 +- .../java/mods/battlegear2/api/IAllowItem.java | 0 .../mods/battlegear2/api/IDefaultRender.java | 0 .../java/mods/battlegear2/api/IDyable.java | 0 .../mods/battlegear2/api/IEnchantable.java | 0 .../mods/battlegear2/api/IOffhandDual.java | 0 .../java/mods/battlegear2/api/ISheathed.java | 0 .../battlegear2/api/PlayerEventChild.java | 0 .../battlegear2/api/RenderItemBarEvent.java | 0 .../battlegear2/api/core/IBattlePlayer.java | 0 .../battlegear2/api/core/IOffhandRender.java | 0 .../api/core/InventoryPlayerBattle.java | 0 .../api/core/InventorySlotType.java | 0 .../battlegear2/api/core/package-info.java | 0 .../mods/battlegear2/api/heraldry/Crest.java | 0 .../api/heraldry/HeraldryData.java | 0 .../api/heraldry/HeraldryDataBackup.java | 0 .../api/heraldry/HeraldryPattern.java | 0 .../api/heraldry/HeraldryTextureSmall.java | 0 .../battlegear2/api/heraldry/IFlagHolder.java | 0 .../api/heraldry/IHeraldryItem.java | 0 .../api/heraldry/IHeraldyArmour.java | 0 .../mods/battlegear2/api/heraldry/ITool.java | 0 .../api/heraldry/PatternStore.java | 0 .../api/heraldry/RefreshableTexture.java | 0 .../api/heraldry/package-info.java | 0 .../mods/battlegear2/api/package-info.java | 0 .../api/quiver/IArrowContainer2.java | 0 .../api/quiver/IArrowFireHandler.java | 0 .../api/quiver/IQuiverSelection.java | 0 .../api/quiver/QuiverArrowRegistry.java | 0 .../battlegear2/api/quiver/package-info.java | 0 .../battlegear2/api/shield/IArrowCatcher.java | 0 .../battlegear2/api/shield/IArrowDisplay.java | 0 .../mods/battlegear2/api/shield/IShield.java | 0 .../battlegear2/api/shield/ShieldType.java | 0 .../battlegear2/api/shield/package-info.java | 0 .../api/weapons/IBackStabbable.java | 0 .../api/weapons/IBattlegearWeapon.java | 0 .../api/weapons/IExtendedReachWeapon.java | 0 .../api/weapons/IHitTimeModifier.java | 0 .../api/weapons/IPenetrateWeapon.java | 0 .../api/weapons/IPotionEffect.java | 0 .../api/weapons/ISpecialEffect.java | 0 .../api/weapons/WeaponRegistry.java | 0 .../battlegear2/api/weapons/package-info.java | 0 .../java/minefantasy/mf2/MineFantasyII.java | 18 +---- .../minefantasy/mf2/commands/CommandMF.java | 13 ++- .../mf2/integration/minetweaker/MTCompat.java | 3 - .../helpers/MaterialExpansion.java | 77 ------------------ .../tweakers/CustomMaterialHandler.java | 80 ------------------- 52 files changed, 19 insertions(+), 181 deletions(-) rename src/{main => api}/java/mods/battlegear2/api/IAllowItem.java (100%) rename src/{main => api}/java/mods/battlegear2/api/IDefaultRender.java (100%) rename src/{main => api}/java/mods/battlegear2/api/IDyable.java (100%) rename src/{main => api}/java/mods/battlegear2/api/IEnchantable.java (100%) rename src/{main => api}/java/mods/battlegear2/api/IOffhandDual.java (100%) rename src/{main => api}/java/mods/battlegear2/api/ISheathed.java (100%) rename src/{main => api}/java/mods/battlegear2/api/PlayerEventChild.java (100%) rename src/{main => api}/java/mods/battlegear2/api/RenderItemBarEvent.java (100%) rename src/{main => api}/java/mods/battlegear2/api/core/IBattlePlayer.java (100%) rename src/{main => api}/java/mods/battlegear2/api/core/IOffhandRender.java (100%) rename src/{main => api}/java/mods/battlegear2/api/core/InventoryPlayerBattle.java (100%) rename src/{main => api}/java/mods/battlegear2/api/core/InventorySlotType.java (100%) rename src/{main => api}/java/mods/battlegear2/api/core/package-info.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/Crest.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/HeraldryData.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/HeraldryPattern.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/IFlagHolder.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/IHeraldryItem.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/ITool.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/PatternStore.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/RefreshableTexture.java (100%) rename src/{main => api}/java/mods/battlegear2/api/heraldry/package-info.java (100%) rename src/{main => api}/java/mods/battlegear2/api/package-info.java (100%) rename src/{main => api}/java/mods/battlegear2/api/quiver/IArrowContainer2.java (100%) rename src/{main => api}/java/mods/battlegear2/api/quiver/IArrowFireHandler.java (100%) rename src/{main => api}/java/mods/battlegear2/api/quiver/IQuiverSelection.java (100%) rename src/{main => api}/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java (100%) rename src/{main => api}/java/mods/battlegear2/api/quiver/package-info.java (100%) rename src/{main => api}/java/mods/battlegear2/api/shield/IArrowCatcher.java (100%) rename src/{main => api}/java/mods/battlegear2/api/shield/IArrowDisplay.java (100%) rename src/{main => api}/java/mods/battlegear2/api/shield/IShield.java (100%) rename src/{main => api}/java/mods/battlegear2/api/shield/ShieldType.java (100%) rename src/{main => api}/java/mods/battlegear2/api/shield/package-info.java (100%) rename src/{main => api}/java/mods/battlegear2/api/weapons/IBackStabbable.java (100%) rename src/{main => api}/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java (100%) rename src/{main => api}/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java (100%) rename src/{main => api}/java/mods/battlegear2/api/weapons/IHitTimeModifier.java (100%) rename src/{main => api}/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java (100%) rename src/{main => api}/java/mods/battlegear2/api/weapons/IPotionEffect.java (100%) rename src/{main => api}/java/mods/battlegear2/api/weapons/ISpecialEffect.java (100%) rename src/{main => api}/java/mods/battlegear2/api/weapons/WeaponRegistry.java (100%) rename src/{main => api}/java/mods/battlegear2/api/weapons/package-info.java (100%) delete mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java delete mode 100644 src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java diff --git a/build.gradle b/build.gradle index f1f9bb0a..3c7fc178 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,11 @@ version = "2.8.14.5u" group= "minefantasy.mf2.minefantasy2" archivesBaseName = "MineFantasyII" +sourceCompatibility = targetCompatibility = '1.8' +compileJava { + sourceCompatibility = targetCompatibility = '1.8' +} + minecraft { version = "1.7.10-10.13.4.1614-1.7.10" runDir = "run" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a787f942..8473501c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Oct 29 18:00:54 CDT 2013 +#Tue May 01 14:18:37 NOVT 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-2.13-bin.zip +distributionUrl=http\://services.gradle.org/distributions/gradle-2.13-all.zip diff --git a/src/main/java/mods/battlegear2/api/IAllowItem.java b/src/api/java/mods/battlegear2/api/IAllowItem.java similarity index 100% rename from src/main/java/mods/battlegear2/api/IAllowItem.java rename to src/api/java/mods/battlegear2/api/IAllowItem.java diff --git a/src/main/java/mods/battlegear2/api/IDefaultRender.java b/src/api/java/mods/battlegear2/api/IDefaultRender.java similarity index 100% rename from src/main/java/mods/battlegear2/api/IDefaultRender.java rename to src/api/java/mods/battlegear2/api/IDefaultRender.java diff --git a/src/main/java/mods/battlegear2/api/IDyable.java b/src/api/java/mods/battlegear2/api/IDyable.java similarity index 100% rename from src/main/java/mods/battlegear2/api/IDyable.java rename to src/api/java/mods/battlegear2/api/IDyable.java diff --git a/src/main/java/mods/battlegear2/api/IEnchantable.java b/src/api/java/mods/battlegear2/api/IEnchantable.java similarity index 100% rename from src/main/java/mods/battlegear2/api/IEnchantable.java rename to src/api/java/mods/battlegear2/api/IEnchantable.java diff --git a/src/main/java/mods/battlegear2/api/IOffhandDual.java b/src/api/java/mods/battlegear2/api/IOffhandDual.java similarity index 100% rename from src/main/java/mods/battlegear2/api/IOffhandDual.java rename to src/api/java/mods/battlegear2/api/IOffhandDual.java diff --git a/src/main/java/mods/battlegear2/api/ISheathed.java b/src/api/java/mods/battlegear2/api/ISheathed.java similarity index 100% rename from src/main/java/mods/battlegear2/api/ISheathed.java rename to src/api/java/mods/battlegear2/api/ISheathed.java diff --git a/src/main/java/mods/battlegear2/api/PlayerEventChild.java b/src/api/java/mods/battlegear2/api/PlayerEventChild.java similarity index 100% rename from src/main/java/mods/battlegear2/api/PlayerEventChild.java rename to src/api/java/mods/battlegear2/api/PlayerEventChild.java diff --git a/src/main/java/mods/battlegear2/api/RenderItemBarEvent.java b/src/api/java/mods/battlegear2/api/RenderItemBarEvent.java similarity index 100% rename from src/main/java/mods/battlegear2/api/RenderItemBarEvent.java rename to src/api/java/mods/battlegear2/api/RenderItemBarEvent.java diff --git a/src/main/java/mods/battlegear2/api/core/IBattlePlayer.java b/src/api/java/mods/battlegear2/api/core/IBattlePlayer.java similarity index 100% rename from src/main/java/mods/battlegear2/api/core/IBattlePlayer.java rename to src/api/java/mods/battlegear2/api/core/IBattlePlayer.java diff --git a/src/main/java/mods/battlegear2/api/core/IOffhandRender.java b/src/api/java/mods/battlegear2/api/core/IOffhandRender.java similarity index 100% rename from src/main/java/mods/battlegear2/api/core/IOffhandRender.java rename to src/api/java/mods/battlegear2/api/core/IOffhandRender.java diff --git a/src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java b/src/api/java/mods/battlegear2/api/core/InventoryPlayerBattle.java similarity index 100% rename from src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java rename to src/api/java/mods/battlegear2/api/core/InventoryPlayerBattle.java diff --git a/src/main/java/mods/battlegear2/api/core/InventorySlotType.java b/src/api/java/mods/battlegear2/api/core/InventorySlotType.java similarity index 100% rename from src/main/java/mods/battlegear2/api/core/InventorySlotType.java rename to src/api/java/mods/battlegear2/api/core/InventorySlotType.java diff --git a/src/main/java/mods/battlegear2/api/core/package-info.java b/src/api/java/mods/battlegear2/api/core/package-info.java similarity index 100% rename from src/main/java/mods/battlegear2/api/core/package-info.java rename to src/api/java/mods/battlegear2/api/core/package-info.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/Crest.java b/src/api/java/mods/battlegear2/api/heraldry/Crest.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/Crest.java rename to src/api/java/mods/battlegear2/api/heraldry/Crest.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java b/src/api/java/mods/battlegear2/api/heraldry/HeraldryData.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java rename to src/api/java/mods/battlegear2/api/heraldry/HeraldryData.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java b/src/api/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java rename to src/api/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java b/src/api/java/mods/battlegear2/api/heraldry/HeraldryPattern.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java rename to src/api/java/mods/battlegear2/api/heraldry/HeraldryPattern.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java b/src/api/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java rename to src/api/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java b/src/api/java/mods/battlegear2/api/heraldry/IFlagHolder.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java rename to src/api/java/mods/battlegear2/api/heraldry/IFlagHolder.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java b/src/api/java/mods/battlegear2/api/heraldry/IHeraldryItem.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java rename to src/api/java/mods/battlegear2/api/heraldry/IHeraldryItem.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java b/src/api/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java rename to src/api/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/ITool.java b/src/api/java/mods/battlegear2/api/heraldry/ITool.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/ITool.java rename to src/api/java/mods/battlegear2/api/heraldry/ITool.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/PatternStore.java b/src/api/java/mods/battlegear2/api/heraldry/PatternStore.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/PatternStore.java rename to src/api/java/mods/battlegear2/api/heraldry/PatternStore.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java b/src/api/java/mods/battlegear2/api/heraldry/RefreshableTexture.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java rename to src/api/java/mods/battlegear2/api/heraldry/RefreshableTexture.java diff --git a/src/main/java/mods/battlegear2/api/heraldry/package-info.java b/src/api/java/mods/battlegear2/api/heraldry/package-info.java similarity index 100% rename from src/main/java/mods/battlegear2/api/heraldry/package-info.java rename to src/api/java/mods/battlegear2/api/heraldry/package-info.java diff --git a/src/main/java/mods/battlegear2/api/package-info.java b/src/api/java/mods/battlegear2/api/package-info.java similarity index 100% rename from src/main/java/mods/battlegear2/api/package-info.java rename to src/api/java/mods/battlegear2/api/package-info.java diff --git a/src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java b/src/api/java/mods/battlegear2/api/quiver/IArrowContainer2.java similarity index 100% rename from src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java rename to src/api/java/mods/battlegear2/api/quiver/IArrowContainer2.java diff --git a/src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java b/src/api/java/mods/battlegear2/api/quiver/IArrowFireHandler.java similarity index 100% rename from src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java rename to src/api/java/mods/battlegear2/api/quiver/IArrowFireHandler.java diff --git a/src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java b/src/api/java/mods/battlegear2/api/quiver/IQuiverSelection.java similarity index 100% rename from src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java rename to src/api/java/mods/battlegear2/api/quiver/IQuiverSelection.java diff --git a/src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java b/src/api/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java similarity index 100% rename from src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java rename to src/api/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java diff --git a/src/main/java/mods/battlegear2/api/quiver/package-info.java b/src/api/java/mods/battlegear2/api/quiver/package-info.java similarity index 100% rename from src/main/java/mods/battlegear2/api/quiver/package-info.java rename to src/api/java/mods/battlegear2/api/quiver/package-info.java diff --git a/src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java b/src/api/java/mods/battlegear2/api/shield/IArrowCatcher.java similarity index 100% rename from src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java rename to src/api/java/mods/battlegear2/api/shield/IArrowCatcher.java diff --git a/src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java b/src/api/java/mods/battlegear2/api/shield/IArrowDisplay.java similarity index 100% rename from src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java rename to src/api/java/mods/battlegear2/api/shield/IArrowDisplay.java diff --git a/src/main/java/mods/battlegear2/api/shield/IShield.java b/src/api/java/mods/battlegear2/api/shield/IShield.java similarity index 100% rename from src/main/java/mods/battlegear2/api/shield/IShield.java rename to src/api/java/mods/battlegear2/api/shield/IShield.java diff --git a/src/main/java/mods/battlegear2/api/shield/ShieldType.java b/src/api/java/mods/battlegear2/api/shield/ShieldType.java similarity index 100% rename from src/main/java/mods/battlegear2/api/shield/ShieldType.java rename to src/api/java/mods/battlegear2/api/shield/ShieldType.java diff --git a/src/main/java/mods/battlegear2/api/shield/package-info.java b/src/api/java/mods/battlegear2/api/shield/package-info.java similarity index 100% rename from src/main/java/mods/battlegear2/api/shield/package-info.java rename to src/api/java/mods/battlegear2/api/shield/package-info.java diff --git a/src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java b/src/api/java/mods/battlegear2/api/weapons/IBackStabbable.java similarity index 100% rename from src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java rename to src/api/java/mods/battlegear2/api/weapons/IBackStabbable.java diff --git a/src/main/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java b/src/api/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java similarity index 100% rename from src/main/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java rename to src/api/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java diff --git a/src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java b/src/api/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java similarity index 100% rename from src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java rename to src/api/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java diff --git a/src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java b/src/api/java/mods/battlegear2/api/weapons/IHitTimeModifier.java similarity index 100% rename from src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java rename to src/api/java/mods/battlegear2/api/weapons/IHitTimeModifier.java diff --git a/src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java b/src/api/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java similarity index 100% rename from src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java rename to src/api/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java diff --git a/src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java b/src/api/java/mods/battlegear2/api/weapons/IPotionEffect.java similarity index 100% rename from src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java rename to src/api/java/mods/battlegear2/api/weapons/IPotionEffect.java diff --git a/src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java b/src/api/java/mods/battlegear2/api/weapons/ISpecialEffect.java similarity index 100% rename from src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java rename to src/api/java/mods/battlegear2/api/weapons/ISpecialEffect.java diff --git a/src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java b/src/api/java/mods/battlegear2/api/weapons/WeaponRegistry.java similarity index 100% rename from src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java rename to src/api/java/mods/battlegear2/api/weapons/WeaponRegistry.java diff --git a/src/main/java/mods/battlegear2/api/weapons/package-info.java b/src/api/java/mods/battlegear2/api/weapons/package-info.java similarity index 100% rename from src/main/java/mods/battlegear2/api/weapons/package-info.java rename to src/api/java/mods/battlegear2/api/weapons/package-info.java diff --git a/src/main/java/minefantasy/mf2/MineFantasyII.java b/src/main/java/minefantasy/mf2/MineFantasyII.java index 8b6bca51..b4be95c7 100644 --- a/src/main/java/minefantasy/mf2/MineFantasyII.java +++ b/src/main/java/minefantasy/mf2/MineFantasyII.java @@ -45,7 +45,7 @@ /** * @author Anonymous Productions */ -@Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);" + "required-after:FML@[5.0.5,);" + "after:NotEnoughItems;" + "after:MineTweaker3;" + "after:BuildCraft|Core;" + "after:CoFHCore" + "after:battlegear2", version = MineFantasyII.VERSION) +@Mod(modid = MineFantasyII.MODID, name = MineFantasyII.NAME, dependencies = "required-after:Forge@[7.0,);" + "required-after:FML@[5.0.5,);" + "after:NotEnoughItems;" + "after:MineTweaker3;" + "after:BuildCraft|Core;" + "after:CoFHCore;" + "after:battlegear2", version = MineFantasyII.VERSION) public class MineFantasyII { public static final String MODID = "minefantasy2"; public static final String NAME = "MineFantasyII"; @@ -59,31 +59,16 @@ public class MineFantasyII { @Instance(MODID) public static MineFantasyII instance; - private static boolean isBGLoaded; private static boolean isBukkitServer; private static Configuration getCfg(FMLPreInitializationEvent event, String name) { return new Configuration(new File(event.getModConfigurationDirectory(), "MineFantasyII/" + name + ".cfg")); } - public static boolean isBGLoaded() { - return isBGLoaded; - } - public static boolean isBukkitServer() { return isBukkitServer; } - public static boolean setIsBGLoaded() { - try { - Class.forName("mods.battlegear2.Battlegear"); - // return Loader.isModLoaded("battlegear2"); - } catch (ClassNotFoundException e) { - return false; - } - return true; - } - public static boolean setIsBukkitServer() { try { Class.forName("org.spigotmc.SpigotConfig"); @@ -206,7 +191,6 @@ private void registerBiomeStuff(BiomeGenBase biome) { } private void addModFlags() { - isBGLoaded = setIsBGLoaded(); isBukkitServer = setIsBukkitServer(); } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/commands/CommandMF.java b/src/main/java/minefantasy/mf2/commands/CommandMF.java index 85d81df9..8f8297b9 100644 --- a/src/main/java/minefantasy/mf2/commands/CommandMF.java +++ b/src/main/java/minefantasy/mf2/commands/CommandMF.java @@ -13,7 +13,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; public class CommandMF implements ICommand { @@ -25,7 +24,17 @@ public class CommandMF implements ICommand { }}; public CommandMF() { - materials = CustomMaterial.materialList.values().stream().filter(material -> material.type.equalsIgnoreCase("wood") || material.type.equalsIgnoreCase("metal")).collect(Collectors.toList()); + materials = setupMaterialsList(); + } + + private List setupMaterialsList() { + List materials = new ArrayList(); + for(CustomMaterial material : CustomMaterial.materialList.values()) { + if(material.type.equalsIgnoreCase("wood") || material.type.equalsIgnoreCase("metal")) { + materials.add(material); + } + } + return materials; } @Override diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java index ada35b38..d5391c1e 100644 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java +++ b/src/main/java/minefantasy/mf2/integration/minetweaker/MTCompat.java @@ -1,7 +1,6 @@ package minefantasy.mf2.integration.minetweaker; import cpw.mods.fml.common.Optional; -import minefantasy.mf2.integration.minetweaker.helpers.MaterialExpansion; import minefantasy.mf2.integration.minetweaker.tweakers.*; import minetweaker.MineTweakerAPI; import minetweaker.api.item.IIngredient; @@ -22,11 +21,9 @@ public static void loadTweakers() { MineTweakerAPI.registerClass(BigFurnace.class); MineTweakerAPI.registerClass(BlastFurnace.class); MineTweakerAPI.registerClass(CarpentersBench.class); - MineTweakerAPI.registerClass(CustomMaterialHandler.class); MineTweakerAPI.registerClass(Cooking.class); MineTweakerAPI.registerClass(Crucible.class); MineTweakerAPI.registerClass(Forge.class); - MineTweakerAPI.registerClass(MaterialExpansion.class); MineTweakerAPI.registerClass(TanningRack.class); MineTweakerAPI.registerClass(Quern.class); MineTweakerAPI.registerClass(SalvageTweaker.class); diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java b/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java deleted file mode 100644 index 8d3afb96..00000000 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/helpers/MaterialExpansion.java +++ /dev/null @@ -1,77 +0,0 @@ -package minefantasy.mf2.integration.minetweaker.helpers; - -import minefantasy.mf2.api.MineFantasyAPI; -import minefantasy.mf2.api.material.CustomMaterial; -import minefantasy.mf2.api.rpg.SkillList; -import minefantasy.mf2.item.list.ComponentListMF; -import minefantasy.mf2.knowledge.KnowledgeListMF; -import minefantasy.mf2.material.MetalMaterial; -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -import stanhebben.zenscript.annotations.NotNull; -import stanhebben.zenscript.annotations.Optional; -import stanhebben.zenscript.annotations.ZenExpansion; -import stanhebben.zenscript.annotations.ZenMethod; - - -@ZenExpansion("minefantasy.mf2.api.material.CustomMaterial") -public class MaterialExpansion { - - @ZenMethod("setColor") - public static CustomMaterial setColor(@NotNull CustomMaterial material, int r, int g, int b) { - return material.setColour(r, g, b); - } - - @ZenMethod("setMeltingPoint") - public static CustomMaterial setMeltingPoint(@NotNull CustomMaterial material, float meltingPoint) { - if (!(material instanceof MetalMaterial)) { - throw new IllegalArgumentException("Method setMeltingPoint can be applied only to Metal materials!"); - } - material.setMeltingPoint(meltingPoint); - int[] stats = material.getHeatableStats(); - MineFantasyAPI.setHeatableStats("ingot" + material.name, stats[0], stats[1], stats[2]); - MineFantasyAPI.setHeatableStats("hunk" + material.name, stats[0], stats[1], stats[2]); - return material; - } - - @ZenMethod("setCrafterTiers") - public static CustomMaterial setCrafterTiers(@NotNull CustomMaterial material, int craftingTier) { - return material.setCrafterTiers(craftingTier); - - } - - @ZenMethod("setRarity") - public static CustomMaterial setRarity(@NotNull CustomMaterial material, int rarity) { - return material.setRarity(rarity); - } - - @ZenMethod("setUnbreakable") - public static CustomMaterial setUnbreakable(@NotNull CustomMaterial material) { - return material.setUnbreakable(); - - } - - @ZenMethod("setArmourStats") - public static CustomMaterial setArmourStats(@NotNull CustomMaterial material, float cutting, float blunt, float piercing) { - return material.setArmourStats(cutting, blunt, piercing); - } - - @ZenMethod("modifyCraftTime") - public static CustomMaterial modifyCraftTime(@NotNull CustomMaterial material, float time) { - return material.modifyCraftTime(time); - } - - @ZenMethod("initRecipes") - public static CustomMaterial initRecipes(@NotNull CustomMaterial material, @Optional String oreDictEntry) { - if (oreDictEntry == null) { - oreDictEntry = "ingot" + material.name; - } - - ItemStack bar = ComponentListMF.bar.createComm(material.name); - for (ItemStack ingot : OreDictionary.getOres(oreDictEntry)) { - KnowledgeListMF.barR.add(MineFantasyAPI.addAnvilRecipe(SkillList.artisanry, bar, "", true, "hammer", -1, -1, - (int) (material.craftTimeModifier / 2F), new Object[]{"I", 'I', ingot,})); - } - return material; - } -} diff --git a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java b/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java deleted file mode 100644 index a631654b..00000000 --- a/src/main/java/minefantasy/mf2/integration/minetweaker/tweakers/CustomMaterialHandler.java +++ /dev/null @@ -1,80 +0,0 @@ -package minefantasy.mf2.integration.minetweaker.tweakers; - -import minefantasy.mf2.api.material.CustomMaterial; -import minetweaker.IUndoableAction; -import minetweaker.MineTweakerAPI; -import stanhebben.zenscript.annotations.ZenClass; -import stanhebben.zenscript.annotations.ZenMethod; - -@ZenClass("mods.minefantasy.CustomMaterial") -public class CustomMaterialHandler { - - @ZenMethod - public static CustomMaterial addMaterial(String type, String name, int tier, float hardness, float durability, - float flexibility, float sharpness, float resistance, float density) { - if (CustomMaterial.getMaterial(name) != null) { - throw new IllegalArgumentException("Material with this name already exists!"); - } - RegisterCustomMaterial reg = new RegisterCustomMaterial(type.toLowerCase(), name, tier, hardness, durability, flexibility, sharpness, resistance, density); - MineTweakerAPI.apply(reg); - return reg.material; - } - - @ZenMethod - public static CustomMaterial getMaterial(String materialName) { - return CustomMaterial.getMaterial(materialName); - } - - private static class RegisterCustomMaterial implements IUndoableAction { - - private final String type, name; - private final int tier; - private final float hardness, durability, flexibility, sharpness, resistance, density; - public CustomMaterial material; - - public RegisterCustomMaterial(String type, String name, int tier, float hardness, float durability, - float flexibility, float sharpness, float resistance, float density) { - this.type = type; - this.name = name; - this.tier = tier; - this.hardness = hardness; - this.durability = durability; - this.flexibility = flexibility; - this.sharpness = sharpness; - this.resistance = resistance; - this.density = density; - } - - @Override - public void apply() { - material = new CustomMaterial(name, type, tier, hardness, durability, flexibility, resistance, sharpness, density).register(); - } - - @Override - public boolean canUndo() { - return false; - } - - @Override - public void undo() { - /*CustomMaterial.materialList.remove(this.name); - CustomMaterial.getList(this.type).remove(this.material);*/ - } - - @Override - public String describe() { - return "Registers custom material for MF crafting system"; - } - - @Override - public String describeUndo() { - /*return "Removing custom material";*/ - return null; - } - - @Override - public Object getOverrideKey() { - return null; - } - } -} \ No newline at end of file From 1d262014c667395acf0b4080ce15b931b64c06f4 Mon Sep 17 00:00:00 2001 From: Arseny Spiridonov Date: Wed, 23 May 2018 23:59:42 +0700 Subject: [PATCH 100/101] Revert --- .../mf2/block/decor/BlockRack.java | 17 ++-- .../mf2/block/decor/BlockTrough.java | 1 - .../mf2/block/decor/BlockWoodDecor.java | 78 +++++++++---------- .../tileentity/decor/TileEntityTrough.java | 9 --- .../tileentity/decor/TileEntityWoodDecor.java | 6 -- .../client/render/block/RenderBellows.java | 2 +- .../client/render/block/RenderBigFurnace.java | 2 +- .../client/render/block/RenderBloomery.java | 2 +- .../mf2/client/render/block/RenderTrough.java | 4 +- .../block/TileEntityTroughRenderer.java | 4 +- .../mf2/item/list/ComponentListMF.java | 2 +- .../mf2/item/weapon/ItemSwordMF.java | 4 - .../mf2/item/weapon/ItemWeaponMF.java | 21 ++--- .../mf2/mechanics/ExtendedReachMF.java | 11 +-- .../java/mods/battlegear2/api/IAllowItem.java | 0 .../mods/battlegear2/api/IDefaultRender.java | 0 .../java/mods/battlegear2/api/IDyable.java | 0 .../mods/battlegear2/api/IEnchantable.java | 0 .../mods/battlegear2/api/IOffhandDual.java | 0 .../java/mods/battlegear2/api/ISheathed.java | 0 .../battlegear2/api/PlayerEventChild.java | 0 .../battlegear2/api/RenderItemBarEvent.java | 0 .../battlegear2/api/core/IBattlePlayer.java | 0 .../battlegear2/api/core/IOffhandRender.java | 0 .../api/core/InventoryPlayerBattle.java | 0 .../api/core/InventorySlotType.java | 0 .../battlegear2/api/core/package-info.java | 0 .../mods/battlegear2/api/heraldry/Crest.java | 0 .../api/heraldry/HeraldryData.java | 0 .../api/heraldry/HeraldryDataBackup.java | 0 .../api/heraldry/HeraldryPattern.java | 0 .../api/heraldry/HeraldryTextureSmall.java | 0 .../battlegear2/api/heraldry/IFlagHolder.java | 0 .../api/heraldry/IHeraldryItem.java | 0 .../api/heraldry/IHeraldyArmour.java | 0 .../mods/battlegear2/api/heraldry/ITool.java | 0 .../api/heraldry/PatternStore.java | 0 .../api/heraldry/RefreshableTexture.java | 0 .../api/heraldry/package-info.java | 0 .../mods/battlegear2/api/package-info.java | 0 .../api/quiver/IArrowContainer2.java | 0 .../api/quiver/IArrowFireHandler.java | 0 .../api/quiver/IQuiverSelection.java | 0 .../api/quiver/QuiverArrowRegistry.java | 0 .../battlegear2/api/quiver/package-info.java | 0 .../battlegear2/api/shield/IArrowCatcher.java | 0 .../battlegear2/api/shield/IArrowDisplay.java | 0 .../mods/battlegear2/api/shield/IShield.java | 0 .../battlegear2/api/shield/ShieldType.java | 0 .../battlegear2/api/shield/package-info.java | 0 .../api/weapons/IBackStabbable.java | 0 .../api/weapons/IBattlegearWeapon.java | 0 .../api/weapons/IExtendedReachWeapon.java | 0 .../api/weapons/IHitTimeModifier.java | 0 .../api/weapons/IPenetrateWeapon.java | 0 .../api/weapons/IPotionEffect.java | 0 .../api/weapons/ISpecialEffect.java | 0 .../api/weapons/WeaponRegistry.java | 0 .../battlegear2/api/weapons/package-info.java | 0 59 files changed, 58 insertions(+), 105 deletions(-) rename src/{api => main}/java/mods/battlegear2/api/IAllowItem.java (100%) rename src/{api => main}/java/mods/battlegear2/api/IDefaultRender.java (100%) rename src/{api => main}/java/mods/battlegear2/api/IDyable.java (100%) rename src/{api => main}/java/mods/battlegear2/api/IEnchantable.java (100%) rename src/{api => main}/java/mods/battlegear2/api/IOffhandDual.java (100%) rename src/{api => main}/java/mods/battlegear2/api/ISheathed.java (100%) rename src/{api => main}/java/mods/battlegear2/api/PlayerEventChild.java (100%) rename src/{api => main}/java/mods/battlegear2/api/RenderItemBarEvent.java (100%) rename src/{api => main}/java/mods/battlegear2/api/core/IBattlePlayer.java (100%) rename src/{api => main}/java/mods/battlegear2/api/core/IOffhandRender.java (100%) rename src/{api => main}/java/mods/battlegear2/api/core/InventoryPlayerBattle.java (100%) rename src/{api => main}/java/mods/battlegear2/api/core/InventorySlotType.java (100%) rename src/{api => main}/java/mods/battlegear2/api/core/package-info.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/Crest.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/HeraldryData.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/HeraldryPattern.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/IFlagHolder.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/IHeraldryItem.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/ITool.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/PatternStore.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/RefreshableTexture.java (100%) rename src/{api => main}/java/mods/battlegear2/api/heraldry/package-info.java (100%) rename src/{api => main}/java/mods/battlegear2/api/package-info.java (100%) rename src/{api => main}/java/mods/battlegear2/api/quiver/IArrowContainer2.java (100%) rename src/{api => main}/java/mods/battlegear2/api/quiver/IArrowFireHandler.java (100%) rename src/{api => main}/java/mods/battlegear2/api/quiver/IQuiverSelection.java (100%) rename src/{api => main}/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java (100%) rename src/{api => main}/java/mods/battlegear2/api/quiver/package-info.java (100%) rename src/{api => main}/java/mods/battlegear2/api/shield/IArrowCatcher.java (100%) rename src/{api => main}/java/mods/battlegear2/api/shield/IArrowDisplay.java (100%) rename src/{api => main}/java/mods/battlegear2/api/shield/IShield.java (100%) rename src/{api => main}/java/mods/battlegear2/api/shield/ShieldType.java (100%) rename src/{api => main}/java/mods/battlegear2/api/shield/package-info.java (100%) rename src/{api => main}/java/mods/battlegear2/api/weapons/IBackStabbable.java (100%) rename src/{api => main}/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java (100%) rename src/{api => main}/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java (100%) rename src/{api => main}/java/mods/battlegear2/api/weapons/IHitTimeModifier.java (100%) rename src/{api => main}/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java (100%) rename src/{api => main}/java/mods/battlegear2/api/weapons/IPotionEffect.java (100%) rename src/{api => main}/java/mods/battlegear2/api/weapons/ISpecialEffect.java (100%) rename src/{api => main}/java/mods/battlegear2/api/weapons/WeaponRegistry.java (100%) rename src/{api => main}/java/mods/battlegear2/api/weapons/package-info.java (100%) diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockRack.java b/src/main/java/minefantasy/mf2/block/decor/BlockRack.java index fa8e2c27..11b692b5 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockRack.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockRack.java @@ -32,10 +32,7 @@ * code, or methods can be used in your own creations. */ public class BlockRack extends BlockWoodDecor { - - private static final float thickness = 5F / 16F; public static int rack_RI = 115; - private Random rand = new Random(); public BlockRack(String name) { super(name); @@ -300,12 +297,12 @@ public void breakBlock(World world, int x, int y, int z, Block block, int meta) ItemStack var7 = tile.getStackInSlot(var6); if (var7 != null) { - float var8 = this.rand.nextFloat() * 0.8F + 0.1F; - float var9 = this.rand.nextFloat() * 0.8F + 0.1F; - float var10 = this.rand.nextFloat() * 0.8F + 0.1F; + float var8 = world.rand.nextFloat() * 0.8F + 0.1F; + float var9 = world.rand.nextFloat() * 0.8F + 0.1F; + float var10 = world.rand.nextFloat() * 0.8F + 0.1F; while (var7.stackSize > 0) { - int var11 = this.rand.nextInt(21) + 10; + int var11 = world.rand.nextInt(21) + 10; if (var11 > var7.stackSize) { var11 = var7.stackSize; @@ -320,9 +317,9 @@ public void breakBlock(World world, int x, int y, int z, Block block, int meta) } float var13 = 0.05F; - var12.motionX = (float) this.rand.nextGaussian() * var13; - var12.motionY = (float) this.rand.nextGaussian() * var13 + 0.2F; - var12.motionZ = (float) this.rand.nextGaussian() * var13; + var12.motionX = (float) world.rand.nextGaussian() * var13; + var12.motionY = (float) world.rand.nextGaussian() * var13 + 0.2F; + var12.motionZ = (float) world.rand.nextGaussian() * var13; world.spawnEntityInWorld(var12); } } diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java b/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java index bf3aabd3..0a2fa191 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockTrough.java @@ -23,7 +23,6 @@ public class BlockTrough extends BlockWoodDecor { public BlockTrough(String name) { super(name); this.setBlockBounds(0F, 0F, 0F, 1.0F, (7F / 16F), 1.0F); - GameRegistry.registerBlock(this, ItemBlockTrough.class, name); setBlockName(name); this.setHardness(1F); diff --git a/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java b/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java index b3a68d01..052c050d 100644 --- a/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java +++ b/src/main/java/minefantasy/mf2/block/decor/BlockWoodDecor.java @@ -3,6 +3,7 @@ import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.block.tileentity.decor.TileEntityWoodDecor; +import minefantasy.mf2.material.BaseMaterialMF; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -13,15 +14,13 @@ import net.minecraft.world.World; import java.util.ArrayList; -import java.util.Random; public abstract class BlockWoodDecor extends BlockContainer { - private String texname; - private Random rand = new Random(); + private final String texture; - public BlockWoodDecor(String tex) { + public BlockWoodDecor(String texture) { super(Material.wood); - this.texname = tex; + this.texture = texture; } @Override @@ -31,37 +30,11 @@ public BlockWoodDecor(String tex) { public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase user, ItemStack item) { TileEntityWoodDecor tile = getTile(world, x, y, z); if (tile != null) { - onPlaceTile(tile, world, x, y, z, user, item); - } - } - - protected void onPlaceTile(TileEntityWoodDecor tile, World world, int x, int y, int z, EntityLivingBase user, - ItemStack item) { - CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); - if (material != null) { - tile.setMaterial(material); - } - } - - private TileEntityWoodDecor getTile(World world, int x, int y, int z) { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null && tile instanceof TileEntityWoodDecor) { - return (TileEntityWoodDecor) tile; - } - return null; - } - - @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { - ArrayList ret = new ArrayList(); - return ret; - } - - protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { - if (tile != null && item != null) { - CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, tile.getMaterialName()); + CustomMaterial material = CustomToolHelper.getCustomPrimaryMaterial(item); + if (material != null) { + tile.setMaterial(material); + } } - return item; } @Override @@ -74,16 +47,16 @@ public void breakBlock(World world, int x, int y, int z, Block block, int meta) if (tile != null) { if (itemstack != null) { - float f = this.rand.nextFloat() * 0.8F + 0.1F; - float f1 = this.rand.nextFloat() * 0.8F + 0.1F; - float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + float f = world.rand.nextFloat() * 0.8F + 0.1F; + float f1 = world.rand.nextFloat() * 0.8F + 0.1F; + float f2 = world.rand.nextFloat() * 0.8F + 0.1F; EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, itemstack); float f3 = 0.05F; - entityitem.motionX = (float) this.rand.nextGaussian() * f3; - entityitem.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) this.rand.nextGaussian() * f3; + entityitem.motionX = (float) world.rand.nextGaussian() * f3; + entityitem.motionY = (float) world.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) world.rand.nextGaussian() * f3; world.spawnEntityInWorld(entityitem); } @@ -93,8 +66,29 @@ public void breakBlock(World world, int x, int y, int z, Block block, int meta) super.breakBlock(world, x, y, z, block, meta); } + protected ItemStack modifyDrop(TileEntityWoodDecor tile, ItemStack item) { + if (tile != null && item != null) { + CustomMaterial.addMaterial(item, CustomToolHelper.slot_main, tile.getMaterialName()); + } + return item; + } + + private TileEntityWoodDecor getTile(World world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileEntityWoodDecor) { + return (TileEntityWoodDecor) tile; + } + return null; + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList ret = new ArrayList(); + return ret; + } + public String getFullTexName() { - return this.texname; + return this.texture; } public ItemStack construct(String name) { diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java index b2dd5a51..d869da41 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityTrough.java @@ -120,15 +120,6 @@ public void syncData() { NetworkUtils.sendToWatchers(new TroughPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); super.sendPacketToClient(); - - /* - List players = ((WorldServer) worldObj).playerEntities; - for (int i = 0; i < players.size(); i++) { - EntityPlayer player = players.get(i); - ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new TroughPacket(this).generatePacket()); - super.sendPacketToClient(player); - } - */ } } diff --git a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java index 60d040af..9d74f3e1 100644 --- a/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java +++ b/src/main/java/minefantasy/mf2/block/tileentity/decor/TileEntityWoodDecor.java @@ -80,10 +80,4 @@ public String getTexName() { public void sendPacketToClient() { NetworkUtils.sendToWatchers(new WoodDecorPacket(this).generatePacket(), (WorldServer) worldObj, this.xCoord, this.zCoord); } - - /* - public void sendPacketToClient(EntityPlayer player){ - ((WorldServer) worldObj).getEntityTracker().func_151248_b(player, new WoodDecorPacket(this).generatePacket()); - } - */ } diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java index 4ad24809..e6be1a18 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBellows.java @@ -12,7 +12,7 @@ public class RenderBellows implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockBellows)) + if (!(block instanceof BlockBellows)) return; GL11.glPushMatrix(); diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java index 6ee605a1..eeec2c30 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBigFurnace.java @@ -12,7 +12,7 @@ public class RenderBigFurnace implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockBigFurnace)) + if (!(block instanceof BlockBigFurnace)) return; GL11.glPushMatrix(); diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java b/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java index b248d952..ac3221de 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderBloomery.java @@ -12,7 +12,7 @@ public class RenderBloomery implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockBloomery)) + if (!(block instanceof BlockBloomery)) return; GL11.glPushMatrix(); diff --git a/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java b/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java index a6120dfc..aa9fb388 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java +++ b/src/main/java/minefantasy/mf2/client/render/block/RenderTrough.java @@ -13,13 +13,13 @@ public class RenderTrough implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - if (block == null || !(block instanceof BlockTrough)) + if (!(block instanceof BlockTrough)) return; GL11.glPushMatrix(); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); BlockTrough trough = (BlockTrough) block; - invModel.renderInvModel(trough.getFullTexName(), CustomMaterial.getMaterial("refinedWood"), 0F, 0F, 0F, 0F); + invModel.renderInvModel(trough.getFullTexName(), CustomMaterial.getMaterial("refinedWood"), 0F, 0F, 0F); GL11.glPopMatrix(); } diff --git a/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java b/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java index 68c779d2..56c55131 100644 --- a/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java +++ b/src/main/java/minefantasy/mf2/client/render/block/TileEntityTroughRenderer.java @@ -12,7 +12,6 @@ public class TileEntityTroughRenderer extends TileEntitySpecialRenderer { private ModelTrough model; - private Random random = new Random(); public TileEntityTroughRenderer() { model = new ModelTrough(); @@ -83,7 +82,7 @@ public void renderModelAt(TileEntityTrough tile, int meta, double d, double d1, } - public void renderInvModel(String tex, CustomMaterial material, double d, double d1, double d2, float f) { + public void renderInvModel(String tex, CustomMaterial material, double d, double d1, double d2) { int j = 90; GL11.glPushMatrix(); // start @@ -93,7 +92,6 @@ public void renderInvModel(String tex, CustomMaterial material, double d, double GL11.glRotatef(j, 0.0F, 1.0F, 0.0F); // rotate based on metadata GL11.glScalef(scale, -scale, -scale); // if you read this comment out this line and you can see what happens GL11.glPushMatrix(); - float level = 0F; GL11.glColor3f(material.colourRGB[0] / 255F, material.colourRGB[1] / 255F, material.colourRGB[2] / 255F); diff --git a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java index 8df7d58c..ea27a0e5 100644 --- a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java @@ -26,7 +26,7 @@ public class ComponentListMF { public static final String[] ingotMats = new String[]{"copper", "tin", "bronze", "pigiron", "steel", "encrusted", "blacksteelweak", "blacksteel", "silver", "redsteelweak", "redsteel", "bluesteelweak", "bluesteel", - "adamantium", "mithril", "ignotumite", "mithium", "ender", "tungsten", "obsidian",}; + "adamantium", "mithril", "ignotumite", "mithium", "ender", "tungsten", "obsidian"}; public static Item clay_pot = new ItemMFBowl("clay_pot").setStoragePlacement("pot", "pot"); public static Item clay_pot_uncooked = new ItemComponentMF("clay_pot_uncooked", 0); diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java index 0781de2e..c58f77e3 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemSwordMF.java @@ -6,14 +6,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; -import java.util.Random; - /** * @author Anonymous Productions */ public class ItemSwordMF extends ItemWeaponMF { - private Random rand = new Random(); - /** * Swords are the average weapon. They do regular damage and are extremely * effective at parrying balancing both attack and defense diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java index 73f414bc..afa24c8c 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java @@ -2,6 +2,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; @@ -57,16 +58,6 @@ import java.util.Iterator; import java.util.List; import java.util.Random; - -@Optional.InterfaceList(value = { - @Optional.Interface(iface = "mods.battlegear2.api.weapons.IBackStabbable", modid = "battlegear2"), - @Optional.Interface(iface = "mods.battlegear2.api.weapons.IBattlegearWeapon", modid = "battlegear2"), - @Optional.Interface(iface = "mods.battlegear2.api.weapons.IExtendedReachWeapon", modid = "battlegear2"), - @Optional.Interface(iface = "mods.battlegear2.api.weapons.IHitTimeModifier", modid = "battlegear2"), - @Optional.Interface(iface = "mods.battlegear2.api.weapons.IPenetrateWeapon", modid = "battlegear2"), - @Optional.Interface(iface = "mods.battlegear2.api.weapons.WeaponRegistry", modid = "battlegear2") -}) - //Made this extend the sword class (allows them to be enchanted) public abstract class ItemWeaponMF extends ItemSword implements ISpecialDesign, IPowerAttack, IDamageType, IKnockbackWeapon, IWeaponSpeed, IHeldStaminaItem, IStaminaWeapon, IBattlegearWeapon, IToolMaterial, @@ -157,10 +148,12 @@ public ItemWeaponMF(ToolMaterial material, String named, int rarity, float weigh if (material == ToolMaterial.WOOD) { baseDamage = 0F; } - if (isHeavyWeapon()) { - WeaponRegistry.addTwoHanded(new ItemStack(this)); - } else { - WeaponRegistry.addDualWeapon(new ItemStack(this)); + if(Loader.isModLoaded("battlegear2")) { + if (isHeavyWeapon()) { + WeaponRegistry.addTwoHanded(new ItemStack(this)); + } else { + WeaponRegistry.addDualWeapon(new ItemStack(this)); + } } } diff --git a/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java b/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java index 3a6357f8..ccc53f27 100644 --- a/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java +++ b/src/main/java/minefantasy/mf2/mechanics/ExtendedReachMF.java @@ -15,17 +15,8 @@ import java.util.List; -/** - * This class exists because minecraft hunger seems to decrease faster than - * windows stock - */ public class ExtendedReachMF { - // SPRINT JUMPING - // DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for - // 4 missing bars) - // SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for - // 4 missing bars) - // EXHAUSTION SCALE = 3.0F = 1hunger + @SubscribeEvent public void onPlayerTick(TickEvent.PlayerTickEvent event) { if (event.phase == TickEvent.Phase.END) { diff --git a/src/api/java/mods/battlegear2/api/IAllowItem.java b/src/main/java/mods/battlegear2/api/IAllowItem.java similarity index 100% rename from src/api/java/mods/battlegear2/api/IAllowItem.java rename to src/main/java/mods/battlegear2/api/IAllowItem.java diff --git a/src/api/java/mods/battlegear2/api/IDefaultRender.java b/src/main/java/mods/battlegear2/api/IDefaultRender.java similarity index 100% rename from src/api/java/mods/battlegear2/api/IDefaultRender.java rename to src/main/java/mods/battlegear2/api/IDefaultRender.java diff --git a/src/api/java/mods/battlegear2/api/IDyable.java b/src/main/java/mods/battlegear2/api/IDyable.java similarity index 100% rename from src/api/java/mods/battlegear2/api/IDyable.java rename to src/main/java/mods/battlegear2/api/IDyable.java diff --git a/src/api/java/mods/battlegear2/api/IEnchantable.java b/src/main/java/mods/battlegear2/api/IEnchantable.java similarity index 100% rename from src/api/java/mods/battlegear2/api/IEnchantable.java rename to src/main/java/mods/battlegear2/api/IEnchantable.java diff --git a/src/api/java/mods/battlegear2/api/IOffhandDual.java b/src/main/java/mods/battlegear2/api/IOffhandDual.java similarity index 100% rename from src/api/java/mods/battlegear2/api/IOffhandDual.java rename to src/main/java/mods/battlegear2/api/IOffhandDual.java diff --git a/src/api/java/mods/battlegear2/api/ISheathed.java b/src/main/java/mods/battlegear2/api/ISheathed.java similarity index 100% rename from src/api/java/mods/battlegear2/api/ISheathed.java rename to src/main/java/mods/battlegear2/api/ISheathed.java diff --git a/src/api/java/mods/battlegear2/api/PlayerEventChild.java b/src/main/java/mods/battlegear2/api/PlayerEventChild.java similarity index 100% rename from src/api/java/mods/battlegear2/api/PlayerEventChild.java rename to src/main/java/mods/battlegear2/api/PlayerEventChild.java diff --git a/src/api/java/mods/battlegear2/api/RenderItemBarEvent.java b/src/main/java/mods/battlegear2/api/RenderItemBarEvent.java similarity index 100% rename from src/api/java/mods/battlegear2/api/RenderItemBarEvent.java rename to src/main/java/mods/battlegear2/api/RenderItemBarEvent.java diff --git a/src/api/java/mods/battlegear2/api/core/IBattlePlayer.java b/src/main/java/mods/battlegear2/api/core/IBattlePlayer.java similarity index 100% rename from src/api/java/mods/battlegear2/api/core/IBattlePlayer.java rename to src/main/java/mods/battlegear2/api/core/IBattlePlayer.java diff --git a/src/api/java/mods/battlegear2/api/core/IOffhandRender.java b/src/main/java/mods/battlegear2/api/core/IOffhandRender.java similarity index 100% rename from src/api/java/mods/battlegear2/api/core/IOffhandRender.java rename to src/main/java/mods/battlegear2/api/core/IOffhandRender.java diff --git a/src/api/java/mods/battlegear2/api/core/InventoryPlayerBattle.java b/src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java similarity index 100% rename from src/api/java/mods/battlegear2/api/core/InventoryPlayerBattle.java rename to src/main/java/mods/battlegear2/api/core/InventoryPlayerBattle.java diff --git a/src/api/java/mods/battlegear2/api/core/InventorySlotType.java b/src/main/java/mods/battlegear2/api/core/InventorySlotType.java similarity index 100% rename from src/api/java/mods/battlegear2/api/core/InventorySlotType.java rename to src/main/java/mods/battlegear2/api/core/InventorySlotType.java diff --git a/src/api/java/mods/battlegear2/api/core/package-info.java b/src/main/java/mods/battlegear2/api/core/package-info.java similarity index 100% rename from src/api/java/mods/battlegear2/api/core/package-info.java rename to src/main/java/mods/battlegear2/api/core/package-info.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/Crest.java b/src/main/java/mods/battlegear2/api/heraldry/Crest.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/Crest.java rename to src/main/java/mods/battlegear2/api/heraldry/Crest.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/HeraldryData.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/HeraldryData.java rename to src/main/java/mods/battlegear2/api/heraldry/HeraldryData.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java rename to src/main/java/mods/battlegear2/api/heraldry/HeraldryDataBackup.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/HeraldryPattern.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/HeraldryPattern.java rename to src/main/java/mods/battlegear2/api/heraldry/HeraldryPattern.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java b/src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java rename to src/main/java/mods/battlegear2/api/heraldry/HeraldryTextureSmall.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/IFlagHolder.java b/src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/IFlagHolder.java rename to src/main/java/mods/battlegear2/api/heraldry/IFlagHolder.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/IHeraldryItem.java b/src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/IHeraldryItem.java rename to src/main/java/mods/battlegear2/api/heraldry/IHeraldryItem.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java b/src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java rename to src/main/java/mods/battlegear2/api/heraldry/IHeraldyArmour.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/ITool.java b/src/main/java/mods/battlegear2/api/heraldry/ITool.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/ITool.java rename to src/main/java/mods/battlegear2/api/heraldry/ITool.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/PatternStore.java b/src/main/java/mods/battlegear2/api/heraldry/PatternStore.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/PatternStore.java rename to src/main/java/mods/battlegear2/api/heraldry/PatternStore.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/RefreshableTexture.java b/src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/RefreshableTexture.java rename to src/main/java/mods/battlegear2/api/heraldry/RefreshableTexture.java diff --git a/src/api/java/mods/battlegear2/api/heraldry/package-info.java b/src/main/java/mods/battlegear2/api/heraldry/package-info.java similarity index 100% rename from src/api/java/mods/battlegear2/api/heraldry/package-info.java rename to src/main/java/mods/battlegear2/api/heraldry/package-info.java diff --git a/src/api/java/mods/battlegear2/api/package-info.java b/src/main/java/mods/battlegear2/api/package-info.java similarity index 100% rename from src/api/java/mods/battlegear2/api/package-info.java rename to src/main/java/mods/battlegear2/api/package-info.java diff --git a/src/api/java/mods/battlegear2/api/quiver/IArrowContainer2.java b/src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java similarity index 100% rename from src/api/java/mods/battlegear2/api/quiver/IArrowContainer2.java rename to src/main/java/mods/battlegear2/api/quiver/IArrowContainer2.java diff --git a/src/api/java/mods/battlegear2/api/quiver/IArrowFireHandler.java b/src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java similarity index 100% rename from src/api/java/mods/battlegear2/api/quiver/IArrowFireHandler.java rename to src/main/java/mods/battlegear2/api/quiver/IArrowFireHandler.java diff --git a/src/api/java/mods/battlegear2/api/quiver/IQuiverSelection.java b/src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java similarity index 100% rename from src/api/java/mods/battlegear2/api/quiver/IQuiverSelection.java rename to src/main/java/mods/battlegear2/api/quiver/IQuiverSelection.java diff --git a/src/api/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java b/src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java similarity index 100% rename from src/api/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java rename to src/main/java/mods/battlegear2/api/quiver/QuiverArrowRegistry.java diff --git a/src/api/java/mods/battlegear2/api/quiver/package-info.java b/src/main/java/mods/battlegear2/api/quiver/package-info.java similarity index 100% rename from src/api/java/mods/battlegear2/api/quiver/package-info.java rename to src/main/java/mods/battlegear2/api/quiver/package-info.java diff --git a/src/api/java/mods/battlegear2/api/shield/IArrowCatcher.java b/src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java similarity index 100% rename from src/api/java/mods/battlegear2/api/shield/IArrowCatcher.java rename to src/main/java/mods/battlegear2/api/shield/IArrowCatcher.java diff --git a/src/api/java/mods/battlegear2/api/shield/IArrowDisplay.java b/src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java similarity index 100% rename from src/api/java/mods/battlegear2/api/shield/IArrowDisplay.java rename to src/main/java/mods/battlegear2/api/shield/IArrowDisplay.java diff --git a/src/api/java/mods/battlegear2/api/shield/IShield.java b/src/main/java/mods/battlegear2/api/shield/IShield.java similarity index 100% rename from src/api/java/mods/battlegear2/api/shield/IShield.java rename to src/main/java/mods/battlegear2/api/shield/IShield.java diff --git a/src/api/java/mods/battlegear2/api/shield/ShieldType.java b/src/main/java/mods/battlegear2/api/shield/ShieldType.java similarity index 100% rename from src/api/java/mods/battlegear2/api/shield/ShieldType.java rename to src/main/java/mods/battlegear2/api/shield/ShieldType.java diff --git a/src/api/java/mods/battlegear2/api/shield/package-info.java b/src/main/java/mods/battlegear2/api/shield/package-info.java similarity index 100% rename from src/api/java/mods/battlegear2/api/shield/package-info.java rename to src/main/java/mods/battlegear2/api/shield/package-info.java diff --git a/src/api/java/mods/battlegear2/api/weapons/IBackStabbable.java b/src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java similarity index 100% rename from src/api/java/mods/battlegear2/api/weapons/IBackStabbable.java rename to src/main/java/mods/battlegear2/api/weapons/IBackStabbable.java diff --git a/src/api/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java b/src/main/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java similarity index 100% rename from src/api/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java rename to src/main/java/mods/battlegear2/api/weapons/IBattlegearWeapon.java diff --git a/src/api/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java b/src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java similarity index 100% rename from src/api/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java rename to src/main/java/mods/battlegear2/api/weapons/IExtendedReachWeapon.java diff --git a/src/api/java/mods/battlegear2/api/weapons/IHitTimeModifier.java b/src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java similarity index 100% rename from src/api/java/mods/battlegear2/api/weapons/IHitTimeModifier.java rename to src/main/java/mods/battlegear2/api/weapons/IHitTimeModifier.java diff --git a/src/api/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java b/src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java similarity index 100% rename from src/api/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java rename to src/main/java/mods/battlegear2/api/weapons/IPenetrateWeapon.java diff --git a/src/api/java/mods/battlegear2/api/weapons/IPotionEffect.java b/src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java similarity index 100% rename from src/api/java/mods/battlegear2/api/weapons/IPotionEffect.java rename to src/main/java/mods/battlegear2/api/weapons/IPotionEffect.java diff --git a/src/api/java/mods/battlegear2/api/weapons/ISpecialEffect.java b/src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java similarity index 100% rename from src/api/java/mods/battlegear2/api/weapons/ISpecialEffect.java rename to src/main/java/mods/battlegear2/api/weapons/ISpecialEffect.java diff --git a/src/api/java/mods/battlegear2/api/weapons/WeaponRegistry.java b/src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java similarity index 100% rename from src/api/java/mods/battlegear2/api/weapons/WeaponRegistry.java rename to src/main/java/mods/battlegear2/api/weapons/WeaponRegistry.java diff --git a/src/api/java/mods/battlegear2/api/weapons/package-info.java b/src/main/java/mods/battlegear2/api/weapons/package-info.java similarity index 100% rename from src/api/java/mods/battlegear2/api/weapons/package-info.java rename to src/main/java/mods/battlegear2/api/weapons/package-info.java From 0e125fd1786e4479064072f87a82ac044e34ff9f Mon Sep 17 00:00:00 2001 From: Kacpros <39656494+Kacpros@users.noreply.github.com> Date: Thu, 20 Sep 2018 22:43:28 +0200 Subject: [PATCH 101/101] MF2 Edited by Kacpros --- TODO/Dwarvenforged/DwarvenForgedStyle.java | 79 +++++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 50514 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 6 - lib/bukkit-1.7.10.jar | Bin 805710 -> 0 bytes libs/textures/blocks/base/angmallen_block.png | Bin 0 -> 454 bytes libs/textures/blocks/base/angmallen_brick.png | Bin 0 -> 408 bytes .../blocks/base/angmallen_molten_flow.png | Bin 0 -> 7745 bytes .../base/angmallen_molten_flow.png.mcmeta | 5 + .../blocks/base/angmallen_molten_still.png | Bin 0 -> 8148 bytes .../base/angmallen_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/base/bronze_block.png | Bin 0 -> 454 bytes libs/textures/blocks/base/bronze_brick.png | Bin 0 -> 404 bytes .../blocks/base/bronze_molten_flow.png | Bin 0 -> 11480 bytes .../blocks/base/bronze_molten_flow.png.mcmeta | 5 + .../blocks/base/bronze_molten_still.png | Bin 0 -> 12020 bytes .../base/bronze_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/base/copper_block.png | Bin 0 -> 454 bytes libs/textures/blocks/base/copper_brick.png | Bin 0 -> 408 bytes .../blocks/base/copper_molten_flow.png | Bin 0 -> 11063 bytes .../blocks/base/copper_molten_flow.png.mcmeta | 5 + .../blocks/base/copper_molten_still.png | Bin 0 -> 11307 bytes .../base/copper_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/base/copper_ore.png | Bin 0 -> 470 bytes .../blocks/base/copper_ore_overlay.png | Bin 0 -> 210 bytes .../blocks/base/damascus_steel_block.png | Bin 0 -> 454 bytes .../blocks/base/damascus_steel_brick.png | Bin 0 -> 404 bytes .../base/damascus_steel_molten_flow.png | Bin 0 -> 8764 bytes .../damascus_steel_molten_flow.png.mcmeta | 5 + .../base/damascus_steel_molten_still.png | Bin 0 -> 9057 bytes .../damascus_steel_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/base/hepatizon_block.png | Bin 0 -> 454 bytes libs/textures/blocks/base/hepatizon_brick.png | Bin 0 -> 408 bytes .../blocks/base/hepatizon_molten_flow.png | Bin 0 -> 7542 bytes .../base/hepatizon_molten_flow.png.mcmeta | 5 + .../blocks/base/hepatizon_molten_still.png | Bin 0 -> 7134 bytes .../base/hepatizon_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/base/manganese_block.png | Bin 0 -> 454 bytes libs/textures/blocks/base/manganese_brick.png | Bin 0 -> 408 bytes .../blocks/base/manganese_molten_flow.png | Bin 0 -> 5666 bytes .../base/manganese_molten_flow.png.mcmeta | 5 + .../blocks/base/manganese_molten_still.png | Bin 0 -> 5142 bytes .../base/manganese_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/base/manganese_ore.png | Bin 0 -> 489 bytes .../blocks/base/manganese_ore_overlay.png | Bin 0 -> 207 bytes libs/textures/blocks/base/steel_block.png | Bin 0 -> 454 bytes libs/textures/blocks/base/steel_brick.png | Bin 0 -> 408 bytes .../blocks/base/steel_molten_flow.png | Bin 0 -> 9680 bytes .../blocks/base/steel_molten_flow.png.mcmeta | 5 + .../blocks/base/steel_molten_still.png | Bin 0 -> 9208 bytes .../blocks/base/steel_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/base/tin_block.png | Bin 0 -> 454 bytes libs/textures/blocks/base/tin_brick.png | Bin 0 -> 408 bytes libs/textures/blocks/base/tin_molten_flow.png | Bin 0 -> 9548 bytes .../blocks/base/tin_molten_flow.png.mcmeta | 5 + .../textures/blocks/base/tin_molten_still.png | Bin 0 -> 9260 bytes .../blocks/base/tin_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/base/tin_ore.png | Bin 0 -> 491 bytes libs/textures/blocks/base/tin_ore_overlay.png | Bin 0 -> 210 bytes .../blocks/ender/desichalkos_block.png | Bin 0 -> 454 bytes .../blocks/ender/desichalkos_brick.png | Bin 0 -> 404 bytes .../blocks/ender/desichalkos_molten_flow.png | Bin 0 -> 8386 bytes .../ender/desichalkos_molten_flow.png.mcmeta | 5 + .../blocks/ender/desichalkos_molten_still.png | Bin 0 -> 8533 bytes .../ender/desichalkos_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/ender/eximite_block.png | Bin 0 -> 454 bytes libs/textures/blocks/ender/eximite_brick.png | Bin 0 -> 404 bytes .../blocks/ender/eximite_molten_flow.png | Bin 0 -> 8411 bytes .../ender/eximite_molten_flow.png.mcmeta | 5 + .../blocks/ender/eximite_molten_still.png | Bin 0 -> 8565 bytes .../ender/eximite_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/ender/eximite_ore.png | Bin 0 -> 573 bytes libs/textures/blocks/ender/meutoite_block.png | Bin 0 -> 454 bytes libs/textures/blocks/ender/meutoite_brick.png | Bin 0 -> 404 bytes .../blocks/ender/meutoite_molten_flow.png | Bin 0 -> 7836 bytes .../ender/meutoite_molten_flow.png.mcmeta | 5 + .../blocks/ender/meutoite_molten_still.png | Bin 0 -> 8037 bytes .../ender/meutoite_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/ender/meutoite_ore.png | Bin 0 -> 593 bytes .../blocks/fantasy/adamantine_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/adamantine_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/adamantine_molten_flow.png | Bin 0 -> 8209 bytes .../fantasy/adamantine_molten_flow.png.mcmeta | 5 + .../fantasy/adamantine_molten_still.png | Bin 0 -> 8253 bytes .../adamantine_molten_still.png.mcmeta | 45 ++++++ .../blocks/fantasy/adamantine_ore.png | Bin 0 -> 502 bytes .../blocks/fantasy/adamantine_ore_overlay.png | Bin 0 -> 247 bytes .../blocks/fantasy/astral_silver_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/astral_silver_brick.png | Bin 0 -> 404 bytes .../fantasy/astral_silver_molten_flow.png | Bin 0 -> 8507 bytes .../astral_silver_molten_flow.png.mcmeta | 5 + .../fantasy/astral_silver_molten_still.png | Bin 0 -> 8455 bytes .../astral_silver_molten_still.png.mcmeta | 45 ++++++ .../blocks/fantasy/astral_silver_ore.png | Bin 0 -> 504 bytes .../fantasy/astral_silver_ore_overlay.png | Bin 0 -> 248 bytes .../textures/blocks/fantasy/atlarus_block.png | Bin 0 -> 454 bytes .../textures/blocks/fantasy/atlarus_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/atlarus_molten_flow.png | Bin 0 -> 8201 bytes .../fantasy/atlarus_molten_flow.png.mcmeta | 5 + .../blocks/fantasy/atlarus_molten_still.png | Bin 0 -> 8339 bytes .../fantasy/atlarus_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/fantasy/atlarus_ore.png | Bin 0 -> 504 bytes .../blocks/fantasy/atlarus_ore_overlay.png | Bin 0 -> 249 bytes .../blocks/fantasy/black_steel_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/black_steel_brick.png | Bin 0 -> 404 bytes .../fantasy/black_steel_molten_flow.png | Bin 0 -> 8928 bytes .../black_steel_molten_flow.png.mcmeta | 5 + .../fantasy/black_steel_molten_still.png | Bin 0 -> 9176 bytes .../black_steel_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/fantasy/carmot_block.png | Bin 0 -> 454 bytes libs/textures/blocks/fantasy/carmot_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/carmot_molten_flow.png | Bin 0 -> 8906 bytes .../fantasy/carmot_molten_flow.png.mcmeta | 5 + .../blocks/fantasy/carmot_molten_still.png | Bin 0 -> 9143 bytes .../fantasy/carmot_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/fantasy/carmot_ore.png | Bin 0 -> 504 bytes .../blocks/fantasy/carmot_ore_overlay.png | Bin 0 -> 248 bytes .../blocks/fantasy/celenegil_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/celenegil_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/celenegil_molten_flow.png | Bin 0 -> 8847 bytes .../fantasy/celenegil_molten_flow.png.mcmeta | 5 + .../blocks/fantasy/celenegil_molten_still.png | Bin 0 -> 9127 bytes .../fantasy/celenegil_molten_still.png.mcmeta | 45 ++++++ .../blocks/fantasy/deep_iron_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/deep_iron_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/deep_iron_molten_flow.png | Bin 0 -> 8133 bytes .../fantasy/deep_iron_molten_flow.png.mcmeta | 5 + .../blocks/fantasy/deep_iron_molten_still.png | Bin 0 -> 8304 bytes .../fantasy/deep_iron_molten_still.png.mcmeta | 45 ++++++ .../textures/blocks/fantasy/deep_iron_ore.png | Bin 0 -> 505 bytes .../blocks/fantasy/deep_iron_ore_overlay.png | Bin 0 -> 247 bytes .../blocks/fantasy/haderoth_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/haderoth_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/haderoth_molten_flow.png | Bin 0 -> 8089 bytes .../fantasy/haderoth_molten_flow.png.mcmeta | 5 + .../blocks/fantasy/haderoth_molten_still.png | Bin 0 -> 8132 bytes .../fantasy/haderoth_molten_still.png.mcmeta | 45 ++++++ .../blocks/fantasy/infuscolium_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/infuscolium_brick.png | Bin 0 -> 404 bytes .../fantasy/infuscolium_molten_flow.png | Bin 0 -> 9088 bytes .../infuscolium_molten_flow.png.mcmeta | 5 + .../fantasy/infuscolium_molten_still.png | Bin 0 -> 9292 bytes .../infuscolium_molten_still.png.mcmeta | 45 ++++++ .../blocks/fantasy/infuscolium_ore.png | Bin 0 -> 504 bytes .../fantasy/infuscolium_ore_overlay.png | Bin 0 -> 247 bytes .../textures/blocks/fantasy/mithril_block.png | Bin 0 -> 454 bytes .../textures/blocks/fantasy/mithril_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/mithril_molten_flow.png | Bin 0 -> 9527 bytes .../fantasy/mithril_molten_flow.png.mcmeta | 5 + .../blocks/fantasy/mithril_molten_still.png | Bin 0 -> 9793 bytes .../fantasy/mithril_molten_still.png.mcmeta | 45 ++++++ .../blocks/fantasy/mithril_ore_overlay.png | Bin 0 -> 252 bytes .../blocks/fantasy/orichalcum_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/orichalcum_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/orichalcum_molten_flow.png | Bin 0 -> 9084 bytes .../fantasy/orichalcum_molten_flow.png.mcmeta | 5 + .../fantasy/orichalcum_molten_still.png | Bin 0 -> 9317 bytes .../orichalcum_molten_still.png.mcmeta | 45 ++++++ .../blocks/fantasy/orichalcum_ore.png | Bin 0 -> 504 bytes .../blocks/fantasy/orichalcum_ore_overlay.png | Bin 0 -> 248 bytes .../blocks/fantasy/oureclase_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/oureclase_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/oureclase_molten_flow.png | Bin 0 -> 8035 bytes .../fantasy/oureclase_molten_flow.png.mcmeta | 5 + .../blocks/fantasy/oureclase_molten_still.png | Bin 0 -> 8044 bytes .../fantasy/oureclase_molten_still.png.mcmeta | 45 ++++++ .../textures/blocks/fantasy/oureclase_ore.png | Bin 0 -> 505 bytes .../blocks/fantasy/oureclase_ore_overlay.png | Bin 0 -> 247 bytes .../blocks/fantasy/prometheum_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/prometheum_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/prometheum_molten_flow.png | Bin 0 -> 7341 bytes .../fantasy/prometheum_molten_flow.png.mcmeta | 5 + .../fantasy/prometheum_molten_still.png | Bin 0 -> 7330 bytes .../prometheum_molten_still.png.mcmeta | 45 ++++++ .../blocks/fantasy/prometheum_ore.png | Bin 0 -> 483 bytes .../blocks/fantasy/prometheum_ore_overlay.png | Bin 0 -> 248 bytes .../blocks/fantasy/quicksilver_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/quicksilver_brick.png | Bin 0 -> 404 bytes .../fantasy/quicksilver_molten_flow.png | Bin 0 -> 9276 bytes .../quicksilver_molten_flow.png.mcmeta | 5 + .../fantasy/quicksilver_molten_still.png | Bin 0 -> 9657 bytes .../quicksilver_molten_still.png.mcmeta | 45 ++++++ .../blocks/fantasy/rubracium_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/rubracium_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/rubracium_molten_flow.png | Bin 0 -> 7970 bytes .../fantasy/rubracium_molten_flow.png.mcmeta | 5 + .../blocks/fantasy/rubracium_molten_still.png | Bin 0 -> 7876 bytes .../fantasy/rubracium_molten_still.png.mcmeta | 45 ++++++ .../textures/blocks/fantasy/rubracium_ore.png | Bin 0 -> 505 bytes .../blocks/fantasy/rubracium_ore_overlay.png | Bin 0 -> 248 bytes .../blocks/fantasy/tartarite_block.png | Bin 0 -> 454 bytes .../blocks/fantasy/tartarite_brick.png | Bin 0 -> 404 bytes .../blocks/fantasy/tartarite_molten_flow.png | Bin 0 -> 9413 bytes .../fantasy/tartarite_molten_flow.png.mcmeta | 5 + .../blocks/fantasy/tartarite_molten_still.png | Bin 0 -> 9791 bytes .../fantasy/tartarite_molten_still.png.mcmeta | 45 ++++++ .../blocks/machines/alloyer_bottom.png | Bin 0 -> 2898 bytes .../blocks/machines/alloyer_front.png | Bin 0 -> 2955 bytes .../textures/blocks/machines/alloyer_side.png | Bin 0 -> 2935 bytes libs/textures/blocks/machines/alloyer_top.png | Bin 0 -> 2908 bytes .../blocks/machines/crusher_front.png | Bin 0 -> 2954 bytes .../blocks/machines/foundry_bottom.png | Bin 0 -> 2859 bytes .../blocks/machines/foundry_front.png | Bin 0 -> 2950 bytes .../textures/blocks/machines/foundry_side.png | Bin 0 -> 2921 bytes libs/textures/blocks/machines/foundry_top.png | Bin 0 -> 2891 bytes .../blocks/machines/mframe_bottom.png | Bin 0 -> 2897 bytes libs/textures/blocks/machines/mframe_side.png | Bin 0 -> 2960 bytes libs/textures/blocks/machines/mframe_top.png | Bin 0 -> 2927 bytes .../blocks/machines/smelter_bottom.png | Bin 0 -> 2874 bytes .../blocks/machines/smelter_front.png | Bin 0 -> 2947 bytes .../textures/blocks/machines/smelter_side.png | Bin 0 -> 2913 bytes .../machines/smelter_side_connected.png | Bin 0 -> 2981 bytes libs/textures/blocks/machines/smelter_top.png | Bin 0 -> 2921 bytes libs/textures/blocks/metal_block_default.png | Bin 0 -> 223 bytes libs/textures/blocks/misc/charcoal_block.png | Bin 0 -> 857 bytes libs/textures/blocks/misc/de_tnt_bottom.png | Bin 0 -> 196 bytes libs/textures/blocks/misc/de_tnt_side.png | Bin 0 -> 321 bytes libs/textures/blocks/misc/de_tnt_top.png | Bin 0 -> 504 bytes libs/textures/blocks/misc/he_tnt_bottom.png | Bin 0 -> 195 bytes libs/textures/blocks/misc/he_tnt_side.png | Bin 0 -> 302 bytes libs/textures/blocks/misc/he_tnt_top.png | Bin 0 -> 485 bytes libs/textures/blocks/misc/le_tnt_bottom.png | Bin 0 -> 203 bytes libs/textures/blocks/misc/le_tnt_side.png | Bin 0 -> 325 bytes libs/textures/blocks/misc/le_tnt_top.png | Bin 0 -> 506 bytes libs/textures/blocks/misc/m_tnt_bottom.png | Bin 0 -> 197 bytes libs/textures/blocks/misc/m_tnt_side.png | Bin 0 -> 303 bytes libs/textures/blocks/misc/m_tnt_top.png | Bin 0 -> 506 bytes libs/textures/blocks/misc/pe_tnt_bottom.png | Bin 0 -> 198 bytes libs/textures/blocks/misc/pe_tnt_side.png | Bin 0 -> 298 bytes libs/textures/blocks/misc/pe_tnt_top.png | Bin 0 -> 503 bytes .../blocks/nether/alduorite_block.png | Bin 0 -> 454 bytes .../blocks/nether/alduorite_brick.png | Bin 0 -> 404 bytes .../blocks/nether/alduorite_molten_flow.png | Bin 0 -> 8796 bytes .../nether/alduorite_molten_flow.png.mcmeta | 5 + .../blocks/nether/alduorite_molten_still.png | Bin 0 -> 8978 bytes .../nether/alduorite_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/nether/alduorite_ore.png | Bin 0 -> 868 bytes .../blocks/nether/amordrine_block.png | Bin 0 -> 454 bytes .../blocks/nether/amordrine_brick.png | Bin 0 -> 404 bytes .../blocks/nether/amordrine_molten_flow.png | Bin 0 -> 8513 bytes .../nether/amordrine_molten_flow.png.mcmeta | 5 + .../blocks/nether/amordrine_molten_still.png | Bin 0 -> 8535 bytes .../nether/amordrine_molten_still.png.mcmeta | 45 ++++++ .../blocks/nether/ceruclase_block.png | Bin 0 -> 454 bytes .../blocks/nether/ceruclase_brick.png | Bin 0 -> 404 bytes .../blocks/nether/ceruclase_molten_flow.png | Bin 0 -> 8488 bytes .../nether/ceruclase_molten_flow.png.mcmeta | 5 + .../blocks/nether/ceruclase_molten_still.png | Bin 0 -> 8809 bytes .../nether/ceruclase_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/nether/ceruclase_ore.png | Bin 0 -> 878 bytes .../textures/blocks/nether/ignatius_block.png | Bin 0 -> 454 bytes .../textures/blocks/nether/ignatius_brick.png | Bin 0 -> 404 bytes .../blocks/nether/ignatius_molten_flow.png | Bin 0 -> 8102 bytes .../nether/ignatius_molten_flow.png.mcmeta | 5 + .../blocks/nether/ignatius_molten_still.png | Bin 0 -> 8645 bytes .../nether/ignatius_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/nether/ignatius_ore.png | Bin 0 -> 860 bytes .../blocks/nether/inolashite_block.png | Bin 0 -> 454 bytes .../blocks/nether/inolashite_brick.png | Bin 0 -> 404 bytes .../blocks/nether/inolashite_molten_flow.png | Bin 0 -> 8766 bytes .../nether/inolashite_molten_flow.png.mcmeta | 5 + .../blocks/nether/inolashite_molten_still.png | Bin 0 -> 8989 bytes .../nether/inolashite_molten_still.png.mcmeta | 45 ++++++ .../blocks/nether/kalendrite_block.png | Bin 0 -> 454 bytes .../blocks/nether/kalendrite_brick.png | Bin 0 -> 404 bytes .../blocks/nether/kalendrite_molten_flow.png | Bin 0 -> 8364 bytes .../nether/kalendrite_molten_flow.png.mcmeta | 5 + .../blocks/nether/kalendrite_molten_still.png | Bin 0 -> 8724 bytes .../nether/kalendrite_molten_still.png.mcmeta | 45 ++++++ .../textures/blocks/nether/kalendrite_ore.png | Bin 0 -> 878 bytes .../textures/blocks/nether/lemurite_block.png | Bin 0 -> 454 bytes .../textures/blocks/nether/lemurite_brick.png | Bin 0 -> 404 bytes .../blocks/nether/lemurite_molten_flow.png | Bin 0 -> 6295 bytes .../nether/lemurite_molten_flow.png.mcmeta | 5 + .../blocks/nether/lemurite_molten_still.png | Bin 0 -> 5803 bytes .../nether/lemurite_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/nether/lemurite_ore.png | Bin 0 -> 878 bytes .../textures/blocks/nether/midasium_block.png | Bin 0 -> 454 bytes .../textures/blocks/nether/midasium_brick.png | Bin 0 -> 404 bytes .../blocks/nether/midasium_molten_flow.png | Bin 0 -> 8987 bytes .../nether/midasium_molten_flow.png.mcmeta | 5 + .../blocks/nether/midasium_molten_still.png | Bin 0 -> 9167 bytes .../nether/midasium_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/nether/midasium_ore.png | Bin 0 -> 882 bytes .../blocks/nether/sanguinite_block.png | Bin 0 -> 454 bytes .../blocks/nether/sanguinite_brick.png | Bin 0 -> 404 bytes .../blocks/nether/sanguinite_molten_flow.png | Bin 0 -> 6844 bytes .../nether/sanguinite_molten_flow.png.mcmeta | 5 + .../blocks/nether/sanguinite_molten_still.png | Bin 0 -> 6517 bytes .../nether/sanguinite_molten_still.png.mcmeta | 45 ++++++ .../textures/blocks/nether/sanguinite_ore.png | Bin 0 -> 877 bytes .../blocks/nether/shadow_iron_block.png | Bin 0 -> 454 bytes .../blocks/nether/shadow_iron_brick.png | Bin 0 -> 404 bytes .../blocks/nether/shadow_iron_molten_flow.png | Bin 0 -> 7648 bytes .../nether/shadow_iron_molten_flow.png.mcmeta | 5 + .../nether/shadow_iron_molten_still.png | Bin 0 -> 7716 bytes .../shadow_iron_molten_still.png.mcmeta | 45 ++++++ .../blocks/nether/shadow_iron_ore.png | Bin 0 -> 873 bytes .../blocks/nether/shadow_steel_block.png | Bin 0 -> 454 bytes .../blocks/nether/shadow_steel_brick.png | Bin 0 -> 404 bytes .../nether/shadow_steel_molten_flow.png | Bin 0 -> 8954 bytes .../shadow_steel_molten_flow.png.mcmeta | 5 + .../nether/shadow_steel_molten_still.png | Bin 0 -> 9268 bytes .../shadow_steel_molten_still.png.mcmeta | 45 ++++++ .../blocks/nether/vulcanite_block.png | Bin 0 -> 454 bytes .../blocks/nether/vulcanite_brick.png | Bin 0 -> 404 bytes .../blocks/nether/vulcanite_molten_flow.png | Bin 0 -> 8624 bytes .../nether/vulcanite_molten_flow.png.mcmeta | 5 + .../blocks/nether/vulcanite_molten_still.png | Bin 0 -> 8741 bytes .../nether/vulcanite_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/nether/vulcanite_ore.png | Bin 0 -> 878 bytes .../blocks/nether/vyroxeres_block.png | Bin 0 -> 454 bytes .../blocks/nether/vyroxeres_brick.png | Bin 0 -> 404 bytes .../blocks/nether/vyroxeres_molten_flow.png | Bin 0 -> 8527 bytes .../nether/vyroxeres_molten_flow.png.mcmeta | 5 + .../blocks/nether/vyroxeres_molten_still.png | Bin 0 -> 8573 bytes .../nether/vyroxeres_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/nether/vyroxeres_ore.png | Bin 0 -> 878 bytes libs/textures/blocks/precious/brass_block.png | Bin 0 -> 454 bytes libs/textures/blocks/precious/brass_brick.png | Bin 0 -> 404 bytes .../blocks/precious/brass_molten_flow.png | Bin 0 -> 9348 bytes .../precious/brass_molten_flow.png.mcmeta | 5 + .../blocks/precious/brass_molten_still.png | Bin 0 -> 9614 bytes .../precious/brass_molten_still.png.mcmeta | 45 ++++++ .../blocks/precious/electrum_block.png | Bin 0 -> 454 bytes .../blocks/precious/electrum_brick.png | Bin 0 -> 404 bytes .../blocks/precious/electrum_molten_flow.png | Bin 0 -> 11410 bytes .../precious/electrum_molten_flow.png.mcmeta | 5 + .../blocks/precious/electrum_molten_still.png | Bin 0 -> 11773 bytes .../precious/electrum_molten_still.png.mcmeta | 45 ++++++ .../blocks/precious/platinum_block.png | Bin 0 -> 454 bytes .../blocks/precious/platinum_brick.png | Bin 0 -> 404 bytes .../blocks/precious/platinum_molten_flow.png | Bin 0 -> 9475 bytes .../precious/platinum_molten_flow.png.mcmeta | 5 + .../blocks/precious/platinum_molten_still.png | Bin 0 -> 9830 bytes .../precious/platinum_molten_still.png.mcmeta | 45 ++++++ .../textures/blocks/precious/platinum_ore.png | Bin 0 -> 493 bytes .../blocks/precious/platinum_ore_overlay.png | Bin 0 -> 223 bytes .../textures/blocks/precious/silver_block.png | Bin 0 -> 454 bytes .../textures/blocks/precious/silver_brick.png | Bin 0 -> 404 bytes .../blocks/precious/silver_molten_flow.png | Bin 0 -> 9570 bytes .../precious/silver_molten_flow.png.mcmeta | 5 + .../blocks/precious/silver_molten_still.png | Bin 0 -> 9301 bytes .../precious/silver_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/precious/silver_ore.png | Bin 0 -> 481 bytes .../blocks/precious/silver_ore_overlay.png | Bin 0 -> 210 bytes libs/textures/blocks/precious/zinc_block.png | Bin 0 -> 454 bytes libs/textures/blocks/precious/zinc_brick.png | Bin 0 -> 412 bytes .../blocks/precious/zinc_molten_flow.png | Bin 0 -> 8649 bytes .../precious/zinc_molten_flow.png.mcmeta | 5 + .../blocks/precious/zinc_molten_still.png | Bin 0 -> 8974 bytes .../precious/zinc_molten_still.png.mcmeta | 45 ++++++ libs/textures/blocks/precious/zinc_ore.png | Bin 0 -> 472 bytes .../blocks/precious/zinc_ore_overlay.png | Bin 0 -> 227 bytes .../textures/blocks/utility/bitumen_block.png | Bin 0 -> 656 bytes libs/textures/blocks/utility/bitumen_ore.png | Bin 0 -> 484 bytes .../blocks/utility/bitumen_ore_overlay.png | Bin 0 -> 216 bytes .../blocks/utility/magnesium_block.png | Bin 0 -> 768 bytes .../textures/blocks/utility/magnesium_ore.png | Bin 0 -> 491 bytes .../blocks/utility/magnesium_ore_overlay.png | Bin 0 -> 231 bytes .../blocks/utility/phosphorite_block.png | Bin 0 -> 716 bytes .../blocks/utility/phosphorite_ore.png | Bin 0 -> 474 bytes .../utility/phosphorite_ore_overlay.png | Bin 0 -> 239 bytes libs/textures/blocks/utility/potash_block.png | Bin 0 -> 756 bytes libs/textures/blocks/utility/potash_ore.png | Bin 0 -> 486 bytes .../blocks/utility/potash_ore_overlay.png | Bin 0 -> 216 bytes .../blocks/utility/saltpeter_block.png | Bin 0 -> 474 bytes .../textures/blocks/utility/saltpeter_ore.png | Bin 0 -> 484 bytes .../blocks/utility/saltpeter_ore_overlay.png | Bin 0 -> 216 bytes libs/textures/blocks/utility/sulfur_block.png | Bin 0 -> 701 bytes libs/textures/blocks/utility/sulfur_ore.png | Bin 0 -> 488 bytes .../blocks/utility/sulfur_ore_overlay.png | Bin 0 -> 229 bytes libs/textures/blocks/vanilla/gold_brick.png | Bin 0 -> 235 bytes libs/textures/blocks/vanilla/iron_brick.png | Bin 0 -> 234 bytes libs/textures/gui/alloyer.png | Bin 0 -> 2056 bytes libs/textures/gui/crusher-minium.png | Bin 0 -> 2095 bytes libs/textures/gui/crusher.png | Bin 0 -> 2158 bytes libs/textures/gui/drawer.png | Bin 0 -> 1893 bytes libs/textures/gui/forge.png | Bin 0 -> 1775 bytes libs/textures/gui/nei_alloyer.png | Bin 0 -> 1971 bytes libs/textures/gui/nei_crusher.png | Bin 0 -> 1926 bytes libs/textures/items/base/angmallen_axe.png | Bin 0 -> 475 bytes libs/textures/items/base/angmallen_boots.png | Bin 0 -> 440 bytes .../items/base/angmallen_bucket_fill.png | Bin 0 -> 259 bytes libs/textures/items/base/angmallen_chest.png | Bin 0 -> 459 bytes libs/textures/items/base/angmallen_dust.png | Bin 0 -> 443 bytes libs/textures/items/base/angmallen_helmet.png | Bin 0 -> 454 bytes libs/textures/items/base/angmallen_hoe.png | Bin 0 -> 455 bytes libs/textures/items/base/angmallen_ingot.png | Bin 0 -> 461 bytes libs/textures/items/base/angmallen_legs.png | Bin 0 -> 454 bytes libs/textures/items/base/angmallen_pick.png | Bin 0 -> 469 bytes libs/textures/items/base/angmallen_shovel.png | Bin 0 -> 452 bytes libs/textures/items/base/angmallen_sword.png | Bin 0 -> 463 bytes libs/textures/items/base/bronze_axe.png | Bin 0 -> 462 bytes libs/textures/items/base/bronze_boots.png | Bin 0 -> 430 bytes .../items/base/bronze_bucket_fill.png | Bin 0 -> 281 bytes libs/textures/items/base/bronze_chest.png | Bin 0 -> 462 bytes libs/textures/items/base/bronze_dust.png | Bin 0 -> 443 bytes libs/textures/items/base/bronze_helmet.png | Bin 0 -> 442 bytes libs/textures/items/base/bronze_hoe.png | Bin 0 -> 450 bytes libs/textures/items/base/bronze_ingot.png | Bin 0 -> 461 bytes libs/textures/items/base/bronze_legs.png | Bin 0 -> 436 bytes libs/textures/items/base/bronze_pick.png | Bin 0 -> 467 bytes libs/textures/items/base/bronze_shovel.png | Bin 0 -> 448 bytes libs/textures/items/base/bronze_sword.png | Bin 0 -> 446 bytes libs/textures/items/base/copper_axe.png | Bin 0 -> 454 bytes libs/textures/items/base/copper_boots.png | Bin 0 -> 431 bytes .../items/base/copper_bucket_fill.png | Bin 0 -> 267 bytes libs/textures/items/base/copper_chest.png | Bin 0 -> 440 bytes libs/textures/items/base/copper_dust.png | Bin 0 -> 443 bytes libs/textures/items/base/copper_helmet.png | Bin 0 -> 434 bytes libs/textures/items/base/copper_hoe.png | Bin 0 -> 439 bytes libs/textures/items/base/copper_ingot.png | Bin 0 -> 461 bytes libs/textures/items/base/copper_legs.png | Bin 0 -> 448 bytes libs/textures/items/base/copper_pick.png | Bin 0 -> 457 bytes libs/textures/items/base/copper_shovel.png | Bin 0 -> 445 bytes libs/textures/items/base/copper_sword.png | Bin 0 -> 432 bytes .../items/base/damascus_steel_axe.png | Bin 0 -> 472 bytes .../items/base/damascus_steel_boots.png | Bin 0 -> 444 bytes .../items/base/damascus_steel_bucket_fill.png | Bin 0 -> 221 bytes .../items/base/damascus_steel_chest.png | Bin 0 -> 460 bytes .../items/base/damascus_steel_dust.png | Bin 0 -> 447 bytes .../items/base/damascus_steel_helmet.png | Bin 0 -> 448 bytes .../items/base/damascus_steel_hoe.png | Bin 0 -> 451 bytes .../items/base/damascus_steel_ingot.png | Bin 0 -> 461 bytes .../items/base/damascus_steel_legs.png | Bin 0 -> 445 bytes .../items/base/damascus_steel_pick.png | Bin 0 -> 467 bytes .../items/base/damascus_steel_shovel.png | Bin 0 -> 453 bytes .../items/base/damascus_steel_sword.png | Bin 0 -> 455 bytes libs/textures/items/base/hepatizon_axe.png | Bin 0 -> 473 bytes libs/textures/items/base/hepatizon_boots.png | Bin 0 -> 449 bytes .../items/base/hepatizon_bucket_fill.png | Bin 0 -> 221 bytes libs/textures/items/base/hepatizon_chest.png | Bin 0 -> 473 bytes libs/textures/items/base/hepatizon_dust.png | Bin 0 -> 447 bytes libs/textures/items/base/hepatizon_helmet.png | Bin 0 -> 444 bytes libs/textures/items/base/hepatizon_hoe.png | Bin 0 -> 457 bytes libs/textures/items/base/hepatizon_ingot.png | Bin 0 -> 461 bytes libs/textures/items/base/hepatizon_legs.png | Bin 0 -> 462 bytes libs/textures/items/base/hepatizon_pick.png | Bin 0 -> 466 bytes libs/textures/items/base/hepatizon_shovel.png | Bin 0 -> 457 bytes libs/textures/items/base/hepatizon_sword.png | Bin 0 -> 452 bytes .../items/base/manganese_bucket_fill.png | Bin 0 -> 222 bytes libs/textures/items/base/manganese_dust.png | Bin 0 -> 443 bytes libs/textures/items/base/manganese_ingot.png | Bin 0 -> 452 bytes libs/textures/items/base/steel_axe.png | Bin 0 -> 483 bytes libs/textures/items/base/steel_boots.png | Bin 0 -> 450 bytes .../textures/items/base/steel_bucket_fill.png | Bin 0 -> 269 bytes libs/textures/items/base/steel_chest.png | Bin 0 -> 472 bytes libs/textures/items/base/steel_dust.png | Bin 0 -> 447 bytes libs/textures/items/base/steel_helmet.png | Bin 0 -> 453 bytes libs/textures/items/base/steel_hoe.png | Bin 0 -> 480 bytes libs/textures/items/base/steel_ingot.png | Bin 0 -> 461 bytes libs/textures/items/base/steel_legs.png | Bin 0 -> 469 bytes libs/textures/items/base/steel_pick.png | Bin 0 -> 479 bytes libs/textures/items/base/steel_shovel.png | Bin 0 -> 469 bytes libs/textures/items/base/steel_sword.png | Bin 0 -> 460 bytes libs/textures/items/base/tin_bucket_fill.png | Bin 0 -> 267 bytes libs/textures/items/base/tin_dust.png | Bin 0 -> 443 bytes libs/textures/items/base/tin_ingot.png | Bin 0 -> 461 bytes libs/textures/items/ender/desichalkos_axe.png | Bin 0 -> 489 bytes .../items/ender/desichalkos_boots.png | Bin 0 -> 462 bytes .../items/ender/desichalkos_bucket_fill.png | Bin 0 -> 221 bytes .../items/ender/desichalkos_chest.png | Bin 0 -> 485 bytes .../textures/items/ender/desichalkos_dust.png | Bin 0 -> 447 bytes .../items/ender/desichalkos_helmet.png | Bin 0 -> 478 bytes libs/textures/items/ender/desichalkos_hoe.png | Bin 0 -> 478 bytes .../items/ender/desichalkos_ingot.png | Bin 0 -> 461 bytes .../textures/items/ender/desichalkos_legs.png | Bin 0 -> 459 bytes .../textures/items/ender/desichalkos_pick.png | Bin 0 -> 482 bytes .../items/ender/desichalkos_shovel.png | Bin 0 -> 478 bytes .../items/ender/desichalkos_sword.png | Bin 0 -> 476 bytes libs/textures/items/ender/eximite_axe.png | Bin 0 -> 484 bytes libs/textures/items/ender/eximite_boots.png | Bin 0 -> 459 bytes .../items/ender/eximite_bucket_fill.png | Bin 0 -> 259 bytes libs/textures/items/ender/eximite_chest.png | Bin 0 -> 479 bytes libs/textures/items/ender/eximite_dust.png | Bin 0 -> 447 bytes libs/textures/items/ender/eximite_helmet.png | Bin 0 -> 464 bytes libs/textures/items/ender/eximite_hoe.png | Bin 0 -> 473 bytes libs/textures/items/ender/eximite_ingot.png | Bin 0 -> 461 bytes libs/textures/items/ender/eximite_legs.png | Bin 0 -> 468 bytes libs/textures/items/ender/eximite_pick.png | Bin 0 -> 478 bytes libs/textures/items/ender/eximite_shovel.png | Bin 0 -> 471 bytes libs/textures/items/ender/eximite_sword.png | Bin 0 -> 476 bytes .../items/ender/meutoite_bucket_fill.png | Bin 0 -> 221 bytes libs/textures/items/ender/meutoite_dust.png | Bin 0 -> 447 bytes libs/textures/items/ender/meutoite_ingot.png | Bin 0 -> 461 bytes .../textures/items/fantasy/adamantine_axe.png | Bin 0 -> 479 bytes .../items/fantasy/adamantine_boots.png | Bin 0 -> 464 bytes .../items/fantasy/adamantine_bucket_fill.png | Bin 0 -> 259 bytes .../items/fantasy/adamantine_chest.png | Bin 0 -> 483 bytes .../items/fantasy/adamantine_dust.png | Bin 0 -> 447 bytes .../items/fantasy/adamantine_helmet.png | Bin 0 -> 459 bytes .../textures/items/fantasy/adamantine_hoe.png | Bin 0 -> 484 bytes .../items/fantasy/adamantine_ingot.png | Bin 0 -> 461 bytes .../items/fantasy/adamantine_legs.png | Bin 0 -> 459 bytes .../items/fantasy/adamantine_pick.png | Bin 0 -> 488 bytes .../items/fantasy/adamantine_shovel.png | Bin 0 -> 480 bytes .../items/fantasy/adamantine_sword.png | Bin 0 -> 468 bytes .../items/fantasy/astral_silver_axe.png | Bin 0 -> 481 bytes .../items/fantasy/astral_silver_boots.png | Bin 0 -> 440 bytes .../fantasy/astral_silver_bucket_fill.png | Bin 0 -> 281 bytes .../items/fantasy/astral_silver_chest.png | Bin 0 -> 465 bytes .../items/fantasy/astral_silver_dust.png | Bin 0 -> 447 bytes .../items/fantasy/astral_silver_helmet.png | Bin 0 -> 459 bytes .../items/fantasy/astral_silver_hoe.png | Bin 0 -> 469 bytes .../items/fantasy/astral_silver_ingot.png | Bin 0 -> 461 bytes .../items/fantasy/astral_silver_legs.png | Bin 0 -> 450 bytes .../items/fantasy/astral_silver_pick.png | Bin 0 -> 473 bytes .../items/fantasy/astral_silver_shovel.png | Bin 0 -> 461 bytes .../items/fantasy/astral_silver_sword.png | Bin 0 -> 465 bytes libs/textures/items/fantasy/atlarus_axe.png | Bin 0 -> 481 bytes libs/textures/items/fantasy/atlarus_boots.png | Bin 0 -> 464 bytes .../items/fantasy/atlarus_bucket_fill.png | Bin 0 -> 259 bytes libs/textures/items/fantasy/atlarus_chest.png | Bin 0 -> 468 bytes libs/textures/items/fantasy/atlarus_dust.png | Bin 0 -> 447 bytes .../textures/items/fantasy/atlarus_helmet.png | Bin 0 -> 464 bytes libs/textures/items/fantasy/atlarus_hoe.png | Bin 0 -> 474 bytes libs/textures/items/fantasy/atlarus_ingot.png | Bin 0 -> 461 bytes libs/textures/items/fantasy/atlarus_legs.png | Bin 0 -> 469 bytes libs/textures/items/fantasy/atlarus_pick.png | Bin 0 -> 477 bytes .../textures/items/fantasy/atlarus_shovel.png | Bin 0 -> 476 bytes libs/textures/items/fantasy/atlarus_sword.png | Bin 0 -> 468 bytes .../items/fantasy/black_steel_axe.png | Bin 0 -> 492 bytes .../items/fantasy/black_steel_boots.png | Bin 0 -> 462 bytes .../items/fantasy/black_steel_bucket_fill.png | Bin 0 -> 259 bytes .../items/fantasy/black_steel_chest.png | Bin 0 -> 478 bytes .../items/fantasy/black_steel_dust.png | Bin 0 -> 447 bytes .../items/fantasy/black_steel_helmet.png | Bin 0 -> 466 bytes .../items/fantasy/black_steel_hoe.png | Bin 0 -> 488 bytes .../items/fantasy/black_steel_ingot.png | Bin 0 -> 461 bytes .../items/fantasy/black_steel_legs.png | Bin 0 -> 463 bytes .../items/fantasy/black_steel_pick.png | Bin 0 -> 484 bytes .../items/fantasy/black_steel_shovel.png | Bin 0 -> 467 bytes .../items/fantasy/black_steel_sword.png | Bin 0 -> 481 bytes libs/textures/items/fantasy/carmot_axe.png | Bin 0 -> 477 bytes libs/textures/items/fantasy/carmot_boots.png | Bin 0 -> 451 bytes .../items/fantasy/carmot_bucket_fill.png | Bin 0 -> 222 bytes libs/textures/items/fantasy/carmot_chest.png | Bin 0 -> 468 bytes libs/textures/items/fantasy/carmot_dust.png | Bin 0 -> 447 bytes libs/textures/items/fantasy/carmot_helmet.png | Bin 0 -> 473 bytes libs/textures/items/fantasy/carmot_hoe.png | Bin 0 -> 471 bytes libs/textures/items/fantasy/carmot_ingot.png | Bin 0 -> 461 bytes libs/textures/items/fantasy/carmot_legs.png | Bin 0 -> 457 bytes libs/textures/items/fantasy/carmot_pick.png | Bin 0 -> 478 bytes libs/textures/items/fantasy/carmot_shovel.png | Bin 0 -> 470 bytes libs/textures/items/fantasy/carmot_sword.png | Bin 0 -> 473 bytes libs/textures/items/fantasy/celenegil_axe.png | Bin 0 -> 472 bytes .../items/fantasy/celenegil_boots.png | Bin 0 -> 461 bytes .../items/fantasy/celenegil_bucket_fill.png | Bin 0 -> 222 bytes .../items/fantasy/celenegil_chest.png | Bin 0 -> 476 bytes .../textures/items/fantasy/celenegil_dust.png | Bin 0 -> 447 bytes .../items/fantasy/celenegil_helmet.png | Bin 0 -> 460 bytes libs/textures/items/fantasy/celenegil_hoe.png | Bin 0 -> 468 bytes .../items/fantasy/celenegil_ingot.png | Bin 0 -> 461 bytes .../textures/items/fantasy/celenegil_legs.png | Bin 0 -> 463 bytes .../textures/items/fantasy/celenegil_pick.png | Bin 0 -> 475 bytes .../items/fantasy/celenegil_shovel.png | Bin 0 -> 464 bytes .../items/fantasy/celenegil_sword.png | Bin 0 -> 464 bytes libs/textures/items/fantasy/deep_iron_axe.png | Bin 0 -> 471 bytes .../items/fantasy/deep_iron_boots.png | Bin 0 -> 446 bytes .../items/fantasy/deep_iron_bucket_fill.png | Bin 0 -> 284 bytes .../items/fantasy/deep_iron_chest.png | Bin 0 -> 457 bytes .../textures/items/fantasy/deep_iron_dust.png | Bin 0 -> 447 bytes .../items/fantasy/deep_iron_helmet.png | Bin 0 -> 448 bytes libs/textures/items/fantasy/deep_iron_hoe.png | Bin 0 -> 469 bytes .../items/fantasy/deep_iron_ingot.png | Bin 0 -> 461 bytes .../textures/items/fantasy/deep_iron_legs.png | Bin 0 -> 450 bytes .../textures/items/fantasy/deep_iron_pick.png | Bin 0 -> 472 bytes .../items/fantasy/deep_iron_shovel.png | Bin 0 -> 453 bytes .../items/fantasy/deep_iron_sword.png | Bin 0 -> 464 bytes libs/textures/items/fantasy/haderoth_axe.png | Bin 0 -> 478 bytes .../textures/items/fantasy/haderoth_boots.png | Bin 0 -> 452 bytes .../items/fantasy/haderoth_bucket_fill.png | Bin 0 -> 259 bytes .../textures/items/fantasy/haderoth_chest.png | Bin 0 -> 469 bytes libs/textures/items/fantasy/haderoth_dust.png | Bin 0 -> 447 bytes .../items/fantasy/haderoth_helmet.png | Bin 0 -> 452 bytes libs/textures/items/fantasy/haderoth_hoe.png | Bin 0 -> 463 bytes .../textures/items/fantasy/haderoth_ingot.png | Bin 0 -> 461 bytes libs/textures/items/fantasy/haderoth_legs.png | Bin 0 -> 458 bytes libs/textures/items/fantasy/haderoth_pick.png | Bin 0 -> 475 bytes .../items/fantasy/haderoth_shovel.png | Bin 0 -> 466 bytes .../textures/items/fantasy/haderoth_sword.png | Bin 0 -> 466 bytes .../items/fantasy/infuscolium_bucket_fill.png | Bin 0 -> 221 bytes .../items/fantasy/infuscolium_dust.png | Bin 0 -> 447 bytes .../items/fantasy/infuscolium_ingot.png | Bin 0 -> 461 bytes libs/textures/items/fantasy/mithril_axe.png | Bin 0 -> 477 bytes libs/textures/items/fantasy/mithril_boots.png | Bin 0 -> 453 bytes .../items/fantasy/mithril_bucket_fill.png | Bin 0 -> 222 bytes libs/textures/items/fantasy/mithril_chest.png | Bin 0 -> 468 bytes libs/textures/items/fantasy/mithril_dust.png | Bin 0 -> 447 bytes .../textures/items/fantasy/mithril_helmet.png | Bin 0 -> 456 bytes libs/textures/items/fantasy/mithril_hoe.png | Bin 0 -> 469 bytes libs/textures/items/fantasy/mithril_ingot.png | Bin 0 -> 461 bytes libs/textures/items/fantasy/mithril_legs.png | Bin 0 -> 462 bytes libs/textures/items/fantasy/mithril_pick.png | Bin 0 -> 473 bytes .../textures/items/fantasy/mithril_shovel.png | Bin 0 -> 470 bytes libs/textures/items/fantasy/mithril_sword.png | Bin 0 -> 474 bytes .../textures/items/fantasy/orichalcum_axe.png | Bin 0 -> 479 bytes .../items/fantasy/orichalcum_boots.png | Bin 0 -> 456 bytes .../items/fantasy/orichalcum_bucket_fill.png | Bin 0 -> 221 bytes .../items/fantasy/orichalcum_chest.png | Bin 0 -> 492 bytes .../items/fantasy/orichalcum_dust.png | Bin 0 -> 447 bytes .../items/fantasy/orichalcum_helmet.png | Bin 0 -> 469 bytes .../textures/items/fantasy/orichalcum_hoe.png | Bin 0 -> 477 bytes .../items/fantasy/orichalcum_ingot.png | Bin 0 -> 461 bytes .../items/fantasy/orichalcum_legs.png | Bin 0 -> 468 bytes .../items/fantasy/orichalcum_pick.png | Bin 0 -> 489 bytes .../items/fantasy/orichalcum_shovel.png | Bin 0 -> 482 bytes .../items/fantasy/orichalcum_sword.png | Bin 0 -> 469 bytes libs/textures/items/fantasy/oureclase_axe.png | Bin 0 -> 483 bytes .../items/fantasy/oureclase_boots.png | Bin 0 -> 449 bytes .../items/fantasy/oureclase_bucket_fill.png | Bin 0 -> 221 bytes .../items/fantasy/oureclase_chest.png | Bin 0 -> 474 bytes .../textures/items/fantasy/oureclase_dust.png | Bin 0 -> 447 bytes .../items/fantasy/oureclase_helmet.png | Bin 0 -> 468 bytes libs/textures/items/fantasy/oureclase_hoe.png | Bin 0 -> 482 bytes .../items/fantasy/oureclase_ingot.png | Bin 0 -> 461 bytes .../textures/items/fantasy/oureclase_legs.png | Bin 0 -> 458 bytes .../textures/items/fantasy/oureclase_pick.png | Bin 0 -> 476 bytes .../items/fantasy/oureclase_shovel.png | Bin 0 -> 470 bytes .../items/fantasy/oureclase_sword.png | Bin 0 -> 465 bytes .../textures/items/fantasy/prometheum_axe.png | Bin 0 -> 471 bytes .../items/fantasy/prometheum_boots.png | Bin 0 -> 449 bytes .../items/fantasy/prometheum_bucket_fill.png | Bin 0 -> 221 bytes .../items/fantasy/prometheum_chest.png | Bin 0 -> 453 bytes .../items/fantasy/prometheum_dust.png | Bin 0 -> 447 bytes .../items/fantasy/prometheum_helmet.png | Bin 0 -> 435 bytes .../textures/items/fantasy/prometheum_hoe.png | Bin 0 -> 460 bytes .../items/fantasy/prometheum_ingot.png | Bin 0 -> 461 bytes .../items/fantasy/prometheum_legs.png | Bin 0 -> 454 bytes .../items/fantasy/prometheum_pick.png | Bin 0 -> 467 bytes .../items/fantasy/prometheum_shovel.png | Bin 0 -> 449 bytes .../items/fantasy/prometheum_sword.png | Bin 0 -> 460 bytes .../items/fantasy/quicksilver_axe.png | Bin 0 -> 476 bytes .../items/fantasy/quicksilver_boots.png | Bin 0 -> 452 bytes .../items/fantasy/quicksilver_bucket_fill.png | Bin 0 -> 222 bytes .../items/fantasy/quicksilver_chest.png | Bin 0 -> 466 bytes .../items/fantasy/quicksilver_dust.png | Bin 0 -> 447 bytes .../items/fantasy/quicksilver_helmet.png | Bin 0 -> 460 bytes .../items/fantasy/quicksilver_hoe.png | Bin 0 -> 463 bytes .../items/fantasy/quicksilver_ingot.png | Bin 0 -> 461 bytes .../items/fantasy/quicksilver_legs.png | Bin 0 -> 463 bytes .../items/fantasy/quicksilver_pick.png | Bin 0 -> 471 bytes .../items/fantasy/quicksilver_shovel.png | Bin 0 -> 465 bytes .../items/fantasy/quicksilver_sword.png | Bin 0 -> 470 bytes .../items/fantasy/rubracium_bucket_fill.png | Bin 0 -> 221 bytes .../textures/items/fantasy/rubracium_dust.png | Bin 0 -> 447 bytes .../items/fantasy/rubracium_ingot.png | Bin 0 -> 461 bytes libs/textures/items/fantasy/tartarite_axe.png | Bin 0 -> 502 bytes .../items/fantasy/tartarite_boots.png | Bin 0 -> 483 bytes .../items/fantasy/tartarite_bucket_fill.png | Bin 0 -> 221 bytes .../items/fantasy/tartarite_chest.png | Bin 0 -> 495 bytes .../textures/items/fantasy/tartarite_dust.png | Bin 0 -> 447 bytes .../items/fantasy/tartarite_helmet.png | Bin 0 -> 487 bytes libs/textures/items/fantasy/tartarite_hoe.png | Bin 0 -> 500 bytes .../items/fantasy/tartarite_ingot.png | Bin 0 -> 461 bytes .../textures/items/fantasy/tartarite_legs.png | Bin 0 -> 487 bytes .../textures/items/fantasy/tartarite_pick.png | Bin 0 -> 502 bytes .../items/fantasy/tartarite_shovel.png | Bin 0 -> 491 bytes .../items/fantasy/tartarite_sword.png | Bin 0 -> 491 bytes libs/textures/items/metal_item_default.png | Bin 0 -> 285 bytes libs/textures/items/misc/fertilizer.png | Bin 0 -> 475 bytes libs/textures/items/misc/tar.png | Bin 0 -> 437 bytes .../items/nether/alduorite_bucket_fill.png | Bin 0 -> 221 bytes libs/textures/items/nether/alduorite_dust.png | Bin 0 -> 447 bytes .../textures/items/nether/alduorite_ingot.png | Bin 0 -> 461 bytes libs/textures/items/nether/amordrine_axe.png | Bin 0 -> 492 bytes .../textures/items/nether/amordrine_boots.png | Bin 0 -> 466 bytes .../items/nether/amordrine_bucket_fill.png | Bin 0 -> 259 bytes .../textures/items/nether/amordrine_chest.png | Bin 0 -> 477 bytes libs/textures/items/nether/amordrine_dust.png | Bin 0 -> 447 bytes .../items/nether/amordrine_helmet.png | Bin 0 -> 463 bytes libs/textures/items/nether/amordrine_hoe.png | Bin 0 -> 475 bytes .../textures/items/nether/amordrine_ingot.png | Bin 0 -> 461 bytes libs/textures/items/nether/amordrine_legs.png | Bin 0 -> 465 bytes libs/textures/items/nether/amordrine_pick.png | Bin 0 -> 488 bytes .../items/nether/amordrine_shovel.png | Bin 0 -> 474 bytes .../textures/items/nether/amordrine_sword.png | Bin 0 -> 474 bytes libs/textures/items/nether/ceruclase_axe.png | Bin 0 -> 493 bytes .../textures/items/nether/ceruclase_boots.png | Bin 0 -> 451 bytes .../items/nether/ceruclase_bucket_fill.png | Bin 0 -> 221 bytes .../textures/items/nether/ceruclase_chest.png | Bin 0 -> 471 bytes libs/textures/items/nether/ceruclase_dust.png | Bin 0 -> 447 bytes .../items/nether/ceruclase_helmet.png | Bin 0 -> 453 bytes libs/textures/items/nether/ceruclase_hoe.png | Bin 0 -> 477 bytes .../textures/items/nether/ceruclase_ingot.png | Bin 0 -> 461 bytes libs/textures/items/nether/ceruclase_legs.png | Bin 0 -> 464 bytes libs/textures/items/nether/ceruclase_pick.png | Bin 0 -> 487 bytes .../items/nether/ceruclase_shovel.png | Bin 0 -> 480 bytes .../textures/items/nether/ceruclase_sword.png | Bin 0 -> 477 bytes libs/textures/items/nether/ignatius_axe.png | Bin 0 -> 478 bytes libs/textures/items/nether/ignatius_boots.png | Bin 0 -> 459 bytes .../items/nether/ignatius_bucket_fill.png | Bin 0 -> 222 bytes libs/textures/items/nether/ignatius_chest.png | Bin 0 -> 471 bytes libs/textures/items/nether/ignatius_dust.png | Bin 0 -> 447 bytes .../textures/items/nether/ignatius_helmet.png | Bin 0 -> 462 bytes libs/textures/items/nether/ignatius_hoe.png | Bin 0 -> 466 bytes libs/textures/items/nether/ignatius_ingot.png | Bin 0 -> 461 bytes libs/textures/items/nether/ignatius_legs.png | Bin 0 -> 460 bytes libs/textures/items/nether/ignatius_pick.png | Bin 0 -> 477 bytes .../textures/items/nether/ignatius_shovel.png | Bin 0 -> 462 bytes libs/textures/items/nether/ignatius_sword.png | Bin 0 -> 469 bytes libs/textures/items/nether/inolashite_axe.png | Bin 0 -> 502 bytes .../items/nether/inolashite_boots.png | Bin 0 -> 466 bytes .../items/nether/inolashite_bucket_fill.png | Bin 0 -> 222 bytes .../items/nether/inolashite_chest.png | Bin 0 -> 472 bytes .../textures/items/nether/inolashite_dust.png | Bin 0 -> 447 bytes .../items/nether/inolashite_helmet.png | Bin 0 -> 467 bytes libs/textures/items/nether/inolashite_hoe.png | Bin 0 -> 474 bytes .../items/nether/inolashite_ingot.png | Bin 0 -> 461 bytes .../textures/items/nether/inolashite_legs.png | Bin 0 -> 470 bytes .../textures/items/nether/inolashite_pick.png | Bin 0 -> 485 bytes .../items/nether/inolashite_shovel.png | Bin 0 -> 467 bytes .../items/nether/inolashite_sword.png | Bin 0 -> 477 bytes libs/textures/items/nether/kalendrite_axe.png | Bin 0 -> 497 bytes .../items/nether/kalendrite_boots.png | Bin 0 -> 457 bytes .../items/nether/kalendrite_bucket_fill.png | Bin 0 -> 221 bytes .../items/nether/kalendrite_chest.png | Bin 0 -> 474 bytes .../textures/items/nether/kalendrite_dust.png | Bin 0 -> 447 bytes .../items/nether/kalendrite_helmet.png | Bin 0 -> 451 bytes libs/textures/items/nether/kalendrite_hoe.png | Bin 0 -> 475 bytes .../items/nether/kalendrite_ingot.png | Bin 0 -> 461 bytes .../textures/items/nether/kalendrite_legs.png | Bin 0 -> 467 bytes .../textures/items/nether/kalendrite_pick.png | Bin 0 -> 479 bytes .../items/nether/kalendrite_shovel.png | Bin 0 -> 470 bytes .../items/nether/kalendrite_sword.png | Bin 0 -> 485 bytes .../items/nether/lemurite_bucket_fill.png | Bin 0 -> 222 bytes libs/textures/items/nether/lemurite_dust.png | Bin 0 -> 447 bytes libs/textures/items/nether/lemurite_ingot.png | Bin 0 -> 461 bytes libs/textures/items/nether/midasium_axe.png | Bin 0 -> 487 bytes libs/textures/items/nether/midasium_boots.png | Bin 0 -> 452 bytes .../items/nether/midasium_bucket_fill.png | Bin 0 -> 222 bytes libs/textures/items/nether/midasium_chest.png | Bin 0 -> 474 bytes libs/textures/items/nether/midasium_dust.png | Bin 0 -> 447 bytes .../textures/items/nether/midasium_helmet.png | Bin 0 -> 460 bytes libs/textures/items/nether/midasium_hoe.png | Bin 0 -> 469 bytes libs/textures/items/nether/midasium_ingot.png | Bin 0 -> 461 bytes libs/textures/items/nether/midasium_legs.png | Bin 0 -> 464 bytes libs/textures/items/nether/midasium_pick.png | Bin 0 -> 479 bytes .../textures/items/nether/midasium_shovel.png | Bin 0 -> 477 bytes libs/textures/items/nether/midasium_sword.png | Bin 0 -> 479 bytes libs/textures/items/nether/sanguinite_axe.png | Bin 0 -> 512 bytes .../items/nether/sanguinite_boots.png | Bin 0 -> 486 bytes .../items/nether/sanguinite_bucket_fill.png | Bin 0 -> 221 bytes .../items/nether/sanguinite_chest.png | Bin 0 -> 517 bytes .../textures/items/nether/sanguinite_dust.png | Bin 0 -> 447 bytes .../items/nether/sanguinite_helmet.png | Bin 0 -> 507 bytes libs/textures/items/nether/sanguinite_hoe.png | Bin 0 -> 499 bytes .../items/nether/sanguinite_ingot.png | Bin 0 -> 461 bytes .../textures/items/nether/sanguinite_legs.png | Bin 0 -> 496 bytes .../textures/items/nether/sanguinite_pick.png | Bin 0 -> 508 bytes .../items/nether/sanguinite_shovel.png | Bin 0 -> 492 bytes .../items/nether/sanguinite_sword.png | Bin 0 -> 498 bytes .../textures/items/nether/shadow_iron_axe.png | Bin 0 -> 480 bytes .../items/nether/shadow_iron_boots.png | Bin 0 -> 454 bytes .../items/nether/shadow_iron_bucket_fill.png | Bin 0 -> 221 bytes .../items/nether/shadow_iron_chest.png | Bin 0 -> 473 bytes .../items/nether/shadow_iron_dust.png | Bin 0 -> 447 bytes .../items/nether/shadow_iron_helmet.png | Bin 0 -> 467 bytes .../textures/items/nether/shadow_iron_hoe.png | Bin 0 -> 466 bytes .../items/nether/shadow_iron_ingot.png | Bin 0 -> 461 bytes .../items/nether/shadow_iron_legs.png | Bin 0 -> 463 bytes .../items/nether/shadow_iron_pick.png | Bin 0 -> 477 bytes .../items/nether/shadow_iron_shovel.png | Bin 0 -> 461 bytes .../items/nether/shadow_iron_sword.png | Bin 0 -> 470 bytes .../items/nether/shadow_steel_axe.png | Bin 0 -> 490 bytes .../items/nether/shadow_steel_boots.png | Bin 0 -> 469 bytes .../items/nether/shadow_steel_bucket_fill.png | Bin 0 -> 221 bytes .../items/nether/shadow_steel_chest.png | Bin 0 -> 482 bytes .../items/nether/shadow_steel_dust.png | Bin 0 -> 447 bytes .../items/nether/shadow_steel_helmet.png | Bin 0 -> 469 bytes .../items/nether/shadow_steel_hoe.png | Bin 0 -> 477 bytes .../items/nether/shadow_steel_ingot.png | Bin 0 -> 461 bytes .../items/nether/shadow_steel_legs.png | Bin 0 -> 471 bytes .../items/nether/shadow_steel_pick.png | Bin 0 -> 489 bytes .../items/nether/shadow_steel_shovel.png | Bin 0 -> 472 bytes .../items/nether/shadow_steel_sword.png | Bin 0 -> 473 bytes libs/textures/items/nether/vulcanite_axe.png | Bin 0 -> 485 bytes .../textures/items/nether/vulcanite_boots.png | Bin 0 -> 456 bytes .../items/nether/vulcanite_bucket_fill.png | Bin 0 -> 221 bytes .../textures/items/nether/vulcanite_chest.png | Bin 0 -> 476 bytes libs/textures/items/nether/vulcanite_dust.png | Bin 0 -> 447 bytes .../items/nether/vulcanite_helmet.png | Bin 0 -> 459 bytes libs/textures/items/nether/vulcanite_hoe.png | Bin 0 -> 477 bytes .../textures/items/nether/vulcanite_ingot.png | Bin 0 -> 461 bytes libs/textures/items/nether/vulcanite_legs.png | Bin 0 -> 469 bytes libs/textures/items/nether/vulcanite_pick.png | Bin 0 -> 473 bytes .../items/nether/vulcanite_shovel.png | Bin 0 -> 481 bytes .../textures/items/nether/vulcanite_sword.png | Bin 0 -> 478 bytes libs/textures/items/nether/vyroxeres_axe.png | Bin 0 -> 483 bytes .../textures/items/nether/vyroxeres_boots.png | Bin 0 -> 459 bytes .../items/nether/vyroxeres_bucket_fill.png | Bin 0 -> 222 bytes .../textures/items/nether/vyroxeres_chest.png | Bin 0 -> 472 bytes libs/textures/items/nether/vyroxeres_dust.png | Bin 0 -> 447 bytes .../items/nether/vyroxeres_helmet.png | Bin 0 -> 458 bytes libs/textures/items/nether/vyroxeres_hoe.png | Bin 0 -> 474 bytes .../textures/items/nether/vyroxeres_ingot.png | Bin 0 -> 461 bytes libs/textures/items/nether/vyroxeres_legs.png | Bin 0 -> 464 bytes libs/textures/items/nether/vyroxeres_pick.png | Bin 0 -> 488 bytes .../items/nether/vyroxeres_shovel.png | Bin 0 -> 480 bytes .../textures/items/nether/vyroxeres_sword.png | Bin 0 -> 475 bytes libs/textures/items/precious/brass_axe.png | Bin 0 -> 458 bytes libs/textures/items/precious/brass_boots.png | Bin 0 -> 441 bytes .../items/precious/brass_bucket_fill.png | Bin 0 -> 259 bytes libs/textures/items/precious/brass_chest.png | Bin 0 -> 454 bytes libs/textures/items/precious/brass_dust.png | Bin 0 -> 447 bytes libs/textures/items/precious/brass_helmet.png | Bin 0 -> 455 bytes libs/textures/items/precious/brass_hoe.png | Bin 0 -> 452 bytes libs/textures/items/precious/brass_ingot.png | Bin 0 -> 461 bytes libs/textures/items/precious/brass_legs.png | Bin 0 -> 445 bytes libs/textures/items/precious/brass_pick.png | Bin 0 -> 467 bytes libs/textures/items/precious/brass_shovel.png | Bin 0 -> 457 bytes libs/textures/items/precious/brass_sword.png | Bin 0 -> 456 bytes libs/textures/items/precious/electrum_axe.png | Bin 0 -> 483 bytes .../items/precious/electrum_boots.png | Bin 0 -> 465 bytes .../items/precious/electrum_bucket_fill.png | Bin 0 -> 284 bytes .../items/precious/electrum_chest.png | Bin 0 -> 486 bytes .../textures/items/precious/electrum_dust.png | Bin 0 -> 447 bytes .../items/precious/electrum_helmet.png | Bin 0 -> 470 bytes libs/textures/items/precious/electrum_hoe.png | Bin 0 -> 472 bytes .../items/precious/electrum_ingot.png | Bin 0 -> 461 bytes .../textures/items/precious/electrum_legs.png | Bin 0 -> 469 bytes .../textures/items/precious/electrum_pick.png | Bin 0 -> 485 bytes .../items/precious/electrum_shovel.png | Bin 0 -> 469 bytes .../items/precious/electrum_sword.png | Bin 0 -> 471 bytes libs/textures/items/precious/platinum_axe.png | Bin 0 -> 482 bytes .../items/precious/platinum_boots.png | Bin 0 -> 461 bytes .../items/precious/platinum_bucket_fill.png | Bin 0 -> 222 bytes .../items/precious/platinum_chest.png | Bin 0 -> 483 bytes .../textures/items/precious/platinum_dust.png | Bin 0 -> 447 bytes .../items/precious/platinum_helmet.png | Bin 0 -> 473 bytes libs/textures/items/precious/platinum_hoe.png | Bin 0 -> 481 bytes .../items/precious/platinum_ingot.png | Bin 0 -> 461 bytes .../textures/items/precious/platinum_legs.png | Bin 0 -> 467 bytes .../textures/items/precious/platinum_pick.png | Bin 0 -> 482 bytes .../items/precious/platinum_shovel.png | Bin 0 -> 469 bytes .../items/precious/platinum_sword.png | Bin 0 -> 475 bytes libs/textures/items/precious/silver_axe.png | Bin 0 -> 471 bytes libs/textures/items/precious/silver_boots.png | Bin 0 -> 452 bytes .../items/precious/silver_bucket_fill.png | Bin 0 -> 265 bytes libs/textures/items/precious/silver_chest.png | Bin 0 -> 461 bytes libs/textures/items/precious/silver_dust.png | Bin 0 -> 447 bytes .../textures/items/precious/silver_helmet.png | Bin 0 -> 464 bytes libs/textures/items/precious/silver_hoe.png | Bin 0 -> 470 bytes libs/textures/items/precious/silver_ingot.png | Bin 0 -> 460 bytes libs/textures/items/precious/silver_legs.png | Bin 0 -> 463 bytes libs/textures/items/precious/silver_pick.png | Bin 0 -> 477 bytes .../textures/items/precious/silver_shovel.png | Bin 0 -> 462 bytes libs/textures/items/precious/silver_sword.png | Bin 0 -> 462 bytes .../items/precious/zinc_bucket_fill.png | Bin 0 -> 222 bytes libs/textures/items/precious/zinc_dust.png | Bin 0 -> 447 bytes libs/textures/items/precious/zinc_ingot.png | Bin 0 -> 461 bytes libs/textures/items/utility/bitumen.png | Bin 0 -> 449 bytes libs/textures/items/utility/magnesium.png | Bin 0 -> 460 bytes libs/textures/items/utility/phosphorus.png | Bin 0 -> 460 bytes libs/textures/items/utility/potash.png | Bin 0 -> 443 bytes libs/textures/items/utility/saltpeter.png | Bin 0 -> 422 bytes libs/textures/items/utility/sulfur.png | Bin 0 -> 452 bytes libs/textures/items/vanilla/gold_dust.png | Bin 0 -> 279 bytes libs/textures/items/vanilla/iron_dust.png | Bin 0 -> 279 bytes .../models/armor/base/angmallen_layer_1.png | Bin 0 -> 693 bytes .../models/armor/base/angmallen_layer_2.png | Bin 0 -> 422 bytes .../models/armor/base/bronze_layer_1.png | Bin 0 -> 828 bytes .../models/armor/base/bronze_layer_2.png | Bin 0 -> 376 bytes .../models/armor/base/copper_layer_1.png | Bin 0 -> 672 bytes .../models/armor/base/copper_layer_2.png | Bin 0 -> 360 bytes .../armor/base/damascus_steel_layer_1.png | Bin 0 -> 694 bytes .../armor/base/damascus_steel_layer_2.png | Bin 0 -> 365 bytes .../models/armor/base/hepatizon_layer_1.png | Bin 0 -> 642 bytes .../models/armor/base/hepatizon_layer_2.png | Bin 0 -> 379 bytes .../models/armor/base/steel_layer_1.png | Bin 0 -> 582 bytes .../models/armor/base/steel_layer_2.png | Bin 0 -> 405 bytes .../armor/ender/desichalkos_layer_1.png | Bin 0 -> 774 bytes .../armor/ender/desichalkos_layer_2.png | Bin 0 -> 477 bytes .../models/armor/ender/eximite_layer_1.png | Bin 0 -> 691 bytes .../models/armor/ender/eximite_layer_2.png | Bin 0 -> 465 bytes .../armor/fantasy/adamantine_layer_1.png | Bin 0 -> 754 bytes .../armor/fantasy/adamantine_layer_2.png | Bin 0 -> 389 bytes .../armor/fantasy/astral_silver_layer_1.png | Bin 0 -> 797 bytes .../armor/fantasy/astral_silver_layer_2.png | Bin 0 -> 477 bytes .../models/armor/fantasy/atlarus_layer_1.png | Bin 0 -> 672 bytes .../models/armor/fantasy/atlarus_layer_2.png | Bin 0 -> 409 bytes .../armor/fantasy/black_steel_layer_1.png | Bin 0 -> 754 bytes .../armor/fantasy/black_steel_layer_2.png | Bin 0 -> 439 bytes .../models/armor/fantasy/carmot_layer_1.png | Bin 0 -> 780 bytes .../models/armor/fantasy/carmot_layer_2.png | Bin 0 -> 462 bytes .../armor/fantasy/celenegil_layer_1.png | Bin 0 -> 765 bytes .../armor/fantasy/celenegil_layer_2.png | Bin 0 -> 466 bytes .../armor/fantasy/deep_iron_layer_1.png | Bin 0 -> 700 bytes .../armor/fantasy/deep_iron_layer_2.png | Bin 0 -> 467 bytes .../models/armor/fantasy/haderoth_layer_1.png | Bin 0 -> 756 bytes .../models/armor/fantasy/haderoth_layer_2.png | Bin 0 -> 435 bytes .../models/armor/fantasy/mithril_layer_1.png | Bin 0 -> 682 bytes .../models/armor/fantasy/mithril_layer_2.png | Bin 0 -> 465 bytes .../armor/fantasy/orichalcum_layer_1.png | Bin 0 -> 844 bytes .../armor/fantasy/orichalcum_layer_2.png | Bin 0 -> 466 bytes .../armor/fantasy/oureclase_layer_1.png | Bin 0 -> 740 bytes .../armor/fantasy/oureclase_layer_2.png | Bin 0 -> 469 bytes .../armor/fantasy/prometheum_layer_1.png | Bin 0 -> 678 bytes .../armor/fantasy/prometheum_layer_2.png | Bin 0 -> 391 bytes .../armor/fantasy/quicksilver_layer_1.png | Bin 0 -> 727 bytes .../armor/fantasy/quicksilver_layer_2.png | Bin 0 -> 466 bytes .../armor/fantasy/tartarite_layer_1.png | Bin 0 -> 734 bytes .../armor/fantasy/tartarite_layer_2.png | Bin 0 -> 442 bytes .../models/armor/nether/amordrine_layer_1.png | Bin 0 -> 762 bytes .../models/armor/nether/amordrine_layer_2.png | Bin 0 -> 464 bytes .../models/armor/nether/ceruclase_layer_1.png | Bin 0 -> 741 bytes .../models/armor/nether/ceruclase_layer_2.png | Bin 0 -> 467 bytes .../models/armor/nether/ignatius_layer_1.png | Bin 0 -> 699 bytes .../models/armor/nether/ignatius_layer_2.png | Bin 0 -> 406 bytes .../armor/nether/inolashite_layer_1.png | Bin 0 -> 764 bytes .../armor/nether/inolashite_layer_2.png | Bin 0 -> 471 bytes .../armor/nether/kalendrite_layer_1.png | Bin 0 -> 716 bytes .../armor/nether/kalendrite_layer_2.png | Bin 0 -> 466 bytes .../models/armor/nether/midasium_layer_1.png | Bin 0 -> 738 bytes .../models/armor/nether/midasium_layer_2.png | Bin 0 -> 447 bytes .../armor/nether/sanguinite_layer_1.png | Bin 0 -> 741 bytes .../armor/nether/sanguinite_layer_2.png | Bin 0 -> 489 bytes .../armor/nether/shadow_iron_layer_1.png | Bin 0 -> 725 bytes .../armor/nether/shadow_iron_layer_2.png | Bin 0 -> 462 bytes .../armor/nether/shadow_steel_layer_1.png | Bin 0 -> 709 bytes .../armor/nether/shadow_steel_layer_2.png | Bin 0 -> 464 bytes .../models/armor/nether/vulcanite_layer_1.png | Bin 0 -> 716 bytes .../models/armor/nether/vulcanite_layer_2.png | Bin 0 -> 457 bytes .../models/armor/nether/vyroxeres_layer_1.png | Bin 0 -> 739 bytes .../models/armor/nether/vyroxeres_layer_2.png | Bin 0 -> 459 bytes .../models/armor/precious/brass_layer_1.png | Bin 0 -> 734 bytes .../models/armor/precious/brass_layer_2.png | Bin 0 -> 449 bytes .../armor/precious/electrum_layer_1.png | Bin 0 -> 765 bytes .../armor/precious/electrum_layer_2.png | Bin 0 -> 475 bytes .../armor/precious/platinum_layer_1.png | Bin 0 -> 727 bytes .../armor/precious/platinum_layer_2.png | Bin 0 -> 493 bytes .../models/armor/precious/silver_layer_1.png | Bin 0 -> 681 bytes .../models/armor/precious/silver_layer_2.png | Bin 0 -> 400 bytes libs/textures/particles/m_particles.png | Bin 0 -> 293 bytes .../java/minefantasy/mf2/MineFantasyII.java | 4 +- .../mf2/block/basic/BlockMithrilOre.java | 26 ++++ .../mf2/block/list/BlockListMF.java | 7 +- .../mf2/client/KnowledgePageRegistry.java | 17 +++ .../mf2/client/render/RenderHeavyWeapon.java | 21 ++- .../mf2/client/render/RenderSword.java | 18 ++- .../minefantasy/mf2/config/ConfigMobs.java | 32 ++--- .../mf2/config/ConfigWorldGen.java | 51 +++++-- .../mf2/entity/mob/DragonBreed.java | 16 +-- .../mf2/entity/mob/EntityDragon.java | 30 ++-- .../mf2/item/AdvancedFuelHandlerMF.java | 2 +- .../minefantasy/mf2/item/ItemComponentMF.java | 1 + .../mf2/item/list/ComponentListMF.java | 7 +- .../mf2/item/list/CreativeTabMF.java | 3 + .../mf2/item/list/CustomToolListMF.java | 22 ++- .../mf2/item/weapon/ItemClaymoreMF.java | 128 +++++++++++++++++ .../mf2/item/weapon/ItemClaymoreStats.java | 124 ++++++++++++++++ .../mf2/item/weapon/ItemGladius.java | 132 ++++++++++++++++++ .../mf2/item/weapon/ItemGladiusStats.java | 110 +++++++++++++++ .../mf2/item/weapon/ItemLongswordMF.java | 126 +++++++++++++++++ .../mf2/item/weapon/ItemLongswordStats.java | 123 ++++++++++++++++ .../mf2/item/weapon/ItemNodachi.java | 128 +++++++++++++++++ .../mf2/item/weapon/ItemNodachiStats.java | 123 ++++++++++++++++ .../mf2/item/weapon/ItemSaber.java | 132 ++++++++++++++++++ .../mf2/item/weapon/ItemSaberStats.java | 117 ++++++++++++++++ .../mf2/item/weapon/ItemShortsword.java | 132 ++++++++++++++++++ .../mf2/item/weapon/ItemShortswordStats.java | 118 ++++++++++++++++ .../mf2/item/weapon/ItemTrident.java | 128 +++++++++++++++++ .../mf2/item/weapon/ItemTridentStats.java | 123 ++++++++++++++++ .../mf2/item/weapon/ItemWeaponMF.java | 36 +++++ .../mf2/knowledge/KnowledgeListMF.java | 15 +- .../mf2/material/BaseMaterialMF.java | 7 +- .../mf2/material/MetalMaterial.java | 42 +++++- .../worldGen/WorldGenGeological.java | 9 +- .../mf2/network/ClientProxyMF.java | 18 +++ .../mf2/recipe/CarpenterRecipes.java | 3 + .../mf2/recipe/ForgedToolRecipes.java | 57 +++++++- .../mf2/recipe/ForgingRecipes.java | 10 +- .../mf2/recipe/SmeltingRecipesMF.java | 16 +++ .../minefantasy/mf2/recipe/TempRecipesMF.java | 1 - .../assets/minefantasy2/LogoMF2EdK.png | Bin 0 -> 1754 bytes .../assets/minefantasy2/lang/en_US.lang | 43 ++++++ .../textures/blocks/ores/desktop.ini | 2 + .../textures/blocks/ores/oreMithril.png | Bin 0 -> 510 bytes .../items/Weapon/standard_longsword.png | Bin 0 -> 447 bytes .../textures/items/component/dwarven_fuel.png | Bin 0 -> 498 bytes .../items/component/ingotDwarfSteel.png | Bin 0 -> 319 bytes .../textures/items/component/ingotEmerald.png | Bin 0 -> 398 bytes .../textures/items/component/ingotMithril.png | Bin 268 -> 335 bytes .../items/component/ingotMithril21312.png | Bin 0 -> 268 bytes .../dwarvenforged/dwarvenforged_longsword.png | Bin 0 -> 430 bytes .../dwarvenforged_longsword_detail.png | Bin 0 -> 169 bytes .../dwarvenforged_longsword_haft.png | Bin 0 -> 292 bytes .../items/custom/weapon/standard/gladius.png | Bin 0 -> 421 bytes .../weapon/standard/standard_claymore.png | Bin 0 -> 640 bytes .../standard/standard_claymore_detail.png | Bin 0 -> 284 bytes .../standard/standard_claymore_haft.png | Bin 0 -> 292 bytes .../weapon/standard/standard_gladius.png | Bin 0 -> 345 bytes .../standard/standard_gladius_detail.png | Bin 0 -> 109 bytes .../weapon/standard/standard_gladius_haft.png | Bin 0 -> 203 bytes .../weapon/standard/standard_longsword.png | Bin 0 -> 448 bytes .../standard/standard_longsword_detail.png | Bin 0 -> 258 bytes .../standard/standard_longsword_haft.png | Bin 0 -> 292 bytes .../weapon/standard/standard_nodachi.png | Bin 0 -> 393 bytes .../standard/standard_nodachi_detail.png | Bin 0 -> 248 bytes .../weapon/standard/standard_nodachi_haft.png | Bin 0 -> 225 bytes .../custom/weapon/standard/standard_saber.png | Bin 0 -> 489 bytes .../weapon/standard/standard_saber_detail.png | Bin 0 -> 169 bytes .../weapon/standard/standard_saber_haft.png | Bin 0 -> 292 bytes .../weapon/standard/standard_shortsword.png | Bin 180 -> 324 bytes .../custom/weapon/standard/standard_sword.png | Bin 185 -> 304 bytes .../weapon/standard/standard_trident.png | Bin 0 -> 720 bytes .../standard/standard_trident_detail.png | Bin 0 -> 417 bytes .../weapon/standard/standard_trident_haft.png | Bin 0 -> 225 bytes src/main/resources/desktop.ini | 2 + src/main/resources/mcmod.info | 13 +- 1010 files changed, 4518 insertions(+), 92 deletions(-) create mode 100644 TODO/Dwarvenforged/DwarvenForgedStyle.java delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100644 lib/bukkit-1.7.10.jar create mode 100644 libs/textures/blocks/base/angmallen_block.png create mode 100644 libs/textures/blocks/base/angmallen_brick.png create mode 100644 libs/textures/blocks/base/angmallen_molten_flow.png create mode 100644 libs/textures/blocks/base/angmallen_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/base/angmallen_molten_still.png create mode 100644 libs/textures/blocks/base/angmallen_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/base/bronze_block.png create mode 100644 libs/textures/blocks/base/bronze_brick.png create mode 100644 libs/textures/blocks/base/bronze_molten_flow.png create mode 100644 libs/textures/blocks/base/bronze_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/base/bronze_molten_still.png create mode 100644 libs/textures/blocks/base/bronze_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/base/copper_block.png create mode 100644 libs/textures/blocks/base/copper_brick.png create mode 100644 libs/textures/blocks/base/copper_molten_flow.png create mode 100644 libs/textures/blocks/base/copper_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/base/copper_molten_still.png create mode 100644 libs/textures/blocks/base/copper_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/base/copper_ore.png create mode 100644 libs/textures/blocks/base/copper_ore_overlay.png create mode 100644 libs/textures/blocks/base/damascus_steel_block.png create mode 100644 libs/textures/blocks/base/damascus_steel_brick.png create mode 100644 libs/textures/blocks/base/damascus_steel_molten_flow.png create mode 100644 libs/textures/blocks/base/damascus_steel_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/base/damascus_steel_molten_still.png create mode 100644 libs/textures/blocks/base/damascus_steel_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/base/hepatizon_block.png create mode 100644 libs/textures/blocks/base/hepatizon_brick.png create mode 100644 libs/textures/blocks/base/hepatizon_molten_flow.png create mode 100644 libs/textures/blocks/base/hepatizon_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/base/hepatizon_molten_still.png create mode 100644 libs/textures/blocks/base/hepatizon_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/base/manganese_block.png create mode 100644 libs/textures/blocks/base/manganese_brick.png create mode 100644 libs/textures/blocks/base/manganese_molten_flow.png create mode 100644 libs/textures/blocks/base/manganese_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/base/manganese_molten_still.png create mode 100644 libs/textures/blocks/base/manganese_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/base/manganese_ore.png create mode 100644 libs/textures/blocks/base/manganese_ore_overlay.png create mode 100644 libs/textures/blocks/base/steel_block.png create mode 100644 libs/textures/blocks/base/steel_brick.png create mode 100644 libs/textures/blocks/base/steel_molten_flow.png create mode 100644 libs/textures/blocks/base/steel_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/base/steel_molten_still.png create mode 100644 libs/textures/blocks/base/steel_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/base/tin_block.png create mode 100644 libs/textures/blocks/base/tin_brick.png create mode 100644 libs/textures/blocks/base/tin_molten_flow.png create mode 100644 libs/textures/blocks/base/tin_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/base/tin_molten_still.png create mode 100644 libs/textures/blocks/base/tin_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/base/tin_ore.png create mode 100644 libs/textures/blocks/base/tin_ore_overlay.png create mode 100644 libs/textures/blocks/ender/desichalkos_block.png create mode 100644 libs/textures/blocks/ender/desichalkos_brick.png create mode 100644 libs/textures/blocks/ender/desichalkos_molten_flow.png create mode 100644 libs/textures/blocks/ender/desichalkos_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/ender/desichalkos_molten_still.png create mode 100644 libs/textures/blocks/ender/desichalkos_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/ender/eximite_block.png create mode 100644 libs/textures/blocks/ender/eximite_brick.png create mode 100644 libs/textures/blocks/ender/eximite_molten_flow.png create mode 100644 libs/textures/blocks/ender/eximite_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/ender/eximite_molten_still.png create mode 100644 libs/textures/blocks/ender/eximite_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/ender/eximite_ore.png create mode 100644 libs/textures/blocks/ender/meutoite_block.png create mode 100644 libs/textures/blocks/ender/meutoite_brick.png create mode 100644 libs/textures/blocks/ender/meutoite_molten_flow.png create mode 100644 libs/textures/blocks/ender/meutoite_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/ender/meutoite_molten_still.png create mode 100644 libs/textures/blocks/ender/meutoite_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/ender/meutoite_ore.png create mode 100644 libs/textures/blocks/fantasy/adamantine_block.png create mode 100644 libs/textures/blocks/fantasy/adamantine_brick.png create mode 100644 libs/textures/blocks/fantasy/adamantine_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/adamantine_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/adamantine_molten_still.png create mode 100644 libs/textures/blocks/fantasy/adamantine_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/adamantine_ore.png create mode 100644 libs/textures/blocks/fantasy/adamantine_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/astral_silver_block.png create mode 100644 libs/textures/blocks/fantasy/astral_silver_brick.png create mode 100644 libs/textures/blocks/fantasy/astral_silver_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/astral_silver_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/astral_silver_molten_still.png create mode 100644 libs/textures/blocks/fantasy/astral_silver_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/astral_silver_ore.png create mode 100644 libs/textures/blocks/fantasy/astral_silver_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/atlarus_block.png create mode 100644 libs/textures/blocks/fantasy/atlarus_brick.png create mode 100644 libs/textures/blocks/fantasy/atlarus_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/atlarus_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/atlarus_molten_still.png create mode 100644 libs/textures/blocks/fantasy/atlarus_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/atlarus_ore.png create mode 100644 libs/textures/blocks/fantasy/atlarus_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/black_steel_block.png create mode 100644 libs/textures/blocks/fantasy/black_steel_brick.png create mode 100644 libs/textures/blocks/fantasy/black_steel_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/black_steel_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/black_steel_molten_still.png create mode 100644 libs/textures/blocks/fantasy/black_steel_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/carmot_block.png create mode 100644 libs/textures/blocks/fantasy/carmot_brick.png create mode 100644 libs/textures/blocks/fantasy/carmot_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/carmot_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/carmot_molten_still.png create mode 100644 libs/textures/blocks/fantasy/carmot_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/carmot_ore.png create mode 100644 libs/textures/blocks/fantasy/carmot_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/celenegil_block.png create mode 100644 libs/textures/blocks/fantasy/celenegil_brick.png create mode 100644 libs/textures/blocks/fantasy/celenegil_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/celenegil_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/celenegil_molten_still.png create mode 100644 libs/textures/blocks/fantasy/celenegil_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/deep_iron_block.png create mode 100644 libs/textures/blocks/fantasy/deep_iron_brick.png create mode 100644 libs/textures/blocks/fantasy/deep_iron_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/deep_iron_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/deep_iron_molten_still.png create mode 100644 libs/textures/blocks/fantasy/deep_iron_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/deep_iron_ore.png create mode 100644 libs/textures/blocks/fantasy/deep_iron_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/haderoth_block.png create mode 100644 libs/textures/blocks/fantasy/haderoth_brick.png create mode 100644 libs/textures/blocks/fantasy/haderoth_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/haderoth_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/haderoth_molten_still.png create mode 100644 libs/textures/blocks/fantasy/haderoth_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/infuscolium_block.png create mode 100644 libs/textures/blocks/fantasy/infuscolium_brick.png create mode 100644 libs/textures/blocks/fantasy/infuscolium_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/infuscolium_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/infuscolium_molten_still.png create mode 100644 libs/textures/blocks/fantasy/infuscolium_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/infuscolium_ore.png create mode 100644 libs/textures/blocks/fantasy/infuscolium_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/mithril_block.png create mode 100644 libs/textures/blocks/fantasy/mithril_brick.png create mode 100644 libs/textures/blocks/fantasy/mithril_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/mithril_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/mithril_molten_still.png create mode 100644 libs/textures/blocks/fantasy/mithril_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/mithril_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/orichalcum_block.png create mode 100644 libs/textures/blocks/fantasy/orichalcum_brick.png create mode 100644 libs/textures/blocks/fantasy/orichalcum_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/orichalcum_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/orichalcum_molten_still.png create mode 100644 libs/textures/blocks/fantasy/orichalcum_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/orichalcum_ore.png create mode 100644 libs/textures/blocks/fantasy/orichalcum_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/oureclase_block.png create mode 100644 libs/textures/blocks/fantasy/oureclase_brick.png create mode 100644 libs/textures/blocks/fantasy/oureclase_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/oureclase_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/oureclase_molten_still.png create mode 100644 libs/textures/blocks/fantasy/oureclase_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/oureclase_ore.png create mode 100644 libs/textures/blocks/fantasy/oureclase_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/prometheum_block.png create mode 100644 libs/textures/blocks/fantasy/prometheum_brick.png create mode 100644 libs/textures/blocks/fantasy/prometheum_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/prometheum_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/prometheum_molten_still.png create mode 100644 libs/textures/blocks/fantasy/prometheum_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/prometheum_ore.png create mode 100644 libs/textures/blocks/fantasy/prometheum_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/quicksilver_block.png create mode 100644 libs/textures/blocks/fantasy/quicksilver_brick.png create mode 100644 libs/textures/blocks/fantasy/quicksilver_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/quicksilver_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/quicksilver_molten_still.png create mode 100644 libs/textures/blocks/fantasy/quicksilver_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/rubracium_block.png create mode 100644 libs/textures/blocks/fantasy/rubracium_brick.png create mode 100644 libs/textures/blocks/fantasy/rubracium_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/rubracium_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/rubracium_molten_still.png create mode 100644 libs/textures/blocks/fantasy/rubracium_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/rubracium_ore.png create mode 100644 libs/textures/blocks/fantasy/rubracium_ore_overlay.png create mode 100644 libs/textures/blocks/fantasy/tartarite_block.png create mode 100644 libs/textures/blocks/fantasy/tartarite_brick.png create mode 100644 libs/textures/blocks/fantasy/tartarite_molten_flow.png create mode 100644 libs/textures/blocks/fantasy/tartarite_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/fantasy/tartarite_molten_still.png create mode 100644 libs/textures/blocks/fantasy/tartarite_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/machines/alloyer_bottom.png create mode 100644 libs/textures/blocks/machines/alloyer_front.png create mode 100644 libs/textures/blocks/machines/alloyer_side.png create mode 100644 libs/textures/blocks/machines/alloyer_top.png create mode 100644 libs/textures/blocks/machines/crusher_front.png create mode 100644 libs/textures/blocks/machines/foundry_bottom.png create mode 100644 libs/textures/blocks/machines/foundry_front.png create mode 100644 libs/textures/blocks/machines/foundry_side.png create mode 100644 libs/textures/blocks/machines/foundry_top.png create mode 100644 libs/textures/blocks/machines/mframe_bottom.png create mode 100644 libs/textures/blocks/machines/mframe_side.png create mode 100644 libs/textures/blocks/machines/mframe_top.png create mode 100644 libs/textures/blocks/machines/smelter_bottom.png create mode 100644 libs/textures/blocks/machines/smelter_front.png create mode 100644 libs/textures/blocks/machines/smelter_side.png create mode 100644 libs/textures/blocks/machines/smelter_side_connected.png create mode 100644 libs/textures/blocks/machines/smelter_top.png create mode 100644 libs/textures/blocks/metal_block_default.png create mode 100644 libs/textures/blocks/misc/charcoal_block.png create mode 100644 libs/textures/blocks/misc/de_tnt_bottom.png create mode 100644 libs/textures/blocks/misc/de_tnt_side.png create mode 100644 libs/textures/blocks/misc/de_tnt_top.png create mode 100644 libs/textures/blocks/misc/he_tnt_bottom.png create mode 100644 libs/textures/blocks/misc/he_tnt_side.png create mode 100644 libs/textures/blocks/misc/he_tnt_top.png create mode 100644 libs/textures/blocks/misc/le_tnt_bottom.png create mode 100644 libs/textures/blocks/misc/le_tnt_side.png create mode 100644 libs/textures/blocks/misc/le_tnt_top.png create mode 100644 libs/textures/blocks/misc/m_tnt_bottom.png create mode 100644 libs/textures/blocks/misc/m_tnt_side.png create mode 100644 libs/textures/blocks/misc/m_tnt_top.png create mode 100644 libs/textures/blocks/misc/pe_tnt_bottom.png create mode 100644 libs/textures/blocks/misc/pe_tnt_side.png create mode 100644 libs/textures/blocks/misc/pe_tnt_top.png create mode 100644 libs/textures/blocks/nether/alduorite_block.png create mode 100644 libs/textures/blocks/nether/alduorite_brick.png create mode 100644 libs/textures/blocks/nether/alduorite_molten_flow.png create mode 100644 libs/textures/blocks/nether/alduorite_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/alduorite_molten_still.png create mode 100644 libs/textures/blocks/nether/alduorite_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/alduorite_ore.png create mode 100644 libs/textures/blocks/nether/amordrine_block.png create mode 100644 libs/textures/blocks/nether/amordrine_brick.png create mode 100644 libs/textures/blocks/nether/amordrine_molten_flow.png create mode 100644 libs/textures/blocks/nether/amordrine_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/amordrine_molten_still.png create mode 100644 libs/textures/blocks/nether/amordrine_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/ceruclase_block.png create mode 100644 libs/textures/blocks/nether/ceruclase_brick.png create mode 100644 libs/textures/blocks/nether/ceruclase_molten_flow.png create mode 100644 libs/textures/blocks/nether/ceruclase_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/ceruclase_molten_still.png create mode 100644 libs/textures/blocks/nether/ceruclase_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/ceruclase_ore.png create mode 100644 libs/textures/blocks/nether/ignatius_block.png create mode 100644 libs/textures/blocks/nether/ignatius_brick.png create mode 100644 libs/textures/blocks/nether/ignatius_molten_flow.png create mode 100644 libs/textures/blocks/nether/ignatius_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/ignatius_molten_still.png create mode 100644 libs/textures/blocks/nether/ignatius_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/ignatius_ore.png create mode 100644 libs/textures/blocks/nether/inolashite_block.png create mode 100644 libs/textures/blocks/nether/inolashite_brick.png create mode 100644 libs/textures/blocks/nether/inolashite_molten_flow.png create mode 100644 libs/textures/blocks/nether/inolashite_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/inolashite_molten_still.png create mode 100644 libs/textures/blocks/nether/inolashite_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/kalendrite_block.png create mode 100644 libs/textures/blocks/nether/kalendrite_brick.png create mode 100644 libs/textures/blocks/nether/kalendrite_molten_flow.png create mode 100644 libs/textures/blocks/nether/kalendrite_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/kalendrite_molten_still.png create mode 100644 libs/textures/blocks/nether/kalendrite_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/kalendrite_ore.png create mode 100644 libs/textures/blocks/nether/lemurite_block.png create mode 100644 libs/textures/blocks/nether/lemurite_brick.png create mode 100644 libs/textures/blocks/nether/lemurite_molten_flow.png create mode 100644 libs/textures/blocks/nether/lemurite_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/lemurite_molten_still.png create mode 100644 libs/textures/blocks/nether/lemurite_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/lemurite_ore.png create mode 100644 libs/textures/blocks/nether/midasium_block.png create mode 100644 libs/textures/blocks/nether/midasium_brick.png create mode 100644 libs/textures/blocks/nether/midasium_molten_flow.png create mode 100644 libs/textures/blocks/nether/midasium_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/midasium_molten_still.png create mode 100644 libs/textures/blocks/nether/midasium_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/midasium_ore.png create mode 100644 libs/textures/blocks/nether/sanguinite_block.png create mode 100644 libs/textures/blocks/nether/sanguinite_brick.png create mode 100644 libs/textures/blocks/nether/sanguinite_molten_flow.png create mode 100644 libs/textures/blocks/nether/sanguinite_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/sanguinite_molten_still.png create mode 100644 libs/textures/blocks/nether/sanguinite_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/sanguinite_ore.png create mode 100644 libs/textures/blocks/nether/shadow_iron_block.png create mode 100644 libs/textures/blocks/nether/shadow_iron_brick.png create mode 100644 libs/textures/blocks/nether/shadow_iron_molten_flow.png create mode 100644 libs/textures/blocks/nether/shadow_iron_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/shadow_iron_molten_still.png create mode 100644 libs/textures/blocks/nether/shadow_iron_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/shadow_iron_ore.png create mode 100644 libs/textures/blocks/nether/shadow_steel_block.png create mode 100644 libs/textures/blocks/nether/shadow_steel_brick.png create mode 100644 libs/textures/blocks/nether/shadow_steel_molten_flow.png create mode 100644 libs/textures/blocks/nether/shadow_steel_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/shadow_steel_molten_still.png create mode 100644 libs/textures/blocks/nether/shadow_steel_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/vulcanite_block.png create mode 100644 libs/textures/blocks/nether/vulcanite_brick.png create mode 100644 libs/textures/blocks/nether/vulcanite_molten_flow.png create mode 100644 libs/textures/blocks/nether/vulcanite_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/vulcanite_molten_still.png create mode 100644 libs/textures/blocks/nether/vulcanite_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/vulcanite_ore.png create mode 100644 libs/textures/blocks/nether/vyroxeres_block.png create mode 100644 libs/textures/blocks/nether/vyroxeres_brick.png create mode 100644 libs/textures/blocks/nether/vyroxeres_molten_flow.png create mode 100644 libs/textures/blocks/nether/vyroxeres_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/nether/vyroxeres_molten_still.png create mode 100644 libs/textures/blocks/nether/vyroxeres_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/nether/vyroxeres_ore.png create mode 100644 libs/textures/blocks/precious/brass_block.png create mode 100644 libs/textures/blocks/precious/brass_brick.png create mode 100644 libs/textures/blocks/precious/brass_molten_flow.png create mode 100644 libs/textures/blocks/precious/brass_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/precious/brass_molten_still.png create mode 100644 libs/textures/blocks/precious/brass_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/precious/electrum_block.png create mode 100644 libs/textures/blocks/precious/electrum_brick.png create mode 100644 libs/textures/blocks/precious/electrum_molten_flow.png create mode 100644 libs/textures/blocks/precious/electrum_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/precious/electrum_molten_still.png create mode 100644 libs/textures/blocks/precious/electrum_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/precious/platinum_block.png create mode 100644 libs/textures/blocks/precious/platinum_brick.png create mode 100644 libs/textures/blocks/precious/platinum_molten_flow.png create mode 100644 libs/textures/blocks/precious/platinum_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/precious/platinum_molten_still.png create mode 100644 libs/textures/blocks/precious/platinum_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/precious/platinum_ore.png create mode 100644 libs/textures/blocks/precious/platinum_ore_overlay.png create mode 100644 libs/textures/blocks/precious/silver_block.png create mode 100644 libs/textures/blocks/precious/silver_brick.png create mode 100644 libs/textures/blocks/precious/silver_molten_flow.png create mode 100644 libs/textures/blocks/precious/silver_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/precious/silver_molten_still.png create mode 100644 libs/textures/blocks/precious/silver_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/precious/silver_ore.png create mode 100644 libs/textures/blocks/precious/silver_ore_overlay.png create mode 100644 libs/textures/blocks/precious/zinc_block.png create mode 100644 libs/textures/blocks/precious/zinc_brick.png create mode 100644 libs/textures/blocks/precious/zinc_molten_flow.png create mode 100644 libs/textures/blocks/precious/zinc_molten_flow.png.mcmeta create mode 100644 libs/textures/blocks/precious/zinc_molten_still.png create mode 100644 libs/textures/blocks/precious/zinc_molten_still.png.mcmeta create mode 100644 libs/textures/blocks/precious/zinc_ore.png create mode 100644 libs/textures/blocks/precious/zinc_ore_overlay.png create mode 100644 libs/textures/blocks/utility/bitumen_block.png create mode 100644 libs/textures/blocks/utility/bitumen_ore.png create mode 100644 libs/textures/blocks/utility/bitumen_ore_overlay.png create mode 100644 libs/textures/blocks/utility/magnesium_block.png create mode 100644 libs/textures/blocks/utility/magnesium_ore.png create mode 100644 libs/textures/blocks/utility/magnesium_ore_overlay.png create mode 100644 libs/textures/blocks/utility/phosphorite_block.png create mode 100644 libs/textures/blocks/utility/phosphorite_ore.png create mode 100644 libs/textures/blocks/utility/phosphorite_ore_overlay.png create mode 100644 libs/textures/blocks/utility/potash_block.png create mode 100644 libs/textures/blocks/utility/potash_ore.png create mode 100644 libs/textures/blocks/utility/potash_ore_overlay.png create mode 100644 libs/textures/blocks/utility/saltpeter_block.png create mode 100644 libs/textures/blocks/utility/saltpeter_ore.png create mode 100644 libs/textures/blocks/utility/saltpeter_ore_overlay.png create mode 100644 libs/textures/blocks/utility/sulfur_block.png create mode 100644 libs/textures/blocks/utility/sulfur_ore.png create mode 100644 libs/textures/blocks/utility/sulfur_ore_overlay.png create mode 100644 libs/textures/blocks/vanilla/gold_brick.png create mode 100644 libs/textures/blocks/vanilla/iron_brick.png create mode 100644 libs/textures/gui/alloyer.png create mode 100644 libs/textures/gui/crusher-minium.png create mode 100644 libs/textures/gui/crusher.png create mode 100644 libs/textures/gui/drawer.png create mode 100644 libs/textures/gui/forge.png create mode 100644 libs/textures/gui/nei_alloyer.png create mode 100644 libs/textures/gui/nei_crusher.png create mode 100644 libs/textures/items/base/angmallen_axe.png create mode 100644 libs/textures/items/base/angmallen_boots.png create mode 100644 libs/textures/items/base/angmallen_bucket_fill.png create mode 100644 libs/textures/items/base/angmallen_chest.png create mode 100644 libs/textures/items/base/angmallen_dust.png create mode 100644 libs/textures/items/base/angmallen_helmet.png create mode 100644 libs/textures/items/base/angmallen_hoe.png create mode 100644 libs/textures/items/base/angmallen_ingot.png create mode 100644 libs/textures/items/base/angmallen_legs.png create mode 100644 libs/textures/items/base/angmallen_pick.png create mode 100644 libs/textures/items/base/angmallen_shovel.png create mode 100644 libs/textures/items/base/angmallen_sword.png create mode 100644 libs/textures/items/base/bronze_axe.png create mode 100644 libs/textures/items/base/bronze_boots.png create mode 100644 libs/textures/items/base/bronze_bucket_fill.png create mode 100644 libs/textures/items/base/bronze_chest.png create mode 100644 libs/textures/items/base/bronze_dust.png create mode 100644 libs/textures/items/base/bronze_helmet.png create mode 100644 libs/textures/items/base/bronze_hoe.png create mode 100644 libs/textures/items/base/bronze_ingot.png create mode 100644 libs/textures/items/base/bronze_legs.png create mode 100644 libs/textures/items/base/bronze_pick.png create mode 100644 libs/textures/items/base/bronze_shovel.png create mode 100644 libs/textures/items/base/bronze_sword.png create mode 100644 libs/textures/items/base/copper_axe.png create mode 100644 libs/textures/items/base/copper_boots.png create mode 100644 libs/textures/items/base/copper_bucket_fill.png create mode 100644 libs/textures/items/base/copper_chest.png create mode 100644 libs/textures/items/base/copper_dust.png create mode 100644 libs/textures/items/base/copper_helmet.png create mode 100644 libs/textures/items/base/copper_hoe.png create mode 100644 libs/textures/items/base/copper_ingot.png create mode 100644 libs/textures/items/base/copper_legs.png create mode 100644 libs/textures/items/base/copper_pick.png create mode 100644 libs/textures/items/base/copper_shovel.png create mode 100644 libs/textures/items/base/copper_sword.png create mode 100644 libs/textures/items/base/damascus_steel_axe.png create mode 100644 libs/textures/items/base/damascus_steel_boots.png create mode 100644 libs/textures/items/base/damascus_steel_bucket_fill.png create mode 100644 libs/textures/items/base/damascus_steel_chest.png create mode 100644 libs/textures/items/base/damascus_steel_dust.png create mode 100644 libs/textures/items/base/damascus_steel_helmet.png create mode 100644 libs/textures/items/base/damascus_steel_hoe.png create mode 100644 libs/textures/items/base/damascus_steel_ingot.png create mode 100644 libs/textures/items/base/damascus_steel_legs.png create mode 100644 libs/textures/items/base/damascus_steel_pick.png create mode 100644 libs/textures/items/base/damascus_steel_shovel.png create mode 100644 libs/textures/items/base/damascus_steel_sword.png create mode 100644 libs/textures/items/base/hepatizon_axe.png create mode 100644 libs/textures/items/base/hepatizon_boots.png create mode 100644 libs/textures/items/base/hepatizon_bucket_fill.png create mode 100644 libs/textures/items/base/hepatizon_chest.png create mode 100644 libs/textures/items/base/hepatizon_dust.png create mode 100644 libs/textures/items/base/hepatizon_helmet.png create mode 100644 libs/textures/items/base/hepatizon_hoe.png create mode 100644 libs/textures/items/base/hepatizon_ingot.png create mode 100644 libs/textures/items/base/hepatizon_legs.png create mode 100644 libs/textures/items/base/hepatizon_pick.png create mode 100644 libs/textures/items/base/hepatizon_shovel.png create mode 100644 libs/textures/items/base/hepatizon_sword.png create mode 100644 libs/textures/items/base/manganese_bucket_fill.png create mode 100644 libs/textures/items/base/manganese_dust.png create mode 100644 libs/textures/items/base/manganese_ingot.png create mode 100644 libs/textures/items/base/steel_axe.png create mode 100644 libs/textures/items/base/steel_boots.png create mode 100644 libs/textures/items/base/steel_bucket_fill.png create mode 100644 libs/textures/items/base/steel_chest.png create mode 100644 libs/textures/items/base/steel_dust.png create mode 100644 libs/textures/items/base/steel_helmet.png create mode 100644 libs/textures/items/base/steel_hoe.png create mode 100644 libs/textures/items/base/steel_ingot.png create mode 100644 libs/textures/items/base/steel_legs.png create mode 100644 libs/textures/items/base/steel_pick.png create mode 100644 libs/textures/items/base/steel_shovel.png create mode 100644 libs/textures/items/base/steel_sword.png create mode 100644 libs/textures/items/base/tin_bucket_fill.png create mode 100644 libs/textures/items/base/tin_dust.png create mode 100644 libs/textures/items/base/tin_ingot.png create mode 100644 libs/textures/items/ender/desichalkos_axe.png create mode 100644 libs/textures/items/ender/desichalkos_boots.png create mode 100644 libs/textures/items/ender/desichalkos_bucket_fill.png create mode 100644 libs/textures/items/ender/desichalkos_chest.png create mode 100644 libs/textures/items/ender/desichalkos_dust.png create mode 100644 libs/textures/items/ender/desichalkos_helmet.png create mode 100644 libs/textures/items/ender/desichalkos_hoe.png create mode 100644 libs/textures/items/ender/desichalkos_ingot.png create mode 100644 libs/textures/items/ender/desichalkos_legs.png create mode 100644 libs/textures/items/ender/desichalkos_pick.png create mode 100644 libs/textures/items/ender/desichalkos_shovel.png create mode 100644 libs/textures/items/ender/desichalkos_sword.png create mode 100644 libs/textures/items/ender/eximite_axe.png create mode 100644 libs/textures/items/ender/eximite_boots.png create mode 100644 libs/textures/items/ender/eximite_bucket_fill.png create mode 100644 libs/textures/items/ender/eximite_chest.png create mode 100644 libs/textures/items/ender/eximite_dust.png create mode 100644 libs/textures/items/ender/eximite_helmet.png create mode 100644 libs/textures/items/ender/eximite_hoe.png create mode 100644 libs/textures/items/ender/eximite_ingot.png create mode 100644 libs/textures/items/ender/eximite_legs.png create mode 100644 libs/textures/items/ender/eximite_pick.png create mode 100644 libs/textures/items/ender/eximite_shovel.png create mode 100644 libs/textures/items/ender/eximite_sword.png create mode 100644 libs/textures/items/ender/meutoite_bucket_fill.png create mode 100644 libs/textures/items/ender/meutoite_dust.png create mode 100644 libs/textures/items/ender/meutoite_ingot.png create mode 100644 libs/textures/items/fantasy/adamantine_axe.png create mode 100644 libs/textures/items/fantasy/adamantine_boots.png create mode 100644 libs/textures/items/fantasy/adamantine_bucket_fill.png create mode 100644 libs/textures/items/fantasy/adamantine_chest.png create mode 100644 libs/textures/items/fantasy/adamantine_dust.png create mode 100644 libs/textures/items/fantasy/adamantine_helmet.png create mode 100644 libs/textures/items/fantasy/adamantine_hoe.png create mode 100644 libs/textures/items/fantasy/adamantine_ingot.png create mode 100644 libs/textures/items/fantasy/adamantine_legs.png create mode 100644 libs/textures/items/fantasy/adamantine_pick.png create mode 100644 libs/textures/items/fantasy/adamantine_shovel.png create mode 100644 libs/textures/items/fantasy/adamantine_sword.png create mode 100644 libs/textures/items/fantasy/astral_silver_axe.png create mode 100644 libs/textures/items/fantasy/astral_silver_boots.png create mode 100644 libs/textures/items/fantasy/astral_silver_bucket_fill.png create mode 100644 libs/textures/items/fantasy/astral_silver_chest.png create mode 100644 libs/textures/items/fantasy/astral_silver_dust.png create mode 100644 libs/textures/items/fantasy/astral_silver_helmet.png create mode 100644 libs/textures/items/fantasy/astral_silver_hoe.png create mode 100644 libs/textures/items/fantasy/astral_silver_ingot.png create mode 100644 libs/textures/items/fantasy/astral_silver_legs.png create mode 100644 libs/textures/items/fantasy/astral_silver_pick.png create mode 100644 libs/textures/items/fantasy/astral_silver_shovel.png create mode 100644 libs/textures/items/fantasy/astral_silver_sword.png create mode 100644 libs/textures/items/fantasy/atlarus_axe.png create mode 100644 libs/textures/items/fantasy/atlarus_boots.png create mode 100644 libs/textures/items/fantasy/atlarus_bucket_fill.png create mode 100644 libs/textures/items/fantasy/atlarus_chest.png create mode 100644 libs/textures/items/fantasy/atlarus_dust.png create mode 100644 libs/textures/items/fantasy/atlarus_helmet.png create mode 100644 libs/textures/items/fantasy/atlarus_hoe.png create mode 100644 libs/textures/items/fantasy/atlarus_ingot.png create mode 100644 libs/textures/items/fantasy/atlarus_legs.png create mode 100644 libs/textures/items/fantasy/atlarus_pick.png create mode 100644 libs/textures/items/fantasy/atlarus_shovel.png create mode 100644 libs/textures/items/fantasy/atlarus_sword.png create mode 100644 libs/textures/items/fantasy/black_steel_axe.png create mode 100644 libs/textures/items/fantasy/black_steel_boots.png create mode 100644 libs/textures/items/fantasy/black_steel_bucket_fill.png create mode 100644 libs/textures/items/fantasy/black_steel_chest.png create mode 100644 libs/textures/items/fantasy/black_steel_dust.png create mode 100644 libs/textures/items/fantasy/black_steel_helmet.png create mode 100644 libs/textures/items/fantasy/black_steel_hoe.png create mode 100644 libs/textures/items/fantasy/black_steel_ingot.png create mode 100644 libs/textures/items/fantasy/black_steel_legs.png create mode 100644 libs/textures/items/fantasy/black_steel_pick.png create mode 100644 libs/textures/items/fantasy/black_steel_shovel.png create mode 100644 libs/textures/items/fantasy/black_steel_sword.png create mode 100644 libs/textures/items/fantasy/carmot_axe.png create mode 100644 libs/textures/items/fantasy/carmot_boots.png create mode 100644 libs/textures/items/fantasy/carmot_bucket_fill.png create mode 100644 libs/textures/items/fantasy/carmot_chest.png create mode 100644 libs/textures/items/fantasy/carmot_dust.png create mode 100644 libs/textures/items/fantasy/carmot_helmet.png create mode 100644 libs/textures/items/fantasy/carmot_hoe.png create mode 100644 libs/textures/items/fantasy/carmot_ingot.png create mode 100644 libs/textures/items/fantasy/carmot_legs.png create mode 100644 libs/textures/items/fantasy/carmot_pick.png create mode 100644 libs/textures/items/fantasy/carmot_shovel.png create mode 100644 libs/textures/items/fantasy/carmot_sword.png create mode 100644 libs/textures/items/fantasy/celenegil_axe.png create mode 100644 libs/textures/items/fantasy/celenegil_boots.png create mode 100644 libs/textures/items/fantasy/celenegil_bucket_fill.png create mode 100644 libs/textures/items/fantasy/celenegil_chest.png create mode 100644 libs/textures/items/fantasy/celenegil_dust.png create mode 100644 libs/textures/items/fantasy/celenegil_helmet.png create mode 100644 libs/textures/items/fantasy/celenegil_hoe.png create mode 100644 libs/textures/items/fantasy/celenegil_ingot.png create mode 100644 libs/textures/items/fantasy/celenegil_legs.png create mode 100644 libs/textures/items/fantasy/celenegil_pick.png create mode 100644 libs/textures/items/fantasy/celenegil_shovel.png create mode 100644 libs/textures/items/fantasy/celenegil_sword.png create mode 100644 libs/textures/items/fantasy/deep_iron_axe.png create mode 100644 libs/textures/items/fantasy/deep_iron_boots.png create mode 100644 libs/textures/items/fantasy/deep_iron_bucket_fill.png create mode 100644 libs/textures/items/fantasy/deep_iron_chest.png create mode 100644 libs/textures/items/fantasy/deep_iron_dust.png create mode 100644 libs/textures/items/fantasy/deep_iron_helmet.png create mode 100644 libs/textures/items/fantasy/deep_iron_hoe.png create mode 100644 libs/textures/items/fantasy/deep_iron_ingot.png create mode 100644 libs/textures/items/fantasy/deep_iron_legs.png create mode 100644 libs/textures/items/fantasy/deep_iron_pick.png create mode 100644 libs/textures/items/fantasy/deep_iron_shovel.png create mode 100644 libs/textures/items/fantasy/deep_iron_sword.png create mode 100644 libs/textures/items/fantasy/haderoth_axe.png create mode 100644 libs/textures/items/fantasy/haderoth_boots.png create mode 100644 libs/textures/items/fantasy/haderoth_bucket_fill.png create mode 100644 libs/textures/items/fantasy/haderoth_chest.png create mode 100644 libs/textures/items/fantasy/haderoth_dust.png create mode 100644 libs/textures/items/fantasy/haderoth_helmet.png create mode 100644 libs/textures/items/fantasy/haderoth_hoe.png create mode 100644 libs/textures/items/fantasy/haderoth_ingot.png create mode 100644 libs/textures/items/fantasy/haderoth_legs.png create mode 100644 libs/textures/items/fantasy/haderoth_pick.png create mode 100644 libs/textures/items/fantasy/haderoth_shovel.png create mode 100644 libs/textures/items/fantasy/haderoth_sword.png create mode 100644 libs/textures/items/fantasy/infuscolium_bucket_fill.png create mode 100644 libs/textures/items/fantasy/infuscolium_dust.png create mode 100644 libs/textures/items/fantasy/infuscolium_ingot.png create mode 100644 libs/textures/items/fantasy/mithril_axe.png create mode 100644 libs/textures/items/fantasy/mithril_boots.png create mode 100644 libs/textures/items/fantasy/mithril_bucket_fill.png create mode 100644 libs/textures/items/fantasy/mithril_chest.png create mode 100644 libs/textures/items/fantasy/mithril_dust.png create mode 100644 libs/textures/items/fantasy/mithril_helmet.png create mode 100644 libs/textures/items/fantasy/mithril_hoe.png create mode 100644 libs/textures/items/fantasy/mithril_ingot.png create mode 100644 libs/textures/items/fantasy/mithril_legs.png create mode 100644 libs/textures/items/fantasy/mithril_pick.png create mode 100644 libs/textures/items/fantasy/mithril_shovel.png create mode 100644 libs/textures/items/fantasy/mithril_sword.png create mode 100644 libs/textures/items/fantasy/orichalcum_axe.png create mode 100644 libs/textures/items/fantasy/orichalcum_boots.png create mode 100644 libs/textures/items/fantasy/orichalcum_bucket_fill.png create mode 100644 libs/textures/items/fantasy/orichalcum_chest.png create mode 100644 libs/textures/items/fantasy/orichalcum_dust.png create mode 100644 libs/textures/items/fantasy/orichalcum_helmet.png create mode 100644 libs/textures/items/fantasy/orichalcum_hoe.png create mode 100644 libs/textures/items/fantasy/orichalcum_ingot.png create mode 100644 libs/textures/items/fantasy/orichalcum_legs.png create mode 100644 libs/textures/items/fantasy/orichalcum_pick.png create mode 100644 libs/textures/items/fantasy/orichalcum_shovel.png create mode 100644 libs/textures/items/fantasy/orichalcum_sword.png create mode 100644 libs/textures/items/fantasy/oureclase_axe.png create mode 100644 libs/textures/items/fantasy/oureclase_boots.png create mode 100644 libs/textures/items/fantasy/oureclase_bucket_fill.png create mode 100644 libs/textures/items/fantasy/oureclase_chest.png create mode 100644 libs/textures/items/fantasy/oureclase_dust.png create mode 100644 libs/textures/items/fantasy/oureclase_helmet.png create mode 100644 libs/textures/items/fantasy/oureclase_hoe.png create mode 100644 libs/textures/items/fantasy/oureclase_ingot.png create mode 100644 libs/textures/items/fantasy/oureclase_legs.png create mode 100644 libs/textures/items/fantasy/oureclase_pick.png create mode 100644 libs/textures/items/fantasy/oureclase_shovel.png create mode 100644 libs/textures/items/fantasy/oureclase_sword.png create mode 100644 libs/textures/items/fantasy/prometheum_axe.png create mode 100644 libs/textures/items/fantasy/prometheum_boots.png create mode 100644 libs/textures/items/fantasy/prometheum_bucket_fill.png create mode 100644 libs/textures/items/fantasy/prometheum_chest.png create mode 100644 libs/textures/items/fantasy/prometheum_dust.png create mode 100644 libs/textures/items/fantasy/prometheum_helmet.png create mode 100644 libs/textures/items/fantasy/prometheum_hoe.png create mode 100644 libs/textures/items/fantasy/prometheum_ingot.png create mode 100644 libs/textures/items/fantasy/prometheum_legs.png create mode 100644 libs/textures/items/fantasy/prometheum_pick.png create mode 100644 libs/textures/items/fantasy/prometheum_shovel.png create mode 100644 libs/textures/items/fantasy/prometheum_sword.png create mode 100644 libs/textures/items/fantasy/quicksilver_axe.png create mode 100644 libs/textures/items/fantasy/quicksilver_boots.png create mode 100644 libs/textures/items/fantasy/quicksilver_bucket_fill.png create mode 100644 libs/textures/items/fantasy/quicksilver_chest.png create mode 100644 libs/textures/items/fantasy/quicksilver_dust.png create mode 100644 libs/textures/items/fantasy/quicksilver_helmet.png create mode 100644 libs/textures/items/fantasy/quicksilver_hoe.png create mode 100644 libs/textures/items/fantasy/quicksilver_ingot.png create mode 100644 libs/textures/items/fantasy/quicksilver_legs.png create mode 100644 libs/textures/items/fantasy/quicksilver_pick.png create mode 100644 libs/textures/items/fantasy/quicksilver_shovel.png create mode 100644 libs/textures/items/fantasy/quicksilver_sword.png create mode 100644 libs/textures/items/fantasy/rubracium_bucket_fill.png create mode 100644 libs/textures/items/fantasy/rubracium_dust.png create mode 100644 libs/textures/items/fantasy/rubracium_ingot.png create mode 100644 libs/textures/items/fantasy/tartarite_axe.png create mode 100644 libs/textures/items/fantasy/tartarite_boots.png create mode 100644 libs/textures/items/fantasy/tartarite_bucket_fill.png create mode 100644 libs/textures/items/fantasy/tartarite_chest.png create mode 100644 libs/textures/items/fantasy/tartarite_dust.png create mode 100644 libs/textures/items/fantasy/tartarite_helmet.png create mode 100644 libs/textures/items/fantasy/tartarite_hoe.png create mode 100644 libs/textures/items/fantasy/tartarite_ingot.png create mode 100644 libs/textures/items/fantasy/tartarite_legs.png create mode 100644 libs/textures/items/fantasy/tartarite_pick.png create mode 100644 libs/textures/items/fantasy/tartarite_shovel.png create mode 100644 libs/textures/items/fantasy/tartarite_sword.png create mode 100644 libs/textures/items/metal_item_default.png create mode 100644 libs/textures/items/misc/fertilizer.png create mode 100644 libs/textures/items/misc/tar.png create mode 100644 libs/textures/items/nether/alduorite_bucket_fill.png create mode 100644 libs/textures/items/nether/alduorite_dust.png create mode 100644 libs/textures/items/nether/alduorite_ingot.png create mode 100644 libs/textures/items/nether/amordrine_axe.png create mode 100644 libs/textures/items/nether/amordrine_boots.png create mode 100644 libs/textures/items/nether/amordrine_bucket_fill.png create mode 100644 libs/textures/items/nether/amordrine_chest.png create mode 100644 libs/textures/items/nether/amordrine_dust.png create mode 100644 libs/textures/items/nether/amordrine_helmet.png create mode 100644 libs/textures/items/nether/amordrine_hoe.png create mode 100644 libs/textures/items/nether/amordrine_ingot.png create mode 100644 libs/textures/items/nether/amordrine_legs.png create mode 100644 libs/textures/items/nether/amordrine_pick.png create mode 100644 libs/textures/items/nether/amordrine_shovel.png create mode 100644 libs/textures/items/nether/amordrine_sword.png create mode 100644 libs/textures/items/nether/ceruclase_axe.png create mode 100644 libs/textures/items/nether/ceruclase_boots.png create mode 100644 libs/textures/items/nether/ceruclase_bucket_fill.png create mode 100644 libs/textures/items/nether/ceruclase_chest.png create mode 100644 libs/textures/items/nether/ceruclase_dust.png create mode 100644 libs/textures/items/nether/ceruclase_helmet.png create mode 100644 libs/textures/items/nether/ceruclase_hoe.png create mode 100644 libs/textures/items/nether/ceruclase_ingot.png create mode 100644 libs/textures/items/nether/ceruclase_legs.png create mode 100644 libs/textures/items/nether/ceruclase_pick.png create mode 100644 libs/textures/items/nether/ceruclase_shovel.png create mode 100644 libs/textures/items/nether/ceruclase_sword.png create mode 100644 libs/textures/items/nether/ignatius_axe.png create mode 100644 libs/textures/items/nether/ignatius_boots.png create mode 100644 libs/textures/items/nether/ignatius_bucket_fill.png create mode 100644 libs/textures/items/nether/ignatius_chest.png create mode 100644 libs/textures/items/nether/ignatius_dust.png create mode 100644 libs/textures/items/nether/ignatius_helmet.png create mode 100644 libs/textures/items/nether/ignatius_hoe.png create mode 100644 libs/textures/items/nether/ignatius_ingot.png create mode 100644 libs/textures/items/nether/ignatius_legs.png create mode 100644 libs/textures/items/nether/ignatius_pick.png create mode 100644 libs/textures/items/nether/ignatius_shovel.png create mode 100644 libs/textures/items/nether/ignatius_sword.png create mode 100644 libs/textures/items/nether/inolashite_axe.png create mode 100644 libs/textures/items/nether/inolashite_boots.png create mode 100644 libs/textures/items/nether/inolashite_bucket_fill.png create mode 100644 libs/textures/items/nether/inolashite_chest.png create mode 100644 libs/textures/items/nether/inolashite_dust.png create mode 100644 libs/textures/items/nether/inolashite_helmet.png create mode 100644 libs/textures/items/nether/inolashite_hoe.png create mode 100644 libs/textures/items/nether/inolashite_ingot.png create mode 100644 libs/textures/items/nether/inolashite_legs.png create mode 100644 libs/textures/items/nether/inolashite_pick.png create mode 100644 libs/textures/items/nether/inolashite_shovel.png create mode 100644 libs/textures/items/nether/inolashite_sword.png create mode 100644 libs/textures/items/nether/kalendrite_axe.png create mode 100644 libs/textures/items/nether/kalendrite_boots.png create mode 100644 libs/textures/items/nether/kalendrite_bucket_fill.png create mode 100644 libs/textures/items/nether/kalendrite_chest.png create mode 100644 libs/textures/items/nether/kalendrite_dust.png create mode 100644 libs/textures/items/nether/kalendrite_helmet.png create mode 100644 libs/textures/items/nether/kalendrite_hoe.png create mode 100644 libs/textures/items/nether/kalendrite_ingot.png create mode 100644 libs/textures/items/nether/kalendrite_legs.png create mode 100644 libs/textures/items/nether/kalendrite_pick.png create mode 100644 libs/textures/items/nether/kalendrite_shovel.png create mode 100644 libs/textures/items/nether/kalendrite_sword.png create mode 100644 libs/textures/items/nether/lemurite_bucket_fill.png create mode 100644 libs/textures/items/nether/lemurite_dust.png create mode 100644 libs/textures/items/nether/lemurite_ingot.png create mode 100644 libs/textures/items/nether/midasium_axe.png create mode 100644 libs/textures/items/nether/midasium_boots.png create mode 100644 libs/textures/items/nether/midasium_bucket_fill.png create mode 100644 libs/textures/items/nether/midasium_chest.png create mode 100644 libs/textures/items/nether/midasium_dust.png create mode 100644 libs/textures/items/nether/midasium_helmet.png create mode 100644 libs/textures/items/nether/midasium_hoe.png create mode 100644 libs/textures/items/nether/midasium_ingot.png create mode 100644 libs/textures/items/nether/midasium_legs.png create mode 100644 libs/textures/items/nether/midasium_pick.png create mode 100644 libs/textures/items/nether/midasium_shovel.png create mode 100644 libs/textures/items/nether/midasium_sword.png create mode 100644 libs/textures/items/nether/sanguinite_axe.png create mode 100644 libs/textures/items/nether/sanguinite_boots.png create mode 100644 libs/textures/items/nether/sanguinite_bucket_fill.png create mode 100644 libs/textures/items/nether/sanguinite_chest.png create mode 100644 libs/textures/items/nether/sanguinite_dust.png create mode 100644 libs/textures/items/nether/sanguinite_helmet.png create mode 100644 libs/textures/items/nether/sanguinite_hoe.png create mode 100644 libs/textures/items/nether/sanguinite_ingot.png create mode 100644 libs/textures/items/nether/sanguinite_legs.png create mode 100644 libs/textures/items/nether/sanguinite_pick.png create mode 100644 libs/textures/items/nether/sanguinite_shovel.png create mode 100644 libs/textures/items/nether/sanguinite_sword.png create mode 100644 libs/textures/items/nether/shadow_iron_axe.png create mode 100644 libs/textures/items/nether/shadow_iron_boots.png create mode 100644 libs/textures/items/nether/shadow_iron_bucket_fill.png create mode 100644 libs/textures/items/nether/shadow_iron_chest.png create mode 100644 libs/textures/items/nether/shadow_iron_dust.png create mode 100644 libs/textures/items/nether/shadow_iron_helmet.png create mode 100644 libs/textures/items/nether/shadow_iron_hoe.png create mode 100644 libs/textures/items/nether/shadow_iron_ingot.png create mode 100644 libs/textures/items/nether/shadow_iron_legs.png create mode 100644 libs/textures/items/nether/shadow_iron_pick.png create mode 100644 libs/textures/items/nether/shadow_iron_shovel.png create mode 100644 libs/textures/items/nether/shadow_iron_sword.png create mode 100644 libs/textures/items/nether/shadow_steel_axe.png create mode 100644 libs/textures/items/nether/shadow_steel_boots.png create mode 100644 libs/textures/items/nether/shadow_steel_bucket_fill.png create mode 100644 libs/textures/items/nether/shadow_steel_chest.png create mode 100644 libs/textures/items/nether/shadow_steel_dust.png create mode 100644 libs/textures/items/nether/shadow_steel_helmet.png create mode 100644 libs/textures/items/nether/shadow_steel_hoe.png create mode 100644 libs/textures/items/nether/shadow_steel_ingot.png create mode 100644 libs/textures/items/nether/shadow_steel_legs.png create mode 100644 libs/textures/items/nether/shadow_steel_pick.png create mode 100644 libs/textures/items/nether/shadow_steel_shovel.png create mode 100644 libs/textures/items/nether/shadow_steel_sword.png create mode 100644 libs/textures/items/nether/vulcanite_axe.png create mode 100644 libs/textures/items/nether/vulcanite_boots.png create mode 100644 libs/textures/items/nether/vulcanite_bucket_fill.png create mode 100644 libs/textures/items/nether/vulcanite_chest.png create mode 100644 libs/textures/items/nether/vulcanite_dust.png create mode 100644 libs/textures/items/nether/vulcanite_helmet.png create mode 100644 libs/textures/items/nether/vulcanite_hoe.png create mode 100644 libs/textures/items/nether/vulcanite_ingot.png create mode 100644 libs/textures/items/nether/vulcanite_legs.png create mode 100644 libs/textures/items/nether/vulcanite_pick.png create mode 100644 libs/textures/items/nether/vulcanite_shovel.png create mode 100644 libs/textures/items/nether/vulcanite_sword.png create mode 100644 libs/textures/items/nether/vyroxeres_axe.png create mode 100644 libs/textures/items/nether/vyroxeres_boots.png create mode 100644 libs/textures/items/nether/vyroxeres_bucket_fill.png create mode 100644 libs/textures/items/nether/vyroxeres_chest.png create mode 100644 libs/textures/items/nether/vyroxeres_dust.png create mode 100644 libs/textures/items/nether/vyroxeres_helmet.png create mode 100644 libs/textures/items/nether/vyroxeres_hoe.png create mode 100644 libs/textures/items/nether/vyroxeres_ingot.png create mode 100644 libs/textures/items/nether/vyroxeres_legs.png create mode 100644 libs/textures/items/nether/vyroxeres_pick.png create mode 100644 libs/textures/items/nether/vyroxeres_shovel.png create mode 100644 libs/textures/items/nether/vyroxeres_sword.png create mode 100644 libs/textures/items/precious/brass_axe.png create mode 100644 libs/textures/items/precious/brass_boots.png create mode 100644 libs/textures/items/precious/brass_bucket_fill.png create mode 100644 libs/textures/items/precious/brass_chest.png create mode 100644 libs/textures/items/precious/brass_dust.png create mode 100644 libs/textures/items/precious/brass_helmet.png create mode 100644 libs/textures/items/precious/brass_hoe.png create mode 100644 libs/textures/items/precious/brass_ingot.png create mode 100644 libs/textures/items/precious/brass_legs.png create mode 100644 libs/textures/items/precious/brass_pick.png create mode 100644 libs/textures/items/precious/brass_shovel.png create mode 100644 libs/textures/items/precious/brass_sword.png create mode 100644 libs/textures/items/precious/electrum_axe.png create mode 100644 libs/textures/items/precious/electrum_boots.png create mode 100644 libs/textures/items/precious/electrum_bucket_fill.png create mode 100644 libs/textures/items/precious/electrum_chest.png create mode 100644 libs/textures/items/precious/electrum_dust.png create mode 100644 libs/textures/items/precious/electrum_helmet.png create mode 100644 libs/textures/items/precious/electrum_hoe.png create mode 100644 libs/textures/items/precious/electrum_ingot.png create mode 100644 libs/textures/items/precious/electrum_legs.png create mode 100644 libs/textures/items/precious/electrum_pick.png create mode 100644 libs/textures/items/precious/electrum_shovel.png create mode 100644 libs/textures/items/precious/electrum_sword.png create mode 100644 libs/textures/items/precious/platinum_axe.png create mode 100644 libs/textures/items/precious/platinum_boots.png create mode 100644 libs/textures/items/precious/platinum_bucket_fill.png create mode 100644 libs/textures/items/precious/platinum_chest.png create mode 100644 libs/textures/items/precious/platinum_dust.png create mode 100644 libs/textures/items/precious/platinum_helmet.png create mode 100644 libs/textures/items/precious/platinum_hoe.png create mode 100644 libs/textures/items/precious/platinum_ingot.png create mode 100644 libs/textures/items/precious/platinum_legs.png create mode 100644 libs/textures/items/precious/platinum_pick.png create mode 100644 libs/textures/items/precious/platinum_shovel.png create mode 100644 libs/textures/items/precious/platinum_sword.png create mode 100644 libs/textures/items/precious/silver_axe.png create mode 100644 libs/textures/items/precious/silver_boots.png create mode 100644 libs/textures/items/precious/silver_bucket_fill.png create mode 100644 libs/textures/items/precious/silver_chest.png create mode 100644 libs/textures/items/precious/silver_dust.png create mode 100644 libs/textures/items/precious/silver_helmet.png create mode 100644 libs/textures/items/precious/silver_hoe.png create mode 100644 libs/textures/items/precious/silver_ingot.png create mode 100644 libs/textures/items/precious/silver_legs.png create mode 100644 libs/textures/items/precious/silver_pick.png create mode 100644 libs/textures/items/precious/silver_shovel.png create mode 100644 libs/textures/items/precious/silver_sword.png create mode 100644 libs/textures/items/precious/zinc_bucket_fill.png create mode 100644 libs/textures/items/precious/zinc_dust.png create mode 100644 libs/textures/items/precious/zinc_ingot.png create mode 100644 libs/textures/items/utility/bitumen.png create mode 100644 libs/textures/items/utility/magnesium.png create mode 100644 libs/textures/items/utility/phosphorus.png create mode 100644 libs/textures/items/utility/potash.png create mode 100644 libs/textures/items/utility/saltpeter.png create mode 100644 libs/textures/items/utility/sulfur.png create mode 100644 libs/textures/items/vanilla/gold_dust.png create mode 100644 libs/textures/items/vanilla/iron_dust.png create mode 100644 libs/textures/models/armor/base/angmallen_layer_1.png create mode 100644 libs/textures/models/armor/base/angmallen_layer_2.png create mode 100644 libs/textures/models/armor/base/bronze_layer_1.png create mode 100644 libs/textures/models/armor/base/bronze_layer_2.png create mode 100644 libs/textures/models/armor/base/copper_layer_1.png create mode 100644 libs/textures/models/armor/base/copper_layer_2.png create mode 100644 libs/textures/models/armor/base/damascus_steel_layer_1.png create mode 100644 libs/textures/models/armor/base/damascus_steel_layer_2.png create mode 100644 libs/textures/models/armor/base/hepatizon_layer_1.png create mode 100644 libs/textures/models/armor/base/hepatizon_layer_2.png create mode 100644 libs/textures/models/armor/base/steel_layer_1.png create mode 100644 libs/textures/models/armor/base/steel_layer_2.png create mode 100644 libs/textures/models/armor/ender/desichalkos_layer_1.png create mode 100644 libs/textures/models/armor/ender/desichalkos_layer_2.png create mode 100644 libs/textures/models/armor/ender/eximite_layer_1.png create mode 100644 libs/textures/models/armor/ender/eximite_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/adamantine_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/adamantine_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/astral_silver_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/astral_silver_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/atlarus_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/atlarus_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/black_steel_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/black_steel_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/carmot_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/carmot_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/celenegil_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/celenegil_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/deep_iron_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/deep_iron_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/haderoth_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/haderoth_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/mithril_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/mithril_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/orichalcum_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/orichalcum_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/oureclase_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/oureclase_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/prometheum_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/prometheum_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/quicksilver_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/quicksilver_layer_2.png create mode 100644 libs/textures/models/armor/fantasy/tartarite_layer_1.png create mode 100644 libs/textures/models/armor/fantasy/tartarite_layer_2.png create mode 100644 libs/textures/models/armor/nether/amordrine_layer_1.png create mode 100644 libs/textures/models/armor/nether/amordrine_layer_2.png create mode 100644 libs/textures/models/armor/nether/ceruclase_layer_1.png create mode 100644 libs/textures/models/armor/nether/ceruclase_layer_2.png create mode 100644 libs/textures/models/armor/nether/ignatius_layer_1.png create mode 100644 libs/textures/models/armor/nether/ignatius_layer_2.png create mode 100644 libs/textures/models/armor/nether/inolashite_layer_1.png create mode 100644 libs/textures/models/armor/nether/inolashite_layer_2.png create mode 100644 libs/textures/models/armor/nether/kalendrite_layer_1.png create mode 100644 libs/textures/models/armor/nether/kalendrite_layer_2.png create mode 100644 libs/textures/models/armor/nether/midasium_layer_1.png create mode 100644 libs/textures/models/armor/nether/midasium_layer_2.png create mode 100644 libs/textures/models/armor/nether/sanguinite_layer_1.png create mode 100644 libs/textures/models/armor/nether/sanguinite_layer_2.png create mode 100644 libs/textures/models/armor/nether/shadow_iron_layer_1.png create mode 100644 libs/textures/models/armor/nether/shadow_iron_layer_2.png create mode 100644 libs/textures/models/armor/nether/shadow_steel_layer_1.png create mode 100644 libs/textures/models/armor/nether/shadow_steel_layer_2.png create mode 100644 libs/textures/models/armor/nether/vulcanite_layer_1.png create mode 100644 libs/textures/models/armor/nether/vulcanite_layer_2.png create mode 100644 libs/textures/models/armor/nether/vyroxeres_layer_1.png create mode 100644 libs/textures/models/armor/nether/vyroxeres_layer_2.png create mode 100644 libs/textures/models/armor/precious/brass_layer_1.png create mode 100644 libs/textures/models/armor/precious/brass_layer_2.png create mode 100644 libs/textures/models/armor/precious/electrum_layer_1.png create mode 100644 libs/textures/models/armor/precious/electrum_layer_2.png create mode 100644 libs/textures/models/armor/precious/platinum_layer_1.png create mode 100644 libs/textures/models/armor/precious/platinum_layer_2.png create mode 100644 libs/textures/models/armor/precious/silver_layer_1.png create mode 100644 libs/textures/models/armor/precious/silver_layer_2.png create mode 100644 libs/textures/particles/m_particles.png create mode 100644 src/main/java/minefantasy/mf2/block/basic/BlockMithrilOre.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemClaymoreMF.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemClaymoreStats.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemGladius.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemGladiusStats.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemLongswordMF.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemLongswordStats.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemNodachi.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemNodachiStats.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemSaber.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemSaberStats.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemShortsword.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemShortswordStats.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemTrident.java create mode 100644 src/main/java/minefantasy/mf2/item/weapon/ItemTridentStats.java create mode 100644 src/main/resources/assets/minefantasy2/LogoMF2EdK.png create mode 100644 src/main/resources/assets/minefantasy2/textures/blocks/ores/desktop.ini create mode 100644 src/main/resources/assets/minefantasy2/textures/blocks/ores/oreMithril.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/Weapon/standard_longsword.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/component/dwarven_fuel.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/component/ingotDwarfSteel.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/component/ingotEmerald.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/component/ingotMithril21312.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/dwarvenforged/dwarvenforged_longsword.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/dwarvenforged/dwarvenforged_longsword_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/dwarvenforged/dwarvenforged_longsword_haft.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/gladius.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_claymore.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_claymore_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_claymore_haft.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_gladius.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_gladius_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_gladius_haft.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_longsword.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_longsword_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_longsword_haft.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_nodachi.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_nodachi_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_nodachi_haft.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_saber.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_saber_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_saber_haft.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_trident.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_trident_detail.png create mode 100644 src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_trident_haft.png create mode 100644 src/main/resources/desktop.ini diff --git a/TODO/Dwarvenforged/DwarvenForgedStyle.java b/TODO/Dwarvenforged/DwarvenForgedStyle.java new file mode 100644 index 00000000..bfd18af6 --- /dev/null +++ b/TODO/Dwarvenforged/DwarvenForgedStyle.java @@ -0,0 +1,79 @@ +package minefantasy.mf2.item.list.styles; + +import minefantasy.mf2.api.armour.ArmourDesign; +import minefantasy.mf2.api.crafting.exotic.SpecialForging; +import minefantasy.mf2.item.archery.EnumBowType; +import minefantasy.mf2.item.archery.ItemBowMF; +import minefantasy.mf2.item.armour.ItemCustomArmour; +import minefantasy.mf2.item.list.CreativeTabMF; +import minefantasy.mf2.item.list.CustomArmourListMF; +import minefantasy.mf2.item.list.CustomToolListMF; +import minefantasy.mf2.item.tool.ItemAxeMF; +import minefantasy.mf2.item.tool.ItemHoeMF; +import minefantasy.mf2.item.tool.ItemPickMF; +import minefantasy.mf2.item.tool.ItemShearsMF; +import minefantasy.mf2.item.tool.ItemSpadeMF; +import minefantasy.mf2.item.tool.advanced.ItemHandpick; +import minefantasy.mf2.item.tool.advanced.ItemHvyPick; +import minefantasy.mf2.item.tool.advanced.ItemHvyShovel; +import minefantasy.mf2.item.tool.advanced.ItemLumberAxe; +import minefantasy.mf2.item.tool.advanced.ItemMattock; +import minefantasy.mf2.item.tool.advanced.ItemScythe; +import minefantasy.mf2.item.tool.advanced.ItemTrowMF; +import minefantasy.mf2.item.tool.crafting.ItemHammer; +import minefantasy.mf2.item.tool.crafting.ItemKnifeMF; +import minefantasy.mf2.item.tool.crafting.ItemNeedle; +import minefantasy.mf2.item.tool.crafting.ItemSaw; +import minefantasy.mf2.item.tool.crafting.ItemSpanner; +import minefantasy.mf2.item.tool.crafting.ItemTongs; +import minefantasy.mf2.item.weapon.ItemBattleaxeMF; +import minefantasy.mf2.item.weapon.ItemDagger; +import minefantasy.mf2.item.weapon.ItemGreatswordMF; +import minefantasy.mf2.item.weapon.ItemHalbeardMF; +import minefantasy.mf2.item.weapon.ItemKatanaMF; +import minefantasy.mf2.item.weapon.ItemLance; +import minefantasy.mf2.item.weapon.ItemMaceMF; +import minefantasy.mf2.item.weapon.ItemSpearMF; +import minefantasy.mf2.item.weapon.ItemSwordMF; +import minefantasy.mf2.item.weapon.ItemWaraxeMF; +import minefantasy.mf2.item.weapon.ItemWarhammerMF; +import minefantasy.mf2.item.weapon.ItemWeaponMF; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraftforge.common.util.EnumHelper; + +public class DwarvenForgedStyle { + public static ToolMaterial dwarvenforged = EnumHelper.addToolMaterial("dwarvenforged", 2, 225, 5.5F, 1.5F, 12); + + public static ItemWeaponMF dwarvenforged_longsword; + + public static ItemPickMF dwarvenforged_pick; + + + + + public static void load() { + String design = "dwarvenforged"; + CreativeTabs tab = CreativeTabMF.tabDwarvenforged; + ToolMaterial mat = dwarvenforged; + float ratingMod = 1.2F; + + + dwarvenforged_longsword = new ItemSwordMF(design + "_longsword", mat, 0, 1F).setCustom(design).setTab(tab) + .modifyBaseDamage(1); + + + // Tools + dwarvenforged_pick = (ItemPickMF) new ItemPickMF(design + "_pick", mat, 0).setCustom(design).setCreativeTab(tab); + + + // Crafters + + + + } + + public static void loadCrafting() { + + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 667288ad6c2b3b87c990ece1267e56f0bcbf3622..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50514 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

-g6JWn+n(Oc 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%0AS21uS?*<%%0dc99Fw~*1d^eZ}OT-cl)Fj^b)X7 z*J1@b=$>m)QTqY~dI`v;?E=cu0+5;C%nqj}*JE3sQq{kN{$$O|j~fPNcR_Vc!c_XD z;ovy()$UDb%dIpJ2*VAtDbval@hmO2ozt+bY;d95Y$JaQ=O@6{VTh+6Nw09tbawjP zI+ket(D=%S+o@}N-Z2za)B26i{HH50{Rd@PI1ayInI8%>36P++e>H2Vv!u#}{4%)!i~O2wiy8pT>%Y#4G4mdRB`4`G8JM`3j?63y&@g(Mk< zy7jmJ7$}GdV5Hsx&g%kjUjLyDC2MNvX6h^o*dFcqx5^><@A62F;@~fG!WLS2@^Mz- zww3gh0=gPDg2~6zj^fqf)-o+9;qFF4FN$Pw9$)aG9nE>AHZjyVKioeLodOvJ6*akw3k>xOZ3A4N#R$ zmlOsF`C%I*_bV(=DUjk}YZ8(=_z}!_{iX-D2VfM*%Q7|$+uZTML`cS;$UG-UU^{pS zeJGB^iY?kC0$Lm=BLmxs&Mx%@>9yxOF%i*jojIbCnOqR1*6imk(Qi}Z+w`q(fY+}A zHMb3*ScGaN7M)eEKuhO`J4trSD) zy=JIT_(V)3brp1oZw+6MasB-I8~j3+eXHnakh~)po7SpEF`7fEP3bv0p?d2aF_Sot zdvY0ta~}IU^u?aebka~tlH)iynMf^=wUvhgQu@F&8K$<{ibaVo5YrK1NoOu+TXf9) zni}D-`Ef2frxzN$NcrMi_Ke%X^bl?3q+ML&lT`lsMiQyX5CZ1awBj4^hmD~@_$~-k z-RD2-AQkagspbHHBM&f*`VTB~d3zVrKNe5@{pP4_{ZVs%UM@FRoe6?R5r_Z@opT!m z^kD4>5eqYa4J3+hwPXFN&fe%o`l-MlCN0T&GY9b-poeL7JsY<2`PqKazV$Nwl+hkV(D>zXHyV8?UGAO&AsJxjb<&1cw{s$h!k_MOP}mldw^QGSDN>!Y?gTII`d6=%{|5{~Ku z7i%WFA3{QcyH(=F&{@mJXVzn~@i&iemv7QxtOKG+Dj`W1cCNU?54@g>IukHtWFKKN z$sbaTMGCa`9IPu+d<0yY!F6v&Z6upz2A!6znby*=dArc_5ILIF7wK1lj+B@Bw~Ad? zF3O9(rM}u`KhW-fFa%};=j2bcD7prKl&&Hcd(B#~RW7&C!IxWa(_BqDD-S?QV~51g z#SQ0$5N*uH1q?HO)E;))1sm@8$)_071Cz_M_3GGTWR(ka>g<0^5di#8yGTdrNMGZ< zUS*9pVl~DRG{#7)sdvN~r5&SwO;a+=ahsvm^hQ0C84b^q?GE3P6~QQ`6sL&=1X7xX z5y~X(i82WxG5P>|Wr7YapgM`pEx+mq!COLLZ!dv0nie6D)(r9T@{QunG8#bptv3!fZ5p&8;v3h-Cv!HA)`{?}gH- zJk=+2R3Guh4wOrvk=_X;_`45T9i6Xu!ODZ)Xfx_8S^Z*7HabtX7J7xR9EYc7o%4QY z9B5Iu$Tx4W0~llsJ}?o~Na5bDe<1OfBtkEAKt}xl1jc``9Z%GW zCbWDDc0YWp3WC*&MnzCtCki9BE5qi&MWjFmv5{{UT68DI8^|tFdi`z#%YsBv{Jsl} zdzg1Lxmt!>dR?7Qavkv>+P%Ha#Oi-RkBcOXDm4tcj>QKbWq?Vuc)H|L-ri%+ZMipEmwoSbR%gJT1uIflwQf3KWbotO!QzBMJlk-e zAmbu!TFOg13yI7iy+vp(kN`UOo`lc##EnhY<+MciAYh`zmYW9l%&Jv#tRneoLDP=q zW5}Db#0|4Zr`m`S7M1ea>@Lq_aqEOE(#7<%8!fa_; zF|uM9d#gB0WIBgP$r$r8l~p9|>$+VaXW^`sNShTW#(JUEX~lFfS7zU#`Z1EFdxiK6|6tT^)1D~oFUhP_#dc=87d>|6FzPII$Eyt% zI7;0Xat00VAkrr{h$@=@b*~nB1|X?i_|1U;o9O%92vKM9;JaO-77ORniCvEVirT{J zYg#qig><2>DePExt)vx1;=Nm_kgtCbk{;Oy;gysxnw6_njw*lLGwbYJCaJ+(J6#? zM*47nKOnW6^f(;7NH-=w&Q4Xy2xOp(AWolkA(?v3!$* z?Pgr%ggUkvw% z$r-5o4NZCih-)Jth`OE@44&6C$Z>zS&!9kJ8tDBQW{O`8eHM>=4LbB0C%0vjK&kkgxd%WK2=tCn?6zV-=tOix9&4fkyRXykfyrgt_!gn+O#ykRr0=vRtbjS4^|WnJuwtyX)=& zQn~C)xu*fP?u=WM#34UWBHE9g482x4S?Pfv6C!BOOplcABb1LAU<7+Hdz91Kp*l4dy`_n z_7nLD4}n+oi}<-!wGE6of6skVg$jHU+;$CK#P?gnP0&1E&Dzla?$k~?@s??EISBz8 zh)yPaN;t0$Hf%k9Q67)2g*dC!oLZMegLw` zFEwkw1l5(rqH?R4KW#Z%2FbKHWB0j9Z9{~Ec@`hQNn5$5uCW+35+1NlBb|EPt;)yL#x`RF>;hcCt}#*?FpXM(^TgL2Mgv3tt*j5dKl38tBDd|$??>3YmBQi7Fz-{f z>Ot?Kc&ke79Q94nrJgauvL^LYdyh8tJ;CT6&v0%(H7VXLA)K*RW*xU$%9yK%`h$M% z7jVtoD|hv0fN;J4kJk$n$PYCHl2;=HCSU0jp}EEz{M}cUGHvBkC}h5<(|Y^_uauH< z3>Ck8S#Vlmx}MYuL}PzMi>3aNZ%4+!&vB#5s@)Rd#vnR1U`qTSnr zbYO=4h7G0HN1>=hI-t}RWT{Iy#Aih-??X^2R8{;v?3QKTkc=CIH;GUh+1mW4X8XcO z1kgDV+ej%Tc+Ltb3gHLr+ACv6 z)}rHTx|(qjknkKT`@UVtG&e}F9m_nup?eYt7H-Mx?sl2wY<`%t`T6?sLGk^Lvc%Ac zIT&BIzJ1y(V+xL)V|Bxb#n^y78r2RbjfK&EJ4WzHW?kE%PbBuTyEU*Vz7- zhg2)ob-MNLff>cGFnZjJF9%bph!0);p8*W|>)rc}hyB;MN7wr+WhVah*{tLS-En<7 z&N=Bec0a-&*&CNYkAc^KE{GW^yUJV`=X20&gFq%fA6>&A7_}=QzAP zWy|74*(JRB))npHUL>fgL>wwk_p);%YV|z4|cI>zDMrCwy>M1-$vv%3O&&wTu8Q zOGK+;&Dph~y{|K@3|iihxqXHW62~We7dTBhP4a$$b@FVprrDN+hHzGJ7Rv?={zYtg z9C_N|;86+@*OaSBE{S-e2^I^Y8!|;8qCBEaBb0lfAtw;1!d?;4U&i;CgKou{#BI(U zVW18iQ8I4ZqKj_Zkg^#^!r5qf6lk1Dt80&6+Z2;(0yJIgu*gLr7UHP7v9gXqb0fiy z42Hfp%U_GqKBLNyd{4~YUa#L~!HfkuBjE0JH}3PyiUz{T-iD~(cD}F03@D|_ypn1S zS!0b;n;QwDq6zshTprdvYZHXt31rv>Fq-hu3Vg-gk3iA2PiKi!Q0eUrSgcCJ(dd4f z7md)gVVlNONK2jz#ChGqoiH4KE&?5sc*~(N-uwq3f%)%))Wy=p^S>GV_0X>BIs({t z9smr%`yYN!1kloTadk3Pb}$62H~9makpB6tlBuEd|8f2+PS$ouQAHj3y-+emDz|=; zjUM--Nv!MuzIs-tZ7R(C(r<>}&W~ALGwIps`k(JN^xrq1NrS#@FiLac4Bilq z8{!Tl%ZLqsO(UnlRZMnFYNs_0@{|`(^3)TL@)Q!!dP#@^y(@rCerbS>eu;>JI;>j2elNMIT{2RXCaCym!6=tktsO^ri@0nQ|*()HQ<>Eu|@K<&Kn;*(4=4<3-t_ zr6Q{$x^ermPP=d8vc)fLBv4ZsyRIK}%1zh`kz!}N>8SP{eNmMi>C+L5 z*h^J6KC-1O#l1!8Oq80wyvD_HYr=6>(Pl2#&~{Ve4^h(L2zY)`-mNwml|H{iz25MR z(*-+S=JQdOU}}t2FwC=^)=F?BR3jdyl#%a$sd7wLB*9$1f88oHw^@>Lc4M+mg~=M7 zL3g+i3q8Ug73IOBZwnqrvdRlZEqE|JIUPR%&K4b|p8P?~^Y{;m-NRydXGsQ9mD+Tu$HuF+I z`1H2jXsnpT;_5=%we#>ifJHsu`1JShx8yqehfOqv*8I?i%?~ozXxRC?TgEP2FY%5S zhcCN|xg`9B{Kouy{3!ea2g=!f*!`?IKPruS=%6&IycK^79avT@K=`xAc++-q>pgZNFzsmG zQEL#D(AZxERmnM+y? z6VyUY)u1cn$_a!URI9jV_&Iuw1Qb-OTAQo1M%zO_Up^~jt593Cv}l`LzpWZ}@H+8^ zTCr4{Z9iW*D@?0yo1Pd_jY8YEVzD;7e!k)+=vL)6UFl2*kbb`ECKwLN4ZC8IHopD~ zRqo(*ij8l@GHoFJcq+?~?vf|nBHhb{6h`#hb7u_dNBMK(OWqbOPC^KDYVwb>W(TO) zr-ZW_82;ctpokExp%yjHpy2S?5sC5Hk+At}h*&*;id#I^W#@SulQen!6tZ}zOPoD4 z{62eW7&p6Ph>*W9z%QH{3KGPI53kuuxcOe{h%qbT1suKD!nf$PUT*zp6#uQCVLrA> zngxUE5P5o!xn`T1e~8T|{H#rA>vEUnJ!0ktr@Qy+8QO2#n(DiKk=jNa`>wVn#<#c- zM~RHynR!@O>*}p+^RK8ngDeF%C&9w2Arc+G|FOy#V6((D0l;ZWfK<--|0$LKr7kK~ zwN*!v!0ZwcX1573umvJ9P!`G*mC=%3f-au@ZiJ)nK~?>@fGn;9hckT%9_!b)wHvyo zW_!VfFYqMsaG$>F*rY9YeCAwQ$S3 z!(?)$IjyGLcJEQ~%c-?8^8y0Fric15Xiq&gaH!+rg#~rJE-S<$f)3m*)T4{?s`$gA z!{)bQ^C9$v{SVwv&WnZ8;0`Kbay$WUj~vZTG|1I zd3HRz;@;-UZD-47iDoe?+HjTahV3mrD~XoBbL2|0{34@NBJz2Wf*9~sp$GPgoD!ig z9nR@i}O0~Pk-e?tzXFhHx%3 z%5P;1bR9hdE92@LWfdJG_H!;uI zazSW{gP6IQDv3+J=n+$r*-^_b!Ae+?`xfCdDs1OuXNF$tqul(Xa^UEBzSM_G!vcjef4gwj|d3@O8)gUzqGrp5+c@>o}r&=bgrPF9XT*h-3V z=MvzWXEhg}Eu%STX5wF9z(ukEUM2=1u=+azzv5y7jz&MjyE(tn3kfB(V>nXvZRBun zIu*3*?=^rcSUJ3Mq&c2HK(bfY`=&wF7g`kunj)Q#*Ml|qy5)*C(B+sB3K^kq#i0Os z=v>e=KW&X}egpdCnJlfh8KKM{VP*Yl$_}Ck<9OW^~9O3ZnK@F(O2xW%8r@6VGX`nRc$Hl`DGzpvgTkSm=g7 zS_Q<#yX7IAhe1pQm`juvki(6X!@)CR@u=VQhMYq*iaYByYf~z5VAsy3B`(pb^CqzF z8_tj&s_atTvCwJoYE4-KK77|Xo`KxQI=V0Xm?Q9y2-+x|Wr*WG)k}I2nPeU~nyCY+ z1(sJ%Xu7)8R;klrWqyF9^3`PtLVBlpS3AxhTPEYdIeejEezWdrZ!l`pmy~NseVb4=wUwPJf zN8KtzX$gE7YILmI!21QJU@|;+M}-keWbWZ$DdIjv0RaS&wi6c}rKCxdnMp0{^P3Wd zipJlYxrRIEQWFmhIxRp)XsBw=E`_@;c*#pp`RIfKzn-LaM#zWiA;FE>{4)*G2wieJ zJ(}=;V!&n--lroDkgkSB*&_QvFZh1L7rCuX`D)fp>;o)z9XfquAHSra*%r;iEI%Tt zrZP$-%8)lbDNjJ+uNT}RCHZBZX{u~1v z*WG`Zv6c?fCK3Z)G*dw5;olOQ0APE!;$Z@*;=vVuX zkGrQ4hA)jj)$(^7gF?X2bTv>LDU39b2O0uOciV}-&Y)IRe624r&=peaa|XkKJ*~Wj zYHjdp?#F7fT__Ths#Wm_Ch{rEgdnq^qVxHn-*}83E4t~*mI>Q!Wd1JVHbG^-ZDIl+ReAcHgguM_1 z4$=6L3G_CbS5d+fE1^jZW}axcoj{A_#zWtq%p8TCT-9mpIrb@W5%0iPV$X8x=(^@JgS6|QRz2S~O59OBZHoe({PlvO236}vfD=#T#V=io zFuV{Ug&z6a{zIqy{YOgG7^|Yoq)Ih^d+Y+dSFQ7@&V^W4xQ{UFw!pMBTdU&%TR09! znE@CZropvkWf2BD3rS+JX?htk$QdS5o*JC4go`@)2KoxNigk)<7{(_746=+e-+0p_ z$JX`N^*u&u{Q>$}JYvCB<@{siQxwx;^V+g{9p$AHEHWJda0}d`CGF>M5R3BrdoB&D zQ`m0haQuS$OnD)0BBh9gX~t?Lczkyz;L%meVM)13QPAA1@U(AORF~pjaumXJ8Pd4} z48UL+AVY|x0n&$}c}Ng?FsRjF5z?LnQzJ|}5>>SBfr8OI47o#fivu6 zq_URqBHyqjUU`!iR3tr`7=OrIICl~0j1*f1!B8@%~@=(^8fLx zQT!p@w*DC}{*X}@AAP_hj4Ks46+;m38s#+8Srp*SvxZuoNf=vn&Ra9VQ}mlL;aoHN z;~(#Y`>s}IJ%AH30th+g{{SHWMdAT;1gu5v?VbMC;7eBe%WFi0Ultc+r_v`$SXxM0 z7*$3mFb)zFYRMrl?2TME*fxN!UB2j(Mi7z|UUlZ3a#3?VuZdaonehjU{jbc`8(x0C zcksICDO~h=lm1>OcugPHI-}c{vEB-QHeol3cIuyGi!w1s?&oSf>#F{An}T3HHWF}2 z>y{z%zL@q8oo*|37TOHCDD!W>+@;c-l4ulOQ|V4}!_{I*SYlStyPS7uE=KxX9P+;* zTm4qSb(lKpP#g+j5PRyqdoLM2-LL^gi750U+XvZkH$iNX)bOeH6pm@ksK4|o=hgBg zV>$t2@A35Qp+iXicA_*dV<#CS#e{r$LBYMsT%9=RCXD>FqOV=vy+GyNeI_~zWn zM(!~teg`tH)<)G{u-rRJw~;4=S36PRI!X@J;HDb0*a$c=UnQp=80KW1)r>RqzRLK- zmYmbu2+Oi7x@;NI}Dy}J2nEp@VXYs(Kf zt=9-yYD2C7>?xx?Gv%>5&v?j>_9vRXIAP04Qp6A7&1OMY^ZjBnQa#qqf&<7fIR7wp@-ZjG{Oa=7>wh^)>~BeO<$-NJbR42fI<9Z z1PR+sx@fe;A~ukZJ=l4e50Xu#BUmYT<>^K0sbp}zMJ{b{>?8c$3KmagBloD=nVhUO zL}>Ik7*83+ zxW(H`PkRKcdk2Cj!|Rvkv!lqbJXp*HZp<2}Aka*s4Dy3)HO$9f5${RrnQE|npD~eq z_aPPeyg=m$0084^HU?23KE4FTAT0<<8r!stDTL8OpvFY*rKX~RImuObY+S|E6j;-V zqB1WSy3;?iNhz;S)hp~|3-LoI8CgAbf!byq0@M)9jtED1nSUwXTx5(3eT8BMi4JY# z0TxDSE6UReJtW?m6{TO(Iz7h%tT#@-+47vPEKtL+brey!arxeHfOuZY5c ziGV088HNEz!C-6Y0Jc_SBlWDFVIj-=4DzlxyxOA3xoE-8!^87-IJLg|@$BOb;SkZq ztMqfs5bOu_I5jma*LtQ#p9&|xNc+)?$N;oB2|cX!`6@{vnQbDGbDu6fJ=XM@RNheA z9yI--IE7Berg$#V(jz#4UpAt9#GR%Q<7cg99AR_MyN>%LmpkE$D;w_3Z_24noQ-tB z?8<|@l@W@}jXbNL!qjg{`d2N|I#2;r0rK>DX^Pys!DS7Qr6`u-oVZ+^SPWG)K5Qf_4@6;&RtnPGHRs zYym+(k2koCca=CB7;K!z2;eF39Uow&{CzgDllDF$NKx1x?ktI>(r!2zR*Q_fT0q3} zogS%JP1uSKcyJL`o5rWQ z+G~}T&vs3;QC=G&H9ajF^icGCa%K_S!y3E)eaUQ((pON7Z{G>XTvST|Yl5ptQ>>|2b@dsLTpIXyP7_a4}{m3Cx91&BNA z99|6+na~hCJStigtKV0d2Jci#V3yvA&5~=m4cw7k|5FQ``d$5YjD(=U*I*V_OQnH z+`~DWQKin9h~mksB&wqS!5Zn0KCuu191=L7{{2slv41^le?`~d4k%jbU!=vgk5lT& z^6zy-oU=9C(4_pBkPIjT3Beds$WP0za4OQ7O?ctI6A=oK0Vduc?}brEzn1IuW%U6y z#KxWP5zo;t0B7+xXk92D7?*{oiQ=C4kr_>-EtqBJXhBYJ{1Cjz<>b9r4PFpzC7l2# zTgS(pGX?Xx%z9+h-gCo2&>a8L#2a;l3Hq$HxwF1^6)7CbpaCvT z>rXmfd|Fqz$`9*m=hiPd`FsQ#b`5f;B1z-gJp>w$IHC3?j!wI;5O?z`ii0)KXiqAW zhI+vPz#^V%&hV=yv%mdXVV72iq?Sz9O$u)+)y#Ynv~bSuHJ$U!gMv)?A$(6zb7eiS zV|aTQ07j?CVtC^+`;o89aA|to;?k)#M7mIeAPr=r{UuaN*KwTq@nFkFxMDEhIq8hT zHD1EqW#?X)%ER6;_g{3ieuJMZeCH)ekO}x24TCHkf|i7GO{7}t(cH~UEQhqpY)Bno zNK}I@IUW}8xd*LQ3Mmy0vzkV|4>iRtCTXQJ3UBCkh1k#0k5jv6*{`Y)G^$VNhre*+ zBpI4jx37q2FtK}x{)d&?aWF?+x{6vbKuZB~^29Of6YRqVzTKY#1vK-|iMr0v(Jui2 z&f)>owQT=$=J;duX8P6M$;Hs-Z?`g8)mjsqhq>H71c#$#{|x>nLom;5ZdG#PEKqUM`NRG@O#ie0T@K%o@3iN%X)3_};vLul zM-xkE<4L3sL;#<7sF{o&-!cBtC_OjU6q!a3;A#<#4{^x<}~1D_E3>-biE(#WSDFBXueerVbx%EDz5bW&ef%%G^HhGEXlng zGv!~6Ii^bQTw-Na&MJYis3gP!Yn$qS!6ak&R41 zt5hFl4mGCuXe1oijDuz$BnAkkN?rKT{i7RxL;(LiO>rsKHXMhb_KBS{`&KLldZ zk!>O_P!7`ss+lih@QNFZV)zsa8!^E&ZO|HPppGUf!^*uk+&M8~dt+Aio<;RSaN4L&WuQAVuk9#2I-t(c4KhWOY?!D+ zn?W6Y-9W>eq52sEHG$+8Z1q|x@JkNym*yHwvq@z8BM=+xm%NXN^hc$$>L5A8C8w>> z*OA+UJ%QvQ>s(-SQ8KOirGd{%4}Xt{(<*>WWYkT3(6H9=(4qDWT*;!?h|Gol&_LX# zs)P{Srr2*Sh4cx&8jY_`-7i3U{Phpwu0Hm!qBp=3aR>F~3;X{Vk$){f`S18^D&Nv6Gw(t;{U43vqA2r@XR=$UXF2VudDmga(f^)lfaO4jGL51}ADWDr8& zJHfbzS&Ob#GZJJ0LN=H4^dwi0vzb%NR=3{^v;n@1V^Dk~Nx&+mR7cWbfd}RguSiq> zStqqkNPdB-`a^=Zg8`>kxmhy8JsZ~{7V$)gB`1v{uaP9`qQC1UJE(}$1Z!}Y-d=Qw z1>+*iW>(W#@CoL0eRqC|`~=b}_k~^?oMoB?O!ijBnki(pHd?_k6?Tco;j&Esw>}xR z`Fpf#=GqIV^|-SV=KXUVP%gicFzXR$9kA&)S7L^NO=UyK)UFO%T}GOUW{fa@Tc$yn z-C1*LE56Gouv?%%mCRg(lof%oHguI8^;RlA4t^%_W7I{n~qR=v#3O|DB7a zq5F9^yuuRuyMf$PWJR}p@pKveo+!wH2bY~^jDIZ#Ho!NULS0AGFy?LH}t(m2m zkKDTSxjeBcl|FB9TJ&I(wTRnqGIs*HwA!v+R+>v0vr<*sC3?GX`K?O&(;pGnJe1*R z>r55o?mF6xEl;&IZwZkf0%}^_+a9W%!D^}a)3UBt3paQZ%@aloahrBk+8mk5@d;su zD)5m~qK)G>sVMN(>mlKLol1%1BsD(U;`7ATPMzs2X7zB39;3+cR$7OtZlM|%lNyLH9CXCDejM}COEb)Q+nk5u~ zZ?!k;13z{2*T?a`hI)*4leSZ*wNp_T37&MQ0^+SyfGsJBO0=R@EL8&9Rg^-)t&|eK z)HsFI4*Mlyc+#*G^j^(4-E5QGYs;I7cb-)ok-hThJSCNDM)8xwBT4|lJF!@jlM)eG z7o1$tmy#t;5wAG%FE8r!^%=u_85C*@0{>8q17pm4o&&<^01!_9b3OBa!s)*umYSAc z_#mz=<-rk%?n5zp@G)YJxeC8Gh*HwhsMl`HpWq@5q>na=2Qg(#COI80EkrG*%E)&l ze*}=^1nK3@t#$Xz12+fU$Fb~9)}5Y`r#V?j>k-ycPsiD4NB7v%H#Ib+0>h zicmYA0m1c-%Zw$$TwOM&x}y~-+&kC|0-r|Lh#j%kiDHzk!i$QZFA*s+K#>!m&!3a; zM-!@*`8X-2i^1|n1I!Q5_Rw9v55@hpkUfD)8sT)7X&a8VeLpAsp0>@iE`KwvRD>jk zI7naQ@G>QTD67lcY1ZhXohiAtRF1gSV4=|lgAOm%#R=nLBsGmPdhfE2#$9l!!bX;Q zd4`0R`of1Cb)_6by=D78e*3*V=MdPv!t@%pFe1x`ErpbT(iXBmIGKvHdiCQ%Jc@~=S>4d=N~lJh`P+=NmPq?S5EY{ZK5t_cPAyo4QJC)lxm z+9h7Zqz3-jw}sZkMk|(Yyv3jL6@C_pD@tqSJRvH6hodV(bo!N6>N+b8c{-!LB@NDD z+1;G*@{e`nb>sF#4FGDlG$4R@{+I93pV*M}uVDK7%r4nl8Ala!^Ckh+Mdsk1?Mm3H>Qw4RYCO;>p~hr8&Jl;rZGQ|j|Nmc zQ?*q{=~-4t$Ckd<`zN?V88T`MH=o-V}jfhizZ6eoRSMCt26jCY{FoP%2Ky!~WGl!YE)=)2?k- zb-Fyx^h2?Bar|aZR{@iaLv7QluUg#$->*S%N|(WLlLlpuA0=6I>QyS5bSib zO*`Kiay8j$%9izvRp|^;eRR-j>B{E(IJ1Ur1?9&^uS(WcpLk=p*0_qt2}o^|z!ZyE z++L3_O~A~xC!#)N*49!G5~l~M5R$!w1AZ!T+a%K%(vhTt&Q98H+c?uy{C?WbESD0l zWen^HtwhSecG_Or5hEA6gH+zx0Z3tFx7KFaT+ExexI1o1bAy_e?QD6}=herY=J`9- z(gew82hZaz^zOpmJ$FW)`}y`gA_2Hy=ehH|`G$G_5n8S?f9-45WBNVUp7K-rZTe&S z4c8gV*}^r~k@GJADayb6;^0h>27xe0tP{+icUAEZ2Gk&eg{S}WhzT&eDbGqczSWh% zn7x2M`Vt8)T+~Nc3kIaaTT1F0#xYmJCiIGf?$W|V{yx(1oU}e6r<>DnmL`Fh*h`^} z?c%)>t2=m7JH?9Nra?=R&iSox;(3^GE&PE#5pf9)f>NOgl9>teWV#p99my6#WPH*E zN>a56{I)-Idm4axcJdnd*4!qDOud`q8hpnetqn~flJFL}lkk+>G$JW^3eL-x%g@sq z469{U9Zl^mHpk^DapqV}3&)3>@J%U_yUN9qvz6Sm&Q#Hr-Net7*=x?LmTS+m*sozc zDg+5e)0o!`TE zi3t2j6XGZwWhk5_q@*J#PwJpNX&`6fsK0-m>~LM(=6@9&IZ_aHWQ5lfDfdoW=iX4D~4lq5E=NVv>q|(2Q{=0QlrABz&gQyv)7M0Q?vjXfG~)rP&dtioD#y8h|x< zK@?_SQyGq9h_%dNjb`1lbmn7(p2pC6%W0Gw z?Z+)OE`~z_{!vVRqqZ1kk}6;0y^-q7{E-neo_CgHHKWJFq!#x;p4qN=|LAEs=E-%< z2@O<2@oA(u_Z?}bWGUu;zAN7gs~w|gj;>g!{T8j7C&yjiY%+U-QL$WPK9wbpT1CeX z!{o+8@pv^8MWU{uIB4?LDPI;H)@Gv86l7-cCgZqQ{BTaaGV~WM z7cbYE)}CNj-}**x8ildo5J+$*1SbyOIa%llXj6}mlpoaui$4b4Ty%TI z`C5?O3G%&eeFz`JTld_#erpIQ=98XZeoaW2&&~)y_YZ?ZzLlu8?c;h|0qe2fOHdY*EWEtgO(;Mr6t0}P5X zpb2vRR3O~?Zh|1(+scK*NeK>4d|F$iF#c|7)?|MlJ0m(vNhC7;qs7XR3tQwTQ2Bi2sAzgJGY7u4mwzzD-Jv_Y)?mJT z8NmI|q>8`L_+N11Z*8Y3O&A~LCA?4hyEaQN9E+mj9inoCjFKd3XlOd51jFGh|StM>x1X&QINl67?9`P?xRO=lljGWdz0sLo*YZ` zf|(LTg8e9^i(rZQV8o8Ud>t0@q4$3=_Ko3{X4|?|v2EK)g%u|i+qRvo*r?d9SQXp0 zZQHh8N#(A+yZ7_#?sM+#`)_^g_n32z@s1Z@H^p8&hdq0@?}5s{IXPe3F&(d~_uu`M zpYqq;Bu9Vc;(3om6x~GP@s{n3nV9#hwLjBzQmAz@h;7B@*-E}1v3iX~h$v3Mc&&M( z*M77=BXpMSxWjMFU37#b@U`fd`$q>m(}#7U-7!+(K#uKi_&;;q_c zLIKW$8|9`qE?o!~eI-to7lq55&aQPL>KK77$6h%Ka8WOD`tj`~t#a`(@xsQc4Lpq@ zO?)CIadUCGP*+35#$hl2Mv{7DWv#JMD!Y(09?LwE0%ay;Wq9Ws$!2qpcxn_a%Z>P| zWPiadfEI^+HkIr`!2BR8xa3p)C?Bfjg>1)bvEMXaH%$BG0%ZVOv+c~JDGWY@>HLf zc3tVnS&+Rb$RTYiu2fkh>|?0jH=o4#5TJ?bY~t(*p^xs>rqeet1m%F zFkWYHB@E|bqsoeA1H1AY$UiYm(CTPh^`K=bEZ(99lFedi!DjKoRwxlVgp4;Yg(2z7!P5r!B75!5`BKqg98IDio9_DianYY3aP5qccm)Bc( zl;lv=4X$4*ZIWvf_|Omshkk+LXjIq24fmU_K0-t^(*3=g)5sJ+dyk(1ZAS?QREqHd_TS@jcXK(Mzl<=sNEpiRYoHh|qp5s76>4 zjO3&zgO7fG(wZKECA1Rql4ix8Pc~j-x?Sd#;&?or%!Nu^`8Afjgw)VUsKTLlT74ZQ^iV= z*ZDk~RL-_yYt`wN`(q=A-gFcsN$q5MKOa(|W@UZRh8dT3uw+|tt~r|)r^#JI)SKR3 z_`vDXxKU0!ckETU+cTd{gn>4&w^4s^IYhM51fwup_TN6L`Gf>=_pj~8iA&`UzsHgQQ5U|mw5x(u9lm;*%$4} zP>X@uWaLc=?b@SRT|M1R9MX=sXUNEkb%ch-Q7NEZUHBNR@`l3uG7^up6$KY!8CBv} zV?u2Xi)O?pZg9)#$bxMX6oT>Ccf9TNkRXpczV40%yyR`|=YyA&bXSK>6-NG;ySt%_ zc)pt$Xpb@fI#H{-RNEoLG3{H zQo>kCd!|ic0|zpZByw}` zP9vs^(AZ?i4)vfDvn5m0Cnc&7>V!VDQ3Dv{AMWzf@A?lrJfXpo-J z?r8~ubo#E7%Iw6hv;)+I2{5FaGD`VO4Pc5IU5G4_*I1^NK$w8%E|}5E>|Ke9aNzvm z_pJfmN3kuX1is`7TsSD~)KKkR-F4yI8H>f)$h}-uDJc2ZqIL{y>l{l$knyUq5}&-$ zk9ajkoxVi}YbApN>~X{|)?fJ!VU5HC}-*s%UcxpXPypYHVDJ4~qpXQ+f;oOLA1n_}Lv*l(zIK?CTX}BzIk5Oo# z^f@C9F9Qd6k`-jCZH{(>GvdNzOYn*+jos!4!XmJFxrB_4;*;@BEyhflzP!2 zv#N88bDC@Zs@b;sxN3+QrI!m{{~o~;EmDwJkeJnG=lHFRPN%vb7r`xr@#AZA)1D+m zHP?0nYN@@1Ms~R@`3p5oPl{^9!#9nFGV=+wi?YSMh$0$^oq^w$T~|rm%NC%zdJSD3 zmQG+r2nIba&#*QZIuiKcl2RRN!%}m?P=uT>q5!vV~_0tkW=2) zu1|9|ZPg%cD~3;uRfNX;xPz*Zj4V$(5RtpGJpOGpKk>N5A2R1jpQ%N;luvG&X|o?r%hDmR9mQ^FmP!de9A524^RC?%khoH?T4H30O6 z*c`rmt#f3@z_{bn>prV@m$G+^c1>CxxeEu`#7sGE+Ez_>C}D<6;SCqD-Y`4w=|#?H zfqa;&R@bpjd;GSRh#F@Tk$5kMF2tKTPN*;q=yO;Yk~*F>rPIRDhf1HRrMuSqt7u?| z3@(8JxTD4g?x_FQXaCx ze4Bmtk5757txtC;sFzvE<#`G5`ZxEQ?^j-=nP~{HK~09#Go8xd+;Z)7Jd_67**yLH zbXbESj7R{Hv#a1+KIG-zn_R?~|I9uCn&dSMhTP3UnDwiAeEZ8uqTovL6^ry?>4TwR zQB9kbCiGr+v3eN%FGjOVEoun49Nh|q?QfSAKG~EwNgA@ldEH4G<;SXd0LF3d=(&n^ z(;!r}vyd>EvE{Ye`!@iM5E$QNrnjDvemdM{y#`YST%TaMjPd|;g%AlZBke%>a(;&9 z?i$>vWy3eYS4YzUx0&TNrqeGEnau9N4h!wNn~P@@TT(@aiPEK#XLNdpbu1Owttz7q z{38#mVsJAN_e_CnKL{3OQM+0#?URqmzVN#r6xxJWcF>++2*qv*Pf&%9E&oPD5vlz) zQ(apdqEz!dpmR>%tr@}WN+%mI+qQM7V(7nNa~-88ckW@x3&D6dIs{`_NtkxGjO^9I}sI$|eb<(o zfh!KxPuzTX=}?)8;6rb+OApLcgErIC57l{0Wt9F&NRvm=I+0=xQRQ>KHPkH8WkK`) zyM<|RjL0ff4Ix;dR;S+a#w8Y?Ob^OnHD>w}9TuVlP?(0WGzvl;whGc++klnchN|l~ z|EC|JJ6!F(gvjo45p{RW>pePQa^meF*OxH}cIDvb7XC(|Qg*?)Eyh(}8ML-7Tl~lj zFu;YDqb-vz3Pj-|`dLyEH*C;zIm*;eN%}7bd2c7687WhLkd2x>XW-G&vC)fP*B^rqynow%fcDqh=5{dN+s@C{dHWlm zjODjUuF;=-GU|T>y8i31MaAh!fe4@tOqG|FoxK*(vCT1)$OmBLHsvN)Q=X9DcsGbp zPDI(TzNvzX%nK1_Bcg9;K+Xt;`K@?P{k~kOW6|3p{P`)m#)>4;8jj1se!s>fTVFq& zcozX26E#?{@2<_obN&|~@Liun{TlDbS+1jwWP;%Lb54KaMQ0J60tVI6G6zaib4Ld` zLb|GMaskrA2KHO-OY-E;bB>>*0hu*M#NoL?P;j8+u-wCp=O3iJLXU_Ax`8ye+qYwe zOj!4*%o&|xO_+si`9ETzi(wS-MIv2(v`U%Rf2w1eZ2t)Vcf3 zHpip!3>KC@oiMnm29SpWung7r$Amh0cBTBj3_uYKA@?YP$&t9>^e_uK$tIl1$mpxB_-t7+eNXndZ?uF_NILxR{+BLpaJ6{BsSkA5ny; z*9JCf;eUziplkIcXCzN+0)7b4EVzVD%CA)4V@@=ocl?$tOEJdY;c!$c!+l#}lYGn) zSiS8~IUDVI{oS2kUG^4yEOqtBnojJ@rxz^j+L{+Imr(VgWcsr=90U$4D&D-NL@6j> z1@A!vaO@JIFbZ&-O8It|qMT`6+0^wyV6;_B*(Mj}fmMgdLbjgvuN~ounY~9&UqaM`;yyJM_qA=cHo+^I$cJ5f-LN zTD$uBtGUMcCWE;VBp>Y1`-C_L6|McnQHkD@$0$}@y(FXJPNU|;B|bKAe%%HotC#L zcb}zx@@$*vUAKR7P9_n8e@xoNHpu#^1hYw>^^5^%t2xvmnZ*q3AklTXj$Nl>di}yP zARC&_LU+~;APR3|m5DYJW&8}`LsaYRf2PA2~&+TcHy)-DVbHcC*$5>iCq8B#{yc1u(UHPO+j1xvrh9jEV=YohLn zM=OPW-}M7gA&&(b&;Ki&-oXkbEID%{)zNfv{POq9uRC_%WVbj`lqtn&{m=r6q}E_j z9B5Xyb4zmzM(lXZq$S4|e&b~T;+ta~_vuq+_kQv^?D!AHWtZR{0-@Y9gmXS20~{*v z!yI+!_*(j@!^$yFxbsMX4ObpY4t+P1apNZt%4cf=sk$aQor=C}Ja~@`gNh5cw~J$? z^ZBG0dZFeYHzLZWIT4j4+{93bDyvN!=JWZH ztod8;qMZ|Z+=dK6;NDGqn#oDg&OA#wd(qK!i%$7*22@q03{>23Q6E@LLe6Ylf*X~% z6JOgmD$s3<7kfxOb|t29h4DmYpuE9E>P5d&w33!7c;VyLA09hN{^nSb?yv_{wbdnc zA@51AH#IR2_$?J3Z?nsgNkfeH6bre3$p@1leJ-4XbwMb9!`LCA+K=);82TNXQni5P z3+gE`k>s$vASVeS5*Nkv!z|k_s)of0JxUQ7%f8UOdVDzjsWRH;U>~@kq25uTGA2yP zG>4D_EeY*b_PApdbtQ_uk{i!ql8JGziPAcSjw(7gaxKkTHs^1_-9GsFEBVSpsN8W> z>g|)imEqZ}kK_pOK|TXs_5Un~`IDgeuVVbKw>eQ!K@LX%={E*~>^2N~gX*{NT!?AA zsH(J1EL=hcne?w@-aPtwWk)&=3>3f1G}$O@W(lVW7o1!)km=&@O-x-5e|2W2Zft$` zc>}4AsGze}W)a_uVrIj&(ok1#QfR8_VRYRMdG{T{gj4wv9qD=b=A-Yh219RMa+M6+VIKKZ$+y%2P5ts4}O>6`Pkxp%28zW^CX zjeWdv;y(FQ=O)2q?A4DZ#^6_Le}Rfgw_8(4tNVBB*B{Uc%4KNiDqH(X`t!@MweDQr zB*O7tl?~pAi>oa{yP9(_#&@mCM59t9Q$N5hg*Y<9eWNj|#SLi`G0CWOdud6p;?)|I z&oIJlNq6dHE6oMWpcwt{@7-*MZG;*-NnaAQ@b@%>(}@Ql0U~MyE!L53vbfYa*0IjB z3juF|4-W(-xMWp7ksOR^Tm2Tg{yH74<(*Gj18=AW;8ODcrA+-}I{F{n-3sMDbG*i$ zG-<%CKR0M<8CVG5dRqz^O4B3uv&I1xmvz&Ll^eCr*y3+;eCqtO|MB{C0fhy>?@8un zdD?WmqqVVH9JXL1M@3(H4sBMaRtUuCKX&zUvPRc8Vk zcsaOP+!wHLcy%kQ0ZY4^X(;Z6Bp|jog$n zsOI-5KID00$FlfmtGT(@FE+O_e+w311l+FkF=55S*O|5BWi-JTl{C@c=7X(UoDpy71DC{i`ZdBV zGOqBKN$FUwmFj8yn@-;;DD<>hi^0%KV+gum$v(y@86lt$JAS@LA8gP*$R^yVJ$9d9 zeUWBbJ#Uy%**p=_5kZMjAc@tOu!J4P5IXsJ70Tdb516ZtgdKgVMf?~m zqie8>;j5$a_7&It|j`ck+F#+1Bdyd)oLvzIuN%+p zi?)JB{@Ef|m!cFdvre6O3Kdf_4vxrGW1YmXMr!~kXMjPhEqnc-WSYjtY#Fg0#cNV{_>(Twr|_loy^tP{CbEzQP7rOt24EGdC#S z8!LF_1X$Hvb&*N}<>6r|2br{YG>koY?zOkIn>KnC@&QZ22_H@;A6g7~FeIt9fasw5 zVIRTFfbA^n#yI>6bnLU=^cihn*SD4o5V8@z1bDQ+Q_tb=w=}GPh1&@%-2aPb|%)9Y=NnZh#qitHvG$VT<-y(V(M?9p1rGZnKng~s#vr5ooA341|C=| zn9)`?ca_(mz4_-lJ)pgnTv?=xSeuJty&k>DR~7IL6>y%bK1&$USMTq396QZ-gI@z4 z`?rW|UK;mqj^6ta5F5{_IB;(cO^TRI!81>Dnq;{A0ZB<-*W-dNM??VXRGGV z%@%T*$otR*nis7z@;{uhnV)8_Aa#Dv$Gw;JKboC1cpKvm8?E^INq{P)jAxr{^OZt4 zr05sx<_jqvVPkw)P{B<^+-R*I*oLC!{CrQ=Q+CNmfA8AUW+Q!y|@fK72WSBJUo5RXWh|0Vroq^k)evuO{F|$+F$#z zMl1BSzMx;N!jzi?Sz1UmeZ!HlE3wj`TFc+a9fSn(ORvmj=7C}KzXH5ivr;P|cFCDG zD7KomGFTiL>WcKbfI5n85>=4cSSXS(EoKttLw~G69!QyGZfo}9A^BK&vlbV72qHnUzC2t->>|u7NPu3^ z(m9DxQbP-l7nC+XiHLs333A>Sq7UhYpgoi{0PS84Y0G{p~ zb6G2}sp#5ZefKmi=z(1%nQ27)p|~K1AtX2GQf_VJI#-H5J^@oPOd@&7B*YiL^7U!l zZNO>NzOQ0MmJ`{A9iUgJ$xLfyI&rwuo)T|#sk#2B#Z$^o<{j9AHD_;m{m z_!5*>m{*?Q^W6<hhsCVg8UHZIX95Q02hZl@EK)?zM|-(Wadq!E~IzRAmjv^)iu&+P#1A^0A4dqvi? zV1hcVRKnN4F;mOmIGu`thmZ`&O#Nr=(*HPw|6yU-*sdv~`2h9?!_Iorq5u|cHGqJ^ zOVzqwH>(p^iKf7yT6Bys7z>BFvc>TRg`Ob5~BZ z?bEDr?Ro84+fH~lVnL^Thd`3$(HQd*()4IgC7N5?<*P%TV>PMP7AH3WeUQhrQ+x27 z!vY_ZDC9VhS|p3@xhDXHlxYk6neB1nN1&qSoLY0QMi2|k6qDC zt)EPG<}?8w5{PwhC|^6_xhe|1wo7Hx_=1M~TNP1%q^R^2hCypH*`te~l8>J}5B3}J zFxf-8%4iRAQ@}L$+nLoU#SKsU2uXkeGNZ)XWe;T;Xnk15j#{Aotjz9f6`c!@>QP&> z@Vj;$wh3=fcSCa73eE;D)cW8)5;41B14MO-3BEUwN{*Tru4lkX+D}rvQ!oX=6}EVW zD;WB=v+=+0UNZHMK{-U_^PHa;Ilq`S&L^fZjBp{kdW1gN( zPHy+WliXRQQQ%_Risno#6GPLdSn?rTFnvBMSHpUTUD1QMcJ;V! z0ppkc{MAj+EGUlUbUe-ECLnE#G9o4~1<1%vPfCvp-{(h%rK2`&8r5(=S)7khn}!Ui zK&f9um6i)QnP~{iQReUNQ09!INyaU2=TUAE@k&|bL{Zb1!6#-HzaVB>P&$1JohU=u zDng+QGw*^&a%WB$rhI1o{Dn;a!gU|ACW@duN&oJdZa`LyQm6d52XNQRKcu*e%@3k~ zPKdQdXmpOauZQqSx|L20tW!UahWxpy=wVm$=KEjYUo;g}ktq!qI>QE+dEz!T1IF)4 z8PE+O^+{p@Q^x}1OhV5OCNkr7D;eRA%5N)GIk-3&t!4NZWwf-M2^>WSvdo|`%29*k zL{khLGF12$7Omgy<|Z)_p|Cu)8Xq5WZ4#Vx$T?>m1xYS7Mu+B7oMlHatv8L>eqvPC0olOXE-eZ;NU>9(sW(kuHY33M~ zzS!R}Oh#C3co(^8d#yn(6xuEv%>smCc*>lC(^DpMRdYS4MZDdPn68p~>(uP4=)F(K zX$HQ4t6_p%-kidzp7}5ukW*uHfd;WsK`zvGf!_@B8}$^&KTdPhJDkq?kTkBi2^b^K zd^w_GnJHworM_iwF@15fpRL7Zi&u@;N8cw={dlZO6iiZPRXgxDK~g@81`~WWpM5g?_^uD#f!MQ zZL?B%1&R~$2qt+2NgIxa;Q3q;n|Y1kT(X)l$%`zf58&AAzL7?>u|o1(vtG7z7HSjE zQVO>(XxmN`x9H}w@_%m$*e#eefnQI)kYZ(;kogr}%r3o7xdBC>KS&-E#_F4N723fk zHfAO~$upyA;Z3zZ`TK8AY>iWWI z{Bxp>pX%ub3JMt;4=WBSFkq)3Ga>Hc>k7c?O_nb-oGcCN=eztMOWP0KrQNad$&5Sh zMNVtVsv&jt&D7R_o*Uhzc1NBQ#8?|P_ThGSg z^u-*FBZRmbd;?h5>ew~8JN?)LJ={rIDY=5>Iz9E13aKMoEXu@tWwZgQ zkmRY%<)gM}q|u7m_)>bXFsJT|W))cBu^P9?C1hqzVU+LUFG%i1@O^k-AjL@3F(uRAr=ptyr5a8XlVQ;#zG@xDdpK> z0^@tSzSr;3DF!z6MYlMUCBge$@Zx#r_{dFi zc_kh##-}|pWvfOA3V9PZn!&~Zx#=JNd! zui{G#2{+a_4aySTr}dy8#x8pUEj=fo^A3SrGeApkYnP;ywcBUPS4E z?CsU*-~U$7*?dhw6TpX~5%_TM{Nv!JY~WyK@(18R_Q&tPjBE+EKsgiI;7@YmHfSj* zwBl()`hocCFTVAX0pj8q>n=YA&INTWqhKqWS*=Y4{kb}?gIHdBn}7-?f%HjrF|nem zclqceZ5NVy{GlG>!E_8h#>8|OL0@4#3<|hZJsihvjeAh) ze#2pXKUC9@*=E()iw>&;Js=~44YsgI(%E3XjaH3g#G6cSy71b`QZ2VM(Q3kne%E?6 zbzY*YIMaM!6&1V+)>vV^h$i%4T4~oi6bJ$Pu(;e;yFJL&IDIx&SeqUlIE@Biy~xP) zE=PbSHF%k9oS?C(&)hSkD@;qy&tp^SGQtZrIn~h-t1dTM*O3WiEsx-?rI8!F^bD}m zx$G`#wx6^(9e#&HrJv`2AiKx**-q3F^VIEgd9s`*iMW}VBEz!So94BzV`JwS)|?0? z#M@`a{Au4^eAU)~-?VclykkAn&3oH?Rgh|4KVTaIB=OY#F%Y}p<=;D1^X`cNB07b)Igd~cVc;p-K` zCX{OSuEAEJ%PTcRzbXN`9nw%}%+g^eQUBY8StE%viEfN%3}lQ1FgwB51&h-9WcA>y z%9Jvhu|n*4HN9p#E6MWFVhY_fnFWlHcBpFQJfa=0pr6)akww&VunAm(M4}Wb6fzZ* z4az{^M0NPOuRUx%{1OXGjG0=Zz=xB@6wU$I`AXI<1IQTe62_gKI`)VjHgdQxjT;pH zDRDE_j5_!wN2;CzB3G#^`xj>}-j*{1pIB*@r~&v@xDS`OB7wnYEMgTqKKRjNU|w??Us~v7}SkJR;gD!pbQG2J-*|k06P`z!Ovoa@e^q zjqLZ`>_ug%;p8OrKsb+;QqD0#I#hi$OOK7wZM1ppF#Eix+ea#dj!&_{|M01 zTCF4k51;lYRJLde5>XZ=1Dl-(vW~I?g*O{7z*LiLYTII;e|jM$#+m~IHvVP!SXpl^ z70|w(+Tu6`G<@W4>-uSAOYODEqnqMNc2Hn`w)d|u>)2N_^p0b*S2)I?<5-kgyZ?%{I&h}6 zaec^-lKhC3VA(c+EqYowv6Y3#-dtzJN_T5~dQoU_fei%R{giGHWKNA<4zWd?f8z_S zI+fLSVc0SWN03|Ao;m=@k!VjrrN&DfOW_4;uBu2E5Jux6p@IR@t(nuQpB<52XVDtG zU&;yYmE0Z-;9WoU3RO9DSbz%^i6WVtdjIOTxMeRqc5E!F9*7w%$svhwM|Wi^B?(|c z-%F8aibSRX#D4NCV@v?7iw3v!)CefsF6t-!cGPIuSig?#d>|{PlxL(r&D#KO z>o$BiM!!A1SUk6&(rh}Zv@Wypd$E+g{R(>AGxFgpltO1BXdHXBWTcBRljhGp zQ*!vXnYt3+D0oFY7Ls)^dd$HRjy?k|XlIBjh6lXvCNemW&an@F#oT@Q~zK-&;cY$b-3IikO-r-b3+%6`FXYk^0N8BNUohFu3$&Z!QB+)Z;x1 zBmI<|LIX0`f!TvxmYph4D^!3iIgcyajp|YCcUJ7mXml(^ZZV%P=3$tM2C%4i>+Vy( z)5YA}kBF-K%*&aTmCQ+_7>g3vi^{!Lrg0aTv$V@nF;K;?xwcIImA1!zJ0FN@y0) zGQzYevz79E+og@C6bh=>ow9UUVjMV^-pJ$p2%Zk-R%`K9dI{b)GjaJOr6FUP>t5Q; zWm+Qu<}TBWMu@XI5hr2dsv;Jf(oj3Kpf?(-95tf+0$0M1&qa!$6wD~#V7X4D5R{E6 zB*8hA^!;xZ@E@;;yOF>fln8i({_}*cY+`L<2ecLXuWCwET9aM-cNX|p2{=~2PeBP% zb5iG@K6@yE@8*O?%ol$Vi5pFa*4i~ZAJr&+mGh>uK~|)F0DVXY>hnmQGSB(R8HS0fI{vj)&=bzMCc3uW*mhjmMfvdddH~ zy7jw*(|$M&|3PQ*Wj&!4K&qVi7=FmsF2?VI$@~ha9nP7CE(M1dYxa|CfksBspLo!z znXJ~i+ncQ+hrbHzP2jAcm4cXsMdN$dK?22U!bC$k{mZg z+q%RcD!GDhk6AOB6ZN38qbSroc`(hg!8-{kdOS{%*hE-F$4&60;TxT>MH>%@kx z;RaF1B#5Ht8ORfj&K&ZKJy6-)r9&_Ys%~8@G$V>mI~+a!9Q~GAbvVF{ctn@D3aV~K zOq>Db7Ac0LazH%v5xzthe+{3jK9pR>sI?zsVT>)wSzm9?RWlgfBq;%f=ojp38!XmV z9M{=rxcG)d-%UqyOX7)6MIXy8FR?UVd4{dQxSUD6>}=3fLXTLdCbw&G%+~oe zd6UKheL@D<+1yXf&R?;O?oT0pfKz+?) zLqn`*073lv*$`m)1{D|Zy*{FOs$$Pij|CbUyBC%8rv=h)>)*ceQ4u+$;vu20ess?Q zU4&Ey{Gl&B-}(_D27aOiwK}Dh31YsBvaO4Z7mK!Hu_E*!$TkuAF&bbny^2T2JxIJ- zPsR<&Z&OEPOer-V#z;MZx%Ve4{e5EYo9uVL1~v#yKnC1DGfe-x+W%azDE$X%ZF6d? zS1075YbYqbkX-JU6U8wSWK3Zt>y&(Mrbp$fy`*T0@y?DU2 zf!XC=hU3#_>K_T+F+1vv3S-0(=q>Xy<(iCkTm7J@h%&5Lrd!~APrJXZG<$t}e6YcI zR_{AF4w?F-w_qQ=3F0&?LT3Ed@bL)3`wzr;#MdtjYUy{41Bh`gqKb~=?+~5dUn!4+Y(8PC-xMNH4(si+iI!^#+AAC>=!uvko~ zmWkhYn~=VEo-Hajl>d~_8-E^K9&ere2zQKO5WR@I-$5dr_Sk-R3^uOuD|o&pH_@EF zSlN$CL|wQ=Lf08;h<+U+!5Q+7jDlW+NaPU&qoG}@ZQLZIO57U<+Dyex0D4u(7bCwd zq%Ezza%9jff65_ws5$uXP@cekjK*=)#AqGIG*oY9nCqle)TeuyTi_6Ob_j@A3tW~E z7RS?jx4I>a@#?+(jh{Spr4Zxa7 z4wOF(dI^*@Wxj$CHUA3{4G^XG`qMSPmR{1Ug~jtI z%W;aA<=5F$6XB=B>f$`eI_l%$2s^z%Na*pfhaA}*1&}+gc(;u1A7EL`WL73-Ws@Bc zed;3*F1LvR9lUE(cS4uXFALk%#_Vt45J7}jEY&0do5d|+K^Hc<57ady+4QT?7hjm9 z(~s2gwjQ^RmaMWo_tB!C)U>y%?t%;f0RrA90Q+F45trw)09W+Oiey^nQMiP4%a%@s zN9!AW3Y9L?AEI?iM$364x=0#|Wh(oWef{KUO!+R&da)sJKTIzbQ*?XF8#r@PIB#>C z?D@*l(hYSLr1dXX)=L~TwBf?n>Po36PI7h^4kseT?wwlFJ2Ac)b20V6+48t13$G~p z6k18>gWywQmOWgnO3;SQF0F%Bjq0uRF7(_5PhBPi#tQ;*mfM?zSk_30Vb;dG@wG1y90&2|@bJJSG3*U42#jdI zetiTq_rB!j^eU*wAy&RyV&_-ts_9kRi3~rDQ))xiL$uK_VK@amUrDAYj+>MIIEo~L z(MU)R?LOykmjHP=3fEkt$j5!lWwU5i`=t8LZ|`BxLlj*UcS7-VP?mzS!Rc7AH!nzp zlwRjTU_6Tu(d<1<;)b7eb5B!>8$~TT7tLG8H3L)Q;Q9nq9LZ!fDR9i}+ai$2X^cC| zVxiYhD1^gc+yzn&U<0AVMD`@4gS6{%kRDL$i_?R?;#&^K_d21b$5GPLS@mK3NTKE9)cEkNGE;xEv7qS6VFmXG!u!0pr;Nm4+hwKCvBqx^YERXY|!LMRdk z<(a*nR2#d{)HM87b}&>DDh)^&PPkcL%c&?Bcs^n{%Ca4CHT8M_{TsELCrc#9fX^Qb zqra9aX^jb}IjLEXn0@Fh=9Q0&An|Vx51~m?<}rl2!f{z)#!oh=SGRYmU0dkjy)>Bs zoqMb;YZxMN?Z6W%HeM#5Gt}2|vX5l0LWxAjN?>1SDoHx}`jmtS*dP`xq%dPZlzu|;=d>ucuHV53N)Ta6-fIeg#F?jyd%KwfS>Os+&hq5rt5^OP)8X~kmE*DT2oD?l>tCxx7xBdH{Q zYDJ3F<1)zw>Qr!sUIKH}!*#8_?&;}}A)Lx=F(JGT9F${)8{s~sadY*-eDmWaJM0ZO zQp{A8D2?Fp?~y+YN{yP<-zx7~eeN5+P`mdeQ^#X<>bIlek++PNt4uuwiv$6zB#jAZu4dkStE&5Lo)cq9UTDXW=Z&9PAGdt76E_I||@;B|*P z5buRBzYxQ$u-EiNCeH=ripx94mU=|_28Mig#}SA>9*_`++?NQ2EVwWJ(jm%mgR#Vt zs^m1oBa3Xv;kP;+H5x6@iy%?)8z;9CeF$qXEJgwB2cNC#rXRyQE(qb7GO>oVBu>TR z_T02J(?vjXv6gt?y+L^H!Z4TtMS5i5si+{c4Y3zIi%ldLe*@Oc8cs{}JSV9VYqTmU zY@o)uzOXSv;G7Mrf+p%n6I*VRoUjF3tze2EBq=n1930?T+p!b*0Jit1mRC93i@aA7 zl+E-;TK9kR?KM9M9u~6No&C*zd@{0eYYKRBY=9@{ z{}ucoYHMpOZQ^2L{XfF%6aR(10TnH-U8?}h5?`o#s8B*1KMW-F{8%Iqzx-E!;u_mE z7f@O$t5y2JkKMemFaOy*DGau_+9oN&^e20onH^?uvN*2&+m4noMg`S=--wZEEQZr( zTV;BHgCkPNZt1QV5}klbZLrPOm6oCv&NCeZyy@_@4DQE?BOcqM%r9>_jnE=QYAkrx9Q2)4`|Wc3M0S$cY|id-oWFumR?DkQyTX+yrx4Q&Zsg)zI3r|8yt~J8a2Su7BZhYXT-6J|B z_tj2hjf-S^YEPjPtWUvCYretFu0Tc&<)D^H;C1Y`$YkAo3L%CA?FAkW^_BrzYU8)S}Ndb~91e13vRvyNK5h7c)cUsB^9SXkHR2 zpQU!mDO>*KM$}WLSl&}WZRW`s2Q#bbO9SV8CF$)GED|l z=OCq{#IXS1mrC+Qs;rLbOIKm8u@s%vC_|Vz6dvl;PrLlc-p=96YFI<~3(pZ*$n`CM z<2~TG)Mlpvj|c2Ov{T}?4vr?0&Ng=c1*k+RS=pihGl)R{4`c5Xo{5%q3s=RqZQDl0 zwrwXByJFk6ZQHh4u~Bg}>oHaGaZhHuiz%>8w|;AVp73J|Hz zX=eKI_I?8`@D&@(a8%4-CmQ1_JP)C-JoOrrWiw{S?<+1mu^UR?K14Rd32TP}z?6H4 zLC?1R^>^1Jz#;tbH=~`~?|2_|7tL)fp+-Y?s!rWw6|m+B1TM?&W4fvq%>HxPfg3iA zqe@2x*qIx?11Xu7p_OK4ZWzrvjX!3vC4G90@K3F;!`l@~#`&9-s}Hyv&V#z3tTjgn ztX8p_^tX49yK~8*NMrIc!Wi+y77T-#s&&+)<|g8iYkRtK@(nJa8@2Rljn|HLQuz#% z>S@ru&f{LE*g~VmQQK!AEK(i_1&N9yPeFXGgwrw3(87TRE)<|SxjVJGWfiXkaEo(p zTh<+@-Iowb$j34hT@5id$dHw3t&xz(`=J@?BTB)ih)got{i%P1Dk{_M(dnyUB!67L zV9XaFd0S9f)fTmLe$K&o`;TM0muc%5TRP!cApZ>82K5(*Y`Y%;>c`?tkYmAi%I-zQ zBDZ)7-xEwXT03N}z1X7!B4=_BA7*q%5et=srOGbe^3RE`5C?Kd>WA?QOEO2ueV{o) z@ya%}M;rek^vejGgC-yWY4#o&h2Y&>TWJV85f@=?ElmleqY(yEMo~tRNcy)1uA~7G zW=hm)HL9v0;#^qhBX-`5xAu`|>j^HM1q~b`((|HPCztZ53=J%VM9$p`x?*9v8Sy_# zD6Lu)RawNjZh}qv{KWwwB?<*&uBL|DLahl8%ZVGAdTMThCvKv5n@BV9(XtwG{0S_8+w>%vvfx%i?17=HoKEB|fX`;TC6VH3yyn*#i2y9q$~ zpQ9Jo7V4@Ypk&3_mlI%0<(nl*LxcbcBSRLFTbm78{UU3b4*kC-ZAD+!Z(%izO-}zI z?K$4w0yyNqe~}*`hJ~yg%*&%nR;jBLQ9ypRiAv^HsI&^*wMBW#Z^a)14qojxaBlD9 z*B@o~eDAV6KiTPRtawY+0tjW=tkZ!zWLKLFn%q-dF;?ktJGz<;GI%2h_lwz7QZeF! zEz%yr1}ty19VXZ=pO(zn_$yzTq_|=7rgTG?NivFua`17R-9D4%&J;;#^|x>f?7|zM zf-k%icoIi=Tf=#G16qc;t)vDebUODlId6{1PK_Yq<$?n_R}&wLJ^`x?xU=A!E}%j~ zI)prXjbXRf_MTG3hNEaw3DhJIt2k_qk35S@vVI$Q(^g{%^Ja!h#QvcS2VN!|L_>kt zm(}SQoFw$?6WaHMo<-<9v2&b2njE&_{)-eGj$kjbmVx+B8nKp^bjACC0@iM^CH8E(2e0OLVqH9dIvw7 z3Cr><2}`AztZV({|e`|64Qs2eOs^6RrUXa!F#;pi=G>;obt!4>oau z2ry((VSTZqEjHYKN%gFkX!}050j1*kVK)u@<8Edy<|!^#Z%hr2$C;ipZLW_`Ie;yl z#2aZboFNRS#KC&9WM^2Dx}OUcZ8f`o(G+-=ZiTyb!Q?P=#0$18?i~XRdNxh)QcYJk zb%%-1lr35F)t(wnT(Uv6Q>t4|mB~{KheN6=>H=rQI>$2G`ugB7aj+B3nKHpm7fA=r zMx6MP^f*5hZ)6fT%ph!9urdugE!W;mo(hLIYNj+3h#a#|rTX9jB9!d@}tm&mt(b&f0?NVrcufJ!OaqF`5U5hrw;f8Er6 z$>n1k_CZ$jSo6Hh!wO4sv)Ic)1|v;mkn0Z{oY9Z!2^xI(iA^#v zPmy~rofj-szS}lqHht|~zC7A?JE0Lhyh}ESFD?fxSQw=9LW`Ww+XyZkVjeT+jkIEs zmA^n84sH>142`b;JIN7bnuJ5-Jhd}jI5m_juK2X^q@OVW+xJb_UhK zLPF?;N|ow*BqUP8JUs{>tl9dVIiyRAwkU2sQJ{c>%9=QnO_hUuq7Xh}rcs@T??U0& z1(7M6k)5ZGX(1habs}hvLP$M=*fhvbaTp?apdz~Qyd<0O!aubM9zo+8{4D)Di599q zK>x~y7q7ycj{rcu4Jb+en^%B5AoIZBFZIa3hU9cxE*%1(Uw=~&gf<@orvrMmzOaYUoDTy5xs^dYL z2v^5DcO!Z%0i&I9s>BjEkQr%@KIUS>hzD=hs^XqP8!)b$tJFA57!bPBm@eD*Sg!Wb zIH0wQa-eS3vOkke@=L-{9O-%ZL2#KZsz135vOYUT_Nn}j!RLD&AVAeZ zR3H4a0HftWQU?|YQ&<(lGb+J!$bD!iz<3=-&%-Wfoh-P{Vvj6X8b*Is7>r%IvlneZ z-k6;1W!7#F?nr!GWgWCZWWY13q=#tYTFS(ES&9ByPK(X*R}!NG1r95O(bnDfj32jT z7#?{B()W@+sEoT%m%#l*Z3%jf*oo|sh?;hDYDu>&>&!vFp=cM@llhC9xc#Pl!%Yb{weMS zXOU*H5D(M1In)&@YH0Aw%b1w+fVlUD!HpD2n?Mo2v#=N7uxoH(iLI)%ih>4o5!l%_ zSkHDLY8vsTaS{8BJN6xu`I}*Upav8VHU1azPvNsI(8!wEnQu!T7G3lf_H*JmrP z$l$ynAEM}xkicGzweqO$K!6@hjk7!2)BDwwB5k+#`;pJC-igzbgo3rkS)nxj>m%>w zh~1O-$ci1n~wG~2Ge8dVXguprE3LRB~0mIxR&ElJ+buxR=SUTMCs zFpG4brgs~Bz^Z2Y7mgF&ZXw*!OGhvcQDVz^CN7n>8`kZ>9UIjQv$J`9@a`dkP)k|a zR?fn{2Val9KcP2F7-a4|o?>0Mws#&OTz@bBvX6jwsZ;>y?$AJ2nUXl>-=b%P3R)sv7&1{VrY2Lr9GQUb51Xeg&x#n zyxht&#^%Z{;sgem?cd324)0zKuU<}~7X+BD8%$ur;Mylpz9##;78ycb`^uV zli8;i@+>5HUPn$RMza_5W-NdcUIwDEu*<`;bbG((>U(%G!kAer&|M)3F6-gCOV(e8 z6-~rlTCIktSFG$wYR3RXlVfJgq?s1H}g)*HabgUwDh1o!-#1z-jkFcP`Sb%D=nFE z4U~FD9^3H|528H#YN@mc%sBmg*U4|lJgAOf1c%Xl1vGtZf20orI-=}uf11xijt~5b zTY^NByEq5IkQtpvm+vyg9Hh3(`X#R`nn2n-Wf#^U%b%UGii8Cyeiv#MEK6NSq@o2x zR>3#XEB0DY2*sDh@4!SNT`AgtYEseH;+`^5c_zz?C)T;heGkK zz%dUhN;4M2LeQoXRH`+21?aGoz_eeK`txgg(@S@Up$O3=oN6!R`o(&$7zp0T#OH()bq|hZ zIgIn;RCQ4PWe;NokJeH>vWW5O-Kve$?;ps;1LVA@`<=h}vlMzrEBU;^{`zK1pfp>A z1K#X+Kq30y>;(S2rKJBczy62E*1ypSNqF>NSC{ZzALD> z5HhR}XtkOf*#WhzOvlhKfX1zfaBdKPCk9{~<7p$MA?}ve=6aNw)@J7N`S$)ByB92* zG}aea49BX!61stKQpf-g(=F5Y>qc*}A30byQzUDq>DK-w+<;-z5?>>HyO>zD-JQ|) z{iS4VWjpRC=s@d8mTbZN?OEqkEH}8_OSO+-N)d4>9tg%BYl+5w_Q*Mmbq-Pv&+!4% zOZ6n=OY(-(yG=0r?}-j=>Hnu+Jv0rEz{j@TXP97R86Hme(f703K0T1)8jVgDG(-3lL zgBz+XI{P)+gnM4C;zjV&bw)%1`C*iWG9-)^M5L1}rqZdYxhuM?yh5iQo(7}31f_#R zqGw%uLcKOGenZPu8JG@xkB{6FAO4$Yq!*?|11^^#pxWFfYn0b%IkKn= zkRda^C$)Dm4zl(=vy&~+DJ~nvP?cA1N+t!v_ypa5#~kh!;>S(%^1mpzR($!}>;){G z_y`t&YXrax{NJRT@^(&u!Hd#&>wk$e{wdv5)lvh9xeV1KGxlSQ8}^e8cjW zH4!2}B&}M_5ulbQ7}7|96Vf=+3Ppdu!*)M!rc@W1YlZ7fERo~C$|PDZu?H(Aw9 zXEw}yJbpZ02KIdXeuw|U{H)tc{oIOfP`Fk6AtZTf_ z&yqB$JYQ=J^_ZzDxk>}BtG;j|yqHo0Zj&zLD`kq3vD6sdX|iP*)EY<1c1pQoy}vS7ZAVY23-z7}(1R8i%nq$WvwIYxHU`bok>He-p6cFGjW>=!t*&LsPxtBfnH^oKG#bJ#_aO&m4(;gS z>Eg*R*tUT}jd~|1{%T{=0h{@Pw8R}d*yP$-5;-cmBz7&%Qgah*8)3GTmS2Yym0^cq ztF>4)8!1_u40spQ7~tM9rQ+c!wp^0TUqY4Jf)zwYWMQ;K$r$CJ_QN?;R!H(n_;G4DlE-o&a}ydV zOKWJTYWxi5CL`**r7*QuUet@y)nJe*8#dfgK*%%9N#jAt z%M+JV@T?L(VW3#YEkL4F9ak;XRy1Z+ix7`1FDzRN-DmDAAlbuCB^sx=trb?5N43ZQ z8D6@}jaYzz3=p(RPFR$g8mn>)>ON=fAn+@+=tiP0IV5psb?EGMqU~?BSC^GmN)wl$ zHuW4b=0$VMTVe*`z&FFtgo(Rztb2E+q1$EWkrl`+G<1)cPY!d5EY50lXluo*DqQ@? zZwqC}R+NZ`mQ-X57ZIZ8E~QoF93v9ZWv^@s7e%&jiYOtI7-q7#wKn~sM2V#W1dhE@ z5wAkfB9gRSpKVSxw0Wl@YRWsZ`;7(l{1M7c3N`%Zhc4p$bA^pp74$ zxkPZBrT3`xuk%CWB$|z)c|sR-E2W4??6u|MB28nLAzyQlrk5cH@%vtJy7jDakCyBv z=-0P#xWBGohX~{5INk8xke^t9%dz=+p6!rqI~8OX5v*?QFh9G7`W|EOgb;(Q!;)se zz_tfxnr{=W!EC#%p=_~4GZ`t3oILDs1}>fQ6H4<7{seyZ=U-W%ie=hI7}Qph6g#KH zEdsyPVZtfY)EV$B^xhJDk21i!{%O2vhp=t`4y^Dn$Igg~l#|bo^>#xJ)6U|LXU#9L z$|o|z3;GU=V>BCaDH^BY?q^c(5CNoB@ZGj5;@dywrkK-F68en3R z5_+u$)3owviwvJ*RfJx~+lF9)pwGs56497MljwzjyjKW7BOr040$8|Bn(#-oeh&#K_6Q+C=;>ZXHpI zT2{yaeQ<*9WAY`fWrd9Ky`B0|{#VQ4Oj*Jhy*_hmcvhD4u_i3$xx=*$Pj zO~x8wREDyN!D9yVappDC-QCK{^%s}g!+`;Bcse#5mZeWWIjM<0A$&GATpovCseQa* z3k8A4$1vwzH2l#o0}afC#6S9!Fr6a?vN=*ZU>>u@gEq~~n?G}l6-S@uCV03Hfhm!? zH#m)JvrWV@4Z6t{KMbFnXYN+)`3VcRC&26-Fpj@n!kUjE3zG7r(HQi1Q6Knm<@vw4 z5;tmp2+P21Gp2xJnXQ_;eu&f{c5!3LYA~4aIIaK%F|ZVqQA!eYcd(033Ye{18h=z+ zr@}uwZcX1Bk8G6Oh~N+ia0`GFl0IuefAv}f+U!#dQ>WA6WW(tH#OD<{Cv%v~GN_XA zBro<^s-2p0uH2jyO31DfvrAVmCl0p`2cDeg66^3*J|Sk=YzOKnEcJKS^p2X&m#hR0 zPliH6Qvi2zf^HcLC_}`o!R-Ry{KZVg&v0jOU~1J_o#pRulzCGAedVMjYWoGEqEZKM zK~wa6cUyd8mV8B%tyo9LO;V*A!_>H5d4Rq&dBM%dqMR%$LdB+Lkd_xL_Yw9ngPJ2p zUnjZ#cVo51#>3CQ)|eU1icOq=8WREV7XLSUm;XVFw1Km&(Z5@_CMn6-EdWBKGq{@f z)7cV%EYcIdnM){Q3GFPGBbA4Hgd!l7B6V?2m#-~z#P6frPrp3qS0=EVWGirfZ<`dndgq_yKLp| z-__34E}sRF%X)ryAtMUOxg&6ZOPEML5#xs8oPp)JdhHzOjmEs!K@2sI$Wvpg+H_WjQble%_6Qk+#53U0 z#1`aDBJPrVJFqLi;7e(wgYnfkIFF@iY}UW+{I}(=!kk1+dXIqFeYv1aUHda9tdgrX zE8>_6HndvveMG3m6FpVy)mB3z*cQbg3+Q;40E5?_?1((33O>g2ax(6U6v=K>-o70+ z?`<^m=h0k>poN*(I9bZ{MDqPcx;cxOTg-3|?{lOJqUsLO3RJVZQN=^1OIs3^R$1=B zjtmL}@Bt`i@z%^|7~}JtSa=$_^4A0 z6g4GCMv2i)c=Kx|&2b~m$-HD|EG>UKiq6NcYb=k`7ywQN$K+FA>ShXJVz@TrH+f+_ z6Js^~?1IfvN#w+!jy1)1Qas=#?|_>#q$4q7dc`dgH|FB5r@t-pC|upCmI9Dy0AMKp zTScg3ZesFX*xf|U&hFpSZKM9hQ`&A^x*Qgannj@96yS>&m6nPiDKYY}bn7$RHq#=j zYjhNE#sAUgph~bX{$U{OYD#`NZyQF>+~9h}`IPDD`ZV(szvqkcuT24{3JDB~h(ka1 zWu($j@2%WJ1E3g~6Mzg&6i5!qZ9ErWqY5~rg&T(b%=Wc*^8^onLpLqwSF+mn4gI;x zNCneihHAwaE?Dynf>nF;hG{BXzHatyIz+^QOoxf57L3(zsZQFNN7;!Eu}q)J;BU~L zFq%`mJ23ms9YcDq{48#-QA^(`;;TDkCe|9(o843er?~4Sd@R&`YOzq=&fBM(TM4}D zq9K?jW0Xf?>$zDi)^@>R=Dhs8GH|az{WX8+LCE4c*lGD=GX3sH&Ezs!ep{Z>m4#uE zyS|S7G7UV>VN6mL(Fn8{*?FJLOm-&I(3 zKMyrwJiS#ygr)Yhqr45A@RA9-Wjx#whWx)v<68?iieD{~uEVzH^gC;ooLc1UDXf!+ z7eUt=-s8mWjdSLkAu$SBVPRDzgwBl-9B>$zQO4idrw;HC$U%=HRB(hzB66A4m7XO6 zMoV>j?81Bxqx(!8)Q~d#f{61zK_E*L*5OD$gFNS!B zn#u#s^$_qE>kw!2D3eKUd978q@9SuMt7JQK$xwnXeux>?N>dG1M-xdxb<)_#Z_Axr z)5X4pKd%X}e$|a@eER&`qN_7ea)&wye{Wxo=KWNX z#BUjFv_+Jp5>hZPH z(;g53742+cw7)c>?Bm~z*m zl_UgavSQ~LtUYk^-0+b>2Cus+lS0G{+hfuZ;<5vw2bNTOj*zs@k+j=C<4*qTXV<;A ztK24Hld>GZpG~Qa!8mi?G+eQ zP1J$hJe3zbG&I&u@x7J%@O*<-4N4|5EW>{1DFDr9526h!;h?muSugFa3d2*EkSVcCn+IFzEX)Bp4!-S>{H?%Bp35i6mzZREj3b!!YymP2Fch_ERnBZ ztj4YF;AyL@UTF6bgWQn0;35^Br3hba`47Rpf!s_iP_qIi(@cVi*##j5e^(OXrgk^K zNJNoiNF@xSe7MlkIj?-iOSR>4DIzXJi4Xr<`@o5L1a$A-Lo!v8ZnB$k@BBx z(u)_pzg7py;dIey0C@f(WchE#0!r2ZVI-hQ|7#)nKf>UajU=KRMJWGL>j*^w1w;}; zSg`nEbeOPCS`#4ZiRDIspgaLSpD2uM*z6BQ`9)!(iIi7b8ZW@IaHfs<_4qnQ?@RKp z@o#W<8tSE?CW15(m^5MUVImU?Fv+y3ZpnRjFuKOI{rY%qeSR|;w83MV1@7u=cKG<7 z20=Nu1eMkzed#MuYM7Dj*o$p5y^k3452D-tn|P7or58dp~Mh8c1Omeud{wF zUCz@5=-L35g1n}npEDlE`0To!pS-_;Sw^*=U$@K1c~Q&5$MDRnv{zSTxE}{x2W0?} zg`Fn*Vhnqn>5sZsm9y;K0fS9Z#$k614baKEJ_c@H5W=&YFb=dTwF7qRCoNeJhzjFU ztKf3E=RKnpo4E$E9gwVba9w|z_z7TyhanO9eH+l+QhO4>DlKSQFlRr1Ya$QkM8RHu z^L$!tVhl}TyFF>K#|CCots7=oA1H~^I%!}GvY2;Ba1-PnVR+4X8fI9aW@aj>uYOWi zL*q>u94RR#9ya*yoD{U}o*MidaUv)nB=}sUM@1m z@rByzSUf4>cy`)&2%-uYus&g7*c3`EH%dXMq=0*+4-;DgG#sXqDO`e*6_G0MP1P8o z-u?z#CWq@FSeQn9|Y4@md-L`$zyL6UOvl$M|0JK3Rf}oIf*;)h2V!mg>c}G~`vB4+N?Wa{7 z>_~cV*QVkiW&16cp2D z&6v7btcw-6Oz<;y2YUP0faYuW=AM1cuIw!%b%ypIVs=5~w0*@ftZ#j4%pY5N)w(gPm~Y_!+8vTd9cm40;cXa>=JsvPvZG*cK50E2J=-=4v0Wxhr2+fJ#&c#D zNhMDAkOu4Oc4fwLwYNAj1?H|L-Xe8~8aBeMlrX3<*us`coSCGiBEJNXe;KoG0yRV( zeqLqNF=a>Z=|~(rRgprRT<*1Su5G7QooLRR(72&UI#TrYphS#s;C&GWKbbhTmv<9f zC_10?_Du;~Uk|ZO_#RpWhS_+Z$PD2Jnj`TW7}1`xjMT(WgpR<$n>edy_xg2&AaHdA z_jcy`%)CH~ci+xVCRe}bHQGa_G2&A<5(ak)H)$7&!D7K@wfC=OX~_lX^3!n$epF%l z-#|2_K@x6qP(;8RwPh@PAsaBU_2+rOxnJ4sH09G%2f4%fcPPWcqSN{FLSKQdLfgzW zZeWy>Hve|r3T0Z0VgR6+4zRw!`HxWi6N5HN{|wCNxJ)*&$kU$?0YPcf31l5+kD5aW zBSA&Bblb7fBr`d2Nxra^09eAB6U9F7RD=PvCZ-rgR2B}V(`k1)(--$6Gc`ZI@bnqs z<6XT_>~DiyE<3l@EP(Uj<)7vq65iML$*-fYQA}g{>l6vMDPM$ATbeQ3};^R}n6lK(nGH{`X zt{-mP^CA~!8%Ti5$rBaS&EXn_C!Cfo>G$Ix$%WM>bD1bLJHRlizQk$ToHl5hbk!^% zwdiC4YEt2eHk<%%K|~`8R_x}PKf=-;?JsT(Iau^2rhUF6An_;Ait*SqEU!Okl9eW~i zGByXb0vS`M9of*C@1stKX=sbFIp2hO7J;kUU|!v9_LJxHu%G^~54dS>WWy1F45|ho ziu6AsO2o~`7adUx1rDc-13?QUB3^0} zEuK;9kW$Q6zY_Fx3hfJ0KKS*DM|o*2ict{5USnqR<8F%oJSXL6H?W&;hqL->d7giD zvP`!VFHL z*Uy+wW;`%&1N$5=z2wX{sd??xLS@+u)~!L|eW`g&k=say79>J9RJ>WC&+{ZYZByUM4p^P7-~`uKh`A5Zp@oA} zB^&5_t(6c-xami}k>)0C?KNBZ$q)RlsO$&;Scbe4NbZ-drmSnd${jyBM+A^@!C`%O zatg?M&GCl3^HkOq$@x(y($g6zqihiHmR1>z3R|+8uZc{{l|r#m(t+fCz73k%@{U?G zBibWv25rKHOT<>z6Lg+fHMJyc1x%(%3d%ewJG@B>JCRoDyGC|I#mF6eI=O_Yl(5V+ zZ*?~R66|^nbok9vt5H5B-4kpnW5UrBwt(^D8KB zU~6psuVmby*fCikK>$olu?IoFlMkD7AhdFXsmTd5q}GDY0cT@Tki*KrV|s|YvBLBD z!kbhw3e%C`c$AgbRD68&`0(|7*(})E+3X7nkn+3dk^hl{@&}u6hSy6PO{af$*E7Pyh z`oIIlv)EU(7Ds0p=Ij-{Da!ec@+a&p&HI)rrx=<6FQev0;L{h)C?e#{ZL5yY&GLrj z%it=0>evmZ3m9@1!vwo#xHS%WBy0UhwF46x!dQX$0u(U`{{WVf$5@S$J>UywZ-hFI zLBt$2uL%dvCpf{;eGGC1VUD4-znxcc=Kb)S;B}Y%>HZh=?Faoq!pXGsK>gm!wstU;K1pA}0PjKcBdQy_1vM zqZsFvE|au^=;T0lW=F^I)m7IRfPeG(k}6CG0{Yb78iNTdgoPJ47ZhS`y2e~Wj7R1* zXsjy+zi)&KISh*16&b(-rS8dQWx{xk zuY$X&eZMOU6+)iIq!OKN8SM^e+|t%WMZhQ)XU`4m-2r?9h7S4|LD9233 z&x)RY``cDaIjpDLjwsUu{_eQqWfJXdoU68HSDjYmJ zrsVMbS+rJ~j7}xa#LBp;^F%o}%}E7Sb(2-YHN8l=*R(yZoo?=HCah!IB3hBB9gZcf zF&FB}Eta#Yv}BBG9j{U}O|10X?0uWVQc3|RRI2sdWP8+BTLf2XNqoO)l>+_71l$T9 z_ddQEC$QRYCRof-Lk<03KjXnfYYhpaRDgjo4q6m|?VYes3=;GgCW>QZ_}f8=%qq|z zk}FtK%1@<>HMyt~n=k9dP~}>tZObe#FQ>9yJ3?ibDrrF@JI!>QK+mHiX;TWU z?i=-w=;FV6U6=_+dV=J4@euC`27ZTK5oAxmAm#@s8O<7TiGTT}_A+RwyeNm`_sQ`8 zfU!v4DlSir3D7^3hgPlq`X!~qDiO=75RW-{)7x@5j#2i>(z7YLyN93QEl(dE8Kg;zdH7h6OCDadFCT3SWH6$WP zSqKIUyo9vDFHq~hN-^@~g+TlZzv>MbON#~rro{wv&CTB|s#F!UQ1KsZyc*Gz!HBE! z3YV5!mMv|pwDfc?d#acCmq?3$@;yy6B)||hx=f{ePV<`OG(3GwZv%chG?U{E*X#8* z1 z1%m6B^~XwF*~>c@P($2?amF#hoY)!2W797(T^a0RN)KCg+tcQqKWqw_*Av1?h;gUp zhl$5Tup%e()rp3J$l3JJ*0IX3Wkie~WNx-;E52=^I5dfJ@8>DoG366-Y8u*C*N-lX z^QinJnOPb$C&H9@pdHt!r%8i(2>Te?Z}?8><3x)RF@``(L*Ixgf`+3MX0Zmfpw}eX zyv!cNCYC&8h!y_Mdd|9vg^cUeP{@fD(|B*Yh9Xf7Z4+)^SjmY9H?$lQui)MS)X#~g$)>loW~>O--?I7a?r3kOzAaWc|MAlT2k{&3%- z_IzHhM1zopFi&uMa)Q8J?a6pqv<9J zk6k4R57Y+j?;L3}iG|r8ot81gTvDM@aNtO>V;===4j#K{_VO)`_8g`+K^?4f88Bkg z(NN^cM-bUWTG-D_(<}_WW@DXTa64vTKcbIWl%t9U1c0Kz&DN7-@YC7 z1cCu)nJ0~S0AHFfGT19ekw``3M%LfPQeYXP()ot?>Fue3Wsg9E{fPRB;f6?$>4r&f zo?1O9-ieW_CR5#xHM-{1LkizFosH%7g6q95LJY^m zOABUFCh@B1lYTjCnZCeu`m4cq2Coe5v9nC#$SGsALZD;2DOG;bZW~@3p*lR|QEC4%o$4>KoF>C%mev(tI2mV<;KoQmDOvEQ%jJ-M_HcVv7vDc{TNZl!rVZZpAVhDdVYo5Cx55)H0dAHM>Ot%kot`( z>@m|#F9fNbXmc>?5WP9ZnBhgp2U+#LDdbhGu!w^rP#3(FIv6c8Ah@cwRJ?nF{~@Md zia(v)E5Eg)TkVt!)}*a7QB$jFB7&TggadAR#|h5&%$T6)h_F*)0?0ua&b7sF$__x? zG$IunH{gy$cJdM#Y0K&F&=$KZLHTZ=GAwVyCz6G7Noj6w6`glU8)BIgoE_}=g$@>$ zt!66zR#Gmk4f{g(^$QQyO9+4E(qms~fzcJ1*jDTc<0}7~xNA7PEGoXve6F1q|X zXsd7&oRb0b#uQD!{CeVXN$ZfLPm0}t$eQEq$wzovnANkUm0PVMlr{zIJyaQvABlBGN<>3GF97g&P4f)MB6F7i?J4(LFB;D6dSwG#ZZv?Z?P*6e+ZsJ~Sl=+XrFslXcl-t4=f9k4C1b9*;X|C}xcuTox+JlAaK22H&|Dq&;t zgGQfEiAeQ9XWpYDf)8x9MBb;2ggqI3(F_Rl`dON)PrOoH>y-t(!B9L<+<);+2KWQ^ zCj&bj6EJ-G;X6!QpZfOCA)D~kY;sx91rAEsYe7W`tfUUcyD!C!_yVZ!nVM|0GEYgq zFsnnO6^vwMtq%+J8!FlD&|amN&2| zBVWQ%O&d3IBGpyi=AJO0m@;UPcvIe7OzycuiVc=g76_y@VatN9AX<}AY;A;1!P&Mj zgC|gGcorWRDV8;A@ZO4Dq)nYC5h z&J>Nb!aURotyhytMmwUr=81Sus## zg3DI&L2*1&%cw{UGF-!soH8XXw}GP*RZab>Su0F~?5df)=ZmX=PW%VzX2O(MOFYIw zGq|He-6YfC*M}f$N=N%E=EM^kcDnL4)B40m5UqfP7_-^L^4jt8ptaEsGGup`u+B%Y zSHc?FC$xiKTr^{jg=U~-S4-fvu?w;_3+dUUyb14E+Pdfq90Yz)uJXEMch=jd_}j-# zfUtS2P3taO-PG!Gm7y^u?t=%Ic^_=MKz62pzE7L-EWqA%$Ihq0Qu@ehul)`w-u}cz zSHI*vm0I`kn|D^oBUts(@wIGckkxNNFW&88+&8lB484Jvy)Em`ryb!TbGmBH+&!IR zzLbhH+TG_?=i~28cKv5`nVc?4KVT21+W5{%(E9E;$DOs)+RT49pjQo~nu-Q|BBL+@ zr!Q7X&9phE;ru|I`i<3XtC9{~DW8_<=*gQ!f`_rbfP(=AN2QrI+8Vn`p=P51m*X?K z7Q^vUhnkqas86fpOB?kw7g^2Bu}<^U$h|KAh|)ZsCw+YhFf3#V_fn#LN3$zHs=%uI zWTbO#{rFq;4Jf$30Q%E^d|?8<+c}ug8#-HASvb)H_WW&~=*cH8^uS;KN-&sk zLmedp2!=`k6UFi0ei2Z<|M3UDIhYt&eRKc+*cT=#>im&i%DcaE)NG-rTAcI^-eT^X zFo=k-AxS7a>9?2yST>7}+Ujqg<@pdEC*b!5`P>~?;*`U^lkXf)nQ7clcjxcGy?FHs zB(;Uak%tuD)aPOsYsYgr_qMMfLkya%xn&x*ZJG+LpeB;80yOTUiGxS$8Vf!9zqdYs zU-)auSg^*3G9OsN_;pA;Ky*VGYK*90Vvfg zkE&|eDzlj9pzFK-C2w6^gW8N2krw7Lsw>unu5a_AzkQK_5a_)MFJL_=m z9APblsWcksMPULXn#Fkh_(TeR6BhCQ)pxKX^SK1NeK~7Y9KusztkF-|=w3p60!=g| z*`(Z6+>>)b|KmpK+7dZtir?Ik)z~6=fMth8xO~hQbTs>0qDxjMm4BnJ`j1!43s}Fm zX=;BtJX_77t_v8ILGzda0{VTmSbSg}>S&EUrQ~^eD96HM>Qtw4ZH`a>oqc%wL1;S9 zz+m_jWU$(u%Lw%Xr4ns_htq`v_P>7CX+EDFe@Hok04&D;YTx`Xko@~+{jV{Ljh%~$ zkb$$K$)D^-k@BD6QRD4R)Q2`Z`pA0ni8chtpdjqd3}UGk7+gu4 zp^?Ioq62?S5jQ6cMG1x{**N8L0L|GkC;8LkaZL^X7al=67(@%um^u;z&3+|NL>lG> zA|q|WW2gxAB*w8{X_1t{R!oL4D<*@Od?~Sr2viq|5hg;tJK0O-%~hSJEi_*(=j>_N z_1Lv&D@gTatlFELhWPoKyBe38ap=9xxmY*KidyKuFEmZ=1KmwNlH>#J_HXD^6{1UV zD;G4Dr93^}nM@aM*$B}eIlp-5tgf%FjNh|**5+NJo7=qWe6kAJG+Z%nr3v5i&xig# z@=PBJHRWE8{#mMSyH>eqA+q;d3LnHA@^aKVL$C zxXYG+6cUNKjBc%_X6s^J57HlTNs9IfS(_H98lABMNUE~Z3cPP*kd8Y(ed;_n@3U#YtSj?u{+x8ho92otpOu`%+_ zamI&Izx#f#k5JNybY`6X&N6K($}Jpd58Xnz16Su6c%i_Bz-P3B<0m%=vT4%RMlX27 z%o9CCZ{%A;g~<2-+UFQb^J7Qx&Aa|g1jY2m_tm1`SR?$yqCV>n7YM-G20B{uh$N*-qc3Vv zQ?1DCOK6=;L40~T0x~{f-A}aEJn9Y7H61|U-;Y|$g+BxTI9y#pp+IQ$uDZCHk0&S7 zvH%P6pCGkSA%LtuQ9>gr925J^IE666!1BlrrmL~lWcwV#k6`>Ku+HKKo9Wz678%$>u&8SM=tvlQ9HjJR9BpV7M-D16HL2$no-%I(Xl zGu~7_TgR$gH5Uk^%D1g7M1>lhZZ5G&kHyI;$I(Z{bw;}r2)Rq3kvax&ePHCmi-uGp z&RuL+!T~$;1M=2=yeyJKLUZ1$*qDM84}ISke`~DGz;iPKK|rJSY%skUD2VPwcU?YI zq50%N@6Ic+s_~fv%k)9vQK*Yb_94YX(Gm8=W~68duwgEKs)ZQr>-GKEbTZUqvU`a^ z%Ydkw?(AtIqV^we(;TjBdUP9SBxM~Vb;k~QF*(=FNZD`?RU!V3>6M8{~D zRJrp@POQgZ6z0xO3FNPJ>F?Pjzj{4Ua1rJ#A5r=g!VHZpmiqtUasIajqo`OxsR03mpr3^n3xh06 z+gzG_1ejcyRSiQ6r#g;rLIhMK?hC@K8GeSG;PGp!3KzQy&L9$jwO{hWRs zImh-Tw$_}jv&{Er1wIGU_Gd(qph-xrMJ?9Axi2Y*n+%{BGx>p^Il~?U*@T=n`j%L` zPy6dPum6u^U9mt@ii8tGkByjm>N)&|d8h?Hj3;5Th;EbzFN$l3*PdMFVK9?gdY2Le zPH}G{5*AX>a zWuBgr>)S-F`X38s87{b&_zDC;Kx!Pv>Lb^Q0qtb)pPwYZr3Z* zrmv;r22?jIgAQXb%J9k?aQ|c!+LzY zo#jgK5TL+kDU=_^*ZU92n8qUO3OYB}>rAJcHnU=YiN^@tHz|O3F=mXSxItKm39hQU z`{V!;Y=wond-+~k@CoKJdVEN-?=D9asZh0|-Qwi=-CP`2>U7uv__3_Jx#93MhJJ1RiOyz2FP8CF?q_rvRp(2_-GQ#r1QD3!~` z{ZnP|#4}?VNC+*5X6N~-LFug^MOl58+Iyhs!Xd%HR>U5+_$%}?R{rC?FAX_jW zIqi|1-oUS*w4H(4dX=5Q1TAe#9x!*_e%S%r&i>Vf@jEBOWqSn#P)(~Ae9dXNTL?2Y ztwOsPn8ns!_fKU+OR_y>cx={Y8%Nn@)#{p_c3JA2jN})s(O8_K4oV|5k!R?`p>Q}W zqrC!@>}`Yk?_Vs8lV8x(4r*9Z5B+3`SdZP%Ua3WR&X~qjh^hMpvv~ZGGa?t{cxsi* zb?O%8no5B)`kDJ6SG)+k0#?K7?BGn{G=q^tsQbf(^Zt&c=Q8(BewYQRdC>=p2L7%I zizw=lRQi}2{N7ul(dQ3z)dZy7t>LXN`<%#}JpmYH{e?*fNW*S}-HjRLgd9}qrv&`0 z28mr*0@2U$QR4U5*CMe=y7!L69=Oj$qhT{VhfCu3z=tFrS+koMOR2U5a}Jy|^;Uxv z5m0GAmR!|D{5DUbV5vtnNhpN>KsC9AM$zJgSH=t0O-+R-z@@l2=n;mAC}a_x1S0C6 zk~O-Wi2n@mToytvHi!BS|MfTh>A&g-K;-}9g#~#2w{pV5_OGhK&e7w)6%^S{O{srP zE1vWzq(3ADe3%0SkIKg=E5VTp-B{6h@WL+>9G&uJ92(m_Ig`ft_vOEbl#j*81@H{U15^GmXH%Ug?w-WFf7&dk+w-w zD~=EY_NjC_o)B0%O6L-00@Q8?xHi&gQ_x4>zL#x~dJOZVdZNn3;x0u)t4WzLxJH{%3y z?IO%NRVoWW^qP1=IOW5WC{XMQj8}~&Fr>)XYdLFVl#-3gtU>;HL27eDlkXAW$RJFl zupI-#{JZFGDtOfm7a;s5A^yh@6tcE3vQqZ2|NpC+C}k@pOf~eMsLkb4(E8Mbbxo{Rf@Oxr1XMCNtX9@%=sganH)}P zdif-G%*; zF4HK}s>!Wz9}eDKvcCeT5!5hBp!$B9Km9=siZHS?d8#sfk-nyYav#hDcS0RmUlrMM zJ>u}AWfd|FGd%p2=ptt`WmKt-fpS%ru#riJdn%8I1&#PE#>H6EWj0dt_6H(FO|D5;vuKQ>6yElJK$Z85-iT(5s(^wdjOt5i$!VONXK+gx*q*Rt@UZ zeX~YGTGg$q+9XlL(dU6whk7HGtC2*16m+soaEpbj(N3|BCv1l@1J)EKN1Gt^oXHAX zWrE;RCC>@T?MrpwuQ~dNkc?xgx=zy-BbEv4)sbb%Is-K-XEIkFqm(Bs!|a{vi{%Jk z6p|>PH*Ly@q59IhpHg9Ak`Ly0mLv6pJ9)vHxYXSd~B zO(xFz{Zy=HO?j=lD%961SI}rZnXam#CmI&J1|BIOX`dVXzwImZ8TpTZhJb{Cih;;M zWFvEvxNF)g-@+K#{K}%PIxX5MX@#cDTBK)qd&m-a1;x49^OTY7KMBOmewcmnYNZ?A z5dn{RZQqL1oBM-n%i3LF^Nto+&II+KzU$GBEqF{1jrQ@4gOTA8E}QL(NoN?53PYTX;JMzr#0p<9GOcHR?qO&2m6L=Ws*yMYT!T{+-iX zNPl+b>dv<7PVPZQ>#UlKH!$A4k89b@dfScB9+z}*pVB7rxudK|N8zjD z1m(b01q??8ckAtJkk4+s(AQJEkXr4uUGim-jwRI7tAEcx)=l@ZXUKJny>LuM1TC#6 zSDSoW>-8RC?+|QS1TU>ErS_u}LoUaGw>GThG=EwJ!4yWB!|%A`BgwsUqp6XklnSl% z94bDw9CJ#wmZo03LLKKv(QO$qqeHGUCj>5C`(~o z&radRKwUzXb7HU@;yMn{6t9uoMWf$+P`eA3 zzp~Tc!7VrO&YblYEZjnACFhZhJMZBCD|Q5D2yXhzDQf^Q5&ySaGyhDWLXHNe&VPwk z{R?{EQr%HPQUfU1in}J%<_8L6RW->=66h1I?x&MJZIlz-u!&d&hU9Z+#~wt^up;U z$1rmYlrgiaExqfcEx8X7E&;RW=--LxrM60as(#p3!I|uw3Y2ceb{I@!-@fUP5wtX= zD&+}!w%LGFb6|@?Y3Z2_L?6sop?Q`0;|Kj4hLLDN)ayK)WX&9%lh)t7M0 zR6~39MmM<1?I2H#hUYtMxUH>`Rt_yJmBl4|X0E~c6gBl*Wur=?!Uj_!i3_$ur$u}0 z=2L%BD`C*RU9T(NYU{W3jIQ1;f+B&Z@6L04ZQ+?l#*M6E#I+0Dj6o z8jBW+;M4saZZ|_&PhOzr9+AHr`I_c^+KOnlZd6t;og4zIambz#sqB;Y3$s5vtJH#` zrhlL;0{QgTQD)L;_Dk*}i8Wu>9qJ*PmX_^0Or|I26eo@4g2}~{;+(=yt~Ck)y@8cf z<;t)f&`sRzC!%{Y%Z6uS`Q?`}iluJ)K#~D<&sh#;$!?~P&SY(i!5(gOxdiL|E9TTa z&}e)P4@x?yn-%2Vpiqsg=o@D@Vye$k0KR?s%yDct9p6vqh9C|ppnxS3r#jaTLtUM6 zg@8XZ#&(UJwc>Ph+eB!es|x-m4bE4~_g98()VBu&TaS9y=+`MZpJLuB0dm1b{tBQIq`;mh|UZ;|~lE}NEol3}?O=k^jq-T@E6>E^YEk7R21!r13R+{eOtwi-@Cs^Y}xpLH23 zmNQyHDX4ue%p=eeM{0f6C^Ipv;(8!uSx$B;(U9o%jfUnfZ<)0~<{VB}&&@g8$O~)aS&@p1mP*4-a!a zB6rz0;`L%A^6B)Vb+==12@a1d&+Q+R^bxq+FP6zGatA6(Yw~w!J)mhIiUz>PKmdU9 zZxz4(c{2z*8kqeHHc_`#@l-C$FIACnc`Bf4K9;>9I#0@=(Ipd12+bnIRJ22p7EF-`}lKl0sl?zmK_|Sf^oT))i z7z0Y#wvif&k%T3>)I?$br%=C8aAe!cPn$;cWf;EGi>=d_RY(^vW3Rkx_su_jVV{(> zui#{OS6~6F=Z)(y^Oh$?cf}@*l|3@*X&4%|#_$-*DpHz6*Dp8L!SQ?Uu3VVTSG&FE z?ao9)#&0(mx~0Q$EcMPS_pj|3V9_gf=8$Jp!8;9`(J1VhE|N5!%e}{KzUCIe#RnXF zs6xNvtGzTs$_L=#rc#-*y3K+V_@({Fk=9ISvQYVQ%4|I5a?`}GQGch%@IiS#RSyKA zeioi*$_k`?{RRb%kvCJ9;4jOC(&>|-rXtTR%?%_Ja?r&VYCn0!{oPS+$<+VcA?8X) zEHh)OR(GH|U~o{+$2haTx?RXtIy->UjOO9=%RB7t9x*47kXYP9ei9>;yvs&ro(-H)C2sSPuV#7Vl^l7 z=s32SUfC}=wMdae3kj2Wa)htK2_8+zXR4mREw1Tej5(45@{Z^K&f52%(Ix8QXbWgq z2m(I-CG#Yytl9p>T5NG}70PSO!&-m14<$sR8;vj7;w;D7Iu+4ST@La z$M5G4f{52EMqpYk6Wr!bJJCw!D*gCO~8v%+M1QYh= ztto9t5rB+KT$d@#5QgHnSiNVqDs_UPE4*~GK8-l8q%d#IOu8Qg-Od&x{A zreBF<)&Wzwv~z})-SoW4G)YOIbY!}<)%Z;Py^bK36?UZ&dt{yTEr~zA#-@cZmVCAP ziUtb#K1*XlcB=ARBpLdvyqTd%WKq>}L%FiWxMTU?Sa+@54$~xr+oveqf?Z2=%aqHW za=Tgvb_Un3RYyOI9J5%3xM`U8oU-lU4Fs$s4rNrC+U^71mYwf6+F|+cX4|yj5hD!G zWoI7D)#R<(u!H)GW$u9nE84rsq;2%K;A?bS5xWt30*weaMu$fEN7Z@|x@J_Q3As7T z`Y73)_>=|dji~(`ScFK{WJvw_qC-6fN-H+ibuSgjIRn!7q&E?~rtQ^Lg=~eIOJlBI zJddeR#YmlqghD|~GgedW7F8Ra6Mnb($L{Ksj_N9N5lWP@1#&|ej}_?pb-@fMWcG^s zk9N}R1D(B(zT60YcSfhtN#LmmDgkwW?3@ZOLVBx8+=HwQu;2R@HW5bXpM`pWd^YLN zaIZBiEw#?Sm#Orh*e4(2YrGw*iNjkh=n*ug2|b#hz#%LchR8D?0X%szxCYUQ#h;X_ zzL#edaGH%_7IqM{12gj>iPA%jE^uU)aC#fc^4t$r8Xk82Vwj&4Ad66NxPnH+(>y{1 z*t;oJ@ZyW}&@RY}}H^V-G& zSp|u#;c1DwB9I%1nGU^`t>hs&kZCIoIQ_-Br4J2=<1i*g5yC>kxbsp=bV6^j_WGUT zgcIrGro;(7nGr~&4?%}IF9i=R`42Has{XVc0}+mk5f51TZ1o92))zVypm0&zt=Huf zE$8|UWHf5waZsdvTe}hOdJlgjBZe3JPA0w`4`TcEH$kWsE!??NK%4dzaPa=EAk=?5 zbRzD~js`~m#js29ALM=?tPP2T_QpaPBuOY_$t3hrgq3{BUy2lp{7I#rJE`lVA3x=tjBV?z1L%tu4? zvP46@?TdffA`3Z zmvpgjZxfMHwl!u|Pws&S7N`(u#RKVxuJ(=h@ron{f#)zP0>R4*1{!0H9_g7;EsSdi z-3R4)k%g{S8!6o*1Nb(J}5n|Q>id+W_YSpGiWtEuu3HGqYHH_;|e^#czSke zRc~iSAf;%>OIy{0Cu+ZZ-#@ypY zw!v&7u#DBte#fPz@7&_9WZLO(7f?WLCs0t=n93RW=4pSoGG;4dvQKDNEt}!YgI!c0 zg2$frlsCnp7oRZ&v-we?AG>UTQJAy}W`pP$szJuBbeOP`6#a}6G?Q`=LE36F+{Prx z8oh_w>=<5kG33=Y)G{|o(afhq_2d-M0(&uS_g~9|5AkW~GXNMk1+FXQI3^DQ3Knk2(IYJSIyWN+sioi0aTr|)w(OK$r~;H27J@elUsI@xUPZlKtD zSoKS&knVuW2KPOL8^k`hwfw|n%be2r(KgQ4x;e`;SD9CpewBvOZKNuL_-C^jNA6jA zgfuU0-|Itug?ejyg%F0JkYdG^y{N3AY<))JTeGZ~O4Rkjn(vuoiH1(tFxJemc`sBQ zGkeixb*MCm75@*(R)w9mum;Qx8yz>0AGn%p{suu@!Wdy%aFn`iL*z^}PU&b}inAdk zpj)R3_9Cejrz*9P44_c$=%RFr1ihF8mtWT41IAMB1C0Zz%Z&yX{$1D{&sYd9C8bQC zNTg>M$pTYBfd&dcKCm9c4bLLOJUsRJYYx`Yi>Jg8UROOEMZg~jq`g)Sbh1IPZ+X;mBC?S4an(x z*kJ}zVKB8O2j#lJN5V8iztJqq5Q%oL^NW9?XTH@n87q*L^(s*9XW4h|iju&)OMBO2r)WLK*$T*VWgi(@dA!^X2F3vs}$L>AdS;;0|2x z$VzAiG~PRXpcwThWe^_b))9=H@>JuW#fIT&N(@u)+Cwl*HHOJ;HHOg|@(eTHm4<#A z%5|gO`G#R0xrBq><%E;eW$LE5oj;=IcC zJEhBT{%=tQ1&TcC+%&4^eTqQ}RX#Yg4HDG&^7pWcz9w1~fa*#!NmA$gT=dS~XY^(lclVft;4?(Qi2r__C6+60%a$;?t7T64O$& z;q62Zg+@e}b>@fGn15;~4iWw7@P`8b@rqSzPmx3QZ);(T$j#^KF9qL$4Lk*#An zhf)*nkzVAFXL3b^d47(Z#+ZA-f}gZ#kM9uwW^K^dmx^2{AU%RgFfZcU#l-3OM4UeP zV%Q3@+2-U$JEGbvNhm_GguG0Ylb`kNMuq-m(Zt6 zrP3O_m(y?cKblW<>h8T78}``WSWHcR-veW5v0n-7sP+i#AlQ_t(rMM|@2c?#>Y&+- zJx02Yws&iS+q;H*_FJadthFafC)MU}Rj86`W!Ss6`nfmUbgehqvi>MB%4yxGwZ@9Y zOLfsWXJMkl+Fn^{S+Fr~iF{5XUzx+-_uYSEm<5QX4_2@vN(-bWY6B!EiYpKf>lq@8 zH5f8I>RaB#FnXVz(WdA3qdy)Og|kBI-|^njh4F$V%{={4D(;KCPJC8tJ1GflgVEVh|0yM5$g#;jh-~IR> z;otwdi~ccp_?NP4Np(XB$qf06hFBxMGFM@-6d7gk2l<_%*Il%>v?Vf0XwvdNB5FMl zq%Etw*2a28*G|*#qAXdnaUm=`jo#&qbih;j!$eLpUQn!m!L3`-rEA4+e;*nMxSO z80RqJ4k9S%n)TD$(7X$8fD+KsItR@FkI7Iq;m-2`PHn`y^w1Sh<)XvK+tz#&P;SH- z^Mbg%&DGR$u|x`zDzW@y6YZ&UFOb%R14~C~{)H`n%k-2;SAzLIMjtd%6d?D*!fMlb zAkCYg(4#h2p>+H0OLtMcMTxLbwy_Zq8;zoG6v?twnj@{5Q`5Cz z=x2Ucj6Y_F*mJSc&u-H7F2!LKvo8)VH9AtWF%+8n+|ROSf$XOha&OaFQQlMurDQ8o zNN z2=lvTbIL`<0JdmSo+%|$PkIy;(H|y63Hvn-ExTs@27|KQ4bneD*VGNh+**d(jsE(p zMRR)vK6XDn7iUQ=Cj*5zbWYkv0L8MYzE&DSLy100&!)G)>GtY=+Jr^;I+ITUlKq`> z4ehs=z{~3*4m(*UPhydQl+nY+!uhIuag7Uly7gA3vJ4XKVN%E&dXJPbuT|oGA4t4h z0YQ)~Y2L)ya50ib0_r>j0!SK&1^(Du1m5J?$q_7!&NP9XU4VEMH_aXs>Ib%-c<4cC zppmp^D)tB@q?)}-KT#=K?Vj$93HY=kEv_{#)T%BVe)2L(6t4%E=wOOTKWY<%%g{#% z@YIoGxnDQ|LX^uh?9(uu*js6N)sk8Ea7Vkv0b`2&pCSr8lgCF` zLUoSA0;QYGhDaa7HF#c@{MLSnMj5&xY3xs}@m)*G(_g1amdF zf+ej>wrt!_;X?zpG%qZ5R%*+aePFjWAehvdBEm5$YvCx(cGH5aP_IGVZ4nFOe>ws2 zD#Bcn9(mO!w0;zGatG`D>f?zf8zpveJaYw1sTM48ZAqv5IqflScsAZ8fstw zr?MB$;XY91bQ^SWybIs5I3<)mP;WoW5^`=o%M+5GA==8pDFbkhb5LUTMh?To&JDp4 zj)k!!Z6IJ=6FtTybTrLz5lly5TBCJYs2a_?g7pzQ7*7Fk zi;eOM%OqY2^*#~kzx}B7fmr1Qp~g$SDAs~IHkdc{M9NEYX&q?U?J(flWq^}I4<=FS zWu(3}ZtmrxwpVe-oj9q>N9L0ctf{{fv-akbc-Zn}<&EflE<8gmx2@$ge1A~)7^pU7 zB9$0lqCc`M6#wlh^_y2nwKPxYReSU3fJS-7Xeow-H{0#;ZdLJRUGZH+%zH-hWvS?8 zBHI16TSF-~tB|8f7fy15dl|WW@bZQVq{EV2!v<;{WnY9Y3azg$4$-*RS)N2FvZ5t{ zKTBwfIUwB|cl2_-UmX(No?Y5WW2-#EEz(X%0$fl_B{TU7 z4s^{9!X+Ij9lO6AhksYm?ha1h%x)uaYjNZDmoo_bt_HZh3&jha*sT-0k>3V2ebgU) zil-aG%87o@yUwUB{Y~UrL4+r~@*IK8CSt5eVxUjGy6Z=v<*&%yDMbE2VdDWm0&A9W z`Cimczv6(tzfZ!42hLTd0G)}s|G6{qFR97S>0fC~Ns3ldSO8`>n{EA==|u%y(;Y%i zm|*jZ${j$>7@}wv@pME2+u1oQXlgLtS4FEVcNT9JPsP)$!4gx*N+Xryd79(dVKt|x z+V|V)aBv9sF|>W%t^tA+YLX7M*QnvpP&( z=T}`Gr)fy+hKgnyPrs;1Y9B93f_uf*6mC!DDv-jF!fVc(E?10smu=AdLO%cmu5DGVse6gY!zuY`Ni6EU^ zEk!kkI}vi^*w=-E`S4rXTtM6P6Z_b6bmO!1pNMmMBX}bUDDVZWAy!iBgA1FQ|B!Y+ zWTcFGkF2J2Shf-KB`Dv&Wi}!@9Ho?XC!c54*atT~0Be#hp|!t1$AP{f!V_!ruIy4bXo0%TkB!|IF3-XLtY>0Gusc z|20Coly&~$jV6?$gIcGuUf!ts=7)j`qUAHdjOaf`TF4;i&H^pFj?ix9iY9(w$2ccy zv>)&vL^t`w!p03WJlE&xEH8j*pqr`h$LAeVFYl9#wc*4dt84sh91Fq-5pV|>E|WRo zAsI{t>TC~rI*3QBe0qHTJ^+- z<_;tfF1`2Ul*SpiB{XmOyVk(bph%MA$0ditP`9K(w@gQw$Bp=cqEPF*z5V>&&xx}~ ziUeDCosu0_Z-SA8LR4Jn_;+dmyLTo_9>zl_dJN9S`7#h@jeH|XdA!nGxdDsJo}U4@ z0Rtu_#(Ih2AvC1P56_)cfys@+K?Ks8=%Y zSH2$^MWVcH-{1l=3^DpswGFKh1!6H>I}a#*En1w}u!iL}33}6eE46}`Qcd%vYnH)t zJ(w)PVKa(|Y!epLOwn?ut+LhcmL<`EJoK~B$hg6Wv!2bCKU`hWnjXcD3Q77AKb1H? zdeIH%uY~bqnL98XR7$)r0njF;+1Qck1*_8Uf=`dEQ_WPdY@XR*}*Tb(4zT?R^70y=mM=lnQn?f`ctD-~Cl`y)P1T-G_^>Y)$h2=+tW7~F4zW;4nOe%t5ybGxIbWAY;B>+_ZCSJsO_KPNZs9whhKkdpi={rS*UXahkXSQ0E52{D5z zJZ#B116&s_1-do8h_tx*-~u9b;o4-fJszWVs&TRgWC;Vw9tQVB@=Tb!Zog(H{(fX= z1JL;}GErWIs%CF+s0B$tLE4?e6kK^ixdAx1Qw9Q!%`=4kni5j^uc;)@^uC|cR+Q}e z6k`U8L@p8%#EZhKs!AZ;gpQJF%KjKy3jrZXkn2ywjfHuu7!mm3l5Sp3QaTLreYFM^ z5=-Y4yw2C`!MF`cFYa=90<6O_1FFnIO@{3jDOs3GY4A2h@s?x^#5HAPuS}}zjUbJ* zuFPdvmaH|`X8`i~HB#*F8KcykD053!g&x!mJ_S+hHwe)39qH0ZuYAIEiKz1BTE_B( zLJGrS6d&O_=4RKxYUVf+eH9c+^~n)tLdI74Nocsb-H_Ex4AT+hjJqxnIFMEv8V=F( ze#rC^r#>W6kxp{{&6K&vK*`B*g8;#e8mhBK$+rz62PPEhbW=sO0A`squ#eMr%$9&X zWlAHaXYyeixNkTMisyVsWdj1{Y3dJ0GQjXqLw*PMgj{6%ouMhhozmB#?jpT0Ut)%v znlg3P<#Oe&%2S*{o%1`o3gd4RCM}x1m!$=g%Vpd11&+TvinLkvh*c4l{p7)CrRu%Y zwng|OR$M%%^%uMqs7{&cjX4d?tKC8yv5$3}tj;{3A7w=Q_4BA&R2!(SCZe3cqy=TV z*s8f?N|$GBNromPQPiHTs8?2$m#xqaPUbdns{bPAQx9OwuOcak0Wc=Kb>9te389~gNH8kB}cN6InCm=GK=dD9+1ds7?` zcE{hbbjQsFPZ83Ny`b(WY>mF)iWygq-~cVt4FYv=HAPRGxKMoOO3t6TwxMv?s5{ft zEyRdfL=&-j{Fr%QLmmDD>Mq+vAsGxu7HRT?_mx~sVTWGkxj^mI+EzD%wzKal|Si-;a$gBqjyOx#B7~U4EW#am*~5M zNmVAI@8l{b@Jt0A;>%#Nj7NeuDt_8polObPl4NyNpwKz{dIDfQ`zR zjR}j4V?Bfh3+jctL7gRFN$u1cjnkqN9G3Yy01Mc;;78X0e5_f(p;YR%*N+Vc zhz^842khc!FJ!Rb*dYYxxFvZM3)0MD2gbsu#uvW)5TQOO7(54=mwM z@W!FwoZ+n%@0nppXA>(SadRa%q=z=G^r&14IZA0i(R!4oLx=Wsfe3D{QQJ$X;B(dnKv)FYi;{NeWBn>NclsGxiR=z|Awl%2 ze@Qh_2{v-;@__y^8dQ+tY+gN?akz9g>$!HaN!*L+Ty5ZGRIo7}G^;yVvy_F-yQ-6% zsa8FFEqv4Ereg?bWGdf4H}>W?P8oCkg|_uvq733WBQCRh5-mg%%X< zhlQ8Ggc&XHVya)q=FPfpcF+BmlWjFqH%q?4sG2j#fbYTyPCQ9}n!WVctizDpbGD7} z9^qlze%Etp{T-Lu8_8*7}y1;bD;{eGx})R>bwKmv$MH4!=c@MuY8wF z4Z0&!+kGy35BDR&oC$mue4Z|v?QpGZk3{@uJ_K%P$E+j*T9F1Q3OqD3?YwOcBO$X@ zlT@wd2NogPcbAZ1n0#hhgf?kSs?m8`w(;Uq#vhe|lm%u%)1v7ceYoO_-Guizb8<#Q z?mzTk6CV|#l@0SR6G>iD;^m}1!I6V4;vB_^X+*9kpqaRZb<-IN)ulsaBCLai4UNbu z$i-U;433x#7cL`yREV>Ni5aotWop+^4|eB!)hNV>reO)l_$|^6?&t`9_^%Ej*NPi4 z(AWN*EU4D=!(ko}i;w>gFkHgc+2rpdWF@V?1gAb_Ge{c)wNzp=ARH|s5NWsjfRY(q zOHU#CN43b!B(23WnS=I9Uce8BzzvYiyl=r@3Kn@RO23!y3bA&0x%PaxK4;?b_4t6( zhXtWyI*^5%Mv5Q=pb|0Q4uFsbv68@DLpjK$KBI8U-^%w9fvxQwg`ZKTl71wWFqLvl z?8^=>PMGMLo=$AYDr{6HN(NWl>Dabus*d(qc8+E;P!Gs3MH2hh1(Wn!o9RttnOlMF zWXM)Ch+}v~Ff|^+M$oCbvbHsp+od0dom~0bR-Z)^Snp7@ZGbVPan2OVMr9s3iqW;= zN*J!3a<;3Gh8SqU1f&>@&MF^XzcyzvLm5_u&HN9_$2{hjmyqnd#(%3MMB5hGxEucL2gdGFKYg#??9<_Z>Vq{1J{qQO3 z2+CPoU6;msSvx!U?dwoF_K{!m3GUl3W*jf8x+^L|55mJS8q3TP_aWz@OjRcH#D-)Z zD^k&}O9UVH!3G9>>7occ(y;lOPqZs{8qodyVT5k@LdJ5bjnPi@PShj{XhN}i>AgL{ zeS0W?(Zp0*-sTsd+k~vtM`?QuLMKli=$0|oFA@@732<3x;<{teS-PCloH6;vDvXat z@$!9@EFY=V&mr>YAn@Xe0xPoZcCb@nD&Y z;|Otz9xA~qJiY7S#%o61#ign@<>WkBjFrtPc^hWCg}%Umw~n&VGQNgZmCCe?j?8=0 z#x0r!&LCpI{|H+Qh1pHc$t*H=SeA?$6_e-XkAuSx;)|!l?v((y*YwF0fM;6dCOd~m zIG{A1yP?TG{~1GWfD3ULY$ObCmAk~7QkvqOJL6t8!!8<&&#jOToJRsWrU#V#Ihg>Z zXdL6YwM{At6hDWES71{8@V9EUR5P)11klLH2h9BbZ>v=qz}E8LxV1^jSBe{=$UIiY z6R6=^=z_e`Wk4hh!K;6)7x>S>{bC1urO)USCLcqnY1HuxBdHU{s19LYK|U7nWVG0_ zT#MmnL(U(sB}dB{=y77yDz*Sy%+H%vUmr7gzTaCTXkbaWCl8olV`|m;5u^JfxN$2r%_EA|c~PSa5gM=7|g6pYJr55{RJd)&_>z>K|qetU*t?A-*@wdD1i1}BCkjt|f*)mNG^&B`--^}?4PBn%$D7!Bd`sT?y=WuckIqdYI& zgqdigQny~hb3tH*e*7~0*%i%}*_p-Sb^uKxQ;$(0>rQ~8)+vEj$C6OBtHhar4_R8V zd6vKA1vBy_|G-G0QL?+8e00VOgvu+>Gm-48Hu#~exuGN3qVb{ZDOMa;o^;-u#eSqS z%PGZvLz7^oC9&*X83gH&fH?nwJLVseG6yqX6aTjxyHUSkap^9{=-WkJNbibvWJV>*j zzdWT`;`2S@@-ZXIEFV?kD5^_SOCmrwF$pE#9QYUAghZA|#DAq2RX8?D!fWmj$YiGn zS`=-Lkz5~^h8-~8;jGd2sl)`4^BFnMW^N_Ik(g5K>iTCTviVR;89bMbJ>TI+XU0jM zy4{jJqTM*`p+$CMeN#675Qchr{F_AYg69o8KOlv!0XPBw)-UDXbPwe0P5uk>@jrFZ zZQVAmG=HEVQv!*+`8hYufdk(Q&ZaY4=35ZjZCrtfChIh88NLFnDtg43?*Q2|(yduY zOEdq4(dlIJFKKks=an0PN%W#TQ(Rvb%slyck#T-xc;qt7CQF{t7XQ*On_XNX&z-vs zTzD>+h$#Hc2Cc0CV1%{z(6>098$DKGvUUB@*616@nFAZJ=80T8C_P~>}2sDJY4 zei!}5#aJxSpm6$vGZH1d%T%dr%o*P@Qjn6pa6mBNSms?^h8I?9w$c$2-GekzA9iXD z4=a&8ZXC9>HwRIg7|_E8i{NJ)U)0Lw)HB zO7-=VhkD^8>wB9Y$Z-+nD-xn2-4)m#anACDv!|rH|C6=J6-Z_Ld-$M3Cby6koP=gc zT)uKbER}QmRmlNm^>+thxZ$Bu0hLBkt^yvNKmLbo=6K*JztMAIs5CyXRl*S3b6=YG zOG0yA=tXIxW0im%aoJEjq$uX8pv?wT8D4*}!;1x;0uykeO4M3=Lraybs=(&^2wG|n z7Q}HdtB?py=QuvxO~p=#w#G<2K|xVA{E!n={rvTL3^Ht17(D_}KV`|?d&T!(2`ayh z2X~YK0ci-pbR7SetyOuzE}Dz|-_ljqUt#$lPLWSWdFz5hKu!LV9YeJKq@+J|L&4&M zQ_aP9Z92Akn@p^l|3k2!l{ozc_+4SR&28mpo%sI5WEa4_JdLB_?c(`4=NoHXk|>lY zl*D472HJ5My$h@ZZl~#5dWGTNZE_Zmf*9v;Zf!ji zwK{E4*QD|12q^0p&Dg=#0Ugr@U!7;}Hy!qEy zwk>aX!bNI?f;<-`(Z2Na21SZpI*>B@h3G?Lj}jb=oh@vN+`47)$DT8HBmR;{!qSys z83YgvH}Gtl*@iKzXO|H8gpUH3t6BEY%5kj=b{#%5uDVVH%l9&pi#u9q$6HV$;HP>9`I`|Ir& zcNn8|ws0PLR)jjtMC##?R{u-z>Ip#`WdMmpDL5nnflTBPguORrCn_ZEo&bpYA7;>M z5&wxovv1o)m#L$ysNnLV`GqEn#FN3ss2WiJr{t_I}n-|TAg%LO|zXTb5|K;fodPRkpqVx-+9%YUH_uqDv?zCDPb^)O} z{QppX{I!-qtYmHH{LlRafHsC45@1dw)Usuxk(-#(iJ+h6Z4m$z5+`FWOxidl`1lI_v^rLrq{shrfP{AC$iuC;q`TB`Q%6;e~Di{o4E2i2L zq)ag3s^yD}A$BleECw2)EUNR*&rv?XLB>UzFvk~OUZynW*yyS>=9<`)O9T4*-a|rU z(@ufpde%(s*%F1U=$Ug9cv_5Ni=ClFG71j&Hobkmbh37||3R9UZBYU=t1LB#8#UB%n3QGPv%6E=wH@4&P`k$cG1}1Z%_CH%-kzuoZ2?82Bdib~Jqog(`^>ap>{} zjMgrD;ua+srFr{RfgfBHL4;;U?7YO&N{x@4R)Dr5HKP&s_yG2;UjQq_8oSwHa99Cr zgxwST1)U-Qgw0kT2!<^z3h91k;oDnivJyM*52IF*Ws>RagfHUv<}X6c!Riq*86W=# zWW;B?wnIGpifj)9sD=GZQn_Ta)PR7W{MqTaoPHOlbbE}ZtHid`Yg&XN5*3 zU>hwt%z$k)rQPyi^bS`IqOfYx1gyu&h zZ|{-(KCku481e5Fd5ox=gC6A3j(Gh08c%M=E*v%Bz??w-Z>-Ay4dD3aSxHjW`fF10 z87#|4cGid^%CE^!sVqHC;;3RlK4r2lDyYarz~aBpoYf3`Rwzq4wEq$O+yVaymI99` ztX=PXcd7Xa`sM%Cd&FBp)c9k?pF7j;=H~Jv%V&DcO!f2SWM$_&c7F@PsCsCBA1J5@ zC|Ut~Fee`BpU8<2umOkQBJwmkryV14M&`CNrc8Zv2d6ZH#63hdJp=Z!+Wx5t7$a;w z6LE&l;i(mjc^EtU2bo})0j*8%41$SUIJO-Vdi3ps<2RTC7`4_v-v>YjLN?z+4dVBV zY=8F08oeZDibx5r3KRS{@7 zdU(A0<>R2_i{eR6D2n_M>Ss=^dv{4@zB(^1^#F7^VL0 z2Kf53+jcM=1+X9(?6n9 ztw#q3%vx8oHfSPWSn zEB9KsYg&e1M2lQ@Z);72I(6(i3OhKQ@*BtzZtb+ml}iDy6bT>+R{1b3O{twCau!rj zMhLc}7qsiQim%GV9RPdHU!o<%vPm~dN7mlVi5AQDjyvtzJquKOQV z&r`%DJzYxm%Q&%dtF)-L8k5e}((GuEPF3Dg$#&UJJ$MAXZ3S~#c?AfR9psP4cNueJ z%V+Kes#>*ni{M=1q}I_mDoclNX4=ug$%1i>I+VM8e2BBV_n5IepD>}6FJWEt=qO~i z>92Te9-OYLqT)5g$x7bpqefY=mAhux#@# z#O{ex3FBv66udFa{9lMx@mEV};lKQ6X-2t!4z#~OMV(tB7ynsjmiv$-QeziGAkba8 z-M(V`fxGR1Gj8AGjdOW!Ly{#6pNLVM-cfcQrOcp)Q>e}R*11a1GChy0*5-svcL17q zM_Ba}mkyML48nsYZ!ahJ-CnKjINedm@Bd@$or5f0x8&h2yUVt1b=kIU+g6ut8(p@o zE?1Xr+cx^!=bk(B-E;1pnP0@NKld9uqVmbL-u2|ltObQ(#!Xn+@XEf78<+1tx2$)L z+-=qUAlom;JDF`hnZZ8p23JAgsYjdf0-GU+q!k_z6*vxXr@&cchw^KZ8K60-XX6oPtk-OH%M;0d-mWVN;*y^= z4;vXncVMcXQ7D+vV2=N74o0QTrFU#M?KDlsZ2ct%#2?G!DUk7a?@Nn^*Bs`mavIV3 zV+*$%$M>}yVi0~y474FqTv@brx~1#~Mcvh~*Wv}nvG?RSkX*-X)5pLWR+jalkPr$( zEL%dPUS>E6X)8#fIfg)ukbM_aDc-?a-#HZ~<7$D|Dvs_kqtE(OblNvrnP&X)xu?=u z_Ornx>ttKJl^&m2hGWoJFbSexXO?C?WJ8+P-TEwR=`P z^yIvWTuwy$S&+P#1}M5X0X{z8{5jB<-#kEdoq~_*wtF=oRJ;4wGrsW+P<_QNaHLx< zw85;k4%>+8%KJ>IP69Yt&#(xjA_clfC4tbd214}pAiBH7Y_mVhiq!{;)2$iI{r;Q4 zfo}kNzyyF;N5CKce?smb&iE#_{}toG^)UnFyA>()Kxi9FDwc^`d;AtQ8;^kK92M;Uq9c8Fo2n zuyTGMDbFAZRvH$eccd4VBppNjZ(g8)ANAj^KL8j1e|P<{H?XjE{!cEVjadTU!2zez z6)=9`{9nH*|IbJKPd=jAN*A_s3@ALhJq@+D3g8=@DL=nANec@?0trE?Mx-grmcKhhMn>Y$acpUtZ4M;J?7zw|qBIrZKKn zePOMfcE{fcO2(JaZVx~BH%+a41jjV6iR><$t zB3n}049KL*BgTl3DI2&n--fwx=#gVi%@oLd($bbnlp~*;@rT94!`;I{uHef0g?nOa z_0wxDQMlZIVczi*VMv~%!VJ8Ex}Zx4n+kiOA*yy0jCcdBrpUtK;U4_bZ`(-rTFtOj zBvY)QUw#uCQJ+AQDXDQFRT2y_);P~RJyJ$#`;mk8Ob!kz<@558XNl^BLn^``&s>PR zel$GV;j8=cvmk|7q(N?r$nXvMBz6IJ-5}1Qb>&`jH23B52+{EMwcohua#o!+w4XQL zvu8c43orEO?Tb-**N>#>2VQs~0WwqUj?I{sscYv&p}SaMjSjvyL_TzHZMf}*XhMRp!X>;=Llm;35u;s#zhnj^Y;xDXNHOTci zhEOdObrc%K^_ld){=U@w4XOmY5P+^|0O#}mzoY9Pd=ChS`#0xOE4fvD6kn=fv`Tho zqH&$|b@0u!OlzuB`2b8PAfcJyb0q`Z3PBCYo!IkOY3ajylgQksA1T>)l4wz;qm43? z9CA|^9OPGP01L+t&}&#qKH~up_XrcPIp`b+gaPQtpop6<9LP8~f+ArLQm9ImYAQh* zHDzJ7x@vJr+hhAuD~cL@`ZLxnT&An$Ez(e$i_J3RI_#RX4WtGWJD5_Y0S>{KKrnOEkh#2jO6cNe0A&XS@Di51u(6kN4I;(C?oHRqGCI&2;B{oxcWtq3 z?@qE8YyD-w1`HqCWmw0zlS78x3k+})u>@&~)q^yI87K{&cf*`PD;|nvK*F2>U;KADIQV4kUEUXWk7fwM|nJvoBTE$e5d3Q*O8;tT{b_b zm!6*=O<(@Y1a)uRmwsL#QBVvOPz)tMgj?s6!qfvg@Q3=ANW!l3Geco|YMrPP^0=7a zwxoi>9ub5jBf3A@*es~m?&)T=kCf3zOuK@#3}Kuzk0H3@q5obvsEp30$Npf~|7lC~ zzj^sD?D{YLPLcATvza;e3+Ry_BSIQrMYPM%-3X8h6`(RkC=zhqnYQF6Ch4RdT1cOX z_`;~+QSl;d@I`TqLxLH?bCrZ~Q@i;je`B88)AU2azZ%Yj>Z zR{<$DF->k4O2|~^eA%mDJhNJVT33QHtA0>NtrfP6mhLRY{@DG8Ay>3wRa=*hCutpd zp_(RK7V6vs8fH5z9h`wi!DKHR=B{X*;|_~`YUV7n$&Y(BZf-ZwE#ETlL|kVI3&YW* z;+FB+c&?NX`AuJ#Zub|Y7b>Aj>!omWxxu7e8K)AmEEnB|ky*7mI9ruAqw=F^jJsy( z*&put8S|2-HJJwIow^kDgq`+yQf=?QM^YI#9KEP!v~vy%+Niw7Fve`C;E;aaLkbS6 zX(=sDmHT;LZrFUUNBAJ^hb|FCrF47k+Hi)gGo*S6kxiuY-S^7s(+$%R!&p~p3|Y!R zX(BE!wn{jkDs1GrOm8MpT!{cqqLD>vWE3{ZOFVP`&i%a{9v|DkH>~#=JFx7mnw6!5(abrRR=BA&xR6Ju)iV;B;%pVE<%y zhb3^y>9f8DrvJHZOT9ZH(>c13KbNxrLqT!c1X-bddb32hfJfrf7j~LcT<&TFzlcXE zjTe}D9EZqpJFvdd^{rZe7%NuyT0V)~hC@0&hA zc5@37x%Xact~?BIUyyTb{0Gao*Ar0pUFlj`B+zY>h?vsjzGK3Ii=5eRmk0(9J|VU+ z%ZJ2X+5{=ooL=L!3Jj!hAAxgYWNKV)LxU8$bz6gBZ#nES&e|Fab+<4n1dbhMLR>$B zZik=&wSlj)Up&i%C&}Z)e!}Mz`@!=}P5Y)AM$nBGzxd2TNcB&0ms+SamHUQEq;Iy&C?TE2X}&i?{&l@d27ig$IljG~?; zZd1wT<6q^9@W|uGiDP+2nc#YuT~rYY+(vBE_(5}B_L)&TgJ>TUn1e*o(xk9eY@`=_ zG>advVFRJVaXKPD{EZZsYdW5PFZ~S6r>n%;>1i&_G{sPFrNQGm_F?F328J)dVp)YY z+t}T-`L~p=IF;-?iL#D`ik$x5TT(#X>9IKT4!RLAb=6l`rNvbTfA$3Fhn5hp$`9>MaX%bvE-R|EPIs)$2m)=qVQv zKu@Dj9P=$_0HI&0jwa$DT|H%>9_Obd4q~O~HFp3yA|Org39iK0sbz>kp|sVc%iY;t z--DCyFs8)rWhg-9E(OD|cqeVW*(2Qlg0WO(?b{BW&@Iy34b7GCRtlS8aHQ)Xw?2ji z_$a%NPGw(Rr!5wlnYfET6t%#D$yi;dN=UzSNnVHuL`mnojyyYRSD&dHW>U0d_&yv8 zO=u4XCyk@qFvaRUlX_`dNS9S>N-IQcM2nq*#N7pH6*$tFrbOzf9u#&FdKW_rN&zch zxkkFzn!txrx^>N0VW{>?c0vzKk2bhfu*s_dVKwXNNZ*R)nY6HO=@e7J3Wu5#h0*iy z-LlVpgkVAI1#-HLf{y-i9UFuJ7}5so)t`{^!ne47Y8;L--4@~P@GWYrzh}O&K|Us^ z>DXfB#Ie3UhRKI|FO_S|*RT$kxrdmk;2kHb7u!f!!$%slb@d+kt*) zQgZ<1m|}S2Lmp!Iuyg-z4Uc!fkb6Cv^SkGq&UOZ!{HrBLpLm4#F$^lw=nOA~V+vOh zt=q4xM~oe0jAEA{+gwQeVxIU+4v4Xd9KxhbE+IWzWsX2cs*h;s4q;LY+#g|-5e%}M zWXE9c$6f?d&~YUW^$Z?JSc11C%J-v*)A?~eNGJTkvK_slPFsktity#XhP{}=4nYD4 zq7-{J{MVNx7r7Ej>`Op2EJ*2HNw!EuF7~gF&~7EgZdsUsJd&pim@IA2VRuA}_HJFG zzn#qr^@%N1R1irmp!++eL3tm55dKmtt&*^2JCO&bXB=N_qqMNF*Fb(^El5k;1ap+6 z0($i$y4}HRwT#s-=bvn1g>!Hy#N_ zix+G|QOJYaLDH&0Eo_Di02T=l=^eugAxvkIR!@}B!tSUFnr^7Fd7B6)es1sHDHgXEG=$FzN;Gwepa8ubyNi*)qR8-{Sy zlhntg=DZ|}>n(5eE;XX{XWMtKJbM-&=J8()*tz6PQA5H|r}BI`m-X=5dTdw(8GC4e z`FW6_b6WxmIJ_At#01Tt_aGI@Ot&fg!?Qkn{_!rb?70&!ITwedt~JNF7~TAR4bpGZ zrYyy+82n@17sgI0QJ7OJ9!u9_cp%Z)UD>?-!w)vUDLPIu#8TKsxPJ>*Cp*( z#d3~R#SD^UrcEO|QjETRxc2;hk%;(<&CN#;WTF>#y9D3 z+f3v9n)RQZZexOegfzkk*SyWUOa2KdV*W zP0~QGoHI>u$GwNBQ_3k0qqp675+rF#wDP81cb>l3NjtngCoY{>pMp}Y&m1hPO%!<& zf7V}={xcrCzX*ly2Ujp%+kKu|Uf1e=2iFtroSXrSnv1p6KDn~t9bw@$C9hOI$dr@1 z9JO>p8!^MDUQST2JhS_EScN0xP$NjZK7E(kNF13>d*Eo5h;4SQroQC*y-GBjC9`KN z{`NM!`7|S-I_3#jWjgx?|NEBI(@frlYq+MXm6(QOs{9(SkWtU}sm|ty05xw4nC!mD zcW65Zuow!@1LZzRs63j60 zh=^dC)Kq)yGh8LYer4^0uf1Rew>TBq$#FHIN7wZvG&wiiI?qAU=I%_;=RY1Ft*o2(8ll*8g;u?Gtc63n{tD@$< zRG{eRy6x;ES}|5*#lc%UfgX$X63ZqpdkZgBgRiaL>`?`o)0uJ~a+E!F6e}jujIVHc zcUp~=ySYKqHy4M~wHn*_$Z%H^KclLtqj=v9&{F?PsX6JV}Bkj=ztJ z`&f1stpJS!F+eZK^S{vAzt9t4WGrn5h`IT%(ZTrU*y-{0PpzBrkm$;(f~m!3QW-%(YUs!uy$x)7obJ|=uc9>Wp^ zQ%7lrg9FP~V~K+KNDhI@S7Vii-cY__4b*I@T-+F95^_y^di5RGX9@f+Ce=N6c7xY1 zLmkzA==%H9ho0>P58m+3|B8D*UgL@fb{(#5GprTWwJVSCF)}p19Ja0LaCX&=+Knc1 zCqSEiacN1UnK1manr#hWE#HFa{F1kzYh#U6v8%e#K39ur>*E!3zrr(o6^Uh8baFQ^ zN)ybLwUclF=H1oPG4Z3h;bIP1h0NS%%D%&R!|4%c&MlzYVmKb%xnk}}JiSG5>82%X z1UWsyIlXt~!0^hitaLF0-Tj8U|Cl+|Oi-F@pC>~9Wy1>z?O%i^J*G0>a^ zXGKd&yzy1thIXlT9z3z;OMwJY*~>5>lDwWlYcTkLQd-SPAhEJZ-C3`ncaPLROMXsjCL`;%mxd`l6w-(BnrZ#4=_N&?_bkxg7l;0Q_k-GfRFQxx@R`_B^CWG6DV1 z%yLlT)!d+25DZsx=H9ps1#paJt`(qLS20}u0pFnc&pRP11Oa_~^c(6bzaJrdMH!!h z*%T#-lRhz-id%hag?EjL*QA>TGYoZP_kMpBQf&l-**^f94Ct@_!-bFizcm?uImQ2s zD^i{KqtW;+gTy2O2?ShJs91=?N|HpdXb7W9gpY*H3k_!dVIFFXRU8CmO6J~ft<&yu zHWX}YgL*RKwC)+>m*jbsIZ6@)L`rjenfY}2v9Z;mcfGXL^8uufBPV#=s|cB`{*@>q znZRcgPCxkoi~h-7OeQT5RdcdduI3LfPt zN)~%%Ia-Ks$@Lkus4PA)SD`ddphQ>YA^9lEP&4PqCVCR6s9kZI%wrk4c~-gA=d(KU zYf?vd`?2m1>YnYE#Y~OMM}^p>$E&HRtcj`91}DnWRcV@fQ{zl)lrl@>Ye)$SlveLH_^;zO(G)Sc90bA)EESi@3t5Kc z_urQ-McA8kT!ffe1ZB@WM*)v6TmmL|Ub2QXxb^F)WaNII6&GLy%eSY^lc2c$8dW@o}>g(7<9omSoA)vIHG*I@Ir$|yd9{bKx+ot z{INmZbM8zGH<(;jycR(?%ysl+8I^FDSkYY#OF+@5LxOpfSbn|1q$Le2fLJ+=h}MKL zh3e3up&^o_$(i$sXaWyCO4a#;VI;JT_6r;#CJ%7lRzbfpt`mGB;^F5|Rbv zQHs>0IAs+*YP;g&tG>WI)k3RbPG2geEAf<{o-i2|6N_1 zi@$a#Kesb*S_?84n^=;*RXojS;5T$WQ%z9t={1(KJKSog`>@^9tOXJ=TP}*kqNT(; z@RnSRRL?hQ$m7}~eIcng)X^CUN};`ryexe9mYssKZlO(+C}}4lx!Jq z*oXEJS18B_NXR6G`rd*J3}gTfhT%A6BUq-wNk0CwP0?)TF5^UB8{i=a1v{ivE4QfX z2T6Tk%cbvO3oI91R4Rn(7G$xn(kjJzOD;fp8+MH7pq#Tj&a!xZ(D0J?)|_Px;+QdV zC3ZGsMTfgOIi5B-QtkCC&2jE!sJ1ayZM7D=pgGYE`HSw^=|msh#78>R&OCFe?SUCv z?b$!#rLk#uS1o3`%UOIlS?h)G)6LTvL3d(54AEclt1 zty~|_OZ0#VZv+3qIn9booDi%23G-JXRY8`M5dna`_p)E>V_tg1Uh#HW0H;v9S-VcC7f8s2=@u6&XMY3p8vAotN4EnGc;;j8mf1+U>Qr$r zM=-|X?n$(SFv)5l@my2u-ZdSF6?5TN>!n9{OkH#K^49JPJq$bCy8y4ZJID%J@R!o9 z16V1UwFA45Bizd_X0ERu5fj}eoV0TdgKqmtA2~7+x|39|7)cRSLlG>z>AIpFg!;>;g~oR!ElrcglE|lNls=yJ z*lS6@-8nc&w zDE%qhv0<`yVA$nA35nLYA*fbihma6bnucQdU4MVjdJXwoz4fT8)a>v5z`T%uX0w^O z&0!}mr~VPl_B1ih&hd}@n7p7=iDUP2BUlbxkF;CWxZ(1UCK6>7R&{_<+I^D2)v&`Q z)JrBLShAn1xx8vlX-DflprgA97o57_q=q?at@>Mo&x}3%>QR=#1=;p`-P(G?CRp)$ zrtEW)x$TN=G}qS}=2~KK7opa^E#tJQ2Zy%q>ovqN&(Ao470dauU1O0}?-m!;gH3-O zmyyJ37RzQQb1%Ve;*#B5NUYN5o{z2sMoW3Pe%OZJmmvnHX>SL+!J;z zZCk|Q30w*NqM;k;S2g!f{^G)AKxn0|8=maazd zLmNEJ3n)QIe-;5qMq zL#4P2=zX&}Q0iYB>`7G9Hzoi^Y2SQh@(O=!l{J!=APjFqhuKER-p zD0vx5%Vh`ux?PIhl%)MFK0m7p=k}|cc6Ej<>vfSOnv>9~F_ms$2kWI&)n*d|iXBw; zn^=w~l>})ZYsd-Eu&J(hb4A1ZB=bxN+Hz>nOcvYbKR-atM`I^l5Fm z?lJp-R2fVT=6B7RuWUp2_Jub4ab^^-JBCI`VA#xQO^kpRdP9$?U%dYTrA^MniRa>c z5nhBi4?6dOcRFNj?P53Y_d<=Pwq8+Lllg$rS;H!NTH2hd=Va;0P&fbnL@UjZ$NceA-Yng&aJ;0(B*k zEWZ9B3=Fz>)@P`#p=@f*3uME05?jSis(lXDf~9vi3_E7icVIwzaTLCDMDEOTR$%t$ z#Q;%z3O4bJy4oe0t=L=k-}XZA%_4vC0uZ(F|AZ((K-v9c(f40!Z!#by3m{$N>8IOT zOHmX7)vS1~^G;$V<83+tk&(dt2&xN9*Z-R$lsR?qJXyGQ?r#x?{t#0RdGIvDw}7g9$_~xd zeE_Js)_+vpvEyX6K+pY0j(*WG$LF(~P`W4CiE5d6>#>V;*R^{Zhp&ONV! zCKa_tiBGY(xn9FWB2>w8AgTGa+Jr)@Shx~<&GwbYsE#$!t$fJJ4>9sMTzkGsSuma^ zFZ#1Voaxd&Ph`$B>q{k|i1|`n$16Mb5?@(myIh8KV|(fcNN!=W*fukdibG&w;jk82 zDvgAMpe;gX%P#{IO-nz9| zhkAVmuf!WXv(fZqKEG4Yt5~xGyn;$CO!-Vro{rQ>>Q-5k{RCd)M}$UsT`(8Q3Y>du zBo0B(C833LM$^LJ8 z1AtN5#NaQ^PsxfivVZJ+%x$<@bTrF@Sy2|rv)UlCG2TG!3Pp#6M$edMT(_>t9xt0L z(X3&8O7aT@gyV0EVO~j#QHWUXXj8xF>!J(ni8Anv`lSkNg}c z4h{((hJ^v4KZoGvH7#vZ@IHS2u_I6N75|RG;gMWK4Trn~He~7z_P`6#?pQkT>dII)CXWrSM zV7JSxGaDdBcLc8%9GQUK<6D7&3 z81M+12Zo7PP&vw#VV(1{b)rhfL1tniVOP&qMWwpUI-)}YyG&n&7`w0n`~~Q48~DTt zqof7WBSOVQ|Ke}kL9S%J7@q))NB{`yKbqVBbN=#YV@@fXheCrs#Q zH>yRb2!b^u^O~u2_Nap(AVCu>r3pxQCvC}{&s|e#l*IjduMoWn{=9*8E4Ip)6wouh zTz9%!ce>1exw$)Y`(k&!E($KiA-yeuHpVuqKDujxHibd9#%&Eo#A{H>^5c2r!81EX zx%wMwzM~t2zEVypYsh#zY|*OzvobamT(YvylTYs(k#0wfyTHENx=dHh-Icvw6hQQc zRJZ>#OerKo7UgM!hqV1IVlMbW2;7R=5-Oyu72#>r%KKPOMJ0)#4LxEN&OMb?R}j1VG$i@z9ckSAeQgh7z4 z{)9C>IkK?&3SXAfe5gP~mN96k*e1|1*+>`n%3Ybp*v+9dfw?Wwg!8L^y#qkGfvD+3zoJXYAiixW@|MP5GGIdk+aSP1s_W zD~)S2e(u5MK;C!cJ2hf!y2|LAa+TtzEr?bfh7_OWe)Gkc&pceDG>qQ0_@G&5YsCUbCHvK@;xyjOo~xF& z#!!KTb6A#?+c_3Y5_gxQ_C>)mR%$uU#(flB+4*(OfFSNlr47HoJ{;ScETF44HWY8GCB{yO%aE z{)BUWEBcAG6ICz|T7d|$^u{V2mdo0T^NWNiU8DC&po`%NMxPQcXZ1;IOjZnbYZ-AQ z5N=>AseI=xjAAa`@KEU}OlfP7xpOgH`m>=(deKw|{Qa|hykYh|mw27GCPW)>no#Oiift1w8jYdV#V(;7&hLu82=wdk~Nrqt`T(fXq1$veeSJBCd zW`cA_AR)@{3Ode@^U0F;^O4-uSz*hzb8@%0O8?x%6lOF<+ z0^NU}jB995+GNDeWMpW*KF=7kn?KFILda{`(nWtVM#4jta86nfgl&A!Fkw>E@83Kd)d6FZd0s_lV;NnP(%~ zNg*U_>y!7(pyXhgbar6&34dVN!7a$cg?Ers}wD!@sZlDlr54}_yswl zbQ-e!H`w(MNA}$WPLE=O;frD^{Cnts9hr=_-K9+dz_bDA-dO+7ms5c9!q&{hSk2DS z`d>$R$%=ozPJqCS4MWpbEh( zdt9=i;4|F9o7hJ2UU??tY@lL$Ftgpm(G%&T{`zT``PW z^$W3Z^X*68SZwfl?KM9{^wi{XoxZ`6AhZPx6bV#UWvj5=Oy>JhB?i?PCRS6|ewCHY z`E)4r3A$)ps;)(9;*dqOe|&=&3bV7P7(hvQ@)}90{&CpjK9#$9|*BE`B$!qR@4CqBvE)kV5rB?s0x}OBMQK$Tf=Lx^unUy3oVR< zW{1JZzqRX(bEZAlSlSr<8DH*c=K5Y(OY0y+NV&v+zbPIW7;NEi3)(y4be2_rsMMJ z$?VF(Muq6Z$f1qg|JU?li@Wn#6yn%kb#|lbR&jf*qt!qF|(Z3Neb+Obv+7rrT8O z__Hqg5jy0Xctmi(9Z1}!3?!oXTS}Lx0Zq41qLihzmw`hG7Bd?C@^Yr4S$Gd0cpC1r z$fh|Bu$5*2v$#oP-Gw7=_9b}HeEUpaWLkwa!EZE)=C)X2wh3la?8`D(EUm`d2VY#G zE~Ja^bSE8Aq_F}?-uf$lxLdmxx&X$lm9YPlcJ|Mk)jvD?zbUt>{;AvwA%P_kYC|#i zPbr>VjgvRjqE|tvY7|e-gcHo)3>hWFOq1Rn2VFhT{0#qu)bp;Tnq4jGe*2+)>0>&= zQ)=}R2bgUEbX!}SZ(L@#M|wSpVJOVhf&ObMMB`sk)mV)iHd&*K^sISh!-!~SmwK)$tNplT% zcZihac|jM%FpMWin4=UdxzTzRCr?5SolmB5Xg&S<3RHBeW_I?xoO8k>QKRvSyfZ%T z5Tr53*2MvKBJ4G6YMF=)-FG)wsn1qStNJS#cc=1Tpz@{ja>Iz(=}rwLs=1_C|AG(E&a4b2kr}&MZd>An1nSH$+Qrf;O>Erxs7ReA zUIjr?I>C@d&7F0~-Y}Er2geR=uDAsQ}41BeCTwiV4HOokC)$Y2a>1)AohW4tdTkh0Y` z_Ryk1PwdjFCE7OYE(%JVFtt@RnY}tdA~FEeZZQ|cP_J}TNpRY!*AD&^$5mwj+`<}VDBTaHU5GTP z+vPBr9jVvlF}T1mS^Q}UgXY36XCq%%Vt}6#5de-YB1&n|8uU$KqDCR>lIIt9H}S6P z3ei*z>o7Oi#G z*o+%ZT}_{kVv~)Q1Dm?bWAHjoHMg#+qwHP6R4?$p#~#TvTSQR^(MqH9j7i4Fkhr5|#6bxlJH)~X^fPVAoPOir<l)_|!-OXV>@OJfo2=Nt4_QfyAe$2ygag$_Ohe?~4+-Sxj}Y3Ag&< zJkzd!twjT&p=Cwz`WlVsRUT$$9Ia-4L}jR6A+SJIsyU6%DNH*T$x{4OYvOsOJnJQ? z`ZZHr#J4}a3c=vsxVcZeY~1PI);DzdcAoxtE9*7zL=@lv;-q}g&2P9Te_|0wE4E0Z zq8BIbDuG5exLHBr9rbR?K#eS^j3g=UK3rB`Bb;a^osqs;E^6Q2bqbT;1S8JC5G`C z89ay88Y5rOn*xevx7+zM%(v_QlQCLqzv0~Q!0xa7Jv{l~90928HvnP$xBr*^&so{P zP{_{4-rB_ZU+vqAl>d~r(XG^aXy{^z3lt(0H50;B5;ap%swz<}e`#_~J89VrVqK{} zH%*X9{=MtgquEsTgZcA|UkIPD&*deNg|0mgd7{@;j#rLT&Yk1cmEY$r_IFlpX#<=V zq-TcU*lP!1Y>BA+q&^#KsuN_=4Taef%NJ=ej$oF{Q-I;89KlT7WxP?-DliOcjS723 z_MXuidzD$rS?1b~!JzFMHt=isg6&v4XJo8c#AFGGwoW{-M5pG=HDY+&D#FX z6I>RYDRy3TJbGUzxVkUWOr{(vGdShrKsqiZd*%wJ`uKk+`W4Cmi%B(Gy=4Mxy)3DB zbYJ9Vz~gvWHnF|t2YS%pLz|mig^`d^HCtV{$d;>~#aD6)lK1zjv3l!-1^}?;ad*ngdSC+;j^f)ErFftQo zAwKu^$mf(r{H#aj@s5+n(g|Lafh?m;Q*$eg>z=JT(QZ~@NdMLDsGP`HA5E`TLqWlj z^`t!~w?dPnW$zp3C3dNPD(%&;p5c*RQsZTQ5U*u+hTtfFi09c}mU?h921*7$1;vQI z_TE)Ld~yGxNP+l;^V)QzwDSw-VMF;h&}waljPi317plzq#ad}zLUJ1A<0pB}$N2jd z*ld+Gqe0N>qmChip4TJ+@bMPMOjWtL7%yX=hTo`mcD`omOC&3o%4>)lG%6qRorB~~ zSyPoE919?lmz`QQwnzw@eY?QFzmVlD9prs#LWpat!NSS z2=uatx`y|~DGS{qnilt033&t$EcQh2+#=xM`RAx94fT_&0{(Kv78)F(Qdm`D4(crC+W^H40ZDYRJra!KzVC z>F?8nhn=~L4YT4dx$Ijc#xUuT<@Gut?%O!3eccVtMflCjApb4~a?tc$3xg2PVJ{gU za?$Ij706F&^=PV1IN8SlcJS{)uh5Tln~@lmqOy(naiA)V$p!`H$Z>TZ&h#op27=|7KzxPh`{B2>JO5s;vHlRNvf%~79s{hiT z+1c0_*c$&~df;ehWa8xXFEayx%>EyCGsWqyv!h>Z^3W;tTT3Je6%l_f^4mm;XlZ6@ zTHmmxfwA*HD>A7-`njpW;m*~LY@+U=rn_C5T; z(CQ-sq~w4L23A4k+P^=94ZWy*-=`?AtWRxEBCO`(HE3w7(f8A0nAZ3KqHL+Wxb;YJpwBq@#4t0)&iDQ(J>*07nl^1I2_t^(Mv41pfHpYiEK7nn-8aW2@jWYDqgo*2` zb?K|y1)v`58U|U>77f(NhB<98o|{NT-$HC@Ppe0Ne~qedu|#@mn7B<6P9RunRia7I zcA}$hixJqBcEp#RcT23bv&uoL|6Lvdj_aY&^{~z^nfadj8{)Q^XIsO_)I(c3cu|vCw{8U=LSJvg`3p5A%N`VHOL=WSdE4R-6Hr5ixf}!a9c&53{ zc}ma+;nbH}$&`1ueeMnQ%o(WyvBpAUBEh?Sos-QZibh&;Y#X_icnkws6?ATa899xc z?4~ca`GCNb+5ny(hqr8pSrJyXQe^m5LTk~Vl#|N+4#uoFy#j{Jp6B;7j%*Ir&*mEa zge0XSnygBm9?4XS*WKXg^YU^+U}ren#UcIQ3U)B@X0eT>rfr0)B=$A>s@0uKHfC%6 z*N|Q_aMkPfZOos);LobRWMTKQW(`n6=`>YO9NIAi9(xazZRTHWwC7`8?i#^?EXzf2 z$r|X6R|YZvJ|K&?H-4+_tw`sujr_E+Z&e*KS)B^7jcyB;jDIgb5I^3sEPwABWpvB# zd76h$vMZ)MwPi}EM`5>`qhZ7kKdkGq%^1clFamw6V_$iN$?XLdTas$8`^EH5l{ayJ zrZG?J6pWTo4S9NwdRiWYydyPWcY^ktQkc>-VM;zD6q5x8 za{lG~mBoPrQx+GhXfi}mj~|{c!AH7K_C2e<3g6c7TnexYl_(G=ShT2z z+iT-5hs|Cu;dy{r^)0oWCX7NRDubWJBPlW&z7w!d>Gb#&Gyf%7MM)lYkusu<2Eo&( zhU(($j7rWkjjp+X@JF5hh@ceFQ7L2h$Q@9;J13qOC@t>R4J4P+Nqh59uq!9wA=D^8 zyQ<*+u8O0BrAxrH*s)HrQ_^P_iKI+K!Mk*l5xU7PN4q75>;K2tH-=}rWocJzqhcEs z+qUhbV%xUuRBYR}ZQH3h6({w*r@LpS&zbqI)Bm3T&)RFReXko4a}`#!l z6+48iOb^tL+PJTYsYE+pSG}3-Is)UlA%nAX5-wrtw+jqjqYhs(MbD+yTWZR&8Tfrr z(ol!UDu&1aDKV|W*U;-JXr1|uh1?sk*v(ScIeX>HC=Fj7Xq$MZ97x?aK9?mVYgoM%cQU_rSel zDi`NyzP5|?cRsB>d9`Vsx#>^yce_|i0>DaJu&jJ~+JZ zQABu>3A>F?Bb^m4m^$a3`h4C&Obm?!Y_iBXu%dD4?-4u9^2myV@{RV}(tJ-Hy&De; zYwp6(EN~%k=<$9?p5OU)BA$Zkg*pXZKobC@crmY4(6g^{$1i=H1=-{PYdl%FQoK|0 zf)S8x{hbDR1o}$Rh`N6dPZj9J8K3k!nw}tozz#xbr1(g_&SAna8%2)TAtk1EVvvV2 zA_`-Ks)-*;PI2!KroM~Su)a6tEX1W_taR+R@o}?c`i%qwmU65Yi7|JmJ()W!dzJ&y zMLPKs84MKfQU<9In?t&0A|^wcAHA%n%XkWO3dSlfz=r_zXb-%sM!u%_i=c@X>&^3D z7Qgz|!A#YFDy)V6PsjlxM&?d}wzii4HgzPcSgT=+p!$SZ)e~xL2Z-bX&Ck!rVJKc` zC8stMh+E~FQ8cMn{g}c+XYFY1$jj#&iuJjX;tLz6Tyg{~EU)Z6d_bH1E}$Q22!@0K2z404$T@t_h8zJnyfOQ{cUfTu!3Y&zZoQ!_ zyk5vdB@}j+I>Q5y9(9BV@li8I+$NB=WvXL~xTyxrwp>S6b?ps?ZW`WlEuB9dteI?E zx0!{ms|&6%U6!(1F0;_KlrXDVMljG3>a#wqf>|3zbWthWiZ2;zafBAPMm1t$y#?k;D_dg6N$n^l=UPw!h4%3qNR{FHg;X~xJm8=co7+6Ok)59U0 zlwOr;M0-Oux{PM{k+lp9oASu+^=JN}HKuao;282*e^r$gr%%M;&VbZT>DAQs%t(tGMDKq{BC&AU%)TkE z3!1+2t^T>H_}U}Hx{Wa#l3$TY(9hYusIavDCmx;f+4GUd6RECDfzEGdHsEJyLX4|` z)2~W&3=~e93zlx8OdoheteJ*=)tnjKMs_dY8>383Raa%u!#7|9>~zxkiq2ia3UU~# z{R&m}*{$hqGISXl&e1#x$5LQ&w`lJ86A2W^>H#Yy=$30l+vOR>z-S`v#>#t4oknKR zk_10%(30wkcAa6VS|>vZVX4Cmh5IN(ONmi2Mk!i@fI^-%nhrR&48(uOsupEV-&VV4 zaj&H2x=4Y`T{wnRoV1{G*h|!tE%E*!)|e=FpP^KvKGe2l4~b{uMbdr--BEE>v6h;# za48a$(G1*_mnkUp7-TYPy^u|g@;@}`wm0c>EL8yulP0Q4;NMqe=Eg&9ai02NgTJsM zY^f{VL^kd2VJxxa*8c#-bNR{YF7qalc_bupx}&U;cs2jga7By2aXp~^wAaF3n%-P= z0R18G+INE`h;b|<##fASEz6)}JHOe7tunb-{2dRiLD1e%eAX>^`%~19-fv0y6-@md z!fD8JfKM>RCjd3f8HX?~TtW;IUZM_BMl6m=XkID^#4TwYC!dLh1eYiw0-q?O9hEyM z0U9U&!VeLoRq_BepBbJ=JToM04x=uefUG5~&vQ^erSq5}##nm*x;hbTatUK@+?ih; zrB%SIZOHKg5q*Z0fF`?ygeKb@QKCL{_LeT0g2Yf!G-6DAK?u?HY$t>*?smZ!Tl$Nb zVo%;ZX*;G5deQ!((D#$#+``39FUhERi%>-KNcs(QLa9-fpvqW8lAzQ3lwEBlyIQ<= zvZWd!P`*5@8;`+-k=Md>Iyuc+LTC8%GzNtdV1t?h1cWjNY+&Eq5QQ2y?Zu=$+IrFq z_XPXSg^=2L$!Bw|{_BL*rd^J^@4HX8{;@1a zDDgf5a+XU~WOxa&^WkS6R@y(AziTK}3LQvqICW?)Y+3%evU>aD>m%lSHy;3Th_^{Y zyn0qY=!XdV^xqz#n|-48fY(fWnsrmdak&1=qL#mvd(aoq{Lo-ula zuS!+t55duv5E&FEnQ*QDojJvNh@Y_K2UQqYh9t|7CL-9y2;wk3GMPrA1U233ZXn$! zu&)q)Wkl;w&DX0~hqmjiGZI)3nw2~MHrFejlb--@Px67C-|x5NeihGxLim!D+<{vA zw=r&&VI$UX*ZVxt9rdeQbF~pqiLD#a2+U@!MOI62#KrW`@~>d9U)yxOj*SN zw+>rn=q*~Fo+(<)_-V~r+JGQW)rBl2M5YQAu)vW?s}%=?h$0JT*?KRDezg0rtAk?%uTioP(_EB0XTuVG`$X#ZBD2SG;C78L^ka1s!tLWY%bFqb?Jv zqTYDfZrQ53WkL!*u7`;b^?j7*mlF=cs){+^=y<41NN*0~mAmNJ0`;=d1lJ2K2=TC;$f?CEOf?ln)EbLzgNO z)#&wnCF@Hjle3G6HAF>4`X;MYwN32?1MWu0Z(@WeOSC8T-`nW2UVWx(9pBH=5fO7P zPDdJ`MQ6sfFzQ1VejBK--8)wDRMatrC@DL>TW!gk+jP-FK8lg7y4xLaLuK&+6_|qM zhEyJBP&AYGSalmFtZ0X7nh>S!j^xMg{9wnP3UFMZ%b01BdeE!>*{w|pR^25Z1p16~ zvVp)YXNOBGjW0ksiIZPJ?-Hg?Sb--<3p<2>94b_tSCuJ(cOB+gc+xA^??JLqbWLUe>st!U{>mCoY@jRz$uwBofb zL&f|04U)*Jn4gLQE|lX}(19X#p18KpKd(^4pWzsN&czCI_&0uDa|C><8LWp!O0?=y zMp#cP2Fr8d#svZ$=4O(B*-FwC#co_wevEOJ?xAzVJEx6kDbT78h&+ez?qtt@C;Sf7 z>DTh1-oT6W%d~Ld-?~_Iyp+@cKWgyI;hY%qn_|UsBLz_* z5^Sr=W|$6I8HJ8h>hkRHvhaN4yl+u1s`elLIQv;7s3Nq;X_=lUlWe9Y+kCn^UvTn@ z`G-Z(ky+c;B?}UUS%uDhjAk21#9!P=bcIN;CM4?I@{CEt?!S;~uFP zh5(Y2*GwW9Y8rQWJ9)uS3oq1s9aMD~)UKfCB6>8Q1IkmfcV`q#$A!PWuB0Ud-X4NF zudRal_!*y`_dbv;9VY6e15TRaa;9SBL0bL-UMM_|X=JWkYQdk2AV0~G=6(ab7fuC4 z70q!6j8&yg=o^D7AG5VM1{6Pzk{myt8%Iw!HlS8s%p3Yl4TzwWG}4XC<*M@rQu!*M zoJp#wF-YZZ*eT-6Oa5a95%24+^5Ph{x1j?rqQBR~ zh`8DPljHGk|1Vk5T5dregU9t!bA5@hl!9L0Fu!){xCcw5U;P z1?gGN2T@P(pDTQ?t4n7PwAakwiDjV*c`nc5I5+ZkZ=_k@Qm;7X5XhmVw_Q8 zrCVW@APnm9@2y5_H)R`qW^r-xMBRI1-4h@>L>h46?%}|rb6_!6@dE2GNfo+9aGsDU z#|qw=-7rH-xHnesIbmO2+Gj9}Hx&ByqGH;)JyBc?%O{%`bTM4}X^`8f&R+zCWi@>{ zF~wy_yBrx;$#%TEi9HS{Db`_Oem4*3$Nx4JJEIt*yt;pPt!%^F8pD#MYNwvU&Ksu= z+QvmFzw%&7`2MNy~tdETx2 zh93b4I%VqWSdNzUOndb(+BwA?QE0(dlH|-0wzE6g1@BPnYiI#7mO5Bw?|-SJecFQD zKMubl08ajU-kGSmquD=-h(yWBz{&WZ#LHymfAY@$u=ihsMg`Tp1rae9Q0Kp?K-=Jl zk+C4OAvE_Q*l14){v(GX>b4I;&+92xTw>6SnfncpkrFcOhinM2_2QL_a-VbYH95vdCA_#iFNkegpFn0|6)LNk*cEAHRfOAb9=HQh}FnpUAMG}}f zaZ&NI4;`rY1Uq9Se;;GmF4a6|mIeo2CGTpfS=82H>7LPM%bEQ+&#L>Qy7?P{DNA#M zm%H?!()d-;jS**%w~(#Fgp>X7>4Ku7SI6`25`7Mnx;8b2tptTSa}jj&61=N?7Q;{%U!tG9jRC^n4c7Jq4h{e3A?tPDom#L6CgfsejLB3Xzzl)e&{yZ<2U3N!Vjh!?%fJRYSxvhLinUm*;C`dbW?wqeG#;t+ zAn|dK?UpfCuOqz{_8$8|l93lqR(Zz5Q2xPjIa+eB*3E>Jj?ugHUbYj#7BM z{4QF*o6wGJS&b`m^3!OXlb+VOwKP=bum}TKJKX~vXI#wZUyi`s8y9U1U|Wg=Ff01M zo#Os|oATdB;9vFu$~ul4!l*ph6AnL1K?R{?GLxDm%BsA=Qtr~38=Y~!)BER0NrJ0*6 zB2!$y(e}+V8^yt+4Lj&<`RZo3H=6b&{$OO;q<+=8z)ghTbUZo-QkpMNS)!sUK=_wc z&xsrGcd^_>y13>-z5^X zR~6v$Bzha`urzeAD-&P7Q5QDBIf|HVPrb$_$uD0FQdV zEMIp|-4Had095a2QrfRIgoA(T*gosWSb7qk0u!Zb{|2;uAYWD(cmb-lLsC8;l9oy3 z510`Q1}QO$^hmMU$s*#UDauR8*YId_8z3wS!_1Uw`^?)#PGs*N$#^ePXNitM%W ziiXrhX{^Ooo9~28h76KkYwx)0bm_I#32ez>@m~~?{6%Qc;wIehMuHEGMaC1Q_)bPG zgAZL#DF|zjXc0<&IHS}1+CGh$m*JA3D610au!Ny@2fM;VDc^}ULq~58dy0rsxf638 zdOZOXUpEL90rDkld&9EnOlxLG#b_J_b!EraYcQr9-%46F$E&`R9!!@eqg1mG{dxvh zwI>&uE;IaM=$rp~$zaiA@L(Qe=O4#nyo=IVPSs~iu=DeItL(2N$1>O(r#}>R?|>=k z|BMCv6UkA`z}i^G*2wsOk4pd2)%`()mDI8*0~VpF`i82Zg}?C-TZ!uCxroE8fex*2+EiP^xtXjI#S;w=da zVE}qQ+trMVA-gXwy02rq+x$W;g`u2g&VO0pZeyW7=mW9iCj=}J^3DwxP~TVk zu@l3TbnFPcxOL^f^qE{U<*sr>hPTiW>%aZ2e>B4W^cpgJ%}g#*z+8>8CyZ2c!O27F zh5mAEe3?bP$Rl{Rh=g__BcY7+HGE##3iIhq`C(6806b2w!i|4uFx3n(|2lMWlg<_( ztBW5;2)FTf{Du$*^$l`57k4v_dCu@7fP=jino^WaW-SxhMfC`nYnxb^oX`QK5l0B`lb$fkB|=jBm9Z76#> z{7XxF5sfX*5Hoq7YmMoQOvnalEW{71lCWD9BPoqd02L{#lVY}yzl(3o-D3R(lQ=$9 z=-RdCI`cYn;q&wU;HzKBstlpOn8aY-gnVLOm?3#E#koCqOaYQuA|V5FR`=8vlu#Rw z3&hm66Em`IVvgO2B_3F+HN)*A1}lx0I`KB26Zc*gBkCv8vp!QRvBNwgZsZ2*HB;?3 zAuB!helC5t>Y6y*jblpJr)pXC3;NP3`y3{t_5Qt@VtkKHZ_7t3L5Isa<8|Bxv^$)D zayHb(rG^O|?}x}>7ClZpSD6Wza~w(FwpcH$7&SHwPGj*%3Cr#8!Ziws>p`9{x#g}! z*Xr~DRD5^ak^#e`NilrzKw+$?2G=k zTq#%(J)sa%k-Qhbl}LRw(aR4lsTVVUW)VIiUi~SWp<2KczQ=e~O^^IiZ&cVmFCKi1 z6^5Os{sHZ*Q9)<6B>!XZBfa@>XR^skK&zxmr4E;|!UvoGl|29Y8{!-IFDnUx3GN#> z?)Se~fvAdH)<*(r6CL2G^!K{Y|E|yfQDG$m%#pE;F??7{tP|h}Mh+wcd7+ep+pl_tSs z;VW&B(S(y7{hO#Jx)@ART7WRx-b+X|kv(n2Iz$1sZ6yU&1qB1jRo0rXC(xp8`TDla z%H8RiRmb z`a7bNYl4)ia>a!pIxH{Q-_qJT8A|j^xO!c1ky5e^UO1~yV8J@HTEmsvo7Jd8Kqy;O zXc88U3lwSTO=*>Au#TJrYLufQ$VV6q5Y|3}B9UYZQz@YZ!kpG=GL|vHb_TJ(N2Zw5 zlG33)kQQ(^iX3Z&uS$kaA>+4>6BS80qL%VlqDMzAZ8V6wYv$0}l`v_Ip9NQVtf5{{ zoAhR|QTEM68+|oGmt{=PH%`(}DuV&L-ASjTJhjZ?7MX5)P(yUqy}TPTia~h|C?wpt zjfr?tp(%Uj9}2D4-TM)e?C^TZ@1;K>8$MB6p$t3Ggc-Jjh!yPM zAmuOkHF?Fz$nc3xcYkYLp7h!g{S_`-k(K4$W!z~8XOzhVDS7$hoXYm2NpG&nc9V|Zw zeBdBvYxWFrmJz=mqZnL4JIbd?XwTnZeT!78E*_)`G(gL-c!qsiEyUs-;egZAR~Mpt zedbuF!R^~?59s^N@Esc7=IYYTx^uSL!nKT7(n{KV{hI$ZphCa>EKv9 ztm;TvvAL5$3sw^w8CFuOU&uV3tBYiU4k)v7xyuOn7As)XQplLPHcMNq4Ey_G9=Jwj zs>%NHHYG}DVIap;5**Dt|LT1TKCC)Ht~t%CzV9%RXShVJG0AKAs3GwdM0^(h?h^kh z^qD&u!wZzuz7Sk*-wf_k*fuwWKc7uqh`ugB9*(NzQ_u};M zg#`Wv+Di@+QPEy<=$=Yf{x&}%Rk;&3*i%ke6wj2mjcss37NvihcdVq9JM9^*+n6$8 zl#GN8g2Zsj#SVjdQhyZ+ub_qfLcEelQo|ClI1 zyaNF~le{>6%IdEy;$JbGoI65K8sObEf|d_qEbfD zfKAclXxWaOf&=Z)6ee2Xh5T`ETVB8${!hrTvq9Q_S@IzDAImD<>B*X%9baI#08Mn(am>QHve<}d2n}^N zGsB5t;*d5FJST6YUzn_&^yh7teRJ`DXtn(vT*V~h9#s+vi9vAT3J8VFvAAP8Jip@g zEpRc$onsCxoEMGzCs>?z|9X)Zp87Gqs0q6qSxb#^%!3)m7I@Gc#(UE&7cWBh)2?TT zxa^wDtPDhAgZXp&n8e1MGghl}UNx3Wk_q*bhc<8l#ln_oz@*8g0g+?>XN>VTonmcr zCm+FCB#)x37~4T<)h3d)r#*u6uoXqyPLD0oXd$0*sAt7Y;rxN*Q)D||{tKMQl%G=b z=kAC>5!9IA%**v9P}MVm*<5?fxa_5zqeLhA@R%X{m1`^>(FSk6g{GyGA=rzrQF_Xj zdD1-_#dJCR0tk}XMI~fEfO)WO=F&?xxCBYYj?ZIf`p!3Y;@Bh2@12eh7J2@Vj-j=j zsbclj`H2ubrr3o>n9H$=$N7GpDDIR}JyHBsBkqOuRd%G$L3SDkrCMr0desS>l+@^B<}q)J@OglfF_$nY``ZyY!UQedYDQro2<)G*}BQit2uJS za}zQ-Y?FCo6brY6n7`~5H7_Jo&Q5%t@(gA+OHEQtvU0($^`IEhR(F+j#mH`_I6T;Z zpxW^M)J-AX{8J~sLgA(iIQRLj@_7dw=ehbkXI9V3i<##7bo-DEmD{u8$wTV_v(VAb z0^{T#D*mDYj|S%sWD%lEnV@Q&qD>O#vxHpY2U)Jb(eiX_3z^Ojqcr$I>M}LmZu6pP z2%ll^=hd6Nyi-GXu#of0X{@gP+FyL*49q42v=+|8SwCAxLW~ONyBw zL=C4BY3D9+3G1EEH{`zcu50bYaj-Rl)srStp%{mcy4r`@G%?^rqK4k4Pz*$sU>lA0 zguXR<@s~^=t?R|VFjHo-^_5ee#sW1H41jPq9>$Pz<-~VQSIODqPSEPR_g7_1lBUYo zvx&z;tJ2g9I8PDr?c!(?Jb|si)lXi})kzSjg7K z(b@Xn^$7okGy_aUHtK-|BgKKJpXY4qMEHd#Oyxl&7(`*AI%$o8sV7nzwUB+{>3AU{ zND`hc_5lU62Dl5FPA4XRb^!#=$D8K9pRbR&y%^~Gv$qr>tcOF2VZ>1iaIuC-*kAEc zh~9+fM`$>D9}XTVQ_t+R~Yzy#cvu4JPH&sJF0*&zmZz z&5%vsVBPtyj}2RXbjK6oglNtItXYPKoTCvD#-O^+Ud55vIoeN#Z`r&-(u`8v% z!K_Z*-r^U}r=n4?evek zSsH(V(sVclY)Vf;EEIE13uzW_1+|8@<{S{=AiN=`wUmSWm_b~KT9&v9fT#VMYN z9ySDNTqsm$r~TrXZ%!9!!vtNG%W6yX1%~L3z}z(jxVW$%Rm_osfrP((g-92)K#Z1_ zmglW}!9i&8YHz5to2lWKoFU3prBfF=3il{rCTuYiipV4~gl&t>i8?|$9^RG&=zyVL zgG3%W5TJ6pvMP&tBws)i8Xsp@z=zP*xuQ2I)ABM2jG_R!u6KwnW|x4p`!63nBuFE; z`_cueMCSOR8;elel)*mV(a7g0g-?KB$9WAKBefTwfsd#c<={TUzOr%4Zq>wRMzt4_ zW+z4nDTKUQXcRtx zaHD9uQw;NnIyK(W1$8P-APtcQxsW@=nE+lTb>NhmeoG$6M$Wy2t^1`k$Vcqq1QnOd zasq|%0{7?J8nLMCQ4erhhyic0|KJ@4I4$DF|6ld?I`l_v^MgIx8_~|*^_3fULTNIUrY60*EJItP+=ILw@zkx0t|R2-`{^-Lij=Jk|K)n#$ZSz zK@)MK82VKEZg>$wrrk=^|%ColC266N_VPSXv}OsTHCKo$nZ5#YT4IGS4&W~SM%QHJ(RtOZbdE+ z)CyVZnIMEa+2m72$zsRNAkLgv(1sevzeNzBGIvEN1cSF71HS7!b?~JrJDMIek_f02;HV{^5zR66BGZcHa>qxJhK#PDpForzL`9VKpX#!$T)}z zzaNA;(BTzfxV{6qX6T_TGlG%}9OhEHbVX@InjX?8yA@jUSX3b^AP+%?RT|7Pard%p z7tTr+D3q-4rEHh>j{VEEQWFNHMRmLeaU?RM7KyY3BMpR#kXHU3kMP0BC{=X=a=y3d z;X+W%cpAJ+-QcZJ*wpBcf8>NOP}>@cshAWY6TINgxwg#q5I8Uai7R?hfgSq%Ww!K6 z49*7zRI4mt5cvBIilptoY}Ehd+oHH(1F#I``N8gTfbmsQGna(aJl9!US*o-790piL zg+Di6oSSouYHN8l`BM2@PvKiRC^CMp7@^6EYDOWUV2X*U>2xLs)Ao+9&pYr9a10bk zG@}!9(HiqCW8PkwzbSY#MvCma9pVkU!Ro2-?d(PL^tAB#Eeu}qwn56zFp@39(o9hz zuYtrte20+a=`!CvPk(&)t^;QDy*Pr`Zb%W2-dzqQD+8)|scW5Gy*syS7lV$8+^#5a z;f_rtLSL@e#e-Xjp0A~%3OfkxJ~W3s2o`7I1XGtA88a%0ohwL`KBNPMQ=Isr&wd6U zJHVJf3FTtRN~$<7-S5}OU~QJt`E-II5k@L(*d2r9=r+13C9k4s+zQfII7C2Hn#OEi1i z7fZR3rAy#nO)|8I4Tu#(uJ_A!uu)~Z~gxoLLyb<;iy+7yGrhdv|32Gd1k$Kj$_ zCl9O0BBjE%b#KusM18GxV)HwO6}7iw1yZa`Qytm@>y}E0;A2$dWyY2N=Q<<2n|GU1 zAyeXpN!+q!$D(q*+4{TjfnoT{4i@QzWrHefrFDT##5DnBn&tt}P`$;P4Gx6Fcd^qQ(wUp!Z9-VRisjHN9v$+BFa=jkIKNJbj!95{oU-WV<7*qtY;joL`Alw7a@Fa%mtkM$+ zKx#bi*h*z`Y*=z5%^RFR45~%249cRZm-i#wAEB$$ue9UoSFr5SruQVlwKWcbtG)CS zAHW<|_oG=O3;jq1hO_iPAnYQHtyfJCr)iD@#?5O`a-Y8LU&q8hL%-02BG!0rTN3>K z3myMR3K#YY@C>5{bl<<9tfh@zjII9nj!V(n5@4PM2(joc+FDalq? zrl1a@qyXb9zATE23^zJ6`aOmqiwgqg>&GX_{dAl#rAdv&v`yU-R4Q8%9_ z*Zvr_FREhU*^nV0&Z`807aH??pkFD^YvMZBn)0s{W*75hN?)pa;pQ|n`o_=cusqJA zvwJV zJzA;<>joT;FI~lQ(LNyTWho32ISl1E)u$J3{G+M3l6~I z#tk7916IV6rtQ&#J9~OJk@(U^B>MDNyZ{Q&H3toN5=NfXcF7FK^^yBdb^|^iLN`d7 z04FF^djyyGC`O{ang~Y2<|HMCyt!kH=cW>U|7~}GLJR_`Fgvd@;?c9XXoA2rhNuD0 zQxswA_mv+ufdUhr*_Wm|6}l}KuuuiZYQG#D9T&_`ADb^(9$Kn@O+WrR0glpKx^?jK z-lqUDhNC@dkfQsl3Ky6s)yX$SLw8Tb6HrBW9LYg!i;k&WCr|P1SXF##P;*#)Djk-I zZd!r0)w)fl+MN}hPp&hms;eH;18$@t^@o=62A!sHs;W_Z>rDpXS0+GbmU5-7DgObt zb6Y<4%pn;ZtvTedLbJ1n2C&AOS+9TD)*~%#Njl(&b`RN8LOndNMBQ>bkiRBeDDzM) zI8!R-kFupGi`aml#*3VCpQ>5}*rg?+FIBR9M0D-i%?bH>$lfDkeYSA>2N zH>aT$Zft?~Ljq{bDWF<4?aG`Ucds6(Kb|$FnPGmIVx*e_A5BCYa*ybn{~lvqMbNu~ zmcHjHyYMa(LkKl@%jz5d=Rtq$+f2StWx0X*9SkP|q5ba|l+Tq>3o+faUgtWwd(sIe z62x450y){}OXAl1SUXIHZ@Bh*Oi*A-MzKMiC8EztAJAo}DIjn1E=b72$)IP*!WXE8 zT5;LA1YH3SV*wA;J7Hj&PWe)bFghk>4Z$`Is8)F^G-I?6KRWcedP^U0QAmc0Hgog-*RC8r~dyr zz5?j{fcPH_A6Z`39PlWAbP`(0rCO-UrYcnd5<$fE#-Zgrr5f#oEGOfJv!CDCC!g)L zx}Jt%d;_Z(Cr_jJdhw5*yG>JNAYqg;bq~FMy6>DE@R-Uy=J@`8$L{r9l{VyvRFj{{ z_mgA7=#va7uGnO5)i^k2g4Z~i6NPT6AKi0-o&gs)d!&)8v6|gKs)BqhTm7|r&+JFNUh5SkL?8hHV4>|M`>F=e)Y61Wbw*}byU82X6u718`llH?%5XFvg(!jD%vdu zcRX%sw^$j6lI~homqR)z>FjD@f({FA`>2#FOl$w}w~oe5mS*V{lI?cuC+;mKPnVwh zdW#Pn!P#j$kNWwaUG~*cr?|$MHPihZ*WW~?ykC(EyGbb1WA<>ns8^^OejlWnZ1VR1 z8gBzq7xow4WYywwje++HPZI8w1#_jasYJe{67##*t4Lp@t$2#&@9eicYd!-Tace!!3o# zk5^OBKc$TKL?1sQVnb$67;A4MiE*I95=*3ulEx{82(gV=+G#ciYBCKEm*41k1-upg z%jAB0V3=w;;4q&_FWG6uBj3ucoh>ONwf zDdPijlSZ2zkU4Oxbb&n|;({zueIAy5AxIYe_ebs^Du$BHZ;huwutZE~xYuIG%2|{TP z2Y&*Lgae_3tc{j*jN8F}Nvj&j(+)B+HkCqFI8(8#_#28u{mu!UWHX+z zu9S~WX#wgvMX-sKzXo1ia}Z8lGl__5SyDH0w8yk`xi7(smUz`@=#PYN*ASpi0aSeW zBy@bq$Yl%o1>Ox$JgD3_BHRA=V=bzMq5RKKtL^!sTg6u@n zo;3^O7Hi|W#0gjIiN$q`&2*`8xaPbCz}iT6=2Cp*v|b0kXc7v0=EP*iK5`fjeJqTr zH$j$`kQ|8Jy)5)d|^ivPj2JGT{m)JlL|PrIj=+o`CEPya`0 zJ5o<&TeMj^p`PnI=M%;%eBdJ?YzzifRlcUYD-qibB`XRTiMqWvo2Idwf$rF)n2nRB z_W?%KQ$J{L4GLg|%O!O6UgLDJbpx8XQfhy+zZN7g^p3 zLudmPyFq+kZRU*LLktRe7=^~HE5{7nykZG0HJOnL`U=oXOs*jHy>rAa9F&EMmrT?> z4)i8#*P8EfNY@MVj7B=0=Txx6c{oer1DwfKm$RqhBuToYjC`_}vB(QZ^k=b?zb4ArUvXg!s2e4Ad*-(H9-GI}n%5FG3jLhg&iM`ggKP)1zDp+)~>LQDyTgoFdB8 zpD~jsCS{#Y+wo=5?EFQ=4EoyPYLuEJ(;EdrUQn7z+hFrF$Y{_wNG1H{Omlg_yWaVKE7&(|kO6VM5FvZ4=tZ=u(3(Rq(psWgRS4Fv z^JbEQ(gh)d-Eek-Vj+2$A!Hxq_?40XDjvkM!m#&rl;0+@-gLURhUInFW2RnD&u`G$ zz%J1J)hOZ+T6?R=0vdSYh!Ut$H}oM{)D8u1)3B^`*@a`9*gc!3i{>bgo~>r?Ks~z= zrkD@?rE>t&F5>7Geqf!?9l*9r6%8gz%43x->9YoR8Ao(=A8EvyFpt;C+XcehCLGYU z2OkKx)^%|8#d9rEE&z{dmzj<$*M#?7xL#~~+pgR=lu+w{Tc}R2CjHr4=4Of>Z7dz@ z{LK=KRIXCA!}nW6C$a!TFuv*N^mQWP`o69RbOLS4u~fdo`bIqB-uLiAam_B`vZSdW z^I{I>JXg^i$@^s(91=GNdl9T;R8#8n^N@hT-U|%Dg_H{pW4x{2aK(OaA{8E=M$LPl z>!fF)IS39xwXtaRCxvT?TaF6?__!_x^`c<{;-g(c`uE=nEZZG&(|hjU1N17C2fRJN z?BhV?+E2nucC5SQ;kDAbU% z^Oyp|3d0bM19mBi)CmIsiwRBb zb;;!E&cfyQAis=k#;d6>)H!6mv8DlR;>G56X2_K@pnUvXZuL&_Z-yZ3p~A^{ zUjge*fQ>3nab^B9J-{^cieu+x+TmnmhHmFe)UGTBp*Bn&7_nE|bZmikJJR43J#Z`9 z;3dH@hURkeczJaOOUOOxfHrmIA{#4nMK0@Ngi2Z+os{NOhQ3+F%A$ypdFksGOS`fD z1T4}-#o6O`H>)u&`Z5(}%ZNSmVoLd;`O2#P&T6Z&jD1rHy7O25WFQL4cCw?2g1>t00p**bMI*KgjF`VftlnGWDy9m z{IGnM2-e2?10z%eVGNHLqF%UA%z9t$F6MJ`Gvt9)y_TfCzA{)^y1fb|{NE_C9IvMc zSo!#s_>|ii2_)NebxIRv2>uFO)3aCw3o!E&jjqRcfkIsR9A`{kZ6sBn){1Yl5|&X> ze&0aH7$VrSP@I58t<~m9z7S@KumL$zN`QI^N+uqDRYX9F6Mohuf0q)3oW(oYOT2?G zB!(mj_k=Kx&)+o{&>wekfg02Swom2XBt>+Ev@1jSO3D1uH+wCgPGo6=KUx&tXY;dm z_IQ+&?mL+kHJb_lVk%T65QL>_W|>i&+)bA#w)N*Vq@*q3%TD-}6SSNS(>M8o=B_}G za9+&rRp!vPC~A1CKL2EnZO_!aXr+hUQFwSE@HOw3qaPNQCu&4FZ9;bkjsqYkrNFGq zwL-$LU)ZfJ_4W+Um|)FaY6Y6x3>>wWy!z< zcB#IF8DUH-wB9d_{Y8`LeoklA2)HO*02jsIyVw0G(vd{b_~vy^xKn1(*TT`X6l zf`b_Rcm@&K;!h_CYY+dy4!|TJ0hk2D!W1V=5!06FzTR#m0vRAa`gdTIaFpmkgKyI9 z=EQdbWRzvHlMC0GwiBtx?V2nU8D#ALbuE6|gBZu{8sn~YHg4Nu1rnT*3xNxqRrY~6Ow5Z?Q z+-}B}uv~G#9#e~XS-(rD09NIZs!_3K8__Wolc2D-RFMtLUysu~z4H|82^y^n@9=pz_zW?;2zxF-Q9z`ySuwP z1b24{?(Xg$+}+&?!6A^h)7_`O?%Z?FxsM;aiXWRQ)*NfjHEj%kop}q#L#G?zP|CvK zHK$0z!u9H=xeZD!-B}v$Mxw}#V02h12cPi`*2I`o)kMI*yJ<-^tI<@eTah*ua=O|n z-jQ&S!HxF#rW7oj)~wUPIL+W35$0_e=*q6Uw&0&@pr+F>dqC4yK<)u($2~X3n2Yb{!6GsEJa}S>-iQylY|JoxCWIT< z5N-{3L>@qZTlwn5_(Ux`Noo^#Gg!xrKBlD_{OGp_%Vkaz`>4H1pTa=pw)By;+&pvzwRq(x(wwC^cE9e?fni%J4`PP;9 zq<}cGZ#F}!x>(Edj`}Vn&eMG^{6nRFO#x-tUgoK6$k-!<^63OHJQ5xc0{ZaYpd*?k zB_=o+CDaGHN=$ftO7Nr1H&hvVyc>k#6%smMGQb%o{~7EQv5=iWTs)3XBhL2_f>AHB zxPzo=#wO_p?HxwZCm6y4l9m~}i@?jbOUbApV7u8sx4Sq0sr&f$?@$^ES5{J8;ab4t z4zkYvwg_()5X`f`aShCLqg!GCDicWmC!&>q+=M@i6JJ#SAaLY^k=lZ@34)~E8&<{c zm!et94}e6X@=yA%c*0RIMe~)lt$uZAQ-<4R82(MHIm2Lh>es$*%yd_W_1xqcq~2AV z*EQ$#ZB}aLS3SRo;VHIku%<@bIt>@5&xKB&W1CD~W6~|1 zhdN8G`*a`!4~$oEp4pf$PNu1kg{uu3la`K7O4^$bX^8lC%p`JXXkv~a72yt`?xJUa=`DR-jp}PI$g5wSm5ofTm_j& zy>W0=F4!<6kZ(SkZUnhfi-o|Txlgu!*(jIxrq0h;s9jNwJ<>io)Z$m#PWv(ZHnj|_ zv54wo!qjEcWQNaUhEZqBbYx@qgATjQ_@a(&de=tLoh~dw%1<}N-LWu|M42PqiT<~} ziAAn-XHNpDp$dISN)7SV-TV1abR$M^Uc|t77eU{BL{x;&#O(&^(2d-7e>}Wez7cMbso8KpYBx%UR>3psXQh;{ILG~=Yu;`Oi85)^ zSC-e7a>T=aPP@+ZJT2`tyopwwwzLG21KTC#Ht5JM7IH0#Fjl z%VbH;!|AG;S@2VVuzNxJGDwZ}?SUSRo*&`l&9my^h_K-t z5#vhMsElSIIW1GrWI}+U^gKgXXpN0x9kFDR>2Z>iqOK$;oE3D+4rZtw5clM5!Q&}f z{05Y_$Q9@S!e+`bzPJjs4Hy% zLwdK+Ae!9-DzziL<`#eJw(FkrA8gd4u0u8qZuN>+i43iH5Heom%X>xa3%9RD#q11< z@$7@~t$m45+*NO(SA{d=FPJ6{OWfVjBMM7w#6ghznu%98hyDs2YfpM|K)Y&#a>ZKI z!&x$6m*j~FjS<*QU-)^k+l@QI?#8w!XgVYCw1W=7EGaQ_V`Y{2JG0oBFvZ{pK)@9N zxSIdoaaC}!aQ@o}Uvz@quP8g5)8R^eZi$Ff+PXW8(r#$Jrv+&j6@otBs-N<$9$Ut( zsBz5|qdWPDoFwB3=!g8UlU-(AbXywP<8<4!$JBN9U+sIGl#g)HOp@ji22w&&p%LU* z*_JD&>R9c&7CS>w1E%B=J|+BI-1}wwI_?H%I3}UE*@dsL$+5)Q-46+a_q-vCQ(lk# zF2L+}U-ns!^5hccfZ#nmM|aefYz@ZdrH*ZObUkkXN^GvN0zQae5-uG>L$@+#J+>pa z+ulB*MS$DRI2qABc*x6yW~HsSr1Oswc~sFM_MjLTD)GS)heZ21F{X8=x{}jtG_BoM zTaYogvs%3uQ5n0lT-gs~3~+B6-I56ipFrTk26UE0kkZ`mo1?&Ys%baoaXC%$3K;bE z#sJ}>f=E#?FQB0UWC{kR{MZumn$*)P&S3C9b%c`fibm_217Qa!R70j6Az>hH=FJxB zr0zjaqIx}IP53_G22)e&7SAS$kwrAlJEZdE#(%8~Q2A7Sl_zOxND7T&-W77cv6ZKh zg?ed6;f;r#YW&Tgg@sALcGNy+Pvbjb8H}LKwXDG@(^_E`?P+ax*|0b%6cIFk;kucw z7iZWD*ci>o188VQN79XXmR2G;dz&@Ua`DxY{B$y{gkaSZ)cpb0P>p=GDUvf5J8AEJ z&p*pokoS7L=zv}%C;(3X{q3e`VrJn45V8B!j{K*-K(d026bK_qmfCW)?YY|hfk>AH zD#*}!L~1?(4Uwwn^iplKPD6qz%$r6wC_I2|IO(bWQXn3hEN;TfE(FsZKgaI+1J_D; zZBP|L6~cPZOB>so4#J>;;)-$q4_6*EvhQ=}dp@GsfME(D5LjK_?TY$9AQ3JZ_T?A&aOn zdS2qAG-f0NHwQ^UjPdXMkW_ESkWy@@c`sp*ze%gYscC&6wALaLb zo`k$t6Suk4mN)L-YJI%FLwg#i3ysI&vCaaHOSQT*_Z5jx>T)gtT%X1 z^046QX~86-R_vx?zVJ3UArP@xCfS`^uE@!@~%zKrn*+dv~PHoNcM)rvHCG{97 z@HeQvaza9j+_UxD>fXS5Tt&CTB*N}5V;8l%%x|A$4VNl*n&PdB!g@=Gi`@DqO2&sQ z35hIep2yQyjL?=|2lNs*ZlVsvfXgM2(Ac)iOf%?ddCL~49W%64;GZFd)RN@kgCK#& z7tJ9GHxnn;=W*BXzc?-?eJQqqaVOfP%!X1=kspQ@+Rbu2@N}(0rq4t7fql+=*`+JS zSoo<&G;lDv1F6!w%RU-Pa$D(}i_KkZ+WPuhJwIc;S!SixZnNl|BT6pMe7*oV5T&@w z33$(6!%y^&~b6@rgAWOp3j2ZPTMD`#@4%Q};H>jOsZk`RI3B_fBR{Pc$uZ zuz+63?WJY8Urb~Ro=9uUH>z!~f$fHAu~8BtcwjsOK649`9&3isL*z3juwzmT0>b=z z7<=U+p5p>shi`x|_TT3ql*~;G97X=kV&xw>IruUL-t%E@VjP zP?~;9Ym04%LGW67b>KJtX96m~L^^*j|Cl>~7bUZRj#1{SjrZ95_;rf&a$0ZO_k+9t zCQrS4N}&JoUTOFMlm2o1aEiYT2sii{>}oc)vk%@!j3unMZwnUi)6-p}yXZV&S^FF- z-@s?_go^jUaj%$b(E@!}orpt{dp-#qh^S4)vjEp#gXuc=eydN3dl+`Bac_OR23Acp z|M;pi#jyPi_}%lVdvc(~cAZ?VZ1%df$;m9Tf87GoL zLb=Yv%hyecbXYJudkTo1TRI?1G?_k}Z|41F%bJ4DS4m8QwS380 zwLxu+pWMv@Uvc%K(^(L`-V6C*xql>+lPStxwfY|Ewvt8IOQ*G(8GgJa`%V$JqX7(B zI41wI=b1^_3`BWJ$C7p3y`zG;o2Vk3{4U%~U_LYibr$9gl5!SzHNiZtQs9ON?Sy7l zD{>EOHNVRR#?*>ke080Drkd1IVb7Th{iK9aVMwIhAqP*NcX$^l<%5UTuuwUbZ2+an zqgWx)k;7<&`r3QM!id66lr!CUfN54P^xT%b!VbuoY`ArY^vm$v_c<*xX%SWRhz8LF zrg|5F&WI*Z!nG1gLhNusJf#}O*6Q9Dvy*vsE8q%h>ln805L)r^j43kuZst~U3M%O; ztKjlaF?StW#@(NKvVkEp;3)NP+5Z^_SDUV6{Q>ntGXST=f0tDMMWzA>gce2;wnmPB zD69YNfmM`bWrr+=60#k>yi5}mGWdy3+mZ1Bm@!yzjZB7~kfjVM2n9vC+a?Q?*Z0hOH_A+f{s{Z~tQAiz$ zsm27mq3WPF^$|DY_VJAnlt|@~1AS~0&lNRFc3V|f@dGzBI{W(j{EO}55Db0kImjmT z+4=5K@iJ5jO2n65IF5TP=tJM*%g1x)`mPjocUz|s8`q|QHT{^BchVP}2d)a+io8sj zu8~P{XwsvbfB~^kdKaWV>xJb#A5r>?4*v&CU4zbTH)_pdDO(LlRg^1brF>rN_Ruvw z$&&4r(n|{Uic8-5C~HsJx7?1NiZ`(<+eGSu%*zm*sPHFTTFpM@*dZ+*-Of}pl_W;l z`dP~-&zx7QJ(AA6oc_VDtrPC?pUGb>mDy+KEABYmh;6s z9blPK!Zzda#~ME*K{&pM6Hr?(ABr-ciJBT;%(-@)v)}p1X_}epThZ{i!E0kDKFtnu zjImAaFk=^RSQ$xAaAvhQ03ox<8VMU%B4h?>97H~q;;E$JRz`NlAPYCa;g8*Y)~&eQ zf&Q6m{cSFOBnT(m&&J5nG^W7OnmH!jK^)q!TLYB2{v(c@0)IH=nuYJ1WDm`V$MG6B z1^N6yoKsh56!T`_VU!lHG47&}tn_;_lvlhfIM|wmQvYW*jS2Bc(_gF(q@wMd9#(qkE{mA5|w7g3Zx$JT9ysiTi-nq_AizhybMNFx%5<^ds4ZOn zW7i(`)Xl><*^Nzi5yO%os9~2Vp+}f1ekiI4<(_Qi7bb2o&Bc=Y)nKg9P z6hGh4IcyYNQqY1%J*>|)@4wAD^Ez3bO#q_I8sO2z|6iv?lufKn>;c_?KkhThzkU-k zaB=#JJgEpUHwDn9=S{WkSg-FK6Vil+RJ9Q(BcNE()RIy$w19$18-_R4T5hkkmcS<& z&N)D*49AELnFgr#ZH!BrlaQ@-e9g+@W_FvJxZ1?$@9~DH{j5SyLi1#g9?3*zvTz*A+v_9{&W&YXgb9J z6Jk-5xPbi}Jh0t#U6j`7^uAreEbO?vNwRWbW1ShBaet;3yADLk&uqaE8`#&(tc`lZ zRW(as3T0_|{#gZlTGaOSR5SbRut96u{ki{0HRJ46e3CQ1<#zfu7#)Qy)NQWqvT``i zeKj6*I?tBXgZ!&_V?$!0^gSzFDZSa6Xm^`lzI&JPYz&Pg$`%6(QJc=2e5^*hPPj#M zhK1VRY)r(9(_+2tVIq~H__+H- z?e}dHm7sV9#G$ANgQ#*yd*lPts7wU*eGHQm8@uE_o#t}3Q=AB4`lvklHP$h>Gm{5= z7DgH!Z@4|pA^KO*HP%6;TW6in6MTXaU~Rrn81@V&J86N05F?xq5YGsdN&)C6@QU$_$!A+kH1FH-GM8g#fV!V@+WX~bS+2OzBd%da(Y5x%P~z=s&R0^SJ( zn*pV^zgU#+A?L`&duT>K6Zne6_4!V-=U1cY1m-UYwx~L{%oL#V(%xB!v;_lIl{PYz z;s)Y=k+Tda3PchuKDkk)1{5 zNE<9GEH_C}lDwYLJ1RB&B|&Jr?qal;z$xT--FBRH%ro8gn3U7g{r15g-Az$EKS3CJ zkp!u<$h-_vDp^5}Fh&Fu4pRmbYhZ!e_B-yngVu|EFJ=9V+4K~^}Y)c1;z;(t!I- z4hLzAoqR`hgEOJ?t3pWswu#csV@%g%TxMx9;ocf7{!gj>V|P#ovv3(-4kY;UCZ{g* z49ThxBWD}MrW=7V9H5}kL7K-2eX4wwJi7ZiJTBh%K?Ha^)%Hu z)NvFh*rE9qu)+y>exV-NQcfi=p}-Q$I{+h-E`V zS9~51LQ##cEERJlB{)Z>BeQ%lPRK|lv!6s#ixHmo(0=q59!-X7VZ zQUg(qc8$kZ>LGZcB#HEzN)XF`f&zk?#NW(;w*}X?z^_YOSz@e2(NAneG>p_efE43E1zmLBv+nJeJn}}Lln3?~*3idCt%mF$Y{Pnqf)uP5ZMOvD*=% zLmU6EOs*YiCKmmE-}}mCkpI$NT}6#+#?ZT(*zlT8cea$0Zl!IG>(}1{yIB(y0;Q=%=GbaUh*1pWHrbF8NV%F!2iI8E0eJoRh#okhXq64vF zE^Lq4KE$*67)0MMWLWwxvKvZ-vu?+0HWB#dS~Zl559gUhxQ)W+$INy8ZD;V*J&BS9 zLTAK^(?9N*qb$@%pj~%s;aR&Ktc`~!N2XG}^v+swNcqXs+#N!P9uHYZDrwa%P+{f}j<71_sPln4w-(X{rb6M$5ID6IATX!B+?KXhIF8@wg0^{k$BAR!2x zh((C6wE$NEE1}Jtr95veYD9&zrIK!e%TT#qpvD?1lIkh+T9F_Mif*dQ%cj&|tK!~_q(jpAiBiqS*6)knY?;)`nR(Gj~y<@(VaN>3_bKRwp z3Z1>{OO-PX)ni(J(Y=I{VL7X$ApLa3olvqY?&I&v2{Ed$p$OdkJMvJ+0?0`K$V>Y_ zC9HoUPs!HA;O`4B$%?bKNB|*D0Ptvj0S`>mLIEZ+;HF7N4@(9=jL~9Vcnd&I74O10 zK3DiJNe3X`q?@S=NO8pd@h|Cs){fKEU;63OHw&Uz$*?p$NxSi|v9uR!;`x?&rhQHF zX5u*>0@KI4VFnefu&nH<>*G-igiHpHdBM#F3(^ZT zRN5PS@Ni{B|G-`4;xF9Iz3S-6g;$eGzPfXK?D$a>CmR|0g=Ne0I6Dw0n?rpl0z?cP zTO(wS2?&5Y^B>zA0Qpv+_Vc4fPyL$;8@gxECMD~6wO_ac0Xq%mv)07|;7(`GQh_&= zHR2qAyRBT8$tu0TwqaBx+f(S_BEbXHtt6M14eG&G*%cmJ0PgnfvE4p2t@rBug}aYe zr(PMqaQ6nhKky58U?L}ja2avC?}GM*c%4lM+Mg5x;Y+y*J2r{ZGhgaeTtgX9hiVbs zWPSk1)enY9tu3oV&CbzX5O zT80?c3@C%&zOf(~(Dd_xoHH1E)8Bb~%G5!OaE}!~^Q)7$^SvY1qbjGp)ck-Lr z2S^P=K4;E`(#6Jf+I~t`wA%3!SdRoK1s7uC!z4WHwKpmam6gSUzxnneJJcAbFPJ8L z4EcT;ff40dP>^*=O%8O;xFUonhdbGhqzLnKr8!!NvL7#9)y>yJ%!>n zG*IE-c3DufYQxavwae{jm0~YFT7+h$)?~EcQ=A7hN#WSe`|$yW z$!CaYHntOP)4sSs|9TdooMw_Qvl$6&7EPtPgGfUrTrL!LGwlZ~HN80dNR%axQ2T;} zlF)WzTt45x47JIuq1-5xWb9iby*{s1?eNu&ed%Nr@xq3`aFcZ9t}wRUqpqpX3@W1xNiMXyATKx~rLWePak8-@ zJTgnmF?F_slkuFrU*o0N3pQtk2oVEqp@oZKkbqyZZz$;=hmEL_3Jp zZ9a(b^)QMIuI+PH{9xKvoxh}w%sMducmmObgMTy#99*>oS_g0}>N}XZrR)=X9JM;KW^5VF@7-gWqdWx$**oypcsveUguW|x zweE+~@7%tvP( zf7fFV32gLTf?upJBQ_mt@XN|*q82{$*v1%JcVIvLcI=P9?4wZ!zx68C?e9fq%|Rwj zlSyH;GRT^Qfv2m&9XJodN&ZSt0$+U(iXQMCkq0l!s*Iu8Je)XW3~b#SQ-r51)HlO1 z<4k;h-F<$=v!&sbm91Hif#($W_H&y#R}I7)Y0aQj3xk}T7(^ftm2ay0#iz+0@R#{=x7uz@;Qkb;yyg3jLtN|G! zH1c@myj$8R^fK+Wq0P8kxV2*?M;$J5(!6vClpxp^hZ1=8H)kN8d4SYdA*cJ7d{o3s z>G)P=9g|ZXf{A=%jOhZ|`;)Z%6vppMB&Jv?!i;03`|l0mzfDY#lI^2n{-PuSAdTz) zfHKGbwFC9#w+__Tt;Pr-M0#r7h=AHK`Ac4{0XEl3$qd>%GY=%5U*i&coFgGbR>T_>*bkM;FTO}ST{R{c65Mt-t}Wl1?u2+sbG+^{8Q|Y& zr%!ZUMXUU+2St9A%Zz34c%2nw&!F^-&?AVPudA@;-#*8u;1$1Lr^XKGLD|3Lj0Q~^ zuDUU;mENfSAnd*vv-?tEb@k%A!pY+a*2Pdsc)-4gZ_ZE_jwARLs%5 zF9NYI+wA`>PyeRtw53?3#~64vKYfgj@Uu`N^?Ia!CQ%B; zjFx|)-bJDUp%-$f6Ay{nDz{3^YoW_)i6de9BlVbDVHBY zLq|cr-$8-_=r`gi1&>DxiAD?N>AdUK+=TgJNB8H_QiCiJ5Rm441UNx+S6L4GS^%$<(;R|7nX zBcPi9Z=0-teNV=~Uc%PG*}}lu!t?K(HPMRevi$&h1DIsNvYod86#-p@Xc_P1Cqt5q zTzV`dd>C8(rT|JX}o?!KHrNEulp#~Y~ z2LfV5K(J_VHE=mY+~+NDJ2uW4Xq4A<2dZ7<=b2yJx`sguC z0XlC@j{zV34M}H_-pK~E4G_%R#&T_%VmXD{i8Q@?yj1tM@|2v)m{cv6aa+#Z1&<6A zZZiXLs^6Vgc6DRD6g^X`QDdm-o|`Ykso}1a0tuDW@vJ!{O25RC8utkLX$hSr5>Ph| zC~m@q#-JV84-0ghFM4Q*U(fS*Rej;$9SI88Kn71B+Y@I{_uCwo|MBwz_E}&D#DxOI z@eaTMO^Rq-2=aoR=z4+!Ozbv*qLh>jg_t)_!S@+e?Fz9?wUT8BB_Ad9RH8_nFdA{J z7??#=0{%>{oatql5z%susw6YQElk^IbV%7j^J^LqL6Sil$?oS)w1g&X;U1?dzG^f_ zh_bA!FTWAd;M1TweVXwAphz&_F{`%rvjxN&{pimaLut+rI&T z^Pg-lZ|!1cVJmFmWMF9h58Er~NC5+iyJ|Lzi}jU_(pBF?Xi+>>yiY;!Ndg2<92O(D zHkQ=Y{M42L8K>oU>a^6rY6$4bM)-+KTO$|3Jv&TSc!u<7izIEG=c~8)mXuCziF*;MhYO1LBmoXZDkDMWQT0m8O7JZ`v zJfwHLXLe!hLTaDxPwIv)xeH7b$+j>W;TkMf1c!B*cJ4r<`E~I44<6Fib&p{flb)nB z;tekj{E zM-kiqVa8d>|7XT#rlx*$8Tk{H8&cSRn6ZcYT!7*PsU3fPyU!dS6`(;go^Nz!;OrXZ}ia1C!A>Q>aAEHWmV8H|05K-L`F)G}G`v z6{E4dHdxDO^dMC#r_w=gf2nIxnCXnB8x&FyNUSwy^^^CC@k+&L)9 zhvDD>ESkPL2H(M~A2+AXcKmz0v^edSa>&B9B8DOF726R^_7Tjv>V_tZc+ghKTHTMT zK##UeUv3<3Twl^cXCo2K)4r@U2jRRCMA0C^w`E}sa|V?6E>0m^nW`Xr(UPT;yE`65 zFb~4-5-6(}BCMb%AdR%~Lg;m`HVjpKg(#s~jaE5j@1~yus$Fffn;)9XLWr_U``H zQq`@usHX-P5eHzze=AkSl=8s!tpfxmnGA8MPN!C=wU;9kSYhUJwb`O)kS?cs_Z z#7OBw{{^fL-#EVn7>6WH##*d$O<+2I4gNWGe)**Jke#3vE3n zeq{ONQpDt{kvuq>Gc0Xm9wW}rf=4V%Dj}gJ(dHVwSx*&B_P4gPPw9efF>vj0<-^L< zC^E;m6P!MQ--$32ujsnK*iO4dtV5af)#nSHKcuTvN6Dgh4bLaD&baF4@%&t~P{a|( zt^miv){H1@_WLdLna=H46aY@#5D@zQZOZo7i7T4e*g2ah{SiL_D)PU?rvFyPPgWcU z1V9vCkYqst1@9dYRA&(LN{4;m{Sb2&3+*sM2Mv8-;v$)lez#}!v_H4CxQhgc750w! zrrVsZCOiE)JApU^`#!;9LroBr7y;;Aw78mG4lws{*KIhpA26F~Df0M(EiQLYUsaYn@(!hPja?{dQt>pGH&y2Zjp3I;RUaw9%gVkKL zatLW8)%ImQVQuZK!~Uqkl(O9TrJXi-Y#{&04HSwy17+#hakR)|(kpw~N&tz^ulPmM znt!IRmRW~75RWY>4r&+nE88ReaOfDi)VwU~qli3e`>n)0R1G?9xfBMg9YN*~?NSkT zKdpmL;Sz*E#9+7%Asc$|)H_rIyMEI{^6$}1P@?|t3Q_N<1MPFd@uG|pB$8DC>efn78#P_ zudFgJH=p5nVZ-pnj&Iet?X<@WQ9M}uU z2I>iB5LRRhWw-^n71&iL`jZC_3`Xnb5QAxpSUS2NE4xN`gHs9#*3Sw*Li$c%AwVJ+ zP_%M7>yGcba*tabP9S(C&4}=vJw|JJwZt8=O!suc5l=w)zwHZ!s5Si@Kwn>!!@N7H z9mj;G<=?><3uJ?r>vYY5@fe6%=D!!z+fb2@o%YFa^m7;s3pK*ys&+2F;f^OvH;o;c z>@liYIvWRPFTkA8v}sc}>Ma;OkB`Gic3vzmSH3|TA45Jg|1N*%Co!IFX(EY$=y@C{ zt4GVDg6t{n#sSU!ql@0Pp^n2#NZKIpGcAmVI@*=~kl;r$q0{0c*oRB>33|esKG`Rj`hEsB{4Hz?#U6q!(*=p)-K z0ESC-1N=y-C~K}hghe2i&yz?#D_?NS#iooM+BsTuX*a_s7hz`nt%=5*^n*&=E)X8o zcfveYf3&&AG8QG#ZKM)P>Pqs`@Iu(j-h^oUf<|F+OWo1XBEf8ZrFiU!N}#q&PzA=e70JjvuE!y4(bsI=7w6$Sht z`xI2uGP3qHn{9Ku?fN7{ZTFyekQT^I?o`wbJe>Dx=)HqLZ6DEo!(K1m&%Pe^2=@21 z8pojdkw9=ku5Vx4^ZovL3x#sw`ac1ZYW@FBXYw!S`{%Jp1IC8{QhsKCJDz0KNr28I zP8U5?Izm8FBN!I6OymkeZr#0>p_a5oW(Mfmhc(SAAtpGb1c@o*{=DN>`#kOzIv(2% zmwAy2!^P}^>Nlky$UI`_K6ZkTK!tSQ`TX!7-L`$~zK`(t{D9uU8N;dSXXD|dT|yzy3bVkSL^wX^GfW8b_4S7<%x@Q3?o?^L|0p#1?Wrlo-)C^{^m2R zm5|cB{F+c~>Xzw{utQ`I`|<@ks(A8eem)@S|+{fK%RN{0UNkuR!Qu;hgcrCkWhr*Kdl~_YI#KBW$ zRJTeHT8WKq(E$oh(&efk)K`R!6|`SPC1!x~eGJwGs^xErjaJ%~NZ~=Wew1IF9&vqX zzcu|j_a#JTF>8IEqK!ZJ7?U85CMh$6?6K10^uuhMp%u4Ga+oJKfdYe`%?j9lJtY`l zW9aAU(KrA#MLg{Y1*R(`xqyOniSu|l*Q|=qW|*d^gqt*{d@7}87q$zlQmiU1n(#d~ z;f4rhkO2<70cZhXR@MC?m|u?~n5^BtUj13LW|bwk zs6#iIT;QI08A*^)7$nY5dKJhh-VuXuh^szWorzwXn*Ksx9_`0{LMYTdCT#>t&_nv{9)!j)D`D z_=Z;VrHG6hKlwS?OSCUN53T)~axW5?p9rIuU_|K0mHX3SxVS9m$8jMwD;_u2HX&Tu8`5e_d<{PvZReYqXXXYh<`An&bOw}Z%>ok%&`d}_WXC_iswWX&I?cF6uC zjSqVw%>^?nADQ|Q6mXTE#nOGEp2^dEvN~$oXK#>XK`cpTp;!~1cq~Z}Jr^m;_l7v| zJ|ANWp3E`i5mp;0&YTlL5xta=y|}!*u85JmxN}elT=iDYc%rO9a)OBQ?Li~S;UnT2 z6dMh4RXbLQ(-y{~&56TU2=CrHx?q`QU?5!-si*eN?wA8}v$L8r0MA_*XD~+N8CNiRl{(EPqjd85GqyqAZgdX?wLiNS!g?Dt&&AH!L$-F8$Vcur ztgSrgRO&!Jx5r(o@?5|}?<+4R^=cHVdqj7poc&45N1FR)aevjq4_k!L{xD-xfsx9& zy);`kL_G5}(~r0>+{v}Gs$Xg_>oUnZ56{n>*VP)IeaBK_IVka!{LFbRUHC8bnoZXF zeFaPo@j0|rm(*IFP)|*-7*)t;Zcz+Gd4BM|;JbY~DG5LKgu5=|yQTl9J3a+{jQN#9 zN&w!%RR5uT^vfMv82!BnkgO;p2Pgpfz#LZOhT%VXFk*qQY6glyp%;)FhGFbA^%hs_ zOQkf2|CB_I4u=4+s*Q21s|KJO!EdH}c-(GXIP>>x@qb{cEf5;;1hTL`s7)V06Y?e6 z`~=%(%wgFv$M*VePQv5F^kB1_w!DF+6f4Dd;fNUqbUk>-93rT;5_9;Rz??;LYJ){< zIn5SK+=+I-goL^51-sV9O|tB$#qndz@5IT&=zb)Kre)Kg^-4prlnb2oT2>nK05M&*mvfx~xV=L~a27a3OT*&|)EW|Ib0xz=OR`WW*L&*l5W&w9|T zZYJ*mBaf>3$@0CfP?*M;4?i2wLb`g)wTCO6tG4D{PlGM)_D=jLU?Mon6-VdAuEDv6 zhzMIylu%su;U+k|Mb6U8StOn56hTd}&`OQsWplCW%BVmL(8}n8rO}9=)AdNR^hsTr z%M`PsZUPpR#N|a-5h{bgoRNy$vd?T zzVuolfZoZZlNm<5schHeXrk+Q!^`w)W9#h&L?2%T#-j7fA3FG!X^e@2+G)&`HKHBzn@74-y^U(Q_(Rtfr#EIbXcs()$rJ6kf)^z* zq4LQhW?RNnk4nb_dkt9`>2~IeDU+1Er-%bI3Me?DPw%wphuR%Pf|gkXMz3Ob_~s0ef)jEZHI8<#{{+x5Ao-Vy#Jw zOB?q>iUx^_jD}VRYOb6M`-aiab}4aynuppCt_p=(Ct7i)Sfb-FfzMFwytM?4s3-o(W{EH{ZEqTv+)1mZx2bZSIUdzP!_=<3>l9W zUXWNh5l}Zf95dLnxBpqV=>79M#o)!-VS$K9+eGJ=boN_UGe7=~pTOTRSz$D2j&6XY zIBB#-b2A1cKUTmRk=xEZw&5_)Gzpz@Za!T|3xCA_PT=_P3mEw}A=Xl$L~91-OL{4~ zPj%$L$8lcD!=%@4tvC^Q{BgVTcWoQG{DurYAwE;`){&pDM~-#qdOCD+h?FjCk6*;9 zQO>f!Cr^aq@{f8Vz!x&5$Z>Co<4zassHCtW1D6Ldn?>iw1d=@1gn}H{>PLv~>4>EE0WNc81ziT8g^e$cOa>bXKh=duX=&3~ zL;R)YOw4GG41lcCVeWHCj27chNfy9Ne@NrGrnOiQwq28LQg z!^J`Dkhbi7d=DNR2IX}DcWbxMx9%`&zCB-K{K27S4B_=(!#u4%A;Av0W2+rZNF-gv z-iSW>?s`2XM`A=Twr=int$5qn!*%qVO9$2lS7I(WV=?RX{;m%T24Idd9?H;}EXP)@)sadb-E>HzZi0R6mrt!?`;P&F!psqrU!(U>ZlXqd0@oi8K0H zlMuJq6=cA1CRQ<{5 z9PunFO@Bk(WN2Xz$pbSKe@)mDHAMNA<1}(ck3={mXFvZ`&8=dkCB;b?65kEz5|!^w zNR5V{(Tv@L!DMVL>K#H3NLsjtSy|YHBG@+~$~OR-aBjhDih>%%Y7%O2-?4{xNfnR9 zvt!r5PN`FBVGNL>FaaSr!{GtM@ytp!4W z^#$(Wn-5wQrRJCHh8_Pcg)vFk)W}pw+3zLqHj|EnZtZ3?YaP0bee1}VFtQtHt25RS3AHgHUwfp5!)$F- zj$Sgb&$nV5cMHl@(D|0227bZ`a=cXJ-9LwZJK)b0sXwF)_g6NW<>d^VZ$O`EFvb%M zSEvx(JJ%Pg-z`hE< z9Vm-i!p9;XBzUboQ8tXI;%~t`1jhH+3#o!zYc^Zx)g#zVY=OQQ&YVKsq~5+k_}&aNO zd$!opFSd1w(%ejRva71!33QEU7 zs4|CeEM~}uyz^DmSZ&-tyRs`XDc9sG*Wd6cNEjImR+WBD8}GJ{Jn)J)jM`9?{X7Aq zh%PsSpSSswKzJlM$-n3~R%4)N(;7E`8Bqa@OaB*B3LDrMnEl<9UzE=k0o$$bb0NiW z0#*vPA}9(L1Edk`D4_BA$}r6NuA=V@guEc}aa=ZIQF6WG90kAjTlqf2AGRKo6c#Dt zyv;hT-dy4F{DOTTPZk@6!B4-{KPqjo_T|6EZ#@|LtjUm!R_3>uGG zT{$ilVVh+$VSq{n3MAOkWI(;f#%49U&o%8FGxFW2ui8^7h?RG`u~}V2a2v7me0599 zNWeNMGI_$rDNrKL5eX^fRCB^XJ^ZTTj>D#-nVopowpb*JXuXj(ROXG-n@=l=U^-O_ z<)?F>>#C!T*B2GtwDXS|iox|JTp|sIw_f^5T{4+x*xb6?F*#QZHnQJzcjS~qkUAyB zb9$4?i7*#&yp#-5PH&jJ)GUKmO+`8^k^MQBX}yZgQgw)CRorc^(n5^du|+q{&Uy|< z9XQw6)7a4;iun_H%ebL{j|0F(m^CaFENOeRv#1Z8ti*CktA(3vE&3m1SEyXrz|l^u zSx{>4As+#hY!Cr2x4iaqC-ws1*x6Ruml*Ht%zCbF;x2v+CXuT#+Xp=0r`!1;g{;PR zH)p5QWJ4zTy#2{Y+!8_^qOG=f1QELJUBcMUAE11U?|xhX74iaI7N`{A9$=A=uzYdG z5A)4}7_|6+PJzLHqm1ZqHYftkOM#Gjf=)b$aLIFOqUkY*M7U-ycSZ~mc2e*fcDCv> zdcQ##UlA(bH5izhWV;gw%Sj^i@oSurA_@-aIjS}s6IP>>a^^ecEWANR8pFr%nGASH zK`HM>!DI0gnjSkxJe$)j(&Fx3WPc~^p8?G^VO>_=dp39Q;eTkAi4EY+r00z)ycfgc z&rVz~)6}^W7`ldg(JWArIqz~s8Sv<{OL2=)dU`&>BpvB{IC{<@NJ9lu=Fcihm4jC| z#qn-wKPyTdRwo*Ux`_UOzPsbwn_S3_pB}?M>l9$iej>94s~ZL(`YuM2v94#mLkOXO zw2&&a?R%s6n2hDER%YhLfJqPvik$n#y`TnR{xfJ$HxcBgd9I~*9le44UKUBy5uD(mXsHqjPkOHk`yhxtNCL>)17_Dc-0tlJVB-Yo{ zePxQfIi;FsJdiJFoFCHxBSe1aisSBX3PEEsi)LkpvZ#a${;nTk+xFVYa0ekMJ z@3R}>bgoVtG|tt0Z9l!Q10em2Bp`6rS2Ou>}U7wr;a=*z1uHp zi^uyON+!!{b_&5SnCMev{S*t|BEH7ChKSDjkytuog)!_Kkd-aS6pc8sx5&L2IWQz~ zyrx!AN~Hw#;s5M7|z!d0JtseI*8ku)(0v8{zxl&e&4g zUU>GA`KReTV8OSSc>Vk0%yM4@9leMAch;uk6;nQ0B=Jf~raMQJqE8ygvxHwb7gFpK z4B}j>DRK%~Y%jF^(xN0u=uq5(4EU2&j`7=s4Vo!Ik`QFtmHE6kda=Sr=vOHCw_MBI zDQst`EGchck?_g;%#+rY{6(Nb!A>aiQ3PdtQi*K`dTY4BkO1|ed)y26j-ehIOeKjOKX&W4_umECUi2CZ3Dusazi(WH z?gZ76eCdC#+Pe$j9%vsVJ@x#^;Dzi+PK{;T|eERtbz{RbGmGYJDw@^bxHbT zMfiV}Z_FsCCCnuynlHhE#FU_ZGMb)rTW*urVf|LoaJ0U2?PMliAY(We!kuYP^|eec zH9A-lA)hx*OTszYccgK@;OGe<*bmvW-KnO?*TRlSSTba7rf0!y_FCyn~U~0g>^^1m#tO>57p6@Z_Hb z4zo(Cipj8;&uS8nM;lRys3U(eH_%B4s$iZBt-xf<_X=jD?@K)q3{$UjWA05hHVQXp zT87Y8iFyiUw5&r;-*YY8)FyrfA3ea~OI%5UJ9~xr_x2Q#-Uz=En1aVZao@jXr~YRO z0?Cqp*YIa4UdqntA^2>5v0N#A!2q=<_`tsbVe|Pj!2ms2KTxN@EP1$DVY7$YnMqT0 z_iZ0i9;hYx^ZifxukB4v^%cZGor28=kEsnu+3Ic|-#2JII4(>hIcef3RMrZs#bs{& zdK*1rP|ysBY^-I*8rqLe7A(=YD;BWh3+Z1HzR4e*Nwq4w(_!0u@9|Yvw00HcD~WaB zh1q`_z4Kr2o|0EtZNh4D!f~e|_y8`_|4eP18Dn%B<-9LPqG`FBtk|p(e#tNAD2p1^xx#zj zx^>=Gu|>GwHpRhQidYCe4$zbG&lGdzm9uG5!z$dUvAA?zkVKO#%vnjck(HyyyD4p} z&g*Hhcy7DjH-er;AD2HrMfB)P(BdKEk*b96+n^9~8?qV_L+?S<_@ccA-9;%akjYe? zk(ErVOR-q_k#BvJ>vWwluAd3n5Q8nwn5owUtbj~vorn_hTK}r9=jqK$!*5i&h9Wmd zGPkhX+%Z6gVDZe}X;Kz@W=?fsM~DDTdr{^*o`{29syPB{6<(U_zv z!ofZ%l2yD_!_5t;0y^G3>k%J07k{Tn=_$o0LnX=(E+y;qO_Uc2rzy})bBOx+5ZQ4` z{-gF(SWeZE+jgZ#Y=xYDvNrV0dzf?|0XeyCyvAclavtHH`r2*xb@-ksO0M3O15B)D zF5RyYXi!X-%BeT?eeO;)vHt6B49Q}Q5=IQk!vStYBNTB&`Vwpi?ii9n5lHIMq&F1V zp=hLa0;vnwp(tVHx)n$WGhKW!K8sO!cp7q~Q4XQsn~Ne)KP_7W^ux%mnb5h(8YX!4 zIy(ENRgcjT-!;3RA(sAb8YxJ;67Y-0g9)qy>i-2g^4AkMcH-A?7Bp38ZfLl=T5eAW zLpMO;|GqgKyS8FmWP~S7kgJIdf&BfJ1V5q{kRqJuMlLRl7@pDUd*tJ2!o#z*`5wn` zEHGLgowgEt`D4w9UZNLOJcsG>hdQs_p+PIM!YM_{{Q&&Me&pcEGO-|T!)52>HYlM{`iS<_qb2!DIt*}iq=|kC^m3c@w#;zP-~ip}_!=KWtKKd-X+{H?765v- zD~@ZK1(w8OgGRzdf|N%e_7jAWWf zs~;+7yHZryB1QTpb*k$Rkn^(HRHu7$^cu5z(N!LmvN}r^XHUK)N~+GF!+_uuMI)58 zO{Rt+Tdfj{Rn)KL;BdkEUlibeU&S?E9Qw)u{NC??@5z75fBXI1ar<|PufMcl$xZW% z@CdaHZLq`T)z)tR_u@-71~FVB^$R-wZMTt%bbHJTxZ2qIu+DY+2caW-PaT4iTShR1 z5?zu`8MhIDRC?-`Uy#>tA_j-keRMsOnm3OZ{p8~6;6n$JA=`?-T#{E$`?VKQaMjr> z#S`z6p@u1#;+0v~vKUEs{E62i}g zdC%T&qWRW|LhzhUW2p8i-3VA>H6%HtG?GX`UB1nWx^`UZ9zqi$kJTi1GyY zg&UL+dgC?ZenHKwSNpe2L^Ec&vg z@7P&eVYo8c&ezy|EmD>p{kBcm`HEtu6}p$LB*05TW;~Off@Qum(j8>2aqHwM{FD8B z#o`>MQlnewOu)~@Y=Ux$)w_^8?tB|%`WHYM~pHJ)mbic!c_=32gac)Lw~=9M6#`p zeStYQcuz2gQx1an`Wv8H5;qKW1FU>)U<3BQ$->{o?G>bLfj)8GmR$Bc>+lK!d2o3} zUR~!3Ztm4;Vw26XVFkBviwi#V)&Hd|z zTScw(bMH;nPC^5_F|+R6Trj>Hj4GkfT!^H}nI<^x%S~Hr_->kTr}?xFo;r=|mVumK zq+|6T`Zq$m4jlNY=y#sH35Ve5e-IC6e7sL;(`388z0>X@D+PR-^x<~VUrC! zRA7e>lAv3_mXaWo9-m-CWTH*L7kbwnN~+zq*D;J8ItP+Gjac}W=mvr7-Gtwb>;9%T!5jGG z3LsDF-cLvG^tTthuvHCo@Ba^MPub4scWh5vvJYrc6kSDoR99EWSWg5(YcXxTD~+NP zX+xDaRu;nDYBF9h-TiHkh~gOXt{~slbgYXntat4BntSTGV{LOYNB8}i;Y48c0SZ|x zTa5uxn7^MgsBrK|(`hp|-W^7`3|mVB_N$DjSO$Cx{kaCSlaMUl$79qTSanjP6UaZH zJ?Bj{=@|S(pu?qp^B`t1?#^w(Pv-zgQ=9$*nZ*-U?dl5%qRPEuvNiwv%by#(q0GFE zQ??pa`=UFcXBgLs`o@8{!FQx7jXO!FMK>*6OuB(Jg7jsxce`^5MOQqx4Que}FKU5n z=x=Rn?GBJtK`2tN5M-Dz1uDTkIQ^5nlcvj9Au8-v)1pf!-|RxK5+glyL+#i{jP}g_#`ywXMgRS6#TAIl zn*Gf-Mgd9#1wZg6`vE*d{?8li{2u)E)&+Q z$#3wG8!eM1`{g0<#3v;M7v;^R2TFYuha-vo2J{g4MNj-C@x|Wm`o1H-?2kEa!s~Wo zICz(}3oIqWRQK`{D)=!^TcSH4S6?VCdP?*BK8}l`AlUnYnk{+x3agxJPie@h?j2pPY z-(pM@fg|{+dyZ-pq5sg`Kt}sB-4|*3Q*aA1sfe=`*f}{=PhT00I!^1_?KPQPAY!RMLDp$ z^A8sa49<#h22Q#qhy3mtmEok{bP?a!X*1_1^XbeWp!NBKkwyuBe6BO3YS(EK@)Du0 z=)?}BJb@V`u#}(-^JK2I=m>j;4ISVS4pl-&DvQm0--78MHT5xH&GLg~;4%PDrq&oY zO@9TaiGQrzfO@?08-v);rC3L&zzu9<1QcK6$|4xv?=xNFjC(v4FeCke8Tq$3^*=LG z$;{ct=ufT7f5WMh{^5Um%5G0bW)3QDjx9l-cqjn0c2w~W4*}bEs%Xd0`BScXfz!m-!6WR3gAPqF} zd0J+gj+&aOSiBbC3jfS6dVz>{2~%6!O<;euI{{E{Zsk6B_j8Rl+p$9qaIKXzfKVWK zJ`de(H#AQxt2ielZi}m>GK(Sg3(%DX#+rWHR^*b4o70(#M>zbv=Jd(bW`CspL%P9s zT=J_sE!#ROC>}=%Q0`$*J|ghpkvfgYd<1(%ZXpx3H}*D|wn$4{R>_iN6VHJGmAOK~ zk}5lvkX~TpNT|i%>EKBVCq}hV{mZMR`Xe;Ih?!@Iw(ey(iCq1eID2^8OC$M_P8xp2 z<7B6cHOh2D+z=>s6SMk029>WR9pxGz>TQ{z{{nyJsCKF4and8=`Zfve#eWsE>G+|j zH>ZNu!jL`{Wzwn^uoKyh@$c0Q(9t;X3yujr{5ksljkJ zvE~VkXipeB&7^yJ36#+tDKWjcI%hQy}^*8tLi`{olcaszUaYUwi!j z&%{&x^DO-v&qr#H9nIp1DK^TD5kU_L zZ1lmxh5%0d*v`PYu^6lx`${iezNVyf**&7-!#ps{G`+;J6Im@`ySVpw0?zz<5eNmp zE#p7!1_BeWC?`aInyam}5p&#Rc@Gej%)4*<6`zaSnf~PEN`}G74;RU5C4?5(8lw%MRKr9n*bwxM&=##lr8Po)UQv zhwaW?qc52t9G!PleHdRiCifNt$9T3Cve+{CXUZkN_yZ{tch9qW!vubC93Zdqf|G(> z6d}a6@?D=%>nfZ)B_F{aGZni*9jTf>+Mtw)u~sWk-zBM*sUgCjG~xDNLy_`jjj9zG z+>l^nIQc|6Yj2X$JBlA+Bju0bO;+zQCH-j4y?$b zjxtyfQ3k;P4S92DPz}amSG1{&U}afa^F|KQQ*(}5Aepoj9hn-6y4S-;rCP0mHA{w8 z^DY=1WTW^!U;Or;xeB}bI?{;uhc77KPyPIDA;e)Lr2YX&t+ zp&5M@sA0+KP1QNNtY9pEo-0u+VkWele|Eps`xL;YMxXYzXgOECr(lHB9DA8~|H#7N zluw0aIBC>hUNGh>0)MR%Xa&&CQPAXw$rnp?xLC$jML+uZcmW(ghmpZ_4DxY{~c z8T|(hWxhN`Qvet&Wni$#|L30x09jn0wvM*gP+?Dac!7tBzivi zu5iE+2)0@;YZ>iNT4`pHKXetY&*|hrvFb(M z!H6;5Qilyu?}GpvhF%yaH9*_nD@)IFq`$i*d~H?eElbMpx@MT|+oIM;+jL@b|8avvUA#(d)&cpvRlV)} z36sg=-^=5!Q&?AtkAw}aH{bR7Hk;XZ>5q@GFUt=hZa>~5r6;x}Wg-38I zQ7-4ngqi!irKzrdkJTq4&o|=~MI-5z7LA%3eKpnc8}ffYroYj`RrLYG;0}Dt{`;Ew zBYJ;?LCRMDubWd*|Kk6Qp`lbL3xUhSri$%W6w?<+!DAyE3g+9wN*Nh#NGA)wDdEpI zG1Q9xqK~?ny7>P1)k5QlUZ5q&uee*nrdu%2NWR8X~yJOhsO+cK(yA^|D&MKB1){2xjoCrm4goNdIbx&F8!uG#Nt^okx!EXjFF?QXYiR zC`I(6Fta3IC_g$}hZ#h>Kn9A3_cRN8|_>K5rUSEixj=YlZf52jC@+n1JRt%~dL`l^k$hn1eu z`x2_DkR?ioy{B>_60SBqOm$Mu|Ff69jsF{4yy_Gb+F(3m&5z%XPmj$6>tE}{$H0pG zTL9$GLjEHarz>_NPuzTRGgZzGj3lHd#?h|u{PV)E}3vxnvO zAmEmL`I)-48 z209sgW(Lu1pY5^Urs~N_SQfpa`n}4++~y*H(6ex6dGv4@eQp*q`{K*v*>U+q^*V?< z)PuGXMHQD`D17UN&Y7bM)mx*yfw&!_N3@9ULkb{yJ!zk7uJ-9g!x7h%jaC_dp{$$$ zLY*H>KKP|6&c-k}@8vQIGkncM7(V>27Rj4gaPm8!e5gU4kZWcg8Hm%nlYBvb8u^Y!#G8Q+#m{l=4DJ{}pKs$sr7X#{o5jMM z+wn@=F`6N$w^i4v<6R#KY*yArc0JQ^!+Ea@O@u&hiK5a8-nNz1wGGzX=8WkdYpIr5 zR>{nd#p#0KKI!93AL!``63yZpi|Kf*79#TuavIZ%u^pd$&&~|^K5qMQQt6sDoFx_I zv{bG@a@2bCVsh-4Lqg{Uf513KR;Bq|*QlSwC3R#BESF|j#pu@@bTjN==k>V>$n@b0 zYaM_4q&AUHr=$p;?+q%RM|!cB=XKh#2A%-7b4a4~1N!DERAs)N8Q=EvQ<6N^8djdo zPDZVT1uA~LKRxH5($&kRWpP7kM&Wz@jn6b?+c_l#Ec|ugocOnj(0^vlpVo1L|Kg>Q z{Q0*6P!7q~<{z#;ihnLx0$-x5me@2bHBTi`QOynt7tI2h2?PWrdJZ}c-MCN`;#-8y5q_O8}QpSy3bh1qkO?=-Tf5P@auolQ&iS-+jD2IkmLCNAm-PmVSq+=+z=Na^^T_IrS z;JJ1z_<8-CxJfnA$aMvU@DU%vP`P=8M)e%Z1)Z&iQ^C{0DL!Ts@`B*zQSjh-)6A9D zoQ-LMA?Vj~nFvkKbr#Y|1gTngQL!yjf^STwtHsTOHFn@J5)LtSow8&TgsUIdSRXv- zlwrsUiQ_HR`}ar1Y(_4e9Sm7(gd-b*=NvWjtt7s|rXbBCiHk~IY-L8543{qJx$&Uo zMhkP#*<-spNg0R?(U@Qq)3Np=Sg1!!TOA^g#EG0v2+rJu+V8e43pqNC{=7G>etJcR zHoC?1kmmf2pRhPL|FU^VfH0%K*{Iiw=EZs2-;#n;ISqIB;Eb3754v-r2nwOR<;I; z!Xfxn*@})4LMaF#@bj(h9lQe{ScFkRXkdT<2z6<%!DVK;9(oMM{s8VM`5>T(Ghajg zD2S|ID@eR22>g-fSzmuU&dtQd^{1(Xq8p|l>|ws#m6`}uFu|0xUF zfgwXM#w=qUWA=zzd@T+C2&a_m3f7!tlkl4In1RgVydoW$^C(qspeRU zt1FzUq35_mW74SpBt3HYdgVUEYtm39^_NOjWTy3@{ z+6`JRDgQ&$gsLd=4)X{vX=68-4mXrv>8+!1O+H8(JAK^Gxcj#4<6hPJ7#Xl%vT*<_}SQ;hPFLr zF&$h1i%B5a8yY3Wu-O%rYr@m?I9vfzi(A+g4Xk4sQ`9>5?d(%d$QM?ynle4Am+^G^@XDIv zZ#62uTbdq|MwhDY4f`k`@ny}pq$e59r~MiNVy}Y&#^YM67tTrI_^J$vH%A^pG{qnF zj-q8SMY%(6I{E{2CwgsSY>O2K2_Vyus%@a&Jn~RmtSF$QTFEP2E$nL(imaQvvvt^E zunrAfD)V96R2udOEnvFC`uzrsfD#cE9Ng(UdTQ@A_s3%(OzJ!r6E5a}eBxoBaqr#m zEM>?gw1wz=hY^p(Ex`90w7q5+7>%F;kI3O)=_Bg451G!oz_5xN>yF@Rb{-&QN#18x z;OCoF=;E*uqz?mJCi3A_roIUKrp+g24?qH^gNrlf6U)>B>HRyDUxGsw~11k?gL2d7yy&rURRlAA$ zm96hiB;rG>l6k3>YQUE}Mm51Cv?*=a-F@V@W71}%`t(2zq7#p%G22T1^44DyV% z;~(vJ-Dp!Faf1ib@f*%X9?ql!SugGB8y=np(~ko+0gCAFFQL2F${wZ3QM!g=aSyqR zps}{lvZ1;el*al)4SDS}H4QnEI0I_;n%Vn}q}_l*M4Q{a@FhD6WW@S58_>U084sj^X0*pNI}TW0C*IbFh^jCP)r#r*47%vG%7tJh8J?}wMZSy^A;eF zgYUlns2s^iw|Wt9N^EBy0PYR=wZ3Porkc`X9iWXP<`}m$3VSN&_v!!P9YC}pO6Sqb1F!E3_%>ED%n#HgkPkaDcw`qaj3Ad6N8vDIVyR{FvX@RWRXb``5{gpbVY zP=MstFT=$Hoy`wx*0i7kCR(E%7>gKB7-Wx0N%Lx7w+lmsjx%Rx-UZ!Ln70i*8or`z z9KLMAGGuUndzzQ1FhKHn3EqvPaoOBF0ozDia&?0z;J$M(!Olja`7YZE+n9^W`oo`^ z&a+e%TQQ#yR2fa3J@Sy<`T&7UDh5&xIfIn}ki-<7na+8D<1R`uVORV1Jz3Q*_$Lm$p9mn}skr#0 zyHPeWc=0_0ZtLvlea^xcX0q1VLMSdWhCPZ|ACM9=-*oOAvjuZn%>><^uKcOdhPYa? zwdu++YojmMtWK6{mi;xs_160?l#(t> zfbojI9}37I+iFyLN+WqaDg*fRO~Gj8nc4fcu}IXdoae&MKKp;9W)$=q^AH8)teW$V z=wrKz7-cC6HN%gSWvyQw6jW5dX<6xw9!dB_bK2KM7_^xm5lTEIPR4gFi=yKze2sk5 z4$a5Af+?P7z zEr{(@Hi=GI4T8AX$f4rT8ZhD8eUMjq0~z9SdH!Hz51AYf8C%!|0j4Y2lH&$`8== zHoGJTNNh246m&vgG!_0%cKR)v>RlmP{>VKgyRaM1B=0FriNaGg@BZ&er zE2)3i@+~(b1NPLy_YX0!UnByq`iOMD!JdOnriV<&%kiV7HOS9QXO?m`$RY@ssO?xU z!{y70afVRe@A!xI?_&vJ=LNyv^HDcXcJEPyf>0VqYMnkBaf6-Zj^z|?@BZw z-q|V^qLY!aOGS8b|H{ATR!TfhO{1Ko!&8?ucmlJT!1hq9sb^wlT|HdqC@vE$w42zC zSNIs!Zv=^-rkNCS`R8v8=;Jz={r_#@DeAlYmACP)!UMve|5kXw;9>k3yw;kk`{p{l zKz|=TUaB@GY6}Q7&=k+9b;rq0ra#ma>Fi1cdUe3~jRclecSKnO0}vblJJ}4!YU`Mc z`%Y^o$(jW|TTWwM$QYllkYy_pXiaUw0H1WP0 z^HWocqh$k)08-lqYi03HYJRrg`)1Sl^Ap=O^1R~{)<}kKB!WjsQo03|4a|J)i^ZdM z9Mo`MYh+CXFacS4Yt8yUDsQz$R3<|=!(erP%Kn#(;xvL^Ibq;OL6@v7GbyIb7fZ$9 zmo}c20B-MMft;~e#Gi@a6eac)B4y>hqL6ZvlO=k{qh8Y#gZ!rCk#Ds*?-r*_3w9+Ag5K|8nEz||NAuZ$D#Q@S9}zryb=%%Jf`cMJimm|71q0)LTy@P4+!=>)Zd40-tIFRdfG?8AdsJv%%sbC! zJ;Y9Qr{#6+f#2UUVe@>|i$~Hf&58@@K)roF(*3ZjvC|~HiKs)N_r+br%vnMc<*L+_ z*l=@#;9PKDa{Jz}Dv(uh`r=wY-ba-D?$s64`hJ^wyK~mE)G)W}8gud4kyjmlx^e%2Z~F zG@GXBbY$Y^?xyDoi^;V*s(0JkH|ZmYE106YuQK|pnrayHe{OFd|A2H$yJoD2?&d0} z5cBSGoSkEaMo6ulyY=3Bq`Q3R08;rbN9ZqKk6Ax^w;&0Cm0;I`n;J18_K{>K6x7$b z`x1Lxzvp<;L%@gO7o`eyf?A7%?t?NYhgO$j>mA@&8859-8ZRFXnhu_;8-ZjXe}*3` zMi8JrR9>DHkk@hM38d4KvzH$veeXQVIL9Qy&nE@*6hSj5F5xLH&GyP$?)#*YTu19?rO_o1OLSIA+1%N}@bFX&h8w!efI? z)G4@PR|*-b=jwjvC-@eVLGJ^9bJ@Au<9@#L$}z3u<-rC9(~L(PL}u|d!LgZjyf0G& z(Z@#K*w{snidEd1wf!wUT=@&~WmEaQ=NeF|*a++x-WT@gO^fW}-)O1Ca}AvVBhHl3 z6NXLM*_bm&nXcrYAaGyt!^x&jj=l#L9o2>DuTczt=gbQni_R9y+9M)gvsgh^(=}}4 zWt}eBHIym7U+N=dn};Ml9u`a)y)W6X>?wvc4}9>+guxy|hc!1GPDE*}+N{;=o2h~H zWU&%%4#so3jSZIFPQYp+EGMMPkR{C1M@IrV5AdK%X(pa~awm?b)=(LkSUh6!!phON zD__J7Gi!;QiqBoGNc71--WOZdmTj$|(wV;E=n(tK+!2_<;)SP+pr%>|=Xb%VqwZ7J z=3E#{JBh`yHb%eMRcAg$vd#Eby1$x=A$N(z&-? zR+erMx=UAZD`&mbAe#7Cifsy%bbbTG$x40`@Kr+dHI9-qthB1mO@(J+oR>RC#Eo8a z35jb3z6^;4qVeL%_Rxwsb8~ZJw_V2G{PLg=A`mOWB4n3PqwZO z&c3<(-p6N%Fk(ELjxaeInYG%}>}!^*T3r5j1!jHFLuw(Oxkggah14&r_LViZ2e&9s z5_ISEt%YAvPA0=oVhs-gtr-;kr5+f~`Q1jlCrBbJi^^j{>12$?!%FaJ-@t;pWyPhX zxx1(g>zR`)!b(b5vn`O(&39+LukI4B0PG_79P4dgHFkH%FhAq>;p+yvv{6B&UMPo|`)(=vP4cWOc`{E zFjrx8+Wuh{V@l{GU;sT9gL@owJdWQ0PLc0&HyZ+n`ubvWfSqX|jqXQ!ikm3kV7qdM z=-@}q-s6{u5!I@;_Z=xp;vsLn9BGLORsB^Zwt8QB%r3Fj$ggN|4s(MflsS`f2)$50 zHBWQe!&)P=O>dUb7@_I%Ab`=;a*UbDZqIvX=Kd@K@s{&2GH9Dj{v z_`;d+3dtS~&K)5v@lq@*1V4j&7*15{E+iEnN^(60&?M}GtJT83UQDJm54h}x;*yHo z9OOqO-z2i9)@m_6^v21#OEgJJY#LP5*#5v((ge1@7JlIsZHW6Jh_}Shb@(T}+evi| zbT{4H7TQ!0E$J&9M~Uzn6=C*W;14!B2|~PT6azh@C0sM4agrJCY%13TlI`Y!XRc@; z*>T_8_@82xzC>MYVc+SM4s^>}+0-9?UVt0>rg6r2;^98byO&C2g{TAxn0G~>eci?L zkN!w)?CzkREI>WNcsf!yd-;|iVpu8N!+Wx;S$McbL;ThYvA$Pg3JsYiZYl(-&<82_ zde#p(!Ed0e- zKYkby(eGMUxjgo+I!zeQWWjFs9HKsQ8Y?!$j<8yxoEr;&lD{z-#$=;m(D82s_aS3^ z1J{+IjiWYYlw%$7-St}J=ZYp@w%sRPODp7>4%1O7-w5FV|l~GE*zub{O8E>p6-B@nxAt?j@hZC9)R0bGb z!_Q4H!WJuN2A1qr~v_hnTScb!|Aw9x^xw^o_&}GxR9_CI`}; z^Omc>^3>**>pkiEM{NF2iq_{BZ4=|^*zA|sy;ZfH=kw`vT72KJmbzIZijE-4)D8^9 z1>B75jgm+yDoFd?%%?*cJC&K);3WI@E5=xeA)A(Vzn3VSyosf#V%rWse?EDdj9AoJ zfF5;OC_ofGwz85OE*{5y?wNFJ(w$P9==pxydUr6&P%mHKNy}xYUQ!MUpE*!)Bv7!+5NXe6|(pr7%?n8^6230kDDI6m7#0p|HvY+i50t|7b zoIZ}Qr|zrB1w~R+>4P9uA-9VU=PU-_VSXZq@+K0g{@ggIm3c!hjCW)@LoCvm%KZ$! zgFKwMHJ8LIEYCa9$7~bkZb1R`PUZ{s`OL`0<`X%*1AYLbV1;WQ#{`S&h$0*1RTy=p z`UcU8q$n^X7lVK*lmLE$Dg+NZOD^Us6#JeZ0+k;qM?N56-Ik5o8l_W#WK%FzF0_hK zLnVPNxQJNT&#NsSFCXna-%s-0IQTx9R8zPP>zi6W=nTkTblE>St>RHIB=Ld9XeX^JZM@HEs#PvYIB8jG?-T&9k<;iUq80& zC;7=V?UndScK@5tyqDvdX&lX4nT{rRDZU$SkUiwre&Iuc2<+H>-t5>ypj}vf$UoA< zt0AwV5G<}qWPK7cZ0&EYZL)U{%~7YoKFWodUT20M2`)#YD|M9aauHS<`B7hQyz3fz zeQ0&33`BKf6w0KBoc^*4Nmx0=q2j~y8Sg?DI#+cN-u*|xJDr1{AZ+NZj|{fHQH>pV zeX>_`@91hP$GC5qn$%f&Rj*-DyHVsG4#(#U;}EAIXvc={itelyhs#@tawD_TSo>n=biYdagqG zHux^Peu}~-GIF}q=dvT9ThgJ@-u|6Jer#T%Lj-q}F;=}cT<7K4p; zFHg&(Z#c3pio~(mJWZy#C#>oEx_qb9XAd{if_LD^n*45_@RK29hH1*KR0i1O>KZIT zwMvphJYP(^&%g{ali*WjAtj5_iv+}4&|A+~c*w(bY6TxL^A}S{82M96%aRtj>G@LZ zw%)=W6cBPLQ+g)Sqtvog^x_OO=}j_-Q}J0od5m(Q_OurLk<=T5TASHntU%9EZfP1~ zYhelK`zj=8=(Tjlgx1K5R4`S)iK3_QB@q~)y4%TB(RcOe6@?j)HAzz!`YLo`CP=bq z`Vdl8#|#4k1TE)4CkQnz8|QawK%68JzKyHKS1P4 z5yt=}JK7JQ!}s9#}q1R4XbPy4z7Ff5)8=Gt_fyi5H)Wf zp5K&WOkt%d8D3pD7{Bd0vX26xFfbuLi^3xWn;3yI<*L?RvI8(-L0qecZ-EnfT5}m6 zCkHow{OYrz*KH%Ggo3$;fysjb$9Bz%`l0K&sfDd3cx%rZ?s7Xh*!3EZ>jo0ecOWwS zf#n6-xA=@cXy-kgxRj+>fD`9%QqN9s4&T(!gsNYAGTmp8jEW9Oqb_-M)d?$Kk3|mU zWEq|4o9L(bJ8~YXVXY}@65XOiMdM-oRHS7UaemZlSZ|lb8Zz*vb$(;0 zpEB&kE!wl2e3IQZ^Aq#n!tm{Q1_i@8_qWbI_t&>6rSJEL?QuRZEYsx25AwK+dgK=+ z*K|*vN&(J7ymCUKp%+y7YzUq0p*Ex*vWOd@AD0ZULRxXgvZ)xqJdAwz7J5jTQ7Sn| zt%Cl>0@g}48~rLIY?l27!bbSDD({dg3Ve5dQ32knz!nOAhHmo}{)ZXfGGZr$uF^RF zN_@y0&Nth97n({P!EF_%a~%H}XGbXE=J7nb)yi@H2-fE#xi<)VDg_r5LWMa9VJiW- z2E(*agQ#Pnh-LpM1L{>_0E0b!Q^d2~=X=+74SR%~gvEPQ|;@n}x z=Zm3_QK}P{t8Cqt_~%%8*A}5MP{$gm1p=jRYCrMw!O;h%63Y8AZV4jfr^;Vv*bqC2 z*v9urUBo?ETmww2d)$N%;y5o7F!8?hx)W9njO?$0z3C6u4y1t}W`x-j~-K0OvKnqry{SM+}-JddJC$wyh(~ zCtxH`jl;+zTIPt95vKFGyI>z6onF8e=Nil*0qSDJ6sCgll3W_%)snCseaJu387_xk z!re`^@Km_^@hF)cwA(GS?tw;Q5Lvjz>R#!oEcp`!^%6JC7b*pzImuxber80-)_0cb zV;2Xbx(_s}KNr88$)zV6)6M~gIKa%G7%j|qj{CfhS#QCn7m4cVV$=}JP=~2+v#ki) z39<#U+_2zwF|ClM@-?|b2(P*E5b38!x+y-b9crAo9}+`ZkH^DPW$ha>m*;Wj@CA$T zl)s3^6~$?)^MD@^Q`PyXtAmlkp{A#U*NKGA2s4qSZia1AcFIO*ReccUqU){JI&p)C zJKA~BK5;{b69g!bd!yGz*yrgV6E!iSFjsa5dSV32Ko52vQ4~Q1$%KK)mpfpFSK~yc z9INRDQ%xchRLkl6pi1w8_}yR?^`9a|hFVT}G4Mq0vGXso$|q(Owql*MKnTNmh5Fo7 zgy;mblM-JscL{mpp8sU@)*VqOwn{)$7Bm9QTZlZLzdSbo`P;^8*LIB89T02{1Hx&) zDNu^)TN_K;8vU~`SJrk#Hb(Ga%`i$hzo(vVfX=fJP6v}L^ap`1GRHcWShbjiFjQU- zWTDwOyC=cs{y%(uWmKG5)^%`6;qLD4PH=bk;OkpuxWC>6z*2 z%sbzYXR%;Wwd$U_ci*#*?DOMUy7PMYqYP36E~k#?zVDU1d+?++hK!A4%sJQPStoEl zA`3ys)9ZpA1JFmu4<{1fK$CM?l# z1FBHgetQ(0b;FY~KmV>@Lr{dDLcY$pUHL+RUwOiYt?9|ehVH=V`n=Y!c5n5m1Zk5F z9o5RG1V4M9X07$*Rr*BFEq_y27mxs{DVk=UlM27BT-|N7 zZDmbsYg4-dgQ?;K;L#+Cc1&$g^CN?Mr)e781m8DIfA}?i+D7-Zfq%f{ihzX}O zXbF_D;(|(Yf3_zi+O~YVR#`dE!hl%hC~C8o-onG`7h$K{4p77Wnte>VE=y;?SavJz z+6?YM3pC+s>eeRa4k60k*aQ9%pcsq&L1*B0S;^9L(J_-l%b{tQ9&WnQt(!q{=A^|@ zIFwTT%(f$clabTO%}cHiy#*o*^FzKqzAD7!ZcBi&1SMy*CQR;67ukLc zSl27EObk>RBQe3KSWZ(?ui`DMb;T?CNy^6$7^q%gvc1cSKbnT&=32s5M~y3LOD2AK zcWooSO24wuq-m8V;x$o=D^k&On=h_Uj~X$2;HfMJVSv0l{q|j$C7%hHDd(MZCVW~6 z*%)KB>99D#`eMC;4l_qeGBDHqE#++^WAW=@fPB}5U*=Q?IjTdgv?K$9#IGK6+Ru5l z@=4vcefyXQFoak?jkCyzd9@Q9@EO26MW^^X`H&7Fwk3i*VvIdvo468QC>{uTLoUe% zLyHu(b>v&36W)0fa^6MzceJ^7o-^_hXAx`18&l zBFiJn-{o_7NKW?H6}tM$z9kuoDOy@9_RCh z&>YNf34&ld6Z|s$^Q#1Nl=S1bz>bq-o*7|EAHOT*Z~OqtUzP+nK^%U&--x`TzUz^^ z6GEDr7lw6C^R%7TN|uw!}2RV)`?icf3~xEG@z88kE?Y=4ON z4uZGeQTrt-*O|h3M`Ah`J_JYHb%jY0{?M;16W;b3DF1kT`RVIgf%F?K+IJilv5us? zcUIY20dLiM5rV)|M#+|VU*&apa);nma-}|Ai%pt0G*pOf2G|=9uuJ=)G&>gf&~n9vCVKEF-g`0GXgP^bN8H-gPD@ zsJyKfNXD zBl*8a#OsD(1nlZ$W}w$t1QoNXuQOJ{b)~dhU)-&Z3a|vceG&FL9CGeB)Wp#=c}nPF zKBIwB~C9zItaRgt}nAY-s` z2F}b=aL0>d95Xt@x=VgsBApp1j6-iT|R%A@*j;I;{WhR|H zd#KTe)@^hLkYvys4ccj&(cVb(6u36y!HD4R=!=+^a+jirPlfEh7nFR?zpmYJMJBsv zw|lSmSf{1%VX&Br;9D?n9$p#a1aJL_bnVWVj590=F%Pu-QL`V*7;fn=Lyf6glcomv zYQO?}aLhcB9!8RA`fh~*Lpc%64D4V(`8RQg9A88v@;!=fhlz3>i64pxDkKR*ZIGhp zd;8Ho#za?^txy^ci{ZiHEZJupj0Uw4r3$weeyRVo3J~GEYEoMrhTC;TfeUe|Sa?;d zT9=%S?X#<|HX)8 z>XNksF?5{9qAA2L;j9~e9hZGEpU^jn?}ojO-M$&O*T${L>Bs2bgKL31!Fb7TL(onu znJNk#x`C7Crmn^C^R8v8D20x*k8n+!u0}dP+G#t z^A94Ok-jw&-ipPr{E*mZ;rKW}Xkts+6^C}NlQ^1rW_5$X`2*!FdpwCkO|WSD;wEiq zTWe70TBYJR{Bv74y1|XX)n~TnlF(r1>Hx65Uu`&YRpG!E0uj<6IeHVMSnn1W`F?4b zz)xq8{t80;#jyENuz8KJB=5bnu5fVK?2d~<8+AExly0^=9pal=A9==Jj<9ghlOCPd6aRnQLdeU=}x zLG5Jw#9_{K9Lf9Am3lqdx)FyE=#W;KI_R?PFWn>^Im0!K_Qo zqNQ02<7jN!1=*8L@ygPb6{AD#EyvA~>xOOd?BhbTr`9$OJZjTnvdwTT?7Ggk)n5lp zvid&rkbKXV=$gndNV&PbE%~Jp&Be|zl%mRKm$X~1;%pSr*Ge~8j1bL^>PO`=bPVGO z*&@7&>ix+KdfXgM`8(1lgFAYj_KEMS)UBLD3DYhEYBshS|j$n&<>$LC`<8U|_@GMG==A5ZVUPke4?^p#s+L37bI zYg-Qrtx2v>pt=!KY_yiL>XK4>#7g{;@O;SJlCh?xK+~{;YR%}3!RjgIS;kHFT%+h9 z)ei(a0eE<{p_VxBU+_L0cv%7HLWUoM1qylTl zY|Oby?|3>*0Ss$^$!V1q<8{%6_mTvZEUdC^n9*IO;lcTPxe6fB(zTqJ6^80-;vBWA zFZEoE3C?~Tj!c+#K65K=4Tez3{kQFs6oh294)eY0dSNy?t_GIazi{#N|a+6Q= zdRsBWhWV+{)K=ZAw6pGfg7DA8^J2FR5Jw6Z5feVEGNST!rG56MnQLE(*;LY!`c;eT z_FyRPM%Gzx8%j_T%mVACQ10tD?u{xHNWT;`ohpXaU2aYu!!eHYE-fUyJP`>6L#yYg zuwL8Z4(R2L73Ah13%atckUxu9rYC%fh_<7vPbhM-=Otb}#PBErUkyn@v#x(37cW`)e@ zYy7d&fN&`f2W=64WvW^kLTI{#lyV5N-dkx*WEvQTn3E=IaWE7&k5^-`k+j~*sI;qQ zu|WM|_-Ww52J9Ro!L^`bYxb9pR<87^lZ7{%7E|OlTfzixo2;*y9QX94Ji0 z<{kRV2WX4@>3QUefpMSb-V@NeFY(m~0q1<5IeUFw}c@_rBZres`l&1mnb&9D%KM78D);BXnQnBq4xlLSegfqH- z`5lmb`g~;B8Go42U0Sg_`)qaVP|hdU_;9pXQOzV-_$@V*O~2l65LQ)Qmo^qBqSUnm zzmq{du}x-Ib@mb|0?$V$-}TJKrtmE-kbUL%p0meHYq&R{M^XVKka&Oh3dJ1_oSc;H zO^hr|oc?)#sOY+3tD4&6esR}ELFP6ewdFukIR@e~>HkE*-Uxn#L>grLZ z)DOK%bG5~FG6FkK=hnxr`D2J1Si^VS1#S!Q!n8SQtCqs`^L$G6vuw20#kN*>(PL(C15K#XEO7nM zUoBr!2gryA*8`2lHF!CyM14#0d9up6>*F(PJ^~6=r7g}9TjU;o)?`2wu8jebH7YVT zT!nS#+)s*lyut^*agOu^aACCy0y9Sb2@XhZ#+`xkCgX(UyR@dF^N-hN#ID9(F%0hR zf?}9+%*0;dhFXKE%&ynTQLXlR!zQ$23JPYJrnTC`~3miaI2nI2O>$I5OTslsK*i8C31+Tycgjwlep&yyG!6l4|R_k zA#e1AwK=`R8myEG+TB2RA71e{U2i;~G>uL2hkNkIU52a0C*T3W7mS-mL)0d!L6bXF5(U;L+-fc>I32*7Y()82H<)*Lv;&ET9)&rv{&1UMX^0^b>moCO~&t@2CoJ$-k0T z&CXFFPvBYVQLKp_m^ksI70p?U$*pm_>*Wy(>7Owm59~rG^tr6jzyCJ)8i*DDrjv+& z2M%)+Yy1Dwnjl4R(3b&nlPW{FHcrA{7`Ixh(IflqCiAUlM#@ZOoPlSfbKA6?Z~OV zet@8I2pI{5;9^xc%z})xxuk|GdB#|5?5S;2keJbsS!+-R{>J=<9*ot%N30e&>8p{d zrnoxJ{LCGFA7ZjIA~q95WGRgdOF(7I(BmtKx6Z(AW)* z?P6agxLsHC`Dseq=%F1YICr3{46Z&C+`rIR9_f|n$L1eQon&I$cUIx zVWB#@lKqI5h-#X#(}YI?HIgZ<;cMjy(^r(-%2uy__)F`c+=!;MTA#)m0`I739+lI+ zyrC?rGa%7jsE;ZurOwONzg>`miZhS`jTb__Z!X77p^wE~t z%n5ggjJQIcGo$)YXM?#z3(HHhkA_qH7w1kHR^M`^mynHo`GFq)9vj5rb$bBERY_DU zYG?FE^c^C1EOr%yeQ4o!i_q1`G3W!qKvk zPST=_vLnocfEzTOehaKbSboD_{9>0fo54Y3`5rAMD?i4bp6T`It-v$B3>glE5p{j zP0khkx+>{F%pfD{JQb=Az${{sb_>?xp-bzm#F+`YXfsy)ghJGS`x&f+3&3Kay%*XZYls%Qx{_;$H1$ zz+9mpq0MXoeGzJ%xmo196KjLKu4?2bU4d6r^v`11q0_hADGEWwP&_??Wqu|k+4&)$ z*y83Zdvq(~V4NADspBbA?Al0{Fv7qmoYCuiU~#(18!GH6qRG`}mPJJ9#OX3-!jjEJKen5nkwolj#O^Lb!x==O zY{M)1gdFip2jx;!FeoKS{tCRsx)@ep4k2)0@agk@gj>7jaoqwcPGGbb6S_(f-6oJx zMl7MDVSm*Pb|Mw4A{sV|*4ebAf;Xj0bK$#G|MY|y&Ui=cp8{O?ukh|)( zg@jo9%mc3VQcBP>bZ5^q9+&^AB0NaE=v)Yu;$yL8Y9su$Aqb=rr7U?M_k*aaXoIxy3^q zQM;eH$etC6jO^W*RI>O>3Egg99_a#DtG>~qQ-ElK>gVGu{(^74al(!f9?Xayeuf~T z6{%$z!s$1#6&BtE&8&+Kaa{yTKLl95YdiBu*^T@*YvAYkEprag=w-k=@wZ}>e;fWk zZ$M>jc@#y&H@QpQ6grh&X;u1&Tk^;iv#Ha2j)5(?3z+3J^UBn?aEAKdQq=|)$g<6qEQM~5FR(%MC zd&aO9_7o;Ez1_!ciP&8PjJwp_&Tu4ylD9XC@Pl4QW?I=(9` z|9mOYyv)v8_FqAk8}X7n=sjIV50}(juZF46qlI76)a#ho2>FWgD?{bLF69SH6jeG8 zl4ZNQhfq1|25MioR-Z~et0fFK+B~EuW}$s+PegO2Io41H_sxqNU97?OJ2)T%Thu1N zz+#ZJ&@3~I-crJcUJ6c((Yle=F*7JLr&WSnc)1ikw($;4UtuAvPjtVXH*tR&ms&nU@C>kUB;+f ze+Ah;C*(1NyyE8ZdJtAi3}z&TV-KI#RECr zimb{!N*8^H9C|leE~(rp8{arF{iCpe24?0>8{PNL?R4QM1fOo=sCzAG94f`72J)a> zshS|UCnkF1SwvG`)?j5s?nk*Ly7j~S!*$`!@=JPqtY6?l?{I%dQ8iPK%mCnF76cw< zzW>7+{sTq-ahU&O#sBzS4w$6<>u-OeY_{^BD%L=?Pi$oDS$SBxB%i&+jFj05DODIz zAraX9xC)7N;B-@4Wu6AS!Os@8I!@b4r0`)Z?=XYfBLz*8#bJSFu4bF#nH(K&PtR*^ zAGDVx31jZS$?NdN+5IscXZP4p_aqeul;Lo&o&A@)O|;+q1xQmrp)1f#LMiJvn64Zc zTvi#hi;EQwNR%9~Mo-pnYdI1?s`l7;fGUg2Em`7Yo0$%AonqH)^VA45Sgw_5A7kd2 zAvdWzt*87r%Ffa1{=v?p`^qL8=aJmZU7(~XU&4L!eI_!qU2{8>1Je?T=W;_^Bsg_IZXcc!Puj~?g^+}z;6 zktDz60RPu<{&OQ2C)voaDxi+MW5fy3CFajjwI9!46E@EAF{&9gAf~1>K7b1Ee4k}g zpsS`z^{(hjWAQg8|E_l_Ovls8E+hc6vUEbKL>+9i&{D+R|ow#_6i4*_? z1ePLiBGNz$xGMQiCm0^XZkp}jGz`+tq${a@E6Dw62bo&y)AN=U(=gmAmy@fhL$k%|;R%$bS7^8UF1nvs5IIHv0V%jr=@aGNw1v|K zlMEzX=5wqJvB?9Apec2V5x$F-%N)<*DZA$Egre9dV9-Agm9X863w^Vc&&&zf1USUz z+)?700*x{laaAI^kOJ6@2Na)eINOXXUBvAy%NiDslu7Ku$dYSwE%Y2!RP(^yDZkFM zwy|3xjW6dIK&^$TSBDh-jFI@cMgI=pYTf)fq>E|vOqttp;oLps=?C(VySp@AD}-vF zcMV=RY=$d~VR{Qf+`j&0Zgr`F^^+c(nVv*~E_ zG#yeA!ghOauVl}Zx#^G?#=01-L8OBbo$|gst(p+Fuuo9JphUFc6?3sBlBhYqD0kfb zJhXK4R+#U0!o8rL#rW`YYmpXFsW3+EM6j^c=oPY>Y7wQ9zZhhXJs@`H37QME2ccOe zTY=y|Q876T`~MUVI)*T%%&(>=hWOQ<_KQ16^O~u0Y4!t&n3elZ?Ua7DSpFW5kRAAu zp`YAds}GS@UhPK<%q+}r3`l-P%bhFhHL)KKY7u!1_y!sJY6x?08NI`&hhz6{>Tufh_zdN|OAyjtt!gYR&OnyApUBcukxE!t^K3#wVRI%HV9MsfQoo?aY(>Oz)--T851#ev=l2;<~$+0v=%x`2VWr z|HmhaJ~Pn10oFPZFLK(a2k>YV7Xn_3h@`$;2JX^|GT9Vz@Guz{K{;b-naDHeYmeMD zjas=WJBZ1`vNb{5weneK<$}p(wD9+Vn}{V^nDugADxk{clzWsg6q!zFKQMRhOYSe< zd5#?z^4(wWykjUid{D(27%e`^!t>W3n5CLgdRfbUx+Qn!v7P3#wV<4rC8Z#D_Dqu* z<+4?%DO$sppYe}Mf?)rl`B`6deFkM${5C0*4rGkcvu)t+YdiD|z%qHBIpq1{7&oIK zXJ~^;J2Qj!1*A>ASe}*&YZLO-w|R7pR)9DtSvrxSPkiyK=A0qH{FO?l2%YTEchqx4 zyN5&V38}9sF2l{#_P6x<3}B_^A`xV=&%2}6+y=PJD-H`UtF{M5*agcI12ovKhLs^u z9&NdykodsXW?_X;7*|mDqX%r=V6TTjB$X&X(?AcCgSr5v{D9(QaW( zaF;uLaF@GahHj&NY)wYBAx2?yqO74|MsNf>2?92KNCU1iheB1GvkY|uu~+p1x_u8i zl2IpeJ^Y4B^709@6pt!-O<%ui4v^AUKFSOnrWxjaHh)YguC-71Y6)T0+1_93toqy? zsPvv)*=IW<(a7K*5xgFE2swE(ovq}LY^gGZiY_=4uw5{(OvO!%NLNy4d=IOFaf*Gb zli~5m1{cj2Ij|!|Y~9s>NtLDi^5vVTi*SBVcRo|Y=&A*Y$uZ2>1XwWQvEHo1uJs~N z;$cncS#<7)71n(i3w4*<&%$K9v9{YqR%bU1zFnt;Ms-F4Q@z6WEjdoJFjR8EW8Rj_ zA}{brFI#Pa4xFEkO*Glwd{AMiCl*~d6L$bt7X)0?X>$tx=NCh;SCNW>&xXYcZ3>b~ zZEE{6$*}(93DSuEv3rymk})%Kkb3Us@IjfxGkL_eLOQ9YEi*?HWcqXyr&k{&d7LV4 zo$R0p$xh&nW5_I#lz0d?Ql-j+acP!C8xAa+5kCwC-^778tU=u1P3UC^Z)Z}%aL5+2 z;--fn$H)z!z<(*(hJ#ARDswtI$)D8_zdun7xzh+oRICFLv@Tj84{zf$V~OQV62~1Q zf!{|8)fuE^^2h-_%lBB;mMow@GQ2EJr}MySwIlMCHKrh*ncr)=G4GtsrM%in)-z=| zHApC{p82LXtjpjc+f!f-i@&c0?CSL~%MUNszDnKF`r#4XS%n$j6n(T31M8?IDL4gE z{vE7*fMi+R_WrvU71b{8aWBY{gQtOe&MES$j(hc9sZID5yi@}Od_Ier^cmT+7g^#b zBKsTiCX%4_XPgR>?Gmi2w7#)E2@@{)rpu0CSpOeKbXCY{{aDD<5I%ycmB=a*U0+}~ zw#g?W7Lxaq*;q8@PKazROY69f(go`bms&M&V7^GvxK8TpPTqU->IQ%6$M!H&fA2z0 z7uC4yIDtNgRzecG%^UMLMa$A1%@CI}Fxv21p z=U7iB)|083KAl716Hp725@LTiv4gsHyk-t!NhNbc@pMPw@y?m+jyTi|$47aJ2>=RdEYXjN@> z9AKFSe4=qbMDL$N z7zCEnDJKn;Q*Us8f?IMB78Mzi zg(EU{fAXXI*-2}zF{p%-;y@E77%j)Yx0_5DqJb?4XdH)R>UU%dQ%teKw%sLhow~kZ z0$W$S4)=RkBX4e^wRg?ep&I0{~PyPCKt3b3Ro(KzKG zGd85BdkE*rep%O;Fjl4k<#)4NLPoRzVawLel{HZY&HlJ{z{jHJbZ+Q1vu>g>K+jpC zT^V;d?_hPKK$js$l=H)>dXVa?E(zvczm}zeOH2c&+u=Mi=)<_-L~f>RWabcCqajNS)Pd7@!cYr} zK$6+4tMvnR{S2ubIg0M?h3$$;*tcnRV)^-ieN&U~$r4E!H4|DLXf$^1izU6iQWFm6 z3C*VJHn6#lSq)b0t}8@QZy}fr7mRE{X+L-d0iv^|7??5#k$S_ZnT|7OB#i_?%8wZiu3{i=I{9P9x0wlcL9TxxY5=L(Fx|+GhUpgZ+ zoVB~EItm6i*C7#|F|r!gKGGwE{oEn$SO+FSsft0W>kEp#DKV6W+&_kr;BnSK@kUPb z#FH3O@T6{Kit2~=qitxWY}$b`Vlp#TYA6%KN1W6fr*`ZR>jyErm%@3enqQ7*5J5)t z&>TcMVWULl4whNZx4piiG9-NuECAo;-Xj`b#hP=ovE$U%%i(f^ZJ*{azS_xMo4<6FHXQ7||8>xi;e>+D?7G z_lN3nO3h(O9{B`cExa8htsFrQiHu&H*+d)aC!lWNPv6YCN0rm-A^0s{$W7t!%_D+R z)lawmnQfHktQJkoLXfZv;7udL1F=Y9aNa*Z&gaGmaDM|xar-e{6|rc1S~&uRK=^LF zRzCQB&rM^M2Q{K3(K#eGaXA0AJ~#jEQ3)uMw*G>@?umR8ahOQB5kRfaIKFSD%s`&7dM!k;kbiroxaPGeOUGc_%D#3Yf5Dm@r5_VJLb8)_{&|Ss=r^R zYPHUP0R<_)lRA&8kg8^Q8UsfVI!9VFYh)iJFSW@rmY%`!0Ez8H@6}EE0GG z#hFNpzF9!K<|2|7a4ANkvvtb-}syDLIZ8}$Z6o6Q+Jbd)YBZo2hi)OeHdoW|S0c zqB-DNb^pI>28xZCIR3WgV1*7#AwfjG!r@aAa`bXAepnlwI$1NMPDEgp87$W?KAYFY6)4bX;T4@# zS|syV;LwXm+4cS>vAQ z!kpL{m842xk+4XQ1yBHH8X5s9NYks;`zA3-D`8?BH?ofq2AY@H7VuL#GC_HR*~xEg zC@T_qPKx>GES~}FT?6uWWFV)m!w$&Lh!^}&r1yz}i9vVs6BP{`){!FDnQch@zfK4i zCP@`-6o3{`1po+SMEm2(I5FA>SkOb-GENNiepDI#)(b_Nj`{eTvob1_fHDlU6CcoC zzo}^cb$mqZTnw#Egw27&$^WOx_<<1w-~n=l)C0y5Zs(D6=bI9?#*=^;@IQ?vkNG_# z-XE%rjFN>9tRfWU+ugS*Nl7|GV+DbQ+@!?Ztm?~z&lyRHCt2}YI-v6tXjz}NlCn-x z(!u6w!bzc8g&1h+Y2)JsQ7VP&EcA^LKUmC6Nsdb|J;;wq$N}u!}*8L6Q@i zLPEl@d?W$;2u1@27H1kb3ydNNVC6mhfhZWioi0of;;dSrNr-?Z`Ar1+FO!Jc8krl| z{vVqtIJWDLGUOmLqj3wBx~7I{atq$NW;JMNbdcxo4udc5{_Zf3mgxL`2xNK@&LEK{ zsVjCN8&eN=kaZ&geP(G)<1lCWGRE`Sb#Rla**8U05#v`ftx}m4J~y^FI7E@c?#*7S zKQjqm%m^PH7Uq?*8{7Y$r?FR*Cte}XA+FgS23v#5iMh5cWi zY;eLq=G%mnLf?=@ctKP95Ltd*9;~Dgg(fA%m*{k-Hc^Hxj@$?i>N)5m*otMIq^D5| zo)$LC@i1%YuzUD<`U>{pVv8JBU9oME&;;ejj`93WM#<7#UX}XVd~5WDF{g9ew!89< z!^sq2W`4Vbt#gD39k+d+V?yOKYuIjS#vmS24A=9-5W1yz|KlSX)xR62R9B#bzCob2$c-|1V3##6+>OUh`4ej^Ci$kf z^97hD1*F16J3Wqy|+M$^7_D`<)bFt05CI5Io9wMM$fizI@JE;0=SPUs+=SMCwO@s4tB&EiaF7Jr))M8O>o^d zwho0Sbv}enDIv=-EWuHM^*S;UB{G_peEY9QE~T3?Z)?on=)1p0I4fE?Y>4?(?t}TZ zZ`_K;)k@|ac6BW^`lAvmu0wYFnYRlT4zqVRm~~5o*0L?$*inWvU2T+8Pe-gr#R7EC zeI(T3fI^R1d{62N6u0#V&`@-$-@yPqT$WhPyo2#F$T9mD+j}4Xev=%ctMuUl&%qS1 zc$D&g-6a1sn-Z{&^j{(&*(#@UD1xYOkgN1`Hu;o<4~~k`+GRTsbzv#mRpml{aaT@j zawkF^(kVmQn`!xVW zf#QZ9xI*C4usK0nBXfisd?<@f26P{fB9?2Y-SY`6^`nXOS*sdDh7cJrP05t4vvMre zfKv~?+F~7ulG|Oc`WL6jH3EoaYtuTbX3)55EZR-0S*l1^Jz9SBDAU6A`o@yZ7tfDy~X;lJ=)Yf%ru{O$N7hcy z5_QJmEM0j`Qe6|T#HGtYyD$sLp2w!nDm%0+sW?d@5mNHK^KE z#jK4-p}+wo`XZ1hWE$M&f7Z}87z|%4GxQOzVNGbX8PUuWvpYWYZ@W#c2$^J({agx-S#VT9 za4fRfN}rG1<$2`w!Ogr&x})_fUptFj`S^l-*(@Blh)u)}Q7nH0QPTk@)LTC>Dps&o+l$+x0f(5_4s&pXG7<7)d~RpWP&vtx&M-$h zkqGG`#F;eVB>N_ALWF#q@x@V&3-iRzlBUdh>A;4i*{C#W94GT&vZAA#B*UD+Ca2E{ zRAKqQ0=Ce;yvw|4h{5m-7>OIq<1+XT4fGrx=cbee|5hc!07YB-N8UmZ2u%Nzcu3ee zI{gkye>rMCf4Us5kopaMjg7p{TydQ=^dM0o}T5JP; z8Iju=U;pKf3AP9G-9$zx^BJ_?{^5%Gn;NnqsZx;yevqj5ku%h5@Ag$vvvh~L^zcZ2%rbn_L~Q0P?YTe;zd^|~{Yb8VjC zoIn$>`J(M}1)MU0%aPg=!d{=woVe1l;hp1YYj-(z`RS7{NH2;zPT&A$XSkqZK$@6G zx_2pZ)R={80Qh9=H;?p0%Z)pVGrg&_suCLdTRe+ABQ?2Hxlt@dXG3$TbnWr!2HSu! z3*i7#VyTj1DvIha*$%;2X7gJmF8Q1eg6Df{*)K^|@KPAC64eKwu6y!eAT@*NX6;I( z_e&(RgKWFOKdEgTO|e}8_U|YrC0IeNwCif#l(Si-s1<$XV%2Aa8GPd5qBsXwE)Oi> z#cLc$Huh^&pTFcG4=(G;PzSlwZo8u)1!1*#RuL$UfY@j?NpV(7GQQ`V*e~XxnKq(i zAHWUliKs{iWadP_4dlgft#sTVeW4S(trE^jf{N&`3af&p`uQe8oPzz0bQU@Lb>AZ# zInyW?MOXYPEBaWP_3v!*)Y5m#mu3z5lyT|@gu`X)LFH7_zG@o z^UC44M`|A%W{*NdH6#AbgMEJFt8*tb-Cl@sXOle4HS>%BAq{h4_y z)P*s}Y3+5auj!Ms04t$svOb|)*JiwdP91$ljDt1|hRv_|Hyc~#l=lUtA2)NeW~ryX zJkRF$m(roCc3QVoQS%v38pybuHeXCj*4@5WNHK2EfIk;~4hR2^Us|IaedHl+#THlc zY=xFA5PRF5Tl^{&>Vt`bXbfJaj z>Vw;bp{_TAC#Rag{felTh}z8VgtbKQ?Z60nFcUR!k!u*$R8jb7g-dLs^f zWs#OuibjaF{)^tZnjAAu-yi(-7;$LqP#ygjecx?=&@fH89oAkui9g#DT5tb0%DUK5!Cte~EPdg*(82$Dh%T93a*CcX;E!a7QLBieD$1jRZ{H-p4}G zu|nHaj+!J8T4$K#69rkb#6S59L=P2Wa})rSaN!qMxX1CYH%ZO%QL;bL1VGsPt^Zr^ zcrU0SQyr)zIVAgUY$eFz>i!uBA6~#{^KbKa{}1?3voLWZRdBSkH*s|SXC63N#YP=l z9nnV(-IZu9Y*2}XB0#uO^-Dq~sfYr$u2iWQk2h3}h1Gdc8pR;=m==?hjNRa1{iG$3bf@j@Q5@s1 zN_Bc@1l@yDJ5^{sGXjyCWObpLn_so*qTBk?ZE{ZG#x0+V?K;aC>pW+xIWnqar_Odu zP{?>-V&YVS@V(a)cF78CFo zrc~$zi|XS|u2l0godzetlYKF^$<281dX5s2o}jb!FDT~{((G(bpUPKL3@&PiLp#Zn z?AV%2RT}}OZncQA=K_a~PPa+QV~lW~Hdp6g*E`hN^@=0U2msWvpLuw#vA=Yz7j#*k zWoB&DQ~C`p$9c_m+cpw!Y0>h_BzEnk6{_!q4;^QNv)>6z+nKk>O&gaRtq%L^v8_U? zQrKkBX*WivNcx99OIq zM@}x|UKVtY?^gIlmd+K!a%9jY5)+gTckYe1}@`8rO{YvSEPWp!tK z8wdm{5|Z85$Oq-1%lGPR)1SAPD;2Y_mV#cC5xIM(o9>%rO#9zS)}RVF4ktI(M723i zCM&8>HWtOgUP@H(A!hA_Bpd`1EZO7Teu_gU8vUI2aa%pAGvv^07Mv7MnjeSanT)pM zK39KG5R8cF8mF_CsNwY+)iat_G78N)Ap(DC%G?+rcH2MIn6jSn6}EdYIW-PBaYy>w z)FxvvrDt3yLaRMUD^ti6?jqLB{+zaL2oc2y${D)}RRW%qmt1Qt@&0fY>FA6*N{;|P zj%@{lPOUWU*2gNOb4|136|BRv4~IN*#-}y18AVZW#_JkyL`gknz5-RjFZl8p{_1U4 zpb=o56v*~7AYyogM`)hCX<$KKKk)5GL59g3JvKr5;jjE@@BLt)(f|!pFwAI4Z=_K= zsLf)og_hBi!}A%nk-e#{ZM>{2LelK$1Vh zz{#o`>L}u<@3QC`2~h%wD%ghCh1d#`&GV}Tlw!Ra;G~%IK3_?-bznN28~uk{7^=^Y zJ)c+S7NNZJ?+Q!57)~7vKQE@ffq5TAzC)DWPo9~=VTw%Uus9t~cDeaHa6C-D-E9tR zg5dU>5m}2$4W%Q3y7NRSW}(fd#SI6u5`{P!$Pm+olrv6}khqo(-2`CLM{Fx0UT*0c zyyzhUlj%%4=r|dera|IrqH@8L)0_s{AKTB9Fx|&kU3k)$U?IAC^I~#yrAp=CnCegm zN{UR-aVMOawYtk_VhL)U8Ch}JWCpPG6?QhTLfVUx3*#mVL&{^(4$YiBr7}koOI+s1 zET5uGaSYF?PP1qr@ftnn8_ZBxhQ4wQNMaro*m9@nN)=Hn4Ns^3qB^R&kkS0uonc_s z=?SLpXhqhVn6j(!Q#D6WNp7z>!ItGr120$xP@2T4o3%7fM5T$*DA;Pjf%C-lS7oViGONsQi^PKmRU&b>>|8lr~K}* z{00HJ-*|>zqvgsSKP;d#V&s>)f{O^JRs0XvSzAl+$T7+0W-|2|bM#}|BTKB4MvqDX z$)EV~kO^u8rB(nWlsNGpH@h}*A= zX?|WnZx+#GF+;H!VIS9Q02EgjWG{rmXD1OlEif3ZX78(1P}D8#&GSajyt8*aq0;ZjDW&Bc?FT+vcpp2#t@@(-5d14M!Yad z;Vunc!L)Po4-t+ahG1#s6tVI6X(*-R$#oj7 zX-LshR52#PM;ob=38}7(rp7T|YFJDqN+9`GATYvOYHsz!i^qvyd)#C2Y2KZCu*SW% zbCH09W@47NLyaT>bLQZ#@n+@!G4>5WwsuLjW!tuG+qP}jE!(zj+jiYDZ`oD1Y@4_6 z>hGC1J>4_i??rrH#5pJ8oH#pke|zW7Tx+FHl89-Lk!@`OSz=<6aFB8Z4DamaImbxe zb4_8Hw~_PB-YkjmOcalOu%W#>6)W4oEJ;?|Sts#OU$fy+b%|8W;$^=6yxQ9eqccII zT&8g|lmU09MCnt$1Gps;3v=eV7oPuS3K_ShP5gw}MPWi0*lLWrKNlI7*tCOPDP02d zQV&o3+bFazHk41F2}|SrE$>?)?{h(N$R%tubO*U7{^OrX3k7@Vo?=CHOD@R;4YBz0 zM4@nBXwzU+8R+6jkvAkm(3V1}oK>-yc5t{@1IS~A#FH)^5IRpvQW9JtPgHQqZDA&E zQ+X5Yii!r_o4h1r|06!YPw>Si?xh=TpBK{`fUB3)%@TM!=n%9974HCo-r`4fkOON- z+bHbs9^l7<$o^*t5Mqe^=NuQil8G(#@X&NmDGikVZ`85x+?#`do&R3B|H$lOE0^y=-)(eqFr_eyq!2UGqdl6+M2b8 zrDj=_njYY3*%k7&UQA@!6_S>22^ddqY5aKYY(%n-_zd51Ih>FlF?qX+#g66`rWhXG($755l5Q6sZjE2~+Mfn}>dQ zDCLB2pUJdcXBQrwm96!cvey+^q~Qa9%klZ2DX7b_=aABjMCQ)Jj76Wlx7bBXBHNsp zWubv+EFaT!6RP~$dMAZ8L0!DngCfMdOiu2XmK(Pm2h9>{51dZ*&v2kAdk%44O3H)A zq5&J5-+A|nMg|mpbY)}pp+p8xF3B)%FtnLI-zC& z=YK-L&zioI;e6LqhZ+9e5&hc(%Fc$y*8j09)@VU`t1NYV^>QWkO)Ew^}9&?Nc@Hc%aPG&wM1>QKSxRrs|{;aw}TR0y)ccxCkN)xA)Hil~h>hQEy!Hp-Bnl4i-5PZfU(P;Y zCk#+NHR!o3|0c=~?(gfeDv)>oJU*g($eg5s=X`ISS|=(2U>*{KdEd8)>A`_%qyARq zV_l}7+Vz(SbEsVU75CsSy^-TtTg(eYVAFzL6p@}3Jm zw}hqkhAM$2%(&<4fGk@QRsQhRjNr;<=o}|zm0JL2`@lz~FA6w2YNSZx&NR64WB`qo zwq7>o)eZcqC$_(G0rM*m*&Cy2GC^Ms0;y$sC8~t0BNk(b34ZpNCxo}Tbn9y2aNV2#QaH8-@TLInUIm+5uc3h)(cwwXNmx>C zwVm`fqZz7EEaf9lYrl=&3<8C&ak2SvFjOYOLh3khNWK-WWGrcS#X=DVoMPC@+o}!O z%Ipi;4((hbc9Md!(uQDNT0Xv$2iDpMhf-C z0G>9^jJLl!PUdl;VN2hsL@9R|ICv5zN2#%cfi>*GJUaGS6H$bEs7#9PxCj@TJWP$O z^W!kmDWLKL{y5>rFFIJ(&L_(Co<^t;`4fN}!LZs4Hm9;Reh2TGRK)h9{KClS(69vu z#so26Od?GW@iK~B0Xq$k{OKlxXb3sT_Xblg%YXJF4E>B)SpJ!{==_PG ztbK3|CJ&;MSp{C&8Ih47Mbqm$`9KCd1{zVI5tmUlFBx*A$k4Z?bR^(dmJx*6ue_HD zB_&GfWYLcQ4bSetMGhMYg->{!Z&>E)PwM}%AUZZ~Tzxk*M{3czCZvHck`)4eLmVXr>SKzx#uOD9X?c$^EFWGFF&kwcUy+FbJqn%wx}=IQNACr53YtK}aRA2Z zmpzsPEjj(VKTS9Y3MA?E8f<`4o7H+$Mo0b=gez&Vg6_V${l&Y2I69bS+0JKoK()uk5MCD^SQPBUzg_H+4e?Q|z?6T^sIceC zfO#f&>n~rdr{CH@kNuWGduKSC4ZUHTyHwyvWxBl_#&gy&zZrbsSvbuJGE?s+hm&T6 zPDH}SxkyvRNut)&5E_mznao?ry20=r+7ZXpd(ib<+ZjFO#_Uo_9JI9yTl0aVVjY{^ zLF6mGHw+Sgg|v*tcqicx>5}aw96W!q49Y7gb3&`}D(at!T+x$e5BiBiiusNcRG~>8 zs|ki%^b^ZlrTd+tCq8I6QW+C?EVEd(sM;A&{B#ZZS~P=xWG!7%XL-fySQMuZ0Rb}qya4c0rzlM4qm;$V6o4_k?32BL~vDvWHdY7Mr*BAutU3V7)SkE>d>^bqgSUJ5qch3-^G zfBg>L4Hh<1P7dk2{u{eVafIpeM0RmWrS7<#(SW0 zT`FN(jpBN;XX|9HeYI;gCbMDsx=CD9&Y!Yy%2S+#QkMx zET1u^RTNDm$9n-5OdQd!Ykx)yzqy+#iFC&&7s53F>ywfXqyzB^E6TNKGqz`{b2HJl!OR%^x`_ow7QuY5B|V%`=h#b@G~yI=$QSZWTGt{7 zZatqkGCzpTq6n3wZB^)%QO)~AT~2{wX$!rAO6wB0ppQ_Y6pVd+;ErNKE?^uv12lLE z*zi$E!v{eP2d^zBbrx>*)PHYBB?>MqC?$4BjSHu`nKOQF=|Oa-9d#e!*1`Ywv>AN` zF6YOfj^W(a52sB~oxqwQG+S1lp)vFySkW+D64VagSFrY8yxR9=l%$p(%w4Z7@e+HP zo3jtu%ctU)E)~+pq$#3LcYZ=GLVF^-8d>W|pE7w&B9Q4FUdd+e;(!%S7|*PRzA_6V z(&s_oK}fV?86H3_@LNly50)bX7CHxRA;+0qteQlR3~5^cizJp`#v78K9_@H1%=)Ko ze_1&Nks`1RPAMfgE+l%z>$wgh6EY)wd2f}I|^TIv&OD(x45cf9WpP>C)vQcj((rQR9b@{p}pc9XNI ztKemuQq*{aST&=lR8t-3PkQ0^Kj>6UWBn(y+q?3v+F)DeQvKyg>A(7#inZwzX9*;Lu6T1MkF-+MkRc-)w+#n7m=VG{Du>AL^03yWioygmK&xqsNHC z#fVPWg5Cmp&W5&3x{h&Sod04|*!PLBIwQoVV16%b$3Ua1#V<%25^l(5EsTfitpnJU z-_@xbfYx&>sA-yeWB76zO@AL6wTLy9fS(i03cp_SV51Xh2KKTXj6$&h0Hv42133C< z#sis3tneC-H?(;2nO@%`W-*^c%Di8SU!eW!Y>RpZ{*4i zK#_Z(j(^1#iE1lP-6|D*(AE;3xX32z@8S43a2ETSJbZwv}Enr6-+0Tcpr>@fPhY!C}~D6t(}gqfh>D9|0v zQ-+O=rl|Z%Do?J`DNf<$g6#wfp0}(xQAr}##9kR~m@I;k7Hz1wgrz48!7EtPHYq$p zpjD}4E`()GbvS&*l_%z3N$g*+B%3LQ$UB%9%^@!0I@x1TcvA#4cTuEav?h}Pvb`I! zTzKHzSe-%9hGfMn6eS8rfczwq$k9Dcl{+=a0>t3qc-)s-kF#35Vp;AB&1$$np6< z<$}fJn4b7KCXkI%MzqBgr=H1j&$AkDv^jNz^mQdfd|83sa49z(be66h&2H_Ejd|Xp zqOy3Rmx`YKrBC&;w#bEE$RMj`pdWXhr{WbEs?Fjo!sQ8^i%ydz)f}s?!D=>w;T-pv zhaxfIpysP6(?E24_Xa80<ggw=Cvp@;Ee@Ba!Gn2) z-Mt}2bD1_&|0JX{7KrJ=vmI^7pj+Au%y^bZdi5*fx7wd#-0Q! zmO~A?!f=_?`vy;A7u-MNe-(fz*G)D&4OILn>hR{S+2OW8-9Ak}(*g1KEAUg_Ef_`= zgZ==?$VphE71Zp~YjOJs_BDg1q6lCsUa;C#?LvMA4R5Jm7%q@io4888HM8zk9KjzWv#*e9{Vhi7$k(iDR`|%_WvFL# z47~G45aVfuFh9%!8NYb)Me%HRR7bF3Ww&#M4G{AqtaDdmWT!$)E8z6Y8RfCOru^_r z9#uEJh=@9hCyeKrhjzaRLY|)EV9L3|yhHfpj_2{$_bZQH&uGT8*N&px%~sDdnyS`H zBUMEG;yE>t@sDC^@yf^8`C&cB%|?~S0e%6q&s~lTPU2r&X$*#6tW_>=plF|y4%^h1 z2k5EPL!{=5S0(S3`dBaFl?CCRq(b=(!q*nce7>@ZC(kRLYqunGNsJAS3S~4UMBA8 zo;k0Qmk5@?Rn6c*HSmwD8rGH3^)LibhDcvP6^CgoDSoiRFR-k48_mgn(D!e^GAD7( zA=?FXpGi@|3rDl^=tcghP8LC!V}rS+FoO!F3DqC#9eqTnEJSZIikzS5t&;CxoM*Ie zcG6($M&W8>yA~E36vM0-mrsMuMN>|pZlWxUyiy-n(LBYWRxSp?NaiBKylW|VUZT-H z!-!g)CBB}Qgi>rCMFoOhD=Ajty0X1i+fL4}dS?|+ywYjxsH*6uK9!Pn%eHk~+G45N ztglrc6Ln$~F6p6}kyTOp#hgqlgrt*iJuD^b+PXIK?cP_nA1e5;k832sOS6Q8J!w)7 zFe1g`7Vb_h>{WR+_3ZQADy6UGLezy)Q}WEsMq2rp%`(&lO)ZXRi$cy3YLY(dCRmG= z7TqFOE?C;mUJp zet(+>^67+jPJw2*`yf#j!Ylg8mBv=}0<{BX)5CDM+1lKsV;cO2^@-O#|94ZYG;Y4Z zrnUImAw@3m-LmRAFM#JcBBU!+14Vh!Q`-juq2M*2NBJa5)fNr)nXZ~OdEK($@VY0I z)$xLgEwJnYo03SEKbmD$x#Y%PB+Av0p(1&aSN1s)lTN*}*(=p6IxIJm*>whSGxZl} zWn&*N^F5j?*cpF9_z2z`J1KlN~qOeEELawW}$fg|FBTL|N4IsZ?L{!|F1cE zTT^Gl|G~Zi-78K1tDQH-cXt0@R$c%0O(8owYuWFg_>Yl?BudMFg@Lsj>-T{0m_AeR*fK=h9{LJ3+wx^x{Jbv6l z0-)O$3hD+C!^T1ud$G8i{ceC5dK{rfvx%w_618Lb<17Lj*4a9@$LDk@?F_;!uBy)l zApuswPI&FXHv*A8+|Ltx;gccrAYw~RkZ)K85waGYEec&4oB88&KpEj6r4%|On^Ph*eLc5ku$vAZ7_jKit*FvNGX(|qsfZUOyx&j#r6 z3lSvpo)dq=r)u!)g1Lhg#fK6I#OP({_L`amf`kClKNCpS3X4gpsj|25jB`v{SM?DH zrKDC+(h8GGqK1eSjP=)wp>e7m*+{xwfgQ|-668f+?IQ20ID7!`DbM>q0rw6CAZnjd)Z9k!b`{j8EkBa@WZ!9tt&*#k<>;U69uE$Zmi>%c##T- z`T5i}%pO7|;2YOKvS`Kq#ojM>ttr}a=5pm(H!WVt8P;4RO4qFvtvNIG<~1pEdC^62 zaQfD`(7LDCM;(JW1FeF^6~mpq9`f;`Pwq>et=#@$ze~z|(;snzkew`c`*!G~`9Eh_ z)$US}K-1a+AdLT9+pu9UjLnYE=g}Tu91y?@xByodqvfYBBH18WM`>WLmi~deAal=f ze=vlYQQRahek=JMhE)IqhcvZI{*U->f-AVh#c#LyeY=q9-@5M~`$7KQb$^G0eKUo= z`7hsKRKRZ->NkOGrMdZA>*AZk_TMRFK5f4W7w_H+ZNjVn;*L3p88ON*Hiep@D3IV5 z=&A`L$N7qZEgxjRcYgy|fmK{GJWMM*NMA)$-a0BsBP`av1B3)>{!TL!_}ELA`Wq}2 z6Vq9OG4(Hgko5oM2SHzell~@iPc1$Qd}v@~`qt0@WMpPw(A4;5(P3x=z=(mdfw?kF z_4h%Rc3`vzP+?%Y|3!tN|0i(S=$N=#<+pv5z89x|xitT6ar(bD`nz>vlw|FYzxDKf z%>PLACG|#yl9f^_fCX0*`W;EtqC_nUB~>E9+e~i0Pa~J@a`;FVg6$Ut%P`}Oh$+oz4gVZpKLc9U4}D{OFKPU0oC;L5cHvRjZRL*hI~lK5y{ zX8ywPPhf$g=YEtmwF?HP1=4gRacHR5W858X8}||O6(t^+-YC={xD-i-qdpj6TLU7@ z_2-c1Pmwo@M>L2m509Nz<%CtKLl;vMc+BqYz)4li)+?4jcg!Bt?U!(ap@_=7$ZfXN zojFe-L1?7jr0wH62wsL4#Bp~8(xFJFx#t}W&e4tgm37V%Y29Rbocc`J5wlkJ<5^IX z%vtyl@xxO3qa*0%N{XhmdEQO#)Pq%DNk-*cE=U*Ldrz_8+xdJK~->dQuphV!K^htQUJ-(m_2s8fQPuL1r6&x<_x zs9;)dTX(uM3XoyTBKflpm2@`aD&?SIz=2JI&rUW>fwkuS7j27eX>V)%KFy9;PI{8( zA(E&FW5wbAmV2mdw!wCGLW)}jy0Jo@DS^s8y_(sKM^@d#IlEa^7=*SX5cfY_?I$xi zu4MV$*pfYFeyLWpPkmT;U_L!0!+5ahOrI6uF`qlFSlo604y2I1w;#GQ zedh9B3AN5n-ft`(M$T34UD5WQNVw2H(E8HiTuiva$GZ3eb$w|gq)VIk*mXNXE2Ah? z7T(u~y8b+IXkzH97tW*HmBg~wXAtjpQz&_^-r^OCf&>B)yTJ@$d>?c)=Af4WFkm%c zs#K1TICK6rBY@`RSdJHz z<8fPv-k<~xZdEIS03tHPfS=A#cXKnq0i`=L1pG$9s2M>8B#Pwbu2+2Q(X|%_*tt7#UmI!nKpxSh$7n!Zkrz-i0FeV{-1y8@rQQh%a1rBKXrwC>ig&hL)=` zAXkNH-Db$$7}4N_NYd5J0*-w{5*hNt2kTASXEAu|D9T>KjVZ%4?0)Y|c`vDW4Paqy?6l`zcT16Ti6OZ%6wY1_X-Tm?I4 zOS>O`AAd~3xG{`~ zjLDMjwgdZ3Gl?k^6P-m3xr1;KBTAVmO+o5>cG@3OAu5~A$m2SsmBK$cmhu~03ZEOLSka)5z z+Gd>-{HvWss?OpUEHyWrLlj&Wamtzhb_4|HA8waidFac}G8kV;#*Ogtcs`k{e0a$fh{-2u!v;JfNR?sxjt&CbhaJgOeszYrB>L+p)t`#4N8=&BrKwh97 z|Ewrt*HK~I`90rIzs>*eO|N8XZ)oXg_|4Y+k5fWSY(G?>07B>&<3i&vyuu(ot&?>| zh+qPWlUdu8VHqdkm3;N{S>OkSIjgX8Wv6t%m+#z$ACH|I0JA%r4mNS1*Upkywucs- zNeKil|EhH+#G|mVY?YnWn_)e%^S%yR;Le|ZsZ_|QGa6}B>8L1*WSY7Q5)^Yg;y6b} zat>|Hv<8jRjwg@2rH3*4Y=+lkSi|2sP1)#>+T!Af)KLNqv&oiciwuwXzynrGVs%S= zI6i_HCqE2cfc|mvCAz54{uQjre_P;RQic9D`IN0)z5y2hbxewhpR)QJ3~I?@{ssOG z=yIU_RG{tZ8@`6V)`2}3PnIELkgeg(itgjjm+Ve#gih4n?gZ~N<95a1H#$h~&o1K) z;}h*24Jlap`)rg#I$bPkM(3({cD|U%mF-)W26x-h%b~ewIFr6r-2`nDDW)XpWP)NK zo0vK)QdSow136=ja-XUTy~I&zNVMh=oq7vtMAa7gG1qb=bYD})AeiCPZ_+BM zY6vm+ItX7b1$KoLK}*N>6K96l{iL42c{k6?zsw1K&KSI4#vD2b`5#TgwE_m8_H7pS z@BR8;P7VbdLy!L<1`zX~N64}XVL=pq3cj0wFvo@nb@@oF%yF!l9)>o+OblR2sncKKo?zoOTCRBLYsc3WsrZ4m`270OHiz6`zY~wV=4OCaG z5{g+%!b!>Mb&%=+uk%|?Jx8)!RzU_%% z6JEf5w&0->jK$v+rrhCdYApSngXih|YvST6&I}WpMkBvL;-?9tsBHiX03+~Px-?`O z@)6RJA*mUlnsF^D4VjL7d%}So*)5vQC{4fIFI@`d58m)xA1ur}M}#^Yp%5eJ*pnWB zf0k0lk&eYq;urz@mh6_XSs=24YW{9i-hg(XYuduZC<$emllrh#-1Z=({48`$YRlki z!P@PzUdH!Wu#hH~yKxLBEc~-6(G)Xk(u4~ykJoGZ%kTK>=a-|JpU2lGkU!l!VIal` zYBBMRVKIGgLpFpOA$n*P0lg^M;h!}Ky*?G%>0MFC z2PF{tePu@u{DLvij$0{=JhdB4NM71){lvklmKPd6^{6O!S-3p)n-DFVKJ>#IQp&eO zh~B_DsuP79R?s?XcVPmP<4v0_)LAfF^KK^=zoY0=*UaT&!;V(wCC(izWJz`ToKs{7 zj;FQkzBA;YvPa1t<|6I=9LW{N8iyatce@zIWRDb0l@y6?Q!?Kz$`5^I=W*Jc*{?Bx z{-j-9mG_;?pU37p!j@h8K3x!5ScF+-T+s!{HvEZbi*5=*%)9R zw$;eM6>u(2O(k{xK3zF5d?qrN6H(*J7?)UNr!kOh*nO(C90sx3G)bEm&7`Z#N^?y% z%#~3enoGDcyWTkGK9K^xwYFMKzfbCUyr4^8BTN~8(XpdgZMGwHU=}ZBB)ppTSH5J? z4z`Uh6Ylz_z7LU1UD9x8^vHVUQyo?$4&Bnt$f|Cj(i$wWB=>c3^harR#@mEFFV(K9 z9>n&+NTZh0Ed>|o^7bEqie6b!?mZyu&^u1`Nv@}2PBV+nBNq(NZKYe=ZpzuY>yt7a z&jQY^TTZCe*I(&uRu*xj&9%X;vPn7I1&o3$sN4N+pqacuEy;9EV$$bHp=O87nDPq4 z&o@2+wo&amI$&1ZL$b8N1;NuGT}j%gkj~}p!T1#J(!=nKMLXhDzR`K*FO+oDFBy?} z`{-1@5&9MGXp*QuN9;h@$jivYE~DAZ7KkHi%$q{5EJ{l{EQ=(B=(9YAJuEjINF9Ev zI)K_yzvM)2@8cdNMOLM&I>0(zgsLj34)YwTbW?|&V<;E*uaw+`{#iakii3~IWmA&L zKdQ8XhU!JWkcN#iV>pSGgH-d7(NoS`TyFBDvUM)Kh=5dcM)Vb#NjIi30SpO-Vb%lE zHV$&j-Bv%`BeWU&h3jyqqKD1htFxC+p2%43za!USARkZabMqaphC~@Oxv|3((^E{L@+UNgS=9 z8=h3z*3I%5>M#rc^;0ScBIq3|%#@1w}hN`DY8cu?t36cGo2a=4b&EyXHftv3I zRCE7~ypk)a@6DTup_e=x%azYq7Jn$iv5g)M{_(^p;ttj9yf19w2bcF~ZNDEXpj^=C z-U>n|)S<2XJ!C9wGT5?H^>NzGphaltk6IQq#v2k(0K3*4Hi+&(y$4kJyP6_3+UKn( z_TXa$WO|)}NO!@E0HpS4|DS|N^xa%x>n{q0^^@DU;b2MQ z;^d)AEQwwiP;W&5x$f3^f5u#Y_2IoEf8fo5=OYk~Ealv}K^G=_MINBLPyd(@E#KU~ z3?*4Q^zR-OaArV2cL0({o(${JQJtjz)83dz%~?LTx#v@@R4*E?y;`}GvAM@~wxewC zAJs=IG9+7_U|q1683-tk(>@g)PNPfW9~d+|wdxr2H4EEsZCalk7eq2Wb3E~MG(=PQ zZkIj0PJIXiqX>ubG&UQVXiBbb6wW=6g*y;dL72d=B($Y31c$t)4|=ZwYStc&NoO1y z;n5zPQJg&FowOT|I!CNrnDNRO=fcOr!a8YV^VkDg^7($L3!T+ij1;iUUR&USN9&98 zh%|h?HYYTs^=scy@HuxcSRa*bNo>5B=Est2vj&cCI7ZKFdsoPN3A6AAS52b^)_Rkkr`_gJ-8##6RAbf-dTZ;p#& zI5iUlxinnZ>9Ffj^^IfeoVC5u8FDh!)#ZM!vo|f!*RU3ShuoG>SD^fs$i6HUir2Oi z$^xU-L>T!?GS2eE6GN2v4}-}Z%G*ryG%XZrP2%_g4amYO5Ja+Ip`X`_emz2dgeBe# z-M1*`aMkL*L-BF@1)2YREE)yjMUw{u0MLW~H<9n(!U-EwC#QdiDAYETu~jj?Z0Tr% zVL_!TSU{CM8H1B4o+d~sX_Xeh))S>l)Gm?K8sjfYvtVhLwCEp|9;YzPy-%G>nV-fp z&YBHeMjX0heIA#j@!zR&P=7Xct${$0#`4*7{K>g~@BJ3=xc(z|_3`nV2GDt%3vSCX zy&nt?hf^m=E#^VOW4}-G$9+P05CdDzDUO6E$FM@|rbt(Ed_#QU%4>M&DN zH6>@&Ea*{Z%B0!h0~z`-EzOMiV#$nDN1U_$g}rKw>2pUeoHQpc&P9>~O3}sp%%K9W zHOFnO7et`)vm{i_IQvyBjmaM4=%Dj>F3E!BVN+48adR?~%VLfMGHGKS*~n8y#iX@1 zQ|D944EJk_xNM0CO-kBB$08-AX{qRFvco$|sTlR_?C3S|V|x?Gj_7h}6mnd=R}re*brHwp5yaqhV&K@xjhV?L>5_1? zMINGQ%=78lNvBL;D56WEx@xGM@n*`DmWmlr=+6jSa{?EBGR@o-N1Cz3(u!X`pM_Nb zD!CMOgu8}})|5?pN#DJYRVo?XVms{1Qz3OpzCmuJsHjcVJv2Vj&3tLJCqD9+Ur?3t zqnwool#=)@2itfWhXy4*1p#a*uT6nvRK+pWoV| z9pPnTq$NE)@-cNoV`HgZBn3D3cX9sGdX%d}P{t}rqs$o`DcPg3H0OEE;D&f32UdS0S|;hV<19HTb%LcEc8h1L zRT4zDT9~AVnCM5)%cI+aTZU;S{(5($Z1h8Nj$et|$UfdodbomC*Srdgia=a5B z>tw=HGJ)!b#8U7>dq{IsIYTj_kfWAF)+7NgQ~Z1B3=|35hU^^9s`cu#=AWkpKeUq3 zJ?yr^MNppt5BHP0R+;LAL=6|$YA&e_Jma3}vEV_0tETvNjeV(ckJ3OgmTF2nz|0aEf-`u^P*?w#TKsGAiMT%j9cAZw7ULLo(vtK+T~|- z1wV9Hxa`i37q9qR2P|(kL@EZ+uQJJOW)kd>_6m-0C$Q0c%!MNk3n!drjz-MMR%AqB z^x9J3?6w-4v!Yg&$V_7?OP$<2=_;#f6{$tEYk$xK*hE*}oDtMo|1K?{HlTMgk)~+6H8N@jzHj&wBv#Ph7y*U^n2Z7Iz1jUc-N9b8x7EH~ zVdn--=CHb*D~GoB;|9hD#LTsWg5~p@#w9d3lJTslXPDCtnAl4c{1>d27cknFRIVMj zp#!hPIe6z9{>17l%y(iGA8wag;Kh#LBNfo(n2k-$CQ%M!NXE1^u<_Bli!=ZM-7=E| zn&}F>_MZ`2c=8u?exHOmtygs$vk;Sawm0{y%{-I*m^7f&MP%%7@U*Eql$X6e3%cb6 zIyQ_~-7`iD0$*->5DioZ1I;)knnSax`}8mFLzK9Fv)rb=5`)cLM!#Y|{z-2uwTE?v z7#0Aa^taW9YSdoMWPVgwTX*^LkVk+C13Apg!T9p2T^ zE&%-V&CQ_U3*yz`E`joc`|Np0=tuX-{%$;akpn(_*z1mOD4xNIAYQEdO+1sA%xi;b zj51L7tuY?n(Jtc3;4@Gy7*_fbInVoIRFQjfLEi0+6WUEW_)mpfX?n6<_3qD>$Wc|E z-ToxK;ClUGWuC84)%Tjn?c2R)n-zSX7vdSeyFE*u{oy9}*tD4{_W*~_>OFd%FV*2~ zmG1IAQoRq|;YpsK16ZFyxB8Ded3fDNqQrXUm!HF2-Mjr+c<jMW8zAq{Nfj2h z*6QNoG|F9p&t?$evJck9+h%XJga^|aWb<YveBXLO!NI`Fntz>n_3=X?sQ7# zq_QcY*oBUV)zw6CXeOE%+|V!ws$k2N+4rg=<5v47F4K_xPz&}LIw|wMq*k>Nrb)Z8 zq+&xFrpSvBHqj*y5MIvlpt>0v-L9OtWXdK1jfz4jTLlg}6~)boWJ=2o5qBce@Cb_9 zoG30!2#T({I&Hz;d(+M584S!dMTXF@A+#Cx#m0*5%4X2I2%Xa=KiXsVG?gtUZ7DG2 z8e^u8X>fr=W!+lLly)UTc@S5S=U_VOW&yO=oI{kkBvm(zPGvX{=kBisegb(1B{~B( zrhhb_ckN|pn0qrXz*U53$iuA_mW7K-9x6yg%E|0oX1tsaU=Oz3+7oGYwY%VQdWxYQ zMl!E;#@7AL7j|??e3uba+Za4`-EZu~_&zLvuqN4z7aK*CJK(>a#%y9D8FyrmUrF#} z5O@my9OrCz^628susl7xkSS&I+~}4?>`^|GJCy8`#_XZ7)T8QUAX$~H^3F(|){6pM zyRemXEg|w$j)s;nT&7mekP(JfyT3^dy}!YPg>H}#W`>XQ&#o`5cNZV* za+e>pT_tB&=d)(D0f5EC+ZqMO`kWMo8D;SvQwT2Lh=qK4L)Ax_ZnmCnP#g5bTfV*F z$62ul!goKJfDmjR=nqQj@PIR|W z!&^2?A$!8 z8mT(zB&7|}rxo{L2cpV6m}Jo2)*gDPI`LyBj9Kk>vJF+crVm57QK%rYVOa?cNL2uk4fceD zXxH%w)H{g?RrwMDRk8tY1ClxckqY!U1!qC_p;Yh#s8H>21GrEW;03`_P;djtREqFI zm+Gd0i%p3b>IMFITYM_UBvuNMln_Q#WJPL~9Qb%Qr#X$J)V0rJ^jMl;9sBLI%VW@>ba3>on#hbG!v=(I z93$zCWq7~FKn8~^6af56gLY7lVb%aq9K|C#ImwVw^GW+j9WvCFHvs~sP9P(7B^66kDLzM=5CwbD~z1vO_SZf@n^y}HmAIK5R{s<`>x^k;+NS9mY# z=}~*0C0zN=>R9BsycivU%Oj2HsYPlk&-xxkjlIJAUMi~FqZFPN^2Ov&C^(}so^15R zWDqpMIJ5PB7mpcM|OSt*LSn745Kvaz3v-F!` zw<`*n^=ti}^m*XtE&lBJqHhX%*Gbu(z`ftv9T??9;VAY}gYso?po~CtyJ6}mMH0~i z9G?8k5lAxVCF!IS^&;7Us75$GB++HZKM>NwA?GpCm4XO_tIO?Jb9RZ;y#=`jr8}Ax zxQfEBQs>Ofc5!s1;-z@Vlw~zUG|&xs=!hkXs9B`ArowE87(tF9?}|2pF7b4(oVf(; zo-WBH#HLe&1j3@8YWvcDIj_me9Yx!e^FiUS@h2de?(w1EjTEbX%0C+2CCpM$r7k^0 z*&mmLWT9O_up4MmG%FDO4*SEaIzg)>GiFfs=_(!4q+O6BW$QqqrYR&$yX`P-!376C@vu@fI<1n91Rvf6t;3<2zHvBq zkg^bt6Z_@W3rR!7(Fj>4c2>Er4PEJKb-}6#1)D7jc8*cglkuq8sH73{RE#VOJDVc6 zxo!SxF$J4tr0fx~QIm1`ss>Y4;YULQYFms^Q;v}n=kQUaJVI7gO)Wb-U4*I`4{4wn zF`QU5AKF1+;tKTeRrZ9gnd%k2HVw8+Y5<|e(R~+bn10`08*-P7FY{EYN}o&3fLKA7 z6ONvNM?Qdl0wVf5J!H~S)ZGH$s^&*|hHpx?Z+4RS?qTz?X?67mXf?I{D>6|l3f-Jfg2cmIjg%wt2}Urm)Agg2 zgSq)IUWuNA%AAQossD$rcMP&E$hL(~)hV2^ZQHhO+qSJ!wr$(CZQHi(ulnA8?|$94 z-;P*&N9#p3YLJVtBj$}hSRFMEr%8_AuPv?v5Kn+e2{H$V# z4}R$n5!Ksn=;id!d&fLogeUo#jj7LrSB25l;;Vh3M}ZQJ0h%}Tw@U#se-W{c)_H$3 z55mZafm5cThIe6yX{(D?hi60snbFPrhusErgSNp9`A90J_QN%sz+28bxIH28eF@ot zaa25QzFJo#fLrt_#Oi&@TaZrbEx~$M2#bMrQ>1HLf~`T}Tka}E9Nl2nAg(=u4ZH=I^;6VgvWLl(&yNuN%Dc6Zw(pCEvCH174kNI@p(HN~LyAIGRQ;&SmEviHCKb7&Fp9}kc-~PkV5zw=C)^qqLRU-PI zf+<3#5<&ww5w`#ho2;Q4&O~@-ezQRR-aTRpq*!y(WYhmGm@;pcPh4k153 zy}bp%xidCY7>U;#8Q^}f?nWuz7kMmWgj_3Bt34cM^^(NYD0hj8qDEbxVe2uYmOM-^ zHXuJpUn&1uy^#5w9m7My%Kn6TEyQ2bK?@my>}7#f`3jI*T=@6+M+vAJjiw(e8c45% zY949ZZb)Jbaw)6@k|ydLFI>-YZl+4J^PM_oQxnYPoh}~M zc=mK|%G|e-nedpAsi$@?Jf`kBk1yPwqe;5C0c%3!f6*_ssKMYzLIEp)Gy9_sB3V~~ zoD!DnN4&GRt!a?=Z5%5KwsaTi$GuY_$z9!pS1~|#I525UbhvP3Z;~5>L(1PyRgLBt zS*<(HIpwc1rbC+i6i1WF8k(A^SQ-s3imK4sPm|^?Ss6HeLT#%M=~F8SGQRkY_etlL z99Y^!-#7|R`L&nP4%US`g)%HN`BKR$<;b}*-J3~@br9n^PF?d{ni8xx2$OO%jM6nK zGs8|1BgHebNCAnzx%*#TuafM3&?cz%q&cnOItz)=te#xWeDei~AOky27{$6stoUp$ zV9~Z@s&#u6RO#%VSs}`!@{Gq{8b%srO6VonNzaiueS{JN( z^Ohs2AlqD{_N6Gbx-?`nwff5-ix%a6;+|XTzI^n#0>vxWkonukEiQ&+?ba*wMJx6@ zb!ha(vQ^8eiRo#F1Z-4I=k4HxQfig+EzT0OGwWOlgCXln%4c46JTAV@S^Ki1qQO8& zY~qZ4QFMJ*>3%eCy`mo*Ge1D}niU2)rVJrD0eBWh&SdMMdOzVUY;5F@cO|MmU%e>#S&?%j4nQ{_LL&ixJ;pFn@7ao1-!1 z=qdp443wJtytdHl#ptWvYgi#{3mnn)Wcq;lSMrg1@3{NSPf&>YVRigJLhOG9g@1-v zWhsYsMMSRYBq9k?yFUX`8N_z$zoNt~if8U-GVhy(XtKx zVGyH+a8$>t4QH&CQs#SHo2$nVUJe4OiE!*v|C8h=1)ZaBnaEmSKePI`9=2_)o33|F zdx1Q~WRY{dL%vn*-x}{YYTZE>G(Yv+W(ub}Ur_tIkJ@GaNUUp=&24Wcva?w`x}5H7 zPTIXrdKdS0t~UWmF1JawYc+F;WaLW_wH(VX@K>HUjzxZLWg#SRI9Gf2Us*kHb)Rb) z(lWb6JFWn18>OsYwfoNRKFSWaojd>55G73VyzKhyp>DQnR>IZ~;WNA4Aqa9bD@4b> zlHF>sgub6YK}9|gG&8D5Gup)`jD2qUbo(=d)$Of{1kUFq=ZPjmreq}aL7Vek{TG45 zcXNZ_s02REhjhpAG~~t4@zgZ(D@521HAGRoPGLy8`I_mKNn}F``o=^EPHH0Gcu!~| zWdx!=tS%IyZz5NBFQp|N=?KI+?m%z1dCh98Zv9-le0$g0_E9hXxi3Nns*c9_&0E&; zCT}0v-=pIME(V3dM0q;ArCHMRFAN%T;KOYdWc|K)4=od-W4T>+9zErUNw48~38}h4 zw{`P-9n@kz=uf<$ci`|nZlPMm?zd)cy{1tiPyC*rAzx$>sb-Gh6IaZ1CX;h*#SULu zH7$gmVFwT%WRGG*K6&`PS>AwLNus;-0U*D0`@5hra9Fki?U0UsN%H8|8BLsC>;*n! zog3*uHNrFDZ5Qu^!$6y0hs49F`iR&!$*)#~wUiAoC$b+G_BneJL~?r)Mq^v~Jn7kd zc=J@{pyV5RwcJ+8@|`i&Zv016T*<`barwV!?1F%(+G0S(`#TJwJM#Fd;r=v)ek!^` zI}UKH5<3?PCp^P9$s#wa0AGy2GCT;J7%<*kc&_qDI)#|olR}a6mxM?5%6`a({t9)W zWtgeEwy1Yc27R9RXm`2Gy08nTu&Cstny0KNBvmrQwub~&ivY{ii{h?GM?L}EJc;jM z2;KcH44)eaDL&xdQa8m!-wl{-$$O4sizbZjTcR0#xYB&k5?l4(z}rv58|MNp6q^U(?`Ug5Y1AB?0Se zf#Qhwp*m6*V41R}T^3@lhZzMsIwP#N<5HSWJ@|4^KSM_J-o`fmO+R!<=u4mSCl);Y zlw|*{lkFd;vws}7{wo#;*jQQ`8T=0n9+;pd^JAD0v~AW*X^A3eE7x@(uz(yB2I&1) zDJ+jk2!R$=v_*9d3OYe+!#ebZ<^@OFG!K@MPWwGS!o)b)imG92A|sRSnC&`)t-kx) z^BZgjTHD;Tzab0_3Qn>)2kCjQB^p%UwM1We!a?7)U{+h*KWw^6>Ne5S6i*>awu9l76i@=0^bu30|)Fca&l(0Q_RA+EI9MS%-K^DSViLd7@gSo^O_NEBy31c^&|_F^R&)~) zLb}%Ukn3tCL7eP1I!Q8tXjCKV_?`BFq;B+$98G_NS``Nsb?~&R@%%y~apui;)QMf2 z+xEgNA!m>hQ96_%G9(iBcc>-v{EUAn1Ey>npv!0349n(aPKYIDnJcJ=BFANEqeyO% z2@+~s@_5s*OQn+bo+H+M)1_-s&RnA7tClR|Wu+of5U&9JvU|VbS(glAX&Sc zMQnH=#j)mPfM{VpLNY2l#U#sh+mY`HFBZy7l|G*cjJp%(Aj95*M706jv{MIc{~v1z zOJ&t%w4m>8qX%~KWADyZsd7lGZ|*;5yk}e>0*+dh&8~3X!C=Al>v_d_3sjJkp_0Og z_DJy$((5OQ4DM@=@@X`4DnMAK#OY)F`Fs>+f}?j2m`3xfeFN|^J+pf{QNj?zxjhYgqoQ7PPq6K zfVy+Mt8yPC#FMYlWCNU#e#`gb1_5sE|3yLRs6}8DnG$VN0}cN`pLy;A>c z3B5-h-<3mo_GsBGj{jN_PeZ`a0_jfpuO=~EScR&Mj*lXnpR&hNgJI;GHl75*>Tf7Y&ZV z+b9^MK7s#r_suX+RPy|x^Pr=B{rVb09sOEb{oG=9^Fx z!^2D6T;UXUr838$LThh%+*Z#SXiFND1*M5>G=*d zN#WG^?r5dpG-8~soM?Hhmlq(Szgu?ne)2TbEJlgVZPq8KCX!EBCXXb^Jy6K8=qFqy zWA`eULVP_Oqf;%k1uB>4^wUyf<2OGnkcH&d`v9G*z9Sg6_4dZX|E;ncvze=w{RA99 zNf*fs{--t|L_dd~cSvXgfcVF#Bb1S3Tre#$(k-mG=WE7xte0pAQ?m$>pl2_pERQ+8 zLxZ(P^Y+(#;26t_4y`hwjhFBmcL8o;y|S#Q*Y{0=2+od-!9@`7?tpe$J4X|1q)r$1MKm2~ufY8bbw9YnU0^AZR58NWR8j zEPjER(OO|G2A!jj8c`mQ5gPU+vRCo~%s66bpA;wN*qc{dT`4h!92>pVw=6cTOX*DD z9r!brw6lT%8?q1gcE`*5{i5+{%_HjjAinXRw^*xG@C20IHpDYiP(^w!MdIRfK z%h1hLZw`Aaz>AmF%2FvT4-0qI$|*0@Qv9*v83cwb2{Dk>-NC(Mq|lioM;u-v!A5$d zS}#ch^r{QHeTT$4HdVfKtrsDj@beQwl4vQ`N24GYwi6gMdC}Y%I}K30B}b&W5~(12;U7$n>r+uxdX3zMJz>iV=6(5PZ++>j z-5?W__POLWp)v#y*HtyWX%am?#C9cN$kcoW$?48&`pA}4WA?bU8R zSj{+jn_8UJS+aN}LmCZT=7d2EjVetxKMj5z4KD2Am_MqICES!(odoNf+fY(o=fEPT z&7UZ*Qm&8%2iK(M9WM}_up+8M50GyKk}0FLKL)=5)^Pbxdell<`mh?|0Bmr3<#0n2 zFg`7WpT|Ji9}zxeW?nJJ>0Te0TE3S7C#&gqLrKtKvM?Mz`jfdN!L~t9z-Y5nzUAxD&M; zzk(QenCBlk_~4;MW%?Vz;O+T<__pkRe~H18&3KxdqTrFN-`E#ez{H|#oOt^&Uq`W= zPYxcOaX<hpIC|7U5|^Fj>Tj`VSWCt01-8)%eUw}v)+cP z2Xyq~d&I+FYibc36$%FoJ*$5zm&u;Ezuh{*pGP=`Oqbo(V8sGy;9o$s@wDM(MnHQe zsV)z|n}Eg}90c<;g4=Q`SAjjjH^zBpG{70oCWSFti-YqdIZ)2~o>)SL`g(14w}qP# z3725^T}qb>U=m-(U2u8xQIJXd@xP0bRo^`-P5>3u%!o0Mswkt9O9-UT>KyYY7eqD} zjDC!sw0jA(@rEJJ*L!XWnke0@LfaISrW{_C#G9KS1Z^P`bZi1O4R8&I$-kjQ(UN`fgzU0Nhl`&EWF9aULcq@QRKwevuj~RA!Hw)%2 zk}N*VRmCCYmV5U7b5^#K7XmK&H>cdkl6h#-T7RjHWmAed9hKmn<9Q<$ z+DOx5s`LJH>a*+GbK1ei=l%2X89;Hz9^|UWpFPSD7Yb%{z5j~5geNp=Y@Oh$46pH^ z3f>O?&Ln*1))d6Pz!VyLyl3B)e=BREhmMoTMn>W#!t)Km?Y*?)QfrlQcU!j$-=Um2Ws4eIr-YhmgIZcV(-Eg%zC=;wn0EajY>B zoqk=tEM1*NrFns+(QL+?(Qr{1B-o(0SJk7&XTWhpi_vf)RX~mbF(P#n9b8=)#9$Yo zo{JOn>Wrlv6qKM=mr{}rDt;09v$r>^&JL|r&LBt6YrQHc>FtfUbRku>%*^bnCW*75 zF}JYIL8Vnt8!9U4ja>{J>NLF^aV?tF+)tFN7vHlZ*h)2G;aSv2vfqlQXkZ=z3i>ffAfn7Bqq$eRqJ$uPInFYC0W%`iaJ+qS z?$S{NV*DZHx4?!Msb|jxiN)H}-;U8P(@0YWbXEUZfbwUjGOluEX#2O^e6 zL>UdMAjZMR(P#>R<)^}-R!Z>Rjj`+>jcBxc&1j}Z*2`Hd_0GP-8&SFk)Y>ivEnGLl z9act2U2j3AJZ_6RI)j=CIjQh$Z1(*&4)aj*S$77BTA5M2Y1nHL6WP6GfeNlC32KkH zm||mluXf*l<2i_8lgfW!(KP)9R=x3u>VHF9UfgJ0h8&FBY#e7`5i%QK7^HS)*rU30 zG*AFl1Vqm(8s(l5Te=}Fn3DZTi3m=l?>cCS>cgHpe6;0kU}4RvgoN`r*Rn7?l;D@_?|6g%m;eJ|-n z>ku@*dYI9u%w(OuWo=@V)iDPzNslFtp|fJxNE6J6mHz4{^!U0J%*%$oE^%1+dScvV z${X8JO74-$jLO9h)RGbn?-523k+G4-vnCZCs3r~6auN-P5k@7Fu_+VTRY;H45{DXC ziAR+YMx7;KGKpa}lChn|v7RZ|S4ixcijLNDhZ4m25oDfos)V42j=hxME-Tq1tqDn( z#!pTxv!oroYtrSQrB})jF*j0S?v!~p8h3>^O!eiJs_eGV@(EQH>IdlyP^?jU(A$xa zP3EnM70OXfBNr+=$TJ5|gGf~MuthIl<-6Gm0otv2Ikv_(NUM`v5?|t7o>o1?OlJo_ zh?=^&W78*_z#rp{Z|5)7-Ob-;df6KvwZF3pysB|e&vLs3Zb_?hLtt+e&jfiQ(&ag< zq97G08<0D&Mgp`<-knho#VO|@tW#El)Mg@1+g@YnzLTpn8lF z&C~l6w~xArqRaJl-W^Q3)Z=NUR!Fw^k#*d8Y>%6!9or7seQw?xmT;1Ia&4Yzy+=SlS{6$k zm1dN5&eN;A3=->H2Joo%nbFSdUSGjbP(!QkIb^+7O$;^z=$t!s(C%{tX)g%q<~A8* znozwOb9t4?;3r-;S*s_B&AJAE$taIvMSGPAql9vwRWn3q844RveZDf8BC(h2I|AlD zV!H)Ze+DDoRbU>$Y5hWjIhaG!$Q;maJ=-DS}mkGAYmMm>-xjvUE)y>FQW1^sF8R z?IhmQ+JP0cU9^<6ONe=T2H*LDqAPKwg2Jv^gS1qj$vig`QWinbV2STLQrl)vd{Qb6 zxhJTD;SSU9WyCCsH8W#b0G`1C5ITii{ogbpmwnZ;p}yt%)ualhSu0dYp`O6vLiL#7 z6UPY9z{n$};dsDf1LACms-i=$U^wH0^0kb+dVwYIN?_l}p{evBO)lX=ycMwZNUDAO zR5(>wF@FN@DwO>ETnqa0Pc}5_7?Rbj_OJ;P7tJ95#*r8`0B=HlX-4!?>Q%;m zO}LaTi5%UR-I11~3I@Dn3=;5#79PZ*>8;#I5%86!Ahjp&m<$Wc0JkwwWkqZmCr8q- z2Yp5t9l1O(HUKNt+NflvZqyiA(mCZCyv)`U-{FU?`c zYYZOTNQpVyMca**c%(m;*b9Z2Up#YNdy=o9%WB{*TE~%5=P`meV&hE}RDzZ#mP>#e zBMh?-k$2dme@6vIH-!)~3ZxE`fMReLvMWuYJ&@HEeEIoOL>$TO@s1@51_V{*=QI;6 z^aF+RG~Rj66YdoN>0-KxTq)SuoQw0=5A70Z`WE{=jKoQq2GucqFVgEVs0H#h@Eq=E zz$p=Q$snAxqOS&?Y~{+MVNdH_GomsDa^C(F6p3^2s)E6zVd^Ik)MJw$9J192gZLW; z!3$4$<)p+v(>oms8*UYo8-t6Sm`*v6**zk63}N2tp=AUSjeq3?Z1%!&*%Kbz*%$OXZ^cR(~9|HO&ZZ+ST4^i#LbL4 zp-4&3dyN#ipwqXmp}KZP?ytQFC^_bE&B!etG6xf-T@`Pk15OhAj|s*-#mzVrg{GA1 zDZ8Ii)w$~B8;He5ea%uQlG2qyiL*}t`lheC7uDH=+`{>Bt@L-qlWEKL+l%Lp&%Y)M z^UCQ}|1e&@{ekIl|6{TsZ)9y~WN&2u-vEb`oP^9eFYFg_Q@s8Jg%=-uiF*kmzMO;- zo7^LOsDe6d4rYs0AGsDSvpuGEcWJV?kSN#9?-x0xZl}Bj(Sx1U)YWUceXo!AV}Kr# zj{DubqkaLeD7AdQM{s5!Z=O&FugpkA!WaX-*YHrOC#4-mmUh7A%nZ|B`Qd@L_mhs| zd4k38l~U)puCO+8rlu^$&5K|(aP&+!CXp`#@G$0G)Qt^8_d%56P?8g__2rMV4-8Wx4)RBw&JWb>B;;o;O#>%LFX zOO9qt7*o@wnrt@Sq>u+vpk;f9 z0Ueq9avR2y8{{wJ3pzL8)p%7mM^@U^M;(p-HogD}7tQWJMUU*Cq6hwe9N+)4TvRal zNeTaZgnvj8HV7)PTqr&lYnI%${2`e!j62Bd0FZcyX$58(F^CEzNp+<};l+_^8$?g+ z_Dc^u50y5bP)a!brV@)~NYfuBWhPZBy5fRWj>lIQ6B%p_4ldh21J3gcSyl=+?2u6T zrqEaIw+<0q5EC3xZAJJB>@Dv=Q3w^BPCBa0ou{e(oZy<^&_IH3onNh7>00_z7XO4b zE0szw`Fq#;rYW0<$W?5gWZ}FO^0NmhsJ5&nNARH4am`Wdwn^hV{XU}~zh`krn=pCS_0_}L zyS2;oYO*_Iq`X&IO-wnbLl(zi(mqSL^UUMNk^L9thGJoVaoYSN&`;*@CcTcd4(e*y zx%aAFQ)YXb;CN`?HFUGX5p6{F#G~gSwGHO3#W!hou4(-#sVv~U!wCJtOqk%ggYCQ- zgwP^`IM>d_bF*eW$#G{&_3BMx3s}9+a6Is<*o97zG2L4Be3~q7+(G_GJReE959Pqg z0@rc=x>1E&+CDKytbP8Rd4ozur((uiL6>r31URel=Fc|jPGjm9YFZ#=6V*YjfgXA? zRm6T=pctGP92%Sg{v9bPWcPG}O3m!q%K>fHIEr`6Nz+M1PjfWb#XWMf0ZubT|WX-8M%J_m8>jCgn7*$Bo6cT6x(KQ>a$T<5^z ziUY8PYu0DC z+ypp1s2*88?>D5qz;T{0ko`f87`-&UJ-Z~Ldbk>}HPpXuS}~kb`|O|ACnf1=y0L9N z-#r6y?qv7%Po2SEaS47tksev?BVNZqN4H?`8)8@Y8%woue)wxHARtD{$=L+)=Mi0l z#X?CA*}$C?j-}g%>HrA0mV(IE=MxZm7FQ=j)O*$=4XE^yNZx_B{(v=`^c%Q3jduu9vnpebe*s@V0O|nCAIOp66O=&t7NV{SxEtMukT_vi|u)X!{zAd`kLn# zH$mBs7cdU_O9}1r>3IO+8I{FoCdrz|og@rd0|d!M46wZUnf9Qs}W;qFXb_%@p97U$`o~r>{|OvMQXX(hm6&&@#kE zk3}!Y)}O9HVvjC^Ycxx{j!3Lsms*mIt`8X6AH4jKvU<*J|KHR`y62sfUw>$Vtv}+N z|0y(^SsNMH>lr)#Pjw+t1Huz=*zH^Sd1di6#@Uwu9v*&$b3g&G7mWZP5UzR2w-(d8&Gvk1Y0zhG_5+!^?rX^xOqP`Z9J8#mYHmd2f- zYPSW=mwLUvx%%_rTIAU_v$_8M-nyT>*tlt=nC1rkRlaisNvNj;QkK&gr&YP67YXnR zsR?0md&!QqWYqKb@y|K0U@btS3CMi&hEhxWj3#Bm6XSDKBxKT4gPAU_u7X}g4xj!oG%;~& z>gG(2-uTQ&){z$I($hDmv!5ZbQ+a23nQW#ejaed%K9HJ{#W zwSAk!vHjL06sYCZ{to(dfz@H5W9MUL`f^E-ZvcA5?K;hI)pvzA@^^G|d1+VlE#BadG9`d5Y5n)evDflsgZmiNq8%IE8C^!m>u z?B9RAHoh7@8$K&O3qE^ZN^ebuvvGX%KW=Xw_DzPPqj{LUg@Ys2eiZoCS^$_WYGj?8 zX(OVhhR?_zA|In4praw9^r8e@>NX4IzeQDQY1!9!!tgriAXxZZkdu1mC_A9d8B+?A zs(i^%h$t%ceav8vG7^!?|2pE#yL_T1Nj&Q-W4SB1JVTRXdNpK+Y4{sSY32GUt#3EE zQcM{5mxMvZ5KaV{)AId>2!@a}$u{Yc{9+sAu9w$cZae{gPuJb91=qWFx|lZ)nqAp` zh&y1&;S$Smf6CJH;Y$Z4yEISf=QhDYWQ>Ubr(_i2AH+S89lh#oJ3uQDt*Z6`ho8>; zd%fsWlE0PVfoZ<_{;*&sdd&$iUsSwOyjje5onkQMg=(HW!S;KoDZwn|NUf;*j?qxM zuV0e?v&?B!kUMdt*uiX`6@UW4jjMQnv184Ux)VQj{+i7bvdrF{`teUq^<8Oxo3s7h zV7}SYSKn+xl7aklmQBoM#jJ9_*BUx&U)8nA^H#AID9*y#4qhczl*RcjUFGktzOSwx zZXb#DKQwf!G!`s9GL4f7v3f1w&V7I><8{^j%Bub5eTHc60g04b3_JNXQCFuG$X!q> z{Y(>U>pOfY)2d=8fiV62PgdaAe%Pu&QW5Dv$+~pyD!#9d4v{LBur-!62FuUBY@@nh znXg0Sd-RkGXH~q)!4*YXLE@FWOro{lKA=kM6*(O76G7sB79oA>6`*_BV#G8LQhr|@ zAZElyacEa&`Z%c)liIsY6UNrH-)YsV=o$VOO#x;Zla>;M?oC9i6ocAkPjjo|x-T`g4`ztj zs4nO3B8;*1C_N?i)2*Fp!_=Z7=Wi9ys=)%59jWqgZ$!27L|5Tr`*QBMEuc(wBz4XH#4bJ5v|aq8Q8tP*Y>Ezck(X z#bS$#3RVF-RKhpJC^Ky|ckeXkfF`C!XcVg`RA7#ODq40YsuJRuC8{#ga(}SoW`9n! zcgd%XZnlVhiJI1oHEBUIM})7%uXQ=FdL_7rS|=HtC>Rx$A*{_EIWiL)dw|!x0c*+o zLAwWI_klM66CVVXLAyz`a8rOS%nt=`9%H*AQ-)CgBObyFcL-p^s6fSvZVb}zB!`+x z6L*Y4s)>?8-qPd7rZSC(ZDfLbASbtlW6lpSA^(i}(CctOoBZ8|It}waS^_s#SEN~E z?g@Tcf&|9oX-Vz`tJg$3@MpVkemM_y+zF5~{Dv{O7%mH{@7({EkJjT9hzmYo3XX94 zIqu>?evEz#@fNCXS9Se_U=SLC6OEAZ4X7GS${o>YJB?!zY#`$}8tqBE79|Rn>lE*E z*S;}58!~NjOJ2BP!NRbD0g=Iz)R;6GO*-Wo)^UKP#aWkSRtjNvMQ)B=gvNGI<4?8V zttrI2whW#-J6JQTXD%*gcLtpQjYe6JR#F~ zZ8#QXd3M2-T7(UI7urJF9A<}LS|K@H#9^>X9g>7s&6V4*U&VQrCQch=8+9D#x|kp} z41rh)J~%}YenQNob%!LkR=Ar4a4!{g3wSTGpT%qlrm!B!(PZ8q6}vuhyh$?_*fvy9 z$DY9|a4?q6RLaBgr`yU|*J6Gn1Lg2dOJevUg5EuX9zwrSFbhrod=B{9qto|4z-~g9 zcp@T(sNR*h+O|Eg`};68jd(6p+_;H*)d~pcEw3POAK*I2C{pt1hVruwQov$N>(mt> zc7z2RyD59XJ;`ZD?q&f@;QD0O{Jt(PT=a)fv^2Kzv(9Db0|F#|dRser7_eM0v*U1` znE6dx_b}Z~x68o=EO&YEb9*jbk<__q2xUqE=F%r|Od(WM36D~Ex5^za7zg;vz_(&% z6IRp^Py62au%m?6NOgE!hb*BCBZ~N|m++3we`=cK_4nyN8@4E$*y2(69#p-(Ou6&X z%Oe_$B_1lML~fDgoUz8H20h%%MN@jg8e;>nA6KHGzpTc}B1SGS#>A3~uUVukkG$SJ z4%bS&yNO`C>b={cMyfkOc(A@8YbZ!jQEJRE3*bJRWQaDy%#YgzyeyK;58js^L_&*+ zqBuREL@AKblYOz%_Exy!4uW=S%x)B>3TQvJN(Tn3&-ie%WD~Qty|3W)<3cPC2~%6A z|GX1Q*q&Oqz(h$GD%YMqXuqgZz1<+ z4@fc>mn;l@i6uP^yNDnk10o0+a+k35VT=IAxiF1`TFBl;ffn^kv|6XRY~SCNpXWvm zEiybJ+T4atoT zy0kp!f2+6rH*h7-e7~7F3W!TV+Hr#k;tSXO^n9m0pvNfmhFUM)09;7F7YBSg;PAZ= z*auPlZD1N288cCeT%=_i<}=~u`ssL_YjvBtVHV0mK()8{k4fcL*f_(-+@r zfncidS4=^UrooG7sx&@}6+~321^!TIGTS~cM*3X@{jwjIR8v`-WHnoQ_h;GA zZ^Ifbw{iMKhA`l4c;f_+E~BPjl{#a?VYnZP1Hw)9o-9NU2DzE2*Ko)ZYZ_LIZvn&k zVD+)I8qi0@{_ClsDQj;0woXOMrchl-vMhdWNk5g(wzDo=yy*a zEJ^2N7AH@aJ0qU6c7 z6#b|Di%vaqtPEvuBc$d$yDv0C!x zDU(#^@*Dkd(5MmRTba5Bda(-Wo#m)?)n@1P&8m4rE^t>lRwzlEf^{gfyS4> z5&1(z^Jp>Q+p#kj$EWPoJjENO`Y1jA3XJJk?o4Q!_xNK&Fxto4+OI(>rU^`BJs{u8 zujCu)T7w_1>sp+_6l~IBABM}yPVELPui$OEv9g8|5YwdyAtb;Ye5H z1qO&V^LQfP_IpM(t77y$0HC!s?)12NxajC^hR#Zi3wcxQ+eykP!nDc^rBs!-kA@d8o<^gl}2{wMgDJ5Bcg_R7IaiuU@O^IkAKDN ze_-7I+h&OP@0jinjn+)h@_*U5^nShe6#U$~{&NxjKc3-p{ILf&{U32=t7tmtK3Z6y zXZ{d8#9iPSet#l$a#-;|!CnaJA#iC)d?D!Q{2c&JaJ_Iq@Gyfs5r~ zHW!~buVd0KL6sl!0cJY|heZj)d2?fMN8cHpryr(kK~_KNtzRHt0AXNsLAiLhXnY<2 zW_fZsZZG+9>v>*8u6Wj315I;rJS(yW*<@l) zb6+3~Sa}V2x!B+UsrD0d%V>BO1q?RlR~+UF05H6OHvmt>y(m6$HAJ(kRtMuNi=(aV z?yhVASIFf7_#_Nd-9o;0jIgS+meLU_U<>diryoqRx8~IKdY=>X`IUoYQdnA6lGyGF zh#rb$s;Z9~23X+GG`rUodyF;o9tCny`TZ~7x&%R6#`Rz*Dk6#Rh$prvyV^-1UNR_W zIMTNV>+vCHhHO!sf)r#?GO`+JTWuSQvrvQAgbbU|1!1mau^s(cxMzkiJ0{jor@H=l zACW4ux~WD>@H-^M*kB?jTC4v8MV}oDGX0sMTAG?`&IC63ig3DK>ek7ZTfRr11K*=q z@*I0KYQ-lZ+-lard}#{(N_|cLj%om#z&)T%+3tqatIJhucX_tGT1kvW<&)gC{U6LQ5|g9i#wq2_8L zxBqns$r8`R7XknJ)%nAd`;kHV*G}F4nJE7~O)`}vekvk}U&P)KRv`L)40eBK&}pT6 zI02!c#6s^)0r9Nu{tz|HgmQt!vo={oyEPWh1hVvqoohO;?bXF7DuTE~1GbRqHBnNBsl^-; zVX>)cFU2m)&B!h2N*>%Ro3WZCjVr79e^+ESXYxU1t?Z&fZSC?e&CRfz9aol)-DN1H zF(2D&nx#`3PHaS|)frt;yJw~|)2)#}6b24x8kvnc!;cpk%#tOGs;_!Oz3WHf9NPy@ z$m5eaPfVzO#?hxVN+=K2LbyR?Ry!DXtpwnoZcx#;Gw0$l>LZ~|W~kk@D2{SG)iD_) zTis!d9YaKs^&GS~*w1zt5!)MkhL%KnH~e;R`B?(zXBj&T+rbK&qh$11IQQqX1RHti6^u?D9bln-B!Z`s3F?b~c8FS*deHelo^ zI6+3|1w!6pw8MOb+7j-;&dqWI+{I`Ma*f^+js06E)D8Ct&z?CWgRWQ=p}l@JiOpOx4-3Y^Q)?P(N4jba|~>Z=HRvur4m2fF&-zbQc2Mv8-Y& z_O5W_@ov18rHIiRH?7NxBQ;&oF~M|}TwPI&Ry{r^D9OT7Xm|*p$T2seQK?o^$V7+T z$;~|@v?`*gm@QLWOMZS9FZFFwe|GGC05h~Q@m@W!y?tZ*;5y9Sz-MdH!!_F;#jW0E zH=VzLt7p}$!4?Q;Z#uU!?+|U6id7V255qJtiWb_=Q1KJCU#|<8;7UJYR>4!?R>^g5 zlj3GcuBk_$9Yec;AOt$Fq5kX=f3yUHYXE+N-~nZV4`m)Fx}tA+;*9F$L}U1Fx#oj4 z3@A3Lbk(jg@76}y$aBs}Q{-B^_{d+7rvcBsdi)__+|kdbR4!VCU1iq>M1uAt1@OGA zZL!BOxhz6@AIrU3rp-nw&zg8H9pRDgWFjckeLE#2IdVPoSxc&6PzCl6=vDA<9=>O8 z-{pG<6)y5(9XCiO()`KE<>}$zq#HJ~c{RwE95)c~Nm0%_)b#QZm@HWa`nUJ5d?cXk z#hG%X%wlb7#tVT0Ww`)LP%z3?=NzKK{Z5pEg}&w^bt!6fmS-KvDk=F$lR5leKHn@PBFx? zN2irB6IO98BA=dOX)qX1Mbkv+hIstdZ7h5->XP@aoSHi@BSbFKNUGO1EACE8rxBY_ z4ORx#>rK_VBL5#{@BH2Awsj9y#kQSPY&#X(wrv|#u|KhGr()Z-ZQD-gzVEqx$35Mr zzoUP6{(wEk+RvJMt~uvgmBHE|Z8d7s9H27Ov|DoLfp?}_wju*RGfSqNx>z&`&$icpZaApb7 z!T0AASqd~nfki9-F#bliNegu=F_OkxEEH&B!TQ)-}upvmmXkNui(+YqI+~ol~O^BAqDfojKR{uii zU!C{j#6BCgQx%s1ra!amo1d|qh@^#gLp<|#c~F<-z(7=xKAVPNrE44tkrwkaYh_|a zsXvYEEkbchggPHf^g0{2P;j1YJ5|l~>Kis(;TC&w&czlX9s~6WRp#Dx*C{zKa<2)> zh|dpkrJb#67tdUMWal7~mqOQT>C5;cLLPY!^pOiiFjG1}uaW4@H9HQI5?M@Zw>Y^1 zQY&ZIelK_E2Cq1EmVL@`@o4>v{i(%dQvC8j;%469$L6S#IB!_<*eO3KBLM3~W%v^B z&Slu8#n!WR9@PRYE!AHc-D&3z3a!vS@(iXrihKsj%mx62F`(eu83xyM?w{UV)#XvU%;4)crTg0i>$=3QC>;n)2!2eB!Q%G$U4Dc);%q4-otl9{8Vf`Cmv- zpscNk{526~#kWFImChrNep)VOfRMMer1C)wk$?`3g+SGGjw`Q1aG5pwv7#~1*(Gh- zc8bfCp+kU9KRe;%vHFp-;bf6j+Zu%7m(h^IarwOT=)G~+hELY{c|S|{ZNiWv1ky+_ zgov!qn(zXG0aJkPMgYaHDV&0^Fz`t$#FHPVM=GT3m9YatAHD-c1itS?|65c*1{NQ~ zZ-sBh_Ah*1i$>gNStiC~!&Am%l5ztuf@P6Pa~|4dl1DA&*e%Y=er)z05`MOQ)RssO zfYYEvYihK54SpIGHzZ6pNeg3%ierOIyq9v042){~TGlj5Rx~sxs`_FLtOUvur`{SV z!w`*72J96Nm4ZlSQbOiZWlN3FRAb2YIN079^m>Z+N@V9HdMU|zr&)p<-)r~#(A3i6 z0V|8qpk$s&^5lX*B@MCb z4C)^s`wDC(qRu+1ef&K!eXS8zol(|LORe3&i7Aa1eTh|BLJbC|>2TEzM%4651!3k^ zrmZ~n=q_?Yr{T(lGaW4u3u#jT#yjTlOTC4{2i8F?`^@Vtd-B`5eC2bfm~Oq`86aAWEi7pR$j+uUmK z6LFI6Sj8M5jY%f4#vi&$evO7Q>D|FuqfT`iq$ftS=2|jeYEtD2j zQ7ljT6?p3nZ@TbppW))CUoaKH7Z$IBoTRGcVVA+&fjRSo0ljoAVD|{w1<^B14_F*% zl90|>O^C4RSp`(#`#7yafaB1h^OwsI^5@S!(3)q79l1_VHo-Jby>eZh5_(($j)40R z)ck2@876cl92l`y1ODKiVMGE}^+a*&Nt4eMP|Hvz6k3^%9anMgXJb0oRyQwltsMC~WQ4*f|znux5-g88*WcsLGB)pU*jPPHPVNqz=*}+EEwzAMmbz$K%Dw z#T-+_+!@9u@89x7!JyfNm!$H+#uYazDRyAKa^E^cD)~LlRTLi7Pe{~Izdl9&0==j| zv7v!|i{N==t!8Tuy#m_^7b16?^`=7%Inxc~ouQF|m$Ta1QmM;e)U=?e^-W|nOvfJ) z>qNsH&JQ0eGLEnt?L?ZI)SYf!u)+p^eSQcg=cfM1*Lsb&yd+!gaM{%h zukP%BI{0Mh5U%(%81qBfCuE?*Lo1xZZye?9s}&@2-tPL_%k5+%AgJxDsayTOC3^hT z*ah`1{}Quhd?ox4DI@T(b-`>!8xs!uL`RmBstdTdGW%2@|?4BMjkcfGW8s=oZVE|Rgsr@u90*QI$sY_ zYqkooY)UjlzEC(Xxz5OGgn8BK93dP_YrYP9)#(RXR8RLHLKs$-tcfbz#+nlim5>#U z(Z4+`)U;KHt<@y#q&d!6Q0#aeYGV%JcuhBG^;P5V6k2D&LVp$U?9+9XFqv~cu@NnW zZjP)r57x11op!L2&@J5kBye{gxHc=+#%e*Jc5r)`vufG{sCL*UTZ^}Z$qrX?wafH+ zS=sM0&|XK^D&d$H8%p=Wme;81S5FuS_A>mOwey<puzSS|j%TuDr6$(Z3`+Lsi>c7;as3k}}uqmb`GSO`H|6*nGiEPEyp!(aw9hpWIv)Pe zZdC-=olyj80Pz5vutRz5Bn$!+5iw%7b7&QF#0`R)C#JeU3sr?`zUY=Ry!ZU+6_mH5 z#4qT84t8YkNO}y*_0u|uNd(!1NosfmIKTCrd{oFp+@NQ@(nU(k$LPGHV`*C{l$Cse z7`+^4i59lnsTFAGY00hXyirJBu@3ls^v(#PjF+VyqK}=6*I~`PeKJ%TTd-SvY3(=Q z9kb+LdljTH;*`9EiIZh0nmlcu)XCC=> z{ZmK6oH!&^2>-UkQjll(#d+pc>>Z2X%q@a`oh+h*@#l7r=PH=kXJDY-$1(BtFww96 zLMu;(WSo?>2B`zpw@>0-+?T-N+Yq12k*CLxzhwzn?BcWJe%*VEuXwM20`!9V&Q?Ya z|95<~vgTKs55k9xSIpUnjooa1^HlPTpP?BnO?`&&JaHs7 z!yVfdwA+?%QQMWATb1buOfM5J)Dll3@;31~47};&^87{P=5p=f(Vxz&&+l8L9TVAM zToP_-=z(_ri^XAc{fkMd7F};Mts4p#mLqB^rXdf+7_ZH1O4I zyGZ-qw(KXLZg*E6+hVq|szbG`GMqJRYnF=+7+qD&BR74$D0Gb3);1gcMtl*I_l#7r zM9f^h7fYb>CB|EX;4?jN7FdA%lNUg1Mhg$qaKnzF#%zLQ^l+1{%S;h{#_iX-AgEWu zyXrpro+gTyf@)Pc0EA~o;sQk#8y04(4*0qXpc=l@%eqW$AteU)DsXLECBLznD!Lle zd3;M|6kwdqDrVG&kln@VxEfC7>|)+@YI@5|o63d5jaTfQxpxOHkZX~nIa+VL2k-V| zP`QcP_k(-}wd#{SY~l~VL@Af%rg{>C+^uSxdU7ka89ETu+z_RGQ?Az+1V=AYe+p8Y zH31sUW^1^Z@`Y;dl;yjk~t!S8Qa#SxR>_lQWvL z)yft3Y>tgKIg4zAtdg9BYr9iTYosBXccajbf(FHSp_JN1kN_DhafGXX;-0U<*w^Q~ic{2@A+ScISy zay=%bJWh)+LYs%S!tT7X){jfJ{C8Gr5+`nn zgc!)a63AlZJPYPri@j0r{F$$Nibs_46o}84LPFD-XmCFyin&o3(-YtlwL#JWfvATo z(6WzlRm60)5xKqp5$-CpGp!wZ<&(|lQuYpKY|2-(AbKEL9C$`pIsJn3r(SRj@0ZMd z4AtH%`{p3=a1T}Qek}uBqalt31DvB+9ZK8n?*ZO9H37l~0gHAx3{nT%}}fg zLx%GG-x8JbtH!#wjt${t*~{(RO1CgCD=5{F#X20g$<|PgX3+p3JD{Bg&}+0DneDo~ zbgSJt>MrKSO?#S!o?^%R`I8%rZQ&fX*tpai{$A`^>%`K8kU>1 ztsTxLR*q{-G@ky#il}5&6;szdzGu>U3UgsICQsE8FS+E|7fZ?`r1N22eXT9%oQDrF zijG6uiHFZQ!+m>O+NnC4ZV!!@QXw$SAJQ&p|GE>X?g9g zDXZat%A9@c`U9TWet0!pIy1vqMBx@QAh|aq_G5Hg1?v=JTRx~4C3usP1P(ZR9vjhYo2UCFQ#CQl(i7adMkrPWKh{;M*taK%@c?9xo zK>B(d)m@_qpf+X~&9g&t+_CTHW*iSXM@CpW+VLn0<%>~+uMycY5ebcWO^T#ioK$G} zjajOTA&=Cg4)RD`^bAFvgt#S7pu;be+%ha@Q(=`M*IeI^OEGT?N|ODTm-|=xy8cgr zcw3=o$af$MQ-@L-j_Jg=tzWVDNGH0n*C8A16=rv|Vr?IP3l%wK1jV)ZYG*Y6Uoh5I z-|DXkgp#G=zXny%)`EiZ!8am8!Vto+9r((1-(w`cgZ4cJ%Q0e5h!^DpKB(>mPmdyY zO@GDjwja+d)XigZ&91k$9%g!8thYWtpPssYOS<9&Xo{6$bXlW%H}&@7&|TixMFpc= zrcfSKcli&GzCxiXo1wk|HzaaKA3PJbQrFgxsfct#8LFU`L-yHlRqjqg)}7930>!x7 z4x$~6uvfNgtZg-%uBsaBz)GmGzH6rC^MnUc3_`C@mW2I{@r!=J)1LjjIDC*I2%$ z@e2UIIEBZ@`wL11Us^wb4z8oJ%Uq?NjL-&89&jf`=l!Y)Jms3+d6HWL3Y87=FSqWj zul;FV_PA+!?j^?!8fDhLjS8*qIlX-v=@^NN3{+W-+9yZ19=q$z4*}&`i~&iovsh7zcPrpsys&$Cu zr?P9KWYMt(eSs5eAz98f+|1^o+l46M)DTd$b%o@avu|fku%o7SsFvANQzrIi$BL!i zeS*IWd{4rTJCnH%7JtE>;gxWB>7BUdJT%L=RTg-UV&YMpLPlzm`NaPIabWx3W5T4g zHEsW|melYS|3mr@w4k7^p{@Sc{@Sk~tG~v|2}*x;riBVCG}dl(K9KmELIF@vc?68S zqa7WXT@tW2yG54r^18xP0>Te`-f&35|K*V#!;SpO`|^1v-DM`-FWL_`R{u3v21*v< z1pK@kjPCNsaEAxQjn08$Bp-{W@3oK6Q!?TSi+NO=`o7JBXd*Sx6j21jWO3bf6Da}s zrJ!vqN;6-kJgWNGWb1*}IA3Sk^wvI(+c`|55lkv*M%7FI^!O5cj-~7@zJzKc=P;VC zuL;F3hepjn6<2{T?XUcc3n?UsyrkVsaS8cjw5r(K+?Z!+3PtrOLi;ccxHBEAPZhUs*}gLt?7hGSTPxs!khDN+s%c5S$3leAl~7>54M?@2Pf zBHo=%1WqK`CyZF7C!k|(zC58Hu$0J=tY*;i9NA;F^mv6{tS)E+6ZVafi%M8XD05)JWZtb z@zCqHDUgI(S+JQ|)pqY*{3Y;_-f7M(VG%R&mND z?XQ3TzPAq7j0-_%S#YyAuh9F>$5h}v%AgDW4mfV##ZBuN(qBD~f{Bdnn1pW@QRW%H z;u$?w9z{krc4{0w*OuWs;U$W}*behGSOye}4d&#Jpxgeu00_ zujN$#q*3}$ZT^LfR4f&dO;LPU8>MGZ$v60NbNg6@hy^t39j5JO&Av$@Sk~9483hJL z=MV2xR499PF6#IIGo7RF2_~DHru$sjI&gY#tdoQi4o!`nE#G!{PB>1uPq@3@PImtK z2|5+N>GicClb6#@IHWPK=|mKI192x6VKLBcF&JS3c_#?r^7RTziMKxAEftCAJUA$A zr@MSA_GcIep%dXjpc=vzCT2KejZa+|0qzha&1FCMj?Pssc^6Fe5Tv#E01alN@mh?% zsvpv*Nqvu<2n||&ZiFWiR*+*!x(7v`No0VJY~0rIVr>fp`Ik2{J!T7QqM&&dW3hIn zZ^l4@N~&xa#x-@fIX*Q-9=b(sHI3F#hEBpP>JX|nW^bm)&qfGMSujtYR3UUubX0CE zfbHVon5>`pNwm(3Uviq0Cdb)=!tyA5B|>K|6ldJTG05VmnR@!M?{HqzB7mr?nVuL&^=ajfIR)X%X9}L(E=@vUs_kh z>Ig(p;hzOhMvh6WrgQxExS5*+h>@r0Qz4s@=$Qd0eoaG?1e><5zy>ar8t-H>6j;tC2&iEnKXoIsmftQLM(QBdCX6Zs61EQh^NrTOZQ8F3W z33impO%>QB9GU$D-F|3lcI^#Y&=!tbyQhj1s533%bin=PaaN!%fn$w39pmuX&J$$f zqVjCamWN{RUQ&~K2}N8C?(Q$#d0Lp#QjQ!99LBVwc?QSwx9&8f=r7e%13#Lt<5zB% zR1IzMd&bZ0LpEFB*b({=eNwOqLgPf1`{yAqB-=cD%c2*y+yvHr4dZ<_d`*UyLTxO< zjDsNnx3u&gTg(h#<`h;u+YK!2mWV4`B3(jDhU&`@0;m0!LLTc{?fMsDV?zSG=6Qo| zt~a#7t3Z}^^F83lPJIEkjbkHMHL!Gbif(ZW_rMtqB^b4%SHX*0aQHOcilOs*2Ekhb zWL|eA@w;?`w|VgIeMrf`tOv>~5R(IpCQW4^%|L5XVseg%Gor;{e#&9y)c$NMTLRd9 zn6;K(w@dnH=d>Va8{l2lq;We)89$wlI(yrVef zCvHg@y$Ez{>E|+JjlrYkG^?m^VN;o}z-4l32Y`!B=?*;s_Hz`VHqOLpjA(oq>RxQK zo1YjE;CM+>SNZ8<`Tz{OOrG%RPa<&VbV#YHq$GAENJcJg;VHe8Z2mNY6qO%mt-Vr9 z;EPNF#KD98qIp);2~K~ONg3`*m=mY!6fS}X*E$tkcb=7N-m_MO2dz8Q@4u4im&;eA zCMeg8PjTCN+B_1gxweq{*+ABINWr%9jzrRBQ>cH7)9=vovuj;uUO+>7hPIqtsm==kM;s(Q4o zn`=1OZK>EMTY1Q87=`={Tqv_#5>0ME0vdm%D7V2k`)PK3J}1epguN}V98iUtLqYi= zw1i0H5@aKQQ|bJm%+XqwPB(q>$-YbD7(pyG&8WX3yQ_RV#W|LkJuKOxIpyAP&->qq z2kQyZDD?~J%zS-6{t@w5**g43?aFm;yZ93f4D1J(jSHBJ3mB~k7~pOW>F_Q6jYtH{ z9#%T*E!XKif9C9L49PobM5!u(MNXbUD<%L;g(X!#0!FL*xj=Zh#3qHKBm%}u@47EP zU8%jiuSQ4&Or6-eIh3SCI3<+h#ZEW^28h7;g(KAc_~k=fy=0igDgq_~Mhb?YtFLFM zYpkoM>s!7$=F)GX2$(YhdoZ|f|9!Mna)h3-FXrIkiwGzD$D>(W>)ROpn>>(o#1cjL z07G-B*Aa&D&=_KsAU5Ss6t^05*P}usSS990$r-9n7p18xC6*bKTrjra~j)%L&w(2Zyq{I z7Dx=2Ms;;IYZ@GXY)+iLBH?|O5Y!Rm7mU%oyuFPLqw%?`53@!!4!WWlbbfOV%EsI@ zmSfZzH%T7is?#(fH=|~dk{~R`F(i-xtcsD9=wA*?b4%%M@ zDJ5gl$@Y{*d?>zP>}D;P`+s zFxsKaL#`&R-m%f}{!@tI5yZX!_C%;dG}2_s>(5yuj%$|wN(B7eOl{%OiPD*z#eB;l z(k=;5dvnsLDS^&mX2FU=@3ch1pvyd2ZO60ayiM3f=~K{y@t@h!6<1sx0AZfiK7i5% zmb)v=mxJ2TJ|=urs}I&IJQ(cZDn#F=snBV#Wbq6Qd;*)fdlA+v__E{&12AMchnH~xr!P8@$>O=-?XQA!k3^Cjy>d{rBw-2H5}0821{#QCpQOnU5n#TirzmtN6-5* zwa4{lGcWH3$yf{&N`i$-x*?Dkk zVkoGmJu`AD$7k@jaVqB2Vh_z-k-yJ;qq#;`L-#e!2e0B&C`yn_;Lgp*cpcaCJxS4Zq}2?^c%8tbiY;?~o_Nz}<1yM;~M=1UhY^<9}d9}+$i9XyLapM1aQAM(6! z6;cud_)ReDiT&m6zaOf?tA)^C7$$^akWhZTA!zJn{0JaIUgH$s!MOa1OUc3`ce27) z62BTnY16jzgFnXo37hg~Ag0}0!CtOejpuM2IlvtLj_mS}d_OG}^4HQCJ8rNmSZ#6*&agh<`|iS_y| z!!>(+_*N|C+F#!VG{9sW)b9CbB9o`pwE!Of^98(%Q-?UZ`v>amlS)4^>yp>t>gBT0 z^4=5m9|Pp5n_I7GHomql^8vKt6zb^;LW;vOO)ZaEsPz(g zvMuK?m0PfPO+vx3y!q*}aQE5*&2FzaIF~tCwP0NkRcv$k6g|*Z-v$SHsx5xWjB{-s zD^kAeLQ!igGuIbpa88b|IkzdaYdC9Rg=gFNUgIrFyiZ9gplJ(z$ zCVquH?-=;z&c}U^mmBKqx(BZZD3_qJgM|`ai?$EwH?vq@o2tMh$>zTl1xHzN@G)KmR07eE>5~_!C@ywWPqX{_b*__H`vCmL~WufP0o#`T%Uc;b)jR+RD zaSqXf5SnSsD;pvu{pdGh_bF-}ilP3MZsesgASyng#LhmAh;t5c(0Kj{vWxv9dbIcR z9slVm`15Z@l~jJmY4)$1>-g2g|A|->GIsh}Lt*Qnpl|-y7@$B=QWjYrgQpR`5Js2^ zUKkwID=}9^?%EeVyP{AW6*vGCo2ibCUBM(ZrDQttny$&|a3T`g{(C6&?h5ao438^k zJlLw96T_zW7{{UK#wBm37btz802?VoK_0kjLUZAmvvHxb({2zW+x&H6(CP_&-Zmhp z6-e8adiCZKQfPLU3aC0=F$O4DGLZ&-*)v8k2eOA?B#KgJZiN+a@&hUe26q#My zVeS4*!`ra;rZ%mR4zkqbb|%Sq(;i*Aj8o961%v%ccYX*(_&X1sWhFJTE+Tt}TBEn6 zVx?N9@Hxk-i`Q%;PTGs8 z0S4K{b7dg4#(f_9g2NI7^&Dm24U$c2TW&^6eOM>i7ilr-_EI&21mnU#4)fKJ9BFu; zX;2xb->BN|3bbQTL2pC2mcKW?cE+`?kKK%=SAFk!IBBVRNUy%qplhQZ)sS?ot@WGlzYyF|cgP>Z6Vz_OKU7`EDGPfGKVOcPqXZExQ9W04f4s>eo{MIsiuv z99)S@Y9_RvAUX4ZlT@%INnhk~y>y*)QlGl(;FIbOb=P>z%auV#jqWfC9WIN07)J8l zTKnZ$&w?E?9eaG0XK)4wE#g}Ho{wM{J!NktT(BG#I6lTr2+uBo4HUU^lGkPbFSN zk*1=b)1)1SO86(mHgbaIu)#5C%_7Yfn1*iP)$ay*#F3x|d9Z4VQqY3Rt#RzaPOsUb zA9l?AqSx<$0r3$hCnKCAvv_^h(p&m7U0oAw?UKGzr5&ESCGfsne0OYEFBi}dNgC}l z==Y2RbWviKvJodRQ$hJOA=JVchK-!YoVNquJH5x<`&DZ*P3e0Pk+`!(B}x1U6A`dH z9#Q>$ON1Cu*u!58`4Fmz8aW#(N1l{sDOf|e#2q=WinUIW%!Qvg19Ryfy@b5jH@h$@ zo3b)>(YrKzW1rDvAHiNR#lHw^Gx#FdlAeu$-xB_&Aj7#RpuYH$hJX9IfByuah0JY@ zjQ`E&dn>Gd*~Acd(w4q#Vke0Lf2IVqQ|(GXk=lMoOQaPeHjA-awU16;lt(rePV*>NwejSn?Pr=??s~Oo4#Mzy7s4VU2_sMaZGbGaqQW(Uv8;~!a zh{CMsFlP5IH-zNb_@D`yXMxAM9IT2D?IX$t?)+jieTxV-ELE~=LH6G#bH@^q&Y7t2 z=0A3kdFCiek7SP@7V7JjiI0r+{l3_h82P%?U=Q06iFLw?w?)_+26asw6|BQ{eQP&| z5`)7$!z^yitzZ*{dX_y=CGqF(qiu$3S6zrLUPpe(yGO5ahh5^4I7=!Q(w|9s4O%9T z-cYTBG4sOyxcn&FwZuQck=8N6sa=KFT=)FhZ)Iia{uRdZ^N}&uiNJt1d@_4;`h7$H z^LK6(Hl@bp!^Q)AI&3OPIH^B}WU2LtUnr&)8IR-{@QBg(aa%of-f}u}ZHQq}b$37_Raq4F4yH^*_b( z*IP^3`b!s%;*)4qBd&!ie@zl%9?Akj64sDQK!ZT8M7%&?;jJC}mF7k&jfT3qGI0m) z^ah{0|FQg5s$*>F~088YV=zeZdQ8o{v5|GF2;3c%4IIff@V|pxVB<~1j{^S z{P;AeR2*!J5X3Y}<%3zr(eQ9Ul1>eG znnb_T0O8!XgxEN!Wlf4%p|m-K@umH+j3NX6-k8(T%0ueqTA6vmqpH(H?omexTHn+Hm*bU=l(L4LT}@WS^LK~mhv)kHfSOUuEj{&?yxVW6!<$=akr3ZGbg}b9vB4L?UgLVgcQJiL)o2Bk637*-^e|sT=G=8g_on{UL9RkS*Yeu@*cTqG5UZ7DPD= z!8w$5Im(70KBk_ZAk&2iE2kPi{l*lI2xlnjIV)V4?_Q3~v$nxJCRyL$klMXP@0j`! z%4>hliUYm_L?{=k!P+s)<3t8g)!Hf-zA<@~GM@HwSlG(GyrGHmIH6d%IK_$#S&3T#3+PFdz$o<;G zbPV};-|zoSzF;#=tIN)ToCgmv4yh_BEcD!01_iElZdsMu7?E|=?aj}Z7KBxifp%FKmVAG$at`WC%vX=$N zhO5UNR#cZIVRKdK!zu6WZR^SAWiBBB+#I&Lb86bEv*w<`0ymK^)i&$l+<(u$e3`v& zn7wJ(EnVYtFqwvEytw*^#)@+KGa{-&%h89oz^G#T^KXP0Oiz_y{#QG{{Q5}#fe;fi zclh6xZvR%)ct=)4_0XdTUzXL^J0tS)ExIslosiCm+aavYA_%N3@kzh4gY$MpA;s|@ z?_po~_cpIBzFvb=^>Yg+5|L5c&M0dg$>2KC1>7Vw-oM2${GQEtS}C%R&S| zZ09D^^TRyx3hzJ?!s68a&7wr~n}Oo_3%1aF!4~@e^Dza#b`t4-MF=|l8^wHOMB2{M zqwv_ok-}n98CJoAVN)BPV}$ehp(D&3X)sjaBT=mOX09WJqdFJU|dH#C-n&kKmew$0JPXW`II%&8y=Qu1dEp=_Cs#Jfx#~S(+ z23zM!B!9bjT-TEl)8pNW8?9t9i4wEbhIo?5rg@N67B$nO+s=c$0ES6j0>hx5O88vL`6Kb;-#dvND{~g0{gfN?*O`DRxk>GtZA2 zheeneJd#*GG~623MYk8u0!Gux{PVEjT`^Ncsp{@iDfsbs_j=TDndHwDA>^PDrJ_~d z9GIY!Pdrg&9fQ=YZ}rC*21f`tmofF@<41Ind|DY28%* z#{?NB02Y6g)K^}+@QiZ^|`20o~7h&CnRkR`PFC9P*R5jG0BtU^`BeAMWU}-#{f7JFWn0=RQ z4|wcfg0#-3V4T529(5oPa@^oyPuf@RuYI(a9B=oRU%OE;x@?dtFwk#fk|7!5AnWug zL(RvCr~T9!@X4Cek>gNrLz87;$H?S^K?%QndK3UtzYi(2Q3JGn&55osD_*uLi>*N4 zNz}3OLym$HzxK|{Gpad2Qzmu0=$dsIzg=|I2?cASe>TBjqj3cTSotz6H!j zBiS6yrfKDP<^`_4DI@)v@Dk;|8`Evrd4iXGKSNy=sm(EA^rt+-v~R1yi~%)6J84H( zsxO_iSKuFMFMnId2}WYR5&K2Mg&3W8m($h+#Amucl!w&57uAPCN8EJ4`M-x_7_ASbF57Iw0EMvdPY)&$T^X^c@4E`U8A;1rZR zvQ^>l0X;textWFS#T$-(sTTL7rEI!o8`7}TH9carI6rV;%i4EAVl1j#iJdK~D;dj) zOagL7%E6;TJ2;OvBmo{r@kFq9MObhRZM|ZF@dR!-C*Ak<^{$kDtmM0LnlcDh~$0p4clMiLdLy@=3RkT z81{*-I9nvrlDM5sCBN$1m;WG!i;CX6g#8%nl@PJM1C@$p7-vd1Hc|J;G$o##V42Xv zFpS_3Gm;QZ{FWzCB1YT;+u@Bv9jcFF@r_KQ^x5+8>6)=qUjT14It%idA;_*ZHJx1)kn!V} z*xV;!Eo^=(ibx2~{1Zc6-WzM(usBQK-}8@YkW`^DzeG#MU;XZ%+q$Ejv5n(@nw)p+ zroxv{cA(RGmXzi@Q7(aB1yZ&$q2EX(fJtoCxB3@`;t?pD&1?oMGqF_c&JXvB33kBl z)wd46%N;jX_C#o7(pT@-(M%rChsh}2P1-M;mpdMGQ(7+wn&X^itedPbzkvLRHwAn? zwIqXbd9j+I8pHXc%^3{V+Zaqw$1*N#u#J^VdlzQvpMr&^9~cUQuP`f;gO1*8KK;?O z2~imF>)E3Iv(Ag?|sQ#?2Ec1~7;gM>5EoX^H$2LgN@SfWsU! z#4Ovhyzz~*H3Ub!p@h?mYrKYobH`#*(qW}=z-ALyoHHpw&2d#)6WGO{i5GCRCA)U4 z!^+-*JEpAXHclf5&Upv>?BSdtZ7jfkGl~8WelUk`W2Tx88HPY)|8kPK%QGJbn$+o=DDVuzkR@YwN z)CV!_a$%`5nM`4NT|Ip5s5RaC)A{QYxJ%j!)E*yRfITvp5N11uPl5I;%p6pKKb@a5 z0On_0D>TqD0Ua;88j2c{8rl$Kx!6*vFH24(_7L`x9E2(EVCi_$xW{@a6^M!TpbI{^ zljtBDs@H8oY{68g5toY1p>ubsb#fr1DOeJvaBZ9Uf>rYasrQ9s8kV7C!iq|6Rc*U< zYv^L3WsH(c{+Y+T!-kfGYp6Eg8bh*s@ zd-Vv8k_usbO=-lz2uYyhDHp)9vw`)zWt=(=plC0RXi{jJsFSjp5?XU?MWVql$Nehf zH>v~6SvzZeN&b|#%#k5F>?D1_Fj%l!X11cY?x6nr+^Rq$;YFv4IB=uQ60PxTX0o`r zweVeaTfph<$>k}0Kdd)f@)BwFLa+^(tX9#nIMGQWczKbN(gQSk|2b?o^)77c2ksHL zw^+4oeg;uRJv3FI>fDYK`McnB>4`VvRr2CjzEp*ov6Z=)E>i_0Buf?M0CGgIJ(|3) zqrQ}$lt>b&0nlQvTNoXT7v=zy7wW*G8{Poh6DtgIQV%%<3aA87Vi&ZpW>cQs$C3=x zaYN7i=aR(Br&{w6EbE{7Soh^gt^V;#rLqL9_vN#Q9y#n^({v?PJ}eodMT@AFLN}YM zHrFKUD1;m{1fq4eMADn&PCUE*Ol!;PP$C5?HMrATife_Xo?IjBSj)4Sf&aMhrP#GxKk~UY}-$-@s_E1D&vLjss)Qf56?I(6+Dxc^I_H zy&k8dom+y%o?)+f8l%YTp;M#jz`e1bLjrA)Bnb`$x1e zN5b7BfjF3!Y5Sb(U)p9ndb|nzLFDD~CZ-z9;Np}3OM_v7z*y7kE;!N(94hC)uziu2EP@;DjRVXj-DUQ)$6)cD zB_w@fm)!dPkUjFaV$hIP{GxYUz*zH!;$*k8&{N2ut8g(z#+a+I_G{)_Q@?B|#)CW>CxxriVB&75cFV%i|B| zntRB3ki?5R>8gD@u!P5lb9x}CVi+xgp8g{==Y`W&??3*%-jURZy3zxbwQ2xmEzbY( zD*iR(DQf^UwE(yY(JE0@%3f-LIP)4>0+_NDNF^_vsjq5CiEEC8sxGnNyy1Q+^B|7Z zxnoeOH0PG1`>WHK6UwiB}pAu9j^K2UzX!-y^NY~TH)7uj_VCGwy#P#{Q!~D&{ z^Rp4>Kh{T$<@i#a0+{Od50dHUg4lN)gesn4r+im>J8CoN8TQHjg5taU+3+y*YT~ zGBOt@UoyGEw@Hz`OlK!L`_>el8Uwp0yg^xD@v!$^488J z=#&&#>mJ$-c7og$B25-996cw4cwB@i31K+k*M%}JnX^T21mD`Ju;R-~5kyc0mY?)X z-5&WFij688BE(j>^vh0H`IwL4k|EQ~ez}MY2XrwFSxVfT2PVXxD=;b)h-Katd8;$N zJzO*_SskQ$gL~u!Q{>ASMm$({NQ^j`s}t&mj^3sYg`^gz23RfVj0btGO-aYf8QP(R z8FPuBOvH(112U3)AaxJ*!(0&hzF-D^eN3>|r%a)#>D_VtIZG2^aeb#624BkQOjEGm z1I@i>n{nW*JgmTpv5S9$&rgxDIChM6>js-8s4(1+x5cc4c-k+4qsLzhV5{1JxuS5z z#T{uW&I#}a!G)lw9q_7wbWt{`FE246Y3!(pCS!|?r}Cz7%j%p-lq`(%hv4ZO{xQSU zAI5^NAO+DjQ@MlaS+>LIS+(P9`xywQ196)OXJZia(I!_laQ_`#idGz@Ty1`^-n<-r zsURuHRKDE^leG`dED^3k8q}i2d4W2N$1sI(P;+X;;m0^gTutK;nAnOVeX8UGR3vHK zsGc+==ZJBy*;!rj@K$^NQUkN~#&4=GS$nocR_|I9B4T%ZH{bNEsj$fV0pngTbyv{t%d2Q=uz$gIRq>vAs`g;-^ZK+sfjRO#Wu&d-R!QLVqK|- zHr7%Y=UP=XnNHeiI&@PA9X_hBnQ^?bst&rQ*kR^ zaSz#pQ`sd9;us%BH;2%&p=tTCt=g6j-seb^Gm?NdqjZ^*X5R$)hhsP5Ccq~gy9PO2x-sJxJL&IxNbaE)AR-H(`fdgK3Z}B3mJP9}X6hzN1qZh&&QKzH8}MT$>)KK`CL7s!Q10 zJl_u1g8s#V-MOl>t zU;E9CIe7CPvKSQ}%A;Zt^~pXmFuVMU?}hw60VK*ZcHT8Uw6))^MS|=(rO2(XMTfq# z^Kk4rFFJpkmRVywOPg;P_8Ac?$#7MRG215b{IgQwS-~&9xnTyru601~OR%OB1{J=` z4V_c%L#xC2-drEy7VakcH!LjpwS~Nzu5=fE$u-!SoDgh={m$D<8kh2w?>8

)CG!Kf1 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 diff --git a/libs/textures/blocks/base/angmallen_block.png b/libs/textures/blocks/base/angmallen_block.png new file mode 100644 index 0000000000000000000000000000000000000000..39207d839c0dced673d972d0b52819f4a41382dd GIT binary patch literal 454 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 AV*mgE literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/angmallen_molten_flow.png.mcmeta b/libs/textures/blocks/base/angmallen_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/base/angmallen_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/base/angmallen_molten_still.png b/libs/textures/blocks/base/angmallen_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..7116580db9bd38c0777782461144a0b6a0a3731a GIT binary patch literal 8148 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/angmallen_molten_still.png.mcmeta b/libs/textures/blocks/base/angmallen_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/base/angmallen_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/base/bronze_block.png b/libs/textures/blocks/base/bronze_block.png new file mode 100644 index 0000000000000000000000000000000000000000..2ecf21281f433dd06d18d579fd37d26f4d20afac GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFh@s^ZqZXgqgH>Ka{0hblLS|d171tz=Ur93tFziE zj5RDU;VGwSx6Q}j*KX-O-~W$Myig+P#0y>(pgpQ3t`Q|Ei6yC4$wjF^iowXh&{)^N zSl7@v#K_3X#L~*pT-U(V%D^Dom!AzqLvDUbW?CgwgQ2dWX^4?AP_>nzsjh(;Py?5^ zvJ6mz6v&3){Irtt#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RRg- Bhj0J@ literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/bronze_brick.png b/libs/textures/blocks/base/bronze_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d6b808ef094251e0e68da97a1a4b0a367fbefb GIT binary patch literal 404 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/bronze_molten_still.png.mcmeta b/libs/textures/blocks/base/bronze_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/base/bronze_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/base/copper_block.png b/libs/textures/blocks/base/copper_block.png new file mode 100644 index 0000000000000000000000000000000000000000..77213c5d1892e82951b1d28fe35c8d0eb2706e1c GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFZ2cz)m9_5c5Whm9Z402MGMdAqx?C8q7D1#&p^-Q0?SGzbVVOn9+mK9Ip#;1LNF zJu7- z3+6iP{;wrh;U9l!zQQ3>zqYF(ZVC4o9(H_HW0=2M;6T-?+%iKUgHxvqh!m4QLFFFzZKhTQy=%(P0V218v#(-0$LplT~aQ(Xfypaw2+ zWf`CbDUc1p`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76Mf z1oHj=|6hwwO%^D{nB?v5!qT5{GZ4t(%y)Au2GSs)z~H}bQVx*8S>O=~6y!Sq!i-th zIypgtWd)AuK;1wl5N}Gq(*9nN|taV5nKLZB)JPgg&ebxsLQ0AWgK A-v9sr literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/copper_molten_flow.png b/libs/textures/blocks/base/copper_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..dda5f8bb0fcfa7c9429bc8fa77447d56a079ac57 GIT binary patch literal 11063 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 U!gO>_%)r2R0E8K{ zu61&P1j`B>(}4;>iWwL-rQhiSvMM}X978y+%l4e*J!Bx#yx(NiDZ^*(k8bSI6R>h* z);YlXZiV&~&Vc97rgrPrPxB4fbdmK;PQI!@=+sIl=N$FQt0|so%!{gz^mAQXYaFl6 z@>1d8yJ?Ysl9-oQhw}fNtN$#{BcfV%o7ei%Z-+mN^ojmHzj4BZWA~WtKQ7>tIbh@P z66gli64!{5l*E!$tK_0oAjM#0U}&ssV61Cs9Aac-WnyV%Xs&BuYGq)M?aR-Gq9Hdw zB{QuOs=-j#&@{xz7^vFH&{WsJ45)!iTv-OFK?-C;aDG}zd16s2LqK9?UWuNcYluRb Zv7V`(p@G4dqJ=FdgVk4;8MK-Qh}@H?Q8rKgKy2*>s0gab@04L3N?Bndi9PAW~{V7lzq#nW~|=#0Zu w#Q?Kz1((@OlWfkYgfDR0kmbgh6UNMNorRg%^Zw53KtmWjUHx3vIVCg!0ORL8Qvd(} literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/damascus_steel_block.png b/libs/textures/blocks/base/damascus_steel_block.png new file mode 100644 index 0000000000000000000000000000000000000000..542098269d9444db09da3ba2724d2f29df36b1e9 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF^ZqZXgqgH>Ka{0hblLS|d171tz=Ur93tFziE zj5RDU;VGwSx6Q}j*KX-O-~W$Myig+P#0y>(pgpQ3t`Q|Ei6yC4$wjF^iowXh&{)^N zSl7@v#K_3X#L~*pT-U(V%D^Dom!AzqLvDUbW?CgwgQ2dWX^4?AP_>nzsjh(;Py?5^ zvJ6mz6v&3){Irtt#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RU^y BhXMcq literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/damascus_steel_brick.png b/libs/textures/blocks/base/damascus_steel_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..cce4cb8d325f75c5860ea532bd81dece8c4133bf GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF z^%ejB|G!Gbn-M6*nB?v5!qT5{GZ4t(%y)Au2GRjQtia%`Fl#nQu)re{D9CpJgc-B0 zb#j6P%L*LRfx3ZAAl{UIrwhn3@N{tu;kcfhkdTtVkgV#grYewTU}j>*mdNI)kiYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr0P%lis{jB1 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/damascus_steel_molten_flow.png b/libs/textures/blocks/base/damascus_steel_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..133da8fb616ef7997f157c23317c69141ba450e5 GIT binary patch literal 8764 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/damascus_steel_molten_still.png.mcmeta b/libs/textures/blocks/base/damascus_steel_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/base/damascus_steel_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/base/hepatizon_block.png b/libs/textures/blocks/base/hepatizon_block.png new file mode 100644 index 0000000000000000000000000000000000000000..c321788b20c9e4e6de5a9a991937fe2776b0a799 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF^ZqZXgqgH>Ka{0hblLS|d171tz=Ur93tFziE zj5RDU;VGwSx6Q}j*KX-O-~W$Myig+P#0y>(pgpQ3t`Q|Ei6yC4$wjF^iowXh&{)^N zSl7@v#K_3X#L~*pT-U(V%D^Dom!AzqLvDUbW?CgwgQ2dWX^4?AP_>nzsjh(;Py?5^ zvJ6mz6v&3){Irtt#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RZNb BhOGbq literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/hepatizon_brick.png b/libs/textures/blocks/base/hepatizon_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..2f03596d8a87d82be25bb06ae8b948bbd5c2c4bd GIT binary patch literal 408 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 U9`p?g8UO$Q07*qoM6N<$g8QtyRR910 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/hepatizon_molten_still.png.mcmeta b/libs/textures/blocks/base/hepatizon_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/base/hepatizon_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/base/manganese_block.png b/libs/textures/blocks/base/manganese_block.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c325d06cd68b22d337aa42d92380cef5d08540 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFo=W1wm)LsMM?GoS`8 zab+2x1}TsY!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;-iWUM@F?hQAxvX?$Dv)MiW@5&c$mXb#(6A~Y zrC~)t5Rfo1a|v>8vuvC3jDf-aDUV`LquoKEe$^7!h?11Vl2ohYqEsNoU}RuutZQJb zYiJx|WMpMxX=P}xYhY?+V36(0&xWEQH$NpatrDuiP}k5j#K;(^+RD&W*T4*@flFLj z2B<*_WJ7R%T1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvfK$u6{1-oD!Mt7RER+;W)Bq9|Q3(c%t1AphQcBia4ub7|}E53=ukla}DFFh-+Wuxfmob9@hB z!q`aMw))IlE>7Z~Q-L)FBEKj@*I^2o8|I?e?H%_^5HCjLCw2ZMk3CYezA6A;3erv~ zKm^<*hv~9`IOU#;>N9{iHz|?Fnkg#9?X(0kcW9{Xb%J78IF|ghRc}H>zkWsqJf;ZZ z9BWm9Y(?Cnu`$Fm*K#oEi-EZq8fTr`^d=TjtWUY+AaepLR7TN7RG&NgAkC%sgp-|s~+gd}D(#0$-+FV-T1 zkkr{Y2QI~SC8s0pTV9_8tKfo?hWq+5XTqY=$=q`?X$Fd^0;H4N2LjPg6lAkC@M01? z>gvu-UH;#D4H!PO>9Emg3{P8ogOcV)7U;_cH{o{5DY&8(fbsg2^9Y+OC)XXnZ z6W%M=TZ6coYzvrQ#44Vv9Y{{MZ3uu<(lvIDQ+^R0=eDUcPW_uIop`YY(lC~f!rW@V z7fT5!NM3n{4R;n|rQ` zsnlZox;5mrTf7fIpcJFD7Z#7b?Y))UeU?9yxvgR+`uk?k>8!-?}25ZLQ_BY~m z;T!(@Dia|=n9C7$(3&rB34Zgh`5HD?6-7ws(&K*t|4#&H7f{^8@rL*hf0s>7e4G$a zrD8cZPK4Toi2N1j^(z!}f=U%}t$J4BR3Y*X)Dt-Lr}8eCi;c00$6djaZ`wK3>D0hN&y&B&8M;!ZnUoEzL5e<7uqW2} zuKAhnc>Q=2GXeT0vpf6jD~5ZK+smo(&OBD`jw#z16=;UWW%VYnxqHXPcUwTD^IU$W zinld%(BvDt0_PDhxENRv+`k=W@|HDU9L)112nHuAke?8^pZD>?n-+tT2y91B#+j0- z*v>$>nXjvS)8Mj*|Fd9~g3~peN0NYtyH#1OiDx;t!;F%jTM-0>bB#WM9CaKT${!(P zdYSMQiT0S%9Lx`5Y}()Jy6i=6;-QAcp_N4Y8?P`VCtub^cNU18qJ zBObjr&?o+5$y93e+Lt%`a#n7wU!WCtI%BHjkI#|ExRo#2mnCSrC{hBK#E8=`-3LCr zw5FRGnKiSP#4Pg0A4z$zOz`t(tKF_ zO@EK|MkSbZ0*6LHP>R$9j!}I4u$lIuWgwIJ{s$0A4+v$X!p1+Za`3;_ULS>^Oll^V z?1`)bN+16kd!hQWm*#xE)6?Yai*#3O9fZi_BbDzEI)eT=P-*ES&58H`Um!i97mBm8 zY8J*ljLr>fyyv8+e2vZ_v@SPOrXd!dHad|A{JmYPox-10sVVc!V!_m?p8g-@+sswp z`uKjjJgdY;q@FB59>7)HXh_##cB5TNR!k1=Oe(fZ{Q8@5bsAC^3mq}93;KHd^lLUCj}F%M>sC1BY+vUpg?W%5&};bX`tdD4^=9j>w~0hRY{A zzp^~dg&poVk7k4{;o@^VhLUfB>l5xYz4}C#+7q}NDPpIvtz@*x@zS#dmJLBaKhLOI z@Fy2kK8I1I8?M0Qa&%7r-bCF%?Dn)CM>An)T_TVr`KFLV0f3~J$9OHDf6OgT*Krju zu3O8BKpCi@BFcZQjE{o~9@dCduvLMC?_O`Ny?>ExU8H7Oh%VtlT!dEwvLx@fcgzOm z{;i+179X)A+K++J8Mm}*?50uDXN6yR+Xstk-DKRQbkpnh4dzx#l7)+oRs!DlQ_@@C ztUWY18}Nzo`j~32(xvQo-&vEW|98}H38T)#KX8y>gNX~7Y7w*Vc1zT01tC+xKGXWQ zJw_yl-Q^mM6`{(#w1nEX9h7y~OCqdulh){F%i=s5p_hjICDm>^J)WTndUm&5Ce$OR zT%G1Day~&2v0PTLK1md4WW%F@zcqOeF^JbCPVlTs?eoS>GcG9HVaoi-n`kl3$77sP z5yn#nEtbH}=NX*1z>2|*@o%cdL)#N!7Nsc&z$X#7EBD*FfR zH3df}o@Nbo+a_T#!Y8S`&F~$6SDs(3E)xG}c8qzpj% zhe-bgGd6z_oe=|wwbn2d{*-i?PG+*ssnd@VSH>$>P-)vFDqeV1;N!tt#=LY^`BjGo=Vj)O24E4LMH51?5`k*QE zd(EdOev0Q#5Aml` z%FjxlSL-8@K-9O8N{m$3xB9q4h|GR$!4+n8WoFbXDy(tR3kWY@#3lHVyz@vG5~c&z zngxVqVkxM;y+G-$<1OXQgRj1+k^Pyldks4O@Cje+>KX00%T0}lk;G9pgPQUxp2*`a zXXowy)OhqyZ0Iil*m@P*TyaCIKFPIQ>B&o;{{q(^*6Y`txF6T9JBtSPH&(ZQo43=< zf2bxEf7@^2II51`iy($XnVT!&MW|OOqcLIgFvRgjyMyOAgHRars3ZqUh>(z z^_8$H35|M)m>VsjP0e0BQPVP@(!%mQ8zmotYB$7KPk(tG-5Yma91MhmQpc*+IHs-G zihaWAgp8^T>uA3(WeawJ+KOk~r%Lybq#Osn_w!xj>aI$fY1qk+(Mi5pyfdm%`NNoZ z>G7l9I?jIwY=(?RX?o6Es^|3PN*dp!YV=bh!i`kzjq5FF!)Ra)F&6T$Np5_RMcTtl zz3)+Bk&pnTxmnCM>#c2ppi=SDI=h)!o>29jBp#9xyR=|M7j8%fVY#wX3-|yaSv4V* zjcb=I?={?APk0o$E}2BNvw&TBTS|XUBP4!i|L8=&iMVWMF$d0=A-5(&k zeasNdRH2?p+K+Vjgif=7{lBM#?Kb|QiHuDkTT$R|Z-*4~?eNf|3lg>-_1EoOX#cuqX0BG{~5 zmvH!?<`e@ni3CFX;e4^fJlXlAVHXSS!3SM{)=kd>wc``29~OJazJ(?NqU?eUFWFQn z2gA-k+c`^DM5mGPf>0Q{UF?&{9f|+7_P%WeQeK&+YM_(Ar3brBif#SkzkKorv>tg( z@WaV2$EGvcpu57pyV5>rAvqN`2+FXZ)3UkRe3w=4=bTK4+SS{^OU+pwy_bWp+vMw9 zf4m#Hfk5HB-6QYo#iW4h67F1ydMHZ9($lvpY@v6#HX$ST{XO?wGFmmXa%L>dudTrU ziWc1ns&y0QRJiVsK9YWNFUa;koDW^74ILcz^sC+nFnNj~j?IYPu!KR$N*`rOK_PS4 zY2`4#j~#&6e6aM-!A?5ucEAI97?V^VJ_li_;QYai^OZj7 zVVj{)If!(qEq%#b%7E!FLzv%FgPA@p**?Ia;mXNEtNF`;vV{%r88S9BS$yCzZ*+?< zt!1m+wOk%GeNcQV>&MWolr&Lu?r)dBFh8-R7KdexsUy>*3=6*o;`LJwVHvCFL}~Ae z>H%ocq7^Ar67IPFV(rGbXcST3{P3`smgb)mkZ}+&IwvLnEGBAyQKvT8@;$pX-+id< z+X%`3C^EYNhn|;gBt_Rg`@4IZ-AUQrw5jTm%2bp+^}uAIH*k0_CPG^NJ8jO_Kb+4- z7z0nU{CB0L5tDltvlCUBBZCksEVNQg&=-n!c(5sYb||C)e1&c#C-@q;xH8Fm-Qfu; zpS#eX)sZn%h~|saUOE|mvrBRsv27rdkm6gC)4tlO4#m9WrbdRKVmC0z#rW)8)!SF`gAHJh8j{h`x|d+N`{U=P@%grfrV4YaarI7 z%dDhNymW(AFlZo48RV-!UbYVwk?9HjD6{Lf+l9II$R{a$;%oAMoz6SD%OO(@#MgB# zmw}xV(jdj-{qI3=&62JfZa)}Y?cpsyc@su4N$x(|y^86<9Sx0##o7jr)Uw)3z|+<0 zV2MxAi90Kn;Ox1I>8RNB^@M#?pO<3z)TV8fi3$+@!Uy);PL@(vF~RqZ^84OlI|OCJ zBjur87DJLXN51<6f7n5X@7>5kcaTJoZFAuv;yl?uVP*VlB}mv5EDA_OM1=(1tVpF> z@{Q9i<@OE-aPjHi5klVv)9=xfa5JQ}y^LqHjyTDZ#V~~o-*Hf#pL-sBLGt2?1K~U7 z(Ck73KzPgXt8_GfH>agUxI85fZ$unn@ z^UrCC_X8CZNvKhq<=H(Kl*td7C;ZSv;;Wl_Kh%YGJO7_O;fPX9<9KzSg>^Tde(oy4 zJmymh+Gomrc!b`5ViBOUv2yW(kTaajH4!n0t=JkbSSs)A&v zKi$5e1Zmk2JUU_ryIVAiDTXhf%=>0&t+f+u>0JPVh4<$tJsVy>ZiT5V9;z0K{c)P9 z8Fhido!d+edX|gFUOKP85W7+ru|s&oS5hkTBkD$gdL2wFfIRGKl@I^OvV|$ z!)IOcjf#v-?|;1GmHSSxBDP5Ch5xoeH+8Y%;ziSFQOnk(dEbeEnU;WF4|SSv)rZ-| zlX*p%&U!f8er9@lUd(qKesW)DQ!9JyddW8GiRmp2z2r_Zs*!H!>fGE&wC8-)D zEce_FnWt=66IXtzSEq)V^R*h4aDn4=Pq@9^xubRF_v7P}P^Xi&)2Yp2cWlk%JtWlqthUL=xx+_ozWoXoAdd1;}*8o*`rPi zQFMWb^AD40E_4vw?(m^f@M|%9SO23)5e+;A>K5DB@jsn6r}uXmjPww?Z?v7G{|DI4 BA_D*b literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/manganese_molten_flow.png.mcmeta b/libs/textures/blocks/base/manganese_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/base/manganese_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/base/manganese_molten_still.png b/libs/textures/blocks/base/manganese_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..13bc049ea4742bc9ea079bbe02db2e5130b8f06a GIT binary patch literal 5142 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 Eg85?yfB*mh literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/manganese_molten_still.png.mcmeta b/libs/textures/blocks/base/manganese_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/base/manganese_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/base/manganese_ore.png b/libs/textures/blocks/base/manganese_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..188a1a956a02157c1c69848e758692b06bbdbb52 GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFi^xl|4*IzzkB!p|NjqUUEB*)$(ZEr?!x);=F&Gn4rjibTQQJU0AdD) zyKS3)04dG_k4T^(-vJP2%(~Xe2@)(Ta7+j41~P$oQ~I4QAgj#N#W95Ax@?axUz3AK z^ZrD&HOv34oq3$qEpGv5^@ReqyHy+=$G<&X=DUBHs>baHOlf5sq&jx3G;nhEnY<^f zOJ%d%#kxn)qS^bkR|_|lOi{4q*57~QVCu}PjytEX-WhH*P3~`8rnI=djqgL7!C8<`)MX5lF!N|bSSl7T<*U&h`$jHjX(#p_W z*TB@uz#!X~pAAJrZhlH;S|wD2p{}86h>p}iU0rr literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/manganese_ore_overlay.png b/libs/textures/blocks/base/manganese_ore_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..35eb0a6e7cd77796243cb14f2cb2eb75bd530482 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=9alt@^)v_y1F;{$INE z|L)x|Bi=-yC}T;GUoeBivm0q3PLj8~3quF1tOt<8S>O>_%)r2R0E8K{u61$(1=&kH zeO=k_vB?ODS`=12eghOT^K@|x;kcfhaDYjs;fCOuBteJCNu~)LOqad7c)CsqDNH?R s;M&AgP(0zOqr=refkVk62hvO#?jL7nt~+RO4rl^{r>mdKI;Vst0FT^2xBvhE literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/steel_block.png b/libs/textures/blocks/base/steel_block.png new file mode 100644 index 0000000000000000000000000000000000000000..5c58fb68a4f6c535ebd223a89fd2ff4ead0378ce GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF1jE;^DD=Vw{ z^XIQ!yY|M78~^|RPfl`C1S()m@^*J&OHA8Q3*>O-ySWtu=>i}YV3>VsWgJMbz#|eU z$aesQ8MCf+a)JcQ3LMjcx`9j}-jsf)3&@J`ba4#fxUPEkB5#8MM@!dD+7aUUw$?e4Y~O#nQ4_!4TidgrXfbgK-E@;rn&}ZKn+~t z$}&I=QXm_G^V3So6N^$A0unRxO7#3(Llnx4^-T2)4Gg{%Ed;7!@O1TaS?83{1OUB? Bh`9g& literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/steel_brick.png b/libs/textures/blocks/base/steel_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..b86fe2ee951545f63b27592064567cac439dfe0a GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFh|NnfV#s7g)j7i?^E-d{SHv@qj&U`nwVjx`r#0m^9J@eOs1PeSOfr5MoK$tP> zS|=w+u&lr_9jF_~1maEUce;Qq6Hgb%5RU7~2?;3)49Tj_YN`Th24*H^Y>8}+8VL=n z5>gsg1Ox#I12dN(=Qhi>8P6CP?4R-|_B7fZ1nO5Uag8WRNi0dVN-jzTQVd20hQ_)E z#=3^aAx1`4CYDx)=DG%^Rt5&yzWi(`8glbfGSe!d8Vq#}O+$=~fvT+xO?3^-fEu{O zm1Te$q(C+V=ckpFCl;kL1SDqWmFW4ohA5O7>zV2q8W?;jS_o9d;OXk;vd$@?2>{p* BYw-X8 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/steel_molten_flow.png b/libs/textures/blocks/base/steel_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab46853b08be2ef251238dfa5af13742864289f GIT binary patch literal 9680 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/steel_molten_flow.png.mcmeta b/libs/textures/blocks/base/steel_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/base/steel_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/base/steel_molten_still.png b/libs/textures/blocks/base/steel_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ce82521949545337ba0dcb4b9bcd7f7cb8b5d7 GIT binary patch literal 9208 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 A^8f$< literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/tin_brick.png b/libs/textures/blocks/base/tin_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..919cc209eb4c6adddad6b13fd3d2fbc50e254aaa GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF zS|=w+u&lr_9jF_~1maEUce;Qq6Hgb%5RU7~2?;3)49Tj_YN`Th24*H^Y>8}+8VL=n z5>gsg1Ox#I12dN(=Qhi>8P6CP?4R-|_B7fZ1nO5Uag8WRNi0dVN-jzTQVd20hQ_)E z#=3^aAx1`4CYDx)=DG%^Rt5&yzWi(`8glbfGSe!d8Vq#}O+$=~fvT+xO?3^-fEu{O zm1Te$q(C+V=ckpFCl;kL1SDqWmFW4ohA5O7>zV2q8W?;jS_o9d;OXk;vd$@?2>`$+ BZHoW^ literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/tin_molten_flow.png b/libs/textures/blocks/base/tin_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..9edf562dab62644da0aa45630758e5259edb58db GIT binary patch literal 9548 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/tin_molten_flow.png.mcmeta b/libs/textures/blocks/base/tin_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/base/tin_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/base/tin_molten_still.png b/libs/textures/blocks/base/tin_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..b783ad5490cc38028cf975c6ad49421f99e6f880 GIT binary patch literal 9260 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

s z*`XqxZf(Bk<*B!^DosgA`Sf(|(5^Gv^tELfWM91}(*m(#`R1b@NUDl#g;r}n* zlb=3R3!5vJ*F<3OJox9ked%bjxV1R9v*2)eQRYo??wl#AtJIqr<|c974t+?-qc`cAP<`cO zyk%J*8&6nljQUXCPK)Ha8DN=#mq1iz3>_sSx&H#x^h{;<&Tgr&E>xq>F#t2m%sprIkzp0mxYq9jUYhu*!dNv|l#*wNqlTNa4 zEXxFCi1StTX?xT4I|SO%{5@gLQWG)ISnQKeH3f->0g7o;99aI}i;3AXGfrVkP5;E= zuW^aRCa)dipm(6Q;LT5oyZ+~sOHKI1`EWO%EsHAV&ZjZI_W#^Z7IcW|!tH&r<);Y# z_FxP>t;||)WXrjGz<@+4i{m~${dV$CB$`$L0}+^?M20)aS4eDQMhL5n_-F5_Zq~+W zKk~Lt`){u@QT=$6l?2~vh*+vG40#vk&Q>dF334?km10Lgjpd1Z%_d^tF^ZWMeXETO zuv6^)n)y^^RuaVD54xi|^RnbV%zGLS2R)%HFc#Gl(pP1nJqFS{rV3ITPCN0t&q4vO zYV0x#ErdwcaPm3aHDWtlMQmmdaJ{Qd0eSz8BDQjUty#^mJbj}Ch; zcJG1s98S&Obd6h@rBVsMowGz8??j}fK^`9txu|zTUglx+4QNKW(~@&$tMm>~NoCyK z%~d;jbRRZSQ*_|&eD$wJiLj}J*`AK2YJUPQdxlDnmRR+QNhdL#lZq0@IF+*+auc+{ z&6_t35~e*?;^(}o$6xKWRf&W5`*rYO_^$2wHw{EZW>N{BNB&#i`oG~-fQ8vI2B$`L zjv)#RMeM4_dloH(QrOw%)uYLco(JhAL2w9dQ;D>57BBE&?aCSJ=-&=cap&tuZelHd zQxHrmovch1O-xjIpDlB}+3Si^Ggq9(FUiGODzz7*vBG)`jl5f_Ea$T^^DETBzK#`U zrP{OKYnKQ+>IolRGKBt|3r@;i1D|Jq51aH_YS-7Y3u?;s4W^$uVYGORY%j|jlU@Ov z04LLac_|EIUUl{hE#0YZ-`Q!9^}79L2^b+D;+U<0GVS{_7|Xn7PDQ*u>X%&As|Tf! zfm1=4a7csfandO;RFq2X9Oec9RTv$foD-Jiw_C+e&u=4mcGoG0wH$?A#L!rn0i z{nRDQ77o&t&gH77&XNl z;zc)?NJ#Nu<5)j|%!mQmPhU{bNyPGF7KM2qL@cSR2$pXj49R@fz^F|9@d&Ch6j6q- zSanu$XO0v4z@px#=>mqVh=CmfT5T)?*`AEzt~r;TCrPSyGH8O?5etX=X_T5z&)o*!i|B<}s)!;2X6=jQ@%MlA5? zjdb132^7LuLX2HB;x{9_Ch#90Y=XR(U1Cjk=Kcm7fjyZz?)UHWc@Jx?UPiOtQ1cA# zdC4@_C;=q(#?wsvpfhYUl#U|IP)yfyuzRmv885}B_UTGRPccuQoqo5JszvvXCad)r zpY6R)i?jN)BYzs3n&4bX^n1TcD;)7Yi2+3kT!eGJ;A&JSUl;K>Pn=6^X1S^~7r{`NdIue_)AzR#ZfxnK6NC$sY22an!m*R%5x zs2n##q!X2}sQ0*Ju#w5)&;NlPq7in1lNw3aIxNc~Ez5*-O~*F82E7kIaZwn=Uzd~n zF8d}}<9xK6-$M8tW5~&d{4#hB1CLu=4~Pz)q9{TP0*`X+?zen6yP70#vo(6tw%6!_ zVxy0bkB}A%@CSPHBx_Wa8+N-*s>m6X^T?IlIpL4#g`#Swu&pZCDdvvxaSNBv$S5^+ zBN|fe>M}TFCt2RL@|67i{NP@sJn;gsH=ReCaIWeK_Hph0hGNj$K zbd)AKwcU>2oo1)~5Q#M39r*YWW4oi-buKUwe~q3yKR*6C^&by;E}fM_1k1Dc8Y|ni RM0nB%p{=2>Uao2v`aiP);FbUY literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/base/tin_molten_still.png.mcmeta b/libs/textures/blocks/base/tin_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/base/tin_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/base/tin_ore.png b/libs/textures/blocks/base/tin_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..f68a6e4755906202a80fe7c046cb27dce6ff4f28 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(}B8yOd#Hrey0n_s_=Ai4B@yg+jExpkby|^ zev?(F44=6_y0J%3z{-(X=K$-w71~oc1D-#d+O1nZ%{O4vMb?+%iKUgH zxvqh!m4QLFFFzZKhTQy=%(P0V218v#(-0$LplT~aQ(Xfypaw2+Wf`CbDUc1p`DrEP piAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76MfIh+L^k;M!Qd6{o=FmPn4DCaz`=Cct&6AagwPp> xsfqz+-3l(VnI_qsQ3+q*wjs-nF(-_f;W`U5v*-Pt*MWvGc)I$ztaD0e0st@oKi2>N literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/ender/desichalkos_block.png b/libs/textures/blocks/ender/desichalkos_block.png new file mode 100644 index 0000000000000000000000000000000000000000..7d549fad37d011e55807427682ff807b95573257 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFfC?Csyxm>c64Q3n0y&)dZf?au`U4O%Fr449{yLE2Ebxc~ z3i2HWVaDV6D^fs$Wd)AuK;1wl5N}Gq(*-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~lo FCIFFFi$nkb literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/ender/desichalkos_brick.png b/libs/textures/blocks/ender/desichalkos_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..26be924cbf83c51392799adcb33292ff08c3112c GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF}C12s0kf zUy%Y5EGuwK2kHhgfp}B;oh~5Dz|+MsgyVX0LPAOcL$a!~nyNsWftiUJTOymIMnc1? zgp`IA0Y*T=z|1AcS+mdKI;Vst0IHN~ Al>h($ literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/ender/desichalkos_molten_flow.png b/libs/textures/blocks/ender/desichalkos_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..8cd393117ea173b5524ecc1da7b66b817d7108bb GIT binary patch literal 8386 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 YUMdG)80zk#4FJ&9G|+eldHD3d0BSyqQvd(} literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/ender/desichalkos_molten_flow.png.mcmeta b/libs/textures/blocks/ender/desichalkos_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/ender/desichalkos_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/ender/desichalkos_molten_still.png b/libs/textures/blocks/ender/desichalkos_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..87e4cf462d132e66024067c0129c98f3f6494a0e GIT binary patch literal 8533 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 Db#sZ( literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/ender/eximite_brick.png b/libs/textures/blocks/ender/eximite_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe5bfe80edc1d35fbfeaf8e7370694509e00cc1 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFf%@W0JSK3rl~-%|IZBGvCdv7)XPF0K8}+8VL=n z5>gsg1Q-Dc12dN(XW3!~*Qq>)Pi9$82I^HUag8WRNi0dVN-jzTQVd20hQ_)E#=3@P zAqECkMrKw9mbwO}Rt5&5yq>>NH00)|WTsVuG#Kd`8tNLDgcunDRRfjk8UVE!6vzjA z0yRj1YzWRzD=AMbN@WO0%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}VjgPG literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/ender/eximite_molten_flow.png b/libs/textures/blocks/ender/eximite_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..d21dee2f795582d2ae22fb56e653a4c6176fb747 GIT binary patch literal 8411 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 R_R0is!_WfpPT%Fp{{ez?@3a5_ literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/ender/eximite_molten_still.png.mcmeta b/libs/textures/blocks/ender/eximite_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/ender/eximite_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/ender/eximite_ore.png b/libs/textures/blocks/ender/eximite_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec710bf87ba39796fe78491591db78471dd8f57 GIT binary patch literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>UatK4^XP-OYp-0MGOu|{s%MqAS=5W~TQ8rTS`#(x>eZRY4)k2VKJ(t& z)%Tt)yZLC*uU{9w{M>u_^yKp=CttZR<^TWx66+W00u5(O@^*KTDouZ41mtiQctjR6 zFz_7)VaDV6D^fs$Wd)AuK!qU13=Esn?{ooKYdl>XLnJQC_FXJHY{21c7+|_hX8FqJ zYySS1pSwxjf&JyFH5D#)N^2PWd)Jz6V!k2moifWkm9Nu6>Tl^R^IOc3OBL@Vu4iDY zesyL2e%&?yq<7`%-hF21F>CjIt3>B3@U;eN}s7; z|1f8q=eTzMdi8#wyH!hEBT7;dOH!?pi&B9UgOP!uv95u!uAy0ofq|8gnU#U1u7RnQ zfq^Km=Wi4Zx%nxXX_X)iM!JTEx&|g8MutGuK&83{Ky3yE^1+@!4N@Q*g7ec#$`gxH m83GbB^GfvmTtgJfjP*?Q3=Isv6fFd*V(@hJb6Mw<&;$SlCf)A< literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/ender/meutoite_block.png b/libs/textures/blocks/ender/meutoite_block.png new file mode 100644 index 0000000000000000000000000000000000000000..74292c58a7d0cc630ad40d857cf0763d5e5c19ca GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFKfUFo#7sn8e>#Aoj@-`T7v?Sg+aEvudeL{n9 z!CZ&k|Fz^Q{NoSJS2$$q*LF3;E#V%+!;Y_N4D(kD9H{#AB*9hVfY(y_c~@2M>a2DO zV+{*Tc*<$oZS(Q>wOe}6_y1!QFO*0+@q$+cXpd@%YeY#(Vo9o1a#1RfVlXl=G}bjR z)-^N>F)*+)GP5$U)HN`*GB6P3_56*ZAvZrIGp!P&!ARH8P}jgD#K;h+8mLs)0I1EN zKt9+Ls6h&3LvVgtNqJ&XDnmeGW?qS&pKFLhnX#U!o}q!km!gG0RScf4elF{r5}E++ CgNNGy literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/ender/meutoite_brick.png b/libs/textures/blocks/ender/meutoite_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..e4872f3350fa2e15eb6cdec02e4b8f706ec8620a GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFXWIEGGl?s+PD$l%ynzV2q8W?;jS_o9d;OXk;vd$@?2>=@_X5|0? literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/ender/meutoite_molten_flow.png b/libs/textures/blocks/ender/meutoite_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..390e82bb111b5597519d9b0b241c9b56d84c0379 GIT binary patch literal 7836 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/adamantine_brick.png b/libs/textures/blocks/fantasy/adamantine_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..352b207d86ac237c3321808c7ade7dd918661093 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF({ zjEw*P|2MU=C*mdNI)k3{2 z##Y8=R;K2<24+?U29X?p_Mm9U%}>cpt3=aaVq|3i)!>l&e=bmi6v&3){Irtt#G+J& lfW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RX!WX$t@V literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/adamantine_molten_flow.png b/libs/textures/blocks/fantasy/adamantine_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..a94be97345a65321c8181a7a80a8ae0ebb0a61d0 GIT binary patch literal 8209 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 NxNd3#Z8X09;D6z`6{`RM literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/adamantine_molten_still.png.mcmeta b/libs/textures/blocks/fantasy/adamantine_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/fantasy/adamantine_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/fantasy/adamantine_ore.png b/libs/textures/blocks/fantasy/adamantine_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..a20908dd4f29ddc313128ee822ce6fb05a17c7d0 GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFlqpK7#UL;8UO$P-?^sK8>o^o$=lt9^W)8>Z-5-md^fjZAbkOd85mB8 zta=EfI14-?fr5MoL6~vJ#O${q!LkC!bf9h^6NopZ-{}Ifnmt_{LpZMU_H5)jWFXO^ zANG3I41-H|VjvEGbN_*mHF-%&v4sFt`!l%yn~Jp z2r)FaGB&d^HPKPgsd?{K8RK?)w>gTe~DWM4fJ*S)G literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/adamantine_ore_overlay.png b/libs/textures/blocks/fantasy/adamantine_ore_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..51e19d14b1f8c0a4fbec32bdfe3b24640e237fb2 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=4zqjE;*485#dM zJKuU`aR?~NSQ6wH%;50sMjD8d%5wpQZ=2->L5B$HMIO1_cvJeFE+8w$)5S4_+^A!%6`n6pRaZ9+z@UY{n8pHh60tc!-JxOrYIN-HZe%@8pyE?0# z!dSxs6P|LKcH4aXeeIUs^ZoxA#S0~pPQ2h%0otQl;u=wsl30>zm0Xkxq!^4042^XS zfXE`m(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUiOpL4ypc))f|IY<#kOJ8doS#-w po>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIGM!jg|la literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/astral_silver_brick.png b/libs/textures/blocks/fantasy/astral_silver_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..03a40bda3624e2c6bbc9a5fe26c900cc7c87662a GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM~t|Nj!hqFq2K#w2fd7nc5vn}I+MXTF!249rZ-*b>zm0Xkxq!^4042^XSfXE`m z(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUiOpL4ypc))f|IY<#kOJ8doS#-wo>-L1 l5RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIC}tZ1n&D literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/astral_silver_molten_flow.png b/libs/textures/blocks/fantasy/astral_silver_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb10d13a8cb69ac406b41a06f11d390ee660ff3 GIT binary patch literal 8507 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/astral_silver_molten_flow.png.mcmeta b/libs/textures/blocks/fantasy/astral_silver_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/fantasy/astral_silver_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/fantasy/astral_silver_molten_still.png b/libs/textures/blocks/fantasy/astral_silver_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..2e97e3a16ec66c7c283877a957dd444922777a4b GIT binary patch literal 8455 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/atlarus_block.png b/libs/textures/blocks/fantasy/atlarus_block.png new file mode 100644 index 0000000000000000000000000000000000000000..baeb95a44137efd66e93477fbebff0a9ad6d103e GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF)u8K4P{_V@^*J&OHA8Q3*>O-ySWtu=?6e8z|gj4zbr_wz#|eU z$afHg8Fx&~ehU&TD{xE)>IO1_cvJeFE+8w$)5S4_+^A!%6`n6pRaZ9+z@UY{n8pHh60tc!-JxOrYIN-HZe%@8pyE?0# z!dSxs6P|LKcH4aXeeIUs^ZoxA#S0~pPQ2h%0otQl;u=wsl30>zm0Xkxq!^4042^XS zfXE`m(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUiOpL4ypc))f|IY<#kOJ8doS#-w po>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIE4?i~Rrq literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/atlarus_brick.png b/libs/textures/blocks/fantasy/atlarus_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6fc2b754e9f014625c9d02701dffbfe2f95da5 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF!249rZ-*b>zm0Xkxq!^4042^XSfXE`m z(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUiOpL4ypc))f|IY<#kOJ8doS#-wo>-L1 l5RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIHzoZLI(R literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/atlarus_molten_flow.png b/libs/textures/blocks/fantasy/atlarus_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..7523fd29132022df16cb615b48e4939d040e9cda GIT binary patch literal 8201 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/black_steel_brick.png b/libs/textures/blocks/fantasy/black_steel_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..7c318c85eb2b1f69afb0d6c95abba2698bb999a6 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFo5-7+AWb++l z+%YlxEl9Aez%d=D8^{FWP3d>KfGh(~7sn8e>&XcTDG3b8s?KVv0%-pZU z4XYAT8dd}t0SN;$mmp`^Vg}c#JcdtZSxyG(RV{IiC`m~yNwrEYN(E93Mh1q)x&}aG z5n^a;Wo%|;YOZTwW@TUy$?<0oiiX_$l+3hBGz}(3Rt8WF4ypg=0yRj1YzWRzD=AMb nN@WO0%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}yP#{b literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/black_steel_molten_flow.png b/libs/textures/blocks/fantasy/black_steel_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..79ea32566bd652d08ad91f83ebfa178d3bff17b6 GIT binary patch literal 8928 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 JLic9G{{RQPnk)bS literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/black_steel_molten_flow.png.mcmeta b/libs/textures/blocks/fantasy/black_steel_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/fantasy/black_steel_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/fantasy/black_steel_molten_still.png b/libs/textures/blocks/fantasy/black_steel_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ee217e6131ad92476adecc2594c1e545ab76b6 GIT binary patch literal 9176 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/carmot_brick.png b/libs/textures/blocks/fantasy/carmot_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..2bba26680e98df754563d1589d9e54c8124777fe GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF!249rZ-*b>zm0Xkxq!^4042^XSfXE`m z(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUiOpL4ypc))f|IY<#kOJ8doS#-wo>-L1 l5RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIB-9ZLt6V literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/carmot_molten_flow.png b/libs/textures/blocks/fantasy/carmot_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..5e558d11df726a58af876420d36b1883859e5979 GIT binary patch literal 8906 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 O$j<7tWu5t@g#Q7S`BS$5 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/carmot_molten_flow.png.mcmeta b/libs/textures/blocks/fantasy/carmot_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/fantasy/carmot_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/fantasy/carmot_molten_still.png b/libs/textures/blocks/fantasy/carmot_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..6d437742a1d9a633c7dd4eca62a995aecbdd2d17 GIT binary patch literal 9143 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/carmot_molten_still.png.mcmeta b/libs/textures/blocks/fantasy/carmot_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/fantasy/carmot_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/fantasy/carmot_ore.png b/libs/textures/blocks/fantasy/carmot_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..b3eb5a8b0673a79b00bf697ca22370d1833c52d1 GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFl?gEzf@Zf;xwjoP&nd_U?5`WoBZk{crcn)O?p^ch;WErl2Iv$rf6?tY18# zb!A`3)(=nqPDm@bySeHqgP~sYCzfd?w|!*m*Drgh5wKaCIr>2VamQO7AGS^SWpdcy z>A%1)8}9V{Udq4ama`i7rfksQGTH+c}l9E`GYL#4+3Zxi}3=EBR z4S>iZ#L(Ev*v!h*T-U(N%D^C!gL&= z=MT2=#y+qC$}*M&`2{mLJiCzw;v{*yyD)UH%6b4foCO|{#S9F52SJ!|$HeTnKtc8r zPhVH|du%d7ng%>ULW)44cuyC{5RU7~2?to#@bU04_VMua@U-bL8aOIm6JTXyQwwKf z6J`~dFXzuWfvoxF#U=3$hRamQX=D->W iCbN!-jRyr1%^A*YV0&_%nRPYLDh5wiKbLh*2~7Ya&O_1w literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/celenegil_block.png b/libs/textures/blocks/fantasy/celenegil_block.png new file mode 100644 index 0000000000000000000000000000000000000000..b952bef795657b9fe8d8e15c41e81cb9e13a2d96 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFIO1_cvJeFE+8w$)5S4_+^A!%6`n6pRaZ9+z@UY{n8pHh60tc!-JxOrYIN-HZe%@8pyE?0# z!dSxs6P|LKcH4aXeeIUs^ZoxA#S0~pPQ2h%0otQl;u=wsl30>zm0Xkxq!^4042^XS zfXE`m(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUiOpL4ypc))f|IY<#kOJ8doS#-w po>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIDf$ixL0; literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/celenegil_brick.png b/libs/textures/blocks/fantasy/celenegil_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..bb54f71e6d22ee56151e5b9025cc42a7c409a991 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*nU$%zu7R1Afk7n4pFJoVa`RI%(<;$4m>5|ZKs7j|{+|ofAO*4^I6tkVJh3R1 lAs{g`uSCz!HAJDzSkF|?(7@nJ(L$gq22WQ%mvv4FO#qALZAt(D literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/celenegil_molten_flow.png b/libs/textures/blocks/fantasy/celenegil_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7a86a3975f00505207053b57daa3b24e76f641 GIT binary patch literal 8847 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/celenegil_molten_flow.png.mcmeta b/libs/textures/blocks/fantasy/celenegil_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/fantasy/celenegil_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/fantasy/celenegil_molten_still.png b/libs/textures/blocks/fantasy/celenegil_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..c3a2b38221c029cb2f806f9aad6ff35ca9f2ee8e GIT binary patch literal 9127 zcmWlfdpuMBAIC?OrrKz}X^N(stt3Lob&Z%y9G9{h<&w)>3UkXPlq0GDenCLDFZ4hQI$U25@qLTy=8POOcAQpWd>A% zK>I*;7%R8HG2-=U`o-7xysr3tiD-GmR2%tjO}poJIYjk1=SIHwrcIlcRo3*9pcVxa z{+~N7-|N3-4Mp=mY4R+pj-AoF^mpHjuz7ynn`O=RgLl>%H)cBCEC7U=)gPjmv&hM~ zqO&#qdfFcYX$D%4`TKmhBgVI}DU3W48^Q#^^iEKu0Is*wx~fqpz>6 z0+yI~>TG28%HqnvY6T;jo35IvHF>dC0r8YGzOgvlo)l+==xzx^bfeR1Z%`a1AL&7_ zO7G;CJYjHD6Jugx|Ng;YJ7GM%#tKV?N?4$1M@DHAC%j#QiK`!HQ}j}=KF{U^zA;ur zz%1`sV~w}9HKpr0iY}(b#y-1^k2LWz-V+-ziN9`U9KdS7AQ({P>Hj07Te;mmyF{hTnRK-8Asa}V)1cNgdeGm+ zj+K1Mbn@ELhIZbqMqQPsB0#G=W?$-vT;wSEEGzwjLOg(?jeNK1n{3LjFQa>|qb$}spE?boqL z&j4@lJHl^@E;OQ0wyG*2nr!xIMn_CgxK?&$@nrJqg6TkE;D<%Hi>(Ye7@3v@Rfc{4 z&1xZn`oa+$5^~btlTc?o*;})E>m%X88AQwQ5&5*fl_<}t9#!5`CjtgZjcjqw)Flgy zQ!B`M!0*IXA*6O#(y!a|iAW;oK ztuIO>+abtm2REz?vh)deBzRyYYQUKAfW}{f#OUbs;=t9E{5W^)FhHg7M@HLQ`SG(X zdL1Lo9Q3N>{bYhQ<^bxy!6YJ{kX?yhcrREQD2JN1%Xs&uo!x(oZ6eEGxZL z9gSX%!?h4kl^+AEpctWE3il$-HFW4iydZv-!N=`43>7s5!B^+k49`lYXF{^Q^0aL@ zw^rA^H|YF7OB)Lt3W$&G^758c{m|PaWj~~U(Uj^<0L*BS4p2p<-1{enfw{@a?FZQA z9a|CRNlQaUt2Gu$hft291GckW;~S01B*bQoh9@E-n&6maOl_ciV{#10a&<5*>eJ5A zq-SNl;jv$t|0FL;%DFZDvAbPFfAr${vm986<)AgGjxRta7NvsBO( zXB!8!Q&iuNuB(Hday*Z9Zo#+{%*q=V*wJ|2QYml)t?(n#SR97~u%ucLvt2FS2^(ix z7RjaZTS9%ZNhImuEC8@PqwwN0-E;y8n{9_JJb?tceOuM&IMrSn7F*$P(G5@_Y!7xj zA7>s&WAHLq>x+7PT==+^TB*+?2Aq(N52uY7jz>FIDx>9)Y0w(cZqQ?oPNEI<1|?Jw z_`sgl-~11X)%Diz)RD>gR=qnfZqfXr&VE6|k_)LQvc0S^RPZ}d z4Nci+C2JIb7nvs{L~-)~uDIV+n`cy05W%hZEa+I7t|?Fc+%dYS4YI8CDYYhpob4Bj zYf4l!PhRzP#2WYPK_8`lo;3Avkxov~{M_`I$?9UiqTg@}odQR%^(HT$&PGy)^usQg z!3hyq?ao0gN722rNi}n|?ffwt2xUTK# z5&xh+S$wL5{x>&05&vBF#X|nM+0)uo+uf%rfS&pfjgLVku6+ya+Kv@rd4Ajgh7-8C zhT>eWMU}NhSPKp5*RWREb(AbB#ovoS>&&=(QVT>KYFVK)H&r_qR>uj~jz`7Btm2Nq zP@JL`0x4^JO|Q|x4E7?-V$Y8y#t_UE>nZ!ifdt2kz%JQAW%;3tq!0QYNR(J9{e^&f2w3eLsLP>*u5;NP|lAozX zcQM0w#P>Ew+&-NO)~?m1W}6;;rehQkvzn5EvZD7#o0KW4ApNrnNx?J{iQX!lYJ-F~ z9(KkO{L0Q?@_7smW((owU7Rmc<^P&tmKYld&p#m*>bADBW8!K-n39;;Q4l)2mEx99h=#C}n z%GgR8C;$OZ3a(pSzmfL!??jj|fwtJ+%*hFE!&9MEl;DPunT$9uEuN|NxADI<-i`fv zk$C_X>4F5+x+}aMa@HpkgquMC7Qh}rEwK4OF@G`f2vv@{FBRQmkf%4WApN+Bq>bfY zmd2;Gdpu8kkDuB!wnaVk<5&7@I^NsI{rMF0+KUC^c(c#ht(rJJ-- zS6UMmqF)<5Td3I1GAw=lLJhwAB?mC?9Zb>l$qj zD*oJMstwLXyVVBMFxG^e?>3PrQa z&bVP^LoVb15w71dq;04^kgIUG)UZ4Kuc)S`nrO_Mjw+<{^tp&`$`i`fjjPX+pY2Bh z3clNAUpWk&bV53VosnAswWHSgfK>_*>?xJnhm`fVK29sk(ec-fZ{8eDI&L$_yGdI2 z%?FBV7AGYHtg-l0G?{XPKLQXcfnZ%5`y0dsaK-Ee43$z;Gnu{xDdbNiSsY*5iYOZt zpbw_k!W#NH0Ryr7H2eHYrKNUs-AbX-@lpgZo{1D$sf{kq=ry|anQF(Hdk-6_)vH+Y zOiGDa$bd%-X~|b+aqN)dpx4H}+Wxo}TzzEA3>+b6TL;^UxajNaAZd=%P*zjlp=wMtgo2MYQAr8NvbD)ke8pwXP# zJvz^4J)}s!F*vw-^g%0lJv9}r@0Cw!mOZ{BhJ{#mCRj^rsuc;2e&_&hnmy&~_|qzb zL^}Gas3k5gNt=2DR>fx?D;`g%V}zC%;uM;W61e)`|Ii7pebPSW`|n5PL^$b6ou3cy z+34i}+E(+B{`6X@lq#dYP^_%7wial8aY)P3jqlKa=2Dbl4=F7Jn{E&qZ)`3=?`MXZr)yy*Z4jxJ@{j2k zXt~(Srh&K8UWwVq2-w{q=rvW7_7K0t{i)dq4&`BLOK5|^*cNB3q9+O3r12+TEWm+f zEvxm(CnmRH8MM=hYW8Whv#bJTC9~v2&pby$D%5A2oq`Pb!`An>g(x|yr3|4%^q0PXFMU42z(1h)T>rv@XtWYpCB1Vd!#Mjod_ZwaXLYF7zlH`q-BC$wC+^5)L4EuF zsyMF>-Qt!|D9Bkf5oY04GiNgC@cnVgodD$I_3(7y(Gp^Eo1}RMt9|C9)Z|0aZc|nX zDxa=1+eN|;{OtmwsLTliV8weDT>mmnpU|G{^H)#;JWJSqmd^^|hC(4|J;~LP`YIP63e?!rCl#_0qU8rT9*=@b3K1({jFVx zhU)AP#C9?k!y;+ayduB}DSel(J}$$Wt^od_@x!@JAn>hJPIzmR0p(r4n*%5y^5Q1G zSz_Et6a$A+7YTh9^f^9vEgXv!^ClyhD2%T`H2%7Y*ZhJDL7%UH_;7J!`rNp5o|}8O z4(H?Qp^lRD$}XvjIJlEkt6-Wn`d+;)gbe&R1po80r(t`uw6^Vtx2+`TJpF^WBe z1N!>eY}1ZwohW&Vf8Fr)4w{++@BLz^&@fbJo5Sz`7drgWFDa=QiR z>=|4>K%fDyP{CQdEpcKBfIKv?JxPhdQMbz%L%reXDUB;dcm2zD>FRWDq3dIMzRj1<9UttUj&1ikoaY`YtN_popd0{B zC^I(&MXH5HapTOq#ij%9(@u)VX8ppsVfvW|YV)Qj@k- z8teo>q(edEl==ax- zG1rG;jq!0iCQI%%)&$|68Gjxf{Ts!0=5kc2uv3QIkKP+o=S0MW>!)f8d>sK&3n6+{ z=1--BnSPIpnOIzziD(Zdv(`VCOo|)OLjXKrIC*Wb<8YNm@*nenA`Y^~!7YNTd#L44 zEd@>G7x@6B<6bq@*Z3b>Lca_IZUU*C1|v{zxCaayq*Pp}3Fi1ru*6ex^vD*F9aV2j z7|Sr#vapDQxG)iN^CocAs`MTG8h+eMhu0FuGul`?XYu>=#_##`vDNC(9T|9qd&PHU zRin)!^^w-tLek&m4DS*HbBw-?h1ux1#V0DIJt?WM+Bl%EFk4B`uTPH5x)=AW`@RkK zykNkyoG1>>2syFeqjac7W>jZC)Zy2h3di_ zZ|A>PhTxIhaGeuMDF9YRGnm#Zal_sNBJNov$KmtbkuO3OjRUIdLCunn=!4WX?N=b` z0b6x4!^5w-+w7w%4>CHb$AKCPFx_{{%be?iij>@c%EU!QW^Vzv4D3Q#!}>hi&j}`2 zhXo&kN(RM8BD6r*z20XpPIS>bO3rx9yY)3U^s~7ORR$YTZWwvS)Zc~+>px?|OU>HL z*pM`>^kr$1Y1O2HG|JV(VjpjYh18dG>Vk^L*Z($3^J#y76O>A^>`MxSWSDJZC4C@f zteRO2G8@X1U|HS%Kt3_`?b=HsO?{X30zGFsgwfWkZ6ty-wk=e>}$zSz>gKkp{P8(p*Ng4B*F zY~5#1MhpWPcyX&G^;hDSihZfeYl{ZdR9p?ko^}zk+O@+Hi)dOErX@9eWgoT^Q@qYN@IH#1|i*;^4% z7z`ycv`0So{`8$Qe4>>CWZ}HM?{=P{f_zCBD)gE~Gk*w3s|COyEh^|nj$ZnCX`LRz z)ypma!=d-X$L2s4QdtFE!t+&KvAe@9Zgt8-ecu?{-^W;EkyHh9)5L@*a%r!B$rTt{ z>H$dKB6iDIf?qQ!G6THmvRxhVL$Ny@(`fM2vU;!Q5DsgHEFa@y(u7BT zK)Up~0?9)IO`q(0!iDwqiTF~knBY`c!)U73F!{cEXYkZ=PG<9a?`J72S?JNM1FVFok{^!z@RQpyA7}) zOwaE`1tkJa!d#!eTQ2a|rXHX1?K!wQQeTZ0M#^Sy&4uuCS+82p|TCg#V{ z-2JMg3{Ys$+j^q9;OV=>@ty)U1cbJIx3t$=w)niUSZY<&)M5WUmPkop<^1pXd2jbr&PNLd8t5H2q_?SLAOQ=rPT5LuCUb1yxWn(fY!j70i20-VYXz83Y8-TsGu z5hal}RWD;}8M3zG@60&$=>!C8eTQYdhK~bfI(-YL20%?-B(aw;@|Ivk1XhZ_xSl^& zwNgK5Y&O)Dv6Oil`sC;ZsmL5m{fP)GhL~4yUP_4x7Kx&pz~5P zyWS2gm^j|%2fpowicuv`GFYR`ko<+*8c!N^=1rKzC5vB$q>=6Z^GHYD`)EgDqTkpN z>Luib+Vg}<_;ZMEh(%Jc@KEZjw8yl+lKlME)}6gg2{*Rcs5YKJ`Db7G{o-&n%=wV| z;|f@?-#QeHL3B@bnOJiq7wAtOVy`!p{`)>;kf*Tm{2V?_Kp>K4UJkUp( z58aQ!dSb2I9QLkHjX0yI+gM&$1;j&&qLSXWXO}GNN;36m5)bTTbSYrICz|subfjg# zm&TaAkoN4@5v{kRH$m9vGNkKZmG?F}{aFAOB_AvglJ7I%;!aE#?l(srOpk55gRN6j zkF_RL_nhx)I7SW0-komF(f2z1_deB6@S*GSUHrJ-1$*SA19GLLE(p&vombdM-;&p& ziiQCRQj?!xrlVN=)91pvMADS^hgJph!v>XIDd23)ZRVd3Sbik~a#2BrL`6K&<0lkD zG&#TiM117aDDU;}+%2EW$)o^|!c=H5jSr^)kIzP^o!F;hSyusys`n*v;A5V#N6Ud>wXY0EXq@mZH|R~6s0F}f zu6j#84w-gJN0f3_L&fqK#g%LP#7Mm7j6&z)oBIhL7Qg?N$-SS6Rv3SFNE5fTD;A2* z76gqZ&{SL<)=Z;L)WXgbvv2j>J9hZ>$#e6P)WG7^Jv3PH4Nu+=Q^r?m`&!=wz zd1BoYI;9EkP4br%!)<24+sxxAH|EpR-@enMHe4aCxEd!*nW6z6Jk;mV`I-CBG}W`(D+zl!}%RMG2>t14~C{uKRiR zjO$cW1lrV3`rPwfS1c}gF~BZqjDKAFl)sFQPDDIU5JTo=VDs}UYzS_D zmCtR31GdPEq6lp0c=OWb(z&B+vH1RsS8}5UErbid<5Qu=S2SL>#J68`!#?N0eT!O* z%a46>DD0l3#6HRg?4K`g3K6C&o}zZQZ+;Sl@K5aBBz=R&XK0x%fTSR)zs#+3<)&NT z$hjfEuHG@4<6;U)#%fwUv7ZmthmS?kh$UA#;!tVp9){q|&V$tN%=A|0*zN9EPy2hd zKH154GG1P@JM__GkbRQ+r9{N)D-1@SG`*@dc>h36LfajNhmE01aPejXj_NJQc><9< zOhRCGu&k_p&Z$lG7e;WUB%X z>v20W@AUz3(f5)D2`3~{XedRs24CU5F}4_8PMnjmKY`3I(wsX6DsQNLX|QADlxlhs zTr36kUe8%qZ+|h^Pa_@zo3lj|iRM@RGHS8NsGTwIP5Ra1iy^NdCkBsP2n-e2UQ-iM zJzVMynW4p>Pjg31ZZr6y3&JS|X9=beOZN=W;{AQRALU|GZTpHazz!}v(Nl0y^rzB0 zKX>LgWuDp4-#Xw(rRc&fe?V9g|1Y~=6Rq9Q*<%?NVyh2JGgF&#?}tlH87~*`wnMh< z^=eWAP#`%f%o0h>!@51Y9vS#X?&f+bJzPaA4II&jajT8O*BkIrQhN=zsJrTeBhuoZy|v)6ae(pSG_xh>;)H1hcxz7NAyh?$Ea|o+`1cy z^Kqzksq7>C9!u^zO&j*isDM>PaB2O037G<+8Av0FCTj`z#UhOl7St3LrZAFIwxA~Q zH!`cQt-no?9sE;CX%01?JenFP+-y1T4n_n|;Ms<$FWeODk-~4S!-NMi2R4#~WLZx_ zVl1=9p`Xp=DraSdAlrB~XB|n z4Uzgv+-C7T`yB&JyBCx9cMn9u)b7Wo9mkYGGD!tnHoaKyl5q*GFBe<0#opjc7Yx6^ zZg?v0Y$#bU)nO}(+Rk9EkXq#*OP#@R%*%g#r5rFKDuSR5ABlg1+@$kF^#Oy=A4&SU z8*(%v7g($1d>y6d1Db<6eckm(qze~h@dD%8?`e^*)5_$E_HrO?a=(pNm@QIq0*>&p z6*8xn_9YkQt4irb*%cerh?g(yHnY^;bWtfHqm^*ir(*zCpW~2UwBm< zbaK3S)04|zIoEy{=cDz$KFmQ<8@;{GtB(J?YV^HP&@|M?>Rdx$Ws+Ob-RHPrH+A7E zDE34>*3;senM6O#Z(Y zfJq!9BWU>SvW! zJD(Ud;9`;_)cEhP^Pej*ID&LiZ~|M%mrKuS0=4a{Kk9<^iY|ZHu3O#l;ud5He+a9}kfmjwvszZYmT{MyMAeWo(Dy)pup<>Z*S@od-fv<8Xf}#rdM;hF}$*k=+fc z5h{G5RqNgjwb+=?o$hQUOdkB$7n=h#jr71H*-q1mN9VqgX4k<79ilC`@auS{>$6mKYDwyx_J}Y6$Yfx@3Oh-s~+!3gc zye(3@AMWd;vfDQyF^(m#24uxwCn(0@nn_Hr>hNtm)qzvBYd~dFI#y=ui_#2l$fg|7 zY;5dC&(P%GIVYLeS*3?=(h<~F(G#xUAa#K*kMe*O_nX8KK5-NExOfkGEj@!yIM3=S zIM3Yp(`q4>rvErQ-4xUdDyJ+I8^?B<{WYDQ@p*l2=FQ12GAyFn-;32=+FQ7#kF_<+ zSZuLA5sA&LpUS%}-HQ;ebLD4IEPh3c;KPyfCh)zj`Y0#0;7Ju%OfHZI=sP~4w>lo< zeo`<0v08a6u4u)&T#7)t!y^KvbmUlfM*&2)It~|c=*#fWl4<*-DbFjkm5JWj>LB&T zg_Wqwrdsl~*Vs-Q*;{72PC_DzrY?U?gYt};e3WJB(qu#Ix}|$aybZ*@^Y?7>+BQ(A z@NxPE-y&Sbi`GoJ38%R`N@90=VUbp2(Y=;CSSfQL(+kF&HrBX>>DWU5)2^`Pf$-#Y zVe;HLu5q+-+>X(#?2UorBnpsihcp;e6n_}Ij#>O29iQAgSX81XhVY&~i)G4+eyJ?c@C*sB&>iDDsT{)4&J8BZ^-(6FS8ejWW1!CY(RF_P8d4+(#`(? Dcw@uW literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/celenegil_molten_still.png.mcmeta b/libs/textures/blocks/fantasy/celenegil_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/fantasy/celenegil_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/fantasy/deep_iron_block.png b/libs/textures/blocks/fantasy/deep_iron_block.png new file mode 100644 index 0000000000000000000000000000000000000000..11a9497e708772f7e821e1c082abc501020e17ff GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFZ7Ai)BUNT49! zK@eu#F){lsNU*HHF&(HI$OPg|>36z-tQb!h#}JO|s%J0qHW+ZUB;Gl2j5SJqLW6L@ zT!-ENwd5-N;}6YOIArSAb~VH;;U2@oj<0GA^H&QTsQUCI!Byjc*HZa;S5@!otab`x z4GT#{lt?=9f>#A-k7|i)L`h0wNvc(HQ7VvPFfuSS)-?bk zix5L&D`PV&Q*&JdGb;mwNRB^yP&DM`r(~v8qG>QOvNC{ba7g_>7pOrBWJ7R%T1k0g nQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvfK$u6{1-oD!M*mdNI)k3{2 z##Y8=R;K2<24+?U29X?p_Mm9U%}>cpt3=aaVq|3i)!>l&e=bmi6v&3){Irtt#G+J& lfW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RUJmYg7OL literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/deep_iron_molten_flow.png b/libs/textures/blocks/fantasy/deep_iron_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..e917a495df3a4c80ece311e51f6f1c4c1779bd9a GIT binary patch literal 8133 zcmZ8`dpOhm|NrPf2eF7zP805xIc1ofErqO5VuprIP@B*!^)V2U}!oTV(v zjX7`SFfj~E(vl{J-@1RF@AvxNpFeiJx4qxj^}b%u_2H_~U zDggk(08wGVw`<4wErQFQ8)sZ`0Kh)UKOZ4LE(s*~QzX>J{*=hX9;tl?LCiq_5dcv1 zu|Zf|h#XzYA4^y13ND#2LFVi!IzKXDbpR4voYrvgl!KK`hO@73&O$)pWzWl=u@HJ_ zMA#F6PiL3O&vwcATxDk6^sCYmc2t@`?5(Q0K`EIFlu{ZnG#0L z^kAjyG;eNR-+n`lUH=t>&Qt^UeEuA2{QSz)--Q0$=e2tNtu3b#q`XD<0bIC3(g4H4 z`#k;ytp6YY(3ODcfn0>N8Uu6G@TT(Og{E|lx1^dk9wY$-NC*MTscS*6UopTKt)SHE zo+IohHddBLy@}O~jw^`_^ElDZ3o9|Uz_jQnH#^^{Rf=+yA`0763=sX9oaxD2?PLbB@RN$*-aFwclLPItaWZUE!kvOw(zK z3FvBV;m=)~)WsoJLXC$V%fo87bO83AY2rJCm8J~?9nnpZx<1)l-jE6o#<&3mnERCD zekav;jxtd9yT>YDZ*>^7=`ntOH!x{fcxx|yJ^IGb9W6_74e$bM=n`)8YJ5qGqk(!F z5cnq|%9-iiPP(0P-giG4B@sHCdat+jsAFCfk58B-VDP5+#o0j02FRV71Wj8`}KOwSjxAl6)W51MuuaIb~oNuNB2?;v)JblNs}e# z9b!vA4bWy-*xLJ;DrWKD_1HJSl)PKS1yQvVRE!P)s)>UZGX`@Xt}@`53hKOpKk<`U ziwQn@cw+3m3iyN;??vW#uI52+ik51d)I%Ei0sJ&zel`$txACPhFl|ktXyFmzdIZ?= zoue(5JNIRpLMRs=luKK|5W5>0*ND3SJI9xn)Be)5gSy69$h7S};4wp`c2c!*ltV?z zN(Zk;++4m>06%6}$=L&_Yu?qsz_AOccb=A*2%12omSB3abniqoa7twk>sF)Y@tvwhPjs zwx7_04)LI01zxAvNP?xN!lM!+O$5c`S59RlV*20PnmoLF90%)6*I^jB&%rx9Sa@E< z_Q%}e^ggl*bDG4=w?t5=7l)F7a?!gXp?DNJhmJhH`@SIzV<_yl%sBP%Hz3sr@7EAF9}MPkckOL}WR3BTbDc|&9Y zwwj%}Qdy*fCo0Wcb!!>jZX9E#V~8+7*E(J48{QQB)Os>>Em|=fD_KonT_Fsky5YgI zC|$5}8nq5~+1F$`RcEaEVt?3+mIC$7MJFPFd+$W2k=bziYWo2Kg*wD@LfTB;lnJuy z>N$jx1d7!Q>2b@$6p|TCf(!Q4yRy$M1)jS^B=WRnxh-07PDVK{x>3Qv4g5Dm=MsiN zU~;3zav$o5ek@vO_o@iaag&_*+GC77%&|hxNo6_P$(-vSH4HRpKIyHIro*_439v^X zXr|Pebfh`HC^0m>!w<66WLGVnUT7AzFeOBlzG&>Ef4!1`@7dQwb7X z{Gx^Pty7^ZI|1#hcsw0aw_ACCbe4)P;UlVsA;vD z8ZgphKnb6W%!os}eXT7NsvI^k_!yjt!a_{jY&lw5FBUTtLl8FOJ z7*ZW-?|C~U0dc{O4uQG)r2gCk`0-tT|1)i-V*mtEl7Y5!xERp1c{h!S^EfBWiIE9P zCVsWv)By`4yfwhjGkz4Ht9`u(RO?onew-2$xa)xv|im8n5 zv2+~NHEdC?VK40sy1}`(d&g5jU0@;WPudFVxmJLu1c@~2{l*edtGMi&3x^Yh(gGka z7r5-MGJeWur59ecYE%Xvf6ZRcR!xKLtH;PBh1j;X+-0?Tlb$8|{IGaA zvmcA9I_BswE8_9)S2OUuZH*5=#s6p zFNeev0!$lYOB-fpS`^7p=3vJdhLl@y7EH}(>goB?%FKF$21=MeTm5Y1M-N+>3wph& z2yPiOo41q1#CM|es`e5JmOEX576`zX>7YN$AWvcZ$LA6e&jf{!C@$>&t-@!zPbbNQ z`M|@60eZgDbDFG!X*!+a-YDPJRIno?%06J>u5g!;Ry)-P>;7kNB_LQLCLzg$8zU+h zYw*tfG;O408U()f-C6vF)H7*jBF1tjsZ_8rw*3M9UuRtVp2Ff{_v9ydq6gq=8n8&NrXM~__#nZ-SZ0^VIg>R4i1H|*XH zTrdFU1lI(L*&=o5*o?C~p(Ro``F*!(XkeEd4ef;1yXb1mIQOVAV8B94uu9VW!7r<+ znd~8TKtHE}k;`MbxY2?dU61jz&lT)!@~-Mu<6g1~AW?!Oo=__1MI33fHb;EJeEjnD!+GS3torCK zuS~VUqSPU2pdAwYG-cv9hNKVgIP$DD^muDQeLLC~2|;037wrhq4~8A%H)$uQP__d% zeYDO+Q{+2sYSQ7>=10iAROK`KGT6FgDJ-S6W#sP$HQm5vI@zjg&z^l(V!oHEnwi8( z_}T|3=XkJ?W6f7gscLYjXsJ3Amhe}5(|lO!Vefo#_ZC=U=%JJwcS=qhgXO$&_uH{M zyOWgn-@&~`J8vG3vduEOJ+Z}VEHXQRJWTO#x&HT&EGZcQGzx?^W}?fSxAqDj%vqXf zt=8A<)-9~vIDf}2IOk?m8Tlaig(=AUlF%MDO3a^PE$M`=xXp`Z9Yb`YCoe6=Dpe#%-cv-1uVN~M7mWilayLb%^2b- zcbxLJAaiJ=BZ>VTZp&6(jTU884W6r$9^z;^Oy*_t1q4xt(Wo}q;bump+!8&(1Q4LJ zHvQ|NY&Zds=`;FWEJUic0)k z39oN6GZiol|ACtF5<{-zj@_<@dl|g+qTPjBpwu2L)IW!&9WcLia3PV8Kl;=o_RtY7nsVq2HlX|c z@-~1Vr`o*xd~L3!_yCg^`eG5mAt@#bYA~rNF$8dVX}#Q#nAg0y!^Y)_wE>yg6o zYLtv?`E6s9%Rj~0wYM1hV-tO`D>7!kJ3N1BS5=AMA`aYilnK&myjSu`r-GVk*{Q+f z4<)U^J4jD;e)1Q9u@A>0p+Q@7V{w6icr3RQAB)rhTS8Seamai9MwkjPD#Je4U(nIInEHU$X&(dxvV?aBUXv++Z-2Z=M!>I(AKf? z-bWbes@LmI>RO-tDpXDooOizynjUOQ>nNCBZMle}T{M>nvvRInec9{68!FtsjotjV z88?DTJCBX^?0fVzO(M}TgffedwtnYd6DZStC!M##w^5O7+SBxFL{wLkgBjQ0!J#S6 zUcvy`Dym>UowbivUog16_~L1e?i=E%VV7r5iigIVXo&eb z8;Eo`9(56U>Rscvxw68}sDi%t9Gd!4%~4CvINtQ<_rhK3#igBhsF{X+G`$z(VuBt< z`B_Xz>&C?!Kf2Q0?x6nuZMLC!bP$F_ykd}KUMCMqNAe%+QsAqOk`7=wWLT|(->#m zHe;f!1YsMStTYgCwEz@3vs~c-26SpB)cEXJbA;Ju6Jvd_TcqM!Cq;%C`)!VU?}ONK3>s{x=0yw4$xeDD`y@XJr0xwQX$lMiG>sOKwpsX^uRJ zl`+q$WzI}%6d$T^yDpB+H(A!F& zmNyzJw)gDV$)m%f(m?8N4CsCEz2I2cm1vV~b+E^Jxss*5oNV;kqr&75Lu?U~Qeaie z_K_9G2XFa!)Gmaku;bqgd`NLa6DIV#^Cge_!65Q1z9)F#nJ+B-^ZKtXajNqniB&J| z^wQTYixjvMX_XMv4ZGdZUhZz+84&nv4KqK@e0mG3)YV^j|1z9YAF+l3ISB|jYVOhK zP)pR>BZ)-p&a%w!y0;%YqJ0mMOg*r%`*5@3*vr`;#@nLE79B$?0E&Or0Lq|`?6LI# z>>*0cl*-aZ0;+nhLO%rc)5&IsR@S#y3ROIM%4d&JGsGu1nPI6az<@SRu0e_Bzjk=X z{M!_J(N348J<}*EDTV03bj17ntOsl*!8|BJUQj{LE?2_bvf7W8hEX-7$ zw5m@N{=L$*7cYh`CW_O(Uay3CxVMay9GQEW^#wC7F}?8XNaD)W#JL866!O{*ayNLm zvNr1(j1niR}*AZGLoTJZ}O1oF_5Hd+?Nwd%L+Mx`{lcm_mH{lJ&1 zwv|tXvFaI3kzBkV7~o>dkXq-+u~J}pR7O;#Z+PnlY*qpP>zSN~pONri``O|3OgWYZ zYw^)pY!UNk@aVxDQYKcck|zKQ5CK>yuyk+Pi?l|UQ;n=dk`XPjrvNv$=Z<3-doeK| z7pE&>ZS0Pm>jOY_Kxs-I7G8KC(m`T6*K4vizAtaPp2L|DbB_g4f+?49O;=2>uAUt- z))YXd>){bR{&Sq)522YWVnJ>ZOcV{9kE2JdWD*-0-xfW~@8;86r6d&FwUMl(+RVYW zOfu=I0w!WDh_r99M<=k(%=QWP%IgC!7p9pdG*pUlb%}p+&&1|oXxwY(O25EL=k17< zLToHdz7p25l5TlU$7A>5S}7UWwf}z{Q?3tE3?3(JI*S8ZJP0eC#gJsD}tF$lE zy_5Lgl~n194iFn3zZ;?%??SoovpRd3q#CNTdggP`B_W`Y zAN_%KLrOh%ZX#+zPRsqQ-tAogf;E-c=)x7qV}0s?AIgT?-ZGM@7r>W6oxwGy-jN)& zDi2d0qc2P)23sD5`uB6xIRf4QFHWyf12q3qY%TyjV}k>+MaW%7VCMvyVF;zw*uOTC zR7Zi$pnx0OCm`EUJj&KN8;9h4Fw{#nr2Fr8{+8_p(@@qz4Ux(TZF9xw+?vTtY0e2<6ljAYFJTUJ_ z=|}>^w?F2Kn6_2U#9gaVZ7=qLn{uDahBfmr65at_?E+!6-&KaO06N4a>8No+bB-kU zl=}uP22XUmH8k0SyeW#E4n7I&69Vc$U9j_=E8Dhr4+E~w z41_(kj$N!DdXEL&#|GMmE|zJcQ)fJP`H=J}LI*=A?i-80>F9iMW)o4HX!gp1)JG;s zH~f0tR`6c}NR>x^@^HkNp(i(FCB7J3o_+Qo{^uAZs&&I4FW*|7Isv#u~tnv;YgN;htt<_ zLWV+T7YJvhknkzVLh>qa;ggZ4mT8-Ni+m!a_+#cL{^fGFB(%}8!4qocgQTzL^9#ry)u4=TuL@1+h0kVGSSL}W^YLQ>4kCilblv>Tuy9;tvudrQ@_owg zPW8ek1uDS1$5?1P_o!Q{=Y8i8dVvv5KMJW-^!3xIm$v85Ye(y`5)4@GEqe)+k^8LHmHP5rXEab+!CthR?;&Dg@5$~wlmy)06k{w=6Ot9eFA;arje%SE(&#xX!MitM7+}zYb7v*! zoUq}hY{n05hcy;|Cgh&aSxL>}BLY46!u+7a2raK|d!mhO_`ZAoM_r=gczC_KWj-oS zKL7QnuY}T+dUoxIs2}81!<>stB&hS-b#zj5F@-D{ULUdzjoYGx>S1NBJAGZ~1{Nuax zopf653&FdpVE|IySa=SqkE+WgKUl8p3lcnlSd>AUPRB`Cj6RodFKV@9jGD4QLx^cz95i=CjZ49`m!GcK`(bOU zcWQ{eSTRhi6#EEQpSUGspdWW%q#+^k2b&Ie*P>N&0wG4a&y{a`u$<%mI;vabuY}Mj zE`1OVp`?(z5r{)(Y}#L7RdU#PYIVeK5g3dy@2VB_nm-n2uG_>OX}yOX0PDqH+O!;Z@uWZksB2){H4+HGo6`># z%b(O-C{!>r$3_KObJ@K?TeD`F{Mw$Y@=C|;YyATSp2C|WDSn_2NmZ?5*o8omwohMM z6caH46dl~X?jiC6GTVY{LYN;lIjTWV@?dR@RBk&USTUPC)OVEFo;N+Jf3VP_>XP%Pgke( z??6o|Ov9!tlXtn_#V)UejlNxFN5TZo)5Mm?u9>0t%j{RBL-K}(^5Xuk4X^Ioob`8j zyD$v}KL=S60GBBuF2l#dO$&#`T_S=&og~M{gWZy8{_UKhm2V4dylH?wGs$B4$zsf9 zN^2bNG4-dT|L9vc`{`4UQ$~b8x^Sm;1(p-}{o3Nxc=s4ecOTbH1-yJG9OHgG0k${8 zDPR!L_{W=^2zrwIT7bkD8w*%}imdnYWXoZJgax1og|3u+o_E91llA1e4W=?xZ#t~N5*l$-R1GAHGPp5t}7@6HTgk?zt?iT_WH z=N<3<<5{j#!dK?%w|^G$7WjD63S4n6!2BQ65|tKhZzaz5-Tu}I8tNFT{lv!{AyZ=Q zARPj>n?ydX>s!-W!*D0(@2%lI$ufxJmj&JBbIpG5Vjg4*V|S+DP;)$25n1;O#V_qo z{f}3P#T`cv&ZAu$(yMbFnUA08e{%niRcZ5&Rax8b>@+WDe2v1__LF4(f2-1w8ES8G z7~3G7+UvskDINs7Omf2i9%069WyJ-SFa5C>jSP@^BdS9n#1VtT&_s))n}1Elt=+`B jQ;PrXQvjpC#RIahOsWN-~l$LkcbM)%eVg@kry3% literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/deep_iron_molten_flow.png.mcmeta b/libs/textures/blocks/fantasy/deep_iron_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/fantasy/deep_iron_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/fantasy/deep_iron_molten_still.png b/libs/textures/blocks/fantasy/deep_iron_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..16b368f057a14fb8dcd3ffb37b2d499fdb2f9609 GIT binary patch literal 8304 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/deep_iron_molten_still.png.mcmeta b/libs/textures/blocks/fantasy/deep_iron_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/fantasy/deep_iron_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/fantasy/deep_iron_ore.png b/libs/textures/blocks/fantasy/deep_iron_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..46b46bc52fc0bd926d0f306e8178bcb94b307a22 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFZ-5-md^fjZAPsU01H;Wf zTS9>pXMsl~P>}B+2s7@OnEe(cSXSVe4%7`~0`aEwJ6%9lo2QFo2*-8a9$W511`;j$ z*VY>@&yAfd&VKwte1Oa@@q=etyNb1&76(rFlXL&+gPqSUB%(4+7zA&68fcuFw{I`A z^pQ~SP;UQyeRrAf^y#eAbnuz#u#>?%?6-^T|GZ^SbOM5(ck+GsoGEl&X^(D7?Y~1C zULRL{ome-^s!Tqkw84dYQz6$6=IURf+#A1(oCLZ^wZt`|BqgyV)hf9t6-Y4{85kPt z8UT?+h@r8Sv6+>rxvqhkm4QJd$DchY8glbfGSe#2G?*A!89+5Sr2d}^)F1`2Aviy+ qq&%@Gl_4N8Gp|I?&oxA$%vjG<&(Of&OVL80Dh5wiKbLh*2~7aK4x<_X literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/deep_iron_ore_overlay.png b/libs/textures/blocks/fantasy/deep_iron_ore_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..3e7550995b875e56c38a7dc8554c020a260f994f GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=6be76!KNHs0Z$(V3O~ zi#Bza8UjTbOM?7@862M7NCR<_yxm;OkH}&M2EKzJ%(!D>_FJGJdx@v7 zEBie*86h3zud|o$0t&@>x;Tb#Tu<%Y&D&tW;}T!Dmz8@#2cu9Yqk~3m*Bg88G8LD` z?%kWu+a2B?)L7TJxa}X`bQ6}E=H$(G60ee!5-z>no;B0&j8Xm(?d+zX8>Ra$om(>} hJW1C0gyY{j`@>V&zT_z#Uj?*@!PC{xWt~$(698PgQ1k!* literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/haderoth_block.png b/libs/textures/blocks/fantasy/haderoth_block.png new file mode 100644 index 0000000000000000000000000000000000000000..ddfee0fda1d721bde8467d367e14efb886d2614f GIT binary patch literal 454 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 C@@)M8 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/haderoth_molten_flow.png.mcmeta b/libs/textures/blocks/fantasy/haderoth_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/fantasy/haderoth_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/fantasy/haderoth_molten_still.png b/libs/textures/blocks/fantasy/haderoth_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..fe336a098b4c429108520228835148f71a512f88 GIT binary patch literal 8132 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/infuscolium_brick.png b/libs/textures/blocks/fantasy/infuscolium_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..c5057ae8512d9f41f9e10570cc49dfe4ae6a1e6e GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF>?wFYU z79?0!;Fu274P*lGrt~{qK$d~0i(?4K_2h(vlmv!kRcAF-fiwd%6En6%Hb;$whE)kE z4J!hSfP{gWOOUf{F@x(=9>XWIEGGl?s+PD$l%yn~Jp2r)Fa zGB&d^HPKPgsd?{K8RK?)w>gTe~DWM4fI&f+? literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/infuscolium_molten_flow.png b/libs/textures/blocks/fantasy/infuscolium_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc0f8c51bb3b160bf947cb50417175282c3571c GIT binary patch literal 9088 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ϡ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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/mithril_block.png b/libs/textures/blocks/fantasy/mithril_block.png new file mode 100644 index 0000000000000000000000000000000000000000..c1bfab99f61fe157180a61f91555e84bb7f28823 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFYw#2j@wLlJMzMESykS+jX0fyP9R>pw@3p^r$ zf_w)-m~qF%?6)AnvI56+pl%=&h&QF*=>oE1JY5_^IIgRny~x{Oz|oR;=fE-6DD?>q z!Uc03cK_FstMHFMG+*J6sbAaG5VwST3=ccLsxi!8EpVXf(~|^OjRRgw<>y^hy{og@ zDU3BNFySeuX}8VC-`8&GJ>UP2QM^zh>BI|O6`(z;C9V-ADTyViR>?)FK#IZ0z|dIN z0EjF?42`Xf&8$q#bq&m{3=ASU{_H`~kei>9nO2FW!NkbQ0IIjMF(!GtyRh_U+zbSAIP=}yih*(}B8yOd#Hrey0n_GVpY94B@z*oRE-`z>uu!tfnfEW?*Jw#+JzDsFBdH zDj}s|MSu~IFfeloa+WP-aGlCy_+*ylWT0Nv64!{5l*E!$tK_0oAjM#0U}&ss07Moc zhQ?OLW>%)=x&~%e1_qHFfA*kg$jwj5OshoGU}9ut0M+1-`hPA^gA~Yy;QX|b^2DN4 mhJeJ(yb?V>*ARs=V?9$nLj!{^MGJwd7(8A5T-G@yGywoIsBO;x literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/mithril_molten_flow.png b/libs/textures/blocks/fantasy/mithril_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..57b7e54261f242b59d154ae05dedc07f658be611 GIT binary patch literal 9527 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 n96FFRgUhUAV&g%gTe~DWM4fdB#fV literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/orichalcum_block.png b/libs/textures/blocks/fantasy/orichalcum_block.png new file mode 100644 index 0000000000000000000000000000000000000000..451d4009c5e66ff9f990190b87c74f08a34da7bf GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF>Eal|ab5N7McxJjj+Vqb2ad5usZVGS zE|}}E`@fc4g@62^`3i?j{o1aExFy_Uc-Zk(jbZ+3fdf^ao+P+x9PnByKkusQU7giV zVXR?+2~RmqyKO%HzIIFR`Tl>5;)N1PCtmQX0PRsNag8WRNi0dVN-jzTQVd20hQ_)E zKx7eOXl!L{W@T!wYhY$&U=YdiXAg>o-29Zxv`RD$CPr2UPz?^L|K|cVNP%n!&QB{T pPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FF@!PC{xWt~$(69A{$i+2D3 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/orichalcum_brick.png b/libs/textures/blocks/fantasy/orichalcum_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..85a15fe93c56abdedfc713a916cbfbf3c6e0c5be GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFIO1_cvJeFE+EUm)5S4_<9c#JLP`QdvZ}M1sz927nTZ)&BAcT|Lc^+r zl!g@nMnJ;A%q7TKwwS?nDv#llS(cN5dR0qYBT7;dOH!?pi&B9UgOP!uv919SS%erG zTN#^KnVRbwm{}PZL~{JugQ6ifKP5A*5>11Nk(B{dgG1{7xj+q4ARB`7(@M${i&7Z^ k5;OBk^!!{y6v~YCO!W*6489aC1gc{2boFyt=akR{0Qf9vCIA2c literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/orichalcum_molten_flow.png b/libs/textures/blocks/fantasy/orichalcum_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..1e96459fd41dd495eb2cd834ac44434c6866862f GIT binary patch literal 9084 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/orichalcum_molten_still.png.mcmeta b/libs/textures/blocks/fantasy/orichalcum_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/fantasy/orichalcum_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/fantasy/orichalcum_ore.png b/libs/textures/blocks/fantasy/orichalcum_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..f1de74d2e0a15c795c7016c0a9265ac1a1a1856b GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFw;ZAM)?fdZ0?iByV>Y&W|^jz5#ML^WEHvf%FC-W?(q* zVCilk#aZAH2^8cz2*QjzCT70{36>Q&rUP{YnLxZL{Z1E<)#~Zu7{YO#x5tp{kb{WJ zb7|4jJ$lRT*68R=pOYY1#GsfpcgcmYBUjcfdb9EG*#oo9d0Lj5i8ZWRXUf4lOIOyYgOL2o&IiNi#yOkswJ)wB`Jv|saDBFsX&Us$iUE8 z*8qqtLJW$^fdtA@%=UpavO>_%)r2R5QG_bOw4`@6l5>) z^mS#w$0j3WWU`1;b`el0-qXb~gyVX0!U2{wd^|jieLOrpJZ*Z629Ao?1Q^-a)WX@= zgjogVOS(ugh#DIhH_YhKI_I#BA)+nRlVOc}1E&YGFT=^rEDa|FSi_lB71pYpIj}~8 i$*f~y<3WK$bB0H+*+ow-x?K&liow&>&t;ucLK6UJ06|s& literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/oureclase_block.png b/libs/textures/blocks/fantasy/oureclase_block.png new file mode 100644 index 0000000000000000000000000000000000000000..b56591d30aac228c21f925bde899f9808d74740c GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF3u#p<^TWxZ#S7Q11exl@^*J&OHA8Q3*>O-ySWtuX$K${V3@yQ-Di+sfkz}z zknbP}Gwzs}{T3uxR^XTp)D2_;@uu`UT|ichr;B3<$92`S7kL{DI9d|#95}`rr9PoS zxL~fs?*CeH75?#u<|`aB^=rEt;+Ala;bF&DHHP`C1rAhwdXnI(almV-{Jg8GcXd`f zg|UVOCOqXd?Y8;&``RtN=llOLiWf>Gop`~k0<=f9#5JNMC9x#cD!C{XNHG{07#iyu z0FgzAp|O>*nU$%zu7R1Afk7n4pFJoVa`RI%(<;$4m>5|ZKs7j|{+|ofAO*4^I6tkV pJh3R1As{g`uSCz!HAJDzSkF|?(7@nJ(L$gq22WQ%mvv4FO#mqri`D=D literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/oureclase_brick.png b/libs/textures/blocks/fantasy/oureclase_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..22ff3ab59c148df251245ddbc89ddf748d3d53d8 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFi)gTptV89>1Tk4T^(-$4*&+%Ylx zEl9Aez%d=D8^{FWP3d>KfGh(~7sn8e>&XcTDG3b8s?KVv0%-pZU4XYAT z8dd}t0SN;$mmp`^Vg}c#JcdtZSxyG(RV{IiC`m~yNwrEYN(E93Mh1q)x&}aG5n^a; zWo%|;YOZTwW@TUy$?<0oiiX_$l+3hBGz}(3Rt8WF4ypg=0yRj1YzWRzD=AMbN@WO0 j%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}9!P5w literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/oureclase_molten_flow.png b/libs/textures/blocks/fantasy/oureclase_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c4f39f1d029dffc63d6534652882de3510a9fc GIT binary patch literal 8035 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 P4lpvfqhF!x82f(!o5#L| literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/oureclase_molten_flow.png.mcmeta b/libs/textures/blocks/fantasy/oureclase_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/fantasy/oureclase_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/fantasy/oureclase_molten_still.png b/libs/textures/blocks/fantasy/oureclase_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e91ccb77c7908000d6c360375e6a273568fd5e GIT binary patch literal 8044 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/oureclase_molten_still.png.mcmeta b/libs/textures/blocks/fantasy/oureclase_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/fantasy/oureclase_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/fantasy/oureclase_ore.png b/libs/textures/blocks/fantasy/oureclase_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..11cd67f57d96d998236d3a4308a333eda6bc8c13 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF2Q_U^Zf^ctn1uBm5fQ=?k=1kZ!UcU06@Q4Ho@*Mf_oRpG-$3aUDUTfJh(_;#meIIYz2qcO;?^k*>0bQh8;u=wsl30>zm0Xkxq!^4042^XS zfXE`m(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUiOpL4ypc))f|IY<#kOJ8doS#-w po>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIFJ4rf&cM literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/oureclase_ore_overlay.png b/libs/textures/blocks/fantasy/oureclase_ore_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..269bc4db09b05084384caa31388ad880caf55220 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWtt?0l(%~wx=bIBEv^`1m zd7GZhzrr^_S;mqezhDN3XE)M7oFs2|7lsa2Sq~tGv%n*=n1O-sAP6(=n3(+*D9B#o z>FdgVk4;9%#7NdaUJxi0=jq}Y!f`#d*P5@vfX6w$zM4h6p^I6BvrHiA{e|E2TbBqW zDKyXRe|unmP-9h7GT+x&zLlImWVfAsmayWGi@_n?>EABt8+w252*1WM`B>JCQ?)5i jZG^60YnEAa|2_L|RkkNZ>Tx+hn;1M@{an^LB{Ts5HQ`aA literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/prometheum_block.png b/libs/textures/blocks/fantasy/prometheum_block.png new file mode 100644 index 0000000000000000000000000000000000000000..66622ab0f91c9479df81edfd00d0ec4035f6c595 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFJu7- z3+6iP{;wrh;U9l!zQQ3>zqYF(ZVC4o9(H_HW0=2M;6T-O=~6y!Sy!i+m6 zW`neGmK8Xr19bzLK)fmaP8X16;OXKR!f`!0At5D!Az9T~O;sSxz|6#qEs@PpBcWkc zLQ2Dm03#q_VCE9!EL+UrI+e%p$t=ssK)tFZt`Q|Ei6yC4$wjF^iowXh&{)?1h%7=3 zjjfE$tW3>y4a}?z3?e!H>_O3xo1c=IR*9y;#K_73s=*=k|6HI3DUc1p`DrEPiAAXl l0g0J;C3=3YAqr*2dZv1Y1_ob>76MfP!~~HdXedF7 z6saK~gd!zeI)q+DdJ4U~-1ols#<=gt8T*Vq&Kc+IwbopF&bg!S8{Iw4d5#kR0G!s- zg_$r%2><{H00EhIZdZ2en8QggT}vMT;FQ2W7YiUYO@ukg@m%j7oMZf?;30RwdQAP%0S3#(i9Z8asFZ?O!dV(Re<8ZQVVz)CU1eNZ0BpYVxg%ecp(B@jy~IAD_HRi~a6p;O&_vsi#p*H3piv+!PG zJ8=mb4CS2;L>k=5@9lV>FPRm}Yu82U|B83smwhVdtRIySwWPq#O@OjC961|@cNaSW z6e6zU7M@-9qrh3vw;2idolN)739V8 z9Mi>*RmHK4^1aIuX8~U&#WXIw)72094N^69KDHBAeZF~p?alQTJM52DzXQheK(*Ie zeRlMUl`Al~!wgd6U}JV$dao;V|B^Yacd!(V!R@_QW;H(n5HhVuauqi2a6T!jJ(mJS z>{2C!9z5WjvudwQNFMEo(mdLUh{0GdR$3OYbL*lbVRJlRt}qc*!zh%xlj#Q&KjZ!DEqxu;Sf^00S&w8B zgQBBP+_m8#8!dbuvmkZ{h}ICYuBy6WpPkvjY;kVs8Qvb*WPkO=(lf%mm*~pOsGh*P z$|wS~KxP0#ceO$tW5=#qpGV`_z`UtC+*7=JJS zkVhmc&!s}QYNdUA)*~=wrXidaK&MVeg&rN*XaU1Nnkg!4KG-d;yJeU*+SHF{exhN` zE?bL+lGMIr=&p>52l~BY=U?ChzE~dj3?FgK9rs@)q(MSFd3rZL)fluu%@4VmMEWrq3MeP zqg0#Egz!N}W1fLv;pp}zZ%YG+vE#!*>K=`<%W!iEk8lN5U5W;3oihbRqMgx%0~?;T zK(C>Q|4#XG4=Z2;o|9dFvbc=<=#DV3;`93PaMOFpx4sTFazQ?+S#N$gy#<$h;#e@MQ^}-I~>Sz3aX-|7psfy}%!&BkCLBd@3F+Yfeon zKC$SVkuJ7%5s+qURDmX5F!@}Xob)Mdhi8qF8|(D;w*0hkv|+(3`CK9Sk;*gu{IPlY zFKFmzj>;B7`S1g&YhHjdu)CGX=OsJu+uJzrTgFGZ+oEZZD&D_xFnKP=&lHGVQo_gM zwf;rIjStLWbO|F-Rd&f_a2Nn&BE&nV@8vN!a)OQT-f33vIfRQ%Y-mn?d@T#>Km|H4 zbV)v=vB5PEq#JH#4li3gXxo1Kwl>_M&8OS-yNeC<#yo9>VG5mKbbAo z;XzCn^)GvJ`{r|44{dMYd;FA`%|q&EioM~1yhQluGE@@W(u_i*A9=6NTVeZx5x)?f zS5GT)^PPaQM=}haWwuDF7+$5x#o8gmjk0oSGyxR?elo-Uv5Hbp# zBMbiu;?w_*Xnr3hCQ^5B&VJ(&IdR_~EXYv(R)K~@@Pc?Nx811Jit6Y)AQw)||D46CJ?Pg6Td+So2} z8sINufL!Ea50ij%3K7ah1MAF`W%%uX&p4~e$@58;TJR8nxh}{XbjG`!aFA<00cu+_ z5`(4oim==#IY2(1yKH1C>zWU*LsLj)`5$n}xcjb`-Gx*EXjZ*}O@&lhpkdVaxzUcY zV`S6yWNR~XeVpRyS~JWRyNvm-B$|ne`qIotV8BDqn}#%sbu8eF5FB7$2oK)=F$>g& zFsom`=qutOT)VxLvE=~-f+XJ*9#+RXk)3x!eF%&fcf$4EfioBQMbLF7qfPHmWuRLW z)mBgH%K$ArN0*a2lDa-)j}5(`eXz(T`Ebjwf#ZjAdrFuJI(7Zkm+Ye(f`69^Ld*xj zVkB7k!%g#kk}X?Qsy0j5Lv=zL!IM%cc~_d-#6^y|(SJm7DZ<}|t8tmeuzLOpj|Agg zK<{#VHqAN+&= zbhz+@Phy~jzXyg;fu@TD2RD^Io90=&IeG}T^tE7FgWXty{12Nt zr#eHt*PLpLogs|5l9Zi|&Cl7MM6nKpy?yN;+p2UYd#Wjr51fNQ%$(vBc%Z|JxjcF9c3q@L`+l!0aU5xXq;~QNgNtf*Su1**aVnCzNPKqR{LZ^78y? zR!k+y$56^bW`;B*pP}~M?~eY!i*97LWHx@LqUVRfz+V#H8+TeM0dIBasc|v#xui;* z*-1rz-A&>n(QG^zn5&U-@XE-rQHZ!Y!2 zv%GyG9VT@re_)-2Y+?aFc3PR8O{m4-*VHBtPmXV(Mg^TkOL$V{$+`EF{nX0}E9?ra zN`OB6V&%xid5m*S`eLD{e7v)I@l&~plT+RgV(X3$YLpB36E){40Tb$L3zcWNs7dOW zdE7}5C@;^9l5wlGL1t^SYdq}!K=Y-@&-iB|_8Yg}$xDbf(G^INd)V6aT&R;NYjc$G zKQttl+d=L{EY|U%w+(q@-Q&fkwE?5-=O@umdgrn}J^Qx!LQURrVdySv-_1qjk&V|V z=>hCU_Qn(a3>sz$X>^5ui|YOb#pSJ-lPC*0X8gI_@X-529Xy62SZDZ8q;_oIB zRdo?#-LxMiKV&gxSz5~hFZXu~=P*6gn|+MKx90=4_!UKT`HCCnDkSW?81v-fdNxF^ zi^RD{<7QKi87+q*0<5ph)QDXH?P4cbITRF>3-u$N4Rv8zpDtVARGa-+vZN&_ttIEV z#kU0WzA?2F_$x2)y_t;5tljf6Rr8Ay<`;63Tgtlw)QjuQYW$1forPPffLESp-h$2J zuD;n>^3+8CriBvxC6vnKGlCPoN(RO_sL7)hR-z2Pce*6fmg`1d(5Z2e(m%QbQhIML z);)1M<2g0nPd?tgYT+9dLSFLC;1TCxB0c9v_dTsawc4;em3^)C1A3FLsJ-xd=#y7d z?bcaZM-);bt(UEtb!>W8GG38f9h=Ljt2xmfwVu(NVi=#26Xo1zPW&@R`PCn|yU~;| zxu03E0EX9P9?VV#qoWn?6NYX0|5i9{^5^EFJTv`coIV|axiZzcxWFWA!+JY|YVpcP z%~Jn^?J;d+{LaDetj|ZymHkVr(4frMi;V}ckdSoBG$70&56+9a8K=usPmKRhd!}eS zurc|wwtgJ1!e1e8)Qq>;5~jU$9mdqxw7IYaoV@k`R+#8^(~$oXz}=)PYO{LMHM zC`18GVppGC@ZQz~yv8v-32P|YFiIXJ)h3pFOiAWc&`nIe!jGv)vt2C3q+a1mwDkteFbaggMb${sdwibRu&z-4DNQZsKf^O{~a zzZ56)VpF)WS~e?GMuMrNhc#E<6|pTk)~~WcN?6*Si?DouT7vGp%8g1fK~i6|Ec+ha zI17OY2eNl?MQ79pU9XreZe2Z56&p(SuWtRkJXUgEzJ5#^-d*ft>1rVBOI@+3|AlxX zBbTcTdAht!I~pF+B!HRcSl#(ah+v|O`w0D$HwiuR^X1G2++_|J?L+4D+PEJms}%wI_|NglBvKzKNl33C%op)#t4QGVU> z5=X)6^+BmM*nj2XLZFv=<>Oln*MZf0n|r0-Z6^3U76WRlR!CoYBhW<#TQcs-Lk+?= zX00`A=R?jsI43v7jtJmcZ;mS`o%p) zuuo9uiE6jt&m-r{*^5|H%TqQv0d%UUz1Mox^*hhE6QqJPaG075pV|ryC!+A|_hsJ< zhnellzboQ@)3g>YhFNO`$G0}ij*^s6pzKb`;`vchB&hN{ZMFHaw7Jg8ECkCP)kZ`q zju=+=@n^nV+-<`3L~*cbx^BvRP{KAKD8 zeP7MZugB}b0|UG%(RSE|R0lACt2Pp=T`BBA*csnK@DS%?y`XVSj_U*WCtn!=&sSUT z7j9FbD{o5AP^=AOlCA%?F|^j|2Q-R<_};YH9FQ2z=@b1$5WWS5lJI+8HH87NO|a5U zwlb7vh;Q_UkMR4t;-}HkxTEVSIxMB-S+Bqqq8z@N>PDT>;~H1JK+!KNcEx2NuN^iv zdPzQ_eI#7d*vD>n!Moh%<(SD~dBpD-D}+xo_LtXR3Z*Vu7o=F8dtYo1xF6Pa=X((x@6Bb7izQNDI)RC9FkQf> zg#8kO5C;@A?u8uTpmx2M@)sT?kUM_g=XF6}#I4BkYcF}of@py#kr@$kv6JS22!KzY zvElvn%W${V1!%6~AQ%CUk;o2GipjjCP8D%eiSb$@uTQznZw%z;YvDj{= zUKs()Jk4F5VGUv$6HnzFdpc;+623Bf<>}X8`6fP$_SbT%vB8SZ=8CDAy9YJ<$;MID zbdf&_Qd)F=PXhhLcz3AEvq<1ayqP88@M?L0W>d(V$S=e%DY3EcvX7@7z>O`}Y`vsTBd<}`LL zRGdVgM<>)a26=fdj>KC)-{^j@h8MInD%oXD_S}ed;NsugIc9i`>K75}AXh&o7+97DVVavM5;A;@cup^M ze|&_~jV#xQuX&cCY+SIEu_*}qI$gv!Vt@L@=K6b2gQ5)1i!-RqA`ZRXk!E8b0@U>L z^%m8f>lL?6^xfZ?byduj3RM^WSY?VLxAw8ogZ-F(utqYY^1WMQn8WYc#5UNE;khVJ zEpBAL9H9!q}e<5 zLRf-mFTRm@A)VVRL>*h<@nz6+aq@2Aeu44%^ffHCjzxI<`uj=-7{94zR9v`)=K?)>Y?o2?VA%%B)AtVRwkT>prK@aVek!r` zkf{UT`cN=T$7l^@;j=muFf2tj)2~iD-#;VLw^4GI!^0|0fFnm^BL1Q{F~F;UDlL;; zic^;FXt`Szq(b*)x`TgOKdF}M{Ro??+^^fNe(|EkH}Lm-JI4>vOk)oSpFnL`!&8t0 zXl|S`@wBI-OtXvDarUJ8dxLOoEl+Bv&(`i|rnqXOQN}umr`}dR3o>Suh%+^q*Y_@> zsEvP6z?REKl{jFE9_*s?USEnkp!=zu)m!IUo*t4?YmX5r`y|pMA-;K)QAjmcc#iZSOa@G1j;_)Q3r0 zo^R4T*q0Vs1JgW&s%^dc1V-L1^9Af&KU@#kK!u}v~W&h{t+`i=A$^>WhsVuNc zqRG4<&{X``?|7fXG-z*4PlNneFW&<`>|GLa?Yb976(s=CeFZfok~&l-{CP<>0rb*_|hQ%1c-UsY&pMZ+qoR>I*5(w@EQIDB<1_J$Ury=;3kIc6VSmUe?_A ze@%MNS4wLwT{)Sc!)tTW60&<+G^@u+cmnj|G+kj;EXVyJH|Uv={!03koREIktKxrC z1);#6HO(nfdRyn*Ok2f(^eQcg-G=$<8Y)#x+BE2JR}OMk&`b`{>1lwZ`i4IdNR!Vv zlpZ7ftvZLRR+7tw7q3*!@Kz@Nv4QS>n(?+~y7lwrfy$KxR$C2V6jMYtloKo`x_v-j zvuP#=j4@WNsgjXFwb@>DFJ!;bMVtQ|5r=8=P9`lMqZKRfq6Pmr+)wnF1@dXut#Jf(>cCVPBZ xKYKOPbzv|`k}55cvvtt-&soL)m%_(9fh8z?J5%Ex=20U+4{ii2(tiBvzX0Sqz&ii{ literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/prometheum_molten_flow.png.mcmeta b/libs/textures/blocks/fantasy/prometheum_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/fantasy/prometheum_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/fantasy/prometheum_molten_still.png b/libs/textures/blocks/fantasy/prometheum_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..e34eb170b2b547089f206ee42d299b3aae857916 GIT binary patch literal 7330 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 B3AF$K literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/prometheum_molten_still.png.mcmeta b/libs/textures/blocks/fantasy/prometheum_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/fantasy/prometheum_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/fantasy/prometheum_ore.png b/libs/textures/blocks/fantasy/prometheum_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..c9bf87f0d80c9e7c97b12464fa573f0b9b2359a8 GIT binary patch literal 483 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF%|^OJ^yMZ z^N}4qrM(no=J)T5+Mj0K(cio9s+dva zgxJ*$_BE?TJqo{E$OSq`wZt`|BqgyV)hf9t6-Y4{85kPt8UT?+h@r8Sv6+>rxvqhk zm4QJd$DchY8glbfGSe#2G?*A!89+5Sr2d}^)F1`2Aviy+q&%@Gl_4N8Gp|I?&oxA$ a%vjG<&(Of&OVL80Dh5wiKbLh*2~7Z2E1bgs literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/prometheum_ore_overlay.png b/libs/textures/blocks/fantasy/prometheum_ore_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..d4338fed75d0cca397633c1aef8269fa1dc243b2 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=5ZZQN&It}tjbT|c zQWvXk(*TMxmIV0)GdMiEkp|)11exl@^*J&OHA8Q3*>O-ySWtu=?OqAz|h;b=?+M+z#|eU z$afHg8Fx&~ehU&TD{xE)>IO1_cvJeFE+8w$)5S4_+^A!%6`n6pRaZ9+z@UY{n8pHh60tc!-JxOrYIN-HZe%@8pyE?0# z!dSxs6P|LKcH4aXeeIUs^ZoxA#S0~pPQ2h%0otQl;u=wsl30>zm0Xkxq!^4042^XS zfXE`m(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUiOpL4ypc))f|IY<#kOJ8doS#-w po>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIAj=jr{-s literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/quicksilver_brick.png b/libs/textures/blocks/fantasy/quicksilver_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..493d8ff1cb2e16563ab1c0062d02d15e3c7a52e7 GIT binary patch literal 404 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/quicksilver_molten_flow.png.mcmeta b/libs/textures/blocks/fantasy/quicksilver_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/fantasy/quicksilver_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/fantasy/quicksilver_molten_still.png b/libs/textures/blocks/fantasy/quicksilver_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..59c6e45b5c4443ddfc4d13ce5f16243a2be2b3f5 GIT binary patch literal 9657 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/quicksilver_molten_still.png.mcmeta b/libs/textures/blocks/fantasy/quicksilver_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/fantasy/quicksilver_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/fantasy/rubracium_block.png b/libs/textures/blocks/fantasy/rubracium_block.png new file mode 100644 index 0000000000000000000000000000000000000000..1885bccf9c1768e0fd73466d92c7500fe923ce82 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFFV>+PKn09R-tI1JiD^4(fgH|!H@9LS-2lV_41EzB+(Ci`9+5yn zzJnmlxMO1WTaaK`fnz#QH;@U$o6_%e0a-DgE{-7_*HzD6qzi*NBpo#FA923{2##Y8=R;K2<24+?U29X?p_Mm9U%}>cpt3=aaVq|3i)!>l&e=bmi6v&3){Irtt p#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RV=ai2MKm literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/rubracium_brick.png b/libs/textures/blocks/fantasy/rubracium_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..9e44fbcbb508491af0c0798b651f567a7ff2b118 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFy4a}?z3?e!H>_O3xo1c=IR*9y;#K_73s=*=k|6HI3DUc1p`DrEPiAAXl l0g0J;C3=3YAqr*2dZv1Y1_ob>76MfqDanBPGJ+7h>;>ChDbFeharcJ zs1ZV8j#=ffEeSdO*5~)Te%JN={&8RTeeK$H-S7MLejT3A$2-N|&Pq%~UWAX2Pt3;J z9Lu{a^YQWXf%th(R}ZgKc{kx8Yv)itKCtxPYZu?cd>HRXp)i}%7DD5~GGJBla(UG< zK0d`(8}pNABfl)hd=624m;H#XcuK>XPxwiB#hni&){NYg63M8C|+9yzJW?U?JUmJ8xob#-e=}lzF`+A!Ueg0wkILvS!Z-tsH`H0tGT-HrhPCsQBerhq~N_%OBKf zRz9RdjJVp*mjV5r&ch5hP!tYD%ttbEXQ>b`JyEzC3PdJBey$8S;Eu%VgEeomd26%W z+;Zv8&E%Stn1cX(5E>3tz6R*#S2PNCRz94zO~In!NAPv!h6`pca{;xjpgO!p}Z

{Qm{z&9HBxQGZ}>cqap;j6qTDQ=h)%Q&>H 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/rubracium_molten_flow.png.mcmeta b/libs/textures/blocks/fantasy/rubracium_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/fantasy/rubracium_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/fantasy/rubracium_molten_still.png b/libs/textures/blocks/fantasy/rubracium_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..d74fa30046a69a0476c8675509d4e4fabcd87815 GIT binary patch literal 7876 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 DO}oY_ literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/rubracium_molten_still.png.mcmeta b/libs/textures/blocks/fantasy/rubracium_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/fantasy/rubracium_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/fantasy/rubracium_ore.png b/libs/textures/blocks/fantasy/rubracium_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..9181015766f1f0efdcfdbed8996b873dc1cfd3b1 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*@2Xn+dk;0RcH-g-*TH+c}l9E`GYL#4+3Zxi}3=EBR z4S>iZ#L(Ev*v!h*T-U(N%D^C!ZFLCY>wqzcWAl&R(^1UB@G!RScf4elF{r5}E*1lvU&a literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/tartarite_block.png b/libs/textures/blocks/fantasy/tartarite_block.png new file mode 100644 index 0000000000000000000000000000000000000000..423b3fd673b6267a7547665ef214e5e7a0a4fd30 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFhfVps1gL;9$=lt9Eir9JEs(>R@8(tvq(1<$07Gll-Zqe6fkz}z zknbP}Gwzs}{T3uxR^XTp)D2_;@uu`UT|ichr;B3<$92`S7kL{DI9d|#95}`rr9PoS zxL~fs?*CeH75?#u<|`aB^=rEt;+Ala;bF&DHHP`C1rAhwdXnI(almV-{Jg8GcXd`f zg|UVOCOqXd?Y8;&``RtN=llOLiWf>Gop`~k0<=f9#5JNMC9x#cD!C{XNHG{07#iyu z0FgzAp|O>*nU$%zu7R1Afk7n4pFJoVa`RI%(<;$4m>5|ZKs7j|{+|ofAO*4^I6tkV pJh3R1As{g`uSCz!HAJDzSkF|?(7@nJ(L$gq22WQ%mvv4FO#rxOjRODx literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/tartarite_brick.png b/libs/textures/blocks/fantasy/tartarite_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..ca725123bfca0a6ad03f86410dbf6b27d0b00064 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF!249rZ-*b>zm0Xkxq!^4042^XSfXE`m z(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUiOpL4ypc))f|IY<#kOJ8doS#-wo>-L1 l5RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIA|ZYx@8I literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/fantasy/tartarite_molten_flow.png b/libs/textures/blocks/fantasy/tartarite_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4b053f1178455e0a8f4fe9c2a396b3f0b93c42 GIT binary patch literal 9413 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 z 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/alloyer_front.png b/libs/textures/blocks/machines/alloyer_front.png new file mode 100644 index 0000000000000000000000000000000000000000..9172adbeec7b9cf30518e32671b419b0e43b8a26 GIT binary patch literal 2955 zcmV;63v~2}P)|D^_ww@lRz|vCuzLs)$;-`! zo*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg01=zBIT!& zC1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz*<$V$@wQAMN5qJ)hzm2hoGcOF60t^# zFqJFfH{#e-4l@G)6iI9sa9D{VHW4w29}?su;^hF~NC{tY+*d5%WDCTXa!E_i;d2ub z1#}&jF5T4HnnCyEWTkKf0>c0%E1Ah>(_PY1)0w;+02c53Su*0<(nUqKG_|(0G&D0Z z{i;y^b@OjZ+}lNZ8Th$p5Uu}MTtq^NHl z*T1?CO*}7&0ztZsv2j*bmJyf3G7=Z`5B*PvzoDiKdLpOAxi2$L0#SX*@cY_n(^h55xYX z#km%V()bZjV~l{*bt*u9?FT3d5g^g~#a;iSZ@&02Abxq_DwB(I|L-^bXThc7C4-yr zInE_0gw7K3GZ**7&k~>k0Z0NWkO#^@9q0fwx1%qjZ=)yBuQ3=5 z4Wo^*!gyjLF-e%Um=erBOdIALW)L%unZshS@>qSW9o8Sq#0s#5*edK%>{;v(b^`kb zN5rY%%y90wC>#%$kE_5P!JWYk;U;klcqzOl-UjcFXXA75rT9jCH~u<)0>40zCTJ7v z2qAyk54cquI@7b&LHdZ`+zlTss6bJ7%PQ)z$cROu4wBhpu-r)01)S~6}jY?%U? zgEALn#wiFzo#H}aQ8rT=DHkadR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j*2tcg9i<^O zEt(fCg;q*CP8+7ZTcWhYX$fb^_9d-LhL+6BEtPYWVlfK zTBusSTASKKb%HuWJzl+By+?gkLq)?+BTu761jmyXF)a;mc z^>(B7bo*HQ1NNg1st!zt28YLv>W*y3CdWx9U8f|cqfXDAO`Q48?auQqHZJR2&bcD4 z9Ip>EY~kKEPV6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^TY0bZ?)4%0 z1p8F`JoeS|<@=<@RE7GY07EYX@lwd>4oW|Yi!o+Su@M`;WuSK8LKk71XR(_ zRKHM1xJ5XYX`fk>`6eqY>qNG6HZQwBM=xi4&Sb88?zd}EYguc1@>KIS<&CX#T35dw zS|7K*XM_5Nf(;WJJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@qL5!WvekBL z-8R%V?zVyL=G&{be=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW%ue3U;av{9 z4wp%n<(7@__S@Z2PA@Mif3+uO&y|X06?J#o zSi8M;ejj_^(0<4Lt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%oZ=0JGnu?n~ z9O4}sJsfnnx7n(>`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+u1IL8No_-(u{qS+0 z<2@%BCt82d{Gqm;(q7a7b>wu+b|!X?c13m#p7cK1({0<`{-e>4hfb-UsyQuty7Ua; zOu?B?XLHZaol8GAb3Wnxcu!2v{R_`T4=x`(GvqLI{-*2AOSimkUAw*F_TX^n z@STz9kDQ$NC=!KfXWC z8h`dn#xL(D3Z9UkR7|Q&Hcy#Notk!^zVUSB(}`#4&lYA1f0h2V_PNgUAAWQEt$#LR zcH#y9#i!p(Udq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6?<+s(e(3(_ z^YOu_)K8!O1p}D#{JO;G(*OVf24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV z0GgZ_00007bV*G`2i^q%4m1|g+*C#Y007fTL_t(I%VRvh&;36G1%QQtfq_9t(wTva zN1Y^%-@e>rc=voS1IyV9j~J{tuaj)^*ALej&R%!~aRD+Qe?+-p>B1ijfA7Cx(6u1VHB9g3002ovPDHLkV1jVu Blb8Si literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/alloyer_side.png b/libs/textures/blocks/machines/alloyer_side.png new file mode 100644 index 0000000000000000000000000000000000000000..ac000af19a325a3c9ffd51478be593a6dda9b915 GIT binary patch literal 2935 zcmV--3yAcIP)|D^_ww@lRz|vCuzLs)$;-`! zo*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg01=zBIT!& zC1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz*<$V$@wQAMN5qJ)hzm2hoGcOF60t^# zFqJFfH{#e-4l@G)6iI9sa9D{VHW4w29}?su;^hF~NC{tY+*d5%WDCTXa!E_i;d2ub z1#}&jF5T4HnnCyEWTkKf0>c0%E1Ah>(_PY1)0w;+02c53Su*0<(nUqKG_|(0G&D0Z z{i;y^b@OjZ+}lNZ8Th$p5Uu}MTtq^NHl z*T1?CO*}7&0ztZsv2j*bmJyf3G7=Z`5B*PvzoDiKdLpOAxi2$L0#SX*@cY_n(^h55xYX z#km%V()bZjV~l{*bt*u9?FT3d5g^g~#a;iSZ@&02Abxq_DwB(I|L-^bXThc7C4-yr zInE_0gw7K3GZ**7&k~>k0Z0NWkO#^@9q0fwx1%qjZ=)yBuQ3=5 z4Wo^*!gyjLF-e%Um=erBOdIALW)L%unZshS@>qSW9o8Sq#0s#5*edK%>{;v(b^`kb zN5rY%%y90wC>#%$kE_5P!JWYk;U;klcqzOl-UjcFXXA75rT9jCH~u<)0>40zCTJ7v z2qAyk54cquI@7b&LHdZ`+zlTss6bJ7%PQ)z$cROu4wBhpu-r)01)S~6}jY?%U? zgEALn#wiFzo#H}aQ8rT=DHkadR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j*2tcg9i<^O zEt(fCg;q*CP8+7ZTcWhYX$fb^_9d-LhL+6BEtPYWVlfK zTBusSTASKKb%HuWJzl+By+?gkLq)?+BTu761jmyXF)a;mc z^>(B7bo*HQ1NNg1st!zt28YLv>W*y3CdWx9U8f|cqfXDAO`Q48?auQqHZJR2&bcD4 z9Ip>EY~kKEPV6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^TY0bZ?)4%0 z1p8F`JoeS|<@=<@RE7GY07EYX@lwd>4oW|Yi!o+Su@M`;WuSK8LKk71XR(_ zRKHM1xJ5XYX`fk>`6eqY>qNG6HZQwBM=xi4&Sb88?zd}EYguc1@>KIS<&CX#T35dw zS|7K*XM_5Nf(;WJJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@qL5!WvekBL z-8R%V?zVyL=G&{be=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW%ue3U;av{9 z4wp%n<(7@__S@Z2PA@Mif3+uO&y|X06?J#o zSi8M;ejj_^(0<4Lt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%oZ=0JGnu?n~ z9O4}sJsfnnx7n(>`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+u1IL8No_-(u{qS+0 z<2@%BCt82d{Gqm;(q7a7b>wu+b|!X?c13m#p7cK1({0<`{-e>4hfb-UsyQuty7Ua; zOu?B?XLHZaol8GAb3Wnxcu!2v{R_`T4=x`(GvqLI{-*2AOSimkUAw*F_TX^n z@STz9kDQ$NC=!KfXWC z8h`dn#xL(D3Z9UkR7|Q&Hcy#Notk!^zVUSB(}`#4&lYA1f0h2V_PNgUAAWQEt$#LR zcH#y9#i!p(Udq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6?<+s(e(3(_ z^YOu_)K8!O1p}D#{JO;G(*OVf24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV z0GgZ_00007bV*G`2i^q%4m2rc=voS1IyV9j~J{tuaj)^*ALej&R%!~aRD+Qe?+-p>B1ijfA7Cx(6u1VHi2WDk=O!x= h!2|L2$FF3kL;#i=THM!42DtzL002ovPDHLkV1g%3i5vg` literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/alloyer_top.png b/libs/textures/blocks/machines/alloyer_top.png new file mode 100644 index 0000000000000000000000000000000000000000..180ad7787e02a32b5921ae663c255c9634fc8578 GIT binary patch literal 2908 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/crusher_front.png b/libs/textures/blocks/machines/crusher_front.png new file mode 100644 index 0000000000000000000000000000000000000000..f24137323c2fea3ce8ffab668ce0dde07b2e9637 GIT binary patch literal 2954 zcmV;53w88~P)|D^_ww@lRz|vCuzLs)$;-`! zo*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg01=zBIT!& zC1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz*<$V$@wQAMN5qJ)hzm2hoGcOF60t^# zFqJFfH{#e-4l@G)6iI9sa9D{VHW4w29}?su;^hF~NC{tY+*d5%WDCTXa!E_i;d2ub z1#}&jF5T4HnnCyEWTkKf0>c0%E1Ah>(_PY1)0w;+02c53Su*0<(nUqKG_|(0G&D0Z z{i;y^b@OjZ+}lNZ8Th$p5Uu}MTtq^NHl z*T1?CO*}7&0ztZsv2j*bmJyf3G7=Z`5B*PvzoDiKdLpOAxi2$L0#SX*@cY_n(^h55xYX z#km%V()bZjV~l{*bt*u9?FT3d5g^g~#a;iSZ@&02Abxq_DwB(I|L-^bXThc7C4-yr zInE_0gw7K3GZ**7&k~>k0Z0NWkO#^@9q0fwx1%qjZ=)yBuQ3=5 z4Wo^*!gyjLF-e%Um=erBOdIALW)L%unZshS@>qSW9o8Sq#0s#5*edK%>{;v(b^`kb zN5rY%%y90wC>#%$kE_5P!JWYk;U;klcqzOl-UjcFXXA75rT9jCH~u<)0>40zCTJ7v z2qAyk54cquI@7b&LHdZ`+zlTss6bJ7%PQ)z$cROu4wBhpu-r)01)S~6}jY?%U? zgEALn#wiFzo#H}aQ8rT=DHkadR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j*2tcg9i<^O zEt(fCg;q*CP8+7ZTcWhYX$fb^_9d-LhL+6BEtPYWVlfK zTBusSTASKKb%HuWJzl+By+?gkLq)?+BTu761jmyXF)a;mc z^>(B7bo*HQ1NNg1st!zt28YLv>W*y3CdWx9U8f|cqfXDAO`Q48?auQqHZJR2&bcD4 z9Ip>EY~kKEPV6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^TY0bZ?)4%0 z1p8F`JoeS|<@=<@RE7GY07EYX@lwd>4oW|Yi!o+Su@M`;WuSK8LKk71XR(_ zRKHM1xJ5XYX`fk>`6eqY>qNG6HZQwBM=xi4&Sb88?zd}EYguc1@>KIS<&CX#T35dw zS|7K*XM_5Nf(;WJJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@qL5!WvekBL z-8R%V?zVyL=G&{be=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW%ue3U;av{9 z4wp%n<(7@__S@Z2PA@Mif3+uO&y|X06?J#o zSi8M;ejj_^(0<4Lt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%oZ=0JGnu?n~ z9O4}sJsfnnx7n(>`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+u1IL8No_-(u{qS+0 z<2@%BCt82d{Gqm;(q7a7b>wu+b|!X?c13m#p7cK1({0<`{-e>4hfb-UsyQuty7Ua; zOu?B?XLHZaol8GAb3Wnxcu!2v{R_`T4=x`(GvqLI{-*2AOSimkUAw*F_TX^n z@STz9kDQ$NC=!KfXWC z8h`dn#xL(D3Z9UkR7|Q&Hcy#Notk!^zVUSB(}`#4&lYA1f0h2V_PNgUAAWQEt$#LR zcH#y9#i!p(Udq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6?<+s(e(3(_ z^YOu_)K8!O1p}D#{JO;G(*OVf24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV z0GgZ_00007bV*G`2i^q%5fwG)UeuZZ007cSL_t(I%cYV%4uU`wgolLA3QR0bEDRyG zmiC;1gV*~S$X9qGw+)>Yuy7&W5L(}aNKR+ zZ1+Y&m8W=Q5_VDp>p~iD&I*a7eiO83ibUmUKSEpV-kzfd)%nmd=@BTU%#YX}eLeke z@SSg#K^a`I3PU)aXC#zDpo}8eLv&h A$p8QV literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/foundry_bottom.png b/libs/textures/blocks/machines/foundry_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..288803f54cb62240211d939c142179714d2f24ce GIT binary patch literal 2859 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 JPDHLkV1jcRV?qD` literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/foundry_front.png b/libs/textures/blocks/machines/foundry_front.png new file mode 100644 index 0000000000000000000000000000000000000000..88db9a9bdf917ed35c43435c59dcedb36f2a2da0 GIT binary patch literal 2950 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/foundry_side.png b/libs/textures/blocks/machines/foundry_side.png new file mode 100644 index 0000000000000000000000000000000000000000..81794b716043e028ab05cab8a771121fe176ef48 GIT binary patch literal 2921 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/mframe_bottom.png b/libs/textures/blocks/machines/mframe_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6ee16f8ce4156f9bd81d2ad5ba8d8058c64e46 GIT binary patch literal 2897 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 ZzyOojN**wOROJ8w002ovPDHLkV1i5LZ-4** literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/smelter_bottom.png b/libs/textures/blocks/machines/smelter_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..6acf51e79b4ecda79cc44d5f24a197ebad92b162 GIT binary patch literal 2874 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 Y0DX)>ivuu3h5!Hn07*qoM6N<$f;szV1ONa4 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/smelter_front.png b/libs/textures/blocks/machines/smelter_front.png new file mode 100644 index 0000000000000000000000000000000000000000..24c6b587f2d5be467a646051c1e2fbca27c37253 GIT binary patch literal 2947 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 LNkvXXu0mjfYX5

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 budnkBtDR49`+-5^00000NkvXXu0mjfK$NB3 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/machines/smelter_top.png b/libs/textures/blocks/machines/smelter_top.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4964ba40a250c41643403cb7e160e43b3066d5 GIT binary patch literal 2921 zcmV-v3zqbWP)EX>4Tx07%E3mUmQC*A|D*y?1({%`gH|hTglt0MdJtUPWP;8DJ;_4l^{dA)*2i zMMRn+NKnLp(NH8-M6nPQRImpm2q-ZaMN}+rM%Ih2ti1Q~^84egZ|$@9x%=$B&srA% zlBX}1mj+7#kjfMAgFKw+5s^`J>;QlP9$S?PR%=$HTzo3l9?ED;xoI3-JvF1F8#m>QQXW*8-Az9>Nv%ZWK* zkqtikEV84R*{M9Xh{ZXlvs2k(?iKO2Od&_ah_8qXGr62B5#JKAMv5?%E8;ie*i;TP z0{|3BY!`4?i6S-;F^L}%f`(o2L0Dz>ZZyndax(`h}FNp#{ zx{a}MR#uh~m%}m=7xWMPPlvyuufAs_KJJh5&|Nw4Oks+EF0LCZEhSCJr)Q)ySsc3I zpNIG#2mW;)20@&74xhslMTCi_jLS<9wVTK03b<)JI+ypKn)naH{-njZ7KzgM5l~}{ zfYfy=Kz{89C<+lE(fh?+|D$id_%I-TdEqLPi*x_)H~nY9rQ#)noA5c#B`Ac>67n+_ z_r%Wu$9dISw03U@r;Pdb`_%=KWKZEBGfDjQHqKX(I48#TT zN1~8;gpaI8ijWGV0cl0Lkv`-mGK$O~Z&4T&1w}_0qHIx~s8AFOwFb2wRf4KU9Y%Ga zdQmq~W2jlwM>H9&h}K8jpuNx$=mc~Yx)5D~ZbG-CFQRXwC(y4k7z_=gjj_UbVj?j~ zn6;P^%sxyT<{V}aGme?VVzKgAeXJeUAIroFu!Yzv>{0Al>=1SW`vynEso>0T?zku% z50{Utz#YMz!42UiaSM1Uye8fT?~iBWbMU43MtnE^I(`DbK#(SA6YK~fge1ZyLM5S< zaFOtU@RCR*su8V;fkZBGBe9ZrjCh$iMtn<>A?cA^NYNxAX$R>L=^W`U=_Q#=)*?HS zqsRjC4stX30{Id7jRZx)NWx2kEwMqOMxsMvNaDF9UQ$!iNpiJhu4IMe3CZh{Gg5dd zEh!f%rqp_=8mW^~BT{qH6lqgwf9X`|66qt-SEQ$8urgXQZZd3{0-1v{7i7jM2t}RZ zLSa!hQyM83DHBu-Rh#NXO`;Z4zoQONXJut%m&u07X3N&do|YY@Av7(T7cGTWN;^&) zroCIDw8Uu%XUX;@txJZM%*!p6bCl!A70I>9-IjYNPnUO-PnO>$-zoo40i~d)5U7x) zuwUV#!pu_YQro4hrA14RFTJM-E9xl*DXvvKsMxPKr=+app_HyvrF21QMwzDUsGOu+ zu6#y$T7{xwufkO+S2?TllrBqmqNmU+>Amz>RYg@#RiSFV>VWEknzmY~TE1GF+Cz1M zIzv5Pys-#cBCZ~;MXm#GGH#)6 z)ozd6)!Y-@Tijj2>R4y()XvmDLKXQ&yjjk&I!+oQOrohQ}U>eb4k~HZbSnyy9x(W?3$*y{uH6t~>7#3G*6dj`%lF|oWk4CLGP(p*(a%)BP)E2$IF@Oj zS(EuDD=h0owsbZxyFW)SXM4_Mu6ypcYf)=iYkTrk^ETy;t#evezaCm2x4vhC`i6oH z6B|7?9^ORQl)UMue3SgL{8yX9H+L5(6>KaR-{P^QrBI@fUpTVWc5B@>)Hd$6f$iqo ztG0hEVi#R4HYu(seqX{Wx%!RiH@;dd*9H0 z$NjB!N_E9`?+$Pe+^P4d?`Y6!s5po@n0fF?V_0L~w~TL_n-rRgn?4-k9U46xbhx+K zs=4`y;*ru8xJB49eKh*$jqhB)>uNP@t#6~X6(0k~gvXwKAN&3Aai8NoCm1JMf6)A) zww=;m)B$zmbj)@pc8+#Mb`75NKH1Z4+ui=7(T|5tsh+AiEql834Bs>djZ*&hXA3QVUFm(Q=>&;8Iyl!2)z2f%ZaOm)zk?4`pJM24C zcT?`ZxR-fv;r_-4=m$j)r5;v1Qhe0#v+mDrqn4wm$6Uwy9|u3aKh7F|_DjYu?mT-%DP~ zzdZD6*{hzpfVoGnQ(rI47rl{xbNDUeZQr}_casZQ@3HSIKj?nw{^;}Z!Kc(upZ)~{ znDhLU8A*Kr000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQ zO+^RZ1RW0<1SBHVK>z>%yGcYrR5;6}le-PVFcd`(mKUI+H%dXl0*sIbp$w80Sb;$- zM3WJ+fQuAS(z{}WP!J&#{2|G$tY`cAex5g7$-oLo0Cg%L%jex}EBaa^jRn={`A;_* zV@C!bOj)#5ybcH-HTOWOE`97CcMZ6*-s|(F_@hCVbKGh6x9@US;x$@^w1u3XLa-9z zCxzHNc=n}_rrN@A4M<2f062`3>CQpGA8!gl`pE{N6e8(Jfc^>8diifOc6p31K+rfV Tg+D1600000NkvXXu0mjfdt`m9 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/metal_block_default.png b/libs/textures/blocks/metal_block_default.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0d898cf8e6cde291b7380514cba6423edb5d56 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9*dwTgOI?)Krx_@Y-UJAiF1B#Zfaf$kjuc}T$GwvlA5AWo>`Ki;O^-gkfN8$ z4ipddba4#PIG-G|t-_93v!S)IQPD`P(c|jr={gBX3W5fTuicUpycT9C+-yr+3Y22B zjF_e$*&q{mBe&tTW3X?iy@Sp{A5)(bS_WSO6sJUNP?NJ^VAyj_?mNdKRX&i-p00i_ I>zopr02V_$h5!Hn literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/charcoal_block.png b/libs/textures/blocks/misc/charcoal_block.png new file mode 100644 index 0000000000000000000000000000000000000000..19e6a65c82d5eba87e36bbe23e4874a4b273e2c7 GIT binary patch literal 857 zcmV-f1E&0mP)ppZBO;3Be@Ug)b#@w-ujik}cbk*+@zyJ2D+Z|rHy???v$N!`h4Eh&rc1Idx zc{^A9{KIEXZ)cLYg_IH@KyLRh%!?I5KqpVhvxKtJ=vuQoyzpf@#1n!j^x5u@F zPnkcgFxH~x#Tw@<#yXsH9G_oF;uZkoVUJ2T#BqqRaMkb7$x@o8Vf>*_S!t95@-zV{ zS#S14t$@j>Pb*X`p7!`kl4lu#uSnAvZ5m!qZxoLk5CUbbMJbP2u_BFITu%n9b_WoW zZYN{C+0*Y`p!|TcJac-h*zOJ(YY{@A0A|ICIBIb&Yf5dfPSD8`06vZf7~@zh7Z_uy zwZ&oi@#}<}y9E*;iQ549O0isT>34Gi-=kP=X{_VnaYa=(=*FV8rm7oG?mD>j=w!hyQ}G-CF!Bn*5e!#+Yl zs})k!n&oOoEA%Y)x%m#mPG7!2jqOQW<2QPc^=C1m@n3pwV~1mtqnoo17P}A`h0@xo#5gd2xyA)gE0poXd*$bIo)- zpw@=%;l#XnA`E;+gC3nUrdVxJQldOhV3F+hN2Gvu6e56GvE+l)ZRQ&I33;~L@Hf+3`dcA(eNgg0zYO3K`@rAYf!jl)blh-BK1Opy3Rju6{1-oD!MQ(Z{%V!581cAQgu!Mil(@#!D6jad?H?oATPx3-zK#dI4oH9WNH{P}85b8()JpO4Ei>unRb zHD^e=q@0^^^Uj(Kw#rYp1zcH_lK47Ks0d!X;q)&5(z5rz15?tHz5YlkH9gz%7HGqD zWs`~vMUBn-6<+*hE)TGGydZ5-VY2z>l@Q&h_7$gop1<@U@Ra|LqMw4*2iCs^`i#NT L)z4*}Q$iB}6r+F) literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/de_tnt_top.png b/libs/textures/blocks/misc/de_tnt_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1f17293821be5f039e7271cf8c78e9ca2f8f5891 GIT binary patch literal 504 zcmVgU(r@5AKAD_`0>4&9N)E3OtAuc#{DZ+@j7S4$djZLCSY z^7f8b`$%C+8Xz|r09)Cy(j@@m1?LwjgX_T)z@eH`*fKS{8v)zbgK^EoCw@*5LdC=NIHAqo8CfyUF2# zlEy2q_OZ8j>Q5QO7{PK@eemrn;r`_o5$X3}oIwZySIb0w$YlKXA%yfl>)MWeHD_PV z0a)oW`5V45MqK?*ecbv!qB^EN|7PPP;gN&Y8$FsR^r9tiBKBZVzN`fKm2 uInFP5;(-vtG=u-)b8XBgdyt!qOZZ=?IO&qKYV-3&KC63hew3TO*VJxe}l=A5)u+Et*jCr4~_fU4rWO7 ev@tS+07H<&4#UvfsX(I{7(8A5T-G@yGywp^H#v6z literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/he_tnt_side.png b/libs/textures/blocks/misc/he_tnt_side.png new file mode 100644 index 0000000000000000000000000000000000000000..d8cc7c7b04c07731244ae7af1f8f616fb6df1a85 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqhlG%xQp1lsGk`+7JzX3_EKZ-DWXQ#2DBxNzc3UQ4 z_1d} z^-AS2sLXiIp0)Gf^sm3!uUPacG8sE(>+mdKI;Vst0PVGPumAu6 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/he_tnt_top.png b/libs/textures/blocks/misc/he_tnt_top.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2780a4ddc1e1b41ff185e9130f9b79061e89cc GIT binary patch literal 485 zcmVEjUDqMDjs=h%G<@H>3+46-Y^u zm0&O66p5W(2n8cqyI=nH`2U%yByr^UjXXb5tJS#$-vLafGbYm+S$5=BeCKbo)=~^> zEgzp>tk#=<_k2_a{hsqT4@YCR?{8$;k>O~}a*;9|jWNd1YBnx70M%Np9&~Nr-+1gl zaoFzwczC!6Ac-SZ>rKe&&*b@us@DYY`tr;RgMl0|LKttq+QtMTEnCSCWy$ z5qW-sB#xZc+KI^3?10l+yH>LiUgL4_Kq z?sP*Bv^(9<7sUzyfm51=cBjj7k%qb}rO2`)hy4x_L2J!&kp?p_W}&3(EYA0exHJpC beQ&|vswe@i>rb&=00000NkvXXu0mjf2CdAw literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/le_tnt_bottom.png b/libs/textures/blocks/misc/le_tnt_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..5c37d4b5aa3dee03e07059f5b3aa9e508ff8b70d GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqhlB{LY2mdSEkL0NPZ!4!i_^(>%GZCeXBMgX^`*11 zzrVjx#EzSpnfY)l?vra#v9+VO3Hmc~=5{ag0u2l!q#(OfXRo30tam^7 z1P^+$eoK)!&U{X(;tSJe-SXYctA15;pXKrWzvuj}X`k#PQvYv0!?W}c>tf!|-D_85 R9RvD~!PC{xWt~$(695cXfVltw literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/le_tnt_top.png b/libs/textures/blocks/misc/le_tnt_top.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ef74266e9728860311b6bb17c22d6796b0945b GIT binary patch literal 506 zcmVrVr4dK%A+mYErQnlJl4f zR`LWmUf}KluA;r|QLcjDZ2s)b&iwz(s@-v3^MkT1F~)EWzXdpK`vCNYdyFwx@tfwg z5CUz45SWfOj0fw^y9R1|c&w|c1fa+jlV?p;l@z%m&1#BV;l1bm^C8BhSyau9F$QZB ztWB6aYd&5otW5yW`djbrIA=QAFdc0GV!YPo(u3JDVLVs^kY*2n;;`)_A^>>rac7+xW9Xgo}780wPCij?2hw`+NNF(&T!>(eQAAR=h35fQxicuyQP$>e1Qg613FxY!i)%qIQt;Spgv)>~)u-@g7otN4SbDai`0=Pjhz h7AG1=vGITa!(86ETlZec+z&LJ!PC{xWt~$(6964oJ7WL< literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/m_tnt_side.png b/libs/textures/blocks/misc/m_tnt_side.png new file mode 100644 index 0000000000000000000000000000000000000000..cdd98630447ce6805d842e07d4b699e25d2743dd GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqhlH@8j$O>gDL|n;o-U3d7N^fn-pF;xfv4@iHmi8I zLSL&NYvH77hWm%jKd${H@a{X)+`Qs|ZkLU6Q;JVbWnxbH;#MB^|uH)tJvf{OsNU_fB zO;6`HnXLW#izDC-`6JJ3ReO8gTd3)&t;ucLK6T126oy2 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/m_tnt_top.png b/libs/textures/blocks/misc/m_tnt_top.png new file mode 100644 index 0000000000000000000000000000000000000000..62fcd787b1b419e2e2f2074b45e991017029c10f GIT binary patch literal 506 zcmVwBXQ}`I0f$LM zK~y-)m6E@T>Od5SKi4H(Nh}h=!d7_-VVZQ>Y>^FI7zp|bHdb5s3^u-ki!fC-MJ%*S zGvK>u;azqKh_}ceve$UQUo&&&oH;YUZ>Ez)&V^Ek&m6}zxF>!D*bn9aJZ;`^OyjQj zq3Wi!rYWs8lWmT_KD6d4bv^>?a{9^vNbHdDcgpE2C$U3Tdn*0G2zTbuCA}`OywUttc#iE@- zVut`M%7X0qH%ckA)+nXQ8%SoeSv!NuV^!Rgl#<{WUTto^ zy%6FygUL2$H8OsTmH+0v^&c$HL$YXB`X18%PLZ;Js!A4>|EqtXwJtil7W=^*0h~55 wQ*#Fm&z@_sJP+F$+|s|f|1#+J4DN~l0uQ~|={u{ZegFUf07*qoM6N<$g0k4)o&W#< literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/pe_tnt_bottom.png b/libs/textures/blocks/misc/pe_tnt_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..307308846d4838069e26969a7c50267b525c6609 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqha|6>)=Qh%E}&4br;B5V#p&cLJ4>J2GmF&x{?^;r z-QC?NV#m$Q%`fEniHV6(`8ZQTgQdqyT<`DypHI1C8s@gQ1C>6`kmzYU fm?2>R0t^h7&n^x%`q=&mXgq_btDnm{r-UW|2~|7a literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/pe_tnt_side.png b/libs/textures/blocks/misc/pe_tnt_side.png new file mode 100644 index 0000000000000000000000000000000000000000..151f71074fe02aa01743d7b1abdfdf64ab2d356e GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqha|6>@HWe{e pIAF=PPx3vR?ycE+Ym5I6UT%?}q9-nxT?TrA!PC{xWt~$(69BGPbV~pL literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/misc/pe_tnt_top.png b/libs/textures/blocks/misc/pe_tnt_top.png new file mode 100644 index 0000000000000000000000000000000000000000..9256f1cd71da74af5f7c94f36f5b6ef59343d08b GIT binary patch literal 503 zcmV- zo4%X1mLaUQ9G45;AMQtEJtlXrZ>Nv81t2O5_G!jP+Y*%pRh$r&1;!X=+nvj);>0z$ zQA*(l0e%p$PcwdP*7!jHz|`{q2cSL1@ z*4mA2j3LkSaSfuf0B{NY_|{sCF#w1NtJP{;gJIEEhzM1jF!enC{QTiGnS8egJ&nHj zu--7wQb!}K8@jIh)L_VQ40)dO^r$&57l;U2>;E;-T2sXdVcm=t58qyE{TaM_eLKyz zJ7>VfDIyp5-foprj`uuEIh-emMA&;CBJz)xF^GuUgNwglt)+?+{QhrfP1Uv>)*IwJ tcE2a{EFIV2JA91|{fj-AdLGyKe*q{W^0HSzPiX)E002ovPDHLkV1nro*{}cr literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/alduorite_block.png b/libs/textures/blocks/nether/alduorite_block.png new file mode 100644 index 0000000000000000000000000000000000000000..293efe7be05d04246431a6380f4c394be35e2d13 GIT binary patch literal 454 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/amordrine_molten_flow.png b/libs/textures/blocks/nether/amordrine_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..e98818ea656e7df4a38901a89463a384ece6d2ca GIT binary patch literal 8513 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%0A2W+zc^CL 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/amordrine_molten_flow.png.mcmeta b/libs/textures/blocks/nether/amordrine_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/nether/amordrine_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/nether/amordrine_molten_still.png b/libs/textures/blocks/nether/amordrine_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..c757df3bbd77a9b67b16732491c67666624dcd78 GIT binary patch literal 8535 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/ceruclase_molten_flow.png.mcmeta b/libs/textures/blocks/nether/ceruclase_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/nether/ceruclase_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/nether/ceruclase_molten_still.png b/libs/textures/blocks/nether/ceruclase_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..ba6aa1191c2f1162b1bbbe329203427cc8b7a25d GIT binary patch literal 8809 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 TL&O*vJCmWFiEgR(gUJ5^Wo+Qj literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/ignatius_molten_flow.png.mcmeta b/libs/textures/blocks/nether/ignatius_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/nether/ignatius_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/nether/ignatius_molten_still.png b/libs/textures/blocks/nether/ignatius_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..cf907c1d63dfe2bcd10ae5cbcecb9de94def3d98 GIT binary patch literal 8645 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/inolashite_brick.png b/libs/textures/blocks/nether/inolashite_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..ee501e78a610888659a496e3a37caf11db6f2a33 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF zS|=w+u&lr_9jF_~1maEUce;Qq15X#n5RU7~2?;3)49Tj_YN`Th24*H^Y>8}+8VL=n z5>gsg1Q-Dc12dN(XW3!~*Qq>)Pi9$82I^HUag8WRNi0dVN-jzTQVd20hQ_)EKx7_b zXli9-Xk}!fYhY$&V6fuGPazZyx%nxXX_asdhQ=XAMplM~R;K2<2Bts_e{O|-18R^0 v*$|wcR#Ki=l*$m0n3-3i=jR%tP-d)Ws%L0m@TF)WP!)rxtDnm{r-UW|FavF? literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/inolashite_molten_flow.png b/libs/textures/blocks/nether/inolashite_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..16cd1653ccc0b8368bdf372d8c0dc6f2bbc12a57 GIT binary patch literal 8766 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

gyv5rf~H{XVpZU+#01rN!B=xrF|F zG)+s41iBgXiyU|{UlOL)pu$j*lT@bEfWuo!(s&GxUs^Zugy4+pb87iwp@xf7k#;P} zEmLd8Kg5qfcEN~X0~nE^m|V_~nwT@{gMK}-VdTPM6UWYwx0J=#tdACZeI{nf zLCux-A^w_t%k>qz>LxasxYKf1raTH+;OLyW{VjjGDedy1NM*x^n2-yL9xcSP1*O!O zKaRJjrQy7?9nGYG$$7Xtafo(HE5BM>NvmVdbHzm(QFUPF&uiSci+%(i1%N;EEr&50 zUT2i!c`azM^0h-V@i_Wj@J5JqMr|0rP%Al~)vxdR_rRqsVs1CI)*o!+ z*kh8baqWm%zyFYcDoPBP;RBYn#Owqz7$+jX z^jr(?AN4wSs6b5b%eREcy4DR{#fE*a69r15=x7zW;RAVYW1yyhY|ZCC?@Qok(lyvz z-ZZlR^ti}iVsmFOtir|L8E1s_w%#2CbdP$rY;V8AhYRR`oLS{AtgY@r3)Oz>7I8aT zSd>2_6hvk1=XObp^;LnE(HOXe@?kn8<-IW&PsRLoh=$cS#g?jeGYaK)ps^&UsUs4` z#NClGYB@g6Hlu2wvzvp}$6+{X%K?wppf4`#^h{n@gGPAT2ue~*>MBZVCq4bgI{Yvq zO2+V-!Cj9WMt(rT70Y)LU_d5se^!iL6YgbiaGynh#=0&&UeilN2`8wEvNLCjY!_R$ zmRk?P7Yn~Z`f}$^1hSq8yrk2h;mU?su$6s|qy5^o?uz#iT71-UUSpu&NrU+{()2su z^5q8q5p{PNXS*rX0|wJ|Y9AS~GEfn!BTn-U?P30>N+RTB`6Wr5Byv#8bgQrXsk3^k zOQ&N=Pr^PAf(3Uz`o$Vye%!Cwo&kog(dD@X)O(_q*C^<@8wOH|@xLJhjQGaox}(XITUCy9*W1jBy{+o{@bT9TI5@lm~<2JG*KLLDwnZluL&|bE~MG z7mhq>&2N2fjY`pPIG21g=IQkh)P_`a7;ZU_G2_%YsRX4qs8XK^8p7%PK3rRsqt>3~ zk~3-v^~iACxD-1xBf9(A>6TYu<2w>h)5}X5dGuyy!rb^JBfl>7ib@Sa;bf80!Rr@T zmX^iqz!0v{%HBjp=wg--pnNM>8yI9)p5ERysM8ueZY(k}a=tw+!Wd4tC(r(=eZEbT zH^0m$a{fEFd)LP%hBpo$YC{-`L4(#STK&6^|8csMk2g!lU3O@Clz~#);sxBT>*C1* z5&;=o;1htf$~&X}#Fow(Y%aP?P!t-maY&+>gX^TeZf|krOIDCr9T*!j8~eQz{10hN zh&FX<+1Q!#98Ha`?sa9cJoX@M7=$*je2)uuGQH)Bo`ivjEJb>r%2d!Eq0aW_&=_e< z=Vz7WD^n-`3^P?8!=5kdJjk+}+HfBeg=#GNDb2iS5B90&8hDvvz5djp%$4mdIEDs$ z$w=^LD_;rc7z7^5;-T}TzOac59%iMvPMgr(Qm7{5q+C92g)#3^EO^v!{=ZOj5tvY; z-!a$CIrF@%V;W9>r1IdAHc(bRdAy=eji=dSDyQv=1qfgxQxl9$c9y+E>&y{zsl=w# zteWMUy;)}#YU9B}KpY`P z7>Zh-RWp0lKReMZU{U-oYk|oPIN@;rR~MEv7QlY`J*`N9l907|mX%!cZP+lN(Lr9( zhR5k6KseLnJa}v+^{FsG3%cPWSDPpU70{H}Bk?O5_%rDAbxB8(-5#jztF3RLd%dkm zl5874HLu=eq7KEf30GYt|H4fZ9@rD(>_Lc`U?ng&+PqC)^;iNV~kz*B-;XtdHC^EQ_ryT~Lm_Y-kxRbgG(sD7SPf{zeLOi%y)Vb)Irv z{d@jY@p?uNsw90L(&jT5d^%h`Zf8Qz;v*Avsc91B-YPo4YcY%E6P~phq{|66_`(sl zTSw;Crs4xl;90)TC^h@j5yNbM(qJW7V{x5*sc8?t=lmhIiRB~dIWg3_bq4U}tcIqe zT>5ynQIo^R|Ip84x|@MVFi)ioI`yGiJp*?zP8dX?z?7bNQ_{YFyfp@mah)JlOdh{i z8v(YJnVh)kRgZiluX5Kt?)Ad<64#=Nj^ZH*oI)+{IeYfd@|HHYjbB5{QA5)61mF!Z zuypMA`o`o#HY#Y{L%O5E{g7?yr;?n#UB@-^_wAn$l#n`B6V=$Qanh6&_*~pj!65AO z%v&neM7WLr>&9fmMez#IBI&a0^4lnD5v-+43?jCJCQ1I<%?YX6wV|DUTs9H`!emg9 zrVl?cf$$9~mCEj4DWpld{*_e4@Gbw=#Z1n*g~J3@x>UXMmQ7S|GP0^+cu2Rq$x7xK z6Oo4_LtIb(vXy~S;9>yCc?8IHq8#<;2s*9($L5<9I%Y+s5W!FFb@ReVvj_R(r?y{47)8*1T3$nr2XCP8In+%|!C z1A+eASJj&e&;28url?y?&z0G5c*{uzD=T&T>(>U<5(wOm^eKk5wGpAx`t!`vk`DZr zHzX=p9yYf&Za3e=0Y~>$^IXn#E3DMcM7HNihY3;d;q`jnRgSK}!Iy12xu}9K9ZnXn z0z>6@955gM+yA5FWJ6sst7(UY^#a*j&GP%nGF84?r`nQ9g%alOVmrE*Ulh8XZ}$r6 zHt*x8ZX8`BsRkIDfg{LpBQ|%p>&#f8cO?yc$?4XMH+FJ3OreSyAuaF5_19~}p$6Ps zuvkPiW8j!$rivVeJl70HL$CP_RF}bHyYj!-I@&o3vUyf+yVLhn#;jVpio@;;$K8~G zZk-|!qtX;E&VvoLc4Mf2#_^tC54xX{s|RstsYDn2>cf@pcp3!#rmvuePY}ufT|oiy zCzMJR{qxppF;>Xg6dTuLZ(1s7`M{2dk#za=L^J+>^bpjAU~Oa-(m{_nE>l3Z8hgMH zG}h)3+8(F)x!a6KSNi+_H_9Z@D;zx5%6+W6?>_6Lb+FXF{m_vzbyQjbdHCw~%)(b8 zd04;uVsj4@x~X7L%P=y18kEMP*1cygSp2=`-95VNKjaxe3t`V|zd$LKQpm2Xl7H-L zGc+c(%(%D9U#^1{vRIGwXE4>`mTtZ;pW|q4yP8ET-OP(mJsgO}OC?5stSUeY8~*C0 z8!pbilS$~1GRm!~t?HU-v%NCeK~63C3!f@)Z<;*!YyA7K0FHp{abdl=wI27{L(P{k zuN&??{n*XW!);00FYl7l zx#BK2qN%HZo6@%WF8`|}^t~+zQsCI6}MtvP=c7&d%99uc}C)!zT=Xb*H z-+jLdoz5BcJ~-Z()RfuL;P(AB_?b0%!(1jm{*c}=X57V{6J%=;)Qtm%P)Pe2oZSO$o>ta-maZ6jr9oL)}hCk)mcco4F`;Tq5^<6=y)r zydHT#9!xD<9KO{1$T5|9vp%he2DW1Fs>Rtgch$xckZT}CV!(z+HU)%S>3`%| zv{fIk*m13r*9Qj)i%$Z&O~Sq-QFx!wdrC8Y?>!!&Me$$)*JCZKfv7`I0Wabbu&%{IUw z%Dd4aBhRY?KCa!g{XBF#!%cQ;xIF$TxY@7xt$Gm4)n!yz(W)3YmCcmP0KAsI{PFbu*I&Bbp$#v0s4Ynxk}4^H~_+vTPgy`))l>vcz--d=OD#|wMZa=A0N7t5Hr zrAuGmCnGfE;^C4mFX{O>Q{9n2EuPsoN zD}=a|^z6v7>3)vd-@RYR$CCqF40->mMlZf^-}6BO`LINfqrHc`X0oyIOFAmvmc5e? zKa*&V8oa-nwH5dXr7K^vcXMx~cpY-my1-{BknoTd&N*B_{#)loKtiAESyrp=-HGp& z(*YxxXBeYdg?9JHX6SzrdCqPI0Z^lI6u5>tbEpItg_sPNX9jc z=zR_lmFy|GY}hZYu6oUt*78Cj%h#3HpHnh+I_%_{Iiufi_iFRpR)aWnCw=7EL5Nn! zk<8X(lcysMc{HJaSXC-^;3a5=mxyGz{%Fc5(|9<%F?&wd*%W+e7eGXM;z+pTA6_bc zdNXlKA3x`__5UvWsa&BX9Qs2Z46LkG`X(@QD)^Vm!;tN+83~DHq%Y%w z^qET%&f^{$J7r=}*$b5xDLm7au$k0#y39H5A}WxjRnk@UjlcIT@`yx5x#Psd_(L~e zq5%A&u-(m1grllPGV=035){7W(<965oa?n^lru6lRj3QoK*3iQD=Qdyn=M0c6!F{| zwY_*2Z_2$_)9XGoLQH_K!jA$}9qb3py5I_O9m({Pvmtv$ufo`Ykr4b^w*)pY=8#Dk zkBoW1#PkH%Re>OMsj6zZgJV^g?9w}4n)J8SJm*}wyqp1_&QG4LEXps~Rrn1JHhSA+ zv#iPVZ~pd0G17~(_r&;V3CxGM&P453PW{|omIHv2%?e|wO@V$C(6W}ixGc57*4_a| zsSLC!?e1(SZ`3FRqambkKX<$4_pop}U$yfFNFv4MC8H#VyPR{RmxbcC?4*Wm68|SZ zikKEVDM3%mtohefEvtdYP+tRGVnl~^PW+P|S&ZKCh^ro)UrWPD@9bqvh15(f4`=?o z@m_^up&WR&pg6sqa1^i1_-c-qstDN*KpoVJ+vQc00??&gx(30hI*BEtBlKSkSr6qj zXBBk`R}wG^@xSnirz%kVgz5knWnm=4I`Oe3)?Y;OMVv@*$BV`$z#spUO2(Ej2AG0^ z+biphx$MMQj0P~#dCK?a8M>CPh`HQ9iMV!A^$7{Vnc%cj;a6!;V3CEo`xV3`#q4jt zedNfqKQCtk0DQgwybFL!zSB549{g^^LnAp4UAkbaXVqf@uhFQ`dz2rqZJ9p5@;}M= zGz|2=!8qz@5>LjB(6loG27M%yJa4&Jc^@5oi-v%O;e~E7h)yM6BJ$E3ErTi5hUJH| zkrvXQgd!Ify6*W`XAgY%(~ZEBwwq-?Dx<+!zDsEz-3$RX_V$B*w5+(cEfu*)(2Jo8 z@XYM8uF%A2`C@=hi}0r+H`$JsDNp}Gt+YG5yh{`YBK`WflLsrGw6iwb_3~x(XiwH> zRJ3{zzU{fFTCq3dxaZX9z#hE53Qm!LTeU;Qk(S-}BJ)(pUHTw`@=2WwA}Rh2B9sPkQ#JTlXaHerERS zR2=L(BenGG6ZVxy{W+IaB?UbkcVQ~TInG-}OPgx~{5Qz_x1Buy@?>Ag=A4F6$n&Ua R-m3)w6C-oOa`cVx{{s!OAMXGF literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/inolashite_molten_flow.png.mcmeta b/libs/textures/blocks/nether/inolashite_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/nether/inolashite_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/nether/inolashite_molten_still.png b/libs/textures/blocks/nether/inolashite_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..0b05993384948e29b88fd6676a1fea880bdbfa32 GIT binary patch literal 8989 zcmWk!dpuMBA3l{RC6pvYL>VPSOzyXsOU!+4F@!aj%{@c8jK0WaEajd>Wg|6rQ`Cf7 zg^s(WVQI0DTcY27f1KAjuk*)wy*}stc|Xtdex6UJz1>wIK}kUX0EDb8&EUMd2mtIc zI<^od(#STNo$R0J;0B{5l-!C8WlJ`I#4=3oHT$eZIT?KJ`btxJVuS#Y^GR zrJ{B}tdX!xpK7ty7D3@sN(+#)?f&;^(m&aMJx!tZ9@^`&1~_F>-GD}E{X|>7oCZI& z2@DzZ9EDz$q((J~+sQGSJr2Bfn?P{zGrz)Lg0xOr1f)kthl_=!N^aA9h}7AH#JFtr ze04@E;pinIT=^0ZWSX=&(UrLKHw`%bQ?B<-A&LxxaB(9Wl-1^eLaaJN5@{za9Ogp< zK_zwvStUg1xX90jZt zR|;>3)+vV7a&8U&-u&x?@|xfJyAnd4+R!KQ33;;r&6odk4BQR-w_v#MRjl4=d5ssc z@fr%uYakvp*3Oi_wv?IO+Z(1hfzzs z)uYJUZSqym#i^IgfUmkf7%)9?b?Ba1dKqo|zI6nn)W_TOKp_fsA-#ec7|5Agp3(FQ zgFZ&PugU&fW0D6DhlKHY8Gx8Ph(M7m#N=gi1ej475~h|A2UY0gI*5SGEpIK$$P-TE#=D%A^u3cxC8kWM_n`ztBlt zef=^YZx1xVdU`}i3v@Ata3;g`+-?lXw9|--@C-%bLi8E(6Ht)rBUm97kFuF-qoBxZ zo8c?dABTRgY*~}PApR?SHfTwAL+yMjmyt1kwt6^H$1ZqrB(qqcNPebac6@E13%FF6{wyh!b<)a3eyUKg%wg z(N;kyd&dJe1+K-@Bv2b@YpC%)_LS`IdihImw>N3)D)4<JKk2MD4U6e^>YcUfV@ZC+%*1tXyK;a*{y)7XhA8OFfIEvwUf`%wJ#eIfi0B{;P?d^>`KyDJ$qGx0jj_GX2N)Uq?kg$QOe?Me*-(IdSe8$z2S2lAR zMWD&I;eru5S<|;j>ZCVmnTP5p1}jJD%)QtD^@*TTg1%4-$@|fFGoHIb3|pggpWpRIANZUB~kdEAab@`w3jQ& z76LH?T1qd%&S(VzuhLo@;ZHfYkTxjvL{oo)j?5_{+Py1r*Yi+;*1J{!IH^I8mQ3eKWRBbsLOt?eLR5W%!*$yZxzwsHoEu}utGVw`Uv zGl~on20#AWNt!RQW-zu}1YVoYc#0)s8Ez9Tdy_$g$AoZ?o~ZO)x5m_VPff)0fqhvk|D{CVgWF z50n>M@#n21iF?8|pd{=qVO!c{bVLXcad;$iPhhJu-@5N);nTFtjFOl_l*J_R!q4{0 zvmIBn)h&QrmTB6@as%&=#49qAFI^sfHQt0X;@YNL#B9yXdhtUVA3jNbaT${7%bhgj zw)ZRql^&9-mUxJTSdg_s^u5A> zohNAq)qc)hNZ*}V2-eB+6&}zlkh86(hLWk{8MU(sy`~TnHLz1k7>WAe_J}aPu@g@_ zAbK9^N})Q-lc&^Dare}{y_uR-mlgEt#mguoiPG(~Yw97UZYq*D+Mg%=*?fKL<9jx- znZt>r*+NL&=Erb65vk$t@GBFGjt-jod=;C>a zy?_!aVdOJwbyeddRn3*=O`(P#-Xm(=FZdaHPUXpaGIcq&qW|x&O$pOlGHrK7YmUb% zWD-HF*5w&>JzS5%=_l23p8nem+nuAKJ>4Mt1z(WGnlzLOPN2xUudgSy{V#vSosoK(G$m-P7t zHr3Q6ybPc*ho0(g3pVu{fxMAGlBu(GA^}5TBPxBR#&2AtKN9Vd8dHwCb*0LiWXc&sC>!a)i$@H`M89cTLe?GL=Gh3Dh89ANM=wP9t7`(_2UL z;L2%g*IqQtj!UxP9*VAJF6~2x> z2Hd&RfEO|8bAKA3yTd>u41yN}d@-mjFhaON)hTkasip^E6b}YdB2xB%qnM zvCCs~wqKU-gk^yRnHu^D2C0qeo10!PZUtdrR?VYaMYH$NKCOu9NAPSF*RxLF`O8h- zD~1ik%puHhEt8I`fhLnn|rD?b-5fsc^3?jPKD zfEqYIeai_3F-M>Vr?*{DbAm7ksVHC!bmpl{NXE|sYI&IEHg~Zf>2g5 zot`S#x$(GbU@n%TafnXxr40DJ`)$f}ym;2c?jRtUyiryclV;7_m}t5%^uExVQ5aWz z!a)=UAxF(2FcxMoIhkwckQbDwjQ@T%el>=egA%BA8nc-UwxOlS97&S~P%!*&k#?1sk|16sVi0>TmPR8HMh&mZR%eigmnNX8oVH><%LK0jB)G0nwhO zW>B(=b=zjHzxC&Y3(Pp}L9Jm{V=Es3RkY7V_Cr<7m@)J*G5HW%m~)`KBz<|2V~x%h zc`oM7PO~;9<3ysypexDmJj0ZzXig4T#QW(gjrg4KRfsBCq` z6T^r-JnZ7GM;#NGVQny>Tw>f~LKT%F^(PvSI=V_SJus(gW1#? zHV=t7&YVZODHky17<<0c;^@GSC!`S`j4SZlvW>-Q> zAiyYSn;h>Ct(7zxvET(p<-*?kvf2!^93R z)#d@}7X*w4$%}K&WyXk9oz#d!EgyL8N?Y|B=`*Y_NmF{`1u-|HakcX5iu|$?W=a}g zBG?IND)lk1xz(cBb>D-J;NBZf)hdLk!RfBlWrkx@)?Ba*1?y>0LRyP3E5O9gM|+)d4h5N^EO zXwekl({!pyB4tw37BQ>{oK`+hy2**|^dts{Qr%HFrd;r{1_2JX)d+vg$Uq!B`K@~> z`uK`Dm|<34^8|#^EuF>nzK6w%IGP+=>j41h4N+ge%6E26AdK;b^lIv`JviR7?$g`O8tm+Q7Q_CQEw28l)_O4tdY zHm!7H?-^siJ}Bv>%_Y$_3BbknZ@wd8#DUVOo?32Da^dfLS>Hro58+~EJE+!{vI zu9B(>4I2n4-B}Rs@(CT9OJFEAmlzq3M6s5WcXT3ghBEgs#mKC%ix-E`@>R>R;fy}r zN@MhgxNF;udtPlA?*3X|!Qie~t2QuJiH85=t6`U$jVFo%mh@DIes(r9?(RClGJ^?@ zFi7UP>yw@P==%1mJT)0Y-lkz8cLYcTlbcjQo%YIW>JdBuuO{4;OKm{O59_8*xuNQ! zrl*7&(LU_CUgl1dEPjrIS{6Azmc!-$Ha>!_VrNbwc}m() z&!DKphnC>QE-ps-ss)xkj`D`}3p$gd9um9L#Qa9rr>+1E49X?oRb=~zA%Y(Puz0kD zmrH*obw<>AKFVA5V%W;>jU)9UlF571`Vkv5Ls#Vot247^x``vr{mvOr&)TLJ1-FF} z;lQsyYvvfCyK>>GgI;1!LnT7UB(b~?Kr-ULpHHZlgPe+`H0=QZZ1a_vpCBLy(@&p3 zfA6We_kUSo<(PH*zB}qd&VxY-ldt{ux2^N8WvVA`{_czGI)BJB8Ti^$bFJ3l*C&M3 z5mv%Oe=F+ahNbN`3Mb^9m})h3zTf`7w2`y;XWlIW?Ns~l-1 z=Tm zsH0*!YJW}3roPzOO4{kL!S=n4@>W(*{sL6fg;@7ZX8ZG%uIDVQ4UCi=6OB-1){XTn z)QT7zk8a?FuXXM8aEpsE4Bnh40qa-iOM^ka$nrnQg+W>u>&v@>fF10t<@)3}7!}t9Jk4}o1CxhddPdVKlwKrN31)Me zLKWvq98tEYqXN#ODR7une0*Ylc&26uMY`s+zAME1!C{BV=t>Y%^+sHs8?^XK~2PChevipL_`QsJshB zo`67^MJ6Pu(a*0Q=9wQ*B4^99waNmhSdR2$$F(|Zq?$q40S~;`*X{|gYFcS3PrcLO zarQdvYa2yMpp_mmQ6I)$h%d-dp1fLSe@A3T``K!ZPBfW$tEELa-K(T-1doyG?=P?t!(f4K$SatzXj>F%n^Lgf*Y!{gGLfDev;o95k1k=!fmXnx*I|^17}O#-XAg}r}cNJ{)cd$Q(iMc zEp}W~#QF}_dXRmE6>n5-)lxS>-WFcq38RFE_9w*n8|$Ab=vUd-sVmNPeckgln)U`K z0Q5r-ijf}XYLT@_4pMvfbJv^lcLzwhkkziw&`kxVV9k+bk^(7wpUMr~Ievu$=o5N6`0b{BuWDqISlb4@3Mb@3w>d;2hvS}Oa#^j0 zhuV~(I_hOmhfC`_w5%j}VlWkfGHo1ySnN%f=pJBSyd%Jw(jNQlRG{Nxar3DkTmSZ* z{FO+WpbPq51Dv_d)S!Q}Wx<%1{Y~ zh89|>b-#H)ahcRT{G=I*?{qG~RAm-61P2{xOZ zVfNUVbu_?3YoTYk1?_1n;5$i_ z*Xt6;qWKRb%XiTqW#9OJu1?dXi@fF4_Xs}4q|omuK97%u@wG>(lEjZpfFT7KFBr5W z2OPyQSu{r!SxUe*-bXtdA!R})y%S8v!0wzwzNb+leX@)Yk5(DF%|{Q`kg4+$#0iDO zlYqV95#I^zKvvyZn0g^RORLA1z<~(&QNJ@}W$cE9^e;&z=U*Zo#m;xrI2{{z`ody^ zsJd*W-fAO#+@EmV6)xxOx#R0Qf1^X!R7+DUi%LcU-UgKAy`+L|KC6me#l`L|SKN^$ z?Hd9?xsJMBooVQLs-VwP>h$ufEW|d=+F`iqQM>iYq0SGMPlAO+I~P(3&VgK>)cMvd zF8_lr_tp(Q4}XcpG5<468c9^YyDBgAAb}?>+bHecswLKmVOR)B><*s}ncBXMyz=pV z49nBe(tX|ah?8>tSL44oOw1_Mcdj(1tp-1!Gr62BiSN0emJT8U3eA2SsF*TZeOP;d zqG0hf8%4z}=hnU7Mq8E)QWU{-_*0GlS{{YzUxR75dth>I<)(iiMe?kKen{p{cyEfy zmylzhFRZGqTpa^_r8AZ;U!;Nw%-|}Cy~+wGd(KNdLgkLQ+x&gW2(yFK~y@NSv#;v2(3 zr7sw}lER+u>)wQ_RT-W>m^{=M+5T347*V>>v>NkH*Q!xK*212+sD!|v|Mm-4 zjcSQr!sD75dy{WIC~=+{#B{Ruta)V}DE09-7?3co;^>Q#N(#Qdj`sd_8zF_%_#wv9 z?sjdl_bonRCwD-mMVXX&I8Qd7xfS3IT$kXdbl9vmou_f`pOnnybj)4@uOMyhtU@ZE z&l~u;+#SZEN@e3Qr9=$87~AiG2#_c~9Ke9m+r5SnDf1m?fKRpCJq-+NH*Kih6IGLa z2(;kwlRfVtXFY4eV#D|HJ0PiG|9QtF;4N;aO9 zycI%ztN%tnS8lkLDz0XP0-;u@x#d)O(GwOOAH~CGO7b~>KM8GLp;flOSC@qO-vZ?1Y7Z4nuAmTd~`2Y%-j56ST99%T=_qZmm@jf{uPDSz>h z3#qzt+aBgwxqVFV3cG*m6Uy|H(XlAga%O#j({r@@H*sZGSXXz72*QkDFZVVw$z{L1 za=ugctt6#7!eEiYgAFeM0BV6e4}{N2v-FcT(*>Y)`2&jyqDip3PoKMJ_d^N^%XXt3 zC*sC7Iyni?Y@gPf%);M{ACK8&5dEv(>rAY5MunzZp>PQaU*Vxd)M#{G50FeB%WpKR z5OlH&X2#emBwf6OtvG$t!>%v7tYibz*Fq3OdSk5Ir3MlBqyC$-Ie4(-MXID#!J^r* zsbzb3j)ecC%G)LZb!2LhXZXVtq|ZBs%i-EuucEvRk4Ub08ER4@gpWf1&>SW zIc+p+bt_8r$C@5mftFxl)}H=*{UWoh)nk{qocT7&Y!>F#j*e5HYRP)7y$}nyqXWzo zZMUUGsXz)qNvjc%-s4+5FLtJ)pFldmF8Np=R_LyLNPaL}?2;gQJrc3$SH2j*cQ=&(wLW$v46zTWtZl)xUX-A>*i~HGLrhyTUq@ZrI(84#YULI zzjFI#w@r?p{@TFT3w9ZY?c2T>h0Q#XRxQK-*i7D!>T`OW37g8MMuRf-y7zf z2`M!>9aouxeL~)2q7LpD&n(A% zc{*igM#0SZyle41Z{beg<6Ym?QlA&S1ivZ01PM?5moT84RP(Kh>n9`rPzr!@=(Hvw4gl)H)VN8 z_enJ7ODh5G)$R)~ ze!=MoSJfa}&X+C5aUD1dm_qpxSfBrUwZpt|GFGR8o+#b*Z=si)`1f|*2lYx&L)doZ zh#SQGnDNLQ!7;0`dn5`>Wm@J7dtitopJY!MV7bA6Tf=$jHlNp z`<;39ffuP?4L*^rGR#jViG&eRf)3I!lWa0ivufOzSwA(s@8Yl61h>{kF-L$OBJEd!GNmI1H&5uj1kHMzc}{#6eV_Z8CiT0m{UFYTlxZUb}QLx<>r#wki+M1N>>`Wo6^$YiXzsqf7 zu~MSeJuLmQ3SGU^BY1X>vT;er+b{QcY=vWvxDYv-GDn#I)_d~@E*k!W)IE&tvwhr= z`goQA@GsPuSRWiCFbTJfpM{ZgK;);-b@CQ9&|tpGlO$)j~Ja-ygAWaW@Sbq_$2NQHH*3qTk`UdixrH z(=dvrtcCl#VS2NK=70;HOMh-3O1fa)fGXKp!ZYhu8{e<~Uvk@@5xp?<_k^D13PcNA zdLp=*qdD-w{MA;pDVZCaDG2KeL5x75D<0otPUo4P3qh^5n8=jQ5wyWHGtKyQh@Cxw0?x6BW==XM- i4?E67oHYDz&%?8c#n=LoAl}gyz{=dtjAC;A&i?=l@W{9T literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/inolashite_molten_still.png.mcmeta b/libs/textures/blocks/nether/inolashite_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/nether/inolashite_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/nether/kalendrite_block.png b/libs/textures/blocks/nether/kalendrite_block.png new file mode 100644 index 0000000000000000000000000000000000000000..2103ad958cdabf839fea25837c4b9555caa159fb GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFO-ySWtu=>i}YV3>VsWgJMbz#|eU z$aesQ8MCf+a)JcQ3LMjcx`9j}-jsf)3&@J`ba4#fxUPEkB5#8MM@!Fj#Tprx1#U-29Zxv`V-JL*o!5BP&BgD^qh_15==eKes}^ z0X0a0YzWRzD=AMbN@WO0%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}q&STD literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/kalendrite_brick.png b/libs/textures/blocks/nether/kalendrite_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..303fe06e4ea2832ac285ae0839cc6c0fd144f022 GIT binary patch literal 404 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/kalendrite_molten_still.png.mcmeta b/libs/textures/blocks/nether/kalendrite_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/nether/kalendrite_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/nether/kalendrite_ore.png b/libs/textures/blocks/nether/kalendrite_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..8e462cc89b645867efdb1cd5c2ce0a6093144957 GIT binary patch literal 878 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>`W@Ck7}R9w6)GICaM z@S(QMVjG)44Glka^XNnwmH#=YqJn^+l0}l9Cp(vO98f zV@*sRE^X`$uu&(B3cp}@-OW>Zt6m)E4Qu&LoL+CoAyoSZ2Z7O5sC z<{TU$dV2FiL!A{A63xwZIXLDedT-0l))xg@%XM#2y}69c(^YNzo6;`V)~?77u5xf# zo0it*=a*n$kYQ?S#KEyAKR?~d%2icWl9TgPMMblZ&&l%gO_`bVVqT zMnrUYc<76WEQyHlR8g4_AQOl;rQhiSvOasdIEF}E z<~?`a>5zd4!v$&I;?@db#|8yL6rDMhKjTN`+!H~Rm7?Ki(GEf{)wdp=<6^sJmboL3v%Oa7f1U~ln8 z#!=V)g5lxGk5=-YD^mOr^NCIQk$9xP29tDbTx|L!VRQ5CN<|DQb58#HmB*k_S+}cR z!#3$)T5VO(`7e(Sl*f0r$+?QW-u|7R-TD1id5N!*^|k;1nEn69=)XyB+WPgA<$&H- zEpd$~Nl7e8wMs5Z1yT$~28PDE20&yUVrXh*WN2k%p=)4fWni%4#!n#>4Y~O#nQ4`9 z4Ti=cMn+bKhE}HLx(22|4S#NhegkTd0@)CppH@mdKI;Vst0EWONg8%>k literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/lemurite_block.png b/libs/textures/blocks/nether/lemurite_block.png new file mode 100644 index 0000000000000000000000000000000000000000..e5aa56a73efede1663fa34850128772e6425b627 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF?pvbnkW z_U+s6-@pI&9|Ur5O?v}Wz?kIi?!uOswxbrv;mmh)D+baEKrFy8-DTlQkYIsFBv6p= z00=W?UF+lo36>Q&rUP{YnLxZL{Z1E<731mR7{YN~_3TC71_O?k#5)I$u|}y+Xb>)# z>#+O3mRyB@{Gs^@hfMw2u7x)lOlo zVSx!xIZeB5KK{OTOYiyqe~jXV5=kds@TvgqQ7v(eC`m~yNwrEYN(E93Mh1q)x&}aG z9%5)}Wn^e&WT9(dW@TWo;>J%Q6b-rgDVb@Na1DmWAx1`4hK5$A=DG%^Kn;Ixg?-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIC+rlAr(p literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/lemurite_brick.png b/libs/textures/blocks/nether/lemurite_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..049d29f48233bcc62d9ef671915cf22b7b2c384f GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFPsvQHgljM~4ly#aGBmU@HP*ARs=V?9$nLj!{^MGJwd7(8A5T-G@yGywq0*l)}L literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/lemurite_molten_flow.png b/libs/textures/blocks/nether/lemurite_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..0d692c424b8279ad356a446c45323948fef7228e GIT binary patch literal 6295 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 Aj{pDw literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/lemurite_molten_flow.png.mcmeta b/libs/textures/blocks/nether/lemurite_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/nether/lemurite_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/nether/lemurite_molten_still.png b/libs/textures/blocks/nether/lemurite_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..bdaa26a25b4e1f3634fe71b10d215e4e69fd4cf9 GIT binary patch literal 5803 zcmWkyc|6nqAD*0-?1OOy%VfFPa zAAO6;nIgk(CK;T;OuG!G8)PV&ovrzMq&!SF1i$FhuYU48AviCFMa#ZVpB#&LlVc?{ zE6hA5DcQTaJrnB92(X_(_J3;%xV8pxSFyLyQhX_ybOfu^OvY%Gz4DH6}Qr%!Z+xx+kv-7#N0riYL`n{qmljN{>%H?pzFfFa%(QA&?-&O-F5CuIPAW03vv#djx8T>s*K zibs!8*MWk%{9AXtW0>eavNfh8$_WpmNO7o3N=eJ$t8#C1~J$_%=dM? zC^-)c-~fRoA05o=^j9D3&KKy3Kn$D{RQjt++#bK}TH4-kVqbOW+K-UsCpp`$lW)RS0~_dcm7P57VcdFLkGt_kYE(BJKC2IkFc#1|v` zyYcU#jcl4L?o%}c{*%K6m3X;Tr-a=`X&mMAlPyv}pNe|z7azyX{>-9I#G-3s=8 zn^@d?7E8iqxGvI??k>=ho_6C87~U;!*?YSi50ji?g`D(}WByto?%B5w2R9PFF8_Ga zmZvB3F=+cDmR#l7vK1`TqjGv@cViw8>%sdCsT#Ye$c=EQKt@bvUV#{xP1LTYP+uSJ ztg#M56b$L}8`VgH66pHh*qnh4j|3u-_^vyPwFc!0ulJE!>#X+{d8}2VNuD~UF z@Me(7By`mASjgPRawSc=@60xvW-|KztJfNL-}!jC+0(|O77 zQueAp$+!8MY=<%ymuY?JM!DF3Dai#IZFeQUczb1L#_LKlXBTz!E-7<*<>}|-+JKrV zORL(-iWY8p51fR%Xa4+9gEN$j;G$V3S0fWuBoNG96bO5tO(Vq=E6%BVF}D1!uBlx% z7B}%3lE+q0d5{rO(M9a5^L81oOlNy*_hk$njvqy*lCR_pqK&(=P#`YAS?M0Uy|wm( zG{hpUa%G=ZiM@3o4J&n{xK5!!JXvupbu5{+mW2?=rh3|zqw4oKkg?h4{fAlMVO$w^ zadl6JM2AXVyW)`JO%7GgP`EH~9;R|W=kMY6%!l;H-g&G`O`%F6{iR;9q|S>Ji3PEY>Yeb&8{r5rDJ zE92UEV+)L-TU~#3Yi6{wY)e{Zp*)+m{*;*SUC;2hKki>ZINP+?ZD8i1c2drha`xg+ zc1JZ*R|3`%d_eqNR#6ZK-awnU$_g!w^WRE3Q~Ea4g1+GVY(q zQm6Zp@*BT;T@jQ4Z2j|T<0G5q3=Lr#ZD6de(p_;Bs--1&objk7;e*3}`dG=v!&FB4 z|9ganxAi60ySX6&CC7I9P$1bM8~4V_3N}UQ-B&M``o(^7YxlNeOGsBVmdv51fYU`t zj|!DQr9co#FA#BBFkydtix;1&BO@*P)~+hd<{Fqyy5a&FPodQFOeU{@u8W;7YMAmc z6!K))WQ+N71(-y+&d#!FftB2F6eq!WsQH85`^_^RYB3$o`47(k(^@{r=;_6U1(Sm~ zI>7@A<&lwm=VKo7nw#Vk$S2jL4l525nLt zsjZa__u~hbGCy-o;$iiS3oU1?1i(9EHaV_R4s6;GN3*GJk0Qbq!QyacoSw+4y3i&5 zC;T$mkjMnq4Du`Qk4n7VpR^%{)kV3Z=1on~cT_>w{1EgoU06`d$ zqTI;+VfFI%w2okcxM7KP3O2SJSGv=?UDM6fY>(tzS7+~jcIRjW33!z^l?7g4ff7U=OqF#JLbUq|Dq1g_#YmNP z;WKN=#-r~&g`EGlYIF&CL5%o=fcdPM;ffVABzM|UP73V<_%S?sfaKFp(hzI*_cL5Q z8RPzMV;@s)#7Xstp9z5S`G0`;#vc#YwWGS-%J*Q5AM=T7y^ND{Ol88MCF@0LKA112 zc0=?v!t}~Ehf;euC4^4a2|(&t?{{r08+XxsrX~;4r10>Jf{&B3A^!9%hjHfS`9m8A z;hbDCoQR~19luqpE&Gkt))myMq84t>oElx!mz6d-x1QlD^}To{$ko=025g&a8T0YF zb|;BdR=QIW0rZ*N)+*v-aR2Vq5$$sy3}_5K`m04?o>f%%D8ZMU!;!-?B%p^NzB`cT zHO*Ezf7vS4ob{YbF0&0jjAD3k#cRNw6>&BCKl4Ru^gH_2M#_qUlKnvH(Gcz+0*d-dr zg2WD4R3)f1JK30O&ejYy;9-frUfU~R4ZbUBNtT;CYg0LuJh4oZq_!FjIDx-o_;Psj zN=5l&3g3OXlCnurle_KaZ|=(rp4*J~h#480zbr8HtH=$j^+S_>!`s0#9O_F)R-lcefCj*Nxke%;CATl*14+CBmBwtPoiGaP6gi6!{-xI-)w8y_ zsfs16g%`eNRE0^=6#(S3-2W_wcD(;{Z?au1 z?NiEFF{6Kjf`gmvE`7-)DyXzXMT&fR5AtwPey0?rQPtFi^;(@ zA!yY|O_;EuRz^`6`f_)CJ2yyhhA5C_X+S!C>XdMddXjhjNw){Ep3%jUaI(C2P}daH zFAQy*U2K0*aj4SP=`;=)I!_- z;onTh5RT22>s$w^OLnNcYPWy)yPBGUG#?IV%$whR(!g{xmp7JG>zZ?T98R&2Df^@w z^RS|+E&AK2CqpUGg4OGIOD?7({Ms)az@_v*n@YUvn}M4+;H)69$bU{Vp+fuSW&fAu zZ)|QHrjfZrZ<8baeip1v`}qc5Y^|w5x?KAGP;uaSdHLMsKd<8D_RbBa9=y^3oF#>x zwlVtiEEZ~DHhek^7;j8QG=8ltSGu8RK3t95I4)iF^QryB$atEqim>-{)@0%LgFmCD zs0$%q{l89BIZEC1vCO|~mCp5547?un^9%iRwdlA3%QH`6@|zgTP)LCN!#m#v+)Q{EEUSCZz3?e`5E*k5WZVBNCGh4M z_Q?bcU23fjir%@gKot>Z+-AyYio|9zYy3!9V?+B zunRr~@_aL<+$sbqIpsAW=vbKZDAf%#CrMkn>?p<}c%6=RUNzVcXcPc{xcyfy8I#lr zL~mL0&b6gnDvTh)39XqhZlki$l=ZnaU4~(}*}%Pf>SFcV(>b~df0@y9BRb5sP+fs* zr!MmTmI9+SFk|%xk)JLf6s+k6u@pj-FiStB>V2d}Zd?Fk_JD&AQ)GJ6I_n;#Ih7ay{$81(e9ORjlB<^dlAF!xLtM#v*0{^RoO0AEVPDb&dq+U$ZJi zc$f05B99OMi#vntnx&uHN>3Z}I+fzYI85GYm4vvdv^7w_ofdGW-$Zv6FXoPv9?_o1v>3yBeY@4-Gy8pLZ{auh9 zD_Ue0|3AVV!;klw#19I>=f;!yydvRLKs$F;y7&SP#k%hO<@afO1kUPG&f|S<@JG=l zMNC=E=;z{|2#V-M)^^Qb12uBC_3X!^H?En+Fvm#KU-?$&EBuaWON|U;?tF6_fsAF) zRfb5)*x<2sak*np@(Xlg<;n`n4$8E)2zT;7D;i!W%3~ADdhlrJq@7B(;|2Y}Q=bIZ zLua=C8G!bu@bK$ZHQDalAIW-3M#MX`qcUBmJk%na9Id~6N>;mMso5ErqV|m760+y3 zFVS`4lAKD#M{jwU+Xbr%aQPV}KsVI1;FVojO-yRvo#eR4@o2Qhm#e=wmd@V}#z_d# zCpvLEaybi?cFdl=R;=OcRzQ4l>)Hlzmg}LOOM$A|r7*`{fTAwR0nm(yFM7)}=3Mcj zsMa42nkpg|9{pI2zI9p;#*6^|96iuXG=ug01C+g(U$522*WU4T;{yVVhFFs!%V#!r zMLBf}io41@G#U5`|MPltsBDV*dBUBgj7!O(dA`l_JYb$|;Y8cX@V4}j_4vX_e1m*Z zk*da4;Ngwf>4EmD2dZS_JHKBLwY+)D%CGE&f#g-&TJ(S-;24hz?Ls@v`2@eh!3Wo! zKL62~03LtvllWH{d{uE>SgBE)wLxB${r4t?R3T>F8C7sb031)k!=^5rfIng#O3O{2 z*}nun11qpn77Q|jI74kz2TSy;J2-s{a^#oy9GBqaKG<1q!g>}Zka+d1Su)!|M)je3 z4#?=W)rrkbuHz~2H7T&z_dYMCGfpA`v6BFleHE0pHI}QTmQ92stuCcV-0S-U2bW=T zbFS*=%bPnmINWXRDdjV@usX8F3}=YyIXKQ`EU@S&e~ShAJGmrqss&1sj}&D?W>t4b zef|yYVY>ANkVPlzl$m(XJJDNrUCv6R4(K!ZzX0Kd@=lrcE89We;f67MzMhQ02Lnw+ z%me^zc-4F{LiT?)@neV4&YX&CK?Ww!6I5h`nusrouA;b*qf@H~SkJY`KgZQrrO)rO z+3Xmw%z~uM0OfkxTw6qQmATc4#(R-8x=|TliT-NX$hiN7e)GJq+J@9uMzOh%L7=I9Q-b{bsk!m9SV{`MR#yu}_J($eI zHQgUKo3}RZg!XPyRrZPJlyA~t*ph;lZAjg_iZ28Ih5>ctASW|!!3{S0-KgB4>K~=+&@S$ej|k4&Y_n>y!r0E z7DOkpI6bn}xao4fPi1SRn_S?z5z4!HVl!j;;AG*$1nvd7igKm+V=|$;>rp>kj?zJ% zpH=o!3`r4f+%wpO{~51tG)H8DOe5n?n9r6zze3#p3HOfD;6fh^v}b5a1$QV%)Yv(h$0 z5;uWC*r6Z&?xix>-}A;iTKQK&_3gbQM}jOjOc)q=bLQAW n#l5@SrRIyhpdA%Z#}St}>9a)>vjD+qGy|{(Ci<1voJju%f+sR9 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/lemurite_molten_still.png.mcmeta b/libs/textures/blocks/nether/lemurite_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/nether/lemurite_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/nether/lemurite_ore.png b/libs/textures/blocks/nether/lemurite_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..01c82b5f4bce2cadac16b800b9cedef2f75f050c GIT binary patch literal 878 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>`W@Ck7}R9w6)GICaM z@S(QMVjG)44Glka_4n`Jm)P2_jEQM-b?xx?m*wKRef#!?4I6Uxm6ME&RwO4!8yTHE zc~V1I*jH6mg^y2^i>uDbNmEcT-ptH~gQGVnsNBWHO-)UllXF2_-1?$OLrF;sS=k-A zxv?fD50^If2H5q7geY=yP7e&6wD6sNP&g=IN@o{Y`0?Yin0z2Uj^b ztW8U6^YcqEFvu`9HR9mdlb@e%W#y`>D#^)ts-mLV$LC~u`KHXwd9krIj*e=aoH-U2 zQzIfeJUsM8M3zKEc&eyO2y(EHlCqJJ3DMO2|Nnp8nib1{LCKip?e3DeX@gH2ki(hp z=2i@(6@Zw5;cnaJA3%z;z#|eU$aesQ8MCf+a)JcQ3LMjcx`9j}-jsf)3&{HH>Eak7 zahdmAyVD^90fr0R%PbY|akA<7ismq^T^zAinEhR#>zy56|L=FYFK)x2=;pR`xk!^l zaH~>-gYCKo5#xt0D|seg3R%Tr^YpsKhKD9+u1HVIG%LEgU}e;eHp>~?1&(v46|UTK zCWZ0w5veQdu10!>-~K1HVcIm~=WCT;^5&X3zB+ZyY{lGn>%1=tIz5U$mf`y|CEn4I02`n%PyS(|cjo!^qfp;S4qR8;uJhew~ZF7KRp@M|xZECZ|FiC;C=3|Bt= zFDZ|&I?#0X*O!cWFK#-{+b1FQY{j9D`1|){c|Oni?07)_;`8g@{Xc)_PrM|z@8ZN9 zccAxGOI#yLQW8s2t&)pUffR$0fuXUk0T7vo7@Arc8Cn@x=o*+=85pd%@lyyzLvDUb zW?Cg&gQ0PVk&%_5p_Qq*u7N2~!=GEB-+&sVKsE&DrFVdQ&MBb@09@-bGXMYp literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/midasium_block.png b/libs/textures/blocks/nether/midasium_block.png new file mode 100644 index 0000000000000000000000000000000000000000..1fabba6f971c09e1c16882f656c5daf2185a7b98 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFIO1_cvJeFE+8w$)5S4_+^A!%6`n6pRaZ9+z@UY{n8pHh60tc!-JxOrYIN-HZe%@8pyE?0# z!dSxs6P|LKcH4aXeeIUs^ZoxA#S0~pPQ2h%0otQl;u=wsl30>zm0Xkxq!^4042^XS zfXF<=(A3Jv(8|a{*TBrmz+lCVpF$`aa`RI%(<t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^P6o5-7-b0E8K{ zu61&P1j`B>(}B8yOd#Hrey0n_GVpY94B@z*oRE-`z>uu!tfnfEW?*Jw#+JzDsFBdH zDj}s|MSu~IFfeloa+WP-aGlCy_+*ylWT0Nv64!{5l*E!$tK_0oAjM#0U}&ss07T{? zhNf0VhE_%vx&~%e1_mo`{1igbkei>9nN|tcU}zj-WMpM%Xk}`yYhVi0@aIb%7 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/midasium_molten_flow.png b/libs/textures/blocks/nether/midasium_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..88c7c5b298593778a83a6768374d557e545541e8 GIT binary patch literal 8987 zcmZvicT^Mm`tCzffsG_+l&G|zY>6lkDJF=(rdR@qgd!qkLlmT!NN-Aw5Q-W=U_b-{ z(nXqd6bRCShz1cU(gK8HKn$Hb?(@6n-gEB#BWtp<)~v~Q=KVhJ^M0OrbmRJ!g966| zAP~sGYgcvf;879+;fC;WgWp_aHyXeLzsJ>EL2^FaC8@tN$0Zrg>d8Q+r= zd+o<|qxY8gHnxy$6vgbn$&s+6Cl=jxg$#%8`uasBI*QsC$_(t*<*a-j9xQW<^{b>i zmoSPVtK1N$b+~}C!ET&04dEefr;iS1x8JnTa}Gu&kS02x#-1Kbp>LHn1q^WrI8?-Y zrTY3|p`F>_aUh>UvyDe3txU*=`m|zi9wLyDZH{RVSN*GZY!Mwp(eDx3@L1gw#xZCC zWQ?CC(vFypNygc zSSA@wopP%E;_{2`uOqCb1Mkbc^cTE-#P-lT)tg*tJs@K{45fjkYQbT7SHoD^qr%HndL}UbKbW2h?8+Jb%O(U068`h@{%QBz?N@JsL#cQ~0FiGAl&44sies#$l z!n`a+TjL1(flL^*%zEVG*fNkmfOB437^=db&sP%~aCqLh?i>2!B&z(G#@yR$(CYyn zAH$!D2MGo|5Pbt{K}>=VH4;Miv&U8dcG-J!5t?vx9>Na%>+=bj0V10rQvg2~_AZ4a zL&1xPuwW;dY7ri*Q}gYsr&nEiT>hy{=@hUsebUIVFk-c}yb)hO8!a04F2yD!oP>

8QKX~zguwd0dv&{KwzS*1n5F#@@%5+=nr-V*1D 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 NP4~J^sn*|N{|lKzs&4=Q literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/midasium_molten_flow.png.mcmeta b/libs/textures/blocks/nether/midasium_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/nether/midasium_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/nether/midasium_molten_still.png b/libs/textures/blocks/nether/midasium_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..5124af4f8727a8926e8f8fa874071722b413b367 GIT binary patch literal 9167 zcmWlfdpuMBjImvX+F#XL1S2{kPvAJLf#kV}HCK=kb2OF3|`ayPgY^LIPq;;w6h-`0JiV?|DOaJ}eVfT2QDav@ zPz#+X3xU{EvPhaFng*$0mF5)E{{AZSsD1-~!6U(3D_B0<#KFnn33gS05gzozF{mji z)~Oq7KDc&xU!5N!9km4r4ApQy!6;b@R$Uz`#Ao2A9hwAtnEQVQScXa#+mBN``iiLr z41;c-Z*ppqtb^5qDBI1oES8Uz6w61#{$MyogEKujcj)9*R;r%`bKo-kb_XN}%&Zz^ zl36|+-`ScvEBUg~m?z8#rloMc3B}z0D6GyJ5ty-iJ8@>hw84Z;` zNLz+n1%&MY#s!g??;Mp6<&$kU{vHK$G;OTQsJUL^fpW8;h{_MkTA6wc@W+}O@`EBJ z`>%C@Yoo)qQKI{=YrJNWptF4_0eef z$erHc>LnR6Mr||zN3?Wv(igV(5SWLBQb0*TRK1MXS;O1J^-dKvlDobiDBv~sul$Xk zvclgRJY&<`k6}TcpbSvqi9_!YjE>gK9GPiv{Dr9uS1oCDu+zT{y&gJkq=ClO|61WXZ2+lbsE;okji9EbRP&dt9q;(s37Q=Xn9A9ubwjr)ah4d}am_a3f zUgCres05zj@-KXhvS5r|3MAh`U7&2VYo_ueR%vPL7M#x}e=?r_(UBxa|mS zImbg7wZ}Lnqo3}|+}+wl&uH)NzKi-ZH;NBk@YtNI@QI>Ge7DI=Tc@RMN62W__I5vi z$UE4n?(KxgZV@Fp946U2XLXHUW*ZLAn(WxOF%Xp+*T9{RJf8EwrkUr%6f4P@{d$PjJ12`7^K{E~&Ixur<{v+-u;~4T?G4}_>%We9H=H^Ct;1U!ur~(7% zQg%!xi-Q)@HRZ9x;S#S&1^8F=>nwkqLH6Ij3DN-7c_~W|gBuhzMXs7G^jW3@B}as9 z-rVlSGOA)00Por`$)(TN&mR_k!ibU`5@5ur5I5vp+!y9N^rMHsxC7G>S_|z-e=5%q z6O!5A<~(B`KKelqXLvpe`w@E=&xJt7>}9L3mvFe;Z?9Z(kmHzp(0|eJS|4s!iv_C| zrW1XZQeV>{}MG9_)^pfYtDZ;NDB)Yz9bMwj?r zy}2^jy8K}YP`BKHC3Iaysp`h2^9u0@p+TmdBl9-zAcGFcqj;FPq(D`ivGHDDV?*$m z_g|lI5ON&8i}5GVZLaY>P^Hv-6z5Airkfi3t^sA@gk+F)q~&xwEdSIe#_>=b;IB#i z-}NQUOY=Vh&Qgep=)q6)`BR@MDCTagTlj7K1uc4AwN{M{0pmq;J(K)0#tFJVBN3RXOu76J#uVcMMjh)#_Dr0z`nh>2u6>^1rU z#KZ7D-HCg_J=yp7Z}d~<5IIpaP#FWJ5bRdV&OvN_@3B%R1A8xk+J1}ZtOis<_ z>_&y?GID%;d~GGZLBNA)@9SL}Zr$8qFZD~FEK{_kLYx>oL?#UIjMb&qb24ENIMb|< zfj43}ioQO-)UT_dndekFKc1~u8m`Ci6{W4@oslI5hQ@NsSs{jZFt|!5eMd!X6-!P6 zdc=#kZ!u$yrQp9U?Q2O+rPG*WPz3rxRD<%&QJ|whc8-p(IEQ4g;;kvZU}BP0q7WC^ zI%SM1_39#iN#)B$oVLU;rn0EjGUiyGY zKd?FACnT36>Wdj7@GtamXFiO!kK7BgSI#71{E=CnIgCB_Nw|}^ z<4N1*z9kCza+00Yhx5SaLU;ESMmv|g=m|4jT zc3=MWYh@)#B7HQbA7qMd=-q#y3BBWAuuV&K6$|NVixjsP9_Y_x4EVS>_zES?s&92v zwtp(x*qdOfaYC|0VI;Q5wF2b?JYzo&)v+E6h&96KQ&2~3G*qzANZl7IRGBNGbITX^ zk6c&HFu@-bm|v%fDBY#C+Gku;wS^E)rxfKxDEdi{ymu0ft&FTm_BVeVXA9@RqhX$K zY-u0L30Jf0dF?sMV)HE}V_E~X$>5&P!BT1HM|=B7 zG`uV3O~VvV2|#0cNufkAXX=CHAA2B{%Z!8G4Lz~@PS@AXn1}wesz#rOrIWkb;r17E z5!m;n&+zRf5{g|lgP26kb2rHa5Tvx)vbr|TF6=~F}L%}M)zj|@{XxI zG%#WHA>-e3CxCBp%}WSIQ`Mh;f>f{w4iAHi9<@LgHE^)lZuD5b(Sv@mnDik-X#Qs{1sx+jy~V(|u^oXl=%3dl?s z$Au1VxLS=03`P2`4NzY?54Y4O}(P{Y+jK*pZ`6d>(Pc*QfIE$pbf z)U87NFj9ICEqw*`X@0 z_Jm1J#;kw9wi zSrS+-5cUFeyt{o?P?UNynE!M!jCmb3BoIPCLa3V&gScC4SB}AyE%IaUZzja@pF$wg z4Y^%{9#ipbhE05daMJuCHV+ZS@6JvKGNv+k!W%@6^WdRPnmc69xwwi_#75J79H(M0 z$>^W&YoG6%oSe(lvzJ9U{dc;%afU6?yAlJo$(;Hr|Cp#IWvYE@owGQ4-y_qV#kBOe^4 zh2%=H;6d+!05wDDjsk|`If|b!UR+km+MG->#-(D+kL5I?sV!;jKi& zL)^GB&_?@b9l8B9ACSA8XPedwX2HF{<+ZhFD|aNr*jN}R$U!T1HeKA0fsZn4U|3m2 zi8i#yq}e1K_-xLOlyKG&Nnws(@Q4VAZi{8x_#rYAg z$!({)%SIN*uW*-JX57n=na%@}Kwoe_sDu>L4x`PD zv@{fE8Rmsto)(Pu^&vYKCi_IsFEOb3+r493nB8Iq0=zja{=U)xE->^E)=jO`hXZGS zyTfnFhB@Z||NGGIF16C^b;T@F-h&0=pm*4XoPzH%0TPKBOrL zq-;)4rZkKmlZ`fi-)+9|b7tdDwGnN(ySss!4{47sMO(Fvn7H-L&PMO=_{G~;o2L!d z>x0%B|9iY!*hC#t)o%!6cG#}BchTo(QkSsT68-9Vm`cM^URvDq zcyI>mri3a>$-AIpTXX>6s?_sZlT+6OQE6`&XRo=0AC@P&y=B{Vnw@MfqM$!Ar~#?V z3s=a>PrgrD9E6nq+nY*R0*7=lVFo`#l(HfUr8R#;mlk6#@iG-`{uGuNOI8$FEY3J!On!~MWrbR(Cq95TL<*2o~^fi9uZh&s~o5Ao|2_=&G zmx>nkYIxTUr4>&?ksq{dtTh<<-Op=yAQL@4&u3A=e^agRm!AJ}Y5vK6xei#Lbrdo5 zzD8bsVzaoUnf5k+iYVMtz+Sc-`8c@~SHaPn^VpoNq5eMI zy8I92t)B-X?rmpcYh)F5$oKKm+lJbqvv)0W%BhE(`VMacVB&IAh=`DqsLe}f9>xhg zY}cRvs_F-Ic5>ibx%{Kp^`HDkcb%;o-l<21^`g!)dvCjRw7;6V7x{D?5)XT?F-!dvWj6n5ifXs200Uj)(LCbTb0FWNfasJmA=qf z=U=!02=y|3Ogk6;XKfO1GyLX;cJ9Flri>lXvvA|9)~JC{l5WPuf`m;^S6%Cyoc}0w zToT-++l=Ghl_S+dZ5)g3l3JHRIKFG3{s>?)V!w|iKDh5*)XTrL^g$9kl~7n-B9jil zSE>elBF^X5a8k&;VysQD7|H*s{+AzW9<+e+c1#o*)>Y;JJj>5Cx$`26Q`Lyz1rdp3TP5Tr>(*gdE1qBX`{iXzz_3D zUG0_&h*D=6N{DK*q{VFqN@BgctQUAJ$5MWM#Ke>nG+c!&?MReW)U^^dx4MEHUxNx( zw%EpAtXh4ZwRuLT#g)BT^jLot2IebD_d}C*4wSZrVkpu;XxDX3??zep@WsfT7+iz$ z>S4M6)rZ&0p+4bYSwYp;mmadRmH+EI4!x*gy6CceBxA`rR?%D)OAq9*g?*Tzq}R>M z3r07w`Ya83o#<(Y{o8X{hn26$ImzC_BgM^!H8f!ly;CT=`sv*?7oAsYnyptS*e0Q* zC=Gk7lrDDpWvKF0EZ^``J9*0?>%&Fn7~@zmDac{);6EaR!hKF8O#GT2gq%szn)r9% z+x9~oxG+&C{0@%eZcCT9lqbIZ$83-HyM~T2yb&>Kg$p~-Di+`i6b?*#bgG?HR$nh_ zK}R(3R%nB+l}sX2Pu{w;w(7|H?IXv+nP}nCJ*Q*VIb=s4jJ{RC+1#vxpfkq&3)>XV zY&D^m?2tt*WTSli%`k{jO01G2_@)6!-y&H&bAE?c_&=_bR(MOw>ID?TK-|-o5TymN zM&+G{{vZz|tw7-H(pZ-2p+8qqMbo6|l$LR-lu*kK=zujVFnB)xk+~6yC(B%`7Utjl zctI@}_uVl~Sp^m~+3p_B1zmOu0^878y_A}%nFK(B)DCk9p&Y9?OjAms{uYhvsLt6}26?woCoq$9w?8Gn5tu>rzxK-$S%Ms@7{QUBaTCie(tAAYW)rrXd z5z8MYmkH!Cb?8qDxs`8u;_+ahPLn` zla%-+6Nps4d&{=V!SJ~3v9~Uvhep3H+c`p)20I%(BgAu~sKw#_yiaBR^BMNg!JYND z=!Hwiyvnttb)D#QRei|u;3-!m2r^kq5-!C%9E1)}8#<_L_q=sjik5XrK?<3h)EKZo z{4sSZ3E%u4S<0>rF<`g_u74BiV=2M51yniar*s%<9ERoIjd9=R7@4bX>Y}8qC0EVx ziTEU)3X@Dvrn#hFNe`dGF#(`~8URw>h8=$k)0S^W%pa@n#rX3Cjh?tp_>a@p%7xm1 zn6uL$tQ#-!wbtS8);0&^?bn+D*I4dqo$%|(xS~>aqwz;Yjm($#6!Yin6C;_uzNOS5 zf>X#&RH9}v>w=YFsfY?4{IbNk+&JK*oo!wcYm|#Jy+yDFlz)Tb@>Fz}mWy&ygU>fH z`R)$VJoulYIUCEs;$>q;+jr|96l(5(CeL(6nOFERjciajq zWpPx^ikz(8g{$(;*Rvld>&7FM4-IlMT#-2~(+MUR+~YUaH`Vl6(8aEdzL33urRGhP zPpqJ>$O*mP6T^iLwk6_nS*6seW^Q zgpQyVfOBrVegXIX|IYD8(ECpbReaUZiK(~=N|O2}#T#P%Iy3WpjJ@-@>DEat^{#Kr zo)I6oQo@Jleq!AT*09Uzc->pXzz3Pt{!L6OIQ2mS)){CQ&CO828UxaD&gel%Ouu?= zRoQpMOxTl$XWLZ$2L)DVz|QZRnOl`=CBH|jyD+{D-+sYU1u|h9Pi@B}>5pI2=Udn< zGhrXIu05fuI-H}d%V;?N;7~sb`Ss1_yaMQX@OBiVpqS;fDuh6BF1$<(#YA?r05|bQ ztaJb*-I^_Qy#<9avL6l}s8QP`o2O7lpI_hXFjV!cV;TdT)TMGP_RoQ0(X_CC#`jjI}u4Jp{3(hBYafv z9p+@<7$6gQ-gmHQ&%JWnly<4!5^=m)EK(^8l6|>K!c^k#o13n_0!Xv}yz9qodso}| znDrXM)qcZNQ^(qFQ^!gpD%;NEek}_e-p27G#cE;NBje$H27KFKsR{f&w6j*~*yA6G zK}#RL2p9#hP9j^FAeP$gHnCit1BGNx!I>aqhO*K@NkE}1X82;|heo?g1MHiQA@mnK zXX9SGoKMn)jX6>8uj=`VSu1i*O^h2_%u4$}P!^RxZB=xjVn1$&ZvM|zy!90C7h9hd zB3nX(7+c5P0Bf83(sIJJ#v!)fIXB?5Ab8`y(NW?DhcSA+K;GfRvbA;{55ruNd3Hp@ z^Q%K3*TGF(Lb=QJo{nJ2mjHJaf1G3%^!yIk?Rl2CV{QX(-wz$EAaMhX=TBRYJ=!1N ztdcFS8&vHYy0E(Bp}ZlZnd@`v`qFqd)f8KbHOL-&TE@`E3F^MUbVe`w5gbop5Lq@X z7X8JGRCjc?bLr(EbBwz*S2T#!J*eyAk)&zuhzeo!Ist*$VHxt06Yu-<9+eX#3nvzA!5*>{;gG(R~e?Cnydwd&Jn4b#M(uF3y zR#iyTBbV2%ZRLbno@lk$*kSk)0Hi|x|17{sDWKk{mM0zF^H44O8zz)_!fGSZwGG`F z9~hO6$9P3DRnj$6*Nn>6K!={FdlBnBjDnDN{JOrijD;ZVht=qo_f)mpn3?c$d@7uM z{tI)FK3DA>=v=Y3Ht)(^_J5h@;qgBux%k#J`4=-cW}}U}I2fFgqHculE%Uz>+5R|X z3$LJAVZu!iy0~NYLb%%Y&cl8sax+^C38Ql439Ytw>fQ=+;v z)!QTGWxqo|8m9_Ew5>g}-=p)8k(EWI87L>SB*=XJxdf0JsB~vZzTcNJDds2#)V)U$ zznP2+ucdH1EKlSRqck+~ob*2x)k^sJW9gcuBXg6|nJ*z6IYyNfuA2Q2$NF|jG-tB$ zcXSCkzPZ|G98ZAWuKu+80#~)~yW~Q4k)5?^X$}nkxJx>~*la6IvIlNE5P4tuNzgiLQjWMEYG!(qaS482eBUo5P5ICu#6V6{aX z{Nat8Vg^2`%Lo9Qqn^YyZ$ogX!o+cUU!%|ZHIf*WtTj4awYTG*=TBLRk66s`ZrNO* zxFDf}w(ASX)WDeClC$gVE*j0XB93o>%Z)gw3FXYJg0L-Qn~tc2;-FI2 z%3`&xk*MxHf7$fk#Sux*A5BlwUSD0xfK2kglETkXK6E=7`kK5H>_K$wQ@|iG22spT zSlY_uzkt?93CWhZP*BB{*)#{~gZ*0?xdBG=#9qypyn~rID1B@aA+^>+*UOIh)OOR%RVuE3I)LUkpJVSXm14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>6zax_0>c%W`r3U!nGC62sNUDdX~DeZD??TYN+ zDhG$PX=!bKehCH!8K$O292|S{^V6-YTvb&iIXO>NR5bheoGdTjl$kj%HnzsmQH_%` z$HHQ2L_~*&hrWo&l86XT6_p7=4i-{UHZn3HnwtOr|DSPs-v(f4GA4PuyCiAvlm&($ z182UQTQQIZhAt4?3)q+pq&N#aB7uT@2SAuH>slu#NU*HHF&(HI$OPg|>36z-tS_D} zjv*44dC##s9Wsz$yP!Wy&FRlRwQ=~Oj^-D;=M`vl@|khSwsg|+-LI{VO>_~8(0y#XZGOeo z=EL6vwGK1O8dpxT-+E6{lB0NCMX%t;?k(CT2i>NJUtf8uquqSFQV~O|o=^3!b^MEe zd?@)JP%*`F_O}-&>z9eQulej{a-ydr>F>9H4-HNj&Hd{9SF*nL|DS9B|1oZ2kk81< zzx4{}f7KG#h?11Vl2ohYqEsNoU}RuutZM*7<{^frRz`+aMi#mTW>y9UD{lN0LeY?$ zpOTqY3D;m~9Aac-WoT$+YOZTw3e@oDR_HgN1}TsY!TD(=<%vb93;~Imc_n&&t|1C# a#(JiDh6V;-iWUM@F?hQAxvXKfUFo#7sn8e>#Aoj@-`T7v?Sg+aEvudeL{n9 z!CZ&k|Fz^Q{NoSJS2$$q*LF3;E#V%+!;Y_N4D(kD9H{#AB*9hVfY(y_c~@2M>a2DO zV+{*Tc*<$oZS(Q>wOe}6_y1!QFO*0+@q$+cXpd@%YeY#(Vo9o1a#1RfVlXl=G}bi$ zBJ&VKQ!67wDcptAuMXG!8K`vNANZGBwvVFa>J(b1U>4 zP=gf6hT#0PlJdl&REB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7{an^LB{Ts5FoKBg literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/sanguinite_brick.png b/libs/textures/blocks/nether/sanguinite_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..355dbcb83d0fa5ebb910aaa8bc2c291b39ef46e4 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFc?jk(HsLm8rR|fhkbKpIf2dfEuJg vHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~DWM4fBOq%N literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/sanguinite_molten_flow.png b/libs/textures/blocks/nether/sanguinite_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..f5147b5ac04b8511b83e39837dab8b766778766e GIT binary patch literal 6844 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 VXkhTAXdzG)gQu&X%Q~loCIB)mFLVF^ literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/shadow_iron_block.png b/libs/textures/blocks/nether/shadow_iron_block.png new file mode 100644 index 0000000000000000000000000000000000000000..30b8bd5fc0b6d767e8bafc80219b487948508095 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFQ&rUP{YnLxZL{Z1E<731mR7{YN~_3TC71_O?k#5)I$u|}y+Xb>)# z>#+O3mRyB@{Gs^@hfMw2u7x)lOlo zVSx!xIZeB5KK{OTOYiyqe~jXV5=kds@TvgqQ7v(eC`m~yNwrEYN(E93Mh1q)x&}aG z9%5)}Wn^e&WT9(dW@TWo;>J%Q6b-rgDVb@Na1DmWAx1`4hK5$A=DG%^Kn;Ixg?-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIAWxiD&=- literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/shadow_iron_brick.png b/libs/textures/blocks/nether/shadow_iron_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..44d446870907ceebadc40a5e074cf7e867f2acbf GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFq^WL0N1Re>}EGZQnmL^el_goafK zDGe(EjDUoJnM;tfY%zoDR35`8vn(eA^{SS*MwFx^mZVxG7o`Fz1|tJQV_gFvG7m8{ zwK6iaGP2M$Ftai+SaIX05Q>J}{FKbJO1K6?;}9bwD?>voQ*&JdQ=o=Fw?e-GHAsPM u2+mI{DNig)We7;j%q!9Ja}7}_GuAWJGc+*xQnV1Liow&>&t;ucLK6Vg|7y(u literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/shadow_iron_molten_flow.png b/libs/textures/blocks/nether/shadow_iron_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..3953d00a558ea60a82a11eaa40b195766e953499 GIT binary patch literal 7648 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 O7(8A5T-G@yGywo81tG%# literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/shadow_steel_block.png b/libs/textures/blocks/nether/shadow_steel_block.png new file mode 100644 index 0000000000000000000000000000000000000000..612ef2286bbdbae88c1f918fb438e1509289d818 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFPx!)lNs>0u?YOdAqx?C8q7D1#&p^-Q0?S^a3CjVCej^wGbp&;1LNF zJu7- z3+6iP{;wrh;U9l!zQQ3>zqYF(ZVC4o9(H_HW0=2M;6T-c?jk(HsLm8rR|fhkbKpIf2d zfEuJgHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~DWM4f&?AlS literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/shadow_steel_brick.png b/libs/textures/blocks/nether/shadow_steel_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..874678072cd6e32c3088660a30715be0544b3890 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF zS|=w+u&lr_9jF_~1maEUce;Qq15X#n5RU7~2?;3)49Tj_YN`Th24*H^Y>8}+8VL=n z5>gsg1Q-Dc12dN(XW3!~*Qq>)Pi9$82I^HUag8WRNi0dVN-jzTQVd20hQ_)EKx7_b zXli9-Xk}!fYhY$&V6fuGPazZyx%nxXX_asdhQ=XAMplM~R;K2<2Bts_e{O|-18R^0 v*$|wcR#Ki=l*$m0n3-3i=jR%tP-d)Ws%L0m@TF)WP!)rxtDnm{r-UW|@|13G literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/shadow_steel_molten_flow.png b/libs/textures/blocks/nether/shadow_steel_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..9533dd70317c2f26473c8daff866ab75b67bbf54 GIT binary patch literal 8954 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/vulcanite_brick.png b/libs/textures/blocks/nether/vulcanite_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..a59588008c10bab4ef158c061a536d37dfda20f8 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFc?jk(HsLm8rR|fhkbKpIf2dfEuJg vHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~DWM4fkAQ6$ literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/vulcanite_molten_flow.png b/libs/textures/blocks/nether/vulcanite_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..a97ec70ca9939972a1c193850a3fe77925a88ec8 GIT binary patch literal 8624 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 XJwpS7FGUN1su(<7{an^LB{Ts5*byyE literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/vyroxeres_block.png b/libs/textures/blocks/nether/vyroxeres_block.png new file mode 100644 index 0000000000000000000000000000000000000000..6c0ea709a52395ec7571774af0855eca9271ae76 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFIO1_cvJeFE+8w$)5S4_+^A!%6`n6pRaZ9+z@UY{n8pHh60tc!-JxOrYIN-HZe%@8pyE?0# z!dSxs6P|LKcH4aXeeIUs^ZoxA#S0~pPQ2h%0otQl;u=wsl30>zm0Xkxq!^4042^XS zfXF<=(A3Jv(8|a{*TBrmz+lCVpF$`aa`RI%(<t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^P6j!F@Xp${0% zCo%s2|Nqd31$96v#w2fd7nc5vn}I+MXTFs0goKm?hGbP|HC2H$12YpdwnR2Zjf93( z2`LRL0*ru!ftgE?vurVg>r@`YC$lUk1NEwwxJHzuB$lLFB^RXvDF!10Lt|Y7ATkdz zG_^7^v@){LH88U>Fj#Tprx1#U-29Zxv`V-JL*o!5BP&BgD^qh_15==eKes}^0X0a0 vYzWRzD=AMbN@WO0%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}?U8Jk literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/vyroxeres_molten_flow.png b/libs/textures/blocks/nether/vyroxeres_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..760d80485572ddf31cf3ee0ff18d00e847b0061a GIT binary patch literal 8527 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/nether/vyroxeres_molten_still.png.mcmeta b/libs/textures/blocks/nether/vyroxeres_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/nether/vyroxeres_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/nether/vyroxeres_ore.png b/libs/textures/blocks/nether/vyroxeres_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..c428ae84d5d198cc80840e0a89998cdc918c956e GIT binary patch literal 878 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>`W@Ck7}R9w6)GICaM z@S(QMVjG)44Glka^^SjzCAPLJV`7?IT|4~!Wx2RQA26CvV$9W7PBJoDk(?ZDWTYW1 z?5nD(!pA4d#Z~9zx%+y=DN42-dslJ>8iHLrp(NFv9UFdj%u8oITjXE zBO*FHJoH6GmPAB&s;Eo|aGAjMhW5eXFJI{?CrS=Tx_L4sukj_E+%Kqe4xO25+uWPSE@aSV~T z%zN&-(;)*9h6~cZ#jO>}9Me=nH!yDLQ;Jf5w>I!dZ}k8F+HZbWS}^qV_Iz^SU@=qU za%E^MiecakY7t&)=9MxykygnLetbS^v!s*Ie- z>Jzj&a93FR(%rZCt~+?isdr1&A`6Pxl`{Y~>Ou$b-Iv+LZF>v!(l={mtUp-}Dh>fMYBp8S0I zZ{e2?*4bZQdfH#^X1-smDpe&CxaQtHdl{a+;dKdD(*Jz@`}y{t-|Q*oa>tjc)G-0Q zuUg_7QIe8al4_M)lnSI6j0_Bobq#>XJjBq{%E-{l$U@h^%*w!E#f_grC>nC}Q!>*k z;TjB$LyU~93=OSJ&2!k?weDJ8j+@ z(@fr+o&WXO+5i9lUyok35U7AL$=lt9Eir9JEs(>R@8(tvq=6;@oiSz7Vk3}Xfkz}z zkna!(Gm2_>HGl-m3LMjcx`9j}-jsf)3&@J`ba4#fxUPEkB5#8MM@!dD+7aUUw$?e4Y~O#nQ4_!4TidgrXfbgR>p=_MrOJOWp-Opj7i?^E-d{SHv@qj&U`nwVjvBYP+;)BGW8%xu)re{D9CpRgc(IO zyc$4)Wd)AuK;1wl5N}Gq(*9nN|taV5nH8C) y1}TsY!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;-iWUM@F?hQAxvX-G&_xt(%vB$N?u4|9$eR#c|uh;YWd_S|YxOniuu>*Vd z>^W$5$rJ}%<@f9n+yfQ_zImNqZvrmDK9?N)_UsXn{QVKwlb#6$eiXWIW`03vP+01q z@QI`Y5{bY6XJ%?_6F4xF)t{u$=0D_D-aO0Zsiy4{fkhm8{09CN_Cns+%=ryiuSBVN zy?6J??j9%X%nzCQ4-dp-o7|}+wfsX&2$4jXgAUlm2SaHEgx#yS|LewQ*oXzzHqN9+j0Uj zk?7BEhFw)sFjH^^TbCQY$SG&3C*oQcC~7Nn^r^hXtF-05@X&fr4KswO+VPcBJXtnX zjfCR)4>>E$M*HlYh4O4X`NGK(KgK_0atPQq;_d?yXN7T$3?X=(FU<5~>tH;kETMR2 zeevYRWU*FXXN`Zn+O_0;Fc6H4WI$t0^}`pm%|Qz4=|>}o_y=7*K^KMHsRx)n>ix6F zy?=41ubR2}D1zV zYK)IZG~*>eN-+iDn=H#vaHbkDt0F*F;bS0_kw3E$hG1`uNYnoGXc9v|g=Y&ht-u*h zf6!jwg5*rmRq7QC6`HY$HdjtRY;IwBpJLk8W37_tr^~tIRK}bfT4KwTz|W@^#l~=E(&ID z2Sq@1^$d1K<|9v;LG!53&7Ag=OZ;FU{&&RZ{F$@mDO78MlWI4V#&Cpb=Ye2U!c_bG z*qwUk(z-ukGQ^ur!IBU+Cpk#W

UqJAuuc@nE@7bntW9wsx&~LWIn!T7H&4j6Cwt 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/brass_molten_flow.png.mcmeta b/libs/textures/blocks/precious/brass_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/precious/brass_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/precious/brass_molten_still.png b/libs/textures/blocks/precious/brass_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..c096c713924306af66ad8e7ebee2929283aebded GIT binary patch literal 9614 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/brass_molten_still.png.mcmeta b/libs/textures/blocks/precious/brass_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/precious/brass_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/precious/electrum_block.png b/libs/textures/blocks/precious/electrum_block.png new file mode 100644 index 0000000000000000000000000000000000000000..19b1b0707f071f67d016e9541609ef2cf3509076 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8<*YJnWid^fjZAngFe0u1vvtosZSEbxc~ z3i2HSVMb96uLh7{S%G6ZP&beX#GBIZbOBj0o-U3d9M@IPUgT{s;Aly_bKn?jl=_4Q z;expiyZ>v+Rrtprny+xk)UWMoh+D!vhKC(r)fncl7C2D#=}CgC#sROT^7F2$-ql&{ z6vi4BnDCU-wA<$6?`ya8p6~z1C|)R$bm9fC3eXbP0l+XkK Dj6IG$ literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/electrum_brick.png b/libs/textures/blocks/precious/electrum_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d94fc5e4838c08086d476f28e06d2e2454df0d GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8}+8VL=n z5>gsg1Q-Dc12dN(XW3!~*Qq>)Pi9$82I^HUag8WRNi0dVN-jzTQVd20hQ_)E#=3^a zAx1`4CYDx)=DG%^Rt5&yzWi(`8glbfGSe!d8Vq#}O+$=~t&9z=jLdWm%zzpmFnxal y)F1`2Aviy+q&%@Gl_4N8Gp|I?&oxA$%vjG<&(Of&OVL80Dh5wiKbLh*2~7Y|1ZzA1 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/electrum_molten_flow.png b/libs/textures/blocks/precious/electrum_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..71a6f181de17e34107858c2fc0c5a77420db1539 GIT binary patch literal 11410 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/electrum_molten_flow.png.mcmeta b/libs/textures/blocks/precious/electrum_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/precious/electrum_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/precious/electrum_molten_still.png b/libs/textures/blocks/precious/electrum_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..ebdf4c9a84baad7ae419b0e38f50c4f6896bc678 GIT binary patch literal 11773 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 Cnu}`y literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/platinum_brick.png b/libs/textures/blocks/precious/platinum_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..b0326864510a70abbb75cea8c27cdb5a29c0a7eb GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFX$F(!GtyRh_U+zbSAIP=}yih;BO7<({Hj{*r6ctipP`3`|Fqo{^g z14yu}z%d=D8^{FWP3d>KfGh(~7sn8e>&XcTDG3b8s?KVv0%-pZU4XYAT z8dd}t0SN;$mmp`^Vg}c#JcdtZSxyG(RV{IiC`m~yNwrEYN(E93Mh1q)x(3F&hQ=XA zMph=4R)*%f2Bua92HC#+Y$zIX^HVa@Dxn$-bq!5JjEt>}4XupKbPdda8Xhoxe*)AX w1+pPHKdq!Zu_%=xATcwqM9KLZB)JPgg&ebxsLQ07|`UDF6Tf literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/platinum_molten_flow.png b/libs/textures/blocks/precious/platinum_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..e709948fa88fb095626aaca29e6ccdf5ffb78fe3 GIT binary patch literal 9475 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/platinum_molten_flow.png.mcmeta b/libs/textures/blocks/precious/platinum_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/precious/platinum_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/precious/platinum_molten_still.png b/libs/textures/blocks/precious/platinum_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..663cbf7ba617e43c459a2b7690b0aeb8fc9489e1 GIT binary patch literal 9830 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 X2*&SLvRc7CVi4z}?v7mC=_~&SgDNb8 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/platinum_molten_still.png.mcmeta b/libs/textures/blocks/precious/platinum_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/precious/platinum_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/precious/platinum_ore.png b/libs/textures/blocks/precious/platinum_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f1b02616ddd89e977b1bb63d4f64ffb91eeaab GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF36z-tSV0z#}JO|ygi0|hYUoV z|27L`$NbVhc1*PTmaqy(r>M(O)>*&jH|lJg_at3n@iw`JC5|@>9-Rtd68NUP=Vv!Z z=9(#D0^eqG8JFa(T%g+!y8qpq$N5edf(`uQdW;L|RqDT<`=AsfHsgBq=Ue>kIghzY z=ki6e>^v*`fnCRePh>U2l)XS#sFt`!l%ynmdKI;Vst0RKy%KmY&$ literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/platinum_ore_overlay.png b/libs/textures/blocks/precious/platinum_ore_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..0032da377e9e5debddc08dffe352e913359c5059 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWP0r78sBSZuHf{H<`={T( zzw_pOq|@6gKv~9;AirP+hi5m^K%69RcNc~ZR#^`qhqJ&VvY3H^?+^$xifVW@00r4g zJbhi+@3F}UGYZNqIra!BC>m5KY#xB9|ZpFJF*I>fHBG2-GwbNZAUGT!oE1JY5_^IIgRny~x{Oz|oR;=fE-6DD?>q!Uc03 zcK_FstMHFMG+*J6sbAaG5VwST3=ccLsxi!8EpVXf(~|^OjRRgw<>y^hy{og@DU3BN zFySeuX}8VC-`8&GJ>UP2QM^zh>BI|O6`(z;C9V-ADTyViR>?)FK#IZ0z|dINz*yJN zIK;@v%EZ#j&|KHR)XKmh+n1jWMMG|WN@iLmRD+?ep=pSbv6Zo*m64gQff-Q41E%j! zfEuJgHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~DWM4fIs=bM literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/silver_brick.png b/libs/textures/blocks/precious/silver_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4048b0b3bd4381d10067f30ab72be894866199 GIT binary patch literal 404 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/silver_molten_flow.png.mcmeta b/libs/textures/blocks/precious/silver_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/precious/silver_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/precious/silver_molten_still.png b/libs/textures/blocks/precious/silver_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..33691c337465503b7209f0ebf8fd2dafa72ffbf4 GIT binary patch literal 9301 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/silver_molten_still.png.mcmeta b/libs/textures/blocks/precious/silver_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/precious/silver_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/precious/silver_ore.png b/libs/textures/blocks/precious/silver_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..2b0e4d2cdb5f57a0a7b93b1a944d76752796865d GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFH~(x21yY;^ z9+5ynzC$3)D5~Mr01_-Ka7+j41~P$oQ~I4QAgjdF#W95AI&aTG!9xZD%%yDq!ghS< zdn)o^36u03t^(#S_gVgVY&MQMC{cQjK}A=qO`3n1RKtb+3qN&noRnV5bEqymweg*D zXb(@s=k(_?^+HX%5@PmBnJ3h%?@trov+BbMgM7O^XAdu(A%Ee@%L%R%o|`e&|JlOZ zG<$hO0nmQc64!{5l*E!$tK_0oAjM#0U}&ssV61Cs9Aac-WnyV%Xs&BuYGq)M?aR-G zq9HdwB{QuOs=-j#&@{xz*vi<@%E(ODzznG20n_&bP0l+XkK#6y}2 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/silver_ore_overlay.png b/libs/textures/blocks/precious/silver_ore_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..bd418f0c8d8c932131b8559b89c49dec2f080c26 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uBp1|9UUE4u3Y)||G$G^ z&qkm)V@Z%-FoVOh8)+a;lDE4HLkFv@2av;A;1OBOz`%D1gc(IOyc&Rl>?NMQuI%^N zWQ18|3+w#P0)^~7T^vI=t|uorFv;-n#IQ@585m?V>=fhS@!^+}GcYhIYur)B-u2`EG8-KpF%D7$&?}G9Sp`Ebxc~ z3i2HSVMb96uLh7{S%G6ZP&beX#GBIZbOBj0o-U3d9M@IPUgT{s;Aly_bKn?jl=_4Q z;expiyZ>v+Rrtprny+xk)UWMoh+D!vhKC(r)fncl7C2D#=}CgC#sROT^7F2$-ql&{ z6vi4BnDCU-wA<$6?`ya8p6~z1C|)R$bm9fC3eXbP0l+XkK DkwA@d literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/zinc_brick.png b/libs/textures/blocks/precious/zinc_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae2a20bd6e77b1bab96664f8b46ec29c8dd35cf GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFGDW0JSK3+s>km&bt|&U`nwVjv9y3Jm`1CglJboCO|{KtaAk zAj~ML;ne^VEGuwK2kHhgfp}B;oh~5D)YHW=gyVX0LPAOcL$a!~nyNsWftiUJTOymI zMnc1?gp`IA0Y*T=z|1A6Ig78GyYd+WgKscTX!bsdOrQa(C9V-ADTyViR>?)FK#IZ0 zz|dINz*yJNIK;@v%EZ#j&|KHR)XKmh+n1jWMMG|WN@iLmRD+?ep=pSbv6Zo*m64gQ zff-Q41E%j!fEuJgHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~ HDWM4f+cj|z literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/zinc_molten_flow.png b/libs/textures/blocks/precious/zinc_molten_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..48bcd2880d9d0eaffc6c43957e54fe7d32d114c7 GIT binary patch literal 8649 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 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/zinc_molten_flow.png.mcmeta b/libs/textures/blocks/precious/zinc_molten_flow.png.mcmeta new file mode 100644 index 00000000..8e55e43b --- /dev/null +++ b/libs/textures/blocks/precious/zinc_molten_flow.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/libs/textures/blocks/precious/zinc_molten_still.png b/libs/textures/blocks/precious/zinc_molten_still.png new file mode 100644 index 0000000000000000000000000000000000000000..7962c040700c07576f208f7129ed5cc93ea3a9da GIT binary patch literal 8974 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 SDd1feko7scv*l>lxc>nnCQknV literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/precious/zinc_molten_still.png.mcmeta b/libs/textures/blocks/precious/zinc_molten_still.png.mcmeta new file mode 100644 index 00000000..7ceb3639 --- /dev/null +++ b/libs/textures/blocks/precious/zinc_molten_still.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/libs/textures/blocks/precious/zinc_ore.png b/libs/textures/blocks/precious/zinc_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..57b05c0040d22bc1c20e0ebfb3ee4ecf17210def GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(bFNHGJ$rt~{qKvtEfi(?4Kb>1FBzC#8g&VQQ|)_K=IKPFgxOIU@& zP&u%Wv4}D6!s5wCuTB2L^LW8pc7@CkvpGAArZKeqm5%$v!%?_uiV(-|v#pX=+bb5R z9#|D${_Uf+(hEh2bo(Ceg5B=*-_CtdiV-@q+I;=rf-`1o1FpZEz^kx*Df7Q*Exz?Z zPFEiTU7=dy8c~vxSdwa$T$Bo=7>o=Ijdcx-bq$R}jEt;IEUgU9bq!3d3=Fb;`Poo3 z#|nduss0W~~e`u+r{K?-C;aDG}zd16s2LqK9?UWuNc dYluRbv7V`(p@G4dqJ=7(Q(fB*}m)w1@ z^7WfDt|vnEfU=AwL4Lsu4$p3+fjCLt?k)@+tg;?J4rhT!WHAE+-yslY6xHx*01C2~ zc>21s-(!;zW*1)afdQn>%hSa%gyVX0!T~-Whn50{W`<^sj-xpYlLHc1jU}5UWh9yo zYDr4AIBsF+Fklm0)5Djrw1VRr1)9p> M>FVdQ&MBb@0B?CglmGw# literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/utility/bitumen_block.png b/libs/textures/blocks/utility/bitumen_block.png new file mode 100644 index 0000000000000000000000000000000000000000..02d9339bb47eef4eee80b39ad1297a3af1a56a08 GIT binary patch literal 656 zcmV;B0&o3^P)Wq*>9i~h0L=5u=6Pm}DW%Tmb4qEN zrWoVC@7{Yvde`zV9){*XxCd0HC!70HxIRdL^P5 zez2wrxYi$K$bWoA qF*)a^X{3}|>%-xowJxknIR5}ns9-ni#D8o60000(bbkO{<_((iNuS>>KCjv*Y^d3y}`4l4*8sA;fzu4P(W zWMX}mJBrhaIp`bT$^ZKU#PqlIyh!=YFyrRkNe@i7zm?VEd#~ZVb8E&+v5N|upZnN& zzX(w3cx7r{@NxQXYo4Falsok{*j@|QpD<&?gGU+qw#CwiH=lZbV8P0y?Om_-@tl{> z2@(jKk`ONjbb@M$YeY#(Vo9o1a#1RfVlXl=G}bi$BJ&UfODkhDD`O*F12ZcFgC|d| zzM*Ky%}>cps|0B<(ls>HH82S=GPE)=wK9cjU~Rq60n{J`vLQG>t)x7$D3u`~F*C13 f&(AePq0Cs%RL{`B;7id$pehDWS3j3^P6gpppdJli(?4K_2dMH22~*~he^U6>OP4H2}x-c2NtY6WWac0|C<8`3Qj3D zG*)X)IIMAiNhq1=5%+o-i61gik`fUT5FVdQ&MBb@07&^d AlK=n! literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/utility/magnesium_block.png b/libs/textures/blocks/utility/magnesium_block.png new file mode 100644 index 0000000000000000000000000000000000000000..4150fa922e130299ef583b98407ac9e29f7bbf1b GIT binary patch literal 768 zcmV+b1ONPqP)TwuL3odxTbhrqgi5hp31 z_nss+l!uHsHhj~@>~81!=ut{>ZYqKcM3H(W;XPeH5<+0JE8ZDayAem4qR3g6FN_FG z^Aq4dc&B4d2*UHZa%mgpWg&_po_50kHUzeQL@9+)3i3mS0H4>6>Qt~hN2E1*mZ7vJ zO%qnT(E^WtV3?j{X^e}fdM-_k5nz}Xlv13E9HTWs z1Oa~CI`;2q?e#_y#~{M>-qF?-S}V-;-T~0m74!3px-5y4SD^xS=jewSyYD>Ll@J1v zQiLE>)e*Bh&vUgnA288tx>kxvYpP>`wL1#9bt5DRJ_PJ)nZLg9B4~g-OA!%v=lS`0 yq7|Nq(t8GfKL#w2fd7ml`jQ>%a+&U`nwVjvAP4+!oBY)l4H zoCO|{KtaAkAj~ML;ne^VEGuwK2kHhgfp}B;oh~4&+SA1`gyTBznTZBln%)_{7f&tDZ+3_?f>Z&-{t(cLl41MYH8ioe~b{o!kC?5;Ft`Q|Ei6yC4$wjF^iowXh&{)?1h|EI_EUk>qtc;Cx z4a}?z44yo-`i7z*H$NpatrDccNY~I%*T5vi$k58f)XEg9fwlEM2T+3)$cEtjw370~ oqEv=}#LT=BJwMkFg)(D3Q$0figD*u3fvOlhUHx3vIVCg!04v9%1poj5 literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/utility/magnesium_ore_overlay.png b/libs/textures/blocks/utility/magnesium_ore_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..e28eb312f830282b67d35ed4e6624a6e860bb63b GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bP1Q|G4e=~b37=e(vw3>U zWoQ0xKq5|$Enn62Jp8AEgB-)3 zmcXo}E2+<))iyD`zq09%*onpO?z%l$dAI0{E5ogQD;twyxaC|*Pnl1B{*~SFGs}hR TvHWd7!x=nX{an^LB{Ts5gyc>p literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/utility/phosphorite_block.png b/libs/textures/blocks/utility/phosphorite_block.png new file mode 100644 index 0000000000000000000000000000000000000000..3852082866552dc6458cd6e6423e9a33c5e780a9 GIT binary patch literal 716 zcmV;-0yF)IP)?W%05O;Wc)@#l1nmW3sP@6XRAOIo&gc)U7K!obfq3>BrA=g?d)5PublQNEs^Gr3v%?S9i;SmTRBIJ}PrO?eY zxh@N4Mj1!0-Eaz-aO7Tiy2MZ;_jFk zbFI9*yb$iFDk*20rlHN5eEaxdoF+cUk=YFHV~*2=s$vmH1pog2P1m*@_Irk5AgPkO z4n2PR#;)twbRA93q?8a5{;u}v=?O$=a^`WnW&ildZog-LJR(4D+Lq(-NUe1ZsBJl4 zE_ehfCC=wFDJ2#&F4M&Jd}iBqG@A_?LDrNIRWv11N?dO@RF$@ADD%8py4PF^A5DXv zPKYY|VL;a<2bfW7WvLabl~T(3AHin3U4>M!T5)&&yuIP>Xl@$*JDmVfAOUd~jR*k7 zaa^Ht2N5EIq3;n@GQiL0XI@`lNviBN8_XS#Kt&LdFCtZhCM8nStd@aH1R_G)H0&Q9 z@O%0$LKZ<)zi>u`r20jtxvvxCoEe4zbLaH-##7%jP7@Ei9hwqZ-5-m0*}aI1_r)EAj~ML z;ne^VEGuwK2Py<9W?_?-kejqbt{B1t!%4?iPiIuFNOP#Z47(b<~luz@#`hi8s+a-#Uq$H zUfukAptV*n&-jULe&Ck&k7hQfxF(8y*1PiU%HzqeKX`n)WpHBE4b_EKU$1^85lfyYV{38 zLvDUbW?CgkgORSGp{{{Rh>@X{iK&$-R0C`4eGZ@oDUc1p`DrEPiAAXl0g0J;C3=3Y dAqr*2dZv1Y1_ob>76Mf8eR=RLG}_) zUsv{fY%;=X{5E->Pk=&Uo-U3d9M_W*4lvDOm5`mms*vMs@bbh1j%UWk8;lHCj14wO zG(C}3^kRw>bqHzL%+Rbbp{!J_rNh|B$bdt_>1;}yMkp>tY%X~8S+dS Y7CdK@tS!BE4rl{|r>mdKI;Vst0JSzkBme*a literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/utility/potash_block.png b/libs/textures/blocks/utility/potash_block.png new file mode 100644 index 0000000000000000000000000000000000000000..83c786f4241f7f830b6ba927d62293dc87c0eef9 GIT binary patch literal 756 zcmVC~h1t0=MMv4#;LSUO7O;7iIoKsZ<{+95G|NLFzjp$GK{75_hgJ0fL zcF(Zg0Z}2Ppk`77TZj&SJq{ww?^-s7D5jYKmn0tEJ?U?xy(d7 zAj6StGo~cr9Vh6KfRdu94TN`sKqYa4xx;`^dS~*5XfqmRATmh=#7HfSyFFS8Uw``s zwFxOZs5gY}=xMa>wB>?dPpAz?)=*R{W`-3dyrUxg^27Ha@ap~rk?_^)Z`eF(EtuyE z%fG*2*vMfzvc*DCN3K_5ZEU@xI*=m#@%MYeH-7!;M+(U>1c-oCOi0FOpCYV8pD|0U z1x~WLVB^HL&ZIX;XIGQ47RK?w@caubqeFCZTcIy_OWZ$%CY^1$03bM1O;jK;>Nrtv zUSR1P?ddJ+d}eDKnTd)r6lejSPG&HgP!x7m8LFb9lzM{+Kr{?zO{JJo)hI5MNIV?U zDVmI?R1=PeJ-Ry*6fDH3AKl~26Z>MUy;D<>RC)v+jqIIbiIu`MjFh^^ZeJ3BiHjg#Q7zglR~w{H((O00001_Ee9Z;|E*JN!y}QY= zw5`fk}vwp_PfLl_^vMYwLXupav?NMQuI%^N zWP~-CS4V3&0)<>XT^vI=t|uorG^iVCIZP7nQ1?kpNJvVnIFPXNkOAX~{cjE&C^)Cs z&{(ZG;jqR5CZS}uN8I~mB!0+5NlHXWNcbE8+PzSpn`yGrVSk{344$rjF6*2UngAQm BJfHvo literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/utility/saltpeter_block.png b/libs/textures/blocks/utility/saltpeter_block.png new file mode 100644 index 0000000000000000000000000000000000000000..e4121244815f0d8c4eba62a3a07805799dd0af54 GIT binary patch literal 474 zcmV<00VV#4P)@PoW>S0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#8P)S5VR5;6RQ%jEPFbtzUb-L>PZ`xYX=PmLiWI7`t z2n?7aDay3>uBt*+;a=Zo03f3Ix)cD+44DZ4U}lI2&hx}y#mpcgthKHNRfWuinE?RS zT4+V*d5#hyf{0uoRhSvpTF}qu12Y={0Eh@80`88g8gR3_JD3?&1vN87#8`+3RMjuA zh``;Us&luhz-uiq^Dw*nG$A6W>VTN}mn{{M8OYun0Fapjemou{{X9=FGgNg*Sww!s z@_M~4Z#OUixcjIS5vb}#(ifWX{eI&(4yY<3Vq~|ij-oxX<^} z_9!C5*iCx|syd6+18o)B`)_6g_^ZqZXgqgH>Ka{09H{ZUGIMoE z+KwrXb9l#8Z?=TEz+lKe!+ z#@6%$&!VbcQKx^ox-xAw+ZT8EZLoP3UaY|r!L@Vy^m%c=Kiqj*oDdMY@pj)UtJ3rG zIRygYyF}z30G*&(;u=wsl30>zm0Xkxq!^4042^XSfXF<=z|zXt%*xnE*TBrmz~ISK zt8XY8a`RI%(<(t4jC2hRbq!2Hj0~+zOs!0z8dzKJa{x6+fourQPb(=;EJ|evNX*PD g(erZ+Q7ALkGu1ORF!)lm5U7g5)78&qol`;+0I?6A4FCWD literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/utility/saltpeter_ore_overlay.png b/libs/textures/blocks/utility/saltpeter_ore_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee3a84c5446d0c436be1c642749b3c01cea0214 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-u8B!G4OP4H2}x-c2NtY6WWac0|C<8`3Qj3D zG*)X)IIMAiNhq1=5x2gq#1EM$Nr?yv37-Q%ySrStW=x%uqzW{U!PC{xWt~$(697#p BLHhsz literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/utility/sulfur_block.png b/libs/textures/blocks/utility/sulfur_block.png new file mode 100644 index 0000000000000000000000000000000000000000..5341e317ea4bb28df269a864edda86167d6e34f6 GIT binary patch literal 701 zcmV;u0z&oav-KGl_aJjug{4aMGESJRPIIX$rIC!`qcsOOYdVp>Z*F;DbWVUo%y z#(}(NzLnZX?fF*Bk4W0Qk=K)`Gv$0)GE^Zg9zKzdX5qoX-EN`B~ zv|@NI>V|$RQ|J=YPHI=${x30oq~0?>=sx?MdMl<&ZTBFR-piwF6GHr|N& zhNv&mW%K(JVqzY}_(8kxrT$mO3pAM?9p!OBKt-0n_~~T{qAfkI$cZ>2%@}2Z{#;Do z$p@X(oznH%<&Wf*+#iv*bX%#M%By2By`w+FvrJup>CZ&_UOqUMx>pN~DYVFxtu&m= z2d5%^%kY{yVp1TLKgGBZ7xk^YzR;eNm`8L{x02T(bbkO{<_((iNuSrwixjv*Y^d3y}`nhgXF)F{3> z6RKq#li*+JsIB^TmP^umhX4PaHdky+b#cFKec;SHu~x_6yK(y-NXYEe-kx&yEYqu0 zDGTN7Z@fhefqR#6>HP^RZdaUN;&M@P+wo61l1j?YVqd&n`h5GhhmlWe69PgvMmv_y z-~F6FXN^E)=!3#3KsTtCxJHzuB$lLFB^RXvDF!10Lt|Y7ATkdzu(UEZvobc)H88U> zFnIFR>KlrN-29Zxv`UZ$BV9v7T?3O4BSR|_Q!7)b2G-X596$|HARB`7(@M${i&7Z^ k5;OBk^!!{y6v~YCO!W*6489aC1gc{2boFyt=akR{05FdgV zk4;8co9%;4KQBQHXHCr#uAxCc_tr6nUttvzVDm}= P8qMJ8>gTe~DWM4fR{Kk( literal 0 HcmV?d00001 diff --git a/libs/textures/blocks/vanilla/gold_brick.png b/libs/textures/blocks/vanilla/gold_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..1660f39cd3039116a894c1920220629a39c304e0 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSL74G){)!Z!AbW|YuPgf z*ARs=V?9$nLj!{^MGJwdLOfj@LoEE0fBfGs-E{59$HO;I@R$^~ReyJQ;WyL3h3QbM zvQOcJAP%OihRqWtGam6c*m-s|N|Y=A7GBc0VE4qoogbLxfV{~}_C3d#-<7!ju3%ue Y=)bUI+qIN$K=T!lvI6;>1s;*b z3=DjSL74G){)!Z!AbW|YuPgf z*ARs=V?9$nLj!{^MGJwdf<0XvLoEE0cQ7(bN=g=(88Q3LNtBYfa{aoqib9OV0g-eD zE=Ps{<~hA*9E8&uK6x_n9N8g#bG`yE%U#}Zh7#^W{1tb4-}rO=F_7Zlaar{3V@8IX Xvo@gTe~DWM4f$*V!Q literal 0 HcmV?d00001 diff --git a/libs/textures/gui/alloyer.png b/libs/textures/gui/alloyer.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb733931f8314ea8d15e08848be04a1e2224b27 GIT binary patch literal 2056 zcmbVN2~-ot7M&yz!V-|$vRhC9%p_q?AzHCCn<^m#=P>>LnK!8#<3ACsv zvRTUF(om%#{Gx_Ewk!z*!H6M9pll%&Wfel2)c*hN@tpp1I&)^;J@3tXbKg5}&g9~} zJ&-DTDgXc^_ORPg03b350SLHE;1lX2WdeTO)58sP%O}a!B2lJMjz1hElj>#i1yQ=> z%aoO&1J0HAwSa71wNXvGs>WKN#Os;_7`NU+m|0)D>BeH zQgA7~@4j-=Vez11QiS=@D|rk~daQ2I&qKSLF6Gw1j`;EBBUf6J;`>qBthtoJ(tom3 zgE#KOwcA>%Q%QRvxI+vjU-Te^hUtqoMv`Ti%k`~JbpX8a>{~i&@W4IRDX5(CKtp50 ztgZQuY?ztV^r3BJ$8%25jUg(PIx*E#@|6kJNk?t3V8Q2o*6b*EhS*Z9;Y2bh4DH41 z;UA8LOdP%Oc?p1{{jW&l&>O+q!r>suzX8T{*FkDdL*fW{81^!)07Z&LVnBWI>~TT% z?fh5HW?{6{@u|(Qt(CgsrqjqOWpxb=Rm19$c`|eC4o`S$^>VE(8{D3} z;R&o^lvlk7YZ&MS^({#P$<;oi;d9Rpu>aW$noO{w!&yLQ(g;w1-=nUsELJ8!P*@)) z*}n*)gf?hPQkfi^el|O1lO#UAN_AGK8v2nRchiC0JTJ7FiC4z`YhI@rj$YHEoJ#hk z&)2O`~b0*mLrnS^oO4fam3T%xD0dh zs;8BCl)~Ko(S#fJlv9z4xGBUC`F4^mXpX3Ie7l$t&)JhKXRzwzOD^jy<9I zYZI&Uyz%$BhDx*)a78k4JsAu19YS0_qX*mQ6-@9NqXJ#WMIy_m3&e{oVNBXaZ4|Wh zUL&Wx5+2)*(QZ7WTgV!SV+ci}SiN-j%*yvhKwL1wE_~k!1+{JaJ`hm;G;qZ!iC^gK z97P*t>`WI;?e$r5Br02Px{FoIKC>xWeEv@OQ&kkf~XJ<*%LmSN0 zaF2B{4I>uI8q1rK?q_}wIvxfTzz$Gl69aI>m%~@J_+LzoK_JIk+}B*65moJ*73!P) z;Xkw$0y{e>91Z1g5IS23%*V#zzZwH%0j13+=$uw~PYg614iEs>2=I73s>cXmc$Rnt z(aQOO#Wht4YFG~R-%SkRo?fFV3D=7bXSP#FE4DQW(`|Hc|Df8pk9x;-l6vR7a}s zGK#2hPhQ#JhYg(xu3MmZNoF?6+Qbls$#?zr60xY5hgU me=@zn_wNOG+w1>_yu_A{Ck~f2wph`CY+&8J-Dn?$XZ!}23_h{| literal 0 HcmV?d00001 diff --git a/libs/textures/gui/crusher-minium.png b/libs/textures/gui/crusher-minium.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e838ebf030b182ae485e5d016232a5c7157d07 GIT binary patch literal 2095 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 literal 0 HcmV?d00001 diff --git a/libs/textures/gui/drawer.png b/libs/textures/gui/drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..863b71cc7023377d68ede9d44b3797558e637b44 GIT binary patch literal 1893 zcmbtUX;f236rT485Nw42<{$=X8mSA5VrwNeERPyC7aB<|VvC{(+MbpeKsF(UwiZNV zuq;)}5{iNXM-b6a*tWj`p;v;jP4D1#4?55;PC-?E3Z^kQ>gg8-fMLes zg7j0Fy_ixz+-s+sejjXNXu9%q57Ir%aKel3`e9VJvUdZEbl5^PF5Q{N&U8r5A)dkQ z-UcUqbd}r`XBu?Q@ogVoYSFh1WkP$x4emCZ6(x4MX%TCgno6G(($SWwnsV=!3uB|2 z*h`*X3dgJKt5{hysZ+y*BR?_GwlQxE`FSupi#W!2&!tAGwk&9dhl)A9sOl`A|3!V` zOkS5pUZ5(MRRI{Hyox0ajjgF`Ijs@B;?|L?*!%(0MGjadXH{skman!^} zoUO+Jjl5l+!xIj)Ppomz-8Hyy&M*DvYRb*lvF4bneH->w$C~@44~qNkX&9z#!d{Q1 z&yI=N5_kW!m`eSgwy9h*6MlN@$pJ&Cpi(97wAJ3qUf91dUw8vfhr!KBnLXuNXO_-P zXw!+6&j4)$=#LdJEUJp@srd{|6&4FR0xjAoI zRSZ|o9l!OUHCWeyUurWhxE0kF zY80)UT%PH@W_F%)xz;P_Gs&|l3PmQ99qexr9n&VL+3O-RW#1}Z7d#kFot+I4lIA%z zKJxNZ5=2&p!Fkh>GAr_V2ys%*mgJvzRfP6fw{B|!qBj88eoP?&v$O z0|E%}{lvhtbhCesaP<1>zRz!}%@Kd!+IdtHwyMsn!9U`cyuMF|2?(H*+cRArZ{>RD zoA!nXJC_%|54AnVcWHFFc8WlaBH=7D&bh~og#_)2`gdLQ8J#we>tfU4uvm~qp`h^? z=;*smiq!kcm43IIX5~){&|_TGbtM3Z04(4R9xC zR`GdtfyM;jbBbGGWn;m;U48e6YjO--)KYUHg$pyD5j={rDoH%|*JzyI((s0JY+_9I#n=_7-8TA((nGGfk~Hrd|3tMnZJ3D~Ps8Xg(1jaX5?#|ZV=dBXqK8>+!{I+j$4GTlwPn7dz`4=5 zM8z`a%JdoTLJ5yk!?KX~9MAACN@LIkQQ3An;F#R#1XUkn*voe=3a^MS=(nk^RuWIk z^bW7+y)V5>tA_>912nuEW`t_7nRZ|Fxyt9b;4Uu(* z8G*s!zYhDI$$vq5$?g|`?*_V&BHoxHv!KdTQDm2?;mYZsaQz8~8mOSiJIN-{ve_nRUsF*A|G-51_Ri5VU9N z5jCie9oqd$tNlHCJiv2zVx_dIFA&vUMX8P!g)o!$k!}QbfThaHVg9g#CH5Z&`K22r zY$cibWIzMaS(zCbT`M}iG38dABNhWX{g7X}#Hu4cQww39qJA@dHTuOS|0nW)(EM)) g|HS`Sm&g>V?`qvGIB3!}0I=cZ=1sr$e!!Q%0+TBQWB>pF literal 0 HcmV?d00001 diff --git a/libs/textures/gui/forge.png b/libs/textures/gui/forge.png new file mode 100644 index 0000000000000000000000000000000000000000..c6bafa3012bcb07757eba8b4b02d26b11de44c3b GIT binary patch literal 1775 zcmb_cXHZjF6u$2fic$ljV4=tYiV|rmf)G$7A{Yfla3zu;2(Cykng~9?f`E%I4lEMN zu1Z!~5OwJgSEa}Ow=N5WW5(7ml>b58T2q?R5*XGTWGpUnLEndxaZcVfT!T!(^HkA<)zyZG{?@2>dY zx469|5OnbSjWgN#uHmKd#gSAmrRf?T&x@X!NjUT+x2vl-&Z#9h1Enlgymg-3^+8kNaP` zq&(LL8i32oJc2Kif~^XKvvcRb#cCUNnHc+!;{9{<}HO^JrV%^?7AV50c*HfSvV}O8-n@*}A z%77M5qm6FX05G^QNJ8XZ7bWE6nB58t4mOTE|DI34XqX>xyvS572BkwCKMvIsd8EATRYp z>E53A)*7~Fj8b2EJdRCDO7a)ZfBqcmz~H#zQhFlT!IKznP|$5i3w!yGB!Pwi+y>OK3SH<^L0+Aj1M0!u#`)#e>Te(O}c>kO!?8yO&>t?jT-@2MF7 zYID`)IYlhCwzd{`PZ{NfGP6LM*WvT7Th_W6>MCTAftxB{pytvdReIHcOuDx~oUGvI?@zjF;UIkF@py`zS7n(_6bFz> z3?orc@MPkdo4S0r3R1NFeohWi6qA;g_V#oIzr>P#;q|V=XV|>@>H(C{2CYJ~xqR@h zHH5l)GB|?1XSRqJR2qtDug@HXG&97=(~ByCZ&z`*SZnj6Viy;e8pFo4+F@!A`zMTp zP+#ngP&~xZ+1ZUmQmr-hSMy%CA^!rVo!Mpt3`{I%U#NXmG zHNRCm*_ez6Hswn0FvZrHMyPmyw#jN}Xo!uSU6>0tIovO{h5rop5y52veYXP3e(v|7 z(w5t21=zCgOPMqP4w3@5HFaTC2EV@$PsA7zCu;*YzcJ4T?bQg5e(?;wpdU^3AAV>* zt^kxm>`{kj-A${SVS(uwyGAK0E0He6T?-U|6+m{km8=>%PVS$k(3_7%?K!%POg)bx zx6;F;S0b&Twp0SRR}rFK5GWvTQj;1pr-k2Z%NW`^eG%0$1U(rT_o{ literal 0 HcmV?d00001 diff --git a/libs/textures/gui/nei_alloyer.png b/libs/textures/gui/nei_alloyer.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb4e831658fe4ad629d4db1f56c15d91f2c105e GIT binary patch literal 1971 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 Il}|+4@3t87jsO4v literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/angmallen_axe.png b/libs/textures/items/base/angmallen_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..42eeb609bab3459ad3173d6b3971e788641ff51f GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF z2*-8b-rb@N1{|)Ht+p&;27V1Q6}+G9aE$uCUL;BJ?Bf`_=`Z4y=5+4T50LV1I=oxC zF>{g92f1jcG%4Q07eD1~nD;Sb_7ve=c~=-_tXB$}-u_^|vS{WE*`|`7)Xvob^$xN$+ zYB1C_Gz~E_2CB9)G}SdQ18U$BSC#>4kOJ8doS#-wo>-L15RjOeSEA?V8lq5UtY@lc VXkhTAXdzG)gQu&X%Q~loCIF*Zk81z` literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/angmallen_boots.png b/libs/textures/items/base/angmallen_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..3deaf578fec24ced1dfef4f2cc4132187995b230 GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFAQOl;rQhiSvRph}978y+Cnp?WW;w`kLcpj< zBrwcHEKx)-p+tniP=r;YwSmX2ql1BYv4O`CffEHmf((glZsH5P1jQAc1(pc7JYZp% z*vopnYU9O+K=V{fTq8?+%iKUgHxvqh!m4QLF zFFzZKhTQy=%(P0V218v#(-0$LplT~aQ(Xfypaw2+Wf`CbDUc1p`DrEPiAAXl0g0J; hC3=3YAqr*2dZv1Y1_ob>76MfeiWPe{CZ5<=cKhPg8#iwJ z|Np;Sy~YM;8e>V2UoeBivm0q3PLj8~3quF1tOt<8S>O>_%)r1c48n{Iv*t(u1=&kH zeO=k_F|+eC=+BdS{|P8$<>}%WB5^r6K|y#!aZ%yNPX~9(gxto}z!^MnifTl2by85}Sb4q9e0F@9_s{jB1 literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/angmallen_chest.png b/libs/textures/items/base/angmallen_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..24f1f250098e8edfa6bf7651ff3c4e016c93ea65 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFlBfSbCNq`<`2{mLJiCzw;v{*yyRiPqe|a3p;mmh)D+baDKzxBA_*qRi zNU*>o5-7-b0E8K{u61&P1j`B>(}B8yOd#Hrey0n_3iotz4B@z*+Ix|=!GXj1G+T(; zheu2;vkxTypZVm1J?E0M-WiSmIks;5BBAv-GBnpUFtsu;$oA!DL(!0%pOTqY3DsbzYiJr`WDHboWoW8vU36z-EO$>A#}JO|$q5IzC0G~mD7vm_ zn8@Mc;o*5yP-nrCB}zO(LSaQlg^Zk>mW)dscmz{bMK^FP?w-_P95H)Acelb31xLp< zVoVH^KC-R+$Ed;&G*Y$1HKHUXu_Vlzw|7#UfaSXvpH>l&C^ z85m^y^0T36$jwj5Osj-yFw`|P4KXqXsmdKI;Vst0HH5;X#fBK literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/angmallen_helmet.png b/libs/textures/items/base/angmallen_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3d6155155ac34e8d095a0d8057f32fef6553fe GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(bbkO{<_((iNuSwWsIjv*Y^YtJ4OJ)pqB9B`9C zN^He0hc_%c{s)M@-D&xEx^vJe|By2wLg8!658e9A6Wt(ukaan`lA-%+&W|^pg&#g- zKjLP1;oBC0D!&8oeK%DwGXG*f_IFmyU!du#C9V-ADTyViR>?)FK#IZ0z|dINz*yJN zIK;@v%EZ#j&|KHR)XKmh+n1jWMMG|WN@iLmRD+?ep=pSbF;KOYp{cHc8Bhb4xUvjT ygA~Yy;QX|b^2DN4hJeJ(yb?V>*ARs=V?9$nLj!{^MGJwd7(8A5T-G@yGywpwribJJ literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/angmallen_hoe.png b/libs/textures/items/base/angmallen_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ccc02025dcf06eaa77e3661525fe1478e49811 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFUO_QmvAUQh^kMk%6JHu7Rc?j zk(G(1m7%$=fvJ^&LAEbH8;XY9{FKbJN~i`yT|?6lBV(XyD??LV12dooE^%cUpavEc|A*%#^Nl~)+IhsNn1s)EUVT%G!%V2sDEXu8PSaiT zvX{f|9Di|P^PMFMyt1}UtEO!K{kfX)x(3&Nl}TP88&peNBT7;dOH!?pi&B9UgOP!u zv95u!uAy;=k&%^&rIn$%u7RnQfkCz}KO2gM-29Zxv`VN3LtR7D5F=xtYAZuiT>~?q z1}<@B8K4F!kPX54X(i=}MX3w{iJ5sNdVa1U3T4K6rh0}3249L60#z}1y85}Sb4q9e E0Ize2yZ`_I literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/angmallen_legs.png b/libs/textures/items/base/angmallen_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..770d47e06fb949cadb113f847e211762deeeb309 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(bbkO{<_((iNuSwWsIjv*Y^Q+p5c9x&iwe$3mj z!Ql$$iU@|(|8u#X1crWn{Y1E;r~ZJXm%wei@TOyBy?G|P1i5X!I0L)5EfV#bA`ZIl zuy6SCH*)TV-(8x|@4aQu5aDP%!u_=kXu4{NYeY#(Vo9o1a#1RfVlXl=G}bjR)-^N^ zF*33;v9vNY*EKM;GBC*Y9nN|taV5nKLZB)JPgg&ebxsLQ0Qf?Ng#Z8m literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/angmallen_pick.png b/libs/textures/items/base/angmallen_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..164ccdb84e14442d24e5822dbeabe0652fedbc8b GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF)zSR@YeT;pPMbKT&; z+`K@^rJ<2=NvsY-4hyr3>;$p4Sw~-RY?pRoW_YulZRV3YnPor=R7+eVN>UO_QmvAU zQh^kMk%6JHu7Rc?jk(G(1m7%$=fvJ^&LAEbH8;XY9{FKbJN~i`yT|?6lBV(Xy zD??LV12dooE^%cUpav}hHWXq%+eB4*TRG-a+LkD{=0hm>1l2Sam*K*)g!f=U8v3=1Q*7aVIdckn&i zaOqHhXir~3x1tF{OaiO)x}_YSfaa-|xJHzuB$lLFB^RXvDF!10Lt|Y7V_iez5F;Zi z6H6;Yb6o>dD+7aUUw$?e4Y~O#nQ4_!4TidgrXfbgK-E@;rn&}ZKn+~t$}&I=QXm_G t^V3So6N^$A0unRxO7#3(Llnx4^-T2)4Gg{%Ed;7!@O1TaS?83{1OPH*e9iy> literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/angmallen_sword.png b/libs/textures/items/base/angmallen_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc25337fc5293a344e6d232894ec09d4bb37d0f GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~Qr%&_sk?+%iKUgHxvqh!m4QLFFFzZKhTQy=%(P0V218v#(-0$LplT~aQ(Xfy zpaw2+Wf`CbDUc1p`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76MfKPgsd?{K8RK?)w>gTe~DWM4f D@~nC_ literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/bronze_boots.png b/libs/textures/items/base/bronze_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..98e2f0c9cb3927c14a0acc0255f0855608765483 GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFAQOl;rQhiSvaCE^978y+Cnp?WmSAOV;5ZT> zmS7_2AXwPenPAW&%PQf@hO0t)iRid?*RpLOD;;%wRhNyB@{{O|ZE&)wZ zEpd$~Nl7e8wMs5Z1yT$~28PDE2FALE#vw*VRwkBKhUU5krd9?9*}nX2C>nC}Q!>*k zp&ATz4NXIgjDf1H3{7s#% literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/bronze_bucket_fill.png b/libs/textures/items/base/bronze_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..3a8e9573e83a78a5db104b3964e09fc742ced27e GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq2P3oGRDA=*6zFy+S&6^UJxUwZaN?o`b@$>)H?sOid{c^?~-Q9)~(bk3rKrqL4SO3GO zr^9)ito(TXG%4{sV}}GY z5I85@=5p&|dVT3ymiWsLp!XI004k(~`Hw=~hA{ S9DAUP89ZJ6T-G@yGywqd6Jwg;xkHW zK!ODxkw8Jd10c+pb*+;VBv@A9m=4qpWCHP~^gCTZR+OiUV+hCf+}^u_4GKKXvw4FO z8CP>BL^34)pSk46qvpLa?{|MuSF&H~y;(AGash9Wj7W(7$=@v3bHkT=oJw1Jq-gJX zx%3ayl9dAdblWTD{t#B^)X?T;vA@V4;?JRD=@7yKv_-YVHKHUXu_Vlzw|7#UfaSXvpH>l&C^85m^y^0T36$jwj5Osj-yFw`|P4KXqXsmdKI;Vst E0F3H`Hvj+t literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/bronze_dust.png b/libs/textures/items/base/bronze_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..fd8ebbb02b9202174be98328fe7f5931e5380062 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF{>$S)4rjibTQQIZnhC^=V(k+^ zf(0ItKta9(Ak3I`t&s0gah0XtP6M)T~{*B_1K6up*;EMovyk#-$ECf~l&a8#oqsPwFs^n7yF8Tj7X;qvIMe zCWc8L*;f8zRN)62saoP1QIe8al4_M)lnSI6j0_Bobq$Pl4UI#LjI2y7tqjd|4NR>J z46=Rs*-$j(=BH$)RYElw>KdAc7#RaqTN#?_8khk!aEU9+05wQ~YzWRzD=AMbN@WO0 j%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}i?ww6 literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/bronze_helmet.png b/libs/textures/items/base/bronze_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..2903299e3656334fc26252201075603ccaec0680 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFAQOl;rQhiSvfMmf978y+*Pgz}$)L!?e4&i_ z@-BzcrdynM>NR)XS)Op>xU#^+aFL9bUO}0(tH0EA7j*CxAJS=Zu*!cm&-2aQ-~0^% z8_N00_OZ6q?MvGMG*Pw0HKHUXu_Vlzw|7#UfaSXvpH>l&C^ z85m^y^0T36$jwj5Osj-yFw`|P4KXqXsmdKI;Vst02@P5LX}_XCeM@ebc25 zmzDs9T?IOxW}=KT4=8gktK|Nqx}xaA^H5o1Y^UoeBivm0q3PLj8~3s=U4FJV9q zXTFQ&T|OgieOV3>^nGUTJWp85p#&IH|hIDw-rKxU?zCdTlOs3SHuVK=A;F zaDx=rmPw4F3=CH?*_JnnR7?aKrCQ<|QIe8al4_M)lnSI6j0_Bobq$Pl4UI#LjI2y7 ztqjd|4NR>J46=Rs*-$j(=BH$)RYElw>KdAc7#RaqTN#?_8khk!aEU9+05wQ~YzWRz rD=AMbN@WO0%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}lAw5I literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/bronze_ingot.png b/libs/textures/items/base/bronze_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..f67a946ba512935a5d6026357f6061365535acb0 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GT%d85|h& zH2;BAa29w(0tNXFfG}g$wN6fuU|E4AY4r|B+v z*~?*fj=#9D`OXprURm3wRa3VA{#?y?U4v`C$|Nt44XP!s5hW>!C8<`)MX5lF!N|bS zSl7T<*U&h`$jHjX(#p_W*TB@uz#!X~pAAJrZhlH;S|wD2p{}86h>frXwY-& z2MHE(bbkO{<_((iNuSq`2qjv*Y^lM@cG^fWmrFr;uu zTFvIrW|CCuJEx}9ry!{Clt(a8grU1Z#E8qtfn$T7n=qqWx`A^*!^8|h4F(4J73?zh z*1xiVW~r9AMwFx^mZVxG7o`Fz1|tJQV_gGdT|?s#BO@ylODjWjT?11q1A}Z|el`>h zx%nxXX_Zh7hPsBPAx6eP)mDb4x&~%I4P4^NGC&PdARB`7(@M${i&7Z^5;OBk^!!{y c6v~YCO!W*6489aC1gc{2boFyt=akR{03^?Ei~s-t literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/bronze_pick.png b/libs/textures/items/base/bronze_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..abaa2b43937d96298b7db7366d3f8e9e361514d7 GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX}_XCeM@ebc25 zmt6%qo@SyMesUUe+@0y_2TEN3|Nk%XZp~+)BF2&+zhDN3XE)M7oFs2|7p{y8U&4SK z&U`nwVjvB)f}w!nWB!S$Ai)BUNT49!0T5=)y4J}F5-cllOb6-)GJ$wg`kgKyE5Osm zF@)oKa)JX>Q&SU9lS12s&dm!HI}U1SJknv9m}1gs)Z%&|h-Xb(PhWyt1Y^s=TjvgB za0n(OgtTxNH1PItG(=6{+v*v_khYY885mfS2iSvuh?gt|nyp&m8c~vxSdwa$T$Bo= z7>o=Ijdcx-bq$R}jEt;IEUgU9bq!3d3=Fb;`Poo3Kd2FODNavE~n|NsA=nY!&iPz7U2kY6x^!?PP{AWo9Ey9?*Xn@isSIh^@! zZpA^ zP55>|A^_;I^{oD!O6F`pvs6o5BT7;dOH!?pi&B9UgOP!uv95u!uAy;=k&%^&rIn$% zu7RnQfkCz}KdOe@{FKbJN~i`yT|?6lBV(XyD??LV12dooE^%cUpbb(W8-nxGO3D+9 nQW*jgGxJLH{9Hp6%8d0)^$ZORz7#D4s$%eT^>bP0l+XkK>xgsR literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/bronze_sword.png b/libs/textures/items/base/bronze_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..6585ba9de6fc1b223ae9a96e2787d613e95b55ca GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFKby~|NsA2SKX=uRKZvhJ z46=Rs*-$j(=BH$)RYElw>KdAc7#RaqTN#?_8khk!aEU9+05wQ~YzWRzD=AMbN@WO0 j%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}V-R#$ literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/copper_axe.png b/libs/textures/items/base/copper_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..6d4156d4364b1681bb847e479b78e5fb8125387e GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFQ&rUP{YnLxZL{SL@rH%}MG5RU7~ z2@FhbjBFeNK`j@0PPGLvCOeCFG;B5|7y3ktCvn3TN8Tde29FIbj%U9% za2Xt8X-PEWGFrgIpfZ{5%`YM2!$1>NOI#yLQW8s2t&)pUffR$0fuXUkfw8Wkafp$T zm5HU5p}DSssg;32wl6;$iiX_$l+3hBs0Kq_L(>o=W1wm)LsMM?GoS`8ab+2x1}TsY u!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;-iWUM@F?hQAxvX z-^UKm|Ns9l^qaa9D9Tt8H6NPt*^ ziI9U}A&@$FP9R7mK_rM}r6`ccvMSBQEG0p}Oe}#RyYKPgs Td?{K8RK?)w>gTe~DWM4f7RYf} literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/copper_bucket_fill.png b/libs/textures/items/base/copper_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..44d993ff013c1e805b034406becd44fdd9dc69d4 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq2P3-zmyD4@5>RM{r;B5V#p&b(iBAoJvlHs`j?~MA zsj;aUy0U@5x%=@FJ8sU9_;dQVQ&rUP{YnLxZL{Z1E<<>Kk$7{YOV>al~o4GbL47dJU} z`ZNe@=sBePpSfn9O~uFMnQ|W{+Fw@HRXx2ZRH*F7wjY{b-n?dM)VNx4a9MK2;gt`= z#T^XTxl0!&`~jM$TH+c}l9E`GYL#4+3Zxi}3=EBR4UBaSjYEu#tV}Ge49#^7OsxzI zvVHm4P&DM`r(~v8LNyrb8k&X}83R>Y8Jg-Em;p6#i7U$hHAsPM2+mI{DNig)We7;j i%q!9Ja}7}_GuAWJGc+*xQnV1Liow&>&t;ucLK6Ub;(vkw literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/copper_dust.png b/libs/textures/items/base/copper_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..abadcf20bc672c6d3a786ffb79989a1fa16ccaa5 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFW~$hPtyqY6LJNYxV8h?11Vl2ohYqEsNoU}RuutZQJbYiJx|WMpMxX=P}xYhY?+ zV36(0&xWEQH$NpatrDuiP}k5j#K;(^+RD&W*T4*@flFLj2B<*_WJ7R%T1k0gQ7S_~ jVrE{6o}X)oLYc9ish**M!Iz?iKvfK$u6{1-oD!M<`vY`; literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/copper_helmet.png b/libs/textures/items/base/copper_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..6895537430800bf9571bc42a7e1d96f346092f2a GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF^xl@LpZJ{CmdjxU}a@Jz@wbjv})5eX09vv400s?)FK#IZ0z|dINz*yJNIK;@v%EZ#j&|KHR)XKmh+n1jWMMG|W zN@iLmRD+?ep=pSbF;KOYp{cHc8Bhb4xUvjTgA~Yy;QX|b^2DN4hJeJ(yb?V>*ARs= aV?9$nLj!{^MGJwd7(8A5T-G@yGywoJ=y41H literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/copper_hoe.png b/libs/textures/items/base/copper_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..a63d0f82ccd67bb998bf2b2547ff6a3194b567f9 GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFslu#NU*HHF&(HI$OPg|>36z-EOSp6#}JO| z$q5cjJxu{^6E-r0xEwLyIaMUs?!{&8lyS{v#i9t)x7$D3u`~F*C13 f&(AePq0Cs%RL{`B;7id$pehDWS3j3^P6@d>Djfw3gWFPOpM*^M+1C&}C0g)K2{M=g-UneXOS45UH8fk7+y z=V>5=v%n(~D9CpJgc-B0b#j6P%L*LRfx3ZAAl{UIrwhmm^K@|x;kaJfdyu!mfQR`m z@1sjR409K>uueF{F!ja1)eTJkAD)-YH~wI2=Mke~5KPgsd?{K8RK?)w>gTe~DWM4f Dw@!x5 literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/copper_legs.png b/libs/textures/items/base/copper_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..e3a38ad5e640d1e34b87f168fd089696be7dd7a2 GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(}B8yOd#Hrey0n_^6_+W4B@z*+I5h#!GVWmvuw_u zY=;ev%_ahu>;2UnSqtM1zv=qZsOEDs?8c4YW$nJ}550WhBoO+l!|L%=Rimh$j%m#n z(NiwG|1xDZ_nnJu3C+uUJ^;;CEpd$~Nl7e8wMs5Z1yT$~28PDE2FALE#vw*VRwkBK zhUU5krd9?9*}nX2C>nC}Q!>*kp&ATz4NXIgjDf1H3{74;N7FO07A`K>sJv$c9VscRl;n30);#ept>&&9S#Iz`ZEm(=UW#K&r5oXR50|O3j z2Nnql$0(zOG>!u~PMake?p|ceI8YS29%!g)iEBhjN@7W>RdP`(kYX@0Ff`URFxE9R z4ly#aGO@HWG}kpSwK6cs_T^_o(U6;;l9^Ts)nKS=Xc}T<3{-7pXsT;q2GqbMt}Fx8 xAO*4^I6tkVJh3R1As{g`uSCz!HAJDzSkF|?(7@nJ(L$gq22WQ%mvv4FO#s==b_M_d literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/copper_shovel.png b/libs/textures/items/base/copper_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..5ad6b769adf1ae9b664c8ce5785293733c1e27e8 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF4;V3D$)?im8kp4PAmQicj9KByO0c;WVX1)RFa)q#~0bD^CC;TL|O9vK0*-3}@sR z*+hUAHnN`6-rC*`G)T3?HKHUXu_Vlzw|7#UfaSXvpH>l&C^ z85m^y^0T36$jwj5Osj-yFw`|P4KXqXsmdKI;Vst042qA`2YX_ literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/copper_sword.png b/libs/textures/items/base/copper_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a51b5e11b4cfc5188839b26fcdb2fdee45bf44 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFIh^@!ZpA(bbkO{<_((iNuS;n3&jv*Y^lM@c` zNw6;DQFLC>ut_Q8fCs~VhQ$g#2PCpMx(!?!4w?#T1+$sTsvTt5%*XIvhWTAw^92{6 zcGVKsh?11Vl2ohYqEsNoU}RuutZQJbYiJx|WMpMxX=P}xYhY?+V36(0&xWEQH$Npa ztrDuiP}k5j#K;(^+RD&W*T4*@flFLj2B<*_WJ7R%T1k0gQ7S_~VrE{6o}X)oLYc9i Xsh**M!Iz?iKvfK$u6{1-oD!MIO1_cvJeFE+8wy)5S4_<9c!e z1CyJhBb$LhkPyS=9PsvQHglaImD9Tt8j0)0AZUi(0O01X>7~s-yF)*N^@#4|IhQK4NCm4zp zSo|0m%2Zh$^6u_Z0h*~=;u=wsl30>zm0Xkxq!^4042^XSjCBo-LyU~9Of0Po&2Ejdx8`B~K^ z`L!i^ZM9`Rt&NkqT9l*!&%@F zShQ^`=6VB#j67W&LpZJ{CmdjpIHaxCkYVP! z`sgHS2c6YNSMw+qarZtvCFZ2T$i_UQgP|>uiN}SJp?NXezB{?9zopr E0CdbfM*si- literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/damascus_steel_chest.png b/libs/textures/items/base/damascus_steel_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..d6df99b1eda996dc5dce24fc08fb6393c48b330e GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFKfUF2l7sn8e>$zt)@*XhYU~#z7 z&>yK#!E`&4VdmfTu7zHLEf+-l=eTZ1+{FlkKfWy!6@9Pqv9jYa+5hW>!C8<`)MX5lF!N|bS zSl7T<*U&h`$jHjX(#p_W*TB@uz#!X~pAAJrZhlH;S|wD2p{}86h>_!@hljQC0!j_n}qZY{F%y)Au2GRjQY{0xzbn+Aba*o~8mi3zjT-#UmsX#%09I%E`&9xw5T6V$mtDRSAN}0#vUjY%n``A;7W2 zv8gFSmxbY_0*7SL;Ta&)RZCnWN>UO_QmvAUQh^kMk%6JHu7Rc?jk(G(1m7%$= zfvJ^&LAEbH8;XY9{FKbJN~i`yT|?6lBV(XyD??LV12dooE^%cUpavQ&rUP{YnLxZL{Z1E<<>Tq%7{YPAw)dbQgCYm>Qf6h7 z1z`;#4*z{Q_q?-vwsrDNpQ!5AhB$+3vqEz=PZpJ2t$N_O084?Dl!COyJU;F0lk0Ts zJ0g3P=I-kk-yO|%V{YI(KA^d(C9V-ADTyViR>?)FK#IZ0z|dINz*yJNIK;@v%EZ#j z&|KHR)XKmh+n1jWMMG|WN@iLmRD+?ep=pSbF;KOYp{cHc8Bhb4xUvjTgA~Yy;QX|b q^2DN4hJeJ(yb?V>*ARs=V?9$nLj!{^MGJwd7(8A5T-G@yGywpsqH%CVeZ;wca00teE6b&7Qi6Mb41`;j23r{5mB{KCSuw}D`R7Wtkv~hPhva*OS zWD1z;ASl7i#ZacjYU~twrvhl4YKdz^NlIc#s#S7PDv)9@GB7mOH89pSG!8K`vNEx> zGBnpUFtsu;$oA!DL(!0%pOTqY3DsbzYiJr`WDHboWoW8vU}Bc2s36~>*NFpmK8Xr19bzLK)fmaP8X0B=IP=X!g0N{_aJYB0T1(C z-dC4+9A++PVV!V@Vd{y0s~ed7KRhp)Z~Vd5&LhWii^*JP@vElFH$10!PQ6+-FVdQ&MBb@ E0G_FZm;e9( literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/damascus_steel_legs.png b/libs/textures/items/base/damascus_steel_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..b396b56d6e4038a98dd71f19e3729e7af7e8268c GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF?)FK#IZ0z|dINz*yJNIK;@v%EZ#j&|KHR z)XKmh+n1jWMMG|WN@iLmRD+?ep=pSbF;KOYp{cHc8Bhb4xUvjTgA~Yy;QX|b^2DN4 mhJeJ(yb?V>*ARs=V?9$nLj!{^MGJwd7(8A5T-G@yGywqDTXz}& literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/damascus_steel_pick.png b/libs/textures/items/base/damascus_steel_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..162d50ed1489303893383f71b0282acf2738708d GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFslu#NU*HHF&(HI$OPg|>36z-tYA+U#}JO| z$q5b&ZjO$QZjJ)pCoZ^L5YSOk$WY;!S}N9H(84OK$kf)8V9Jxo#FJpUMwCZj;s!Q0 zH`fjZ<_Iqvh9z<*!djwKc}%+<0~#2CVQ|KgjYqU*t_je1)e_f;l9a@fRIB8oR3OD* zWMF8lYhbKvXdGf>WMyJ$WoWKzU}|MxknPLQhN2-iKP5A*5~{&a*U&V?$QY>F%FtBT zzznE?OI%q7s6h&3LvVgtNqJ&XDnmeGW?qS&pKFLhnX#U!o}q!km!gG0RScf4elF{r G5}E)QjdoRlj zHEp>RAX~u5=C)!lL-cNzo8K9erT`68Epd$~Nl7e8wMs5Z1yT$~28PDE2FALE#vw*V zRwkBKhUU5krd9?9*}nX2C>nC}Q!>*kp&ATz4NXIgjDf1H3{74y-bPEG#UFOg&uzjBd`U9b9hi!YeWlH3{rp(|N8dp{;`1 z#U(&6YwiYyDU6{ffmUy3z1GrH?FTecwZt`|BqgyV)hf9t6-Y4{85kPt8W`&u8iyDe zS(#W`8Jg=Fm|7VaWc%{7p=ij>PsvQHglaI1vc;mmh) zD+baIKpeo3fAZlskYIsFBv6p=00=W?UF+lo36>Q&rUP{YnLxZL{Z1E<73t~X7{YNq zIe~%6&5?~mAgJX+k5^k0QvzeEb0Xu0hK&mrGPoQ#!MI8(LO@4BK`TRt!NhsO#R(TB zavT;lY!LJ?jOGkcINa#Sk>kTD(44Vhp+cMDm9!bc459ltlvW4yl>#kMEpd$~Nl7e8 zwMs5Z1yT$~28PDE2FALE#vw*VRwkBKhUU5krd9?9*}nX2C>nC}Q!>*kp&ATz4NXIg zjDf1H3{7!lX8<*YJnWid^fjZAngFe9~cgv zinzsjh(;Py?5^vJ6mz6v&3){Irtt p#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RS|paryuN literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/hepatizon_bucket_fill.png b/libs/textures/items/base/hepatizon_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..4f02897dd0397005a6d7a312157ed95080e71f2e GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=7g@$@$UwnaP=j*@cBU zg$l|2s&{ZXdG~1G3XIWPyjk#q?EO=k;6v;sGGsl)z4*}Q$iB} DmGe6| literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/hepatizon_chest.png b/libs/textures/items/base/hepatizon_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab06cd7928848a6c1e26b5b6bf33fba7975b608 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-K-vL_FEE67 zRqh1|7I;Jg1^EtuFk{xWPEL?uS%G6ZP&beX#GBIZbOBjOo-U3d9M@BOFY-1h@VK02 zv)#xn5y^0nkwq+n=lA-ggYv?^i}iEg_r0*^b4h4UO)t;c#=+^)dh%-V-gh|{LPK`h z9t=6_Fv)v`)f>%UM~si_30qxIH@RrmU?XtfsO-KPgsd?{K8 PRK?)w>gTe~DWM4fx!lqF>_w|Nl?k_51>qU@Qsp3ubV5b|VeMN%D4gVM|QgQ48d7=DWES18D~!Helc~ z=?Vl17I;Jg1^EtuFk{xWPEL?uS%G6ZP&beX#GBIZbOBi&o-U3d9M_W*4sc7bF5ppg zUC}U6+r`7f(^Nob!ICAfc!Y$)xQuvNIXPK1SGF}sEIQ@2DnamAfa>*x4Q2-~1UPm$ zHZ?`)vM{_<;E*gjJOgC9YKdz^NlIc#s#S7PDv)9@GB7mOH89pSG!8K`vNEx>GBnpU zFtsu;$oA!DL(!0%pOTqY3DsbzYiJr`WDHboWoW8vUc#S%MS138@eZf?au+5w0U zFvxXezX1srctipP`3`_EW7f4!PLN<(fnz#QH;@U$o6_%e0a;F-E{-7_*OLc6L?ZadhNRHoWP>)2sN1Bh7%rh>Ig> zvmk>gBZn=Aw`l~>G}RKAQOl;rQhiSvOGOq978y+ zCnq>CxH&p%INywD2xK@SRAeY3)^LJT+i7a2gj1-c(-H|LR+j@j*GkwN4U`u#EMn4N zU=#{qbX*a}w!)8X1se+k!<^@=UC-qtLx6^=mbgZgq$HN4S|t~y0x1R~14Cn717lr7 z;}9bwD-%mALvvjNQ!4|5Y+rsh6b-rgDVb@NPz{Et2W y4N@Q*g7ec#$`gxH83GbB^GfvmTtgJfjP*?Q3=Isv6fFd*V(@hJb6Mw<&;$T|F?Htv literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/hepatizon_ingot.png b/libs/textures/items/base/hepatizon_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d7ab5c9d3b8a47f8315f717b9a1e3d0e9aab60 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-K-vL}Rk=Se z2MHE(bbkO{<_((iNuSz(?ojv*Y^OM4IUHW=_Q-{pOD ziHBkCf)>^ZhZv^5__w-&$^XOilKI9TZ0$T^R7}EWJFmW}#bG8?X_Wj?cBknsdD+Wh zcaFcfu=&ms1zuU(rd3n6|NdOfcwK{Qzse*pkPWIOt`Q|Ei6yC4$wjF^iowXh&{)^N zSl7@v#K_3X#L~*pT-U(V%D^Dom!AzqLvDUbW?CgwgQ2dWX^4?AP_>nzsjh(;Py?5^ zvJ6mz6v&3){Irtt#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RS>^ BgyjGL literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/hepatizon_legs.png b/libs/textures/items/base/hepatizon_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a5b4c4c4c2c4bf85a08a916350906cf02ebd1a GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-K-vL_A24+D z`1^qb3p^r$f_w)+m@(^GCnrd-tiUlHs2j)x;!Wvyx`3>3PZ!4!j_awt2YDL|c$i=F z-ZA58n6aRPRVjf%<=gz$BOeZ*dYp2+NV9%no5Y1<`@UKp__OEi(=Uq4ch24`xNwEk zL(|vdhN-gL8@a3uS$^tRNG#WNik>f*8qA^7qY?%3lxm4t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^P6#6o1=jDi3<@I1e8>gR2U|fl(ZR0w7BvpDz)_qxFs|xM2Kfg2Jjr|@JL7q zY2h$v;1%I#SjoPLcVQT(^VuW;kpu@u2JW|PrnC}Q!>*kp&ATz4NXIgjDf1H3{7dZB7uT@2SAuH>slu#NU*HHF&(HI$OPg|>36z-EKg4t#}JO| z$q5duO-%x`0zCx}2^cjRuuPqMkjG6?SebD{%VI;9w!jDuodXB5UT`F~h&rW2+?G^e zN@5MT%)9U!2ls(D!VX*I8CJ)zKHhW5K?Z23YKdz^NlIc#s#S7PDv)9@GB7mOH89pS zG!8K`vNEx>GBnpUFtsu;$oA!DL(!0%pOTqY3DsbzYiJr`WDHboWoW8vU1vc;mmh) zD+baIKsQ&rUP{YnLxZL{Z1E<<>Kk$7{YNq zIl+OoiAi8qAm=FoqecUXsj>^TTojm^w3-4$4<#_VIl4M`c)6yp=;4@>=G$_@pu^n3 zg=Jxyp~G3H8{7lzw|7#Ufa zSXvpH>l&C^85m^y^0T36$jwj5Osj-yFw`|P4KXqXsmdKI;Vst0H{HBlK=n! literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/manganese_bucket_fill.png b/libs/textures/items/base/manganese_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..b36fc30240a6639ab23726cc146ec4c029e812cf GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMVWpHJfURO80qhmpP`+}aH z1rsK0n>%;g;>FvRFaN)K_5Zzl|DQfBlN&1xRL@uvO zIhag-@+$VSw8NUKyUW(MoOm0<8oo`~$u}W_L3n0E;uRLQMGOqPT)A#Xb}R=P&%og6 L>gTe~DWM4fB#TH@ literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/manganese_dust.png b/libs/textures/items/base/manganese_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f8c70ea0ec574fb99ef01c5d590372905fc129 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFnzsjh(;Py?5^vJ6mz6v&3){Irtt#G+J& lfW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RUs$d3XQ- literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/manganese_ingot.png b/libs/textures/items/base/manganese_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..3edf16ebab22ea2b5cd7669622e572557f881e8f GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFASiFL(=4cS-ic7)14Ss29Quxp}0+ZT=r&qW^3GFtv4 zwL2j5rKR@^zS_O^`^_i4t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^P6Eal|aXmS~fvE@R1}25J36mx%ML66H2oTUo&=KMgEf5uEFlJ#DW|nN^ab*h( zbYGz4#(2!Z&2fR5TN@W6TjGSeZ+;UdI=EeBS;4BkaEpnLf?%F$3mZdPG$&vAEoVQV zEvhB15hW>!C8<`)MX5lF!N|bSSl7T<*U&h`$jHjX(#p_W*TB@uz#!X~pAAJrZhlH; zS|wD2p{}86h>&YL&ys0gagbh z2N_NX7=^JYr3kvEGaeIQ6gV8%5Xf>yKqw)E#Yp0)5Uaxs#|V}c$BtZ_;OKENqTynM zhv1Uv2Ej%0;tULjlh_tB_cjLu%~UOMjVMV;EJ?LWE=mPb3`Pcq#<~W^x`xIfMn+a9 zmR5%5x(23J1_s%_{A?&1a`RI%(<-4F40R1nLyU}ps;vx7bq&mb8o0!jWq=x_KsE&D srFVdQ&MBb@05M^FiU0rr literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/steel_bucket_fill.png b/libs/textures/items/base/steel_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb665cd037780a705f19ec2a024a55b279e6983 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq2P3o>7;+sp5MXiV&{@O3 zqEPX}^_bgJr5jf@RMk4wU(~;|>yxlvu0h}Agdi59r-i$>SAY1tV(~+p^GQ7mbE6q% zEjuW2*rM;%6@_COx3?|add#x@yIezRWW@EU``&N7X2jE6HA`WsO8=p~p64R>u3-r9 zni!>h&XU22zws`JDEj0j8$thg42MmWbkzL Kb6Mw<&;$T|LSwoB literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/steel_chest.png b/libs/textures/items/base/steel_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..b9bddf794556dad27d26fa07af80162144c41c40 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(}B8yOd#Hrey0n_O7wJb4B@z*+Ix}nfC7(; zzVwqGS%-zpEHMtRm~?mi*XsSY`JqDphdze?f?7%wLPE0wZ%Ak*TlDC3mVB7A^L#tQ zO}%4$n%@H!J$tr{+vz*+**~`?oZPo?#&TAR6Tg425^5Jekjcd^qVSIcXqjq>YeY#( zVo9o1a#1RfVlXl=G}bjR)-^N^F*33;v9vNY*EKM;GBC*Y9nN|taV5nK QLZB)JPgg&ebxsLQ0LGAxI{*Lx literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/steel_dust.png b/libs/textures/items/base/steel_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..f08d7d2bb4195a6676f369e4feeec3d223efceee GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GRvUY{0)G<1*r9<>X}5T-nwjvFMc7sszDf0jk#%Hkci}5a8J1 z*whrE%fj$dfkU$B@C=aYswJ)wB`Jv|saDBFsX&Us$iUE8*T7iU&^W}%$jZdh%FtZb zz|_jXAlsLp4Mjt4eoAIqB~*i)f literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/steel_helmet.png b/libs/textures/items/base/steel_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..fab66dfab078ffda59be0b7937835dac78b7391a GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!Y-EB@fyhC%y)Au2GRvU ze1JjfQx4D>44efXkw8Jd10c+pb*+;VBv@A9m=4qpWCHP~^gCTZmba&iV+hCfhx%nxXX_Zh7hPsBPAx6eP)mDb4x&~%I4P4^NGC&Pd wARB`7(@M${i&7Z^5;OBk^!!{y6v~YCO!W*6489aC1gc{2boFyt=akR{0Mr_Lg8%>k literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/steel_hoe.png b/libs/textures/items/base/steel_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..1f4a7b37198488678888ce20ad859f4bcfffaa69 GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFt2W4N@Q*g7ec#$`gxH83GbB^GfvmTtgJfjP*?Q W3=Isv6fFd*V(@hJb6Mw<&;$Vb0fWK- literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/steel_ingot.png b/libs/textures/items/base/steel_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2f881d0a8acdda653c7204d0215f2d83f5d335 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFr(-h;di20YAn zd0$=PahSQFg>}LqhN&n1t!`lQ|M0wIzVQcJJC7X8EhclF#jlzw-|(E`IrVDUlzW+F zJU-E;#qtw2-%D{T`Y7lq_-y;{&()0A4sz`?k1w4Kv_ZARHKHUXu_Vlzw|7#UfaSXvpH>l&C^85m^y^0T36$jwj5Osj-yFw`|P4KXqXsmdKI;Vst E06}nwF8}}l literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/steel_legs.png b/libs/textures/items/base/steel_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec375123eefeebf60ac1dc238f0493afd0b4770 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!Y-EB@fyhC%y)Au2GRvU z{D7gq%;Pagu)re{D9CpJgc-B0b#j6P%L*LRfx3ZAAl{UIrwho6_H=O!;kcfhaDb(! z$w7f3g+p>zTZa~tWRpUhf`?1Mkw5{RNiQ^%*u(?{6G~XR8zd40T^ZdJCv>cs#gH7N z(6LbIzzY!$GszWvDVsbx7#6Qq_L#na;eu7mU54^7jz7|Zk^DewR7+eVN>UO_QmvAU zQh^kMk%6JHu7Rc?jk(G(1m7%$=fvJ^&LAEbH8;XY9{FKbJN~i`yT|?6lBV(Xy zD??LV12dooE^%cUpav(;F$B_$ml9iC>Q8Gdpaa@?Ki>i_@$-;h}YvVpNA$S;_|;n|He5GTpo z-G%qtmc*|>4rjibTQQI>0ONn=hkk+t3p^r$f_w)+m@(^GCnrd-tiUlHs2j)x;!Wvy zx`3=;PZ!4!j_b(@4h)V82?8ue5>tI*ScMllxiJYu7AA5uZ`^1gaOOdeKnaU+T5bx9 zv4y{}fm9Q#nSp_p6N>`RK~4px6O6A@QW9Ebv5GPnvM8D`@G5fkWXgC%0gYEJag8WR zNi0dVN-jzTQVd20hQ_)E#=3^aAx1`4CYDx)=DG%^Rt5&yzWi(`8glbfGSe!d8Vq#} zO+$=~fvT+xO?3^-fEu{Om1Te$q(C+V=ckpFCl;kL1SDqWmFW4ohA5O7>zV2q8W?;j RS_o9d;OXk;vd$@?2>@?|fKLDb literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/steel_shovel.png b/libs/textures/items/base/steel_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..db1de8d8980354a8b07c437261862204de0c98b6 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY1W;^K1hx{4?=EjlD1=L8)&*}iEBhjN@7W>RdP`( zkYX@0Ff`URFxE9R4ly#aGO@HWG}kpSwK6cs_T^_o(U6;;l9^Ts)nKS=Xc}T<3{-7p zXsT;q2GqbMt}Fx8AO*4^I6tkVJh3R1As{g`uSCz!HAJDzSkF|?(7@nJ(L$gq22WQ% Jmvv4FO#r1Bf4l$y literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/steel_sword.png b/libs/textures/items/base/steel_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..2101f0a574c114ee9f59671fc94f2e0d2dab9889 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFOwL|Nkx5p4tJ`F_r}R1v5B2yO9RsBze2LaLZpm zasbHT%y)Au2GRvUJb__>r=ciFu)re{D9CpJgc-B0b#j6P%L*LRfx3ZAAl{UIrwhn( z^K@|x;kcfhz`*F{=*Y(5EO{tF#Hgf&tApc#sDKENw&HRM;gHhea_|vunsq8HgGun@ z3J46=Rs*-$j(=BH$)RYElw>KdAc7#RaqTN#?_8khk!aEU9+ z05wQ~YzWRzD=AMbN@WO0%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}X|#DQ literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/tin_bucket_fill.png b/libs/textures/items/base/tin_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..92d05e9d2063c0be19ddff68c564d7458b8f3ec7 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq2P3j+; zj~SfbT$MSYcv|l55BG$f5+v9dqO#Y#_PSnb@m%6~psjC!*F^V+_f(cH@zZ9w5|tV$ z=ET9^b9srL?doegTe~ HDWM4fN{3!& literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/tin_dust.png b/libs/textures/items/base/tin_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6b54762c0e9a3016d2df35ca8db406f87c7904 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFCY`dD4 zfdmUYB7uT@2SAuH>slu#NU*HHF&(HI$OPg|>36z-EO$>A#}JO|$q5IzC0G~mD7vm_ zn8@Mc;o*5yP-nrCB}zO(LSaQlg^Zk>mW)dscmz{bMK^FP?w-_P95H)Acelb31xLp< zVoVH^KC-R+$Ed;&G*Y$1HKHUXu_Vlzw|7#UfaSXvpH>l&C^ z85m^y^0T36$jwj5Osj-yFw`|P4KXqXsmdKI;Vst0ETvVRsaA1 literal 0 HcmV?d00001 diff --git a/libs/textures/items/base/tin_ingot.png b/libs/textures/items/base/tin_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9c4cb716d3afa948a22e173adc04149e2e1535 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFAY4r|B+v z*~?*fj=#9D`OXprURm3wRa3VA{#?y?U4v`C$|Nt44XP!s5hW>!C8<`)MX5lF!N|bS zSl7T<*U&h`$jHjX(#p_W*TB@uz#!X~pAAJrZhlH;S|wD2p{}86h>W;Zl+Q ziU7qjPczZZboC5BISo1P|NsAsPy28ZsDiO1$S;_|;n|He5GTpo-G%ex&82UE9L{_< zw_+d-0s#yO6JO5)GB^u7B7uT@he4R}c>anMkYHJXV>(bbkO{<_((iNuS(%^~)LNGqO_} z&P>1OS>W?g*)nk5+fAH#S_cnZ(VA^hH{-BmP5!iK3%%wKcR#<=P-vHDi+J_kw`%jh z(}tW6qPq^20WDQ6ag8WRNi0dVN-jzTQVd20hQ_)E#=3@PAqECkMrKw9mbwO}Rt5&5 zyq>>NH00)|WTsVuG#Kd`8tNLDgcunDRa+UE>ly&H8GN6cwF{_03S>iYep*R+Vo@qX kKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr0Nm7+{Qv*} literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/desichalkos_boots.png b/libs/textures/items/ender/desichalkos_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..afb76d1261a13b5d79ee141229af967b7cefc25e GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFW;ZlHN z*-5W6cYE#^>96?z|Nnu?Cxt*c#*!evUYcCo~c*FX+uzMESykOqMd z4CkhWgE*W89+5zr?=T269?xHq0un4Ma7+j41~P$oQ~I4QAS=Yv#W95AdTGyT&I1NK z&To1DG~T=Gv*67H$EuV6ltY$Xh(2O0#-BXVUe7P$Q1^x>OoyB4x(23J1_q+Mp1)BvKd4Y7#RXpTN#<_ z8UVE!e4m@O3#dT~WJ7R%T1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvfK$u6{1- HoD!MO>_ z%)r1c48n{Iv*t(u1=&kHeO=k_F>?xws4i{#GY=?aiE4iEtW;Zl+Q ziU7s3lU`@;_T2yf|9>Fc^!GqH#*!evUYcCo~c*FX+uzMESykOqMZ z4ADZx7l91U0*^?bAm3pSW;~w1A_XK^R^XTp)D2_;@uu`UT|id0r;B3<$92`dgMuvv zJj_q|Hg!JCe1O#5JNMC9x#cD!C{XNHG{07#iyu80#9Eg%}uE8JSrbSn3*>S{WFK@_PP8 z(U6;;l9^Ts(qN=(XsByo5@KWsRBdHsu4@3)X7GJ()-Iq1DUc1p`DrEPiAAXl0g0J; hC3=3YAqr*2dZv1Y1_ob>76MfM1MG8o;tiUlHs2j)x;!Wvyx_~SXPZ!4!j_b(@2e>6z7w{;$ zu4tI3?c(9#X)2(zV9AnKJVHWYTt>XCoSdwhE87|*7M=21l^}R5K=pdU2D5_~0vtOW zo0=kYSr}d_a7Y#%o&hplwZt`|BqgyV)hf9t6-Y4{85kPt8W`&unuQn`SQ(jF8CdEX zm|7Vai1K>=M$wR)pOTqY3DRJsYiOuzU=m_v2vlulWUgxf)MoH~Zq_cK1}TsY!TD(= q<%vb93;~Imc_n&&t|1C##(JiDh6V;-iWUM@F?hQAxvXYcCo~c*FX+uzMESykOqMR z41yOD8-NVX0*^?bAm3pSW;~w1A_XK^R^XTp)D2_;@uu`UT|icfr;B3<$931<-GT=c zc%0wz3NU_G5mu2lVB+1&{ViV6sC?&&5ANUngnmw)q$SRNz@4SamUGLgi=Xahei63d zc8OlC{5&BiM18Srp2ou+AGs=ap5?tABUf;6RzhD&K<@O+u2uf}FAi|ml~3^T2HK}u z;u=wsl30>zm0Xkxq!^4042^XSjCBpoLJSP7jLfVIEOiY`tqcrAc|CulXvob^$xN#R zX)w|?G}JXP2{AGRsh ZJyShH1A{L`3xTQ_JYD@<);T3K0RSGvuDO49)_NNT49!VGw3Kp1&dmBv@A9m=4qpWCHP~^gCTZR-C7cV+hA} z-R{$z4Gsd%lbgSv?Bne)+i?3}lW9b^yLY(~8&iJ`gAv23J4;TiP3YUZTH54FtpBSu zoI4czON7qs`yCo7)!-d+cjKLm=OrHsLK*YlGkv-ID=q95``@$N8=^T@u<%Z+1KOlo z;u=wsl30>zm0Xkxq!^4042^XSjCBpoLJSP7jLfVIEOiY`tqcrAc|CulXvob^$xN#R zX)w|?G}JXP2{AGRsh ZJyShH1A{L`3xTQ_JYD@<);T3K0RTlUkpBPx literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/desichalkos_ingot.png b/libs/textures/items/ender/desichalkos_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..62397e5aa184be89216299ffccc8f0ddd97387d3 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFW;Zl+Q ziU7qjd#Skp|Nnmt+A|p_!B`UH7tG-B>_!@hljQC0!j_n}qZY{F%y)Au2GStlz@QcU z^E8mbS>O=~6y!S$!i>lBSEPUh%L*LRfx3ZAAl{UIrwhmm^K@|x;kaJfdyu!mfQR`m z@2g8Z4l@_DuueF{F!jX0)eTJkAD)-YH~wI2=aFN%#bmCt_*GNo8=g}t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^ HP6W;ZlHN zS&{yVlU`@;_T2yf|36<%lP*w>u_VYZn8D%MjWiG^$=lt9T`aNVHIT!Z@8(tvq(R^T zLraLO5|F`J;1LNFg4r0#j!TCxc)YhYzm^14Etw$I{~Ds}F#NtCqM%l%ynb%NhN(3_=QcOar*jPnlQTWOpy}Hj@U2$$=8BqC+>dVuksRXRqMR zmd;RqpFKNer__=1Kl=)1?mblGe6gT*#!YkcYoC1#T+Sc3dzI5Z;qP;CjzyfmHm{p? z5NMlfiEBhjN@7W>RdP`(kYX@0Ff`URFxE9R3o$UTGBUF=u+%j$wK6ae<@NlHq9Hdw zB{QuOq`^qn&`{UFB*e%NsM^ZNT-N}o&EWgotX)72QXm_G^V3So6N^$A0unRxO7#3( dLlnx4^-T2)4Gg{%Ed;7!@O1TaS?83{1OSQ#kIDc5 literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/desichalkos_shovel.png b/libs/textures/items/ender/desichalkos_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..c11599e31837e864b92f120a0f3473256002cea0 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFW;Zl+Q ziU7qjPczXBKRFFK?#^`e|NsBrU%JH36z-tT;~>#}JO| zx;+~O8w_}u-!|Q2(w|`9c!(vgDVaHHTSD$43DHmU&rRy+IK;5RdP`(kYX@0Ff`URFxE9R3o$UTGBUF=u+%j$wK6ae<@NlHq9HdwB{QuO zq`^qn&`{UFB*e%NsM^ZNT-N}o&EWgotX)72QXm_G^V3So6N^$A0unRxO7#3(Llnx4 Z^-T2)4Gg{%Ed;7!@O1TaS?83{1OR2ckdXiY literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/desichalkos_sword.png b/libs/textures/items/ender/desichalkos_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..2686584d7fc120f62deab925116352184aa7991b GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFyB4x(23J1_q+Mp1)BvKd4Y7#RXpTN#<_8UVE!e4m@O3#dT~WJ7R%T1k0gQ7S_~VrE{6o}X)oLYc9i Xsh**M!Iz?iKvfK$u6{1-oD!MB zYF_gePczZZbaf3m?hHS<|Ns9lTkt_0sDiO1$S;_|;n|He5GTpo-G%ex&82UE9L{_< zw_+d-0s#yO6JO5)GB^u7B7uT@he4R}c>anMkYHJXV>(bbkO{<_((iNuSt*__jv*Y^ zRl7F|HaiF~FKzhq#hsZy@4?FkH3=()t*Z-e+wB$h+`O5IL2E_U7O|VW=W;WyMBH8{ z$M(A-Q|i*htt!_x@$}t!_V-tcd8FKyt#Lc-if+ zLvDUbW?CgkgORSGp{{{Rh>;;sHBhOp0Z^MkfqbwhP=gf6hT#0PlJdl&REB`W%)Amk fKi3e2GGjecJwpS7FGUN1su(<7{an^LB{Ts5I(3xq literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/eximite_boots.png b/libs/textures/items/ender/eximite_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..c4d0290ba742ba1c0c0d50069bc5cf7f981e75f0 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFYcCo~c*FX+uzMESykOqMd z4CkhWgE*W89+5zr?=T269?xHq0un4Ma7+j41~P$oQ~I4QAS=+*#W95AdUC=67ABq^ z2bL6$CdLVhDT_E<6eb2ZDli#Iu(CFAxUA+fU}KEzX>{sx>RRN`7O;R}@rp$Z%@PyX zMSN2PyuEouScL*UA5eS5#9*n%vGjV4^KGEvswJ)wB`Jv|saDBFsX&Us$iUE8*T7iU z&@9Bjz{<$X%D__Bz|_jXK$O?>H;RVb{FKbJN{|L4T|+}%1CtOVL!fG)Qe6X}HiH8B zU{9b1DUc1p`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76MfB zYF_h}yFK?$dY$?I|Nl1myaJ#cV@Z%-FoVOh8)+a;lDE4HyI5k!YaoX+-_5NUNQ1xy zhG?PUi$Dfvfkz}zknb=EGak=hkpdDdD{xE)>IO1_cvJeFE+8w_)5S4_cFVxu#PmJbIC0-ufi(b4hEd`et^E zNnadA^6#H|plfG8oAa5goZo_@D|T0TC^w%jsEFCVxbjT&u2s|j@*im7;*?LYwFg?L zTH+c}l9E`GYL#4+3Zxi}3=EBR4UBaS%|Z+etc=X83@mjGOsxzIM0q`bqiD#@PsvQH z1ZgnRH8j*UFbOd-1gZuq)inTWGboS`_5^B>0@)CppH@mdKI;Vst0QE+X<^TWy literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/eximite_dust.png b/libs/textures/items/ender/eximite_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..37c0678063054f11943f023d92633f4e6b0e26f9 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GSs4z`&Z* zU<+h$7I;Jg1^EtxFyrz36)7OWvI56+pl%=&h&QF*0U7M!>Eal|aXmTV0Jj9|0v<)z z6%7-$T|7KIO$BroELrl3M@T4)%ZQhilap0*Wm|*9qElY05(JM0s9sOlV0Q3AfMbVa zQ&WU43&TqV4#}d!GeD-RmbgZgq$HN4S|t~y0x1R~14Cn717lr7vk(IVDnC}Q!>*kK^ly74Gnb-OhSwdfvSN@bq#>p3<~6fJ%JjeKsE&DrFVdQ&MBb@020Y~Pyhe` literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/eximite_helmet.png b/libs/textures/items/ender/eximite_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..6edad7c62b108aaa7215dbce87424f009221d063 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFB zYF_h}lU`@;_T2yf|G!|7KqgR*u_VYZn8D%MjWiG^$=lt9T`aNVHIT!Z@8(tvq(R^S zgW!e41|Wm8z#|eU$affo8IR|$NC63!6*#5?bpx3|yea)o7myX^>Eal|aXmR9At5C} zAc29A(LmaRgTuh6sYOCmw6(>7M=>!u+1XXW*(Kt}g$sfzsvIl{nipL*I=H3?3MM)_ znwT~vu53~;ZE{d#bleci)FW{E0t3T;O|~1p;j4LoHmH`kMwFx^mZVxG7o`Fz1|tJQ zV_gGdT|=`F0|P4~Gb;m2T?11q0|QZB&)+B-a`RI%(<(t4jC2hRbq!2Hj0}OQfl74^ zfZ7ZSRw literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/eximite_hoe.png b/libs/textures/items/ender/eximite_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..25553964f29c8542c20c15813f0ef1eddd843e05 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFB zYF_gePczXBKe^6ybqzW0|NsB9eCzrKRKZvh36z-tVmB6#}JO| zy4?o_8yq;84! zC8<`)MX5lF!N|bSSl7T<*U&7)z`)AL%*w!0*TB@uz(ADO^EZly-29Zxv`UZ$BV9v7 zT?3O4BSWBSpi*4}pf-a7`Cw0=1}TsY!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;- SiWUM@F?hQAxvXy zv{cV3Z?mZX|NqMx)lLLTFqQ=Q1v5B2yO9RsBze2LuqCGLs0DI3^WEHvfiws>FlYt; zJPl-U7I;Jg1^EtxFyrz36)7OWvI56+pl%=&h&QF*=>oFCJY5_^IIfrW9^`E>;96~Og-^$bpw!C8<`)MX5lF!N|bS zSl7T<*U&7)z`)AL%*w!0*TB@uz(ADO^EZly-29Zxv`UZ$BV9v7T?3O4BSWBSpi*4} zpf-a7`Cw0=1}TsY!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;-iWUM@F?hQAxvXt<1 z6_|`#SXy~mMH_kCL@zq1GfwD8UNnOv!X@xbAcu<5q8S=$PdFwO2_}>OAQ-{Ia)3>X%aMmij6q36aDpCVi!#IPWR8b-d9I%T+M-(G8c~vxSdwa$T$Bo= z7>o=Ijdcx-bq&oz3=FJ{%&ZJ7bq!3d3=BkhJ%6KU$jwj5OsfQGFw!+N)HN^(F){?I z1}fDx0BSQRkPr3*YLEii5S*V@Ql40p$`Fv4nOCCc=Nh6=W~^tbXJ}yXrD!2g6@#a% KpUXO@geCxx(R-i( literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/eximite_pick.png b/libs/textures/items/ender/eximite_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc8a2324b5c2ac484c0d9e37bcda4e79f776750 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*hPczXBKRFFK?#^`e|NsAMdPUy^s$eV$@(X5gcy=QV#7XjYcj5eabLkr(hcn;J ztr$pyKmo&7(eoBS24{gsBv6p=FbFdq&tH)O5-cllOb6-)GJ$wg`kgKyE6&r!F@)o~ zZtp?f0|p$-XBXG|sGZDZ|35eO4;I*lob88O>DG16ccoo`OmtkrVBPtS;oja z%`ZYhSCs2)>HlA04Tgb2>spx~i>A4WJ$cF18M8&>#d5J@@++R#P1(zF%;dure~UGO*M&Ftsu;5asp!jiMnpKP5A*5~RUM*U(Vc zz$C=T5U3icRM!Bg&7eR&*b}Hh3S>iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xe Qg+Nsdp00i_>zopr0EGdJ00000 literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/eximite_sword.png b/libs/textures/items/ender/eximite_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..889ef2c021094e9342e39f3111a8e5ed154d7917 GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF36z-tQb!h#}JO| zx;+PZ4;XMTKfGw~r}QpPiE_P-Dj z>g32Bua92BN&4zfm;g=BH$)Rf04a z=^7g98kmF_83I)UmFgM*wHXx12YUiFNP%n!&QB{TPb^Ah2uRG#E79|F4N)jF)-%;J VG%)y5v=FF@!PC{xWt~$(695g8j2i#| literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/meutoite_bucket_fill.png b/libs/textures/items/ender/meutoite_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..cb683276ca85c89672edc7a4e94a1ce4fc2e2853 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=3Cyo?)Kxso@3jF^TCZ znVG4%xtRq;d8KvL4J{4r9W6bce*PPP>KIFc{DK)Ap4~_Tagw~FdgVkC~faT&n$#z<;2Sk*AAe2*>s0gahmm+E(HX8D{RO z$}4#lrfr(IQOV_80Oz_h0#2L;8V6ih40?nT6oAe@oWasHF|Yj>P&b38tDnm{r-UW| DI7U0} literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/meutoite_dust.png b/libs/textures/items/ender/meutoite_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..e886d6b41d48eadb42c838c17936b1ab1c6183b2 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-KpNy80|vHT zP0K)n1s;(=LB7Kv%y>M1MG8o;tiUlHs2j)x;!Wvyx_~SXPZ!4!j_b(@2e>6z7w{;$ zu4tI3?c(9#X)2(zV9AnKJVHWYTt>XCoSdwhE87|*7M=21l^}R5K=pdU2D5_~0vtOW zo0=kYSr}d_a7Y#%o&hplwZt`|BqgyV)hf9t6-Y4{85kPt8W`&unuQn`SQ(jF8CdEX zm|7Vai1K>=M$wR)pOTqY3DRJsYiOuzU=m_v2viMJs%rq$W>6p>>KLZB)JPgg&ebxsLQ0OKNc_W%F@ literal 0 HcmV?d00001 diff --git a/libs/textures/items/ender/meutoite_ingot.png b/libs/textures/items/ender/meutoite_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..cbdede756c0df4adfff16fd5e70b9ffe48095178 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF1OL^tYh*2|Nmm4PhLO?#*!evUYw#2j@wLlJMzMESykOsNOfkCtN zcK}GRz#|eU$affo8IR|$NC63!6*#5?bpx3|yea)o7myX^>Eal|alN$nAa8>K5A$8# zSC@DkW-e%9op6X@>WP1=8<_k*JTIAV{K3}FBgb-!$y{ggtES2~Jg0b0y;?TqUS=7O zPqb;V{DjT-QrwC@3OWit+y47=HRH8|T>H%9OJ@UZP%UwdC`m~yNwrEYN(E93Mh1q) zx(3F&hGroK23AI9RtA>32Bua92BN&4zfm;g=BH$)Rf04a=^7g98kmF_83I)UmFgM* zwHXx12YUiFNP%n!&QB{TPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FF@!PC{xWt~$( F69C+zh9&?2 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/adamantine_axe.png b/libs/textures/items/fantasy/adamantine_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..2dec357b50cd59085aebc70b73065b1a51fd72f0 GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0r$H@54*?B!9 zV=5z~BO{}ynP`TeoQ52CXS(|T|Nn)*o_+{a#8?vK7tG-B>_!@hljQC0!j*C1OBj&D zneXOS45TjraR5Wn`tMsof(0ItKtaBPAk4U9V)k2*U|E4wi+O_T)mJm3oB1{} z8u?sXyhiQG98t9ku9}QDc5b+;|81f5w`IrED=THU{BCS{oP51uMP2PV4!iehk3hau zEpd$~Nl7e8wMs5Z1yT$~28PDE20&yHVrXn-Y-VL@u4`asWnd7=@n;W;hTQy=%(O~0 z4JJlb22c$SssHB!HAsPM2+mI{DNig)We7;j%q!9Ja}7}_GuAWJGc+*xQnV1Liow&> K&t;ucLK6Tv+>q-4 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/adamantine_boots.png b/libs/textures/items/fantasy/adamantine_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..49fa71d232069e01c864e0fb3300656f6805ae3c GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFIO1_cvJeFE+8w+)5S4_<9ccLLEZxf z9L#6gW-RzKahJmqJqK%N_7nfSr#!hkPe<{##199?$mxz!r{^5cxE^b09(r=|Qm&RL zr87k){S7Irc4*)6RW-W!eATa**H!m^+sEkyaBv-plI;fCpjzS@QIe8al4_M)lnSI6 zj0_Bobq#>XBE-o5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKyE7Q}(F@)o~Ywt#0W*AT}j(y_RIaQK4 z1!$>iiEBhjN@7W>RdP`(kYX@0Ff`UR03wSJLt`srGb>YbT>~>K1A|D8KYLI#FE#@u7)yfuf*Bm1-ADs*lDyqr*b>ur)B-u2`EG8-K>7j@8!(6m z%@G0#7I;Jg1^EtwFyoGi*>6FDWd)AuK;1wl5N}Gq(*)G<1*r9<>X}5T-nwjvFMc7sszDf0jk#%Hkci}5a8J1 z*whrE%fj$dfkU$B@C=aYswJ)wB`Jv|saDBFsX&Us$iUE8*8qqtLJW$^fdtA@%=Upav literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/adamantine_helmet.png b/libs/textures/items/fantasy/adamantine_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..6a7ee8e05b059d61f49f31f86f7e52a6f29f8993 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF4jfG9 z`Hmc6s)=y$^5DExZ)iEEy6xdsgALdE4el8!usx`9NHPB)#Cd9AkIV{L&n@AzCbdk| zS?QPVzGLy`>z3UD4(HwHgeN{`eksb{^t8t)257!&iEBhjN@7W>RdP`(kYX@0Ff`UR z03wSJLt`srGb>YbT>~>K1A|D8KYLI#KfUG!A z7sn8e>$=?=c^eFPSpI8ANsDxv2`=hC!sHgIaNB@ebg__S+2hMM*;lMe;PKX!3`xj- z8+I#TYn&}Fv!JckAKyv78}_ZbtW|RK@{4B^DmKnbqYJ^Km7PRT<5# zg+QBBOI#yLQW8s2t&)pUffR$0fuXUk0T5Y)7#dp{n^~Ef>l&C@85l%z{Mmz|AvZrI zGp!O$gNc!q0aSxS>i@Yw4N@Q*g7ec#$`gxH83GbB^GfvmTtgJfjP*?Q3=Isv6fFd* OV(@hJb6Mw<&;$VXW{YJ2 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/adamantine_ingot.png b/libs/textures/items/fantasy/adamantine_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..60e19cfff7e056fa4342e726fc2ff06feacd1b0d GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFo=I zjdcxx$Rfnh*vi<<%G6xfz|6|PAd=(H9uy6^`6-!cm1r7FjI0cx8XQvp&jo6b0@)Cp spH@mdKI;Vst0N1^VUjP6A literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/adamantine_legs.png b/libs/textures/items/fantasy/adamantine_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..590e2b0c731541d9ac76565b3d7822fd219a9275 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8<*YJnWid^fjZAbkOdA23YI zisS_e7I;Jg1^EtwFyoGi*>6FDWd)AuK;1wl5N}Gq(*pgVjuU-F#QR)QywkPZ7Z~)C$Epd$~Nl7e8wMs5Z1yT$~28PDE z20&yHVrXn-Y-VL@u4`asWnd7=@n;W;hTQy=%(O~04JJlb22c$SssHB!HAsPM2+mI{ qDNig)We7;j%q!9Ja}7}_GuAWJGc+*xQnV1Liow&>&t;ucLK6T*BZ+kY literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/adamantine_pick.png b/libs/textures/items/fantasy/adamantine_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..742cd75bafb33712eb2d73ab7da0be305b91aa09 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFz$k`gO zcHtA-PUgtd5r(TvB2KT_lqRoyXX5h1R~7EH9Dl~;mYJsi;Ntmj^Wxe$=2@*R^stYb z%_&m6=JX$+ZK@@%5hW>!C8<`)MX5lF!N|bSSl0lEEJ6&8t&GjAOwDx-%&ZIyB02u- zLD7(#pOTqYiKfBC$jSh!!6EhkT%ZOikPX54X(i=}MX3w{iJ5sNdVa1U3T4K6rh0}3 U249L60#z}1y85}Sb4q9e0C1p?F8}}l literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/adamantine_shovel.png b/libs/textures/items/fantasy/adamantine_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..69f7281d143e964dc4c0d9d3935fc1a0222bb354 GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0r$H@54*?B!9 zV=5z~rn z%y)Au2GSRRxPjsGbfZ-u!2*v+pdjBt5N6ylG5ak@u&lr_9jF_~1maEUce;SASWg$n z5RU7o#lrslc^W>y9UksN>aplHa=PsvQH zMAKkmWMu%=;E?)%E>MFM$cEtjw370~qEv=}#LT=BJwMkFg)(D3Q$0figD*u3fvOlh MUHx3vIVCg!08E>YDgXcg literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/adamantine_sword.png b/libs/textures/items/fantasy/adamantine_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..6b33254dc29f2646858827dc40027065ddcf5b8d GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0r$H@54*?B!9 zV=5z~BO{}ynP_Lax`rHghM(O3|Nl)T*6jx>Vk`;r3ubV5b|VeMN%D4g;mWx1B@D>n z%y)Au2GSRRcml)DP=((h!2*v+pdjBt5N6ylG5ak@u&lr_9jF_~1maEUce;SAKu;IP z5RU7~2@H&Gj*bRr6;g6I1OwW-I3&9{99Vf0nGysiFf3*WP!DMc6jWlERM7fD(4-`V z#rTGcLL282bE_uFCSw<-gFJ}`0~k9vuGld!7IJ9ai9G2HG+edBHKHUXu_VKLZB)JPgg&ebxsLQ0Dv-kX#fBK literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/astral_silver_axe.png b/libs/textures/items/fantasy/astral_silver_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..8b89d985e65b4624f466da7f15dfaeb6370640fb GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF}B+2s7@OnEe(cSXSVe4%7`~0`aEwJ6%9lil>WX2*-8ZzKwzn z20YA9o9=lPeQD!V&^d6B=S#?zH}Q>gcT9Zub~6jZl0)ul+^(y%N({ogSZ@R+HW)|e zh+Ui7GUL?2!wOx8g6f+ey2br{`c>)Y*AIUb`HpR8Ey(X$bN36^4~Fjb9J{6O_I(4| zr&{6~QIe8al4_M)lnSI6j0_Bobq#>XBE-+666=m;PC858ias+PD$l%yn~Jp2r)FaGB&d^HPKPgsd?{K8RK?)w>gTe~DWM4fE~kSm literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/astral_silver_bucket_fill.png b/libs/textures/items/fantasy/astral_silver_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..59414de95ad3f0e4be6cb8167588eb134cdeef85 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqGdn+vMdi}?{~V)#`_tX=k)M2Z<-{;3zopr0HLvD6951J literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/astral_silver_chest.png b/libs/textures/items/fantasy/astral_silver_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..62c2fd49a064cefaac19461f19b557340de1f7d3 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP?WJG$S;_|;n|He5GTpo-G%i>{>$S)4rjibTQQIh0OAV_;d82i zmN9S^ctipP`3{0GU(yEe-Rc6&zh$SnRS%1%r1A6DJe{wV7t}NX>NIHxkPQ; zqgUFeHm{de-IQxMJzM{_Pp*t&d}Gtk^8M%K-(BH4;x=X551>V=C9V-ADTyViR>?)F zK#IZ0z|dIN0EjF?42`Xf&8$q#bq&m{3=ASU{_H`~kei>9nO2FW!NkbQ0II}B+2s7@OnEe(cSXSVe4%7`~0`aEwJ6%AQho_5U2*>s0gah0XtP6M) zT~{XBE-0-{r~?zZfZgvP?WJG$S;_|;n|He5GTpo-G%i>{>$S)4rjibTQQIh0OA7-vT>Q^ zAi)BUNT49!K@eu#F){lsNU*HHF&(HI$OPg|>36z-tZ+{k#}JO|sb>QP4;XMT2NYZo zVcj6Pz#`&rb<_*HvjDA7Epd$~Nl7e8wMs5Z1yT$~28PDE z20&yHVrXn-Y-VL@u4`asWnd7=@n;W;hTQy=%(O~04JJlb22c$SssHB!HAsPM2+mI{ qDNig)We7;j%q!9Ja}7}_GuAWJGc+*xQnV1Liow&>&t;ucLK6TrT#U5< literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/astral_silver_hoe.png b/libs/textures/items/fantasy/astral_silver_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..15b003b3adb2139e9cada65a6c4b021bc2337985 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFRdP`( zkYX@0Ff`UR03wSJLt`srGb>YbT>~>K1A|D8KYLI#*Kf@KAc=|J5;CJ=8*ztaU|g?YL-hHzXj?LElbV8FwC zm-p2r9*3C=T39C>Vwig3-|7Y?{}0bg<{N*owe!fa++s4Q-uO}Up@ z#^V!hS}Z?d^Su0-{r~?zZfZgvP?WJG$S;_|;n|He5GTpo-G%i>{>$S)4rjibTQQIh0OAJ>9k+b1 zf&>dZB7uT@2SJ!|$HeTnAi=T%$8?}>AQOl;rQhiSviv+<978y+=k{LYJYc}#GMRVJ z4c4Yuhq()W>xZ5X`gQqnBfo7ykN%1;Tedcr&8UjebvW(y^^Pi+egxmlW1p6Aum)`? zt~%)J^|6}i-g^JMoH!2G_QO^sK$BHVTq8 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/astral_silver_pick.png b/libs/textures/items/fantasy/astral_silver_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..af9357cd5eb9f6fd075344d5d86bbc7f00de92d8 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF^ZqZXgqgH>Ka{08(KGTPZ!HFw0^4OGh|1U<)vfg=Bw$8|p zEoKg1@8;Rd*h_YZAG!3BHH(i~wf*4+UF{3^GJYg~SbBlK-i{;c0>4)%&>qzi*NBpo z#FA923{2##Y8=R;K2<24+?U29X?p_Mm9U%}>cpt3=aaVq|3i z)!>l&e=bmi6v&3){Irtt#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K F0RYfokJ$hK literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/astral_silver_shovel.png b/libs/textures/items/fantasy/astral_silver_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..476231d0dd87cf14f770e8fc58aaaafc63d29ed1 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF>?wFYU79?0!;Fu274P*lGrt~{qKvsaKi(?4K_2dKw zMmI-C4&5b7I1)9awVhN#<{acnRCMHU4u}Z!WLV>N#6#drLP^U7oiZ#L(Ev*v!h*T-U(N%D^C!Mum)aBnDU}xc4-S!`7zG{hUL`h0wNvc(HQ7VvP zFfuSS)-?bkix5L&D`PV&Q*&JdGb;mwNRB^yP&DM`r(~v8qG>QOvNC{ba7g_>7pOrB vWJ7R%T1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvfK$u6{1-oD!ML2CJAt%SV&z+0$ z?%al=-iJa7J(?2?G+U>gzV@u?Gvn%p?PYnd*0UMizU;*oH0Aw||4eb`i#h9kx(;Lj z?NcprjVMV;EJ?LWE=mPb3`Pcq#<~VTWD#O$Y-Ma_WooW#U}j}t5Xtdp4~mA|{FKbJ zN;C~7Mpgz;4GyXQ=K?iIfourQPb(=;EJ|evNX*PD(erZ+Q7ALkGu1ORF!)lm5U7g5 M)78&qol`;+07JfyfB*mh literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/atlarus_boots.png b/libs/textures/items/fantasy/atlarus_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..bc81e52e2385cf8a67a7ac25ae034bb7a31b4bfc GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GS3J_yfa@ zOFkb#f(0ItKtaBPAk4U9V)k2*U|E4o=Ijdcxx$Rfnh*vi<<%G6xfz|6|PAd=(H9uy6^`6-!cm1r7FjI0cx8XQvp&jo6b w0@)CppH@mdKI;Vst0K3tSi2wiq literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/atlarus_bucket_fill.png b/libs/textures/items/fantasy/atlarus_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..82bfffde5788a3e838b1022c0d7f6f23b90f23ef GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Q-Dv1tEs7JU|?WqXlPDOPEk=& zWrzopr0M9#AU;qFB literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/atlarus_chest.png b/libs/textures/items/fantasy/atlarus_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..da256d13f98f0d9a684b7c2a9027ca25302cbe9e GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GS3J_yU7( zSVk~Nu)re{D9CpZgc)~C%zg_JEGuwK2kHhgfp}B;oh~3N*3-o?gyVW>-$C933Ovkn zc_&G+HSn(4#E{fvccXr)llqDp2w%hRXE@Kcr4H&)e_f;l9a@fRIB8o zR3OD*WMF8lYXC$RA%@0Q#%5Ng=DG%ERt5%<9DnwpXvob^$xN$6(_ms`WdPOSkotcv zP=gf6hT#0PlJdl&REB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7{an^LB{Ts5$_9$t literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/atlarus_dust.png b/libs/textures/items/fantasy/atlarus_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..e18e41d82f39dca9d49d97dfa7b00c8b09e23c01 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFzb=E}APiAATpRwW1?3sAkDu)*x$g#gD6 z$EKzTT^5Fy3LKI}hi8CHS1oakC`m~yNwrEYN(E93Mh1q)x&}aG5n^a;Wo%|;YOZTw zW@TUy$?<0oiiX_$l+3hBGz}(3Rt8WF4ypg=0yRj1YzWRzD=AMbN@WO0%*-p%^K%VR bC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}J9>H{ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/atlarus_helmet.png b/libs/textures/items/fantasy/atlarus_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..13b226f1cbdd85a8a1880db77f224bc05574dfcd GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFzm0Xkxq!^40 z42^XSfXE`m(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUiOpL4ypc))f|IY<#kOJ8d toS#-wo>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIDUXhLr#S literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/atlarus_hoe.png b/libs/textures/items/fantasy/atlarus_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..87faa0b7563719cea71cc16fdd2eb955bef45cad GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFKfUH!y7h z1sfbVSo#mldAz?-KG(rIVGCQaa`5l|nh&ZwWg{dQ6h#A#^!rk7^Xbl7>vn$SOy1QN z!Uxu>U3{s#VEvV?&r4RmNu19w!Igg^zvJ1da-LL`WBe72LCWmQXHV$|I)g#A#5JNM zC9x#cD!C{XNHG{07#iyu0FgzAp|O>*nU$%zu7R1Afk7n4pFJoVa`RI%(<;$4m>5|Z zKs7j|{+|ofAO*4^I6tkVJh3R1As{g`uSCz!HAJDzSkF|?(7@nJ(L$gq22WQ%mvv4F FO#r=XjKcr` literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/atlarus_ingot.png b/libs/textures/items/fantasy/atlarus_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1daa943235470de06c12c0c8451a465bbf940f GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GS3J*nz=D z{E;U}u)re{D9CpZgc)~C%zg_JEGuwK2kHhgfp}B;oh~3N%+tj&gyVW???K)M10LqP zyss|tILuto!aCs)!_*W1RyQ#De|TOp-}r;Aokx!47L&Qo;#WXBE-_!@hljQC0!j_n}qZY{F%y)Au2GS3}c#=Te z0w9C4z#|eU$afHg8Fx&~ehU&TD{xE)>IO1_cvJeFE+8w;)5S4_<9cY%LEZxf9L#6g z8g4UYs3}N)naHS>`aja^(~6Mp<1Z)ha=0vHh_O}S%JA`aP@4SZSLByxVQSW!3nh2+ zYcoss?0jV;nS40&TMmcleTS)kB;z96w{C9I*I(7baYM0N-5qF?YKdz^NlIc#s#S7P zDv)9@GB7mOH2@-u5JO`tV>2sLb6o>7D+7Z_jz4=)H00)|WTsW3X)rOeGJtAuNc}$- ys6h&3LvVgtNqJ&XDnmeGW?qS&pKFLhnX#U!o}q!km!gG0RScf4elF{r5}E-0fr&~0 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/atlarus_pick.png b/libs/textures/items/fantasy/atlarus_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d08535431861750b431b7fd1fdeddca0ce07d9 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM>?wFYU79?0!;Fu274P*lGrt~{qKvsgMi(?4KbyeTp zf(H~hYDK=;lrWy>e8iU0@nvPs=6cb9cMadI85StCG?eglF`KoWm-1SyZ7aKChNeq% zMXzM2X85~Li@vg)Z_k~|IXBE-R}#W95Ax@n&w zUxNb&%fb!m5A6y%<#)`HH@GMLW^K;j`lpOun!&(lS3tmV(`njK*zn9lLF`Th+3CHtbZ*yBImT(Ajfm1>D= zL`h0wNvc(HQ7VvPFfuSS)-?bkix5L&D`PV&Q*&JdGb;mwNRB^yP&DM`r(~v8qG>QO zvNC{ba7g_>7pOrBWJ7R%T1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvfK$u6{1- HoD!MavE~n|NsA2?a>BV##j>M7tG-B>_!@hljQC0!uj#$(lZ^x=1PeSOfr5MoL6~vJ#O${q!LkC!bf9h^6NopZ-{}IfLOfj@LpZMM zp79nu;K0EgP~h-Qxxtw=fPHQAy3VK-fA~^%9@xVpcrtLowk^gSjOsn=9LJxwT-CKV z`*P#Lv$lu2jtgoxh24$({b(KY`~$1bPT}<7u1mkbF|GKNXfn`z)e_f;l9a@fRIB8o zR3OD*WMF8lYXC$RA%@0Q#%5Ng=DG%ERt5%<9DnwpXvob^$xN$6(_ms`WdPOSkotcv zP=gf6hT#0PlJdl&REB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7{an^LB{Ts5KVOR% literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/black_steel_axe.png b/libs/textures/items/fantasy/black_steel_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..ab968cfce5dd907ecdff6bde03fc5fb70abb3e4b GIT binary patch literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFzOeH4A@3&ooan(F{L14LR=4boKxL|Ht(%137}RB*-tA!Qt7BG!Q4r+uem*{`!#v zKn`cVn_DrE2HL_9z>xC#jX6lLz#|eU$afHg8Fx&~ehU&TD{xE)>IO1_cvJeFE+8w- z)5S4_<9c!e5QvC~Brq^4s=B&4PH334kfB@A!y(e-h^c^%g4P-(1|fqKACo{vqaIe* zLvtK?4u>SVtFkLNH(YEv$hyLF!onn`8y1Y;{Ma~FG;tUhIk8H(vM%6pUcu$ILYN`x z7q^1n`FTfxHma7mMwFx^mZVxG7o`Fz1|tJQV_gFvvIsFWwlX%eGBwvVFtai+h~)UQ z2Sr0}eoAIqC7K2kBP#=_28Y!DbAcM9KsE&DrFVdQ&MBb@0KGefYXATM literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/black_steel_boots.png b/libs/textures/items/fantasy/black_steel_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..01611b9ee43d88562e67ac117dd6cf8bb4c4e07f GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(}B8yOd#Hrey0n_3iotz4B@z5+H;WifC3Nm zW8R#E#tWPp!XI9+-L0QC%kJ0fmvYNJ3Xia}z7CjPdd2R|KA%YTDXw=4J(e@CIHIsP zOVC%@YjXa#(FK2rC@H^hS@caL9W;aguC3Q)ka)4H-mbgZgq$HN4S|t~y0x1R~ z14Cn710b>pF*LR^HnTD{*EKM+GBAkb__GH^LvDUbW?Chh1`{JI1E>av)c+ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/black_steel_bucket_fill.png b/libs/textures/items/fantasy/black_steel_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..a505565a42fb12cd410fede38f8423a5eb2b3971 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Q-Dv1tEs7JU|?WqXlQy)aZXN7 zOnz%oQBi(rbwx!*QDs9(RbzI;^s2^=w(dz?6Q(!L*f?$4w23q3&zLb|#flX-Zru3) z|G!Os;ZmS!j3q&S!3+-1Zlr-YN#5=*3>~bp9zYIffk$L90|U1(2s1Lwnj--eWH0gb zb!ETD%+AlP$MuqJJy6KX)5S4F;&O6=g7Ajoj~_mKI=FMrnKgI*{JFEHrpZ81KwPD1 wN&Eb%v!xF!)TM|jn6(LoHT5N?E)Zj2_;-pi!$Zu?4`>R5r>mdKI;Vst0MTPteE=)}dCvmFu zdvO+~w92!V#x9?B*ly9Sn4jyo&hqYCbgtKI`X@WHpL)W+{pF*LR^HnTD{*EKM+GBAkb__GH^LvDUbW?Chh z1`{JI1E>av)c_H;1LNFEal|aXmTV0Jj9|0v<)z z6%7-$T|7KIO$BroELrl3M@T4)%ZQhilap0*Wm|*9qElY05(JM0s9sOlV0Q3AfMbVa zQ&WU43&TqV4#}d!GeD-RmbgZgq$HN4S|t~y0x1R~14Cn710b>pF*LR^HnTD{*EKM+ zGBAkb__GH^LvDUbW?Chh1`{JI1E>av)c%)=x&~%e1_qHFfA*kg$jwj5OshoGU}9ut0M+1-`hPA^ ygA~Yy;QX|b^2DN4hJeJ(yb?V>*ARs=V?9$nLj!{^MGJwd7(8A5T-G@yGywo5-Hm1d literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/black_steel_hoe.png b/libs/textures/items/fantasy/black_steel_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..6e7929932cfe7a05cf65ad092a7192398d5d36e4 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF}B+2s7@OnEe(cSXSVe4%7`~0`aEwJ6%9l zlBbJf2*>s0goFeE5s?H2MmJSe*ED7YXO|;}0URe1N>W4wir7wa7#OH&88b;bTupRp zN_gtj)YF%c+sLGpz^uh0anR_^Tpob{Q%0xF+nqBQHCHqwD1@|5V3?xFVK|wQVHO+5 z{3Tf&Alp<+Tq8_!@hljQC0!j_n}qZY{F%y)Au2GT%d85|h& zH2;BAa29w(0tNXFf-vKbiP>*Kf@KAc=|J5;CJ=8*ztaU|g?YL-hHzXj?LElbV8FwC zm-p2r9*3C=T39C>Vwig3-|7Y?{}0bg<{N*owe!fa++s4Q-uO}Up@ z#^V!hS}Z?d^Su_!@hljQC0!j_n}qZY{F%y)Au2GT%d86Ge+ z=sER+1PeSOfr5MoL6~vJ#O${q!LkC!bf9h^6NopZ-{}IfB0OCjLpZM6_T1(@puofY zk&UmPkxMv0?ZIMZh0_0#vsePX7n~?B;;4U86KFDBZiQ`Vl<_B-YaZIK&DdjAEKeON z`6AT6*j2y4a}?z3?e!H>_O3xo1c=IR*9y;#K_73s=*=k|6HI3DUc1p t`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76Mf@P5LX~AqiH#N%LPNv zG|R9`H4A@FGtmq`xz2QT4LR=r|Nj?D&v*b-#8?vK7tG-B>_!@hljQC0!j*C1OBj&D zneXOS45WcpFcdI+%s(*|Bv{}P2^8cz2*QjzCT70{36>Q&rUP{YnLxZL{Z1E z7{YNqIl+OcrzxOq0>k133=_mm1VscGjU+-@d|8=U4`{K>WpUtPV@niVQ51OC!A;<7 zm_`PN*r^!@6c%v^tzcQjG;^|DW8+1^6`dP}Js46YTpJfDNINVFSj~FCgh4`^!|v~s zlEpyFR7+eVN>UO_QmvAUQh^kMk%6JHt^p8PgcurI8Jk&|n(G>vSs55aa{SqYq9Hdw zB{QuOO@oP%l>tbP0l+XkKki3Nc literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/black_steel_shovel.png b/libs/textures/items/fantasy/black_steel_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..98a23b47f7389342270561a203dc845581245087 GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~AqiH#N%LPNv zG&Ku<%dkpMGttg;^$b5b4LR=r|Np-exN#Dwh_NKdFPOpM*^M+1C&}C0g)8I2moOlQ zGvCdv7)S%HU}#`?dRbEgBv{}P2^8cz2*QjzCT70{36>Q&rUP{YnLxZL{Z1E<72xUO z7{YNqIe~%E&C!vK!`V~NiCa?JDI+zV!};nFjx}xpff9>a979A736z8gHE?inG)d;P zG6^*HuylBB^WxA|U=$T7Nokm+$dGzKhJoS6b+!hd(hI;)U{Eb_jVMV;EJ?LWE=mPb z3`Pcq#<~VTWD#O$Y-Ma_WooW#U}j}t5Xtdp4~mA|{FKbJN;C~7Mpgz;4GyXQ=K?iI wfourQPb(=;EJ|evNX*PD(erZ+Q7ALkGu1ORF!)lm5U7g5)78&qol`;+00ew}9smFU literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/black_steel_sword.png b/libs/textures/items/fantasy/black_steel_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..ee64cc440ebfee6a140eeadeb92c0bea266d50c2 GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~AqiH#N%LU7@ zN;M0AL(eo%Gttg;^$b5b4LR=r|Nl?$-L?s+h_NKdFPOpM*^M+1C&}C0g)8I2moOlQ zGvCdv7)S%HV3@$LUeLM{Bv{}P2^8cz2*QjzCT70{36>Q&rUP{YnLxZL{Z1E<73b;V z7{YN~wdXYN0R@P5LY0b9I5#H!M2-c zds@qNHqN*5G!xD6lj}@Z*O24>|Ns93iTcSvMT{jue!&b5&u*lFI7!~_E?gNGzJvie zocV5U#Xvd%hyxfhQlA_EGB^u7B7uT@2SJ!|$HeTnAi=T%$8?}>AQOl;rQhiSvZ6d) z978y+>z>)j+hD-sawE%&AsoWd1oal3zu!p2il@q z;u=wsl30>zm0Xkxq!^4042^XSfXE`m(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUi zOpL4ypc))f|IY<#kOJ8doS#-wo>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X J%Q~loCIA)PkwX9g literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/carmot_boots.png b/libs/textures/items/fantasy/carmot_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..35e9c253f2530ee71e7bc2a59422010be9e22c39 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFubEcVYf0+Jkw}kCU+1SF9f?VdU z1?#_tG_T?LzI}cbV|_1&ZM#I7IM8U-64!{5l*E!$tK_0oAjM#0U}&ss07MochQ?OL zW>%)=x&~%e1_qHFfA*kg$jwj5OshoGU}9ut0M+1-`hPA^gA~Yy;QX|b^2DN4hJeJ( iyb?V>*ARs=V?9$nLj!{^MGJwd7(8A5T-G@yGywpwCWPbw literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/carmot_bucket_fill.png b/libs/textures/items/fantasy/carmot_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb75ca9ba0da9f589a345c0db0bb2d01f84fb12 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=2NDIjzkl9c`68T{RQ? z8fVY!S~@pp@q$Uqm(JL`wf)SI8C?6$M*-C_mIV0)GdMiEkp|)m+KR)6glBAQ5`NL4<)}@l~#p$U<#apmqjNS3j3^ HP671lx^rf%-dKMdXpw4(YeY#(Vo9o1 za#1RfVlXl=G}bi$B8w11V=H4bD^qh_12ZcFgGi1)dr&mw=BH$)RibGyF|sm%YH&#X zKNqM$3S>iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr0AO&F A`~Uy| literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/carmot_dust.png b/libs/textures/items/fantasy/carmot_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..5a4e3d4c3699b851144e1cbd4f3bcb43fb9d517d GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFjEA{ z*A)#DwOu?sJWU037A#rvibqH&jLV3Zm6MZIb7fnD#G+GPs}cl{1*l$6*kE?>LV#n3 zV^dRvE(^m;1rEug!!tmptCqM%l%yn~Jp2r)FaGB&d^HPKPgsd?{K8RK?)w>gTe~DWM4ftM7Z~ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/carmot_helmet.png b/libs/textures/items/fantasy/carmot_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..813056abba5dfc3437ac8527bdd35e3414e791b7 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0b9I5#H!M2-c zdp6FuYAx6CG!xD6lj}@Z*O24>|NsB&|7%wP6)~0s`2{mLJiCzw;v{*yyKrS(_!0)> zaOS(Y6$9x6Fy5|w$rvP9;1LNFEal| zaXmRfKtv>gf!R&fS;ITv<^)H9GeSmUCM_OXT8^r&JqvgO-Q5kkF9wEioDmR9V9`#} zPDx;qo@L0mXwq6CC*uxhRuguDwZt`|BqgyV)hf9t z6-Y4{85kPt8UT?+h@r8Sv6+>rxvqhkm4QJd$DchY8glbfGSe#2G?*A!89+5Sr2d}^ y)F1`2Aviy+q&%@Gl_4N8Gp|I?&oxA$%vjG<&(Of&OVL80Dh5wiKbLh*2~7Z-+<{mC literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/carmot_ingot.png b/libs/textures/items/fantasy/carmot_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..119085b5c19890f8d86db6a4773bcfcdca8a84f3 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*tB z@^2GCf(0ItKtaBPAk4U9V)k2*U|E43{2##Y8=R;K2<24+?U29X?p_Mm9U%}>cpt3=aaVq|3i)!>l&e=bmi6v&3) t{Irtt#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RXXBjLiT5 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/carmot_legs.png b/libs/textures/items/fantasy/carmot_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7b457d14e5619d5bce2564aba2e3d50e2384b8 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF}~5gI!z(yB2tGHZdOJWhklSnDcn~U64JhC9V-ADTyViR>?)FK#IZ0z|dIN0EjF? z42`Xf&8$q#bq&m{3=ASU{_H`~kei>9nO2FW!NkbQ0II@P5LY0b9I5#H!M2-c zdp6FuYAx6CG!xD6lj}@Z*O24>|NsB&|7%wP6)~0s`2{mLJiCzw;v{*yyKrS(_!0)> zaOS(Y6$9x6ATD6|`|v;#NU*>o5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKyE85e= zF@)o~ZjZH4g8_%j!i{OkGTCQ2&r~ql^sZgH{lvthz8VkC)(Hr<7MRSP8{}vju(79k z-pf1_-Rl$M|14UPXRNrb>ds5S4Q1vRH?@BF7q7f|8()D~WikCxF(d zmbgZgq$HN4S|t~y0x1R~14Cn710b>pF*LR^HnTD{*EKM+GBAkb__GH^LvDUbW?Chh z1`{JI1E>av)c@P5LY0b9I5#H!M2-c zdp6FuYAx6CG!xD6lj}@Z*O24>|NsB&|7%wP6)~0s`2{mLJiCzw;v{*yyKrS(_!0)> zaOS(Y6$9x6AZ}oI8LN07Bv{}P2^8cz2*QjzCT70{36>Q&rUP{YnLxZL{Z1E<73}Ha z7{YNqIe~%M(NSaV5{_k(Q+p2bxG5&58#sFe9`Rt%QC!23X28)U;dGUatC3Zrg>~uy zo^4KU9X`ic*g70kkCd=|@P5LY0b9I5#H!M2-c zdp6FuYAx6CG!xD6lj}@Z*O24>|NsB&|7%wP6)~0s`2{mLJiCzw;v{*yyKrS(_!0)> zaOS(Y6$9x6AfCXmc)oETNU*>o5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKyE6mfy zF@)o~ZeKU=0R;}1L}t5EhBqux;u$i_HkZ7P@^d=$n2Fs*a@C3$<^=JE^PC$lrf%KD zD$J3!v2~&5gnM^42HCKvt!iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr E0IMI2od5s; literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/celenegil_axe.png b/libs/textures/items/fantasy/celenegil_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..a24eb466a7121f72cde618545572f5cdecb37a9e GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF3$3fD%Vaf(}B8yOd#Hrey0n_3iEVv4B@z5+H;V%!GPyT zk#vl(k;7HaOMVBM8I?Bv*V!U!-x5DfUhHR(nNr5$S1)2(BU}pv&8N>fV#s>5Lqo(x z^~$o0CDBWFly-}0&NGd*z5h|}??(pP6&yN7uAA-yZBQ+7jVMV;EJ?LWE=mPb3`Pcq z#<~VTWD#O$Y-Ma_WooW#U}j}t5Xtdp4~mA|{FKbJN;C~7Mpgz;4GyXQL4hL$vLQG> rt)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^P6B!U literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/celenegil_bucket_fill.png b/libs/textures/items/fantasy/celenegil_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8dc0e5e0d3380cbcea8035d53d51d8440fb037 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=0nTsg;d+HLZmWou#dP zl{GWM`)9OFpWi)uN&nPMc}ox1p1jd*4^+ok666=m;PC858iv zL>4nJa0`PlBg3pY5H=O_Iu2nf>KO#`!|RJg^WF2978y+Cnp?WpAmCd+QDS= zjaRXf!VYV$?k>}BK9L*E8orI!N!387p;IM6V(I}05e9}yc3g(6+dp0bYG?3t^>bP0 Hl+XkKqy<8d literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/celenegil_chest.png b/libs/textures/items/fantasy/celenegil_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..93062a434dd341b6c8ee612817d4ef4fffbf2202 GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFxP_@K0 zq9i4;B-JXpC>2OC7#SEE>ly%&MTnuXm9d$XskyF!nU#S-B*&jUC>nC}Q!>*k(KMJC zSs6ezIHdlc3)CP5vLQG>t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^ HP6|WT9qJpEI{>o!UnU07XlnR z9GjXVbXgc)DsV^^9i9O)UA4qDq9i4;B-JXpC>2OC7#SEE>ly%&MTnuXm9d$XskyF! znU#S-B*&jUC>nC}Q!>*k(KMJCSs6ezIHdlc3)CP5vLQG>t)x7$D3u`~F*C13&(AeP bq0Cs%RL{`B;7id$pehDWS3j3^P6{>$S)4rjibTQQJ60KpdZCLqBA zk4T^(-$4*&+%YlxEl9Aez%d=D8^{FWP3d>KfUF2l7sn8e>#4mLIS&|cxRf@(NM)SN z$rGzk@_+8DrC(Na71_+w`lO$m)879;%rDa-i|6aK&Vu2nFwPi0^F|3+66&<@oS*NBpo#FA923{2##Y8=R;K2<24+?U29X?p_Mm9U%}>cpt3=aaVq|3i)!>l&e=bmi6v&3){Irtt p#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RTFpjkf>* literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/celenegil_hoe.png b/libs/textures/items/fantasy/celenegil_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..a84730f34c3128d397eb0817991fe1de665c2691 GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFu+IMQU65dbM>?wFYU79?0!;Fu274P*lGrt~{qKvsySi(?4K zb=|&$yax<8m_I7l>n!?rn>RqcW0&*u6JoKuyO`x?GjpHmS+cU=E?=cxXYiWzH=0S! ztu6-yH3ja~W-fMqF!$BkT2afi*b|pN7%esnu>W(?hV`D}+FBi;`Kl$Z5hW>!C8<`) zMX5lF!N|bSSl0lEEJ6&8t&GjAOwDx-%&ZIyB02u-LD7(#pOTqYiKfBC$jSh!!6Ehk zT%ZOikPX54X(i=}MX3w{iJ5sNdVa1U3T4K6rh0}3249L60#z}1y85}Sb4q9e0NXN- AO8@`> literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/celenegil_ingot.png b/libs/textures/items/fantasy/celenegil_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..15287f619d7d6ec2cb506ee4380c3641fed68fc0 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF3{2##Y8=R;K2<24+?U29X?p_Mm9U%}>cpt3=aaVq|3i)!>l&e=bmi6v&3) t{Irtt#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RT8Oi_8E3 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/celenegil_legs.png b/libs/textures/items/fantasy/celenegil_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..644f8fc736495b0dabb220acba517ea7f5df4f01 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFQ&rUP{YnLxZL{Z1E<72)aP7{YPgx96f@g8_&0 zX|^Rh7*d&DvDEEo{C!^Op?mSp$FiI~A33#NNFGo-Yjb#ygUpPmgu)o>Y(eeZ+|-+U zPBRs6P&WTy@*y#P;~bWhnHN_+t#7$j!I+%RsrPY*su0i))e_f;l9a@fRIB8oR3OD* zWMF8lYXC$RA%@0Q#%5Ng=DG%ERt5%<9DnwpXvob^$xN$6(_ms`WdPOSkotcvP=gf6 vhT#0PlJdl&REB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7{an^LB{Ts5l+ldT literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/celenegil_pick.png b/libs/textures/items/fantasy/celenegil_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..859077acb36162d1ed74cc8e17e793e309694aeb GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF>?wFYU79?0!;Fu274P*lGrt~{qKvuM;i(?4K z_1xZ#ybT5d%x{(cN-G7n`v|nMDzz2sLb6o>7D+7Z_jz4=)H00)|WTsW3X)rOe zGJtAuNc}$-s6h&3LvVgtNqJ&XDnmeGW?qS&pKFLhnX#U!o}q!km!gG0RScf4elF{r G5}E*RppfDK literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/celenegil_shovel.png b/libs/textures/items/fantasy/celenegil_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..4f20d5adfe1e332d5fc1f3605cabbeea96b8cd88 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~=<|lUW;q)nI zJeqc!rcBiEG!yMiSI_X1(~#r-|Np;!c*+)_BF2&+zhDN3XE)M7oFs2|7p{y8U&4SK z&U`nwVjz70h#MF_I2ss&1PeSOfr5MoL6~vJ#O${q!LkC!bf9h^6NopZ-{}Ifd_7$p zLpZJ{Cpa+nG&KdZO;T!6Oj*Ps7+%I^*y7Xb)5D^ubSOY|krR`EZCjH-+lB^>83)5S zQko=$ge4ASN$@sGxHz{o_BiY~Dj>zsE6qA_(y4a}?z3?e!H>_O3xo1c=IR*9y;#K_73s=*=k|6HI3DUc1p t`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76Mfp3lrWIEN zl@86y;4pOA!?-GPq9ex{0kMRHmW-w>Muu&*Y$?hAo>>CTRxNRjC`m~yNwrEYN(E93 zMh1q)x&}aG5n^a;Wo%|;YOZTwW@TUy$?<0oiiX_$l+3hBGz}(3Rt8WF4ypg=0yRj1 vYzWRzD=AMbN@WO0%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}K< z)5bg8(@ZqOPfkOQyE9$=|Ns9>=D(i?RKZvho5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKyE8Nq?F@)o~ zZtq6H1_ut7od@Q8&ONZ5X$#YFIT>q%t^Ymbc08FT%jROE;?7xhz2T?E#+xTaxYr(8 z$N0omea$5c5s_!j&3C$X81J1_xi4pm!)2z`yic5eGO8J}^ECdlEdyGiTH+c}l9E`G zYL#4+3Zxi}3=EBR4S>iZ#L(Ev*v!h*T-U(N%D^C!`cbk{(n= z2+KaZaP~B7y z4a}?z3?e!H>_O3xo1c=IR*9y;#K_73s=*=k|6HI3DUc1p`DrEPiAAXl0g0J;C3=3Y dAqr*2dZv1Y1_ob>76MftW8`grR-n*IPZ!4!i_^&o5}z6bXD5_7o~#cG zGh<6jOJf58JG(fxFf+5ZRg;+9_OPXhPWku$=U?f=uix|VFgY#aiMeCL0|NK=)g}J; z@XoZkb)FWpu`#!EWg?%lpZF0`lRxg)I`U2|a}Ac{tZD=T#l^dx|KEK4yCh4Ci=+e) zi1}tDEYa9tw5s~w@1v>z-Nn-nEoF@TxP5)R!5n{~18LT^2M_E{_`t-VHrs5P?Y@&8 QKu0rpy85}Sb4q9e02rWP@Bjb+ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/deep_iron_chest.png b/libs/textures/items/fantasy/deep_iron_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..1ccd837d8dbffa2e5bf2a9b9c70de9d7c53ad016 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF z)4*Kf@KAc=|J5;CJ=8*ztaU|g?hR;hHzZZ?cFKZ;K0NDl<$w} zgN00oO&9F^SIso1X_4<1?waMxl9)VVwWe#UOgok5syFSq+N61FRL=Cj*v!M>9c5pB zGtHZQ5u3mnxzbey4}AYDDP*3tjbq7^%=-_47O0lEMwFx^mZVxG7o`Fz1|tJQV_gFv zvIsFWwlX%eGBwvVFtai+h~)UQ2Sr0}eoAIqC7K2kBP#=_28Y!DbAcM9KsE&DrFVdQ&MBb@0Au@z`v3p{ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/deep_iron_dust.png b/libs/textures/items/fantasy/deep_iron_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..35deb0204cc45b840fd90e5a2b7adec5d3e403f3 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFn6TED7=pW^j0RBMrn!@^*J&OHA8Q3*>O-ySWtuX^?vi7}$0- zEdvP_ctipP`3{0Gs+j;Mn2V z)D)r1!thdoL$c`b43O!nC9V-ADTyViR>?)FK#IZ0z|dIN0EjF?42`Xf&8$q#bq&m{ z3=ASU{_H`~kei>9nO2FW!NkbQ0IIi|3S;YUtdxqAQYFT|3fP7S;%BYPuT-W!Yg!(JGe@CLVbMNLwwKsyT&OU3*xRQ zd^rD|X}wMTjT>xDkAI$63p7`?#5JNMC9x#cD!C{XNHG{07#iyu0FgzAp|O>*nU$%z zu7R1Afk7n4pFJoVa`RI%(<;$4m>5|ZKs7j|{+|ofAO*4^I6tkVJh3R1As{g`uSCz! dHAJDzSkF|?(7@nJ(L$gq22WQ%mvv4FO#oz4f@%N& literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/deep_iron_hoe.png b/libs/textures/items/fantasy/deep_iron_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..9e52eda851711ba1bc76cfcd4a80abf0255aa5c6 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF z)5bg8(@eB8T|L83PD76S|Ns9vYgT6gRWOzW`2{mLJiCzw;v{*yyKsKIx%3T?!o5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKyE7a4)F@)oK zaza9ah)4Xn|^pYeY#(Vo9o1a#1Rf zVlXl=G}bi$B8w11V=H4bD^qh_12ZcFgGi1)dr&mw=BH$)RibGyF|sm%YH&#XKNqM$ w3S>iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr01&=?T>t<8 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/deep_iron_ingot.png b/libs/textures/items/fantasy/deep_iron_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..43bb4a4320079c24074d795047c1af479dc0b07a GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF z)5bg8z}Ef$|Nm#(H`D?p7)yfuf*Bm1-ADs*lDyqr*b>urfMhuH-Q0?SG{`*;44SRK z13-cW9+5ynzJnmlxMO1WTaaK`fnz#QH;@U$o6_%e0a;<5E{-7_*Gqd3@-`UoFyG~U zb&1De=7JX135OV_p7^)Afyw{F^OE_-A8hSBaxAx)%ykyOYN~w0bBgEGt7TK}WtQ>y zM4J}NPuP4f#jWV0prhck?Y}=)GhRE$wa+}hbT-fi)e_f;l9a@fRIB8oR3OD*WMF8l zYXC$RA%@0Q#%5Ng=DG%ERt5%<9DnwpXvob^$xN$6(_ms`WdPOSkotcvP=gf6hT#0P rlJdl&REB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7{an^LB{Ts5mUfA| literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/deep_iron_legs.png b/libs/textures/items/fantasy/deep_iron_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..5b30ddd6c357ad0cec65cfe251e0d7e5f6d99359 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF z)4*Kf@KAc=|J5;CJ=8*ztaU|`FXlHhHzZB?P=s>Fyvr9%eJws z@gG|gx6R%9XBE-1vc;mmh) zD+baahZQho5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKyE5g&oF@)oK za)JX>4--#MlS0&qfC+(uCjSGC3u%WwSCbR*YEC z$hc;%X>%i^j_5rG6YdiUI;=05l~(w57#TPVI59JvJ;b*8c-)s(pdG3ut`Q|Ei6yC4 z$wjF^iowXh&{)?1h%7=3jjfE$tW3>y4a}?z3?e!H>_O3xo1c=IR*9y;#K_73s=*=k z|6HI3DUc1p`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76Mf z)5bg8(@eB8T|L83PD76S|Ns9vYgT6gRWOzW`2{mLJiCzw;v{*yyKsKIx%3T?!(}B8yOd#Hrey0n_a`kj^4B@z* zoZ!IP)Fdz~&{NQfd!~bg)2VX-ZJiStT)4CjC@8TcZcsCFN;xF0Ahbp_Ao%bCrku=7ebi$p5M(t`Q|Ei6yC4$wjF^iowXh&{)?1h%7=3jjfE$ ztW3>y4a}?z3?e!H>_O3xo1c=IR*9y;#K_73s=*=k|6HI3DUc1p`DrEPiAAXl0g0J; hC3=3YAqr*2dZv1Y1_ob>76Mf z)5bg8(@ZqOPp&gvT|1vc;mmh) zD+baahfQEuvDeNYBv{}P2^8cz2*QjzCT70{36>Q&rUP{YnLxZL{Z1E<72xUO7{YNq zIl+Okr-><`O{nFdMha6Rho-fYq*8!ns<=RNpu-6lfi(ev7X)?kbk=YLDrzKg81|S3 zawrMi%V0_4NHcI+(!wgiqL{Vt8xuoqH=Dh$*Bnp?sg}4#l%yn~Jp2r)FaGB&d^HPKPgsd?{K8RK?)w>gTe~DWM4fUsrnv literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/haderoth_axe.png b/libs/textures/items/fantasy/haderoth_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e0701bd2b98d94b31297a44e611bf3350f2498 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFL zE>c6>(@ZqOPp&gvT|36z-tT;~>#}JO| zv1c|4HW=_Y2d-SO-9t>lM<9Vw-Z|j1A=~1|DzbTh{Eo6ScxD_AT9bTF`__@KCsx%K zX}uf?Cy$6p0c}z( zag8WRNi0dVN-jzTQVd20hQ_)EKx7eOXl!L{W@T!wYhY$&U=YdiXAg>o-29Zxv`RD$ zCPr2UPz?^L|K|cVNP%n!&QB{TPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FF@!PC{x JWt~$(698C%k7ob? literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/haderoth_boots.png b/libs/textures/items/fantasy/haderoth_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..b37ba6b5f3d0171113b6efa034d332b317e0a64a GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFL zE>c7M|NsB;ch}VcMHx$i{DK)Ap4~_Tagw~UH>dY9W= zkYIsFBv6p=AP6(=n3(+*Bv@A9m=4qpWCHP~^gCTZR)D9AV+hCf(yoiV4FMd?FWDSo z8RjxPX3~GRf3k_;ze>hS7mR;5^qo)RF>S0qzaoo0G_hEx^@6%e`ev2KIdXccvZg^n ze$zLu+j{q=nEto(%p82|cCN4H>j2GGEpd$~Nl7e8wMs5Z1yT$~28PDE20&yHVrXn- zY-VL@u4`asWnd7=@n;W;hTQy=%(O~04JJlb22c$SssBO#lmgihoS#-wo>-L15RjOe hSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIGpGgFgTO literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/haderoth_bucket_fill.png b/libs/textures/items/fantasy/haderoth_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..35b446a66e78073f6832f14e336d89eb137b5d50 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Q-Dv1tEs7Jo0-^Ldx^lnz|hdp z-QLp0(Lv2g!8IvSIXOAa>CxR;F-1j16%`eestRY;7A|Tmnl^3Pj2SaltXOg5#*P2~ z{|73*(F2;sSQ6wH%;50sMjD8do5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKyE78-%F@)o~ZSO%|W=9U@LiQO; z8U1cMlw=;L{`+0TW61}pN`o1H*$s;GI|@QfKRk`d`Ro_eA8jxD?3vZv`?&i z8fW$D=`58!S7l544_$d~v}H=X#S^&=B`?0;yLga&{%g+phj~h811(c6ag8WRNi0dV zN-jzTQVd20hQ_)EKx7eOXl!L{W@T!wYhY$&U=YdiXAg>o-29Zxv`RD$CPr2UPz?^L z|K|cVNP%n!&QB{TPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FF@!PC{xWt~$(699DW Bk)i+q literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/haderoth_dust.png b/libs/textures/items/fantasy/haderoth_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..0295de98d2609e6a762d93a50cf9036248ee4be7 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-KzacX8!*Te zOuP&dEbxc~3i2HUVa6R3v)_UQ%L*LRfx3ZAAl{UIrwhpP@N{tu;kcfhaDZEabpel} z>xzbn+Aba*o~8mi3zjT-#UmsX#%09I%E`&9xw5T6V$mtDRSAN}0#vUjY%n``A;7W2 zv8gFSmxbY_0*7SL;Ta&)RZCnWN>UO_QmvAUQh^kMk%6JHt^p8PgcurI8Jk&|n(G>v zSs55aa{SqYq9HdwB{QuOO@oP%l>tbP0l+XkKKsI=* literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/haderoth_helmet.png b/libs/textures/items/fantasy/haderoth_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..98e08b5cdf20228c2f3907703abdde7c07944682 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFo5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKyE5OsmF@)oK?wNzU2MjozFK%!= zpmTs@+AfAy|Ex`S*iPe)f7H44U)t1WTuu)eug!Q;y7+mE-#)fK z1o#lrslc^W>y9UksN>aplHa=PsvQHMAKkmWMu%=;E?)%E>MFM$cEtjw370~qEv=} k#LT=BJwMkFg)(D3Q$0figD*u3fvOlhUHx3vIVCg!02RTBKmY&$ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/haderoth_hoe.png b/libs/textures/items/fantasy/haderoth_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..25c87cd73dbcaabdb1c64e70b5cee637e8dff988 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFL zE>c6>(@ZqOPp&gvT|AQOl;rQhiSviv<=978y+ zCnt!Ah$JvDE2cVgGzXrL&^oe0=LAP0mlc<@M9-lv0ZTT)6-AEjf{q5x5eiY sep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr0PZz`6#xJL literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/haderoth_ingot.png b/libs/textures/items/fantasy/haderoth_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..e83b12d09e3bfdb1862bba31e1d01c5947977e3c GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFL zE>c6>Nlx(p|Nn2yVu6|&7)yfuf*Bm1-ADs*lDyqr*b>ur)B-u2`EG8-KzacXJ1`jg zzfc7U7I;Jg1^EtwFyoGi*>6FDWd)AuK;1wl5N}Gq(*W&z{7l( z_thmHhnWjnSSK7}n0n&h>INqN56?^H8-K91^T@H>VlvlR{Hm$)4bLf_Q?HgyxtCeS z;}dOKEI(oMy%e{ikAjYZ&$j>mT+MjxAlE+g_|n-x8&peNBT7;dOH!?pi&B9UgOP!u zv919SS%erGTN#^KnVRbwm{}PZL~{JugQ6ifKP5A*5>11Nk(B{dgG1{7xj+q4ARB`7 s(@M${i&7Z^5;OBk^!!{y6v~YCO!W*6489aC1gc{2boFyt=akR{075#51ONa4 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/haderoth_legs.png b/libs/textures/items/fantasy/haderoth_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..f6fc7fd104e6318deb13cd45cc08b7b91bbb774f GIT binary patch literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFL zE>c7M|NsB;ch}VcMHx$i{DK)Ap4~_Tagw~UDVu1Clj zkYIsFBv6p=AP6(=n3(+*Bv@A9m=4qpWCHP~^gCTZR+y)YV+hA}*S>?i2NZaiU-RZ1 zV(Q>*ieT9I-|wi+tvze3qfdRVQ5U$vsk$UbeZh6p3?t?3o`yTMj2~$U8eLS`_I$;W zO-{;P&Lv4pI!~)zefo52=Rfthpk(%+mF(q(KpRv`Tq81vc;mmh) zD+baFfVhC+4d=aUAi)BUNT49!K@eu#F){lsNU*HHF&(HI$OPg|>36z-tY}Xc#}JO| zu002N4;XMTe_UKYd4q#n#}!tk()NA7PfN(|Wl@^i@4s#1iTZ$L(>8ZnO-VZv!FMsc zEh+cXBE-L zE>c50!%xoBOtdpyT|(bbkO{<_((iNuSwWsIjv*Y^ zlM@`+dU|@8651wA5SVdLW6c^4K?4&rrcMK`ZjNSG3DH(rMWwF3Lrn>SfsPv(n4=d8 zxddk|R`76`V91oTXTt`DD{}5^CW4MDjxrp&$5t7AVc8j=>8d5J5hW>!C8<`)MX5lF z!N|bSSl0lEEJ6&8t&GjAOwDx-%&ZIyB02u-LD7(#pOTqYiKfBC$jSh!!6EhkT%ZOi wkPX54X(i=}MX3w{iJ5sNdVa1U3T4K6rh0}3249L60#z}1y85}Sb4q9e06xEhH~;_u literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/haderoth_sword.png b/libs/textures/items/fantasy/haderoth_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..23197b6f2c87d976f7ae331c97577892b9ce53b8 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFL zE>c6>(@ZqOPfkOQ`~Uy{=7P?BKxxL3AirP+hi5m^K%69RcNdPfdsC}`9L{_XIw9{3|6N!;BFcUUrgnrpb7-8$y2p2m#j)^BQvy0gQn*g@ zHNVzB!8`H5KIO!nTfeP8e@1cVuSLAC*rnoF=dp)w_S~Wgv_Q4QHKHUXu_VKLZB)JPgg&ebxsLQ02B;`ivR!s literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/infuscolium_bucket_fill.png b/libs/textures/items/fantasy/infuscolium_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..f920e05cf00ca4a427498ff703301d51446ebff4 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=2+ZeluNia-)*VlCqmp zigtuFH)fP{=T`SrHqNN)TG%}C+b>fepgP8qAirP+hi5m^K%69RcNc~ZR#^`qhqJ&V zvY3H^TNs2H8D`Cq01C2~c>21s-(%(!Hjv<93e*G&8F{)mhHzX@PB_3Gp=BlBkP+s* zRb?fw!nCNMSxPQ?ft>4f1f4hyG!D4181x7wC;*)=lFM3{U)G-j)Xm`O>gTe~DWM4f D%A+}V literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/infuscolium_dust.png b/libs/textures/items/fantasy/infuscolium_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e2d9520dedbc35abaa2aff318cad81ba7ec292 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GR;ZY{0;D zpp_dWSl|%}6y!Sy!i+m6X1@gqmK8Xr19bzLK)fmaP8X2n;pyTS!f`!0;Q+S;>jEA{ z*A)#DwOu?sJWU037A#rvibqH&jLV3Zm6MZIb7fnD#G+GPs}cl{1*l$6*kE?>LV#n3 zV^dRvE(^m;1rEug!!tmptCqM%l%yn~Jp2r)FaGB&d^HPKPgsd?{K8RK?)w>gTe~DWM4fx%7D3 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/infuscolium_ingot.png b/libs/textures/items/fantasy/infuscolium_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..7d268ef923cac1168cecb57dbb3430b8fb340083 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-Kw1Ha9T;@~ z|M?3NEbxc~3i2HUVa6R3v)_UQ%L*LRfx3ZAAl{UIrwhmm^K@|x;kaJfdyu!mfQR`m z@2g8Z4l@_DuueF{F!jX0)eTJkAD)-YH~wI2=aFN%#bmCt_*GNo8=g}FVdQ&MBb@0BjkF$^ZZW literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/mithril_axe.png b/libs/textures/items/fantasy/mithril_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..bd013980c8bb10ff37f4c72d4917650d2ef6bd3a GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFoz+UR)b?0moVydz4JAS|3+^^nzFF{F`PPrtZ;Uqbu1h#zm0Xkxq!^4042^XSfXE`m(Adh@%*xbU*TBrmz#x+2&mI&Fx%nxXX_aUi zOpL4ypc))f|IY<#kOJ8doS#-wo>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X J%Q~loCIB5ikre;{ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/mithril_boots.png b/libs/textures/items/fantasy/mithril_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e35dc4fb6f59a1cfe5c2060c2af5e5e1c5a0ff GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFkVi@A&ZZ|Ns9VB#v(dN-&lL`2{mLJiCzw;v{*yyRapu?WhHEIP=}yih*o5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKy%g@urF@)oKZTCga1_vJJ z*}Rvg@fAE^a*a8_+jZyP>WHt$o-29Zxv`RD$CPr2UPz?^L|K|cVNP%n!&QB{TPb^Ah l2uRG#E79|F4N)jF)-%;JG%)y5v=FF@!PC{xWt~$(69DaHjn4o8 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/mithril_bucket_fill.png b/libs/textures/items/fantasy/mithril_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..de48b32ae282d6d89310efba669361e8773bd9f1 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=6XN)wxa0)!n^SJ$+%b z7PL&6+A?F-gvCo{tyjqYlB+Kp|sK7sn8e>&XcR*k|0iB<*0b z`NgYPL1BkAS9h1`x1Pw2WewjZ>cncG)6mJ1AR&6dL4<*!eFf(~y_O4gKQ&rUP{YnLxZL{Z1E<73=BZ7{YPgw6~Fy!H|Rb zG25~__6>ds){gE!{!afH_2WQd#{`D`F02889p<_U##o#lrslc^W>y9UksN>aplHa=PsvQHMAKkmWMu%=;E?)% zE>MFM$cEtjw370~qEv=}#LT=BJwMkFg)(D3Q$0figD*u3fvOlhUHx3vIVCg!0C`J} AiU0rr literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/mithril_dust.png b/libs/textures/items/fantasy/mithril_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..b67d81cb5957c0cebce9594239822d45919665fb GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF|;pfR8 ze>kVi=iYzr|NsAQ_s#hTlwd3g@(X5gcy=QV#7XjYcVSCR+ffVTaOS(Y6$9x4AU0s& z^XvTs5-jkD1PbyU1YyP<6SLof1j`B>(}B8yOd#Hrey0n_^6+$V4B@z*oN$0!f^`9p zqU(x=iP|n69-gKGIt!L8dBr0n6vk!5%gV{gs=2bQL1NJC z!?CF;LYIZ%r2>a!(cu{&(^X4cBT7;dOH!?pi&B9UgOP!uv919SS%erGTN#^KnVRbw zm{}PZL~{JugQ6ifKP5A*5>11Nk(B{dgG1{7xj+q4ARB`7(@M${i&7Z^5;OBk^!!{y c6v~YCO!W*6489aC1gc{2boFyt=akR{07K?}%K!iX literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/mithril_helmet.png b/libs/textures/items/fantasy/mithril_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc0eac2226afa5be6a2554afcc35efc3236eec7 GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF?8%r+gw|R27aJ#X4_HB>2+ z1YYFWder7+`u|d?g?nN*>^ES1c$ZyPMWQ7iXt-*LYeY#(Vo9o1a#1RfVlXl=G}bi$ zB8w11V=H4bD^qh_12ZcFgGi1)dr&mw=BH$)RibGyF|sm%YH&#XKNqM$3S>iYep*R+ oVo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr0IK+k6951J literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/mithril_hoe.png b/libs/textures/items/fantasy/mithril_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..e33400e42604cbcbaadc885fcc48cb9c9547e448 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY108WDf;$DfW5 zKe_jx+xqplro5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKyE6CHu zF@)oKa)JYco1-J6qoaWLi5n9F1$CA@(clqF6c7nZY0(fi6lv(N=#pr<+QG%)EF#Ti z(6scDVwA)UtA%RI{TnVc1u(iPGin@`Jl2rK$Z#T?ZQ8|s$7F$~tCqM%l%yn~Jp2r)FaGB&d^HPKPgsd?{K8RK?)w>gTe~DWM4fEDVNE literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/mithril_ingot.png b/libs/textures/items/fantasy/mithril_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..8f52374bdcdf42c5e8a3714c85bf6454ad2646c7 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFQ&rUP{YnLxZL{Z1E<73S&U7{YPAwD%xyg8>io zUEWuhcpPRfXkndjh+*o9f2$jq{69P|nQ#2T*3Kixa*N4aXYs41$~Qcxcuu`qHsxMs z8IMo2X|eo-&G%B=iarWD3O?KZ`*StpwS!#y%;QUE18q<(ag8WRNi0dVN-jzTQVd20 zhQ_)EKx7eOXl!L{W@T!wYhY$&U=YdiXAg>o-29Zxv`RD$CPr2UPz?^L|K|cVNP%n! t&QB{TPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FF@!PC{xWt~$(6997ujYI$d literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/mithril_legs.png b/libs/textures/items/fantasy/mithril_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..15ea2e778061f570de9b0c1e6ec85a3120a70481 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*Kf@KAc=|J5;CJ=8*ztaU|g?qX0v!Ps6IMho`FiR<)3wq{VC0b1Wfg zRfS>k$~$LReCMV;xiKd?)pWm);rCqo3@MHUCCZD=1FcXkag8WRNi0dVN-jzTQVd20 zhQ_)EKx7eOXl!L{W@T!wYhY$&U=YdiXAg>o-29Zxv`RD$CPr2UPz?^L|K|cVNP%n! t&QB{TPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FF@!PC{xWt~$(69C5jjD7$B literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/mithril_pick.png b/libs/textures/items/fantasy/mithril_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..78ce5f3c97574620ccd212eb70e0e37ebe67ab42 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY108WDf;$DfW5 zKe_jx+xqplrXr^b;gl;1LNFEal| zaXt6UZqWk@9IOEuL7zWuygr%p#sQ0-%{MHI9D>@~sw)^S`ZEf2G$^fdt zA@%=Upav@P5LY108WDf;$DfW5 zKe_jx+xqplrko5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKyE7;S; zF@)oKa)JX}Pft%%LfeE16O>vOF5yWt(BkIeY+&VyRS4>7QW6kk6LeJW=vY{w5TO#t zpmaFw-~kRH@e?@>66+%vw;p$4I8_kVV#J~-#>}v-g6-VXk268OS1oakC`m~yNwrEY zN(E93Mh1q)x&}aG5n^a;Wo%|;YOZTwW@TUy$?<0oiiX_$l+3hBGz}(3Rt8WF4ypg= z0yRj1YzWRzD=AMbN@WO0%*-p%^K%VRC^ObG)iX3O_)@eGsEWbU)z4*}Q$iB}P+N!_ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/mithril_sword.png b/libs/textures/items/fantasy/mithril_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..059e16e64beb116994037ae4de2f2e6501226640 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF2WKoyK7L4Lsu4$p3+fjCLt?k=1kZ!UcU!~qOd(LdgU1PeSOfr5MoL6~vJ#O${q!LkC!bf8f{CJ=8*ztaU|#e2FqhHzZh zJ-boxfC2|=fX=1QQl&C@85l%z{Mmz|AvZrIGp!O$ zgNc!q0aSxS>i@Yw4N@Q*g7ec#$`gxH83GbB^GfvmTtgJfjP*?Q3=Isv6fFd*V(@hJ Kb6Mw<&;$Uc!;pOd literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/orichalcum_boots.png b/libs/textures/items/fantasy/orichalcum_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e98bc535898f2c89f8f469e88d74543eb1af88 GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFO-ySWtu=?y^qf#FJw z3mZtVz#|eU$afHg8Fx&~ehU&TD{xE)>IO1_cvJeFE+8w=)5S4_<9c$!0cMti4ULU~ zCp`i^B0U)t4;^@+bwGkiBtfJEhy_I$RtX9vgs`ki3^4=p&4dyJ7=;}Al$$daELt>S zLWY9Jb_Qh^dp!n*TNBuRDa3O-0S#9zag8WRNi0dVN-jzTQVd20hQ_)EKx7eOXl!L{ zW@T!wYhY$&U=YdiXAg>o-29Zxv`RD$CPr2UPz?^L|3Tp*1+pPHKdq!Zu_%=xATcwq gM9KLZB)JPgg&ebxsLQ08_qux&QzG literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/orichalcum_bucket_fill.png b/libs/textures/items/fantasy/orichalcum_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c7203e78058f1e2c99c5a792c1f979a58dd3c8 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=9Yh_Q{!X*+uEawK=7= zd3l|Y)vYB>9ktz)TPMxwZe5o9F6nS7P#t4QkY6x^!?PP{AWo9Ey9+}HtE>l*!&%@F zSc3AT!cek)&k@V#Ur_7u*7~5E8bTG69GV!=DGJFtW|GqP?a2`-MgQu&X%Q~lo FCIC&8K`sCQ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/orichalcum_chest.png b/libs/textures/items/fantasy/orichalcum_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..1012aba54855464818e8e6bee1120245748407da GIT binary patch literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFU)cteVm-u>SlLuRLs6H$vJ6iA#1w6WM2QNzcZg4t&2%7|Ma;! zT=D_;gcx3p6K_~Rj#MpijVMV;EJ?LWE=mPb3`Pcq#<~VTWD#O$Y-Ma_WooW#U}j}t z5Xtdp4~mA|{FKbJN;C~7Mpgz;4GyXQ=K?iIfourQPb(=;EJ|evNX*PD(erZ+Q7ALk YGu1ORF!)lm5U7g5)78&qol`;+0MnVAIRF3v literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/orichalcum_dust.png b/libs/textures/items/fantasy/orichalcum_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..10b1828b9661f99b15d63364e921264bec1cf90d GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFEal|aXmTV0Jj9|0v<)z z6%7-$T|7KIO$BroELrl3M@T4)%ZQhilap0*Wm|*9qElY05(JM0s9sOlV0Q3AfMbVa zQ&WU43&TqV4#}d!GeD-RmbgZgq$HN4S|t~y0x1R~14Cn710b>pF*LR^HnTD{*EKM+ zGBAkb__GH^LvDUbW?Chh1`{JI1E>av)ccWiZFVwhXW`SbWK-b|o1swJ)wB`Jv|saDBF zsX&Us$iUE8*8qqtLJW$^fdtA@%=U zpav@P5LX~AD$lp*L|aIe zg?WH#`_3d!Gttg;bqzW03_rR5|NqC8U3&&p#8?vK7tG-B>_!@hljQC0!j*C1OBj&D zneXOS45T*zaRS3q*>f@=!2*v+pdjBt5N6ylG5ak@u&lr_9jF_~1maEUce;SAC{Gv1 z5RU7~2?+usA|eS4jBcsI?rx3(-Y0Ij1_&ypXfTN-3J8U@tP(OTVY%GYc&IHwP|#6z zLz0;zqvM80U)VZ=wn_2`Ot{Bz@f3$>f{0jyk<3CZiG_JUqi?f+KYA?Q7-)-XiEBhj zN@7W>RdP`(kYX@0Ff`UR03wSJLt`srGb>YbT>~>K1A|D8KYLI#IO1_cvJeFE+8w+)5S4_<9ccDLEZ)f9_G8e zuP*U8%v{jII^ht*)D!wdlex~~S51{~cuw)0dbMoIz05Km zpJ>x!`3alvrMMM+6m%4Pw*B|#YQ}2^x%QdIm(B*-pjzS@QIe8al4_M)lnSI6j0_Bo zbq#>XBE-IO1_cvJeFE+8w`)5S4_<9cfEZovZv9L^Wn zjvQhBVZ)f#BqDjB{AT?$j#(msU-`ZW{^Vv~+VZUUroxQfGp|40^Qr0S?%PXF?n~Jp2r)FaGB&d^HPKPgsd?{K8RK?)w>gTe~DWM4f@=lL& literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/orichalcum_pick.png b/libs/textures/items/fantasy/orichalcum_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..ad29293fd6ade4820814fc3118ad232aa750a092 GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF6H^aUlS0(Z0FQu)jg5gPZyq)9VK^ZmB2uzafJHk=q%5SxK+TG~ zLGodfQUY5xTXTnE#DYf08v;rP6qtf^?j1Owz+%L%!j)p+)o8+SHo2rF>MV!h97cu% zEu2bG&0fH8VNfk`jVMV;EJ?LWE=mPb3`Pcq#<~VTWD#O$Y-Ma_WooW#U}j}t5Xtdp z4~mA|{FKbJN;C~7Mpgz;4GyXQ=K?iIfourQPb(=;EJ|evNX*PD(erZ+Q7ALkGu1OR UF!)lm5U7g5)78&qol`;+02U^Rf&c&j literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/orichalcum_shovel.png b/libs/textures/items/fantasy/orichalcum_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..636296eb68ba530d4878b12b71f310956ef28d80 GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF11Nk(B{dgG1{7xj+q4ARB`7(@M${i&7Z^5;OBk^!!{y6v~YCO!W*6489aC1gc{2 MboFyt=akR{0A)vqvH$=8 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/orichalcum_sword.png b/libs/textures/items/fantasy/orichalcum_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..ae6b4da701be2790267243b1bfde979db8109655 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~AD$lp*M4Nel zYDkrZrio&l<1U@Qsp3ubV5b|VeMN%D4g;mWx1B@D>n z%y)Au2GSdVcml)5h58FYf(0ItKtaBPAk4U9V)k2*U|E41cF*FG^qu&P1vB|(;(=<>A)(%xl8lCY}UFh861UTCtI_Ux22ombgZgq$HN4S|t~y z0x1R~14Cn710b>pF*LR^HnTD{*EKM+GBAkb__GH^LvDUbW?Chh1`{JI1E>av)cRO>cXW zXo)@FoDd;TGtmq`ISo1P|NsB@Uo7ecs$eV$@(X5gcy=QV#7XjYcj5eabLkr(hcn;J ztr$o<0C50A{>g{mK!ODxkw8JdgCNYfV`BDOkYHJXV>(bbkO{<_((iNuS;?L*jv*Y^ zReLrHHW=_QKW)2J^k7BpOa&S4lolUHU-y$QZamcfSu4cAvC`v>MVip^NVeqfjtzC2 zX13pmSZ%&QAjfC1(Vlk2u63CuI|I}HRz03x%|FAbeCn(w=9D*XtoEO|>|WV%ewDi~ zd2sLb6o>7D+7Z_jz4=)H00)| zWTsW3X)rOeGJtAuNc}$-s6h&3LvVgtNqJ&XDnmeGW?qS&pKFLhnX#U!o}q!km!gG0 ORScf4elF{r5}E-0oRaGR literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/oureclase_boots.png b/libs/textures/items/fantasy/oureclase_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..c99f1745702f03048dec19e24fbc6f1d2163661a GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFRO>cXW z=$sIt|NsBnH%A=-iZYf2`2{mLJiCzw;v{*yyRiPqe|a3p;mmh)D+baIK>UH>;JH|N zkYIsFBv6p=AP6(=n3(+*Bv@A9m=4qpWCHP~^gCTZmanIaV+hCf((XXs0|6Y&-OXYm z2JBBFXVm*@|Gstpgrmo7W+oGcpxi%47XDP*mAXynY}oSN<{cRwlhVW^SNkjPmYCeT zEA7H|Nh?#Qrldst*)MswJ)wB`Jv|saDBFsX&Us$iUE8*8qqtLJW$^fdtA@%=UpavyU4n3ji3{!fyDtA7K0w41O=e;i+k9*=O0_c3DnKt>FVdQ&MBb@ E07&FLC;$Ke literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/oureclase_chest.png b/libs/textures/items/fantasy/oureclase_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..4549a5b4de25377d39fef719782541575aebed3e GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-K-vL_FEE67 zRqh1|7I;Jg1^EtwFyoGi*>6FDWd)AuK;1wl5N}Gq(*y4a}?z3?e!H>_O3xo1c=IR*9y;#K_73 zs=*=k|6HI3DUc1p`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76Mfur)B-u2`EG8-K-vL_4H&pg zx&lFh1s;(=LB4|^%(!D>_FIr(S%G6ZP&beX#GBIZbOBi&o-U3d9M_W*4sc7bF5ppg zUC}U6+r`7f(^Nob!ICAfc!Y$)xQuvNIXPK1SGF}sEIQ@2DnamAfa>*x4Q2-~1UPm$ zHZ?`)vM{_<;E*gjJOgC9YKdz^NlIc#s#S7PDv)9@GB7mOH2@-u5JO`tV>2sLb6o>7 zD+7Z_jz4=)H00)|WTsW3X)rOeGJtAuNc}$-s6h&3LvVgtNqJ&XDnmeGW?qS&pKFLh anX#U!o}q!km!gG0RScf4elF{r5}E+e$#@t5 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/oureclase_helmet.png b/libs/textures/items/fantasy/oureclase_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9f2c5333313ef04a411134bd526a3ea3be248f GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFRO>cXW zXo)@FoDiY^|NqD6w_XKGFqQ=Q1v5B2yO9RsBze2LuqCGLs0DI3^WEHvfwThlFz;kYjAdz<%w1IHoW zbH{lTtQzkw@D%^>_*?u^*JLFn1%|-bgqxF|OktWcWyvbu9gFpuK5tp%aVvZB&96E6 zS&wafw@$iv^5Yzt>%V4y>-x6wdiApwQQgn7hyF6pD&&0X?qnnjv`DqYHKHUXu_VKLZB)JPgg&ebxsLQ07Ac! AGXMYp literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/oureclase_hoe.png b/libs/textures/items/fantasy/oureclase_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..0fee302487cea15f16eb412756205979aa9de43f GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*RGtmq`ISo1P|Ns9ljJIEHXs zPfkb>5lLZSRumR@WOHO>V{=nn9N?I!z^sv;u|k7knrKLiMzV>KQA$f!M^mc=Gp{7? zK{gH!11+Y^ZBA@%8@_#EV@urNz2OC7#SEE>ly%&MTnuXm9d$XskyF!nU#S-B*&jUC>nC}Q!>*k z(KMJCSs6ezIHdlc3)CP5vLQG>t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDW LS3j3^P6RO>cXW z=$sIt5_`V?|NsAEx&0I_!@hljQC0!j_n}qZY{F%y)Au2GR~-tjhg) zIY_X;BN8accMyabcTCKF3lc0Va7+j41~P$oQ~I4QAS=w%#W95AdTH-L-Ub66=DWPF zF7Y_bT+qTg;Sj^r6aQ8>F!_IYUNYbKgRPxMj^!4Uxz6HOO_gtWPVt<2wQS10%rYLI zXwzc(37hYwxD|aAbQFBH{rBf;#%l+;_L;|*&Ia0`TH+c}l9E`GYL#4+3Zxi}3=EBR z4S>iZ#L(Ev*v!h*T-U(N%D^C!RO>cXW zXo)@F|Ns9Dcjg8FMHx$i{DK)Ap4~_Tagw~(}B8yOd#Hrey0n_3iEVv4B@!$+jEfjfC3NmVK&1= z##1cIgcVBv&wQm2^7To3X=hH_(KEhNxW42FItD3aZMb}y;rN!Vyllx%X>H11Nk(B{dgG1{7xj+q4ARB`7(@M${ oi&7Z^5;OBk^!!{y6v~YCO!W*6489aC1gc{2boFyt=akR{0I5-kMgRZ+ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/oureclase_pick.png b/libs/textures/items/fantasy/oureclase_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..852f777cce0649c616f2835f5f4b8863855af3cb GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(bbkO{<_((iNuSuvh2jv*Y^ zb$d4Q9x&iwnXhKb67VX8ng1c9P9^*L36~Zhe{i9|%8x-o$nDHZf6gUQS9Kg(Y!C8<`)MX5lF!N|bSSl0lEEJ6&8t&GjAOwDx-%&ZIyB02u-LD7(#pOTqYiKfBC z$jSh!!6EhkT%ZOikPX54X(i=}MX3w{iJ5sNdVa1U3T4K6rh0}3249L60#z}1y85}S Ib4q9e050W>{r~^~ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/oureclase_shovel.png b/libs/textures/items/fantasy/oureclase_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..3c295f6a2e3afba30a603192fbe1ac7c1bf313f2 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF?%$1PK;+L;?l*4uUY_j)~cCL4sukj_E+%Kqe4xO25+uWQBRUIEHXs zPflQ9c5~EFP2ou6kmS^EV&!2KWj(;8)aS&Mz<5|7QNTGMAkc+FDK&-TqRI*m!31rQ z7LFz622Lzm5)zJE8Y-BNSRHiWILmO6!Hmy|nL+hG`|^oL0ze_BTH+c}l9E`GYL#4+ z3Zxi}3=EBR4S>iZ#L(Ev*v!h*T-U(N%D^C!RO>cXW z=$sHCPczXBKRFFK?*IS)KecIj2$W_l3GxeOaCmkj4a7>?wFYU79?0!;Fu274P*lGrt~{qKvsySi(?4Kb>F@~ z!2o=Ijdcxx$Rfnh*vi<<%G6xfz|6|PAd=(H9uy6^`6-!cm1r7FjI0cx8XQvp&jo6b w0@)CppH@mdKI;Vst0H|Gvpa1{> literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/prometheum_axe.png b/libs/textures/items/fantasy/prometheum_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a748d7678405247c2aa46ba4629c33aeda751a GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFfq z%sIiq(@ZqOPfkOQyE9$=|NsAsLf?e~RWOzW`2{mLJiCzw;v{*yyKsKIx%3T?!ff%k8(T&Ba z=h|kt8wAM;O0?pF*LR^HnTD{*EKM+GBAkb__GH^LvDUbW?Chh1`{JI1E>av z)cfq z%+%M|IlQol#*!evUYw#2j@wLlJMzMESykOqMd4CkhW zgE*W89+5zr?;r>>?wFYU79?0!;Fu274P*lGrt~{qK$e%Mi(?4K_2h&D>@2Jjtd1s& zH!&=p$k4$k#AqzSD$#m?N08CY-9Xu;;iBjf0Zx$wky4hGqGAaqEUVH?f>II$g2WOS zvRhvqXJxQF#Iigxa_3*5sj4Ne5hW>!C8<`)MX5lF!N|bSSl0lEEJ6&8t&GjAOwDx- z%&ZIyB02u-LD7(#pOTqYiKfBC$jSh!!6EhkT%ZOikPX54X(i=}MX3w{iJ5sNdVa1U c3T4K6rh0}3249L60#z}1y85}Sb4q9e0R47%761SM literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/prometheum_bucket_fill.png b/libs/textures/items/fantasy/prometheum_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..b3110a69a9c3031f09f8fafd08833514c1318f3e GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=21_4hflYL1lg!h3V`U)iIU?`2{mLJiCzw;v{*yyD)UH%6b4foCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#9y7OqgvFt{l{0}tMxHK?Asp9}6ArLPT+$YA$Ov=o zPFu;VFwM2NUD0LTMTvE51f4hyBo4T+81x7wC;*)wuFPgRFW=qur)B-u2`EG8-KpF%tFhmO# zUj#BZ3p^r$f_w)-m~qF%?6)AnvI56+pl%=&h&QF*=>oF+JY5_^IIj10@8&(=z~OwB zjjxf@i1B8_BQ}Rq|2DI%^AkLMbh7<{_P$&Py;En|tTiXf>hSiq^DceJTd?`etlsR9 zbJrxvqhkm4QJd$DchY8glbfGSe#2G?*A!89+5Sr2d}^)F1`2Aviy+q&%@Gl_4N8 iGp|I?&oxA$%vjG<&(Of&OVL80Dh5wiKbLh*2~7ZS9)Xqs literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/prometheum_dust.png b/libs/textures/items/fantasy/prometheum_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..9417f5e705018e1fb8a9a875ed759a61457af485 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-KpF%L7+7-} zY=I2U0*^?bAm2d{X529``z=VYtiUlHs2j)x;!Wvyx_~SXPZ!4!j_b(@2e>6z7w{;$ zu4tI3?c(9#X)2(zV9AnKJVHWYTt>XCoSdwhE87|*7M=21l^}R5K=pdU2D5_~0vtOW zo0=kYSr}d_a7Y#%o&hplwZt`|BqgyV)hf9t6-Y4{85kPt8UT?+h@r8Sv6+>rxvqhk zm4QJd$DchY8glbfGSe#2G?*A!89+5Sr2d}^)F1`2Aviy+q&%@Gl_4N8Gp|I?&oxA$ a%vjG<&(Of&OVL80Dh5wiKbLh*2~7a5(RjxI literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/prometheum_helmet.png b/libs/textures/items/fantasy/prometheum_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..df0d21ecaabc066e4d14176206e04f7c12ca4d87 GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFYw#2j@wLlJMzMESykOqMR41yOD z8-NVX0*^?bAm2d{X529``z=VYtiUlHs2j)x;!Wvyx_~SjPZ!4!j_b(@2iPT8Sy>P8 zC<>>$ayZ`*IFk@kA|fipVC=%A$ipbW0;Xq3u?aFBb6^u;3(;j`V2H|L`L%raNp7Gy zswJ)wB`Jv|saDBFsX&Us$iUE8*8qqtLJW$^fdtA@%=Upavfq z%sIiq(@eB8T|L83PD76S|NsA4X{%NORWOzW`2{mLJiCzw;v{*yyKsKIx%3T?!q>B&!QjH1&C2YewuW($ zkOt5p0gR6BGb97FB@@aHGceroVY9QZIav-gSGB}7q9i4;B-JXpC>2OC7#SEE>ly%& zMTnuXm9d$XskyF!nU#S-B*&jUC>nC}Q!>*k(KMJCSs6ezIHdlc3)CP5vLQG>t)x7$ nD3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^P6fq z%sIiq)Ytg`|NrVUJCcABj3q&S!3+-1Zlr-YN#5=*Y>8<*YJnWid^fjZAPoWz3|hfI zPXig81s;(=LB4|^%(!D>_FIr(S%G6ZP&beX#GBIZbOBjmo-U3d9M?;G5Arq`@G#%y zeRYY)VdjDs)(M9grk?n>x`E06!}F5)#vg3$JaR0zn9Ow+ziO&{!*hz~)T?Dv?q!zo z_(Yo)%TL&RFU76sqoAYUv+ch>S2JEa$hFTrzH~Ow2GtVRh?11Vl2ohYqEsNoU}Ruu ztZM*779oblR>o#lrslc^W>y9UksN>aplHa=PsvQHMAKkmWMu%=;E?)%E>MFM$cEtj sw370~qEv=}#LT=BJwMkFg)(D3Q$0figD*u3fvOlhUHx3vIVCg!0GE7;1ONa4 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/prometheum_legs.png b/libs/textures/items/fantasy/prometheum_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..206f8e5734b930e3976f467d6e54ecbfea8b5b6c GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-KpF%dFtmiY zDghas1s;(=LB4|^%(!D>_FIr(S%G6ZP&beX#GBIZbOBlZo-U3d9M_W*4zTnzIVdos za7cDqXlXaOx-bX2vapJ_valXJ#VVn=i$!5ZiZ#L(Ev z*v!h*T-U(N%D^C!fq z%sIiq(@ZqOPp&gvT|^oFs$eV$@(X5gcy=QV#7XjYcj5eabLkr(hcn;J ztr$pyKmo&7(eoBS24{gsBv6p=AP6(=n3(+*Bv@A9m=4qpWCHP~^gCTZR#)nuGc&>3Rkce2& z*cd3N#E{s*&cMr_C0^2UOGSrab5H{#FbsaRvF-d&#Qzv*ylRPSL`h0wNvc(HQ7VvP zFfuSS)-?bkix5L&D`PV&Q*&JdGb;mwNRB^yP&DM`r(~v8qG>QOvNC{ba7g_>7pOrB vWJ7R%T1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvfK$u6{1-oD!Mfq z%sIiq(@eB8T|L83PD76S|NsA4X{%NORWOzW`2{mLJiCzw;v{*yyKsKIx%3T?!7xO1)MfgR{UR5-7-b5QG_bOw4`@5-cllOb6-)GJ$wg`kgKy%hA)tF@)oK za)JYE6O+KKKu>`~0!D!?9var#POLo&SrQAGc$Az37_YgwaVYO$R600|(KJ*>OW_5F zsDPNmW_~t?Mpf2?i*ktFo@*%vj;^(ZhlH;S|yqW6C*1Fs0N4B|8s#Fq(C+V=ckpFCl;kL1SDqWmFW4o dhA5O7>zV2q8W?;jS_o9d;OXk;vd$@?2>?7qb~69~ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/prometheum_sword.png b/libs/textures/items/fantasy/prometheum_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..8d59543051b03b29cdc0108f32a59e642c61fbc1 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF1z2s$eV$@(X5gcy=QV#7XjYcj5eabLkr(hcn;J ztr$pyzyyZX*)~^z49)_NNT49!K@eu#F){lsNU*HHF&(HI$OPg|>36z-EFVu7#}JO| z$q5dOJxxpjZ9-ENQ3{2##Y8=R;K2<24+?U29X?p_Mm9U%}>cpt3=aaVq|3i)!>l&e=bmi6v&3){Irtt p#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RXGeef0nU literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/quicksilver_axe.png b/libs/textures/items/fantasy/quicksilver_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..a13594a5d79a099999f9b07adcc8c7e005c248db GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFU6FTdy4+BWbNCNV04wiZ<(?I?+dXV@4A)*$}XA8ziIufRg(M$6FB((v!9Ry+M`o=Ijdcxx$Rfnh*vi<<%G6xfz|6|PAd=(H9uy6^`6-!cm1r7F zjI0cx8XQvp&jo6b0@)CppH@mdK II;Vst00(K1%m4rY literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/quicksilver_boots.png b/libs/textures/items/fantasy/quicksilver_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..79abf0e2592b50cc3b87f6d200c1635fa6b9fb60 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFjt) zG@OC6z#|eU$afHg8Fx&~ehU&TD{xE)>IO1_cvJeFE+8ww)5S4_<9cb&LCymPJj`!- zb9QoflrX9bZ~4t1di+ax)r-Ocg^BvF!n6-2tvxb(ZrC@hqi|yr}3bWnV64jgyG+VXAHKHUXu_VKLZB)JPgg&ebxsLQ0DIzzf&c&j literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/quicksilver_bucket_fill.png b/libs/textures/items/fantasy/quicksilver_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..26261417d307d2be71a82947e3f02e3103df0653 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=3k%B}MhMb)D^L6T0d< z+uJ8j=$txv%7S@wS1jw@ymrmGlQP{;_5sx~mIV0)GdMiEkp|)&XcR*k_!%B<*0b z`oybPIbnx2S9h1`H=f9iWDVcO>SSr4)6i*=Ao28og9rmdek$jh?ONwEf!Y~7UHx3v IIVCg!0H``eM*si- literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/quicksilver_chest.png b/libs/textures/items/fantasy/quicksilver_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..988159460cb5daf87fdcc400599475f885ea9f67 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(bbkO{<_((iNuS#h2&jv*Y^eS0qo9#G(LPGn}% z3z(~Li`8cLe;?8Ms5&P(cco9gv!Yh*e7W@YW@cTVEf*#49&u-onXZxcnpN%NgSZNf z16rTiR05m+@~ayKY6lc|7JQnsZ1bE=Jb$+Czj>J}a_YZj8-X^dmbgZgq$HN4S|t~y z0x1R~14Cn710b>pF*LR^HnTD{*EKM+GBAkb__GH^LvDUbW?Chh1`{JI1E>av)cpew z*R(p2V1Y*@P>}B+2s7@OnEe(cSXSVe4%7`~0`aEwJ6%AQho_5U2*>s0gah0XtP6M) zT~{XBE-ED5v_rMTHKHUXu_VKLZB)JPgg&ebxsLQ0AWv&cmMzZ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/quicksilver_hoe.png b/libs/textures/items/fantasy/quicksilver_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..8769d615cbb8f19932a6429b00460cd90c6df010 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~AQ&rUP{YnLxZL{Z1E<<>Tq% z7{YNqIl+O!&CyZA`D8>xAj1(MqcRaTV+q$5k%g0v1+*>LED+J<7;!;z(Xl`WfioP< z9mX5N9DMn*8(y_?8FV>>8u+!`=3U6Rw42Rl{yZiZpt-6gt`Q|Ei6yC4$wjF^iowXh z&{)?1h%7=3jjfE$tW3>y4a}?z3?e!H>_O3xo1c=IR*9y;#K_73s=*=k|6HI3DUc1p t`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76MfH1Y=2%UoeBivm0q3PLj8~3tM8^j#?mxGvCdv7)Vb5Vh09u z)At=9!2*v+pdjBt5N6ylG5ak@u&lr_9jF_~1maEUce;SAFi#i95RU7my$5+440xFD z^1iyn<1lkU3+seK3{y}1Tiw9q|KWMbeB%$cb{;vFTTJFUi(fTWzTr8=bL!QyDfcqV zczmKwi{&S5zL(-w^ij}J@Y(j?pQ{iY sep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr0LQJ2+yDRo literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/quicksilver_legs.png b/libs/textures/items/fantasy/quicksilver_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..653915e8f4f8bf91ac5fca4e7c94c53e22ace114 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF`KIm8} zp)i~AS;J59(uerxvqhkm4QJd$DchY8glbfGSe#2G?*A!89+5Sr2d}^)F1`2 uAviy+q&%@Gl_4N8Gp|I?&oxA$%vjG<&(Of&OVL80Dh5wiKbLh*2~7Y)vyP|$ literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/quicksilver_pick.png b/libs/textures/items/fantasy/quicksilver_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..7c95e368f3036bfe4c9de6c67a8b8cd068ab7633 GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFiK&Olp>5NqO^XdC98^$IQCh+=Ejh&`tVOF>Opw92g>~*h9yfP3MFVA@ zhCs<932PG?I$BH(8eAo`B@QU{Bse#Q8Au&^+j4@P5LX~A`h_X(rm4uC5`+o#7|<|NsAWCF%`8MT{jue!&b5&u*lFI7!~_E?gNGzJvie zocV5U#Xx!j5H~RVId5?cBv{}P2^8cz2*QjzCT70{36>Q&rUP{YnLxZL{Z1E<<>%?* z7{YNqIl+Oksi{ezZNem_8EGMAY{n9;JaZ57D5i=hc62Q05OmqtVGxqLU;@L8iFyo) z8$t~Xnplmb6_y!=IbY8)2GGE}}2$8h)yTdd5xzh8kStCqM%l%yn~Jp2r)FaGB&d^HPKPgsd?{K8RK?)w>gTe~DWM4fy^Dre literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/quicksilver_sword.png b/libs/textures/items/fantasy/quicksilver_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..e60dbbfe274e754f10e607a8f7aa279b2df1242b GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFy4a}?z3?e!H>_O3xo1c=IR*9y;#K_73s=*=k z|6HI3DUc1p`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76MfKIX?yp8F{)mhHzX@PB_3Gp=~AJkYVO5 zs=ks}VOrPZZY7s5k2s&{ZXdG~1G3XIWPyjmrmLJR6w;S3)wlH|Q`njxgN@xNA Dj@3Lu literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/rubracium_dust.png b/libs/textures/items/fantasy/rubracium_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..6f6a925b423840ee7cb506bbf6fe0edb64d74970 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-K)L~l4H%^F zOnC|tEbxc~3i2HUVa6R3v)_UQ%L*LRfx3ZAAl{UIrwhpP@N{tu;kcfhaDZEabpel} z>xzbn+Aba*o~8mi3zjT-#UmsX#%09I%E`&9xw5T6V$mtDRSAN}0#vUjY%n``A;7W2 zv8gFSmxbY_0*7SL;Ta&)RZCnWN>UO_QmvAUQh^kMk%6JHt^p8PgcurI8Jk&|n(G>v zSs55aa{SqYq9HdwB{QuOO@oP%l>tbP0l+XkKA>?^y literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/rubracium_ingot.png b/libs/textures/items/fantasy/rubracium_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..999873470040a8be33285ac76f9b3dbcbb2bdd17 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFFVdQ&MBb@09~<&<^TWy literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/tartarite_axe.png b/libs/textures/items/fantasy/tartarite_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a331839eeb9606d8a26013da35d03857bd560b GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_FIr(S%G6ZP&beX#GBIZbOBif zo-U3d9M^SwFY-1h@VNAEaBvh?uwsa~ke|wuEYl!3*-GqXHZZ&A$dH` zbL;I5x5LiNP+reu^uCibYYzXqqox5rdb}H?Jg!e-e$yo~ePyoH1&t;ucLK6UY5}5}8 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/tartarite_boots.png b/libs/textures/items/fantasy/tartarite_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..7d3faefb88d6569cb21470874eac44399d98a095 GIT binary patch literal 483 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF}B+2s7@OnEe(cSXSVe4%7`~0`aEwJ6%9lnx~6n2*>r(u8W)v z1_I8-1JT1WCDfi(d;};dz1)G`zEWN@kwv^s? zWmJ`KuHTndyv6U>3a-^s#&PYD6HaUHdCqiA$!3MFx7fVtH*biC{dvtMXd@ta=y4a}?z3?e!H>_O3xo1c=I zR*9y;#K_73s=*=k|6HI3DUc1p`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76Mf< Nc)I$ztaD0e0sz^llTrWx literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/tartarite_bucket_fill.png b/libs/textures/items/fantasy/tartarite_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..5dbdc80d73c3cfa6427149b269ef38bd40954b2e GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=77?cBQFtb-8I>6$RZD z`BNGywpYeaX{lY<*S>0c-}R{#FJC>$1gc{!3GxeOaCmkj4a7zP{^B82KfUF`<7sn8e>$1HU zIhhp&T-@=5&h9$z1vmH(} z{$^fdtA@%=Upav6I!B>r5E_|Nnnepg? zznLl^!2*v+pdjBt5N6ylG5ak@u&lr_9jF_~1maEUce;Qq4^J1z5RU7~2?w|(SQqdp zx~^!LsO{q6;b|(MvtY@RS3E*OVO&PMtel*znk(BHBo>|WT9qJpEI{>o!UnU07XlnR z9GjXVbXgc)DsV^^9i9O)UA4qDq9i4;B-JXpC>2OC7#SEE>ly%&MTnuXm9d$XskyF! znU#S-B*&jUC>nC}Q!>*k(KMJCSs6ezIHdlc3)CP5vLQG>t)x7$D3u`~F*C13&(AeP bq0Cs%RL{`B;7id$pehDWS3j3^P6Fp^|I2KAeSPce>;M1%|A(PdA1KXO666=m;PC858iKfUGP}7sn8e>#n^Q zIU5XkTqg6*S|+=|!qI_UQOvNC{ba7g_>7pOrBWJ7R%T1k0gQ7S_~VrE{6o}X)oLYc9ish**M T!Iz?iKvfK$u6{1-oD!MSPxXkSQ6wH%;50sMjD8d_FIr(S%G6ZP&beX#GBIZbOBj; zo-U3d9M_W*5)wp2QWzK=6_thA92wc%Qd7ml*%KMr*c2y!F`6!<&>VPCRrL<~ zppDDG;qCzjhSReANxV0UpF*LR^HnTD{ z*EKM+GBAkb__GH^LvDUbW?Chh1`{JI1E>av)c}B+2s7@OnEe(cSXSVe4%7`~0`aEwJ6%9ln5Tr(-h;di20YAn zd0$=PahSQFg>}LqhN&n1t!`lQ|M0wIzVQcJJC7X8EhclF#jlzw-|(E`IrVDUlzW+F zJU-E;#qtw2-%D{T`Y7lq_-y;{&()0A4sz`?k1w4Kv_ZARHKHUXu_VKLZB)JPgg&ebxsLQ0Dj?%RsaA1 literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/tartarite_legs.png b/libs/textures/items/fantasy/tartarite_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..544a9d361ea058ae34f3e4cdf1263ad7cf463c0e GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(bbkO{<_((iNuSy`Sgjv*Y^eS00b z8WaRv-TfaZ?3gBV`}wlH?h-E;cCBD$DgC=ochULeA2xP87sb`23p;GOKN+1-tU5Sj z>6JNql(`~9qU`yg%b^qv1YjiT(F3Fu%;; z7n;K~@hi|))e_f;l9a@fRIB8oR3OD*WMF8lYXC$RA%@0Q#%5Ng=DG%ERt5%<9Dnwp zXvob^$xN$6(_ms`WdPOSkotcvP=gf6hT#0PlJdl&REB`W%)AmkKi3e2GGjecJwpS7 TFGUN1su(<7{an^LB{Ts5fYX+E literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/tartarite_pick.png b/libs/textures/items/fantasy/tartarite_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..df2c199d067e80039b6e59321b5566d0c25ff40a GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~=BgF83+jI*H zi~nUdF)=aq_4S@+q8Wa28gktK|NmFu%W4HGVk`;r3ubV5b|VeMN%D4g;mWx1B@D>n z%y)Au2GSpZxPak7`!z+7V1Y*@P>}B+2s7@OnEe(cSXSVe4%7`~0`aEwJ6%9lv8Rh; z2*-8XzKy)i4m_^=pEg}PuF9-nctEy~okM$pPk~q3g5`^nQ*tIeI(F^%`Du;yf{rSj z7t&?#O>S`ey=t3+|JJa>8yD@LE}UYv`nsI?+@=FlroXt$mTS0%y6<|7RZCnWN>UO_QmvAUQh^kMk%6JHt^p8PgcurI z8Jk&|n(G>vSs55aa{SqYq9HdwB{QuOO@oP%l>tbP0l+XkK$yJ*W literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/tartarite_shovel.png b/libs/textures/items/fantasy/tartarite_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..519b22e96b18356131f477b10836fdc20f8ec775 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF6FDWd)AuK;1wl5N}Gq(*J4h4pT~YSs64*$ZU>~IqxNmF2!;|<1B0wN6; z7>=m%N@Y}8+5;_AEpd$~Nl7e8wMs5Z1yT$~28PDE20&yHVrXn-Y-VL@u4`asWnd7= z@n;W;hTQy=%(O~04JJlb22c$SssHB!HAsPM2+mI{DNig)We7;j%q!9Ja}7}_GuAWJ WGc+*xQnV1Liow&>&t;ucLK6TbkB!U# literal 0 HcmV?d00001 diff --git a/libs/textures/items/fantasy/tartarite_sword.png b/libs/textures/items/fantasy/tartarite_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..9a35809a1d64b9d8c014130340399ffd771332c5 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~=BgF83+w}is zHtS3nEG#TyVq)s+>wSHFGyLTK|Nme9&A$++h_NKdFPOpM*^M+1C&}C0g)8I2moOlQ zGvCdv7)XBr;t34*Kf@KAc=|J5;CJ=8*ztaU|Wq7(c zhHzX@PGDeUbad2MyM!Z+LrbbzvZw3RIR!U{#fv%@GR#PnTEh}@W|owU9LJ?2x3Xqs zE#a8L#mmbp#(HT@ZsJnW1ZSt)LCyzxuJvs&67W_q+9IN(H0#tYu4#gN2^^CPn^^#biwEpd$~Nl7e8wMs5Z1yT$~28PDE20&yHVrXn-Y-VL@u4`asWnd7= z@n;W;hTQy=%(O~04JJlb22c$SssHB!HAsPM2+mI{DNig)We7;j%q!9Ja}7}_GuAWJ WGc+*xQnV1Liow&>&t;ucLK6UB{f!U+ literal 0 HcmV?d00001 diff --git a/libs/textures/items/metal_item_default.png b/libs/textures/items/metal_item_default.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e6768e6a470ec01cb63a2ba7c47ea26aa13376 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)2^U7BkG>yK2u;pa^Gy zM`SSr1Gg{;GcwGYBLNg-FY)wsWxvNFD5S?euupPQSSR|4cRFgO>b zCYGe8D3oWGWGJ|M`Ua%vrLqIX8$DedLo80Oo&1oiL4l_wzkjC6lgW}2-)4MU%;r5K z@5*1P=H2;zsuCgIc`@xXIOMKQnmvW5c;@e0zGbZ$DK~?eby7;1xOdKG`Xa%&K=<`G zE}MSYJFl}DzI2{RNU~y>x@@AePkC3&nVvIWUVb{0W_S9<)s=3#DHYe}zPLVLefh>$ YOt)4}w6gcovjw@*)78&qol`;+0E6^nZ~y=R literal 0 HcmV?d00001 diff --git a/libs/textures/items/misc/fertilizer.png b/libs/textures/items/misc/fertilizer.png new file mode 100644 index 0000000000000000000000000000000000000000..fa14fe156ef7b0d73a9c51d1112386681d571274 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFvb)2za{g?O8V_1=FXOdqow^B)GX8bQzNvX4vtT-2eO#@X{iK&&Tk*76MfKmV#jMBhcn;Jtr$o<0I>pt z!#AMGK*0i!NT49!ArNL1)$nQn36>Q&rUP{YnLxZL{Z1E2rg16>1CD+2?ji~~(5 z8glbfGSezS8jN%e4RsAnLW~TpOiZmzjdTsnfErj^?{fe(NP%n!&QB{TPb^Ah2uRG# hE79|F4N)jF)-%;JG%)y5v=FF@!PC{xWt~$(699P}b|(M; literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/alduorite_bucket_fill.png b/libs/textures/items/nether/alduorite_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..0302e29a61e4c96d808414f1fe8c5c460e16d47c GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=1NMB?UD#WsQyT9UbLO zP4%6fZIdUL&6(3XbLP|q3npydyndd*U7$L~k|4ie28U-i(mJ1rb z6W__s<91l{PIh;+LQ%BUgHziaG}znNW^^#O1@iH@Ffs%z*u%l-o2|I zKA29N7=G~J|NsBj#g~}_B^XPB{DK)Ap4~_Tagw~S|=w+u&lrlD9H$90`aEwJ6%AQho_5U2*>s0gah0XtP6M) zT~{XJjBq{%E-{l$U@h^ z%*w!E#f_grC>nC}Q!>*k;TjB$LyU~93=OSJ&2*sg%!-vK9 z?u8#bXgYD?|Ns9jFW2k@N-&lL`2{mLJiCzw;v{*yyRapu?WhHEIP=}yih*Vwig3-|7Y?{}0bg<{N*owe!fa++s4Q-uO}Up@ z#^V!hS}Z?d^Suc?jk(HsLm8rR|fhkbK zpIf2dfEuJgHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~DWM4f DD=v<} literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/amordrine_axe.png b/libs/textures/items/nether/amordrine_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..46ef7a466d735f3ed850ac945d5f1932e64d13f7 GIT binary patch literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFEFn6Baf-&0x^w4Pe#%u%u+q_Z=Gir;R5jeUoS38nB|ZG*sj5 zZApXpM;76Hn5JOWdBSR}A3ta;< zD+7ZSH+~ACXvob^$xN$+YcMnpF*33;G_*1`*EKK&YWQ<2^czrv6v&3){Irtt#G+J& lfW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RXZkn^*t< literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/amordrine_boots.png b/libs/textures/items/nether/amordrine_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..9bed980470622087ef5918920d9541e86bf14adf GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF z>pYKx1PeSOfr5NMLB0cwS=Tx_L4sukj_E+%Kqe4xO25+uWJPcp;tBs#rR@HGmAm#b<$*Itzv4se7Wg z7Jte)RC&lsSZ3X%$uH(<&0{~Se5R;*i5Ks`O2)b=9E%UV%m;Z;wZt`|BqgyV)hf9t z6-Y4{85kPt8UT@bh@q*Kk)f55g|2~_m4U&E8$X3mH00)|WTsWZH5eL)7#Ud^8d{l} z>l&B>HT=01`VFW-3S>iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_ I>zopr0Dw@DhyVZp literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/amordrine_bucket_fill.png b/libs/textures/items/nether/amordrine_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d90f362bdc6400d04ff962e1151e995f761da0 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Q-Dv1tEs7JU|?WqXlPDOPDx%_ zQBhGvMMZ6SeOK9prn;8ahPLjup2@var%jtSd)nL?GiEHEylUax#Vb~<*tv4wjT<-q z|No!yKcNL^8e>V2UoeBivm0q3PLj8~3quF1tOt<8S>O>_%)r1c48n{Iv*t(u1=&kH zeO=k_F|+d-v&XS{@B@XcJY5_^BrYc>C#>wApHnkEZf1e(I&>FVdQ&MBb@0La=?r2qf` literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/amordrine_chest.png b/libs/textures/items/nether/amordrine_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..6877f7ae30b39a3b045e4c08aaf8ac7ca947163a GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(bbkO{<_((iNuS!tdwjv*Y^P5UnLHaPG& zy<|Hs%D%(G@hYp-V+OT%_TAyaKOfcxXfR}7Gf15)v-Xat;mMzw4SxgXHD8c>xKDk` zovF#|jKPzHX7FeCqikV)$I_s>;Vu#anS<5CJ-@Yns>fienj78^pxPAz)Edtu8 zTH+c}l9E`GYL#4+3Zxi}3=EBR4S>iz#L(2r$k58jLf62|%D`a7jh{j&8glbfGSe#I z8Vrp?jEt-d4XsSgbq!2`8vfi0{RY$^1+pPHKdq!Zu_%=xATcwqM9KLZB)JPgg&ebxsLQ0K&zUd;kCd literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/amordrine_dust.png b/libs/textures/items/nether/amordrine_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..f441b4953c40bea6bd3a005590e77e86101683b1 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(bbkO{<_((iNuSstD)jv*Y^lM@bbORz5B zQFL9=Fj3pZ!^6{5Kxe^{C9imdgu;r9cv(3)Sv6O-HApNv<+Un7@K}KA^@I&(2QLIT zb~rXQMd-3HJbA#uS(pFiFVIZY64!{5l*E!$tK_0oAjM#0U}&ss07T{?hNf0VhE_%v zx&~%e1_mo`{1igbkei>9nN|tcU}zj-WMpM%Xk}`yYhVi0@aIKfUF2l7sn8e>#4mLc^M2joL;jn zddr};ok6)my5xVV-|h2{*(bRt^z3I@bb;^T7rx}SRO@?F`MV4bryDZP*?c?6txVEg zG)J<0&cVI!6pHUTu6QtKC)fMcUK9EM9%e6b61xKQC4*{-YeY#(Vo9o1a#1RfVlXl= zG}bi$BJ&VKQ!67wDcptAuMXG!8K`vNANZGBwvVFa>J( zb1U>4P=gf6hT#0PlJdl&REB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7{an^LB{Ts5 DR(y=* literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/amordrine_hoe.png b/libs/textures/items/nether/amordrine_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..65c20f7d262ac2467889b4ec9d6ec8f9ca281cf5 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFIO1_cvJeFE+8w~)5S4_ z<9c#J1GA%}BS&-KO_v72Gh#tyB4I4toUB|@PAaXUtO}=Gc_a_&2s#ET8aUsWc#-2s zg0_f2A)DbP>4r8g0}i7w2Ocp|v4&d-99x4!M6{GR47(W_J}qbavhhqnA9nN|tcU}zj- zWMpM%Xk}`yYhVi0@aI*tk z?&tL&!2*v+pdcSmknaFv*0oMfkYHJXV>(bbkO{<_((iNuSz(?ojv*Y^OM4IUHW=_Q z-{pOEiN|5)f)>^ZhZv@w__w-&$^XOilKI9TZ0$U9EVr1~kmqu{gczdu(qUOULO&pf_#HqZvu64!{5l*E!$tK_0oAjM#0 zU}&ss07T{?hNf0VhE_%vx&~%e1_mo`{1igbkei>9nN|tcU}zj-WMpM%Xk}`yYhVi0 z@aI2Q0X1Y=2%UoeBivm0q3PLj8~3tM8^j#?mxGvCdv7)T!g;s*>< z_e4(v2^M%n0tNYif_w)Uv#xb=f&|M79MgfiflMIYlzyiR$cplGaSY+O?&=rKd%%Fh zM#h1W(O1-f-Q&RinFsB{I8Hu|WBlPhqlz&qap`QwuMx8OUW;SOy??H;IQH06ntz(n zQIAVM_nmf_bdqJUZ#8rIvQ=zpJ~JQx4Eo+FevX&ZvTgdRGN3K0C9V-ADTyViR>?)F zK#IZ0z|dIN0Eo;(3{9_$h>IO1_cvJeFE+8wz)5S4_ zr`QnTzyYKcRJH#pKO)|7=4KyPvz+JL%%Eal| zaox0MBX5HN56fTHTDy$`YgNTKq+5I?8vjbqVZZa|=acO-+5Q;YS;RFzQ*Cau6S~kV zln|#f;b3i7n0qK|Ty@}dxhYY4{dS3a{a?j8WJYgPJ0U78x5SLCJ3}RGKhPG{64!{5 zl*E!$tK_0oAjM#0U}&ss07T{?hNf0VhE_%vx&~%e1_mo`{1igbkei>9nN|tcU}zj- zWMpM%Xk}`yYhVi0@aI@P5LX~AYvbOt_kwHx zYO{h?&9HP&Gtmq`ISo1P&UE$v|NpD5(P;%LVk`;r3ubV5b|VeMN%D4g;mWx1B@D>n z%y)Au2GRjwoFo4@7bIBV5eXFJI{?CrS=Tx_L4sukj_E+%Kqe4xO25+uWMz4}IEHXs zcRja}x50pigC)^_6ko9FFBMDH}zG* z-LqZJ=DOO!4S#cZPF%QRvwLxB_lB57H}zNUKB#P9cR13vr)ja+{m2bI^ISh)Tfwwn zKJL&&uGK$p&yxk(s#@Y2QIe8al4_M)lnSI6j0_Bobq#>XJjBq{%E-{l$U@h^%*w!E z#f_grC>nC}Q!>*k;TjB$LyU~93=OSJ&2KfGmGc7sn8e>!sZXc@G$HFefte z2wTi-SR!5Wf38YRVDhU@Ijm}TE@X3TQyo_)#B=UO_QmvAUQh^kMk%6JHt^p94hZve# z85vp`S?C&=Ss56txbag6MMG|WN@iLmT!W!;h>?+%p`n$jxvqgJP{W^Fq2GWSq(C+V t=ckpFCl;kL1SDqWmFW4ohA5O7>zV2q8W?;jS_o9d;OXk;vd$@?2>_5qi>Ckp literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ceruclase_bucket_fill.png b/libs/textures/items/nether/ceruclase_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..a74f85d74bcd359d5c8d42cc5e341e5bee65c5b4 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=6X7rJ=Pwxs|nfHI0RJ z&E+kf$-Q%1`lobEnb|vgLFwWxLO!?W1JyB>1o;IsI6S+N2I3@nySp%Su*!M>Ih+L^ zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{T?%?po(>~zj6Xl$jH;hF@)oKa>4=j8HbJ38ZyKd zzIr>0+hNVCx4XL)ie{gBc*@LCgSCxmMh8<{AQz7dBZD9dNAA7$)4o9644$rjF6*2U FngHYsLFfPg literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ceruclase_chest.png b/libs/textures/items/nether/ceruclase_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..72990e8478833e0db51b7eea35c6a57d2591151e GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFQ&rUP{YnLxZL{Z1E1~{k%I^L(R4qHwB~-Ce zXRXVeMHjW$e@isae?n4$cBz)QMwFx^ zmZVxG7o`Fz1|tJQV_gFvG7m8{wK6iaGP2M$Ftai+SaIX05Q>J}{FKbJO1K6?;}9bw zD?>voQ*&JdQ=o=Fw?e-GHAsPM2+mI{DNig)We7;j%q!9Ja}7}_GuAWJGc+*xQnV1L Oiow&>&t;ucLK6U=hmqa@ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ceruclase_dust.png b/libs/textures/items/nether/ceruclase_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..683ff2d0fa3203c4d49174886dba547768aab9e0 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF)GD>C9`<>a)~T-nwjvFMc7sszDf0jk#%Hkci}5a8J1 z*whrE%fj$bf&FK}D<`0D8B|MLBT7;dOH!?pi&B9UgOP!uv919SnTHsfS{WHy8CmEW zm{}PZthn)02t`9~eoAIqC0v7{afp$Tm7$@PskyF!DNw_oTcO{88l*rr1m~xflqVLY mG6W=M=9TFAxrQi|8S9zq85$UTDOw0r#o+1c=d#Wzp$Pyd2z@93 literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ceruclase_helmet.png b/libs/textures/items/nether/ceruclase_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..724eea471f162bbe3727414693fdd49102903837 GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFg@6oWED7=pW^j0RBMrn!@^*J&OHA8Q3*>O-ySWtu=>Q-;z#to! zSq>5`@Q4Ho@*MzS#;j|doFKun0>^ZqZXgqgH>Ka{0@P5LX~AYvbOt_kwHx zYO{h?&9HP&Gtmq`xz2QT4LR=r|Nk!(HwL+Yu_VYZn8D%MjWiG^$=lt9E91hKFd&CB z-_5NUNCyCM0>kFWtMfpD1s;(=LB0bZ%$RkplM^IZR^XTp)D2_;@uu`UT|icpr;B3< z$Mxid24*)$M>aM`Mm9FZ)MQ6TMTO=-56^&$febq08A=?1s*Bce1nR%y5G@p8)l5qe z5KAawGrYmo_^g4&NX@}_T}zar4#PrL-i1s`0gM~=Dljnot6*E|b^G3Ype?E;t`Q|E zi6yC4$wjF^iowXh&{)?1h|EI_O|6U!t&A*m4a}?z3|8FuDTJaSH$NpatrD)m&^W}% z$jZ>r%G6xfz!a$A&#lmJKn+qL8-nxGO3D+9QW*jgGxJLH{9Hp6%8d0)^$ZORz7#D4 Ps$%eT^>bP0l+XkKOniWs literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ceruclase_ingot.png b/libs/textures/items/nether/ceruclase_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..5278668faeff7269e1a58a8ffb6154911d00dcff GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFg@6oWED7=pW^j0RBMrn!@^*J&OHA8Q3*>O-ySWtu=>Q;hU{JgJ z5o8``fkz}zknaEpGiF`uEal|alN$nAa8>K5A$8# zSC@DkW-e%9op6X@>WP1=8<_k*JTIAV{K3}FBgb-!$y{ggtES2~Jg0b0y;?TqUS=7O zPqb;V{DjT-QrwC@3OWit+y47=HRH8|T>H%9OJ@UZP%UwdC`m~yNwrEYN(E93Mh1q) zx&}aG9%5)}Wn^e&WT9(dW@TWo;>J%Q6b-rgDVb@Na1DmWAx1`4hK5$A=DG%^Kn;Ix zg?-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIF>M Bil6`h literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ceruclase_legs.png b/libs/textures/items/nether/ceruclase_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..103486d9e0ccd4147b487cb2ec23a7678db96291 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GRjQ{D7h3 zmhV-NV1Y*@P>}Bc2s36~>*NFpmK8Xr19bzLK)fmaP8X0B>FMGa!f`#d_aN^910JTg zyazJb3d}pEuwE)@e6!!@ZOy7xdoD0KJyCxu=5qIUCY#{wlUO_QmvAUQh^kM zk%6JHt^p94hZve#85vp`S?C&=Ss56txbag6MMG|WN@iLmT!W!;h>?+%p`n$jxvqgJ zP{W^Fq2GWSq(C+V=ckpFCl;kL1SDqWmFW4ohA5O7>zV2q8W?;jS_o9d;OXk;vd$@? F2>^)2k1+rM literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ceruclase_pick.png b/libs/textures/items/nether/ceruclase_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac082339015a59da632cc6bfa82b6f72bdefcf0 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~AYvb_!@hljQC0!j*C1OBj&D zneXOS45R~qxPam3?BnM_f(0ItKta9(Ak3I`t&WX z2*-8Z-h;di20YAf`QI;@!l<>2fuAkIe8myI4&DkQE6-@}K)-EM85U@)U~sxM^=MB_ zcFfttPD7K5);*gJEM3mW5ygK$M`-e4-8FK$`WNOtmv%6&63O{9_1nJ8$(*0n>UP$1 zoO_sj_8`zc)e_f;l9a@fRIB8oR3OD*WMF8lYXC&%A%><_Mut{K7Pu4`Zl)bQt4=r^DSDUc1p`DrEPiAAXl0g0J;C3=3Y dAqr*2dZv1Y1_ob>76Mf@P5LX~AYvbOt_kvkL zt84#i&9HP&Gtmq`ISo1P&UE$v|Nr0KII|I`h_NKdFPOpM*^M+1C&}C0g)8I2moOlQ zGvCdv7)S>IaRb9!b+sapV1Y*@P>}Bc2s36~>*NFpmK8Xr19bzLK)fmaP8X0B>*?Yc z!f{>IcO&ls1CHjU#w}kMme@=Xz9bj?wYkT3uY`_bPpY(%LuB!0^W&P=+yvy-)p<@x zeVzA#<931nXG>orlj^1Nnh$RTvV5wW*pe(35_IP9VPt2iv76C0% zEpd$~Nl7e8wMs5Z1yT$~28PDE20&yUVrXh*WN2k%p=)4fWni%4#!n#>4Y~O#nQ4`9 z4Ti=cMn+bKhE}HLx(22|4S#NhegkTd0@)CppH@mdKI;Vst0Dahv@c;k- literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ceruclase_sword.png b/libs/textures/items/nether/ceruclase_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..0be685b2b538c10f4d142c3ce463ed8130323ca4 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~AYvbOt_kwHx zYO{h?&9HP&Gtmq`xz2QT4LR=r|Nk!(HwL+Yu_VYZn8D%MjWiG^$=lt9E91hKFd&CB z-_5NUNCyD%1cv2LO_V``1s;(=LB0bZ%$RkplM^IZR^XTp)D2_;@uu`UT|icpr;B3< z$93J_gQ5)v9L}eY7Bk812~$6CopqP9c%iWSH^w5)Kkk#RCArMF6|z@s^Gq(TPmAL{ z73?~8u)b8h>fUhqH;>Y}P%#PZvg$KJvg@aveCoI1alYEB@669D+10aqIQ{}{Q7v(e zC`m~yNwrEYN(E93Mh1q)x&}aG9%5)}Wn^e&WT9(dW@TWo;>J%Q6b-rgDVb@Na1DmW zAx1`4hK5$A=DG%^Kn;Ixg?-L15RjOeSEA?V8lq5UtY@lcXkhTA RXdzG)gQu&X%Q~loCIBbDjcEV? literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ignatius_axe.png b/libs/textures/items/nether/ignatius_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..4a5df5c7898b673171bf19f155a0b1dbe416b940 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF2ZOJ)!>qr|@==*v0LO)v@)TRUpZP=kcrI&>{ zEMzv5hkUY|;j%yzU*+AG4)ZLJ=w1EzkPOrI3AL=>zH!_NpL@Pqj>Cj~?JBPHl|Y+R zOI#yLQW8s2t&)pUffR$0fuXUk0T7vo7@Arc8Cn@x=o*+=85pd%@lyyzLvDUbW?Cg& zgQ0PVk&%_5p_Qq*u7N2~!=GEB-+&sVKsE&DrFVdQ&MBb@0Ef?z=>Px# literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ignatius_boots.png b/libs/textures/items/nether/ignatius_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..64b8890b945f24b1c0dfbe68381a338db38180a5 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFYw#2j@wLlrpd^fjZAPoW^7|u-# z2XQzHJR*TK-vJP2%(~Xe2@)(Ta7+gp1!My8rt~{qKvsySi(?4K_0pb;oDB{<&X;*7 zt>!DZ!(v;&@K8+P`~9QW@@u!4OjvS&okgdArMGX(SxGxLuDw(C&j_B`To%6U{g%~B zKP2eJ^j;JFPo=Ijdcxx z$UMZ*)XK=v%E&_3z|6|PV8xA}LMR$?^HVa@D&ZOojYEu#tPBmUOwDx-Oo1By+zR~$ y)F1`2Aviy+q&%@Gl_4N8Gp|I?&oxA$%vjG<&(Of&OVL80Dh5wiKbLh*2~7ZvAdL$E literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ignatius_bucket_fill.png b/libs/textures/items/nether/ignatius_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..d4258d46a368b1c626f49914c35e016c0cb1351a GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=5`*@sn!PCpQ&NZz-JJ zRe7P)amD1iwX-@lF6e)_DEa-i+F55e-T@#8xOFNis zzVRwnQrKb5)!k+K%_nlBS;M#SI;k4yG<2#YNK8H8Ai}^f$&SmAb^FIFK&q3Y;3Ovkb z*$i747nL=J=rH&k_;=dm!^&6v{^~amh%*L-EMlD5lrnvZI{S*rOSwO-xfO0)@bys? zXTaVs86m3*-|jsh_(Z1l=7jvB8)loUtkWjFO+Uc#fobn+uBk>HdrX0Lsg}4#l%yn< zq*^5xr2;7iBLhQYT>~I84>2^gGBUI>vd}d!vobJPapR{DiiX_$l+3hBxCTSx5F;Zi zLqjW5b6o>dpoTxULcakuNP%n!&QB{TPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FF@ N!PC{xWt~$(699~6lQaMT literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ignatius_dust.png b/libs/textures/items/nether/ignatius_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc7aae8cdfc9073832cfeccffb561f526fc1d16 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFO=~6y!Sq!i-thIypgtWd)AuK;1wl5N}Gq(*)G<1*r9<>X}5T-nwjvFMc7sszDf0jk#%Hkci}5a8J1 z*whrE%fj$dfkU$B@C=aYswJ)wB`Jv|saDBFsX&Us$iUE8*8qsjLkvx=j0~-eEOZUb ztPBiR-1sSkq9HdwB{QuOuEEea#K_3X(9p`%T-U%9sNv78&~HEuQXm_G^V3So6N^$A l0unRxO7#3(Llnx4^-T2)4Gg{%Ed;7!@O1TaS?83{1OPW~dv*W- literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ignatius_helmet.png b/libs/textures/items/nether/ignatius_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..5df30a8245587d87e54695993c0f271db27fed07 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFYw#2j@wLlrpd^fjZAPoWs7z8gQ zHUJr%1s;(=LB0bZ%$RkplM^IZR^XTpGz!QB;!Wvyx`3>3PZ!4!j_awt7kL{DI9w8& zi`Fv7lrZ-2UC2w=^cptAuMXG!8K`vNANZGBwvVFa>J( zb1U>4P=gf6hT#0PlJdl&REB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7{an^LB{Ts5 Dy9kd; literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ignatius_hoe.png b/libs/textures/items/nether/ignatius_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8dcfa6f158c53127927dfa7f416072053da917 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFUO_QmvAUQh^kM zk%6JHt^p94hZve#85vp`S?C&=Ss56txbag6MMG|WN@iLmT!W!;h>?+%p`n$jxvqgJ zP{W^Fq2GWSq(C+V=ckpFCl;kL1SDqWmFW4ohA5O7>zV2q8W?;jS_o9d;OXk;vd$@? F2>>rAf6V{@ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ignatius_ingot.png b/libs/textures/items/nether/ignatius_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..c3cdfb21d62816c034b47f76ae0c42425fb45c30 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFr(-h;di20YAn zd0$=PahSQFg>}LqhN&n1t!`lQ|M0wIzVQcJJC7X8EhclF#jlzw-|(E`IrVDUlzW+F zJU-E;#qtw2-%D{T`Y7lq_-y;{&()0A4sz`?k1w4Kv_ZARHKHUXu_V=^Xqw+cNRb-F-%pMjd}HK4~+G+NjpF@A|6A7q7^kiz#L(2r$k58jLf62|%D`a7jh{j&8glbfGSe#I8Vrp?jEt-d4XsSgbq!2`8vfi0 z{RY$^1+pPHKdq!Zu_%=xATcwqM9KLZB)JPgg&ebxsLQ06Ynb Am;e9( literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ignatius_pick.png b/libs/textures/items/nether/ignatius_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..b74957a6be2b97cd9503a0a202617cdbfdb14026 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFAQOl;rQhiSvSK}5978y+ zyY?OwY;fRUK6%)F=Vrzz3+;jz2RAbBFH5}5^t`8LldzM(Pxq;_xQr(s+Qys988P>F zOwo&;!=0DT9c+@#<79s*8KpOI-nmNmaEppnc7CgzA3yoc>sQOj@|-=&DDor+&?40m z*NBpo#FA92WMyb*WooW#U<%am=T_)9pavAQOl;rQhiSviv+<978y+ zCnq>CHZ?UR%nJ1M6!hViJ%Q6b-rgDVb@Na1DmWAx1`4hK5$A=DG%^Kn;Ix zg?-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIGp` Bg5v-H literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/ignatius_sword.png b/libs/textures/items/nether/ignatius_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..a119b5918fd06fceeeb10a03283beaaa9dee4050 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFnC#`KbyK?;<-maJ5)avE~no$2bv9V!3+|2Lg$D-Be~SQ6wH%;50sMjD8d6w?pszAF{OI#yLQW8s2t&)pUffR$0fuXUk0T7vo7@Arc z8Cn@x=o*+=85pd%@lyyzLvDUbW?Cg&gQ0PVk&%_5p_Qq*u7N2~!=GEB-+&sVKsE&D srFVdQ&MBb@047|RH2?qr literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/inolashite_boots.png b/libs/textures/items/nether/inolashite_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..309fb66d0c8f2094c991be54d5a39a64dda95392 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFaqb zcFK+2Iwhh1|NsAJwzmT)!B`UH7tG-B>_!@hljQC0!j_n}qZY{F%y)Au2GSdV_yfb0 z7#B8>V1Y*@P>}Bc2s36~>*NFpmK8Xr19bzLK)fmaP8X0B?djqe!g0N{=OFI^1s>+P zyh$9)3Th0cjVp8xEdIUz(t+jcqsrvOZyr#WW4;v9mUm#Dq{q6KX8ElXb}=tmcqwa7 zL`axGq54^oGn?BxuWYV7FZwhxuQ2KTmCpLTYff@bY*T8A23n(9;u=wsl30>zm0Xkx zq!^4042^XSfXF<=(A3Jv(8|a{*TBrmz+lCVpF$`aa`RI%(<t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^ HP6OX--92ww|DsuWYbVw0S>SSS)iYh7ML)4|n1uy<=18QgRboFyt I=akR{0LD;5IRF3v literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/inolashite_chest.png b/libs/textures/items/nether/inolashite_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..5758d8600bf221baba45dad1ec27d02b87c67689 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFqY-`kuFh8&l9 zedL)vb~08KFmuE{;JRBsHF&>%i$If_i@n38r5vlR<$Q1CDejwPdfVyimUU%njH_QW zt~I84>2^gGBUI>vd}d!vobJPapR{DiiX_$l+3hBxCTSx5F;Zi zLqjW5b6o>dpoTxULcakuNP%n!&QB{TPb^Ah2uRG#E79|F4N)jF)-%;JG%)y5v=FF@ N!PC{xWt~$(698nUjIaOz literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/inolashite_dust.png b/libs/textures/items/nether/inolashite_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..eba62950fbae96d660df782da3a2eabadb006395 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFka z-8vxzbn+Aba*o~8mi3zjT-#UmsXR%FD>%E`&9xw5T6V$mtDRSAN}0#vUjY%n``A;7W2 zv8gFSmxbZU0}jr*{4aljW~!FBMwFx^mZVxG7o`Fz1|tJQV_gFvG7m8{wK6iaGP2M$ zFtai+SaIX05Q>J}{FKbJO1K6?;}9bwD?>voQ*&JdQ=o=Fw?e-GHAsPM2+mI{DNig) mWe7;j%q!9Ja}7}_GuAWJGc+*xQnV1Liow&>&t;ucLK6TJ+I@Hc literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/inolashite_helmet.png b/libs/textures/items/nether/inolashite_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..b037be572f94cbeb322f2b1b12b3ed5eec2d6843 GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFU@Qsp3ubV5b|VeMN%D4gVM|QgQ48d7=DWES1L+Mwe1L&l zs^}|7u)re{D9CpJgc-B0b#j6P%L*LRfx3ZAAl{UIrwho6@pN$v;kcgKdy@Bn0SC)l zzC8k54SYIF8MVC_JqrJ?Rmrwzo`10*NAv%xUf+U3MUl6+uD{qbzx&yNIT9v}N20cM zsB|#CG&%fqLEw^x?^(}0SIA!YdvnkGE4S=EGMRaDY?s`mWe>DRwZt`|BqgyV)hf9t z6-Y4{85kPt8UT@bh@q*Kk)f55g|2~_m4U&E8$X3mH00)|WTsWZH5eL)7#Ud^8d{l} z>l&B>HT=01`VFW-3S>iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_ I>zopr0KHz0=Kufz literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/inolashite_hoe.png b/libs/textures/items/nether/inolashite_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..831e6eb96e4cfc364bced6468f48625576068452 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!uj#$(l#0d;bWzWfg1PeSOfr5MoK$tP>S|=w+u&lr_9jF_~1maEUce;SAC{Gv15RU7* zJsSlNDDW^pRom)1hw;HChLbGw+C(*ss}4MPR=R#OgQDo?pvu_Pl*B|o#g|tX%XB(! z{M~sy9UD{lN0LeY?$pOTqY3D;m~9Aac- zWoT$+YOZTw3e@oDR_HgN1}TsY!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;-iWUM@ OF?hQAxvXJ}{FKbJO1K6?;}9bwD?>voQ*&JdQ=o=F zw?e-GHAsPM2+mI{DNig)We7;j%q!9Ja}7}_GuAWJGc+*xQnV1Liow&>&t;ucLK6Vr C*NdY7 literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/inolashite_legs.png b/libs/textures/items/nether/inolashite_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6d96e26faab89a5bfc40d15bbe3e739714f28b GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF}Bc2s36~>*NFpmK8Xr19bzLK)fmaP8X0B@9E+g!f{>qbR*{h1s)cM z&5m(r8Ir^Ub~U_ZxmiE+pEGk~^MC!LT<3p^K9e|c?jk(HsL zm8rR|fhkbKpIf2dfEuJgHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w L>gTe~DWM4f0!obF literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/inolashite_pick.png b/libs/textures/items/nether/inolashite_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..42a46006a2ace01dc3a011eb633d35b79a5742a7 GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFTWlThv#disYm%~fPRD&%vWEj%5+@qzSZ`4jo}4=!`o zdNwb;3batQ#5JNMC9x#cD!C{XNHG{07#iyu0Fil!p{bRTp_P$^u7R1Afx(I!KZQ^< zy%nLpA4{-mmX|(kTE13OPTUt=+uPxI=>wv93t=0Y??4%TPw1jfjcr3o0)Oc6S zX4k2?Uk>f4`j#75Q@UohtK)(LX-l`ncU;xC{56?vz4=qkUZ4%CC9V-ADTyViR>?)F zK#IZ0z|dIN0Eo;(3{9_$h>_!@hljQC0!uj#$(l#1j}cF4SKL5-jkD1PbyU0Aa?gYn_}R!LkC!bf9h^6NopZ-{}IfVm)0PLpZLh z_8jCrV8Frr@Upqu#9w`vSUYw(xOG^0n!k9#`=I}9qhgVvgXY$fJmc8>ct+_Da=SA` zpSRiBCiJpQU$ikiVA<2%Rs!$)#Qi@P)UgH{1$A;Sd=cUO_QmvAUQh^kMk%6JHt^p94hZve#85vp`S?C&=Ss56txbag6MMG|WN@iLmT!W!; zh>?+%p`n$jxvqgJP{W^Fq2GWSq(C+V=ckpFCl;kL1SDqWmFW4ohA5O7>zV2q8W?;j Q0tF3&r>mdKI;Vst0B9ACn*aa+ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/kalendrite_axe.png b/libs/textures/items/nether/kalendrite_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d10470397b572b319472a4ecd0547d5c2b974e GIT binary patch literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFu_VYZn8D%MjWiG^$=lt9TmJfy z13(UEzMESykS+k?0EX<%&!Rzs1s;(=LB0bZ%$RkplM^IZR^XTp)D2_;@uu`UT|id0 zr;B3<$93P{je-pZJj{!`!ul32mzp`f8-!N;u(hFh}vE^F=ZD zvp?gUpUmYy5X$*3W^>YIptY(ct`Q|Ei6yC4$wjF^iowXh&{)?1h|EI_O|6U!t&A*m z4a}?z3|8FuDTJaSH$NpatrD)m&^W}%$jZ>r%G6xfz!a$A&#lmJKn+qL8-nxGO3D+9 nQW*jgGxJLH{9Hp6%8d0)^$ZORz7#D4s$%eT^>bP0l+XkKItZB4 literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/kalendrite_boots.png b/libs/textures/items/nether/kalendrite_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..1511cb7e11ac34d9936014c67406c01dd419a6aa GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFYAa|NsC0*pSHzD9Tt8slu#NU*HHF&(HI$OPg|>36z-tWZxE#}JO|rQN4_8w_}yAM?&J z;a-x|xJpN0*MGky1uixxCq3;yA@0zkle|nS@L*+6+1joz3s;$ST7Ih#OgFv2Q@k{z zTxoY#w1AlA+2WkH<{$t4-@z!y&OZ5kPthBo1*#>k5hW>!C8<`)MX5lF!N|bSSl0lE z%tH)Kt&9wRu zmNpf)c2smvXqvLFdgqMJ+4K4rE@v zL>4nJa0`PlBg3pY5H=O_Iu2n!j|S`g4Zp9LPnl0jv*Y^lM@cG&$z5D){r4~ z^u)>_X@@l@RvI%a7705)Jf-HO!Pv$yql2L>kcr2Ikzp+}yS~#aNfDrK22WQ%mvv4F FO#s3WKHLBR literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/kalendrite_chest.png b/libs/textures/items/nether/kalendrite_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..a79ca547253e49e9eb55ab0fe4ba52224382e9e2 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFr*-h+Y-20Vx7 z@J>>bU0~p-!TrOE@wdM7DRKMKbj}}VT^IwMH?!PfOEH^jC|YN18+PdB@re^V9+a|0 zuHWOgUi`@I6F~>sBehvoejWBrD)Y?)FK#IZ0z|dIN0Eo;(3{9_$h>xzbn+Aba*o~8mi3zjT-#UmsXR%FD>%E@V|xw5T6V$mtDRSAN}0#vUjY%n``A;7W2 zv8gFSmxbY>0{hQ`S583RGN_igMwFx^mZVxG7o`Fz1|tJQV_gFvG7m8{wK6iaGP2M$ zFtai+SaIX05Q>J}{FKbJO1K6?;}9bwD?>voQ*&JdQ=o=Fw?e-GHAsPM2+mI{DNig) mWe7;j%q!9Ja}7}_GuAWJGc+*xQnV1Liow&>&t;ucLK6VDoqdY{ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/kalendrite_helmet.png b/libs/textures/items/nether/kalendrite_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..622cc614d9861f503620c604f2383e13c0aefdaa GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFO>3N{$JLH&<*3ans^$EI#G*eCq6rxovyj zYdDyvEx2>0;ab=OU%8e|YJ%Q6b-rgDVb@Na1DmWAx1`4hK5$A=DG%^Kn;Ixg?-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCIGG-h!6k( literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/kalendrite_hoe.png b/libs/textures/items/nether/kalendrite_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..6c25da3d7548cef128e6b6f5291a299ed6dcc06a GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFYAalXUaree6BWL^J&4G~~ED)7Ag~|9`OY)h(bp#*!evUYZu#p+ z4gfiv`EG8-K)L{k6BxF9y|4l#Sl|%}6y!Sq!i-thIypgtWd)AuK;1wl5N}Gq(*5x*}p{4}So=Ijdcxx$UMZ*)XK=v%E&_3z|6|PV8xA}LMR$?^HVa@D&ZOojYEu# ztPBmUOwDx-Oo1By+zR~$)F1`2Aviy+q&%@Gl_4N8Gp|I?&oxA$%vjG<&(Of&OVL80 ODh5wiKbLh*2~7a?MTnRH literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/kalendrite_ingot.png b/libs/textures/items/nether/kalendrite_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..5364ff9d7cdc62a0c59021c868280eee8508250a GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFr(-h;di20YAn zd0$=PahSQFg>}LqhN&n1t!`lQ|M0wIzVQcJJC7X8EhclF#jlzw-|(E`IrVDUlzW+F zJU-E;#qtw2-%D{T`Y7lq_-y;{&()0A4sz`?k1w4Kv_ZARHKHUXu_VYAalXUa{|NkGAW-1GmU@Qsp3ubV5b|VeMN%D4gVM|QgQ48d7=DWES1L*=Fe!$RQ z=J6OLSl|%}6y!Sq!i-thIypgtWd)AuK;1wl5N}Gq(*iz#L(2r$k58jLf62|%D`a7jh{j&8glbfGSe#I8Vrp?jEt-d4XsSg zbq!2`8vfi0{RY$^1+pPHKdq!Zu_%=xATcwqM9KLZB)JPgg&e IbxsLQ0Ca$j!vFvP literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/kalendrite_pick.png b/libs/textures/items/nether/kalendrite_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2b4adac0025a37e8142ec442123aa1fe6a9d69 GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFYAalXUYv%|tW&r%G6xfz!a$A&#lmJKn+qL8-nxGO3D+9QW*jgGxJLH{9Hp6%8d0)^$ZOR Tz7#D4s$%eT^>bP0l+XkK|A&-p literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/kalendrite_shovel.png b/libs/textures/items/nether/kalendrite_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..6094f09dca3cfc737a1ee60c3aa3f6d1f87ce711 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF0OAIQSKZ1kAi)BUNT49!0T5=)y4J}F5-cllOb6-)GJ$wg`kgKyE6mfyF@)o~ zZ}&#Q0|p$-u9I(ZonwemOJIp_`^cqdTgB%gDAh8LJ*nl4>hh?&&2o*~qZBG{+?`bN zZQ3PMn`VpPLpi51`dX`IN-GA36|I=o>Houg%?BpYOYB-J)^oiD+MrtE8c~vxSdwa$ zT$Bo=7>o=Ijdcxx$UMZ*)XK=v%E&_3z|6|PV8xA}LMR$?^HVa@D&ZOojYEu#tPBmU zOwDx-Oo1By+zR~$)F1`2Aviy+q&%@Gl_4N8Gp|I?&oxA$%vjG<&(Of&OVL80Dh5wi KKbLh*2~7Z_>5AF_ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/kalendrite_sword.png b/libs/textures/items/nether/kalendrite_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9050ce71db5609c8b50f7d3f4a712a98f555c1 GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY1WuM)W`dhfA` zmrBiAlXUYv%|tW&s01O{d|M-AN+j)kqhB8o~*2bmm#0vs;5N}fnCNihjyTq!D+5Mr9ba+1BvqVa3T zDlSW|hOcarTn#A_E-oRg2cB&bWn*o+>fs|8$|k-11joie7ltJ63rrlm3|96W?rI&~ z(}1?AmbgZgq$HN4S|t~y0x1R~14Cn710XUFF*LO@GPE+X&^0i#GB8+i zOqn-t-m+!ORI~yb$2n z;n>s^q07SXQh`IV=8d5J5hW>!C8<`)MX5lF!N|bSSl0lE%tH)Kt&9wIrV|NsBL?YdzLP=c`}$S;_|;n|He5GTpo-GwbNZAUGT!2Ai)BUNT49!0T5=)y4J}F5-cllOb6-)GJ$wg`kgKyE6mfyF@)oKY41Va1_K`E zyS%S1@i@#}(84<55X00H|5i6J`G0s`GT-=vt(`}Xzm0Xkxq!^40 z42^XSfXF<=(A3Jv(8|a{*TBrmz+lCVpF$`aa`RI%(<t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^P6@P5LY0bYsL8gbnX8Y zYM&-CY|duzG!xD6lhcsn?o3zz|Ns9ifqNN1MT{jue!&b5&u*lFI7!~_E?gNGzJvie zocV5U#XuTp1w#Ns%Ii1gAi)BUNT49!0T5=)y4J}F5-cllOb6-)GJ$wg`kgKyE5*~r zF@)o~Y41hB1_KV~!)zCV{%5LZ%w2G~BJaWSWQ%nH=l`gDe;~x5prq5OJtu4J8M#aI ztSc9orF+&*R=epY;QUg#Bk;ON3;#5Q8+sXk9_&fo{-XK_H)GhctqOkE8;t(FJRd(p zmD9=j?f%(7`&3I@BT7;dOH!?pi&B9UgOP!uv919SnTHsfS{WHy8CmEWm{}PZthn)0 z2t`9~eoAIqC0v7{afp$Tm7$@PskyF!DNw_oTcO{88l*rr1m~xflqVLYG6W=M=9TFA exrQi|8S9zq85$UTDOw0r#o+1c=d#Wzp$PzFL6=bg literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/midasium_boots.png b/libs/textures/items/nether/midasium_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..d8969a7425a245e3bf6d8a52f79e48d826a27212 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFYw#2j@wLlJMzMESykOmsd@PXmf zn}B;D!2*v+pdjA?5N6D}*2xJHEGuwK2kHhgfp}B;oh~5D*VDx@gyVXx?@8VR3OwEB z1x%6(LEG)w50LAR$5 z_sis^>+P1TGX3~@C*y&)Y`0uP4*|W+pjzS@QIe8al4_M)lnSI6j0_Bobq#>XJjBq{ z%E-{l$U@h^%*w!E#f_grC>nC}Q!>*k;TjB$LyU~93=OSJ&2N6)a zWKVA|n%i5oY4ycZ?B*-tA!Qt7BG!Q4r+uensgH_f8$l)yT zh%9Dc;1&j9Muu5)B!GhKC7!;n?Dv?t`K3+1&kwQz3K@I4IEHXsPfj?%KI70OX$O<; z4{zp*aXYNJX6ot!RAGV`Q?+8I1u{an^L HB{Ts5W(Gkn literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/midasium_chest.png b/libs/textures/items/nether/midasium_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..3783eb793488e124b2cadab4067eb6b1acf5efdd GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFur)B-u2`EG8-KpJQ)!v%); zjFK9VV1Y*@P>}Bc2s36~>*NFpmK8Xr19bzLK)fmaP8X1s?CIhd!g1Z#_cm{X14lEj z#tDWM+yajo(jPIne4p?7zHW?)FK#IZ0z|dIN0Eo;(3{9_$h>Eal|aXmTV0Jj9|0v<)z z6%7-$T|7KIO$BroELrl3M@T5F$cUGflap0*Wm|*9qElY05(JM0s9sOlV0Q3AfMbVa zQ&WU43&WEK9GrFeU;YBkR4s9hC`m~yNwrEYN(E93Mh1q)x&}aG9%5)}Wn^e&WT9(d zW@TWo;>J%Q6b-rgDVb@Na1DmWAx1`4hK5$A=DG%^Kn;Ixg?-L1 l5RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~loCII7teI)<@ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/midasium_helmet.png b/libs/textures/items/nether/midasium_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..e619a68ac9f8c080c96ec4cd9ba7185387b341dd GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFtvGCP$F zKE4a|ifHt`uDpG*Jp0$?TM5Ngz4yc?aKzWB9Jm3rK()j*q9i4;B-JXpC>2OC7#SEE z>ly%&d5EE@m64&9k%g{-nU#UTiW@(LP&DM`r(~v8!ZjEghZq@I85&xdn(G>v0yX@( z75WXRK?-C;aDG}zd16s2LqK9?UWuNcYluRbv7V`(p@G4dqJ=@P5LY0bYsL8gbnT}} z4F6ZCZO&%!G!xD6lhcsn?o3zz|NlRiU-BlPBF2&+zhDN3XE)M7oFs2|7p{y8U&4SK z&U`nwVjvB)f+2xn_u5-WK!ODxkw8Jd10c+pb*+;VBv@A9m=4qpWCHP~^gCTZR*M@L4E=0MMhjEBU^1O=FkC45<#6*o2c8H6e_H6<_x9&~Ws(4g4N5uq12 zAyDv0!s>(+7VZ=?hY|xXhpk)(<4aI?J(Dn&EUho4=V=LkG}w)e_f;l9a@fRIB8o zR3OD*WMF8lYXC&%A%><_Mut{K7P zu4`Zl)bQt4=r^DSDUc1p`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76MfVwig3-|7Y?{}0bg<{N*owe!fa++s4Q-uO}Up@ z#^V!hS}Z?d^Suc?jk(HsLm8rR|fhkbK zpIf2dfEuJgHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~DWM4f DKfjB& literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/midasium_legs.png b/libs/textures/items/nether/midasium_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..a2037a4bc6cfbff116f13841b66655d3b91bf9a4 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFo5-7-b0E8K{u61&P1j`B>(}B8yOd#Hrey0n_iu81G4B@z*>wA*7!GOox ztmAT8!wO*$wFd_oCcgN$dP10u!y)--yOc%Z5n_zD8b!WlRNG#9&n)5E@psD(lWfyN zI?6`EeKS_;#XR#efA~z^z4h*YYk|0U{=6%poN=ob>j1sUpjzS@QIe8al4_M)lnSI6 zj0_Bobq#>XJjBq{%E-{l$U@h^%*w!E#f_grC>nC}Q!>*k;TjB$LyU~93=OSJ&2^ZqZXgqgH>Ka{05ljNbMo;HP9 zu@f9Q&a9YmfaBV^eUlm;8CG})Y+yK)P|^~mqQa4CVRUFs+XV*6KK3*bkK3<-mZ+Av zMwFx^mZVxG7o`Fz1|tJQV_gFvG7m8{wK6iaGP2M$Ftai+SaIX05Q>J}{FKbJO1K6? z;}9bwD?>voQ*&JdQ=o=Fw?e-GHAsPM2+mI{DNig)We7;j%q!9Ja}7}_GuAWJGc+*x SQnV1Liow&>&t;ucLK6Tv-HSf} literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/midasium_shovel.png b/libs/textures/items/nether/midasium_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..88051e5337804479822ca48e2238f1330b5bd372 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0bYsL8gbnX8Y zYMZkeK22iqG!xD6lj}@Z*O24>|NsACzkTb0iWp0R{DK)Ap4~_Tagw~tYy#qQw{YK@A$dM4Z$FE_x0aoMX^mkG&=%Da z*NBpo#FA92WMyb*WooW#U<%am=T_)9pavS|=w+u&lr_9jF_~1maEUce;SA zNKY5X5RU7~2@K3`jvQwdmT)X&ovO&=rmD`^(V`jQ&=6=TaY(?(lFj#Tprx1#U-29Zxv`V-J zL*o!5BP&BgD^qh_15==eKes}^0X0a0YzWRzD=AMbN@WO0%*-p%^K%VRC^ObG)iX3O T_)@eGsEWbU)z4*}Q$iB}U4w-^ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/sanguinite_axe.png b/libs/textures/items/nether/sanguinite_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..391ee5cb34d1b0cc48e17856e7287d9fb783775e GIT binary patch literal 512 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF6BAcYlS12uiIZ0;PDnHH)%wK2!s)`LI#rV)bcWT+ z7H!Q2mXILd%X1rgT-3e_Z0KMJ4xA(rFkRuWk?Qi54s8tA<=CbsOlZvJH)vv!m{KEg zq=~iRnVXh@l(SBNfC$UVh8w4W4!ZkDaODhx_&%WJswJ)wB`Jv|saDBFsX&Us$iUE8 z*8qsjLkvx=j0~-eEOZUbtPBiR-1sSkq9HdwB{QuOuEEea#K_3X(9p`%T-U%9sNv78 z&~HEuQXm_G^V3So6N^$A0unRxO7#3(Llnx4^-T2)4Gg{%Ed;7!@O1TaS?83{1ON*L Bm0|z@ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/sanguinite_boots.png b/libs/textures/items/nether/sanguinite_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..50372439383ab896363ab6a5e1d19bb20dd43123 GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@ki@~yI;mWo}i3c4NfyR1moT|5_G=mx<>^5VeYiQzf- zqIBk8ppB{}t`Q|Ei6yC4$wjF^iowXh&{)?1h|EI_O|6U!t&A*m4a}?z3|8FuDTJaS zH$NpatrD)m&^W}%$jZ>r%G6xfz!a$A&#lmJKn+qL8-nxGO3D+9QW*jgGxJLH{9Hp6 b%8d0)^$ZORz7#D4s$%eT^>bP0l+XkKw|$J* literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/sanguinite_bucket_fill.png b/libs/textures/items/nether/sanguinite_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..6e42e69d25b257e4620df30e7ef52c4ca9efa93e GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=1_o*e-B!J>=%D^Y!iX z_iqaen-m^CJv@AFPR@$l+_ky6&;Ewb0IFjw3GxeOaCmkj4a7Bhg|8N0I7o+K&3ZQNVPgg&ebxsLQ E09G$MQ~&?~ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/sanguinite_chest.png b/libs/textures/items/nether/sanguinite_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..1c0518c603a1cedf87837bb0682a1d8158de75c3 GIT binary patch literal 517 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0bYsL8gbnT}} z44bnV<})zlFfjb*=ikY|&;(@s|L^hLF$JiIu_VYZn8D%MjWiG^$=lt9E91hKFd&CB z-_5NUNKXLb3k+^0sgpp01s;(=LB0bZ%$RkplM^IZR^XTp)D2_;@uu`UT|icor;B3< z$936WL#{&s0xs$K8)n~?zsz=|&QouL+nfKqJsig_J^P-?qOTx#UB11s(#MdwVTQzP zsb%}vCNrO6StuONE!8{aZ1szKeAg|kbe2_1>L%>Ytn59{HFs|QMz#}&4^44=SiCxH z`|d4M_FT*SWoP%^n|12aj{LI|K7H6fy-e%@`&BF9?Kh`KeFeHkwZt`|BqgyV)hf9t z6-Y4{85kPt8UT@bh@q*Kk)f55g|2~_m4U&E8$X3mH00)|WTsWZH5eL)7#Ud^8d{l} z>l&B>HT=01`VFW-3S>iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_ I>zopr06T-FJpcdz literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/sanguinite_dust.png b/libs/textures/items/nether/sanguinite_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..cbc0d80d52a370fe79b8594e674f375a35b2dd4d GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFc64Q3n0y&)dZf?audIAs|Fi3Ds zs{;uZctipP`3`_EW7f4!PLN<(fnz#QH;@U$o6_%e0a+fNE{-7_*OLh**TW(O|>ICeNT zHAU#MFuYXYkSsbp17x~tiEBhjN@7W>RdP`(kYX@0Ff`UR03!1cLsKgwLn|W-T>~>K z1A`SeehQ&z$jwj5Osj-zFfv@$iV!Z literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/sanguinite_helmet.png b/libs/textures/items/nether/sanguinite_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6043d498734edf2b725a9bd0622d6fd46a3bdf GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0bYsL8gbnT}} z3^@!8o3j~qGBC_%U}$1s_|MP(|NsANMej_YBF2&+zhDN3XE)M7oFs2|7p{y8U&4SK z&U`nwVjw*Mhz~IEY%4zu5-jkD1PbyU0Aa?gYn_}R!LkC!bf9h^6NopZ-{}IfDm+~r zLpZJ{CnN}nB#5LiFuA$1u_-dLaWFnI;Nae|!$68ja*3933-(_}aUO_QmvAUQh^kMk%6JHt^p94 zhZve#85vp`S?C&=Ss56txbag6MMG|WN@iLmT!W!;h>?+%p`n$jxvqgJP{W^Fq2GWS xq(C+V=ckpFCl;kL1SDqWmFW4ohA5O7>zV2q8W?;jS_o9d;OXk;vd$@?2>>*vk-Y!_ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/sanguinite_hoe.png b/libs/textures/items/nether/sanguinite_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..6bccc499a417bfde76b06f601a7bd007a56a5644 GIT binary patch literal 499 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFpt;1LNFgbs0zA=c+?c$|NPJ$0Z*p4+cG&q<# zGqQ!TvAI3}BEq<#%F*~}h=H?<#0m)x2~k%UXUCp2Mz;+t$932^Uc@mhWZkM@lD&yx zN+4Tui&F+eSUhilbM>}GKwDKyTq8c?jk(HsLm8rR|fhkbKpIf2dfEuJgHU#IVm6RtI mr7{F0X6BXX`MHKDlo{)p>KPgsd?^A2D}$%2pUXO@geCx1Z;6lq literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/sanguinite_ingot.png b/libs/textures/items/nether/sanguinite_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..db80d7616cd397c677e7a469583a732cea114fa2 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFn4YT1-~nPoga z(Wb@n6E@#VaVz>L=qUJX`|r=yjMolw?K6)roei`>wZt`|BqgyV)hf9t6-Y4{85kPt z8UT@bh@q*Kk)f55g|2~_m4U&E8$X3mH00)|WTsWZH5eL)7#Ud^8d{l}>l&B>HT=01 z`VFW-3S>iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr0815! AEC2ui literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/sanguinite_legs.png b/libs/textures/items/nether/sanguinite_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..b28d93ef2a14cabe4c32017cbe1fc3bcc4910676 GIT binary patch literal 496 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0bYsL8gbnT}} z44bnVb}}&h=jU%?V8~%$m=9$C|L;*R{THZ+u_VYZn8D%MjWiG^$=lt9E91hKFd&CB z-_5NUNKXLb2MjZff)hc41s;(=LB0bZ%$RkplM^IZR^XTp)D2_;@uu`UT|ic@r;B3< z$Mxid24+V_H%2!{Ha53Z_e57gWkxnOLFdaViS8RZvN=LrjtFW6Y48b7oH6Srhe%?^ zl#V&qG#HaIe9q=D8Mf#wOEc4El2nqLcsa@;i^Z|4G0dRk+>DDiEt%IWYh+&2Cb(j8 zU;`sVn4x(7o2mW5K#NsNTq8c?jk(HsLm8rR|fhkbKpIf2dfEuJgHU#IVm6RtIr7{F0 jX6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~DWM4fmSc;p literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/sanguinite_pick.png b/libs/textures/items/nether/sanguinite_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..42f43761e04810521416f1f0b2d9b266339a0b04 GIT binary patch literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFH*&G3`!Ojp;CKCALCXua1(D|* znz<_Mut{K7Pu4`Zl)bQt4=r^DSDUc1p`DrEPiAAXl0g0J; hC3=3YAqr*2dZv1Y1_ob>76MfPsvQHgljM~4ly#aGBmU@HP*ARs=V?9$nLj!{^MGJwd7(8A5T-G@yGywpg8<4vI literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_iron_axe.png b/libs/textures/items/nether/shadow_iron_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..d50d4ac58b661c9f6d6aadb037361438aa6b081c GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~=s36u`ni}t8 zZ=tOiWM}AUCYs?VrygaJ96 z`EG8-KpNz>0ET4umy9660*^?bAm0HHX3VIO1_cvJeFE+8w`)5S4_ z<9cYHAzy<55A)pCop~=0-1yYQQR@CdV&8!imotOJmRa8n6JZdT#HhB_O3>UY^=Y13 zpuZUZvuPGm)2>_(Qu%1WxhQh&A=izD%cMVi{FHF#a{tW#3;rAYU=lmScGke-Z4b~Q z)e_f;l9a@fRIB8oR3OD*WMF8lYXC&%A%><_Mut{K7Pu4`Zl)bQt4=r^DSDUc1p`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y V1_ob>76Mfk$p{@A;|Np%5eM~?J#*!evUYw#2j@wLlJMzMESykOsNu1H)N| zP@o+QoCO|{Kta9(Ak3I`t&s0gaf=1tOp$$ z8Ut@e2A(+L!Jv5PzzVGc5-f{Y9eE~5xjQ;1ItnT{9|>p(yb;*o7!VlIa52DRf}@Mc zg@6c?3lkZah^DZ}Su_5B&z{g;HWTP!2GtVRh?11Vl2ohYqEsNoU}RuutZM*7<{^fr zRz`+aMi#mTW>y9UD{lN0LeY?$pOTqY3D;m~9Aac-WoT$+YOZTw3e@oDR_HgN1}TsY u!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;-iWUM@F?hQAxvXYkyq; literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_iron_bucket_fill.png b/libs/textures/items/nether/shadow_iron_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..92751f17ab6ad425f8b33f3df382dddb3c6ad27d GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=8WpX4#?csqxWO$)R}} zDFvCSCApaug}E(tRb4Ih{T(f7Exl<#b&MrJe!&b5&u)M@N#5=*3>~bp9zYq+0*}aI z1_o|n5N2eUHAey{$X?><>&kwQnOi_tZj;lyOF$tbPZ!4!j_b(@2iPODt;8EL%$!Bl zSMn-M>zdrH>MbKMz1Cr$&611>BEJwgczK$bFLp#V822WQ%mvv4FO#ppg BJUIXW literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_iron_chest.png b/libs/textures/items/nether/shadow_iron_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..d3e0edfac002de14701926147d049d14fe729348 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFY}|NnH?#dm=cj3q&S!3+-1Zlr-YN#5=*Y>8<*YJnWid^fjZAPsWQ1%`+t zgIO1_cvJeFE+8w()5S4_^CuKTlfkZ@DJcd(B^`wg#=_r_48ux$Vkk82JNjQ!R0gC`m~y zNwrEYN(E93Mh1q)x&}aG9%5)}Wn^e&WT9(dW@TWo;>J%Q6b-rgDVb@Na1DmWAx1`4 zhK5$A=DG%^Kn;Ixg?-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG) NgQu&X%Q~loCIDMaW8Yhv zYN4$dWM}yQ|Nq`pO$DF?V@Z%-FoVOh8)+a;lDE4HTVmRdS|Eor-_5NUNQ2yCz`(Yv zX&Fecz#|eU$aesQ8MCf+a)JcQ3LMjcx`9j}-jsf)3&`^Dba4#fxSpJFfLnrf0gs~V ziiU~WE*>79rUE((mMnS2BP0}7WW>wL$!V#%vaLa4(J8N034+H0RIev&Fgti5z_G)z zsVPF2h2fzB`_F<`PC(x>sFt`!l%yn~I84>2^gGBUI>vd}d! zvobJPapR{DiiX_$l+3hBxCTSx5F;ZiLqjW5b6o>dpoTxULcakuNP%n!&QB{TPb^Ah l2uRG#E79|F4N)jF)-%;JG%)y5v=FF@!PC{xWt~$(69AZ%d5r)7 literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_iron_helmet.png b/libs/textures/items/nether/shadow_iron_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..df2a255ad6fe7cf5b2e583f528fc4756e1426ed7 GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFr%G6xf zz!a$A&#lmJKn+qL8-nxGO3D+9QW*jgGxJLH{9Hp6%8d0)^$ZORz7#D4s$%eT^>bP0 Hl+XkK)|!em literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_iron_hoe.png b/libs/textures/items/nether/shadow_iron_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..85f81f4609da00e2cffb6d0c5f4eee0c5df2e9a7 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFaV;^K^ z*jt+FX(pQCC#NCD{r~^}FY4+*BN!MJ30tps)L;?l*4uCLY*0oMfkYHJXV>(bbkO{<_((iNuS)raTjv*Y^lM@mW zL_|aq7#Q7Bo!K}JpNwb-WH=LGCcc4^ER6xt6Lrp7~czOaD8NTqd3A;${T@189wZt`|BqgyV)hf9t6-Y4{ z85kPt8UT@bh@q*Kk)f55g|2~_m4U&E8$X3mH00)|WTsWZH5eL)7#Ud^8d{l}>l&B> zHT=01`VFW-3S>iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr E033vV`2YX_ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_iron_ingot.png b/libs/textures/items/nether/shadow_iron_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..4328ef98d46bd1d782f15d5e0b7b1d103d5fb55f GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFN>nG0H2Cmdp!dg9;e1}6Ux&r9YTf3UUl$g$jFGS^xBs;Tk~&ncc$ua-@@ms!T+ z6Kz^7KVkE|6t|*}f{udEw*UTI&3Nq~*FN+3(%C>8R7+eVN>UO_QmvAUQh^kMk%6JH zt^p94hZve#85vp`S?C&=Ss56txbag6MMG|WN@iLmT!W!;h>?+%p`n$jxvqgJP{W^F zq2GWSq(C+V=ckpFCl;kL1SDqWmFW4ohA5O7>zV2q8W?;jS_o9d;OXk;vd$@?2>@aF Bh%5jA literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_iron_legs.png b/libs/textures/items/nether/shadow_iron_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..35ad0eb150d43a57de818b32c0876942a5fe9a70 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFaV;^K^ z*jt)vp{@A;|9{tQxt2f)#*!evUYw#2j@wLlJMzMESykOsNu0YiI} z`%aKxfkz}zknaEpGiF`uEal|aXq#7Aa8>K5A$Q* zJ1u+{x>!FYG;DG_`fqoGwxVL8{_964(&|qg;<2rDSw1t}ZOd_%S1vc;mmh) zD+baahcz%fs@IVN2^M%n0tNXFfG}g$wN6fuU|E4y#2e72I7Lj*MKmFy1sF_g=d#`^o6A%NG+4F7HKHUXu_V@P5LX~=s36u`ni}t8 z-oEXJzX3_ zIIipVZWL@V;9-8+cI!||!-mH8g$c}2W{D}2PUL<0_c`)_jI!d3Sjlrj*SwDyd=c91 z{lJ5BcTiJLRnxS6Mb*wcptAuMXG!8K`vNANZ zGBwvVFa>J(b1U>4P=gf6hT#0PlJdl&REB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7 L{an^LB{Ts5I{1y_ literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_steel_axe.png b/libs/textures/items/nether/shadow_steel_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..d583f9af093e3f4b8deb28d99ac29eeae9874404 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFEal|ab30VAa6qehx6%^+7GT#+ROE4FnHr(Mc-W~!VZ#;`$1<9qDQrQ!lj z%Gt43ryF=Sot@mga_a_$w5cDS@P>7Vxh#+VwB+&E28M5k&J~4)pJe3wYh3%JSN`8W z#tk1hkKM?eyBlbqYKdz^NlIc#s#S7PDv)9@GB7mOH2@;>5JOWdBSR}A3ta;hJyShH1A{L`3xTQ_JYD@<);T3K0RT1ZnNQ8E9Ain4UoeBivm0PelDE4HyI5k!YoH8gzMESykX``99~iE8 zxy=O$7I;Jg1^EtuFk{xWPEL?uS%G6Z&?q1ih&QF*=>oE%JzX3_IIfp=ZRBk*;9r%G6xf zz!a$A&#lmJKn+qL8-nxGO3D+9QW*jgGxJLH{9Hp6%8d0)^$ZORz7#D4s$%eT^>bP0 Hl+XkK@Q#ry literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_steel_bucket_fill.png b/libs/textures/items/nether/shadow_steel_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..de3445743556c57a54399e348976d86c38b70190 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=1y133=HWWyJ+`Rpkve zm2J%pliO>1yV|Es>YqDv+N!xzic$pIfa(}ag8YIR9G=}s196hP-CYjkddd0V+hCfYcCo~c*FX+uzMESykX``9 z7Z{xQlI%f(1s;(=LB0bZ%$RkplM^IZR^XTp)D2_;@uu`UT|icbr;B3<$937BgS;$; z9L&D#GZy?_ytcuY_2--aUL9L@{qwfqaLO<^#!w+Ofx#zxVu+*{kG$4Sq5H=}9)%Bsv@%8jG8b@_sM@g=AVUOFFpPO*C@%Z=K317}Wp7|t)HDu*;`?e^a787H4 zJD{DaC9V-ADTyViR>?)FK#IZ0z|dIN0Eo;(3{9_$h>~~+yDRo literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_steel_dust.png b/libs/textures/items/nether/shadow_steel_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3dc35e5f4f092dce4d9f601d087a0e54b03ead GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GR?F*nmN% zVB%$vV1Y*@P>}Bc2s36~>*NFpmK8Xr19bzLK)fmaP8X2n;pyTS!f`!0;Q+S;>jEA{ z*A)#DwOu?sJWU037A#rvibqH&jLV3Zm6MZIb7fnD#G+GPs}cl{1*l$6*kE?>LV#n3 zV^dRvE(^m;1rEug!!tmptCqM%l%yn~I84>2^gGBUI>vd}d! zvobJPapR{DiiX_$l+3hBxCTSx5F;ZiLqjW5b6o>dpoTxULcakuNP%n!&QB{TPb^Ah l2uRG#E79|F4N)jF)-%;JG%)y5v=FF@!PC{xWt~$(69B2~eB%HB literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_steel_helmet.png b/libs/textures/items/nether/shadow_steel_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..7d758c88c9ede98f333c0af9f4ee122a0ed61b46 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF^e4MvPN8{FAfT=|=>={f&tYNVL@Cwr%bB7xz>CL$%D?+A$hlyJ$JaX*lE`@_7V zvvIvV%F3_%?`8K1U6MSOys7f|O^xDXTP*DYMD`S=a`LJ%-@gO2Nwvf^q9i4;B-JXp zC>2OC7#SEE>ly%&d5EE@m64&9k%g{-nU#UTiW@(LP&DM`r(~v8!ZjEghZq@I85&xd zn(G>v0yX@(75WXRK?-C;aDG}zd16s2LqK9?UWuNcYluRbv7V`(p@G4dqJ=@P5LX~=Wu$q0=laAT z*N)<(vg8m?Gtmq`xz2QT4LR=r|NndS{q_SYVk`;r3ubV5b|VeMN%D4g;mWx1B@D>n z%y)Au2GR?FIDui==`-yh!2*v+pdjA?5N6D}*2xJHEGuwK2kHhgfp}B;oh~3N%G1R$ zgyVX0f`Euf0t2&KsyiE-f%^%U3635NI!|;mIHrjim9%LH3xzZqNX%v7Rpb#CbTn{| zxNt#4<#^Z$1qqg<6rTnOjR?+-jt(qYqE`ag*k&+X5EYPO@K9!7buBH_2xyCHiEBhj zN@7W>RdP`(kYX@0Ff`UR03!1cLsKgwLn|W-T>~>K1A`SeehQ&z$jwj5Osj-zFfv@$iW&z{7l( z_thmHhnWjnSSK7}n0n&h>INqN56?^H8-K91^T@H>VlvlR{Hm$)4bLf_Q?HgyxtCeS z;}dOKEI(oMy%e{ikAjYZ&$j>mT+MjxAlE+g_|n-x8&peNBT7;dOH!?pi&B9UgOP!u zv919SnTHsfS{WHy8CmEWm{}PZthn)02t`9~eoAIqC0v7{afp$Tm7$@PskyF!DNw_o zTcO{88l*rr1m~xflqVLYG6W=M=9TFAxrQi|8S9zq85$UTDOw0r#o+1c=d#Wzp$Pzh C=ZiW3 literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/shadow_steel_legs.png b/libs/textures/items/nether/shadow_steel_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..1ffcc977183fceabb75a0ad7a8f31f60330de91e GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM|NpzOTbcqT7)yfuf*Bm1-ADs*lDyqr*b>ur)B-u2`EG8-KzacXKVX>a z5po73Sl|%}6y!Sq!i-thIypgtWd)AuK;1wl5N}Gq(*0Ia= zhSvhW`zL9ePj+S3w|sVMT5t(V@ugb1d~>Gv4R;?hzvSb(s$IA88_+J*64!{5l*E!$ ztK_0oAjM#0U}&ss07T{?hNf0VhE_%vx&~%e1_mo`{1igbkei>9nN|tcU}zj-WMpM% zXk}`yYhVi0@aI-2$Ob8p4Z-@P5LX~=Wu$q0=lYJ~ zq_X6Y#2{BsGtmq`ISo1P&UE$v|NkFpommZ3#8?vK7tG-B>_!@hljQC0!j*C1OBj&D zneXOS45SwTaRI{{&U@EDf(0ItKta9(Ak3I`t&RC^7q9bKm5Ic$@>By-Fw=+;2imAw;u=wsl30>zm0Xkxq!^4042^XSfXF<=(A3Jv(8|a{*TBrmz+lCV zpF$`aa`RI%(<t)x7$D3u`~F*C13 f&(AePq0Cs%RL{`B;7id$pehDWS3j3^P6slu#NU*HHF&(HI$OPg|>36z-tO!pR#}JO| zrhNx_4;XMTpIuz8#P>tjOZMTOY?waoZ&F;ILxd8GePY40i8y*up=(Y_tN}p<3b^QIe8a zl4_M)lnSI6j0_Bobq#>XJjBq{%E-{l$U@h^%*w!E#f_grC>nC}Q!>*k;TjB$LyU~9 z3=OSJ&2slu#NU*HHF&(HI$OPg|>36z-tVmB6#}JO| zp?w>94;XN;6i%GSzT`@nTE|n?3F;@+ByE}Qv^! zC8<`)MX5lF!N|bSSl0lE%tH)Kt&9wS|=w+u&lr_9jF_~1maEUce;SAR8JSj5RU7< zy}Jb)0ytO{4W1uhyTJ9wB+_$G)b`hHKG{LoQX_^6FpO30U`_X{A;R{q9 zZ!7gMPjEEyY!NTKe66}wad+bCsU^$57|Y8|*E{n{*YJat&t$D!)!M7`BjnPBI0ZM@ zRDA?ms9NG0QIe8al4_M)lnSI6j0_Bobq#>XJjBq{%E-{l$U@h^%*w!E#f_grC>nC} zQ!>*k;TjB$LyU~93=OSJ&2r(?u(oZiagGj zd1tL+7EupSFJSo||14_f{>O4HERz`GT^Ozw7+;E2+`Id%WaIP~IV*L}7Y0hsN}M0| zzFVs&e5;?|{fyK(B0rky<^CLE_ZMPzTm>{-wZt`|BqgyV)hf9t6-Y4{85kPt8UT@b zh@q*Kk)f55g|2~_m4U&E8$X3mH00)|WTsWZH5eL)7#Ud^8d{l}>l&B>HT=01`VFW- w3S>iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsdp00i_>zopr0I~;&00000 literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vulcanite_bucket_fill.png b/libs/textures/items/nether/vulcanite_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..3497afadefaef33425bfa57eab6b36c522f0a167 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=4Lk)R^&{r z%A3_#y0o+Uc2oH3i7gwZcfX#V_g|dB7^sf1B*-tA!Qt7BG!Q4r+uensgH_f8$l)yT zh%9Dc;1&j9Muu5)B!GhKC7!;n?Dv?t1x$@g+qC`xg^WC1978y+Cnp?WpK<7tdP9cT z!*{aNxEiP#o59o7&t;uc GLK6T5h(WUe literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vulcanite_chest.png b/libs/textures/items/nether/vulcanite_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..1023b15f39b843db9090b3487d91a89441c70dfb GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFV1Y*@P>}Bc2s36~>jVpy6*#5?bpz#rcvJeFE+8w_)5S4_XJjBq{%E-{l$U@h^%*w!E#f_grC>nC}Q!>*k;TjB$ zLyU~93=OSJ&2S|=w+u&lr_9jF_~1maEUce;Qq4^J1z5RU7~2?w|(SQqdp zx~^!LsO{q6;b|(MvtY@RS3E*OVO&PMtel*znk(BHBo>|WT9qJpEI{>o!UnU07XlnR z9GjXVbXgc)DsV^^9i9O)UA4qDq9i4;B-JXpC>2OC7#SEE>ly%&d5EE@m64&9k%g{- znU#UTiW@(LP&DM`r(~v8!ZjEghZq@I85&xdn(G>v0yX@(75WXRK?-C;aDG}zd16s2 lLqK9?UWuNcYluRbv7V`(p@G4dqJ=}Bc2s36~>*NFpmK8Xr19bzLK)fmaP8X0B;_2cT!g1ZV&ztvv0|)Ct z#{HrVEGh*n7$*I?eu<%7PdqM8jfdgCg5p^>@mDH3=k7V`u0DJ+IP9#)Ed9l%XRg}3 zH+#6KIMAd<c?jk(HsLm8rR|fhkbKpIf2d zfEuJgHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~DWM4fvulVE literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vulcanite_hoe.png b/libs/textures/items/nether/vulcanite_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..1424d1eb0f14c54c64daecbc5e36e78ed96892c9 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~Q--O}+hOYlD z9-sUf&Nwl6nu%uk$!W-Occ!cV|NsA?tZ5=p5o1Y^UoeBivm0q3PLj8~3s=U4FJV9q zXTFS|=w+u&lr_9jF_~1maEUce;SAC{Gv1 z5RU7n-5Yru40u@X^KP|oY`SFNxT$ff=Z&UG7ZnRP?6a7Aj$y&77w*QwOhs3sUOFgA zpHBa^$5nNv*w1{kWr<6k6wmO!oH0#W>Fyir%G6xfz!a$A&#lmJKn+qL8-nxGO3D+9QW*jgGxJLH{9Hp6%8d0)^$ZOR Tz7#D4s$%eT^>bP0l+XkKlxdNE literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vulcanite_ingot.png b/libs/textures/items/nether/vulcanite_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..8803dabe24834fce4a3c5e5828aadd48d6a10331 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*t2 zf!2*v+pdjA?5N6D}*2xJHEGuwK2kHhgfp}B;oh~3N%+tj&gyVW???K)M10LqP zyss|tILuto!aCs)!_*W1RyQ#De|TOp-}r;Aokx!47L&Qo;#Wo=I zjdcxx$UMZ*)XK=v%E&_3z|6|PV8xA}LMR$?^HVa@D&ZOojYEu#tPBmUOwDx-Oo1By z+zR~$)F1`2Aviy+q&%@Gl_4N8Gp|I?&oxA$%vjG<&(Of&OVL80Dh5wiKbLh*2~7aX CcZ~P| literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vulcanite_legs.png b/libs/textures/items/nether/vulcanite_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9e416446556d6997dfa2acdd8706aac25ec112 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFy9UD{lN0LeY?$pOTqY3D;m~9Aac-WoT$+ zYOZTw3e@oDR_HgN1}TsY!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;-iWUM@F?hQA KxvXIO1_cvJeFE+8w$)5S4_D$XzL zw9jt5wIZ?W>dRn}%Cb!??5;aD$0|fR_V1fozwyg$NtgBiBd@Z*o+3LH7!C}oC9V-A zDTyViR>?)FK#IZ0z|dIN0Eo;(3{9_$h>@P5LX~Q--O}+hOSTk z4F6j^&Nwl6nu%uk$#tfyYshi`|Ns9=%U%hfBF2&+zhDN3XE)M7oFs2|7p{y8U&4SK z&U`nwVj$fB#{VU)VnKoh9+5ynz5^i4n02j_6C_wx;Fu274P*lGrt~{qKvtZmi(?4K zb=}h&c@G$HxCCYdNuT46_{7xXVD>>|rlRta(RFB>3n3kIVAL<=`j)Qf_U9F zs|)U@OzeXd8kTVAYcKS!d14_qPdYAxZ{K6BTUCXBHpU*}SK0KN@kkY?+GN+zSwNdq zOI#yLQW8s2t&)pUffR$0fuXUk0T7vo7@Arc8Cn@x=o*+=85pd%@lyyzLvDUbW?Cg& zgQ0PVk&%_5p_Qq*u7N2~!=GEB-+&sVKsE&DrFVdQ&MBb@0EcyttpET3 literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vulcanite_sword.png b/libs/textures/items/nether/vulcanite_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca0822984469713904bd8ffe50fd6cb7c88f280 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~Q--O}+hOYlD z9%q~wKKV0vnu%uk$#tfyYshi`|NnnUl2Zv#5o1Y^UoeBivm0q3PLj8~3s=U4FJV9q zXTFS|=w+u&lr_9jF_~1maEUce;SAXipc% z5RU7ny}Nl27;v~0PM&4#2g*X<8PcJG|Hbd2(Z)(TAUYTbzP=i)u84Y*zD2#k1eKvG;Q?&>Gbe z*NBpo#FA92WMyb*WooW#U<%am=T_)9pav@P5LY0r6v5c>&oT4? zqxmF8w;hb0W}+E>avE~no$2cT|Nqas=P)0rh_NKdFPOpM*^M+1C&}C0g)8I2moOlQ zGvCdv7)Uz+aR5X9$%o%Sf(0ItKta9(Ak3I`t&OmJaCGT7$z(Bk zg7@>6liU^Ge_3^LW#znG9E(lv$9}z_db{`8+`o;p7?!!@n2XF`a6iA`1h?=B_H9$0 ztUiz#L(2r$k58jLf62|%D`a7jh{j&8glbf zGSe#I8Vrp?jEt-d4XsSgbq!2`8vfi01^HVFWJ7R%T1k0gQ7S_~VrE{6o}X)oLYc9i Xsh**M!Iz?iKvfK$u6{1-oD!MF literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vyroxeres_boots.png b/libs/textures/items/nether/vyroxeres_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..082c040e3941f1c9fbdd7d5e99c16692b5c7f8bb GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&(UoM zW9S1$^GS^V|NlRk?6e6e!B`UH7tG-B>_!@hljQC0!j_n}qZY{F%y)Au2GR~d{DI-% zxmbCSV1Y*@P>}Bc2s36~>*NFpmK8Xr19bzLK)fmaP8X0B;_2cT!g0N{`=a0h1rF!K zY%YZi?{_tn>p9Fl@OQf4t^42ps!U+{;lSvbs?Pm*#`P87yUgX4CM`AEeB30&W4W~V zj7M76MAIa9E`Iwk?Dn~>r*{8;%%If5{$f{ID#(1*64!{5l*E!$tK_0oAjM#0U}&ss z07T{?hNf0VhE_%vx&~%e1_mo`{1igbkei>9nN|tcU}zj-WMpM%Xk}`yYhVi0@aIdZP<_ z6UwG0H_j|-UtE@SK(l8}Rq-8@OS?Tz0o5^<1o;IsI6S+N2I3@nySp%Su*!M>Ih+L^ zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{T?&7fCc}1cMTJukg=zWV+hCfn!oU#H$?3u*Gfx_*ox#)9&t;uc GLK6UAQ$J1s literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vyroxeres_chest.png b/libs/textures/items/nether/vyroxeres_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..3b84b23633533da357df4574c5241a77cfb93146 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF#>fAlc%{dR%+vfwF!k}8>8c~vx zSdwa$T$Bo=7>o=Ijdcxx$UMZ*)XK=v%E&_3z|6|PV8xA}LMR$?^HVa@D&ZOojYEu# ztPBmUOwDx-Oo1By+zR~$)F1`2Aviy+q&%@Gl_4N8Gp|I?&oxA$%vjG<&(Of&OVL80 ODh5wiKbLh*2~7YJDUl=q literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vyroxeres_dust.png b/libs/textures/items/nether/vyroxeres_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..2b47f07302e8d8719e00d7e7085065280f1e9852 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GR~dY{0-} z(iI32Ebxc~3i2HQVaBX$otz-SvI56+pl%=&h&QF*=>oDmJY5_^IIbrr9N?BTI>f+b5{@dycpaT)Qla&oe2u54?NSaiy3Rf6EL0M+XW8_W(~2ypCh zY-)<_Mut{K7Pu4`Zl)bQt4=r^DSDUc1p`DrEPiAAXl l0g0J;C3=3YAqr*2dZv1Y1_ob>76Mf&oT4? zquUNf^GS^V|Nl=GyDkBgU@Qsp3ubV5b|VeMN%D4gVM|QgQ48d7=DWES18D~!KENQ? zk^KfFSl|%}6y!Sq!i-thIypgtWd)AuK;1wl5N}Gq(*PYJ{K_+!n#x5xL3&+7XqJY#mUlR$vqhT_W)Srm^&fjRd? zi2eRY_ZmFb?7H#w;lyp%*1Y52C&l)6_pgfAK;uc?jk(HsLm8rR|fhkbKpIf2d zfEuJgHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~DWM4f<>`z6 literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vyroxeres_hoe.png b/libs/textures/items/nether/vyroxeres_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..04c26dd1c16b22b6281abd90696723c744613411 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0r6v5c>&(UoM zW9S1$^GS@JW}+E>avE~no$2cT|NsB`@1PY>5o1Y^UoeBivm0q3PLj8~3s=U4FJV9q zXTF-LBK<0Z)4*`!4nB{7!AW2bhwPp31kWTFl4BH7g_g=&dwL`h0w zNvc(HQ7VvPFfuSS)-?bk^AJN*DPsvQHgljM~4ly#a zGBmU@HP*ARs=V?9$nLj!{^MGJwd O7(8A5T-G@yGywqR!-1Lr literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vyroxeres_ingot.png b/libs/textures/items/nether/vyroxeres_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..2b4a645f9e17e38cdb21fc9513accfdd1eedba95 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&oT4? zquUNf^GS^V|Nl=GyDkBgU@Qsp3ubV5b|VeMN%D4gVM|QgQ48d7=DWES18D~^R^|S@ z93)ua5eXFJI{?CrS=Tx_L4sukj_E+%Kqe4xO25+uWQBRUIEHXsFYP_Z+hD-Me3$pt zB_4;F3tCtw9AcPy;@|29CjSr5OXeGYu(k8ZvD{)Z*IE3ksqziaDV|fWmQA^rS;pfN zZCWfpVe`Edx1x`Nj)Kp&|NdOfcFVdQ&MBb@064aZ Ag#Z8m literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vyroxeres_legs.png b/libs/textures/items/nether/vyroxeres_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..4f52c913eac68b1c27316338914498794ebb49f7 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!j_n}qZY{F%y)Au2GR~d{D7gG z$KMYmSl|%}6y!Sq!i-thIypgtWd)AuK;1wl5N}Gq(*Y%mD9SU z`l|YuQ@dgqV~xdyUOi6@SS>DYQupZ@TT=_i;!DAsRsbzgEpd$~Nl7e8wMs5Z1yT$~ z28PDE20&yUVrXh*WN2k%p=)4fWni%4#!n#>4Y~O#nQ4`94Ti=cMn+bKhE}HLx(22| z4S#NhegkTd0@)CppH@mdKI;Vst E0D8}fr~m)} literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vyroxeres_pick.png b/libs/textures/items/nether/vyroxeres_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..0a391c806e8b0c0a42841e8740bd34002ec274a9 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0r6v5c>&oT4? zquUNf^GS@JW}+E>avE~no$2cT|Nmb%we2@h5o1Y^UoeBivm0q3PLj8~3s=U4FJV9q zXTFHXkC2RNfcXYHm@kkurJk7b= zE5UO_QmvAUQh^kMk%6JHt^p94hZve#85vp`S?C&=Ss56txbag6 zMMG|WN@iLmT!W!;h>?+%p`n$jxvqgJP{W^Fq2GWSq(C+V=ckpFCl;kL1SDqWmFW4o dhA5O7>zV2q8W?;jS_o9d;OXk;vd$@?2>{kXkuU%N literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vyroxeres_shovel.png b/libs/textures/items/nether/vyroxeres_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..69d6a7af81a263350fa65f2d50bafb2be0736676 GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0r6v5c>&oT4? zqxmF8w;hb0W}+E>avE~no$2cT|Nqas=P)0rh_NKdFPOpM*^M+1C&}C0g)8I2moOlQ zGvCdv7)Uz+aRbAs01P7+3o}L~ihgpFh9uX2}0!)m;SWX&9adk;FyR^8ti1HrHa&2Xv%5tEnuPH&W ztt8N0aRNs)>*5Vc9TRUJ;8-S^ZqRU6l)<~%gxx8(h0}n8%PE6Flau`%yL<6uphc=B zt`Q|Ei6yC4$wjF^iowXh&{)?1h|EI_O|6U!t&A*m4a}?z3|8FuDTJaSH$NpatrD)m z&^W}%$jZ>r%G6xfz!a$A&#lmJKn+qL8-nxGO3D+9QW*jgGxJLH{9Hp6%8d0)^$ZOR Tz7#D4s$%eT^>bP0l+XkKnGuC9 literal 0 HcmV?d00001 diff --git a/libs/textures/items/nether/vyroxeres_sword.png b/libs/textures/items/nether/vyroxeres_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..89ca5dce20bc237bf67bd7e33549431df41f78e6 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&(UoM zW9S1$^GS@JW}=Kby~|AD~XB^{`Ou_VYZn8D%MjWiG^$=lt9^W)8>Z-5-md^fjZ zAngFe6Bw2lo9zGz7I;Jg1^EtuFk{xWPEL?uS%D+aEJh#`h&QF*=>oE%JzX3_IIgRn zJI&kRz`=6i;iH-T(&uk5mTf58u=Gab((VJPC%k7cT4jP literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/brass_axe.png b/libs/textures/items/precious/brass_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..120e8f6985078079178fca8bd1b21492143f9135 GIT binary patch literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFKfGl567sn8e>&XcR z*jQLu511^Tq|~g?p_rnil);f^VI|f0w1tIb?m-?$wnRr)0q2H`f{SJ-@+_L&Xeyf( z7r_{!AgZMx!?3V1Y5~s*F@{MKSU*l}(0C3sShd78q9i4;B-JXpC>2OC7#SEE>lzsA z8XAWf8CjWFS{a(_8kkxc7-akMv!Q6n%}>cptAuJW)HO5>F*3F?HncJ_(={*yYIwl( z{RvQm6v&3){Irtt#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K0RXb4 BdIA6d literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/brass_boots.png b/libs/textures/items/precious/brass_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..564a55c6aa48aebf63304d8369b174e95efde88c GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFEal|aXmTV06Pn- z1goRT;!O+!jS>oi28Tl#Is#l0vW|$bO0+i2OLk^sOH5{D+u+oZ6~n+F zw~oas-b{)GXq0M+YeY#(Vo9o1a#1RfVlXl=G}bjR)-^N^F*33;v9vNY*EKM;GBC*Y z9nN|taV5nH8C)1}TsY!TD(=<%vb93;~Im ic_n&&t|1C##(JiDh6V;-iWUM@F?hQAxvXUnyZQ6_(GZxP5*)gYh#flX-Zru3) z|G&z`z|}z07)yfuf*Bm1-ADs*lDyqr7&=&GJ%Aj}0*}aI1_o|n5N2eUHAey{$X?>< z>&kwQnVnxiu9fZYOrVgJr;B5V#O34!1>p_FMa7>#9o#9S6Jz7#WD`@!il~BFn~+{p-@~K@VhjwL{)}r=jzyLMO=0kK^>bP0l+XkK-}zEb literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/brass_chest.png b/libs/textures/items/precious/brass_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..dd730dfce9f3254a514a1228e1f92ab8daec82bd GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFu_VYZn8D%MjWiG^$=lt9T`aNVHIT!Z@8(tvq=6QU2T;^{fp)^_NSnnT;d1sMw#Y+zt+?&ywK)U6z_v15|5fMG+3 zbr-``Cdnoyha(O`3=EF(Y%d?J|Mw4Qu4;*EL`h0wNvc(HQ7VvPFfuSS)-^EJH8c(} zGO{wUv@$f;H88a@Fv#}hXG77Do1c=IRteQ$sB35%Vq|P(Y-nX76Mf_H;1LNF^ZqZXgqgH>Ka{0bP0l+XkK6DD_Q literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/brass_helmet.png b/libs/textures/items/precious/brass_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..994b167374920106aa495d9f9d0ff2d75da1b96b GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFoERJzX3_IIbrr9AKAV zWo13Uqv)LIx}jl`$AU==5yt{}bdG1_%$dfPHiKpPu13j2O--E%ZHo$L3Cu{$n4`vH z=5fKoS0HIifzla1#uRBrhBglI_iv8N0}WO!ag8WRNi0dVN-jzTQVd20hQ_)E#=3^a zAx1`4CYDx)=DG%^Rt5&yzWi(`8glbfGSe!d8Vq#}O+$=~t&9z=jLdWm%zzpmFnxal y)F1`2Aviy+q&%@Gl_4N8Gp|I?&oxA$%vjG<&(Of&OVL80Dh5wiKbLh*2~7Yj!+u5p literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/brass_hoe.png b/libs/textures/items/precious/brass_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..c99ea47c4fed043f93c265d4a67553a3b0fa58d1 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFvS{WE*`|`7)Xvob^$xN$+YB1C_Gz~E_wlX%fGBVROFav6M!1VnIP=gf6 vhT#0PlJdl&REB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7{an^LB{Ts5Ny~cZ literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/brass_ingot.png b/libs/textures/items/precious/brass_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..17905679db157da9ea20a5119dcfec820a4ad683 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF<0nI)1Y=2%UoeBivm0q3PLj8~3tM8^j#?mxGvCdv7)S$+WpH57 z)BFcg!CBxD2^8cz1j3A>8eR<`!LkC!bf9h^6NopZ-{}If!aQ9ZLpZLN_8#PIFyLXn z%lqmQkHgFbEvyp`F-$%2Z*>Ec|A*%#^Nl~)+Ii$yZZVnbEPmBg`G)5dF-rrgUc zV4-#5JNMC9x#cD!C{XNHG{07#iyu80#7uhZq@InOIsGn(G>v zS{WE*`|`7)Xvob^$xN$+YB1C_Gz~E_wlX%fGBVROFav6M!1VnIP=gf6hT#0PlJdl& nREB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7{an^LB{Ts5Y2J62 literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/brass_pick.png b/libs/textures/items/precious/brass_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..505baa932fc276117157307fa5492f7253ca242c GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFTocV5U z#XuTpK0^V+$NUphL4pMykw8JdLmMotqaZyBxXT$)Kc}p~MmRL?eSEaRx{8RRb0-qbA8UFL`QFf)5pyD%K#xfZs!C8<`)MX5lF z!N|bSSl7T<*U&h`$jHjX(#p_W*TB@uz#!X~pAAJrZhlH;S|wD2p{}86h>@|Cv7wcb znXZ8uP{RYJ?@xdlq(C+V=ckpFCl;kL1SDqWmFW4ohA5O7>zV2q8W?;jS_o9d;OXk; Jvd$@?2>@^we!u_# literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/brass_shovel.png b/libs/textures/items/precious/brass_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..1b96e5eac1d07cfe8cd75a0169ebc29c8bacfb09 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LX~=r_K9lWBSon z)oH1+w`Q1mnu%uk$#tfyYshi`|No!CNq8wx5o1Y^UoeBivm0q3PLj8~3s=U4FJV9q zXTFo5-7-b2!t6$HM|-?f@KAc=|J5;CJ=8*ztaU|xp}%c zhHzX@PH32oL?*) zXT#V;1$-N#9&>D#Sk%nOF#Q6X%jy?ra)2hPmbgZgq$HN4S|t~y0x1R~14Cn717lr7 z;}9bwD-%mALvvjNQ!4|5Y+rsh6b-rgDVb@NPz{EXER$&Q;Xh2yD*9?vX(FBne4vsD-771TjW<@O)Uf+ewI=R@IGPgOcP<+X| zNZ@QDk3ic724-a!;VX3v*Uzx)RpfmJTEL)M;u=wsl30>zm0Xkxq!^4042^XSjCBo- zLyU~9Of0Po&2@P5LY0b60G*|&7J!f zR-M~XzjLOWrkQ&rUP{YnLxZL{Z1Eio+O}IwDbmmVz9AYQeFmg>knLok%u$W}teI;A_y$rXPf865uch$w&PgzC7*_qDI zzXu8m)e_f;l9a@fRIB8oR3OD*WMF8lYhbKvXdGf>WMyJ$WoWKzU}|MxknPLQhN2-i zKP5A*5~{&a*U&V?$k@u*(8|b6*T4*@;Q`b4CqNBSARB`7(@M${i&7Z^5;OBk^!!{y c6v~YCO!W*6489aC1gc{2boFyt=akR{09w|3CL}?QNhmV@Z%-FoVOh8)+a;lDE4HN87!rRX`4BzMESy zkahs#4-5y-#ma*O3p^r$f_#TSm{C;2s{tffR^XTp)D2_;@uu`UT|icdr;B3<$Mw?F z7daaeI9dbmKA3gre~h$6lYoh%_7}M=_OYBza+8{C6uR~-W_uOkz!N{&N@u0N^@_&~ zwfnYpbuYAAknZ$o&gJESLQ@0!g^VYs|2@aMEt^yON0z?}(0tVr*NBpo#FA92qf8aAWtnzyDVTt4pXHIVu4H zLfq-bK_U^=*SG%9U;p91{}#5Aqo02V{||n`G%05}XU4RNKhGO*ZD3*$o@k%Do`L0*^?bAm1SnW)#)%Y5)nA6*#5?bpx3|yea)o7m$_d>Eal|aozOX zLC#hO9+nH9?2?-=e$Hau*vwkb*m%D|^~QhK>ql7*H9Hs`2w${V@oGp?RluY#%RU@l zb8Mo5w&lbPrSr}g^Kwjox@$$l*U&G{v$w}u_w0he=o7)xMuQ(Qb>XA0< z;MT5Yd)5xLRJFu4q9i4;B-JXpC>2OC7#SEE>lzsA8XAWf8CjWFS{a(_8kkxc7-akM zv!Q6n%}>cptAuJW)HO5>F*3F?HncJ_(={*yYIwl({RvQm6v&3){Irtt#G+J&fW*wa h5hJyShH1A{L`3xTQ_JYD@<);T3K0RU};nk{@ zNmn39u)re{D9CpRgc(IOyc$4)Wd)AuK;1wl5N}Gq(*)G<1*r9<>X}5T-nwjvFMc7sszDf0jk#%Hkci}5a8J1 z*whrE%fj$dfkU$B@C=aYswJ)wB`Jv|saDBFsX&Us$iUE8*T7iU&^W}%$jZdh%FtZb zz|_jXAlsLp4Mjt4eoAIqB~*iFVdQ&MBb@0FT#sM*si- literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/electrum_helmet.png b/libs/textures/items/precious/electrum_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..26ab39b5ba75d6aaeebfaa594fb638ef8411f1bf GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF^C660*^?bAm1SnW)#)%Y5)nA6*#5?bpx3|yea)o7myX{>Eal|aXmTV z02>SIK@sJ}lQuRmOi)x(Ny&J@G0C7rM3l|5i>r%;i>+yi%TXa_$DkgiN3DGdM|--I z8l42%7IVx{RC*!B6sB|Hg_IJ5Ve}EfEb+w*o6a&sZ{xTm=9DcBv_!SUHKHUXu_Vlzw|7#UfaSXvpH>l&C^85m^y^0T36$jwj5Osj-yFw`|P4KXsd zGB&g_GSf9M18R7{^!*7?gA~Yy;QX|b^2DN4hJeJ(yb?V>*ARs=V?9$nLj!{^MGJwd O7(8A5T-G@yGywpcu!cJT literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/electrum_hoe.png b/libs/textures/items/precious/electrum_hoe.png new file mode 100644 index 0000000000000000000000000000000000000000..942698af02d0c7ccc0d672088099c41b4c0ef68e GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0b60G*|&7J!f zR-M~XzjLOWr(}B8yOd#Hrey0n_3iWhx z4B@z*oRAf zo-xs|(UIjy!s?U+hS|!7jH`|ccyS*-!;#Wpv>=U?)FK#IZ0z|dINz*yJNIK;@v%EZ#j&|KHR)XKmh+m|0zLvDUbW?CgwgQ2dWX^4@r zm9e3fk(sW68BoImrteRHHb{YN2+mI{DNig)We7;j%q!9Ja}7}_GuAWJGc+*xQnV1L Oiow&>&t;ucLK6TG%73N+ literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/electrum_ingot.png b/libs/textures/items/precious/electrum_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..c81305172324af6b9ecd44469585a52d827be7ec GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF4E_vC@ zVRw$dxUl)o5(Qpa+on}hw*UTI&3IjdYro1QFOUtYC9V-ADTyViR>?)FK#IZ0z|dIN zz*yJNIK;@v%EZ#j&|KHR)XKmh+n1jWMMG|WN@iLmRD+?ep=pSbv6Zo*m64gQff-Q4 z1E%j!fEuJgHU#IVm6RtIr7{F0X6BXX`MHKDlo{)p>KPgsd?{K8RK?)w>gTe~DWM4f DOudUW literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/electrum_legs.png b/libs/textures/items/precious/electrum_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..b827eb2e986fcac3311ff00970f4bcc4e620207b GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFYj<$PKtAHHNd^fjZ zAngFe4;Z?6{QW?J1s;(=LB2yE%qXhi)c_JKD{xE)>IO1_cvJeFE+8wy)5S4_y$A0d3wK(rTo7SR>gADH*(s?zmE9`v_rMTHKHUXu_Vlzw|7#UfaSXvpH>l&C^85m^y^0T36$jwj5Osj-yFw`|P4KXsd zGB&g_GSf9M18R7{^!*7?gA~Yy;QX|b^2DN4hJeJ(yb?V>*ARs=V?9$nLj!{^MGJwd O7(8A5T-G@yGywp#U5>5* literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/electrum_pick.png b/libs/textures/items/precious/electrum_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..ea2fe87c9f85687051014f8b92b851d73433cace GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0b60G*|&7J!f zR-M~XzjLOWro5-7-b2!t6$HM|-?f@KAc=|J5;CJ=8*ztaU|C3(6y zhHzYW?cFHYV8FxtwCxtxlNH8J?;;dfnF}Hryv!D)l)TyD(EDE}lCAFI5)+Tx^CDzV z%)6?~*d5KavRJb4CLIPot(sarx(5u2>rnjZ^vQV zd3r%8&^FZ)*NBpo#FA92@P5LY0b60G*|&7J!f zR-M~XzjLOWr65~Bv{}P2^8cz1j3A>8eR<`!LkC!bf9h^6NopZ-{}Iff;?Ru zLpZJ{Cpa)RH8lyeO_-!KBP~RX#h9g)NAe(#VzPUpYe!3mV8q4+lMO<0J2o)Pn5dV* zlD47LNUKRwNLb>4$ztUrC2oR@8p;A$hRRps7|yI`n;|=`z#C|~YKdz^NlIc#s#S7P zDv)9@GB7mOH89pSG!8K`vNEx>GBnpUFtsu;$oA!DL(!0%pOTqY3DsbzYiJr`WNc+@ zXk}!kYhVV{@PO(26QBkukPX54X(i=}MX3w{iJ5sNdVa1U3T4K6rh0}3249L60#z}1 My85}Sb4q9e0MPk@eE@P5LY0b60G*|&7J!f zR-M~XzjLOWr8eR<`!LkC!bf9h^6NopZ-{}IfLOfj@ zLpZMM_8#OsV8FwC*Z=;+#}4}yg(WsQoN&3jL|J^v59LJJNs{~%W-b3B<=w@}=-lyJ z=g;+B8Ez_*9d6Ifc)MILDEB+J+P9j8+ftRHEO%QxW8WLkRx1^JV-wJP)e_f;l9a@f zRIB8oR3OD*WMF8lYhbKvXdGf>WMyJ$WoWKzU}|MxknPLQhN2-iKP5A*5~{&a*U&V? z$k@u*(8|b6*T4*@;Q`b4CqNBSARB`7(@M${i&7Z^5;OBk^!!{y6v~YCO!W*6489aC Q1gc{2boFyt=akR{0IIo*k^lez literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/platinum_axe.png b/libs/textures/items/precious/platinum_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb7f48b1ce58e6ce1b4e7cb52e7bb180c6edb95 GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0r=HY+m&HLTA z?mJYs-TnXH(@ZqOPp&gvT|#@c9vZ(( zop{4BdwWLrZC&QLRkD+o?)FK#IZ0z|dINz*yJNIK;@v%EZ#j&|KHR)XKmh+n1jWMMG|W zN@iLmRD+?ep=pSbv6Zo*m64gQff-Q41E%j!fEuJgHU#IVm6RtIr7{F0X6BXX`MHKD blo{)p>KPgsd?{K8RK?)w>gTe~DWM4f%2<+h literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/platinum_boots.png b/libs/textures/items/precious/platinum_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..c3dc6f6b11cbc70fc237ecab2afea738226af969 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF}Bs2s4Umcr}0o%L*LRfx3ZAAl{UIrwhmm_H=O!;kaJf6UckO zfy23*nTzWHqb2ud1MbiIiF;4iUEedMZ3*jv<~5oko7~?V5NtR*^-$s-%^3Y%Z@X*U zR@k1-RTbPA9eOK!`?aKXDzm0Xkxq!^40 z42^XSjCBo-LyU~9Of0Po&2XU4n*-HTT&T)tw)`Yqc}pYwVfxDBX|u_VYZn8D%MjWiG^$=lt9p@UV{1IXbl z@Q5sCVBi)8VMc~ob0mO*>?NMQuI%@ix%qWXIa@y82MQT`x;Tb#Tu)9oz&^w0FqeZ# z_mNkzZ-pJ!T-{x^zTw2%2-fgz%uc2TIt`sB2@+QiIEXMXEPuc?W6iZE>_F`dp00i_ I>zopr09>+1?f?J) literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/platinum_chest.png b/libs/textures/items/precious/platinum_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f0b579458de13c4de9fd83e99eea3382a70db3 GIT binary patch literal 483 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF?(l^yTETate!C8<`)MX5lF!N|bSSl7T<*U&h`$jHjX(#p_W*TB@uz#!X~pAAJr zZhlH;S|wD2p{}86h>@|Cv7wcbnXZ8uP{RYJ?@xdlq(C+V=ckpFCl;kL1SDqWmFW4o dhA5O7>zV2q8W?;jS_o9d;OXk;vd$@?2>|0WnEwC( literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/platinum_dust.png b/libs/textures/items/precious/platinum_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..19828547238137f1d33704815fb4baebb21592c2 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFk|q zfmUviV1Y*@P>}Bs2s4Umcr}0o%L*LRfx3ZAAl{UIrwhpP@N{tu;kcfhaDZEabpel} z>xzbn+Aba*o~8mi3zjT-#UmsX#%09I%E`&9xw5T6V$mtDRSAN}0#vUjY%n``A;7W2 zv8gFSmxbY_0*7SL;Ta&)RZCnWN>UO_QmvAUQh^kMk%6JHu7Rc?jk(G(1m7%$= zfvJ^&LAEbH8;XY9{FKbJN~i`yT|?6lBV#LLLn|XQT>~?qh6haFp8z#TfourQPb(=; oEJ|evNX*PD(erZ+Q7ALkGu1ORF!)lm5U7g5)78&qol`;+0E!}d7XSbN literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/platinum_helmet.png b/libs/textures/items/precious/platinum_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..186746c06e7a46321713730e1274a7dee55e1370 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFBPZ!4!j_ba?2YC+| za4;t_^JMb`j|{XLly47cx)h z+_-+jGSf=UU>^8d=n7uM(z2Gmu`68#y&4RmIfmW%OxJHzu zB$lLFB^RXvDF!10Lt|Y7V_iez5F;Zi6H6;Yb6o>dD+7aUUw$?e4Y~O#nQ4_!4Tidg zrXfbgR>p=_MrOJOW(bbkO{<_((iNuS&5!5jv*Y^ zU3)k3HW&ynzis+ASL6z(j=)An9!KBf5|VT4n_5&~>%RWNR_AHNnXr~M$Klqrl#{d9 zZ1XB%S$1|#>F17PQ@3cpE7`b(Bi+5v;BJD=kvs7da*{i5?hDwLn`OeUx|v-s`s5Km zpk=Bht`Q|Ei6yC4$wjF^iowXh&{)^NSl7@v#K_3X#L~*pT-U(V%D^Dom!AzqLvDUb zW?CgwgQ2dWX^4@rm9e3fk(sW68BoImrteRH8l*rr1m~xflqVLYG6W=M=9TFAxrQi| a8S9zq85$UTDOw0r#o+1c=d#Wzp$PzF8Io!M literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/platinum_ingot.png b/libs/textures/items/precious/platinum_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..b087f54a8926013143ff7c24615b1eb149a7d598 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*td z|3800f(0ItKtaAkAj~ML;ne^VEGuwK2kHhgfp}B;oh~3N%+tj&gyVW???K)M10LqP zyss|tILuto!aCs)!_*W1RyQ#De|TOp-}r;Aokx!47L&Qo;#Wo=I zjdcx-bq$R}jEt;IEUgU9bq!3d3=Fb;`Poo3#|nduss z0W~~e`u+r{K?-C;aDG}zd16s2LqK9?UWuNcYluRbv7V`(p@G4dqJ=oDMJzX3_IIbrrG%!0d zIy$;JDmb6Ga3nH9@PvSw2(O44i;)B?Z!0USLr~hGwvz%YT?|)DVNj0nI%6T&;qa`1 z(L>9Hp~Ioe@s?v(>r|db4wY0L2A31J7BVp0dBu51NW0GwXo+fxYeY#(Vo9o1a#1Rf zVlXl=G}bjR)-^N^F*33;v9vNY*EKM;GBC*Y9nN|taV5nH8C)1}TsY!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;-ihwR+VDNPH Kb6Mw<&;$UaBZLnC literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/platinum_pick.png b/libs/textures/items/precious/platinum_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..f665a6d5fff3c888c7832a2bd962fc4082bcd1ba GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0r=HY+m&HLTA z?mJYsd76oKrmJhnacB6+xwyFe|Np;5$z30)h_NKdFPOpM*^M+1C&}C0g)8I2moOlQ zGvCdv7)UDsaRI}pou~Lff(0ItKtaAkAj~ML;ne^VEGuwK2kHhgfp}B;oh~3N-qXb~ zgyXtvuOVMU0EhGG2YfZ+?*DlA#T_|#P}A05G}gRKORK2&bOt(yFJN>BdpwFj8>8`;;k3g*59 zTBTaz8c~vxSdwa$T$Bo=7>o=Ijdcx-bq$R}jEt;IEUgU9bq!3d3=Fb;`Poo3#|nduss0W~~e`u+r{K?-C;aDG}zd16s2LqK9?UWuNcYluRb Zv7V`(p@G4dqJ=(bbkO{<_((iNuS)raTjv*Y^ zlM@c`NwBgW5NV!Z*l|!pM?-@rO@fn?yHVnhS5r?@LTl5h1V%PSLB$TWHUoE6XMwX( ziYs`;1hW%NSd1hjc_mpCk8v{evKfj5zD;IeNL|jlxWupF2hal564!{5l*E!$tK_0o zAjM#0U}&ssV61Cs9Aac-WnyV%Xs&BuYGq)M?aR-Gq9HdwB{QuOs=-j#&@{xz*vi<@ z%E(ODzznG20n_&bP0l+XkKpSFHw literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/platinum_sword.png b/libs/textures/items/precious/platinum_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..78fe415cf1cc3d2d084c984dcd94cd75223333bf GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFUO_QmvAUQh^kMk%6JHu7Rc?jk(G(1m7%$=fvJ^&LAEbH8;XY9{FKbJN~i`y zT|?6lBV#LLLn|XQT>~?qh6haFp8z#TfourQPb(=;EJ|evNX*PD(erZ+Q7ALkGu1OR UF!)lm5U7g5)78&qol`;+01LQ~SO5S3 literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/silver_axe.png b/libs/textures/items/precious/silver_axe.png new file mode 100644 index 0000000000000000000000000000000000000000..6b36f0ca4f42879e300c58ec16b70ee378cf14ef GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0bmX`MK|Nkpj zuB=_V_UY57o@SyMesUUe+@0y_|NsA=@}%`FP!VHEkY6x^!?PP{AWo9Ey9-ywg)d=1 z4rjibTQQIZxh;Sp+5IIWNU*>o5-7-b2!t6$HM|-?f@KAc=|J5;CJ=8*ztaU|g?PF+ zhHzX@PB_5E!peHUWbq`WW`z#L6eT4I4xxau5)-DAhO0QZtePdecn&qSIfyN0SghPE z&~b2r-T?-)hP6yt^HP{w(o9;oI=CEIWfn5^1TZq}{KF(}B8yOd#Hrey0n_^73?X4B@z*oN$1p ziKoedC53}iib>GpNTfhV1CN^{qXLuRA(jRX*CUY)7g>%77>Xo_l(C%T;5LwAdMeS| zn8qQ^ZO|a<6!MsfVb3Pk>pv1NZvvXCTH+c}l9E`GYL#4+3Zxi}3=EBR4UBaSjYEu# ztV}Ge49#^7OsxzIvVHm4P&DM`r(~v8LNyrb8k&X}8Cw|}S{a$?8khk!JYf3%1gJp@ vWJ7R%T1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvfK$u6{1-oD!Mi`GF*t79Ho7) zn!$r9f8sZpV4hjb4Rj%cr>mdKI;Vst E0QQn!asU7T literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/silver_chest.png b/libs/textures/items/precious/silver_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb86b228496eb8b6ff51c753a81b04d7b2f8ec7 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_!@hljQC0!Y-EB@fyhC%y)Au2GSrW zU0{efQs@N|Ebxc~3i2HSVMb96uLh7{S%G6ZP&beX#GBIZbOBkxo-U3d9M^k$HVQTv z@Gw8+of2{3`HTZGVjohO+!Fq)dh|_d%U|+H^+C7jf`YWSTP}7~sraThm-`>((5T(* z#QFI~et)L-$}^_(yLNDi9{WD&$8qL~^6V$>eUXv^8n0U78c~vxSdwa$T$Bo=7>o=I zjdcx-bq$R}jEt;IEUgU9bq!3d3=Fb;`Poo3#|nduss z0W~~e`u+r{K?-C;aDG}zd16s2LqK9?UWuNcYluRbv7V`(p@G4dqJ=C=Dz z|95nBT)A@P|NsB%xWeOr5{xB5e!&b5&u*lFI7!~_E^LWuJ8FR(&U`nwVjvB2j{yVQ zuBK%m!2*v+pdjBN5M~tB@M-`FmK8Xr19bzLK)fmaP8X2n;pyTS!f`!0;Q+S;>jEA{ z*A)#DwOu?sJWU037A#rvibqH&jLV3Zm6MZIb7fnD#G+GPs}cl{1*l$6*kE?>LV#n3 zV^dRvE(^m;1rEug!!tmptCqM%l%ynmdKI;Vst0C>WDWdHyG literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/silver_helmet.png b/libs/textures/items/precious/silver_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..563490597eccb3b4afe1ebd7ec3c09c377b67f49 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*mGvCdv7)XPh zbbvvKEm;~QSl|%}6y!Su!i=ICUJW3@vI56+pl%=&h&QF*=>oFCJY5_^IIbrr9AIN% zRWw;VVG+X&#WxyB9AX9{z9MX#hD|OGJdT%Dwk9kna&u2q7j+g~Fk!*M#T^?IA~tSN zj4*6oFwy9Ui(7JXMnC}Q!>*kp&ATz4NXIgjIE3ft&Gfc z4a|TV9x#1>0@NS{vLQG>t)x7$D3u`~F*C13&(AePq0Cs%RL{`B;7id$pehDWS3j3^ HP6 zuKfG||LN1Go@SyMesZ1Z>Kby~9UUG2|Noy`84T3Nz*rLG7tG-B>_!@hljQC0!YzOO z$N?aSGvCdv7)XPhm%y-x@%|@}V1Y*@P>}Bs2s4Umcr}0o%L*LRfx3ZAAl{UIrwhmm z@N{tu;kcfhkRT$G(!ii7%*fFkcypp-0E3c>22YxSR+oiS3Tv-y;wpt8o<&Vv32f1d z%tu!Aa0-a#ObwWJ46=Rs*-$j(=BH$)RYElw>KdAc7#Uj` z8(JBe=^B^;H9TPY{sgE&3S>iYep*R+Vo@qXKw@TIiJqTph(ejMo~fRpfx(xeg+Nsd Mp00i_>zopr0F7vag8%>k literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/silver_ingot.png b/libs/textures/items/precious/silver_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..d03f669beac74dc938856f10230d9af3a849cea6 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*WRj~S?WLwR7+eVN>UO_QmvAUQh^kMk%6JH zu7Rc?jk(G(1m7%$=fvJ^&LAEbH8;XY9{FKbJN~i`yT|?6lBV#LLLn|XQT>~?q zh6haFp8z#TfourQPb(=;EJ|evNX*PD(erZ+Q7ALkGu1ORF!)lm5U7g5)78&qol`;+ E06tZUTmS$7 literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/silver_legs.png b/libs/textures/items/precious/silver_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..2513289478ed36e1fea87024836de297dce51b61 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFoDsJzX3_IIbrrI504} zF}ewyU7?Yqp~8^Dv9n9HO`}Po$$=q>qpgdrjf+WAsi}vlsZT+WP2-@327`-3+lo~T z$pH!;M?xD6T^O|Z!`Q_g4H9-OU|2OC7#SEE z>lzsA8XAWf8CjWFS{a(_8kkxc7-akMv!Q6n%}>cptAuJW)HO5>F*3F?HncJ_(={*y zYIwl({RvQm6v&3){Irtt#G+J&fW*wa5hJyShH1A{L`3xTQ_JYD@<);T3K F0RT2Xe+U2o literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/silver_pick.png b/libs/textures/items/precious/silver_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..35169e275e4d5b0cc080e970357a0399f8d9aa02 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFC?4q z*Iv1D<=_ARo@SyQ9UYzN>Kby~8GdsA|Nr+t6TAedjmdKI;Vst05-&g=l}o! literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/silver_shovel.png b/libs/textures/items/precious/silver_shovel.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3f671c38afa1d9ca99b92754c0e1df0b06c111 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5LY0bmX`MK|Nkpj zuB=_V*3(Qh!%wa=U0p+t`{~oC|NsAQv#?qSRK!>k;OM=``9h(YTC$7TsF28J46R$uv*_NRfys+PD$l%yn@P5LY0bmX`MK|NpgX z*Iv1D<>}L>o@SyMesZ1Z>Kby~|NsBDzvZ|AsEDy7$S;_|;n|He5GTpo-GwXT!j~{0 zhcn;Jtr$py+%|z>#a=sqkYIsFBv6p=5C}7hYIrq(1j`B>(}B8yOd#Hrey0n_^7eFb z4B@z*oWQ{B=E!kYVF`z5Kv@gd3=Rcu4hL2V=7mf>>jFd%^)(6T_9%4;=sGNPFgP2g z@rX-o(hLQjZ5@Ua8U+_It(wG`X3uc-HQVFIG9NX7#;TUMMwFx^mZVxG7o`Fz1|tJQ zV_gGdT|?s#BO@ylODjWjT?11q1A}Z|el`>hx%nxXX_Zh7hPsBPAx6el#)ei#X1WGu zKn)L=zCQtKkOJ8doS#-wo>-L15RjOeSEA?V8lq5UtY@lcXkhTAXdzG)gQu&X%Q~lo FCICG>f$IPO literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/zinc_bucket_fill.png b/libs/textures/items/precious/zinc_bucket_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..e8ad020140e83982a0444fca40c27f7aa1386a42 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=6*(d97__Jv~i*eN9uQ zbkCX7vt-GPWh;tTuU>fQ@T?m*cXB@}tpKWHED7=pW^j0RBMrn!@^*J&=wOxg0CG4B zJR*x37`TN&n2}-D90{Nxdx@v7EBifWZUHM6uf>z?fI`NeE{-7_*OL1Z(&zb=E}APiAATpRwW1?3sAkDu)*x$g#gD6 z$EKzTT^5Fy3LKI}hi8CHS1oakC`m~yNwrEYN(E93Mh1q)x(3F&hQ=XAMph=4R)*%f z2Bua92HC#+Y$zIX^HVa@Dxn$-bq!5JjEt>}4XupKbPdda8Xhoxe*)AX1+pPHKdq!Z ou_%=xATcwqM9KLZB)JPgg&ebxsLQ0F#k=(*OVf literal 0 HcmV?d00001 diff --git a/libs/textures/items/precious/zinc_ingot.png b/libs/textures/items/precious/zinc_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..1f03aea43f3b4a0cd23b880ceecee5c54a1c6ba0 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFa)#SXSVe4%7`~0`aEwJ6%9ln5Tr(-h;di20YAn zd0$=PahSQFg>}LqhN&n1t!`lQ|M0wIzVQcJJC7X8EhclF#jlzw-|(E`IrVDUlzW+F zJU-E;#qtw2-%D{T`Y7lq_-y;{&()0A4sz`?k1w4Kv_ZARHKHUXu_Vlzw|7#UfaSXvpH>l&C^85m^y^0T36$jwj5Osj-yFw`|P4KXsdGB&g_GSf9M z18R7{^!*7?gA~Yy;QX|b^2DN4hJeJ(yb?V>*ARs=V?9$nLj!{^MGJwd7(8A5T-G@y GGywqk-iuHG literal 0 HcmV?d00001 diff --git a/libs/textures/items/utility/bitumen.png b/libs/textures/items/utility/bitumen.png new file mode 100644 index 0000000000000000000000000000000000000000..d553f4e873bb3618d21477dc937de46893a1aeef GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFo5-7-b2!t6$HM|-?f@KAc=|J5;CJ=8*ztaU|MR>Y6hHzZZ?L8>iV8FpLnXjmg zO+@NM4{yS{|Fc?N9B!|$W}kLsQ4V=pFq?BxtkD);t8)y6jZxa7 zH@<#g*fe?O-Y;H)?k4N%1rKfi!KT5%X|`FXIs#~iYKdz^NlIc#s#S7PDv)9@GB7mO zH89pSGzl>@v@$lcGBMCKFtsu;V9GeqgrXrgKP5A*5~RUM*U(Vcz$C=T(8|Qr%G5~L zzznE?we>y+P=gf6hT#0PlJdl&REB`W%)AmkKi3e2GGjecJwpS7FGUN1su(<7{an^L HB{Ts5eKCfa literal 0 HcmV?d00001 diff --git a/libs/textures/items/utility/phosphorus.png b/libs/textures/items/utility/phosphorus.png new file mode 100644 index 0000000000000000000000000000000000000000..cb643fd15f2ec7ded2cf072a12cdb5c54cef943f GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFF&O$ynI7X zPj`HLMNrWH|Nl9!+{gt=FqQ=Q1v5B2yO9RsBze2LuqCGLs0DI3^WEHvfiwsRFid!{ zWIm9=S>O=~6y!Su!i=ICUJW3@vI56+pl%=&h&QF*=>oDsJzX3_IIbrrC@@H{vMO$w zFi~-a;-WQcI2N(a?Kz;-bL!Nog^dcF%F4l_3e6WiBTZdg8yX$2xN4r@R8fBQXw@Pu zhNPBVyV#l}dKNBh6ewn0_{^D+!A_S;kEv*R7|;UM64!{5l*E!$tK_0oAjM#0U}&ss zV61Cs5@Kj*Wo%|;VxVhaYGq)+lyRU5MMG|WN@iLmNQ05Cp`osUNr;i5m5Hg9sgbUM z8Bhaj>wONO1}TsY!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;-iWUM@F?hQAxvX}Bs2s4Umcr}0o%L*LRfx3ZAAl{UIrwhn(@pN$v;kcfhpdfC*WyIAW z>D1UO_ zQmvAUQh^kMk%6JHu7RKPgs Td?{K8RK?)w>gTe~DWM4fp<#Lm literal 0 HcmV?d00001 diff --git a/libs/textures/items/utility/sulfur.png b/libs/textures/items/utility/sulfur.png new file mode 100644 index 0000000000000000000000000000000000000000..6d686510d217a32aff55e462909a365810142c26 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFoERJzX3_IIbrrD2Q=5WxBa) zICC6I5D{TBW?`KxWujHHAMt8*_;t23(viz}-uuPCcy(W0iN zWlRZgnF=NYJ@3xRHs#gs-VH#5RZCnWN>UO_QmvAUQh^kMk%6JHu7RKPgsd?{K8RK?)w>gTe~DWM4frs;Z% literal 0 HcmV?d00001 diff --git a/libs/textures/items/vanilla/gold_dust.png b/libs/textures/items/vanilla/gold_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..71af5d26aece76ea912d7c890234e47f2bd3689a GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)($X?><>&kwIOP+~W#9b&HD90dG;u=vBoS#-wo>-L15RjOeSEA?V z8lq5UtY@lcXkhTAXdzHlgQtsQh=qT0g2cUq>O}|Y1=LPYSLm(3SJ`ZMvaP}7&;R|R z>wX@u%6-J^xJ~jI(*#Br$tGXp69O~RCaf-~V!wIQz*j+P3FkAWJ$j8d`GQ!At<3Zv zeBnC5Fe5F3VUe_hflfl3!fvKWo_vV|LfkqZ6F!@JzGO@ja9ufZjf&4IHHL)-pB*=| SYfS~Zg~8L+&t;ucLK6U1L|Cr? literal 0 HcmV?d00001 diff --git a/libs/textures/items/vanilla/iron_dust.png b/libs/textures/items/vanilla/iron_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..163d169d7d9ec9808934d3807b7299856a98afbd GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~LG}_)Usv`!T=Go3BJM)rhk!y-C9V-A!TD(=<%vb93;~Imc_n&& zt|1C##(JiDh6V;-iWUM@HF&x>hFJI~CrI2&sEz+wFQ9gMxJU688)mRK+459ekEQ=@Ro9g{~mwNY5D|z6|@b|D9)M SVb~6I3xlVtpUXO@geCwwNLbSV literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/base/angmallen_layer_1.png b/libs/textures/models/armor/base/angmallen_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e83be738e1e6912b50b7c773f36f004200febbb3 GIT binary patch literal 693 zcmV;m0!safP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0!m3lK~!i%?O4lA z#Xt;9I~2j0-Z)SJH!6SvXn`YV#E~Kbjx0-tW^RWbXN+%U8jN^8r49W=F`54$%2`65tp*GvF+Nvj_a|Civ%AK*&^{l~UMd`$|B_Mgw&AmlEJ3%LK?3 zIF|}XKI;ukGRvKVqvZ<$0LJCOwGAC6g3q~usx4PKqX9bm3js(~PFarj^z+jQ;vVZ| zb~5|?9_Qd_`LY=*rEGx2Pj%L0(1r6Q`=h~avA=0I$ln9D7#*pjWVXJ`643jFtqx;u z!BX04&k~?tgIZtM`aF6O8g{EaOTZB`pyx7b32+Q=ZEz($ZJ4fcIyq0;bK|C31 zeIjk)oa$#AE53)}4A0kGy8w0}K!+xEP^ZL9Uk4_TSR3(OGC*I-n;k@Q4UkTtI(cS< zX~vbVcgX;DCL5m>5CCJv$)3M96Mlt&%sFh2Gq9=;z}Pu*1~>q%^5Pg=!?=P35Zxzm z6VvUqrhTt<-Vt>9BE$}5U3yKPMVV_}>%Y_lg9QG55Z4YstGr7Fl$u}$D9bDm#3j&c z)O7@1wz)MC)(GnGvIdBw$|ZsGT{58OGNVI}g4BrA>br>6%9~3dd!dfErEym?r*vHl bsz(1C$(rY@LdKSU00000NkvXXu0mjf@%}Ff literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/base/angmallen_layer_2.png b/libs/textures/models/armor/base/angmallen_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f58db3a933f91f03daa27116f75101f2dc9617 GIT binary patch literal 422 zcmV;X0a^ZuP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Xs=VK~!i%?N`AK z!Y~ZXIt;;^-FPqoKPG?ySb-;R#Ir*LT*>HUT*@gFwN8*C;r7zz&X?FtIpk81_kNI}p_ChR?6tiYm03lzs099=PyXV=MvD+N6NeExgo0sJ^mTM}8 zYzK_xzs7SU#jL3pz>d>lon;KU0q-*}ni{f+o&zG4 zN%st}0@$pF6QHCDuw|3QPknH@4qz84tur2?63a8NrPj_;uMgpM?!P+G;?H4EEG36q z1qs_ZpYW4Ap!5Yo#x_ctJuH{#00v*WzOnf~aR3t4>|)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m_e01m_fl`9S#00007bV*G`2iyT0 z7c>hd!4OaY00O*8L_t(&-tAa1Yuiu|J{4gQ1WYL=%21jts+V-Dv8QzLs3E(Fe?#%s z&hBRV8w%PxXzbEX753D2alOv2 z&j9ftN;s_3tZ}&R{Vd$*6;K(6hNJU6zs~l1ejS1+VYu%7EZnr%DuAAN&#%KE9J3${ z!ZCE3HBP6~tUbOWh)$uygK)gz{6lq|Wx#N{fTL;!oFoC%46^UKVCN0J`r1{qqw};r-`7MvWG~Pvqqhwoc(bq^XfM zh~l}-NWAR;~=t337wsbODoi$qeqc+?2M-o?mCQ z+H)Of93ODTiUC5_DWlW7t_#h8FK{7G@4tS*8H&V89KJ-leH+oW z+T0ni9+cLGFu<0z;{_dM5uqiTgCYrC!s&4B*-Ns6Z~J58FFBAxbJ zhszk5eqJd&1L&z^%N$M@&=88zaJt}X1rQ%(udYCD? zDxRAMoV~2F`+|2z6cM9$O*Y`5qvEinB376km=TkB$@Yq#7VU4p=Ub5;8K%<5yDi(3 zy+g0gU6U{y`)xRyvGx>>W&i-(8lOd697eh=H*FjrY#5JwvZ90;Lf=v8{`UY-(jZn| z{Q9FJ7b?Obo}_B;K8(dSby#dkG$5)g(B5+XzpE47RsI3p)CRRCjuJuu0000| zgW!U_%O?XxI14-?iy0XBj({-ZRBb+KpdfpRr>`sf9Y$$!6DglUgGE50AD%9bAsP4H z&RodXY#`9Ko_nUM@M(j~p`RB7RClKe+)MD^WUlboa@neihLu@7eOHq5R&gfk-n?__ zZoY@t+1i@DGAkWi7R=!l;Ac)?;AvnqU|>7IAi)6Rbag)CF4YXoWS(Ba&%p5fxAz32 z2Rm+m5>((_Ang`qyFgDh>TT>%`+W5h#-LjcddVx~tX{|oYUa+--z Jmvv4FO#qzfjavW! literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/base/copper_layer_1.png b/libs/textures/models/armor/base/copper_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..71f2ffe89fa8867acc18798669bda50074c483f4 GIT binary patch literal 672 zcmV;R0$=@!P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m_e01m_fl`9S#00007bV*G`2iyn? z5IPU%Y1*s+00JOML_t(&-tAaHZh}w{9a=VOwCM_#J%L6yL|w3MH>SOViM>F3h3W-r z;vJf}>AEaz!Um%!V2PVH)--M;zpJ6cS3X)qq%x}y%qM>yGxOdcF~&e-U)>v_L+SBV zf)v{soVaBGWB_CUWB_CUoU%#tr)w7G1+w6vjPABO_jlPR$g#4NL*{G4E>?ut;V zSs;k!czWBF4$;3|DMmV9SdWMd0R3r76(JQ=D3CClsEi()BdBUkZ!eYKV{^2YjUu77 z={ihj$ooi1{@|`{f$1!KU%jm4psLlNKQz|%xVGgBxT-ZhAHD>4y^g&EkR}oRvXXdv1C_xk&L0_15 zWzqB0X29ERiESf+gJy!Hr^Cn@5JXLs%Esm>kiztoXTT4PsYbAsVQjbn0000| zgW!U_%O?XxI14-?iy0XBj({-ZRBb+KpdfpRr>`sf9S&{*OY65EYHtCBUU<4VhGg7( zd&7~d$w7qeLH!|LmaS)kxA5MoXju__h1JGIonx2t1>P*>9fF@&^h!k)AGys8+tuN= z+SB7%{c6c)=`H==(-uw$I`l;9zy~D;Mh*uCCV>V976o+XVy`*j$!q^VI`>iU7f-_3 zWzGx^GoGxtcK^*y#@e?G_Ig|N3aaigUc0lcr;cT-HN)$Zrv*PfW}3aU*@&xP$Fhv( zb)OhE*vG!AxvreHGj7?}#@pAz7?x-(UT|-_?Tq=)>e&`lJI;8LKiBl>tWW3mGp}$v n@zrQ!bkCE|QK749t~2oGswUV7xSsz4^fQB}tDnm{r-UW|Sk{Y< literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/base/damascus_steel_layer_1.png b/libs/textures/models/armor/base/damascus_steel_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a692a35354b6c22749921cc7812a1b5e90574a08 GIT binary patch literal 694 zcmV;n0!jUeP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0!v9mK~!i%?O4lg z!!Qih6g_uH~PfBfBmNt66Ki`+p z6VV?XK2+X>KMin3z?lMP4LFP7pbi|p%182@T_9?6fL~r;wpzgNS^6GcVkm_l`H4;2N96g*)pq-^ymhU?1Y8r6pYVLcrU_>AB&k8yVuUX#mW6JOv3a}!) zH=;#N&~IRUh#H^@dqQ(c@cSO+y<%(hvpk#SyOy9{2y1m`&-E%k^J3m8cK8QgR?t~^ zy9c3Jf@Jw>I%Vm4c%cC_I;tP6(whOSgIFE1|0=)G0NUEBAFR?p-2g|708WFdLBj}$ zKF}+mN*5K{9zHy7;SR+)1vEk#mgzDNF#v>vk~-z-SprHaJ{t)4|q^wL#P3CjzH+D@xV_FoLxV~0N#|B*<&0; zg+|jJZ+p0R86cX{7|x@#3gCIu!$)**Bw;U7pbB@#V9rI)stQ-HX-ar&O^IH_R27Wq zxBCFT@lk=1pL{lma!@@zDuO+}wjU`_g@*^BdvcJE%ieL?OBED5#jh$D(cjz%K`_3# zQNeWW4KRA7Ml^UH<*xB>H6W9-9P*Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Rl-xK~!i%?O59l z0x=Bh6nrzl?Z5>5v&3z}0t~<^tQF)+K~d>LRdgTM_@kl`sgAg|lOu^pio8M>kBcV& zk?BtcPy+M-njpIXy8tIaj>4gRAawDZ1UU&-Cc*7`5xZ7zlYbt7;y>@Fy!LwrA|wDP zJ~RNKBv5L8Ha@#V5()<0AGhsielzhB0LPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2iyuB z1S=dQlj!XL00II@L_t(&-tAaBj)O1|9V5CeQ_w_86KPXWg@Ob42w02Z8rlQNF&{onncX$%`DIfS1Qk zTmY-b&3Xfu-^*a(q^dM&N?#tUT)+wd;sM4gB(AYpY0d(`(9O#F2r{|m(X`}|H+8ib z+K9G&7J%tWWwP-$hUU?9`V4ctH-f&XJZ3BsDo;}i(JF$x$h8_LC_npi*!HGqzA7HC zxLDjEZ)z6^WXQ|%df&LbmW2ORH!73I6v@la)i4Ql^7>pQtBbPR*ac)Jih)(^2lScq cSb3ZD2f>c6y3?zwM*si-07*qoM6N<$f(z3c&Hw-a literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/base/hepatizon_layer_2.png b/libs/textures/models/armor/base/hepatizon_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..906942fc2bb39a8506066c1c3123dbc3a9a3e254 GIT binary patch literal 379 zcmV->0fhdEP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0T4+h*8 zQh*vj5o8x&7oZcQ6;7=Kse`8zq!Vp!hc*_VC;Sf095caNCZHI(c2FJfMgp%ILdgmHn~y20$|%9W3jlUM3f#Q0V#{2{TtO7Jry*|U9AFa^V Z_g|VP002ovPDHLkV1n23n;ifE literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/base/steel_layer_1.png b/libs/textures/models/armor/base/steel_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..42f82b5375335d6f4d384e74186fd879645728f1 GIT binary patch literal 582 zcmV-M0=fN(P)rHmn{)syxAl%`9XhIQa4Zu9F+>C`%Tlzkg<=$- zvs#by;oNAG4nP)fL13w2^`paVZtPD7P~WVa)rLp<(57YnQ~;igc5Go?`8fa#+Ytcl z`~FGAzl;EV^8954bWMRsS__;$5zrP-1k3J>{2T!8h+a5z-nty&u_@2iZwT+grH|~C z2#`W0?fPt8lV!2mS$U4G)xDjMuX_24jpNy)qv>c$ZCL23(lO(CTn#aHy*=WP*fD@zilAN;I@Qv~A32djo;`zdHA0&JU`57Uj`}@kJt*F8cLi{F z1Vkxg+2i+g18{c@km&GqEIQc#4_yFYrPgilnDL;r=vwTDj{r6)_C?`*)c#I+0gwxj USd&&U#sB~S07*qoM6N<$f(oJU`Tzg` literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/base/steel_layer_2.png b/libs/textures/models/armor/base/steel_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bb1939df3a6b909c4f7b69a405984054b5d11477 GIT binary patch literal 405 zcmV;G0c!qPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0V+vEK~!i%?O4$X zg)j{4cCOMAjc8Cp35@J_(3i{#gMjf$Ra< z1ak`H6v$05SK-ioAT;>g1alJ{Y=X7cu4nZz`PTyg{y2`l@B2waNCE&pGy$O`pkTLc z>!WiO^L2?7f&=i@+DQOxe1;TggB{PX(Z2)%1U0JwC1E)NH1k&#Kp*3msQ_l3Ssqn^ z`X~d+;`0*F3Q#gEAzA?(lZan}0A`b95THteB?z#S03dnn1W=z=#jJsP?QauY zydMbibaT`ZX^G`_`6T{z0=zHa&VXvr{XylV@_8EX{l2^V?jItv&CyCnr-!{mpH>WQ zcL2P8HvyCYD}b4|<5C+cWx^P}Yd29Zz`OfD&O-kivW3?K00000NkvXXu0mjfB~73_ literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/ender/desichalkos_layer_1.png b/libs/textures/models/armor/ender/desichalkos_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..927ae5addd092d48e2b68470b46f82e6c2429b58 GIT binary patch literal 774 zcmV+h1Nr=kP)hdgF?XD6A!-AQhe*_@M`n|r6K>$-}`)xk@Byn5{w>r2fqU8br;d3}DXK7O8D zePwOQi51gXU++tbA=~NQg;OWkd2Z+4!HHXdmF>Zvd)|FrI$>S!ONyc8*$ubb_Ovr^ z!n)i$IIc7z0H9f*%MD=SM__aQusXjvsupL~UERd$rn7qAOOgOP^8m^|z;vkhy70ZO z=8dzC^UlJ09v_MqFb@BNdhR1o`OY;1=KA~DrxWe-5y8SFC=uBSfM@53PXXL-J^TZ1 zb<-(G03AlM6QJfA+DQhi;4wZFGAlW(%T9oA7h}LfM1-s-_5LCVh&e%+zXE4n$O(pk zbGrxv26OvPuqgHV4A@5q#@l?n%LM(b)BfxP*pHg2hP_OJg6H$ECXYV}9f{oF{|JbQ zI}-HK4?J-#)}Ve&4q9vaU_8v?I{^f;mNz|1H@x_p`31Wq&e>Tk_5EnZPgcq0P#2wreiSI`a2Ya;4#{g;46#ItIMegBsV!j=YwL?1_B1qF^zBM!@ z&qBa3ZN1h~fPB|xOo~4O9Cf8WiSZbG8&qQX9bGuVU%5t4sTZhig#Z8m07*qoM6N<$ Eg53^QlmGw# literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/ender/desichalkos_layer_2.png b/libs/textures/models/armor/ender/desichalkos_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c23ca0b5fe8905bd44c609d06baf226b67d9d32c GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOFt2Ev0|&QUwZ$ zm$*ih1m~xflqVLYGPwJ=0F6;7OD$3`)-x$=UGfm9grlUu&mAaZ3}iESHE7BMDVB6c zUq=Rpjs4tz5?O(Kwj^(N7l!{JxM1({$qWpP7M?DSAr*6;PFv4+$Uxwjbd%$x1p?KK zEK;m|C#3~cq*T^7I4x{*RraXhI3ve++IdRMWVP+l#uCxrQ{SrY&$$~r?ft(kvoA%h zp3%td@VR;c*XD=<#*7C{7Y?v40E#e+H?Zk3@WwDm?O-rLlUVj4!6+t!FKR)4)v3ha zS3PwnuRSd~Z>L&<`Ch4{84WMCJ19O}wLo}9wLl_V>%1O)V8K-OpTo>!ZSX2BUiyZ$Dgg>1N>0niLb>gMZYI)UnNAI&=JW z%%Lr66^Ckc|Jr3PWhnJDk6fp)W!m}5#?z19)zn!n|<8sr5%5mzu?M?wa)Rcm1Q|!I^G(+Z==JHM{hOId-FJFF-HF+^?Yl|DsUoeZSd3}7M%r9dT6&d>)rWe zbXy_=#Ez+QNOj8f76OwS7L8mTge=U zMeT2fe@aX54X65igiblc`Z{OnS7X4KZN@U%`kcmd92$!a0V}TcYJEIqMli4lhRn?k Zz%So;mSSTl+4%qf002ovPDHLkV1iS6BAoyL literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/ender/eximite_layer_2.png b/libs/textures/models/armor/ender/eximite_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b43af963214b421c6520229da70177f5edd72b GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOFsNR|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lNlHobv#`hLn`LHoo35-$biR9`Q3qIOwz*A zO~wj(2M!!Kb%1qOA?pz!`Y~l{h+zSq}UU6FIO|_)W`O>F>SyyBX|XhO`uPl$*zbLfF&Q&t;ucLK6V|d%4a4 literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/adamantine_layer_1.png b/libs/textures/models/armor/fantasy/adamantine_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c5c60ec71c58a288037e31fa8e4e3f7d7f6fd2 GIT binary patch literal 754 zcmVMq0bGN|(0P30br3Ua%Knwy(hlH}72B`tuoPeSMSqKSb z+g3aZ0S3At(A<_9Kr{uIy{=YgD;`Y&FUw^|0ccAN;IFngE*7=g+j?Cen)7pGS#x}z zPT66z$#7WN+U&3~hxQupUS{=vf4-NUkL`U?&Qc#=e{8oM1!$WWDc~n6@goSK zb5Kx+fHJ>yat4&k0B&tu?jxbkk`timEr96P)-UKOpve7{nNw#?t&(359zx;wG9qXN0$19rzSD_1E(Nh$~@vO6;S2V`H;I*K-4L4?F)`=|BchU z#-b8{Xb|f6WXlnxlrrZH9FoV>Z%#m8NDKk;#=^NVkfF?S77E~G$jWs$JD*@_lrf8o>f~g2Z#ab=iL;;u%42YehIyiNnR*v=0 zQzx|yec`@3hdT!E5u)SqJoIBstp6Qc0>;$Yqx0T?0)hkNDZra3o-*!Y3P8dDs38!> k?N)}wOBth);?@Lw12#PROnJY?1poj507*qoM6N<$f_KS4C;$Ke literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/adamantine_layer_2.png b/libs/textures/models/armor/fantasy/adamantine_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..43c7c9e8057fa0b24ee6268a7e1be254f1c7cfdb GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOH@wOx@J5M4#wAQk68f(9z60EtsjP~-|xlpax}

xiP(cNv-~iB4kXWR|>@ypspJ71ka_Zh>*oYTY=UmN-Lm;Go1i2 zx{o7gJyT$u2HKZnbxsAw0rs0k$y$u{lo!}OIyMwEy?SX6sA5Tu3g-3k6y?oh`PyDw z0r+G0@Vrqx#M|fiMIZJL%@aBuN((<%Kn&LHOD{OL5|gR04P;%Q+sPyvq*tMxREJz2 z%1K$T;%&QJ*S0|R1%(zCOO=-mn(Lr(3`i07qk_DHv-6sLP}VjNNTSdWKw0O*He`97 zdX$=afadjj)3bSieNFbp*0p#-dR9$-J{S=xF=2$~|ZZ`1W96_6v+dap)SAoUJ<49A7$Z6ovSF*55T z=c@I$$A^VXk;xPIfb!UnZ9|FJn3MB@*GlG@>%65kHR4;B_AH*dHn-vduujavw%ykC zA%u@4AU>gMefT?8$JmDy&e@s=G&yF}s`~mH3Xa~B0fl1&!Pe%;F7fdJMd15-b01xRW!NMc2U8Sa?HlH1#H3y8baRdd2Ebd>LJft#6!WdBHdTJwN~K zc>=QXTerUbq4J)==w{%nZSQuN00o}bvHxIt!*|^4&=X;!#Fwutyx1ZezrW2|Ba!)u z)2z!g{`kxFoAo%HMKIkpIl!88TKj}an8K6 zernfT|Ja5~`QRn-oWE;T*GSY$SBB0yw|oo#p%sSHLmf_@0){Gsr>mdKI;Vst06vJe A6aWAK literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/atlarus_layer_1.png b/libs/textures/models/armor/fantasy/atlarus_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2492a9955e7fcf70e6e2a8c12a99c38719e653a3 GIT binary patch literal 672 zcmV;R0$=@!P)W z@2C9rnWWj?=JlQ1=79;QuwkzQ5ElU#0T%)15%BSzvPy)uHtcl(;#2}&p8o(FSR0$! z*w$>^8bB2S9K3rU*IEO(n*jBGcMqG)-RqbOoP>dZ@eE!k>xE8pNOB--=yfClfwLMS zQzY~fLP>c>fr=C`3x~kdtJazTlq$;_$9vZ>S45#OTWd`~Bz=tS3FLSY0>!g?LV?xO z1p%xA1TuM>E@ZFsn*xEZ&ATAL9v+PWMFcQm>ON{6_nQ-dl6FgJAjT~uV6@@fc#V{I z6cVk$PXw&lB9S$I;L;>k|G^Rjl&m8jQUTbT{7VH?4S^#MHY<#R2j|!7k)(NxRV5&j zr@soLqRL5mdtDY{e$QLyrxSpl#cq-TVW-F?bW|v*CagaNKz)w|4g%Ki}`KJRlT ztX8`$2{KN33t literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/atlarus_layer_2.png b/libs/textures/models/armor/fantasy/atlarus_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3d91d590c25d5bc5ad460f25890967f672a911 GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOMd67*;xc@dpZt zm$*ih1m~xflqVLYGPwJ=0F6;7OD$3`)-x$=UGfm9grlUu&mAaZ3}iESHE7BMDVB6c zUq=Rpjs4tz5?O(Kwj^(N7l!{JxM1({$v}}Wo-U3d6?2|WJIH&;fXB5sL37>RF42f~ zQ!AF)JDwyY&eZU|+Oqsu`*O1*PXGT~w5cd*8tq`1_3e;Jdc+O}sTc-cy#_XMhi2{t z2U#yXV9F?9G(i>q`7>ds`o;@P6B(Y=PW~!t(U41+S<4BYP?dzC4sNuNBJ*a`{m6N kFpKlv2K$fKeqChDDLB_9mR4pR4fH>Qr>mdKI;Vst0HPwBpa1{> literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/black_steel_layer_1.png b/libs/textures/models/armor/fantasy/black_steel_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..41edf9220307fb6da009f0bcfb1d3b025b8675f3 GIT binary patch literal 754 zcmVfOdj~jqS<= z=J@!W{H(j1?4AR2*<`Z0%r}3@x~6GdjBg*Go5kt1$s$X=KX#tE1l`>~xX-s&|9o+N z=2=L_L^gR!AtaXGJ3R5MmdAc=3l8o9Ld%<#Z{J^@Jmc8ZDGLCh@2?NHGe7by&znNo z00^N6Yz*b(fbIQ-XU+WBuN}i(IXOWTm4v5CE9+Qo1v&$ObsZH{OQ$>l=jxbsUeI~? z&KNw%vC^!#_R$OUIW(72(4?ytXTQr`104djA1U|P~i1K{n{R| zE^~O+=Qxj*LC)&B7AH-MM*)ERSectG8!CgL%#X^Yq?S><6QDv^TJasMDAsdM^@;Td2LR&{ z>${~8$}Pa~fD|jQqw@e(IHeE*61sL355-b7$XXLhh>(Ufbh;s(#0Sp(BO~wP*^(}=$ zv2A7i+%nb+0GvfF3&;9={f#Na^VvJtbE*K)rq7$k9Ds?EWx7V_N?q!!apw@=Qy0n@ k0Gxv#P;f2wh@k=a0d{^Nhuq$_a{vGU07*qoM6N<$f|3(ZTmS$7 literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/black_steel_layer_2.png b/libs/textures/models/armor/fantasy/black_steel_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..625fa3a513baf97c516f3d48c791e2497d3b482b GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOKFy`7V9F(E}6` zFL8}13C>R|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lNlHog*;sxLn`Jxonpv$$biRH*-gw$En=d? zjhDxGZ|v|^=R3eCv4f5Mp_}8%kSEK+JTguPPxkO%mAv{_S&nq}T209q2H%Ctp0~fB|CO;`tNehu{okg=Jq_Mz&~ zCHME~ax48UVOlJz@a<^vZASZ2hce}WKYSc#D}360I4?1-w3)Zw&vDM%`=^=OAKiXm zUwY$#d%Xq{an^LB{Ts5_?)82 literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/carmot_layer_1.png b/libs/textures/models/armor/fantasy/carmot_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8be3010a83076c1a4d2eef324616b150352080c GIT binary patch literal 780 zcmV+n1M~ceP)?qC-ZZ3{aBIqRO)>RatqasMx&N_<-Iym@0xHyO|A}*a= z1m`Dtkn%Onz4UxP?y7;b?{c|o^Cg$$p3Ab#6>JIXs>=TY05WuMdr@VYi)}zzo^l4=J@nnlS0@;K)Me2(qG z+9RNI+;%TdH~I7I+>-nHe9oUqMspKS7DAW=@$CPZBP;7HP*qXU3piH4(>u=%mP z%Ru;!f;av>6nhv?tjzDdHFjPKH()WBcd3Rtwi)5`k*N|yZMglS`a-nABHhGe9}iIvw{ zMEbZ-=(v!o@;{=E@J7fwmVT8vN(G?Gj9W(pGy(v51TQb4 zWBK-|D5*(ZOMjvwKr=36PLnkPfP9%DJuK(tSYChGdnm`U7NQ>ofRHi1KagHVgXA3U zQKVlt0C^ukx4gHH??Gt{8EjGYsb~Ei+%tm2^;FGzEHXV0000< KMNUMnLSTZi=un3M literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/carmot_layer_2.png b/libs/textures/models/armor/fantasy/carmot_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..65e60bb23504d759b6b8f8f75f127178993b537e GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOH?EWh0NjIRg|D zFL8}13C>R|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lNlHoH9cJ%Ln`Jxoo>r@$U(qOeB)=nrfYF0 zZe0rd!qlaZ`F8EmThSE^*4F)kGp8O%+2oQeB!82~X3|-nhqLG3UEzKC%2&x4hO^%r z_0A~`UWzRMJ6-RG>eXRcu^n;of_7|CswxOdw>v!C9K zuRhhp6thm;TDy)rMr{7w|JjGK_A7)4%q^Mbar4NOqveYj%DP{uI0*-+?t9C`Guy)B pZTO=Jd;a^L3iY}FU+Dg_y$tUPmmSquC-V~&yq>OpF6*2UngC0&v?~Ar literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/celenegil_layer_1.png b/libs/textures/models/armor/fantasy/celenegil_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d038a70c45a31332d0e2618f596af30b6b6a9902 GIT binary patch literal 765 zcmVJ4ysW5N#GuAm|xPG!XOxCPwN7G%^(j{{nTY5GG#0$VNHvr^ z9#!45ZqM|L1-1RFp6z;FznRc9O-S+M=S_3{ylt|q<@OJqCm}=cUw7g4=_B@6mv$oy z$(*c>o^lAuO&?yaMAnKhU z=FW0t4SYKO4?!?1Ac~5=tJ2CkS6hM3W5C+hVt9M_4hN^}u`eurnUntL3G+JNvYNZD zp`5np5-7v;v zN}Bq#e{ysd$I@b7(;%iqd>*rsHCK&1|5XdX48Sg;YiI$M3-I%CuC@gP?_liHxSsNR zE2yT%g8+bQeGY&e3sN%rEVLY)us=dl_sK?^y7Qh!vE@FUIK)VIkE%>{}d$U9i7K4=>>|H7REz$G!ZsF0Oa ztPJDT9jWgUsd483Xzou{d)B8;ub&Xuz&@})*TKtYrRO4;b00000NkvXXu0mjf`(#J3 literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/celenegil_layer_2.png b/libs/textures/models/armor/fantasy/celenegil_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..865f32612f640b5f524667cb4d517bc9100fff71 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOKFS1m*_KUIY{p zFL8}13C>R|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lNlHobv<1iLn`Jxoo35*$U(qO{3DClyo09> z9pb(bQOTlxUNIwEmFwHRBZvHsD8KMj+PuMFrp`r)$?lUH-8aottogio_6`-#nCS;u zFVx7txD}}r!@#T8z$Wg{%)J08_JAp)fYD?JgA}T8iky%5VHaoaHM8b*-*~s7@bp)e zXIb-)sy(QfUA@bIaqfMlnJwK;>H%W)Y(44CSLRLMD&SL7mHW4MTSWL*$qy&}%RlG~ zCs_a4VP|{rO-n@m;*h1=V_5xHW9o)AtaCTSMb}Tg z64bCMCT@9%V@mG)*G$ikw*TIxw&n|W66;0Jc9&0TYWn*GSvN$xs0+?+Q2H1uzTkg< s^OZW)bGLW@_c{^kbN|0k{L;OQLQX|ZOSgG90E3dj)78&qol`;+0C4oTa{vGU literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/deep_iron_layer_1.png b/libs/textures/models/armor/fantasy/deep_iron_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fe896c016f5170c8d5b95f5e554e7dccdf9a9870 GIT binary patch literal 700 zcmV;t0z>_YP)000+sMObuGZ)S9NVRB^vM@&RePDdbiWpW@hE;Mn4q~QPn00?w&PDe*f zL^A*Y002sWDIWj;00d`2O+f$vv5yPySsmCFRpId#o{}b1YE;B--!n?)BQG&DtGiS7bj|)BW9QlPg+m zJeuYXm{aI|={%rIbkrE6I*OpN9(o4NdQOR`jsPaZQi0wt&(3?GEdoMToB&J09$-#| zy|JF5BGif#!19$@6~}aT^@<>s1RR6Uc*Z1Gu>^S55YSKp5WJ@*uU-WK;yfAy4J`qT z7v6ig9s7$DAU`45%2w&EdF}H||0LF5oPdyVAS>-~Y7)0&iPGoC+tj((=yG{|+kJ~j z;aik|{ez=F|4Hg1;J?3CXQ@A-PRd{ zKfof%L+e=-V1c&)#Yn*XAap>hP5~Zx24s=IpWVHr3lpm`^(+K1_!uBd2}~HPs9FW6 z2zNd`E_n!4!ckJ-=MI!H2C^Bv8Z_mB6id3J zuOkD)#(wTUiL5|ATavfC3&Vd9T(EcfWCjLCJx>?Mkcv4^r`mEIau9G6-zfY==oV*I zda~}fGP7+}%>EB$_e|(r8gZkd=Y)=qk6O0Lu^%3v4k|~cPt30?dpt>{Fqh5T;qyt~W4vSk!7o9tkey2HSm*8mi5mR@j>_re1dVYSbPGmQLAwj5mba!1Ft+k2(^(l-Wt z7Ma~}HSKxkVU{ibI8uc4xaK-U{*k@#nm;H#?wZqtBVTSE%U&B1{#Evao?rO~b>Rf- zKRfQ*IF>o(?760O>!aH}My0!fFSotjF|GG{RPKJ}8pdVasalDV+*XNuw|&(5>CJem z$YNd)>%`KEwnML&p1mLBalEKr}&t;ucLK6U&F}i2~ literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/haderoth_layer_1.png b/libs/textures/models/armor/fantasy/haderoth_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6396fac3598199403d51b973a619212a6d8e42 GIT binary patch literal 756 zcmVJ4ysW5N#I0zy(nT%$7|A1I^6L1S9bPdjoIaRZKjE7GjXyHQ1?PsT{@RppFV zt7F?6OXUkXPv4{U(jE{PG=fn@pbXw3jTK2?B8n5Bpg7~>h2ywoQ59 z;++5i;TX@eP7p8iY}y`-0A76R*tBvAykOyNaWo#lfhh+_6D}ly+e{+)j`z)L8R_+Br z<^!gT0!EV^3{o)+ym}36;ttIy!m|z@-FYjTQ@0?~%*}Frbn3gafyGbDxA0ZOy_zOu zwcv-KgvuPQxd%dS$rjwotu}t2<6b_;|JJ_xtM1jIJDHFD`NDn9h)Hi|cI^+f7yD|X z#aw>9WJ%L@c+>rS8*|;OhBs~te#i>U`Z$9xQfLWtP^JB>ILA3}@1JIBf3*93ed&!S z@)@iXJh;x$6DBjs zphj{hA195Uo!GJKy3WPuWAWYHeJ#7=^NaP@x3O-`Z=DXDQRa&ucXo2P)9?HI*wl*& zz<)1$0BUcbcG&}v!>nC~lP{K=5SJ&eklVH0SYL7?4ASZS^Oo-q#R1qab2O4U7*j~S zIsl?oi%=L5D2LdBq+T5W5eP|yoy|XY%wLFk5u6;V4gd;ZX`h9+__d?Jpj8KeH}B7~ z_SKF+h&L6;CXN7WEOcgL7NGIQ=C|ZUoM;Y7vxt}lAg{I#_v3hV0Q?V|>U!X}Xj(?? zV?3d)qxH99{u=;d#1~oZ4VMPd427?+F1M(K^8WJVZXX_ttaW5Dl=`ER#V2BJUf;?r zHnz#Nb_9xVD73MZa5;xJl?DfZLtFF`C=iY@zZOey0L8qi?NI@U1yZ~@4G0X7{`%+| z-2yle3O$(xpisEXZv`I1c{%OD0l*wWsz8`K;G?6}Cu0FIAwmLiVukB{_h$l7;-=NI zK_P+AVyxF=iUx}S;5CDr$!+%~pLh`?rHyNMPX`K# zm$*ih1m~xflqVLYGPwJ=0F6;7OD$3`)-x$=UGfm9grlUu&mAaZ3}iESHE7BMDVB6c zUq=Rpjs4tz5?O(Kwj^(N7l!{JxM1({$qWpPI-V|$Ar*6;PPOGaE3{o9tkey2HSm*T81(02DsRd*K0F2CDGnpNR%D)ue7E-2D>cGX3$rwcB<_tf=ks zJ@D(>hmu4lt9lkAPVrX11v>xuUi2SZX{?{E=#f;F`?xo3&FWu#KSY*WN1SB2!Kd$^ z?muC!fOP(ruChH-%Nsn(Lw4m_uS*50yZ)XbzTx4s30@J`n*1Wx=kD?Q7u2vR=Kc8) z#}wIl3peaKQ2G1t@BM0PzQ`Zp5}I_`T{S=H(>L=)4Bt9lsFW1F?+dy2Zx{E4^^cUc o#&;gAdA48ZlgP{O@!zhm6hCCVM3aNPq6ieip00i_>zopr0Lmq|MgRZ+ literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/orichalcum_layer_1.png b/libs/textures/models/armor/fantasy/orichalcum_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f51a6354b7378160dc4b5a3378495dd718b140 GIT binary patch literal 844 zcmV-S1GD^zP)v6BVw!A_$LGf+xrKCg`HNGHdYq? zhSL{($Gb7v4{vv~J201IlI&*QOlBuJHy8|D7T-Q!4R+5rf{ebr`EBP3mqY!2-+jD& z`FgL{^9+IveVwN~gkb6Qokh>IytY$Yuyzjs9i1Ke^6~D?v&ypbNl}HJ z>vU~pDvkQq@rq|FSB~Wi+%kL*>&XGo#oIj&E3O6fkQ2WWgy zmyX2|`+SwP0)WuMbQ@S8SXax3K#VD_?N$I_bNvtitlPGZ)pLRcEX1t<06!sDwaSM) zKqG(1{rQsEmPoDq5P&SUfh_fcs|Im0FH`(;;JK_RB`rZW4`-Df#&QAJ++QC1B~_DN z(u_?_yIkA0K;;XHEi5ZPC>k{X!?gpzB*>RP=K_{iA??#Su`h_t8%E9_CEB$EfKMee zM<~aX8862UbH6Dy&k`J?*=8u;=!^%bGB#}v)rUa*&e0Pn?;4n2sE6pY%d{Jb0s6us z3Nh;R87IF2~Crcp<6x$ZCqCu<@0C>rv3o6rAcjn?l z3aN~97!%YhIH!p_$4bAs*5zYCF^lazVpYGR$Gs^dPis#V&BMkd6s=<6Nj(h z{{m(H^juh-b#u$p?)~L+M8=YG%0Q4|j>;&vvf61}cefdx^&Yiu=vq8>&%k!w9`Fsk Wf>_UPnT&z}0000zNd`E_n!4!ckJ-=MI!H2C^Bv8Z_mB6id3J zuOkD)#(wTUiL5|ATavfC3&Vd9T(EcfWCjLCT~8Oskcv4^r&)6yau8?}-?&ZK+i}Cj z&6mz;N8G3s{K!xi=d|I2MA^Ip+!57nQzJQi)VxieeVmx`K>6kwfq#{6)Xr7E|HY%% z@a((8^|MJ2nKB9(O?EIy#W3*dHL!_0G;=RF$a>)cim=+}1RL2(Ufm6OYQgvUne7*JS z^^%E9Q=WdZSjwf8{X0h7Lf>v@e%2wc{R&|Mb4w<9+&l8*==MbnW!*1Sl7s_P_Pt}` tS#9C*HvCatZQJ^mn4@3*+J7v)#qN7miCN0c;UXxAJzf1=);T3K0RV!gx7Yvx literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/oureclase_layer_1.png b/libs/textures/models/armor/fantasy/oureclase_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..34594b85e2fa3af025edd6c190c417bd86be71ad GIT binary patch literal 740 zcmVJxT^K5Dg-N2!h}NY{k|_1uG9Ah=&mDwD1yIc>^z?y{%eXh?QVxVPz!l0OLq+erN5}ya#MKl5J0&+S#R|}Nfdy)r!V*Z@!htM z&!1ZrkukAVFI{#4rM|SepPRyihk$r|XJf(bZ!b<5AZ-~_HdHN|&{);Wm;{vpm;^a7 zTB@wUnnK&T8Q^pQmSWMvHe5*P9b7;$5ZM7xud*ToEDxg%^Fv?F4uFsP>@goZxE%`x z451=J;Ph~Ls_2n1wPD+LUnmqfoQeQ|8K4Vc&suH0N1w6S6zUfNfO-}^j2`mU0cZ=o zhsV*L9ROa0MNJ*Dd&w|$|Pt>dx<=x7X>Wt(9y<27W%cOWoW6I2lbykEz10RI+eV0pV78h{`D WTgMSI$kt~70000Sp&)P;Pkj_P7{uNxpgdiZAAE2*$;YtJ5Vdj`5H+HVghWkCK?4m{#aE&wt<-@d}#&3)^*h}_HCR*Y1A?@f1`gX8`7dU|=% zUPV~v^@*B$NDF{CX9+r~AgJ>UjwR}3O5ZyGvCSQwAO1M1#<98B#@^#ewE(Dd>M&;j z0+7mr!2_^N4;VB6lD=H0GM9CXJf}WpLh2nVs7GDj08HdtE`&zD>nbwu@{LcuL*IjX zB~VrH2&`kSdyIIh8FD|c`iJ)$y_LW+MwrTdZ#XxPa1CmUT5$j{`eO$C#|-ESPzMrw*1Hjao*`hjw>qwpP;DzFyBXSX~ECA?cEf6f{**RsEYG<*}Ri#J?phI|w zVjwi~7R|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lYt_SJY5_^D(1YM8pze;AmGscg6G@a@RAON z7ksr}u7+Bz__F+ps+*fchoP@<)lRDq1+lUf*4FD5tujh4V3dk!U=v?(kTnB8Gt+0z zI`_NsWmP-pW@j9nFMdF5uSkL$YlLUV@xPMGFY*0;R=Yh{=6u76*VbiA%L{Z~E9oEY zNSwRjW?HW$cm4m^druavWv-Fgm>#w>#A-p@2>~0!d;U|e@%@-GqlEp7uiql(48~ap z(+_OF`)R$$_5Jr=&RQ;Ru!~^}1FxP#Gxvp%wH>S?QITJ5B^K42=*Mphc8)NHm;*k^%u2;0kmIAwIlF`$X z6VL2qCYg=o-F$cB=V!-B=(;ZCc3^NDbpTi?-mFsHvb>I=QVf(Q)d8?5Yq>#=0Xh1! zD{yLE9RQ~4SO!=wkcuHqxIiknVe-Q)u*SIV1>(5aS51zlH3;J|3?Q zfPCblb{__$=&yg0a*5i?{{xT{4rH}ATpC0-71kS|N()6&a7oEalud6!sXr=N@R4S8 znVWL0xj^v^r8bt!5BdhpRb+Ai@I=s~jgL6&!<(g*P;mlg9m7M~lLNq4Wd?(l<~i7J zUAq^@08b%{0l60^3(z6$Sz>^-ft*4Jf>M=VopG#b2C#p73UQoZzvZlQ?EYK;N<~}U zyr&S(Q^1f7eE*mQ0JO|1ZH(rgLVUeu;25aIFo3O|QYaVMtzNd`E_n!4!ckJ-=MI!H2C^Bv8Z_mB6id3J zuOkD)#(wTUiL5|ATavfC3&Vd9T(EcfWCjLCT~8Oskcv4^r`d8Hau9G6|H!m0&T+#> zo@sH1v~P5FL{#u_b88>Hq#V(Ge8UHhiIEXAe5PgeoK!w}K>6kwfqg%3`o>IBS$FyY zQ^r32lD9fydJSyi4$a&P4zgYViWM-L>|l_JVc0hI9FiK8IWv3Tt%RGqX)D%sPKMibKtA@3wz#(Q8)!;`#Apx%H3f zoEv2K&GDa?Q0BB||HZH^kJs8TAIUlX)+J+dX2#iir|ah#;u|ieP4tSm*5ntle(ip* zEKP^Vck9zvDQwzyzO?c4qrOV literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/tartarite_layer_1.png b/libs/textures/models/armor/fantasy/tartarite_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3158c00341aabc1e791fed51bf5fb1cc94ab22 GIT binary patch literal 734 zcmV<40wMj0P)BBF3X7%jyYGYzaJ$W}YR`LuU7V zc;LMEE-R;__wRdK!n@M=&ZVq$2Kx2legTh!#J&zdY(hW;tnCg!Tq94e;(GfyUhc1- z-xuM&yT3{d?Vp{8!1CPJ+Jftcz&Yjt9ytIcJVX+Fcn<(@2F-n~0bEZ2t?LtTV_#_R zcDqC@9ki`_A%@JTAM1^&Nth7Pnt)i`P{qgK zVf_Fe)&~iymlR92(wqRpWy9(iBmiUZ>;bqZ;7cMz_ZI>N0W}`LrLh$P`u(0(5ob*d z;L!&H-~nv?7|V3m@8#NE5TLbwB!Cj4hJYqMjK{Y$KUmTQ0pUko6$I$=h7i!Dk3GP0 z@7a)O3_cQ&6-{J~C(QZi79H#I4 z)d@)cj5az7DE5u3iGt8NVQw#>9$@V?SZ8$tc%x+P68TxHN*%-1By_v?08G9X5L-{n zYTjz&9hcg3B=GyCN%AH+028PIgtnI1T4}1ATUHJ_+CK@8EeK$X*8-XwGa>5Q5G@gq z%eYGfhovPzI9#nIY!d?br1wwlOp;STnj}jhb2lCUsYz-Y%ekbvjR#1UwJe-#^Y*r8 zS!4aVgOqs4(u9BoZ3R#QH1`dQn3^o!JOq+sZ#gG00m-qrddcLNZDj&}0D2*q^_bsp Qod5s;07*qoM6N<$f{{Zro&W#< literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/fantasy/tartarite_layer_2.png b/libs/textures/models/armor/fantasy/tartarite_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f03ed96aa07b27ee2a774bcadaa19c4c59daba3b GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOKG8)%0Q~cmjpQ zOI#yLg7ec#$`gxH8QgtbfW|14r4}g|>zNd`E_n!4!ckJ-=MI!H2C^Bv8Z_mB6id3J zuOkD)#(wTUiL5|ATavfC3&Vd9T(EcfWCjLCQBN1gkcv4^r#bQ+QV?*pY)&scxG4OA zRbDku{=-YJdzW%r^>yU3%-8Ln9*}nF&wt5TR)U4L&D;wj@4fgYDW=!JChh>_9b~=m zfGMMZ(PRgMR15-ZYHoOW^WEzP@4w%_ z_WyI)U+1VNkZUEW>FcwyUYPNQ_9EXD^#s@dYD_0;h1VojKl1(^&0fG9eyhTA8W+C` PC@4K${an^LB{Ts5iovCY literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/amordrine_layer_1.png b/libs/textures/models/armor/nether/amordrine_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..304583a12da12ef7d738c9ecf9ab61e10bf51cb7 GIT binary patch literal 762 zcmV_%>*ds!zGpE+Y31BNK zFm`Jl=Qgh8ace6e(N$~#wirftj`$2%=VUFO77R4huYv%v94aobtmU&HzXv_W(kcjG zK>Sf`Y2R4rJ-#hb8vKHQka8d^{lTe8jHbep_M+AxQiN%dHdNMQ3sU`2N}11o-1Kvr z=4H8EuC^_Z?ZdhRNZ;Banw0>~AaRZ}#y(&%1MS;iIRQg0Bp<3tlsvILq%P^|0nt;S zi|EyuMrXY!kteog4%e#8zCYSId16~d`f?ewY(FTeJOJ+k(B-kM^Oz-asg0#F*9}$1 zfY`o8KtAO<0>@ItC@%piBCT4V3nvSZ5~B40Ua<1|9GT}LdZSzR?K2rZK(TUp85gd? z0~mN0cgL-Q7cY3xlFb7+FtLTLz-5)Y=;9V2yiKya0gu6~9uNZ<>gztXtZM25}cn_Ql40p%HZzf0yIXUEVW3%SkI)eb;(1Z5{{ArKX;&vF_6vR)u1U4q*&4& zeH|GXHuiJ>Nn{1`*^<27T^Rm@;DWu&Co?cGYJ0jkhE&XXI@Olzkb{7m_(ztqD(PzJ zts6h{lx1bVb<7btsN4~8yJF4>9UULFY!kJQ6Q4A@Z#t)R|IeFas-BN_@#Hl;``x>4 z?$JZM7ap)>6fm3YV3fMUz?;{=X711|z2G2qZKnVGMY;-7YpW=XPeJGleF-g zrWs@V-V{iZMe?{y-0$^H79@yp|0nQW5&d)cNO6u_RYelF{r5}E)(KEB)l literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/ceruclase_layer_1.png b/libs/textures/models/armor/nether/ceruclase_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6465b5c55000c8b5c8503014964bb19ccbdebe03 GIT binary patch literal 741 zcmVJ4ysW5N*V37z&yg8kx!-K=1+zi;-Tzz(5eZfHx2iAZWa)7zri@;t9-0s-fiZ ztp1EM)7`TLwbQ@p?f1H-x~g5*buOki&oABK?Y*hemwLZ--Eawce0_JHt0!Mx>}`7$ zkv8d@y`&hDo!&iOdexoBdhH#Y+yX>SmS_I?_HgGF+vYA=1c-cpeYl;YQ?F898%ddn znEKYi!aF>9Vp;lXoA6Lg4nV-_1F)?&fFcAaXjE;h4PY<0w1&`FD_+oX zI9Cg&h-1*WSb6SWT>Sy8W%dt91X~OHkX9_nDQJxNLV$DnalRa_PJm^yZ1y3*+!qR& z@l)W?x;g=Ds%WkZ8bMfOSkBU#AKRKBfEQ+wU^zVtyyaA5^(F}5SUvf2wCo5W-?q!}P)g0GRZ7e|9W>6L&>n;Iz8t)cL zq|2juTnj|(Hi-Rz`UWl+AwU*{i|JcuU@<_PN2qh;vO3e*SOAg{0u;(Lksxj>LI8VF zYlmZXOs7+TFlA=HfrM#a6$1Ly*`woUz<@Yd37rPT2^ebfp<7|=@`RltTM`mh!Uy~S X|3`M$JKtQ}00000NkvXXu0mjf)9pBc literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/ceruclase_layer_2.png b/libs/textures/models/armor/nether/ceruclase_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7eee067007a40498178629ba60869bcc12487489 GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOMbjbZlR3*$osD zFL8}13C>R|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lNlHo^*mi1Ln`JxopzSi zpN6*|Ue|qP*({v&w|Cnj+5D%H3Tf7P>Q1wLoU{K4@2X?_!Q>M@JLJ$Nv64eoxqm~0 zyctgw?XV4Eow&7j9rqk@`FF2pZMdZ0A?l(oD|B-9j6FZxL=NN$&UMLQ>N*l0+wjkx qFX;Ewia5W2+KSz1*}I4UC)6vm#eelF{r5}E+Wkg?YQ literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/ignatius_layer_1.png b/libs/textures/models/armor/nether/ignatius_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..35967b9cdaac7f3ae80a67de92f6d26cbe41ba96 GIT binary patch literal 699 zcmV;s0!00ZP)ZQTi2kgTT=%T3&r8Of1ty$LY=S4vb!HIIwe{6I?FiX+zis%-=UaA8UX!Ct89 z1H#Ptoca(1WZwoC;69H4?!!RICg-qh2m++EEopjE^~ROv@cO$GP&5o=ofo_{iOv6T z3j(&xBMzwmjy3;Q0Zm=to<$|Ydj~HFt_hm=STh1tMi?{+oHN{fNL7NhzCCK|O%=fR zhc1x$Lkbm;{aGYPGLINq0T%cYAS6L0Q-KtLavn8qMZF0D61>`B0F;j|R01dm`-fKm z%Dx7WNtor!8@OnZfGt?IG2m*z~ zOI#yLg7ec#$`gxH8QgtbfW|14r4}g|>zNd`E_n!4!ckJ-=MI!H2C^Bv8Z_mB6id3J zuOkD)#(wTUiL5|ATavfC3&Vd9T(EcfWT41LPZ!6KiaAfG9ppW%z~j0%S^ut*aB0Im zD^K$iI(oJ&mU>DH9Og5%tFvxc^xwYCB_uSBP23?kP9wRkm3zTK)(a1qG71|*#QGvS0g7&(9@P-Vxt&{q!Lz{9#;RLfS*`)!2c(U$$qVwi1?=wj^+~hq);Q1c zy@zWDt|{a`w*@#+L_-wQes9GCCdvYnpoz#%fGA=?E5KkY2)!eQ+yu;!&KQ#GfwP;d z##Oi<5WyVo*Y9J9Sbf<)Wd&X5$e;M0&#inzKnOag=U#AX5~G#i$Nlp! zlpx4Faw6?33$Y2Q{wSp&eI`4Kk8N_Lxj^y-`4$$c584LJ|6p(etnyjsc9=cpR03E@O@LM=L_&y|Vl9A6VV^=$Ggu^G45hWU6d_GlrES}T6Cm{gFTke|7f?b1 zo2#C$&kaRdK*)D}J8A)>$b2TV@A{$yq=>Y#qr782h1g=)5-cLes63khrA@d?+h+l7 z`h^s2F=L$;ljU65&6q;kuS0%5ngv)vtV`78<8A2sAb&uyzBO3K?JNXzY4grw@p{); uA&gn6Ejs~yU?~|QK&Lq?K(b{GO~4NV?X;)1cq#Az0000;uQ zOI#yLg7ec#$`gxH8QgtbfW|14r4}g|>zNd`E_n!4!ckJ-=MI!H2C^Bv8Z_mB6id3J zuOkD)#(wTUiL5|ATavfC3&Vd9T(EcfWCjLCBTpB{kcv4^r|#uFWFX+C>vEQ*gQ>HR z^@YZZl`A5cFJ8QGaWfOI_5l_jhodZS1WKmq#OkRDO!_e8$>e!L#bUqS9q;p=bfi@B z4#U~+(y`XvtRi0Q_IlZKrCV~} z^7h0Xae5n^!}RR=+~wTD7k(;F@Z6zM!j$^4{6K<{&)mvLZbzZZ+0yx2l47rxA6Ra2 z_n?>BfwCW!yQ`btwA`pz9J=N4+C9uJyB1%{yD%?#hB{I4m4Cf#{KEfFov_?v|Nl+<{q{15i{<7o`*AED6waQmelF{r5}E)lhP>4P literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/kalendrite_layer_1.png b/libs/textures/models/armor/nether/kalendrite_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0202f9d1e6eb5ee0e5b09cab64f509271296c529 GIT binary patch literal 716 zcmV;-0yF)IP)gd)40O!i{?C>(0FZ6nfY@$31`@VGwFc{vqEaiJRMS^7+R@hU30U0aJ z0bu&8BFq2;!EzM_%yR{N*Bk(*tN1ay0mcA+hl=Ccm@BZmbO8XfKont%#$p5pKM%qNuF0!Fz{{i2)WHZw`Pb9LQR4xHO1asW3_p zO$)RVZ9g@k)E|{>-(NrBZT(v2W3?&Qn+p`#kmdxbP2n6~lM^(zk=X$dMXa2`Ql4`M z1cCDe&N-~qJf~lU0labV*kt82HMVLE>uBwc0jQi<6w_t~2FI<6(yKK%MbGV5V*qc! zs~)X-!vY{xW_QB?3~YRPf(qey%yrmRrtU8ZK#54JH$k};Rf^&|OKN1E8y`kmj_r@J zs3pn@ERyuyA{c-y@FF+I0tE)EO1^uj0su!*ws0!ya{237)SB?#x{0F!#Vjzr$ea=g;#X#XKrf_e0Sz_6vw0)akncLi@sj9kNMuwmwf+Hm~z_n z`!}nf@ayO`k4m+^cgosfiM7_y1YUEK+&d?syf+@>T9l>#i`e8I)vu^ zc3-EkiSK+sMC^kr|33U%&$;>!`^Ki0Ctm_ReSNa(mAMl7JN%r~zrXTW`t5pb!#{n! qpx;w1?(zTAR`j1(_dl(EZWYs=Q$3v=zdmb&g4om5&t;ucLK6T0Zn--E literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/midasium_layer_1.png b/libs/textures/models/armor/nether/midasium_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0deb9ef8c4333c48888bebe754ebccb9c99473d5 GIT binary patch literal 738 zcmV<80v-K{P)M+ zCTqVZ$x@mSLKBs@`|xtpgxiZv2v280`qGv$X(ykrTuz!)`F!4QZY3oRz%MWV0F>T9 z>5>Fs+kWgdx0*8L7BH{h-2!$i{E1tjE3fYxx4rtZW3>}uRmJZ4j&-Y@G1Ul*6-as- z)BTTWRACKh@X&fd-7p>uH_c-R7|!)TfjI=CH~_|~G75~@hP%aMefANvq&NVM$}+QK zO!6AoWn;0I9#)pTnUFOD%If6Cm?&O@Y=_0RV4|L0})@+P~Vg<5Xk)DgclJ zm<_{5=V$-|r-JYCqzVA!XP~MuHpK_TyQbZq z=6Tr~HJ}$=9@_+Jv)kPJS!`pm`B=mmiz}u`YTsEth-@!U!qs`$wWWTz4!bd&moZ$U z^ID5dOIt+k8|TFCwao2DOAh8aa^xUK?Uo})yk7a5O+}TtG~i$WFc09c*K1=RGe}Fn zA=*SRynt&;|L6eVA7ZlOF^cInN1V2XlCkPFU~IDI6MT^-$~waNXd!wP*lJj8Rv6BDcUY8o*xE zVK~-D=2DFEI6K2Z_E`jg8GZg3l4KNWbatLkSqy-KoS*Z>ca%}*%dq!JeMuki4Vo3k UssGxHxc~qF07*qoM6N<$f}B)6{{R30 literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/midasium_layer_2.png b/libs/textures/models/armor/nether/midasium_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..033d14e857ec31c1b94e789c8bce3d628b134364 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOMcectfzNd`E_n!4!ckJ-=MI!H2C^Bv8Z_mB6id3J zuOkD)#(wTUiL5|ATavfC3&Vd9T(EcfWCjLCDNh&2kcv4^r=8_JWWeLboFuxVIF(_V zV+oT)lixvEvj->G415%(MpP~U^KbQ96IahA=V2I zm@`Y~l{h+zSq(2>ZT1TDbj!P*g(Bv{T7XpDsC-^!B#b`5M^;>t}b# zSSkD#%uu}}Zq>Lkr2IhL>a{b?_boKrtX^AQf9;uVXd(NbTg&|mCJ7pxyu-K3^TL|g zcrllEmpOgH8rG@LyCrL|f_aj3i9xffT`)YoHq%aID}ptMy4vh%LzjnYqMz#=E+w+%OC- zE2q=YJ7-E5TV3C{tWKDL8gd-Zb-X-m9`+9qY#OPP&Pr_pRP{CH2NhRU zMjPtSxk2Y_GqBb-X#$=|z^MnI;TbO-o@XaWA=10F889*2*8~Bo1*z=ss`_O2niX1m zS-`p71OZ+|qktEGzVyd zCqRL5azq4}_XnJ8ak%6}jB5$4EpBNSAppQ~_XIk|;Wbrm2RViYPLwM#Z zpNpiT1caAl8@i_*-4BlatAM6rO6v@Ec$Ob&UIX-=Fa=2O5-lPk-%x@8^`d&>IWNmq z;Vpo8uI2%p{LH?k1_Aem84FwrP-HUG+B5A7pMmJnya`|%A zm$*ih1m~xflqVLYGPwJ=0F6;7OD$3`)-x$=UGfm9grlUu&mAaZ3}iESHE7BMDVB6c zUq=Rpjs4tz5?O(Kwj^(N7l!{JxM1({$qWpPE}kxqAr*6;PP@n7*W^`s@|C>n z?HvC}SUCh9D0%U-U4eCtcF**N8GI+dNyWVXv`zcm_a$vPr+2mePS1@Dj(r#eHi-`NH4-?HDhadfn%k`+8HQ_@?`7(gTe~DWM4fW(LGp literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/shadow_iron_layer_1.png b/libs/textures/models/armor/nether/shadow_iron_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7c33804031c5bcb2d9b5d0d933a54e8c6cc9294a GIT binary patch literal 725 zcmV;`0xJE9P)!SPq#O!(pc>I+BIsxKsBYY(g3m$U}E3R(FndDktZSFM0dJKD4#+g-~DVHNaVWJOR7E9&Z4}I*x_j zgX8=>zP~yG@C)IDr3Yw$Vo8%$FHV5w`t07)#jQRJ2`dz2I20#9CO0y+yLx~mE|fUQ z#HtDcEDz8KiP>3+Q*DWqE5(uc9%(cDI3 z^XYUN>?#zSSItq&%Kg|!HYjwb(3~7^*ioJO_`ZR{5TEPYHYMfPryPOycRnQHIQ7vO z<`JpC_BI}n6ufnRh*=<#AT!HQ<|)r7UEA3R=mSWzWqbA>>zV32K%Vq0K$>02`+{GI zK?{(k+QkW%SqR|83n$d4E$;^`K-ygb#;vwc4#oqtg-Zg8{m>#8$SefNRaE=JR$Cr_ zEkK&RMoQK-V3%!%O6k@XAS^@o3D{SC2w2zX8X$R%UYdY!8Gr525O!^}00000NkvXX Hu0mjf4Cy#0 literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/shadow_iron_layer_2.png b/libs/textures/models/armor/nether/shadow_iron_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..eb134956630752b26096b6c5ca05231c3100a1df GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOMcyRAQn&ECdRP zm$*ih1m~xflqVLYGPwJ=0F6;7OD$3`)-x$=UGfm9grlUu&mAaZ3}iESHE7BMDVB6c zUq=Rpjs4tz5?O(Kwj^(N7l!{JxM1({$qWpPnw~C>Ar*6;PP64YdzRN<4h5x&RboVnM`ZtT91xWD-HQJrV6<{edg zu;VVvF9XKC_nCIKoOV(Vm|DQrGf8Fh^Hkj>YIb|K{R@j;v-%g$k0;Bme@y4xAX{e> z-+1LsOGN$ZwK>PFE7>}3_TBEhpmzDf%>OO><})s2c>U94@`g36b2r3A*UvQxYFHI> zZn=+RO78sEOyWnEfA{r`cq)E`YtdvsVa-`H7X1hlIglqf*CmJP)RF744G-=4f__ik naqrzjZN+fI+W+1)bHB0q8EZ^kX1{SeD0n?x{an^LB{Ts5qP?-R literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/shadow_steel_layer_1.png b/libs/textures/models/armor/nether/shadow_steel_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff14d9c5d3c2628c33f116e9a035d4f05b25cf9a GIT binary patch literal 709 zcmV;$0y_PPP)V6Y_Kt~G9WGh907?V01Ib9f(aJH^v}S=z(LA4$ko%siQC^a zNhKorH?iIP_{C1_hOX;EidHX=-Tn2YNh0&!Z=GBPHB^DnzK&}f@DIR5+6qp4dRuKI zTS{{QkoNxiJczf*=Elfc<>+AlhcpCq{QG)+H=Z>F)`o_?-JL&t;fZYV%|qzo?4-N7 zI`4N~Nq8cwy@OLJ#O`->c{P?p0D1EC@&(kvesuuwT2sQE_B;T2vAOu{Kp>g}0Cz|M zKqF8`Wo+mesty3VD;mabj>NhMR4NoWRH_5OhOt2$|L6fK<9A|&AS*QiK+FTsAY3^1 zQyvgA9LG%nAd5$`JOU3nOO~34`6#arfc&tls*rhBKc=7Jx8nXi04d^wtoDL)gE*)f zL~5Zu+}(!Ls2{wQaYO7!FNE6-%5U9Pndm~DY$`9luPO{fR}R)%QlSV@px zuM7ZQw_Hn%8P5&?{~<1f0kWz>1V(ZL?OW-0lOA9tO{pE_8v%O=e_OEX4lJ^!uFnM^N1R!QkhPR|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lNlHowLM)NLn`Jxoo3B-$U&e@{G)_eSyJ}$ zxvgtk%`a$Iuy6gS(=>PL()10RJ}78!7MS5PE#u5%<&y{8H_cT1^ZADFobUI(O2#mp zec!ll_R&ME7alNW6fm0XV33Mo;MHqj6L)ClUT_da*!S7NB(twlQ3-c>Vvd|U-W;v} z+%WvRjv3?fzj_ziIbZx0JE0OIV%4~*#W=x8Zt1r@Yg&&SS$_T6{jBcN(D{t_|CF$6 z&t$m$@cC<5k28K9U$@`tD%&$TytCuPh_jI1@&Ua;eBX-gAh}r^=n!BtL tVTBWJtv~YhA4fdr&aRig>mR+|!mocj>4n)X)@7go_H^}gS?83{1OOfWzL)?2 literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/vulcanite_layer_1.png b/libs/textures/models/armor/nether/vulcanite_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..57b140a036e13ac01aa41adec7dd09b9cf446b55 GIT binary patch literal 716 zcmV;-0yF)IP)d!aDz&=0fRS|d485ZAwOq!J)_y! zQM{4#^diexYfVw!57xdu=;H3xp6^`hN@A!c?p_B*TpVz5z`_oAyE7+|+>hoR7_o{2 zT*QOn{`xE&AV!Pf=!nx=2S!YhE7LG;ul>dM#~{Ds>89n$9SrUJ{&_z{_xNa{oOg34 z$N@5!=d$%erz9FdJc2fooqySg{E!piUT!bV_#RToXpv#E6LAqn1ZdRhW0-0Qd4J z7#%j49U?lVeRw_EXKM$b0U9iGEYA^iBezdBB{nubIG`v@WE;Qm+)iBm59e^eoOQ%5 z5fG8?IU-=y6lmJS{E;dCCXrL_jUmnd$m$N@Ph>C}>j-vC;WL}9G#lrOJ0S8lG)fW& zD2){+w4`bz-98Z@Mw9Ve2x(5h!#e(jju z1p*kxcwFX^7@H>=yjj1+fT=PY<3`0v;rNW#p@WpsU!(2_5#(d=s5y`!B7j?HQ9I41 zpF7sy4FWJ7n9#JfD1C^)P=7rHFpF}8E3C^=tZ_h2w%`E0E$&<2Ekj!7&o75$?dv!Q yuA#21)$|t~li}}SD%aJBVv$5h(i$mCBj5)BFheLi=*dX{0000R|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lNlHoRXklBLn`JxopGA?kb!_pxQGMul>@z8 z7EjrPcmsIUXDwjmS|}xDurXnA@5Z$*oHj?dnRv;pzi{S_y5OTZlV>#wFEF$TIAy}E z?!Zh0di?reuKKwqwGN2~@4}z!`5tB4@@Tc$f>mN1to^LI30h(Q)~|aT^`s`pW%~W! zrMLF1|K~IR<<7hMRj!+Vz5IXNZsOObG#B$PYa;e;4;NiiZM&HDOj?7eM3~d7JsQk8 ztPu}4a%rq%4Vqamr!|vtqa44n+_{b`4RfSDSbNlN)>(azT5-3&HYnP;_+!=o zFdI7WGH=P88gul?Bk@Fstd4JS(`QaQbyWXQ!wnw})^FVdQ&MBb@0I_GI+5i9m literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/vyroxeres_layer_1.png b/libs/textures/models/armor/nether/vyroxeres_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e6d42d7131e124043319b9652fc1682390573a GIT binary patch literal 739 zcmV<90v!E`P)Z44rTXS_6i8H|;RZ-RMa3C7LTXA5zyYWb1EQWEfqJ!#QvyG(LobN0Cpx5-Lz{^ai$T3tnwrnW_MT(91K{je>7a^qOR zw@^aK$_xjFU?q5NhYuO&zFwwtS{(pQe_rP;pSC%8T`FEFu&+7*ny!*nD@X~#14o|C zm4YsrCIHYZkjadLvL-)nW80c6z56Brz{|6025_c5zc-HM=l1FV;KwQh@q5dm-V9mv zmp}1JqIU2<0OV9pWVK&-Xb{7l;OgwR zL_S|wTkCx?U=RRu2PD07@n>0MHqZGOF3YC(n{&b~6m%K%$IVfpOq6 zjxeR~`-K1ufwCN)H2tlNa$i1lNt>qfC;-UkEY4KPeMv^W{&Hn|G7R9ljxrj7r9m47 z06mN93`euB4m6iht3N-dnNkISl6zgpQAWKnJVrHN0zC8UK&*`N2bYLR@?Bz|`VB|P VLze9SxwilS002ovPDHLkV1my0J5c}t literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/nether/vyroxeres_layer_2.png b/libs/textures/models/armor/nether/vyroxeres_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9e14e229ec6616bd67424161d272abbf57896ba0 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnOMaYbe~0>Rs;%( zm$*ih1m~xflqVLYGPwJ=0F6;7OD$3`)-x$=UGfm9grlUu&mAaZ3}iESHE7BMDVB6c zUq=Rpjs4tz5?O(Kwj^(N7l!{JxM1({$qWpPYMw5RAr*6;PQA@}$U(q0d?Ty$23C8P z{aZK=a;-Ti^eIB^wj{+~EkCf`;_g8|wF6~8Dz!N_ z2`4@FT%CE`y^_77#C_@QZI7dX%9ho!KViKQbBgnH)CJDhTYJBsRA9~U{&s6Rm(uGG zJgrw**WH%C*FI~*wR!<<4-Y^2sk=H?-k$Hm_(t%e=ZhzHvMYD}trbtWc+@p(ztH#M kk5eZs_t^h`^M3!mjF%T!-4^6zO9X|jr>mdKI;Vst0OXppIsgCw literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/precious/brass_layer_1.png b/libs/textures/models/armor/precious/brass_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b31c2b9f700d8029e6019b8cddb4372c5288f12a GIT binary patch literal 734 zcmV<40wMj0P)U&| zs)nGB&LyuIru(^1@6+@)dAZr0*}a{2GkbHVJkL`$^xm(%*V>8}q;t*BJDdh^R0q;! z?La|5K|n!3K|n!343w0kt?pc?&QsmT{z26T`lOrqW_r4W?X|MkJYMiY^2Yt5SL>dQ zjN8_5A?pb63HWSoYC+Bc6z-6}9!~%1O!MKSO`kOZrCz&XjgZUAoDayi^@=ak6|yn9 z25Z~acilUUW;_E<8l9nBUH(4X? zb|8U3j>CEAY-<1}UDgDYT5o;TYIjF57^k+rG;53==xl3X9jU{-tebxZV51x_AN?7^ z`Q5j1GU;HaTZ5WOhkK;srlq+;gokk+LU!DBgwsGCep5$45dqU40bvO;5oNN|&5`wm zEUClv6DL5{4X72QLo|khiq{2HOUR-M_N0qiUPx# literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/precious/brass_layer_2.png b/libs/textures/models/armor/precious/brass_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..14057ca998c2751bf268039ec9cb41f08853be3c GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnb;V`*iJsXYylJ! zFL8}13C>R|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lNlHoWjtLRLn`JxouYhx2yx&b#~l z?u<)O+Vc;xW)v_=#Wb*qFTl@KD@-)Zc#*eyk^bs!^X{w768mGW`c&n`mBk<5?I>N| zEne=rFE@>e<24df$()<8 z-u3&Q{+;KR^KD2LpE-G|wio*h@tx(;c`EP|f3r_kWIBCjq>8tncH%Za}l5LNzzvrs1>nbE)A20RmQ z63{mR41P(#0ur!NMcU>4TkG7((OztO`E3>p;5fkAxBk!??A-#aJwKdRSJzKX|MXzT zjV(k|pWYg+yYqc}bIr;0_Ru|T4r7?d9L9Vx0{MbZN{Atq0rm+#8~{OrjsZy9d-z=n z-sT1;z^57eFxEOi*Q44Ak6{fgr>hK3fSNymfCL6PsU}X;C3p`s9&&|}j?rH(V1CST z!1`@2fH{E2-jFM(yA(lyS^_2|UM@v*DIxrJt$v-W!@ zfKz6x4r740g4CLWGfl2BinahGItENjXCEM})0EpM&>}8hSi`gSvs!>=hCV>tZ{o#I zg~`<>o^xRVoF>Nr>3smIOszKYOcA4k1f+R|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lNlHo%{*NkLn`Jxo#x1O$Uwlgxk4aZZmGD& zy#vuJv`b$ya?LxC>-d4=T}<}_);kqVCs=}(U6xpz`^QAGV#{UDr{`1D)?SKQJ*AP` z;qzZ7(e#ZEm@XV(T>#`Vi#M?8G4RGPNbO)SDPYV%lkk0f&}M!XUsOVd+o{Cek5-7S z?$s8VztieLoux$3i-sre3nmssU*Ie`I)`y{PSEViPn_8zkN5TP--_9N>U@KL;TOJd zml%uM*FWETaMl|EN%<{X?|!^-u3;6!a;4Riv_e;wuG5~Mw1>g4*WpuoL(yA*3 z+D}w?D9B!z_WW^}HpkCzS=^_&-$duX|9>@cZu|qS4&T21uJy?^uh|0`ER}3H=iS*o z@zYxV*oH#+`9VMZH^l0nt!Ius`QxwtYv)_stDUkX-<3Ok28Jnvr>mdKI;Vst0AXjm APXGV_ literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/precious/platinum_layer_1.png b/libs/textures/models/armor/precious/platinum_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..de246a6e6705c735f8fe179768076c317e337ae2 GIT binary patch literal 727 zcmV;|0x127P)G23U0h!IC${Uy z=Rb2>*{t}^rykOPqs2{UJ(e%%ei582tpUyoZ|LM0B=&WUoum~m6*%^5h$2}|P}|GX zgO@&Saen3w_V>IfBqqb4WPvC(GzrCHWuaNAaBWQrF-gToX>+SwZ6+|uOIa@#+Ovt% z>?5-gAo&3&Nw|)=gznQd46zt$F&y_DPfkEiwilbn0t{cAuivWG0L%@r;&EBEL&cM2 zDi$$w-WauB7*%-Fu_dW1HEVCj9A>H(M~k`aBAE|W}uv`gl?6$$^kxg_yyepz+H1mxk3N{002ov JPDHLkV1l?IF_r)T literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/precious/platinum_layer_2.png b/libs/textures/models/armor/precious/platinum_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c55501c6dcff31eaa481db8b08728c4bcfb99935 GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQtTz3zOL+dnb;Vml^nc1mjH#t zOI#yLg7ec#$`gxH8QgtbfW|14r4}g|>zNd`E_n!4!ckJ-=MI!H2C^Bv8Z_mB6id3J zuOkD)#(wTUiL5|ATavfC3&Vd9T(EcfWCjLC4^J1zkcv4^r)}gqWFXMi{6oa9fqy~s z>czA9l{$8BKBu%pn?vcHo?TnLU;4d9yU~0-3%CB=+WD08+tJ(4>+c%1#y{}t zxGN(+Z(rBPqv1-7n_PdW{dl%1>Xf*=72{c>XB~S~GZHT8CbFy7|5LSFvX^nqiC;ZW T16$I7q0Hdv>gTe~DWM4f!!*Fa literal 0 HcmV?d00001 diff --git a/libs/textures/models/armor/precious/silver_layer_1.png b/libs/textures/models/armor/precious/silver_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..84f77f6a2c98f8f286f998906b772993171a1310 GIT binary patch literal 681 zcmV;a0#^NrP)b>!3>5m8qC+3zz9etx)KB;wDZ2U}o`SB~vv>$PxS#dzic%QIF~npThVghjnj*T?`?X8bK!I8!y3znP0yY9R0`d^B+wCr7RRkbtBx4l> z2+;k0KOzx*-%n%GE)8HY0ak1yU2x{;>*=~~`fZvfynnof!}m*Q+jbIZ%b4iUmLK`H_kGnDf2@_!Rb~%3 zpU;!92dJ&L(lIIR0VV;M@DwPA0OyBWz*j+l7rzRQW1ai49H91=UdM|QfWS~J@EQUh z3D!3}T`k*a;0jMgbA$&_$JEaIj{HeXS6Y$=47~J&?_EbE4QgAp>;!BcuyzlaOOQvD zXJ@^GV^&E$r~hyQa9`&t5dmQ}iFE;QnY?x0T3}sUXx)VXWt>Z7UQs0hS4hXK!u`lq2Pg)FgmC!aQCxrjl?Pzl zT{9N*oLr~HfEgUy+~-SE9lOUQZcShh2?3r&Dg<&&GHVEMDYR|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(eheY)RhkE)4%caKYZ?lYt_yJzX3_D(1YMdX|&PP{6HuZ^fnw9j!}x zr#v`mq*V6cWKd9(I{)I$211Y4DZH}t;juCM&7QySY|fmH9rF&dW)v_=#Wb*qFTl@y z_Rz`8(}`nJ@wC4Wm9{*1!_AcJJ8Onku{pL4n^<>oIB;)EDve_g2)0}7zN=w7 z^98448qJd0_ZD#fxW%=hvRCx(AFdgP;&RehFEE+xU^shP*Wjwq{!@qUy7d$uI99c} z`1s{-b#eE<-{UtiJY~E84%6wk?{3!q;;vi5`j7F8oWpthgWBFY?27UCOGAL(X7F_N Kb6Mw<&;$V7jFr3q literal 0 HcmV?d00001 diff --git a/libs/textures/particles/m_particles.png b/libs/textures/particles/m_particles.png new file mode 100644 index 0000000000000000000000000000000000000000..1570a87642379f0320648ee6ed925cf8ac6ca4b7 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_r)EAj~ML;ne^XWH0gbb!ETD!pEn;{^8&(cA(HEPZ!6Kh{JEEdGj4s;BoQgV^V+k z#qMOqWYP43@V-??rU<$EUj4OJsMp5qiLt<6>z9+yGOUQ59wa1q(J1-A87_yJk?Exj zT1qZ1DoVEvGEEkyPb#*15thB{`NOO7We2kV_^iEp^?T`F#_I3W?HA~OhHhSOI zpSNc1lS<0OMN3&%cm6ZRf<8p+8CY^xFi()%@%mp6wN#u~XI} j?d$t`_9g|6cMlkgS8Y~&;&^%~(De+Su6{1-oD!M 16 + if (getDisengageTime() <= 0 && getAttackTarget() == null || damage > 20 || (targetedEntity != null && !(targetedEntity instanceof EntityPlayer))) setTarget(source.getEntity()); } @@ -634,7 +634,7 @@ private boolean didDropHeart(int tier) { } if (tier == 1)// Adult { - return rand.nextFloat() * heartChance > 0.85F;// 15% chance + return rand.nextFloat() * heartChance > 1.50F;// 15% chance } return false;// Young } @@ -672,7 +672,7 @@ public boolean getCanSpawnHere() { * Will return how many at most can spawn in a chunk at once. */ public int getMaxSpawnedInChunk() { - return 1; + return 2; } /** @@ -801,7 +801,7 @@ public String getCommandSenderName() { } public float getScale() { - return 0.6F + (getTier() * 0.2F); + return 1.0F + (getTier() * 0.6F); } public Shockwave createShockwave(double x, double y, double z, float power, boolean grief) { diff --git a/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java b/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java index ca91f665..c5fb6236 100644 --- a/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java +++ b/src/main/java/minefantasy/mf2/item/AdvancedFuelHandlerMF.java @@ -30,7 +30,7 @@ public int getBurnTime(ItemStack fuel) { return 2400; } if (fuel.getItem() == Items.coal) { - return 1200; + return 3650; } if (fuel.getItem() == Item.getItemFromBlock(Blocks.coal_block)) { return 10800; diff --git a/src/main/java/minefantasy/mf2/item/ItemComponentMF.java b/src/main/java/minefantasy/mf2/item/ItemComponentMF.java index e8cc5fdf..f77f7232 100644 --- a/src/main/java/minefantasy/mf2/item/ItemComponentMF.java +++ b/src/main/java/minefantasy/mf2/item/ItemComponentMF.java @@ -200,6 +200,7 @@ public void getSubItems(Item item, CreativeTabs tab, List list) { add(list, ComponentListMF.copper_coin); add(list, ComponentListMF.silver_coin); add(list, ComponentListMF.gold_coin); + add(list, ComponentListMF.dwarven_fuel); } private void add(List list, Item item) { diff --git a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java index ea27a0e5..d9eb112e 100644 --- a/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/ComponentListMF.java @@ -26,7 +26,7 @@ public class ComponentListMF { public static final String[] ingotMats = new String[]{"copper", "tin", "bronze", "pigiron", "steel", "encrusted", "blacksteelweak", "blacksteel", "silver", "redsteelweak", "redsteel", "bluesteelweak", "bluesteel", - "adamantium", "mithril", "ignotumite", "mithium", "ender", "tungsten", "obsidian"}; + "adamantium", "mithril", "ignotumite", "mithium", "ender", "tungsten", "obsidian", "dwarfsteel", "emerald"}; public static Item clay_pot = new ItemMFBowl("clay_pot").setStoragePlacement("pot", "pot"); public static Item clay_pot_uncooked = new ItemComponentMF("clay_pot_uncooked", 0); @@ -46,6 +46,7 @@ public class ComponentListMF { public static Item coalDust = new ItemComponentMF("coalDust", 0).setContainerItem(clay_pot); public static Item nitre = new ItemComponentMF("nitre", 0); + public static Item coal = new ItemComponentMF("coal", 0); public static Item sulfur = new ItemComponentMF("sulfur", 0); public static Item iron_prep = new ItemComponentMF("iron_prep", 0); public static Item blackpowder = new ItemBombComponent("blackpowder", 0, "powder", 0).setContainerItem(clay_pot); @@ -73,6 +74,9 @@ public class ComponentListMF { public static Item coke = new ItemComponentMF("coke", 1); public static Item diamond_shards = new ItemComponentMF("diamond_shards", 0); + + //NEW FUEL + public static Item dwarven_fuel = new ItemComponentMF("dwarven_fuel", 1); public static Item clay_brick = new ItemComponentMF("clay_brick", 0); public static Item kaolinite = new ItemComponentMF("kaolinite", 0); @@ -217,6 +221,7 @@ private static void initFuels() { MineFantasyFuels.addForgeFuel(Items.fire_charge, 1200, 3500, true);// 3500C , 1m MineFantasyFuels.addForgeFuel(Items.lava_bucket, 2400, 5000, true);// 5000C , 2m MineFantasyFuels.addForgeFuel(Items.magma_cream, 2400, 4000, true, true);// 4000C , 2m + MineFantasyFuels.addForgeFuel(ComponentListMF.dwarven_fuel, 2050, 3650); MineFantasyFuels.addForgeFuel(ComponentListMF.coke, 1200, 2500, false, true);// 2500C , 1m MineFantasyFuels.addForgeFuel(ComponentListMF.magma_cream_refined, 2400, 5000, true, true);// 5000C , 2m diff --git a/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java b/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java index 84845637..dc0d7ad6 100644 --- a/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CreativeTabMF.java @@ -24,6 +24,7 @@ public final class CreativeTabMF extends CreativeTabs { public static CreativeTabs tabDragonforged = new CreativeTabMF(CreativeTabs.getNextID(), "MFdragonforged", 12); public static CreativeTabs tabOrnate = new CreativeTabMF(CreativeTabs.getNextID(), "MFornate", 13); public static CreativeTabs tabOldTools = new CreativeTabMF(CreativeTabs.getNextID(), "MFOld", 14); + public static CreativeTabs tabDwarvenforged = new CreativeTabMF(CreativeTabs.getNextID(), "MFdwarvenforged", 15); private int type; @@ -64,6 +65,8 @@ public ItemStack getIconItemStack() { return new ItemStack(ComponentListMF.ornate_items); case 14: return new ItemStack(ToolListMF.pickStone); + case 15: + return new ItemStack(CustomToolListMF.standard_longsword); } return new ItemStack(ComponentListMF.ingots[3]); } diff --git a/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java b/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java index dbbf79e1..79c3360a 100644 --- a/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java +++ b/src/main/java/minefantasy/mf2/item/list/CustomToolListMF.java @@ -16,8 +16,9 @@ public class CustomToolListMF { // STANDARD public static ItemWeaponMF standard_sword, standard_waraxe, standard_mace, standard_dagger, standard_spear; - public static ItemWeaponMF standard_greatsword, standard_battleaxe, standard_warhammer, standard_katana, - standard_halbeard, standard_lance; + public static ItemWeaponMF standard_longsword, standard_battleaxe, standard_warhammer, standard_katana, + standard_halbeard, standard_lance, standard_greatsword, standard_shortsword, standard_saber, standard_gladius, standard_trident, + standard_nodachi, standard_claymore; public static ItemPickMF standard_pick; public static ItemAxeMF standard_axe; public static ItemSpadeMF standard_spade; @@ -52,8 +53,21 @@ public static void load() { standard_mace = new ItemMaceMF(design + "_mace", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); standard_spear = new ItemSpearMF(design + "_spear", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); standard_katana = new ItemKatanaMF(design + "_katana", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); - standard_greatsword = new ItemGreatswordMF(design + "_greatsword", ToolMaterial.IRON, 0, 1F).setCustom(design) - .setTab(tab); + standard_greatsword = new ItemGreatswordMF(design + "_greatsword", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + + //New Weapons + standard_longsword = new ItemLongswordMF(design + "_longsword", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_saber = new ItemSaber(design + "_saber", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_shortsword = new ItemShortsword(design + "_shortsword", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_gladius = new ItemGladius(design + "_gladius", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_trident = new ItemTrident(design + "_trident", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_nodachi = new ItemNodachi(design + "_nodachi", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + standard_claymore = new ItemClaymoreMF(design + "_claymore", ToolMaterial.IRON, 0, 1F).setCustom(design).setTab(tab); + + + + + standard_battleaxe = new ItemBattleaxeMF(design + "_battleaxe", ToolMaterial.IRON, 0, 1F).setCustom(design) .setTab(tab); standard_warhammer = new ItemWarhammerMF(design + "_warhammer", ToolMaterial.IRON, 0, 1F).setCustom(design) diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemClaymoreMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemClaymoreMF.java new file mode 100644 index 00000000..a629c880 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemClaymoreMF.java @@ -0,0 +1,128 @@ +package minefantasy.mf2.item.weapon; + +import java.util.Random; + +import minefantasy.mf2.api.weapon.WeaponClass; +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public class ItemClaymoreMF extends ItemClaymoreStats implements IExtendedReachWeapon { + private Random rand = new Random(); + + public ItemClaymoreMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { + return true; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } + + @Override + public boolean canWeaponEvade() { + return true; + } + + @Override + protected int getParryDamage(float dam) { + return 2; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(EntityLivingBase user) { + return 20; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.5F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return user instanceof EntityPlayer ? 3.0F : 1.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat() * 0.5F)); + return true; + } + + @Override + public float getBalance() { + return 1.0F; + } + + @Override + protected boolean canAnyMobParry() { + return true; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModClaymore; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return claymoreParryTime + heavyParryTime; + } + + @Override + protected float getStaminaMod() { + return claymoreStaminaCost * swordStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return claymoreSlashingDamage; + } + + @Override + public float getCounterDamage() { + return 1.0F; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 2.5F; + } + } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemClaymoreStats.java b/src/main/java/minefantasy/mf2/item/weapon/ItemClaymoreStats.java new file mode 100644 index 00000000..bb92b751 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemClaymoreStats.java @@ -0,0 +1,124 @@ +package minefantasy.mf2.item.weapon; + +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public abstract class ItemClaymoreStats extends ItemWeaponMF implements IExtendedReachWeapon { + + /** + * Heavy weapons are larger varients of their own counterparts(sword, waraxe, + * mace and spear). These have 2x the durability, have a wider parry arc, and do + * 50% more damage. + *

+ * Heavy weapons weigh more and throw you off balance when used. + */ + public ItemClaymoreStats(ToolMaterial material, String named, int rarity, float weight) { + super(material, named, rarity, weight); + setMaxDamage((int) (getMaxDamage() * 1.75F)); + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return true; + } + + @Override + public boolean isHeavyWeapon() { + return true; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return false; + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return true; + } + + public int getParryCooldown(EntityLivingBase user) { + return 18; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.0F; + } + + @Override + public float getBalance() { + return 0.75F; + } + + @Override + protected float getKnockbackStrength() { + return 1.8F; + } + + @Override + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 1.10F; + } + + @Override + protected boolean canAnyMobParry() { + return false; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModClaymore; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return claymoreSlashingDamage; + } + + @Override + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { + return claymoreParryFatigue; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return claymoreParryTime; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 50; + } + + @Override + protected float getStaminaMod() { + return claymoreStaminaCost; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 3.0F; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 1.75F; + } + + @Override + public float getScale(ItemStack itemstack) { + return 2.0F; + } +} + diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemGladius.java b/src/main/java/minefantasy/mf2/item/weapon/ItemGladius.java new file mode 100644 index 00000000..15edc939 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemGladius.java @@ -0,0 +1,132 @@ +package minefantasy.mf2.item.weapon; + +import java.util.Random; + +import minefantasy.mf2.api.weapon.WeaponClass; +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public class ItemGladius extends ItemGladiusStats implements IExtendedReachWeapon { + private Random rand = new Random(); + + /** + * Greatswords are heavy counterparts to swords, with added damage, knockback + * and parrying arc +0 */ + public ItemGladius(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { + return true; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } + + @Override + public boolean canWeaponEvade() { + return true; + } + + @Override + protected int getParryDamage(float dam) { + return 1; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(EntityLivingBase user) { + return 12; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.5F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return user instanceof EntityPlayer ? 3.0F : 1.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat() * 0.5F)); + return true; + } + + @Override + public float getBalance() { + return 0.5F; + } + + @Override + protected boolean canAnyMobParry() { + return true; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSword; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return swordParryTime + heavyParryTime; + } + + @Override + protected float getStaminaMod() { + return gladiusStaminacost * swordStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return slashingDamage; + } + + @Override + public float getCounterDamage() { + return 0.5F; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return -0.5F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemGladiusStats.java b/src/main/java/minefantasy/mf2/item/weapon/ItemGladiusStats.java new file mode 100644 index 00000000..f1505e39 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemGladiusStats.java @@ -0,0 +1,110 @@ +package minefantasy.mf2.item.weapon; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public abstract class ItemGladiusStats extends ItemWeaponMF { + + public ItemGladiusStats(ToolMaterial material, String named, int rarity, float weight) { + super(material, named, rarity, weight); + setMaxDamage((int) (getMaxDamage() * 1.0F)); + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return true; + } + + @Override + public boolean isHeavyWeapon() { + return false; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return false; + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return true; + } + + public int getParryCooldown(EntityLivingBase user) { + return 18; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.0F; + } + + @Override + public float getBalance() { + return 0.75F; + } + + @Override + protected float getKnockbackStrength() { + return 0.0F; + } + + @Override + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 1.25F; + } + + @Override + protected boolean canAnyMobParry() { + return false; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModGladius; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return slashingDamage; + } + + @Override + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { + return heavyParryFatigue; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return daggerParryTime; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 50; + } + + @Override + protected float getStaminaMod() { + return gladiusStaminacost; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 0.8F; + } + + @Override + public float getScale(ItemStack itemstack) { + return 2.0F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemLongswordMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemLongswordMF.java new file mode 100644 index 00000000..bc706dc8 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemLongswordMF.java @@ -0,0 +1,126 @@ +package minefantasy.mf2.item.weapon; + +import java.util.Random; + +import minefantasy.mf2.api.weapon.WeaponClass; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public class ItemLongswordMF extends ItemLongswordStats { + private Random rand = new Random(); + + /** + * Greatswords are heavy counterparts to swords, with added damage, knockback + * and parrying arc + */ + public ItemLongswordMF(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { + return true; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } + + @Override + public boolean canWeaponEvade() { + return true; + } + + @Override + protected int getParryDamage(float dam) { + return 1; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(EntityLivingBase user) { + return 12; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.5F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return user instanceof EntityPlayer ? 3.0F : 1.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat() * 0.5F)); + return true; + } + + @Override + public float getBalance() { + return 0.5F; + } + + @Override + protected boolean canAnyMobParry() { + return true; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSword; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return swordParryTime + heavyParryTime; + } + + @Override + protected float getStaminaMod() { + return heavyStaminaCost * swordStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return lsSlashingDamage; + } + + @Override + public float getCounterDamage() { + return 0.5F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemLongswordStats.java b/src/main/java/minefantasy/mf2/item/weapon/ItemLongswordStats.java new file mode 100644 index 00000000..53d2286f --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemLongswordStats.java @@ -0,0 +1,123 @@ +package minefantasy.mf2.item.weapon; + +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public abstract class ItemLongswordStats extends ItemWeaponMF implements IExtendedReachWeapon { + + /** + * Heavy weapons are larger varients of their own counterparts(sword, waraxe, + * mace and spear). These have 2x the durability, have a wider parry arc, and do + * 50% more damage. + *

+ * Heavy weapons weigh more and throw you off balance when used. + */ + public ItemLongswordStats(ToolMaterial material, String named, int rarity, float weight) { + super(material, named, rarity, weight); + setMaxDamage((int) (getMaxDamage() * 1.25F)); + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return true; + } + + @Override + public boolean isHeavyWeapon() { + return true; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return false; + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return true; + } + + public int getParryCooldown(EntityLivingBase user) { + return 18; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.0F; + } + + @Override + public float getBalance() { + return 0.75F; + } + + @Override + protected float getKnockbackStrength() { + return 0.5F; + } + + @Override + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 1.10F; + } + + @Override + protected boolean canAnyMobParry() { + return false; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModLongsword; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return lsSlashingDamage; + } + + @Override + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { + return heavyParryFatigue; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return heavyParryTime; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 50; + } + + @Override + protected float getStaminaMod() { + return longswordStaminaCost; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 1.0F; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 1.25F; + } + + @Override + public float getScale(ItemStack itemstack) { + return 2.0F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemNodachi.java b/src/main/java/minefantasy/mf2/item/weapon/ItemNodachi.java new file mode 100644 index 00000000..87b08266 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemNodachi.java @@ -0,0 +1,128 @@ +package minefantasy.mf2.item.weapon; + +import java.util.Random; + +import minefantasy.mf2.api.weapon.WeaponClass; +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public class ItemNodachi extends ItemNodachiStats implements IExtendedReachWeapon { + private Random rand = new Random(); + + public ItemNodachi(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { + return true; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } + + @Override + public boolean canWeaponEvade() { + return true; + } + + @Override + protected int getParryDamage(float dam) { + return 1; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(EntityLivingBase user) { + return 12; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.5F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return user instanceof EntityPlayer ? 3.0F : 1.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat() * 0.5F)); + return true; + } + + @Override + public float getBalance() { + return 0.5F; + } + + @Override + protected boolean canAnyMobParry() { + return true; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSword; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return swordParryTime + heavyParryTime; + } + + @Override + protected float getStaminaMod() { + return heavyStaminaCost * swordStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return slashingDamage; + } + + @Override + public float getCounterDamage() { + return 0.5F; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 2.0F; + } + } diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemNodachiStats.java b/src/main/java/minefantasy/mf2/item/weapon/ItemNodachiStats.java new file mode 100644 index 00000000..7fea20d0 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemNodachiStats.java @@ -0,0 +1,123 @@ +package minefantasy.mf2.item.weapon; + +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public abstract class ItemNodachiStats extends ItemWeaponMF implements IExtendedReachWeapon { + + /** + * Heavy weapons are larger varients of their own counterparts(sword, waraxe, + * mace and spear). These have 2x the durability, have a wider parry arc, and do + * 50% more damage. + *

+ * Heavy weapons weigh more and throw you off balance when used. + */ + public ItemNodachiStats(ToolMaterial material, String named, int rarity, float weight) { + super(material, named, rarity, weight); + setMaxDamage((int) (getMaxDamage() * 1.25F)); + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return true; + } + + @Override + public boolean isHeavyWeapon() { + return true; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return false; + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return true; + } + + public int getParryCooldown(EntityLivingBase user) { + return 25; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.5F; + } + + @Override + public float getBalance() { + return 0.95F; + } + + @Override + protected float getKnockbackStrength() { + return 1.75F; + } + + @Override + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 1.10F; + } + + @Override + protected boolean canAnyMobParry() { + return false; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModNodachi; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return nodachiSlashingDamage; + } + + @Override + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { + return heavyParryFatigue; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return nodachiParryTime; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 50; + } + + @Override + protected float getStaminaMod() { + return nodachiStaminaCost; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 2.0F; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 1.25F; + } + + @Override + public float getScale(ItemStack itemstack) { + return 2.0F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemSaber.java b/src/main/java/minefantasy/mf2/item/weapon/ItemSaber.java new file mode 100644 index 00000000..27b91bc0 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemSaber.java @@ -0,0 +1,132 @@ +package minefantasy.mf2.item.weapon; + +import java.util.Random; + +import minefantasy.mf2.api.weapon.WeaponClass; +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public class ItemSaber extends ItemSaberStats implements IExtendedReachWeapon { + private Random rand = new Random(); + + /** + * Greatswords are heavy counterparts to swords, with added damage, knockback + * and parrying arc +0 */ + public ItemSaber(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { + return true; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } + + @Override + public boolean canWeaponEvade() { + return true; + } + + @Override + protected int getParryDamage(float dam) { + return 1; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(EntityLivingBase user) { + return 12; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.5F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return user instanceof EntityPlayer ? 3.0F : 1.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat() * 0.5F)); + return true; + } + + @Override + public float getBalance() { + return 0.5F; + } + + @Override + protected boolean canAnyMobParry() { + return true; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSword; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return swordParryTime + heavyParryTime; + } + + @Override + protected float getStaminaMod() { + return saberStaminaCost * swordStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return crushingDamage; + } + + @Override + public float getCounterDamage() { + return 0.5F; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 0.5F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemSaberStats.java b/src/main/java/minefantasy/mf2/item/weapon/ItemSaberStats.java new file mode 100644 index 00000000..cb06bdd3 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemSaberStats.java @@ -0,0 +1,117 @@ +package minefantasy.mf2.item.weapon; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public abstract class ItemSaberStats extends ItemWeaponMF { + + /** + * Heavy weapons are larger varients of their own counterparts(sword, waraxe, + * mace and spear). These have 2x the durability, have a wider parry arc, and do + * 50% more damage. + *

+ * Heavy weapons weigh more and throw you off balance when used. + */ + public ItemSaberStats(ToolMaterial material, String named, int rarity, float weight) { + super(material, named, rarity, weight); + setMaxDamage((int) (getMaxDamage() * 1.2F)); + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return true; + } + + @Override + public boolean isHeavyWeapon() { + return false; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return false; + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return true; + } + + public int getParryCooldown(EntityLivingBase user) { + return 18; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.0F; + } + + @Override + public float getBalance() { + return 0.75F; + } + + @Override + protected float getKnockbackStrength() { + return 1.5F; + } + + @Override + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 1.25F; + } + + @Override + protected boolean canAnyMobParry() { + return false; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSaber; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return slashingDamage; + } + + @Override + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { + return heavyParryFatigue; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return heavyParryTime; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 50; + } + + @Override + protected float getStaminaMod() { + return saberStaminaCost; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 1.2F; + } + + @Override + public float getScale(ItemStack itemstack) { + return 2.0F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemShortsword.java b/src/main/java/minefantasy/mf2/item/weapon/ItemShortsword.java new file mode 100644 index 00000000..38bb8402 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemShortsword.java @@ -0,0 +1,132 @@ +package minefantasy.mf2.item.weapon; + +import java.util.Random; + +import minefantasy.mf2.api.weapon.WeaponClass; +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public class ItemShortsword extends ItemShortswordStats implements IExtendedReachWeapon { + private Random rand = new Random(); + + /** + * Greatswords are heavy counterparts to swords, with added damage, knockback + * and parrying arc +0 */ + public ItemShortsword(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { + return true; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } + + @Override + public boolean canWeaponEvade() { + return true; + } + + @Override + protected int getParryDamage(float dam) { + return 1; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(EntityLivingBase user) { + return 12; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.5F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return user instanceof EntityPlayer ? 3.0F : 1.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat() * 0.5F)); + return true; + } + + @Override + public float getBalance() { + return 0.5F; + } + + @Override + protected boolean canAnyMobParry() { + return true; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSword; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return swordParryTime + heavyParryTime; + } + + @Override + protected float getStaminaMod() { + return heavyStaminaCost * swordStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return crushingDamage; + } + + @Override + public float getCounterDamage() { + return 0.5F; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return -0.8F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemShortswordStats.java b/src/main/java/minefantasy/mf2/item/weapon/ItemShortswordStats.java new file mode 100644 index 00000000..ebfb5f3d --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemShortswordStats.java @@ -0,0 +1,118 @@ +package minefantasy.mf2.item.weapon; + +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public abstract class ItemShortswordStats extends ItemWeaponMF { + + /** + * Heavy weapons are larger varients of their own counterparts(sword, waraxe, + * mace and spear). These have 2x the durability, have a wider parry arc, and do + * 50% more damage. + *

+ * Heavy weapons weigh more and throw you off balance when used. + */ + public ItemShortswordStats(ToolMaterial material, String named, int rarity, float weight) { + super(material, named, rarity, weight); + setMaxDamage((int) (getMaxDamage() * 0.8F)); + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return true; + } + + @Override + public boolean isHeavyWeapon() { + return false; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return false; + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return true; + } + + public int getParryCooldown(EntityLivingBase user) { + return 18; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.0F; + } + + @Override + public float getBalance() { + return 0.75F; + } + + @Override + protected float getKnockbackStrength() { + return 1.5F; + } + + @Override + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 1.25F; + } + + @Override + protected boolean canAnyMobParry() { + return false; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModShortsword; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return slashingDamage; + } + + @Override + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { + return heavyParryFatigue; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return heavyParryTime; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 50; + } + + @Override + protected float getStaminaMod() { + return shortswordStaminaCost; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 0.8F; + } + + @Override + public float getScale(ItemStack itemstack) { + return 2.0F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemTrident.java b/src/main/java/minefantasy/mf2/item/weapon/ItemTrident.java new file mode 100644 index 00000000..57838be5 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemTrident.java @@ -0,0 +1,128 @@ +package minefantasy.mf2.item.weapon; + +import java.util.Random; + +import minefantasy.mf2.api.weapon.WeaponClass; +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public class ItemTrident extends ItemTridentStats implements IExtendedReachWeapon { + private Random rand = new Random(); + + public ItemTrident(String name, ToolMaterial material, int rarity, float weight) { + super(material, name, rarity, weight); + } + + @Override + public boolean canBlock() { + return true; + } + + /** + * Determines if the weapon can parry + */ + @Override + public boolean canWeaponParry() { + return true; + } + + @Override + public boolean canWeaponEvade() { + return true; + } + + @Override + protected int getParryDamage(float dam) { + return 1; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(EntityLivingBase user) { + return 12; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.5F; + } + + /** + * Gets the multiplier for the parry threshold + * + * @return + */ + @Override + public float getParryDamageModifier(EntityLivingBase user) { + return user instanceof EntityPlayer ? 3.0F : 1.5F; + } + + @Override + public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { + blocker.worldObj.playSoundAtEntity(blocker, "mob.zombie.metal", 1.0F, 0.75F + (rand.nextFloat() * 0.5F)); + return true; + } + + @Override + public float getBalance() { + return 0.5F; + } + + @Override + protected boolean canAnyMobParry() { + return true; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModSword; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return swordParryTime + heavyParryTime; + } + + @Override + protected float getStaminaMod() { + return saberStaminaCost * swordStaminaCost; + } + + @Override + public WeaponClass getWeaponClass() { + return WeaponClass.BLADE; + } + + @Override + public boolean canCounter() { + return true; + } + + @Override + public float[] getCounterRatio() { + return crushingDamage; + } + + @Override + public float getCounterDamage() { + return 0.5F; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 2.5F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemTridentStats.java b/src/main/java/minefantasy/mf2/item/weapon/ItemTridentStats.java new file mode 100644 index 00000000..6b1848f2 --- /dev/null +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemTridentStats.java @@ -0,0 +1,123 @@ +package minefantasy.mf2.item.weapon; + +import mods.battlegear2.api.weapons.IExtendedReachWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public abstract class ItemTridentStats extends ItemWeaponMF implements IExtendedReachWeapon{ + + /** + * Heavy weapons are larger varients of their own counterparts(sword, waraxe, + * mace and spear). These have 2x the durability, have a wider parry arc, and do + * 50% more damage. + *

+ * Heavy weapons weigh more and throw you off balance when used. + */ + public ItemTridentStats(ToolMaterial material, String named, int rarity, float weight) { + super(material, named, rarity, weight); + setMaxDamage((int) (getMaxDamage() * 1.2F)); + } + + @Override + public boolean sheatheOnBack(ItemStack item) { + return true; + } + + @Override + public boolean isHeavyWeapon() { + return true; + } + + @Override + public boolean isOffhandHandDual(ItemStack off) { + return false; + } + + @Override + public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { + return true; + } + + public int getParryCooldown(EntityLivingBase user) { + return 18; + } + + /** + * Gets the angle the weapon can parry + */ + @Override + public float getParryAngleModifier(EntityLivingBase user) { + return 1.0F; + } + + @Override + public float getReachModifierInBlocks(ItemStack stack) { + return 2.5F; + } + + @Override + public float getBalance() { + return 0.75F; + } + + @Override + protected float getKnockbackStrength() { + return 1.5F; + } + + @Override + public float getDecayModifier(EntityLivingBase user, ItemStack item) { + return 1.25F; + } + + @Override + protected boolean canAnyMobParry() { + return false; + } + + @Override + public int modifyHitTime(EntityLivingBase user, ItemStack item) { + return super.modifyHitTime(user, item) + speedModTrident; + } + + @Override + protected float[] getWeaponRatio(ItemStack implement) { + return trSlashingDamage; + } + + @Override + public float getParryStaminaDecay(DamageSource source, ItemStack weapon) { + return heavyParryFatigue; + } + + /** + * gets the time after being hit your guard will be let down + */ + @Override + public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { + return heavyParryTime; + } + + @Override + public int getParryModifier(ItemStack weapon, EntityLivingBase user, Entity target) { + return 50; + } + + @Override + protected float getStaminaMod() { + return tridentStaminaCost; + } + + @Override + protected float getMeleeDamage(ItemStack item) { + return super.getMeleeDamage(item) * 1.1F; + } + + @Override + public float getScale(ItemStack itemstack) { + return 2.0F; + } +} diff --git a/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java b/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java index afa24c8c..c0b4c85e 100644 --- a/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java +++ b/src/main/java/minefantasy/mf2/item/weapon/ItemWeaponMF.java @@ -73,6 +73,42 @@ public abstract class ItemWeaponMF extends ItemSword implements ISpecialDesign, protected static float damageModSword = 0.0F; protected static float damageModAxe = 0.5F; protected static float damageModMace = 1.0F; + + + //NEW STATS + + //Shortsword + protected static float damageModShortsword = -0.5F; + protected static int speedModShortsword = -1; + protected static float shortswordStaminaCost = 0.6F; + //Longsword + protected float[] lsSlashingDamage = new float[]{7F, 0F, 0F}; + protected static int speedModLongsword = 2; + protected float longswordStaminaCost = 1.25F; + //Saber + protected float saberStaminaCost = 0.8F; + protected static int speedModSaber = 1; + //Gladius + protected float gladiusStaminacost = 0.5F; + protected static int speedModGladius = -3; + //Trident + protected float[] trSlashingDamage = new float[]{1F, 0F, 10F}; + protected static int speedModTrident = -2; + protected float tridentStaminaCost = 1.3F; + //Nodachi + protected float nodachiStaminaCost = 1.75F; + protected static int speedModNodachi = 4; + protected int nodachiParryTime = 15; + protected float[] nodachiSlashingDamage = new float[]{9.5F, 1F, 4F}; + //Claymore + protected float claymoreStaminaCost = 2.75F; + protected static int speedModClaymore = 6; + protected int claymoreParryTime = 25; + protected float[] claymoreSlashingDamage = new float[]{12.0F, 12F, 0F}; + protected float claymoreParryFatigue = 2.5F; + + + protected final ToolMaterial material; public String designType = "standard"; protected String name; diff --git a/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java b/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java index a50c9eef..ab6b5d9b 100644 --- a/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java +++ b/src/main/java/minefantasy/mf2/knowledge/KnowledgeListMF.java @@ -62,7 +62,7 @@ public class KnowledgeListMF { dragons, minotaurs; public static InformationBase bloomery, crucible, crucible2, smeltCopper, smeltBronze, smeltIron, coalflux, bigfurn, blastfurn, smeltPig, smeltSteel, encrusted, obsidian, smeltBlackSteel, smeltDragonforge, smeltBlueSteel, - smeltRedSteel, smeltMithril, smeltAdamant, smeltMaster, smeltMithium, smeltIgnotumite, smeltEnderforge; + smeltRedSteel, smeltMithril, smeltAdamant, smeltMaster, smeltMithium, smeltIgnotumite, smeltEnderforge, smeltEmerald; public static InformationBase bellows, trough, forge, anvil, bar, apron, craftTools, craftAdvTools, craftWeapons, craftAdvWeapons, arrows, craftOrnate, craftArmourLight, craftArmourMedium, craftArmourHeavy, arrowsBodkin, arrowsBroad, repair_basic, repair_advanced, repair_ornate; @@ -88,13 +88,13 @@ public class KnowledgeListMF { bSalvageR, tannerRecipe, stoneAnvilRecipe, forgeRecipe, apronRecipe, woodTroughRecipe; public static ICarpenterRecipe researchTableRecipe, framedGlassR, windowR, thatchR, thatchStairR; public static IAnvilRecipe smokePipeR, framedStoneR, iframedStoneR, fluxR, nailR, rivetR; - public static IAnvilRecipe tinderboxR, flintAndSteelR; + public static IAnvilRecipe tinderboxR, flintAndSteelR, dwarvenfuelR; public static ICarpenterRecipe dirtRockR, lStripsR, threadR, stringR, sharpRocksR, stonePickR, stoneAxeR, stoneSpadeR, stoneHoeR, stoneSwordR, stoneWarR, stoneMaceR, stoneSpearR, stoneHammerR, stoneTongsR, boneNeedleR, stoneKnifeR, quernR, stoneovenRecipe; public static Alloy[] reStone, bronze, steel, obsidalloy, black, red, blue, mithril, adamantium, ignotumite, - mithium, enderforge, wolframiteR; - public static IAnvilRecipe coalfluxR, encrustedR, steelR, obsidianHunkR, diamondR; + mithium, enderforge, wolframiteR, dwarfsteel, emerald; + public static IAnvilRecipe coalfluxR, encrustedR, steelR, obsidianHunkR, diamondR, dwarfsteelR, dwarffuelR, emeraldR; public static ICarpenterRecipe nailPlanksR, nailStairR, refinedStairR, strongRackR, bellowsRecipe, bloomeryR, crucibleRecipe, advCrucibleRecipe, trilogyRecipe, chimneyRecipe, wideChimneyRecipe, extractChimneyRecipe; public static ICarpenterRecipe hideHelmR, hideChestR, hideLegsR, hideBootsR, roughHelmetR, roughChestR, roughLegsR, @@ -102,7 +102,7 @@ public class KnowledgeListMF { public static IAnvilRecipe studHelmetR, studChestR, studLegsR, studBootsR; public static IAnvilRecipe pickR, axeR, spadeR, hoeR, shearsR; public static IAnvilRecipe daggerR, swordR, waraxeR, maceR, spearR, bowR, katanaR, gswordR, whammerR, battleaxeR, - halbeardR, lanceR; + halbeardR, lanceR, longswordR, shortswordR, saberR, gladiusR, tridentR, nodachiR, claymoreR; public static IAnvilRecipe trowR, hvyPickR, hvyShovelR, handpickR, scytheR, mattockR, lumberR; public static IAnvilRecipe hammerR, tongsR, hvyHammerR, needleR, sawsR, knifeR, spannerR; public static IAnvilRecipe arrowheadR, bodkinheadR, broadheadR, crossBoltR; @@ -225,7 +225,10 @@ public static void init() { smeltAdamant = (new InformationBase("smeltAdamantium", 3, 12, 3, ComponentListMF.ingots[13], null)) .registerStat().setPage(artisanry).addSkill(SkillList.artisanry, 75) .setDescriptValues(getMetalTier("adamantium")); - + //new + + + smeltMaster = (new InformationBase("smeltMaster", 4, 13, 3, new ItemStack(ComponentListMF.artefacts, 1, 3), (InformationBase) null)).registerStat().setPage(artisanry).setSpecial().addSkill(SkillList.artisanry, 100); diff --git a/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java b/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java index 8194439d..266b96e2 100644 --- a/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java +++ b/src/main/java/minefantasy/mf2/material/BaseMaterialMF.java @@ -28,7 +28,7 @@ public class BaseMaterialMF { public static BaseMaterialMF stone, tin, pigiron, silver, gold, ornate, weakblacksteel, weakredsteel, weakbluesteel, tungsten;// Misc Mats public static BaseMaterialMF copper, bronze, iron, steel, encrusted, obsidian, blacksteel, bluesteel, redsteel, - dragonforge, adamantium, mithril, ignotumite, mithium, enderforge;// Tiers + dragonforge, adamantium, mithril, ignotumite, mithium, enderforge, dwarfsteel, emerald;// Tiers public static BaseMaterialMF cogworks, compositeAlloy;// Engineer private static float ACrounding = 10F; // round to nearest 10 /* @@ -176,7 +176,10 @@ public static void init() { 250); compositeAlloy = addArmourSpecificMaterial("CompositeAlloy", 4, 1800, 4.0F, 10, 2.00F, 85) .setForgeStats(3, 3, 2.5F, 120, 250).setResistances(95F, 85F); - + + //NEW name Tier dura, harvest sharpness enchant weight + dwarfsteel = addMaterial("DwarfSteel", 4, 1500, 4, 4.0F, 12, 0.85F, 50).setForgeStats(4, 4, 4.0F, 150, 350);// lvl + emerald = addMaterial("Emerald", 4, 1500, 4, 4.0F, 12, 0.85F, 50).setForgeStats(4, 4, 4.0F, 150, 350);// lvl } /** diff --git a/src/main/java/minefantasy/mf2/material/MetalMaterial.java b/src/main/java/minefantasy/mf2/material/MetalMaterial.java index dd903ee1..f600158b 100644 --- a/src/main/java/minefantasy/mf2/material/MetalMaterial.java +++ b/src/main/java/minefantasy/mf2/material/MetalMaterial.java @@ -66,7 +66,7 @@ public static void init() { .setArmourStats(1.0F, 1.0F, 1.0F);// Standard getOrAddMetal("PigIron", 2, 2.0F, 0.8F, 2.0F, 20F, 2.5F, 120, 95, 95).setCrafterTiers(2).setMeltingPoint(1200) .setArmourStats(1.1F, 0.8F, 1.1F);// Less Blunt for more cutting/piercing - getOrAddMetal("Steel", 3, 3.0F, 1.0F, 2.5F, 30F, 2.5F, 168, 168, 168).setCrafterTiers(3).setMeltingPoint(1500); + getOrAddMetal("Steel", 4, 3.5F, 1.0F, 3.0F, 35F, 2.5F, 168, 168, 168).setCrafterTiers(3).setMeltingPoint(1500); getOrAddMetal("Encrusted", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 64, 255, 255).setCrafterTiers(3) .setMeltingPoint(1800).setArmourStats(1.0F, 1.0F, 1.2F);// Better Piercing getOrAddMetal("Obsidian", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 90, 45, 90).setCrafterTiers(3).setMeltingPoint(2000) @@ -74,7 +74,7 @@ public static void init() { getOrAddMetal("Tungsten", 4, 8.0F, 0.8F, 3.0F, 35F, 4.0F, 66, 86, 65).setCrafterTiers(3).setMeltingPoint(2000) .setArmourStats(1.3F, 1.0F, 1.3F);// Better Cutting/Piercing getOrAddMetal("BlackSteel", 5, 6.0F, 1.0F, 4.0F, 50F, 3.0F, 80, 80, 80).setCrafterTiers(4).setMeltingPoint(2000) - .setArmourStats(1.0F, 1.0F, 1.0F);// Standard + .setArmourStats(1.1F, 1.2F, 1.0F);// Standard getOrAddMetal("BlueSteel", 6, 7.0F, 1.2F, 5.0F, 65F, 2.0F, 28, 31, 159).setCrafterTiers(5).setMeltingPoint(2000) .setArmourStats(1.0F, 1.2F, 0.8F);// Better Blunt and Resist getOrAddMetal("RedSteel", 6, 8.0F, 0.8F, 6.0F, 50F, 3.5F, 219, 56, 56).setCrafterTiers(5).setMeltingPoint(2000) @@ -85,7 +85,7 @@ public static void init() { getOrAddMetal("Gold", 0, 2.0F, 1.0F, 0.0F, 40F, 3.5F, 243, 222, 49).setMeltingPoint(1200); // Mythic Mats Name T Dur Flx Shp Rst Wg - getOrAddMetal("Mithril", 7, 10.0F, 0.8F, 7.0F, 90F, 2.0F, 250, 180, 250).setMeltingPoint(2500) + getOrAddMetal("Mithril", 7, 10.0F, 0.8F, 7.0F, 90F, 1.0F, 102, 204, 255).setMeltingPoint(2500) .setCrafterTiers(6).setRarity(1); getOrAddMetal("Adamantium", 7, 12.0F, 0.8F, 8.0F, 80F, 3.5F, 100, 200, 100).setMeltingPoint(2500) .setCrafterTiers(6).setRarity(1); @@ -111,7 +111,41 @@ public static void init() { .setArmourStats(1.1F, 1.0F, 1.1F).setCrafterTiers(2);// Similar to Manasteel, Slightly stronger getOrAddMetal("Terrasteel", 4, 6.0F, 1.0F, 4.0F, 40F, 2.5F, 88, 250, 150).setMeltingPoint(1500) .setArmourStats(1.0F, 0.9F, 1.0F).setCrafterTiers(3); - + + + //String name, int tier, float durability, float flexibility, + //float sharpness, float resistance, float density, int red, int green, int blue + + + + + //NEW METALLURGY Name T Dur Flx Shp Rst Wg + getOrAddMetal("Atlarus", 5, 4.0F, 8.0F, 4.5F, 40F, 2.5F, 216, 183, 17).setMeltingPoint(2400) + .setArmourStats(0.9F, 0.8F, 0.7F).setCrafterTiers(4); + getOrAddMetal("DamascusSteel", 3, 3.3F, 2.6F, 2.5F, 30F, 2.5F, 131, 98, 45).setMeltingPoint(2100) + .setArmourStats(1.0F, 0.9F, 0.8F).setCrafterTiers(3); + getOrAddMetal("Vulcanite", 6, 13.0F, 11.0F, 5.5F, 40F, 2.5F, 187, 68, 8).setMeltingPoint(2250) + .setArmourStats(1.4F, 1.2F, 1.1F).setCrafterTiers(5); + getOrAddMetal("Platinum", 3, 2.0F, 7.0F, 3.5F, 40F, 2.5F, 51, 102, 153).setMeltingPoint(1800) + .setArmourStats(0.9F, 0.8F, 0.5F).setCrafterTiers(3); + getOrAddMetal("Angmallen", 3, 3.2F, 12.0F, 3.0F, 40F, 2.5F, 255, 255, 102).setMeltingPoint(2050) + .setArmourStats(0.9F, 0.8F, 0.7F).setCrafterTiers(3); + getOrAddMetal("Orichalcum", 6, 16.0F, 12.0F, 6.0F, 40F, 2.5F, 28, 125, 45).setMeltingPoint(2350) + .setArmourStats(1.3F, 1.3F, 1.2F).setCrafterTiers(5); + getOrAddMetal("Haderoth", 6, 16.0F, 12.0F, 6.5F, 40F, 2.5F, 102, 68, 0).setMeltingPoint(2350) + .setArmourStats(1.4F, 1.4F, 1.3F).setCrafterTiers(5); + getOrAddMetal("Tartarite", 7, 16.0F, 12.0F, 6.0F, 40F, 2.5F, 255, 0, 0).setMeltingPoint(2450) + .setArmourStats(1.6F, 1.6F, 1.4F).setCrafterTiers(5); + getOrAddMetal("ShadowIron", 2, 2.0F, 2.0F, 3.0F, 40F, 2.5F, 32, 28, 31).setMeltingPoint(645) + .setArmourStats(0.6F, 0.6F, 0.5F).setCrafterTiers(2); + + //NEW + getOrAddMetal("DwarfSteel", 5, 6.5F, 1.6F, 3.6F, 50F, 3.5F, 84, 95, 132).setCrafterTiers(3).setMeltingPoint(2100) + .setArmourStats(1.1F, 1.1F, 0.9F);// Better than steel + getOrAddMetal("Emerald", 4, 8.0F, 1.0F, 3.0F, 35F, 3.0F, 25, 255, 0).setCrafterTiers(3) + .setMeltingPoint(1800).setArmourStats(1.1F, 1.0F, 1.1F);// Better Piercing + + // Alloy getOrAddMetal("CompositeAlloy", 4, 4.5F, 10.0F, 1.0F, 2.5F, 75F, 4.0F, 65, 75, 65).setMeltingPoint(2500) .setRarity(1).setCrafterTiers(3).modifyCraftTime(5.0F);// Powerful All-Rounder diff --git a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java index f487d852..f3f7bbf3 100644 --- a/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java +++ b/src/main/java/minefantasy/mf2/mechanics/worldGen/WorldGenGeological.java @@ -25,7 +25,14 @@ public static void generate(Random seed, int chunkX, int chunkZ, World world, in generateOreWithNeighbour(seed, chunkX, chunkZ, world, BlockListMF.oreMythic, Blocks.stone, Blocks.bedrock, ConfigWorldGen.mythicSize, ConfigWorldGen.mythicFrequencyMin, ConfigWorldGen.mythicFrequencyMax, ConfigWorldGen.mythicRarity, ConfigWorldGen.mythicLayerMin, ConfigWorldGen.mythicLayerMax); - + + //NEW ORES + generateOreWithNeighbour(seed, chunkX, chunkZ, world, BlockListMF.oreMithril, Blocks.stone, Blocks.bedrock, + ConfigWorldGen.mithrilSize, ConfigWorldGen.mithrilFrequencyMin, ConfigWorldGen.mithrilFrequencyMax, + ConfigWorldGen.mithrilRarity, ConfigWorldGen.mithrilLayerMin, ConfigWorldGen.mithrilLayerMax); + + + //MF generateOre(seed, chunkX, chunkZ, world, BlockListMF.oreKaolinite, Blocks.stone, ConfigWorldGen.kaoliniteSize, ConfigWorldGen.kaoliniteFrequencyMin, ConfigWorldGen.kaoliniteFrequencyMax, ConfigWorldGen.kaoliniteRarity, ConfigWorldGen.kaoliniteLayerMin, ConfigWorldGen.kaoliniteLayerMax); diff --git a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java index f664ecad..4d0d1097 100644 --- a/src/main/java/minefantasy/mf2/network/ClientProxyMF.java +++ b/src/main/java/minefantasy/mf2/network/ClientProxyMF.java @@ -240,6 +240,24 @@ private void registerRenders() { MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_lumber, new RenderHeavyWeapon().setBlunt()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_saw, new RenderSaw()); MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_bow, new RenderBow(false)); + + // NEW + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_longsword, + new RenderHeavyWeapon().setLongsword().setParryable()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_shortsword, new RenderSword().setShortsword()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_saber, + new RenderHeavyWeapon().setSaber().setParryable()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_gladius, new RenderSword().setGladius()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_trident, new RenderSpear()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_nodachi, + new RenderHeavyWeapon().setNodachi().setParryable()); + MinecraftForgeClient.registerItemRenderer(CustomToolListMF.standard_claymore, + new RenderHeavyWeapon().setClaymore().setParryable()); + + // DwarvenForged TODO + + + // DRAGONFORGED MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_dagger, new RenderSword()); MinecraftForgeClient.registerItemRenderer(DragonforgedStyle.dragonforged_sword, new RenderSword()); diff --git a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java index 69291500..b2224513 100644 --- a/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/CarpenterRecipes.java @@ -981,5 +981,8 @@ static void tryAddSawPlanks(ItemStack planks, CustomMaterial material) { static void addSawPlanks(ItemStack planks, CustomMaterial material) { MineFantasyAPI.addCarpenterRecipe(construction, (ComponentListMF.plank).construct(material.name, 4), "commodities", sawing, "saw", -1, 10, new Object[]{"P", 'P', planks.copy()}); + + //NEW + } } diff --git a/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java index 110c1de9..20efcee2 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgedToolRecipes.java @@ -386,6 +386,59 @@ private static void addStandardWeapons() { true, "hvyhammer", -1, -1, time, new Object[]{"IR ", "IIIIII", "IR ", 'R', rivet, 'I', bar,}); - Salvage.addSalvage(CustomToolListMF.standard_lance, bar, bar, bar, bar, bar, bar, bar, bar, rivet, rivet); - } + Salvage.addSalvage(CustomToolListMF.standard_lance, bar, bar, bar, bar, bar, bar, bar, bar, rivet, rivet); + + //Longsword + time = 25; + KnowledgeListMF.longswordR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_longsword, + "tier", true, "hvyhammer", -1, -1, time, new Object[]{"LI ", "PIIII ", "LI ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_longsword, bar, bar, bar, bar, bar, bar, plank, strip, strip); + //Saber + time = 20; + KnowledgeListMF.saberR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_saber, + "tier", true, "hammer", -1, -1, time, new Object[]{"LI I", "PIII ", "LI ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_saber, bar, bar, bar, bar, bar, bar, plank, strip, strip); + //Gladius + time = 15; + KnowledgeListMF.gladiusR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_gladius, + "tier", true, "hammer", -1, -1, time, new Object[]{"L ", "PIII", "L ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_gladius, bar, bar, bar, plank, strip, strip); + + //Shortsword + time = 15; + KnowledgeListMF.shortswordR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_shortsword, + "tier", true, "hammer", -1, -1, time, new Object[]{"LI ", "PII ", "LI ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_shortsword, bar, bar, bar, plank, strip, strip); + + //Trident + time = 30; + KnowledgeListMF.tridentR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_trident, + "tier", true, "hvyhammer", -1, -1, time, new Object[]{"LLR I", "PPPII", "LLR I", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_trident, rivet, rivet, bar, bar, plank, strip, strip); + + //Nodachi + time = 20; + KnowledgeListMF.nodachiR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_nodachi, + "tier", true, "hvyhammer", -1, -1, time, new Object[]{"LIR I", "PIIII ", "LIR ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_saber, bar, bar, bar, bar, bar, bar, plank, strip, strip, rivet, rivet); + //Claymore + time = 45; + KnowledgeListMF.claymoreR = MineFantasyAPI.addAnvilToolRecipe(artisanry, CustomToolListMF.standard_claymore, + "tier", true, "hvyhammer", -1, -1, time, new Object[]{"LIRR ", "PIIIII", "LIRR ", + + 'R', rivet, 'I', bar, 'P', plank, 'L', strip,}); + Salvage.addSalvage(CustomToolListMF.standard_claymore, bar, bar, bar, bar, bar, bar, bar, plank, strip, strip, rivet, rivet); + } } \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java index 7de28fc3..32adb381 100644 --- a/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java +++ b/src/main/java/minefantasy/mf2/recipe/ForgingRecipes.java @@ -4,6 +4,7 @@ import minefantasy.mf2.api.MineFantasyAPI; import minefantasy.mf2.api.crafting.Salvage; import minefantasy.mf2.api.crafting.anvil.IAnvilRecipe; +import minefantasy.mf2.api.knowledge.InformationBase; import minefantasy.mf2.api.rpg.Skill; import minefantasy.mf2.api.rpg.SkillList; import minefantasy.mf2.block.list.BlockListMF; @@ -32,12 +33,14 @@ public class ForgingRecipes { public static void init() { ForgedToolRecipes.init(); ForgedArmourRecipes.init(); - addCogworkParts(); + ItemStack ironbar = ComponentListMF.bar("Iron"); ItemStack steelbar = ComponentListMF.bar("Steel"); ItemStack goldbar = ComponentListMF.bar("Gold"); ItemStack silverbar = ComponentListMF.bar("Silver"); + ItemStack dwarvenbar = ComponentListMF.bar("dwarfsteel"); + ItemStack emeraldbar = ComponentListMF.bar("emerald"); // MISC BaseMaterialMF material; @@ -498,5 +501,8 @@ private static void addCogworkParts() { Salvage.addSalvage(BlockListMF.cogwork_legs, new ItemStack(ComponentListMF.iron_frame, 5), new ItemStack(ComponentListMF.cogwork_shaft, 4), new ItemStack(ComponentListMF.rivet, 4)); + + //NEW + } -} +} \ No newline at end of file diff --git a/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java b/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java index 9b394f81..8450f6b0 100644 --- a/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java +++ b/src/main/java/minefantasy/mf2/recipe/SmeltingRecipesMF.java @@ -36,6 +36,7 @@ public static void init() { ItemStack mithium = ComponentListMF.bar("Mithium"); ItemStack ignotumite = ComponentListMF.bar("Ignotumite"); ItemStack enderforge = ComponentListMF.bar("Ender"); + ItemStack dwarfsteel = ComponentListMF.bar("Dwarfsteel"); KnowledgeListMF.reStone = MineFantasyAPI.addRatioAlloy(1, new ItemStack(BlockListMF.reinforced_stone, 4), 1, new Object[]{Blocks.stone, Blocks.stone, Blocks.stone, Blocks.stone, ComponentListMF.fireclay, iron, @@ -70,6 +71,9 @@ public static void init() { GameRegistry.addSmelting(BlockListMF.oreSulfur, new ItemStack(ComponentListMF.sulfur, 4), 0.25F); GameRegistry.addSmelting(BlockListMF.oreClay, new ItemStack(Items.clay_ball, 4), 0.25F); + BigFurnaceRecipes.addRecipe(BlockListMF.oreMithril, ComponentListMF.bar("Mithril"), 2); + GameRegistry.addSmelting(BlockListMF.oreMithril, ComponentListMF.bar("Mithril"), 2); + // ALLOY KnowledgeListMF.bronze = MineFantasyAPI.addRatioAlloy(3, ComponentListMF.bar("bronze", 3), new Object[]{copper, copper, tin}); @@ -113,6 +117,18 @@ public static void init() { KnowledgeListMF.enderforge = MineFantasyAPI.addRatioAlloy(2, enderforge, 3, new Object[]{adamant, mithril, Items.ender_pearl, Items.ender_pearl}); + + + //NEW + + //Dwarf + ItemStack lapisDye = new ItemStack(Items.dye, 1, 4); + KnowledgeListMF.dwarfsteel = MineFantasyAPI.addRatioAlloy(6, ComponentListMF.bar("dwarfsteel", 5), 1, + new Object[]{steel, steel, ComponentListMF.obsidian_rock, Items.coal, Items.coal, (new ItemStack(Items.dye, 1, 4))}); + //Emerald + KnowledgeListMF.emerald = MineFantasyAPI.addRatioAlloy(6, ComponentListMF.bar("emerald", 4), 1, + new Object[]{steel, steel, Items.emerald}); + MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.iron_prep, ComponentListMF.bar("PigIron")); MineFantasyAPI.addBlastFurnaceRecipe(ComponentListMF.ingots[6], black); diff --git a/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java b/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java index 965093c8..a48ef580 100644 --- a/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java +++ b/src/main/java/minefantasy/mf2/recipe/TempRecipesMF.java @@ -54,7 +54,6 @@ public static void init() { new Object[]{"GGG", "GGG", 'G', BlockListMF.framed_glass}); GameRegistry.addShapedRecipe(new ItemStack(BlockListMF.window_pane, 16), new Object[]{"GGG", "GGG", 'G', BlockListMF.window}); - } private static void assembleWoodVariations(CustomMaterial material) { diff --git a/src/main/resources/assets/minefantasy2/LogoMF2EdK.png b/src/main/resources/assets/minefantasy2/LogoMF2EdK.png new file mode 100644 index 0000000000000000000000000000000000000000..2388aa277954d13badbb5b5950b0354b127a9b91 GIT binary patch literal 1754 zcmV<01||84P)WFU8GbZ8()Nlj2>E@cM*00uruL_t(o!?l-RXdKrS z#(%TBtfDn5kczCJmqEhb)gMBFL9HMogN56a*z~EeAY^cNHlP;wB_wGO7DkpT2sL>z zN(C9VF6@ixL&4CrrpPXp0$ZO(IKGjr$O z^L^(#=bk%PGYmu6Z`XEr>CI;Of3|FIFQ0@$>OBMykH^X9^Xh|$9Ld;tcQ=>k=V5=m z<2V&#R##Wmb5Bo?!tgKy0Qr0#fMj%Cfjf><^{ODz)m0N5pt-qOJ?C;c-d?85X z2R~M}lYgHl+uOURK>46+x9{;~&QVHuO+;vKZ^w0A9LG^%>N5=b3qu}CBmVP|KDNF)NlXLg+ekH_Q6;O7eqTH^ndvF-=np!w?aX7cX9jX__)KGb5&Hiin75 znqr!!Jbd`j*JsrFeVr{$XrWMuQmI5HlQ~)?^tNBeanN<0wzf9)EtN`DfUm5q@aD}MCMG5-NO)!4Tl?i( zdwEq1RND)Ddp=b4d}L&VXf#S=V_Avg*+Kzn;TuV24b@25_ksu_-2|BQiJ%&LJud-jZtjSUis1Z{0?*tV_8 zY$A~WU~O&f&~Vfw;Qf5oiuu;o7LARKOifMUx-Rwg^&C5PjOFEJMn^|!X=wq#vaBPA zqap;}W>XGsS(Zwo#l=M$8yf*A6bfo?M@I+GpFii-t5^RMiNHbGEz4qdcGl1!pOifKyCt#W;mSwTDwB!T#!lLUs+uPe*xpIY@H*XRM z1Sk{=6bc1&U1wus1Avv4760BcGD0eq!Y~Y$mX@$A3)3|H1itR>R^YK%Ovzpz8pm;{ ztE*#lbd*FQ!SeDluIs8*Ff=p-Kr|Zlsio^WLqkKPQYm7wm?H6YcenCfL`3rWysGC1 zH=pv>-`_8jlam5SB9V|wmo5n))6>(^-{0?>lgs6NS2e5<;Pd>W`}fr;r`&t5rPFDW z$t07Llia&^k4PkfZQCT1Nv5Z#nVXxdIFxz^(`;|AQg>--@6TB?O;Z)-kM7@B6AnA3 w_xJa+wzft%93~o#a_7#SLyzTNQ}P4<1%z>&C{WwY-~a#s07*qoM6N<$f^bqtWdHyG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/lang/en_US.lang b/src/main/resources/assets/minefantasy2/lang/en_US.lang index 3b4ad0b3..c488afde 100644 --- a/src/main/resources/assets/minefantasy2/lang/en_US.lang +++ b/src/main/resources/assets/minefantasy2/lang/en_US.lang @@ -242,6 +242,49 @@ material.void.name=Void material.manasteel.name=Manasteel material.elvenelementium.name=Elementium material.terrasteel.name=Terrasteel + +NEW +material.damascussteel.name=Damascus Steel +material.atlarus.name=Atlarus +material.platinum.name=Platinum +material.angmallen.name=Angmallen +material.vulcanite.name=Vulcanite +material.orichalcum.name=Orichalcum +material.haderoth.name=Haderoth +material.tartarite.name=Tartarite +material.shadowiron.name=Shadow Iron +material.dwarfsteel.name=Dwarven Steel +material.emerald.name=Emerald +item.dwarvenforged_longsword.name=Dwarvenforged %1$s Longsword + +//NEW INGOTS +item.ingotDwarfSteel.name=Dwarven Steel Ingot +item.ingotEmerald.name=Emerald Ingot + + +NEW BLOCKS +tile.oreMithril.name=Mithril Ore + +NEW FUELS +item.dwarven_fuel.name=Dwarven Fuel + +TABS +itemGroup.MFdwarvenforged=[MF] DwarvenForged Style + +DESC +knownledge.claymore.info=Claymores are great for defense and counter attacks. + +NEW WEAPONS +item.standard_longsword.name=%1$s Longsword +item.standard_saber.name=%1$s Saber +item.standard_shortsword.name=%1$s Shortsword +item.standard_gladius.name=%1$s Gladius +item.standard_trident.name=%1$s Trident +item.standard_nodachi.name=%1$s Nodachi +item.standard_claymore.name=%1$s Claymore + + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /ITEM STATS/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/main/resources/assets/minefantasy2/textures/blocks/ores/desktop.ini b/src/main/resources/assets/minefantasy2/textures/blocks/ores/desktop.ini new file mode 100644 index 00000000..292ef1cd --- /dev/null +++ b/src/main/resources/assets/minefantasy2/textures/blocks/ores/desktop.ini @@ -0,0 +1,2 @@ +[LocalizedFileNames] +mithril_ore.png=@mithril_ore.png,0 diff --git a/src/main/resources/assets/minefantasy2/textures/blocks/ores/oreMithril.png b/src/main/resources/assets/minefantasy2/textures/blocks/ores/oreMithril.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2553c0601b39a87df0c6a628fe5acaa9bc31ff GIT binary patch literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@P5ZC(p`jV28{{H@q zjEt>ce|LQN$r=&Qz5g8Nl=-f4@&Et-f0O;G7O0pp$=lt9E91hKFd&CB-_5NUNEZMx z1H(m*-TXj`v%n(~D9CpZgc)~C%zg_JEGuwK2kHhgfp}B;oh~4&!_&nvgyTAI&ql68 z1`;jrw};6TN1eU($HJn`&QahOgVV*Gr58evoO27@^sV=7QNjIMnHIO%G7YQNUE%I} zJ8eG32O&^POAl^5%lm?+G)692>4lr5TZU9t2M&`qi(t`Q|Ei6yC4$wjF^ ziowXh&{)?1h%7=3jjfE$tW3>y4a}?z3?e!H>_O3xo1c=IR*9y;#K_73s=*=k|6HI3 xDUc1p`DrEPiAAXl0g0J;C3=3YAqr*2dZv1Y1_ob>76Mf9%uABfEp9}J~PX>gf zs47V^gg{kgo{7T+;pUtq1JwU&9>)6u#XUMxUWnVxCoNyOUXEx8RV05Ha& z>pD2+;JruNwrHB>%Q;s)-~F2m$yj>ox~>5HBoW3Kc<-wSAH4UY#%2~OauWZXERK>s*)%%Bp+!z>bkz=#$!udmre{Je8=s$9cD^X4LohZo@RBv24ZTlM`~AZ pfiVUE7(%Gd5by_*s{9=<6Tho`Mx_W9lUV=&002ovPDHLkV1iDXx)}ff literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/component/dwarven_fuel.png b/src/main/resources/assets/minefantasy2/textures/items/component/dwarven_fuel.png new file mode 100644 index 0000000000000000000000000000000000000000..4653e64e6055d0432a7c146a4206ff552056c710 GIT binary patch literal 498 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPdr=T!{C}Y6x1fY;?W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<3fz`z*h>Eak-ar){cLvLnBf!6&Q2CdH&j-GrsOM^RZp-cpe zu!k_`l1&>#{xl|OD~XkHiD|k#{Uf zMAc^){ARmX8tb<1^rcf){69q`kKYN^I&)^~4qY*Uz$1&F@4c(=z4hRVi*7E0w#8?& z1QKN0lO!gk`y|#)+!vIQz5l9X)at7jt{G)*skE|QxL!p1TG8X{8y|`ue)!?^^PldcEc58t?ba z_v?gy#5Fw43M^UQS{1wZUc;idmsyr2nmREQSiL)?8<1j@*{o%nwml?rDNmgK^P0ZJ z6AZHwtv)j_^grkR-ec}GmF51@3+&D%zZQqB&{$@*NbSY;FKn%zY1hhXG8O>+#o+1c K=d#Wzp$P!-L3qvp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/component/ingotEmerald.png b/src/main/resources/assets/minefantasy2/textures/items/component/ingotEmerald.png new file mode 100644 index 0000000000000000000000000000000000000000..1ea74c0969b3a5e85becbef091969e6398df59ab GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPdr!bGDz@fA6fa(~fJzX3_EKXmYq?mEoLB!$yL4`#D z9bOt|)VHmhI!?3(@z<`20QQrqlVB pAF`JoUnq3^{M>e{bA5I#vmAG3nOB}1KQQDNJYD@<);T3K0RWmyqmcjr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/component/ingotMithril.png b/src/main/resources/assets/minefantasy2/textures/items/component/ingotMithril.png index 8ed39f68eedcd3fbfa67f8530b18830a97660d2f..a6777189f14db2ee9337f2b0eb463a13bcd32764 100644 GIT binary patch delta 308 zcmV-40n7f30?z`FB!32COGiWiX8^ANwYz>zd;kCd32;bRa{vGf6951U69E94oEQKA z00(qQO+^Rd2L%xx6}H|kcmMzZ+(|@1R5;6HU>GvM#l_{ni;K&Dba56!nqX|zq;web z|DHX27;zeatZDb|-3$y23=GES?=qZ(ikU+Uf*ZnuP1A`N|9{~c(ZNX#Lli?8U0huL z!)$_S%zl0ktCupBWKj6CTx}sPIPu~?!xhe74AY-K!K>-SrOOOB15uHKl_66}hGF`> zCxkVs`ZOa8G&=s9 zmsK;oKYoOP-!06Npe76#AR9uACS<^fo`^nv{76vK-~s?KZfw=Gx&v$g0000CXkxzJvYJl zTKkRv0aAhg84~1^Ahurn2sZ?qrmJn&|6ggo2FBZLc7m~=lxhEehD3$r{~xY=1mnl+ zpZq@>c>={2n8wZ4+feW%gQ*Auj)tEAV~_y{eUARW+;|Oc8#YZa437n5Lk@Tx#;^^m qCUgKZ1Y`hCn+O4rAtY-WZ~y@2V0X?nh>p?#0000peHY_*(mo{{d2g{}~eGlOVQU`v^A#o2IL6 z*Z*H>z6QqIY<7aNpOpW9hD3$r{~xY=1mnl+pZq@>c>={2n8wZ4+feW%gQ*Auj)tEA zV~_y{eUARW+;|Oc8#YZa437n5Lk@Tx#;^^mCUgKZ1Y`hCn+O4rAtY-WZ~y@2V0X?n Sh>p?#0000G4B~TSId`^wAPX!h=@W6T-(IV*Doo@FDU}^ zuUW5odK{Ed2gNLr~P^R Y2C6df8X|;Nc>n+a07*qoM6N<$g0Y6JvH$=8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/dwarvenforged/dwarvenforged_longsword_detail.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/dwarvenforged/dwarvenforged_longsword_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd29cdc60af8094e2303ca347179209f0980cb1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ0#6smkcv6U2@Hv|36=_ zh5gE>K=vN1ge#27ml;n?yL^}N#Wem1k)9?-cIJ6(Zn6d|WEc*Aw%PhmzT5Dx|GK(K zrzB#gwXf*Dcps=*SXwotm|@q`l41s)1<`)x>!lvI6;>1s;*b3=BdgAk26#O}+vsC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QB zXPVk-lnPWc)zif>B*Oje6i2QG2Oj3@|Lv=K0}fte(YoQffw_2sh_HZ+ukg&`y!LN9 zrfuHC{-r_g!+FN*pPn)&{rtpuR{cP^e>9VJ(6j?xQ&cx7rE;$ESm{vqd%nTjJIxAf znIv_4ZtY}ujAAv4lGs|z-?W7*Ws5=9b2*kw(GwYoSI*gTT+*6w@z9F7)dDsX_gSnC htrA$0doQ_1R>kvXAS@W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/gladius.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/gladius.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc4d7f33d872cde5863aa4c9234db5d31985742 GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7lr^3Jl4+r0Vu**;1OBO zz`!jG!i)^F=12eq*-JcqUD+RT^7E^i#z-ZZ0EJ{TLn2C?^K)}k^GbkR1_tM%)Wnk1 z6ovB4k_-iRPv3wPy;ODv21ZU#7srr@!*8b_xLn$3KA_dY+n7S-~+GrYw6|{C>`2oAWDI zX=!ye9V=Y2EVJ(K+~=m86+brV_)pxHYkoMKyJCm`q3)E(Z9nbfe9ew*FgsFZz!-_TcE$Z%fb}Y->W%PNG zn!usMC$9^5^cdEptQHnLxRB|XMBn3UUG{St*B}4b-%*pTR>1y8FpM+&&XQ74XnDH& KxvXUxI-fEM``?)naBdfu9uUI}s7rstQxWdj1kyC7hWrhMyHc#8Mzf!Z5RK+xE+~@IirG zbckpWQJGnbTKGBz{9GFXB0?%UC?!g`h`jxtp9-L(RyI}cI>GO*h3_iOLH zjWPbn5+Y)V=ut!t`O@ya2BF62UBpG&{2S^&r`1tA2p aw7_4zW~0Iee!c<#0000<>&pI!Q&^CVo!73=8z{8W)5S3);&5_;1nXi3-ar5U&;R)U z|NovZoBBEL7FAWx$XwuDbA@p+pF}CcWrt~u1?)Uio-R%ZU~r3>DyXdd`2WSCgaC_# zdCRZ;XDnnWs!lvI6;>1s;*b3=BdgAk26#O}+vsC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QB zXPVk-lnPWc)zif>B*Oje6i2QG2Oj3@|Lv=K0}fte(YoQffw_2sh_HZ+ukg&`y!LN9 zrfuHC{-r_g!+FN*pPn)&{rtpuR{cP^e>9VJ(6j?xQ&cx7rE;$ESm{vqd%nTjJIxAf znIv_4ZtY}ujAAv4lGs|z-?W7*Ws5=9b2*kw(GwYoSI*gTT+*6w@z9F7)dDsX_gSnC htrA$0doQ_1R>kvXAS@W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_gladius.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_gladius.png new file mode 100644 index 0000000000000000000000000000000000000000..096ee526a1ddc62185606c6b20ad87a355fe9d8b GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPdC%=GMMlYdIDWDW#@HBJkFe@#&dWB_o~O!C7mXyES<7t-Rh!VwS%%Z-mR@vTyc<}RobTS zv2TU=6DG^GqSI2WeJ*+In`Dzyz_E}kp4-l|E5$g5%V*NW5DrI`@*fv-V`3iJoM&@5 zXZfX;pF#gDlX0--$+!Fr_e~w2@3pUb@1JVC^a`T|(~r!V4^CUMGn{&$_VeuIP*zz6 kozqMV`QiCte|0R+^@y0xf55Y6CeX(Wp00i_>zopr0FzCA%>V!Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_gladius_detail.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_gladius_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..df69932b8776bab64941ec20b780ce08d25ae389 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`CY~;iAr*6y6C_v&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM z&os5wC>5y2#?!?y#KJ#Wg7q-lpa1{o3!YMuZ7>Nw%plM!D$L^G>U@_$;J`A$woaxS rCWj0>8CEdLEIlEi)yiyOz`!tL;==5oMW1c}&0+9#^>bP0l+XkK+2A>A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_longsword.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_longsword.png new file mode 100644 index 0000000000000000000000000000000000000000..abf34b32ff4dc6c149168424eaa82281821ac461 GIT binary patch literal 448 zcmV;x0YCnUP)c5vfo**d&uFLemT6^1f&Ou}bK~f4Vq)S!PeIf7MP#u)2ggYkyhV6>n$|N8p zMO8_X-g~Ml(kxsp@IwT0;Ijf}!6yaIgl~G&mV|E> zP}Pg7UQ)QKX2bUg$S@2ad*NCCg1W9**EQ4FuaR0X{nCCI_2EsK`zF?YAEQ z7z2P&B1|^p+*FlQIRnXiOrU9+?{x4uMZkOi8GGWep)~fu!y_m;tSdhe?<1fC$JpYf~yeEk6SnoN%nVM{gu0000<>&pI!Q-s&Va^;aI8=z3Xr;B4q#Np%w307rU10w?igFpZO z&lg6eT%*sQo_xCKAdkYHV$Ao5_fGTW|s61;W0SnMx5Y!~GSJO0^b z>p%H!!@u?ld^6rJ{p;^MWA?)LUz~p}XPj}~`O49MhcB_1`3SQ=*gWSMXX(7zopr0G7R000000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_longsword_haft.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_longsword_haft.png new file mode 100644 index 0000000000000000000000000000000000000000..06c5d4e622c3f496dadbff7e0c46499d2f7f62a3 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=BdgAk26#O}+vsC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QB zXPVk-lnPWc)zif>B*Oje6i2QG2Oj3@|Lv=K0}fte(YoQffw_2sh_HZ+ukg&`y!LN9 zrfuHC{-r_g!+FN*pPn)&{rtpuR{cP^e>9VJ(6j?xQ&cx7rE;$ESm{vqd%nTjJIxAf znIv_4ZtY}ujAAv4lGs|z-?W7*Ws5=9b2*kw(GwYoSI*gTT+*6w@z9F7)dDsX_gSnC htrA$0doQ_1R>kvXAS@W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_nodachi.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_nodachi.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d816aa190c8e4e1d83e6ef2a764c41c2689055 GIT binary patch literal 393 zcmV;40e1e0P)S1JTO zk|HSzIP~oz05CIJ-9Th1Kq3-9XA7Q6B4U$IkalExx?|rfkM{D5uE6L1ORTV-AP*uVnVrH9P z&!g7-Rs>!d-QJxiUVbo$$Z`!aQ>d%9ZLhJa$UeX_GsV`~{{@RocL1QOMY^1u!|S>R nfWK1kXWgb?<>&pI!Q%F=@@r|V38=z3Dr;B4q#Np%w307rU10w?igFpZO z&lg6eT%*sQo_xCKAdkYHV$Ao5_fGTW|s61;W0SnMx5Y!~GSJO0^b z>p%V(%+IPb|6dk(mc|h%{@ee%iNX2c*Z((4T>h{4D(Qb>CX@8CPUa7hexF;sPCPf^ ntx7q~zJ^C4;I#We2L=YWJ$Y85*AA-#9mL@2>gTe~DWM4fBOg?E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_nodachi_haft.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_nodachi_haft.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1653d27e29b7386dc3544d84336c4470be5007 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=BdgAk26#O}+vsC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QB zXPVk-lnPW6;}1!|ZTcjm?$dY=*6d_;#tYIF66urJHD TaR1r~G@ZfI)z4*}Q$iB}=`Tig literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_saber.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_saber.png new file mode 100644 index 0000000000000000000000000000000000000000..95a9f72365f234734e008cfef4a86afd8bc93f3a GIT binary patch literal 489 zcmVEZFs!B$6$ZKX(;*G>&~2?worX-WOo{y<9}td#{JX;Z8)AwU(^4Uv1k`UDtFx z9_ezq(CKvA)pc#Uef{CDc8-b2Pjn)(7ZC-Z=^D$y&wj>_z$_vHv|36=_ zh5gE>K=vN1ge#27ml;n?yL^}N#Wem1k)9?-cIJ6(Zn6d|WEc*Aw%PhmzT5Dx|GK(K zrzB#gwXf*Dcps=*SXwotm|@q`l41s)1<`)x>!lvI6;>1s;*b3=BdgAk26#O}+vsC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QB zXPVk-lnPWc)zif>B*Oje6i2QG2Oj3@|Lv=K0}fte(YoQffw_2sh_HZ+ukg&`y!LN9 zrfuHC{-r_g!+FN*pPn)&{rtpuR{cP^e>9VJ(6j?xQ&cx7rE;$ESm{vqd%nTjJIxAf znIv_4ZtY}ujAAv4lGs|z-?W7*Ws5=9b2*kw(GwYoSI*gTT+*6w@z9F7)dDsX_gSnC htrA$0doQ_1R>kvXAS@W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_shortsword.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_shortsword.png index 52ae98c482cd6f38cd9ac627720f33b97f093602..a47e39b5d413eb2db2c20c6a9dfdda21d8d9bb6a 100644 GIT binary patch delta 297 zcmV+^0oMMs0mK53B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Rd2@eT65cTAjoB#j-(Md!>R5;6}lhJL&AP_`nIrl;n<4TtDa3#UgRU{31YdAt{n! z_~QyBlgkZ+FbqV;X#3!pCQK!c#DUi6#A$*9 z2O44aLLyenlCUHB;7ISq%13Y$l5({kW86^-Nx3RBV~&}z!+(Rs825Reky66r3G&YF z&UIaR^wK2w1vd%q;Hsbo7s1_Wo7qp8q!d_HnX4845=_%XRc(ep1X*HcRMi64uKRUv zQc41VAq0%$*z~xHKty>As1hp?a$)}}ShqdI0+#Wf6tqMUS%ox@X z7E4v*s6<3jS1{JG0B|YgT;SnatG<1t1T&Zttl+I+2Y-T9V7AZTCcq)3q$n2d1Ucs> zVBwzt5(8`pJPm2|UDo?atZ0G1^OI}^qnCWBl)#18hr~{BD;9VFDK4=c@8Ajl00000 LNkvXXu0mjf_l-mP diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_trident.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_trident.png new file mode 100644 index 0000000000000000000000000000000000000000..36ede6e1316431a99a8b2a7a0f135db289a67245 GIT binary patch literal 720 zcmV;>0x$iEP)0$oW& zK~!ko?O8Fdn?MkKOPnG}ktoV9mJ87QBftgV5|)Nj_y9fyNL<2PV10x%6u2}}(nR@H zq{Nekwf1B1w;cmZK2yQ2w9K1%GdnW?6Bp6v;mrK(d?5tub^Sa^X#z8ah?s~j2Iq|8 z_73Y45igg^tIl$4@rqX7b=~PviilV##bsGuMW4~*fSE;8dA+Xpu8j$+lxJpEO4$d1 zh&T+x6Xol@x2Ezh(MpT~APhs6QlhFVNGWwPc?aMZfZwat3j6&YuIpmGUL#2o$EtgS znMD|etUY1UrYy@=TA6o*>5;`)Ao4sH+7nR}9i)_KS{}eBlXiMP%Q8DIGAX5_X;f8J zQ~A#TegZ%o#|KmSG)=|WK`a2EEX()I%qE>QZHVYilU8lPEJg(J0N@({BuRoOijJPx zY&K3D#{$5gmn<)a4BX~g5CjJR@I3DXgc%d(Xfs+Z6a>M+^StBxZnu+po{MHoWLbtJ zNt{trCNm4)_doi+&-F7C5$ks%dNe)MmSVfkUkpf_AD-tOEngG`lu`}=q-pxqq_de~ zt?J0ylt0%WTq3=CphYnOfVC$~5Vy+U!J(9LilTUS%UaviUz$#>rO>Ut@!%9P8<9Fq ze(`;Okn(rY2PFV}uP-UyZnxszR=+EN4uu2&wrT2dGp+jm&U7s_1DFBK@=9c=bT|j` zR4jhBl<1fod;st?<_P9rYoRAynBA)l>;*s00X&$08Ex@^=mId6-=M8oNKecr z7sTeMugQ5^J#!M2ZF8GRQK%kyOh&{IqmNnsXZZ_FYxUQVQFv7V0000B#)|d++W$p_1J) z`<^{y_)u#1T;@vkR~gl`1QtgDFtTt@mzv+naHW(t_Bw04@@3s4-V+b{ahUNq*PQd7 z=y-pMf-Bp$M{cnXf>H|X!-YS-5UalH8$09d&kKwn1Rklk=T$tPtW$PC;I`P$8|JAt zj4$pxL_c}F)M~@+&$9PdEGU=0B700HLN%^bI^1!wSbnix7emdt#ry}J)r7ES7t3vZ zVQJZK*AQ>nU&K1+c5VR61L0(=epTlk**XQhDX)wp>XvxdJPJLR{H|wZzNDq>_cy;P z{^o|nP5Hmhw@YuuhPTWa*$j6d?fnv`@#?>sfc7WGOCKlu%&NRG6%^8*u6{1-oD!M< Dvni#i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_trident_haft.png b/src/main/resources/assets/minefantasy2/textures/items/custom/weapon/standard/standard_trident_haft.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1653d27e29b7386dc3544d84336c4470be5007 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=BdgAk26#O}+vsC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QB zXPVk-lnPW6;}1!|ZTcjm?$dY=*6d_;#tYIF66urJHD TaR1r~G@ZfI)z4*}Q$iB}=`Tig literal 0 HcmV?d00001 diff --git a/src/main/resources/desktop.ini b/src/main/resources/desktop.ini new file mode 100644 index 00000000..98c8a004 --- /dev/null +++ b/src/main/resources/desktop.ini @@ -0,0 +1,2 @@ +[LocalizedFileNames] +LogoMF2EdK.png=@LogoMF2EdK.png,0 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index e8b57f83..e69aa025 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,16 +1,15 @@ [ { - "modid":"MineFantasy2", - "name":"Mine FantasyII", - "description":"NOTE: This is an incomplete mod, crafting has not been implemented. Make sure to have a recipe guide installed. Not all items are obtainable or balanced", - "version":"${version}", + "modid":"minefantasy2", + "name":"FantasyCraft II EbK", + "description":"GET READY FOR GREATEST ADVENTURE OF ALL THE TIME", + "version":"", "mcversion":"${mcversion}", "url":"", "updateUrl":"", - "authors":[ - "Anonymous" + "authors":["Kacpros"] ], - "credits":"-", + "credits":"Kacpros", "logoFile":"", "screenshots":[

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%0AS21uS?*<%%0dc99Fw~*1d^eZ}OT-cl)Fj^b)X7 z*J1@b=$>m)QTqY~dI`v;?E=cu0+5;C%nqj}*JE3sQq{kN{$$O|j~fPNcR_Vc!c_XD z;ovy()$UDb%dIpJ2*VAtDbval@hmO2ozt+bY;d95Y$JaQ=O@6{VTh+6Nw09tbawjP zI+ket(D=%S+o@}N-Z2za)B26i{HH50{Rd@PI1ayInI8%>36P++e>H2Vv!u#}{4%)!i~O2wiy8pT>%Y#4G4mdRB`4`G8JM`3j?63y&@g(Mk< zy7jmJ7$}GdV5Hsx&g%kjUjLyDC2MNvX6h^o*dFcqx5^><@A62F;@~fG!WLS2@^Mz- zww3gh0=gPDg2~6zj^fqf)-o+9;qFF4FN$Pw9$)aG9nE>AHZjyVKioeLodOvJ6*akw3k>xOZ3A4N#R$ zmlOsF`C%I*_bV(=DUjk}YZ8(=_z}!_{iX-D2VfM*%Q7|$+uZTML`cS;$UG-UU^{pS zeJGB^iY?kC0$Lm=BLmxs&Mx%@>9yxOF%i*jojIbCnOqR1*6imk(Qi}Z+w`q(fY+}A zHMb3*ScGaN7M)eEKuhO`J4trSD) zy=JIT_(V)3brp1oZw+6MasB-I8~j3+eXHnakh~)po7SpEF`7fEP3bv0p?d2aF_Sot zdvY0ta~}IU^u?aebka~tlH)iynMf^=wUvhgQu@F&8K$<{ibaVo5YrK1NoOu+TXf9) zni}D-`Ef2frxzN$NcrMi_Ke%X^bl?3q+ML&lT`lsMiQyX5CZ1awBj4^hmD~@_$~-k z-RD2-AQkagspbHHBM&f*`VTB~d3zVrKNe5@{pP4_{ZVs%UM@FRoe6?R5r_Z@opT!m z^kD4>5eqYa4J3+hwPXFN&fe%o`l-MlCN0T&GY9b-poeL7JsY<2`PqKazV$Nwl+hkV(D>zXHyV8?UGAO&AsJxjb<&1cw{s$h!k_MOP}mldw^QGSDN>!Y?gTII`d6=%{|5{~Ku z7i%WFA3{QcyH(=F&{@mJXVzn~@i&iemv7QxtOKG+Dj`W1cCNU?54@g>IukHtWFKKN z$sbaTMGCa`9IPu+d<0yY!F6v&Z6upz2A!6znby*=dArc_5ILIF7wK1lj+B@Bw~Ad? zF3O9(rM}u`KhW-fFa%};=j2bcD7prKl&&Hcd(B#~RW7&C!IxWa(_BqDD-S?QV~51g z#SQ0$5N*uH1q?HO)E;))1sm@8$)_071Cz_M_3GGTWR(ka>g<0^5di#8yGTdrNMGZ< zUS*9pVl~DRG{#7)sdvN~r5&SwO;a+=ahsvm^hQ0C84b^q?GE3P6~QQ`6sL&=1X7xX z5y~X(i82WxG5P>|Wr7YapgM`pEx+mq!COLLZ!dv0nie6D)(r9T@{QunG8#bptv3!fZ5p&8;v3h-Cv!HA)`{?}gH- zJk=+2R3Guh4wOrvk=_X;_`45T9i6Xu!ODZ)Xfx_8S^Z*7HabtX7J7xR9EYc7o%4QY z9B5Iu$Tx4W0~llsJ}?o~Na5bDe<1OfBtkEAKt}xl1jc``9Z%GW zCbWDDc0YWp3WC*&MnzCtCki9BE5qi&MWjFmv5{{UT68DI8^|tFdi`z#%YsBv{Jsl} zdzg1Lxmt!>dR?7Qavkv>+P%Ha#Oi-RkBcOXDm4tcj>QKbWq?Vuc)H|L-ri%+ZMipEmwoSbR%gJT1uIflwQf3KWbotO!QzBMJlk-e zAmbu!TFOg13yI7iy+vp(kN`UOo`lc##EnhY<+MciAYh`zmYW9l%&Jv#tRneoLDP=q zW5}Db#0|4Zr`m`S7M1ea>@Lq_aqEOE(#7<%8!fa_; zF|uM9d#gB0WIBgP$r$r8l~p9|>$+VaXW^`sNShTW#(JUEX~lFfS7zU#`Z1EFdxiK6|6tT^)1D~oFUhP_#dc=87d>|6FzPII$Eyt% zI7;0Xat00VAkrr{h$@=@b*~nB1|X?i_|1U;o9O%92vKM9;JaO-77ORniCvEVirT{J zYg#qig><2>DePExt)vx1;=Nm_kgtCbk{;Oy;gysxnw6_njw*lLGwbYJCaJ+(J6#? zM*47nKOnW6^f(;7NH-=w&Q4Xy2xOp(AWolkA(?v3!$* z?Pgr%ggUkvw% z$r-5o4NZCih-)Jth`OE@44&6C$Z>zS&!9kJ8tDBQW{O`8eHM>=4LbB0C%0vjK&kkgxd%WK2=tCn?6zV-=tOix9&4fkyRXykfyrgt_!gn+O#ykRr0=vRtbjS4^|WnJuwtyX)=& zQn~C)xu*fP?u=WM#34UWBHE9g482x4S?Pfv6C!BOOplcABb1LAU<7+Hdz91Kp*l4dy`_n z_7nLD4}n+oi}<-!wGE6of6skVg$jHU+;$CK#P?gnP0&1E&Dzla?$k~?@s??EISBz8 zh)yPaN;t0$Hf%k9Q67)2g*dC!oLZMegLw` zFEwkw1l5(rqH?R4KW#Z%2FbKHWB0j9Z9{~Ec@`hQNn5$5uCW+35+1NlBb|EPt;)yL#x`RF>;hcCt}#*?FpXM(^TgL2Mgv3tt*j5dKl38tBDd|$??>3YmBQi7Fz-{f z>Ot?Kc&ke79Q94nrJgauvL^LYdyh8tJ;CT6&v0%(H7VXLA)K*RW*xU$%9yK%`h$M% z7jVtoD|hv0fN;J4kJk$n$PYCHl2;=HCSU0jp}EEz{M}cUGHvBkC}h5<(|Y^_uauH< z3>Ck8S#Vlmx}MYuL}PzMi>3aNZ%4+!&vB#5s@)Rd#vnR1U`qTSnr zbYO=4h7G0HN1>=hI-t}RWT{Iy#Aih-??X^2R8{;v?3QKTkc=CIH;GUh+1mW4X8XcO z1kgDV+ej%Tc+Ltb3gHLr+ACv6 z)}rHTx|(qjknkKT`@UVtG&e}F9m_nup?eYt7H-Mx?sl2wY<`%t`T6?sLGk^Lvc%Ac zIT&BIzJ1y(V+xL)V|Bxb#n^y78r2RbjfK&EJ4WzHW?kE%PbBuTyEU*Vz7- zhg2)ob-MNLff>cGFnZjJF9%bph!0);p8*W|>)rc}hyB;MN7wr+WhVah*{tLS-En<7 z&N=Bec0a-&*&CNYkAc^KE{GW^yUJV`=X20&gFq%fA6>&A7_}=QzAP zWy|74*(JRB))npHUL>fgL>wwk_p);%YV|z4|cI>zDMrCwy>M1-$vv%3O&&wTu8Q zOGK+;&Dph~y{|K@3|iihxqXHW62~We7dTBhP4a$$b@FVprrDN+hHzGJ7Rv?={zYtg z9C_N|;86+@*OaSBE{S-e2^I^Y8!|;8qCBEaBb0lfAtw;1!d?;4U&i;CgKou{#BI(U zVW18iQ8I4ZqKj_Zkg^#^!r5qf6lk1Dt80&6+Z2;(0yJIgu*gLr7UHP7v9gXqb0fiy z42Hfp%U_GqKBLNyd{4~YUa#L~!HfkuBjE0JH}3PyiUz{T-iD~(cD}F03@D|_ypn1S zS!0b;n;QwDq6zshTprdvYZHXt31rv>Fq-hu3Vg-gk3iA2PiKi!Q0eUrSgcCJ(dd4f z7md)gVVlNONK2jz#ChGqoiH4KE&?5sc*~(N-uwq3f%)%))Wy=p^S>GV_0X>BIs({t z9smr%`yYN!1kloTadk3Pb}$62H~9makpB6tlBuEd|8f2+PS$ouQAHj3y-+emDz|=; zjUM--Nv!MuzIs-tZ7R(C(r<>}&W~ALGwIps`k(JN^xrq1NrS#@FiLac4Bilq z8{!Tl%ZLqsO(UnlRZMnFYNs_0@{|`(^3)TL@)Q!!dP#@^y(@rCerbS>eu;>JI;>j2elNMIT{2RXCaCym!6=tktsO^ri@0nQ|*()HQ<>Eu|@K<&Kn;*(4=4<3-t_ zr6Q{$x^ermPP=d8vc)fLBv4ZsyRIK}%1zh`kz!}N>8SP{eNmMi>C+L5 z*h^J6KC-1O#l1!8Oq80wyvD_HYr=6>(Pl2#&~{Ve4^h(L2zY)`-mNwml|H{iz25MR z(*-+S=JQdOU}}t2FwC=^)=F?BR3jdyl#%a$sd7wLB*9$1f88oHw^@>Lc4M+mg~=M7 zL3g+i3q8Ug73IOBZwnqrvdRlZEqE|JIUPR%&K4b|p8P?~^Y{;m-NRydXGsQ9mD+Tu$HuF+I z`1H2jXsnpT;_5=%we#>ifJHsu`1JShx8yqehfOqv*8I?i%?~ozXxRC?TgEP2FY%5S zhcCN|xg`9B{Kouy{3!ea2g=!f*!`?IKPruS=%6&IycK^79avT@K=`xAc++-q>pgZNFzsmG zQEL#D(AZxERmnM+y? z6VyUY)u1cn$_a!URI9jV_&Iuw1Qb-OTAQo1M%zO_Up^~jt593Cv}l`LzpWZ}@H+8^ zTCr4{Z9iW*D@?0yo1Pd_jY8YEVzD;7e!k)+=vL)6UFl2*kbb`ECKwLN4ZC8IHopD~ zRqo(*ij8l@GHoFJcq+?~?vf|nBHhb{6h`#hb7u_dNBMK(OWqbOPC^KDYVwb>W(TO) zr-ZW_82;ctpokExp%yjHpy2S?5sC5Hk+At}h*&*;id#I^W#@SulQen!6tZ}zOPoD4 z{62eW7&p6Ph>*W9z%QH{3KGPI53kuuxcOe{h%qbT1suKD!nf$PUT*zp6#uQCVLrA> zngxUE5P5o!xn`T1e~8T|{H#rA>vEUnJ!0ktr@Qy+8QO2#n(DiKk=jNa`>wVn#<#c- zM~RHynR!@O>*}p+^RK8ngDeF%C&9w2Arc+G|FOy#V6((D0l;ZWfK<--|0$LKr7kK~ zwN*!v!0ZwcX1573umvJ9P!`G*mC=%3f-au@ZiJ)nK~?>@fGn;9hckT%9_!b)wHvyo zW_!VfFYqMsaG$>F*rY9YeCAwQ$S3 z!(?)$IjyGLcJEQ~%c-?8^8y0Fric15Xiq&gaH!+rg#~rJE-S<$f)3m*)T4{?s`$gA z!{)bQ^C9$v{SVwv&WnZ8;0`Kbay$WUj~vZTG|1I zd3HRz;@;-UZD-47iDoe?+HjTahV3mrD~XoBbL2|0{34@NBJz2Wf*9~sp$GPgoD!ig z9nR@i}O0~Pk-e?tzXFhHx%3 z%5P;1bR9hdE92@LWfdJG_H!;uI zazSW{gP6IQDv3+J=n+$r*-^_b!Ae+?`xfCdDs1OuXNF$tqul(Xa^UEBzSM_G!vcjef4gwj|d3@O8)gUzqGrp5+c@>o}r&=bgrPF9XT*h-3V z=MvzWXEhg}Eu%STX5wF9z(ukEUM2=1u=+azzv5y7jz&MjyE(tn3kfB(V>nXvZRBun zIu*3*?=^rcSUJ3Mq&c2HK(bfY`=&wF7g`kunj)Q#*Ml|qy5)*C(B+sB3K^kq#i0Os z=v>e=KW&X}egpdCnJlfh8KKM{VP*Yl$_}Ck<9OW^~9O3ZnK@F(O2xW%8r@6VGX`nRc$Hl`DGzpvgTkSm=g7 zS_Q<#yX7IAhe1pQm`juvki(6X!@)CR@u=VQhMYq*iaYByYf~z5VAsy3B`(pb^CqzF z8_tj&s_atTvCwJoYE4-KK77|Xo`KxQI=V0Xm?Q9y2-+x|Wr*WG)k}I2nPeU~nyCY+ z1(sJ%Xu7)8R;klrWqyF9^3`PtLVBlpS3AxhTPEYdIeejEezWdrZ!l`pmy~NseVb4=wUwPJf zN8KtzX$gE7YILmI!21QJU@|;+M}-keWbWZ$DdIjv0RaS&wi6c}rKCxdnMp0{^P3Wd zipJlYxrRIEQWFmhIxRp)XsBw=E`_@;c*#pp`RIfKzn-LaM#zWiA;FE>{4)*G2wieJ zJ(}=;V!&n--lroDkgkSB*&_QvFZh1L7rCuX`D)fp>;o)z9XfquAHSra*%r;iEI%Tt zrZP$-%8)lbDNjJ+uNT}RCHZBZX{u~1v z*WG`Zv6c?fCK3Z)G*dw5;olOQ0APE!;$Z@*;=vVuX zkGrQ4hA)jj)$(^7gF?X2bTv>LDU39b2O0uOciV}-&Y)IRe624r&=peaa|XkKJ*~Wj zYHjdp?#F7fT__Ths#Wm_Ch{rEgdnq^qVxHn-*}83E4t~*mI>Q!Wd1JVHbG^-ZDIl+ReAcHgguM_1 z4$=6L3G_CbS5d+fE1^jZW}axcoj{A_#zWtq%p8TCT-9mpIrb@W5%0iPV$X8x=(^@JgS6|QRz2S~O59OBZHoe({PlvO236}vfD=#T#V=io zFuV{Ug&z6a{zIqy{YOgG7^|Yoq)Ih^d+Y+dSFQ7@&V^W4xQ{UFw!pMBTdU&%TR09! znE@CZropvkWf2BD3rS+JX?htk$QdS5o*JC4go`@)2KoxNigk)<7{(_746=+e-+0p_ z$JX`N^*u&u{Q>$}JYvCB<@{siQxwx;^V+g{9p$AHEHWJda0}d`CGF>M5R3BrdoB&D zQ`m0haQuS$OnD)0BBh9gX~t?Lczkyz;L%meVM)13QPAA1@U(AORF~pjaumXJ8Pd4} z48UL+AVY|x0n&$}c}Ng?FsRjF5z?LnQzJ|}5>>SBfr8OI47o#fivu6 zq_URqBHyqjUU`!iR3tr`7=OrIICl~0j1*f1!B8@%~@=(^8fLx zQT!p@w*DC}{*X}@AAP_hj4Ks46+;m38s#+8Srp*SvxZuoNf=vn&Ra9VQ}mlL;aoHN z;~(#Y`>s}IJ%AH30th+g{{SHWMdAT;1gu5v?VbMC;7eBe%WFi0Ultc+r_v`$SXxM0 z7*$3mFb)zFYRMrl?2TME*fxN!UB2j(Mi7z|UUlZ3a#3?VuZdaonehjU{jbc`8(x0C zcksICDO~h=lm1>OcugPHI-}c{vEB-QHeol3cIuyGi!w1s?&oSf>#F{An}T3HHWF}2 z>y{z%zL@q8oo*|37TOHCDD!W>+@;c-l4ulOQ|V4}!_{I*SYlStyPS7uE=KxX9P+;* zTm4qSb(lKpP#g+j5PRyqdoLM2-LL^gi750U+XvZkH$iNX)bOeH6pm@ksK4|o=hgBg zV>$t2@A35Qp+iXicA_*dV<#CS#e{r$LBYMsT%9=RCXD>FqOV=vy+GyNeI_~zWn zM(!~teg`tH)<)G{u-rRJw~;4=S36PRI!X@J;HDb0*a$c=UnQp=80KW1)r>RqzRLK- zmYmbu2+Oi7x@;NI}Dy}J2nEp@VXYs(Kf zt=9-yYD2C7>?xx?Gv%>5&v?j>_9vRXIAP04Qp6A7&1OMY^ZjBnQa#qqf&<7fIR7wp@-ZjG{Oa=7>wh^)>~BeO<$-NJbR42fI<9Z z1PR+sx@fe;A~ukZJ=l4e50Xu#BUmYT<>^K0sbp}zMJ{b{>?8c$3KmagBloD=nVhUO zL}>Ik7*83+ zxW(H`PkRKcdk2Cj!|Rvkv!lqbJXp*HZp<2}Aka*s4Dy3)HO$9f5${RrnQE|npD~eq z_aPPeyg=m$0084^HU?23KE4FTAT0<<8r!stDTL8OpvFY*rKX~RImuObY+S|E6j;-V zqB1WSy3;?iNhz;S)hp~|3-LoI8CgAbf!byq0@M)9jtED1nSUwXTx5(3eT8BMi4JY# z0TxDSE6UReJtW?m6{TO(Iz7h%tT#@-+47vPEKtL+brey!arxeHfOuZY5c ziGV088HNEz!C-6Y0Jc_SBlWDFVIj-=4DzlxyxOA3xoE-8!^87-IJLg|@$BOb;SkZq ztMqfs5bOu_I5jma*LtQ#p9&|xNc+)?$N;oB2|cX!`6@{vnQbDGbDu6fJ=XM@RNheA z9yI--IE7Berg$#V(jz#4UpAt9#GR%Q<7cg99AR_MyN>%LmpkE$D;w_3Z_24noQ-tB z?8<|@l@W@}jXbNL!qjg{`d2N|I#2;r0rK>DX^Pys!DS7Qr6`u-oVZ+^SPWG)K5Qf_4@6;&RtnPGHRs zYym+(k2koCca=CB7;K!z2;eF39Uow&{CzgDllDF$NKx1x?ktI>(r!2zR*Q_fT0q3} zogS%JP1uSKcyJL`o5rWQ z+G~}T&vs3;QC=G&H9ajF^icGCa%K_S!y3E)eaUQ((pON7Z{G>XTvST|Yl5ptQ>>|2b@dsLTpIXyP7_a4}{m3Cx91&BNA z99|6+na~hCJStigtKV0d2Jci#V3yvA&5~=m4cw7k|5FQ``d$5YjD(=U*I*V_OQnH z+`~DWQKin9h~mksB&wqS!5Zn0KCuu191=L7{{2slv41^le?`~d4k%jbU!=vgk5lT& z^6zy-oU=9C(4_pBkPIjT3Beds$WP0za4OQ7O?ctI6A=oK0Vduc?}brEzn1IuW%U6y z#KxWP5zo;t0B7+xXk92D7?*{oiQ=C4kr_>-EtqBJXhBYJ{1Cjz<>b9r4PFpzC7l2# zTgS(pGX?Xx%z9+h-gCo2&>a8L#2a;l3Hq$HxwF1^6)7CbpaCvT z>rXmfd|Fqz$`9*m=hiPd`FsQ#b`5f;B1z-gJp>w$IHC3?j!wI;5O?z`ii0)KXiqAW zhI+vPz#^V%&hV=yv%mdXVV72iq?Sz9O$u)+)y#Ynv~bSuHJ$U!gMv)?A$(6zb7eiS zV|aTQ07j?CVtC^+`;o89aA|to;?k)#M7mIeAPr=r{UuaN*KwTq@nFkFxMDEhIq8hT zHD1EqW#?X)%ER6;_g{3ieuJMZeCH)ekO}x24TCHkf|i7GO{7}t(cH~UEQhqpY)Bno zNK}I@IUW}8xd*LQ3Mmy0vzkV|4>iRtCTXQJ3UBCkh1k#0k5jv6*{`Y)G^$VNhre*+ zBpI4jx37q2FtK}x{)d&?aWF?+x{6vbKuZB~^29Of6YRqVzTKY#1vK-|iMr0v(Jui2 z&f)>owQT=$=J;duX8P6M$;Hs-Z?`g8)mjsqhq>H71c#$#{|x>nLom;5ZdG#PEKqUM`NRG@O#ie0T@K%o@3iN%X)3_};vLul zM-xkE<4L3sL;#<7sF{o&-!cBtC_OjU6q!a3;A#<#4{^x<}~1D_E3>-biE(#WSDFBXueerVbx%EDz5bW&ef%%G^HhGEXlng zGv!~6Ii^bQTw-Na&MJYis3gP!Yn$qS!6ak&R41 zt5hFl4mGCuXe1oijDuz$BnAkkN?rKT{i7RxL;(LiO>rsKHXMhb_KBS{`&KLldZ zk!>O_P!7`ss+lih@QNFZV)zsa8!^E&ZO|HPppGUf!^*uk+&M8~dt+Aio<;RSaN4L&WuQAVuk9#2I-t(c4KhWOY?!D+ zn?W6Y-9W>eq52sEHG$+8Z1q|x@JkNym*yHwvq@z8BM=+xm%NXN^hc$$>L5A8C8w>> z*OA+UJ%QvQ>s(-SQ8KOirGd{%4}Xt{(<*>WWYkT3(6H9=(4qDWT*;!?h|Gol&_LX# zs)P{Srr2*Sh4cx&8jY_`-7i3U{Phpwu0Hm!qBp=3aR>F~3;X{Vk$){f`S18^D&Nv6Gw(t;{U43vqA2r@XR=$UXF2VudDmga(f^)lfaO4jGL51}ADWDr8& zJHfbzS&Ob#GZJJ0LN=H4^dwi0vzb%NR=3{^v;n@1V^Dk~Nx&+mR7cWbfd}RguSiq> zStqqkNPdB-`a^=Zg8`>kxmhy8JsZ~{7V$)gB`1v{uaP9`qQC1UJE(}$1Z!}Y-d=Qw z1>+*iW>(W#@CoL0eRqC|`~=b}_k~^?oMoB?O!ijBnki(pHd?_k6?Tco;j&Esw>}xR z`Fpf#=GqIV^|-SV=KXUVP%gicFzXR$9kA&)S7L^NO=UyK)UFO%T}GOUW{fa@Tc$yn z-C1*LE56Gouv?%%mCRg(lof%oHguI8^;RlA4t^%_W7I{n~qR=v#3O|DB7a zq5F9^yuuRuyMf$PWJR}p@pKveo+!wH2bY~^jDIZ#Ho!NULS0AGFy?LH}t(m2m zkKDTSxjeBcl|FB9TJ&I(wTRnqGIs*HwA!v+R+>v0vr<*sC3?GX`K?O&(;pGnJe1*R z>r55o?mF6xEl;&IZwZkf0%}^_+a9W%!D^}a)3UBt3paQZ%@aloahrBk+8mk5@d;su zD)5m~qK)G>sVMN(>mlKLol1%1BsD(U;`7ATPMzs2X7zB39;3+cR$7OtZlM|%lNyLH9CXCDejM}COEb)Q+nk5u~ zZ?!k;13z{2*T?a`hI)*4leSZ*wNp_T37&MQ0^+SyfGsJBO0=R@EL8&9Rg^-)t&|eK z)HsFI4*Mlyc+#*G^j^(4-E5QGYs;I7cb-)ok-hThJSCNDM)8xwBT4|lJF!@jlM)eG z7o1$tmy#t;5wAG%FE8r!^%=u_85C*@0{>8q17pm4o&&<^01!_9b3OBa!s)*umYSAc z_#mz=<-rk%?n5zp@G)YJxeC8Gh*HwhsMl`HpWq@5q>na=2Qg(#COI80EkrG*%E)&l ze*}=^1nK3@t#$Xz12+fU$Fb~9)}5Y`r#V?j>k-ycPsiD4NB7v%H#Ib+0>h zicmYA0m1c-%Zw$$TwOM&x}y~-+&kC|0-r|Lh#j%kiDHzk!i$QZFA*s+K#>!m&!3a; zM-!@*`8X-2i^1|n1I!Q5_Rw9v55@hpkUfD)8sT)7X&a8VeLpAsp0>@iE`KwvRD>jk zI7naQ@G>QTD67lcY1ZhXohiAtRF1gSV4=|lgAOm%#R=nLBsGmPdhfE2#$9l!!bX;Q zd4`0R`of1Cb)_6by=D78e*3*V=MdPv!t@%pFe1x`ErpbT(iXBmIGKvHdiCQ%Jc@~=S>4d=N~lJh`P+=NmPq?S5EY{ZK5t_cPAyo4QJC)lxm z+9h7Zqz3-jw}sZkMk|(Yyv3jL6@C_pD@tqSJRvH6hodV(bo!N6>N+b8c{-!LB@NDD z+1;G*@{e`nb>sF#4FGDlG$4R@{+I93pV*M}uVDK7%r4nl8Ala!^Ckh+Mdsk1?Mm3H>Qw4RYCO;>p~hr8&Jl;rZGQ|j|Nmc zQ?*q{=~-4t$Ckd<`zN?V88T`MH=o-V}jfhizZ6eoRSMCt26jCY{FoP%2Ky!~WGl!YE)=)2?k- zb-Fyx^h2?Bar|aZR{@iaLv7QluUg#$->*S%N|(WLlLlpuA0=6I>QyS5bSib zO*`Kiay8j$%9izvRp|^;eRR-j>B{E(IJ1Ur1?9&^uS(WcpLk=p*0_qt2}o^|z!ZyE z++L3_O~A~xC!#)N*49!G5~l~M5R$!w1AZ!T+a%K%(vhTt&Q98H+c?uy{C?WbESD0l zWen^HtwhSecG_Or5hEA6gH+zx0Z3tFx7KFaT+ExexI1o1bAy_e?QD6}=herY=J`9- z(gew82hZaz^zOpmJ$FW)`}y`gA_2Hy=ehH|`G$G_5n8S?f9-45WBNVUp7K-rZTe&S z4c8gV*}^r~k@GJADayb6;^0h>27xe0tP{+icUAEZ2Gk&eg{S}WhzT&eDbGqczSWh% zn7x2M`Vt8)T+~Nc3kIaaTT1F0#xYmJCiIGf?$W|V{yx(1oU}e6r<>DnmL`Fh*h`^} z?c%)>t2=m7JH?9Nra?=R&iSox;(3^GE&PE#5pf9)f>NOgl9>teWV#p99my6#WPH*E zN>a56{I)-Idm4axcJdnd*4!qDOud`q8hpnetqn~flJFL}lkk+>G$JW^3eL-x%g@sq z469{U9Zl^mHpk^DapqV}3&)3>@J%U_yUN9qvz6Sm&Q#Hr-Net7*=x?LmTS+m*sozc zDg+5e)0o!`TE zi3t2j6XGZwWhk5_q@*J#PwJpNX&`6fsK0-m>~LM(=6@9&IZ_aHWQ5lfDfdoW=iX4D~4lq5E=NVv>q|(2Q{=0QlrABz&gQyv)7M0Q?vjXfG~)rP&dtioD#y8h|x< zK@?_SQyGq9h_%dNjb`1lbmn7(p2pC6%W0Gw z?Z+)OE`~z_{!vVRqqZ1kk}6;0y^-q7{E-neo_CgHHKWJFq!#x;p4qN=|LAEs=E-%< z2@O<2@oA(u_Z?}bWGUu;zAN7gs~w|gj;>g!{T8j7C&yjiY%+U-QL$WPK9wbpT1CeX z!{o+8@pv^8MWU{uIB4?LDPI;H)@Gv86l7-cCgZqQ{BTaaGV~WM z7cbYE)}CNj-}**x8ildo5J+$*1SbyOIa%llXj6}mlpoaui$4b4Ty%TI z`C5?O3G%&eeFz`JTld_#erpIQ=98XZeoaW2&&~)y_YZ?ZzLlu8?c;h|0qe2fOHdY*EWEtgO(;Mr6t0}P5X zpb2vRR3O~?Zh|1(+scK*NeK>4d|F$iF#c|7)?|MlJ0m(vNhC7;qs7XR3tQwTQ2Bi2sAzgJGY7u4mwzzD-Jv_Y)?mJT z8NmI|q>8`L_+N11Z*8Y3O&A~LCA?4hyEaQN9E+mj9inoCjFKd3XlOd51jFGh|StM>x1X&QINl67?9`P?xRO=lljGWdz0sLo*YZ` zf|(LTg8e9^i(rZQV8o8Ud>t0@q4$3=_Ko3{X4|?|v2EK)g%u|i+qRvo*r?d9SQXp0 zZQHh8N#(A+yZ7_#?sM+#`)_^g_n32z@s1Z@H^p8&hdq0@?}5s{IXPe3F&(d~_uu`M zpYqq;Bu9Vc;(3om6x~GP@s{n3nV9#hwLjBzQmAz@h;7B@*-E}1v3iX~h$v3Mc&&M( z*M77=BXpMSxWjMFU37#b@U`fd`$q>m(}#7U-7!+(K#uKi_&;;q_c zLIKW$8|9`qE?o!~eI-to7lq55&aQPL>KK77$6h%Ka8WOD`tj`~t#a`(@xsQc4Lpq@ zO?)CIadUCGP*+35#$hl2Mv{7DWv#JMD!Y(09?LwE0%ay;Wq9Ws$!2qpcxn_a%Z>P| zWPiadfEI^+HkIr`!2BR8xa3p)C?Bfjg>1)bvEMXaH%$BG0%ZVOv+c~JDGWY@>HLf zc3tVnS&+Rb$RTYiu2fkh>|?0jH=o4#5TJ?bY~t(*p^xs>rqeet1m%F zFkWYHB@E|bqsoeA1H1AY$UiYm(CTPh^`K=bEZ(99lFedi!DjKoRwxlVgp4;Yg(2z7!P5r!B75!5`BKqg98IDio9_DianYY3aP5qccm)Bc( zl;lv=4X$4*ZIWvf_|Omshkk+LXjIq24fmU_K0-t^(*3=g)5sJ+dyk(1ZAS?QREqHd_TS@jcXK(Mzl<=sNEpiRYoHh|qp5s76>4 zjO3&zgO7fG(wZKECA1Rql4ix8Pc~j-x?Sd#;&?or%!Nu^`8Afjgw)VUsKTLlT74ZQ^iV= z*ZDk~RL-_yYt`wN`(q=A-gFcsN$q5MKOa(|W@UZRh8dT3uw+|tt~r|)r^#JI)SKR3 z_`vDXxKU0!ckETU+cTd{gn>4&w^4s^IYhM51fwup_TN6L`Gf>=_pj~8iA&`UzsHgQQ5U|mw5x(u9lm;*%$4} zP>X@uWaLc=?b@SRT|M1R9MX=sXUNEkb%ch-Q7NEZUHBNR@`l3uG7^up6$KY!8CBv} zV?u2Xi)O?pZg9)#$bxMX6oT>Ccf9TNkRXpczV40%yyR`|=YyA&bXSK>6-NG;ySt%_ zc)pt$Xpb@fI#H{-RNEoLG3{H zQo>kCd!|ic0|zpZByw}` zP9vs^(AZ?i4)vfDvn5m0Cnc&7>V!VDQ3Dv{AMWzf@A?lrJfXpo-J z?r8~ubo#E7%Iw6hv;)+I2{5FaGD`VO4Pc5IU5G4_*I1^NK$w8%E|}5E>|Ke9aNzvm z_pJfmN3kuX1is`7TsSD~)KKkR-F4yI8H>f)$h}-uDJc2ZqIL{y>l{l$knyUq5}&-$ zk9ajkoxVi}YbApN>~X{|)?fJ!VU5HC}-*s%UcxpXPypYHVDJ4~qpXQ+f;oOLA1n_}Lv*l(zIK?CTX}BzIk5Oo# z^f@C9F9Qd6k`-jCZH{(>GvdNzOYn*+jos!4!XmJFxrB_4;*;@BEyhflzP!2 zv#N88bDC@Zs@b;sxN3+QrI!m{{~o~;EmDwJkeJnG=lHFRPN%vb7r`xr@#AZA)1D+m zHP?0nYN@@1Ms~R@`3p5oPl{^9!#9nFGV=+wi?YSMh$0$^oq^w$T~|rm%NC%zdJSD3 zmQG+r2nIba&#*QZIuiKcl2RRN!%}m?P=uT>q5!vV~_0tkW=2) zu1|9|ZPg%cD~3;uRfNX;xPz*Zj4V$(5RtpGJpOGpKk>N5A2R1jpQ%N;luvG&X|o?r%hDmR9mQ^FmP!de9A524^RC?%khoH?T4H30O6 z*c`rmt#f3@z_{bn>prV@m$G+^c1>CxxeEu`#7sGE+Ez_>C}D<6;SCqD-Y`4w=|#?H zfqa;&R@bpjd;GSRh#F@Tk$5kMF2tKTPN*;q=yO;Yk~*F>rPIRDhf1HRrMuSqt7u?| z3@(8JxTD4g?x_FQXaCx ze4Bmtk5757txtC;sFzvE<#`G5`ZxEQ?^j-=nP~{HK~09#Go8xd+;Z)7Jd_67**yLH zbXbESj7R{Hv#a1+KIG-zn_R?~|I9uCn&dSMhTP3UnDwiAeEZ8uqTovL6^ry?>4TwR zQB9kbCiGr+v3eN%FGjOVEoun49Nh|q?QfSAKG~EwNgA@ldEH4G<;SXd0LF3d=(&n^ z(;!r}vyd>EvE{Ye`!@iM5E$QNrnjDvemdM{y#`YST%TaMjPd|;g%AlZBke%>a(;&9 z?i$>vWy3eYS4YzUx0&TNrqeGEnau9N4h!wNn~P@@TT(@aiPEK#XLNdpbu1Owttz7q z{38#mVsJAN_e_CnKL{3OQM+0#?URqmzVN#r6xxJWcF>++2*qv*Pf&%9E&oPD5vlz) zQ(apdqEz!dpmR>%tr@}WN+%mI+qQM7V(7nNa~-88ckW@x3&D6dIs{`_NtkxGjO^9I}sI$|eb<(o zfh!KxPuzTX=}?)8;6rb+OApLcgErIC57l{0Wt9F&NRvm=I+0=xQRQ>KHPkH8WkK`) zyM<|RjL0ff4Ix;dR;S+a#w8Y?Ob^OnHD>w}9TuVlP?(0WGzvl;whGc++klnchN|l~ z|EC|JJ6!F(gvjo45p{RW>pePQa^meF*OxH}cIDvb7XC(|Qg*?)Eyh(}8ML-7Tl~lj zFu;YDqb-vz3Pj-|`dLyEH*C;zIm*;eN%}7bd2c7687WhLkd2x>XW-G&vC)fP*B^rqynow%fcDqh=5{dN+s@C{dHWlm zjODjUuF;=-GU|T>y8i31MaAh!fe4@tOqG|FoxK*(vCT1)$OmBLHsvN)Q=X9DcsGbp zPDI(TzNvzX%nK1_Bcg9;K+Xt;`K@?P{k~kOW6|3p{P`)m#)>4;8jj1se!s>fTVFq& zcozX26E#?{@2<_obN&|~@Liun{TlDbS+1jwWP;%Lb54KaMQ0J60tVI6G6zaib4Ld` zLb|GMaskrA2KHO-OY-E;bB>>*0hu*M#NoL?P;j8+u-wCp=O3iJLXU_Ax`8ye+qYwe zOj!4*%o&|xO_+si`9ETzi(wS-MIv2(v`U%Rf2w1eZ2t)Vcf3 zHpip!3>KC@oiMnm29SpWung7r$Amh0cBTBj3_uYKA@?YP$&t9>^e_uK$tIl1$mpxB_-t7+eNXndZ?uF_NILxR{+BLpaJ6{BsSkA5ny; z*9JCf;eUziplkIcXCzN+0)7b4EVzVD%CA)4V@@=ocl?$tOEJdY;c!$c!+l#}lYGn) zSiS8~IUDVI{oS2kUG^4yEOqtBnojJ@rxz^j+L{+Imr(VgWcsr=90U$4D&D-NL@6j> z1@A!vaO@JIFbZ&-O8It|qMT`6+0^wyV6;_B*(Mj}fmMgdLbjgvuN~ounY~9&UqaM`;yyJM_qA=cHo+^I$cJ5f-LN zTD$uBtGUMcCWE;VBp>Y1`-C_L6|McnQHkD@$0$}@y(FXJPNU|;B|bKAe%%HotC#L zcb}zx@@$*vUAKR7P9_n8e@xoNHpu#^1hYw>^^5^%t2xvmnZ*q3AklTXj$Nl>di}yP zARC&_LU+~;APR3|m5DYJW&8}`LsaYRf2PA2~&+TcHy)-DVbHcC*$5>iCq8B#{yc1u(UHPO+j1xvrh9jEV=YohLn zM=OPW-}M7gA&&(b&;Ki&-oXkbEID%{)zNfv{POq9uRC_%WVbj`lqtn&{m=r6q}E_j z9B5Xyb4zmzM(lXZq$S4|e&b~T;+ta~_vuq+_kQv^?D!AHWtZR{0-@Y9gmXS20~{*v z!yI+!_*(j@!^$yFxbsMX4ObpY4t+P1apNZt%4cf=sk$aQor=C}Ja~@`gNh5cw~J$? z^ZBG0dZFeYHzLZWIT4j4+{93bDyvN!=JWZH ztod8;qMZ|Z+=dK6;NDGqn#oDg&OA#wd(qK!i%$7*22@q03{>23Q6E@LLe6Ylf*X~% z6JOgmD$s3<7kfxOb|t29h4DmYpuE9E>P5d&w33!7c;VyLA09hN{^nSb?yv_{wbdnc zA@51AH#IR2_$?J3Z?nsgNkfeH6bre3$p@1leJ-4XbwMb9!`LCA+K=);82TNXQni5P z3+gE`k>s$vASVeS5*Nkv!z|k_s)of0JxUQ7%f8UOdVDzjsWRH;U>~@kq25uTGA2yP zG>4D_EeY*b_PApdbtQ_uk{i!ql8JGziPAcSjw(7gaxKkTHs^1_-9GsFEBVSpsN8W> z>g|)imEqZ}kK_pOK|TXs_5Un~`IDgeuVVbKw>eQ!K@LX%={E*~>^2N~gX*{NT!?AA zsH(J1EL=hcne?w@-aPtwWk)&=3>3f1G}$O@W(lVW7o1!)km=&@O-x-5e|2W2Zft$` zc>}4AsGze}W)a_uVrIj&(ok1#QfR8_VRYRMdG{T{gj4wv9qD=b=A-Yh219RMa+M6+VIKKZ$+y%2P5ts4}O>6`Pkxp%28zW^CX zjeWdv;y(FQ=O)2q?A4DZ#^6_Le}Rfgw_8(4tNVBB*B{Uc%4KNiDqH(X`t!@MweDQr zB*O7tl?~pAi>oa{yP9(_#&@mCM59t9Q$N5hg*Y<9eWNj|#SLi`G0CWOdud6p;?)|I z&oIJlNq6dHE6oMWpcwt{@7-*MZG;*-NnaAQ@b@%>(}@Ql0U~MyE!L53vbfYa*0IjB z3juF|4-W(-xMWp7ksOR^Tm2Tg{yH74<(*Gj18=AW;8ODcrA+-}I{F{n-3sMDbG*i$ zG-<%CKR0M<8CVG5dRqz^O4B3uv&I1xmvz&Ll^eCr*y3+;eCqtO|MB{C0fhy>?@8un zdD?WmqqVVH9JXL1M@3(H4sBMaRtUuCKX&zUvPRc8Vk zcsaOP+!wHLcy%kQ0ZY4^X(;Z6Bp|jog$n zsOI-5KID00$FlfmtGT(@FE+O_e+w311l+FkF=55S*O|5BWi-JTl{C@c=7X(UoDpy71DC{i`ZdBV zGOqBKN$FUwmFj8yn@-;;DD<>hi^0%KV+gum$v(y@86lt$JAS@LA8gP*$R^yVJ$9d9 zeUWBbJ#Uy%**p=_5kZMjAc@tOu!J4P5IXsJ70Tdb516ZtgdKgVMf?~m zqie8>;j5$a_7&It|j`ck+F#+1Bdyd)oLvzIuN%+p zi?)JB{@Ef|m!cFdvre6O3Kdf_4vxrGW1YmXMr!~kXMjPhEqnc-WSYjtY#Fg0#cNV{_>(Twr|_loy^tP{CbEzQP7rOt24EGdC#S z8!LF_1X$Hvb&*N}<>6r|2br{YG>koY?zOkIn>KnC@&QZ22_H@;A6g7~FeIt9fasw5 zVIRTFfbA^n#yI>6bnLU=^cihn*SD4o5V8@z1bDQ+Q_tb=w=}GPh1&@%-2aPb|%)9Y=NnZh#qitHvG$VT<-y(V(M?9p1rGZnKng~s#vr5ooA341|C=| zn9)`?ca_(mz4_-lJ)pgnTv?=xSeuJty&k>DR~7IL6>y%bK1&$USMTq396QZ-gI@z4 z`?rW|UK;mqj^6ta5F5{_IB;(cO^TRI!81>Dnq;{A0ZB<-*W-dNM??VXRGGV z%@%T*$otR*nis7z@;{uhnV)8_Aa#Dv$Gw;JKboC1cpKvm8?E^INq{P)jAxr{^OZt4 zr05sx<_jqvVPkw)P{B<^+-R*I*oLC!{CrQ=Q+CNmfA8AUW+Q!y|@fK72WSBJUo5RXWh|0Vroq^k)evuO{F|$+F$#z zMl1BSzMx;N!jzi?Sz1UmeZ!HlE3wj`TFc+a9fSn(ORvmj=7C}KzXH5ivr;P|cFCDG zD7KomGFTiL>WcKbfI5n85>=4cSSXS(EoKttLw~G69!QyGZfo}9A^BK&vlbV72qHnUzC2t->>|u7NPu3^ z(m9DxQbP-l7nC+XiHLs333A>Sq7UhYpgoi{0PS84Y0G{p~ zb6G2}sp#5ZefKmi=z(1%nQ27)p|~K1AtX2GQf_VJI#-H5J^@oPOd@&7B*YiL^7U!l zZNO>NzOQ0MmJ`{A9iUgJ$xLfyI&rwuo)T|#sk#2B#Z$^o<{j9AHD_;m{m z_!5*>m{*?Q^W6<hhsCVg8UHZIX95Q02hZl@EK)?zM|-(Wadq!E~IzRAmjv^)iu&+P#1A^0A4dqvi? zV1hcVRKnN4F;mOmIGu`thmZ`&O#Nr=(*HPw|6yU-*sdv~`2h9?!_Iorq5u|cHGqJ^ zOVzqwH>(p^iKf7yT6Bys7z>BFvc>TRg`Ob5~BZ z?bEDr?Ro84+fH~lVnL^Thd`3$(HQd*()4IgC7N5?<*P%TV>PMP7AH3WeUQhrQ+x27 z!vY_ZDC9VhS|p3@xhDXHlxYk6neB1nN1&qSoLY0QMi2|k6qDC zt)EPG<}?8w5{PwhC|^6_xhe|1wo7Hx_=1M~TNP1%q^R^2hCypH*`te~l8>J}5B3}J zFxf-8%4iRAQ@}L$+nLoU#SKsU2uXkeGNZ)XWe;T;Xnk15j#{Aotjz9f6`c!@>QP&> z@Vj;$wh3=fcSCa73eE;D)cW8)5;41B14MO-3BEUwN{*Tru4lkX+D}rvQ!oX=6}EVW zD;WB=v+=+0UNZHMK{-U_^PHa;Ilq`S&L^fZjBp{kdW1gN( zPHy+WliXRQQQ%_Risno#6GPLdSn?rTFnvBMSHpUTUD1QMcJ;V! z0ppkc{MAj+EGUlUbUe-ECLnE#G9o4~1<1%vPfCvp-{(h%rK2`&8r5(=S)7khn}!Ui zK&f9um6i)QnP~{iQReUNQ09!INyaU2=TUAE@k&|bL{Zb1!6#-HzaVB>P&$1JohU=u zDng+QGw*^&a%WB$rhI1o{Dn;a!gU|ACW@duN&oJdZa`LyQm6d52XNQRKcu*e%@3k~ zPKdQdXmpOauZQqSx|L20tW!UahWxpy=wVm$=KEjYUo;g}ktq!qI>QE+dEz!T1IF)4 z8PE+O^+{p@Q^x}1OhV5OCNkr7D;eRA%5N)GIk-3&t!4NZWwf-M2^>WSvdo|`%29*k zL{khLGF12$7Omgy<|Z)_p|Cu)8Xq5WZ4#Vx$T?>m1xYS7Mu+B7oMlHatv8L>eqvPC0olOXE-eZ;NU>9(sW(kuHY33M~ zzS!R}Oh#C3co(^8d#yn(6xuEv%>smCc*>lC(^DpMRdYS4MZDdPn68p~>(uP4=)F(K zX$HQ4t6_p%-kidzp7}5ukW*uHfd;WsK`zvGf!_@B8}$^&KTdPhJDkq?kTkBi2^b^K zd^w_GnJHworM_iwF@15fpRL7Zi&u@;N8cw={dlZO6iiZPRXgxDK~g@81`~WWpM5g?_^uD#f!MQ zZL?B%1&R~$2qt+2NgIxa;Q3q;n|Y1kT(X)l$%`zf58&AAzL7?>u|o1(vtG7z7HSjE zQVO>(XxmN`x9H}w@_%m$*e#eefnQI)kYZ(;kogr}%r3o7xdBC>KS&-E#_F4N723fk zHfAO~$upyA;Z3zZ`TK8AY>iWWI z{Bxp>pX%ub3JMt;4=WBSFkq)3Ga>Hc>k7c?O_nb-oGcCN=eztMOWP0KrQNad$&5Sh zMNVtVsv&jt&D7R_o*Uhzc1NBQ#8?|P_ThGSg z^u-*FBZRmbd;?h5>ew~8JN?)LJ={rIDY=5>Iz9E13aKMoEXu@tWwZgQ zkmRY%<)gM}q|u7m_)>bXFsJT|W))cBu^P9?C1hqzVU+LUFG%i1@O^k-AjL@3F(uRAr=ptyr5a8XlVQ;#zG@xDdpK> z0^@tSzSr;3DF!z6MYlMUCBge$@Zx#r_{dFi zc_kh##-}|pWvfOA3V9PZn!&~Zx#=JNd! zui{G#2{+a_4aySTr}dy8#x8pUEj=fo^A3SrGeApkYnP;ywcBUPS4E z?CsU*-~U$7*?dhw6TpX~5%_TM{Nv!JY~WyK@(18R_Q&tPjBE+EKsgiI;7@YmHfSj* zwBl()`hocCFTVAX0pj8q>n=YA&INTWqhKqWS*=Y4{kb}?gIHdBn}7-?f%HjrF|nem zclqceZ5NVy{GlG>!E_8h#>8|OL0@4#3<|hZJsihvjeAh) ze#2pXKUC9@*=E()iw>&;Js=~44YsgI(%E3XjaH3g#G6cSy71b`QZ2VM(Q3kne%E?6 zbzY*YIMaM!6&1V+)>vV^h$i%4T4~oi6bJ$Pu(;e;yFJL&IDIx&SeqUlIE@Biy~xP) zE=PbSHF%k9oS?C(&)hSkD@;qy&tp^SGQtZrIn~h-t1dTM*O3WiEsx-?rI8!F^bD}m zx$G`#wx6^(9e#&HrJv`2AiKx**-q3F^VIEgd9s`*iMW}VBEz!So94BzV`JwS)|?0? z#M@`a{Au4^eAU)~-?VclykkAn&3oH?Rgh|4KVTaIB=OY#F%Y}p<=;D1^X`cNB07b)Igd~cVc;p-K` zCX{OSuEAEJ%PTcRzbXN`9nw%}%+g^eQUBY8StE%viEfN%3}lQ1FgwB51&h-9WcA>y z%9Jvhu|n*4HN9p#E6MWFVhY_fnFWlHcBpFQJfa=0pr6)akww&VunAm(M4}Wb6fzZ* z4az{^M0NPOuRUx%{1OXGjG0=Zz=xB@6wU$I`AXI<1IQTe62_gKI`)VjHgdQxjT;pH zDRDE_j5_!wN2;CzB3G#^`xj>}-j*{1pIB*@r~&v@xDS`OB7wnYEMgTqKKRjNU|w??Us~v7}SkJR;gD!pbQG2J-*|k06P`z!Ovoa@e^q zjqLZ`>_ug%;p8OrKsb+;QqD0#I#hi$OOK7wZM1ppF#Eix+ea#dj!&_{|M01 zTCF4k51;lYRJLde5>XZ=1Dl-(vW~I?g*O{7z*LiLYTII;e|jM$#+m~IHvVP!SXpl^ z70|w(+Tu6`G<@W4>-uSAOYODEqnqMNc2Hn`w)d|u>)2N_^p0b*S2)I?<5-kgyZ?%{I&h}6 zaec^-lKhC3VA(c+EqYowv6Y3#-dtzJN_T5~dQoU_fei%R{giGHWKNA<4zWd?f8z_S zI+fLSVc0SWN03|Ao;m=@k!VjrrN&DfOW_4;uBu2E5Jux6p@IR@t(nuQpB<52XVDtG zU&;yYmE0Z-;9WoU3RO9DSbz%^i6WVtdjIOTxMeRqc5E!F9*7w%$svhwM|Wi^B?(|c z-%F8aibSRX#D4NCV@v?7iw3v!)CefsF6t-!cGPIuSig?#d>|{PlxL(r&D#KO z>o$BiM!!A1SUk6&(rh}Zv@Wypd$E+g{R(>AGxFgpltO1BXdHXBWTcBRljhGp zQ*!vXnYt3+D0oFY7Ls)^dd$HRjy?k|XlIBjh6lXvCNemW&an@F#oT@Q~zK-&;cY$b-3IikO-r-b3+%6`FXYk^0N8BNUohFu3$&Z!QB+)Z;x1 zBmI<|LIX0`f!TvxmYph4D^!3iIgcyajp|YCcUJ7mXml(^ZZV%P=3$tM2C%4i>+Vy( z)5YA}kBF-K%*&aTmCQ+_7>g3vi^{!Lrg0aTv$V@nF;K;?xwcIImA1!zJ0FN@y0) zGQzYevz79E+og@C6bh=>ow9UUVjMV^-pJ$p2%Zk-R%`K9dI{b)GjaJOr6FUP>t5Q; zWm+Qu<}TBWMu@XI5hr2dsv;Jf(oj3Kpf?(-95tf+0$0M1&qa!$6wD~#V7X4D5R{E6 zB*8hA^!;xZ@E@;;yOF>fln8i({_}*cY+`L<2ecLXuWCwET9aM-cNX|p2{=~2PeBP% zb5iG@K6@yE@8*O?%ol$Vi5pFa*4i~ZAJr&+mGh>uK~|)F0DVXY>hnmQGSB(R8HS0fI{vj)&=bzMCc3uW*mhjmMfvdddH~ zy7jw*(|$M&|3PQ*Wj&!4K&qVi7=FmsF2?VI$@~ha9nP7CE(M1dYxa|CfksBspLo!z znXJ~i+ncQ+hrbHzP2jAcm4cXsMdN$dK?22U!bC$k{mZg z+q%RcD!GDhk6AOB6ZN38qbSroc`(hg!8-{kdOS{%*hE-F$4&60;TxT>MH>%@kx z;RaF1B#5Ht8ORfj&K&ZKJy6-)r9&_Ys%~8@G$V>mI~+a!9Q~GAbvVF{ctn@D3aV~K zOq>Db7Ac0LazH%v5xzthe+{3jK9pR>sI?zsVT>)wSzm9?RWlgfBq;%f=ojp38!XmV z9M{=rxcG)d-%UqyOX7)6MIXy8FR?UVd4{dQxSUD6>}=3fLXTLdCbw&G%+~oe zd6UKheL@D<+1yXf&R?;O?oT0pfKz+?) zLqn`*073lv*$`m)1{D|Zy*{FOs$$Pij|CbUyBC%8rv=h)>)*ceQ4u+$;vu20ess?Q zU4&Ey{Gl&B-}(_D27aOiwK}Dh31YsBvaO4Z7mK!Hu_E*!$TkuAF&bbny^2T2JxIJ- zPsR<&Z&OEPOer-V#z;MZx%Ve4{e5EYo9uVL1~v#yKnC1DGfe-x+W%azDE$X%ZF6d? zS1075YbYqbkX-JU6U8wSWK3Zt>y&(Mrbp$fy`*T0@y?DU2 zf!XC=hU3#_>K_T+F+1vv3S-0(=q>Xy<(iCkTm7J@h%&5Lrd!~APrJXZG<$t}e6YcI zR_{AF4w?F-w_qQ=3F0&?LT3Ed@bL)3`wzr;#MdtjYUy{41Bh`gqKb~=?+~5dUn!4+Y(8PC-xMNH4(si+iI!^#+AAC>=!uvko~ zmWkhYn~=VEo-Hajl>d~_8-E^K9&ere2zQKO5WR@I-$5dr_Sk-R3^uOuD|o&pH_@EF zSlN$CL|wQ=Lf08;h<+U+!5Q+7jDlW+NaPU&qoG}@ZQLZIO57U<+Dyex0D4u(7bCwd zq%Ezza%9jff65_ws5$uXP@cekjK*=)#AqGIG*oY9nCqle)TeuyTi_6Ob_j@A3tW~E z7RS?jx4I>a@#?+(jh{Spr4Zxa7 z4wOF(dI^*@Wxj$CHUA3{4G^XG`qMSPmR{1Ug~jtI z%W;aA<=5F$6XB=B>f$`eI_l%$2s^z%Na*pfhaA}*1&}+gc(;u1A7EL`WL73-Ws@Bc zed;3*F1LvR9lUE(cS4uXFALk%#_Vt45J7}jEY&0do5d|+K^Hc<57ady+4QT?7hjm9 z(~s2gwjQ^RmaMWo_tB!C)U>y%?t%;f0RrA90Q+F45trw)09W+Oiey^nQMiP4%a%@s zN9!AW3Y9L?AEI?iM$364x=0#|Wh(oWef{KUO!+R&da)sJKTIzbQ*?XF8#r@PIB#>C z?D@*l(hYSLr1dXX)=L~TwBf?n>Po36PI7h^4kseT?wwlFJ2Ac)b20V6+48t13$G~p z6k18>gWywQmOWgnO3;SQF0F%Bjq0uRF7(_5PhBPi#tQ;*mfM?zSk_30Vb;dG@wG1y90&2|@bJJSG3*U42#jdI zetiTq_rB!j^eU*wAy&RyV&_-ts_9kRi3~rDQ))xiL$uK_VK@amUrDAYj+>MIIEo~L z(MU)R?LOykmjHP=3fEkt$j5!lWwU5i`=t8LZ|`BxLlj*UcS7-VP?mzS!Rc7AH!nzp zlwRjTU_6Tu(d<1<;)b7eb5B!>8$~TT7tLG8H3L)Q;Q9nq9LZ!fDR9i}+ai$2X^cC| zVxiYhD1^gc+yzn&U<0AVMD`@4gS6{%kRDL$i_?R?;#&^K_d21b$5GPLS@mK3NTKE9)cEkNGE;xEv7qS6VFmXG!u!0pr;Nm4+hwKCvBqx^YERXY|!LMRdk z<(a*nR2#d{)HM87b}&>DDh)^&PPkcL%c&?Bcs^n{%Ca4CHT8M_{TsELCrc#9fX^Qb zqra9aX^jb}IjLEXn0@Fh=9Q0&An|Vx51~m?<}rl2!f{z)#!oh=SGRYmU0dkjy)>Bs zoqMb;YZxMN?Z6W%HeM#5Gt}2|vX5l0LWxAjN?>1SDoHx}`jmtS*dP`xq%dPZlzu|;=d>ucuHV53N)Ta6-fIeg#F?jyd%KwfS>Os+&hq5rt5^OP)8X~kmE*DT2oD?l>tCxx7xBdH{Q zYDJ3F<1)zw>Qr!sUIKH}!*#8_?&;}}A)Lx=F(JGT9F${)8{s~sadY*-eDmWaJM0ZO zQp{A8D2?Fp?~y+YN{yP<-zx7~eeN5+P`mdeQ^#X<>bIlek++PNt4uuwiv$6zB#jAZu4dkStE&5Lo)cq9UTDXW=Z&9PAGdt76E_I||@;B|*P z5buRBzYxQ$u-EiNCeH=ripx94mU=|_28Mig#}SA>9*_`++?NQ2EVwWJ(jm%mgR#Vt zs^m1oBa3Xv;kP;+H5x6@iy%?)8z;9CeF$qXEJgwB2cNC#rXRyQE(qb7GO>oVBu>TR z_T02J(?vjXv6gt?y+L^H!Z4TtMS5i5si+{c4Y3zIi%ldLe*@Oc8cs{}JSV9VYqTmU zY@o)uzOXSv;G7Mrf+p%n6I*VRoUjF3tze2EBq=n1930?T+p!b*0Jit1mRC93i@aA7 zl+E-;TK9kR?KM9M9u~6No&C*zd@{0eYYKRBY=9@{ z{}ucoYHMpOZQ^2L{XfF%6aR(10TnH-U8?}h5?`o#s8B*1KMW-F{8%Iqzx-E!;u_mE z7f@O$t5y2JkKMemFaOy*DGau_+9oN&^e20onH^?uvN*2&+m4noMg`S=--wZEEQZr( zTV;BHgCkPNZt1QV5}klbZLrPOm6oCv&NCeZyy@_@4DQE?BOcqM%r9>_jnE=QYAkrx9Q2)4`|Wc3M0S$cY|id-oWFumR?DkQyTX+yrx4Q&Zsg)zI3r|8yt~J8a2Su7BZhYXT-6J|B z_tj2hjf-S^YEPjPtWUvCYretFu0Tc&<)D^H;C1Y`$YkAo3L%CA?FAkW^_BrzYU8)S}Ndb~91e13vRvyNK5h7c)cUsB^9SXkHR2 zpQU!mDO>*KM$}WLSl&}WZRW`s2Q#bbO9SV8CF$)GED|l z=OCq{#IXS1mrC+Qs;rLbOIKm8u@s%vC_|Vz6dvl;PrLlc-p=96YFI<~3(pZ*$n`CM z<2~TG)Mlpvj|c2Ov{T}?4vr?0&Ng=c1*k+RS=pihGl)R{4`c5Xo{5%q3s=RqZQDl0 zwrwXByJFk6ZQHh4u~Bg}>oHaGaZhHuiz%>8w|;AVp73J|Hz zX=eKI_I?8`@D&@(a8%4-CmQ1_JP)C-JoOrrWiw{S?<+1mu^UR?K14Rd32TP}z?6H4 zLC?1R^>^1Jz#;tbH=~`~?|2_|7tL)fp+-Y?s!rWw6|m+B1TM?&W4fvq%>HxPfg3iA zqe@2x*qIx?11Xu7p_OK4ZWzrvjX!3vC4G90@K3F;!`l@~#`&9-s}Hyv&V#z3tTjgn ztX8p_^tX49yK~8*NMrIc!Wi+y77T-#s&&+)<|g8iYkRtK@(nJa8@2Rljn|HLQuz#% z>S@ru&f{LE*g~VmQQK!AEK(i_1&N9yPeFXGgwrw3(87TRE)<|SxjVJGWfiXkaEo(p zTh<+@-Iowb$j34hT@5id$dHw3t&xz(`=J@?BTB)ih)got{i%P1Dk{_M(dnyUB!67L zV9XaFd0S9f)fTmLe$K&o`;TM0muc%5TRP!cApZ>82K5(*Y`Y%;>c`?tkYmAi%I-zQ zBDZ)7-xEwXT03N}z1X7!B4=_BA7*q%5et=srOGbe^3RE`5C?Kd>WA?QOEO2ueV{o) z@ya%}M;rek^vejGgC-yWY4#o&h2Y&>TWJV85f@=?ElmleqY(yEMo~tRNcy)1uA~7G zW=hm)HL9v0;#^qhBX-`5xAu`|>j^HM1q~b`((|HPCztZ53=J%VM9$p`x?*9v8Sy_# zD6Lu)RawNjZh}qv{KWwwB?<*&uBL|DLahl8%ZVGAdTMThCvKv5n@BV9(XtwG{0S_8+w>%vvfx%i?17=HoKEB|fX`;TC6VH3yyn*#i2y9q$~ zpQ9Jo7V4@Ypk&3_mlI%0<(nl*LxcbcBSRLFTbm78{UU3b4*kC-ZAD+!Z(%izO-}zI z?K$4w0yyNqe~}*`hJ~yg%*&%nR;jBLQ9ypRiAv^HsI&^*wMBW#Z^a)14qojxaBlD9 z*B@o~eDAV6KiTPRtawY+0tjW=tkZ!zWLKLFn%q-dF;?ktJGz<;GI%2h_lwz7QZeF! zEz%yr1}ty19VXZ=pO(zn_$yzTq_|=7rgTG?NivFua`17R-9D4%&J;;#^|x>f?7|zM zf-k%icoIi=Tf=#G16qc;t)vDebUODlId6{1PK_Yq<$?n_R}&wLJ^`x?xU=A!E}%j~ zI)prXjbXRf_MTG3hNEaw3DhJIt2k_qk35S@vVI$Q(^g{%^Ja!h#QvcS2VN!|L_>kt zm(}SQoFw$?6WaHMo<-<9v2&b2njE&_{)-eGj$kjbmVx+B8nKp^bjACC0@iM^CH8E(2e0OLVqH9dIvw7 z3Cr><2}`AztZV({|e`|64Qs2eOs^6RrUXa!F#;pi=G>;obt!4>oau z2ry((VSTZqEjHYKN%gFkX!}050j1*kVK)u@<8Edy<|!^#Z%hr2$C;ipZLW_`Ie;yl z#2aZboFNRS#KC&9WM^2Dx}OUcZ8f`o(G+-=ZiTyb!Q?P=#0$18?i~XRdNxh)QcYJk zb%%-1lr35F)t(wnT(Uv6Q>t4|mB~{KheN6=>H=rQI>$2G`ugB7aj+B3nKHpm7fA=r zMx6MP^f*5hZ)6fT%ph!9urdugE!W;mo(hLIYNj+3h#a#|rTX9jB9!d@}tm&mt(b&f0?NVrcufJ!OaqF`5U5hrw;f8Er6 z$>n1k_CZ$jSo6Hh!wO4sv)Ic)1|v;mkn0Z{oY9Z!2^xI(iA^#v zPmy~rofj-szS}lqHht|~zC7A?JE0Lhyh}ESFD?fxSQw=9LW`Ww+XyZkVjeT+jkIEs zmA^n84sH>142`b;JIN7bnuJ5-Jhd}jI5m_juK2X^q@OVW+xJb_UhK zLPF?;N|ow*BqUP8JUs{>tl9dVIiyRAwkU2sQJ{c>%9=QnO_hUuq7Xh}rcs@T??U0& z1(7M6k)5ZGX(1habs}hvLP$M=*fhvbaTp?apdz~Qyd<0O!aubM9zo+8{4D)Di599q zK>x~y7q7ycj{rcu4Jb+en^%B5AoIZBFZIa3hU9cxE*%1(Uw=~&gf<@orvrMmzOaYUoDTy5xs^dYL z2v^5DcO!Z%0i&I9s>BjEkQr%@KIUS>hzD=hs^XqP8!)b$tJFA57!bPBm@eD*Sg!Wb zIH0wQa-eS3vOkke@=L-{9O-%ZL2#KZsz135vOYUT_Nn}j!RLD&AVAeZ zR3H4a0HftWQU?|YQ&<(lGb+J!$bD!iz<3=-&%-Wfoh-P{Vvj6X8b*Is7>r%IvlneZ z-k6;1W!7#F?nr!GWgWCZWWY13q=#tYTFS(ES&9ByPK(X*R}!NG1r95O(bnDfj32jT z7#?{B()W@+sEoT%m%#l*Z3%jf*oo|sh?;hDYDu>&>&!vFp=cM@llhC9xc#Pl!%Yb{weMS zXOU*H5D(M1In)&@YH0Aw%b1w+fVlUD!HpD2n?Mo2v#=N7uxoH(iLI)%ih>4o5!l%_ zSkHDLY8vsTaS{8BJN6xu`I}*Upav8VHU1azPvNsI(8!wEnQu!T7G3lf_H*JmrP z$l$ynAEM}xkicGzweqO$K!6@hjk7!2)BDwwB5k+#`;pJC-igzbgo3rkS)nxj>m%>w zh~1O-$ci1n~wG~2Ge8dVXguprE3LRB~0mIxR&ElJ+buxR=SUTMCs zFpG4brgs~Bz^Z2Y7mgF&ZXw*!OGhvcQDVz^CN7n>8`kZ>9UIjQv$J`9@a`dkP)k|a zR?fn{2Val9KcP2F7-a4|o?>0Mws#&OTz@bBvX6jwsZ;>y?$AJ2nUXl>-=b%P3R)sv7&1{VrY2Lr9GQUb51Xeg&x#n zyxht&#^%Z{;sgem?cd324)0zKuU<}~7X+BD8%$ur;Mylpz9##;78ycb`^uV zli8;i@+>5HUPn$RMza_5W-NdcUIwDEu*<`;bbG((>U(%G!kAer&|M)3F6-gCOV(e8 z6-~rlTCIktSFG$wYR3RXlVfJgq?s1H}g)*HabgUwDh1o!-#1z-jkFcP`Sb%D=nFE z4U~FD9^3H|528H#YN@mc%sBmg*U4|lJgAOf1c%Xl1vGtZf20orI-=}uf11xijt~5b zTY^NByEq5IkQtpvm+vyg9Hh3(`X#R`nn2n-Wf#^U%b%UGii8Cyeiv#MEK6NSq@o2x zR>3#XEB0DY2*sDh@4!SNT`AgtYEseH;+`^5c_zz?C)T;heGkK zz%dUhN;4M2LeQoXRH`+21?aGoz_eeK`txgg(@S@Up$O3=oN6!R`o(&$7zp0T#OH()bq|hZ zIgIn;RCQ4PWe;NokJeH>vWW5O-Kve$?;ps;1LVA@`<=h}vlMzrEBU;^{`zK1pfp>A z1K#X+Kq30y>;(S2rKJBczy62E*1ypSNqF>NSC{ZzALD> z5HhR}XtkOf*#WhzOvlhKfX1zfaBdKPCk9{~<7p$MA?}ve=6aNw)@J7N`S$)ByB92* zG}aea49BX!61stKQpf-g(=F5Y>qc*}A30byQzUDq>DK-w+<;-z5?>>HyO>zD-JQ|) z{iS4VWjpRC=s@d8mTbZN?OEqkEH}8_OSO+-N)d4>9tg%BYl+5w_Q*Mmbq-Pv&+!4% zOZ6n=OY(-(yG=0r?}-j=>Hnu+Jv0rEz{j@TXP97R86Hme(f703K0T1)8jVgDG(-3lL zgBz+XI{P)+gnM4C;zjV&bw)%1`C*iWG9-)^M5L1}rqZdYxhuM?yh5iQo(7}31f_#R zqGw%uLcKOGenZPu8JG@xkB{6FAO4$Yq!*?|11^^#pxWFfYn0b%IkKn= zkRda^C$)Dm4zl(=vy&~+DJ~nvP?cA1N+t!v_ypa5#~kh!;>S(%^1mpzR($!}>;){G z_y`t&YXrax{NJRT@^(&u!Hd#&>wk$e{wdv5)lvh9xeV1KGxlSQ8}^e8cjW zH4!2}B&}M_5ulbQ7}7|96Vf=+3Ppdu!*)M!rc@W1YlZ7fERo~C$|PDZu?H(Aw9 zXEw}yJbpZ02KIdXeuw|U{H)tc{oIOfP`Fk6AtZTf_ z&yqB$JYQ=J^_ZzDxk>}BtG;j|yqHo0Zj&zLD`kq3vD6sdX|iP*)EY<1c1pQoy}vS7ZAVY23-z7}(1R8i%nq$WvwIYxHU`bok>He-p6cFGjW>=!t*&LsPxtBfnH^oKG#bJ#_aO&m4(;gS z>Eg*R*tUT}jd~|1{%T{=0h{@Pw8R}d*yP$-5;-cmBz7&%Qgah*8)3GTmS2Yym0^cq ztF>4)8!1_u40spQ7~tM9rQ+c!wp^0TUqY4Jf)zwYWMQ;K$r$CJ_QN?;R!H(n_;G4DlE-o&a}ydV zOKWJTYWxi5CL`**r7*QuUet@y)nJe*8#dfgK*%%9N#jAt z%M+JV@T?L(VW3#YEkL4F9ak;XRy1Z+ix7`1FDzRN-DmDAAlbuCB^sx=trb?5N43ZQ z8D6@}jaYzz3=p(RPFR$g8mn>)>ON=fAn+@+=tiP0IV5psb?EGMqU~?BSC^GmN)wl$ zHuW4b=0$VMTVe*`z&FFtgo(Rztb2E+q1$EWkrl`+G<1)cPY!d5EY50lXluo*DqQ@? zZwqC}R+NZ`mQ-X57ZIZ8E~QoF93v9ZWv^@s7e%&jiYOtI7-q7#wKn~sM2V#W1dhE@ z5wAkfB9gRSpKVSxw0Wl@YRWsZ`;7(l{1M7c3N`%Zhc4p$bA^pp74$ zxkPZBrT3`xuk%CWB$|z)c|sR-E2W4??6u|MB28nLAzyQlrk5cH@%vtJy7jDakCyBv z=-0P#xWBGohX~{5INk8xke^t9%dz=+p6!rqI~8OX5v*?QFh9G7`W|EOgb;(Q!;)se zz_tfxnr{=W!EC#%p=_~4GZ`t3oILDs1}>fQ6H4<7{seyZ=U-W%ie=hI7}Qph6g#KH zEdsyPVZtfY)EV$B^xhJDk21i!{%O2vhp=t`4y^Dn$Igg~l#|bo^>#xJ)6U|LXU#9L z$|o|z3;GU=V>BCaDH^BY?q^c(5CNoB@ZGj5;@dywrkK-F68en3R z5_+u$)3owviwvJ*RfJx~+lF9)pwGs56497MljwzjyjKW7BOr040$8|Bn(#-oeh&#K_6Q+C=;>ZXHpI zT2{yaeQ<*9WAY`fWrd9Ky`B0|{#VQ4Oj*Jhy*_hmcvhD4u_i3$xx=*$Pj zO~x8wREDyN!D9yVappDC-QCK{^%s}g!+`;Bcse#5mZeWWIjM<0A$&GATpovCseQa* z3k8A4$1vwzH2l#o0}afC#6S9!Fr6a?vN=*ZU>>u@gEq~~n?G}l6-S@uCV03Hfhm!? zH#m)JvrWV@4Z6t{KMbFnXYN+)`3VcRC&26-Fpj@n!kUjE3zG7r(HQi1Q6Knm<@vw4 z5;tmp2+P21Gp2xJnXQ_;eu&f{c5!3LYA~4aIIaK%F|ZVqQA!eYcd(033Ye{18h=z+ zr@}uwZcX1Bk8G6Oh~N+ia0`GFl0IuefAv}f+U!#dQ>WA6WW(tH#OD<{Cv%v~GN_XA zBro<^s-2p0uH2jyO31DfvrAVmCl0p`2cDeg66^3*J|Sk=YzOKnEcJKS^p2X&m#hR0 zPliH6Qvi2zf^HcLC_}`o!R-Ry{KZVg&v0jOU~1J_o#pRulzCGAedVMjYWoGEqEZKM zK~wa6cUyd8mV8B%tyo9LO;V*A!_>H5d4Rq&dBM%dqMR%$LdB+Lkd_xL_Yw9ngPJ2p zUnjZ#cVo51#>3CQ)|eU1icOq=8WREV7XLSUm;XVFw1Km&(Z5@_CMn6-EdWBKGq{@f z)7cV%EYcIdnM){Q3GFPGBbA4Hgd!l7B6V?2m#-~z#P6frPrp3qS0=EVWGirfZ<`dndgq_yKLp| z-__34E}sRF%X)ryAtMUOxg&6ZOPEML5#xs8oPp)JdhHzOjmEs!K@2sI$Wvpg+H_WjQble%_6Qk+#53U0 z#1`aDBJPrVJFqLi;7e(wgYnfkIFF@iY}UW+{I}(=!kk1+dXIqFeYv1aUHda9tdgrX zE8>_6HndvveMG3m6FpVy)mB3z*cQbg3+Q;40E5?_?1((33O>g2ax(6U6v=K>-o70+ z?`<^m=h0k>poN*(I9bZ{MDqPcx;cxOTg-3|?{lOJqUsLO3RJVZQN=^1OIs3^R$1=B zjtmL}@Bt`i@z%^|7~}JtSa=$_^4A0 z6g4GCMv2i)c=Kx|&2b~m$-HD|EG>UKiq6NcYb=k`7ywQN$K+FA>ShXJVz@TrH+f+_ z6Js^~?1IfvN#w+!jy1)1Qas=#?|_>#q$4q7dc`dgH|FB5r@t-pC|upCmI9Dy0AMKp zTScg3ZesFX*xf|U&hFpSZKM9hQ`&A^x*Qgannj@96yS>&m6nPiDKYY}bn7$RHq#=j zYjhNE#sAUgph~bX{$U{OYD#`NZyQF>+~9h}`IPDD`ZV(szvqkcuT24{3JDB~h(ka1 zWu($j@2%WJ1E3g~6Mzg&6i5!qZ9ErWqY5~rg&T(b%=Wc*^8^onLpLqwSF+mn4gI;x zNCneihHAwaE?Dynf>nF;hG{BXzHatyIz+^QOoxf57L3(zsZQFNN7;!Eu}q)J;BU~L zFq%`mJ23ms9YcDq{48#-QA^(`;;TDkCe|9(o843er?~4Sd@R&`YOzq=&fBM(TM4}D zq9K?jW0Xf?>$zDi)^@>R=Dhs8GH|az{WX8+LCE4c*lGD=GX3sH&Ezs!ep{Z>m4#uE zyS|S7G7UV>VN6mL(Fn8{*?FJLOm-&I(3 zKMyrwJiS#ygr)Yhqr45A@RA9-Wjx#whWx)v<68?iieD{~uEVzH^gC;ooLc1UDXf!+ z7eUt=-s8mWjdSLkAu$SBVPRDzgwBl-9B>$zQO4idrw;HC$U%=HRB(hzB66A4m7XO6 zMoV>j?81Bxqx(!8)Q~d#f{61zK_E*L*5OD$gFNS!B zn#u#s^$_qE>kw!2D3eKUd978q@9SuMt7JQK$xwnXeux>?N>dG1M-xdxb<)_#Z_Axr z)5X4pKd%X}e$|a@eER&`qN_7ea)&wye{Wxo=KWNX z#BUjFv_+Jp5>hZPH z(;g53742+cw7)c>?Bm~z*m zl_UgavSQ~LtUYk^-0+b>2Cus+lS0G{+hfuZ;<5vw2bNTOj*zs@k+j=C<4*qTXV<;A ztK24Hld>GZpG~Qa!8mi?G+eQ zP1J$hJe3zbG&I&u@x7J%@O*<-4N4|5EW>{1DFDr9526h!;h?muSugFa3d2*EkSVcCn+IFzEX)Bp4!-S>{H?%Bp35i6mzZREj3b!!YymP2Fch_ERnBZ ztj4YF;AyL@UTF6bgWQn0;35^Br3hba`47Rpf!s_iP_qIi(@cVi*##j5e^(OXrgk^K zNJNoiNF@xSe7MlkIj?-iOSR>4DIzXJi4Xr<`@o5L1a$A-Lo!v8ZnB$k@BBx z(u)_pzg7py;dIey0C@f(WchE#0!r2ZVI-hQ|7#)nKf>UajU=KRMJWGL>j*^w1w;}; zSg`nEbeOPCS`#4ZiRDIspgaLSpD2uM*z6BQ`9)!(iIi7b8ZW@IaHfs<_4qnQ?@RKp z@o#W<8tSE?CW15(m^5MUVImU?Fv+y3ZpnRjFuKOI{rY%qeSR|;w83MV1@7u=cKG<7 z20=Nu1eMkzed#MuYM7Dj*o$p5y^k3452D-tn|P7or58dp~Mh8c1Omeud{wF zUCz@5=-L35g1n}npEDlE`0To!pS-_;Sw^*=U$@K1c~Q&5$MDRnv{zSTxE}{x2W0?} zg`Fn*Vhnqn>5sZsm9y;K0fS9Z#$k614baKEJ_c@H5W=&YFb=dTwF7qRCoNeJhzjFU ztKf3E=RKnpo4E$E9gwVba9w|z_z7TyhanO9eH+l+QhO4>DlKSQFlRr1Ya$QkM8RHu z^L$!tVhl}TyFF>K#|CCots7=oA1H~^I%!}GvY2;Ba1-PnVR+4X8fI9aW@aj>uYOWi zL*q>u94RR#9ya*yoD{U}o*MidaUv)nB=}sUM@1m z@rByzSUf4>cy`)&2%-uYus&g7*c3`EH%dXMq=0*+4-;DgG#sXqDO`e*6_G0MP1P8o z-u?z#CWq@FSeQn9|Y4@md-L`$zyL6UOvl$M|0JK3Rf}oIf*;)h2V!mg>c}G~`vB4+N?Wa{7 z>_~cV*QVkiW&16cp2D z&6v7btcw-6Oz<;y2YUP0faYuW=AM1cuIw!%b%ypIVs=5~w0*@ftZ#j4%pY5N)w(gPm~Y_!+8vTd9cm40;cXa>=JsvPvZG*cK50E2J=-=4v0Wxhr2+fJ#&c#D zNhMDAkOu4Oc4fwLwYNAj1?H|L-Xe8~8aBeMlrX3<*us`coSCGiBEJNXe;KoG0yRV( zeqLqNF=a>Z=|~(rRgprRT<*1Su5G7QooLRR(72&UI#TrYphS#s;C&GWKbbhTmv<9f zC_10?_Du;~Uk|ZO_#RpWhS_+Z$PD2Jnj`TW7}1`xjMT(WgpR<$n>edy_xg2&AaHdA z_jcy`%)CH~ci+xVCRe}bHQGa_G2&A<5(ak)H)$7&!D7K@wfC=OX~_lX^3!n$epF%l z-#|2_K@x6qP(;8RwPh@PAsaBU_2+rOxnJ4sH09G%2f4%fcPPWcqSN{FLSKQdLfgzW zZeWy>Hve|r3T0Z0VgR6+4zRw!`HxWi6N5HN{|wCNxJ)*&$kU$?0YPcf31l5+kD5aW zBSA&Bblb7fBr`d2Nxra^09eAB6U9F7RD=PvCZ-rgR2B}V(`k1)(--$6Gc`ZI@bnqs z<6XT_>~DiyE<3l@EP(Uj<)7vq65iML$*-fYQA}g{>l6vMDPM$ATbeQ3};^R}n6lK(nGH{`X zt{-mP^CA~!8%Ti5$rBaS&EXn_C!Cfo>G$Ix$%WM>bD1bLJHRlizQk$ToHl5hbk!^% zwdiC4YEt2eHk<%%K|~`8R_x}PKf=-;?JsT(Iau^2rhUF6An_;Ait*SqEU!Okl9eW~i zGByXb0vS`M9of*C@1stKX=sbFIp2hO7J;kUU|!v9_LJxHu%G^~54dS>WWy1F45|ho ziu6AsO2o~`7adUx1rDc-13?QUB3^0} zEuK;9kW$Q6zY_Fx3hfJ0KKS*DM|o*2ict{5USnqR<8F%oJSXL6H?W&;hqL->d7giD zvP`!VFHL z*Uy+wW;`%&1N$5=z2wX{sd??xLS@+u)~!L|eW`g&k=say79>J9RJ>WC&+{ZYZByUM4p^P7-~`uKh`A5Zp@oA} zB^&5_t(6c-xami}k>)0C?KNBZ$q)RlsO$&;Scbe4NbZ-drmSnd${jyBM+A^@!C`%O zatg?M&GCl3^HkOq$@x(y($g6zqihiHmR1>z3R|+8uZc{{l|r#m(t+fCz73k%@{U?G zBibWv25rKHOT<>z6Lg+fHMJyc1x%(%3d%ewJG@B>JCRoDyGC|I#mF6eI=O_Yl(5V+ zZ*?~R66|^nbok9vt5H5B-4kpnW5UrBwt(^D8KB zU~6psuVmby*fCikK>$olu?IoFlMkD7AhdFXsmTd5q}GDY0cT@Tki*KrV|s|YvBLBD z!kbhw3e%C`c$AgbRD68&`0(|7*(})E+3X7nkn+3dk^hl{@&}u6hSy6PO{af$*E7Pyh z`oIIlv)EU(7Ds0p=Ij-{Da!ec@+a&p&HI)rrx=<6FQev0;L{h)C?e#{ZL5yY&GLrj z%it=0>evmZ3m9@1!vwo#xHS%WBy0UhwF46x!dQX$0u(U`{{WVf$5@S$J>UywZ-hFI zLBt$2uL%dvCpf{;eGGC1VUD4-znxcc=Kb)S;B}Y%>HZh=?Faoq!pXGsK>gm!wstU;K1pA}0PjKcBdQy_1vM zqZsFvE|au^=;T0lW=F^I)m7IRfPeG(k}6CG0{Yb78iNTdgoPJ47ZhS`y2e~Wj7R1* zXsjy+zi)&KISh*16&b(-rS8dQWx{xk zuY$X&eZMOU6+)iIq!OKN8SM^e+|t%WMZhQ)XU`4m-2r?9h7S4|LD9233 z&x)RY``cDaIjpDLjwsUu{_eQqWfJXdoU68HSDjYmJ zrsVMbS+rJ~j7}xa#LBp;^F%o}%}E7Sb(2-YHN8l=*R(yZoo?=HCah!IB3hBB9gZcf zF&FB}Eta#Yv}BBG9j{U}O|10X?0uWVQc3|RRI2sdWP8+BTLf2XNqoO)l>+_71l$T9 z_ddQEC$QRYCRof-Lk<03KjXnfYYhpaRDgjo4q6m|?VYes3=;GgCW>QZ_}f8=%qq|z zk}FtK%1@<>HMyt~n=k9dP~}>tZObe#FQ>9yJ3?ibDrrF@JI!>QK+mHiX;TWU z?i=-w=;FV6U6=_+dV=J4@euC`27ZTK5oAxmAm#@s8O<7TiGTT}_A+RwyeNm`_sQ`8 zfU!v4DlSir3D7^3hgPlq`X!~qDiO=75RW-{)7x@5j#2i>(z7YLyN93QEl(dE8Kg;zdH7h6OCDadFCT3SWH6$WP zSqKIUyo9vDFHq~hN-^@~g+TlZzv>MbON#~rro{wv&CTB|s#F!UQ1KsZyc*Gz!HBE! z3YV5!mMv|pwDfc?d#acCmq?3$@;yy6B)||hx=f{ePV<`OG(3GwZv%chG?U{E*X#8* z1 z1%m6B^~XwF*~>c@P($2?amF#hoY)!2W797(T^a0RN)KCg+tcQqKWqw_*Av1?h;gUp zhl$5Tup%e()rp3J$l3JJ*0IX3Wkie~WNx-;E52=^I5dfJ@8>DoG366-Y8u*C*N-lX z^QinJnOPb$C&H9@pdHt!r%8i(2>Te?Z}?8><3x)RF@``(L*Ixgf`+3MX0Zmfpw}eX zyv!cNCYC&8h!y_Mdd|9vg^cUeP{@fD(|B*Yh9Xf7Z4+)^SjmY9H?$lQui)MS)X#~g$)>loW~>O--?I7a?r3kOzAaWc|MAlT2k{&3%- z_IzHhM1zopFi&uMa)Q8J?a6pqv<9J zk6k4R57Y+j?;L3}iG|r8ot81gTvDM@aNtO>V;===4j#K{_VO)`_8g`+K^?4f88Bkg z(NN^cM-bUWTG-D_(<}_WW@DXTa64vTKcbIWl%t9U1c0Kz&DN7-@YC7 z1cCu)nJ0~S0AHFfGT19ekw``3M%LfPQeYXP()ot?>Fue3Wsg9E{fPRB;f6?$>4r&f zo?1O9-ieW_CR5#xHM-{1LkizFosH%7g6q95LJY^m zOABUFCh@B1lYTjCnZCeu`m4cq2Coe5v9nC#$SGsALZD;2DOG;bZW~@3p*lR|QEC4%o$4>KoF>C%mev(tI2mV<;KoQmDOvEQ%jJ-M_HcVv7vDc{TNZl!rVZZpAVhDdVYo5Cx55)H0dAHM>Ot%kot`( z>@m|#F9fNbXmc>?5WP9ZnBhgp2U+#LDdbhGu!w^rP#3(FIv6c8Ah@cwRJ?nF{~@Md zia(v)E5Eg)TkVt!)}*a7QB$jFB7&TggadAR#|h5&%$T6)h_F*)0?0ua&b7sF$__x? zG$IunH{gy$cJdM#Y0K&F&=$KZLHTZ=GAwVyCz6G7Noj6w6`glU8)BIgoE_}=g$@>$ zt!66zR#Gmk4f{g(^$QQyO9+4E(qms~fzcJ1*jDTc<0}7~xNA7PEGoXve6F1q|X zXsd7&oRb0b#uQD!{CeVXN$ZfLPm0}t$eQEq$wzovnANkUm0PVMlr{zIJyaQvABlBGN<>3GF97g&P4f)MB6F7i?J4(LFB;D6dSwG#ZZv?Z?P*6e+ZsJ~Sl=+XrFslXcl-t4=f9k4C1b9*;X|C}xcuTox+JlAaK22H&|Dq&;t zgGQfEiAeQ9XWpYDf)8x9MBb;2ggqI3(F_Rl`dON)PrOoH>y-t(!B9L<+<);+2KWQ^ zCj&bj6EJ-G;X6!QpZfOCA)D~kY;sx91rAEsYe7W`tfUUcyD!C!_yVZ!nVM|0GEYgq zFsnnO6^vwMtq%+J8!FlD&|amN&2| zBVWQ%O&d3IBGpyi=AJO0m@;UPcvIe7OzycuiVc=g76_y@VatN9AX<}AY;A;1!P&Mj zgC|gGcorWRDV8;A@ZO4Dq)nYC5h z&J>Nb!aURotyhytMmwUr=81Sus## zg3DI&L2*1&%cw{UGF-!soH8XXw}GP*RZab>Su0F~?5df)=ZmX=PW%VzX2O(MOFYIw zGq|He-6YfC*M}f$N=N%E=EM^kcDnL4)B40m5UqfP7_-^L^4jt8ptaEsGGup`u+B%Y zSHc?FC$xiKTr^{jg=U~-S4-fvu?w;_3+dUUyb14E+Pdfq90Yz)uJXEMch=jd_}j-# zfUtS2P3taO-PG!Gm7y^u?t=%Ic^_=MKz62pzE7L-EWqA%$Ihq0Qu@ehul)`w-u}cz zSHI*vm0I`kn|D^oBUts(@wIGckkxNNFW&88+&8lB484Jvy)Em`ryb!TbGmBH+&!IR zzLbhH+TG_?=i~28cKv5`nVc?4KVT21+W5{%(E9E;$DOs)+RT49pjQo~nu-Q|BBL+@ zr!Q7X&9phE;ru|I`i<3XtC9{~DW8_<=*gQ!f`_rbfP(=AN2QrI+8Vn`p=P51m*X?K z7Q^vUhnkqas86fpOB?kw7g^2Bu}<^U$h|KAh|)ZsCw+YhFf3#V_fn#LN3$zHs=%uI zWTbO#{rFq;4Jf$30Q%E^d|?8<+c}ug8#-HASvb)H_WW&~=*cH8^uS;KN-&sk zLmedp2!=`k6UFi0ei2Z<|M3UDIhYt&eRKc+*cT=#>im&i%DcaE)NG-rTAcI^-eT^X zFo=k-AxS7a>9?2yST>7}+Ujqg<@pdEC*b!5`P>~?;*`U^lkXf)nQ7clcjxcGy?FHs zB(;Uak%tuD)aPOsYsYgr_qMMfLkya%xn&x*ZJG+LpeB;80yOTUiGxS$8Vf!9zqdYs zU-)auSg^*3G9OsN_;pA;Ky*VGYK*90Vvfg zkE&|eDzlj9pzFK-C2w6^gW8N2krw7Lsw>unu5a_AzkQK_5a_)MFJL_=m z9APblsWcksMPULXn#Fkh_(TeR6BhCQ)pxKX^SK1NeK~7Y9KusztkF-|=w3p60!=g| z*`(Z6+>>)b|KmpK+7dZtir?Ik)z~6=fMth8xO~hQbTs>0qDxjMm4BnJ`j1!43s}Fm zX=;BtJX_77t_v8ILGzda0{VTmSbSg}>S&EUrQ~^eD96HM>Qtw4ZH`a>oqc%wL1;S9 zz+m_jWU$(u%Lw%Xr4ns_htq`v_P>7CX+EDFe@Hok04&D;YTx`Xko@~+{jV{Ljh%~$ zkb$$K$)D^-k@BD6QRD4R)Q2`Z`pA0ni8chtpdjqd3}UGk7+gu4 zp^?Ioq62?S5jQ6cMG1x{**N8L0L|GkC;8LkaZL^X7al=67(@%um^u;z&3+|NL>lG> zA|q|WW2gxAB*w8{X_1t{R!oL4D<*@Od?~Sr2viq|5hg;tJK0O-%~hSJEi_*(=j>_N z_1Lv&D@gTatlFELhWPoKyBe38ap=9xxmY*KidyKuFEmZ=1KmwNlH>#J_HXD^6{1UV zD;G4Dr93^}nM@aM*$B}eIlp-5tgf%FjNh|**5+NJo7=qWe6kAJG+Z%nr3v5i&xig# z@=PBJHRWE8{#mMSyH>eqA+q;d3LnHA@^aKVL$C zxXYG+6cUNKjBc%_X6s^J57HlTNs9IfS(_H98lABMNUE~Z3cPP*kd8Y(ed;_n@3U#YtSj?u{+x8ho92otpOu`%+_ zamI&Izx#f#k5JNybY`6X&N6K($}Jpd58Xnz16Su6c%i_Bz-P3B<0m%=vT4%RMlX27 z%o9CCZ{%A;g~<2-+UFQb^J7Qx&Aa|g1jY2m_tm1`SR?$yqCV>n7YM-G20B{uh$N*-qc3Vv zQ?1DCOK6=;L40~T0x~{f-A}aEJn9Y7H61|U-;Y|$g+BxTI9y#pp+IQ$uDZCHk0&S7 zvH%P6pCGkSA%LtuQ9>gr925J^IE666!1BlrrmL~lWcwV#k6`>Ku+HKKo9Wz678%$>u&8SM=tvlQ9HjJR9BpV7M-D16HL2$no-%I(Xl zGu~7_TgR$gH5Uk^%D1g7M1>lhZZ5G&kHyI;$I(Z{bw;}r2)Rq3kvax&ePHCmi-uGp z&RuL+!T~$;1M=2=yeyJKLUZ1$*qDM84}ISke`~DGz;iPKK|rJSY%skUD2VPwcU?YI zq50%N@6Ic+s_~fv%k)9vQK*Yb_94YX(Gm8=W~68duwgEKs)ZQr>-GKEbTZUqvU`a^ z%Ydkw?(AtIqV^we(;TjBdUP9SBxM~Vb;k~QF*(=FNZD`?RU!V3>6M8{~D zRJrp@POQgZ6z0xO3FNPJ>F?Pjzj{4Ua1rJ#A5r=g!VHZpmiqtUasIajqo`OxsR03mpr3^n3xh06 z+gzG_1ejcyRSiQ6r#g;rLIhMK?hC@K8GeSG;PGp!3KzQy&L9$jwO{hWRs zImh-Tw$_}jv&{Er1wIGU_Gd(qph-xrMJ?9Axi2Y*n+%{BGx>p^Il~?U*@T=n`j%L` zPy6dPum6u^U9mt@ii8tGkByjm>N)&|d8h?Hj3;5Th;EbzFN$l3*PdMFVK9?gdY2Le zPH}G{5*AX>a zWuBgr>)S-F`X38s87{b&_zDC;Kx!Pv>Lb^Q0qtb)pPwYZr3Z* zrmv;r22?jIgAQXb%J9k?aQ|c!+LzY zo#jgK5TL+kDU=_^*ZU92n8qUO3OYB}>rAJcHnU=YiN^@tHz|O3F=mXSxItKm39hQU z`{V!;Y=wond-+~k@CoKJdVEN-?=D9asZh0|-Qwi=-CP`2>U7uv__3_Jx#93MhJJ1RiOyz2FP8CF?q_rvRp(2_-GQ#r1QD3!~` z{ZnP|#4}?VNC+*5X6N~-LFug^MOl58+Iyhs!Xd%HR>U5+_$%}?R{rC?FAX_jW zIqi|1-oUS*w4H(4dX=5Q1TAe#9x!*_e%S%r&i>Vf@jEBOWqSn#P)(~Ae9dXNTL?2Y ztwOsPn8ns!_fKU+OR_y>cx={Y8%Nn@)#{p_c3JA2jN})s(O8_K4oV|5k!R?`p>Q}W zqrC!@>}`Yk?_Vs8lV8x(4r*9Z5B+3`SdZP%Ua3WR&X~qjh^hMpvv~ZGGa?t{cxsi* zb?O%8no5B)`kDJ6SG)+k0#?K7?BGn{G=q^tsQbf(^Zt&c=Q8(BewYQRdC>=p2L7%I zizw=lRQi}2{N7ul(dQ3z)dZy7t>LXN`<%#}JpmYH{e?*fNW*S}-HjRLgd9}qrv&`0 z28mr*0@2U$QR4U5*CMe=y7!L69=Oj$qhT{VhfCu3z=tFrS+koMOR2U5a}Jy|^;Uxv z5m0GAmR!|D{5DUbV5vtnNhpN>KsC9AM$zJgSH=t0O-+R-z@@l2=n;mAC}a_x1S0C6 zk~O-Wi2n@mToytvHi!BS|MfTh>A&g-K;-}9g#~#2w{pV5_OGhK&e7w)6%^S{O{srP zE1vWzq(3ADe3%0SkIKg=E5VTp-B{6h@WL+>9G&uJ92(m_Ig`ft_vOEbl#j*81@H{U15^GmXH%Ug?w-WFf7&dk+w-w zD~=EY_NjC_o)B0%O6L-00@Q8?xHi&gQ_x4>zL#x~dJOZVdZNn3;x0u)t4WzLxJH{%3y z?IO%NRVoWW^qP1=IOW5WC{XMQj8}~&Fr>)XYdLFVl#-3gtU>;HL27eDlkXAW$RJFl zupI-#{JZFGDtOfm7a;s5A^yh@6tcE3vQqZ2|NpC+C}k@pOf~eMsLkb4(E8Mbbxo{Rf@Oxr1XMCNtX9@%=sganH)}P zdif-G%*; zF4HK}s>!Wz9}eDKvcCeT5!5hBp!$B9Km9=siZHS?d8#sfk-nyYav#hDcS0RmUlrMM zJ>u}AWfd|FGd%p2=ptt`WmKt-fpS%ru#riJdn%8I1&#PE#>H6EWj0dt_6H(FO|D5;vuKQ>6yElJK$Z85-iT(5s(^wdjOt5i$!VONXK+gx*q*Rt@UZ zeX~YGTGg$q+9XlL(dU6whk7HGtC2*16m+soaEpbj(N3|BCv1l@1J)EKN1Gt^oXHAX zWrE;RCC>@T?MrpwuQ~dNkc?xgx=zy-BbEv4)sbb%Is-K-XEIkFqm(Bs!|a{vi{%Jk z6p|>PH*Ly@q59IhpHg9Ak`Ly0mLv6pJ9)vHxYXSd~B zO(xFz{Zy=HO?j=lD%961SI}rZnXam#CmI&J1|BIOX`dVXzwImZ8TpTZhJb{Cih;;M zWFvEvxNF)g-@+K#{K}%PIxX5MX@#cDTBK)qd&m-a1;x49^OTY7KMBOmewcmnYNZ?A z5dn{RZQqL1oBM-n%i3LF^Nto+&II+KzU$GBEqF{1jrQ@4gOTA8E}QL(NoN?53PYTX;JMzr#0p<9GOcHR?qO&2m6L=Ws*yMYT!T{+-iX zNPl+b>dv<7PVPZQ>#UlKH!$A4k89b@dfScB9+z}*pVB7rxudK|N8zjD z1m(b01q??8ckAtJkk4+s(AQJEkXr4uUGim-jwRI7tAEcx)=l@ZXUKJny>LuM1TC#6 zSDSoW>-8RC?+|QS1TU>ErS_u}LoUaGw>GThG=EwJ!4yWB!|%A`BgwsUqp6XklnSl% z94bDw9CJ#wmZo03LLKKv(QO$qqeHGUCj>5C`(~o z&radRKwUzXb7HU@;yMn{6t9uoMWf$+P`eA3 zzp~Tc!7VrO&YblYEZjnACFhZhJMZBCD|Q5D2yXhzDQf^Q5&ySaGyhDWLXHNe&VPwk z{R?{EQr%HPQUfU1in}J%<_8L6RW->=66h1I?x&MJZIlz-u!&d&hU9Z+#~wt^up;U z$1rmYlrgiaExqfcEx8X7E&;RW=--LxrM60as(#p3!I|uw3Y2ceb{I@!-@fUP5wtX= zD&+}!w%LGFb6|@?Y3Z2_L?6sop?Q`0;|Kj4hLLDN)ayK)WX&9%lh)t7M0 zR6~39MmM<1?I2H#hUYtMxUH>`Rt_yJmBl4|X0E~c6gBl*Wur=?!Uj_!i3_$ur$u}0 z=2L%BD`C*RU9T(NYU{W3jIQ1;f+B&Z@6L04ZQ+?l#*M6E#I+0Dj6o z8jBW+;M4saZZ|_&PhOzr9+AHr`I_c^+KOnlZd6t;og4zIambz#sqB;Y3$s5vtJH#` zrhlL;0{QgTQD)L;_Dk*}i8Wu>9qJ*PmX_^0Or|I26eo@4g2}~{;+(=yt~Ck)y@8cf z<;t)f&`sRzC!%{Y%Z6uS`Q?`}iluJ)K#~D<&sh#;$!?~P&SY(i!5(gOxdiL|E9TTa z&}e)P4@x?yn-%2Vpiqsg=o@D@Vye$k0KR?s%yDct9p6vqh9C|ppnxS3r#jaTLtUM6 zg@8XZ#&(UJwc>Ph+eB!es|x-m4bE4~_g98()VBu&TaS9y=+`MZpJLuB0dm1b{tBQIq`;mh|UZ;|~lE}NEol3}?O=k^jq-T@E6>E^YEk7R21!r13R+{eOtwi-@Cs^Y}xpLH23 zmNQyHDX4ue%p=eeM{0f6C^Ipv;(8!uSx$B;(U9o%jfUnfZ<)0~<{VB}&&@g8$O~)aS&@p1mP*4-a!a zB6rz0;`L%A^6B)Vb+==12@a1d&+Q+R^bxq+FP6zGatA6(Yw~w!J)mhIiUz>PKmdU9 zZxz4(c{2z*8kqeHHc_`#@l-C$FIACnc`Bf4K9;>9I#0@=(Ipd12+bnIRJ22p7EF-`}lKl0sl?zmK_|Sf^oT))i z7z0Y#wvif&k%T3>)I?$br%=C8aAe!cPn$;cWf;EGi>=d_RY(^vW3Rkx_su_jVV{(> zui#{OS6~6F=Z)(y^Oh$?cf}@*l|3@*X&4%|#_$-*DpHz6*Dp8L!SQ?Uu3VVTSG&FE z?ao9)#&0(mx~0Q$EcMPS_pj|3V9_gf=8$Jp!8;9`(J1VhE|N5!%e}{KzUCIe#RnXF zs6xNvtGzTs$_L=#rc#-*y3K+V_@({Fk=9ISvQYVQ%4|I5a?`}GQGch%@IiS#RSyKA zeioi*$_k`?{RRb%kvCJ9;4jOC(&>|-rXtTR%?%_Ja?r&VYCn0!{oPS+$<+VcA?8X) zEHh)OR(GH|U~o{+$2haTx?RXtIy->UjOO9=%RB7t9x*47kXYP9ei9>;yvs&ro(-H)C2sSPuV#7Vl^l7 z=s32SUfC}=wMdae3kj2Wa)htK2_8+zXR4mREw1Tej5(45@{Z^K&f52%(Ix8QXbWgq z2m(I-CG#Yytl9p>T5NG}70PSO!&-m14<$sR8;vj7;w;D7Iu+4ST@La z$M5G4f{52EMqpYk6Wr!bJJCw!D*gCO~8v%+M1QYh= ztto9t5rB+KT$d@#5QgHnSiNVqDs_UPE4*~GK8-l8q%d#IOu8Qg-Od&x{A zreBF<)&Wzwv~z})-SoW4G)YOIbY!}<)%Z;Py^bK36?UZ&dt{yTEr~zA#-@cZmVCAP ziUtb#K1*XlcB=ARBpLdvyqTd%WKq>}L%FiWxMTU?Sa+@54$~xr+oveqf?Z2=%aqHW za=Tgvb_Un3RYyOI9J5%3xM`U8oU-lU4Fs$s4rNrC+U^71mYwf6+F|+cX4|yj5hD!G zWoI7D)#R<(u!H)GW$u9nE84rsq;2%K;A?bS5xWt30*weaMu$fEN7Z@|x@J_Q3As7T z`Y73)_>=|dji~(`ScFK{WJvw_qC-6fN-H+ibuSgjIRn!7q&E?~rtQ^Lg=~eIOJlBI zJddeR#YmlqghD|~GgedW7F8Ra6Mnb($L{Ksj_N9N5lWP@1#&|ej}_?pb-@fMWcG^s zk9N}R1D(B(zT60YcSfhtN#LmmDgkwW?3@ZOLVBx8+=HwQu;2R@HW5bXpM`pWd^YLN zaIZBiEw#?Sm#Orh*e4(2YrGw*iNjkh=n*ug2|b#hz#%LchR8D?0X%szxCYUQ#h;X_ zzL#edaGH%_7IqM{12gj>iPA%jE^uU)aC#fc^4t$r8Xk82Vwj&4Ad66NxPnH+(>y{1 z*t;oJ@ZyW}&@RY}}H^V-G& zSp|u#;c1DwB9I%1nGU^`t>hs&kZCIoIQ_-Br4J2=<1i*g5yC>kxbsp=bV6^j_WGUT zgcIrGro;(7nGr~&4?%}IF9i=R`42Has{XVc0}+mk5f51TZ1o92))zVypm0&zt=Huf zE$8|UWHf5waZsdvTe}hOdJlgjBZe3JPA0w`4`TcEH$kWsE!??NK%4dzaPa=EAk=?5 zbRzD~js`~m#js29ALM=?tPP2T_QpaPBuOY_$t3hrgq3{BUy2lp{7I#rJE`lVA3x=tjBV?z1L%tu4? zvP46@?TdffA`3Z zmvpgjZxfMHwl!u|Pws&S7N`(u#RKVxuJ(=h@ron{f#)zP0>R4*1{!0H9_g7;EsSdi z-3R4)k%g{S8!6o*1Nb(J}5n|Q>id+W_YSpGiWtEuu3HGqYHH_;|e^#czSke zRc~iSAf;%>OIy{0Cu+ZZ-#@ypY zw!v&7u#DBte#fPz@7&_9WZLO(7f?WLCs0t=n93RW=4pSoGG;4dvQKDNEt}!YgI!c0 zg2$frlsCnp7oRZ&v-we?AG>UTQJAy}W`pP$szJuBbeOP`6#a}6G?Q`=LE36F+{Prx z8oh_w>=<5kG33=Y)G{|o(afhq_2d-M0(&uS_g~9|5AkW~GXNMk1+FXQI3^DQ3Knk2(IYJSIyWN+sioi0aTr|)w(OK$r~;H27J@elUsI@xUPZlKtD zSoKS&knVuW2KPOL8^k`hwfw|n%be2r(KgQ4x;e`;SD9CpewBvOZKNuL_-C^jNA6jA zgfuU0-|Itug?ejyg%F0JkYdG^y{N3AY<))JTeGZ~O4Rkjn(vuoiH1(tFxJemc`sBQ zGkeixb*MCm75@*(R)w9mum;Qx8yz>0AGn%p{suu@!Wdy%aFn`iL*z^}PU&b}inAdk zpj)R3_9Cejrz*9P44_c$=%RFr1ihF8mtWT41IAMB1C0Zz%Z&yX{$1D{&sYd9C8bQC zNTg>M$pTYBfd&dcKCm9c4bLLOJUsRJYYx`Yi>Jg8UROOEMZg~jq`g)Sbh1IPZ+X;mBC?S4an(x z*kJ}zVKB8O2j#lJN5V8iztJqq5Q%oL^NW9?XTH@n87q*L^(s*9XW4h|iju&)OMBO2r)WLK*$T*VWgi(@dA!^X2F3vs}$L>AdS;;0|2x z$VzAiG~PRXpcwThWe^_b))9=H@>JuW#fIT&N(@u)+Cwl*HHOJ;HHOg|@(eTHm4<#A z%5|gO`G#R0xrBq><%E;eW$LE5oj;=IcC zJEhBT{%=tQ1&TcC+%&4^eTqQ}RX#Yg4HDG&^7pWcz9w1~fa*#!NmA$gT=dS~XY^(lclVft;4?(Qi2r__C6+60%a$;?t7T64O$& z;q62Zg+@e}b>@fGn15;~4iWw7@P`8b@rqSzPmx3QZ);(T$j#^KF9qL$4Lk*#An zhf)*nkzVAFXL3b^d47(Z#+ZA-f}gZ#kM9uwW^K^dmx^2{AU%RgFfZcU#l-3OM4UeP zV%Q3@+2-U$JEGbvNhm_GguG0Ylb`kNMuq-m(Zt6 zrP3O_m(y?cKblW<>h8T78}``WSWHcR-veW5v0n-7sP+i#AlQ_t(rMM|@2c?#>Y&+- zJx02Yws&iS+q;H*_FJadthFafC)MU}Rj86`W!Ss6`nfmUbgehqvi>MB%4yxGwZ@9Y zOLfsWXJMkl+Fn^{S+Fr~iF{5XUzx+-_uYSEm<5QX4_2@vN(-bWY6B!EiYpKf>lq@8 zH5f8I>RaB#FnXVz(WdA3qdy)Og|kBI-|^njh4F$V%{={4D(;KCPJC8tJ1GflgVEVh|0yM5$g#;jh-~IR> z;otwdi~ccp_?NP4Np(XB$qf06hFBxMGFM@-6d7gk2l<_%*Il%>v?Vf0XwvdNB5FMl zq%Etw*2a28*G|*#qAXdnaUm=`jo#&qbih;j!$eLpUQn!m!L3`-rEA4+e;*nMxSO z80RqJ4k9S%n)TD$(7X$8fD+KsItR@FkI7Iq;m-2`PHn`y^w1Sh<)XvK+tz#&P;SH- z^Mbg%&DGR$u|x`zDzW@y6YZ&UFOb%R14~C~{)H`n%k-2;SAzLIMjtd%6d?D*!fMlb zAkCYg(4#h2p>+H0OLtMcMTxLbwy_Zq8;zoG6v?twnj@{5Q`5Cz z=x2Ucj6Y_F*mJSc&u-H7F2!LKvo8)VH9AtWF%+8n+|ROSf$XOha&OaFQQlMurDQ8o zNN z2=lvTbIL`<0JdmSo+%|$PkIy;(H|y63Hvn-ExTs@27|KQ4bneD*VGNh+**d(jsE(p zMRR)vK6XDn7iUQ=Cj*5zbWYkv0L8MYzE&DSLy100&!)G)>GtY=+Jr^;I+ITUlKq`> z4ehs=z{~3*4m(*UPhydQl+nY+!uhIuag7Uly7gA3vJ4XKVN%E&dXJPbuT|oGA4t4h z0YQ)~Y2L)ya50ib0_r>j0!SK&1^(Du1m5J?$q_7!&NP9XU4VEMH_aXs>Ib%-c<4cC zppmp^D)tB@q?)}-KT#=K?Vj$93HY=kEv_{#)T%BVe)2L(6t4%E=wOOTKWY<%%g{#% z@YIoGxnDQ|LX^uh?9(uu*js6N)sk8Ea7Vkv0b`2&pCSr8lgCF` zLUoSA0;QYGhDaa7HF#c@{MLSnMj5&xY3xs}@m)*G(_g1amdF zf+ej>wrt!_;X?zpG%qZ5R%*+aePFjWAehvdBEm5$YvCx(cGH5aP_IGVZ4nFOe>ws2 zD#Bcn9(mO!w0;zGatG`D>f?zf8zpveJaYw1sTM48ZAqv5IqflScsAZ8fstw zr?MB$;XY91bQ^SWybIs5I3<)mP;WoW5^`=o%M+5GA==8pDFbkhb5LUTMh?To&JDp4 zj)k!!Z6IJ=6FtTybTrLz5lly5TBCJYs2a_?g7pzQ7*7Fk zi;eOM%OqY2^*#~kzx}B7fmr1Qp~g$SDAs~IHkdc{M9NEYX&q?U?J(flWq^}I4<=FS zWu(3}ZtmrxwpVe-oj9q>N9L0ctf{{fv-akbc-Zn}<&EflE<8gmx2@$ge1A~)7^pU7 zB9$0lqCc`M6#wlh^_y2nwKPxYReSU3fJS-7Xeow-H{0#;ZdLJRUGZH+%zH-hWvS?8 zBHI16TSF-~tB|8f7fy15dl|WW@bZQVq{EV2!v<;{WnY9Y3azg$4$-*RS)N2FvZ5t{ zKTBwfIUwB|cl2_-UmX(No?Y5WW2-#EEz(X%0$fl_B{TU7 z4s^{9!X+Ij9lO6AhksYm?ha1h%x)uaYjNZDmoo_bt_HZh3&jha*sT-0k>3V2ebgU) zil-aG%87o@yUwUB{Y~UrL4+r~@*IK8CSt5eVxUjGy6Z=v<*&%yDMbE2VdDWm0&A9W z`Cimczv6(tzfZ!42hLTd0G)}s|G6{qFR97S>0fC~Ns3ldSO8`>n{EA==|u%y(;Y%i zm|*jZ${j$>7@}wv@pME2+u1oQXlgLtS4FEVcNT9JPsP)$!4gx*N+Xryd79(dVKt|x z+V|V)aBv9sF|>W%t^tA+YLX7M*QnvpP&( z=T}`Gr)fy+hKgnyPrs;1Y9B93f_uf*6mC!DDv-jF!fVc(E?10smu=AdLO%cmu5DGVse6gY!zuY`Ni6EU^ zEk!kkI}vi^*w=-E`S4rXTtM6P6Z_b6bmO!1pNMmMBX}bUDDVZWAy!iBgA1FQ|B!Y+ zWTcFGkF2J2Shf-KB`Dv&Wi}!@9Ho?XC!c54*atT~0Be#hp|!t1$AP{f!V_!ruIy4bXo0%TkB!|IF3-XLtY>0Gusc z|20Coly&~$jV6?$gIcGuUf!ts=7)j`qUAHdjOaf`TF4;i&H^pFj?ix9iY9(w$2ccy zv>)&vL^t`w!p03WJlE&xEH8j*pqr`h$LAeVFYl9#wc*4dt84sh91Fq-5pV|>E|WRo zAsI{t>TC~rI*3QBe0qHTJ^+- z<_;tfF1`2Ul*SpiB{XmOyVk(bph%MA$0ditP`9K(w@gQw$Bp=cqEPF*z5V>&&xx}~ ziUeDCosu0_Z-SA8LR4Jn_;+dmyLTo_9>zl_dJN9S`7#h@jeH|XdA!nGxdDsJo}U4@ z0Rtu_#(Ih2AvC1P56_)cfys@+K?Ks8=%Y zSH2$^MWVcH-{1l=3^DpswGFKh1!6H>I}a#*En1w}u!iL}33}6eE46}`Qcd%vYnH)t zJ(w)PVKa(|Y!epLOwn?ut+LhcmL<`EJoK~B$hg6Wv!2bCKU`hWnjXcD3Q77AKb1H? zdeIH%uY~bqnL98XR7$)r0njF;+1Qck1*_8Uf=`dEQ_WPdY@XR*}*Tb(4zT?R^70y=mM=lnQn?f`ctD-~Cl`y)P1T-G_^>Y)$h2=+tW7~F4zW;4nOe%t5ybGxIbWAY;B>+_ZCSJsO_KPNZs9whhKkdpi={rS*UXahkXSQ0E52{D5z zJZ#B116&s_1-do8h_tx*-~u9b;o4-fJszWVs&TRgWC;Vw9tQVB@=Tb!Zog(H{(fX= z1JL;}GErWIs%CF+s0B$tLE4?e6kK^ixdAx1Qw9Q!%`=4kni5j^uc;)@^uC|cR+Q}e z6k`U8L@p8%#EZhKs!AZ;gpQJF%KjKy3jrZXkn2ywjfHuu7!mm3l5Sp3QaTLreYFM^ z5=-Y4yw2C`!MF`cFYa=90<6O_1FFnIO@{3jDOs3GY4A2h@s?x^#5HAPuS}}zjUbJ* zuFPdvmaH|`X8`i~HB#*F8KcykD053!g&x!mJ_S+hHwe)39qH0ZuYAIEiKz1BTE_B( zLJGrS6d&O_=4RKxYUVf+eH9c+^~n)tLdI74Nocsb-H_Ex4AT+hjJqxnIFMEv8V=F( ze#rC^r#>W6kxp{{&6K&vK*`B*g8;#e8mhBK$+rz62PPEhbW=sO0A`squ#eMr%$9&X zWlAHaXYyeixNkTMisyVsWdj1{Y3dJ0GQjXqLw*PMgj{6%ouMhhozmB#?jpT0Ut)%v znlg3P<#Oe&%2S*{o%1`o3gd4RCM}x1m!$=g%Vpd11&+TvinLkvh*c4l{p7)CrRu%Y zwng|OR$M%%^%uMqs7{&cjX4d?tKC8yv5$3}tj;{3A7w=Q_4BA&R2!(SCZe3cqy=TV z*s8f?N|$GBNromPQPiHTs8?2$m#xqaPUbdns{bPAQx9OwuOcak0Wc=Kb>9te389~gNH8kB}cN6InCm=GK=dD9+1ds7?` zcE{hbbjQsFPZ83Ny`b(WY>mF)iWygq-~cVt4FYv=HAPRGxKMoOO3t6TwxMv?s5{ft zEyRdfL=&-j{Fr%QLmmDD>Mq+vAsGxu7HRT?_mx~sVTWGkxj^mI+EzD%wzKal|Si-;a$gBqjyOx#B7~U4EW#am*~5M zNmVAI@8l{b@Jt0A;>%#Nj7NeuDt_8polObPl4NyNpwKz{dIDfQ`zR zjR}j4V?Bfh3+jctL7gRFN$u1cjnkqN9G3Yy01Mc;;78X0e5_f(p;YR%*N+Vc zhz^842khc!FJ!Rb*dYYxxFvZM3)0MD2gbsu#uvW)5TQOO7(54=mwM z@W!FwoZ+n%@0nppXA>(SadRa%q=z=G^r&14IZA0i(R!4oLx=Wsfe3D{QQJ$X;B(dnKv)FYi;{NeWBn>NclsGxiR=z|Awl%2 ze@Qh_2{v-;@__y^8dQ+tY+gN?akz9g>$!HaN!*L+Ty5ZGRIo7}G^;yVvy_F-yQ-6% zsa8FFEqv4Ereg?bWGdf4H}>W?P8oCkg|_uvq733WBQCRh5-mg%%X< zhlQ8Ggc&XHVya)q=FPfpcF+BmlWjFqH%q?4sG2j#fbYTyPCQ9}n!WVctizDpbGD7} z9^qlze%Etp{T-Lu8_8*7}y1;bD;{eGx})R>bwKmv$MH4!=c@MuY8wF z4Z0&!+kGy35BDR&oC$mue4Z|v?QpGZk3{@uJ_K%P$E+j*T9F1Q3OqD3?YwOcBO$X@ zlT@wd2NogPcbAZ1n0#hhgf?kSs?m8`w(;Uq#vhe|lm%u%)1v7ceYoO_-Guizb8<#Q z?mzTk6CV|#l@0SR6G>iD;^m}1!I6V4;vB_^X+*9kpqaRZb<-IN)ulsaBCLai4UNbu z$i-U;433x#7cL`yREV>Ni5aotWop+^4|eB!)hNV>reO)l_$|^6?&t`9_^%Ej*NPi4 z(AWN*EU4D=!(ko}i;w>gFkHgc+2rpdWF@V?1gAb_Ge{c)wNzp=ARH|s5NWsjfRY(q zOHU#CN43b!B(23WnS=I9Uce8BzzvYiyl=r@3Kn@RO23!y3bA&0x%PaxK4;?b_4t6( zhXtWyI*^5%Mv5Q=pb|0Q4uFsbv68@DLpjK$KBI8U-^%w9fvxQwg`ZKTl71wWFqLvl z?8^=>PMGMLo=$AYDr{6HN(NWl>Dabus*d(qc8+E;P!Gs3MH2hh1(Wn!o9RttnOlMF zWXM)Ch+}v~Ff|^+M$oCbvbHsp+od0dom~0bR-Z)^Snp7@ZGbVPan2OVMr9s3iqW;= zN*J!3a<;3Gh8SqU1f&>@&MF^XzcyzvLm5_u&HN9_$2{hjmyqnd#(%3MMB5hGxEucL2gdGFKYg#??9<_Z>Vq{1J{qQO3 z2+CPoU6;msSvx!U?dwoF_K{!m3GUl3W*jf8x+^L|55mJS8q3TP_aWz@OjRcH#D-)Z zD^k&}O9UVH!3G9>>7occ(y;lOPqZs{8qodyVT5k@LdJ5bjnPi@PShj{XhN}i>AgL{ zeS0W?(Zp0*-sTsd+k~vtM`?QuLMKli=$0|oFA@@732<3x;<{teS-PCloH6;vDvXat z@$!9@EFY=V&mr>YAn@Xe0xPoZcCb@nD&Y z;|Otz9xA~qJiY7S#%o61#ign@<>WkBjFrtPc^hWCg}%Umw~n&VGQNgZmCCe?j?8=0 z#x0r!&LCpI{|H+Qh1pHc$t*H=SeA?$6_e-XkAuSx;)|!l?v((y*YwF0fM;6dCOd~m zIG{A1yP?TG{~1GWfD3ULY$ObCmAk~7QkvqOJL6t8!!8<&&#jOToJRsWrU#V#Ihg>Z zXdL6YwM{At6hDWES71{8@V9EUR5P)11klLH2h9BbZ>v=qz}E8LxV1^jSBe{=$UIiY z6R6=^=z_e`Wk4hh!K;6)7x>S>{bC1urO)USCLcqnY1HuxBdHU{s19LYK|U7nWVG0_ zT#MmnL(U(sB}dB{=y77yDz*Sy%+H%vUmr7gzTaCTXkbaWCl8olV`|m;5u^JfxN$2r%_EA|c~PSa5gM=7|g6pYJr55{RJd)&_>z>K|qetU*t?A-*@wdD1i1}BCkjt|f*)mNG^&B`--^}?4PBn%$D7!Bd`sT?y=WuckIqdYI& zgqdigQny~hb3tH*e*7~0*%i%}*_p-Sb^uKxQ;$(0>rQ~8)+vEj$C6OBtHhar4_R8V zd6vKA1vBy_|G-G0QL?+8e00VOgvu+>Gm-48Hu#~exuGN3qVb{ZDOMa;o^;-u#eSqS z%PGZvLz7^oC9&*X83gH&fH?nwJLVseG6yqX6aTjxyHUSkap^9{=-WkJNbibvWJV>*j zzdWT`;`2S@@-ZXIEFV?kD5^_SOCmrwF$pE#9QYUAghZA|#DAq2RX8?D!fWmj$YiGn zS`=-Lkz5~^h8-~8;jGd2sl)`4^BFnMW^N_Ik(g5K>iTCTviVR;89bMbJ>TI+XU0jM zy4{jJqTM*`p+$CMeN#675Qchr{F_AYg69o8KOlv!0XPBw)-UDXbPwe0P5uk>@jrFZ zZQVAmG=HEVQv!*+`8hYufdk(Q&ZaY4=35ZjZCrtfChIh88NLFnDtg43?*Q2|(yduY zOEdq4(dlIJFKKks=an0PN%W#TQ(Rvb%slyck#T-xc;qt7CQF{t7XQ*On_XNX&z-vs zTzD>+h$#Hc2Cc0CV1%{z(6>098$DKGvUUB@*616@nFAZJ=80T8C_P~>}2sDJY4 zei!}5#aJxSpm6$vGZH1d%T%dr%o*P@Qjn6pa6mBNSms?^h8I?9w$c$2-GekzA9iXD z4=a&8ZXC9>HwRIg7|_E8i{NJ)U)0Lw)HB zO7-=VhkD^8>wB9Y$Z-+nD-xn2-4)m#anACDv!|rH|C6=J6-Z_Ld-$M3Cby6koP=gc zT)uKbER}QmRmlNm^>+thxZ$Bu0hLBkt^yvNKmLbo=6K*JztMAIs5CyXRl*S3b6=YG zOG0yA=tXIxW0im%aoJEjq$uX8pv?wT8D4*}!;1x;0uykeO4M3=Lraybs=(&^2wG|n z7Q}HdtB?py=QuvxO~p=#w#G<2K|xVA{E!n={rvTL3^Ht17(D_}KV`|?d&T!(2`ayh z2X~YK0ci-pbR7SetyOuzE}Dz|-_ljqUt#$lPLWSWdFz5hKu!LV9YeJKq@+J|L&4&M zQ_aP9Z92Akn@p^l|3k2!l{ozc_+4SR&28mpo%sI5WEa4_JdLB_?c(`4=NoHXk|>lY zl*D472HJ5My$h@ZZl~#5dWGTNZE_Zmf*9v;Zf!ji zwK{E4*QD|12q^0p&Dg=#0Ugr@U!7;}Hy!qEy zwk>aX!bNI?f;<-`(Z2Na21SZpI*>B@h3G?Lj}jb=oh@vN+`47)$DT8HBmR;{!qSys z83YgvH}Gtl*@iKzXO|H8gpUH3t6BEY%5kj=b{#%5uDVVH%l9&pi#u9q$6HV$;HP>9`I`|Ir& zcNn8|ws0PLR)jjtMC##?R{u-z>Ip#`WdMmpDL5nnflTBPguORrCn_ZEo&bpYA7;>M z5&wxovv1o)m#L$ysNnLV`GqEn#FN3ss2WiJr{t_I}n-|TAg%LO|zXTb5|K;fodPRkpqVx-+9%YUH_uqDv?zCDPb^)O} z{QppX{I!-qtYmHH{LlRafHsC45@1dw)Usuxk(-#(iJ+h6Z4m$z5+`FWOxidl`1lI_v^rLrq{shrfP{AC$iuC;q`TB`Q%6;e~Di{o4E2i2L zq)ag3s^yD}A$BleECw2)EUNR*&rv?XLB>UzFvk~OUZynW*yyS>=9<`)O9T4*-a|rU z(@ufpde%(s*%F1U=$Ug9cv_5Ni=ClFG71j&Hobkmbh37||3R9UZBYU=t1LB#8#UB%n3QGPv%6E=wH@4&P`k$cG1}1Z%_CH%-kzuoZ2?82Bdib~Jqog(`^>ap>{} zjMgrD;ua+srFr{RfgfBHL4;;U?7YO&N{x@4R)Dr5HKP&s_yG2;UjQq_8oSwHa99Cr zgxwST1)U-Qgw0kT2!<^z3h91k;oDnivJyM*52IF*Ws>RagfHUv<}X6c!Riq*86W=# zWW;B?wnIGpifj)9sD=GZQn_Ta)PR7W{MqTaoPHOlbbE}ZtHid`Yg&XN5*3 zU>hwt%z$k)rQPyi^bS`IqOfYx1gyu&h zZ|{-(KCku481e5Fd5ox=gC6A3j(Gh08c%M=E*v%Bz??w-Z>-Ay4dD3aSxHjW`fF10 z87#|4cGid^%CE^!sVqHC;;3RlK4r2lDyYarz~aBpoYf3`Rwzq4wEq$O+yVaymI99` ztX=PXcd7Xa`sM%Cd&FBp)c9k?pF7j;=H~Jv%V&DcO!f2SWM$_&c7F@PsCsCBA1J5@ zC|Ut~Fee`BpU8<2umOkQBJwmkryV14M&`CNrc8Zv2d6ZH#63hdJp=Z!+Wx5t7$a;w z6LE&l;i(mjc^EtU2bo})0j*8%41$SUIJO-Vdi3ps<2RTC7`4_v-v>YjLN?z+4dVBV zY=8F08oeZDibx5r3KRS{@7 zdU(A0<>R2_i{eR6D2n_M>Ss=^dv{4@zB(^1^#F7^VL0 z2Kf53+jcM=1+X9(?6n9 ztw#q3%vx8oHfSPWSn zEB9KsYg&e1M2lQ@Z);72I(6(i3OhKQ@*BtzZtb+ml}iDy6bT>+R{1b3O{twCau!rj zMhLc}7qsiQim%GV9RPdHU!o<%vPm~dN7mlVi5AQDjyvtzJquKOQV z&r`%DJzYxm%Q&%dtF)-L8k5e}((GuEPF3Dg$#&UJJ$MAXZ3S~#c?AfR9psP4cNueJ z%V+Kes#>*ni{M=1q}I_mDoclNX4=ug$%1i>I+VM8e2BBV_n5IepD>}6FJWEt=qO~i z>92Te9-OYLqT)5g$x7bpqefY=mAhux#@# z#O{ex3FBv66udFa{9lMx@mEV};lKQ6X-2t!4z#~OMV(tB7ynsjmiv$-QeziGAkba8 z-M(V`fxGR1Gj8AGjdOW!Ly{#6pNLVM-cfcQrOcp)Q>e}R*11a1GChy0*5-svcL17q zM_Ba}mkyML48nsYZ!ahJ-CnKjINedm@Bd@$or5f0x8&h2yUVt1b=kIU+g6ut8(p@o zE?1Xr+cx^!=bk(B-E;1pnP0@NKld9uqVmbL-u2|ltObQ(#!Xn+@XEf78<+1tx2$)L z+-=qUAlom;JDF`hnZZ8p23JAgsYjdf0-GU+q!k_z6*vxXr@&cchw^KZ8K60-XX6oPtk-OH%M;0d-mWVN;*y^= z4;vXncVMcXQ7D+vV2=N74o0QTrFU#M?KDlsZ2ct%#2?G!DUk7a?@Nn^*Bs`mavIV3 zV+*$%$M>}yVi0~y474FqTv@brx~1#~Mcvh~*Wv}nvG?RSkX*-X)5pLWR+jalkPr$( zEL%dPUS>E6X)8#fIfg)ukbM_aDc-?a-#HZ~<7$D|Dvs_kqtE(OblNvrnP&X)xu?=u z_Ornx>ttKJl^&m2hGWoJFbSexXO?C?WJ8+P-TEwR=`P z^yIvWTuwy$S&+P#1}M5X0X{z8{5jB<-#kEdoq~_*wtF=oRJ;4wGrsW+P<_QNaHLx< zw85;k4%>+8%KJ>IP69Yt&#(xjA_clfC4tbd214}pAiBH7Y_mVhiq!{;)2$iI{r;Q4 zfo}kNzyyF;N5CKce?smb&iE#_{}toG^)UnFyA>()Kxi9FDwc^`d;AtQ8;^kK92M;Uq9c8Fo2n zuyTGMDbFAZRvH$eccd4VBppNjZ(g8)ANAj^KL8j1e|P<{H?XjE{!cEVjadTU!2zez z6)=9`{9nH*|IbJKPd=jAN*A_s3@ALhJq@+D3g8=@DL=nANec@?0trE?Mx-grmcKhhMn>Y$acpUtZ4M;J?7zw|qBIrZKKn zePOMfcE{fcO2(JaZVx~BH%+a41jjV6iR><$t zB3n}049KL*BgTl3DI2&n--fwx=#gVi%@oLd($bbnlp~*;@rT94!`;I{uHef0g?nOa z_0wxDQMlZIVczi*VMv~%!VJ8Ex}Zx4n+kiOA*yy0jCcdBrpUtK;U4_bZ`(-rTFtOj zBvY)QUw#uCQJ+AQDXDQFRT2y_);P~RJyJ$#`;mk8Ob!kz<@558XNl^BLn^``&s>PR zel$GV;j8=cvmk|7q(N?r$nXvMBz6IJ-5}1Qb>&`jH23B52+{EMwcohua#o!+w4XQL zvu8c43orEO?Tb-**N>#>2VQs~0WwqUj?I{sscYv&p}SaMjSjvyL_TzHZMf}*XhMRp!X>;=Llm;35u;s#zhnj^Y;xDXNHOTci zhEOdObrc%K^_ld){=U@w4XOmY5P+^|0O#}mzoY9Pd=ChS`#0xOE4fvD6kn=fv`Tho zqH&$|b@0u!OlzuB`2b8PAfcJyb0q`Z3PBCYo!IkOY3ajylgQksA1T>)l4wz;qm43? z9CA|^9OPGP01L+t&}&#qKH~up_XrcPIp`b+gaPQtpop6<9LP8~f+ArLQm9ImYAQh* zHDzJ7x@vJr+hhAuD~cL@`ZLxnT&An$Ez(e$i_J3RI_#RX4WtGWJD5_Y0S>{KKrnOEkh#2jO6cNe0A&XS@Di51u(6kN4I;(C?oHRqGCI&2;B{oxcWtq3 z?@qE8YyD-w1`HqCWmw0zlS78x3k+})u>@&~)q^yI87K{&cf*`PD;|nvK*F2>U;KADIQV4kUEUXWk7fwM|nJvoBTE$e5d3Q*O8;tT{b_b zm!6*=O<(@Y1a)uRmwsL#QBVvOPz)tMgj?s6!qfvg@Q3=ANW!l3Geco|YMrPP^0=7a zwxoi>9ub5jBf3A@*es~m?&)T=kCf3zOuK@#3}Kuzk0H3@q5obvsEp30$Npf~|7lC~ zzj^sD?D{YLPLcATvza;e3+Ry_BSIQrMYPM%-3X8h6`(RkC=zhqnYQF6Ch4RdT1cOX z_`;~+QSl;d@I`TqLxLH?bCrZ~Q@i;je`B88)AU2azZ%Yj>Z zR{<$DF->k4O2|~^eA%mDJhNJVT33QHtA0>NtrfP6mhLRY{@DG8Ay>3wRa=*hCutpd zp_(RK7V6vs8fH5z9h`wi!DKHR=B{X*;|_~`YUV7n$&Y(BZf-ZwE#ETlL|kVI3&YW* z;+FB+c&?NX`AuJ#Zub|Y7b>Aj>!omWxxu7e8K)AmEEnB|ky*7mI9ruAqw=F^jJsy( z*&put8S|2-HJJwIow^kDgq`+yQf=?QM^YI#9KEP!v~vy%+Niw7Fve`C;E;aaLkbS6 zX(=sDmHT;LZrFUUNBAJ^hb|FCrF47k+Hi)gGo*S6kxiuY-S^7s(+$%R!&p~p3|Y!R zX(BE!wn{jkDs1GrOm8MpT!{cqqLD>vWE3{ZOFVP`&i%a{9v|DkH>~#=JFx7mnw6!5(abrRR=BA&xR6Ju)iV;B;%pVE<%y zhb3^y>9f8DrvJHZOT9ZH(>c13KbNxrLqT!c1X-bddb32hfJfrf7j~LcT<&TFzlcXE zjTe}D9EZqpJFvdd^{rZe7%NuyT0V)~hC@0&hA zc5@37x%Xact~?BIUyyTb{0Gao*Ar0pUFlj`B+zY>h?vsjzGK3Ii=5eRmk0(9J|VU+ z%ZJ2X+5{=ooL=L!3Jj!hAAxgYWNKV)LxU8$bz6gBZ#nES&e|Fab+<4n1dbhMLR>$B zZik=&wSlj)Up&i%C&}Z)e!}Mz`@!=}P5Y)AM$nBGzxd2TNcB&0ms+SamHUQEq;Iy&C?TE2X}&i?{&l@d27ig$IljG~?; zZd1wT<6q^9@W|uGiDP+2nc#YuT~rYY+(vBE_(5}B_L)&TgJ>TUn1e*o(xk9eY@`=_ zG>advVFRJVaXKPD{EZZsYdW5PFZ~S6r>n%;>1i&_G{sPFrNQGm_F?F328J)dVp)YY z+t}T-`L~p=IF;-?iL#D`ik$x5TT(#X>9IKT4!RLAb=6l`rNvbTfA$3Fhn5hp$`9>MaX%bvE-R|EPIs)$2m)=qVQv zKu@Dj9P=$_0HI&0jwa$DT|H%>9_Obd4q~O~HFp3yA|Org39iK0sbz>kp|sVc%iY;t z--DCyFs8)rWhg-9E(OD|cqeVW*(2Qlg0WO(?b{BW&@Iy34b7GCRtlS8aHQ)Xw?2ji z_$a%NPGw(Rr!5wlnYfET6t%#D$yi;dN=UzSNnVHuL`mnojyyYRSD&dHW>U0d_&yv8 zO=u4XCyk@qFvaRUlX_`dNS9S>N-IQcM2nq*#N7pH6*$tFrbOzf9u#&FdKW_rN&zch zxkkFzn!txrx^>N0VW{>?c0vzKk2bhfu*s_dVKwXNNZ*R)nY6HO=@e7J3Wu5#h0*iy z-LlVpgkVAI1#-HLf{y-i9UFuJ7}5so)t`{^!ne47Y8;L--4@~P@GWYrzh}O&K|Us^ z>DXfB#Ie3UhRKI|FO_S|*RT$kxrdmk;2kHb7u!f!!$%slb@d+kt*) zQgZ<1m|}S2Lmp!Iuyg-z4Uc!fkb6Cv^SkGq&UOZ!{HrBLpLm4#F$^lw=nOA~V+vOh zt=q4xM~oe0jAEA{+gwQeVxIU+4v4Xd9KxhbE+IWzWsX2cs*h;s4q;LY+#g|-5e%}M zWXE9c$6f?d&~YUW^$Z?JSc11C%J-v*)A?~eNGJTkvK_slPFsktity#XhP{}=4nYD4 zq7-{J{MVNx7r7Ej>`Op2EJ*2HNw!EuF7~gF&~7EgZdsUsJd&pim@IA2VRuA}_HJFG zzn#qr^@%N1R1irmp!++eL3tm55dKmtt&*^2JCO&bXB=N_qqMNF*Fb(^El5k;1ap+6 z0($i$y4}HRwT#s-=bvn1g>!Hy#N_ zix+G|QOJYaLDH&0Eo_Di02T=l=^eugAxvkIR!@}B!tSUFnr^7Fd7B6)es1sHDHgXEG=$FzN;Gwepa8ubyNi*)qR8-{Sy zlhntg=DZ|}>n(5eE;XX{XWMtKJbM-&=J8()*tz6PQA5H|r}BI`m-X=5dTdw(8GC4e z`FW6_b6WxmIJ_At#01Tt_aGI@Ot&fg!?Qkn{_!rb?70&!ITwedt~JNF7~TAR4bpGZ zrYyy+82n@17sgI0QJ7OJ9!u9_cp%Z)UD>?-!w)vUDLPIu#8TKsxPJ>*Cp*( z#d3~R#SD^UrcEO|QjETRxc2;hk%;(<&CN#;WTF>#y9D3 z+f3v9n)RQZZexOegfzkk*SyWUOa2KdV*W zP0~QGoHI>u$GwNBQ_3k0qqp675+rF#wDP81cb>l3NjtngCoY{>pMp}Y&m1hPO%!<& zf7V}={xcrCzX*ly2Ujp%+kKu|Uf1e=2iFtroSXrSnv1p6KDn~t9bw@$C9hOI$dr@1 z9JO>p8!^MDUQST2JhS_EScN0xP$NjZK7E(kNF13>d*Eo5h;4SQroQC*y-GBjC9`KN z{`NM!`7|S-I_3#jWjgx?|NEBI(@frlYq+MXm6(QOs{9(SkWtU}sm|ty05xw4nC!mD zcW65Zuow!@1LZzRs63j60 zh=^dC)Kq)yGh8LYer4^0uf1Rew>TBq$#FHIN7wZvG&wiiI?qAU=I%_;=RY1Ft*o2(8ll*8g;u?Gtc63n{tD@$< zRG{eRy6x;ES}|5*#lc%UfgX$X63ZqpdkZgBgRiaL>`?`o)0uJ~a+E!F6e}jujIVHc zcUp~=ySYKqHy4M~wHn*_$Z%H^KclLtqj=v9&{F?PsX6JV}Bkj=ztJ z`&f1stpJS!F+eZK^S{vAzt9t4WGrn5h`IT%(ZTrU*y-{0PpzBrkm$;(f~m!3QW-%(YUs!uy$x)7obJ|=uc9>Wp^ zQ%7lrg9FP~V~K+KNDhI@S7Vii-cY__4b*I@T-+F95^_y^di5RGX9@f+Ce=N6c7xY1 zLmkzA==%H9ho0>P58m+3|B8D*UgL@fb{(#5GprTWwJVSCF)}p19Ja0LaCX&=+Knc1 zCqSEiacN1UnK1manr#hWE#HFa{F1kzYh#U6v8%e#K39ur>*E!3zrr(o6^Uh8baFQ^ zN)ybLwUclF=H1oPG4Z3h;bIP1h0NS%%D%&R!|4%c&MlzYVmKb%xnk}}JiSG5>82%X z1UWsyIlXt~!0^hitaLF0-Tj8U|Cl+|Oi-F@pC>~9Wy1>z?O%i^J*G0>a^ zXGKd&yzy1thIXlT9z3z;OMwJY*~>5>lDwWlYcTkLQd-SPAhEJZ-C3`ncaPLROMXsjCL`;%mxd`l6w-(BnrZ#4=_N&?_bkxg7l;0Q_k-GfRFQxx@R`_B^CWG6DV1 z%yLlT)!d+25DZsx=H9ps1#paJt`(qLS20}u0pFnc&pRP11Oa_~^c(6bzaJrdMH!!h z*%T#-lRhz-id%hag?EjL*QA>TGYoZP_kMpBQf&l-**^f94Ct@_!-bFizcm?uImQ2s zD^i{KqtW;+gTy2O2?ShJs91=?N|HpdXb7W9gpY*H3k_!dVIFFXRU8CmO6J~ft<&yu zHWX}YgL*RKwC)+>m*jbsIZ6@)L`rjenfY}2v9Z;mcfGXL^8uufBPV#=s|cB`{*@>q znZRcgPCxkoi~h-7OeQT5RdcdduI3LfPt zN)~%%Ia-Ks$@Lkus4PA)SD`ddphQ>YA^9lEP&4PqCVCR6s9kZI%wrk4c~-gA=d(KU zYf?vd`?2m1>YnYE#Y~OMM}^p>$E&HRtcj`91}DnWRcV@fQ{zl)lrl@>Ye)$SlveLH_^;zO(G)Sc90bA)EESi@3t5Kc z_urQ-McA8kT!ffe1ZB@WM*)v6TmmL|Ub2QXxb^F)WaNII6&GLy%eSY^lc2c$8dW@o}>g(7<9omSoA)vIHG*I@Ir$|yd9{bKx+ot z{INmZbM8zGH<(;jycR(?%ysl+8I^FDSkYY#OF+@5LxOpfSbn|1q$Le2fLJ+=h}MKL zh3e3up&^o_$(i$sXaWyCO4a#;VI;JT_6r;#CJ%7lRzbfpt`mGB;^F5|Rbv zQHs>0IAs+*YP;g&tG>WI)k3RbPG2geEAf<{o-i2|6N_1 zi@$a#Kesb*S_?84n^=;*RXojS;5T$WQ%z9t={1(KJKSog`>@^9tOXJ=TP}*kqNT(; z@RnSRRL?hQ$m7}~eIcng)X^CUN};`ryexe9mYssKZlO(+C}}4lx!Jq z*oXEJS18B_NXR6G`rd*J3}gTfhT%A6BUq-wNk0CwP0?)TF5^UB8{i=a1v{ivE4QfX z2T6Tk%cbvO3oI91R4Rn(7G$xn(kjJzOD;fp8+MH7pq#Tj&a!xZ(D0J?)|_Px;+QdV zC3ZGsMTfgOIi5B-QtkCC&2jE!sJ1ayZM7D=pgGYE`HSw^=|msh#78>R&OCFe?SUCv z?b$!#rLk#uS1o3`%UOIlS?h)G)6LTvL3d(54AEclt1 zty~|_OZ0#VZv+3qIn9booDi%23G-JXRY8`M5dna`_p)E>V_tg1Uh#HW0H;v9S-VcC7f8s2=@u6&XMY3p8vAotN4EnGc;;j8mf1+U>Qr$r zM=-|X?n$(SFv)5l@my2u-ZdSF6?5TN>!n9{OkH#K^49JPJq$bCy8y4ZJID%J@R!o9 z16V1UwFA45Bizd_X0ERu5fj}eoV0TdgKqmtA2~7+x|39|7)cRSLlG>z>AIpFg!;>;g~oR!ElrcglE|lNls=yJ z*lS6@-8nc&w zDE%qhv0<`yVA$nA35nLYA*fbihma6bnucQdU4MVjdJXwoz4fT8)a>v5z`T%uX0w^O z&0!}mr~VPl_B1ih&hd}@n7p7=iDUP2BUlbxkF;CWxZ(1UCK6>7R&{_<+I^D2)v&`Q z)JrBLShAn1xx8vlX-DflprgA97o57_q=q?at@>Mo&x}3%>QR=#1=;p`-P(G?CRp)$ zrtEW)x$TN=G}qS}=2~KK7opa^E#tJQ2Zy%q>ovqN&(Ao470dauU1O0}?-m!;gH3-O zmyyJ37RzQQb1%Ve;*#B5NUYN5o{z2sMoW3Pe%OZJmmvnHX>SL+!J;z zZCk|Q30w*NqM;k;S2g!f{^G)AKxn0|8=maazd zLmNEJ3n)QIe-;5qMq zL#4P2=zX&}Q0iYB>`7G9Hzoi^Y2SQh@(O=!l{J!=APjFqhuKER-p zD0vx5%Vh`ux?PIhl%)MFK0m7p=k}|cc6Ej<>vfSOnv>9~F_ms$2kWI&)n*d|iXBw; zn^=w~l>})ZYsd-Eu&J(hb4A1ZB=bxN+Hz>nOcvYbKR-atM`I^l5Fm z?lJp-R2fVT=6B7RuWUp2_Jub4ab^^-JBCI`VA#xQO^kpRdP9$?U%dYTrA^MniRa>c z5nhBi4?6dOcRFNj?P53Y_d<=Pwq8+Lllg$rS;H!NTH2hd=Va;0P&fbnL@UjZ$NceA-Yng&aJ;0(B*k zEWZ9B3=Fz>)@P`#p=@f*3uME05?jSis(lXDf~9vi3_E7icVIwzaTLCDMDEOTR$%t$ z#Q;%z3O4bJy4oe0t=L=k-}XZA%_4vC0uZ(F|AZ((K-v9c(f40!Z!#by3m{$N>8IOT zOHmX7)vS1~^G;$V<83+tk&(dt2&xN9*Z-R$lsR?qJXyGQ?r#x?{t#0RdGIvDw}7g9$_~xd zeE_Js)_+vpvEyX6K+pY0j(*WG$LF(~P`W4CiE5d6>#>V;*R^{Zhp&ONV! zCKa_tiBGY(xn9FWB2>w8AgTGa+Jr)@Shx~<&GwbYsE#$!t$fJJ4>9sMTzkGsSuma^ zFZ#1Voaxd&Ph`$B>q{k|i1|`n$16Mb5?@(myIh8KV|(fcNN!=W*fukdibG&w;jk82 zDvgAMpe;gX%P#{IO-nz9| zhkAVmuf!WXv(fZqKEG4Yt5~xGyn;$CO!-Vro{rQ>>Q-5k{RCd)M}$UsT`(8Q3Y>du zBo0B(C833LM$^LJ8 z1AtN5#NaQ^PsxfivVZJ+%x$<@bTrF@Sy2|rv)UlCG2TG!3Pp#6M$edMT(_>t9xt0L z(X3&8O7aT@gyV0EVO~j#QHWUXXj8xF>!J(ni8Anv`lSkNg}c z4h{((hJ^v4KZoGvH7#vZ@IHS2u_I6N75|RG;gMWK4Trn~He~7z_P`6#?pQkT>dII)CXWrSM zV7JSxGaDdBcLc8%9GQUK<6D7&3 z81M+12Zo7PP&vw#VV(1{b)rhfL1tniVOP&qMWwpUI-)}YyG&n&7`w0n`~~Q48~DTt zqof7WBSOVQ|Ke}kL9S%J7@q))NB{`yKbqVBbN=#YV@@fXheCrs#Q zH>yRb2!b^u^O~u2_Nap(AVCu>r3pxQCvC}{&s|e#l*IjduMoWn{=9*8E4Ip)6wouh zTz9%!ce>1exw$)Y`(k&!E($KiA-yeuHpVuqKDujxHibd9#%&Eo#A{H>^5c2r!81EX zx%wMwzM~t2zEVypYsh#zY|*OzvobamT(YvylTYs(k#0wfyTHENx=dHh-Icvw6hQQc zRJZ>#OerKo7UgM!hqV1IVlMbW2;7R=5-Oyu72#>r%KKPOMJ0)#4LxEN&OMb?R}j1VG$i@z9ckSAeQgh7z4 z{)9C>IkK?&3SXAfe5gP~mN96k*e1|1*+>`n%3Ybp*v+9dfw?Wwg!8L^y#qkGfvD+3zoJXYAiixW@|MP5GGIdk+aSP1s_W zD~)S2e(u5MK;C!cJ2hf!y2|LAa+TtzEr?bfh7_OWe)Gkc&pceDG>qQ0_@G&5YsCUbCHvK@;xyjOo~xF& z#!!KTb6A#?+c_3Y5_gxQ_C>)mR%$uU#(flB+4*(OfFSNlr47HoJ{;ScETF44HWY8GCB{yO%aE z{)BUWEBcAG6ICz|T7d|$^u{V2mdo0T^NWNiU8DC&po`%NMxPQcXZ1;IOjZnbYZ-AQ z5N=>AseI=xjAAa`@KEU}OlfP7xpOgH`m>=(deKw|{Qa|hykYh|mw27GCPW)>no#Oiift1w8jYdV#V(;7&hLu82=wdk~Nrqt`T(fXq1$veeSJBCd zW`cA_AR)@{3Ode@^U0F;^O4-uSz*hzb8@%0O8?x%6lOF<+ z0^NU}jB995+GNDeWMpW*KF=7kn?KFILda{`(nWtVM#4jta86nfgl&A!Fkw>E@83Kd)d6FZd0s_lV;NnP(%~ zNg*U_>y!7(pyXhgbar6&34dVN!7a$cg?Ers}wD!@sZlDlr54}_yswl zbQ-e!H`w(MNA}$WPLE=O;frD^{Cnts9hr=_-K9+dz_bDA-dO+7ms5c9!q&{hSk2DS z`d>$R$%=ozPJqCS4MWpbEh( zdt9=i;4|F9o7hJ2UU??tY@lL$Ftgpm(G%&T{`zT``PW z^$W3Z^X*68SZwfl?KM9{^wi{XoxZ`6AhZPx6bV#UWvj5=Oy>JhB?i?PCRS6|ewCHY z`E)4r3A$)ps;)(9;*dqOe|&=&3bV7P7(hvQ@)}90{&CpjK9#$9|*BE`B$!qR@4CqBvE)kV5rB?s0x}OBMQK$Tf=Lx^unUy3oVR< zW{1JZzqRX(bEZAlSlSr<8DH*c=K5Y(OY0y+NV&v+zbPIW7;NEi3)(y4be2_rsMMJ z$?VF(Muq6Z$f1qg|JU?li@Wn#6yn%kb#|lbR&jf*qt!qF|(Z3Neb+Obv+7rrT8O z__Hqg5jy0Xctmi(9Z1}!3?!oXTS}Lx0Zq41qLihzmw`hG7Bd?C@^Yr4S$Gd0cpC1r z$fh|Bu$5*2v$#oP-Gw7=_9b}HeEUpaWLkwa!EZE)=C)X2wh3la?8`D(EUm`d2VY#G zE~Ja^bSE8Aq_F}?-uf$lxLdmxx&X$lm9YPlcJ|Mk)jvD?zbUt>{;AvwA%P_kYC|#i zPbr>VjgvRjqE|tvY7|e-gcHo)3>hWFOq1Rn2VFhT{0#qu)bp;Tnq4jGe*2+)>0>&= zQ)=}R2bgUEbX!}SZ(L@#M|wSpVJOVhf&ObMMB`sk)mV)iHd&*K^sISh!-!~SmwK)$tNplT% zcZihac|jM%FpMWin4=UdxzTzRCr?5SolmB5Xg&S<3RHBeW_I?xoO8k>QKRvSyfZ%T z5Tr53*2MvKBJ4G6YMF=)-FG)wsn1qStNJS#cc=1Tpz@{ja>Iz(=}rwLs=1_C|AG(E&a4b2kr}&MZd>An1nSH$+Qrf;O>Erxs7ReA zUIjr?I>C@d&7F0~-Y}Er2geR=uDAsQ}41BeCTwiV4HOokC)$Y2a>1)AohW4tdTkh0Y` z_Ryk1PwdjFCE7OYE(%JVFtt@RnY}tdA~FEeZZQ|cP_J}TNpRY!*AD&^$5mwj+`<}VDBTaHU5GTP z+vPBr9jVvlF}T1mS^Q}UgXY36XCq%%Vt}6#5de-YB1&n|8uU$KqDCR>lIIt9H}S6P z3ei*z>o7Oi#G z*o+%ZT}_{kVv~)Q1Dm?bWAHjoHMg#+qwHP6R4?$p#~#TvTSQR^(MqH9j7i4Fkhr5|#6bxlJH)~X^fPVAoPOir<l)_|!-OXV>@OJfo2=Nt4_QfyAe$2ygag$_Ohe?~4+-Sxj}Y3Ag&< zJkzd!twjT&p=Cwz`WlVsRUT$$9Ia-4L}jR6A+SJIsyU6%DNH*T$x{4OYvOsOJnJQ? z`ZZHr#J4}a3c=vsxVcZeY~1PI);DzdcAoxtE9*7zL=@lv;-q}g&2P9Te_|0wE4E0Z zq8BIbDuG5exLHBr9rbR?K#eS^j3g=UK3rB`Bb;a^osqs;E^6Q2bqbT;1S8JC5G`C z89ay88Y5rOn*xevx7+zM%(v_QlQCLqzv0~Q!0xa7Jv{l~90928HvnP$xBr*^&so{P zP{_{4-rB_ZU+vqAl>d~r(XG^aXy{^z3lt(0H50;B5;ap%swz<}e`#_~J89VrVqK{} zH%*X9{=MtgquEsTgZcA|UkIPD&*deNg|0mgd7{@;j#rLT&Yk1cmEY$r_IFlpX#<=V zq-TcU*lP!1Y>BA+q&^#KsuN_=4Taef%NJ=ej$oF{Q-I;89KlT7WxP?-DliOcjS723 z_MXuidzD$rS?1b~!JzFMHt=isg6&v4XJo8c#AFGGwoW{-M5pG=HDY+&D#FX z6I>RYDRy3TJbGUzxVkUWOr{(vGdShrKsqiZd*%wJ`uKk+`W4Cmi%B(Gy=4Mxy)3DB zbYJ9Vz~gvWHnF|t2YS%pLz|mig^`d^HCtV{$d;>~#aD6)lK1zjv3l!-1^}?;ad*ngdSC+;j^f)ErFftQo zAwKu^$mf(r{H#aj@s5+n(g|Lafh?m;Q*$eg>z=JT(QZ~@NdMLDsGP`HA5E`TLqWlj z^`t!~w?dPnW$zp3C3dNPD(%&;p5c*RQsZTQ5U*u+hTtfFi09c}mU?h921*7$1;vQI z_TE)Ld~yGxNP+l;^V)QzwDSw-VMF;h&}waljPi317plzq#ad}zLUJ1A<0pB}$N2jd z*ld+Gqe0N>qmChip4TJ+@bMPMOjWtL7%yX=hTo`mcD`omOC&3o%4>)lG%6qRorB~~ zSyPoE919?lmz`QQwnzw@eY?QFzmVlD9prs#LWpat!NSS z2=uatx`y|~DGS{qnilt033&t$EcQh2+#=xM`RAx94fT_&0{(Kv78)F(Qdm`D4(crC+W^H40ZDYRJra!KzVC z>F?8nhn=~L4YT4dx$Ijc#xUuT<@Gut?%O!3eccVtMflCjApb4~a?tc$3xg2PVJ{gU za?$Ij706F&^=PV1IN8SlcJS{)uh5Tln~@lmqOy(naiA)V$p!`H$Z>TZ&h#op27=|7KzxPh`{B2>JO5s;vHlRNvf%~79s{hiT z+1c0_*c$&~df;ehWa8xXFEayx%>EyCGsWqyv!h>Z^3W;tTT3Je6%l_f^4mm;XlZ6@ zTHmmxfwA*HD>A7-`njpW;m*~LY@+U=rn_C5T; z(CQ-sq~w4L23A4k+P^=94ZWy*-=`?AtWRxEBCO`(HE3w7(f8A0nAZ3KqHL+Wxb;YJpwBq@#4t0)&iDQ(J>*07nl^1I2_t^(Mv41pfHpYiEK7nn-8aW2@jWYDqgo*2` zb?K|y1)v`58U|U>77f(NhB<98o|{NT-$HC@Ppe0Ne~qedu|#@mn7B<6P9RunRia7I zcA}$hixJqBcEp#RcT23bv&uoL|6Lvdj_aY&^{~z^nfadj8{)Q^XIsO_)I(c3cu|vCw{8U=LSJvg`3p5A%N`VHOL=WSdE4R-6Hr5ixf}!a9c&53{ zc}ma+;nbH}$&`1ueeMnQ%o(WyvBpAUBEh?Sos-QZibh&;Y#X_icnkws6?ATa899xc z?4~ca`GCNb+5ny(hqr8pSrJyXQe^m5LTk~Vl#|N+4#uoFy#j{Jp6B;7j%*Ir&*mEa zge0XSnygBm9?4XS*WKXg^YU^+U}ren#UcIQ3U)B@X0eT>rfr0)B=$A>s@0uKHfC%6 z*N|Q_aMkPfZOos);LobRWMTKQW(`n6=`>YO9NIAi9(xazZRTHWwC7`8?i#^?EXzf2 z$r|X6R|YZvJ|K&?H-4+_tw`sujr_E+Z&e*KS)B^7jcyB;jDIgb5I^3sEPwABWpvB# zd76h$vMZ)MwPi}EM`5>`qhZ7kKdkGq%^1clFamw6V_$iN$?XLdTas$8`^EH5l{ayJ zrZG?J6pWTo4S9NwdRiWYydyPWcY^ktQkc>-VM;zD6q5x8 za{lG~mBoPrQx+GhXfi}mj~|{c!AH7K_C2e<3g6c7TnexYl_(G=ShT2z z+iT-5hs|Cu;dy{r^)0oWCX7NRDubWJBPlW&z7w!d>Gb#&Gyf%7MM)lYkusu<2Eo&( zhU(($j7rWkjjp+X@JF5hh@ceFQ7L2h$Q@9;J13qOC@t>R4J4P+Nqh59uq!9wA=D^8 zyQ<*+u8O0BrAxrH*s)HrQ_^P_iKI+K!Mk*l5xU7PN4q75>;K2tH-=}rWocJzqhcEs z+qUhbV%xUuRBYR}ZQH3h6({w*r@LpS&zbqI)Bm3T&)RFReXko4a}`#!l z6+48iOb^tL+PJTYsYE+pSG}3-Is)UlA%nAX5-wrtw+jqjqYhs(MbD+yTWZR&8Tfrr z(ol!UDu&1aDKV|W*U;-JXr1|uh1?sk*v(ScIeX>HC=Fj7Xq$MZ97x?aK9?mVYgoM%cQU_rSel zDi`NyzP5|?cRsB>d9`Vsx#>^yce_|i0>DaJu&jJ~+JZ zQABu>3A>F?Bb^m4m^$a3`h4C&Obm?!Y_iBXu%dD4?-4u9^2myV@{RV}(tJ-Hy&De; zYwp6(EN~%k=<$9?p5OU)BA$Zkg*pXZKobC@crmY4(6g^{$1i=H1=-{PYdl%FQoK|0 zf)S8x{hbDR1o}$Rh`N6dPZj9J8K3k!nw}tozz#xbr1(g_&SAna8%2)TAtk1EVvvV2 zA_`-Ks)-*;PI2!KroM~Su)a6tEX1W_taR+R@o}?c`i%qwmU65Yi7|JmJ()W!dzJ&y zMLPKs84MKfQU<9In?t&0A|^wcAHA%n%XkWO3dSlfz=r_zXb-%sM!u%_i=c@X>&^3D z7Qgz|!A#YFDy)V6PsjlxM&?d}wzii4HgzPcSgT=+p!$SZ)e~xL2Z-bX&Ck!rVJKc` zC8stMh+E~FQ8cMn{g}c+XYFY1$jj#&iuJjX;tLz6Tyg{~EU)Z6d_bH1E}$Q22!@0K2z404$T@t_h8zJnyfOQ{cUfTu!3Y&zZoQ!_ zyk5vdB@}j+I>Q5y9(9BV@li8I+$NB=WvXL~xTyxrwp>S6b?ps?ZW`WlEuB9dteI?E zx0!{ms|&6%U6!(1F0;_KlrXDVMljG3>a#wqf>|3zbWthWiZ2;zafBAPMm1t$y#?k;D_dg6N$n^l=UPw!h4%3qNR{FHg;X~xJm8=co7+6Ok)59U0 zlwOr;M0-Oux{PM{k+lp9oASu+^=JN}HKuao;282*e^r$gr%%M;&VbZT>DAQs%t(tGMDKq{BC&AU%)TkE z3!1+2t^T>H_}U}Hx{Wa#l3$TY(9hYusIavDCmx;f+4GUd6RECDfzEGdHsEJyLX4|` z)2~W&3=~e93zlx8OdoheteJ*=)tnjKMs_dY8>383Raa%u!#7|9>~zxkiq2ia3UU~# z{R&m}*{$hqGISXl&e1#x$5LQ&w`lJ86A2W^>H#Yy=$30l+vOR>z-S`v#>#t4oknKR zk_10%(30wkcAa6VS|>vZVX4Cmh5IN(ONmi2Mk!i@fI^-%nhrR&48(uOsupEV-&VV4 zaj&H2x=4Y`T{wnRoV1{G*h|!tE%E*!)|e=FpP^KvKGe2l4~b{uMbdr--BEE>v6h;# za48a$(G1*_mnkUp7-TYPy^u|g@;@}`wm0c>EL8yulP0Q4;NMqe=Eg&9ai02NgTJsM zY^f{VL^kd2VJxxa*8c#-bNR{YF7qalc_bupx}&U;cs2jga7By2aXp~^wAaF3n%-P= z0R18G+INE`h;b|<##fASEz6)}JHOe7tunb-{2dRiLD1e%eAX>^`%~19-fv0y6-@md z!fD8JfKM>RCjd3f8HX?~TtW;IUZM_BMl6m=XkID^#4TwYC!dLh1eYiw0-q?O9hEyM z0U9U&!VeLoRq_BepBbJ=JToM04x=uefUG5~&vQ^erSq5}##nm*x;hbTatUK@+?ih; zrB%SIZOHKg5q*Z0fF`?ygeKb@QKCL{_LeT0g2Yf!G-6DAK?u?HY$t>*?smZ!Tl$Nb zVo%;ZX*;G5deQ!((D#$#+``39FUhERi%>-KNcs(QLa9-fpvqW8lAzQ3lwEBlyIQ<= zvZWd!P`*5@8;`+-k=Md>Iyuc+LTC8%GzNtdV1t?h1cWjNY+&Eq5QQ2y?Zu=$+IrFq z_XPXSg^=2L$!Bw|{_BL*rd^J^@4HX8{;@1a zDDgf5a+XU~WOxa&^WkS6R@y(AziTK}3LQvqICW?)Y+3%evU>aD>m%lSHy;3Th_^{Y zyn0qY=!XdV^xqz#n|-48fY(fWnsrmdak&1=qL#mvd(aoq{Lo-ula zuS!+t55duv5E&FEnQ*QDojJvNh@Y_K2UQqYh9t|7CL-9y2;wk3GMPrA1U233ZXn$! zu&)q)Wkl;w&DX0~hqmjiGZI)3nw2~MHrFejlb--@Px67C-|x5NeihGxLim!D+<{vA zw=r&&VI$UX*ZVxt9rdeQbF~pqiLD#a2+U@!MOI62#KrW`@~>d9U)yxOj*SN zw+>rn=q*~Fo+(<)_-V~r+JGQW)rBl2M5YQAu)vW?s}%=?h$0JT*?KRDezg0rtAk?%uTioP(_EB0XTuVG`$X#ZBD2SG;C78L^ka1s!tLWY%bFqb?Jv zqTYDfZrQ53WkL!*u7`;b^?j7*mlF=cs){+^=y<41NN*0~mAmNJ0`;=d1lJ2K2=TC;$f?CEOf?ln)EbLzgNO z)#&wnCF@Hjle3G6HAF>4`X;MYwN32?1MWu0Z(@WeOSC8T-`nW2UVWx(9pBH=5fO7P zPDdJ`MQ6sfFzQ1VejBK--8)wDRMatrC@DL>TW!gk+jP-FK8lg7y4xLaLuK&+6_|qM zhEyJBP&AYGSalmFtZ0X7nh>S!j^xMg{9wnP3UFMZ%b01BdeE!>*{w|pR^25Z1p16~ zvVp)YXNOBGjW0ksiIZPJ?-Hg?Sb--<3p<2>94b_tSCuJ(cOB+gc+xA^??JLqbWLUe>st!U{>mCoY@jRz$uwBofb zL&f|04U)*Jn4gLQE|lX}(19X#p18KpKd(^4pWzsN&czCI_&0uDa|C><8LWp!O0?=y zMp#cP2Fr8d#svZ$=4O(B*-FwC#co_wevEOJ?xAzVJEx6kDbT78h&+ez?qtt@C;Sf7 z>DTh1-oT6W%d~Ld-?~_Iyp+@cKWgyI;hY%qn_|UsBLz_* z5^Sr=W|$6I8HJ8h>hkRHvhaN4yl+u1s`elLIQv;7s3Nq;X_=lUlWe9Y+kCn^UvTn@ z`G-Z(ky+c;B?}UUS%uDhjAk21#9!P=bcIN;CM4?I@{CEt?!S;~uFP zh5(Y2*GwW9Y8rQWJ9)uS3oq1s9aMD~)UKfCB6>8Q1IkmfcV`q#$A!PWuB0Ud-X4NF zudRal_!*y`_dbv;9VY6e15TRaa;9SBL0bL-UMM_|X=JWkYQdk2AV0~G=6(ab7fuC4 z70q!6j8&yg=o^D7AG5VM1{6Pzk{myt8%Iw!HlS8s%p3Yl4TzwWG}4XC<*M@rQu!*M zoJp#wF-YZZ*eT-6Oa5a95%24+^5Ph{x1j?rqQBR~ zh`8DPljHGk|1Vk5T5dregU9t!bA5@hl!9L0Fu!){xCcw5U;P z1?gGN2T@P(pDTQ?t4n7PwAakwiDjV*c`nc5I5+ZkZ=_k@Qm;7X5XhmVw_Q8 zrCVW@APnm9@2y5_H)R`qW^r-xMBRI1-4h@>L>h46?%}|rb6_!6@dE2GNfo+9aGsDU z#|qw=-7rH-xHnesIbmO2+Gj9}Hx&ByqGH;)JyBc?%O{%`bTM4}X^`8f&R+zCWi@>{ zF~wy_yBrx;$#%TEi9HS{Db`_Oem4*3$Nx4JJEIt*yt;pPt!%^F8pD#MYNwvU&Ksu= z+QvmFzw%&7`2MNy~tdETx2 zh93b4I%VqWSdNzUOndb(+BwA?QE0(dlH|-0wzE6g1@BPnYiI#7mO5Bw?|-SJecFQD zKMubl08ajU-kGSmquD=-h(yWBz{&WZ#LHymfAY@$u=ihsMg`Tp1rae9Q0Kp?K-=Jl zk+C4OAvE_Q*l14){v(GX>b4I;&+92xTw>6SnfncpkrFcOhinM2_2QL_a-VbYH95vdCA_#iFNkegpFn0|6)LNk*cEAHRfOAb9=HQh}FnpUAMG}}f zaZ&NI4;`rY1Uq9Se;;GmF4a6|mIeo2CGTpfS=82H>7LPM%bEQ+&#L>Qy7?P{DNA#M zm%H?!()d-;jS**%w~(#Fgp>X7>4Ku7SI6`25`7Mnx;8b2tptTSa}jj&61=N?7Q;{%U!tG9jRC^n4c7Jq4h{e3A?tPDom#L6CgfsejLB3Xzzl)e&{yZ<2U3N!Vjh!?%fJRYSxvhLinUm*;C`dbW?wqeG#;t+ zAn|dK?UpfCuOqz{_8$8|l93lqR(Zz5Q2xPjIa+eB*3E>Jj?ugHUbYj#7BM z{4QF*o6wGJS&b`m^3!OXlb+VOwKP=bum}TKJKX~vXI#wZUyi`s8y9U1U|Wg=Ff01M zo#Os|oATdB;9vFu$~ul4!l*ph6AnL1K?R{?GLxDm%BsA=Qtr~38=Y~!)BER0NrJ0*6 zB2!$y(e}+V8^yt+4Lj&<`RZo3H=6b&{$OO;q<+=8z)ghTbUZo-QkpMNS)!sUK=_wc z&xsrGcd^_>y13>-z5^X zR~6v$Bzha`urzeAD-&P7Q5QDBIf|HVPrb$_$uD0FQdV zEMIp|-4Had095a2QrfRIgoA(T*gosWSb7qk0u!Zb{|2;uAYWD(cmb-lLsC8;l9oy3 z510`Q1}QO$^hmMU$s*#UDauR8*YId_8z3wS!_1Uw`^?)#PGs*N$#^ePXNitM%W ziiXrhX{^Ooo9~28h76KkYwx)0bm_I#32ez>@m~~?{6%Qc;wIehMuHEGMaC1Q_)bPG zgAZL#DF|zjXc0<&IHS}1+CGh$m*JA3D610au!Ny@2fM;VDc^}ULq~58dy0rsxf638 zdOZOXUpEL90rDkld&9EnOlxLG#b_J_b!EraYcQr9-%46F$E&`R9!!@eqg1mG{dxvh zwI>&uE;IaM=$rp~$zaiA@L(Qe=O4#nyo=IVPSs~iu=DeItL(2N$1>O(r#}>R?|>=k z|BMCv6UkA`z}i^G*2wsOk4pd2)%`()mDI8*0~VpF`i82Zg}?C-TZ!uCxroE8fex*2+EiP^xtXjI#S;w=da zVE}qQ+trMVA-gXwy02rq+x$W;g`u2g&VO0pZeyW7=mW9iCj=}J^3DwxP~TVk zu@l3TbnFPcxOL^f^qE{U<*sr>hPTiW>%aZ2e>B4W^cpgJ%}g#*z+8>8CyZ2c!O27F zh5mAEe3?bP$Rl{Rh=g__BcY7+HGE##3iIhq`C(6806b2w!i|4uFx3n(|2lMWlg<_( ztBW5;2)FTf{Du$*^$l`57k4v_dCu@7fP=jino^WaW-SxhMfC`nYnxb^oX`QK5l0B`lb$fkB|=jBm9Z76#> z{7XxF5sfX*5Hoq7YmMoQOvnalEW{71lCWD9BPoqd02L{#lVY}yzl(3o-D3R(lQ=$9 z=-RdCI`cYn;q&wU;HzKBstlpOn8aY-gnVLOm?3#E#koCqOaYQuA|V5FR`=8vlu#Rw z3&hm66Em`IVvgO2B_3F+HN)*A1}lx0I`KB26Zc*gBkCv8vp!QRvBNwgZsZ2*HB;?3 zAuB!helC5t>Y6y*jblpJr)pXC3;NP3`y3{t_5Qt@VtkKHZ_7t3L5Isa<8|Bxv^$)D zayHb(rG^O|?}x}>7ClZpSD6Wza~w(FwpcH$7&SHwPGj*%3Cr#8!Ziws>p`9{x#g}! z*Xr~DRD5^ak^#e`NilrzKw+$?2G=k zTq#%(J)sa%k-Qhbl}LRw(aR4lsTVVUW)VIiUi~SWp<2KczQ=e~O^^IiZ&cVmFCKi1 z6^5Os{sHZ*Q9)<6B>!XZBfa@>XR^skK&zxmr4E;|!UvoGl|29Y8{!-IFDnUx3GN#> z?)Se~fvAdH)<*(r6CL2G^!K{Y|E|yfQDG$m%#pE;F??7{tP|h}Mh+wcd7+ep+pl_tSs z;VW&B(S(y7{hO#Jx)@ART7WRx-b+X|kv(n2Iz$1sZ6yU&1qB1jRo0rXC(xp8`TDla z%H8RiRmb z`a7bNYl4)ia>a!pIxH{Q-_qJT8A|j^xO!c1ky5e^UO1~yV8J@HTEmsvo7Jd8Kqy;O zXc88U3lwSTO=*>Au#TJrYLufQ$VV6q5Y|3}B9UYZQz@YZ!kpG=GL|vHb_TJ(N2Zw5 zlG33)kQQ(^iX3Z&uS$kaA>+4>6BS80qL%VlqDMzAZ8V6wYv$0}l`v_Ip9NQVtf5{{ zoAhR|QTEM68+|oGmt{=PH%`(}DuV&L-ASjTJhjZ?7MX5)P(yUqy}TPTia~h|C?wpt zjfr?tp(%Uj9}2D4-TM)e?C^TZ@1;K>8$MB6p$t3Ggc-Jjh!yPM zAmuOkHF?Fz$nc3xcYkYLp7h!g{S_`-k(K4$W!z~8XOzhVDS7$hoXYm2NpG&nc9V|Zw zeBdBvYxWFrmJz=mqZnL4JIbd?XwTnZeT!78E*_)`G(gL-c!qsiEyUs-;egZAR~Mpt zedbuF!R^~?59s^N@Esc7=IYYTx^uSL!nKT7(n{KV{hI$ZphCa>EKv9 ztm;TvvAL5$3sw^w8CFuOU&uV3tBYiU4k)v7xyuOn7As)XQplLPHcMNq4Ey_G9=Jwj zs>%NHHYG}DVIap;5**Dt|LT1TKCC)Ht~t%CzV9%RXShVJG0AKAs3GwdM0^(h?h^kh z^qD&u!wZzuz7Sk*-wf_k*fuwWKc7uqh`ugB9*(NzQ_u};M zg#`Wv+Di@+QPEy<=$=Yf{x&}%Rk;&3*i%ke6wj2mjcss37NvihcdVq9JM9^*+n6$8 zl#GN8g2Zsj#SVjdQhyZ+ub_qfLcEelQo|ClI1 zyaNF~le{>6%IdEy;$JbGoI65K8sObEf|d_qEbfD zfKAclXxWaOf&=Z)6ee2Xh5T`ETVB8${!hrTvq9Q_S@IzDAImD<>B*X%9baI#08Mn(am>QHve<}d2n}^N zGsB5t;*d5FJST6YUzn_&^yh7teRJ`DXtn(vT*V~h9#s+vi9vAT3J8VFvAAP8Jip@g zEpRc$onsCxoEMGzCs>?z|9X)Zp87Gqs0q6qSxb#^%!3)m7I@Gc#(UE&7cWBh)2?TT zxa^wDtPDhAgZXp&n8e1MGghl}UNx3Wk_q*bhc<8l#ln_oz@*8g0g+?>XN>VTonmcr zCm+FCB#)x37~4T<)h3d)r#*u6uoXqyPLD0oXd$0*sAt7Y;rxN*Q)D||{tKMQl%G=b z=kAC>5!9IA%**v9P}MVm*<5?fxa_5zqeLhA@R%X{m1`^>(FSk6g{GyGA=rzrQF_Xj zdD1-_#dJCR0tk}XMI~fEfO)WO=F&?xxCBYYj?ZIf`p!3Y;@Bh2@12eh7J2@Vj-j=j zsbclj`H2ubrr3o>n9H$=$N7GpDDIR}JyHBsBkqOuRd%G$L3SDkrCMr0desS>l+@^B<}q)J@OglfF_$nY``ZyY!UQedYDQro2<)G*}BQit2uJS za}zQ-Y?FCo6brY6n7`~5H7_Jo&Q5%t@(gA+OHEQtvU0($^`IEhR(F+j#mH`_I6T;Z zpxW^M)J-AX{8J~sLgA(iIQRLj@_7dw=ehbkXI9V3i<##7bo-DEmD{u8$wTV_v(VAb z0^{T#D*mDYj|S%sWD%lEnV@Q&qD>O#vxHpY2U)Jb(eiX_3z^Ojqcr$I>M}LmZu6pP z2%ll^=hd6Nyi-GXu#of0X{@gP+FyL*49q42v=+|8SwCAxLW~ONyBw zL=C4BY3D9+3G1EEH{`zcu50bYaj-Rl)srStp%{mcy4r`@G%?^rqK4k4Pz*$sU>lA0 zguXR<@s~^=t?R|VFjHo-^_5ee#sW1H41jPq9>$Pz<-~VQSIODqPSEPR_g7_1lBUYo zvx&z;tJ2g9I8PDr?c!(?Jb|si)lXi})kzSjg7K z(b@Xn^$7okGy_aUHtK-|BgKKJpXY4qMEHd#Oyxl&7(`*AI%$o8sV7nzwUB+{>3AU{ zND`hc_5lU62Dl5FPA4XRb^!#=$D8K9pRbR&y%^~Gv$qr>tcOF2VZ>1iaIuC-*kAEc zh~9+fM`$>D9}XTVQ_t+R~Yzy#cvu4JPH&sJF0*&zmZz z&5%vsVBPtyj}2RXbjK6oglNtItXYPKoTCvD#-O^+Ud55vIoeN#Z`r&-(u`8v% z!K_Z*-r^U}r=n4?evek zSsH(V(sVclY)Vf;EEIE13uzW_1+|8@<{S{=AiN=`wUmSWm_b~KT9&v9fT#VMYN z9ySDNTqsm$r~TrXZ%!9!!vtNG%W6yX1%~L3z}z(jxVW$%Rm_osfrP((g-92)K#Z1_ zmglW}!9i&8YHz5to2lWKoFU3prBfF=3il{rCTuYiipV4~gl&t>i8?|$9^RG&=zyVL zgG3%W5TJ6pvMP&tBws)i8Xsp@z=zP*xuQ2I)ABM2jG_R!u6KwnW|x4p`!63nBuFE; z`_cueMCSOR8;elel)*mV(a7g0g-?KB$9WAKBefTwfsd#c<={TUzOr%4Zq>wRMzt4_ zW+z4nDTKUQXcRtx zaHD9uQw;NnIyK(W1$8P-APtcQxsW@=nE+lTb>NhmeoG$6M$Wy2t^1`k$Vcqq1QnOd zasq|%0{7?J8nLMCQ4erhhyic0|KJ@4I4$DF|6ld?I`l_v^MgIx8_~|*^_3fULTNIUrY60*EJItP+=ILw@zkx0t|R2-`{^-Lij=Jk|K)n#$ZSz zK@)MK82VKEZg>$wrrk=^|%ColC266N_VPSXv}OsTHCKo$nZ5#YT4IGS4&W~SM%QHJ(RtOZbdE+ z)CyVZnIMEa+2m72$zsRNAkLgv(1sevzeNzBGIvEN1cSF71HS7!b?~JrJDMIek_f02;HV{^5zR66BGZcHa>qxJhK#PDpForzL`9VKpX#!$T)}z zzaNA;(BTzfxV{6qX6T_TGlG%}9OhEHbVX@InjX?8yA@jUSX3b^AP+%?RT|7Pard%p z7tTr+D3q-4rEHh>j{VEEQWFNHMRmLeaU?RM7KyY3BMpR#kXHU3kMP0BC{=X=a=y3d z;X+W%cpAJ+-QcZJ*wpBcf8>NOP}>@cshAWY6TINgxwg#q5I8Uai7R?hfgSq%Ww!K6 z49*7zRI4mt5cvBIilptoY}Ehd+oHH(1F#I``N8gTfbmsQGna(aJl9!US*o-790piL zg+Di6oSSouYHN8l`BM2@PvKiRC^CMp7@^6EYDOWUV2X*U>2xLs)Ao+9&pYr9a10bk zG@}!9(HiqCW8PkwzbSY#MvCma9pVkU!Ro2-?d(PL^tAB#Eeu}qwn56zFp@39(o9hz zuYtrte20+a=`!CvPk(&)t^;QDy*Pr`Zb%W2-dzqQD+8)|scW5Gy*syS7lV$8+^#5a z;f_rtLSL@e#e-Xjp0A~%3OfkxJ~W3s2o`7I1XGtA88a%0ohwL`KBNPMQ=Isr&wd6U zJHVJf3FTtRN~$<7-S5}OU~QJt`E-II5k@L(*d2r9=r+13C9k4s+zQfII7C2Hn#OEi1i z7fZR3rAy#nO)|8I4Tu#(uJ_A!uu)~Z~gxoLLyb<;iy+7yGrhdv|32Gd1k$Kj$_ zCl9O0BBjE%b#KusM18GxV)HwO6}7iw1yZa`Qytm@>y}E0;A2$dWyY2N=Q<<2n|GU1 zAyeXpN!+q!$D(q*+4{TjfnoT{4i@QzWrHefrFDT##5DnBn&tt}P`$;P4Gx6Fcd^qQ(wUp!Z9-VRisjHN9v$+BFa=jkIKNJbj!95{oU-WV<7*qtY;joL`Alw7a@Fa%mtkM$+ zKx#bi*h*z`Y*=z5%^RFR45~%249cRZm-i#wAEB$$ue9UoSFr5SruQVlwKWcbtG)CS zAHW<|_oG=O3;jq1hO_iPAnYQHtyfJCr)iD@#?5O`a-Y8LU&q8hL%-02BG!0rTN3>K z3myMR3K#YY@C>5{bl<<9tfh@zjII9nj!V(n5@4PM2(joc+FDalq? zrl1a@qyXb9zATE23^zJ6`aOmqiwgqg>&GX_{dAl#rAdv&v`yU-R4Q8%9_ z*Zvr_FREhU*^nV0&Z`807aH??pkFD^YvMZBn)0s{W*75hN?)pa;pQ|n`o_=cusqJA zvwJV zJzA;<>joT;FI~lQ(LNyTWho32ISl1E)u$J3{G+M3l6~I z#tk7916IV6rtQ&#J9~OJk@(U^B>MDNyZ{Q&H3toN5=NfXcF7FK^^yBdb^|^iLN`d7 z04FF^djyyGC`O{ang~Y2<|HMCyt!kH=cW>U|7~}GLJR_`Fgvd@;?c9XXoA2rhNuD0 zQxswA_mv+ufdUhr*_Wm|6}l}KuuuiZYQG#D9T&_`ADb^(9$Kn@O+WrR0glpKx^?jK z-lqUDhNC@dkfQsl3Ky6s)yX$SLw8Tb6HrBW9LYg!i;k&WCr|P1SXF##P;*#)Djk-I zZd!r0)w)fl+MN}hPp&hms;eH;18$@t^@o=62A!sHs;W_Z>rDpXS0+GbmU5-7DgObt zb6Y<4%pn;ZtvTedLbJ1n2C&AOS+9TD)*~%#Njl(&b`RN8LOndNMBQ>bkiRBeDDzM) zI8!R-kFupGi`aml#*3VCpQ>5}*rg?+FIBR9M0D-i%?bH>$lfDkeYSA>2N zH>aT$Zft?~Ljq{bDWF<4?aG`Ucds6(Kb|$FnPGmIVx*e_A5BCYa*ybn{~lvqMbNu~ zmcHjHyYMa(LkKl@%jz5d=Rtq$+f2StWx0X*9SkP|q5ba|l+Tq>3o+faUgtWwd(sIe z62x450y){}OXAl1SUXIHZ@Bh*Oi*A-MzKMiC8EztAJAo}DIjn1E=b72$)IP*!WXE8 zT5;LA1YH3SV*wA;J7Hj&PWe)bFghk>4Z$`Is8)F^G-I?6KRWcedP^U0QAmc0Hgog-*RC8r~dyr zz5?j{fcPH_A6Z`39PlWAbP`(0rCO-UrYcnd5<$fE#-Zgrr5f#oEGOfJv!CDCC!g)L zx}Jt%d;_Z(Cr_jJdhw5*yG>JNAYqg;bq~FMy6>DE@R-Uy=J@`8$L{r9l{VyvRFj{{ z_mgA7=#va7uGnO5)i^k2g4Z~i6NPT6AKi0-o&gs)d!&)8v6|gKs)BqhTm7|r&+JFNUh5SkL?8hHV4>|M`>F=e)Y61Wbw*}byU82X6u718`llH?%5XFvg(!jD%vdu zcRX%sw^$j6lI~homqR)z>FjD@f({FA`>2#FOl$w}w~oe5mS*V{lI?cuC+;mKPnVwh zdW#Pn!P#j$kNWwaUG~*cr?|$MHPihZ*WW~?ykC(EyGbb1WA<>ns8^^OejlWnZ1VR1 z8gBzq7xow4WYywwje++HPZI8w1#_jasYJe{67##*t4Lp@t$2#&@9eicYd!-Tace!!3o# zk5^OBKc$TKL?1sQVnb$67;A4MiE*I95=*3ulEx{82(gV=+G#ciYBCKEm*41k1-upg z%jAB0V3=w;;4q&_FWG6uBj3ucoh>ONwf zDdPijlSZ2zkU4Oxbb&n|;({zueIAy5AxIYe_ebs^Du$BHZ;huwutZE~xYuIG%2|{TP z2Y&*Lgae_3tc{j*jN8F}Nvj&j(+)B+HkCqFI8(8#_#28u{mu!UWHX+z zu9S~WX#wgvMX-sKzXo1ia}Z8lGl__5SyDH0w8yk`xi7(smUz`@=#PYN*ASpi0aSeW zBy@bq$Yl%o1>Ox$JgD3_BHRA=V=bzMq5RKKtL^!sTg6u@n zo;3^O7Hi|W#0gjIiN$q`&2*`8xaPbCz}iT6=2Cp*v|b0kXc7v0=EP*iK5`fjeJqTr zH$j$`kQ|8Jy)5)d|^ivPj2JGT{m)JlL|PrIj=+o`CEPya`0 zJ5o<&TeMj^p`PnI=M%;%eBdJ?YzzifRlcUYD-qibB`XRTiMqWvo2Idwf$rF)n2nRB z_W?%KQ$J{L4GLg|%O!O6UgLDJbpx8XQfhy+zZN7g^p3 zLudmPyFq+kZRU*LLktRe7=^~HE5{7nykZG0HJOnL`U=oXOs*jHy>rAa9F&EMmrT?> z4)i8#*P8EfNY@MVj7B=0=Txx6c{oer1DwfKm$RqhBuToYjC`_}vB(QZ^k=b?zb4ArUvXg!s2e4Ad*-(H9-GI}n%5FG3jLhg&iM`ggKP)1zDp+)~>LQDyTgoFdB8 zpD~jsCS{#Y+wo=5?EFQ=4EoyPYLuEJ(;EdrUQn7z+hFrF$Y{_wNG1H{Omlg_yWaVKE7&(|kO6VM5FvZ4=tZ=u(3(Rq(psWgRS4Fv z^JbEQ(gh)d-Eek-Vj+2$A!Hxq_?40XDjvkM!m#&rl;0+@-gLURhUInFW2RnD&u`G$ zz%J1J)hOZ+T6?R=0vdSYh!Ut$H}oM{)D8u1)3B^`*@a`9*gc!3i{>bgo~>r?Ks~z= zrkD@?rE>t&F5>7Geqf!?9l*9r6%8gz%43x->9YoR8Ao(=A8EvyFpt;C+XcehCLGYU z2OkKx)^%|8#d9rEE&z{dmzj<$*M#?7xL#~~+pgR=lu+w{Tc}R2CjHr4=4Of>Z7dz@ z{LK=KRIXCA!}nW6C$a!TFuv*N^mQWP`o69RbOLS4u~fdo`bIqB-uLiAam_B`vZSdW z^I{I>JXg^i$@^s(91=GNdl9T;R8#8n^N@hT-U|%Dg_H{pW4x{2aK(OaA{8E=M$LPl z>!fF)IS39xwXtaRCxvT?TaF6?__!_x^`c<{;-g(c`uE=nEZZG&(|hjU1N17C2fRJN z?BhV?+E2nucC5SQ;kDAbU% z^Oyp|3d0bM19mBi)CmIsiwRBb zb;;!E&cfyQAis=k#;d6>)H!6mv8DlR;>G56X2_K@pnUvXZuL&_Z-yZ3p~A^{ zUjge*fQ>3nab^B9J-{^cieu+x+TmnmhHmFe)UGTBp*Bn&7_nE|bZmikJJR43J#Z`9 z;3dH@hURkeczJaOOUOOxfHrmIA{#4nMK0@Ngi2Z+os{NOhQ3+F%A$ypdFksGOS`fD z1T4}-#o6O`H>)u&`Z5(}%ZNSmVoLd;`O2#P&T6Z&jD1rHy7O25WFQL4cCw?2g1>t00p**bMI*KgjF`VftlnGWDy9m z{IGnM2-e2?10z%eVGNHLqF%UA%z9t$F6MJ`Gvt9)y_TfCzA{)^y1fb|{NE_C9IvMc zSo!#s_>|ii2_)NebxIRv2>uFO)3aCw3o!E&jjqRcfkIsR9A`{kZ6sBn){1Yl5|&X> ze&0aH7$VrSP@I58t<~m9z7S@KumL$zN`QI^N+uqDRYX9F6Mohuf0q)3oW(oYOT2?G zB!(mj_k=Kx&)+o{&>wekfg02Swom2XBt>+Ev@1jSO3D1uH+wCgPGo6=KUx&tXY;dm z_IQ+&?mL+kHJb_lVk%T65QL>_W|>i&+)bA#w)N*Vq@*q3%TD-}6SSNS(>M8o=B_}G za9+&rRp!vPC~A1CKL2EnZO_!aXr+hUQFwSE@HOw3qaPNQCu&4FZ9;bkjsqYkrNFGq zwL-$LU)ZfJ_4W+Um|)FaY6Y6x3>>wWy!z< zcB#IF8DUH-wB9d_{Y8`LeoklA2)HO*02jsIyVw0G(vd{b_~vy^xKn1(*TT`X6l zf`b_Rcm@&K;!h_CYY+dy4!|TJ0hk2D!W1V=5!06FzTR#m0vRAa`gdTIaFpmkgKyI9 z=EQdbWRzvHlMC0GwiBtx?V2nU8D#ALbuE6|gBZu{8sn~YHg4Nu1rnT*3xNxqRrY~6Ow5Z?Q z+-}B}uv~G#9#e~XS-(rD09NIZs!_3K8__Wolc2D-RFMtLUysu~z4H|82^y^n@9=pz_zW?;2zxF-Q9z`ySuwP z1b24{?(Xg$+}+&?!6A^h)7_`O?%Z?FxsM;aiXWRQ)*NfjHEj%kop}q#L#G?zP|CvK zHK$0z!u9H=xeZD!-B}v$Mxw}#V02h12cPi`*2I`o)kMI*yJ<-^tI<@eTah*ua=O|n z-jQ&S!HxF#rW7oj)~wUPIL+W35$0_e=*q6Uw&0&@pr+F>dqC4yK<)u($2~X3n2Yb{!6GsEJa}S>-iQylY|JoxCWIT< z5N-{3L>@qZTlwn5_(Ux`Noo^#Gg!xrKBlD_{OGp_%Vkaz`>4H1pTa=pw)By;+&pvzwRq(x(wwC^cE9e?fni%J4`PP;9 zq<}cGZ#F}!x>(Edj`}Vn&eMG^{6nRFO#x-tUgoK6$k-!<^63OHJQ5xc0{ZaYpd*?k zB_=o+CDaGHN=$ftO7Nr1H&hvVyc>k#6%smMGQb%o{~7EQv5=iWTs)3XBhL2_f>AHB zxPzo=#wO_p?HxwZCm6y4l9m~}i@?jbOUbApV7u8sx4Sq0sr&f$?@$^ES5{J8;ab4t z4zkYvwg_()5X`f`aShCLqg!GCDicWmC!&>q+=M@i6JJ#SAaLY^k=lZ@34)~E8&<{c zm!et94}e6X@=yA%c*0RIMe~)lt$uZAQ-<4R82(MHIm2Lh>es$*%yd_W_1xqcq~2AV z*EQ$#ZB}aLS3SRo;VHIku%<@bIt>@5&xKB&W1CD~W6~|1 zhdN8G`*a`!4~$oEp4pf$PNu1kg{uu3la`K7O4^$bX^8lC%p`JXXkv~a72yt`?xJUa=`DR-jp}PI$g5wSm5ofTm_j& zy>W0=F4!<6kZ(SkZUnhfi-o|Txlgu!*(jIxrq0h;s9jNwJ<>io)Z$m#PWv(ZHnj|_ zv54wo!qjEcWQNaUhEZqBbYx@qgATjQ_@a(&de=tLoh~dw%1<}N-LWu|M42PqiT<~} ziAAn-XHNpDp$dISN)7SV-TV1abR$M^Uc|t77eU{BL{x;&#O(&^(2d-7e>}Wez7cMbso8KpYBx%UR>3psXQh;{ILG~=Yu;`Oi85)^ zSC-e7a>T=aPP@+ZJT2`tyopwwwzLG21KTC#Ht5JM7IH0#Fjl z%VbH;!|AG;S@2VVuzNxJGDwZ}?SUSRo*&`l&9my^h_K-t z5#vhMsElSIIW1GrWI}+U^gKgXXpN0x9kFDR>2Z>iqOK$;oE3D+4rZtw5clM5!Q&}f z{05Y_$Q9@S!e+`bzPJjs4Hy% zLwdK+Ae!9-DzziL<`#eJw(FkrA8gd4u0u8qZuN>+i43iH5Heom%X>xa3%9RD#q11< z@$7@~t$m45+*NO(SA{d=FPJ6{OWfVjBMM7w#6ghznu%98hyDs2YfpM|K)Y&#a>ZKI z!&x$6m*j~FjS<*QU-)^k+l@QI?#8w!XgVYCw1W=7EGaQ_V`Y{2JG0oBFvZ{pK)@9N zxSIdoaaC}!aQ@o}Uvz@quP8g5)8R^eZi$Ff+PXW8(r#$Jrv+&j6@otBs-N<$9$Ut( zsBz5|qdWPDoFwB3=!g8UlU-(AbXywP<8<4!$JBN9U+sIGl#g)HOp@ji22w&&p%LU* z*_JD&>R9c&7CS>w1E%B=J|+BI-1}wwI_?H%I3}UE*@dsL$+5)Q-46+a_q-vCQ(lk# zF2L+}U-ns!^5hccfZ#nmM|aefYz@ZdrH*ZObUkkXN^GvN0zQae5-uG>L$@+#J+>pa z+ulB*MS$DRI2qABc*x6yW~HsSr1Oswc~sFM_MjLTD)GS)heZ21F{X8=x{}jtG_BoM zTaYogvs%3uQ5n0lT-gs~3~+B6-I56ipFrTk26UE0kkZ`mo1?&Ys%baoaXC%$3K;bE z#sJ}>f=E#?FQB0UWC{kR{MZumn$*)P&S3C9b%c`fibm_217Qa!R70j6Az>hH=FJxB zr0zjaqIx}IP53_G22)e&7SAS$kwrAlJEZdE#(%8~Q2A7Sl_zOxND7T&-W77cv6ZKh zg?ed6;f;r#YW&Tgg@sALcGNy+Pvbjb8H}LKwXDG@(^_E`?P+ax*|0b%6cIFk;kucw z7iZWD*ci>o188VQN79XXmR2G;dz&@Ua`DxY{B$y{gkaSZ)cpb0P>p=GDUvf5J8AEJ z&p*pokoS7L=zv}%C;(3X{q3e`VrJn45V8B!j{K*-K(d026bK_qmfCW)?YY|hfk>AH zD#*}!L~1?(4Uwwn^iplKPD6qz%$r6wC_I2|IO(bWQXn3hEN;TfE(FsZKgaI+1J_D; zZBP|L6~cPZOB>so4#J>;;)-$q4_6*EvhQ=}dp@GsfME(D5LjK_?TY$9AQ3JZ_T?A&aOn zdS2qAG-f0NHwQ^UjPdXMkW_ESkWy@@c`sp*ze%gYscC&6wALaLb zo`k$t6Suk4mN)L-YJI%FLwg#i3ysI&vCaaHOSQT*_Z5jx>T)gtT%X1 z^046QX~86-R_vx?zVJ3UArP@xCfS`^uE@!@~%zKrn*+dv~PHoNcM)rvHCG{97 z@HeQvaza9j+_UxD>fXS5Tt&CTB*N}5V;8l%%x|A$4VNl*n&PdB!g@=Gi`@DqO2&sQ z35hIep2yQyjL?=|2lNs*ZlVsvfXgM2(Ac)iOf%?ddCL~49W%64;GZFd)RN@kgCK#& z7tJ9GHxnn;=W*BXzc?-?eJQqqaVOfP%!X1=kspQ@+Rbu2@N}(0rq4t7fql+=*`+JS zSoo<&G;lDv1F6!w%RU-Pa$D(}i_KkZ+WPuhJwIc;S!SixZnNl|BT6pMe7*oV5T&@w z33$(6!%y^&~b6@rgAWOp3j2ZPTMD`#@4%Q};H>jOsZk`RI3B_fBR{Pc$uZ zuz+63?WJY8Urb~Ro=9uUH>z!~f$fHAu~8BtcwjsOK649`9&3isL*z3juwzmT0>b=z z7<=U+p5p>shi`x|_TT3ql*~;G97X=kV&xw>IruUL-t%E@VjP zP?~;9Ym04%LGW67b>KJtX96m~L^^*j|Cl>~7bUZRj#1{SjrZ95_;rf&a$0ZO_k+9t zCQrS4N}&JoUTOFMlm2o1aEiYT2sii{>}oc)vk%@!j3unMZwnUi)6-p}yXZV&S^FF- z-@s?_go^jUaj%$b(E@!}orpt{dp-#qh^S4)vjEp#gXuc=eydN3dl+`Bac_OR23Acp z|M;pi#jyPi_}%lVdvc(~cAZ?VZ1%df$;m9Tf87GoL zLb=Yv%hyecbXYJudkTo1TRI?1G?_k}Z|41F%bJ4DS4m8QwS380 zwLxu+pWMv@Uvc%K(^(L`-V6C*xql>+lPStxwfY|Ewvt8IOQ*G(8GgJa`%V$JqX7(B zI41wI=b1^_3`BWJ$C7p3y`zG;o2Vk3{4U%~U_LYibr$9gl5!SzHNiZtQs9ON?Sy7l zD{>EOHNVRR#?*>ke080Drkd1IVb7Th{iK9aVMwIhAqP*NcX$^l<%5UTuuwUbZ2+an zqgWx)k;7<&`r3QM!id66lr!CUfN54P^xT%b!VbuoY`ArY^vm$v_c<*xX%SWRhz8LF zrg|5F&WI*Z!nG1gLhNusJf#}O*6Q9Dvy*vsE8q%h>ln805L)r^j43kuZst~U3M%O; ztKjlaF?StW#@(NKvVkEp;3)NP+5Z^_SDUV6{Q>ntGXST=f0tDMMWzA>gce2;wnmPB zD69YNfmM`bWrr+=60#k>yi5}mGWdy3+mZ1Bm@!yzjZB7~kfjVM2n9vC+a?Q?*Z0hOH_A+f{s{Z~tQAiz$ zsm27mq3WPF^$|DY_VJAnlt|@~1AS~0&lNRFc3V|f@dGzBI{W(j{EO}55Db0kImjmT z+4=5K@iJ5jO2n65IF5TP=tJM*%g1x)`mPjocUz|s8`q|QHT{^BchVP}2d)a+io8sj zu8~P{XwsvbfB~^kdKaWV>xJb#A5r>?4*v&CU4zbTH)_pdDO(LlRg^1brF>rN_Ruvw z$&&4r(n|{Uic8-5C~HsJx7?1NiZ`(<+eGSu%*zm*sPHFTTFpM@*dZ+*-Of}pl_W;l z`dP~-&zx7QJ(AA6oc_VDtrPC?pUGb>mDy+KEABYmh;6s z9blPK!Zzda#~ME*K{&pM6Hr?(ABr-ciJBT;%(-@)v)}p1X_}epThZ{i!E0kDKFtnu zjImAaFk=^RSQ$xAaAvhQ03ox<8VMU%B4h?>97H~q;;E$JRz`NlAPYCa;g8*Y)~&eQ zf&Q6m{cSFOBnT(m&&J5nG^W7OnmH!jK^)q!TLYB2{v(c@0)IH=nuYJ1WDm`V$MG6B z1^N6yoKsh56!T`_VU!lHG47&}tn_;_lvlhfIM|wmQvYW*jS2Bc(_gF(q@wMd9#(qkE{mA5|w7g3Zx$JT9ysiTi-nq_AizhybMNFx%5<^ds4ZOn zW7i(`)Xl><*^Nzi5yO%os9~2Vp+}f1ekiI4<(_Qi7bb2o&Bc=Y)nKg9P z6hGh4IcyYNQqY1%J*>|)@4wAD^Ez3bO#q_I8sO2z|6iv?lufKn>;c_?KkhThzkU-k zaB=#JJgEpUHwDn9=S{WkSg-FK6Vil+RJ9Q(BcNE()RIy$w19$18-_R4T5hkkmcS<& z&N)D*49AELnFgr#ZH!BrlaQ@-e9g+@W_FvJxZ1?$@9~DH{j5SyLi1#g9?3*zvTz*A+v_9{&W&YXgb9J z6Jk-5xPbi}Jh0t#U6j`7^uAreEbO?vNwRWbW1ShBaet;3yADLk&uqaE8`#&(tc`lZ zRW(as3T0_|{#gZlTGaOSR5SbRut96u{ki{0HRJ46e3CQ1<#zfu7#)Qy)NQWqvT``i zeKj6*I?tBXgZ!&_V?$!0^gSzFDZSa6Xm^`lzI&JPYz&Pg$`%6(QJc=2e5^*hPPj#M zhK1VRY)r(9(_+2tVIq~H__+H- z?e}dHm7sV9#G$ANgQ#*yd*lPts7wU*eGHQm8@uE_o#t}3Q=AB4`lvklHP$h>Gm{5= z7DgH!Z@4|pA^KO*HP%6;TW6in6MTXaU~Rrn81@V&J86N05F?xq5YGsdN&)C6@QU$_$!A+kH1FH-GM8g#fV!V@+WX~bS+2OzBd%da(Y5x%P~z=s&R0^SJ( zn*pV^zgU#+A?L`&duT>K6Zne6_4!V-=U1cY1m-UYwx~L{%oL#V(%xB!v;_lIl{PYz z;s)Y=k+Tda3PchuKDkk)1{5 zNE<9GEH_C}lDwYLJ1RB&B|&Jr?qal;z$xT--FBRH%ro8gn3U7g{r15g-Az$EKS3CJ zkp!u<$h-_vDp^5}Fh&Fu4pRmbYhZ!e_B-yngVu|EFJ=9V+4K~^}Y)c1;z;(t!I- z4hLzAoqR`hgEOJ?t3pWswu#csV@%g%TxMx9;ocf7{!gj>V|P#ovv3(-4kY;UCZ{g* z49ThxBWD}MrW=7V9H5}kL7K-2eX4wwJi7ZiJTBh%K?Ha^)%Hu z)NvFh*rE9qu)+y>exV-NQcfi=p}-Q$I{+h-E`V zS9~51LQ##cEERJlB{)Z>BeQ%lPRK|lv!6s#ixHmo(0=q59!-X7VZ zQUg(qc8$kZ>LGZcB#HEzN)XF`f&zk?#NW(;w*}X?z^_YOSz@e2(NAneG>p_efE43E1zmLBv+nJeJn}}Lln3?~*3idCt%mF$Y{Pnqf)uP5ZMOvD*=% zLmU6EOs*YiCKmmE-}}mCkpI$NT}6#+#?ZT(*zlT8cea$0Zl!IG>(}1{yIB(y0;Q=%=GbaUh*1pWHrbF8NV%F!2iI8E0eJoRh#okhXq64vF zE^Lq4KE$*67)0MMWLWwxvKvZ-vu?+0HWB#dS~Zl559gUhxQ)W+$INy8ZD;V*J&BS9 zLTAK^(?9N*qb$@%pj~%s;aR&Ktc`~!N2XG}^v+swNcqXs+#N!P9uHYZDrwa%P+{f}j<71_sPln4w-(X{rb6M$5ID6IATX!B+?KXhIF8@wg0^{k$BAR!2x zh((C6wE$NEE1}Jtr95veYD9&zrIK!e%TT#qpvD?1lIkh+T9F_Mif*dQ%cj&|tK!~_q(jpAiBiqS*6)knY?;)`nR(Gj~y<@(VaN>3_bKRwp z3Z1>{OO-PX)ni(J(Y=I{VL7X$ApLa3olvqY?&I&v2{Ed$p$OdkJMvJ+0?0`K$V>Y_ zC9HoUPs!HA;O`4B$%?bKNB|*D0Ptvj0S`>mLIEZ+;HF7N4@(9=jL~9Vcnd&I74O10 zK3DiJNe3X`q?@S=NO8pd@h|Cs){fKEU;63OHw&Uz$*?p$NxSi|v9uR!;`x?&rhQHF zX5u*>0@KI4VFnefu&nH<>*G-igiHpHdBM#F3(^ZT zRN5PS@Ni{B|G-`4;xF9Iz3S-6g;$eGzPfXK?D$a>CmR|0g=Ne0I6Dw0n?rpl0z?cP zTO(wS2?&5Y^B>zA0Qpv+_Vc4fPyL$;8@gxECMD~6wO_ac0Xq%mv)07|;7(`GQh_&= zHR2qAyRBT8$tu0TwqaBx+f(S_BEbXHtt6M14eG&G*%cmJ0PgnfvE4p2t@rBug}aYe zr(PMqaQ6nhKky58U?L}ja2avC?}GM*c%4lM+Mg5x;Y+y*J2r{ZGhgaeTtgX9hiVbs zWPSk1)enY9tu3oV&CbzX5O zT80?c3@C%&zOf(~(Dd_xoHH1E)8Bb~%G5!OaE}!~^Q)7$^SvY1qbjGp)ck-Lr z2S^P=K4;E`(#6Jf+I~t`wA%3!SdRoK1s7uC!z4WHwKpmam6gSUzxnneJJcAbFPJ8L z4EcT;ff40dP>^*=O%8O;xFUonhdbGhqzLnKr8!!NvL7#9)y>yJ%!>n zG*IE-c3DufYQxavwae{jm0~YFT7+h$)?~EcQ=A7hN#WSe`|$yW z$!CaYHntOP)4sSs|9TdooMw_Qvl$6&7EPtPgGfUrTrL!LGwlZ~HN80dNR%axQ2T;} zlF)WzTt45x47JIuq1-5xWb9iby*{s1?eNu&ed%Nr@xq3`aFcZ9t}wRUqpqpX3@W1xNiMXyATKx~rLWePak8-@ zJTgnmF?F_slkuFrU*o0N3pQtk2oVEqp@oZKkbqyZZz$;=hmEL_3Jp zZ9a(b^)QMIuI+PH{9xKvoxh}w%sMducmmObgMTy#99*>oS_g0}>N}XZrR)=X9JM;KW^5VF@7-gWqdWx$**oypcsveUguW|x zweE+~@7%tvP( zf7fFV32gLTf?upJBQ_mt@XN|*q82{$*v1%JcVIvLcI=P9?4wZ!zx68C?e9fq%|Rwj zlSyH;GRT^Qfv2m&9XJodN&ZSt0$+U(iXQMCkq0l!s*Iu8Je)XW3~b#SQ-r51)HlO1 z<4k;h-F<$=v!&sbm91Hif#($W_H&y#R}I7)Y0aQj3xk}T7(^ftm2ay0#iz+0@R#{=x7uz@;Qkb;yyg3jLtN|G! zH1c@myj$8R^fK+Wq0P8kxV2*?M;$J5(!6vClpxp^hZ1=8H)kN8d4SYdA*cJ7d{o3s z>G)P=9g|ZXf{A=%jOhZ|`;)Z%6vppMB&Jv?!i;03`|l0mzfDY#lI^2n{-PuSAdTz) zfHKGbwFC9#w+__Tt;Pr-M0#r7h=AHK`Ac4{0XEl3$qd>%GY=%5U*i&coFgGbR>T_>*bkM;FTO}ST{R{c65Mt-t}Wl1?u2+sbG+^{8Q|Y& zr%!ZUMXUU+2St9A%Zz34c%2nw&!F^-&?AVPudA@;-#*8u;1$1Lr^XKGLD|3Lj0Q~^ zuDUU;mENfSAnd*vv-?tEb@k%A!pY+a*2Pdsc)-4gZ_ZE_jwARLs%5 zF9NYI+wA`>PyeRtw53?3#~64vKYfgj@Uu`N^?Ia!CQ%B; zjFx|)-bJDUp%-$f6Ay{nDz{3^YoW_)i6de9BlVbDVHBY zLq|cr-$8-_=r`gi1&>DxiAD?N>AdUK+=TgJNB8H_QiCiJ5Rm441UNx+S6L4GS^%$<(;R|7nX zBcPi9Z=0-teNV=~Uc%PG*}}lu!t?K(HPMRevi$&h1DIsNvYod86#-p@Xc_P1Cqt5q zTzV`dd>C8(rT|JX}o?!KHrNEulp#~Y~ z2LfV5K(J_VHE=mY+~+NDJ2uW4Xq4A<2dZ7<=b2yJx`sguC z0XlC@j{zV34M}H_-pK~E4G_%R#&T_%VmXD{i8Q@?yj1tM@|2v)m{cv6aa+#Z1&<6A zZZiXLs^6Vgc6DRD6g^X`QDdm-o|`Ykso}1a0tuDW@vJ!{O25RC8utkLX$hSr5>Ph| zC~m@q#-JV84-0ghFM4Q*U(fS*Rej;$9SI88Kn71B+Y@I{_uCwo|MBwz_E}&D#DxOI z@eaTMO^Rq-2=aoR=z4+!Ozbv*qLh>jg_t)_!S@+e?Fz9?wUT8BB_Ad9RH8_nFdA{J z7??#=0{%>{oatql5z%susw6YQElk^IbV%7j^J^LqL6Sil$?oS)w1g&X;U1?dzG^f_ zh_bA!FTWAd;M1TweVXwAphz&_F{`%rvjxN&{pimaLut+rI&T z^Pg-lZ|!1cVJmFmWMF9h58Er~NC5+iyJ|Lzi}jU_(pBF?Xi+>>yiY;!Ndg2<92O(D zHkQ=Y{M42L8K>oU>a^6rY6$4bM)-+KTO$|3Jv&TSc!u<7izIEG=c~8)mXuCziF*;MhYO1LBmoXZDkDMWQT0m8O7JZ`v zJfwHLXLe!hLTaDxPwIv)xeH7b$+j>W;TkMf1c!B*cJ4r<`E~I44<6Fib&p{flb)nB z;tekj{E zM-kiqVa8d>|7XT#rlx*$8Tk{H8&cSRn6ZcYT!7*PsU3fPyU!dS6`(;go^Nz!;OrXZ}ia1C!A>Q>aAEHWmV8H|05K-L`F)G}G`v z6{E4dHdxDO^dMC#r_w=gf2nIxnCXnB8x&FyNUSwy^^^CC@k+&L)9 zhvDD>ESkPL2H(M~A2+AXcKmz0v^edSa>&B9B8DOF726R^_7Tjv>V_tZc+ghKTHTMT zK##UeUv3<3Twl^cXCo2K)4r@U2jRRCMA0C^w`E}sa|V?6E>0m^nW`Xr(UPT;yE`65 zFb~4-5-6(}BCMb%AdR%~Lg;m`HVjpKg(#s~jaE5j@1~yus$Fffn;)9XLWr_U``H zQq`@usHX-P5eHzze=AkSl=8s!tpfxmnGA8MPN!C=wU;9kSYhUJwb`O)kS?cs_Z z#7OBw{{^fL-#EVn7>6WH##*d$O<+2I4gNWGe)**Jke#3vE3n zeq{ONQpDt{kvuq>Gc0Xm9wW}rf=4V%Dj}gJ(dHVwSx*&B_P4gPPw9efF>vj0<-^L< zC^E;m6P!MQ--$32ujsnK*iO4dtV5af)#nSHKcuTvN6Dgh4bLaD&baF4@%&t~P{a|( zt^miv){H1@_WLdLna=H46aY@#5D@zQZOZo7i7T4e*g2ah{SiL_D)PU?rvFyPPgWcU z1V9vCkYqst1@9dYRA&(LN{4;m{Sb2&3+*sM2Mv8-;v$)lez#}!v_H4CxQhgc750w! zrrVsZCOiE)JApU^`#!;9LroBr7y;;Aw78mG4lws{*KIhpA26F~Df0M(EiQLYUsaYn@(!hPja?{dQt>pGH&y2Zjp3I;RUaw9%gVkKL zatLW8)%ImQVQuZK!~Uqkl(O9TrJXi-Y#{&04HSwy17+#hakR)|(kpw~N&tz^ulPmM znt!IRmRW~75RWY>4r&+nE88ReaOfDi)VwU~qli3e`>n)0R1G?9xfBMg9YN*~?NSkT zKdpmL;Sz*E#9+7%Asc$|)H_rIyMEI{^6$}1P@?|t3Q_N<1MPFd@uG|pB$8DC>efn78#P_ zudFgJH=p5nVZ-pnj&Iet?X<@WQ9M}uU z2I>iB5LRRhWw-^n71&iL`jZC_3`Xnb5QAxpSUS2NE4xN`gHs9#*3Sw*Li$c%AwVJ+ zP_%M7>yGcba*tabP9S(C&4}=vJw|JJwZt8=O!suc5l=w)zwHZ!s5Si@Kwn>!!@N7H z9mj;G<=?><3uJ?r>vYY5@fe6%=D!!z+fb2@o%YFa^m7;s3pK*ys&+2F;f^OvH;o;c z>@liYIvWRPFTkA8v}sc}>Ma;OkB`Gic3vzmSH3|TA45Jg|1N*%Co!IFX(EY$=y@C{ zt4GVDg6t{n#sSU!ql@0Pp^n2#NZKIpGcAmVI@*=~kl;r$q0{0c*oRB>33|esKG`Rj`hEsB{4Hz?#U6q!(*=p)-K z0ESC-1N=y-C~K}hghe2i&yz?#D_?NS#iooM+BsTuX*a_s7hz`nt%=5*^n*&=E)X8o zcfveYf3&&AG8QG#ZKM)P>Pqs`@Iu(j-h^oUf<|F+OWo1XBEf8ZrFiU!N}#q&PzA=e70JjvuE!y4(bsI=7w6$Sht z`xI2uGP3qHn{9Ku?fN7{ZTFyekQT^I?o`wbJe>Dx=)HqLZ6DEo!(K1m&%Pe^2=@21 z8pojdkw9=ku5Vx4^ZovL3x#sw`ac1ZYW@FBXYw!S`{%Jp1IC8{QhsKCJDz0KNr28I zP8U5?Izm8FBN!I6OymkeZr#0>p_a5oW(Mfmhc(SAAtpGb1c@o*{=DN>`#kOzIv(2% zmwAy2!^P}^>Nlky$UI`_K6ZkTK!tSQ`TX!7-L`$~zK`(t{D9uU8N;dSXXD|dT|yzy3bVkSL^wX^GfW8b_4S7<%x@Q3?o?^L|0p#1?Wrlo-)C^{^m2R zm5|cB{F+c~>Xzw{utQ`I`|<@ks(A8eem)@S|+{fK%RN{0UNkuR!Qu;hgcrCkWhr*Kdl~_YI#KBW$ zRJTeHT8WKq(E$oh(&efk)K`R!6|`SPC1!x~eGJwGs^xErjaJ%~NZ~=Wew1IF9&vqX zzcu|j_a#JTF>8IEqK!ZJ7?U85CMh$6?6K10^uuhMp%u4Ga+oJKfdYe`%?j9lJtY`l zW9aAU(KrA#MLg{Y1*R(`xqyOniSu|l*Q|=qW|*d^gqt*{d@7}87q$zlQmiU1n(#d~ z;f4rhkO2<70cZhXR@MC?m|u?~n5^BtUj13LW|bwk zs6#iIT;QI08A*^)7$nY5dKJhh-VuXuh^szWorzwXn*Ksx9_`0{LMYTdCT#>t&_nv{9)!j)D`D z_=Z;VrHG6hKlwS?OSCUN53T)~axW5?p9rIuU_|K0mHX3SxVS9m$8jMwD;_u2HX&Tu8`5e_d<{PvZReYqXXXYh<`An&bOw}Z%>ok%&`d}_WXC_iswWX&I?cF6uC zjSqVw%>^?nADQ|Q6mXTE#nOGEp2^dEvN~$oXK#>XK`cpTp;!~1cq~Z}Jr^m;_l7v| zJ|ANWp3E`i5mp;0&YTlL5xta=y|}!*u85JmxN}elT=iDYc%rO9a)OBQ?Li~S;UnT2 z6dMh4RXbLQ(-y{~&56TU2=CrHx?q`QU?5!-si*eN?wA8}v$L8r0MA_*XD~+N8CNiRl{(EPqjd85GqyqAZgdX?wLiNS!g?Dt&&AH!L$-F8$Vcur ztgSrgRO&!Jx5r(o@?5|}?<+4R^=cHVdqj7poc&45N1FR)aevjq4_k!L{xD-xfsx9& zy);`kL_G5}(~r0>+{v}Gs$Xg_>oUnZ56{n>*VP)IeaBK_IVka!{LFbRUHC8bnoZXF zeFaPo@j0|rm(*IFP)|*-7*)t;Zcz+Gd4BM|;JbY~DG5LKgu5=|yQTl9J3a+{jQN#9 zN&w!%RR5uT^vfMv82!BnkgO;p2Pgpfz#LZOhT%VXFk*qQY6glyp%;)FhGFbA^%hs_ zOQkf2|CB_I4u=4+s*Q21s|KJO!EdH}c-(GXIP>>x@qb{cEf5;;1hTL`s7)V06Y?e6 z`~=%(%wgFv$M*VePQv5F^kB1_w!DF+6f4Dd;fNUqbUk>-93rT;5_9;Rz??;LYJ){< zIn5SK+=+I-goL^51-sV9O|tB$#qndz@5IT&=zb)Kre)Kg^-4prlnb2oT2>nK05M&*mvfx~xV=L~a27a3OT*&|)EW|Ib0xz=OR`WW*L&*l5W&w9|T zZYJ*mBaf>3$@0CfP?*M;4?i2wLb`g)wTCO6tG4D{PlGM)_D=jLU?Mon6-VdAuEDv6 zhzMIylu%su;U+k|Mb6U8StOn56hTd}&`OQsWplCW%BVmL(8}n8rO}9=)AdNR^hsTr z%M`PsZUPpR#N|a-5h{bgoRNy$vd?T zzVuolfZoZZlNm<5schHeXrk+Q!^`w)W9#h&L?2%T#-j7fA3FG!X^e@2+G)&`HKHBzn@74-y^U(Q_(Rtfr#EIbXcs()$rJ6kf)^z* zq4LQhW?RNnk4nb_dkt9`>2~IeDU+1Er-%bI3Me?DPw%wphuR%Pf|gkXMz3Ob_~s0ef)jEZHI8<#{{+x5Ao-Vy#Jw zOB?q>iUx^_jD}VRYOb6M`-aiab}4aynuppCt_p=(Ct7i)Sfb-FfzMFwytM?4s3-o(W{EH{ZEqTv+)1mZx2bZSIUdzP!_=<3>l9W zUXWNh5l}Zf95dLnxBpqV=>79M#o)!-VS$K9+eGJ=boN_UGe7=~pTOTRSz$D2j&6XY zIBB#-b2A1cKUTmRk=xEZw&5_)Gzpz@Za!T|3xCA_PT=_P3mEw}A=Xl$L~91-OL{4~ zPj%$L$8lcD!=%@4tvC^Q{BgVTcWoQG{DurYAwE;`){&pDM~-#qdOCD+h?FjCk6*;9 zQO>f!Cr^aq@{f8Vz!x&5$Z>Co<4zassHCtW1D6Ldn?>iw1d=@1gn}H{>PLv~>4>EE0WNc81ziT8g^e$cOa>bXKh=duX=&3~ zL;R)YOw4GG41lcCVeWHCj27chNfy9Ne@NrGrnOiQwq28LQg z!^J`Dkhbi7d=DNR2IX}DcWbxMx9%`&zCB-K{K27S4B_=(!#u4%A;Av0W2+rZNF-gv z-iSW>?s`2XM`A=Twr=int$5qn!*%qVO9$2lS7I(WV=?RX{;m%T24Idd9?H;}EXP)@)sadb-E>HzZi0R6mrt!?`;P&F!psqrU!(U>ZlXqd0@oi8K0H zlMuJq6=cA1CRQ<{5 z9PunFO@Bk(WN2Xz$pbSKe@)mDHAMNA<1}(ck3={mXFvZ`&8=dkCB;b?65kEz5|!^w zNR5V{(Tv@L!DMVL>K#H3NLsjtSy|YHBG@+~$~OR-aBjhDih>%%Y7%O2-?4{xNfnR9 zvt!r5PN`FBVGNL>FaaSr!{GtM@ytp!4W z^#$(Wn-5wQrRJCHh8_Pcg)vFk)W}pw+3zLqHj|EnZtZ3?YaP0bee1}VFtQtHt25RS3AHgHUwfp5!)$F- zj$Sgb&$nV5cMHl@(D|0227bZ`a=cXJ-9LwZJK)b0sXwF)_g6NW<>d^VZ$O`EFvb%M zSEvx(JJ%Pg-z`hE< z9Vm-i!p9;XBzUboQ8tXI;%~t`1jhH+3#o!zYc^Zx)g#zVY=OQQ&YVKsq~5+k_}&aNO zd$!opFSd1w(%ejRva71!33QEU7 zs4|CeEM~}uyz^DmSZ&-tyRs`XDc9sG*Wd6cNEjImR+WBD8}GJ{Jn)J)jM`9?{X7Aq zh%PsSpSSswKzJlM$-n3~R%4)N(;7E`8Bqa@OaB*B3LDrMnEl<9UzE=k0o$$bb0NiW z0#*vPA}9(L1Edk`D4_BA$}r6NuA=V@guEc}aa=ZIQF6WG90kAjTlqf2AGRKo6c#Dt zyv;hT-dy4F{DOTTPZk@6!B4-{KPqjo_T|6EZ#@|LtjUm!R_3>uGG zT{$ilVVh+$VSq{n3MAOkWI(;f#%49U&o%8FGxFW2ui8^7h?RG`u~}V2a2v7me0599 zNWeNMGI_$rDNrKL5eX^fRCB^XJ^ZTTj>D#-nVopowpb*JXuXj(ROXG-n@=l=U^-O_ z<)?F>>#C!T*B2GtwDXS|iox|JTp|sIw_f^5T{4+x*xb6?F*#QZHnQJzcjS~qkUAyB zb9$4?i7*#&yp#-5PH&jJ)GUKmO+`8^k^MQBX}yZgQgw)CRorc^(n5^du|+q{&Uy|< z9XQw6)7a4;iun_H%ebL{j|0F(m^CaFENOeRv#1Z8ti*CktA(3vE&3m1SEyXrz|l^u zSx{>4As+#hY!Cr2x4iaqC-ws1*x6Ruml*Ht%zCbF;x2v+CXuT#+Xp=0r`!1;g{;PR zH)p5QWJ4zTy#2{Y+!8_^qOG=f1QELJUBcMUAE11U?|xhX74iaI7N`{A9$=A=uzYdG z5A)4}7_|6+PJzLHqm1ZqHYftkOM#Gjf=)b$aLIFOqUkY*M7U-ycSZ~mc2e*fcDCv> zdcQ##UlA(bH5izhWV;gw%Sj^i@oSurA_@-aIjS}s6IP>>a^^ecEWANR8pFr%nGASH zK`HM>!DI0gnjSkxJe$)j(&Fx3WPc~^p8?G^VO>_=dp39Q;eTkAi4EY+r00z)ycfgc z&rVz~)6}^W7`ldg(JWArIqz~s8Sv<{OL2=)dU`&>BpvB{IC{<@NJ9lu=Fcihm4jC| z#qn-wKPyTdRwo*Ux`_UOzPsbwn_S3_pB}?M>l9$iej>94s~ZL(`YuM2v94#mLkOXO zw2&&a?R%s6n2hDER%YhLfJqPvik$n#y`TnR{xfJ$HxcBgd9I~*9le44UKUBy5uD(mXsHqjPkOHk`yhxtNCL>)17_Dc-0tlJVB-Yo{ zePxQfIi;FsJdiJFoFCHxBSe1aisSBX3PEEsi)LkpvZ#a${;nTk+xFVYa0ekMJ z@3R}>bgoVtG|tt0Z9l!Q10em2Bp`6rS2Ou>}U7wr;a=*z1uHp zi^uyON+!!{b_&5SnCMev{S*t|BEH7ChKSDjkytuog)!_Kkd-aS6pc8sx5&L2IWQz~ zyrx!AN~Hw#;s5M7|z!d0JtseI*8ku)(0v8{zxl&e&4g zUU>GA`KReTV8OSSc>Vk0%yM4@9leMAch;uk6;nQ0B=Jf~raMQJqE8ygvxHwb7gFpK z4B}j>DRK%~Y%jF^(xN0u=uq5(4EU2&j`7=s4Vo!Ik`QFtmHE6kda=Sr=vOHCw_MBI zDQst`EGchck?_g;%#+rY{6(Nb!A>aiQ3PdtQi*K`dTY4BkO1|ed)y26j-ehIOeKjOKX&W4_umECUi2CZ3Dusazi(WH z?gZ76eCdC#+Pe$j9%vsVJ@x#^;Dzi+PK{;T|eERtbz{RbGmGYJDw@^bxHbT zMfiV}Z_FsCCCnuynlHhE#FU_ZGMb)rTW*urVf|LoaJ0U2?PMliAY(We!kuYP^|eec zH9A-lA)hx*OTszYccgK@;OGe<*bmvW-KnO?*TRlSSTba7rf0!y_FCyn~U~0g>^^1m#tO>57p6@Z_Hb z4zo(Cipj8;&uS8nM;lRys3U(eH_%B4s$iZBt-xf<_X=jD?@K)q3{$UjWA05hHVQXp zT87Y8iFyiUw5&r;-*YY8)FyrfA3ea~OI%5UJ9~xr_x2Q#-Uz=En1aVZao@jXr~YRO z0?Cqp*YIa4UdqntA^2>5v0N#A!2q=<_`tsbVe|Pj!2ms2KTxN@EP1$DVY7$YnMqT0 z_iZ0i9;hYx^ZifxukB4v^%cZGor28=kEsnu+3Ic|-#2JII4(>hIcef3RMrZs#bs{& zdK*1rP|ysBY^-I*8rqLe7A(=YD;BWh3+Z1HzR4e*Nwq4w(_!0u@9|Yvw00HcD~WaB zh1q`_z4Kr2o|0EtZNh4D!f~e|_y8`_|4eP18Dn%B<-9LPqG`FBtk|p(e#tNAD2p1^xx#zj zx^>=Gu|>GwHpRhQidYCe4$zbG&lGdzm9uG5!z$dUvAA?zkVKO#%vnjck(HyyyD4p} z&g*Hhcy7DjH-er;AD2HrMfB)P(BdKEk*b96+n^9~8?qV_L+?S<_@ccA-9;%akjYe? zk(ErVOR-q_k#BvJ>vWwluAd3n5Q8nwn5owUtbj~vorn_hTK}r9=jqK$!*5i&h9Wmd zGPkhX+%Z6gVDZe}X;Kz@W=?fsM~DDTdr{^*o`{29syPB{6<(U_zv z!ofZ%l2yD_!_5t;0y^G3>k%J07k{Tn=_$o0LnX=(E+y;qO_Uc2rzy})bBOx+5ZQ4` z{-gF(SWeZE+jgZ#Y=xYDvNrV0dzf?|0XeyCyvAclavtHH`r2*xb@-ksO0M3O15B)D zF5RyYXi!X-%BeT?eeO;)vHt6B49Q}Q5=IQk!vStYBNTB&`Vwpi?ii9n5lHIMq&F1V zp=hLa0;vnwp(tVHx)n$WGhKW!K8sO!cp7q~Q4XQsn~Ne)KP_7W^ux%mnb5h(8YX!4 zIy(ENRgcjT-!;3RA(sAb8YxJ;67Y-0g9)qy>i-2g^4AkMcH-A?7Bp38ZfLl=T5eAW zLpMO;|GqgKyS8FmWP~S7kgJIdf&BfJ1V5q{kRqJuMlLRl7@pDUd*tJ2!o#z*`5wn` zEHGLgowgEt`D4w9UZNLOJcsG>hdQs_p+PIM!YM_{{Q&&Me&pcEGO-|T!)52>HYlM{`iS<_qb2!DIt*}iq=|kC^m3c@w#;zP-~ip}_!=KWtKKd-X+{H?765v- zD~@ZK1(w8OgGRzdf|N%e_7jAWWf zs~;+7yHZryB1QTpb*k$Rkn^(HRHu7$^cu5z(N!LmvN}r^XHUK)N~+GF!+_uuMI)58 zO{Rt+Tdfj{Rn)KL;BdkEUlibeU&S?E9Qw)u{NC??@5z75fBXI1ar<|PufMcl$xZW% z@CdaHZLq`T)z)tR_u@-71~FVB^$R-wZMTt%bbHJTxZ2qIu+DY+2caW-PaT4iTShR1 z5?zu`8MhIDRC?-`Uy#>tA_j-keRMsOnm3OZ{p8~6;6n$JA=`?-T#{E$`?VKQaMjr> z#S`z6p@u1#;+0v~vKUEs{E62i}g zdC%T&qWRW|LhzhUW2p8i-3VA>H6%HtG?GX`UB1nWx^`UZ9zqi$kJTi1GyY zg&UL+dgC?ZenHKwSNpe2L^Ec&vg z@7P&eVYo8c&ezy|EmD>p{kBcm`HEtu6}p$LB*05TW;~Off@Qum(j8>2aqHwM{FD8B z#o`>MQlnewOu)~@Y=Ux$)w_^8?tB|%`WHYM~pHJ)mbic!c_=32gac)Lw~=9M6#`p zeStYQcuz2gQx1an`Wv8H5;qKW1FU>)U<3BQ$->{o?G>bLfj)8GmR$Bc>+lK!d2o3} zUR~!3Ztm4;Vw26XVFkBviwi#V)&Hd|z zTScw(bMH;nPC^5_F|+R6Trj>Hj4GkfT!^H}nI<^x%S~Hr_->kTr}?xFo;r=|mVumK zq+|6T`Zq$m4jlNY=y#sH35Ve5e-IC6e7sL;(`388z0>X@D+PR-^x<~VUrC! zRA7e>lAv3_mXaWo9-m-CWTH*L7kbwnN~+zq*D;J8ItP+Gjac}W=mvr7-Gtwb>;9%T!5jGG z3LsDF-cLvG^tTthuvHCo@Ba^MPub4scWh5vvJYrc6kSDoR99EWSWg5(YcXxTD~+NP zX+xDaRu;nDYBF9h-TiHkh~gOXt{~slbgYXntat4BntSTGV{LOYNB8}i;Y48c0SZ|x zTa5uxn7^MgsBrK|(`hp|-W^7`3|mVB_N$DjSO$Cx{kaCSlaMUl$79qTSanjP6UaZH zJ?Bj{=@|S(pu?qp^B`t1?#^w(Pv-zgQ=9$*nZ*-U?dl5%qRPEuvNiwv%by#(q0GFE zQ??pa`=UFcXBgLs`o@8{!FQx7jXO!FMK>*6OuB(Jg7jsxce`^5MOQqx4Que}FKU5n z=x=Rn?GBJtK`2tN5M-Dz1uDTkIQ^5nlcvj9Au8-v)1pf!-|RxK5+glyL+#i{jP}g_#`ywXMgRS6#TAIl zn*Gf-Mgd9#1wZg6`vE*d{?8li{2u)E)&+Q z$#3wG8!eM1`{g0<#3v;M7v;^R2TFYuha-vo2J{g4MNj-C@x|Wm`o1H-?2kEa!s~Wo zICz(}3oIqWRQK`{D)=!^TcSH4S6?VCdP?*BK8}l`AlUnYnk{+x3agxJPie@h?j2pPY z-(pM@fg|{+dyZ-pq5sg`Kt}sB-4|*3Q*aA1sfe=`*f}{=PhT00I!^1_?KPQPAY!RMLDp$ z^A8sa49<#h22Q#qhy3mtmEok{bP?a!X*1_1^XbeWp!NBKkwyuBe6BO3YS(EK@)Du0 z=)?}BJb@V`u#}(-^JK2I=m>j;4ISVS4pl-&DvQm0--78MHT5xH&GLg~;4%PDrq&oY zO@9TaiGQrzfO@?08-v);rC3L&zzu9<1QcK6$|4xv?=xNFjC(v4FeCke8Tq$3^*=LG z$;{ct=ufT7f5WMh{^5Um%5G0bW)3QDjx9l-cqjn0c2w~W4*}bEs%Xd0`BScXfz!m-!6WR3gAPqF} zd0J+gj+&aOSiBbC3jfS6dVz>{2~%6!O<;euI{{E{Zsk6B_j8Rl+p$9qaIKXzfKVWK zJ`de(H#AQxt2ielZi}m>GK(Sg3(%DX#+rWHR^*b4o70(#M>zbv=Jd(bW`CspL%P9s zT=J_sE!#ROC>}=%Q0`$*J|ghpkvfgYd<1(%ZXpx3H}*D|wn$4{R>_iN6VHJGmAOK~ zk}5lvkX~TpNT|i%>EKBVCq}hV{mZMR`Xe;Ih?!@Iw(ey(iCq1eID2^8OC$M_P8xp2 z<7B6cHOh2D+z=>s6SMk029>WR9pxGz>TQ{z{{nyJsCKF4and8=`Zfve#eWsE>G+|j zH>ZNu!jL`{Wzwn^uoKyh@$c0Q(9t;X3yujr{5ksljkJ zvE~VkXipeB&7^yJ36#+tDKWjcI%hQy}^*8tLi`{olcaszUaYUwi!j z&%{&x^DO-v&qr#H9nIp1DK^TD5kU_L zZ1lmxh5%0d*v`PYu^6lx`${iezNVyf**&7-!#ps{G`+;J6Im@`ySVpw0?zz<5eNmp zE#p7!1_BeWC?`aInyam}5p&#Rc@Gej%)4*<6`zaSnf~PEN`}G74;RU5C4?5(8lw%MRKr9n*bwxM&=##lr8Po)UQv zhwaW?qc52t9G!PleHdRiCifNt$9T3Cve+{CXUZkN_yZ{tch9qW!vubC93Zdqf|G(> z6d}a6@?D=%>nfZ)B_F{aGZni*9jTf>+Mtw)u~sWk-zBM*sUgCjG~xDNLy_`jjj9zG z+>l^nIQc|6Yj2X$JBlA+Bju0bO;+zQCH-j4y?$b zjxtyfQ3k;P4S92DPz}amSG1{&U}afa^F|KQQ*(}5Aepoj9hn-6y4S-;rCP0mHA{w8 z^DY=1WTW^!U;Or;xeB}bI?{;uhc77KPyPIDA;e)Lr2YX&t+ zp&5M@sA0+KP1QNNtY9pEo-0u+VkWele|Eps`xL;YMxXYzXgOECr(lHB9DA8~|H#7N zluw0aIBC>hUNGh>0)MR%Xa&&CQPAXw$rnp?xLC$jML+uZcmW(ghmpZ_4DxY{~c z8T|(hWxhN`Qvet&Wni$#|L30x09jn0wvM*gP+?Dac!7tBzivi zu5iE+2)0@;YZ>iNT4`pHKXetY&*|hrvFb(M z!H6;5Qilyu?}GpvhF%yaH9*_nD@)IFq`$i*d~H?eElbMpx@MT|+oIM;+jL@b|8avvUA#(d)&cpvRlV)} z36sg=-^=5!Q&?AtkAw}aH{bR7Hk;XZ>5q@GFUt=hZa>~5r6;x}Wg-38I zQ7-4ngqi!irKzrdkJTq4&o|=~MI-5z7LA%3eKpnc8}ffYroYj`RrLYG;0}Dt{`;Ew zBYJ;?LCRMDubWd*|Kk6Qp`lbL3xUhSri$%W6w?<+!DAyE3g+9wN*Nh#NGA)wDdEpI zG1Q9xqK~?ny7>P1)k5QlUZ5q&uee*nrdu%2NWR8X~yJOhsO+cK(yA^|D&MKB1){2xjoCrm4goNdIbx&F8!uG#Nt^okx!EXjFF?QXYiR zC`I(6Fta3IC_g$}hZ#h>Kn9A3_cRN8|_>K5rUSEixj=YlZf52jC@+n1JRt%~dL`l^k$hn1eu z`x2_DkR?ioy{B>_60SBqOm$Mu|Ff69jsF{4yy_Gb+F(3m&5z%XPmj$6>tE}{$H0pG zTL9$GLjEHarz>_NPuzTRGgZzGj3lHd#?h|u{PV)E}3vxnvO zAmEmL`I)-48 z209sgW(Lu1pY5^Urs~N_SQfpa`n}4++~y*H(6ex6dGv4@eQp*q`{K*v*>U+q^*V?< z)PuGXMHQD`D17UN&Y7bM)mx*yfw&!_N3@9ULkb{yJ!zk7uJ-9g!x7h%jaC_dp{$$$ zLY*H>KKP|6&c-k}@8vQIGkncM7(V>27Rj4gaPm8!e5gU4kZWcg8Hm%nlYBvb8u^Y!#G8Q+#m{l=4DJ{}pKs$sr7X#{o5jMM z+wn@=F`6N$w^i4v<6R#KY*yArc0JQ^!+Ea@O@u&hiK5a8-nNz1wGGzX=8WkdYpIr5 zR>{nd#p#0KKI!93AL!``63yZpi|Kf*79#TuavIZ%u^pd$&&~|^K5qMQQt6sDoFx_I zv{bG@a@2bCVsh-4Lqg{Uf513KR;Bq|*QlSwC3R#BESF|j#pu@@bTjN==k>V>$n@b0 zYaM_4q&AUHr=$p;?+q%RM|!cB=XKh#2A%-7b4a4~1N!DERAs)N8Q=EvQ<6N^8djdo zPDZVT1uA~LKRxH5($&kRWpP7kM&Wz@jn6b?+c_l#Ec|ugocOnj(0^vlpVo1L|Kg>Q z{Q0*6P!7q~<{z#;ihnLx0$-x5me@2bHBTi`QOynt7tI2h2?PWrdJZ}c-MCN`;#-8y5q_O8}QpSy3bh1qkO?=-Tf5P@auolQ&iS-+jD2IkmLCNAm-PmVSq+=+z=Na^^T_IrS z;JJ1z_<8-CxJfnA$aMvU@DU%vP`P=8M)e%Z1)Z&iQ^C{0DL!Ts@`B*zQSjh-)6A9D zoQ-LMA?Vj~nFvkKbr#Y|1gTngQL!yjf^STwtHsTOHFn@J5)LtSow8&TgsUIdSRXv- zlwrsUiQ_HR`}ar1Y(_4e9Sm7(gd-b*=NvWjtt7s|rXbBCiHk~IY-L8543{qJx$&Uo zMhkP#*<-spNg0R?(U@Qq)3Np=Sg1!!TOA^g#EG0v2+rJu+V8e43pqNC{=7G>etJcR zHoC?1kmmf2pRhPL|FU^VfH0%K*{Iiw=EZs2-;#n;ISqIB;Eb3754v-r2nwOR<;I; z!Xfxn*@})4LMaF#@bj(h9lQe{ScFkRXkdT<2z6<%!DVK;9(oMM{s8VM`5>T(Ghajg zD2S|ID@eR22>g-fSzmuU&dtQd^{1(Xq8p|l>|ws#m6`}uFu|0xUF zfgwXM#w=qUWA=zzd@T+C2&a_m3f7!tlkl4In1RgVydoW$^C(qspeRU zt1FzUq35_mW74SpBt3HYdgVUEYtm39^_NOjWTy3@{ z+6`JRDgQ&$gsLd=4)X{vX=68-4mXrv>8+!1O+H8(JAK^Gxcj#4<6hPJ7#Xl%vT*<_}SQ;hPFLr zF&$h1i%B5a8yY3Wu-O%rYr@m?I9vfzi(A+g4Xk4sQ`9>5?d(%d$QM?ynle4Am+^G^@XDIv zZ#62uTbdq|MwhDY4f`k`@ny}pq$e59r~MiNVy}Y&#^YM67tTrI_^J$vH%A^pG{qnF zj-q8SMY%(6I{E{2CwgsSY>O2K2_Vyus%@a&Jn~RmtSF$QTFEP2E$nL(imaQvvvt^E zunrAfD)V96R2udOEnvFC`uzrsfD#cE9Ng(UdTQ@A_s3%(OzJ!r6E5a}eBxoBaqr#m zEM>?gw1wz=hY^p(Ex`90w7q5+7>%F;kI3O)=_Bg451G!oz_5xN>yF@Rb{-&QN#18x z;OCoF=;E*uqz?mJCi3A_roIUKrp+g24?qH^gNrlf6U)>B>HRyDUxGsw~11k?gL2d7yy&rURRlAA$ zm96hiB;rG>l6k3>YQUE}Mm51Cv?*=a-F@V@W71}%`t(2zq7#p%G22T1^44DyV% z;~(vJ-Dp!Faf1ib@f*%X9?ql!SugGB8y=np(~ko+0gCAFFQL2F${wZ3QM!g=aSyqR zps}{lvZ1;el*al)4SDS}H4QnEI0I_;n%Vn}q}_l*M4Q{a@FhD6WW@S58_>U084sj^X0*pNI}TW0C*IbFh^jCP)r#r*47%vG%7tJh8J?}wMZSy^A;eF zgYUlns2s^iw|Wt9N^EBy0PYR=wZ3Porkc`X9iWXP<`}m$3VSN&_v!!P9YC}pO6Sqb1F!E3_%>ED%n#HgkPkaDcw`qaj3Ad6N8vDIVyR{FvX@RWRXb``5{gpbVY zP=MstFT=$Hoy`wx*0i7kCR(E%7>gKB7-Wx0N%Lx7w+lmsjx%Rx-UZ!Ln70i*8or`z z9KLMAGGuUndzzQ1FhKHn3EqvPaoOBF0ozDia&?0z;J$M(!Olja`7YZE+n9^W`oo`^ z&a+e%TQQ#yR2fa3J@Sy<`T&7UDh5&xIfIn}ki-<7na+8D<1R`uVORV1Jz3Q*_$Lm$p9mn}skr#0 zyHPeWc=0_0ZtLvlea^xcX0q1VLMSdWhCPZ|ACM9=-*oOAvjuZn%>><^uKcOdhPYa? zwdu++YojmMtWK6{mi;xs_160?l#(t> zfbojI9}37I+iFyLN+WqaDg*fRO~Gj8nc4fcu}IXdoae&MKKp;9W)$=q^AH8)teW$V z=wrKz7-cC6HN%gSWvyQw6jW5dX<6xw9!dB_bK2KM7_^xm5lTEIPR4gFi=yKze2sk5 z4$a5Af+?P7z zEr{(@Hi=GI4T8AX$f4rT8ZhD8eUMjq0~z9SdH!Hz51AYf8C%!|0j4Y2lH&$`8== zHoGJTNNh246m&vgG!_0%cKR)v>RlmP{>VKgyRaM1B=0FriNaGg@BZ&er zE2)3i@+~(b1NPLy_YX0!UnByq`iOMD!JdOnriV<&%kiV7HOS9QXO?m`$RY@ssO?xU z!{y70afVRe@A!xI?_&vJ=LNyv^HDcXcJEPyf>0VqYMnkBaf6-Zj^z|?@BZw z-q|V^qLY!aOGS8b|H{ATR!TfhO{1Ko!&8?ucmlJT!1hq9sb^wlT|HdqC@vE$w42zC zSNIs!Zv=^-rkNCS`R8v8=;Jz={r_#@DeAlYmACP)!UMve|5kXw;9>k3yw;kk`{p{l zKz|=TUaB@GY6}Q7&=k+9b;rq0ra#ma>Fi1cdUe3~jRclecSKnO0}vblJJ}4!YU`Mc z`%Y^o$(jW|TTWwM$QYllkYy_pXiaUw0H1WP0 z^HWocqh$k)08-lqYi03HYJRrg`)1Sl^Ap=O^1R~{)<}kKB!WjsQo03|4a|J)i^ZdM z9Mo`MYh+CXFacS4Yt8yUDsQz$R3<|=!(erP%Kn#(;xvL^Ibq;OL6@v7GbyIb7fZ$9 zmo}c20B-MMft;~e#Gi@a6eac)B4y>hqL6ZvlO=k{qh8Y#gZ!rCk#Ds*?-r*_3w9+Ag5K|8nEz||NAuZ$D#Q@S9}zryb=%%Jf`cMJimm|71q0)LTy@P4+!=>)Zd40-tIFRdfG?8AdsJv%%sbC! zJ;Y9Qr{#6+f#2UUVe@>|i$~Hf&58@@K)roF(*3ZjvC|~HiKs)N_r+br%vnMc<*L+_ z*l=@#;9PKDa{Jz}Dv(uh`r=wY-ba-D?$s64`hJ^wyK~mE)G)W}8gud4kyjmlx^e%2Z~F zG@GXBbY$Y^?xyDoi^;V*s(0JkH|ZmYE106YuQK|pnrayHe{OFd|A2H$yJoD2?&d0} z5cBSGoSkEaMo6ulyY=3Bq`Q3R08;rbN9ZqKk6Ax^w;&0Cm0;I`n;J18_K{>K6x7$b z`x1Lxzvp<;L%@gO7o`eyf?A7%?t?NYhgO$j>mA@&8859-8ZRFXnhu_;8-ZjXe}*3` zMi8JrR9>DHkk@hM38d4KvzH$veeXQVIL9Qy&nE@*6hSj5F5xLH&GyP$?)#*YTu19?rO_o1OLSIA+1%N}@bFX&h8w!efI? z)G4@PR|*-b=jwjvC-@eVLGJ^9bJ@Au<9@#L$}z3u<-rC9(~L(PL}u|d!LgZjyf0G& z(Z@#K*w{snidEd1wf!wUT=@&~WmEaQ=NeF|*a++x-WT@gO^fW}-)O1Ca}AvVBhHl3 z6NXLM*_bm&nXcrYAaGyt!^x&jj=l#L9o2>DuTczt=gbQni_R9y+9M)gvsgh^(=}}4 zWt}eBHIym7U+N=dn};Ml9u`a)y)W6X>?wvc4}9>+guxy|hc!1GPDE*}+N{;=o2h~H zWU&%%4#so3jSZIFPQYp+EGMMPkR{C1M@IrV5AdK%X(pa~awm?b)=(LkSUh6!!phON zD__J7Gi!;QiqBoGNc71--WOZdmTj$|(wV;E=n(tK+!2_<;)SP+pr%>|=Xb%VqwZ7J z=3E#{JBh`yHb%eMRcAg$vd#Eby1$x=A$N(z&-? zR+erMx=UAZD`&mbAe#7Cifsy%bbbTG$x40`@Kr+dHI9-qthB1mO@(J+oR>RC#Eo8a z35jb3z6^;4qVeL%_Rxwsb8~ZJw_V2G{PLg=A`mOWB4n3PqwZO z&c3<(-p6N%Fk(ELjxaeInYG%}>}!^*T3r5j1!jHFLuw(Oxkggah14&r_LViZ2e&9s z5_ISEt%YAvPA0=oVhs-gtr-;kr5+f~`Q1jlCrBbJi^^j{>12$?!%FaJ-@t;pWyPhX zxx1(g>zR`)!b(b5vn`O(&39+LukI4B0PG_79P4dgHFkH%FhAq>;p+yvv{6B&UMPo|`)(=vP4cWOc`{E zFjrx8+Wuh{V@l{GU;sT9gL@owJdWQ0PLc0&HyZ+n`ubvWfSqX|jqXQ!ikm3kV7qdM z=-@}q-s6{u5!I@;_Z=xp;vsLn9BGLORsB^Zwt8QB%r3Fj$ggN|4s(MflsS`f2)$50 zHBWQe!&)P=O>dUb7@_I%Ab`=;a*UbDZqIvX=Kd@K@s{&2GH9Dj{v z_`;d+3dtS~&K)5v@lq@*1V4j&7*15{E+iEnN^(60&?M}GtJT83UQDJm54h}x;*yHo z9OOqO-z2i9)@m_6^v21#OEgJJY#LP5*#5v((ge1@7JlIsZHW6Jh_}Shb@(T}+evi| zbT{4H7TQ!0E$J&9M~Uzn6=C*W;14!B2|~PT6azh@C0sM4agrJCY%13TlI`Y!XRc@; z*>T_8_@82xzC>MYVc+SM4s^>}+0-9?UVt0>rg6r2;^98byO&C2g{TAxn0G~>eci?L zkN!w)?CzkREI>WNcsf!yd-;|iVpu8N!+Wx;S$McbL;ThYvA$Pg3JsYiZYl(-&<82_ zde#p(!Ed0e- zKYkby(eGMUxjgo+I!zeQWWjFs9HKsQ8Y?!$j<8yxoEr;&lD{z-#$=;m(D82s_aS3^ z1J{+IjiWYYlw%$7-St}J=ZYp@w%sRPODp7>4%1O7-w5FV|l~GE*zub{O8E>p6-B@nxAt?j@hZC9)R0bGb z!_Q4H!WJuN2A1qr~v_hnTScb!|Aw9x^xw^o_&}GxR9_CI`}; z^Omc>^3>**>pkiEM{NF2iq_{BZ4=|^*zA|sy;ZfH=kw`vT72KJmbzIZijE-4)D8^9 z1>B75jgm+yDoFd?%%?*cJC&K);3WI@E5=xeA)A(Vzn3VSyosf#V%rWse?EDdj9AoJ zfF5;OC_ofGwz85OE*{5y?wNFJ(w$P9==pxydUr6&P%mHKNy}xYUQ!MUpE*!)Bv7!+5NXe6|(pr7%?n8^6230kDDI6m7#0p|HvY+i50t|7b zoIZ}Qr|zrB1w~R+>4P9uA-9VU=PU-_VSXZq@+K0g{@ggIm3c!hjCW)@LoCvm%KZ$! zgFKwMHJ8LIEYCa9$7~bkZb1R`PUZ{s`OL`0<`X%*1AYLbV1;WQ#{`S&h$0*1RTy=p z`UcU8q$n^X7lVK*lmLE$Dg+NZOD^Us6#JeZ0+k;qM?N56-Ik5o8l_W#WK%FzF0_hK zLnVPNxQJNT&#NsSFCXna-%s-0IQTx9R8zPP>zi6W=nTkTblE>St>RHIB=Ld9XeX^JZM@HEs#PvYIB8jG?-T&9k<;iUq80& zC;7=V?UndScK@5tyqDvdX&lX4nT{rRDZU$SkUiwre&Iuc2<+H>-t5>ypj}vf$UoA< zt0AwV5G<}qWPK7cZ0&EYZL)U{%~7YoKFWodUT20M2`)#YD|M9aauHS<`B7hQyz3fz zeQ0&33`BKf6w0KBoc^*4Nmx0=q2j~y8Sg?DI#+cN-u*|xJDr1{AZ+NZj|{fHQH>pV zeX>_`@91hP$GC5qn$%f&Rj*-DyHVsG4#(#U;}EAIXvc={itelyhs#@tawD_TSo>n=biYdagqG zHux^Peu}~-GIF}q=dvT9ThgJ@-u|6Jer#T%Lj-q}F;=}cT<7K4p; zFHg&(Z#c3pio~(mJWZy#C#>oEx_qb9XAd{if_LD^n*45_@RK29hH1*KR0i1O>KZIT zwMvphJYP(^&%g{ali*WjAtj5_iv+}4&|A+~c*w(bY6TxL^A}S{82M96%aRtj>G@LZ zw%)=W6cBPLQ+g)Sqtvog^x_OO=}j_-Q}J0od5m(Q_OurLk<=T5TASHntU%9EZfP1~ zYhelK`zj=8=(Tjlgx1K5R4`S)iK3_QB@q~)y4%TB(RcOe6@?j)HAzz!`YLo`CP=bq z`Vdl8#|#4k1TE)4CkQnz8|QawK%68JzKyHKS1P4 z5yt=}JK7JQ!}s9#}q1R4XbPy4z7Ff5)8=Gt_fyi5H)Wf zp5K&WOkt%d8D3pD7{Bd0vX26xFfbuLi^3xWn;3yI<*L?RvI8(-L0qecZ-EnfT5}m6 zCkHow{OYrz*KH%Ggo3$;fysjb$9Bz%`l0K&sfDd3cx%rZ?s7Xh*!3EZ>jo0ecOWwS zf#n6-xA=@cXy-kgxRj+>fD`9%QqN9s4&T(!gsNYAGTmp8jEW9Oqb_-M)d?$Kk3|mU zWEq|4o9L(bJ8~YXVXY}@65XOiMdM-oRHS7UaemZlSZ|lb8Zz*vb$(;0 zpEB&kE!wl2e3IQZ^Aq#n!tm{Q1_i@8_qWbI_t&>6rSJEL?QuRZEYsx25AwK+dgK=+ z*K|*vN&(J7ymCUKp%+y7YzUq0p*Ex*vWOd@AD0ZULRxXgvZ)xqJdAwz7J5jTQ7Sn| zt%Cl>0@g}48~rLIY?l27!bbSDD({dg3Ve5dQ32knz!nOAhHmo}{)ZXfGGZr$uF^RF zN_@y0&Nth97n({P!EF_%a~%H}XGbXE=J7nb)yi@H2-fE#xi<)VDg_r5LWMa9VJiW- z2E(*agQ#Pnh-LpM1L{>_0E0b!Q^d2~=X=+74SR%~gvEPQ|;@n}x z=Zm3_QK}P{t8Cqt_~%%8*A}5MP{$gm1p=jRYCrMw!O;h%63Y8AZV4jfr^;Vv*bqC2 z*v9urUBo?ETmww2d)$N%;y5o7F!8?hx)W9njO?$0z3C6u4y1t}W`x-j~-K0OvKnqry{SM+}-JddJC$wyh(~ zCtxH`jl;+zTIPt95vKFGyI>z6onF8e=Nil*0qSDJ6sCgll3W_%)snCseaJu387_xk z!re`^@Km_^@hF)cwA(GS?tw;Q5Lvjz>R#!oEcp`!^%6JC7b*pzImuxber80-)_0cb zV;2Xbx(_s}KNr88$)zV6)6M~gIKa%G7%j|qj{CfhS#QCn7m4cVV$=}JP=~2+v#ki) z39<#U+_2zwF|ClM@-?|b2(P*E5b38!x+y-b9crAo9}+`ZkH^DPW$ha>m*;Wj@CA$T zl)s3^6~$?)^MD@^Q`PyXtAmlkp{A#U*NKGA2s4qSZia1AcFIO*ReccUqU){JI&p)C zJKA~BK5;{b69g!bd!yGz*yrgV6E!iSFjsa5dSV32Ko52vQ4~Q1$%KK)mpfpFSK~yc z9INRDQ%xchRLkl6pi1w8_}yR?^`9a|hFVT}G4Mq0vGXso$|q(Owql*MKnTNmh5Fo7 zgy;mblM-JscL{mpp8sU@)*VqOwn{)$7Bm9QTZlZLzdSbo`P;^8*LIB89T02{1Hx&) zDNu^)TN_K;8vU~`SJrk#Hb(Ga%`i$hzo(vVfX=fJP6v}L^ap`1GRHcWShbjiFjQU- zWTDwOyC=cs{y%(uWmKG5)^%`6;qLD4PH=bk;OkpuxWC>6z*2 z%sbzYXR%;Wwd$U_ci*#*?DOMUy7PMYqYP36E~k#?zVDU1d+?++hK!A4%sJQPStoEl zA`3ys)9ZpA1JFmu4<{1fK$CM?l# z1FBHgetQ(0b;FY~KmV>@Lr{dDLcY$pUHL+RUwOiYt?9|ehVH=V`n=Y!c5n5m1Zk5F z9o5RG1V4M9X07$*Rr*BFEq_y27mxs{DVk=UlM27BT-|N7 zZDmbsYg4-dgQ?;K;L#+Cc1&$g^CN?Mr)e781m8DIfA}?i+D7-Zfq%f{ihzX}O zXbF_D;(|(Yf3_zi+O~YVR#`dE!hl%hC~C8o-onG`7h$K{4p77Wnte>VE=y;?SavJz z+6?YM3pC+s>eeRa4k60k*aQ9%pcsq&L1*B0S;^9L(J_-l%b{tQ9&WnQt(!q{=A^|@ zIFwTT%(f$clabTO%}cHiy#*o*^FzKqzAD7!ZcBi&1SMy*CQR;67ukLc zSl27EObk>RBQe3KSWZ(?ui`DMb;T?CNy^6$7^q%gvc1cSKbnT&=32s5M~y3LOD2AK zcWooSO24wuq-m8V;x$o=D^k&On=h_Uj~X$2;HfMJVSv0l{q|j$C7%hHDd(MZCVW~6 z*%)KB>99D#`eMC;4l_qeGBDHqE#++^WAW=@fPB}5U*=Q?IjTdgv?K$9#IGK6+Ru5l z@=4vcefyXQFoak?jkCyzd9@Q9@EO26MW^^X`H&7Fwk3i*VvIdvo468QC>{uTLoUe% zLyHu(b>v&36W)0fa^6MzceJ^7o-^_hXAx`18&l zBFiJn-{o_7NKW?H6}tM$z9kuoDOy@9_RCh z&>YNf34&ld6Z|s$^Q#1Nl=S1bz>bq-o*7|EAHOT*Z~OqtUzP+nK^%U&--x`TzUz^^ z6GEDr7lw6C^R%7TN|uw!}2RV)`?icf3~xEG@z88kE?Y=4ON z4uZGeQTrt-*O|h3M`Ah`J_JYHb%jY0{?M;16W;b3DF1kT`RVIgf%F?K+IJilv5us? zcUIY20dLiM5rV)|M#+|VU*&apa);nma-}|Ai%pt0G*pOf2G|=9uuJ=)G&>gf&~n9vCVKEF-g`0GXgP^bN8H-gPD@ zsJyKfNXD zBl*8a#OsD(1nlZ$W}w$t1QoNXuQOJ{b)~dhU)-&Z3a|vceG&FL9CGeB)Wp#=c}nPF zKBIwB~C9zItaRgt}nAY-s` z2F}b=aL0>d95Xt@x=VgsBApp1j6-iT|R%A@*j;I;{WhR|H zd#KTe)@^hLkYvys4ccj&(cVb(6u36y!HD4R=!=+^a+jirPlfEh7nFR?zpmYJMJBsv zw|lSmSf{1%VX&Br;9D?n9$p#a1aJL_bnVWVj590=F%Pu-QL`V*7;fn=Lyf6glcomv zYQO?}aLhcB9!8RA`fh~*Lpc%64D4V(`8RQg9A88v@;!=fhlz3>i64pxDkKR*ZIGhp zd;8Ho#za?^txy^ci{ZiHEZJupj0Uw4r3$weeyRVo3J~GEYEoMrhTC;TfeUe|Sa?;d zT9=%S?X#<|HX)8 z>XNksF?5{9qAA2L;j9~e9hZGEpU^jn?}ojO-M$&O*T${L>Bs2bgKL31!Fb7TL(onu znJNk#x`C7Crmn^C^R8v8D20x*k8n+!u0}dP+G#t z^A94Ok-jw&-ipPr{E*mZ;rKW}Xkts+6^C}NlQ^1rW_5$X`2*!FdpwCkO|WSD;wEiq zTWe70TBYJR{Bv74y1|XX)n~TnlF(r1>Hx65Uu`&YRpG!E0uj<6IeHVMSnn1W`F?4b zz)xq8{t80;#jyENuz8KJB=5bnu5fVK?2d~<8+AExly0^=9pal=A9==Jj<9ghlOCPd6aRnQLdeU=}x zLG5Jw#9_{K9Lf9Am3lqdx)FyE=#W;KI_R?PFWn>^Im0!K_Qo zqNQ02<7jN!1=*8L@ygPb6{AD#EyvA~>xOOd?BhbTr`9$OJZjTnvdwTT?7Ggk)n5lp zvid&rkbKXV=$gndNV&PbE%~Jp&Be|zl%mRKm$X~1;%pSr*Ge~8j1bL^>PO`=bPVGO z*&@7&>ix+KdfXgM`8(1lgFAYj_KEMS)UBLD3DYhEYBshS|j$n&<>$LC`<8U|_@GMG==A5ZVUPke4?^p#s+L37bI zYg-Qrtx2v>pt=!KY_yiL>XK4>#7g{;@O;SJlCh?xK+~{;YR%}3!RjgIS;kHFT%+h9 z)ei(a0eE<{p_VxBU+_L0cv%7HLWUoM1qylTl zY|Oby?|3>*0Ss$^$!V1q<8{%6_mTvZEUdC^n9*IO;lcTPxe6fB(zTqJ6^80-;vBWA zFZEoE3C?~Tj!c+#K65K=4Tez3{kQFs6oh294)eY0dSNy?t_GIazi{#N|a+6Q= zdRsBWhWV+{)K=ZAw6pGfg7DA8^J2FR5Jw6Z5feVEGNST!rG56MnQLE(*;LY!`c;eT z_FyRPM%Gzx8%j_T%mVACQ10tD?u{xHNWT;`ohpXaU2aYu!!eHYE-fUyJP`>6L#yYg zuwL8Z4(R2L73Ah13%atckUxu9rYC%fh_<7vPbhM-=Otb}#PBErUkyn@v#x(37cW`)e@ zYy7d&fN&`f2W=64WvW^kLTI{#lyV5N-dkx*WEvQTn3E=IaWE7&k5^-`k+j~*sI;qQ zu|WM|_-Ww52J9Ro!L^`bYxb9pR<87^lZ7{%7E|OlTfzixo2;*y9QX94Ji0 z<{kRV2WX4@>3QUefpMSb-V@NeFY(m~0q1<5IeUFw}c@_rBZres`l&1mnb&9D%KM78D);BXnQnBq4xlLSegfqH- z`5lmb`g~;B8Go42U0Sg_`)qaVP|hdU_;9pXQOzV-_$@V*O~2l65LQ)Qmo^qBqSUnm zzmq{du}x-Ib@mb|0?$V$-}TJKrtmE-kbUL%p0meHYq&R{M^XVKka&Oh3dJ1_oSc;H zO^hr|oc?)#sOY+3tD4&6esR}ELFP6ewdFukIR@e~>HkE*-Uxn#L>grLZ z)DOK%bG5~FG6FkK=hnxr`D2J1Si^VS1#S!Q!n8SQtCqs`^L$G6vuw20#kN*>(PL(C15K#XEO7nM zUoBr!2gryA*8`2lHF!CyM14#0d9up6>*F(PJ^~6=r7g}9TjU;o)?`2wu8jebH7YVT zT!nS#+)s*lyut^*agOu^aACCy0y9Sb2@XhZ#+`xkCgX(UyR@dF^N-hN#ID9(F%0hR zf?}9+%*0;dhFXKE%&ynTQLXlR!zQ$23JPYJrnTC`~3miaI2nI2O>$I5OTslsK*i8C31+Tycgjwlep&yyG!6l4|R_k zA#e1AwK=`R8myEG+TB2RA71e{U2i;~G>uL2hkNkIU52a0C*T3W7mS-mL)0d!L6bXF5(U;L+-fc>I32*7Y()82H<)*Lv;&ET9)&rv{&1UMX^0^b>moCO~&t@2CoJ$-k0T z&CXFFPvBYVQLKp_m^ksI70p?U$*pm_>*Wy(>7Owm59~rG^tr6jzyCJ)8i*DDrjv+& z2M%)+Yy1Dwnjl4R(3b&nlPW{FHcrA{7`Ixh(IflqCiAUlM#@ZOoPlSfbKA6?Z~OV zet@8I2pI{5;9^xc%z})xxuk|GdB#|5?5S;2keJbsS!+-R{>J=<9*ot%N30e&>8p{d zrnoxJ{LCGFA7ZjIA~q95WGRgdOF(7I(BmtKx6Z(AW)* z?P6agxLsHC`Dseq=%F1YICr3{46Z&C+`rIR9_f|n$L1eQon&I$cUIx zVWB#@lKqI5h-#X#(}YI?HIgZ<;cMjy(^r(-%2uy__)F`c+=!;MTA#)m0`I739+lI+ zyrC?rGa%7jsE;ZurOwONzg>`miZhS`jTb__Z!X77p^wE~t z%n5ggjJQIcGo$)YXM?#z3(HHhkA_qH7w1kHR^M`^mynHo`GFq)9vj5rb$bBERY_DU zYG?FE^c^C1EOr%yeQ4o!i_q1`G3W!qKvk zPST=_vLnocfEzTOehaKbSboD_{9>0fo54Y3`5rAMD?i4bp6T`It-v$B3>glE5p{j zP0khkx+>{F%pfD{JQb=Az${{sb_>?xp-bzm#F+`YXfsy)ghJGS`x&f+3&3Kay%*XZYls%Qx{_;$H1$ zz+9mpq0MXoeGzJ%xmo196KjLKu4?2bU4d6r^v`11q0_hADGEWwP&_??Wqu|k+4&)$ z*y83Zdvq(~V4NADspBbA?Al0{Fv7qmoYCuiU~#(18!GH6qRG`}mPJJ9#OX3-!jjEJKen5nkwolj#O^Lb!x==O zY{M)1gdFip2jx;!FeoKS{tCRsx)@ep4k2)0@agk@gj>7jaoqwcPGGbb6S_(f-6oJx zMl7MDVSm*Pb|Mw4A{sV|*4ebAf;Xj0bK$#G|MY|y&Ui=cp8{O?ukh|)( zg@jo9%mc3VQcBP>bZ5^q9+&^AB0NaE=v)Yu;$yL8Y9su$Aqb=rr7U?M_k*aaXoIxy3^q zQM;eH$etC6jO^W*RI>O>3Egg99_a#DtG>~qQ-ElK>gVGu{(^74al(!f9?Xayeuf~T z6{%$z!s$1#6&BtE&8&+Kaa{yTKLl95YdiBu*^T@*YvAYkEprag=w-k=@wZ}>e;fWk zZ$M>jc@#y&H@QpQ6grh&X;u1&Tk^;iv#Ha2j)5(?3z+3J^UBn?aEAKdQq=|)$g<6qEQM~5FR(%MC zd&aO9_7o;Ez1_!ciP&8PjJwp_&Tu4ylD9XC@Pl4QW?I=(9` z|9mOYyv)v8_FqAk8}X7n=sjIV50}(juZF46qlI76)a#ho2>FWgD?{bLF69SH6jeG8 zl4ZNQhfq1|25MioR-Z~et0fFK+B~EuW}$s+PegO2Io41H_sxqNU97?OJ2)T%Thu1N zz+#ZJ&@3~I-crJcUJ6c((Yle=F*7JLr&WSnc)1ikw($;4UtuAvPjtVXH*tR&ms&nU@C>kUB;+f ze+Ah;C*(1NyyE8ZdJtAi3}z&TV-KI#RECr zimb{!N*8^H9C|leE~(rp8{arF{iCpe24?0>8{PNL?R4QM1fOo=sCzAG94f`72J)a> zshS|UCnkF1SwvG`)?j5s?nk*Ly7j~S!*$`!@=JPqtY6?l?{I%dQ8iPK%mCnF76cw< zzW>7+{sTq-ahU&O#sBzS4w$6<>u-OeY_{^BD%L=?Pi$oDS$SBxB%i&+jFj05DODIz zAraX9xC)7N;B-@4Wu6AS!Os@8I!@b4r0`)Z?=XYfBLz*8#bJSFu4bF#nH(K&PtR*^ zAGDVx31jZS$?NdN+5IscXZP4p_aqeul;Lo&o&A@)O|;+q1xQmrp)1f#LMiJvn64Zc zTvi#hi;EQwNR%9~Mo-pnYdI1?s`l7;fGUg2Em`7Yo0$%AonqH)^VA45Sgw_5A7kd2 zAvdWzt*87r%Ffa1{=v?p`^qL8=aJmZU7(~XU&4L!eI_!qU2{8>1Je?T=W;_^Bsg_IZXcc!Puj~?g^+}z;6 zktDz60RPu<{&OQ2C)voaDxi+MW5fy3CFajjwI9!46E@EAF{&9gAf~1>K7b1Ee4k}g zpsS`z^{(hjWAQg8|E_l_Ovls8E+hc6vUEbKL>+9i&{D+R|ow#_6i4*_? z1ePLiBGNz$xGMQiCm0^XZkp}jGz`+tq${a@E6Dw62bo&y)AN=U(=gmAmy@fhL$k%|;R%$bS7^8UF1nvs5IIHv0V%jr=@aGNw1v|K zlMEzX=5wqJvB?9Apec2V5x$F-%N)<*DZA$Egre9dV9-Agm9X863w^Vc&&&zf1USUz z+)?700*x{laaAI^kOJ6@2Na)eINOXXUBvAy%NiDslu7Ku$dYSwE%Y2!RP(^yDZkFM zwy|3xjW6dIK&^$TSBDh-jFI@cMgI=pYTf)fq>E|vOqttp;oLps=?C(VySp@AD}-vF zcMV=RY=$d~VR{Qf+`j&0Zgr`F^^+c(nVv*~E_ zG#yeA!ghOauVl}Zx#^G?#=01-L8OBbo$|gst(p+Fuuo9JphUFc6?3sBlBhYqD0kfb zJhXK4R+#U0!o8rL#rW`YYmpXFsW3+EM6j^c=oPY>Y7wQ9zZhhXJs@`H37QME2ccOe zTY=y|Q876T`~MUVI)*T%%&(>=hWOQ<_KQ16^O~u0Y4!t&n3elZ?Ua7DSpFW5kRAAu zp`YAds}GS@UhPK<%q+}r3`l-P%bhFhHL)KKY7u!1_y!sJY6x?08NI`&hhz6{>Tufh_zdN|OAyjtt!gYR&OnyApUBcukxE!t^K3#wVRI%HV9MsfQoo?aY(>Oz)--T851#ev=l2;<~$+0v=%x`2VWr z|HmhaJ~Pn10oFPZFLK(a2k>YV7Xn_3h@`$;2JX^|GT9Vz@Guz{K{;b-naDHeYmeMD zjas=WJBZ1`vNb{5weneK<$}p(wD9+Vn}{V^nDugADxk{clzWsg6q!zFKQMRhOYSe< zd5#?z^4(wWykjUid{D(27%e`^!t>W3n5CLgdRfbUx+Qn!v7P3#wV<4rC8Z#D_Dqu* z<+4?%DO$sppYe}Mf?)rl`B`6deFkM${5C0*4rGkcvu)t+YdiD|z%qHBIpq1{7&oIK zXJ~^;J2Qj!1*A>ASe}*&YZLO-w|R7pR)9DtSvrxSPkiyK=A0qH{FO?l2%YTEchqx4 zyN5&V38}9sF2l{#_P6x<3}B_^A`xV=&%2}6+y=PJD-H`UtF{M5*agcI12ovKhLs^u z9&NdykodsXW?_X;7*|mDqX%r=V6TTjB$X&X(?AcCgSr5v{D9(QaW( zaF;uLaF@GahHj&NY)wYBAx2?yqO74|MsNf>2?92KNCU1iheB1GvkY|uu~+p1x_u8i zl2IpeJ^Y4B^709@6pt!-O<%ui4v^AUKFSOnrWxjaHh)YguC-71Y6)T0+1_93toqy? zsPvv)*=IW<(a7K*5xgFE2swE(ovq}LY^gGZiY_=4uw5{(OvO!%NLNy4d=IOFaf*Gb zli~5m1{cj2Ij|!|Y~9s>NtLDi^5vVTi*SBVcRo|Y=&A*Y$uZ2>1XwWQvEHo1uJs~N z;$cncS#<7)71n(i3w4*<&%$K9v9{YqR%bU1zFnt;Ms-F4Q@z6WEjdoJFjR8EW8Rj_ zA}{brFI#Pa4xFEkO*Glwd{AMiCl*~d6L$bt7X)0?X>$tx=NCh;SCNW>&xXYcZ3>b~ zZEE{6$*}(93DSuEv3rymk})%Kkb3Us@IjfxGkL_eLOQ9YEi*?HWcqXyr&k{&d7LV4 zo$R0p$xh&nW5_I#lz0d?Ql-j+acP!C8xAa+5kCwC-^778tU=u1P3UC^Z)Z}%aL5+2 z;--fn$H)z!z<(*(hJ#ARDswtI$)D8_zdun7xzh+oRICFLv@Tj84{zf$V~OQV62~1Q zf!{|8)fuE^^2h-_%lBB;mMow@GQ2EJr}MySwIlMCHKrh*ncr)=G4GtsrM%in)-z=| zHApC{p82LXtjpjc+f!f-i@&c0?CSL~%MUNszDnKF`r#4XS%n$j6n(T31M8?IDL4gE z{vE7*fMi+R_WrvU71b{8aWBY{gQtOe&MES$j(hc9sZID5yi@}Od_Ier^cmT+7g^#b zBKsTiCX%4_XPgR>?Gmi2w7#)E2@@{)rpu0CSpOeKbXCY{{aDD<5I%ycmB=a*U0+}~ zw#g?W7Lxaq*;q8@PKazROY69f(go`bms&M&V7^GvxK8TpPTqU->IQ%6$M!H&fA2z0 z7uC4yIDtNgRzecG%^UMLMa$A1%@CI}Fxv21p z=U7iB)|083KAl716Hp725@LTiv4gsHyk-t!NhNbc@pMPw@y?m+jyTi|$47aJ2>=RdEYXjN@> z9AKFSe4=qbMDL$N z7zCEnDJKn;Q*Us8f?IMB78Mzi zg(EU{fAXXI*-2}zF{p%-;y@E77%j)Yx0_5DqJb?4XdH)R>UU%dQ%teKw%sLhow~kZ z0$W$S4)=RkBX4e^wRg?ep&I0{~PyPCKt3b3Ro(KzKG zGd85BdkE*rep%O;Fjl4k<#)4NLPoRzVawLel{HZY&HlJ{z{jHJbZ+Q1vu>g>K+jpC zT^V;d?_hPKK$js$l=H)>dXVa?E(zvczm}zeOH2c&+u=Mi=)<_-L~f>RWabcCqajNS)Pd7@!cYr} zK$6+4tMvnR{S2ubIg0M?h3$$;*tcnRV)^-ieN&U~$r4E!H4|DLXf$^1izU6iQWFm6 z3C*VJHn6#lSq)b0t}8@QZy}fr7mRE{X+L-d0iv^|7??5#k$S_ZnT|7OB#i_?%8wZiu3{i=I{9P9x0wlcL9TxxY5=L(Fx|+GhUpgZ+ zoVB~EItm6i*C7#|F|r!gKGGwE{oEn$SO+FSsft0W>kEp#DKV6W+&_kr;BnSK@kUPb z#FH3O@T6{Kit2~=qitxWY}$b`Vlp#TYA6%KN1W6fr*`ZR>jyErm%@3enqQ7*5J5)t z&>TcMVWULl4whNZx4piiG9-NuECAo;-Xj`b#hP=ovE$U%%i(f^ZJ*{azS_xMo4<6FHXQ7||8>xi;e>+D?7G z_lN3nO3h(O9{B`cExa8htsFrQiHu&H*+d)aC!lWNPv6YCN0rm-A^0s{$W7t!%_D+R z)lawmnQfHktQJkoLXfZv;7udL1F=Y9aNa*Z&gaGmaDM|xar-e{6|rc1S~&uRK=^LF zRzCQB&rM^M2Q{K3(K#eGaXA0AJ~#jEQ3)uMw*G>@?umR8ahOQB5kRfaIKFSD%s`&7dM!k;kbiroxaPGeOUGc_%D#3Yf5Dm@r5_VJLb8)_{&|Ss=r^R zYPHUP0R<_)lRA&8kg8^Q8UsfVI!9VFYh)iJFSW@rmY%`!0Ez8H@6}EE0GG z#hFNpzF9!K<|2|7a4ANkvvtb-}syDLIZ8}$Z6o6Q+Jbd)YBZo2hi)OeHdoW|S0c zqB-DNb^pI>28xZCIR3WgV1*7#AwfjG!r@aAa`bXAepnlwI$1NMPDEgp87$W?KAYFY6)4bX;T4@# zS|syV;LwXm+4cS>vAQ z!kpL{m842xk+4XQ1yBHH8X5s9NYks;`zA3-D`8?BH?ofq2AY@H7VuL#GC_HR*~xEg zC@T_qPKx>GES~}FT?6uWWFV)m!w$&Lh!^}&r1yz}i9vVs6BP{`){!FDnQch@zfK4i zCP@`-6o3{`1po+SMEm2(I5FA>SkOb-GENNiepDI#)(b_Nj`{eTvob1_fHDlU6CcoC zzo}^cb$mqZTnw#Egw27&$^WOx_<<1w-~n=l)C0y5Zs(D6=bI9?#*=^;@IQ?vkNG_# z-XE%rjFN>9tRfWU+ugS*Nl7|GV+DbQ+@!?Ztm?~z&lyRHCt2}YI-v6tXjz}NlCn-x z(!u6w!bzc8g&1h+Y2)JsQ7VP&EcA^LKUmC6Nsdb|J;;wq$N}u!}*8L6Q@i zLPEl@d?W$;2u1@27H1kb3ydNNVC6mhfhZWioi0of;;dSrNr-?Z`Ar1+FO!Jc8krl| z{vVqtIJWDLGUOmLqj3wBx~7I{atq$NW;JMNbdcxo4udc5{_Zf3mgxL`2xNK@&LEK{ zsVjCN8&eN=kaZ&geP(G)<1lCWGRE`Sb#Rla**8U05#v`ftx}m4J~y^FI7E@c?#*7S zKQjqm%m^PH7Uq?*8{7Y$r?FR*Cte}XA+FgS23v#5iMh5cWi zY;eLq=G%mnLf?=@ctKP95Ltd*9;~Dgg(fA%m*{k-Hc^Hxj@$?i>N)5m*otMIq^D5| zo)$LC@i1%YuzUD<`U>{pVv8JBU9oME&;;ejj`93WM#<7#UX}XVd~5WDF{g9ew!89< z!^sq2W`4Vbt#gD39k+d+V?yOKYuIjS#vmS24A=9-5W1yz|KlSX)xR62R9B#bzCob2$c-|1V3##6+>OUh`4ej^Ci$kf z^97hD1*F16J3Wqy|+M$^7_D`<)bFt05CI5Io9wMM$fizI@JE;0=SPUs+=SMCwO@s4tB&EiaF7Jr))M8O>o^d zwho0Sbv}enDIv=-EWuHM^*S;UB{G_peEY9QE~T3?Z)?on=)1p0I4fE?Y>4?(?t}TZ zZ`_K;)k@|ac6BW^`lAvmu0wYFnYRlT4zqVRm~~5o*0L?$*inWvU2T+8Pe-gr#R7EC zeI(T3fI^R1d{62N6u0#V&`@-$-@yPqT$WhPyo2#F$T9mD+j}4Xev=%ctMuUl&%qS1 zc$D&g-6a1sn-Z{&^j{(&*(#@UD1xYOkgN1`Hu;o<4~~k`+GRTsbzv#mRpml{aaT@j zawkF^(kVmQn`!xVW zf#QZ9xI*C4usK0nBXfisd?<@f26P{fB9?2Y-SY`6^`nXOS*sdDh7cJrP05t4vvMre zfKv~?+F~7ulG|Oc`WL6jH3EoaYtuTbX3)55EZR-0S*l1^Jz9SBDAU6A`o@yZ7tfDy~X;lJ=)Yf%ru{O$N7hcy z5_QJmEM0j`Qe6|T#HGtYyD$sLp2w!nDm%0+sW?d@5mNHK^KE z#jK4-p}+wo`XZ1hWE$M&f7Z}87z|%4GxQOzVNGbX8PUuWvpYWYZ@W#c2$^J({agx-S#VT9 za4fRfN}rG1<$2`w!Ogr&x})_fUptFj`S^l-*(@Blh)u)}Q7nH0QPTk@)LTC>Dps&o+l$+x0f(5_4s&pXG7<7)d~RpWP&vtx&M-$h zkqGG`#F;eVB>N_ALWF#q@x@V&3-iRzlBUdh>A;4i*{C#W94GT&vZAA#B*UD+Ca2E{ zRAKqQ0=Ce;yvw|4h{5m-7>OIq<1+XT4fGrx=cbee|5hc!07YB-N8UmZ2u%Nzcu3ee zI{gkye>rMCf4Us5kopaMjg7p{TydQ=^dM0o}T5JP; z8Iju=U;pKf3AP9G-9$zx^BJ_?{^5%Gn;NnqsZx;yevqj5ku%h5@Ag$vvvh~L^zcZ2%rbn_L~Q0P?YTe;zd^|~{Yb8VjC zoIn$>`J(M}1)MU0%aPg=!d{=woVe1l;hp1YYj-(z`RS7{NH2;zPT&A$XSkqZK$@6G zx_2pZ)R={80Qh9=H;?p0%Z)pVGrg&_suCLdTRe+ABQ?2Hxlt@dXG3$TbnWr!2HSu! z3*i7#VyTj1DvIha*$%;2X7gJmF8Q1eg6Df{*)K^|@KPAC64eKwu6y!eAT@*NX6;I( z_e&(RgKWFOKdEgTO|e}8_U|YrC0IeNwCif#l(Si-s1<$XV%2Aa8GPd5qBsXwE)Oi> z#cLc$Huh^&pTFcG4=(G;PzSlwZo8u)1!1*#RuL$UfY@j?NpV(7GQQ`V*e~XxnKq(i zAHWUliKs{iWadP_4dlgft#sTVeW4S(trE^jf{N&`3af&p`uQe8oPzz0bQU@Lb>AZ# zInyW?MOXYPEBaWP_3v!*)Y5m#mu3z5lyT|@gu`X)LFH7_zG@o z^UC44M`|A%W{*NdH6#AbgMEJFt8*tb-Cl@sXOle4HS>%BAq{h4_y z)P*s}Y3+5auj!Ms04t$svOb|)*JiwdP91$ljDt1|hRv_|Hyc~#l=lUtA2)NeW~ryX zJkRF$m(roCc3QVoQS%v38pybuHeXCj*4@5WNHK2EfIk;~4hR2^Us|IaedHl+#THlc zY=xFA5PRF5Tl^{&>Vt`bXbfJaj z>Vw;bp{_TAC#Rag{felTh}z8VgtbKQ?Z60nFcUR!k!u*$R8jb7g-dLs^f zWs#OuibjaF{)^tZnjAAu-yi(-7;$LqP#ygjecx?=&@fH89oAkui9g#DT5tb0%DUK5!Cte~EPdg*(82$Dh%T93a*CcX;E!a7QLBieD$1jRZ{H-p4}G zu|nHaj+!J8T4$K#69rkb#6S59L=P2Wa})rSaN!qMxX1CYH%ZO%QL;bL1VGsPt^Zr^ zcrU0SQyr)zIVAgUY$eFz>i!uBA6~#{^KbKa{}1?3voLWZRdBSkH*s|SXC63N#YP=l z9nnV(-IZu9Y*2}XB0#uO^-Dq~sfYr$u2iWQk2h3}h1Gdc8pR;=m==?hjNRa1{iG$3bf@j@Q5@s1 zN_Bc@1l@yDJ5^{sGXjyCWObpLn_so*qTBk?ZE{ZG#x0+V?K;aC>pW+xIWnqar_Odu zP{?>-V&YVS@V(a)cF78CFo zrc~$zi|XS|u2l0godzetlYKF^$<281dX5s2o}jb!FDT~{((G(bpUPKL3@&PiLp#Zn z?AV%2RT}}OZncQA=K_a~PPa+QV~lW~Hdp6g*E`hN^@=0U2msWvpLuw#vA=Yz7j#*k zWoB&DQ~C`p$9c_m+cpw!Y0>h_BzEnk6{_!q4;^QNv)>6z+nKk>O&gaRtq%L^v8_U? zQrKkBX*WivNcx99OIq zM@}x|UKVtY?^gIlmd+K!a%9jY5)+gTckYe1}@`8rO{YvSEPWp!tK z8wdm{5|Z85$Oq-1%lGPR)1SAPD;2Y_mV#cC5xIM(o9>%rO#9zS)}RVF4ktI(M723i zCM&8>HWtOgUP@H(A!hA_Bpd`1EZO7Teu_gU8vUI2aa%pAGvv^07Mv7MnjeSanT)pM zK39KG5R8cF8mF_CsNwY+)iat_G78N)Ap(DC%G?+rcH2MIn6jSn6}EdYIW-PBaYy>w z)FxvvrDt3yLaRMUD^ti6?jqLB{+zaL2oc2y${D)}RRW%qmt1Qt@&0fY>FA6*N{;|P zj%@{lPOUWU*2gNOb4|136|BRv4~IN*#-}y18AVZW#_JkyL`gknz5-RjFZl8p{_1U4 zpb=o56v*~7AYyogM`)hCX<$KKKk)5GL59g3JvKr5;jjE@@BLt)(f|!pFwAI4Z=_K= zsLf)og_hBi!}A%nk-e#{ZM>{2LelK$1Vh zz{#o`>L}u<@3QC`2~h%wD%ghCh1d#`&GV}Tlw!Ra;G~%IK3_?-bznN28~uk{7^=^Y zJ)c+S7NNZJ?+Q!57)~7vKQE@ffq5TAzC)DWPo9~=VTw%Uus9t~cDeaHa6C-D-E9tR zg5dU>5m}2$4W%Q3y7NRSW}(fd#SI6u5`{P!$Pm+olrv6}khqo(-2`CLM{Fx0UT*0c zyyzhUlj%%4=r|dera|IrqH@8L)0_s{AKTB9Fx|&kU3k)$U?IAC^I~#yrAp=CnCegm zN{UR-aVMOawYtk_VhL)U8Ch}JWCpPG6?QhTLfVUx3*#mVL&{^(4$YiBr7}koOI+s1 zET5uGaSYF?PP1qr@ftnn8_ZBxhQ4wQNMaro*m9@nN)=Hn4Ns^3qB^R&kkS0uonc_s z=?SLpXhqhVn6j(!Q#D6WNp7z>!ItGr120$xP@2T4o3%7fM5T$*DA;Pjf%C-lS7oViGONsQi^PKmRU&b>>|8lr~K}* z{00HJ-*|>zqvgsSKP;d#V&s>)f{O^JRs0XvSzAl+$T7+0W-|2|bM#}|BTKB4MvqDX z$)EV~kO^u8rB(nWlsNGpH@h}*A= zX?|WnZx+#GF+;H!VIS9Q02EgjWG{rmXD1OlEif3ZX78(1P}D8#&GSajyt8*aq0;ZjDW&Bc?FT+vcpp2#t@@(-5d14M!Yad z;Vunc!L)Po4-t+ahG1#s6tVI6X(*-R$#oj7 zX-LshR52#PM;ob=38}7(rp7T|YFJDqN+9`GATYvOYHsz!i^qvyd)#C2Y2KZCu*SW% zbCH09W@47NLyaT>bLQZ#@n+@!G4>5WwsuLjW!tuG+qP}jE!(zj+jiYDZ`oD1Y@4_6 z>hGC1J>4_i??rrH#5pJ8oH#pke|zW7Tx+FHl89-Lk!@`OSz=<6aFB8Z4DamaImbxe zb4_8Hw~_PB-YkjmOcalOu%W#>6)W4oEJ;?|Sts#OU$fy+b%|8W;$^=6yxQ9eqccII zT&8g|lmU09MCnt$1Gps;3v=eV7oPuS3K_ShP5gw}MPWi0*lLWrKNlI7*tCOPDP02d zQV&o3+bFazHk41F2}|SrE$>?)?{h(N$R%tubO*U7{^OrX3k7@Vo?=CHOD@R;4YBz0 zM4@nBXwzU+8R+6jkvAkm(3V1}oK>-yc5t{@1IS~A#FH)^5IRpvQW9JtPgHQqZDA&E zQ+X5Yii!r_o4h1r|06!YPw>Si?xh=TpBK{`fUB3)%@TM!=n%9974HCo-r`4fkOON- z+bHbs9^l7<$o^*t5Mqe^=NuQil8G(#@X&NmDGikVZ`85x+?#`do&R3B|H$lOE0^y=-)(eqFr_eyq!2UGqdl6+M2b8 zrDj=_njYY3*%k7&UQA@!6_S>22^ddqY5aKYY(%n-_zd51Ih>FlF?qX+#g66`rWhXG($755l5Q6sZjE2~+Mfn}>dQ zDCLB2pUJdcXBQrwm96!cvey+^q~Qa9%klZ2DX7b_=aABjMCQ)Jj76Wlx7bBXBHNsp zWubv+EFaT!6RP~$dMAZ8L0!DngCfMdOiu2XmK(Pm2h9>{51dZ*&v2kAdk%44O3H)A zq5&J5-+A|nMg|mpbY)}pp+p8xF3B)%FtnLI-zC& z=YK-L&zioI;e6LqhZ+9e5&hc(%Fc$y*8j09)@VU`t1NYV^>QWkO)Ew^}9&?Nc@Hc%aPG&wM1>QKSxRrs|{;aw}TR0y)ccxCkN)xA)Hil~h>hQEy!Hp-Bnl4i-5PZfU(P;Y zCk#+NHR!o3|0c=~?(gfeDv)>oJU*g($eg5s=X`ISS|=(2U>*{KdEd8)>A`_%qyARq zV_l}7+Vz(SbEsVU75CsSy^-TtTg(eYVAFzL6p@}3Jm zw}hqkhAM$2%(&<4fGk@QRsQhRjNr;<=o}|zm0JL2`@lz~FA6w2YNSZx&NR64WB`qo zwq7>o)eZcqC$_(G0rM*m*&Cy2GC^Ms0;y$sC8~t0BNk(b34ZpNCxo}Tbn9y2aNV2#QaH8-@TLInUIm+5uc3h)(cwwXNmx>C zwVm`fqZz7EEaf9lYrl=&3<8C&ak2SvFjOYOLh3khNWK-WWGrcS#X=DVoMPC@+o}!O z%Ipi;4((hbc9Md!(uQDNT0Xv$2iDpMhf-C z0G>9^jJLl!PUdl;VN2hsL@9R|ICv5zN2#%cfi>*GJUaGS6H$bEs7#9PxCj@TJWP$O z^W!kmDWLKL{y5>rFFIJ(&L_(Co<^t;`4fN}!LZs4Hm9;Reh2TGRK)h9{KClS(69vu z#so26Od?GW@iK~B0Xq$k{OKlxXb3sT_Xblg%YXJF4E>B)SpJ!{==_PG ztbK3|CJ&;MSp{C&8Ih47Mbqm$`9KCd1{zVI5tmUlFBx*A$k4Z?bR^(dmJx*6ue_HD zB_&GfWYLcQ4bSetMGhMYg->{!Z&>E)PwM}%AUZZ~Tzxk*M{3czCZvHck`)4eLmVXr>SKzx#uOD9X?c$^EFWGFF&kwcUy+FbJqn%wx}=IQNACr53YtK}aRA2Z zmpzsPEjj(VKTS9Y3MA?E8f<`4o7H+$Mo0b=gez&Vg6_V${l&Y2I69bS+0JKoK()uk5MCD^SQPBUzg_H+4e?Q|z?6T^sIceC zfO#f&>n~rdr{CH@kNuWGduKSC4ZUHTyHwyvWxBl_#&gy&zZrbsSvbuJGE?s+hm&T6 zPDH}SxkyvRNut)&5E_mznao?ry20=r+7ZXpd(ib<+ZjFO#_Uo_9JI9yTl0aVVjY{^ zLF6mGHw+Sgg|v*tcqicx>5}aw96W!q49Y7gb3&`}D(at!T+x$e5BiBiiusNcRG~>8 zs|ki%^b^ZlrTd+tCq8I6QW+C?EVEd(sM;A&{B#ZZS~P=xWG!7%XL-fySQMuZ0Rb}qya4c0rzlM4qm;$V6o4_k?32BL~vDvWHdY7Mr*BAutU3V7)SkE>d>^bqgSUJ5qch3-^G zfBg>L4Hh<1P7dk2{u{eVafIpeM0RmWrS7<#(SW0 zT`FN(jpBN;XX|9HeYI;gCbMDsx=CD9&Y!Yy%2S+#QkMx zET1u^RTNDm$9n-5OdQd!Ykx)yzqy+#iFC&&7s53F>ywfXqyzB^E6TNKGqz`{b2HJl!OR%^x`_ow7QuY5B|V%`=h#b@G~yI=$QSZWTGt{7 zZatqkGCzpTq6n3wZB^)%QO)~AT~2{wX$!rAO6wB0ppQ_Y6pVd+;ErNKE?^uv12lLE z*zi$E!v{eP2d^zBbrx>*)PHYBB?>MqC?$4BjSHu`nKOQF=|Oa-9d#e!*1`Ywv>AN` zF6YOfj^W(a52sB~oxqwQG+S1lp)vFySkW+D64VagSFrY8yxR9=l%$p(%w4Z7@e+HP zo3jtu%ctU)E)~+pq$#3LcYZ=GLVF^-8d>W|pE7w&B9Q4FUdd+e;(!%S7|*PRzA_6V z(&s_oK}fV?86H3_@LNly50)bX7CHxRA;+0qteQlR3~5^cizJp`#v78K9_@H1%=)Ko ze_1&Nks`1RPAMfgE+l%z>$wgh6EY)wd2f}I|^TIv&OD(x45cf9WpP>C)vQcj((rQR9b@{p}pc9XNI ztKemuQq*{aST&=lR8t-3PkQ0^Kj>6UWBn(y+q?3v+F)DeQvKyg>A(7#inZwzX9*;Lu6T1MkF-+MkRc-)w+#n7m=VG{Du>AL^03yWioygmK&xqsNHC z#fVPWg5Cmp&W5&3x{h&Sod04|*!PLBIwQoVV16%b$3Ua1#V<%25^l(5EsTfitpnJU z-_@xbfYx&>sA-yeWB76zO@AL6wTLy9fS(i03cp_SV51Xh2KKTXj6$&h0Hv42133C< z#sis3tneC-H?(;2nO@%`W-*^c%Di8SU!eW!Y>RpZ{*4i zK#_Z(j(^1#iE1lP-6|D*(AE;3xX32z@8S43a2ETSJbZwv}Enr6-+0Tcpr>@fPhY!C}~D6t(}gqfh>D9|0v zQ-+O=rl|Z%Do?J`DNf<$g6#wfp0}(xQAr}##9kR~m@I;k7Hz1wgrz48!7EtPHYq$p zpjD}4E`()GbvS&*l_%z3N$g*+B%3LQ$UB%9%^@!0I@x1TcvA#4cTuEav?h}Pvb`I! zTzKHzSe-%9hGfMn6eS8rfczwq$k9Dcl{+=a0>t3qc-)s-kF#35Vp;AB&1$$np6< z<$}fJn4b7KCXkI%MzqBgr=H1j&$AkDv^jNz^mQdfd|83sa49z(be66h&2H_Ejd|Xp zqOy3Rmx`YKrBC&;w#bEE$RMj`pdWXhr{WbEs?Fjo!sQ8^i%ydz)f}s?!D=>w;T-pv zhaxfIpysP6(?E24_Xa80<ggw=Cvp@;Ee@Ba!Gn2) z-Mt}2bD1_&|0JX{7KrJ=vmI^7pj+Au%y^bZdi5*fx7wd#-0Q! zmO~A?!f=_?`vy;A7u-MNe-(fz*G)D&4OILn>hR{S+2OW8-9Ak}(*g1KEAUg_Ef_`= zgZ==?$VphE71Zp~YjOJs_BDg1q6lCsUa;C#?LvMA4R5Jm7%q@io4888HM8zk9KjzWv#*e9{Vhi7$k(iDR`|%_WvFL# z47~G45aVfuFh9%!8NYb)Me%HRR7bF3Ww&#M4G{AqtaDdmWT!$)E8z6Y8RfCOru^_r z9#uEJh=@9hCyeKrhjzaRLY|)EV9L3|yhHfpj_2{$_bZQH&uGT8*N&px%~sDdnyS`H zBUMEG;yE>t@sDC^@yf^8`C&cB%|?~S0e%6q&s~lTPU2r&X$*#6tW_>=plF|y4%^h1 z2k5EPL!{=5S0(S3`dBaFl?CCRq(b=(!q*nce7>@ZC(kRLYqunGNsJAS3S~4UMBA8 zo;k0Qmk5@?Rn6c*HSmwD8rGH3^)LibhDcvP6^CgoDSoiRFR-k48_mgn(D!e^GAD7( zA=?FXpGi@|3rDl^=tcghP8LC!V}rS+FoO!F3DqC#9eqTnEJSZIikzS5t&;CxoM*Ie zcG6($M&W8>yA~E36vM0-mrsMuMN>|pZlWxUyiy-n(LBYWRxSp?NaiBKylW|VUZT-H z!-!g)CBB}Qgi>rCMFoOhD=Ajty0X1i+fL4}dS?|+ywYjxsH*6uK9!Pn%eHk~+G45N ztglrc6Ln$~F6p6}kyTOp#hgqlgrt*iJuD^b+PXIK?cP_nA1e5;k832sOS6Q8J!w)7 zFe1g`7Vb_h>{WR+_3ZQADy6UGLezy)Q}WEsMq2rp%`(&lO)ZXRi$cy3YLY(dCRmG= z7TqFOE?C;mUJp zet(+>^67+jPJw2*`yf#j!Ylg8mBv=}0<{BX)5CDM+1lKsV;cO2^@-O#|94ZYG;Y4Z zrnUImAw@3m-LmRAFM#JcBBU!+14Vh!Q`-juq2M*2NBJa5)fNr)nXZ~OdEK($@VY0I z)$xLgEwJnYo03SEKbmD$x#Y%PB+Av0p(1&aSN1s)lTN*}*(=p6IxIJm*>whSGxZl} zWn&*N^F5j?*cpF9_z2z`J1KlN~qOeEELawW}$fg|FBTL|N4IsZ?L{!|F1cE zTT^Gl|G~Zi-78K1tDQH-cXt0@R$c%0O(8owYuWFg_>Yl?BudMFg@Lsj>-T{0m_AeR*fK=h9{LJ3+wx^x{Jbv6l z0-)O$3hD+C!^T1ud$G8i{ceC5dK{rfvx%w_618Lb<17Lj*4a9@$LDk@?F_;!uBy)l zApuswPI&FXHv*A8+|Ltx;gccrAYw~RkZ)K85waGYEec&4oB88&KpEj6r4%|On^Ph*eLc5ku$vAZ7_jKit*FvNGX(|qsfZUOyx&j#r6 z3lSvpo)dq=r)u!)g1Lhg#fK6I#OP({_L`amf`kClKNCpS3X4gpsj|25jB`v{SM?DH zrKDC+(h8GGqK1eSjP=)wp>e7m*+{xwfgQ|-668f+?IQ20ID7!`DbM>q0rw6CAZnjd)Z9k!b`{j8EkBa@WZ!9tt&*#k<>;U69uE$Zmi>%c##T- z`T5i}%pO7|;2YOKvS`Kq#ojM>ttr}a=5pm(H!WVt8P;4RO4qFvtvNIG<~1pEdC^62 zaQfD`(7LDCM;(JW1FeF^6~mpq9`f;`Pwq>et=#@$ze~z|(;snzkew`c`*!G~`9Eh_ z)$US}K-1a+AdLT9+pu9UjLnYE=g}Tu91y?@xByodqvfYBBH18WM`>WLmi~deAal=f ze=vlYQQRahek=JMhE)IqhcvZI{*U->f-AVh#c#LyeY=q9-@5M~`$7KQb$^G0eKUo= z`7hsKRKRZ->NkOGrMdZA>*AZk_TMRFK5f4W7w_H+ZNjVn;*L3p88ON*Hiep@D3IV5 z=&A`L$N7qZEgxjRcYgy|fmK{GJWMM*NMA)$-a0BsBP`av1B3)>{!TL!_}ELA`Wq}2 z6Vq9OG4(Hgko5oM2SHzell~@iPc1$Qd}v@~`qt0@WMpPw(A4;5(P3x=z=(mdfw?kF z_4h%Rc3`vzP+?%Y|3!tN|0i(S=$N=#<+pv5z89x|xitT6ar(bD`nz>vlw|FYzxDKf z%>PLACG|#yl9f^_fCX0*`W;EtqC_nUB~>E9+e~i0Pa~J@a`;FVg6$Ut%P`}Oh$+oz4gVZpKLc9U4}D{OFKPU0oC;L5cHvRjZRL*hI~lK5y{ zX8ywPPhf$g=YEtmwF?HP1=4gRacHR5W858X8}||O6(t^+-YC={xD-i-qdpj6TLU7@ z_2-c1Pmwo@M>L2m509Nz<%CtKLl;vMc+BqYz)4li)+?4jcg!Bt?U!(ap@_=7$ZfXN zojFe-L1?7jr0wH62wsL4#Bp~8(xFJFx#t}W&e4tgm37V%Y29Rbocc`J5wlkJ<5^IX z%vtyl@xxO3qa*0%N{XhmdEQO#)Pq%DNk-*cE=U*Ldrz_8+xdJK~->dQuphV!K^htQUJ-(m_2s8fQPuL1r6&x<_x zs9;)dTX(uM3XoyTBKflpm2@`aD&?SIz=2JI&rUW>fwkuS7j27eX>V)%KFy9;PI{8( zA(E&FW5wbAmV2mdw!wCGLW)}jy0Jo@DS^s8y_(sKM^@d#IlEa^7=*SX5cfY_?I$xi zu4MV$*pfYFeyLWpPkmT;U_L!0!+5ahOrI6uF`qlFSlo604y2I1w;#GQ zedh9B3AN5n-ft`(M$T34UD5WQNVw2H(E8HiTuiva$GZ3eb$w|gq)VIk*mXNXE2Ah? z7T(u~y8b+IXkzH97tW*HmBg~wXAtjpQz&_^-r^OCf&>B)yTJ@$d>?c)=Af4WFkm%c zs#K1TICK6rBY@`RSdJHz z<8fPv-k<~xZdEIS03tHPfS=A#cXKnq0i`=L1pG$9s2M>8B#Pwbu2+2Q(X|%_*tt7#UmI!nKpxSh$7n!Zkrz-i0FeV{-1y8@rQQh%a1rBKXrwC>ig&hL)=` zAXkNH-Db$$7}4N_NYd5J0*-w{5*hNt2kTASXEAu|D9T>KjVZ%4?0)Y|c`vDW4Paqy?6l`zcT16Ti6OZ%6wY1_X-Tm?I4 zOS>O`AAd~3xG{`~ zjLDMjwgdZ3Gl?k^6P-m3xr1;KBTAVmO+o5>cG@3OAu5~A$m2SsmBK$cmhu~03ZEOLSka)5z z+Gd>-{HvWss?OpUEHyWrLlj&Wamtzhb_4|HA8waidFac}G8kV;#*Ogtcs`k{e0a$fh{-2u!v;JfNR?sxjt&CbhaJgOeszYrB>L+p)t`#4N8=&BrKwh97 z|Ewrt*HK~I`90rIzs>*eO|N8XZ)oXg_|4Y+k5fWSY(G?>07B>&<3i&vyuu(ot&?>| zh+qPWlUdu8VHqdkm3;N{S>OkSIjgX8Wv6t%m+#z$ACH|I0JA%r4mNS1*Upkywucs- zNeKil|EhH+#G|mVY?YnWn_)e%^S%yR;Le|ZsZ_|QGa6}B>8L1*WSY7Q5)^Yg;y6b} zat>|Hv<8jRjwg@2rH3*4Y=+lkSi|2sP1)#>+T!Af)KLNqv&oiciwuwXzynrGVs%S= zI6i_HCqE2cfc|mvCAz54{uQjre_P;RQic9D`IN0)z5y2hbxewhpR)QJ3~I?@{ssOG z=yIU_RG{tZ8@`6V)`2}3PnIELkgeg(itgjjm+Ve#gih4n?gZ~N<95a1H#$h~&o1K) z;}h*24Jlap`)rg#I$bPkM(3({cD|U%mF-)W26x-h%b~ewIFr6r-2`nDDW)XpWP)NK zo0vK)QdSow136=ja-XUTy~I&zNVMh=oq7vtMAa7gG1qb=bYD})AeiCPZ_+BM zY6vm+ItX7b1$KoLK}*N>6K96l{iL42c{k6?zsw1K&KSI4#vD2b`5#TgwE_m8_H7pS z@BR8;P7VbdLy!L<1`zX~N64}XVL=pq3cj0wFvo@nb@@oF%yF!l9)>o+OblR2sncKKo?zoOTCRBLYsc3WsrZ4m`270OHiz6`zY~wV=4OCaG z5{g+%!b!>Mb&%=+uk%|?Jx8)!RzU_%% z6JEf5w&0->jK$v+rrhCdYApSngXih|YvST6&I}WpMkBvL;-?9tsBHiX03+~Px-?`O z@)6RJA*mUlnsF^D4VjL7d%}So*)5vQC{4fIFI@`d58m)xA1ur}M}#^Yp%5eJ*pnWB zf0k0lk&eYq;urz@mh6_XSs=24YW{9i-hg(XYuduZC<$emllrh#-1Z=({48`$YRlki z!P@PzUdH!Wu#hH~yKxLBEc~-6(G)Xk(u4~ykJoGZ%kTK>=a-|JpU2lGkU!l!VIal` zYBBMRVKIGgLpFpOA$n*P0lg^M;h!}Ky*?G%>0MFC z2PF{tePu@u{DLvij$0{=JhdB4NM71){lvklmKPd6^{6O!S-3p)n-DFVKJ>#IQp&eO zh~B_DsuP79R?s?XcVPmP<4v0_)LAfF^KK^=zoY0=*UaT&!;V(wCC(izWJz`ToKs{7 zj;FQkzBA;YvPa1t<|6I=9LW{N8iyatce@zIWRDb0l@y6?Q!?Kz$`5^I=W*Jc*{?Bx z{-j-9mG_;?pU37p!j@h8K3x!5ScF+-T+s!{HvEZbi*5=*%)9R zw$;eM6>u(2O(k{xK3zF5d?qrN6H(*J7?)UNr!kOh*nO(C90sx3G)bEm&7`Z#N^?y% z%#~3enoGDcyWTkGK9K^xwYFMKzfbCUyr4^8BTN~8(XpdgZMGwHU=}ZBB)ppTSH5J? z4z`Uh6Ylz_z7LU1UD9x8^vHVUQyo?$4&Bnt$f|Cj(i$wWB=>c3^harR#@mEFFV(K9 z9>n&+NTZh0Ed>|o^7bEqie6b!?mZyu&^u1`Nv@}2PBV+nBNq(NZKYe=ZpzuY>yt7a z&jQY^TTZCe*I(&uRu*xj&9%X;vPn7I1&o3$sN4N+pqacuEy;9EV$$bHp=O87nDPq4 z&o@2+wo&amI$&1ZL$b8N1;NuGT}j%gkj~}p!T1#J(!=nKMLXhDzR`K*FO+oDFBy?} z`{-1@5&9MGXp*QuN9;h@$jivYE~DAZ7KkHi%$q{5EJ{l{EQ=(B=(9YAJuEjINF9Ev zI)K_yzvM)2@8cdNMOLM&I>0(zgsLj34)YwTbW?|&V<;E*uaw+`{#iakii3~IWmA&L zKdQ8XhU!JWkcN#iV>pSGgH-d7(NoS`TyFBDvUM)Kh=5dcM)Vb#NjIi30SpO-Vb%lE zHV$&j-Bv%`BeWU&h3jyqqKD1htFxC+p2%43za!USARkZabMqaphC~@Oxv|3((^E{L@+UNgS=9 z8=h3z*3I%5>M#rc^;0ScBIq3|%#@1w}hN`DY8cu?t36cGo2a=4b&EyXHftv3I zRCE7~ypk)a@6DTup_e=x%azYq7Jn$iv5g)M{_(^p;ttj9yf19w2bcF~ZNDEXpj^=C z-U>n|)S<2XJ!C9wGT5?H^>NzGphaltk6IQq#v2k(0K3*4Hi+&(y$4kJyP6_3+UKn( z_TXa$WO|)}NO!@E0HpS4|DS|N^xa%x>n{q0^^@DU;b2MQ z;^d)AEQwwiP;W&5x$f3^f5u#Y_2IoEf8fo5=OYk~Ealv}K^G=_MINBLPyd(@E#KU~ z3?*4Q^zR-OaArV2cL0({o(${JQJtjz)83dz%~?LTx#v@@R4*E?y;`}GvAM@~wxewC zAJs=IG9+7_U|q1683-tk(>@g)PNPfW9~d+|wdxr2H4EEsZCalk7eq2Wb3E~MG(=PQ zZkIj0PJIXiqX>ubG&UQVXiBbb6wW=6g*y;dL72d=B($Y31c$t)4|=ZwYStc&NoO1y z;n5zPQJg&FowOT|I!CNrnDNRO=fcOr!a8YV^VkDg^7($L3!T+ij1;iUUR&USN9&98 zh%|h?HYYTs^=scy@HuxcSRa*bNo>5B=Est2vj&cCI7ZKFdsoPN3A6AAS52b^)_Rkkr`_gJ-8##6RAbf-dTZ;p#& zI5iUlxinnZ>9Ffj^^IfeoVC5u8FDh!)#ZM!vo|f!*RU3ShuoG>SD^fs$i6HUir2Oi z$^xU-L>T!?GS2eE6GN2v4}-}Z%G*ryG%XZrP2%_g4amYO5Ja+Ip`X`_emz2dgeBe# z-M1*`aMkL*L-BF@1)2YREE)yjMUw{u0MLW~H<9n(!U-EwC#QdiDAYETu~jj?Z0Tr% zVL_!TSU{CM8H1B4o+d~sX_Xeh))S>l)Gm?K8sjfYvtVhLwCEp|9;YzPy-%G>nV-fp z&YBHeMjX0heIA#j@!zR&P=7Xct${$0#`4*7{K>g~@BJ3=xc(z|_3`nV2GDt%3vSCX zy&nt?hf^m=E#^VOW4}-G$9+P05CdDzDUO6E$FM@|rbt(Ed_#QU%4>M&DN zH6>@&Ea*{Z%B0!h0~z`-EzOMiV#$nDN1U_$g}rKw>2pUeoHQpc&P9>~O3}sp%%K9W zHOFnO7et`)vm{i_IQvyBjmaM4=%Dj>F3E!BVN+48adR?~%VLfMGHGKS*~n8y#iX@1 zQ|D944EJk_xNM0CO-kBB$08-AX{qRFvco$|sTlR_?C3S|V|x?Gj_7h}6mnd=R}re*brHwp5yaqhV&K@xjhV?L>5_1? zMINGQ%=78lNvBL;D56WEx@xGM@n*`DmWmlr=+6jSa{?EBGR@o-N1Cz3(u!X`pM_Nb zD!CMOgu8}})|5?pN#DJYRVo?XVms{1Qz3OpzCmuJsHjcVJv2Vj&3tLJCqD9+Ur?3t zqnwool#=)@2itfWhXy4*1p#a*uT6nvRK+pWoV| z9pPnTq$NE)@-cNoV`HgZBn3D3cX9sGdX%d}P{t}rqs$o`DcPg3H0OEE;D&f32UdS0S|;hV<19HTb%LcEc8h1L zRT4zDT9~AVnCM5)%cI+aTZU;S{(5($Z1h8Nj$et|$UfdodbomC*Srdgia=a5B z>tw=HGJ)!b#8U7>dq{IsIYTj_kfWAF)+7NgQ~Z1B3=|35hU^^9s`cu#=AWkpKeUq3 zJ?yr^MNppt5BHP0R+;LAL=6|$YA&e_Jma3}vEV_0tETvNjeV(ckJ3OgmTF2nz|0aEf-`u^P*?w#TKsGAiMT%j9cAZw7ULLo(vtK+T~|- z1wV9Hxa`i37q9qR2P|(kL@EZ+uQJJOW)kd>_6m-0C$Q0c%!MNk3n!drjz-MMR%AqB z^x9J3?6w-4v!Yg&$V_7?OP$<2=_;#f6{$tEYk$xK*hE*}oDtMo|1K?{HlTMgk)~+6H8N@jzHj&wBv#Ph7y*U^n2Z7Iz1jUc-N9b8x7EH~ zVdn--=CHb*D~GoB;|9hD#LTsWg5~p@#w9d3lJTslXPDCtnAl4c{1>d27cknFRIVMj zp#!hPIe6z9{>17l%y(iGA8wag;Kh#LBNfo(n2k-$CQ%M!NXE1^u<_Bli!=ZM-7=E| zn&}F>_MZ`2c=8u?exHOmtygs$vk;Sawm0{y%{-I*m^7f&MP%%7@U*Eql$X6e3%cb6 zIyQ_~-7`iD0$*->5DioZ1I;)knnSax`}8mFLzK9Fv)rb=5`)cLM!#Y|{z-2uwTE?v z7#0Aa^taW9YSdoMWPVgwTX*^LkVk+C13Apg!T9p2T^ zE&%-V&CQ_U3*yz`E`joc`|Np0=tuX-{%$;akpn(_*z1mOD4xNIAYQEdO+1sA%xi;b zj51L7tuY?n(Jtc3;4@Gy7*_fbInVoIRFQjfLEi0+6WUEW_)mpfX?n6<_3qD>$Wc|E z-ToxK;ClUGWuC84)%Tjn?c2R)n-zSX7vdSeyFE*u{oy9}*tD4{_W*~_>OFd%FV*2~ zmG1IAQoRq|;YpsK16ZFyxB8Ded3fDNqQrXUm!HF2-Mjr+c<jMW8zAq{Nfj2h z*6QNoG|F9p&t?$evJck9+h%XJga^|aWb<YveBXLO!NI`Fntz>n_3=X?sQ7# zq_QcY*oBUV)zw6CXeOE%+|V!ws$k2N+4rg=<5v47F4K_xPz&}LIw|wMq*k>Nrb)Z8 zq+&xFrpSvBHqj*y5MIvlpt>0v-L9OtWXdK1jfz4jTLlg}6~)boWJ=2o5qBce@Cb_9 zoG30!2#T({I&Hz;d(+M584S!dMTXF@A+#Cx#m0*5%4X2I2%Xa=KiXsVG?gtUZ7DG2 z8e^u8X>fr=W!+lLly)UTc@S5S=U_VOW&yO=oI{kkBvm(zPGvX{=kBisegb(1B{~B( zrhhb_ckN|pn0qrXz*U53$iuA_mW7K-9x6yg%E|0oX1tsaU=Oz3+7oGYwY%VQdWxYQ zMl!E;#@7AL7j|??e3uba+Za4`-EZu~_&zLvuqN4z7aK*CJK(>a#%y9D8FyrmUrF#} z5O@my9OrCz^628susl7xkSS&I+~}4?>`^|GJCy8`#_XZ7)T8QUAX$~H^3F(|){6pM zyRemXEg|w$j)s;nT&7mekP(JfyT3^dy}!YPg>H}#W`>XQ&#o`5cNZV* za+e>pT_tB&=d)(D0f5EC+ZqMO`kWMo8D;SvQwT2Lh=qK4L)Ax_ZnmCnP#g5bTfV*F z$62ul!goKJfDmjR=nqQj@PIR|W z!&^2?A$!8 z8mT(zB&7|}rxo{L2cpV6m}Jo2)*gDPI`LyBj9Kk>vJF+crVm57QK%rYVOa?cNL2uk4fceD zXxH%w)H{g?RrwMDRk8tY1ClxckqY!U1!qC_p;Yh#s8H>21GrEW;03`_P;djtREqFI zm+Gd0i%p3b>IMFITYM_UBvuNMln_Q#WJPL~9Qb%Qr#X$J)V0rJ^jMl;9sBLI%VW@>ba3>on#hbG!v=(I z93$zCWq7~FKn8~^6af56gLY7lVb%aq9K|C#ImwVw^GW+j9WvCFHvs~sP9P(7B^66kDLzM=5CwbD~z1vO_SZf@n^y}HmAIK5R{s<`>x^k;+NS9mY# z=}~*0C0zN=>R9BsycivU%Oj2HsYPlk&-xxkjlIJAUMi~FqZFPN^2Ov&C^(}so^15R zWDqpMIJ5PB7mpcM|OSt*LSn745Kvaz3v-F!` zw<`*n^=ti}^m*XtE&lBJqHhX%*Gbu(z`ftv9T??9;VAY}gYso?po~CtyJ6}mMH0~i z9G?8k5lAxVCF!IS^&;7Us75$GB++HZKM>NwA?GpCm4XO_tIO?Jb9RZ;y#=`jr8}Ax zxQfEBQs>Ofc5!s1;-z@Vlw~zUG|&xs=!hkXs9B`ArowE87(tF9?}|2pF7b4(oVf(; zo-WBH#HLe&1j3@8YWvcDIj_me9Yx!e^FiUS@h2de?(w1EjTEbX%0C+2CCpM$r7k^0 z*&mmLWT9O_up4MmG%FDO4*SEaIzg)>GiFfs=_(!4q+O6BW$QqqrYR&$yX`P-!376C@vu@fI<1n91Rvf6t;3<2zHvBq zkg^bt6Z_@W3rR!7(Fj>4c2>Er4PEJKb-}6#1)D7jc8*cglkuq8sH73{RE#VOJDVc6 zxo!SxF$J4tr0fx~QIm1`ss>Y4;YULQYFms^Q;v}n=kQUaJVI7gO)Wb-U4*I`4{4wn zF`QU5AKF1+;tKTeRrZ9gnd%k2HVw8+Y5<|e(R~+bn10`08*-P7FY{EYN}o&3fLKA7 z6ONvNM?Qdl0wVf5J!H~S)ZGH$s^&*|hHpx?Z+4RS?qTz?X?67mXf?I{D>6|l3f-Jfg2cmIjg%wt2}Urm)Agg2 zgSq)IUWuNA%AAQossD$rcMP&E$hL(~)hV2^ZQHhO+qSJ!wr$(CZQHi(ulnA8?|$94 z-;P*&N9#p3YLJVtBj$}hSRFMEr%8_AuPv?v5Kn+e2{H$V# z4}R$n5!Ksn=;id!d&fLogeUo#jj7LrSB25l;;Vh3M}ZQJ0h%}Tw@U#se-W{c)_H$3 z55mZafm5cThIe6yX{(D?hi60snbFPrhusErgSNp9`A90J_QN%sz+28bxIH28eF@ot zaa25QzFJo#fLrt_#Oi&@TaZrbEx~$M2#bMrQ>1HLf~`T}Tka}E9Nl2nAg(=u4ZH=I^;6VgvWLl(&yNuN%Dc6Zw(pCEvCH174kNI@p(HN~LyAIGRQ;&SmEviHCKb7&Fp9}kc-~PkV5zw=C)^qqLRU-PI zf+<3#5<&ww5w`#ho2;Q4&O~@-ezQRR-aTRpq*!y(WYhmGm@;pcPh4k153 zy}bp%xidCY7>U;#8Q^}f?nWuz7kMmWgj_3Bt34cM^^(NYD0hj8qDEbxVe2uYmOM-^ zHXuJpUn&1uy^#5w9m7My%Kn6TEyQ2bK?@my>}7#f`3jI*T=@6+M+vAJjiw(e8c45% zY949ZZb)Jbaw)6@k|ydLFI>-YZl+4J^PM_oQxnYPoh}~M zc=mK|%G|e-nedpAsi$@?Jf`kBk1yPwqe;5C0c%3!f6*_ssKMYzLIEp)Gy9_sB3V~~ zoD!DnN4&GRt!a?=Z5%5KwsaTi$GuY_$z9!pS1~|#I525UbhvP3Z;~5>L(1PyRgLBt zS*<(HIpwc1rbC+i6i1WF8k(A^SQ-s3imK4sPm|^?Ss6HeLT#%M=~F8SGQRkY_etlL z99Y^!-#7|R`L&nP4%US`g)%HN`BKR$<;b}*-J3~@br9n^PF?d{ni8xx2$OO%jM6nK zGs8|1BgHebNCAnzx%*#TuafM3&?cz%q&cnOItz)=te#xWeDei~AOky27{$6stoUp$ zV9~Z@s&#u6RO#%VSs}`!@{Gq{8b%srO6VonNzaiueS{JN( z^Ohs2AlqD{_N6Gbx-?`nwff5-ix%a6;+|XTzI^n#0>vxWkonukEiQ&+?ba*wMJx6@ zb!ha(vQ^8eiRo#F1Z-4I=k4HxQfig+EzT0OGwWOlgCXln%4c46JTAV@S^Ki1qQO8& zY~qZ4QFMJ*>3%eCy`mo*Ge1D}niU2)rVJrD0eBWh&SdMMdOzVUY;5F@cO|MmU%e>#S&?%j4nQ{_LL&ixJ;pFn@7ao1-!1 z=qdp443wJtytdHl#ptWvYgi#{3mnn)Wcq;lSMrg1@3{NSPf&>YVRigJLhOG9g@1-v zWhsYsMMSRYBq9k?yFUX`8N_z$zoNt~if8U-GVhy(XtKx zVGyH+a8$>t4QH&CQs#SHo2$nVUJe4OiE!*v|C8h=1)ZaBnaEmSKePI`9=2_)o33|F zdx1Q~WRY{dL%vn*-x}{YYTZE>G(Yv+W(ub}Ur_tIkJ@GaNUUp=&24Wcva?w`x}5H7 zPTIXrdKdS0t~UWmF1JawYc+F;WaLW_wH(VX@K>HUjzxZLWg#SRI9Gf2Us*kHb)Rb) z(lWb6JFWn18>OsYwfoNRKFSWaojd>55G73VyzKhyp>DQnR>IZ~;WNA4Aqa9bD@4b> zlHF>sgub6YK}9|gG&8D5Gup)`jD2qUbo(=d)$Of{1kUFq=ZPjmreq}aL7Vek{TG45 zcXNZ_s02REhjhpAG~~t4@zgZ(D@521HAGRoPGLy8`I_mKNn}F``o=^EPHH0Gcu!~| zWdx!=tS%IyZz5NBFQp|N=?KI+?m%z1dCh98Zv9-le0$g0_E9hXxi3Nns*c9_&0E&; zCT}0v-=pIME(V3dM0q;ArCHMRFAN%T;KOYdWc|K)4=od-W4T>+9zErUNw48~38}h4 zw{`P-9n@kz=uf<$ci`|nZlPMm?zd)cy{1tiPyC*rAzx$>sb-Gh6IaZ1CX;h*#SULu zH7$gmVFwT%WRGG*K6&`PS>AwLNus;-0U*D0`@5hra9Fki?U0UsN%H8|8BLsC>;*n! zog3*uHNrFDZ5Qu^!$6y0hs49F`iR&!$*)#~wUiAoC$b+G_BneJL~?r)Mq^v~Jn7kd zc=J@{pyV5RwcJ+8@|`i&Zv016T*<`barwV!?1F%(+G0S(`#TJwJM#Fd;r=v)ek!^` zI}UKH5<3?PCp^P9$s#wa0AGy2GCT;J7%<*kc&_qDI)#|olR}a6mxM?5%6`a({t9)W zWtgeEwy1Yc27R9RXm`2Gy08nTu&Cstny0KNBvmrQwub~&ivY{ii{h?GM?L}EJc;jM z2;KcH44)eaDL&xdQa8m!-wl{-$$O4sizbZjTcR0#xYB&k5?l4(z}rv58|MNp6q^U(?`Ug5Y1AB?0Se zf#Qhwp*m6*V41R}T^3@lhZzMsIwP#N<5HSWJ@|4^KSM_J-o`fmO+R!<=u4mSCl);Y zlw|*{lkFd;vws}7{wo#;*jQQ`8T=0n9+;pd^JAD0v~AW*X^A3eE7x@(uz(yB2I&1) zDJ+jk2!R$=v_*9d3OYe+!#ebZ<^@OFG!K@MPWwGS!o)b)imG92A|sRSnC&`)t-kx) z^BZgjTHD;Tzab0_3Qn>)2kCjQB^p%UwM1We!a?7)U{+h*KWw^6>Ne5S6i*>awu9l76i@=0^bu30|)Fca&l(0Q_RA+EI9MS%-K^DSViLd7@gSo^O_NEBy31c^&|_F^R&)~) zLb}%Ukn3tCL7eP1I!Q8tXjCKV_?`BFq;B+$98G_NS``Nsb?~&R@%%y~apui;)QMf2 z+xEgNA!m>hQ96_%G9(iBcc>-v{EUAn1Ey>npv!0349n(aPKYIDnJcJ=BFANEqeyO% z2@+~s@_5s*OQn+bo+H+M)1_-s&RnA7tClR|Wu+of5U&9JvU|VbS(glAX&Sc zMQnH=#j)mPfM{VpLNY2l#U#sh+mY`HFBZy7l|G*cjJp%(Aj95*M706jv{MIc{~v1z zOJ&t%w4m>8qX%~KWADyZsd7lGZ|*;5yk}e>0*+dh&8~3X!C=Al>v_d_3sjJkp_0Og z_DJy$((5OQ4DM@=@@X`4DnMAK#OY)F`Fs>+f}?j2m`3xfeFN|^J+pf{QNj?zxjhYgqoQ7PPq6K zfVy+Mt8yPC#FMYlWCNU#e#`gb1_5sE|3yLRs6}8DnG$VN0}cN`pLy;A>c z3B5-h-<3mo_GsBGj{jN_PeZ`a0_jfpuO=~EScR&Mj*lXnpR&hNgJI;GHl75*>Tf7Y&ZV z+b9^MK7s#r_suX+RPy|x^Pr=B{rVb09sOEb{oG=9^Fx z!^2D6T;UXUr838$LThh%+*Z#SXiFND1*M5>G=*d zN#WG^?r5dpG-8~soM?Hhmlq(Szgu?ne)2TbEJlgVZPq8KCX!EBCXXb^Jy6K8=qFqy zWA`eULVP_Oqf;%k1uB>4^wUyf<2OGnkcH&d`v9G*z9Sg6_4dZX|E;ncvze=w{RA99 zNf*fs{--t|L_dd~cSvXgfcVF#Bb1S3Tre#$(k-mG=WE7xte0pAQ?m$>pl2_pERQ+8 zLxZ(P^Y+(#;26t_4y`hwjhFBmcL8o;y|S#Q*Y{0=2+od-!9@`7?tpe$J4X|1q)r$1MKm2~ufY8bbw9YnU0^AZR58NWR8j zEPjER(OO|G2A!jj8c`mQ5gPU+vRCo~%s66bpA;wN*qc{dT`4h!92>pVw=6cTOX*DD z9r!brw6lT%8?q1gcE`*5{i5+{%_HjjAinXRw^*xG@C20IHpDYiP(^w!MdIRfK z%h1hLZw`Aaz>AmF%2FvT4-0qI$|*0@Qv9*v83cwb2{Dk>-NC(Mq|lioM;u-v!A5$d zS}#ch^r{QHeTT$4HdVfKtrsDj@beQwl4vQ`N24GYwi6gMdC}Y%I}K30B}b&W5~(12;U7$n>r+uxdX3zMJz>iV=6(5PZ++>j z-5?W__POLWp)v#y*HtyWX%am?#C9cN$kcoW$?48&`pA}4WA?bU8R zSj{+jn_8UJS+aN}LmCZT=7d2EjVetxKMj5z4KD2Am_MqICES!(odoNf+fY(o=fEPT z&7UZ*Qm&8%2iK(M9WM}_up+8M50GyKk}0FLKL)=5)^Pbxdell<`mh?|0Bmr3<#0n2 zFg`7WpT|Ji9}zxeW?nJJ>0Te0TE3S7C#&gqLrKtKvM?Mz`jfdN!L~t9z-Y5nzUAxD&M; zzk(QenCBlk_~4;MW%?Vz;O+T<__pkRe~H18&3KxdqTrFN-`E#ez{H|#oOt^&Uq`W= zPYxcOaX<hpIC|7U5|^Fj>Tj`VSWCt01-8)%eUw}v)+cP z2Xyq~d&I+FYibc36$%FoJ*$5zm&u;Ezuh{*pGP=`Oqbo(V8sGy;9o$s@wDM(MnHQe zsV)z|n}Eg}90c<;g4=Q`SAjjjH^zBpG{70oCWSFti-YqdIZ)2~o>)SL`g(14w}qP# z3725^T}qb>U=m-(U2u8xQIJXd@xP0bRo^`-P5>3u%!o0Mswkt9O9-UT>KyYY7eqD} zjDC!sw0jA(@rEJJ*L!XWnke0@LfaISrW{_C#G9KS1Z^P`bZi1O4R8&I$-kjQ(UN`fgzU0Nhl`&EWF9aULcq@QRKwevuj~RA!Hw)%2 zk}N*VRmCCYmV5U7b5^#K7XmK&H>cdkl6h#-T7RjHWmAed9hKmn<9Q<$ z+DOx5s`LJH>a*+GbK1ei=l%2X89;Hz9^|UWpFPSD7Yb%{z5j~5geNp=Y@Oh$46pH^ z3f>O?&Ln*1))d6Pz!VyLyl3B)e=BREhmMoTMn>W#!t)Km?Y*?)QfrlQcU!j$-=Um2Ws4eIr-YhmgIZcV(-Eg%zC=;wn0EajY>B zoqk=tEM1*NrFns+(QL+?(Qr{1B-o(0SJk7&XTWhpi_vf)RX~mbF(P#n9b8=)#9$Yo zo{JOn>Wrlv6qKM=mr{}rDt;09v$r>^&JL|r&LBt6YrQHc>FtfUbRku>%*^bnCW*75 zF}JYIL8Vnt8!9U4ja>{J>NLF^aV?tF+)tFN7vHlZ*h)2G;aSv2vfqlQXkZ=z3i>ffAfn7Bqq$eRqJ$uPInFYC0W%`iaJ+qS z?$S{NV*DZHx4?!Msb|jxiN)H}-;U8P(@0YWbXEUZfbwUjGOluEX#2O^e6 zL>UdMAjZMR(P#>R<)^}-R!Z>Rjj`+>jcBxc&1j}Z*2`Hd_0GP-8&SFk)Y>ivEnGLl z9act2U2j3AJZ_6RI)j=CIjQh$Z1(*&4)aj*S$77BTA5M2Y1nHL6WP6GfeNlC32KkH zm||mluXf*l<2i_8lgfW!(KP)9R=x3u>VHF9UfgJ0h8&FBY#e7`5i%QK7^HS)*rU30 zG*AFl1Vqm(8s(l5Te=}Fn3DZTi3m=l?>cCS>cgHpe6;0kU}4RvgoN`r*Rn7?l;D@_?|6g%m;eJ|-n z>ku@*dYI9u%w(OuWo=@V)iDPzNslFtp|fJxNE6J6mHz4{^!U0J%*%$oE^%1+dScvV z${X8JO74-$jLO9h)RGbn?-523k+G4-vnCZCs3r~6auN-P5k@7Fu_+VTRY;H45{DXC ziAR+YMx7;KGKpa}lChn|v7RZ|S4ixcijLNDhZ4m25oDfos)V42j=hxME-Tq1tqDn( z#!pTxv!oroYtrSQrB})jF*j0S?v!~p8h3>^O!eiJs_eGV@(EQH>IdlyP^?jU(A$xa zP3EnM70OXfBNr+=$TJ5|gGf~MuthIl<-6Gm0otv2Ikv_(NUM`v5?|t7o>o1?OlJo_ zh?=^&W78*_z#rp{Z|5)7-Ob-;df6KvwZF3pysB|e&vLs3Zb_?hLtt+e&jfiQ(&ag< zq97G08<0D&Mgp`<-knho#VO|@tW#El)Mg@1+g@YnzLTpn8lF z&C~l6w~xArqRaJl-W^Q3)Z=NUR!Fw^k#*d8Y>%6!9or7seQw?xmT;1Ia&4Yzy+=SlS{6$k zm1dN5&eN;A3=->H2Joo%nbFSdUSGjbP(!QkIb^+7O$;^z=$t!s(C%{tX)g%q<~A8* znozwOb9t4?;3r-;S*s_B&AJAE$taIvMSGPAql9vwRWn3q844RveZDf8BC(h2I|AlD zV!H)Ze+DDoRbU>$Y5hWjIhaG!$Q;maJ=-DS}mkGAYmMm>-xjvUE)y>FQW1^sF8R z?IhmQ+JP0cU9^<6ONe=T2H*LDqAPKwg2Jv^gS1qj$vig`QWinbV2STLQrl)vd{Qb6 zxhJTD;SSU9WyCCsH8W#b0G`1C5ITii{ogbpmwnZ;p}yt%)ualhSu0dYp`O6vLiL#7 z6UPY9z{n$};dsDf1LACms-i=$U^wH0^0kb+dVwYIN?_l}p{evBO)lX=ycMwZNUDAO zR5(>wF@FN@DwO>ETnqa0Pc}5_7?Rbj_OJ;P7tJ95#*r8`0B=HlX-4!?>Q%;m zO}LaTi5%UR-I11~3I@Dn3=;5#79PZ*>8;#I5%86!Ahjp&m<$Wc0JkwwWkqZmCr8q- z2Yp5t9l1O(HUKNt+NflvZqyiA(mCZCyv)`U-{FU?`c zYYZOTNQpVyMca**c%(m;*b9Z2Up#YNdy=o9%WB{*TE~%5=P`meV&hE}RDzZ#mP>#e zBMh?-k$2dme@6vIH-!)~3ZxE`fMReLvMWuYJ&@HEeEIoOL>$TO@s1@51_V{*=QI;6 z^aF+RG~Rj66YdoN>0-KxTq)SuoQw0=5A70Z`WE{=jKoQq2GucqFVgEVs0H#h@Eq=E zz$p=Q$snAxqOS&?Y~{+MVNdH_GomsDa^C(F6p3^2s)E6zVd^Ik)MJw$9J192gZLW; z!3$4$<)p+v(>oms8*UYo8-t6Sm`*v6**zk63}N2tp=AUSjeq3?Z1%!&*%Kbz*%$OXZ^cR(~9|HO&ZZ+ST4^i#LbL4 zp-4&3dyN#ipwqXmp}KZP?ytQFC^_bE&B!etG6xf-T@`Pk15OhAj|s*-#mzVrg{GA1 zDZ8Ii)w$~B8;He5ea%uQlG2qyiL*}t`lheC7uDH=+`{>Bt@L-qlWEKL+l%Lp&%Y)M z^UCQ}|1e&@{ekIl|6{TsZ)9y~WN&2u-vEb`oP^9eFYFg_Q@s8Jg%=-uiF*kmzMO;- zo7^LOsDe6d4rYs0AGsDSvpuGEcWJV?kSN#9?-x0xZl}Bj(Sx1U)YWUceXo!AV}Kr# zj{DubqkaLeD7AdQM{s5!Z=O&FugpkA!WaX-*YHrOC#4-mmUh7A%nZ|B`Qd@L_mhs| zd4k38l~U)puCO+8rlu^$&5K|(aP&+!CXp`#@G$0G)Qt^8_d%56P?8g__2rMV4-8Wx4)RBw&JWb>B;;o;O#>%LFX zOO9qt7*o@wnrt@Sq>u+vpk;f9 z0Ueq9avR2y8{{wJ3pzL8)p%7mM^@U^M;(p-HogD}7tQWJMUU*Cq6hwe9N+)4TvRal zNeTaZgnvj8HV7)PTqr&lYnI%${2`e!j62Bd0FZcyX$58(F^CEzNp+<};l+_^8$?g+ z_Dc^u50y5bP)a!brV@)~NYfuBWhPZBy5fRWj>lIQ6B%p_4ldh21J3gcSyl=+?2u6T zrqEaIw+<0q5EC3xZAJJB>@Dv=Q3w^BPCBa0ou{e(oZy<^&_IH3onNh7>00_z7XO4b zE0szw`Fq#;rYW0<$W?5gWZ}FO^0NmhsJ5&nNARH4am`Wdwn^hV{XU}~zh`krn=pCS_0_}L zyS2;oYO*_Iq`X&IO-wnbLl(zi(mqSL^UUMNk^L9thGJoVaoYSN&`;*@CcTcd4(e*y zx%aAFQ)YXb;CN`?HFUGX5p6{F#G~gSwGHO3#W!hou4(-#sVv~U!wCJtOqk%ggYCQ- zgwP^`IM>d_bF*eW$#G{&_3BMx3s}9+a6Is<*o97zG2L4Be3~q7+(G_GJReE959Pqg z0@rc=x>1E&+CDKytbP8Rd4ozur((uiL6>r31URel=Fc|jPGjm9YFZ#=6V*YjfgXA? zRm6T=pctGP92%Sg{v9bPWcPG}O3m!q%K>fHIEr`6Nz+M1PjfWb#XWMf0ZubT|WX-8M%J_m8>jCgn7*$Bo6cT6x(KQ>a$T<5^z ziUY8PYu0DC z+ypp1s2*88?>D5qz;T{0ko`f87`-&UJ-Z~Ldbk>}HPpXuS}~kb`|O|ACnf1=y0L9N z-#r6y?qv7%Po2SEaS47tksev?BVNZqN4H?`8)8@Y8%woue)wxHARtD{$=L+)=Mi0l z#X?CA*}$C?j-}g%>HrA0mV(IE=MxZm7FQ=j)O*$=4XE^yNZx_B{(v=`^c%Q3jduu9vnpebe*s@V0O|nCAIOp66O=&t7NV{SxEtMukT_vi|u)X!{zAd`kLn# zH$mBs7cdU_O9}1r>3IO+8I{FoCdrz|og@rd0|d!M46wZUnf9Qs}W;qFXb_%@p97U$`o~r>{|OvMQXX(hm6&&@#kE zk3}!Y)}O9HVvjC^Ycxx{j!3Lsms*mIt`8X6AH4jKvU<*J|KHR`y62sfUw>$Vtv}+N z|0y(^SsNMH>lr)#Pjw+t1Huz=*zH^Sd1di6#@Uwu9v*&$b3g&G7mWZP5UzR2w-(d8&Gvk1Y0zhG_5+!^?rX^xOqP`Z9J8#mYHmd2f- zYPSW=mwLUvx%%_rTIAU_v$_8M-nyT>*tlt=nC1rkRlaisNvNj;QkK&gr&YP67YXnR zsR?0md&!QqWYqKb@y|K0U@btS3CMi&hEhxWj3#Bm6XSDKBxKT4gPAU_u7X}g4xj!oG%;~& z>gG(2-uTQ&){z$I($hDmv!5ZbQ+a23nQW#ejaed%K9HJ{#W zwSAk!vHjL06sYCZ{to(dfz@H5W9MUL`f^E-ZvcA5?K;hI)pvzA@^^G|d1+VlE#BadG9`d5Y5n)evDflsgZmiNq8%IE8C^!m>u z?B9RAHoh7@8$K&O3qE^ZN^ebuvvGX%KW=Xw_DzPPqj{LUg@Ys2eiZoCS^$_WYGj?8 zX(OVhhR?_zA|In4praw9^r8e@>NX4IzeQDQY1!9!!tgriAXxZZkdu1mC_A9d8B+?A zs(i^%h$t%ceav8vG7^!?|2pE#yL_T1Nj&Q-W4SB1JVTRXdNpK+Y4{sSY32GUt#3EE zQcM{5mxMvZ5KaV{)AId>2!@a}$u{Yc{9+sAu9w$cZae{gPuJb91=qWFx|lZ)nqAp` zh&y1&;S$Smf6CJH;Y$Z4yEISf=QhDYWQ>Ubr(_i2AH+S89lh#oJ3uQDt*Z6`ho8>; zd%fsWlE0PVfoZ<_{;*&sdd&$iUsSwOyjje5onkQMg=(HW!S;KoDZwn|NUf;*j?qxM zuV0e?v&?B!kUMdt*uiX`6@UW4jjMQnv184Ux)VQj{+i7bvdrF{`teUq^<8Oxo3s7h zV7}SYSKn+xl7aklmQBoM#jJ9_*BUx&U)8nA^H#AID9*y#4qhczl*RcjUFGktzOSwx zZXb#DKQwf!G!`s9GL4f7v3f1w&V7I><8{^j%Bub5eTHc60g04b3_JNXQCFuG$X!q> z{Y(>U>pOfY)2d=8fiV62PgdaAe%Pu&QW5Dv$+~pyD!#9d4v{LBur-!62FuUBY@@nh znXg0Sd-RkGXH~q)!4*YXLE@FWOro{lKA=kM6*(O76G7sB79oA>6`*_BV#G8LQhr|@ zAZElyacEa&`Z%c)liIsY6UNrH-)YsV=o$VOO#x;Zla>;M?oC9i6ocAkPjjo|x-T`g4`ztj zs4nO3B8;*1C_N?i)2*Fp!_=Z7=Wi9ys=)%59jWqgZ$!27L|5Tr`*QBMEuc(wBz4XH#4bJ5v|aq8Q8tP*Y>Ezck(X z#bS$#3RVF-RKhpJC^Ky|ckeXkfF`C!XcVg`RA7#ODq40YsuJRuC8{#ga(}SoW`9n! zcgd%XZnlVhiJI1oHEBUIM})7%uXQ=FdL_7rS|=HtC>Rx$A*{_EIWiL)dw|!x0c*+o zLAwWI_klM66CVVXLAyz`a8rOS%nt=`9%H*AQ-)CgBObyFcL-p^s6fSvZVb}zB!`+x z6L*Y4s)>?8-qPd7rZSC(ZDfLbASbtlW6lpSA^(i}(CctOoBZ8|It}waS^_s#SEN~E z?g@Tcf&|9oX-Vz`tJg$3@MpVkemM_y+zF5~{Dv{O7%mH{@7({EkJjT9hzmYo3XX94 zIqu>?evEz#@fNCXS9Se_U=SLC6OEAZ4X7GS${o>YJB?!zY#`$}8tqBE79|Rn>lE*E z*S;}58!~NjOJ2BP!NRbD0g=Iz)R;6GO*-Wo)^UKP#aWkSRtjNvMQ)B=gvNGI<4?8V zttrI2whW#-J6JQTXD%*gcLtpQjYe6JR#F~ zZ8#QXd3M2-T7(UI7urJF9A<}LS|K@H#9^>X9g>7s&6V4*U&VQrCQch=8+9D#x|kp} z41rh)J~%}YenQNob%!LkR=Ar4a4!{g3wSTGpT%qlrm!B!(PZ8q6}vuhyh$?_*fvy9 z$DY9|a4?q6RLaBgr`yU|*J6Gn1Lg2dOJevUg5EuX9zwrSFbhrod=B{9qto|4z-~g9 zcp@T(sNR*h+O|Eg`};68jd(6p+_;H*)d~pcEw3POAK*I2C{pt1hVruwQov$N>(mt> zc7z2RyD59XJ;`ZD?q&f@;QD0O{Jt(PT=a)fv^2Kzv(9Db0|F#|dRser7_eM0v*U1` znE6dx_b}Z~x68o=EO&YEb9*jbk<__q2xUqE=F%r|Od(WM36D~Ex5^za7zg;vz_(&% z6IRp^Py62au%m?6NOgE!hb*BCBZ~N|m++3we`=cK_4nyN8@4E$*y2(69#p-(Ou6&X z%Oe_$B_1lML~fDgoUz8H20h%%MN@jg8e;>nA6KHGzpTc}B1SGS#>A3~uUVukkG$SJ z4%bS&yNO`C>b={cMyfkOc(A@8YbZ!jQEJRE3*bJRWQaDy%#YgzyeyK;58js^L_&*+ zqBuREL@AKblYOz%_Exy!4uW=S%x)B>3TQvJN(Tn3&-ie%WD~Qty|3W)<3cPC2~%6A z|GX1Q*q&Oqz(h$GD%YMqXuqgZz1<+ z4@fc>mn;l@i6uP^yNDnk10o0+a+k35VT=IAxiF1`TFBl;ffn^kv|6XRY~SCNpXWvm zEiybJ+T4atoT zy0kp!f2+6rH*h7-e7~7F3W!TV+Hr#k;tSXO^n9m0pvNfmhFUM)09;7F7YBSg;PAZ= z*auPlZD1N288cCeT%=_i<}=~u`ssL_YjvBtVHV0mK()8{k4fcL*f_(-+@r zfncidS4=^UrooG7sx&@}6+~321^!TIGTS~cM*3X@{jwjIR8v`-WHnoQ_h;GA zZ^Ifbw{iMKhA`l4c;f_+E~BPjl{#a?VYnZP1Hw)9o-9NU2DzE2*Ko)ZYZ_LIZvn&k zVD+)I8qi0@{_ClsDQj;0woXOMrchl-vMhdWNk5g(wzDo=yy*a zEJ^2N7AH@aJ0qU6c7 z6#b|Di%vaqtPEvuBc$d$yDv0C!x zDU(#^@*Dkd(5MmRTba5Bda(-Wo#m)?)n@1P&8m4rE^t>lRwzlEf^{gfyS4> z5&1(z^Jp>Q+p#kj$EWPoJjENO`Y1jA3XJJk?o4Q!_xNK&Fxto4+OI(>rU^`BJs{u8 zujCu)T7w_1>sp+_6l~IBABM}yPVELPui$OEv9g8|5YwdyAtb;Ye5H z1qO&V^LQfP_IpM(t77y$0HC!s?)12NxajC^hR#Zi3wcxQ+eykP!nDc^rBs!-kA@d8o<^gl}2{wMgDJ5Bcg_R7IaiuU@O^IkAKDN ze_-7I+h&OP@0jinjn+)h@_*U5^nShe6#U$~{&NxjKc3-p{ILf&{U32=t7tmtK3Z6y zXZ{d8#9iPSet#l$a#-;|!CnaJA#iC)d?D!Q{2c&JaJ_Iq@Gyfs5r~ zHW!~buVd0KL6sl!0cJY|heZj)d2?fMN8cHpryr(kK~_KNtzRHt0AXNsLAiLhXnY<2 zW_fZsZZG+9>v>*8u6Wj315I;rJS(yW*<@l) zb6+3~Sa}V2x!B+UsrD0d%V>BO1q?RlR~+UF05H6OHvmt>y(m6$HAJ(kRtMuNi=(aV z?yhVASIFf7_#_Nd-9o;0jIgS+meLU_U<>diryoqRx8~IKdY=>X`IUoYQdnA6lGyGF zh#rb$s;Z9~23X+GG`rUodyF;o9tCny`TZ~7x&%R6#`Rz*Dk6#Rh$prvyV^-1UNR_W zIMTNV>+vCHhHO!sf)r#?GO`+JTWuSQvrvQAgbbU|1!1mau^s(cxMzkiJ0{jor@H=l zACW4ux~WD>@H-^M*kB?jTC4v8MV}oDGX0sMTAG?`&IC63ig3DK>ek7ZTfRr11K*=q z@*I0KYQ-lZ+-lard}#{(N_|cLj%om#z&)T%+3tqatIJhucX_tGT1kvW<&)gC{U6LQ5|g9i#wq2_8L zxBqns$r8`R7XknJ)%nAd`;kHV*G}F4nJE7~O)`}vekvk}U&P)KRv`L)40eBK&}pT6 zI02!c#6s^)0r9Nu{tz|HgmQt!vo={oyEPWh1hVvqoohO;?bXF7DuTE~1GbRqHBnNBsl^-; zVX>)cFU2m)&B!h2N*>%Ro3WZCjVr79e^+ESXYxU1t?Z&fZSC?e&CRfz9aol)-DN1H zF(2D&nx#`3PHaS|)frt;yJw~|)2)#}6b24x8kvnc!;cpk%#tOGs;_!Oz3WHf9NPy@ z$m5eaPfVzO#?hxVN+=K2LbyR?Ry!DXtpwnoZcx#;Gw0$l>LZ~|W~kk@D2{SG)iD_) zTis!d9YaKs^&GS~*w1zt5!)MkhL%KnH~e;R`B?(zXBj&T+rbK&qh$11IQQqX1RHti6^u?D9bln-B!Z`s3F?b~c8FS*deHelo^ zI6+3|1w!6pw8MOb+7j-;&dqWI+{I`Ma*f^+js06E)D8Ct&z?CWgRWQ=p}l@JiOpOx4-3Y^Q)?P(N4jba|~>Z=HRvur4m2fF&-zbQc2Mv8-Y& z_O5W_@ov18rHIiRH?7NxBQ;&oF~M|}TwPI&Ry{r^D9OT7Xm|*p$T2seQK?o^$V7+T z$;~|@v?`*gm@QLWOMZS9FZFFwe|GGC05h~Q@m@W!y?tZ*;5y9Sz-MdH!!_F;#jW0E zH=VzLt7p}$!4?Q;Z#uU!?+|U6id7V255qJtiWb_=Q1KJCU#|<8;7UJYR>4!?R>^g5 zlj3GcuBk_$9Yec;AOt$Fq5kX=f3yUHYXE+N-~nZV4`m)Fx}tA+;*9F$L}U1Fx#oj4 z3@A3Lbk(jg@76}y$aBs}Q{-B^_{d+7rvcBsdi)__+|kdbR4!VCU1iq>M1uAt1@OGA zZL!BOxhz6@AIrU3rp-nw&zg8H9pRDgWFjckeLE#2IdVPoSxc&6PzCl6=vDA<9=>O8 z-{pG<6)y5(9XCiO()`KE<>}$zq#HJ~c{RwE95)c~Nm0%_)b#QZm@HWa`nUJ5d?cXk z#hG%X%wlb7#tVT0Ww`)LP%z3?=NzKK{Z5pEg}&w^bt!6fmS-KvDk=F$lR5leKHn@PBFx? zN2irB6IO98BA=dOX)qX1Mbkv+hIstdZ7h5->XP@aoSHi@BSbFKNUGO1EACE8rxBY_ z4ORx#>rK_VBL5#{@BH2Awsj9y#kQSPY&#X(wrv|#u|KhGr()Z-ZQD-gzVEqx$35Mr zzoUP6{(wEk+RvJMt~uvgmBHE|Z8d7s9H27Ov|DoLfp?}_wju*RGfSqNx>z&`&$icpZaApb7 z!T0AASqd~nfki9-F#bliNegu=F_OkxEEH&B!TQ)-}upvmmXkNui(+YqI+~ol~O^BAqDfojKR{uii zU!C{j#6BCgQx%s1ra!amo1d|qh@^#gLp<|#c~F<-z(7=xKAVPNrE44tkrwkaYh_|a zsXvYEEkbchggPHf^g0{2P;j1YJ5|l~>Kis(;TC&w&czlX9s~6WRp#Dx*C{zKa<2)> zh|dpkrJb#67tdUMWal7~mqOQT>C5;cLLPY!^pOiiFjG1}uaW4@H9HQI5?M@Zw>Y^1 zQY&ZIelK_E2Cq1EmVL@`@o4>v{i(%dQvC8j;%469$L6S#IB!_<*eO3KBLM3~W%v^B z&Slu8#n!WR9@PRYE!AHc-D&3z3a!vS@(iXrihKsj%mx62F`(eu83xyM?w{UV)#XvU%;4)crTg0i>$=3QC>;n)2!2eB!Q%G$U4Dc);%q4-otl9{8Vf`Cmv- zpscNk{526~#kWFImChrNep)VOfRMMer1C)wk$?`3g+SGGjw`Q1aG5pwv7#~1*(Gh- zc8bfCp+kU9KRe;%vHFp-;bf6j+Zu%7m(h^IarwOT=)G~+hELY{c|S|{ZNiWv1ky+_ zgov!qn(zXG0aJkPMgYaHDV&0^Fz`t$#FHPVM=GT3m9YatAHD-c1itS?|65c*1{NQ~ zZ-sBh_Ah*1i$>gNStiC~!&Am%l5ztuf@P6Pa~|4dl1DA&*e%Y=er)z05`MOQ)RssO zfYYEvYihK54SpIGHzZ6pNeg3%ierOIyq9v042){~TGlj5Rx~sxs`_FLtOUvur`{SV z!w`*72J96Nm4ZlSQbOiZWlN3FRAb2YIN079^m>Z+N@V9HdMU|zr&)p<-)r~#(A3i6 z0V|8qpk$s&^5lX*B@MCb z4C)^s`wDC(qRu+1ef&K!eXS8zol(|LORe3&i7Aa1eTh|BLJbC|>2TEzM%4651!3k^ zrmZ~n=q_?Yr{T(lGaW4u3u#jT#yjTlOTC4{2i8F?`^@Vtd-B`5eC2bfm~Oq`86aAWEi7pR$j+uUmK z6LFI6Sj8M5jY%f4#vi&$evO7Q>D|FuqfT`iq$ftS=2|jeYEtD2j zQ7ljT6?p3nZ@TbppW))CUoaKH7Z$IBoTRGcVVA+&fjRSo0ljoAVD|{w1<^B14_F*% zl90|>O^C4RSp`(#`#7yafaB1h^OwsI^5@S!(3)q79l1_VHo-Jby>eZh5_(($j)40R z)ck2@876cl92l`y1ODKiVMGE}^+a*&Nt4eMP|Hvz6k3^%9anMgXJb0oRyQwltsMC~WQ4*f|znux5-g88*WcsLGB)pU*jPPHPVNqz=*}+EEwzAMmbz$K%Dw z#T-+_+!@9u@89x7!JyfNm!$H+#uYazDRyAKa^E^cD)~LlRTLi7Pe{~Izdl9&0==j| zv7v!|i{N==t!8Tuy#m_^7b16?^`=7%Inxc~ouQF|m$Ta1QmM;e)U=?e^-W|nOvfJ) z>qNsH&JQ0eGLEnt?L?ZI)SYf!u)+p^eSQcg=cfM1*Lsb&yd+!gaM{%h zukP%BI{0Mh5U%(%81qBfCuE?*Lo1xZZye?9s}&@2-tPL_%k5+%AgJxDsayTOC3^hT z*ah`1{}Quhd?ox4DI@T(b-`>!8xs!uL`RmBstdTdGW%2@|?4BMjkcfGW8s=oZVE|Rgsr@u90*QI$sY_ zYqkooY)UjlzEC(Xxz5OGgn8BK93dP_YrYP9)#(RXR8RLHLKs$-tcfbz#+nlim5>#U z(Z4+`)U;KHt<@y#q&d!6Q0#aeYGV%JcuhBG^;P5V6k2D&LVp$U?9+9XFqv~cu@NnW zZjP)r57x11op!L2&@J5kBye{gxHc=+#%e*Jc5r)`vufG{sCL*UTZ^}Z$qrX?wafH+ zS=sM0&|XK^D&d$H8%p=Wme;81S5FuS_A>mOwey<puzSS|j%TuDr6$(Z3`+Lsi>c7;as3k}}uqmb`GSO`H|6*nGiEPEyp!(aw9hpWIv)Pe zZdC-=olyj80Pz5vutRz5Bn$!+5iw%7b7&QF#0`R)C#JeU3sr?`zUY=Ry!ZU+6_mH5 z#4qT84t8YkNO}y*_0u|uNd(!1NosfmIKTCrd{oFp+@NQ@(nU(k$LPGHV`*C{l$Cse z7`+^4i59lnsTFAGY00hXyirJBu@3ls^v(#PjF+VyqK}=6*I~`PeKJ%TTd-SvY3(=Q z9kb+LdljTH;*`9EiIZh0nmlcu)XCC=> z{ZmK6oH!&^2>-UkQjll(#d+pc>>Z2X%q@a`oh+h*@#l7r=PH=kXJDY-$1(BtFww96 zLMu;(WSo?>2B`zpw@>0-+?T-N+Yq12k*CLxzhwzn?BcWJe%*VEuXwM20`!9V&Q?Ya z|95<~vgTKs55k9xSIpUnjooa1^HlPTpP?BnO?`&&JaHs7 z!yVfdwA+?%QQMWATb1buOfM5J)Dll3@;31~47};&^87{P=5p=f(Vxz&&+l8L9TVAM zToP_-=z(_ri^XAc{fkMd7F};Mts4p#mLqB^rXdf+7_ZH1O4I zyGZ-qw(KXLZg*E6+hVq|szbG`GMqJRYnF=+7+qD&BR74$D0Gb3);1gcMtl*I_l#7r zM9f^h7fYb>CB|EX;4?jN7FdA%lNUg1Mhg$qaKnzF#%zLQ^l+1{%S;h{#_iX-AgEWu zyXrpro+gTyf@)Pc0EA~o;sQk#8y04(4*0qXpc=l@%eqW$AteU)DsXLECBLznD!Lle zd3;M|6kwdqDrVG&kln@VxEfC7>|)+@YI@5|o63d5jaTfQxpxOHkZX~nIa+VL2k-V| zP`QcP_k(-}wd#{SY~l~VL@Af%rg{>C+^uSxdU7ka89ETu+z_RGQ?Az+1V=AYe+p8Y zH31sUW^1^Z@`Y;dl;yjk~t!S8Qa#SxR>_lQWvL z)yft3Y>tgKIg4zAtdg9BYr9iTYosBXccajbf(FHSp_JN1kN_DhafGXX;-0U<*w^Q~ic{2@A+ScISy zay=%bJWh)+LYs%S!tT7X){jfJ{C8Gr5+`nn zgc!)a63AlZJPYPri@j0r{F$$Nibs_46o}84LPFD-XmCFyin&o3(-YtlwL#JWfvATo z(6WzlRm60)5xKqp5$-CpGp!wZ<&(|lQuYpKY|2-(AbKEL9C$`pIsJn3r(SRj@0ZMd z4AtH%`{p3=a1T}Qek}uBqalt31DvB+9ZK8n?*ZO9H37l~0gHAx3{nT%}}fg zLx%GG-x8JbtH!#wjt${t*~{(RO1CgCD=5{F#X20g$<|PgX3+p3JD{Bg&}+0DneDo~ zbgSJt>MrKSO?#S!o?^%R`I8%rZQ&fX*tpai{$A`^>%`K8kU>1 ztsTxLR*q{-G@ky#il}5&6;szdzGu>U3UgsICQsE8FS+E|7fZ?`r1N22eXT9%oQDrF zijG6uiHFZQ!+m>O+NnC4ZV!!@QXw$SAJQ&p|GE>X?g9g zDXZat%A9@c`U9TWet0!pIy1vqMBx@QAh|aq_G5Hg1?v=JTRx~4C3usP1P(ZR9vjhYo2UCFQ#CQl(i7adMkrPWKh{;M*taK%@c?9xo zK>B(d)m@_qpf+X~&9g&t+_CTHW*iSXM@CpW+VLn0<%>~+uMycY5ebcWO^T#ioK$G} zjajOTA&=Cg4)RD`^bAFvgt#S7pu;be+%ha@Q(=`M*IeI^OEGT?N|ODTm-|=xy8cgr zcw3=o$af$MQ-@L-j_Jg=tzWVDNGH0n*C8A16=rv|Vr?IP3l%wK1jV)ZYG*Y6Uoh5I z-|DXkgp#G=zXny%)`EiZ!8am8!Vto+9r((1-(w`cgZ4cJ%Q0e5h!^DpKB(>mPmdyY zO@GDjwja+d)XigZ&91k$9%g!8thYWtpPssYOS<9&Xo{6$bXlW%H}&@7&|TixMFpc= zrcfSKcli&GzCxiXo1wk|HzaaKA3PJbQrFgxsfct#8LFU`L-yHlRqjqg)}7930>!x7 z4x$~6uvfNgtZg-%uBsaBz)GmGzH6rC^MnUc3_`C@mW2I{@r!=J)1LjjIDC*I2%$ z@e2UIIEBZ@`wL11Us^wb4z8oJ%Uq?NjL-&89&jf`=l!Y)Jms3+d6HWL3Y87=FSqWj zul;FV_PA+!?j^?!8fDhLjS8*qIlX-v=@^NN3{+W-+9yZ19=q$z4*}&`i~&iovsh7zcPrpsys&$Cu zr?P9KWYMt(eSs5eAz98f+|1^o+l46M)DTd$b%o@avu|fku%o7SsFvANQzrIi$BL!i zeS*IWd{4rTJCnH%7JtE>;gxWB>7BUdJT%L=RTg-UV&YMpLPlzm`NaPIabWx3W5T4g zHEsW|melYS|3mr@w4k7^p{@Sc{@Sk~tG~v|2}*x;riBVCG}dl(K9KmELIF@vc?68S zqa7WXT@tW2yG54r^18xP0>Te`-f&35|K*V#!;SpO`|^1v-DM`-FWL_`R{u3v21*v< z1pK@kjPCNsaEAxQjn08$Bp-{W@3oK6Q!?TSi+NO=`o7JBXd*Sx6j21jWO3bf6Da}s zrJ!vqN;6-kJgWNGWb1*}IA3Sk^wvI(+c`|55lkv*M%7FI^!O5cj-~7@zJzKc=P;VC zuL;F3hepjn6<2{T?XUcc3n?UsyrkVsaS8cjw5r(K+?Z!+3PtrOLi;ccxHBEAPZhUs*}gLt?7hGSTPxs!khDN+s%c5S$3leAl~7>54M?@2Pf zBHo=%1WqK`CyZF7C!k|(zC58Hu$0J=tY*;i9NA;F^mv6{tS)E+6ZVafi%M8XD05)JWZtb z@zCqHDUgI(S+JQ|)pqY*{3Y;_-f7M(VG%R&mND z?XQ3TzPAq7j0-_%S#YyAuh9F>$5h}v%AgDW4mfV##ZBuN(qBD~f{Bdnn1pW@QRW%H z;u$?w9z{krc4{0w*OuWs;U$W}*behGSOye}4d&#Jpxgeu00_ zujN$#q*3}$ZT^LfR4f&dO;LPU8>MGZ$v60NbNg6@hy^t39j5JO&Av$@Sk~9483hJL z=MV2xR499PF6#IIGo7RF2_~DHru$sjI&gY#tdoQi4o!`nE#G!{PB>1uPq@3@PImtK z2|5+N>GicClb6#@IHWPK=|mKI192x6VKLBcF&JS3c_#?r^7RTziMKxAEftCAJUA$A zr@MSA_GcIep%dXjpc=vzCT2KejZa+|0qzha&1FCMj?Pssc^6Fe5Tv#E01alN@mh?% zsvpv*Nqvu<2n||&ZiFWiR*+*!x(7v`No0VJY~0rIVr>fp`Ik2{J!T7QqM&&dW3hIn zZ^l4@N~&xa#x-@fIX*Q-9=b(sHI3F#hEBpP>JX|nW^bm)&qfGMSujtYR3UUubX0CE zfbHVon5>`pNwm(3Uviq0Cdb)=!tyA5B|>K|6ldJTG05VmnR@!M?{HqzB7mr?nVuL&^=ajfIR)X%X9}L(E=@vUs_kh z>Ig(p;hzOhMvh6WrgQxExS5*+h>@r0Qz4s@=$Qd0eoaG?1e><5zy>ar8t-H>6j;tC2&iEnKXoIsmftQLM(QBdCX6Zs61EQh^NrTOZQ8F3W z33impO%>QB9GU$D-F|3lcI^#Y&=!tbyQhj1s533%bin=PaaN!%fn$w39pmuX&J$$f zqVjCamWN{RUQ&~K2}N8C?(Q$#d0Lp#QjQ!99LBVwc?QSwx9&8f=r7e%13#Lt<5zB% zR1IzMd&bZ0LpEFB*b({=eNwOqLgPf1`{yAqB-=cD%c2*y+yvHr4dZ<_d`*UyLTxO< zjDsNnx3u&gTg(h#<`h;u+YK!2mWV4`B3(jDhU&`@0;m0!LLTc{?fMsDV?zSG=6Qo| zt~a#7t3Z}^^F83lPJIEkjbkHMHL!Gbif(ZW_rMtqB^b4%SHX*0aQHOcilOs*2Ekhb zWL|eA@w;?`w|VgIeMrf`tOv>~5R(IpCQW4^%|L5XVseg%Gor;{e#&9y)c$NMTLRd9 zn6;K(w@dnH=d>Va8{l2lq;We)89$wlI(yrVef zCvHg@y$Ez{>E|+JjlrYkG^?m^VN;o}z-4l32Y`!B=?*;s_Hz`VHqOLpjA(oq>RxQK zo1YjE;CM+>SNZ8<`Tz{OOrG%RPa<&VbV#YHq$GAENJcJg;VHe8Z2mNY6qO%mt-Vr9 z;EPNF#KD98qIp);2~K~ONg3`*m=mY!6fS}X*E$tkcb=7N-m_MO2dz8Q@4u4im&;eA zCMeg8PjTCN+B_1gxweq{*+ABINWr%9jzrRBQ>cH7)9=vovuj;uUO+>7hPIqtsm==kM;s(Q4o zn`=1OZK>EMTY1Q87=`={Tqv_#5>0ME0vdm%D7V2k`)PK3J}1epguN}V98iUtLqYi= zw1i0H5@aKQQ|bJm%+XqwPB(q>$-YbD7(pyG&8WX3yQ_RV#W|LkJuKOxIpyAP&->qq z2kQyZDD?~J%zS-6{t@w5**g43?aFm;yZ93f4D1J(jSHBJ3mB~k7~pOW>F_Q6jYtH{ z9#%T*E!XKif9C9L49PobM5!u(MNXbUD<%L;g(X!#0!FL*xj=Zh#3qHKBm%}u@47EP zU8%jiuSQ4&Or6-eIh3SCI3<+h#ZEW^28h7;g(KAc_~k=fy=0igDgq_~Mhb?YtFLFM zYpkoM>s!7$=F)GX2$(YhdoZ|f|9!Mna)h3-FXrIkiwGzD$D>(W>)ROpn>>(o#1cjL z07G-B*Aa&D&=_KsAU5Ss6t^05*P}usSS990$r-9n7p18xC6*bKTrjra~j)%L&w(2Zyq{I z7Dx=2Ms;;IYZ@GXY)+iLBH?|O5Y!Rm7mU%oyuFPLqw%?`53@!!4!WWlbbfOV%EsI@ zmSfZzH%T7is?#(fH=|~dk{~R`F(i-xtcsD9=wA*?b4%%M@ zDJ5gl$@Y{*d?>zP>}D;P`+s zFxsKaL#`&R-m%f}{!@tI5yZX!_C%;dG}2_s>(5yuj%$|wN(B7eOl{%OiPD*z#eB;l z(k=;5dvnsLDS^&mX2FU=@3ch1pvyd2ZO60ayiM3f=~K{y@t@h!6<1sx0AZfiK7i5% zmb)v=mxJ2TJ|=urs}I&IJQ(cZDn#F=snBV#Wbq6Qd;*)fdlA+v__E{&12AMchnH~xr!P8@$>O=-?XQA!k3^Cjy>d{rBw-2H5}0821{#QCpQOnU5n#TirzmtN6-5* zwa4{lGcWH3$yf{&N`i$-x*?Dkk zVkoGmJu`AD$7k@jaVqB2Vh_z-k-yJ;qq#;`L-#e!2e0B&C`yn_;Lgp*cpcaCJxS4Zq}2?^c%8tbiY;?~o_Nz}<1yM;~M=1UhY^<9}d9}+$i9XyLapM1aQAM(6! z6;cud_)ReDiT&m6zaOf?tA)^C7$$^akWhZTA!zJn{0JaIUgH$s!MOa1OUc3`ce27) z62BTnY16jzgFnXo37hg~Ag0}0!CtOejpuM2IlvtLj_mS}d_OG}^4HQCJ8rNmSZ#6*&agh<`|iS_y| z!!>(+_*N|C+F#!VG{9sW)b9CbB9o`pwE!Of^98(%Q-?UZ`v>amlS)4^>yp>t>gBT0 z^4=5m9|Pp5n_I7GHomql^8vKt6zb^;LW;vOO)ZaEsPz(g zvMuK?m0PfPO+vx3y!q*}aQE5*&2FzaIF~tCwP0NkRcv$k6g|*Z-v$SHsx5xWjB{-s zD^kAeLQ!igGuIbpa88b|IkzdaYdC9Rg=gFNUgIrFyiZ9gplJ(z$ zCVquH?-=;z&c}U^mmBKqx(BZZD3_qJgM|`ai?$EwH?vq@o2tMh$>zTl1xHzN@G)KmR07eE>5~_!C@ywWPqX{_b*__H`vCmL~WufP0o#`T%Uc;b)jR+RD zaSqXf5SnSsD;pvu{pdGh_bF-}ilP3MZsesgASyng#LhmAh;t5c(0Kj{vWxv9dbIcR z9slVm`15Z@l~jJmY4)$1>-g2g|A|->GIsh}Lt*Qnpl|-y7@$B=QWjYrgQpR`5Js2^ zUKkwID=}9^?%EeVyP{AW6*vGCo2ibCUBM(ZrDQttny$&|a3T`g{(C6&?h5ao438^k zJlLw96T_zW7{{UK#wBm37btz802?VoK_0kjLUZAmvvHxb({2zW+x&H6(CP_&-Zmhp z6-e8adiCZKQfPLU3aC0=F$O4DGLZ&-*)v8k2eOA?B#KgJZiN+a@&hUe26q#My zVeS4*!`ra;rZ%mR4zkqbb|%Sq(;i*Aj8o961%v%ccYX*(_&X1sWhFJTE+Tt}TBEn6 zVx?N9@Hxk-i`Q%;PTGs8 z0S4K{b7dg4#(f_9g2NI7^&Dm24U$c2TW&^6eOM>i7ilr-_EI&21mnU#4)fKJ9BFu; zX;2xb->BN|3bbQTL2pC2mcKW?cE+`?kKK%=SAFk!IBBVRNUy%qplhQZ)sS?ot@WGlzYyF|cgP>Z6Vz_OKU7`EDGPfGKVOcPqXZExQ9W04f4s>eo{MIsiuv z99)S@Y9_RvAUX4ZlT@%INnhk~y>y*)QlGl(;FIbOb=P>z%auV#jqWfC9WIN07)J8l zTKnZ$&w?E?9eaG0XK)4wE#g}Ho{wM{J!NktT(BG#I6lTr2+uBo4HUU^lGkPbFSN zk*1=b)1)1SO86(mHgbaIu)#5C%_7Yfn1*iP)$ay*#F3x|d9Z4VQqY3Rt#RzaPOsUb zA9l?AqSx<$0r3$hCnKCAvv_^h(p&m7U0oAw?UKGzr5&ESCGfsne0OYEFBi}dNgC}l z==Y2RbWviKvJodRQ$hJOA=JVchK-!YoVNquJH5x<`&DZ*P3e0Pk+`!(B}x1U6A`dH z9#Q>$ON1Cu*u!58`4Fmz8aW#(N1l{sDOf|e#2q=WinUIW%!Qvg19Ryfy@b5jH@h$@ zo3b)>(YrKzW1rDvAHiNR#lHw^Gx#FdlAeu$-xB_&Aj7#RpuYH$hJX9IfByuah0JY@ zjQ`E&dn>Gd*~Acd(w4q#Vke0Lf2IVqQ|(GXk=lMoOQaPeHjA-awU16;lt(rePV*>NwejSn?Pr=??s~Oo4#Mzy7s4VU2_sMaZGbGaqQW(Uv8;~!a zh{CMsFlP5IH-zNb_@D`yXMxAM9IT2D?IX$t?)+jieTxV-ELE~=LH6G#bH@^q&Y7t2 z=0A3kdFCiek7SP@7V7JjiI0r+{l3_h82P%?U=Q06iFLw?w?)_+26asw6|BQ{eQP&| z5`)7$!z^yitzZ*{dX_y=CGqF(qiu$3S6zrLUPpe(yGO5ahh5^4I7=!Q(w|9s4O%9T z-cYTBG4sOyxcn&FwZuQck=8N6sa=KFT=)FhZ)Iia{uRdZ^N}&uiNJt1d@_4;`h7$H z^LK6(Hl@bp!^Q)AI&3OPIH^B}WU2LtUnr&)8IR-{@QBg(aa%of-f}u}ZHQq}b$37_Raq4F4yH^*_b( z*IP^3`b!s%;*)4qBd&!ie@zl%9?Akj64sDQK!ZT8M7%&?;jJC}mF7k&jfT3qGI0m) z^ah{0|FQg5s$*>F~088YV=zeZdQ8o{v5|GF2;3c%4IIff@V|pxVB<~1j{^S z{P;AeR2*!J5X3Y}<%3zr(eQ9Ul1>eG znnb_T0O8!XgxEN!Wlf4%p|m-K@umH+j3NX6-k8(T%0ueqTA6vmqpH(H?omexTHn+Hm*bU=l(L4LT}@WS^LK~mhv)kHfSOUuEj{&?yxVW6!<$=akr3ZGbg}b9vB4L?UgLVgcQJiL)o2Bk637*-^e|sT=G=8g_on{UL9RkS*Yeu@*cTqG5UZ7DPD= z!8w$5Im(70KBk_ZAk&2iE2kPi{l*lI2xlnjIV)V4?_Q3~v$nxJCRyL$klMXP@0j`! z%4>hliUYm_L?{=k!P+s)<3t8g)!Hf-zA<@~GM@HwSlG(GyrGHmIH6d%IK_$#S&3T#3+PFdz$o<;G zbPV};-|zoSzF;#=tIN)ToCgmv4yh_BEcD!01_iElZdsMu7?E|=?aj}Z7KBxifp%FKmVAG$at`WC%vX=$N zhO5UNR#cZIVRKdK!zu6WZR^SAWiBBB+#I&Lb86bEv*w<`0ymK^)i&$l+<(u$e3`v& zn7wJ(EnVYtFqwvEytw*^#)@+KGa{-&%h89oz^G#T^KXP0Oiz_y{#QG{{Q5}#fe;fi zclh6xZvR%)ct=)4_0XdTUzXL^J0tS)ExIslosiCm+aavYA_%N3@kzh4gY$MpA;s|@ z?_po~_cpIBzFvb=^>Yg+5|L5c&M0dg$>2KC1>7Vw-oM2${GQEtS}C%R&S| zZ09D^^TRyx3hzJ?!s68a&7wr~n}Oo_3%1aF!4~@e^Dza#b`t4-MF=|l8^wHOMB2{M zqwv_ok-}n98CJoAVN)BPV}$ehp(D&3X)sjaBT=mOX09WJqdFJU|dH#C-n&kKmew$0JPXW`II%&8y=Qu1dEp=_Cs#Jfx#~S(+ z23zM!B!9bjT-TEl)8pNW8?9t9i4wEbhIo?5rg@N67B$nO+s=c$0ES6j0>hx5O88vL`6Kb;-#dvND{~g0{gfN?*O`DRxk>GtZA2 zheeneJd#*GG~623MYk8u0!Gux{PVEjT`^Ncsp{@iDfsbs_j=TDndHwDA>^PDrJ_~d z9GIY!Pdrg&9fQ=YZ}rC*21f`tmofF@<41Ind|DY28%* z#{?NB02Y6g)K^}+@QiZ^|`20o~7h&CnRkR`PFC9P*R5jG0BtU^`BeAMWU}-#{f7JFWn0=RQ z4|wcfg0#-3V4T529(5oPa@^oyPuf@RuYI(a9B=oRU%OE;x@?dtFwk#fk|7!5AnWug zL(RvCr~T9!@X4Cek>gNrLz87;$H?S^K?%QndK3UtzYi(2Q3JGn&55osD_*uLi>*N4 zNz}3OLym$HzxK|{Gpad2Qzmu0=$dsIzg=|I2?cASe>TBjqj3cTSotz6H!j zBiS6yrfKDP<^`_4DI@)v@Dk;|8`Evrd4iXGKSNy=sm(EA^rt+-v~R1yi~%)6J84H( zsxO_iSKuFMFMnId2}WYR5&K2Mg&3W8m($h+#Amucl!w&57uAPCN8EJ4`M-x_7_ASbF57Iw0EMvdPY)&$T^X^c@4E`U8A;1rZR zvQ^>l0X;textWFS#T$-(sTTL7rEI!o8`7}TH9carI6rV;%i4EAVl1j#iJdK~D;dj) zOagL7%E6;TJ2;OvBmo{r@kFq9MObhRZM|ZF@dR!-C*Ak<^{$kDtmM0LnlcDh~$0p4clMiLdLy@=3RkT z81{*-I9nvrlDM5sCBN$1m;WG!i;CX6g#8%nl@PJM1C@$p7-vd1Hc|J;G$o##V42Xv zFpS_3Gm;QZ{FWzCB1YT;+u@Bv9jcFF@r_KQ^x5+8>6)=qUjT14It%idA;_*ZHJx1)kn!V} z*xV;!Eo^=(ibx2~{1Zc6-WzM(usBQK-}8@YkW`^DzeG#MU;XZ%+q$Ejv5n(@nw)p+ zroxv{cA(RGmXzi@Q7(aB1yZ&$q2EX(fJtoCxB3@`;t?pD&1?oMGqF_c&JXvB33kBl z)wd46%N;jX_C#o7(pT@-(M%rChsh}2P1-M;mpdMGQ(7+wn&X^itedPbzkvLRHwAn? zwIqXbd9j+I8pHXc%^3{V+Zaqw$1*N#u#J^VdlzQvpMr&^9~cUQuP`f;gO1*8KK;?O z2~imF>)E3Iv(Ag?|sQ#?2Ec1~7;gM>5EoX^H$2LgN@SfWsU! z#4Ovhyzz~*H3Ub!p@h?mYrKYobH`#*(qW}=z-ALyoHHpw&2d#)6WGO{i5GCRCA)U4 z!^+-*JEpAXHclf5&Upv>?BSdtZ7jfkGl~8WelUk`W2Tx88HPY)|8kPK%QGJbn$+o=DDVuzkR@YwN z)CV!_a$%`5nM`4NT|Ip5s5RaC)A{QYxJ%j!)E*yRfITvp5N11uPl5I;%p6pKKb@a5 z0On_0D>TqD0Ua;88j2c{8rl$Kx!6*vFH24(_7L`x9E2(EVCi_$xW{@a6^M!TpbI{^ zljtBDs@H8oY{68g5toY1p>ubsb#fr1DOeJvaBZ9Uf>rYasrQ9s8kV7C!iq|6Rc*U< zYv^L3WsH(c{+Y+T!-kfGYp6Eg8bh*s@ zd-Vv8k_usbO=-lz2uYyhDHp)9vw`)zWt=(=plC0RXi{jJsFSjp5?XU?MWVql$Nehf zH>v~6SvzZeN&b|#%#k5F>?D1_Fj%l!X11cY?x6nr+^Rq$;YFv4IB=uQ60PxTX0o`r zweVeaTfph<$>k}0Kdd)f@)BwFLa+^(tX9#nIMGQWczKbN(gQSk|2b?o^)77c2ksHL zw^+4oeg;uRJv3FI>fDYK`McnB>4`VvRr2CjzEp*ov6Z=)E>i_0Buf?M0CGgIJ(|3) zqrQ}$lt>b&0nlQvTNoXT7v=zy7wW*G8{Poh6DtgIQV%%<3aA87Vi&ZpW>cQs$C3=x zaYN7i=aR(Br&{w6EbE{7Soh^gt^V;#rLqL9_vN#Q9y#n^({v?PJ}eodMT@AFLN}YM zHrFKUD1;m{1fq4eMADn&PCUE*Ol!;PP$C5?HMrATife_Xo?IjBSj)4Sf&aMhrP#GxKk~UY}-$-@s_E1D&vLjss)Qf56?I(6+Dxc^I_H zy&k8dom+y%o?)+f8l%YTp;M#jz`e1bLjrA)Bnb`$x1e zN5b7BfjF3!Y5Sb(U)p9ndb|nzLFDD~CZ-z9;Np}3OM_v7z*y7kE;!N(94hC)uziu2EP@;DjRVXj-DUQ)$6)cD zB_w@fm)!dPkUjFaV$hIP{GxYUz*zH!;$*k8&{N2ut8g(z#+a+I_G{)_Q@?B|#)CW>CxxriVB&75cFV%i|B| zntRB3ki?5R>8gD@u!P5lb9x}CVi+xgp8g{==Y`W&??3*%-jURZy3zxbwQ2xmEzbY( zD*iR(DQf^UwE(yY(JE0@%3f-LIP)4>0+_NDNF^_vsjq5CiEEC8sxGnNyy1Q+^B|7Z zxnoeOH0PG1`>WHK6UwiB}pAu9j^K2UzX!-y^NY~TH)7uj_VCGwy#P#{Q!~D&{ z^Rp4>Kh{T$<@i#a0+{Od50dHUg4lN)gesn4r+im>J8CoN8TQHjg5taU+3+y*YT~ zGBOt@UoyGEw@Hz`OlK!L`_>el8Uwp0yg^xD@v!$^488J z=#&&#>mJ$-c7og$B25-996cw4cwB@i31K+k*M%}JnX^T21mD`Ju;R-~5kyc0mY?)X z-5&WFij688BE(j>^vh0H`IwL4k|EQ~ez}MY2XrwFSxVfT2PVXxD=;b)h-Katd8;$N zJzO*_SskQ$gL~u!Q{>ASMm$({NQ^j`s}t&mj^3sYg`^gz23RfVj0btGO-aYf8QP(R z8FPuBOvH(112U3)AaxJ*!(0&hzF-D^eN3>|r%a)#>D_VtIZG2^aeb#624BkQOjEGm z1I@i>n{nW*JgmTpv5S9$&rgxDIChM6>js-8s4(1+x5cc4c-k+4qsLzhV5{1JxuS5z z#T{uW&I#}a!G)lw9q_7wbWt{`FE246Y3!(pCS!|?r}Cz7%j%p-lq`(%hv4ZO{xQSU zAI5^NAO+DjQ@MlaS+>LIS+(P9`xywQ196)OXJZia(I!_laQ_`#idGz@Ty1`^-n<-r zsURuHRKDE^leG`dED^3k8q}i2d4W2N$1sI(P;+X;;m0^gTutK;nAnOVeX8UGR3vHK zsGc+==ZJBy*;!rj@K$^NQUkN~#&4=GS$nocR_|I9B4T%ZH{bNEsj$fV0pngTbyv{t%d2Q=uz$gIRq>vAs`g;-^ZK+sfjRO#Wu&d-R!QLVqK|- zHr7%Y=UP=XnNHeiI&@PA9X_hBnQ^?bst&rQ*kR^ zaSz#pQ`sd9;us%BH;2%&p=tTCt=g6j-seb^Gm?NdqjZ^*X5R$)hhsP5Ccq~gy9PO2x-sJxJL&IxNbaE)AR-H(`fdgK3Z}B3mJP9}X6hzN1qZh&&QKzH8}MT$>)KK`CL7s!Q10 zJl_u1g8s#V-MOl>t zU;E9CIe7CPvKSQ}%A;Zt^~pXmFuVMU?}hw60VK*ZcHT8Uw6))^MS|=(rO2(XMTfq# z^Kk4rFFJpkmRVywOPg;P_8Ac?$#7MRG215b{IgQwS-~&9xnTyru601~OR%OB1{J=` z4V_c%L#xC2-drEy7VakcH!LjpwS~Nzu5=fE$u-!SoDgh={m$D<8kh2w?>8